|
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 |
}; |