View | Details | Raw Unified | Return to bug 20253
Collapse All | Expand All

(-)a/t/Edifact.t (-2 / +72 lines)
Lines 4-13 use warnings; Link Here
4
use FindBin qw( $Bin );
4
use FindBin qw( $Bin );
5
5
6
use Test::NoWarnings;
6
use Test::NoWarnings;
7
use Test::More tests => 42;
7
use Test::More tests => 46;
8
use Koha::EDI;
8
use Koha::EDI;
9
9
10
BEGIN { use_ok('Koha::Edifact') }
10
BEGIN {
11
    use_ok('Koha::Edifact');
12
    use_ok('Koha::Edifact::Message');
13
}
11
14
12
my $filename = "$Bin/edi_testfiles/prquotes_73050_20140430.CEQ";
15
my $filename = "$Bin/edi_testfiles/prquotes_73050_20140430.CEQ";
13
16
Lines 139-141 is( $dp, 9.0, 'Discount calculated with discount = 0' ); Link Here
139
142
140
$dp = Koha::EDI::_discounted_price( 0.0, 9, 8.0 );
143
$dp = Koha::EDI::_discounted_price( 0.0, 9, 8.0 );
141
is( $dp, 8.0, 'Discount overridden by incoming calculated value' );
144
is( $dp, 8.0, 'Discount overridden by incoming calculated value' );
145
146
# Test RFF+ON (Purchase Order Number) segment handling in EDIFACT messages
147
# Bug 20253: Optionally use buyer's purchase order number from EDIFACT quote in basket name
148
149
# Mock segment class for testing RFF+ON functionality
150
{
151
152
    package MockSegment;
153
154
    sub new {
155
        my ( $class, $tag, $elements ) = @_;
156
        return bless { tag => $tag, elements => $elements }, $class;
157
    }
158
159
    sub tag {
160
        my $self = shift;
161
        return $self->{tag};
162
    }
163
164
    sub elem {
165
        my ( $self, $comp_pos, $elem_pos ) = @_;
166
        return $self->{elements}->[$comp_pos]->[ $elem_pos // 0 ];
167
    }
168
}
169
170
# Test that message-level purchase order number is extracted correctly
171
my @datasegs = (
172
    MockSegment->new( 'NAD', [ ['BY'], [ '5030670137480', '', '', 'Buyer Name' ] ] ),
173
    MockSegment->new( 'RFF', [ [ 'ON', 'MSG_PO_12345' ] ] ),    # Message-level purchase order number
174
    MockSegment->new( 'NAD', [ ['SU'], [ '5013546027856', '', '', 'Supplier Name' ] ] ),
175
    MockSegment->new( 'LIN', [ ['1'], [ '', '' ], [ '9780123456789', 'EN' ] ] ),           # First line item
176
    MockSegment->new( 'QTY', [ [ '47', '1' ] ] ),
177
);
178
179
my $header = MockSegment->new( 'UNH', [ ['MQ09791'], [ 'QUOTES', 'D', '03B', 'UN', 'EAN008' ] ] );
180
my $bgm    = MockSegment->new( 'BGM', [ [ '310', 'Q741588', '9' ] ] );
181
182
my $message = Koha::Edifact::Message->new( [ $header, $bgm, @datasegs ] );
183
is(
184
    $message->purchase_order_number, 'MSG_PO_12345',
185
    'Message-level purchase order number extracted from RFF+ON segment'
186
);
187
188
# Test that RFF+ON processing stops at first LIN segment (message-level only)
189
@datasegs = (
190
    MockSegment->new( 'NAD', [ ['BY'], [ '5030670137480', '', '', 'Buyer Name' ] ] ),
191
    MockSegment->new( 'LIN', [ ['1'], [ '', '' ], [ '9780123456789', 'EN' ] ] ),        # First LIN
192
    MockSegment->new( 'RFF', [ [ 'ON', 'AFTER_LIN_PO' ] ] ),    # This should be ignored (line-level)
193
    MockSegment->new( 'QTY', [ [ '47', '1' ] ] ),
194
);
195
196
$message = Koha::Edifact::Message->new( [ $header, $bgm, @datasegs ] );
197
is( $message->purchase_order_number, undef, 'RFF+ON after LIN segment is ignored (message-level only)' );
198
199
# Test that correct RFF+ON is extracted when multiple RFF segments are present
200
@datasegs = (
201
    MockSegment->new( 'NAD', [ ['BY'], [ '5030670137480', '', '', 'Buyer Name' ] ] ),
202
    MockSegment->new( 'RFF', [ [ 'QLI', 'QUOTE_REF_123' ] ] ),     # Different RFF qualifier
203
    MockSegment->new( 'RFF', [ [ 'ON',  'CORRECT_PO_NUM' ] ] ),    # Purchase order number
204
    MockSegment->new( 'RFF', [ [ 'CT',  'CONTRACT_456' ] ] ),      # Another different RFF qualifier
205
    MockSegment->new( 'NAD', [ ['SU'], [ '5013546027856', '', '', 'Supplier Name' ] ] ),
206
    MockSegment->new( 'LIN', [ ['1'], [ '', '' ], [ '9780123456789', 'EN' ] ] ),
207
    MockSegment->new( 'QTY', [ [ '47', '1' ] ] ),
208
);
209
210
$message = Koha::Edifact::Message->new( [ $header, $bgm, @datasegs ] );
211
is( $message->purchase_order_number, 'CORRECT_PO_NUM', 'Correct RFF+ON extracted when multiple RFF segments present' );
(-)a/t/db_dependent/Koha/EDI.t (-10 / +115 lines)
Lines 38-44 my $builder = t::lib::TestBuilder->new; Link Here
38
my $logger  = t::lib::Mocks::Logger->new();
38
my $logger  = t::lib::Mocks::Logger->new();
39
39
40
subtest 'process_quote' => sub {
40
subtest 'process_quote' => sub {
41
    plan tests => 5;
41
    plan tests => 6;
42
42
43
    $schema->storage->txn_begin;
43
    $schema->storage->txn_begin;
44
44
Lines 63-74 subtest 'process_quote' => sub { Link Here
63
            {
63
            {
64
                source => 'VendorEdiAccount',
64
                source => 'VendorEdiAccount',
65
                value  => {
65
                value  => {
66
                    description    => 'test vendor',
66
                    description      => 'test vendor',
67
                    transport      => 'FILE',
67
                    transport        => 'FILE',
68
                    plugin         => '',
68
                    plugin           => '',
69
                    san            => $test_san,
69
                    san              => $test_san,
70
                    orders_enabled => 1,
70
                    orders_enabled   => 1,
71
                    auto_orders    => 0,
71
                    auto_orders      => 0,
72
                    po_is_basketname => 0
72
                }
73
                }
73
            }
74
            }
74
        );
75
        );
Lines 586-593 subtest 'process_quote' => sub { Link Here
586
            {
587
            {
587
                source => 'VendorEdiAccount',
588
                source => 'VendorEdiAccount',
588
                value  => {
589
                value  => {
589
                    description => 'error test vendor',
590
                    description      => 'error test vendor',
590
                    transport   => 'FILE',
591
                    transport        => 'FILE',
592
                    po_is_basketname => 0
591
                }
593
                }
592
            }
594
            }
593
        );
595
        );
Lines 636-641 subtest 'process_quote' => sub { Link Here
636
        $schema->storage->txn_rollback;
638
        $schema->storage->txn_rollback;
637
    };
639
    };
