LP1718782: Add the Srce fixed field to the Angular MARC editor
[evergreen-equinox.git] / Open-ILS / src / sql / Pg / 950.data.seed-values.sql
index 9637a21..528ed56 100644 (file)
@@ -1,10 +1,11 @@
---002.schema.config.sql:
 INSERT INTO config.bib_source (id, quality, source, transcendant, can_have_copies) VALUES 
     (1, 90, oils_i18n_gettext(1, 'oclc', 'cbs', 'source'), FALSE, TRUE);
 INSERT INTO config.bib_source (id, quality, source, transcendant, can_have_copies) VALUES 
     (2, 10, oils_i18n_gettext(2, 'System Local', 'cbs', 'source'), FALSE, TRUE);
 INSERT INTO config.bib_source (id, quality, source, transcendant, can_have_copies) VALUES 
     (3, 1, oils_i18n_gettext(3, 'Project Gutenberg', 'cbs', 'source'), TRUE, TRUE);
+INSERT INTO config.bib_source (id, quality, source, transcendant, can_have_copies) VALUES
+    (4, 1, oils_i18n_gettext(4, 'Course materials module', 'cbs', 'source'), TRUE, FALSE);
 SELECT SETVAL('config.bib_source_id_seq'::TEXT, 100);
 
 INSERT INTO biblio.peer_type (id,name) VALUES
@@ -322,7 +323,7 @@ INSERT INTO config.metabib_field (id, field_class, name, format,
 VALUES (
     52, 'identifier', 'origin_info', 'marcxml',
     oils_i18n_gettext(52, 'Origin Info', 'cmf', 'label'),
-    $$//*[@tag='260']$$,
+    $$//*[@tag='260' or @tag='264'][1]$$,
     $$//*[local-name()='subfield' and contains('abc',@code)]$$,
     TRUE, FALSE, FALSE
 );
@@ -1923,7 +1924,43 @@ INSERT INTO permission.perm_list ( id, code, description ) VALUES
  ( 613, 'ADMIN_CAROUSEL', oils_i18n_gettext(613,
     'Allow a user to manage carousels', 'ppl', 'description')),
  ( 614, 'REFRESH_CAROUSEL', oils_i18n_gettext(614,
-    'Allow a user to refresh carousels', 'ppl', 'description'))
+    'Allow a user to refresh carousels', 'ppl', 'description')),
+ ( 615, 'ADMIN_REMOTEAUTH', oils_i18n_gettext( 615,
+    'Administer remote patron authentication', 'ppl', 'description' )),
+ ( 616, 'IMPORT_USE_ORG_UNIT_COPIES', oils_i18n_gettext( 616,
+    'Allows users to import records based on the number of org unit copies attached to a record', 'ppl', 'description' )),
+ ( 617, 'IMPORT_ON_ORDER_CAT_COPY', oils_i18n_gettext( 617,
+    'Allows users to import copies based on the on-order items attached to a record', 'ppl', 'description' )),
+ ( 618, 'CREATE_PRECAT', oils_i18n_gettext(618,
+    'Allows a user to create a pre-catalogued copy', 'ppl', 'description')),
+ ( 619, 'EDIT_SELF_IN_CLIENT', oils_i18n_gettext(619,
+    'Allow a user to edit their own account in the staff client', 'ppl', 'description')),
+ ( 620, 'UPDATE_ORG_UNIT_SETTING.opac.patron.custom_css', oils_i18n_gettext(620,
+    'Update CSS setting for the OPAC', 'ppl', 'description')),
+ ( 621, 'VIEW_BOOKING_RESOURCE_TYPE', oils_i18n_gettext(621,
+    'View booking resource types', 'ppl', 'description')),
+ ( 622, 'VIEW_BOOKING_RESOURCE', oils_i18n_gettext(622,
+    'View booking resources', 'ppl', 'description')),
+ ( 623, 'UPDATE_ORG_UNIT_SETTING.opac.matomo', oils_i18n_gettext(623,
+    'Allows a user to configure Matomo Analytics org unit settings', 'ppl', 'description')),
+ ( 624, 'MANAGE_RESERVES', oils_i18n_gettext(624,
+    'Allows user to manage Courses, Course Materials, and associate Users with Courses.', 'ppl', 'description')),
+ ( 625, 'VIEW_BOOKING_RESERVATION', oils_i18n_gettext(625,
+    'View booking reservations', 'ppl', 'description')),
+ ( 626, 'VIEW_BOOKING_RESERVATION_ATTR_MAP', oils_i18n_gettext(626,
+    'View booking reservation attribute maps', 'ppl', 'description')),
+ ( 627, 'SSO_ADMIN', oils_i18n_gettext(627,
+    'Modify patron SSO settings', 'ppl', 'description')),
+ ( 628, 'MANAGE_HOLD_GROUPS', oils_i18n_gettext(628,
+    'Manage batch (subscription) hold events', 'ppl', 'description')),
+ ( 629, 'ADMIN_LIBRARY_GROUPS', oils_i18n_gettext(629,
+    'Administer library groups', 'ppl', 'description')),
+ ( 630, 'VIEW_GEOLOCATION_SERVICES', oils_i18n_gettext(630,
+    'View geographic location services', 'ppl', 'description')),
+ ( 631, 'ADMIN_GEOLOCATION_SERVICES', oils_i18n_gettext(631,
+    'Administer geographic location services', 'ppl', 'description')),
+ ( 632, 'UPDATE_USER_PHOTO_URL', oils_i18n_gettext(632,
+    'Update the user photo url field in patron registration and editor', 'ppl', 'description'))
 ;
 
 
@@ -2017,6 +2054,7 @@ INSERT INTO permission.grp_perm_map (grp, perm, depth, grantable)
                aout.name = 'Consortium' AND
                perm.code IN (
                        'CREATE_COPY_TRANSIT',
+                       'CREATE_PRECAT',
                        'VIEW_BILLING_TYPE',
                        'VIEW_CIRCULATIONS',
                        'VIEW_COPY_NOTES',
@@ -2081,6 +2119,7 @@ INSERT INTO permission.grp_perm_map (grp, perm, depth, grantable)
                        'TRANSIT_COPY',
                        'UPDATE_CONTAINER',
                        'VIEW_CONTAINER',
+                       'VIEW_COPY_ALERT',
                        'VIEW_COPY_CHECKOUT_HISTORY',
                        'VIEW_COPY_NOTES',
                        'VIEW_HOLD',
@@ -2159,6 +2198,7 @@ INSERT INTO permission.grp_perm_map (grp, perm, depth, grantable)
                        'CREATE_BIB_IMPORT_QUEUE',
                        'CREATE_IMPORT_ITEM',
                        'CREATE_MARC',
+                       'CREATE_PRECAT',
                        'CREATE_TITLE_NOTE',
                        'DELETE_BIB_IMPORT_QUEUE',
                        'DELETE_IMPORT_ITEM',
@@ -2252,6 +2292,7 @@ INSERT INTO permission.grp_perm_map (grp, perm, depth, grantable)
                        'CREATE_IMPORT_TRASH_FIELD',
                        'CREATE_MERGE_PROFILE',
                        'CREATE_MONOGRAPH_PART',
+                       'CREATE_PRECAT',
                        'CREATE_VOLUME_PREFIX',
                        'CREATE_VOLUME_SUFFIX',
                        'DELETE_AUTHORITY_IMPORT_IMPORT_FIELD_DEF',
@@ -2288,6 +2329,7 @@ INSERT INTO permission.grp_perm_map (grp, perm, depth, grantable)
                pgt.name = 'Cataloging Administrator' AND
                aout.name = 'System' AND
                perm.code IN (
+                       'ADMIN_COPY_ALERT',
                        'CREATE_COPY_STAT_CAT',
                        'CREATE_COPY_STAT_CAT_ENTRY',
                        'CREATE_COPY_STAT_CAT_ENTRY_MAP',
@@ -2327,6 +2369,7 @@ INSERT INTO permission.grp_perm_map (grp, perm, depth, grantable)
                        'ADMIN_BOOKING_RESOURCE_ATTR_VALUE',
                        'ADMIN_BOOKING_RESOURCE_TYPE',
                        'ASSIGN_GROUP_PERM',
+                       'CREATE_PRECAT',
                        'MARK_ITEM_AVAILABLE',
                        'MARK_ITEM_BINDERY',
                        'MARK_ITEM_CHECKED_OUT',
@@ -2351,6 +2394,10 @@ INSERT INTO permission.grp_perm_map (grp, perm, depth, grantable)
                        'UPDATE_PAYMENT_NOTE',
                        'UPDATE_PICKUP_LIB FROM_TRANSIT',
                        'UPDATE_PICKUP_LIB_FROM_HOLDS_SHELF',
+                       'VIEW_BOOKING_RESOURCE',
+                       'VIEW_BOOKING_RESOURCE_TYPE',
+                       'VIEW_BOOKING_RESERVATION',
+                       'VIEW_BOOKING_RESERVATION_ATTR_MAP',
                        'VIEW_GROUP_PENALTY_THRESHOLD',
                        'VIEW_STANDING_PENALTY',
                        'VOID_BILLING',
@@ -2396,7 +2443,8 @@ INSERT INTO permission.grp_perm_map (grp, perm, depth, grantable)
                        'PATRON_EXCEEDS_FINES.override',
                        'PATRON_EXCEEDS_OVERDUE_COUNT.override',
                        'RETRIEVE_RESERVATION_PULL_LIST',
-                       'UPDATE_HOLD');
+                       'UPDATE_HOLD',
+            'UPDATE_USER_PHOTO_URL');
 
 
 -- Add advanced circulation permissions to the Circulation Admin group
@@ -2427,7 +2475,9 @@ INSERT INTO permission.grp_perm_map (grp, perm, depth, grantable)
                perm.code IN (
                        'ADMIN_MAX_FINE_RULE',
                        'CREATE_CIRC_DURATION',
+                       'CREATE_PRECAT',
                        'DELETE_CIRC_DURATION',
+            'MANAGE_RESERVES',
                        'MARK_ITEM_MISSING_PIECES',
                        'UPDATE_CIRC_DURATION',
                        'UPDATE_HOLD_REQUEST_TIME',
@@ -2510,6 +2560,10 @@ INSERT INTO permission.grp_perm_map (grp, perm, depth, grantable)
                        'UPDATE_PICKUP_LIB_FROM_HOLDS_SHELF',
                        'UPDATE_PICKUP_LIB_FROM_TRANSIT',
                        'UPDATE_USER',
+                       'VIEW_BOOKING_RESOURCE',
+                       'VIEW_BOOKING_RESOURCE_TYPE',
+                       'VIEW_BOOKING_RESERVATION',
+                       'VIEW_BOOKING_RESERVATION_ATTR_MAP',
                        'VIEW_REPORT_OUTPUT',
                        'VIEW_STANDING_PENALTY',
                        'VOID_BILLING',
@@ -2601,6 +2655,13 @@ INSERT INTO permission.grp_perm_map (grp, perm, depth, grantable)
                pgt.name = 'Acquisitions' AND
                aout.name = 'Consortium' AND
                perm.code IN (
+                       'ACQ_ADD_LINEITEM_IDENTIFIER',
+                       'ACQ_INVOICE-REOPEN',
+                       'ACQ_SET_LINEITEM_IDENTIFIER',
+                       'ADMIN_ACQ_FUND',
+                       'ADMIN_ACQ_DISTRIB_FORMULA',
+                       'ADMIN_FUND',
+                       'ADMIN_INVOICE',
                        'ALLOW_ALT_TCN',
                        'CLEAR_PURCHASE_REQUEST',
                        'CREATE_BIB_IMPORT_QUEUE',
@@ -2608,6 +2669,7 @@ INSERT INTO permission.grp_perm_map (grp, perm, depth, grantable)
                        'CREATE_INVOICE',
                        'CREATE_MARC',
                        'CREATE_PICKLIST',
+                       'CREATE_PRECAT',
                        'CREATE_PURCHASE_ORDER',
                        'DELETE_BIB_IMPORT_QUEUE',
                        'DELETE_IMPORT_ITEM',
@@ -2616,6 +2678,7 @@ INSERT INTO permission.grp_perm_map (grp, perm, depth, grantable)
                        'DELETE_VOLUME_NOTE',
                        'GENERAL_ACQ',
                        'IMPORT_ACQ_LINEITEM_BIB_RECORD',
+                       'IMPORT_ACQ_LINEITEM_BIB_RECORD_UPLOAD',
                        'IMPORT_MARC',
                        'MANAGE_CLAIM',
                        'MANAGE_FUND',
@@ -2658,6 +2721,8 @@ INSERT INTO permission.grp_perm_map (grp, perm, depth, grantable)
                        'VIEW_PICKLIST',
                        'VIEW_PROVIDER',
                        'VIEW_PURCHASE_ORDER',
+                       'VIEW_IMPORT_MATCH_SET',
+                       'VIEW_MERGE_PROFILE',
                        'VIEW_REPORT_OUTPUT');
 
 
@@ -2716,6 +2781,31 @@ INSERT INTO permission.grp_perm_map (grp, perm, depth, grantable)
                        'UPDATE_ACQ_FUNDING_SOURCE',
                        'UPDATE_INVOICE_ITEM_TYPE',
                        'UPDATE_INVOICE_METHOD',
+                       'VIEW_FUND',
+                       'VIEW_FUNDING_SOURCE',
+                       'VIEW_FUND_ALLOCATION',
+                       'VIEW_PICKLIST',
+                       'VIEW_PROVIDER',
+                       'VIEW_PURCHASE_ORDER',
+                       'VIEW_INVOICE',
+                       'CREATE_PICKLIST',
+                       'ACQ_ADD_LINEITEM_IDENTIFIER',
+                       'ACQ_SET_LINEITEM_IDENTIFIER',
+                       'MANAGE_FUND',
+                       'CREATE_INVOICE',
+                       'CREATE_PURCHASE_ORDER',
+                       'IMPORT_ACQ_LINEITEM_BIB_RECORD',
+                       'IMPORT_ACQ_LINEITEM_BIB_RECORD_UPLOAD',
+                       'MANAGE_CLAIM',
+                       'MANAGE_PROVIDER',
+                       'MANAGE_FUNDING_SOURCE',
+                       'RECEIVE_PURCHASE_ORDER',
+                       'ADMIN_ACQ_LINEITEM_ALERT_TEXT',
+                       'UPDATE_FUNDING_SOURCE',
+                       'UPDATE_PROVIDER',
+                       'VIEW_IMPORT_MATCH_SET',
+                       'VIEW_MERGE_PROFILE',
+                       'IMPORT_MARC',
                        'UPDATE_PICKLIST'
                );
 
