mirror of
https://github.com/escalante29/WealthySmart.git
synced 2026-05-19 15:48:47 +02:00
All checks were successful
Deploy to VPS / deploy (push) Successful in 21s
New TransactionType.DEPOSITO for salary deposits from n8n/Gmail flow. New /salarios endpoint with summary. New top-level Salarios page with DataTable and summary cards. Push notifications link to /salarios for deposits. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
55 lines
1.6 KiB
Python
55 lines
1.6 KiB
Python
from datetime import datetime
|
|
from typing import Optional
|
|
|
|
from fastapi import APIRouter, Depends, Query
|
|
from pydantic import BaseModel
|
|
from sqlmodel import Session, col, func, select
|
|
|
|
from app.auth import get_current_user
|
|
from app.db import get_session
|
|
from app.models.models import Transaction, TransactionRead, TransactionType
|
|
|
|
router = APIRouter(prefix="/salarios", tags=["salarios"])
|
|
|
|
|
|
class SalariosSummary(BaseModel):
|
|
count: int
|
|
total_amount: float
|
|
latest_date: Optional[datetime] = None
|
|
|
|
|
|
@router.get("/", response_model=list[TransactionRead])
|
|
def list_salarios(
|
|
limit: int = Query(default=50, le=500),
|
|
offset: int = 0,
|
|
session: Session = Depends(get_session),
|
|
_user: str = Depends(get_current_user),
|
|
):
|
|
query = (
|
|
select(Transaction)
|
|
.where(Transaction.transaction_type == TransactionType.DEPOSITO)
|
|
.order_by(col(Transaction.date).desc())
|
|
.offset(offset)
|
|
.limit(limit)
|
|
)
|
|
return session.exec(query).all()
|
|
|
|
|
|
@router.get("/summary", response_model=SalariosSummary)
|
|
def salarios_summary(
|
|
session: Session = Depends(get_session),
|
|
_user: str = Depends(get_current_user),
|
|
):
|
|
result = session.exec(
|
|
select(
|
|
func.count(),
|
|
func.coalesce(func.sum(Transaction.amount), 0),
|
|
func.max(Transaction.date),
|
|
).where(Transaction.transaction_type == TransactionType.DEPOSITO)
|
|
).first()
|
|
return SalariosSummary(
|
|
count=result[0] if result else 0,
|
|
total_amount=float(result[1]) if result else 0.0,
|
|
latest_date=result[2] if result else None,
|
|
)
|