Bug 24711: Don't add logout input to login form
[koha-ffzg.git] / Koha / Account.pm
index 2c8c4a1..f1bab9f 100644 (file)
@@ -22,6 +22,7 @@ use Modern::Perl;
 use Carp;
 use Data::Dumper;
 use List::MoreUtils qw( uniq );
+use Try::Tiny;
 
 use C4::Circulation qw( ReturnLostItem );
 use C4::Letters;
@@ -31,6 +32,7 @@ use C4::Stats qw( UpdateStats );
 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;
@@ -59,8 +61,8 @@ Koha::Account->new( { patron_id => $borrowernumber } )->pay(
         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
     }
 );
@@ -75,10 +77,10 @@ sub pay {
     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;
@@ -214,12 +216,12 @@ sub pay {
         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(
         {
@@ -227,7 +229,7 @@ sub pay {
             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,
@@ -246,7 +248,7 @@ sub pay {
     UpdateStats(
         {
             branch         => $library_id,
-            type           => $type,
+            type           => lc($type),
             amount         => $amount,
             borrowernumber => $self->{patron_id},
         }
@@ -262,7 +264,7 @@ sub pay {
                     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,
                 }
@@ -280,7 +282,7 @@ sub pay {
                 lang    => $patron->lang,
                 tables => {
                     borrowers       => $self->{patron_id},
-                    branches        => $self->{library_id},
+                    branches        => $library_id,
                 },
                 substitute => {
                     credit => $payment,
@@ -321,11 +323,11 @@ my $credit_line = Koha::Account->new({ patron_id => $patron_id })->add_credit(
 );
 
 $credit_type can be any of:
-  - 'credit'
-  - 'payment'
-  - 'forgiven'
-  - 'lost_item_return'
-  - 'writeoff'
+  - 'CREDIT'
+  - 'PAYMENT'
+  - 'FORGIVEN'
+  - 'LOST_FOUND'
+  - 'WRITEOFF'
 
 =cut
 
@@ -333,8 +335,22 @@ sub add_credit {
 
     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};
@@ -342,85 +358,93 @@ sub add_credit {
     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} // $Koha::Account::offset_type->{CREDIT},
+                        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;
 }
@@ -447,17 +471,16 @@ $debit_type can be any of:
   - ACCOUNT
   - ACCOUNT_RENEW
   - RESERVE_EXPIRED
-  - lost_item
+  - LOST
   - sundry
-  - new_card
-  - overdue
+  - NEW_CARD
+  - OVERDUE
   - PROCESSING
   - RENT
   - RENT_DAILY
   - RENT_RENEW
   - RENT_DAILY_RENEW
   - RESERVE
-  - manual_debit
 
 =cut
 
@@ -465,9 +488,17 @@ sub add_debit {
 
     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' );
@@ -478,80 +509,84 @@ sub add_debit {
     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;
 }
@@ -704,58 +739,24 @@ sub reconcile_balance {
 =cut
 
 our $offset_type = {
-    'credit'           => 'Manual Credit',
-    'forgiven'         => 'Writeoff',
-    'lost_item_return' => 'Lost Item',
-    'payment'          => 'Payment',
-    'writeoff'         => 'Writeoff',
+    'CREDIT'           => 'Manual Credit',
+    'FORGIVEN'         => 'Writeoff',
+    'LOST_FOUND'       => 'Lost Item Found',
+    'PAYMENT'          => 'Payment',
+    'WRITEOFF'         => 'Writeoff',
     'ACCOUNT'          => 'Account Fee',
     'ACCOUNT_RENEW'    => 'Account Fee',
     'RESERVE'          => 'Reserve Fee',
     'PROCESSING'       => 'Processing Fee',
-    'lost_item'        => 'Lost Item',
+    'LOST'             => 'Lost Item',
     'RENT'             => 'Rental Fee',
     'RENT_DAILY'       => 'Rental Fee',
     'RENT_RENEW'       => 'Rental Fee',
     'RENT_DAILY_RENEW' => 'Rental Fee',
-    'overdue'          => 'OVERDUE',
-    'manual_debit'     => 'Manual Debit',
+    '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',
-    'sundry'           => 'M',
-    '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',
-    'manual_debit'     => 'M'
-};
-
 =head1 AUTHORS
 
 =encoding utf8