638
640
641
    # Test 6: Basket naming configuration
642
    subtest 'basket_naming_configuration' => sub {
643
        plan tests => 5;
644
645
        $schema->storage->txn_begin;
646
647
        # Create vendor EDI account with po_is_basketname set to false (default)
648
        my $account_filename = $builder->build(
649
            {
650
                source => 'VendorEdiAccount',
651
                value  => {
652
                    description      => 'test vendor filename',
653
                    transport        => 'FILE',
654
                    plugin           => '',
655
                    san              => $test_san,
656
                    quotes_enabled   => 1,
657
                    auto_orders      => 0,
658
                    po_is_basketname => 0,
659
                }
660
            }
661
        );
662
663
        # Create vendor EDI account with po_is_basketname set to true
664
        my $account_po = $builder->build(
665
            {
666
                source => 'VendorEdiAccount',
667
                value  => {
668
                    description      => 'test vendor purchase order',
669
                    transport        => 'FILE',
670
                    plugin           => '',
671
                    san              => $test_san,
672
                    quotes_enabled   => 1,
673
                    auto_orders      => 0,
674
                    po_is_basketname => 1,
675
                }
676
            }
677
        );
678
679
        # Test database field storage
680
        my $account = $schema->resultset('VendorEdiAccount')->find( $account_filename->{id} );
681
        is( $account->po_is_basketname, 0, 'po_is_basketname field stores false value' );
682
683
        $account = $schema->resultset('VendorEdiAccount')->find( $account_po->{id} );
684
        is( $account->po_is_basketname, 1, 'po_is_basketname field stores true value' );
685
686
        # Test boolean constraint - valid values
687
        eval { $account->update( { po_is_basketname => 0 } ); };
688
        is( $@, '', 'false is accepted as valid boolean value' );
689
690
        eval { $account->update( { po_is_basketname => 1 } ); };
691
        is( $@, '', 'true is accepted as valid boolean value' );
692
693
        # Mock NewBasket to capture basket name
694
        my $captured_basket_name;
695
        my $mock_acquisition = Test::MockModule->new( 'C4::Acquisition', no_auto => 1 );
696
        $mock_acquisition->mock(
697
            'NewBasket',
698
            sub {
699
                my ( $vendor_id, $authorisedby, $basketname, $basketnote, $basketbooksellernote ) = @_;
700
                $captured_basket_name = $basketname;
701
                return 1;    # Return a basket ID
702
            }
703
        );
704
705
        # Mock message with purchase order number
706
        my $mock_message = Test::MockModule->new('Koha::Edifact::Message');
707
        $mock_message->mock( 'purchase_order_number', sub { return 'TEST_PO_123456'; } );
708
        $mock_message->mock( 'lineitems',             sub { return []; } );
709
        $mock_message->mock( 'buyer_ean',             sub { return $test_san; } );
710
711
        # Create a quote message for testing
712
        my $quote_message = $builder->build(
713
            {
714
                source => 'EdifactMessage',
715
                value  => {
716
                    message_type => 'QUOTE',
717
                    vendor_id    => $account_po->{vendor_id},
718
                    filename     => 'test_basket_naming.ceq',
719
                    status       => 'recmsg',
720
                }
721
            }
722
        );
723
724
        # Test that the logic would use purchase order number when configured
725
        # (This tests the logic in process_quote without running the full process)
726
        my $v = $schema->resultset('VendorEdiAccount')->search( { vendor_id => $account_po->{vendor_id} } )->single;
727
        my $quote_obj   = $schema->resultset('EdifactMessage')->find( $quote_message->{id} );
728
        my $basket_name = $quote_obj->filename;
729
730
        if ( $v && $v->po_is_basketname ) {
731
            my $purchase_order_number = 'TEST_PO_123456';    # Simulated from mock
732
            if ($purchase_order_number) {
733
                $basket_name = $purchase_order_number;
734
            }
735
        }
736
737
        is(
738
            $basket_name, 'TEST_PO_123456',
739
            'Basket naming logic correctly uses purchase order number when configured'
740
        );
741
742
        $schema->storage->txn_rollback;
743
    };
744
639
    # Clean up
745
    # Clean up
640
    $logger->clear();
746
    $logger->clear();
641
    $schema->storage->txn_rollback;
747
    $schema->storage->txn_rollback;
642
- 

Return to bug 20253