@@ -2825,6 +2915,7 @@ INSERT INTO action.hold_request_cancel_cause (id,label) VALUES (4, oils_i18n_get
 INSERT INTO action.hold_request_cancel_cause (id,label) VALUES (5, oils_i18n_gettext(5, 'Staff forced', 'ahrcc', 'label'));
 INSERT INTO action.hold_request_cancel_cause (id,label) VALUES (6, oils_i18n_gettext(6, 'Patron via OPAC', 'ahrcc', 'label'));
 INSERT INTO action.hold_request_cancel_cause (id,label) VALUES (7, oils_i18n_gettext(7, 'Patron via SIP', 'ahrcc', 'label'));
+INSERT INTO action.hold_request_cancel_cause (id,label) VALUES (8, oils_i18n_gettext(8, 'Hold Group Event rollback', 'ahrcc', 'label'));
 SELECT SETVAL('action.hold_request_cancel_cause_id_seq', 100);
 
 
@@ -2949,6 +3040,32 @@ INSERT INTO config.usr_setting_type (name,opac_visible,label,description,datatyp
         'string'
     );
 
+INSERT INTO config.usr_setting_type (
+    name,
+    opac_visible,
+    label,
+    description,
+    datatype,
+    reg_default
+) VALUES (
+    'circ.default_overdue_notices_enabled',
+    TRUE,
+    oils_i18n_gettext(
+        'circ.default_overdue_notices_enabled',
+        'Receive Overdue and Courtesy Emails',
+        'cust',
+        'label'
+    ),
+    oils_i18n_gettext(
+        'circ.default_overdue_notices_enabled',
+        'Receive overdue and predue email notifications',
+        'cust',
+        'description'
+    ),
+    'bool',
+    'true'
+);
+
 -- Add groups for org_unit settings
 INSERT INTO config.settings_group (name, label) VALUES
 ('acq', oils_i18n_gettext('acq', 'Acquisitions', 'csg', 'label')),
@@ -3540,6 +3657,15 @@ INSERT into config.org_unit_setting_type
         'coust', 'description'),
     'bool', null)
 
+,( 'circ.renew.expired_patron_allow', 'circ',
+    oils_i18n_gettext('circ.renew.expired_patron_allow',
+        'Allow renewal request if renewal recipient privileges have expired',
+        'coust', 'label'),
+    oils_i18n_gettext('circ.renew.expired_patron_allow',
+        'If enabled, users within the org unit who are expired may still renew items.',
+        'coust', 'description'),
+    'bool', null)
+
 ,( 'circ.holds.hold_has_copy_at.alert', 'holds',
     oils_i18n_gettext('circ.holds.hold_has_copy_at.alert',
         'Has Local Copy Alert',
@@ -3765,6 +3891,40 @@ INSERT into config.org_unit_setting_type
         'coust', 'description'),
     'bool', null)
 
+,( 'circ.course_materials_opt_in', 'circ',
+    oils_i18n_gettext(
+        'circ.course_materials_opt_in',
+        'Opt Org Unit into the Course Materials Module',
+        'coust', 'label'),
+    oils_i18n_gettext(
+        'circ.course_materials_opt_in',
+        'If enabled, the Org Unit will utilize Course Material functionality.',
+        'coust', 'description'),
+    'bool', null)
+
+,( 'circ.course_materials_browse_by_instructor', 'circ',
+    oils_i18n_gettext(
+        'circ.course_materials_browse_by_instructor',
+        'Allow users to browse Courses by Instructor',
+        'coust', 'label'),
+    oils_i18n_gettext(
+        'circ.course_materials_browse_by_instructor',
+        'If enabled, the Org Unit will allow OPAC users to browse Courses by instructor name.',
+        'coust', 'description'),
+    'bool', null)
+
+,( 'circ.course_materials_brief_record_bib_source', 'circ',
+    oils_i18n_gettext(
+        'circ.course_materials_brief_record_bib_source',
+        'Bib source for brief records created in the course materials module',
+        'coust', 'label'),
+    oils_i18n_gettext(
+        'circ.course_materials_brief_record_bib_source',
+        'The course materials module will use this bib source for any new brief bibliographic records made inside that module. For best results, use a transcendant bib source.',
+        'coust', 'description'),
+    'link', 'cbs')
+
+
 ,( 'circ.password_reset_request_per_user_limit', 'sec',
     oils_i18n_gettext('circ.password_reset_request_per_user_limit',
         'Maximum concurrently active self-serve password reset requests per user',
@@ -3932,7 +4092,7 @@ INSERT into config.org_unit_setting_type
         'Content of alert_text include',
         'coust', 'label'),
     oils_i18n_gettext('circ.staff_client.receipt.alert_text',
-        'Text/HTML/Macros to be inserted into receipt templates in place of %INCLUDE(alert_text)%',
+        'Text to be inserted into Print Templates in place of {{includes.alert_text}}',
         'coust', 'description'),
     'string', null)
 
@@ -3941,7 +4101,7 @@ INSERT into config.org_unit_setting_type
         'Content of event_text include',
         'coust', 'label'),
     oils_i18n_gettext('circ.staff_client.receipt.event_text',
-        'Text/HTML/Macros to be inserted into receipt templates in place of %INCLUDE(event_text)%',
+        'Text to be inserted into Print Templates in place of {{includes.event_text}}',
         'coust', 'description'),
     'string', null)
 
@@ -3950,7 +4110,7 @@ INSERT into config.org_unit_setting_type
         'Content of footer_text include',
         'coust', 'label'),
     oils_i18n_gettext('circ.staff_client.receipt.footer_text',
-        'Text/HTML/Macros to be inserted into receipt templates in place of %INCLUDE(footer_text)%',
+        'Text to be inserted into Print Templates in place of {{includes.footer_text}}',
         'coust', 'description'),
     'string', null)
 
@@ -3959,7 +4119,7 @@ INSERT into config.org_unit_setting_type
         'Content of header_text include',
         'coust', 'label'),
     oils_i18n_gettext('circ.staff_client.receipt.header_text',
-        'Text/HTML/Macros to be inserted into receipt templates in place of %INCLUDE(header_text)%',
+        'Text to be inserted into Print Templates in place of {{includes.header_text}}',
         'coust', 'description'),
     'string', null)
 
@@ -3968,7 +4128,7 @@ INSERT into config.org_unit_setting_type
         'Content of notice_text include',
         'coust', 'label'),
     oils_i18n_gettext('circ.staff_client.receipt.notice_text',
-        'Text/HTML/Macros to be inserted into receipt templates in place of %INCLUDE(notice_text)%',
+        'Text to be inserted into Print Templates in place of {{includes.notice_text}}',
         'coust', 'description'),
     'string', null)
 
@@ -4390,6 +4550,15 @@ INSERT into config.org_unit_setting_type
         'coust', 'description'),
     'integer', null)
 
+,( 'opac.patron.custom_css', 'opac',
+    oils_i18n_gettext('opac.patron.custom_css',
+        'Custom CSS for the OPAC',
+        'coust', 'label'),
+    oils_i18n_gettext('opac.patron.custom_css',
+        'Custom CSS for the OPAC',
+        'coust', 'description'),
+    'string', NULL)
+
 ,( 'opac.payment_history_age_limit', 'opac',
     oils_i18n_gettext('opac.payment_history_age_limit',
         'Payment History Age Limit',
@@ -4905,6 +5074,15 @@ INSERT into config.org_unit_setting_type
         'coust', 'description'),
     'bool', null)
 
+,( 'ui.patron.edit.au.ident_value.require', 'gui',
+    oils_i18n_gettext('ui.patron.edit.au.ident_value.require',
+        'require ident_value field on patron registration',
+        'coust', 'label'),
+    oils_i18n_gettext('ui.patron.edit.au.ident_value.require',
+        'The ident_value field will be required on the patron registration screen.',
+        'coust', 'description'),
+    'bool', null)
+
 ,( 'ui.patron.edit.au.ident_value.show', 'gui',
     oils_i18n_gettext('ui.patron.edit.au.ident_value.show',
         'Show ident_value field on patron registration',
@@ -5517,6 +5695,30 @@ INSERT into config.org_unit_setting_type
      'For staff-placed holds, in the absence of a patron preferred pickup location, fall back to using the staff workstation OU (rather than patron home OU)',
      'coust', 'description'),
    'bool', null)
+,( 'ui.patron.edit.au.photo_url.require', 'gui',
+    oils_i18n_gettext('ui.patron.edit.au.photo_url.require',
+        'Require Photo URL field on patron registration',
+        'coust', 'label'),
+    oils_i18n_gettext('ui.patron.edit.au.photo_url.require',
+        'The Photo URL field will be required on the patron registration screen.',
+        'coust', 'description'),
+    'bool', null)
+,( 'ui.patron.edit.au.photo_url.show', 'gui',
+    oils_i18n_gettext('ui.patron.edit.au.photo_url.show',
+        'Show Photo URL field on patron registration',
+        'coust', 'label'),
+    oils_i18n_gettext('ui.patron.edit.au.photo_url.show',
+        'The Photo URL field will be shown on the patron registration screen. Showing a field makes it appear with required fields even when not required. If the field is required this setting is ignored.',
+        'coust', 'description'),
+    'bool', null)
+,( 'ui.patron.edit.au.photo_url.suggest', 'gui',
+    oils_i18n_gettext('ui.patron.edit.au.photo_url.suggest',
+        'Suggest Photo URL field on patron registration',
+        'coust', 'label'),
+    oils_i18n_gettext('ui.patron.edit.au.photo_url.suggest',
+        'The Photo URL field will be suggested on the patron registration screen. Suggesting a field makes it appear when suggested fields are shown. If the field is shown or required this setting is ignored.',
+        'coust', 'description'),
+    'bool', null)
 ;
 
 UPDATE config.org_unit_setting_type
@@ -5529,6 +5731,11 @@ UPDATE config.org_unit_setting_type
         WHERE code = 'ADMIN_CREDIT_CARD_PROCESSING' LIMIT 1)
     WHERE name LIKE 'credit.processor%' AND update_perm IS NULL;
 
+UPDATE config.org_unit_setting_type
+    SET update_perm = (SELECT id FROM permission.perm_list
+        WHERE code = 'UPDATE_ORG_UNIT_SETTING.opac.patron.custom_css' LIMIT 1)
+    WHERE name = 'opac.patron.custom_css' AND update_perm IS NULL;
+
 -- *** Has to go below coust definition to satisfy referential integrity ***
 -- In booking, elbow room defines:
 --  a) how far in the future you must make a reservation on a given item if
