#!/usr/bin/perl
use Opals::Context;
use Time::localtime;
use Opals::Template qw(
    tmpl_read
    tmpl_write
    tmpl_preference
);
use Opals::Date qw(
    date_parse
    date_text
    date_profileList
);

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

my $cgi = CGI->new;
my $input = $cgi->Vars();
my $op = $input->{'op'};
my @itemType        = ($cgi->param('itemType'));
my @overdue         = ($cgi->param('overdue'));
my @overduePerHour  = ($cgi->param('overduePerHour'));
my @maxOverdue      = ($cgi->param('maxOverdue'));
my @damage          = ($cgi->param('damage'));
my @itemCategory    = ($cgi->param('itemCategory'));

 
my $pref  = tmpl_preference($dbh);

my ($permission, $cookieList, $template) = tmpl_read(
        {
            dbh             => $dbh,
            cgi             => $cgi,
            tmplFile        => 'util/fineRate.tmpl',
            reqPermission   => 'pref_edit',
        }
);

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


$template->param(hlpUrl     => Opals::Constant->getHlpUrl('fineRate') );
# See User.pm for the list of permissions
if ($permission && $permission->{'pref_edit'}) {

   if($op eq  'save'){
       saveFines($dbh);
   }
    
   my $fineRateTbl    =getFineRateTbl($dbh);
    
      $template->param(
         fineRateTbl  => $fineRateTbl,
         fines             => 1,
         today             => $dateToday,
   );

}

   tmpl_write($dbh, $cgi, $cookie, $template); 

#######################################
sub saveFines{
    my ($dbh) = @_;

    my $sth = $dbh->prepare(<<_STH_);
    update opl_fineRate set toDel=1
_STH_
    $sth->execute();
   
         $sth = $dbh->prepare(<<_STH_);
replace into opl_fineRate
set       itemType   = ?,
          overdue    = ?,
          overduePerHour    = ?,
          maxOverdue = ?,
          damage     = ?,
          itemCategory=?,
          toDel      = 0
_STH_
        for(my $i =0; $i < scalar(@itemType);$i++) {
           if(@itemType[$i] ne ''){
               @overdue[$i]    = '0.00' if(!@overdue[$i]);
               @overduePerHour[$i]    = '0.00' if(!@overduePerHour[$i]);
               @maxOverdue[$i] = '0.00' if(!@maxOverdue[$i]);
               @damage[$i]     = '0.00' if (!@damage[$i]); 
               if(isNum(@overdue[$i]) && isNum(@maxOverdue[$i]) && isNum(@damage[$i])) {
                    $sth->execute(@itemType[$i],@overdue[$i],@overduePerHour[$i],@maxOverdue[$i],@damage[$i],@itemCategory[$i]);
               }
           }
        }
    $dbh->do("delete from opl_fineRate where toDel=1");
    $sth->finish;
}
#######################################
sub isNum{
    my($num) =@_;
    return $num =~ m/\d+(\.\d+)*/g ?1:0;
}
#######################################
sub  getFineRateTbl{
    my ($dbh) = @_;

    my $catList="1";
    if($pref->{'textbookMgmnt'} eq '1'){
        $catList .=",2";
    }
    if($pref->{'equipmentMgmnt'} eq '1'){
        $catList .=",3";
    }
    my $sth = $dbh->prepare(<<_STH_);
    select      if(r.itemType is null,0,1)  as fineSet, 
                if(r.itemType is null ||(r.overdue <=0 && r.overduePerHour<=0 && r.damage<=0),0,1) as chargeFine,
                i.id as itemType ,r.overdue,r.overduePerHour,r.maxOverdue,r.damage,i.itemCategory 
    from        opl_itemType i left outer join opl_fineRate r on r.itemType=i.id && r.itemCategory = i.itemCategory
    where       i.id != ''  && i.itemCategory  in ($catList)
    order by    chargeFine desc,i.itemCategory,i.defaultType desc,i.id 
_STH_
    $sth->execute();
 
        my @finerateTbl;
        my @library=();
        my @txtbook=();
        my @equipment=();

        while (my $rec = $sth->fetchrow_hashref) {
            if($rec->{'itemCategory'}==1){
                push  @library,$rec;
            }
            elsif($rec->{'itemCategory'}==2){
                push  @txtbook,$rec;
            }
            elsif($rec->{'itemCategory'}==3){
                push  @equipment,$rec;
            }
        }
        $sth->finish;
        push @finerateTbl,({collection=>"Library",rateTbl=>\@library},
                           {collection=>"Equipment",rateTbl=>\@equipment},
                           {collection=>"Textbook",rateTbl=>\@txtbook}
                            );
        return \@finerateTbl;
}    
    



