Main Koha release repository https://koha-community.org
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

249 lines
5.8 KiB

package Koha::Edifact::Message;
# Copyright 2014,2015 PTFS-Europe Ltd
#
# This file is part of Koha.
#
# Koha is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# Koha is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Koha; if not, see <http://www.gnu.org/licenses>.
use strict;
use warnings;
use utf8;
use Koha::Edifact::Line;
sub new {
my ( $class, $data_array_ref ) = @_;
my $header = shift @{$data_array_ref};
my $bgm = shift @{$data_array_ref};
my $msg_function = $bgm->elem(2);
my $dtm = [];
while ( $data_array_ref->[0]->tag eq 'DTM' ) {
push @{$dtm}, shift @{$data_array_ref};
}
my $self = {
function => $msg_function,
header => $header,
bgm => $bgm,
message_reference_number => $header->elem(0),
dtm => $dtm,
datasegs => $data_array_ref,
};
bless $self, $class;
return $self;
}
sub message_refno {
my $self = shift;
return $self->{message_reference_number};
}
sub function {
my $self = shift;
my $msg_function = $self->{bgm}->elem(2);
if ( $msg_function == 9 ) {
return 'original';
}
elsif ( $msg_function == 7 ) {
return 'retransmission';
}
return;
}
sub message_reference_number {
my $self = shift;
return $self->{header}->elem(0);
}
sub message_type {
my $self = shift;
return $self->{header}->elem( 1, 0 );
}
sub message_code {
my $self = shift;
return $self->{bgm}->elem( 0, 0 );
}
sub docmsg_number {
my $self = shift;
return $self->{bgm}->elem(1);
}
sub message_date {
my $self = shift;
# usually the first if not only dtm
foreach my $d ( @{ $self->{dtm} } ) {
if ( $d->elem( 0, 0 ) eq '137' ) {
return $d->elem( 0, 1 );
}
}
return; # this should not happen
}
sub tax_point_date {
my $self = shift;
if ( $self->message_type eq 'INVOIC' ) {
foreach my $d ( @{ $self->{dtm} } ) {
if ( $d->elem( 0, 0 ) eq '131' ) {
return $d->elem( 0, 1 );
}
}
}
return;
}
sub expiry_date {
my $self = shift;
if ( $self->message_type eq 'QUOTES' ) {
foreach my $d ( @{ $self->{dtm} } ) {
if ( $d->elem( 0, 0 ) eq '36' ) {
return $d->elem( 0, 1 );
}
}
}
return;
}
sub shipment_charge {
my $self = shift;
# A large number of different charges can be expressed at invoice and
# item level but the only one koha takes cognizance of is shipment
# should we wrap all invoice level charges into it??
if ( $self->message_type eq 'INVOIC' ) {
my $delivery = 0;
my $amt = 0;
foreach my $s ( @{ $self->{datasegs} } ) {
if ( $s->tag eq 'LIN' ) {
last;
}
if ( $s->tag eq 'ALC' ) {
if ( $s->elem(0) eq 'C' ) { # Its a charge
if ( $s->elem( 4, 0 ) eq 'DL' ) { # delivery charge
$delivery = 1;
}
}
next;
}
if ( $s->tag eq 'MOA' ) {
$amt += $s->elem( 0, 1 );
}
}
return $amt;
}
return;
}
# return NAD fields
sub buyer_ean {
my $self = shift;
foreach my $s ( @{ $self->{datasegs} } ) {
if ( $s->tag eq 'LIN' ) {
last;
}
if ( $s->tag eq 'NAD' ) {
my $qualifier = $s->elem(0);
if ( $qualifier eq 'BY' ) {
return $s->elem( 1, 0 );
}
}
}
return;
}
sub supplier_ean {
my $self = shift;
foreach my $s ( @{ $self->{datasegs} } ) {
if ( $s->tag eq 'LIN' ) {
last;
}
if ( $s->tag eq 'NAD' ) {
my $qualifier = $s->elem(0);
if ( $qualifier eq 'SU' ) {
return $s->elem( 1, 0 );
}
}
}
return;
}
sub lineitems {
my $self = shift;
if ( $self->{quotation_lines} ) {
return $self->{quotation_lines};
}
else {
my $items = [];
my $item_arr = [];
foreach my $seg ( @{ $self->{datasegs} } ) {
my $tag = $seg->tag;
if ( $tag eq 'LIN' ) {
if ( @{$item_arr} ) {
push @{$items}, Koha::Edifact::Line->new($item_arr);
}
$item_arr = [$seg];
next;
}
elsif ( $tag =~ m/^(UNS|CNT|UNT)$/sxm ) {
if ( @{$item_arr} ) {
push @{$items}, Koha::Edifact::Line->new($item_arr);
}
last;
}
else {
if ( @{$item_arr} ) {
push @{$item_arr}, $seg;
}
}
}
$self->{quotation_lines} = $items;
return $items;
}
}
1;
__END__
=head1 NAME
Koha::Edifact::Message
=head1 DESCRIPTION
Class modelling an Edifact Message for parsing
=head1 METHODS
=head2 new
Passed an array of segments extracts message level info
and parses lineitems as Line objects
=head1 AUTHOR
Colin Campbell <colin.campbell@ptfs-europe.com>
=head1 COPYRIGHT
Copyright 2014,2015 PTFS-Europe Ltd
This program is free software, You may redistribute it under
under the terms of the GNU General Public License
=cut