1 sdump('D_TRACE','Loading patron_utils.js\n');
3 function fake_patron() {
4 sdump('D_PATRON_UTILS',arg_dump(arguments));
6 p.family_name( 'Retrieving' );
9 p.credit_forward_balance('0.00');
14 function hold_status_as_text( status ) {
15 sdump('D_PATRON_UTILS',arg_dump(arguments));
16 if (typeof(status) == 'object') status = status.status();
19 case "1" : text = getString('holds_status_waiting_for_copy'); break;
20 case "2" : text = getString('holds_status_waiting_for_capture'); break;
21 case "3" : text = getString('holds_status_in_transit'); break;
22 case "4" : text = getString('holds_status_available'); break;
23 default : text = "Eh?"; break;
28 function patron_get_full_name( au ) {
29 sdump('D_PATRON_UTILS',arg_dump(arguments));
31 if (au.prefix()) name += au.prefix() + ' ';
32 if (au.family_name()) name += au.family_name() + ', ';
33 if (au.first_given_name()) name += au.first_given_name() + ' ';
34 if (au.second_given_name()) name += au.second_given_name() + ' ';
35 if (au.suffix()) name += au.suffix() + ' ';
39 function patron_get_barcode( au ) {
40 sdump('D_PATRON_UTILS',arg_dump(arguments));
42 if (au && au.card && au.card() ) {
43 if ( (au.card()!='null') && (typeof(au.card())=='object') ) {
44 return au.card().barcode();
46 return find_id_object_in_list( au.cards(), au.card() ).barcode();
55 function patron_get_bills( au, f ) {
56 sdump('D_PATRON_UTILS',arg_dump(arguments));
58 var bills = user_request(
60 'open-ils.actor.user.transactions.have_balance',
61 [ mw.G.auth_ses[0], au.id() ],
66 sdump('D_PATRON_UTILS','bills = ' + js2JSON(bills) + '\n');
67 au.bills = bills; // FIXME: make bills a virtual field of au
71 sdump('D_ERROR',js2JSON(E) + '\n');
77 function patron_get_bills_total( au ) {
78 sdump('D_PATRON_UTILS',arg_dump(arguments));
79 if (au.bills == null || au.bills == undefined)
82 return get_bills_total( au.bills );
86 function get_bills_total( bills ) {
87 sdump('D_PATRON_UTILS',arg_dump(arguments));
89 for (var i = 0; i < bills.length; i++) {
90 total += dollars_float_to_cents_integer( bills[i].balance_owed() );
92 sdump('D_PATRON_UTILS','bills_total $$$ = ' + cents_as_dollars( total ) + '\n');
93 return cents_as_dollars( total );
96 function patron_get_credit_total( au ) {
97 sdump('D_PATRON_UTILS',arg_dump(arguments));
98 /* FIXME: I can use CSS to style this number as money. */
99 return '$' + au.credit_forward_balance();
102 function patron_get_checkouts( au, f ) {
103 sdump('D_PATRON_UTILS',arg_dump(arguments));
105 var checkouts = user_request(
107 'open-ils.circ.actor.user.checked_out',
108 [ mw.G.auth_ses[0], au.id() ],
113 sdump('D_PATRON_UTILS','checkouts = ' + js2JSON(checkouts) + '\n');
114 if (!checkouts) checkouts = [];
115 au.checkouts( checkouts );
119 sdump('D_ERROR',js2JSON(E) + '\n');
124 function patron_get_checkouts_total( au ) {
125 sdump('D_PATRON_UTILS',arg_dump(arguments));
126 if (au.checkouts() == null)
129 return au.checkouts().length;
132 // Need an API call or virtual field to determine this
133 function patron_get_checkouts_overdue_total( au ) {
134 sdump('D_PATRON_UTILS',arg_dump(arguments));
135 if (! au.checkouts()) patron_get_checkouts( au );
137 if ( (au.checkouts() != null) && (typeof(au.checkouts())=='object') ) {
138 for (var i = 0; i < au.checkouts().length; i++) {
139 var item = au.checkouts()[i];
140 var due_date = item.circ.due_date();
141 due_date = due_date.substr(0,4) + due_date.substr(5,2) + due_date.substr(8,2);
142 var today = formatted_date( new Date() , '%Y%m%d' );
143 if (today > due_date) total++;
146 sdump('D_PATRON_UTILS','\toverdue = ' + total + '\n');
150 function patron_get_holds( au, f ) {
151 sdump('D_PATRON_UTILS',arg_dump(arguments));
153 var hold_requests = user_request(
155 'open-ils.circ.holds.retrieve',
156 [ mw.G.auth_ses[0], au.id() ],
161 sdump('D_PATRON_UTILS','holds = ' + js2JSON(au.hold_requests()) + '\n');
162 au.hold_requests( hold_requests );
163 return hold_requests;
166 sdump('D_ERROR',js2JSON(E) + '\n');
171 function patron_get_holds_total( au ) {
172 sdump('D_PATRON_UTILS',arg_dump(arguments));
173 if (au.hold_requests() == null)
176 return au.hold_requests().length;
179 function patron_get_hold_status( hold, f ) {
180 sdump('D_PATRON_UTILS',arg_dump(arguments));
182 var status = user_request(
184 'open-ils.circ.hold.status.retrieve',
185 [ mw.G.auth_ses[0], hold.id() ],
190 sdump('D_PATRON_UTILS','status = ' + status + '\n');
191 hold.status( status );
195 sdump('D_ERROR',js2JSON(E) + '\n');
200 function patron_get_holds_available_total( au ) {
201 sdump('D_PATRON_UTILS',arg_dump(arguments));
203 if ( (au.hold_requests() != null) && (typeof(au.hold_requests()) == 'object') ) {
204 for (var i = 0; i < au.hold_requests().length; i++) {
205 var hold = au.hold_requests()[i];
206 if (hold.capture_time()) total++;
209 sdump('D_PATRON_UTILS','\tavailable = ' + total + '\n');
213 function patron_get_home_ou_name( au ) {
214 sdump('D_PATRON_UTILS',arg_dump(arguments));
218 mw.G.org_tree_hash &&
219 mw.G.org_tree_hash[ au.home_ou() ] &&
220 mw.G.org_tree_hash[ au.home_ou() ].name &&
221 mw.G.org_tree_hash[ au.home_ou() ].name()
223 return mw.G.org_tree_hash[ au.home_ou() ].name();
229 function patron_get_ident1_type_as_text( au ) {
230 sdump('D_PATRON_UTILS',arg_dump(arguments));
235 mw.G.cit_hash[ au.ident_type() ] &&
236 mw.G.cit_hash[ au.ident_type() ].name &&
237 mw.G.cit_hash[ au.ident_type() ].name()
239 return mw.G.cit_hash[ au.ident_type() ].name();
245 function patron_get_ident2_type_as_text( au ) {
246 sdump('D_PATRON_UTILS',arg_dump(arguments));
251 mw.G.cit_hash[ au.ident_type2() ] &&
252 mw.G.cit_hash[ au.ident_type2() ].name &&
253 mw.G.cit_hash[ au.ident_type2() ].name()
255 return mw.G.cit_hash[ au.ident_type2() ].name();
261 function patron_get_profile_as_text( au ) {
262 sdump('D_PATRON_UTILS',arg_dump(arguments));
267 mw.G.ap_hash[ au.profile() ] &&
268 mw.G.ap_hash[ au.profile() ].name &&
269 mw.G.ap_hash[ au.profile() ].name()
271 return mw.G.ap_hash[ au.profile() ].name();
277 function patron_get_standing_as_text( au ) {
278 sdump('D_PATRON_UTILS',arg_dump(arguments));
283 mw.G.cst_hash[ au.standing() ] &&
284 mw.G.cst_hash[ au.standing() ].value &&
285 mw.G.cst_hash[ au.standing() ].value()
287 return mw.G.cst_hash[ au.standing() ].value();
293 function patron_get_standing_css_style( value ) {
294 sdump('D_PATRON_UTILS',arg_dump(arguments,{0:true}));
296 case 'Good' : case '1' : return 'background-color: lightgreen;'; break;
297 case 'Barred' : case '2' : return 'background-color: yellow;'; break;
298 case 'Blocked' : case '3' : return 'background-color: red;'; break;
299 default: return 'background-color: white;'; break;
303 function patron_pay_bills( payment_blob ) {
304 sdump('D_PATRON_UTILS',arg_dump(arguments,{0:true}));
306 //alert("Bill's API call goes here. payment_blob = \n" + pretty_print( js2JSON( payment_blob ) ) + '\n');
307 alert( 'payment_blob\n' + js2JSON( payment_blob ) );
308 var result = user_request(
310 'open-ils.circ.money.payment',
311 [ mw.G.auth_ses[0], payment_blob ]
313 alert( pretty_print( js2JSON( result ) ) );
321 function retrieve_patron_by_barcode( barcode, f ) {
322 sdump('D_PATRON_UTILS',arg_dump(arguments));
323 if (!barcode) return null;
324 return user_request( 'open-ils.actor', 'open-ils.actor.user.fleshed.retrieve_by_barcode', [ mw.G.auth_ses[0], barcode ], f )[0];
327 function retrieve_patron_by_id( id, f ) {
328 sdump('D_PATRON_UTILS',arg_dump(arguments));
329 if (!id) return null;
330 return user_request( 'open-ils.actor', 'open-ils.actor.user.fleshed.retrieve', [ mw.G.auth_ses[0], id ], f )[0];
333 function save_patron( au, f ) {
334 sdump('D_PATRON_UTILS',arg_dump(arguments));
336 var result = user_request(
338 'open-ils.actor.patron.update',
339 [ mw.G.auth_ses[0], au ],
342 if (!f) sdump('D_PATRON_UTILS','result = ' + js2JSON(result) + '\n');
350 function patron_edit_rows() {
353 'id' : 'standing', 'label' : getString('au_standing_label'), 'flex' : 1, 'class' : 'pale_violet_red',
354 'primary' : false, 'hidden' : false, 'fm_class' : 'au', 'fm_field_render' : 'mw.G.cst_hash[ $$.standing() ].value()',
355 'entry_widget' : 'menulist', 'populate_with' : map_object(mw.G.cst_hash,function(key,value){return [value.value(), key];}),
356 'entry_event' : 'command', 'entry_code' : '{ au.standing( ev.target.value ); }',
357 'rdefault' : '.standing()'
360 'id' : 'alert_message', 'label' : getString('au_alert_message_label'), 'flex' : 1, 'class' : 'pale_violet_red',
361 'primary' : false, 'hidden' : false, 'fm_class' : 'au', 'fm_field_render' : '.alert_message()',
362 'entry_widget' : 'textbox', 'rdefault' : '.alert_message()',
363 'entry_event' : 'change', 'entry_code' : '{ alert(js2JSON(au)); au.alert_message( ev.target.value ); }'
366 'id' : 'create_date', 'label' : getString('au_create_date_label'), 'flex' : 1, 'class' : 'peach_puff',
367 'primary' : false, 'hidden' : false, 'fm_class' : 'au', 'fm_field_render' : '.create_date()',
368 'entry_widget' : 'textbox', 'entry_widget_attributes' : { 'readonly' : 'true' }, 'rdefault' : '.create_date()',
369 'entry_event' : 'change', 'entry_code' : '{ au.create_date( ev.target.value ); }'
372 'id' : 'expire_date', 'label' : getString('au_expire_date_label'), 'flex' : 1, 'class' : 'peach_puff',
373 'primary' : false, 'hidden' : false, 'fm_class' : 'au', 'fm_field_render' : '.expire_date()',
374 'entry_widget' : 'textbox', 'rdefault' : '.expire_date()',
375 'entry_event' : 'change', 'entry_code' : '{ au.expire_date( ev.target.value ); }'
378 'id' : 'active', 'label' : getString('au_active_label'), 'flex' : 1, 'class' : 'peach_puff',
379 'primary' : false, 'hidden' : false, 'fm_class' : 'au', 'fm_field_render' : 'yesno($$.active())',
380 'entry_widget' : 'menulist', 'populate_with' : { 'Yes' : 1 , 'No' : 0 }, 'rdefault' : '.active()',
381 'entry_event' : 'command', 'entry_code' : '{ au.active( ev.target.value ); }'
384 'id' : 'card', 'label' : getString('au_card_label'), 'flex' : 1, 'class' : 'peach_puff',
385 'primary' : false, 'hidden' : false, 'fm_class' : 'au', 'fm_field_render' : '.card().barcode()',
386 'entry_widget' : 'button', 'entry_widget_attributes' : { 'label' : 'New Card', 'oncommand' : 'alert("test");' },
387 'entry_event' : 'command', 'entry_code' : '{ new_card(au); }'
390 'id' : 'home_ou', 'label' : getString('au_home_ou_label'), 'flex' : 1, 'class' : 'peach_puff',
391 'primary' : false, 'hidden' : false, 'fm_class' : 'au', 'fm_field_render' : 'mw.G.org_tree_hash[ $$.home_ou() ].shortname()',
392 'entry_widget' : 'menulist', 'populate_with' : map_object(mw.G.org_tree_hash,function(key,value){return [value.shortname(), key];}),
393 'entry_event' : 'command', 'entry_code' : '{ au.home_ou( ev.target.value ); }',
394 'rdefault' : '.home_ou()'
397 'id' : 'profile', 'label' : getString('au_profile_label'), 'flex' : 1, 'class' : 'peach_puff',
398 'primary' : false, 'hidden' : false, 'fm_class' : 'au', 'fm_field_render' : 'ap_hash[ $$.profile() ].name()',
399 'entry_widget' : 'menulist', 'populate_with' : map_object(mw.G.ap_hash,function(key,value){return [value.name(), key];}),
400 'entry_event' : 'command', 'entry_code' : '{ au.profile( ev.target.value ); }',
401 'rdefault' : '.profile()'
404 'id' : 'prefix', 'label' : getString('au_prefix_label'), 'flex' : 1, 'class' : 'dark_salmon',
405 'primary' : false, 'hidden' : false, 'fm_class' : 'au', 'fm_field_render' : '.prefix()',
406 'entry_widget' : 'menulist', 'entry_widget_attributes' : { 'editable' : 'true' },
407 'entry_event' : 'command', 'entry_code' : '{ au.prefix( ev.target.value ); }',
408 'populate_with' : { 'Mr.' : 'Mr.' , 'Mrs.' : 'Mrs.' }, 'rdefault' : '.prefix()'
411 'id' : 'family_name', 'label' : getString('au_family_name_label'), 'flex' : 1, 'class' : 'dark_salmon',
412 'primary' : false, 'hidden' : false, 'fm_class' : 'au', 'fm_field_render' : '.family_name()',
413 'entry_widget' : 'textbox', 'rdefault' : '.family_name()',
414 'entry_event' : 'change', 'entry_code' : '{ au.family_name( ev.target.value ); }'
417 'id' : 'first_given_name', 'label' : getString('au_first_given_name_label'), 'flex' : 1, 'class' : 'dark_salmon',
418 'primary' : false, 'hidden' : false, 'fm_class' : 'au', 'fm_field_render' : '.first_given_name()',
419 'entry_widget' : 'textbox', 'rdefault' : '.first_given_name()',
420 'entry_event' : 'change', 'entry_code' : '{ au.frist_given_name( ev.target.value ); }'
423 'id' : 'second_given_name', 'label' : getString('au_second_given_name_label'), 'flex' : 1, 'class' : 'dark_salmon',
424 'primary' : false, 'hidden' : false, 'fm_class' : 'au', 'fm_field_render' : '.second_given_name()',
425 'entry_widget' : 'textbox', 'rdefault' : '.second_given_name()',
426 'entry_event' : 'change', 'entry_code' : '{ au.second_given_name( ev.target.value ); }'
429 'id' : 'suffix', 'label' : getString('au_suffix_label'), 'flex' : 1, 'class' : 'dark_salmon',
430 'primary' : false, 'hidden' : false, 'fm_class' : 'au', 'fm_field_render' : '.suffix()',
431 'entry_widget' : 'menulist', 'entry_widget_attributes' : { 'editable' : 'true' },
432 'populate_with' : { 'Sr.' : 'Sr.' , 'Jr.' : 'Jr.' }, 'rdefault' : '.suffix()',
433 'entry_event' : 'command', 'entry_code' : '{ au.suffix( ev.target.value ); }'
436 'id' : 'dob', 'label' : getString('au_dob_label'), 'flex' : 1, 'class' : 'cadet_blue',
437 'primary' : false, 'hidden' : false, 'fm_class' : 'au', 'fm_field_render' : '.dob()',
438 'entry_widget' : 'textbox', 'rdefault' : '.dob()',
439 'entry_event' : 'change', 'entry_code' : '{ au.dob( ev.target.value ); }'
442 'id' : 'ident_type', 'label' : getString('au_ident_type_label'), 'flex' : 1, 'class' : 'cadet_blue',
443 'primary' : false, 'hidden' : false, 'fm_class' : 'au', 'fm_field_render' : 'mw.G.cit_hash[ $$.ident_type() ].name()',
444 'entry_widget' : 'menulist', 'populate_with' : map_object(mw.G.cit_hash,function(key,value){return [value.name(), key];}),
445 'rdefault' : '.ident_type()',
446 'entry_event' : 'command', 'entry_code' : '{ au.ident_type( ev.target.value ); }'
449 'id' : 'ident_value', 'label' : getString('au_ident_value_label'), 'flex' : 1, 'class' : 'cadet_blue',
450 'primary' : false, 'hidden' : false, 'fm_class' : 'au', 'fm_field_render' : '.ident_value()',
451 'entry_widget' : 'textbox', 'rdefault' : '.ident_value()',
452 'entry_event' : 'change', 'entry_code' : '{ au.ident_value( ev.target.value ); }'
455 'id' : 'ident_type2', 'label' : getString('au_ident_type2_label'), 'flex' : 1, 'class' : 'cadet_blue',
456 'primary' : false, 'hidden' : false, 'fm_class' : 'au', 'fm_field_render' : 'mw.G.cit_hash[ $$.ident_type2() ].name()',
457 'entry_widget' : 'menulist', 'populate_with' : map_object(mw.G.cit_hash,function(key,value){return [value.name(), key];}),
458 'rdefault' : '.ident_type2()',
459 'entry_event' : 'command', 'entry_code' : '{ au.ident_type2( ev.target.value ); }'
462 'id' : 'ident_value2', 'label' : getString('au_ident_value2_label'), 'flex' : 1, 'class' : 'cadet_blue',
463 'primary' : false, 'hidden' : false, 'fm_class' : 'au', 'fm_field_render' : '.ident_value2()',
464 'entry_widget' : 'textbox', 'rdefault' : '.ident_value2()',
465 'entry_event' : 'change', 'entry_code' : '{ au.ident_value2( ev.target.value ); }'
468 'id' : 'addresses', 'label' : getString('au_addresses_label'), 'flex' : 1, 'class' : 'coral',
469 'primary' : false, 'hidden' : false, 'fm_class' : 'au', 'fm_field_render' : '.addresses().length + " addresses"',
470 'entry_widget' : 'button', 'entry_widget_attributes' : { 'label' : 'View/Edit/New' },
471 'entry_event' : 'command', 'entry_code' : '{ edit_addresses(au); }'
474 'id' : 'day_phone', 'label' : getString('au_day_phone_label'), 'flex' : 1, 'class' : 'coral',
475 'primary' : false, 'hidden' : false, 'fm_class' : 'au', 'fm_field_render' : '.day_phone()',
476 'entry_widget' : 'textbox', 'rdefault' : '.day_phone()',
477 'entry_event' : 'change', 'entry_code' : '{ au.day_phone( ev.target.value ); }'
480 'id' : 'evening_phone', 'label' : getString('au_evening_phone_label'), 'flex' : 1, 'class' : 'coral',
481 'primary' : false, 'hidden' : false, 'fm_class' : 'au', 'fm_field_render' : '.evening_phone()',
482 'entry_widget' : 'textbox', 'rdefault' : '.evening_phone()',
483 'entry_event' : 'change', 'entry_code' : '{ au.evening_phone( ev.target.value ); }'
486 'id' : 'other_phone', 'label' : getString('au_other_phone_label'), 'flex' : 1, 'class' : 'coral',
487 'primary' : false, 'hidden' : false, 'fm_class' : 'au', 'fm_field_render' : '.other_phone()',
488 'entry_widget' : 'textbox', 'rdefault' : '.other_phone()',
489 'entry_event' : 'change', 'entry_code' : '{ au.other_phone( ev.target.value ); }'
492 'id' : 'email', 'label' : getString('au_email_label'), 'flex' : 1, 'class' : 'coral',
493 'primary' : false, 'hidden' : false, 'fm_class' : 'au', 'fm_field_render' : '.email()',
494 'entry_widget' : 'textbox', 'rdefault' : '.email()',
495 'entry_event' : 'change', 'entry_code' : '{ au.email( ev.target.value ); }'
498 'id' : 'master_account', 'label' : getString('au_master_account_label'), 'flex' : 1,
499 'primary' : false, 'hidden' : false, 'fm_class' : 'au', 'fm_field_render' : '.master_account()',
500 'entry_widget' : 'textbox', 'rdefault' : '.master_account()',
501 'entry_event' : 'change', 'entry_code' : '{ au.master_account( ev.target.value ); }'
504 'id' : 'net_access_level', 'label' : getString('au_net_access_level_label'), 'flex' : 1,
505 'primary' : false, 'hidden' : false, 'fm_class' : 'au', 'fm_field_render' : '.net_access_level()',
506 'entry_widget' : 'textbox', 'rdefault' : '.net_access_level()',
507 'entry_event' : 'change', 'entry_code' : '{ au.net_access_level( ev.target.value ); }'
510 'id' : 'passwd', 'label' : getString('au_passwd_label'), 'flex' : 1,
511 'primary' : false, 'hidden' : false, 'fm_class' : 'au', 'fm_field_render' : '.passwd()',
512 'entry_widget' : 'textbox', 'rdefault' : '.passwd()',
513 'entry_event' : 'change', 'entry_code' : '{ au.passwd( ev.target.value ); }'
516 'id' : 'photo_url', 'label' : getString('au_photo_url_label'), 'flex' : 1,
517 'primary' : false, 'hidden' : false, 'fm_class' : 'au', 'fm_field_render' : '.photo_url()',
518 'entry_widget' : 'textbox', 'rdefault' : '.photo_url()',
519 'entry_event' : 'change', 'entry_code' : '{ au.photo_url( ev.target.value ); }'
522 'id' : 'stat_cat_entries', 'label' : getString('au_stat_cat_entries_label'), 'flex' : 1,
523 'primary' : false, 'hidden' : false, 'fm_class' : 'au', 'fm_field_render' : '.stat_cat_entries().length + " entries"',
524 'entry_widget' : 'button', 'entry_widget_attributes' : { 'label' : 'View/Edit' },
525 'entry_event' : 'command', 'entry_code' : '{ edit_stat_cat_entries(au); }'
528 'id' : 'survey_responses', 'label' : getString('au_survey_responses_label'), 'flex' : 1,
529 'primary' : false, 'hidden' : false, 'fm_class' : 'au', 'fm_field_render' : '.survey_responses().length + " responses"',
530 'entry_widget' : 'button', 'entry_widget_attributes' : { 'label' : 'View/New' },
531 'entry_event' : 'command', 'entry_code' : '{ new_survey_responses(au); }'
534 'id' : 'usrgroup', 'label' : getString('au_usrgroup_label'), 'flex' : 1,
535 'primary' : false, 'hidden' : false, 'fm_class' : 'au', 'fm_field_render' : '.usrgroup()',
536 'entry_widget' : 'textbox', 'rdefault' : '.usrgroup()',
537 'entry_event' : 'change', 'entry_code' : '{ au.usrgroup( ev.target.value ); }'
540 'id' : 'usrname', 'label' : getString('au_usrname_label'), 'flex' : 1,
541 'primary' : false, 'hidden' : false, 'fm_class' : 'au', 'fm_field_render' : '.usrname()',
542 'entry_widget' : 'textbox', 'rdefault' : '.usrname()',
543 'entry_event' : 'change', 'entry_code' : '{ au.usrname( ev.target.value ); }'