X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=members%2Fmemberentry.pl;h=4b410a7036127452cbe3221572354ff816d8e662;hb=4f4946f8dfc8511a02af2cdebf96ea59be57fafc;hp=9fb8011b5a319a18b9d9b2390709022e6da3ff17;hpb=49b5f77194ccf688e95b3fbb5f08ea5ba18f7f7e;p=koha.git diff --git a/members/memberentry.pl b/members/memberentry.pl index 9fb8011b5a..4b410a7036 100755 --- a/members/memberentry.pl +++ b/members/memberentry.pl @@ -1,6 +1,7 @@ #!/usr/bin/perl # Copyright 2006 SAN OUEST PROVENCE et Paul POULAIN +# Copyright 2010 BibLibre # # This file is part of Koha. # @@ -24,6 +25,7 @@ use warnings; # external modules use CGI; # use Digest::MD5 qw(md5_base64); +use List::MoreUtils qw/uniq/; # internal modules use C4::Auth; @@ -39,6 +41,8 @@ use C4::Log; use C4::Letters; use C4::Branch; # GetBranches use C4::Form::MessagingPreferences; +use Koha::Borrower::Debarments; +use Koha::DateUtils; use vars qw($debug); @@ -60,6 +64,7 @@ my ($template, $loggedinuser, $cookie) flagsrequired => {borrowers => 1}, debug => ($debug) ? 1 : 0, }); + my $guarantorid = $input->param('guarantorid'); my $borrowernumber = $input->param('borrowernumber'); my $actionType = $input->param('actionType') || ''; @@ -70,14 +75,15 @@ my $destination = $input->param('destination'); my $cardnumber = $input->param('cardnumber'); my $check_member = $input->param('check_member'); my $nodouble = $input->param('nodouble'); -$nodouble = 1 if $op eq 'modify'; # FIXME hack to represent fact that if we're - # modifying an existing patron, it ipso facto - # isn't a duplicate. Marking FIXME because this - # script needs to be refactored. -my $select_city = $input->param('select_city'); -my $nok = $input->param('nok'); -my $guarantorinfo = $input->param('guarantorinfo'); -my $step = $input->param('step') || 0; +my $duplicate = $input->param('duplicate'); +$nodouble = 1 if ($op eq 'modify' or $op eq 'duplicate'); # FIXME hack to represent fact that if we're + # modifying an existing patron, it ipso facto + # isn't a duplicate. Marking FIXME because this + # script needs to be refactored. +my $select_city = $input->param('select_city'); +my $nok = $input->param('nok'); +my $guarantorinfo = $input->param('guarantorinfo'); +my $step = $input->param('step') || 0; my @errors; my $default_city; # $check_categorytype contains the value of duplicate borrowers category type to redirect in good template in step =2 @@ -87,6 +93,29 @@ my $borrower_data; my $NoUpdateLogin; my $userenv = C4::Context->userenv; + +## Deal with debarments +$template->param( + debarments => GetDebarments( { borrowernumber => $borrowernumber } ) ); +my @debarments_to_remove = $input->param('remove_debarment'); +foreach my $d ( @debarments_to_remove ) { + DelDebarment( $d ); +} +if ( $input->param('add_debarment') ) { + + my $expiration = $input->param('debarred_expiration'); + $expiration = $expiration ? output_pref( dt_from_string($expiration), 'iso' ) : undef; + + AddUniqueDebarment( + { + borrowernumber => $borrowernumber, + type => 'MANUAL', + comment => $input->param('debarred_comment'), + expiration => $expiration, + } + ); +} + $template->param("uppercasesurnames" => C4::Context->preference('uppercasesurnames')); my $minpw = C4::Context->preference('minPasswordLength'); @@ -98,33 +127,47 @@ my @field_check=split(/\|/,$check_BorrowerMandatoryField); foreach (@field_check) { $template->param( "mandatory$_" => 1); } -$template->param("add"=>1) if ($op eq 'add'); -$template->param("checked" => 1) if (defined($nodouble) && $nodouble eq 1); -($borrower_data = GetMember( 'borrowernumber'=>$borrowernumber )) if ($op eq 'modify' or $op eq 'save'); +# we'll need this, later. +my $dateofbirthmandatory = (scalar grep {$_ eq "dateofbirth"} @field_check) ? 1 : 0; +# function to designate unwanted fields +my $check_BorrowerUnwantedField=C4::Context->preference("BorrowerUnwantedField"); +@field_check=split(/\|/,$check_BorrowerUnwantedField); +foreach (@field_check) { + next unless m/\w/o; + $template->param( "no$_" => 1); +} +$template->param( "add" => 1 ) if ( $op eq 'add' ); +$template->param( "duplicate" => 1 ) if ( $op eq 'duplicate' ); +$template->param( "checked" => 1 ) if ( defined($nodouble) && $nodouble eq 1 ); +( $borrower_data = GetMember( 'borrowernumber' => $borrowernumber ) ) if ( $op eq 'modify' or $op eq 'save' or $op eq 'duplicate' ); my $categorycode = $input->param('categorycode') || $borrower_data->{'categorycode'}; -my $category_type = $input->param('category_type'); +my $category_type = $input->param('category_type') || ''; +if ($category_type){ + $template->{VARS}->{'type_only'} = 1; +} my $new_c_type = $category_type; #if we have input param, then we've already chosen the cat_type. unless ($category_type or !($categorycode)){ my $borrowercategory = GetBorrowercategory($categorycode); $category_type = $borrowercategory->{'category_type'}; my $category_name = $borrowercategory->{'description'}; $template->param("categoryname"=>$category_name); -} + } $category_type="A" unless $category_type; # FIXME we should display a error message instead of a 500 error ! # if a add or modify is requested => check validity of data. %data = %$borrower_data if ($borrower_data); # initialize %newdata -my %newdata; # comes from $input->param() -if ($op eq 'insert' || $op eq 'modify' || $op eq 'save') { - my @names= ($borrower_data && $op ne 'save') ? keys %$borrower_data : $input->param(); +my %newdata; # comes from $input->param() +if ( $op eq 'insert' || $op eq 'modify' || $op eq 'save' || $op eq 'duplicate' ) { + my @names = ( $borrower_data && $op ne 'save' ) ? keys %$borrower_data : $input->param(); foreach my $key (@names) { if (defined $input->param($key)) { $newdata{$key} = $input->param($key); $newdata{$key} =~ s/\"/"/g unless $key eq 'borrowernotes' or $key eq 'opacnote'; } } + my $dateobject = C4::Dates->new(); my $syspref = $dateobject->regexp(); # same syspref format for all 3 dates my $iso = $dateobject->regexp('iso'); # @@ -177,37 +220,42 @@ if ($op eq 'insert' || $op eq 'modify' || $op eq 'save') { } #############test for member being unique ############# -if (($op eq 'insert') and !$nodouble){ - my $category_type_send=$category_type if ($category_type eq 'I'); - my $check_category; # recover the category code of the doublon suspect borrowers - # ($result,$categorycode) = checkuniquemember($collectivity,$surname,$firstname,$dateofbirth) - ($check_member,$check_category) = checkuniquemember( - $category_type_send, - ($newdata{surname} ? $newdata{surname} : $data{surname} ), - ($newdata{firstname} ? $newdata{firstname} : $data{firstname} ), - ($newdata{dateofbirth} ? $newdata{dateofbirth} : $data{dateofbirth}) - ); - if(!$check_member){ - $nodouble = 1; - } - # recover the category type if the borrowers is a doublon +if ( ( $op eq 'insert' ) and !$nodouble ) { + my $category_type_send; + if ( $category_type eq 'I' ) { + $category_type_send = $category_type; + } + my $check_category; # recover the category code of the doublon suspect borrowers + # ($result,$categorycode) = checkuniquemember($collectivity,$surname,$firstname,$dateofbirth) + ( $check_member, $check_category ) = checkuniquemember( + $category_type_send, + ( $newdata{surname} ? $newdata{surname} : $data{surname} ), + ( $newdata{firstname} ? $newdata{firstname} : $data{firstname} ), + ( $newdata{dateofbirth} ? $newdata{dateofbirth} : $data{dateofbirth} ) + ); + if ( !$check_member ) { + $nodouble = 1; + } + + # recover the category type if the borrowers is a doublon if ($check_category) { - my $tmpborrowercategory=GetBorrowercategory($check_category); - $check_categorytype=$tmpborrowercategory->{'category_type'}; - } + my $tmpborrowercategory = GetBorrowercategory($check_category); + $check_categorytype = $tmpborrowercategory->{'category_type'}; + } } #recover all data from guarantor address phone ,fax... if ( $guarantorid and ( $category_type eq 'C' || $category_type eq 'P' )) { if (my $guarantordata=GetMember(borrowernumber => $guarantorid)) { $guarantorinfo=$guarantordata->{'surname'}." , ".$guarantordata->{'firstname'}; - if ( !defined($data{'contactname'}) or $data{'contactname'} eq '' or - $data{'contactname'} ne $guarantordata->{'surname'} ) { - $newdata{'contactfirstname'}= $guarantordata->{'firstname'}; - $newdata{'contactname'} = $guarantordata->{'surname'}; - $newdata{'contacttitle'} = $guarantordata->{'title'}; + $newdata{'contactfirstname'}= $guarantordata->{'firstname'}; + $newdata{'contactname'} = $guarantordata->{'surname'}; + $newdata{'contacttitle'} = $guarantordata->{'title'}; + if ( $op eq 'add' ) { foreach (qw(streetnumber address streettype address2 - zipcode country city phone phonepro mobile fax email emailpro branchcode)) { + zipcode country city state phone phonepro mobile fax email emailpro branchcode + B_streetnumber B_streettype B_address B_address2 + B_city B_state B_zipcode B_country B_email B_phone)) { $newdata{$_} = $guarantordata->{$_}; } } @@ -215,40 +263,52 @@ if ( $guarantorid and ( $category_type eq 'C' || $category_type eq 'P' )) { } ###############test to take the right zipcode, country and city name ############## -if (!defined($guarantorid) or $guarantorid eq '' or $guarantorid eq '0') { - # set only if parameter was passed from the form - $newdata{'city'} = $input->param('city') if defined($input->param('city')); - $newdata{'zipcode'} = $input->param('zipcode') if defined($input->param('zipcode')); - $newdata{'country'} = $input->param('country') if defined($input->param('country')); -} +# set only if parameter was passed from the form +$newdata{'city'} = $input->param('city') if defined($input->param('city')); +$newdata{'zipcode'} = $input->param('zipcode') if defined($input->param('zipcode')); +$newdata{'country'} = $input->param('country') if defined($input->param('country')); #builds default userid if ( (defined $newdata{'userid'}) && ($newdata{'userid'} eq '')){ - $newdata{'userid'} = Generate_Userid($borrowernumber, $newdata{'firstname'}, $newdata{'surname'}); + if ( ( defined $newdata{'firstname'} ) && ( defined $newdata{'surname'} ) ) { + # Full page edit, firstname and surname input zones are present + $newdata{'userid'} = Generate_Userid( $borrowernumber, $newdata{'firstname'}, $newdata{'surname'} ); + } + elsif ( ( defined $data{'firstname'} ) && ( defined $data{'surname'} ) ) { + # Partial page edit (access through "Details"/"Library details" tab), firstname and surname input zones are not used + # Still, if the userid field is erased, we can create a new userid with available firstname and surname + $newdata{'userid'} = Generate_Userid( $borrowernumber, $data{'firstname'}, $data{'surname'} ); + } + else { + $newdata{'userid'} = $data{'userid'}; + } } $debug and warn join "\t", map {"$_: $newdata{$_}"} qw(dateofbirth dateenrolled dateexpiry); my $extended_patron_attributes = (); if ($op eq 'save' || $op eq 'insert'){ - if (checkcardnumber($newdata{cardnumber},$newdata{borrowernumber})){ - push @errors, 'ERROR_cardnumber'; - } - my $dateofbirthmandatory = (scalar grep {$_ eq "dateofbirth"} @field_check) ? 1 : 0; - if ($newdata{dateofbirth} && $dateofbirthmandatory) { - my $age = GetAge($newdata{dateofbirth}); - my $borrowercategory=GetBorrowercategory($newdata{'categorycode'}); - my ($low,$high) = ($borrowercategory->{'dateofbirthrequired'}, $borrowercategory->{'upperagelimit'}); - if (($high && ($age > $high)) or ($age < $low)) { - push @errors, 'ERROR_age_limitations'; - $template->param('ERROR_age_limitations' => "$low to $high"); + # If the cardnumber is blank, treat it as null. + $newdata{'cardnumber'} = undef if $newdata{'cardnumber'} =~ /^\s*$/; + + if (checkcardnumber($newdata{cardnumber},$newdata{borrowernumber})){ + push @errors, 'ERROR_cardnumber'; + } + if ($newdata{dateofbirth} && $dateofbirthmandatory) { + my $age = GetAge($newdata{dateofbirth}); + my $borrowercategory=GetBorrowercategory($newdata{'categorycode'}); + my ($low,$high) = ($borrowercategory->{'dateofbirthrequired'}, $borrowercategory->{'upperagelimit'}); + if (($high && ($age > $high)) or ($age < $low)) { + push @errors, 'ERROR_age_limitations'; + $template->param( age_low => $low); + $template->param( age_high => $high); + } } - } if($newdata{surname} && C4::Context->preference('uppercasesurnames')) { $newdata{'surname'} = uc($newdata{'surname'}); } - if (C4::Context->preference("IndependantBranches")) { + if (C4::Context->preference("IndependentBranches")) { if ($userenv && $userenv->{flags} % 2 != 1){ $debug and print STDERR " $newdata{'branchcode'} : ".$userenv->{flags}.":".$userenv->{branch}; unless (!$newdata{'branchcode'} || $userenv->{branch} eq $newdata{'branchcode'}){ @@ -262,6 +322,8 @@ if ($op eq 'save' || $op eq 'insert'){ } my $password = $input->param('password'); + my $password2 = $input->param('password2'); + push @errors, "ERROR_password_mismatch" if ( $password ne $password2 ); push @errors, "ERROR_short_password" if( $password && $minpw && $password ne '****' && (length($password) < $minpw) ); if (C4::Context->preference('ExtendedPatronAttributes')) { @@ -269,14 +331,14 @@ if ($op eq 'save' || $op eq 'insert'){ foreach my $attr (@$extended_patron_attributes) { unless (C4::Members::Attributes::CheckUniqueness($attr->{code}, $attr->{value}, $borrowernumber)) { push @errors, "ERROR_extended_unique_id_failed"; - $template->param(ERROR_extended_unique_id_failed => "$attr->{code}/$attr->{value}"); + $template->param(ERROR_extended_unique_id_failed_value => "$attr->{code}/$attr->{value}"); } } } } -if ( ($op eq 'modify' || $op eq 'insert' || $op eq 'save') and ($step == 0 or $step == 3 )){ - if (exists ($newdata{'dateexpiry'}) && !($newdata{'dateexpiry'})){ +if ( ($op eq 'modify' || $op eq 'insert' || $op eq 'save'|| $op eq 'duplicate') and ($step == 0 or $step == 3 )){ + unless ($newdata{'dateexpiry'}){ my $arg2 = $newdata{'dateenrolled'} || C4::Dates->today('iso'); $newdata{'dateexpiry'} = GetExpiryDate($newdata{'categorycode'},$arg2); } @@ -293,6 +355,7 @@ if ((!$nok) and $nodouble and ($op eq 'insert' or $op eq 'save')){ if ($op eq 'insert'){ # we know it's not a duplicate borrowernumber or there would already be an error $borrowernumber = &AddMember(%newdata); + $newdata{'borrowernumber'} = $borrowernumber; # If 'AutoEmailOpacUser' syspref is on, email user their account details from the 'notice' that matches the user's branchcode. if ( C4::Context->preference("AutoEmailOpacUser") == 1 && $newdata{'userid'} && $newdata{'password'}) { @@ -314,12 +377,19 @@ if ((!$nok) and $nodouble and ($op eq 'insert' or $op eq 'save')){ # if we manage to find a valid email address, send notice if ($emailaddr) { $newdata{emailaddr} = $emailaddr; - my $letter = getletter ('members', "ACCTDETAILS:$newdata{'branchcode'}") ; - # if $branch notice fails, then email a default notice instead. - $letter = getletter ('members', "ACCTDETAILS") if !$letter; - SendAlerts ( 'members' , \%newdata , $letter ) if $letter + my $err; + eval { + $err = SendAlerts ( 'members', \%newdata, "ACCTDETAILS" ); + }; + if ( $@ ) { + $template->param(error_alert => $@); + } elsif ( ref($err) eq "HASH" && defined $err->{error} and $err->{error} eq "no_email" ) { + $template->{VARS}->{'error_alert'} = "no_email"; + } else { + $template->{VARS}->{'info_alert'} = 1; + } } - } + } if ($data{'organisations'}){ # need to add the members organisations @@ -330,7 +400,7 @@ if ((!$nok) and $nodouble and ($op eq 'insert' or $op eq 'save')){ C4::Members::Attributes::SetBorrowerAttributes($borrowernumber, $extended_patron_attributes); } if (C4::Context->preference('EnhancedMessagingPreferences') and $input->param('setting_messaging_prefs')) { - C4::Form::MessagingPreferences::handle_form_action($input, { borrowernumber => $borrowernumber }, $template); + C4::Form::MessagingPreferences::handle_form_action($input, { borrowernumber => $borrowernumber }, $template, 1, $newdata{'categorycode'}); } } elsif ($op eq 'save'){ if ($NoUpdateLogin) { @@ -368,9 +438,9 @@ if ($nok or !$nodouble){ $template->param( step_1 => 1,step_2 => 1,step_3 => 1, step_4 => 1, step_5 => 1, step_6 => 1); } } -if (C4::Context->preference("IndependantBranches")) { +if (C4::Context->preference("IndependentBranches")) { my $userenv = C4::Context->userenv; - if ($userenv->{flags} % 2 != 1 && $data{branchcode}){ + if ($userenv->{flags} % 2 != 1 && $data{'branchcode'}){ unless ($userenv->{branch} eq $data{'branchcode'}){ print $input->redirect("/cgi-bin/koha/members/members-home.pl"); exit; @@ -383,9 +453,17 @@ if ($op eq 'add'){ if ($op eq "modify") { $template->param( updtype => 'M',modify => 1 ); $template->param( step_1=>1, step_2=>1, step_3=>1, step_4=>1, step_5 => 1, step_6 => 1) unless $step; + if ( $step == 4 ) { + $template->param( categorycode => $borrower_data->{'categorycode'} ); + } } -# my $cardnumber=$data{'cardnumber'}; -$data{'cardnumber'}=fixup_cardnumber($data{'cardnumber'}) if $op eq 'add'; +if ( $op eq "duplicate" ) { + $template->param( updtype => 'I' ); + $template->param( step_1 => 1, step_2 => 1, step_3 => 1, step_4 => 1, step_5 => 1, step_6 => 1 ) unless $step; + $data{'cardnumber'} = ""; +} + +$data{'cardnumber'}=fixup_cardnumber($data{'cardnumber'}) if ( ( $op eq 'add' ) or ( $op eq 'duplicate' ) ); if(!defined($data{'sex'})){ $template->param( none => 1); } elsif($data{'sex'} eq 'F'){ @@ -412,9 +490,12 @@ if ($ethnicitycategoriescount>=0) { } my @typeloop; +my $no_categories = 1; +my $no_add; foreach (qw(C A S P I X)) { my $action="WHERE category_type=?"; ($categories,$labels)=GetborCatFromCatType($_,$action); + if(scalar(@$categories) > 0){ $no_categories = 0; } my @categoryloop; foreach my $cat (@$categories){ push @categoryloop,{'categorycode' => $cat, @@ -431,9 +512,10 @@ foreach (qw(C A S P I X)) { push @typeloop,{'typename' => $_, $typedescription => 1, 'categoryloop' => \@categoryloop}; -} -$template->param('typeloop' => \@typeloop); - +} +$template->param('typeloop' => \@typeloop, + no_categories => $no_categories); +if($no_categories){ $no_add = 1; } # test in city if ( $guarantorid ) { $select_city = getidcity($data{city}); @@ -469,8 +551,8 @@ my $roadpopup = CGI::popup_menu(-name=>'streettype', -default=>$default_roadtype ); -my $default_borrowertitle; -$default_borrowertitle=$data{'title'} ; +my $default_borrowertitle = ''; +unless ( $op eq 'duplicate' ) { $default_borrowertitle=$data{'title'} } my($borrowertitle)=GetTitles(); $template->param( title_cgipopup => 1) if ($borrowertitle); my $borrotitlepopup = CGI::popup_menu(-name=>'title', @@ -480,7 +562,7 @@ my $borrotitlepopup = CGI::popup_menu(-name=>'title', -default=>$default_borrowertitle ); -my @relationships = split /,|\|/, C4::Context->preference('BorrowerRelationship'); +my @relationships = split /,|\|/, C4::Context->preference('borrowerRelationship'); my @relshipdata; while (@relationships) { my $relship = shift @relationships || ''; @@ -494,8 +576,7 @@ while (@relationships) { } my %flags = ( 'gonenoaddress' => ['gonenoaddress' ], - 'lost' => ['lost'], - 'debarred' => ['debarred']); + 'lost' => ['lost']); my @flagdata; @@ -514,37 +595,30 @@ foreach (keys(%flags)) { push @flagdata,\%row; } -#get Branches -my @branches; -my @select_branch; -my %select_branches; +# get Branch Loop +# in modify mod: userbranch value for GetBranchesLoop() comes from borrowers table +# in add mod: userbranch value come from branches table (ip correspondence) -my $onlymine=(C4::Context->preference('IndependantBranches') && - C4::Context->userenv && - C4::Context->userenv->{flags} % 2 !=1 && - C4::Context->userenv->{branch}?1:0); - -my $branches=GetBranches($onlymine); -my $default; +my $userbranch = ''; +if (C4::Context->userenv && C4::Context->userenv->{'branch'}) { + $userbranch = C4::Context->userenv->{'branch'}; +} -for my $branch (sort { $branches->{$a}->{branchname} cmp $branches->{$b}->{branchname} } keys %$branches) { - push @select_branch,$branch; - $select_branches{$branch} = $branches->{$branch}->{'branchname'}; - $default = C4::Context->userenv->{'branch'} if (C4::Context->userenv && C4::Context->userenv->{'branch'}); +if (defined ($data{'branchcode'}) and ( $op eq 'modify' || ( $op eq 'add' && $category_type eq 'C' ) )) { + $userbranch = $data{'branchcode'}; } -# -------------------------------------------------------------------------------------------------------- - #in modify mod :default value from $CGIbranch comes from borrowers table - #in add mod: default value come from branches table (ip correspendence) -$default=$data{'branchcode'} if ($op eq 'modify' || ($op eq 'add' && $category_type eq 'C')); -my $CGIbranch = CGI::scrolling_list(-id => 'branchcode', - -name => 'branchcode', - -values => \@select_branch, - -labels => \%select_branches, - -size => 1, - -override => 1, - -multiple =>0, - -default => $default, - ); + +my $branchloop = GetBranchesLoop( $userbranch ); + +if( !$branchloop ){ + $no_add = 1; + $template->param(no_branches => 1); +} +if($no_categories){ + $no_add = 1; + $template->param(no_categories => 1); +} +$template->param(no_add => $no_add); my $CGIorganisations; my $member_of_institution; if (C4::Context->preference("memberofinstitution")){ @@ -594,10 +668,15 @@ if ($nok) { if (!defined($data{'dateenrolled'}) or $data{'dateenrolled'} eq ''){ $data{'dateenrolled'}=C4::Dates->today('iso'); } +if ( $op eq 'duplicate' ) { + $data{'dateenrolled'} = C4::Dates->today('iso'); + $data{'dateexpiry'} = GetExpiryDate( $data{'categorycode'}, $data{'dateenrolled'} ); +} if (C4::Context->preference('uppercasesurnames')) { - $data{'surname'} =uc($data{'surname'} ); - $data{'contactname'}=uc($data{'contactname'}); + $data{'surname'} &&= uc( $data{'surname'} ); + $data{'contactname'} &&= uc( $data{'contactname'} ); } + foreach (qw(dateenrolled dateexpiry dateofbirth)) { $data{$_} = format_date($data{$_}); # back to syspref for display $template->param( $_ => $data{$_}); @@ -616,6 +695,7 @@ if (C4::Context->preference('EnhancedMessagingPreferences')) { } $template->param(SMSSendDriver => C4::Context->preference("SMSSendDriver")); $template->param(SMSnumber => defined $data{'smsalertnumber'} ? $data{'smsalertnumber'} : $data{'mobile'}); + $template->param(TalkingTechItivaPhone => C4::Context->preference("TalkingTechItivaPhoneNotification")); } $template->param( "showguarantor" => ($category_type=~/A|I|S|X/) ? 0 : 1); # associate with step to know where you are @@ -623,22 +703,21 @@ $debug and warn "memberentry step: $step"; $template->param(%data); $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 -$template->param( debug => $debug ) if $debug; $template->param( BorrowerMandatoryField => C4::Context->preference("BorrowerMandatoryField"),#field to test with javascript category_type => $category_type,#to know the category type of the borrower - DHTMLcalendar_dateformat => C4::Dates->DHTMLcalendar(), select_city => $select_city, "$category_type" => 1,# associate with step to know where u are destination => $destination,#to know wher u come from and wher u must go in redirect check_member => $check_member,#to know if the borrower already exist(=>1) or not (=>0) "op$op" => 1); +$template->param( branchloop => $branchloop ) if ( $branchloop ); $template->param( nodouble => $nodouble, borrowernumber => $borrowernumber, #register number - guarantorid => (($borrower_data->{'guarantorid'})) ? $borrower_data->{'guarantorid'} : $guarantorid, + guarantorid => ($borrower_data->{'guarantorid'} || $guarantorid), ethcatpopup => $ethcatpopup, relshiploop => \@relshipdata, city_loop => $city_arrayref, @@ -646,13 +725,10 @@ $template->param( borrotitlepopup => $borrotitlepopup, guarantorinfo => $guarantorinfo, flagloop => \@flagdata, - dateformat => C4::Dates->new()->visual(), - C4::Context->preference('dateformat') => 1, check_categorytype =>$check_categorytype,#to recover the category type with checkcategorytype function category_type =>$category_type, modify => $modify, nok => $nok,#flag to konw if an error - CGIbranch => $CGIbranch, memberofinstution => $member_of_institution, CGIorganisations => $CGIorganisations, NoUpdateLogin => $NoUpdateLogin @@ -696,6 +772,8 @@ sub patron_attributes_form { return; } my $attributes = C4::Members::Attributes::GetBorrowerAttributes($borrowernumber); + my @classes = uniq( map {$_->{class}} @$attributes ); + @classes = sort @classes; # map patron's attributes into a more convenient structure my %attr_hash = (); @@ -705,14 +783,17 @@ sub patron_attributes_form { my @attribute_loop = (); my $i = 0; + my %items_by_class; foreach my $type_code (map { $_->{code} } @types) { my $attr_type = C4::Members::AttributeTypes->fetch($type_code); my $entry = { + class => $attr_type->class(), code => $attr_type->code(), description => $attr_type->description(), repeatable => $attr_type->repeatable(), password_allowed => $attr_type->password_allowed(), category => $attr_type->authorised_value_category(), + category_code => $attr_type->category_code(), password => '', }; if (exists $attr_hash{$attr_type->code()}) { @@ -727,8 +808,7 @@ sub patron_attributes_form { } $i++; $newentry->{form_id} = "patron_attr_$i"; - #use Data::Dumper; die Dumper($entry) if $entry->{use_dropdown}; - push @attribute_loop, $newentry; + push @{$items_by_class{$attr_type->class()}}, $newentry; } } else { $i++; @@ -738,9 +818,18 @@ sub patron_attributes_form { $newentry->{auth_val_loop} = GetAuthorisedValues($attr_type->authorised_value_category()); } $newentry->{form_id} = "patron_attr_$i"; - push @attribute_loop, $newentry; + push @{$items_by_class{$attr_type->class()}}, $newentry; } } + while ( my ($class, @items) = each %items_by_class ) { + my $lib = GetAuthorisedValueByCode( 'PA_CLASS', $class ) || $class; + push @attribute_loop, { + class => $class, + items => @items, + lib => $lib, + } + } + $template->param(patron_attributes => \@attribute_loop); }