Bugzilla – Attachment 183862 Details for
Bug 20253
Optionally use buyer's purchase order number from EDIFACT quote in basket name
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Bug 20253: (follow-up) Add RFF+ON segments to outgoing ORDER messages
Bug-20253-follow-up-Add-RFFON-segments-to-outgoing.patch (text/plain), 7.54 KB, created by
Martin Renvoize (ashimema)
on 2025-07-08 14:30:56 UTC
(
hide
)
Description:
Bug 20253: (follow-up) Add RFF+ON segments to outgoing ORDER messages
Filename:
MIME Type:
Creator:
Martin Renvoize (ashimema)
Created:
2025-07-08 14:30:56 UTC
Size:
7.54 KB
patch
obsolete
>From 0a36e6f57f01cfc354851c0550dea463400cabeb Mon Sep 17 00:00:00 2001 >From: Martin Renvoize <martin.renvoize@openfifth.co.uk> >Date: Tue, 8 Jul 2025 15:19:10 +0100 >Subject: [PATCH] Bug 20253: (follow-up) Add RFF+ON segments to outgoing ORDER > messages > >When vendors are configured to use purchase order numbers for basket naming, >the purchase order number should be included in outgoing ORDER messages as >an RFF+ON (Reference - Order Number) segment for proper EDI workflow continuity. > >This follow-up ensures that: >1. Purchase order numbers from incoming QUOTE messages are preserved >2. The same purchase order numbers are sent back in ORDER messages >3. Vendors receive the reference numbers they expect for order processing > >Implementation: >- Added _get_purchase_order_number() method to extract PO number from basket name > when vendor is configured with basket_name_source = 'purchase_order_number' >- Modified order_msg_header() to include RFF+ON segment when PO number available >- Added comprehensive tests for RFF+ON segment generation in ORDER messages > >Test Plan: >1. Apply patches >2. Configure a vendor EDI account with "Basket name source" = "Purchase order number" >3. Process a QUOTE message containing RFF+ON segment >4. Verify basket is created with purchase order number as name >5. Generate ORDER message from the basket >6. Verify ORDER message contains RFF+ON segment with the purchase order number >7. Run tests: prove t/db_dependent/Koha/Edifact/Order.t > >This completes the round-trip EDI workflow for purchase order number handling. >--- > Koha/Edifact/Order.pm | 22 +++++ > t/db_dependent/Koha/Edifact/Order.t | 124 +++++++++++++++++++++++++++- > 2 files changed, 145 insertions(+), 1 deletion(-) > >diff --git a/Koha/Edifact/Order.pm b/Koha/Edifact/Order.pm >index 0bf67829cae..b0b254139d0 100644 >--- a/Koha/Edifact/Order.pm >+++ b/Koha/Edifact/Order.pm >@@ -52,6 +52,9 @@ sub new { > # convenient alias > $self->{basket} = $self->{orderlines}->[0]->basketno; > $self->{message_date} = dt_from_string(); >+ >+ # Extract purchase order number for RFF+ON segment >+ $self->{purchase_order_number} = $self->_get_purchase_order_number(); > } > > # validate that its worth proceeding >@@ -283,6 +286,11 @@ sub order_msg_header { > $self->{recipient}->id_code_qualifier > ); > >+ # RFF Purchase order number (if configured) >+ if ($self->{purchase_order_number}) { >+ push @header, "RFF+ON:$self->{purchase_order_number}$seg_terminator"; >+ } >+ > # repeat for for other relevant parties > > # CUX currency >@@ -693,6 +701,20 @@ sub encode_text { > return $string; > } > >+sub _get_purchase_order_number { >+ my $self = shift; >+ >+ # If the vendor EDI account is configured to use purchase order numbers for basket names, >+ # then the basket name IS the purchase order number >+ my $vendor_config = $self->{recipient}; >+ if ($vendor_config && $vendor_config->basket_name_source && >+ $vendor_config->basket_name_source eq 'purchase_order_number') { >+ return $self->{basket}->basketname; >+ } >+ >+ return; >+} >+ > 1; > __END__ > >diff --git a/t/db_dependent/Koha/Edifact/Order.t b/t/db_dependent/Koha/Edifact/Order.t >index 3a565a93bff..bf2b22cd20d 100755 >--- a/t/db_dependent/Koha/Edifact/Order.t >+++ b/t/db_dependent/Koha/Edifact/Order.t >@@ -20,7 +20,7 @@ > use Modern::Perl; > > use Test::NoWarnings; >-use Test::More tests => 4; >+use Test::More tests => 5; > > use Koha::Edifact::Order; > >@@ -280,3 +280,125 @@ subtest 'filename() tests' => sub { > > $schema->storage->txn_rollback; > }; >+ >+subtest 'RFF+ON purchase order number generation' => sub { >+ plan tests => 3; >+ >+ $schema->storage->txn_begin; >+ >+ # Create vendor with basket_name_source set to purchase_order_number >+ my $vendor_po = $builder->build( >+ { >+ source => 'VendorEdiAccount', >+ value => { >+ description => 'Test vendor PO mode', >+ basket_name_source => 'purchase_order_number', >+ standard => 'EUR', >+ } >+ } >+ ); >+ >+ # Create vendor with basket_name_source set to filename (default) >+ my $vendor_filename = $builder->build( >+ { >+ source => 'VendorEdiAccount', >+ value => { >+ description => 'Test vendor filename mode', >+ basket_name_source => 'filename', >+ standard => 'EUR', >+ } >+ } >+ ); >+ >+ # Create baskets with different naming schemes >+ my $basket_po = $builder->build( >+ { >+ source => 'Aqbasket', >+ value => { >+ basketname => 'PO123456789', # Purchase order number >+ booksellerid => $vendor_po->{vendor_id}, >+ } >+ } >+ ); >+ >+ my $basket_filename = $builder->build( >+ { >+ source => 'Aqbasket', >+ value => { >+ basketname => 'quote_file.ceq', # Filename >+ booksellerid => $vendor_filename->{vendor_id}, >+ } >+ } >+ ); >+ >+ # Create orders for the baskets >+ my $order_po = $builder->build( >+ { >+ source => 'Aqorder', >+ value => { >+ basketno => $basket_po->{basketno}, >+ orderstatus => 'new', >+ } >+ } >+ ); >+ >+ my $order_filename = $builder->build( >+ { >+ source => 'Aqorder', >+ value => { >+ basketno => $basket_filename->{basketno}, >+ orderstatus => 'new', >+ } >+ } >+ ); >+ >+ # Create EAN object >+ my $ean = $builder->build( >+ { >+ source => 'EdifactEan', >+ value => { >+ ean => '1234567890123' >+ } >+ } >+ ); >+ >+ # Get database objects >+ my $dbic_vendor_po = $schema->resultset('VendorEdiAccount')->find($vendor_po->{id}); >+ my $dbic_vendor_filename = $schema->resultset('VendorEdiAccount')->find($vendor_filename->{id}); >+ my $dbic_ean = $schema->resultset('EdifactEan')->find($ean->{id}); >+ my @orderlines_po = $schema->resultset('Aqorder')->search({ basketno => $basket_po->{basketno} }); >+ my @orderlines_filename = $schema->resultset('Aqorder')->search({ basketno => $basket_filename->{basketno} }); >+ >+ # Test order generation with purchase order number >+ my $order_obj_po = Koha::Edifact::Order->new( >+ { >+ orderlines => \@orderlines_po, >+ vendor => $dbic_vendor_po, >+ ean => $dbic_ean, >+ } >+ ); >+ >+ # Test order generation with filename >+ my $order_obj_filename = Koha::Edifact::Order->new( >+ { >+ orderlines => \@orderlines_filename, >+ vendor => $dbic_vendor_filename, >+ ean => $dbic_ean, >+ } >+ ); >+ >+ # Test that purchase order number is extracted correctly >+ is($order_obj_po->{purchase_order_number}, 'PO123456789', >+ 'Purchase order number extracted from basket name when vendor configured for PO mode'); >+ >+ # Test that no purchase order number is extracted when vendor uses filename mode >+ is($order_obj_filename->{purchase_order_number}, undef, >+ 'No purchase order number when vendor configured for filename mode'); >+ >+ # Test that RFF+ON segment is included in order header when purchase order number present >+ my $transmission = $order_obj_po->encode(); >+ like($transmission, qr/RFF\+ON:PO123456789'/, >+ 'RFF+ON segment included in ORDER message when purchase order number present'); >+ >+ $schema->storage->txn_rollback; >+}; >-- >2.50.0
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 20253
:
183859
|
183860
|
183861
|
183862
|
183953
|
183954
|
183955
|
183956
|
183957
|
183958
|
184000
|
184001
|
184002
|
184003
|
184004
|
184005
|
184006
|
184007
|
185221
|
185222
|
185223
|
185224
|
185225
|
185226
|
185227
|
185228