From 17225239e1c918dbdf16e8904792ce941af2fe8d Mon Sep 17 00:00:00 2001
From: Roch D'Amour <roch.damour@inlibro.com>
Date: Wed, 28 Feb 2018 17:54:53 -0500
Subject: [PATCH] Bug 12446 - Enable an adult to have a guarantor

Concflicts has been fixed. Also attributes in system preference : AdditionalGuarantorField are now displayed correctly in all scenerios.

I have rebased every patch.
This includes all the features from the previous patches.

Removed the dollar signs and stopped using C4::Category

On the patron category page, there is a new field to specify whether patrons can be guarantee or not.
The atomic update SQL script adds this new field and sets it to true for categories of type "C" and "P".

1) Apply the patch
2) Run updatedatabase.pl to add AdditionalGuarantorField to preferences and canbeguarantee to categories.
3) Go to patron category administration, edit a category and change the value of Can Be Guarantee to yes (for Child and Professional mostly to set it by default)
4) See below to test various scenarios

- Enable an adult to have a guarantor:
0.0) Create or edit a patron category of type 'A'.
0.1) Set the "Can be guarantee" field to "Yes" and save.
1) Select an adult patron -> details tab;
2) Click edit button;
3) validate "guarantor information" fieldset;

- Shows guarantees' fines in the guarantor's page:
4) Click Set to patron button and select a guarantor;
5) Generate a fine;
6) Select guarantor patron -> details tab;
7) Validate guarantee's fine information.

- Transfer some guarantor's information to the guarantee while adding a guarantiee:
0) Select an adult patron;
1) Insert all information;
2) Click Add guarantiee bouton;
3) Validade Garantor information/Main address/Contact fieldsets filled;

- Transfer some guarantor's information to the guarantee while creating a new patron
0) Select an adult patron;
1) Insert all information;
2) Add a new adult patron;
3) Click "Set to patron" button;
4) Select the adult patron from 0);
5) Validade Garantor information/Main address/Contact fieldsets filled;

- Transfer some guarantor's information to the guarantee while adding a guarantiee:
0) Select an adult patron;
1) Insert all information;
2) Click Add guarantiee bouton;
3) Validade Garantor information/Main address/Contact fieldsets filled;

- Transfer guarantor's alternate address/contact to the guarantee while creating a new patron:
0) Search AdditionalGuarantorField preference;
1) Insert some additional database columns from alternate address/contact to be transferred from guarantor;
2) Select an adult patron;
3) Insert all information;
4) Add a new adult patron;
5) Click "Set to patron" button;
6) Select the adult patron from 0);
7) Validade Garantor information/Main address/Contact fieldsets filled;
8) Validade Garantor additional alternate address/contact filled;

- Transfer guarantor's alternate address/contact to the guarantee while adding a guarantiee:
0) Search AdditionalGuarantorField preference;
1) Insert some additional database columns from alternate address/contact to be transferred from guarantor;
3) Select an adult patron;
4) Insert all information;
5) Click Add guarantiee bouton;
6) Validade Garantor information/Main address/Contact fieldsets filled;
7) Validade Garantor additional alternate address/contact filled;

Signed-off-by: delaye <stephane.delaye@biblibre.com>
---
 C4/Members/Attributes.pm                           | 19 ++++++++++++-
 C4/Utils/DataTables/Members.pm                     | 32 +++++++++++++++++-----
 Koha/Schema/Result/Category.pm                     |  8 ++++++
 admin/categories.pl                                |  3 ++
 .../atomicupdate/bug_12446-EnableAdultGarantee.sql | 11 ++++++++
 installer/data/mysql/kohastructure.sql             |  3 +-
 installer/data/mysql/sysprefs.sql                  |  4 ++-
 .../en/includes/member-main-address-style-us.inc   | 18 ++++++------
 .../prog/en/includes/members-toolbar.inc           |  2 +-
 .../prog/en/modules/admin/categories.tt            | 15 ++++++++++
 .../prog/en/modules/admin/preferences/patrons.pref |  5 ++++
 .../prog/en/modules/common/patron_search.tt        |  7 +++--
 .../prog/en/modules/members/memberentrygen.tt      |  6 ++--
 .../prog/en/modules/members/moremember.tt          | 15 +++++++---
 .../en/modules/members/tables/guarantor_search.tt  |  2 +-
 koha-tmpl/intranet-tmpl/prog/js/members.js         | 20 ++++++--------
 members/memberentry.pl                             | 15 +++++-----
 members/moremember.pl                              | 29 +++++++++++++++++---
 svc/members/search                                 |  2 ++
 19 files changed, 161 insertions(+), 55 deletions(-)
 create mode 100644 installer/data/mysql/atomicupdate/bug_12446-EnableAdultGarantee.sql