@@ -5680,6 +5887,7 @@ INSERT INTO container.user_bucket_type (code,label) VALUES ('folks:hold.view', o
 INSERT INTO container.user_bucket_type (code,label) VALUES ('folks:hold.cancel', oils_i18n_gettext('folks:hold.cancel', 'Cancel Holds', 'cubt', 'label'));
 
 INSERT INTO container.user_bucket_type (code,label) SELECT code,label FROM container.copy_bucket_type where code = 'staff_client';
+INSERT INTO container.user_bucket_type (code,label) VALUES ('hold_subscription', oils_i18n_gettext('hold_subscription', 'Hold Group Container', 'cubt', 'label'));
 
 ----------------------------------
 -- MARC21 record structure data --
@@ -6575,6 +6783,14 @@ INSERT INTO config.marc21_ff_pos_map (fixed_field, tag, rec_type,start_pos, leng
 INSERT INTO config.marc21_ff_pos_map (fixed_field, tag, rec_type,start_pos, length, default_val) VALUES ('MRec', '008', 'VIS', 38, 1, ' ');
 INSERT INTO config.marc21_ff_pos_map (fixed_field, tag, rec_type,start_pos, length, default_val) VALUES ('S/L', '006', 'SER', 17, 1, '0');
 INSERT INTO config.marc21_ff_pos_map (fixed_field, tag, rec_type,start_pos, length, default_val) VALUES ('S/L', '008', 'SER', 34, 1, '0');
+INSERT INTO config.marc21_ff_pos_map (fixed_field, tag, rec_type,start_pos, length, default_val) VALUES ('Srce', '008', 'BKS', 39, 1, ' ');
+INSERT INTO config.marc21_ff_pos_map (fixed_field, tag, rec_type,start_pos, length, default_val) VALUES ('Srce', '008', 'COM', 39, 1, ' ');
+INSERT INTO config.marc21_ff_pos_map (fixed_field, tag, rec_type,start_pos, length, default_val) VALUES ('Srce', '008', 'MAP', 39, 1, ' ');
+INSERT INTO config.marc21_ff_pos_map (fixed_field, tag, rec_type,start_pos, length, default_val) VALUES ('Srce', '008', 'MIX', 39, 1, ' ');
+INSERT INTO config.marc21_ff_pos_map (fixed_field, tag, rec_type,start_pos, length, default_val) VALUES ('Srce', '008', 'REC', 39, 1, ' ');
+INSERT INTO config.marc21_ff_pos_map (fixed_field, tag, rec_type,start_pos, length, default_val) VALUES ('Srce', '008', 'SCO', 39, 1, ' ');
+INSERT INTO config.marc21_ff_pos_map (fixed_field, tag, rec_type,start_pos, length, default_val) VALUES ('Srce', '008', 'SER', 39, 1, ' ');
+INSERT INTO config.marc21_ff_pos_map (fixed_field, tag, rec_type,start_pos, length, default_val) VALUES ('Srce', '008', 'VIS', 39, 1, ' ');
 INSERT INTO config.marc21_ff_pos_map (fixed_field, tag, rec_type,start_pos, length, default_val) VALUES ('TMat', '006', 'VIS', 16, 1, ' ');
 INSERT INTO config.marc21_ff_pos_map (fixed_field, tag, rec_type,start_pos, length, default_val) VALUES ('TMat', '008', 'VIS', 33, 1, ' ');
 INSERT INTO config.marc21_ff_pos_map (fixed_field, tag, rec_type,start_pos, length, default_val) VALUES ('Type', 'ldr', 'BKS', 6, 1, 'a');
@@ -6760,6 +6976,7 @@ INSERT INTO config.record_attr_definition (name,label,fixed_field) values ('lang
 INSERT INTO config.record_attr_definition (name,label,fixed_field,description) values ('lit_form','LitF','LitF',oils_i18n_gettext('lit_form', 'Literary Form', 'crad', 'description'));
 INSERT INTO config.record_attr_definition (name,label,fixed_field) values ('mrec','MRec','MRec');
 INSERT INTO config.record_attr_definition (name,label,fixed_field) values ('ff_sl','S/L','S/L');
+INSERT INTO config.record_attr_definition (name,label,fixed_field) values ('srce','Srce','Srce');
 INSERT INTO config.record_attr_definition (name,label,fixed_field) values ('type_mat','TMat','TMat');
 INSERT INTO config.record_attr_definition (name,label,fixed_field,multi,description) values ('item_type','Type','Type',FALSE,oils_i18n_gettext('item_type', 'Item Type', 'crad', 'description'));
 INSERT INTO config.record_attr_definition (name,label,phys_char_sf,description) values ('vr_format','Videorecording format',72,oils_i18n_gettext('vr_format', 'Video Format', 'crad', 'description'));
@@ -7490,7 +7707,10 @@ INSERT INTO config.coded_value_map
     oils_i18n_gettext(584, 'Phonograph music recording', 'ccvm', 'search_label')),
 (585, 'icon_format', 'lpbook', 
     oils_i18n_gettext(585, 'Large Print Book', 'ccvm', 'value'),
-    oils_i18n_gettext(585, 'Large Print Book', 'ccvm', 'search_label'));
+    oils_i18n_gettext(585, 'Large Print Book', 'ccvm', 'search_label')),
+(1736,'icon_format','preloadedaudio',
+        oils_i18n_gettext(1736, 'Preloaded Audio', 'ccvm', 'value'),
+        oils_i18n_gettext(1736, 'Preloaded Audio', 'ccvm', 'search_label'));
 
 INSERT INTO config.coded_value_map (id, ctype, code, value) VALUES 
 (586, 'item_form', 'o', oils_i18n_gettext('586', 'Online', 'ccvm', 'value')),
@@ -7653,7 +7873,13 @@ INSERT INTO config.coded_value_map
     oils_i18n_gettext(632, 'All Music', 'ccvm', 'search_label')),
 (633, 'search_format', 'blu-ray', 
     oils_i18n_gettext(633, 'Blu-ray', 'ccvm', 'value'),
-    oils_i18n_gettext(633, 'Blu-ray', 'ccvm', 'search_label'));
+    oils_i18n_gettext(633, 'Blu-ray', 'ccvm', 'search_label')),
+(1737,'search_format','preloadedaudio',
+    oils_i18n_gettext(1737, 'Preloaded Audio', 'ccvm', 'value'),
+    oils_i18n_gettext(1737, 'Preloaded Audio', 'ccvm', 'search_label')),
+(1738,'search_format','video',
+    oils_i18n_gettext(1738, 'All Videos', 'ccvm', 'value'),
+    oils_i18n_gettext(1738, 'All Videos', 'ccvm', 'search_label'));
 
 -- Electronic search format, not opac_visible
 INSERT INTO config.coded_value_map
@@ -9063,6 +9289,11 @@ INSERT INTO config.coded_value_map (id, ctype, code, value, opac_visible) VALUES
 INSERT INTO config.coded_value_map (id, ctype, code, value, opac_visible) VALUES (1733, 'ills4', 'o', oils_i18n_gettext('1733', 'Photographs', 'ccvm', 'value'), FALSE);
 INSERT INTO config.coded_value_map (id, ctype, code, value, opac_visible) VALUES (1734, 'ills4', 'p', oils_i18n_gettext('1734', 'Illuminations', 'ccvm', 'value'), FALSE);
 
+INSERT INTO config.coded_value_map (id, ctype, code, value) VALUES
+(1750, 'srce', ' ', oils_i18n_gettext('1750', 'National bibliographic agency', 'ccvm', 'value')),
+(1751, 'srce', 'c', oils_i18n_gettext('1751', 'Cooperative cataloging program', 'ccvm', 'value')),
+(1752, 'srce', 'd', oils_i18n_gettext('1752', 'Other', 'ccvm', 'value'));
+
 
 -- carve out a slot of 10k IDs for stock CCVMs
 SELECT SETVAL('config.coded_value_map_id_seq'::TEXT, 10000);
@@ -9152,6 +9383,15 @@ INSERT INTO config.composite_attr_entry_definition
     (coded_value, definition) VALUES
 (712, '[{"_attr":"item_form","_val":"s"},{"_attr":"item_form","_val":"o"}]');
 
+--preloaded audio
+INSERT INTO config.composite_attr_entry_definition
+    (coded_value, definition) VALUES
+(1736,'{"0":{"_attr":"item_type","_val":"i"},"1":{"_attr":"item_form","_val":"q"}}');
+
+--all videos
+INSERT INTO config.composite_attr_entry_definition (coded_value, definition) VALUES
+    (1738, '{"_attr":"item_type","_val":"g"}');
+
 -- use the definitions from the icon_format as the basis for the MR hold format definitions
 DO $$
     DECLARE format TEXT;
@@ -9327,13 +9567,12 @@ INSERT INTO config.composite_attr_entry_definition (coded_value, definition) VAL
 INSERT INTO config.composite_attr_entry_definition (coded_value, definition) VALUES (1673, '[{"_attr":"ills4","_val":"p"},{"_attr":"ills3","_val":"p"},{"_attr":"ills2","_val":"p"},{"_attr":"ills1","_val":"p"}]');
 
 
-
 -- Trigger Event Definitions -------------------------------------------------
 
 -- Sample Overdue Notice --
 
