#!/usr/bin/perl

use strict;
use CGI;

use Opals::Context;

use POSIX qw(

    floor

);

use Opals::Template qw(

    tmpl_read
    tmpl_write

);

use Opals::User qw(

    user_list
    user_getInformationById
    user_teacherList
    user_isUserBc
);


use Opals::TeacherCourse qw(
    
    teacherCourse_getList
    teacher_getCatCode
    
);

use Opals::Course qw(
    
    course_getSchoolYearList
    course_getSchoolYearInfo

);

use Opals::Tb_Circulation qw(

    circ_getItemStatus
    circ_getItemInfo
    circ_getUserCircStatus
    circ_getUserListLoan
    circ_processLoan
    circ_processReturn
    circ_processRenew
    circ_declareLost
    circ_setAvailable
    circ_record_ODL
    circ_getActiveLoanId

);

use Opals::Tb_Transactions qw(
    
    trans_doReverseLost

);

use Time::localtime;


use Date::Calc qw(

    Add_Delta_DHMS

);

use Opals::Date qw(

    date_text
    date_today
    date_parse
    date_getDeadLineDate

);

use Opals::Constant;

my $dbh = Opals::Context->dbh();
END { $dbh->disconnect(); }

my $cgi = CGI->new;
my $input = $cgi->Vars();
my $uid      = $input->{"uid"};
my $barcode  = $input->{"barcode"};
my $dueDate  = $input->{"duedate"};
my $cmdCode      = $input->{"command"};

my ($permission, $cookie, $template) = tmpl_read(
    {
        dbh             => $dbh,
        cgi             => $cgi,
        tmplFile        => '/txtbk/ajax/circ/loan.tmpl',
        reqPermission   => 'tb_circ_loan',
    }
);
my $loginuid = $template->param('curUserId');

my @cookieList = (@$cookie);
my $tm = localtime;
my $todayStr = sprintf("%04d-%02d-%02d" , $tm->year+1900, ($tm->mon)+1, $tm->mday);

#my $courseTeacherId = $cgi->cookie('teacherScheduleId') ? $cgi->cookie('teacherScheduleId'):0;
my $courseTeacherId = $input->{'courseTeacherId'} ? $input->{'courseTeacherId'}:0;
my $teacherId   =  $cgi->cookie('teacherId') ? $cgi->cookie('teacherId'):0;
my $teacherName = ($input->{'teacherName'})?$input->{'teacherName'}:"";
my $courseName  = ($input->{'courseName'})?$input->{'courseName'}:"";

