Bug 15354: Fix translated itemtype descriptions in circ rules
[srvgit] / admin / smart-rules.pl
index 253b08a..8221a0d 100755 (executable)
@@ -28,6 +28,9 @@ use C4::Debug;
 use C4::Branch; # GetBranches
 use Koha::DateUtils;
 use Koha::Database;
+use Koha::IssuingRule;
+use Koha::IssuingRules;
+use Koha::Libraries;
 
 my $input = CGI->new;
 my $dbh = C4::Context->dbh;
@@ -44,7 +47,18 @@ my ($template, $loggedinuser, $cookie)
                             });
 
 my $type=$input->param('type');
-my $branch = $input->param('branch') || ( C4::Branch::onlymine() ? ( C4::Branch::mybranch() || '*' ) : '*' );
+
+my $branch = $input->param('branch');
+unless ( $branch ) {
+    if ( C4::Context->preference('DefaultToLoggedInLibraryCircRules') ) {
+        $branch = Koha::Libraries->search->count() == 1 ? undef : C4::Branch::mybranch();
+    }
+    else {
+        $branch = C4::Branch::onlymine() ? ( C4::Branch::mybranch() || '*' ) : '*';
+    }
+}
+$branch = '*' if $branch eq 'NO_LIBRARY_SET';
+
 my $op = $input->param('op') || q{};
 my $language = C4::Languages::getlanguage();
 
