From 15295bb16180a1347bd2c264ad826c02c049ce39 Mon Sep 17 00:00:00 2001 From: mxbeaulieu Date: Mon, 1 Jun 2015 09:10:38 -0400 Subject: [PATCH] bug 12446 - Enable adult patrons to have a guarantor I have rebased every patch. This includes all the features from the previous patches. 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; --- C4/Category.pm | 34 ++ C4/Members/Attributes.pm | 17 +- C4/Utils/DataTables/Members.pm | 22 +- Koha/Schema/Result/Category.pm | 8 + admin/categorie.pl | 423 ++++++++++++++++++ admin/categories.pl | 3 + .../atomicupdate/bug_12446-EnableAdultGarantee.sql | 10 + installer/data/mysql/kohastructure.sql | 3 +- installer/data/mysql/sysprefs.sql | 4 +- .../prog/en/includes/members-toolbar.inc | 2 +- .../prog/en/modules/admin/categorie.tt | 475 +++++++++++++++++++++ .../prog/en/modules/admin/categories.tt | 15 + .../prog/en/modules/admin/preferences/patrons.pref | 5 + .../prog/en/modules/members/memberentrygen.tt | 18 +- .../prog/en/modules/members/moremember.tt | 17 +- members/memberentry.pl | 17 +- members/moremember.pl | 27 +- 17 files changed, 1057 insertions(+), 43 deletions(-) create mode 100755 admin/categorie.pl create mode 100644 installer/data/mysql/atomicupdate/bug_12446-EnableAdultGarantee.sql create mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/admin/categorie.tt diff --git a/C4/Category.pm b/C4/Category.pm index 72ed424..903a7b0 100644 --- a/C4/Category.pm +++ b/C4/Category.pm @@ -94,6 +94,36 @@ sub all { }; } +=head3 C4::Category->get + + $cat = get( $category_code ); + This returns the category as an object. + +=cut + +sub get { + my ( $class, $code ) = @_; + my $branch_limit = C4::Context->userenv ? C4::Context->userenv->{"branch"} : ""; + my $dbh = C4::Context->dbh; + + my ( $query , @params ); + if( $branch_limit ){ + $query = qq| SELECT categories.* FROM categories + LEFT JOIN categories_branches ON categories_branches.categorycode = categories.categorycode + WHERE categories.categorycode = ? AND (categories_branches.branchcode = ? OR categories_branches.branchcode IS NULL) + |; + @params = ( $code, $branch_limit ); + } + else{ + $query = "SELECT categories.* FROM categories WHERE categorycode = ?"; + @params = ( $code ); + } + + my $data = $dbh->selectrow_hashref( $query, undef, @params ); + + return $class->new($data); +} + @@ -149,6 +179,10 @@ These are read-only accessors for attributes of a C4::Category object. =cut +=head3 $category->canbeguarantee + +=cut + sub AUTOLOAD { my $self = shift; my $attr = $AUTOLOAD; diff --git a/C4/Members/Attributes.pm b/C4/Members/Attributes.pm index b25a813..b2b0762 100644 --- a/C4/Members/Attributes.pm +++ b/C4/Members/Attributes.pm @@ -34,7 +34,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 ); } @@ -357,6 +357,21 @@ 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 diff --git a/C4/Utils/DataTables/Members.pm b/C4/Utils/DataTables/Members.pm index 1ebecd7..49fd1fc 100644 --- a/C4/Utils/DataTables/Members.pm +++ b/C4/Utils/DataTables/Members.pm @@ -4,6 +4,7 @@ use Modern::Perl; use C4::Branch qw/onlymine/; use C4::Context; use C4::Members qw/GetMemberIssuesAndFines/; +use C4::Members::Attributes qw/get_guarantor_shared_attributes/; use C4::Utils::DataTables; use Koha::DateUtils; @@ -32,13 +33,20 @@ sub search { } my $dbh = C4::Context->dbh; - 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, + my @columns = qw( borrowernumber surname firstname streetnumber streettype address address2 city state zipcode country cardnumber dateexpiry borrowernotes branchcode email userid dateofbirth categorycode ); + 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 4926587..e5a40a9 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' @@ -154,6 +160,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/categorie.pl b/admin/categorie.pl new file mode 100755 index 0000000..5c4d926 --- /dev/null +++ b/admin/categorie.pl @@ -0,0 +1,423 @@ +#!/usr/bin/perl + +#script to administer the categories table +#written 20/02/2002 by paul.poulain@free.fr + +# ALGO : +# this script use an $op to know what to do. +# if $op is empty or none of the above values, +# - the default screen is build (with all records, or filtered datas). +# - the user can clic on add, modify or delete record. +# if $op=add_form +# - if primkey exists, this is a modification,so we read the $primkey record +# - builds the add/modify form +# if $op=add_validate +# - the user has just send datas, so we create/modify the record +# if $op=delete_form +# - we show the record having primkey=$primkey and ask for deletion validation form +# if $op=delete_confirm +# - we delete the record having primkey=$primkey + +# Copyright 2000-2002 Katipo Communications +# +# 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, see . + +use Modern::Perl; + +use CGI qw ( -utf8 ); +use C4::Context; +use C4::Auth; +use C4::Branch; +use C4::Output; +use C4::Dates; +use C4::Form::MessagingPreferences; +use Koha::Database; + +sub StringSearch { + my ( $searchstring, $type ) = @_; + my $dbh = C4::Context->dbh; + $searchstring //= ''; + $searchstring =~ s/\'/\\\'/g; + my @data = split( ' ', $searchstring ); + push @data, q{} if $#data == -1; + my $count = @data; + my $sth = $dbh->prepare("Select * from categories where (description like ?) order by category_type,description,categorycode"); + $sth->execute("$data[0]%"); + my @results; + + while ( my $data = $sth->fetchrow_hashref ) { + push( @results, $data ); + } + + # $sth->execute; + $sth->finish; + return ( scalar(@results), \@results ); +} + +my $input = new CGI; +my $searchfield = $input->param('description'); +my $script_name = "/cgi-bin/koha/admin/categorie.pl"; +my $categorycode = $input->param('categorycode'); +my $op = $input->param('op') // 'list'; +my $block_expired = $input->param("block_expired"); +my @messages; + +my ( $template, $loggedinuser, $cookie ) = get_template_and_user( + { + template_name => "admin/categorie.tt", + query => $input, + type => "intranet", + authnotrequired => 0, + flagsrequired => { parameters => 'parameters_remaining_permissions' }, + debug => 1, + } +); + +################## ADD_FORM ################################## +# called by default. Used to create form to add or modify a record +if ( $op eq 'add_form' ) { + $template->param( add_form => 1 ); + + #---- if primkey exists, it's a modify action, so read values to modify... + my $data; + my @selected_branches; + if ($categorycode) { + my $dbh = C4::Context->dbh; + my $sth = + $dbh->prepare("SELECT * FROM categories WHERE categorycode=?"); + $sth->execute($categorycode); + $data = $sth->fetchrow_hashref; + + $sth = $dbh->prepare( + "SELECT b.branchcode, b.branchname + FROM categories_branches AS cb, branches AS b + WHERE cb.branchcode = b.branchcode AND cb.categorycode = ? + "); + $sth->execute($categorycode); + while ( my $branch = $sth->fetchrow_hashref ) { + push @selected_branches, $branch; + } + $sth->finish; + } + + if ( $data->{'enrolmentperioddate'} + && $data->{'enrolmentperioddate'} eq '0000-00-00' ) + { + $data->{'enrolmentperioddate'} = undef; + } + + $data->{'category_type'} //= ''; + + my $branches = GetBranches(); + my @branches_loop; + foreach my $branch ( sort keys %$branches ) { + my $selected = + ( grep { $$_{branchcode} eq $branch } @selected_branches ) ? 1 : 0; + push @branches_loop, + { + branchcode => $$branches{$branch}{branchcode}, + branchname => $$branches{$branch}{branchname}, + selected => $selected, + }; + } + + $template->param( + branches_loop => \@branches_loop, + description => $data->{'description'}, + enrolmentperiod => $data->{'enrolmentperiod'}, + enrolmentperioddate => $data->{'enrolmentperioddate'}, + upperagelimit => $data->{'upperagelimit'}, + dateofbirthrequired => $data->{'dateofbirthrequired'}, + enrolmentfee => sprintf( "%.2f", $data->{'enrolmentfee'} || 0 ), + overduenoticerequired => $data->{'overduenoticerequired'}, + issuelimit => $data->{'issuelimit'}, + reservefee => sprintf( "%.2f", $data->{'reservefee'} || 0 ), + hidelostitems => $data->{'hidelostitems'}, + category_type => $data->{'category_type'}, + default_privacy => $data->{'default_privacy'}, + SMSSendDriver => C4::Context->preference("SMSSendDriver"), + "type_" . $data->{'category_type'} => 1, + BlockExpiredPatronOpacActions => + $data->{'BlockExpiredPatronOpacActions'}, + TalkingTechItivaPhone => + C4::Context->preference("TalkingTechItivaPhoneNotification"), + canbeguarantee => $data->{'canbeguarantee'}, + ); + + if ( C4::Context->preference('EnhancedMessagingPreferences') ) { + C4::Form::MessagingPreferences::set_form_values( + { categorycode => $categorycode }, $template ); + } + + # END $OP eq ADD_FORM +################## ADD_VALIDATE ################################## + # called by add_form, used to insert/modify data in DB +} +elsif ( $op eq 'add_validate' ) { + + my $is_a_modif = $input->param("is_a_modif"); + + my $dbh = C4::Context->dbh; + + if ( $input->param('enrolmentperioddate') ) { + $input->param( + 'enrolmentperioddate' => C4::Dates::format_date_in_iso( + $input->param('enrolmentperioddate') + ) + ); + } + if ($is_a_modif) { + my $sth = $dbh->prepare( " + UPDATE categories + SET description=?, + enrolmentperiod=?, + enrolmentperioddate=?, + upperagelimit=?, + dateofbirthrequired=?, + enrolmentfee=?, + reservefee=?, + hidelostitems=?, + overduenoticerequired=?, + category_type=?, + BlockExpiredPatronOpacActions=?, + default_privacy=?, + canbeguarantee=? + WHERE categorycode=?" + ); + $sth->execute( + map { $input->param($_) } ( + 'description', 'enrolmentperiod', + 'enrolmentperioddate', 'upperagelimit', + 'dateofbirthrequired', 'enrolmentfee', + 'reservefee', 'hidelostitems', + 'overduenoticerequired', 'category_type', + 'block_expired', 'default_privacy', + 'canbeguarantee', 'categorycode' + ) + ); + $sth->finish; + } + else { + my $sth = $dbh->prepare( " + INSERT INTO categories ( + categorycode, + description, + enrolmentperiod, + enrolmentperioddate, + upperagelimit, + dateofbirthrequired, + enrolmentfee, + reservefee, + hidelostitems, + overduenoticerequired, + category_type, + BlockExpiredPatronOpacActions, + default_privacy, + canbeguarantee + ) + VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)" ); + my $inserted = $sth->execute( + map { $input->param($_) } ( + 'categorycode', 'description', + 'enrolmentperiod', 'enrolmentperioddate', + 'upperagelimit', 'dateofbirthrequired', + 'enrolmentfee', 'reservefee', + 'hidelostitems', 'overduenoticerequired', + 'category_type', 'block_expired', + 'default_privacy', 'canbeguarantee' + ) + ); + if ( $inserted ) { + push @messages, { type => 'message', code => 'success_on_insert' }; + } else { + push @messages, { type => 'error', code => 'error_on_insert' }; + } + } + + my @branches = $input->param("branches"); + if (@branches) { + my $sth = $dbh->prepare( + "DELETE FROM categories_branches WHERE categorycode = ?" + ); + $sth->execute( $input->param("categorycode") ); + $sth = $dbh->prepare( + "INSERT INTO categories_branches ( categorycode, branchcode ) VALUES ( ?, ? )" + ); + for my $branchcode (@branches) { + next if not $branchcode; + $sth->bind_param( 1, $input->param("categorycode") ); + $sth->bind_param( 2, $branchcode ); + $sth->execute; + } + } + + if ( C4::Context->preference('EnhancedMessagingPreferences') ) { + C4::Form::MessagingPreferences::handle_form_action( $input, + { categorycode => $input->param('categorycode') }, $template ); + } + + $searchfield = q||; + $op = 'list'; + + # END $OP eq ADD_VALIDATE +################## DELETE_CONFIRM ################################## + # called by default form, used to confirm deletion of data in DB +} +elsif ( $op eq 'delete_confirm' ) { + my $schema = Koha::Database->new()->schema(); + $template->param( delete_confirm => 1 ); + + my $count = + $schema->resultset('Borrower') + ->search( { categorycode => $categorycode } )->count(); + + my $category = $schema->resultset('Category')->find($categorycode); + + $category->enrolmentperioddate( + C4::Dates::format_date( $category->enrolmentperioddate() ) ); + + $template->param( category => $category, patrons_in_category => $count ); + + # END $OP eq DELETE_CONFIRM +################## DELETE_CONFIRMED ################################## + # called by delete_confirm, used to effectively confirm deletion of data in DB +} +elsif ( $op eq 'delete_confirmed' ) { + $template->param( delete_confirmed => 1 ); + my $dbh = C4::Context->dbh; + + my $categorycode = uc( $input->param('categorycode') ); + + my $sth = $dbh->prepare("delete from categories where categorycode=?"); + + my $deleted = $sth->execute($categorycode); + + if ( $deleted ) { + push @messages, { type => 'message', code => 'success_on_delete' }; + } else { + push @messages, { type => 'error', code => 'error_on_delete' }; + } + + $op = 'list'; + + # END $OP eq DELETE_CONFIRMED +} + +if ( $op eq 'list' ) { + $template->param( else => 1 ); + my @loop; + my ( $count, $results ) = StringSearch( $searchfield, 'web' ); + + my $dbh = C4::Context->dbh; + my $sth = $dbh->prepare(" + SELECT b.branchcode, b.branchname + FROM categories_branches AS cb, branches AS b + WHERE cb.branchcode = b.branchcode AND cb.categorycode = ? + "); + + for ( my $i = 0 ; $i < $count ; $i++ ) { + $sth->execute( $results->[$i]{'categorycode'} ); + + my @selected_branches; + while ( my $branch = $sth->fetchrow_hashref ) { + push @selected_branches, $branch; + } + + my $enrolmentperioddate = $results->[$i]{'enrolmentperioddate'}; + if ( $enrolmentperioddate && $enrolmentperioddate eq '0000-00-00' ) { + $enrolmentperioddate = undef; + } + + $results->[$i]{'category_type'} //= ''; + my %row = ( + branches => \@selected_branches, + categorycode => $results->[$i]{'categorycode'}, + description => $results->[$i]{'description'}, + enrolmentperiod => $results->[$i]{'enrolmentperiod'}, + enrolmentperioddate => $enrolmentperioddate, + upperagelimit => $results->[$i]{'upperagelimit'}, + dateofbirthrequired => $results->[$i]{'dateofbirthrequired'}, + overduenoticerequired => $results->[$i]{'overduenoticerequired'}, + issuelimit => $results->[$i]{'issuelimit'}, + hidelostitems => $results->[$i]{'hidelostitems'}, + category_type => $results->[$i]{'category_type'}, + default_privacy => $results->[$i]{'default_privacy'}, + canbeguarantee => $results->[$i]{'canbeguarantee'}, + reservefee => sprintf( "%.2f", $results->[$i]{'reservefee'} || 0 ), + enrolmentfee => + sprintf( "%.2f", $results->[$i]{'enrolmentfee'} || 0 ), + "type_" . $results->[$i]{'category_type'} => 1, + ); + + if ( C4::Context->preference('EnhancedMessagingPreferences') ) { + my $brief_prefs = + _get_brief_messaging_prefs( $results->[$i]{'categorycode'} ); + $row{messaging_prefs} = $brief_prefs if @$brief_prefs; + } + push @loop, \%row; + } + + $template->param( loop => \@loop ); + + # check that I (institution) and C (child) exists. otherwise => warning to the user + $sth = $dbh->prepare("select category_type from categories where category_type='C'"); + $sth->execute; + my ($categoryChild) = $sth->fetchrow; + $template->param( categoryChild => $categoryChild ); + + $sth = $dbh->prepare("select category_type from categories where category_type='I'"); + $sth->execute; + my ($categoryInstitution) = $sth->fetchrow; + $template->param( categoryInstitution => $categoryInstitution ); + $sth->finish; + +} #---- END $OP eq DEFAULT + +$template->param( + script_name => $script_name, + categorycode => $categorycode, + searchfield => $searchfield, + messages => \@messages, +); + +output_html_with_http_headers $input, $cookie, $template->output; + +exit 0; + +sub _get_brief_messaging_prefs { + my $categorycode = shift; + my $messaging_options = C4::Members::Messaging::GetMessagingOptions(); + my $results = []; + PREF: foreach my $option (@$messaging_options) { + my $pref = C4::Members::Messaging::GetMessagingPreferences( + { + categorycode => $categorycode, + message_name => $option->{'message_name'} + } + ); + next unless $pref->{'transports'}; + my $brief_pref = { + message_attribute_id => $option->{'message_attribute_id'}, + message_name => $option->{'message_name'}, + $option->{'message_name'} => 1 + }; + foreach my $transport ( keys %{ $pref->{'transports'} } ) { + push @{ $brief_pref->{'transports'} }, { transport => $transport }; + } + push @$results, $brief_pref; + } + return $results; +} diff --git a/admin/categories.pl b/admin/categories.pl index 1370b58..593886c 100755 --- a/admin/categories.pl +++ b/admin/categories.pl @@ -91,6 +91,7 @@ elsif ( $op eq 'add_validate' ) { my $category_type = $input->param('category_type'); my $BlockExpiredPatronOpacActions = $input->param('BlockExpiredPatronOpacActions'); my $default_privacy = $input->param('default_privacy'); + my $canbeguarantee = $input->param('canbeguarantee'); my @branches = grep { $_ ne q{} } $input->param('branches'); my $is_a_modif = $input->param("is_a_modif"); @@ -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->default_privacy($default_privacy); eval { @@ -137,6 +139,7 @@ elsif ( $op eq 'add_validate' ) { hidelostitems => $hidelostitems, overduenoticerequired => $overduenoticerequired, category_type => $category_type, + canbeguarantee => $canbeguarantee, BlockExpiredPatronOpacActions => $BlockExpiredPatronOpacActions, 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..55c2b78 --- /dev/null +++ b/installer/data/mysql/atomicupdate/bug_12446-EnableAdultGarantee.sql @@ -0,0 +1,10 @@ +-- ******** -- +-- 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'; diff --git a/installer/data/mysql/kohastructure.sql b/installer/data/mysql/kohastructure.sql index 02725fd..1302be2 100644 --- a/installer/data/mysql/kohastructure.sql +++ b/installer/data/mysql/kohastructure.sql @@ -488,7 +488,8 @@ 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, + `canbeguarantee` tinyint(1) NOT NULL default '0' PRIMARY KEY (`categorycode`), UNIQUE KEY `categorycode` (`categorycode`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; diff --git a/installer/data/mysql/sysprefs.sql b/installer/data/mysql/sysprefs.sql index aa53139..fdfe94c 100644 --- a/installer/data/mysql/sysprefs.sql +++ b/installer/data/mysql/sysprefs.sql @@ -6,6 +6,8 @@ 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'), +('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'), @@ -517,5 +519,5 @@ INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, ` ('XSLTDetailsDisplay','default','','Enable XSL stylesheet control over details page display on intranet','Free'), ('XSLTResultsDisplay','default','','Enable XSL stylesheet control over results page display on intranet','Free'), ('z3950AuthorAuthFields','701,702,700',NULL,'Define the MARC biblio fields for Personal Name Authorities to fill biblio.author','free'), -('z3950NormalizeAuthor','0','','If ON, Personal Name Authorities will replace authors in biblio.author','YesNo') +('z3950NormalizeAuthor','0','','If ON, Personal Name Authorities will replace authors in biblio.author','YesNo'), ; 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 641bbad..7cc0c0e 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/includes/members-toolbar.inc +++ b/koha-tmpl/intranet-tmpl/prog/en/includes/members-toolbar.inc @@ -146,7 +146,7 @@ function searchToHold(){ [% IF ( CAN_user_borrowers ) %] [% IF ( adultborrower AND activeBorrowerRelationship ) %] - Add child + Add guarantee [% END %] [% IF ( CAN_user_borrowers ) %] Change password diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/categorie.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/categorie.tt new file mode 100644 index 0000000..feae0af --- /dev/null +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/categorie.tt @@ -0,0 +1,475 @@ +[% USE KohaDates -%] +[% INCLUDE 'doc-head-open.inc' %] +Koha › Administration › Patron categories › [% IF ( add_form ) %][% IF ( categorycode ) %]Modify category '[% categorycode |html %]'[% ELSE %]New category[% END %][% END %] +[% IF ( delete_confirm ) %][% IF ( patrons_in_category > 0 ) %]Cannot delete: category [% categorycode |html %] in use[% ELSE %]Confirm deletion of category '[% categorycode |html %]'[% END %][% END %] + +[% INCLUDE 'doc-head-close.inc' %] +[% INCLUDE 'calendar.inc' %] + +[% INCLUDE 'datatables.inc' %] + + + + +[% INCLUDE 'header.inc' %] +[% INCLUDE 'patrons-admin-search.inc' %] + + + +
+ +
+
+
+ +[% FOR m IN messages %] +
+ [% SWITCH m.code %] + [% CASE 'error_on_insert' %] + An error occurred when inserting this patron category. The patron category might already exist. + [% CASE 'error_on_delete' %] + An error occurred when deleting this patron category. Check the logs. + [% CASE 'success_on_insert' %] + Patron category added successfully + [% CASE 'success_on_delete' %] + Patron category deleted successfully. + [% CASE %] + [% m.code %] + [% END %] +
+[% END %] + +[% IF ( add_form ) %] +
+ + +[% IF ( categorycode ) %] +

