'uc_order_save', ); return $entities; } // Tell Workflow about the various order events. function uc_order_event_info() { $events['order_status_update'] = array( '#label' => t('Order status gets updated'), '#module' => t('Order'), '#arguments' => array( 'order' => array('#entity' => 'order', '#label' => t('Order')), 'updated_order' => array('#entity' => 'order', '#label' => t('Updated order')), ), ); return $events; } // Tell Workflow about the various order conditions. function uc_order_condition_info() { $order_arg = array('#entity' => 'order', '#label' => t('Order')); $conditions['uc_order_condition_order_status'] = array( '#label' => t('Check the order status'), '#arguments' => array('order' => $order_arg), '#module' => t('Order'), ); $conditions['uc_order_condition_order_total'] = array( '#label' => t('Check the order total'), '#arguments' => array('order' => $order_arg), '#module' => t('Order'), ); $conditions['uc_order_condition_delivery_postal_code'] = array( '#label' => t("Check an order's shipping postal code"), '#arguments' => array('order' => $order_arg), '#description' => t('Returns TRUE if the shipping postal code is in the specified area.'), '#module' => t('Order: Shipping address'), ); $conditions['uc_order_condition_delivery_zone'] = array( '#label' => t("Check an order's shipping @zone", array('@zone' => uc_get_field_name('zone'))), '#arguments' => array('order' => $order_arg), '#description' => t('Returns TRUE if the shipping @zone is in the specified list.', array('@zone' => uc_get_field_name('zone'))), '#module' => t('Order: Shipping address'), ); $conditions['uc_order_condition_delivery_country'] = array( '#label' => t("Check an order's shipping country"), '#arguments' => array('order' => $order_arg), '#description' => t('Returns TRUE if the shipping country is in the specified list.'), '#module' => t('Order: Shipping address'), ); $conditions['uc_order_condition_billing_postal_code'] = array( '#label' => t("Check an order's billing postal code"), '#arguments' => array('order' => $order_arg), '#description' => t('Returns TRUE if the billing postal code is in the specified area.'), '#module' => t('Order: Billing address'), ); $conditions['uc_order_condition_billing_zone'] = array( '#label' => t("Check an order's billing @zone", array('@zone' => uc_get_field_name('zone'))), '#arguments' => array('order' => $order_arg), '#description' => t('Returns TRUE if the billing @zone is in the specified list.', array('@zone' => uc_get_field_name('zone'))), '#module' => t('Order: Billing address'), ); $conditions['uc_order_condition_billing_country'] = array( '#label' => t("Check an order's billing country"), '#arguments' => array('order' => $order_arg), '#description' => t('Returns TRUE if the billing country is in the specified list.'), '#module' => t('Order: Billing address'), ); $conditions['uc_order_condition_has_products'] = array( '#label' => t("Check an order's products"), '#arguments' => array('order' => $order_arg), '#description' => t('Returns TRUE if the order has any, all, or only the products in the list.'), '#module' => t('Order: Product'), ); $conditions['uc_order_condition_count_products'] = array( '#label' => t("Check an order's number of products"), '#arguments' => array('order' => $order_arg), '#description' => t('Determines if the order has the specified number of products, possibly of a certain type.'), '#module' => t('Order: Product'), ); $conditions['uc_order_condition_products_weight'] = array( '#label' => t("Check an order's total weight"), '#arguments' => array('order' => $order_arg), '#description' => t('Determines if the order has the specified weight, possibly counting only a certain type of product.'), '#module' => t('Order: Product'), ); $conditions['uc_order_condition_is_shippable'] = array( '#label' => t('Check if an order can be shipped'), '#arguments' => array('order' => $order_arg), '#description' => t('Returns TRUE if the order has any shippable products.'), '#module' => t('Order'), ); return $conditions; } // Tell Workflow about the various order actions. function uc_order_action_info() { $order_arg = array('#entity' => 'order', '#label' => t('Order')); $actions['uc_order_action_update_status'] = array( '#label' => t('Update the order status'), '#arguments' => array('order' => $order_arg), '#module' => t('Order'), ); $actions['uc_order_action_add_comment'] = array( '#label' => t('Add a comment to the order'), '#arguments' => array('order' => $order_arg), '#module' => t('Order'), ); return $actions; } /****************************************************************************** * Workflow-ng Condition Callbacks and Forms * ******************************************************************************/ // Check the current order status. function uc_order_condition_order_status($order, $settings) { // Return TRUE if the order status matches. return $order->order_status == $settings['order_status']; } function uc_order_condition_order_status_form($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; } function uc_order_condition_order_status_submit($form_id, $form_values) { return array('order_status' => $form_values['order_status']); } // Check the current order balance. function uc_order_condition_order_total($order, $settings) { switch ($settings['order_total_comparison']) { case 'less': return $order->order_total < $settings['order_total_value']; case 'less_equal': return $order->order_total <= $settings['order_total_value']; case 'equal': return $order->order_total == $settings['order_total_value']; case 'greater_equal': return $order->order_total >= $settings['order_total_value']; case 'greater': return $order->order_total > $settings['order_total_value']; } } function uc_order_condition_order_total_form($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; } function uc_order_condition_order_total_submit($form_id, $form_values) { $array = array( 'order_total_comparison' => $form_values['order_total_comparison'], 'order_total_value' => $form_values['order_total_value'], ); return $array; } // Check an order's delivery postal code. 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; } function uc_order_condition_delivery_postal_code_form($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; } function uc_order_condition_delivery_postal_code_submit($form_id, $form_values) { return array('pattern' => $form_values['pattern']); } // Check an order's delivery zone. function uc_order_condition_delivery_zone($order, $settings) { return in_array($order->delivery_zone, $settings['zones']); } function uc_order_condition_delivery_zone_form($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; } function uc_order_condition_delivery_zone_submit($form_id, $form_values) { return array('zones' => $form_values['zones']); } // Check an order's delivery country. function uc_order_condition_delivery_country($order, $settings) { return in_array($order->delivery_country, $settings['countries']); } function uc_order_condition_delivery_country_form($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; } function uc_order_condition_delivery_country_submit($form_id, $form_values) { return array('countries' => $form_values['countries']); } // Check an order's billing postal code. 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; } function uc_order_condition_billing_postal_code_form($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; } function uc_order_condition_billing_postal_code_submit($form_id, $form_values) { return array('pattern' => $form_values['pattern']); } // Check an order's billing zone. function uc_order_condition_billing_zone($order, $settings) { return in_array($order->billing_zone, $settings['zones']); } function uc_order_condition_billing_zone_form($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; } function uc_order_condition_billing_zone_submit($form_id, $form_values) { return array('zones' => $form_values['zones']); } // Check an order's billing country. function uc_order_condition_billing_country($order, $settings) { return in_array($order->billing_country, $settings['countries']); } function uc_order_condition_billing_country_form($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; } function uc_order_condition_billing_country_submit($form_id, $form_values) { return array('countries' => $form_values['countries']); } function uc_order_condition_has_products($order, $settings) { $products = array(); foreach ($order->products as $product) { $products[] = $product->nid; } $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; } function uc_order_condition_has_products_form($settings = array('required' => 0, 'forbidden' => 0)) { $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' => $settings['required'], ); $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' => $settings['forbidden'], ); $options = array(); $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'], '#multiple' => true, ); return $form; } function uc_order_condition_has_products_submit($form_id, $form_values) { return array( 'required' => $form_values['required'], 'forbidden' => $form_values['forbidden'], 'products' => $form_values['products'], ); } 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']; } } function uc_order_condition_count_products_form($settings = array()) { $options = array('all' => t('')); $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 "" 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; } function uc_order_condition_count_products_submit($form_id, $form_values) { return array( 'products' => $form_values['products'], 'product_count_value' => $form_values['product_count_value'], 'product_count_comparison' => $form_values['product_count_comparison'], ); } 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']; } } function uc_order_condition_products_weight_form($settings = array()) { $options = array('all' => t('')); $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 "" 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; } function uc_order_condition_products_weight_submit($form_id, $form_values) { return array( 'products' => $form_values['products'], 'weight_units' => $form_values['weight_units'], 'product_weight_value' => $form_values['product_weight_value'], 'product_weight_comparison' => $form_values['product_weight_comparison'], ); } function uc_order_condition_is_shippable($order) { return uc_order_is_shippable($order); } /****************************************************************************** * Workflow-ng Action Callbacks and Forms * ******************************************************************************/ // Update an order's status. function uc_order_action_update_status($order, $settings) { uc_order_update_status($order->order_id, $settings['order_status']); } function uc_order_action_update_status_form($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; } function uc_order_action_update_status_submit($form_id, $form_values) { return array('order_status' => $form_values['order_status']); } // Add a comment to an order. 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'); } function uc_order_action_add_comment_form($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; } function uc_order_action_add_comment_submit($form_id, $form_values) { return array('comment_type' => $form_values['comment_type'], 'comment' => $form_values['comment']); }