Merge branch 'master' of /home/jmf/repos/koha-rm-root.git/
[koha.git] / C4 / Members.pm
index 3c131b4..508618d 100644 (file)
@@ -26,11 +26,10 @@ use C4::Date;
 use Digest::MD5 qw(md5_base64);
 use Date::Calc qw/Today Add_Delta_YM/;
 use C4::Log; # logaction
 use Digest::MD5 qw(md5_base64);
 use Date::Calc qw/Today Add_Delta_YM/;
 use C4::Log; # logaction
-use C4::Accounts;
 use C4::Overdues;
 use C4::Overdues;
-use C4::Reserves2;
+use C4::Reserves;
 
 
-use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
+our ($VERSION,@ISA,@EXPORT,@EXPORT_OK);
 
 $VERSION = do { my @v = '$Revision$' =~ /\d+/g; shift(@v) . "." . join( "_", map { sprintf "%03d", $_ } @v ); };
 
 
 $VERSION = do { my @v = '$Revision$' =~ /\d+/g; shift(@v) . "." . join( "_", map { sprintf "%03d", $_ } @v ); };
 
@@ -54,32 +53,75 @@ This module contains routines for adding, modifying and deleting members/patrons
 
 @ISA = qw(Exporter);
 
 
 @ISA = qw(Exporter);
 
-@EXPORT = qw(
-  &BornameSearch &GetMember &GetMemberDetails
-  &borrdata &borrdata2
-  &fixup_cardnumber &findguarantees &findguarantor &GuarantornameSearch
-  &modmember &newmember &changepassword &borrissues &allissues
-  &checkuniquemember &getzipnamecity &getidcity &getguarantordata &getcategorytype
-  &DeleteBorrower
-  &calcexpirydate &checkuserpassword
-  &getboracctrecord
-  &GetborCatFromCatType &getborrowercategory
-  &fixEthnicity
-  &ethnicitycategories &get_institutions add_member_orgs
-  &get_age &GetBorrowersFromSurname &GetBranchCodeFromBorrowers
-  &GetFlagsAndBranchFromBorrower
-  &GetCities &GetRoadTypes &GetRoadTypeDetails &GetBorNotifyAcctRecord
-  &GetMembeReregistration
+#Get data
+push @EXPORT, qw(
+  &SearchMember 
+  &GetMemberDetails
+  &GetMember
+  
+  &GetGuarantees 
+  
+  &GetMemberIssuesAndFines
+  &GetPendingIssues
+  &GetAllIssues
+  
+  &get_institutions 
+  &getzipnamecity 
+  &getidcity
+   
+  &GetAge 
+  &GetCities 
+  &GetRoadTypes 
+  &GetRoadTypeDetails 
   &GetSortDetails
   &GetSortDetails
-  &GetBorrowersTitles  
+  &GetTitles   
+  
+  &GetMemberAccountRecords
+  &GetBorNotifyAcctRecord
+  
+  &GetborCatFromCatType 
+  &GetBorrowercategory
+  
+  
   &GetBorrowersWhoHaveNotBorrowedSince
   &GetBorrowersWhoHaveNeverBorrowed
   &GetBorrowersWithIssuesHistoryOlderThan
   &GetBorrowersWhoHaveNotBorrowedSince
   &GetBorrowersWhoHaveNeverBorrowed
   &GetBorrowersWithIssuesHistoryOlderThan
+  
+  &GetExpiryDate
+);
+
+#Modify data
+push @EXPORT, qw(
+  &ModMember
+  &changepassword
+);
+  
+#Delete data
+push @EXPORT, qw(
+  &DelMember
+);
+
+#Insert data
+push @EXPORT, qw(
+  &AddMember
+  &add_member_orgs
+  &MoveMemberToDeleted
+  &ExtendMemberSubscriptionTo 
+);
+
+#Check data
+push @EXPORT, qw(
+  &checkuniquemember 
+  &checkuserpassword
+  &fixEthnicity
+  &ethnicitycategories 
+  &fixup_cardnumber
+       &checkcardnumber
 );
 
 );
 
-=item BornameSearch
+=item SearchMember
 
 
-  ($count, $borrowers) = &BornameSearch($searchstring, $type);
+  ($count, $borrowers) = &SearchMember($searchstring, $type,$category_type);
 
 Looks up patrons (borrowers) by name.
 
 
 Looks up patrons (borrowers) by name.
 
@@ -87,11 +129,14 @@ BUGFIX 499: C<$type> is now used to determine type of search.
 if $type is "simple", search is performed on the first letter of the
 surname only.
 
 if $type is "simple", search is performed on the first letter of the
 surname only.
 
+$category_type is used to get a specified type of user. 
+(mainly adults when creating a child.)
+
 C<$searchstring> is a space-separated list of search terms. Each term
 must match the beginning a borrower's surname, first name, or other
 name.
 
 C<$searchstring> is a space-separated list of search terms. Each term
 must match the beginning a borrower's surname, first name, or other
 name.
 
-C<&BornameSearch> returns a two-element list. C<$borrowers> is a
+C<&SearchMember> returns a two-element list. C<$borrowers> is a
 reference-to-array; each element is a reference-to-hash, whose keys
 are the fields of the C<borrowers> table in the Koha database.
 C<$count> is the number of elements in C<$borrowers>.
 reference-to-array; each element is a reference-to-hash, whose keys
 are the fields of the C<borrowers> table in the Koha database.
 C<$count> is the number of elements in C<$borrowers>.
@@ -101,8 +146,8 @@ C<$count> is the number of elements in C<$borrowers>.
 #'
 #used by member enquiries from the intranet
 #called by member.pl
 #'
 #used by member enquiries from the intranet
 #called by member.pl