my($uid,$status,$loanOverrid) = getUID();
my $lang=$template->param('curLang');

    if ($uid >= 0){
        push @cookieList, $cgi->cookie(
            -name   =>'borrower',
            -value  => $uid,
        );
        my $op = $input->{'op'};
        my $loanOverride     = $cgi->cookie('loanOverride');
        if ($op eq ''){
            $barcode =~ s/^\s+|\s+$//g;
            my ($processCode,$loanId,$userMsgCode,$msgCode)=('',0,'','');

            if ($barcode ne ''){
                my $userStatus      = circ_getUserCircStatus($dbh, $uid, $barcode);
                my $itemCircStatus  = circ_getItemStatus($dbh, $barcode);
                my $itemInfo        = circ_getItemInfo($dbh,$barcode,$uid);    
                my $userMsgCode     = getMsgCode_user($userStatus);
                my $itemMsgCode     = getMsgCode_item($itemCircStatus, $uid);
            
                if ($itemCircStatus->{'status'} == IT_STAT_NOEXIST){
                    #check if enter userbarcode into item barcode input
                    my $isUId = user_isUserBc($dbh,$barcode);
                    if ($isUId){
                        $itemMsgCode='19';
                    }
                }
                elsif(($itemMsgCode ne '00')&&($itemInfo->{'loanPeriod'} ==0)){
                    $itemMsgCode ='02';
                }
                my $loanPeriod = ($itemInfo->{'loanPeriod'})? $itemInfo->{'loanPeriod'} :0;
                if ($dueDate && $dueDate ne ''){
                    my $today = date_today();
                    my $dd = date_parse($dueDate);
                    if($dd && $dd <$today){
                        $dueDate="";
                    }
                }
                if (!$dueDate || $dueDate eq ''){
                    $dueDate = date_getDeadLineDate($loanPeriod, $todayStr);
                }
                else{
                     $dueDate .= " 23:59:59";
                }
                my $allowOD = 1;
                #0: no override, 1: override with question, 2: override automatically without approval
                my $msgCode='';
                if (($itemMsgCode eq '05' || $itemMsgCode eq '08' || 
                    $itemMsgCode eq '12' || $itemMsgCode eq '16' ||
                    $itemMsgCode eq '17') && (substr($userMsgCode , 0 ,3 ) eq '100' )){
                    ($processCode,$loanId) = processCmd($dbh,$uid,$barcode,$itemInfo,$itemCircStatus,$itemMsgCode,$dueDate,$courseTeacherId,$teacherName,$courseName );
                }
                elsif ($cmdCode && $cmdCode ne ''){
                    if ($cmdCode eq '11' || $cmdCode eq '15'){ #renewal
                    }
                    ($processCode,$loanId) = processCmd($dbh,$uid,$barcode,$itemInfo,$itemCircStatus,$cmdCode,$dueDate);
                }
                elsif ($itemCircStatus->{'status'} != IT_STAT_NOEXIST){
                    my $maxLoanBit = substr( $userMsgCode, 2, 1);
                    my $overdueBit = substr( $userMsgCode, 1, 1);
                    if(substr($loanOverride, 1, 1) eq '1'){
                        $allowOD = 2;
                    }
                    if($maxLoanBit eq '1'){
                        if(substr($loanOverride, 2, 1) eq '1' ){
                             ($processCode,$loanId)= processCmd($dbh,$uid,$barcode,$itemInfo,$itemCircStatus,$itemMsgCode,$dueDate,$courseTeacherId,$teacherName,$courseName );      
                        }
                        else{
                            $msgCode        = $itemMsgCode ."-" . $userMsgCode;
                    }
                    }
                    elsif($overdueBit eq '1' && $allowOD == 0){
                        $processCode='no_override';
                    }
                    elsif($overdueBit eq '1' && $allowOD == 2){
                        ($processCode,$loanId) = processCmd($dbh,$uid,$barcode,$itemInfo,$itemCircStatus,$itemMsgCode,$dueDate,$courseTeacherId,$teacherName,$courseName );
                        }
                    else{
                        $msgCode =$itemMsgCode ."-" . $userMsgCode;
                    }
                }
                my $dateLoanStr= date_text($todayStr, 0,$lang);
                my $dueDateStr= date_text($dueDate, 0,$lang);
                $template->param(
                    uid          => $uid,
                    processCode  => $processCode,
                    userMsgCode  => $userMsgCode,
                    itemMsgCode  => $itemMsgCode,
                    msgCode      => $msgCode,
                    duedate      => $dueDateStr,
                    dateloan     => $dateLoanStr,
                );
                $template->param(barcode   => $barcode);
                if($itemCircStatus->{'status'}!=IT_STAT_NOEXIST){ 
                    $template->param(
                        lid              => $loanId,
                        rid             => $itemInfo->{'rid'},
                        l_title         => $itemInfo->{'title'},
                        l_author        => $itemInfo->{'author'},
                        l_pubName       => $itemInfo->{'publisher'},
                        l_pubDate       => $itemInfo->{'pubDate'},
                        l_price         => $itemInfo->{'price'},
                        l_itemType      => $itemInfo->{'itemId'},
                        l_callNumber    => $itemInfo->{'classNumber'},
                        #l_maxRenewal    => $itemInfo->{'maxRenewal'},
                        );
                    }
            }
        }#if $op eq ''
        elsif ($input->{'op'} eq 'return'){
            my @returnList = split /,/, $input->{'itemList'};
            for (my $i = 0; $i <scalar(@returnList); $i++){
                my $retRS = processReturn($dbh, $returnList[$i]);
            }
        }
        elsif ($input->{'op'} eq 'lost'){
            declareLost($dbh, $uid, $input->{'itemList'});
        }
    } #if($uid>=0)
=item    
    if(Opals::Context->config("zDatabase") eq 'odev' ){
        open debug,">>/tmp/loan.log";
        print debug "=======================================\n";
        print debug  Opals::Context->config("zDatabase") ,"\n";
        print debug "uid: $uid\nbarcode:$barcode\n";
        print debug "*********************\n";
        print debug $template->output;
        close debug;
    }
=cut    
tmpl_write($dbh, $cgi, \@cookieList, $template);
#############################################################33

