@@ -, +, @@ - Enable an adult to have a guarantor: - Shows guarantees' fines in the guarantor's page: - Transfer some guarantor's information to the guarantee while adding a guarantiee: - Transfer some guarantor's information to the guarantee while creating a new patron - Transfer some guarantor's information to the guarantee while adding a guarantiee: - Transfer guarantor's alternate address/contact to the guarantee while creating a new patron: - Transfer guarantor's alternate address/contact to the guarantee while adding a guarantiee: --- 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 | 11 + 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, 1058 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 --- a/C4/Category.pm +++ a/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; --- a/C4/Members/Attributes.pm +++ a/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 --- a/C4/Utils/DataTables/Members.pm +++ a/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 --- a/Koha/Schema/Result/Category.pm +++ a/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", --- a/admin/categorie.pl +++ a/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; +} --- a/admin/categories.pl +++ a/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, }); --- a/installer/data/mysql/atomicupdate/bug_12446-EnableAdultGarantee.sql +++ a/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'; + --- a/installer/data/mysql/kohastructure.sql +++ a/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; --- a/installer/data/mysql/sysprefs.sql +++ a/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'), ; --- a/koha-tmpl/intranet-tmpl/prog/en/includes/members-toolbar.inc +++ a/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 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/categorie.tt +++ a/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' %] --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/categories.tt +++ a/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 ) %]