diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tt
index ff127995ce..0e61a6d8d4 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tt
@@ -10,6 +10,7 @@
[% PROCESS 'member-display-address-style.inc' %]
[% PROCESS 'member-display-alt-address-style.inc' %]
[% PROCESS 'i18n.inc' %]
+[% PROCESS 'patron-search.inc' %]
[% SET footerjs = 1 %]
[% INCLUDE 'doc-head-open.inc' %]
[% END %]
+ [% IF Koha.Preference('EnablePatronAccountLinking') %]
+
+ Linked accounts:
+ [% IF linked_accounts.size > 0 %]
+
+ [% IF linked_accounts_debt && linked_accounts_debt > 0 %]
+ -
+ Combined charges:
+ Linked accounts collectively owe [% linked_accounts_debt | $Price %].
+
+ [% END %]
+ [% FOREACH linked IN linked_accounts %]
+ -
+ [% IF logged_in_user.can_see_patron_infos( linked ) %]
+ [% linked.firstname | html %] [% linked.surname | html %]
+ [% ELSE %]
+ [% linked.firstname | html %]
+ [% linked.surname | html %]
+ [% END %]
+ ([% linked.cardnumber | html %]) [% IF linked.branchcode %]- [% Branches.GetName( linked.branchcode ) | html %][% END %]
+
+ [% END %]
+
+ [% IF CAN_user_borrowers_edit_borrowers %]
+
+ Add linked account
+ Leave linked group
+
+ [% END %]
+ [% ELSE %]
+ None
+ [% IF CAN_user_borrowers_edit_borrowers %]
+
+ Add linked account
+
+ [% END %]
+ [% END %]
+
+ [% END %]
+
[% IF ( patron.primary_contact_method ) %]
Main contact method:
@@ -922,9 +963,81 @@
placeholder: _("Select or type a reason"),
context: "modal",
});
+
+ [% IF Koha.Preference('EnablePatronAccountLinking') && CAN_user_borrowers_edit_borrowers %]
+ // Linked accounts management - leave entire linked group
+ $("#leave-linked-accounts").on("click", function(e) {
+ e.preventDefault();
+ var patron_borrowernumber = [% patron.borrowernumber | html %];
+
+ if (confirm(_("Are you sure you want to remove this patron from all linked accounts?"))) {
+ // Get the link_id for the current patron
+ $.ajax({
+ url: "/api/v1/patrons/" + patron_borrowernumber + "/account_links",
+ type: "GET",
+ headers: { "Accept": "application/json" },
+ success: function(links) {
+ // Find the CURRENT patron's link record
+ var link = links.find(function(l) { return l.patron_id == patron_borrowernumber; });
+ if (link) {
+ // Delete the current patron's link (removes them from the group)
+ $.ajax({
+ url: "/api/v1/patrons/" + patron_borrowernumber + "/account_links/" + link.account_link_id,
+ type: "DELETE",
+ success: function() {
+ // Reload page to show updated state
+ location.reload();
+ },
+ error: function(xhr) {
+ alert(_("Error leaving linked group: ") + xhr.responseJSON.error);
+ }
+ });
+ }
+ },
+ error: function(xhr) {
+ alert(_("Error fetching linked accounts: ") + xhr.responseJSON.error);
+ }
+ });
+ }
+ });
+ [% END %]
});
+
+ [% IF Koha.Preference('EnablePatronAccountLinking') && CAN_user_borrowers_edit_borrowers %]
+ function link_patron(borrowernumber, borrower) {
+ var patron_borrowernumber = [% patron.borrowernumber | html %];
+
+ if (borrowernumber == patron_borrowernumber) {
+ alert(_("Cannot link a patron to themselves."));
+ return;
+ }
+
+ $.ajax({
+ url: "/api/v1/patrons/" + patron_borrowernumber + "/account_links",
+ type: "POST",
+ contentType: "application/json",
+ data: JSON.stringify({ linked_patron_id: borrowernumber }),
+ success: function(response) {
+ // Reload the page to show the new linked account
+ location.reload();
+ },
+ error: function(xhr) {
+ var error_msg = xhr.responseJSON ? xhr.responseJSON.error : _("Unknown error");
+ alert(_("Error linking account: ") + error_msg);
+ }
+ });
+
+ $("#patron_search_modal_linked").modal("hide");
+ }
+ [% END %]
[% Asset.js("js/checkouts.js") | $raw %]
+
+ [% IF Koha.Preference('EnablePatronAccountLinking') && CAN_user_borrowers_edit_borrowers %]
+ [% SET columns = ['cardnumber', 'name', 'category', 'branch', 'action'] %]
+ [% PROCESS patron_search_modal columns => columns, modal_title => t("Link patron account"), patron_search_modal_id => 'patron_search_modal_linked', table_id => 'patron_search_modal_linked_table' %]
+ [% PROCESS patron_search_js columns => columns, actions => ["select"], preview_on_name_click => 1, table_id => 'patron_search_modal_linked_table', callback => 'link_patron' %]
+ [% END %]
[% END %]
[% INCLUDE 'intranet-bottom.inc' %]