Bug 23805: Update mancredit to use the new credit types
authorMartin Renvoize <martin.renvoize@ptfs-europe.com>
Tue, 15 Oct 2019 08:45:33 +0000 (09:45 +0100)
committerMartin Renvoize <martin.renvoize@ptfs-europe.com>
Thu, 24 Oct 2019 16:35:21 +0000 (17:35 +0100)
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>

Koha/Account/CreditType.pm [new file with mode: 0644]
Koha/Account/CreditTypes.pm [new file with mode: 0644]
Koha/Schema/Result/AccountCreditType.pm
koha-tmpl/intranet-tmpl/prog/en/modules/members/mancredit.tt
members/mancredit.pl

diff --git a/Koha/Account/CreditType.pm b/Koha/Account/CreditType.pm
new file mode 100644 (file)
index 0000000..075f39f
--- /dev/null
@@ -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;
diff --git a/Koha/Account/CreditTypes.pm b/Koha/Account/CreditTypes.pm
new file mode 100644 (file)
index 0000000..a63eda7
--- /dev/null
@@ -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;
index 015fd3c..c81d27f 100644 (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;
index 5a74f11..997ff49 100644 (file)
 [% 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' %]
index c37e39e..b3c560d 100755 (executable)
@@ -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::Token;
+use Koha::Account::CreditTypes;
 
-my $input=new CGI;
+use Koha::Token;
 
-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 } );
-
-my $add = $input->param('add');
+output_and_exit_if_error(
+    $input, $cookie,
+    $template,
+    {
+        module         => 'members',
+        logged_in_user => $logged_in_user,
+        current_patron => $patron
+    }
+);
 
-if ($add){
+my $library_id =
+  C4::Context->userenv ? C4::Context->userenv->{'branch'} : undef;
 
+my $add = $input->param('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') }
         ),
     );