use Carp;
use Data::Dumper;
use List::MoreUtils qw( uniq );
+use Try::Tiny;
use C4::Circulation qw( ReturnLostItem );
use C4::Letters;
use Koha::Patrons;
use Koha::Account::Lines;
use Koha::Account::Offsets;
+use Koha::Account::DebitTypes;
use Koha::DateUtils qw( dt_from_string );
use Koha::Exceptions;
use Koha::Exceptions::Account;
note => $note,
description => $description,
library_id => $branchcode,
- lines => $lines, # Arrayref of Koha::Account::Line objects to pay
- account_type => $type, # accounttype code
+ lines => $lines, # Arrayref of Koha::Account::Line objects to pay
+ credit_type => $type, # credit_type_code code
offset_type => $offset_type, # offset type code
}
);
my $note = $params->{note} || q{};
my $library_id = $params->{library_id};
my $lines = $params->{lines};
- my $type = $params->{type} || 'payment';
+ my $type = $params->{type} || 'PAYMENT';
my $payment_type = $params->{payment_type} || undef;
- my $account_type = $params->{account_type};
- my $offset_type = $params->{offset_type} || $type eq 'writeoff' ? 'Writeoff' : 'Payment';
+ my $credit_type = $params->{credit_type};
+ my $offset_type = $params->{offset_type} || $type eq 'WRITEOFF' ? 'Writeoff' : 'Payment';
my $cash_register = $params->{cash_register};
my $userenv = C4::Context->userenv;
last unless $balance_remaining > 0;
}
- $account_type ||=
- $type eq 'writeoff'
- ? 'W'
- : 'Pay';
+ $credit_type ||=
+ $type eq 'WRITEOFF'
+ ? 'WRITEOFF'
+ : 'PAYMENT';
- $description ||= $type eq 'writeoff' ? 'Writeoff' : q{};
+ $description ||= $type eq 'WRITEOFF' ? 'Writeoff' : q{};
my $payment = Koha::Account::Line->new(
{
date => dt_from_string(),
amount => 0 - $amount,
description => $description,
- accounttype => $account_type,
+ credit_type_code => $credit_type,
payment_type => $payment_type,
amountoutstanding => 0 - $balance_remaining,
manager_id => $manager_id,
UpdateStats(
{
branch => $library_id,
- type => $type,
+ type => lc($type),
amount => $amount,
borrowernumber => $self->{patron_id},
}
borrowernumber => $self->{patron_id},
amount => 0 - $amount,
amountoutstanding => 0 - $balance_remaining,
- accounttype => $account_type,
+ credit_type_code => $credit_type,
accountlines_paid => \@fines_paid,
manager_id => $manager_id,
}
lang => $patron->lang,
tables => {
borrowers => $self->{patron_id},
- branches => $self->{library_id},
+ branches => $library_id,
},
substitute => {
credit => $payment,
);
$credit_type can be any of:
- - 'credit'
- - 'payment'
- - 'forgiven'
- - 'lost_item_return'
- - 'writeoff'
+ - 'CREDIT'
+ - 'PAYMENT'
+ - 'FORGIVEN'
+ - 'LOST_RETURN'
+ - 'WRITEOFF'
=cut
my ( $self, $params ) = @_;
- # amount is passed as a positive value, but we store credit as negative values
- my $amount = $params->{amount} * -1;
+ # check for mandatory params
+ my @mandatory = ( 'interface', 'amount' );
+ for my $param (@mandatory) {
+ unless ( defined( $params->{$param} ) ) {
+ Koha::Exceptions::MissingParameter->throw(
+ error => "The $param parameter is mandatory" );
+ }
+ }
+
+ # amount should always be passed as a positive value
+ my $amount = $params->{amount} * -1;
+ unless ( $amount < 0 ) {
+ Koha::Exceptions::Account::AmountNotPositive->throw(
+ error => 'Debit amount passed is not positive' );
+ }
+
my $description = $params->{description} // q{};
my $note = $params->{note} // q{};
my $user_id = $params->{user_id};
my $library_id = $params->{library_id};
my $cash_register = $params->{cash_register};
my $payment_type = $params->{payment_type};
- my $type = $params->{type} || 'payment';
+ my $credit_type = $params->{type} || 'PAYMENT';
my $item_id = $params->{item_id};
- unless ( $interface ) {
- Koha::Exceptions::MissingParameter->throw(
- error => 'The interface parameter is mandatory'
- );
- }
-
Koha::Exceptions::Account::RegisterRequired->throw()
if ( C4::Context->preference("UseCashRegisters")
&& defined($payment_type)
&& ( $payment_type eq 'CASH' )
&& !defined($cash_register) );
- my $schema = Koha::Database->new->schema;
-
- my $account_type = $Koha::Account::account_type_credit->{$type};
my $line;
+ my $schema = Koha::Database->new->schema;
+ try {
+ $schema->txn_do(
+ sub {
- $schema->txn_do(
- sub {
-
- # Insert the account line
- $line = Koha::Account::Line->new(
- { borrowernumber => $self->{patron_id},
- date => \'NOW()',
- amount => $amount,
- description => $description,
- accounttype => $account_type,
- amountoutstanding => $amount,
- payment_type => $payment_type,
- note => $note,
- manager_id => $user_id,
- interface => $interface,
- branchcode => $library_id,
- register_id => $cash_register,
- itemnumber => $item_id,
- }
- )->store();
+ # Insert the account line
+ $line = Koha::Account::Line->new(
+ {
+ borrowernumber => $self->{patron_id},
+ date => \'NOW()',
+ amount => $amount,
+ description => $description,
+ credit_type_code => $credit_type,
+ amountoutstanding => $amount,
+ payment_type => $payment_type,
+ note => $note,
+ manager_id => $user_id,
+ interface => $interface,
+ branchcode => $library_id,
+ register_id => $cash_register,
+ itemnumber => $item_id,
+ }
+ )->store();
- # Record the account offset
- my $account_offset = Koha::Account::Offset->new(
- { credit_id => $line->id,
- type => $Koha::Account::offset_type->{$type},
- amount => $amount
- }
- )->store();
+ # Record the account offset
+ my $account_offset = Koha::Account::Offset->new(
+ {
+ credit_id => $line->id,
+ type => $Koha::Account::offset_type->{$credit_type},
+ amount => $amount
+ }
+ )->store();
- UpdateStats(
- { branch => $library_id,
- type => $type,
- amount => $amount,
- borrowernumber => $self->{patron_id},
+ UpdateStats(
+ {
+ branch => $library_id,
+ type => lc($credit_type),
+ amount => $amount,
+ borrowernumber => $self->{patron_id},
+ }
+ ) if grep { $credit_type eq $_ } ( 'PAYMENT', 'WRITEOFF' );
+
+ if ( C4::Context->preference("FinesLog") ) {
+ logaction(
+ "FINES", 'CREATE',
+ $self->{patron_id},
+ Dumper(
+ {
+ action => "create_$credit_type",
+ borrowernumber => $self->{patron_id},
+ amount => $amount,
+ description => $description,
+ amountoutstanding => $amount,
+ credit_type_code => $credit_type,
+ note => $note,
+ itemnumber => $item_id,
+ manager_id => $user_id,
+ branchcode => $library_id,
+ }
+ ),
+ $interface
+ );
}
- ) if grep { $type eq $_ } ('payment', 'writeoff') ;
-
- if ( C4::Context->preference("FinesLog") ) {
- logaction(
- "FINES", 'CREATE',
- $self->{patron_id},
- Dumper(
- { action => "create_$type",
- borrowernumber => $self->{patron_id},
- amount => $amount,
- description => $description,
- amountoutstanding => $amount,
- accounttype => $account_type,
- note => $note,
- itemnumber => $item_id,
- manager_id => $user_id,
- branchcode => $library_id,
- }
- ),
- $interface
- );
+ }
+ );
+ }
+ catch {
+ if ( ref($_) eq 'Koha::Exceptions::Object::FKConstraint' ) {
+ if ( $_->broken_fk eq 'credit_type_code' ) {
+ Koha::Exceptions::Account::UnrecognisedType->throw(
+ error => 'Type of credit not recognised' );
+ }
+ else {
+ $_->rethrow;
}
}
- );
+ };
return $line;
}
- RESERVE_EXPIRED
- LOST
- sundry
- - new_card
- - overdue
+ - NEW_CARD
+ - OVERDUE
- PROCESSING
- RENT
- RENT_DAILY
my ( $self, $params ) = @_;
+ # check for mandatory params
+ my @mandatory = ( 'interface', 'type', 'amount' );
+ for my $param (@mandatory) {
+ unless ( defined( $params->{$param} ) ) {
+ Koha::Exceptions::MissingParameter->throw(
+ error => "The $param parameter is mandatory" );
+ }
+ }
+
# amount should always be a positive value
my $amount = $params->{amount};
-
unless ( $amount > 0 ) {
Koha::Exceptions::Account::AmountNotPositive->throw(
error => 'Debit amount passed is not positive' );
my $user_id = $params->{user_id};
my $interface = $params->{interface};
my $library_id = $params->{library_id};
- my $type = $params->{type};
+ my $debit_type = $params->{type};
my $item_id = $params->{item_id};
my $issue_id = $params->{issue_id};
-
- unless ($interface) {
- Koha::Exceptions::MissingParameter->throw(
- error => 'The interface parameter is mandatory' );
- }
-
- my $schema = Koha::Database->new->schema;
-
- unless ( exists($Koha::Account::account_type_debit->{$type}) ) {
- Koha::Exceptions::Account::UnrecognisedType->throw(
- error => 'Type of debit not recognised'
- );
- }
-
- my $debit_type_code = $Koha::Account::account_type_debit->{$type};
+ my $offset_type = $Koha::Account::offset_type->{$debit_type} // 'Manual Debit';
my $line;
- $schema->txn_do(
- sub {
+ my $schema = Koha::Database->new->schema;
+ try {
+ $schema->txn_do(
+ sub {
- # Insert the account line
- $line = Koha::Account::Line->new(
- {
- borrowernumber => $self->{patron_id},
- date => \'NOW()',
- amount => $amount,
- description => $description,
- debit_type_code => $debit_type_code,
- amountoutstanding => $amount,
- payment_type => undef,
- note => $note,
- manager_id => $user_id,
- interface => $interface,
- itemnumber => $item_id,
- issue_id => $issue_id,
- branchcode => $library_id,
- ( $type eq 'overdue' ? ( status => 'UNRETURNED' ) : () ),
- }
- )->store();
+ # Insert the account line
+ $line = Koha::Account::Line->new(
+ {
+ borrowernumber => $self->{patron_id},
+ date => \'NOW()',
+ amount => $amount,
+ description => $description,
+ debit_type_code => $debit_type,
+ amountoutstanding => $amount,
+ payment_type => undef,
+ note => $note,
+ manager_id => $user_id,
+ interface => $interface,
+ itemnumber => $item_id,
+ issue_id => $issue_id,
+ branchcode => $library_id,
+ (
+ $debit_type eq 'OVERDUE'
+ ? ( status => 'UNRETURNED' )
+ : ()
+ ),
+ }
+ )->store();
- # Record the account offset
- my $account_offset = Koha::Account::Offset->new(
- {
- debit_id => $line->id,
- type => $Koha::Account::offset_type->{$type},
- amount => $amount
+ # Record the account offset
+ my $account_offset = Koha::Account::Offset->new(
+ {
+ debit_id => $line->id,
+ type => $offset_type,
+ amount => $amount
+ }
+ )->store();
+
+ if ( C4::Context->preference("FinesLog") ) {
+ logaction(
+ "FINES", 'CREATE',
+ $self->{patron_id},
+ Dumper(
+ {
+ action => "create_$debit_type",
+ borrowernumber => $self->{patron_id},
+ amount => $amount,
+ description => $description,
+ amountoutstanding => $amount,
+ debit_type_code => $debit_type,
+ note => $note,
+ itemnumber => $item_id,
+ manager_id => $user_id,
+ }
+ ),
+ $interface
+ );
}
- )->store();
-
- if ( C4::Context->preference("FinesLog") ) {
- logaction(
- "FINES", 'CREATE',
- $self->{patron_id},
- Dumper(
- {
- action => "create_$type",
- borrowernumber => $self->{patron_id},
- amount => $amount,
- description => $description,
- amountoutstanding => $amount,
- debit_type_code => $debit_type_code,
- note => $note,
- itemnumber => $item_id,
- manager_id => $user_id,
- }
- ),
- $interface
- );
+ }
+ );
+ }
+ catch {
+ if ( ref($_) eq 'Koha::Exceptions::Object::FKConstraint' ) {
+ if ( $_->broken_fk eq 'debit_type_code' ) {
+ Koha::Exceptions::Account::UnrecognisedType->throw(
+ error => 'Type of debit not recognised' );
+ }
+ else {
+ $_->rethrow;
}
}
- );
+ };
return $line;
}
=cut
our $offset_type = {
- 'credit' => 'Manual Credit',
- 'forgiven' => 'Writeoff',
- 'lost_item_return' => 'Lost Item',
- 'payment' => 'Payment',
- 'writeoff' => 'Writeoff',
+ 'CREDIT' => 'Manual Credit',
+ 'FORGIVEN' => 'Writeoff',
+ 'LOST_RETURN' => 'Lost Item',
+ 'PAYMENT' => 'Payment',
+ 'WRITEOFF' => 'Writeoff',
'ACCOUNT' => 'Account Fee',
'ACCOUNT_RENEW' => 'Account Fee',
'RESERVE' => 'Reserve Fee',
'RENT_DAILY' => 'Rental Fee',
'RENT_RENEW' => 'Rental Fee',
'RENT_DAILY_RENEW' => 'Rental Fee',
- 'overdue' => 'OVERDUE',
+ 'OVERDUE' => 'OVERDUE',
'RESERVE_EXPIRED' => 'Hold Expired'
};
-=head3 $account_type_credit
-
-=cut
-
-our $account_type_credit = {
- 'credit' => 'C',
- 'forgiven' => 'FOR',
- 'lost_item_return' => 'LOST_RETURN',
- 'payment' => 'Pay',
- 'writeoff' => 'W'
-};
-
-=head3 $account_type_debit
-
-=cut
-
-our $account_type_debit = {
- 'ACCOUNT' => 'ACCOUNT',
- 'ACCOUNT_RENEW' => 'ACCOUNT_RENEW',
- 'RESERVE_EXPIRED' => 'RESERVE_EXPIRED',
- 'LOST_ITEM' => 'LOST',
- 'new_card' => 'N',
- 'overdue' => 'OVERDUE',
- 'PROCESSING' => 'PROCESSING',
- 'RENT' => 'RENT',
- 'RENT_DAILY' => 'RENT_DAILY',
- 'RENT_RENEW' => 'RENT_RENEW',
- 'RENT_DAILY_RENEW' => 'RENT_DAILY_RENEW',
- 'RESERVE' => 'RESERVE',
-};
-
=head1 AUTHORS
=encoding utf8