Modify category [% categorycode |html %]

+ [% ELSE %] +

New category

+ [% END %] +
+
    [% IF ( categorycode ) %] +
  1. Category code: [% categorycode |html %] +
  2. + [% ELSE %] +
  3. + + + Required +
  4. + [% END %] +
  5. + + + Required +
  6. +
  7. +
    + Choose one +
      +
    1. + months
    2. +
    3. + +
      Cannot have "months" and "until date" at the same time
      +
    4. +
    +
    +
  8. +
  9. years
  10. +
  11. years
  12. +
  13. +
  14. +
  15. +
  16. +
  17. + + + Required +
  18. +
  19. + + +
  20. +
  21. + + Select All branches if this category type must to be displayed all the time. Otherwise select libraries you want to associate with this value. + +
  22. +
  23. + + + Choose whether patrons of this category be blocked from public catalog actions such as renewing and placing holds when their cards have expired. + +
  24. +
  25. + + + Controls how long a patrons checkout history is kept for new patrons of this category. "Never" anonymizes checkouts on return, and "Forever" keeps a patron's checkout history indefinitely. When set to "Default", the amount of history kept is controlled by the cronjob batch_anonymise.pl which should be set up by your system administrator. +
  26. +
+
+ + [% IF ( EnhancedMessagingPreferences ) %] +
+

