|
Lines 99-106
sub create_edi_order {
Link Here
|
| 99 |
my $existing_basket = $schema->resultset('Aqbasket')->search( |
99 |
my $existing_basket = $schema->resultset('Aqbasket')->search( |
| 100 |
{ |
100 |
{ |
| 101 |
basketname => $basket->basketname, |
101 |
basketname => $basket->basketname, |
| 102 |
booksellerid => $basket->booksellerid, |
102 |
booksellerid => $basket->get_column('booksellerid'), |
| 103 |
basketno => { '!=' => $basketno }, # Exclude current basket |
103 |
basketno => { '!=' => $basketno }, # Exclude current basket |
| 104 |
} |
104 |
} |
| 105 |
)->first; |
105 |
)->first; |
| 106 |
|
106 |
|
|
Lines 110-115
sub create_edi_order {
Link Here
|
| 110 |
. "' (existing basket: " |
110 |
. "' (existing basket: " |
| 111 |
. $existing_basket->basketno |
111 |
. $existing_basket->basketno |
| 112 |
. ")" ); |
112 |
. ")" ); |
|
|
113 |
_send_duplicate_order_email_notice( $basket, $vendor, $existing_basket ); |
| 113 |
return { |
114 |
return { |
| 114 |
error => "duplicate_po_number", existing_basket => $existing_basket->basketno, |
115 |
error => "duplicate_po_number", existing_basket => $existing_basket->basketno, |
| 115 |
po_number => $basket->basketname |
116 |
po_number => $basket->basketname |
|
Lines 1549-1554
sub _handle_008_field {
Link Here
|
| 1549 |
return $bib_record; |
1550 |
return $bib_record; |
| 1550 |
} |
1551 |
} |
| 1551 |
|
1552 |
|
|
|
1553 |
sub _send_duplicate_order_email_notice { |
| 1554 |
my ( $basket, $vendor, $existing_basket ) = @_; |
| 1555 |
|
| 1556 |
my $logger = Koha::Logger->get( { interface => 'edi' } ); |
| 1557 |
|
| 1558 |
# Check if email notifications enabled |
| 1559 |
return unless C4::Context->preference('EdiDuplicateOrderEmailNotice'); |
| 1560 |
|
| 1561 |
my $vendor_id = $vendor->vendor_id; |
| 1562 |
my $po_number = $basket->basketname; |
| 1563 |
my $basketno = $basket->basketno; |
| 1564 |
|
| 1565 |
# Prepare template substitution values |
| 1566 |
my $substitute = { |
| 1567 |
po_number => $po_number, |
| 1568 |
basketno => $basketno, |
| 1569 |
existing_basketno => $existing_basket->basketno, |
| 1570 |
vendor_id => $vendor_id, |
| 1571 |
vendor_san => $vendor->san || '', |
| 1572 |
}; |
| 1573 |
|
| 1574 |
# 1. Send notification to library staff |
| 1575 |
my $library_email_addresses = C4::Context->preference('EdiDuplicateOrderEmailAddresses'); |
| 1576 |
if ($library_email_addresses) { |
| 1577 |
my @library_addresses = split /\s*,\s*/, $library_email_addresses; |
| 1578 |
|
| 1579 |
foreach my $to_address (@library_addresses) { |
| 1580 |
$to_address =~ s/^\s+|\s+$//g; # trim whitespace |
| 1581 |
next unless $to_address; |
| 1582 |
next unless Koha::Email->is_valid($to_address); |
| 1583 |
|
| 1584 |
my $letter = C4::Letters::GetPreparedLetter( |
| 1585 |
module => 'acquisition', |
| 1586 |
letter_code => 'EDI_DUP_ORD_LIBRARY', |
| 1587 |
message_transport_type => 'email', |
| 1588 |
tables => { |
| 1589 |
aqbooksellers => $vendor_id, |
| 1590 |
}, |
| 1591 |
substitute => $substitute, |
| 1592 |
); |
| 1593 |
|
| 1594 |
if ($letter) { |
| 1595 |
my $message_id = C4::Letters::EnqueueLetter( |
| 1596 |
{ |
| 1597 |
letter => $letter, |
| 1598 |
to_address => $to_address, |
| 1599 |
message_transport_type => 'email', |
| 1600 |
} |
| 1601 |
); |
| 1602 |
|
| 1603 |
if ($message_id) { |
| 1604 |
$logger->info( |
| 1605 |
"Library duplicate order notification queued (message_id: $message_id) for $to_address, PO number $po_number. Message will be sent by message_queue cronjob." |
| 1606 |
); |
| 1607 |
} else { |
| 1608 |
$logger->warn("Failed to enqueue library notification to $to_address for PO number $po_number"); |
| 1609 |
} |
| 1610 |
} else { |
| 1611 |
$logger->warn("Could not generate library notification letter for PO number $po_number"); |
| 1612 |
} |
| 1613 |
} |
| 1614 |
} |
| 1615 |
|
| 1616 |
# 2. Send notification to vendor contacts |
| 1617 |
my $schema = Koha::Database->new()->schema(); |
| 1618 |
my $vendor_bookseller = $schema->resultset('Aqbookseller')->find($vendor_id); |
| 1619 |
if ($vendor_bookseller) { |
| 1620 |
my @edi_contacts = $vendor_bookseller->aqcontacts->search( |
| 1621 |
{ |
| 1622 |
edi_error_notification => 1, |
| 1623 |
email => { '!=' => undef }, |
| 1624 |
} |
| 1625 |
)->all; |
| 1626 |
|
| 1627 |
foreach my $contact (@edi_contacts) { |
| 1628 |
my $vendor_email = $contact->email; |
| 1629 |
|
| 1630 |
if ( Koha::Email->is_valid($vendor_email) ) { |
| 1631 |
my $letter = C4::Letters::GetPreparedLetter( |
| 1632 |
module => 'acquisition', |
| 1633 |
letter_code => 'EDI_DUP_ORD_VENDOR', |
| 1634 |
message_transport_type => 'email', |
| 1635 |
tables => { |
| 1636 |
aqbooksellers => $vendor_id, |
| 1637 |
}, |
| 1638 |
substitute => $substitute, |
| 1639 |
); |
| 1640 |
|
| 1641 |
if ($letter) { |
| 1642 |
my $message_id = C4::Letters::EnqueueLetter( |
| 1643 |
{ |
| 1644 |
letter => $letter, |
| 1645 |
to_address => $vendor_email, |
| 1646 |
message_transport_type => 'email', |
| 1647 |
} |
| 1648 |
); |
| 1649 |
|
| 1650 |
if ($message_id) { |
| 1651 |
$logger->info( |
| 1652 |
"Vendor duplicate order notification queued (message_id: $message_id) for $vendor_email (contact: " |
| 1653 |
. $contact->name |
| 1654 |
. "), PO number $po_number. Message will be sent by message_queue cronjob." ); |
| 1655 |
} else { |
| 1656 |
$logger->warn( |
| 1657 |
"Failed to enqueue vendor notification to $vendor_email for PO number $po_number"); |
| 1658 |
} |
| 1659 |
} else { |
| 1660 |
$logger->warn("Could not generate vendor notification letter for PO number $po_number"); |
| 1661 |
} |
| 1662 |
} else { |
| 1663 |
$logger->warn( "Invalid vendor contact email address: $vendor_email for contact: " . $contact->name ); |
| 1664 |
} |
| 1665 |
} |
| 1666 |
} |
| 1667 |
} |
| 1668 |
|
| 1552 |
sub _send_duplicate_invoice_email_notice { |
1669 |
sub _send_duplicate_invoice_email_notice { |
| 1553 |
my ( $invoice_message, $invoicenumber, $vendor_acct, $duplicate_invoice ) = @_; |
1670 |
my ( $invoice_message, $invoicenumber, $vendor_acct, $duplicate_invoice ) = @_; |
| 1554 |
|
1671 |
|
|
Lines 1785-1790
Koha::EDI
Link Here
|
| 1785 |
|
1902 |
|
| 1786 |
If all else fails returns empty string |
1903 |
If all else fails returns empty string |
| 1787 |
|
1904 |
|
|
|
1905 |
=head2 _send_duplicate_order_email_notice |
| 1906 |
|
| 1907 |
_send_duplicate_order_email_notice($basket, $vendor, $existing_basket) |
| 1908 |
|
| 1909 |
Internal function to queue email notifications when duplicate EDIFACT purchase orders |
| 1910 |
are detected (i.e. a basket with the same PO number already exists for the vendor). |
| 1911 |
|
| 1912 |
Queues two types of notifications using letter templates: |
| 1913 |
1. EDI_DUP_ORD_LIBRARY - to library staff (addresses from EdiDuplicateOrderEmailAddresses) |
| 1914 |
2. EDI_DUP_ORD_VENDOR - to vendor contacts with edi_error_notification set |
| 1915 |
|
| 1916 |
Only runs if EdiDuplicateOrderEmailNotice preference is enabled. |
| 1917 |
|
| 1918 |
Parameters: |
| 1919 |
- $basket: The Aqbasket DBIC row for the basket being blocked |
| 1920 |
- $vendor: The VendorEdiAccount DBIC row |
| 1921 |
- $existing_basket: The existing Aqbasket DBIC row with the same basket name/PO number |
| 1922 |
|
| 1788 |
=head2 _send_duplicate_invoice_email_notice |
1923 |
=head2 _send_duplicate_invoice_email_notice |
| 1789 |
|
1924 |
|
| 1790 |
_send_duplicate_invoice_email_notice($invoice_message, $invoicenumber, $vendor_acct, $duplicate_invoice) |
1925 |
_send_duplicate_invoice_email_notice($invoice_message, $invoicenumber, $vendor_acct, $duplicate_invoice) |