-INSERT INTO action_trigger.event_definition (id, active, owner, name, hook, validator, reactor, delay, delay_field, group_field, max_delay, template) 
-    VALUES (1, 'f', 1, '7 Day Overdue Email Notification', 'checkout.due', 'CircIsOverdue', 'SendEmail', '7 days', 'due_date', 'usr', '8 days', 
+INSERT INTO action_trigger.event_definition (id, active, owner, name, hook, validator, reactor, delay, delay_field, group_field, max_delay, opt_in_setting, usr_field, template)
+    VALUES (1, 'f', 1, '7 Day Overdue Email Notification', 'checkout.due', 'CircIsOverdue', 'SendEmail', '7 days', 'due_date', 'usr', '8 days', 'circ.default_overdue_notices_enabled', 'usr',
 $$
 [%- USE date -%]
 [%- user = target.0.usr -%]
@@ -9530,7 +9769,7 @@ date <b>[% date.format(date.now, '%Y%m%d') %]</b>
   </tr>
   [% END %]
   <tr>
-    <td/><td/><td/><td/>
+    <td></td><td></td><td></td><td></td>
     <td>Subtotal</td>
     <td>[% subtotal %]</td>
   </tr>
@@ -10364,6 +10603,55 @@ INSERT INTO action_trigger.environment (event_def, path ) VALUES
 
 -- END of autorenwal trigger def stuff
 
+
+-- Patron card request definitions and email notification template
+
+INSERT INTO action_trigger.hook
+(key,core_type,description,passive)
+VALUES
+('stgu.created','stgu','Patron requested a card using self registration','t');
+
+
+INSERT INTO action_trigger.event_definition(active,owner,name,hook,validator,reactor,delay,max_delay,delay_field,group_field,template,retention_interval)
+SELECT 'f',1,'Patron Registered for a card stgu.created','stgu.created','NOOP_True','SendEmail','00:01:00'::interval,'1 day'::interval,'row_date','home_ou',
+$$[%- USE date -%]
+[%- lib = target.0.home_ou -%]
+To: [% lib.name %] <[% params.recipient_email || helpers.get_org_setting(target.0.home_ou.id, 'org.bounced_emails') || lib.email || default_sender %]>
+From: [% lib.name %] <[%  helpers.get_org_setting(target.0.home_ou.id, 'org.bounced_emails') || lib.email || params.recipient_email || default_sender %]>
+Date: [% date.format(format => '%a, %d %b %Y %H:%M:%S %Z') %]
+Subject: Patron card requested
+Auto-Submitted: auto-generated
+
+
+Dear Staff Admin,
+
+There are some pending patrons waiting for your attention.
+
+[% FOR patron IN target %]
+    [% patron.first_given_name %]
+
+[% END %]
+
+These requests can be tended via the staff interface. Located "Circulation" -> "Pending Patrons"
+
+
+
+$$,
+'1 year'::interval
+
+WHERE NOT EXISTS (SELECT 1 FROM action_trigger.event_definition WHERE name='Patron Registered for a card stgu.created');
+
+INSERT INTO action_trigger.environment (event_def,path)
+SELECT id,'home_ou' from action_trigger.event_definition WHERE name='Patron Registered for a card stgu.created'
+AND NOT EXISTS (SELECT 1 FROM action_trigger.environment WHERE
+event_def=(SELECT id FROM action_trigger.event_definition WHERE name='Patron Registered for a card stgu.created' AND owner=1 LIMIT 1)
+AND path='home_ou');
+
+
+
+-- END of Patron card request trigger def stuff
+
+
 -- Action Trigger for Fine Limit Exceeded--
 
 INSERT INTO action_trigger.event_definition (active, owner, name, hook, validator, reactor, delay, group_field, max_delay, template) 
@@ -10640,8 +10928,8 @@ INSERT INTO config.record_attr_index_norm_map (attr,norm,pos)
 
 -- Sample Pre-due Notice --
 
-INSERT INTO action_trigger.event_definition (id, active, owner, name, hook, validator, reactor, delay, delay_field, group_field, max_delay, template) 
-    VALUES (6, 'f', 1, '3 Day Courtesy Notice', 'checkout.due', 'CircIsOpen', 'SendEmail', '-3 days', 'due_date', 'usr', '-2 days',
+INSERT INTO action_trigger.event_definition (id, active, owner, name, hook, validator, reactor, delay, delay_field, group_field, max_delay, opt_in_setting, usr_field, template)
+    VALUES (6, 'f', 1, '3 Day Courtesy Notice', 'checkout.due', 'CircIsOpen', 'SendEmail', '-3 days', 'due_date', 'usr', '-2 days', 'circ.default_overdue_notices_enabled', 'usr',
 $$
 [%- USE date -%]
 [%- user = target.0.usr -%]
@@ -11703,6 +11991,7 @@ Transaction ID: [% xact_id %]
                     [% CASE "check_payment" %]check
                     [% CASE "credit_card_payment" %]credit card
                     [%- IF mp.credit_card_payment.cc_number %] ([% mp.credit_card_payment.cc_number %])[% END %]
+                    [% CASE "debit_card_payment" %]debit card
                     [% CASE "credit_payment" %]credit
                     [% CASE "forgive_payment" %]forgiveness
                     [% CASE "goods_payment" %]goods
@@ -11875,42 +12164,49 @@ INSERT INTO action_trigger.event_definition (
 $$
 [%- USE date -%]
 [%- SET user = target.0.owner -%]
-To: [%- params.recipient_email || user.email %]
+To: [%- params.recipient_email || user_data.0.email || user.email %]
 From: [%- params.sender_email || default_sender %]
 Date: [%- date.format(date.now, '%a, %d %b %Y %T -0000', gmt => 1) %]
-Subject: Bibliographic Records
+Subject: [%- user_data.0.subject || 'Bibliographic Records' %]
 Auto-Submitted: auto-generated
 
-[% FOR cbreb IN target %]
-[% FOR item IN cbreb.items;
-    bre_id = item.target_biblio_record_entry;
+[%- FOR cbreb IN target;
 
-    bibxml = helpers.unapi_bre(bre_id, {flesh => '{mra}'});
-    title = '';
-    FOR part IN bibxml.findnodes('//*[@tag="245"]/*[@code="a" or @code="b"]');
-        title = title _ part.textContent;
+    flesh_list = '{mra';
+    IF user_data.0.type == 'full';
+        flesh_list = flesh_list _ ',holdings_xml,acp';
+        IF params.holdings_limit;
+            flimit = 'acn=>' _ params.holdings_limit _ ',acp=>' _ params.holdings_limit;
+        END;
     END;
-
-    author = bibxml.findnodes('//*[@tag="100"]/*[@code="a"]').textContent;
-    item_type = bibxml.findnodes('//*[local-name()="attributes"]/*[local-name()="field"][@name="item_type"]').getAttribute('coded-value');
-    publisher = bibxml.findnodes('//*[@tag="260"]/*[@code="b"]').textContent;
-    pubdate = bibxml.findnodes('//*[@tag="260"]/*[@code="c"]').textContent;
-    isbn = bibxml.findnodes('//*[@tag="020"]/*[@code="a"]').textContent;
-    issn = bibxml.findnodes('//*[@tag="022"]/*[@code="a"]').textContent;
-    upc = bibxml.findnodes('//*[@tag="024"]/*[@code="a"]').textContent;
-%]
-
-[% loop.count %]/[% loop.size %].  Bib ID# [% bre_id %] 
-[% IF isbn %]ISBN: [% isbn _ "\n" %][% END -%]
-[% IF issn %]ISSN: [% issn _ "\n" %][% END -%]
-[% IF upc  %]UPC:  [% upc _ "\n" %] [% END -%]
-Title: [% title %]
-Author: [% author %]
-Publication Info: [% publisher %] [% pubdate %]
-Item Type: [% item_type %]
-
-[% END %]
-[% END %]
+    flesh_list = flesh_list _ '}';
+
+    item_list = helpers.sort_bucket_unapi_bre(cbreb.items,{flesh => flesh_list, site => user_data.0.context_org, flesh_limit => flimit}, user_data.0.sort_by, user_data.0.sort_dir);
+
+FOR item IN item_list -%]
+
+[% loop.count %]/[% loop.size %].  Bib ID# [% item.id %]
+[% IF item.isbn %]ISBN: [% item.isbn _ "\n" %][% END -%]
+[% IF item.issn %]ISSN: [% item.issn _ "\n" %][% END -%]
+[% IF item.upc  %]UPC:  [% item.upc _ "\n" %][% END -%]
+Title: [% item.title %]
+[% IF item.author %]Author: [% item.author _ "\n" %][% END -%]
+Publication Info: [% item.publisher %] [% item.pubdate %]
+Item Type: [% item.item_type %]
+[% IF user_data.0.type == 'full' && item.holdings.size == 0 %]
+ * No items for this record at the selected location
+[%- END %]
+[% FOR cp IN item.holdings -%]
+ * Library: [% cp.circ_lib %]
+   Location: [% cp.location %]
+   Call Number: [% cp.prefix _ ' ' _ cp.callnumber _ ' ' _ cp.suffix %]
+[% IF cp.parts %]   Parts: [% cp.parts _ "\n" %][% END -%]
+   Status: [% cp.status_label %]
+   Barcode: [% cp.barcode %]
+
+[% END -%]
+[%- END -%]
+[%- END -%]
 $$
     )
     ,(
 <div>
     <style> li { padding: 8px; margin 5px; }</style>
     <ol>
-    [% FOR cbreb IN target %]
-    [% FOR item IN cbreb.items;
-        bre_id = item.target_biblio_record_entry;
-
-        bibxml = helpers.unapi_bre(bre_id, {flesh => '{mra}'});
-        title = '';
-        FOR part IN bibxml.findnodes('//*[@tag="245"]/*[@code="a" or @code="b"]');
-            title = title _ part.textContent;
-        END;
+    [% FOR cbreb IN target;
 
-        author = bibxml.findnodes('//*[@tag="100"]/*[@code="a"]').textContent;
-        item_type = bibxml.findnodes('//*[local-name()="attributes"]/*[local-name()="field"][@name="item_type"]').getAttribute('coded-value');
-        publisher = bibxml.findnodes('//*[@tag="260"]/*[@code="b"]').textContent;
-        pubdate = bibxml.findnodes('//*[@tag="260"]/*[@code="c"]').textContent;
-        isbn = bibxml.findnodes('//*[@tag="020"]/*[@code="a"]').textContent;
-        %]
+    flesh_list = '{mra';
+    IF user_data.0.type == 'full';
+        flesh_list = flesh_list _ ',holdings_xml,acp';
+        IF params.holdings_limit;
+            flimit = 'acn=>' _ params.holdings_limit _ ',acp=>' _ params.holdings_limit;
+        END;
+    END;
+    flesh_list = flesh_list _ '}';
 
+    item_list = helpers.sort_bucket_unapi_bre(cbreb.items,{flesh => flesh_list, site => user_data.0.context_org, flesh_limit => flimit}, user_data.0.sort_by, user_data.0.sort_dir);
+    FOR item IN item_list %]
         <li>
-            Bib ID# [% bre_id %] ISBN: [% isbn %]<br />
-            Title: [% title %]<br />
-            Author: [% author %]<br />
-            Publication Info: [% publisher %] [% pubdate %]<br/>
-            Item Type: [% item_type %]
+            Bib ID# [% item.id %]<br />
+            [% IF item.isbn %]ISBN: [% item.isbn %]<br />[% END %]
+            [% IF item.issn %]ISSN: [% item.issn %]<br />[% END %]
+            [% IF item.upc  %]UPC:  [% item.upc %]<br />[% END %]
+            Title: [% item.title %]<br />
+[% IF item.author %]            Author: [% item.author %]<br />[% END -%]
+            Publication Info: [% item.publisher %] [% item.pubdate %]<br/>
+            Item Type: [% item.item_type %]
+            <ul>
+            [% IF user_data.0.type == 'full' && item.holdings.size == 0 %]
+                <li>No items for this record at the selected location</li>
+            [% END %]
+            [% FOR cp IN item.holdings -%]
+                <li>
+                    Library: [% cp.circ_lib %]<br/>
+                    Location: [% cp.location %]<br/>
+                    Call Number: [% cp.prefix _ ' ' _ cp.callnumber _ ' ' _ cp.suffix %]<br/>
+                    [% IF cp.parts %]Parts: [% cp.parts %]<br/>[% END %]
+                    Status: [% cp.status_label %]<br/>
+                    Barcode: [% cp.barcode %]
+                </li>
+            [% END %]
+            </ul>
         </li>
     [% END %]
     [% END %]
@@ -15962,6 +16272,14 @@ INSERT INTO config.best_hold_order (
     1, 2, 3, 4, 5, 6, 7, 8
 );
 
+INSERT INTO config.best_hold_order (
+    name,
+    owning_lib_to_home_lib_prox, hprox, approx, pprox, aprox, priority, cut, depth, rtime
+) VALUES (
+    'Traditional with Holds-chase-home-lib-patrons',
+    1, 2, 3, 4, 5, 6, 7, 8, 9
+);
+
 INSERT INTO actor.org_unit_setting (
     org_unit, name, value
 ) VALUES (
@@ -16465,6 +16783,15 @@ INSERT INTO action_trigger.environment (event_def, path) VALUES
 INSERT INTO action_trigger.hook (key, core_type, description, passive)
     VALUES ('au.created', 'au', 'A user was created', 't');
        
+INSERT INTO action_trigger.hook (key, core_type, description, passive)
+    VALUES ('au.updated', 'au', 'A user was updated', 't');
+       
+INSERT INTO action_trigger.hook (key, core_type, description, passive)
+    VALUES ('au.barcode_changed', 'au', 'A card was updated or created for an existing user', 't');
+       
+INSERT INTO action_trigger.hook (key, core_type, description, passive)
+    VALUES ('au.renewed', 'au', 'A user was renewed by having their expire date changed', 't');
+
 --SQL to create event definition for new account creation notice
 --Inactive, owned by top of org tree by default.  Modify to suit needs.
 
@@ -16725,12 +17052,13 @@ VALUES (
     ),
     oils_i18n_gettext(
         'ui.circ.items_out.longoverdue',
-'Value is a numeric code, describing which list the circulation '||
-'should appear while checked out and whether the circulation should '||
-'continue to appear in the bottom list, when checked in with '||
+'Value is a numeric code, describing: A. In which tab ("Items Checked Out", '||
+'or "Other/Special Circulations") the circulation '||
+'should appear while checked out, and B. Whether the circulation should '||
+'continue to appear in the "Other" tab when checked in with '||
 'oustanding fines.  '||
-'1 = top list, bottom list.  2 = bottom list, bottom list.  ' ||
-'5 = top list, do not display.  6 = bottom list, do not display.',
+'1 = (A) "Items", (B) "Other".  2 = (A) "Other", (B) "Other".  ' ||
+'5 = (A) "Items", (B) do not display.  6 = (A) "Other", (B) do not display.',
         'coust',
         'description'
     )
@@ -16744,12 +17072,13 @@ VALUES (
     ),
     oils_i18n_gettext(
         'ui.circ.items_out.lost',
-'Value is a numeric code, describing which list the circulation '||
-'should appear while checked out and whether the circulation should '||
-'continue to appear in the bottom list, when checked in with '||
+'Value is a numeric code, describing: A. In which tab ("Items Checked Out", '||
+'or "Other/Special Circulations") the circulation '||
+'should appear while checked out, and B. Whether the circulation should '||
+'continue to appear in the "Other" tab when checked in with '||
 'oustanding fines.  '||
-'1 = top list, bottom list.  2 = bottom list, bottom list.  ' ||
-'5 = top list, do not display.  6 = bottom list, do not display.',
+'1 = (A) "Items", (B) "Other".  2 = (A) "Other", (B) "Other".  ' ||
+'5 = (A) "Items", (B) do not display.  6 = (A) "Other", (B) do not display.',
         'coust',
         'description'
     )
@@ -16763,12 +17092,13 @@ VALUES (
     ),
     oils_i18n_gettext(
         'ui.circ.items_out.claimsreturned',
-'Value is a numeric code, describing which list the circulation '||
-'should appear while checked out and whether the circulation should '||
-'continue to appear in the bottom list, when checked in with '||
+'Value is a numeric code, describing: A. In which tab ("Items Checked Out", '||
+'or "Other/Special Circulations") the circulation '||
+'should appear while checked out, and B. Whether the circulation should '||
+'continue to appear in the "Other" tab when checked in with '||
 'oustanding fines.  '||
-'1 = top list, bottom list.  2 = bottom list, bottom list.  ' ||
-'5 = top list, do not display.  6 = bottom list, do not display.',
+'1 = (A) "Items", (B) "Other".  2 = (A) "Other", (B) "Other".  ' ||
+'5 = (A) "Items", (B) do not display.  6 = (A) "Other", (B) do not display.',
         'coust',
         'description'
     )
@@ -17041,108 +17371,252 @@ INSERT INTO action_trigger.environment (
     'circ_lib'
 );
 
-INSERT INTO config.org_unit_setting_type
-(name, grp, label, description, datatype)
-VALUES
-('circ.in_house_use.copy_alert',
- 'circ',
- oils_i18n_gettext('circ.in_house_use.copy_alert',
-     'Display copy alert for in-house-use',
-     'coust', 'label'),
- oils_i18n_gettext('circ.in_house_use.copy_alert',
-     'Display copy alert for in-house-use',
-     'coust', 'description'),
- 'bool'),
-('circ.in_house_use.checkin_alert',
- 'circ',
- oils_i18n_gettext('circ.in_house_use.checkin_alert',
-     'Display copy location checkin alert for in-house-use',
-     'coust', 'label'),
- oils_i18n_gettext('circ.in_house_use.checkin_alert',
-     'Display copy location checkin alert for in-house-use',
-     'coust', 'description'),
- 'bool');
+INSERT INTO action_trigger.event_definition (active, owner, name, hook, validator, reactor, delay, template)
+VALUES (
+    't', 1, 'Send Test Email', 'au.email.test', 'NOOP_True', 'SendEmail', '00:01:00',
+$$
+[%- USE date -%]
+[%- user = target -%]
+[%- lib = target.home_ou -%]
+To: [%- user.email %]
+From: [%- helpers.get_org_setting(target.home_ou.id, 'org.bounced_emails') || lib.email || params.sender_email || default_sender %]
+Date: [%- date.format(date.now, '%a, %d %b %Y %T -0000', gmt => 1) %]
+Reply-To: [%- lib.email || params.sender_email || default_sender %]
+Subject: Email Test Notification
+Auto-Submitted: auto-generated
 
+Dear [% user.first_given_name %] [% user.family_name %],
 
-INSERT into config.org_unit_setting_type (
-     name
-    ,grp
-    ,label
-    ,description
-    ,datatype
-) VALUES ( ----------------------------------------
-     'webstaff.cat.label.font.family'
-    ,'cat'
-    ,oils_i18n_gettext(
-         'webstaff.cat.label.font.family'
-        ,'Item Print Label Font Family'
-        ,'coust'
-        ,'label'
-    )
-    ,oils_i18n_gettext(
-         'webstaff.cat.label.font.family'
-        ,'Set the preferred font family for item print labels. You can specify a list of CSS 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"'
-        ,'coust'
-        ,'description'
-    )
-    ,'string'
-), ( ----------------------------------------
-     'webstaff.cat.label.font.size'
-    ,'cat'
-    ,oils_i18n_gettext(
-         'webstaff.cat.label.font.size'
-        ,'Item Print Label Font Size'
-        ,'coust'
-        ,'label'
-    )
-    ,oils_i18n_gettext(
-         'webstaff.cat.label.font.size'
-        ,'Set the default font size for item print labels. Please include a unit of measurement that is valid CSS. For example, "12pt" or "16px" or "1em"'
-        ,'coust'
-        ,'description'
-    )
-    ,'string'
-), ( ----------------------------------------
-     'webstaff.cat.label.font.weight'
-    ,'cat'
-    ,oils_i18n_gettext(
-         'webstaff.cat.label.font.weight'
-        ,'Item Print Label Font Weight'
-        ,'coust'
-        ,'label'
-    )
-    ,oils_i18n_gettext(
-         'webstaff.cat.label.font.weight'
-        ,'Set the default font weight for item print labels. Please use the CSS specification for values for font-weight.  For example, "normal", "bold", "bolder", or "lighter"'
-        ,'coust'
-        ,'description'
-    )
-    ,'string'
-), ( ----------------------------------------
-     'webstaff.cat.label.left_label.left_margin'
-    ,'cat'
-    ,oils_i18n_gettext(
-         'webstaff.cat.label.left_label.left_margin'
-        ,'Item Print Label - Left Margin for Spine Label'
-        ,'coust'
-        ,'label'
-    )
-    ,oils_i18n_gettext(
-         'webstaff.cat.label.left_label.left_margin'
-        ,'Set the default left margin for the item print Spine Label. Please include a unit of measurement that is valid CSS. For example, "1in" or "2.5cm"'
-        ,'coust'
-        ,'description'
-    )
-    ,'string'
-), ( ----------------------------------------
-     'webstaff.cat.label.right_label.left_margin'
-    ,'cat'
-    ,oils_i18n_gettext(
-         'webstaff.cat.label.right_label.left_margin'
-        ,'Item Print Label - Left Margin for Pocket Label'
-        ,'coust'
-        ,'label'
-    )
+This is a test of the email associated with your account at [%- lib.name -%]. If you are receiving this message, your email information is correct.
+
+Sincerely,
+[% lib.name %]
+
+Contact your library for more information:
+
+[% lib.name %]
+[%- SET addr = lib.mailing_address -%]
+[%- IF !addr -%] [%- SET addr = lib.billing_address -%] [%- END %]
+[% addr.street1 %] [% addr.street2 %]
+[% addr.city %], [% addr.state %]
+[% addr.post_code %]
+[% lib.phone %]
+
+$$);
+INSERT INTO action_trigger.environment (event_def, path)
+VALUES (currval('action_trigger.event_definition_id_seq'), 'home_ou'),
+       (currval('action_trigger.event_definition_id_seq'), 'home_ou.mailing_address'),
+       (currval('action_trigger.event_definition_id_seq'), 'home_ou.billing_address');
+
+INSERT INTO action_trigger.event_definition (active, owner, name, hook, validator, reactor, delay, template)
+VALUES (
+    't', 1, 'Send Test SMS', 'au.sms_text.test', 'NOOP_True', 'SendSMS', '00:01:00',
+$$
+[%- USE date -%]
+[%- user = target -%]
+[%- lib = user.home_ou -%]
+[%- sms_number = helpers.get_user_setting(target.id, 'opac.default_sms_notify') -%]
+[%- sms_carrier = helpers.get_user_setting(target.id, 'opac.default_sms_carrier') -%]
+From: [%- helpers.get_org_setting(target.home_ou.id, 'org.bounced_emails') || lib.email || params.sender_email || default_sender %]
+To: [%- helpers.get_sms_gateway_email(sms_carrier,sms_number) %]
+Subject: Test Text Message
+
+This is a test confirming your mobile number for [% lib.name %] is correct.
+
+Sincerely,
+[% lib.name %]
+
+Contact your library for more information:
+
+[% lib.name %]
+[%- SET addr = lib.mailing_address -%]
+[%- IF !addr -%] [%- SET addr = lib.billing_address -%] [%- END %]
+[% addr.street1 %] [% addr.street2 %]
+[% addr.city %], [% addr.state %]
+[% addr.post_code %]
+[% lib.phone %]
+
+$$);
+INSERT INTO action_trigger.environment (event_def, path)
+VALUES (currval('action_trigger.event_definition_id_seq'), 'home_ou'),
+       (currval('action_trigger.event_definition_id_seq'), 'home_ou.mailing_address'),
+       (currval('action_trigger.event_definition_id_seq'), 'home_ou.billing_address');
+
+INSERT INTO action_trigger.event_definition (active, owner, name, hook, validator, reactor, delay, delay_field, group_field, cleanup_success, template)
+    VALUES ('f', 1, 'Hold Group Hold Placed for Patron Email Notification', 'hold_request.success', 'NOOP_True', 'SendEmail', '30 minutes', 'request_time', 'usr', 'CreateHoldNotification',
+$$
+[%- USE date -%]
+[%- user = target.0.usr -%]
+To: [%- params.recipient_email || user.email %]
+From: [%- params.sender_email || default_sender %]
+Date: [%- date.format(date.now, '%a, %d %b %Y %T -0000', gmt => 1) %]
+Subject: Subcription Hold placed for you
+Auto-Submitted: auto-generated
+
+Dear [% user.family_name %], [% user.first_given_name %]
+The following items have been placed on hold for you:
+
+[% FOR hold IN target %]
+    [%- copy_details = helpers.get_copy_bib_basics(hold.current_copy.id) -%]
+    Title: [% copy_details.title %]
+    Author: [% copy_details.author %]
+    Call Number: [% hold.current_copy.call_number.label %]
+    Barcode: [% hold.current_copy.barcode %]
+    Library: [% hold.pickup_lib.name %]
+[% END %]
+
+$$);
+
+INSERT INTO action_trigger.environment (event_def, path ) VALUES
+( currval('action_trigger.event_definition_id_seq'), 'usr' ),
+( currval('action_trigger.event_definition_id_seq'), 'pickup_lib' ),
+( currval('action_trigger.event_definition_id_seq'), 'current_copy.call_number' );
+
+INSERT INTO action_trigger.event_definition (
+    active, owner, name, hook, validator, reactor, cleanup_success,
+    delay, delay_field, group_field, template
+) VALUES (
+    false, 1, 'Hold Group Hold Placed for Patron SMS Notification', 'hold_request.success', 'NOOP_True',
+    'SendSMS', 'CreateHoldNotification', '00:30:00', 'shelf_time', 'sms_notify',
+    '[%- USE date -%]
+[%- user = target.0.usr -%]
+From: [%- params.sender_email || default_sender %]
+Date: [%- date.format(date.now, ''%a, %d %b %Y %T -0000'', gmt => 1) %]
+To: [%- params.recipient_email || helpers.get_sms_gateway_email(target.0.sms_carrier,target.0.sms_notify) %]
+Subject: [% target.size %] subscription hold(s) placed for you
+Auto-Submitted: auto-generated
+
+[% FOR hold IN target %][%-
+  bibxml = helpers.xml_doc( hold.current_copy.call_number.record.marc );
+  title = "";
+  FOR part IN bibxml.findnodes(''//*[@tag="245"]/*[@code="a"]'');
+    title = title _ part.textContent;
+  END;
+  author = bibxml.findnodes(''//*[@tag="100"]/*[@code="a"]'').textContent;
+%][% hold.usr.first_given_name %]:[% title %] @ [% hold.pickup_lib.name %]
+[% END %]
+'
+);
+
+INSERT INTO action_trigger.environment (
+    event_def,
+    path
+) VALUES (
+    currval('action_trigger.event_definition_id_seq'),
+    'current_copy.call_number.record.simple_record'
+), (
+    currval('action_trigger.event_definition_id_seq'),
+    'usr'
+), (
+    currval('action_trigger.event_definition_id_seq'),
+    'pickup_lib.billing_address'
+);
+
+INSERT INTO action_trigger.event_params (event_def, param, value)
+    VALUES (currval('action_trigger.event_definition_id_seq'), 'check_sms_notify', 1);
+
+INSERT INTO config.org_unit_setting_type
+(name, grp, label, description, datatype)
+VALUES
+('circ.in_house_use.copy_alert',
+ 'circ',
+ oils_i18n_gettext('circ.in_house_use.copy_alert',
+     'Display copy alert for in-house-use',
+     'coust', 'label'),
+ oils_i18n_gettext('circ.in_house_use.copy_alert',
+     'Display copy alert for in-house-use',
+     'coust', 'description'),
+ 'bool'),
+('circ.in_house_use.checkin_alert',
+ 'circ',
+ oils_i18n_gettext('circ.in_house_use.checkin_alert',
+     'Display copy location checkin alert for in-house-use',
+     'coust', 'label'),
+ oils_i18n_gettext('circ.in_house_use.checkin_alert',
+     'Display copy location checkin alert for in-house-use',
+     'coust', 'description'),
+ 'bool');
+
+
+INSERT into config.org_unit_setting_type (
+     name
+    ,grp
+    ,label
+    ,description
+    ,datatype
+) VALUES ( ----------------------------------------
+     'webstaff.cat.label.font.family'
+    ,'cat'
+    ,oils_i18n_gettext(
+         'webstaff.cat.label.font.family'
+        ,'Item Print Label Font Family'
+        ,'coust'
+        ,'label'
+    )
+    ,oils_i18n_gettext(
+         'webstaff.cat.label.font.family'
+        ,'Set the preferred font family for item print labels. You can specify a list of CSS 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"'
+        ,'coust'
+        ,'description'
+    )
+    ,'string'
+), ( ----------------------------------------
+     'webstaff.cat.label.font.size'
+    ,'cat'
+    ,oils_i18n_gettext(
+         'webstaff.cat.label.font.size'
+        ,'Item Print Label Font Size'
+        ,'coust'
+        ,'label'
+    )
+    ,oils_i18n_gettext(
+         'webstaff.cat.label.font.size'
+        ,'Set the default font size for item print labels. Please include a unit of measurement that is valid CSS. For example, "12pt" or "16px" or "1em"'
+        ,'coust'
+        ,'description'
+    )
+    ,'string'
+), ( ----------------------------------------
+     'webstaff.cat.label.font.weight'
+    ,'cat'
+    ,oils_i18n_gettext(
+         'webstaff.cat.label.font.weight'
+        ,'Item Print Label Font Weight'
+        ,'coust'
+        ,'label'
+    )
+    ,oils_i18n_gettext(
+         'webstaff.cat.label.font.weight'
+        ,'Set the default font weight for item print labels. Please use the CSS specification for values for font-weight.  For example, "normal", "bold", "bolder", or "lighter"'
+        ,'coust'
+        ,'description'
+    )
+    ,'string'
+), ( ----------------------------------------
+     'webstaff.cat.label.left_label.left_margin'
+    ,'cat'
+    ,oils_i18n_gettext(
+         'webstaff.cat.label.left_label.left_margin'
+        ,'Item Print Label - Left Margin for Spine Label'
+        ,'coust'
+        ,'label'
+    )
+    ,oils_i18n_gettext(
+         'webstaff.cat.label.left_label.left_margin'
+        ,'Set the default left margin for the item print Spine Label. Please include a unit of measurement that is valid CSS. For example, "1in" or "2.5cm"'
+        ,'coust'
+        ,'description'
+    )
+    ,'string'
+), ( ----------------------------------------
+     'webstaff.cat.label.right_label.left_margin'
+    ,'cat'
+    ,oils_i18n_gettext(
+         'webstaff.cat.label.right_label.left_margin'
+        ,'Item Print Label - Left Margin for Pocket Label'
+        ,'coust'
+        ,'label'
+    )
     ,oils_i18n_gettext(
          'webstaff.cat.label.right_label.left_margin'
         ,'Set the default left margin for the item print Pocket Label (or in other words, the desired space between the two labels). Please include a unit of measurement that is valid CSS. For example, "1in" or "2.5cm"'
@@ -18794,6 +19268,13 @@ VALUES (
         'cwst', 'label'
     )
 ), (
+    'eg.grid.hopeless.wide_holds', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.hopeless.wide_holds',
+        'Grid Config: hopeless.wide_holds',
+        'cwst', 'label'
+    )
+), (
     'eg.grid.cat.holdings', 'gui', 'object',
     oils_i18n_gettext(
         'eg.grid.cat.holdings',
@@ -19576,6 +20057,35 @@ VALUES (
     )
 );
 
+INSERT into config.org_unit_setting_type
+( name, grp, label, description, datatype, fm_class ) VALUES
+( 'opac.email_record.allow_without_login', 'opac',
+    oils_i18n_gettext('opac.email_record.allow_without_login',
+        'Allow record emailing without login',
+        'coust', 'label'),
+    oils_i18n_gettext('opac.email_record.allow_without_login',
+        'Instead of forcing a patron to log in in order to email the details of a record, just challenge them with a simple catpcha.',
+        'coust', 'description'),
+    'bool', null)
+;
+
+INSERT INTO action_trigger.event_def_group (id, owner, hook, name)
+    VALUES (1, 1, 'biblio.format.record_entry.print','Print Record(s)');
+
+INSERT INTO action_trigger.event_def_group_member (grp, name, event_def)
+    SELECT 1, 'Brief', id FROM action_trigger.event_definition WHERE hook = 'biblio.format.record_entry.print';
+
+INSERT INTO action_trigger.event_def_group_member (grp, name, holdings, event_def)
+    SELECT 1, 'Full', TRUE, id FROM action_trigger.event_definition WHERE hook = 'biblio.format.record_entry.print';
+
+INSERT INTO action_trigger.event_def_group (id, owner, hook, name)
+    VALUES (2,1,'biblio.format.record_entry.email','Email Record(s)');
+
+INSERT INTO action_trigger.event_def_group_member (grp, name, event_def)
+    SELECT 2, 'Brief', id FROM action_trigger.event_definition WHERE hook = 'biblio.format.record_entry.email';
+
+INSERT INTO action_trigger.event_def_group_member (grp, name, holdings, event_def)
+    SELECT 2, 'Full', TRUE, id FROM action_trigger.event_definition WHERE hook = 'biblio.format.record_entry.email';
 
 INSERT into config.org_unit_setting_type (name, label, description, datatype) 
 VALUES ( 
@@ -19916,25 +20426,6 @@ VALUES (
     )
 );
 
--- NOTE: This setting should be removed once the Angular catalog
--- becomes the default.
-INSERT into config.org_unit_setting_type 
-    (name, datatype, grp, label, description)
-VALUES ( 
-    'ui.staff.angular_catalog.enabled', 'bool', 'gui',
-    oils_i18n_gettext(
-        'ui.staff.angular_catalog.enabled',
-        'GUI: Enable Experimental Angular Staff Catalog',
-        'coust', 'label'
-    ),
-    oils_i18n_gettext(
-        'ui.staff.angular_catalog.enabled',
-        'Display an entry point in the browser client for the ' ||
-        'experimental Angular staff catalog.',
-        'coust', 'description'
-    )
-);
-
 INSERT INTO config.org_unit_setting_type
     (name, label, description, grp, datatype)
     VALUES (
@@ -19950,6 +20441,74 @@ INSERT INTO config.org_unit_setting_type
         'bool'
     );
 
+INSERT into config.org_unit_setting_type
+( name, grp, label, description, datatype, fm_class ) VALUES
+( 'circ.holds.calculated_age_proximity', 'circ',
+    oils_i18n_gettext('circ.holds.calculated_age_proximity',
+        'Use calculated proximity for age-protection check',
+        'coust', 'label'),
+    oils_i18n_gettext('circ.holds.calculated_age_proximity',
+        'When checking whether a copy is viable for a hold based on transit distance, use calculated proximity with adjustments rather than baseline Org Unit proximity.',
+        'coust', 'description'),
+    'bool', null);
+
+INSERT INTO config.org_unit_setting_type
+( name, grp, label, description, datatype, update_perm )
+VALUES
+('opac.login.shib_sso.enable',
+ 'opac',
+ oils_i18n_gettext('opac.login.shib_sso.enable', 'Enable Shibboleth SSO for the OPAC', 'coust', 'label'),
+ oils_i18n_gettext('opac.login.shib_sso.enable', 'Enable Shibboleth SSO for the OPAC', 'coust', 'description'),
+ 'bool', 627),
+('opac.login.shib_sso.entityId',
+ 'opac',
+ oils_i18n_gettext('opac.login.shib_sso.entityId', 'Shibboleth SSO Entity ID', 'coust', 'label'),
+ oils_i18n_gettext('opac.login.shib_sso.entityId', 'Which configured Entity ID to use for SSO when there is more than one available to Shibboleth', 'coust', 'description'),
+ 'string', 627),
+('opac.login.shib_sso.logout',
+ 'opac',
+ oils_i18n_gettext('opac.login.shib_sso.logout', 'Log out of the Shibboleth IdP', 'coust', 'label'),
+ oils_i18n_gettext('opac.login.shib_sso.logout', 'When logging out of Evergreen, also force a logout of the IdP behind Shibboleth', 'coust', 'description'),
+ 'bool', 627),
+('opac.login.shib_sso.allow_native',
+ 'opac',
+ oils_i18n_gettext('opac.login.shib_sso.allow_native', 'Allow both Shibboleth and native OPAC authentication', 'coust', 'label'),
+ oils_i18n_gettext('opac.login.shib_sso.allow_native', 'When Shibboleth SSO is enabled, also allow native Evergreen authentication', 'coust', 'description'),
+ 'bool', 627),
+('opac.login.shib_sso.evergreen_matchpoint',
+ 'opac',
+ oils_i18n_gettext('opac.login.shib_sso.evergreen_matchpoint', 'Evergreen SSO matchpoint', 'coust', 'label'),
+ oils_i18n_gettext('opac.login.shib_sso.evergreen_matchpoint',
+  'Evergreen-side field to match a patron against for Shibboleth SSO. Default is usrname.  Other reasonable values would be barcode or email.',
+  'coust', 'description'),
+ 'string', 627),
+('opac.login.shib_sso.shib_matchpoint',
+ 'opac',
+ oils_i18n_gettext('opac.login.shib_sso.shib_matchpoint', 'Shibboleth SSO matchpoint', 'coust', 'label'),
+ oils_i18n_gettext('opac.login.shib_sso.shib_matchpoint',
+  'Shibboleth-side field to match a patron against for Shibboleth SSO. Default is uid; use eppn for Active Directory', 'coust', 'description'),
+ 'string', 627)
+;
+
+INSERT INTO config.org_unit_setting_type
+    (name, label, description, grp, datatype)
+VALUES (
+    'holds.subscription.randomize',
+    oils_i18n_gettext(
+        'holds.subscription.randomize',
+        'Randomize group hold order',
+        'coust',
+        'label'
+    ),
+    oils_i18n_gettext(
+        'holds.subscription.randomize',
+        'When placing a batch group hold, randomize the order of the patrons receiving the holds so they are not always in the same order.',
+        'coust',
+        'description'
+    ),
+    'holds',
+    'bool'
+);
 
 INSERT INTO config.workstation_setting_type (name, grp, datatype, label)
 VALUES (
@@ -20011,7 +20570,8 @@ VALUES (
     oils_i18n_gettext(30, 'Generic Verify', 'cuat', 'label')
 );
 
-INSERT INTO config.workstation_setting_type (name, grp, datatype, label)
+INSERT INTO config.workstation_setting_type
+    (name, grp, datatype, label)
 VALUES (
     'catalog.record.holds.prefetch', 'cat', 'bool',
     oils_i18n_gettext(
@@ -20021,6 +20581,15 @@ VALUES (
     )
 );
 
+INSERT INTO config.workstation_setting_type (name, grp, datatype, label)
+VALUES (
+    'eg.print.template_context.booking_capture', 'gui', 'string',
+    oils_i18n_gettext(
+        'eg.print.template_context.booking_capture',
+        'Print Template Context: booking_capture',
+        'cwst', 'label'
+    )
+);
 
 INSERT INTO config.workstation_setting_type (name, grp, datatype, label)
 VALUES (
@@ -20120,7 +20689,7 @@ $TEMPLATE$
 INSERT INTO config.print_template 
     (id, name, locale, active, owner, label, template) 
 VALUES (
-    2, 'holds_for_bib', 'en-US', FALSE,
+    2, 'holds_for_bib', 'en-US', TRUE,
     (SELECT id FROM actor.org_unit WHERE parent_ou IS NULL),
     oils_i18n_gettext(2, 'Holds for Bib Record', 'cpt', 'label'),
 $TEMPLATE$
@@ -20170,22 +20739,47 @@ $TEMPLATE$
 $TEMPLATE$
 );
 
-
--- Allow for 1k stock templates
-SELECT SETVAL('config.print_template_id_seq'::TEXT, 1000);
-
-INSERT INTO config.workstation_setting_type
-    (name, grp, datatype, label)
+INSERT INTO config.print_template
+    (id, name, locale, active, owner, label, template)
 VALUES (
-    'eg.grid.circ.patron.group_members', 'gui', 'object',
-    oils_i18n_gettext(
-    'eg.grid.circ.patron.group_members',
-    'Grid Config: circ.patron.group_members',
-    'cwst', 'label')
+    3, 'booking_capture', 'en-US', TRUE,
+    (SELECT id FROM actor.org_unit WHERE parent_ou IS NULL),
+    oils_i18n_gettext(3, 'Booking capture slip', 'cpt', 'label'),
+$TEMPLATE$
+[%-
+    USE date;
+    SET data = template_data;
+    # template_data is data returned from open-ils.booking.resources.capture_for_reservation.
+-%]
+<div>
+  [% IF data.transit;
+       dest_ou = helpers.get_org_unit(data.transit.dest);
+  %]
+  <div>This item need to be routed to <strong>[% dest_ou.shortname %]</strong></div>
+  [% ELSE %]
+  <div>This item need to be routed to <strong>RESERVATION SHELF:</strong></div>
+  [% END %]
+  <div>Barcode: [% data.reservation.current_resource.barcode %]</div>
+  <div>Title: [% data.reservation.current_resource.type.name %]</div>
+  <div>Note: [% data.reservation.note %]</div>
+  <br/>
+  <p><strong>Reserved for patron</strong> [% data.reservation.usr.family_name %], [% data.reservation.usr.first_given_name %] [% data.reservation.usr.second_given_name %]
+  <br/>Barcode: [% data.reservation.usr.card.barcode %]</p>
+  <p>Request time: [% date.format(helpers.format_date(data.reservation.request_time, client_timezone), '%x %r', locale) %]
+  <br/>Reserved from:
+    [% date.format(helpers.format_date(data.reservation.start_time, client_timezone), '%x %r', locale) %]
+    - [% date.format(helpers.format_date(data.reservation.end_time, client_timezone), '%x %r', locale) %]</p>
+  <p>Slip date: [% date.format(helpers.current_date(client_timezone), '%x %r', locale) %]<br/>
+  Printed by [% data.staff.family_name %], [% data.staff.first_given_name %] [% data.staff.second_given_name %]
+    at [% data.workstation %]</p>
+</div>
+<br/>
+
+$TEMPLATE$
 );
 
-INSERT INTO config.workstation_setting_type (name,label,grp,datatype)
-VALUES ('eg.circ.bills.annotatepayment','Bills: Annotate Payment', 'circ', 'bool');
+-- Allow for 1k stock templates
+SELECT SETVAL('config.print_template_id_seq'::TEXT, 1000);
 
 INSERT INTO config.workstation_setting_type (name, grp, datatype, label)
 VALUES (
@@ -20231,7 +20825,19 @@ VALUES (
         'Grid Config: Booking Return Resource tab Returned Today grid',
         'cwst', 'label')
 ), (
-    'eg.booking.manage.selected_org_family', 'gui', 'object',
+    'eg.grid.booking.captured', 'gui', 'object',
+    oils_i18n_gettext(
+        'booking.manage',
+        'Grid Config: Booking Captured Reservations',
+        'cwst', 'label')
+), (
+    'eg.grid.booking.pull_list', 'gui', 'object',
+    oils_i18n_gettext(
+        'booking.pull_list',
+        'Grid Config: Booking Pull List',
+        'cwst', 'label')
+),(
+   'eg.booking.manage.selected_org_family', 'gui', 'object',
     oils_i18n_gettext(
         'booking.manage.selected_org_family',
         'Sticky setting for pickup ou family in Manage Reservations screen',
@@ -20260,4 +20866,810 @@ VALUES (
         'booking.pickup.ready.only_show_captured',
         'Include only resources that have been captured in the Ready grid in the Pickup screen',
         'cwst', 'label')
+), (
+    'eg.grid.circ.patron.xact_details_details_bills', 'gui', 'object',
+    oils_i18n_gettext(
+    'eg.grid.circ.patron.xact_details_details_bills',
+    'Grid Config: circ.patron.xact_details_details_bills',
+    'cwst', 'label')
+), (
+    'eg.grid.circ.patron.xact_details_details_payments', 'gui', 'object',
+    oils_i18n_gettext(
+    'eg.grid.circ.patron.xact_details_details_payments',
+    'Grid Config: circ.patron.xact_details_details_payments',
+    'cwst', 'label')
+);
+
+INSERT INTO config.workstation_setting_type (name, grp, datatype, label)
+VALUES (
+    'eg.hatch.enable.printing', 'gui', 'bool',
+    oils_i18n_gettext(
+        'eg.hatch.enable.printing',
+        'Use Hatch for printing',
+        'cwst', 'label'
+    )
+);
+
+INSERT INTO actor.org_unit_setting (org_unit, name, value)
+    SELECT 1, 'circ.course_materials_brief_record_bib_source', id
+    FROM config.bib_source
+    WHERE source='Course materials module';
+
+INSERT INTO asset.course_module_role (id, name, is_public) VALUES
+(1, oils_i18n_gettext(1, 'Instructor', 'acmr', 'name'), true),
+(2, oils_i18n_gettext(2, 'Teaching assistant', 'acmr', 'name'), true),
+(3, oils_i18n_gettext(3, 'Student', 'acmr', 'name'), false);
+SELECT SETVAL('asset.course_module_role_id_seq'::TEXT, 100);
+
+
+
+INSERT INTO config.workstation_setting_type (name, grp, datatype, label)
+VALUES (
+    'eg.catalog.results.count', 'gui', 'integer',
+    oils_i18n_gettext(
+        'eg.catalog.results.count',
+        'Catalog Results Page Size',
+        'cwst', 'label'
+    )
+);
+
+INSERT INTO config.global_flag (name, value, enabled, label)
+VALUES (
+    'history.money.age_with_circs',
+    NULL, 
+    FALSE,
+    oils_i18n_gettext(
+        'history.money.age_with_circs',
+        'Age billings and payments when cirulcations are aged.',
+        'cgf', 'label'
+    )
+), (
+    'history.money.retention_age',
+    NULL, 
+    FALSE,
+    oils_i18n_gettext(
+        'history.money.retention_age',
+        'Age billings and payments whose transactions were completed ' ||
+        'this long ago.  For circulation transactions, this setting ' ||
+        'is superseded by the "history.money.age_with_circs" setting',
+        'cgf', 'label'
+    )
+);
+
+INSERT INTO config.workstation_setting_type (name, grp, datatype, label)
+VALUES (
+    'eg.orgselect.cat.catalog.wide_holds', 'gui', 'integer',
+    oils_i18n_gettext(
+        'eg.orgselect.cat.catalog.wide_holds',
+        'Default org unit for catalog holds org unit selector',
+        'cwst', 'label'
+    )
+), (
+    'eg.orgselect.patron.search', 'gui', 'integer',
+    oils_i18n_gettext(
+        'eg.orgselect.patron.search',
+        'Default org unit for patron search',
+        'cwst', 'label'
+    )
+), (
+    'eg.orgselect.hopeless.wide_holds', 'gui', 'integer',
+    oils_i18n_gettext(
+        'eg.orgselect.hopeless.wide_holds',
+        'Default org unit for hopeless holds interface',
+        'cwst', 'label'
+    )
+), (
+    'eg.grid.cat.authority.browse', 'gui', 'object',
+    oils_i18n_gettext(
+    'eg.grid.cat.authority.browse',
+    'Grid Config: eg.grid.cat.authority.browse',
+    'cwst', 'label')
+), (
+    'eg.grid.cat.authority.manage.bibs', 'gui', 'object',
+    oils_i18n_gettext(
+    'eg.grid.cat.authority.manage.bibs',
+    'Grid Config: eg.grid.cat.authority.manage.bibs',
+    'cwst', 'label')
+);
+
+INSERT INTO config.workstation_setting_type
+    (name, grp, datatype, label)
+VALUES (
+    'eg.acq.search.default.lineitems', 'gui', 'object',
+    oils_i18n_gettext(
+    'eg.acq.search.default.lineitems',
+    'Acquisitions Default Search: Lineitems',
+    'cwst', 'label')
+), (
+    'eg.acq.search.default.purchaseorders', 'gui', 'object',
+    oils_i18n_gettext(
+    'eg.acq.search.default.purchaseorders',
+    'Acquisitions Default Search: Purchase Orders',
+    'cwst', 'label')
+), (
+    'eg.acq.search.default.invoices', 'gui', 'object',
+    oils_i18n_gettext(
+    'eg.acq.search.default.invoices',
+    'Acquisitions Default Search: Invoices',
+    'cwst', 'label')
+), (
+    'eg.acq.search.default.selectionlists', 'gui', 'object',
+    oils_i18n_gettext(
+    'eg.acq.search.default.selectionlists',
+    'Acquisitions Default Search: Selection Lists',
+    'cwst', 'label')
+);
+
+INSERT INTO config.workstation_setting_type
+    (name, grp, datatype, label)
+VALUES (
+    'eg.acq.search.lineitems.run_immediately', 'gui', 'bool',
+    oils_i18n_gettext(
+    'eg.acq.search.lineitems.run_immediately',
+    'Acquisitions Search: Immediately Search Lineitems',
+    'cwst', 'label')
+), (
+    'eg.acq.search.purchaseorders.run_immediately', 'gui', 'bool',
+    oils_i18n_gettext(
+    'eg.acq.search.purchaseorders.run_immediately',
+    'Acquisitions Search: Immediately Search Purchase Orders',
+    'cwst', 'label')
+), (
+    'eg.acq.search.invoices.run_immediately', 'gui', 'bool',
+    oils_i18n_gettext(
+    'eg.acq.search.invoices.run_immediately',
+    'Acquisitions Search: Immediately Search Invoices',
+    'cwst', 'label')
+), (
+    'eg.acq.search.selectionlists.run_immediately', 'gui', 'bool',
+    oils_i18n_gettext(
+    'eg.acq.search.selectionlists.run_immediately',
+    'Acquisitions Search: Immediately Search Selection Lists',
+    'cwst', 'label')
+);
+
+INSERT INTO config.workstation_setting_type
+    (name, grp, datatype, label)
+VALUES (
+    'eg.grid.acq.search.lineitems', 'gui', 'object',
+    oils_i18n_gettext(
+    'eg.grid.acq.search.lineitems',
+    'Grid Config: acq.search.lineitems',
+    'cwst', 'label')
+), (
+    'eg.grid.acq.search.purchaseorders', 'gui', 'object',
+    oils_i18n_gettext(
+    'eg.grid.acq.search.purchaseorders',
+    'Grid Config: acq.search.purchaseorders',
+    'cwst', 'label')
+), (
+    'eg.grid.acq.search.selectionlists', 'gui', 'object',
+    oils_i18n_gettext(
+    'eg.grid.acq.search.selectionlists',
+    'Grid Config: acq.search.selectionlists',
+    'cwst', 'label')
+), (
+    'eg.grid.acq.search.invoices', 'gui', 'object',
+    oils_i18n_gettext(
+    'eg.grid.acq.search.invoices',
+    'Grid Config: acq.search.invoices',
+    'cwst', 'label')
+);
+
+INSERT INTO action_trigger.reactor (module, description) VALUES (
+    'CallHTTP', 'Push event information out to an external system via HTTP'
+);
+
+INSERT INTO config.workstation_setting_type
+    (name, grp, datatype, label)
+VALUES (
+    'eg.grid.acq.provider.addresses', 'gui', 'object',
+    oils_i18n_gettext(
+    'eg.grid.acq.provider.addresses',
+    'Grid Config: acq.provider.addresses',
+    'cwst', 'label')
+), (
+    'eg.grid.acq.provider.attributes', 'gui', 'object',
+    oils_i18n_gettext(
+    'eg.grid.acq.provider.attributes',
+    'Grid Config: acq.provider.attributes',
+    'cwst', 'label')
+), (
+    'eg.grid.acq.provider.contact.addresses', 'gui', 'object',
+    oils_i18n_gettext(
+    'eg.grid.acq.provider.contact.addresses',
+    'Grid Config: acq.provider.contact.addresses',
+    'cwst', 'label')
+), (
+    'eg.grid.acq.provider.contacts', 'gui', 'object',
+    oils_i18n_gettext(
+    'eg.grid.acq.provider.contacts',
+    'Grid Config: acq.provider.contacts',
+    'cwst', 'label')
+), (
+    'eg.grid.acq.provider.edi_accounts', 'gui', 'object',
+    oils_i18n_gettext(
+    'eg.grid.acq.provider.edi_accounts',
+    'Grid Config: acq.provider.edi_accounts',
+    'cwst', 'label')
+), (
+    'eg.grid.acq.provider.edi_messages', 'gui', 'object',
+    oils_i18n_gettext(
+    'eg.grid.acq.provider.edi_messages',
+    'Grid Config: acq.provider.edi_messages',
+    'cwst', 'label')
+), (
+    'eg.grid.acq.provider.holdings', 'gui', 'object',
+    oils_i18n_gettext(
+    'eg.grid.acq.provider.holdings',
+    'Grid Config: acq.provider.holdings',
+    'cwst', 'label')
+), (
+    'eg.grid.acq.provider.invoices', 'gui', 'object',
+    oils_i18n_gettext(
+    'eg.grid.acq.provider.invoices',
+    'Grid Config: acq.provider.invoices',
+    'cwst', 'label')
+), (
+    'eg.grid.acq.provider.purchaseorders', 'gui', 'object',
+    oils_i18n_gettext(
+    'eg.grid.acq.provider.purchaseorders',
+    'Grid Config: acq.provider.purchaseorders',
+    'cwst', 'label')
+), (
+    'eg.grid.acq.provider.search.results', 'gui', 'object',
+    oils_i18n_gettext(
+    'eg.grid.acq.provider.search.results',
+    'Grid Config: acq.provider.search.results',
+    'cwst', 'label')
+);
+
+INSERT into config.org_unit_setting_type
+    ( name, grp, label, description, datatype, update_perm )
+VALUES (
+    'opac.analytics.matomo_id', 'opac',
+    oils_i18n_gettext(
+    'opac.analytics.matomo_id',
+    'Matomo Site ID',
+    'coust', 'label'),
+    oils_i18n_gettext('opac.analytics.matomo_id',
+    'The Site ID for your Evergreen catalog. You can find the Site ID in the tracking code you got from Matomo.',
+    'coust', 'description'),
+    'string', 623
+), (
+    'opac.analytics.matomo_url', 'opac',
+    oils_i18n_gettext('opac.analytics.matomo_url',
+    'Matomo URL',
+    'coust', 'label'),
+    oils_i18n_gettext('opac.analytics.matomo_url',
+    'The URL for your the Matomo software. Be sure to include the trailing slash, e.g. https://my-evergreen.matomo.cloud/',
+    'coust', 'description'),
+    'string', 623
+);
+-- curbside pickup
+INSERT INTO config.org_unit_setting_type (name, label, grp, description, datatype)
+VALUES (
+    'circ.curbside',
+    oils_i18n_gettext('circ.curbside',
+        'Enable curbside pickup functionality at library.',
+        'coust', 'label'),
+    'circ',
+    oils_i18n_gettext('circ.curbside',
+        'When set to TRUE, enable staff and public interfaces to schedule curbside pickup of holds that become available for pickup.',
+        'coust', 'description'),
+    'bool'
+);
+
+INSERT INTO config.org_unit_setting_type (name, label, grp, description, datatype)
+VALUES (
+    'circ.curbside.granularity',
+    oils_i18n_gettext('circ.curbside.granularity',
+        'Time interval between curbside appointments',
+        'coust', 'label'),
+    'circ',
+    oils_i18n_gettext('circ.curbside.granularity',
+        'Time interval between curbside appointments',
+        'coust', 'description'),
+    'interval'
+);
+
+INSERT INTO config.org_unit_setting_type (name, label, grp, description, datatype)
+VALUES (
+    'circ.curbside.max_concurrent',
+    oils_i18n_gettext('circ.curbside.max_concurrent',
+        'Maximum number of patrons that may select a particular curbside pickup time',
+        'coust', 'label'),
+    'circ',
+    oils_i18n_gettext('circ.curbside.max_concurrent',
+        'Maximum number of patrons that may select a particular curbside pickup time',
+        'coust', 'description'),
+    'integer'
+);
+
+INSERT INTO config.org_unit_setting_type (name, label, grp, description, datatype)
+VALUES (
+    'circ.curbside.disable_patron_input',
+    oils_i18n_gettext('circ.curbside.disable_patron_input',
+        'Disable patron modification of curbside appointments in public catalog',
+        'coust', 'label'),
+    'circ',
+    oils_i18n_gettext('circ.curbside.disable_patron_input',
+        'When set to TRUE, patrons cannot use the My Account interface to select curbside pickup times',
+        'coust', 'description'),
+    'bool'
+);
+
+INSERT INTO actor.org_unit_setting (org_unit, name, value)
+    SELECT id, 'circ.curbside', 'false' FROM actor.org_unit WHERE parent_ou IS NULL
+        UNION
+    SELECT id, 'circ.curbside.max_concurrent', '10' FROM actor.org_unit WHERE parent_ou IS NULL
+        UNION
+    SELECT id, 'circ.curbside.granularity', '"15 minutes"' FROM actor.org_unit WHERE parent_ou IS NULL
+;
+
+INSERT INTO action_trigger.hook (key, core_type, description, passive)
+VALUES (
+    'hold.offer_curbside',
+    'ahr',
+    oils_i18n_gettext(
+        'hold.offer_curbside',
+        'Hook used to trigger the notification of an offer of curbside pickup',
+        'ath',
+        'description'
+    ),
+    FALSE
+);
+
+INSERT INTO action_trigger.hook (key, core_type, description, passive)
+VALUES (
+    'hold.confirm_curbside',
+    'acsp',
+    oils_i18n_gettext(
+        'hold.confirm_curbside',
+        'Hook used to trigger the notification of the creation or update of a curbside pickup appointment with an arrival URL',
+        'ath',
+        'description'
+    ),
+    FALSE
+);
+
+INSERT INTO action_trigger.reactor (module, description) VALUES (
+    'CurbsideSlot', 'Create a curbside pickup appointment slot when necessary'
+);
+
+INSERT INTO action_trigger.validator (module, description) VALUES (
+    'Curbside', 'Confirm that curbside pickup is enabled for the hold pickup library'
+);
+
+-- geosort
+
+INSERT INTO config.global_flag (name, value, enabled, label)
+VALUES (
+    'opac.use_geolocation',
+    NULL,
+    FALSE,
+    oils_i18n_gettext(
+        'opac.use_geolocation',
+        'Offer use of geographic location services in the public catalog',
+        'cgf', 'label'
+    )
+);
+
+INSERT INTO config.org_unit_setting_type (name, label, grp, description, datatype)
+VALUES (
+    'opac.holdings_sort_by_geographic_proximity',
+    oils_i18n_gettext('opac.holdings_sort_by_geographic_proximity',
+        'Enable Holdings Sort by Geographic Proximity',
+        'coust', 'label'),
+    'opac',
+    oils_i18n_gettext('opac.holdings_sort_by_geographic_proximity',
+        'When set to TRUE, will cause the record details page to display the controls for sorting holdings by geographic proximity. This also depends on the global flag opac.use_geolocation being enabled.',
+        'coust', 'description'),
+    'bool'
 );
+
+INSERT INTO config.org_unit_setting_type (name, label, grp, description, datatype)
+VALUES (
+    'opac.geographic_proximity_in_miles',
+    oils_i18n_gettext('opac.geographic_proximity_in_miles',
+        'Show Geographic Proximity in Miles',
+        'coust', 'label'),
+    'opac',
+    oils_i18n_gettext('opac.geographic_proximity_in_miles',
+        'When set to TRUE, will cause the record details page to show distances for geographic proximity in miles instead of kilometers.',
+        'coust', 'description'),
+    'bool'
+);
+
+INSERT INTO config.org_unit_setting_type (name, label, grp, description, datatype, fm_class)
+VALUES (
+    'opac.geographic_location_service_for_address',
+    oils_i18n_gettext('opac.geographic_location_service_for_address',
+        'Geographic Location Service to use for Addresses',
+        'coust', 'label'),
+    'opac',
+    oils_i18n_gettext('opac.geographic_location_service_for_address',
+        'Specifies which geographic location service to use for converting address input to geographic coordinates.',
+        'coust', 'description'),
+    'link', 'cgs'
+);
+
+INSERT INTO permission.grp_perm_map (grp, perm, depth, grantable)
+    SELECT
+        pgt.id, perm.id, aout.depth, TRUE
+    FROM
+        permission.grp_tree pgt,
+        permission.perm_list perm,
+        actor.org_unit_type aout
+    WHERE
+        (pgt.name = 'Global Administrator' OR pgt.name = 'System Administrator') AND
+        aout.name = 'Consortium' AND
+        (perm.code = 'ADMIN_GEOLOCATION_SERVICES' OR perm.code = 'VIEW_GEOLOCATION_SERVICES');
+
+------------------- Disabled example A/T defintions ------------------------------
+
+-- Create a "dummy" slot when applicable, and trigger the "offer curbside" events
+INSERT INTO action_trigger.event_definition (
+    active,
+    owner,
+    name,
+    hook,
+    validator,
+    reactor,
+    delay
+) VALUES (
+    'f',
+    1,
+    'Trigger curbside offer events and create a placeholder for the patron, where applicable',
+    'hold.available',
+    'Curbside',
+    'CurbsideSlot',
+    '00:30:00'
+);
+
+-- Email offer
+INSERT INTO action_trigger.event_definition (
+    active,
+    owner,
+    name,
+    hook,
+    validator,
+    reactor,
+    delay,
+    delay_field,
+    group_field,
+    template
+) VALUES (
+    'f',
+    1,
+    'Curbside offer Email notification, triggered by CurbsideSlot reactor on a definition attached to the hold.available hook',
+    'hold.offer_curbside',
+    'Curbside',
+    'SendEmail',
+    '00:00:00',
+    'shelf_time',
+    'usr',
+$$
+[%- USE date -%]
+[%- user = target.0.usr -%]
+To: [%- params.recipient_email || user.email %]
+From: [%- params.sender_email || default_sender %]
+Date: [%- date.format(date.now, '%a, %d %b %Y %T -0000', gmt => 1) %]
+Subject: Curbside Pickup
+Auto-Submitted: auto-generated
+
+[% target.0.pickup_lib.name %] is now offering curbside delivery
+service.  Please call [% target.0.pickup_lib.phone %] or visit the
+link below to schedule a pickup time.
+
+https://example.org/eg/opac/myopac/holds_curbside
+
+Stay safe! Wash your hands!
+$$);
+
+INSERT INTO action_trigger.environment (
+    event_def,
+    path
+) VALUES (
+    currval('action_trigger.event_definition_id_seq'),
+    'pickup_lib'
+), (
+    currval('action_trigger.event_definition_id_seq'),
+    'usr'
+);
+
+INSERT INTO action_trigger.event_params (event_def, param, value)
+    VALUES (currval('action_trigger.event_definition_id_seq'), 'check_email_notify', 1);
+
+-- SMS offer
+INSERT INTO action_trigger.event_definition (
+    active,
+    owner,
+    name,
+    hook,
+    validator,
+    reactor,
+    delay,
+    delay_field,
+    group_field,
+    template
+) VALUES (
+    false,
+    1,
+    'Curbside offer SMS notification, triggered by CurbsideSlot reactor on a definition attached to the hold.available hook',
+    'hold.offer_curbside',
+    'Curbside',
+    'SendSMS',
+    '00:00:00',
+    'shelf_time',
+    'sms_notify',
+    $$[%- USE date -%]
+[%- user = target.0.usr -%]
+From: [%- params.sender_email || default_sender %]
+Date: [%- date.format(date.now, '%a, %d %b %Y %T -0000', gmt => 1) %]
+To: [%- params.recipient_email || helpers.get_sms_gateway_email(target.0.sms_carrier,target.0.sms_notify) %]
+Subject: Curbside Pickup
+Auto-Submitted: auto-generated
+
+[% target.0.pickup_lib.name %] offers curbside pickup.
+Call [% target.0.pickup_lib.phone %] or visit https://example.org/eg/opac/myopac/holds_curbside
+$$
+);
+
+INSERT INTO action_trigger.environment (
+    event_def,
+    path
+) VALUES (
+    currval('action_trigger.event_definition_id_seq'),
+    'pickup_lib'
+), (
+    currval('action_trigger.event_definition_id_seq'),
+    'usr'
+);
+
+INSERT INTO action_trigger.event_params (event_def, param, value)
+    VALUES (currval('action_trigger.event_definition_id_seq'), 'check_sms_notify', 1);
+
+-- Email confirmation
+INSERT INTO action_trigger.event_definition (
+    active,
+    owner,
+    name,
+    hook,
+    validator,
+    reactor,
+    delay,
+    template
+) VALUES (
+    'f',
+    1,
+    'Curbside confirmation Email notification',
+    'hold.confirm_curbside',
+    'Curbside',
+    'SendEmail',
+    '00:00:00',
+$$
+[%- USE date -%]
+[%- user = target.patron -%]
+To: [%- params.recipient_email || user.email %]
+From: [%- params.sender_email || default_sender %]
+Date: [%- date.format(date.now, '%a, %d %b %Y %T -0000', gmt => 1) %]
+Subject: Curbside Pickup Confirmed
+Auto-Submitted: auto-generated
+
+This email is to confirm that you have scheduled a curbside item
+pickup at [% target.org.name %] for [% date.format(helpers.format_date(target.slot), '%a, %d %b %Y %T') %].
+
+You can cancel or change to your appointment, add vehicle description
+notes, and alert staff to your arrival by going to the link below.
+
+When you arrive, please call [% target.org.phone %] or visit the
+link below to let us know you are here.
+
+https://example.org/eg/opac/myopac/holds_curbside
+
+Stay safe! Wash your hands!
+$$);
+
+INSERT INTO action_trigger.environment (
+    event_def,
+    path
+) VALUES (
+    currval('action_trigger.event_definition_id_seq'),
+    'org'
+), (
+    currval('action_trigger.event_definition_id_seq'),
+    'patron'
+);
+
+-- We do /not/ add this by default, treating curbside request as implicit opt-in
+/*
+INSERT INTO action_trigger.event_params (event_def, param, value)
+    VALUES (currval('action_trigger.event_definition_id_seq'), 'check_email_notify', 1);
+*/
+
+-- SMS confirmation
+INSERT INTO action_trigger.event_definition (
+    active,
+    owner,
+    name,
+    hook,
+    validator,
+    reactor,
+    delay,
+    template
+) VALUES (
+    false,
+    1,
+    'Curbside confirmation SMS notification',
+    'hold.confirm_curbside',
+    'Curbside',
+    'SendSMS',
+    '00:00:00',
+    $$[%- USE date -%]
+[%- user = target.patron -%]
+From: [%- params.sender_email || default_sender %]
+Date: [%- date.format(date.now, '%a, %d %b %Y %T -0000', gmt => 1) %]
+To: [%- params.recipient_email || helpers.get_sms_gateway_email(helpers.get_user_setting(user.id, 'opac.default_sms_carrier'), helpers.get_user_setting(user.id, 'opac.default_sms_notify')) %]
+Subject: Curbside Pickup Confirmed
+Auto-Submitted: auto-generated
+
+Location: [% target.org.name %]
+Time: [% date.format(helpers.format_date(target.slot), '%a, %d %b %Y %T') %]
+Make changes at https://example.org/eg/opac/myopac/holds_curbside
+$$
+);
+
+INSERT INTO action_trigger.environment (
+    event_def,
+    path
+) VALUES (
+    currval('action_trigger.event_definition_id_seq'),
+    'org'
+), (
+    currval('action_trigger.event_definition_id_seq'),
+    'patron'
+);
+
+-- We do /not/ add this by default, treating curbside request as implicit opt-in
+/*
+INSERT INTO action_trigger.event_params (event_def, param, value)
+    VALUES (currval('action_trigger.event_definition_id_seq'), 'check_sms_notify', 1);
+*/
+
+INSERT INTO config.workstation_setting_type (name, grp, datatype, label)
+VALUES (
+    'eg.staffcat.exclude_electronic', 'gui', 'bool',
+    oils_i18n_gettext(
+        'eg.staffcat.exclude_electronic',
+        'Staff Catalog "Exclude Electronic Resources" Option',
+        'cwst', 'label'
+    )
+);
+
+INSERT INTO config.workstation_setting_type (name, grp, datatype, fm_class, label)
+VALUES (
+    'eg.orgselect.catalog.holdings', 'gui', 'link', 'aou',
+    oils_i18n_gettext(
+        'eg.orgselect.catalog.holdings',
+        'Default org unit for catalog holdings tab',
+        'cwst', 'label'
+    )
+);
+
+INSERT INTO config.workstation_setting_type (name, grp, datatype, label)
+VALUES (
+    'eg.catalog.search.form.open', 'gui', 'bool',
+    oils_i18n_gettext(
+        'eg.catalog.search.form.open',
+        'Catalog Search Form Visibility Sticky Setting',
+        'cwst', 'label'
+    )
+);
+
+INSERT INTO config.workstation_setting_type (name, grp, datatype, label)
+VALUES (
+    'eg.grid.catalog.record.copies', 'gui', 'object',
+    oils_i18n_gettext(
+        'eg.grid.catalog.record.copies',
+        'Grid Config: eg.grid.catalog.record.copies',
+        'cwst', 'label'
+    )
+);
+
+INSERT INTO config.global_flag (name, value, enabled, label)
+VALUES (
+    'auth.block_expired_staff_login',
+    NULL,
+    FALSE,
+    oils_i18n_gettext(
+        'auth.block_expired_staff_login',
+        'Block the ability of expired user with the STAFF_LOGIN permission to log into Evergreen.',
+        'cgf', 'label'
+    )
+);
+
+INSERT INTO config.internal_flag (name, value, enabled) VALUES ('symspell.prefix_length', '6', TRUE);
+INSERT INTO config.internal_flag (name, value, enabled) VALUES ('symspell.max_edit_distance', '3', TRUE);
+
+INSERT into config.org_unit_setting_type
+( name, grp, label, description, datatype )
+VALUES
+( 'opac.did_you_mean.low_result_threshold', 'opac',
+   oils_i18n_gettext(
+     'opac.did_you_mean.low_result_threshold',
+     'Maximum search result count at which spelling suggestions may be offered',
+     'coust', 'label'),
+   oils_i18n_gettext(
+     'opac.did_you_mean.low_result_threshold',
+     'If a search results in this number or fewer results, and there are correctable spelling mistakes, a suggested search may be provided.',
+     'coust', 'description'),
+   'integer' );
+
+INSERT into config.org_unit_setting_type
+( name, grp, label, description, datatype )
+VALUES
+( 'search.symspell.min_suggestion_use_threshold', 'opac',
+   oils_i18n_gettext(
+     'search.symspell.min_suggestion_use_threshold',
+     'Minimum required uses of a spelling suggestions that may be offered',
+     'coust', 'label'),
+   oils_i18n_gettext(
+     'search.symspell.min_suggestion_use_threshold',
+     'The number of bibliographic records (more or less) that a spelling suggestion must appear in to be considered before offering it to a user. Defaults to 1 (must appear in the bib data).',
+     'coust', 'description'),
+   'integer' );
+
+INSERT into config.org_unit_setting_type
+( name, grp, label, description, datatype )
+VALUES
+( 'search.symspell.soundex.weight', 'opac',
+   oils_i18n_gettext(
+     'search.symspell.soundex.weight',
+     'Soundex score weighting in OPAC spelling suggestions.',
+     'coust', 'label'),
+   oils_i18n_gettext(
+     'search.symspell.soundex.weight',
+     'Soundex, trgm, and keyboard distance similarity measures can be combined to form a secondary ordering parameter for spelling suggestions. This controls the relative weight of the scaled soundex component. Defaults to 0 for "off".',
+     'coust', 'description'),
+   'integer' );
+
+INSERT into config.org_unit_setting_type
+( name, grp, label, description, datatype )
+VALUES
+( 'search.symspell.pg_trgm.weight', 'opac',
+   oils_i18n_gettext(
+     'search.symspell.pg_trgm.weight',
+     'Pg_trgm score weighting in OPAC spelling suggestions.',
+     'coust', 'label'),
+   oils_i18n_gettext(
+     'search.symspell.pg_trgm.weight',
+     'Soundex, pg_trgm, and keyboard distance similarity measures can be combined to form a secondary ordering parameter for spelling suggestions. This controls the relative weight of the scaled pg_trgm component. Defaults to 0 for "off".',
+     'coust', 'description'),
+   'integer' );
+
+INSERT into config.org_unit_setting_type
+( name, grp, label, description, datatype )
+VALUES
+( 'search.symspell.keyboard_distance.weight', 'opac',
+   oils_i18n_gettext(
+     'search.symspell.keyboard_distance.weight',
+     'Keyboard distance score weighting in OPAC spelling suggestions.',
+     'coust', 'label'),
+   oils_i18n_gettext(
+     'search.symspell.keyboard_distance.weight',
+     'Soundex, trgm, and keyboard distance similarity measures can be combined to form a secondary ordering parameter for spelling suggestions. This controls the relative weight of the scaled keyboard distance component. Defaults to 0 for "off".',
+     'coust', 'description'),
+   'integer' );
+
+
+INSERT INTO config.workstation_setting_type (name, grp, datatype, label)
+VALUES (
+    'eg.staff.catalog.results.show_more', 'gui', 'bool',
+    oils_i18n_gettext(
+        'eg.staff.catalog.results.show_more',
+        'Show more details in Angular staff catalog',
+        'cwst', 'label'
+    )
+);
+