@@ -, +, @@ credit types column credit_number in table account-fines. It will be easier for testing that this credit has no number generated a. edit the FORGIVEN type and enable credit number generation b. create a new type A, check "can be manually added" and "enable credit number" c. create a new type B, check "can be manually added". Do NOT enable credit number the numbers are not generated the numbers generated are 1, 2, 3, ... the numbers are not generated the numbers generated are '2020-0001', '2020-0002', ... the numbers are not generated that the numbers generated are 'BRANCHA2020020001', 'BRANCHA2020020002', ... (assuming you are connected to library BRANCHA, and it's February 2020) that the numbers generated are 'BRANCHB2020020001', 'BRANCHB2020020002', ... somewhere. Go back to Transactions tab and click on 'Print' for one line that has a credit number. Make sure the number is there. --- Koha/Account/Line.pm | 8 ++- admin/credit_types.pl | 12 +++-- installer/data/mysql/atomicupdate/bug-19036.perl | 11 +++- installer/data/mysql/kohastructure.sql | 1 + .../prog/en/modules/admin/credit_types.tt | 59 +++++++++++++++------- .../en/modules/admin/preferences/accounting.pref | 1 + t/db_dependent/Koha/Account.t | 16 +++++- 7 files changed, 85 insertions(+), 23 deletions(-) --- a/Koha/Account/Line.pm +++ a/Koha/Account/Line.pm @@ -886,7 +886,13 @@ sub store { my ($self) = @_; my $AutoCreditNumber = C4::Context->preference('AutoCreditNumber'); - if ($AutoCreditNumber && !$self->in_storage && $self->is_credit && !$self->credit_number) { + my $credit_number_enabled = $self->is_credit && $self->credit_type->credit_number_enabled; + + if ($AutoCreditNumber && $credit_number_enabled && !$self->in_storage) { + if (defined $self->credit_number) { + Koha::Exceptions::Account->throw('AutoCreditNumber is enabled but credit_number is already defined'); + } + my $rs = Koha::Database->new->schema->resultset($self->_type); if ($AutoCreditNumber eq 'incremental') { --- a/admin/credit_types.pl +++ a/admin/credit_types.pl @@ -77,17 +77,23 @@ if ( $op eq 'add_form' ) { elsif ( $op eq 'add_validate' ) { my $description = $input->param('description'); my $can_be_added_manually = $input->param('can_be_added_manually') || 0; + my $credit_number_enabled = $input->param('credit_number_enabled') || 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); + unless ($credit_type->is_system) { + $credit_type->description($description); + $credit_type->can_be_added_manually($can_be_added_manually); + } + $credit_type->credit_number_enabled($credit_number_enabled); try { $credit_type->store; - $credit_type->replace_library_limits( \@branches ); + unless ($credit_type->is_system) { + $credit_type->replace_library_limits( \@branches ); + } push @messages, { type => 'message', code => 'success_on_saving' }; } catch { --- a/installer/data/mysql/atomicupdate/bug-19036.perl +++ a/installer/data/mysql/atomicupdate/bug-19036.perl @@ -4,8 +4,17 @@ if (CheckVersion($DBversion)) { $dbh->do('ALTER TABLE accountlines ADD COLUMN credit_number VARCHAR(20) NULL DEFAULT NULL COMMENT "autogenerated number for credits" AFTER debit_type_code'); } + unless (column_exists('account_credit_types', 'credit_number_enabled')) { + $dbh->do(q{ + ALTER TABLE account_credit_types + ADD COLUMN credit_number_enabled TINYINT(1) NOT NULL DEFAULT 0 + COMMENT "Is autogeneration of credit number enabled for this credit type" + AFTER can_be_added_manually + }); + } + $dbh->do('INSERT IGNORE INTO systempreferences (variable, value, options, explanation, type) VALUES(?, ?, ?, ?, ?)', undef, 'AutoCreditNumber', '', '', 'Automatically generate a number for account credits', 'Choice'); SetVersion($DBversion); - print "Upgrade to $DBversion done (Bug 19036 - Add column accountlines.credit_number)\n"; + print "Upgrade to $DBversion done (Bug 19036 - Add accountlines.credit_number, account_credit_types.credit_number_enabled and syspref AutoCreditNumber)\n"; } --- a/installer/data/mysql/kohastructure.sql +++ a/installer/data/mysql/kohastructure.sql @@ -2663,6 +2663,7 @@ CREATE TABLE `account_credit_types` ( `code` varchar(80) NOT NULL, `description` varchar(200) DEFAULT NULL, `can_be_added_manually` tinyint(4) NOT NULL DEFAULT 1, + `credit_number_enabled` TINYINT(1) NOT NULL DEFAULT 0 COMMENT "Is autogeneration of credit number enabled for this credit type", `is_system` tinyint(1) NOT NULL DEFAULT 0, `archived` tinyint(1) NOT NULL DEFAULT 0, -- boolean flag to denote if this till is archived or not PRIMARY KEY (`code`) --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/credit_types.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/credit_types.tt @@ -75,29 +75,48 @@
  • - Required + [% IF credit_type && credit_type.is_system %] + [% credit_type.description | html %] + [% ELSE %] + Required + [% END %]
  • - [% IF credit_type.can_be_added_manually %] + [% IF credit_type && credit_type.is_system %] + [% IF credit_type.can_be_added_manually %]Yes[% ELSE %]No[% END %] + [% ELSIF credit_type.can_be_added_manually %] [% ELSE %] [% END %]
  • + + [% IF credit_type.credit_number_enabled %] + + [% ELSE %] + + [% END %] + Enable automatic generation of credit number (see AutoCreditNumber) +
  • +
  • - - Select 'All libraries' if this credit type should be available at all libraries. Otherwise select libraries you want to associate credit type with. + [% IF credit_type && credit_type.is_system %] + No library limitation + [% ELSE %] + + Select 'All libraries' if this credit type should be available at all libraries. Otherwise select libraries you want to associate credit type with. + [% END %]
  • @@ -123,6 +142,7 @@ Code Description Available for + Credit number enabled Library limitations Actions @@ -134,6 +154,7 @@ [% credit_type.code | html %] [% credit_type.description | html %] [% IF credit_type.can_be_added_manually %]Manual credit[% END %] + [% IF credit_type.credit_number_enabled %]Yes[% ELSE %]No[% END %] [% IF credit_type.library_limits.count > 0 %] [% library_limits_str = "" %] @@ -152,11 +173,15 @@ [% END %] + [% IF !credit_type.archived %] + Edit + [% END %] [% IF !credit_type.is_system && !credit_type.archived %] - Edit - Archive - [% ELSIF credit_type.archived %] - Restore + Archive + [% END %] + + [% IF !credit_type.is_system && credit_type.archived %] + Restore [% END %] --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/accounting.pref +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/accounting.pref @@ -40,3 +40,4 @@ Accounting: annual: 'Automatically generate credit numbers in the form -0001' branchyyyymmincr: 'Automatically generate credit numbers in the form yyyymm0001' incremental: 'Automatically generate credit numbers in the form 1, 2, 3' + - Automatic generation also has to be enabled for each credit type (Configure credit types) --- a/t/db_dependent/Koha/Account.t +++ a/t/db_dependent/Koha/Account.t @@ -26,6 +26,7 @@ use Test::Exception; use DateTime; use Koha::Account; +use Koha::Account::CreditTypes; use Koha::Account::Lines; use Koha::Account::Offsets; use Koha::DateUtils qw( dt_from_string ); @@ -1051,7 +1052,7 @@ subtest 'Koha::Account::Line::apply() handles lost items' => sub { }; subtest 'Koha::Account::pay() generates credit number' => sub { - plan tests => 34; + plan tests => 37; $schema->storage->txn_begin; @@ -1069,6 +1070,10 @@ subtest 'Koha::Account::pay() generates credit number' => sub { my $month = $now->month; my ($accountlines_id, $accountline); + my $credit_type = Koha::Account::CreditTypes->find('PAYMENT'); + $credit_type->credit_number_enabled(1); + $credit_type->store(); + t::lib::Mocks::mock_preference('AutoCreditNumber', ''); $accountlines_id = $account->pay({ amount => '1.00', library_id => $library->id })->{payment_id}; $accountline = Koha::Account::Lines->find($accountlines_id); @@ -1080,6 +1085,9 @@ subtest 'Koha::Account::pay() generates credit number' => sub { $accountline = Koha::Account::Lines->find($accountlines_id); is($accountline->credit_number, $i); } + $accountlines_id = $account->pay({ type => 'WRITEOFF', amount => '1.00', library_id => $library->id })->{payment_id}; + $accountline = Koha::Account::Lines->find($accountlines_id); + is($accountline->credit_number, undef); t::lib::Mocks::mock_preference('AutoCreditNumber', 'annual'); for my $i (1..11) { @@ -1087,6 +1095,9 @@ subtest 'Koha::Account::pay() generates credit number' => sub { $accountline = Koha::Account::Lines->find($accountlines_id); is($accountline->credit_number, sprintf('%s-%04d', $year, $i)); } + $accountlines_id = $account->pay({ type => 'WRITEOFF', amount => '1.00', library_id => $library->id })->{payment_id}; + $accountline = Koha::Account::Lines->find($accountlines_id); + is($accountline->credit_number, undef); t::lib::Mocks::mock_preference('AutoCreditNumber', 'branchyyyymmincr'); for my $i (1..11) { @@ -1094,6 +1105,9 @@ subtest 'Koha::Account::pay() generates credit number' => sub { $accountline = Koha::Account::Lines->find($accountlines_id); is($accountline->credit_number, sprintf('%s%d%02d%04d', $library->id, $year, $month, $i)); } + $accountlines_id = $account->pay({ type => 'WRITEOFF', amount => '1.00', library_id => $library->id })->{payment_id}; + $accountline = Koha::Account::Lines->find($accountlines_id); + is($accountline->credit_number, undef); $schema->storage->txn_rollback; }; --