Bug 20691: Add ability to turn feature on and off
authorKyle M Hall <kyle@bywatetsolutions.com>
Wed, 22 May 2019 05:41:24 +0000 (02:41 -0300)
committerMartin Renvoize <martin.renvoize@ptfs-europe.com>
Wed, 11 Sep 2019 07:53:46 +0000 (08:53 +0100)
This patch adds two preferences
1. AllowPatronToSetFinesVisibilityForGuarantor: Allow/Don't allow patrons to choose their own privacy settings for showing the patron's fines to the patron's guarantor
2. AllowStaffToSetFinesVisibilityForGuarantor: Allow/Don't allow staff to set the ability for a patron's fines to be viewed by linked patrons in the OPAC

Also adds a tinyint, non nullable, default to 0 column in borrower and deletedborrower named privacy_guarantor_fines.
1. privacy_guarantor_fines = 0 => don't allow guarantor to see guarantee's fines
2. privacy_guarantor_fines = 1 => allow guarantor to see guarantee's fines

To test:
1) git reset --hard master
2) apply patches (including dependencies)
3) perl installer/data/mysql/updatedatabase.pl
4) dbic
5) restart_all
6) in intranet search for AllowPatronToSetFinesVisibilityForGuarantor and AllowStaffToSetFinesVisibilityForGuarantor preferences
SUCCESS => both preferences should be present
7) search for a patron with guarantor
SUCCESS => in details tab, in "Library use" section you should see a row labeled "Show fines to guarantor"
8) edit
CHECK => in Guarantor information there is no "Show fines to guarantor" select
9) set AllowStaffToSetFinesVisibilityForGuarantor preference to "Allow"
10) return to patron with guarantor and edit
SUCCESS => in Guarantor information section there is a "Show fines to guarantor" select
11) change "Show fines to guarantor" select to "Yes" and save
SUCCESS => Value is saved
12) go to details tab
SUCCESS => in "Library use" section you see a row labeled "Show fines to guarantor" with value "Yes"
13) set OPACPrivacy preference to "Allow"
14) open 2 opacs, one with a patron that has a guarantor and another that hasn't and go to "your privacy" tab.
CHECK => in both opacs you should not see a "Allow your guarantor to view your current fines?" select
15) in intranet set AllowPatronToSetFinesVisibilityForGuarantor to "Allow"
16) refresh both opacs
SUCCESS => in Patron that has guarantor you see a "Allow your guarantor to view your current fines?" select
=> in Patron without guarantor you don't see a "Allow your guarantor to view your current fines?" select
17) in Patron with guarantor change value of select and save
SUCCESS => Value is saved
18) in intranet set OPACPrivacy preference to "Don't allow" and AllowPatronToSetFinesVisibilityForGuarantor to "Don't allow"
19) got to "your personal details" in both opacs
CHECK => in both opacs you should not see no Privacy section with a "Allow your guarantor to view your current fines?" select
20) in intranet set AllowPatronToSetFinesVisibilityForGuarantor to "Allow"
21) refresh both opacs
SUCCESS => in Patron that has guarantor you see a "Allow your guarantor to view your current fines?" select in a Privacy section
        => in Patron without guarantor there is no Privacy section
22) in Patron with guarantor change value of select and update
SUCCESS => Value is saved
23) Sign off

Signed-off-by: Agustin Moyano <agustinmoyano@theke.io>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>

12 files changed:
Koha/Schema/Result/Borrower.pm
Koha/Schema/Result/Deletedborrower.pm
api/v1/swagger/definitions/patron.json
koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/opac.pref
koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/patrons.pref
koha-tmpl/intranet-tmpl/prog/en/modules/members/memberentrygen.tt
koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tt
koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-memberentry.tt
koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-privacy.tt
opac/opac-memberentry.pl
opac/opac-privacy.pl
opac/svc/patron/show_fines_to_relatives [new file with mode: 0644]

index 8693d15..335da4c 100644 (file)
@@ -402,6 +402,12 @@ __PACKAGE__->table("borrowers");
   default_value: 1
   is_nullable: 0
 
+=head2 privacy_guarantor_fines
+
+  data_type: 'tinyint'
+  default_value: 0
+  is_nullable: 0
+
 =head2 privacy_guarantor_checkouts
 
   data_type: 'tinyint'
