function merci_add_reservation_items in MERCI (Manage Equipment Reservations, Checkout and Inventory) 6.2
Same name and namespace in other branches
- 6 merci.module \merci_add_reservation_items()
- 7.2 includes/api.inc \merci_add_reservation_items()
Adds items to reservation on creation/update.
Parameters
$node: The reservation node.
2 calls to merci_add_reservation_items()
- merci_insert in ./
merci.module - Implementation of hook_insert().
- merci_update in ./
merci.module - Implementation of hook_update().
File
- includes/
api.inc, line 1030 - MERCI - Managed Equipment Reservation Checkout and Inventory
Code
function merci_add_reservation_items($node) {
$member_total = 0;
$commercial_total = 0;
$hours = round(strtotime($node->field_merci_date[0]['value2']) - strtotime($node->field_merci_date[0]['value'])) / 3600;
$exempt_items = array();
// Update existing items or add new ones.
if (isset($node->merci_reservation_items)) {
foreach ($node->merci_reservation_items as $did => $item) {
if (empty($item['merci_item_nid']) and empty($item['type'])) {
continue;
}
// If we are copying a reservation. I.e. via node_repeat
if (array_key_exists('merci_placeholder_nid', $item) and $node->is_new) {
$placeholder_node = node_load($item['merci_placeholder_nid']);
$placeholder_node->nid = NULL;
$placeholder_node->vid = NULL;
$placeholder_node = node_submit($placeholder_node);
node_save($placeholder_node);
$item['merci_placeholder_nid'] = $placeholder_node->nid;
}
// Create a placeholder node if we don't have one yet.
if (!array_key_exists('merci_placeholder_nid', $item)) {
// Resource.
if (array_key_exists('merci_item_nid', $item)) {
if (is_numeric($item['merci_item_nid'])) {
$item_node = node_load($item['merci_item_nid']);
$item['type'] = $item_node->type;
$item['item_title'] = $item_node->title;
$settings = $item_node;
}
else {
$item['type'] = $item['merci_item_nid'];
$settings = merci_load_item_settings($item['type']);
$item['name'] = $settings->type_name;
if ($settings->merci_auto_assign_bucket_item) {
$date_info = $node->field_merci_date[0];
$start = $date_info['value'];
$end = $date_info['value2'];
$item['merci_item_nid'] = merci_get_suggested_bucket_item($item['type'], $start, $end, $exempt_items);
$exempt_items[] = $item['merci_item_nid'];
$item_node = node_load($item['merci_item_nid']);
$item['item_title'] = $item_node->title;
$settings = $item_node;
}
}
}
else {
break;
}
$title = array_key_exists('item_title', $item) ? $item['item_title'] : $item['name'];
// Build the item's placeholder node.
$reservation = new stdClass();
$reservation->type = $item['type'];
$reservation->name = $node->name;
$reservation->uid = $node->uid;
$reservation->title = "{$title} " . t('(Reservation)');
$reservation->body = '';
$reservation->status = 0;
$reservation->promote = 0;
$reservation->sticky = 0;
// MERCI specific data.
$reservation->merci_default_availability = MERCI_AVA_F;
$reservation->merci_sub_type = MERCI_SUB_TYPE_RESERVATION;
// Use the item specific accounting data if an item is assigned,
// otherwise fall back to the content type defaults.
// TODO move to nodeapi insert and update ops.
//Add to commerical rate
//print '<pre>';
//print_r();
$rate = $settings->merci_rate_per_hour;
$commercial_total = $commercial_total + $hours * $rate;
$reservation->merci_late_fee_per_hour = $settings->merci_late_fee_per_hour;
$reservation->merci_rate_per_hour = $settings->merci_rate_per_hour;
$reservation->merci_fee_free_hours = $settings->merci_fee_free_hours;
$reservation = node_submit($reservation);
node_save($reservation);
$item['merci_placeholder_nid'] = $reservation->nid;
}
// Update the state of all items with associations.
switch ((int) $node->merci_reservation_status) {
case MERCI_STATUS_UNCONFIRMED:
case MERCI_STATUS_PENDING:
$item_status = MERCI_ITEM_STATUS_RESERVED;
break;
case MERCI_STATUS_CHECKED_OUT:
$item_status = MERCI_ITEM_STATUS_CHECKED_OUT;
break;
case MERCI_STATUS_CHECKED_IN:
$item_status = MERCI_ITEM_STATUS_CHECKED_IN;
break;
case MERCI_STATUS_CANCELLED:
$item_status = MERCI_ITEM_STATUS_CANCELED;
break;
case MERCI_STATUS_DENIED:
case MERCI_STATUS_NO_SHOW:
$item_status = MERCI_ITEM_STATUS_AVAILABLE;
break;
}
// If we have an item assigned. Set status to reserved.
$item['merci_item_status'] = $item_status;
if (!empty($node->revision) or is_string($did) or $node->is_new) {
$item['nid'] = $node->nid;
$item['vid'] = $node->vid;
drupal_write_record('merci_reservation_detail', $item);
}
else {
$item['did'] = $did;
drupal_write_record('merci_reservation_detail', $item, 'did');
}
// Update merci_item_status to Checked out or available.
$item_status = $item_status == MERCI_ITEM_STATUS_CHECKED_OUT ? MERCI_ITEM_STATUS_CHECKED_OUT : MERCI_ITEM_STATUS_AVAILABLE;
if (is_numeric($item['merci_item_nid']) and $item['merci_item_nid'] > 0) {
// Only set to available if previously this reservation was checked out.
// Or if this reservation is being set to checked out.
if ($item_status == MERCI_ITEM_STATUS_CHECKED_OUT or $node->merci_original_reservation_status == MERCI_STATUS_CHECKED_OUT and $item_status == MERCI_ITEM_STATUS_AVAILABLE) {
$update = array();
$update['nid'] = $item['merci_item_nid'];
$update['merci_item_status'] = $item_status;
drupal_write_record('merci_reservation_item_node', $update, 'nid');
}
}
}
}
}