Bug 30144: Add servicing_instruction field to aqorders table

This patch adds a new TEXT field 'servicing_instruction' to the aqorders
table to store EDIFACT servicing instructions (GIR LVT/LVC segments) as JSON.

The field stores an array of instruction groups, where each group is an
array of instruction objects with 'type' (LVC or LVT) and 'value' fields.

Structure: [[{type:"LVC",value:"BB"},{type:"LVT",value:"text"}],[...]]

This allows for:
- Multiple servicing instruction groups per order line
- Combinations of coded (LVC) and free-text (LVT) instructions
- Instructions that work together in groups

Also adds EDIFACT_SI authorized value category with EDItEUR List 3B
servicing instruction codes for coded (LVC) instructions.

Test plan:
1. Run database update
2. Verify aqorders.servicing_instruction field exists
3. Verify EDIFACT_SI authorized value category is created
4. Verify authorized values include codes like BB, BI, etc.

Sponsored-by: Martin Renvoize <martin.renvoize@gmail.com>
Signed-off-by: Hannah Dunne-Howrie <hdunne-howrie@westminster.gov.uk>
Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
Signed-off-by: Pedro Amorim <pedro.amorim@openfifth.co.uk>
This commit is contained in:
Martin Renvoize 2026-02-12 18:00:24 +00:00 committed by Pedro Amorim
parent 561ef2f025
commit b78a308e60
No known key found for this signature in database
GPG Key ID: 06B75BA7F3894D55
2 changed files with 77 additions and 0 deletions

View File

