Bug 12446: Ability to allow guarantor relationship for all patron category types

This adds a new field "Can be guarantee" to patron categories so it
becomes possible for any category type to have a guarantor.

To test:
1) Have a patron category of type 'Adult' and one of type 'Child'
2) Confirm, by searching for the "Patron guarantor" fieldset in the
edit/create form, that:
    => a patron of the first category can't have a guarantor
    => a patron from the second category can
3) Apply patch and run updatedatabase.pl
4) Edit the categories and note the new "Can be guarantee" field
5) It should have been set to "yes" for the "Child" and to "no" for
the "Adult"
5) Repeat step 2. It should behave in the same way.
6) Edit the "Can be guarantee" for any of the category and check
that the fieldset only appears when "Can be guarantee" is set to "yes"
7) prove t/db_dependent/Patrons.t
    => tests should still pass

Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Owen Leonard <oleonard@myacpl.org>
Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
This commit is contained in:
Maryse Simard 2020-10-02 00:02:38 -04:00 committed by Tomas Cohen Arazi
parent 7f60d88797
commit b8f1b0e73d
No known key found for this signature in database
GPG Key ID: 0A272EA1B2F3C15F
8 changed files with 41 additions and 7 deletions

View File

@ -307,8 +307,7 @@ sub store {
# Clean up guarantors on category change if required
$self->guarantor_relationships->delete
if ( $self->category->category_type ne 'C'
&& $self->category->category_type ne 'P' );
unless ( $self->category->canbeguarantee );
}

View File