sub getUID{
    my($uid, $status, $loanOverride)=(-1,0,'');
    if ($input->{'uInput'}){
        my @uList = user_list($dbh, $input->{'uInput'},undef);
        if (scalar(@uList) == 1){
            $uid    = $uList[0]->{'uid'};
            $status = $uList[0]->{'status'};
            if ($status == 1){
                $template->param(u_block => 0);
                @uList[0]->{'u_block'} = 0;
            }
            else{
                $template->param(u_block =>1);
            }
            $template->param(uPerson =>1);
        }
        elsif(scalar(@uList)>1){
            for(my $i=0; $i<scalar(@uList); $i++){
                @uList[$i]->{'u_block'} = @uList[$i]->{'status'}==1?0:1;
            }
            $template->param(uList => \@uList);
        }
        else {#patron not in system
            $template->param(userNotMatch=>1);
        }
        #$template->param(uList => \@uList);
    }
    elsif ($input->{'InputFromList'}){
        $uid = $input->{'InputFromList'};
        my ($uInfo,$ttt) = user_getInformationById($dbh, $uid);
        $status = $uInfo->{'status'};
        if ($status == 1){
            $template->param(u_block => 0);
        }
        else{
            $template->param(u_block =>1);
        }
    }
    else{
        if ($input->{'hiddenid'}){
            $uid    = $input->{'hiddenid'};
        }
        else{
            #$uid = $input->{'uid'};
            $uid = $cgi->cookie('borrower'); }
        my ($uInfo,$ttt) = user_getInformationById($dbh, $uid);
        $status = $uInfo->{'status'};
        if ($status == 1){
            $template->param(u_block => 0);
        }
        else{
            $template->param(u_block =>1);
        }
    }
    if ($uid && $uid >= 0){
        $template->param(hasUser=>1,);  
    }
    else{
        $template->param(noUser=>1, );    }
    return ($uid, $status,$loanOverride);
}#end sub
sub getMsgCode_item{
    my ($itemCircStatus,$uid)=@_;
    my $retCode="";
    my $reserveList=$itemCircStatus->{'reserveList'};
    my $holdList=$itemCircStatus->{'holdList'};
    if($itemCircStatus->{'status'}==IT_STAT_NOEXIST){
        $retCode="00";    }
    elsif($itemCircStatus->{'status'}==IT_STAT_UNAVAIL){
        $retCode="01";    }
    elsif($itemCircStatus->{'status'}==IT_STAT_RESTRICTED){
        $retCode="02";    }
    elsif($itemCircStatus->{'status'}==IT_STAT_LOST){
        $retCode="03";    }
    elsif($itemCircStatus->{'status'}==IT_STAT_MISSING){
        $retCode="18";    }
    elsif($itemCircStatus->{'status'}==IT_STAT_DAMAGED){
        $retCode="04";    }
    elsif($itemCircStatus->{'status'}==IT_STAT_ONHOLD){
           if(getReserveId($uid,$holdList)>0){
               $retCode="05";}
           elsif(getReserveId($uid,$reserveList)>0){
                $retCode="06";}
           else{
                $retCode="07";}
    }
    elsif($itemCircStatus->{'status'}==IT_STAT_FULL_AVAIL && getReserveId($uid,$holdList)>0 ){
          $retCode="05";
    }    
    elsif($itemCircStatus->{'status'}==IT_STAT_HAVE_RSVR ){
        if(scalar(@$reserveList)){
            my $topReserveUID = @$reserveList[0]->{'uid'};
            if($itemCircStatus->{'inTBKRoom'}){
                if($uid ==$topReserveUID){
                    $retCode="08";            }
                elsif(getReserveId($uid,$reserveList)>0){
                    $retCode="09";            }
                else{
                    $retCode="10";            }
            }
            else{
                if($uid == $itemCircStatus->{'l_uid'}){
                    $retCode="11";  
                }
                elsif($uid ==$topReserveUID){
                    $retCode="12";            }
                elsif(getReserveId($uid,$reserveList)>0){
                    $retCode="13";            }
                else{
                    $retCode="14";            }
            }
        }
    }
    elsif($itemCircStatus->{'status'}==IT_STAT_ONLOAN && $uid eq $itemCircStatus->{'l_uid'}){
        $retCode="15";    }
    elsif($itemCircStatus->{'status'}==IT_STAT_ONLOAN && $uid ne $itemCircStatus->{'l_uid'}){
        $retCode="16";    }
    else{ # fully available
        $retCode="17";    }
    return $retCode;    
}

