X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=C4%2FOverdues.pm;h=de23dd906d459ae8d466a169440802bdc23b4a2a;hb=a8be1966f3855d6950021018254819b04a5287c3;hp=65b1296295cdfbd671ec0285b23327cdaed1e9f5;hpb=c758e222428ba6ad69b3d52ee6030d02e17ae964;p=koha.git diff --git a/C4/Overdues.pm b/C4/Overdues.pm index 65b1296295..de23dd906d 100644 --- a/C4/Overdues.pm +++ b/C4/Overdues.pm @@ -34,8 +34,8 @@ use C4::Accounts; use C4::Log; # logaction use C4::Debug; use Koha::DateUtils; -use Koha::Account::Line; use Koha::Account::Lines; +use Koha::Account::Offsets; use Koha::IssuingRules; use Koha::Libraries; @@ -50,15 +50,10 @@ BEGIN { &CalcFine &Getoverdues &checkoverdues - &NumberNotifyId - &AmountNotify &UpdateFine &GetFine &get_chargeable_units - &CheckItemNotify &GetOverduesForBranch - &RemoveNotifyLine - &AddNotifyLine &GetOverdueMessageTransportTypes &parse_overdues_letter ); @@ -74,11 +69,6 @@ BEGIN { push @EXPORT, qw( &GetIssuesIteminfo ); - - # subs to move to Biblio.pm - push @EXPORT, qw( - &GetItems - ); } =head1 NAME @@ -201,7 +191,7 @@ sub checkoverdues { =head2 CalcFine - ($amount, $chargename, $units_minus_grace, $chargeable_units) = &CalcFine($item, + ($amount, $units_minus_grace, $chargeable_units) = &CalcFine($item, $categorycode, $branch, $start_dt, $end_dt ); @@ -226,13 +216,10 @@ defining the date range over which to determine the fine. Fines scripts should just supply the date range over which to calculate the fine. -C<&CalcFine> returns four values: +C<&CalcFine> returns three values: C<$amount> is the fine owed by the patron (see above). -C<$chargename> is the chargename field from the applicable record in -the categoryitem table, whatever that is. - C<$units_minus_grace> is the number of chargeable units minus the grace period C<$chargeable_units> is the number of chargeable units (days between start and end dates, Calendar adjusted where needed, @@ -250,6 +237,8 @@ sub CalcFine { my $itemtype = $item->{itemtype} || $item->{itype}; my $issuing_rule = Koha::IssuingRules->get_effective_issuing_rule({ categorycode => $bortype, itemtype => $itemtype, branchcode => $branchcode }); + $itemtype = Koha::ItemTypes->find($itemtype); + return unless $issuing_rule; # If not rule exist, there is no fine my $fine_unit = $issuing_rule->lengthunit || 'days'; @@ -267,10 +256,17 @@ sub CalcFine { } # else { # a zero (or null) chargeperiod or negative units_minus_grace value means no charge. } $amount = $issuing_rule->overduefinescap if $issuing_rule->overduefinescap && $amount > $issuing_rule->overduefinescap; + + # This must be moved to Koha::Item (see also similar code in C4::Accounts::chargelostitem + $item->{replacementprice} ||= $itemtype->defaultreplacecost + if $itemtype + && $item->{replacementprice} == 0 + && C4::Context->preference("useDefaultReplacementCost"); + $amount = $item->{replacementprice} if ( $issuing_rule->cap_fine_to_replacement_price && $item->{replacementprice} && $amount > $item->{replacementprice} ); - $debug and warn sprintf("CalcFine returning (%s, %s, %s, %s)", $amount, $issuing_rule->chargename, $units_minus_grace, $chargeable_units); - return ($amount, $issuing_rule->chargename, $units_minus_grace, $chargeable_units); - # FIXME: chargename is NEVER populated anywhere. + + $debug and warn sprintf("CalcFine returning (%s, %s, %s)", $amount, $units_minus_grace, $chargeable_units); + return ($amount, $units_minus_grace, $chargeable_units); } @@ -470,7 +466,15 @@ sub GetIssuesIteminfo { =head2 UpdateFine - &UpdateFine({ issue_id => $issue_id, itemnumber => $itemnumber, borrwernumber => $borrowernumber, amount => $amount, type => $type, $due => $date_due }); + &UpdateFine( + { + issue_id => $issue_id, + itemnumber => $itemnumber, + borrowernumber => $borrowernumber, + amount => $amount, + due => $date_due + } + ); (Note: the following is mostly conjecture and guesswork.) @@ -483,8 +487,6 @@ has the book on loan. C<$amount> is the current amount owed by the patron. -C<$type> will be used in the description of the fine. - C<$due> is the due date formatted to the currently specified date format C<&UpdateFine> looks up the amount currently owed on the given item @@ -508,10 +510,9 @@ sub UpdateFine { my $itemnum = $params->{itemnumber}; my $borrowernumber = $params->{borrowernumber}; my $amount = $params->{amount}; - my $type = $params->{type}; my $due = $params->{due}; - $debug and warn "UpdateFine({ itemnumber => $itemnum, borrowernumber => $borrowernumber, type => $type, due => $due, issue_id => $issue_id})"; + $debug and warn "UpdateFine({ itemnumber => $itemnum, borrowernumber => $borrowernumber, due => $due, issue_id => $issue_id})"; unless ( $issue_id ) { carp("No issue_id passed in!"); @@ -572,25 +573,9 @@ sub UpdateFine { } if ( $data ) { - # we're updating an existing fine. Only modify if amount changed - # Note that in the current implementation, you cannot pay against an accruing fine - # (i.e. , of accounttype 'FU'). Doing so will break accrual. if ( $data->{'amount'} != $amount ) { my $accountline = Koha::Account::Lines->find( $data->{accountlines_id} ); - my $diff = $amount - $data->{'amount'}; - - #3341: diff could be positive or negative! - my $out = $data->{'amountoutstanding'} + $diff; - - $accountline->set( - { - date => dt_from_string(), - amount => $amount, - amountoutstanding => $out, - lastincrement => $diff, - accounttype => 'FU', - } - )->store(); + $accountline->adjust({ amount => $amount, type => 'fine_update' }); } } else { if ( $amount ) { # Don't add new fines with an amount of 0 @@ -599,34 +584,23 @@ sub UpdateFine { ); $sth4->execute($itemnum); my $title = $sth4->fetchrow; + my $desc = "$title $due"; - my $nextaccntno = C4::Accounts::getnextacctno($borrowernumber); - - my $desc = ( $type ? "$type " : '' ) . "$title $due"; # FIXEDME, avoid whitespace prefix on empty $type - - my $accountline = Koha::Account::Line->new( + my $account = Koha::Account->new({ patron_id => $borrowernumber }); + my $accountline = $account->add_debit( { - borrowernumber => $borrowernumber, - itemnumber => $itemnum, - date => dt_from_string(), - amount => $amount, - description => $desc, - accounttype => 'FU', - amountoutstanding => $amount, - lastincrement => $amount, - accountno => $nextaccntno, - issue_id => $issue_id, + amount => $amount, + description => $desc, + note => undef, + user_id => undef, + library_id => undef, + type => 'fine', + item_id => $itemnum, + issue_id => $issue_id, } - )->store(); + ); } } - # logging action - &logaction( - "FINES", - $type, - $borrowernumber, - "due=".$due." amount=".$amount." itemnumber=".$itemnum - ) if C4::Context->preference("FinesLog"); } =head2 BorType @@ -688,87 +662,6 @@ sub GetFine { return 0; } -=head2 NumberNotifyId - - (@notify) = &NumberNotifyId($borrowernumber); - -Returns amount for all file per borrowers -C<@notify> array contains all file per borrowers - -C<$notify_id> contains the file number for the borrower number nad item number - -=cut - -sub NumberNotifyId{ - my ($borrowernumber)=@_; - my $dbh = C4::Context->dbh; - my $query=qq| SELECT distinct(notify_id) - FROM accountlines - WHERE borrowernumber=?|; - my @notify; - my $sth = $dbh->prepare($query); - $sth->execute($borrowernumber); - while ( my ($numberofnotify) = $sth->fetchrow ) { - push( @notify, $numberofnotify ); - } - return (@notify); -} - -=head2 AmountNotify - - ($totalnotify) = &AmountNotify($notifyid); - -Returns amount for all file per borrowers -C<$notifyid> is the file number - -C<$totalnotify> contains amount of a file - -C<$notify_id> contains the file number for the borrower number and item number - -=cut - -sub AmountNotify{ - my ($notifyid,$borrowernumber)=@_; - my $dbh = C4::Context->dbh; - my $query=qq| SELECT sum(amountoutstanding) - FROM accountlines - WHERE notify_id=? AND borrowernumber = ?|; - my $sth=$dbh->prepare($query); - $sth->execute($notifyid,$borrowernumber); - my $totalnotify=$sth->fetchrow; - $sth->finish; - return ($totalnotify); -} - -=head2 GetItems - - ($items) = &GetItems($itemnumber); - -Returns the list of all delays from overduerules. - -C<$items> is a reference-to-hash whose keys are all of the fields -from the items tables of the Koha database. Thus, - -C<$itemnumber> contains the borrower categorycode - -=cut - -# FIXME: This is a bad function to have here. -# Shouldn't it be in C4::Items? -# Shouldn't it be called GetItem since you only get 1 row? -# Shouldn't it be called GetItem since you give it only 1 itemnumber? - -sub GetItems { - my $itemnumber = shift or return; - my $query = qq|SELECT * - FROM items - WHERE itemnumber=?|; - my $sth = C4::Context->dbh->prepare($query); - $sth->execute($itemnumber); - my ($items) = $sth->fetchrow_hashref; - return ($items); -} - =head2 GetBranchcodesWithOverdueRules my @branchcodes = C4::Overdues::GetBranchcodesWithOverdueRules() @@ -792,27 +685,6 @@ sub GetBranchcodesWithOverdueRules { return @$branchcodes; } -=head2 CheckItemNotify - -Sql request to check if the document has alreday been notified -this function is not exported, only used with GetOverduesForBranch - -=cut - -sub CheckItemNotify { - my ($notify_id,$notify_level,$itemnumber) = @_; - my $dbh = C4::Context->dbh; - my $sth = $dbh->prepare(" - SELECT COUNT(*) - FROM notifys - WHERE notify_id = ? - AND notify_level = ? - AND itemnumber = ? "); - $sth->execute($notify_id,$notify_level,$itemnumber); - my $notified = $sth->fetchrow; - return ($notified); -} - =head2 GetOverduesForBranch Sql request for display all information for branchoverdues.pl @@ -848,8 +720,6 @@ sub GetOverduesForBranch { items.location, items.itemnumber, itemtypes.description, - accountlines.notify_id, - accountlines.notify_level, accountlines.amountoutstanding FROM accountlines LEFT JOIN issues ON issues.itemnumber = accountlines.itemnumber @@ -865,78 +735,13 @@ sub GetOverduesForBranch { AND (issues.branchcode = ? ) AND (issues.date_due < NOW()) "; - my @getoverdues; - my $i = 0; - my $sth; if ($location) { - $sth = $dbh->prepare("$select AND items.location = ? ORDER BY borrowers.surname, borrowers.firstname"); - $sth->execute($branch, $location); + my $q = "$select AND items.location = ? ORDER BY borrowers.surname, borrowers.firstname"; + return @{ $dbh->selectall_arrayref($q, { Slice => {} }, $branch, $location ) }; } else { - $sth = $dbh->prepare("$select ORDER BY borrowers.surname, borrowers.firstname"); - $sth->execute($branch); + my $q = "$select ORDER BY borrowers.surname, borrowers.firstname"; + return @{ $dbh->selectall_arrayref($q, { Slice => {} }, $branch ) }; } - while ( my $data = $sth->fetchrow_hashref ) { - #check if the document has already been notified - my $countnotify = CheckItemNotify($data->{'notify_id'}, $data->{'notify_level'}, $data->{'itemnumber'}); - if ($countnotify eq '0') { - $getoverdues[$i] = $data; - $i++; - } - } - return (@getoverdues); -} - - -=head2 AddNotifyLine - - &AddNotifyLine($borrowernumber, $itemnumber, $overduelevel, $method, $notifyId) - -Create a line into notify, if the method is phone, the notification_send_date is implemented to - -=cut - -sub AddNotifyLine { - my ( $borrowernumber, $itemnumber, $overduelevel, $method, $notifyId ) = @_; - my $dbh = C4::Context->dbh; - if ( $method eq "phone" ) { - my $sth = $dbh->prepare( - "INSERT INTO notifys (borrowernumber,itemnumber,notify_date,notify_send_date,notify_level,method,notify_id) - VALUES (?,?,now(),now(),?,?,?)" - ); - $sth->execute( $borrowernumber, $itemnumber, $overduelevel, $method, - $notifyId ); - } - else { - my $sth = $dbh->prepare( - "INSERT INTO notifys (borrowernumber,itemnumber,notify_date,notify_level,method,notify_id) - VALUES (?,?,now(),?,?,?)" - ); - $sth->execute( $borrowernumber, $itemnumber, $overduelevel, $method, - $notifyId ); - } - return 1; -} - -=head2 RemoveNotifyLine - - &RemoveNotifyLine( $borrowernumber, $itemnumber, $notify_date ); - -Cancel a notification - -=cut - -sub RemoveNotifyLine { - my ( $borrowernumber, $itemnumber, $notify_date ) = @_; - my $dbh = C4::Context->dbh; - my $sth = $dbh->prepare( - "DELETE FROM notifys - WHERE - borrowernumber=? - AND itemnumber=? - AND notify_date=?" - ); - $sth->execute( $borrowernumber, $itemnumber, $notify_date ); - return 1; } =head2 GetOverdueMessageTransportTypes