You are here

simple_package_tracking.module in Simple Package Tracking 6

Same filename and directory in other branches
  1. 7 simple_package_tracking.module

File

simple_package_tracking.module
View source
<?php

/**
 * Implements hook_shipping_menu().
 */
function simple_package_tracking_menu() {
  $items = array();
  $items['admin/store/orders/%uc_order/tracking/%simple_package_tracking_tracking_number/delete'] = array(
    'title' => 'Delete tracking number',
    'page callback' => 'drupal_get_form',
    'page arguments' => array(
      'simple_package_tracking_tracking_number_delete_confirm',
      3,
      5,
    ),
    'access arguments' => array(
      'create content',
    ),
    'type' => MENU_CALLBACK,
  );
  return $items;
}
function simple_package_tracking_form_alter(&$form, &$form_state, $form_id) {
  switch ($form_id) {
    case 'uc_order_view_update_form':
      $order_id = $form['order_id']['#value'];
      $carriers = simple_package_tracking_get_carriers();
      $carriernames = array();
      $carrierurls = array();
      foreach ($carriers as $key => $carrier) {
        $carriernames[$key] = $carrier['name'];
        $carrierurls[$key] = $carrier['url'];
      }
      $carriernames['new'] = t('New carrier...');
      $carrierurls['new'] = T('New');
      $form['add_tracking'] = array(
        '#type' => 'fieldset',
        '#title' => t('Add a tracking number'),
        '#collapsible' => TRUE,
        '#collapsed' => TRUE,
      );
      $form['add_tracking']['tracking_carrier'] = array(
        '#type' => 'select',
        '#title' => t('Carrier'),
        '#options' => $carriernames,
      );
      $form['add_tracking']['carrier_new'] = array(
        '#type' => 'textfield',
        '#title' => t('New carrier name'),
      );
      $form['add_tracking']['tracking_number'] = array(
        '#type' => 'textfield',
        '#title' => t('Tracking number'),
      );
      $form['add_tracking']['carrier_url'] = array(
        '#type' => 'select',
        '#title' => t('Use carrier url'),
        '#options' => $carrierurls,
      );
      $form['add_tracking']['tracking_url'] = array(
        '#type' => 'textfield',
        '#title' => t('Tracking URL'),
        '#size' => 70,
        '#maxlength' => 250,
      );
      $form['store']['carriers'] = array(
        '#type' => 'value',
        '#value' => $carriers,
      );
      $form['#validate'][] = 'simple_package_tracking_add_tracking_validate';
      $form['#submit'][] = 'simple_package_tracking_add_tracking_submit';
      drupal_add_js(array(
        'simple_package_tracking' => array(
          'carriers' => count($carriers) ? $carriers : FALSE,
          'carrierCount' => count($carriers),
          'replacePat' => '@tracking_number',
        ),
      ), 'setting');
      drupal_add_js(drupal_get_path('module', 'simple_package_tracking') . '/js/simple-package-tracking.js');
      drupal_add_css(drupal_get_path('module', 'simple_package_tracking') . '/css/simple-package-tracking.css');
      break;
  }
}
function simple_package_tracking_add_tracking_validate($form, &$form_state) {

  // No tracking number
  if ($form_state['values']['tracking_number'] == '' || $form_state['values']['tracking_number'] === NULL) {
    form_set_error('add_tracking][tracking_number', t('Please enter a tracking number'));
  }
  else {
    $results = db_query("SELECT tracking_number FROM {tracking_numbers} WHERE order_id = %d", $form_state['values']['order_id']);
    $numbers = array();
    while ($record = db_result($results)) {
      $numbers[] = $record;
    }

    // Duplicate tracking number
    if (in_array($form_state['values']['tracking_number'], $numbers)) {
      form_set_error('add_tracking][tracking_number', t('The tracking number you entered has already been entered for this order.'));
    }
  }

  // Trying to select existing carrier and add new carrier simultaneously
  if ($form_state['values']['tracking_carrier'] == 'new' && $form_state['values']['carrier_new'] == '') {
    form_set_error('add_tracking][tracking_carrier', t('You must either select an existing carrier or enter a new carrier'));
  }
}
function simple_package_tracking_add_tracking_submit($form, &$form_state) {
  global $user;
  $comment = '';
  $carriers = $form_state['values']['carriers'];
  $order_id = $form_state['values']['order_id'];
  $number = $form_state['values']['tracking_number'];
  $url = $form_state['values']['tracking_url'];
  if ($form_state['values']['tracking_carrier'] == 'new') {
    $carrier = $form_state['values']['carrier_new'];
    $tnpos = strpos($url, $number);
    $tnlen = drupal_strlen($number);
    $patstart = drupal_substr($url, 0, $tnpos);
    $patend = drupal_substr($url, $tnpos + $tnlen, drupal_strlen($url));
    $pattern = $patstart . '@tracking_number' . $patend;
    simple_package_tracking_save_carrier($carrier, $pattern);
  }
  else {
    $carrier = $carriers[$form_state['values']['tracking_carrier']]['name'];
  }
  $tracking_id = simple_package_tracking_save_tracking($order_id, $number, $url, $carrier);
  if (!is_null($tracking_id)) {
    $comment = t('@carrier tracking number @number added by @name.', array(
      '@carrier' => $carrier,
      '@number' => $number,
      '@name' => $user->name,
    ));
    if ($form_state['values']['notify']) {
      $order = uc_order_load($order_id);
      $tracking = simple_package_tracking_tracking_number_load($tracking_id);
      ca_pull_trigger('simple_package_tracking_add_number', $order, $tracking);
      $comment .= t(' Notifcation sent to user');
    }
    uc_order_comment_save($form_state['values']['order_id'], $user->uid, $comment);
  }
}
function simple_package_tracking_save_tracking($order_id, $number, $url, $carrier, $id = NULL) {
  $url = preg_replace('/\\s+/', '', $url);
  if (!$id) {
    $result = db_query("INSERT INTO {tracking_numbers} (order_id, tracking_number, tracking_url, tracking_carrier) VALUES (%d, '%s', '%s', '%s')", $order_id, $number, $url, $carrier);
    $id = db_last_insert_id('tracking_numbers', 'tracking_id');
    if ($result) {
      drupal_set_message(t('Added tracking number for order @oid', array(
        '@oid' => $order_id,
      )));
    }
  }
  else {
    $result = db_query("UPDATE {tracking_numbers} SET order_id = %d, tracking_number = '%s', tracking_url = '%s', tracking_carrier = '%s' WHERE tracking_id = %d", $order_id, $number, $url, $carrier, $id);
    if ($result) {
      drupal_set_message(t('Updated tracking number for order @oid', array(
        '@oid' => $order_id,
      )));
    }
  }
  return $id;
}
function simple_package_tracking_get_carriers() {
  $carriers = array();
  $result = db_query("SELECT carrier_id, carrier_name, carrier_url_default FROM {tracking_carriers}");
  while ($carrier = db_fetch_array($result)) {
    $carriers[$carrier['carrier_id']] = array(
      'name' => $carrier['carrier_name'],
      'url' => $carrier['carrier_url_default'],
    );
  }
  return $carriers;
}
function simple_package_tracking_save_carrier($name, $pattern, $id = NULL) {
  $pattern = preg_replace('/\\s+/', '', $pattern);
  if (!$id) {
    $result = db_query("INSERT INTO {tracking_carriers} (carrier_name, carrier_url_default) VALUES ('%s', '%s')", $name, $pattern);
    if ($result) {
      drupal_set_message(t('Added new carrier @carrier', array(
        '@carrier' => $name,
      )));
    }
  }
  else {
    $result = db_query("UPDATE {tracking_carriers} SET carrier_name = '%s', carrier_url_default = '%s' WHERE carrier_id = '%d')", $name, $pattern, $id);
    if ($result) {
      drupal_set_message(t('Updated carrier @carrier', array(
        '@carrier' => $name,
      )));
    }
  }
}
function simple_package_tracking_tracking_number_load($tracking_id) {
  $tracking = db_fetch_object(db_query("SELECT * FROM {tracking_numbers} WHERE tracking_id = %d", $tracking_id));
  return $tracking;
}