diff --git a/C4/Members/Attributes.pm b/C4/Members/Attributes.pm
index cf9051d..41490a1 100644
--- a/C4/Members/Attributes.pm
+++ b/C4/Members/Attributes.pm
@@ -32,7 +32,7 @@ BEGIN {
     @EXPORT_OK = qw(GetBorrowerAttributes GetBorrowerAttributeValue CheckUniqueness SetBorrowerAttributes
                     DeleteBorrowerAttribute UpdateBorrowerAttribute
                     extended_attributes_code_value_arrayref extended_attributes_merge
-                    SearchIdMatchingAttribute);
+                    SearchIdMatchingAttribute get_guarantor_shared_attributes);
     %EXPORT_TAGS = ( all => \@EXPORT_OK );
 }
 
@@ -365,6 +365,23 @@ sub _sort_by_code {
     return $x->{code} cmp $y->{code} || $x->{value} cmp $y->{value};
 }
 
+=head2 get_guarantor_shared_attributes
+
+    $guarantor_attributes = get_guarantor_attributes();
+
+    returns an array reference containing attributes to be shared between guarantor and guarantee.
+
+=cut
+
+sub get_guarantor_shared_attributes{
+    my @attributes    = qw( streetnumber address address2 city state zipcode country branchcode phone phonepro mobile email emailpro fax );
+    if( my @additional = split(/\|/, C4::Context->preference("AdditionalGuarantorField")) ){
+        $_ =~ s/(?:^\s+)|(?:\s+$)//g for (@additional); # Trim whitespaces
+        @attributes = ( @attributes, @additional);
+    }
+    return \@attributes;
+}
+
 =head1 AUTHOR
 
 Koha Development Team <http://koha-community.org/>
diff --git a/C4/Utils/DataTables/Members.pm b/C4/Utils/DataTables/Members.pm
index 1e3f642..c3ebe8d 100644
--- a/C4/Utils/DataTables/Members.pm
+++ b/C4/Utils/DataTables/Members.pm
@@ -2,6 +2,8 @@ package C4::Utils::DataTables::Members;
 
 use Modern::Perl;
 use C4::Context;
+use C4::Members;
+use C4::Members::Attributes qw/get_guarantor_shared_attributes/;
 use C4::Utils::DataTables;
 use Koha::DateUtils;
 use C4::Members::Attributes qw(SearchIdMatchingAttribute );
@@ -56,13 +58,29 @@ sub search {
         }
     }
 
-    my $select = "SELECT
-        borrowers.borrowernumber, borrowers.surname, borrowers.firstname,
-        borrowers.streetnumber, borrowers.streettype, borrowers.address,
-        borrowers.address2, borrowers.city, borrowers.state, borrowers.zipcode,
-        borrowers.country, cardnumber, borrowers.dateexpiry,
-        borrowers.borrowernotes, borrowers.branchcode, borrowers.email,
-        borrowers.userid, borrowers.dateofbirth, borrowers.categorycode,
+    # If branches are independent and user is not superlibrarian
+    # The search has to be only on the user branch
+    if ( C4::Context::only_my_library ) {
+        my $userenv = C4::Context->userenv;
+        $branchcode = $userenv->{'branch'};
+
+    }
+
+    $dbh = C4::Context->dbh;
+    my @columns = qw( borrowernumber surname firstname streetnumber streettype address address2 city state zipcode country cardnumber dateexpiry borrowernotes branchcode email userid dateofbirth categorycode phone phonepro mobile fax email emailpro);
+    if( my @guarantor_attributes = @{ get_guarantor_shared_attributes() }){
+        foreach my $item (@guarantor_attributes) {
+             if (! grep {$_ eq $item} @columns) {
+                 push @columns, $item;
+            }
+        }
+    };
+    my $borrowers_columns = "";
+    foreach my $item (@columns) {
+        $borrowers_columns .= "borrowers." . $item . ", ";
+    }
+
+    my $select = "SELECT " . $borrowers_columns . "
         categories.description AS category_description, categories.category_type,
         branches.branchname";
     my $from = "FROM borrowers
