Bug 15422: Correct calculation of holds ratio report
authorNick Clemens <nick@bywatersolutions.com>
Thu, 29 Nov 2018 02:07:18 +0000 (02:07 +0000)
committerMartin Renvoize <martin.renvoize@ptfs-europe.com>
Tue, 8 Oct 2019 13:07:19 +0000 (14:07 +0100)
See comment 1 for a detailed explanation of current calculations and
needed calculations

Also removes an unnecessary variable

To test:
 1 - Place 4 holds on a biblio with one item
 2 - go to /cgi-bin/koha/circ/reserveratios.pl (Circulation->Holds
        ratios)
 3 - Run with 'Hold ratio'=3, it says order 1, ok
 4 - Run with HR=4, it says order 1, wrong
 5 - Run with HR=2, it syas order 2, wrong
 6 - Run with HR=.5, it syas order 4, wrong
 7 - Apply patch
 8 - Run with HR=3, order 1, OK
 9 - Run with HR=4, item does not appear (0 to order), OK
10 - Run with HR=2, order 1, OK
11 - Run with HR=.5, order 7, OK

Signed-off-by: Owen Leonard <oleonard@myacpl.org>
Signed-off-by: Katrin Fischer <katrin.fischer.83@web.de>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>

circ/reserveratios.pl

index ae9cf18..1beb559 100755 (executable)
@@ -151,12 +151,11 @@ $template->param(sql => $strsth);
 my $sth = $dbh->prepare($strsth);
 $sth->execute(@query_params);
 
-my $ratio_atleast1 = ($ratio >= 1) ? 1 : 0;
 my @reservedata;
 while ( my $data = $sth->fetchrow_hashref ) {
     my $thisratio = $data->{reservecount} / $data->{itemcount};
-    my $ratiocalc = ($thisratio / $ratio);
-    ($thisratio / $ratio) >= 1 or next;  # TODO: tighter targeting -- get ratio limit into SQL using HAVING clause
+    my $ratiocalc = $data->{reservecount}/$ratio - $data->{itemcount};
+    $ratiocalc >= 1 or next;  # TODO: tighter targeting -- get ratio limit into SQL using HAVING clause
     push(
         @reservedata,
         {
@@ -180,7 +179,7 @@ while ( my $data = $sth->fetchrow_hashref ) {
             itype              => [split('\|', $data->{l_itype})],
             reservecount       => $data->{reservecount},
             itemcount          => $data->{itemcount},
-            ratiocalc          => sprintf( "%.0d", $ratio_atleast1 ? ( $thisratio / $ratio ) : $thisratio ),
+            ratiocalc          => sprintf( "%.0d", $ratiocalc ),
             thisratio => sprintf( "%.2f", $thisratio ),
             thisratio_atleast1 => ( $thisratio >= 1 ) ? 1 : 0,
             listcall           => [split('\|', $data->{listcall})]
@@ -194,7 +193,6 @@ for my $rd ( @reservedata ) {
 }
 
 $template->param(
-    ratio_atleast1  => $ratio_atleast1,
     todaysdate      => $todaysdate,
     from            => $startdate,
     to              => $enddate,