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>
This commit is contained in:
parent
9641b3c8c7
commit
f48a467fbc
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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 -%]
|
||||
|
|
|
|||
|
|
@ -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> › <a href="/cgi-bin/koha/members/members-home.pl">Patrons</a> › Manual invoice</div>
|
||||
<div id="breadcrumbs">
|
||||
<a href="/cgi-bin/koha/mainpage.pl">Home</a> ›
|
||||
<a href="/cgi-bin/koha/members/members-home.pl">Patrons</a> ›
|
||||
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 %]
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
query => $input,
|
||||
type => "intranet",
|
||||
authnotrequired => 0,
|
||||
flagsrequired => $flagsrequired,
|
||||
debug => 1,
|
||||
}
|
||||
);
|
||||
|
||||
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 {
|
||||
|
||||
if ( C4::Context->preference('AccountAutoReconcile') ) {
|
||||
$patron->account->reconcile_balance;
|
||||
}
|
||||
|
||||
print $input->redirect("/cgi-bin/koha/members/boraccount.pl?borrowernumber=$borrowernumber");
|
||||
exit;
|
||||
}
|
||||
}
|
||||
} 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,
|
||||
});
|
||||
flagsrequired => {
|
||||
borrowers => 'edit_borrowers',
|
||||
updatecharges => 'remaining_permissions'
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
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 $borrowernumber = $input->param('borrowernumber');
|
||||
my $patron = Koha::Patrons->find($borrowernumber);
|
||||
unless ($patron) {
|
||||
print $input->redirect(
|
||||
"/cgi-bin/koha/circ/circulation.pl?borrowernumber=$borrowernumber");
|
||||
exit;
|
||||
}
|
||||
|
||||
# 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 );
|
||||
my $library_id = C4::Context->userenv->{'branch'};
|
||||
|
||||
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;
|
||||
}
|
||||
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 {
|
||||
|
||||
if ( C4::Context->preference('AccountAutoReconcile') ) {
|
||||
$patron->account->reconcile_balance;
|
||||
}
|
||||
|
||||
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…
Reference in New Issue