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