Code Cleaning Members.
[srvgit] / members / memberentry.pl
index 67e12a2..d6711f6 100755 (executable)
@@ -24,7 +24,6 @@ use strict;
 # external modules
 use Date::Calc qw/Today/;
 use CGI;
-use HTML::Template;
 use Date::Manip;
 use Digest::MD5 qw(md5_base64);
 
@@ -33,20 +32,28 @@ use C4::Auth;
 use C4::Context;
 use C4::Output;
 use C4::Interface::CGI::Output;
-use C4::Search;
 use C4::Members;
 use C4::Koha;
 use C4::Date;
 use C4::Input;
 use C4::Log;
+use C4::Branch; # GetBranches
 
 my $input = new CGI;
 my %data;
 
-
 my $dbh = C4::Context->dbh;
 
-my $category_type = $input->param('category_type') || die "NO CATEGORY_TYPE !"; # A, E, C, or P
+my $categorycode=$input->param('categorycode');
+my $category_type;
+$category_type = $input->param('category_type');
+unless ($category_type or !($categorycode)){
+  my $borrowercategory= GetBorrowercategory($categorycode);
+  $category_type = $borrowercategory->{'category_type'};
+}
+
+die "NO CATEGORY TYPE !" unless $category_type; # FIXME we should display a error message instead of a 500 error !
+
 my $step=$input->param('step') || 0;
 my ($template, $loggedinuser, $cookie)
     = get_template_and_user({template_name => "members/memberentry$category_type.tmpl",
@@ -56,15 +63,12 @@ my ($template, $loggedinuser, $cookie)
                             flagsrequired => {borrowers => 1},
                             debug => 1,
                             });
-
-my $borrowerid=$input->param('borrowerid');
 my $guarantorid=$input->param('guarantorid');
 my $borrowernumber=$input->param('borrowernumber');
 my $actionType=$input->param('actionType') || '';
 my $modify=$input->param('modify');
 my $delete=$input->param('delete');
 my $op=$input->param('op');
-my $categorycode=$input->param('categorycode');
 my $destination=$input->param('destination');
 my $cardnumber=$input->param('cardnumber');
 my $check_member=$input->param('check_member');
@@ -72,63 +76,55 @@ my $name_city=$input->param('name_city');
 my $nodouble=$input->param('nodouble');
 my $select_city=$input->param('select_city');
 my $nok=$input->param('nok');
-
+my $guarantorinfo=$input->param('guarantorinfo');
 my @errors;
-
+my $default_city;
 # $check_categorytype contains the value of duplicate borrowers category type to redirect in good template in step =2
 my $check_categorytype=$input->param('check_categorytype');
 # NOTE: Alert for ethnicity and ethnotes fields, they are unvalided in all borrowers form
-
+my $borrower_data;
 
 #function  to automatic setup the mandatory  fields (visual with css)
 my $check_BorrowerMandatoryField=C4::Context->preference("BorrowerMandatoryField");
 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 ($nodouble eq 1);
+($borrower_data=GetMember($borrowernumber,'borrowernumber')) if($op eq 'modify');
 
