From: Thomas Berezansky Date: Mon, 13 Jun 2011 01:11:13 +0000 (-0400) Subject: Active date X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=74ac0cc2971d53a24e1feb076f774133e31b964f;p=evergreen%2Ftadl.git Active date Record the date a copy first became "active" after creation in active_date. Offer Org Unit setting for using the active date for age hold protection. Any copy without an active_date, with age hold protect using it, will be protected until it has an active date. Regardless of create_date. Circ/Hold matrix can match on item age based on active_date. Active is defined as entering a status with copy_active set to true. By default: Available Checked out Reshelving On holds shelf ILL Reserves On reservation shelf Signed-off-by: Thomas Berezansky Signed-off-by: Bill Erickson --- diff --git a/Open-ILS/examples/fm_IDL.xml b/Open-ILS/examples/fm_IDL.xml index e41464ecff..ce42aa3627 100644 --- a/Open-ILS/examples/fm_IDL.xml +++ b/Open-ILS/examples/fm_IDL.xml @@ -1154,6 +1154,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + @@ -1182,6 +1183,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + @@ -1235,6 +1237,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + @@ -1287,6 +1290,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + @@ -2709,6 +2713,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + @@ -3787,6 +3792,7 @@ SELECT usr, + @@ -4813,6 +4819,7 @@ SELECT usr, + diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/CDBI/asset.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/CDBI/asset.pm index 6cecb8da92..0fc1061eff 100644 --- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/CDBI/asset.pm +++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/CDBI/asset.pm @@ -72,7 +72,7 @@ __PACKAGE__->columns( Essential => qw/call_number barcode creator create_date ed fine_level circulate deposit price ref opac_visible circ_as_type circ_modifier deposit_amount location mint_condition holdable dummy_title dummy_author deleted alert_message - age_protect floating cost status_changed_time/ ); + age_protect floating cost status_changed_time active_date/ ); #------------------------------------------------------------------------------- package asset::copy_part_map; diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/CDBI/config.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/CDBI/config.pm index da03f1f142..5034730d54 100644 --- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/CDBI/config.pm +++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/CDBI/config.pm @@ -73,7 +73,7 @@ package config::copy_status; use base qw/config/; __PACKAGE__->table('config_copy_status'); __PACKAGE__->columns(Primary => 'id'); -__PACKAGE__->columns(Essential => qw/name holdable opac_visible/); +__PACKAGE__->columns(Essential => qw/name holdable opac_visible copy_active/); #------------------------------------------------------------------------------- package config::net_access_level; diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/CDBI/serial.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/CDBI/serial.pm index 431c6729e8..0264aa63fd 100644 --- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/CDBI/serial.pm +++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/CDBI/serial.pm @@ -45,7 +45,7 @@ __PACKAGE__->columns( Essential => qw/call_number barcode creator create_date ed fine_level circulate deposit price ref opac_visible dummy_isbn circ_as_type circ_modifier deposit_amount location mint_condition holdable dummy_title dummy_author deleted alert_message - age_protect floating summary_contents detailed_contents/ ); + age_protect floating summary_contents detailed_contents active_date/ ); #------------------------------------------------------------------------------- package serial::record_entry; diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Utils/PermitHold.pm b/Open-ILS/src/perlmods/lib/OpenILS/Utils/PermitHold.pm index 47a561aea8..39bfaeb358 100644 --- a/Open-ILS/src/perlmods/lib/OpenILS/Utils/PermitHold.pm +++ b/Open-ILS/src/perlmods/lib/OpenILS/Utils/PermitHold.pm @@ -162,13 +162,19 @@ sub check_age_protect { { order_by => 'age' } ); - # Now, now many seconds old is this copy - my $create_date = DateTime::Format::ISO8601 - ->new - ->parse_datetime( OpenSRF::Utils::cleanse_ISO8601($copy->create_date) ) - ->epoch; - - my $age = time - $create_date; + my $age_protect_date = $copy->create_date; + $age_protect_date = $copy->active_date if($U->ou_ancestor_setting_value($copy->circ_lib, 'circ.holds.age_protect.active_date')); + + my $age = 0; + my $age_protect_parsed; + if($age_protect_date) { + # Now, now many seconds old is this copy + $age_protect_parsed = DateTime::Format::ISO8601 + ->new + ->parse_datetime( OpenSRF::Utils::cleanse_ISO8601($age_protect_date) ) + ->epoch; + $age = time - $age_protect_parsed; + } for my $protection ( @$protection_list ) { @@ -180,7 +186,7 @@ sub check_age_protect { # How many seconds old does the copy have to be to escape age protection my $interval = OpenSRF::Utils::interval_to_seconds($protection->age); - $logger->info("age_protect interval=$interval, create_date=$create_date, age=$age"); + $logger->info("age_protect interval=$interval, age_protect_date=$age_protect_parsed, age=$age"); if( $interval > $age ) { # if age of the item is less than the protection interval, diff --git a/Open-ILS/src/sql/Pg/002.schema.config.sql b/Open-ILS/src/sql/Pg/002.schema.config.sql index e2922c492c..d998f7f991 100644 --- a/Open-ILS/src/sql/Pg/002.schema.config.sql +++ b/Open-ILS/src/sql/Pg/002.schema.config.sql @@ -349,7 +349,8 @@ CREATE TABLE config.copy_status ( id SERIAL PRIMARY KEY, name TEXT NOT NULL UNIQUE, holdable BOOL NOT NULL DEFAULT FALSE, - opac_visible BOOL NOT NULL DEFAULT FALSE + opac_visible BOOL NOT NULL DEFAULT FALSE, + copy_active BOOL NOT NULL DEFAULT FALSE ); COMMENT ON TABLE config.copy_status IS $$ Copy Statuses diff --git a/Open-ILS/src/sql/Pg/040.schema.asset.sql b/Open-ILS/src/sql/Pg/040.schema.asset.sql index 010c3bcc56..ddb116a152 100644 --- a/Open-ILS/src/sql/Pg/040.schema.asset.sql +++ b/Open-ILS/src/sql/Pg/040.schema.asset.sql @@ -80,6 +80,7 @@ CREATE TABLE asset.copy ( floating BOOL NOT NULL DEFAULT FALSE, dummy_isbn TEXT, status_changed_time TIMESTAMP WITH TIME ZONE, + active_date TIMESTAMP WITH TIME ZONE, mint_condition BOOL NOT NULL DEFAULT TRUE, cost NUMERIC(8,2) ); @@ -118,6 +119,23 @@ RETURNS TRIGGER AS $$ BEGIN IF NEW.status <> OLD.status THEN NEW.status_changed_time := now(); + IF NEW.active_date IS NULL AND NEW.status IN (SELECT id FROM config.copy_status WHERE copy_active = true) THEN + NEW.active_date := now(); + END IF; + END IF; + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +-- Need to check on initial create. Fast adds, manual edit of status at create, etc. +CREATE OR REPLACE FUNCTION asset.acp_created() +RETURNS TRIGGER AS $$ +BEGIN + IF NEW.active_date IS NULL AND NEW.status IN (SELECT id FROM config.copy_status WHERE copy_active = true) THEN + NEW.active_date := now(); + END IF; + IF NEW.status_changed_time IS NULL THEN + NEW.status_changed_time := now(); END IF; RETURN NEW; END; @@ -127,6 +145,10 @@ CREATE TRIGGER acp_status_changed_trig BEFORE UPDATE ON asset.copy FOR EACH ROW EXECUTE PROCEDURE asset.acp_status_changed(); +CREATE TRIGGER acp_created_trig + BEFORE INSERT ON asset.copy + FOR EACH ROW EXECUTE PROCEDURE asset.acp_created(); + CREATE TABLE asset.stat_cat_sip_fields ( field CHAR(2) PRIMARY KEY, name TEXT NOT NULL, diff --git a/Open-ILS/src/sql/Pg/099.matrix_weights.sql b/Open-ILS/src/sql/Pg/099.matrix_weights.sql index febf5692c4..5854d3e2b7 100644 --- a/Open-ILS/src/sql/Pg/099.matrix_weights.sql +++ b/Open-ILS/src/sql/Pg/099.matrix_weights.sql @@ -19,7 +19,8 @@ CREATE TABLE config.circ_matrix_weights ( juvenile_flag NUMERIC(6,2) NOT NULL, is_renewal NUMERIC(6,2) NOT NULL, usr_age_lower_bound NUMERIC(6,2) NOT NULL, - usr_age_upper_bound NUMERIC(6,2) NOT NULL + usr_age_upper_bound NUMERIC(6,2) NOT NULL, + item_age NUMERIC(6,2) NOT NULL ); -- Hold Matrix Weights @@ -39,7 +40,8 @@ CREATE TABLE config.hold_matrix_weights ( marc_bib_level NUMERIC(6,2) NOT NULL, marc_vr_format NUMERIC(6,2) NOT NULL, juvenile_flag NUMERIC(6,2) NOT NULL, - ref_flag NUMERIC(6,2) NOT NULL + ref_flag NUMERIC(6,2) NOT NULL, + item_age NUMERIC(6,2) NOT NULL ); -- Linking between weights and org units diff --git a/Open-ILS/src/sql/Pg/100.circ_matrix.sql b/Open-ILS/src/sql/Pg/100.circ_matrix.sql index fadc392890..9074ba7867 100644 --- a/Open-ILS/src/sql/Pg/100.circ_matrix.sql +++ b/Open-ILS/src/sql/Pg/100.circ_matrix.sql @@ -69,6 +69,7 @@ CREATE TABLE config.circ_matrix_matchpoint ( is_renewal BOOL, usr_age_lower_bound INTERVAL, usr_age_upper_bound INTERVAL, + item_age INTERVAL, -- "Result" Fields circulate BOOL, -- Hard "can't circ" flag requiring an override duration_rule INT REFERENCES config.rule_circ_duration (id) DEFERRABLE INITIALLY DEFERRED, @@ -83,7 +84,7 @@ CREATE TABLE config.circ_matrix_matchpoint ( ); -- Nulls don't count for a constraint match, so we have to coalesce them into something that does. -CREATE UNIQUE INDEX ccmm_once_per_paramset ON config.circ_matrix_matchpoint (org_unit, grp, COALESCE(circ_modifier, ''), COALESCE(marc_type, ''), COALESCE(marc_form, ''), COALESCE(marc_bib_level,''), COALESCE(marc_vr_format, ''), COALESCE(copy_circ_lib::TEXT, ''), COALESCE(copy_owning_lib::TEXT, ''), COALESCE(user_home_ou::TEXT, ''), COALESCE(ref_flag::TEXT, ''), COALESCE(juvenile_flag::TEXT, ''), COALESCE(is_renewal::TEXT, ''), COALESCE(usr_age_lower_bound::TEXT, ''), COALESCE(usr_age_upper_bound::TEXT, '')) WHERE active; +CREATE UNIQUE INDEX ccmm_once_per_paramset ON config.circ_matrix_matchpoint (org_unit, grp, COALESCE(circ_modifier, ''), COALESCE(marc_type, ''), COALESCE(marc_form, ''), COALESCE(marc_bib_level,''), COALESCE(marc_vr_format, ''), COALESCE(copy_circ_lib::TEXT, ''), COALESCE(copy_owning_lib::TEXT, ''), COALESCE(user_home_ou::TEXT, ''), COALESCE(ref_flag::TEXT, ''), COALESCE(juvenile_flag::TEXT, ''), COALESCE(is_renewal::TEXT, ''), COALESCE(usr_age_lower_bound::TEXT, ''), COALESCE(usr_age_upper_bound::TEXT, ''), COALESCE(item_age::TEXT, '')) WHERE active; -- Tests for max items out by circ_modifier CREATE TABLE config.circ_matrix_circ_mod_test ( @@ -109,6 +110,7 @@ DECLARE matchpoint config.circ_matrix_matchpoint%ROWTYPE; weights config.circ_matrix_weights%ROWTYPE; user_age INTERVAL; + my_item_age INTERVAL; denominator NUMERIC(6,2); row_list INT[]; result action.found_circ_matrix_matchpoint; @@ -125,6 +127,11 @@ BEGIN SELECT INTO user_age age(user_object.dob); END IF; + -- Ditto + IF item_object.active_date IS NOT NULL THEN + SELECT INTO my_item_age age(item_object.active_date); + END IF; + -- Grab the closest set circ weight setting. SELECT INTO weights cw.* FROM config.weight_assoc wa @@ -151,6 +158,7 @@ BEGIN weights.is_renewal := 7.0; weights.usr_age_lower_bound := 0.0; weights.usr_age_upper_bound := 0.0; + weights.item_age := 0.0; END IF; -- Determine the max (expected) depth (+1) of the org tree and max depth of the permisson tree @@ -194,6 +202,7 @@ BEGIN AND (m.marc_bib_level IS NULL OR m.marc_bib_level = rec_descriptor.bib_level) AND (m.marc_vr_format IS NULL OR m.marc_vr_format = rec_descriptor.vr_format) AND (m.ref_flag IS NULL OR m.ref_flag = item_object.ref) + AND (m.item_age IS NULL OR (my_item_age IS NOT NULL AND m.item_age > my_item_age)) ORDER BY -- Permission Groups CASE WHEN upgad.distance IS NOT NULL THEN 2^(2*weights.grp - (upgad.distance/denominator)) ELSE 0.0 END + @@ -213,7 +222,11 @@ BEGIN CASE WHEN m.marc_type IS NOT NULL THEN 4^weights.marc_type ELSE 0.0 END + CASE WHEN m.marc_form IS NOT NULL THEN 4^weights.marc_form ELSE 0.0 END + CASE WHEN m.marc_vr_format IS NOT NULL THEN 4^weights.marc_vr_format ELSE 0.0 END + - CASE WHEN m.ref_flag IS NOT NULL THEN 4^weights.ref_flag ELSE 0.0 END DESC, + CASE WHEN m.ref_flag IS NOT NULL THEN 4^weights.ref_flag ELSE 0.0 END + + -- Item age has a slight adjustment to weight based on value. + -- This should ensure that a shorter age limit comes first when all else is equal. + -- NOTE: This assumes that intervals will normally be in days. + CASE WHEN m.item_age IS NOT NULL THEN 4^weights.item_age - 1 + 86400/EXTRACT(EPOCH FROM m.item_age) ELSE 0.0 END DESC, -- Final sort on id, so that if two rules have the same sorting in the previous sort they have a defined order -- This prevents "we changed the table order by updating a rule, and we started getting different results" m.id LOOP diff --git a/Open-ILS/src/sql/Pg/110.hold_matrix.sql b/Open-ILS/src/sql/Pg/110.hold_matrix.sql index 5ffa88f7d4..76a1259a03 100644 --- a/Open-ILS/src/sql/Pg/110.hold_matrix.sql +++ b/Open-ILS/src/sql/Pg/110.hold_matrix.sql @@ -47,6 +47,7 @@ CREATE TABLE config.hold_matrix_matchpoint ( marc_vr_format TEXT, juvenile_flag BOOL, ref_flag BOOL, + item_age INTERVAL, -- "Result" Fields holdable BOOL NOT NULL DEFAULT TRUE, -- Hard "can't hold" flag requiring an override distance_is_from_owner BOOL NOT NULL DEFAULT FALSE, -- How to calculate transit_range. True means owning lib, false means copy circ lib @@ -58,7 +59,7 @@ CREATE TABLE config.hold_matrix_matchpoint ( ); -- Nulls don't count for a constraint match, so we have to coalesce them into something that does. -CREATE UNIQUE INDEX chmm_once_per_paramset ON config.hold_matrix_matchpoint (COALESCE(user_home_ou::TEXT, ''), COALESCE(request_ou::TEXT, ''), COALESCE(pickup_ou::TEXT, ''), COALESCE(item_owning_ou::TEXT, ''), COALESCE(item_circ_ou::TEXT, ''), COALESCE(usr_grp::TEXT, ''), COALESCE(requestor_grp::TEXT, ''), COALESCE(circ_modifier, ''), COALESCE(marc_type, ''), COALESCE(marc_form, ''), COALESCE(marc_bib_level, ''), COALESCE(marc_vr_format, ''), COALESCE(juvenile_flag::TEXT, ''), COALESCE(ref_flag::TEXT, '')) WHERE active; +CREATE UNIQUE INDEX chmm_once_per_paramset ON config.hold_matrix_matchpoint (COALESCE(user_home_ou::TEXT, ''), COALESCE(request_ou::TEXT, ''), COALESCE(pickup_ou::TEXT, ''), COALESCE(item_owning_ou::TEXT, ''), COALESCE(item_circ_ou::TEXT, ''), COALESCE(usr_grp::TEXT, ''), COALESCE(requestor_grp::TEXT, ''), COALESCE(circ_modifier, ''), COALESCE(marc_type, ''), COALESCE(marc_form, ''), COALESCE(marc_bib_level, ''), COALESCE(marc_vr_format, ''), COALESCE(juvenile_flag::TEXT, ''), COALESCE(ref_flag::TEXT, ''), COALESCE(item_age::TEXT, '')) WHERE active; CREATE OR REPLACE FUNCTION action.find_hold_matrix_matchpoint(pickup_ou integer, request_ou integer, match_item bigint, match_user integer, match_requestor integer) RETURNS integer AS @@ -68,6 +69,7 @@ DECLARE user_object actor.usr%ROWTYPE; item_object asset.copy%ROWTYPE; item_cn_object asset.call_number%ROWTYPE; + my_item_age INTERVAL; rec_descriptor metabib.rec_descriptor%ROWTYPE; matchpoint config.hold_matrix_matchpoint%ROWTYPE; weights config.hold_matrix_weights%ROWTYPE; @@ -79,6 +81,10 @@ BEGIN SELECT INTO item_cn_object * FROM asset.call_number WHERE id = item_object.call_number; SELECT INTO rec_descriptor * FROM metabib.rec_descriptor WHERE record = item_cn_object.record; + IF item_object.active_date IS NOT NULL THEN + SELECT INTO my_item_age age(item_object.active_date); + END IF; + -- The item's owner should probably be the one determining if the item is holdable -- How to decide that is debatable. Decided to default to the circ library (where the item lives) -- This flag will allow for setting it to the owning library (where the call number "lives") @@ -99,7 +105,7 @@ BEGIN SELECT INTO weights hw.* FROM config.weight_assoc wa JOIN config.hold_matrix_weights hw ON (hw.id = wa.hold_weights) - JOIN actor.org_unit_ancestors_distance( cn_object.owning_lib ) d ON (wa.org_unit = d.id) + JOIN actor.org_unit_ancestors_distance( item_cn_object.owning_lib ) d ON (wa.org_unit = d.id) WHERE active ORDER BY d.distance LIMIT 1; @@ -121,6 +127,7 @@ BEGIN weights.marc_vr_format := 1.0; weights.juvenile_flag := 4.0; weights.ref_flag := 0.0; + weights.item_age := 0.0; END IF; -- Determine the max (expected) depth (+1) of the org tree and max depth of the permisson tree @@ -176,6 +183,7 @@ BEGIN AND (m.marc_bib_level IS NULL OR m.marc_bib_level = rec_descriptor.bib_level) AND (m.marc_vr_format IS NULL OR m.marc_vr_format = rec_descriptor.vr_format) AND (m.ref_flag IS NULL OR m.ref_flag = item_object.ref) + AND (m.item_age IS NULL OR (my_item_age IS NOT NULL AND m.item_age > my_item_age)) ORDER BY -- Permission Groups CASE WHEN rpgad.distance IS NOT NULL THEN 2^(2*weights.requestor_grp - (rpgad.distance/denominator)) ELSE 0.0 END + @@ -193,7 +201,11 @@ BEGIN CASE WHEN m.marc_type IS NOT NULL THEN 4^weights.marc_type ELSE 0.0 END + CASE WHEN m.marc_form IS NOT NULL THEN 4^weights.marc_form ELSE 0.0 END + CASE WHEN m.marc_vr_format IS NOT NULL THEN 4^weights.marc_vr_format ELSE 0.0 END + - CASE WHEN m.ref_flag IS NOT NULL THEN 4^weights.ref_flag ELSE 0.0 END DESC, + CASE WHEN m.ref_flag IS NOT NULL THEN 4^weights.ref_flag ELSE 0.0 END + + -- Item age has a slight adjustment to weight based on value. + -- This should ensure that a shorter age limit comes first when all else is equal. + -- NOTE: This assumes that intervals will normally be in days. + CASE WHEN m.item_age IS NOT NULL THEN 4^weights.item_age - 86400/EXTRACT(EPOCH FROM m.item_age) ELSE 0.0 END DESC, -- Final sort on id, so that if two rules have the same sorting in the previous sort they have a defined order -- This prevents "we changed the table order by updating a rule, and we started getting different results" m.id; @@ -217,6 +229,8 @@ DECLARE ou_skip actor.org_unit_setting%ROWTYPE; result action.matrix_test_result; hold_test config.hold_matrix_matchpoint%ROWTYPE; + use_active_date TEXT; + age_protect_date TIMESTAMP WITH TIME ZONE; hold_count INT; hold_transit_prox INT; frozen_hold_count INT; @@ -357,8 +371,17 @@ BEGIN IF item_object.age_protect IS NOT NULL THEN SELECT INTO age_protect_object * FROM config.rule_age_hold_protect WHERE id = item_object.age_protect; - - IF item_object.create_date + age_protect_object.age > NOW() THEN + IF hold_test.distance_is_from_owner THEN + SELECT INTO use_active_date value FROM actor.org_unit_ancestor_setting('circ.holds.age_protect.active_date', item_cn_object.owning_lib); + ELSE + SELECT INTO use_active_date value FROM actor.org_unit_ancestor_setting('circ.holds.age_protect.active_date', item_object.circ_lib); + END IF; + IF use_active_date = 'true' THEN + age_protect_date := COALESCE(item_object.active_date, NOW()); + ELSE + age_protect_date := item_object.create_date; + END IF; + IF age_protect_date + age_protect_object.age > NOW() THEN IF hold_test.distance_is_from_owner THEN SELECT INTO item_cn_object * FROM asset.call_number WHERE id = item_object.call_number; SELECT INTO hold_transit_prox prox FROM actor.org_unit_proximity WHERE from_org = item_cn_object.owning_lib AND to_org = pickup_ou; diff --git a/Open-ILS/src/sql/Pg/210.schema.serials.sql b/Open-ILS/src/sql/Pg/210.schema.serials.sql index 9b884b6b61..29617cd968 100644 --- a/Open-ILS/src/sql/Pg/210.schema.serials.sql +++ b/Open-ILS/src/sql/Pg/210.schema.serials.sql @@ -230,6 +230,11 @@ CREATE TRIGGER sunit_status_changed_trig BEFORE UPDATE ON serial.unit FOR EACH ROW EXECUTE PROCEDURE asset.acp_status_changed(); +-- ditto +CREATE TRIGGER sunit_created_trig + BEFORE INSERT ON serial.unit + FOR EACH ROW EXECUTE PROCEDURE asset.acp_created(); + CREATE TABLE serial.item ( id SERIAL PRIMARY KEY, creator INT NOT NULL diff --git a/Open-ILS/src/sql/Pg/950.data.seed-values.sql b/Open-ILS/src/sql/Pg/950.data.seed-values.sql index 35651d2aba..8dd539cec6 100644 --- a/Open-ILS/src/sql/Pg/950.data.seed-values.sql +++ b/Open-ILS/src/sql/Pg/950.data.seed-values.sql @@ -215,22 +215,22 @@ INSERT INTO config.rule_age_hold_protect VALUES (2, oils_i18n_gettext(2, '6month', 'crahp', 'name'), '6 months', 2); SELECT SETVAL('config.rule_age_hold_protect_id_seq'::TEXT, 100); -INSERT INTO config.copy_status (id,name,holdable,opac_visible) VALUES (0,oils_i18n_gettext(0, 'Available', 'ccs', 'name'),'t','t'); -INSERT INTO config.copy_status (id,name,holdable,opac_visible) VALUES (1,oils_i18n_gettext(1, 'Checked out', 'ccs', 'name'),'t','t'); +INSERT INTO config.copy_status (id,name,holdable,opac_visible,copy_active) VALUES (0,oils_i18n_gettext(0, 'Available', 'ccs', 'name'),'t','t','t'); +INSERT INTO config.copy_status (id,name,holdable,opac_visible,copy_active) VALUES (1,oils_i18n_gettext(1, 'Checked out', 'ccs', 'name'),'t','t','t'); INSERT INTO config.copy_status (id,name) VALUES (2,oils_i18n_gettext(2, 'Bindery', 'ccs', 'name')); INSERT INTO config.copy_status (id,name) VALUES (3,oils_i18n_gettext(3, 'Lost', 'ccs', 'name')); INSERT INTO config.copy_status (id,name) VALUES (4,oils_i18n_gettext(4, 'Missing', 'ccs', 'name')); INSERT INTO config.copy_status (id,name,holdable,opac_visible) VALUES (5,oils_i18n_gettext(5, 'In process', 'ccs', 'name'),'t','t'); INSERT INTO config.copy_status (id,name,holdable,opac_visible) VALUES (6,oils_i18n_gettext(6, 'In transit', 'ccs', 'name'),'t','t'); -INSERT INTO config.copy_status (id,name,holdable,opac_visible) VALUES (7,oils_i18n_gettext(7, 'Reshelving', 'ccs', 'name'),'t','t'); -INSERT INTO config.copy_status (id,name,holdable,opac_visible) VALUES (8,oils_i18n_gettext(8, 'On holds shelf', 'ccs', 'name'),'t','t'); +INSERT INTO config.copy_status (id,name,holdable,opac_visible,copy_active) VALUES (7,oils_i18n_gettext(7, 'Reshelving', 'ccs', 'name'),'t','t','t'); +INSERT INTO config.copy_status (id,name,holdable,opac_visible,copy_active) VALUES (8,oils_i18n_gettext(8, 'On holds shelf', 'ccs', 'name'),'t','t','t'); INSERT INTO config.copy_status (id,name,holdable,opac_visible) VALUES (9,oils_i18n_gettext(9, 'On order', 'ccs', 'name'),'t','t'); -INSERT INTO config.copy_status (id,name) VALUES (10,oils_i18n_gettext(10, 'ILL', 'ccs', 'name')); +INSERT INTO config.copy_status (id,name,copy_active) VALUES (10,oils_i18n_gettext(10, 'ILL', 'ccs', 'name'),'t'); INSERT INTO config.copy_status (id,name) VALUES (11,oils_i18n_gettext(11, 'Cataloging', 'ccs', 'name')); -INSERT INTO config.copy_status (id,name,opac_visible) VALUES (12,oils_i18n_gettext(12, 'Reserves', 'ccs', 'name'),'t'); +INSERT INTO config.copy_status (id,name,opac_visible,copy_active) VALUES (12,oils_i18n_gettext(12, 'Reserves', 'ccs', 'name'),'t','t'); INSERT INTO config.copy_status (id,name) VALUES (13,oils_i18n_gettext(13, 'Discard/Weed', 'ccs', 'name')); INSERT INTO config.copy_status (id,name) VALUES (14,oils_i18n_gettext(14, 'Damaged', 'ccs', 'name')); -INSERT INTO config.copy_status (id,name) VALUES (15,oils_i18n_gettext(15, 'On reservation shelf', 'ccs', 'name')); +INSERT INTO config.copy_status (id,name,copy_active) VALUES (15,oils_i18n_gettext(15, 'On reservation shelf', 'ccs', 'name'),'t'); SELECT SETVAL('config.copy_status_id_seq'::TEXT, 100); @@ -2278,20 +2278,20 @@ INSERT INTO asset.call_number VALUES (-1,1,NOW(),1,NOW(),-1,1,'UNCATALOGED'); -- circ matrix INSERT INTO config.circ_matrix_matchpoint (org_unit,grp,circulate,duration_rule,recurring_fine_rule,max_fine_rule) VALUES (1,1,true,11,1,1); -INSERT INTO config.circ_matrix_weights(name, org_unit, grp, circ_modifier, marc_type, marc_form, marc_bib_level, marc_vr_format, copy_circ_lib, copy_owning_lib, user_home_ou, ref_flag, juvenile_flag, is_renewal, usr_age_upper_bound, usr_age_lower_bound) VALUES - ('Default', 10.0, 11.0, 5.0, 4.0, 3.0, 2.0, 2.0, 8.0, 8.0, 8.0, 1.0, 6.0, 7.0, 0.0, 0.0), - ('Org_Unit_First', 11.0, 10.0, 5.0, 4.0, 3.0, 2.0, 2.0, 8.0, 8.0, 8.0, 1.0, 6.0, 7.0, 0.0, 0.0), - ('Item_Owner_First', 8.0, 8.0, 5.0, 4.0, 3.0, 2.0, 2.0, 10.0, 11.0, 8.0, 1.0, 6.0, 7.0, 0.0, 0.0), - ('All_Equal', 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0); +INSERT INTO config.circ_matrix_weights(name, org_unit, grp, circ_modifier, marc_type, marc_form, marc_bib_level, marc_vr_format, copy_circ_lib, copy_owning_lib, user_home_ou, ref_flag, juvenile_flag, is_renewal, usr_age_upper_bound, usr_age_lower_bound, item_age) VALUES + ('Default', 10.0, 11.0, 5.0, 4.0, 3.0, 2.0, 2.0, 8.0, 8.0, 8.0, 1.0, 6.0, 7.0, 0.0, 0.0, 0.0), + ('Org_Unit_First', 11.0, 10.0, 5.0, 4.0, 3.0, 2.0, 2.0, 8.0, 8.0, 8.0, 1.0, 6.0, 7.0, 0.0, 0.0, 0.0), + ('Item_Owner_First', 8.0, 8.0, 5.0, 4.0, 3.0, 2.0, 2.0, 10.0, 11.0, 8.0, 1.0, 6.0, 7.0, 0.0, 0.0, 0.0), + ('All_Equal', 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0); -- hold matrix - 110.hold_matrix.sql: INSERT INTO config.hold_matrix_matchpoint (requestor_grp) VALUES (1); -INSERT INTO config.hold_matrix_weights(name, user_home_ou, request_ou, pickup_ou, item_owning_ou, item_circ_ou, usr_grp, requestor_grp, circ_modifier, marc_type, marc_form, marc_bib_level, marc_vr_format, juvenile_flag, ref_flag) VALUES - ('Default', 5.0, 5.0, 5.0, 5.0, 5.0, 7.0, 8.0, 4.0, 3.0, 2.0, 1.0, 1.0, 4.0, 0.0), - ('Item_Owner_First', 5.0, 5.0, 5.0, 8.0, 7.0, 5.0, 5.0, 4.0, 3.0, 2.0, 1.0, 1.0, 4.0, 0.0), - ('User_Before_Requestor', 5.0, 5.0, 5.0, 5.0, 5.0, 8.0, 7.0, 4.0, 3.0, 2.0, 1.0, 1.0, 4.0, 0.0), - ('All_Equal', 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0); +INSERT INTO config.hold_matrix_weights(name, user_home_ou, request_ou, pickup_ou, item_owning_ou, item_circ_ou, usr_grp, requestor_grp, circ_modifier, marc_type, marc_form, marc_bib_level, marc_vr_format, juvenile_flag, ref_flag, item_age) VALUES + ('Default', 5.0, 5.0, 5.0, 5.0, 5.0, 7.0, 8.0, 4.0, 3.0, 2.0, 1.0, 1.0, 4.0, 0.0, 0.0), + ('Item_Owner_First', 5.0, 5.0, 5.0, 8.0, 7.0, 5.0, 5.0, 4.0, 3.0, 2.0, 1.0, 1.0, 4.0, 0.0, 0.0), + ('User_Before_Requestor', 5.0, 5.0, 5.0, 5.0, 5.0, 8.0, 7.0, 4.0, 3.0, 2.0, 1.0, 1.0, 4.0, 0.0, 0.0), + ('All_Equal', 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0); -- dynamic weight associations INSERT INTO config.weight_assoc(active, org_unit, circ_weights, hold_weights) VALUES @@ -2427,6 +2427,11 @@ INSERT into config.org_unit_setting_type oils_i18n_gettext('circ.holds.min_estimated_wait_interval', 'When predicting the amount of time a patron will be waiting for a hold to be fulfilled, this is the minimum estimated length of time to assume an item will be checked out. Examples: "2 weeks", "5 days"', 'coust', 'description'), 'interval'), +( 'circ.holds.age_protect.active_date', + oils_i18n_gettext('circ.holds.age_protect.active_date', 'Holds: Use Active Date for Age Protection', 'coust', 'label'), + oils_i18n_gettext('circ.holds.age_protect.active_date', 'When calculating age protection rules use the active date instead of the creation date.', 'coust', 'description'), + 'bool'), + ( 'circ.selfcheck.patron_login_timeout', oils_i18n_gettext('circ.selfcheck.patron_login_timeout', 'Selfcheck: Patron Login Timeout (in seconds)', 'coust', 'label'), oils_i18n_gettext('circ.selfcheck.patron_login_timeout', 'Number of seconds of inactivity before the patron is logged out of the selfcheck interface', 'coust', 'description'), diff --git a/Open-ILS/web/conify/global/config/copy_status.html b/Open-ILS/web/conify/global/config/copy_status.html index 943fd24cbf..262eaf21c9 100644 --- a/Open-ILS/web/conify/global/config/copy_status.html +++ b/Open-ILS/web/conify/global/config/copy_status.html @@ -82,6 +82,8 @@ if (attr == 'opac_visible' && typeof n != 'string') this.setValue(item, 'opac_visible', n ? 't' : 'f'); + if (attr == 'copy_active' && typeof n != 'string') + this.setValue(item, 'copy_active', n ? 't' : 'f'); }; dojo.addOnUnload( function (event) { @@ -212,6 +214,18 @@ return false; } } + }, + { name : ccs_strings.COPY_ACTIVE, + field : "copy_active", + editor : dojox.grid.editors.bool, + get : function (row) { + var r = window.status_data_model.getRow(row); + if (r) { + var h = r.copy_active; + if (h == 't' || h === true) return true; + return false; + } + } } ] ] diff --git a/Open-ILS/web/js/dojo/openils/conify/nls/conify.js b/Open-ILS/web/js/dojo/openils/conify/nls/conify.js index 363d21dbdf..c482bb6b1e 100644 --- a/Open-ILS/web/js/dojo/openils/conify/nls/conify.js +++ b/Open-ILS/web/js/dojo/openils/conify/nls/conify.js @@ -6,6 +6,7 @@ "CONFIRM_EXIT_PGT": "There are unsaved modified permission maps. Click OK to save these changes, or Cancel to abandon them.", "CONFIRM_EXIT_PPL": "There are unsaved modified permissions. Click OK to save these changes, or Cancel to abandon them.", "CONFIRM_UNSAVED_CHANGES": "There are unsaved changes to one or more organization types. Click OK to save these changes, or Cancel to abandon them.", + "COPY_ACTIVE": "Sets copy active", "ERROR_CALLING_METHOD_AOUT": "Problem calling method to create child organization type", "ERROR_CALLING_METHOD_CAM": "Problem calling method to create new ${0}", "ERROR_CALLING_METHOD_CCS": "Problem calling method to create new copy status", diff --git a/Open-ILS/web/opac/locale/en-US/lang.dtd b/Open-ILS/web/opac/locale/en-US/lang.dtd index 893059a8e9..67c73b2a6c 100644 --- a/Open-ILS/web/opac/locale/en-US/lang.dtd +++ b/Open-ILS/web/opac/locale/en-US/lang.dtd @@ -246,6 +246,7 @@ + @@ -2687,6 +2688,7 @@ + @@ -3487,6 +3489,7 @@ + diff --git a/Open-ILS/web/opac/locale/en-US/opac.dtd b/Open-ILS/web/opac/locale/en-US/opac.dtd index 8203ce489e..cac50e0643 100644 --- a/Open-ILS/web/opac/locale/en-US/opac.dtd +++ b/Open-ILS/web/opac/locale/en-US/opac.dtd @@ -494,6 +494,7 @@ Please see a librarian to renew your account."> + diff --git a/Open-ILS/web/opac/skin/craftsman/xml/rdetail/rdetail_cn_details.xml b/Open-ILS/web/opac/skin/craftsman/xml/rdetail/rdetail_cn_details.xml index 116f1fb5b5..6dc5120f78 100644 --- a/Open-ILS/web/opac/skin/craftsman/xml/rdetail/rdetail_cn_details.xml +++ b/Open-ILS/web/opac/skin/craftsman/xml/rdetail/rdetail_cn_details.xml @@ -15,6 +15,7 @@ &rdetail.cn.location; &rdetail.cn.hold.age; &rdetail.cn.genesis; + &rdetail.cn.active; &rdetail.cn.holdable; &rdetail.cn.due; @@ -33,6 +34,7 @@ &rdetail.cn.disabled; + diff --git a/Open-ILS/web/opac/skin/default/js/copy_details.js b/Open-ILS/web/opac/skin/default/js/copy_details.js index c4c623ae09..253e671fd2 100644 --- a/Open-ILS/web/opac/skin/default/js/copy_details.js +++ b/Open-ILS/web/opac/skin/default/js/copy_details.js @@ -31,6 +31,7 @@ function cpdBuild( contextTbody, contextRow, record, callnumber, orgid, depth, c /* unhide before we unhide/clone the parent */ unHideMe($n(templateRow, 'age_protect_label')); unHideMe($n(templateRow, 'create_date_label')); + unHideMe($n(templateRow, 'active_date_label')); unHideMe($n(templateRow, 'holdable_label')); } @@ -205,6 +206,7 @@ function cpdDrawCopies(r) { /* unhide before we unhide/clone the parent */ unHideMe($n(copyrow, 'age_protect_value')); unHideMe($n(copyrow, 'create_date_value')); + unHideMe($n(copyrow, 'active_date_value')); unHideMe($n(copyrow, 'copy_holdable_td')); } @@ -343,6 +345,12 @@ function cpdDrawCopy(r) { cd = cd.replace(/T.*/, ''); $n(row, 'create_date_value').appendChild(text(cd)); + var ad = copy.active_date(); + if(ad) { + ad = ad.replace(/T.*/, ''); + $n(row, 'active_date_value').appendChild(text(ad)); + } + var yes = $('rdetail.yes').innerHTML; var no = $('rdetail.no').innerHTML; diff --git a/Open-ILS/web/opac/skin/default/xml/rdetail/rdetail_cn_details.xml b/Open-ILS/web/opac/skin/default/xml/rdetail/rdetail_cn_details.xml index f937089394..d443b9f9a6 100644 --- a/Open-ILS/web/opac/skin/default/xml/rdetail/rdetail_cn_details.xml +++ b/Open-ILS/web/opac/skin/default/xml/rdetail/rdetail_cn_details.xml @@ -16,6 +16,7 @@ &rdetail.cn.part; &rdetail.cn.hold.age; &rdetail.cn.genesis; + &rdetail.cn.active; &rdetail.cn.holdable; &rdetail.cn.due; @@ -41,6 +42,7 @@ &rdetail.cn.disabled; + diff --git a/Open-ILS/web/templates/default/conify/global/config/circ_matrix_matchpoint.tt2 b/Open-ILS/web/templates/default/conify/global/config/circ_matrix_matchpoint.tt2 index bd19e7ee64..e3725a25ce 100644 --- a/Open-ILS/web/templates/default/conify/global/config/circ_matrix_matchpoint.tt2 +++ b/Open-ILS/web/templates/default/conify/global/config/circ_matrix_matchpoint.tt2 @@ -9,7 +9,7 @@ - -