t('Ubercart order object'),
'#type' => 'object',
'#load' => 'uc_order_load',
'#save' => 'uc_order_save',
);
$entities['uc_line_item'] = array(
'#title' => t('Order line item'),
'#type' => 'array',
);
return $entities;
}
/**
* Implementation of hook_ca_trigger().
*/
function uc_order_ca_trigger() {
$triggers['uc_order_status_update'] = array(
'#title' => t('Order status gets updated'),
'#category' => t('Order'),
'#arguments' => array(
'order' => array(
'#entity' => 'uc_order',
'#title' => t('Original order'),
),
'updated_order' => array(
'#entity' => 'uc_order',
'#title' => t('Updated order'),
),
),
);
$triggers['uc_order_status_email_update'] = array(
'#title' => t('E-mail requested for order status update'),
'#category' => t('Order'),
'#arguments' => array(
'order' => array(
'#entity' => 'uc_order',
'#title' => t('Order'),
),
),
);
return $triggers;
}
/**
* Implementation of hook_ca_predicate().
*/
function uc_order_ca_predicate() {
$predicates = array();
$predicates['uc_order_update_email_customer'] = array(
'#title' => t('E-mail an order update notification'),
'#description' => t('Notify the customer when the order status is changed.'),
'#class' => 'notification',
'#status' => 1,
'#trigger' => 'uc_order_status_email_update',
'#conditions' => array(
'#operator' => 'AND',
'#conditions' => array(
array(
'#name' => 'uc_order_status_condition',
'#title' => t('If the order status is not still In Checkout.'),
'#argument_map' => array(
'order' => 'order',
),
'#settings' => array(
'negate' => TRUE,
'order_status' => 'in_checkout',
),
),
),
),
'#actions' => array(
array(
'#name' => 'uc_order_email',
'#title' => t('Send an e-mail to the customer'),
'#argument_map' => array(
'order' => 'order',
),
'#settings' => array(
'from' => uc_store_email_from(),
'addresses' => '[order-email]',
'subject' => t('Order #[order-id] Update'),
'message' => uc_get_message('order_update_email'),
'format' => 1,
),
),
),
);
return $predicates;
}
/**
* Implementation of hook_ca_condition().
*/
function uc_order_ca_condition() {
$order_arg = array(
'#entity' => 'uc_order',
);
$conditions['uc_order_status_condition'] = array(
'#title' => t('Check the order status'),
'#description' => t('Returns TRUE if the current order status matches the status specified below.'),
'#category' => t('Order'),
'#callback' => 'uc_order_condition_check_order_status',
'#arguments' => array(
'order' => $order_arg,
),
);
$conditions['uc_order_condition_total'] = array(
'#title' => t('Check the order total'),
'#description' => t('Returns TRUE if the current order total is within the parameters below.'),
'#category' => t('Order'),
'#callback' => 'uc_order_condition_total',
'#arguments' => array(
'order' => $order_arg,
),
);
$conditions['uc_order_condition_delivery_postal_code'] = array(
'#title' => t("Check an order's shipping postal code"),
'#category' => t('Order: Shipping address'),
'#description' => t('Returns TRUE if the shipping postal code is in the specified area.'),
'#callback' => 'uc_order_condition_delivery_postal_code',
'#arguments' => array(
'order' => $order_arg
),
);
$conditions['uc_order_condition_delivery_zone'] = array(
'#title' => t("Check an order's shipping @zone", array('@zone' => uc_get_field_name('zone'))),
'#category' => t('Order: Shipping address'),
'#description' => t('Returns TRUE if the shipping @zone is in the specified list.', array('@zone' => uc_get_field_name('zone'))),
'#callback' => 'uc_order_condition_delivery_zone',
'#arguments' => array(
'order' => $order_arg,
),
);
$conditions['uc_order_condition_delivery_country'] = array(
'#title' => t("Check an order's shipping country"),
'#category' => t('Order: Shipping address'),
'#description' => t('Returns TRUE if the shipping country is in the specified list.'),
'#callback' => 'uc_order_condition_delivery_country',
'#arguments' => array(
'order' => $order_arg,
),
);
$conditions['uc_order_condition_billing_postal_code'] = array(
'#title' => t("Check an order's billing postal code"),
'#category' => t('Order: Billing address'),
'#description' => t('Returns TRUE if the billing postal code is in the specified area.'),
'#callback' => 'uc_order_condition_billing_postal_code',
'#arguments' => array(
'order' => $order_arg,
),
);
$conditions['uc_order_condition_billing_zone'] = array(
'#title' => t("Check an order's billing @zone", array('@zone' => uc_get_field_name('zone'))),
'#category' => t('Order: Billing address'),
'#description' => t('Returns TRUE if the billing @zone is in the specified list.', array('@zone' => uc_get_field_name('zone'))),
'#callback' => 'uc_order_condition_billing_zone',
'#arguments' => array(
'order' => $order_arg,
),
);
$conditions['uc_order_condition_billing_country'] = array(
'#title' => t("Check an order's billing country"),
'#category' => t('Order: Billing address'),
'#description' => t('Returns TRUE if the billing country is in the specified list.'),
'#callback' => 'uc_order_condition_billing_country',
'#arguments' => array(
'order' => $order_arg,
),
);
$conditions['uc_order_condition_has_products'] = array(
'#title' => t("Check an order's products"),
'#category' => t('Order: Product'),
'#description' => t('Returns TRUE if the order has any, all, or only the products in the list.'),
'#callback' => 'uc_order_condition_has_products',
'#arguments' => array(
'order' => $order_arg,
),
);
$conditions['uc_order_condition_count_products'] = array(
'#title' => t("Check an order's number of products"),
'#category' => t('Order: Product'),
'#description' => t('Determines if the order has the specified number of products, possibly of a certain type.'),
'#callback' => 'uc_order_condition_count_products',
'#arguments' => array(
'order' => $order_arg,
),
);
$conditions['uc_order_condition_products_weight'] = array(
'#title' => t("Check an order's total weight"),
'#category' => t('Order: Product'),
'#description' => t('Determines if the order has the specified weight, possibly counting only a certain type of product.'),
'#callback' => 'uc_order_condition_products_weight',
'#arguments' => array(
'order' => $order_arg,
),
);
$conditions['uc_order_condition_is_shippable'] = array(
'#title' => t('Check if an order can be shipped'),
'#category' => t('Order'),
'#description' => t('Returns TRUE if the order has any shippable products.'),
'#callback' => 'uc_order_condition_is_shippable',
'#arguments' => array(
'order' => $order_arg,
),
);
$conditions['uc_order_condition_user_name'] = array(
'#title' => t('Check the user name.'),
'#category' => t('Order: User'),
'#description' => t('Returns TRUE if the user name matches the condition.'),
'#callback' => 'uc_order_condition_user_name',
'#arguments' => array(
'order' => $order_arg,
),
);
$conditions['uc_order_condition_user_mail'] = array(
'#title' => t('Check the user email address.'),
'#category' => t('Order: User'),
'#description' => t('Returns TRUE if the user email addresses matches the condition.'),
'#callback' => 'uc_order_condition_user_mail',
'#arguments' => array(
'order' => $order_arg,
),
);
$conditions['uc_order_condition_user_created'] = array(
'#title' => t('Check the user creation date.'),
'#category' => t('Order: User'),
'#description' => t('Returns TRUE if the user creation date matches the condition.'),
'#callback' => 'uc_order_condition_user_created',
'#arguments' => array(
'order' => $order_arg,
),
);
$conditions['uc_order_condition_user_login'] = array(
'#title' => t('Check the user last login date.'),
'#category' => t('Order: User'),
'#description' => t('Returns TRUE if the user last login date matches the condition.'),
'#callback' => 'uc_order_condition_user_login',
'#arguments' => array(
'order' => $order_arg,
),
);
$conditions['uc_order_condition_user_language'] = array(
'#title' => t('Check the user language setting.'),
'#category' => t('Order: User'),
'#description' => t('Returns TRUE if the user language setting matches the condition.'),
'#callback' => 'uc_order_condition_user_language',
'#arguments' => array(
'order' => $order_arg,
),
);
$conditions['uc_order_condition_user_roles'] = array(
'#title' => t('Check the role of the user.'),
'#category' => t('Order: User'),
'#description' => t('Returns TRUE if the user roles match your settings.'),
'#callback' => 'uc_order_condition_user_roles',
'#arguments' => array(
'order' => $order_arg,
),
);
return $conditions;
}
/**
* Implementation of hook_ca_action().
*/
function uc_order_ca_action() {
$order_arg = array(
'#entity' => 'uc_order',
'#title' => t('Order'),
);
$actions['uc_order_update_status'] = array(
'#title' => t('Update the order status'),
'#category' => t('Order'),
'#callback' => 'uc_order_action_update_status',
'#arguments' => array(
'order' => $order_arg,
),
);
$actions['uc_order_action_add_comment'] = array(
'#title' => t('Add a comment to the order'),
'#category' => t('Order'),
'#callback' => 'uc_order_action_add_comment',
'#arguments' => array(
'order' => $order_arg,
),
);
$actions['uc_order_email'] = array(
'#title' => t('Send an order email'),
'#category' => t('Order'),
'#callback' => 'uc_order_action_email',
'#arguments' => array(
'order' => $order_arg,
),
);
$actions['uc_order_email_invoice'] = array(
'#title' => t('Email an order invoice'),
'#category' => t('Order'),
'#callback' => 'uc_order_action_email_invoice',
'#arguments' => array(
'order' => $order_arg,
),
);
return $actions;
}
/******************************************************************************
* Condition Callbacks and Forms *
******************************************************************************/
/**
* Check the current order status.
*
* @see uc_order_condition_check_order_status_form()
*/
function uc_order_condition_check_order_status($order, $settings) {
// Return TRUE if the order status matches.
return $order->order_status == $settings['order_status'];
}
/**
* @see uc_order_condition_check_order_status()
*/
function uc_order_condition_check_order_status_form($form_state, $settings = array()) {
foreach (uc_order_status_list('general') as $status) {
$options[$status['id']] = $status['title'];
}
foreach (uc_order_status_list('specific') as $status) {
$options[$status['id']] = $status['title'];
}
$form['order_status'] = array(
'#type' => 'select',
'#title' => t('Order status'),
'#options' => $options,
'#default_value' => $settings['order_status'],
);
return $form;
}
/**
* Check the current order balance.
*
* @see uc_order_condition_total_form()
*/
function uc_order_condition_total($order, $settings) {
$total = uc_order_get_total($order, TRUE);
switch ($settings['order_total_comparison']) {
case 'less':
return $total < $settings['order_total_value'];
case 'less_equal':
return $total <= $settings['order_total_value'];
case 'equal':
return $total == $settings['order_total_value'];
case 'greater_equal':
return $total >= $settings['order_total_value'];
case 'greater':
return $total > $settings['order_total_value'];
}
}
/**
* @see uc_order_condition_total()
*/
function uc_order_condition_total_form($form_state, $settings = array()) {
$form['order_total_value'] = array(
'#type' => 'textfield',
'#title' => t('Order total value'),
'#description' => t('Specify a value to compare the order total against.'),
'#default_value' => $settings['order_total_value'],
'#size' => 16,
'#field_prefix' => variable_get('uc_sign_after_amount', FALSE) ? '' : variable_get('uc_currency_sign', '$'),
'#field_suffix' => variable_get('uc_sign_after_amount', FALSE) ? variable_get('uc_currency_sign', '$') : '',
);
$options = array(
'less' => t('Total is less than specified value.'),
'less_equal' => t('Total is less than or equal to specified value.'),
'equal' => t('Total is equal to specified value.'),
'greater_equal' => t('Total is greater than or equal to specified value.'),
'greater' => t('Total is greater than specified value.'),
);
$form['order_total_comparison'] = array(
'#type' => 'radios',
'#title' => t('Order total comparison type'),
'#options' => $options,
'#default_value' => isset($settings['order_total_comparison']) ? $settings['order_total_comparison'] : 'greater_equal',
);
return $form;
}
/**
* Check an order's delivery postal code.
*
* @see uc_order_condition_delivery_postal_code_form()
*/
function uc_order_condition_delivery_postal_code($order, $settings) {
// Trim the wildcard off the pattern.
$pattern = rtrim($settings['pattern'], '*');
// Return TRUE if the delivery postal code begins with the pattern.
return strpos($order->delivery_postal_code, $pattern) === 0;
}
/**
* @see uc_order_condition_delivery_postal_code()
*/
function uc_order_condition_delivery_postal_code_form($form_state, $settings = array()) {
$form['pattern'] = array(
'#type' => 'textfield',
'#title' => uc_get_field_name('postal_code'),
'#default_value' => $settings['pattern'],
'#description' => t('Specify a postal code or postal code pattern. Use "*" as a wild card to specify a range of postal codes.
Example: In the US, 402* represents all areas from 40200 to 40299.'),
'#size' => 15,
// '#required' => TRUE,
);
return $form;
}
/**
* Check an order's delivery zone.
*
* @see uc_order_condition_delivery_zone_form()
*/
function uc_order_condition_delivery_zone($order, $settings) {
return in_array($order->delivery_zone, $settings['zones']);
}
/**
* @see uc_order_condition_delivery_zone_form()
*/
function uc_order_condition_delivery_zone_form($form_state, $settings = array()) {
$result = db_query("SELECT z.*, c.country_name FROM {uc_zones} AS z LEFT JOIN {uc_countries} AS c ON z.zone_country_id = c.country_id ORDER BY c.country_name, z.zone_name");
while ($zone = db_fetch_object($result)) {
$options[$zone->country_name][$zone->zone_id] = $zone->zone_name;
}
$form['zones'] = array(
'#type' => 'select',
'#title' => uc_get_field_name('zone'),
'#options' => $options,
'#default_value' => $settings['zones'],
'#multiple' => TRUE,
// '#required' => TRUE,
);
return $form;
}
/**
* Check an order's delivery country.
*
* @see uc_order_condition_delivery_country_form()
*/
function uc_order_condition_delivery_country($order, $settings) {
return in_array($order->delivery_country, $settings['countries']);
}
/**
* @see uc_order_condition_delivery_country()
*/
function uc_order_condition_delivery_country_form($form_state, $settings = array()) {
$form['countries'] = uc_country_select(uc_get_field_name('country'));
$form['countries']['#default_value'] = $settings['countries'];
$form['countries']['#multiple'] = TRUE;
// $form['countries']['#required'] = TRUE;
return $form;
}
/**
* Check an order's billing postal code.
*
* @see uc_order_condition_billing_postal_code_form()
*/
function uc_order_condition_billing_postal_code($order, $settings) {
// Trim the wildcard off the pattern.
$pattern = rtrim($settings['pattern'], '*');
// Return TRUE if the delivery postal code begins with the pattern.
return strpos($order->billing_postal_code, $pattern) === 0;
}
/**
* @see uc_order_condition_billing_postal_code()
*/
function uc_order_condition_billing_postal_code_form($form_state, $settings = array()) {
$form['pattern'] = array(
'#type' => 'textfield',
'#title' => uc_get_field_name('postal_code'),
'#default_value' => $settings['pattern'],
'#description' => t('Specify a postal code or postal code pattern. Use "*" as a wild card to specify a range of postal codes.
Example: In the US, 402* represents all areas from 40200 to 40299.'),
'#size' => 15,
// '#required' => TRUE,
);
return $form;
}
/**
* Check an order's billing zone.
*
* @see uc_order_condition_billing_zone_form()
*/
function uc_order_condition_billing_zone($order, $settings) {
return in_array($order->billing_zone, $settings['zones']);
}
/**
* @see uc_order_condition_billing_zone()
*/
function uc_order_condition_billing_zone_form($form_state, $settings = array()) {
$result = db_query("SELECT z.*, c.country_name FROM {uc_zones} AS z LEFT JOIN {uc_countries} AS c ON z.zone_country_id = c.country_id ORDER BY c.country_name, z.zone_name");
while ($zone = db_fetch_object($result)) {
$options[$zone->country_name][$zone->zone_id] = $zone->zone_name;
}
$form['zones'] = array(
'#type' => 'select',
'#title' => uc_get_field_name('zone'),
'#options' => $options,
'#default_value' => $settings['zones'],
'#multiple' => TRUE,
// '#required' => TRUE,
);
return $form;
}
/**
* Check an order's billing country.
*
* @see uc_order_condition_billing_country_form()
*/
function uc_order_condition_billing_country($order, $settings) {
return in_array($order->billing_country, $settings['countries']);
}
/**
* @see uc_order_condition_billing_country()
*/
function uc_order_condition_billing_country_form($form_state, $settings = array()) {
$form['countries'] = uc_country_select(uc_get_field_name('country'));
$form['countries']['#default_value'] = $settings['countries'];
$form['countries']['#multiple'] = TRUE;
// $form['countries']['#required'] = TRUE;
return $form;
}
/**
* Check that the order has the selected combination of products.
*
* @see uc_order_condition_has_products_form()
*/
function uc_order_condition_has_products($order, $settings) {
$products = array();
foreach ($order->products as $product) {
$products[] = $product->model;
}
$required = array_intersect($settings['products'], $products);
if ($settings['required']) {
$required_check = $required == $settings['products'];
}
else {
$required_check = (bool)count($required);
}
if ($settings['forbidden']) {
$forbidden = array_diff($products, $settings['products']);
$forbidden_check = (bool)count($forbidden);
}
else {
$forbidden_check = FALSE;
}
return $required_check && !$forbidden_check;
}
/**
* @see uc_order_condition_has_products()
*/
function uc_order_condition_has_products_form($form_state, $settings) {
$form['required'] = array('#type' => 'radios',
'#title' => t('Require selected products'),
'#options' => array(
0 => t('Order has any of these products.'),
1 => t('Order has all of these products.'),
),
'#default_value' => isset($settings['required']) ? $settings['required'] : 0,
);
$form['forbidden'] = array('#type' => 'radios',
'#title' => t('Forbid other products'),
'#options' => array(
0 => t('Order may have other products.'),
1 => t('Order has only these products.'),
),
'#default_value' => isset($settings['forbidden']) ? $settings['forbidden'] : 0,
);
$options = array();
$result = db_query("SELECT nid FROM {uc_products}");
while ($product = db_fetch_object($result)) {
$options += uc_product_get_models(node_load($product->nid), FALSE);
}
$form['products'] = array('#type' => 'select',
'#title' => t('Product models'),
'#options' => $options,
'#default_value' => $settings['products'],
'#multiple' => TRUE,
);
return $form;
}
/**
* Check that the order has the selected number of products.
*
* @see uc_order_condition_count_products_form()
*/
function uc_order_condition_count_products($order, $settings) {
$totals = array('all' => 0);
$total = 0;
foreach ($order->products as $product) {
$totals['all'] += $product->qty;
$totals[$product->nid] += $product->qty;
}
if (in_array('all', $settings['products'])) {
$total = $totals['all'];
}
else {
foreach ($settings['products'] as $product) {
$total += $totals[$product];
}
}
switch ($settings['product_count_comparison']) {
case 'less':
return $total < $settings['product_count_value'];
case 'less_equal':
return $total <= $settings['product_count_value'];
case 'equal':
return $total == $settings['product_count_value'];
case 'greater_equal':
return $total >= $settings['product_count_value'];
case 'greater':
return $total > $settings['product_count_value'];
}
}
/**
* @see uc_order_condition_count_products()
*/
function uc_order_condition_count_products_form($form_state, $settings = array()) {
$options = array('all' => t('- All products -'));
$result = db_query("SELECT nid, model FROM {uc_products} ORDER BY model");
while ($product = db_fetch_object($result)) {
$options[$product->nid] = $product->model;
}
$form['products'] = array('#type' => 'select',
'#title' => t('Products'),
'#options' => $options,
'#default_value' => $settings['products'],
'#description' => check_plain(t('Selecting "- All products -" will override any other selections and returns the total number of products in the order.')),
'#multiple' => TRUE,
);
$form['product_count_value'] = array(
'#type' => 'textfield',
'#title' => t('Product count value'),
'#description' => t('Specify a value to compare the product count against.'),
'#default_value' => $settings['product_count_value'],
'#size' => 16,
);
$options = array(
'less' => t('Total is less than specified value.'),
'less_equal' => t('Total is less than or equal to specified value.'),
'equal' => t('Total is equal to specified value.'),
'greater_equal' => t('Total is greater than or equal to specified value.'),
'greater' => t('Total is greater than specified value.'),
);
$form['product_count_comparison'] = array(
'#type' => 'radios',
'#title' => t('Product count comparison type'),
'#options' => $options,
'#default_value' => isset($settings['product_count_comparison']) ? $settings['product_count_comparison'] : 'greater_equal',
);
return $form;
}
/**
* Checkt the weight of the order's products.
*
* @see uc_order_condition_products_weight_form()
*/
function uc_order_condition_products_weight($order, $settings) {
$totals = array('all' => 0);
$total = 0;
foreach ($order->products as $product) {
$unit_conversion = uc_weight_conversion($product->weight_units, $settings['weight_units']);
$totals['all'] += $product->qty * $product->weight * $unit_conversion;
$totals[$product->model] = $product->qty * $product->weight * $unit_conversion;
}
if (in_array('all', $settings['products'])) {
$total = $totals['all'];
}
else {
foreach ($settings['products'] as $product) {
$total += $totals[$product];
}
}
switch ($settings['product_weight_comparison']) {
case 'less':
return $total < $settings['product_weight_value'];
case 'less_equal':
return $total <= $settings['product_weight_value'];
case 'equal':
return $total == $settings['product_weight_value'];
case 'greater_equal':
return $total >= $settings['product_weight_value'];
case 'greater':
return $total > $settings['product_weight_value'];
}
}
/**
* @see uc_order_condition_products_weight()
*/
function uc_order_condition_products_weight_form($form_state, $settings = array()) {
$options = array('all' => t('- All products -'));
$result = db_query("SELECT nid, model FROM {uc_products}");
while ($product = db_fetch_object($result)) {
$options[$product->nid] = $product->model;
}
$form['products'] = array('#type' => 'select',
'#title' => t('Products'),
'#options' => $options,
'#default_value' => $settings['products'],
'#description' => check_plain(t('Selecting "- All products -" will override any other selections and returns the total number of products in the order.')),
'#multiple' => TRUE,
);
$form['weight_units'] = array('#type' => 'select',
'#title' => t('Unit of measurement'),
'#default_value' => $settings['weight_units'] ? $settings['weight_units'] : variable_get('uc_weight_unit', 'lb'),
'#options' => array(
'lb' => t('Pounds'),
'kg' => t('Kilograms'),
'oz' => t('Ounces'),
'g' => t('Grams'),
),
);
$form['product_weight_value'] = array(
'#type' => 'textfield',
'#title' => t('Product weight value'),
'#description' => t('Specify a value to compare the product weight against.'),
'#default_value' => $settings['product_weight_value'],
'#size' => 16,
);
$options = array(
'less' => t('Total is less than specified value.'),
'less_equal' => t('Total is less than or equal to specified value.'),
'equal' => t('Total is equal to specified value.'),
'greater_equal' => t('Total is greater than or equal to specified value.'),
'greater' => t('Total is greater than specified value.'),
);
$form['product_weight_comparison'] = array(
'#type' => 'radios',
'#title' => t('Product count comparison type'),
'#options' => $options,
'#default_value' => isset($settings['product_weight_comparison']) ? $settings['product_weight_comparison'] : 'greater_equal',
);
return $form;
}
/**
* Check that the order is shippable.
*/
function uc_order_condition_is_shippable($order, $settings) {
return uc_order_is_shippable($order);
}
/**
* Check a user name.
*
* @see uc_order_condition_user_name()
*/
function uc_order_condition_user_name($order, $settings) {
if (empty($order->uid)) {
// Anonymous users have no names.
return empty($settings['name']);
}
else {
// Load from the order.
if ($account = uc_order_user_load($order)) {
return $account->name == $settings['name'];
}
// Or, if the user doesn't exist anymore, return FALSE
else {
return FALSE;
}
}
}
/**
* @see uc_order_condition_user_name()
*/
function uc_order_condition_user_name_form($form_state, $settings = array()) {
$form['name'] = array(
'#type' => 'textfield',
'#title' => t('User name'),
'#default_value' => isset($settings['name']) ? $settings['name'] : '',
'#autocomplete_path' => 'user/autocomplete',
'#description' => t('Leave blank for %anonymous.', array('%anonymous' => variable_get('anonymous', t('Anonymous')))),
);
return $form;
}
/**
* Check an user email.
*
* @see uc_order_condition_user_email_form()
*/
function uc_order_condition_user_mail($order, $settings) {
$account = uc_order_user_load($order);
return $account->mail == $settings['mail'];
}
/**
* @see uc_order_condition_user_mail()
*/
function uc_order_condition_user_mail_form($form_state, $settings = array()) {
$form['mail'] = array(
'#type' => 'textfield',
'#title' => t('User email'),
'#default_value' => isset($settings['mail']) ? $settings['mail'] : '',
);
return $form;
}
/**
* Check an user creation date.
*
* @see uc_order_condition_user_created_form()
*/
function uc_order_condition_user_created($order, $settings) {
$account = uc_order_user_load($order);
// Get the beginning of the day the user registered.
$user_created = $account->created - ($account->created % 86400);
$settings_created = gmmktime(0, 0, 0, $settings['created']['month'], $settings['created']['day'], $settings['created']['year']);
switch ($settings['operator']) {
case 'less':
return $user_created < $settings_created;
case 'less_equal':
return $user_created <= $settings_created;
case 'equal':
return $user_created == $settings_created;
case 'not_equal':
return $user_created != $settings_created;
case 'greater_equal':
return $user_created >= $settings_created;
case 'greater':
return $user_created > $settings_created;
}
}
/**
* @see uc_order_condition_user_created()
*/
function uc_order_condition_user_created_form($form_state, $settings = array()) {
$form['operator'] = array(
'#type' => 'radios',
'#title' => t('Operator'),
'#options' => array(
'less' => t('User was created before the specified date.'),
'less_equal' => t('User was created on or before the specified date.'),
'equal' => t('User was created on the specified date.'),
'not_equal' => t('User was not created on the specified date.'),
'greater_equal' => t('User was created on or after the specified date.'),
'greater' => t('User was created after the specified date.'),
),
'#default_value' => isset($settings['operator']) ? $settings['operator'] : 'equal',
);
$form['created'] = array(
'#type' => 'date',
'#title' => t('User creation date'),
'#default_value' => isset($settings['created']) ? $settings['created'] : '',
);
return $form;
}
/**
* Check an user last login date.
*
* @see uc_order_condition_user_login_form()
*/
function uc_order_condition_user_login($order, $settings) {
$account = uc_order_user_load($order);
// Get the beginning of the day the user last logged in.
$user_login = $account->login - ($account->login % 86400);
$settings_login = gmmktime(0, 0, 0, $settings['login']['month'], $settings['login']['day'], $settings['login']['year']);
switch ($settings['operator']) {
case 'less':
return $user_login < $settings_login;
case 'less_equal':
return $user_login <= $settings_login;
case 'equal':
return $user_login == $settings_login;
case 'not_equal':
return $user_login != $settings_login;
case 'greater_equal':
return $user_login >= $settings_login;
case 'greater':
return $user_login > $settings_login;
}
}
/**
* @see uc_order_condition_user_login()
*/
function uc_order_condition_user_login_form($form_state, $settings = array()) {
$form['operator'] = array(
'#type' => 'radios',
'#title' => t('Operator'),
'#options' => array(
'less' => t('User last logged in before the specified date.'),
'less_equal' => t('User last logged in on, or before the specified date.'),
'equal' => t('User last logged in on the specified date.'),
'not_equal' => t('User did not log in last on the specified date.'),
'greater_equal' => t('User last logged in on or after the specified date.'),
'greater' => t('User last logged after the specified date.'),
),
'#default_value' => isset($settings['operator']) ? $settings['operator'] : 'equal',
);
$form['login'] = array(
'#type' => 'date',
'#title' => t('User last login date'),
'#default_value' => isset($settings['created']) ? $settings['created'] : '',
);
return $form;
}
/**
* Check an user language setting.
*
* @see uc_order_condition_user_language_form()
*/
function uc_order_condition_user_language($order, $settings) {
$account = uc_order_user_load($order);
$user_prefered_language = user_preferred_language($account);
return $user_prefered_language->language == $settings['language'];
}
/**
* @see uc_order_condition_user_language()
*/
function uc_order_condition_user_language_form($form_state, $settings = array()) {
$languages = language_list();
$options = array();
foreach ($languages as $language) {
$options[$language->language] = $language->name.' ('.$language->native.')';
}
$form['language'] = array(
'#type' => 'select',
'#title' => t('User language setting'),
'#options' => $options,
'#default_value' => isset($settings['language']) ? $settings['language'] : '',
);
return $form;
}
/**
* Check an user roles.
*
* @see uc_order_condition_user_roles_form()
*/
function uc_order_condition_user_roles($order, $settings) {
$account = uc_order_user_load($order);
$settings['roles'] = array_filter($settings['roles']);
if ($settings['operator'] == 'AND') {
foreach ($settings['roles'] as $key) {
if (!isset($account->roles[$key])) {
return FALSE;
}
}
return TRUE;
}
else {
foreach ($settings['roles'] as $key) {
if (isset($account->roles[$key])) {
return TRUE;
}
}
return FALSE;
}
}
/**
* @see uc_order_condition_user_roles()
*/
function uc_order_condition_user_roles_form($form_state, $settings = array()) {
$form['operator'] = array(
'#type' => 'radios',
'#title' => t('Operator'),
'#description' => t('If you use an AND case and want to check a custom role, make sure authenticated user is checked too or the condition will return FALSE.'),
'#options' => array(
'AND' => t('AND: If the user has all of these roles.'),
'OR' => t('OR: If the user has any of these roles.'),
),
'#default_value' => isset($settings['operator']) ? $settings['operator'] : 'AND',
);
$form['roles'] = array(
'#type' => 'checkboxes',
'#title' => t('Roles'),
'#options' => user_roles(),
'#default_value' => isset($settings['roles']) ? $settings['roles'] : array(),
);
return $form;
}
/******************************************************************************
* Action Callbacks and Forms *
******************************************************************************/
/**
* Update an order's status.
*
* @see uc_order_action_update_status_form()
*/
function uc_order_action_update_status(&$order, $settings) {
if (uc_order_update_status($order->order_id, $settings['order_status'])) {
$order->order_status = $settings['order_status'];
}
}
/**
* @see uc_order_action_update_status()
*/
function uc_order_action_update_status_form($form_state, $settings = array()) {
foreach (uc_order_status_list('general') as $status) {
$options[$status['id']] = $status['title'];
}
foreach (uc_order_status_list('specific') as $status) {
$options[$status['id']] = $status['title'];
}
$form['order_status'] = array(
'#type' => 'select',
'#title' => t('Order status'),
'#options' => $options,
'#default_value' => $settings['order_status'],
);
return $form;
}
/**
* Add a comment to an order.
*
* @see uc_order_action_add_comment_form()
*/
function uc_order_action_add_comment($order, $settings) {
uc_order_comment_save($order->order_id, 0,
token_replace_multiple($settings['comment'], array('global' => NULL, 'order' => $order)),
$settings['comment_type'] == 'admin' ? 'admin' : 'order',
$order->order_status, $settings['comment_type'] == 'notified');
}
/**
* @see uc_order_action_add_comment()
*/
function uc_order_action_add_comment_form($form_state, $settings = array()) {
$form['comment_type'] = array(
'#type' => 'radios',
'#title' => t('Select an order comment type'),
'#options' => array(
'admin' => t('Enter this as an admin comment.'),
'order' => t('Enter this as a customer order comment.'),
'notified' => t('Enter this as a customer order comment with a notified icon.'),
),
'#default_value' => $settings['comment_type'],
);
$form['comment'] = array(
'#type' => 'textarea',
'#title' => t('Comment'),
'#description' => t('Enter the comment message. Uses order and global tokens.', array('!url' => url('admin/store/help/tokens'))),
'#default_value' => $settings['comment'],
);
return $form;
}
/**
* Send an email concerning an order.
*
* The recipients, subject, and message fields take order token replacements.
*
* @see uc_order_action_email_form()
*/
function uc_order_action_email($order, $settings) {
$account = uc_order_user_load($order);
// Token replacements for the subject and body
$settings['replacements'] = array(
'global' => NULL,
'order' => $order,
'user' => $account,
);
// Apply token replacements to from and recipient e-mail addressses.
$from = token_replace_multiple($settings['from'], $settings['replacements']);
$addresses = token_replace_multiple($settings['addresses'], $settings['replacements']);
// Split up our recipient e-mail addresses.
$recipients = array();
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, empty($settings['from']) ? uc_store_email_from() : $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);
}
}
}
/**
* @see uc_order_action_email()
*/
function uc_order_action_email_form($form_state, $settings = array()) {
$form['from'] = array(
'#type' => 'textfield',
'#title' => t('Sender'),
'#default_value' => isset($settings['from']) ? $settings['from'] : uc_store_email_from(),
'#description' => t('The "From" address.'),
'#required' => TRUE,
);
$form['addresses'] = array(
'#type' => 'textarea',
'#title' => t('Recipients'),
'#default_value' => isset($settings['addresses']) ? $settings['addresses'] : '[order-email]',
'#description' => t('Enter the email addresses to receive the notifications, one on each line. You may use order tokens for dynamic email addresses.'),
'#required' => TRUE,
);
$form['subject'] = array(
'#type' => 'textfield',
'#title' => t('Subject'),
'#default_value' => $settings['subject'],
'#required' => TRUE,
);
$form['message'] = array(
'#type' => 'textarea',
'#title' => t('Message'),
'#default_value' => $settings['message'],
);
// We add the #is_format element to allow us to locate and configure the filters.
$form['format'] = filter_form($settings['format']) + array('#is_format' => TRUE);
$form['token_help'] = array(
'#type' => 'fieldset',
'#title' => t('Replacement patterns'),
'#description' => t('You can make use of the replacement patterns in the e-mail from and recipients fields, the subject, and the message body.'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
);
foreach (array('global', 'order') as $name) {
$form['token_help'][$name] = array(
'#type' => 'fieldset',
'#title' => t('@name replacement patterns', array('@name' => drupal_ucfirst($name))),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
);
$form['token_help'][$name]['content'] = array(
'#value' => theme('token_help', $name),
);
}
return $form;
}
/**
* Email an invoice.
*
* The subject and addresses fields take order token replacements.
*
* @see uc_order_action_email_invoice_form()
*/
function uc_order_action_email_invoice($order, $settings) {
// Token replacements for the subject and body
$settings['replacements'] = array(
'global' => NULL,
'order' => $order,
);
$recipients = array();
$addresses = token_replace_multiple($settings['addresses'], $settings['replacements']);
foreach (explode("\n", $addresses) as $address) {
$recipients[] = trim($address);
}
$settings['message'] = theme('uc_order', $order, $settings['view'], $settings['template']);
if (empty($recipients)) {
watchdog('ca', 'Attempted to e-mail an invoice with no recipient.', array(), WATCHDOG_ERROR);
return;
}
foreach ($recipients as $email) {
$sent = drupal_mail('uc_order', 'action-mail', $email, uc_store_mail_recipient_language($email), $settings, empty($settings['from']) ? uc_store_email_from() : $settings['from']);
if (!$sent['result']) {
watchdog('ca', 'Attempt to e-mail invoice for order @order_id to @email failed.', array('@email' => $email, '@order_id' => $order->order_id), WATCHDOG_ERROR);
}
}
}
/**
* @see uc_order_action_email_invoice()
*/
function uc_order_action_email_invoice_form($form_state, $settings = array()) {
$form['from'] = array(
'#type' => 'textfield',
'#title' => t('Sender'),
'#default_value' => isset($settings['from']) ? $settings['from'] : uc_store_email_from(),
'#description' => t('The "From" address.'),
'#required' => TRUE,
);
$form['addresses'] = array(
'#type' => 'textarea',
'#title' => t('Recipients'),
'#default_value' => isset($settings['addresses']) ? $settings['addresses'] : '[order-email]',
'#description' => t('Enter the email addresses to receive the notifications, one on each line. You may use order tokens for dynamic email addresses.'),
'#required' => TRUE,
);
$form['subject'] = array(
'#type' => 'textfield',
'#title' => t('Subject'),
'#default_value' => $settings['subject'],
'#required' => TRUE,
);
$form['token_help'] = array(
'#type' => 'fieldset',
'#title' => t('Replacement patterns'),
'#description' => t('You can make use of the replacement patterns in the recipients, the subject, and the template file.'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
);
foreach (array('global', 'order') as $name) {
$form['token_help'][$name] = array(
'#type' => 'fieldset',
'#title' => t('@name replacement patterns', array('@name' => drupal_ucfirst($name))),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
);
$form['token_help'][$name]['content'] = array(
'#value' => theme('token_help', $name),
);
}
$form['template'] = array(
'#type' => 'select',
'#title' => t('Invoice template'),
'#description' => t('Select the invoice template to use for this email.'),
'#options' => uc_order_template_options(),
'#default_value' => $settings['template'],
);
$form['view'] = array(
'#type' => 'radios',
'#title' => t('Included information'),
'#options' => array(
'print' => t('Show the business header and shipping method.'),
'admin-mail' => t('Show all of the above plus the help text, email text, and store footer.'),
'checkout-mail' => t('Show all of the above plus the "thank you" message.'),
),
'#default_value' => $settings['view'],
);
return $form;
}