diff --git a/Koha/Schema/Result/Category.pm b/Koha/Schema/Result/Category.pm
index 42865a8..ddf8c62 100644
--- a/Koha/Schema/Result/Category.pm
+++ b/Koha/Schema/Result/Category.pm
@@ -109,6 +109,12 @@ __PACKAGE__->table("categories");
   default_value: -1
   is_nullable: 0
 
+=head2 canbeguarantee
+
+  data_type: 'tinyint'
+  default_value: 0
+  is_nullable: 0
+
 =head2 default_privacy
 
   data_type: 'enum'
@@ -161,6 +167,8 @@ __PACKAGE__->add_columns(
     default_value => -1,
     is_nullable   => 0,
   },
+  "canbeguarantee",
+  { data_type => "tinyint", default_value => 0, is_nullable => 0},
   "default_privacy",
   {
     data_type => "enum",
diff --git a/admin/categories.pl b/admin/categories.pl
index 358ef7d..dbaaf48 100755
--- a/admin/categories.pl
+++ b/admin/categories.pl
@@ -93,6 +93,7 @@ elsif ( $op eq 'add_validate' ) {
     my $checkPrevCheckout = $input->param('checkprevcheckout');
     my $default_privacy = $input->param('default_privacy');
     my @branches = grep { $_ ne q{} } $input->multi_param('branches');
+    my $canbeguarantee = $input->param('canbeguarantee');
 
     my $is_a_modif = $input->param("is_a_modif");
 
@@ -119,6 +120,7 @@ elsif ( $op eq 'add_validate' ) {
         $category->hidelostitems($hidelostitems);
         $category->overduenoticerequired($overduenoticerequired);
         $category->category_type($category_type);
+        $category->canbeguarantee($canbeguarantee);
         $category->BlockExpiredPatronOpacActions($BlockExpiredPatronOpacActions);
         $category->checkprevcheckout($checkPrevCheckout);
         $category->default_privacy($default_privacy);
@@ -145,6 +147,7 @@ elsif ( $op eq 'add_validate' ) {
             hidelostitems => $hidelostitems,
             overduenoticerequired => $overduenoticerequired,
             category_type => $category_type,
+            canbeguarantee => $canbeguarantee,
             BlockExpiredPatronOpacActions => $BlockExpiredPatronOpacActions,
             checkprevcheckout => $checkPrevCheckout,
             default_privacy => $default_privacy,
diff --git a/installer/data/mysql/atomicupdate/bug_12446-EnableAdultGarantee.sql b/installer/data/mysql/atomicupdate/bug_12446-EnableAdultGarantee.sql
new file mode 100644
index 0000000..56462a7
--- /dev/null
+++ b/installer/data/mysql/atomicupdate/bug_12446-EnableAdultGarantee.sql
@@ -0,0 +1,11 @@
+-- ******** --
+-- SYSPREFS --
+-- ******** --
+INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` )
+VALUES ('AdditionalGuarantorField','',NULL,'Additional fields name to be transfer from guarantor to guarantee.','free');
+
+-- ********* --
+-- STRUCTURE --
+-- ********* --
+ALTER TABLE categories ADD COLUMN `canbeguarantee` tinyint(1) NOT NULL default '0';
+UPDATE categories SET canbeguarantee = 1 WHERE category_type = 'P' OR category_type = 'C';
diff --git a/installer/data/mysql/kohastructure.sql b/installer/data/mysql/kohastructure.sql
index 92b8635..5484aee 100644
--- a/installer/data/mysql/kohastructure.sql
+++ b/installer/data/mysql/kohastructure.sql
@@ -303,8 +303,9 @@ CREATE TABLE `categories` ( -- this table shows information related to Koha patr
   `hidelostitems` tinyint(1) NOT NULL default '0', -- are lost items shown to this category (1 for yes, 0 for no)
   `category_type` varchar(1) NOT NULL default 'A', -- type of Koha patron (Adult, Child, Professional, Organizational, Statistical, Staff)
   `BlockExpiredPatronOpacActions` tinyint(1) NOT NULL default '-1', -- wheither or not a patron of this category can renew books or place holds once their card has expired. 0 means they can, 1 means they cannot, -1 means use syspref BlockExpiredPatronOpacActions
-  `default_privacy` ENUM( 'default', 'never', 'forever' ) NOT NULL DEFAULT 'default', -- Default privacy setting for this patron category
+  `default_privacy` ENUM( 'default', 'never', 'forever' ) NOT NULL DEFAULT 'default', -- Default privacy setting for this patron category,
   `checkprevcheckout` varchar(7) NOT NULL default 'inherit', -- produce a warning for this patron category if this item has previously been checked out to this patron if 'yes', not if 'no', defer to syspref setting if 'inherit'.
+  `canbeguarantee` tinyint(1) NOT NULL default '0'
   PRIMARY KEY  (`categorycode`),
   UNIQUE KEY `categorycode` (`categorycode`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
diff --git a/installer/data/mysql/sysprefs.sql b/installer/data/mysql/sysprefs.sql
index 4a62a26..fea9774 100644
--- a/installer/data/mysql/sysprefs.sql
+++ b/installer/data/mysql/sysprefs.sql
@@ -6,7 +6,9 @@ INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `
 ('AcquisitionDetails', '1', '', 'Hide/Show acquisition details on the biblio detail page.', 'YesNo'),
 ('AcqViewBaskets','user','user|branch|all','Define which baskets a user is allowed to view: his own only, any within his branch or all','Choice'),
 ('AcqWarnOnDuplicateInvoice','0','','Warn librarians when they try to create a duplicate invoice','YesNo'),
-('AddressFormat','us','us|de|fr','Choose format to display postal addresses', 'Choice'),
+('AdditionalGuarantorField','',NULL,'Additional fields name to be transfer from guarantor to guarantee.','free'),
+('AddPatronLists','categorycode','categorycode|category_type','Allow user to choose what list to pick up from when adding patrons','Choice'),
+('AddressFormat','us','','Choose format to display postal addresses', 'Choice'),
 ('advancedMARCeditor','0','','If ON, the MARC editor won\'t display field/subfield descriptions','YesNo'),
 ('AdvancedSearchLanguages','','','ISO 639-2 codes of languages you wish to see appear as an Advanced search option.  Example: eng|fre|ita','Textarea'),
 ('AdvancedSearchTypes','itemtypes','itemtypes|ccode','Select which set of fields comprise the Type limit in the advanced search','Choice'),
diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/member-main-address-style-us.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/member-main-address-style-us.inc
index f76d3fd..2147175 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/includes/member-main-address-style-us.inc
+++ b/koha-tmpl/intranet-tmpl/prog/en/includes/member-main-address-style-us.inc
@@ -8,7 +8,7 @@
       <label for="streetnumber">
       [% END %]
       Street number: </label>
-        <input type="text" id="streetnumber" name="streetnumber" size="5" value="[% patron.streetnumber %]" />
+        <input type="text" id="streetnumber" name="streetnumber" size="5" value="[% streetnumber %]" />
 [% IF ( mandatorystreetnumber ) %]<span class="required">Required</span>[% END %]
     </li>
         [% END %]
@@ -24,7 +24,7 @@
       <select name="streettype">
         <option value=""></option>
         [% FOR roadtype IN roadtypes %]
-          [% IF roadtype.authorised_value == patron.streettype %]
+          [% IF roadtype.authorised_value == streettype %]
             <option value="[% roadtype.authorised_value %]" selected="selected">[% roadtype.lib %]</option>
           [% ELSE %]
             <option value="[% roadtype.authorised_value %]">[% roadtype.lib %]</option>
@@ -43,7 +43,7 @@
       <label for="address">
       [% END %]
       Address: </label>
-            <input type="text" id="address" name="address" size="35" value="[% patron.address %]" />
+            <input type="text" id="address" name="address" size="35" value="[% address %]" />
       [% IF ( mandatoryaddress ) %]<span class="required">Required</span>[% END %]
     </li>
         [% END %]
@@ -55,7 +55,7 @@
       <label for="address2">
       [% END %]
       Address 2: </label>
-            <input type="text" id="address2" name="address2" size="35" value="[% patron.address2 %]" />
+            <input type="text" id="address2" name="address2" size="35" value="[% address2 %]" />
       [% IF ( mandatoryaddress2 ) %]<span class="required">Required</span>[% END %]
     </li>
         [% END %]
@@ -67,12 +67,12 @@
         <label for="city">
       [% END %]
       City: </label>
-        <input type="text" id="city" name="city" size="20" value="[% patron.city %]" />
+        <input type="text" id="city" name="city" size="20" value="[% city %]" />
         [% IF cities.count %]or choose
         <select id="select_city" name="select_city">
             <option value="|||"></option>
             [% FOREACH c IN cities %]
-                [% IF c.city_name == patron.city && c.city_state == patron.state && c.city_zipcode == patron.zipcode %]
+                [% IF c.city_name == city && c.city_state == state && c.city_zipcode == zipcode %]
                 <option value="[% c.city_zipcode %]|[% c.city_name %]|[% c.city_state %]|[% c.city_country %]" selected="selected">
                 [% ELSE %]
                 <option value="[% c.city_zipcode %]|[% c.city_name %]|[% c.city_state %]|[% c.city_country %]">
@@ -93,7 +93,7 @@
         <label for="state">
       [% END %]
       State: </label>
-      <input type="text" name="state" id="state" size="20" value="[% patron.state %]" />
+      <input type="text" name="state" id="state" size="20" value="[% state %]" />
       [% IF ( mandatorystate ) %]<span class="required">Required</span>[% END %]
     </li>
         [% END %]
@@ -105,7 +105,7 @@
         <label for="zipcode">
       [% END %]
       ZIP/Postal code: </label>
-            <input type="text" name="zipcode" id="zipcode" size="10" value="[% patron.zipcode %]" />
+            <input type="text" name="zipcode" id="zipcode" size="10" value="[% zipcode %]" />
       [% IF ( mandatoryzipcode ) %]<span class="required">Required</span>[% END %]
     </li>
         [% END %]
@@ -117,7 +117,7 @@
         <label for="country">
       [% END %]
       Country: </label>
-        <input type="text" name="country" id="country" size="20" value="[% patron.country %]" />
+        <input type="text" name="country" id="country" size="20" value="[% country %]" />
       [% IF ( mandatorycountry ) %]<span class="required">Required</span>[% END %]
     </li>
         [% END %]
diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/members-toolbar.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/members-toolbar.inc
index 1897af7..8c25050 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/includes/members-toolbar.inc
+++ b/koha-tmpl/intranet-tmpl/prog/en/includes/members-toolbar.inc
@@ -16,7 +16,7 @@
 
     [% IF CAN_user_borrowers_edit_borrowers %]
         [% IF patron.is_adult AND Koha.Preference("borrowerRelationship") %]
-            <a id="addchild" class="btn btn-default btn-sm" href="/cgi-bin/koha/members/memberentry.pl?op=add&amp;guarantorid=[% patron.borrowernumber %]"><i class="fa fa-plus"></i> Add child</a>
+            <a id="addchild" class="btn btn-default btn-sm" href="/cgi-bin/koha/members/memberentry.pl?op=add&amp;guarantorid=[% patron.borrowernumber %]"><i class="fa fa-plus"></i> Add guarantee</a>
         [% END %]
         [% IF CAN_user_borrowers_edit_borrowers %]
             <a id="changepassword" class="btn btn-default btn-sm" href="/cgi-bin/koha/members/member-password.pl?member=[% patron.borrowernumber %]"><i class="fa fa-lock"></i> Change password</a>
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/categories.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/categories.tt
index c71e6fb..19495c2 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/categories.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/categories.tt
@@ -150,6 +150,18 @@
                     </select>
                     <span class="required">Required</span>
                 </li>
+                <li>
+                    <label for="canbeguarantee">Can be guarantee</label>
+                    <select name="canbeguarantee" id="canbeguarantee">
+                        [% IF category.canbeguarantee %]
+                            <option value="1" selected>Yes</option>
+                            <option value="0">No</option>
+                        [% ELSE %]
+                            <option value="1">Yes</option>
+                            <option value="0" selected>No</option>
+                        [% END %]
+                    <select>
+                </li>
                 <li><label for="branches">Branches limitation: </label>
                     <select id="branches" name="branches" multiple size="10">
                         <option value="">All branches</option>
@@ -298,6 +310,7 @@
                       </td>
                   </tr>
                 [% END %]
+                <tr><th scope="row">Can be guarantee</th><td>[% IF category.canbeguarantee %]Yes[% ELSE %]No[% END %]</td></tr>
                 <tr>
                     <th scope="row">Default privacy: </th>
                     <td>
@@ -357,6 +370,7 @@
                     [% IF ( Koha.Preference('CheckPrevCheckout') == 'softyes' || Koha.Preference('CheckPrevCheckout') == 'softno' ) %]
                     <th scope="col">Check previous checkout?</th>
                     [% END %]
+                    <th scope="col">Can be guarantee</th>
                     <th scope="col">Default privacy</th>
                     <th scope="col">Actions</th>
                 </tr>
@@ -461,6 +475,7 @@
                               [% END %]
                           </td>
                         [% END %]
+                        <td>[% IF category.canbeguarantee %] Yes [% ELSE %] no [% END %]</td>
                         <td>
                             [% SWITCH category.default_privacy %]
                             [% CASE 'default' %]
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/patrons.pref b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/patrons.pref
index 4adcf1b..46d4d02 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/patrons.pref
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/patrons.pref
@@ -211,6 +211,11 @@ Patrons:
                yes: Allow only superlibrarians
                no: Allow all permitted users
          - "to access/change superlibrarian privileges. Note: A permitted user needs to have the 'permissions' flag (if no superlibrarian)."
+    -
+         - "These additional following <a href='http://schema.koha-community.org/tables/borrowers.html' target='blank'>database columns</a> will be transferred from guarantor to guarantee:"
+         - pref: AdditionalGuarantorField
+           class: multi
+         - (separate columns with |)
 
     "Norwegian patron database":
      -
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/common/patron_search.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/common/patron_search.tt
index a1b4ad8..1369043 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/common/patron_search.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/common/patron_search.tt
@@ -196,7 +196,8 @@
                 e.preventDefault();
                 var borrowernumber = $(this).data("borrowernumber");
                 var borrower_data = $("#borrower_data"+borrowernumber).val();
-                select_user( borrowernumber, JSON.parse(borrower_data) );
+                var guarantor_attributes = $("#guarantor_attributes").val();
+                select_user( borrowernumber, JSON.parse(borrower_data), JSON.parse(guarantor_attributes) );
             });
 
         });
