Bug 23049: Update maninvoice to reference debit types
authorMartin Renvoize <martin.renvoize@ptfs-europe.com>
Thu, 10 Oct 2019 16:14:39 +0000 (17:14 +0100)
committerMartin Renvoize <martin.renvoize@ptfs-europe.com>
Thu, 24 Oct 2019 16:24:06 +0000 (17:24 +0100)
Test plan:
1) Naviage to a patron record and select the accounts > manual invoice
   tab
2) Add some manual invoices and confirm they are working as expected
3) Signoff

Signed-off-by: Séverine QUEUNE <severine.queune@bulac.fr>
Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>

Koha/Account/Line.pm
admin/debit_types.pl
koha-tmpl/intranet-tmpl/prog/en/includes/accounts.inc
koha-tmpl/intranet-tmpl/prog/en/modules/members/maninvoice.tt
members/maninvoice.pl

index ae7bbc1..b66239d 100644 (file)
@@ -22,6 +22,7 @@ use Data::Dumper;
 
 use C4::Log qw(logaction);
 
+use Koha::Account::DebitType;
 use Koha::Account::Offsets;
 use Koha::Database;
 use Koha::Exceptions::Account;
@@ -82,6 +83,19 @@ sub checkout {
     return $self->{_checkout};
 }
 
+=head3 debit_type
+
+Return the debit_type linked to this account line
+
+=cut
+
+sub debit_type {
+    my ( $self ) = @_;
+    my $rs = $self->_result->debit_type_code;
+    return unless $rs;
+    return Koha::Account::DebitType->_new_from_dbic( $rs );
+}
+
 =head3 void
 
   $payment_accountline->void();
index fdb79f8..8750d70 100755 (executable)
@@ -23,6 +23,7 @@ use C4::Context;
 use C4::Auth;
 use C4::Output;
 
+use Koha::Account::DebitType;
 use Koha::Account::DebitTypes;
 
 my $input = new CGI;
