From 00b3bc0bdad7a9460e86a8f4a99257550ecddd44 Mon Sep 17 00:00:00 2001 From: miker Date: Thu, 15 Jan 2009 14:05:09 +0000 Subject: [PATCH] initial revision of the generalized (ILS action) trigger schema git-svn-id: svn://svn.open-ils.org/ILS/trunk@11841 dcc99617-32d9-48b4-a31d-7c20da2025e4 --- Open-ILS/src/sql/Pg/400.schema.action_trigger.sql | 128 ++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 Open-ILS/src/sql/Pg/400.schema.action_trigger.sql diff --git a/Open-ILS/src/sql/Pg/400.schema.action_trigger.sql b/Open-ILS/src/sql/Pg/400.schema.action_trigger.sql new file mode 100644 index 0000000000..b019c793f5 --- /dev/null +++ b/Open-ILS/src/sql/Pg/400.schema.action_trigger.sql @@ -0,0 +1,128 @@ +/* + * Copyright (C) 2009 Equinox Software, Inc. + * Mike Rylander + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +DROP SCHEMA action_trigger CASCADE; + +BEGIN; + +CREATE SCHEMA action_trigger; + +CREATE TABLE action_trigger.hook ( + key TEXT PRIMARY KEY, + core_type TEXT NOT NULL, + description TEXT, + passive BOOL NOT NULL DEFAULT FALSE +); +INSERT INTO action_trigger.hook (key,core_type,description) VALUES ('checkout','circ','Item checked out to user'); +INSERT INTO action_trigger.hook (key,core_type,description) VALUES ('checkin','circ','Item checked in'); +INSERT INTO action_trigger.hook (key,core_type,description) VALUES ('lost','circ','Circulating Item marked Lost'); +INSERT INTO action_trigger.hook (key,core_type,description) VALUES ('lost.found','circ','Lost Circulating Item checked in'); +INSERT INTO action_trigger.hook (key,core_type,description) VALUES ('claims_returned','circ','Circulating Item marked Claims Returned'); +INSERT INTO action_trigger.hook (key,core_type,description) VALUES ('claims_returned.found','circ','Claims Returned Circulating Item is checked in'); +INSERT INTO action_trigger.hook (key,core_type,description) VALUES ('missing','acp','Item marked Missing'); +INSERT INTO action_trigger.hook (key,core_type,description) VALUES ('missing.found','acp','Missing Item checked in'); +INSERT INTO action_trigger.hook (key,core_type,description) VALUES ('transit.start','acp','An Item is placed into transit'); +INSERT INTO action_trigger.hook (key,core_type,description) VALUES ('transit.finish','acp','An Item is received from a transit'); +INSERT INTO action_trigger.hook (key,core_type,description) VALUES ('hold_request.success','ahr','A hold is succefully placed'); +INSERT INTO action_trigger.hook (key,core_type,description) VALUES ('hold_request.failure','ahr','A hold is attempted by not succefully placed'); +INSERT INTO action_trigger.hook (key,core_type,description) VALUES ('hold.capture','ahr','A targeted Item is captured for a hold'); +INSERT INTO action_trigger.hook (key,core_type,description) VALUES ('hold_transit.start','ahtc','A hold-captured Item is placed into transit'); +INSERT INTO action_trigger.hook (key,core_type,description) VALUES ('hold_transit.finish','ahtc','A hold-captured Item is received from a transit'); +INSERT INTO action_trigger.hook (key,core_type,description,passive) VALUES ('checkout.due','circ','Checked out Item is Due',TRUE); +-- and much more, I'm sure + +-- Specialized collection modules. Given an FM object, gather some info and return a scalar or ref. +CREATE TABLE action_trigger.collector ( + module TEXT PRIMARY KEY, -- All live under the OpenILS::Trigger::Collector:: namespace + description TEXT +); +INSERT INTO action_trigger.collector (module,description) VALUES ('CircCountsByCircMod','Count of Circulations for a User, broken down by circulation modifier'); + +-- Simple tests on an FM object from hook.core_type to test for "should we still do this." +CREATE TABLE action_trigger.validator ( + module TEXT PRIMARY KEY, -- All live under the OpenILS::Trigger::Validator:: namespace + description TEXT +); +INSERT INTO action_trigger.validator (module,description) VALUES ('CircIsOpen','Check that the circulation is still open'); +INSERT INTO action_trigger.validator (module,description) VALUES ('HoldIsAvailable','Check that an item is on the hold shelf'); + +-- After an event passes validation (action_trigger.validator), the reactor processes it. +CREATE TABLE action_trigger.reactor ( + module TEXT PRIMARY KEY, -- All live under the OpenILS::Trigger::Reactor:: namespace + description TEXT +); +INSERT INTO action_trigger.reactor (module,description) VALUES ('SendEmail','Send an email based on a user-defined template'); +INSERT INTO action_trigger.reactor (module,description) VALUES ('GenerateBatchOverduePDF','Output a batch PDF of overdue notices for printing'); + +-- After an event is reacted to (either succes or failure) a cleanup module is run against the resulting environment +CREATE TABLE action_trigger.cleanup ( + module TEXT PRIMARY KEY, -- All live under the OpenILS::Trigger::Cleanup:: namespace + description TEXT +); +INSERT INTO action_trigger.cleanup (module,description) VALUES ('ClearAllPending','Remove all future, pending notifications for this target'); + +CREATE TABLE action_trigger.event_definition ( + id SERIAL PRIMARY KEY, + active BOOL NOT NULL DEFAULT TRUE, + owner INT NOT NULL REFERENCES actor.org_unit (id), + hook INT NOT NULL REFERENCES action_trigger.hook (key), + validator INT NOT NULL REFERENCES action_trigger.validator (module), + reactor INT NOT NULL REFERENCES action_trigger.reactor (module), + cleanup_success INT REFERENCES action_trigger.reactor (module), + cleanup_failure INT REFERENCES action_trigger.reactor (module), + delay INTERVAL NOT NULL DEFAULT '5 minutes', + delay_field TEXT, -- for instance, xact_start on a circ hook ... look for fields on hook.core_type where datatype=timestamp? If not set, delay from now() + group_field TEXT, -- field from this.hook.core_type to batch event targets together on, fed into reactor a group at a time. + template TEXT NOT NULL, -- the TT block. will have an 'environment' hash (or array of hashes, grouped events) built up by validator and collector(s), which can be modified. + CONSTRAINT ev_def_owner_hook_val_react_clean_delay_once UNIQUE (owner, hook, validator, reactor, cleanup, delay, delay_field) + +CREATE TABLE action_trigger.environment ( + id SERIAL PRIMARY KEY, + event_def INT NOT NULL REFERENCES action_trigger.event_definition (id), + path TEXT, -- fields to flesh. given a hook with a core_type of circ, imagine circ_lib.parent_ou expanding to + -- {flesh: 2, flesh_fields: {circ: ['circ_lib'], aou: ['parent_ou']}} ... default is to flesh all + -- at flesh depth 1 + collector TEXT REFERENCES action_trigger.collector (module), -- if set, given the object at 'path', return some data + -- to be stashed at environment.