From: Thomas Berezansky Date: Wed, 1 Feb 2012 21:07:05 +0000 (-0500) Subject: LP#778989: Attempt to find "Correct" copy location X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=cdf2bee45e758747f7cbff1fc9f82c0c2e47a82d;p=evergreen%2Fpines.git LP#778989: Attempt to find "Correct" copy location This adds a trigger to asset.copy that on insert or change of the location and/or call number tries to find an identically named copy location that is scoped to the owning library of the copy. If it does not find one it uses the location provided. Signed-off-by: Thomas Berezansky Signed-off-by: Chris Sharp Signed-off-by: Ben Shum --- diff --git a/Open-ILS/src/sql/Pg/040.schema.asset.sql b/Open-ILS/src/sql/Pg/040.schema.asset.sql index dfe75bff89..3eaea6b38a 100644 --- a/Open-ILS/src/sql/Pg/040.schema.asset.sql +++ b/Open-ILS/src/sql/Pg/040.schema.asset.sql @@ -169,6 +169,28 @@ CREATE TRIGGER acp_created_trig BEFORE INSERT ON asset.copy FOR EACH ROW EXECUTE PROCEDURE asset.acp_created(); +CREATE OR REPLACE FUNCTION asset.acp_location_fixer() +RETURNS TRIGGER AS $$ +DECLARE + new_copy_location INT; +BEGIN + IF (TG_OP = 'UPDATE') THEN + IF NEW.location = OLD.location AND NEW.call_number = OLD.call_number THEN + RETURN NEW; + END IF; + END IF; + SELECT INTO new_copy_location acpl.id FROM asset.copy_location acpl JOIN actor.org_unit_ancestors_distance((SELECT owning_lib FROM asset.call_number WHERE id = NEW.call_number)) aouad ON acpl.owning_lib = aouad.id WHERE name = (SELECT name FROM asset.copy_location WHERE id = NEW.location) ORDER BY distance LIMIT 1; + IF new_copy_location IS NOT NULL THEN + NEW.location = new_copy_location; + END IF; + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +CREATE TRIGGER acp_location_fixer_trig + BEFORE INSERT OR UPDATE ON asset.copy + FOR EACH ROW EXECUTE PROCEDURE asset.acp_location_fixer(); + CREATE TABLE asset.stat_cat_sip_fields ( field CHAR(2) PRIMARY KEY, name TEXT NOT NULL, diff --git a/Open-ILS/src/sql/Pg/upgrade/XXXX.correct_copy_location.sql b/Open-ILS/src/sql/Pg/upgrade/XXXX.correct_copy_location.sql new file mode 100644 index 0000000000..4a5d4d0a37 --- /dev/null +++ b/Open-ILS/src/sql/Pg/upgrade/XXXX.correct_copy_location.sql @@ -0,0 +1,22 @@ +CREATE OR REPLACE FUNCTION asset.acp_location_fixer() +RETURNS TRIGGER AS $$ +DECLARE + new_copy_location INT; +BEGIN + IF (TG_OP = 'UPDATE') THEN + IF NEW.location = OLD.location AND NEW.call_number = OLD.call_number THEN + RETURN NEW; + END IF; + END IF; + SELECT INTO new_copy_location acpl.id FROM asset.copy_location acpl JOIN actor.org_unit_ancestors_distance((SELECT owning_lib FROM asset.call_number WHERE id = NEW.call_number)) aouad ON acpl.owning_lib = aouad.id WHERE name = (SELECT name FROM asset.copy_location WHERE id = NEW.location) ORDER BY distance LIMIT 1; + IF new_copy_location IS NOT NULL THEN + NEW.location = new_copy_location; + END IF; + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +CREATE TRIGGER acp_location_fixer_trig + BEFORE INSERT OR UPDATE ON asset.copy + FOR EACH ROW EXECUTE PROCEDURE asset.acp_location_fixer(); +