@ -80,6 +80,7 @@ elsif ( $op eq 'add_validate' ) {
my $min_password_length = $input->param('min_password_length');
my $require_strong_password = $input->param('require_strong_password');
my @branches = grep { $_ ne q{} } $input->multi_param('branches');
my $canbeguarantee = $input->param('canbeguarantee');
$reset_password = undef if $reset_password eq -1;
$change_password = undef if $change_password eq -1;
@ -112,6 +113,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);
@ -144,6 +146,7 @@ elsif ( $op eq 'add_validate' ) {
hidelostitems => $hidelostitems,
overduenoticerequired => $overduenoticerequired,
category_type => $category_type,
canbeguarantee => $canbeguarantee,
BlockExpiredPatronOpacActions => $BlockExpiredPatronOpacActions,
checkprevcheckout => $checkPrevCheckout,
default_privacy => $default_privacy,

View File

@ -0,0 +1,10 @@
$DBversion = 'XXX'; # will be replaced by the RM
if( CheckVersion( $DBversion ) ) {
if ( !column_exists( 'categories', 'canbeguarantee') ){
$dbh->do("ALTER TABLE categories ADD COLUMN `canbeguarantee` tinyint(1) NOT NULL default '0' AFTER `checkprevcheckout`");
$dbh->do("UPDATE categories SET canbeguarantee = 1 WHERE category_type = 'P' OR category_type = 'C'");
}
SetVersion( $DBversion );
print "Upgrade to $DBversion done (Bug 12446 - Ability to allow guarantor relationship for all patron category types)\n";
}

View File

@ -1664,7 +1664,8 @@ CREATE TABLE `categories` (
`BlockExpiredPatronOpacActions` tinyint(1) NOT NULL DEFAULT -1 COMMENT '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') COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'default' COMMENT 'Default privacy setting for this patron category',
`checkprevcheckout` varchar(7) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'inherit' COMMENT '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''.',
`reset_password` tinyint(1) DEFAULT NULL COMMENT 'if patrons of this category can do the password reset flow,',
`canbeguarantee` tinyint(1) NOT NULL default '0',
`reset_password` tinyint(1) DEFAULT NULL COMMENT 'if patrons of this category can do the password reset flow,',
`change_password` tinyint(1) DEFAULT NULL COMMENT 'if patrons of this category can change their passwords in the OAPC',
`min_password_length` smallint(6) DEFAULT NULL COMMENT 'set minimum password length for patrons in this category',
`require_strong_password` tinyint(1) DEFAULT NULL COMMENT 'set required password strength for patrons in this category',

View File

@ -11,7 +11,7 @@
[% IF CAN_user_borrowers_edit_borrowers %]
[% IF patron.is_adult AND Koha.Preference("borrowerRelationship") %]
<a id="addchild" class="btn btn-default" href="/cgi-bin/koha/members/memberentry.pl?op=add&amp;guarantor_id=[% patron.borrowernumber | html %]&amp;category_type=C"><i class="fa fa-plus"></i> Add guarantee</a>
<a id="addchild" class="btn btn-default" href="/cgi-bin/koha/members/memberentry.pl?op=add&amp;guarantor_id=[% patron.borrowernumber | html %]"><i class="fa fa-plus"></i> Add guarantee</a>
[% END %]
<a id="changepassword" class="btn btn-default" href="/cgi-bin/koha/members/member-password.pl?member=[% patron.borrowernumber | html %]"><i class="fa fa-lock"></i> Change password</a>
<a id="duplicate" class="btn btn-default" href="/cgi-bin/koha/members/memberentry.pl?op=duplicate&amp;borrowernumber=[% patron.borrowernumber | html %]"><i class="fa fa-copy"></i> Duplicate</a>

View File

@ -219,6 +219,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">Library limitations: </label>
<select id="branches" name="branches" multiple size="10">
<option value="">All libraries</option>
@ -478,6 +490,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>
@ -538,6 +551,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">Exclude from local holds priority</th>
<th scope="col">Actions</th>
@ -655,6 +669,7 @@
[% END %]
</td>
[% END %]
<td>[% IF category.canbeguarantee %] Yes [% ELSE %] no [% END %]</td>
<td>
[% SWITCH category.default_privacy %]
[% CASE 'default' %]

View File

@ -819,8 +819,9 @@ if (C4::Context->preference('EnhancedMessagingPreferences')) {
$template->param(TalkingTechItivaPhone => C4::Context->preference("TalkingTechItivaPhoneNotification"));
}
$template->param( "show_guarantor" => ( $category_type =~ /A|I|S|X/ ) ? 0 : 1 ); # associate with step to know where you are
$template->param( borrower_data => \%data );
$template->param( "show_guarantor" => $categorycode ? Koha::Patron::Categories->find($categorycode)->canbeguarantee : 1); # associate with step to know where you are
$debug and warn "memberentry step: $step";
$template->param( "step_$step" => 1) if $step; # associate with step to know where u are
$template->param( step => $step ) if $step; # associate with step to know where u are

View File

@ -106,19 +106,22 @@ foreach my $b ( $patrons->as_list() ) {
}
subtest "Update patron categories" => sub {
plan tests => 24;
plan tests => 26;
t::lib::Mocks::mock_preference( 'borrowerRelationship', 'test' );
my $c_categorycode = $builder->build({ source => 'Category', value => {
category_type=>'C',
upperagelimit=>17,
dateofbirthrequired=>5,
canbeguarantee=>1,
} })->{categorycode};
my $c_categorycode_2 = $builder->build({ source => 'Category', value => {
category_type=>'C',
upperagelimit=>17,
dateofbirthrequired=>5,
canbeguarantee=>1,
} })->{categorycode};
my $a_categorycode = $builder->build({ source => 'Category', value => {category_type=>'A'} })->{categorycode};
my $a_categorycode = $builder->build({ source => 'Category', value => {category_type=>'A', canbeguarantee=>0} })->{categorycode};
my $a_categorycode_2 = $builder->build({ source => 'Category', value => {category_type=>'A', canbeguarantee=>1} })->{categorycode};
my $p_categorycode = $builder->build({ source => 'Category', value => {category_type=>'P'} })->{categorycode};
my $i_categorycode = $builder->build({ source => 'Category', value => {category_type=>'I'} })->{categorycode};
my $branchcode1 = $builder->build({ source => 'Branch' })->{branchcode};
@ -198,6 +201,8 @@ subtest "Update patron categories" => sub {
is( Koha::Patrons->search_patrons_to_update_category({from=>$c_categorycode_2,too_young=>1})->next->borrowernumber, $child1->borrowernumber );
is( Koha::Patrons->search_patrons_to_update_category({from=>$c_categorycode_2,too_young=>1})->update_category_to({category=>$a_categorycode}),1,'One child patron updated to adult category because too young');
is( Koha::Patrons->find($adult1->borrowernumber)->guarantee_relationships->guarantees->count,2,'Guarantee was removed when made adult');
is( Koha::Patrons->search_patrons_to_update_category({from=>$c_categorycode_2})->update_category_to({category=>$a_categorycode_2}),2,'Two child patrons updated to adult category');
is( Koha::Patrons->find($adult1->borrowernumber)->guarantee_relationships->guarantees->count,2,'Guarantees were not removed when made adult which can be guarantee');
is( Koha::Patrons->search_patrons_to_update_category({from=>$c_categorycode_2,too_old=>1})->next->borrowernumber, $child3->borrowernumber );
is( Koha::Patrons->search_patrons_to_update_category({from=>$c_categorycode_2,too_old=>1})->update_category_to({category=>$a_categorycode}),1,'One child patron updated to adult category because too old');