/**
 * Delete a tracking number.
 */
function simple_package_tracking_tracking_number_delete($tracking_id) {
  db_query("DELETE FROM {tracking_numbers} WHERE tracking_id = %d", $tracking_id);
  drupal_set_message(t('Tracking number has been deleted.'));
}
function simple_package_tracking_tracking_number_delete_confirm($form_state, $order, $tracking) {
  $form = array();
  $form['order_id'] = array(
    '#type' => 'value',
    '#value' => $order->order_id,
  );
  $form['tracking_id'] = array(
    '#type' => 'value',
    '#value' => $tracking->tracking_id,
  );
  $output = confirm_form($form, t('Are you sure you want to delete this tracking number?'), 'admin/store/orders/' . $order->order_id, t('The tracking number will no longer be available to the customer via their account.'), t('Delete'), t('Cancel'));
  return $output;
}
function simple_package_tracking_tracking_number_delete_confirm_submit($form, &$form_state) {
  simple_package_tracking_tracking_number_delete($form_state['values']['tracking_id']);
  $form_state['redirect'] = 'admin/store/orders/' . $form_state['values']['order_id'];
}

/******************************************************************************
 * Ubercart hooks                                                             *
 ******************************************************************************/

/**
 * Implements hook_order_pane().
 */
function simple_package_tracking_order_pane() {
  $panes[] = array(
    'id' => 'tracking_simple',
    'callback' => 'simple_package_tracking_order_pane_tracking_numbers',
    'title' => t('Tracking numbers'),
    'desc' => t('Display tracking numbers of shipped packages.'),
    'class' => 'pos-left',
    'weight' => 7,
    'show' => array(
      'view',
      'invoice',
      'customer',
    ),
  );
  return $panes;
}

