</actions>
</permacrud>
</class>
- <class id="abhe" controller="open-ils.cstore open-ils.pcrud" oils_obj:fieldmapper="action::batch_hold_event" oils_persist:tablename="action.batch_hold_event" reporter:label="Batch Hold Event">
+ <class id="abhe" controller="open-ils.cstore open-ils.pcrud" oils_obj:fieldmapper="action::batch_hold_event" oils_persist:tablename="action.batch_hold_event" reporter:label="Hold Group Event">
<fields oils_persist:primary="id" oils_persist:sequence="action.batch_hold_event_id_seq">
<field name="id" reporter:datatype="id" />
<field name="staff" reporter:datatype="link"/>
</links>
<permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
<actions>
- <create permission="MANAGE_BATCH_HOLDS" global_required="true"/>
+ <create permission="MANAGE_HOLD_GROUPS" global_required="true"/>
<retrieve/>
- <update permission="MANAGE_BATCH_HOLDS" global_required="true"/>
- <delete permission="MANAGE_BATCH_HOLDS" global_required="true"/>
+ <update permission="MANAGE_HOLD_GROUPS" global_required="true"/>
+ <delete permission="MANAGE_HOLD_GROUPS" global_required="true"/>
</actions>
</permacrud>
</class>
- <class id="abhem" controller="open-ils.cstore open-ils.pcrud" oils_obj:fieldmapper="action::batch_hold_event_map" oils_persist:tablename="action.batch_hold_event_map" reporter:label="Batch Hold Event Map">
+ <class id="abhem" controller="open-ils.cstore open-ils.pcrud" oils_obj:fieldmapper="action::batch_hold_event_map" oils_persist:tablename="action.batch_hold_event_map" reporter:label="Hold Group Event Map">
<fields oils_persist:primary="id" oils_persist:sequence="action.batch_hold_event_map_id_seq">
<field name="id" reporter:datatype="id" />
<field name="batch_hold_event" reporter:datatype="link"/>
my $org = $e->requestor->ws_ou || $e->requestor->home_ou;
# the perm locaiton shouldn't really matter here since holds
- # will exist all over and MANAGE_BATCH_HOLDS should be universal
- my $evt = $U->check_perms($e->requestor->id, $org, 'MANAGE_BATCH_HOLDS');
+ # will exist all over and MANAGE_HOLD_GROUPS should be universal
+ my $evt = $U->check_perms($e->requestor->id, $org, 'MANAGE_HOLD_GROUPS');
return $evt if $evt;
my $rand_setting = $U->ou_ancestor_setting_value($org, 'holds.subscription.randomize');
desc => q/This is for batch creating a set of holds where every field is identical except for the target users./,
params => [
{ desc => 'Authentication token', type => 'string' },
- { desc => 'Batch Hold Event ID to roll back', type => 'number' },
+ { desc => 'Hold Group Event ID to roll back', type => 'number' },
],
return => {
desc => 'Stream of objects structured as {total=>X, count=>Y} on success, event on error',
return $e->die_event unless $e->checkauth;
my $org = $e->requestor->ws_ou || $e->requestor->home_ou;
- my $evt = $U->check_perms($e->requestor->id, $org, 'MANAGE_BATCH_HOLDS');
+ my $evt = $U->check_perms($e->requestor->id, $org, 'MANAGE_HOLD_GROUPS');
return $evt if $evt;
my $batch_event = $e->retrieve_action_batch_hold_event($event_id);
if ($ctx->{hold_subscription}) {
# this is a batch event, hold "user" is a bucket id
- $logger->info("Hold Subscription Event requested for user bucket: " . $ctx->{hold_subscription});
+ $logger->info("Hold Group Event requested for user bucket: " . $ctx->{hold_subscription});
$usr = $e->retrieve_container_user_bucket($ctx->{hold_subscription});
}
}
'View booking resource types', 'ppl', 'description')),
( 622, 'VIEW_BOOKING_RESOURCE', oils_i18n_gettext(622,
'View booking resources', 'ppl', 'description')),
- ( 623, 'MANAGE_BATCH_HOLDS', oils_i18n_gettext(623,
+ ( 623, 'MANAGE_HOLD_GROUPS', oils_i18n_gettext(623,
'Manage batch (subscription) hold events', 'ppl', 'description'))
;
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, 'Subscription Event rollback', '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);
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 Subscription Container', 'cubt', 'label'));
+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 --
);
INSERT INTO action_trigger.event_definition (active, owner, name, hook, validator, reactor, delay, delay_field, group_field, cleanup_success, template)
- VALUES ('f', 1, 'Subscription Hold Placed for Patron Email Notification', 'hold_request.success', 'NOOP_True', 'SendEmail', '30 minutes', 'request_time', 'usr', 'CreateHoldNotification',
+ 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 -%]
active, owner, name, hook, validator, reactor, cleanup_success,
delay, delay_field, group_field, template
) VALUES (
- false, 1, 'Subscription Hold Placed for Patron SMS Notification', 'hold_request.success', 'NOOP_True',
+ 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 -%]
hold INT NOT NULL REFERENCES action.hold_request (id) ON UPDATE CASCADE ON DELETE CASCADE
);
-INSERT INTO container.user_bucket_type (code,label) VALUES ('hold_subscription','Hold Subscription Container');
+INSERT INTO container.user_bucket_type (code,label) VALUES ('hold_subscription','Hold Group Container');
INSERT INTO config.org_unit_setting_type
(name, label, description, grp, datatype)
-- Committer! Verify permission id before pushing!
INSERT INTO permission.perm_list (id,code,description)
- VALUES ( 623, 'MANAGE_BATCH_HOLDS', oils_i18n_gettext(623, 'Manage batch (subscription) hold events', 'ppl', 'description'));
+ VALUES ( 623, 'MANAGE_HOLD_GROUPS', oils_i18n_gettext(623, 'Manage hold groups and hold group events', 'ppl', 'description'));
INSERT INTO action.hold_request_cancel_cause (id,label)
- VALUES ( 8, oils_i18n_gettext(8, 'Subscription Event rollback', 'ahrcc', 'label'));
+ VALUES ( 8, oils_i18n_gettext(8, 'Hold Group Event rollback', 'ahrcc', 'label'));
INSERT INTO action_trigger.event_definition (active, owner, name, hook, validator, reactor, delay, delay_field, group_field, cleanup_success, template)
- VALUES ('f', 1, 'Subscription Hold Placed for Patron Email Notification', 'hold_request.success', 'NOOP_True', 'SendEmail', '30 minutes', 'request_time', 'usr', 'CreateHoldNotification',
+ 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 -%]
active, owner, name, hook, validator, reactor, cleanup_success,
delay, delay_field, group_field, template
) VALUES (
- false, 1, 'Subscription Hold Placed for Patron SMS Notification', 'hold_request.success', 'NOOP_True',
+ 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 -%]
</div>
[% IF ctx.my_hold_subscriptions.size > 0 %]
<div class="align">
- <a href='[% mkurl('hold_subscriptions', {}, ['limit','offset','available','sort','sort_type']) %]'>[% l("Hold Subscriptions") %]</a>
+ <a href='[% mkurl('hold_subscriptions', {}, ['limit','offset','available','sort','sort_type']) %]'>[% l("Hold Groups") %]</a>
</div>
[% END %]
<div class="align">
</div>
[% IF ctx.my_hold_subscriptions.size > 0 %]
<div class="align">
- <a href='[% mkurl('hold_subscriptions', {}, ['limit','offset','available','sort','sort_type']) %]'>[% l("Hold Subscriptions") %]</a>
+ <a href='[% mkurl('hold_subscriptions', {}, ['limit','offset','available','sort','sort_type']) %]'>[% l("Hold Groups") %]</a>
</div>
[% END %]
<div class="align">
[% END %]
[% IF ctx.my_hold_subscriptions.size > 0 %]
<div class="align">
- <a href='[% mkurl('hold_subscriptions', {}, ['limit','offset','available','sort','sort_type']) %]'>[% l("Hold Subscriptions") %]</a>
+ <a href='[% mkurl('hold_subscriptions', {}, ['limit','offset','available','sort','sort_type']) %]'>[% l("Hold Groups") %]</a>
</div>
[% END %]
<div class="align selected">
[% END %]
[% IF ctx.my_hold_subscriptions.size > 0 %]
<div class="align selected">
- <a href='#'>[% l("Hold Subscriptions") %]</a>
+ <a href='#'>[% l("Hold Groups") %]</a>
</div>
[% END %]
<div class="align">
</div>
<div class="header_middle">
- <span style="float:left;">[% l("Current Hold Subscriptions") %]</span>
+ <span style="float:left;">[% l("Current Hold Groups") %]</span>
<span style="float:right;">
<a class="hide_me" href="#">[% l('Export List') %]</a>
</span>
<big><strong>[% l('No subscriptions found.') %]</strong></big>
</div>
[% ELSE %]
- <table id='acct_holds_hist_header' class='table_no_border_space table_no_cell_pad' title="[% l('Hold Subscriptions') %]">
+ <table id='acct_holds_hist_header' class='table_no_border_space table_no_cell_pad' title="[% l('Hold Groups') %]">
<thead>
<tr>
<td><span>[% l('Name') %]</span></td>
[% END %]
[% IF ctx.my_hold_subscriptions.size > 0 %]
<div class="align">
- <a href='[% mkurl('hold_subscriptions', {}, ['limit','offset','available','sort','sort_type']) %]'>[% l("Hold Subscriptions") %]</a>
+ <a href='[% mkurl('hold_subscriptions', {}, ['limit','offset','available','sort','sort_type']) %]'>[% l("Hold Groups") %]</a>
</div>
[% END %]
<div class="align">
name="hold_usr_is_requestor" value="2"
/>
<label for="hold_usr_is_subscription">
- [% l("Place hold for patron Hold Subscription:") %]
+ [% l("Place hold for patron Hold Group:") %]
</label>
<select id='select_hold_subscription' name='hold_subscription'>
- <option selected='selected' value=''>[% l('- Subscriptions -') %]</option>
+ <option selected='selected' value=''>[% l('- Hold Groups -') %]</option>
[% FOR sub IN ctx.hold_subscriptions %]
<option value='[% sub.id %]'>[% sub.name | html %]</option>
[% END %]
[%
WRAPPER "staff/base.tt2";
- ctx.page_title = l("Batch Hold Buckets");
+ ctx.page_title = l("Hold Group Buckets");
ctx.page_app = "egCatBatchHoldBuckets";
ctx.page_ctrl = "BatchHoldBucketCtrl";
%]
s.EVENT_ROLLBACK_TITLE =
"[% l('Cancel all holds created by selected events') %]";
s.EVENT_NO_TARGET =
- "[% l('No target provided for hold subscription') %]";
+ "[% l('No target provided for hold group') %]";
s.EVENT_INVALID_TARGET =
- "[% l('Invalid target provided for hold subscription') %]";
+ "[% l('Invalid target provided for hold group') %]";
s.EVENT_CREATE_SUMMARY =
- "[% l('Created subscription hold for [_1] of [_2] patrons', '{{success}}', '{{total}}') %]";
+ "[% l('Created holds for [_1] of [_2] patrons', '{{success}}', '{{total}}') %]";
}])
</script>
[% END %]
<ul class="nav nav-tabs">
<li ng-class="{active : tab == 'list'}">
<a href="./cat/bucket/batch_hold/list">
- [% l('Subscriptions') %]
+ [% l('Hold Groups') %]
</a>
</li>
<li ng-class="{active : tab == 'view'}">
<div ng-show="bucket()">
- <strong>[% l('Subscription #{{bucket().id()}}: {{bucket().name()}}') %]</strong>
+ <strong>[% l('Hold Group #{{bucket().id()}}: {{bucket().name()}}') %]</strong>
<span ng-show="bucket().description()"> / {{bucket().description()}}</span>
<br/>
<span>
</div>
<div ng-show="!bucket()">
- <strong>[% l('No Subscription Selected') %]</strong>
+ <strong>[% l('No Hold Group Selected') %]</strong>
</div>
persist-key="cat.bucket.batch_hold.events">
- <eg-grid-menu-item label="[% l('New Batch Hold Event') %]" standalone="true"
+ <eg-grid-menu-item label="[% l('New Hold Group Event') %]" standalone="true"
handler="openCreateEventDialog"></eg-grid-menu-item>
- <eg-grid-action label="[% l('Cancel batch holds') %]"
+ <eg-grid-action label="[% l('Cancel hold group event') %]"
handler="rollbackEvent"></eg-grid-action>
<eg-grid-field path="id" required hidden></eg-grid-field>
<div class="modal-header">
<button type="button" class="close"
ng-click="cancel()" aria-hidden="true">×</button>
- <h4 class="modal-title">[% l('New Batch Hold Event') %]</h4>
+ <h4 class="modal-title">[% l('New Hold Group Event') %]</h4>
</div>
<div class="modal-body">
<div class="form-group">
<!-- global grid menu displayed on every Bucket page -->
-<eg-grid-menu-item label="[% l('New Subscription') %]" standalone="true"
+<eg-grid-menu-item label="[% l('New Hold Group') %]" standalone="true"
handler="openCreateBucketDialog"></eg-grid-menu-item>
-<eg-grid-menu-item label="[% l('Edit Subscription') %]"
+<eg-grid-menu-item label="[% l('Edit Hold Group') %]"
handler="openEditBucketDialog"></eg-grid-menu-item>
-<eg-grid-menu-item label="[% l('Delete Subscription') %]"
+<eg-grid-menu-item label="[% l('Delete Hold Group') %]"
handler="openDeleteBucketDialog"></eg-grid-menu-item>
-<eg-grid-menu-item label="[% l('Shared Subscription') %]"
+<eg-grid-menu-item label="[% l('Shared Hold Group') %]"
handler="openSharedBucketDialog"></eg-grid-menu-item>
<eg-grid-menu-item divider="true"></eg-grid-menu-item>
grid-controls="gridControls"
persist-key="cat.bucket.batch_hold.list">
- <eg-grid-menu-item label="[% l('New Subscription') %]" standalone="true"
+ <eg-grid-menu-item label="[% l('New Hold Group') %]" standalone="true"
handler="openCreateBucketDialog"></eg-grid-menu-item>
<eg-grid-field path="id" required hidden></eg-grid-field>
items-provider="gridDataProvider"
persist-key="cat.bucket.batch_hold.pending">
- <eg-grid-menu-item label="[% l('Add All To Subscription') %]" standalone="true"
+ <eg-grid-menu-item label="[% l('Add All To Hold Group') %]" standalone="true"
handler="addAllPending"></eg-grid-menu-item>
<!-- actions drop-down -->
- <eg-grid-action label="[% l('Add To Subscription') %]"
+ <eg-grid-action label="[% l('Add To Hold Group') %]"
handler="addToBucket"></eg-grid-action>
<eg-grid-action label="[% l('Clear List') %]"
idl-class="au"
auto-fields="true"
grid-controls="gridControls"
- menu-label="[% l('Subscriptions') %]"
+ menu-label="[% l('Hold Groups') %]"
persist-key="cat.bucket.batch_hold.view">
[% INCLUDE 'staff/cat/bucket/batch_hold/t_grid_menu.tt2' %]
s.PAGE_TITLE_PATRON_ITEMS_OUT = "[% l('Items Out') %]";
s.PAGE_TITLE_PATRON_EDIT = "[% l('Edit') %]";
s.MERGE_SELF_NOT_ALLOWED = "[% l('Logged in account cannot be merged') %]"
- s.REMOVE_HOLD_SUBSCRIPTIONS = "[% l('Remove selected Hold Subscriptions for user?') %]"
+ s.REMOVE_HOLD_SUBSCRIPTIONS = "[% l('Remove selected Hold Groups for user?') %]"
}]);
</script>
</li>
<li>
<a href="./circ/patron/{{patron().id()}}/hold_subscriptions">
- [% l('Hold Subscriptions') %]
+ [% l('Hold Groups') %]
</a>
</li>
<li>
-<div class="strong-text-2">[% l('Hold Subscriptions') %]</div>
+<div class="strong-text-2">[% l('Hold Groups') %]</div>
<eg-grid
features="allowAll,-display"
items-provider="gridDataProvider"
persist-key="circ.patron.batch_hold.list">
-<eg-grid-action label="[% l('Remove Subscription') %]"
+<eg-grid-action label="[% l('Remove Hold Groups') %]"
handler="removeSubscriptions"></eg-grid-action>
<eg-grid-field path="id" required hidden></eg-grid-field>
handler="addToBucket" disabled="need_one_selected"></eg-grid-menu-item>
<eg-grid-menu-item ng-repeat="bkt in bucketSvc.allSubscriptions"
- label="[% 'Hold Subscription: ' %] {{bkt.name()}}" handler-data="bkt"
+ label="[% 'Hold Groups: ' %] {{bkt.name()}}" handler-data="bkt"
handler="addToBucket" disabled="need_one_selected"></eg-grid-menu-item>
<eg-grid-field label="[% l('ID') %]" path='id' visible></eg-grid-field>
<li>
<a href="./cat/bucket/batch_hold/list" target="_self">
<span class="glyphicon glyphicon-list-alt"></span>
- [% l('Hold Subscriptions') %]
+ [% l('Hold Groups') %]
</a>
</li>
<li class="divider"></li>
/**
- * Batch Hold (user) Buckets
+ * Hold Group (user) Buckets
*
* Known Issues
*
var service = {
allBuckets : [], // un-fleshed user buckets
- allSubscriptions : [], // un-fleshed user buckets for hold subscriptions
+ allSubscriptions : [], // un-fleshed user buckets for hold groups
barcodeString : '', // last scanned barcode
barcodeRecords : [], // last scanned barcode results
currentBucket : null, // currently viewed bucket
-Hold Subscriptions
-^^^^^^^^^^^^^^^^^^
+Hold Groups
+^^^^^^^^^^^
-This feature allows staff to add multiple users to a named hold subscription
+This feature allows staff to add multiple users to a named hold group
bucket and place title-level holds for a record for that entire set of users.
-Users can be added to such a hold subscription bucket from either the patron
+Users can be added to such a hold group bucket from either the patron
search result interface, via the Add to Bucket dropdown, or through a dedicated
-Hold Subscription interface available from the Circulation menu. Adding new
-patrons to a subscription bucket will require staff have the PLACE_HOLD
+Hold Group interface available from the Circulation menu. Adding new
+patrons to a hold group bucket will require staff have the PLACE_HOLD
permission.
-Holds can be placed for the users in a subscription bucket either directly from
+Holds can be placed for the users in a hold group bucket either directly from
the normal staff-place hold interface in the embedded OPAC, or by supplying the
-record ID within the subscription bucket interface. In the latter case, the
+record ID within the hold group bucket interface. In the latter case, the
list of users for which a hold was attempted but failed to be placed can be
downloaded by staff in order to address any placement issues. Placing a
-subscription bucket hold will requires staff have the MANAGE_BATCH_HOLDS
+hold group bucket hold will requires staff have the MANAGE_HOLD_GROUPS
permission, which is new with this development.
-In the event of a mistaken subscription hold, staff with the MANAGE_BATCH_HOLDS
+In the event of a mistaken hold group hold, staff with the MANAGE_HOLD_GROUPS
permission will have the ability to cancel all unfulfilled holds created as
-part of a subscription hold event.
+part of a hold group event.
-A link to the title's hold interface is available from the list of subscription
-hold events in the dedicated subscription hold interface.
+A link to the title's hold interface is available from the list of hold group
+events in the dedicated hold group interface.