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

(-)a/t/db_dependent/Koha/EDI.t (-2 / +211 lines)
Lines 21-27 use Modern::Perl; Link Here
21
use FindBin qw( $Bin );
21
use FindBin qw( $Bin );
22
22
23
use Test::NoWarnings;
23
use Test::NoWarnings;
24
use Test::More tests => 9;
24
use Test::More tests => 10;
25
use Test::MockModule;
25
use Test::MockModule;
26
26
27
use t::lib::Mocks;
27
use t::lib::Mocks;
Lines 2931-2933 subtest 'duplicate_invoice_blocking' => sub { Link Here
2931
2931
2932
    $schema->storage->txn_rollback;
2932
    $schema->storage->txn_rollback;
2933
};
2933
};
2934
- 
2934
2935
subtest 'duplicate_order_email_notifications' => sub {
2936
    plan tests => 3;
2937
2938
    $schema->storage->txn_begin;
2939
2940
    # Helper: build a vendor with EDI account (po_is_basketname=1), an existing basket,
2941
    # and a new basket with one orderline, ready to trigger the duplicate PO check.
2942
    my $_setup_duplicate_order = sub {
2943
        my $bookseller = $builder->build_object( { class => 'Koha::Acquisition::Booksellers' } );
2944
2945
        $builder->build(
2946
            {
2947
                source => 'VendorEdiAccount',
2948
                value  => {
2949
                    vendor_id        => $bookseller->id,
2950
                    plugin           => '',
2951
                    san              => '9876543210',
2952
                    po_is_basketname => 1,
2953
                }
2954
            }
2955
        );
2956
2957
        # Existing basket whose name will conflict with the new one
2958
        $builder->build(
2959
            {
2960
                source => 'Aqbasket',
2961
                value  => {
2962
                    basketname   => 'DUP-PO-42001',
2963
                    booksellerid => $bookseller->id,
2964
                }
2965
            }
2966
        );
2967
2968
        # New basket with the same name and one orderline
2969
        my $new_basket = $builder->build_object(
2970
            {
2971
                class => 'Koha::Acquisition::Baskets',
2972
                value => {
2973
                    basketname   => 'DUP-PO-42001',
2974
                    booksellerid => $bookseller->id,
2975
                }
2976
            }
2977
        );
2978
2979
        $builder->build_object(
2980
            {
2981
                class => 'Koha::Acquisition::Orders',
2982
                value => {
2983
                    basketno    => $new_basket->basketno,
2984
                    orderstatus => 'new',
2985
                }
2986
            }
2987
        );
2988
2989
        my $ean = $builder->build(
2990
            {
2991
                source => 'EdifactEan',
2992
                value  => {
2993
                    branchcode => undef,
2994
                    ean        => '9876543210',
2995
                }
2996
            }
2997
        );
2998
2999
        return ( $bookseller, $new_basket, $ean );
3000
    };
3001
3002
    # Test 1: No email when EdiDuplicateOrderEmailNotice is disabled
3003
    subtest 'email_notification_disabled' => sub {
3004
        plan tests => 3;
3005
3006
        $schema->storage->txn_begin;
3007
3008
        t::lib::Mocks::mock_preference( 'EdiDuplicateOrderEmailNotice',    0 );
3009
        t::lib::Mocks::mock_preference( 'EdiDuplicateOrderEmailAddresses', 'library@example.com' );
3010
3011
        my ( $bookseller, $new_basket, $ean ) = $_setup_duplicate_order->();
3012
3013
        $logger->clear();
3014
3015
        my $result = create_edi_order( { basketno => $new_basket->basketno, ean => $ean->{ean} } );
3016
3017
        is( ref($result),     'HASH',                'create_edi_order returns error hash for duplicate PO' );
3018
        is( $result->{error}, 'duplicate_po_number', 'Error code is duplicate_po_number' );
3019
3020
        my $messages = $schema->resultset('MessageQueue')->search( { to_address => 'library@example.com' } );
3021
        is( $messages->count, 0, 'No email queued when EdiDuplicateOrderEmailNotice is disabled' );
3022
3023
        $logger->clear();
3024
        $schema->storage->txn_rollback;
3025
    };
3026
3027
    # Test 2: Library staff email notification
3028
    subtest 'library_email_notification' => sub {
3029
        plan tests => 5;
3030
3031
        $schema->storage->txn_begin;
3032
3033
        t::lib::Mocks::mock_preference( 'EdiDuplicateOrderEmailNotice',    1 );
3034
        t::lib::Mocks::mock_preference( 'EdiDuplicateOrderEmailAddresses', 'acq@library.org' );
3035
3036
        $schema->resultset('Letter')
3037
            ->search( { module => 'acquisition', code => [ 'EDI_DUP_ORD_LIBRARY', 'EDI_DUP_ORD_VENDOR' ] } )
3038
            ->delete;
3039
3040
        $builder->build(
3041
            {
3042
                source => 'Letter',
3043
                value  => {
3044
                    module     => 'acquisition',
3045
                    code       => 'EDI_DUP_ORD_LIBRARY',
3046
                    branchcode => '',
3047
                    name       => 'Test library order notification',
3048
                    is_html    => 0,
3049
                    title      => 'Duplicate Order - [% po_number %]',
3050
                    content    =>
3051
                        'Duplicate PO [% po_number %] blocked. Basket [% basketno %], existing basket [% existing_basketno %].',
3052
                    message_transport_type => 'email',
3053
                    lang                   => 'default',
3054
                }
3055
            }
3056
        );
3057
3058
        my ( $bookseller, $new_basket, $ean ) = $_setup_duplicate_order->();
3059
3060
        $logger->clear();
3061
3062
        my $result = create_edi_order( { basketno => $new_basket->basketno, ean => $ean->{ean} } );
3063
3064
        is( ref($result),     'HASH',                'create_edi_order returns error hash for duplicate PO' );
3065
        is( $result->{error}, 'duplicate_po_number', 'Error code is duplicate_po_number' );
3066
3067
        my $messages = $schema->resultset('MessageQueue')
3068
            ->search( { to_address => 'acq@library.org', status => [ 'sent', 'pending', 'failed' ] } );
3069
        is( $messages->count, 1, 'Library notification was queued' );
3070
3071
        my $msg = $messages->next;
3072
        like( $msg->subject, qr/Duplicate Order/, 'Library email has correct subject' );
3073
        like( $msg->content, qr/DUP-PO-42001/,    'Library email contains the PO number' );
3074
3075
        $logger->clear();
3076
        $schema->storage->txn_rollback;
3077
    };
3078
3079
    # Test 3: Vendor contact email notification
3080
    subtest 'vendor_email_notification' => sub {
3081
        plan tests => 4;
3082
3083
        $schema->storage->txn_begin;
3084
3085
        t::lib::Mocks::mock_preference( 'EdiDuplicateOrderEmailNotice',    1 );
3086
        t::lib::Mocks::mock_preference( 'EdiDuplicateOrderEmailAddresses', '' );
3087
3088
        $schema->resultset('Letter')
3089
            ->search( { module => 'acquisition', code => [ 'EDI_DUP_ORD_LIBRARY', 'EDI_DUP_ORD_VENDOR' ] } )
3090
            ->delete;
3091
3092
        $builder->build(
3093
            {
3094
                source => 'Letter',
3095
                value  => {
3096
                    module     => 'acquisition',
3097
                    code       => 'EDI_DUP_ORD_VENDOR',
3098
                    branchcode => '',
3099
                    name       => 'Test vendor order notification',
3100
                    is_html    => 0,
3101
                    title      => 'Duplicate Order Received - [% po_number %]',
3102
                    content    => 'Duplicate PO number [% po_number %] detected. Please contact the library.',
3103
                    message_transport_type => 'email',
3104
                    lang                   => 'default',
3105
                }
3106
            }
3107
        );
3108
3109
        my ( $bookseller, $new_basket, $ean ) = $_setup_duplicate_order->();
3110
3111
        # Add a vendor contact with edi_error_notification enabled
3112
        $builder->build(
3113
            {
3114
                source => 'Aqcontact',
3115
                value  => {
3116
                    booksellerid           => $bookseller->id,
3117
                    name                   => 'EDI Contact',
3118
                    email                  => 'vendor-edi@supplier.com',
3119
                    edi_error_notification => 1,
3120
                }
3121
            }
3122
        );
3123
3124
        $logger->clear();
3125
3126
        my $result = create_edi_order( { basketno => $new_basket->basketno, ean => $ean->{ean} } );
3127
3128
        is( ref($result),     'HASH',                'create_edi_order returns error hash for duplicate PO' );
3129
        is( $result->{error}, 'duplicate_po_number', 'Error code is duplicate_po_number' );
3130
3131
        my $messages = $schema->resultset('MessageQueue')
3132
            ->search( { to_address => 'vendor-edi@supplier.com', status => [ 'sent', 'pending', 'failed' ] } );
3133
        is( $messages->count, 1, 'Vendor notification was queued' );
3134
3135
        my $msg = $messages->next;
3136
        like( $msg->subject, qr/Duplicate Order Received/, 'Vendor email has correct subject' );
3137
3138
        $logger->clear();
3139
        $schema->storage->txn_rollback;
3140
    };
3141
3142
    $schema->storage->txn_rollback;
3143
};

Return to bug 42001