/**
 * Shipping order pane callback.
 *
 * @see uc_shipping_order_pane()
 */
function simple_package_tracking_order_pane_tracking_numbers($op, $order) {
  switch ($op) {
    case 'view':
    case 'customer':
      $rows = array();
      $result = db_query("SELECT tracking_id, tracking_number, tracking_carrier, tracking_url FROM {tracking_numbers} WHERE order_id = %d", $order->order_id);
      while ($tracking = db_fetch_object($result)) {
        $row = array();
        $row[] = $tracking->tracking_carrier != NULL ? $tracking->tracking_carrier : t('Other');
        $row[] = l($tracking->tracking_number, $tracking->tracking_url, array(
          'attributes' => array(
            'target' => '_blank',
          ),
        ));
        if (user_access('fulfill orders')) {
          $row[] = l(t('Delete'), 'admin/store/orders/' . $order->order_id . '/tracking/' . $tracking->tracking_id . '/delete');
        }
        $rows[] = $row;
      }
      if (count($rows)) {
        $headers = array();
        $output = theme('table', $header, $rows);
        return $output;
      }
      break;
  }
}

/**
 * Implements hook_token_values(). (token.module)
 */
function simple_package_tracking_token_values($type, $object = NULL) {
  $values = array();
  switch ($type) {
    case 'tracking':
      $tracking = $object;
      $values['tracking-carrier'] = $tracking->tracking_carrier;
      $values['tracking-number'] = $tracking->tracking_number;
      $values['tracking-number-link'] = l($tracking->tracking_number, $tracking->tracking_url);
      break;
  }
  return $values;
}

/**
 * Implements hook_token_list(). (token.module)
 */
function simple_package_tracking_token_list($type = 'all') {
  $tokens = array();
  if ($type == 'tracking') {
    $tokens['tracking']['tracking-carrier'] = t('The carrier associated with a tracking number.');
    $tokens['tracking']['tracking-number'] = t('A tracking number for an order.');
    $tokens['tracking']['tracking-number-link'] = t('The link to track a shipment.');
  }
  return $tokens;
}

/**
 * Implements hook_uc_message().
 */
