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 (-1 / +106 lines)
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 760-765 subtest 'process_quote' => sub { Link Here
760
                value  => {
761
                value  => {
761
                    description       => 'error test vendor',
762
                    description       => 'error test vendor',
762
                    file_transport_id => $file_transport->{file_transport_id},
763
                    file_transport_id => $file_transport->{file_transport_id},
764
                    po_is_basketname  => 0
763
                }
765
                }
764
            }
766
            }
765
        );
767
        );
Lines 808-813 subtest 'process_quote' => sub { Link Here
808
        $schema->storage->txn_rollback;
810
        $schema->storage->txn_rollback;
809
    };
811
    };
810
812
813
    # Test 6: Basket naming configuration
814
    subtest 'basket_naming_configuration' => sub {
815
        plan tests => 5;
816
817
        $schema->storage->txn_begin;
818
819
        # Create vendor EDI account with po_is_basketname set to false (default)
820
        my $account_filename = $builder->build(
821
            {
822
                source => 'VendorEdiAccount',
823
                value  => {
824
                    description      => 'test vendor filename',
825
                    transport        => 'FILE',
826
                    plugin           => '',
827
                    san              => $test_san,
828
                    quotes_enabled   => 1,
829
                    auto_orders      => 0,
830
                    po_is_basketname => 0,
831
                }
832
            }
833
        );
834
835
        # Create vendor EDI account with po_is_basketname set to true
836
        my $account_po = $builder->build(
837
            {
838
                source => 'VendorEdiAccount',
839
                value  => {
840
                    description      => 'test vendor purchase order',
841
                    transport        => 'FILE',
842
                    plugin           => '',
843
                    san              => $test_san,
844
                    quotes_enabled   => 1,
845
                    auto_orders      => 0,
846
                    po_is_basketname => 1,
847
                }
848
            }
849
        );
850
851
        # Test database field storage
852
        my $account = $schema->resultset('VendorEdiAccount')->find( $account_filename->{id} );
853
        is( $account->po_is_basketname, 0, 'po_is_basketname field stores false value' );
854
855
        $account = $schema->resultset('VendorEdiAccount')->find( $account_po->{id} );
856
        is( $account->po_is_basketname, 1, 'po_is_basketname field stores true value' );
857
858
        # Test boolean constraint - valid values
859
        eval { $account->update( { po_is_basketname => 0 } ); };
860
        is( $@, '', 'false is accepted as valid boolean value' );
861
862
        eval { $account->update( { po_is_basketname => 1 } ); };
863
        is( $@, '', 'true is accepted as valid boolean value' );
864
865
        # Mock NewBasket to capture basket name
866
        my $captured_basket_name;
867
        my $mock_acquisition = Test::MockModule->new( 'C4::Acquisition', no_auto => 1 );
868
        $mock_acquisition->mock(
869
            'NewBasket',
870
            sub {
871
                my ( $vendor_id, $authorisedby, $basketname, $basketnote, $basketbooksellernote ) = @_;
872
                $captured_basket_name = $basketname;
873
                return 1;    # Return a basket ID
874
            }
875
        );
876
877
        # Mock message with purchase order number
878
        my $mock_message = Test::MockModule->new('Koha::Edifact::Message');
879
        $mock_message->mock( 'purchase_order_number', sub { return 'TEST_PO_123456'; } );
880
        $mock_message->mock( 'lineitems',             sub { return []; } );
881
        $mock_message->mock( 'buyer_ean',             sub { return $test_san; } );
882
883
        # Create a quote message for testing
884
        my $quote_message = $builder->build(
885
            {
886
                source => 'EdifactMessage',
887
                value  => {
888
                    message_type => 'QUOTE',
889
                    vendor_id    => $account_po->{vendor_id},
890
                    filename     => 'test_basket_naming.ceq',
891
                    status       => 'recmsg',
892
                }
893
            }
894
        );
895
896
        # Test that the logic would use purchase order number when configured
897
        # (This tests the logic in process_quote without running the full process)
898
        my $v = $schema->resultset('VendorEdiAccount')->search( { vendor_id => $account_po->{vendor_id} } )->single;
899
        my $quote_obj   = $schema->resultset('EdifactMessage')->find( $quote_message->{id} );
900
        my $basket_name = $quote_obj->filename;
901
902
        if ( $v && $v->po_is_basketname ) {
903
            my $purchase_order_number = 'TEST_PO_123456';    # Simulated from mock
904
            if ($purchase_order_number) {
905
                $basket_name = $purchase_order_number;
906
            }
907
        }
908
909
        is(
910
            $basket_name, 'TEST_PO_123456',
911
            'Basket naming logic correctly uses purchase order number when configured'
912
        );
913
914
        $schema->storage->txn_rollback;
915
    };
916
811
    # Clean up
917
    # Clean up
812
    $logger->clear();
918
    $logger->clear();
813
    $schema->storage->txn_rollback;
919
    $schema->storage->txn_rollback;
814
- 

Return to bug 20253