{
borrowernumber => $borrowernumber,
itemnumber => $item,
- accounttype => 'FU'
+ accounttype => 'OVERDUE',
+ status => 'UNRETURNED'
}
)->next();
return 0 unless $accountline; # no warning, there's just nothing to fix
if ($exemptfine) {
my $amountoutstanding = $accountline->amountoutstanding;
- $accountline->accounttype('FFOR');
+ $accountline->status('FORGIVEN');
$accountline->amountoutstanding(0);
Koha::Account::Offset->new(
&logaction("FINES", 'MODIFY',$borrowernumber,"Overdue forgiven: item $item");
}
} else {
- $accountline->accounttype('F');
+ $accountline->status('RETURNED');
}
return $accountline->store();
}
my $dbh = C4::Context->dbh;
- # FIXME - What exactly is this query supposed to do? It looks up an
- # entry in accountlines that matches the given item and borrower
- # numbers, where the description contains $due, and where the
- # account type has one of several values, but what does this _mean_?
- # Does it look up existing fines for this item?
- # FIXME - What are these various account types? ("FU", "O", "F", "M")
- # "L" is LOST item
- # "A" is Account Management Fee
- # "N" is New Card
- # "M" is Sundry
- # "F" is Fine ??
- # "FU" is Fine UPDATE??
- # "Pay" is Payment
- # "REF" is Cash Refund
- my $sth = $dbh->prepare(
- "SELECT * FROM accountlines
- WHERE borrowernumber=? AND
- (( accounttype IN ('F','M') AND amountoutstanding<>0 ) OR
- accounttype = 'FU' )"
+ my $overdues = Koha::Account::Lines->search(
+ {
+ borrowernumber => $borrowernumber,
+ accounttype => [ 'OVERDUE', 'M' ],
+ amountoutstanding => { '<>' => 0 }
+ }
);
- $sth->execute( $borrowernumber );
- my $data;
+
+ my $accountline;
my $total_amount_other = 0.00;
my $due_qr = qr/$due/;
# Cycle through the fines and
# - find line that relates to the requested $itemnum
# - accumulate fines for other items
# so we can update $itemnum fine taking in account fine caps
- while (my $rec = $sth->fetchrow_hashref) {
- if ( $rec->{issue_id} == $issue_id && $rec->{accounttype} eq 'FU' ) {
- if ($data) {
+ while (my $overdue = $overdues->next) {
+ if ( $overdue->issue_id == $issue_id && $overdue->status eq 'UNRETURNED' ) {
+ if ($accountline) {
$debug and warn "Not a unique accountlines record for issue_id $issue_id";
#FIXME Should we still count this one in total_amount ??
}
else {
- $data = $rec;
+ $accountline = $overdue;
next;
}
}
- $total_amount_other += $rec->{'amountoutstanding'};
+ $total_amount_other += $overdue->amountoutstanding;
}
if (my $maxfine = C4::Context->preference('MaxFine')) {
}
}
- if ( $data ) {
- if ( $data->{'amount'} != $amount ) {
- my $accountline =
- Koha::Account::Lines->find( $data->{accountlines_id} );
+
+ if ( $accountline ) {
+ if ( $accountline->amount != $amount ) {
$accountline->adjust(
{
amount => $amount,
my $desc = "$title $due";
my $account = Koha::Account->new({ patron_id => $borrowernumber });
- my $accountline = $account->add_debit(
+ $accountline = $account->add_debit(
{
amount => $amount,
description => $desc,
LEFT JOIN itemtypes ON itemtypes.itemtype = $itype_link
LEFT JOIN branches ON branches.branchcode = issues.branchcode
WHERE (accountlines.amountoutstanding != '0.000000')
- AND (accountlines.accounttype = 'FU' )
+ AND (accountlines.accounttype = 'OVERDUE' )
+ AND (accountlines.status = 'UNRETURNED' )
AND (issues.branchcode = ? )
AND (issues.date_due < NOW())
";
);
$debit_type can be any of:
- - fine
+ - overdue
- lost_item
- new_card
- account
itemnumber => $item_id,
issue_id => $issue_id,
branchcode => $library_id,
+ ( $type eq 'overdue' ? ( status => 'UNRETURNED' ) : ()),
}
)->store();
'processing' => 'Processing Fee',
'lost_item' => 'Lost Item',
'rent' => 'Rental Fee',
- 'fine' => 'Fine',
+ 'overdue' => 'OVERDUE',
'manual_debit' => 'Manual Debit',
'hold_expired' => 'Hold Expired'
};
our $account_type_debit = {
'account' => 'A',
- 'fine' => 'FU',
+ 'overdue' => 'OVERDUE',
'lost_item' => 'L',
'new_card' => 'N',
'sundry' => 'M',
);
$update_type can be any of:
- - fine_update
+ - overdue_update
Authors Note: The intention here is that this method is only used
to adjust accountlines where the final amount is not yet known/fixed.
);
}
- my $account_type = $self->accounttype;
- unless ( $Koha::Account::Line::allowed_update->{$update_type} eq $account_type ) {
+ my $account_type = $self->accounttype;
+ my $account_status = $self->status;
+ unless (
+ (
+ exists(
+ $Koha::Account::Line::allowed_update->{$update_type}
+ ->{$account_type}
+ )
+ && ( $Koha::Account::Line::allowed_update->{$update_type}
+ ->{$account_type} eq $account_status )
+ )
+ )
+ {
Koha::Exceptions::Account::UnrecognisedType->throw(
- error => 'Update type not allowed on this accounttype'
- );
+ error => 'Update type not allowed on this accounttype' );
}
my $schema = Koha::Database->new->schema;
description => 'Overpayment refund',
type => 'credit',
interface => $interface,
- ( $update_type eq 'fine_update' ? ( item_id => $self->itemnumber ) : ()),
+ ( $update_type eq 'overdue_update' ? ( item_id => $self->itemnumber ) : ()),
}
);
$new_outstanding = 0;
{
date => \'NOW()',
amount => $amount,
- amountoutstanding => $new_outstanding
+ amountoutstanding => $new_outstanding,
}
)->store();
manager_id => undef,
}
)
- ) if ( $update_type eq 'fine_update' );
+ ) if ( $update_type eq 'overdue_update' );
}
}
);
=cut
-our $allowed_update = { 'fine_update' => 'FU', };
+our $allowed_update = { 'overdue_update' => { 'OVERDUE' => 'UNRETURNED' } };
=head1 AUTHORS
=head1 branchoverdues.pl
- this module is a new interface, allow to the librarian to check all items on overdues (based on the acountlines type 'FU' )
- this interface is filtered by branches (automatically), and by location (optional) ....
+This view is used to display all overdue items to the librarian.
+
+It is automatically filtered by branch and can optionally be filtered
+by item location.
=cut
my $desc = "staticfine";
my $query = "INSERT INTO accountlines
- (borrowernumber,itemnumber,date,amount,description,accounttype,amountoutstanding)
- VALUES (?,?,now(),?,?,'F',?)";
+ (borrowernumber,itemnumber,date,amount,description,accounttype,status,amountoutstanding)
+ VALUES (?,?,now(),?,?,'OVERDUE','RETURNED',?)";
my $sth2 = $dbh->prepare($query);
$bigdebug and warn "query: $query\nw/ args: $borrowernumber, $itemnumber, $amount, $desc, $amount\n";
$sth2->execute( $borrowernumber, $itemnumber, $amount, $desc, $amount );
{
borrowernumber => $patron->borrowernumber,
amountoutstanding => { '>' => 0 },
- accounttype => [ 'F', 'FU', 'L' ],
+ accounttype => [ 'F', 'L' ],
itemnumber => $issue->{itemnumber}
},
);
my $fines = Koha::Account::Lines->search( { borrowernumber => $renewing_borrower->{borrowernumber}, itemnumber => $item_7->itemnumber } );
is( $fines->count, 2 );
- is( $fines->next->accounttype, 'F', 'Fine on renewed item is closed out properly' );
- is( $fines->next->accounttype, 'F', 'Fine on renewed item is closed out properly' );
+ isnt( $fines->next->status, 'UNRETURNED', 'Fine on renewed item is closed out properly' );
+ isnt( $fines->next->status, 'UNRETURNED', 'Fine on renewed item is closed out properly' );
$fines->delete();
item_id => $item_to_auto_renew->{itemnumber},
description => "Some fines"
}
- )->accounttype('F')->store;
+ )->status('RETURNED')->store;
( $renewokay, $error ) =
CanBookBeRenewed( $renewing_borrowernumber, $item_to_auto_renew->{itemnumber} );
is( $renewokay, 0, 'Do not renew, renewal is automatic' );
item_id => $item_to_auto_renew->{itemnumber},
description => "Some fines"
}
- )->accounttype('F')->store;
+ )->status('RETURNED')->store;
( $renewokay, $error ) =
CanBookBeRenewed( $renewing_borrowernumber, $item_to_auto_renew->{itemnumber} );
is( $renewokay, 0, 'Do not renew, renewal is automatic' );
item_id => $item_to_auto_renew->{itemnumber},
description => "Some fines"
}
- )->accounttype('F')->store;
+ )->status('RETURNED')->store;
( $renewokay, $error ) =
CanBookBeRenewed( $renewing_borrowernumber, $item_to_auto_renew->{itemnumber} );
is( $renewokay, 0, 'Do not renew, renewal is automatic' );
);
my $line = Koha::Account::Lines->search({ borrowernumber => $renewing_borrower->{borrowernumber} })->next();
- is( $line->accounttype, 'FU', 'Account line type is FU' );
+ is( $line->accounttype, 'OVERDUE', 'Account line type is OVERDUE' );
+ is( $line->status, 'UNRETURNED', 'Account line status is UNRETURNED' );
is( $line->amountoutstanding, '15.000000', 'Account line amount outstanding is 15.00' );
is( $line->amount, '15.000000', 'Account line amount is 15.00' );
is( $line->issue_id, $issue->id, 'Account line issue id matches' );
LostItem( $item_1->itemnumber, 'test', 1 );
$line = Koha::Account::Lines->find($line->id);
- is( $line->accounttype, 'F', 'Account type correctly changed from FU to F' );
+ is( $line->accounttype, 'OVERDUE', 'Account type remains as OVERDUE' );
+ isnt( $line->status, 'UNRETURNED', 'Account status correctly changed from UNRETURNED to RETURNED' );
my $item = Koha::Items->find($item_1->itemnumber);
ok( !$item->onloan(), "Lost item marked as returned has false onloan value" );
# specify dropbox date 5 days later => overdue, or... not
AddIssue( $patron->unblessed, $item->{barcode}, $ten_days_ago ); # date due was 10d ago
AddReturn( $item->{barcode}, $library->{branchcode}, $five_days_ago );
- is( int($patron->account->balance()), 0, 'AddReturn: pass return_date => no overdue in dropbox mode' ); # FIXME? This is weird, the FU fine is created ( _CalculateAndUpdateFine > C4::Overdues::UpdateFine ) then remove later (in _FixOverduesOnReturn). Looks like it is a feature
+ is( int($patron->account->balance()), 0, 'AddReturn: pass return_date => no overdue in dropbox mode' ); # FIXME? This is weird, the OVERDUE fine is created ( _CalculateAndUpdateFine > C4::Overdues::UpdateFine ) then remove later (in _FixOverduesOnReturn). Looks like it is a feature
Koha::Account::Lines->search({ borrowernumber => $patron->borrowernumber })->delete;
};
is( $account->balance, $manual_debit_amount - $payment_amount, 'Balance is PF - payment (CR)' );
- my $manual_debit = Koha::Account::Lines->search({ borrowernumber => $patron->id, accounttype => 'FU' })->next;
+ my $manual_debit = Koha::Account::Lines->search({ borrowernumber => $patron->id, accounttype => 'OVERDUE', status => 'UNRETURNED' })->next;
is( $manual_debit->amountoutstanding + 0, $manual_debit_amount - $payment_amount, 'reconcile_balance was called' );
};
};
my $accountline = Koha::Account::Line->new(
{
borrowernumber => $patron->{borrowernumber},
- accounttype => 'FU',
+ accounttype => 'OVERDUE',
+ status => 'UNRETURNED',
itemnumber => $item->itemnumber,
amount => 99.00,
amountoutstanding => 99.00,
$accountline->_result()->discard_changes();
is( $accountline->amountoutstanding, '99.000000', 'Fine has the same amount outstanding as previously' );
- is( $accountline->accounttype, 'F', 'Open fine ( account type FU ) has been closed out ( account type F )');
+ is( $accountline->status, 'RETURNED', 'Open fine ( account type OVERDUE ) has been closed out ( status RETURNED )');
## Run again, with exemptfine enabled
$accountline->set(
{
- accounttype => 'FU',
+ accounttype => 'OVERDUE',
+ status => 'UNRETURNED',
amountoutstanding => 99.00,
}
)->store();
my $offset = Koha::Account::Offsets->search({ debit_id => $accountline->id, type => 'Forgiven' })->next();
is( $accountline->amountoutstanding + 0, 0, 'Fine has been reduced to 0' );
- is( $accountline->accounttype, 'FFOR', 'Open fine ( account type FU ) has been set to fine forgiven ( account type FFOR )');
+ is( $accountline->status, 'FORGIVEN', 'Open fine ( account type OVERDUE ) has been set to fine forgiven ( status FORGIVEN )');
is( ref $offset, "Koha::Account::Offset", "Found matching offset for fine reduction via forgiveness" );
is( $offset->amount, '-99.000000', "Amount of offset is correct" );
};
is( $fine2->amount, '30.000000', "Second fine increased after partial payment of first" );
# Fix fine 1, create third fine
- $fine->accounttype('F')->store;
+ $fine->status('RETURNED')->store;
UpdateFine(
{
issue_id => $checkout1->issue_id,