@@ -619,6 +625,8 @@ __PACKAGE__->add_columns(
   { data_type => "integer", is_foreign_key => 1, is_nullable => 1 },
   "privacy",
   { data_type => "integer", default_value => 1, is_nullable => 0 },
+  "privacy_guarantor_fines",
+  { data_type => "tinyint", default_value => 0, is_nullable => 0 },
   "privacy_guarantor_checkouts",
   { data_type => "tinyint", default_value => 0, is_nullable => 0 },
   "checkprevcheckout",
@@ -1552,8 +1560,8 @@ Composing rels: L</aqorder_users> -> ordernumber
 __PACKAGE__->many_to_many("ordernumbers", "aqorder_users", "ordernumber");
 
 
-# Created by DBIx::Class::Schema::Loader v0.07046 @ 2019-05-17 12:11:31
-# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:rb0wEXHaSvYum10aZjbAOA
+# Created by DBIx::Class::Schema::Loader v0.07046 @ 2019-05-22 04:33:29
+# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:lbMdmIHlRt+zayG5+Rq4/w
 
 __PACKAGE__->add_columns(
     '+anonymized' => { is_boolean => 1 },
index c03c406..df8877f 100644 (file)
@@ -399,6 +399,12 @@ __PACKAGE__->table("deletedborrowers");
   default_value: 1
   is_nullable: 0
 
+=head2 privacy_guarantor_fines
+
+  data_type: 'tinyint'
+  default_value: 0
+  is_nullable: 0
+
 =head2 privacy_guarantor_checkouts
 
   data_type: 'tinyint'
@@ -604,6 +610,8 @@ __PACKAGE__->add_columns(
   { data_type => "integer", is_nullable => 1 },
   "privacy",
   { data_type => "integer", default_value => 1, is_nullable => 0 },
+  "privacy_guarantor_fines",
+  { data_type => "tinyint", default_value => 0, is_nullable => 0 },
   "privacy_guarantor_checkouts",
   { data_type => "tinyint", default_value => 0, is_nullable => 0 },
   "checkprevcheckout",
@@ -642,8 +650,8 @@ __PACKAGE__->add_columns(
 );
 
 
-# Created by DBIx::Class::Schema::Loader v0.07046 @ 2019-05-17 12:11:31
-# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:STNFbPgDGWmyrZUFj/n+MA
+# Created by DBIx::Class::Schema::Loader v0.07046 @ 2019-05-22 04:33:29
+# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:zK1jC6Wawwj8B2ch9KFByw
 
 
 # You can replace this text with custom code or comments, and it will be preserved on regeneration
index 10675ac..8093395 100644 (file)
       "type": "integer",
       "description": "controls if relatives can see this patron's checkouts"
     },
+    "privacy_guarantor_fines": {
+      "type": "integer",
+      "description": "controls if relatives can see this patron's fines"
+    },
     "check_previous_checkout": {
       "type": "string",
       "description": "produce a warning for this patron if this item has previously been checked out to this patron if 'yes', not if 'no', defer to category setting if 'inherit'"
index 567e622..a078939 100644 (file)
@@ -707,6 +707,13 @@ OPAC:
                   no: "Don't allow"
             - patrons to choose their own privacy settings for showing the patron's checkouts to the patron's guarantor".
         -
+            - pref: AllowPatronToSetFinesVisibilityForGuarantor
+              default: 0
+              choices:
+                  yes: Allow
+                  no: "Don't allow"
+            - patrons to choose their own privacy settings for showing the patron's fines to the patron's guarantor".
+        -
             - Use borrowernumber
             - pref: AnonymousPatron
               class: integer
index 9007da9..14f1ef9 100644 (file)
@@ -185,6 +185,12 @@ Patrons:
                no: "Don't allow"
          - staff to set the ability for a patron's checkouts to be viewed by linked patrons in the OPAC.
      -
+         - pref: AllowStaffToSetFinesVisibilityForGuarantor
+           choices:
+               yes: Allow
+               no: "Don't allow"
+         - staff to set the ability for a patron's fines to be viewed by linked patrons in the OPAC.
+     -
          - Card numbers for patrons must be
          - pref: CardnumberLength
          - "characters long. The length can be a single number to specify an exact length, a range separated by a comma (i.e., 'Min,Max'), or a maximum with no minimum (i.e., ',Max')."
index 1093da2..19c4b5f 100644 (file)
                         <div class="hint">Allow guarantors of this patron to view this patron's checkouts from the OPAC</div>
                     </li>
                 [% END %]
+                [% IF relationships && Koha.Preference('AllowStaffToSetFinesVisibilityForGuarantor') %]
+                    <li>
+                        <label for="privacy_guarantor_fines">Show fines to guarantors</label>
+                        <select name="privacy_guarantor_fines" id="privacy_guarantor_fines">
+                            [% IF privacy_guarantor_fines %]
+                                <option value="0">No</option>
+                                <option value="1" selected>Yes</option>
+                            [% ELSE %]
+                                <option value="0" selected>No</option>
+                                <option value="1">Yes</option>
+                            [% END %]
+                        </select>
+                        <div class="hint">Allow guarantors of this patron to view this patron's fines from the OPAC</div>
+                    </li>
+                [% END %]
             </ol>
     </fieldset>
 [% END %]
index 95ad755..4a046b6 100644 (file)
 
                                         <li id="patron-privacyguarantor">
                                             <span class="label">Show checkouts to guarantor</span>
-                                            [% IF privacy_guarantor_checkouts %]
+                                            [% IF patron.privacy_guarantor_checkouts %]
+                                                Yes
+                                            [% ELSE %]
+                                                No
+                                            [% END %]
+                                        </li>
+
+                                        <li>
+                                            <span class="label">Show fines to guarantor</span>
+                                            [% IF patron.privacy_guarantor_fines %]
                                                 Yes
                                             [% ELSE %]
                                                 No
index 90a1d3f..9d23d27 100644 (file)
                     <div class="alert">You typed in the wrong characters in the box before submitting. Please try again.</div>
                 [% END %]
 
-                [% IF patron.guarantor_relationships && !Koha.Preference('OPACPrivacy') && Koha.Preference('AllowPatronToSetCheckoutsVisibilityForGuarantor') %]
+                [% IF has_guarantor_flag && !Koha.Preference('OPACPrivacy') && ( Koha.Preference('AllowPatronToSetCheckoutsVisibilityForGuarantor') || Koha.Preference('AllowPatronToSetFinesVisibilityForGuarantor') ) %]
                     <fieldset class="rows" id="memberentry_privacy">
                         <legend id="privacy_legend">Privacy</legend>
                         <ol>
+                            [% IF Koha.Preference('AllowPatronToSetCheckoutsVisibilityForGuarantor') %]
                             <li>
                                 <label>Allow your guarantor to view your current checkouts?</label>
                                 <select id="privacy_guarantor_checkouts">
                                     <a id="update_privacy_guarantor_checkouts" href="#" class="btn">Update</a>
                                     <span id="update_privacy_guarantor_checkouts_message" class="alert" style="display:none"></span>
                                 </span>
+                            </li>
+                            [% END %]
+
+                            [% IF Koha.Preference('AllowPatronToSetFinesVisibilityForGuarantor') %]
+                            <li>
+                                <label>Allow your guarantor to view your current fines?</label>
+                                <select id="privacy_guarantor_fines">
+                                    <option value="0">No</option>
+                                    [% IF borrower.privacy_guarantor_fines %]
+                                        <option value="1" selected="selected">Yes</option>
+                                    [% ELSE %]
+                                        <option value="1">Yes</option>
+                                    [% END %]
+                                </select>
+                                <span class="hint">
+                                    <a id="update_privacy_guarantor_fines" href="#" class="btn">Update</a>
+                                    <span id="update_privacy_guarantor_fines_message" class="alert" style="display:none"></span>
+                                </span>
+                            </li>
+                            [% END %]
+
+                            <li>
                                 <span class="hint">
                                     Guaranteed by
                                     [% FOREACH gr IN patron.guarantor_relationships %]
                 }
             });
 
