/** * */ public function SaveTransaction() { $ps_item_list = $this->request->getParameter('item_list', pString); $pa_item_list = json_decode($ps_item_list, true); $t_checkout = new ca_object_checkouts(); $va_ret = array('status' => 'OK', 'errors' => array(), 'checkins' => array()); foreach ($pa_item_list as $vn_i => $va_item) { if ($t_checkout->load($va_item['checkout_id'])) { $vn_object_id = $t_checkout->get('object_id'); $t_object = new ca_objects($vn_object_id); if ($t_checkout->isOut()) { try { $t_checkout->checkin($vn_object_id, $va_item['note'], array('request' => $this->request)); $t_user = new ca_users($t_checkout->get('user_id')); $vs_user_name = $t_user->get('ca_users.fname') . ' ' . $t_user->get('ca_users.lname'); $vs_borrow_date = $t_checkout->get('ca_object_checkouts.checkout_date', array('timeOmit' => true)); if ($t_checkout->numErrors() == 0) { $va_ret['checkins'][] = _t('Returned <em>%1</em> (%2) borrowed by %3 on %4', $t_object->get('ca_objects.preferred_labels.name'), $t_object->get('ca_objects.idno'), $vs_user_name, $vs_borrow_date); } else { $va_ret['errors'][] = _t('Could not check in <em>%1</em> (%2): %3', $t_object->get('ca_objects.preferred_labels.name'), $t_object->get('ca_objects.idno'), join("; ", $t_checkout->getErrors())); } } catch (Exception $e) { $va_ret['errors'][] = _t('<em>%1</em> (%2) is not out', $t_object->get('ca_objects.preferred_labels.name'), $t_object->get('ca_objects.idno')); } } else { $va_ret['errors'][] = _t('<em>%1</em> (%2) is not out', $t_object->get('ca_objects.preferred_labels.name'), $t_object->get('ca_objects.idno')); } } } $this->view->setVar('data', $va_ret); $this->render('checkin/ajax_data_json.php'); }
/** * Perform client services-related periodic tasks */ public function hookPeriodicTask(&$pa_params) { $t_log = new Eventlog(); $o_db = new Db(); if (!(bool) $this->opo_config->get('enable_library_services')) { return true; } if ((bool) $this->opo_config->get('enable_object_checkout')) { $t_user = new ca_users(); $t_checkout = new ca_object_checkouts(); $vs_app_name = $this->opo_config->get('app_display_name'); $vs_sender_name = $this->opo_library_services_config->get('notification_sender_name'); $vs_sender_email = $this->opo_library_services_config->get('notification_sender_email'); if (!is_array($va_administrative_email_addresses = $this->opo_library_services_config->getList('administrative_email_addresses'))) { $va_administrative_email_addresses = array(); } // Periodic "coming due" notices if ($this->opo_library_services_config->get('send_coming_due_notices') && ($vs_interval = $this->opo_library_services_config->get('coming_due_interval'))) { try { $va_items_by_user = ca_object_checkouts::getItemsDueWithin($vs_interval, array('groupBy' => 'user_id', 'template' => $this->opo_library_services_config->get('coming_due_item_display_template'), 'notificationInterval' => $this->opo_library_services_config->get('coming_due_notification_interval'))); foreach ($va_items_by_user as $vn_user_id => $va_items_for_user) { if ($t_user->load($vn_user_id)) { if ($vs_user_email = $t_user->get('email')) { $vs_subject = _t('Notice of items coming due for return'); if (caSendMessageUsingView(null, $vs_user_email, $vs_sender_email, "[{$vs_app_name}] {$vs_subject}", "library_coming_due.tpl", array('subject' => $vs_subject, 'from_user_id' => $vn_user_id, 'sender_name' => $vs_sender_name, 'sender_email' => $vs_sender_email, 'sent_on' => time(), 'items' => $va_items_for_user), null, $va_administrative_email_addresses)) { // mark record foreach ($va_items_for_user as $va_item) { if ($t_checkout->load($va_item['checkout_id'])) { $t_checkout->setMode(ACCESS_WRITE); $t_checkout->set('last_sent_coming_due_email', _t('now')); $t_checkout->update(); if ($t_checkout->numErrors()) { $t_log->log(array('CODE' => 'ERR', 'MESSAGE' => _t('Could not mark checkout coming due message sent time because update failed: %1', join("; ", $t_checkout->getErrors())), 'SOURCE' => 'libraryServicesPlugin->hookPeriodicTask')); } } else { $t_log->log(array('CODE' => 'ERR', 'MESSAGE' => _t('Could not mark checkout coming due message sent time because checkout id %1 was not found', $va_item['checkout_id']), 'SOURCE' => 'libraryServicesPlugin->hookPeriodicTask')); } } } } else { // no email $t_log->log(array('CODE' => 'ERR', 'MESSAGE' => _t('No email address set for user %1 (%2)', $t_user->get('user_name'), trim($t_user->get('fname') . ' ' . $t_user->get('lname'))), 'SOURCE' => 'libraryServicesPlugin->hookPeriodicTask')); } } else { // invalid user $t_log->log(array('CODE' => 'ERR', 'MESSAGE' => _t('User id %1 does not exist', $vn_user_id), 'SOURCE' => 'libraryServicesPlugin->hookPeriodicTask')); } } } catch (Exception $e) { $t_log->log(array('CODE' => 'ERR', 'MESSAGE' => _t('Invalid interval (%1) specified for coming due notices', $vs_interval), 'SOURCE' => 'libraryServicesPlugin->hookPeriodicTask')); } } // Periodic overdue notices if ($this->opo_library_services_config->get('send_overdue_notices')) { try { $va_items_by_user = ca_object_checkouts::getOverdueItems(array('groupBy' => 'user_id', 'template' => $this->opo_library_services_config->get('overdue_item_display_template'), 'notificationInterval' => $this->opo_library_services_config->get('overdue_notification_interval'))); foreach ($va_items_by_user as $vn_user_id => $va_items_for_user) { if ($t_user->load($vn_user_id)) { if ($vs_user_email = $t_user->get('email')) { $vs_subject = _t('Notice of overdue items'); if (caSendMessageUsingView(null, $vs_user_email, $vs_sender_email, "[{$vs_app_name}] {$vs_subject}", "library_overdue.tpl", array('subject' => $vs_subject, 'from_user_id' => $vn_user_id, 'sender_name' => $vs_sender_name, 'sender_email' => $vs_sender_email, 'sent_on' => time(), 'items' => $va_items_for_user), null, $va_administrative_email_addresses)) { // mark record foreach ($va_items_for_user as $va_item) { if ($t_checkout->load($va_item['checkout_id'])) { $t_checkout->setMode(ACCESS_WRITE); $t_checkout->set('last_sent_overdue_email', _t('now')); $t_checkout->update(); if ($t_checkout->numErrors()) { $t_log->log(array('CODE' => 'ERR', 'MESSAGE' => _t('Could not mark checkout overdue message sent time because update failed: %1', join("; ", $t_checkout->getErrors())), 'SOURCE' => 'libraryServicesPlugin->hookPeriodicTask')); } } else { $t_log->log(array('CODE' => 'ERR', 'MESSAGE' => _t('Could not mark checkout overdue message sent time because checkout id %1 was not found', $va_item['checkout_id']), 'SOURCE' => 'libraryServicesPlugin->hookPeriodicTask')); } } } } else { // no email $t_log->log(array('CODE' => 'ERR', 'MESSAGE' => _t('No email address set for user %1 (%2)', $t_user->get('user_name'), trim($t_user->get('fname') . ' ' . $t_user->get('lname'))), 'SOURCE' => 'libraryServicesPlugin->hookPeriodicTask')); } } else { // invalid user $t_log->log(array('CODE' => 'ERR', 'MESSAGE' => _t('User id %1 does not exist', $vn_user_id), 'SOURCE' => 'libraryServicesPlugin->hookPeriodicTask')); } } } catch (Exception $e) { $t_log->log(array('CODE' => 'ERR', 'MESSAGE' => _t('Failed to get overdue list'), 'SOURCE' => 'libraryServicesPlugin->hookPeriodicTask')); } } // Notice when reservation becomes available if ($this->opo_library_services_config->get('send_reservation_available_notices')) { try { $va_items_by_user = ca_object_checkouts::getReservedAvailableItems(array('groupBy' => 'user_id', 'template' => $this->opo_library_services_config->get('overdue_item_display_template'), 'notificationInterval' => $this->opo_library_services_config->get('reservation_available_notification_interval'))); foreach ($va_items_by_user as $vn_user_id => $va_items_for_user) { if ($t_user->load($vn_user_id)) { if ($vs_user_email = $t_user->get('email')) { $vs_subject = _t('Notice of reserved available items'); if (caSendMessageUsingView(null, $vs_user_email, $vs_sender_email, "[{$vs_app_name}] {$vs_subject}", "library_reservation_available.tpl", array('subject' => $vs_subject, 'from_user_id' => $vn_user_id, 'sender_name' => $vs_sender_name, 'sender_email' => $vs_sender_email, 'sent_on' => time(), 'items' => $va_items_for_user), null, $va_administrative_email_addresses)) { // mark record foreach ($va_items_for_user as $va_item) { if ($t_checkout->load($va_item['checkout_id'])) { $t_checkout->setMode(ACCESS_WRITE); $t_checkout->set('last_reservation_available_email', _t('now')); $t_checkout->update(); if ($t_checkout->numErrors()) { $t_log->log(array('CODE' => 'ERR', 'MESSAGE' => _t('Could not mark reserved available message sent time because update failed: %1', join("; ", $t_checkout->getErrors())), 'SOURCE' => 'libraryServicesPlugin->hookPeriodicTask')); } } else { $t_log->log(array('CODE' => 'ERR', 'MESSAGE' => _t('Could not mark reserved available message sent time because checkout id %1 was not found', $va_item['checkout_id']), 'SOURCE' => 'libraryServicesPlugin->hookPeriodicTask')); } } } } else { // no email $t_log->log(array('CODE' => 'ERR', 'MESSAGE' => _t('No email address set for user %1 (%2)', $t_user->get('user_name'), trim($t_user->get('fname') . ' ' . $t_user->get('lname'))), 'SOURCE' => 'libraryServicesPlugin->hookPeriodicTask')); } } else { // invalid user $t_log->log(array('CODE' => 'ERR', 'MESSAGE' => _t('User id %1 does not exist', $vn_user_id), 'SOURCE' => 'libraryServicesPlugin->hookPeriodicTask')); } } } catch (Exception $e) { $t_log->log(array('CODE' => 'ERR', 'MESSAGE' => _t('Failed to get reserved available list'), 'SOURCE' => 'libraryServicesPlugin->hookPeriodicTask')); } } } return true; }
/** * Return checkout status for currently loaded object. By default a numeric constant is returned. Possible values are: * __CA_OBJECTS_CHECKOUT_STATUS_AVAILABLE__ (0) * __CA_OBJECTS_CHECKOUT_STATUS_OUT__ (1) * __CA_OBJECTS_CHECKOUT_STATUS_OUT_WITH_RESERVATIONS__ (2) * __CA_OBJECTS_CHECKOUT_STATUS_RESERVED__ (3) * * If the returnAsText option is set then a text status value suitable for display is returned. For detailed information * about the current status use the returnAsArray option, which returns an array with the following elements: * * status = numeric status code * status_display = status display text * user_id = The user_id of the user who checked out the object (if status is __CA_OBJECTS_CHECKOUT_STATUS_OUT__ or __CA_OBJECTS_CHECKOUT_STATUS_OUT_WITH_RESERVATIONS__) * user_name = Displayable user name and email * checkout_date = Date of checkout (if status is __CA_OBJECTS_CHECKOUT_STATUS_OUT__ or __CA_OBJECTS_CHECKOUT_STATUS_OUT_WITH_RESERVATIONS__) as printable text * * @param array $pa_options Options include: * returnAsText = return status as displayable text [Default=false] * returnAsText = return detailed status information in an array [Default=false] * @return mixed Will return a numeric status code by default; status text for display if returnAsText option is set; or an array with details on the checkout if the returnAsArray option is set. Will return null if not object is loaded or if the object may not be checked out. */ public function getCheckoutStatus($pa_options = null) { if (!($vn_object_id = $this->getPrimaryKey())) { return null; } if (!$this->canBeCheckedOut()) { return null; } $vb_return_as_text = caGetOption('returnAsText', $pa_options, false); $vb_return_as_array = caGetOption('returnAsArray', $pa_options, false); $t_checkout = new ca_object_checkouts(); $va_is_out = $t_checkout->objectIsOut($vn_object_id); $va_reservations = $t_checkout->objectHasReservations($vn_object_id); $vn_num_reservations = sizeof($va_reservations); $vb_is_reserved = is_array($va_reservations) && sizeof($va_reservations); $va_info = array('user_name' => null, 'checkout_date' => null, 'user_id' => null, 'due_date' => null, 'checkout_notes' => null); if ($va_is_out) { $t_checkout->load($va_is_out['checkout_id']); $va_info['status'] = $vb_is_reserved ? __CA_OBJECTS_CHECKOUT_STATUS_OUT_WITH_RESERVATIONS__ : __CA_OBJECTS_CHECKOUT_STATUS_OUT__; $va_info['status_display'] = $vb_is_reserved ? $vn_num_reservations == 1 ? _t('Out; %1 reservation', $vn_num_reservations) : _t('Out; %1 reservations', $vn_num_reservations) : _t('Out'); $va_info['user_id'] = $va_is_out['user_id']; $va_info['checkout_date'] = $t_checkout->get('checkout_date', array('timeOmit' => true)); $va_info['checkout_notes'] = $t_checkout->get('checkout_notes'); $va_info['due_date'] = $t_checkout->get('checkout_date', array('timeOmit' => true)); $va_info['user_name'] = $t_checkout->get('ca_users.fname') . ' ' . $t_checkout->get('ca_users.lname') . (($vs_email = $t_checkout->get('ca_users.email')) ? " ({$vs_email})" : ''); } elseif ($vb_is_reserved) { $va_info['status'] = __CA_OBJECTS_CHECKOUT_STATUS_RESERVED__; $va_info['status_display'] = $vn_num_reservations == 1 ? _t('Reserved') : _t('%1 reservations', $vn_num_reservations); } else { $va_info['status'] = __CA_OBJECTS_CHECKOUT_STATUS_AVAILABLE__; $va_info['status_display'] = _t('Available'); } if ($vb_return_as_array) { return $va_info; } if ($vb_return_as_text) { return $va_info['status_display']; } return $va_info['status']; }