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

Return to bug 42001