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 (-2 / +107 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 82-87 subtest 'process_quote' => sub { Link Here
82
                    san               => $test_san,
82
                    san               => $test_san,
83
                    orders_enabled    => 1,
83
                    orders_enabled    => 1,
84
                    auto_orders       => 0,
84
                    auto_orders       => 0,
85
                    po_is_basketname  => 0
85
                }
86
                }
86
            }
87
            }
87
        );
88
        );
Lines 654-659 subtest 'process_quote' => sub { Link Here
654
                value  => {
655
                value  => {
655
                    description       => 'error test vendor',
656
                    description       => 'error test vendor',
656
                    file_transport_id => $file_transport->{file_transport_id},
657
                    file_transport_id => $file_transport->{file_transport_id},
658
                    po_is_basketname  => 0
657
                }
659
                }
658
            }
660
            }
659
        );
661
        );
Lines 702-707 subtest 'process_quote' => sub { Link Here
702
        $schema->storage->txn_rollback;
704
        $schema->storage->txn_rollback;
703
    };
705
    };
704
706
707
    # Test 6: Basket naming configuration
708
    subtest 'basket_naming_configuration' => sub {
709
        plan tests => 5;
710
711
        $schema->storage->txn_begin;
712
713
        # Create vendor EDI account with po_is_basketname set to false (default)
714
        my $account_filename = $builder->build(
715
            {
716
                source => 'VendorEdiAccount',
717
                value  => {
718
                    description      => 'test vendor filename',
719
                    transport        => 'FILE',
720
                    plugin           => '',
721
                    san              => $test_san,
722
                    quotes_enabled   => 1,
723
                    auto_orders      => 0,
724
                    po_is_basketname => 0,
725
                }
726
            }
727
        );
728
729
        # Create vendor EDI account with po_is_basketname set to true
730
        my $account_po = $builder->build(
731
            {
732
                source => 'VendorEdiAccount',
733
                value  => {
734
                    description      => 'test vendor purchase order',
735
                    transport        => 'FILE',
736
                    plugin           => '',
737
                    san              => $test_san,
738
                    quotes_enabled   => 1,
739
                    auto_orders      => 0,
740
                    po_is_basketname => 1,
741
                }
742
            }
743
        );
744
745
        # Test database field storage
746
        my $account = $schema->resultset('VendorEdiAccount')->find( $account_filename->{id} );
747
        is( $account->po_is_basketname, 0, 'po_is_basketname field stores false value' );
748
749
        $account = $schema->resultset('VendorEdiAccount')->find( $account_po->{id} );
750
        is( $account->po_is_basketname, 1, 'po_is_basketname field stores true value' );
751
752
        # Test boolean constraint - valid values
753
        eval { $account->update( { po_is_basketname => 0 } ); };
754
        is( $@, '', 'false is accepted as valid boolean value' );
755
756
        eval { $account->update( { po_is_basketname => 1 } ); };
757
        is( $@, '', 'true is accepted as valid boolean value' );
758
759
        # Mock NewBasket to capture basket name
760
        my $captured_basket_name;
761
        my $mock_acquisition = Test::MockModule->new( 'C4::Acquisition', no_auto => 1 );
762
        $mock_acquisition->mock(
763
            'NewBasket',
764
            sub {
765
                my ( $vendor_id, $authorisedby, $basketname, $basketnote, $basketbooksellernote ) = @_;
766
                $captured_basket_name = $basketname;
767
                return 1;    # Return a basket ID
768
            }
769
        );
770
771
        # Mock message with purchase order number
772
        my $mock_message = Test::MockModule->new('Koha::Edifact::Message');
773
        $mock_message->mock( 'purchase_order_number', sub { return 'TEST_PO_123456'; } );
774
        $mock_message->mock( 'lineitems',             sub { return []; } );
775
        $mock_message->mock( 'buyer_ean',             sub { return $test_san; } );
776
777
        # Create a quote message for testing
778
        my $quote_message = $builder->build(
779
            {
780
                source => 'EdifactMessage',
781
                value  => {
782
                    message_type => 'QUOTE',
783
                    vendor_id    => $account_po->{vendor_id},
784
                    filename     => 'test_basket_naming.ceq',
785
                    status       => 'recmsg',
786
                }
787
            }
788
        );
789
790
        # Test that the logic would use purchase order number when configured
791
        # (This tests the logic in process_quote without running the full process)
792
        my $v = $schema->resultset('VendorEdiAccount')->search( { vendor_id => $account_po->{vendor_id} } )->single;
793
        my $quote_obj   = $schema->resultset('EdifactMessage')->find( $quote_message->{id} );
794
        my $basket_name = $quote_obj->filename;
795
796
        if ( $v && $v->po_is_basketname ) {
797
            my $purchase_order_number = 'TEST_PO_123456';    # Simulated from mock
798
            if ($purchase_order_number) {
799
                $basket_name = $purchase_order_number;
800
            }
801
        }
802
803
        is(
804
            $basket_name, 'TEST_PO_123456',
805
            'Basket naming logic correctly uses purchase order number when configured'
806
        );
807
808
        $schema->storage->txn_rollback;
809
    };
810
705
    # Clean up
811
    # Clean up
706
    $logger->clear();
812
    $logger->clear();
707
    $schema->storage->txn_rollback;
813
    $schema->storage->txn_rollback;
708
- 

Return to bug 20253