-my $borrower_data=borrdata('',$borrowernumber);
 # if a add or modify is requested => check validity of data.
 if ($step eq 0){
     foreach my $column (keys %$borrower_data){
        $data{$column}=$borrower_data->{$column};
     }
-    $data{'borrowerid'}=$borrowernumber;
-    if (!$borrowerid){
-       $borrowerid=$borrowernumber;
-    }
-}    
+   }
 
 if ($op eq 'add' or $op eq 'modify') {
        my @names=$input->param;
        foreach my $key (@names){
                $data{$key}=$input->param($key)||'';
-               $data{$key}=~ s/\'/\\\'/g;
-               $data{$key}=~ s/\"/\\\"/g;
+               $data{$key}=~ s/\"/"/gg unless $key eq 'borrowernotes' or $key eq 'opacnote';
        }
 
+       # WARN : some tests must be done whatever the step, because the librarian can click on any tab.
        #############test for member being unique #############
-       if ($op eq 'add' && $step eq 2){
-               (my $category_type_send=$category_type ) if ($category_type eq 'I'); 
-               my $check_category; # recover the category code of the doublon suspect borrowers
-          ($check_member,$check_category)= checkuniquemember($category_type_send,$data{'surname'},$data{'firstname'},format_date_in_iso($data{'dateofbirth'}));
-#      recover the category type if the borrowers is a duplicate
-       ($check_categorytype,undef)=getcategorytype($check_category);
+       if ($op eq 'add'){
+          my $category_type_send=$category_type if ($category_type eq 'I'); 
+          my $check_category; # recover the category code of the doublon suspect borrowers
+          ($check_member,$check_category)= checkuniquemember($category_type_send,$data{'surname'},$data{'firstname'},format_date_in_iso($data{'dateofbirth'}));
+          
+  #    recover the category type if the borrowers is a doublon 
+          my $tmpborrowercategory=GetBorrowercategory($check_category);
+          $check_categorytype=$tmpborrowercategory->{'category_type'};
+          
        }
 
-# CHECKS step by step
-# STEP 1
-       if ($step eq 1) {
-               ###############test to take the right zipcode and city name ##############
-               if ($category_type ne 'I' and $guarantorid){
-                       my ($borrower_city,$borrower_zipcode)=&getzipnamecity($select_city);
-                       $data{'city'}= $borrower_city;
-                       $data{'zipcode'}=$borrower_zipcode;
-               }
-               if ($category_type eq 'C' and $guarantorid){
-                       my $guarantordata=getguarantordata($guarantorid);
+#recover all data from guarantor address phone ,fax... 
+if ($category_type eq 'C' 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'};
@@ -146,62 +142,60 @@ if ($op eq 'add' or $op eq 'modify') {
                                $data{'email'}=$guarantordata->{'email'};
                                $data{'emailpro'}=$guarantordata->{'emailpro'};
                        }
-                    }
-                if ($categorycode ne 'I') {
-                    # is the age of the borrower compatible with age limitations of
-                    # the borrower category
-                    my $query = '
-SELECT upperagelimit,
-       dateofbirthrequired
-  FROM categories
-  WHERE categorycode = ?
-';
-                    my $sth=$dbh->prepare($query);
-                    $sth->execute($categorycode);
-                    my $category_info = $sth->fetchrow_hashref;
-
-                    my $age = get_age(format_date_in_iso($data{dateofbirth}));
+}
 
-                    if ($age > $category_info->{upperagelimit}
-                            or $age < $category_info->{dateofbirthrequired}
-                        ) {
-                        push @errors, 'ERROR_age_limitations';
-                        $nok = 1;
-                    }
-                }
+       # CHECKS step by step
+# STEP 1
+    if ($step eq 1) {
+        ###############test to take the right zipcode and city name ##############
+        if ( $guarantorid eq ''){
+          if ($select_city){
+            my ($borrower_city,$borrower_zipcode)=&getzipnamecity($select_city);
+            $data{'city'}= $borrower_city;
+            $data{'zipcode'}=$borrower_zipcode;
+            }
+        }
+        my $dateofbirthmandatory=0;
+        map {$dateofbirthmandatory=1 if $_ eq "dateofbirth"} @field_check;
+        if ($category_type ne 'I' && $data{dateofbirth} && $dateofbirthmandatory) {
+          my $age = GetAge(format_date_in_iso($data{dateofbirth}));
+          my $borrowercategory=GetBorrowercategory($data{'categorycode'});   
+          if (($age > $borrowercategory->{'upperagelimit'}) or ($age < $borrowercategory->{'dateofbirthrequired'})) {
+            push @errors, 'ERROR_age_limitations';
+            $nok = 1;
+          }
+        }
        }
+
 # STEP 2
        if ($step eq 2) {
-                       if ( ($data{'login'} eq '')){
-                               my $onefirstnameletter=substr($data{'firstname'},0,1);
-                               my $fivesurnameletter=substr($data{'surname'},0,5);
-                               $data{'login'}=lc($onefirstnameletter.$fivesurnameletter);
-                       }
-                       if ($op eq 'add' and $data{'dateenrolled'} eq ''){
-                               my $today=today();
-                               #insert ,in field "dateenrolled" , the current date
-                               $data{'dateenrolled'}=$today;
-                               #if date expiry is null u must calculate the value only in this case
-                               $data{'dateexpiry'} = calcexpirydate($data{'categorycode'},$today);
-                       }
-                       if ($op eq 'modify' ){
-                       my $today=today();
-#                      if date expiry is null u must calculate the value only in this case
-                       if ($data{'dateexpiry'} eq ''){
-                       $data{'dateexpiry'} = calcexpirydate($data{'categorycode'},$today);
-                       }
-               }
+            if ( ($data{'userid'} eq '')){
+              my $onefirstnameletter=substr($data{'firstname'},0,1);
+              my $fivesurnameletter=substr($data{'surname'},0,5);
+              $data{'userid'}=lc($onefirstnameletter.$fivesurnameletter);
+            }
+            if ($op eq 'add' and $data{'dateenrolled'} eq ''){
+              my $today= sprintf('%04d-%02d-%02d', Today());
+              #insert ,in field "dateenrolled" , the current date
+              $data{'dateenrolled'}=$today;
+              $data{'dateexpiry'} = GetExpiryDate($data{'categorycode'},$today);
+            }
+            if ($op eq 'modify' ){
+              unless ($data{'dateexpiry'}){
+                my $today= sprintf('%04d-%02d-%02d', Today());
+                $data{'dateexpiry'} = GetExpiryDate($data{'categorycode'},$today);
+              }
+            }
        }
 # STEP 3
        if ($step eq 3) {
                # this value show if the login and password are been used
-               my $loginexist=checkuserpassword($borrowerid,$data{'login'},$data{'password'});
+               my $loginexist=checkuserpassword($borrowernumber,$data{'userid'},$data{'password'});
                # test to know if u must save or create the borrowers
                if ($op eq 'modify'){
                        # test to know if another user have the same password and same login            
                        if ($loginexist eq 0) {
-                               &modmember(%data);              
-                               logaction($loggedinuser,"MEMBERS","modify member", $borrowerid, "");
+                               &ModMember(%data);              
                        }
                        else {
                                push @errors, "ERROR_login_exist";
@@ -213,13 +207,12 @@ SELECT upperagelimit,
                                push @errors, "ERROR_login_exist";
                                $nok=1;
                        } else {
-                               $borrowerid = &newmember(%data);
+                               $borrowernumber = &AddMember(%data);
                                if ($data{'organisations'}){                                
                                    # need to add the members organisations
                                    my @orgs=split(/\|/,$data{'organisations'});
-                                   add_member_orgs($borrowerid,\@orgs);
+                                   add_member_orgs($borrowernumber,\@orgs);
                                 }
-                               logaction($loggedinuser,"MEMBERS","add member", $borrowerid, "");
                        }
                }
 
@@ -228,7 +221,7 @@ SELECT upperagelimit,
                                print $input->redirect("/cgi-bin/koha/circ/circulation.pl?findborrower=$data{'cardnumber'}");
                        } else {
                                if ($loginexist == 0) {
-                               print $input->redirect("/cgi-bin/koha/members/moremember.pl?bornum=$borrowerid");
+                               print $input->redirect("/cgi-bin/koha/members/moremember.pl?borrowernumber=$borrowernumber");
                                }
                        }
                }
@@ -245,14 +238,13 @@ SELECT upperagelimit,
 }
 
 if ($delete){
-       print $input->redirect("/cgi-bin/koha/deletemem.pl?member=$borrowerid");
        print $input->redirect("/cgi-bin/koha/deletemem.pl?member=$borrowernumber");
 } else {  # this else goes down the whole script
        # retrieve previous values : either in DB or in CGI, in case of errors in values
        my $data;
 # test to now if u add or modify a borrower (modify =>to take all carateristic of the borrowers)
        if (!$op and !$data{'surname'}) {
-               $data=borrdata('',$borrowerid);
+               $data=GetMember($borrowernumber,'borrowernumber');
                %data=%$data;
        }
        if (C4::Context->preference("IndependantBranches")) {
@@ -274,11 +266,13 @@ if ($delete){
                $template->param(female => 1);
        }
        my ($categories,$labels)=ethnicitycategories();
+    
        my $ethnicitycategoriescount=$#{$categories};
        my $ethcatpopup;
        if ($ethnicitycategoriescount>=0) {
                $ethcatpopup = CGI::popup_menu(-name=>'ethnicity',
                                        -id => 'ethnicity',
+                                       -tabindex=>'',
                                        -values=>$categories,
                                        -default=>$data{'ethnicity'},
                                        -labels=>$labels);
@@ -286,23 +280,29 @@ if ($delete){
        }
        
        
-       ($categories,$labels)=borrowercategories($category_type,$op);
-       
-       #if u modify the borrowers u must have the right value for is category code
+       my $action="WHERE category_type=?";
+       ($categories,$labels)=GetborCatFromCatType($category_type,$action);
        
-       (my $default_category=$data{'categorycode'}) if ($op  eq '');
-       my $catcodepopup = CGI::popup_menu(-name=>'categorycode',
-                                       -id => 'categorycode',
-                                       -values=>$categories,
-                                       -default=>$default_category,
-                                       -labels=>$labels);
+       if(scalar(@$categories)){
+           #if you modify the borrowers you must have the right value for his category code
+       (my $default_category=$data{'categorycode'}) if ($op  eq 'modify');
+           my $catcodepopup = CGI::popup_menu(
+               -name=>'categorycode',
+                       -id => 'categorycode',
+                       -values=>$categories,
+                       -labels=>$labels,
+                       -default=>$default_category
+           );
+           $template->param(catcodepopup=>$catcodepopup);
+       }
        #test in city
-       my $default_city;
-       if ($op eq ''){
-       (my $selectcity=&getidcity($data{'city'})) if ($select_city eq '');
-       $default_city=$selectcity;
-       }
-       my($cityid,$name_city)=getcities();
+       $select_city=getidcity($data{'city'}) if ($guarantorid ne '0');
+       ($default_city=$select_city) if ($step eq 0);
+       if ($select_city eq '' ){
+       my $selectcity=&getidcity($data{'city'});
+       $default_city=$selectcity;
+       }
+       my($cityid,$name_city)=GetCities();
        $template->param( city_cgipopup => 1) if ($cityid );
        my $citypopup = CGI::popup_menu(-name=>'select_city',
                                        -id => 'select_city',
@@ -314,7 +314,7 @@ if ($delete){
        
        my $default_roadtype;
        $default_roadtype=$data{'streettype'} ;
-       my($roadtypeid,$road_type)=getroadtypes();
+       my($roadtypeid,$road_type)=GetRoadTypes();
        $template->param( road_cgipopup => 1) if ($roadtypeid );
        my $roadpopup = CGI::popup_menu(-name=>'streettype',
                                        -id => 'streettype',
@@ -324,7 +324,17 @@ if ($delete){
                                        -default=>$default_roadtype
                                        );      
 
-       
+       my $default_borrowertitle;
+       $default_borrowertitle=$data{'title'} ;
+       my($borrowertitle)=GetBorrowersTitles();
+       my $borrotitlepopup = CGI::popup_menu(-name=>'title',
+                                             -id => 'title',
+                                             -values=>$borrowertitle,
+                                             -override => 1,
+                                             -default=>$default_borrowertitle
+                                       );              
+
+
        my @relationships = split /,|\|/,C4::Context->preference('BorrowerRelationship');
        my @relshipdata;
        while (@relationships) {
@@ -337,9 +347,9 @@ if ($delete){
                }
                push(@relshipdata, \%row);
        }
-       my %flags = ( 'gonenoaddress' => ['gonenoaddress', 'Adresse érronée'],
-                     'lost'          => ['lost', 'Carte Perdue'],
-                     'debarred'      => ['debarred', 'Lecteur exclu']);
+       my %flags = ( 'gonenoaddress' => ['gonenoaddress', 'Gone no address '],
+                     'lost'          => ['lost', 'Lost'],
+                     'debarred'      => ['debarred', 'Debarred']);
 
        my @flagdata;
        foreach (keys(%flags)) {
@@ -366,42 +376,38 @@ if ($delete){
        my @branches;
        my @select_branch;
        my %select_branches;
-       my $branches=getbranches();
+       my $branches=GetBranches();
        my $default;
        # -----------------------------------------------------
        #  the value of ip from the branches hash table
-               my $select_ip;
+#              my $select_ip;
        # $ip is the ip of user when is connect to koha 
-               my $ip = $ENV{'REMOTE_ADDR'};
+#              my $ip = $ENV{'REMOTE_ADDR'};
+       
        # -----------------------------------------------------
        foreach my $branch (keys %$branches) {
                if ((not C4::Context->preference("IndependantBranches")) || (C4::Context->userenv->{'flags'} == 1)) {
                        push @select_branch, $branch;
                        $select_branches{$branch} = $branches->{$branch}->{'branchname'};
-#               take the ip number from branches "op"
-                       $select_ip = $branches->{$branch}->{'branchip'} || '';
-                               
-#              test $select_ip equal $ip to attribute the default value for the scrolling list
-                       if ($select_ip eq $ip)  {
-                                               $default = $branches->{$branch}->{'branchcode'};
-                                               }
-                       } else {
-                               push @select_branch, $branch if ($branch eq C4::Context->userenv->{'branch'});
-                               $select_branches{$branch} = $branches->{$branch}->{'branchname'} if ($branch eq C4::Context->userenv->{'branch'});
-                                       
-                               $default = C4::Context->userenv->{'branch'};
-                                       
-                               }
+                       $default=C4::Context->userenv->{'branch'};
+               } else {
+                       push @select_branch,$branch if ($branch eq C4::Context->userenv->{'branch'});
+                       $select_branches{$branch} = $branches->{$branch}->{'branchname'} if ($branch eq C4::Context->userenv->{'branch'});
+                       $default = C4::Context->userenv->{'branch'};
+               }
        }
 # --------------------------------------------------------------------------------------------------------
-       my $CGIbranch = CGI::scrolling_list(-id    => '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');
+       my $CGIbranch = CGI::scrolling_list(-id    => 'branchcode',
                                           -name   => 'branchcode',
                                           -values => \@select_branch,
                                           -labels => \%select_branches,
                                           -size   => 1,
-                                          -multiple =>0,
                                           -override => 1,      
-                                          -default => $default,
+                                          -multiple =>0,
+                                          -default => $default,
                                        );
        my $CGIorganisations;
        my $member_of_institution;
@@ -428,7 +434,7 @@ if ($delete){
 
 
 # --------------------------------------------------------------------------------------------------------
-       
+
        my $CGIsort1 = buildCGIsort("Bsort1","sort1",$data{'sort1'});
        if ($CGIsort1) {
                $template->param(CGIsort1 => $CGIsort1);
@@ -443,26 +449,20 @@ if ($delete){
        } else {
                $template->param( sort2 => $data{'sort2'});
        }
-
-       
-       $data{'opacnotes'} =~ s/\\//g;
-       $data{'borrowernotes'} =~ s/\\//g;
-
        # increase step to see next page
         if ($nok) {
             foreach my $error (@errors) {
                 $template->param( $error => 1);
             }
-            $template->param(nok => 1);
+               $template->param(nok => 1);
         }
         else {
             $step++;
         }
-
-       warn "CITY".$data{city};
        $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 => get_date_format_string_for_DHTMLcalendar(),
                select_city     => $select_city,
                "step_$step"    => 1,# associate with step to know where u are
                step            => $step,
@@ -472,17 +472,16 @@ if ($delete){
                "op$op"         => 1,
 #              op                      => $op,
                nodouble        => $nodouble,
-               borrowerid      => $borrowerid,#register number
+               borrowernumber  => $borrowernumber,#register number
                cardnumber      => $data{'cardnumber'},
                surname         => uc($data{'surname'}),
-               firstname       => ucfirst($data{'firstname'}),
-               "title_".$data{'title'}   => " SELECTED ",
+               firstname       => ucfirst(lc $data{'firstname'}),
                title           => $data{'title'},
                othernames      => $data{'othernames'},
                initials        => $data{'initials'},
                streetnumber    => $data{'streetnumber'},
                streettype      =>$data{'streettype'},
-               address          => $data{'address'},
+               address         => $data{'address'},
                address2        => $data{'address2'},   
                city            => $data{'city'},
                zipcode         => $data{'zipcode'},
@@ -492,44 +491,45 @@ if ($delete){
                fax             => $data{'fax'},
                phonepro        => $data{'phonepro'},
                emailpro        => $data{'emailpro'},
-               b_address       => $data{'b_address'},
-               b_city          => $data{'b_city'},
-               b_zipcode       => $data{'b_zipcode'},
-               b_email         => $data{'b_email'},
-               b_phone        => $data{'b_phone'},
+               B_address       => $data{'B_address'},
+               B_city          => $data{'B_city'},
+               B_zipcode       => $data{'B_zipcode'},
+               B_email         => $data{'B_email'},
+               B_phone        => $data{'B_phone'},
                dateofbirth     => $data{'dateofbirth'},
                branchcode      => $data{'branchcode'},
-               catcodepopup    => $catcodepopup,
                categorycode    => $data{'categorycode'},
                dateenrolled    => format_date($data{'dateenrolled'}),
-               dateexpiry              => format_date($data{'dateexpiry'}),
+               dateexpiry      => format_date($data{'dateexpiry'}),
                debarred        => $data{'debarred'},
                gonenoaddress   => $data{'gonenoaddress'}, 
                lost    => $data{'lost'},
                contactname     => uc($data{'contactname'}),
-               contactfirstname=> ucfirst($data{'contactfirstname'}),
+               contactfirstname=> ucfirst( lc $data{'contactfirstname'}),
                "contacttitle_".$data{'contacttitle'} => "SELECTED" ,
                contacttitle    => $data{'contacttitle'},
                guarantorid     => $guarantorid,
                ethcatpopup     => $ethcatpopup,
                sex             => $data{'sex'},
-               login           => $data{'login'},      
+               userid          => $data{'userid'},     
                password        => $data{'password'},   
-               opacnotes       => $data{'opacnotes'},  
-               contactnotes    => $data{'contactnotes'},
+               opacnote        => $data{'opacnote'},   
+               contactnote     => $data{'contactnote'},
                borrowernotes   => $data{'borrowernotes'},
                relshiploop     => \@relshipdata,
                relationship    => $data{'relationship'},
                citypopup       => $citypopup,
                roadpopup       => $roadpopup,  
+               borrotitlepopup => $borrotitlepopup,
                contacttype     => $data{'contacttype'},
                organisations   => $data{'organisations'},
+               guarantorinfo   => $guarantorinfo,
                flagloop        => \@flagdata,
-#                              "contacttype_".$data{'contacttype'} =>" SELECTED ",
+#              "contacttype_".$data{'contacttype'} =>" SELECTED ",
                dateformat      => display_date_format(),
                check_categorytype =>$check_categorytype,#to recover the category type with checkcategorytype function
-                       modify          => $modify,
-#                              city_choice       => $city_choice ,#check if the city was selected
+               modify          => $modify,
+#              city_choice       => $city_choice ,#check if the city was selected
                nok             => $nok,#flag to konw if an error 
                CGIbranch => $CGIbranch,
                memberofinstution => $member_of_institution,
@@ -539,24 +539,6 @@ if ($delete){
        output_html_with_http_headers $input, $cookie, $template->output;
 }
 
-sub get_age {
-    my ($date, $date_ref) = @_;
-
-    if (not defined $date_ref) {
-        $date_ref = sprintf('%04d-%02d-%02d', Today());
-    }
-
-    my ($year1, $month1, $day1) = split /-/, $date;
-    my ($year2, $month2, $day2) = split /-/, $date_ref;
-
-    my $age = $year2 - $year1;
-    if ($month1.$day1 > $month2.$day2) {
-        $age--;
-    }
-
-    return $age;
-}
-
 # Local Variables:
 # tab-width: 8
 # End: