[open-ils-commits] r11280 - trunk/Open-ILS/src/sql/Pg

svn at svn.open-ils.org svn at svn.open-ils.org
Thu Nov 20 00:57:58 EST 2008


Author: miker
Date: 2008-11-20 00:57:55 -0500 (Thu, 20 Nov 2008)
New Revision: 11280

Modified:
   trunk/Open-ILS/src/sql/Pg/006.schema.permissions.sql
   trunk/Open-ILS/src/sql/Pg/100.circ_matrix.sql
   trunk/Open-ILS/src/sql/Pg/110.hold_matrix.sql
   trunk/Open-ILS/src/sql/Pg/950.data.seed-values.sql
Log:
pushing in-db circ and hold to use directly calculated standing penalties where possible.

Modified: trunk/Open-ILS/src/sql/Pg/006.schema.permissions.sql
===================================================================
--- trunk/Open-ILS/src/sql/Pg/006.schema.permissions.sql	2008-11-20 02:59:26 UTC (rev 11279)
+++ trunk/Open-ILS/src/sql/Pg/006.schema.permissions.sql	2008-11-20 05:57:55 UTC (rev 11280)
@@ -39,6 +39,14 @@
 );
 CREATE INDEX grp_tree_parent_idx ON permission.grp_tree (parent);
 