-sub BornameSearch {
-    my ($searchstring, $orderby, $type ) = @_;
+sub SearchMember {
+    my ($searchstring, $orderby, $type,$category_type ) = @_;
     my $dbh   = C4::Context->dbh;
     my $query = "";
     my $count;
     my $dbh   = C4::Context->dbh;
     my $query = "";
     my $count;
@@ -113,8 +158,9 @@ sub BornameSearch {
     {
         $query =
           "SELECT * FROM borrowers
     {
         $query =
           "SELECT * FROM borrowers
-                  LEFT JOIN categories ON borrowers.categorycode=categories.categorycode
-                  WHERE surname LIKE ? ORDER BY $orderby";
+                  LEFT JOIN categories ON borrowers.categorycode=categories.categorycode ".
+                  ($category_type?" AND category_type = ".$dbh->quote($category_type):"").
+                  " WHERE surname LIKE ? ORDER BY $orderby";
         @bind = ("$searchstring%");
     }
     else    # advanced search looking in surname, firstname and othernames
         @bind = ("$searchstring%");
     }
     else    # advanced search looking in surname, firstname and othernames
@@ -126,7 +172,8 @@ sub BornameSearch {
                WHERE ((surname LIKE ? OR surname LIKE ?
                OR firstname  LIKE ? OR firstname LIKE ?
                OR othernames LIKE ? OR othernames LIKE ?)
                WHERE ((surname LIKE ? OR surname LIKE ?
                OR firstname  LIKE ? OR firstname LIKE ?
                OR othernames LIKE ? OR othernames LIKE ?)
-               ";
+               ".
+                  ($category_type?" AND category_type = ".$dbh->quote($category_type):"");
         @bind = (
             "$data[0]%", "% $data[0]%", "$data[0]%", "% $data[0]%",
             "$data[0]%", "% $data[0]%"
         @bind = (
             "$data[0]%", "% $data[0]%", "$data[0]%", "% $data[0]%",
             "$data[0]%", "% $data[0]%"
@@ -153,88 +200,10 @@ sub BornameSearch {
     #  warn "Q $orderby : $query";
     $sth->execute(@bind);
     my @results;
     #  warn "Q $orderby : $query";
     $sth->execute(@bind);
     my @results;
-    my $cnt = $sth->rows;
-    while ( my $data = $sth->fetchrow_hashref ) {
-        push( @results, $data );
-    }
-
-    #  $sth->execute;
-    $sth->finish;
-    return ( $cnt, \@results );
-}
-
-=head3 GetFlagsAndBranchFromBorrower
-
-=over 4
-
-($flags, $homebranch) = GetFlagsAndBranchFromBorrower($loggedinuser);
-
-this function read on the database to get flags and homebranch for a user
-given on input arg.
-
-return : 
-it returns the $flags & the homebranch in scalar context.
-
-=back
-
-=cut
-
-sub GetFlagsAndBranchFromBorrower {
-    my $loggedinuser = @_;
-    my $dbh          = C4::Context->dbh;
-    my $query        = "
-       SELECT flags, branchcode
-       FROM   borrowers
-       WHERE  borrowernumber = ? 
-    ";
-    my $sth = $dbh->prepare($query);
-    $sth->execute($loggedinuser);
-
-    return $sth->fetchrow;
-}
-
-=item GetMember
-
-  $borrower = &GetMember($cardnumber, $borrowernumber);
+    my $data = $sth->fetchall_arrayref({});
 
 
-Looks up information about a patron (borrower) by either card number
-or borrower number. If $borrowernumber is specified, C<&borrdata>
-searches by borrower number; otherwise, it searches by card number.
-
-C<&GetMember> returns a reference-to-hash whose keys are the fields of
-the C<borrowers> table in the Koha database.
-
-=cut
-
-sub GetMember {
-    my ( $cardnumber, $borrowernumber ) = @_;
-    $cardnumber = uc $cardnumber;
-    my $dbh = C4::Context->dbh;
-    my $sth;
-    if ( $borrowernumber eq '' ) {
-        $sth = $dbh->prepare("Select * from borrowers where cardnumber=?");
-        $sth->execute($cardnumber);
-    }
-    else {
-        $sth = $dbh->prepare("Select * from borrowers where borrowernumber=?");
-        $sth->execute($borrowernumber);
-    }
-    my $data = $sth->fetchrow_hashref;
     $sth->finish;
     $sth->finish;
-    if ($data) {
-        return ($data);
-    }
-    else {    # try with firstname
-        if ($cardnumber) {
-            my $sth =
-              $dbh->prepare("select * from borrowers where firstname=?");
-            $sth->execute($cardnumber);
-            my $data = $sth->fetchrow_hashref;
-            $sth->finish;
-            return ($data);
-        }
-    }
-    return undef;
+    return ( scalar(@$data), $data );
 }
 
 =head2 GetMemberDetails
 }
 
 =head2 GetMemberDetails
@@ -350,9 +319,9 @@ sub GetMemberDetails {
         return undef;
     }
     my $borrower = $sth->fetchrow_hashref;
         return undef;
     }
     my $borrower = $sth->fetchrow_hashref;
-    my $amount = C4::Accounts::checkaccount( $borrowernumber, $dbh );
+    my ($amount) = GetMemberAccountRecords( $borrowernumber);
     $borrower->{'amountoutstanding'} = $amount;
     $borrower->{'amountoutstanding'} = $amount;
-    my $flags = patronflags( $borrower, $dbh );
+    my $flags = patronflags( $borrower);
     my $accessflagshash;
 
     $sth = $dbh->prepare("select bit,flag from userflags");
     my $accessflagshash;
 
     $sth = $dbh->prepare("select bit,flag from userflags");
@@ -383,7 +352,7 @@ sub GetMemberDetails {
  NOTE!: If you change this function, be sure to update the POD for
  &GetMemberDetails.
 
  NOTE!: If you change this function, be sure to update the POD for
  &GetMemberDetails.
 
- $flags = &patronflags($patron, $dbh);
+ $flags = &patronflags($patron);
 
  $flags->{CHARGES}
         {message}    Message showing patron's credit or debt
 
  $flags->{CHARGES}
         {message}    Message showing patron's credit or debt
@@ -412,9 +381,9 @@ sub GetMemberDetails {
 
 sub patronflags {
     my %flags;
 
 sub patronflags {
     my %flags;
-    my ( $patroninformation, $dbh ) = @_;
-    my $amount =
-      C4::Accounts::checkaccount( $patroninformation->{'borrowernumber'}, $dbh );
+    my ( $patroninformation) = @_;
+    my $dbh=C4::Context->dbh;
+    my ($amount) = GetMemberAccountRecords( $patroninformation->{'borrowernumber'});
     if ( $amount > 0 ) {
         my %flaginfo;
         my $noissuescharge = C4::Context->preference("noissuescharge");
     if ( $amount > 0 ) {
         my %flaginfo;
         my $noissuescharge = C4::Context->preference("noissuescharge");
@@ -472,51 +441,52 @@ sub patronflags {
         }
         $flags{'ODUES'} = \%flaginfo;
     }
         }
         $flags{'ODUES'} = \%flaginfo;
     }
-    my $itemswaiting =
-      C4::Reserves2::GetWaitingReserves( $patroninformation->{'borrowernumber'} );
-    my $nowaiting = scalar @$itemswaiting;
+    my @itemswaiting = GetReservesFromBorrowernumber( $patroninformation->{'borrowernumber'},'W' );
+    my $nowaiting = scalar @itemswaiting;
     if ( $nowaiting > 0 ) {
         my %flaginfo;
         $flaginfo{'message'}  = "Reserved items available";
     if ( $nowaiting > 0 ) {
         my %flaginfo;
         $flaginfo{'message'}  = "Reserved items available";
-        $flaginfo{'itemlist'} = $itemswaiting;
+        $flaginfo{'itemlist'} = \@itemswaiting;
         $flags{'WAITING'}     = \%flaginfo;
     }
     return ( \%flags );
 }
 
 
         $flags{'WAITING'}     = \%flaginfo;
     }
     return ( \%flags );
 }
 
 
-=item borrdata
+=item GetMember
 
 
-  $borrower = &borrdata($cardnumber, $borrowernumber);
+  $borrower = &GetMember($information, $type);
 
 Looks up information about a patron (borrower) by either card number
 
 Looks up information about a patron (borrower) by either card number
-or borrower number. If $borrowernumber is specified, C<&borrdata>
-searches by borrower number; otherwise, it searches by card number.
+,firstname, or borrower number, depending on $type value.
+If C<$type> == 'cardnumber', C<&GetBorrower>
+searches by cardnumber then by firstname if not found in cardnumber; 
+otherwise, it searches by borrowernumber.
 
 
-C<&borrdata> returns a reference-to-hash whose keys are the fields of
+C<&GetBorrower> returns a reference-to-hash whose keys are the fields of
 the C<borrowers> table in the Koha database.
 
 =cut
 
 #'
 the C<borrowers> table in the Koha database.
 
 =cut
 
 #'
-sub borrdata {
-    my ( $cardnumber, $borrowernumber ) = @_;
-    $cardnumber = uc $cardnumber;
+sub GetMember {
+    my ( $information, $type ) = @_;
     my $dbh = C4::Context->dbh;
     my $sth;
     my $dbh = C4::Context->dbh;
     my $sth;
-    if ( $borrowernumber eq '' ) {
-        $sth =
+    if ($type eq 'cardnumber' || $type eq 'firstname'|| $type eq 'userid'|| $type eq 'borrowernumber'){
+      $information = uc $information;
+      $sth =
           $dbh->prepare(
           $dbh->prepare(
-"Select borrowers.*,categories.category_type from borrowers left join categories on borrowers.categorycode=categories.categorycode where cardnumber=?"
+"Select borrowers.*,categories.category_type,categories.description  from borrowers left join categories on borrowers.categorycode=categories.categorycode where $type=?"
           );
           );
-        $sth->execute($cardnumber);
+        $sth->execute($information);
     }
     else {
         $sth =
           $dbh->prepare(
     }
     else {
         $sth =
           $dbh->prepare(
-"Select borrowers.*,categories.category_type from borrowers left join categories on borrowers.categorycode=categories.categorycode where borrowernumber=?"
+"Select borrowers.*,categories.category_type, categories.description from borrowers left join categories on borrowers.categorycode=categories.categorycode where borrowernumber=?"
           );
           );
-        $sth->execute($borrowernumber);
+        $sth->execute($information);
     }
     my $data = $sth->fetchrow_hashref;
 
     }
     my $data = $sth->fetchrow_hashref;
 
@@ -524,12 +494,12 @@ sub borrdata {
     if ($data) {
         return ($data);
     }
     if ($data) {
         return ($data);
     }
-    elsif ($cardnumber) {    # try with firstname
+    elsif ($type eq 'cardnumber' ||$type eq 'firstname') {    # try with firstname
         my $sth =
               $dbh->prepare(
         my $sth =
               $dbh->prepare(
-"Select borrowers.*,categories.category_type from borrowers left join categories on borrowers.categorycode=categories.categorycode  where firstname=?"
+"Select borrowers.*,categories.category_type,categories.description from borrowers left join categories on borrowers.categorycode=categories.categorycode  where firstname like ?"
             );
             );
-            $sth->execute($cardnumber);
+            $sth->execute($information);
             my $data = $sth->fetchrow_hashref;
             $sth->finish;
             return ($data);
             my $data = $sth->fetchrow_hashref;
             $sth->finish;
             return ($data);
@@ -539,14 +509,14 @@ sub borrdata {
     }
 }
 
     }
 }
 
-=item borrdata2
+=item GetMemberIssuesAndFines
 
 
-  ($borrowed, $due, $fine) = &borrdata2($borrowernumber);
+  ($borrowed, $due, $fine) = &GetMemberIssuesAndFines($borrowernumber);
 
 Returns aggregate data about items borrowed by the patron with the
 given borrowernumber.
 
 
 Returns aggregate data about items borrowed by the patron with the
 given borrowernumber.
 
-C<&borrdata2> returns a three-element array. C<$borrowed> is the
+C<&GetMemberIssuesAndFines> returns a three-element array. C<$borrowed> is the
 number of books the patron currently has borrowed. C<$due> is the
 number of overdue items the patron currently has borrowed. C<$fine> is
 the total fine currently due by the borrower.
 number of books the patron currently has borrowed. C<$due> is the
 number of overdue items the patron currently has borrowed. C<$fine> is
 the total fine currently due by the borrower.
@@ -554,7 +524,7 @@ the total fine currently due by the borrower.
 =cut
 
 #'
 =cut
 
 #'
-sub borrdata2 {
+sub GetMemberIssuesAndFines {
     my ( $borrowernumber ) = @_;
     my $dbh   = C4::Context->dbh;
     my $query =
     my ( $borrowernumber ) = @_;
     my $dbh   = C4::Context->dbh;
     my $query =
@@ -585,7 +555,18 @@ sub borrdata2 {
         $data3->{'sum(amountoutstanding)'} );
 }
 
         $data3->{'sum(amountoutstanding)'} );
 }
 
-sub modmember {
+=head2
+
+=item ModMember
+
+  &ModMember($borrowernumber);
+
+Modify borrower's data
+
+=cut
+
+#'
+sub ModMember {
     my (%data) = @_;
     my $dbh = C4::Context->dbh;
     $data{'dateofbirth'}  = format_date_in_iso( $data{'dateofbirth'} );
     my (%data) = @_;
     my $dbh = C4::Context->dbh;
     $data{'dateofbirth'}  = format_date_in_iso( $data{'dateofbirth'} );
@@ -683,18 +664,29 @@ sub modmember {
 # ok if its an adult (type) it may have borrowers that depend on it as a guarantor
 # so when we update information for an adult we should check for guarantees and update the relevant part
 # of their records, ie addresses and phone numbers
 # ok if its an adult (type) it may have borrowers that depend on it as a guarantor
 # so when we update information for an adult we should check for guarantees and update the relevant part
 # of their records, ie addresses and phone numbers
-    my ( $category_type, undef ) = getcategorytype( $data{'category_type'} );
-    if ( $category_type eq 'A' ) {
-
+    my $borrowercategory= GetBorrowercategory( $data{'category_type'} );
+    if ( $borrowercategory->{'category_type'} eq 'A' ) {
         # is adult check guarantees;
         # is adult check guarantees;
-        updateguarantees(%data);
+        UpdateGuarantees(%data);
 
     }
     &logaction(C4::Context->userenv->{'number'},"MEMBERS","MODIFY",$data{'borrowernumber'},"") 
         if C4::Context->preference("BorrowersLog");
 }
 
 
     }
     &logaction(C4::Context->userenv->{'number'},"MEMBERS","MODIFY",$data{'borrowernumber'},"") 
         if C4::Context->preference("BorrowersLog");
 }
 
-sub newmember {
+=head2
+
+=item AddMember
+
+  $borrowernumber = &AddMember(%borrower);
+
+insert new borrower into table
+Returns the borrowernumber
+
+=cut
+
+#'
+sub AddMember {
     my (%data) = @_;
     my $dbh = C4::Context->dbh;
     $data{'userid'} = '' unless $data{'password'};
     my (%data) = @_;
     my $dbh = C4::Context->dbh;
     $data{'userid'} = '' unless $data{'password'};
@@ -823,7 +815,6 @@ sub changepassword {
         return 0;
     }
     else {
         return 0;
     }
     else {
-
         #Everything is good so we can update the information.
         $sth =
           $dbh->prepare(
         #Everything is good so we can update the information.
         $sth =
           $dbh->prepare(
@@ -836,34 +827,7 @@ sub changepassword {
         if C4::Context->preference("BorrowersLog");
 }
 
         if C4::Context->preference("BorrowersLog");
 }
 
-sub getmemberfromuserid {
-    my ($userid) = @_;
-    my $dbh      = C4::Context->dbh;
-    my $sth      = $dbh->prepare("select * from borrowers where userid=?");
-    $sth->execute($userid);
-    return $sth->fetchrow_hashref;
-}
 
 
-sub updateguarantees {
-    my (%data) = @_;
-    my $dbh = C4::Context->dbh;
-    my ( $count, $guarantees ) = findguarantees( $data{'borrowernumber'} );
-    for ( my $i = 0 ; $i < $count ; $i++ ) {
-
-        # FIXME
-        # It looks like the $i is only being returned to handle walking through
-        # the array, which is probably better done as a foreach loop.
-        #
-        my $guaquery = qq|UPDATE borrowers 
-                         SET address='$data{'address'}',fax='$data{'fax'}',
-                             B_city='$data{'B_city'}',mobile='$data{'mobile'}',city='$data{'city'}',phone='$data{'phone'}'
-                         WHERE borrowernumber='$guarantees->[$i]->{'borrowernumber'}'
-               |;
-        my $sth3 = $dbh->prepare($guaquery);
-        $sth3->execute;
-        $sth3->finish;
-    }
-}
 
 =item fixup_cardnumber
 
 
 =item fixup_cardnumber
 
@@ -949,24 +913,24 @@ sub fixup_cardnumber ($) {
     return $cardnumber;
 }
 
     return $cardnumber;
 }
 
-=head2 findguarantees
+=head2 GetGuarantees
 
 
-  ($num_children, $children_arrayref) = &findguarantees($parent_borrno);
+  ($num_children, $children_arrayref) = &GetGuarantees($parent_borrno);
   $child0_cardno = $children_arrayref->[0]{"cardnumber"};
   $child0_borrno = $children_arrayref->[0]{"borrowernumber"};
 
   $child0_cardno = $children_arrayref->[0]{"cardnumber"};
   $child0_borrno = $children_arrayref->[0]{"borrowernumber"};
 
-C<&findguarantees> takes a borrower number (e.g., that of a patron
+C<&GetGuarantees> takes a borrower number (e.g., that of a patron
 with children) and looks up the borrowers who are guaranteed by that
 borrower (i.e., the patron's children).
 
 with children) and looks up the borrowers who are guaranteed by that
 borrower (i.e., the patron's children).
 
-C<&findguarantees> returns two values: an integer giving the number of
+C<&GetGuarantees> returns two values: an integer giving the number of
 borrowers guaranteed by C<$parent_borrno>, and a reference to an array
 of references to hash, which gives the actual results.
 
 =cut
 
 #'
 borrowers guaranteed by C<$parent_borrno>, and a reference to an array
 of references to hash, which gives the actual results.
 
 =cut
 
 #'
-sub findguarantees {
+sub GetGuarantees {
     my ($borrowernumber) = @_;
     my $dbh              = C4::Context->dbh;
     my $sth              =
     my ($borrowernumber) = @_;
     my $dbh              = C4::Context->dbh;
     my $sth              =
@@ -976,135 +940,49 @@ sub findguarantees {
     $sth->execute($borrowernumber);
 
     my @dat;
     $sth->execute($borrowernumber);
 
     my @dat;
-    while ( my $data = $sth->fetchrow_hashref ) {
-        push @dat, $data;
-    }
+    my $data = $sth->fetchall_arrayref({}); 
     $sth->finish;
     $sth->finish;
-    return ( scalar(@dat), \@dat );
+    return ( scalar(@$data), $data );
 }
 
 }
 
-=head2 findguarantor
-
-  $guarantor = &findguarantor($borrower_no);
-  $guarantor_cardno = $guarantor->{"cardnumber"};
-  $guarantor_surname = $guarantor->{"surname"};
-  ...
+=head2 UpdateGuarantees
 
 
-C<&findguarantor> takes a borrower number (presumably that of a child
-patron), finds the guarantor for C<$borrower_no> (the child's parent),
-and returns the record for the guarantor.
+  &UpdateGuarantees($parent_borrno);
+  
 
 
-C<&findguarantor> returns a reference-to-hash. Its keys are the fields
-from the C<borrowers> database table;
+C<&UpdateGuarantees> borrower data for an adulte and updates all the guarantees
+with the modified information
 
 =cut
 
 #'
 
 =cut
 
 #'
-sub findguarantor {
-    my ($borrowernumber) = @_;
-    my $dbh              = C4::Context->dbh;
-    my $sth              =
-      $dbh->prepare("select guarantorid from borrowers where borrowernumber=?");
-    $sth->execute($borrowernumber);
-    my $data = $sth->fetchrow_hashref;
-    $sth->finish;
-    $sth = $dbh->prepare("Select * from borrowers where borrowernumber=?");
-    $sth->execute( $data->{'guarantorid'} );
-    $data = $sth->fetchrow_hashref;
-    $sth->finish;
-    return ($data);
-}
-
-=item GuarantornameSearch
-
-  ($count, $borrowers) = &GuarantornameSearch($searchstring, $type);
-
-Looks up guarantor  by name.
-
-BUGFIX 499: C<$type> is now used to determine type of search.
-if $type is "simple", search is performed on the first letter of the
-surname only.
-
-C<$searchstring> is a space-separated list of search terms. Each term
-must match the beginning a borrower's surname, first name, or other
-name.
-
-C<&GuarantornameSearch> returns a two-element list. C<$borrowers> is a
-reference-to-array; each element is a reference-to-hash, whose keys
-are the fields of the C<borrowers> table in the Koha database.
-C<$count> is the number of elements in C<$borrowers>.
-
-return all info from guarantor =>only category_type A
-
-=cut
-
-#'
-#used by member enquiries from the intranet
-#called by guarantor_search.pl
-sub GuarantornameSearch {
-    my ($searchstring, $orderby, $type ) = @_;
-    my $dbh   = C4::Context->dbh;
-    my $query = "";
-    my $count;
-    my @data;
-    my @bind = ();
-
-    if ( $type eq "simple" )    # simple search for one letter only
-    {
-        $query =
-"Select * from borrowers,categories  where borrowers.categorycode=categories.categorycode and category_type='A'  and  surname like ? order by $orderby";
-        @bind = ("$searchstring%");
-    }
-    else    # advanced search looking in surname, firstname and othernames
-    {
-        @data  = split( ' ', $searchstring );
-        $count = @data;
-        $query = "Select * from borrowers,categories
-               where ((surname like ? or surname like ?
-               or firstname  like ? or firstname like ?
-               or othernames like ? or othernames like ?) and borrowers.categorycode=categories.categorycode and category_type='A' 
-               ";
-        @bind = (
-            "$data[0]%", "% $data[0]%", "$data[0]%", "% $data[0]%",
-            "$data[0]%", "% $data[0]%"
-        );
-        for ( my $i = 1 ; $i < $count ; $i++ ) {
-            $query = $query . " and (" . " surname like ? or surname like ?
-                        or firstname  like ? or firstname like ?
-                       or othernames like ? or othernames like ?)";
-            push( @bind,
-                "$data[$i]%",   "% $data[$i]%", "$data[$i]%",
-                "% $data[$i]%", "$data[$i]%",   "% $data[$i]%" );
-
-            # FIXME - .= <<EOT;
-        }
-        $query = $query . ") or cardnumber like ?
-               order by $orderby";
-        push( @bind, $searchstring );
-
-        # FIXME - .= <<EOT;
-    }
+sub UpdateGuarantees {
+    my (%data) = @_;
+    my $dbh = C4::Context->dbh;
+    my ( $count, $guarantees ) = GetGuarantees( $data{'borrowernumber'} );
+    for ( my $i = 0 ; $i < $count ; $i++ ) {
 
 
-    my $sth = $dbh->prepare($query);
-    $sth->execute(@bind);
-    my @results;
-    my $cnt = $sth->rows;
-    while ( my $data = $sth->fetchrow_hashref ) {
-        push( @results, $data );
+        # FIXME
+        # It looks like the $i is only being returned to handle walking through
+        # the array, which is probably better done as a foreach loop.
+        #
+        my $guaquery = qq|UPDATE borrowers 
+                         SET address='$data{'address'}',fax='$data{'fax'}',
+                             B_city='$data{'B_city'}',mobile='$data{'mobile'}',city='$data{'city'}',phone='$data{'phone'}'
+                         WHERE borrowernumber='$guarantees->[$i]->{'borrowernumber'}'
+               |;
+        my $sth3 = $dbh->prepare($guaquery);
+        $sth3->execute;
+        $sth3->finish;
     }
     }
-
-    #  $sth->execute;
-    $sth->finish;
-    return ( $cnt, \@results );
 }
 }
+=head2 GetPendingIssues
 
 
-=head2 borrissues
-
-  ($count, $issues) = &borrissues($borrowernumber);
+  ($count, $issues) = &GetPendingIssues($borrowernumber);
 
 Looks up what the patron with the given borrowernumber has borrowed.
 
 
 Looks up what the patron with the given borrowernumber has borrowed.
 
-C<&borrissues> returns a two-element array. C<$issues> is a
+C<&GetPendingIssues> returns a two-element array. C<$issues> is a
 reference-to-array, where each element is a reference-to-hash; the
 keys are the fields from the C<issues>, C<biblio>, and C<items> tables
 in the Koha database. C<$count> is the number of elements in
 reference-to-array, where each element is a reference-to-hash; the
 keys are the fields from the C<issues>, C<biblio>, and C<items> tables
 in the Koha database. C<$count> is the number of elements in
@@ -1113,27 +991,37 @@ C<$issues>.
 =cut
 
 #'
 =cut
 
 #'
-sub borrissues {
+sub GetPendingIssues {
     my ($borrowernumber) = @_;
     my $dbh              = C4::Context->dbh;
     my ($borrowernumber) = @_;
     my $dbh              = C4::Context->dbh;
+
     my $sth              = $dbh->prepare(
     my $sth              = $dbh->prepare(
-        "Select * from issues,biblio,items where borrowernumber=?
-   and items.itemnumber=issues.itemnumber
-       and items.biblionumber=biblio.biblionumber
-       and issues.returndate is NULL order by date_due"
+   "SELECT * FROM issues 
+      LEFT JOIN items ON issues.itemnumber=items.itemnumber
+      LEFT JOIN biblio ON     items.biblionumber=biblio.biblionumber 
+      LEFT JOIN biblioitems ON items.biblioitemnumber=biblioitems.biblioitemnumber
+    WHERE
+      borrowernumber=? 
+      AND returndate IS NULL
+    ORDER BY issues.date_due"
     );
     $sth->execute($borrowernumber);
     );
     $sth->execute($borrowernumber);
-    my @result;
-    while ( my $data = $sth->fetchrow_hashref ) {
-        push @result, $data;
+    my $data = $sth->fetchall_arrayref({});
+    my $today = POSIX::strftime("%Y%m%d", localtime);
+    foreach( @$data ) {
+        my $datedue = $_->{'date_due'};
+        $datedue =~ s/-//g;
+        if ( $datedue < $today ) {
+            $_->{'overdue'} = 1;
+        }
     }
     $sth->finish;
     }
     $sth->finish;
-    return ( scalar(@result), \@result );
+    return ( scalar(@$data), $data );
 }
 
 }
 
-=head2 allissues
+=head2 GetAllIssues
 
 
-  ($count, $issues) = &allissues($borrowernumber, $sortkey, $limit);
+  ($count, $issues) = &GetAllIssues($borrowernumber, $sortkey, $limit);
 
 Looks up what the patron with the given borrowernumber has borrowed,
 and sorts the results.
 
 Looks up what the patron with the given borrowernumber has borrowed,
 and sorts the results.
@@ -1144,7 +1032,7 @@ C<biblioitems>, or C<items> table in the Koha database.
 
 C<$limit> is the maximum number of results to return.
 
 
 C<$limit> is the maximum number of results to return.
 
-C<&allissues> returns a two-element array. C<$issues> is a
+C<&GetAllIssues> returns a two-element array. C<$issues> is a
 reference-to-array, where each element is a reference-to-hash; the
 keys are the fields from the C<issues>, C<biblio>, C<biblioitems>, and
 C<items> tables of the Koha database. C<$count> is the number of
 reference-to-array, where each element is a reference-to-hash; the
 keys are the fields from the C<issues>, C<biblio>, C<biblioitems>, and
 C<items> tables of the Koha database. C<$count> is the number of
@@ -1153,7 +1041,7 @@ elements in C<$issues>
 =cut
 
 #'
 =cut
 
 #'
-sub allissues {
+sub GetAllIssues {
     my ( $borrowernumber, $order, $limit ) = @_;
 
     #FIXME: sanity-check order and limit
     my ( $borrowernumber, $order, $limit ) = @_;
 
     #FIXME: sanity-check order and limit
@@ -1209,15 +1097,14 @@ sub allissues {
     return ( $i, \@result );
 }
 
     return ( $i, \@result );
 }
 
-=head2 getboracctrecord
 
 
-  ($count, $acctlines, $total) = &getboracctrecord($borrowernumber);
+=head2 GetMemberAccountRecords
 
 
-Looks up accounting data for the patron with the given borrowernumber.
+  ($total, $acctlines, $count) = &GetMemberAccountRecords($borrowernumber);
 
 
-(FIXME - I'm not at all sure what this is about.)
+Looks up accounting data for the patron with the given borrowernumber.
 
 
-C<&getboracctrecord> returns a three-element array. C<$acctlines> is a
+C<&GetMemberAccountRecords> returns a three-element array. C<$acctlines> is a
 reference-to-array, where each element is a reference-to-hash; the
 keys are the fields of the C<accountlines> table in the Koha database.
 C<$count> is the number of elements in C<$acctlines>. C<$total> is the
 reference-to-array, where each element is a reference-to-hash; the
 keys are the fields of the C<accountlines> table in the Koha database.
 C<$count> is the number of elements in C<$acctlines>. C<$total> is the
@@ -1226,36 +1113,33 @@ total amount outstanding for all of the account lines.
 =cut
 
 #'
 =cut
 
 #'
-sub getboracctrecord {
-    my ($params ) = @_;
+sub GetMemberAccountRecords {
+    my ($borrowernumber,$date) = @_;
     my $dbh = C4::Context->dbh;
     my @acctlines;
     my $numlines = 0;
     my $dbh = C4::Context->dbh;
     my @acctlines;
     my $numlines = 0;
-    my $sth      = $dbh->prepare(
-        "Select * from accountlines where
-borrowernumber=? order by date desc,timestamp desc"
-    );
-
-    $sth->execute( $params->{'borrowernumber'} );
+    my $strsth      = qq(
+SELECT * 
+FROM accountlines 
+WHERE borrowernumber=?);
+    my @bind = ($borrowernumber);
+    if ($date && $date ne ''){
+    $strsth.="
+AND date < ? ";
+    push(@bind,$date);
+    }
+    $strsth.="
+ORDER BY date desc,timestamp DESC";
+    my $sth= $dbh->prepare( $strsth );
+    $sth->execute( @bind );
     my $total = 0;
     while ( my $data = $sth->fetchrow_hashref ) {
     my $total = 0;
     while ( my $data = $sth->fetchrow_hashref ) {
-
-        #FIXME before reinstating: insecure?
-        #      if ($data->{'itemnumber'} ne ''){
-        #        $query="Select * from items,biblio where items.itemnumber=
-        #      '$data->{'itemnumber'}' and biblio.biblionumber=items.biblionumber";
-        #      my $sth2=$dbh->prepare($query);
-        #      $sth2->execute;
-        #      my $data2=$sth2->fetchrow_hashref;
-        #      $sth2->finish;
-        #      $data=$data2;
-        #     }
         $acctlines[$numlines] = $data;
         $numlines++;
         $total += $data->{'amountoutstanding'};
     }
     $sth->finish;
         $acctlines[$numlines] = $data;
         $numlines++;
         $total += $data->{'amountoutstanding'};
     }
     $sth->finish;
-    return ( $numlines, \@acctlines, $total );
+    return ( $total, \@acctlines,$numlines);
 }
 
 =head2 GetBorNotifyAcctRecord
 }
 
 =head2 GetBorNotifyAcctRecord
@@ -1275,7 +1159,7 @@ total amount outstanding for all of the account lines.
 =cut
 
 sub GetBorNotifyAcctRecord {
 =cut
 
 sub GetBorNotifyAcctRecord {
-    my ( $params, $notifyid ) = @_;
+    my ( $borrowernumber, $notifyid ) = @_;
     my $dbh = C4::Context->dbh;
     my @acctlines;
     my $numlines = 0;
     my $dbh = C4::Context->dbh;
     my @acctlines;
     my $numlines = 0;
@@ -1289,7 +1173,7 @@ sub GetBorNotifyAcctRecord {
                |;
     my $sth = $dbh->prepare($query);
 
                |;
     my $sth = $dbh->prepare($query);
 
-    $sth->execute( $params->{'borrowernumber'}, $notifyid );
+    $sth->execute( $borrowernumber, $notifyid );
     my $total = 0;
     while ( my $data = $sth->fetchrow_hashref ) {
         $acctlines[$numlines] = $data;
     my $total = 0;
     while ( my $data = $sth->fetchrow_hashref ) {
         $acctlines[$numlines] = $data;
@@ -1297,7 +1181,7 @@ sub GetBorNotifyAcctRecord {
         $total += $data->{'amountoutstanding'};
     }
     $sth->finish;
         $total += $data->{'amountoutstanding'};
     }
     $sth->finish;
-    return ( $numlines, \@acctlines, $total );
+    return ( $total, \@acctlines, $numlines );
 }
 
 =head2 checkuniquemember (OUEST-PROVENCE)
 }
 
 =head2 checkuniquemember (OUEST-PROVENCE)
@@ -1351,6 +1235,22 @@ sub checkuniquemember {
     }
 }
 
     }
 }
 
+sub checkcardnumber {
+       my ($cardnumber) = @_;
+       my $dbh = C4::Context->dbh;
+       my $query = "SELECT * FROM borrowers WHERE cardnumber=?";
+       my $sth = $dbh->prepare($query);
+       $sth->execute($cardnumber);
+       if (my $data= $sth->fetchrow_hashref()){
+               return 1;
+       }
+       else {
+               return 0;
+       }
+       $sth->finish();
+}  
+
+
 =head2 getzipnamecity (OUEST-PROVENCE)
 
 take all info from table city for the fields city and  zip
 =head2 getzipnamecity (OUEST-PROVENCE)
 
 take all info from table city for the fields city and  zip
@@ -1369,27 +1269,6 @@ sub getzipnamecity {
     return $data[0], $data[1];
 }
 
     return $data[0], $data[1];
 }
 
-=head2 updatechildguarantor (OUEST-PROVENCE)
-
-check for title,firstname,surname,adress,zip code and city  from guarantor to 
-guarantorchild
-
-=cut
-
-#'
-
-sub getguarantordata {
-    my ($borrowerid) = @_;
-    my $dbh          = C4::Context->dbh;
-    my $sth          =
-      $dbh->prepare(
-"Select title,firstname,surname,streetnumber,address,streettype,address2,zipcode,city,phone,phonepro,mobile,email,emailpro,fax  from borrowers where borrowernumber =? "
-      );
-    $sth->execute($borrowerid);
-    my $guarantor_data = $sth->fetchrow_hashref;
-    $sth->finish;
-    return $guarantor_data;
-}
 
 =head2 getdcity (OUEST-PROVENCE)
 
 
 =head2 getdcity (OUEST-PROVENCE)
 
@@ -1406,26 +1285,14 @@ sub getidcity {
     return $data;
 }
 
     return $data;
 }
 
-=head2 getcategorytype (OUEST-PROVENCE)
 
 
-check for the category_type with categorycode
-and return the category_type 
+=head2 GetExpiryDate 
 
 
-=cut
+  $expirydate = GetExpiryDate($categorycode, $dateenrolled);
+process expiry date given a date and a categorycode
 
 
-sub getcategorytype {
-    my ($categorycode) = @_;
-    my $dbh            = C4::Context->dbh;
-    my $sth            =
-      $dbh->prepare(
-"Select category_type,description from categories where categorycode=?  "
-      );
-    $sth->execute($categorycode);
-    my ( $category_type, $description ) = $sth->fetchrow;
-    return $category_type, $description;
-}
-
-sub calcexpirydate {
+=cut
+sub GetExpiryDate {
     my ( $categorycode, $dateenrolled ) = @_;
     my $dbh = C4::Context->dbh;
     my $sth =
     my ( $categorycode, $dateenrolled ) = @_;
     my $dbh = C4::Context->dbh;
     my $sth =
@@ -1434,9 +1301,6 @@ sub calcexpirydate {
     $sth->execute($categorycode);
     my ($enrolmentperiod) = $sth->fetchrow;
     $enrolmentperiod = 12 unless ($enrolmentperiod);
     $sth->execute($categorycode);
     my ($enrolmentperiod) = $sth->fetchrow;
     $enrolmentperiod = 12 unless ($enrolmentperiod);
-#     warn "Avant format_date_in_iso :".$dateenrolled;
-#     $dateenrolled=format_date_in_iso($dateenrolled);
-#     warn "Apres format_date_in_iso :".$dateenrolled;
     my @date=split /-/,format_date_in_iso($dateenrolled);
     @date=Add_Delta_YM($date[0],$date[1],$date[2],0,$enrolmentperiod);
     return sprintf("%04d-%02d-%02d",$date[0],$date[1],$date[2]);
     my @date=split /-/,format_date_in_iso($dateenrolled);
     @date=Add_Delta_YM($date[0],$date[1],$date[2],0,$enrolmentperiod);
     return sprintf("%04d-%02d-%02d",$date[0],$date[1],$date[2]);
@@ -1502,28 +1366,29 @@ sub GetborCatFromCatType {
     return ( \@codes, \%labels );
 }
 
     return ( \@codes, \%labels );
 }
 
-=head2 getborrowercategory
+=head2 GetBorrowercategory
 
 
-  $description,$dateofbirthrequired,$upperagelimit,$category_type = &getborrowercategory($categorycode);
+  $hashref = &GetBorrowercategory($categorycode);
 
 Given the borrower's category code, the function returns the corresponding
 
 Given the borrower's category code, the function returns the corresponding
-description , dateofbirthrequired , upperagelimit and category type for a comprehensive information display.
+data hashref for a comprehensive information display.
 
 =cut
 
 
 =cut
 
-sub getborrowercategory {
+sub GetBorrowercategory {
     my ($catcode) = @_;
     my $dbh       = C4::Context->dbh;
     my $sth       =
       $dbh->prepare(
     my ($catcode) = @_;
     my $dbh       = C4::Context->dbh;
     my $sth       =
       $dbh->prepare(
-"SELECT description,dateofbirthrequired,upperagelimit,category_type FROM categories WHERE categorycode = ?"
+"SELECT description,dateofbirthrequired,upperagelimit,category_type 
+ FROM categories 
+ WHERE categorycode = ?"
       );
     $sth->execute($catcode);
       );
     $sth->execute($catcode);
-    my ( $description, $dateofbirthrequired, $upperagelimit, $category_type ) =
-      $sth->fetchrow();
+    my $data =
+      $sth->fetchrow_hashref;
     $sth->finish();
     $sth->finish();
-    return ( $description, $dateofbirthrequired, $upperagelimit,
-        $category_type );
+    return $data;
 }    # sub getborrowercategory
 
 =head2 ethnicitycategories
 }    # sub getborrowercategory
 
 =head2 ethnicitycategories
@@ -1576,16 +1441,16 @@ sub fixEthnicity {
     return $data->{'name'};
 }    # sub fixEthnicity
 
     return $data->{'name'};
 }    # sub fixEthnicity
 
-=head2 get_age
+=head2 GetAge
 
 
-  $dateofbirth,$date = &get_age($date);
+  $dateofbirth,$date = &GetAge($date);
 
 this function return the borrowers age with the value of dateofbirth
 
 =cut
 
 #'
 
 this function return the borrowers age with the value of dateofbirth
 
 =cut
 
 #'
-sub get_age {
+sub GetAge{
     my ( $date, $date_ref ) = @_;
 
     if ( not defined $date_ref ) {
     my ( $date, $date_ref ) = @_;
 
     if ( not defined $date_ref ) {
@@ -1649,47 +1514,9 @@ sub add_member_orgs {
 
 }    # sub add_member_orgs
 
 
 }    # sub add_member_orgs
 
-=head2 GetBorrowersFromSurname
+=head2 GetCities (OUEST-PROVENCE)
 
 
-=over 4
-
-\@resutlts = GetBorrowersFromSurname($surname)
-this function get the list of borrower names like $surname.
-return :
-the table of results in @results
-
-=back
-
-=cut
-
-sub GetBorrowersFromSurname {
-    my ($searchstring) = @_;
-    my $dbh = C4::Context->dbh;
-    $searchstring =~ s/\'/\\\'/g;
-    my @data  = split( ' ', $searchstring );
-    my $count = @data;
-    my $query = qq|
-        SELECT   surname,firstname
-        FROM     borrowers
-        WHERE    (surname like ?)
-        ORDER BY surname
-    |;
-    my $sth = $dbh->prepare($query);
-    $sth->execute("$data[0]%");
-    my @results;
-    $count = 0;
-
-    while ( my $data = $sth->fetchrow_hashref ) {
-        push( @results, $data );
-        $count++;
-    }
-    $sth->finish;
-    return ( $count, \@results );
-}
-
-=head2 citycaracteristiques (OUEST-PROVENCE)
-
-  ($id_cityarrayref, $city_hashref) = &citycaracteristic();
+  ($id_cityarrayref, $city_hashref) = &GetCities();
 
 Looks up the different city and zip in the database. Returns two
 elements: a reference-to-array, which lists the zip city
 
 Looks up the different city and zip in the database. Returns two
 elements: a reference-to-array, which lists the zip city
@@ -1765,7 +1592,7 @@ C<&$member>this is the borrowernumber
 
 =cut
 
 
 =cut
 
-sub DeleteBorrower {
+sub MoveMemberToDeleted {
     my ($member) = @_;
     my $dbh = C4::Context->dbh;
     my $query;
     my ($member) = @_;
     my $dbh = C4::Context->dbh;
     my $query;
@@ -1777,80 +1604,69 @@ sub DeleteBorrower {
     my @data = $sth->fetchrow_array;
     $sth->finish;
     $sth =
     my @data = $sth->fetchrow_array;
     $sth->finish;
     $sth =
-      $dbh->prepare( "Insert into deletedborrowers values ("
+      $dbh->prepare( "INSERT INTO deletedborrowers VALUES ("
           . ( "?," x ( scalar(@data) - 1 ) )
           . "?)" );
     $sth->execute(@data);
     $sth->finish;
           . ( "?," x ( scalar(@data) - 1 ) )
           . "?)" );
     $sth->execute(@data);
     $sth->finish;
-    $query = qq|DELETE 
-                 FROM borrowers 
-                 WHERE borrowernumber=?|;
-    $sth = $dbh->prepare($query);
-    $sth->execute($member);
-    $sth->finish;
-    $query = qq|DELETE 
-                 FROM  reserves 
-                 WHERE borrowernumber=?|;
-    $sth = $dbh->prepare($query);
-    $sth->execute($member);
-    $sth->finish;
-    
-    # logging to action_log
-    &logaction(C4::Context->userenv->{'number'},"MEMBERS","DELETE",$member,"") 
-        if C4::Context->preference("BorrowersLog");
 }
 
 }
 
-=head2 DelBorrowerCompletly
+=head2 DelMember
 
 
-DelBorrowerCompletly($borrowernumber);
+DelMember($borrowernumber);
 
 This function remove directly a borrower whitout writing it on deleteborrower.
 
 This function remove directly a borrower whitout writing it on deleteborrower.
++ Deletes reserves for the borrower
 
 =cut
 
 
 =cut
 
-sub DelBorrowerCompletly {
+sub DelMember {
     my $dbh            = C4::Context->dbh;
     my $borrowernumber = shift;
     my $dbh            = C4::Context->dbh;
     my $borrowernumber = shift;
-    return unless $borrowernumber;    # date is mandatory.
-    my $query = "
-       DELETE *
+       warn "in delmember with $borrowernumber";
+    return unless $borrowernumber;    # borrowernumber is mandatory.
+
+    my $query = qq|DELETE 
+                 FROM  reserves 
+                 WHERE borrowernumber=?|;
+    my $sth = $dbh->prepare($query);
+    $sth->execute($borrowernumber);
+    $sth->finish;
+    $query = "
+       DELETE
        FROM borrowers
        WHERE borrowernumber = ?
    ";
        FROM borrowers
        WHERE borrowernumber = ?
    ";
-    my $sth = $dbh->prepare($query);
+    $sth = $dbh->prepare($query);
     $sth->execute($borrowernumber);
     $sth->execute($borrowernumber);
+    $sth->finish;
+    &logaction(C4::Context->userenv->{'number'},"MEMBERS","DELETE",$borrowernumber,"") 
+        if C4::Context->preference("BorrowersLog");
     return $sth->rows;
 }
 
     return $sth->rows;
 }
 
-=head2 member_reregistration (OUEST-PROVENCE)
-
-automatic reregistration in borrowers table 
-with dateexpiry .
+=head2 ExtendMemberSubscriptionTo (OUEST-PROVENCE)
 
 
+$date= ExtendMemberSubscriptionTo($borrowerid, $date);
+Extending the subscription to a given date or to the expiry date calculated on local date.
+returns date 
 =cut
 
 =cut
 
-sub GetMembeReregistration {
-    my ( $categorycode, $borrowerid ) = @_;
+sub ExtendMemberSubscriptionTo {
+    my ( $borrowerid,$date) = @_;
     my $dbh = C4::Context->dbh;
     my $dbh = C4::Context->dbh;
-    my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) =
-      localtime(time);
-    $mon++;
-    $year = $year + 1900;
-    if ( $mon < '10' ) {
-        $mon = "0" . $mon;
-    }
-    if ( $mday < '10' ) {
-        $mday = "0" . $mday;
-    }
-    my $today = sprintf("%04d-%02d-%02d",$year,$mon,$mday);
-    my $dateexpiry = calcexpirydate( $categorycode, $today );
-    my $query      = qq|   UPDATE borrowers 
-                       SET  dateexpiry='$dateexpiry' 
-                       WHERE borrowernumber='$borrowerid'|;
-    my $sth = $dbh->prepare($query);
-    $sth->execute;
-    $sth->finish;
-    return $dateexpiry;
+    unless ($date){
+      $date=POSIX::strftime("%Y-%m-%d",localtime(time));
+      my $borrower = GetMember($borrowerid,'borrowernumber');
+      $date = GetExpiryDate( $borrower->{'categorycode'}, $date );
+    }
+    my $sth = $dbh->do(<<EOF);
+UPDATE borrowers 
+SET  dateexpiry='$date' 
+WHERE borrowernumber='$borrowerid'
+EOF
+    return $date if ($sth);
+    return 0;
 }
 
 =head2 GetRoadTypes (OUEST-PROVENCE)
 }
 
 =head2 GetRoadTypes (OUEST-PROVENCE)
@@ -1866,9 +1682,10 @@ codes, and a reference-to-hash, which maps the road type of the road .
 
 sub GetRoadTypes {
     my $dbh   = C4::Context->dbh;
 
 sub GetRoadTypes {
     my $dbh   = C4::Context->dbh;
-    my $query = qq|SELECT roadtypeid,road_type 
-               FROM roadtype 
-               ORDER BY road_type|;
+    my $query = qq|
+SELECT roadtypeid,road_type 
+FROM roadtype 
+ORDER BY road_type|;
     my $sth = $dbh->prepare($query);
     $sth->execute();
     my %roadtype;
     my $sth = $dbh->prepare($query);
     $sth->execute();
     my %roadtype;
@@ -1896,15 +1713,15 @@ sub GetRoadTypes {
 
 
 
 
 
 
-=head2 GetBorrowersTitles (OUEST-PROVENCE)
+=head2 GetTitles (OUEST-PROVENCE)
 
 
-  ($borrowertitle)= &GetBorrowersTitles();
+  ($borrowertitle)= &GetTitles();
 
 Looks up the different title . Returns array  with all borrowers title
 
 =cut
 
 
 Looks up the different title . Returns array  with all borrowers title
 
 =cut
 
-sub GetBorrowersTitles {
+sub GetTitles {
     my @borrowerTitle = split /,|\|/,C4::Context->preference('BorrowersTitles');
     unshift( @borrowerTitle, "" );
     return ( \@borrowerTitle);
     my @borrowerTitle = split /,|\|/,C4::Context->preference('BorrowersTitles');
     unshift( @borrowerTitle, "" );
     return ( \@borrowerTitle);
@@ -1925,9 +1742,10 @@ C<&$roadtypeid>this is the value of roadtype s
 sub GetRoadTypeDetails {
     my ($roadtypeid) = @_;
     my $dbh          = C4::Context->dbh;
 sub GetRoadTypeDetails {
     my ($roadtypeid) = @_;
     my $dbh          = C4::Context->dbh;
-    my $query        = qq|SELECT road_type 
-               FROM roadtype 
-               WHERE roadtypeid=?|;
+    my $query        = qq|
+SELECT road_type 
+FROM roadtype 
+WHERE roadtypeid=?|;
     my $sth = $dbh->prepare($query);
     $sth->execute($roadtypeid);
     my $roadtype = $sth->fetchrow;
     my $sth = $dbh->prepare($query);
     $sth->execute($roadtypeid);
     my $roadtype = $sth->fetchrow;