]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/xul/staff_client/server/circ/util.js
better exception handling
[Evergreen.git] / Open-ILS / xul / staff_client / server / circ / util.js
1 dump('entering circ/util.js\n');
2
3 if (typeof circ == 'undefined') var circ = {};
4 circ.util = {};
5
6 circ.util.EXPORT_OK     = [ 
7         'offline_checkout_columns', 'offline_checkin_columns', 'offline_renew_columns', 'offline_inhouse_use_columns', 
8         'columns', 'hold_columns', 'checkin_via_barcode', 'std_map_row_to_column', 'hold_capture_via_copy_barcode',
9         'show_last_few_circs', 'abort_transits'
10 ];
11 circ.util.EXPORT_TAGS   = { ':all' : circ.util.EXPORT_OK };
12
13 circ.util.abort_transits = function(selection_list) {
14         var obj = {};
15         JSAN.use('util.error'); obj.error = new util.error();
16         JSAN.use('util.network'); obj.network = new util.network();
17         JSAN.use('OpenILS.data'); obj.data = new OpenILS.data(); obj.data.init({'via':'stash'});
18         JSAN.use('util.functional');
19         var msg = 'Are you sure you would like to abort transits for copies:' + util.functional.map_list( selection_list, function(o){return o.copy_id;}).join(', ') + '?';
20         var r = obj.error.yns_alert(msg,'Aborting Transits','Yes','No',null,'Check here to confirm this action');
21         if (r == 0) {
22                 try {
23                         for (var i = 0; i < selection_list.length; i++) {
24                                 var copy_id = selection_list[i].copy_id;
25                                 var robj = obj.network.simple_request('FM_ATC_VOID',[ ses(), { 'copyid' : copy_id } ]);
26                                 if (typeof robj.ilsevent != 'undefined') throw(robj);
27                         }
28                 } catch(E) {
29                         obj.error.standard_unexpected_error_alert('Transit not likely aborted.',E);
30                 }
31         }
32 }
33
34 circ.util.show_last_few_circs = function(selection_list,count) {
35         var obj = {};
36         JSAN.use('util.error'); obj.error = new util.error();
37         JSAN.use('util.window'); obj.win = new util.window();
38         JSAN.use('util.network'); obj.network = new util.network();
39         JSAN.use('OpenILS.data'); obj.data = new OpenILS.data(); obj.data.init({'via':'stash'});
40
41         if (!count) count = 4;
42
43         for (var i = 0; i < selection_list.length; i++) {
44                 try {
45                         obj.data.fancy_prompt_data = null; obj.data.stash('fancy_prompt_data');
46                         var url = xulG.url_prefix( urls.XUL_CIRC_SUMMARY ) + '?copy_id=' + selection_list[i].copy_id + '&count=' + count;
47                         obj.win.open( url, 'show_last_few_circs', 'chrome,resizable,modal' );
48                         obj.data.stash_retrieve();
49
50                         if (! obj.data.fancy_prompt_data) continue;
51                         var patrons = JSON2js( obj.data.fancy_prompt_data );
52                         for (var j = 0; j < patrons.length; j++) {
53                                 if (typeof window.xulG == 'object' && typeof window.xulG.new_tab == 'function') {
54                                         try {
55                                                 var url = urls.XUL_PATRON_DISPLAY + '?id=' + window.escape( patrons[j] );
56                                                 window.xulG.new_tab( url );
57                                         } catch(E) {
58                                                 obj.error.standard_unexpected_error_alert('Problem retrieving patron.',E);
59                                         }
60                                 }
61                         }
62
63                 } catch(E) {
64                         obj.error.standard_unexpected_error_alert('Problem retrieving circulations.',E);
65                 }
66         }
67 }
68
69 circ.util.offline_checkout_columns = function(modify,params) {
70         
71         var c = [
72                 { 
73                         'id' : 'timestamp', 
74                         'label' : 'Timestamp', 
75                         'flex' : 1, 'primary' : false, 'hidden' : true, 
76                         'render' : 'my.timestamp' 
77                 },
78                 { 
79                         'id' : 'checkout_time', 
80                         'label' : 'Check Out Time', 
81                         'flex' : 1, 'primary' : false, 'hidden' : true, 
82                         'render' : 'my.checkout_time' 
83                 },
84                 { 
85                         'id' : 'type', 
86                         'label' : 'Transaction Type', 
87                         'flex' : 1, 'primary' : false, 'hidden' : true, 
88                         'render' : 'my.type' 
89                 },
90                 {
91                         'id' : 'noncat',
92                         'label' : 'Non-Cataloged?',
93                         'flex' : 1, 'primary' : false, 'hidden' : true, 
94                         'render' : 'my.noncat'
95                 },
96                 {
97                         'id' : 'noncat_type',
98                         'label' : 'Non-Cat Type ID',
99                         'flex' : 1, 'primary' : false, 'hidden' : true,
100                         'render' : 'my.noncat_type'
101                 },
102                 {
103                         'id' : 'noncat_count',
104                         'label' : 'Count',
105                         'flex' : 1, 'primary' : false, 'hidden' : false,
106                         'render' : 'my.noncat_count'
107                 },
108                 { 
109                         'id' : 'patron_barcode', 
110                         'label' : 'Patron Barcode', 
111                         'flex' : 1, 'primary' : false, 'hidden' : true, 
112                         'render' : 'my.patron_barcode' 
113                 },
114                 { 
115                         'id' : 'barcode', 
116                         'label' : 'Item Barcode', 
117                         'flex' : 2, 'primary' : true, 'hidden' : false, 
118                         'render' : 'my.barcode' 
119                 },
120                 { 
121                         'id' : 'due_date', 
122                         'label' : 'Due Date', 
123                         'flex' : 1, 'primary' : false, 'hidden' : false, 
124                         'render' : 'my.due_date' 
125                 },
126         ];
127         if (modify) for (var i = 0; i < c.length; i++) {
128                 if (modify[ c[i].id ]) {
129                         for (var j in modify[ c[i].id ]) {
130                                 c[i][j] = modify[ c[i].id ][j];
131                         }
132                 }
133         }
134         if (params) {
135                 if (params.just_these) {
136                         JSAN.use('util.functional');
137                         var new_c = [];
138                         for (var i = 0; i < params.just_these.length; i++) {
139                                 var x = util.functional.find_list(c,function(d){return(d.id==params.just_these[i]);});
140                                 new_c.push( function(y){ return y; }( x ) );
141                         }
142                         return new_c;
143                 }
144         }
145         return c;
146 }
147
148 circ.util.offline_checkin_columns = function(modify,params) {
149         
150         var c = [
151                 { 
152                         'id' : 'timestamp', 
153                         'label' : 'Timestamp', 
154                         'flex' : 1, 'primary' : false, 'hidden' : true, 
155                         'render' : 'my.timestamp' 
156                 },
157                 { 
158                         'id' : 'backdate', 
159                         'label' : 'Back Date', 
160                         'flex' : 1, 'primary' : false, 'hidden' : true, 
161                         'render' : 'my.backdate' 
162                 },
163                 { 
164                         'id' : 'type', 
165                         'label' : 'Transaction Type', 
166                         'flex' : 1, 'primary' : false, 'hidden' : true, 
167                         'render' : 'my.type' 
168                 },
169                 { 
170                         'id' : 'barcode', 
171                         'label' : 'Item Barcode', 
172                         'flex' : 2, 'primary' : true, 'hidden' : false, 
173                         'render' : 'my.barcode' 
174                 },
175         ];
176         if (modify) for (var i = 0; i < c.length; i++) {
177                 if (modify[ c[i].id ]) {
178                         for (var j in modify[ c[i].id ]) {
179                                 c[i][j] = modify[ c[i].id ][j];
180                         }
181                 }
182         }
183         if (params) {
184                 if (params.just_these) {
185                         JSAN.use('util.functional');
186                         var new_c = [];
187                         for (var i = 0; i < params.just_these.length; i++) {
188                                 var x = util.functional.find_list(c,function(d){return(d.id==params.just_these[i]);});
189                                 new_c.push( function(y){ return y; }( x ) );
190                         }
191                         return new_c;
192                 }
193         }
194         return c;
195 }
196
197 circ.util.offline_renew_columns = function(modify,params) {
198         
199         var c = [
200                 { 
201                         'id' : 'timestamp', 
202                         'label' : 'Timestamp', 
203                         'flex' : 1, 'primary' : false, 'hidden' : true, 
204                         'render' : 'my.timestamp' 
205                 },
206                 { 
207                         'id' : 'checkout_time', 
208                         'label' : 'Check Out Time', 
209                         'flex' : 1, 'primary' : false, 'hidden' : true, 
210                         'render' : 'my.checkout_time' 
211                 },
212                 { 
213                         'id' : 'type', 
214                         'label' : 'Transaction Type', 
215                         'flex' : 1, 'primary' : false, 'hidden' : true, 
216                         'render' : 'my.type' 
217                 },
218                 { 
219                         'id' : 'patron_barcode', 
220                         'label' : 'Patron Barcode', 
221                         'flex' : 1, 'primary' : false, 'hidden' : true, 
222                         'render' : 'my.patron_barcode' 
223                 },
224                 { 
225                         'id' : 'barcode', 
226                         'label' : 'Item Barcode', 
227                         'flex' : 2, 'primary' : true, 'hidden' : false, 
228                         'render' : 'my.barcode' 
229                 },
230                 { 
231                         'id' : 'due_date', 
232                         'label' : 'Due Date', 
233                         'flex' : 1, 'primary' : false, 'hidden' : false, 
234                         'render' : 'my.due_date' 
235                 },
236         ];
237         if (modify) for (var i = 0; i < c.length; i++) {
238                 if (modify[ c[i].id ]) {
239                         for (var j in modify[ c[i].id ]) {
240                                 c[i][j] = modify[ c[i].id ][j];
241                         }
242                 }
243         }
244         if (params) {
245                 if (params.just_these) {
246                         JSAN.use('util.functional');
247                         var new_c = [];
248                         for (var i = 0; i < params.just_these.length; i++) {
249                                 var x = util.functional.find_list(c,function(d){return(d.id==params.just_these[i]);});
250                                 new_c.push( function(y){ return y; }( x ) );
251                         }
252                         return new_c;
253                 }
254         }
255         return c;
256 }
257
258 circ.util.offline_inhouse_use_columns = function(modify,params) {
259         
260         var c = [
261                 { 
262                         'id' : 'timestamp', 
263                         'label' : 'Timestamp', 
264                         'flex' : 1, 'primary' : false, 'hidden' : true, 
265                         'render' : 'my.timestamp' 
266                 },
267                 { 
268                         'id' : 'use_time', 
269                         'label' : 'Use Time', 
270                         'flex' : 1, 'primary' : false, 'hidden' : true, 
271                         'render' : 'my.use_time' 
272                 },
273                 { 
274                         'id' : 'type', 
275                         'label' : 'Transaction Type', 
276                         'flex' : 1, 'primary' : false, 'hidden' : true, 
277                         'render' : 'my.type' 
278                 },
279                 {
280                         'id' : 'count',
281                         'label' : 'Count',
282                         'flex' : 1, 'primary' : false, 'hidden' : false,
283                         'render' : 'my.count'
284                 },
285                 { 
286                         'id' : 'barcode', 
287                         'label' : 'Item Barcode', 
288                         'flex' : 2, 'primary' : true, 'hidden' : false, 
289                         'render' : 'my.barcode' 
290                 },
291         ];
292         if (modify) for (var i = 0; i < c.length; i++) {
293                 if (modify[ c[i].id ]) {
294                         for (var j in modify[ c[i].id ]) {
295                                 c[i][j] = modify[ c[i].id ][j];
296                         }
297                 }
298         }
299         if (params) {
300                 if (params.just_these) {
301                         JSAN.use('util.functional');
302                         var new_c = [];
303                         for (var i = 0; i < params.just_these.length; i++) {
304                                 var x = util.functional.find_list(c,function(d){return(d.id==params.just_these[i]);});
305                                 new_c.push( function(y){ return y; }( x ) );
306                         }
307                         return new_c;
308                 }
309         }
310         return c;
311 }
312
313
314
315 circ.util.columns = function(modify,params) {
316         
317         JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
318
319         function getString(s) { return data.entities[s]; }
320
321         var c = [
322                 {
323                         'id' : 'acp_id', 'label' : getString('staff.acp_label_id'), 'flex' : 1,
324                         'primary' : false, 'hidden' : true, 'render' : 'my.acp.id()', 'persist' : 'hidden width',
325                 },
326                 {
327                         'id' : 'circ_id', 'label' : getString('staff.circ_label_id'), 'flex' : 1,
328                         'primary' : false, 'hidden' : true, 'render' : 'my.circ.id()', 'persist' : 'hidden width',
329                 },
330                 {
331                         'id' : 'mvr_doc_id', 'label' : getString('staff.mvr_label_doc_id'), 'flex' : 1,
332                         'primary' : false, 'hidden' : true, 'render' : 'my.mvr.doc_id()', 'persist' : 'hidden width',
333                 },
334                 {
335                         'id' : 'barcode', 'label' : getString('staff.acp_label_barcode'), 'flex' : 1,
336                         'primary' : false, 'hidden' : true, 'render' : 'my.acp.barcode()', 'persist' : 'hidden width',
337                 },
338                 {
339                         'id' : 'call_number', 'label' : getString('staff.acp_label_call_number'), 'flex' : 1,
340                         'primary' : false, 'hidden' : true, 'render' : ' if (my.acp && my.acp.call_number() == -1) { "Not Cataloged"; } else { if (!my.acn) { var x = obj.network.simple_request("FM_ACN_RETRIEVE",[ my.acp.call_number() ]); if (x.ilsevent) { "Not Cataloged"; } else { my.acn = x; x.label(); } } else { my.acn.label(); } } ' , 'persist' : 'hidden width',
341                 },
342                 {
343                         'id' : 'owning_lib', 'label' : 'Owning Lib', 'flex' : 1,
344                         'primary' : false, 'hidden' : true,
345                         'render' : 'if (Number(my.acn.owning_lib())>=0) obj.data.hash.aou[ my.acn.owning_lib() ].shortname(); else my.acn.owning_lib().shortname();', 'persist' : 'hidden width',
346                 },
347                 {
348                         'id' : 'copy_number', 'label' : getString('staff.acp_label_copy_number'), 'flex' : 1,
349                         'primary' : false, 'hidden' : true, 'render' : 'my.acp.copy_number()', 'persist' : 'hidden width',
350                 },
351                 {
352                         'id' : 'location', 'label' : getString('staff.acp_label_location'), 'flex' : 1,
353                         'primary' : false, 'hidden' : true, 'render' : 'if (Number(my.acp.location())>=0) obj.data.lookup("acpl", my.acp.location() ).name(); else my.acp.location().name();', 'persist' : 'hidden width',
354                 },
355                 {
356                         'id' : 'loan_duration', 'label' : getString('staff.acp_label_loan_duration'), 'flex' : 1,
357                         'primary' : false, 'hidden' : true, 
358                         'render' : 'switch(my.acp.loan_duration()){ case 1: "Short"; break; case 2: "Normal"; break; case 3: "Long"; break; }', 'persist' : 'hidden width',
359                 },
360                 {
361                         'id' : 'circ_lib', 'label' : getString('staff.acp_label_circ_lib'), 'flex' : 1,
362                         'primary' : false, 'hidden' : true, 'render' : 'if (Number(my.acp.circ_lib())>=0) obj.data.hash.aou[ my.acp.circ_lib() ].shortname(); else my.acp.circ_lib().shortname();', 'persist' : 'hidden width',
363                 },
364                 {
365                         'id' : 'fine_level', 'label' : getString('staff.acp_label_fine_level'), 'flex' : 1,
366                         'primary' : false, 'hidden' : true,
367                         'render' : 'switch(my.acp.fine_level()){ case 1: "Low"; break; case 2: "Normal"; break; case 3: "High"; break; }', 'persist' : 'hidden width',
368                 },
369                 {
370                         'id' : 'circulate', 'label' : 'Circulate?', 'flex' : 1,
371                         'primary' : false, 'hidden' : true, 'render' : 'get_bool( my.acp.circulate() ) ? "Yes" : "No"', 'persist' : 'hidden width',
372                 },
373                 {
374                         'id' : 'holdable', 'label' : 'Holdable?', 'flex' : 1,
375                         'primary' : false, 'hidden' : true, 'render' : 'get_bool( my.acp.holdable() ) ? "Yes" : "No"', 'persist' : 'hidden width',
376                 },
377                 {
378                         'id' : 'opac_visible', 'label' : 'OPAC Visible?', 'flex' : 1,
379                         'primary' : false, 'hidden' : true, 'render' : 'get_bool( my.acp.opac_visible() ) ? "Yes" : "No"', 'persist' : 'hidden width',
380                 },
381                 {
382                         'persist' : 'hidden width', 'id' : 'ref', 'label' : 'Reference?', 'flex' : 1,
383                         'primary' : false, 'hidden' : true, 'render' : 'get_bool( my.acp.ref() ) ? "Yes" : "No"'
384                 },
385                 {
386                         'persist' : 'hidden width', 'id' : 'deposit', 'label' : 'Deposit?', 'flex' : 1,
387                         'primary' : false, 'hidden' : true, 'render' : 'get_bool( my.acp.deposit() ) ? "Yes" : "No"'
388                 },
389                 {
390                         'persist' : 'hidden width', 'id' : 'deposit_amount', 'label' : getString('staff.acp_label_deposit_amount'), 'flex' : 1,
391                         'primary' : false, 'hidden' : true, 'render' : 'my.acp.deposit_amount()'
392                 },
393                 {
394                         'persist' : 'hidden width', 'id' : 'price', 'label' : getString('staff.acp_label_price'), 'flex' : 1,
395                         'primary' : false, 'hidden' : true, 'render' : 'my.acp.price()'
396                 },
397                 {
398                         'persist' : 'hidden width', 'id' : 'circ_as_type', 'label' : getString('staff.acp_label_circ_as_type'), 'flex' : 1,
399                         'primary' : false, 'hidden' : true, 'render' : 'my.acp.circ_as_type()'
400                 },
401                 {
402                         'persist' : 'hidden width', 'id' : 'circ_modifier', 'label' : getString('staff.acp_label_circ_modifier'), 'flex' : 1,
403                         'primary' : false, 'hidden' : true, 'render' : 'my.acp.circ_modifier()'
404                 },
405                 {
406                         'persist' : 'hidden width', 'id' : 'xact_start', 'label' : getString('staff.circ_label_xact_start'), 'flex' : 1,
407                         'primary' : false, 'hidden' : true, 'render' : 'my.circ.xact_start()'
408                 },
409                 {
410                         'persist' : 'hidden width', 'id' : 'checkin_time', 'label' : 'Checkin Time', 'flex' : 1,
411                         'primary' : false, 'hidden' : true, 'render' : 'my.circ.checkin_time().substr(0,16)'
412                 },
413                 {
414                         'persist' : 'hidden width', 'id' : 'xact_finish', 'label' : 'Transaction Finished', 'flex' : 1,
415                         'primary' : false, 'hidden' : true, 'render' : 'my.circ.xact_finish()'
416                 },
417                 {
418                         'persist' : 'hidden width', 'id' : 'due_date', 'label' : getString('staff.circ_label_due_date'), 'flex' : 1,
419                         'primary' : false, 'hidden' : true, 'render' : 'my.circ.due_date().substr(0,10)'
420                 },
421                 {
422                         'persist' : 'hidden width', 'id' : 'title', 'label' : getString('staff.mvr_label_title'), 'flex' : 2,
423                         'primary' : false, 'hidden' : true, 'render' : 'try { my.mvr.title(); } catch(E) { my.acp.dummy_title(); }'
424                 },
425                 {
426                         'persist' : 'hidden width', 'id' : 'author', 'label' : getString('staff.mvr_label_author'), 'flex' : 1,
427                         'primary' : false, 'hidden' : true, 'render' : 'try { my.mvr.author(); } catch(E) { my.acp.dummy_author(); }'
428                 },
429                 {
430                         'persist' : 'hidden width', 'id' : 'edition', 'label' : 'Edition', 'flex' : 1,
431                         'primary' : false, 'hidden' : true, 'render' : 'my.mvr.edition();'
432                 },
433                 {
434                         'persist' : 'hidden width', 'id' : 'isbn', 'label' : 'ISBN', 'flex' : 1,
435                         'primary' : false, 'hidden' : true, 'render' : 'my.mvr.isbn();'
436                 },
437                 {
438                         'persist' : 'hidden width', 'id' : 'pubdate', 'label' : 'PubDate', 'flex' : 1,
439                         'primary' : false, 'hidden' : true, 'render' : 'my.mvr.pubdate();'
440                 },
441                 {
442                         'persist' : 'hidden width', 'id' : 'publisher', 'label' : 'Publisher', 'flex' : 1,
443                         'primary' : false, 'hidden' : true, 'render' : 'my.mvr.publisher();'
444                 },
445                 {
446                         'persist' : 'hidden width', 'id' : 'tcn', 'label' : 'TCN', 'flex' : 1,
447                         'primary' : false, 'hidden' : true, 'render' : 'my.mvr.tcn();'
448                 },
449                 {
450                         'persist' : 'hidden width', 'id' : 'renewal_remaining', 'label' : getString('staff.circ_label_renewal_remaining'), 'flex' : 0,
451                         'primary' : false, 'hidden' : true, 'render' : 'my.circ.renewal_remaining()'
452                 },
453                 {
454                         'persist' : 'hidden width', 'id' : 'stop_fines', 'label' : 'Fines Stopped', 'flex' : 0,
455                         'primary' : false, 'hidden' : true, 'render' : 'my.circ.stop_fines()'
456                 },
457                 {
458                         'persist' : 'hidden width', 'id' : 'status', 'label' : getString('staff.acp_label_status'), 'flex' : 1,
459                         'primary' : false, 'hidden' : true, 'render' : 'if (Number(my.acp.status())>=0) obj.data.hash.ccs[ my.acp.status() ].name(); else my.acp.status().name();'
460                 },
461                 {
462                         'persist' : 'hidden width', 'id' : 'route_to', 'label' : 'Route To', 'flex' : 1,
463                         'primary' : false, 'hidden' : true, 'render' : 'my.route_to.toString()'
464                 },
465                 {
466                         'persist' : 'hidden width', 'id' : 'message', 'label' : 'Message', 'flex' : 1,
467                         'primary' : false, 'hidden' : true, 'render' : 'my.message.toString()'
468                 },
469                 {
470                         'persist' : 'hidden width', 'id' : 'uses', 'label' : '# of Uses', 'flex' : 1,
471                         'primary' : false, 'hidden' : true, 'render' : 'my.uses'
472                 },
473                 {
474                         'persist' : 'hidden width', 'id' : 'alert_message', 'label' : 'Alert Message', 'flex' : 1,
475                         'primary' : false, 'hidden' : true, 'render' : 'my.acp.alert_message()'
476                 },
477         ];
478         for (var i = 0; i < c.length; i++) {
479                 if (modify[ c[i].id ]) {
480                         for (var j in modify[ c[i].id ]) {
481                                 c[i][j] = modify[ c[i].id ][j];
482                         }
483                 }
484         }
485         if (params) {
486                 if (params.just_these) {
487                         JSAN.use('util.functional');
488                         var new_c = [];
489                         for (var i = 0; i < params.just_these.length; i++) {
490                                 var x = util.functional.find_list(c,function(d){return(d.id==params.just_these[i]);});
491                                 new_c.push( function(y){ return y; }( x ) );
492                         }
493                         return new_c;
494                 }
495         }
496         return c;
497 }
498
499 circ.util.hold_columns = function(modify,params) {
500         
501         JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
502
503         function getString(s) { return data.entities[s]; }
504
505         var c = [
506                 {
507                         'persist' : 'hidden width', 'id' : 'request_time', 'label' : getString('staff.ahr_request_time_label'), 'flex' : 0,
508                         'primary' : false, 'hidden' : true,  
509                         'render' : 'my.ahr.request_time().toString().substr(0,10)'
510                 },
511                 {
512                         'persist' : 'hidden width', 'id' : 'available_time', 'label' : 'Available On', 'flex' : 1,
513                         'primary' : false, 'hidden' : false,  'render' : 'my.ahr.transit() ? ( my.ahr.transit().dest_recv_time() ? my.ahr.transit().dest_recv_time().toString().substr(0,10) : "") : ( my.ahr.capture_time() ? my.ahr.capture_time().toString().substr(0,10) : "" )',
514                 },
515                 {
516                         'persist' : 'hidden width', 'id' : 'capture_time', 'label' : getString('staff.ahr_capture_time_label'), 'flex' : 1,
517                         'primary' : false, 'hidden' : true,  'render' : 'my.ahr.capture_time() ? my.ahr.capture_time().toString().substr(0,10) : "???"'
518                 },
519                 {
520                         'persist' : 'hidden width', 'id' : 'status', 'label' : getString('staff.ahr_status_label'), 'flex' : 1,
521                         'primary' : false, 'hidden' : false,  'render' : 'switch(my.status) { case 1: case "1": "Waiting for copy"; break; case 2: case "2": "Waiting for capture"; break; case 3: case "3": "In-Transit"; break; case 4: case "4" : "Ready for pickup"; break; default: my.status; break;}'
522                 },
523                 {
524                         'persist' : 'hidden width', 'id' : 'hold_type', 'label' : getString('staff.ahr_hold_type_label'), 'flex' : 0,
525                         'primary' : false, 'hidden' : true,  'render' : 'my.ahr.hold_type()'
526                 },
527                 {
528                         'persist' : 'hidden width', 'id' : 'pickup_lib', 'label' : getString('staff.ahr_pickup_lib_label'), 'flex' : 1,
529                         'primary' : false, 'hidden' : true,  
530                         'render' : 'if (Number(my.ahr.pickup_lib())>=0) obj.data.hash.aou[ my.ahr.pickup_lib() ].name(); else my.ahr.pickup_lib().name();'
531                 },
532                 {
533                         'persist' : 'hidden width', 'id' : 'pickup_lib_shortname', 'label' : getString('staff.ahr_pickup_lib_label'), 'flex' : 0,
534                         'primary' : false, 'hidden' : true,  
535                         'render' : 'if (Number(my.ahr.pickup_lib())>=0) obj.data.hash.aou[ my.ahr.pickup_lib() ].shortname(); else my.ahr.pickup_lib().shortname();'
536                 },
537                 {
538                         'persist' : 'hidden width', 'id' : 'current_copy', 'label' : getString('staff.ahr_current_copy_label'), 'flex' : 1,
539                         'primary' : false, 'hidden' : true,  'render' : 'my.acp ? my.acp.barcode() : "No Copy"'
540                 },
541                 {
542                         'persist' : 'hidden width', 'id' : 'email_notify', 'label' : getString('staff.ahr_email_notify_label'), 'flex' : 1,
543                         'primary' : false, 'hidden' : true,  'render' : 'my.ahr.email_notify() == 1 ? "Yes" : "No"'
544                 },
545                 {
546                         'persist' : 'hidden width', 'id' : 'expire_time', 'label' : getString('staff.ahr_expire_time_label'), 'flex' : 1,
547                         'primary' : false, 'hidden' : true,  'render' : 'my.ahr.expire_time()'
548                 },
549                 {
550                         'persist' : 'hidden width', 'id' : 'fulfillment_time', 'label' : getString('staff.ahr_fulfillment_time_label'), 'flex' : 1,
551                         'primary' : false, 'hidden' : true,  'render' : 'my.ahr.fulfillment_time()'
552                 },
553                 {
554                         'persist' : 'hidden width', 'id' : 'holdable_formats', 'label' : getString('staff.ahr_holdable_formats_label'), 'flex' : 1,
555                         'primary' : false, 'hidden' : true,  'render' : 'my.ahr.holdable_formats()'
556                 },
557                 {
558                         'persist' : 'hidden width', 'id' : 'id', 'label' : getString('staff.ahr_id_label'), 'flex' : 1,
559                         'primary' : false, 'hidden' : true,  'render' : 'my.ahr.id()'
560                 },
561                 {
562                         'persist' : 'hidden width', 'id' : 'phone_notify', 'label' : getString('staff.ahr_phone_notify_label'), 'flex' : 1,
563                         'primary' : false, 'hidden' : true,  'render' : 'my.ahr.phone_notify()'
564                 },
565                 {
566                         'persist' : 'hidden width', 'id' : 'prev_check_time', 'label' : getString('staff.ahr_prev_check_time_label'), 'flex' : 1,
567                         'primary' : false, 'hidden' : true,  'render' : 'my.ahr.prev_check_time()'
568                 },
569                 {
570                         'persist' : 'hidden width', 'id' : 'requestor', 'label' : getString('staff.ahr_requestor_label'), 'flex' : 1,
571                         'primary' : false, 'hidden' : true,  'render' : 'my.ahr.requestor()'
572                 },
573                 {
574                         'persist' : 'hidden width', 'id' : 'selection_depth', 'label' : getString('staff.ahr_selection_depth_label'), 'flex' : 1,
575                         'primary' : false, 'hidden' : true,  'render' : 'my.ahr.selection_depth()'
576                 },
577                 {
578                         'persist' : 'hidden width', 'id' : 'target', 'label' : getString('staff.ahr_target_label'), 'flex' : 1,
579                         'primary' : false, 'hidden' : true,  'render' : 'my.ahr.target()'
580                 },
581                 {
582                         'persist' : 'hidden width', 'id' : 'usr', 'label' : getString('staff.ahr_usr_label'), 'flex' : 1,
583                         'primary' : false, 'hidden' : true,  'render' : 'my.ahr.usr()'
584                 },
585                 {
586                         'persist' : 'hidden width', 'id' : 'title', 'label' : getString('staff.mvr_label_title'), 'flex' : 1,
587                         'primary' : false, 'hidden' : true, 'render' : 'my.mvr ? my.mvr.title() : "No Title?"'
588                 },
589                 {
590                         'persist' : 'hidden width', 'id' : 'author', 'label' : getString('staff.mvr_label_author'), 'flex' : 1,
591                         'primary' : false, 'hidden' : true, 'render' : 'my.mvr ? my.mvr.author() : "No Author?"'
592                 },
593                 {
594                         'persist' : 'hidden width', 'id' : 'edition', 'label' : 'Edition', 'flex' : 1,
595                         'primary' : false, 'hidden' : true, 'render' : 'my.mvr.edition();'
596                 },
597                 {
598                         'persist' : 'hidden width', 'id' : 'isbn', 'label' : 'ISBN', 'flex' : 1,
599                         'primary' : false, 'hidden' : true, 'render' : 'my.mvr.isbn();'
600                 },
601                 {
602                         'persist' : 'hidden width', 'id' : 'pubdate', 'label' : 'PubDate', 'flex' : 1,
603                         'primary' : false, 'hidden' : true, 'render' : 'my.mvr.pubdate();'
604                 },
605                 {
606                         'persist' : 'hidden width', 'id' : 'publisher', 'label' : 'Publisher', 'flex' : 1,
607                         'primary' : false, 'hidden' : true, 'render' : 'my.mvr.publisher();'
608                 },
609                 {
610                         'persist' : 'hidden width', 'id' : 'tcn', 'label' : 'TCN', 'flex' : 1,
611                         'primary' : false, 'hidden' : true, 'render' : 'my.mvr.tcn();'
612                 },
613                 {
614                         'persist' : 'hidden width', 'id' : 'transit_source', 'label' : 'Transit Source', 'flex' : 1,
615                         'primary' : false, 'hidden' : true, 'render' : 'my.ahr.transit() ?  obj.data.hash.aou[ my.ahr.transit().source() ].shortname() : ""'
616                 },
617                 {
618                         'persist' : 'hidden width', 'id' : 'transit_source_send_time', 'label' : 'Transitted On', 'flex' : 1,
619                         'primary' : false, 'hidden' : true, 'render' : 'my.ahr.transit() ?  my.ahr.transit().source_send_time() : ""'
620                 },
621                 {
622                         'persist' : 'hidden width', 'id' : 'transit_dest_lib', 'label' : 'Transit Destination', 'flex' : 1,
623                         'primary' : false, 'hidden' : true, 'render' : 'my.ahr.transit() ?  obj.data.hash.aou[ my.ahr.transit().dest() ].shortname() : ""'
624                 },
625                 {
626                         'persist' : 'hidden width', 'id' : 'transit_dest_recv_time', 'label' : 'Transit Completed On', 'flex' : 1,
627                         'primary' : false, 'hidden' : true, 'render' : 'my.ahr.transit() ?  my.ahr.transit().dest_recv_time() : ""'
628                 },
629         ];
630         for (var i = 0; i < c.length; i++) {
631                 if (modify[ c[i].id ]) {
632                         for (var j in modify[ c[i].id ]) {
633                                 c[i][j] = modify[ c[i].id ][j];
634                         }
635                 }
636         }
637         if (params) {
638                 if (params.just_these) {
639                         JSAN.use('util.functional');
640                         var new_c = [];
641                         for (var i = 0; i < params.just_these.length; i++) {
642                                 var x = util.functional.find_list(c,function(d){return(d.id==params.just_these[i]);});
643                                 new_c.push( function(y){ return y; }( x ) );
644                         }
645                         return new_c;
646                 }
647         }
648         return c;
649 }
650
651 circ.util.std_map_row_to_column = function(error_value) {
652         return function(row,col) {
653                 // row contains { 'my' : { 'acp' : {}, 'circ' : {}, 'mvr' : {} } }
654                 // col contains one of the objects listed above in columns
655                 
656                 // mimicking some of the obj in circ.checkin and circ.checkout where map_row_to_column is usually defined
657                 var obj = {}; 
658                 JSAN.use('util.error'); obj.error = new util.error();
659                 JSAN.use('OpenILS.data'); obj.data = new OpenILS.data(); obj.data.init({'via':'stash'});
660                 JSAN.use('util.network'); obj.network = new util.network();
661
662                 var my = row.my;
663                 var value;
664                 try { 
665                         value = eval( col.render );
666                 } catch(E) {
667                         obj.error.sdump('D_WARN','map_row_to_column: ' + E);
668                         if (error_value) value = error_value; else value = '???';
669                 }
670                 return value;
671         }
672 }
673
674 circ.util.checkin_via_barcode = function(session,barcode,backdate,auto_print) {
675         try {
676                 JSAN.use('util.error'); var error = new util.error();
677                 JSAN.use('util.network'); var network = new util.network();
678                 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
679                 JSAN.use('util.date');
680                 if (backdate && (backdate == util.date.formatted_date(new Date(),'%Y-%m-%d')) ) backdate = null;
681
682                 var params = { 'barcode' : barcode };
683                 if (backdate) params.backdate = backdate;
684
685                 var check = network.request(
686                         api.CHECKIN_VIA_BARCODE.app,
687                         api.CHECKIN_VIA_BARCODE.method,
688                         [ session, params ],
689                         null,
690                         {
691                                 'title' : 'Override Checkin Failure?',
692                                 'overridable_events' : [ 
693                                         1203 /* COPY_BAD_STATUS */, 
694                                         7009 /* CIRC_CLAIMS_RETURNED */,
695                                         7010 /* COPY_ALERT_MESSAGE */, 
696                                         7011 /* COPY_STATUS_LOST */, 
697                                         7012 /* COPY_STATUS_MISSING */, 
698                                 ],
699                                 'text' : {
700                                         '1203' : function(r) {
701                                                 //return data.hash.ccs[ r.payload.status() ].name();
702                                                 return r.payload.status().name();
703                                         },
704                                         '7010' : function(r) {
705                                                 return r.payload;
706                                         },
707                                 }
708                         }
709                 );
710
711                 check.message = check.textcode;
712
713                 if (check.payload && check.payload.copy) check.copy = check.payload.copy;
714                 if (check.payload && check.payload.record) check.record = check.payload.record;
715                 if (check.payload && check.payload.circ) check.circ = check.payload.circ;
716
717                 if (!check.route_to) check.route_to = '???';
718
719                 /* SUCCESS  /  NO_CHANGE  /  ITEM_NOT_CATALOGED */
720                 if (check.ilsevent == 0 || check.ilsevent == 3 || check.ilsevent == 1202) {
721                         try { check.route_to = data.lookup('acpl', check.copy.location() ).name(); } catch(E) { msg += 'FIXME: ' + E + '\n'; }
722                         var msg = '';
723                         if (check.ilsevent == 3) msg = 'This item is already checked in.\n';
724                         if (check.ilsevent == 1202 && check.copy.status() != 11) {
725                                 msg = 'FIXME -- ITEM_NOT_CATALOGED event but copy status is '
726                                         + (data.hash.ccs[ check.copy.status() ] ? data.hash.ccs[ check.copy.status() ].name() : check.copy.status().name() ) + '\n';
727                         }
728                         switch(check.copy.status()) {
729                                 case 0: /* AVAILABLE */
730                                 case 7: /* RESHELVING */
731                                         if (msg) msg += 'This item needs to be routed to ' + check.route_to + '.';
732                                 break;
733                                 case 8: /* ON HOLDS SHELF */
734                                         check.route_to = 'HOLDS SHELF';
735                                         if (check.payload.hold) {
736                                                 if (check.payload.hold.pickup_lib() != data.list.au[0].ws_ou()) {
737                                                         msg += 'FIXME:  We should have received a ROUTE_ITEM\n';
738                                                 } else {
739                                                         msg += 'This item needs to be routed to ' + check.route_to + '.\n';
740                                                 }
741                                         } else { 
742                                                 msg += 'FIXME: status of Holds Shelf, but no hold in payload';
743                                         }
744                                         if (check.payload.hold) {
745                                                 JSAN.use('patron.util');
746                                                 msg += '\nBarcode: ' + check.payload.copy.barcode() + '\n';
747                                                 msg += 'Title: ' + (check.payload.record ? check.payload.record.title() : check.payload.copy.dummy_title() ) + '\n';
748                                                 var au_obj = patron.util.retrieve_fleshed_au_via_id( session, check.payload.hold.usr() );
749                                                 msg += '\nHold for patron ' + au_obj.family_name() + ', ' + au_obj.first_given_name() + '\n';
750                                                 msg += 'Barcode: ' + au_obj.card().barcode() + '\n';
751                                                 if (check.payload.hold.phone_notify()) msg += 'Notify by phone: ' + check.payload.hold.phone_notify() + '\n';
752                                                 if (check.payload.hold.email_notify()) msg += 'Notify by email: ' + au_obj.email() + '\n';
753                                         }
754                                         var rv = 0;
755                                         if (!auto_print) rv = error.yns_alert(
756                                                 msg,
757                                                 'Hold Slip',
758                                                 "Print",
759                                                 "Don't Print",
760                                                 null,
761                                                 "Check here to confirm this message"
762                                         );
763                                         if (rv == 0) {
764                                                 try {
765                                                         JSAN.use('util.print'); var print = new util.print();
766                                                         print.simple( msg, { 'no_prompt' : true, 'content_type' : 'text/plain' } );
767                                                 } catch(E) {
768                                                         dump('FIXME: ' + E + '\n');
769                                                         alert('FIXME: ' + E + '\n');
770                                                 }
771                                         }
772                                         msg = '';
773                                 break;
774                                 case 6: /* IN TRANSIT */
775                                         check.route_to = 'TRANSIT SHELF??';
776                                         msg += ("FIXME -- I didn't think we could get here.\n");
777                                 break;
778                                 case 11: /* CATALOGING */
779                                         check.route_to = 'CATALOGING';
780                                         msg += 'This item needs to be routed to ' + check.route_to + '.';
781                                 break;
782                                 default:
783                                         msg += ('FIXME -- this case "' + (data.hash.ccs[check.copy.status()] ? data.hash.ccs[check.copy.status()].name() : check.copy.status().name()) + '" is unhandled.\n');
784                                         msg += 'This item needs to be routed to ' + check.route_to + '.';
785                                 break;
786                         }
787                         if (msg) error.yns_alert(msg,'Alert',null,'OK',null,"Check here to confirm this message");
788
789                 } else /* ROUTE_ITEM */ if (check.ilsevent == 7000) {
790
791                         var lib = data.hash.aou[ check.org ];
792                         check.route_to = lib.shortname();
793                         var msg = 'This item is in transit to ' + check.route_to + '.\n';
794                         msg += '\n' + lib.name() + '\n';
795                         try {
796                                 if (lib.holds_address() ) {
797                                         var a = network.simple_request('FM_AOA_RETRIEVE',[ lib.holds_address() ]);
798                                         if (typeof a.ilsevent != 'undefined') throw(a);
799                                         if (a.street1()) msg += a.street1() + '\n';
800                                         if (a.street2()) msg += a.street2() + '\n';
801                                         msg += (a.city() ? a.city() + ', ' : '') + (a.state() ? a.state() + ' ' : '') + (a.post_code() ? a.post_code() : '') + '\n';
802                                 } else {
803                                         msg += "We do not have a holds address for this library.\n";
804                                 }
805                         } catch(E) {
806                                 msg += 'Unable to retrieve mailing address.\n';
807                                 error.standard_unexpected_error_alert('Unable to retrieve mailing address.',E);
808                         }
809                         msg += '\nBarcode: ' + check.payload.copy.barcode() + '\n';
810                         msg += 'Title: ' + (check.payload.record ? check.payload.record.title() : check.payload.copy.dummy_title() ) + '\n';
811                         msg += 'Author: ' + (check.payload.record ? check.payload.record.author() :check.payload.copy.dummy_author()  ) + '\n';
812                         if (check.payload.hold) {
813                                 JSAN.use('patron.util');
814                                 var au_obj = patron.util.retrieve_fleshed_au_via_id( session, check.payload.hold.usr() );
815                                 msg += '\nHold for patron ' + au_obj.family_name() + ', ' + au_obj.first_given_name() + '\n';
816                                 msg += 'Barcode: ' + au_obj.card().barcode() + '\n';
817                                 if (check.payload.hold.phone_notify()) msg += 'Notify by phone: ' + check.payload.hold.phone_notify() + '\n';
818                                 if (check.payload.hold.email_notify()) msg += 'Notify by email: ' + au_obj.email() + '\n';
819                         }
820                         var rv = 0;
821                         if (!auto_print) rv = error.yns_alert(
822                                 msg,
823                                 'Transit Slip',
824                                 "Print",
825                                 "Don't Print",
826                                 null,
827                                 "Check here to confirm this message"
828                         );
829                         if (rv == 0) {
830                                 try {
831                                         JSAN.use('util.print'); var print = new util.print();
832                                         print.simple( msg, { 'no_prompt' : true, 'content_type' : 'text/plain' } );
833                                 } catch(E) {
834                                         dump('FIXME: ' + E + '\n');
835                                         alert('FIXME: ' + E + '\n');
836                                 }
837                         }
838
839                 } else /* ASSET_COPY_NOT_FOUND */ if (check.ilsevent == 1502) {
840
841                         check.route_to = 'CATALOGING';
842                         error.yns_alert(
843                                 'The barcode was either mis-scanned or the item needs to be cataloged.',
844                                 'Alert',
845                                 null,
846                                 'OK',
847                                 null,
848                                 "Check here to confirm this message"
849                         );
850
851                 } else /* NETWORK TIMEOUT */ if (check.ilsevent == -1) {
852                         error.standard_network_error_alert('Check In Failed.  If you wish to use the offline interface, in the top menubar select Circulation -> Offline Interface');
853                 } else {
854
855                         throw(check);
856
857                 }
858
859 //                              case '2': case 2: /* LOST??? */
860 //                                      JSAN.use('patron.util');
861 //                                      var au_obj = patron.util.retrieve_au_via_id( session, check.circ.usr() );
862 //                                      var msg = check.text + '\r\n' + 'Barcode: ' + barcode + '  Title: ' + 
863 //                                                      check.record.title() + '  Author: ' + check.record.author() + '\r\n' +
864 //                                                      'Patron: ' + au_obj.card().barcode() + ' ' + au_obj.family_name() + ', ' +
865 //                                                      au_obj.first_given_name();
866 //                                      var pcheck = error.yns_alert(
867 //                                              msg,
868 //                                              'Lost Item',
869 //                                              'Edit Copy & Patron',
870 //                                              "Just Continue",
871 //                                              null,
872 //                                              "Check here to confirm this message"
873 //                                      ); 
874 //                                      if (pcheck == 0) {
875 //                                              //FIXME//Re-implement
876 //                                              /*
877 //                                              var w = mw.spawn_main();
878 //                                              setTimeout(
879 //                                                      function() {
880 //                                                              mw.spawn_patron_display(w.document,'new_tab','main_tabbox',{'patron':au_obj});
881 //                                                              mw.spawn_batch_copy_editor(w.document,'new_tab','main_tabbox',
882 //                                                                      {'copy_ids':[ check.copy.id() ]});
883 //                                                      }, 0
884 //                                              );
885 //                                              */
886 //                                      }
887 //                              break;
888                 return check;
889         } catch(E) {
890                 JSAN.use('util.error'); var error = new util.error();
891                 error.standard_unexpected_error_alert('Check In Failed (in circ.util.checkin): ',E);
892                 return null;
893         }
894 }
895
896 circ.util.hold_capture_via_copy_barcode = function ( session, barcode, retrieve_flag ) {
897         try {
898                 JSAN.use('util.network'); var network = new util.network();
899                 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
900                 var params = { barcode: barcode }
901                 if (retrieve_flag) { params.flesh_record = retrieve_flag; params.flesh_copy = retrieve_flag; }
902                 var robj = network.request(
903                         api.CAPTURE_COPY_FOR_HOLD_VIA_BARCODE.app,
904                         api.CAPTURE_COPY_FOR_HOLD_VIA_BARCODE.method,
905                         [ session, params ]
906                 );
907                 var check = robj.payload;
908                 if (!check) {
909                         check = {};
910                         check.status = robj.ilsevent;
911                         check.copy = new acp(); check.copy.barcode( barcode );
912                 }
913                 check.text = robj.textcode;
914                 check.route_to = robj.route_to;
915                 //check.text = 'Captured for Hold';
916                 if (Number(check.route_to)) check.route_to = data.hash.aou[ check.route_to ].shortname();
917                 return check;
918         } catch(E) {
919                 JSAN.use('util.error'); var error = new util.error();
920                 error.standard_unexpected_error_alert('Hold Capture Failed',E);
921                 return null;
922         }
923 }
924
925
926 dump('exiting circ/util.js\n');