Default messaging preferences for this patron category

+ [% INCLUDE 'messaging-preference-form.inc' %] +
+ [% END %] +
+
+ +[% END %] + +[% IF ( delete_confirm ) %] +
+
+ + [% IF ( patrons_in_category > 0 ) %] + Category [% categorycode |html %] is in use. Deletion not possible! + [% ELSE %] + Confirm deletion of category [% categorycode |html %] + [% END %] + + +[% IF ( totalgtzero ) %]
This category is used [% total %] times. Deletion not possible
[% END %] + + + + + + + + + + + + + + + + + +
Category code: [% categorycode |html %]
Description: [% description |html %]
Enrollment period: + [% IF ( enrolmentperiod ) %] + [% enrolmentperiod %] months + [% ELSE %] + until [% enrolmentperioddate | $KohaDates %] + [% END %] +
Age required: [% dateofbirthrequired %] years
Upperage limit: [% upperagelimit %] years
Enrollment fee: [% enrolmentfee %]
Receives overdue notices: [% IF ( overduenoticerequired ) %]Yes[% ELSE %]No[% END %]
Lost items in staff client[% IF ( hidelostitems ) %]Hidden by default[% ELSE %]Shown[% END %]
Hold fee: [% reservefee %]
Can be guarantee[% IF ( canbeguarantee ) %]Yes[% ELSE %]No[% END %]
Default privacy: + [% SWITCH category.default_privacy %] + [% CASE 'default' %] + Default + [% CASE 'never' %] + Never + [% CASE 'forever' %] + Forever + [% END %] +
+
[% IF ( totalgtzero ) %] + + [% ELSE %] + + Cancel + [% END %]
+[% END %] + +[% IF ( else ) %] + + + +

