from sqlmodel import Session, select from app.models.models import ( Account, AccountType, Bank, SavingsAccrual, Transaction, ) MEMP_MONTHLY = 200000.0 MPAT_MONTHLY = 200000.0 def _get_savings_account(session: Session, bank: Bank) -> Account | None: return session.exec( select(Account).where( Account.account_type == AccountType.SAVINGS, Account.bank == bank, ) ).first() def maybe_apply_monthly_savings(session: Session, tx: Transaction) -> SavingsAccrual | None: """Apply monthly savings contribution if this is the first salary of the month. Idempotent: if a SavingsAccrual row already exists for (year, month), do nothing. Bumps MEMP and MPAT savings account balances and records the accrual. """ year = tx.date.year month = tx.date.month existing = session.exec( select(SavingsAccrual).where( SavingsAccrual.year == year, SavingsAccrual.month == month, ) ).first() if existing: return None memp = _get_savings_account(session, Bank.MEMP) mpat = _get_savings_account(session, Bank.MPAT) if memp is None or mpat is None: return None memp.balance += MEMP_MONTHLY mpat.balance += MPAT_MONTHLY session.add(memp) session.add(mpat) accrual = SavingsAccrual( year=year, month=month, memp_amount=MEMP_MONTHLY, mpat_amount=MPAT_MONTHLY, trigger_transaction_id=tx.id, ) session.add(accrual) session.commit() session.refresh(accrual) return accrual