Bug 9457 - Followup - Ordering branches should be case independent (2)
[koha.git] / members / memberentry.pl
index c047873..6b0e846 100755 (executable)
@@ -25,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;
@@ -100,6 +101,15 @@ my @field_check=split(/\|/,$check_BorrowerMandatoryField);
 foreach (@field_check) {
        $template->param( "mandatory$_" => 1);    
 }
+# 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 );
@@ -256,14 +266,14 @@ 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");
+            $template->param( age_low => $low);
+            $template->param( age_high => $high);
         }
     }
   
@@ -285,6 +295,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')) {
@@ -338,12 +350,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
@@ -407,13 +426,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'} );
+    }
 }
 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';
+$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'){
@@ -501,8 +524,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',
@@ -545,43 +568,22 @@ foreach (keys(%flags)) {
        push @flagdata,\%row;
 }
 
-#get Branches
-my @branches;
-my @select_branch;
-my %select_branches;
-
-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 $CGIbranch;
-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(scalar(@select_branch) > 0){
-# --------------------------------------------------------------------------------------------------------
-  #in modify mod :default value from $CGIbranch comes from borrowers table
-  #in add mod: default value come from branches table (ip correspendence)
-if (defined ($data{'branchcode'}) and ( $op eq 'modify' || ( $op eq 'add' && $category_type eq 'C' ) )) {
-    $default = $data{'branchcode'};
+# 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 $userbranch = '';
+if (C4::Context->userenv && C4::Context->userenv->{'branch'}) {
+    $userbranch = C4::Context->userenv->{'branch'};
 }
-$CGIbranch = CGI::scrolling_list(-id    => 'branchcode',
-            -name   => 'branchcode',
-            -values => \@select_branch,
-            -labels => \%select_branches,
-            -size   => 1,
-            -override => 1,  
-            -multiple =>0,
-            -default => $default,
-        );
+
+if (defined ($data{'branchcode'}) and ( $op eq 'modify' || ( $op eq 'add' && $category_type eq 'C' ) )) {
+    $userbranch = $data{'branchcode'};
 }
 
-if(!$CGIbranch){
+my $branchloop = GetBranchesLoop( $userbranch );
+
+if( !$branchloop ){
     $no_add = 1;
     $template->param(no_branches => 1);
 }
@@ -668,6 +670,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
@@ -675,19 +678,17 @@ $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(CGIbranch=>$CGIbranch) if ($CGIbranch);
+$template->param( branchloop => $branchloop ) if ( $branchloop );
 $template->param(
   nodouble  => $nodouble,
   borrowernumber  => $borrowernumber, #register number
@@ -748,6 +749,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 = ();
@@ -757,14 +760,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()}) {
@@ -779,8 +785,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++;
@@ -790,9 +795,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);
 
 }