From c3d1116d5557fd6fa4feedbb707bc0b4c0e82c3d Mon Sep 17 00:00:00 2001 From: gmc Date: Wed, 15 Sep 2010 13:27:21 +0000 Subject: [PATCH] backport EDI changes from trunk (r17669:17690,r17692) EDI work done by Joe Atzberger; highlights of the enhancements are: * ORDRSP processing improvements * overhaul of edi_fetcher * EDI test files * Beginning of modperl EDI message viewer Signed-off-by: Galen Charlton git-svn-id: svn://svn.open-ils.org/ILS/branches/rel_2_0@17693 dcc99617-32d9-48b4-a31d-7c20da2025e4 --- Open-ILS/examples/apache/eg_vhost.conf | 13 +- Open-ILS/src/edi_translator/README | 7 +- Open-ILS/src/edi_translator/test_client.pl | 78 +- .../src/perlmods/OpenILS/Application/Acq/EDI.pm | 570 +++- .../perlmods/OpenILS/Application/Acq/Lineitem.pm | 24 +- .../src/perlmods/OpenILS/Application/Acq/Order.pm | 83 +- .../Validator/Acq/PurchaseOrderEDIRequired.pm | 6 +- Open-ILS/src/perlmods/OpenILS/Utils/Cronscript.pm | 2 +- .../src/perlmods/OpenILS/Utils/RemoteAccount.pm | 43 +- Open-ILS/src/support-scripts/edi_fetcher.pl | 164 +- Open-ILS/src/support-scripts/edi_pusher.pl | 2 +- .../src/support-scripts/test-scripts/edi_object.pl | 2985 ------------------- .../src/support-scripts/test-scripts/ftp_ls.pl | 2 +- .../support-scripts/test-scripts/ordrsp_parse.pl | 3058 -------------------- .../datasets/edi_scratch/0BzIfl53u8.ORDRSP.jedi | 1 + .../datasets/edi_scratch/0LGQQtTxuv.orders.edi | 1 + Open-ILS/tests/datasets/edi_scratch/4PkcdYeZtT.edi | 1 + Open-ILS/tests/datasets/edi_scratch/5pGP3O5rgS | 1 + Open-ILS/tests/datasets/edi_scratch/acq.bugs | 24 + .../datasets/edi_scratch/baker_taylor.ordrsp.edi | 1 + .../edi_scratch/baker_taylor.ordrsp.edi.split | 41 + .../datasets/edi_scratch/baker_taylor.ordrsp.edi2 | 1 + .../datasets/edi_scratch/baker_taylor.ordrsp.jedi | 453 +++ .../edi_scratch/baker_taylor.ordrsp.jedi.pl | 457 +++ .../edi_scratch/baker_taylor.ordrsp.jedi.tidy.pl | 448 +++ .../datasets/edi_scratch/baker_taylor.ordrsp.jedi2 | 406 +++ .../tests/datasets/edi_scratch/brodart_001_edi.tst | 1 + .../tests/datasets/edi_scratch/edi_splitter.pl | 26 + Open-ILS/tests/datasets/edi_scratch/ftx_test.jedi | 69 + .../tests/datasets/edi_scratch/ftx_test.output | 70 + .../datasets/edi_scratch/ruby_json2edi.orders | 75 + .../datasets/edi_scratch/zBFqgVwJ7l.orders.edi | 1 + .../default/conify/global/acq/edi_account.tt2 | 1 + 33 files changed, 2817 insertions(+), 6298 deletions(-) delete mode 100755 Open-ILS/src/support-scripts/test-scripts/edi_object.pl delete mode 100755 Open-ILS/src/support-scripts/test-scripts/ordrsp_parse.pl create mode 100644 Open-ILS/tests/datasets/edi_scratch/0BzIfl53u8.ORDRSP.jedi create mode 100644 Open-ILS/tests/datasets/edi_scratch/0LGQQtTxuv.orders.edi create mode 100644 Open-ILS/tests/datasets/edi_scratch/4PkcdYeZtT.edi create mode 100644 Open-ILS/tests/datasets/edi_scratch/5pGP3O5rgS create mode 100644 Open-ILS/tests/datasets/edi_scratch/acq.bugs create mode 100644 Open-ILS/tests/datasets/edi_scratch/baker_taylor.ordrsp.edi create mode 100644 Open-ILS/tests/datasets/edi_scratch/baker_taylor.ordrsp.edi.split create mode 100644 Open-ILS/tests/datasets/edi_scratch/baker_taylor.ordrsp.edi2 create mode 100644 Open-ILS/tests/datasets/edi_scratch/baker_taylor.ordrsp.jedi create mode 100644 Open-ILS/tests/datasets/edi_scratch/baker_taylor.ordrsp.jedi.pl create mode 100644 Open-ILS/tests/datasets/edi_scratch/baker_taylor.ordrsp.jedi.tidy.pl create mode 100644 Open-ILS/tests/datasets/edi_scratch/baker_taylor.ordrsp.jedi2 create mode 100644 Open-ILS/tests/datasets/edi_scratch/brodart_001_edi.tst create mode 100755 Open-ILS/tests/datasets/edi_scratch/edi_splitter.pl create mode 100644 Open-ILS/tests/datasets/edi_scratch/ftx_test.jedi create mode 100644 Open-ILS/tests/datasets/edi_scratch/ftx_test.output create mode 100644 Open-ILS/tests/datasets/edi_scratch/ruby_json2edi.orders create mode 100644 Open-ILS/tests/datasets/edi_scratch/zBFqgVwJ7l.orders.edi diff --git a/Open-ILS/examples/apache/eg_vhost.conf b/Open-ILS/examples/apache/eg_vhost.conf index 116fd82d4a..1f93a21df3 100644 --- a/Open-ILS/examples/apache/eg_vhost.conf +++ b/Open-ILS/examples/apache/eg_vhost.conf @@ -27,7 +27,7 @@ RedirectMatch 301 ^/$ /opac/en-US/skin/default/xml/index.xml # ---------------------------------------------------------------------------------- # Assign a default locale to the accessible OPAC # ---------------------------------------------------------------------------------- -RedirectMatch 301 ^/opac/extras/slimpac/start.html$ /opac/en-US/extras/slimpac/start.html +RedirectMatch 301 ^/opac/extras/slimpac/start.html$ /opac/en-US/extras/slimpac/start.html RedirectMatch 301 ^/opac/extras/slimpac/advanced.html$ /opac/en-US/extras/slimpac/advanced.html # ---------------------------------------------------------------------------------- @@ -442,6 +442,17 @@ RewriteRule - - [E=locale:en-US] [L] # ---------------------------------------------------------------------------------- +# EDI Message viewer +# ---------------------------------------------------------------------------------- + + SetHandler perl-script + PerlHandler OpenILS::WWW::EDI + Options +ExecCGI + PerlSendHeader On + allow from all + + +# ---------------------------------------------------------------------------------- # XML-RPC gateway # ---------------------------------------------------------------------------------- diff --git a/Open-ILS/src/edi_translator/README b/Open-ILS/src/edi_translator/README index 146bd499d6..6c070fdf02 100644 --- a/Open-ILS/src/edi_translator/README +++ b/Open-ILS/src/edi_translator/README @@ -26,7 +26,7 @@ components (on debian lenny linux). There is no such thing (yet?) as "push" from a vendor of their EDI responses. Basically they just put responses in an FTP directory somewhere that you are expected to check. It would be cool if there were a better way to do that like consuming some RSS feed or -remote API callbacks. +remote API callbacks. Similarly, nobody seems willing to utilize interactive EDI. Evergreen will only support one delivery address per PO. That limitation is based on the mapping to the delivery address via the ordering_agency org_unit. If items @@ -36,10 +36,5 @@ If we want to support multiple vendor profiles, then we drop the unique constrai on SAN, add a new one on SAN + profile_code. Profile code then goes in the template. The template logic could get rather complex to support all the optional data elements. -mbklein says: -'order' mapper won't work for EDIFACT versions later than D.96A, because of a change -to the structure of the BGM segment. But as long as all the supported vendors will -accept a D.96A ORDERS (which I think they do), that's not a problem. - SEE ALSO: http://github.com/mbklein/openils-mapper diff --git a/Open-ILS/src/edi_translator/test_client.pl b/Open-ILS/src/edi_translator/test_client.pl index 4a3f479537..41ea047d43 100755 --- a/Open-ILS/src/edi_translator/test_client.pl +++ b/Open-ILS/src/edi_translator/test_client.pl @@ -6,9 +6,11 @@ use strict; use Getopt::Long; use RPC::XML::Client; +use JSON::XS; use Data::Dumper; # DEFAULTS +$Data::Dumper::Indent = 1; my $host = 'http://localhost'; my $verbose = 0; @@ -23,7 +25,7 @@ $host =~ /:\d+$/ or $host .= ':9191'; $host .= '/EDI'; sub get_in { - print "Getting " . (shift) . " from input\n"; + print STDERR "Getting " . (shift) . " from input\n"; my $json = join("", ); $json or return; print $json, "\n"; @@ -39,49 +41,86 @@ sub nice_string { return substr($string,0,$head) . " ...\n... " . substr($string, -1*$tail); } +sub JSONObject2Perl { + my $obj = shift; + if ( ref $obj eq 'HASH' ) { # is a hash w/o class marker; simply revivify innards + for my $k (keys %$obj) { + $obj->{$k} = JSONObject2Perl($obj->{$k}) unless ref $obj->{$k} eq 'JSON::XS::Boolean'; + } + } elsif ( ref $obj eq 'ARRAY' ) { + for my $i (0..scalar(@$obj) - 1) { + $obj->[$i] = JSONObject2Perl($obj->[$i]) unless ref $obj->[$i] eq 'JSON::XS::Boolean'; + } + } + # ELSE: return vivified non-class hashes, all arrays, and anything that isn't a hash or array ref + return $obj; +} + # MAIN print "Trying host: $host\n"; +my $parser; + my $client = new RPC::XML::Client($host); $client->request->header('Content-Type' => 'text/xml;charset=utf-8'); -print "User-agent: ", Dumper($client->useragent); -print "Request: ", Dumper($client->request); -print "Headers: \n"; -foreach ($client->request->header_field_names) { - print "\t$_ =>", $client->request->header($_), "\n"; + +if ($verbose) { + print "User-agent: ", Dumper($client->useragent); + print "Request: ", Dumper($client->request); + print "Headers: \n"; + foreach ($client->request->header_field_names) { + print "\t$_ =>", $client->request->header($_), "\n"; + } } my @commands = @ARGV ? @ARGV : 'system.listMethods'; -if ($commands[0] eq 'json2edi' or $commands[0] eq 'edi2json') { +my $command = lc $commands[0]; +if ($command eq 'json2edi' or $command eq 'edi2json' or $command eq 'edi2perl') { shift; - @commands > 1 and print "Ignoring commands after $commands[0]\n"; + @commands > 1 and print STDERR "Ignoring commands after $command\n"; my $string; - my $type = $commands[0] eq 'json2edi' ? 'JSON' : 'EDI'; + my $type = $command eq 'json2edi' ? 'JSON' : 'EDI'; while ($string = get_in($type)) { # assignment - if ($commands[0] ne 'json2edi') { - $string =~ s/ORDRSP:0(:...:UN::)/ORDRSP:D$1/ and print "Corrected broken data 'ORDRSP:0' ==> 'ORDRSP:D'\n"; + my $resp; + if ($command eq 'json2edi') { + $resp = $client->send_request('json2edi', $string); + print "# $command Response: \n", Dumper($resp); + } else { + $string =~ s/ORDRSP:0(:...:UN::)/ORDRSP:D$1/ and print STDERR "Corrected broken data 'ORDRSP:0' ==> 'ORDRSP:D'\n"; + $resp = $client->send_request('edi2json', $string); + } + unless ($resp) { + warn "Response does not have a payload value!"; + next; } - my $resp = $commands[0] eq 'json2edi' ? - $client->send_request('json2edi', $string) : - $client->send_request('edi2json', $string) ; - print "Response: ", Dumper($resp); - $resp or next; if ($resp->is_fault) { print "\n\nERROR code ", $resp->code, " received:\n", nice_string($resp->string) . "\n...\n"; next; } + if ($command ne 'json2edi') { # like the else of the first conditional + $parser ||= JSON::XS->new()->pretty(1)->ascii(1)->allow_nonref(1)->space_before(0); # get it once + $verbose and print Dumper($resp); + my $parsed = $parser->decode($resp->value) or warn "Failed to decode response payload value"; + my $perl = JSONObject2Perl($parsed) or warn "Failed to decode and create perl object from JSON"; + if ($perl) { + print STDERR "\n########## We were able to decode and perl-ify the JSON\n"; + } else { + print STDERR "\n########## ERROR: Failed to decode and perl-ify the JSON\n"; + } + print "# $command Response: \n", $command eq 'edi2perl' ? Dumper($perl) : $parser->encode($parsed); + } } exit; } -print "Sending request: \n ", join("\n ", @commands), "\n\n"; +print STDERR "Sending request: \n ", join("\n ", @commands), "\n\n"; my $resp = $client->send_request(@commands); print Dumper($resp); exit; if (ref $resp) { - print "Return is " . ref($resp), "\n"; + print STDERR "Return is " . ref($resp), "\n"; # print "Code: ", ($resp->{code}->as_string || 'UNKNOWN'), "\n"; foreach (@$resp) { print Dumper ($_), "\n"; @@ -95,10 +134,11 @@ if (ref $resp) { print "\n"; } } else { - print "ERROR: unrecognized response:\n\n", Dumper($resp), "\n"; + print STDERR "ERROR: unrecognized response:\n\n", Dumper($resp), "\n"; } $verbose and print Dumper($resp); $verbose and print "\nKEYS (level 1):\n", map {sprintf "%12s: %s\n", $_, scalar $resp->{$_}->value} sort keys %$resp; # print "spooled_filename: ", $resp->{spooled_filename}->value, "\n"; + diff --git a/Open-ILS/src/perlmods/OpenILS/Application/Acq/EDI.pm b/Open-ILS/src/perlmods/OpenILS/Application/Acq/EDI.pm index 815ce20f13..909944b114 100644 --- a/Open-ILS/src/perlmods/OpenILS/Application/Acq/EDI.pm +++ b/Open-ILS/src/perlmods/OpenILS/Application/Acq/EDI.pm @@ -17,7 +17,6 @@ use OpenILS::Utils::Fieldmapper; use OpenILS::Application::Acq::EDI::Translator; use Business::EDI; -use Business::EDI::Segment::BGM; use Data::Dumper; our $verbose = 0; @@ -29,6 +28,8 @@ sub new { return $self; } +# our $reasons = {}; # cache for acq.cancel_reason rows ? + our $translator; sub translator { @@ -79,7 +80,7 @@ __PACKAGE__->register_method( ); sub retrieve_core { - my ($self, $e, $set, $max) = @_; # $e is a working editor + my ($self, $set, $max, $e, $test) = @_; # $e is a working editor $e ||= new_editor(); $set ||= __PACKAGE__->retrieve_vendors($e); @@ -91,31 +92,59 @@ sub retrieve_core { my $server; $logger->info("EDI check for vendor " . ++$vcount . " of " . scalar(@$set) . ": " . $account->host); unless ($server = __PACKAGE__->remote_account($account)) { # assignment, not comparison - $logger->err(sprintf "Failed remote account connection for %s (%s)", $account->host, $account->id); + $logger->err(sprintf "Failed remote account mapping for %s (%s)", $account->host, $account->id); next; }; - my @files = $server->ls({remote_file => ($account->in_dir || '.')}); - my @ok_files = grep {$_ !~ /\/\.?\.$/ } @files; - $logger->info(sprintf "%s of %s files at %s/%s", scalar(@ok_files), scalar(@files), $account->host, ($account->in_dir || '')); - foreach (@ok_files) { +# my $rf_starter = './'; # default to current dir + if ($account->in_dir) { + if ($account->in_dir =~ /\*+.*\//) { + $logger->err("EDI in_dir has a slash after an asterisk in value: '" . $account->in_dir . "'. Skipping account with indeterminate target dir!"); + next; + } +# $rf_starter = $account->in_dir; +# $rf_starter =~ s/((\/)?[^\/]*)\*+[^\/]*$//; # kill up to the first (possible) slash before the asterisk: keep the preceeding static dir +# $rf_starter .= '/' if $rf_starter or $2; # recap the dir, or replace leading "/" if there was one (but don't add if empty) + } + my @files = ($server->ls({remote_file => ($account->in_dir || './')})); + my @ok_files = grep {$_ !~ /\/\.?\.$/ and $_ ne '0'} @files; + $logger->info(sprintf "%s of %s files at %s/%s", scalar(@ok_files), scalar(@files), $account->host, $account->in_dir); + # $server->remote_path(undef); + foreach my $remote_file (@ok_files) { + # my $remote_file = $rf_starter . $_; + my $description = sprintf "%s/%s", $account->host, $remote_file; + + # deduplicate vs. acct/filenames already in DB + my $hits = $e->search_acq_edi_message([ + { + account => $account->id, + remote_file => $remote_file, + status => {'in' => [qw/ processed /]}, # if it never got processed, go ahead and get the new one (try again) + # create_time => 'NOW() - 60 DAYS', # if we wanted to allow filenames to be reused after a certain time + # ideally we would also use the date from FTP, but that info isn't available via RemoteAccount + } + # { flesh => 1, flesh_fields => {...}, } + ]); + if (scalar(@$hits)) { + $logger->debug("EDI: $remote_file already retrieved. Skipping"); + warn "EDI: $remote_file already retrieved. Skipping"; + next; + } + ++$count; $max and $count > $max and last; + $logger->info(sprintf "%s of %s targets: %s", $count, scalar(@ok_files), $description); + print sprintf "%s of %s targets: %s\n", $count, scalar(@ok_files), $description; + if ($test) { + push @return, "test_$count"; + next; + } my $content; my $io = IO::Scalar->new(\$content); - unless ($server->get({remote_file => $_, local_file => $io})) { - $logger->error("(S)FTP get($_) failed"); + unless ( $server->get({remote_file => $remote_file, local_file => $io}) ) { + $logger->error("(S)FTP get($description) failed"); next; } - my $incoming = Fieldmapper::acq::edi_message->new; - $incoming->remote_file($_); - $incoming->edi($content); - $incoming->account($account->id); - __PACKAGE__->attempt_translation($incoming); - $e->xact_begin; - $e->create_acq_edi_message($incoming); - $e->xact_commit; - __PACKAGE__->record_activity($account, $e); - __PACKAGE__->process_jedi($incoming, $server, $e); + my $incoming = __PACKAGE__->process_retrieval($content, $remote_file, $server, $account->id, $e); # $server->delete(remote_file => $_); # delete remote copies of saved message push @return, $incoming->id; } @@ -123,6 +152,40 @@ sub retrieve_core { return \@return; } +# my $in = OpenILS::Application::Acq::EDI->process_retrieval($file_content, $remote_filename, $server, $account_id, $editor); + +sub process_retrieval { + my $incoming = Fieldmapper::acq::edi_message->new; + my ($class, $content, $remote, $server, $account_or_id, $e) = @_; + $content or return; + $e ||= new_editor; + + my $account = __PACKAGE__->record_activity( $account_or_id, $e ); + + my $z; # must predeclare + $z = ( $content =~ s/('UNH\+\d+\+ORDRSP:)0(:96A:UN')/$1D$2/g ) + and $logger->warn("Patching bogus spec reference ORDRSP:0:96A:UN => ORDRSP:D:96A:UN ($z times)"); # Hack/fix some faulty "0" in (B&T) data + + $incoming->remote_file($remote); + $incoming->account($account->id); + $incoming->edi($content); + $incoming->message_type(($content =~ /'UNH\+\d+\+(\S{6}):/) ? $1 : 'ORDRSP'); # cheap sniffing, ORDRSP fallback + __PACKAGE__->attempt_translation($incoming); + $e->xact_begin; + $e->create_acq_edi_message($incoming); + $e->xact_commit; + # refresh: send process_jedi the updated row + my $res = __PACKAGE__->process_jedi($e->retrieve_acq_edi_message($incoming->id), $server, $account, $e); + my $outgoing = $e->retrieve_acq_edi_message($incoming->id); # refresh again! + $outgoing->status($res ? 'processed' : 'proc_error'); + if ($res) { + $e->xact_begin; + $e->update_acq_edi_message($outgoing); + $e->xact_commit; + } + return $outgoing; +} + # ->send_core # $account is a Fieldmapper object for acq.edi_account row # $messageset is an arrayref with acq.edi_message.id values @@ -217,7 +280,7 @@ sub retrieve_vendors { $e ||= new_editor(); my $criteria = {'+acqpro' => {active => 't'}}; - # $criteria->{vendor_id} = $vendor_id if $vendor_id; + $criteria->{'+acqpro'}->{id} = $vendor_id if $vendor_id; return $e->search_acq_edi_account([ $criteria, { 'join' => 'acqpro', @@ -267,7 +330,7 @@ sub field_map { ($host =~ s/^(S?FTP)://i and $args{type} = uc($1)) or ($host =~ s/^(SSH|SCP)://i and $args{type} = 'SCP' ) ; $host =~ s/:(\d+)$// and $args{port} = $1; - ($args{remote_host} = $host) =~ s#/+##; + ($args{remote_host} = $host) =~ s#/+##; $verbose and $logger->warn("field_map: " . Dumper(\%args)); return %args; } @@ -291,10 +354,13 @@ sub remote_account { ); } +# takes account ID or account Fieldmapper object + sub record_activity { - my ($class, $account, $e) = @_; - $account or return; + my ($class, $account_or_id, $e) = @_; + $account_or_id or return; $e ||= new_editor(); + my $account = ref($account_or_id) ? $account_or_id : $e->retrieve_acq_edi_account($account_or_id); $logger->info("EDI record_activity calling update_acq_edi_account"); $account->last_activity('NOW') or return; $e->xact_begin; @@ -329,34 +395,43 @@ sub jedi2perl { return $msg; } -# ->process_jedi($message, $server, $e) +our @datecodes = (35, 359, 17, 191, 69, 76, 75, 79, 85, 74, 84, 223); +our @noop_6063 = (21); + +# ->process_jedi($message, $server, $remote, $e) +# $message is an edi_message object +# sub process_jedi { - my $class = shift; - my $message = shift or return; - my $server = shift || {}; # context - my $jedi = ref($message) ? $message->jedi : $message; # If we got an object, it's an edi_message. A string is the jedi content itself. - unless ($jedi) { - $logger->warn("EDI process_jedi missing required argument (edi_message object with jedi or jedi scalar)!"); + my ($class, $message, $server, $remote, $e) = @_; + $message or return; + $server ||= {}; # context + $remote ||= {}; # context + $e ||= new_editor; + my $jedi; + unless (ref($message) and $jedi = $message->jedi) { # assignment, not comparison + $logger->warn("EDI process_jedi missing required argument (edi_message object with jedi)!"); return; } - my $e = @_ ? shift : new_editor(); - my $perl = __PACKAGE__->jedi2perl($jedi); + my $perl = __PACKAGE__->jedi2perl($jedi); + my $error = ''; if (ref($message) and not $perl) { - $message->error(($message->error || '') . " JSON2perl (jedi2perl) FAILED to convert jedi"); + $error = ($message->error || '') . " JSON2perl (jedi2perl) FAILED to convert jedi"; + } + elsif (! $perl->{body}) { + $error = "EDI interchange body not found!"; + } + elsif (! $perl->{body}->[0]) { + $error = "EDI interchange body not a populated arrayref!"; + } + if ($error) { + $logger->warn($error); + $message->error($error); $message->error_time('NOW'); $e->xact_begin; - $e->udpate_acq_edi_message($message) or $logger->warn("EDI update_acq_edi_message failed! $!"); + $e->update_acq_edi_message($message) or $logger->warn("EDI update_acq_edi_message failed! $!"); $e->xact_commit; return; } - if (! $perl->{body}) { - $logger->warn("EDI interchange body not found!"); - return; - } - if (! $perl->{body}->[0]) { - $logger->warn("EDI interchange body not a populated arrayref!"); - return; - } # Crazy data structure. Most of the arrays will be 1 element... we think. # JEDI looks like: @@ -365,8 +440,9 @@ sub process_jedi { # So you might access it like: # $obj->{body}->[0]->{ORDERS}->[0]->[0] eq 'UNH' - $logger->info("EDI interchange body has " . scalar(@{$perl->{body}}) . " messages(s)"); - my @li; + $logger->info("EDI interchange body has " . scalar(@{$perl->{body}}) . " message(s)"); + my @ok_msg_codes = qw/ORDRSP OSTRPT/; + my @messages; my $i = 0; foreach my $part (@{$perl->{body}}) { $i++; @@ -375,95 +451,168 @@ sub process_jedi { next; } foreach my $key (keys %$part) { - unless ($key eq 'ORDRSP') { # We only do one type for now. TODO: other types here - $logger->warn("EDI interchange message $i contains unhandled type '$key'. Ignoring."); + if (! grep {$_ eq $key} @ok_msg_codes) { # We only do one type for now. TODO: other types here + $logger->warn("EDI interchange $i contains unhandled '$key' message. Ignoring it."); next; } - my @li_chunk = __PACKAGE__->parse_ordrsp($part->{$key}, $server, $e); - $logger->info("EDI $key parsing returned " . scalar(@li_chunk) . " line items"); - push @li, @li_chunk; + my $msg = __PACKAGE__->message_object($part->{$key}) or next; + push @messages, $msg; + + my $bgm = $msg->xpath('BGM') or $logger->warn("EDI No BGM segment found?!"); + my $tag4343 = $msg->xpath('BGM/4343'); + my $tag1225 = $msg->xpath('BGM/1225'); + if (ref $tag4343) { + $logger->info(sprintf "EDI $key BGM/4343 Response Type: %s - %s", $tag4343->value, $tag4343->label) + } else { + $logger->warn("EDI $key BGM/4343 Response Type Code unrecognized"); # next; #? + } + if (ref $tag1225) { + $logger->info(sprintf "EDI $key BGM/1225 Message Function: %s - %s", $tag1225->value, $tag1225->label); + } else { + $logger->warn("EDI $key BGM/1225 Message Function Code unrecognized"); # next; #? + } + + # TODO: currency check, just to be paranoid + # *should* be unnecessary (vendor should reply in currency we send in ORDERS) + # That begs a policy question: how to handle mismatch? convert (bad accuracy), reject, or ignore? I say ignore. + + # ALL those codes below are basically some form of (lastest) delivery date/time + # see, e.g.: http://www.stylusstudio.com/edifact/D04B/2005.htm + # The order is the order of definitiveness (first match wins) + # Note: if/when we do serials via EDI, dates (and ranges/periods) will need massive special handling + my @dates; + my $ddate; + + foreach my $date ($msg->xpath('delivery_schedule')) { + my $val_2005 = $date->xpath_value('DTM/2005') or next; + (grep {$val_2005 eq $_} @datecodes) or next; # no match means some other kind of date we don't care about + push @dates, $date; + } + if (@dates) { + DATECODE: foreach my $dcode (@datecodes) { # now cycle back through hits in order of dcode definitiveness + foreach my $date (@dates) { + $date->xpath_value('DTM/2005') == $dcode or next; + $ddate = $date->xpath_value('DTM/2380') and last DATECODE; + # TODO: conversion based on format specified in DTM/2379 (best encapsulated in Business::EDI) + } + } + } + foreach my $detail ($msg->part('line_detail')) { + my $eg_line = __PACKAGE__->eg_li($detail, $remote, $server->{remote_host}, $e) or next; + my $li_date = $detail->xpath_value('DTM/2380') || $ddate; + my $price = $detail->xpath_value('line_price/PRI/5118') || ''; + $eg_line->expected_recv_time($li_date) if $li_date; + $eg_line->estimated_unit_price($price) if $price; + if (not $message->purchase_order) { # first good lineitem sets the message PO link + $message->purchase_order($eg_line->purchase_order); # EG $message object NOT Business::EDI $msg object + $e->xact_begin; + $e->update_acq_edi_message($message) or $logger->warn("EDI update_acq_edi_message (for PO number) failed! $!"); + $e->xact_commit; + } + # $e->search_acq_edi_account([]); + my $touches = 0; + my $eg_lids = $e->search_acq_lineitem_detail({lineitem => $eg_line->id}); # should be the same as $eg_line->lineitem_details + my $lidcount = scalar(@$eg_lids); + $lidcount == $eg_line->item_count or $logger->warn( + sprintf "EDI: LI %s itemcount (%d) mismatch, %d LIDs found", $eg_line->id, $eg_line->item_count, $lidcount + ); + foreach my $qty ($detail->part('all_QTY')) { + my $ubound = $qty->xpath_value('6060') or next; # nothing to do if qty is 0 + my $val_6063 = $qty->xpath_value('6063'); + $ubound > 0 or next; # don't be crazy! + if (! $val_6063) { + $logger->warn("EDI: Response for LI " . $eg_line->id . " specifies quantity $ubound with no 6063 code! Contact vendor to resolve."); + next; + } + + my $eg_reason = $e->retrieve_acq_cancel_reason(1200 + $val_6063); # DB populated w/ 6063 keys in 1200's + if (! $eg_reason) { + $logger->warn("EDI: Unhandled quantity code '$val_6063' (LI " . $eg_line->id . ") $ubound items unprocessed"); + next; + } elsif (grep {$val_6063 == $_} @noop_6063) { # an FYI like "ordered quantity" + $ubound eq $lidcount + or $logger->warn("EDI: LI " . $eg_line->id . " -- Vendor says we ordered $ubound, but we have $lidcount LIDs!)"); + next; + } + # elsif ($val_6063 == 83) { # backorder + #} elsif ($val_6063 == 85) { # cancel + #} elsif ($val_6063 == 12 or $val_6063 == 57 or $val_6063 == 84 or $val_6063 == 118) { + # despatched, in transit, urgent delivery, or quantity manifested + #} + if ($touches >= $lidcount) { + $logger->warn("EDI: LI " . $eg_line->id . ", We already updated $touches of $lidcount LIDS, " . + "but message wants QTY $ubound more set to " . $eg_reason->label . ". Ignoring!"); + next; + } + $e->xact_begin; + foreach (1 .. $ubound) { + my $eg_lid = shift @$eg_lids or $logger->warn("EDI: Used up all $lidcount LIDs! Ignoring extra status " . $eg_reason->label); + $eg_lid or next; + $logger->debug(sprintf "Updating LID %s to %s", $eg_lid->id, $eg_reason->label); + $eg_lid->cancel_reason($eg_reason->id); + $e->update_acq_lineitem_detail($eg_lid); + $touches++; + } + $e->xact_commit; + if ($ubound == $eg_line->item_count) { + $eg_line->cancel_reason($eg_reason->id); # if ALL the items have the same cancel_reason, the PO gets it too + } + } + $eg_line->edit_time('NOW'); # TODO: have this field automatically updated via ON UPDATE trigger. + $e->xact_begin; + $e->update_acq_lineitem($eg_line) or $logger->warn("EDI: update_acq_lineitem FAILED"); + $e->xact_commit; + # print STDERR "Lineitem update: ", Dumper($eg_line); + } } } - return \@li, $perl; # TODO process perl + return \@messages; } +# returns message object if processing should continue +# returns false/undef value if processing should abort -=head2 ->parse_ordrsp($segments, $server, $e) - -Returns array of lineitems. - -=cut - -# TODO: Build Business::EDI::Message::ORDRSP object instead -# TODO: Convert access to methods, not reaching inside the data/object like $segbody->{S009}->{'0065'} +sub message_object { + my $class = shift; + my $body = shift or return; + my $key = shift if @_; + my $keystring = $key || 'UNSPECIFIED'; -sub parse_ordrsp { - my ($class, $segments, $server, $e, $test) = @_; # test not implemented - $e ||= new_editor(); - my $type = 'ORDRSP'; - $logger->info("EDI " . scalar(@$segments) . " segments in $type message"); - my (@lins, $bgm); - foreach my $segment (@$segments) { # Prepass: catch the conditions that might cause us to bail - my ($tag, $segbody, @extra) = @$segment; - unless ($tag ) {$logger->warn("EDI empty segment received" ); next;} - unless ($segbody) {$logger->warn("EDI segment '$tag' missing body"); next;} - @extra and $logger->warn("EDI extra data (" . scalar(@extra) . " elements) found after pseudohash pair for $tag"); - if ($tag eq 'UNH') { - unless ($segbody->{S009}->{'0065'} and $segbody->{S009}->{'0065'} eq $type) { - $logger->error("EDI $tag/S009/0065 ('" . ($segbody->{S009}->{'0065'} || '') . "') conflict w/ message type $type\. Aborting"); - return; - } - unless ($segbody->{S009}->{'0051'} and $segbody->{S009}->{'0051'} eq 'UN') { - $logger->warn("EDI $tag/S009/0051 does not designate 'UN' as controlling agency. Will attempt to process anyway"); - } - } elsif ($tag eq 'BGM') { - $bgm = Business::EDI::Segment::BGM->new($segbody); - $bgm->seg4343 or $logger->warn(sprintf "EDI $tag/4343 Response Type Code '%s' unrecognized", ($segbody->{4343} || '')); - $logger->info(sprintf "EDI $tag/4343 response type: %s - %s (%s)", $bgm->seg4343->value, $bgm->seg4343->label, $bgm->seg4343->desc); - my $fcn = $bgm->seg1225; - unless ($fcn) { - $logger->error(sprintf "EDI $tag/1225 Message Function Code '%s' unrecognized. Aborting", ($segbody->{1225} || '')); - return; - } - } + my $msg = Business::EDI::Message->new($body); + unless ($msg) { + $logger->error("EDI interchange message: $keystring body failed Business::EDI constructor. Skipping it."); + return; } - my @ignored; - foreach my $segment (@$segments) { # The main pass - my ($tag, $segbody, @extra) = @$segment; - next unless ($tag and $segbody); # warnings above - if ($tag eq 'LIN') { - my @chunks = @{$segbody->{SG26}}; - my $count = scalar(@chunks); - $logger->debug("EDI LIN/SG26 has $count chunks"); -# CHUNK: -# ["RFF", { -# "C506": { -# "1153": "LI", -# "1154": "4639/1" -# } -# }] - foreach (@chunks) { - my $label = $_->[0]; - my $body = $_->[1]; - # $label eq 'QTY' and push @qtys, $body; - $label eq 'RFF' or next; - my $obj; - unless ($obj = Business::EDI::Segment::RFF->new($body)) { # assignment, not comparison - $logger->error("EDI $tag/$label failed to convert to an object"); - } - $obj->seg1153 and $obj->seg1153->value eq 'LI' or $logger->warn("EDI $tag/$label object unexpected 1153 value (not 'LI')"); - __PACKAGE__->update_li($obj->seg1154->value, $segbody, $server, $e); - } - push @lins, \@chunks; - } elsif ($tag ne 'UNH' and $tag ne 'BGM') { - push @ignored, $tag; - } + $key = $msg->code if ! $key; # Now we set the key for reference if it wasn't specified + my $val_0065 = $msg->xpath_value('UNH/S009/0065') || ''; + unless ($val_0065 eq $key) { + $logger->error("EDI $key UNH/S009/0065 ('$val_0065') conflicts w/ message type $key. Aborting"); + return; + } + my $val_0051 = $msg->xpath_value('UNH/S009/0051') || ''; + unless ($val_0051 eq 'UN') { + $logger->warn("EDI $key UNH/S009/0051 designates '$val_0051', not 'UN' as controlling agency. Attempting to process anyway"); + } + my $val_0054 = $msg->xpath_value('UNH/S009/0054') || ''; + if ($val_0054) { + $logger->info("EDI $key UNH/S009/0054 uses Spec revision version '$val_0054'"); + # Possible Spec Version limitation + # my $yy = $tag_0054 ? substr($val_0054,0,2) : ''; + # unless ($yy eq '00' or $yy > 94 ...) { + # $logger->warn("EDI $key UNH/S009/0051 Spec revision version '$val_0054' not supported"); + # } + } else { + $logger->warn("EDI $key UNH/S009/0054 does not reference a known Spec revision version"); } - @ignored and $logger->debug("EDI: ignoring " . scalar(@ignored) . " segment(s): " . join(', ', @ignored)); - return @lins; + return $msg; } -=head2 ->update_li($lineitem_id, $lineitem_object, [$server, $editor]) +=head2 ->eg_li($lineitem_object, [$remote, $server_log_string, $editor]) + +my $line_item = OpenILS::Application::Acq::EDI->eg_li($edi_line, $remote, "test_server_01", $e); + + $remote is a acq.edi_account Fieldmapper object. + $server_log_string is an arbitrary string use to identify the remote host in potential log messages. Updates: acq.lineitem.estimated_unit_price, @@ -473,17 +622,49 @@ Updates: =cut -sub update_li { - my ($class, $id, $object, $server, $e) = @_; +sub eg_li { + my ($class, $line, $server, $server_log_string, $e) = @_; + $line or return; $e ||= new_editor(); - $id =~ s#^.*\/##; # Temporary fix for mbklein's testdata - print STDERR "Here we would retrieve/update lineitem $id\n"; - my $li = OpenILS::Application::Acq::Lineitem::retrieve_lineitem_impl($e, $id); # Could send {options} + + my $id; + # my $rff = $line->part('line_reference/RFF') or $logger->warn("EDI ORDRSP line_detail/RFF missing!"); + my $val_1153 = $line->xpath_value('line_reference/RFF/1153') || ''; + my $val_1154 = $line->xpath_value('line_reference/RFF/1154') || ''; + my $val_1082 = $line->xpath_value('LIN/1082') || ''; + + my @po_nums; + + $val_1154 =~ s#^(.*)\/##; # Many sources send the ID as 'order_ID/LI_ID' + $1 and push @po_nums, $1; + $val_1082 =~ s#^(.*)\/##; # Many sources send the ID as 'order_ID/LI_ID' + $1 and push @po_nums, $1; + + # TODO: possible check of po_nums + # now do a lot of checking + + if ($val_1153 eq 'LI') { + $id = $val_1154 or $logger->warn("EDI ORDRSP RFF/1154 reference to LI empty. Attempting failover to LIN/1082"); + } else { + $logger->warn("EDI ORDRSP RFF/1153 unexpected value ('$val_1153', not 'LI'). Attempting failover to LIN/1082"); + } + + if ($id and $val_1082 and $val_1082 ne $id) { + $logger->warn("EDI ORDRSP LIN/1082 Line Item ID mismatch ($id vs. $val_1082): cannot target update"); + return; + } + $id ||= $val_1082 || ''; + print STDERR "EDI retrieve/update lineitem $id\n"; + + my $li = OpenILS::Application::Acq::Lineitem::retrieve_lineitem_impl($e, $id, { + flesh_li_details => 1, + }, 1); # Could send more {options}. The 1 is for no_auth. + if (! $li or ref($li) ne 'Fieldmapper::acq::lineitem') { - $logger->error("EDI failed to retrieve lineitem by id '$id'"); + $logger->error("EDI failed to retrieve lineitem by id '$id' for server $server_log_string"); return; } - unless ((! $server) or (! $server->provider)) { + unless ((! $server) or (! $server->provider)) { # but here we want $server to be acq.edi_account instead of RemoteAccount if ($server->provider != $li->provider) { # links go both ways: acq.provider.edi_default and acq.edi_account.provider $logger->info("EDI acct provider (" . $server->provider. ") doesn't match lineitem provider(" @@ -496,12 +677,135 @@ sub update_li { } } } - return; # TODO: actual updates - $e->xact_begin; - $e->update_acq_lineitem($li) or $logger->warn("EDI: in update_li, update_acq_lineitem FAILED"); - $e->xact_commit; - # print STDERR "Lineitem to update: ", Dumper($li); + + my @lin_1229 = $line->xpath('LIN/1229') or $logger->warn("EDI LIN/1229 Action Code missing!"); + my $key = $lin_1229[0] or return; + + my $eg_reason = $e->retrieve_acq_cancel_reason(1000 + $key->value); # DB populated w/ spec keys in 1000's + $eg_reason or $logger->warn(sprintf "EDI LIN/1229 Action Code '%s' (%s) not recognized in acq.cancel_reason", $key->value, $key->label); + $eg_reason or return; + + $li->cancel_reason($eg_reason->id); + unless ($eg_reason->keep_debits) { + $logger->warn("EDI LIN/1229 Action Code '%s' (%s) has keep_debits=0", $key->value, $key->label); + } + + my @prices = $line->xpath_value("line_price/PRI/5118"); + $li->estimated_unit_price($prices[0]) if @prices; + + return $li; } +# caching not needed for now (edi_fetcher is asynchronous) +# sub get_reason { +# my ($class, $key, $e) = @_; +# $reasons->{$key} and return $reasons->{$key}; +# $e ||= new_editor(); +# $reasons->{$key} = $e->retrieve_acq_cancel_reason($key); +# return $reasons->{$key}; +# } + 1; +__END__ + +Example JSON data. + +Note the pseudo-hash 2-element arrays. + +[ + 'SG26', + [ + [ + 'LIN', + { + '1229' => '5', + '1082' => 1, + 'C212' => { + '7140' => '9780446360272', + '7143' => 'EN' + } + } + ], + [ + 'IMD', + { + '7081' => 'BST', + '7077' => 'F', + 'C273' => { + '7008' => [ + 'NOT APPLIC WEBSTERS NEW WORLD THESA' + ] + } + } + ], + [ + 'QTY', + { + 'C186' => { + '6063' => '21', + '6060' => 10 + } + } + ], + [ + 'QTY', + { + 'C186' => { + '6063' => '12', + '6060' => 10 + } + } + ], + [ + 'QTY', + { + 'C186' => { + '6063' => '85', + '6060' => 0 + } + } + ], + [ + 'FTX', + { + '4451' => 'LIN', + 'C107' => { + '4441' => '01', + '3055' => '28', + '1131' => '8B' + } + } + ], + [ + 'SG30', + [ + [ + 'PRI', + { + 'C509' => { + '5118' => '4.5', + '5387' => 'SRP', + '5125' => 'AAB' + } + } + ] + ] + ], + [ + 'SG31', + [ + [ + 'RFF', + { + 'C506' => { + '1154' => '8/1', + '1153' => 'LI' + } + } + ] + ] + ] + ] +], + diff --git a/Open-ILS/src/perlmods/OpenILS/Application/Acq/Lineitem.pm b/Open-ILS/src/perlmods/OpenILS/Application/Acq/Lineitem.pm index d7300e22ec..5398ba1e88 100644 --- a/Open-ILS/src/perlmods/OpenILS/Application/Acq/Lineitem.pm +++ b/Open-ILS/src/perlmods/OpenILS/Application/Acq/Lineitem.pm @@ -94,7 +94,7 @@ sub retrieve_lineitem { } sub retrieve_lineitem_impl { - my ($e, $li_id, $options) = @_; + my ($e, $li_id, $options, $no_auth) = @_; # no_auth needed for EDI scripts $options ||= {}; my $flesh = { @@ -108,16 +108,16 @@ sub retrieve_lineitem_impl { my $fields = $flesh->{flesh_fields}; - push(@{$fields->{jub}}, 'attributes') if $$options{flesh_attrs}; - push(@{$fields->{jub}}, 'lineitem_notes') if $$options{flesh_notes}; - push(@{$fields->{acqlin}}, 'alert_text') if $$options{flesh_notes}; - push(@{$fields->{jub}}, 'order_summary') if $$options{flesh_order_summary}; + push(@{$fields->{jub} }, 'attributes') if $$options{flesh_attrs}; + push(@{$fields->{jub} },'lineitem_notes') if $$options{flesh_notes}; + push(@{$fields->{acqlin}}, 'alert_text') if $$options{flesh_notes}; + push(@{$fields->{jub} }, 'order_summary') if $$options{flesh_order_summary}; push(@{$fields->{acqlin}}, 'cancel_reason') if $$options{flesh_cancel_reason}; if($$options{flesh_li_details}) { - push(@{$fields->{jub}}, 'lineitem_details'); - push(@{$fields->{acqlid}}, 'fund') if $$options{flesh_fund}; - push(@{$fields->{acqlid}}, 'fund_debit') if $$options{flesh_fund_debit}; + push(@{$fields->{jub} }, 'lineitem_details'); + push(@{$fields->{acqlid}}, 'fund' ) if $$options{flesh_fund}; + push(@{$fields->{acqlid}}, 'fund_debit' ) if $$options{flesh_fund_debit}; push(@{$fields->{acqlid}}, 'cancel_reason') if $$options{flesh_cancel_reason}; } @@ -151,12 +151,12 @@ sub retrieve_lineitem_impl { return $e->event unless ( $li->purchase_order and - $e->allowed(['VIEW_PURCHASE_ORDER', 'CREATE_PURCHASE_ORDER'], - $li->purchase_order->ordering_agency, $li->purchase_order) + ($no_auth or $e->allowed(['VIEW_PURCHASE_ORDER', 'CREATE_PURCHASE_ORDER'], + $li->purchase_order->ordering_agency, $li->purchase_order)) ) or ( $li->picklist and !$li->purchase_order and # user doesn't have view_po perms - $e->allowed(['VIEW_PICKLIST', 'CREATE_PICKLIST'], - $li->picklist->org_unit, $li->picklist) + ($no_auth or $e->allowed(['VIEW_PICKLIST', 'CREATE_PICKLIST'], + $li->picklist->org_unit, $li->picklist)) ); unless ($$options{flesh_po}) { diff --git a/Open-ILS/src/perlmods/OpenILS/Application/Acq/Order.pm b/Open-ILS/src/perlmods/OpenILS/Application/Acq/Order.pm index a99ac82828..2318e2247e 100644 --- a/Open-ILS/src/perlmods/OpenILS/Application/Acq/Order.pm +++ b/Open-ILS/src/perlmods/OpenILS/Application/Acq/Order.pm @@ -1160,9 +1160,9 @@ sub zsearch_build_pl { # ---------------------------------------------------------------------------- __PACKAGE__->register_method( - method => 'upload_records', + method => 'upload_records', api_name => 'open-ils.acq.process_upload_records', - stream => 1, + stream => 1, ); sub upload_records { @@ -1175,14 +1175,14 @@ sub upload_records { my $cache = OpenSRF::Utils::Cache->new; my $data = $cache->get_cache("vandelay_import_spool_$key"); - my $purpose = $data->{purpose}; - my $filename = $data->{path}; - my $provider = $data->{provider}; - my $picklist = $data->{picklist}; - my $create_po = $data->{create_po}; - my $activate_po = $data->{activate_po}; + my $purpose = $data->{purpose}; + my $filename = $data->{path}; + my $provider = $data->{provider}; + my $picklist = $data->{picklist}; + my $create_po = $data->{create_po}; + my $activate_po = $data->{activate_po}; my $ordering_agency = $data->{ordering_agency}; - my $create_assets = $data->{create_assets}; + my $create_assets = $data->{create_assets}; my $po; my $evt; @@ -1214,8 +1214,7 @@ sub upload_records { $logger->info("acq processing MARC file=$filename"); - my $marctype = 'USMARC'; # ? - my $batch = new MARC::Batch ($marctype, $filename); + my $batch = new MARC::Batch ('USMARC', $filename); $batch->strict_off; my $count = 0; @@ -1223,10 +1222,8 @@ sub upload_records { while(1) { - my $err; - my $xml; + my ($err, $xml, $r); $count++; - my $r; try { $r = $batch->next; @@ -1283,7 +1280,7 @@ sub upload_records { unlink($filename); $cache->delete_cache('vandelay_import_spool_' . $key); - if($create_assets) { + if ($create_assets) { create_lineitem_list_assets($mgr, \@li_list) or return $e->die_event; } @@ -1315,14 +1312,15 @@ sub import_lineitem_details { last unless $$compiled{quantity}; for(1..$$compiled{quantity}) { - my $lid = create_lineitem_detail($mgr, - lineitem => $li->id, - owning_lib => $$compiled{owning_lib}, - cn_label => $$compiled{call_number}, - fund => $$compiled{fund}, - circ_modifier => $$compiled{circ_modifier}, - note => $$compiled{note}, - location => $$compiled{copy_location}, + my $lid = create_lineitem_detail( + $mgr, + lineitem => $li->id, + owning_lib => $$compiled{owning_lib}, + cn_label => $$compiled{call_number}, + fund => $$compiled{fund}, + circ_modifier => $$compiled{circ_modifier}, + note => $$compiled{note}, + location => $$compiled{copy_location}, collection_code => $$compiled{collection_code} ) or return 0; } @@ -1483,10 +1481,10 @@ sub create_po_assets { __PACKAGE__->register_method( - method => 'create_purchase_order_api', - api_name => 'open-ils.acq.purchase_order.create', - signature => { - desc => 'Creates a new purchase order', + method => 'create_purchase_order_api', + api_name => 'open-ils.acq.purchase_order.create', + signature => { + desc => 'Creates a new purchase order', params => [ {desc => 'Authentication token', type => 'string'}, {desc => 'purchase_order to create', type => 'object'} @@ -1506,10 +1504,10 @@ sub create_purchase_order_api { # create the PO my %pargs = (ordering_agency => $e->requestor->ws_ou); # default - $pargs{provider} = $po->provider if $po->provider; - $pargs{ordering_agency} = $po->ordering_agency if $po->ordering_agency; - $pargs{prepayment_required} = $po->prepayment_required - if $po->prepayment_required; + $pargs{provider} = $po->provider if $po->provider; + $pargs{ordering_agency} = $po->ordering_agency if $po->ordering_agency; + $pargs{prepayment_required} = $po->prepayment_required if $po->prepayment_required; + $po = create_purchase_order($mgr, %pargs) or return $e->die_event; my $li_ids = $$args{lineitems}; @@ -1544,14 +1542,11 @@ sub create_purchase_order_api { __PACKAGE__->register_method( - method => 'update_lineitem_fund_batch', - api_name => 'open-ils.acq.lineitem.fund.update.batch', - stream => 1, + method => 'update_lineitem_fund_batch', + api_name => 'open-ils.acq.lineitem.fund.update.batch', + stream => 1, signature => { - desc => q/ - Given a set of lineitem IDS, updates the fund for all attached - lineitem details - / + desc => q/Given a set of lineitem IDS, updates the fund for all attached lineitem details/ } ); @@ -1834,8 +1829,8 @@ sub receive_lineitem_api { __PACKAGE__->register_method( - method => 'rollback_receive_po_api', - api_name => 'open-ils.acq.purchase_order.receive.rollback' + method => 'rollback_receive_po_api', + api_name => 'open-ils.acq.purchase_order.receive.rollback' ); sub rollback_receive_po_api { @@ -1863,10 +1858,10 @@ sub rollback_receive_po_api { __PACKAGE__->register_method( - method => 'rollback_receive_lineitem_detail_api', - api_name => 'open-ils.acq.lineitem_detail.receive.rollback', - signature => { - desc => 'Mark a lineitem_detail as Un-received', + method => 'rollback_receive_lineitem_detail_api', + api_name => 'open-ils.acq.lineitem_detail.receive.rollback', + signature => { + desc => 'Mark a lineitem_detail as Un-received', params => [ {desc => 'Authentication token', type => 'string'}, {desc => 'lineitem detail ID', type => 'number'} diff --git a/Open-ILS/src/perlmods/OpenILS/Application/Trigger/Validator/Acq/PurchaseOrderEDIRequired.pm b/Open-ILS/src/perlmods/OpenILS/Application/Trigger/Validator/Acq/PurchaseOrderEDIRequired.pm index 28c9ffc3ed..211d75fee0 100644 --- a/Open-ILS/src/perlmods/OpenILS/Application/Trigger/Validator/Acq/PurchaseOrderEDIRequired.pm +++ b/Open-ILS/src/perlmods/OpenILS/Application/Trigger/Validator/Acq/PurchaseOrderEDIRequired.pm @@ -16,8 +16,10 @@ sub handler { new_editor->retrieve_acq_provider($po->provider); return 1 if - $po->state eq 'on-order' and - $provider->edi_default and + ($po->state eq 'on-order' or + $po->state eq 'retry' ) and + $provider and + $provider->edi_default and $U->is_true($provider->active); return 0; diff --git a/Open-ILS/src/perlmods/OpenILS/Utils/Cronscript.pm b/Open-ILS/src/perlmods/OpenILS/Utils/Cronscript.pm index 4697ec7f9f..ab2152b39b 100644 --- a/Open-ILS/src/perlmods/OpenILS/Utils/Cronscript.pm +++ b/Open-ILS/src/perlmods/OpenILS/Utils/Cronscript.pm @@ -55,7 +55,7 @@ sub _default_self { 'debug' => 0, 'verbose+' => 0, 'help' => 0, - 'internal_var' => 'XYZ', + # 'internal_var' => 'XYZ', }, # lockfile => undef, # session => undef, diff --git a/Open-ILS/src/perlmods/OpenILS/Utils/RemoteAccount.pm b/Open-ILS/src/perlmods/OpenILS/Utils/RemoteAccount.pm index 971c8ca9ab..ca1c9001a5 100644 --- a/Open-ILS/src/perlmods/OpenILS/Utils/RemoteAccount.pm +++ b/Open-ILS/src/perlmods/OpenILS/Utils/RemoteAccount.pm @@ -24,7 +24,7 @@ our $AUTOLOAD; our %keyfiles = (); my %fields = ( - accound_object => undef, + account_object => undef, remote_host => undef, remote_user => undef, remote_password => undef, @@ -327,13 +327,14 @@ sub ls { # Checks if the filename part of a pathname has one or more glob characters # We split out the filename portion of the path # Detect glob or no glob. -# return: regex for matching filenames +# returns: directory, regex for matching filenames sub glob_parse { my $self = shift; my $path = shift or return; my ($vol, $dir, $file) = File::Spec->splitpath($path); # we don't care about attempted globs in mid-filepath - $file =~ /\*/ and return (File::Spec->catdir($vol, $dir), glob_to_regex($file)); - $file =~ /\?/ and return (File::Spec->catdir($vol, $dir), glob_to_regex($file)); + my $front = $vol ? File::Spec->catdir($vol, $dir) : $dir; + $file =~ /\*/ and return ($front, glob_to_regex($file)); + $file =~ /\?/ and return ($front, glob_to_regex($file)); $logger->debug("No glob detected in '$path'"); return; } @@ -481,18 +482,20 @@ sub ls_ssh2_full { if ($regex) { my $count = scalar(@pool); @pool = grep {$_->{name} =~ /$regex/} @pool; - $logger->info("Glob regex($regex) matches " . scalar(@pool) . " of $count files"); - } + $logger->info("SSH ls: Glob regex($regex) matches " . scalar(@pool) . " of $count files"); + } # else { $logger->info("SSH ls: No Glob regex in '$target'. Just a regular ls"); } push @list, @pool; } return @list; } -sub _slash_path { # not OO +sub _slash_path { my $self = shift; my $dir = shift || '.'; my $file = shift || ''; + my ($dirpath, $regex) = $self->glob_parse($dir); + $dir = $dirpath if $dirpath; return $dir . ($dir =~ /\/$/ ? '' : '/') . $file; } @@ -552,23 +555,37 @@ sub get_uftp { return $self->local_file; } -sub ls_uftp { +sub ls_uftp { # returns full path like: dir/path/file.ext my $self = shift; my $ftp = $self->_uftp or return; my @list; foreach (@_) { my @part; my ($dirpath, $regex) = $self->glob_parse($_); - eval { @part = $ftp->ls($dirpath || $_) }; + my $dirtarget = $dirpath || $_; + $dirtarget =~ s/\/+$//; + eval { @part = $ftp->ls($dirtarget) }; # this ls returns relative/path/filenames. defer filename glob filtering for below. if ($@) { $logger->error($self->_error("ls from", $self->remote_host, "failed with error: $@")); next; } + if ($dirtarget and $dirtarget ne '.' and $dirtarget ne './' and $ftp->is_dir($dirtarget)) { + foreach my $file (@part) { # we ensure full(er) path + $file =~ /^$dirtarget\// and next; + $logger->debug("ls_uftp: prepending $dirtarget/ to $file"); + $file = File::Spec->catdir($dirtarget, $file); + } + } if ($regex) { my $count = scalar(@part); - @part = grep {/$regex/} @part; - $logger->info("Glob regex($regex) matches " . scalar(@part) . " of $count files"); - } + # @part = grep {my @a = split('/',$_); scalar(@a) ? /$regex/ : ($a[-1] =~ /$regex/)} @part; + my @bulk = @part; + @part = grep { + my ($vol, $dir, $file) = File::Spec->splitpath($_); + $file =~ /$regex/ + } @part; + $logger->info("FTP ls: Glob regex($regex) matches " . scalar(@part) . " of $count files"); + } # else {$logger->info("FTP ls: No Glob regex in '$_'. Just a regular ls");} push @list, @part; } return @list; @@ -641,7 +658,7 @@ sub AUTOLOAD { $name =~ s/.*://; # strip leading package stuff unless (exists $self->{_permitted}->{$name}) { - croak "Cannot access '$name' field of class '$class'"; + croak "AUTOLOAD error: Cannot access '$name' field of class '$class'"; } if (@_) { diff --git a/Open-ILS/src/support-scripts/edi_fetcher.pl b/Open-ILS/src/support-scripts/edi_fetcher.pl index 25a37326c8..3339f4e272 100755 --- a/Open-ILS/src/support-scripts/edi_fetcher.pl +++ b/Open-ILS/src/support-scripts/edi_fetcher.pl @@ -21,44 +21,164 @@ use Data::Dumper; use vars qw/$debug/; use OpenILS::Application::Acq::EDI; -use OpenILS::Utils::CStoreEditor; # needs init() after IDL is loaded (by Cronscript session) use OpenILS::Utils::Cronscript; +use File::Spec; -INIT { - $debug = 1; -} +my $defaults = { + "account=i" => 0, + "provider=i" => 0, + "inactive" => 0, + "test" => 0, +}; + +my $core = OpenILS::Utils::Cronscript->new($defaults); +my $opts = $core->MyGetOptions() or die "Getting options failed!"; +my $e = $core->editor(); +my $debug = $opts->{debug}; -OpenILS::Utils::Cronscript->new()->session('open-ils.acq') or die "No session created"; -OpenILS::Utils::CStoreEditor::init(); +if ($debug) { + print join "\n", "OPTIONS:", map {sprintf "%16s: %s", $_, $opts->{$_}} sort keys %$opts; + print "\n\n"; +} -sub editor { - my $ed = OpenILS::Utils::CStoreEditor->new(@_) or die "Failed to get new CStoreEditor"; - return $ed; +sub main_search { + my $select = {'+acqpro' => {active => {"in"=>['t','f']}} }; # either way + my %args = @_ ? @_ : (); + foreach (keys %args) { + $select->{$_} = $args{$_}; + } + return $e->search_acq_edi_account([ + $select, + { + 'join' => 'acqpro', + flesh => 1, + flesh_fields => {acqedi => ['provider']}, + } + ]); } +my $set = main_search() or die "No EDI accounts found in database (table: acq.edi_account)"; -my $e = editor(); -my $set = $e->retrieve_all_acq_edi_account(); my $total_accts = scalar(@$set); ($total_accts) or die "No EDI accounts found in database (table: acq.edi_account)"; -print "EDI Accounts Total : ", scalar(@$set), "\n"; +print "EDI Accounts Total : $total_accts\n"; +my $active = [ grep {$_->provider->active eq 't'} @$set ]; +print "EDI Accounts Active: ", scalar(@$active), "\n"; -my $subset = $e->search_acq_edi_account([ - {'+acqpro' => {active => 't'}}, - { - 'join' => 'acqpro', - flesh => 1, - flesh_fields => {acqedi => ['provider']}, +my $subset; +if ($opts->{inactive} or $opts->{provider} or $opts->{account}) { + print "Including inactive accounts\n"; + $subset = [@$set]; +} else { + $subset = $active; +} + +my ($acct, $pro); +if ($opts->{provider}) { + print "Limiting by provider: " . $opts->{provider} . "\n"; + $pro = $e->retrieve_acq_provider($opts->{provider}) or die "provider '" . $opts->{provider} . "' not found"; + printf "Provider %s found (edi_default %s)\n", $pro->id, $pro->edi_default; + $subset = main_search( 'id' => $pro->edi_default ); + # $subset = [ grep {$_->provider->id == $opts->{provider}} @$subset ]; + foreach (@$subset) { + $_->provider($pro); # force provider match (short of LEFT JOINing the main_search query and dealing w/ multiple combos) } -]); + scalar(@$subset) or die "provider '" . $opts->{provider} . "' edi_default invalid (failed to match acq.edi_account.id)"; + if ($opts->{account} and $opts->{account} != $pro->edi_default) { + die sprintf "ERROR: --provider=%s and --account=%s specify rows that exist, but are not paired by acq.provider.edi_default", $opts->{provider}, $opts->{account}; + } + $acct = $subset->[0]; +} +if ($opts->{account}) { + print "Limiting by account: " . $opts->{account} . "\n"; + $subset = [ grep {$opts->{account} == $_->id} @$subset ]; + scalar(@$subset) or die "No acq.provider.edi_default matches option --account=" . $opts->{account} . " "; + scalar(@$subset) > 1 and warn "account '" . $opts->{account} . "' has multiple matches. Ignoring all but the first."; + $acct = $subset->[0]; +} +scalar(@$subset) or die "No acq.provider rows match options " . + ($opts->{account} ? ("--account=" . $opts->{account} ) : '') . + ($opts->{provider} ? ("--provider=" . $opts->{provider}) : '') ; -print "EDI Accounts Active: ", scalar(@$subset), "\n"; +print "Limiting to " . scalar(@$subset) . " account(s)\n"; +foreach (@$subset) { + printf "Provider %s - %s, edi_account %s - %s: %s%s\n", + $_->provider->id, $_->provider->name, $_->id, $_->label, $_->host, ($_->in_dir ? ('/' . $_->in_dir) : '') ; +} + +if (@ARGV) { + $opts->{provider} or $opts->{account} + or die "ERROR: --account=[ID] or --provider=[ID] option required for local data ingest, with valid edi_account or provider id"; + print "READING FROM ", scalar(@ARGV), " LOCAL SOURCE(s) ONLY. NO REMOTE SERVER(s) WILL BE USED\n"; + printf "File will be attributed to edi_account %s - %s: %s\n", $acct->id, $acct->label, $acct->host; + my @files = @ARGV; # copy original @ARGV + foreach (@files) { + @ARGV = ($_); # We'll use the diamond op, so we can pull from STDIN too + my $content = join '', <> or next; + $opts->{test} and next; + my $in = OpenILS::Application::Acq::EDI->process_retrieval( + $content, + "localhost:" . File::Spec->rel2abs($_), + OpenILS::Application::Acq::EDI->remote_account($acct), + $acct, + $e + ); + } + exit; +} +# else no args -my $res = OpenILS::Application::Acq::EDI->retrieve_core(); +my $res = OpenILS::Application::Acq::EDI->retrieve_core($subset,undef,undef,$opts->{test}); print "Files retrieved: ", scalar(@$res), "\n"; $debug and print "retrieve_core returns ", scalar(@$res), " ids: " . join(', ', @$res), "\n"; -$debug and print Dumper($set); +# $Data::Dumper::Indent = 1; +$debug and print map {Dumper($_) . "\n"} @$subset; print "\ndone\n"; + +__END__ + +=pod + +=head1 NAME + +edi_fetcher.pl - A script for retrieving and processing EDI files from remote accounts. + +=head1 DESCRIPTION + +This script is expected to be run via crontab, for the purpose of retrieving vendor EDI files. + +Note: Depending on your vendors' and your own network environments, you may want to set/export +the environmental variable FTP_PASSIVE like: + + export FTP_PASSIVE=1 + # or + FTP_PASSIVE=1 Open-ILS/src/support-scripts/edi_fetcher.pl + +=head1 OPTIONS + + --account=[id] Target one account, whether or not it is inactive. + --inactive Includes inactive provider accounts (default OFF, forced ON if --account specified) + +=head1 ARGUMENTS + +edi_fetcher can also read from files specified as arguments on the command line, or from STDIN, or both. +In such cases, the filename is not used to check whether the file has been loaded or not. + +=head1 TODO + +More docs here. + +=head1 SEE ALSO + + OpenILS::Utils::Cronscript + edi_pusher.pl + +=head1 AUTHOR + +Joe Atzberger + +=cut + diff --git a/Open-ILS/src/support-scripts/edi_pusher.pl b/Open-ILS/src/support-scripts/edi_pusher.pl index 241ac562b6..4d1338b1dd 100755 --- a/Open-ILS/src/support-scripts/edi_pusher.pl +++ b/Open-ILS/src/support-scripts/edi_pusher.pl @@ -112,7 +112,7 @@ foreach my $def (@$defs) { $remaining -= scalar(@$events); - print "Event definition ", $def->id, " has ", scalar(@$events), " event(s)\n"; + print "Event definition ", $def->id, " has ", scalar(@$events), " (completed) event(s)\n"; foreach (@$events) { my $event = $e->retrieve_action_trigger_event([ diff --git a/Open-ILS/src/support-scripts/test-scripts/edi_object.pl b/Open-ILS/src/support-scripts/test-scripts/edi_object.pl deleted file mode 100755 index 5c4fd91eb7..0000000000 --- a/Open-ILS/src/support-scripts/test-scripts/edi_object.pl +++ /dev/null @@ -1,2985 +0,0 @@ -#!/usr/bin/perl -# - -use strict; use warnings; - -use Data::Dumper; - -use OpenILS::Application::Acq::EDI; -use OpenILS::Utils::Cronscript; -use Business::EDI::Object; -use Business::EDI::Segment::RFF; -use vars qw/%code_hash/; - -require Business::EDI::DataElement; - -my $core = OpenILS::Utils::Cronscript->new(); -my $editor = $core->editor; - -my $slurp = join '', ; - -my ($aref, $whole) = OpenILS::Application::Acq::EDI->process_jedi($slurp); - -$Data::Dumper::Indent = 1; -my $i = 0; -foreach (@$aref) { - print "Building object from chunk ", ++$i, "\n"; - my $obj = Business::EDI::Object->new($_); - print Dumper($obj); -} - -print "\ndone\n"; - -__DATA__ -{ -"trailer": ["UNZ", { - "0020": "2045", - "0036": 1 -}], -"body": [{ - "ORDRSP": [["UNH", { - "S009": { - "0052": "D", - "0054": "96A", - "0065": "ORDRSP", - "0051": "UN" - }, - "0062": "723" - }], ["BGM", { - "4343": "AC", - "1225": "29", - "C002": { - "1001": "231" - }, - "1004": "582822" - }], ["DTM", { - "C507": { - "2379": "102", - "2380": "20070618", - "2005": "137" - } - }], ["RFF", { - "C506": { - "1153": "ON", - "1154": "E07158FIC" - } - }], ["NAD", { - "C082": { - "3039": "8888888", - "3055": "31B" - }, - "3035": "BY" - }], ["NAD", { - "C082": { - "3039": "1556150", - "3055": "31B" - }, - "3035": "SU" - }], ["NAD", { - "C082": { - "3039": "8888888", - "3055": "91" - }, - "3035": "BY" - }], ["CUX", { - "C504": [{ - "6345": "USD", - "6347": "2", - "6343": "9" - }] - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["LACY, AL THINGS NOT SEEN"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 10.99 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4639/1" - } - }]], - "C212": { - "7140": "9781576734131", - "7143": "EN" - }, - "1082": 1, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["LACY, AL FINAL JUSTICE"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 1, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 1, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 14.99 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4639/2" - } - }]], - "C212": { - "7140": "9781590529966", - "7143": "EN" - }, - "1082": 2, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["MALAMUD, B NATURAL"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 5, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 5, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 14 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4639/3" - } - }]], - "C212": { - "7140": "9780374502003", - "7143": "EN" - }, - "1082": 3, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["SCOTT, PAU RAJ QUARTET THE JEWEL IN"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 2, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 2, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 32.5 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4639/4" - } - }]], - "C212": { - "7140": "9780307263964", - "7143": "EN" - }, - "1082": 4, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["JAMES, P. SHROUD FOR A NIGHTINGALE"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 14 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4639/6" - } - }]], - "C212": { - "7140": "9780743219600", - "7143": "EN" - }, - "1082": 5, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["LAHAYE, TI TRIBULATION FORCE THE CO"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 3, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 3, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 14.99 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4639/7" - } - }]], - "C212": { - "7140": "9780842329217", - "7143": "EN" - }, - "1082": 6, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["ZANE AFTERBURN A NOVEL"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 15 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4639/8" - } - }]], - "C212": { - "7140": "9780743470988", - "7143": "EN" - }, - "1082": 7, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["CABOT, MEG BOY NEXT DOOR"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 13.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4639/9" - } - }]], - "C212": { - "7140": "9780060096199", - "7143": "EN" - }, - "1082": 8, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["VONNEGUT, BREAKFAST OF CHAMPIONS"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 5, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 5, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 14 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4639/10" - } - }]], - "C212": { - "7140": "9780385334204", - "7143": "EN" - }, - "1082": 9, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["DOSTOYEVSK BROTHERS KARAMAZOV"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 3, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 3, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 9.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4639/11" - } - }]], - "C212": { - "7140": "9781593083526", - "7143": "EN" - }, - "1082": 10, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["KINGSBURY, FORGIVEN"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 6, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 6, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 13.99 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4639/12" - } - }]], - "C212": { - "7140": "9780842387446", - "7143": "EN" - }, - "1082": 11, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["BERLINSKI, FIELDWORK"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 3, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 3, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 24 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4639/13" - } - }]], - "C212": { - "7140": "9780374299163", - "7143": "EN" - }, - "1082": 12, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["GREGORY, P MERIDON A NOVEL"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 16 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4639/14" - } - }]], - "C212": { - "7140": "9780743249317", - "7143": "EN" - }, - "1082": 13, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["MCCALL SMI MORALITY FOR BEAUTIFUL G"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 5, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 5, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 12.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4639/15" - } - }]], - "C212": { - "7140": "9781400031368", - "7143": "EN" - }, - "1082": 14, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["CLEAGE, PE WHAT LOOKS LIKE CRAZY ON"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 3, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 3, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 13.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4639/16" - } - }]], - "C212": { - "7140": "9780380794874", - "7143": "EN" - }, - "1082": 15, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["GREGORY, P WIDEACRE"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 16 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4639/17" - } - }]], - "C212": { - "7140": "9780743249294", - "7143": "EN" - }, - "1082": 16, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["FERBER, ED SO BIG"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 3, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 3, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "07", - "3055": "28", - "1131": "7B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 13 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4639/18" - } - }]], - "C212": { - "7140": "9780060956691", - "7143": "EN" - }, - "1082": 17, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["GREGORY, P OTHER BOLEYN GIRL"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 16 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4639/19" - } - }]], - "C212": { - "7140": "9780743227445", - "7143": "EN" - }, - "1082": 18, - "1229": "5" - }], ["UNS", { - "0081": "S" - }], ["CNT", { - "C270": { - "6069": "2", - "6066": 18 - } - }], ["UNT", { - "0074": 155, - "0062": "723" - }]] -}, -{ - "ORDRSP": [["UNH", { - "S009": { - "0052": "D", - "0054": "96A", - "0065": "ORDRSP", - "0051": "UN" - }, - "0062": "724" - }], ["BGM", { - "4343": "AC", - "1225": "29", - "C002": { - "1001": "231" - }, - "1004": "582828" - }], ["DTM", { - "C507": { - "2379": "102", - "2380": "20070618", - "2005": "137" - } - }], ["RFF", { - "C506": { - "1153": "ON", - "1154": "E07159ANF" - } - }], ["NAD", { - "C082": { - "3039": "8888888", - "3055": "31B" - }, - "3035": "BY" - }], ["NAD", { - "C082": { - "3039": "1556150", - "3055": "31B" - }, - "3035": "SU" - }], ["NAD", { - "C082": { - "3039": "8888888", - "3055": "91" - }, - "3035": "BY" - }], ["CUX", { - "C504": [{ - "6345": "USD", - "6347": "2", - "6343": "9" - }] - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["HOLM, BILL WINDOWS OF BRIMNES"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 3, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 3, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 22 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4640/1" - } - }]], - "C212": { - "7140": "9781571313027", - "7143": "EN" - }, - "1082": 1, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["REPA, BARB YOUR RIGHTS IN THE WORKP"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 29.99 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4640/2" - } - }]], - "C212": { - "7140": "9781413306439", - "7143": "EN" - }, - "1082": 2, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["GUERIN, LI ESSENTIAL GUIDE TO WORKP"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 2, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 2, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 39.99 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4640/3" - } - }]], - "C212": { - "7140": "9781413306910", - "7143": "EN" - }, - "1082": 3, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["CLIFFORD, ESTATE PLANNING BASICS"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 5, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 5, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 21.99 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4640/4" - } - }]], - "C212": { - "7140": "9781413307023", - "7143": "EN" - }, - "1082": 4, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["FRIEDMAN, BABY CARE BOOK"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 8, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 8, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 29.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4640/5" - } - }]], - "C212": { - "7140": "9780778801603", - "7143": "EN" - }, - "1082": 5, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["KING, RUSS ATLAS OF HUMAN MIGRATION"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 3, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 3, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 40 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4640/6" - } - }]], - "C212": { - "7140": "9781554072873", - "7143": "EN" - }, - "1082": 6, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["ASH, RUSSE FIREFLYS WORLD OF FACTS"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 6, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 6, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 29.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4640/7" - } - }]], - "C212": { - "7140": "9781554073139", - "7143": "EN" - }, - "1082": 7, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["WARNER, RA 101 LAW FORMS FOR PERSON"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 6, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 6, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 29.99 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4640/8" - } - }]], - "C212": { - "7140": "9781413307122", - "7143": "EN" - }, - "1082": 8, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["BRAY, ILON NOLOS ESSENTIAL GUIDE TO"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 10, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 10, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 24.99 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4640/9" - } - }]], - "C212": { - "7140": "9781413306286", - "7143": "EN" - }, - "1082": 9, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["WESTWOOD, HOW TO WRITE A MARKETING"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 3, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 1, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 2, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "99", - "3055": "28", - "1131": "7B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 17.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4640/10" - } - }]], - "C212": { - "7140": "9780749445546", - "7143": "EN" - }, - "1082": 10, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["ROANE, SUS HOW TO WORK A ROOM YOUR "] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 8, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 8, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 14.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4640/11" - } - }]], - "C212": { - "7140": "9780061238673", - "7143": "EN" - }, - "1082": 11, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["GERMAIN, D REACHING PAST THE WIRE A"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 24.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4640/12" - } - }]], - "C212": { - "7140": "9780873516068", - "7143": "EN" - }, - "1082": 12, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["KLING, KEV DOG SAYS HOW"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 3, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 3, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 22.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4640/13" - } - }]], - "C212": { - "7140": "9780873515993", - "7143": "EN" - }, - "1082": 13, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["SHORT, SUS BUNDT CAKE BLISS DELICIO"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 5, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 5, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 16.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4640/14" - } - }]], - "C212": { - "7140": "9780873515856", - "7143": "EN" - }, - "1082": 14, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["BRADY, TIM GOPHER GOLD LEGENDARY FI"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 2, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 2, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 24.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4640/15" - } - }]], - "C212": { - "7140": "9780873516013", - "7143": "EN" - }, - "1082": 15, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["ROBERTS, K MINNESOTA 150 THE PEOPLE"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 8, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 8, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 19.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4640/16" - } - }]], - "C212": { - "7140": "9780873515948", - "7143": "EN" - }, - "1082": 16, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["MAK, GEERT IN EUROPE A JOURNEY THRO"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 2, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 2, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 35 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4640/17" - } - }]], - "C212": { - "7140": "9780375424953", - "7143": "EN" - }, - "1082": 17, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["DONAHUE, P PARENTING WITHOUT FEAR O"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 5, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 5, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 14.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4640/18" - } - }]], - "C212": { - "7140": "9780312358914", - "7143": "EN" - }, - "1082": 18, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["MURRAY, LI BABYCENTERS ESSENTIAL GU"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 8, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 8, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 15.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4640/19" - } - }]], - "C212": { - "7140": "9781594864117", - "7143": "EN" - }, - "1082": 19, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["LAPINE, MI SNEAKY CHEF SIMPLE STRAT"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 6, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 6, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 17.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4640/20" - } - }]], - "C212": { - "7140": "9780762430758", - "7143": "EN" - }, - "1082": 20, - "1229": "5" - }], ["UNS", { - "0081": "S" - }], ["CNT", { - "C270": { - "6069": "2", - "6066": 20 - } - }], ["UNT", { - "0074": 171, - "0062": "724" - }]] -}, -{ - "ORDRSP": [["UNH", { - "S009": { - "0052": "D", - "0054": "96A", - "0065": "ORDRSP", - "0051": "UN" - }, - "0062": "725" - }], ["BGM", { - "4343": "AC", - "1225": "29", - "C002": { - "1001": "231" - }, - "1004": "582830" - }], ["DTM", { - "C507": { - "2379": "102", - "2380": "20070618", - "2005": "137" - } - }], ["RFF", { - "C506": { - "1153": "ON", - "1154": "E07160FIC" - } - }], ["NAD", { - "C082": { - "3039": "8888888", - "3055": "31B" - }, - "3035": "BY" - }], ["NAD", { - "C082": { - "3039": "1556150", - "3055": "31B" - }, - "3035": "SU" - }], ["NAD", { - "C082": { - "3039": "8888888", - "3055": "91" - }, - "3035": "BY" - }], ["CUX", { - "C504": [{ - "6345": "USD", - "6347": "2", - "6343": "9" - }] - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["SHAW, REBE COUNTRY LOVERS"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 5, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 5, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 12.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4641/1" - } - }]], - "C212": { - "7140": "9781400098224", - "7143": "EN" - }, - "1082": 1, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["BLAKE, TON TEMPT ME TONIGHT"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "07", - "3055": "28", - "1131": "7B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 13.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4641/2" - } - }]], - "C212": { - "7140": "9780061136092", - "7143": "EN" - }, - "1082": 2, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["MONING, KA BLOODFEVER"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 6, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 6, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 22 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4641/3" - } - }]], - "C212": { - "7140": "9780385339162", - "7143": "EN" - }, - "1082": 3, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["MCKENNA, S EDGE OF MIDNIGHT"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 8, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 8, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 14 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4641/4" - } - }]], - "C212": { - "7140": "9780758211859", - "7143": "EN" - }, - "1082": 4, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["BALZO, SAN GROUNDS FOR MURDER"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 8, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 8, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 27.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4641/5" - } - }]], - "C212": { - "7140": "9780727865496", - "7143": "EN" - }, - "1082": 5, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["PALMER, DI HARD TO HANDLE"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 8, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 8, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 13.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4641/6" - } - }]], - "C212": { - "7140": "9780373772612", - "7143": "EN" - }, - "1082": 6, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["JONES, LLO MR PIP"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 3, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 3, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 20 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4641/7" - } - }]], - "C212": { - "7140": "9780385341066", - "7143": "EN" - }, - "1082": 7, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["JILES, PAU STORMY WEATHER"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 8, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 8, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 24.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4641/8" - } - }]], - "C212": { - "7140": "9780060537326", - "7143": "EN" - }, - "1082": 8, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["DELILLO, D FALLING MAN A NOVEL"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 26 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4641/9" - } - }]], - "C212": { - "7140": "9781416546023", - "7143": "EN" - }, - "1082": 9, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["MORRISON, SWEETER THAN HONEY"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 3, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 3, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 24 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4641/10" - } - }]], - "C212": { - "7140": "9780758215116", - "7143": "EN" - }, - "1082": 10, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["SMITH, SHE FOX"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 2, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 2, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 25.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4641/11" - } - }]], - "C212": { - "7140": "9780756404215", - "7143": "EN" - }, - "1082": 11, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["GROSSMAN, SOON I WILL BE INVINCIBL"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 2, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 2, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 22.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4641/12" - } - }]], - "C212": { - "7140": "9780375424861", - "7143": "EN" - }, - "1082": 12, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["LEWYCKA, M SHORT HISTORY OF TRACTOR"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 3, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 3, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 14 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4641/13" - } - }]], - "C212": { - "7140": "9780143036746", - "7143": "EN" - }, - "1082": 13, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["BANNISTER, FLAWED"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 24.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4641/14" - } - }]], - "C212": { - "7140": "9780312375669", - "7143": "EN" - }, - "1082": 14, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["ALEXANDER, REMEMBERED"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 8, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 8, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 13.99 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4641/15" - } - }]], - "C212": { - "7140": "9780764201103", - "7143": "EN" - }, - "1082": 15, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["TANIGUCHI, OCEAN IN THE CLOSET"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 2, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 2, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 14.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4641/16" - } - }]], - "C212": { - "7140": "9781566891943", - "7143": "EN" - }, - "1082": 16, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["HENKE, ROX SECRET OF US"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 5, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 5, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 13.99 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4641/17" - } - }]], - "C212": { - "7140": "9780736917018", - "7143": "EN" - }, - "1082": 17, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["HERMAN, KA EVER PRESENT DANGER"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 5, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 5, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 12.99 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4641/18" - } - }]], - "C212": { - "7140": "9781590529218", - "7143": "EN" - }, - "1082": 18, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["CHAPMAN, G IT HAPPENS EVERY SPRING"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 5, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 5, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "07", - "3055": "28", - "1131": "7B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 12.99 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4641/19" - } - }]], - "C212": { - "7140": "9781414311654", - "7143": "EN" - }, - "1082": 19, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["JACKSON, N YADA YADA PRAYER GROUP G"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 8, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 8, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 13.99 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4641/20" - } - }]], - "C212": { - "7140": "9781591453628", - "7143": "EN" - }, - "1082": 20, - "1229": "5" - }], ["UNS", { - "0081": "S" - }], ["CNT", { - "C270": { - "6069": "2", - "6066": 20 - } - }], ["UNT", { - "0074": 171, - "0062": "725" - }]] -}], -"recipient": "8888888", -"sender": "1556150", -"header": ["UNB", { - "S003": { - "0007": "31B", - "0010": "8888888" - }, - "0020": "2045", - "S004": { - "0019": 1556, - "0017": 70618 - }, - "S001": { - "0001": "UNOC", - "0002": 3 - }, - "S002": { - "0007": "31B", - "0004": "1556150" - } -}], -"sender_qual": "31B", -"UNA": { - "seg_term": "'", - "decimal_sign": ".", - "esc_char": "?", - "de_sep": "+", - "ce_sep": ":", - "rep_sep": " " -}, -"recipient_qual": "31B" -} diff --git a/Open-ILS/src/support-scripts/test-scripts/ftp_ls.pl b/Open-ILS/src/support-scripts/test-scripts/ftp_ls.pl index 987a419852..61cb80044d 100755 --- a/Open-ILS/src/support-scripts/test-scripts/ftp_ls.pl +++ b/Open-ILS/src/support-scripts/test-scripts/ftp_ls.pl @@ -57,7 +57,7 @@ while (my $line = ) { } close TEMP; -my $dir = '/home/some_user/out'; +my $dir = '/home/' . $config{remote_user} . '/out'; $delay and print "Sleeping $delay seconds\n" and sleep $delay; my $glob6 = $dir . '/*Q*'; diff --git a/Open-ILS/src/support-scripts/test-scripts/ordrsp_parse.pl b/Open-ILS/src/support-scripts/test-scripts/ordrsp_parse.pl deleted file mode 100755 index c57b33187f..0000000000 --- a/Open-ILS/src/support-scripts/test-scripts/ordrsp_parse.pl +++ /dev/null @@ -1,3058 +0,0 @@ -#!/usr/bin/perl -# - -use strict; use warnings; - -use Data::Dumper; - -use OpenILS::Utils::Cronscript; -use OpenILS::Application::Acq::EDI; -use Business::EDI::DataElement; -use Business::EDI::Segment::RFF; -use vars qw/%code_hash/; - -require Business::EDI::DataElement; - -my $verbose = @ARGV ? shift : 0; - -my $core = OpenILS::Utils::Cronscript->new(); -my $editor = $core->editor; - -my $slurp = join '', ; - -my ($aref, $whole) = OpenILS::Application::Acq::EDI->process_jedi($slurp); - -$Data::Dumper::Indent = 1; -# print Dumper($aref); -my @innards = @$aref; -my @rffs; - -# `print Dumper(\@innards); - -=pod - ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["LACY, AL THINGS NOT SEEN"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "21" - } - }], ... - ["RFF", { - "C506": { - "1153": "LI", - "1154": "4639/1" - } - }], ... ]}] - -=cut - -my @qtys = (); -foreach (@innards) { - -# my $count = scalar(@{$_->{SG26}}); - my $count = scalar(@$_); - print STDERR "->{SG26} has $count pieces: "; - for (my $i = 0; $i < $count; $i++) { - my $label = $_->[$i]->[0]; - my $body = $_->[$i]->[1]; - print STDERR "$label "; - $label eq 'QTY' and push @qtys, $body; - $label eq 'RFF' and push @rffs, $body; - } - print STDERR "\n"; - # foreach my $qty (@{$_->{SG26}->[0]}) { -} - -printf "%4d LINs found\n", scalar(@innards); -printf "%4d QTYs found\n", scalar(@qtys); -printf "%4d RFFs found (inside LINs)\n", scalar(@rffs); - -sub example_dump { - my $example = shift or return; - print "\nexample QTY: ", Dumper($example); - foreach (keys %{$example->{C186}}) { - # no warnings 'uninitialized'; - my $x = Business::EDI::DataElement->new($_); - print $x->label, " ($_) : ", $example->{C186}->{$_}, "\n"; - } -} - -# example_dump($qtys[-1]); - -# We want: RFF > C506 > 1154 where 1153 = LI -foreach my $rff (@rffs) { - my $obj = Business::EDI::Segment::RFF->new($rff); - $verbose and print Dumper ($obj); - foreach my $subrff (keys %$rff) { - $subrff eq 'C506' or next; - my $i = 0; - foreach (sort keys %{$rff->{$subrff}}) { - my $x = Business::EDI::DataElement->new($_, $rff->{$subrff}->{$_}); - $x or warn "Unknown DataElement code $_"; - print "$_ ", $x->label, " ", $x->value, " "; - $i++ == 0 and print "==> "; - } - print "\n"; - } -} -print "\ndone\n"; - -__DATA__ -{ -"trailer": ["UNZ", { - "0020": "2045", - "0036": 1 -}], -"body": [{ - "ORDRSP": [["UNH", { - "S009": { - "0052": "D", - "0054": "96A", - "0065": "ORDRSP", - "0051": "UN" - }, - "0062": "723" - }], ["BGM", { - "4343": "AC", - "1225": "29", - "C002": { - "1001": "231" - }, - "1004": "582822" - }], ["DTM", { - "C507": { - "2379": "102", - "2380": "20070618", - "2005": "137" - } - }], ["RFF", { - "C506": { - "1153": "ON", - "1154": "E07158FIC" - } - }], ["NAD", { - "C082": { - "3039": "8888888", - "3055": "31B" - }, - "3035": "BY" - }], ["NAD", { - "C082": { - "3039": "1556150", - "3055": "31B" - }, - "3035": "SU" - }], ["NAD", { - "C082": { - "3039": "8888888", - "3055": "91" - }, - "3035": "BY" - }], ["CUX", { - "C504": [{ - "6345": "USD", - "6347": "2", - "6343": "9" - }] - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["LACY, AL THINGS NOT SEEN"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 10.99 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4639/1" - } - }]], - "C212": { - "7140": "9781576734131", - "7143": "EN" - }, - "1082": 1, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["LACY, AL FINAL JUSTICE"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 1, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 1, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 14.99 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4639/2" - } - }]], - "C212": { - "7140": "9781590529966", - "7143": "EN" - }, - "1082": 2, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["MALAMUD, B NATURAL"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 5, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 5, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 14 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4639/3" - } - }]], - "C212": { - "7140": "9780374502003", - "7143": "EN" - }, - "1082": 3, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["SCOTT, PAU RAJ QUARTET THE JEWEL IN"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 2, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 2, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 32.5 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4639/4" - } - }]], - "C212": { - "7140": "9780307263964", - "7143": "EN" - }, - "1082": 4, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["JAMES, P. SHROUD FOR A NIGHTINGALE"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 14 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4639/6" - } - }]], - "C212": { - "7140": "9780743219600", - "7143": "EN" - }, - "1082": 5, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["LAHAYE, TI TRIBULATION FORCE THE CO"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 3, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 3, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 14.99 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4639/7" - } - }]], - "C212": { - "7140": "9780842329217", - "7143": "EN" - }, - "1082": 6, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["ZANE AFTERBURN A NOVEL"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 15 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4639/8" - } - }]], - "C212": { - "7140": "9780743470988", - "7143": "EN" - }, - "1082": 7, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["CABOT, MEG BOY NEXT DOOR"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 13.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4639/9" - } - }]], - "C212": { - "7140": "9780060096199", - "7143": "EN" - }, - "1082": 8, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["VONNEGUT, BREAKFAST OF CHAMPIONS"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 5, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 5, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 14 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4639/10" - } - }]], - "C212": { - "7140": "9780385334204", - "7143": "EN" - }, - "1082": 9, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["DOSTOYEVSK BROTHERS KARAMAZOV"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 3, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 3, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 9.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4639/11" - } - }]], - "C212": { - "7140": "9781593083526", - "7143": "EN" - }, - "1082": 10, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["KINGSBURY, FORGIVEN"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 6, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 6, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 13.99 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4639/12" - } - }]], - "C212": { - "7140": "9780842387446", - "7143": "EN" - }, - "1082": 11, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["BERLINSKI, FIELDWORK"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 3, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 3, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 24 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4639/13" - } - }]], - "C212": { - "7140": "9780374299163", - "7143": "EN" - }, - "1082": 12, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["GREGORY, P MERIDON A NOVEL"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 16 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4639/14" - } - }]], - "C212": { - "7140": "9780743249317", - "7143": "EN" - }, - "1082": 13, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["MCCALL SMI MORALITY FOR BEAUTIFUL G"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 5, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 5, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 12.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4639/15" - } - }]], - "C212": { - "7140": "9781400031368", - "7143": "EN" - }, - "1082": 14, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["CLEAGE, PE WHAT LOOKS LIKE CRAZY ON"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 3, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 3, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 13.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4639/16" - } - }]], - "C212": { - "7140": "9780380794874", - "7143": "EN" - }, - "1082": 15, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["GREGORY, P WIDEACRE"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 16 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4639/17" - } - }]], - "C212": { - "7140": "9780743249294", - "7143": "EN" - }, - "1082": 16, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["FERBER, ED SO BIG"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 3, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 3, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "07", - "3055": "28", - "1131": "7B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 13 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4639/18" - } - }]], - "C212": { - "7140": "9780060956691", - "7143": "EN" - }, - "1082": 17, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["GREGORY, P OTHER BOLEYN GIRL"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 16 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4639/19" - } - }]], - "C212": { - "7140": "9780743227445", - "7143": "EN" - }, - "1082": 18, - "1229": "5" - }], ["UNS", { - "0081": "S" - }], ["CNT", { - "C270": { - "6069": "2", - "6066": 18 - } - }], ["UNT", { - "0074": 155, - "0062": "723" - }]] -}, -{ - "ORDRSP": [["UNH", { - "S009": { - "0052": "D", - "0054": "96A", - "0065": "ORDRSP", - "0051": "UN" - }, - "0062": "724" - }], ["BGM", { - "4343": "AC", - "1225": "29", - "C002": { - "1001": "231" - }, - "1004": "582828" - }], ["DTM", { - "C507": { - "2379": "102", - "2380": "20070618", - "2005": "137" - } - }], ["RFF", { - "C506": { - "1153": "ON", - "1154": "E07159ANF" - } - }], ["NAD", { - "C082": { - "3039": "8888888", - "3055": "31B" - }, - "3035": "BY" - }], ["NAD", { - "C082": { - "3039": "1556150", - "3055": "31B" - }, - "3035": "SU" - }], ["NAD", { - "C082": { - "3039": "8888888", - "3055": "91" - }, - "3035": "BY" - }], ["CUX", { - "C504": [{ - "6345": "USD", - "6347": "2", - "6343": "9" - }] - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["HOLM, BILL WINDOWS OF BRIMNES"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 3, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 3, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 22 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4640/1" - } - }]], - "C212": { - "7140": "9781571313027", - "7143": "EN" - }, - "1082": 1, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["REPA, BARB YOUR RIGHTS IN THE WORKP"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 29.99 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4640/2" - } - }]], - "C212": { - "7140": "9781413306439", - "7143": "EN" - }, - "1082": 2, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["GUERIN, LI ESSENTIAL GUIDE TO WORKP"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 2, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 2, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 39.99 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4640/3" - } - }]], - "C212": { - "7140": "9781413306910", - "7143": "EN" - }, - "1082": 3, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["CLIFFORD, ESTATE PLANNING BASICS"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 5, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 5, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 21.99 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4640/4" - } - }]], - "C212": { - "7140": "9781413307023", - "7143": "EN" - }, - "1082": 4, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["FRIEDMAN, BABY CARE BOOK"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 8, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 8, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 29.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4640/5" - } - }]], - "C212": { - "7140": "9780778801603", - "7143": "EN" - }, - "1082": 5, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["KING, RUSS ATLAS OF HUMAN MIGRATION"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 3, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 3, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 40 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4640/6" - } - }]], - "C212": { - "7140": "9781554072873", - "7143": "EN" - }, - "1082": 6, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["ASH, RUSSE FIREFLYS WORLD OF FACTS"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 6, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 6, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 29.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4640/7" - } - }]], - "C212": { - "7140": "9781554073139", - "7143": "EN" - }, - "1082": 7, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["WARNER, RA 101 LAW FORMS FOR PERSON"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 6, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 6, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 29.99 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4640/8" - } - }]], - "C212": { - "7140": "9781413307122", - "7143": "EN" - }, - "1082": 8, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["BRAY, ILON NOLOS ESSENTIAL GUIDE TO"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 10, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 10, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 24.99 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4640/9" - } - }]], - "C212": { - "7140": "9781413306286", - "7143": "EN" - }, - "1082": 9, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["WESTWOOD, HOW TO WRITE A MARKETING"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 3, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 1, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 2, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "99", - "3055": "28", - "1131": "7B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 17.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4640/10" - } - }]], - "C212": { - "7140": "9780749445546", - "7143": "EN" - }, - "1082": 10, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["ROANE, SUS HOW TO WORK A ROOM YOUR "] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 8, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 8, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 14.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4640/11" - } - }]], - "C212": { - "7140": "9780061238673", - "7143": "EN" - }, - "1082": 11, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["GERMAIN, D REACHING PAST THE WIRE A"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 24.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4640/12" - } - }]], - "C212": { - "7140": "9780873516068", - "7143": "EN" - }, - "1082": 12, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["KLING, KEV DOG SAYS HOW"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 3, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 3, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 22.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4640/13" - } - }]], - "C212": { - "7140": "9780873515993", - "7143": "EN" - }, - "1082": 13, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["SHORT, SUS BUNDT CAKE BLISS DELICIO"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 5, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 5, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 16.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4640/14" - } - }]], - "C212": { - "7140": "9780873515856", - "7143": "EN" - }, - "1082": 14, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["BRADY, TIM GOPHER GOLD LEGENDARY FI"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 2, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 2, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 24.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4640/15" - } - }]], - "C212": { - "7140": "9780873516013", - "7143": "EN" - }, - "1082": 15, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["ROBERTS, K MINNESOTA 150 THE PEOPLE"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 8, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 8, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 19.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4640/16" - } - }]], - "C212": { - "7140": "9780873515948", - "7143": "EN" - }, - "1082": 16, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["MAK, GEERT IN EUROPE A JOURNEY THRO"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 2, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 2, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 35 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4640/17" - } - }]], - "C212": { - "7140": "9780375424953", - "7143": "EN" - }, - "1082": 17, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["DONAHUE, P PARENTING WITHOUT FEAR O"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 5, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 5, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 14.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4640/18" - } - }]], - "C212": { - "7140": "9780312358914", - "7143": "EN" - }, - "1082": 18, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["MURRAY, LI BABYCENTERS ESSENTIAL GU"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 8, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 8, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 15.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4640/19" - } - }]], - "C212": { - "7140": "9781594864117", - "7143": "EN" - }, - "1082": 19, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["LAPINE, MI SNEAKY CHEF SIMPLE STRAT"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 6, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 6, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 17.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4640/20" - } - }]], - "C212": { - "7140": "9780762430758", - "7143": "EN" - }, - "1082": 20, - "1229": "5" - }], ["UNS", { - "0081": "S" - }], ["CNT", { - "C270": { - "6069": "2", - "6066": 20 - } - }], ["UNT", { - "0074": 171, - "0062": "724" - }]] -}, -{ - "ORDRSP": [["UNH", { - "S009": { - "0052": "D", - "0054": "96A", - "0065": "ORDRSP", - "0051": "UN" - }, - "0062": "725" - }], ["BGM", { - "4343": "AC", - "1225": "29", - "C002": { - "1001": "231" - }, - "1004": "582830" - }], ["DTM", { - "C507": { - "2379": "102", - "2380": "20070618", - "2005": "137" - } - }], ["RFF", { - "C506": { - "1153": "ON", - "1154": "E07160FIC" - } - }], ["NAD", { - "C082": { - "3039": "8888888", - "3055": "31B" - }, - "3035": "BY" - }], ["NAD", { - "C082": { - "3039": "1556150", - "3055": "31B" - }, - "3035": "SU" - }], ["NAD", { - "C082": { - "3039": "8888888", - "3055": "91" - }, - "3035": "BY" - }], ["CUX", { - "C504": [{ - "6345": "USD", - "6347": "2", - "6343": "9" - }] - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["SHAW, REBE COUNTRY LOVERS"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 5, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 5, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 12.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4641/1" - } - }]], - "C212": { - "7140": "9781400098224", - "7143": "EN" - }, - "1082": 1, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["BLAKE, TON TEMPT ME TONIGHT"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "07", - "3055": "28", - "1131": "7B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 13.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4641/2" - } - }]], - "C212": { - "7140": "9780061136092", - "7143": "EN" - }, - "1082": 2, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["MONING, KA BLOODFEVER"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 6, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 6, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 22 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4641/3" - } - }]], - "C212": { - "7140": "9780385339162", - "7143": "EN" - }, - "1082": 3, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["MCKENNA, S EDGE OF MIDNIGHT"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 8, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 8, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 14 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4641/4" - } - }]], - "C212": { - "7140": "9780758211859", - "7143": "EN" - }, - "1082": 4, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["BALZO, SAN GROUNDS FOR MURDER"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 8, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 8, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 27.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4641/5" - } - }]], - "C212": { - "7140": "9780727865496", - "7143": "EN" - }, - "1082": 5, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["PALMER, DI HARD TO HANDLE"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 8, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 8, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 13.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4641/6" - } - }]], - "C212": { - "7140": "9780373772612", - "7143": "EN" - }, - "1082": 6, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["JONES, LLO MR PIP"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 3, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 3, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 20 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4641/7" - } - }]], - "C212": { - "7140": "9780385341066", - "7143": "EN" - }, - "1082": 7, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["JILES, PAU STORMY WEATHER"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 8, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 8, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 24.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4641/8" - } - }]], - "C212": { - "7140": "9780060537326", - "7143": "EN" - }, - "1082": 8, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["DELILLO, D FALLING MAN A NOVEL"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 26 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4641/9" - } - }]], - "C212": { - "7140": "9781416546023", - "7143": "EN" - }, - "1082": 9, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["MORRISON, SWEETER THAN HONEY"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 3, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 3, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 24 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4641/10" - } - }]], - "C212": { - "7140": "9780758215116", - "7143": "EN" - }, - "1082": 10, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["SMITH, SHE FOX"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 2, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 2, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 25.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4641/11" - } - }]], - "C212": { - "7140": "9780756404215", - "7143": "EN" - }, - "1082": 11, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["GROSSMAN, SOON I WILL BE INVINCIBL"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 2, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 2, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 22.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4641/12" - } - }]], - "C212": { - "7140": "9780375424861", - "7143": "EN" - }, - "1082": 12, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["LEWYCKA, M SHORT HISTORY OF TRACTOR"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 3, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 3, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 14 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4641/13" - } - }]], - "C212": { - "7140": "9780143036746", - "7143": "EN" - }, - "1082": 13, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["BANNISTER, FLAWED"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 4, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "03", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 24.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4641/14" - } - }]], - "C212": { - "7140": "9780312375669", - "7143": "EN" - }, - "1082": 14, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["ALEXANDER, REMEMBERED"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 8, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 8, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 13.99 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4641/15" - } - }]], - "C212": { - "7140": "9780764201103", - "7143": "EN" - }, - "1082": 15, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["TANIGUCHI, OCEAN IN THE CLOSET"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 2, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 2, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 14.95 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4641/16" - } - }]], - "C212": { - "7140": "9781566891943", - "7143": "EN" - }, - "1082": 16, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["HENKE, ROX SECRET OF US"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 5, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 5, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 13.99 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4641/17" - } - }]], - "C212": { - "7140": "9780736917018", - "7143": "EN" - }, - "1082": 17, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["HERMAN, KA EVER PRESENT DANGER"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 5, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 5, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 12.99 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4641/18" - } - }]], - "C212": { - "7140": "9781590529218", - "7143": "EN" - }, - "1082": 18, - "1229": "5" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["CHAPMAN, G IT HAPPENS EVERY SPRING"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 5, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 5, - "6063": "83" - } - }], ["FTX", { - "C107": { - "4441": "07", - "3055": "28", - "1131": "7B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 12.99 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4641/19" - } - }]], - "C212": { - "7140": "9781414311654", - "7143": "EN" - }, - "1082": 19, - "1229": "24" - }], ["LIN", { - "SG26": [["IMD", { - "C273": { - "7008": ["JACKSON, N YADA YADA PRAYER GROUP G"] - }, - "7077": "F", - "7081": "BST" - }], ["QTY", { - "C186": { - "6060": 8, - "6063": "21" - } - }], ["QTY", { - "C186": { - "6060": 8, - "6063": "12" - } - }], ["QTY", { - "C186": { - "6060": 0, - "6063": "85" - } - }], ["FTX", { - "C107": { - "4441": "01", - "3055": "28", - "1131": "8B" - }, - "4451": "LIN" - }], ["PRI", { - "C509": { - "5387": "SRP", - "5125": "AAB", - "5118": 13.99 - } - }], ["RFF", { - "C506": { - "1153": "LI", - "1154": "4641/20" - } - }]], - "C212": { - "7140": "9781591453628", - "7143": "EN" - }, - "1082": 20, - "1229": "5" - }], ["UNS", { - "0081": "S" - }], ["CNT", { - "C270": { - "6069": "2", - "6066": 20 - } - }], ["UNT", { - "0074": 171, - "0062": "725" - }]] -}], -"recipient": "8888888", -"sender": "1556150", -"header": ["UNB", { - "S003": { - "0007": "31B", - "0010": "8888888" - }, - "0020": "2045", - "S004": { - "0019": 1556, - "0017": 70618 - }, - "S001": { - "0001": "UNOC", - "0002": 3 - }, - "S002": { - "0007": "31B", - "0004": "1556150" - } -}], -"sender_qual": "31B", -"UNA": { - "seg_term": "'", - "decimal_sign": ".", - "esc_char": "?", - "de_sep": "+", - "ce_sep": ":", - "rep_sep": " " -}, -"recipient_qual": "31B" -} diff --git a/Open-ILS/tests/datasets/edi_scratch/0BzIfl53u8.ORDRSP.jedi b/Open-ILS/tests/datasets/edi_scratch/0BzIfl53u8.ORDRSP.jedi new file mode 100644 index 0000000000..daa76b36af --- /dev/null +++ b/Open-ILS/tests/datasets/edi_scratch/0BzIfl53u8.ORDRSP.jedi @@ -0,0 +1 @@ +my $o = '{"trailer":["UNZ",{"0020":"02","0036":1}],"recipient_qual":"31B","body":[{"ORDRSP":[["UNH",{"S009":{"0052":"D","0054":"96A","0065":"ORDRSP","0051":"UN"},"0062":"02"}],["BGM",{"1225":"4","C002":{"1001":"231"},"1004":"000000","4343":"AC"}],["DTM",{"C507":{"2379":"102","2380":"20100611","2005":"137"}}],["SG1",[["RFF",{"C506":{"1153":"ON","1154":"8"}}]]],["SG3",[["NAD",{"3035":"SU","C082":{"3039":"1692100","3055":"9"}}]]],["SG8",[["CUX",{"C504":[{"6345":"USD","6347":"2","6343":"9"}]}]]],["SG26",[["LIN",{"1082":1,"1229":"2"}],["IMD",{"C273":{"7008":[" "]},"7077":"F","7081":"BST"}],["QTY",{"C186":{"6060":10,"6063":"21"}}],["QTY",{"C186":{"6060":0,"6063":"12"}}],["QTY",{"C186":{"6060":10,"6063":"85"}}],["FTX",{"C107":{"1131":"8B","3055":"28","4441":"27"},"4451":"LIN"}],["SG30",[["PRI",{"C509":{"5125":"AAB","5118":0,"5387":"SRP"}}]]],["SG31",[["RFF",{"C506":{"1153":"LI","1154":"8/1"}}]]]]],["SG26",[["LIN",{"1082":2,"1229":"2"}],["IMD",{"C273":{"7008":[" "]},"7077":"F","7081":"BST"}],["QTY",{"C186":{"6060":8,"6063":"21"}}],["QTY",{"C186":{"6060":0,"6063":"12"}}],["QTY",{"C186":{"6060":8,"6063":"85"}}],["FTX",{"C107":{"1131":"8B","3055":"28","4441":"27"},"4451":"LIN"}],["SG30",[["PRI",{"C509":{"5125":"AAB","5118":0,"5387":"SRP"}}]]],["SG31",[["RFF",{"C506":{"1153":"LI","1154":"8/2"}}]]]]],["SG26",[["LIN",{"1082":3,"1229":"2"}],["IMD",{"C273":{"7008":[" "]},"7077":"F","7081":"BST"}],["QTY",{"C186":{"6060":5,"6063":"21"}}],["QTY",{"C186":{"6060":0,"6063":"12"}}],["QTY",{"C186":{"6060":5,"6063":"85"}}],["FTX",{"C107":{"1131":"8B","3055":"28","4441":"27"},"4451":"LIN"}],["SG30",[["PRI",{"C509":{"5125":"AAB","5118":0,"5387":"SRP"}}]]],["SG31",[["RFF",{"C506":{"1153":"LI","1154":"8/3"}}]]]]],["UNS",{"0081":"S"}],["CNT",{"C270":{"6069":"2","6066":3}}],["UNT",{"0074":33,"0062":"02"}]]}],"sender":"1556150","header":["UNB",{"S003":{"0007":"31B","0010":"123EVER"},"0020":"02","S004":{"0019":1155,"0017":100611},"S001":{"0001":"UNOC","0002":3},"S002":{"0007":"31B","0004":"1556150"}}],"recipient":"123EVER","sender_qual":"31B","UNA":{"seg_term":"\'","decimal_sign":".","esc_char":"?","de_sep":"+","ce_sep":":","rep_sep":" "}}'; diff --git a/Open-ILS/tests/datasets/edi_scratch/0LGQQtTxuv.orders.edi b/Open-ILS/tests/datasets/edi_scratch/0LGQQtTxuv.orders.edi new file mode 100644 index 0000000000..b3656bb300 --- /dev/null +++ b/Open-ILS/tests/datasets/edi_scratch/0LGQQtTxuv.orders.edi @@ -0,0 +1 @@ +UNA:+.? 'UNB+UNOB:3+123EVER:31B+1556150:31B+100804:1504+1'UNH+1+ORDERS:D:96A:UN'BGM+220+12+9'DTM+137:20100804:102'NAD+BY+123EVER 0001::91'NAD+SU+1556150::31B'NAD+SU+8::92'CUX+2:USD:9'LIN+67++9780754809654:EN'PIA+5+9780754809654:EN+075480965X:IB+67:SA'IMD+F+BTI+:::The arthritis cookbook ?:'IMD+F+BPU+:::Lorenz,'IMD+F+BPD+:::2002.'IMD+F+BPH+:::96 p. ?:'QTY+21:5'PRI+AAB:15'RFF+LI:12/67'LIN+66++9780596526856:EN'PIA+5+9780596526856:EN+0596526857:IB+66:SA'IMD+F+BTI+:::Illustrated guide to astronomical w:onders'IMD+F+BPU+:::Make?:Books,'IMD+F+BPD+:::cop. 2007.'IMD+F+BPH+:::519 p. ?:'QTY+21:13'PRI+AAB:24'RFF+LI:12/66'LIN+69++9789990545371:EN'PIA+5+9789990545371:EN+69:SA'IMD+F+BTI+:::Ancient Text'QTY+21:5'PRI+AAB:35'RFF+LI:12/69'LIN+68++9780446360012:EN'PIA+5+9780446360012:EN+0446360015:IB+68:SA'IMD+F+BTI+:::On leaving Charleston /'IMD+F+BPU+:::Warner Books,'IMD+F+BPD+:::1984.'IMD+F+BPH+:::574 p.'QTY+21:12'PRI+AAB:12'RFF+LI:12/68'UNS+S'CNT+2:4'UNT+43+1'UNZ+1+1' diff --git a/Open-ILS/tests/datasets/edi_scratch/4PkcdYeZtT.edi b/Open-ILS/tests/datasets/edi_scratch/4PkcdYeZtT.edi new file mode 100644 index 0000000000..a039dc26b1 --- /dev/null +++ b/Open-ILS/tests/datasets/edi_scratch/4PkcdYeZtT.edi @@ -0,0 +1 @@ +UNA:+.? 'UNB+UNOB:3+123EVER:31B+1556150:31B+100622:0212+1'UNH+1+ORDERS:D:96A:UN'BGM+220+8+9'DTM+137:20100621:102'NAD+BY+123EVER 0001::91'NAD+SU+1556150::31B'NAD+SU+8::92'CUX+2:USD:9'LIN+1++9780446360272:EN'PIA+5+9780446360272:EN+0446360279:IB+57:SA'IMD+F+BTI+:::Webster?'s new world thesaurus ?:'IMD+F+BPU+:::Warner Books, Inc.,'IMD+F+BPD+:::1990.'IMD+F+BPH+:::xv, 494 p. ;'QTY+21:10'PRI+AAB:4.5'RFF+LI:8/1'LIN+2++9780446357197:EN'PIA+5+9780446357197:EN+0446357197:IB+0446831832:IB+9780446831833:EN+59:SA'IMD+F+BTI+:::The world is full of divorced women: /'IMD+F+BPU+:::Warner Books,'IMD+F+BPD+:::c1980.'IMD+F+BPH+:::413 p. ;'QTY+21:8'PRI+AAB:7.99'RFF+LI:8/2'LIN+3++9780446350105:EN'PIA+5+9780446350105:EN+0446350109:IB+60:SA'IMD+F+BTI+:::Windmills of the gods /'IMD+F+BPU+:::Warner Books,'IMD+F+BPD+:::1988, c1987.'IMD+F+BPH+:::xiii, 434 p. ;'QTY+21:5'PRI+AAB:8.75'RFF+LI:8/3'UNS+S'CNT+2:3'UNT+37+1'UNZ+1+1' diff --git a/Open-ILS/tests/datasets/edi_scratch/5pGP3O5rgS b/Open-ILS/tests/datasets/edi_scratch/5pGP3O5rgS new file mode 100644 index 0000000000..ad28cc648e --- /dev/null +++ b/Open-ILS/tests/datasets/edi_scratch/5pGP3O5rgS @@ -0,0 +1 @@ +UNA:+.? 'UNB+UNOB:3+123EVER:31B+1556150:31B+100727:1833+1'UNH+1+ORDERS:D:96A:UN'BGM+220+8+9'DTM+137:20100621:102'NAD+BY+123EVER 0001::91'NAD+SU+1556150::31B'NAD+SU+8::92'CUX+2:USD:9'LIN+1++9780446360272:EN'PIA+5+9780446360272:EN+0446360279:IB+57:SA'IMD+F+BTI+:::Webster?'s new world thesaurus ?:'IMD+F+BPU+:::Warner Books, Inc.,'IMD+F+BPD+:::1990.'IMD+F+BPH+:::xv, 494 p. ;'QTY+21:10'PRI+AAB:4.5'RFF+LI:8/1'LIN+2++9780446357197:EN'PIA+5+9780446357197:EN+0446357197:IB+0446831832:IB+9780446831833:EN+59:SA'IMD+F+BTI+:::The world is full of divorced women: /'IMD+F+BPU+:::Warner Books,'IMD+F+BPD+:::c1980.'IMD+F+BPH+:::413 p. ;'QTY+21:8'PRI+AAB:7.99'RFF+LI:8/2'LIN+3++9780446350105:EN'PIA+5+9780446350105:EN+0446350109:IB+60:SA'IMD+F+BTI+:::Windmills of the gods /'IMD+F+BPU+:::Warner Books,'IMD+F+BPD+:::1988, c1987.'IMD+F+BPH+:::xiii, 434 p. ;'QTY+21:5'PRI+AAB:8.75'RFF+LI:8/3'UNS+S'CNT+2:3'UNT+37+1'UNZ+1+1' diff --git a/Open-ILS/tests/datasets/edi_scratch/acq.bugs b/Open-ILS/tests/datasets/edi_scratch/acq.bugs new file mode 100644 index 0000000000..19c0ca9c13 --- /dev/null +++ b/Open-ILS/tests/datasets/edi_scratch/acq.bugs @@ -0,0 +1,24 @@ + +Every LID needs a Fund. Interface doesn't enforce this. + +When the interface intends to make you cancel rather than "X" a LID (because the PO is active) +you can still delete LIDs by changing the Item Count and clicking "Go". + +LID Save Changes: when it works quickly, you have no idea that it succeeded. Especially if you +are conditioned to eternally hung progress bars. + +Upload MARC file for acq: hangs. + +No chrome package registered for chrome://open_ils_staff_client/js/dojo/dojo/dojo.js +No chrome package registered for chrome://extensiondev/content/rdfhistory.js +No chrome package registered for chrome://extensiondev/content/chromeShellExtras.js + +Error: buildGrid is not defined +Source File: http://dev-vm7.lan.hq.esilibrary.com/js/ui/default/vandelay/vandelay.js +Line: 1325 + +Error: list[i].toHash is not a function +Source File: http://dev-vm7.lan.hq.esilibrary.com/js/dojo/dojo/dojo.js +Line: 71 + +Title of tab for /eg/vandelay/vandelay is "Server Settings" (not "MARC Import/Export") as in FF. diff --git a/Open-ILS/tests/datasets/edi_scratch/baker_taylor.ordrsp.edi b/Open-ILS/tests/datasets/edi_scratch/baker_taylor.ordrsp.edi new file mode 100644 index 0000000000..c1c3e456cf --- /dev/null +++ b/Open-ILS/tests/datasets/edi_scratch/baker_taylor.ordrsp.edi @@ -0,0 +1 @@ +UNA:+.? 'UNB+UNOC:3+1556150:31B+123EVER:31B+100622:1004+03'UNG+ORDRSP+1556150:31B+123EVER:31B+100622:1004+38+UN+D 'UNH+03+ORDRSP:D:96A:UN'BGM+231+071678+29+AC'DTM+137:20100622:102'RFF+ON:8'NAD+BY+123EVER::9'NAD+BY+123EVER 0001::91'CUX+2:USD:9'LIN+1+5+9780446360272:EN'IMD+F+BST+:::NOT APPLIC WEBSTERS NEW WORLD THESA'QTY+21:10'QTY+12:10'QTY+85:0'FTX+LIN++01:8B:28'PRI+AAB:4.5::SRP'RFF+LI:8/1'LIN+2+5+9780446357197:EN'IMD+F+BST+:::COLLINS, J WORLD IS FULL OF DIVORCE'QTY+21:8'QTY+12:8'QTY+85:0'FTX+LIN++01:8B:28'PRI+AAB:6.5::SRP'RFF+LI:8/2'LIN+3+5+9780446350105:EN'IMD+F+BST+:::SHELDON, S WINDMILLS OF THE GODS'QTY+21:5'QTY+12:5'QTY+85:0'FTX+LIN++01:8B:28'PRI+AAB:6.99::SRP'RFF+LI:8/3'UNS+S'CNT+2:3'UNT+34+03'UNE+1+38'UNZ+1+03' \ No newline at end of file diff --git a/Open-ILS/tests/datasets/edi_scratch/baker_taylor.ordrsp.edi.split b/Open-ILS/tests/datasets/edi_scratch/baker_taylor.ordrsp.edi.split new file mode 100644 index 0000000000..91eb8b730e --- /dev/null +++ b/Open-ILS/tests/datasets/edi_scratch/baker_taylor.ordrsp.edi.split @@ -0,0 +1,41 @@ +UNA:+.? ' +UNB+UNOC:3+1556150:31B+123EVER:31B+100622:1004+03' +UNG+ORDRSP+1556150:31B+123EVER:31B+100622:1004+38+UN+D ' +UNH+03+ORDRSP:D:96A:UN' +BGM+231+071678+29+AC' +DTM+137:20100622:102' +RFF+ON:8' +NAD+BY+123EVER::9' +NAD+BY+123EVER 0001::91' +CUX+2:USD:9' +LIN+1+5+9780446360272:EN' +IMD+F+BST+:::NOT APPLIC WEBSTERS NEW WORLD THESA' +QTY+21:10' +QTY+12:10' +QTY+85:0' +FTX+LIN++01:8B:28' +PRI+AAB:4.5::SRP' +RFF+LI:8/1' +LIN+2+5+9780446357197:EN' +IMD+F+BST+:::COLLINS, J WORLD IS FULL OF DIVORCE' +QTY+21:8' +QTY+12:8' +QTY+85:0' +FTX+LIN++01:8B:28' +PRI+AAB:6.5::SRP' +RFF+LI:8/2' +LIN+3+5+9780446350105:EN' +IMD+F+BST+:::SHELDON, S WINDMILLS OF THE GODS' +QTY+21:5' +QTY+12:5' +QTY+85:0' +FTX+LIN++01:8B:28' +PRI+AAB:6.99::SRP' +RFF+LI:8/3' +UNS+S' +CNT+2:3' +UNT+34+03' +UNE+1+38' +UNZ+1+03' +====================================================================== + diff --git a/Open-ILS/tests/datasets/edi_scratch/baker_taylor.ordrsp.edi2 b/Open-ILS/tests/datasets/edi_scratch/baker_taylor.ordrsp.edi2 new file mode 100644 index 0000000000..f47b935ddf --- /dev/null +++ b/Open-ILS/tests/datasets/edi_scratch/baker_taylor.ordrsp.edi2 @@ -0,0 +1 @@ +UNA:+.? 'UNB+UNOC:3+1556150:31B+123EVER:31B+100707:0941+05'UNG+ORDRSP+1556150:31B+123EVER:31B+100707:0941+40+UN+D:96A:UN'UNH+05+ORDRSP:D:96A:UN'BGM+231+071681+29+AC'DTM+137:20100622:102'RFF+ON:8'NAD+BY+123EVER::9'NAD+SU+1556150::9'NAD+BY+123EVER 0001::91'CUX+2:USD:9'LIN+1+5+9780446360272:EN'IMD+F+BST+:::NOT APPLIC WEBSTERS NEW WORLD THESA'QTY+21:10'QTY+12:10'QTY+85:0'FTX+LIN++01:8B:28'PRI+AAB:4.5::SRP'RFF+LI:8/1'LIN+2+5+9780446357197:EN'IMD+F+BST+:::COLLINS, J WORLD IS FULL OF DIVORCE'QTY+21:8'QTY+12:8'QTY+85:0'FTX+LIN++01:8B:28'PRI+AAB:6.5::SRP'RFF+LI:8/2'LIN+3+5+9780446350105:EN'IMD+F+BST+:::SHELDON, S WINDMILLS OF THE GODS'QTY+21:5'QTY+12:5'QTY+85:0'FTX+LIN++01:8B:28'PRI+AAB:6.99::SRP'RFF+LI:8/3'UNS+S'CNT+2:3'UNT+35+05'UNE+1+40'UNZ+1+05' \ No newline at end of file diff --git a/Open-ILS/tests/datasets/edi_scratch/baker_taylor.ordrsp.jedi b/Open-ILS/tests/datasets/edi_scratch/baker_taylor.ordrsp.jedi new file mode 100644 index 0000000000..5abb95100b --- /dev/null +++ b/Open-ILS/tests/datasets/edi_scratch/baker_taylor.ordrsp.jedi @@ -0,0 +1,453 @@ +UNA:+.? 'UNB+UNOC:3+1556150:31B+123EVER:31B+100622:1004+03'UNG+ORDRSP+1556150:31B+123EVER:31B+100622:1004+38+UN+D 'UNH+03+ORDRSP:D:96A:UN'BGM+231+071678+29+AC'DTM+137:20100622:102'RFF+ON:8'NAD+BY+123EVER::9'NAD+BY+123EVER 0001::91'CUX+2:USD:9'LIN+1+5+9780446360272:EN'IMD+F+BST+:::NOT APPLIC WEBSTERS NEW WORLD THESA'QTY+21:10'QTY+12:10'QTY+85:0'FTX+LIN++01:8B:28'PRI+AAB:4.5::SRP'RFF+LI:8/1'LIN+2+5+9780446357197:EN'IMD+F+BST+:::COLLINS, J WORLD IS FULL OF DIVORCE'QTY+21:8'QTY+12:8'QTY+85:0'FTX+LIN++01:8B:28'PRI+AAB:6.5::SRP'RFF+LI:8/2'LIN+3+5+9780446350105:EN'IMD+F+BST+:::SHELDON, S WINDMILLS OF THE GODS'QTY+21:5'QTY+12:5'QTY+85:0'FTX+LIN++01:8B:28'PRI+AAB:6.99::SRP'RFF+LI:8/3'UNS+S'CNT+2:3'UNT+34+03'UNE+1+38'UNZ+1+03' + +# edi2json Response: +$VAR1 = { + 'body' => [ + { + 'ORDRSP' => [ + [ + 'UNH', + { + '0062' => '03', + 'S009' => { + '0051' => 'UN', + '0052' => 'D', + '0065' => 'ORDRSP', + '0054' => '96A' + } + } + ], + [ + 'BGM', + { + '1004' => '071678', + '4343' => 'AC', + '1225' => '29', + 'C002' => { + '1001' => '231' + } + } + ], + [ + 'DTM', + { + 'C507' => { + '2005' => '137', + '2379' => '102', + '2380' => '20100622' + } + } + ], + [ + 'SG1', + [ + [ + 'RFF', + { + 'C506' => { + '1154' => '8', + '1153' => 'ON' + } + } + ] + ] + ], + [ + 'SG3', + [ + [ + 'NAD', + { + 'C082' => { + '3039' => '123EVER', + '3055' => '9' + }, + '3035' => 'BY' + } + ] + ] + ], + [ + 'SG3', + [ + [ + 'NAD', + { + 'C082' => { + '3039' => '123EVER 0001', + '3055' => '91' + }, + '3035' => 'BY' + } + ] + ] + ], + [ + 'SG8', + [ + [ + 'CUX', + { + 'C504' => [ + { + '6345' => 'USD', + '6343' => '9', + '6347' => '2' + } + ] + } + ] + ] + ], + [ + 'SG26', + [ + [ + 'LIN', + { + '1229' => '5', + '1082' => 1, + 'C212' => { + '7140' => '9780446360272', + '7143' => 'EN' + } + } + ], + [ + 'IMD', + { + '7081' => 'BST', + '7077' => 'F', + 'C273' => { + '7008' => [ + 'NOT APPLIC WEBSTERS NEW WORLD THESA' + ] + } + } + ], + [ + 'QTY', + { + 'C186' => { + '6063' => '21', + '6060' => 10 + } + } + ], + [ + 'QTY', + { + 'C186' => { + '6063' => '12', + '6060' => 10 + } + } + ], + [ + 'QTY', + { + 'C186' => { + '6063' => '85', + '6060' => 0 + } + } + ], + [ + 'FTX', + { + '4451' => 'LIN', + 'C107' => { + '4441' => '01', + '3055' => '28', + '1131' => '8B' + } + } + ], + [ + 'SG30', + [ + [ + 'PRI', + { + 'C509' => { + '5118' => '4.5', + '5387' => 'SRP', + '5125' => 'AAB' + } + } + ] + ] + ], + [ + 'SG31', + [ + [ + 'RFF', + { + 'C506' => { + '1154' => '8/1', + '1153' => 'LI' + } + } + ] + ] + ] + ] + ], + [ + 'SG26', + [ + [ + 'LIN', + { + '1229' => '5', + '1082' => 2, + 'C212' => { + '7140' => '9780446357197', + '7143' => 'EN' + } + } + ], + [ + 'IMD', + { + '7081' => 'BST', + '7077' => 'F', + 'C273' => { + '7008' => [ + 'COLLINS, J WORLD IS FULL OF DIVORCE' + ] + } + } + ], + [ + 'QTY', + { + 'C186' => { + '6063' => '21', + '6060' => 8 + } + } + ], + [ + 'QTY', + { + 'C186' => { + '6063' => '12', + '6060' => 8 + } + } + ], + [ + 'QTY', + { + 'C186' => { + '6063' => '85', + '6060' => 0 + } + } + ], + [ + 'FTX', + { + '4451' => 'LIN', + 'C107' => { + '4441' => '01', + '3055' => '28', + '1131' => '8B' + } + } + ], + [ + 'SG30', + [ + [ + 'PRI', + { + 'C509' => { + '5118' => '6.5', + '5387' => 'SRP', + '5125' => 'AAB' + } + } + ] + ] + ], + [ + 'SG31', + [ + [ + 'RFF', + { + 'C506' => { + '1154' => '8/2', + '1153' => 'LI' + } + } + ] + ] + ] + ] + ], + [ + 'SG26', + [ + [ + 'LIN', + { + '1229' => '5', + '1082' => 3, + 'C212' => { + '7140' => '9780446350105', + '7143' => 'EN' + } + } + ], + [ + 'IMD', + { + '7081' => 'BST', + '7077' => 'F', + 'C273' => { + '7008' => [ + 'SHELDON, S WINDMILLS OF THE GODS' + ] + } + } + ], + [ + 'QTY', + { + 'C186' => { + '6063' => '21', + '6060' => 5 + } + } + ], + [ + 'QTY', + { + 'C186' => { + '6063' => '12', + '6060' => 5 + } + } + ], + [ + 'QTY', + { + 'C186' => { + '6063' => '85', + '6060' => 0 + } + } + ], + [ + 'FTX', + { + '4451' => 'LIN', + 'C107' => { + '4441' => '01', + '3055' => '28', + '1131' => '8B' + } + } + ], + [ + 'SG30', + [ + [ + 'PRI', + { + 'C509' => { + '5118' => '6.99', + '5387' => 'SRP', + '5125' => 'AAB' + } + } + ] + ] + ], + [ + 'SG31', + [ + [ + 'RFF', + { + 'C506' => { + '1154' => '8/3', + '1153' => 'LI' + } + } + ] + ] + ] + ] + ], + [ + 'UNS', + { + '0081' => 'S' + } + ], + [ + 'CNT', + { + 'C270' => { + '6066' => 3, + '6069' => '2' + } + } + ], + [ + 'UNT', + { + '0062' => '03', + '0074' => 34 + } + ] + ] + } + ], + 'trailer' => [ + 'UNZ', + { + '0036' => 1, + '0020' => '03' + } + ], + 'recipient' => '123EVER', + 'sender' => '1556150', + 'recipient_qual' => '31B', + 'sender_qual' => '31B', + 'UNA' => { + 'ce_sep' => ':', + 'decimal_sign' => '.', + 'de_sep' => '+', + 'seg_term' => '\'', + 'rep_sep' => ' ', + 'esc_char' => '?' + }, + 'header' => [ + 'UNB', + { + 'S003' => { + '0007' => '31B', + '0010' => '123EVER' + }, + 'S004' => { + '0017' => 100622, + '0019' => 1004 + }, + 'S001' => { + '0002' => 3, + '0001' => 'UNOC' + }, + 'S002' => { + '0004' => '1556150', + '0007' => '31B' + }, + '0020' => '03' + } + ] +}; diff --git a/Open-ILS/tests/datasets/edi_scratch/baker_taylor.ordrsp.jedi.pl b/Open-ILS/tests/datasets/edi_scratch/baker_taylor.ordrsp.jedi.pl new file mode 100644 index 0000000000..6e2c62e87f --- /dev/null +++ b/Open-ILS/tests/datasets/edi_scratch/baker_taylor.ordrsp.jedi.pl @@ -0,0 +1,457 @@ +=doc + +UNA:+.? 'UNB+UNOC:3+1556150:31B+123EVER:31B+100622:1004+03'UNG+ORDRSP+1556150:31B+123EVER:31B+100622:1004+38+UN+D 'UNH+03+ORDRSP:D:96A:UN'BGM+231+071678+29+AC'DTM+137:20100622:102'RFF+ON:8'NAD+BY+123EVER::9'NAD+BY+123EVER 0001::91'CUX+2:USD:9'LIN+1+5+9780446360272:EN'IMD+F+BST+:::NOT APPLIC WEBSTERS NEW WORLD THESA'QTY+21:10'QTY+12:10'QTY+85:0'FTX+LIN++01:8B:28'PRI+AAB:4.5::SRP'RFF+LI:8/1'LIN+2+5+9780446357197:EN'IMD+F+BST+:::COLLINS, J WORLD IS FULL OF DIVORCE'QTY+21:8'QTY+12:8'QTY+85:0'FTX+LIN++01:8B:28'PRI+AAB:6.5::SRP'RFF+LI:8/2'LIN+3+5+9780446350105:EN'IMD+F+BST+:::SHELDON, S WINDMILLS OF THE GODS'QTY+21:5'QTY+12:5'QTY+85:0'FTX+LIN++01:8B:28'PRI+AAB:6.99::SRP'RFF+LI:8/3'UNS+S'CNT+2:3'UNT+34+03'UNE+1+38'UNZ+1+03' + +=cut + +# edi2json Response: +$VAR1 = { + 'body' => [ + { + 'ORDRSP' => [ + [ + 'UNH', + { + '0062' => '03', + 'S009' => { + '0051' => 'UN', + '0052' => 'D', + '0065' => 'ORDRSP', + '0054' => '96A' + } + } + ], + [ + 'BGM', + { + '1004' => '071678', + '4343' => 'AC', + '1225' => '29', + 'C002' => { + '1001' => '231' + } + } + ], + [ + 'DTM', + { + 'C507' => { + '2005' => '137', + '2379' => '102', + '2380' => '20100622' + } + } + ], + [ + 'SG1', + [ + [ + 'RFF', + { + 'C506' => { + '1154' => '8', + '1153' => 'ON' + } + } + ] + ] + ], + [ + 'SG3', + [ + [ + 'NAD', + { + 'C082' => { + '3039' => '123EVER', + '3055' => '9' + }, + '3035' => 'BY' + } + ] + ] + ], + [ + 'SG3', + [ + [ + 'NAD', + { + 'C082' => { + '3039' => '123EVER 0001', + '3055' => '91' + }, + '3035' => 'BY' + } + ] + ] + ], + [ + 'SG8', + [ + [ + 'CUX', + { + 'C504' => [ + { + '6345' => 'USD', + '6343' => '9', + '6347' => '2' + } + ] + } + ] + ] + ], + [ + 'SG26', + [ + [ + 'LIN', + { + '1229' => '5', + '1082' => 1, + 'C212' => { + '7140' => '9780446360272', + '7143' => 'EN' + } + } + ], + [ + 'IMD', + { + '7081' => 'BST', + '7077' => 'F', + 'C273' => { + '7008' => [ + 'NOT APPLIC WEBSTERS NEW WORLD THESA' + ] + } + } + ], + [ + 'QTY', + { + 'C186' => { + '6063' => '21', + '6060' => 10 + } + } + ], + [ + 'QTY', + { + 'C186' => { + '6063' => '12', + '6060' => 10 + } + } + ], + [ + 'QTY', + { + 'C186' => { + '6063' => '85', + '6060' => 0 + } + } + ], + [ + 'FTX', + { + '4451' => 'LIN', + 'C107' => { + '4441' => '01', + '3055' => '28', + '1131' => '8B' + } + } + ], + [ + 'SG30', + [ + [ + 'PRI', + { + 'C509' => { + '5118' => '4.5', + '5387' => 'SRP', + '5125' => 'AAB' + } + } + ] + ] + ], + [ + 'SG31', + [ + [ + 'RFF', + { + 'C506' => { + '1154' => '8/1', + '1153' => 'LI' + } + } + ] + ] + ] + ] + ], + [ + 'SG26', + [ + [ + 'LIN', + { + '1229' => '5', + '1082' => 2, + 'C212' => { + '7140' => '9780446357197', + '7143' => 'EN' + } + } + ], + [ + 'IMD', + { + '7081' => 'BST', + '7077' => 'F', + 'C273' => { + '7008' => [ + 'COLLINS, J WORLD IS FULL OF DIVORCE' + ] + } + } + ], + [ + 'QTY', + { + 'C186' => { + '6063' => '21', + '6060' => 8 + } + } + ], + [ + 'QTY', + { + 'C186' => { + '6063' => '12', + '6060' => 8 + } + } + ], + [ + 'QTY', + { + 'C186' => { + '6063' => '85', + '6060' => 0 + } + } + ], + [ + 'FTX', + { + '4451' => 'LIN', + 'C107' => { + '4441' => '01', + '3055' => '28', + '1131' => '8B' + } + } + ], + [ + 'SG30', + [ + [ + 'PRI', + { + 'C509' => { + '5118' => '6.5', + '5387' => 'SRP', + '5125' => 'AAB' + } + } + ] + ] + ], + [ + 'SG31', + [ + [ + 'RFF', + { + 'C506' => { + '1154' => '8/2', + '1153' => 'LI' + } + } + ] + ] + ] + ] + ], + [ + 'SG26', + [ + [ + 'LIN', + { + '1229' => '5', + '1082' => 3, + 'C212' => { + '7140' => '9780446350105', + '7143' => 'EN' + } + } + ], + [ + 'IMD', + { + '7081' => 'BST', + '7077' => 'F', + 'C273' => { + '7008' => [ + 'SHELDON, S WINDMILLS OF THE GODS' + ] + } + } + ], + [ + 'QTY', + { + 'C186' => { + '6063' => '21', + '6060' => 5 + } + } + ], + [ + 'QTY', + { + 'C186' => { + '6063' => '12', + '6060' => 5 + } + } + ], + [ + 'QTY', + { + 'C186' => { + '6063' => '85', + '6060' => 0 + } + } + ], + [ + 'FTX', + { + '4451' => 'LIN', + 'C107' => { + '4441' => '01', + '3055' => '28', + '1131' => '8B' + } + } + ], + [ + 'SG30', + [ + [ + 'PRI', + { + 'C509' => { + '5118' => '6.99', + '5387' => 'SRP', + '5125' => 'AAB' + } + } + ] + ] + ], + [ + 'SG31', + [ + [ + 'RFF', + { + 'C506' => { + '1154' => '8/3', + '1153' => 'LI' + } + } + ] + ] + ] + ] + ], + [ + 'UNS', + { + '0081' => 'S' + } + ], + [ + 'CNT', + { + 'C270' => { + '6066' => 3, + '6069' => '2' + } + } + ], + [ + 'UNT', + { + '0062' => '03', + '0074' => 34 + } + ] + ] + } + ], + 'trailer' => [ + 'UNZ', + { + '0036' => 1, + '0020' => '03' + } + ], + 'recipient' => '123EVER', + 'sender' => '1556150', + 'recipient_qual' => '31B', + 'sender_qual' => '31B', + 'UNA' => { + 'ce_sep' => ':', + 'decimal_sign' => '.', + 'de_sep' => '+', + 'seg_term' => '\'', + 'rep_sep' => ' ', + 'esc_char' => '?' + }, + 'header' => [ + 'UNB', + { + 'S003' => { + '0007' => '31B', + '0010' => '123EVER' + }, + 'S004' => { + '0017' => 100622, + '0019' => 1004 + }, + 'S001' => { + '0002' => 3, + '0001' => 'UNOC' + }, + 'S002' => { + '0004' => '1556150', + '0007' => '31B' + }, + '0020' => '03' + } + ] +}; diff --git a/Open-ILS/tests/datasets/edi_scratch/baker_taylor.ordrsp.jedi.tidy.pl b/Open-ILS/tests/datasets/edi_scratch/baker_taylor.ordrsp.jedi.tidy.pl new file mode 100644 index 0000000000..f3b2fd9b23 --- /dev/null +++ b/Open-ILS/tests/datasets/edi_scratch/baker_taylor.ordrsp.jedi.tidy.pl @@ -0,0 +1,448 @@ + +=doc + +UNA:+.? 'UNB+UNOC:3+1556150:31B+123EVER:31B+100622:1004+03'UNG+ORDRSP+1556150:31B+123EVER:31B+100622:1004+38+UN+D 'UNH+03+ORDRSP:D:96A:UN'BGM+231+071678+29+AC'DTM+137:20100622:102'RFF+ON:8'NAD+BY+123EVER::9'NAD+BY+123EVER 0001::91'CUX+2:USD:9'LIN+1+5+9780446360272:EN'IMD+F+BST+:::NOT APPLIC WEBSTERS NEW WORLD THESA'QTY+21:10'QTY+12:10'QTY+85:0'FTX+LIN++01:8B:28'PRI+AAB:4.5::SRP'RFF+LI:8/1'LIN+2+5+9780446357197:EN'IMD+F+BST+:::COLLINS, J WORLD IS FULL OF DIVORCE'QTY+21:8'QTY+12:8'QTY+85:0'FTX+LIN++01:8B:28'PRI+AAB:6.5::SRP'RFF+LI:8/2'LIN+3+5+9780446350105:EN'IMD+F+BST+:::SHELDON, S WINDMILLS OF THE GODS'QTY+21:5'QTY+12:5'QTY+85:0'FTX+LIN++01:8B:28'PRI+AAB:6.99::SRP'RFF+LI:8/3'UNS+S'CNT+2:3'UNT+34+03'UNE+1+38'UNZ+1+03' + +=cut + +# edi2json Response: +$VAR1 = { + 'body' => [ + { + 'ORDRSP' => [ + [ + 'UNH', + { + '0062' => '03', + 'S009' => { + '0051' => 'UN', + '0052' => 'D', + '0065' => 'ORDRSP', + '0054' => '96A' + } + } + ], + [ + 'BGM', + { + '1004' => '071678', + '4343' => 'AC', + '1225' => '29', + 'C002' => { '1001' => '231' } + } + ], + [ + 'DTM', + { + 'C507' => { + '2005' => '137', + '2379' => '102', + '2380' => '20100622' + } + } + ], + [ + 'SG1', + [ + [ + 'RFF', + { + 'C506' => { + '1154' => '8', + '1153' => 'ON' + } + } + ] + ] + ], + [ + 'SG3', + [ + [ + 'NAD', + { + 'C082' => { + '3039' => '123EVER', + '3055' => '9' + }, + '3035' => 'BY' + } + ] + ] + ], + [ + 'SG3', + [ + [ + 'NAD', + { + 'C082' => { + '3039' => '123EVER 0001', + '3055' => '91' + }, + '3035' => 'BY' + } + ] + ] + ], + [ + 'SG8', + [ + [ + 'CUX', + { + 'C504' => [ + { + '6345' => 'USD', + '6343' => '9', + '6347' => '2' + } + ] + } + ] + ] + ], + [ + 'SG26', + [ + [ + 'LIN', + { + '1229' => '5', + '1082' => 1, + 'C212' => { + '7140' => '9780446360272', + '7143' => 'EN' + } + } + ], + [ + 'IMD', + { + '7081' => 'BST', + '7077' => 'F', + 'C273' => { + '7008' => + [ 'NOT APPLIC WEBSTERS NEW WORLD THESA' ] + } + } + ], + [ + 'QTY', + { + 'C186' => { + '6063' => '21', + '6060' => 10 + } + } + ], + [ + 'QTY', + { + 'C186' => { + '6063' => '12', + '6060' => 10 + } + } + ], + [ + 'QTY', + { + 'C186' => { + '6063' => '85', + '6060' => 0 + } + } + ], + [ + 'FTX', + { + '4451' => 'LIN', + 'C107' => { + '4441' => '01', + '3055' => '28', + '1131' => '8B' + } + } + ], + [ + 'SG30', + [ + [ + 'PRI', + { + 'C509' => { + '5118' => '4.5', + '5387' => 'SRP', + '5125' => 'AAB' + } + } + ] + ] + ], + [ + 'SG31', + [ + [ + 'RFF', + { + 'C506' => { + '1154' => '8/1', + '1153' => 'LI' + } + } + ] + ] + ] + ] + ], + [ + 'SG26', + [ + [ + 'LIN', + { + '1229' => '5', + '1082' => 2, + 'C212' => { + '7140' => '9780446357197', + '7143' => 'EN' + } + } + ], + [ + 'IMD', + { + '7081' => 'BST', + '7077' => 'F', + 'C273' => { + '7008' => + [ 'COLLINS, J WORLD IS FULL OF DIVORCE' ] + } + } + ], + [ + 'QTY', + { + 'C186' => { + '6063' => '21', + '6060' => 8 + } + } + ], + [ + 'QTY', + { + 'C186' => { + '6063' => '12', + '6060' => 8 + } + } + ], + [ + 'QTY', + { + 'C186' => { + '6063' => '85', + '6060' => 0 + } + } + ], + [ + 'FTX', + { + '4451' => 'LIN', + 'C107' => { + '4441' => '01', + '3055' => '28', + '1131' => '8B' + } + } + ], + [ + 'SG30', + [ + [ + 'PRI', + { + 'C509' => { + '5118' => '6.5', + '5387' => 'SRP', + '5125' => 'AAB' + } + } + ] + ] + ], + [ + 'SG31', + [ + [ + 'RFF', + { + 'C506' => { + '1154' => '8/2', + '1153' => 'LI' + } + } + ] + ] + ] + ] + ], + [ + 'SG26', + [ + [ + 'LIN', + { + '1229' => '5', + '1082' => 3, + 'C212' => { + '7140' => '9780446350105', + '7143' => 'EN' + } + } + ], + [ + 'IMD', + { + '7081' => 'BST', + '7077' => 'F', + 'C273' => { + '7008' => + [ 'SHELDON, S WINDMILLS OF THE GODS' ] + } + } + ], + [ + 'QTY', + { + 'C186' => { + '6063' => '21', + '6060' => 5 + } + } + ], + [ + 'QTY', + { + 'C186' => { + '6063' => '12', + '6060' => 5 + } + } + ], + [ + 'QTY', + { + 'C186' => { + '6063' => '85', + '6060' => 0 + } + } + ], + [ + 'FTX', + { + '4451' => 'LIN', + 'C107' => { + '4441' => '01', + '3055' => '28', + '1131' => '8B' + } + } + ], + [ + 'SG30', + [ + [ + 'PRI', + { + 'C509' => { + '5118' => '6.99', + '5387' => 'SRP', + '5125' => 'AAB' + } + } + ] + ] + ], + [ + 'SG31', + [ + [ + 'RFF', + { + 'C506' => { + '1154' => '8/3', + '1153' => 'LI' + } + } + ] + ] + ] + ] + ], + [ 'UNS', { '0081' => 'S' } ], + [ + 'CNT', + { + 'C270' => { + '6066' => 3, + '6069' => '2' + } + } + ], + [ + 'UNT', + { + '0062' => '03', + '0074' => 34 + } + ] + ] + } + ], + 'trailer' => [ + 'UNZ', + { + '0036' => 1, + '0020' => '03' + } + ], + 'recipient' => '123EVER', + 'sender' => '1556150', + 'recipient_qual' => '31B', + 'sender_qual' => '31B', + 'UNA' => { + 'ce_sep' => ':', + 'decimal_sign' => '.', + 'de_sep' => '+', + 'seg_term' => '\'', + 'rep_sep' => ' ', + 'esc_char' => '?' + }, + 'header' => [ + 'UNB', + { + 'S003' => { + '0007' => '31B', + '0010' => '123EVER' + }, + 'S004' => { + '0017' => 100622, + '0019' => 1004 + }, + 'S001' => { + '0002' => 3, + '0001' => 'UNOC' + }, + 'S002' => { + '0004' => '1556150', + '0007' => '31B' + }, + '0020' => '03' + } + ] +}; diff --git a/Open-ILS/tests/datasets/edi_scratch/baker_taylor.ordrsp.jedi2 b/Open-ILS/tests/datasets/edi_scratch/baker_taylor.ordrsp.jedi2 new file mode 100644 index 0000000000..ddf0fe3101 --- /dev/null +++ b/Open-ILS/tests/datasets/edi_scratch/baker_taylor.ordrsp.jedi2 @@ -0,0 +1,406 @@ +// ID: 338 + +done +$VAR1 = { + 'body' => [ + { + 'ORDRSP' => [ + ['UNH', + { + '0062' => '05', + 'S009' => { + '0051' => 'UN', + '0052' => 'D', + '0065' => 'ORDRSP', + '0054' => '96A' + } + } + ], + ['BGM', + { + '1004' => '071681', + '4343' => 'AC', + '1225' => '29', + 'C002' => { + '1001' => '231' + } + } + ], + ['DTM', + { + 'C507' => { + '2005' => '137', + '2379' => '102', + '2380' => '20100622' + } + } + ], + ['SG1', + [['RFF', + { + 'C506' => { + '1154' => '8', + '1153' => 'ON' + } + } + ] + ] + ], + ['SG3', + [['NAD', + { + 'C082' => { + '3039' => '123EVER', + '3055' => '9' + }, + '3035' => 'BY' + } + ] + ] + ], + ['SG3', + [['NAD', + { + 'C082' => { + '3039' => '1556150', + '3055' => '9' + }, + '3035' => 'SU' + } + ] + ] + ], + ['SG3', + [['NAD', + { + 'C082' => { + '3039' => '123EVER 0001', + '3055' => '91' + }, + '3035' => 'BY' + } + ] + ] + ], + ['SG8', + [['CUX', + { + 'C504' => [ + { + '6345' => 'USD', + '6343' => '9', + '6347' => '2' + } + ] + } + ] + ] + ], + ['SG26', + [['LIN', + { + '1229' => '5', + '1082' => 1, + 'C212' => { + '7140' => '9780446360272', + '7143' => 'EN' + } + } + ], + ['IMD', + { + '7081' => 'BST', + '7077' => 'F', + 'C273' => { + '7008' => [ + 'NOT APPLIC WEBSTERS NEW WORLD THESA' + ] + } + } + ], + ['QTY', + { + 'C186' => { + '6063' => '21', + '6060' => 10 + } + } + ], + ['QTY', + { + 'C186' => { + '6063' => '12', + '6060' => 10 + } + } + ], + ['QTY', + { + 'C186' => { + '6063' => '85', + '6060' => 0 + } + } + ], + ['FTX', + { + '4451' => 'LIN', + 'C107' => { + '4441' => '01', + '3055' => '28', + '1131' => '8B' + } + } + ], + ['SG30', + [['PRI', + { + 'C509' => { + '5118' => '4.5', + '5387' => 'SRP', + '5125' => 'AAB' + } + } + ] + ] + ], + ['SG31', + [['RFF', + { + 'C506' => { + '1154' => '8/1', + '1153' => 'LI' + } + } + ] + ] + ] + ] + ], + ['SG26', + [['LIN', + { + '1229' => '5', + '1082' => 2, + 'C212' => { + '7140' => '9780446357197', + '7143' => 'EN' + } + } + ], + ['IMD', + { + '7081' => 'BST', + '7077' => 'F', + 'C273' => { + '7008' => [ + 'COLLINS, J WORLD IS FULL OF DIVORCE' + ] + } + } + ], + ['QTY', + { + 'C186' => { + '6063' => '21', + '6060' => 8 + } + } + ], + ['QTY', + { + 'C186' => { + '6063' => '12', + '6060' => 8 + } + } + ], + ['QTY', + { + 'C186' => { + '6063' => '85', + '6060' => 0 + } + } + ], + ['FTX', + { + '4451' => 'LIN', + 'C107' => { + '4441' => '01', + '3055' => '28', + '1131' => '8B' + } + } + ], + ['SG30', + [['PRI', + { + 'C509' => { + '5118' => '6.5', + '5387' => 'SRP', + '5125' => 'AAB' + } + } + ] + ] + ], + ['SG31', + [['RFF', + { + 'C506' => { + '1154' => '8/2', + '1153' => 'LI' + } + } + ] + ] + ] + ] + ], + ['SG26', + [['LIN', + { + '1229' => '5', + '1082' => 3, + 'C212' => { + '7140' => '9780446350105', + '7143' => 'EN' + } + } + ], + ['IMD', + { + '7081' => 'BST', + '7077' => 'F', + 'C273' => { + '7008' => [ + 'SHELDON, S WINDMILLS OF THE GODS' + ] + } + } + ], + ['QTY', + { + 'C186' => { + '6063' => '21', + '6060' => 5 + } + } + ], + ['QTY', + { + 'C186' => { + '6063' => '12', + '6060' => 5 + } + } + ], + ['QTY', + { + 'C186' => { + '6063' => '85', + '6060' => 0 + } + } + ], + ['FTX', + { + '4451' => 'LIN', + 'C107' => { + '4441' => '01', + '3055' => '28', + '1131' => '8B' + } + } + ], + ['SG30', + [['PRI', + { + 'C509' => { + '5118' => '6.99', + '5387' => 'SRP', + '5125' => 'AAB' + } + } + ] + ] + ], + ['SG31', + [['RFF', + { + 'C506' => { + '1154' => '8/3', + '1153' => 'LI' + } + } + ] + ] + ] + ] + ], + ['UNS', + { + '0081' => 'S' + } + ], + ['CNT', + { + 'C270' => { + '6066' => 3, + '6069' => '2' + } + } + ], + ['UNT', + { + '0062' => '05', + '0074' => 35 + } + ] + ] + } + ], + 'trailer' => [ + 'UNZ', + { + '0036' => 1, + '0020' => '05' + } + ], + 'recipient' => '123EVER', + 'sender' => '1556150', + 'recipient_qual' => '31B', + 'sender_qual' => '31B', + 'UNA' => { + 'ce_sep' => ':', + 'decimal_sign' => '.', + 'de_sep' => '+', + 'seg_term' => '\'', + 'rep_sep' => ' ', + 'esc_char' => '?' + }, + 'header' => [ + 'UNB', + { + 'S003' => { + '0007' => '31B', + '0010' => '123EVER' + }, + 'S004' => { + '0017' => 100707, + '0019' => 941 + }, + 'S001' => { + '0002' => 3, + '0001' => 'UNOC' + }, + 'S002' => { + '0004' => '1556150', + '0007' => '31B' + }, + '0020' => '05' + } + ] +}; + diff --git a/Open-ILS/tests/datasets/edi_scratch/brodart_001_edi.tst b/Open-ILS/tests/datasets/edi_scratch/brodart_001_edi.tst new file mode 100644 index 0000000000..62f5ebdc0c --- /dev/null +++ b/Open-ILS/tests/datasets/edi_scratch/brodart_001_edi.tst @@ -0,0 +1 @@ +UNA:+.? 'UNB+UNOB:3+9999867:31B+1697684:31B+100811:1927+1'UNH+1+ORDERS:D:96A:UN'BGM+220+15+9'DTM+137:20100811:102'NAD+BY+9999867 0001::91'NAD+SU+1697684::31B'NAD+SU+7::92'CUX+2:USD:9'LIN+81++0743294394:IB'PIA+5+0743294394:IB+81:SA'IMD+F+BTI+:::206 BONES'IMD+F+BPU+:::Scribner'IMD+F+BPD+:::2009-08-01'QTY+21:4'PRI+AAB:0'RFF+LI:15/81'LIN+80++1598883275:IB'PIA+5+1598883275:IB+80:SA'IMD+F+BTI+:::COUNTY AND CITY EXTRA'IMD+F+BPU+:::Bernan Press'IMD+F+BPD+:::2009-07-01'QTY+21:4'PRI+AAB:0'RFF+LI:15/80'LIN+79++1590203097:IB'PIA+5+1590203097:IB+79:SA'IMD+F+BTI+:::2017'IMD+F+BPU+:::Overlook Pr'IMD+F+BPD+:::2010-03-01'QTY+21:4'PRI+AAB:0'RFF+LI:15/79'LIN+78++1598884093:IB'PIA+5+1598884093:IB+78:SA'IMD+F+BTI+:::COUNTY AND CITY EXTRA'IMD+F+BPU+:::Bernan Press'IMD+F+BPD+:::2010-07-01'QTY+21:4'PRI+AAB:0'RFF+LI:15/78'UNS+S'CNT+2:4'UNT+42+1'UNZ+1+1' diff --git a/Open-ILS/tests/datasets/edi_scratch/edi_splitter.pl b/Open-ILS/tests/datasets/edi_scratch/edi_splitter.pl new file mode 100755 index 0000000000..354bd6bb6c --- /dev/null +++ b/Open-ILS/tests/datasets/edi_scratch/edi_splitter.pl @@ -0,0 +1,26 @@ +#!/usr/bin/perl +# +# +# Purpose here is to break up EDI messages to make them more readable +# (i.e., not all on one line). +# + +use warnings; +use strict; + + +my @unindented = qw( LIN BGM ); + +my $delim = "'"; +while (my $line = <>) { + foreach (split $delim, $line) { + '+' eq substr($_,3,1) or warn "Line $. missing '+' delimiter as 4th character: $_"; + my $tag = substr($_,0,3) or warn "Line $. Unexpectedly short: $_"; + unless ($tag =~ /^UN\S/ or grep {$_ eq $tag} @unindented) { + print "\t"; + } + print "$_$delim\n"; + } + print '=' x 70, "\n\n"; +} + diff --git a/Open-ILS/tests/datasets/edi_scratch/ftx_test.jedi b/Open-ILS/tests/datasets/edi_scratch/ftx_test.jedi new file mode 100644 index 0000000000..5eeac4106c --- /dev/null +++ b/Open-ILS/tests/datasets/edi_scratch/ftx_test.jedi @@ -0,0 +1,69 @@ + + { + "recipient":"1556150", + "sender":"6666666", + "body": [{ + "ORDERS":[ "order", { + "po_number":8, + "date":"20100610", + "buyer":[{ "id":"6666666" }], + "vendor":[ "1556150", + {"id-qualifier": 92, "id":"8"} + ], + "currency":"USD", + "items":[ + + { + "identifiers":[ + {"id-qualifier":"EN","id":"9780446360272"}, + {"id-qualifier":"SA","id":"57"}, + {"id-qualifier":"IB","id":"0446360279"} + ], + "price":4.50, + "desc":[ + {"BTI":"Webster's new world thesaurus :"}, + {"BPU":"Warner Books, Inc.,"}, + {"BPD":"1990."}, + {"BPH":"xv, 494 p. ;"} + ], + "quantity":8, + // "FTX":[ { "4451": "LIN", "C108": {"4440": "This is a TEST! zzz!"} } ] + "FTX": { "4451": "LIN", "C108": {"4440": "This is a TEST! zzz!"} } + }, + { + "identifiers":[ + {"id-qualifier":"SA","id":"59"}, + {"id-qualifier":"IB","id":"0446831832"}, + {"id-qualifier":"EN","id":"9780446357197"} + ], + "price":7.99, + "desc":[ + {"BTI":"The world is full of divorced women /"}, + {"BPU":"Warner Books,"}, + {"BPD":"c1980."}, + {"BPH":"413 p. ;"} + ], + "quantity":10 + }, + { + "identifiers":[ + {"id-qualifier":"SA","id":"60"}, + {"id-qualifier":"IB","id":"0446350109"}, + {"id-qualifier":"EN","id":"9780446350105"} + ], + "price":8.75, + "desc":[ + {"BTI":"Windmills of the gods /"}, + {"BPU":"Warner Books,"}, + {"BPD":"1988, c1987."}, + {"BPH":"xiii, 434 p. ;"} + ], + "quantity":5 + } + ], + "line_items":3 + }] + }] + } + + diff --git a/Open-ILS/tests/datasets/edi_scratch/ftx_test.output b/Open-ILS/tests/datasets/edi_scratch/ftx_test.output new file mode 100644 index 0000000000..eb260fe008 --- /dev/null +++ b/Open-ILS/tests/datasets/edi_scratch/ftx_test.output @@ -0,0 +1,70 @@ + { + "recipient":"1556150", + "sender":"6666666", + "body": [{ + "ORDERS":[ "order", { + "po_number":8, + "date":"20100610", + "buyer":[{ "id":"6666666" }], + "vendor":[ "1556150", + {"id-qualifier": 92, "id":"8"} + ], + "currency":"USD", + "items":[ + + { + "identifiers":[ + {"id-qualifier":"EN","id":"9780446360272"}, + {"id-qualifier":"SA","id":"57"}, + {"id-qualifier":"IB","id":"0446360279"} + ], + "price":4.50, + "desc":[ + {"BTI":"Webster's new world thesaurus :"}, + {"BPU":"Warner Books, Inc.,"}, + {"BPD":"1990."}, + {"BPH":"xv, 494 p. ;"} + ], + "quantity":8, + "FTX": { "4451": "LIN", "C108": {"4440": "This is a TEST! zzz!"} } + }, + { + "identifiers":[ + {"id-qualifier":"SA","id":"59"}, + {"id-qualifier":"IB","id":"0446831832"}, + {"id-qualifier":"EN","id":"9780446357197"} + ], + "price":7.99, + "desc":[ + {"BTI":"The world is full of divorced women /"}, + {"BPU":"Warner Books,"}, + {"BPD":"c1980."}, + {"BPH":"413 p. ;"} + ], + "quantity":10 + }, + { + "identifiers":[ + {"id-qualifier":"SA","id":"60"}, + {"id-qualifier":"IB","id":"0446350109"}, + {"id-qualifier":"EN","id":"9780446350105"} + ], + "price":8.75, + "desc":[ + {"BTI":"Windmills of the gods /"}, + {"BPU":"Warner Books,"}, + {"BPD":"1988, c1987."}, + {"BPH":"xiii, 434 p. ;"} + ], + "quantity":5 + } + ], + "line_items":3 + }] + }] + } + + + +# json2edi Response: +$VAR1 = bless( do{\(my $o = 'UNA:+.? \'UNB+UNOB:3+6666666:31B+1556150:31B+100812:2026+1\'UNH+1+ORDERS:D:96A:UN\'BGM+220+8+9\'DTM+137:20100610:102\'NAD+BY+6666666::31B\'NAD+SU+1556150::31B\'NAD+SU+8::92\'CUX+2:USD:9\'LIN+1++9780446360272:EN\'PIA+5+9780446360272:EN+57:SA+0446360279:IB\'IMD+F+BTI+:::Webster?\'s new world thesaurus ?:\'IMD+F+BPU+:::Warner Books, Inc.,\'IMD+F+BPD+:::1990.\'IMD+F+BPH+:::xv, 494 p. ;\'QTY+21:8\'PRI+AAB:4.5\'RFF+LI:8/1\'LIN+2++59:SA\'PIA+5+59:SA+0446831832:IB+9780446357197:EN\'IMD+F+BTI+:::The world is full of divorced women: /\'IMD+F+BPU+:::Warner Books,\'IMD+F+BPD+:::c1980.\'IMD+F+BPH+:::413 p. ;\'QTY+21:10\'PRI+AAB:7.99\'RFF+LI:8/2\'LIN+3++60:SA\'PIA+5+60:SA+0446350109:IB+9780446350105:EN\'IMD+F+BTI+:::Windmills of the gods /\'IMD+F+BPU+:::Warner Books,\'IMD+F+BPD+:::1988, c1987.\'IMD+F+BPH+:::xiii, 434 p. ;\'QTY+21:5\'PRI+AAB:8.75\'RFF+LI:8/3\'UNS+S\'CNT+2:3\'UNT+37+1\'UNZ+1+1\'')}, 'RPC::XML::string' ); diff --git a/Open-ILS/tests/datasets/edi_scratch/ruby_json2edi.orders b/Open-ILS/tests/datasets/edi_scratch/ruby_json2edi.orders new file mode 100644 index 0000000000..c8fd174da2 --- /dev/null +++ b/Open-ILS/tests/datasets/edi_scratch/ruby_json2edi.orders @@ -0,0 +1,75 @@ + +{ + "recipient":"1556150", + "sender":"6666666", + "body": [{ + "ORDERS":[ "order", { + "po_number":8, + "date":"20100621", + "buyer":[{ "id":"6666666 0001", + "id-qualifier": 91 }], + "vendor":[ "1556150", + {"id-qualifier": 92, "id":"8"} + ], + "currency":"USD", + "items":[ + + { + "identifiers":[ + {"id-qualifier":"EN","id":"9780446360272"}, + + {"id-qualifier":"IB","id":"0446360279"}, + + {"id-qualifier":"SA","id":"57"} + ], + "price":4.50, + "desc":[ + {"BTI":"Webster's new world thesaurus :"}, + {"BPU":"Warner Books, Inc.,"}, + {"BPD":"1990."}, + {"BPH":"xv, 494 p. ;"} + ], + "quantity":10 + }, + { + "identifiers":[ + {"id-qualifier":"EN","id":"9780446357197"}, + + {"id-qualifier":"IB","id":"0446357197"}, + {"id-qualifier":"IB","id":"0446831832"}, + {"id-qualifier":"EN","id":"9780446831833"}, + + + {"id-qualifier":"SA","id":"59"} + ], + "price":7.99, + "desc":[ + {"BTI":"The world is full of divorced women /"}, + {"BPU":"Warner Books,"}, + {"BPD":"c1980."}, + {"BPH":"413 p. ;"} + ], + "quantity":8 + }, + { + "identifiers":[ + {"id-qualifier":"EN","id":"9780446350105"}, + + {"id-qualifier":"IB","id":"0446350109"}, + + {"id-qualifier":"SA","id":"60"} + ], + "price":8.75, + "desc":[ + {"BTI":"Windmills of the gods /"}, + {"BPU":"Warner Books,"}, + {"BPD":"1988, c1987."}, + {"BPH":"xiii, 434 p. ;"} + ], + "quantity":5 + } + ], + "line_items":3 + }] + }] +} diff --git a/Open-ILS/tests/datasets/edi_scratch/zBFqgVwJ7l.orders.edi b/Open-ILS/tests/datasets/edi_scratch/zBFqgVwJ7l.orders.edi new file mode 100644 index 0000000000..db1d954fa1 --- /dev/null +++ b/Open-ILS/tests/datasets/edi_scratch/zBFqgVwJ7l.orders.edi @@ -0,0 +1 @@ +UNA:+.? 'UNB+UNOB:3+123EVER:31B+1556150:31B+100804:1504+1'UNH+1+ORDERS:D:96A:UN'BGM+220+9+9'DTM+137:20100804:102'NAD+BY+123EVER 0001::91'NAD+SU+1556150::31B'NAD+SU+8::92'CUX+2:USD:9'LIN+61++9787777777777:EN'PIA+5+9787777777777:EN+61:SA'IMD+F+BTI+:::Fake Book'QTY+21:3'PRI+AAB:5'RFF+LI:9/61'LIN+63++9781591430476:EN'PIA+5+9781591430476:EN+159143047X:IB+63:SA'IMD+F+BTI+:::Merlin and the discovery of Avalon :in the New World /'IMD+F+BPU+:::Bear & Co.,'IMD+F+BPD+:::c2005.'IMD+F+BPH+:::vi, 231, [14] p. of plates ?:'QTY+21:5'PRI+AAB:7'RFF+LI:9/63'LIN+62++9780446310062:EN'PIA+5+9780446310062:EN+0446310069:IB+0446313033:IB+9780446313032:EN+0446314129:IB'PIA+5+9780446314121:EN+62:SA'IMD+F+BTI+:::Shroud for a nightingale /'IMD+F+BPU+:::Warner Books,'IMD+F+BPD+:::1982, c1971.'IMD+F+BPH+:::287 p. ;'QTY+21:10'PRI+AAB:8'RFF+LI:9/62'UNS+S'CNT+2:3'UNT+35+1'UNZ+1+1' diff --git a/Open-ILS/web/templates/default/conify/global/acq/edi_account.tt2 b/Open-ILS/web/templates/default/conify/global/acq/edi_account.tt2 index 4854e8c338..d060031788 100644 --- a/Open-ILS/web/templates/default/conify/global/acq/edi_account.tt2 +++ b/Open-ILS/web/templates/default/conify/global/acq/edi_account.tt2 @@ -1,4 +1,5 @@ [% WRAPPER default/base.tt2 %] +[% ctx.page_title = 'EDI Accounts' %]