Line 0
Link Here
|
|
|
1 |
#!/usr/bin/perl |
2 |
|
3 |
# Test for RFF+ON (Purchase Order Number) segment handling in EDIFACT messages |
4 |
# Bug 20253: Optionally use buyer's purchase order number from EDIFACT quote in basket name |
5 |
# Note: RFF+ON is a message-level segment only, not line-level |
6 |
|
7 |
use strict; |
8 |
use warnings; |
9 |
use Test::More tests => 4; |
10 |
|
11 |
BEGIN { |
12 |
use_ok('Koha::Edifact::Message'); |
13 |
} |
14 |
|
15 |
# Mock segment class for testing |
16 |
{ |
17 |
package MockSegment; |
18 |
sub new { |
19 |
my ($class, $tag, $elements) = @_; |
20 |
return bless { tag => $tag, elements => $elements }, $class; |
21 |
} |
22 |
|
23 |
sub tag { |
24 |
my $self = shift; |
25 |
return $self->{tag}; |
26 |
} |
27 |
|
28 |
sub elem { |
29 |
my ($self, $comp_pos, $elem_pos) = @_; |
30 |
return $self->{elements}->[$comp_pos]->[$elem_pos // 0]; |
31 |
} |
32 |
} |
33 |
|
34 |
# Test RFF+ON segment handling at message level |
35 |
subtest 'RFF+ON segment handling in Message' => sub { |
36 |
plan tests => 2; |
37 |
|
38 |
# Create mock message segments (message-level segments before first LIN) |
39 |
my @datasegs = ( |
40 |
MockSegment->new('NAD', [['BY'], ['5030670137480', '', '', 'Buyer Name']]), |
41 |
MockSegment->new('RFF', [['ON', 'MSG_PO_12345']]), # Message-level purchase order number |
42 |
MockSegment->new('NAD', [['SU'], ['5013546027856', '', '', 'Supplier Name']]), |
43 |
MockSegment->new('LIN', [['1'], ['', ''], ['9780123456789', 'EN']]), # First line item |
44 |
MockSegment->new('QTY', [['47', '1']]), |
45 |
); |
46 |
|
47 |
# Create mock header and BGM for Message constructor |
48 |
my $header = MockSegment->new('UNH', [['MQ09791'], ['QUOTES', 'D', '03B', 'UN', 'EAN008']]); |
49 |
my $bgm = MockSegment->new('BGM', [['310', 'Q741588', '9']]); |
50 |
|
51 |
my $message = Koha::Edifact::Message->new([$header, $bgm, @datasegs]); |
52 |
|
53 |
# Test that message-level purchase order number is extracted |
54 |
is($message->purchase_order_number, 'MSG_PO_12345', 'Message-level purchase order number extracted from RFF+ON segment'); |
55 |
|
56 |
# Test message without RFF+ON segment |
57 |
@datasegs = ( |
58 |
MockSegment->new('NAD', [['BY'], ['5030670137480', '', '', 'Buyer Name']]), |
59 |
MockSegment->new('NAD', [['SU'], ['5013546027856', '', '', 'Supplier Name']]), |
60 |
MockSegment->new('LIN', [['1'], ['', ''], ['9780123456789', 'EN']]), |
61 |
MockSegment->new('QTY', [['47', '1']]), |
62 |
); |
63 |
|
64 |
$message = Koha::Edifact::Message->new([$header, $bgm, @datasegs]); |
65 |
is($message->purchase_order_number, undef, 'Returns undef when no RFF+ON segment present'); |
66 |
}; |
67 |
|
68 |
# Test that RFF+ON processing stops at first LIN segment (message-level only) |
69 |
subtest 'Message-level RFF+ON processing stops at LIN' => sub { |
70 |
plan tests => 1; |
71 |
|
72 |
my @datasegs = ( |
73 |
MockSegment->new('NAD', [['BY'], ['5030670137480', '', '', 'Buyer Name']]), |
74 |
MockSegment->new('LIN', [['1'], ['', ''], ['9780123456789', 'EN']]), # First LIN |
75 |
MockSegment->new('RFF', [['ON', 'AFTER_LIN_PO']]), # This should be ignored (line-level) |
76 |
MockSegment->new('QTY', [['47', '1']]), |
77 |
); |
78 |
|
79 |
my $header = MockSegment->new('UNH', [['MQ09791'], ['QUOTES', 'D', '03B', 'UN', 'EAN008']]); |
80 |
my $bgm = MockSegment->new('BGM', [['310', 'Q741588', '9']]); |
81 |
|
82 |
my $message = Koha::Edifact::Message->new([$header, $bgm, @datasegs]); |
83 |
|
84 |
is($message->purchase_order_number, undef, 'RFF+ON after LIN segment is ignored (message-level only)'); |
85 |
}; |
86 |
|
87 |
# Test multiple RFF segments at message level |
88 |
subtest 'Multiple RFF segments at message level' => sub { |
89 |
plan tests => 1; |
90 |
|
91 |
my @datasegs = ( |
92 |
MockSegment->new('NAD', [['BY'], ['5030670137480', '', '', 'Buyer Name']]), |
93 |
MockSegment->new('RFF', [['QLI', 'QUOTE_REF_123']]), # Different RFF qualifier |
94 |
MockSegment->new('RFF', [['ON', 'CORRECT_PO_NUM']]), # Purchase order number |
95 |
MockSegment->new('RFF', [['CT', 'CONTRACT_456']]), # Another different RFF qualifier |
96 |
MockSegment->new('NAD', [['SU'], ['5013546027856', '', '', 'Supplier Name']]), |
97 |
MockSegment->new('LIN', [['1'], ['', ''], ['9780123456789', 'EN']]), |
98 |
MockSegment->new('QTY', [['47', '1']]), |
99 |
); |
100 |
|
101 |
my $header = MockSegment->new('UNH', [['MQ09791'], ['QUOTES', 'D', '03B', 'UN', 'EAN008']]); |
102 |
my $bgm = MockSegment->new('BGM', [['310', 'Q741588', '9']]); |
103 |
|
104 |
my $message = Koha::Edifact::Message->new([$header, $bgm, @datasegs]); |
105 |
|
106 |
is($message->purchase_order_number, 'CORRECT_PO_NUM', 'Correct RFF+ON extracted when multiple RFF segments present'); |
107 |
}; |