You are here

function merci_add_reservation_items in MERCI (Manage Equipment Reservations, Checkout and Inventory) 6.2

Same name and namespace in other branches
  1. 6 merci.module \merci_add_reservation_items()
  2. 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');
        }
      }
    }
  }
}