# external modules
use CGI;
# use Digest::MD5 qw(md5_base64);
+use List::MoreUtils qw/uniq/;
# internal modules
use C4::Auth;
foreach (@field_check) {
$template->param( "mandatory$_" => 1);
}
+# 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.
$newdata{$key} =~ s/\"/"/g unless $key eq 'borrowernotes' or $key eq 'opacnote';
}
}
+
+ ## Manipulate debarred
+ if ( $newdata{debarred} ) {
+ $newdata{debarred} = $newdata{datedebarred} ? $newdata{datedebarred} : "9999-12-31";
+ } elsif ( exists( $newdata{debarred} ) && !( $newdata{debarred} ) ) {
+ undef( $newdata{debarred} );
+ undef( $newdata{debarredcomment} );
+ } elsif ( exists( $newdata{debarredcomment} ) && $newdata{debarredcomment} eq "" ) {
+ undef( $newdata{debarredcomment} );
+ }
+
my $dateobject = C4::Dates->new();
my $syspref = $dateobject->regexp(); # same syspref format for all 3 dates
my $iso = $dateobject->regexp('iso'); #
}
#############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->{$_};
}
}
}
###############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 '')){
$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';
+ }
+ 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($newdata{surname} && C4::Context->preference('uppercasesurnames')) {
$newdata{'surname'} = uc($newdata{'surname'});
}
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')) {
# 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
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) {
}
if (C4::Context->preference("IndependantBranches")) {
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;
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'} );
+ }
}
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;
}
-# my $cardnumber=$data{'cardnumber'};
$data{'cardnumber'}=fixup_cardnumber($data{'cardnumber'}) if $op eq 'add';
if(!defined($data{'sex'})){
$template->param( none => 1);
-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 || '';
}
my %flags = ( 'gonenoaddress' => ['gonenoaddress' ],
- 'lost' => ['lost'],
- 'debarred' => ['debarred']);
+ 'lost' => ['lost']);
my @flagdata;
# --------------------------------------------------------------------------------------------------------
#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' && $data{'branchcode'}));
+if (defined ($data{'branchcode'}) and ( $op eq 'modify' || ( $op eq 'add' && $category_type eq 'C' ) )) {
+ $default = $data{'branchcode'};
+}
$CGIbranch = CGI::scrolling_list(-id => 'branchcode',
-name => 'branchcode',
-values => \@select_branch,
$data{'surname'} =uc($data{'surname'} );
$data{'contactname'}=uc($data{'contactname'});
}
-foreach (qw(dateenrolled dateexpiry dateofbirth)) {
+
+$data{debarred} = C4::Overdues::CheckBorrowerDebarred($borrowernumber);
+$data{datedebarred} = $data{debarred} if ( $data{debarred} && $data{debarred} ne "9999-12-31" );
+foreach (qw(dateenrolled dateexpiry dateofbirth datedebarred)) {
$data{$_} = format_date($data{$_}); # back to syspref for display
$template->param( $_ => $data{$_});
}
$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,
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 = ();
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()}) {
}
$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++;
$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);
}