From cf550bf2e6f9d1504e645d68c719c4226e269063 Mon Sep 17 00:00:00 2001 From: Kevin Carnes Date: Fri, 17 Nov 2023 14:58:26 +0100 Subject: [PATCH] Bug 33847: Rewrite to use SQL Signed-off-by: Emily Lamancusa --- installer/data/mysql/db_revs/220600024.pl | 86 +++++++++++------------ 1 file changed, 41 insertions(+), 45 deletions(-) diff --git a/installer/data/mysql/db_revs/220600024.pl b/installer/data/mysql/db_revs/220600024.pl index f5f58018d7..c068737009 100755 --- a/installer/data/mysql/db_revs/220600024.pl +++ b/installer/data/mysql/db_revs/220600024.pl @@ -1,60 +1,56 @@ use Modern::Perl; -use Koha::CirculationRules; - return { - bug_number => "29012", + bug_number => "29012", description => "Some rules are not saved when left blank while editing a 'rule' line in smart-rules.pl", - up => sub { + up => sub { my ($args) = @_; - my ($dbh, $out) = @$args{qw(dbh out)}; + my ( $dbh, $out ) = @$args{qw(dbh out)}; my %default_rule_values = ( issuelength => 0, - hardduedate => '', - unseen_renewals_allowed => '', + hardduedate => q{}, + unseen_renewals_allowed => q{}, rentaldiscount => 0, - decreaseloanholds => '', + decreaseloanholds => q{}, ); - my $rules = Koha::CirculationRules->search( { rule_name => 'suspension_chargeperiod' } ); - while ( my $rule = $rules->next ) { - foreach my $key ( keys %default_rule_values ) { - next - if # If there is a rule matching these criteria with defined value, we can skip it. - Koha::CirculationRules->search( - { - branchcode => $rule->branchcode, - categorycode => $rule->categorycode, - itemtype => $rule->itemtype, - rule_name => $key, - } - )->count; - - my $derived_rule = Koha::CirculationRules->get_effective_rule( - { - branchcode => $rule->branchcode, - categorycode => $rule->categorycode, - itemtype => $rule->itemtype, - rule_name => $key, - } - ); - my $value = - $derived_rule - ? $derived_rule->rule_value // $default_rule_values{$key} - : $default_rule_values{$key}; - - Koha::CirculationRule->new( - { - branchcode => $rule->branchcode, - categorycode => $rule->categorycode, - itemtype => $rule->itemtype, - rule_name => $key, - rule_value => $value, - } - )->store(); + my $sth = $dbh->prepare( + q{ + SELECT codes.branchcode, codes.categorycode, codes.itemtype + FROM circulation_rules codes + WHERE codes.rule_name = 'fine' + AND NOT EXISTS + (SELECT NULL FROM circulation_rules cr + WHERE cr.rule_name = ? + AND cr.branchcode <=> codes.branchcode + AND cr.categorycode <=> codes.categorycode + AND cr.itemtype <=> codes.itemtype) + } + ); + my $insert_sth = $dbh->prepare( + q{ + INSERT IGNORE INTO circulation_rules (branchcode, categorycode, itemtype, rule_name, rule_value) + SELECT codes.branchcode, codes.categorycode, codes.itemtype, ?, IFNULL(effective.rule_value, ?) + FROM circulation_rules codes + LEFT JOIN circulation_rules effective + ON effective.rule_name = ? + AND (effective.branchcode <=> codes.branchcode OR effective.branchcode IS NULL) + AND (effective.categorycode <=> codes.categorycode OR effective.categorycode IS NULL) + AND (effective.itemtype <=> codes.itemtype OR effective.itemtype IS NULL) + WHERE codes.branchcode <=> ? AND codes.categorycode <=> ? AND codes.itemtype <=> ? AND codes.rule_name = 'fine' + ORDER BY effective.branchcode DESC, effective.categorycode DESC, effective.itemtype DESC + LIMIT 1 + } + ); + my ( $branchcode, $categorycode, $itemtype ); + while ( my ( $rule_name, $rule_value ) = each(%default_rule_values) ) { + $sth->execute($rule_name); + $sth->bind_columns( \( $branchcode, $categorycode, $itemtype ) ); + while ( $sth->fetch ) { + $insert_sth->execute( $rule_name, $rule_value, $rule_name, $branchcode, $categorycode, $itemtype ); } } say $out "Set derived values for blank circulation rules that weren't saved to the database"; }, -} +}; -- 2.34.1