commit 4dae704301bad1d8dab548fa0f63fe1f623f6c1b Author: Pedro Amorim Date: Wed Aug 19 16:05:48 2026 +0000 Bug 41029: DBRev 26.06.00.016 Signed-off-by: Pedro Amorim commit 575e90f88f42f2ca6d8ca89f30c1c085fd7e9cfd Author: Martin Renvoize Date: Wed Jul 1 18:45:53 2026 +0100 Bug 41029: (QA follow-up) Seed add_to_basket record source and tidy atomicupdate Without a matching entry in the record_sources table, the new "Add to basket" option never appears in the Source filter dropdown of the marc-overlay-rules admin page for module=source, since that dropdown is populated from Koha::RecordSources, not the template's label switch. Seed it in both the mandatory install-time data and the upgrade atomicupdate, matching how batchimport/z3950/etc. were introduced. Also drop the unused say_warning import, route success messages through say_success instead of a bare say, and simplify the selectrow_array calls. Signed-off-by: Martin Renvoize Signed-off-by: Pedro Amorim commit f473c7d451fa9ffcd157643e03e5c31986337573 Author: Nick Clemens Date: Wed Oct 15 18:58:42 2025 +0000 Bug 41029: Add option for marc overlay rules to apply when adding to a basket This patch adds a new option to allow defining overlay rules for 'Add to basket' - such that they will be used when adding orders in acquisition. Existing 'Staged MARC Import' rules will be copied to the new fitler in order to preserve behavior To test: 1 - Paste the following into MarcFieldsToOrder and save price: 975$p quantity: 975$q budget_code: 975$h 2 - Paste the following into MarcItemFieldsToOrder and save homebranch: 949$a holdingbranch: 949$b itype: 949$y nonpublic_note: 949$x public_note: 949$z loc: 949$c ccode: 949$8 notforloan: 949$7 uri: 949$u copyno: 949$t price: 949$g replacementprice: 949$v itemcallnumber: 949$o quantity: 949$k budget_code: 949$l 3 - Go to Admin -> Record overlay rules 4 - Define 2 rules: Source - Staged Marc Import - 949 - Add and append (the rest of the options are set when add and append is selected Source - Staged Marc Import - * - Protect (the rest of the options are set when add and append is selected 5 - Grab test file from bug 39518 6 - Import the records, ignoring items 7 - Edit the test file and change some values for the 949 rows 8 - Go to Acquisitions, find a basket for a vendor, add to basket from a new file 9 - Stage the file to find matches (already imported above) and to replace 10 - Complete the orders 11 - View the record and confirm the new 949 are added 12 - Edit the 949 in the file again 13 - Apply patch, update database, restart all 14 - Edit overlay rules and remove the 'Staged Marc Import' rules, leaving only the 'Add to basket rules' 15 - Add to basket again using the updated file and confirm new 949 are added 16 - Success! Signed-off-by: Benjamin Daeuber Signed-off-by: Martin Renvoize Signed-off-by: Pedro Amorim commit 9fc9f84b8d2ea4bc49bd8906ac89589243f9a494 Author: Tomás Cohen Arazi Date: Wed Aug 5 15:25:15 2026 +0000 Bug 28740: (follow-up) Add missing C4::Log import for cronlogaction The patch added cronlogaction() calls but did not import the function. This caused a runtime error: Undefined subroutine &main::cronlogaction. Test plan: 1. Apply patch 2. Run: $ ktd --shell k$ perl misc/cronjobs/cleanup_database.pl --illrequests-days 30 \ --illrequests-status COMP -v => SUCCESS: Dry-run works, reports count of requests that would be removed 3. Run with --confirm to actually purge 4. Sign off :-D Signed-off-by: Tomas Cohen Arazi Signed-off-by: Pedro Amorim commit 5ebc4d79a1d81c2957b128a18c9cd673f3478d79 Author: Lari Strand Date: Tue May 12 09:48:04 2026 +0300 Bug 28740: Add option for cleaning up ILL requests This adds two new parameters: --illrequests-status --illrequests-days (optional, defaults to 30 days) These can be repeated to include specific statuses for cleanup. At least one status must be specified. To test: 0 - Apply patch 1 - Create several ILL requests with different statuses (e.g., CANCELLED, REJECTED, COMPLETED, PENDING) 2 - Set some requests to be older than 30 days (update their updated timestamp) 3 - Run cleanup_database.pl with --illrequests-status CANCELLED 4 - CANCELLED requests older than 30 days are removed, others remain 5 - Run cleanup_database.pl with --illrequests-status CANCELLED --illrequests-status REJECTED 6 - Both CANCELLED and REJECTED requests older than 30 days are removed, other statuses remain 7 - Run cleanup_database.pl with --illrequests-days 5 --illrequests-status PENDING 8 - PENDING requests older than 5 days are removed 9 - Verify dry-run mode (no --confirm) correctly counts records that would be deleted without deleting them 10 - Run cleanup_database.pl with --illrequests-days without any --illrequests-status 11 - Error message displayed requiring at least one status to be specified Sponsored-by: Koha-Suomi Oy Signed-off-by: John Doe edit: tidied the file (tcohen) Signed-off-by: Pedro Amorim commit f2003e3e52d60f9b088a5ad06536a745e1010dcd Author: Pedro Amorim Date: Wed Aug 19 13:10:08 2026 +0000 Bug 35104: (RM follow-up) Restore StripNonXmlChars in TransformHtmlToMarc Removed by 6726b1a2544 on the assumption store() strips centrally - but TransformHtmlToMarc never calls store(), so callers like addbiblio.pl (FindDuplicate, duplicate redisplay) see unstripped control characters again, the same failure Bug 34549 fixed. repair_marcxml covers more faults but works on full MARCXML and can throw - too big a change here; left as a follow-up. Test plan: prove t/db_dependent/Biblio/TransformHtmlToMarc.t Signed-off-by: Pedro Amorim commit dd7777c8b9dfede54c93b4d20b7abcae8627e9a2 Author: Olivia Reynolds Date: Tue Aug 18 15:02:27 2026 +0000 Bug 43313: Fix catalogue detail shelving location display During the tidying up of Bug 41566, av_loc was accidentally changed to map descriptions to codes, rather than vice-versa. This broke the formatting of item permanent locations. Test plan (for KTD): 1. Navigate to an catalogue detail page, for example http://localhost:8081/cgi-bin/koha/catalogue/detail.pl?biblionumber=262 2. Run the following SQL, replacing 262 with the biblionumber of your chosen page: UPDATE items SET location='CHILD' SET permanent_location='GEN' WHERE biblionumber=262; 3. Refresh the page and verify the items' shelving locations display "(Children's area)" only. 4. Apply patch and force refresh. 5. Verify the shelving location now correctly displays "General stacks" and "(Children's area)" on separate lines. Sponsored-by: Open Fifth Signed-off-by: John Vinke Signed-off-by: Andrew Fuerste Henry Signed-off-by: Pedro Amorim commit bad9bb47ae483c62d9f9445669482a6b13c24915 Author: Martin Renvoize Date: Mon Aug 3 11:58:40 2026 +0100 Bug 43215: preferences.js: Report one save confirmation per preference, not per checkbox option Checkbox-group system preferences (multiple_sortable, ill_backends, and the OPAC/staff interface language selectors) render one checkbox per option. All the checkboxes for a given preference share its 'name' attribute, but each has its own unique 'id'. Saving such a preference produced one "Saved preference ..." confirmation line per checkbox instead of a single line for the preference as a whole, because KOHA.Preferences.Success() built the message from each modified element's 'id' rather than its 'name'. A related issue: the checkbox 'change' handler marked every '.preference-checkbox' on the whole page as modified, regardless of which preference it belonged to. This meant editing one checkbox-group preference silently re-saved (and, before this patch, also reported as saved) any other checkbox-group preference sharing the same tab - for example, editing OPACLanguages would also touch the unrelated StaffInterfaceLanguages preference on the I18N/L10N tab. This patch: * Scopes the 'modified' marking to checkboxes sharing the same preference name, so unrelated checkbox-group preferences on the same tab are left alone. * Groups the save confirmation message by preference name (deduplicated), so each preference produces exactly one "Saved preference" line regardless of how many options it has. Test plan: 1. Go to Administration > System preferences and search for OPACAuthorIdentifiersAndInformation. 2. Select two or more identifier types and click Save. 3. Confirm the confirmation banner shows a single "Saved preference OPACAuthorIdentifiersAndInformation" line, not one per selected identifier. 4. Drag one of the selected items to reorder it, click Save again, confirm you still get only one confirmation line, then reload the page and confirm the new order was kept. 5. Go to Administration > System preferences > I18N/L10N tab. 6. Toggle one of the checkboxes under "Enable the following languages on the OPAC" (OPACLanguages) and click Save. 7. Confirm the confirmation only reports OPACLanguages as saved - the staff interface language list (StaffInterfaceLanguages) should not appear in the message. 8. Reload the page and confirm the staff interface language selection is unchanged. 9. As a sanity check, modify an ordinary non-checkbox preference (e.g. a free text or yes/no preference) and confirm it still reports exactly one "Saved preference" line, same as before this patch. Signed-off-by: David Nind Signed-off-by: Andrew Fuerste Henry Signed-off-by: Pedro Amorim commit 549e0b3068c5ac1234b8694f4170e70b002bb5bb Author: Andrew Fuerste-Henry Date: Tue Aug 4 13:25:50 2026 +0000 Bug 42553: (QA Follow-up) tidy preferences.pl Signed-off-by: Andrew Fuerste Henry Signed-off-by: Pedro Amorim commit eb93c2b2e7ab5547c01df84aecdd5181a635cb2e Author: Martin Renvoize Date: Thu May 7 18:09:26 2026 +0100 Bug 42553: preferences.pl: Allow 'multiple_sortable' to use 'authval' source The 'choices' renderer in admin/preferences.pl already supports a dynamic 'authval' source: the YAML can say choices: authval source: SOMECATEGORY and the choices are populated from the named authorised value category at render time. The 'multiple_sortable' renderer (the SortableJS-backed drag-and-drop multi-select used by OPACAuthorIdentifiersAndInformation and ArticleRequestsSupportedFormats) had no equivalent — choices had to be hardcoded in the .pref YAML. This patch adds the same dispatcher to 'multiple_sortable' so prefs needing an ordered, picker-driven multi-select of authorised values can declare: multiple_sortable: authval source: PAYMENT_TYPE Behaviour for existing prefs (which pass a hash directly to 'multiple_sortable') is unchanged — the new branch only fires when the value is a scalar. Test plan: 1. Create a temporary system preference using the new pattern, e.g. by adding to admin/preferences/accounting.pref: - pref: TestSortableAV multiple_sortable: authval source: PAYMENT_TYPE and seeding INSERT INTO systempreferences with type='Free'. 2. Visit Administration > System preferences and find the pref. 3. Verify the widget renders as a sortable list of every value in the PAYMENT_TYPE authorised value category, with checkboxes and drag handles, matching the look of OPACAuthorIdentifiersAndInformation. 4. Pick two or three, reorder them, save. 5. Reload the page and verify the order and selection are preserved. 6. With 'source' omitted or 'multiple_sortable' set to a string other than 'authval', verify the page raises a clear error. 7. Existing prefs (OPACAuthorIdentifiersAndInformation, ArticleRequestsSupportedFormats) continue to render unchanged. Sponsored-by: OpenFifth Signed-off-by: Jackie Usher Signed-off-by: Debbie McCarthy Signed-off-by: Hannah Dunne-Howrie Signed-off-by: Andrew Fuerste Henry Signed-off-by: Pedro Amorim commit 812ac7155d366b3190b3c019d1098287eaa6d363 Author: Kyle M Hall Date: Tue Aug 18 15:21:49 2026 -0400 Bug 41197: Don't require a CSRF token for opac-account-pay-return.pl This page is intended for redirect/return from external payment vendors - they are not going to have/get a CSRF token from Koha for this. The payments are handled in a POST to the API, so this should not be a sensitive page, it just provides user confirmation. Some vendors use only a POST, we should not require CSRF on this page. Test Plan: 1) Apply the first patch 2) prove t/Koha/Middleware/CSRF.t 3) Note the tests fail! 4) Apply this patch 5) prove t/Koha/Middleware/CSRF.t 6) All tests pass! Signed-off-by: David Cook Signed-off-by: Pedro Amorim commit 3e87d13e6700848b9755610916f8417fd95b95c7 Author: Kyle M Hall Date: Tue Aug 18 15:21:47 2026 -0400 Bug 41197: Add unit tests Signed-off-by: David Cook Signed-off-by: Pedro Amorim commit 22fad96c0d2d857db4b77d760fed72cd082cabe4 Author: Pedro Amorim Date: Wed Aug 19 08:49:18 2026 +0000 Bug 35104: (RM follow-up) Fix regressions.t for Metadata's new auto-repair Koha::Biblio::Metadata->store() now repairs recoverable MARCXML faults before saving, so this test's invalid data no longer reaches the DB and detail.pl never hits a decoding error. Write the metadata directly via the DBIC row instead, bypassing store()'s repair, so the test still exercises detail.pl's own defensive handling of corrupt metadata. Test plan: prove t/db_dependent/selenium/regressions.t Signed-off-by: Pedro Amorim commit 868751b2212c37baf8d2bcfafd605220ecaad4ea Author: Pedro Amorim Date: Wed Aug 19 10:34:32 2026 +0000 Bug 43091: (RM follow-up) Give the OPAC self-renewal island a Pinia store hydrate() only installs Pinia for an island when its config.stores is non-empty. patron-self-renewal kept config: {} after islands-opac.ts was split out, so it never got one. http-client.js's post() calls submitting(), which needs Pinia's useMainStore(). With none active, it throws before fetch() runs - get() skips submitting() by default, so only the actual renewal submission failed. Test plan: prove t/cypress/integration/Islands/SelfRenewal.ts Signed-off-by: Pedro Amorim commit c4e70ad7454b345249d9bf7556a483e2eaa6f3ea Author: Pedro Amorim Date: Wed Aug 19 08:33:47 2026 +0000 Bug 35797: (RM follow-up): Fix xt/api.t prove xt/api.t Signed-off-by: Pedro Amorim commit 0e69e8d3a13d618c56ae345d2efb93165f94217f Author: Pedro Amorim Date: Tue Aug 18 11:04:37 2026 +0000 Bug 41996: DBRev 26.06.00.015 Signed-off-by: Pedro Amorim commit d9b06c79e358470729c106bbb1e164388f540d48 Author: Kyle M Hall Date: Mon Jun 29 10:02:09 2026 -0400 Bug 41996: (QA follow-up) Fix up atomic update Signed-off-by: Kyle M Hall Signed-off-by: Pedro Amorim commit d576dbadcb5b58aa8f4eeb7d275551c6c30397ac Author: Kyle M Hall Date: Fri Jun 26 15:37:03 2026 -0400 Bug 41996: (QA follow-up) Test that invoicenumber is recorded on EDI invoice errors Signed-off-by: Kyle M Hall Signed-off-by: Pedro Amorim commit 7e445f1ce68ba4d01f1063be533ab1ff6c1bfd20 Author: Kyle M Hall Date: Fri Jun 26 15:35:14 2026 -0400 Bug 41996: (QA follow-up) Update EDI.t for improved invoice error messages Signed-off-by: Kyle M Hall Signed-off-by: Pedro Amorim commit e9a442e93333e4dde42e8cca01ec879e25e80425 Author: Martin Renvoize Date: Thu Mar 5 11:58:21 2026 +0000 Bug 41996: Filter EDI errors on invoice page by invoicenumber The invoice page previously fetched all edifact_errors for the EDI message, causing errors from unrelated invoice lines to appear on every invoice generated from the same EDI file. For example, one unmatched ordernumber in a file with 20 invoices would flag all 20 as having errors. Now only errors where invoicenumber matches the current invoice (or where invoicenumber is NULL, indicating a message-level error) are displayed. Signed-off-by: Ray Delahunty Signed-off-by: Hannah Dunne-Howrie Signed-off-by: Kyle M Hall Signed-off-by: Pedro Amorim commit a3889a7d90abaa1ee4bed65429006295df52ae44 Author: Martin Renvoize Date: Thu Mar 5 11:57:08 2026 +0000 Bug 41996: Thread invoicenumber through EDI invoice error recording All errors generated during process_invoice and receipt_items now store the invoicenumber of the specific invoice being processed. This allows errors to be displayed only on the relevant invoice page rather than appearing on every invoice generated from the same EDI file. Also fixes two pre-existing spacing bugs in error message strings ("itemnumberis missing" and "barcode"for invoice line"). Signed-off-by: Ray Delahunty Signed-off-by: Hannah Dunne-Howrie Signed-off-by: Kyle M Hall Signed-off-by: Pedro Amorim commit 51e4567ca676228d9dc0728c9a4f5e4a2d3a3281 Author: Martin Renvoize Date: Thu Mar 5 13:01:42 2026 +0000 Bug 41996: Schema Updates Signed-off-by: Ray Delahunty Signed-off-by: Hannah Dunne-Howrie Signed-off-by: Kyle M Hall Signed-off-by: Pedro Amorim commit 60cde3718a498a5c789be52acf03c3973c05eb5c Author: Martin Renvoize Date: Thu Mar 5 11:30:01 2026 +0000 Bug 41996: Add invoicenumber column to edifact_errors table Adds an optional invoicenumber column to edifact_errors so that errors generated during invoice processing can be associated with the specific invoice they relate to, rather than only the EDI message as a whole. Message-level errors (e.g. unmatched vendor EAN) leave invoicenumber NULL, indicating they apply to the whole file. Signed-off-by: Ray Delahunty Signed-off-by: Hannah Dunne-Howrie Signed-off-by: Kyle M Hall Signed-off-by: Pedro Amorim commit 52d3cd3835394669d20b5a67c2280f6ad74d303c Author: Martin Renvoize Date: Thu Mar 5 11:15:36 2026 +0000 Bug 41996: Improve EDI invoice error messages for branch mismatches When EDI invoice processing fails to match an item to a branch, the error message now includes: - The ordernumber referenced in the invoice (RFF+LI segment) - The branches that order actually has items at - A hint that the ordernumber in the invoice may be incorrect Also adds a warning when an invoice line references an order that is already marked as complete, which can indicate the supplier sent the wrong ordernumber. These improvements help acquisitions staff and vendors quickly diagnose whether the problem is a supplier error (wrong RFF+LI value) rather than a Koha data issue. Signed-off-by: Ray Delahunty Signed-off-by: Hannah Dunne-Howrie Signed-off-by: Kyle M Hall Signed-off-by: Pedro Amorim commit 9e8075eaaf92be1cdb1101ecdad071ae88fa1198 Author: Kyle M Hall Date: Fri Jun 26 11:08:24 2026 -0400 Bug 42789: (QA follow-up) Add test for cancelling an order with a held item Signed-off-by: Kyle M Hall Signed-off-by: Pedro Amorim commit 220b09c4e0d6e96dc6b7e98faffcded99f8aca47 Author: Kyle M Hall Date: Fri Jun 26 11:08:24 2026 -0400 Bug 42789: (QA follow-up) Log item deletion failures during EDI cancellation This patch logs any object messages returned by cancel() to the EDI log, including the itemnumber if available. Signed-off-by: Kyle M Hall Signed-off-by: Pedro Amorim commit 45a60d487c325adfe1393217fae7c18790e1a5b4 Author: Martin Renvoize Date: Mon Jun 8 18:00:15 2026 +0100 Bug 42789: Add tests for process_ordrsp() cancellation handling Tests verify that EDI ORDRSP cancellations now use Koha::Acquisition::Order->cancel() rather than a raw ModOrder call: - Order status, cancellation reason and date are set correctly - On-order items linked via aqorders_items are deleted - Purchase suggestions linked to the biblio are reverted from ORDERED back to ACCEPTED - Non-cancellation actions update suppliers_report only - Missing ordernumbers are handled gracefully without dying Sponsored-by: OpenFifth Signed-off-by: Sharon Dugdale Signed-off-by: Kyle M Hall Signed-off-by: Pedro Amorim commit 70f5d1d3f1657e44b0feebf0d43825d1dd5935fa Author: Martin Renvoize Date: Mon Jun 8 16:55:57 2026 +0100 Bug 42789: Add missing POD for _validate_location_code and _validate_collection_code These private subs were added without pod_coverage documentation, causing a QA failure. Add minimal =head3 blocks to resolve it. Sponsored-by: OpenFifth Signed-off-by: Sharon Dugdale Signed-off-by: Kyle M Hall Signed-off-by: Pedro Amorim commit 6c55a4e7d47af52d2187f5f9ee44299074e0d9f2 Author: Martin Renvoize Date: Mon Jun 8 16:53:01 2026 +0100 Bug 42789: EDI ORDRSP cancellation should use Koha::Acquisition::Order->cancel() The process_ordrsp() function was calling C4::Acquisition::ModOrder() directly when processing a supplier cancellation, which only updated the order status fields and left associated items and purchase suggestions untouched. Replace with Koha::Acquisition::Order->cancel(), which mirrors the behaviour of manual cancellation via the acquisitions UI: - Deletes on-order items via safe_delete() with error capture - Reverts any linked purchase suggestion from ORDERED back to ACCEPTED - Updates orderstatus, cancellationreason and datecancellationprinted The delete_biblio option is intentionally omitted (defaults to false) as silent biblio deletion is not appropriate for an automated EDI flow. ModOrder is retained for the non-cancellation branch which only needs to update suppliers_report. Sponsored-by: OpenFifth Signed-off-by: Sharon Dugdale Signed-off-by: Kyle M Hall Signed-off-by: Pedro Amorim commit 1031a1ba735f9c9265b4510164e8acd2cfe28ee5 Author: Kyle M Hall Date: Thu May 28 09:10:45 2026 -0400 Bug 42700: Remove dead $flags->{WAITING} code from C4::Members::patronflags After the previous patch, $flags->{WAITING} from C4::Members::patronflags is no longer read anywhere in Koha. Test Plan: 1) Apply this patch 2) prove t/db_dependent/SIP/ t/db_dependent/Members.t 3) Note all tests pass! Signed-off-by: David Nind Signed-off-by: Aleisha Amohia Signed-off-by: Pedro Amorim commit 69d9cc4e5912b1726d12700e02602d56c2e4c1ef Author: Kyle M Hall Date: Thu May 28 10:52:05 2026 -0400 Bug 42700: Avoid duplicate holds query query when building SIP patron object This patch fetches the patron's holds once into a list of Koha::Hold objects and derives both hold_items and unavail_holds from that single fetch. Test Plan: 1) Apply this patch 2) prove t/db_dependent/SIP/ 3) Note all tests pass! Signed-off-by: David Nind Signed-off-by: Aleisha Amohia Signed-off-by: Pedro Amorim commit eb57856091c4ec9c4fb4f43e6438eeb1ac2be5c9 Author: Kyle M Hall Date: Thu May 28 09:10:34 2026 -0400 Bug 42700: hold_items in SIP patron info should contain all holds, not just waiting Some 3rd party SIP clients calculate the number of holds ready for pickup as: holds ready for pickup = hold_items - unavail_holds Right now this can produce a negative number since hold_items contains only waiting holds. This patch makes hold_items contain all of the patron's holds, so hold_items - unavail_holds correctly gives the count of holds ready to be picked up. Test Plan: 1) Apply the first patch only 2) prove t/db_dependent/SIP/Patron.t 3) Note the new "hold_items counts all holds" subtest fails 4) Apply this patch 5) prove t/db_dependent/SIP/Patron.t 6) Note the tests pass! Signed-off-by: David Nind Signed-off-by: Aleisha Amohia Signed-off-by: Pedro Amorim commit d8cf6da3a24e01482e1af079f330106f7a05088c Author: Kyle M Hall Date: Thu May 28 09:09:54 2026 -0400 Bug 42700: Add unit tests Signed-off-by: David Nind Signed-off-by: Aleisha Amohia Signed-off-by: Pedro Amorim commit b33dae39add07f48180d3a2af061f62639df1a8b Author: Pedro Amorim Date: Tue Aug 18 09:41:43 2026 +0000 Bug 41649: DBIC Signed-off-by: Pedro Amorim commit 72b8e1d9ea91756b25905f2ba79c3902a6fe412c Author: Matt Blenkinsop Date: Thu Aug 6 16:10:15 2026 +0100 Bug 42018: Prevent null values from breaking patron duplicate matching Signed-off-by: David Nind Signed-off-by: Andrew Fuerste Henry Signed-off-by: Pedro Amorim commit dbd680caec9b559b7e115c2ae920b818d271eabd Author: Matt Blenkinsop Date: Thu Aug 6 16:10:26 2026 +0100 Bug 42018: Add unit test Test plan: 1) Apply just the unit test patch 2) Run t/db_dependent/Koha/Patrons.t 3) Test should fail 4) Apply remaining patch 5) Repeat step 3 6) Test should pass Signed-off-by: David Nind Signed-off-by: Andrew Fuerste Henry Signed-off-by: Pedro Amorim commit 37ef59a9c8aed5fdf0a1f0f9ee42097f1620128b Author: Aleisha Amohia Date: Wed Aug 5 00:30:33 2026 +0000 Bug 35729: Normalize ISBNs as ISBN-13 if cannot fallback to ISBN-10 ISBNs beginning with 979 do not have an ISBN-10 version, and need to be normalized to an ISBN-13 format. All others, if valid, can safely be normalized to ISBN-10 format (current behaviour). To set up 1. Download the attached sample records with 979 ISBNs 2. Log into the staff interface and go to Cataloguing 3. Go to Stage MARC records for import and upload the sample MARC file 4. Stage and import the biblio records 5. Once imported, open the detail pages for some of the records 6. In another tab, do a catalogue search and open the detail pages for ISBN-10 records, for example biblionumbers 6 and 54 To test 1. Apply the patch and restart services 2. Log into the staff interface and go to Koha Administration, Global system preferences, Enhanced Content tab 3. Cycle through each cover image service, enabled by the system preferences 4. With each cover image service is enabled, refresh the record detail pages you have open. The ISBN-10 records should CONTINUE to show their cover images. The newly imported ISBN-13 records should NOW show their cover images. 5. Confirm tests pass: t/db_dependent/Koha.t testing with ISBN 9798885795692 should return this image from Amazon: https://images-na.ssl-images-amazon.com/images/P/9798885795692.01.LZZZZZZZ.jpg testing with ISBN 9798876536914 should return this image from Amazon: https://images-na.ssl-images-amazon.com/images/P/9798876536914.01.LZZZZZZZ.jpg Sponsored-by: Horowhenua Libraries Trust Signed-off-by: David Nind Signed-off-by: Katrin Fischer Signed-off-by: Pedro Amorim commit d3d4a6ca96d5e3cd223b6e115db98191f6d2c2e1 Author: Andrew Fuerste-Henry Date: Thu Aug 13 14:46:48 2026 +0000 Bug 40799: (QA Follow-up) tidy template file Signed-off-by: Andrew Fuerste Henry Signed-off-by: Pedro Amorim commit be7436b4297bb527665a49c373600e0f8be9f090 Author: Hammat Wele Date: Wed Sep 17 12:38:18 2025 +0000 Bug 40799: Loading spinner not removed because .cover-slider is now used instead of .cover-slides After Bug 32642, the spinner on cover images is hidden by verify_cover_images() which removes the .cover-slides class from the cover container. However, Bug 33848 modified the SCSS so that the spinner is now triggered by .cover-slider instead of .cover-slides. As a result, the spinner is never removed, because verify_cover_images() only removes .cover-slides. Test plan 1- Follow the test plan from Bug 32642. ==> The spinner is displayed and never disappears. 2- Apply the patch 3- Reload the page. ==> The spinner disappears once the cover image is loaded. Signed-off-by: David Nind Signed-off-by: Andrew Fuerste Henry Signed-off-by: Pedro Amorim commit 813fb3d1436ef11ec90c8367226de351a4e9a0d7 Author: Owen Leonard Date: Tue Aug 11 07:47:23 2026 -0400 Bug 43260: (follow-up) Move debug menu JS into js_includes.inc The _() function isn't available to JS in intranet-bottom.inc. To test, apply the patch and test that the correct strings are translatable. In this example I'm testing fr-FR: - Update a translation: > gulp po:update > cd misc/translator > perl translate update fr-FR - Open the corresponding .po file for the strings pulled from the template e.g. misc/translator/po/fr-FR-staff-prog.po - Locate strings pulled from includes/js_includes.inc for translation, e.g.: #: koha-tmpl/intranet-tmpl/prog/en/includes/js_includes.inc:105 #, fuzzy msgid "Disable custom CSS" msgstr "Désactiver " - Remove the "fuzzy" line. - Edit the "msgstr" string however you want (it's just for testing) - Install the updated translation: > perl translate install fr-FR Log in to the staff interface as a user with debug permission. Test the debug menu in the header, confirming that the strings look correct and that the toggles work correctly. Switch to your translated templates and test again. Sponsored-by: Athens County Public Libraries Signed-off-by: David Nind Signed-off-by: Katrin Fischer Signed-off-by: Pedro Amorim commit b567a5589f04aedef572fcfc39cf710e7e4caa7e Author: Owen Leonard Date: Tue Aug 11 07:31:04 2026 -0400 Bug 43260: Debug options in navigation bar untranslatable These patches update the templates which control the display of the debug menu item in the staff interface header. The strings need to be wrapped in the _() i18n function. The patch also corrects capitalization and uses the term "custom" instead of "user." A follow-up patch will move this JS into js_includes.inc so that the _() is available. This patch is separate to make it easier to view the diff. Testing requires the follow-up. Sponsored-by: Athens County Public Libraries Signed-off-by: David Nind Signed-off-by: Katrin Fischer Signed-off-by: Pedro Amorim commit 3d41c25c08a12ab38af6a2636121501bc12a68bf Author: Baptiste Wojtkowski Date: Fri Aug 7 09:56:07 2026 +0000 Bug 43245: Redirect user if no email was provided TO TEST: 0 - Apply patch 1 - Make sure OPACResetPassword is activated 2 - Go to that good old Henry Acevedo's page and reset their password 3 - Notice you have been redirected with an error message telling you have no email Signed-off-by: David Nind Signed-off-by: Andrew Fuerste Henry Signed-off-by: Pedro Amorim commit 1a5be8e2874cba40dbb70683025846faa9acb389 Author: Pedro Amorim Date: Fri Aug 14 12:08:27 2026 +0000 Bug 42112: DBRev 26.06.00.014 Signed-off-by: Pedro Amorim commit 74130f08dff33a3c9409f95618903d6fb751c44e Author: Lucas Gass Date: Thu Mar 26 15:11:21 2026 +0000 Bug 42112: Add option when changing a patron's category: allow choosing what to do for the expiry date and messaging preferences To test: 1. APPLY PATCH, updatedatabase, restart_all 2. Find 2 new system preferences UpdateDateExpiryOnCategoryChange and UpdateMessagingPrefsOnCategoryChange 3. Each was the same options: -Never update -Always ask, default to no -Always ask, default to yes -Always update without asking 4. Go to Administration > Patron categories 5. Edit or create some categories with different Enrollment periods and messaaging preferences 6. Try each of the options for BOTH system preferences, making sure they work as described. Signed-off-by: David Nind Signed-off-by: Emily Lamancusa Signed-off-by: Pedro Amorim commit e1072702f84e5f6e3b596af4bc0ba65003aa6a54 Author: Jonathan Druart Date: Fri Feb 20 11:16:08 2026 +0100 Bug 41896: Remove C4::Context from Koha::Cache Signed-off-by: Julian Maurice Amended-by: Jonathan Druart Restore ||= op - $self->{namespace} = Koha::Config->get_instance->get('memcached_namespace') || 'koha'; + $self->{namespace} ||= Koha::Config->get_instance->get('memcached_namespace') || 'koha'; Signed-off-by: Tomás Cohen Arazi Signed-off-by: Pedro Amorim commit d154cda83092cbf02a0ea6c2605ba131035c4d55 Author: Andrew Fuerste-Henry Date: Wed Jul 29 19:46:10 2026 +0000 Bug 35797: (QA follow-up) Use https in API comment Signed-off-by: Andrew Fuerste Henry Signed-off-by: Pedro Amorim commit b590f1a0a37bcea160abdc93eef7f31033461ece Author: Shi Yao Wang Date: Tue Jun 23 10:07:23 2026 -0400 Bug 35797: Syspref, schema path file and tests changes 1- Corrected tests according to the comments 2- Removed unused import 3- Added syspref check of 'patronimages' 4- Tweaked swagger path schema Signed-off-by: David Nind Signed-off-by: Andrew Fuerste Henry Signed-off-by: Pedro Amorim commit ad190dcc5d3f2fb351465353bcff96e494195da4 Author: Shi Yao Wang Date: Wed Aug 7 09:46:10 2024 -0400 Bug 35797: REST API Add GET route for patronimage and tests Api changes adding GET route for patronimage Test plan: 1- Apply the patch 2- Run `npm run api:bundle` 2- Go to administration -> sys.pref. -> set patronimages to allow 3- Log in koha using a user with "list_borrowers" or "edit_borrowers" privileges 4- Have a patron with a profile image (add an image if necessary by searching for a patron and then clicking on the default profile image on the top left) 5- Open a an API testing tool (such as postman), write {intranet_url}/api/v1/patrons/{borrowernumber}/default_image where {intranet_url} is the base intranet url of koha and {borrowernumber} is the borrowernumber of a borrower that has an image 6- Add OAuth 2.0 credentials coming from koha (patron -> more -> manage api keys) and generate a token 7- Send the request and notice the image of the patron is returned 8- Do step 5-7 with a borrowernumber of a patron without an image and a borrowernumber of a patron that doesn't exist (and other edge cases where there should be an error message displayed such as "Access forbidden", "Authentication required", etc.) 9- Notice an appropriate error message is displayed Signed-off-by: David Nind Signed-off-by: Andrew Fuerste Henry Signed-off-by: David Nind Bug 35797: Rename test file from 'image.t' to 'patron_images.t' Signed-off-by: David Nind Signed-off-by: Andrew Fuerste Henry Signed-off-by: Pedro Amorim commit 3450f46d8b6005ff05e910f3fa56585a975858e1 Author: Martin Renvoize Date: Wed Jul 1 17:35:24 2026 +0100 Bug 40736: (QA follow-up) Avoid redundant CGISESSID cookie lookups The cookie is already fetched once into $current_session_cookie earlier in login(); reuse it instead of calling $c->req->cookie('CGISESSID') again at each check site. Signed-off-by: Martin Renvoize Signed-off-by: Pedro Amorim commit b09434603072419ed4d2774b3d486d5a0fb8362b Author: Lari Taskula Date: Mon Sep 29 14:20:31 2025 +0300 Bug 40736: Add test To test: 1. prove t/db_dependent/api/v1/idp.t Signed-off-by: David Cook Signed-off-by: Martin Renvoize Signed-off-by: Pedro Amorim