@@ -113,7 +114,9 @@ elsif ( $op eq 'delete_confirmed' ) {
 
 if ( $op eq 'list' ) {
     my $debit_types = Koha::Account::DebitTypes->search();
-    $template->param( debit_types => $debit_types );
+    $template->param(
+        debit_types  => $debit_types,
+    );
 }
 
 $template->param(
index 61a31a2..c863e98 100644 (file)
@@ -1,28 +1,36 @@
 [%- BLOCK account_type_description -%]
-    [%- SWITCH account.accounttype -%]
-        [%- CASE 'Pay'              -%]<span>Payment
-        [%- CASE 'N'                -%]<span>New card
-        [%- CASE 'OVERDUE'          -%]<span>Fine
-        [%- CASE 'ACCOUNT'          -%]<span>Account creation fee
-        [%- CASE 'ACCOUNT_RENEW'    -%]<span>Account renewal fee
-        [%- CASE 'M'                -%]<span>Sundry
-        [%- CASE 'LOST'             -%]<span>Lost item
-        [%- CASE 'W'                -%]<span>Writeoff
-        [%- CASE 'HE'               -%]<span>Hold waiting too long
-        [%- CASE 'RENT'             -%]<span>Rental fee
-        [%- CASE 'RENT_DAILY'       -%]<span>Daily rental fee
-        [%- CASE 'RENT_RENEW'       -%]<span>Renewal of rental item
-        [%- CASE 'RENT_DAILY_RENEW' -%]<span>Rewewal of daily rental item
-        [%- CASE 'FOR'              -%]<span>Forgiven
-        [%- CASE 'PF'               -%]<span>Lost item processing fee
-        [%- CASE 'PAY'              -%]<span>Payment
-        [%- CASE 'WO'               -%]<span>Writeoff
-        [%- CASE 'C'                -%]<span>Credit
-        [%- CASE 'LOST_RETURN'      -%]<span>Lost item fee refund
-        [%- CASE 'Res'              -%]<span>Hold fee
-        [%- CASE                    -%]<span>[% account.accounttype | html %]
+    <span>
+    [%- IF account.accounttype -%]
+        [%- SWITCH account.accounttype -%]
+            [%- CASE 'Pay'              -%]Payment
+            [%- CASE 'W'                -%]Writeoff
+            [%- CASE 'FOR'              -%]Forgiven
+            [%- CASE 'PAY'              -%]Payment
+            [%- CASE 'WO'               -%]Writeoff
+            [%- CASE 'C'                -%]Credit
+            [%- CASE 'LOST_RETURN'      -%]Lost item fee refund
+            [%- CASE                    -%][% account.accounttype | html %]
+        [%- END -%]
+    [%- ELSIF account.debit_type -%]
+       [%- SWITCH account.debit_type -%]
+           [%- CASE 'ACCOUNT'          -%]Account creation fee
+           [%- CASE 'ACCOUNT_RENEW'    -%]Account renewal fee
+           [%- CASE 'HE'               -%]Hold waiting too long
+           [%- CASE 'LOST'             -%]Lost item
+           [%- CASE 'M'                -%]Sundry
+           [%- CASE 'N'                -%]New card
+           [%- CASE 'OVERDUE'          -%]Fine
+           [%- CASE 'PF'               -%]Lost item processing fee
+           [%- CASE 'RENT'             -%]Rental fee
+           [%- CASE 'RENT_DAILY'       -%]Daily rental fee
+           [%- CASE 'RENT_RENEW'       -%]Renewal of rental item
+           [%- CASE 'RENT_DAILY_RENEW' -%]Rewewal of daily rental item
+           [%- CASE 'Res'              -%]Hold fee
+           [%- CASE                    -%][% account.debit_type.description | html %]
+       [%- END -%]
     [%- END -%]
-    [%- PROCESS account_status_description account=account -%]</span>
+    [%- PROCESS account_status_description account=account -%]
+    </span>
 [%- END -%]
 
 [%- BLOCK offset_type_description -%]
index 8def740..9713cfc 100644 (file)
@@ -1,6 +1,7 @@
 [% USE raw %]
 [% USE Asset %]
 [% USE Koha %]
+[% USE Price %]
 [% USE Branches %]
 [% SET footerjs = 1 %]
 [% INCLUDE 'doc-head-open.inc' %]
 [% INCLUDE 'header.inc' %]
 [% INCLUDE 'patron-search.inc' %]
 
-<div id="breadcrumbs"><a href="/cgi-bin/koha/mainpage.pl">Home</a> &rsaquo; <a href="/cgi-bin/koha/members/members-home.pl">Patrons</a>  &rsaquo; Manual invoice</div>
+<div id="breadcrumbs">
+    <a href="/cgi-bin/koha/mainpage.pl">Home</a> &rsaquo;
+    <a href="/cgi-bin/koha/members/members-home.pl">Patrons</a> &rsaquo;
+    Manual invoice
+</div>
 
 <div class="main container-fluid">
     <div class="row">
         <div class="col-sm-10 col-sm-push-2">
             <main>
 
-[% INCLUDE 'members-toolbar.inc' %]
+            [% INCLUDE 'members-toolbar.inc' %]
 
-<!-- The manual invoice and credit buttons -->
-<div class="statictabs">
-<ul>
-    <li><a href="/cgi-bin/koha/members/boraccount.pl?borrowernumber=[% patron.borrowernumber | uri %]">Transactions</a></li>
-    <li><a href="/cgi-bin/koha/members/pay.pl?borrowernumber=[% patron.borrowernumber | uri %]" >Make a payment</a></li>
-    <li class="active"><a href="/cgi-bin/koha/members/maninvoice.pl?borrowernumber=[% patron.borrowernumber | uri %]" >Create manual invoice</a></li>
-    <li><a href="/cgi-bin/koha/members/mancredit.pl?borrowernumber=[% patron.borrowernumber | uri %]" >Create manual credit</a></li>
-</ul>
-<div class="tabs-container">
+            <!-- The manual invoice and credit buttons -->
+            <div class="statictabs">
+                <ul>
+                    <li><a href="/cgi-bin/koha/members/boraccount.pl?borrowernumber=[% patron.borrowernumber | uri %]">Transactions</a></li>
+                    <li><a href="/cgi-bin/koha/members/pay.pl?borrowernumber=[% patron.borrowernumber | uri %]" >Make a payment</a></li>
+                    <li class="active"><a href="/cgi-bin/koha/members/maninvoice.pl?borrowernumber=[% patron.borrowernumber | uri %]" >Create manual invoice</a></li>
+                    <li><a href="/cgi-bin/koha/members/mancredit.pl?borrowernumber=[% patron.borrowernumber | uri %]" >Create manual credit</a></li>
+                </ul>
+                <div class="tabs-container">
 
-[% IF ( ERROR ) %]
-[% IF ( ITEMNUMBER ) %]
-  ERROR an invalid itemnumber was entered, please hit back and try again
-[% END %]
-[% ELSE %]
-<form action="/cgi-bin/koha/members/maninvoice.pl" method="post" id="maninvoice"><input type="hidden" name="borrowernumber" id="borrowernumber" value="[% patron.borrowernumber | html %]" />
-    <input type="hidden" name="csrf_token" value="[% csrf_token | html %]" />
-       <fieldset class="rows">
-       <legend>Manual invoice</legend>
-       <ol>
-      <li>
-        <label for="type">Type: </label>
-        <select name="type" id="invoice_type">
-          <option value="LOST">Lost item</option>
-          <option value="OVERDUE">Fine</option>
-          <option value="A">Account management fee</option>
-          <option value="N">New card</option>
-          <option value="M">Sundry</option>
-          [% FOREACH invoice_types_loo IN invoice_types_loop %]
-            <option value="[% invoice_types_loo.authorised_value | html %]">[% invoice_types_loo.authorised_value | html %]</option>
-          [% END %]
-        </select>
-      </li>
-       <li><label for="barcode">Barcode: </label><input type="text" name="barcode" id="barcode" /></li>
-       <li><label for="desc">Description: </label><input type="text" name="desc" id="desc" size="50" /></li>
-    <li><label for="note">Note: </label><input type="text" name="note" size="50" id="note" /></li>
-    <li><label for="amount">Amount: </label><input type="number" name="amount" id="amount" required="required" value="" step="any" min="0" /> Example: 5.00</li>
-       </ol></fieldset>
-<fieldset class="action"><input type="submit" name="add" value="Save" /> <a class="cancel" href="/cgi-bin/koha/members/boraccount.pl?borrowernumber=[% patron.borrowernumber | html %]">Cancel</a></fieldset>
-</form>
+                [% IF ( ERROR ) %]
+                [% IF ( ITEMNUMBER ) %]
+                  ERROR an invalid itemnumber was entered, please hit back and try again
+                [% END %]
+                [% ELSE %]
+                <form action="/cgi-bin/koha/members/maninvoice.pl" method="post" id="maninvoice"><input type="hidden" name="borrowernumber" id="borrowernumber" value="[% patron.borrowernumber | html %]" />
+                    <input type="hidden" name="csrf_token" value="[% csrf_token | html %]" />
+            <fieldset class="rows">
+            <legend>Manual invoice</legend>
+            <ol>
+                      <li>
+                        <label for="type">Type: </label>
+                        <select name="type" id="type">
+                          [% FOREACH debit_type IN debit_types %]
+                            <option value="[% debit_type.code | html %]">[% debit_type.description | html %]</option>
+                          [% END %]
+                        </select>
+                      </li>
+              <li><label for="barcode">Barcode: </label><input type="text" name="barcode" id="barcode" /></li>
+                      <li><label for="desc">Description: </label><input type="text" name="desc" id="desc" size="50" /></li>
+                      <li><label for="note">Note: </label><input type="text" name="note" size="50" id="note" /></li>
+                      <li><label for="amount">Amount: </label><input type="number" name="amount" id="amount" required="required" value="" step="any" min="0" /> Example: 5.00</li>
+            </ol>
+                    </fieldset>
+                    <fieldset class="action">
+                        <input type="submit" name="add" value="Save" /> <a class="cancel" href="/cgi-bin/koha/members/boraccount.pl?borrowernumber=[% patron.borrowernumber | html %]">Cancel</a>
+                    </fieldset>
+                </form>
 
-[% END %]
-</div></div>
+                [% END %]
+                </div>
+            </div>
 
             </main>
         </div> <!-- /.col-sm-10.col-sm-push-2 -->
@@ -79,9 +83,9 @@
     [% INCLUDE 'str/members-menu.inc' %]
     [% Asset.js("js/members-menu.js") | $raw %]
     <script>
-        var type_fees = {'LOST':'','OVERDUE':'','ACCOUNT':'','ACCOUNT_RENEW':'','N':'','M':''};
-        [% FOREACH invoice_types_loo IN invoice_types_loop %]
-            type_fees['[% invoice_types_loo.authorised_value | html %]'] = "[% invoice_types_loo.lib | html %]";
+        var type_fees = {};
+        [% FOREACH debit_type IN debit_types %]
+            type_fees['[% debit_type.code | html %]'] = "[% debit_type.default_amount | $Price %]";
         [% END %]
         $(document).ready(function(){
             $('#maninvoice').preventDoubleFormSubmit();
                 this.form.desc.value = this.options[this.selectedIndex].value;
                 this.form.amount.value = type_fees[this.options[this.selectedIndex].value];
             });
+            $("#maninvoice #desc").val($("#maninvoice #type option:selected").text());
+            $("#maninvoice #amount").val(type_fees[$("#maninvoice #type option:selected").val()]);
+            $("#maninvoice #type").change(function(){
+                $("#maninvoice #desc").val($(this).find("option:selected").text());
+                $("#maninvoice #amount").val(type_fees[$(this).val()]);
+            });
         });
     </script>
 [% END %]
