TransformHTMLToXML bug default_ind_to_space
[koha.git] / members / memberentry.pl
index b246668..3b62849 100755 (executable)
@@ -19,6 +19,7 @@
 
 # pragma
 use strict;
+use warnings;
 
 # external modules
 use CGI;
@@ -68,7 +69,7 @@ my $destination    = $input->param('destination');
 my $cardnumber     = $input->param('cardnumber');
 my $check_member   = $input->param('check_member');
 my $name_city      = $input->param('name_city');
-my $nodouble       = $input->param('nodouble');
+my $nodouble       = $input->param('nodouble')||$op eq 'modify';
 my $select_city    = $input->param('select_city');
 my $nok            = $input->param('nok');
 my $guarantorinfo  = $input->param('guarantorinfo');
@@ -94,7 +95,7 @@ foreach (@field_check) {
        $template->param( "mandatory$_" => 1);    
 }
 $template->param("add"=>1) if ($op eq 'add');
-$template->param("checked" => 1) if ($nodouble eq 1);
+$template->param("checked" => 1) if (defined($nodouble) && $nodouble eq 1);
 ($borrower_data = GetMember($borrowernumber,'borrowernumber')) if ($op eq 'modify' or $op eq 'save');
 my $categorycode  = $input->param('categorycode') || $borrower_data->{'categorycode'};
 my $category_type = $input->param('category_type');
@@ -114,8 +115,10 @@ 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();
     foreach my $key (@names) {
-        $newdata{$key} = $input->param($key) if (defined $input->param($key));
-        $newdata{$key} =~ s/\"/"/gg unless $key eq 'borrowernotes' or $key eq 'opacnote';
+        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
@@ -133,13 +136,13 @@ if ($op eq 'insert' || $op eq 'modify' || $op eq 'save') {
         }
     }
   # check permission to modify login info.
-    if (ref($borrower_data) && ($borrower_data->{'category_type'} eq 'S') && ! (C4::Auth::haspermission($dbh,$userenv->{'id'},{'staffaccess'=>1})) )  {
+    if (ref($borrower_data) && ($borrower_data->{'category_type'} eq 'S') && ! (C4::Auth::haspermission($userenv->{'id'},{'staffaccess'=>1})) )  {
         $NoUpdateLogin = 1;
     }
 }
 
 #############test for member being unique #############
-if ($op eq 'insert'){
+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)
@@ -149,8 +152,10 @@ if ($op eq 'insert'){
                        ($newdata{firstname}   ? $newdata{firstname}   : $data{firstname}  ),
                        ($newdata{dateofbirth} ? $newdata{dateofbirth} : $data{dateofbirth})
                );
-          
-  #   recover the category type if the borrowers is a doublon 
+        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'};
@@ -158,21 +163,27 @@ if ($op eq 'insert'){
 }
 
   #recover all data from guarantor address phone ,fax... 
