LP#778989: Attempt to find "Correct" copy location
authorThomas Berezansky <tsbere@mvlc.org>
Wed, 1 Feb 2012 21:07:05 +0000 (16:07 -0500)
committerBen Shum <bshum@biblio.org>
Tue, 11 Nov 2014 01:31:18 +0000 (20:31 -0500)
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 <tsbere@mvlc.org>
Signed-off-by: Chris Sharp <csharp@georgialibraries.org>
Signed-off-by: Ben Shum <bshum@biblio.org>
Open-ILS/src/sql/Pg/040.schema.asset.sql
Open-ILS/src/sql/Pg/upgrade/XXXX.correct_copy_location.sql [new file with mode: 0644]

index dfe75bf..3eaea6b 100644 (file)
@@ -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 (file)
index 0000000..4a5d4d0
--- /dev/null
@@ -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();
+