]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/xul/staff_client/server/cat/util.js
charge patron prompt for mark item damaged. Still need to plugin code to handle...
[working/Evergreen.git] / Open-ILS / xul / staff_client / server / cat / util.js
1 dump('entering cat/util.js\n');
2
3 function $(id) { return document.getElementById(id); }
4
5 if (typeof cat == 'undefined') var cat = {};
6 cat.util = {};
7
8 cat.util.EXPORT_OK      = [ 
9         'spawn_copy_editor', 'add_copies_to_bucket', 'show_in_opac', 'spawn_spine_editor', 'transfer_copies', 
10         'mark_item_missing', 'mark_item_damaged', 'replace_barcode',
11 ];
12 cat.util.EXPORT_TAGS    = { ':all' : cat.util.EXPORT_OK };
13
14 cat.util.replace_barcode = function(old_bc) {
15         try {
16                 JSAN.use('util.network');
17                 var network = new util.network();
18
19                 if (!old_bc) old_bc = window.prompt($("catStrings").getString('staff.cat.util.replace_barcode.old_bc_window_prompt.prompt'),
20                         '',
21                         $("catStrings").getString('staff.cat.util.replace_barcode.old_bc_window_prompt.title'));
22                 if (!old_bc) return;
23
24                 var copy;
25         try {
26                         copy = network.simple_request('FM_ACP_RETRIEVE_VIA_BARCODE',[ old_bc ]);
27                         if (typeof copy.ilsevent != 'undefined') throw(copy); 
28                         if (!copy) throw(copy);
29                 } catch(E) {
30                         alert($("catStrings").getFormattedString('staff.cat.util.replace_barcode.error_alert', [old_bc]) + '\n');
31                         return old_bc;
32                 }
33         
34                 // Why did I want to do this twice?  Because this copy is more fleshed?
35                 try {
36                         copy = network.simple_request('FM_ACP_RETRIEVE',[ copy.id() ]);
37                         if (typeof copy.ilsevent != 'undefined') throw(copy);
38                         if (!copy) throw(copy);
39                 } catch(E) {
40                         try {
41                                 alert($("catStrings").getFormattedString('staff.cat.util.replace_barcode.error_alert', [old_bc]) +
42                                          '\n' + (typeof E.ilsevent == 'undefined' ? '' : E.textcode + ' : ' + E.desc));
43                         } catch(F) {
44                                 alert(E + '\n' + F);
45                         }
46                         return old_bc;
47                 }
48         
49                 var new_bc = window.prompt($("catStrings").getString('staff.cat.util.replace_barcode.new_bc_window_prompt.prompt'),
50                         '',
51                         $("catStrings").getString('staff.cat.util.replace_barcode.new_bc_window_prompt.title'));
52                 new_bc = String( new_bc ).replace(/\s/g,'');
53                 if (!new_bc) {
54                         alert($("catStrings").getString('staff.cat.util.replace_barcode.new_bc.failed'));
55                         return old_bc;
56                 }
57         
58                 var test = network.simple_request('FM_ACP_RETRIEVE_VIA_BARCODE',[ new_bc ]);
59                 if (typeof test.ilsevent == 'undefined') {
60                         alert('Rename aborted.  Another copy has barcode "' + new_bc + '".');
61                         return old_bc;
62                 } else {
63                         if (test.ilsevent != 1502 /* ASSET_COPY_NOT_FOUND */) {
64                                 obj.error.standard_unexpected_error_alert($("catStrings").getFormattedString('staff.cat.util.replace_barcode.testing_error', [new_bc]), test);
65                                 return old_bc;
66                         }       
67                 }
68
69                 copy.barcode(new_bc); copy.ischanged('1');
70                 var r = network.simple_request('FM_ACP_FLESHED_BATCH_UPDATE', [ ses(), [ copy ] ]);
71                 if (typeof r.ilsevent != 'undefined') { 
72                         if (r.ilsevent != 0) {
73                                 if (r.ilsevent == 5000 /* PERM_FAILURE */) {
74                                         alert($("catStrings").getString('staff.cat.util.replace_barcode.insufficient_permission_for_rename'));
75                                         return old_bc;
76                                 } else {
77                                         obj.error.standard_unexpected_error_alert($("catStrings").getString('staff.cat.util.replace_barcode.item_rename_error'),r);
78                                         return old_bc;
79                                 }
80                         }
81                 }
82
83                 return new_bc;
84         } catch(E) {
85                 JSAN.use('util.error'); var error = new util.error();
86                 error.standard_unexpected_error_alert($("catStrings").getString('staff.cat.util.replace_barcode.rename_error'),E);
87                 return old_bc;
88         }
89 }
90
91 cat.util.transfer_copies = function(params) {
92         JSAN.use('util.error'); var error = new util.error();
93         JSAN.use('OpenILS.data'); var data = new OpenILS.data();
94         JSAN.use('util.network'); var network = new util.network();
95         try {
96                 data.stash_retrieve();
97                 if (!data.marked_volume) {
98                         alert($("catStrings").getString('staff.cat.util.transfer_copies.unmarked_volume_alert'));
99                         return;
100                 }
101                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
102                 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: auto">';
103                 if (!params.message) {
104                         params.message = $("catStrings").getFormattedString('staff.cat.util.transfer_copies.params_message', [data.hash.aou[ params.owning_lib ].shortname(), params.volume_label]);
105                         //params.message = 'Transfer items from their original volumes to ';
106                         //params.message += data.hash.aou[ params.owning_lib ].shortname() + "'s volume labelled ";
107                         //params.message += '"' + params.volume_label + '" on the following record (and change their circ libs to match)?';
108                 }
109
110                 xml += '<description>' + params.message.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;') + '</description>';
111                 xml += '<hbox><button label="' + $("catStrings").getString('staff.cat.util.transfer_copies.transfer.label')+ '" name="fancy_submit"/>';
112                 xml += '<button label="' + $("catStrings").getString('staff.cat.util.transfer_copies.cancel.label');
113                 xml += '" accesskey="'+ $("catStrings").getString('staff.cat.util.transfer_copies.cancel.accesskey') +'" name="fancy_cancel"/></hbox>';
114                 xml += '<iframe style="overflow: scroll" flex="1" src="' + urls.XUL_BIB_BRIEF + '?docid=' + params.docid + '"/>';
115                 xml += '</vbox>';
116                 //data.temp_transfer = xml; data.stash('temp_transfer');
117                 JSAN.use('util.window'); var win = new util.window();
118                 var fancy_prompt_data = win.open(
119                         urls.XUL_FANCY_PROMPT,
120                         //+ '?xml_in_stash=temp_transfer'
121                         //+ '&title=' + window.escape('Item Transfer'),
122                         'fancy_prompt', 'chrome,resizable,modal,width=500,height=300',
123                         { 'xml' : xml, 'title' : $("catStrings").getString('staff.cat.util.transfer_copies.window_title') }
124                 );
125                 if (fancy_prompt_data.fancy_status == 'incomplete') { alert($("catStrings").getString('staff.cat.util.transfer_copies.aborted_transfer')); return; }
126
127                 JSAN.use('util.functional');
128
129                 var copies = network.simple_request('FM_ACP_FLESHED_BATCH_RETRIEVE.authoritative', [ params.copy_ids ]);
130
131                 for (var i = 0; i < copies.length; i++) {
132                         copies[i].call_number( data.marked_volume );
133                         copies[i].circ_lib( params.owning_lib );
134                         copies[i].ischanged( 1 );
135                 }
136
137                 var robj = network.simple_request(
138                         'FM_ACP_FLESHED_BATCH_UPDATE', 
139                         [ ses(), copies, true ], 
140                         null,
141                         {
142                                 'title' : $("catStrings").getString('staff.cat.util.transfer_copies.override_transfer_failure'),
143                                 'overridable_events' : [
144                                         1208 /* TITLE_LAST_COPY */,
145                                         1227 /* COPY_DELETE_WARNING */,
146                                 ]
147                         }
148                 );
149                 
150                 if (typeof robj.ilsevent != 'undefined') {
151                         throw(robj);
152                 } else {
153                         alert($("catStrings").getString('staff.cat.util.transfer_copies.successful_transfer'));
154                 }
155
156         } catch(E) {
157                 error.standard_unexpected_error_alert($("catStrings").getString('staff.cat.util.transfer_copies.transfer_error'),E);
158         }
159 }
160
161 cat.util.spawn_spine_editor = function(selection_list) {
162         JSAN.use('util.error'); var error = new util.error();
163         try {
164                 JSAN.use('util.functional');
165                 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.stash_retrieve();
166                 data.temp_barcodes_for_labels = util.functional.map_list( selection_list, function(o){return o.barcode;}) ; 
167                 data.stash('temp_barcodes_for_labels');
168                 xulG.new_tab(
169                         xulG.url_prefix( urls.XUL_SPINE_LABEL ),
170                         { 'tab_name' : $("catStrings").getString('staff.cat.util.spine_editor.tab_name') },
171                         {}
172                 );
173         } catch(E) {
174                 error.standard_unexpected_error_alert($("catStrings").getString('staff.cat.util.spine_editor.spine_editor_error'),E);
175         }
176 }
177
178 cat.util.show_in_opac = function(selection_list) {
179         JSAN.use('util.error'); var error = new util.error();
180         var doc_id; var seen = {};
181         try {
182                 for (var i = 0; i < selection_list.length; i++) {
183                         doc_id = selection_list[i].doc_id;
184                         if (!doc_id) {
185                                 alert($("catStrings").getFormattedString('staff.cat.util.show_in_opac.unknown_barcode', [selection_list[i].barcode]));
186                                 continue;
187                         }
188                         if (typeof seen[doc_id] != 'undefined') {
189                                 continue;
190                         }
191                         seen[doc_id] = true;
192                         var opac_url = xulG.url_prefix( urls.opac_rdetail ) + '?r=' + doc_id;
193                         var content_params = { 
194                                 'session' : ses(),
195                                 'authtime' : ses('authtime'),
196                                 'opac_url' : opac_url,
197                         };
198                         xulG.new_tab(
199                                 xulG.url_prefix(urls.XUL_OPAC_WRAPPER), 
200                                 {'tab_name':'Retrieving title...'}, 
201                                 content_params
202                         );
203                 }
204         } catch(E) {
205                 error.standard_unexpected_error_alert($("catStrings").getFormattedString('staff.cat.util.show_in_opac.catalog_error_for_doc_id', [doc_id]),E);
206         }
207 }
208
209 cat.util.add_copies_to_bucket = function(selection_list) {
210         JSAN.use('util.functional');
211         JSAN.use('util.window'); var win = new util.window();
212         JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
213         data.cb_temp_copy_ids = js2JSON(
214                 util.functional.map_list(
215                         selection_list,
216                         function (o) {
217                                 if (typeof o.copy_id != 'undefined' && o.copy_id != null) {
218                                         return o.copy_id;
219                                 } else {
220                                         return o;
221                                 }
222                         }
223                 )
224         );
225         data.stash('cb_temp_copy_ids');
226         win.open( 
227                 xulG.url_prefix(urls.XUL_COPY_BUCKETS_QUICK),
228                 'sel_bucket_win' + win.window_name_increment(),
229                 'chrome,resizable,center'
230         );
231 }
232
233 cat.util.spawn_copy_editor = function(params) {
234         try {
235         if (!params.copy_ids && !params.copies) return;
236                 if (params.copy_ids && params.copy_ids.length == 0) return;
237                 if (params.copies && params.copies.length == 0) return;
238         if (params.copy_ids) params.copy_ids = js2JSON(params.copy_ids); // legacy
239         if (!params.caller_handles_update) params.handle_update = 1; // legacy
240
241                 var obj = {};
242                 JSAN.use('util.network'); obj.network = new util.network();
243                 JSAN.use('util.error'); obj.error = new util.error();
244         
245                 var title = '';
246                 if (params.copy_ids && params.copy_ids.length > 1 && params.edit == 1)
247                         title = $("catStrings").getString('staff.cat.util.copy_editor.batch_edit');
248                 else if(params.copies && params.copies.length > 1 && params.edit == 1)
249                         title = $("catStrings").getString('staff.cat.util.copy_editor.batch_view');
250                 else if(params.copy_ids && params.copy_ids.length == 1)
251                         title = $("catStrings").getString('staff.cat.util.copy_editor.edit');
252                 else
253                         title = $("catStrings").getString('staff.cat.util.copy_editor.view');
254
255                 JSAN.use('util.window'); var win = new util.window();
256                 var my_xulG = win.open(
257                         (urls.XUL_COPY_EDITOR),
258                         title,
259                         'chrome,modal,resizable',
260             params
261                 );
262                 if (!my_xulG.copies && params.edit) {
263             alert(typeof params.no_copies_modified_msg != 'undefined' ? params.no_copies_modified_msg : $("catStrings").getString('staff.cat.util.copy_editor.not_modified'));
264         } else {
265             return my_xulG.copies;
266         }
267         return [];
268         } catch(E) {
269                 JSAN.use('util.error'); var error = new util.error();
270                 error.standard_unexpected_error_alert('error in cat.util.spawn_copy_editor',E);
271         }
272 }
273
274 cat.util.mark_item_damaged = function(copy_ids) {
275         var error;
276         try {
277                 JSAN.use('util.error'); error = new util.error();
278                 JSAN.use('util.functional');
279                 JSAN.use('util.network'); var network = new util.network();
280                 var copies = network.simple_request('FM_ACP_FLESHED_BATCH_RETRIEVE.authoritative', [ copy_ids ]);
281                 if (typeof copies.ilsevent != 'undefined') throw(copies);
282                 var magic_status = false;
283                 for (var i = 0; i < copies.length; i++) {
284                         var status = copies[i].status(); if (typeof status == 'object') status = status.id();
285                         if (typeof my_constants.magical_statuses[ status ] != 'undefined') 
286                                 if (my_constants.magical_statuses[ status ].block_mark_item_action) magic_status = true;
287                 }
288                 if (magic_status) {
289                 
290                         error.yns_alert($("catStrings").getString('staff.cat.util.mark_item_damaged.af_message'),
291                                 $("catStrings").getString('staff.cat.util.mark_item_damaged.af_title'),
292                                 $("catStrings").getString('staff.cat.util.mark_item_damaged.af_ok_label'), null, null,
293                                 $("catStrings").getString('staff.cat.util.mark_item_damaged.af_confirm_action'));
294
295                 } else {
296
297                         var r = error.yns_alert($("catStrings").getFormattedString('staff.cat.util.mark_item_damaged.md_message', [util.functional.map_list( copies, function(o) { return o.barcode(); } ).join(", ")]),
298                                 $("catStrings").getString('staff.cat.util.mark_item_damaged.md_title'),
299                                 $("catStrings").getString('staff.cat.util.mark_item_damaged.md_ok_label'),
300                                 $("catStrings").getString('staff.cat.util.mark_item_damaged.md_cancel_label'), null,
301                                 $("catStrings").getString('staff.cat.util.mark_item_damaged.md_confirm_action'));
302
303                         if (r == 0) {
304                                 var count = 0;
305                                 for (var i = 0; i < copies.length; i++) {
306                                         try {
307                                                 var robj = network.simple_request('MARK_ITEM_DAMAGED',[ses(),copies[i].id()]);
308                                                 if (typeof robj.ilsevent != 'undefined') {
309                             switch(robj.textcode) {
310                                 case 'DAMAGE_CHARGE' :
311                                     JSAN.use('patron.util'); JSAN.use('util.money');
312                                     var patron_obj = patron.util.retrieve_fleshed_au_via_id( ses(), robj.payload.usr );
313                                     var patron_name = ( patron_obj.prefix() ? patron_obj.prefix() + ' ' : '') +
314                                         patron_obj.family_name() + ', ' +
315                                         patron_obj.first_given_name() + ' ' +
316                                         ( patron_obj.second_given_name() ? patron_obj.second_given_name() + ' ' : '' ) +
317                                         ( patron_obj.suffix() ? patron_obj.suffix() : '')
318                                         + ' : ' + patron_obj.card().barcode()
319
320                                     var r1 = error.yns_alert(
321                                         $("catStrings").getFormattedString('staff.cat.util.mark_item_damaged.charge_patron_prompt.message', [ copies[i].barcode(), patron_name, util.money.sanitize(robj.payload.charge) ]),
322                                         $("catStrings").getString('staff.cat.util.mark_item_damaged.charge_patron_prompt.title'),
323                                         $("catStrings").getString('staff.cat.util.mark_item_damaged.charge_patron_prompt.ok_label'),
324                                         $("catStrings").getString('staff.cat.util.mark_item_damaged.charge_patron_prompt.cancel_label'), null,
325                                         $("catStrings").getString('staff.cat.util.mark_item_damaged.charge_patron_prompt.confirm_action'));
326
327                                     robj = network.simple_request('MARK_ITEM_DAMAGED',[ ses(), copies[i].id(), {'apply_fines' : r1 == 0 ? 'apply' : 'noapply'} ]);
328                                                             if (typeof robj.ilsevent != 'undefined') { throw(robj); }
329                                     break;
330                                 default: throw(robj);
331                             }
332                         }
333                                                 count++;
334                                         } catch(E) {
335                                                 error.standard_unexpected_error_alert($("catStrings").getFormattedString('staff.cat.util.mark_item_damaged.marking_error', [copies[i].barcode()]),E);
336                                         }
337                                 }
338                                 alert(count == 1 ? $("catStrings").getString('staff.cat.util.mark_item_damaged.one_item_damaged') :
339                                         $("catStrings").getFormattedString('staff.cat.util.mark_item_damaged.multiple_item_damaged', [count]));
340                         }
341                 }
342
343         } catch(E) {
344                 if (error) error.standard_unexpected_error_alert('cat.util.mark_item_damaged',E); else alert('FIXME: ' + E);
345         }
346 }
347
348 cat.util.mark_item_missing = function(copy_ids) {
349         var error;
350         try {
351                 JSAN.use('util.error'); error = new util.error();
352                 JSAN.use('util.functional');
353                 JSAN.use('util.network'); var network = new util.network();
354                 var copies = network.simple_request('FM_ACP_FLESHED_BATCH_RETRIEVE.authoritative', [ copy_ids ]);
355                 if (typeof copies.ilsevent != 'undefined') throw(copies);
356                 var magic_status = false;
357                 for (var i = 0; i < copies.length; i++) {
358                         var status = copies[i].status(); if (typeof status == 'object') status = status.id();
359                         if (typeof my_constants.magical_statuses[ status ] != 'undefined') 
360                                 if (my_constants.magical_statuses[ status ].block_mark_item_action) magic_status = true;
361                 }
362                 if (magic_status) {
363                 
364                         error.yns_alert($("catStrings").getString('staff.cat.util.mark_item_missing.af_message'),
365                                 $("catStrings").getString('staff.cat.util.mark_item_missing.af_title'),
366                                 $("catStrings").getString('staff.cat.util.mark_item_missing.af_ok_label'), null, null,
367                                 $("catStrings").getString('staff.cat.util.mark_item_missing.af_confirm_action'));
368
369                 } else {
370
371                         var r = error.yns_alert($("catStrings").getFormattedString('staff.cat.util.mark_item_missing.ms_message', [util.functional.map_list( copies, function(o) { return o.barcode(); } ).join(", ")]),
372                                 $("catStrings").getString('staff.cat.util.mark_item_missing.ms_title'),
373                                 $("catStrings").getString('staff.cat.util.mark_item_missing.ms_ok_label'),
374                                 $("catStrings").getString('staff.cat.util.mark_item_missing.ms_cancel_label'), null,
375                                 $("catStrings").getString('staff.cat.util.mark_item_missing.ms_confirm_action'));
376
377                         if (r == 0) {
378                                 var count = 0;
379                                 for (var i = 0; i < copies.length; i++) {
380                                         try {
381                                                 var robj = network.simple_request('MARK_ITEM_MISSING',[ses(),copies[i].id()]);
382                                                 if (typeof robj.ilsevent != 'undefined') throw(robj);
383                                                 count++;
384                                         } catch(E) {
385                                                 error.standard_unexpected_error_alert($("catStrings").getFormattedString('staff.cat.util.mark_item_missing.marking_error', [copies[i].barcode()]),E);
386                                         }
387                                 }
388                                 alert(count == 1 ? $("catStrings").getString('staff.cat.util.mark_item_missing.one_item_missing') :
389                                         $("catStrings").getFormattedString('staff.cat.util.mark_item_missing.multiple_item_missing', [count]));
390                         }
391                 }
392
393         } catch(E) {
394                 if (error) error.standard_unexpected_error_alert('cat.util.mark_item_missing',E); else alert('FIXME: ' + E);
395         }
396 }
397
398
399 dump('exiting cat/util.js\n');