45 lines
1.5 KiB
PL/PgSQL
45 lines
1.5 KiB
PL/PgSQL
CREATE OR REPLACE FUNCTION set_invoice_total_amount() RETURNS TRIGGER AS $$
|
|
DECLARE
|
|
invoice_ids integer[];
|
|
BEGIN
|
|
IF TG_OP = 'INSERT' THEN
|
|
invoice_ids := ARRAY[NEW.invoice_id];
|
|
ELSIF TG_OP = 'DELETE' THEN
|
|
invoice_ids := ARRAY[OLD.invoice_id];
|
|
ELSIF TG_OP = 'UPDATE' THEN
|
|
invoice_ids := ARRAY[NEW.invoice_id, OLD.invoice_id];
|
|
END IF;
|
|
|
|
EXECUTE 'UPDATE ' || substring(TG_TABLE_NAME for length(TG_TABLE_NAME) - 4) || ' i
|
|
SET total_amount = COALESCE(
|
|
(
|
|
SELECT SUM(l.total_amount)
|
|
FROM ' || TG_TABLE_NAME || ' l
|
|
WHERE l.invoice_id = i.id
|
|
AND l.status = ''success''
|
|
), 0
|
|
)
|
|
WHERE id = ANY($1);' USING invoice_ids;
|
|
|
|
IF TG_OP = 'DELETE' THEN
|
|
RETURN OLD;
|
|
ELSE
|
|
RETURN NEW;
|
|
END IF;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
|
|
DROP TRIGGER IF EXISTS set_draftinvoice_total_amount_trg ON invoicing_draftinvoiceline;
|
|
CREATE TRIGGER set_draftinvoice_total_amount_trg
|
|
AFTER INSERT OR UPDATE OF total_amount, invoice_id, status OR DELETE ON invoicing_draftinvoiceline
|
|
FOR EACH ROW
|
|
EXECUTE PROCEDURE set_invoice_total_amount();
|
|
|
|
|
|
DROP TRIGGER IF EXISTS set_invoice_total_amount_trg ON invoicing_invoiceline;
|
|
CREATE TRIGGER set_invoice_total_amount_trg
|
|
AFTER INSERT OR UPDATE OF total_amount, invoice_id, status OR DELETE ON invoicing_invoiceline
|
|
FOR EACH ROW
|
|
EXECUTE PROCEDURE set_invoice_total_amount();
|