Add labeled_json column to acq.edi_messages
authorJason Etheridge <jason@esilibrary.com>
Fri, 19 Aug 2011 04:55:38 +0000 (00:55 -0400)
committerJason Etheridge <jason@esilibrary.com>
Thu, 1 Dec 2011 18:14:10 +0000 (13:14 -0500)
The idea here is to leverage some of the English labels in Business::EDI for a
more human readable view in the staff client.  So we're populating this field
with JSON using those labels, and can hopefully build some useful view from it.

Thinking about I18N, maybe we can layer EG's I18N stuff on top, and use these
labels as a fallback.

Signed-off-by: Jason Etheridge <jason@esilibrary.com>
Open-ILS/examples/fm_IDL.xml
Open-ILS/src/perlmods/lib/OpenILS/Application/Acq/EDI.pm
Open-ILS/src/sql/Pg/200.schema.acq.sql
Open-ILS/src/sql/Pg/upgrade/XXXX.schema.acq_edi_message_labeled_json_column.sql [new file with mode: 0644]
Open-ILS/src/templates/acq/po/edi_messages.tt2

index d605f1d..b4e4ddd 100644 (file)
@@ -7180,6 +7180,7 @@ SELECT  usr,
                        <field name="status"           reporter:datatype="text"      reporter:label="Status"/>
                        <field name="edi"              reporter:datatype="text"      reporter:label="EDI Message Body"/>
                        <field name="jedi"             reporter:datatype="text"      reporter:label="JEDI Message Body"/>
+                       <field name="labeled_json"     reporter:datatype="text"      reporter:label="Labeled JSON Message Body"/>
                        <field name="error"            reporter:datatype="text"      reporter:label="Error"/>
                        <field name="purchase_order"   reporter:datatype="link"      reporter:label="Purchase Order"/>
                        <field name="message_type"     reporter:datatype="text"      reporter:label="Message Type"/>
index 3fc0883..d1083ed 100644 (file)
@@ -279,6 +279,25 @@ sub attempt_translation {
     } else {
         $edi_message->jedi($ret->value);   # translator returns an object
     }
+    eval {
+        my $labeled_objects = [];
+        my $jedi = $edi_message->jedi();
+        my $perl  = __PACKAGE__->jedi2perl($jedi);
+        foreach my $part (@{$perl->{body}}) {
+            unless (ref $part and scalar keys %$part) {
+                next;
+            }
+            foreach my $key (keys %$part) {
+                my $msg = __PACKAGE__->message_object($part->{$key}) or next;
+                my $v = dump_readable_object($msg);
+                push @$labeled_objects, $v;
+            }
+        }
+        $edi_message->labeled_json( OpenSRF::Utils::JSON->perl2JSON( $labeled_objects ) );
+    };
+    if ($@) {
+        $logger->warn($@);
+    }
     return $edi_message;
 }
 
@@ -577,6 +596,83 @@ sub process_jedi {
     return \@messages;
 }
 
+sub dump_readable_object {
+    my $edi_msg = shift;
+    my $obj = { 'children' => [] };
+    if (! ref $edi_msg) {
+        return $edi_msg;
+    }
+    my @keys = $edi_msg->part_keys();
+    foreach my $key ( @keys ) {
+        $key =~ s/^all_//;
+        my @parts = ();
+        my $child;
+        eval {
+            if ($key eq 'label' or $key eq 'desc' or $key eq 'code' or $key eq 'value') {
+                $child = 0;
+                @parts = ( $edi_msg->$key() );
+            } else {
+                $child = 1;
+                @parts = $edi_msg->part("all_$key");
+            }
+        };
+        if ($@) {
+            eval {
+                @parts = $edi_msg->part("$key");
+            };
+            if ($@) {
+                eval {
+                    @parts = ( $edi_msg->$key() );
+                };
+                if ($@) {
+                    $logger->warn('EDI pooh ' . Dumper($@));
+                }
+            }
+        }
+        if (scalar(@parts) == 1) {
+            if ($child) {
+                my $child_obj = dump_readable_object($parts[0]);
+                if (! defined $child_obj) {
+                    next;
+                }
+                if (ref $child_obj) {
+                    $child_obj->{'key'} = $key;
+                }
+                push @{ $obj->{'children'} }, $child_obj; 
+            } else {
+                my $dobj = dump_readable_object($parts[0]);
+                if (! defined $dobj) {
+                    next;
+                }
+                $obj->{$key} = $dobj;
+            }
+        } else {
+            if ($child) {
+                foreach my $part ( @parts ) {
+                    my $child_obj = dump_readable_object($part);
+                    if (! defined $child_obj) {
+                        next;
+                    }
+                    if (ref $child_obj) {
+                        $child_obj->{'key'} = $key;
+                    }
+                    push @{ $obj->{'children'} }, $child_obj; 
+                }
+            } else {
+                $obj->{$key} = [];
+                foreach my $part ( @parts ) {
+                    my $dobj = dump_readable_object($part);
+                    if (! defined $dobj) {
+                        next;
+                    }
+                    push @{ $obj->{$key} }, $dobj;
+                }
+            }
+        }
+    }
+    return $obj;
+}
+
 # returns message object if processing should continue
 # returns false/undef value if processing should abort
 
index 8765c4a..7dcf00c 100644 (file)
@@ -765,6 +765,7 @@ CREATE TABLE acq.edi_message (
                                      )),
     edi              TEXT,
     jedi             TEXT,
+    labeled_json     TEXT,
     error            TEXT,
     purchase_order   INT             REFERENCES acq.purchase_order
                                      DEFERRABLE INITIALLY DEFERRED,
diff --git a/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.acq_edi_message_labeled_json_column.sql b/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.acq_edi_message_labeled_json_column.sql
new file mode 100644 (file)
index 0000000..a269afb
--- /dev/null
@@ -0,0 +1,12 @@
+-- Evergreen DB patch XXXX.schema.acq_edi_message_labeled_json_column.sql
+--
+-- labeled_json column for acq.edi_messages
+--
+BEGIN;
+
+-- check whether patch can be applied
+SELECT evergreen.upgrade_deps_block_check('XXXX', :eg_version);
+
+ALTER TABLE acq.edi_message ADD COLUMN labeled_json TEXT;
+
+COMMIT;
index c936616..603bc74 100644 (file)
             query="{id: '*'}"
             [% IF ctx.page_args.0 %]
             fieldOrder="['message_type', 'status', 'create_time', 'translate_time', 'process_time', 'error_time', 'error', 'account', 'remote_file']"
-            suppressFields="['id', 'edi', 'jedi', 'purchase_order']"
+            suppressFields="['id', 'edi', 'jedi', 'labeled_json', 'purchase_order']"
             [% ELSE %]
             fieldOrder="['purchase_order', 'message_type', 'status', 'create_time', 'translate_time', 'process_time', 'error_time', 'error', 'account', 'remote_file']"
-            suppressFields="['id', 'edi', 'jedi']"
+            suppressFields="['id', 'edi', 'jedi', 'labeled_json']"
             [% END  %]
             editStyle='pane'
             fmClass='acqedim'