Patch from Doug Kyle to address transit-related deficiency in the reshelving-complete...
authormiker <miker@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Mon, 1 Feb 2010 17:24:21 +0000 (17:24 +0000)
committermiker <miker@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Mon, 1 Feb 2010 17:24:21 +0000 (17:24 +0000)
Previously, items that transited for reshelving at their circulating library would be flipped from Reshelving to Available almost immediately in most cases.  Doug taught the "find copies to flip to Available" query about transit receive times, allowing them to stay in Reshelving status for as long as copies returned directly to the circulating library.

git-svn-id: svn://svn.open-ils.org/ILS/trunk@15416 dcc99617-32d9-48b4-a31d-7c20da2025e4

Open-ILS/src/perlmods/OpenILS/Application/Storage/Publisher/action.pm

index 5762dd2..9b3590c 100644 (file)
@@ -147,35 +147,43 @@ sub complete_reshelving {
        my $setting = actor::org_unit_setting->table;
        my $circ = action::circulation->table;
        my $cp = asset::copy->table;
+       my $atc = action::transit_copy->table;
 
        my $sql = <<"   SQL";
                UPDATE  $cp
                  SET   status = 0
                  WHERE id IN (
-            SELECT  id
-              FROM  (SELECT cp.id, MAX(circ.checkin_time)
-                      FROM  $cp cp
-                            JOIN $circ circ ON (circ.target_copy = cp.id)
-                            LEFT JOIN $setting setting
-                                ON (cp.circ_lib = setting.org_unit AND setting.name = 'circ.reshelving_complete.interval')
-                      WHERE circ.checkin_time IS NOT NULL
-                            AND cp.status = 7
-                      GROUP BY 1
-                      HAVING MAX(circ.checkin_time) < NOW() - CAST( COALESCE( BTRIM( FIRST(setting.value),'"' ), ? )  AS INTERVAL)
-                    ) AS foo
-                                UNION ALL
-            SELECT  cp.id
-                          FROM $cp cp 
-                    LEFT JOIN $setting setting
-                        ON (cp.circ_lib = setting.org_unit AND setting.name = 'circ.reshelving_complete.interval')
-                    LEFT JOIN $circ circ ON (circ.target_copy = cp.id)
-              WHERE cp.status = 7 AND circ.id IS NULL
-                    AND cp.create_date < NOW() - CAST( COALESCE( BTRIM( setting.value,'"' ), ? )  AS INTERVAL)
-          )
-       SQL
-
+                       SELECT  id
+                         FROM  (SELECT cp.id, MAX(circ.checkin_time), MAX(trans.dest_recv_time)
+                                         FROM  $cp cp
+                                                       JOIN $circ circ ON (circ.target_copy = cp.id)
+                                                       LEFT JOIN $atc trans ON (trans.target_copy = cp.id)
+                                                       LEFT JOIN $setting setting
+                                                               ON (cp.circ_lib = setting.org_unit AND setting.name = 'circ.reshelving_complete.interval')
+                                         WHERE circ.checkin_time IS NOT NULL
+                                                       AND cp.status = 7
+                                         GROUP BY 1
+                                         HAVING (
+                                               ( ( MAX(circ.checkin_time) > MAX(trans.dest_recv_time) or MAX(trans.dest_recv_time) IS NULL )
+                                                 AND MAX(circ.checkin_time) < NOW() - CAST( COALESCE( BTRIM( FIRST(setting.value),'"' ), ? )  AS INTERVAL) )
+                                               OR
+                                               ( MAX(trans.dest_recv_time) > MAX(circ.checkin_time)
+                                                 AND MAX(trans.dest_recv_time) < NOW() - CAST( COALESCE( BTRIM( FIRST(setting.value),'"' ), ? )  AS INTERVAL) )
+                                         )
+                                       ) AS foo
+                                                               UNION ALL
+                       SELECT  cp.id
+                         FROM  $cp cp 
+                                       LEFT JOIN $setting setting
+                                               ON (cp.circ_lib = setting.org_unit AND setting.name = 'circ.reshelving_complete.interval')
+                                       LEFT JOIN $circ circ ON (circ.target_copy = cp.id)
+                         WHERE cp.status = 7
+                                       AND circ.id IS NULL
+                                       AND cp.create_date < NOW() - CAST( COALESCE( BTRIM( setting.value,'"' ), ? )  AS INTERVAL)
+                 )
+       SQL
        my $sth = action::circulation->db_Main->prepare_cached($sql);
-       $sth->execute($window, $window);
+       $sth->execute($window, $window, $window);
 
        return $sth->rows;