fix paid amount bug

This commit is contained in:
2026-05-24 13:03:56 +03:30
parent 7931c0a0c2
commit 0f74404192
2 changed files with 177 additions and 2 deletions
@@ -46,7 +46,8 @@ export class Migration20260404083020 extends Migration {
INTO v_paid INTO v_paid
FROM payments FROM payments
WHERE invoice_id = v_invoice_id WHERE invoice_id = v_invoice_id
AND status = 'SUCCESS'; AND status = 'paid'
AND deleted_at IS NULL;
UPDATE invoices UPDATE invoices
SET SET
@@ -88,7 +89,8 @@ export class Migration20260404083020 extends Migration {
INTO v_paid INTO v_paid
FROM payments FROM payments
WHERE invoice_id = v_invoice_id WHERE invoice_id = v_invoice_id
AND status = 'paid'; AND status = 'paid'
AND deleted_at IS NULL;
SELECT total SELECT total
INTO v_total INTO v_total
@@ -0,0 +1,173 @@
import { Migration } from '@mikro-orm/migrations';
export class Migration20260524120000 extends Migration {
override async up(): Promise<void> {
this.addSql(`
CREATE OR REPLACE FUNCTION recalc_invoice_totals()
RETURNS TRIGGER AS $$
DECLARE
v_invoice_id char(26);
v_subtotal int;
v_discount int;
v_tax int;
v_total int;
v_paid int;
v_enable_tax boolean;
BEGIN
v_invoice_id := COALESCE(NEW.invoice_id, OLD.invoice_id);
SELECT
COALESCE(SUM(sub_total),0),
COALESCE(SUM(discount),0)
INTO
v_subtotal,
v_discount
FROM invoice_items
WHERE invoice_id = v_invoice_id
AND deleted_at IS NULL;
SELECT enable_tax
INTO v_enable_tax
FROM invoices
WHERE id = v_invoice_id;
IF v_enable_tax THEN
v_tax := (v_subtotal - v_discount) * 0.10;
ELSE
v_tax := 0;
END IF;
v_total := (v_subtotal - v_discount) + v_tax;
SELECT COALESCE(SUM(amount),0)::int
INTO v_paid
FROM payments
WHERE invoice_id = v_invoice_id
AND status = 'paid'
AND deleted_at IS NULL;
UPDATE invoices
SET
sub_total = v_subtotal,
discount = v_discount,
tax_amount = v_tax,
total = v_total,
paid_amount = v_paid,
balance = v_total - v_paid
WHERE id = v_invoice_id;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
`);
this.addSql(`
CREATE OR REPLACE FUNCTION recalc_invoice_payments()
RETURNS TRIGGER AS $$
DECLARE
v_invoice_id char(26);
v_paid int;
v_total int;
BEGIN
v_invoice_id := COALESCE(NEW.invoice_id, OLD.invoice_id);
SELECT COALESCE(SUM(amount),0)::int
INTO v_paid
FROM payments
WHERE invoice_id = v_invoice_id
AND status = 'paid'
AND deleted_at IS NULL;
SELECT total
INTO v_total
FROM invoices
WHERE id = v_invoice_id;
UPDATE invoices
SET
paid_amount = v_paid,
balance = v_total - v_paid
WHERE id = v_invoice_id;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
`);
this.addSql(`
UPDATE invoices i
SET
paid_amount = COALESCE(p.paid_sum, 0),
balance = i.total - COALESCE(p.paid_sum, 0)
FROM (
SELECT invoice_id, SUM(amount)::int AS paid_sum
FROM payments
WHERE status = 'paid'
AND deleted_at IS NULL
GROUP BY invoice_id
) p
WHERE i.id = p.invoice_id;
`);
}
override async down(): Promise<void> {
// Restore previous (broken) function bodies from Migration20260404083020
this.addSql(`
CREATE OR REPLACE FUNCTION recalc_invoice_totals()
RETURNS TRIGGER AS $$
DECLARE
v_invoice_id char(26);
v_subtotal int;
v_discount int;
v_tax int;
v_total int;
v_paid int;
v_enable_tax boolean;
BEGIN
v_invoice_id := COALESCE(NEW.invoice_id, OLD.invoice_id);
SELECT COALESCE(SUM(sub_total),0), COALESCE(SUM(discount),0)
INTO v_subtotal, v_discount
FROM invoice_items
WHERE invoice_id = v_invoice_id AND deleted_at IS NULL;
SELECT enable_tax INTO v_enable_tax FROM invoices WHERE id = v_invoice_id;
IF v_enable_tax THEN
v_tax := (v_subtotal - v_discount) * 0.10;
ELSE
v_tax := 0;
END IF;
v_total := (v_subtotal - v_discount) + v_tax;
SELECT COALESCE(SUM(amount),0) INTO v_paid
FROM payments
WHERE invoice_id = v_invoice_id AND status = 'SUCCESS';
UPDATE invoices SET sub_total = v_subtotal, discount = v_discount, tax_amount = v_tax,
total = v_total, paid_amount = v_paid, balance = v_total - v_paid
WHERE id = v_invoice_id;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
`);
this.addSql(`
CREATE OR REPLACE FUNCTION recalc_invoice_payments()
RETURNS TRIGGER AS $$
DECLARE
v_invoice_id char(26);
v_paid int;
v_total int;
BEGIN
v_invoice_id := COALESCE(NEW.invoice_id, OLD.invoice_id);
SELECT COALESCE(SUM(amount),0) INTO v_paid
FROM payments WHERE invoice_id = v_invoice_id AND status = 'SUCCESS';
SELECT total INTO v_total FROM invoices WHERE id = v_invoice_id;
UPDATE invoices SET paid_amount = v_paid, balance = v_total - v_paid
WHERE id = v_invoice_id;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
`);
}
}