Test circ creation improvements
authorBill Erickson <berick@esilibrary.com>
Wed, 17 Oct 2012 13:43:08 +0000 (09:43 -0400)
committerBill Erickson <berick@esilibrary.com>
Wed, 17 Oct 2012 13:43:08 +0000 (09:43 -0400)
* bump due_date to 23:59:59 only for >= 1-day circs
* create overdues with an xact_id in the past for added realism
* vary the duration rules

Signed-off-by: Bill Erickson <berick@esilibrary.com>
Open-ILS/tests/datasets/sql/env_create.sql
Open-ILS/tests/datasets/sql/transactions.sql

index 313607d..a974762 100644 (file)
@@ -34,7 +34,7 @@ RETURNS void AS $$
         WHERE record > 0 AND label LIKE $4 || '%' AND owning_lib = $2;
 $$ LANGUAGE SQL;
 
-/** Returns the next (by ID) non-deleted copy */
+/** Returns the next (by ID) non-deleted asset.copy */
 CREATE FUNCTION evergreen.next_copy (copy_id BIGINT) RETURNS asset.copy AS $$
     DECLARE copy asset.copy%ROWTYPE;
     DECLARE max_id BIGINT;
@@ -55,11 +55,7 @@ END;
 $$ LANGUAGE PLPGSQL;                                                        
 
 
-
-
-/**
- * Creates circulations
- */
+/** Create one circulation */
 CREATE FUNCTION evergreen.populate_circ (
     patron_barcode TEXT, 
     copy_barcode TEXT, 
@@ -69,35 +65,57 @@ CREATE FUNCTION evergreen.populate_circ (
     max_fine_rule TEXT,
     overdue BOOLEAN
 )
+
 RETURNS void AS $$
+    DECLARE duration config.rule_circ_duration%ROWTYPE;
+    DECLARE recurring config.rule_recurring_fine%ROWTYPE;
+    DECLARE max_fine config.rule_max_fine%ROWTYPE;
+    DECLARE due_date TIMESTAMP;
+    DECLARE xact_start TIMESTAMP;
+BEGIN
+
+    SELECT INTO duration * FROM config.rule_circ_duration WHERE name = duration_rule;
+    SELECT INTO recurring * FROM config.rule_recurring_fine WHERE name = recurring_fine_rule;
+    SELECT INTO max_fine * FROM config.rule_max_fine WHERE name = max_fine_rule;
+
+    IF overdue THEN
+        -- if duration is '7 days', the overdue item was due 7 days ago
+        due_date := NOW() - duration.normal;
+        -- make overdue circs appear as if they were created two durations ago
+        xact_start := NOW() - duration.normal - duration.normal;
+    ELSE
+        due_date := NOW() + duration.normal;
+        xact_start := NOW();
+    END IF;
+
+    IF duration.normal >= '1 day'::INTERVAL THEN
+        due_date := (DATE(due_date) || ' 23:59:59')::TIMESTAMP;
+    END IF;
+
+
+
     INSERT INTO action.circulation (
-        usr, target_copy, circ_lib, circ_staff, renewal_remaining,
+        xact_start, usr, target_copy, circ_lib, circ_staff, renewal_remaining,
         grace_period, duration, recurring_fine, max_fine, duration_rule,
         recurring_fine_rule, max_fine_rule, due_date )
     VALUES (
-        (SELECT usr FROM actor.card WHERE barcode = $1),
-        (SELECT id FROM asset.copy WHERE barcode = $2 AND NOT deleted),
-        $3, -- circ_lib
+        xact_start,
+        (SELECT usr FROM actor.card WHERE barcode = patron_barcode),
+        (SELECT id FROM asset.copy WHERE barcode = copy_barcode AND NOT deleted),
+        circ_lib, 
         1, -- circ_staff
-        (SELECT max_renewals FROM config.rule_circ_duration WHERE name = $4),
-        (SELECT grace_period FROM config.rule_recurring_fine WHERE name = $5),
-        (SELECT normal FROM config.rule_circ_duration WHERE name = $4),
-        (SELECT normal FROM config.rule_recurring_fine WHERE name = $5),
-        (SELECT amount FROM config.rule_max_fine WHERE name = $6),
-        $4, -- duration_rule
-        $5, -- recurring_fine_rule
-        $6, -- max_fine_rule
-        CASE WHEN $7 THEN -- due_date
-            (DATE(NOW() -  -- subtract duration from now() for overdues
-                (SELECT normal FROM config.rule_circ_duration WHERE name = $4)) 
-                    || ' 23:59:59')::TIMESTAMP -- due_date
-        ELSE 
-            (DATE(NOW() + 
-                (SELECT normal FROM config.rule_circ_duration WHERE name = $4)) 
-                    || ' 23:59:59')::TIMESTAMP -- due_date
-        END
+        duration.max_renewals,
+        recurring.grace_period,
+        duration.normal,
+        recurring.normal,
+        max_fine.amount,
+        duration.name,
+        recurring.name,
+        max_fine.name,
+        due_date
     );
-$$ LANGUAGE SQL;
+END;
+$$ LANGUAGE PLPGSQL;
 
 
 
index 1e51b3e..da1aa99 100644 (file)
@@ -31,14 +31,14 @@ BEGIN
             PERFORM evergreen.populate_circ(
                 (SELECT barcode FROM actor.card WHERE usr = recipient),
                 copy.barcode, copy.circ_lib,
-                'default', 'default', 'overdue_min', FALSE
+                '1_hour_2_renew', 'default', 'overdue_min', FALSE
             );
 
             copy := evergreen.next_copy(copy.id);
             PERFORM evergreen.populate_circ(
                 (SELECT barcode FROM actor.card WHERE usr = recipient),
                 copy.barcode, copy.circ_lib,
-                'default', 'default', 'overdue_max', FALSE
+                '7_days_0_renew', 'default', 'overdue_max', FALSE
             );
 
             -- overdues...
@@ -54,14 +54,14 @@ BEGIN
             PERFORM evergreen.populate_circ(
                 (SELECT barcode FROM actor.card WHERE usr = recipient),
                 copy.barcode, copy.circ_lib,
-                'default', 'default', 'overdue_min', TRUE
+                '1_hour_2_renew', 'default', 'overdue_min', TRUE
             );
 
             copy := evergreen.next_copy(copy.id);
             PERFORM evergreen.populate_circ(
                 (SELECT barcode FROM actor.card WHERE usr = recipient),
                 copy.barcode, copy.circ_lib,
-                'default', 'default', 'overdue_max', TRUE
+                '7_days_0_renew', 'default', 'overdue_max', TRUE
             );
 
         END LOOP;