output NUMERIC(8,2);
BEGIN
FOR output IN
- EXECUTE 'SELECT ' || quote_literal(REPLACE(attempt_value,'$','')) || '::NUMERIC(8,2) AS a;'
+ EXECUTE 'SELECT ' || quote_literal(REPLACE(REPLACE(attempt_value,'$',''),',','')) || '::NUMERIC(8,2) AS a;'
LOOP
RETURN output;
END LOOP;
output NUMERIC(6,2);
BEGIN
FOR output IN
- EXECUTE 'SELECT ' || quote_literal(REPLACE(attempt_value,'$','')) || '::NUMERIC(6,2) AS a;'
+ EXECUTE 'SELECT ' || quote_literal(REPLACE(REPLACE(attempt_value,'$',''),',','')) || '::NUMERIC(6,2) AS a;'
LOOP
RETURN output;
END LOOP;
$$ LANGUAGE plpgsql;
+CREATE OR REPLACE FUNCTION migration_tools.apply_circ_matrix_to_specific_circ( tablename TEXT, circ BIGINT ) RETURNS VOID AS $$
+
+-- Usage:
+--
+-- First make sure the circ matrix is loaded and the circulations
+-- have been staged to the extent possible (but at the very least
+-- circ_lib, target_copy, usr, and *_renewal). User profiles and
+-- circ modifiers must also be in place.
+--
+-- SELECT migration_tools.apply_circ_matrix_to_specific_circ('m_nwrl.action_circulation', 18391960);
+--
+
+DECLARE
+ circ_lib INT;
+ target_copy INT;
+ usr INT;
+ is_renewal BOOLEAN;
+ this_duration_rule INT;
+ this_fine_rule INT;
+ this_max_fine_rule INT;
+ rcd config.rule_circ_duration%ROWTYPE;
+ rrf config.rule_recurring_fine%ROWTYPE;
+ rmf config.rule_max_fine%ROWTYPE;
+ n INT := 0;
+ n_circs INT := 1;
+
+BEGIN
+
+ --EXECUTE 'SELECT COUNT(*) FROM ' || tablename || ';' INTO n_circs;
+
+ --FOR circ IN EXECUTE ('SELECT id FROM ' || tablename) LOOP
+
+ -- Fetch the correct rules for this circulation
+ EXECUTE ('
+ SELECT
+ circ_lib,
+ target_copy,
+ usr,
+ CASE
+ WHEN phone_renewal OR desk_renewal OR opac_renewal THEN TRUE
+ ELSE FALSE
+ END
+ FROM ' || tablename || ' WHERE id = ' || circ || ';')
+ INTO circ_lib, target_copy, usr, is_renewal ;
+ SELECT
+ INTO this_duration_rule,
+ this_fine_rule,
+ this_max_fine_rule
+ (matchpoint).duration_rule,
+ (matchpoint).recurring_fine_rule,
+ (matchpoint).max_fine_rule
+ FROM action.find_circ_matrix_matchpoint(
+ circ_lib,
+ target_copy,
+ usr,
+ is_renewal
+ );
+ SELECT INTO rcd * FROM config.rule_circ_duration
+ WHERE id = this_duration_rule;
+ SELECT INTO rrf * FROM config.rule_recurring_fine
+ WHERE id = this_fine_rule;
+ SELECT INTO rmf * FROM config.rule_max_fine
+ WHERE id = this_max_fine_rule;
+
+ -- Apply the rules to this circulation
+ EXECUTE ('UPDATE ' || tablename || ' c
+ SET
+ duration_rule = rcd.name,
+ recurring_fine_rule = rrf.name,
+ max_fine_rule = rmf.name,
+ duration = rcd.normal,
+ recurring_fine = rrf.normal,
+ max_fine =
+ CASE rmf.is_percent
+ WHEN TRUE THEN (rmf.amount / 100.0) * ac.price
+ ELSE rmf.amount
+ END,
+ renewal_remaining = rcd.max_renewals,
+ grace_period = rrf.grace_period
+ FROM
+ config.rule_circ_duration rcd,
+ config.rule_recurring_fine rrf,
+ config.rule_max_fine rmf,
+ asset.copy ac
+ WHERE
+ rcd.id = ' || this_duration_rule || ' AND
+ rrf.id = ' || this_fine_rule || ' AND
+ rmf.id = ' || this_max_fine_rule || ' AND
+ ac.id = c.target_copy AND
+ c.id = ' || circ || ';');
+
+ -- Keep track of where we are in the process
+ n := n + 1;
+ IF (n % 100 = 0) THEN
+ RAISE INFO '%', n || ' of ' || n_circs
+ || ' (' || (100*n/n_circs) || '%) circs updated.';
+ END IF;
+
+ --END LOOP;
+
+ RETURN;
+END;
+
+$$ LANGUAGE plpgsql;
+
END
$func$
LANGUAGE PLPGSQL;
+
+-- example: SELECT * FROM migration_tools.duplicate_template(5,'{3,4}');
+CREATE OR REPLACE FUNCTION migration_tools.duplicate_template (INTEGER, INTEGER[]) RETURNS VOID AS $$
+ DECLARE
+ target_event_def ALIAS FOR $1;
+ orgs ALIAS FOR $2;
+ BEGIN
+ DROP TABLE IF EXISTS new_atevdefs;
+ CREATE TEMP TABLE new_atevdefs (atevdef INTEGER);
+ FOR i IN array_lower(orgs,1) .. array_upper(orgs,1) LOOP
+ INSERT INTO action_trigger.event_definition (
+ active
+ ,owner
+ ,name
+ ,hook
+ ,validator
+ ,reactor
+ ,cleanup_success
+ ,cleanup_failure
+ ,delay
+ ,max_delay
+ ,usr_field
+ ,opt_in_setting
+ ,delay_field
+ ,group_field
+ ,template
+ ,granularity
+ ,repeat_delay
+ ) SELECT
+ 'f'
+ ,orgs[i]
+ ,name || ' (clone of '||target_event_def||')'
+ ,hook
+ ,validator
+ ,reactor
+ ,cleanup_success
+ ,cleanup_failure
+ ,delay
+ ,max_delay
+ ,usr_field
+ ,opt_in_setting
+ ,delay_field
+ ,group_field
+ ,template
+ ,granularity
+ ,repeat_delay
+ FROM
+ action_trigger.event_definition
+ WHERE
+ id = target_event_def
+ ;
+ RAISE INFO 'created atevdef with id = %', currval('action_trigger.event_definition_id_seq');
+ INSERT INTO new_atevdefs SELECT currval('action_trigger.event_definition_id_seq');
+ INSERT INTO action_trigger.environment (
+ event_def
+ ,path
+ ,collector
+ ,label
+ ) SELECT
+ currval('action_trigger.event_definition_id_seq')
+ ,path
+ ,collector
+ ,label
+ FROM
+ action_trigger.environment
+ WHERE
+ event_def = target_event_def
+ ;
+ INSERT INTO action_trigger.event_params (
+ event_def
+ ,param
+ ,value
+ ) SELECT
+ currval('action_trigger.event_definition_id_seq')
+ ,param
+ ,value
+ FROM
+ action_trigger.event_params
+ WHERE
+ event_def = target_event_def
+ ;
+ END LOOP;
+ RAISE INFO '-- UPDATE action_trigger.event_definition SET active = CASE WHEN id = % THEN FALSE ELSE TRUE END WHERE id in (%,%);', target_event_def, target_event_def, (SELECT array_to_string(array_agg(atevdef),',') from new_atevdefs);
+ END;
+$$ LANGUAGE PLPGSQL STRICT VOLATILE;
+
+CREATE OR REPLACE FUNCTION migration_tools.get_marc_tag (TEXT, TEXT, TEXT, TEXT) RETURNS TEXT AS $$
+ my ($marcxml, $tag, $subfield, $delimiter) = @_;
+
+ use MARC::Record;
+ use MARC::File::XML;
+ use MARC::Field;
+
+ my $field;
+ eval {
+ my $marc = MARC::Record->new_from_xml($marcxml, 'UTF-8');
+ $field = $marc->field($tag);
+ };
+ return $field->as_string($subfield,$delimiter);
+$$ LANGUAGE PLPERLU STABLE;
+
+CREATE OR REPLACE FUNCTION migration_tools.get_marc_tags (TEXT, TEXT, TEXT, TEXT) RETURNS TEXT[] AS $$
+ my ($marcxml, $tag, $subfield, $delimiter) = @_;
+
+ use MARC::Record;
+ use MARC::File::XML;
+ use MARC::Field;
+
+ my @fields;
+ eval {
+ my $marc = MARC::Record->new_from_xml($marcxml, 'UTF-8');
+ @fields = $marc->field($tag);
+ };
+ my @texts;
+ foreach my $field (@fields) {
+ push @texts, $field->as_string($subfield,$delimiter);
+ }
+ return \@texts;
+$$ LANGUAGE PLPERLU STABLE;
+