import { Injectable } from '@nestjs/common' import { Prisma } from '../../../generated/prisma/client' import { LedgerSourceType } from '../../../generated/prisma/enums' @Injectable() export class SupplierLedgerWorkflow { async updateLedgerBalance( tx: Prisma.TransactionClient, supplierId: number, amount: number, sourceId: number, sourceType: LedgerSourceType, ) { const lastSupplierLedgerBalance = await tx.supplierLedger .findFirstOrThrow({ where: { supplierId }, orderBy: { createdAt: 'desc' }, }) .then(sl => (sl ? sl.balance : 0)) let newBalance = Number(lastSupplierLedgerBalance) let credit = 0 let debit = 0 let description = '' switch (sourceType) { case 'PURCHASE': newBalance += amount credit = amount description = `خرید به مبلغ ${amount} بابت خرید شماره ${sourceId}` break case 'REFUND': case 'PAYMENT': newBalance -= amount debit = amount description = `پرداخت به مبلغ ${amount} بابت پرداخت شماره ${sourceId}` break case 'ADJUSTMENT': newBalance = amount description = `اصلاح حساب به مبلغ ${amount} بابت پرداخت شماره ${sourceId}` break } return await tx.supplierLedger.create({ data: { supplierId, debit, credit, balance: newBalance, sourceId, sourceType, description, }, }) } }