Browse Source

Bug 23049: Update maninvoice to reference debit types

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>
remotes/origin/19.11.x
Martin Renvoize 3 years ago
parent
commit
f48a467fbc
Signed by: martin.renvoize GPG Key ID: 422B469130441A0F
  1. 14
      Koha/Account/Line.pm
  2. 5
      admin/debit_types.pl
  3. 54
      koha-tmpl/intranet-tmpl/prog/en/includes/accounts.inc
  4. 102
      koha-tmpl/intranet-tmpl/prog/en/modules/members/maninvoice.tt
  5. 153
      members/maninvoice.pl

14
Koha/Account/Line.pm

@ -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();

5
admin/debit_types.pl

@ -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(

54
koha-tmpl/intranet-tmpl/prog/en/includes/accounts.inc

@ -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 -%]

102
koha-tmpl/intranet-tmpl/prog/en/modules/members/maninvoice.tt

@ -1,6 +1,7 @@
[% USE raw %]
[% USE Asset %]
[% USE Koha %]
[% USE Price %]
[% USE Branches %]
[% SET footerjs = 1 %]
[% INCLUDE 'doc-head-open.inc' %]
@ -12,58 +13,61 @@
[% 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();
@ -90,6 +94,12 @@
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 %]

153
members/maninvoice.pl

@ -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;
}

Loading…
Cancel
Save