View source
<?php
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) {
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;
}
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.'));
}
}
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;
}
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'];
}
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;
}
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;
}
}
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;
}
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;
}
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;
}
function uc_roles_ca_predicate() {
$predicates = array();
$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);
$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);
}
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',
));
}