Bug 15354: Fix translated itemtype descriptions in circ rules
[srvgit] / admin / smart-rules.pl
index 05c81d5..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,8 +47,20 @@ 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();
 
 if ($op eq 'delete') {
     my $itemtype     = $input->param('itemtype');
@@ -116,7 +131,7 @@ elsif ($op eq 'add') {
     my $renewalsallowed  = $input->param('renewalsallowed');
     my $renewalperiod    = $input->param('renewalperiod');
     my $norenewalbefore  = $input->param('norenewalbefore');
-    $norenewalbefore = undef if $norenewalbefore eq '0' or $norenewalbefore =~ /^\s*$/;
+    $norenewalbefore = undef if $norenewalbefore =~ /^\s*$/;
     my $auto_renew = $input->param('auto_renew') eq 'yes' ? 1 : 0;
     my $reservesallowed  = $input->param('reservesallowed');
     my $onshelfholds     = $input->param('onshelfholds') || 0;
@@ -126,45 +141,50 @@ elsif ($op eq 'add') {
     $maxonsiteissueqty = undef if $maxonsiteissueqty !~ /^\d+/;
     my $issuelength  = $input->param('issuelength');
     my $lengthunit  = $input->param('lengthunit');
-    my $hardduedate = eval { dt_from_string( $input->param('hardduedate') ) };
+    my $hardduedate = $input->param('hardduedate') || undef;
+    $hardduedate = eval { dt_from_string( $input->param('hardduedate') ) } if ( $hardduedate );
     $hardduedate = output_pref( { dt => $hardduedate, dateonly => 1, dateformat => 'iso' } ) if ( $hardduedate );
     my $hardduedatecompare = $input->param('hardduedatecompare');
     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") {
@@ -418,30 +438,30 @@ while (my $data=$sth->fetchrow_hashref){
 }
 
 $sth->finish;
-$sth=$dbh->prepare("SELECT description,itemtype FROM itemtypes ORDER BY description");
-$sth->execute;
-# $i=0;
 my @row_loop;
-my @itemtypes;
-while (my $row=$sth->fetchrow_hashref){
-    push @itemtypes,$row;
-}
+my @itemtypes = @{ GetItemTypes( style => 'array' ) };
 
 my $sth2 = $dbh->prepare("
-    SELECT issuingrules.*, itemtypes.description AS humanitemtype, categories.description AS humancategorycode
+    SELECT  issuingrules.*,
+            itemtypes.description AS humanitemtype,
+            categories.description AS humancategorycode,
+            COALESCE( localization.translation, itemtypes.description ) AS translated_description
     FROM issuingrules
     LEFT JOIN itemtypes
         ON (itemtypes.itemtype = issuingrules.itemtype)
     LEFT JOIN categories
         ON (categories.categorycode = issuingrules.categorycode)
+    LEFT JOIN localization ON issuingrules.itemtype = localization.code
+        AND localization.entity = 'itemtypes'
+        AND localization.lang = ?
     WHERE issuingrules.branchcode = ?
 ");
-$sth2->execute($branch);
+$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'});
@@ -496,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) {
@@ -589,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'};
     }
 }