lingo/lingo/invoicing/sql/invoice_triggers_for_amount...

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();