From: Bill Erickson Date: Thu, 6 Feb 2020 20:18:10 +0000 (-0500) Subject: LP1858448 Money aging requires opt-in; manual option X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=8d55b2f8b42265f75034cb4078c1b0ef3e061a07;p=working%2FEvergreen.git LP1858448 Money aging requires opt-in; manual option Adds a new global flag which determines whether billings and payments should be aged when their associated transaction is aged. Also adds a SQL function allowing users to manually age billings and payments that have reached a specified age. Signed-off-by: Bill Erickson --- diff --git a/Open-ILS/src/sql/Pg/080.schema.money.sql b/Open-ILS/src/sql/Pg/080.schema.money.sql index 7d30797b1e..e725250b2c 100644 --- a/Open-ILS/src/sql/Pg/080.schema.money.sql +++ b/Open-ILS/src/sql/Pg/080.schema.money.sql @@ -704,5 +704,42 @@ CREATE OR REPLACE VIEW money.all_billings AS UNION ALL SELECT * FROM money.aged_billing; + +CREATE OR REPLACE FUNCTION money.age_billings_and_payments + (older_than INTERVAL) RETURNS INTEGER AS $FUNC$ +-- Age billings and payments linked to transactions which were +-- completed at least 'older_than' time ago. +DECLARE + xact_id BIGINT; + counter INTEGER DEFAULT 0; +BEGIN + + FOR xact_id IN SELECT xact.id FROM money.billable_xact xact + -- confirm there is something to age + JOIN money.billing mb ON mb.xact = xact.id + WHERE xact.xact_finish < NOW() - older_than LOOP + + PERFORM money.age_billings_and_payments_for_xact(xact_id); + counter := counter + 1; + END LOOP; + + RETURN counter; +END; +$FUNC$ LANGUAGE PLPGSQL; + +CREATE OR REPLACE FUNCTION money.age_billings_and_payments_for_xact + (xact_id BIGINT) RETURNS VOID AS $FUNC$ + + INSERT INTO money.aged_billing + SELECT * FROM money.billing WHERE xact = $1; + + INSERT INTO money.aged_payment + SELECT * FROM money.payment_view WHERE xact = $1; + + DELETE FROM money.payment WHERE xact = $1; + DELETE FROM money.billing WHERE xact = $1; + +$FUNC$ LANGUAGE SQL; + COMMIT; diff --git a/Open-ILS/src/sql/Pg/090.schema.action.sql b/Open-ILS/src/sql/Pg/090.schema.action.sql index 3fb3b4a782..6f7978e86b 100644 --- a/Open-ILS/src/sql/Pg/090.schema.action.sql +++ b/Open-ILS/src/sql/Pg/090.schema.action.sql @@ -354,14 +354,12 @@ BEGIN -- Migrate billings and payments to aged tables - INSERT INTO money.aged_billing - SELECT * FROM money.billing WHERE xact = OLD.id; + SELECT 'Y' INTO found FROM config.global_flag + WHERE name = 'history.money.age_with_circs' AND enabled; - INSERT INTO money.aged_payment - SELECT * FROM money.payment_view WHERE xact = OLD.id; - - DELETE FROM money.payment WHERE xact = OLD.id; - DELETE FROM money.billing WHERE xact = OLD.id; + IF found = 'Y' THEN + PERFORM money.age_billings_and_payments_for_xact(OLD.id); + END IF; RETURN OLD; END; diff --git a/Open-ILS/src/sql/Pg/950.data.seed-values.sql b/Open-ILS/src/sql/Pg/950.data.seed-values.sql index a49cf02de8..5d35f02d91 100644 --- a/Open-ILS/src/sql/Pg/950.data.seed-values.sql +++ b/Open-ILS/src/sql/Pg/950.data.seed-values.sql @@ -20308,3 +20308,16 @@ VALUES ( ) ); + +INSERT INTO config.global_flag (name, value, enabled, label) +VALUES ( + 'history.money.age_with_circs', + NULL, + FALSE, + oils_i18n_gettext( + 'history.money.age_with_circs', + 'Age money data with circulations. BEWARE: some ' || + 'billing/payment data is discarded during the aging process', + 'cgf', 'label' + ) +); diff --git a/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.aged-money-additions.sql b/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.aged-money-additions.sql new file mode 100644 index 0000000000..4d50f95291 --- /dev/null +++ b/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.aged-money-additions.sql @@ -0,0 +1,107 @@ +BEGIN; + +-- SELECT evergreen.upgrade_deps_block_check('TODO', :eg_version); + +INSERT INTO config.global_flag (name, value, enabled, label) +VALUES ( + 'history.money.age_with_circs', + NULL, + FALSE, + oils_i18n_gettext( + 'history.money.age_with_circs', + 'Age money data with circulations. BEWARE: some ' || + 'billing/payment data is discarded during the aging process', + 'cgf', 'label' + ) +); + +CREATE OR REPLACE FUNCTION money.age_billings_and_payments + (older_than INTERVAL) RETURNS INTEGER AS $FUNC$ +-- Age billings and payments linked to transactions which were +-- completed at least 'older_than' time ago. +DECLARE + xact_id BIGINT; + counter INTEGER DEFAULT 0; +BEGIN + + FOR xact_id IN SELECT xact.id FROM money.billable_xact xact + -- confirm there is something to age + JOIN money.billing mb ON mb.xact = xact.id + WHERE xact.xact_finish < NOW() - older_than LOOP + + PERFORM money.age_billings_and_payments_for_xact(xact_id); + counter := counter + 1; + END LOOP; + + RETURN counter; +END; +$FUNC$ LANGUAGE PLPGSQL; + +CREATE OR REPLACE FUNCTION money.age_billings_and_payments_for_xact + (xact_id BIGINT) RETURNS VOID AS $FUNC$ + + INSERT INTO money.aged_billing + SELECT * FROM money.billing WHERE xact = $1; + + INSERT INTO money.aged_payment + SELECT * FROM money.payment_view WHERE xact = $1; + + DELETE FROM money.payment WHERE xact = $1; + DELETE FROM money.billing WHERE xact = $1; + +$FUNC$ LANGUAGE SQL; + + +CREATE OR REPLACE FUNCTION action.age_circ_on_delete () RETURNS TRIGGER AS $$ +DECLARE +found char := 'N'; +BEGIN + + -- If there are any renewals for this circulation, don't archive or delete + -- it yet. We'll do so later, when we archive and delete the renewals. + + SELECT 'Y' INTO found + FROM action.circulation + WHERE parent_circ = OLD.id + LIMIT 1; + + IF found = 'Y' THEN + RETURN NULL; -- don't delete + END IF; + + -- Archive a copy of the old row to action.aged_circulation + + INSERT INTO action.aged_circulation + (id,usr_post_code, usr_home_ou, usr_profile, usr_birth_year, copy_call_number, copy_location, + copy_owning_lib, copy_circ_lib, copy_bib_record, xact_start, xact_finish, target_copy, + circ_lib, circ_staff, checkin_staff, checkin_lib, renewal_remaining, grace_period, due_date, + stop_fines_time, checkin_time, create_time, duration, fine_interval, recurring_fine, + max_fine, phone_renewal, desk_renewal, opac_renewal, duration_rule, recurring_fine_rule, + max_fine_rule, stop_fines, workstation, checkin_workstation, checkin_scan_time, parent_circ, + auto_renewal, auto_renewal_remaining) + SELECT + id,usr_post_code, usr_home_ou, usr_profile, usr_birth_year, copy_call_number, copy_location, + copy_owning_lib, copy_circ_lib, copy_bib_record, xact_start, xact_finish, target_copy, + circ_lib, circ_staff, checkin_staff, checkin_lib, renewal_remaining, grace_period, due_date, + stop_fines_time, checkin_time, create_time, duration, fine_interval, recurring_fine, + max_fine, phone_renewal, desk_renewal, opac_renewal, duration_rule, recurring_fine_rule, + max_fine_rule, stop_fines, workstation, checkin_workstation, checkin_scan_time, parent_circ, + auto_renewal, auto_renewal_remaining + FROM action.all_circulation WHERE id = OLD.id; + + -- Migrate billings and payments to aged tables + + SELECT 'Y' INTO found FROM config.global_flag + WHERE name = 'history.money.age_with_circs' AND enabled; + + IF found = 'Y' THEN + PERFORM money.age_billings_and_payments_for_xact(OLD.id); + END IF; + + RETURN OLD; +END; +$$ LANGUAGE 'plpgsql'; + +COMMIT; + +