Bug 23805: Update mancredit to use the new credit types

Test plan
Ensure the manual credit page continues to work as it did before this
patchset.

Signed-off-by: Kyle Hall <kyle@bywatersolutions.com>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>
This commit is contained in:
Martin Renvoize 2019-10-15 09:45:33 +01:00
parent 66bdfbc0a3
commit 12568a20db
No known key found for this signature in database
GPG Key ID: 422B469130441A0F
5 changed files with 249 additions and 64 deletions

View File

@ -0,0 +1,74 @@
package Koha::Account::CreditType;
# Copyright PTFS Europe 2019
#
# This file is part of Koha.
#
# Koha is free software; you can redistribute it and/or modify it under the
# terms of the GNU General Public License as published by the Free Software
# Foundation; either version 3 of the License, or (at your option) any later
# version.
#
# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with Koha; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
use Modern::Perl;
use List::Util qw/any/;
use Koha::Database;
use Koha::Exceptions;
use base qw(Koha::Object Koha::Object::Limit::Library);
=head1 NAME
Koha::Account::CreditType - Koha Account credit type Object class
=head1 API
=head2 Class Methods
=cut
=head3 delete
Overridden delete method to prevent system default deletions
=cut
sub delete {
my ($self) = @_;
Koha::Exceptions::CannotDeleteDefault->throw if $self->is_system;
return $self->SUPER::delete;
}
=head3 _library_limits
Configurable library limits
=cut
sub _library_limits {
return {
class => "AccountCreditTypesBranch",
id => "credit_type_code",
library => "branchcode",
};
}
=head3 type
=cut
sub _type {
return 'AccountCreditType';
}
1;

View File

@ -0,0 +1,71 @@
package Koha::Account::CreditTypes;
# Copyright PTFS Europe 2019
#
# This file is part of Koha.
#
# Koha is free software; you can redistribute it and/or modify it under the
# terms of the GNU General Public License as published by the Free Software
# Foundation; either version 3 of the License, or (at your option) any later
# version.
#
# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with Koha; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
use Modern::Perl;
use List::Util qw/any/;
use Koha::Database;
use Koha::Account::CreditType;
use base qw(Koha::Objects Koha::Objects::Limit::Library);
=head1 NAME
Koha::Account::CreditTypes - Koha Account credit types Object set class
=head1 API
=head2 Class Methods
=head3 delete
Overridden delete method to prevent system default deletions
=cut
sub delete {
my ($self) = @_;
my @set = $self->as_list;
for my $type (@set) {
if ( $type->is_system ) {
Koha::Exceptions::CannotDeleteDefault->throw;
}
}
return $self->SUPER::delete;
}
=head3 type
=cut
sub _type {
return 'AccountCreditType';
}
=head3 object_class
=cut
sub object_class {
return 'Koha::Account::CreditType';
}
1;

View File

