LP#820006: Action trigger notices fixes
[working/Evergreen.git] / Open-ILS / src / sql / Pg / version-upgrade / 1.6.1-2.0-upgrade-db.sql
1 -- Before starting the transaction: drop some constraints that
2 -- may or may not exist.
3
4 CREATE OR REPLACE FUNCTION oils_text_as_bytea (TEXT) RETURNS BYTEA AS $_$
5     SELECT CAST(REGEXP_REPLACE(UPPER($1), $$\\$$, $$\\\\$$, 'g') AS BYTEA);
6 $_$ LANGUAGE SQL IMMUTABLE;
7
8 DROP INDEX asset.asset_call_number_upper_label_id_owning_lib_idx;
9 CREATE INDEX asset_call_number_upper_label_id_owning_lib_idx ON asset.call_number (oils_text_as_bytea(label),id,owning_lib);
10
11 \qecho Before starting the transaction: drop some constraints.
12 \qecho If a DROP fails because the constraint doesn't exist, ignore the failure.
13
14 -- ARG! VIM! '
15
16 ALTER TABLE permission.grp_perm_map        DROP CONSTRAINT grp_perm_map_perm_fkey;
17 ALTER TABLE permission.usr_perm_map        DROP CONSTRAINT usr_perm_map_perm_fkey;
18 ALTER TABLE permission.usr_object_perm_map DROP CONSTRAINT usr_object_perm_map_perm_fkey;
19 ALTER TABLE booking.resource_type          DROP CONSTRAINT brt_name_or_record_once_per_owner;
20 ALTER TABLE booking.resource_type          DROP CONSTRAINT brt_name_once_per_owner;
21
22 \qecho Before starting the transaction: create seed data for the asset.uri table
23 \qecho If the INSERT fails because the -1 value already exists, ignore the failure.
24 INSERT INTO asset.uri (id, href, active) VALUES (-1, 'http://example.com/fake', FALSE);
25
26 \qecho Beginning the transaction now
27
28 BEGIN;
29
30 UPDATE biblio.record_entry SET marc = '<record xmlns="http://www.loc.gov/MARC21/slim"/>' WHERE id = -1;
31
32 -- Highest-numbered individual upgrade script incorporated herein:
33
34 INSERT INTO config.upgrade_log (version) VALUES ('0475');
35
36 -- Push the auri sequence in case it's out of date
37 -- Add 2 as the sequence value must be 1 or higher, and seed is -1
38 SELECT SETVAL('asset.uri_id_seq'::TEXT, (SELECT MAX(id) + 2 FROM asset.uri));
39
40 -- Remove some uses of the connectby() function from the tablefunc contrib module
41 CREATE OR REPLACE FUNCTION actor.org_unit_descendants( INT, INT ) RETURNS SETOF actor.org_unit AS $$
42     WITH RECURSIVE descendant_depth AS (
43         SELECT  ou.id,
44                 ou.parent_ou,
45                 out.depth
46           FROM  actor.org_unit ou
47                 JOIN actor.org_unit_type out ON (out.id = ou.ou_type)
48                 JOIN anscestor_depth ad ON (ad.id = ou.id)
49           WHERE ad.depth = $2
50             UNION ALL
51         SELECT  ou.id,
52                 ou.parent_ou,
53                 out.depth
54           FROM  actor.org_unit ou
55                 JOIN actor.org_unit_type out ON (out.id = ou.ou_type)
56                 JOIN descendant_depth ot ON (ot.id = ou.parent_ou)
57     ), anscestor_depth AS (
58         SELECT  ou.id,
59                 ou.parent_ou,
60                 out.depth
61           FROM  actor.org_unit ou
62                 JOIN actor.org_unit_type out ON (out.id = ou.ou_type)
63           WHERE ou.id = $1
64             UNION ALL
65         SELECT  ou.id,
66                 ou.parent_ou,
67                 out.depth
68           FROM  actor.org_unit ou
69                 JOIN actor.org_unit_type out ON (out.id = ou.ou_type)
70                 JOIN anscestor_depth ot ON (ot.parent_ou = ou.id)
71     ) SELECT ou.* FROM actor.org_unit ou JOIN descendant_depth USING (id);
72 $$ LANGUAGE SQL;
73
74 CREATE OR REPLACE FUNCTION actor.org_unit_descendants( INT ) RETURNS SETOF actor.org_unit AS $$
75     WITH RECURSIVE descendant_depth AS (
76         SELECT  ou.id,
77                 ou.parent_ou,
78                 out.depth
79           FROM  actor.org_unit ou
80                 JOIN actor.org_unit_type out ON (out.id = ou.ou_type)
81           WHERE ou.id = $1
82             UNION ALL
83         SELECT  ou.id,
84                 ou.parent_ou,
85                 out.depth
86           FROM  actor.org_unit ou
87                 JOIN actor.org_unit_type out ON (out.id = ou.ou_type)
88                 JOIN descendant_depth ot ON (ot.id = ou.parent_ou)
89     ) SELECT ou.* FROM actor.org_unit ou JOIN descendant_depth USING (id);
90 $$ LANGUAGE SQL;
91
92 CREATE OR REPLACE FUNCTION actor.org_unit_ancestors( INT ) RETURNS SETOF actor.org_unit AS $$
93     WITH RECURSIVE anscestor_depth AS (
94         SELECT  ou.id,
95                 ou.parent_ou
96           FROM  actor.org_unit ou
97           WHERE ou.id = $1
98             UNION ALL
99         SELECT  ou.id,
100                 ou.parent_ou
101           FROM  actor.org_unit ou
102                 JOIN anscestor_depth ot ON (ot.parent_ou = ou.id)
103     ) SELECT ou.* FROM actor.org_unit ou JOIN anscestor_depth USING (id);
104 $$ LANGUAGE SQL;
105
106 -- Support merge template buckets
107 INSERT INTO container.biblio_record_entry_bucket_type (code,label) VALUES ('template_merge','Template Merge Container');
108
109 -- Recreate one of the constraints that we just dropped,
110 -- under a different name:
111
112 ALTER TABLE booking.resource_type
113         ALTER COLUMN record TYPE BIGINT;
114
115 ALTER TABLE booking.resource_type
116         ADD CONSTRAINT brt_name_and_record_once_per_owner UNIQUE(owner, name, record);
117
118 -- Now upgrade permission.perm_list.  This is fairly complicated.
119
120 -- Add ON UPDATE CASCADE to some foreign keys so that, when we renumber the
121 -- permissions, the dependents will follow and stay in sync:
122
123 ALTER TABLE permission.grp_perm_map ADD CONSTRAINT grp_perm_map_perm_fkey FOREIGN KEY (perm)
124     REFERENCES permission.perm_list (id) ON UPDATE CASCADE ON DELETE RESTRICT DEFERRABLE INITIALLY DEFERRED;
125
126 ALTER TABLE permission.usr_perm_map ADD CONSTRAINT usr_perm_map_perm_fkey FOREIGN KEY (perm)
127     REFERENCES permission.perm_list (id) ON UPDATE CASCADE ON DELETE RESTRICT DEFERRABLE INITIALLY DEFERRED;
128
129 ALTER TABLE permission.usr_object_perm_map ADD CONSTRAINT usr_object_perm_map_perm_fkey FOREIGN KEY (perm)
130     REFERENCES permission.perm_list (id) ON UPDATE CASCADE ON DELETE RESTRICT DEFERRABLE INITIALLY DEFERRED;
131
132 UPDATE permission.perm_list
133     SET code = 'UPDATE_ORG_UNIT_SETTING.credit.payments.allow'
134     WHERE code = 'UPDATE_ORG_UNIT_SETTING.global.credit.allow';
135
136 -- The following UPDATES were originally in an individual upgrade script, but should
137 -- no longer be necessary now that the foreign key has an ON UPDATE CASCADE clause.
138 -- We retain the UPDATES here, commented out, as historical relics.
139
140 -- UPDATE permission.grp_perm_map SET perm = perm + 1000 WHERE perm NOT IN ( SELECT id FROM permission.perm_list );
141 -- UPDATE permission.usr_perm_map SET perm = perm + 1000 WHERE perm NOT IN ( SELECT id FROM permission.perm_list );
142
143 -- Spelling correction
144 UPDATE permission.perm_list SET code = 'ADMIN_RECURRING_FINE_RULE' WHERE code = 'ADMIN_RECURING_FINE_RULE';
145
146 -- Now we engage in a Great Renumbering of the permissions in permission.perm_list,
147 -- in order to clean up accumulated cruft.
148
149 -- The first step is to establish some triggers so that, when we change the id of a permission,
150 -- the associated translations are updated accordingly.
151
152 CREATE OR REPLACE FUNCTION oils_i18n_update_apply(old_ident TEXT, new_ident TEXT, hint TEXT) RETURNS VOID AS $_$
153 BEGIN
154
155     EXECUTE $$
156         UPDATE  config.i18n_core
157           SET   identity_value = $$ || quote_literal( new_ident ) || $$ 
158           WHERE fq_field LIKE '$$ || hint || $$.%' 
159                 AND identity_value = $$ || quote_literal( old_ident ) || $$;$$;
160
161     RETURN;
162
163 END;
164 $_$ LANGUAGE PLPGSQL;
165
166 CREATE OR REPLACE FUNCTION oils_i18n_id_tracking(/* hint */) RETURNS TRIGGER AS $_$
167 BEGIN
168     PERFORM oils_i18n_update_apply( OLD.id::TEXT, NEW.id::TEXT, TG_ARGV[0]::TEXT );
169     RETURN NEW;
170 END;
171 $_$ LANGUAGE PLPGSQL;
172
173 CREATE OR REPLACE FUNCTION oils_i18n_code_tracking(/* hint */) RETURNS TRIGGER AS $_$
174 BEGIN
175     PERFORM oils_i18n_update_apply( OLD.code::TEXT, NEW.code::TEXT, TG_ARGV[0]::TEXT );
176     RETURN NEW;
177 END;
178 $_$ LANGUAGE PLPGSQL;
179
180
181 CREATE TRIGGER maintain_perm_i18n_tgr
182     AFTER UPDATE ON permission.perm_list
183     FOR EACH ROW EXECUTE PROCEDURE oils_i18n_id_tracking('ppl');
184
185 -- Next, create a new table as a convenience for sloshing data back and forth,
186 -- and for recording which permission went where.  It looks just like
187 -- permission.perm_list, but with two extra columns: one for the old id, and one to
188 -- distinguish between predefined permissions and non-predefined permissions.
189
190 -- This table is, in effect, a temporary table, because we can drop it once the
191 -- upgrade is complete.  It is not technically temporary as far as PostgreSQL is
192 -- concerned, because we don't want it to disappear at the end of the session.
193 -- We keep it around so that we have a map showing the old id and the new id for
194 -- each permission.  However there is no IDL entry for it, nor is it defined
195 -- in the base sql files.
196
197 CREATE TABLE permission.temp_perm (
198         id          INT        PRIMARY KEY,
199         code        TEXT       UNIQUE,
200         description TEXT,
201         old_id      INT,
202         predefined  BOOL       NOT NULL DEFAULT TRUE
203 );
204
205 -- Populate the temp table with a definitive set of predefined permissions,
206 -- hard-coding the ids.
207
208 -- The first set of permissions is derived from the database, as loaded in a
209 -- loaded 1.6.1 database, plus a few changes previously applied in this upgrade
210 -- script.  The second set is derived from the IDL -- permissions that are referenced
211 -- in <permacrud> elements but not defined in the database.
212
213 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( -1, 'EVERYTHING',
214      '' );
215 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 1, 'OPAC_LOGIN',
216      'Allow a user to log in to the OPAC' );
217 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 2, 'STAFF_LOGIN',
218      'Allow a user to log in to the staff client' );
219 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 3, 'MR_HOLDS',
220      'Allow a user to create a metarecord holds' );
221 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 4, 'TITLE_HOLDS',
222      'Allow a user to place a hold at the title level' );
223 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 5, 'VOLUME_HOLDS',
224      'Allow a user to place a volume level hold' );
225 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 6, 'COPY_HOLDS',
226      'Allow a user to place a hold on a specific copy' );
227 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 7, 'REQUEST_HOLDS',
228      'Allow a user to create holds for another user (if true, we still check to make sure they have permission to make the type of hold they are requesting, for example, COPY_HOLDS)' );
229 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 8, 'REQUEST_HOLDS_OVERRIDE',
230      '* no longer applicable' );
231 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 9, 'VIEW_HOLD',
232      'Allow a user to view another user''s holds' );
233 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 10, 'DELETE_HOLDS',
234      '* no longer applicable' );
235 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 11, 'UPDATE_HOLD',
236      'Allow a user to update another user''s hold' );
237 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 12, 'RENEW_CIRC',
238      'Allow a user to renew items' );
239 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 13, 'VIEW_USER_FINES_SUMMARY',
240      'Allow a user to view bill details' );
241 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 14, 'VIEW_USER_TRANSACTIONS',
242      'Allow a user to see another user''s grocery or circulation transactions in the Bills Interface; duplicate of VIEW_TRANSACTION' );
243 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 15, 'UPDATE_MARC',
244      'Allow a user to edit a MARC record' );
245 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 16, 'CREATE_MARC',
246      'Allow a user to create new MARC records' );
247 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 17, 'IMPORT_MARC',
248      'Allow a user to import a MARC record via the Z39.50 interface' );
249 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 18, 'CREATE_VOLUME',
250      'Allow a user to create a volume' );
251 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 19, 'UPDATE_VOLUME',
252      'Allow a user to edit volumes - needed for merging records. This is a duplicate of VOLUME_UPDATE; user must have both permissions at appropriate level to merge records.' );
253 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 20, 'DELETE_VOLUME',
254      'Allow a user to delete a volume' );
255 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 21, 'CREATE_COPY',
256      'Allow a user to create a new copy object' );
257 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 22, 'UPDATE_COPY',
258      'Allow a user to edit a copy' );
259 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 23, 'DELETE_COPY',
260      'Allow a user to delete a copy' );
261 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 24, 'RENEW_HOLD_OVERRIDE',
262      'Allow a user to continue to renew an item even if it is required for a hold' );
263 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 25, 'CREATE_USER',
264      'Allow a user to create another user' );
265 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 26, 'UPDATE_USER',
266      'Allow a user to edit a user''s record' );
267 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 27, 'DELETE_USER',
268      'Allow a user to mark a user as deleted' );
269 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 28, 'VIEW_USER',
270      'Allow a user to view another user''s Patron Record' );
271 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 29, 'COPY_CHECKIN',
272      'Allow a user to check in a copy' );
273 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 30, 'CREATE_TRANSIT',
274      'Allow a user to place an item in transit' );
275 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 31, 'VIEW_PERMISSION',
276      'Allow a user to view user permissions within the user permissions editor' );
277 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 32, 'CHECKIN_BYPASS_HOLD_FULFILL',
278      '* no longer applicable' );
279 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 33, 'CREATE_PAYMENT',
280      'Allow a user to record payments in the Billing Interface' );
281 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 34, 'SET_CIRC_LOST',
282      'Allow a user to mark an item as ''lost''' );
283 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 35, 'SET_CIRC_MISSING',
284      'Allow a user to mark an item as ''missing''' );
285 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 36, 'SET_CIRC_CLAIMS_RETURNED',
286      'Allow a user to mark an item as ''claims returned''' );
287 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 37, 'CREATE_TRANSACTION',
288      'Allow a user to create a new billable transaction' );
289 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 38, 'VIEW_TRANSACTION',
290      'Allow a user may view another user''s transactions' );
291 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 39, 'CREATE_BILL',
292      'Allow a user to create a new bill on a transaction' );
293 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 40, 'VIEW_CONTAINER',
294      'Allow a user to view another user''s containers (buckets)' );
295 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 41, 'CREATE_CONTAINER',
296      'Allow a user to create a new container for another user' );
297 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 42, 'UPDATE_ORG_UNIT',
298      'Allow a user to change the settings for an organization unit' );
299 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 43, 'VIEW_CIRCULATIONS',
300      'Allow a user to see what another user has checked out' );
301 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 44, 'DELETE_CONTAINER',
302      'Allow a user to delete another user''s container' );
303 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 45, 'CREATE_CONTAINER_ITEM',
304      'Allow a user to create a container item for another user' );
305 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 46, 'CREATE_USER_GROUP_LINK',
306      'Allow a user to add other users to permission groups' );
307 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 47, 'REMOVE_USER_GROUP_LINK',
308      'Allow a user to remove other users from permission groups' );
309 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 48, 'VIEW_PERM_GROUPS',
310      'Allow a user to view other users'' permission groups' );
311 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 49, 'VIEW_PERMIT_CHECKOUT',
312      'Allow a user to determine whether another user can check out an item' );
313 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 50, 'UPDATE_BATCH_COPY',
314      'Allow a user to edit copies in batch' );
315 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 51, 'CREATE_PATRON_STAT_CAT',
316      'User may create a new patron statistical category' );
317 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 52, 'CREATE_COPY_STAT_CAT',
318      'User may create a copy statistical category' );
319 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 53, 'CREATE_PATRON_STAT_CAT_ENTRY',
320      'User may create an entry in a patron statistical category' );
321 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 54, 'CREATE_COPY_STAT_CAT_ENTRY',
322      'User may create an entry in a copy statistical category' );
323 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 55, 'UPDATE_PATRON_STAT_CAT',
324      'User may update a patron statistical category' );
325 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 56, 'UPDATE_COPY_STAT_CAT',
326      'User may update a copy statistical category' );
327 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 57, 'UPDATE_PATRON_STAT_CAT_ENTRY',
328      'User may update an entry in a patron statistical category' );
329 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 58, 'UPDATE_COPY_STAT_CAT_ENTRY',
330      'User may update an entry in a copy statistical category' );
331 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 59, 'CREATE_PATRON_STAT_CAT_ENTRY_MAP',
332      'User may link another user to an entry in a statistical category' );
333 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 60, 'CREATE_COPY_STAT_CAT_ENTRY_MAP',
334      'User may link a copy to an entry in a statistical category' );
335 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 61, 'DELETE_PATRON_STAT_CAT',
336      'User may delete a patron statistical category' );
337 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 62, 'DELETE_COPY_STAT_CAT',
338      'User may delete a copy statistical category' );
339 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 63, 'DELETE_PATRON_STAT_CAT_ENTRY',
340      'User may delete an entry from a patron statistical category' );
341 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 64, 'DELETE_COPY_STAT_CAT_ENTRY',
342      'User may delete an entry from a copy statistical category' );
343 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 65, 'DELETE_PATRON_STAT_CAT_ENTRY_MAP',
344      'User may delete a patron statistical category entry map' );
345 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 66, 'DELETE_COPY_STAT_CAT_ENTRY_MAP',
346      'User may delete a copy statistical category entry map' );
347 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 67, 'CREATE_NON_CAT_TYPE',
348      'Allow a user to create a new non-cataloged item type' );
349 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 68, 'UPDATE_NON_CAT_TYPE',
350      'Allow a user to update a non-cataloged item type' );
351 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 69, 'CREATE_IN_HOUSE_USE',
352      'Allow a user to create a new in-house-use ' );
353 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 70, 'COPY_CHECKOUT',
354      'Allow a user to check out a copy' );
355 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 71, 'CREATE_COPY_LOCATION',
356      'Allow a user to create a new copy location' );
357 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 72, 'UPDATE_COPY_LOCATION',
358      'Allow a user to update a copy location' );
359 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 73, 'DELETE_COPY_LOCATION',
360      'Allow a user to delete a copy location' );
361 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 74, 'CREATE_COPY_TRANSIT',
362      'Allow a user to create a transit_copy object for transiting a copy' );
363 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 75, 'COPY_TRANSIT_RECEIVE',
364      'Allow a user to close out a transit on a copy' );
365 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 76, 'VIEW_HOLD_PERMIT',
366      'Allow a user to see if another user has permission to place a hold on a given copy' );
367 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 77, 'VIEW_COPY_CHECKOUT_HISTORY',
368      'Allow a user to view which users have checked out a given copy' );
369 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 78, 'REMOTE_Z3950_QUERY',
370      'Allow a user to perform Z39.50 queries against remote servers' );
371 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 79, 'REGISTER_WORKSTATION',
372      'Allow a user to register a new workstation' );
373 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 80, 'VIEW_COPY_NOTES',
374      'Allow a user to view all notes attached to a copy' );
375 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 81, 'VIEW_VOLUME_NOTES',
376      'Allow a user to view all notes attached to a volume' );
377 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 82, 'VIEW_TITLE_NOTES',
378      'Allow a user to view all notes attached to a title' );
379 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 83, 'CREATE_COPY_NOTE',
380      'Allow a user to create a new copy note' );
381 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 84, 'CREATE_VOLUME_NOTE',
382      'Allow a user to create a new volume note' );
383 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 85, 'CREATE_TITLE_NOTE',
384      'Allow a user to create a new title note' );
385 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 86, 'DELETE_COPY_NOTE',
386      'Allow a user to delete another user''s copy notes' );
387 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 87, 'DELETE_VOLUME_NOTE',
388      'Allow a user to delete another user''s volume note' );
389 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 88, 'DELETE_TITLE_NOTE',
390      'Allow a user to delete another user''s title note' );
391 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 89, 'UPDATE_CONTAINER',
392      'Allow a user to update another user''s container' );
393 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 90, 'CREATE_MY_CONTAINER',
394      'Allow a user to create a container for themselves' );
395 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 91, 'VIEW_HOLD_NOTIFICATION',
396      'Allow a user to view notifications attached to a hold' );
397 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 92, 'CREATE_HOLD_NOTIFICATION',
398      'Allow a user to create new hold notifications' );
399 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 93, 'UPDATE_ORG_SETTING',
400      'Allow a user to update an organization unit setting' );
401 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 94, 'OFFLINE_UPLOAD',
402      'Allow a user to upload an offline script' );
403 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 95, 'OFFLINE_VIEW',
404      'Allow a user to view uploaded offline script information' );
405 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 96, 'OFFLINE_EXECUTE',
406      'Allow a user to execute an offline script batch' );
407 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 97, 'CIRC_OVERRIDE_DUE_DATE',
408      'Allow a user to change the due date on an item to any date' );
409 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 98, 'CIRC_PERMIT_OVERRIDE',
410      'Allow a user to bypass the circulation permit call for check out' );
411 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 99, 'COPY_IS_REFERENCE.override',
412      'Allow a user to override the copy_is_reference event' );
413 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 100, 'VOID_BILLING',
414      'Allow a user to void a bill' );
415 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 101, 'CIRC_CLAIMS_RETURNED.override',
416      'Allow a user to check in or check out an item that has a status of ''claims returned''' );
417 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 102, 'COPY_BAD_STATUS.override',
418      'Allow a user to check out an item in a non-circulatable status' );
419 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 103, 'COPY_ALERT_MESSAGE.override',
420      'Allow a user to check in/out an item that has an alert message' );
421 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 104, 'COPY_STATUS_LOST.override',
422      'Allow a user to remove the lost status from a copy' );
423 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 105, 'COPY_STATUS_MISSING.override',
424      'Allow a user to change the missing status on a copy' );
425 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 106, 'ABORT_TRANSIT',
426      'Allow a user to abort a copy transit if the user is at the transit destination or source' );
427 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 107, 'ABORT_REMOTE_TRANSIT',
428      'Allow a user to abort a copy transit if the user is not at the transit source or dest' );
429 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 108, 'VIEW_ZIP_DATA',
430      'Allow a user to query the ZIP code data method' );
431 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 109, 'CANCEL_HOLDS',
432      'Allow a user to cancel holds' );
433 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 110, 'CREATE_DUPLICATE_HOLDS',
434      'Allow a user to create duplicate holds (two or more holds on the same title)' );
435 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 111, 'actor.org_unit.closed_date.delete',
436      'Allow a user to remove a closed date interval for a given location' );
437 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 112, 'actor.org_unit.closed_date.update',
438      'Allow a user to update a closed date interval for a given location' );
439 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 113, 'actor.org_unit.closed_date.create',
440      'Allow a user to create a new closed date for a location' );
441 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 114, 'DELETE_NON_CAT_TYPE',
442      'Allow a user to delete a non cataloged type' );
443 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 115, 'money.collections_tracker.create',
444      'Allow a user to put someone into collections' );
445 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 116, 'money.collections_tracker.delete',
446      'Allow a user to remove someone from collections' );
447 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 117, 'BAR_PATRON',
448      'Allow a user to bar a patron' );
449 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 118, 'UNBAR_PATRON',
450      'Allow a user to un-bar a patron' );
451 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 119, 'DELETE_WORKSTATION',
452      'Allow a user to remove an existing workstation so a new one can replace it' );
453 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 120, 'group_application.user',
454      'Allow a user to add/remove users to/from the "User" group' );
455 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 121, 'group_application.user.patron',
456      'Allow a user to add/remove users to/from the "Patron" group' );
457 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 122, 'group_application.user.staff',
458      'Allow a user to add/remove users to/from the "Staff" group' );
459 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 123, 'group_application.user.staff.circ',
460      'Allow a user to add/remove users to/from the "Circulator" group' );
461 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 124, 'group_application.user.staff.cat',
462      'Allow a user to add/remove users to/from the "Cataloger" group' );
463 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 125, 'group_application.user.staff.admin.global_admin',
464      'Allow a user to add/remove users to/from the "GlobalAdmin" group' );
465 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 126, 'group_application.user.staff.admin.local_admin',
466      'Allow a user to add/remove users to/from the "LocalAdmin" group' );
467 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 127, 'group_application.user.staff.admin.lib_manager',
468      'Allow a user to add/remove users to/from the "LibraryManager" group' );
469 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 128, 'group_application.user.staff.cat.cat1',
470      'Allow a user to add/remove users to/from the "Cat1" group' );
471 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 129, 'group_application.user.staff.supercat',
472      'Allow a user to add/remove users to/from the "Supercat" group' );
473 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 130, 'group_application.user.sip_client',
474      'Allow a user to add/remove users to/from the "SIP-Client" group' );
475 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 131, 'group_application.user.vendor',
476      'Allow a user to add/remove users to/from the "Vendor" group' );
477 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 132, 'ITEM_AGE_PROTECTED.override',
478      'Allow a user to place a hold on an age-protected item' );
479 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 133, 'MAX_RENEWALS_REACHED.override',
480      'Allow a user to renew an item past the maximum renewal count' );
481 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 134, 'PATRON_EXCEEDS_CHECKOUT_COUNT.override',
482      'Allow staff to override checkout count failure' );
483 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 135, 'PATRON_EXCEEDS_OVERDUE_COUNT.override',
484      'Allow staff to override overdue count failure' );
485 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 136, 'PATRON_EXCEEDS_FINES.override',
486      'Allow staff to override fine amount checkout failure' );
487 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 137, 'CIRC_EXCEEDS_COPY_RANGE.override',
488      'Allow staff to override circulation copy range failure' );
489 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 138, 'ITEM_ON_HOLDS_SHELF.override',
490      'Allow staff to override item on holds shelf failure' );
491 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 139, 'COPY_NOT_AVAILABLE.override',
492      'Allow staff to force checkout of Missing/Lost type items' );
493 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 140, 'HOLD_EXISTS.override',
494      'Allow a user to place multiple holds on a single title' );
495 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 141, 'RUN_REPORTS',
496      'Allow a user to run reports' );
497 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 142, 'SHARE_REPORT_FOLDER',
498      'Allow a user to share report his own folders' );
499 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 143, 'VIEW_REPORT_OUTPUT',
500      'Allow a user to view report output' );
501 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 144, 'COPY_CIRC_NOT_ALLOWED.override',
502      'Allow a user to checkout an item that is marked as non-circ' );
503 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 145, 'DELETE_CONTAINER_ITEM',
504      'Allow a user to delete an item out of another user''s container' );
505 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 146, 'ASSIGN_WORK_ORG_UNIT',
506      'Allow a staff member to define where another staff member has their permissions' );
507 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 147, 'CREATE_FUNDING_SOURCE',
508      'Allow a user to create a new funding source' );
509 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 148, 'DELETE_FUNDING_SOURCE',
510      'Allow a user to delete a funding source' );
511 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 149, 'VIEW_FUNDING_SOURCE',
512      'Allow a user to view a funding source' );
513 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 150, 'UPDATE_FUNDING_SOURCE',
514      'Allow a user to update a funding source' );
515 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 151, 'CREATE_FUND',
516      'Allow a user to create a new fund' );
517 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 152, 'DELETE_FUND',
518      'Allow a user to delete a fund' );
519 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 153, 'VIEW_FUND',
520      'Allow a user to view a fund' );
521 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 154, 'UPDATE_FUND',
522      'Allow a user to update a fund' );
523 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 155, 'CREATE_FUND_ALLOCATION',
524      'Allow a user to create a new fund allocation' );
525 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 156, 'DELETE_FUND_ALLOCATION',
526      'Allow a user to delete a fund allocation' );
527 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 157, 'VIEW_FUND_ALLOCATION',
528      'Allow a user to view a fund allocation' );
529 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 158, 'UPDATE_FUND_ALLOCATION',
530      'Allow a user to update a fund allocation' );
531 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 159, 'GENERAL_ACQ',
532      'Lowest level permission required to access the ACQ interface' );
533 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 160, 'CREATE_PROVIDER',
534      'Allow a user to create a new provider' );
535 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 161, 'DELETE_PROVIDER',
536      'Allow a user to delate a provider' );
537 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 162, 'VIEW_PROVIDER',
538      'Allow a user to view a provider' );
539 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 163, 'UPDATE_PROVIDER',
540      'Allow a user to update a provider' );
541 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 164, 'ADMIN_FUNDING_SOURCE',
542      'Allow a user to create/view/update/delete a funding source' );
543 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 165, 'ADMIN_FUND',
544      '(Deprecated) Allow a user to create/view/update/delete a fund' );
545 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 166, 'MANAGE_FUNDING_SOURCE',
546      'Allow a user to view/credit/debit a funding source' );
547 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 167, 'MANAGE_FUND',
548      'Allow a user to view/credit/debit a fund' );
549 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 168, 'CREATE_PICKLIST',
550      'Allows a user to create a picklist' );
551 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 169, 'ADMIN_PROVIDER',
552      'Allow a user to create/view/update/delete a provider' );
553 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 170, 'MANAGE_PROVIDER',
554      'Allow a user to view and purchase from a provider' );
555 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 171, 'VIEW_PICKLIST',
556      'Allow a user to view another users picklist' );
557 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 172, 'DELETE_RECORD',
558      'Allow a staff member to directly remove a bibliographic record' );
559 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 173, 'ADMIN_CURRENCY_TYPE',
560      'Allow a user to create/view/update/delete a currency_type' );
561 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 174, 'MARK_BAD_DEBT',
562      'Allow a user to mark a transaction as bad (unrecoverable) debt' );
563 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 175, 'VIEW_BILLING_TYPE',
564      'Allow a user to view billing types' );
565 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 176, 'MARK_ITEM_AVAILABLE',
566      'Allow a user to mark an item status as ''available''' );
567 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 177, 'MARK_ITEM_CHECKED_OUT',
568      'Allow a user to mark an item status as ''checked out''' );
569 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 178, 'MARK_ITEM_BINDERY',
570      'Allow a user to mark an item status as ''bindery''' );
571 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 179, 'MARK_ITEM_LOST',
572      'Allow a user to mark an item status as ''lost''' );
573 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 180, 'MARK_ITEM_MISSING',
574      'Allow a user to mark an item status as ''missing''' );
575 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 181, 'MARK_ITEM_IN_PROCESS',
576      'Allow a user to mark an item status as ''in process''' );
577 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 182, 'MARK_ITEM_IN_TRANSIT',
578      'Allow a user to mark an item status as ''in transit''' );
579 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 183, 'MARK_ITEM_RESHELVING',
580      'Allow a user to mark an item status as ''reshelving''' );
581 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 184, 'MARK_ITEM_ON_HOLDS_SHELF',
582      'Allow a user to mark an item status as ''on holds shelf''' );
583 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 185, 'MARK_ITEM_ON_ORDER',
584      'Allow a user to mark an item status as ''on order''' );
585 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 186, 'MARK_ITEM_ILL',
586      'Allow a user to mark an item status as ''inter-library loan''' );
587 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 187, 'group_application.user.staff.acq',
588      'Allows a user to add/remove/edit users in the "ACQ" group' );
589 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 188, 'CREATE_PURCHASE_ORDER',
590      'Allows a user to create a purchase order' );
591 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 189, 'VIEW_PURCHASE_ORDER',
592      'Allows a user to view a purchase order' );
593 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 190, 'IMPORT_ACQ_LINEITEM_BIB_RECORD',
594      'Allows a user to import a bib record from the acq staging area (on-order record) into the ILS bib data set' );
595 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 191, 'RECEIVE_PURCHASE_ORDER',
596      'Allows a user to mark a purchase order, lineitem, or individual copy as received' );
597 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 192, 'VIEW_ORG_SETTINGS',
598      'Allows a user to view all org settings at the specified level' );
599 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 193, 'CREATE_MFHD_RECORD',
600      'Allows a user to create a new MFHD record' );
601 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 194, 'UPDATE_MFHD_RECORD',
602      'Allows a user to update an MFHD record' );
603 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 195, 'DELETE_MFHD_RECORD',
604      'Allows a user to delete an MFHD record' );
605 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 196, 'ADMIN_ACQ_FUND',
606      'Allow a user to create/view/update/delete a fund' );
607 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 197, 'group_application.user.staff.acq_admin',
608      'Allows a user to add/remove/edit users in the "Acquisitions Administrators" group' );
609 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 198, 'SET_CIRC_CLAIMS_RETURNED.override',
610      'Allows staff to override the max claims returned value for a patron' );
611 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 199, 'UPDATE_PATRON_CLAIM_RETURN_COUNT',
612      'Allows staff to manually change a patron''s claims returned count' );
613 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 200, 'UPDATE_BILL_NOTE',
614      'Allows staff to edit the note for a bill on a transaction' );
615 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 201, 'UPDATE_PAYMENT_NOTE',
616      'Allows staff to edit the note for a payment on a transaction' );
617 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 202, 'UPDATE_PATRON_CLAIM_NEVER_CHECKED_OUT_COUNT',
618      'Allows staff to manually change a patron''s claims never checkout out count' );
619 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 203, 'ADMIN_COPY_LOCATION_ORDER',
620      'Allow a user to create/view/update/delete a copy location order' );
621 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 204, 'ASSIGN_GROUP_PERM',
622      '' );
623 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 205, 'CREATE_AUDIENCE',
624      '' );
625 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 206, 'CREATE_BIB_LEVEL',
626      '' );
627 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 207, 'CREATE_CIRC_DURATION',
628      '' );
629 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 208, 'CREATE_CIRC_MOD',
630      '' );
631 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 209, 'CREATE_COPY_STATUS',
632      '' );
633 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 210, 'CREATE_HOURS_OF_OPERATION',
634      '' );
635 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 211, 'CREATE_ITEM_FORM',
636      '' );
637 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 212, 'CREATE_ITEM_TYPE',
638      '' );
639 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 213, 'CREATE_LANGUAGE',
640      '' );
641 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 214, 'CREATE_LASSO',
642      '' );
643 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 215, 'CREATE_LASSO_MAP',
644      '' );
645 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 216, 'CREATE_LIT_FORM',
646      '' );
647 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 217, 'CREATE_METABIB_FIELD',
648      '' );
649 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 218, 'CREATE_NET_ACCESS_LEVEL',
650      '' );
651 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 219, 'CREATE_ORG_ADDRESS',
652      '' );
653 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 220, 'CREATE_ORG_TYPE',
654      '' );
655 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 221, 'CREATE_ORG_UNIT',
656      '' );
657 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 222, 'CREATE_ORG_UNIT_CLOSING',
658      '' );
659 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 223, 'CREATE_PERM',
660      '' );
661 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 224, 'CREATE_RELEVANCE_ADJUSTMENT',
662      '' );
663 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 225, 'CREATE_SURVEY',
664      '' );
665 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 226, 'CREATE_VR_FORMAT',
666      '' );
667 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 227, 'CREATE_XML_TRANSFORM',
668      '' );
669 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 228, 'DELETE_AUDIENCE',
670      '' );
671 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 229, 'DELETE_BIB_LEVEL',
672      '' );
673 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 230, 'DELETE_CIRC_DURATION',
674      '' );
675 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 231, 'DELETE_CIRC_MOD',
676      '' );
677 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 232, 'DELETE_COPY_STATUS',
678      '' );
679 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 233, 'DELETE_HOURS_OF_OPERATION',
680      '' );
681 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 234, 'DELETE_ITEM_FORM',
682      '' );
683 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 235, 'DELETE_ITEM_TYPE',
684      '' );
685 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 236, 'DELETE_LANGUAGE',
686      '' );
687 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 237, 'DELETE_LASSO',
688      '' );
689 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 238, 'DELETE_LASSO_MAP',
690      '' );
691 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 239, 'DELETE_LIT_FORM',
692      '' );
693 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 240, 'DELETE_METABIB_FIELD',
694      '' );
695 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 241, 'DELETE_NET_ACCESS_LEVEL',
696      '' );
697 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 242, 'DELETE_ORG_ADDRESS',
698      '' );
699 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 243, 'DELETE_ORG_TYPE',
700      '' );
701 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 244, 'DELETE_ORG_UNIT',
702      '' );
703 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 245, 'DELETE_ORG_UNIT_CLOSING',
704      '' );
705 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 246, 'DELETE_PERM',
706      '' );
707 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 247, 'DELETE_RELEVANCE_ADJUSTMENT',
708      '' );
709 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 248, 'DELETE_SURVEY',
710      '' );
711 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 249, 'DELETE_TRANSIT',
712      '' );
713 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 250, 'DELETE_VR_FORMAT',
714      '' );
715 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 251, 'DELETE_XML_TRANSFORM',
716      '' );
717 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 252, 'REMOVE_GROUP_PERM',
718      '' );
719 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 253, 'TRANSIT_COPY',
720      '' );
721 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 254, 'UPDATE_AUDIENCE',
722      '' );
723 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 255, 'UPDATE_BIB_LEVEL',
724      '' );
725 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 256, 'UPDATE_CIRC_DURATION',
726      '' );
727 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 257, 'UPDATE_CIRC_MOD',
728      '' );
729 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 258, 'UPDATE_COPY_NOTE',
730      '' );
731 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 259, 'UPDATE_COPY_STATUS',
732      '' );
733 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 260, 'UPDATE_GROUP_PERM',
734      '' );
735 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 261, 'UPDATE_HOURS_OF_OPERATION',
736      '' );
737 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 262, 'UPDATE_ITEM_FORM',
738      '' );
739 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 263, 'UPDATE_ITEM_TYPE',
740      '' );
741 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 264, 'UPDATE_LANGUAGE',
742      '' );
743 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 265, 'UPDATE_LASSO',
744      '' );
745 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 266, 'UPDATE_LASSO_MAP',
746      '' );
747 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 267, 'UPDATE_LIT_FORM',
748      '' );
749 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 268, 'UPDATE_METABIB_FIELD',
750      '' );
751 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 269, 'UPDATE_NET_ACCESS_LEVEL',
752      '' );
753 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 270, 'UPDATE_ORG_ADDRESS',
754      '' );
755 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 271, 'UPDATE_ORG_TYPE',
756      '' );
757 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 272, 'UPDATE_ORG_UNIT_CLOSING',
758      '' );
759 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 273, 'UPDATE_PERM',
760      '' );
761 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 274, 'UPDATE_RELEVANCE_ADJUSTMENT',
762      '' );
763 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 275, 'UPDATE_SURVEY',
764      '' );
765 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 276, 'UPDATE_TRANSIT',
766      '' );
767 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 277, 'UPDATE_VOLUME_NOTE',
768      '' );
769 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 278, 'UPDATE_VR_FORMAT',
770      '' );
771 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 279, 'UPDATE_XML_TRANSFORM',
772      '' );
773 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 280, 'MERGE_BIB_RECORDS',
774      '' );
775 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 281, 'UPDATE_PICKUP_LIB_FROM_HOLDS_SHELF',
776      '' );
777 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 282, 'CREATE_ACQ_FUNDING_SOURCE',
778      '' );
779 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 283, 'CREATE_AUTHORITY_IMPORT_IMPORT_FIELD_DEF',
780      '' );
781 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 284, 'CREATE_AUTHORITY_IMPORT_QUEUE',
782      '' );
783 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 285, 'CREATE_AUTHORITY_RECORD_NOTE',
784      '' );
785 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 286, 'CREATE_BIB_IMPORT_FIELD_DEF',
786      '' );
787 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 287, 'CREATE_BIB_IMPORT_QUEUE',
788      '' );
789 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 288, 'CREATE_LOCALE',
790      '' );
791 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 289, 'CREATE_MARC_CODE',
792      '' );
793 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 290, 'CREATE_TRANSLATION',
794      '' );
795 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 291, 'DELETE_ACQ_FUNDING_SOURCE',
796      '' );
797 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 292, 'DELETE_AUTHORITY_IMPORT_IMPORT_FIELD_DEF',
798      '' );
799 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 293, 'DELETE_AUTHORITY_IMPORT_QUEUE',
800      '' );
801 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 294, 'DELETE_AUTHORITY_RECORD_NOTE',
802      '' );
803 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 295, 'DELETE_BIB_IMPORT_IMPORT_FIELD_DEF',
804      '' );
805 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 296, 'DELETE_BIB_IMPORT_QUEUE',
806      '' );
807 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 297, 'DELETE_LOCALE',
808      '' );
809 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 298, 'DELETE_MARC_CODE',
810      '' );
811 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 299, 'DELETE_TRANSLATION',
812      '' );
813 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 300, 'UPDATE_ACQ_FUNDING_SOURCE',
814      '' );
815 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 301, 'UPDATE_AUTHORITY_IMPORT_IMPORT_FIELD_DEF',
816      '' );
817 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 302, 'UPDATE_AUTHORITY_IMPORT_QUEUE',
818      '' );
819 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 303, 'UPDATE_AUTHORITY_RECORD_NOTE',
820      '' );
821 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 304, 'UPDATE_BIB_IMPORT_IMPORT_FIELD_DEF',
822      '' );
823 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 305, 'UPDATE_BIB_IMPORT_QUEUE',
824      '' );
825 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 306, 'UPDATE_LOCALE',
826      '' );
827 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 307, 'UPDATE_MARC_CODE',
828      '' );
829 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 308, 'UPDATE_TRANSLATION',
830      '' );
831 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 309, 'VIEW_ACQ_FUNDING_SOURCE',
832      '' );
833 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 310, 'VIEW_AUTHORITY_RECORD_NOTES',
834      '' );
835 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 311, 'CREATE_IMPORT_ITEM',
836      '' );
837 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 312, 'CREATE_IMPORT_ITEM_ATTR_DEF',
838      '' );
839 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 313, 'CREATE_IMPORT_TRASH_FIELD',
840      '' );
841 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 314, 'DELETE_IMPORT_ITEM',
842      '' );
843 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 315, 'DELETE_IMPORT_ITEM_ATTR_DEF',
844      '' );
845 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 316, 'DELETE_IMPORT_TRASH_FIELD',
846      '' );
847 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 317, 'UPDATE_IMPORT_ITEM',
848      '' );
849 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 318, 'UPDATE_IMPORT_ITEM_ATTR_DEF',
850      '' );
851 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 319, 'UPDATE_IMPORT_TRASH_FIELD',
852      '' );
853 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 320, 'UPDATE_ORG_UNIT_SETTING_ALL',
854      '' );
855 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 321, 'UPDATE_ORG_UNIT_SETTING.circ.lost_materials_processing_fee',
856      '' );
857 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 322, 'UPDATE_ORG_UNIT_SETTING.cat.default_item_price',
858      '' );
859 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 323, 'UPDATE_ORG_UNIT_SETTING.auth.opac_timeout',
860      '' );
861 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 324, 'UPDATE_ORG_UNIT_SETTING.auth.staff_timeout',
862      '' );
863 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 325, 'UPDATE_ORG_UNIT_SETTING.org.bounced_emails',
864      '' );
865 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 326, 'UPDATE_ORG_UNIT_SETTING.circ.hold_expire_alert_interval',
866      '' );
867 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 327, 'UPDATE_ORG_UNIT_SETTING.circ.hold_expire_interval',
868      '' );
869 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 328, 'UPDATE_ORG_UNIT_SETTING.credit.payments.allow',
870      '' );
871 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 329, 'UPDATE_ORG_UNIT_SETTING.circ.void_overdue_on_lost',
872      '' );
873 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 330, 'UPDATE_ORG_UNIT_SETTING.circ.hold_stalling.soft',
874      '' );
875 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 331, 'UPDATE_ORG_UNIT_SETTING.circ.hold_boundary.hard',
876      '' );
877 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 332, 'UPDATE_ORG_UNIT_SETTING.circ.hold_boundary.soft',
878      '' );
879 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 333, 'UPDATE_ORG_UNIT_SETTING.opac.barcode_regex',
880      '' );
881 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 334, 'UPDATE_ORG_UNIT_SETTING.global.password_regex',
882      '' );
883 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 335, 'UPDATE_ORG_UNIT_SETTING.circ.item_checkout_history.max',
884      '' );
885 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 336, 'UPDATE_ORG_UNIT_SETTING.circ.reshelving_complete.interval',
886      '' );
887 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 337, 'UPDATE_ORG_UNIT_SETTING.circ.selfcheck.patron_login_timeout',
888      '' );
889 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 338, 'UPDATE_ORG_UNIT_SETTING.circ.selfcheck.alert_on_checkout_event',
890      '' );
891 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 339, 'UPDATE_ORG_UNIT_SETTING.circ.selfcheck.require_patron_password',
892      '' );
893 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 340, 'UPDATE_ORG_UNIT_SETTING.global.juvenile_age_threshold',
894      '' );
895 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 341, 'UPDATE_ORG_UNIT_SETTING.cat.bib.keep_on_empty',
896      '' );
897 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 342, 'UPDATE_ORG_UNIT_SETTING.cat.bib.alert_on_empty',
898      '' );
899 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 343, 'UPDATE_ORG_UNIT_SETTING.patron.password.use_phone',
900      '' );
901 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 344, 'HOLD_ITEM_CHECKED_OUT.override',
902      'Allows a user to place a hold on an item that they already have checked out' );
903 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 345, 'ADMIN_ACQ_CANCEL_CAUSE',
904      'Allow a user to create/update/delete reasons for order cancellations' );
905 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 346, 'ACQ_XFER_MANUAL_DFUND_AMOUNT',
906      'Allow a user to transfer different amounts of money out of one fund and into another' );
907 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 347, 'OVERRIDE_HOLD_HAS_LOCAL_COPY',
908      'Allow a user to override the circ.holds.hold_has_copy_at.block setting' );
909 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 348, 'UPDATE_PICKUP_LIB_FROM_TRANSIT',
910      'Allow a user to change the pickup and transit destination for a captured hold item already in transit' );
911 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 349, 'COPY_NEEDED_FOR_HOLD.override',
912      'Allow a user to force renewal of an item that could fulfill a hold request' );
913 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 350, 'MERGE_AUTH_RECORDS',
914      'Allow a user to merge authority records together' );
915 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 351, 'ALLOW_ALT_TCN',
916      'Allows staff to import a record using an alternate TCN to avoid conflicts' );
917 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 352, 'ADMIN_TRIGGER_EVENT_DEF',
918      'Allow a user to administer trigger event definitions' );
919 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 353, 'ADMIN_TRIGGER_CLEANUP',
920      'Allow a user to create, delete, and update trigger cleanup entries' );
921 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 354, 'CREATE_TRIGGER_CLEANUP',
922      'Allow a user to create trigger cleanup entries' );
923 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 355, 'DELETE_TRIGGER_CLEANUP',
924      'Allow a user to delete trigger cleanup entries' );
925 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 356, 'UPDATE_TRIGGER_CLEANUP',
926      'Allow a user to update trigger cleanup entries' );
927 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 357, 'CREATE_TRIGGER_EVENT_DEF',
928      'Allow a user to create trigger event definitions' );
929 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 358, 'DELETE_TRIGGER_EVENT_DEF',
930      'Allow a user to delete trigger event definitions' );
931 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 359, 'UPDATE_TRIGGER_EVENT_DEF',
932      'Allow a user to update trigger event definitions' );
933 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 360, 'VIEW_TRIGGER_EVENT_DEF',
934      'Allow a user to view trigger event definitions' );
935 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 361, 'ADMIN_TRIGGER_HOOK',
936      'Allow a user to create, update, and delete trigger hooks' );
937 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 362, 'CREATE_TRIGGER_HOOK',
938      'Allow a user to create trigger hooks' );
939 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 363, 'DELETE_TRIGGER_HOOK',
940      'Allow a user to delete trigger hooks' );
941 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 364, 'UPDATE_TRIGGER_HOOK',
942      'Allow a user to update trigger hooks' );
943 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 365, 'ADMIN_TRIGGER_REACTOR',
944      'Allow a user to create, update, and delete trigger reactors' );
945 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 366, 'CREATE_TRIGGER_REACTOR',
946      'Allow a user to create trigger reactors' );
947 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 367, 'DELETE_TRIGGER_REACTOR',
948      'Allow a user to delete trigger reactors' );
949 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 368, 'UPDATE_TRIGGER_REACTOR',
950      'Allow a user to update trigger reactors' );
951 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 369, 'ADMIN_TRIGGER_TEMPLATE_OUTPUT',
952      'Allow a user to delete trigger template output' );
953 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 370, 'DELETE_TRIGGER_TEMPLATE_OUTPUT',
954      'Allow a user to delete trigger template output' );
955 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 371, 'ADMIN_TRIGGER_VALIDATOR',
956      'Allow a user to create, update, and delete trigger validators' );
957 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 372, 'CREATE_TRIGGER_VALIDATOR',
958      'Allow a user to create trigger validators' );
959 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 373, 'DELETE_TRIGGER_VALIDATOR',
960      'Allow a user to delete trigger validators' );
961 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 374, 'UPDATE_TRIGGER_VALIDATOR',
962      'Allow a user to update trigger validators' );
963 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 376, 'ADMIN_BOOKING_RESOURCE',
964      'Enables the user to create/update/delete booking resources' );
965 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 377, 'ADMIN_BOOKING_RESOURCE_TYPE',
966      'Enables the user to create/update/delete booking resource types' );
967 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 378, 'ADMIN_BOOKING_RESOURCE_ATTR',
968      'Enables the user to create/update/delete booking resource attributes' );
969 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 379, 'ADMIN_BOOKING_RESOURCE_ATTR_MAP',
970      'Enables the user to create/update/delete booking resource attribute maps' );
971 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 380, 'ADMIN_BOOKING_RESOURCE_ATTR_VALUE',
972      'Enables the user to create/update/delete booking resource attribute values' );
973 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 381, 'ADMIN_BOOKING_RESERVATION',
974      'Enables the user to create/update/delete booking reservations' );
975 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 382, 'ADMIN_BOOKING_RESERVATION_ATTR_VALUE_MAP',
976      'Enables the user to create/update/delete booking reservation attribute value maps' );
977 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 383, 'RETRIEVE_RESERVATION_PULL_LIST',
978      'Allows a user to retrieve a booking reservation pull list' );
979 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 384, 'CAPTURE_RESERVATION',
980      'Allows a user to capture booking reservations' );
981 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 385, 'UPDATE_RECORD',
982      '' );
983 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 386, 'UPDATE_ORG_UNIT_SETTING.circ.block_renews_for_holds',
984      '' );
985 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 387, 'MERGE_USERS',
986      'Allows user records to be merged' );
987 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 388, 'ISSUANCE_HOLDS',
988      'Allow a user to place holds on serials issuances' );
989 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 389, 'VIEW_CREDIT_CARD_PROCESSING',
990      'View org unit settings related to credit card processing' );
991 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 390, 'ADMIN_CREDIT_CARD_PROCESSING',
992      'Update org unit settings related to credit card processing' );
993 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 391, 'ADMIN_SERIAL_CAPTION_PATTERN',
994         'Create/update/delete serial caption and pattern objects' );
995 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 392, 'ADMIN_SERIAL_SUBSCRIPTION',
996         'Create/update/delete serial subscription objects' );
997 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 393, 'ADMIN_SERIAL_DISTRIBUTION',
998         'Create/update/delete serial distribution objects' );
999 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 394, 'ADMIN_SERIAL_STREAM',
1000         'Create/update/delete serial stream objects' );
1001 INSERT INTO permission.temp_perm ( id, code, description ) VALUES ( 395, 'RECEIVE_SERIAL',
1002         'Receive serial items' );
1003
1004 -- Now for the permissions from the IDL.  We don't have descriptions for them.
1005
1006 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 396, 'ADMIN_ACQ_CLAIM' );
1007 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 397, 'ADMIN_ACQ_CLAIM_EVENT_TYPE' );
1008 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 398, 'ADMIN_ACQ_CLAIM_TYPE' );
1009 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 399, 'ADMIN_ACQ_DISTRIB_FORMULA' );
1010 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 400, 'ADMIN_ACQ_FISCAL_YEAR' );
1011 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 401, 'ADMIN_ACQ_FUND_ALLOCATION_PERCENT' );
1012 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 402, 'ADMIN_ACQ_FUND_TAG' );
1013 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 403, 'ADMIN_ACQ_LINEITEM_ALERT_TEXT' );
1014 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 404, 'ADMIN_AGE_PROTECT_RULE' );
1015 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 405, 'ADMIN_ASSET_COPY_TEMPLATE' );
1016 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 406, 'ADMIN_BOOKING_RESERVATION_ATTR_MAP' );
1017 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 407, 'ADMIN_CIRC_MATRIX_MATCHPOINT' );
1018 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 408, 'ADMIN_CIRC_MOD' );
1019 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 409, 'ADMIN_CLAIM_POLICY' );
1020 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 410, 'ADMIN_CONFIG_REMOTE_ACCOUNT' );
1021 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 411, 'ADMIN_FIELD_DOC' );
1022 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 412, 'ADMIN_GLOBAL_FLAG' );
1023 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 413, 'ADMIN_GROUP_PENALTY_THRESHOLD' );
1024 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 414, 'ADMIN_HOLD_CANCEL_CAUSE' );
1025 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 415, 'ADMIN_HOLD_MATRIX_MATCHPOINT' );
1026 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 416, 'ADMIN_IDENT_TYPE' );
1027 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 417, 'ADMIN_IMPORT_ITEM_ATTR_DEF' );
1028 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 418, 'ADMIN_INDEX_NORMALIZER' );
1029 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 419, 'ADMIN_INVOICE' );
1030 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 420, 'ADMIN_INVOICE_METHOD' );
1031 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 421, 'ADMIN_INVOICE_PAYMENT_METHOD' );
1032 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 422, 'ADMIN_LINEITEM_MARC_ATTR_DEF' );
1033 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 423, 'ADMIN_MARC_CODE' );
1034 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 424, 'ADMIN_MAX_FINE_RULE' );
1035 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 425, 'ADMIN_MERGE_PROFILE' );
1036 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 426, 'ADMIN_ORG_UNIT_SETTING_TYPE' );
1037 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 427, 'ADMIN_RECURRING_FINE_RULE' );
1038 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 428, 'ADMIN_STANDING_PENALTY' );
1039 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 429, 'ADMIN_SURVEY' );
1040 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 430, 'ADMIN_USER_REQUEST_TYPE' );
1041 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 431, 'ADMIN_USER_SETTING_GROUP' );
1042 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 432, 'ADMIN_USER_SETTING_TYPE' );
1043 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 433, 'ADMIN_Z3950_SOURCE' );
1044 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 434, 'CREATE_BIB_BTYPE' );
1045 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 435, 'CREATE_BIBLIO_FINGERPRINT' );
1046 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 436, 'CREATE_BIB_SOURCE' );
1047 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 437, 'CREATE_BILLING_TYPE' );
1048 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 438, 'CREATE_CN_BTYPE' );
1049 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 439, 'CREATE_COPY_BTYPE' );
1050 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 440, 'CREATE_INVOICE' );
1051 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 441, 'CREATE_INVOICE_ITEM_TYPE' );
1052 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 442, 'CREATE_INVOICE_METHOD' );
1053 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 443, 'CREATE_MERGE_PROFILE' );
1054 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 444, 'CREATE_METABIB_CLASS' );
1055 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 445, 'CREATE_METABIB_SEARCH_ALIAS' );
1056 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 446, 'CREATE_USER_BTYPE' );
1057 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 447, 'DELETE_BIB_BTYPE' );
1058 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 448, 'DELETE_BIBLIO_FINGERPRINT' );
1059 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 449, 'DELETE_BIB_SOURCE' );
1060 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 450, 'DELETE_BILLING_TYPE' );
1061 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 451, 'DELETE_CN_BTYPE' );
1062 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 452, 'DELETE_COPY_BTYPE' );
1063 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 453, 'DELETE_INVOICE_ITEM_TYPE' );
1064 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 454, 'DELETE_INVOICE_METHOD' );
1065 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 455, 'DELETE_MERGE_PROFILE' );
1066 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 456, 'DELETE_METABIB_CLASS' );
1067 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 457, 'DELETE_METABIB_SEARCH_ALIAS' );
1068 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 458, 'DELETE_USER_BTYPE' );
1069 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 459, 'MANAGE_CLAIM' );
1070 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 460, 'UPDATE_BIB_BTYPE' );
1071 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 461, 'UPDATE_BIBLIO_FINGERPRINT' );
1072 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 462, 'UPDATE_BIB_SOURCE' );
1073 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 463, 'UPDATE_BILLING_TYPE' );
1074 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 464, 'UPDATE_CN_BTYPE' );
1075 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 465, 'UPDATE_COPY_BTYPE' );
1076 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 466, 'UPDATE_INVOICE_ITEM_TYPE' );
1077 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 467, 'UPDATE_INVOICE_METHOD' );
1078 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 468, 'UPDATE_MERGE_PROFILE' );
1079 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 469, 'UPDATE_METABIB_CLASS' );
1080 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 470, 'UPDATE_METABIB_SEARCH_ALIAS' );
1081 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 471, 'UPDATE_USER_BTYPE' );
1082 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 472, 'user_request.create' );
1083 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 473, 'user_request.delete' );
1084 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 474, 'user_request.update' );
1085 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 475, 'user_request.view' );
1086 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 476, 'VIEW_ACQ_FUND_ALLOCATION_PERCENT' );
1087 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 477, 'VIEW_CIRC_MATRIX_MATCHPOINT' );
1088 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 478, 'VIEW_CLAIM' );
1089 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 479, 'VIEW_GROUP_PENALTY_THRESHOLD' );
1090 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 480, 'VIEW_HOLD_MATRIX_MATCHPOINT' );
1091 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 481, 'VIEW_INVOICE' );
1092 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 482, 'VIEW_MERGE_PROFILE' );
1093 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 483, 'VIEW_SERIAL_SUBSCRIPTION' );
1094 INSERT INTO permission.temp_perm ( id, code ) VALUES ( 484, 'VIEW_STANDING_PENALTY' );
1095
1096 -- For every permission in the temp_perm table that has a matching
1097 -- permission in the real table: record the original id.
1098
1099 UPDATE permission.temp_perm AS tp
1100 SET old_id =
1101         (
1102                 SELECT id
1103                 FROM permission.perm_list AS ppl
1104                 WHERE ppl.code = tp.code
1105         )
1106 WHERE code IN ( SELECT code FROM permission.perm_list );
1107
1108 -- Start juggling ids.
1109
1110 -- If any permissions have negative ids (with the special exception of -1),
1111 -- we need to move them into the positive range in order to avoid duplicate
1112 -- key problems (since we are going to use the negative range as a temporary
1113 -- staging area).
1114
1115 -- First, move any predefined permissions that have negative ids (again with
1116 -- the special exception of -1).  Temporarily give them positive ids based on
1117 -- the sequence.
1118
1119 UPDATE permission.perm_list
1120 SET id = NEXTVAL('permission.perm_list_id_seq'::regclass)
1121 WHERE id < -1
1122   AND code IN (SELECT code FROM permission.temp_perm);
1123
1124 -- Identify any non-predefined permissions whose ids are either negative
1125 -- or within the range (0-1000) reserved for predefined permissions.
1126 -- Assign them ids above 1000, based on the sequence.  Record the new
1127 -- ids in the temp_perm table.
1128
1129 INSERT INTO permission.temp_perm ( id, code, description, old_id, predefined )
1130 (
1131         SELECT NEXTVAL('permission.perm_list_id_seq'::regclass),
1132                 code, description, id, false
1133         FROM permission.perm_list
1134         WHERE  ( id < -1 OR id BETWEEN 0 AND 1000 )
1135         AND code NOT IN (SELECT code FROM permission.temp_perm)
1136 );
1137
1138 -- Now update the ids of those non-predefined permissions, using the
1139 -- values assigned in the previous step.
1140
1141 UPDATE permission.perm_list AS ppl
1142 SET id = (
1143                 SELECT id
1144                 FROM permission.temp_perm AS tp
1145                 WHERE tp.code = ppl.code
1146         )
1147 WHERE id IN ( SELECT old_id FROM permission.temp_perm WHERE NOT predefined );
1148
1149 -- Now the negative ids have been eliminated, except for -1.  Move all the
1150 -- predefined permissions temporarily into the negative range.
1151
1152 UPDATE permission.perm_list
1153 SET id = -1 - id
1154 WHERE id <> -1
1155 AND code IN ( SELECT code from permission.temp_perm WHERE predefined );
1156
1157 -- Apply the final ids to the existing predefined permissions.
1158
1159 UPDATE permission.perm_list AS ppl
1160 SET id =
1161         (
1162                 SELECT id
1163                 FROM permission.temp_perm AS tp
1164                 WHERE tp.code = ppl.code
1165         )
1166 WHERE
1167         id <> -1
1168         AND ppl.code IN
1169         (
1170                 SELECT code from permission.temp_perm
1171                 WHERE predefined
1172                 AND old_id IS NOT NULL
1173         );
1174
1175 -- If there are any predefined permissions that don't exist yet in
1176 -- permission.perm_list, insert them now.
1177
1178 INSERT INTO permission.perm_list ( id, code, description )
1179 (
1180         SELECT id, code, description
1181         FROM permission.temp_perm
1182         WHERE old_id IS NULL
1183 );
1184
1185 -- Reset the sequence to the lowest feasible value.  This may or may not
1186 -- accomplish anything, but it will do no harm.
1187
1188 SELECT SETVAL('permission.perm_list_id_seq'::TEXT, GREATEST( 
1189         (SELECT MAX(id) FROM permission.perm_list), 1000 ));
1190
1191 -- If any permission lacks a description, use the code as a description.
1192 -- It's better than nothing.
1193
1194 UPDATE permission.perm_list
1195 SET description = code
1196 WHERE description IS NULL
1197    OR description = '';
1198
1199 -- Thus endeth the Great Renumbering.
1200
1201 -- Having massaged the permissions, massage the way they are assigned, by inserting
1202 -- rows into permission.grp_perm_map.  Some of these permissions may have already
1203 -- been assigned, so we insert the rows only if they aren't already there.
1204
1205 -- for backwards compat, give everyone the permission
1206 INSERT INTO permission.grp_perm_map (grp, perm, depth, grantable)
1207     SELECT 1, id, 0, false FROM permission.perm_list AS perm
1208         WHERE code = 'HOLD_ITEM_CHECKED_OUT.override'
1209                 AND NOT EXISTS (
1210                         SELECT 1
1211                         FROM permission.grp_perm_map AS map
1212                         WHERE
1213                                 grp = 1
1214                                 AND map.perm = perm.id
1215                 );
1216
1217 -- Add trigger administration permissions to the Local System Administrator group.
1218 INSERT INTO permission.grp_perm_map (grp, perm, depth, grantable)
1219     SELECT 10, id, 1, false FROM permission.perm_list AS perm
1220     WHERE (
1221                 perm.code LIKE 'ADMIN_TRIGGER%'
1222         OR perm.code LIKE 'CREATE_TRIGGER%'
1223         OR perm.code LIKE 'DELETE_TRIGGER%'
1224         OR perm.code LIKE 'UPDATE_TRIGGER%'
1225         ) AND NOT EXISTS (
1226                 SELECT 1
1227                 FROM permission.grp_perm_map AS map
1228                 WHERE
1229                         grp = 10
1230                         AND map.perm = perm.id
1231         );
1232
1233 -- View trigger permissions are required at a consortial level for initial setup
1234 -- (as before, only if the row doesn't already exist)
1235 INSERT INTO permission.grp_perm_map (grp, perm, depth, grantable)
1236     SELECT 10, id, 0, false FROM permission.perm_list AS perm
1237         WHERE code LIKE 'VIEW_TRIGGER%'
1238                 AND NOT EXISTS (
1239                         SELECT 1
1240                         FROM permission.grp_perm_map AS map
1241                         WHERE
1242                                 grp = 10
1243                                 AND map.perm = perm.id
1244                 );
1245
1246 -- Permission for merging auth records may already be defined,
1247 -- so add it only if it isn't there.
1248 INSERT INTO permission.grp_perm_map (grp, perm, depth, grantable)
1249     SELECT 4, id, 1, false FROM permission.perm_list AS perm
1250         WHERE code = 'MERGE_AUTH_RECORDS'
1251                 AND NOT EXISTS (
1252                         SELECT 1
1253                         FROM permission.grp_perm_map AS map
1254                         WHERE
1255                                 grp = 4
1256                                 AND map.perm = perm.id
1257                 );
1258
1259 -- Create a reference table as parent to both
1260 -- config.org_unit_setting_type and config_usr_setting_type
1261
1262 CREATE TABLE config.settings_group (
1263     name    TEXT PRIMARY KEY,
1264     label   TEXT UNIQUE NOT NULL -- I18N
1265 );
1266
1267 -- org_unit setting types
1268 CREATE TABLE config.org_unit_setting_type (
1269     name            TEXT    PRIMARY KEY,
1270     label           TEXT    UNIQUE NOT NULL,
1271     grp             TEXT    REFERENCES config.settings_group (name),
1272     description     TEXT,
1273     datatype        TEXT    NOT NULL DEFAULT 'string',
1274     fm_class        TEXT,
1275     view_perm       INT,
1276     update_perm     INT,
1277     --
1278     -- define valid datatypes
1279     --
1280     CONSTRAINT coust_valid_datatype CHECK ( datatype IN
1281     ( 'bool', 'integer', 'float', 'currency', 'interval',
1282       'date', 'string', 'object', 'array', 'link' ) ),
1283     --
1284     -- fm_class is meaningful only for 'link' datatype
1285     --
1286     CONSTRAINT coust_no_empty_link CHECK
1287     ( ( datatype =  'link' AND fm_class IS NOT NULL ) OR
1288       ( datatype <> 'link' AND fm_class IS NULL ) ),
1289         CONSTRAINT view_perm_fkey FOREIGN KEY (view_perm) REFERENCES permission.perm_list (id)
1290                 ON UPDATE CASCADE
1291                 ON DELETE RESTRICT
1292                 DEFERRABLE INITIALLY DEFERRED,
1293         CONSTRAINT update_perm_fkey FOREIGN KEY (update_perm) REFERENCES permission.perm_list (id)
1294                 ON UPDATE CASCADE
1295                 DEFERRABLE INITIALLY DEFERRED
1296 );
1297
1298 CREATE TABLE config.usr_setting_type (
1299
1300     name TEXT PRIMARY KEY,
1301     opac_visible BOOL NOT NULL DEFAULT FALSE,
1302     label TEXT UNIQUE NOT NULL,
1303     description TEXT,
1304     grp             TEXT    REFERENCES config.settings_group (name),
1305     datatype TEXT NOT NULL DEFAULT 'string',
1306     fm_class TEXT,
1307
1308     --
1309     -- define valid datatypes
1310     --
1311     CONSTRAINT coust_valid_datatype CHECK ( datatype IN
1312     ( 'bool', 'integer', 'float', 'currency', 'interval',
1313         'date', 'string', 'object', 'array', 'link' ) ),
1314
1315     --
1316     -- fm_class is meaningful only for 'link' datatype
1317     --
1318     CONSTRAINT coust_no_empty_link CHECK
1319     ( ( datatype = 'link' AND fm_class IS NOT NULL ) OR
1320         ( datatype <> 'link' AND fm_class IS NULL ) )
1321
1322 );
1323
1324 --------------------------------------
1325 -- Seed data for org_unit_setting_type
1326 --------------------------------------
1327
1328 INSERT into config.org_unit_setting_type
1329 ( name, label, description, datatype ) VALUES
1330
1331 ( 'auth.opac_timeout',
1332   'OPAC Inactivity Timeout (in seconds)',
1333   null,
1334   'integer' ),
1335
1336 ( 'auth.staff_timeout',
1337   'Staff Login Inactivity Timeout (in seconds)',
1338   null,
1339   'integer' ),
1340
1341 ( 'circ.lost_materials_processing_fee',
1342   'Lost Materials Processing Fee',
1343   null,
1344   'currency' ),
1345
1346 ( 'cat.default_item_price',
1347   'Default Item Price',
1348   null,
1349   'currency' ),
1350
1351 ( 'org.bounced_emails',
1352   'Sending email address for patron notices',
1353   null,
1354   'string' ),
1355
1356 ( 'circ.hold_expire_alert_interval',
1357   'Holds: Expire Alert Interval',
1358   'Amount of time before a hold expires at which point the patron should be alerted',
1359   'interval' ),
1360
1361 ( 'circ.hold_expire_interval',
1362   'Holds: Expire Interval',
1363   'Amount of time after a hold is placed before the hold expires.  Example "100 days"',
1364   'interval' ),
1365
1366 ( 'credit.payments.allow',
1367   'Allow Credit Card Payments',
1368   'If enabled, patrons will be able to pay fines accrued at this location via credit card',
1369   'bool' ),
1370
1371 ( 'global.default_locale',
1372   'Global Default Locale',
1373   null,
1374   'string' ),
1375
1376 ( 'circ.void_overdue_on_lost',
1377   'Void overdue fines when items are marked lost',
1378   null,
1379   'bool' ),
1380
1381 ( 'circ.hold_stalling.soft',
1382   'Holds: Soft stalling interval',
1383   'How long to wait before allowing remote items to be opportunistically captured for a hold.  Example "5 days"',
1384   'interval' ),
1385
1386 ( 'circ.hold_stalling_hard',
1387   'Holds: Hard stalling interval',
1388   '',
1389   'interval' ),
1390
1391 ( 'circ.hold_boundary.hard',
1392   'Holds: Hard boundary',
1393   null,
1394   'integer' ),
1395
1396 ( 'circ.hold_boundary.soft',
1397   'Holds: Soft boundary',
1398   null,
1399   'integer' ),
1400
1401 ( 'opac.barcode_regex',
1402   'Patron barcode format',
1403   'Regular expression defining the patron barcode format',
1404   'string' ),
1405
1406 ( 'global.password_regex',
1407   'Password format',
1408   'Regular expression defining the password format',
1409   'string' ),
1410
1411 ( 'circ.item_checkout_history.max',
1412   'Maximum previous checkouts displayed',
1413   'This is the maximum number of previous circulations the staff client will display when investigating item details',
1414   'integer' ),
1415
1416 ( 'circ.reshelving_complete.interval',
1417   'Change reshelving status interval',
1418   'Amount of time to wait before changing an item from "reshelving" status to "available".  Examples: "1 day", "6 hours"',
1419   'interval' ),
1420
1421 ( 'circ.holds.default_estimated_wait_interval',
1422   'Holds: Default Estimated Wait',
1423   'When predicting the amount of time a patron will be waiting for a hold to be fulfilled, this is the default estimated length of time to assume an item will be checked out.',
1424   'interval' ),
1425
1426 ( 'circ.holds.min_estimated_wait_interval',
1427   'Holds: Minimum Estimated Wait',
1428   '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.',
1429   'interval' ),
1430
1431 ( 'circ.selfcheck.patron_login_timeout',
1432   'Selfcheck: Patron Login Timeout (in seconds)',
1433   'Number of seconds of inactivity before the patron is logged out of the selfcheck interface',
1434   'integer' ),
1435
1436 ( 'circ.selfcheck.alert.popup',
1437   'Selfcheck: Pop-up alert for errors',
1438   'If true, checkout/renewal errors will cause a pop-up window in addition to the on-screen message',
1439   'bool' ),
1440
1441 ( 'circ.selfcheck.require_patron_password',
1442   'Selfcheck: Require patron password',
1443   'If true, patrons will be required to enter their password in addition to their username/barcode to log into the selfcheck interface',
1444   'bool' ),
1445
1446 ( 'global.juvenile_age_threshold',
1447   'Juvenile Age Threshold',
1448   'The age at which a user is no long considered a juvenile.  For example, "18 years".',
1449   'interval' ),
1450
1451 ( 'cat.bib.keep_on_empty',
1452   'Retain empty bib records',
1453   'Retain a bib record even when all attached copies are deleted',
1454   'bool' ),
1455
1456 ( 'cat.bib.alert_on_empty',
1457   'Alert on empty bib records',
1458   'Alert staff when the last copy for a record is being deleted',
1459   'bool' ),
1460
1461 ( 'patron.password.use_phone',
1462   'Patron: password from phone #',
1463   'Use the last 4 digits of the patrons phone number as the default password when creating new users',
1464   'bool' ),
1465
1466 ( 'circ.charge_on_damaged',
1467   'Charge item price when marked damaged',
1468   'Charge item price when marked damaged',
1469   'bool' ),
1470
1471 ( 'circ.charge_lost_on_zero',
1472   'Charge lost on zero',
1473   '',
1474   'bool' ),
1475
1476 ( 'circ.damaged_item_processing_fee',
1477   'Charge processing fee for damaged items',
1478   'Charge processing fee for damaged items',
1479   'currency' ),
1480
1481 ( 'circ.void_lost_on_checkin',
1482   'Circ: Void lost item billing when returned',
1483   'Void lost item billing when returned',
1484   'bool' ),
1485
1486 ( 'circ.max_accept_return_of_lost',
1487   'Circ: Void lost max interval',
1488   'Items that have been lost this long will not result in voided billings when returned.  E.g. ''6 months''',
1489   'interval' ),
1490
1491 ( 'circ.void_lost_proc_fee_on_checkin',
1492   'Circ: Void processing fee on lost item return',
1493   'Void processing fee when lost item returned',
1494   'bool' ),
1495
1496 ( 'circ.restore_overdue_on_lost_return',
1497   'Circ: Restore overdues on lost item return',
1498   'Restore overdue fines on lost item return',
1499   'bool' ),
1500
1501 ( 'circ.lost_immediately_available',
1502   'Circ: Lost items usable on checkin',
1503   'Lost items are usable on checkin instead of going ''home'' first',
1504   'bool' ),
1505
1506 ( 'circ.holds_fifo',
1507   'Holds: FIFO',
1508   'Force holds to a more strict First-In, First-Out capture',
1509   'bool' ),
1510
1511 ( 'opac.allow_pending_address',
1512   'OPAC: Allow pending addresses',
1513   'If enabled, patrons can create and edit existing addresses.  Addresses are kept in a pending state until staff approves the changes',
1514   'bool' ),
1515
1516 ( 'ui.circ.show_billing_tab_on_bills',
1517   'Show billing tab first when bills are present',
1518   'If enabled and a patron has outstanding bills and the alert page is not required, show the billing tab by default, instead of the checkout tab, when a patron is loaded',
1519   'bool' ),
1520
1521 ( 'ui.general.idle_timeout',
1522     'GUI: Idle timeout',
1523     'If you want staff client windows to be minimized after a certain amount of system idle time, set this to the number of seconds of idle time that you want to allow before minimizing (requires staff client restart).',
1524     'integer' ),
1525
1526 ( 'ui.circ.in_house_use.entry_cap',
1527   'GUI: Record In-House Use: Maximum # of uses allowed per entry.',
1528   'The # of uses entry in the Record In-House Use interface may not exceed the value of this setting.',
1529   'integer' ),
1530
1531 ( 'ui.circ.in_house_use.entry_warn',
1532   'GUI: Record In-House Use: # of uses threshold for Are You Sure? dialog.',
1533   'In the Record In-House Use interface, a submission attempt will warn if the # of uses field exceeds the value of this setting.',
1534   'integer' ),
1535
1536 ( 'acq.default_circ_modifier',
1537   'Default circulation modifier',
1538   null,
1539   'string' ),
1540
1541 ( 'acq.tmp_barcode_prefix',
1542   'Temporary barcode prefix',
1543   null,
1544   'string' ),
1545
1546 ( 'acq.tmp_callnumber_prefix',
1547   'Temporary call number prefix',
1548   null,
1549   'string' ),
1550
1551 ( 'ui.circ.patron_summary.horizontal',
1552   'Patron circulation summary is horizontal',
1553   null,
1554   'bool' ),
1555
1556 ( 'ui.staff.require_initials',
1557   oils_i18n_gettext('ui.staff.require_initials', 'GUI: Require staff initials for entry/edit of item/patron/penalty notes/messages.', 'coust', 'label'),
1558   oils_i18n_gettext('ui.staff.require_initials', 'Appends staff initials and edit date into note content.', 'coust', 'description'),
1559   'bool' ),
1560
1561 ( 'ui.general.button_bar',
1562   'Button bar',
1563   null,
1564   'bool' ),
1565
1566 ( 'circ.hold_shelf_status_delay',
1567   'Hold Shelf Status Delay',
1568   'The purpose is to provide an interval of time after an item goes into the on-holds-shelf status before it appears to patrons that it is actually on the holds shelf.  This gives staff time to process the item before it shows as ready-for-pickup.',
1569   'interval' ),
1570
1571 ( 'circ.patron_invalid_address_apply_penalty',
1572   'Invalid patron address penalty',
1573   'When set, if a patron address is set to invalid, a penalty is applied.',
1574   'bool' ),
1575
1576 ( 'circ.checkout_fills_related_hold',
1577   'Checkout Fills Related Hold',
1578   'When a patron checks out an item and they have no holds that directly target the item, the system will attempt to find a hold for the patron that could be fulfilled by the checked out item and fulfills it',
1579   'bool'),
1580
1581 ( 'circ.selfcheck.auto_override_checkout_events',
1582   'Selfcheck override events list',
1583   'List of checkout/renewal events that the selfcheck interface should automatically override instead instead of alerting and stopping the transaction',
1584   'array' ),
1585
1586 ( 'circ.staff_client.do_not_auto_attempt_print',
1587   'Disable Automatic Print Attempt Type List',
1588   'Disable automatic print attempts from staff client interfaces for the receipt types in this list.  Possible values: "Checkout", "Bill Pay", "Hold Slip", "Transit Slip", and "Hold/Transit Slip".  This is different from the Auto-Print checkbox in the pertinent interfaces in that it disables automatic print attempts altogether, rather than encouraging silent printing by suppressing the print dialog.  The Auto-Print checkbox in these interfaces have no effect on the behavior for this setting.  In the case of the Hold, Transit, and Hold/Transit slips, this also suppresses the alert dialogs that precede the print dialog (the ones that offer Print and Do Not Print as options).',
1589   'array' ),
1590
1591 ( 'ui.patron.default_inet_access_level',
1592   'Default level of patrons'' internet access',
1593   null,
1594   'integer' ),
1595
1596 ( 'circ.max_patron_claim_return_count',
1597     'Max Patron Claims Returned Count',
1598     'When this count is exceeded, a staff override is required to mark the item as claims returned',
1599     'integer' ),
1600
1601 ( 'circ.obscure_dob',
1602     'Obscure the Date of Birth field',
1603     'When true, the Date of Birth column in patron lists will default to Not Visible, and in the Patron Summary sidebar the value will display as <Hidden> unless the field label is clicked.',
1604     'bool' ),
1605
1606 ( 'circ.auto_hide_patron_summary',
1607     'GUI: Toggle off the patron summary sidebar after first view.',
1608     'When true, the patron summary sidebar will collapse after a new patron sub-interface is selected.',
1609     'bool' ),
1610
1611 ( 'credit.processor.default',
1612     'Credit card processing: Name default credit processor',
1613     'This can be "AuthorizeNet", "PayPal" (for the Website Payment Pro API), or "PayflowPro".',
1614     'string' ),
1615
1616 ( 'credit.processor.authorizenet.enabled',
1617     'Credit card processing: AuthorizeNet enabled',
1618     '',
1619     'bool' ),
1620
1621 ( 'credit.processor.authorizenet.login',
1622     'Credit card processing: AuthorizeNet login',
1623     '',
1624     'string' ),
1625
1626 ( 'credit.processor.authorizenet.password',
1627     'Credit card processing: AuthorizeNet password',
1628     '',
1629     'string' ),
1630
1631 ( 'credit.processor.authorizenet.server',
1632     'Credit card processing: AuthorizeNet server',
1633     'Required if using a developer/test account with AuthorizeNet',
1634     'string' ),
1635
1636 ( 'credit.processor.authorizenet.testmode',
1637     'Credit card processing: AuthorizeNet test mode',
1638     '',
1639     'bool' ),
1640
1641 ( 'credit.processor.paypal.enabled',
1642     'Credit card processing: PayPal enabled',
1643     '',
1644     'bool' ),
1645 ( 'credit.processor.paypal.login',
1646     'Credit card processing: PayPal login',
1647     '',
1648     'string' ),
1649 ( 'credit.processor.paypal.password',
1650     'Credit card processing: PayPal password',
1651     '',
1652     'string' ),
1653 ( 'credit.processor.paypal.signature',
1654     'Credit card processing: PayPal signature',
1655     '',
1656     'string' ),
1657 ( 'credit.processor.paypal.testmode',
1658     'Credit card processing: PayPal test mode',
1659     '',
1660     'bool' ),
1661
1662 ( 'ui.admin.work_log.max_entries',
1663     oils_i18n_gettext('ui.admin.work_log.max_entries', 'GUI: Work Log: Maximum Actions Logged', 'coust', 'label'),
1664     oils_i18n_gettext('ui.admin.work_log.max_entries', 'Maximum entries for "Most Recent Staff Actions" section of the Work Log interface.', 'coust', 'description'),
1665   'interval' ),
1666
1667 ( 'ui.admin.patron_log.max_entries',
1668     oils_i18n_gettext('ui.admin.patron_log.max_entries', 'GUI: Work Log: Maximum Patrons Logged', 'coust', 'label'),
1669     oils_i18n_gettext('ui.admin.patron_log.max_entries', 'Maximum entries for "Most Recently Affected Patrons..." section of the Work Log interface.', 'coust', 'description'),
1670   'interval' ),
1671
1672 ( 'lib.courier_code',
1673     oils_i18n_gettext('lib.courier_code', 'Courier Code', 'coust', 'label'),
1674     oils_i18n_gettext('lib.courier_code', 'Courier Code for the library.  Available in transit slip templates as the %courier_code% macro.', 'coust', 'description'),
1675     'string'),
1676
1677 ( 'circ.block_renews_for_holds',
1678     oils_i18n_gettext('circ.block_renews_for_holds', 'Holds: Block Renewal of Items Needed for Holds', 'coust', 'label'),
1679     oils_i18n_gettext('circ.block_renews_for_holds', 'When an item could fulfill a hold, do not allow the current patron to renew', 'coust', 'description'),
1680     'bool' ),
1681
1682 ( 'circ.password_reset_request_per_user_limit',
1683     oils_i18n_gettext('circ.password_reset_request_per_user_limit', 'Circulation: Maximum concurrently active self-serve password reset requests per user', 'coust', 'label'),
1684     oils_i18n_gettext('circ.password_reset_request_per_user_limit', 'When a user has more than this number of concurrently active self-serve password reset requests for their account, prevent the user from creating any new self-serve password reset requests until the number of active requests for the user drops back below this number.', 'coust', 'description'),
1685     'string'),
1686
1687 ( 'circ.password_reset_request_time_to_live',
1688     oils_i18n_gettext('circ.password_reset_request_time_to_live', 'Circulation: Self-serve password reset request time-to-live', 'coust', 'label'),
1689     oils_i18n_gettext('circ.password_reset_request_time_to_live', 'Length of time (in seconds) a self-serve password reset request should remain active.', 'coust', 'description'),
1690     'string'),
1691
1692 ( 'circ.password_reset_request_throttle',
1693     oils_i18n_gettext('circ.password_reset_request_throttle', 'Circulation: Maximum concurrently active self-serve password reset requests', 'coust', 'label'),
1694     oils_i18n_gettext('circ.password_reset_request_throttle', 'Prevent the creation of new self-serve password reset requests until the number of active requests drops back below this number.', 'coust', 'description'),
1695     'string')
1696 ;
1697
1698 INSERT INTO config.org_unit_setting_type ( name, label, description, datatype ) VALUES (
1699         'ui.circ.suppress_checkin_popups',
1700         oils_i18n_gettext(
1701             'ui.circ.suppress_checkin_popups', 
1702             'Circ: Suppress popup-dialogs during check-in.', 
1703             'coust', 
1704             'label'),
1705         oils_i18n_gettext(
1706             'ui.circ.suppress_checkin_popups', 
1707             'Circ: Suppress popup-dialogs during check-in.', 
1708             'coust', 
1709             'description'),
1710         'bool'
1711 );
1712
1713 INSERT INTO config.org_unit_setting_type ( name, label, description, datatype ) VALUES (
1714         'format.date',
1715         oils_i18n_gettext(
1716             'format.date',
1717             'GUI: Format Dates with this pattern.', 
1718             'coust', 
1719             'label'),
1720         oils_i18n_gettext(
1721             'format.date',
1722             'GUI: Format Dates with this pattern (examples: "yyyy-MM-dd" for "2010-04-26", "MMM d, yyyy" for "Apr 26, 2010")', 
1723             'coust', 
1724             'description'),
1725         'string'
1726 ), (
1727         'format.time',
1728         oils_i18n_gettext(
1729             'format.time',
1730             'GUI: Format Times with this pattern.', 
1731             'coust', 
1732             'label'),
1733         oils_i18n_gettext(
1734             'format.time',
1735             'GUI: Format Times with this pattern (examples: "h:m:s.SSS a z" for "2:07:20.666 PM Eastern Daylight Time", "HH:mm" for "14:07")', 
1736             'coust', 
1737             'description'),
1738         'string'
1739 );
1740
1741 INSERT INTO config.org_unit_setting_type ( name, label, description, datatype ) VALUES (
1742         'cat.bib.delete_on_no_copy_via_acq_lineitem_cancel',
1743         oils_i18n_gettext(
1744             'cat.bib.delete_on_no_copy_via_acq_lineitem_cancel',
1745             'CAT: Delete bib if all copies are deleted via Acquisitions lineitem cancellation.', 
1746             'coust', 
1747             'label'),
1748         oils_i18n_gettext(
1749             'cat.bib.delete_on_no_copy_via_acq_lineitem_cancel',
1750             'CAT: Delete bib if all copies are deleted via Acquisitions lineitem cancellation.', 
1751             'coust', 
1752             'description'),
1753         'bool'
1754 );
1755
1756 INSERT INTO config.org_unit_setting_type ( name, label, description, datatype ) VALUES (
1757         'url.remote_column_settings',
1758         oils_i18n_gettext(
1759             'url.remote_column_settings',
1760             'GUI: URL for remote directory containing list column settings.', 
1761             'coust', 
1762             'label'),
1763         oils_i18n_gettext(
1764             'url.remote_column_settings',
1765             'GUI: URL for remote directory containing list column settings.  The format and naming convention for the files found in this directory match those in the local settings directory for a given workstation.  An administrator could create the desired settings locally and then copy all the tree_columns_for_* files to the remote directory.', 
1766             'coust', 
1767             'description'),
1768         'string'
1769 );
1770
1771 INSERT INTO config.org_unit_setting_type ( name, label, description, datatype ) VALUES (
1772         'gui.disable_local_save_columns',
1773         oils_i18n_gettext(
1774             'gui.disable_local_save_columns',
1775             'GUI: Disable the ability to save list column configurations locally.', 
1776             'coust', 
1777             'label'),
1778         oils_i18n_gettext(
1779             'gui.disable_local_save_columns',
1780             'GUI: Disable the ability to save list column configurations locally.  If set, columns may still be manipulated, however, the changes do not persist.  Also, existing local configurations are ignored if this setting is true.', 
1781             'coust', 
1782             'description'),
1783         'bool'
1784 );
1785
1786 INSERT INTO config.org_unit_setting_type ( name, label, description, datatype ) VALUES (
1787         'circ.password_reset_request_requires_matching_email',
1788         oils_i18n_gettext(
1789             'circ.password_reset_request_requires_matching_email',
1790             'Circulation: Require matching email address for password reset requests', 
1791             'coust', 
1792             'label'),
1793         oils_i18n_gettext(
1794             'circ.password_reset_request_requires_matching_email',
1795             'Circulation: Require matching email address for password reset requests', 
1796             'coust', 
1797             'description'),
1798         'bool'
1799 );
1800
1801 INSERT INTO config.org_unit_setting_type ( name, label, description, datatype ) VALUES (
1802         'circ.holds.expired_patron_block',
1803         oils_i18n_gettext(
1804             'circ.holds.expired_patron_block',
1805             'Circulation: Block hold request if hold recipient privileges have expired', 
1806             'coust', 
1807             'label'),
1808         oils_i18n_gettext(
1809             'circ.holds.expired_patron_block',
1810             'Circulation: Block hold request if hold recipient privileges have expired', 
1811             'coust', 
1812             'description'),
1813         'bool'
1814 );
1815
1816 INSERT INTO config.org_unit_setting_type
1817     (name, label, description, datatype) VALUES (
1818         'circ.booking_reservation.default_elbow_room',
1819         oils_i18n_gettext(
1820             'circ.booking_reservation.default_elbow_room',
1821             'Booking: Elbow room',
1822             'coust',
1823             'label'
1824         ),
1825         oils_i18n_gettext(
1826             'circ.booking_reservation.default_elbow_room',
1827             'Elbow room specifies how far in the future you must make a reservation on an item if that item will have to transit to reach its pickup location.  It secondarily defines how soon a reservation on a given item must start before the check-in process will opportunistically capture it for the reservation shelf.',
1828             'coust',
1829             'label'
1830         ),
1831         'interval'
1832     );
1833
1834 -- Org_unit_setting_type(s) that need an fm_class:
1835 INSERT into config.org_unit_setting_type
1836 ( name, label, description, datatype, fm_class ) VALUES
1837 ( 'acq.default_copy_location',
1838   'Default copy location',
1839   null,
1840   'link',
1841   'acpl' );
1842
1843 INSERT INTO config.org_unit_setting_type (name, label, description, datatype) VALUES (
1844     'circ.holds.org_unit_target_weight',
1845     'Holds: Org Unit Target Weight',
1846     'Org Units can be organized into hold target groups based on a weight.  Potential copies from org units with the same weight are chosen at random.',
1847     'integer'
1848 );
1849
1850 INSERT INTO config.org_unit_setting_type (name, label, description, datatype) VALUES (
1851     'circ.holds.target_holds_by_org_unit_weight',
1852     'Holds: Use weight-based hold targeting',
1853     'Use library weight based hold targeting',
1854     'bool'
1855 );
1856
1857 INSERT INTO config.org_unit_setting_type (name, label, description, datatype) VALUES (
1858     'circ.holds.max_org_unit_target_loops',
1859     'Holds: Maximum library target attempts',
1860     'When this value is set and greater than 0, the system will only attempt to find a copy at each possible branch the configured number of times',
1861     'integer'
1862 );
1863
1864
1865 -- Org setting for overriding the circ lib of a precat copy
1866 INSERT INTO config.org_unit_setting_type (name, label, description, datatype) VALUES (
1867     'circ.pre_cat_copy_circ_lib',
1868     'Pre-cat Item Circ Lib',
1869     'Override the default circ lib of "here" with a pre-configured circ lib for pre-cat items.  The value should be the "shortname" (aka policy name) of the org unit',
1870     'string'
1871 );
1872
1873 -- Circ auto-renew interval setting
1874 INSERT INTO config.org_unit_setting_type (name, label, description, datatype) VALUES (
1875     'circ.checkout_auto_renew_age',
1876     'Checkout auto renew age',
1877     'When an item has been checked out for at least this amount of time, an attempt to check out the item to the patron that it is already checked out to will simply renew the circulation',
1878     'interval'
1879 );
1880
1881 -- Setting for behind the desk hold pickups
1882 INSERT INTO config.org_unit_setting_type (name, label, description, datatype) VALUES (
1883     'circ.holds.behind_desk_pickup_supported',
1884     'Holds: Behind Desk Pickup Supported',
1885     'If a branch supports both a public holds shelf and behind-the-desk pickups, set this value to true.  This gives the patron the option to enable behind-the-desk pickups for their holds',
1886     'bool'
1887 );
1888
1889 INSERT INTO config.org_unit_setting_type ( name, label, description, datatype ) VALUES (
1890         'acq.holds.allow_holds_from_purchase_request',
1891         oils_i18n_gettext(
1892             'acq.holds.allow_holds_from_purchase_request', 
1893             'Allows patrons to create automatic holds from purchase requests.', 
1894             'coust', 
1895             'label'),
1896         oils_i18n_gettext(
1897             'acq.holds.allow_holds_from_purchase_request', 
1898             'Allows patrons to create automatic holds from purchase requests.', 
1899             'coust', 
1900             'description'),
1901         'bool'
1902 );
1903
1904 INSERT INTO config.org_unit_setting_type (name, label, description, datatype) VALUES (
1905     'circ.holds.target_skip_me',
1906     'Skip For Hold Targeting',
1907     'When true, don''t target any copies at this org unit for holds',
1908     'bool'
1909 );
1910
1911 -- claims returned mark item missing 
1912 INSERT INTO
1913     config.org_unit_setting_type ( name, label, description, datatype )
1914     VALUES (
1915         'circ.claim_return.mark_missing',
1916         'Claim Return: Mark copy as missing', 
1917         'When a circ is marked as claims-returned, also mark the copy as missing',
1918         'bool'
1919     );
1920
1921 -- claims never checked out mark item missing 
1922 INSERT INTO
1923     config.org_unit_setting_type ( name, label, description, datatype )
1924     VALUES (
1925         'circ.claim_never_checked_out.mark_missing',
1926         'Claim Never Checked Out: Mark copy as missing', 
1927         'When a circ is marked as claims-never-checked-out, mark the copy as missing',
1928         'bool'
1929     );
1930
1931 -- mark damaged void overdue setting
1932 INSERT INTO
1933     config.org_unit_setting_type ( name, label, description, datatype )
1934     VALUES (
1935         'circ.damaged.void_ovedue',
1936         'Mark item damaged voids overdues',
1937         'When an item is marked damaged, overdue fines on the most recent circulation are voided.',
1938         'bool'
1939     );
1940
1941 -- hold cancel display limits
1942 INSERT INTO config.org_unit_setting_type ( name, label, description, datatype )
1943     VALUES (
1944         'circ.holds.canceled.display_count',
1945         'Holds: Canceled holds display count',
1946         'How many canceled holds to show in patron holds interfaces',
1947         'integer'
1948     );
1949
1950 INSERT INTO config.org_unit_setting_type ( name, label, description, datatype )
1951     VALUES (
1952         'circ.holds.canceled.display_age',
1953         'Holds: Canceled holds display age',
1954         'Show all canceled holds that were canceled within this amount of time',
1955         'interval'
1956     );
1957
1958 INSERT INTO config.org_unit_setting_type ( name, label, description, datatype )
1959     VALUES (
1960         'circ.holds.uncancel.reset_request_time',
1961         'Holds: Reset request time on un-cancel',
1962         'When a hold is uncanceled, reset the request time to push it to the end of the queue',
1963         'bool'
1964     );
1965
1966 INSERT INTO config.org_unit_setting_type (name, label, description, datatype)
1967     VALUES (
1968         'circ.holds.default_shelf_expire_interval',
1969         'Default hold shelf expire interval',
1970         '',
1971         'interval'
1972 );
1973
1974 INSERT INTO config.org_unit_setting_type (name, label, description, datatype, fm_class)
1975     VALUES (
1976         'circ.claim_return.copy_status', 
1977         'Claim Return Copy Status', 
1978         'Claims returned copies are put into this status.  Default is to leave the copy in the Checked Out status',
1979         'link', 
1980         'ccs' 
1981     );
1982
1983 INSERT INTO config.org_unit_setting_type ( name, label, description, datatype ) 
1984     VALUES ( 
1985         'circ.max_fine.cap_at_price',
1986         oils_i18n_gettext('circ.max_fine.cap_at_price', 'Circ: Cap Max Fine at Item Price', 'coust', 'label'),
1987         oils_i18n_gettext('circ.max_fine.cap_at_price', 'This prevents the system from charging more than the item price in overdue fines', 'coust', 'description'),
1988         'bool' 
1989     );
1990
1991 INSERT INTO config.org_unit_setting_type ( name, label, description, datatype, fm_class ) 
1992     VALUES ( 
1993         'circ.holds.clear_shelf.copy_status',
1994         oils_i18n_gettext('circ.holds.clear_shelf.copy_status', 'Holds: Clear shelf copy status', 'coust', 'label'),
1995         oils_i18n_gettext('circ.holds.clear_shelf.copy_status', 'Any copies that have not been put into reshelving, in-transit, or on-holds-shelf (for a new hold) during the clear shelf process will be put into this status.  This is basically a purgatory status for copies waiting to be pulled from the shelf and processed by hand', 'coust', 'description'),
1996         'link',
1997         'ccs'
1998     );
1999
2000 INSERT INTO config.org_unit_setting_type ( name, label, description, datatype )
2001     VALUES ( 
2002         'circ.selfcheck.workstation_required',
2003         oils_i18n_gettext('circ.selfcheck.workstation_required', 'Selfcheck: Workstation Required', 'coust', 'label'),
2004         oils_i18n_gettext('circ.selfcheck.workstation_required', 'All selfcheck stations must use a workstation', 'coust', 'description'),
2005         'bool'
2006     ), (
2007         'circ.selfcheck.patron_password_required',
2008         oils_i18n_gettext('circ.selfcheck.patron_password_required', 'Selfcheck: Require Patron Password', 'coust', 'label'),
2009         oils_i18n_gettext('circ.selfcheck.patron_password_required', 'Patron must log in with barcode and password at selfcheck station', 'coust', 'description'),
2010         'bool'
2011     );
2012
2013 INSERT INTO config.org_unit_setting_type ( name, label, description, datatype )
2014     VALUES ( 
2015         'circ.selfcheck.alert.sound',
2016         oils_i18n_gettext('circ.selfcheck.alert.sound', 'Selfcheck: Audio Alerts', 'coust', 'label'),
2017         oils_i18n_gettext('circ.selfcheck.alert.sound', 'Use audio alerts for selfcheck events', 'coust', 'description'),
2018         'bool'
2019     );
2020
2021 INSERT INTO
2022     config.org_unit_setting_type (name, label, description, datatype)
2023     VALUES (
2024         'notice.telephony.callfile_lines',
2025         'Telephony: Arbitrary line(s) to include in each notice callfile',
2026         $$
2027         This overrides lines from opensrf.xml.
2028         Line(s) must be valid for your target server and platform
2029         (e.g. Asterisk 1.4).
2030         $$,
2031         'string'
2032     );
2033
2034 INSERT INTO config.org_unit_setting_type ( name, label, description, datatype )
2035     VALUES ( 
2036         'circ.offline.username_allowed',
2037         oils_i18n_gettext('circ.offline.username_allowed', 'Offline: Patron Usernames Allowed', 'coust', 'label'),
2038         oils_i18n_gettext('circ.offline.username_allowed', 'During offline circulations, allow patrons to identify themselves with usernames in addition to barcode.  For this setting to work, a barcode format must also be defined', 'coust', 'description'),
2039         'bool'
2040     );
2041
2042 INSERT INTO config.org_unit_setting_type ( name, label, description, datatype )
2043 VALUES (
2044     'acq.fund.balance_limit.warn',
2045     oils_i18n_gettext('acq.fund.balance_limit.warn', 'Fund Spending Limit for Warning', 'coust', 'label'),
2046     oils_i18n_gettext('acq.fund.balance_limit.warn', 'When the amount remaining in the fund, including spent money and encumbrances, goes below this percentage, attempts to spend from the fund will result in a warning to the staff.', 'coust', 'descripton'),
2047     'integer'
2048 );
2049
2050 INSERT INTO config.org_unit_setting_type ( name, label, description, datatype )
2051 VALUES (
2052     'acq.fund.balance_limit.block',
2053     oils_i18n_gettext('acq.fund.balance_limit.block', 'Fund Spending Limit for Block', 'coust', 'label'),
2054     oils_i18n_gettext('acq.fund.balance_limit.block', 'When the amount remaining in the fund, including spent money and encumbrances, goes below this percentage, attempts to spend from the fund will be blocked.', 'coust', 'description'),
2055     'integer'
2056 );
2057
2058 INSERT INTO config.org_unit_setting_type ( name, label, description, datatype )
2059     VALUES (
2060         'circ.holds.hold_has_copy_at.alert',
2061         oils_i18n_gettext('circ.holds.hold_has_copy_at.alert', 'Holds: Has Local Copy Alert', 'coust', 'label'),
2062         oils_i18n_gettext('circ.holds.hold_has_copy_at.alert', 'If there is an available copy at the requesting library that could fulfill a hold during hold placement time, alert the patron', 'coust', 'description'),
2063         'bool'
2064     ),(
2065         'circ.holds.hold_has_copy_at.block',
2066         oils_i18n_gettext('circ.holds.hold_has_copy_at.block', 'Holds: Has Local Copy Block', 'coust', 'label'),
2067         oils_i18n_gettext('circ.holds.hold_has_copy_at.block', 'If there is an available copy at the requesting library that could fulfill a hold during hold placement time, do not allow the hold to be placed', 'coust', 'description'),
2068         'bool'
2069     );
2070
2071 INSERT INTO config.org_unit_setting_type ( name, label, description, datatype )
2072 VALUES (
2073     'auth.persistent_login_interval',
2074     oils_i18n_gettext('auth.persistent_login_interval', 'Persistent Login Duration', 'coust', 'label'),
2075     oils_i18n_gettext('auth.persistent_login_interval', 'How long a persistent login lasts.  E.g. ''2 weeks''', 'coust', 'description'),
2076     'interval'
2077 );
2078
2079 INSERT INTO config.org_unit_setting_type ( name, label, description, datatype ) VALUES (
2080         'cat.marc_control_number_identifier',
2081         oils_i18n_gettext(
2082             'cat.marc_control_number_identifier', 
2083             'Cat: Defines the control number identifier used in 003 and 035 fields.', 
2084             'coust', 
2085             'label'),
2086         oils_i18n_gettext(
2087             'cat.marc_control_number_identifier', 
2088             'Cat: Defines the control number identifier used in 003 and 035 fields.', 
2089             'coust', 
2090             'description'),
2091         'string'
2092 );
2093
2094 INSERT INTO config.org_unit_setting_type (name, label, description, datatype) 
2095     VALUES (
2096         'circ.selfcheck.block_checkout_on_copy_status',
2097         oils_i18n_gettext(
2098             'circ.selfcheck.block_checkout_on_copy_status',
2099             'Selfcheck: Block copy checkout status',
2100             'coust',
2101             'label'
2102         ),
2103         oils_i18n_gettext(
2104             'circ.selfcheck.block_checkout_on_copy_status',
2105             'List of copy status IDs that will block checkout even if the generic COPY_NOT_AVAILABLE event is overridden',
2106             'coust',
2107             'description'
2108         ),
2109         'array'
2110     );
2111
2112 INSERT INTO config.org_unit_setting_type ( name, label, description, datatype, fm_class )
2113 VALUES (
2114     'serial.prev_issuance_copy_location',
2115     oils_i18n_gettext(
2116         'serial.prev_issuance_copy_location',
2117         'Serials: Previous Issuance Copy Location',
2118         'coust',
2119         'label'
2120     ),
2121     oils_i18n_gettext(
2122         'serial.prev_issuance_copy_location',
2123         'When a serial issuance is received, copies (units) of the previous issuance will be automatically moved into the configured shelving location',
2124         'coust',
2125         'descripton'
2126         ),
2127     'link',
2128     'acpl'
2129 );
2130
2131 INSERT INTO config.org_unit_setting_type ( name, label, description, datatype, fm_class )
2132 VALUES (
2133     'cat.default_classification_scheme',
2134     oils_i18n_gettext(
2135         'cat.default_classification_scheme',
2136         'Cataloging: Default Classification Scheme',
2137         'coust',
2138         'label'
2139     ),
2140     oils_i18n_gettext(
2141         'cat.default_classification_scheme',
2142         'Defines the default classification scheme for new call numbers: 1 = Generic; 2 = Dewey; 3 = LC',
2143         'coust',
2144         'descripton'
2145         ),
2146     'link',
2147     'acnc'
2148 );
2149
2150 INSERT INTO config.org_unit_setting_type ( name, label, description, datatype ) VALUES (
2151         'opac.org_unit_hiding.depth',
2152         oils_i18n_gettext(
2153             'opac.org_unit_hiding.depth',
2154             'OPAC: Org Unit Hiding Depth', 
2155             'coust', 
2156             'label'),
2157         oils_i18n_gettext(
2158             'opac.org_unit_hiding.depth',
2159             'This will hide certain org units in the public OPAC if the Original Location (url param "ol") for the OPAC inherits this setting.  This setting specifies an org unit depth, that together with the OPAC Original Location determines which section of the Org Hierarchy should be visible in the OPAC.  For example, a stock Evergreen installation will have a 3-tier hierarchy (Consortium/System/Branch), where System has a depth of 1 and Branch has a depth of 2.  If this setting contains a depth of 1 in such an installation, then every library in the System in which the Original Location belongs will be visible, and everything else will be hidden.  A depth of 0 will effectively make every org visible.  The embedded OPAC in the staff client ignores this setting.', 
2160             'coust', 
2161             'description'),
2162         'integer'
2163 );
2164
2165 INSERT INTO config.org_unit_setting_type ( name, label, description, datatype )
2166     VALUES ( 
2167         'circ.holds.clear_shelf.no_capture_holds',
2168         oils_i18n_gettext('circ.holds.clear_shelf.no_capture_holds', 'Holds: Bypass hold capture during clear shelf process', 'coust', 'label'),
2169         oils_i18n_gettext('circ.holds.clear_shelf.no_capture_holds', 'During the clear shelf process, avoid capturing new holds on cleared items.', 'coust', 'description'),
2170         'bool'
2171     );
2172
2173 INSERT INTO config.org_unit_setting_type (name, label, description, datatype) VALUES (
2174     'circ.booking_reservation.stop_circ',
2175     'Disallow circulation of items when they are on booking reserve and that reserve overlaps with the checkout period',
2176     'When true, items on booking reserve during the proposed checkout period will not be allowed to circulate unless overridden with the COPY_RESERVED.override permission.',
2177     'bool'
2178 );
2179
2180 ---------------------------------
2181 -- Seed data for usr_setting_type
2182 ----------------------------------
2183
2184 INSERT INTO config.usr_setting_type (name,opac_visible,label,description,datatype)
2185     VALUES ('opac.default_font', TRUE, 'OPAC Font Size', 'OPAC Font Size', 'string');
2186
2187 INSERT INTO config.usr_setting_type (name,opac_visible,label,description,datatype)
2188     VALUES ('opac.default_search_depth', TRUE, 'OPAC Search Depth', 'OPAC Search Depth', 'integer');
2189
2190 INSERT INTO config.usr_setting_type (name,opac_visible,label,description,datatype)
2191     VALUES ('opac.default_search_location', TRUE, 'OPAC Search Location', 'OPAC Search Location', 'integer');
2192
2193 INSERT INTO config.usr_setting_type (name,opac_visible,label,description,datatype)
2194     VALUES ('opac.hits_per_page', TRUE, 'Hits per Page', 'Hits per Page', 'string');
2195
2196 INSERT INTO config.usr_setting_type (name,opac_visible,label,description,datatype)
2197     VALUES ('opac.hold_notify', TRUE, 'Hold Notification Format', 'Hold Notification Format', 'string');
2198
2199 INSERT INTO config.usr_setting_type (name,opac_visible,label,description,datatype)
2200     VALUES ('staff_client.catalog.record_view.default', TRUE, 'Default Record View', 'Default Record View', 'string');
2201
2202 INSERT INTO config.usr_setting_type (name,opac_visible,label,description,datatype)
2203     VALUES ('staff_client.copy_editor.templates', TRUE, 'Copy Editor Template', 'Copy Editor Template', 'object');
2204
2205 INSERT INTO config.usr_setting_type (name,opac_visible,label,description,datatype)
2206     VALUES ('circ.holds_behind_desk', FALSE, 'Hold is behind Circ Desk', 'Hold is behind Circ Desk', 'bool');
2207
2208 INSERT INTO config.usr_setting_type (name,opac_visible,label,description,datatype)
2209     VALUES (
2210         'history.circ.retention_age',
2211         TRUE,
2212         oils_i18n_gettext('history.circ.retention_age','Historical Circulation Retention Age','cust','label'),
2213         oils_i18n_gettext('history.circ.retention_age','Historical Circulation Retention Age','cust','description'),
2214         'interval'
2215     ),(
2216         'history.circ.retention_start',
2217         FALSE,
2218         oils_i18n_gettext('history.circ.retention_start','Historical Circulation Retention Start Date','cust','label'),
2219         oils_i18n_gettext('history.circ.retention_start','Historical Circulation Retention Start Date','cust','description'),
2220         'date'
2221     );
2222
2223 INSERT INTO config.usr_setting_type (name,opac_visible,label,description,datatype)
2224     VALUES (
2225         'history.hold.retention_age',
2226         TRUE,
2227         oils_i18n_gettext('history.hold.retention_age','Historical Hold Retention Age','cust','label'),
2228         oils_i18n_gettext('history.hold.retention_age','Historical Hold Retention Age','cust','description'),
2229         'interval'
2230     ),(
2231         'history.hold.retention_start',
2232         TRUE,
2233         oils_i18n_gettext('history.hold.retention_start','Historical Hold Retention Start Date','cust','label'),
2234         oils_i18n_gettext('history.hold.retention_start','Historical Hold Retention Start Date','cust','description'),
2235         'interval'
2236     ),(
2237         'history.hold.retention_count',
2238         TRUE,
2239         oils_i18n_gettext('history.hold.retention_count','Historical Hold Retention Count','cust','label'),
2240         oils_i18n_gettext('history.hold.retention_count','Historical Hold Retention Count','cust','description'),
2241         'integer'
2242     );
2243
2244 INSERT INTO config.usr_setting_type (name, opac_visible, label, description, datatype)
2245     VALUES (
2246         'opac.default_sort',
2247         TRUE,
2248         oils_i18n_gettext(
2249             'opac.default_sort',
2250             'OPAC Default Search Sort',
2251             'cust',
2252             'label'
2253         ),
2254         oils_i18n_gettext(
2255             'opac.default_sort',
2256             'OPAC Default Search Sort',
2257             'cust',
2258             'description'
2259         ),
2260         'string'
2261     );
2262
2263 INSERT INTO config.org_unit_setting_type ( name, label, description, datatype, fm_class ) VALUES (
2264         'circ.missing_pieces.copy_status',
2265         oils_i18n_gettext(
2266             'circ.missing_pieces.copy_status',
2267             'Circulation: Item Status for Missing Pieces',
2268             'coust',
2269             'label'),
2270         oils_i18n_gettext(
2271             'circ.missing_pieces.copy_status',
2272             'This is the Item Status to use for items that have been marked or scanned as having Missing Pieces.  In the absence of this setting, the Damaged status is used.',
2273             'coust',
2274             'description'),
2275         'link',
2276         'ccs'
2277 );
2278
2279 INSERT INTO config.org_unit_setting_type ( name, label, description, datatype ) VALUES (
2280         'circ.do_not_tally_claims_returned',
2281         oils_i18n_gettext(
2282             'circ.do_not_tally_claims_returned',
2283             'Circulation: Do not include outstanding Claims Returned circulations in lump sum tallies in Patron Display.',
2284             'coust',
2285             'label'),
2286         oils_i18n_gettext(
2287             'circ.do_not_tally_claims_returned',
2288             'In the Patron Display interface, the number of total active circulations for a given patron is presented in the Summary sidebar and underneath the Items Out navigation button.  This setting will prevent Claims Returned circulations from counting toward these tallies.',
2289             'coust',
2290             'description'),
2291         'bool'
2292 );
2293
2294 INSERT INTO config.org_unit_setting_type (name, label, description, datatype)
2295     VALUES
2296         ('cat.label.font.size',
2297             oils_i18n_gettext('cat.label.font.size',
2298                 'Cataloging: Spine and pocket label font size', 'coust', 'label'),
2299             oils_i18n_gettext('cat.label.font.size',
2300                 'Set the default font size for spine and pocket labels', 'coust', 'description'),
2301             'integer'
2302         )
2303         ,('cat.label.font.family',
2304             oils_i18n_gettext('cat.label.font.family',
2305                 'Cataloging: Spine and pocket label font family', 'coust', 'label'),
2306             oils_i18n_gettext('cat.label.font.family',
2307                 'Set the preferred font family for spine and pocket labels. You can specify a list of fonts, separated by commas, in order of preference; the system will use the first font it finds with a matching name. For example, "Arial, Helvetica, serif".',
2308                 'coust', 'description'),
2309             'string'
2310         )
2311         ,('cat.spine.line.width',
2312             oils_i18n_gettext('cat.spine.line.width',
2313                 'Cataloging: Spine label line width', 'coust', 'label'),
2314             oils_i18n_gettext('cat.spine.line.width',
2315                 'Set the default line width for spine labels in number of characters. This specifies the boundary at which lines must be wrapped.',
2316                 'coust', 'description'),
2317             'integer'
2318         )
2319         ,('cat.spine.line.height',
2320             oils_i18n_gettext('cat.spine.line.height',
2321                 'Cataloging: Spine label maximum lines', 'coust', 'label'),
2322             oils_i18n_gettext('cat.spine.line.height',
2323                 'Set the default maximum number of lines for spine labels.',
2324                 'coust', 'description'),
2325             'integer'
2326         )
2327         ,('cat.spine.line.margin',
2328             oils_i18n_gettext('cat.spine.line.margin',
2329                 'Cataloging: Spine label left margin', 'coust', 'label'),
2330             oils_i18n_gettext('cat.spine.line.margin',
2331                 'Set the left margin for spine labels in number of characters.',
2332                 'coust', 'description'),
2333             'integer'
2334         )
2335 ;
2336
2337 INSERT INTO config.org_unit_setting_type (name, label, description, datatype)
2338     VALUES
2339         ('cat.label.font.weight',
2340             oils_i18n_gettext('cat.label.font.weight',
2341                 'Cataloging: Spine and pocket label font weight', 'coust', 'label'),
2342             oils_i18n_gettext('cat.label.font.weight',
2343                 'Set the preferred font weight for spine and pocket labels. You can specify "normal", "bold", "bolder", or "lighter".',
2344                 'coust', 'description'),
2345             'string'
2346         )
2347 ;
2348
2349 INSERT INTO config.org_unit_setting_type ( name, label, description, datatype ) VALUES (
2350         'circ.patron_edit.clone.copy_address',
2351         oils_i18n_gettext(
2352             'circ.patron_edit.clone.copy_address',
2353             'Patron Registration: Cloned patrons get address copy',
2354             'coust',
2355             'label'
2356         ),
2357         oils_i18n_gettext(
2358             'circ.patron_edit.clone.copy_address',
2359             'In the Patron editor, copy addresses from the cloned user instead of linking directly to the address',
2360             'coust',
2361             'description'
2362         ),
2363         'bool'
2364 );
2365
2366 INSERT INTO config.org_unit_setting_type ( name, label, description, datatype, fm_class ) VALUES (
2367         'ui.patron.default_ident_type',
2368         oils_i18n_gettext(
2369             'ui.patron.default_ident_type',
2370             'GUI: Default Ident Type for Patron Registration',
2371             'coust',
2372             'label'),
2373         oils_i18n_gettext(
2374             'ui.patron.default_ident_type',
2375             'This is the default Ident Type for new users in the patron editor.',
2376             'coust',
2377             'description'),
2378         'link',
2379         'cit'
2380 );
2381
2382 INSERT INTO config.org_unit_setting_type ( name, label, description, datatype ) VALUES (
2383         'ui.patron.default_country',
2384         oils_i18n_gettext(
2385             'ui.patron.default_country',
2386             'GUI: Default Country for New Addresses in Patron Editor',
2387             'coust',
2388             'label'),
2389         oils_i18n_gettext(
2390             'ui.patron.default_country',
2391             'This is the default Country for new addresses in the patron editor.',
2392             'coust',
2393             'description'),
2394         'string'
2395 );
2396
2397 INSERT INTO config.org_unit_setting_type ( name, label, description, datatype ) VALUES (
2398         'ui.patron.registration.require_address',
2399         oils_i18n_gettext(
2400             'ui.patron.registration.require_address',
2401             'GUI: Require at least one address for Patron Registration',
2402             'coust',
2403             'label'),
2404         oils_i18n_gettext(
2405             'ui.patron.registration.require_address',
2406             'Enforces a requirement for having at least one address for a patron during registration.',
2407             'coust',
2408             'description'),
2409         'bool'
2410 );
2411
2412 INSERT INTO config.org_unit_setting_type (
2413     name, label, description, datatype
2414 ) VALUES
2415     ('credit.processor.payflowpro.enabled',
2416         'Credit card processing: Enable PayflowPro payments',
2417         'This is NOT the same thing as the settings labeled with just "PayPal."',
2418         'bool'
2419     ),
2420     ('credit.processor.payflowpro.login',
2421         'Credit card processing: PayflowPro login/merchant ID',
2422         'Often the same thing as the PayPal manager login',
2423         'string'
2424     ),
2425     ('credit.processor.payflowpro.password',
2426         'Credit card processing: PayflowPro password',
2427         'PayflowPro password',
2428         'string'
2429     ),
2430     ('credit.processor.payflowpro.testmode',
2431         'Credit card processing: PayflowPro test mode',
2432         'Do not really process transactions, but stay in test mode - uses pilot-payflowpro.paypal.com instead of the usual host',
2433         'bool'
2434     ),
2435     ('credit.processor.payflowpro.vendor',
2436         'Credit card processing: PayflowPro vendor',
2437         'Often the same thing as the login',
2438         'string'
2439     ),
2440     ('credit.processor.payflowpro.partner',
2441         'Credit card processing: PayflowPro partner',
2442         'Often "PayPal" or "VeriSign", sometimes others',
2443         'string'
2444     );
2445
2446 -- Patch the name of an old selfcheck setting
2447 UPDATE actor.org_unit_setting
2448     SET name = 'circ.selfcheck.alert.popup'
2449     WHERE name = 'circ.selfcheck.alert_on_checkout_event';
2450
2451 -- Rename certain existing org_unit settings, if present,
2452 -- and make sure their values are JSON
2453 UPDATE actor.org_unit_setting SET
2454     name = 'circ.holds.default_estimated_wait_interval',
2455     --
2456     -- The value column should be JSON.  The old value should be a number,
2457     -- but it may or may not be quoted.  The following CASE behaves
2458     -- differently depending on whether value is quoted.  It is simplistic,
2459     -- and will be defeated by leading or trailing white space, or various
2460     -- malformations.
2461     --
2462     value = CASE WHEN SUBSTR( value, 1, 1 ) = '"'
2463                 THEN '"' || SUBSTR( value, 2, LENGTH(value) - 2 ) || ' days"'
2464                 ELSE '"' || value || ' days"'
2465             END
2466 WHERE name = 'circ.hold_estimate_wait_interval';
2467
2468 -- Create types for existing org unit settings
2469 -- not otherwise accounted for
2470
2471 INSERT INTO config.org_unit_setting_type(
2472  name,
2473  label,
2474  description
2475 )
2476 SELECT DISTINCT
2477         name,
2478         name,
2479         'FIXME'
2480 FROM
2481         actor.org_unit_setting
2482 WHERE
2483         name NOT IN (
2484                 SELECT name
2485                 FROM config.org_unit_setting_type
2486         );
2487
2488 -- Add foreign key to org_unit_setting
2489
2490 ALTER TABLE actor.org_unit_setting
2491         ADD FOREIGN KEY (name) REFERENCES config.org_unit_setting_type (name)
2492                 DEFERRABLE INITIALLY DEFERRED;
2493
2494 -- Create types for existing user settings
2495 -- not otherwise accounted for
2496
2497 INSERT INTO config.usr_setting_type (
2498         name,
2499         label,
2500         description
2501 )
2502 SELECT DISTINCT
2503         name,
2504         name,
2505         'FIXME'
2506 FROM
2507         actor.usr_setting
2508 WHERE
2509         name NOT IN (
2510                 SELECT name
2511                 FROM config.usr_setting_type
2512         );
2513
2514 -- Add foreign key to user_setting_type
2515
2516 ALTER TABLE actor.usr_setting
2517         ADD FOREIGN KEY (name) REFERENCES config.usr_setting_type (name)
2518                 ON DELETE CASCADE ON UPDATE CASCADE
2519                 DEFERRABLE INITIALLY DEFERRED;
2520
2521 INSERT INTO actor.org_unit_setting (org_unit, name, value) VALUES
2522     (1, 'cat.spine.line.margin', 0)
2523     ,(1, 'cat.spine.line.height', 9)
2524     ,(1, 'cat.spine.line.width', 8)
2525     ,(1, 'cat.label.font.family', '"monospace"')
2526     ,(1, 'cat.label.font.size', 10)
2527     ,(1, 'cat.label.font.weight', '"normal"')
2528 ;
2529
2530 ALTER TABLE action_trigger.event_definition ADD COLUMN granularity TEXT;
2531 ALTER TABLE action_trigger.event ADD COLUMN async_output BIGINT REFERENCES action_trigger.event_output (id);
2532 ALTER TABLE action_trigger.event_definition ADD COLUMN usr_field TEXT;
2533 ALTER TABLE action_trigger.event_definition ADD COLUMN opt_in_setting TEXT REFERENCES config.usr_setting_type (name) DEFERRABLE INITIALLY DEFERRED;
2534
2535 CREATE OR REPLACE FUNCTION is_json( TEXT ) RETURNS BOOL AS $f$
2536     use JSON::XS;
2537     my $json = shift();
2538     eval { JSON::XS->new->allow_nonref->decode( $json ) };
2539     return $@ ? 0 : 1;
2540 $f$ LANGUAGE PLPERLU;
2541
2542 ALTER TABLE action_trigger.event ADD COLUMN user_data TEXT CHECK (user_data IS NULL OR is_json( user_data ));
2543
2544 INSERT INTO action_trigger.hook (key,core_type,description) VALUES (
2545     'hold_request.cancel.expire_no_target',
2546     'ahr',
2547     'A hold is cancelled because no copies were found'
2548 );
2549
2550 INSERT INTO action_trigger.hook (key,core_type,description) VALUES (
2551     'hold_request.cancel.expire_holds_shelf',
2552     'ahr',
2553     'A hold is cancelled because it was on the holds shelf too long'
2554 );
2555
2556 INSERT INTO action_trigger.hook (key,core_type,description) VALUES (
2557     'hold_request.cancel.staff',
2558     'ahr',
2559     'A hold is cancelled because it was cancelled by staff'
2560 );
2561
2562 INSERT INTO action_trigger.hook (key,core_type,description) VALUES (
2563     'hold_request.cancel.patron',
2564     'ahr',
2565     'A hold is cancelled by the patron'
2566 );
2567
2568 -- Fix typos in descriptions
2569 UPDATE action_trigger.hook SET description = 'A hold is successfully placed' WHERE key = 'hold_request.success';
2570 UPDATE action_trigger.hook SET description = 'A hold is attempted but not successfully placed' WHERE key = 'hold_request.failure';
2571
2572 -- Add a hook for renewals
2573 INSERT INTO action_trigger.hook (key,core_type,description) VALUES ('renewal','circ','Item renewed to user');
2574
2575 INSERT INTO action_trigger.validator (module,description) VALUES ('MaxPassiveDelayAge','Check that the event is not too far past the delay_field time -- requires a max_delay_age interval parameter');
2576
2577 -- Sample Pre-due Notice --
2578
2579 INSERT INTO action_trigger.event_definition (id, active, owner, name, hook, validator, reactor, delay, delay_field, group_field, template) 
2580     VALUES (6, 'f', 1, '3 Day Courtesy Notice', 'checkout.due', 'CircIsOpen', 'SendEmail', '-3 days', 'due_date', 'usr', 
2581 $$
2582 [%- USE date -%]
2583 [%- user = target.0.usr -%]
2584 To: [%- params.recipient_email || user.email %]
2585 From: [%- params.sender_email || default_sender %]
2586 Subject: Courtesy Notice
2587
2588 Dear [% user.family_name %], [% user.first_given_name %]
2589 As a reminder, the following items are due in 3 days.
2590
2591 [% FOR circ IN target %]
2592     [%- copy_details = helpers.get_copy_bib_basics(circ.target_copy.id) -%]
2593     Title: [% copy_details.title %]
2594     Author: [% copy_details.author %]
2595     Call Number: [% circ.target_copy.call_number.label %]
2596     Barcode: [% circ.target_copy.barcode %] 
2597     Due: [% date.format(helpers.format_date(circ.due_date), '%Y-%m-%d') %]
2598     Item Cost: [% helpers.get_copy_price(circ.target_copy) %]
2599     Library: [% circ.circ_lib.name %]
2600     Library Phone: [% circ.circ_lib.phone %]
2601 [% END %]
2602
2603 $$);
2604
2605 INSERT INTO action_trigger.environment (event_def, path) VALUES 
2606     (6, 'target_copy.call_number'),
2607     (6, 'target_copy.location'),
2608     (6, 'usr'),
2609     (6, 'circ_lib.billing_address');
2610
2611 INSERT INTO action_trigger.event_params (event_def, param, value) VALUES
2612     (6, 'max_delay_age', '"1 day"');
2613
2614 -- also add the max delay age to the default overdue notice event def
2615 INSERT INTO action_trigger.event_params (event_def, param, value) VALUES
2616     (1, 'max_delay_age', '"1 day"');
2617   
2618 INSERT INTO action_trigger.validator (module,description) VALUES ('MinPassiveTargetAge','Check that the target is old enough to be used by this event -- requires a min_target_age interval parameter, and accepts an optional target_age_field to specify what time to use for offsetting');
2619
2620 INSERT INTO action_trigger.reactor (module,description) VALUES ('ApplyPatronPenalty','Applies the configured penalty to a patron.  Required named environment variables are "user", which refers to the user object, and "context_org", which refers to the org_unit object that acts as the focus for the penalty.');
2621
2622 INSERT INTO action_trigger.hook (
2623         key,
2624         core_type,
2625         description,
2626         passive
2627     ) VALUES (
2628         'hold_request.shelf_expires_soon',
2629         'ahr',
2630         'A hold on the shelf will expire there soon.',
2631         TRUE
2632     );
2633
2634 INSERT INTO action_trigger.event_definition (
2635         id,
2636         active,
2637         owner,
2638         name,
2639         hook,
2640         validator,
2641         reactor,
2642         delay,
2643         delay_field,
2644         group_field,
2645         template
2646     ) VALUES (
2647         7,
2648         FALSE,
2649         1,
2650         'Hold Expires from Shelf Soon',
2651         'hold_request.shelf_expires_soon',
2652         'HoldIsAvailable',
2653         'SendEmail',
2654         '- 1 DAY',
2655         'shelf_expire_time',
2656         'usr',
2657 $$
2658 [%- USE date -%]
2659 [%- user = target.0.usr -%]
2660 To: [%- params.recipient_email || user.email %]
2661 From: [%- params.sender_email || default_sender %]
2662 Subject: Hold Available Notification
2663
2664 Dear [% user.family_name %], [% user.first_given_name %]
2665 You requested holds on the following item(s), which are available for
2666 pickup, but these holds will soon expire.
2667
2668 [% FOR hold IN target %]
2669     [%- data = helpers.get_copy_bib_basics(hold.current_copy.id) -%]
2670     Title: [% data.title %]
2671     Author: [% data.author %]
2672     Library: [% hold.pickup_lib.name %]
2673 [% END %]
2674 $$
2675     );
2676
2677 INSERT INTO action_trigger.environment (
2678         event_def,
2679         path
2680     ) VALUES
2681     ( 7, 'current_copy'),
2682     ( 7, 'pickup_lib.billing_address'),
2683     ( 7, 'usr');
2684
2685 INSERT INTO action_trigger.hook (
2686         key,
2687         core_type,
2688         description,
2689         passive
2690     ) VALUES (
2691         'hold_request.long_wait',
2692         'ahr',
2693         'A patron has been waiting on a hold to be fulfilled for a long time.',
2694         TRUE
2695     );
2696
2697 INSERT INTO action_trigger.event_definition (
2698         id,
2699         active,
2700         owner,
2701         name,
2702         hook,
2703         validator,
2704         reactor,
2705         delay,
2706         delay_field,
2707         group_field,
2708         template
2709     ) VALUES (
2710         9,
2711         FALSE,
2712         1,
2713         'Hold waiting for pickup for long time',
2714         'hold_request.long_wait',
2715         'NOOP_True',
2716         'SendEmail',
2717         '6 MONTHS',
2718         'request_time',
2719         'usr',
2720 $$
2721 [%- USE date -%]
2722 [%- user = target.0.usr -%]
2723 To: [%- params.recipient_email || user.email %]
2724 From: [%- params.sender_email || default_sender %]
2725 Subject: Long Wait Hold Notification
2726
2727 Dear [% user.family_name %], [% user.first_given_name %]
2728
2729 You requested hold(s) on the following item(s), but unfortunately
2730 we have not been able to fulfill your request after a considerable
2731 length of time.  If you would still like to receive these items,
2732 no action is required.
2733
2734 [% FOR hold IN target %]
2735     [%- copy_details = helpers.get_copy_bib_basics(hold.current_copy.id) -%]
2736     Title: [% copy_details.title %]
2737     Author: [% copy_details.author %]
2738 [% END %]
2739 $$
2740 );
2741
2742 INSERT INTO action_trigger.environment (
2743         event_def,
2744         path
2745     ) VALUES
2746     (9, 'pickup_lib'),
2747     (9, 'usr'),
2748     (9, 'current_copy.call_number');
2749
2750 INSERT INTO action_trigger.hook (key, core_type, description, passive) 
2751     VALUES (
2752         'format.selfcheck.checkout',
2753         'circ',
2754         'Formats circ objects for self-checkout receipt',
2755         TRUE
2756     );
2757
2758 INSERT INTO action_trigger.event_definition (id, active, owner, name, hook, validator, reactor, group_field, granularity, template )
2759     VALUES (
2760         10,
2761         TRUE,
2762         1,
2763         'Self-Checkout Receipt',
2764         'format.selfcheck.checkout',
2765         'NOOP_True',
2766         'ProcessTemplate',
2767         'usr',
2768         'print-on-demand',
2769 $$
2770 [%- USE date -%]
2771 [%- SET user = target.0.usr -%]
2772 [%- SET lib = target.0.circ_lib -%]
2773 [%- SET lib_addr = target.0.circ_lib.billing_address -%]
2774 [%- SET hours = lib.hours_of_operation -%]
2775 <div>
2776     <style> li { padding: 8px; margin 5px; }</style>
2777     <div>[% date.format %]</div>
2778     <div>[% lib.name %]</div>
2779     <div>[% lib_addr.street1 %] [% lib_addr.street2 %]</div>
2780     <div>[% lib_addr.city %], [% lib_addr.state %] [% lb_addr.post_code %]</div>
2781     <div>[% lib.phone %]</div>
2782     <br/>
2783
2784     [% user.family_name %], [% user.first_given_name %]
2785     <ol>
2786     [% FOR circ IN target %]
2787         [%-
2788             SET idx = loop.count - 1;
2789             SET udata =  user_data.$idx
2790         -%]
2791         <li>
2792             <div>[% helpers.get_copy_bib_basics(circ.target_copy.id).title %]</div>
2793             <div>Barcode: [% circ.target_copy.barcode %]</div>
2794             [% IF udata.renewal_failure %]
2795                 <div style='color:red;'>Renewal Failed</div>
2796             [% ELSE %]
2797                 <div>Due Date: [% date.format(helpers.format_date(circ.due_date), '%Y-%m-%d') %]</div>
2798             [% END %]
2799         </li>
2800     [% END %]
2801     </ol>
2802     
2803     <div>
2804         Library Hours
2805         [%- BLOCK format_time; date.format(time _ ' 1/1/1000', format='%I:%M %p'); END -%]
2806         <div>
2807             Monday 
2808             [% PROCESS format_time time = hours.dow_0_open %] 
2809             [% PROCESS format_time time = hours.dow_0_close %] 
2810         </div>
2811         <div>
2812             Tuesday 
2813             [% PROCESS format_time time = hours.dow_1_open %] 
2814             [% PROCESS format_time time = hours.dow_1_close %] 
2815         </div>
2816         <div>
2817             Wednesday 
2818             [% PROCESS format_time time = hours.dow_2_open %] 
2819             [% PROCESS format_time time = hours.dow_2_close %] 
2820         </div>
2821         <div>
2822             Thursday
2823             [% PROCESS format_time time = hours.dow_3_open %] 
2824             [% PROCESS format_time time = hours.dow_3_close %] 
2825         </div>
2826         <div>
2827             Friday
2828             [% PROCESS format_time time = hours.dow_4_open %] 
2829             [% PROCESS format_time time = hours.dow_4_close %] 
2830         </div>
2831         <div>
2832             Saturday
2833             [% PROCESS format_time time = hours.dow_5_open %] 
2834             [% PROCESS format_time time = hours.dow_5_close %] 
2835         </div>
2836         <div>
2837             Sunday 
2838             [% PROCESS format_time time = hours.dow_6_open %] 
2839             [% PROCESS format_time time = hours.dow_6_close %] 
2840         </div>
2841     </div>
2842 </div>
2843 $$
2844 );
2845
2846 INSERT INTO action_trigger.environment ( event_def, path) VALUES
2847     ( 10, 'target_copy'),
2848     ( 10, 'circ_lib.billing_address'),
2849     ( 10, 'circ_lib.hours_of_operation'),
2850     ( 10, 'usr');
2851
2852 INSERT INTO action_trigger.hook (key, core_type, description, passive) 
2853     VALUES (
2854         'format.selfcheck.items_out',
2855         'circ',
2856         'Formats items out for self-checkout receipt',
2857         TRUE
2858     );
2859
2860 INSERT INTO action_trigger.event_definition (id, active, owner, name, hook, validator, reactor, group_field, granularity, template )
2861     VALUES (
2862         11,
2863         TRUE,
2864         1,
2865         'Self-Checkout Items Out Receipt',
2866         'format.selfcheck.items_out',
2867         'NOOP_True',
2868         'ProcessTemplate',
2869         'usr',
2870         'print-on-demand',
2871 $$
2872 [%- USE date -%]
2873 [%- SET user = target.0.usr -%]
2874 <div>
2875     <style> li { padding: 8px; margin 5px; }</style>
2876     <div>[% date.format %]</div>
2877     <br/>
2878
2879     [% user.family_name %], [% user.first_given_name %]
2880     <ol>
2881     [% FOR circ IN target %]
2882         <li>
2883             <div>[% helpers.get_copy_bib_basics(circ.target_copy.id).title %]</div>
2884             <div>Barcode: [% circ.target_copy.barcode %]</div>
2885             <div>Due Date: [% date.format(helpers.format_date(circ.due_date), '%Y-%m-%d') %]</div>
2886         </li>
2887     [% END %]
2888     </ol>
2889 </div>
2890 $$
2891 );
2892
2893
2894 INSERT INTO action_trigger.environment ( event_def, path) VALUES
2895     ( 11, 'target_copy'),
2896     ( 11, 'circ_lib.billing_address'),
2897     ( 11, 'circ_lib.hours_of_operation'),
2898     ( 11, 'usr');
2899
2900 INSERT INTO action_trigger.hook (key, core_type, description, passive) 
2901     VALUES (
2902         'format.selfcheck.holds',
2903         'ahr',
2904         'Formats holds for self-checkout receipt',
2905         TRUE
2906     );
2907
2908 INSERT INTO action_trigger.event_definition (id, active, owner, name, hook, validator, reactor, group_field, granularity, template )
2909     VALUES (
2910         12,
2911         TRUE,
2912         1,
2913         'Self-Checkout Holds Receipt',
2914         'format.selfcheck.holds',
2915         'NOOP_True',
2916         'ProcessTemplate',
2917         'usr',
2918         'print-on-demand',
2919 $$
2920 [%- USE date -%]
2921 [%- SET user = target.0.usr -%]
2922 <div>
2923     <style> li { padding: 8px; margin 5px; }</style>
2924     <div>[% date.format %]</div>
2925     <br/>