EDI ORDER template, now with copies
authorBill Erickson <berick@esilibrary.com>
Fri, 27 Jul 2012 16:11:23 +0000 (12:11 -0400)
committerMike Rylander <mrylander@gmail.com>
Wed, 1 Aug 2012 19:15:24 +0000 (15:15 -0400)
Adds a new "copies" structure to the stock JEDI ORDER template.  Copies
are ultimately mapped into one or more GIR segments in the outbound EDI.
This commit only adds the change to the stock template (seed data).  It
also adds entries to the environment for the stock template and existing
template 23 via upgrade script (to expedite local template editing).

With the current template, GIR segments look like so:

GIR+001+8:LCO+TESTFUND2:LFN+SYS1-BR1:LLO+FIC ROW 456:LSM+Stacks:LSQ'
GIR+002+9:LCO+TESTFUND2:LFN+SYS1-BR1:LLO+FIC ROW 456:LSM+Stacks:LSQ'
GIR+003+10:LCO+TESTFUND2:LFN+SYS1-BR1:LLO+FIC ROW 456:LSM+Stacks:LSQ'
GIR+004+11:LCO+TESTFUND2:LFN+SYS1-BR1:LLO+FIC ROW 456:LSM+Stacks:LSQ'
GIR+005+12:LCO+TESTFUND2:LFN+SYS1-BR1:LLO+FIC ROW 456:LSM+Stacks:LSQ'
GIR+006+13:LCO+TESTFUND2:LFN+SYS1-BR2:LLO+FIC ROW 456:LSM+Young Adult:LSQ'
GIR+007+14:LCO+TESTFUND2:LFN+SYS1-BR2:LLO+FIC ROW 456:LSM+Young Adult:LSQ'
GIR+008+15:LCO+TESTFUND2:LFN+SYS1-BR2:LLO+FIC ROW 456:LSM+Young Adult:LSQ'

LQT / quantity is also supported.

The current implementation is meant to cover all possible fields so that
users can remove/alter items on a vendor by vendor basis as needed.

Signed-off-by: Bill Erickson <berick@esilibrary.com>
Signed-off-by: Mike Rylander <mrylander@gmail.com>
Open-ILS/src/sql/Pg/950.data.seed-values.sql
Open-ILS/src/sql/Pg/upgrade/XXXX.data.jedi_with_copies.sql [new file with mode: 0644]

index 841d95c..94ca8f2 100644 (file)
@@ -8058,7 +8058,32 @@ END;
             "free-text":[ 
                 [% FOR note IN ftx_vals -%] "[% note %]"[% UNLESS loop.last %], [% END %][% END %] 
             ],            