index 76d224b..3642cd3 100755 (executable)
@@ -3,9 +3,9 @@
 #written 11/1/2000 by chris@katipo.oc.nz
 #script to display borrowers account details
 
-
 # Copyright 2000-2002 Katipo Communications
 # Copyright 2010 BibLibre
+# Copyright 2019 PTFS Europe
 #
 # This file is part of Koha.
 #
@@ -36,94 +36,105 @@ use Koha::Items;
 use Koha::Patrons;
 
 use Koha::Patron::Categories;
+use Koha::Account::DebitTypes;
 
-my $input=new CGI;
-my $flagsrequired = { borrowers => 'edit_borrowers' };
+my $input = new CGI;
 my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
-    {   template_name   => "members/maninvoice.tt",
+    {
+        template_name   => "members/maninvoice.tt",
         query           => $input,
         type            => "intranet",
         authnotrequired => 0,
-        flagsrequired   => $flagsrequired,
-        debug           => 1,
+        flagsrequired   => {
+            borrowers     => 'edit_borrowers',
+            updatecharges => 'remaining_permissions'
+        }
     }
 );
 
-my $borrowernumber=$input->param('borrowernumber');
-
-my $patron = Koha::Patrons->find( $borrowernumber );
-unless ( $patron ) {
-    print $input->redirect("/cgi-bin/koha/circ/circulation.pl?borrowernumber=$borrowernumber");
+my $borrowernumber = $input->param('borrowernumber');
+my $patron         = Koha::Patrons->find($borrowernumber);
+unless ($patron) {
+    print $input->redirect(
+        "/cgi-bin/koha/circ/circulation.pl?borrowernumber=$borrowernumber");
     exit;
 }
 
-my $add=$input->param('add');
-if ($add){
-    if ( checkauth( $input, 0, $flagsrequired, 'intranet' ) ) {
-        output_and_exit( $input, $cookie, $template,  'wrong_csrf_token' )
-            unless Koha::Token->new->check_csrf( {
-                session_id => scalar $input->cookie('CGISESSID'),
-                token => scalar $input->param('csrf_token'),
-            });
-        # Note: If the logged in user is not allowed to see this patron an invoice can be forced
-        # Here we are trusting librarians not to hack the system
-        my $barcode=$input->param('barcode');
-        my $itemnum;
-        if ($barcode) {
-            my $item = Koha::Items->find({barcode => $barcode});
-            $itemnum = $item->itemnumber if $item;
-        }
-        my $desc=$input->param('desc');
-        my $amount=$input->param('amount');
-        my $type=$input->param('type');
-        my $note    = $input->param('note');
-        my $error   = C4::Accounts::manualinvoice( $borrowernumber, $itemnum, $desc, $type, $amount, $note );
-        if ($error) {
-            if ( $error =~ /FOREIGN KEY/ && $error =~ /itemnumber/ ) {
-                $template->param( 'ITEMNUMBER' => 1 );
-            }
-            $template->param( csrf_token => Koha::Token->new->generate_csrf({ session_id => scalar $input->cookie('CGISESSID') }) );
-            $template->param( 'ERROR' => $error );
-            output_html_with_http_headers $input, $cookie, $template->output;
-        } else {
+my $library_id = C4::Context->userenv->{'branch'};
 
-            if ( C4::Context->preference('AccountAutoReconcile') ) {
-                $patron->account->reconcile_balance;
-            }
-
-            print $input->redirect("/cgi-bin/koha/members/boraccount.pl?borrowernumber=$borrowernumber");
-            exit;
+my $add = $input->param('add');
+if ($add) {
+    output_and_exit( $input, $cookie, $template, 'wrong_csrf_token' )
+      unless Koha::Token->new->check_csrf(
+        {
+            session_id => scalar $input->cookie('CGISESSID'),
+            token      => scalar $input->param('csrf_token'),
         }
+      );
+
+# Note: If the logged in user is not allowed to see this patron an invoice can be forced
+# Here we are trusting librarians not to hack the system
+    my $barcode = $input->param('barcode');
+    my $itemnum;
+    if ($barcode) {
+        my $item = Koha::Items->find( { barcode => $barcode } );
+        $itemnum = $item->itemnumber if $item;
     }
-} else {
-
-    my ($template, $loggedinuser, $cookie) = get_template_and_user({
-        template_name   => "members/maninvoice.tt",
-        query           => $input,
-        type            => "intranet",
-        authnotrequired => 0,
-        flagsrequired   => { borrowers => 'edit_borrowers',
-                             updatecharges => 'remaining_permissions' },
-        debug           => 1,
-    });
+    my $desc   = $input->param('desc');
+    my $amount = $input->param('amount');
+    my $type   = $input->param('type');
+    my $note   = $input->param('note');
+    my $error =
+      C4::Accounts::manualinvoice( $borrowernumber, $itemnum, $desc, $type,
+        $amount, $note );
+    if ($error) {
+        if ( $error =~ /FOREIGN KEY/ && $error =~ /itemnumber/ ) {
+            $template->param( 'ITEMNUMBER' => 1 );
+        }
+        $template->param(
+            csrf_token => Koha::Token->new->generate_csrf(
+                { session_id => scalar $input->cookie('CGISESSID') }
+            )
+        );
+        $template->param( 'ERROR' => $error );
+        output_html_with_http_headers $input, $cookie, $template->output;
+    }
+    else {
 
-    my $logged_in_user = Koha::Patrons->find( $loggedinuser ) or die "Not logged in";
-    output_and_exit_if_error( $input, $cookie, $template, { module => 'members', logged_in_user => $logged_in_user, current_patron => $patron } );
+        if ( C4::Context->preference('AccountAutoReconcile') ) {
+            $patron->account->reconcile_balance;
+        }
 
-  # get authorised values with type of MANUAL_INV
-  my @invoice_types;
-  my $dbh = C4::Context->dbh;
-  my $sth = $dbh->prepare('SELECT * FROM authorised_values WHERE category = "MANUAL_INV"');
-  $sth->execute();
-  while ( my $row = $sth->fetchrow_hashref() ) {
-    push @invoice_types, $row;
-  }
-  $template->param( invoice_types_loop => \@invoice_types );
+        print $input->redirect(
+            "/cgi-bin/koha/members/boraccount.pl?borrowernumber=$borrowernumber"
+        );
+        exit;
+    }
+}
+else {
+
+    my $logged_in_user = Koha::Patrons->find($loggedinuser)
+      or die "Not logged in";
+    output_and_exit_if_error(
+        $input, $cookie,
+        $template,
+        {
+            module         => 'members',
+            logged_in_user => $logged_in_user,
+            current_patron => $patron
+        }
+    );
 
+    my @debit_types = Koha::Account::DebitTypes->search_with_library_limits(
+        { can_be_added_manually => 1 },
+        {}, $library_id );
+    $template->param( debit_types => \@debit_types );
     $template->param(
-        csrf_token => Koha::Token->new->generate_csrf({ session_id => scalar $input->cookie('CGISESSID') }),
-        patron         => $patron,
-        finesview      => 1,
+        csrf_token => Koha::Token->new->generate_csrf(
+            { session_id => scalar $input->cookie('CGISESSID') }
+        ),
+        patron    => $patron,
+        finesview => 1,
     );
     output_html_with_http_headers $input, $cookie, $template->output;
 }