function simple_package_tracking_uc_message() {
  $messages['simple_package_tracking_tracking_notification_subject'] = t('Shipment for order [order-id] at [store-name]');
  $messages['simple_package_tracking_tracking_notification_message'] = t("Hello,\n\nWe just wanted to let you know that a shipment is on it's way for order [order-link] via [tracking-carrier]. For your convenience, here is the tracking number [tracking-number-link]. You can use this to track your shipment on the [tracking-carrier] website.\n\nAs always, if you have any questions, please give us a call at [store-phone] if you have any questions. Thanks!\n\n-- The [store-name] team");
  return $messages;
}
function simple_package_tracking_ca_entity() {
  $entities['uc_tracking_number'] = array(
    '#title' => t('Ubercart tracking number'),
    '#type' => 'object',
  );
  return $entities;
}

/**
 * Implements hook_ca_predicate().
 */
function uc_roles_ca_predicate() {
  $predicates = array();

  // Notify the user when a role is granted.
  $predicates['simple_package_tracking_add_number'] = array(
    '#title' => t('A tracking number is added'),
    '#description' => t('A tracking number is added.'),
    '#class' => 'notification',
    '#trigger' => 'simple_package_tracking_add_number',
    '#status' => 1,
    '#actions' => array(
      array(
        '#name' => 'simple_package_tracking_tracking_email',
        '#title' => t('Send an e-mail to the customer'),
        '#argument_map' => array(
          'order' => 'order',
          'tracking_number' => 'tracking_number',
        ),
        '#settings' => array(
          'from' => uc_store_email_from(),
          'addresses' => '[order-email]',
          'subject' => uc_get_message('simple_package_tracking_tracking_notification_subject'),
          'message' => uc_get_message('simple_package_tracking_tracking_notification_message'),
          'format' => 1,
        ),
      ),
    ),
  );
  return $predicates;
}
function simple_package_tracking_ca_action() {
  $actions['simple_package_tracking_tracking_email'] = array(
    '#title' => t('Send a tracking number notification to a user.'),
    '#category' => t('Notification'),
    '#callback' => 'simple_package_tracking_action_tracking_email',
    '#arguments' => array(
      'order' => array(
        '#entity' => 'uc_order',
        '#title' => t('Order'),
      ),
      'tracking_number' => array(
        '#entity' => 'uc_tracking_number',
        '#title' => t('Tracking Number'),
      ),
    ),
  );
  return $actions;
}
function simple_package_tracking_ca_trigger() {
  $triggers['simple_package_tracking_add_number'] = array(
    '#title' => t('A tracking number is added'),
    '#category' => t('Fulfillment'),
    '#arguments' => array(
      'order' => array(
        '#entity' => 'uc_order',
        '#title' => t('Order'),
      ),
      'tracking_number' => array(
        '#entity' => 'uc_tracking_number',
        '#title' => t('Tracking Number'),
      ),
    ),
  );
  return $triggers;
}
function simple_package_tracking_action_tracking_email($order, $tracking, $settings) {
  $account = uc_order_user_load($order);

  // Token replacements for the subject and body
  $settings['replacements'] = array(
    'global' => NULL,
    'order' => $order,
    'user' => $account,
    'tracking' => $tracking,
  );
  $recipients = array();
  $addresses = token_replace_multiple($settings['addresses'], $settings['replacements']);
  foreach (explode("\n", $addresses) as $address) {
    $recipients[] = trim($address);
  }

  // Send to each recipient
  foreach ($recipients as $email) {
    $sent = drupal_mail('uc_order', 'action-mail', $email, uc_store_mail_recipient_language($email), $settings, $settings['from']);
    if (!$sent['result']) {
      watchdog('ca', 'Attempt to e-mail @email concerning order @order_id failed.', array(
        '@email' => $email,
        '@order_id' => $order->order_id,
      ), WATCHDOG_ERROR);
    }
  }
}
function simple_package_tracking_action_tracking_email_form($form_state, $settings = array()) {
  return ca_build_email_form($form_state, $settings, array(
    'global',
    'tracking',
    'user',
    'order',
  ));
}