-            [% IF patron.guarantor_relationships && !Koha.Preference('OPACPrivacy') && Koha.Preference('AllowPatronToSetCheckoutsVisibilityForGuarantor') %]
-                $('#update_privacy_guarantor_checkouts').click( function() {
-                    $.post( "/cgi-bin/koha/svc/patron/show_checkouts_to_relatives", { privacy_guarantor_checkouts: $('#privacy_guarantor_checkouts').val() }, null, 'json')
-                     .done(function( data ) {
-                         var message;
-                         if ( data.success ) {
-                             message = _("Your setting has been updated!");
-                         } else {
-                             message = _("Unable to update your setting!");
-                         }
-
-                         $('#update_privacy_guarantor_checkouts_message').fadeIn("slow").text( message ).delay( 5000 ).fadeOut("slow");
-                     });
-                });
+            [% IF patron.guarantor_relationships && !Koha.Preference('OPACPrivacy') %]
+
+                [% IF Koha.Preference('AllowPatronToSetCheckoutsVisibilityForGuarantor') %]
+                    $('#update_privacy_guarantor_checkouts').click( function() {
+                        $.post( "/cgi-bin/koha/svc/patron/show_checkouts_to_relatives", { privacy_guarantor_checkouts: $('#privacy_guarantor_checkouts').val() }, null, 'json')
+                         .done(function( data ) {
+                            var message;
+                            if ( data.success ) {
+                                message = _("Your setting has been updated!");
+                            } else {
+                                message = _("Unable to update your setting!");
+                            }
+
+                            $('#update_privacy_guarantor_checkouts_message').fadeIn("slow").text( message ).delay( 5000 ).fadeOut("slow");
+                        });
+                    });
+                [% END %]
+
+                [% IF Koha.Preference('AllowPatronToSetFinesVisibilityForGuarantor') %]
+                    $('#update_privacy_guarantor_fines').click( function() {
+                        $.post( "/cgi-bin/koha/svc/patron/show_fines_to_relatives", { privacy_guarantor_fines: $('#privacy_guarantor_fines').val() }, null, 'json')
+                         .done(function( data ) {
+                            var message;
+                            if ( data.success ) {
+                                message = _("Your setting has been updated!");
+                            } else {
+                                message = _("Unable to update your setting!");
+                            }
+
+                            $('#update_privacy_guarantor_fines_message').fadeIn("slow").text( message ).delay( 5000 ).fadeOut("slow");
+                        });
+                    });
+                [% END %]
             [% END %]
 
             $(".patron-attributes").on( 'click', '.clear-attribute', function() {
index 6583b7c..789a237 100644 (file)
                                         </select>
                                     </div>
 
-                                    [% IF borrower.guarantor_relationships && Koha.Preference('AllowPatronToSetCheckoutsVisibilityForGuarantor') %]
+                                    [% IF has_guarantor_flag && (Koha.Preference('AllowPatronToSetCheckoutsVisibilityForGuarantor') || Koha.Preference('AllowPatronToSetFinesVisibilityForGuarantor') ) %]
                                         <div>
-                                            <label for="privacy_guarantor_checkouts">Allow your guarantor to view your current checkouts?</label>
-                                            <select name="privacy_guarantor_checkouts">
-                                                [% IF borrower.privacy_guarantor_checkouts %]
-                                                    <option value="0">No</option>
-                                                    <option value="1" selected>Yes</option>
-                                                [% ELSE %]
-                                                    <option value="0" selected>No</option>
-                                                    <option value="1">Yes</option>
-                                                [% END %]
-                                            </select>
+                                            [% IF Koha.Preference('AllowPatronToSetCheckoutsVisibilityForGuarantor') %]
+                                                <label for="privacy_guarantor_checkouts">Allow your guarantor to view your current checkouts?</label>
+                                                <select name="privacy_guarantor_checkouts">
+                                                    [% IF borrower.privacy_guarantor_checkouts %]
+                                                        <option value="0">No</option>
+                                                        <option value="1" selected>Yes</option>
+                                                    [% ELSE %]
+                                                        <option value="0" selected>No</option>
+                                                        <option value="1">Yes</option>
+                                                    [% END %]
+                                                </select>
+                                            [% END %]
+                                            [% IF Koha.Preference('AllowPatronToSetFinesVisibilityForGuarantor') %]
+                                                <label for="privacy_guarantor_fines">Allow your guarantor to view your current fines?</label>
+                                                <select name="privacy_guarantor_fines">
+                                                    [% IF borrower.privacy_guarantor_fines %]
+                                                        <option value="0">No</option>
+                                                        <option value="1" selected>Yes</option>
+                                                    [% ELSE %]
+                                                        <option value="0" selected>No</option>
+                                                        <option value="1">Yes</option>
+                                                    [% END %]
+                                                </select>
+                                            [% END %]
                                             <span class="hint">
                                                 Guaranteed by
                                                 [% FOREACH gr IN borrower.guarantor_relationships %]
index 7f5eecb..1874116 100755 (executable)
@@ -329,11 +329,13 @@ elsif ( $action eq 'edit' ) {    #Display logged in borrower's data
 }
 
 my $captcha = random_string("CCCCC");
+my $patron_param = scalar Koha::Patrons->find( $borrowernumber );
 
 $template->param(
     captcha        => $captcha,
     captcha_digest => md5_base64($captcha),
-    patron         => scalar Koha::Patrons->find( $borrowernumber ),
+    patron         => $patron_param,
+    has_guarantor_flag => $patron_param->guarantor_relationships->guarantors->_resultset->count
 );
 
 output_html_with_http_headers $cgi, $cookie, $template->output, undef, { force_no_caching => 1 };
index a6f0e6d..7d7f445 100755 (executable)
@@ -47,13 +47,15 @@ my ( $template, $borrowernumber, $cookie ) = get_template_and_user(
 my $op                         = $query->param("op");
 my $privacy                    = $query->param("privacy");
 my $privacy_guarantor_checkouts = $query->param("privacy_guarantor_checkouts");
+my $privacy_guarantor_fines     = $query->param("privacy_guarantor_fines");
 
 if ( $op eq "update_privacy" ) {
     my $patron = Koha::Patrons->find( $borrowernumber );
     if ( $patron ) {
         $patron->set({
             privacy                    => $privacy,
-            privacy_guarantor_checkouts => $privacy_guarantor_checkouts,
+            privacy_guarantor_checkouts => defined $privacy_guarantor_checkouts?$privacy_guarantor_checkouts:$patron->privacy_guarantor_checkouts,
+            privacy_guarantor_fines     => defined $privacy_guarantor_fines?$privacy_guarantor_fines:$patron->privacy_guarantor_fines,
         })->store;
         $template->param( 'privacy_updated' => 1 );
     }
@@ -83,6 +85,7 @@ $template->param(
     'borrower'                       => $borrower,
     'surname'                        => $borrower->surname,
     'firstname'                      => $borrower->firstname,
+    'has_guarantor_flag'             => $borrower->guarantor_relationships->guarantors->_resultset->count
 );
 
 output_html_with_http_headers $query, $cookie, $template->output, undef, { force_no_caching => 1 };
diff --git a/opac/svc/patron/show_fines_to_relatives b/opac/svc/patron/show_fines_to_relatives
new file mode 100644 (file)
index 0000000..223e5b9
--- /dev/null
@@ -0,0 +1,59 @@
+#!/usr/bin/perl
+
+# Copyright 2014 ByWater Solutions
+#
+# This file is part of Koha.
+#
+# Koha is free software; you can redistribute it and/or modify it under the
+# terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 3 of the License, or (at your option) any later
+# version.
+#
+# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with Koha; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+use Modern::Perl;
+
+use CGI;
+use JSON qw( to_json );
+
+use C4::Auth;
+use C4::Context;
+
+use Koha::Patrons;
+
+my $cgi = CGI->new();
+
+my $privacy_guarantor_fines = $cgi->param('privacy_guarantor_fines');
+
+my ( $userid, $cookie, $sessionID, $flags ) = checkauth( $cgi, 1, {}, 'opac' );
+
+my $borrowernumber = C4::Context->userenv ? C4::Context->userenv->{number} : undef;
+
+my $success = 0;
+if ( $borrowernumber && defined($privacy_guarantor_fines) ) {
+    my $patron = Koha::Patrons->find($borrowernumber);
+
+    if ( $patron ) {
+        $patron->privacy_guarantor_fines($privacy_guarantor_fines);
+        $success = $patron->store();
+    }
+}
+
+binmode STDOUT, ":encoding(UTF-8)";
+print $cgi->header(
+    -type    => 'application/json',
+    -charset => 'UTF-8'
+);
+
+print to_json(
+    {
+        success => $success ? 1 : 0,
+        privacy_guarantor_fines => $privacy_guarantor_fines,
+    }
+);