Business-EDI

 view release on metacpan or  search on metacpan

t/020-Message-ORDRSP.t  view on Meta::CPAN

                "EDI segment $tag/S009/0051 designates 'UN' as controlling agency"
            );
        } elsif ($tag eq 'BGM') {
            my ($bgm, $msgtype, $codelist);
            $debug and print "BGM_dump: ", Dumper($segbody);
            ok( $bgm = Business::EDI::Segment::BGM->new($segbody), "Business::EDI::Segment::BGM->new");
            ok( $codelist = $bgm->part4343, "Business::EDI::Segment::BGM->new(...)->seg4343->codelist");
            ok( $msgtype = Business::EDI->codelist('ResponseTypeCode', $segbody->{4343}),
                sprintf("Business::EDI->codelist('ResponseTypeCode', \$X): $tag/4343 Response Type Code '%s' recognized", ($segbody->{4343} || ''))
            );
            is($msgtype->label, $bgm->seg4343->label, "Different constructor paths, same label");
            is($msgtype->value, $bgm->seg4343->value, "Different constructor paths, same value");
            is($msgtype->desc,  $bgm->seg4343->desc,  "Different constructor paths, same description"); 
            my $seg4343 = $bgm->seg4343;
            $debug and print 'ResponseTypeCode dump: ', Dumper($msgtype);
            $debug and print 'bgm->seg4343     dump: ', Dumper($seg4343);
            note(sprintf "Business::EDI->codelist('ResponseTypeCode', \$X): $tag/4343 response type: %s - %s (%s)", $msgtype->value, $msgtype->label, $msgtype->desc);
            note(sprintf "Business::EDI::Segment::BGM->new(...)->seg4343\ : $tag/4343 response type: %s - %s (%s)", $seg4343->value, $seg4343->label, $seg4343->desc);
            my $fcn = $bgm->seg1225;
            return unless ok( $fcn, 
                sprintf "EDI $tag/1225 Message Function Code '%s' is recognized", ($segbody->{1225} || ''));
        } elsif ($tag =~ /^SG\d+$/) {
            my $lin;
            ok($lin = $edi->segment_group("ORDERS/$tag", $segbody), "ORDERS/$tag object via \$edi->segment_group");
            $tag eq 'SG26' or next;     # we'll do the above constructor test for all, but the rest are for SG26
            $lin or next;
            # my @qty = $lin->xpath('all_QTY');   # $lin->all_QTY doesn't work
            # is(scalar(@qty), 5, "all_QTY returns 5 QTY objects") or print join(" ", $lin->part_keys), "\n";;
            my @chunks = @{$segbody};
            my $count = scalar(@chunks);
            foreach (@chunks) {
                my $label = $_->[0];
                my $body  = $_->[1];
                $label eq 'SG31' or next;
                foreach my $sg31 (@$body) {
                    my $one = $sg31->[0];
                    my $two = $sg31->[1];
                    $one eq 'RFF' or next;
                    my $obj;
                    ok($obj = $edi->segment('RFF', $two),    "ORDERS/$tag/$label/$one converts to an object");
                    my $compare = Business::EDI::Segment::RFF->new($two);
                    $compare->spec($obj->spec);  # force the spec to be the same
                    is_deeply($compare, $obj, "ORDERS/$tag/$label/$one matching constructors");
                    
                    ok($obj->partC506->seg1153,              "ORDERS/$tag/$label/$one/C506/seg1153 exists");
                    is($obj->partC506->seg1153->value, 'LI', "ORDERS/$tag/$label/$one/C506/seg1153 has value ('LI')") or print Dumper($obj->partC506->seg1153);
                    ok($obj->part1153,                       "ORDERS/$tag/$label/$one/part1153 exists (collapsable Composite)") or print "OBJ: " . Dumper($obj);
                    is($obj->part1153->value,          'LI', "ORDERS/$tag/$label/$one/part1153 has value ('LI') (collapsable Composite)") or print Dumper($obj->seg1153);
                }
            }
            # print Dumper($segbody); exit;
            push @lins, \@chunks;
        } else {
            # note("EDI: ignoring segment '$tag'");
        }
    }
    return @lins;
}

ok($perl = ordrsp_data(), "DATA handle read and decode" );
$perl or die "DATA handle not read and decoded successfully";

$Data::Dumper::Indent = 1;

ok($perl->{body},      "EDI interchange body");
ok($perl->{body}->[0], "EDI interchange body is a populated arrayref!");
is(scalar(@{$perl->{body}}), 3, "EDI interchange body has 3 messages");

my @li = ();
my $i = 0;
foreach my $part (@{$perl->{body}}) {
    $i++;
    next unless ok((ref $part and scalar keys %$part), "EDI interchange message $i has structure.");
    foreach my $key (keys %$part) {
        next unless ok($key eq 'ORDRSP', "EDI interchange message $i type == ORDRSP");
        my @li_chunk = parse_ordrsp($part->{$key});
        note("EDI $key parsing returned " . scalar(@li_chunk) . " line items");
        push @li, @li_chunk;
    }
}


my @rffs = ();
my @qtys = ();
foreach (@li) {
   my $count = scalar(@$_);
   is($count, 8, "->{SG26} has 8 pieces: ");
   $debug and note("\t\t" . join ' ', map {$_->[0]} @{$_});
   for (my $i = 0; $i < $count; $i++) {
        my $label = $_->[$i]->[0];
        my $body  = $_->[$i]->[1];
        $label eq 'QTY'  and push @qtys, $body;
        $label eq 'SG31' and push @rffs, $body->[0]->[1];
    }
}

is(scalar(@li  ),  58, " 58 LINs found");
is(scalar(@qtys), 174, "174 QTYs found");
is(scalar(@rffs),  58, " 58 RFFs found (inside LINs)");

# We want: RFF > C506 > 1154 where 1153 = LI
foreach my $rff (@rffs) {
    my $obj = $edi->segment('RFF', $rff);
    ok($obj, '$edi->segment("RFF", ...)');
    # print Dumper ($obj);
    $obj->C506() or next;
    $debug and print "RFF/C506     parts: ", join(", ", $obj->C506->part_keys), "\n";
    foreach my $key ($obj->C506->part_keys) {
        my $subrff = $obj->C506->part($key) or next;
        ok($subrff, "RFF/C506/$key object (via part method)");
        $debug and note("subrff->code: " . $subrff->code);
        $debug and print "RFF/C506/$key parts: ", join(", ", $subrff->part_keys), "\n";
        $debug and print "RFF/C506/$key ", Dumper ($subrff);
        foreach ($subrff->part_keys) {
            ok($subrff->part($_), "RFF/C506/$key/$_");
        }
        # my $x = Business::EDI::DataElement->new($subrff->code, $rff->{$key}->{$subrff->code});
        # my $x = Business::EDI::DataElement->new($subrff->code, $subrff->part($_));
        # print "$_ ", $x->label, " ", $x->value, " ";
        # ok($x, "Business::EDI::DataElement->new(" . $subrff->code() . ", ...)");
    }



( run in 0.938 second using v1.01-cache-2.11-cpan-ceb78f64989 )