DROP TRIGGER IF EXISTS trg_sync_account_balance_on_invoice ON public.invoices;
CREATE OR REPLACE FUNCTION public.trg_fn_sync_account_balance_on_invoice()
RETURNS trigger
LANGUAGE plpgsql
AS $$
BEGIN
    IF TG_OP <> 'DELETE' THEN
        PERFORM public.fn_recalculate_account_balance(NEW.account_id);
    END IF;
    IF TG_OP = 'DELETE' THEN
        PERFORM public.fn_recalculate_account_balance(OLD.account_id);
        RETURN OLD;
    ELSIF TG_OP = 'UPDATE' AND OLD.account_id IS DISTINCT FROM NEW.account_id THEN
        PERFORM public.fn_recalculate_account_balance(OLD.account_id);
    END IF;
    RETURN NEW;
END;
$$;

CREATE TRIGGER trg_sync_account_balance_on_invoice
AFTER INSERT OR UPDATE OR DELETE ON public.invoices
FOR EACH ROW
EXECUTE FUNCTION public.trg_fn_sync_account_balance_on_invoice();
