use base qw(Koha::Object);
+=encoding utf8
+
=head1 NAME
Koha::Account::Line - Koha accountline Object class
=cut
+=head3 patron
+
+Return the patron linked to this account line
+
+=cut
+
+sub patron {
+ my ( $self ) = @_;
+ my $rs = $self->_result->borrowernumber;
+ return unless $rs;
+ return Koha::Patron->_new_from_dbic( $rs );
+}
+
=head3 item
Return the item linked to this account line if exists
sub item {
my ( $self ) = @_;
my $rs = $self->_result->itemnumber;
+ return unless $rs;
return Koha::Item->_new_from_dbic( $rs );
}
+=head3 checkout
+
+Return the checkout linked to this account line if exists
+
+=cut
+
+sub checkout {
+ my ( $self ) = @_;
+ return unless $self->issue_id ;
+
+ $self->{_checkout} ||= Koha::Checkouts->find( $self->issue_id );
+ $self->{_checkout} ||= Koha::Old::Checkouts->find( $self->issue_id );
+ return $self->{_checkout};
+}
+
=head3 void
-$payment_accountline->void();
+ $payment_accountline->void();
+
+Used to 'void' (or reverse) a payment/credit. It will roll back any offsets
+created by the application of this credit upon any debits and mark the credit
+as 'void' by updating it's status to "VOID".
=cut
$self->set(
{
- accounttype => 'VOID',
+ status => 'VOID',
amountoutstanding => 0,
amount => 0,
}
$self->amountoutstanding( $available_credit * -1 )->store;
$debit->amountoutstanding( $owed - $amount_to_cancel )->store;
+
+ # Same logic exists in Koha::Account::pay
+ if ( $debit->amountoutstanding == 0
+ && $debit->itemnumber
+ && $debit->accounttype
+ && $debit->accounttype eq 'LOST' )
+ {
+ C4::Circulation::ReturnLostItem( $self->borrowernumber, $debit->itemnumber );
+ }
+
}
});
return $available_credit;
}
+=head3 adjust
+
+This method allows updating a debit or credit on a patron's account
+
+ $account_line->adjust(
+ {
+ amount => $amount,
+ type => $update_type,
+ interface => $interface
+ }
+ );
+
+$update_type can be any of:
+ - 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.
+Incrementing fines are the only existing case at the time of writing,
+all other forms of 'adjustment' should be recorded as distinct credits
+or debits and applied, via an offset, to the corresponding debit or credit.
+
+=cut
+
+sub adjust {
+ my ( $self, $params ) = @_;
+
+ my $amount = $params->{amount};
+ my $update_type = $params->{type};
+ my $interface = $params->{interface};
+
+ unless ( exists($Koha::Account::Line::allowed_update->{$update_type}) ) {
+ Koha::Exceptions::Account::UnrecognisedType->throw(
+ error => 'Update type not recognised'
+ );
+ }
+
+ 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' );
+ }
+
+ my $schema = Koha::Database->new->schema;
+
+ $schema->txn_do(
+ sub {
+
+ my $amount_before = $self->amount;
+ my $amount_outstanding_before = $self->amountoutstanding;
+ my $difference = $amount - $amount_before;
+ my $new_outstanding = $amount_outstanding_before + $difference;
+
+ my $offset_type = $account_type;
+ $offset_type .= ( $difference > 0 ) ? "_INCREASE" : "_DECREASE";
+
+ # Catch cases that require patron refunds
+ if ( $new_outstanding < 0 ) {
+ my $account =
+ Koha::Patrons->find( $self->borrowernumber )->account;
+ my $credit = $account->add_credit(
+ {
+ amount => $new_outstanding * -1,
+ description => 'Overpayment refund',
+ type => 'credit',
+ interface => $interface,
+ ( $update_type eq 'overdue_update' ? ( item_id => $self->itemnumber ) : ()),
+ }
+ );
+ $new_outstanding = 0;
+ }
+
+ # Update the account line
+ $self->set(
+ {
+ date => \'NOW()',
+ amount => $amount,
+ amountoutstanding => $new_outstanding,
+ }
+ )->store();
+
+ # Record the account offset
+ my $account_offset = Koha::Account::Offset->new(
+ {
+ debit_id => $self->id,
+ type => $offset_type,
+ amount => $difference
+ }
+ )->store();
+
+ if ( C4::Context->preference("FinesLog") ) {
+ logaction(
+ "FINES", 'UPDATE', #undef becomes UPDATE in UpdateFine
+ $self->borrowernumber,
+ Dumper(
+ { action => $update_type,
+ borrowernumber => $self->borrowernumber,
+ amount => $amount,
+ description => undef,
+ amountoutstanding => $new_outstanding,
+ accounttype => $self->accounttype,
+ note => undef,
+ itemnumber => $self->itemnumber,
+ manager_id => undef,
+ }
+ )
+ ) if ( $update_type eq 'overdue_update' );
+ }
+ }
+ );
+
+ return $self;
+}
+
=head3 is_credit
my $bool = $line->is_credit;
}
1;
+
+=head2 Name mappings
+
+=head3 $allowed_update
+
+=cut
+
+our $allowed_update = { 'overdue_update' => { 'OVERDUE' => 'UNRETURNED' } };
+
+=head1 AUTHORS
+
+Kyle M Hall <kyle@bywatersolutions.com >
+Tomás Cohen Arazi <tomascohen@theke.io>
+Martin Renvoize <martin.renvoize@ptfs-europe.com>
+
+=cut