commit 5d6c6c8fecd9625bf37b92cf7be0390d6b23040e Author: Olivia Reynolds Date: Wed Jul 8 14:30:18 2026 +0000 Bug 30557: Integrate adding items to item lists Test plan: 1. Navigate to Item Lists, and create a new item list with your user as the owner and any visibility. 2. Navigate to a Catalogue detail page, and select an item in its holdings table. 3. Verify an "Add selected items to list" button appears above the table. 4. Click this button, and add the item to the list you created earlier. 5. Return to the item list, clicking its name to view its items. 6. Verify the item you added appears in the list. 7. Remove the item from the list. 8. Navigate to Reports > Create from SQL, and create a new report with any name and the following SQL: SELECT itemnumber FROM items ORDER BY RAND() LIMIT 1 9. Run this report, and verify "Add items to list" appears under the "Batch operations with 1 visible records" dropdown. 10. Use this option to add the item to the list you created earlier. 11. Verify the item has been added to the list, and remove it again. 12. Navigate to Search > Item Search, and perform an empty search to list all items. 13. Select an item from the results, and verify "Batch add to item list" appears in the "Batch operations" dropdown at the top of the results table. 14. Use this option to add the item to the list you created earlier. 15. Verify the item has been added to the list, and remove it again. Sponsored-by: ByWater Solutions commit 073ddfc0f7724980552ff63db125d48a7cfec69a Author: Olivia Reynolds Date: Thu Jul 9 13:06:22 2026 +0000 Bug 30557: Add Cypress tests for Vue module Test plan: 1. Rebuild the JS bundles with yarn js:build 2. Run the Cypress spec t/cypress/integration/ItemLists_spec.ts In KTD you can do this with: cypress run -s t/cypress/integration/ItemLists_spec.ts Sponsored-by: ByWater Solutions commit 1d381561fc9863116bdd724ad0162f0a7b697ec8 Author: Olivia Reynolds Date: Wed Jul 8 14:29:23 2026 +0000 Bug 30557: Add item lists Vue module Sponsored-by: ByWater Solutions commit 37b3c4ee28be7e89c777c756989868838d912750 Author: Olivia Reynolds Date: Wed Jul 8 14:26:07 2026 +0000 Bug 30557: Add item lists REST API unit tests Test plan: 1. Prove t/db_dependent/api/v1/item_lists.t Sponsored-by: ByWater Solutions commit 980b02aec730cdcbb16c5dc5b622404205e298aa Author: Olivia Reynolds Date: Wed Jul 8 14:25:53 2026 +0000 Bug 30557: Add item lists REST API Sponsored-by: ByWater Solutions commit a7095d0c80b75d3ab5980fe1037ffddededa1396 Author: Olivia Reynolds Date: Wed Jul 8 14:24:14 2026 +0000 Bug 30557: Add Koha object unit tests Test plan: 1. Prove t/db_dependent/Koha/Item/List.t Sponsored-by: ByWater Solutions commit a5441488a36a31212c27d74b1f8c182df1dcc9cd Author: Olivia Reynolds Date: Wed Jul 8 14:23:07 2026 +0000 Bug 30557: Add item list object classes Sponsored-by: ByWater Solutions commit 68dfb14d934e7171b5851a7e368cfa5c65125482 Author: Olivia Reynolds Date: Wed Jul 8 14:22:16 2026 +0000 Bug 30557: Add new permissions Sponsored-by: ByWater Solutions commit 6dfbc8f06c486666103f6d10fc3f7fc34c08aa16 Author: Olivia Reynolds Date: Wed Jul 8 14:21:14 2026 +0000 Bug 30557: Additional Result class methods Sponsored-by: ByWater Solutions commit bbe8f01227dbb1acea33fef6b30a7440cd233ea8 Author: Olivia Reynolds Date: Wed Jul 8 14:19:01 2026 +0000 Bug 30557: DBIC updates (DO NOT PUSH) Sponsored-by: ByWater Solutions commit 67078f3e0be365dc6998ce4d81d9d3615f1c01f8 Author: Olivia Reynolds Date: Wed Jul 8 14:16:02 2026 +0000 Bug 30557: DB updates Sponsored-by: ByWater Solutions commit c4796a926ebbfcb0c9b501e626918ece2347cfdd Author: Olivia Reynolds Date: Wed Jul 8 14:23:44 2026 +0000 Bug 30557: Allow undef group_feature for visibility checking Sponsored-by: ByWater Solutions commit 5ad3e879eb114934310c0f633171f94753e1216b Author: Olivia Reynolds Date: Wed Jul 8 14:13:10 2026 +0000 Bug 30557: Use legal property name for base resource emit Sponsored-by: ByWater Solutions commit f7c36eb50a58f0cdd2b4e39c8f50aa87523f6e6a Author: Olivia Reynolds Date: Wed Jul 8 14:12:40 2026 +0000 Bug 30557: Use select label in ResourceList cells Sponsored-by: ByWater Solutions commit 9630c91766f69376e11cea3bf15e96527a1ac97b Author: Olivia Reynolds Date: Wed Jul 8 14:08:54 2026 +0000 Bug 30557: Allow parent resources to set breadcrumbs Sponsored-by: ByWater Solutions commit 383a91b9b4891f4c752e60b24799cf0a9bbaa814 Author: Olivia Reynolds Date: Wed Jul 8 14:07:33 2026 +0000 Bug 30557: Support resource remove in Vue Sponsored-by: ByWater Solutions commit 3de99aa0edd442c2432589dfee4e4abd8d69ff15 Author: Olivia Reynolds Date: Thu Jul 9 16:13:50 2026 +0100 Bug 30557: Support column toggling in Vue KohaTable Sponsored-by: ByWater Solutions commit fe8eca85adc3fd58deee4ba7c6d5eaf70e8b84e5 Author: Olivia Reynolds Date: Wed Jul 8 14:03:52 2026 +0000 Bug 30557: Add DataTables additionalButtons Sponsored-by: ByWater Solutions commit f691ef10908ea64711c5ca3edd5e8290ef984037 Author: Olivia Reynolds Date: Wed Jul 8 14:03:22 2026 +0000 Bug 30557: Add DataTables select extension Sponsored-by: ByWater Solutions commit 138d2b64ed18fafc25829981dd06611fb2fd8797 Author: Paul Derscheid Date: Fri Mar 27 09:42:52 2026 +0100 Bug 42207: Allow library embed on GET /patrons/{patron_id} - Add 'library' to the allowed x-koha-embed values for the GET /patrons/{patron_id} endpoint - Add unit test verifying the library embed returns library_id and name Test plan: 1. Apply patch 2. yarn api:bundle 3. prove t/db_dependent/api/v1/patrons.t 4. Verify all tests pass, including the new 'library embed' subtest under get() which verifies that requesting x-koha-embed: library returns the patron's library object Sponsored-by: Büchereizentrale Schleswig-Holstein Signed-off-by: David Nind Signed-off-by: Martin Renvoize Signed-off-by: Pedro Amorim commit ad30c815ce0393f121fb9efa0d31ee514130b395 Author: Olivia Reynolds Date: Fri Jun 5 14:52:59 2026 +0000 Bug 34166: Add total column to suggestions table This patch displays the "total_price" field from the API in the acquisition suggestions table. In line with other totals, it is displayed unitless after currency conversion. Test plan: 1. Navigate to Acquisitions > Suggestions. 2. Click "New purchase suggestion", then add a title, price, and number of copies. 3. Make note of the calculated total price. 3. Save the suggestion to return to the table. 4. Verify there is no "Total" column on the suggestions table. 5. Apply patch, update database, and refresh. 6. Verify there is a "Total" column on the suggestions table that matches the previously displayed total price. 7. Verify the "Total" column is listed under the "Columns" dropdown. 8. Above the suggestions table, click "Configure". 9. In the column settings for suggestions, check both "Is hidden by default" and "Cannot be toggled" for "total". 10. Underneath the column settings for suggestions, uncheck "Save configuration state on page change". 11. Save the column settings. 12. Return to the suggestions table. 13. Verify the "Total" column is hidden. 14. Verify the "Total" column is not listed under the "Columns" dropdown. Sponsored-by: Open Fifth Signed-off-by: Michaela Signed-off-by: Jonathan Druart Signed-off-by: Pedro Amorim commit 89066b3c7b5bb8a42f27ad6407039c43b50fc77b Author: Owen Leonard Date: Mon Mar 16 12:35:34 2026 -0400 Bug 42111: Update various admin pages to use grid layout for forms - Part 1 This patch updates several administration templates with new markup and CSS for layout forms using CSS grids. To test, apply the patch rebuild the staff interface CSS. Check the following pages, confirming that the "New" and "Edit" versions of the form look correct in each case: - Administration -> Additional fields - Administration -> Audio alerts - Administration -> Cities and Towns - Administration -> Classification configuration -> Classification sources -> Classification filing rules -> Classification splitting rules On the classification splitting rules page I've reformatted the regular expression section to fit better. To test, add or edit a splitting rule. - Under "Splitting routine" choose "RegEx" - "Regular expression" and "Test the regular expressions" fields should appear. - Add one or more regular expressions, e.g. s/\s/\n/g s/(\s?=)/\n=/g s/^(J|K)\n/$1 / - In the "Test the regular expressions" text area enter some call numbers e.g. 830 Han 159.9 (091) Gesh J 3 Kin =774 830 Hil =774 4 830 Las=20 4 - Click "Test" - The formatted call numbers should appear below in a grid: +---------+------------------+--------------+----------------+--------------+ | 830 Han | 159.9 (091) Gesh | J 3 Kin =774 | 830 Hil =774 4 | 830 Las=20 4 | +---------+------------------+--------------+----------------+--------------+ | 830 | 159.9 | J 3 | 830 | 830 | | Han | (091) | Kin | Hil | Las | | | Gesh | =774 | =774 | =20 | | | | | 4 | 4 | +---------+------------------+--------------+----------------+--------------+ Sponsored-by: Athens County Public Libraries Signed-off-by: Felicie Signed-off-by: Pedro Amorim commit 7de8e290b9a5d6333a56df48bff2e8b3cb694e1b Author: Katrin Fischer Date: Sun Jul 5 10:49:44 2026 +0000 Bug 35061: Fix documentation for -pf|preserve-field in import_patrons.pl There was a mismatch between the documentation and the shortcut used in the code. This patch fixes the documentation so it matches the code: 'pf|preserve-field=s' => \@preserve_fields, =item B<-k|--preserve-field> Prevent specified patron fields for existing patrons from being overwritten So pf is the right shortcut. Signed-off-by: Aleisha Amohia Signed-off-by: Pedro Amorim commit d6e40f612c5db8dca831689d00f778ab79a98d67 Author: Tomás Cohen Arazi Date: Fri Aug 7 15:42:38 2026 -0300 Bug 20846: Filter suppressed records from public lists in OPAC When OpacSuppression is enabled, records marked as suppressed (biblio.opac_suppressed = 1) still appear in public lists viewed through the OPAC. This is confusing for patrons. This patch adds a filter_by_not_suppressed method to Koha::Virtualshelfcontents and uses it in opac-shelves.pl to exclude suppressed records from list display when OpacSuppression is enabled. OpacSuppressionByIPRange is respected: users within the allowed IP range still see all records. Test plan: 1. Apply patch 2. Enable OpacSuppression system preference 3. Create a public list and add some titles to it 4. Suppress one of the titles (set 942$n = 1) 5. View the list in the OPAC => SUCCESS: Suppressed record is no longer shown in the list 6. Set OpacSuppressionByIPRange to match your IP (e.g. 127.) 7. Repeat step 5 => SUCCESS: All records (including suppressed) are shown 8. Run: $ ktd --shell k$ prove t/db_dependent/Virtualshelves.t => SUCCESS: Tests pass! 9. Sign off :-D Signed-off-by: David Nind Signed-off-by: Laura_Escamilla Signed-off-by: Pedro Amorim commit ff2b951c4de87cbdba7eaaca4cb6dac39bb76d5e Author: Olivia Reynolds Date: Tue Jul 28 14:50:32 2026 +0000 Bug 41648: Validate plugin date metadata If a plugin reports a date_authored or date_updated we can't parse, remove the invalid property from the metadata hashref and emit a warning. To test this, introduce a separate test plugin directory and test file. Having a plugin that produces warnings in the main test directory would require accounting for this warning in every existing test that loads plugins. Correspondingly, this patch also fixes an invalid date in an existing test plugin. Test plan: 1. Apply patch. 2. Run `prove -r t/db_dependent/Koha/Plugins/` and verify there are no test failures. Sponsored-by: Open Fifth Signed-off-by: David Nind Signed-off-by: Laura_Escamilla Signed-off-by: Pedro Amorim commit fd24968eb2b1292622f8ab0e448517e0fa900a6d Author: Olivia Reynolds Date: Tue Jul 28 14:50:32 2026 +0000 Bug 41648: Handle parse errors in KohaDates If dt_from_string throws an exception whilst trying to parse the input, catch it and return an empty result. Test plan: 1. Apply patch. 2. Prove t/db_dependent/Template/Plugin/KohaDates.t Sponsored-by: Open Fifth Signed-off-by: David Nind Signed-off-by: Pedro Amorim commit dca7313511083b658a243f6a2af1dc0e990d4fbf Author: Matt Blenkinsop Date: Thu Jul 30 11:39:51 2026 +0100 Bug 43203: Correctly rollback test data Test plan: 1) In the database, verify how many biblios exist (select count(*) from biblio;) 2) Run prove t/db_dependent/Koha/Item.t 3) Check the count again, there should now be 3 extra bib records left from the test run 4) Apply patch 5) Repeat the process, the biblio count should never grow after test runs Signed-off-by: David Nind Signed-off-by: Laura_Escamilla Signed-off-by: Pedro Amorim commit fbfccfdbf24f2bf905180318f9839b181b3d3575 Author: Andrew Fuerste-Henry Date: Tue Aug 18 19:22:22 2026 +0000 Bug 43331: Add ccode class to holdings table To test: 1 - go to a bib record with items 2 - inspect the items table, confirm there is no class on the cell containing the ccode 3 - Apply patch, restart_all 4 - reload your bib page 5 - inspect the table again, confirm the cell has the class "ccode" Signed-off-by: Owen Leonard Signed-off-by: Michelle Spinney Signed-off-by: Katrin Fischer Signed-off-by: Pedro Amorim commit 634193fc6a2c478c4b97c288add38311d0289e11 Author: Fridolin Somers Date: Wed Aug 19 11:34:44 2026 +0200 Bug 43339: automatic_item_modification_by_age_configuration is not a real system preference It should not fail the unit test t/db_dependent/check_sysprefs.t. Test plan : 1.0) Without patch 1.1) Run : prove t/db_dependent/check_sysprefs.t => 'All tests successful' 1.2) Go to Cataloging > Automatic item modifications by age 1.3) Create some entries and save 1.4) Run : prove t/db_dependent/check_sysprefs.t => # Failed test at t/db_dependent/check_sysprefs.t line 96. # got: '1' # expected: '0' # Too many sysprefs in DB: automatic_item_modification_by_age_configuration 2.0) Apply patch 2.1) Run : prove t/db_dependent/check_sysprefs.t => 'All tests successful' Signed-off-by: Owen Leonard Signed-off-by: David Nind Signed-off-by: Andrew Fuerste Henry Signed-off-by: Pedro Amorim commit b33bb4b38036632e203268285c804f11757692f5 Author: Andrew Fuerste-Henry Date: Wed Aug 19 20:26:03 2026 +0000 Bug 43342: Remove line due to template toolkit To test: 1 - go to the OVERDUES_SLIP notice and confirm you are using the default content 2 - have or create a patron with an overdue item 3 - click Print and then Print overdues 4 - confirm there are two empty lines between the first and second lines of text APPLY PATCH, restart_all 5 - reload your OVERDUES_SLIP notice page 6 - click View default 7 - confirm the FOREACH statement now starts with "[%-" 8 - click Copy to Template, save your changes 9 - print your patron's overdue slip again, confirm you have only one blank line Signed-off-by: Lucas Gass Signed-off-by: Pedro Amorim commit 35b58d65c5aab92959af808a36c706bee543e263 Author: Hammat Wele Date: Wed Aug 19 12:25:02 2026 +0000 Bug 43211: (follow-up) fix 'barcode is not defined' error Signed-off-by: David Nind Signed-off-by: Katrin Fischer Signed-off-by: Pedro Amorim commit a17d27f8ae4d008999d6046a69226917e459cad4 Author: Janusz Kaczmarek Date: Fri Jul 31 22:11:33 2026 +0000 Bug 43211: Koha hangs when receiving order with AcqCreateItem set to 'receiving an order' Koha hangs when receiving an order with AcqCreateItem set to "receiving an order". Test plan: 1. Create a basket and set "Create items when" to "receiving an order". 2. Add an order and close the basket. 3. Attempt to receive the order. Koha will most likely hang. 4. Apply the patch; restart_all. 5. Repeat p. 3. You should be able co proceed. Signed-off-by: David Nind Signed-off-by: Katrin Fischer Signed-off-by: Pedro Amorim commit 3522dc2bca202eabde571f4e17b2fe17bd092652 Author: Tomás Cohen Arazi Date: Fri May 8 15:57:36 2026 -0300 Bug 42567: Remove C4::Koha::GetNormalizedEAN in favor of MetadataExtractor Adds get_normalized_ean to the flavor-specific extractors: - MARC21: 024$a with indicator 1 = 3 - UNIMARC: 073$a Exposes it as $biblio->normalized_ean and migrates all callers. Assisted-by: Sonnet 4.6 (Anthropic) Test plan: 1. Apply patch 2. Run: $ ktd --shell k$ prove t/db_dependent/Koha.t \ t/db_dependent/Koha/Biblio.t \ t/db_dependent/Koha/Biblio/Metadata/Extractor/MARC/MARC21.t \ t/db_dependent/Koha/Biblio/Metadata/Extractor/MARC/UNIMARC.t => SUCCESS: Tests pass 3. Verify EAN numbers still display in OPAC and staff detail pages 4. Sign off :-D Signed-off-by: David Nind Signed-off-by: Jonathan Druart Signed-off-by: Pedro Amorim commit 3d3f625b56ae92721ed0a7fb36c2673e50e3a558 Author: Tomás Cohen Arazi Date: Fri May 8 15:47:38 2026 -0300 Bug 42566: Remove C4::Koha::GetNormalizedUPC in favor of MetadataExtractor GetNormalizedUPC duplicated logic already available via the MetadataExtractor (Bug 34828) and exposed as $biblio->normalized_upc. All callers migrated: - Scripts with $biblio available: use $biblio->normalized_upc - C4::Search (only MARC::Record): reuses the extractor instance already created for OCLC Assisted-by: Sonnet 4.6 (Anthropic) Test plan: 1. Apply patch 2. Run: $ ktd --shell k$ prove t/db_dependent/Koha.t \ t/db_dependent/Koha/Biblio.t => SUCCESS: Tests pass 3. Verify UPC numbers still display in OPAC and staff detail pages (Syndetics cover images) 4. Sign off :-D Signed-off-by: David Nind Signed-off-by: Jonathan Druart Signed-off-by: Pedro Amorim commit 5fb7fd5f2d92a083f691bd538787d21c8712c1c9 Author: Tomás Cohen Arazi Date: Fri Jun 19 17:36:31 2026 -0300 Bug 35142: Remove GetNormalizedOCLCNumber, oclc_number, strip_orgcode All callers migrated. Removes dead code: - C4::Koha::GetNormalizedOCLCNumber - Koha::Util::MARC::oclc_number - Koha::Util::MARC::strip_orgcode - Koha::Util::MARC::OCLC_REGEX constant Test plan: $ prove t/Koha/Util/MARC.t t/db_dependent/Koha.t Signed-off-by: Martin Renvoize Assisted-by: Sonnet 4.6 (Anthropic) Signed-off-by: David Nind Signed-off-by: Jonathan Druart Signed-off-by: Pedro Amorim commit 263a1bd53601d840a00d4f5723d4c2587cb5fb64 Author: Tomás Cohen Arazi Date: Fri Jun 19 17:35:21 2026 -0300 Bug 35142: Migrate callers to use metadata extractor Replaces all calls to GetNormalizedOCLCNumber() and Koha::Util::MARC::oclc_number() with the extractor pattern. OPAC scripts pass their already ViewPolicy-filtered $record directly to the extractor. This preserves the existing filtering behavior without introducing new abstraction layers: Koha::Biblio::Metadata::Extractor->new( { metadata => $record } )->get_normalized_oclc Intranet scripts and the Koha::Biblio convenience method use the raw cached extractor (035 visibility is not affected by ViewPolicy in practice, and intranet doesn't filter): $biblio->normalized_oclc Test plan: 1. Verify OCLC numbers display on OPAC detail, ISBD, MARC detail 2. Verify staff catalogue detail and search results 3. prove t/db_dependent/Koha/Biblio.t Signed-off-by: Martin Renvoize Assisted-by: Sonnet 4.6 (Anthropic) Signed-off-by: David Nind Signed-off-by: Jonathan Druart Signed-off-by: Pedro Amorim commit 6b77f28dd7711e088a69b92464150b55a28bcc9b Author: Tomás Cohen Arazi Date: Fri Jun 19 17:33:02 2026 -0300 Bug 35142: Move get_normalized_oclc to base MARC extractor Moves get_normalized_oclc from the MARC21-specific extractor to the base ::MARC class (035$a is flavor-independent) with improved matching: - Case-insensitive OCoLC detection (matches ocolc, OCOLC, etc.) - Generic orgcode prefix stripping (any parenthesized prefix, not just literal "(OCoLC)") for resilience against cataloging typos Test plan: $ prove t/db_dependent/Koha/Biblio/Metadata/Extractor/MARC/MARC21.t Signed-off-by: Martin Renvoize Assisted-by: Sonnet 4.6 (Anthropic) Signed-off-by: David Nind Signed-off-by: Jonathan Druart Signed-off-by: Pedro Amorim 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