@@ -134,39 +148,43 @@ elsif ($op eq 'add') {
     my $rentaldiscount = $input->param('rentaldiscount');
     my $opacitemholds = $input->param('opacitemholds') || 0;
     my $overduefinescap = $input->param('overduefinescap') || undef;
-    $debug and warn "Adding $br, $bor, $itemtype, $fine, $maxissueqty, $maxonsiteissueqty";
-
-    my $schema = Koha::Database->new()->schema();
-    my $rs = $schema->resultset('Issuingrule');
+    my $cap_fine_to_replacement_price = $input->param('cap_fine_to_replacement_price') eq 'on';
+    $debug and warn "Adding $br, $bor, $itemtype, $fine, $maxissueqty, $maxonsiteissueqty, $cap_fine_to_replacement_price";
 
     my $params = {
-        branchcode             => $br,
-        categorycode           => $bor,
-        itemtype               => $itemtype,
-        fine                   => $fine,
-        finedays               => $finedays,
-        maxsuspensiondays      => $maxsuspensiondays,
-        firstremind            => $firstremind,
-        chargeperiod           => $chargeperiod,
-        chargeperiod_charge_at => $chargeperiod_charge_at,
-        maxissueqty            => $maxissueqty,
-        maxonsiteissueqty      => $maxonsiteissueqty,
-        renewalsallowed        => $renewalsallowed,
-        renewalperiod          => $renewalperiod,
-        norenewalbefore        => $norenewalbefore,
-        auto_renew             => $auto_renew,
-        reservesallowed        => $reservesallowed,
-        issuelength            => $issuelength,
-        lengthunit             => $lengthunit,
-        hardduedate            => $hardduedate,
-        hardduedatecompare     => $hardduedatecompare,
-        rentaldiscount         => $rentaldiscount,
-        onshelfholds           => $onshelfholds,
-        opacitemholds          => $opacitemholds,
-        overduefinescap        => $overduefinescap,
+        branchcode                    => $br,
+        categorycode                  => $bor,
+        itemtype                      => $itemtype,
+        fine                          => $fine,
+        finedays                      => $finedays,
+        maxsuspensiondays             => $maxsuspensiondays,
+        firstremind                   => $firstremind,
+        chargeperiod                  => $chargeperiod,
+        chargeperiod_charge_at        => $chargeperiod_charge_at,
+        maxissueqty                   => $maxissueqty,
+        maxonsiteissueqty             => $maxonsiteissueqty,
+        renewalsallowed               => $renewalsallowed,
+        renewalperiod                 => $renewalperiod,
+        norenewalbefore               => $norenewalbefore,
+        auto_renew                    => $auto_renew,
+        reservesallowed               => $reservesallowed,
+        issuelength                   => $issuelength,
+        lengthunit                    => $lengthunit,
+        hardduedate                   => $hardduedate,
+        hardduedatecompare            => $hardduedatecompare,
+        rentaldiscount                => $rentaldiscount,
+        onshelfholds                  => $onshelfholds,
+        opacitemholds                 => $opacitemholds,
+        overduefinescap               => $overduefinescap,
+        cap_fine_to_replacement_price => $cap_fine_to_replacement_price,
     };
 
-    $rs->update_or_create($params);
+    my $issuingrule = Koha::IssuingRules->find({categorycode => $bor, itemtype => $itemtype, branchcode => $br});
+    if ($issuingrule) {
+        $issuingrule->set($params)->store();
+    } else {
+        Koha::IssuingRule->new()->set($params)->store();
+    }
 
 }
 elsif ($op eq "set-branch-defaults") {
@@ -442,8 +460,8 @@ $sth2->execute($language, $branch);
 
 while (my $row = $sth2->fetchrow_hashref) {
     $row->{'current_branch'} ||= $row->{'branchcode'};
-    $row->{'humanitemtype'} ||= $row->{'itemtype'};
-    $row->{'default_humanitemtype'} = 1 if $row->{'humanitemtype'} eq '*';
+    $row->{translated_description} ||= $row->{translated_description};
+    $row->{default_translated_description} = 1 if $row->{humanitemtype} eq '*';
     $row->{'humancategorycode'} ||= $row->{'categorycode'};
     $row->{'default_humancategorycode'} = 1 if $row->{'humancategorycode'} eq '*';
     $row->{'fine'} = sprintf('%.2f', $row->{'fine'});
@@ -498,26 +516,34 @@ foreach my $entry (@sorted_branch_cat_rules, @sorted_row_loop) {
 my $sth_branch_item;
 if ($branch eq "*") {
     $sth_branch_item = $dbh->prepare("
-        SELECT default_branch_item_rules.*, itemtypes.description AS humanitemtype
+        SELECT default_branch_item_rules.*,
+            COALESCE( localization.translation, itemtypes.description ) AS translated_description
         FROM default_branch_item_rules
         JOIN itemtypes USING (itemtype)
+        LEFT JOIN localization ON itemtypes.itemtype = localization.code
+            AND localization.entity = 'itemtypes'
+            AND localization.lang = ?
     ");
-    $sth_branch_item->execute();
+    $sth_branch_item->execute($language);
 } else {
     $sth_branch_item = $dbh->prepare("
-        SELECT branch_item_rules.*, itemtypes.description AS humanitemtype
+        SELECT branch_item_rules.*,
+            COALESCE( localization.translation, itemtypes.description ) AS translated_description
         FROM branch_item_rules
         JOIN itemtypes USING (itemtype)
+        LEFT JOIN localization ON itemtypes.itemtype = localization.code
+            AND localization.entity = 'itemtypes'
+            AND localization.lang = ?
         WHERE branch_item_rules.branchcode = ?
     ");
-    $sth_branch_item->execute($branch);
+    $sth_branch_item->execute($language, $branch);
 }
 
 my @branch_item_rules = ();
 while (my $row = $sth_branch_item->fetchrow_hashref) {
     push @branch_item_rules, $row;
 }
-my @sorted_branch_item_rules = sort { $a->{'humanitemtype'} cmp $b->{'humanitemtype'} } @branch_item_rules;
+my @sorted_branch_item_rules = sort { $a->{translated_description} cmp $b->{translated_description} } @branch_item_rules;
 
 # note undef holdallowed so that template can deal with them
 foreach my $entry (@sorted_branch_item_rules) {
@@ -591,11 +617,11 @@ sub by_category {
 
 sub by_itemtype {
     my ($a, $b) = @_;
-    if ($a->{'default_humanitemtype'}) {
-        return ($b->{'default_humanitemtype'} ? 0 : 1);
-    } elsif ($b->{'default_humanitemtype'}) {
+    if ($a->{default_translated_description}) {
+        return ($b->{'default_translated_description'} ? 0 : 1);
+    } elsif ($b->{'default_translated_description'}) {
         return -1;
     } else {
-        return $a->{'humanitemtype'} cmp $b->{'humanitemtype'};
+        return $a->{'translated_description'} cmp $b->{'translated_description'};
     }
 }