From abdd2f03d7bc8c90f6d2d9b34a16dfafef5e08c5 Mon Sep 17 00:00:00 2001 From: Julian Maurice Date: Fri, 7 Feb 2020 13:17:54 +0100 Subject: [PATCH] Bug 17702: Add UI to manage account credit types MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It is the same as for debit types. It adds a new column `archived` in table `account_credit_types` that has the same purpose than `account_debit_types.archived` Test plan: 0. Apply patch && run updatedatabase && update_dbix_class_files 1. Go to Admin » Credit types 2. Add a new credit type, give it a code and a description and check 'Can be manually added' 3. Go to a patron's accounting section, 'Create manual credit' tab 4. Verify that the new credit type appears 5. Return to Admin » Credit types and archive the credit type 6. Verify that the new credit type is not available anymore in 'Create manual credit' 7. Restore the credit type and verify that it is available again 8. Create a manual credit with the new credit type 9. Go to Reports » Cash register and make sure you can find the transaction by filtering on transaction type 10. Edit the new credit type and set some library limitations, make sure that the credit type doesn't appear if you're connected to a library you didn't selected, and that it appears if you're connected to a library you selected. Note to QA team: The change in Koha/Account.pm, I added it because otherwise Koha died when adding a manual credit with a custom type. In that case, offset type will default to 'Manual Credit'. I'm not sure if that is the best thing to do. I'm open to suggestions :) Signed-off-by: Martin Renvoize Signed-off-by: Kyle M Hall --- Koha/Account.pm | 2 +- admin/credit_types.pl | 131 +++++++++++ .../data/mysql/atomicupdate/bug-17702.perl | 9 + .../prog/en/includes/admin-menu.inc | 1 + .../prog/en/modules/admin/admin-home.tt | 2 + .../prog/en/modules/admin/credit_types.tt | 222 ++++++++++++++++++ members/mancredit.pl | 2 +- 7 files changed, 367 insertions(+), 2 deletions(-) create mode 100755 admin/credit_types.pl create mode 100644 installer/data/mysql/atomicupdate/bug-17702.perl create mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/admin/credit_types.tt diff --git a/Koha/Account.pm b/Koha/Account.pm index 6fc464178f..f1bab9ff59 100644 --- a/Koha/Account.pm +++ b/Koha/Account.pm @@ -396,7 +396,7 @@ sub add_credit { my $account_offset = Koha::Account::Offset->new( { credit_id => $line->id, - type => $Koha::Account::offset_type->{$credit_type}, + type => $Koha::Account::offset_type->{$credit_type} // $Koha::Account::offset_type->{CREDIT}, amount => $amount } )->store(); diff --git a/admin/credit_types.pl b/admin/credit_types.pl new file mode 100755 index 0000000000..75baff90bb --- /dev/null +++ b/admin/credit_types.pl @@ -0,0 +1,131 @@ +#! /usr/bin/perl + +# Copyright 2020 Koha Development Team +# +# 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, see . + +use Modern::Perl; +use CGI qw ( -utf8 ); +use Try::Tiny; + +use C4::Context; +use C4::Auth; +use C4::Output; + +use Koha::Account::CreditType; +use Koha::Account::CreditTypes; + +my $input = new CGI; +my $code = $input->param('code'); +my $op = $input->param('op') || 'list'; +my @messages; + +my ( $template, $loggedinuser, $cookie ) = get_template_and_user( + { + template_name => "admin/credit_types.tt", + query => $input, + type => "intranet", + authnotrequired => 0, + flagsrequired => { parameters => 'parameters_remaining_permissions' }, + debug => 1, + } +); + +my $credit_type; +if ($code) { + $credit_type = Koha::Account::CreditTypes->find($code); +} + +if ( $op eq 'add_form' ) { + + my $selected_branches = + $credit_type ? $credit_type->get_library_limits : undef; + my $branches = + Koha::Libraries->search( {}, { order_by => ['branchname'] } )->unblessed; + my @branches_loop; + foreach my $branch (@$branches) { + my $selected = + ( $selected_branches + && grep { $_->branchcode eq $branch->{branchcode} } + @{ $selected_branches->as_list } ) ? 1 : 0; + push @branches_loop, + { + branchcode => $branch->{branchcode}, + branchname => $branch->{branchname}, + selected => $selected, + }; + } + + $template->param( + credit_type => $credit_type, + branches_loop => \@branches_loop + ); +} +elsif ( $op eq 'add_validate' ) { + my $description = $input->param('description'); + my $can_be_added_manually = $input->param('can_be_added_manually') || 0; + my @branches = grep { $_ ne q{} } $input->multi_param('branches'); + + if ( not defined $credit_type ) { + $credit_type = Koha::Account::CreditType->new( { code => $code } ); + } + $credit_type->description($description); + $credit_type->can_be_added_manually($can_be_added_manually); + + try { + $credit_type->store; + $credit_type->replace_library_limits( \@branches ); + push @messages, { type => 'message', code => 'success_on_saving' }; + } + catch { + push @messages, { type => 'error', code => 'error_on_saving' }; + }; + $op = 'list'; +} +elsif ( $op eq 'archive' ) { + try { + $credit_type->archived(1)->store(); + push @messages, { code => 'success_on_archive', type => 'message' }; + } + catch { + push @messages, { code => 'error_on_archive', type => 'alert' }; + + }; + $op = 'list'; +} +elsif ( $op eq 'unarchive' ) { + try { + $credit_type->archived(0)->store(); + push @messages, { code => 'success_on_restore', type => 'message' }; + } + catch { + push @messages, { code => 'error_on_restore', type => 'alert' }; + }; + $op = 'list'; +} + +if ( $op eq 'list' ) { + my $credit_types = Koha::Account::CreditTypes->search(); + $template->param( credit_types => $credit_types, ); +} + +$template->param( + code => $code, + messages => \@messages, + op => $op, +); + +output_html_with_http_headers $input, $cookie, $template->output; diff --git a/installer/data/mysql/atomicupdate/bug-17702.perl b/installer/data/mysql/atomicupdate/bug-17702.perl new file mode 100644 index 0000000000..ab51cf08ec --- /dev/null +++ b/installer/data/mysql/atomicupdate/bug-17702.perl @@ -0,0 +1,9 @@ +$DBversion = 'XXX'; +if( CheckVersion( $DBversion ) ) { + if (!column_exists('account_credit_types', 'archived')) { + $dbh->do('ALTER TABLE account_credit_types ADD COLUMN archived tinyint(1) NOT NULL DEFAULT 0 AFTER is_system'); + } + + SetVersion( $DBversion ); + print "Upgrade to $DBversion done (Bug 17702 - Add column account_credit_types.archived)\n"; +} diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/admin-menu.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/admin-menu.inc index dedf3b55bc..35207f4fd5 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/includes/admin-menu.inc +++ b/koha-tmpl/intranet-tmpl/prog/en/includes/admin-menu.inc @@ -56,6 +56,7 @@
    [% IF ( CAN_user_parameters_manage_accounts ) %]
  • Debit types
  • +
  • Credit types
  • [% END %] [% IF ( Koha.Preference('UseCashRegisters') && CAN_user_parameters_manage_cash_registers ) %]
  • Cash registers
  • diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/admin-home.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/admin-home.tt index 4e7675de3e..860d08fd2c 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/admin-home.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/admin-home.tt @@ -113,6 +113,8 @@ [% IF ( CAN_user_parameters_manage_accounts ) %]
    Debit types
    Define debit types.
    +
    Credit types
    +
    Define credit types.
    [% END %] [% IF ( Koha.Preference('UseCashRegisters') && CAN_user_parameters_manage_cash_registers ) %]
    Cash registers
    diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/credit_types.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/credit_types.tt new file mode 100644 index 0000000000..e8d11a9a13 --- /dev/null +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/credit_types.tt @@ -0,0 +1,222 @@ +[% USE raw %] +[% USE Asset %] +[% USE Branches %] +[% PROCESS i18n.inc %] +[% SET footerjs = 1 %] +[% INCLUDE 'doc-head-open.inc' %] +Koha › Administration › + [% IF op =='add_form' %] + [% t('Credit types') %] › + [% IF credit_type.code %] + [% t('Modify credit type') %] + [% ELSE %] + [% t('New credit type') %] + [% END %] + [% ELSE %] + [% t('Credit types') %] + [% END %] + +[% INCLUDE 'doc-head-close.inc' %] + + + +[% INCLUDE 'header.inc' %] +[% INCLUDE 'prefs-admin-search.inc' %] + + + +
    +
    +
    +
    + + [% FOREACH m IN messages %] +
    + [% SWITCH m.code %] + [% CASE 'success_on_saving' %] + [% t('Credit type saved successfully.') %] + [% CASE 'error_on_saving' %] + [% t('An error occurred when saving this credit type.') %] + [% CASE 'success_on_archive' %] + [% t('Credit type archived successfully.') %] + [% CASE 'success_on_restore' %] + [% t('Credit type restored successfully.') %] + [% CASE %] + [% m.code | html %] + [% END %] +
    + [% END %] + + [% IF op == 'add_form' %] + [% IF credit_type %] +

    [% t('Modify a credit type') %]

    + [% ELSE %] +

    [% t('New credit type') %]

    + [% END %] + +
    + +
    +
      +
    1. + + [% IF credit_type %] + [% credit_type.code | html %] + + [% ELSE %] + [% t('Required. Maximum length is 64 letters') %] + [% END %] +
    2. +
    3. + + [% t('Required') %] +
    4. +
    5. + + [% IF credit_type.can_be_added_manually %] + + [% ELSE %] + + [% END %] +
    6. +
    7. + + + [% t("Select 'All libraries' if this credit type should be available at all libraries. Otherwise select libraries you want to associate credit type with.") %] +
    8. +
    +
    + +
    + + [% t('Cancel') %] +
    +
    + [% END %] + + [% IF op == 'list' %] + + +

    [% t('Account credit types') %]

    + [% IF credit_types.count %] + + + + + + + + + + + + [% FOREACH credit_type IN credit_types %] + + + + + + + + + + [% END %] + +
    [% t('Archived') %][% t('System') %][% t('Code') %][% t('Description') %][% t('Available for') %][% t('Library limitations') %][% t('Actions') %]
    [% credit_type.archived | html %][% credit_type.is_system | html %][% credit_type.code | html %][% credit_type.description | html %][% IF credit_type.can_be_added_manually %][% t('Manual credit') %][% END %] + [% IF credit_type.library_limits.count > 0 %] + [% library_limits_str = "" %] + [% FOREACH library IN credit_type.library_limits %] + [%- IF loop.first -%] + [% library_limits_str = library.branchname _ " (" _ library.branchcode _ ")" %] + [% ELSE %] + [% library_limits_str = library_limits_str _ "\n" _ library.branchname _ " (" _ library.branchcode _ ")" %] + [% END %] + [% END %] + + [% limits_count = credit_type.library_limits.count %] + [% tnx('{count} library limitation', '{count} library limitations', limits_count, { count => limits_count }) %] + [% ELSE %] + [% t('No limitation') %] + [% END %] + + [% IF !credit_type.is_system && !credit_type.archived %] + [% t('Edit') %] + [% t('Archive') %] + [% ELSIF credit_type.archived %] + [% t('Restore') %] + [% END %] +
    + [% ELSE %] +
    + [% t('There are no account credit types defined.') %] + [% t('Create new credit type') %] +
    + [% END %] + [% END %] +
    +
    + +
    + +
    +
    + +[% MACRO jsinclude BLOCK %] + [% Asset.js("js/admin-menu.js") | $raw %] + [% INCLUDE 'datatables.inc' %] + + +[% END %] + +[% INCLUDE 'intranet-bottom.inc' %] diff --git a/members/mancredit.pl b/members/mancredit.pl index 670882b0de..8ed7ffd72c 100755 --- a/members/mancredit.pl +++ b/members/mancredit.pl @@ -116,7 +116,7 @@ if ($add) { else { my @credit_types = Koha::Account::CreditTypes->search_with_library_limits( - { can_be_added_manually => 1 }, + { can_be_added_manually => 1, archived => 0 }, {}, $library_id ); $template->param( -- 2.21.1 (Apple Git-122.3)