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

(-)a/Koha/EDI.pm (+26 lines)
Lines 667-672 sub process_quote { Link Here
667
                my $purchase_order_number = $msg->purchase_order_number;
667
                my $purchase_order_number = $msg->purchase_order_number;
668
                if ($purchase_order_number) {
668
                if ($purchase_order_number) {
669
                    $basket_name = $purchase_order_number;
669
                    $basket_name = $purchase_order_number;
670
671
                    # Check for duplicate purchase order numbers for this vendor (including closed baskets)
672
                    my $existing_basket = $schema->resultset('Aqbasket')->search(
673
                        {
674
                            basketname   => $basket_name,
675
                            booksellerid => $quote_message->vendor_id,
676
                        }
677
                    )->first;
678
679
                    if ($existing_basket) {
680
681
                        # Log error for duplicate purchase order number but continue processing
682
                        my $rff_segment = "RFF+ON:$purchase_order_number";
683
                        $quote_message->add_to_edifact_errors(
684
                            {
685
                                section => $rff_segment,
686
                                details => "Duplicate purchase order number '$purchase_order_number' found for vendor "
687
                                    . $quote_message->vendor_id . "."
688
                            }
689
                        );
690
                        $logger->warn( "Duplicate purchase order number '$purchase_order_number' for vendor "
691
                                . $quote_message->vendor_id
692
                                . " (existing basket: "
693
                                . $existing_basket->basketno
694
                                . ")" );
695
                    }
670
                }
696
                }
671
            }
697
            }
672
698
(-)a/t/db_dependent/Koha/EDI.t (-2 / +62 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 => 6;
41
    plan tests => 7;
42
42
43
    $schema->storage->txn_begin;
43
    $schema->storage->txn_begin;
44
44
Lines 914-919 subtest 'process_quote' => sub { Link Here
914
        $schema->storage->txn_rollback;
914
        $schema->storage->txn_rollback;
915
    };
915
    };
916
916
917
    # Test 7: Duplicate purchase order number validation
918
    subtest 'duplicate_purchase_order_validation' => sub {
919
        plan tests => 5;
920
921
        $schema->storage->txn_begin;
922
923
        # Create vendor EDI account with po_is_basketname set to true
924
        my $account = $builder->build(
925
            {
926
                source => 'VendorEdiAccount',
927
                value  => {
928
                    description      => 'test vendor duplicate po',
929
                    transport        => 'FILE',
930
                    po_is_basketname => 1,
931
                },
932
            }
933
        );
934
935
        # Create first basket with purchase order number "orders 23/1" (same as in QUOTES_SMALL.CEQ)
936
        my $first_basket = $builder->build(
937
            {
938
                source => 'Aqbasket',
939
                value  => {
940
                    basketname   => 'orders 23/1',
941
                    booksellerid => $account->{vendor_id},
942
                    closedate    => undef,                   # Open basket
943
                },
944
            }
945
        );
946
947
        # Use existing test file that contains RFF+ON:orders 23/1
948
        my $filename = 'QUOTES_SMALL.CEQ';
949
        my $trans    = Koha::Edifact::Transport->new( $account->{id} );
950
        $trans->working_directory($dirname);
951
952
        my $mhash = $trans->message_hash();
953
        $mhash->{message_type} = 'QUOTE';
954
        $trans->ingest( $mhash, $filename );
955
956
        my $quote = $schema->resultset('EdifactMessage')->find( { filename => $filename } );
957
        ok( $quote, 'Quote message created successfully' );
958
959
        # Process the quote (this should trigger duplicate detection)
960
        process_quote($quote);
961
962
        # Check that duplicate purchase order error was logged
963
        my $errors = $quote->edifact_errors;
964
        ok( $errors->count >= 1, 'At least one error logged during quote processing' );
965
966
        # Find the specific duplicate purchase order error
967
        my $duplicate_error = $errors->search( { section => 'RFF+ON:orders 23/1' } )->first;
968
        ok( $duplicate_error, 'Duplicate purchase order error found' );
969
        is( $duplicate_error->section, 'RFF+ON:orders 23/1', 'Error section contains the RFF+ON segment' );
970
        like(
971
            $duplicate_error->details, qr/Duplicate purchase order number 'orders 23\/1' found for vendor/,
972
            'Error details describe the duplicate issue'
973
        );
974
975
        $schema->storage->txn_rollback;
976
    };
977
917
    # Clean up
978
    # Clean up
918
    $logger->clear();
979
    $logger->clear();
919
    $schema->storage->txn_rollback;
980
    $schema->storage->txn_rollback;
920
- 

Return to bug 20253