diff --git a/components/payments/paymentService.js b/components/payments/paymentService.js index de9b212..f676482 100644 --- a/components/payments/paymentService.js +++ b/components/payments/paymentService.js @@ -13,6 +13,7 @@ const Class = require('../classes/classModel'); const Session = require('../sessions/sessionModel'); const { sendInvoiceCreatedSms } = require('../../utils/senders/smsMessages'); const { buildClassScheduleContext } = require('../../utils/classSchedule'); +const { parseImportDate } = require('../../utils/jalaliDate'); const { pickNotifyFlags, omitNotifyFields } = require('../../utils/notifyFlags'); const { getPayableAmount, @@ -84,8 +85,11 @@ const reconcilePendingTransactions = async (payment) => { } if (pending.length) { - pending[0].amount = remaining; - await pending[0].save(); + const pendingTotal = pending.reduce((sum, row) => sum + row.amount, 0); + if (pendingTotal !== remaining) { + pending[0].amount = remaining; + await pending[0].save(); + } if (pending.length > 1) { await Transaction.deleteMany({ _id: { $in: pending.slice(1).map((row) => row._id) } }); } @@ -123,8 +127,11 @@ const buildTransactionPayload = (payment, trxData, actorId = null) => { const parseDate = (value) => { if (!value) return null; - const date = value instanceof Date ? value : new Date(value); - return Number.isNaN(date.getTime()) ? null : date; + if (value instanceof Date) { + return Number.isNaN(value.getTime()) ? null : value; + } + const parsed = parseImportDate(value); + return parsed && !Number.isNaN(parsed.getTime()) ? parsed : null; }; const createTransactionsForPayment = async (payment, transactions, actorId = null) => { @@ -342,11 +349,17 @@ const updateTransaction = async (transactionId, body, actorId = null) => { const payload = buildTransactionPayload(payment, merged, actorId); trx.amount = payload.amount; trx.status = payload.status; - trx.method = payload.method; trx.receiptNumber = payload.receiptNumber; trx.notes = payload.notes; trx.dueDate = payload.dueDate; - trx.date = payload.date; + if (payload.status === 'paid') { + trx.method = payload.method; + trx.date = payload.date; + } else { + trx.method = undefined; + trx.date = undefined; + trx.receiptNumber = ''; + } if (actorId) trx.recordedBy = actorId; await trx.save();