-            "quantity":[% li.lineitem_details.size %]
+            "quantity":[% li.lineitem_details.size %],
+            "copies" : [
+                [%- IF 1 -%]
+                [%- FOR lid IN li.lineitem_details;
+                        fund = lid.fund.code;
+                        item_type = lid.circ_modifier;
+                        callnumber = lid.cn_label;
+                        owning_lib = lid.owning_lib.shortname;
+                        location = lid.location;
+    
+                        # when we have real copy data, treat it as authoritative for some fields
+                        acp = lid.eg_copy_id;
+                        IF acp;
+                            item_type = acp.circ_modifier;
+                            callnumber = acp.call_number.label;
+                            location = acp.location.name;
+                        END -%]
+                {   [%- IF fund %] "fund" : "[% fund %]",[% END -%]
+                    [%- IF callnumber %] "call_number" : "[% callnumber %]", [% END -%]
+                    [%- IF item_type %] "item_type" : "[% item_type %]", [% END -%]
+                    [%- IF location %] "copy_location" : "[% location %]", [% END -%]
+                    [%- IF owning_lib %] "owning_lib" : "[% owning_lib %]", [% END -%]
+                    [%- #chomp %]"copy_id" : "[% lid.id %]" }[% ',' UNLESS loop.last %]
+                [% END -%]
+                [%- END -%]
+             ]
         }[% UNLESS loop.last %],[% END %]
         [%-# TODO: lineitem details (later) -%]
         [% END %]
@@ -8074,7 +8099,11 @@ $$
 
 INSERT INTO action_trigger.environment (event_def, path) VALUES 
   (23, 'lineitems.attributes'), 
-  (23, 'lineitems.lineitem_details'), 
+  (23, 'lineitems.lineitem_details.owning_lib'),
+  (23, 'lineitems.lineitem_details.location'),
+  (23, 'lineitems.lineitem_details.fund'),
+  (23, 'lineitems.lineitem_details.eg_copy_id.location'),
+  (23, 'lineitems.lineitem_details.eg_copy_id.call_number'),
   (23, 'lineitems.lineitem_notes'), 
   (23, 'ordering_agency.mailing_address'), 
   (23, 'provider'),
diff --git a/Open-ILS/src/sql/Pg/upgrade/XXXX.data.jedi_with_copies.sql b/Open-ILS/src/sql/Pg/upgrade/XXXX.data.jedi_with_copies.sql
new file mode 100644 (file)
index 0000000..21552a2
--- /dev/null
@@ -0,0 +1,183 @@
+
+
+-- XXX
+-- Template update included here for reference only.
+-- The stock JEDI template is not updated here (see WHERE clause)
+-- We do update the environment, though, for easier local template 
+-- updating.  No env fields are removed (that aren't otherwise replaced).
+--
+
+UPDATE action_trigger.event_definition SET template =
+$$[%- USE date -%]
+[%# start JEDI document 
+  # Vendor specific kludges:
+  # BT      - vendcode goes to NAD/BY *suffix*  w/ 91 qualifier
+  # INGRAM  - vendcode goes to NAD/BY *segment* w/ 91 qualifier (separately)
+  # BRODART - vendcode goes to FTX segment (lineitem level)
+-%]
+[%- 
+IF target.provider.edi_default.vendcode && target.provider.code == 'BRODART';
+    xtra_ftx = target.provider.edi_default.vendcode;
+END;
+-%]
+[%- BLOCK big_block -%]
+{
+   "recipient":"[% target.provider.san %]",
+   "sender":"[% target.ordering_agency.mailing_address.san %]",
+   "body": [{
+     "ORDERS":[ "order", {
+        "po_number":[% target.id %],
+        "date":"[% date.format(date.now, '%Y%m%d') %]",
+        "buyer":[
+            [%   IF   target.provider.edi_default.vendcode && (target.provider.code == 'BT' || target.provider.name.match('(?i)^BAKER & TAYLOR'))  -%]
+                {"id-qualifier": 91, "id":"[% target.ordering_agency.mailing_address.san _ ' ' _ target.provider.edi_default.vendcode %]"}
+            [%- ELSIF target.provider.edi_default.vendcode && target.provider.code == 'INGRAM' -%]
+                {"id":"[% target.ordering_agency.mailing_address.san %]"},
+                {"id-qualifier": 91, "id":"[% target.provider.edi_default.vendcode %]"}
+            [%- ELSE -%]
+                {"id":"[% target.ordering_agency.mailing_address.san %]"}
+            [%- END -%]
+        ],
+        "vendor":[
+            [%- # target.provider.name (target.provider.id) -%]
+            "[% target.provider.san %]",
+            {"id-qualifier": 92, "id":"[% target.provider.id %]"}
+        ],
+        "currency":"[% target.provider.currency_type %]",
+                
+        "items":[
+        [%- FOR li IN target.lineitems %]
+        {
+            "line_index":"[% li.id %]",
+            "identifiers":[   [%-# li.isbns = helpers.get_li_isbns(li.attributes) %]
+            [% FOR isbn IN helpers.get_li_isbns(li.attributes) -%]
+                [% IF isbn.length == 13 -%]
+                {"id-qualifier":"EN","id":"[% isbn %]"},
+                [% ELSE -%]
+                {"id-qualifier":"IB","id":"[% isbn %]"},
+                [%- END %]
+            [% END %]
+                {"id-qualifier":"IN","id":"[% li.id %]"}
+            ],
+            "price":[% li.estimated_unit_price || '0.00' %],
+            "desc":[
+                {"BTI":"[% helpers.get_li_attr_jedi('title',     '', li.attributes) %]"},
+                {"BPU":"[% helpers.get_li_attr_jedi('publisher', '', li.attributes) %]"},
+                {"BPD":"[% helpers.get_li_attr_jedi('pubdate',   '', li.attributes) %]"},
+                {"BPH":"[% helpers.get_li_attr_jedi('pagination','', li.attributes) %]"}
+            ],
+            [%- ftx_vals = []; 
+                FOR note IN li.lineitem_notes; 
+                    NEXT UNLESS note.vendor_public == 't'; 
+                    ftx_vals.push(note.value); 
+                END; 
+                IF xtra_ftx;           ftx_vals.unshift(xtra_ftx); END; 
+                IF ftx_vals.size == 0; ftx_vals.unshift('');       END;  # BT needs FTX+LIN for every LI, even if it is an empty one
+            -%]
+
+            "free-text":[ 
+                [% FOR note IN ftx_vals -%] "[% note %]"[% UNLESS loop.last %], [% END %][% END %] 
+            ],            
+            "quantity":[% li.lineitem_details.size %],
+            "copies" : [
+                [%- IF 1 -%]
+                [%- FOR lid IN li.lineitem_details;
+                        fund = lid.fund.code;
+                        item_type = lid.circ_modifier;
+                        callnumber = lid.cn_label;
+                        owning_lib = lid.owning_lib.shortname;
+                        location = lid.location;
+    
+                        # when we have real copy data, treat it as authoritative
+                        acp = lid.eg_copy_id;
+                        IF acp;
+                            item_type = acp.circ_modifier;
+                            callnumber = acp.call_number.label;
+                            location = acp.location.name;
+                        END -%]
+                {   [%- IF fund %] "fund" : "[% fund %]",[% END -%]
+                    [%- IF callnumber %] "call_number" : "[% callnumber %]", [% END -%]
+                    [%- IF item_type %] "item_type" : "[% item_type %]", [% END -%]
+                    [%- IF location %] "copy_location" : "[% location %]", [% END -%]
+                    [%- IF owning_lib %] "owning_lib" : "[% owning_lib %]", [% END -%]
+                    [%- #chomp %]"copy_id" : "[% lid.id %]" }[% ',' UNLESS loop.last %]
+                [% END -%]
+                [%- END -%]
+             ]
+        }[% UNLESS loop.last %],[% END %]
+        [%-# TODO: lineitem details (later) -%]
+        [% END %]
+        ],
+        "line_items":[% target.lineitems.size %]
+     }]  [%# close ORDERS array %]
+   }]    [%# close  body  array %]
+}
+[% END %]
+[% tempo = PROCESS big_block; helpers.escape_json(tempo) %]
+$$
+WHERE id = 23 AND FALSE; -- DON'T PERFORM THE UPDATE
+
+
+-- add copy-related fields to the environment if they're not already there.
+DO $$
+BEGIN
+    PERFORM 1 
+        FROM action_trigger.environment 
+        WHERE 
+            event_def = 23 AND 
+            path = 'lineitems.lineitem_details.owning_lib';
+    IF NOT FOUND THEN
+        INSERT INTO action_trigger.environment (event_def, path) 
+            VALUES (23, 'lineitems.lineitem_details.owning_lib'); 
+    END IF;
+
+    PERFORM 1 
+        FROM action_trigger.environment 
+        WHERE 
+            event_def = 23 AND 
+            path = 'lineitems.lineitem_details.fund';
+    IF NOT FOUND THEN
+        INSERT INTO action_trigger.environment (event_def, path) 
+            VALUES (23, 'lineitems.lineitem_details.fund'); 
+    END IF;
+
+    PERFORM 1 
+        FROM action_trigger.environment 
+        WHERE 
+            event_def = 23 AND 
+            path = 'lineitems.lineitem_details.location';
+    IF NOT FOUND THEN
+        INSERT INTO action_trigger.environment (event_def, path) 
+            VALUES (23, 'lineitems.lineitem_details.location'); 
+    END IF;
+
+    PERFORM 1 
+        FROM action_trigger.environment 
+        WHERE 
+            event_def = 23 AND 
+            path = 'lineitems.lineitem_details.eg_copy_id.location';
+    IF NOT FOUND THEN
+        INSERT INTO action_trigger.environment (event_def, path) 
+            VALUES (23, 'lineitems.lineitem_details.eg_copy_id.location'); 
+    END IF;
+
+    PERFORM 1 
+        FROM action_trigger.environment 
+        WHERE 
+            event_def = 23 AND 
+            path = 'lineitems.lineitem_details.eg_copy_id.call_number';
+    IF NOT FOUND THEN
+        INSERT INTO action_trigger.environment (event_def, path) 
+            VALUES (23, 'lineitems.lineitem_details.eg_copy_id.call_number'); 
+    END IF;
+
+
+
+    -- remove redundant entry
+    DELETE FROM action_trigger.environment 
+        WHERE event_def = 23 AND path = 'lineitems.lineitem_details'; 
+
+END $$;
+
+
+