Patron category administration

+[% IF ( searchfield ) %] + You Searched for [% searchfield %] + [% END %] +[% IF ( loop ) %] +
+
+ + + + + + + + + + + + + + [% IF ( EnhancedMessagingPreferences ) %] + + [% END %] + + + + + + + + + [% FOREACH loo IN loop %] + + + + + + + + + + + + [% IF ( EnhancedMessagingPreferences ) %] + + [% END %] + + + + + + + [% END %] + +
CodeCategory nameTypeEnrollment periodAge requiredUpper age limitEnrollment feeOverdueLost itemsHold feeMessagingBranches limitationsCan be guaranteeDefault privacy   
[% loo.categorycode |html %] + [% loo.description |html %] + + [% IF ( loo.type_A ) %]Adult[% END %] + [% IF ( loo.type_C ) %]Child[% END %] + [% IF ( loo.type_P ) %]Prof.[% END %] + [% IF ( loo.type_I ) %]Org.[% END %] + [% IF ( loo.type_S ) %]Staff[% END %] + [% IF ( loo.type_X ) %]Statistical[% END %] + + [% IF ( loo.enrolmentperiod ) %] + [% loo.enrolmentperiod %] months + [% ELSE %] + until [% loo.enrolmentperioddate | $KohaDates %] + [% END %] + + [% loo.dateofbirthrequired %] years[% loo.upperagelimit %] years[% loo.enrolmentfee %][% IF ( loo.overduenoticerequired ) %]Yes[% ELSE %]No[% END %][% IF ( loo.hidelostitems ) %]Hidden[% ELSE %]Shown[% END %][% loo.reservefee %] + [% IF ( loo.messaging_prefs ) %] + [% FOREACH prefs IN loo.messaging_prefs %] + [% FOREACH transport IN prefs.transports %] + [% IF ( transport.transport ) %] + [% IF ( prefs.Item_Due ) %]Item due + [% ELSIF ( prefs.Advance_Notice ) %]Advance notice + [% ELSIF ( prefs.Upcoming_Events ) %]Upcoming events + [% ELSIF ( prefs.Hold_Filled ) %]Hold filled + [% ELSIF ( prefs.Item_Check_in ) %]Item check-in + [% ELSIF ( prefs.Item_Checkout ) %]Item checkout + [% ELSE %]Unknown + [% END %]: + [% transport.transport %]
+ [% ELSE %]None
[% END %] + [% END %] + [% END %] + [% ELSE %] + None + [% END %] +
+ [% IF loo.branches.size > 0 %] + [% branches_str = "" %] + [% FOREACH branch IN loo.branches %] + [% branches_str = branches_str _ " " _ branch.branchname _ "(" _ branch.branchcode _ ")" %] + [% END %] + + [% IF loo.branches.size > 1 %] + [% loo.branches.size %] branches limitations + [% ELSE %] + [% loo.branches.size %] branch limitation + [% END %] + + [% ELSE %] + No limitation + [% END %] + [% IF loo.canbeguarantee %]Yes[% ELSE %]No[% END %] + [% SWITCH loo.default_privacy %] + [% CASE 'default' %] + Default + [% CASE 'never' %] + Never + [% CASE 'forever' %] + Forever + [% END %] + EditDelete
+[% ELSE %] +
No categories have been defined. Create a new category.
+[% END %] +[% END %] + +
+
+
+[% INCLUDE 'admin-menu.inc' %] +
+
+[% INCLUDE 'intranet-bottom.inc' %] 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 d4d0130..4112d44 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/categories.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/categories.tt @@ -238,6 +238,18 @@ Required +
  • + + +
  • [% END %]
  • - [% END %] - [% UNLESS nocontactfirstname %] -
  • + [% UNLESS nocontactfirstname %] +
  • [% IF ( guarantorid ) %] [% contactfirstname %] @@ -1025,6 +1018,7 @@
  • + [% IF ( patron_attribute.use_dropdown ) %]