protected function setAddress(waContact $contact, $params, $ext) { $address = shopHelper::getOrderAddress($params, $ext); if ($contact['address.' . $ext]) { $flag = false; foreach ($contact['address.' . $ext] as $i => $a) { $flag = true; foreach ($address as $k => $v) { $old_v = isset($a['data'][$k]) ? $a['data'][$k] : ''; if ($v !== $old_v) { $flag = false; break; } } if ($flag) { break; } } if ($flag) { $tmp = $contact['address.' . $ext]; $tmp[$i] = $ext == 'shipping' ? $this->shipping_address : $this->billing_address; $contact['address.' . $ext] = $tmp; } } else { $tmp = $ext == 'shipping' ? $this->shipping_address : $this->billing_address; if ($tmp) { $contact['address.' . $ext] = $tmp; } } }
public function execute() { $order_id = waRequest::get('id', null, waRequest::TYPE_INT); $form = null; $order = array(); $shipping_address = array(); // Existing order? if ($order_id) { $order = $this->getOrder($order_id); $currency = $order['currency']; if ($order['contact_id']) { $has_contacts_rights = shopHelper::getContactRights($order['contact_id']); $shipping_address = shopHelper::getOrderAddress($order['params'], 'shipping'); if (!empty($order['contact_id'])) { try { $c = new waContact($order['contact_id']); if ($shipping_address) { $c['address.shipping'] = $shipping_address; } $form = shopHelper::getCustomerForm($c); } catch (waException $e) { // Contact does not exist; ignore. When $form is null, customer data saved in order is shown. } } } else { $has_contacts_rights = shopHelper::getContactRights(); } } else { $currency = $this->getConfig()->getCurrency(); $has_contacts_rights = shopHelper::getContactRights(); $form = shopHelper::getCustomerForm(); } $stock_model = new shopStockModel(); $stocks = $stock_model->getAll('id'); $tax_model = new shopTaxModel(); $taxes_count = $tax_model->countAll(); $count_new = $this->order_model->getStateCounters('new'); /** * Backend order edit page * @event backend_order_edit * @param array $order * @return array[string][string] $return[%plugin_id%] html output */ $this->view->assign('backend_order_edit', wa()->event('backend_order_edit', $order)); $this->view->assign(array('form' => $form, 'order' => $order, 'stocks' => $stocks, 'currency' => $currency, 'count_new' => $count_new, 'taxes_count' => $taxes_count, 'shipping_address' => $shipping_address, 'has_contacts_rights' => $has_contacts_rights, 'customer_validation_disabled' => wa()->getSetting('disable_backend_customer_form_validation'), 'ignore_stock_count' => wa()->getSetting('ignore_stock_count'))); }
protected static function sendSms($n, $data) { $general = wa('shop')->getConfig()->getGeneralSettings(); /** * @var waContact $customer */ $customer = $data['customer']; if ($n['to'] == 'customer') { $to = $customer->get('phone', 'default'); $log = sprintf(_w("Notification <strong>%s</strong> sent to customer."), $n['name']); } elseif ($n['to'] == 'admin') { $to = $general['phone']; $log = sprintf(_w("Notification <strong>%s</strong> sent to store admin."), $n['name']); } else { $to = $n['to']; $log = sprintf(_w("Notification <strong>%s</strong> sent to %s."), $n['name'], $n['to']); } if (!$to) { return; } $view = wa()->getView(); foreach (array('shipping', 'billing') as $k) { $address = shopHelper::getOrderAddress($data['order']['params'], $k); $formatter = new waContactAddressOneLineFormatter(array('image' => false)); $address = $formatter->format(array('data' => $address)); $view->assign($k . '_address', $address['value']); } $order_id = $data['order']['id']; $data['order']['id'] = shopHelper::encodeOrderId($order_id); $view->assign('order_url', wa()->getRouteUrl('/frontend/myOrderByCode', array('id' => $order_id, 'code' => $data['order']['params']['auth_code']), true)); $view->assign($data); $text = $view->fetch('string:' . $n['text']); $sms = new waSMS(); if ($sms->send($to, $text, isset($n['from']) ? $n['from'] : null)) { $order_log_model = new shopOrderLogModel(); $order_log_model->add(array('order_id' => $order_id, 'contact_id' => null, 'action_id' => '', 'text' => '<i class="icon16 mobile"></i> ' . $log, 'before_state_id' => $data['order']['state_id'], 'after_state_id' => $data['order']['state_id'])); } }
public function execute() { $order = $this->getOrder(); if (!$order) { $this->view->assign('order', $order); return; } $workflow = new shopWorkflow(); $actions = $workflow->getStateById($order['state_id'])->getActions(); $bottom_buttons = $top_buttons = $buttons = array(); foreach ($actions as $action) { /** * @var shopWorkflowAction $action */ if ($action->getOption('top') || $action->getOption('position') == 'top') { $top_buttons[] = $action->getButton(); } elseif ($action->getOption('position') == 'bottom') { $bottom_buttons[] = $action->getButton(); } else { $buttons[] = $action->getButton(); } } $config = $this->getConfig(); $last_action_datetime = null; $log_model = new shopOrderLogModel(); $log = $log_model->getLog($order['id']); foreach ($log as &$l) { if ($l['action_id']) { $l['action'] = $workflow->getActionById($l['action_id']); } if ($order['state_id'] == $l['after_state_id']) { $last_action_datetime = $l['datetime']; } } $params = $order['params']; $tracking = ''; if (!empty($params['shipping_id'])) { try { $plugin = shopShipping::getPlugin(null, $params['shipping_id']); if (!empty($params['tracking_number'])) { $tracking = $plugin->tracking($params['tracking_number']); } if ($custom_fields = $plugin->customFields(new waOrder())) { foreach ($custom_fields as $k => $v) { if (!empty($params['shipping_params_' . $k])) { $custom_fields[$k]['value'] = $params['shipping_params_' . $k]; } else { unset($custom_fields[$k]); } } $this->view->assign('custom_fields', $custom_fields); } } catch (waException $ex) { $tracking = $ex->getMessage(); } } $this->view->assign('tracking', $tracking); $settings = wa('shop')->getConfig()->getCheckoutSettings(); $form_fields = ifset($settings['contactinfo']['fields'], array()); $formatter = new waContactAddressSeveralLinesFormatter(); $shipping_address = shopHelper::getOrderAddress($params, 'shipping'); $this->view->assign('shipping_address_text', shopHelper::getShippingAddressText($params)); $shipping_address = $formatter->format(array('data' => $shipping_address)); $shipping_address = $shipping_address['value']; if (isset($form_fields['address.billing'])) { $billing_address = shopHelper::getOrderAddress($params, 'billing'); $billing_address = $formatter->format(array('data' => $billing_address)); $billing_address = $billing_address['value']; if ($billing_address === $shipping_address) { $billing_address = null; } } else { $billing_address = null; } $customer_model = new shopCustomerModel(); $customer = $customer_model->getById($order['contact_id']); $customer_contact = new waContact($order['contact_id']); // Customer info $main_contact_info = array(); foreach (array('email', 'phone', 'im') as $f) { if ($v = $customer_contact->get($f, 'top,html')) { $main_contact_info[] = array('id' => $f, 'name' => waContactFields::get($f)->getName(), 'value' => is_array($v) ? implode(', ', $v) : $v); } } $this->view->assign(array('customer' => $customer, 'customer_contact' => $customer_contact, 'main_contact_info' => $main_contact_info, 'currency' => $config->getCurrency(), 'order' => $order, 'params' => $params, 'log' => $log, 'last_action_datetime' => $last_action_datetime, 'bottom_buttons' => $bottom_buttons, 'top_buttons' => $top_buttons, 'buttons' => $buttons, 'filter_params' => $this->getParams(), 'filter_params_str' => $this->getParams(true), 'count_new' => $this->getModel()->getStateCounters('new'), 'timeout' => $config->getOption('orders_update_list'), 'printable_docs' => shopHelper::getPrintForms(array_merge($order, array('params' => $params))), 'billing_address' => $billing_address, 'shipping_address' => $shipping_address, 'shipping_id' => ifset($params['shipping_id'], '') . '.' . ifset($params['shipping_rate_id'], ''), 'offset' => $this->getModel()->getOffset($order['id'], $this->getParams(), true))); /** * Backend order profile page * UI hook allow extends order profile page * @event backend_order * @param array $order * @return array[string][string]string $return[%plugin_id%]['title_suffix'] html output * @return array[string][string]string $return[%plugin_id%]['action_button'] html output * @return array[string][string]string $return[%plugin_id%]['action_link'] html output * @return array[string][string]string $return[%plugin_id%]['info_section'] html output */ $this->view->assign('backend_order', wa()->event('backend_order', $order, array('title_suffix', 'action_button', 'action_link', 'info_section'))); }
public function execute() { $id = waRequest::request('id', 0, 'int'); if (!$id || !wa()->getUser()->getRights('shop', 'orders')) { $this->redirect(wa()->getAppUrl()); } // Order $om = new shopOrderModel(); $order = $om->getOrder($id); shopHelper::workupOrders($order, true); $order['tax'] = (double) $order['tax']; $order['discount'] = (double) $order['discount']; // Order params $opm = new shopOrderParamsModel(); $order['params'] = $opm->get($order['id']); // Order subtotal $order_subtotal = 0; foreach ($order['items'] as $i) { $order_subtotal += $i['price'] * $i['quantity']; } // Format addresses $settings = wa('shop')->getConfig()->getCheckoutSettings(); $form_fields = ifset($settings['contactinfo']['fields'], array()); $formatter = new waContactAddressSeveralLinesFormatter(); $shipping_address = shopHelper::getOrderAddress($order['params'], 'shipping'); $shipping_address = $formatter->format(array('data' => $shipping_address)); $shipping_address = $shipping_address['value']; if (isset($form_fields['address.billing'])) { $billing_address = shopHelper::getOrderAddress($order['params'], 'billing'); $billing_address = $formatter->format(array('data' => $billing_address)); $billing_address = $billing_address['value']; if ($billing_address === $shipping_address) { $billing_address = null; } } else { $billing_address = null; } // Order history $log_model = new shopOrderLogModel(); $log = $log_model->getLog($order['id']); // Customer $contact = $customer = self::getCustomer($order); $top = array(); foreach (array('email', 'phone') as $f) { if ($v = $contact->get($f, 'top,html')) { $top[] = array('id' => $f, 'name' => waContactFields::get($f)->getName(), 'value' => is_array($v) ? implode(', ', $v) : $v); } } // Workflow stuff: actions and state $workflow = new shopWorkflow(); $workflow_state = $workflow->getStateById($order['state_id']); $workflow_buttons = array(); foreach ($workflow_state->getActions() as $a_id => $action) { if ($a_id === 'edit' || $a_id === 'delete') { continue; } $workflow_buttons[] = $action->getButton(); } $this->view->assign('top', $top); $this->view->assign('log', $log); $this->view->assign('order', $order); $this->view->assign('uniqid', uniqid('f')); $this->view->assign('customer', $customer); $this->view->assign('workflow_state', $workflow_state); $this->view->assign('workflow_buttons', $workflow_buttons); $this->view->assign('shipping_address', $shipping_address); $this->view->assign('billing_address', $billing_address); $this->view->assign('order_subtotal', $order_subtotal); $this->view->assign('currency', ifempty($order['currency'], wa()->getConfig()->getCurrency())); wa()->getResponse()->setTitle(_w('Order') . ' ' . $order['id_str']); parent::execute(); }
/** * Helper to send one message: used during real sending, as well as for test emails from follow-ups settings page. */ public static function sendOne($f, $o, $customer, $contact, $to, $view = null, $general = null) { if (!$view) { $view = wa()->getView(); } if (!$general) { $general = wa('shop')->getConfig()->getGeneralSettings(); } $workflow = new shopWorkflow(); $items_model = new shopOrderItemsModel(); $o['items'] = $items_model->getItems($o['id']); foreach ($o['items'] as &$i) { if (!empty($i['file_name'])) { $i['download_link'] = wa()->getRouteUrl('/frontend/myOrderDownload', array('id' => $o['id'], 'code' => $o['params']['auth_code'], 'item' => $i['id']), true); } } unset($i); // Assign template vars $view->clearAllAssign(); $view->assign('followup', $f); // row from shop_followup $view->assign('order', $o); // row from shop_order, + 'params' key $view->assign('customer', $contact); // shopCustomer $view->assign('order_url', wa()->getRouteUrl('/frontend/myOrderByCode', array('id' => $o['id'], 'code' => $o['params']['auth_code']), true)); $view->assign('status', $workflow->getStateById($o['state_id'])->getName()); // $shipping_address, $billing_address foreach (array('shipping', 'billing') as $k) { $address = shopHelper::getOrderAddress($o['params'], $k); $formatter = new waContactAddressOneLineFormatter(array('image' => false)); $address = $formatter->format(array('data' => $address)); $view->assign($k . '_address', $address['value']); } // Build email from template $subject = $view->fetch('string:' . $f['subject']); $body = $view->fetch('string:' . $f['body']); $from = $general['email']; if ($f['from']) { $from = $f['from']; } // Send the message $message = new waMailMessage($subject, $body); $message->setTo($to); $message->setFrom($from, $general['name']); return $message->send(); }
/** * * formalize order data * @param string|array $order order ID or order data * @param waPayment $payment_plugin * @return waOrder */ public static function getOrderData($order, $payment_plugin = null) { if (!is_array($order)) { $order_id = shopHelper::decodeOrderId($encoded_order_id = $order); if (!$order_id) { $order_id = $encoded_order_id; $encoded_order_id = shopHelper::encodeOrderId($order_id); } $om = new shopOrderModel(); $order = $om->getOrder($order_id); if (!$order) { return null; } $order['id_str'] = $encoded_order_id; } if (!isset($order['id_str'])) { $order['id_str'] = shopHelper::encodeOrderId($order['id']); } if (!isset($order['params'])) { $order_params_model = new shopOrderParamsModel(); $order['params'] = $order_params_model->get($order['id']); } $convert = false; if ($payment_plugin && method_exists($payment_plugin, 'allowedCurrency')) { $currency = $payment_plugin->allowedCurrency(); $total = $order['total']; $currency_id = $order['currency']; if ($currency !== true) { $currency = (array) $currency; if (!in_array($order['currency'], $currency)) { $convert = true; $total = shop_currency($total, $order['currency'], $currency_id = reset($currency), false); } } } else { $currency_id = $order['currency']; $total = $order['total']; } $items = array(); if (!empty($order['items'])) { foreach ($order['items'] as $item) { ifempty($item['price'], 0.0); if ($convert) { $item['price'] = shop_currency($item['price'], $order['currency'], $currency_id, false); } $items[] = array('id' => ifset($item['id']), 'name' => ifset($item['name']), 'sku' => ifset($item['sku_code']), 'description' => '', 'price' => $item['price'], 'quantity' => ifset($item['quantity'], 0), 'total' => $item['price'] * $item['quantity'], 'type' => ifset($item['type'], 'product'), 'product_id' => ifset($item['product_id'])); if (isset($item['weight'])) { $items[count($items) - 1]['weight'] = $item['weight']; } } } $empty_address = array('firstname' => '', 'lastname' => '', 'country' => '', 'region' => '', 'city' => '', 'street' => '', 'zip' => ''); $shipping_address = array_merge($empty_address, shopHelper::getOrderAddress($order['params'], 'shipping')); $billing_address = array_merge($empty_address, shopHelper::getOrderAddress($order['params'], 'billing')); if (!count(array_filter($billing_address, 'strlen'))) { $billing_address = $shipping_address; } ifset($order['shipping'], 0.0); ifset($order['discount'], 0.0); ifset($order['tax'], 0.0); if ($convert) { $order['tax'] = shop_currency($order['tax'], $order['currency'], $currency_id, false); $order['shipping'] = shop_currency($order['shipping'], $order['currency'], $currency_id, false); $order['discount'] = shop_currency($order['discount'], $order['currency'], $currency_id, false); } $order_data = array('id_str' => ifempty($order['id_str'], $order['id']), 'id' => $order['id'], 'contact_id' => $order['contact_id'], 'datetime' => ifempty($order['create_datetime']), 'description' => sprintf(_w('Payment for order %s'), ifempty($order['id_str'], $order['id'])), 'update_datetime' => ifempty($order['update_datetime']), 'paid_datetime' => empty($order['paid_date']) ? null : $order['paid_date'] . ' 00:00:00', 'total' => ifempty($total, $order['total']), 'currency' => ifempty($currency_id, $order['currency']), 'discount' => $order['discount'], 'tax' => $order['tax'], 'payment_name' => ifset($order['params']['payment_name'], ''), 'billing_address' => $billing_address, 'shipping' => $order['shipping'], 'shipping_name' => ifset($order['params']['shipping_name'], ''), 'shipping_address' => $shipping_address, 'items' => $items, 'comment' => ifempty($order['comment'], ''), 'params' => $order['params']); return waOrder::factory($order_data); }
public function execute() { $encoded_order_id = waRequest::param('id'); $order_id = shopHelper::decodeOrderId($encoded_order_id); if (!$order_id) { // fall back to non-encoded id $order_id = $encoded_order_id; $encoded_order_id = shopHelper::encodeOrderId($order_id); } // Check that order exists and belongs to this user $om = new shopOrderModel(); $order = $om->getOrder($order_id); if (!$order || !$this->isAuth($order)) { throw new waException(_w('Order not found'), 404); } if ($order['paid_date']) { foreach ($order['items'] as &$i) { if (!empty($i['file_name'])) { $i['download_link'] = wa()->getRouteUrl('/frontend/myOrderDownload', array('id' => $order['id'], 'code' => $order['params']['auth_code'], 'item' => $i['id']), true); } } unset($i); } $workflow = new shopWorkflow(); $order_params_model = new shopOrderParamsModel(); $order['params'] = $order_params_model->get($order['id']); $order['id_str'] = $encoded_order_id; $order['state'] = $workflow->getStateById($order['state_id']); // Order subtotal $subtotal = 0; foreach ($order['items'] as $item) { $subtotal += $item['price'] * $item['quantity']; } // Order comment $lm = new shopOrderLogModel(); $l = $lm->getByField(array('action_id' => 'create', 'order_id' => $order['id'])); $order['comment'] = ifempty($l['text']); $order['payment_name'] = ifset($order['params']['payment_name'], ''); $order['shipping_name'] = ifset($order['params']['shipping_name'], ''); // Shipping and billing addresses $settings = wa('shop')->getConfig()->getCheckoutSettings(); $form_fields = ifset($settings['contactinfo']['fields'], array()); $formatter = new waContactAddressSeveralLinesFormatter(); $shipping_address = shopHelper::getOrderAddress($order['params'], 'shipping'); if ($shipping_address) { $shipping_address = $formatter->format(array('data' => $shipping_address)); $shipping_address = $shipping_address['value']; } if (isset($form_fields['address.billing'])) { $billing_address = shopHelper::getOrderAddress($order['params'], 'billing'); $billing_address = $formatter->format(array('data' => $billing_address)); $billing_address = $billing_address['value']; } else { $billing_address = null; } if (wa()->getUser()->getId() == $order['contact_id']) { $contact = wa()->getUser(); } else { $contact = new waContact($order['contact_id']); } $payment = ''; if (!empty($order['params']['payment_id']) && !$order['paid_date']) { try { $plugin = shopPayment::getPlugin(null, $order['params']['payment_id']); $payment = $plugin->payment(waRequest::post(), shopPayment::getOrderData($order, $plugin), false); } catch (waException $ex) { $payment = $ex->getMessage(); } } $this->view->assign('payment', $payment); $tracking = ''; if (!empty($order['params']['shipping_id']) && !empty($order['params']['tracking_number'])) { try { $plugin = shopShipping::getPlugin(null, $order['params']['shipping_id']); $tracking = $plugin->tracking($order['params']['tracking_number']); } catch (waException $ex) { $tracking = $ex->getMessage(); } } $this->view->assign('tracking', $tracking); $this->view->assign('order', $order); $this->view->assign('contact', $contact); $this->view->assign('shipping_address', $shipping_address); $this->view->assign('billing_address', $billing_address); $this->view->assign('subtotal', $subtotal); // Set up layout and template from theme $this->setThemeTemplate('my.order.html'); $this->view->assign('my_nav_selected', 'orders'); if (!waRequest::isXMLHttpRequest()) { $this->setLayout(new shopFrontendLayout()); $this->getResponse()->setTitle(_w('Order') . ' ' . $encoded_order_id); $this->view->assign('breadcrumbs', self::getBreadcrumbs()); $this->layout->assign('nofollow', true); } }