@ -108,6 +108,15 @@ __PACKAGE__->has_many(
# Created by DBIx::Class::Schema::Loader v0.07046 @ 2019-10-14 09:59:52
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:Uycu/23b681kWHNX+/gNiw
__PACKAGE__->add_columns(
'+is_system' => { is_boolean => 1 }
);
sub koha_objects_class {
'Koha::Account::CreditTypes';
}
sub koha_object_class {
'Koha::Account::CreditType';
}
# You can replace this text with custom code or comments, and it will be preserved on regeneration
1;

View File

@ -12,45 +12,56 @@
[% 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 credit</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 credit
</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><a href="/cgi-bin/koha/members/maninvoice.pl?borrowernumber=[% patron.borrowernumber | uri %]" >Create manual invoice</a></li>
<li class="active"><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><a href="/cgi-bin/koha/members/maninvoice.pl?borrowernumber=[% patron.borrowernumber | uri %]" >Create manual invoice</a></li>
<li class="active"><a href="/cgi-bin/koha/members/mancredit.pl?borrowernumber=[% patron.borrowernumber | uri %]" >Create manual credit</a></li>
</ul>
<div class="tabs-container">
<form action="/cgi-bin/koha/members/mancredit.pl" method="post" id="mancredit">
<input type="hidden" name="borrowernumber" id="borrowernumber" value="[% patron.borrowernumber | html %]" />
<input type="hidden" name="csrf_token" value="[% csrf_token | html %]" />
<form action="/cgi-bin/koha/members/mancredit.pl" method="post" id="mancredit">
<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 credit</legend><ol>
<li><label for="type">Credit type: </label><select name="type" id="type">
<option value="credit">Credit</option>
<option value="forgiven">Forgiven</option>
</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" size="50" id="desc" /></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="rows">
<legend>Manual credit</legend>
<ol>
<li>
<label for="type">Credit type: </label>
<select name="type" id="type">
[% FOREACH credit_type IN credit_types %]
<option value="[% credit_type.code | html %]">[% credit_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" size="50" id="desc" /></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="Add credit" /> <a class="cancel" href="/cgi-bin/koha/members/boraccount.pl?borrowernumber=[% patron.borrowernumber | html %]">Cancel</a></fieldset>
</form>
<fieldset class="action"><input type="submit" name="add" value="Add credit" /> <a class="cancel" href="/cgi-bin/koha/members/boraccount.pl?borrowernumber=[% patron.borrowernumber | html %]">Cancel</a></fieldset>
</form>
</div></div>
</div>
</div>
</main>
</div> <!-- /.col-sm-10.col-sm-push-2 -->
@ -60,7 +71,7 @@
[% INCLUDE 'circ-menu.inc' %]
</aside>
</div> <!-- /.col-sm-2.col-sm-pull-10 -->
</div> <!-- /.row -->
</div> <!-- /.row -->
[% MACRO jsinclude BLOCK %]
[% INCLUDE 'str/members-menu.inc' %]

View File

@ -3,7 +3,6 @@
#written 11/1/2000 by chris@katipo.oc.nz
#script to display borrowers account details
# Copyright 2000-2002 Katipo Communications
# Copyright 2010 BibLibre
#
@ -35,18 +34,21 @@ use C4::Items;
use Koha::Items;
use Koha::Patrons;
use Koha::Patron::Categories;
use Koha::Account::CreditTypes;
use Koha::Token;
my $input=new CGI;
my ($template, $loggedinuser, $cookie) = get_template_and_user(
my $input = new CGI;
my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
{
template_name => "members/mancredit.tt",
query => $input,
type => "intranet",
authnotrequired => 0,
flagsrequired => { borrowers => 'edit_borrowers',
updatecharges => 'remaining_permissions' }
flagsrequired => {
borrowers => 'edit_borrowers',
updatecharges => 'remaining_permissions'
}
}
);
@ -54,25 +56,35 @@ my $logged_in_user = Koha::Patrons->find($loggedinuser) or die "Not logged in";
my $borrowernumber = $input->param('borrowernumber');
my $patron = Koha::Patrons->find($borrowernumber);
output_and_exit_if_error( $input, $cookie, $template,
{ module => 'members', logged_in_user => $logged_in_user, current_patron => $patron } );
output_and_exit_if_error(
$input, $cookie,
$template,
{
module => 'members',
logged_in_user => $logged_in_user,
current_patron => $patron
}
);
my $library_id =
C4::Context->userenv ? C4::Context->userenv->{'branch'} : undef;
my $add = $input->param('add');
if ($add){
if ($add) {
output_and_exit( $input, $cookie, $template, 'wrong_csrf_token' )
unless Koha::Token->new->check_csrf( {
unless Koha::Token->new->check_csrf(
{
session_id => scalar $input->cookie('CGISESSID'),
token => scalar $input->param('csrf_token'),
});
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
# 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 $item_id;
if ($barcode) {
my $item = Koha::Items->find({barcode => $barcode});
my $item = Koha::Items->find( { barcode => $barcode } );
$item_id = $item->itemnumber if $item;
}
my $description = $input->param('desc');
@ -80,30 +92,38 @@ if ($add){
my $amount = $input->param('amount') || 0;
my $type = $input->param('type');
my $library_id = C4::Context->userenv ? C4::Context->userenv->{'branch'} : undef;
$patron->account->add_credit({
amount => $amount,
description => $description,
item_id => $item_id,
library_id => $library_id,
note => $note,
type => $type,
user_id => $logged_in_user->id,
interface => C4::Context->interface
});
$patron->account->add_credit(
{
amount => $amount,
description => $description,
item_id => $item_id,
library_id => $library_id,
note => $note,
type => $type,
user_id => $logged_in_user->id,
interface => C4::Context->interface
}
);
if ( C4::Context->preference('AccountAutoReconcile') ) {
$patron->account->reconcile_balance;
}
print $input->redirect("/cgi-bin/koha/members/boraccount.pl?borrowernumber=$borrowernumber");
print $input->redirect(
"/cgi-bin/koha/members/boraccount.pl?borrowernumber=$borrowernumber");
exit;
}
else {
my @credit_types = Koha::Account::CreditTypes->search_with_library_limits(
{ can_be_added_manually => 1 },
{}, $library_id );
} else {
$template->param(
patron => $patron,
finesview => 1,
csrf_token => Koha::Token->new->generate_csrf(
patron => $patron,
credit_types => \@credit_types,
finesview => 1,
csrf_token => Koha::Token->new->generate_csrf(
{ session_id => scalar $input->cookie('CGISESSID') }
),
);