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;
$$ LANGUAGE PLPGSQL;
-
-
-/**
- * Creates circulations
- */
+/** Create one circulation */
CREATE FUNCTION evergreen.populate_circ (
patron_barcode TEXT,
copy_barcode TEXT,
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;
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...
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;