@@ -242,9 +243,9 @@
                 wait_for_opener();
             }
         [% ELSIF selection_type == 'select' %]
-            function select_user(borrowernumber, data) {
+            function select_user(borrowernumber, data, attributes) {
                 var p = window.opener;
-                p.select_user(borrowernumber, data);
+                p.select_user(borrowernumber, data, attributes);
                 window.close();
             }
         [% END %]
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/members/memberentrygen.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/members/memberentrygen.tt
index 35bc823..b279fdb 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/members/memberentrygen.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/members/memberentrygen.tt
@@ -323,7 +323,6 @@
 	            [% END %]
 	        </li>
 [% ELSE %]
- [% IF ( C ) %]
  [% IF ( guarantorid ) %]
  <li id="contact-details">
  [% ELSE %]
@@ -348,9 +347,8 @@
         <input name="contactname" id="contactname" type="text" size="20" value="[% contactname | html %]" />
      [% END %]
  </li>
-        [% END %]
-        [% UNLESS nocontactfirstname %]
- <li>
+     [% UNLESS nocontactfirstname %]
+<li>
      <label for="contactfirstname">First name: </label>
      [% IF ( guarantorid ) %]
      <span>[% contactfirstname %]</span>
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 21f8170..da2e297 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tt
@@ -228,15 +228,22 @@
                                         [% IF guarantees %]
                                             <li>
                                                 <span class="label">Guarantees:</span>
-                                                <ul>
+                                                <table>
                                                     [% FOREACH guarantee IN guarantees %]
+                                                    <tr>
                                                         [% IF logged_in_user.can_see_patron_infos( guarantee ) %]
-                                                            <li><a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=[% guarantee.borrowernumber %]">[% guarantee.firstname | html %] [% guarantee.surname | html %]</a></li>
+                                                            <td><a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=[% guarantee.borrowernumber %]">[% guarantee.firstname | html %] [% guarantee.surname | html %]</a></td>
+                                                            <td style='text-align:right'>[% guarantee.account.balance %]</td>
                                                         [% ELSE %]
-                                                            <li>[% guarantee.firstname | html %] [% guarantee.surname | html %]</li>
+                                                            <td>[% guarantee.firstname | html %] [% guarantee.surname | html %]</td>
                                                         [% END %]
+                                                    </tr>
                                                     [% END %]
-                                                </ul>
+                                                    [% IF logged_in_user.can_see_patron_infos( guarantee ) %]
+                                                       <td>Total</td>
+                                                       <td style='text-align:right'>[% amounttot %]</td>
+                                                    [% END %]
+                                                </table>
                                             </li>
                                         [% ELSIF guarantor %]
                                             <li>
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/members/tables/guarantor_search.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/members/tables/guarantor_search.tt
index f1bb9a1..5817391 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/members/tables/guarantor_search.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/members/tables/guarantor_search.tt
@@ -17,7 +17,7 @@
                 "dt_address":
                     "[% INCLUDE escape_address data=data %]",
                 "dt_action":
-                    "<a href=\"#\" class=\"btn btn-default btn-xs select_user\" data-borrowernumber=\"[% data.borrowernumber %]\">Select</a><input type=\"hidden\" id=\"borrower_data[% data.borrowernumber %]\" name=\"borrower_data[% data.borrowernumber %]\" value=\"[% To.json(data) | html %]\" />"
+                    "<a href=\"#\" class=\"btn btn-mini select_user\" data-borrowernumber=\"[% data.borrowernumber %]\">Select</a><input type=\"hidden\" id=\"borrower_data[% data.borrowernumber %]\" name=\"guarantor_data\" value=\"[% To.json(data) | html %]\" /><input type=\"hidden\" id=\"guarantor_attributes\" name=\"guarantor_attributes\" value=\"[% To.json(attributes) | html %]\" />"
             }[% UNLESS loop.last %],[% END %]
         [% END %]
     ]
