Fix transaction due date parsing and preserve edited pending amounts.
Parse Jalali date strings correctly when saving transactions, and skip reconcile amount overwrites when pending totals already match the balance.
This commit is contained in:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user