@ -0,0 +1,76 @@
use Modern::Perl;
use Koha::Installer::Output qw(say_warning say_success say_info);
return {
bug_number => "30144",
description => "Add servicing_instruction support for EDIFACT orders",
up => sub {
my ($args) = @_;
my ( $dbh, $out ) = @$args{qw(dbh out)};
# Add servicing_instruction column to aqorders table
if ( !column_exists( 'aqorders', 'servicing_instruction' ) ) {
$dbh->do(
q{
ALTER TABLE aqorders
ADD COLUMN servicing_instruction TEXT DEFAULT NULL
COMMENT 'Servicing instructions from vendor (EDIFACT LVT/LVC) stored as JSON array'
AFTER suppliers_report
}
);
say_success( $out, "Added column 'aqorders.servicing_instruction'" );
}
# Add EDIFACT_SI category for servicing instruction codes
$dbh->do(
q{
INSERT IGNORE INTO authorised_value_categories (category_name, is_system)
VALUES ('EDIFACT_SI', 0)
}
);
say_success( $out, "Added authorized value category 'EDIFACT_SI'" );
# Add EDItEUR List 3B servicing instruction codes
$dbh->do(
q{
INSERT IGNORE INTO authorised_values (category, authorised_value, lib, lib_opac)
VALUES
('EDIFACT_SI', 'BB', 'Barcode labelling', 'Barcode labelling'),
('EDIFACT_SI', 'BBN', 'Do not apply barcode labels', 'Do not apply barcode labels'),
('EDIFACT_SI', 'BC', 'Classification', 'Classification'),
('EDIFACT_SI', 'BCN', 'Do not classify', 'Do not classify'),
('EDIFACT_SI', 'BI', 'Binding: binding, reinforcing, laminating', 'Binding: binding, reinforcing, laminating'),
('EDIFACT_SI', 'BIN', 'Do not apply normal binding', 'Do not apply normal binding'),
('EDIFACT_SI', 'BJ', 'Sleeving: jackets, sleeves, wallets', 'Sleeving: jackets, sleeves, wallets'),
('EDIFACT_SI', 'BJN', 'Do not supply normal sleeving', 'Do not supply normal sleeving'),
('EDIFACT_SI', 'BP', 'Audio/CD-ROM packaging: special pouches', 'Audio/CD-ROM packaging: special pouches'),
('EDIFACT_SI', 'BPN', 'Do not supply normal audio/CD-ROM packaging', 'Do not supply normal audio/CD-ROM packaging'),
('EDIFACT_SI', 'BS', 'Security fitting: triggers, Knogo labels', 'Security fitting: triggers, Knogo labels'),
('EDIFACT_SI', 'BSN', 'Do not apply usual security fitting', 'Do not apply usual security fitting'),
('EDIFACT_SI', 'CA', 'Cataloguing: catalogue record supply', 'Cataloguing: catalogue record supply'),
('EDIFACT_SI', 'CAN', 'Do not supply catalogue record', 'Do not supply catalogue record'),
('EDIFACT_SI', 'JK', 'Plastic wallet on paperback', 'Plastic wallet on paperback'),
('EDIFACT_SI', 'JKN', 'Do not supply plastic wallet', 'Do not supply plastic wallet'),
('EDIFACT_SI', 'KA', 'Kapco: thick laminate film on paperback', 'Kapco: thick laminate film on paperback'),
('EDIFACT_SI', 'KAN', 'Do not apply Kapco', 'Do not apply Kapco'),
('EDIFACT_SI', 'LA', 'Thin laminate film on paperback', 'Thin laminate film on paperback'),
('EDIFACT_SI', 'LAN', 'Do not laminate', 'Do not laminate'),
('EDIFACT_SI', 'RE', 'Reinforcement of hardback', 'Reinforcement of hardback'),
('EDIFACT_SI', 'REN', 'Do not reinforce hardback', 'Do not reinforce hardback'),
('EDIFACT_SI', 'RP', 'Reinforcement of paperback', 'Reinforcement of paperback'),
('EDIFACT_SI', 'RPN', 'Do not reinforce paperback', 'Do not reinforce paperback'),
('EDIFACT_SI', 'SF', 'Sewn flexi', 'Sewn flexi'),
('EDIFACT_SI', 'SFN', 'Do not sew', 'Do not sew'),
('EDIFACT_SI', 'SL', 'Plastic sleeve on hardback', 'Plastic sleeve on hardback'),
('EDIFACT_SI', 'SLN', 'Do not sleeve plastic on hardback', 'Do not sleeve plastic on hardback'),
('EDIFACT_SI', 'TR', 'Traditional case binding of paperback', 'Traditional case binding of paperback'),
('EDIFACT_SI', 'TRN', 'Do not case bind paperback', 'Do not case bind paperback'),
('EDIFACT_SI', 'NF', 'Non-standard servicing: see free text', 'Non-standard servicing: see free text'),
('EDIFACT_SI', 'NS', 'No servicing', 'No servicing'),
('EDIFACT_SI', 'NX', 'Non-standard servicing: see instructions sent outside EDI', 'Non-standard servicing: see instructions sent outside EDI'),
('EDIFACT_SI', 'PF', 'Binding as supplied by publisher', 'Binding as supplied by publisher')
}
);
say_success( $out, "Added EDItEUR List 3B servicing instruction codes to 'EDIFACT_SI' category" );
},
};

View File

@ -780,6 +780,7 @@ CREATE TABLE `aqorders` (
`suppliers_reference_number` varchar(35) DEFAULT NULL COMMENT 'Suppliers unique edifact quote ref',
`suppliers_reference_qualifier` varchar(3) DEFAULT NULL COMMENT 'Type of number above usually ''QLI''',
`suppliers_report` mediumtext DEFAULT NULL COMMENT 'reports received from suppliers',
`servicing_instruction` text DEFAULT NULL COMMENT 'Servicing instructions from vendor (EDIFACT LVT/LVC) stored as JSON array',
`estimated_delivery_date` date DEFAULT NULL COMMENT 'Estimated delivery date',
`invoice_unitprice` decimal(28,6) DEFAULT NULL COMMENT 'the unit price in foreign currency',
`invoice_currency` varchar(10) DEFAULT NULL COMMENT 'the currency of the invoice_unitprice',