sub getMsgCode_user{
    my($userStatus)=@_;
    return $userStatus->{'status'}.$userStatus->{'overdue'}.$userStatus->{'maxLoan'}.$userStatus->{'maxRenew'}.$userStatus->{'maxReserve'};
}
=item
sub getItemLoanList{
    my ($dbh, $template, $uid) = @_;
    my $loanList = circ_getUserListLoan($dbh,$uid);
    my $count = 0;
    my $odCount = 0;

    foreach my $loan(@$loanList){
        if ($loan->{'overdue'}) {$odCount++;}
        $loan->{'dateLoan'} = date_text($loan->{'dateLoan'}, 0);
        $loan->{'dateDue'}  = date_text($loan->{'dateDue'}, 0);
        $loan->{'number'} = $count++;
    }
    $template->param(loanList => \@$loanList);
    $template->param(LoanCount => scalar(@$loanList));
    $template->param(NumOfOverdue => $odCount);
}

=cut

sub processCmd{
    my ($dbh, $uid,$barcode,$itemInfo,$itemCircStatus,$cmdCode,$dueDate, $teacherScheduleId,$teacherName,$courseName) =@_;
    my $dateReturn =$todayStr;
        
    my ($loanId, $retVal); 

    if ($cmdCode eq '03'){
        circ_setAvailable($dbh,$barcode,IT_STAT_LOST);       
        
        trans_doReverseLost($dbh,$barcode,$loginuid);
    }
    if ($cmdCode eq '18'){
        circ_setAvailable($dbh,$barcode,IT_STAT_MISSING);       
    }
    elsif ($cmdCode eq '04'){
        circ_setAvailable($dbh,$barcode,IT_STAT_DAMAGED);       
    }    
    elsif($cmdCode eq '05'){  
        #my $idReserve =getReserveId($uid,$itemCircStatus->{'holdList'});
        #my $fillHold  = circ_fillHold($dbh,$idReserve,$barcode);
    }
    elsif($cmdCode eq '06'){
        #my $idReserve     = getReserveId($uid,$itemCircStatus->{'reserveList'});
        #my $fillReserve   = circ_fillReserve($dbh,$uid ,$itemCircStatus->{'rid'});
        #my $idReserve     = getLastReserveId($itemCircStatus->{'holdList'});
        #my $cancelHold    = circ_cancelHold($dbh,$idReserve) ;
        #my $resetReserve  = circ_resetReserve($dbh,$idReserve);
    }
    elsif($cmdCode eq '07'){
        #my $idReserve    = getLastReserveId($itemCircStatus->{'holdList'});
        #my $cancelHold   = circ_cancelHold($dbh,$idReserve) ;
        #my $resetReserve = circ_resetReserve($dbh,$idReserve);
    }
    elsif($cmdCode eq '07_R'){
=item
        #my $dateExpiry   = date_getDeadLineDate($itemInfo->{'reservePeriod'},$todayStr);
        #my $putReserve   = circ_placeReserve($dbh, $uid,$itemCircStatus->{'rid'},1, $todayStr, $dateExpiry);
        #$retVal =  "p1_07_R";
=cut
        return ($retVal,$loanId);
    }
    elsif($cmdCode eq '08' || $cmdCode eq '09'){
        #my $fillReserve  = circ_fillReserve($dbh,$uid ,$itemCircStatus->{'rid'});
    }
    elsif($cmdCode eq '09_H'){
=item
        my $reserveList  = $itemCircStatus->{'reserveList'};
        my $idReserve    = @$reserveList[0]->{'idReserve'};
        my $uidReserve   = @$reserveList[0]->{'uid'};
        my $reserveExpiry= @$reserveList[0]->{'dateExpiry'};
        my $dateExpiry   = date_getDeadLineDate($itemInfo->{'holdPeriod'},$todayStr);
        if($dateExpiry >$reserveExpiry){
            $dateExpiry  = $reserveExpiry
        }
        circ_fillReserve($dbh,$uidReserve ,$itemCircStatus->{'rid'});
        my $putOnHold    = circ_placeHold($dbh, $idReserve,$todayStr,$dateExpiry);
        $retVal =  "p1_09_H";
=cut
        return ($retVal,$loanId);
     }
    elsif($cmdCode eq '10_H'){
=item
        my $reserveList  = $itemCircStatus->{'reserveList'};
        my $idReserve    = @$reserveList[0]->{'idReserve'};
        my $uidReserve   = @$reserveList[0]->{'uid'};
        my $reserveExpiry= @$reserveList[0]->{'dateExpiry'};
        my $dateExpiry   = date_getDeadLineDate($itemInfo->{'holdPeriod'},$todayStr);
        if($dateExpiry >$reserveExpiry){
            $dateExpiry  = $reserveExpiry
        }
        circ_fillReserve($dbh,$uidReserve ,$itemCircStatus->{'rid'});
        my $putOnHold    = circ_placeHold($dbh, $idReserve,$todayStr,$dateExpiry);
        $retVal =  "p1_10_H";
=cut
        return ($retVal,$loanId);
    }
    elsif($cmdCode eq '10_HR'){
=item
        my $reserveList  = $itemCircStatus->{'reserveList'};
        my $idReserve    = @$reserveList[0]->{'idReserve'};
        my $uidReserve   = @$reserveList[0]->{'uid'};
        my $reserveExpiry= @$reserveList[0]->{'dateExpiry'};
        my $dateExpiry   = date_getDeadLineDate($itemInfo->{'holdPeriod'},$todayStr);
        if($dateExpiry >$reserveExpiry){
            $dateExpiry  = $reserveExpiry
        }
        circ_fillReserve($dbh,$uidReserve ,$itemCircStatus->{'rid'});
        my $putOnHold    = circ_placeHold($dbh, $idReserve,$todayStr,$dateExpiry);
           $dateExpiry   = date_getDeadLineDate($itemInfo->{'reservePeriod'},$todayStr);
        my $putReserve   = circ_placeReserve($dbh, $uid,$itemCircStatus->{'rid'},1, $todayStr, $dateExpiry);
        $retVal =  "p1_10_HR";
=cut
        return ($retVal,$loanId);
    }
    elsif($cmdCode eq '11' || $cmdCode eq '15'){
        my $renew       = circ_processRenew($dbh,$uid,$barcode,$dueDate);
        $retVal =  "p". $renew . "_" .$cmdCode;
        $loanId=circ_getActiveLoanId($dbh,$barcode,$uid);
        return ($retVal,$loanId) ;
    }
    elsif($cmdCode eq '11_H' ){
=item
        my $return       = doReturn($dbh,$itemCircStatus->{'l_uid'}, $barcode,$dateReturn);
        my $reserveList  = $itemCircStatus->{'reserveList'};
        my $idReserve    = @$reserveList[0]->{'idReserve'};
        my $uidReserve   = @$reserveList[0]->{'uid'};
        my $reserveExpiry= @$reserveList[0]->{'dateExpiry'};
        my $dateExpiry   = date_getDeadLineDate($itemInfo->{'holdPeriod'},$todayStr);
        if($dateExpiry >$reserveExpiry){
            $dateExpiry  = $reserveExpiry;
        }
        circ_fillReserve($dbh,$uidReserve ,$itemCircStatus->{'rid'});
        my $putOnHold    = circ_placeHold($dbh, $idReserve,$todayStr,$dateExpiry);
        $retVal =  "p1_11_H";
=cut
        return ($retVal,$loanId);
    }
    elsif($cmdCode eq '12' || $cmdCode eq '13'){
=item
        my $return       = doReturn($dbh,$itemCircStatus->{'l_uid'}, $barcode,$dateReturn);
        my $fillReserve  = circ_fillReserve($dbh,$uid ,$itemCircStatus->{'rid'});
=cut
    }
    elsif($cmdCode eq '13_H'){
=item
        my $return       = doReturn($dbh,$itemCircStatus->{'l_uid'}, $barcode,$dateReturn);
        my $reserveList  = $itemCircStatus->{'reserveList'};
        my $idReserve    = @$reserveList[0]->{'idReserve'};
        my $uidReserve   = @$reserveList[0]->{'uid'};
        my $reserveExpiry= @$reserveList[0]->{'dateExpiry'};
        my $dateExpiry   = date_getDeadLineDate($itemInfo->{'holdPeriod'},$todayStr);
        if($dateExpiry >$reserveExpiry){
            $dateExpiry  = $reserveExpiry;
        }
        circ_fillReserve($dbh,$uidReserve ,$itemCircStatus->{'rid'});
        my $putOnHold    = circ_placeHold($dbh, $idReserve,$todayStr,$dateExpiry);
        $retVal =  "p1_13_H";
=cut
        return  ($retVal,$loanId);
    }
    elsif($cmdCode eq '14' || $cmdCode eq '16'){
        my $return       = doReturn($dbh,$itemCircStatus->{'l_uid'}, $barcode,$dateReturn);
    }
    elsif($cmdCode eq '14_H'){
=item
        my $return       = doReturn($dbh,$itemCircStatus->{'l_uid'}, $barcode,$dateReturn);
        my $reserveList  = $itemCircStatus->{'reserveList'};
        my $idReserve    = @$reserveList[0]->{'idReserve'};
        my $uidReserve   = @$reserveList[0]->{'uid'};
        my $reserveExpiry= @$reserveList[0]->{'dateExpiry'};
        my $dateExpiry   = date_getDeadLineDate($itemInfo->{'holdPeriod'},$todayStr);
        if($dateExpiry >$reserveExpiry){
            $dateExpiry  = $reserveExpiry;
        }
        circ_fillReserve($dbh,$uidReserve ,$itemCircStatus->{'rid'});
        my $putOnHold    = circ_placeHold($dbh, $idReserve,$todayStr,$dateExpiry);
        $retVal =  "p1_14_H";
=cut
        return ($retVal,$loanId);
    }
    elsif($cmdCode eq '14_HR'){
=item        
        my $return       = doReturn($dbh,$itemCircStatus->{'l_uid'}, $barcode,$dateReturn);
        my $reserveList  = $itemCircStatus->{'reserveList'};
        my $idReserve    = @$reserveList[0]->{'idReserve'};
        my $uidReserve   = @$reserveList[0]->{'uid'};
        my $reserveExpiry= @$reserveList[0]->{'dateExpiry'};
        my $dateExpiry   = date_getDeadLineDate($itemInfo->{'holdPeriod'},$todayStr);
        if($dateExpiry >$reserveExpiry){
            $dateExpiry  = $reserveExpiry;
        }
        circ_fillReserve($dbh,$uidReserve ,$itemCircStatus->{'rid'});
        my $putOnHold    = circ_placeHold($dbh, $idReserve,$todayStr,$dateExpiry);
           $dateExpiry   = date_getDeadLineDate($itemInfo->{'reservePeriod'},$todayStr);
        my $putReserve   = circ_placeReserve($dbh, $uid,$itemCircStatus->{'rid'},1, $todayStr, $dateExpiry);
        $retVal =  "p1_14_HR";
=cut
        return ($retVal,$loanId);
    }
#   2006-09-28
#   fill hold if item is availbale and on hold for the same patron        
#   BEGIN    
=item
    my $idReserve =getReserveId($uid,$itemCircStatus->{'holdList'});
    if($idReserve && ($cmdCode eq '16' || $cmdCode eq 17)){
            my $fillHold  = circ_fillHold($dbh,$idReserve,$barcode);
    }
=cut
#   END     
    my $loan = circ_processLoan($dbh,$uid ,$barcode,$todayStr,$dueDate, $itemInfo->{'maxRenewal'}, $itemInfo->{'fine'},$teacherScheduleId,$teacherName,$courseName);
    $loanId=circ_getActiveLoanId($dbh,$barcode,$uid);

    $retVal = "p" .$loan  ."_" .$cmdCode ;

    return ($retVal,$loanId);
}


