commit e250b2cc3fd3df307838022e957d72e234db667c Author: Owen Leonard Date: Thu Oct 15 14:53:26 2026 -0400 Bug 42833: Identity provider icon in the OPAC should allow flexible sizing This patch updates the OPAC so that identiy provider icons can be displayed at different sizes instead of just as icons. A common class, "identity_provider" is added to each image. A provider-specific class is added to each "identitiy_provider_." A default style is added which allows the image to fill the available width of the login form. To test apply the patch and rebuild the OPAC CSS. - Go to Administration -> Identity providers and create a new identity provider. It doesn't need to be functional. - Add an icon URL. Because of CSP, a link to a remote image won't load. Save an image (e.g. https://placehold.co/600x400.png) to opac-tmpl/bootstrap/images and enter the icon URL in the form as http://localhost:8080/opac-tmpl/bootstrap/images/600x400.png - Go to the OPAC home page. You should see your ID provider image in the sidebar login form. The image should not overflow the sidebar container. - Test the modal which is shown when you click "Log in to your account" in the header menu. - Test the form which appears when you navigate to a page that asks you to log in, e.g. http://localhost:8080/cgi-bin/koha/opac-user.pl - Test that you can apply a custom style to your image using either the general class (.identity_provider) or a specific one (.identity_provider_) using OPACUserCSS, e.g. .identity_provider { border: 1px solid red; } .identity_provider_2 { border: 1px solid blue; } Sponsored-by: Athens County Public Libraries Signed-off-by: David Nind commit 2d73683c562eb5886cbc1c835f26522f0ff9617c Author: Matt Blenkinsop Date: Tue Oct 13 10:59:01 2026 +0100 Bug 8214: Remove bound_with_peers and use table columns to display binding info commit a570594c3240623124672867c8f2236a5fc8da0f Author: Matt Blenkinsop Date: Tue Oct 13 10:35:10 2026 +0100 Bug 8214: Add a bound-with column to the items modification table Sponsored-by: Royal College of Music commit 1e9329b1d32e570e8d4584551bc8492b00eb52e5 Author: Matt Blenkinsop Date: Fri Jul 31 09:49:32 2026 +0100 Bug 8214: Convert the bound_with column to a simple display modal Assisted-by: Sonnet 5 (Anthropic) Sponsored-by: Royal College of Music commit 44e56ccad5af411f04cd69dd13ad6739123af19a Author: Matt Blenkinsop Date: Thu Jul 30 16:11:20 2026 +0100 Bug 8214: Allow FormRelationshipSelect to query server side for the biblio search Assisted-by: Sonnet 5 (Anthropic) commit d38a09f03d08a4cc8b5a9d715111911c62b2a9b0 Author: Matt Blenkinsop Date: Thu Jul 30 12:32:08 2026 +0100 Bug 8214: Add unit tests Test plan: Setup 1. Apply all patches. In KTD run updatedatabase, then yarn build and restart_all. 2. Run the tests - all should pass: prove t/db_dependent/Koha/Item/BiblioLinks.t \ t/db_dependent/Koha/Item.t \ t/db_dependent/Koha/Biblio.t \ t/db_dependent/api/v1/item_biblio_links.t \ t/db_dependent/api/v1/biblios.t \ t/db_dependent/api/v1/holds.t \ t/db_dependent/XSLT.t \ t/db_dependent/Koha/Filter/EmbedItemsAvailability.t \ t/db_dependent/Koha/SearchEngine/Elasticsearch.t \ t/db_dependent/Koha/UI/Table/Builder/Items.t \ t/db_dependent/Reserves.t \ t/db_dependent/HoldsQueue.t \ t/db_dependent/Circulation.t yarn cypress run --spec t/cypress/integration/Islands/BoundWithModal_spec.ts Linking workflow (staff) 3. In Administration > System preferences > Cataloging, set EnableBoundWithItems to "Enable" and save. Using Cataloging > New record, create three records, A, B and C, and give only A an item (with a barcode and a call number). 4. Search the catalogue for A and click its title to open the record. On the Holdings tab the item row's Actions column has a "Bound-with links" button. The "Bound-with" column itself is not visible yet: Koha auto-hides holdings columns whose cells are all empty, the same as Collection or Serial enumeration on a plain item. It appears in step 5, once the row has links. Open the button: the modal is titled "Bound-with links", states the item record lives on A, and offers "Add links" - a search box ("Title, author, ISBN or record number"). Type part of B's title, select B from the dropdown, then do the same for C - both appear as selected entries - and click "Link". The page reloads. 5. On A: the Bound-with column is now present and the item row shows a "View (2)" button. Clicking it opens a display-only modal titled "Bound-with records" listing B and C as links, with no Remove or Add-links controls and only "Close" in the footer. The Actions column's "Bound-with links" button still opens the full management modal; the two buttons must not behave the same. 6. On B: the shared item appears in the holdings table (visually identical availability data) and its Bound-with column shows "View (2)" listing A and C. Same on C. No record reads as more authoritative than another. 7. Go back to A and click the Actions column's "Bound-with links" button again to reopen the management modal. This step only checks what the "Add links" search box finds. Titles, authors and ISBNs are matched on "contains", so several records can match at once and the list shows up to 20; each entry gives the title, author and record number, so the right one can be picked out. Record numbers are the exception and are matched exactly. Type each of the following in turn and look at the list that drops down, but do not select anything and do not click "Link": - part of the title of any other record in the catalogue (one that is not A, B or C): that record is listed, along with any other record whose title or author contains the same text. - the record number of that same record, typed on its own: that record is listed. The number itself is matched exactly, so 10 does not bring back 100 or 1000; but the digits are also matched against titles and authors, so a record such as "Top 100 recipes" can appear in the list too. - the ISBN of a record that has one: that record is listed. (Sample catalogue records normally have ISBNs; hyphens may be typed or left out.) - B's title or record number: B is not offered, because it is already linked to this item. - A's title or record number: A is not offered, because the item already lives on A. - a single letter: nothing is looked up. Title and author searching begins at three characters, although a record number works at any length. Words are matched as typed, in order, so "hard stares" finds "Notes on hard stares" but "stares hard" finds nothing. Close the modal with "Close". No new links have been created, so A still shows "View (2)". 8. Create a fourth record, D. Open it and choose Edit > "Bound-with link" from the toolbar, then enter the item's barcode; the item is linked to D. Remove the link again from D's Holdings tab, using the Actions column's "Bound-with links" button -> "Remove link" (a confirmation view is shown first). 9. Open B, and on the Holdings tab click the item's barcode to reach the item details page. It shows a "Bound-with" section reading "Item record lives on: A" then "Bound with: C". B itself must not be listed as its own peer. Do the same from A (Holdings tab > barcode): that section lists "Bound with: B" and "Bound with: C" with no "Item record lives on" line, because the item lives there. On both pages the "No. of items" count includes the shared item (e.g. "1"), not a negative or zero total. Now open B and choose Edit > "Manage items": the item row's Actions offer "Edit item on its home record" (which opens the item on record A) and "Remove bound-with link" (with confirmation). 10. Duplicate and self links are refused: adding B again gives an error in the modal; adding A, the record the item lives on, gives an error. 11. Log in as a staff user who has "Search the catalog" but not the "Create and remove links between items and bibliographic records" permission (set on the patron's More > Set permissions page, under "Edit catalog"). Open A: the Actions column's "Bound-with links" button and the Edit > "Bound-with link" toolbar entry are both absent, while the Bound-with column's "View (N)" button still opens the display-only modal. OPAC 12. In the OPAC, search for B and click its title. On the Holdings tab the shared item appears with call number, barcode and status, and its "Bound with" column lists A and C, each title linking to that record in the OPAC. There is no "No physical items for this record" message. Repeat for C, then for A: the column lists B and C, since no record is privileged. On every record the column omits the record being viewed. Search and indexing 13. Run a full reindex (koha-rebuild-zebra -b -f -v kohadev, or the Elasticsearch equivalent). 14. Search the catalogue by title for B, then for C, in both the staff interface and the OPAC, so each appears in a results list. Their result entries show "1 item / available" (staff) and "Items available for loan" (OPAC), NOT "No items available", and offer a Place hold link. 15. In Circulation > Check out, check the item out to any patron by barcode; circulation must behave exactly as normal. Reindex (or wait for the indexer), then confirm B's search result line and the records for A, B and C all show the item as checked out. Check it back in from Circulation > Check in. Holds 16. Open B and click "Place hold" (or place the hold from B in the OPAC). On the Place hold page the shared item row is labelled "Bound-with item - the item record lives on A", and the "Pickup at" list is populated with libraries. Place the hold. It is recorded against B: the patron's Holds tab shows B's title, and so does B's own Holds tab. 17. Go to Circulation > Check in and check in the item's barcode. The hold-found dialog appears for B's hold, shows B's title, and carries the context line "Bound-with item: the hold is for this title, the item record itself lives on A". Choose "Confirm hold"; the hold becomes Waiting on the patron's Holds tab. 18. Circulation > Holds queue: with a pending hold on B, build the queue (enable the RealTimeHoldsQueue preference, or run misc/cronjobs/holds/build_holds_queue.pl). The queue offers A's item for B's hold. Place a second hold on A and rebuild: the single item is assigned to only one of the two records' holds, never both. 19. Unlink check. An "active hold" is any hold still listed on the record's Holds tab, whether pending or waiting: - A hold placed on a specific copy (item-level) on B always blocks unlinking. - A hold placed on the record as a whole (next available copy) on B blocks only while the link is B's only source of items. Add an item of B's own and the same unlink is allowed. In either blocking case "Remove bound-with link" is refused with a warning that holds would be stranded, and "Remove anyway" succeeds. Re-create the link afterwards if continuing. MARC 501 20. Open A and choose Edit > "Edit record". In tab 5 add field 501 subfield a, "Bound with: [Title B] / [Author]", and save. A's record page in both the staff interface and the OPAC now displays the note once, exactly as catalogued - the note carries its own "Bound with:" prefix and no extra label is added. Teardown checks 21. Remove the remaining links, from either record's Holdings tab. The bound-with column and labels disappear from every record, and after a reindex B and C show no items again in search results. 22. Re-create the links, then delete the item from A (Holdings tab > Actions > Delete item). The confirmation notes that the item is linked to other records, but still allows the deletion. Afterwards the links are gone from B and C, and their pages and search results revert after a reindex. 23. In Administration > System preferences > Cataloging, set EnableBoundWithItems back to "Don't enable" and save. All bound-with wording and buttons then disappear with no errors, and search availability for B reverts at the next reindex. Assisted-by: Sonnet 5 (Anthropic) commit 795ab327a916fe96974b317def8c603cc3aef12e Author: Matt Blenkinsop Date: Thu Jul 30 12:29:51 2026 +0100 Bug 8214: Look for stranded biblio level holds when removing links Assisted-by: Sonnet 5 (Anthropic) commit eb5d823da89b73995c6b00be3199f85f390d8166 Author: Matt Blenkinsop Date: Thu Jul 30 10:19:13 2026 +0100 Bug 8214: XSL changes to handle 501 bound with field Assisted-by: Sonnet 5 (Anthropic) commit e20f1b433f9a06aaffdcfc77f7cf99f0772b8a5b Author: Matt Blenkinsop Date: Thu Jul 30 10:13:19 2026 +0100 Bug 8214: Adjust holds logic to look for records that are bound to items Assisted-by: Sonnet 5 (Anthropic) commit 104e5dd852f889773c12015c2b5cd70836108187 Author: Matt Blenkinsop Date: Wed Jul 29 11:39:16 2026 +0100 Bug 8214: Update additional areas that filter items Assisted-by: Sonnet 5 (Anthropic) commit ab3fb7000c35d88970c842ff6167462ccfad6215 Author: Matt Blenkinsop Date: Mon Jul 27 16:33:06 2026 +0100 Bug 8214: Update the OPAC templates Assisted-by: Sonnet 5 (Anthropic) commit d40192a7592db6602e3dc131d0cffa72ec8b6e74 Author: Matt Blenkinsop Date: Mon Jul 27 16:15:09 2026 +0100 Bug 8214: Add a modal to bind records to an item Assisted-by: Sonnet 5 (Anthropic) commit 2c532884ba696d0bf68a9d8c7cd9cd82ea325f4b Author: Matt Blenkinsop Date: Mon Jul 27 16:14:26 2026 +0100 Bug 8214: Update the cataloging views to handle bound with records Assisted-by: Sonnet 5 (Anthropic) commit 68753e57f078cc93ac89d4e4d1ecd2a5896c3aea Author: Matt Blenkinsop Date: Mon Jul 27 14:56:11 2026 +0100 Bug 8214: Implement API endpoints for biblio to item binding Assisted-by: Sonnet 5 (Anthropic) commit c0bce718da04c063358352c945bd5ac64884f566 Author: Matt Blenkinsop Date: Mon Jul 27 14:20:29 2026 +0100 Bug 8214: Apply binding logic to Item and Biblio class methods Assisted-by: Sonnet 5 (Anthropic) commit 7db0714322cbf762104c439fce0f0d9c5dba87a1 Author: Matt Blenkinsop Date: Mon Jul 27 14:19:48 2026 +0100 Bug 8214: Add BiblioLink object classes Assisted-by: Sonnet 5 (Anthropic) commit d589293001d10212c79ee29586f23a1df3c23515 Author: Matt Blenkinsop Date: Mon Jul 27 11:10:33 2026 +0100 Bug 8214: DBIC Assisted-by: Sonnet 5 (Anthropic) commit 7cbe296437105572b5738b51bd97500987d60cff Author: Matt Blenkinsop Date: Mon Jul 27 11:10:18 2026 +0100 Bug 8214: Add a syspref and permissions Assisted-by: Sonnet 5 (Anthropic) commit 05ee23299bbdfac7c77a21aeab1b1d8d0bbcaead Author: Matt Blenkinsop Date: Mon Jul 27 11:08:58 2026 +0100 Bug 8214: Add an ITEM_BIBLIO_LINK_TYPE authorised value Assisted-by: Sonnet 5 (Anthropic) commit 77215c1646210d90d1e81bb7f94b983a0d226602 Author: Matt Blenkinsop Date: Mon Jul 27 11:08:03 2026 +0100 Bug 8214: Add an item_biblio_links_table Assisted-by: Sonnet 5 (Anthropic) commit d98e705538d714199be724c47ea3f9d38711cbc2 Author: Matt Blenkinsop Date: Mon Feb 16 14:53:07 2026 +0000 Bug 38291: (QA follow-up) Add library_groups tag to swagger.yaml commit b0d859894e8d1ca6504140320dfee2707f17d342 Author: Matt Blenkinsop Date: Tue Oct 29 17:05:35 2024 +0000 Bug 38291: Add a unit test (cherry picked from commit 9f9c2a0678c42ec5ac4016dd2ef603232150e770) Signed-off-by: Brendan Gallagher commit 9fc3d85759cae2f2f2fd44d60676f5d5945919fa Author: Matt Blenkinsop Date: Tue Oct 29 16:59:51 2024 +0000 Bug 38291: Add an endpoint to list library groups (cherry picked from commit cd2440165f62e96410df9d11bb3aab578d028016) Signed-off-by: Brendan Gallagher commit 1328267f64c78382d5048b66ecdba8905ed73f8d Author: Pedro Amorim Date: Tue Oct 13 14:48:19 2026 +0000 Bug 40478: DBIC Signed-off-by: Pedro Amorim commit 5aaa1200e0aeb5ab485173f16882e76e455dbe9b Author: Pedro Amorim Date: Tue Oct 13 14:40:21 2026 +0000 Bug 40478: DBRev 26.06.00.035 Signed-off-by: Pedro Amorim commit 2b617819d33a9166b914e149f04c2afcbacc3e1b Author: Lucas Gass Date: Tue Oct 13 14:19:02 2026 +0000 Bug 40478: (follow-up) Add support for EAN13 Signed-off-by: Pedro Amorim commit 0156fa8ffefee0e3123f8d174afd1397a7799abb Author: Lucas Gass Date: Thu Oct 1 14:18:49 2026 +0000 Bug 40478: (follow-up) Adjust kohastructure.sql Signed-off-by: Pedro Amorim commit b31a571d61397c8f8b626f31fe8e137b5ab18e3a Author: Lucas Gass Date: Thu Oct 1 14:16:19 2026 +0000 Bug 40478: (follow-up) Adjust tests Signed-off-by: Pedro Amorim commit 9815f50e4b8bf44fe3f5219b35c916d8d772503d Author: Lucas Gass Date: Tue Jan 27 22:31:19 2026 +0000 Bug 40478: Add support for COOP2of5, Industrial2of5 and EAN13 Signed-off-by: David Nind Signed-off-by: David Cook Signed-off-by: Pedro Amorim commit 44e61e7b60ddb47b5faf4fc223e7305e13afdab3 Author: Lucas Gass Date: Wed Jan 21 18:31:51 2026 +0000 Bug 40478: Add ability to justify CODE39 barcodes To test: 1. Apply patch, updatedatabase, restart_all 2. Create at least 1 label batch 3. Create or edit an existing layout. 4. You should now see a dropdown labeled "Barcode justification:" with options to align left, right, and center. 5. At this point I like to check "Draw guide boxes" as it makes testing alignment much easier. 6. Now test generating label sets to "Download as PDF". 7. You will want to make sure the barcode properly aligns left, right, and center. 8. Test with all the different "Choose barcode type (encoding):" options. Ensuring the barcodes align correectly left, right, and center. 9. Also test with all the different "Choose layout type:" that will display a barcode. Signed-off-by: David Nind Signed-off-by: David Cook Signed-off-by: Pedro Amorim commit dd8f3399cafde033dbcf91ed7469d29d9fe88431 Author: Lucas Gass Date: Wed Jan 21 18:30:51 2026 +0000 Bug 40478: Database update to add barcode_justify column to creator_layouts Signed-off-by: David Nind Signed-off-by: David Cook Signed-off-by: Pedro Amorim commit 63e484d7ed7be655fbe954f8cf06f2406d9fab24 Author: Lari Taskula Date: Tue Oct 13 17:03:07 2026 +0300 Bug 43229: Check opacuserlogin before asking the user to log in To test: 1) Enable 'suggestion' and 'AnonSuggestions', set 'AnonymousPatron' to an existing borrowernumber, and disable 'opacuserlogin' 2) Log out 3) Go to http://localhost:8080/cgi-bin/koha/opac-suggestions.pl?op=add_form 4) The form says "Please fill out this form to make a purchase suggestion.", but does not mention logging in to receive an email Signed-off-by: Pedro Amorim commit 3d4ce4e0c930db7f73aad447d3091555daab5549 Author: Lari Taskula Date: Wed Aug 5 12:45:01 2026 +0300 Bug 43229: Instruct user to log in to receive purchase suggestion email notifications To test: 1. Enable preference suggestion 2. Enable preference AnonSuggestions 3. Navigate to OPACBaseURL/cgi-bin/koha/opac-suggestions.pl?op=add_form (make sure you are not logged in) 4. Click "+ New purchase suggestion" 5. Observe text "If you wish to receive an email when the library processes your suggestion, please log in before making a purchase suggestion." 6. Log in to OPAC 7. Observe text "You will receive an email when the library processes your suggestion." Signed-off-by: Roman Dolny Signed-off-by: Laura_Escamilla Signed-off-by: Pedro Amorim commit 4583fbb52a6e89e53fa42311d398f4753691b25b Author: Martin Renvoize Date: Fri Apr 17 07:36:10 2026 +0100 Bug 42314: (follow-up) Simplify list_closed_dates using closed_dates_in_range Related to Bug 42206 (which introduced the list_closed_dates controller) and Bug 42310 (which added the closed_dates_in_range accessor). The list_closed_dates controller previously reached into Koha::Calendar private state ($calendar->_holidays, $calendar->{weekly_closed_days}, $calendar->{day_month_closed_days}) to compute the closed-dates list. This broke encapsulation and would silently break if Koha::Calendar internals changed. Replace that block with a single call to the public Koha::Calendar->closed_dates_in_range accessor, chained off the Koha::Library->calendar accessor added in this bug. Test plan: 1. prove t/db_dependent/api/v1/libraries.t 2. GET /api/v1/libraries/{id}/closed_dates still returns the same list across weekly, repeating, single and exception scenarios Signed-off-by: Tomás Cohen Arazi Signed-off-by: Pedro Amorim commit 3a1df1dc48500354b349b2556d7aaeeae1207a29 Author: Martin Renvoize Date: Fri Apr 17 16:41:39 2026 +0100 Bug 42314: (follow-up) Use Koha::Library::Calendar namespace Update the calendar() accessor and its POD to point at Koha::Library::Calendar instead of the now-moved Koha::Calendar namespace, and update t/db_dependent/Koha/Library.t to match. Test plan: - prove t/db_dependent/Koha/Library.t Signed-off-by: Tomás Cohen Arazi Signed-off-by: Pedro Amorim commit c3fc56840b3d64ebf28067c3e8487dc9b9b0814b Author: Martin Renvoize Date: Fri Apr 17 07:40:54 2026 +0100 Bug 42314: (QA follow-up) Drop lazy require in Koha::Library->calendar The accessor loaded Koha::Calendar via runtime require on every call, presumably as a guard against a circular dependency. No such cycle exists: Koha::Calendar and its Koha::Calendar::* children do not use Koha::Library. Replace the runtime require with a top-level use so the module loads once at compile time, matching the other Koha::* imports in this file. Also expand the POD a little to mention what the returned Koha::Calendar is scoped to and what it is typically used for. Test plan: 1. prove t/db_dependent/Koha/Library.t 2. Check POD coverage: perl -MPod::Coverage=Koha::Library -e 1 Signed-off-by: Tomás Cohen Arazi Signed-off-by: Pedro Amorim commit 077b1f17f9bd3b5eddf56b5f547eb50d9663c0a6 Author: Tomás Cohen Arazi Date: Wed Apr 8 18:37:59 2026 -0300 Bug 42314: (follow-up) Use Koha::Library->calendar accessor Replace direct Koha::Calendar->new calls with $library->calendar where a Koha::Library object is already available: - Koha::REST::V1::Libraries::list_closed_dates - Koha::Charges::Fees::accumulate_rentalcharge Remove now-unused 'use Koha::Calendar' from both files. Signed-off-by: Tomás Cohen Arazi Signed-off-by: David Nind Signed-off-by: Martin Renvoize Signed-off-by: Tomás Cohen Arazi Signed-off-by: Pedro Amorim commit 1c9f145c910cb93a08c58691d6a17927c66336e6 Author: Tomás Cohen Arazi Date: Wed Apr 8 18:23:40 2026 -0300 Bug 42314: Add Koha::Library->calendar accessor my $calendar = $library->calendar; Returns a Koha::Calendar object for the library. Uses require to avoid circular dependency risks. Signed-off-by: Tomás Cohen Arazi Signed-off-by: David Nind Signed-off-by: Martin Renvoize Signed-off-by: Tomás Cohen Arazi Signed-off-by: Pedro Amorim commit 7317b36c228376a794f7910d6801341723184268 Author: Pedro Amorim Date: Tue Oct 13 14:35:37 2026 +0000 Bug 41297: DBRev 26.06.00.034 Signed-off-by: Pedro Amorim commit b1ca55afe03e9688dec5cf2181f8928554722687 Author: Pedro Amorim Date: Tue Oct 13 14:10:40 2026 +0000 Bug 41297: (RM follow-up) Only set variable and value for new sysprefs Since bug 41834, options, explanation and type must be NULL in the DB. Test plan: 1) On a DB without the new prefs, run updatedatabase 2) prove t/db_dependent/check_sysprefs.t => SUCCESS Co-Authored-By: Claude Opus 5.5 Signed-off-by: Pedro Amorim commit 3607e959686f5aafbb0367a37060f9a1bb2badb9 Author: Martin Renvoize Date: Wed Sep 16 08:06:06 2026 +0100 Bug 41297: (QA follow-up) Fix DBIC checksums and missing upgrade comment The VendorEdiAccount.pm result class carried a hand-edited, non-genuine md5sum comment ("md5sum:original_schema_bug_41297") left over from an unrelated edit. Running dbic --force with a real checksum in place caused DBIx::Class::Schema::Loader to treat the custom section as untrustworthy and drop the manual is_boolean decorations entirely. The Aqcontact.pm checksum was also stale - it had not been recomputed after edi_error_notification was added by hand, so the file didn't match what a genuine dbic run would produce. Regenerated both files with a real `dbic --force` run against the migrated database, then restored the is_boolean flags for VendorEdiAccount.pm below the DO NOT MODIFY marker. Also add the missing COMMENT clause to the edi_error_notification ALTER TABLE in the atomicupdate, so upgraded instances get the same column comment ('is the edi error notification contact') as a fresh install via kohastructure.sql. Signed-off-by: Pedro Amorim commit f61c6f88d5a2e89a1845c3d2678fbf8feec2ad5e Author: Kyle M Hall Date: Mon Jun 29 13:04:34 2026 -0400 Bug 41297: (QA follow-up) Avoid extra database query Signed-off-by: Kyle M Hall Signed-off-by: Martin Renvoize Signed-off-by: Pedro Amorim commit b8162210576a71a0b7be5a782c1ec7e4972066c3 Author: Kyle M Hall Date: Mon Jun 29 13:02:02 2026 -0400 Bug 41297: (QA follow-up) Fix the duplicate invoice notices * Was using OPACBaseURL instead of staffClientBaseURL * Fixed [% aqbooksellers.name %] to [% bookseller.name %] Signed-off-by: Kyle M Hall Signed-off-by: Martin Renvoize Signed-off-by: Pedro Amorim commit 8c5d2156d96752d97b6086be3cc0fa4f564e385b Author: Kyle M Hall Date: Mon Jun 29 12:58:25 2026 -0400 Bug 41297: (QA follow-up) Fix up the atomicupdate Signed-off-by: Kyle M Hall Signed-off-by: Martin Renvoize Signed-off-by: Pedro Amorim commit 618b853ebb3bef7f620e3caba88ccd223e7b59b7 Author: Kyle M Hall Date: Mon Jun 29 12:55:27 2026 -0400 Bug 41297: (QA follow-up) Sort new system preferences in sysprefs.sql Signed-off-by: Kyle M Hall Signed-off-by: Martin Renvoize Signed-off-by: Pedro Amorim commit 94a11470191b3cfa25fbddd14ae6817cf094bc94 Author: Martin Renvoize Date: Fri Mar 6 12:04:27 2026 +0000 Bug 41297: (follow-up) Improve system preference descriptions Rename to place the preferences adjacent to EdifactInvoiceImport on the system preferences page and align notifications preferences with conventions. - EdiBlockDuplicateInvoice -> EdifactInvoiceImportBlockDuplicates - EdiBlockDuplicateInvoiceEmailNotice -> EdifactInvoiceImportBlockDuplicatesEmailNotice - EdiBlockDuplicateInvoiceEmailAddresses -> EdifactInvoiceImportBlockDuplicatesEmailAddresses - Change EdiBlockDuplicateInvoiceEmailNotice from YesNo to Choice, matching the EmailPurchaseSuggestions/EmailAddressForSuggestions pattern. Options are: Do not send / AcquisitionsDefaultEmailAddress / specific email addresses / KohaAdminEmailAddress. - EdiBlockDuplicateInvoiceEmailAddresses is now only used when the choice is set to 'specific email addresses', matching EmailAddressForSuggestions. - Pass from_address (AcquisitionsDefaultEmailAddress with fallback) and reply_address (AcquisitionsDefaultReplyTo) to EnqueueLetter for both library and vendor notifications, consistent with other acquisitions notices. - Add UPDATE in atomicupdate to migrate existing YesNo installs to Choice. Update all references in EDI.pm, acquisitions.pref, atomicupdate, sysprefs.sql, and tests. Also fix test mock values for EmailNotice from the old YesNo value (1) to the correct Choice value ('EdifactInvoiceImportBlockDuplicatesEmailAddresses'). Signed-off-by: Hannah Dunne-Howrie Signed-off-by: Kyle M Hall Signed-off-by: Pedro Amorim commit dfa47e16b2e57cfd89e48413f16ad37b24f0d163 Author: Martin Renvoize Date: Thu Mar 5 14:35:36 2026 +0000 Bug 41297: Block duplicate EDIFACT invoice processing This patch adds duplicate invoice detection and blocking for EDIFACT invoice processing, with email notifications to library staff and vendors. Key features: 1. System preferences to enable/disable duplicate blocking and email notifications 2. Database index on aqinvoices (invoicenumber, booksellerid) for performance 3. Email notifications using the message_queue (GetPreparedLetter → EnqueueLetter pattern) 4. Vendor contact-based notifications via a new aqcontacts.edi_error_notification flag 5. Two notice templates (EDI_DUP_INV_LIBRARY and EDI_DUP_INV_VENDOR) Changes: - Add EdiBlockDuplicateInvoice system preference - Add EdiBlockDuplicateInvoiceEmailNotice system preference - Add EdiBlockDuplicateInvoiceEmailAddresses system preference - Add edi_error_notification column to aqcontacts table - Add duplicate invoice detection logic to Koha::EDI::process_invoice - Add email notification support using standard Koha messaging queue - Add "Contact about EDI errors" checkbox to vendor contacts UI - Add notice templates to sample_notices.yml for fresh installations - Add test coverage in t/db_dependent/Koha/EDI.t Test plan: 1. Run database update: perl installer/data/mysql/updatedatabase.pl 2. Enable system preferences: - Set EdiBlockDuplicateInvoice to "Block" - Set EdiBlockDuplicateInvoiceEmailNotice to "Send" - Set EdiBlockDuplicateInvoiceEmailAddresses to valid email(s) 3. Edit a vendor and add a contact with "Contact about EDI errors" enabled 4. Process an EDIFACT invoice 5. Attempt to process the same invoice again - should be blocked 6. Check message_queue table for queued notifications 7. Run tests: prove t/db_dependent/Koha/EDI.t :: duplicate_invoice_blocking Sponsored-by: Westminster City Council Sponsored-by: Royal Borough of Kensington and Chelsea Signed-off-by: Hannah Dunne-Howrie Signed-off-by: Kyle M Hall Signed-off-by: Pedro Amorim commit fc40275c52f0ee8fd3f6c2910a08ed65feb52397 Author: Martin Renvoize Date: Thu Mar 5 14:39:26 2026 +0000 Bug 41297: Automated schema update Signed-off-by: Hannah Dunne-Howrie Signed-off-by: Kyle M Hall Signed-off-by: Pedro Amorim commit e6997d4f99adcccc836db8af163d748e6505c592 Author: Martin Renvoize Date: Thu Feb 5 11:52:15 2026 +0000 Bug 41297: Database updates Signed-off-by: Hannah Dunne-Howrie Signed-off-by: Kyle M Hall Signed-off-by: Pedro Amorim commit a4ed93ac3585e4fe608fe1bc803bdcb3bfe298b4 Author: Jonathan Druart Date: Thu Aug 27 15:16:11 2026 +0200 Bug 32652: Add span to avoid %s in po files Signed-off-by: Jonathan Druart Signed-off-by: Pedro Amorim