diff --git a/koha-tmpl/intranet-tmpl/prog/js/members.js b/koha-tmpl/intranet-tmpl/prog/js/members.js
index e586e60..8e343dc 100644
--- a/koha-tmpl/intranet-tmpl/prog/js/members.js
+++ b/koha-tmpl/intranet-tmpl/prog/js/members.js
@@ -169,7 +169,7 @@ function update_category_code(category_code) {
     $(mytables).find(" li[data-category_code='']").show();
 }
 
-function select_user(borrowernumber, borrower) {
+function select_user(borrowernumber, borrower, attributes) {
     var form = $('#entryform').get(0);
     if (form.guarantorid.value) {
         $("#contact-details, #quick_add_form #contact-details").find('a').remove();
@@ -192,14 +192,13 @@ function select_user(borrowernumber, borrower) {
         .before('<span>' + borrower.firstname + '</span>').get(0).type = 'hidden';
     $("#quick_add_form #contactfirstname").val(borrower.firstname).before('<span>'+borrower.firstname+'</span.').attr({type:"hidden"});
 
-    form.streetnumber.value = borrower.streetnumber;
-    form.address.value = borrower.address;
-    form.address2.value = borrower.address2;
-    form.city.value = borrower.city;
-    form.state.value = borrower.state;
-    form.zipcode.value = borrower.zipcode;
-    form.country.value = borrower.country;
-    form.branchcode.value = borrower.branchcode;
+    form.guarantorsearch.value = LABEL_CHANGE;
+    for (var i = 0; i < parseInt(attributes.length, 10); i++) {
+        var attribute = attributes[i];
+        if (borrower[attribute] != null){
+            document.forms.entryform[attribute].value = borrower[attribute];
+        }
+    }
 
     $("#quick_add_form #streetnumber").val(borrower.streetnumber);
     $("#quick_add_form #address").val(borrower.address);
@@ -210,9 +209,6 @@ function select_user(borrowernumber, borrower) {
     $("#quick_add_form #country").val(borrower.country);
     $("#quick_add_form select[name='branchcode']").val(borrower.branchcode);
 
-    form.guarantorsearch.value = LABEL_CHANGE;
-    $("#quick_add_form #guarantorsearch").val(LABEL_CHANGE);
-
     return 0;
 }
 
diff --git a/members/memberentry.pl b/members/memberentry.pl
index 3618c4f..c4b9577 100755
--- a/members/memberentry.pl
+++ b/members/memberentry.pl
@@ -259,13 +259,12 @@ if ( $guarantorid ) {
         $newdata{'contactfirstname'}= $guarantordata->{'firstname'};
         $newdata{'contactname'}     = $guarantordata->{'surname'};
         $newdata{'contacttitle'}    = $guarantordata->{'title'};
+
         if ( $op eq 'add' ) {
-	        foreach (qw(streetnumber address streettype address2
-                        zipcode country city state phone phonepro mobile fax email emailpro branchcode
-                        B_streetnumber B_streettype B_address B_address2
-                        B_city B_state B_zipcode B_country B_email B_phone)) {
-		        $newdata{$_} = $guarantordata->{$_};
-	        }
+            my @attributes = @{C4::Members::Attributes::get_guarantor_shared_attributes()};
+            foreach my $attribute (@attributes) {
+                $newdata{$attribute} = $guarantordata->{$attribute};
+            }
         }
     }
 }
@@ -770,7 +769,9 @@ if (C4::Context->preference('EnhancedMessagingPreferences')) {
     $template->param(TalkingTechItivaPhone => C4::Context->preference("TalkingTechItivaPhoneNotification"));
 }
 
-$template->param( "showguarantor"  => ($category_type=~/A|I|S|X/) ? 0 : 1); # associate with step to know where you are
+$template->param( "showguarantor"  => $categorycode ? Koha::Patron::Categories->find($categorycode)->canbeguarantee : 1); # associate with step to know where you are
+
+$template->param( "guarantor_attributes" => C4::Members::Attributes::get_guarantor_shared_attributes() );
 $debug and warn "memberentry step: $step";
 $template->param(%data);
 $template->param( "step_$step"  => 1) if $step;	# associate with step to know where u are
diff --git a/members/moremember.pl b/members/moremember.pl
index dbe9896..0def639 100755
--- a/members/moremember.pl
+++ b/members/moremember.pl
@@ -71,7 +71,7 @@ use Koha::Token;
 use vars qw($debug);
 
 BEGIN {
-	$debug = $ENV{DEBUG} || 0;
+       $debug = $ENV{DEBUG} || 0;
 }
 
 my $dbh = C4::Context->dbh;
@@ -147,7 +147,7 @@ foreach (qw(dateenrolled dateexpiry dateofbirth)) { # FIXME This should be remov
 }
 
 for (qw(gonenoaddress lost borrowernotes)) {
-	 $data->{$_} and $template->param(flagged => 1) and last;
+        $data->{$_} and $template->param(flagged => 1) and last;
 }
 
 if ( $patron->is_debarred ) {
@@ -173,7 +173,6 @@ if ( $patron->is_child ) {
 
 my @relatives;
 if ( my $guarantor = $patron->guarantor ) {
-    $template->param( guarantor => $guarantor );
     push @relatives, $guarantor->borrowernumber;
     push @relatives, $_->borrowernumber for $patron->siblings;
 } elsif ( $patron->contactname || $patron->contactfirstname ) {
@@ -185,13 +184,35 @@ if ( my $guarantor = $patron->guarantor ) {
     );
 } else {
     my @guarantees = $patron->guarantees;
-    $template->param( guarantees => \@guarantees );
     push @relatives, $_->borrowernumber for @guarantees;
 }
 
 my $relatives_issues_count =
   Koha::Database->new()->schema()->resultset('Issue')
   ->count( { borrowernumber => \@relatives } );
+my @guarantees = $patron->guarantees;
+my $count = scalar @guarantees;
+if ( $count ) {
+    $template->param( isguarantee => 1 );
+
+    my @guaranteedata;
+    my $amount;
+    my $totalmount = 0;
+
+    foreach my $guarantee (@guarantees){
+
+        $totalmount += $guarantee->account->balance;
+
+    }
+    $template->param( guarantees => @guarantees);
+    $template->param( amounttot => sprintf("%.2f",$totalmount));
+}
+( $template->param( adultborrower => 1 ) ) if ( $category_type eq 'A' || $category_type eq 'I' );
+
+if (my $guarantor = $patron->guarantor){
+    $template->param(isguarantor => 1);
+    $template->param(guarantor => $guarantor);
+}
 
 my %bor;
 $bor{'borrowernumber'} = $borrowernumber;
diff --git a/svc/members/search b/svc/members/search
index 86c7473..da1d0d8 100755
--- a/svc/members/search
+++ b/svc/members/search
@@ -109,12 +109,14 @@ if ($has_permission) {
     $results->{iTotalDisplayRecords} = scalar( @patrons_with_permission );
 }
 
+my @attributes = C4::Members::Attributes::get_guarantor_shared_attributes();
 $template->param(
     sEcho => $sEcho,
     iTotalRecords => $results->{iTotalRecords},
     iTotalDisplayRecords => $results->{iTotalDisplayRecords},
     aaData => $results->{patrons},
     selection_type => $selection_type,
+    attributes => @attributes
 );
 
 output_with_http_headers $input, $cookie, $template->output, 'json';
-- 
2.7.4