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,
}
my $debits = $account->outstanding_debits;
my $outstanding_amount = $credit->apply( { debits => $debits, [ offset_type => $offset_type ] } );
-Applies the credit to a given debits set.
+Applies the credit to a given debits array reference.
=head4 arguments hashref
my $schema = Koha::Database->new->schema;
$schema->txn_do( sub {
- while ( my $debit = $debits->next ) {
+ for my $debit ( @{$debits} ) {
unless ( $debit->is_debit ) {
Koha::Exceptions::Account::IsNotDebit->throw(
$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;
return !$self->is_credit;
}
+=head3 to_api_mapping
+
+This method returns the mapping for representing a Koha::Account::Line object
+on the API.
+
+=cut
+
+sub to_api_mapping {
+ return {
+ accountlines_id => 'account_line_id',
+ accounttype => 'account_type',
+ amountoutstanding => 'amount_outstanding',
+ borrowernumber => 'patron_id',
+ branchcode => 'library_id',
+ issue_id => 'checkout_id',
+ itemnumber => 'item_id',
+ manager_id => 'user_id',
+ note => 'internal_note',
+ };
+}
+
=head2 Internal methods
=cut
return 'Accountline';
}
-=head3 object_class (internal)
+1;
+
+=head2 Name mappings
+
+=head3 $allowed_update
=cut
-sub object_class {
- return 'Koha::Account::Line';
-}
+our $allowed_update = { 'overdue_update' => { 'OVERDUE' => 'UNRETURNED' } };
-1;
+=head1 AUTHORS
+
+Kyle M Hall <kyle@bywatersolutions.com >
+Tomás Cohen Arazi <tomascohen@theke.io>
+Martin Renvoize <martin.renvoize@ptfs-europe.com>
+
+=cut