commit ded4c26e1932bffce70d74c024ab7cdffc528e47 Author: Olivia Reynolds Date: Wed Oct 21 09:26:31 2026 +0000 Bug 43971: Display anonymous reporter email in staff view Test plan: 1. Apply patch. 2. Place and verify an anonymous catalog concern. 3. Navigate to the catalogs concern list on the intranet. 4. Verify your anonymous concern is listed. 5. Verify the provided email address is displayed in the reporter column for the concern. Sponsored-by: University Hospitals of Derby and Burton commit 2dbc8207419df12aa0b99eb2b12ed2ea329c634f Author: Olivia Reynolds Date: Wed Oct 21 09:27:20 2026 +0000 Bug 43971: Only count verified tickets on landing page Test plan: 1. Apply patch. 2. Note the current number of pending tickets displayed on the intranet's mainpage. 3. Submit a new anonymous catalog concern, but do not verify it yet. 4. Verify that the number of pending tickets has not increased. 5. Use the verification email to confirm your new catalog concern. 6. Verify that the number of pending tickets displayed on the mainpage has now increased. Sponsored-by: University Hospitals of Derby and Burton commit d9dafe4e5c6af981552e60216e7d2bb6d06c127b Author: Olivia Reynolds Date: Wed Oct 21 09:27:00 2026 +0000 Bug 43971: Add controller and template for ticket verification Test plan: 1. Apply patch. 2. Using the verification email from an earlier test plan, or from a new anonymous catalog concern, follow its specified link to verify the ticket. 3. Verify that the "Verify ticket" screen is displayed, with a button to verify the ticket. 4. Verify that this concern is not displayed in the staff intranet's ticket list. 5. Click this button, and verify that the success screen is displayed. 6. Verify that a confirmation email has now been sent, acknowledging your new ticket. On a Koha sandbox this step may be more complicated. 7. Verify that this concern now appears in the staff intranet's ticket list. Sponsored-by: University Hospitals of Derby and Burton commit beadbd2471c2514909bdc9e08a94171acf990f52 Author: Olivia Reynolds Date: Wed Oct 21 09:26:05 2026 +0000 Bug 43971: Support anonymous ticket submission from the OPAC Test plan: 1. Apply patch. 2. Ensure your Koha is configured to be able to send email. 3. Enable the system preferences "OpacCatalogConcerns" and "OpacAnonCatalogConcerns". 4. Ensure the system preference "OpacAnonCatalogConcernsEmail" is empty. 5. In an unauthenticated OPAC session, navigate to a biblio. 6. Click "Report a concern", and verify the modal appears without prompting for a login. 7. Enter an email address, title, and content for your concern. 8. Submit the concern, and verify the success message is displayed. 9. Verify that an email asking you to verify your ticket was sent. This step may be more complicated on Koha sandboxes. 10. If you can access the database, verify your new concern was saved to the "tickets" table with a random "verify_uuid" column. Sponsored-by: University Hospitals of Derby and Burton commit 482a6145fc27cb4bf2fc9118c127a13efe0503f2 Author: Olivia Reynolds Date: Wed Oct 21 09:19:30 2026 +0000 Bug 43971: Add API tests Test plan: 1. Apply patch. 2. Run `yarn api:bundle` and restart Koha. 3. Prove t/db_dependent/api/v1/tickets.t, and verify all the tests pass. Sponsored-by: University Hospitals of Derby and Burton commit 8a5f09afb2837e42819514a79c6d648c55e2199f Author: Olivia Reynolds Date: Wed Oct 21 09:18:47 2026 +0000 Bug 43971: Support anonymous tickets in REST controller Sponsored-by: University Hospitals of Derby and Burton commit ba3dca7255f7739ba424093abef567db4c4494d9 Author: Olivia Reynolds Date: Wed Oct 21 09:25:22 2026 +0000 Bug 43971: Add ticket object tests Test plan: 1. Apply patch. 2. Prove t/db_dependent/Koha/Ticket.t, and verify all the tests pass. Sponsored-by: University Hospitals of Derby and Burton commit 58e23fcd1cac1c7717434f1d9451c245d8ac93f2 Author: Olivia Reynolds Date: Wed Oct 21 09:25:07 2026 +0000 Bug 43971: Update ticket object class Sponsored-by: University Hospitals of Derby and Burton commit 69e95a80d6e65d37c3a89639a297b94806d3376c Author: Olivia Reynolds Date: Wed Oct 21 09:17:54 2026 +0000 Bug 43971: Add notice for ticket verification Sponsored-by: University Hospitals of Derby and Burton commit 07526ede6337df5e428d36a03be10da4604f2eae Author: Olivia Reynolds Date: Wed Oct 21 09:17:33 2026 +0000 Bug 43971: Add new system preferences Sponsored-by: University Hospitals of Derby and Burton commit 3ebe286f5f7fc09ab6b9b4575402ec138af3b474 Author: Olivia Reynolds Date: Wed Oct 21 09:15:42 2026 +0000 Bug 43971: DBIC updates (DON'T PUSH) Sponsored-by: University Hospitals of Derby and Burton commit 70f1383c88e220bbe0cb85c9953dbf19b6ba8013 Author: Olivia Reynolds Date: Wed Oct 21 09:15:16 2026 +0000 Bug 43971: DB updates Sponsored-by: University Hospitals of Derby and Burton commit 067644ef274448858fc75c3ef40f85635e8ac4e1 Author: Olivia Reynolds Date: Wed Oct 21 10:24:41 2026 +0100 Bug 43971: Include ticket ID in public API responses public_read_list filtering occurs before to_api_mapping. Sponsored-by: University Hospitals of Derby and Burton commit c7bd4b86b213e17e11bfa2d8f3d031967ba43fe2 Author: Pedro Amorim Date: Thu Nov 12 17:37:17 2026 +0000 Bug 42625: DBRev 26.06.00.054 Signed-off-by: Pedro Amorim commit 287f019cac0525d92ab8db1e88f1992af1cdd794 Author: Jacob O'Mara Date: Thu Nov 5 13:25:52 2026 +0000 Bug 42625: Add Cypress test for record source group selector Cover the "Editable by library groups" selector of the record source form: it lists the groups returned by the API, shows the groups already linked to the record source, and saves the selection as a library_groups list. To test: 1. Apply the patches, then run yarn build 2. Run: yarn cypress run --spec t/cypress/integration/Admin/RecordSources_spec.ts => SUCCESS: Tests pass Signed-off-by: Brendan Lawlor Sponsored-by: CLAMS Signed-off-by: Andrew Fuerste Henry Signed-off-by: Martin Renvoize Signed-off-by: Pedro Amorim commit 7bfdd6a003c628e97a4a53a1a4b01dc925c174ef Author: Jacob O'Mara Date: Thu Nov 5 13:25:52 2026 +0000 Bug 42625: Add tests for group flag unlink behaviour Cover the removal of the record source links when a library group is saved without the "Use for record source editing" flag: a flagged group can be linked to a record source, unchecking the flag removes the links, and checking it again does not bring them back. To test: 1. Apply the patches, then run updatedatabase.pl 2. Run: prove t/db_dependent/LibraryGroups.t => SUCCESS: Tests pass Signed-off-by: Brendan Lawlor Sponsored-by: CLAMS Signed-off-by: Andrew Fuerste Henry Signed-off-by: Martin Renvoize Signed-off-by: Pedro Amorim commit cdc8320f3aa55c5d102b17defc5a997454c34ee5 Author: Jacob O'Mara Date: Thu Nov 5 13:25:52 2026 +0000 Bug 42625: Unlink record sources when group flag is unchecked A library group that is no longer flagged "Use for record source editing" cannot be linked to record sources any more, so when the group is saved without the flag its links to record sources are removed, in the same transaction as the update. As this removes exemptions from record sources, ask for confirmation in Administration > Library groups before saving a group whose flag has been unchecked. To test: 1. Apply the patches, then run updatedatabase.pl, yarn build and restart_all 2. Administration > Library groups: create a group "Editors" with "Use for record source editing" checked 3. Administration > Record sources: create a record source with "Editors" selected under "Editable by library groups" 4. Administration > Library groups, edit "Editors", uncheck "Use for record source editing" and click Update => SUCCESS: a confirmation warns that the group will be unlinked from all record sources 5. Cancel the confirmation => SUCCESS: the modal stays open, and nothing is saved 6. Click Update again and confirm 7. Edit the record source from step 3 => SUCCESS: no library group is selected Signed-off-by: Brendan Lawlor Sponsored-by: CLAMS Signed-off-by: Andrew Fuerste Henry Signed-off-by: Martin Renvoize Signed-off-by: Pedro Amorim commit 21092c4c618e50e54f118d7045ba4e7b5f1288f9 Author: Jacob O'Mara Date: Thu Nov 5 13:25:52 2026 +0000 Bug 42625: Add tests for record source library group API Cover the library_groups handling of the record sources API: creating and updating a record source with groups, embedding library_groups, keeping the links when an update leaves library_groups out, and the 400 invalid_parameter_value answered for groups that cannot be linked. To test: 1. Apply the patches, then run updatedatabase.pl, yarn api:bundle and restart_all 2. Run: prove t/db_dependent/api/v1/record_sources.t => SUCCESS: Tests pass Signed-off-by: Brendan Lawlor Sponsored-by: CLAMS Signed-off-by: Andrew Fuerste Henry Signed-off-by: Martin Renvoize Signed-off-by: Pedro Amorim commit b2cd71d4391707f0f94e2f7e1d9706d0658dd29e Author: Jacob O'Mara Date: Thu Nov 5 13:25:52 2026 +0000 Bug 42625: Add tests for can_be_edited group exemption Cover Koha::Biblio->can_be_edited for locked records: a patron from a linked library group can edit them, a patron outside the linked groups cannot, removing the link locks the record again, and a superlibrarian is never blocked. To test: 1. Apply the patches, then run updatedatabase.pl 2. Run: prove t/db_dependent/Koha/Biblio.t => SUCCESS: Tests pass Signed-off-by: Brendan Lawlor Sponsored-by: CLAMS Signed-off-by: Andrew Fuerste Henry Signed-off-by: Martin Renvoize Signed-off-by: Pedro Amorim commit c3389c7f32635a22543b903e5912ce0788f6836c Author: Jacob O'Mara Date: Thu Nov 5 13:25:52 2026 +0000 Bug 42625: Add tests for Patron->can_edit_records_from Cover Koha::Patron->can_edit_records_from: no record source being passed, a patron whose home library is in a linked group, one whose library is in a sub group of a linked group, and one whose library is outside the linked groups. To test: 1. Apply the patches, then run updatedatabase.pl 2. Run: prove t/db_dependent/Koha/Patron.t => SUCCESS: Tests pass Signed-off-by: Brendan Lawlor Sponsored-by: CLAMS Signed-off-by: Andrew Fuerste Henry Signed-off-by: Martin Renvoize Signed-off-by: Pedro Amorim commit 75dc4820ed30198ae3f892d5fc560145c99d5f9b Author: Jacob O'Mara Date: Thu Nov 5 13:25:52 2026 +0000 Bug 42625: Add tests for RecordSource->library_groups Cover Koha::RecordSource->library_groups: reading the linked groups, replacing them, clearing them, the link going away when its group is deleted, and refusing groups that are not flagged for record source editing, that are not top level, or that do not exist. To test: 1. Apply the patches, then run updatedatabase.pl 2. Run: prove t/db_dependent/Koha/RecordSource.t => SUCCESS: Tests pass Signed-off-by: Brendan Lawlor Sponsored-by: CLAMS Signed-off-by: Andrew Fuerste Henry Signed-off-by: Martin Renvoize Signed-off-by: Pedro Amorim commit 790b5a41eff6c96c6322570c08fe53386a2ae8b1 Author: Jacob O'Mara Date: Thu Nov 5 13:25:52 2026 +0000 Bug 42625: Add library group selector to record source form Add an "Editable by library groups" selector to the record source form in Administration > Record sources, listing the library groups that are flagged for record source editing. The groups chosen are saved with the record source, and shown again when it is edited. To test: 1. Apply the patches, then run updatedatabase.pl, yarn build and restart_all, and refresh the page with a hard reload 2. Administration > Library groups: create two groups with "Use for record source editing" checked, "Editors" and "Maintainers", and a third group without it 3. Administration > Record sources > New record source. Enter a name and leave "Can be edited" unchecked => SUCCESS: "Editable by library groups" offers "Editors" and "Maintainers", but not the third group 4. Select "Maintainers" and save, then edit the record source again => SUCCESS: "Maintainers" is selected 5. Remove "Maintainers", save and edit again => SUCCESS: no group is selected Signed-off-by: Brendan Lawlor Sponsored-by: CLAMS Signed-off-by: Andrew Fuerste Henry Signed-off-by: Martin Renvoize Signed-off-by: Pedro Amorim commit 789d08376fb645d2a5d7a392fd847ab1e62aedf5 Author: Jacob O'Mara Date: Thu Nov 5 13:25:52 2026 +0000 Bug 42625: Add record source editing flag to library groups admin Add a "Use for record source editing" checkbox to the library group forms, in Administration > Library groups, and list it among the features of a group. As with the other features, it is only offered for top level groups. To test: 1. Apply the patches, then run updatedatabase.pl and restart_all 2. Administration > Library groups > New group. Enter a title, check "Use for record source editing" and save => SUCCESS: the group lists "Use for record source editing" among its features 3. Edit the group => SUCCESS: "Use for record source editing" is checked 4. Add a sub group to it, and edit the sub group => SUCCESS: the feature checkboxes are not offered for the sub group 5. Uncheck "Use for record source editing" on the first group and save (confirm the warning, if you are asked to) => SUCCESS: it is no longer listed among the features of the group Signed-off-by: Brendan Lawlor Sponsored-by: CLAMS Signed-off-by: Andrew Fuerste Henry Signed-off-by: Martin Renvoize Signed-off-by: Pedro Amorim commit 080bc1b2f791186d1627cbdb5ea46488700ff121 Author: Jacob O'Mara Date: Thu Nov 5 13:25:52 2026 +0000 Bug 42625: Accept and return library groups on record sources api Record sources can now be linked to library groups through the API. - library_groups can be embedded (x-koha-embed) when listing or fetching record sources - POST and PUT /api/v1/record_sources accept a library_groups list of { library_group_id }. On update, leaving the key out keeps the current links, and an empty list clears them - a group that cannot be linked (it does not exist, is not a top level group, or is not flagged for record source editing) is answered with a 400 on /body/library_groups - the record source and its links are saved in one transaction To test: 1. Apply the patches, then run updatedatabase.pl, yarn build and restart_all 2. Administration > Library groups: create a group "Editors" with "Use for record source editing" checked 3. Administration > Record sources > New record source. Give it a name and select "Editors" under "Editable by library groups" (this needs the record source form patch of this series), then save 4. Edit the record source again => SUCCESS: "Editors" is still selected 5. Run: prove t/db_dependent/api/v1/record_sources.t xt/api.t => SUCCESS: Tests pass Signed-off-by: Brendan Lawlor Sponsored-by: CLAMS Signed-off-by: Andrew Fuerste Henry Signed-off-by: Martin Renvoize Signed-off-by: Pedro Amorim commit c313252f28a6f98a71e5c89983316fc3295104f8 Author: Jacob O'Mara Date: Thu Nov 5 13:25:52 2026 +0000 Bug 42625: Add record source editing flag to library groups API Expose the new library group flag on GET /api/v1/library_groups as is_record_source_editing_group: in the API mapping and in the swagger definition, where it is required like the other flags. Mark the column as a boolean in the schema, below the generated part. To test: 1. Apply the patches, then run updatedatabase.pl, yarn api:bundle and restart_all 2. Administration > Library groups: create a group "Editors" with "Use for record source editing" checked, and another group without it 3. Log in to the staff interface as a superlibrarian and visit /api/v1/library_groups => SUCCESS: "Editors" has is_record_source_editing_group true, and the other group has it false 4. Visit /api/v1/library_groups?q={"is_record_source_editing_group":true} => SUCCESS: only "Editors" is listed 5. Run: prove t/db_dependent/api/v1/library_groups.t xt/api.t => SUCCESS: Tests pass Sponsored-by: CLAMS Signed-off-by: Andrew Fuerste Henry Signed-off-by: Martin Renvoize Signed-off-by: Pedro Amorim commit 0d913aa3fd9bbedb977032887d75b1ac3fc056f0 Author: Jacob O'Mara Date: Thu Nov 5 13:25:52 2026 +0000 Bug 42625: Honour library group exemptions in can_be_edited A record whose source is locked can now be edited by a patron who has the edit_catalogue (or fast_cataloging) permission and whose library is in a library group exempt from the lock of that record source, as well as by those with edit_locked_records, as before. Only the lock is lifted: the patron still needs permission to edit the catalogue. Staff from libraries outside the exempt groups still find the record locked. This is what makes Edit > Edit record available or disabled for a locked record, see steps 5 and 6 of the test plan on the first patch of the series. Linking record sources to groups from the staff interface arrives with the patches that follow. To test: 1. Apply the patches, then run updatedatabase.pl 2. Run: prove t/db_dependent/Koha/Biblio.t => SUCCESS: Tests pass Signed-off-by: Brendan Lawlor Sponsored-by: CLAMS Signed-off-by: Andrew Fuerste Henry Signed-off-by: Martin Renvoize Signed-off-by: Pedro Amorim commit 59a5c6a8b7b320d64b1d674cf375d7623a752047 Author: Jacob O'Mara Date: Thu Nov 5 13:25:52 2026 +0000 Bug 42625: Add Koha::Patron->can_edit_records_from Add a method to tell whether a patron may edit the records of a locked record source because of their library: it returns true when the home library of the patron is a member of a library group, or of a sub group of one, that is linked to the record source. It returns false when the record source has no linked groups, so record sources that nobody has been exempted from keep behaving as they do now. There is nothing to see in the staff interface with this patch alone. It is used by the next patch, and covered by the unit tests added in this series. To test: 1. Apply the patches, then run updatedatabase.pl 2. Run: prove t/db_dependent/Koha/Patron.t => SUCCESS: Tests pass Signed-off-by: Brendan Lawlor Sponsored-by: CLAMS Signed-off-by: Andrew Fuerste Henry Signed-off-by: Martin Renvoize Signed-off-by: Pedro Amorim commit 6b5a56261c9dae4a23718f28683e29a12cd67538 Author: Jacob O'Mara Date: Thu Nov 5 13:25:52 2026 +0000 Bug 42625: Add library group accessor to Koha::RecordSource Add Koha::RecordSource->library_groups, to read and set the library groups exempt from the lock of a record source. Without arguments it returns the linked groups as a Koha::Library::Groups set. Given a list of groups it replaces the links with that list. Only top level library groups that are flagged "Use for record source editing" can be linked: for anything else a Koha::Exceptions::BadParameter is thrown for library_group_id, and the existing links are left alone. The links are replaced in a transaction. There is nothing to see in the staff interface with this patch alone. It is used by the patches that follow, and covered by the unit tests added in this series. To test: 1. Apply the patches, then run updatedatabase.pl 2. Run: prove t/db_dependent/Koha/RecordSource.t => SUCCESS: Tests pass Signed-off-by: Brendan Lawlor Sponsored-by: CLAMS Signed-off-by: Andrew Fuerste Henry Signed-off-by: Martin Renvoize Signed-off-by: Pedro Amorim commit db5663cb3207dde8364c664b196efc4552626385 Author: Jacob O'Mara Date: Thu Nov 5 13:25:52 2026 +0000 Bug 42625: DBIC Automated schema update for the new library_groups.ft_record_source_editing column and the record_sources_library_groups table, generated with dbic --force, including the relationships between record sources and library groups. The release manager regenerates the schema files when pushing, so this patch is not to be pushed. Signed-off-by: Andrew Fuerste Henry Signed-off-by: Martin Renvoize Signed-off-by: Pedro Amorim commit e2cbf63d27e2f960a5b7bbaf79a316e89ed106b4 Author: Jacob O'Mara Date: Thu Nov 5 13:25:52 2026 +0000 Bug 42625: Add record source library group exemption schema Records from a record source that is not editable are locked: only staff with the edit_locked_records permission can change them. This series lets the staff of chosen libraries edit those records anyway, by naming the library groups that are exempt from a record source's lock. Add the database structure for it: - library_groups.ft_record_source_editing is a new feature flag, next to the other "Use for ..." settings, that marks the groups which can be used for this purpose - record_sources_library_groups links a record source to the library groups exempt from its lock. The links are removed when the record source or the library group is deleted The test plan below covers the whole series. To test: 1. Apply all patches, run updatedatabase.pl, yarn build and yarn api:bundle, then restart Plack 2. Administration > Library groups > New group. Enter a title, check "Use for record source editing", save, then add library A to the group with "Add library" 3. Administration > Record sources > New record source. Enter a name, leave "Can be edited" unchecked, select the group under "Editable by library groups" and save. Edit it again: the group is selected 4. Assign the source to a bibliographic record, e.g. in koha-mysql: UPDATE biblio_metadata SET record_source_id = WHERE biblionumber = The record's detail page shows "Record source: " with a lock icon 5. Log in as a cataloguer from library B with edit_catalogue but not edit_locked_records. On the record, Edit > Edit record is disabled with "This record is locked" 6. Log in as a cataloguer from library A with the same permissions. Edit > Edit record opens the editor 7. As superlibrarian, edit the library group, uncheck "Use for record source editing" and click Update. Cancel the confirmation: the modal stays open. Click Update again and confirm. Edit the record source: no group is selected. Repeat step 6: Edit > Edit record is now disabled for the library A cataloguer 8. Run: prove t/db_dependent/Koha/RecordSource.t t/db_dependent/Koha/Patron.t t/db_dependent/Koha/Biblio.t t/db_dependent/LibraryGroups.t t/db_dependent/api/v1/library_groups.t t/db_dependent/api/v1/record_sources.t 9. Run: yarn cypress run --spec t/cypress/integration/Admin/RecordSources_spec.ts Signed-off-by: Brendan Lawlor Sponsored-by: CLAMS Signed-off-by: Andrew Fuerste Henry Signed-off-by: Martin Renvoize Signed-off-by: Pedro Amorim commit 90806739ca29da7d62fc1d999618f2ac3fa98c81 Author: Andrew Fuerste-Henry Date: Fri Nov 6 09:05:37 2026 -0600 Bug 43558: (QA follow-up) Require a value for --charge and --maxdays The conversion declared --charge and --maxdays with an optional value (:s), where Getopt::Long had them requiring one (=s). Passed without a value they used to stop the script with "requires an argument"; with :s they ran instead: - a bare -c gave an empty charge value, which skipped the DefaultLongOverdueChargeValue default, so items were marked lost without charging the patron - a bare --maxdays gave an empty end of range, so the query matched nothing and the script did nothing without saying why Declare both with =s again. Test plan: 1. longoverdue.pl --lost 30=1 -c => Option c requires an argument 2. longoverdue.pl --lost 30=1 --maxdays => Option maxdays requires an argument 3. longoverdue.pl --lost 30=1 -c 1 --maxdays 100 => Runs in TEST MODE over the range 30 - 100 days Co-Authored-By: Claude Opus 5.5 Signed-off-by: Andrew Fuerste Henry Signed-off-by: Pedro Amorim commit 15defeb1ee0cc480638f7aaea8077d352346c33e Author: Martin Renvoize Date: Thu Sep 17 16:27:13 2026 +0100 Bug 43558: Convert longoverdue.pl to the Getopt::Long::Descriptive convention Convert the plain Getopt::Long option parsing to Koha::Script->describe_options, per the convention established by bug 43546. --category/--skip-category, --library/--skip-library, and --itemtype/--skip-itemtype are each declared exclusive (bug 43557), replacing three near-identical hand-rolled pod2usage checks. --lost's Getopt::Long::Descriptive spec is a hash type (=s%), matching its existing DAYS=LOST_CODE usage; --category/--skip-category/ --library/--skip-library/--itemtype/--skip-itemtype/--skip-lost-value all move from the "arrayref/array passed as the destination" trick (which accumulates regardless of the spec string) to an explicit @ type, since describe_options needs it declared, not inferred from the destination. No option here has a single-value shape worth a Params::Validate callback: the FIXMEs already in this file ("do checks on --lost ranges ...") describe validation this script has never had, not something this conversion adds, and the category/library/itemtype existence checks stay post-parse code (same reasoning as the sibling bugs -- they're DB lookups shared with building the skip/include table, not CLI-shape checks). Two minor, expected losses of alternate spellings, consistent with the other scripts already converted: -h no longer means --help (describe_options' auto-added help is always help|?, no short letter), and --manual no longer works as a --man alias (only --man). Both were undocumented-by-convention duplicate spellings, not the primary flag; updated the SYNOPSIS/OPTIONS POD to stop advertising them. Test plan: 1. longoverdue.pl --help / --man 2. longoverdue.pl --category X --skip-category Y (and the library/ itemtype equivalents) Each pair still rejected as mutually exclusive. 3. longoverdue.pl --list-categories / --list-itemtypes Still list and exit 0. 4. longoverdue.pl (no options, no DefaultLongOverdueLostValue/Days set) Still rejected: no --lost option or system preferences defined. 5. longoverdue.pl --lost 30=1 [--quiet] Still runs in TEST MODE (no --confirm) and prints the same report. 6. longoverdue.pl --lost 30=1 --category BADCODE Still rejected: category does not exist in the database. 7. koha-qa.pl passes. Signed-off-by: Michelle Spinney Signed-off-by: Andrew Fuerste Henry Signed-off-by: Pedro Amorim commit 9f81722f7547490950f0173c53f826888cc49759 Author: Andrew Fuerste-Henry Date: Thu Nov 5 20:40:40 2026 +0000 Bug 43559: (QA follow-up) update manual to double dash format Signed-off-by: Michelle Spinney Signed-off-by: Andrew Fuerste Henry Signed-off-by: Pedro Amorim commit fb397dd9bd86af49e9d706fadef3ddb0c30285e2 Author: Martin Renvoize Date: Thu Sep 17 16:22:06 2026 +0100 Bug 43559: Convert membership_expiry.pl to the Getopt::Long::Descriptive convention Convert the plain Getopt::Long option parsing to Koha::Script->describe_options, per the convention established by bug 43546. -c ("confirm") is declared required => 1: the script already refused to do anything without it (pod2usage + exit), which is exactly what the required constraint gives for free, so the hand-rolled check is gone. --active/--inactive are declared exclusive (bug 43557), and each gets a Params::Validate callback requiring a positive number of months, replacing the equivalent hand-rolled "defined but zero" check. --letter/--letter_renew's defaults move into the option spec, replacing the "if !$letter_expiry" post-parse assignment. The TrackLastPatronActivityTriggers syspref gate on --active/--inactive stays a post-parse check, same as the DB-existence checks audited on the sibling bugs: it's a business-state check, not a shape one, and Koha::Script->describe_options has no declarative home for it. One behavior note: previously, when multiple problems existed at once (e.g. TrackLastPatronActivityTriggers unset AND --active 0), the syspref message always won because of the if/elsif chain's ordering. Now the positive-months callback runs during option parsing, before the script body's syspref check, so that message can win instead when both are wrong simultaneously. Either way the script still exits non-zero with a clear message; only which message is shown when two things are wrong at once can change. Also found, not touched: -n ("no mail") is parsed but was already unused by the rest of the script before this conversion -- the "prints to standard out instead" behavior the POD describes isn't implemented, and -p/-n aren't actually enforced as mutually exclusive in code despite the POD claiming so. Both predate this bug; worth their own bug rather than silently changing behavior here. Test plan: 1. membership_expiry.pl --help / --man 2. membership_expiry.pl (no options) Rejected: mandatory parameter 'c' missing. 3. membership_expiry.pl -c --active 0 Rejected: needs a positive number of months. 4. membership_expiry.pl -c --active 3 --inactive 2 Rejected: mutually exclusive. 5. membership_expiry.pl -c --active 3 Rejected: needs TrackLastPatronActivityTriggers (same as before). 6. membership_expiry.pl -c -v Runs to completion (exits early on MembershipExpiryDaysNotice not being set in the test DB, same as before). 7. koha-qa.pl passes. Signed-off-by: Michelle Spinney Signed-off-by: Andrew Fuerste Henry Signed-off-by: Pedro Amorim commit 74460c753db71ac7f31702b2426badc58f1acb2a Author: Pedro Amorim Date: Tue May 20 12:37:54 2025 +0000 Bug 39944: Trim form params Test plan, ktd, before applying patch: 1) Enable ILLModule sys pref and create a new ILL request: /cgi-bin/koha/ill/ill-requests.pl?method=create&backend=Standard 2) Pick type 'journal article' and enter ' 123' to DOI (notice the leading white space) 3) Enter a cardnumber and a library. Click 'Create'. 4) Run the following SQL query (koha-mysql kohadev): SELECT CONCAT('(', REPLACE(value, ' ', ' '), ')') AS 'Value with parenthesis concatenated' FROM illrequestattributes WHERE illrequest_id = 1 AND type = 'doi'; 5) Notice the value is saved with the leading whitespace. Apply patch. Repeat. Notice it no longer saves with the leading white space. Sponsored-by: NHS England Signed-off-by: Richard Bridgen Signed-off-by: Lisette Scheer Signed-off-by: Pedro Amorim commit c90a394d7f5efce4cc7c4f0c5b6ad47443d69145 Author: Pedro Amorim Date: Tue May 20 12:37:23 2025 +0000 Bug 39944: Add tests prove t/db_dependent/Koha/ILL/Request.t Signed-off-by: Richard Bridgen Signed-off-by: Lisette Scheer Signed-off-by: Pedro Amorim commit 10c70a01735515a383e55e4ed773da98ecd0d1f9 Author: Martin Renvoize Date: Mon Nov 9 17:55:08 2026 +0000 Bug 26540: (QA follow-up) Don't rely on the caller's registers variable in transaction_types.inc transaction_types.inc checked "registers.size" to decide whether CASH should be offered for payouts and refunds. That variable is set by the including page: the patron account pages get an array from the Registers.all plugin, but pos/register.pl passed a Koha::Cash::Registers resultset, which has no "size" method. The POS register page failed with: The method Koha::Cash::Registers->size is not covered by tests! The include now asks the Registers plugin itself whether the current library has any register, so it behaves the same wherever it is used. pos/register.pl no longer passes the "registers" template parameter, which register.tt never used. To test: 1. Set UseCashRegisters to 'Use' 2. Add a cash register for your library (Administration > Cash registers) 3. Go to Point of sale > Register details for that register => The page loads (before this patch: Internal Server Error) 4. Open a patron's accounting page with a credit and a paid debit => The payout and refund type selects offer 'Cash' 5. Archive the register so your library has none => On the accounting page 'Cash' is no longer offered, and the prompt to create a cash register is shown 6. Sign off Signed-off-by: Pedro Amorim commit 7c991ebde110ce9b96eb5c9791f609bf3ca3bbc1 Author: Baptiste Wojtkowski Date: Thu Mar 6 13:58:35 2025 +0100 Bug 26540: (follow-up) Update patch with CSRF protections Signed-off-by: Martin Renvoize Signed-off-by: Nick Clemens Signed-off-by: Pedro Amorim commit a5a797b1a2a190a2b620a01614e670b2f0f48707 Author: Martin Renvoize Date: Fri Oct 2 12:47:27 2020 +0100 Bug 26540: Remove 'CASH' type from 'refund' and 'payout' This patch removes the 'CASH' transaction type, hides the register selection and adds an alert to the Payout and Refund modals on the boraccount page if there are no cash registers yet defined at the for the current branch. Test plan 1) Enable 'UseCashRegisters' 2) Add a credit to a user account 3) Attempt to 'Issue payout' of the credit to the user and note 3a) A new blue info message appears in the modal letting you know that you cannot issue a payout of type 'Cash' to the user without first adding a cash register. (If you have the correct permissions, you will also see a button in that info box allowing you to add said register) 3b) You will not see either the payment type or registers pulldown in the modal 4) Add at least one new 'PAYMENT_TYPE' authorized value 5) Repeat step 3 5a) Note the blue info message still appears 5b) You may now select a payment type as defined in step 4, however the 'Cash' option is not available. 5c) There is still not an option to select a cash register 6) Add a cash register for your branch 7) Repeat step 3 7a) You will no longer see the blue info box 7b) You should be able to select 'Cash' from the 'Payment type' options 7c) You will be able to select your cash register Signed-off-by: Martin Renvoize Signed-off-by: Baptiste Wojtkowski Signed-off-by: Nick Clemens Signed-off-by: Pedro Amorim commit 04d5ce77d81ca34b6e2a353408f2a165bbc4c157 Author: Sam Young Date: Tue Nov 10 19:12:18 2026 +0000 Bug 44067: Don't leak the strings flag into sibling embeds in to_api Koha::Object::to_api sets $params->{strings} inside the embed loop on the shared $params hashref. Once an embed requesting +strings is processed (e.g. periods+strings on ERM agreements), every embed iterated after it also gets a _strings attribute. Hash iteration order is random per process, so this happens intermittently depending on the Plack worker. The ERM agreement form sends the fetched related records back on save, so the stray _strings on user_roles, agreement_licenses, agreement_relationships or documents is rejected by the API with "Properties not allowed: _strings." This patch gives each embed its own copy of $params so the strings flag only applies to the embed that requested it. Test plan: 1. Create an ERM agreement with a user, a license, a related agreement and/or a document 2. Edit the agreement and click Save. Repeat several times => FAIL: "Something went wrong: Error: Properties not allowed: _strings." on some attempts 3. Apply this patch, restart_all 4. Repeat 2 => SUCCESS: The agreement saves every time Signed-off-by: John Vinke Signed-off-by: Martin Renvoize Signed-off-by: Pedro Amorim commit 6bade59638713162e0785fdb49ee718d5cb5871d Author: Jonathan Druart Date: Mon Nov 2 11:13:04 2026 +0100 Bug 43965: Detect Vue tables automatically in xt/check-thead-tt-tags.t Instead of adding an entry to @vue_tables each time a table is added to a Vue component, detect them: the TT file hosting the Vue app includes a bundle with [% Asset.js("js/vue/dist/.js") | $raw %] and passes the table settings with TablesSettings.GetTableSettings( module, page, table_id, 'json' ). Test plan prove xt/check-thead-tt-tags.t should still return green. Note that you will need those 2 commits pushed first: Bug 31391: Remove conditional TT tag from thead Bug 30557: Fix xt/check-thead-tt-tags.t failures Co-Authored-By: Claude Sonnet 5.5 Signed-off-by: Andrew Fuerste Henry Signed-off-by: David Nind Signed-off-by: Matt Blenkinsop Signed-off-by: Pedro Amorim commit 6c9365c94d8b6099130f3efda865d53179ccc18d Author: Olivia Reynolds Date: Tue Aug 25 15:31:57 2026 +0000 Bug 43086: (follow-up) Require checkbox consent to save details There are reasonable privacy concerns around automatically saving unauthenticated user details. If the OPAC is used on a shared machine, future users can recover the information provided by past users. This patch adds a "remember me" checkbox to the unauthenticated ILL request form. If it is checked upon submit, the details are saved. If it isn't checked, all existing stored details are deleted. The checkbox is unchecked by default unless there is existing saved data. Test plan: 1. Enable the system preferences "ILLModule" and "ILLOpacUnauthenticatedRequest". 2. In a logged-out OPAC window, navigate to /cgi-bin/koha/opac-illrequests.pl?op=create 3. Choose the "Standard" provider for the new ILL request. 4. Verify the "remember me" checkbox is unchecked at the bottom of the form. 5. Before choosing a request type, check the "Remember me" checkbox. 6. Choose the request type. 7. Verify the "Remember Me" checkbox is still checked after the page reloads. 7. Make any valid request, noting the name, email address, and chosen library used. 8. In the same OPAC session, navigate again to /cgi-bin/koha/opac-illrequests.pl?op=create 9. Choose the "Standard" provider for the new ILL request. 10. Verify that the name, email address, and chosen library are automatically filled with the same values used before. 11. Verify the "remember me" checkbox is checked. 12. Uncheck the "remember me" checkbox. 13. Make another valid request. 14. In the same OPAC session, navigate again to /cgi-bin/koha/opac-illrequests.pl?op=create 15. Choose the "Standard" provider for the new ILL request. 16. Verify no data is prefilled, and that the "remember me" checkbox is unchecked. Sponsored-by: NHS England Signed-off-by: David Nind Signed-off-by: Katrin Fischer Signed-off-by: Pedro Amorim commit 626c5bcfc881215c02b75baf8aa8e904dd440bd0 Author: Olivia Reynolds Date: Wed Jul 15 10:40:56 2026 +0000 Bug 43086: Prefill unauthenticated ILL request patron information This patch uses the browser's sessionStorage to save the unauthenticated patron information from ILL request creation. This saves users time if they wish to make multiple requests. Test plan: 1. Enable the system preferences "ILLModule" and "ILLOpacUnauthenticatedRequest". 2. In a logged-out OPAC window, navigate to /cgi-bin/koha/opac-illrequests.pl?op=create 3. Choose the "Standard" provider for the new ILL request. 4. Make any valid request, noting the name, email address, and chosen library used. 5. In the same OPAC session, navigate again to /cgi-bin/koha/opac-illrequests.pl?op=create 6. Choose the "Standard" provider for the new ILL request. 7. Verify that the name, email address, and chosen library are automatically filled with the same values used before. 8. Change the name to a different value. 9. Change the type of request, causing a page load. 10. Verify the changed name is retained, rather than prefilling an incorrect one. Sponsored-by: NHS England Signed-off-by: David Nind Signed-off-by: Katrin Fischer Signed-off-by: David Nind Signed-off-by: Katrin Fischer Signed-off-by: Pedro Amorim commit 05f5148a0e5693344499758e0bb0d5573839c2f6 Author: Pedro Amorim Date: Fri Oct 23 09:01:42 2026 +0000 Bug 42180: Polish: Show invalid patron data instead of clearing it When the stored value does not resolve to a patron, show "Invalid patron data ()" with a Remove link, and keep the value. Co-Authored-By: Claude Opus 5.5 Signed-off-by: David Nind Signed-off-by: Katrin Fischer Signed-off-by: Pedro Amorim commit db2480b2813e0e11b8b33069d5d25eecae668ae3 Author: Pedro Amorim Date: Fri Oct 23 08:45:54 2026 +0000 Bug 42180: Polish: Show a loading indicator while fetching the selected patron Co-Authored-By: Claude Opus 5.5 Signed-off-by: David Nind Signed-off-by: Katrin Fischer Signed-off-by: Pedro Amorim commit 3ed893f260a014e3e5409cc25bfdb535635885b0 Author: Pedro Amorim Date: Fri Oct 23 08:52:16 2026 +0000 Bug 42180: Update SIP2 accounts Cypress tests To test: 1) yarn cypress run --spec t/cypress/integration/SIP2/Accounts.ts Co-Authored-By: Claude Opus 5.5 Signed-off-by: David Nind Signed-off-by: Katrin Fischer Signed-off-by: Pedro Amorim commit 5a220f9d490e6bace0abd0de5ae9d82e228098b4 Author: Pedro Amorim Date: Fri Oct 23 09:34:21 2026 +0000 Bug 42180: Link the PatronAutoComplete label to its input FormElement renders