'select', '#title' => t('On-site invoice template'), '#description' => t('Select the invoice template to use when invoices are viewed on the site.'), '#options' => uc_order_template_options(), '#default_value' => variable_get('uc_cust_order_invoice_template', 'customer'), ); if (module_exists('uc_cart')) { $form['invoice']['uc_cust_order_invoice_template']['#description'] .= '
' . t('This is separate from the template used to e-mail invoices to customers which is configured through Rules.', array('!url' => url('admin/store/settings/checkout/rules'))); } return system_settings_form($form); } /** * Displays the order workflow form for order state and status customization. * * @see uc_order_workflow_form_submit() * @see theme_uc_order_state_table() * @see theme_uc_order_status_table() * @ingroup forms */ function uc_order_workflow_form($form, &$form_state) { $states = uc_order_state_list(); $statuses = uc_order_status_list(); $form['order_states'] = array( '#type' => 'fieldset', '#title' => t('Order states'), '#collapsible' => TRUE, '#collapsed' => TRUE, '#theme' => 'uc_order_state_table', '#tree' => TRUE, ); foreach ($states as $state_id => $state) { $form['order_states'][$state_id]['title'] = array( '#markup' => $state['title'], ); // Create the select box for specifying a default status per order state. $options = array(); foreach ($statuses as $status) { if ($status['state'] == $state_id) { $options[$status['id']] = $status['title']; } } if (empty($options)) { $form['order_states'][$state_id]['default'] = array( '#markup' => t('- N/A -'), ); } else { $form['order_states'][$state_id]['default'] = array( '#type' => 'select', '#options' => $options, '#default_value' => uc_order_state_default($state_id), ); } } $form['order_statuses'] = array( '#type' => 'fieldset', '#title' => t('Order statuses'), '#collapsible' => FALSE, '#theme' => 'uc_order_status_table', '#tree' => TRUE, ); // Build the state option array for the order status table. $options = array(); foreach ($states as $state_id => $state) { $options[$state_id] = $state['title']; } foreach ($statuses as $status) { $form['order_statuses'][$status['id']]['id'] = array( '#markup' => $status['id'], ); $form['order_statuses'][$status['id']]['title'] = array( '#type' => 'textfield', '#default_value' => $status['title'], '#size' => 32, '#required' => TRUE, ); $form['order_statuses'][$status['id']]['weight'] = array( '#type' => 'weight', '#delta' => 20, '#default_value' => $status['weight'], ); $form['order_statuses'][$status['id']]['locked'] = array( '#type' => 'value', '#value' => $status['locked'], ); if ($status['locked']) { $form['order_statuses'][$status['id']]['state'] = array( '#markup' => uc_order_state_data($status['state'], 'title'), ); } else { $form['order_statuses'][$status['id']]['state'] = array( '#type' => 'select', '#options' => $options, '#default_value' => $status['state'], ); $form['order_statuses'][$status['id']]['remove'] = array( '#type' => 'checkbox', ); } } $form['actions'] = array('#type' => 'actions'); $form['actions']['submit'] = array( '#type' => 'submit', '#value' => t('Submit changes'), ); return $form; } /** * Form submission handler for uc_order_workflow_form(). * * @see uc_order_workflow_form() */ function uc_order_workflow_form_submit($form, &$form_state) { foreach ($form_state['values']['order_states'] as $key => $value) { variable_set('uc_state_' . $key . '_default', $value['default']); } foreach ($form_state['values']['order_statuses'] as $key => $value) { if ($value['locked'] != TRUE && $value['remove'] == TRUE) { db_delete('uc_order_statuses') ->condition('order_status_id', $key) ->execute(); drupal_set_message(t('Order status %status removed.', array('%status' => $key))); } else { $fields = array( 'title' => $value['title'], 'weight' => $value['weight'], ); // The state cannot be changed if the status is locked. if ($value['locked'] == FALSE) { $fields['state'] = $value['state']; } $query = db_update('uc_order_statuses') ->fields($fields) ->condition('order_status_id', $key) ->execute(); } } drupal_set_message(t('Order workflow information saved.')); } /** * Themes the order state table in the order workflow settings. * * @see uc_order_workflow_form() * @ingroup themeable */ function theme_uc_order_state_table($variables) { $form = $variables['form']; $header = array(t('State'), t('Default order status')); foreach (element_children($form) as $state_id) { $rows[] = array( drupal_render($form[$state_id]['title']), drupal_render($form[$state_id]['default']), ); } return theme('table', array('header' => $header, 'rows' => $rows)); } /** * Themes the order status table in the order workflow settings. * * @see uc_order_workflow_form() * @ingroup themeable */ function theme_uc_order_status_table($variables) { $form = $variables['form']; $header = array(t('ID'), t('Title'), t('List position'), t('State'), t('Remove')); foreach (element_children($form) as $state_id) { $rows[] = array( drupal_render($form[$state_id]['id']), drupal_render($form[$state_id]['title']), drupal_render($form[$state_id]['weight']), drupal_render($form[$state_id]['state']), array('data' => drupal_render($form[$state_id]['remove']), 'align' => 'center'), ); } return theme('table', array('header' => $header, 'rows' => $rows)); } /** * Presents the form to create a custom order status. * * @see uc_order_status_create_form_validate() * @see uc_order_status_create_form_submit() * @ingroup forms */ function uc_order_status_create_form($form, &$form_state) { $form['status_id'] = array( '#type' => 'textfield', '#title' => t('Order status ID'), '#description' => t('Must be a unique ID with no spaces.'), '#size' => 32, '#maxlength' => 32, '#required' => TRUE, ); $form['status_title'] = array( '#type' => 'textfield', '#title' => t('Title'), '#description' => t('The order status title displayed to users.'), '#size' => 32, '#maxlength' => 48, '#required' => TRUE, ); // Build the state option array for the order status table. $options = array(); foreach (uc_order_state_list() as $state) { $options[$state['id']] = $state['title']; } $form['status_state'] = array( '#type' => 'select', '#title' => t('Order state'), '#description' => t('Set which order state this status is for.'), '#options' => $options, '#default_value' => 'post_checkout', ); $form['status_weight'] = array( '#type' => 'weight', '#title' => t('List position'), '#delta' => 20, '#default_value' => 0, ); $form['actions'] = array('#type' => 'actions'); $form['actions']['create'] = array( '#type' => 'submit', '#value' => t('Create'), ); $form['actions']['cancel'] = array( '#markup' => l(t('Cancel'), 'admin/store/settings/orders/workflow'), ); return $form; } /** * Ensures the new status id is unique and has no spaces. * * @see uc_order_status_create_form() * @see uc_order_status_create_form_submit() */ function uc_order_status_create_form_validate($form, &$form_state) { $new_status = strtolower(trim($form_state['values']['status_id'])); if (strpos($new_status, ' ') !== FALSE || $new_status == 'all') { form_set_error('status_id', t('You have entered an invalid status ID.')); } $statuses = uc_order_status_list(); foreach ($statuses as $status) { if ($new_status == $status['id']) { form_set_error('status_id', t('This ID is already in use. Please specify a unique ID.')); } } } /** * Form submission handler for uc_order_status_create_form_submit(). * * @see uc_order_status_create_form() * @see uc_order_status_create_form_validate() */ function uc_order_status_create_form_submit($form, &$form_state) { db_insert('uc_order_statuses') ->fields(array( 'order_status_id' => $form_state['values']['status_id'], 'title' => $form_state['values']['status_title'], 'state' => $form_state['values']['status_state'], 'weight' => $form_state['values']['status_weight'], 'locked' => 0, )) ->execute(); drupal_set_message(t('Custom order status created.')); $form_state['redirect'] = 'admin/store/settings/orders/workflow'; } /** * Creates a new order and redirect to its edit screen. * * @see uc_order_create_form_create_validate() * @see uc_order_create_form_create_submit() * @ingroup forms */ function uc_order_create_form($form, &$form_state) { $form['customer_type'] = array( '#type' => 'radios', '#options' => array( 'search' => t('Search for an existing customer.'), 'create' => t('Create a new customer account.'), 'none' => t('No customer account required.'), ), '#required' => TRUE, '#default_value' => 'search', '#ajax' => array( 'callback' => 'uc_order_create_form_customer', 'wrapper' => 'uc-order-customer', 'progress' => array('type' => 'throbber'), ), ); $form['customer'] = array( '#prefix' => '
', '#suffix' => '
', '#tree' => TRUE, ); // Create form elements needed for customer search. // Shown only when the 'Search for an existing customer.' radio is selected. if (!isset($form_state['values']['customer_type']) || $form_state['values']['customer_type'] == 'search') { // Container for customer search fields. $form['customer'] += array( '#type' => 'fieldset', '#title' => t('Customer search'), '#description' => t('Enter full or partial information in one or more of the following fields, then press the "Search" button. Search results will match all the provided information.'), ); // Customer first name. $form['customer']['first_name'] = array( '#type' => 'textfield', '#title' => t('First name'), '#size' => 24, '#maxlength' => 32, ); // Customer last name. $form['customer']['last_name'] = array( '#type' => 'textfield', '#title' => t('Last name'), '#size' => 24, '#maxlength' => 32, ); // Customer e-mail address. $form['customer']['email'] = array( '#type' => 'textfield', '#title' => t('E-mail'), '#size' => 24, '#maxlength' => 96, ); // Customer username. $form['customer']['username'] = array( '#type' => 'textfield', '#title' => t('Username'), '#size' => 24, '#maxlength' => 96, ); $form['customer']['search'] = array( '#type' => 'button', '#value' => t('Search'), '#ajax' => array( 'callback' => 'uc_order_create_form_customer_search', 'wrapper' => 'uc-order-customer-results', 'progress' => array('type' => 'throbber'), ), ); $form['customer']['uid'] = array( '#prefix' => '
', '#suffix' => '
', ); // Search for existing customer by e-mail address. if (isset($form_state['values']['customer']['email'])) { $query = db_select('users', 'u')->distinct(); $query->leftJoin('uc_orders', 'o', 'u.uid = o.uid'); $query->fields('u', array('uid', 'name', 'mail')) ->fields('o', array('billing_first_name', 'billing_last_name')) ->condition('u.uid', 0, '>') ->condition(db_or() ->isNull('o.billing_first_name') ->condition('o.billing_first_name', db_like(trim($form_state['values']['customer']['first_name'])) . '%', 'LIKE') ) ->condition(db_or() ->isNull('o.billing_last_name') ->condition('o.billing_last_name', db_like(trim($form_state['values']['customer']['last_name'])) . '%', 'LIKE') ) ->condition(db_or() ->condition('o.primary_email', db_like(trim($form_state['values']['customer']['email'])) . '%', 'LIKE') ->condition('u.mail', db_like(trim($form_state['values']['customer']['email'])) . '%', 'LIKE') ) ->condition('u.name', db_like(trim($form_state['values']['customer']['username'])) . '%', 'LIKE') ->orderBy('o.created', 'DESC') ->range(0, $limit = 11); $result = $query->execute(); $options = array(); foreach ($result as $user) { $name = ''; if (!empty($user->billing_first_name) && !empty($user->billing_last_name)) { $name = $user->billing_first_name . ' ' . $user->billing_last_name . ' '; } // Options formated as "First Last (username)". $options[$user->uid] = $name . '<' . $user->mail . '>' . ' (' . $user->name . ')'; } $max = FALSE; if (count($options) == $limit) { array_pop($options); $max = TRUE; } if (!empty($options)) { // Display search results. $form['customer']['uid'] += array( '#type' => 'radios', '#title' => t('Select customer'), '#description' => $max ? t('More than !limit results found. Refine your search to find other customers.', array('!limit' => $limit - 1)) : '', '#options' => $options, '#default_value' => key($options), ); } else { // No search results found. $form['customer']['uid'] += array( '#markup' => '

' . t('Search returned no results.') . '

', ); } } } // Create form elements needed for new customer creation. // Shown only when the 'Create a new customer account.' radio is selected. elseif ($form_state['values']['customer_type'] == 'create') { // Container for new customer information. $form['customer'] += array( '#type' => 'fieldset', '#title' => t('New customer details'), ); // Customer e-mail address. $form['customer']['email'] = array( '#type' => 'textfield', '#title' => t('Customer e-mail address'), '#size' => 24, '#maxlength' => 96, ); // Option to notify customer. $form['customer']['sendmail'] = array( '#type' => 'checkbox', '#title' => t('E-mail account details to customer.'), ); } $form['actions'] = array('#type' => 'actions'); $form['actions']['submit'] = array( '#type' => 'submit', '#value' => t('Create order'), '#validate' => array('uc_order_create_form_create_validate'), '#submit' => array('uc_order_create_form_create_submit'), ); return $form; } /** * Ajax callback: updates the customer selection fields. */ function uc_order_create_form_customer($form, &$form_state) { return $form['customer']; } /** * Ajax callback: updates the customer search results. */ function uc_order_create_form_customer_search($form, &$form_state) { return $form['customer']['uid']; } /** * Form validation handler for customer search. * * @see uc_order_create_form() * @ingroup forms */ function uc_order_create_form_create_validate($form, &$form_state) { switch ($form_state['values']['customer_type']) { case 'search': if (empty($form_state['values']['customer']['uid'])) { form_set_error('customer][uid', t('Please select a customer.')); } break; case 'create': $email = trim($form_state['values']['customer']['email']); if (!valid_email_address($email)) { form_set_error('customer][mail', t('Invalid e-mail address.')); } $uid = db_query('SELECT uid FROM {users} WHERE mail LIKE :mail', array(':mail' => $email))->fetchField(); if ($uid) { form_set_error('customer][mail', t('An account already exists for that e-mail.')); } break; } } /** * Form submission handler for customer search. * * @see uc_order_create_form() * @ingroup forms */ function uc_order_create_form_create_submit($form, &$form_state) { global $user; switch ($form_state['values']['customer_type']) { case 'search': $uid = $form_state['values']['customer']['uid']; break; case 'create': // Create new account. $email = trim($form_state['values']['customer']['email']); $fields = array( 'name' => uc_store_email_to_username($email), 'mail' => $email, 'pass' => user_password(), 'status' => variable_get('uc_new_customer_status_active', TRUE) ? 1 : 0, ); $account = user_save(NULL, $fields); $uid = $account->uid; if ($form_state['values']['customer']['sendmail']) { // Manually set the password so it appears in the e-mail. $account->password = $fields['pass']; drupal_mail('user', 'register_admin_created', $email, uc_store_mail_recipient_language($email), array('account' => $account), uc_store_email_from()); drupal_set_message(t('A welcome message has been e-mailed to the new user.')); } break; default: $uid = 0; } $order = uc_order_new($uid, 'post_checkout'); uc_order_comment_save($order->order_id, $user->uid, t('Order created by the administration.'), 'admin'); $form_state['redirect'] = 'admin/store/orders/' . $order->order_id . '/edit'; } /** * Creates a new order for the specified customer, ready for editing. */ function uc_order_create_for_user($account) { global $user; $order = uc_order_new($account->uid, 'post_checkout'); uc_order_comment_save($order->order_id, $user->uid, t('Order created by the administration.'), 'admin'); drupal_goto('admin/store/orders/' . $order->order_id . '/edit'); } /** * Displays a form to select a previously entered address. * * @see uc_order_address_book_form() */ function uc_order_address_book() { $uid = intval($_POST['uid']); $type = $_POST['type']; $func = $_POST['func']; $form = drupal_get_form('uc_order_address_book_form', $uid, $type, $func); print drupal_render($form); exit(); } /** * Presents previously entered addresses as selectable options. * * @see uc_order_address_book() * @ingroup forms */ function uc_order_address_book_form($form, &$form_state, $uid = 0, $type = 'billing', $func = '') { $select = uc_select_address($uid, $type, $func); if ($uid == 0) { $form['desc'] = array('#markup' => '
' . t('You must select a customer before address
information is available.
') . '
'); } elseif (is_null($select)) { $form['desc'] = array('#markup' => '
' . t('No addresses found for customer.') . '
'); } else { $form['addresses'] = uc_select_address($uid, $type, $func, t('Select an address')); $form['addresses']['#prefix'] = '
'; $form['addresses']['#suffix'] = '
'; } $form['close'] = array( '#type' => 'button', '#value' => t('Close'), '#attributes' => array('onclick' => "return close_address_select('#" . $type . "_address_select');"), ); return $form; } /** * Presents the customer search results and let one of them be chosen. * * @see uc_order_select_customer_form() */ function uc_order_select_customer($email = NULL) { $build = array(); $options = NULL; // Return the search results and let them pick one! if (arg(4) == 'search') { $first_name = str_replace('*', '%', db_like($_POST['first_name'])); $last_name = str_replace('*', '%', db_like($_POST['last_name'])); $email = str_replace('*', '%', db_like($_POST['email'])); $query = db_select('users', 'u')->distinct(); $query->leftJoin('uc_orders', 'o', 'u.uid = o.uid'); $query->fields('u', array('uid', 'mail')) ->fields('o', array('billing_first_name', 'billing_last_name')) ->condition('u.uid', 0, '>') ->orderBy('o.billing_last_name'); if ($first_name && $first_name !== '%') { $query->condition('o.billing_first_name', $first_name, 'LIKE'); } if ($last_name && $last_name !== '%') { $query->condition('o.billing_last_name', $last_name, 'LIKE'); } if ($email && $email !== '%') { $query->condition(db_or() ->condition('o.primary_email', $email, 'LIKE') ->condition('u.mail', $email, 'LIKE') ); } $result = $query->execute(); $options = array(); foreach ($result as $user) { if (empty($user->billing_first_name) && empty($user->billing_last_name)) { $name = ''; } else { $name = $user->billing_last_name . ', ' . $user->billing_first_name . ' '; } $options[$user->uid . ':' . $user->mail] = $name . '(' . $user->mail . ')'; } if (count($options) == 0) { $build['description'] = array('#markup' => '

' . t('Search returned no results.') . '

'); $options = NULL; } else { $build['description'] = array('

' . t('Search returned the following:') . '

'); } } // Check to see if the e-mail address for a new user is unique. if (arg(5) == 'check') { $email = check_plain($_POST['email']); $build['email'] = array('#markup' => ''); if (!valid_email_address($email)) { $build['email']['#markup'] .= t('Invalid e-mail address.') . '
'; } $result = db_query("SELECT uid, mail FROM {users} WHERE mail = :mail", array(':mail' => $email)); if ($user = $result->fetchObject()) { $build['email']['#markup'] .= t('An account already exists for that e-mail.') . '

'; $build['email']['#markup'] .= '' . t('Use this account now?') . '
' . t('User @uid - @mail', array('@uid' => $user->uid, '@mail' => $user->mail)) . '



'; } else { $name = uc_store_email_to_username($email); $fields = array( 'name' => $name, 'mail' => $email, 'pass' => user_password(6), 'status' => variable_get('uc_new_customer_status_active', TRUE) ? 1 : 0, ); $account = user_save('', $fields); if ($_POST['sendmail'] == 'true') { // Manually set the password so it appears in the e-mail. $account->password = $fields['pass']; // Send the e-mail through the user module. drupal_mail('user', 'register_admin_created', $email, uc_store_mail_recipient_language($email), array('account' => $account), uc_store_email_from()); $build['email']['#markup'] .= t('Account details sent to e-mail provided.

Username: @username
Password: @password', array('@username' => $fields['name'], '@password' => $fields['pass'])) . '

'; } $build['result'] = array( '#markup' => '' . t('Use this account now?') . '
' . t('User @uid - @mail', array('@uid' => $account->uid, '@mail' => $account->mail)) . '



', ); } } $build['customer_select_form'] = drupal_get_form('uc_order_select_customer_form', $options); print drupal_render($build); exit(); } /** * Form to choose a customer from a list. * * @see uc_order_select_customer() * @ingroup forms */ function uc_order_select_customer_form($form, &$form_state, $options = NULL) { if (is_null(arg(4))) { $form['desc'] = array( '#markup' => '
' . t('Search for a customer based on these fields.') . '
' . t('Use * as a wildcard to match any character.') . '
' . '(' . t('Leave a field empty to ignore it in the search.') . ')
', ); $form['first_name'] = array( '#type' => 'textfield', '#title' => t('First name'), '#size' => 24, '#maxlength' => 32, ); $form['last_name'] = array( '#type' => 'textfield', '#title' => t('Last name'), '#size' => 24, '#maxlength' => 32, ); $form['email'] = array( '#type' => 'textfield', '#title' => t('E-mail'), '#size' => 24, '#maxlength' => 96, ); } elseif (arg(4) == 'search' && !is_null($options)) { $form['cust_select'] = array( '#type' => 'select', '#title' => t('Select a customer'), '#size' => 7, '#options' => $options, '#default_value' => key($options), '#attributes' => array('ondblclick' => 'return select_customer_search();'), ); } elseif (arg(4) == 'new') { $form['desc'] = array( '#markup' => '
' . t('Enter an e-mail address for the new customer.') . '
', ); $form['email'] = array( '#type' => 'textfield', '#title' => t('E-mail'), '#size' => 24, '#maxlength' => 96, ); } $form['actions'] = array('#type' => 'actions'); if (is_null(arg(4))) { $form['actions']['search'] = array( '#type' => 'submit', '#value' => t('Search'), '#attributes' => array('onclick' => 'return load_customer_search_results();'), ); } elseif (arg(4) == 'search') { if (!is_null($options)) { $form['actions']['select'] = array( '#type' => 'submit', '#value' => t('Select'), '#attributes' => array('onclick' => 'return select_customer_search();'), ); } $form['actions']['back'] = array( '#type' => 'submit', '#value' => t('Back'), '#attributes' => array('onclick' => 'return load_customer_search();'), ); } elseif (arg(4) == 'new') { $form['sendmail'] = array( '#type' => 'checkbox', '#title' => t('E-mail customer account details.'), ); $form['actions']['submit'] = array( '#type' => 'submit', '#value' => t('Submit'), '#attributes' => array('onclick' => 'return check_new_customer_address();'), ); } $form['actions']['close'] = array( '#type' => 'submit', '#value' => t('Close'), '#attributes' => array('onclick' => 'return close_customer_select();'), ); return $form; } /** * Returns the sortable table listing of a customer's orders. * * This function is deprecated; this listing is now provided by Views. * * @param $uid * The user ID whose orders you wish to list. */ function uc_order_history($user) { drupal_set_title(t('My order history')); $header = array( array('data' => t('Date'), 'field' => 'o.created', 'sort' => 'desc'), array('data' => t('Order #'), 'field' => 'o.order_id'), array('data' => t('Status'), 'field' => 'os.title'), array('data' => t('Products'), 'field' => 'products'), array('data' => t('Total'), 'field' => 'o.order_total') ); $rows = array(); $query = db_select('uc_orders', 'o'); $o_order_id = $query->addField('o', 'order_id'); $o_created = $query->addField('o', 'created'); $o_status = $query->addField('o', 'order_status'); $o_total = $query->addField('o', 'order_total'); $o_uid = $query->addField('o', 'uid'); $query->condition($o_uid, $user->uid) ->condition($o_status, uc_order_status_list('general', TRUE), 'IN'); $count_query = $query->countQuery(); $query = $query->extend('PagerDefault')->extend('TableSort'); $os = $query->leftJoin('uc_order_statuses', 'os', 'o.order_status = os.order_status_id'); $op = $query->leftJoin('uc_order_products', 'op', 'o.order_id = op.order_id'); $os_title = $query->addField('os', 'title'); $op_products = $query->addExpression('SUM(op.qty)', 'products'); $query->groupBy('o.order_id') ->groupBy('o.created') ->groupBy('os.title') ->groupBy('o.order_total') ->groupBy('o.order_status') ->groupBy('o.uid') ->orderByHeader($header) ->limit(20); $query->setCountQuery($count_query); $result = $query->execute(); // Build a table based on the customer's orders. foreach ($result as $order) { $link = l($order->order_id, 'user/' . $user->uid . '/orders/' . $order->order_id); if (user_access('view all orders')) { $link .= '' . uc_order_actions($order, TRUE) . ''; } $rows[] = array( array('data' => format_date($order->created, 'uc_store')), array('data' => $link), array('data' => check_plain($order->title)), array('data' => (!is_null($order->products) ? $order->products : 0), 'align' => 'center'), array('data' => array('#theme' => 'uc_price', '#price' => $order->order_total), 'align' => 'right'), ); } $build = array(); $build['orders'] = array( '#theme' => 'table', '#header' => $header, '#rows' => $rows, '#attributes' => array('class' => array('uc-order-history')), '#empty' => t('No orders available.'), ); $build['pager'] = array( '#theme' => 'pager', '#element' => 0, '#weight' => 5, ); return $build; } /** * Displays the order edit screen, constructed via hook_uc_order_pane(). * * @see uc_order_edit_form_validate() * @see uc_order_edit_form_submit() * @see theme_uc_order_edit_form() * @see uc_order_edit_form_delete() * @ingroup forms */ function uc_order_edit_form($form, &$form_state, $order) { if (isset($form_state['order'])) { $order = $form_state['order']; } else { $form_state['order'] = $order; } $form['#order'] = $order; $form['order_id'] = array('#type' => 'hidden', '#value' => $order->order_id); $form['order_uid'] = array('#type' => 'hidden', '#value' => $order->uid); $modified = isset($form_state['values']['order_modified']) ? $form_state['values']['order_modified'] : $order->modified; $form['order_modified'] = array('#type' => 'hidden', '#value' => $modified); $panes = _uc_order_pane_list('edit'); foreach ($panes as $id => $pane) { if (in_array('edit', $pane['show'])) { $func = $pane['callback']; if (function_exists($func)) { $func('edit-form', $order, $form, $form_state); } } } $form['actions'] = array('#type' => 'actions'); $form['actions']['submit-changes'] = array( '#type' => 'submit', '#value' => t('Submit changes'), '#attributes' => array('class' => array('save-button')), ); if (uc_order_can_delete($order)) { $form['actions']['delete'] = array( '#type' => 'submit', '#value' => t('Delete'), '#submit' => array('uc_order_edit_form_delete'), ); } field_attach_form('uc_order', $order, $form, $form_state); form_load_include($form_state, 'inc', 'uc_store', 'includes/uc_ajax_attach'); $form['#process'][] = 'uc_ajax_process_form'; return $form; } /** * Prevents order edits from colliding. * * @see uc_order_edit_form() * @see uc_order_edit_form_submit() * @see theme_uc_order_edit_form() */ function uc_order_edit_form_validate($form, &$form_state) { $order = uc_order_load($form_state['values']['order_id']); if ($form_state['values']['order_modified'] != $order->modified) { form_set_error('order_modified', t('This order has been modified by another user, changes cannot be saved.')); } entity_form_field_validate('uc_order', $form, $form_state); // Build list of changes to be applied. $panes = _uc_order_pane_list(); foreach ($panes as $id => $pane) { if (in_array('edit', $pane['show'])) { $func = $pane['callback']; if (function_exists($func)) { if (($changes = $func('edit-process', $order, $form, $form_state)) != NULL) { foreach ($changes as $key => $value) { $form_state['order']->$key = $value; } } } } } } /** * Form submission handler for uc_order_edit_form(). * * @see uc_order_edit_form() * @see uc_order_edit_form_validate() * @see theme_uc_order_edit_form() */ function uc_order_edit_form_submit($form, &$form_state) { $order = uc_order_load($form_state['values']['order_id']); $log = array(); foreach ($form_state['order'] as $key => $value) { if (!isset($order->$key) || $order->$key !== $value) { if (!is_array($value)) { $log[$key] = array('old' => $order->$key, 'new' => $value); } $order->$key = $value; } } if (module_exists('uc_stock')) { $qtys = array(); foreach ($order->products as $product) { $qtys[$product->order_product_id] = $product->qty; } } $order->products = array(); if (isset($form_state['values']['products']) && is_array($form_state['values']['products'])) { foreach ($form_state['values']['products'] as $product) { if (!isset($product['remove']) && intval($product['qty']) > 0) { $product['data'] = unserialize($product['data']); $product = (object)$product; $order->products[] = $product; if (module_exists('uc_stock')) { $temp = $product->qty; $product->qty = $product->qty - $qtys[$product->order_product_id]; uc_stock_adjust_product_stock($product, 0, $order); $product->qty = $temp; } } else { $log['remove_' . $product['nid']] = $product['title'] . ' removed from order.'; } } } // Load line items again, since some may have been updated by the form. $order->line_items = uc_order_load_line_items($order); uc_order_log_changes($order->order_id, $log); field_attach_submit('uc_order', $order, $form, $form_state); uc_order_save($order); drupal_set_message(t('Order changes saved.')); } /** * Formats the uc_order_edit_form(). * * @see uc_order_edit_form() * @see uc_order_edit_form_validate() * @see uc_order_edit_form_submit() * @ingroup themeable */ function theme_uc_order_edit_form($variables) { $form = $variables['form']; $output = ''; $panes = _uc_order_pane_list(); foreach ($panes as $id => $pane) { if (in_array('edit', $pane['show'])) { $func = $pane['callback']; if (function_exists($func) && ($contents = $func('edit-theme', $form['#order'], $form)) != NULL) { $output .= '
'; $title = isset($pane['display title']) ? $pane['display title'] : $pane['title']; if ($title) { $output .= '
' . $title . ':' . '
'; } $output .= $contents . '
'; } } } $last = '
' . drupal_render($form['order_id']) . drupal_render($form['order_modified']) . drupal_render($form['form_id']) . drupal_render($form['form_token']) . drupal_render($form['form_build_id']) . drupal_render($form['actions']) . '
'; $output .= drupal_render_children($form) . $last; return $output; } /** * Handles order delete button action. * * @see uc_order_edit_form() */ function uc_order_edit_form_delete($form, &$form_state) { $form_state['redirect'] = 'admin/store/orders/' . $form_state['values']['order_id'] . '/delete'; } /** * Form to add a line item to an order. * * @see uc_order_add_line_item_form_validate() * @see uc_order_add_line_item_submit() */ function uc_order_add_line_item_form($form, &$form_state, $order, $line_item_id) { $func = _uc_line_item_data($line_item_id, 'callback'); if (!function_exists($func) || ($form = $func('form', $order->order_id)) == NULL) { $form['title'] = array( '#type' => 'textfield', '#title' => t('Line item title'), '#description' => t('Display title of the line item.'), '#size' => 32, '#maxlength' => 128, '#default_value' => _uc_line_item_data($line_item_id, 'title'), ); $form['amount'] = array( '#type' => 'uc_price', '#title' => t('Line item amount'), '#allow_negative' => TRUE, ); } $form['order_id'] = array( '#type' => 'hidden', '#value' => $order->order_id, ); $form['line_item_id'] = array( '#type' => 'hidden', '#value' => $line_item_id, ); $form['actions'] = array('#type' => 'actions'); $form['actions']['submit'] = array( '#type' => 'submit', '#value' => t('Add line item'), '#suffix' => l(t('Cancel'), 'admin/store/orders/' . $order->order_id . '/edit'), ); return $form; } /** * Validates new line item data. * * @see uc_order_add_line_item_form() */ function uc_order_add_line_item_form_validate($form, &$form_state) { $func = _uc_line_item_data($form_state['values']['line_item_id'], 'callback'); if (function_exists($func) && ($form = $func('form', $form_state['values']['order_id'])) != NULL) { $func('validate', $form, $form_state); } } /** * Form submission handler for uc_order_add_line_item_form(). * * @see uc_order_add_line_item_form() */ function uc_order_add_line_item_form_submit($form, &$form_state) { $func = _uc_line_item_data($form_state['values']['line_item_id'], 'callback'); if (function_exists($func) && ($form = $func('form', $form_state['values']['order_id'])) != NULL) { $func('submit', $form, $form_state); } else { uc_order_line_item_add($form_state['values']['order_id'], $form_state['values']['line_item_id'], $form_state['values']['title'], $form_state['values']['amount']); drupal_set_message(t('Line item added to order.')); } $form_state['redirect'] = 'admin/store/orders/' . $form_state['values']['order_id'] . '/edit'; } /** * Sets recipients of an invoice, then mails it. * * @see uc_order_mail_invoice_form_validate() * @see uc_order_mail_invoice_form_submit() * @ingroup forms */ function uc_order_mail_invoice_form($form, &$form_state, $order) { $form['order_id'] = array( '#type' => 'hidden', '#value' => $order->order_id, ); $form['email'] = array( '#type' => 'textfield', '#title' => t('Recipient e-mail address'), '#default_value' => $order->primary_email, ); $form['actions'] = array('#type' => 'actions'); $form['actions']['submit' ] = array( '#type' => 'submit', '#value' => t('Mail invoice'), ); return $form; } /** * Only mail invoices to valid email addresses. * * @see uc_order_mail_invoice_form() */ function uc_order_mail_invoice_form_validate($form, &$form_state) { $recipient = check_plain($form_state['values']['email']); if (empty($recipient) || !valid_email_address($recipient)) { form_set_error('email', t('Invalid e-mail address.')); } } /** * Form submission handler for uc_order_mail_invoice_form(). * * @see uc_order_mail_invoice_form() */ function uc_order_mail_invoice_form_submit($form, &$form_state) { $order = uc_order_load($form_state['values']['order_id']); $recipient = check_plain($form_state['values']['email']); $params = array('order' => $order); $sent = drupal_mail('uc_order', 'invoice', $recipient, uc_store_mail_recipient_language($recipient), $params, uc_store_email_from()); if (!$sent) { drupal_set_message(t('E-mail failed.')); } else { $message = t('Invoice e-mailed to @email.', array('@email' => $recipient)); drupal_set_message($message); uc_order_log_changes($order->order_id, array($message)); } } /** * Displays a log of changes made to an order. */ function uc_order_log($order) { $result = db_query("SELECT * FROM {uc_order_log} WHERE order_id = :id ORDER BY order_log_id DESC", array(':id' => $order->order_id)); $header = array(t('Time'), t('User'), t('Changes')); $rows = array(); foreach ($result as $change) { $rows[] = array( format_date($change->created, 'short'), theme('uc_uid', array('uid' => $change->uid)), $change->changes, ); } $build['log'] = array( '#theme' => 'table', '#header' => $header, '#rows' => $rows, '#empty' => t('No changes have been logged for this order.'), ); return $build; } /** * Confirmation form to delete an order. * * @see uc_order_delete_confirm_form_submit() * @ingroup forms */ function uc_order_delete_confirm_form($form, &$form_state, $order) { if (!uc_order_can_delete($order)) { drupal_set_message(t('It is not possible to delete order @id.', array('@id' => $order->order_id))); drupal_goto('admin/store/orders'); } $form['order_id'] = array( '#type' => 'value', '#value' => $order->order_id ); return confirm_form($form, t('Are you sure you want to delete order @order_id?', array('@order_id' => $order->order_id)), 'admin/store/orders', NULL, t('Delete')); } /** * Form submission handler for uc_order_delete_confirm_form(). * * @see uc_order_delete_confirm_form() */ function uc_order_delete_confirm_form_submit($form, &$form_state) { // Delete the specified order. uc_order_delete($form_state['values']['order_id']); // Display a message to the user and return to the order admin page. drupal_set_message(t('Order @order_id completely removed from the database.', array('@order_id' => $form_state['values']['order_id']))); $form_state['redirect'] = 'admin/store/orders'; }