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

(-)a/Koha/EDI.pm (-2 / +137 lines)
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)
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/acquisitions.pref (-1 / +11 lines)
Lines 213-215 Acquisitions: Link Here
213
            - pref: EdiBlockDuplicateInvoiceEmailAddresses
213
            - pref: EdiBlockDuplicateInvoiceEmailAddresses
214
              type: textarea
214
              type: textarea
215
              class: code
215
              class: code
216
- 
216
        -
217
            - pref: EdiDuplicateOrderEmailNotice
218
              choices:
219
                  1: Send
220
                  0: "Don't send"
221
            - email notifications when a duplicate EDIFACT purchase order number is detected.
222
        -
223
            - "Send duplicate order notifications to these email addresses (comma-separated):"
224
            - pref: EdiDuplicateOrderEmailAddresses
225
              type: textarea
226
              class: code

Return to bug 42001