+CREATE TABLE permission.grp_penalty_threshold (
+	id			SERIAL	        PRIMARY KEY,
+    grp         INT             NOT NULL REFERENCES permission.grp_tree (id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
+    penalty     INT             NOT NULL REFERENCES config.standing_penalty (id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
+    threshold   NUMERIC(8,2)    NOT NULL,
+    CONSTRAINT penalty_grp_once UNIQUE (grp,penalty)
+);
+
 CREATE TABLE permission.grp_perm_map (
 	id		SERIAL	PRIMARY KEY,
 	grp		INT	NOT NULL REFERENCES permission.grp_tree (id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,

Modified: trunk/Open-ILS/src/sql/Pg/100.circ_matrix.sql
===================================================================
--- trunk/Open-ILS/src/sql/Pg/100.circ_matrix.sql	2008-11-20 02:59:26 UTC (rev 11279)
+++ trunk/Open-ILS/src/sql/Pg/100.circ_matrix.sql	2008-11-20 05:57:55 UTC (rev 11280)
@@ -117,8 +117,6 @@
 	matchpoint      INT     PRIMARY KEY NOT NULL REFERENCES config.circ_matrix_matchpoint (id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
 	circulate       BOOL    NOT NULL DEFAULT TRUE,	-- Hard "can't circ" flag requiring an override
 	max_items_out   INT,                        	-- Total current active circulations must be less than this, NULL means skip (always pass)
-	max_overdue     INT,                            -- Total overdue active circulations must be less than this, NULL means skip (always pass)
-	max_fines       NUMERIC(8,2),                   -- Total fines owed must be less than this, NULL means skip (always pass)
 	org_depth       INT,                            -- Set to the top OU for the max-out applicability range
 	script_test     TEXT                            -- filename or javascript source ??
 );
@@ -232,9 +230,13 @@
 	result			action.matrix_test_result;
 	circ_test		config.circ_matrix_test%ROWTYPE;
 	out_by_circ_mod		config.circ_matrix_circ_mod_test%ROWTYPE;
+	patron_penalties 		INT;
+	tmp_grp 		INT;
 	items_out		INT;
+	max_overdue		INT;
 	items_overdue		INT;
 	overdue_orgs		INT[];
+	max_fines		    NUMERIC(8,2) := 0.0;
 	current_fines		NUMERIC(8,2) := 0.0;
 	tmp_fines		NUMERIC(8,2);
 	tmp_groc		RECORD;
@@ -318,6 +320,34 @@
 		RETURN NEXT result;
 	END IF;
 
+    SELECT  INTO patron_penalties COUNT(*)
+      FROM  actor.usr_standing_penalty usp
+            JOIN config.standing_penalty csp ON (csp.id = usp.penalty)
+      WHERE usr = match_user
+            AND csp.block_list LIKE '%RENEW%';
+
+    IF patron_penalties > 0 THEN
+        result.fail_part := 'config.circ_matrix_test.stop_blocked_user.circ';
+        result.success := FALSE;
+        done := TRUE;
+        RETURN NEXT result;
+    END IF;
+
+    patron_penalties := 0;
+
+    SELECT  INTO patron_penalties COUNT(*)
+      FROM  actor.usr_standing_penalty usp
+            JOIN config.standing_penalty csp ON (csp.id = usp.penalty)
+      WHERE usr = match_user
+            AND csp.block_list LIKE '%CIRC%';
+
+    IF patron_penalties > 0 THEN
+        result.fail_part := 'config.circ_matrix_test.stop_blocked_user.renew';
+        result.success := FALSE;
+        done := TRUE;
+        RETURN NEXT result;
+    END IF;
+
 	-- Fail if the user has too many items checked out
 	IF circ_test.max_items_out IS NOT NULL THEN
     	SELECT  INTO items_out COUNT(*)
@@ -327,7 +357,7 @@
                 AND checkin_time IS NULL
                 AND (stop_fines NOT IN ('LOST','CLAIMSRETURNED','LONGOVERDUE') OR stop_fines IS NULL);
 	   	IF items_out >= circ_test.max_items_out THEN
-		    	result.fail_part := 'config.circ_matrix_test.max_items_out';
+	    	result.fail_part := 'config.circ_matrix_test.max_items_out';
 			result.success := FALSE;
 			done := TRUE;
 	   		RETURN NEXT result;
@@ -353,7 +383,21 @@
 	END LOOP;
 
 	-- Fail if the user has too many overdue items
-	IF circ_test.max_overdue IS NOT NULL THEN
+    tmp_grp := user_object.profile;
+    LOOP
+        SELECT pgpt.threshold::INT INTO max_overdue FROM permission.grp_penalty_threshold WHERE grp = tmp_grp AND penalty = 2;
+        IF max_overdue IS NULL THEN
+            SELECT parent INTO tmp_grp FROM permission.grp_tree WHERE id = tmp_grp;
+        ELSE
+            EXIT;
+        END IF;
+
+        IF tmp_grp IS NULL THEN
+            EXIT;
+        END IF;
+    END LOOP;
+
+	IF max_overdue IS NOT NULL THEN
 		SELECT  INTO items_overdue COUNT(*)
 		  FROM  action.circulation
 		  WHERE usr = match_user
@@ -361,7 +405,9 @@
 			AND checkin_time IS NULL
 			AND due_date < NOW()
 			AND (stop_fines NOT IN ('LOST','CLAIMSRETURNED','LONGOVERDUE') OR stop_fines IS NULL);
-		IF items_overdue >= circ_test.max_overdue THEN
+		IF items_overdue >= max_overdue THEN
+            DELETE FROM actor.usr_standing_penalty WHERE usr = match_usr AND standing_penalty = 2;
+            INSERT INTO actor.usr_standing_penalty (usr, standing_penalty) VALUES (match_usr, 2);
 			result.fail_part := 'config.circ_matrix_test.max_overdue';
 			result.success := FALSE;
 			done := TRUE;
@@ -370,7 +416,21 @@
 	END IF;
 
 	-- Fail if the user has a high fine balance
-	IF circ_test.max_fines IS NOT NULL THEN
+    tmp_grp := user_object.profile;
+    LOOP
+        SELECT pgpt.threshold INTO max_fines FROM permission.grp_penalty_threshold WHERE grp = tmp_grp AND penalty = 1;
+        IF max_overdue IS NULL THEN
+            SELECT parent INTO tmp_grp FROM permission.grp_tree WHERE id = tmp_grp;
+        ELSE
+            EXIT;
+        END IF;
+
+        IF tmp_grp IS NULL THEN
+            EXIT;
+        END IF;
+    END LOOP;
+
+	IF max_fines IS NOT NULL THEN
 		FOR tmp_groc IN SELECT * FROM money.grocery WHERE usr = match_usr AND xact_finish IS NULL AND (circ_test.org_depth IS NULL OR (circ_test.org_depth IS NOT NULL AND billing_location IN ( SELECT * FROM explode_array(overdue_orgs) ))) LOOP
 			SELECT INTO tmp_fines SUM( amount ) FROM money.billing WHERE xact = tmp_groc.id AND NOT voided;
 			current_fines = current_fines + COALESCE(tmp_fines, 0.0);
@@ -385,7 +445,9 @@
 			current_fines = current_fines - COALESCE(tmp_fines, 0.0);
 		END LOOP;
 
-		IF current_fines >= circ_test.max_fines THEN
+		IF current_fines >= max_fines THEN
+            DELETE FROM actor.usr_standing_penalty WHERE usr = match_usr AND standing_penalty = 1;
+            INSERT INTO actor.usr_standing_penalty (usr, standing_penalty) VALUES (match_usr, 1);
 			result.fail_part := 'config.circ_matrix_test.max_fines';
 			result.success := FALSE;
 			RETURN NEXT result;
@@ -410,6 +472,8 @@
 	SELECT * FROM action.item_user_circ_test( $1, $2, $3, TRUE );
 $func$ LANGUAGE SQL;
 
+CREATE OR REPLACE FUNCTION actor.refresh_auto_penalties( user INT ) RETURNS INT AS $func$
+$func$ LANGUAGE plpgsql;
 
 COMMIT;
 

Modified: trunk/Open-ILS/src/sql/Pg/110.hold_matrix.sql
===================================================================
--- trunk/Open-ILS/src/sql/Pg/110.hold_matrix.sql	2008-11-20 02:59:26 UTC (rev 11279)
+++ trunk/Open-ILS/src/sql/Pg/110.hold_matrix.sql	2008-11-20 05:57:55 UTC (rev 11280)
@@ -252,13 +252,30 @@
 		END IF;
 	END IF;
 
+	SELECT	INTO patron_penalties COUNT(*)
+	  FROM	actor.usr_standing_penalty usp
+            JOIN config.standing_penalty csp ON (csp.id = usp.penalty)
+	  WHERE	usr = match_user
+            AND csp.block_list LIKE '%HOLD%';
+
+	IF patron_penalties > 0 THEN
+		result.fail_part := 'config.hold_matrix_test.stop_blocked_user.hold';
+		result.success := FALSE;
+		done := TRUE;
+		RETURN NEXT result;
+	END IF;
+
+    patron_penalties := 0;
+
 	IF hold_test.stop_blocked_user IS TRUE THEN
 		SELECT	INTO patron_penalties COUNT(*)
-		  FROM	actor.usr_standing_penalty
-		  WHERE	usr = match_user;
+		  FROM	actor.usr_standing_penalty usp
+                JOIN config.standing_penalty csp ON (csp.id = usp.penalty)
+		  WHERE	usr = match_user
+                AND csp.block_list LIKE '%CIRC%';
 
-		IF items_out > 0 THEN
-			result.fail_part := 'config.hold_matrix_test.stop_blocked_user';
+		IF patron_penalties > 0 THEN
+			result.fail_part := 'config.hold_matrix_test.stop_blocked_user.circ';
 			result.success := FALSE;
 			done := TRUE;
 			RETURN NEXT result;
@@ -273,7 +290,7 @@
 			AND cancel_time IS NULL
 			AND CASE WHEN hold_test.include_frozen_holds THEN TRUE ELSE frozen IS FALSE END;
 
-		IF items_out >= hold_test.max_holds THEN
+		IF hold_count >= hold_test.max_holds THEN
 			result.fail_part := 'config.hold_matrix_test.max_holds';
 			result.success := FALSE;
 			done := TRUE;

Modified: trunk/Open-ILS/src/sql/Pg/950.data.seed-values.sql
===================================================================
--- trunk/Open-ILS/src/sql/Pg/950.data.seed-values.sql	2008-11-20 02:59:26 UTC (rev 11279)
+++ trunk/Open-ILS/src/sql/Pg/950.data.seed-values.sql	2008-11-20 05:57:55 UTC (rev 11280)
@@ -1293,6 +1293,13 @@
 
 SELECT SETVAL('permission.grp_tree_id_seq'::TEXT, (SELECT MAX(id) FROM permission.grp_tree));
 
+INSERT INTO permission.grp_penalty_threshold (grp,penalty,threshold)
+    VALUES (1,1,10.0);
+INSERT INTO permission.grp_penalty_threshold (grp,penalty,threshold)
+    VALUES (1,2,10.0);
+
+SELECT SETVAL('permission.grp_tree_id_seq'::TEXT, (SELECT MAX(id) FROM permission.grp_tree));
+
 -- XXX Incomplete base permission setup.  A patch would be appreciated.
 INSERT INTO permission.grp_perm_map VALUES (57, 2, 15, 0, false);
 INSERT INTO permission.grp_perm_map VALUES (109, 2, 95, 0, false);



More information about the open-ils-commits mailing list