sub getReserveId{
    my($uid,$list)=@_;
    if(!$list){
        return 0;
    }
    for(my $i=0; $i < scalar(@$list); $i++){
        if(@$list[$i]->{'uid'} == $uid){
            return @$list[$i]->{'idReserve'};
        }
    }
    return 0;
}

sub processReturn{
    my ($dbh, $barcode) = @_;
    my $retVal ;
    my $itemCircStatus  = circ_getItemStatus($dbh, $barcode);
    my $itemInfo        = circ_getItemInfo($dbh, $barcode);
        $retVal->{'itemInfo'} = $itemInfo;
    if ($itemCircStatus->{'status'} == IT_STAT_ONLOAN  ){
        my $return   = doReturn($dbh, $itemCircStatus->{'l_uid'}, $barcode, $todayStr);
    }
    return $retVal;
}

sub doReturn{
    my ($dbh, $uid, $barcode, $dateReturn) = @_;
    return circ_processReturn($dbh, $uid, $barcode, $dateReturn);
}

sub declareLost {

    my ($dbh, $uid, $bcList) = @_;
    my @arrLost = split/,/,$bcList;
    for (my $i = 0; $i < @arrLost; $i++){
        my $itemCircStatus = circ_getItemStatus($dbh,$arrLost[$i]);
        if ($itemCircStatus->{'l_uid'} == $uid){
            circ_declareLost($dbh, $arrLost[$i]);
        }
        if ($itemCircStatus->{'l_idLoan'}){
            my $lost_odl_id = circ_record_ODL($dbh,$itemCircStatus->{'l_idLoan'},'lost',0);
        }
    }
}

