}
__PACKAGE__->register_method(
+ method => "print_hold_pull_list",
+ api_name => "open-ils.circ.hold_pull_list.print",
+ signature => {
+ desc => 'Returns an HTML-formatted holds pull list',
+ params => [
+ { desc => 'Authtoken', type => 'string'},
+ { desc => 'Org unit ID. Optional, defaults to workstation org unit', type => 'number'},
+ ],
+ return => {
+ desc => 'HTML string',
+ type => 'string'
+ }
+ }
+);
+
+sub print_hold_pull_list {
+ my($self, $client, $auth, $org_id) = @_;
+
+ my $e = new_editor(authtoken=>$auth, xact=>1);
+ return $e->die_event unless $e->checkauth;
+
+ $org_id = (defined $org_id) ? $org_id : $e->requestor->ws_ou;
+ return $e->die_event unless $e->allowed('VIEW_HOLD', $org_id);
+
+ my $hold_ids = $U->storagereq(
+ 'open-ils.storage.direct.action.hold_request.pull_list.id_list.current_copy_circ_lib.status_filtered.atomic',
+ $org_id, 10000);
+
+ return undef unless @$hold_ids;
+ $client->status(new OpenSRF::DomainObject::oilsContinueStatus);
+
+ my $holds = $e->search_action_hold_request({id => $hold_ids}, {substream => 1});
+ $client->status(new OpenSRF::DomainObject::oilsContinueStatus);
+
+ return $U->fire_object_event(undef, 'ahr.format.pull_list', $holds, $org_id);
+}
+
+
+
+__PACKAGE__->register_method(
method => 'fetch_hold_notify',
api_name => 'open-ils.circ.hold_notification.retrieve_by_hold',
authoritative => 1,
install_date TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW()
);
-INSERT INTO config.upgrade_log (version) VALUES ('0381'); -- dbs
+INSERT INTO config.upgrade_log (version) VALUES ('0384'); -- berick
CREATE TABLE config.bib_source (
id SERIAL PRIMARY KEY,
,(1, 'cat.label.font.weight', '"normal"')
;
+-- 0384.data.hold_pull_list_template.sql
+INSERT INTO action_trigger.hook (key,core_type,description,passive)
+ VALUES (
+ 'ahr.format.pull_list',
+ 'ahr',
+ oils_i18n_gettext(
+ 'ahr.format.pull_list',
+ 'Format holds pull list for printing',
+ 'ath',
+ 'description'
+ ),
+ FALSE
+ );
+
+INSERT INTO action_trigger.event_definition (
+ id,
+ active,
+ owner,
+ name,
+ hook,
+ validator,
+ reactor,
+ group_field,
+ granularity,
+ template
+ ) VALUES (
+ 35,
+ TRUE,
+ 1,
+ 'Holds Pull List',
+ 'ahr.format.pull_list',
+ 'NOOP_True',
+ 'ProcessTemplate',
+ 'pickup_lib',
+ 'print-on-demand',
+$$
+[%- USE date -%]
+<style>
+ table { border-collapse: collapse; }
+ td { padding: 5px; border-bottom: 1px solid #888; }
+ th { font-weight: bold; }
+</style>
+[%
+ # Sort the holds into copy-location buckets
+ # In the main print loop, sort each bucket by callnumber before printing
+ SET holds_list = [];
+ SET loc_data = [];
+ SET current_location = target.0.current_copy.location.id;
+ FOR hold IN target;
+ IF current_location != hold.current_copy.location.id;
+ SET current_location = hold.current_copy.location.id;
+ holds_list.push(loc_data);
+ SET loc_data = [];
+ END;
+ SET hold_data = {
+ 'hold' => hold,
+ 'callnumber' => hold.current_copy.call_number.label
+ };
+ loc_data.push(hold_data);
+ END;
+ holds_list.push(loc_data)
+%]
+<table>
+ <thead>
+ <tr>
+ <th>Title</th>
+ <th>Author</th>
+ <th>Shelving Location</th>
+ <th>Call Number</th>
+ <th>Barcode</th>
+ <th>Patron</th>
+ </tr>
+ </thead>
+ <tbody>
+ [% FOR loc_data IN holds_list %]
+ [% FOR hold_data IN loc_data.sort('callnumber') %]
+ [%
+ SET hold = hold_data.hold;
+ SET copy_data = helpers.get_copy_bib_basics(hold.current_copy.id);
+ %]
+ <tr>
+ <td>[% copy_data.title | truncate %]</td>
+ <td>[% copy_data.author | truncate %]</td>
+ <td>[% hold.current_copy.location.name %]</td>
+ <td>[% hold.current_copy.call_number.label %]</td>
+ <td>[% hold.current_copy.barcode %]</td>
+ <td>[% hold.usr.card.barcode %]</td>
+ </tr>
+ [% END %]
+ [% END %]
+ <tbody>
+</table>
+$$
+);
+
+INSERT INTO action_trigger.environment (
+ event_def,
+ path
+ ) VALUES
+ (35, 'current_copy.location'),
+ (35, 'current_copy.call_number'),
+ (35, 'usr.card'),
+ (35, 'pickup_lib')
+;
--- /dev/null
+BEGIN;
+
+INSERT INTO config.upgrade_log (version) VALUES ('0384');
+
+INSERT INTO action_trigger.hook (key,core_type,description,passive)
+ VALUES (
+ 'ahr.format.pull_list',
+ 'ahr',
+ oils_i18n_gettext(
+ 'ahr.format.pull_list',
+ 'Format holds pull list for printing',
+ 'ath',
+ 'description'
+ ),
+ FALSE
+ );
+
+INSERT INTO action_trigger.event_definition (
+ id,
+ active,
+ owner,
+ name,
+ hook,
+ validator,
+ reactor,
+ group_field,
+ granularity,
+ template
+ ) VALUES (
+ 35,
+ TRUE,
+ 1,
+ 'Holds Pull List',
+ 'ahr.format.pull_list',
+ 'NOOP_True',
+ 'ProcessTemplate',
+ 'pickup_lib',
+ 'print-on-demand',
+$$
+[%- USE date -%]
+<style>
+ table { border-collapse: collapse; }
+ td { padding: 5px; border-bottom: 1px solid #888; }
+ th { font-weight: bold; }
+</style>
+[%
+ # Sort the holds into copy-location buckets
+ # In the main print loop, sort each bucket by callnumber before printing
+ SET holds_list = [];
+ SET loc_data = [];
+ SET current_location = target.0.current_copy.location.id;
+ FOR hold IN target;
+ IF current_location != hold.current_copy.location.id;
+ SET current_location = hold.current_copy.location.id;
+ holds_list.push(loc_data);
+ SET loc_data = [];
+ END;
+ SET hold_data = {
+ 'hold' => hold,
+ 'callnumber' => hold.current_copy.call_number.label
+ };
+ loc_data.push(hold_data);
+ END;
+ holds_list.push(loc_data)
+%]
+<table>
+ <thead>
+ <tr>
+ <th>Title</th>
+ <th>Author</th>
+ <th>Shelving Location</th>
+ <th>Call Number</th>
+ <th>Barcode</th>
+ <th>Patron</th>
+ </tr>
+ </thead>
+ <tbody>
+ [% FOR loc_data IN holds_list %]
+ [% FOR hold_data IN loc_data.sort('callnumber') %]
+ [%
+ SET hold = hold_data.hold;
+ SET copy_data = helpers.get_copy_bib_basics(hold.current_copy.id);
+ %]
+ <tr>
+ <td>[% copy_data.title | truncate %]</td>
+ <td>[% copy_data.author | truncate %]</td>
+ <td>[% hold.current_copy.location.name %]</td>
+ <td>[% hold.current_copy.call_number.label %]</td>
+ <td>[% hold.current_copy.barcode %]</td>
+ <td>[% hold.usr.card.barcode %]</td>
+ </tr>
+ [% END %]
+ [% END %]
+ <tbody>
+</table>
+$$
+);
+
+INSERT INTO action_trigger.environment (
+ event_def,
+ path
+ ) VALUES
+ (35, 'current_copy.location'),
+ (35, 'current_copy.call_number'),
+ (35, 'usr.card'),
+ (35, 'pickup_lib')
+;
+
+-- DELETE FROM config.upgrade_log WHERE version = 'tmp'; DELETE FROM action_trigger.event WHERE event_def IN (35); DELETE FROM action_trigger.environment WHERE event_def IN (35); DELETE FROM action_trigger.event_definition WHERE id IN (35); DELETE FROM action_trigger.hook WHERE key IN ( 'ahr.format.pull_list' );
+
+COMMIT;
+
<!ENTITY staff.patron.holds_overlay.holds_export.label "Export">
<!ENTITY staff.patron.holds_overlay.print.label "Print">
<!ENTITY staff.patron.holds_overlay.print.accesskey "P">
+<!ENTITY staff.patron.holds_overlay.print_full_pull_list.label "Print Full Pull List">
+<!ENTITY staff.patron.holds_overlay.print_full_pull_list.accesskey "u">
<!ENTITY staff.patron.holds_overlay.place_hold.label "Place Hold">
<!ENTITY staff.patron.holds_overlay.place_hold.accesskey "H">
<!ENTITY staff.patron.holds_overlay.show_cancelled_holds.label "Show Cancelled Holds">
'FM_AHR_PULL_LIST' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.hold_pull_list.retrieve' },
'FM_AHR_PULL_LIST_COUNT' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.hold_pull_list.retrieve.count' },
'FM_AHR_ID_LIST_PULL_LIST' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.hold_pull_list.id_list.retrieve', 'secure' : false },
+ 'HTML_HOLD_PULL_LIST' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.hold_pull_list.print' },
'FM_AHR_ONSHELF_RETRIEVE' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.captured_holds.on_shelf.retrieve' },
'FM_AHR_ID_LIST_ONSHELF_RETRIEVE' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.captured_holds.id_list.on_shelf.retrieve', 'secure' : false },
'FM_AHR_ID_LIST_EXPIRED_ONSHELF_RETRIEVE' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.captured_holds.id_list.expired_on_shelf.retrieve', 'secure' : false },
);
}
],
-
+ 'cmd_holds_print_full' : [
+ ['command'],
+ function() {
+ var x_print_full_pull_list = document.getElementById('print_full_btn');
+ try {
+ if (progressmeter) {
+ progressmeter.mode = 'undetermined';
+ progressmeter.hidden = false;
+ x_print_full_pull_list.disabled = true;
+ }
+ JSAN.use('util.print');
+ var print = new util.print('default');
+ var robj = obj.network.simple_request('HTML_HOLD_PULL_LIST',[ses()]);
+ if (typeof robj.ilsevent != 'undefined') { throw(robj); }
+ print.simple( robj.template_output().data() );
+ } catch(E) {
+ obj.error.standard_unexpected_error_alert('cmd_holds_print_full',E);
+ }
+ if (progressmeter) {
+ progressmeter.mode = 'determined';
+ progressmeter.hidden = true;
+ x_print_full_pull_list.disabled = false;
+ }
+ }
+ ],
'cmd_holds_print' : [
['command'],
function() {
var x_show_cancelled_deck = document.getElementById('show_cancelled_deck');
var x_clear_shelf_widgets = document.getElementById('clear_shelf_widgets');
var x_expired_checkbox = document.getElementById('expired_checkbox');
+ var x_print_full_pull_list = document.getElementById('print_full_btn');
switch(obj.hold_interface_type) {
case 'shelf':
obj.render_lib_menus({'pickup_lib':true});
break;
case 'pull' :
if (x_fetch_more) x_fetch_more.hidden = false;
+ if (x_print_full_pull_list) x_print_full_pull_list.hidden = false;
if (x_lib_type_menu) x_lib_type_menu.hidden = true;
if (x_lib_menu_placeholder) x_lib_menu_placeholder.hidden = true;
break;
<command id="cmd_csv_to_printer" />
<command id="cmd_csv_to_file" />
<command id="cmd_holds_print" />
+ <command id="cmd_holds_print_full" />
<command id="cmd_show_catalog" />
<command id="cmd_retrieve_patron" />
<command id="cmd_holds_edit_desire_mint_condition" />
</button>
<button id="holds_print" label="&staff.patron.holds_overlay.print.label;" command="cmd_holds_print" accesskey="&staff.patron.holds_overlay.print.accesskey;" />
+ <button id="print_full_btn" hidden="true" label="&staff.patron.holds_overlay.print_full_pull_list.label;" command="cmd_holds_print_full" accesskey="&staff.patron.holds_overlay.print_full_pull_list.accesskey;" />
<spacer flex="1"/>
</hbox>