-if (($category_type eq 'C' || $category_type eq 'P') and $guarantorid ne '' ){
-  my $guarantordata=GetMember($guarantorid);
-  $guarantorinfo=$guarantordata->{'surname'}." , ".$guarantordata->{'firstname'};
-  if (($data{'contactname'} eq '' or $data{'contactname'} ne $guarantordata->{'surname'})) {
-    $data{'contactfirstname'}= $guarantordata->{'firstname'};
-    $data{'contactname'}     = $guarantordata->{'surname'};
-    $data{'contacttitle'}    = $guarantordata->{'title'};
-         foreach (qw(streetnumber address streettype address2 zipcode city phone phonepro mobile fax email emailpro branchcode)) {
-               $data{$_} = $guarantordata->{$_};
-       }
-  }
+if ( defined($guarantorid) and
+     ( $category_type eq 'C' || $category_type eq 'P' ) and
+     $guarantorid ne ''  and
+     $guarantorid ne '0' ) {
+    if (my $guarantordata=GetMember($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'};
+               foreach (qw(streetnumber address streettype address2
+                        zipcode city phone phonepro mobile fax email emailpro branchcode)) {
+                       $newdata{$_} = $guarantordata->{$_};
+               }
+        }
+    }
 }
 
 ###############test to take the right zipcode and city name ##############
-if ($guarantorid eq '') {
+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'));
@@ -180,13 +191,10 @@ if ($guarantorid eq '') {
 
 #builds default userid
 if ( (defined $newdata{'userid'}) && ($newdata{'userid'} eq '')){
-  my $onefirstnameletter = substr($data{'firstname'},0,1);
-  my  $fivesurnameletter = substr($data{'surname'}  ,0,9);
-  $newdata{'userid'}=lc($onefirstnameletter.$fivesurnameletter);
+    $newdata{'userid'} = Generate_Userid($borrowernumber, $newdata{'firstname'}, $newdata{'surname'});
 }
   
 $debug and warn join "\t", map {"$_: $newdata{$_}"} qw(dateofbirth dateenrolled dateexpiry);
-my $loginexist = 0;
 my $extended_patron_attributes = ();
 if ($op eq 'save' || $op eq 'insert'){
   if (checkcardnumber($newdata{cardnumber},$newdata{borrowernumber})){ 
@@ -213,11 +221,10 @@ if ($op eq 'save' || $op eq 'insert'){
   # Check if the userid is unique
   unless (Check_Userid($newdata{'userid'},$borrowernumber)) {
     push @errors, "ERROR_login_exist";
-    $loginexist=1; 
   }
   
   my $password = $input->param('password');
-    push @errors, "ERROR_short_password" if( $password && $minpw && (length($password) < $minpw ) );
+  push @errors, "ERROR_short_password" if( $password && $minpw && $password ne '****' && (length($password) < $minpw) );
 
   if (C4::Context->preference('ExtendedPatronAttributes')) {
     $extended_patron_attributes = parse_extended_patron_attributes($input);
@@ -238,9 +245,8 @@ if ($op eq 'modify' || $op eq 'insert' || $op eq 'save' ){
 }
 
 ###  Error checks should happen before this line.
-
 $nok = $nok || scalar(@errors);
-if ((!$nok) and ($op eq 'insert' or $op eq 'save')){
+if ((!$nok) and $nodouble and ($op eq 'insert' or $op eq 'save')){
        $debug and warn "$op dates: " . join "\t", map {"$_: $newdata{$_}"} qw(dateofbirth dateenrolled dateexpiry);
        if ($op eq 'insert'){
                # we know it's not a duplicate borrowernumber or there would already be an error
@@ -302,7 +308,7 @@ if ($delete){
        exit;           # same as above
 }
 
-if ($nok){
+if ($nok or !$nodouble){
     $op="add" if ($op eq "insert");
     $op="modify" if ($op eq "save");
     %data=%newdata; 
@@ -331,8 +337,10 @@ if ($op eq "modify")  {
 }
 # my $cardnumber=$data{'cardnumber'};
 $data{'cardnumber'}=fixup_cardnumber($data{'cardnumber'}) if $op eq 'add';
-if ($data{'sex'} eq 'F'){
-    $template->param(female => 1);
+if(!defined($data{'sex'})){
+    $template->param( none => 1);
+} elsif($data{'sex'} eq 'F'){
+    $template->param( female => 1);
 } elsif ($data{'sex'} eq 'M'){
     $template->param(  male => 1);
 } else {
@@ -362,7 +370,9 @@ foreach (qw(C A S P I X)) {
        foreach my $cat (@$categories){
                push @categoryloop,{'categorycode' => $cat,
                          'categoryname' => $labels->{$cat},
-                         'categorycodeselected' => ($cat eq $borrower_data->{'categorycode'} || $cat eq $categorycode),
+                         'categorycodeselected' => ((defined($borrower_data->{'categorycode'}) && 
+                                                     $cat eq $borrower_data->{'categorycode'}) 
+                                                     || (defined($categorycode) && $cat eq $categorycode)),
                };
        }
        my %typehash;
@@ -374,9 +384,9 @@ foreach (qw(C A S P I X)) {
 $template->param('typeloop' => \@typeloop);
 
 # test in city
-$select_city=getidcity($data{'city'}) if ($guarantorid ne '0');
+$select_city=getidcity($data{'city'}) if defined $guarantorid and ($guarantorid ne '0');
 ($default_city=$select_city) if ($step eq 0);
-if ($select_city eq '' ){
+if (!defined($select_city) or $select_city eq '' ){
        $default_city = &getidcity($data{'city'});
 }
 my($cityid);
@@ -417,7 +427,7 @@ my @relshipdata;
 while (@relationships) {
   my $relship = shift @relationships || '';
   my %row = ('relationship' => $relship);
-  if ($data{'relationship'} eq $relship) {
+  if (defined($data{'relationship'}) and $data{'relationship'} eq $relship) {
     $row{'selected'}=' selected';
   } else {
     $row{'selected'}='';
@@ -523,7 +533,7 @@ if ($nok) {
   
   #Formatting data for display    
   
-if ($data{'dateenrolled'} eq ''){
+if (!defined($data{'dateenrolled'}) or $data{'dateenrolled'} eq ''){
   $data{'dateenrolled'}=C4::Dates->today('iso');
 }
 if (C4::Context->preference('uppercasesurnames')) {
@@ -546,6 +556,7 @@ $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
@@ -554,12 +565,12 @@ $template->param(
   "$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) 
-  flags   =>$data{'flags'},   
-  "op$op"   => 1,
+  "op$op"   => 1);
+
+$template->param(
   nodouble  => $nodouble,
-  borrowernumber  => $borrowernumber,#register number
-  "contacttitle_".$data{'contacttitle'} => "SELECTED" ,
-  guarantorid => $borrower_data ? $borrower_data->{'guarantorid'} : $guarantorid,
+  borrowernumber  => $borrowernumber, #register number
+  guarantorid => (defined($borrower_data->{'guarantorid'})) ? $borrower_data->{'guarantorid'} : $guarantorid,
   ethcatpopup => $ethcatpopup,
   relshiploop => \@relshipdata,
   citypopup => $citypopup,
@@ -577,6 +588,14 @@ $template->param(
   CGIorganisations => $CGIorganisations,
   NoUpdateLogin =>  $NoUpdateLogin
   );
+
+if(defined($data{'flags'})){
+  $template->param(flags=>$data{'flags'});
+}
+if(defined($data{'contacttitle'})){
+  $template->param("contacttitle_" . $data{'contacttitle'} => "SELECTED");
+}
+
   
 output_html_with_http_headers $input, $cookie, $template->output;