Adding barcode_decode syspref
[koha.git] / circ / circulation.pl
index 69a106c..943656a 100755 (executable)
 
 use strict;
 use CGI;
-use C4::Circulation::Circ2;
-use C4::Members;
 use C4::Output;
 use C4::Print;
-use C4::Auth;
-use C4::Interface::CGI::Output;
+use C4::Auth qw/:DEFAULT get_session/;
+use C4::Dates qw/format_date/;
 use C4::Branch; # GetBranches
 use C4::Koha;   # GetPrinter
+use C4::Circulation;
+use C4::Members;
+use C4::Biblio;
+use C4::Reserves;
+use C4::Context;
+use CGI::Session;
+
 use Date::Calc qw(
   Today
   Today_and_Now
@@ -40,15 +45,45 @@ use Date::Calc qw(
   Date_to_Days
 );
 
-use C4::Biblio;
-use C4::Reserves2;
-use C4::Circulation::Date;
 
 #
 # PARAMETERS READING
 #
 my $query = new CGI;
 
+# new op dev the branch and the printer are now defined by the userenv
+# but first we have to check if someone has tried to change them
+
+my $branch = $query->param('branch');
+if ($branch){
+    # update our session so the userenv is updated
+    my $dbh=C4::Context->dbh;
+    my $sessionID = $query->cookie("CGISESSID") ;
+    my $session = get_session($sessionID);
+    $session->param('branch',$branch);
+    my $branchname = GetBranchName($branch);
+    $session->param('branchname',$branchname);
+}
+
+my $printer = $query->param('printer');
+if ($printer){
+    # update our session so the userenv is updated
+       my $dbh=C4::Context->dbh;
+       my $sessionID = $query->cookie("CGISESSID") ;
+       my $session = get_session($sessionID);
+       $session->param('branchprinter',$printer);
+
+}
+if (!C4::Context->userenv && !$branch){
+       my $sessionID = $query->cookie("CGISESSID") ;
+       my $session = get_session($sessionID);
+       if ($session->param('branch') eq 'NO_LIBRARY_SET'){
+               # no branch set we can't issue
+               print $query->redirect("/cgi-bin/koha/circ/selectbranchprinter.pl");
+               exit;
+       }
+}
+
 my ( $template, $loggedinuser, $cookie ) = get_template_and_user (
     {
         template_name   => 'circ/circulation.tmpl',
@@ -61,16 +96,19 @@ my ( $template, $loggedinuser, $cookie ) = get_template_and_user (
 my $branches = GetBranches();
 
 my $printers = GetPrinters();
-my $printer = GetPrinter($query, $printers);
+
+my @failedrenews = $query->param('failedrenew');
+my @renew_failed;
+for (@failedrenews) { $renew_failed[$_] = 1; } 
 
 my $findborrower = $query->param('findborrower');
 $findborrower =~ s|,| |g;
-$findborrower =~ s|'| |g;
+#$findborrower =~ s|'| |g;
 my $borrowernumber = $query->param('borrowernumber');
 
-# new op dev the branch and the printer are now defined by the userenv
-my $branch  = C4::Context->userenv->{'branch'};
-my $printer = C4::Context->userenv->{'branchprinter'};
+$branch  = C4::Context->userenv->{'branch'};   
+$printer = C4::Context->userenv->{'branchprinter'};
+
 
 # If Autolocated is not activated, we show the Circulation Parameters to chage settings of librarian
     if (C4::Context->preference("AutoLocation") ne 1)
@@ -81,14 +119,18 @@ my $printer = C4::Context->userenv->{'branchprinter'};
         }
 
 my $barcode        = $query->param('barcode') || '';
+
+$barcode = barcodedecode($barcode) if(C4::Context->preference('itemBarcodeInputFilter'));
 my $year           = $query->param('year');
 my $month          = $query->param('month');
 my $day            = $query->param('day');
 my $stickyduedate  = $query->param('stickyduedate');
+my $duedatespec    = $query->param('duedatespec');
 my $issueconfirmed = $query->param('issueconfirmed');
 my $cancelreserve  = $query->param('cancelreserve');
 my $organisation   = $query->param('organisations');
 my $print          = $query->param('print');
+my $newexpiry = $query->param('dateexpiry');
 
 #set up cookie.....
 # my $branchcookie;
@@ -97,18 +139,21 @@ my $print          = $query->param('print');
 #     $branchcookie = $query->cookie(-name=>'branch', -value=>"$branch", -expires=>'+1y');
 #     $printercookie = $query->cookie(-name=>'printer', -value=>"$printer", -expires=>'+1y');
 # }
-
-my %env
-  ; # FIXME env is used as an "environment" variable. Could be dropped probably...
-
 #
-$env{'branchcode'}   = $branch;
-$env{'printer'}      = $printer;
-$env{'organisation'} = $organisation;
 
-# $env{'queue'}=$printer;
+my ($datedue,$invalidduedate);
+if ($duedatespec) {
+       $datedue =  C4::Dates->new($duedatespec);
+       $invalidduedate=1 unless $datedue;
+}
+
+#if (defined($year)) {
+#        $duedatespec = "$year-$month-$day";
+#} else {
+#        ($year, $month, $day) = ($duedatespec) ? split /-/, $duedatespec : (0,0,0);
+#}
 
-my @datearr = localtime( time() );
+my @datearr = localtime();
 
 # FIXME - Could just use POSIX::strftime("%Y%m%d", localtime);
 my $todaysdate =
@@ -121,12 +166,7 @@ if ( $barcode eq '' && $print eq 'maybe' ) {
     $print = 'yes';
 }
 
-my $inprocess = $query->param('inprocess');
-if ( $barcode eq '' ) {
-    $inprocess = '';
-}
-else {
-}
+my $inprocess = ($barcode eq '') ? '' : $query->param('inprocess');
 
 if ( $barcode eq '' && $query->param('charges') eq 'yes' ) {
     $template->param(
@@ -136,7 +176,7 @@ if ( $barcode eq '' && $query->param('charges') eq 'yes' ) {
 }
 
 if ( $print eq 'yes' && $borrowernumber ne '' ) {
-    printslip( \%env, $borrowernumber );
+    printslip( $borrowernumber );
     $query->param( 'borrowernumber', '' );
     $borrowernumber = '';
 }
@@ -149,7 +189,7 @@ my $borrowerslist;
 my $message;
 if ($findborrower) {
     my ( $count, $borrowers ) =
-      BornameSearch( \%env, $findborrower, 'cardnumber', 'web' );
+      SearchMember($findborrower, 'cardnumber', 'web' );
     my @borrowers = @$borrowers;
     if ( $#borrowers == -1 ) {
         $query->param( 'findborrower', '' );
@@ -168,39 +208,45 @@ if ($findborrower) {
 # get the borrower information.....
 my $borrower;
 my @lines;
-
 if ($borrowernumber) {
-    $borrower = getpatroninformation( \%env, $borrowernumber, 0 );
-    my ( $od, $issue, $fines ) = borrdata2( \%env, $borrowernumber );
+    $borrower = GetMemberDetails( $borrowernumber, 0 );
+    my ( $od, $issue, $fines ) = GetMemberIssuesAndFines( $borrowernumber );
 
     # Warningdate is the date that the warning starts appearing
     my ( $today_year,   $today_month,   $today_day )   = Today();
     my ( $warning_year, $warning_month, $warning_day ) = split /-/,
       $borrower->{'dateexpiry'};
-
+    my ( $enrol_year, $enrol_month, $enrol_day ) = split /-/,
+      $borrower->{'dateenrolled'};
     # Renew day is calculated by adding the enrolment period to today
     my ( $renew_year, $renew_month, $renew_day ) =
-      Add_Delta_YM( $today_year, $today_month, $today_day,
-        $borrower->{'enrolmentperiod'}, 0 );
-    # if the expiry date is before today
-    if ( Date_to_Days( $today_year, $today_month, $today_day ) >
-        Date_to_Days( $warning_year, $warning_month, $warning_day ) )
+      Add_Delta_YM( $enrol_year, $enrol_month, $enrol_day,
+        0 , $borrower->{'enrolmentperiod'}) if ($enrol_year*$enrol_month*$enrol_day>0);
+    # if the expiry date is before today ie they have expired
+    if ( $warning_year*$warning_month*$warning_day==0 
+      || Date_to_Days( $today_year, $today_month, $today_day ) 
+         > Date_to_Days( $warning_year, $warning_month, $warning_day ) )
     {
-
-        #borrowercard expired or nearly expired, warn the librarian
+        #borrowercard expired, no issues
         $template->param(
-            flagged       => "1",
-            warndeparture => "1",
-            renewaldate   => "$renew_year-$renew_month-$renew_day"
+                       flagged => "1",
+            noissues       => "1",
+            expired => format_date($borrower->{dateexpiry}),
+            renewaldate   => format_date("$renew_year-$renew_month-$renew_day")
         );
     }
     # check for NotifyBorrowerDeparture
-        if (C4::Context->preference('NotifyBorrowerDeparture') &&
-            Date_to_Days(Add_Delta_Days($warning_year,$warning_month,$warning_day,- C4::Context->preference('NotifyBorrowerDeparture'))) <
-            Date_to_Days( $today_year, $today_month, $today_day ) ) 
-        {
-            $template->param("warndeparture" => 1);
-        }
+       elsif ( C4::Context->preference('NotifyBorrowerDeparture') &&
+               Date_to_Days(Add_Delta_Days($warning_year,$warning_month,$warning_day,- C4::Context->preference('NotifyBorrowerDeparture'))) <
+               Date_to_Days( $today_year, $today_month, $today_day ) ) 
+       {
+               # borrower card soon to expire warn librarian
+               $template->param("warndeparture" => format_date($borrower->{dateexpiry}),
+                       flagged       => "1",);
+               if ( C4::Context->preference('ReturnBeforeExpiry')){
+                       $template->param("returnbeforeexpiry" => 1);
+               }
+       }
     $template->param(
         overduecount => $od,
         issuecount   => $issue,
@@ -214,28 +260,30 @@ if ($borrowernumber) {
 #
 
 if ($barcode) {
-    $barcode = cuecatbarcodedecode($barcode);
-    my ( $datedue, $invalidduedate ) = fixdate( $year, $month, $day );
-    if ($issueconfirmed) {
-        issuebook( \%env, $borrower, $barcode, $datedue, $cancelreserve );
-        $inprocess = 1;
-    }
-    else {
-        my ( $error, $question ) =
-          canbookbeissued( \%env, $borrower, $barcode, $year, $month, $day,
-            $inprocess );
-        my $noerror    = 1;
-        my $noquestion = 1;
-#         Get the item title for more information
-    my $getmessageiteminfo  = getiteminformation( undef, $barcode );
-    
-        foreach my $impossible ( keys %$error ) {
+       # always check for blockers on issuing
+       my ( $error, $question ) =
+         CanBookBeIssued( $borrower, $barcode, $datedue , $inprocess );
+       my $noerror    = 1;
+       foreach my $impossible ( keys %$error ) {
             $template->param(
                 $impossible => $$error{$impossible},
                 IMPOSSIBLE  => 1
             );
             $noerror = 0;
         }
+    
+       if ($issueconfirmed && $noerror) {
+               # we have no blockers for issuing and any issues needing confirmation have been resolved
+        AddIssue( $borrower, $barcode, $datedue, $cancelreserve );
+        $inprocess = 1;
+    }
+       elsif ($issueconfirmed){
+       }
+    else {
+        my $noquestion = 1;
+#         Get the item title for more information
+       my $getmessageiteminfo  = GetBiblioFromItemNumber(undef,$barcode);
+    
         foreach my $needsconfirmation ( keys %$question ) {
             $template->param(
                 $needsconfirmation => $$question{$needsconfirmation},
@@ -245,18 +293,17 @@ if ($barcode) {
             $noquestion = 0;
         }
         $template->param(
-            day   => $day,
-            month => $month,
-            year  => $year
+                        itemhomebranch => $getmessageiteminfo->{'homebranch'} ,                     
+                        duedatespec => $duedatespec,
         );
         if ( $noerror && ( $noquestion || $issueconfirmed ) ) {
-            issuebook( \%env, $borrower, $barcode, $datedue );
+            AddIssue( $borrower, $barcode, $datedue );
             $inprocess = 1;
         }
     }
     
 # FIXME If the issue is confirmed, we launch another time borrdata2, now display the issue count after issue 
-        my ( $od, $issue, $fines ) = borrdata2( \%env, $borrowernumber );
+        my ( $od, $issue, $fines ) = GetMemberIssuesAndFines( $borrowernumber );
         $template->param(
         issuecount   => $issue,
         );
@@ -264,7 +311,7 @@ if ($barcode) {
 
 # reload the borrower info for the sake of reseting the flags.....
 if ($borrowernumber) {
-    $borrower = getpatroninformation( \%env, $borrowernumber, 0 );
+    $borrower = GetMemberDetails( $borrowernumber, 0 );
 }
 
 ##################################################################################
@@ -274,30 +321,29 @@ if ($borrowernumber) {
 
     # new op dev
     # now we show the status of the borrower's reservations
-    my @borrowerreserv = GetReservations( 0, $borrowernumber );
+    my @borrowerreserv = GetReservesFromBorrowernumber($borrowernumber );
     my @reservloop;
     my @WaitingReserveLoop;
     
     foreach my $num_res (@borrowerreserv) {
         my %getreserv;
         my %getWaitingReserveInfo;
-        my %env;
-        my $getiteminfo  = getiteminformation( $num_res->{'itemnumber'} );
-        my $itemtypeinfo = getitemtypeinfo( $getiteminfo->{'itemtype'} );
+        my $getiteminfo  = GetBiblioFromItemNumber( $num_res->{'itemnumber'} );
+        my $itemtypeinfo = getitemtypeinfo( (C4::Context->preference('item-level_itype')) ? $getiteminfo->{'itype'} : $getiteminfo->{'itemtype'} );
         my ( $transfertwhen, $transfertfrom, $transfertto ) =
-          checktransferts( $num_res->{'itemnumber'} );
+          GetTransfers( $num_res->{'itemnumber'} );
 
         $getreserv{waiting}       = 0;
         $getreserv{transfered}    = 0;
         $getreserv{nottransfered} = 0;
 
         $getreserv{reservedate}    = format_date( $num_res->{'reservedate'} );
-        $getreserv{biblionumber}   = $getiteminfo->{'biblionumber'};
         $getreserv{title}          = $getiteminfo->{'title'};
         $getreserv{itemtype}       = $itemtypeinfo->{'description'};
         $getreserv{author}         = $getiteminfo->{'author'};
         $getreserv{barcodereserv}  = $getiteminfo->{'barcode'};
         $getreserv{itemcallnumber} = $getiteminfo->{'itemcallnumber'};
+               $getreserv{biblionumber}   = $getiteminfo->{'biblionumber'};
 
         #         check if we have a waiting status for reservations
         if ( $num_res->{'found'} eq 'W' ) {
@@ -305,6 +351,7 @@ if ($borrowernumber) {
             $getreserv{waiting} = 1;
 #     genarate information displaying only waiting reserves
         $getWaitingReserveInfo{title}        = $getiteminfo->{'title'};
+        $getWaitingReserveInfo{biblionumber}   = $getiteminfo->{'biblionumber'};
         $getWaitingReserveInfo{itemtype}    = $itemtypeinfo->{'description'};
         $getWaitingReserveInfo{author}        = $getiteminfo->{'author'};
         $getWaitingReserveInfo{reservedate}    = format_date( $num_res->{'reservedate'} );
@@ -331,8 +378,8 @@ if ($borrowernumber) {
 
 #         if we don't have a reserv on item, we put the biblio infos and the waiting position
         if ( $getiteminfo->{'title'} eq '' ) {
-            my $getbibinfo = GetBiblioItemData( $num_res->{'biblionumber'} );
-            my $getbibtype = getitemtypeinfo( $getbibinfo->{'itemtype'} );
+            my $getbibinfo = GetBiblioData( $num_res->{'biblionumber'} );
+            my $getbibtype = getitemtypeinfo( $getbibinfo->{'itemtype'} );  # fixme - we should have item-level reserves here ?
             $getreserv{color}           = 'inwait';
             $getreserv{title}           = $getbibinfo->{'title'};
             $getreserv{waitingposition} = $num_res->{'priority'};
@@ -340,7 +387,7 @@ if ($borrowernumber) {
             $getreserv{itemtype}        = $getbibtype->{'description'};
             $getreserv{author}          = $getbibinfo->{'author'};
             $getreserv{itemcallnumber}  = '----------';
-
+               $getreserv{biblionumber}    = $num_res->{'biblionumber'};
         }
         push( @reservloop, \%getreserv );
 
@@ -362,8 +409,8 @@ if ($borrowernumber) {
 # make the issued books table.
 my $todaysissues = '';
 my $previssues   = '';
-my @realtodayissues;
-my @realprevissues;
+my @todaysissues;
+my @previousissues;
 my $allowborrow;
 ## ADDED BY JF: new itemtype issuingrules counter stuff
 my $issued_itemtypes_loop;
@@ -371,156 +418,62 @@ my $issued_itemtypes_count;
 my $issued_itemtypes_allowed_count;    # hashref with total allowed by itemtype
 my $issued_itemtypes_remaining;        # hashref with remaining
 my $issued_itemtypes_flags;            #hashref that stores flags
+my @issued_itemtypes_count_loop;
 
 if ($borrower) {
 
 # get each issue of the borrower & separate them in todayissues & previous issues
-    my @todaysissues;
-    my @previousissues;
-    my $issueslist = getissues($borrower);
+    my ($countissues,$issueslist) = GetPendingIssues($borrower->{'borrowernumber'});
 
     # split in 2 arrays for today & previous
-    my $dbh = C4::Context->dbh;
-    foreach my $it ( keys %$issueslist ) {
-        my $issuedate = $issueslist->{$it}->{'timestamp'};
+    foreach my $it ( @$issueslist ) {
+        my $issuedate = $it->{'issuedate'};
         $issuedate =~ s/-//g;
         $issuedate = substr( $issuedate, 0, 8 );
-
-        # to let perl sort this correctly
-        $issueslist->{$it}->{'timestamp'} =~ s/(-|\:| )//g;
+               ($it->{'charge'}, $it->{'itemtype_charge'}) = GetIssuingCharges(
+                                               $it->{'itemnumber'}, $borrower->{'borrowernumber'}
+               );
+               $it->{'charge'} = sprintf("%.2f", $it->{'charge'});
+        ($it->{'can_renew'}, $it->{'can_renew_error'}) = CanBookBeRenewed( 
+                                               $borrower->{'borrowernumber'},$it->{'itemnumber'}
+               );
+               my ($restype, $reserves) = CheckReserves($it->{'itemnumber'});
+               ($restype) and $it->{'can_renew'} = 0;
+
+               $it->{'dd'} = format_date($it->{'date_due'});
+        my $datedue = $it->{'date_due'};
+        $datedue =~ s/-//g;
+               $it->{'od'} = ($datedue < $todaysdate) ? 1 : 0 ;
+        ($it->{'author'} eq '') and $it->{'author'} = ' ';
+        $it->{'renew_failed'} = $renew_failed[$it->{'itemnumber'}];
+        # ADDED BY JF: NEW ITEMTYPE COUNT DISPLAY
+        $issued_itemtypes_count->{ $it->{'itemtype'} }++;
 
         if ( $todaysdate == $issuedate ) {
-            (
-                $issueslist->{$it}->{'charge'},
-                $issueslist->{$it}->{'itemtype_charge'}
-              )
-              = calc_charges(
-                $dbh,
-                $issueslist->{$it}->{'itemnumber'},
-                $borrower->{'borrowernumber'}
-              );
-            $issueslist->{$it}->{'charge'} =
-              sprintf( "%.2f", $issueslist->{$it}->{'charge'} );
-            (
-                $issueslist->{$it}->{'can_renew'},
-                $issueslist->{$it}->{'can_renew_error'}
-              )
-              = renewstatus(
-                \%env,
-                $borrower->{'borrowernumber'},
-                $issueslist->{$it}->{'itemnumber'}
-              );
-            my ( $restype, $reserves ) =
-              CheckReserves( $issueslist->{$it}->{'itemnumber'} );
-            if ($restype) {
-                $issueslist->{$it}->{'can_renew'} = 0;
-            }
-            push @todaysissues, $issueslist->{$it};
-        }
-        else {
-            (
-                $issueslist->{$it}->{'charge'},
-                $issueslist->{$it}->{'itemtype_charge'}
-              )
-              = calc_charges(
-                $dbh,
-                $issueslist->{$it}->{'itemnumber'},
-                $borrower->{'borrowernumber'}
-              );
-            $issueslist->{$it}->{'charge'} =
-              sprintf( "%.2f", $issueslist->{$it}->{'charge'} );
-            (
-                $issueslist->{$it}->{'can_renew'},
-                $issueslist->{$it}->{'can_renew_error'}
-              )
-              = renewstatus(
-                \%env,
-                $borrower->{'borrowernumber'},
-                $issueslist->{$it}->{'itemnumber'}
-              );
-            my ( $restype, $reserves ) =
-              CheckReserves( $issueslist->{$it}->{'itemnumber'} );
-            if ($restype) {
-                $issueslist->{$it}->{'can_renew'} = 0;
-            }
-            push @previousissues, $issueslist->{$it};
+            push @todaysissues, $it;
+        } else {
+            push @previousissues, $it;
         }
     }
-    my $od;    # overdues
-    my $i = 0;
-    my $togglecolor;
-
-    # parses today & build Template array
-    foreach my $book ( sort { $b->{'timestamp'} <=> $a->{'timestamp'} }
-        @todaysissues )
-    {
-        #warn "TIMESTAMP".$book->{'timestamp'};
-        # ADDED BY JF: NEW ITEMTYPE COUNT DISPLAY
-        $issued_itemtypes_count->{ $book->{'itemtype'} }++;
-
-        my $dd      = $book->{'date_due'};
-        my $datedue = $book->{'date_due'};
-
-        #$dd=format_date($dd);
-        $datedue =~ s/-//g;
-        if ( $datedue < $todaysdate ) {
-            $od = 1;
-        }
-        else {
-            $od = 0;
-        }
-        if ( $i % 2 ) {
-            $togglecolor = 0;
-        }
-        else {
-            $togglecolor = 1;
-        }
-        $book->{'togglecolor'} = $togglecolor;
-        $book->{'od'}          = format_date($od);
-        $book->{'dd'}          = format_date($dd);
-        if ( $book->{'author'} eq '' ) {
-            $book->{'author'} = ' ';
-        }
-        push @realtodayissues, $book;
-        $i++;
+       if (C4::Context->preference("todaysIssuesDefaultSortOrder") eq 'asc'){
+               @todaysissues   = sort { $a->{'timestamp'} cmp $b->{'timestamp'} } @todaysissues;
+       }
+       else {
+               @todaysissues   = sort { $b->{'timestamp'} cmp $a->{'timestamp'} } @todaysissues;
+       }
+       if (C4::Context->preference("previousIssuesDefaultSortOrder") eq 'asc'){
+               @previousissues = sort { $a->{'date_due' } cmp $b->{'date_due' } } @previousissues;
+       }
+       else {
+               @previousissues = sort { $b->{'date_due' } cmp $a->{'date_due' } } @previousissues;
+       }
+    my $i = 1;
+       foreach my $book (@todaysissues) {
+        $book->{'togglecolor'} = (++$i % 2) ? 0 : 1 ;
     }
-
-    # parses previous & build Template array
-    $i = 0;
-    foreach my $book ( sort { $a->{'date_due'} cmp $b->{'date_due'} }
-        @previousissues )
-    {
-
-        # ADDED BY JF: NEW ITEMTYPE COUNT DISPLAY
-        $issued_itemtypes_count->{ $book->{'itemtype'} }++;
-
-        my $dd      = format_date($book->{'date_due'});
-        my $datedue = format_date($book->{'date_due'});
-
-        #$dd=format_date($dd);
-        my $pcolor = '';
-        my $od     = '';
-        $datedue =~ s/-//g;
-        if ( $datedue < $todaysdate ) {
-            $od = 1;
-        }
-        else {
-            $od = 0;
-        }
-        if ( $i % 2 ) {
-            $togglecolor = 0;
-        }
-        else {
-            $togglecolor = 1;
-        }
-        $book->{'togglecolor'} = $togglecolor;
-        $book->{'dd'}          = $dd;
-        $book->{'od'}          = $od;
-        if ( $book->{'author'} eq '' ) {
-            $book->{'author'} = ' ';
-        }
-        push @realprevissues, $book;
-        $i++;
+    $i = 1;
+       foreach my $book (@previousissues) {
+        $book->{'togglecolor'} = (++$i % 2) ? 0 : 1 ;
     }
 }
 
@@ -536,12 +489,13 @@ FROM issuingrules
   LEFT JOIN itemtypes ON (itemtypes.itemtype=issuingrules.itemtype)
   WHERE categorycode=?
 " );
-my @issued_itemtypes_count;
+#my @issued_itemtypes_count;  # huh?
 $issueqty_sth->execute("*");
+
 while ( my $data = $issueqty_sth->fetchrow_hashref() ) {
 
     # subtract how many of each this borrower has
-    $data->{'count'} = $issued_itemtypes_count->{ $data->{'description'} };
+    $data->{'count'} = $issued_itemtypes_count->{ $data->{'description'} };  
     $data->{'left'}  =
       ( $data->{'maxissueqty'} -
           $issued_itemtypes_count->{ $data->{'description'} } );
@@ -553,10 +507,10 @@ while ( my $data = $issueqty_sth->fetchrow_hashref() ) {
         || ( $data->{'itemtype'} eq "*" )
         || ( $data->{'itemtype'} eq "CIRC" ) )
     {
-        push @issued_itemtypes_count, $data;
+        push @issued_itemtypes_count_loop, $data;
     }
 }
-$issued_itemtypes_loop = \@issued_itemtypes_count;
+$issued_itemtypes_loop = \@issued_itemtypes_count_loop;
 
 #### / JF
 
@@ -566,9 +520,9 @@ my $CGIselectborrower;
 if ($borrowerslist) {
     foreach (
         sort {
-                $a->{'surname'}
-              . $a->{'firstname'} cmp $b->{'surname'}
-              . $b->{'firstname'}
+                lc $a->{'surname'}
+              . lc $a->{'firstname'} cmp lc $b->{'surname'}
+              . lc $b->{'firstname'}
         } @$borrowerslist
       )
     {
@@ -578,6 +532,8 @@ if ($borrowerslist) {
     }
     $CGIselectborrower = CGI::scrolling_list(
         -name     => 'borrowernumber',
+               -class     => 'focus',
+               -id          => 'borrowernumber',
         -values   => \@values,
         -labels   => \%labels,
         -size     => 7,
@@ -591,7 +547,7 @@ my $flags = $borrower->{'flags'};
 my $flag;
 
 foreach $flag ( sort keys %$flags ) {
-
+    $template->param( flagged=> 1);
     $flags->{$flag}->{'message'} =~ s/\n/<br>/g;
     if ( $flags->{$flag}->{'noissues'} ) {
         $template->param(
@@ -642,14 +598,15 @@ foreach $flag ( sort keys %$flags ) {
             );
 
             my $items = $flags->{$flag}->{'itemlist'};
-            {
-                my @itemswaiting;
-                foreach my $item (@$items) {
-                    my ($iteminformation) =
-                        getiteminformation( $item->{'itemnumber'}, 0 );
-                    push @itemswaiting, $iteminformation;
-                }
-            }
+# useless ???
+#             {
+#                 my @itemswaiting;
+#                 foreach my $item (@$items) {
+#                     my ($iteminformation) =
+#                         getiteminformation( $item->{'itemnumber'}, 0 );
+#                     push @itemswaiting, $iteminformation;
+#                 }
+#             }
             if ( $query->param('module') ne 'returns' ) {
                 $template->param( nonreturns => 'true' );
             }
@@ -689,6 +646,10 @@ if ( C4::Context->preference("memberofinstitution") ) {
 
 $amountold = $temp[1];
 
+my $borrowercategory = GetBorrowercategory( $borrower->{'categorycode'} );
+my $category_type = $borrowercategory->{'category_type'};
+( $template->param( adultborrower => 1 ) ) if ( $category_type eq 'A' );
+
 $template->param(
     issued_itemtypes_count_loop => $issued_itemtypes_loop,
     findborrower                => $findborrower,
@@ -699,36 +660,36 @@ $template->param(
     printername                 => $printer,
     firstname                   => $borrower->{'firstname'},
     surname                     => $borrower->{'surname'},
+       dateexpiry => format_date($newexpiry),
     expiry                      =>
       $borrower->{'dateexpiry'},    #format_date($borrower->{'dateexpiry'}),
     categorycode      => $borrower->{'categorycode'},
-    streetaddress     => $borrower->{'address'},
-    emailaddress      => $borrower->{'emailaddress'},
+    address     => $borrower->{'address'},
+    address2     => $borrower->{'address2'},
+    email      => $borrower->{'email'},
+       emailpro           => $borrower->{'emailpro'},
     borrowernotes     => $borrower->{'borrowernotes'},
     city              => $borrower->{'city'},
-    phone             => $borrower->{'phone'},
+    phone             => $borrower->{'phone'} || $borrower->{'mobile'},
     cardnumber        => $borrower->{'cardnumber'},
     amountold         => $amountold,
     barcode           => $barcode,
     stickyduedate     => $stickyduedate,
     message           => $message,
     CGIselectborrower => $CGIselectborrower,
-    todayissues       => \@realtodayissues,
-    previssues        => \@realprevissues,
+    todayissues       => \@todaysissues,
+    previssues        => \@previousissues,
     inprocess         => $inprocess,
     memberofinstution => $member_of_institution,
     CGIorganisations  => $CGIorganisations,
+       circview => 1,
+       
 );
 
 # set return date if stickyduedate
 if ($stickyduedate) {
-    my $t_year  = "year" . $year;
-    my $t_month = "month" . $month;
-    my $t_day   = "day" . $day;
     $template->param(
-        $t_year  => 1,
-        $t_month => 1,
-        $t_day   => 1,
+        duedatespec => $duedatespec,
     );
 }
 
@@ -736,23 +697,13 @@ if ($stickyduedate) {
 #$cookie=[$cookie, $branchcookie, $printercookie];
 #}
 
+# grab patron's image if available
+my $picture = GetPatronImage($borrower->{'cardnumber'});
+$template->param( picture => $picture );
+
 $template->param(
-    SpecifyDueDate     => C4::Context->preference("SpecifyDueDate")
+    SpecifyDueDate           => C4::Context->preference("SpecifyDueDate"),
+    CircAutocompl            => C4::Context->preference("CircAutocompl") ,
+    DHTMLcalendar_dateformat => C4::Dates->DHTMLcalendar(),
 );
 output_html_with_http_headers $query, $cookie, $template->output;
-
-####################################################################
-# Extra subroutines,,,
-
-sub cuecatbarcodedecode {
-    my ($barcode) = @_;
-    chomp($barcode);
-    my @fields = split( /\./, $barcode );
-    my @results = map( decode($_), @fields[ 1 .. $#fields ] );
-    if ( $#results == 2 ) {
-        return $results[2];
-    }
-    else {
-        return $barcode;
-    }
-}