fix paid amount bug
This commit is contained in:
@@ -46,7 +46,8 @@ export class Migration20260404083020 extends Migration {
|
||||
INTO v_paid
|
||||
FROM payments
|
||||
WHERE invoice_id = v_invoice_id
|
||||
AND status = 'SUCCESS';
|
||||
AND status = 'paid'
|
||||
AND deleted_at IS NULL;
|
||||
|
||||
UPDATE invoices
|
||||
SET
|
||||
@@ -88,7 +89,8 @@ export class Migration20260404083020 extends Migration {
|
||||
INTO v_paid
|
||||
FROM payments
|
||||
WHERE invoice_id = v_invoice_id
|
||||
AND status = 'paid';
|
||||
AND status = 'paid'
|
||||
AND deleted_at IS NULL;
|
||||
|
||||
SELECT 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;
|
||||
`);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user