Bugzilla – Attachment 185100 Details for
Bug 40587
Prevent selection of different EAN's on EDI ORDER when the Basket is generated from a QUOTE message
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Bug 40587: Auto-select EAN from QUOTE message when creating EDIFACT orders
Bug-40587-Auto-select-EAN-from-QUOTE-message-when-.patch (text/plain), 9.33 KB, created by
Martin Renvoize (ashimema)
on 2025-08-04 13:37:56 UTC
(
hide
)
Description:
Bug 40587: Auto-select EAN from QUOTE message when creating EDIFACT orders
Filename:
MIME Type:
Creator:
Martin Renvoize (ashimema)
Created:
2025-08-04 13:37:56 UTC
Size:
9.33 KB
patch
obsolete
>From f6035dff07b17b3858904a3647fccb6b8967b7af Mon Sep 17 00:00:00 2001 >From: Martin Renvoize <martin.renvoize@openfifth.co.uk> >Date: Mon, 4 Aug 2025 14:34:37 +0100 >Subject: [PATCH] Bug 40587: Auto-select EAN from QUOTE message when creating > EDIFACT orders > >When a basket is generated via an EDI QUOTE message, the QUOTE message >includes a library's EAN code (buyer_ean). This patch makes the 'Create >EDIFACT order' button automatically use the EAN from the original QUOTE >message instead of requiring manual EAN selection. > >This patch also fixes a bug in process_quote where all baskets in >multi-message QUOTE transports incorrectly used the first message's >buyer_ean, even when subsequent messages had different EANs. > >Changes made: > >1. Fixed Koha/EDI.pm process_quote auto-order creation to use the correct > buyer_ean for each message/basket pair in multi-message transports >2. Enhanced acqui/basket.pl to extract and provide the quote_ean from > QUOTE messages, handling both single and multi-message scenarios >3. Updated basket.tt template to automatically select the EAN from the > original QUOTE message when available and matching > >Test plan: >1. Create a vendor with EDI account and multiple EANs configured >2. Process a QUOTE message that creates a basket >3. Go to the basket page and click "Create EDIFACT order" >4. Verify it automatically uses the EAN from the QUOTE message > (shows tooltip "Using EAN from original QUOTE message") >5. Test with multi-message QUOTE files to ensure each basket uses > the correct EAN from its corresponding message >6. Verify fallback behavior when no QUOTE EAN matches available EANs >--- > Koha/EDI.pm | 17 +++-- > acqui/basket.pl | 76 ++++++++++++++++++- > .../prog/en/modules/acqui/basket.tt | 28 ++++++- > 3 files changed, 113 insertions(+), 8 deletions(-) > >diff --git a/Koha/EDI.pm b/Koha/EDI.pm >index 58b3209fd14..6e80449cffe 100644 >--- a/Koha/EDI.pm >+++ b/Koha/EDI.pm >@@ -701,22 +701,27 @@ sub process_quote { > } > )->single; > if ( $v->auto_orders ) { >- for my $b (@added_baskets) { >+ for my $i ( 0 .. $#added_baskets ) { >+ my $basketno = $added_baskets[$i]; >+ >+ # Use the correct buyer_ean for each message/basket >+ my $buyer_ean = $messages->[$i] ? $messages->[$i]->buyer_ean : $messages->[0]->buyer_ean; >+ > create_edi_order( > { >- ean => $messages->[0]->buyer_ean, >- basketno => $b, >+ ean => $buyer_ean, >+ basketno => $basketno, > } > ); >- Koha::Acquisition::Baskets->find($b)->close; >+ Koha::Acquisition::Baskets->find($basketno)->close; > > # Log the approval > if ( C4::Context->preference("AcquisitionLog") ) { >- my $approved = Koha::Acquisition::Baskets->find($b); >+ my $approved = Koha::Acquisition::Baskets->find($basketno); > logaction( > 'ACQUISITIONS', > 'APPROVE_BASKET', >- $b, >+ $basketno, > to_json( $approved->unblessed ) > ); > } >diff --git a/acqui/basket.pl b/acqui/basket.pl >index 57621b4e7ac..558612100de 100755 >--- a/acqui/basket.pl >+++ b/acqui/basket.pl >@@ -103,7 +103,81 @@ if ($ediaccount) { > join => 'branch', > } > ); >- $template->param( eans => \@eans ); >+ >+ # Check if this basket was created from a QUOTE message and get the buyer EAN >+ my $quote_ean = undef; >+ my $quote_message = $schema->resultset('EdifactMessage')->search( >+ { >+ basketno => $basketno, >+ message_type => 'QUOTE' >+ } >+ )->first; >+ >+ if ($quote_message) { >+ >+ # For the first message in a QUOTE transport, the raw_msg contains the full message >+ # For subsequent messages, we need to get it from the original message >+ my $raw_msg = $quote_message->raw_msg; >+ >+ # If this is a split message (empty raw_msg), find the original message >+ if ( !$raw_msg ) { >+ >+ # Look for the original message with the same filename but without suffix >+ my $original_filename = $quote_message->filename; >+ $original_filename =~ s/_\d+$//; # Remove _2, _3, etc. suffix >+ >+ my $original_message = $schema->resultset('EdifactMessage')->search( >+ { >+ filename => $original_filename, >+ message_type => 'QUOTE', >+ vendor_id => $quote_message->vendor_id >+ } >+ )->first; >+ >+ $raw_msg = $original_message->raw_msg if $original_message; >+ } >+ >+ if ($raw_msg) { >+ >+ # Parse the EDI message to find the buyer EAN for THIS specific basket >+ eval { >+ require Koha::Edifact; >+ my $edi = Koha::Edifact->new( { transmission => $raw_msg } ); >+ my $messages = $edi->message_array(); >+ >+ # For multiple messages, we need to find which message corresponds to this basket >+ # The current process_quote creates baskets in order, so we need to determine the index >+ if ( @{$messages} ) { >+ if ( @{$messages} == 1 ) { >+ >+ # Single message case >+ $quote_ean = $messages->[0]->buyer_ean; >+ } else { >+ >+ # Multiple message case - determine which message this basket belongs to >+ # Check if this is a split message by looking at the filename suffix >+ my $filename = $quote_message->filename; >+ if ( $filename =~ /_(\d+)$/ ) { >+ my $message_index = $1 - 1; # Convert to 0-based index >+ $quote_ean = $messages->[$message_index]->buyer_ean if $messages->[$message_index]; >+ } else { >+ >+ # This is the first message (no suffix) >+ $quote_ean = $messages->[0]->buyer_ean; >+ } >+ } >+ } >+ }; >+ >+ # If there's an error parsing, we'll just fall back to normal behavior >+ # Error is logged but doesn't prevent normal EAN selection >+ } >+ } >+ >+ $template->param( >+ eans => \@eans, >+ quote_ean => $quote_ean >+ ); > } > > unless ( CanUserManageBasket( $loggedinuser, $basket, $userflags ) ) { >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/basket.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/basket.tt >index 2176e799594..45199468c47 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/basket.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/basket.tt >@@ -129,8 +129,34 @@ > <button class="btn btn-default btn-xs disabled" disabled="disabled" href="#"><i class="fa fa-download"></i> Create EDIFACT order</button> > </div> > [% ELSE %] >+ [%# Check if we have a quote EAN that matches one of the available EANs %] >+ [% quote_ean_match = 0 %] >+ [% quote_ean_account = {} %] >+ [% IF quote_ean %] >+ [% FOREACH eanacct IN eans %] >+ [% IF eanacct.ean == quote_ean %] >+ [% quote_ean_match = 1 %] >+ [% quote_ean_account = eanacct %] >+ [% LAST %] >+ [% END %] >+ [% END %] >+ [% END %] >+ > <div class="btn-group"> >- [% IF eans.size == 1 %] >+ [%# If we have a quote EAN match, use it directly, otherwise use original logic %] >+ [% IF quote_ean_match %] >+ <a >+ class="btn btn-default btn-xs submit-form-link" >+ href="#" >+ data-ean="[% quote_ean_account.ean | html %]" >+ data-basketno="[% basketno | html %]" >+ data-action="basket.pl" >+ data-method="post" >+ data-op="cud-ediorder" >+ title="Using EAN from original QUOTE message" >+ ><i class="fa fa-download"></i> Create EDIFACT order</a >+ > >+ [% ELSIF eans.size == 1 %] > <a > class="btn btn-default btn-xs submit-form-link" > href="#" >-- >2.50.1
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
|
Splinter Review
Attachments on
bug 40587
:
185099
| 185100