From: Jason Etheridge Date: Fri, 19 Aug 2011 04:55:38 +0000 (-0400) Subject: Add labeled_json column to acq.edi_messages X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=494db9e4bd5670e41130cbb5a8986bd3c909397f;p=working%2FEvergreen.git Add labeled_json column to acq.edi_messages 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 --- diff --git a/Open-ILS/examples/fm_IDL.xml b/Open-ILS/examples/fm_IDL.xml index d605f1df6a..b4e4ddd057 100644 --- a/Open-ILS/examples/fm_IDL.xml +++ b/Open-ILS/examples/fm_IDL.xml @@ -7180,6 +7180,7 @@ SELECT usr, + diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Acq/EDI.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Acq/EDI.pm index 3fc0883f3c..d1083ed90f 100644 --- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Acq/EDI.pm +++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Acq/EDI.pm @@ -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 diff --git a/Open-ILS/src/sql/Pg/200.schema.acq.sql b/Open-ILS/src/sql/Pg/200.schema.acq.sql index 8765c4a659..7dcf00c013 100644 --- a/Open-ILS/src/sql/Pg/200.schema.acq.sql +++ b/Open-ILS/src/sql/Pg/200.schema.acq.sql @@ -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 index 0000000000..a269afb1a5 --- /dev/null +++ b/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.acq_edi_message_labeled_json_column.sql @@ -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; diff --git a/Open-ILS/src/templates/acq/po/edi_messages.tt2 b/Open-ILS/src/templates/acq/po/edi_messages.tt2 index c936616bb2..603bc74980 100644 --- a/Open-ILS/src/templates/acq/po/edi_messages.tt2 +++ b/Open-ILS/src/templates/acq/po/edi_messages.tt2 @@ -14,10 +14,10 @@ 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'