public function orderActionCreate($order) { $cart = new shopCart(); $code = $cart->getCode(); $m = new shopCartsreportPluginCartModel(); $m->deleteById($code); }
public function add($data) { // cart code if (empty($data['code'])) { $cart = new shopCart(); $data['code'] = $cart->getCode(); } if (empty($data['step'])) { $data['step'] = 0; } if (empty($data['description'])) { $data['description'] = null; } // if current step of current cart-code with current description exists - ignore if ($this->getByField(array('code' => $data['code'], 'step' => $data['step'], 'description' => $data['description']))) { return true; } if (empty($data['contact_id'])) { $data['contact_id'] = wa()->getUser()->getId(); } $time = time(); $data['year'] = date('Y', $time); $data['month'] = date('m', $time); $data['quarter'] = floor((date('n', $time) - 1) / 3) + 1; $data['date'] = date('Y-m-d', $time); return $this->insert($data); }
public function checkOrder() { $domain_settings = shopOnestep::getDomainSettings(); $cart = new shopCart(); $def_currency = wa('shop')->getConfig()->getCurrency(true); $cur_currency = wa('shop')->getConfig()->getCurrency(false); $total = $cart->total(true); $total = shop_currency($total, $cur_currency, $def_currency, false); $min_sum = $domain_settings['min_sum']; if ($total < $min_sum) { return false; } return true; }
public function checkOrder() { $app_settings_model = new waAppSettingsModel(); $settings = $app_settings_model->get(array('shop', 'onestep')); $cart = new shopCart(); $def_currency = wa('shop')->getConfig()->getCurrency(true); $cur_currency = wa('shop')->getConfig()->getCurrency(false); $total = $cart->total(true); $total = shop_currency($total, $cur_currency, $def_currency, false); $min_sum = $settings['min_sum']; if ($total < $min_sum) { return false; } return true; }
public function execute() { $cart = new shopCart(); $total = $cart->total(); $shipping = new shopCheckoutShipping(); $items = $shipping->getItems(); if (waRequest::method() == 'post') { wa()->getStorage()->close(); $shipping_id = waRequest::post('shipping_id'); $customer = waRequest::post('customer_' . $shipping_id); if (isset($customer['address.shipping'])) { $address = $customer['address.shipping']; } else { $address = array(); } if ($shipping_id) { $this->response = $this->getRates($shipping_id, $items, $address, $total); } else { $this->errors = _w('Shipping is required'); } } elseif ($shipping_ids = waRequest::get('shipping_id', array(), waRequest::TYPE_ARRAY_INT)) { $address = $shipping->getAddress(); wa()->getStorage()->close(); $empty = true; foreach ($address as $v) { if ($v) { $empty = false; break; } } if ($empty) { $address = array(); } if (!$address) { $settings = wa('shop')->getConfig()->getCheckoutSettings(); if ($settings['contactinfo']['fields']['address']) { foreach ($settings['contactinfo']['fields']['address']['fields'] as $k => $f) { if (!empty($f['value'])) { $address[$k] = $f['value']; } } } } foreach ($shipping_ids as $shipping_id) { $this->response[$shipping_id] = $this->getRates($shipping_id, $items, $address, $total); } } }
/** * @param $data */ protected function addService($data) { $item = $this->cart_model->getById($data['parent_id']); if (!$item) { $this->errors = _w('Error'); return; } unset($item['id']); $item['parent_id'] = $data['parent_id']; $item['type'] = 'service'; $item['service_id'] = $data['service_id']; if (isset($data['service_variant_id'])) { $item['service_variant_id'] = $data['service_variant_id']; } else { $service_model = new shopServiceModel(); $service = $service_model->getById($data['service_id']); $item['service_variant_id'] = $service['variant_id']; } $id = $this->cart->addItem($item); $total = $this->cart->total(); $discount = $this->cart->discount(); $this->response['id'] = $id; $this->response['total'] = $this->currencyFormat($total); $this->response['count'] = $this->cart->count(); $this->response['discount'] = $this->currencyFormat($discount); $item_total = $this->cart->getItemTotal($data['parent_id']); $this->response['item_total'] = $this->currencyFormat($item_total); if (shopAffiliate::isEnabled()) { $add_affiliate_bonus = shopAffiliate::calculateBonus(array('total' => $total, 'discount' => $discount, 'items' => $this->cart->items(false))); $this->response['add_affiliate_bonus'] = sprintf(_w("This order will add +%s points to your affiliate bonus."), round($add_affiliate_bonus, 2)); } }
public function update_cart($params = array()) { if (!($tracker = $this->_include_tracker()) or !class_exists('shopCart')) { return false; } $cart = new shopCart(); $products_cart_res = $cart->items(); // fix old cart value if (!empty($params['cart_add'])) { $find_id = false; foreach ($products_cart_res as $id => $product) { if (empty($_REQUEST['sku_id']) and $product['sku_id'] == $params['product_id'] or !empty($_REQUEST['sku_id']) and $product['sku_id'] == $_REQUEST['sku_id']) { $find_id = $id; break; } } if ($find_id) { $products_cart_res[$find_id]['quantity']++; } } if (!empty($params['cart_set_quantity'])) { if (isset($products_cart_res[$params['id']])) { $products_cart_res[$params['id']]['quantity'] = $params['quantity']; } } // / fix old cart value $products_cart = array(); foreach ($products_cart_res as $product) { $product_id = $product['product']['id']; if ($product['sku_id'] != $product['product']['sku_id']) { $product_id .= 's' . $product['sku_id']; } $products_cart[] = array('product_id' => $product_id, 'qnt' => $product['quantity'], 'price' => $product['price'], 'product_name' => $product['name']); } $tracker->eventUpdateCart($products_cart); }
public function execute() { $id = waRequest::post('id'); $cart = new shopCart(); $is_html = waRequest::request('html'); if ($id) { $item = $cart->deleteItem($id); if ($item && !empty($item['parent_id'])) { $item_total = $cart->getItemTotal($item['parent_id']); $this->response['item_total'] = $is_html ? shop_currency_html($item_total, true) : shop_currency($item_total, true); } } $total = $cart->total(); $discount = $cart->discount(); $this->response['total'] = $is_html ? shop_currency_html($total, true) : shop_currency($total, true); $this->response['discount'] = $is_html ? shop_currency_html($discount, true) : shop_currency($discount, true); $this->response['count'] = $cart->count(); if (shopAffiliate::isEnabled()) { $add_affiliate_bonus = shopAffiliate::calculateBonus(array('total' => $total, 'discount' => $discount, 'items' => $cart->items(false))); $this->response['add_affiliate_bonus'] = sprintf(_w("This order will add +%s points to your affiliate bonus."), round($add_affiliate_bonus, 2)); } }
public function execute() { $cart = new shopCart(); $item_id = waRequest::post('id'); $cart_items_model = new shopCartItemsModel(); $item = $cart_items_model->getById($item_id); $is_html = waRequest::request('html'); if ($q = waRequest::post('quantity', 0, 'int')) { if (!wa()->getSetting('ignore_stock_count')) { if ($item['type'] == 'product') { $product_model = new shopProductModel(); $p = $product_model->getById($item['product_id']); $sku_model = new shopProductSkusModel(); $sku = $sku_model->getById($item['sku_id']); // check quantity if ($sku['count'] !== null && $q > $sku['count']) { $q = $sku['count']; $name = $p['name'] . ($sku['name'] ? ' (' . $sku['name'] . ')' : ''); $this->response['error'] = sprintf(_w('Only %d pcs of %s are available, and you already have all of them in your shopping cart.'), $q, $name); $this->response['q'] = $q; } } } $cart->setQuantity($item_id, $q); $this->response['item_total'] = $is_html ? shop_currency_html($cart->getItemTotal($item_id), true) : shop_currency($cart->getItemTotal($item_id), true); } elseif ($v = waRequest::post('service_variant_id')) { $cart->setServiceVariantId($item_id, $v); $this->response['item_total'] = $is_html ? shop_currency_html($cart->getItemTotal($item['parent_id']), true) : shop_currency($cart->getItemTotal($item['parent_id']), true); } $total = $cart->total(); $discount = $cart->discount(); $this->response['total'] = $is_html ? shop_currency_html($total, true) : shop_currency($total, true); $this->response['discount'] = $is_html ? shop_currency_html($discount, true) : shop_currency($discount, true); $this->response['discount_numeric'] = $discount; $this->response['count'] = $cart->count(); if (shopAffiliate::isEnabled()) { $add_affiliate_bonus = shopAffiliate::calculateBonus(array('total' => $total, 'discount' => $discount, 'items' => $cart->items(false))); $this->response['add_affiliate_bonus'] = sprintf(_w("This order will add +%s points to your affiliate bonus."), round($add_affiliate_bonus, 2)); } }
public function display() { $settings = wa('shop')->getConfig()->getCheckoutSettings(); if (!empty($settings['confirmation']['terms']) && waRequest::get('terms')) { echo $settings['confirmation']['terms']; exit; } $cart = new shopCart(); $items = $cart->items(false); $subtotal = $cart->total(false); $order = array('contact' => $this->getContact(), 'total' => $subtotal, 'items' => $items); $order['discount'] = shopDiscounts::calculate($order); $contact = $this->getContact(); $view = wa()->getView(); if (!$contact) { $view->assign('error', _w('Not enough data in the contact information to place the order.')); return; } $shipping_address = $contact->getFirst('address.shipping'); if (!$shipping_address) { $shipping_address = array('data' => array(), 'value' => ''); } $billing_address = $contact->getFirst('address.billing'); if (!$billing_address) { $billing_address = array('data' => array(), 'value' => ''); } $discount_rate = (double) $subtotal ? $order['discount'] / $subtotal : 0; $taxes = shopTaxes::apply($items, array('shipping' => $shipping_address['data'], 'billing' => $billing_address['data'], 'discount_rate' => $discount_rate)); $tax = 0; $tax_included = 0; foreach ($taxes as $t) { if (isset($t['sum'])) { $tax += $t['sum']; } if (isset($t['sum_included'])) { $tax_included += $t['sum_included']; } } if (!isset($order['shipping'])) { $shipping_step = new shopOnestepCheckoutShipping(); $rate = $shipping_step->getRate(); if ($rate) { $order['shipping'] = $rate['rate']; } else { $order['shipping'] = 0; } } $plugin_model = new shopPluginModel(); $params = array(); if ($shipping = $this->getSessionData('shipping')) { $params['shipping_id'] = $shipping['id']; if ($shipping['id']) { $plugin_info = $plugin_model->getById($shipping['id']); $params['shipping_rate_id'] = $shipping['rate_id']; $params['shipping_name'] = $shipping['name']; $params['shipping_description'] = $plugin_info['description']; } } if ($payment_id = $this->getSessionData('payment')) { $params['payment_id'] = $payment_id; $plugin_info = $plugin_model->getById($payment_id); $params['payment_name'] = $plugin_info['name']; $params['payment_plugin'] = $plugin_info['plugin']; $params['payment_description'] = $plugin_info['description']; } $view->assign(array('params' => $params, 'contact' => $contact, 'items' => $items, 'shipping' => $order['shipping'], 'discount' => $order['discount'], 'total' => $subtotal - $order['discount'] + $order['shipping'] + $tax, 'tax' => $tax_included + $tax, 'subtotal' => $subtotal, 'shipping_address' => $shipping_address, 'billing_address' => !empty($settings['contactinfo']['fields']['address.billing']) ? $billing_address : false, 'terms' => !empty($settings['confirmation']['terms']) ? $settings['confirmation']['terms'] : false)); $checkout_flow = new shopCheckoutFlowModel(); $step_number = shopOnestepCheckout::getStepNumber('confirmation'); // IF no errors $checkout_flow->add(array('step' => $step_number)); // ELSE // $checkout_flow->add(array( // 'step' => $step_number, // 'description' => ERROR MESSAGE HERE // )); }
protected function createOrder() { $checkout_data = wa()->getStorage()->get('shop/checkout'); if (wa()->getUser()->isAuth()) { $contact = wa()->getUser(); } else { if (!empty($checkout_data['contact']) && $checkout_data['contact'] instanceof waContact) { $contact = $checkout_data['contact']; } else { $contact = new waContact(); } } $cart = new shopCart(); $items = $cart->items(false); // remove id from item foreach ($items as &$item) { unset($item['id']); unset($item['parent_id']); } unset($item); $order = array('contact' => $contact, 'items' => $items, 'total' => $cart->total(false), 'params' => isset($checkout_data['params']) ? $checkout_data['params'] : array()); $order['discount_description'] = null; $order['discount'] = shopDiscounts::apply($order, $order['discount_description']); if (isset($checkout_data['shipping'])) { $order['params']['shipping_id'] = $checkout_data['shipping']['id']; $order['params']['shipping_rate_id'] = $checkout_data['shipping']['rate_id']; $shipping_step = new shopOnestepCheckoutShipping(); $rate = $shipping_step->getRate($order['params']['shipping_id'], $order['params']['shipping_rate_id']); $order['params']['shipping_plugin'] = $rate['plugin']; $order['params']['shipping_name'] = $rate['name']; if (isset($rate['est_delivery'])) { $order['params']['shipping_est_delivery'] = $rate['est_delivery']; } if (!isset($order['shipping'])) { $order['shipping'] = $rate['rate']; } if (!empty($order['params']['shipping'])) { foreach ($order['params']['shipping'] as $k => $v) { $order['params']['shipping_params_' . $k] = $v; } unset($order['params']['shipping']); } } else { $order['shipping'] = 0; } if (isset($checkout_data['payment'])) { $order['params']['payment_id'] = $checkout_data['payment']; $plugin_model = new shopPluginModel(); $plugin_info = $plugin_model->getById($checkout_data['payment']); $order['params']['payment_name'] = $plugin_info['name']; $order['params']['payment_plugin'] = $plugin_info['plugin']; if (!empty($order['params']['payment'])) { foreach ($order['params']['payment'] as $k => $v) { $order['params']['payment_params_' . $k] = $v; } unset($order['params']['payment']); } } if ($skock_id = waRequest::post('stock_id')) { $order['params']['stock_id'] = $skock_id; } $routing_url = wa()->getRouting()->getRootUrl(); $order['params']['storefront'] = wa()->getConfig()->getDomain() . ($routing_url ? '/' . $routing_url : ''); if ($ref = waRequest::cookie('referer')) { $order['params']['referer'] = $ref; $ref_parts = @parse_url($ref); $order['params']['referer_host'] = $ref_parts['host']; // try get search keywords if (!empty($ref_parts['query'])) { $search_engines = array('text' => 'yandex\\.|rambler\\.', 'q' => 'bing\\.com|mail\\.|google\\.', 's' => 'nigma\\.ru', 'p' => 'yahoo\\.com'); $q_var = false; foreach ($search_engines as $q => $pattern) { if (preg_match('/(' . $pattern . ')/si', $ref_parts['host'])) { $q_var = $q; break; } } // default query var name if (!$q_var) { $q_var = 'q'; } parse_str($ref_parts['query'], $query); if (!empty($query[$q_var])) { $order['params']['keyword'] = $query[$q_var]; } } } if ($utm = waRequest::cookie('utm')) { $utm = json_decode($utm, true); if ($utm && is_array($utm)) { foreach ($utm as $k => $v) { $order['params']['utm_' . $k] = $v; } } } if (($landing = waRequest::cookie('landing')) && ($landing = @parse_url($landing))) { if (!empty($landing['query'])) { @parse_str($landing['query'], $arr); if (!empty($arr['gclid']) && !empty($order['params']['referer_host']) && strpos($order['params']['referer_host'], 'google') !== false) { $order['params']['referer_host'] .= ' (cpc)'; $order['params']['cpc'] = 1; } else { if (!empty($arr['_openstat']) && !empty($order['params']['referer_host']) && strpos($order['params']['referer_host'], 'yandex') !== false) { $order['params']['referer_host'] .= ' (cpc)'; $order['params']['openstat'] = $arr['_openstat']; $order['params']['cpc'] = 1; } } } $order['params']['landing'] = $landing['path']; } // A/B tests /* $abtest_variants_model = new shopAbtestVariantsModel(); foreach (waRequest::cookie() as $k => $v) { if (substr($k, 0, 5) == 'waabt') { $variant_id = $v; $abtest_id = substr($k, 5); if (wa_is_int($abtest_id) && wa_is_int($variant_id)) { $row = $abtest_variants_model->getById($variant_id); if ($row && $row['abtest_id'] == $abtest_id) { $order['params']['abt' . $abtest_id] = $variant_id; } } } } */ $order['params']['ip'] = waRequest::getIp(); $order['params']['user_agent'] = waRequest::getUserAgent(); foreach (array('shipping', 'billing') as $ext) { $address = $contact->getFirst('address.' . $ext); if ($address) { foreach ($address['data'] as $k => $v) { $order['params'][$ext . '_address.' . $k] = $v; } } } if (isset($checkout_data['comment'])) { $order['comment'] = $checkout_data['comment']; } $workflow = new shopWorkflow(); if ($order_id = $workflow->getActionById('create')->run($order)) { $step_number = shopOnestepCheckout::getStepNumber(); $checkout_flow = new shopCheckoutFlowModel(); $checkout_flow->add(array('step' => $step_number)); $cart->clear(); wa()->getStorage()->remove('shop/checkout'); wa()->getStorage()->set('shop/order_id', $order_id); return $order_id; } else { return false; } }
protected function createOrder() { $checkout_data = $this->getStorage()->get('shop/checkout'); $contact = $this->getUser()->isAuth() ? $this->getUser() : $checkout_data['contact']; $cart = new shopCart(); $items = $cart->items(false); // remove id from item foreach ($items as &$item) { unset($item['id']); unset($item['parent_id']); } unset($item); $order = array('contact' => $contact, 'items' => $items, 'total' => $cart->total(false), 'params' => isset($checkout_data['params']) ? $checkout_data['params'] : array()); $order['discount'] = shopDiscounts::apply($order); if (isset($checkout_data['shipping'])) { $order['params']['shipping_id'] = $checkout_data['shipping']['id']; $order['params']['shipping_rate_id'] = $checkout_data['shipping']['rate_id']; $shipping_step = new shopCheckoutShipping(); $rate = $shipping_step->getRate($order['params']['shipping_id'], $order['params']['shipping_rate_id']); $order['params']['shipping_plugin'] = $rate['plugin']; $order['params']['shipping_name'] = $rate['name']; if (isset($rate['est_delivery'])) { $order['params']['shipping_est_delivery'] = $rate['est_delivery']; } if (!isset($order['shipping'])) { $order['shipping'] = $rate['rate']; } if (!empty($order['params']['shipping'])) { foreach ($order['params']['shipping'] as $k => $v) { $order['params']['shipping_params_' . $k] = $v; } unset($order['params']['shipping']); } } else { $order['shipping'] = 0; } if (isset($checkout_data['payment'])) { $order['params']['payment_id'] = $checkout_data['payment']; $plugin_model = new shopPluginModel(); $plugin_info = $plugin_model->getById($checkout_data['payment']); $order['params']['payment_name'] = $plugin_info['name']; $order['params']['payment_plugin'] = $plugin_info['plugin']; if (!empty($order['params']['payment'])) { foreach ($order['params']['payment'] as $k => $v) { $order['params']['payment_params_' . $k] = $v; } unset($order['params']['payment']); } } if ($skock_id = waRequest::post('stock_id')) { $order['params']['stock_id'] = $skock_id; } $routing_url = wa()->getRouting()->getRootUrl(); $order['params']['storefront'] = wa()->getConfig()->getDomain() . ($routing_url ? '/' . $routing_url : ''); if (($ref = wa()->getStorage()->get('shop/referer')) || ($ref = waRequest::cookie('referer'))) { $order['params']['referer'] = $ref; $ref_parts = parse_url($ref); $order['params']['referer_host'] = $ref_parts['host']; // try get search keywords if (!empty($ref_parts['query'])) { $search_engines = array('text' => 'yandex\\.|rambler\\.', 'q' => 'bing\\.com|mail\\.|google\\.', 's' => 'nigma\\.ru', 'p' => 'yahoo\\.com'); $q_var = false; foreach ($search_engines as $q => $pattern) { if (preg_match('/(' . $pattern . ')/si', $ref_parts['host'])) { $q_var = $q; break; } } // default query var name if (!$q_var) { $q_var = 'q'; } parse_str($ref_parts['query'], $query); if (!empty($query[$q_var])) { $order['params']['keyword'] = $query[$q_var]; } } } if ($utm = waRequest::cookie('utm')) { $utm = json_decode($utm, true); if ($utm && is_array($utm)) { foreach ($utm as $k => $v) { $order['params']['utm_' . $k] = $v; } } } $order['params']['ip'] = waRequest::getIp(); $order['params']['user_agent'] = waRequest::getUserAgent(); foreach (array('shipping', 'billing') as $ext) { $address = $contact->getFirst('address.' . $ext); if ($address) { foreach ($address['data'] as $k => $v) { $order['params'][$ext . '_address.' . $k] = $v; } } } if (isset($checkout_data['comment'])) { $order['comment'] = $checkout_data['comment']; } $workflow = new shopWorkflow(); if ($order_id = $workflow->getActionById('create')->run($order)) { $step_number = shopCheckout::getStepNumber(); $checkout_flow = new shopCheckoutFlowModel(); $checkout_flow->add(array('step' => $step_number)); $cart->clear(); wa()->getStorage()->remove('shop/checkout'); wa()->getStorage()->set('shop/order_id', $order_id); return true; } }
public function getRate($id = null, $rate_id = null, $contact = null) { if (!$id) { $shipping = $this->getSessionData('shipping'); if (!$shipping) { return array(); } $id = $shipping['id']; $rate_id = $shipping['rate_id']; } if (!$contact) { $contact = $this->getContact(); } $plugin_model = new shopPluginModel(); $plugin_info = $plugin_model->getById($id); $plugin = shopShipping::getPlugin($plugin_info['plugin'], $id); $cart = new shopCart(); $total = $cart->total(); $currency = $plugin->allowedCurrency(); $currrent_currency = wa()->getConfig()->getCurrency(false); if ($currency != $currrent_currency) { $total = shop_currency($total, $currrent_currency, $currency, false); } $rates = $plugin->getRates($this->getItems($plugin->allowedWeightUnit()), $this->getAddress($contact), array('total_price' => $total)); if (!$rates) { return false; } if (is_string($rates)) { return $rates; } if ($rate_id) { $result = $rates[$rate_id]; } else { $result = array('rate' => 0); } if (is_array($result['rate'])) { $result['rate'] = max($result['rate']); } if ($currency != $currrent_currency) { $result['rate'] = shop_currency($result['rate'], $currency, $currrent_currency, false); } $result['plugin'] = $plugin->getId(); $result['name'] = $plugin_info['name'] . (!empty($result['name']) ? ' (' . $result['name'] . ')' : ''); return $result; }
public function execute() { $this->getResponse()->addHeader("Cache-Control", "no-store, no-cache, must-revalidate"); $this->getResponse()->addHeader("Expires", date("r")); if (waRequest::method() == 'post') { $data = wa()->getStorage()->get('shop/checkout', array()); if ($coupon_code = waRequest::post('coupon_code')) { $data['coupon_code'] = $coupon_code; } elseif (isset($data['coupon_code'])) { unset($data['coupon_code']); } if (($use = waRequest::post('use_affiliate')) !== null) { if ($use) { $data['use_affiliate'] = 1; } elseif (isset($data['use_affiliate'])) { unset($data['use_affiliate']); } } if ($coupon_code || $use) { wa()->getStorage()->set('shop/checkout', $data); wa()->getStorage()->remove('shop/cart'); } } $cart_model = new shopCartItemsModel(); $cart = new shopCart(); $code = $cart->getCode(); $errors = array(); if (waRequest::post('checkout')) { $saved_quantity = $cart_model->select('id,quantity')->where("type='product' AND code = s:code", array('code' => $code))->fetchAll('id'); $quantity = waRequest::post('quantity'); foreach ($quantity as $id => $q) { if ($q != $saved_quantity[$id]) { $cart->setQuantity($id, $q); } } $not_available_items = $cart_model->getNotAvailableProducts($code, !wa()->getSetting('ignore_stock_count')); foreach ($not_available_items as $row) { if ($row['sku_name']) { $row['name'] .= ' (' . $row['sku_name'] . ')'; } if ($row['available']) { $errors[$row['id']] = sprintf(_w('Only %d pcs of %s are available, and you already have all of them in your shopping cart.'), $row['count'], $row['name']); } else { $errors[$row['id']] = _w('Oops! %s is not available for purchase at the moment. Please remove this product from your shopping cart to proceed.'); } } if (!$errors) { $this->redirect(wa()->getRouteUrl('/frontend/checkout')); } } $this->setThemeTemplate('cart.html'); $items = $cart_model->where('code= ?', $code)->order('parent_id')->fetchAll('id'); $product_ids = $sku_ids = $service_ids = $type_ids = array(); foreach ($items as $item) { $product_ids[] = $item['product_id']; $sku_ids[] = $item['sku_id']; } $product_ids = array_unique($product_ids); $sku_ids = array_unique($sku_ids); $product_model = new shopProductModel(); if (waRequest::param('url_type') == 2) { $products = $product_model->getWithCategoryUrl($product_ids); } else { $products = $product_model->getById($product_ids); } $sku_model = new shopProductSkusModel(); $skus = $sku_model->getByField('id', $sku_ids, 'id'); $image_model = new shopProductImagesModel(); $delete_items = array(); foreach ($items as $item_id => &$item) { if (!isset($skus[$item['sku_id']])) { unset($items[$item_id]); $delete_items[] = $item_id; continue; } if ($item['type'] == 'product') { $item['product'] = $products[$item['product_id']]; $sku = $skus[$item['sku_id']]; if ($sku['image_id'] && $sku['image_id'] != $item['product']['image_id']) { $img = $image_model->getById($sku['image_id']); if ($img) { $item['product']['image_id'] = $sku['image_id']; $item['product']['ext'] = $img['ext']; } } $item['sku_name'] = $sku['name']; $item['sku_code'] = $sku['sku']; $item['price'] = $sku['price']; $item['compare_price'] = $sku['compare_price']; $item['currency'] = $item['product']['currency']; $type_ids[] = $item['product']['type_id']; if (isset($errors[$item_id])) { $item['error'] = $errors[$item_id]; if (strpos($item['error'], '%s') !== false) { $item['error'] = sprintf($item['error'], $item['product']['name'] . ($item['sku_name'] ? ' (' . $item['sku_name'] . ')' : '')); } } } } unset($item); if ($delete_items) { $cart_model->deleteByField(array('code' => $code, 'id' => $delete_items)); } $type_ids = array_unique($type_ids); // get available services for all types of products $type_services_model = new shopTypeServicesModel(); $rows = $type_services_model->getByField('type_id', $type_ids, true); $type_services = array(); foreach ($rows as $row) { $service_ids[] = $row['service_id']; $type_services[$row['type_id']][$row['service_id']] = true; } // get services for all products $product_services_model = new shopProductServicesModel(); $rows = $product_services_model->getByProducts($product_ids); $product_services = $sku_services = array(); foreach ($rows as $row) { if ($row['sku_id'] && !in_array($row['sku_id'], $sku_ids)) { continue; } $service_ids[] = $row['service_id']; if (!$row['sku_id']) { $product_services[$row['product_id']][$row['service_id']]['variants'][$row['service_variant_id']] = $row; } if ($row['sku_id']) { $sku_services[$row['sku_id']][$row['service_id']]['variants'][$row['service_variant_id']] = $row; } } $service_ids = array_unique($service_ids); $service_model = new shopServiceModel(); $variant_model = new shopServiceVariantsModel(); $services = $service_model->getByField('id', $service_ids, 'id'); foreach ($services as &$s) { unset($s['id']); } unset($s); $rows = $variant_model->getByField('service_id', $service_ids, true); foreach ($rows as $row) { $services[$row['service_id']]['variants'][$row['id']] = $row; unset($services[$row['service_id']]['variants'][$row['id']]['id']); } foreach ($items as $item_id => $item) { if ($item['type'] == 'product') { $p = $item['product']; $item_services = array(); // services from type settings if (isset($type_services[$p['type_id']])) { foreach ($type_services[$p['type_id']] as $service_id => &$s) { $item_services[$service_id] = $services[$service_id]; } } // services from product settings if (isset($product_services[$item['product_id']])) { foreach ($product_services[$item['product_id']] as $service_id => $s) { if (!isset($s['status']) || $s['status']) { if (!isset($item_services[$service_id])) { $item_services[$service_id] = $services[$service_id]; } // update variants foreach ($s['variants'] as $variant_id => $v) { if ($v['status']) { if ($v['price'] !== null) { $item_services[$service_id]['variants'][$variant_id]['price'] = $v['price']; } } else { unset($item_services[$service_id]['variants'][$variant_id]); } } } elseif (isset($item_services[$service_id])) { // remove disabled service unset($item_services[$service_id]); } } } // services from sku settings if (isset($sku_services[$item['sku_id']])) { foreach ($sku_services[$item['sku_id']] as $service_id => $s) { if (!isset($s['status']) || $s['status']) { // update variants foreach ($s['variants'] as $variant_id => $v) { if ($v['status']) { if ($v['price'] !== null) { $item_services[$service_id]['variants'][$variant_id]['price'] = $v['price']; } } else { unset($item_services[$service_id]['variants'][$variant_id]); } } } elseif (isset($item_services[$service_id])) { // remove disabled service unset($item_services[$service_id]); } } } foreach ($item_services as $s_id => &$s) { if (!$s['variants']) { unset($item_services[$s_id]); continue; } if ($s['currency'] == '%') { foreach ($s['variants'] as $v_id => $v) { $s['variants'][$v_id]['price'] = $v['price'] * $item['price'] / 100; } $s['currency'] = $item['currency']; } if (count($s['variants']) == 1) { $v = reset($s['variants']); $s['price'] = $v['price']; unset($s['variants']); } } unset($s); uasort($item_services, array('shopServiceModel', 'sortServices')); $items[$item_id]['services'] = $item_services; } else { $items[$item['parent_id']]['services'][$item['service_id']]['id'] = $item['id']; if (isset($item['service_variant_id'])) { $items[$item['parent_id']]['services'][$item['service_id']]['variant_id'] = $item['service_variant_id']; } unset($items[$item_id]); } } foreach ($items as $item_id => $item) { $price = shop_currency($item['price'] * $item['quantity'], $item['currency'], null, false); if (isset($item['services'])) { foreach ($item['services'] as $s) { if (!empty($s['id'])) { if (isset($s['variants'])) { $price += shop_currency($s['variants'][$s['variant_id']]['price'] * $item['quantity'], $s['currency'], null, false); } else { $price += shop_currency($s['price'] * $item['quantity'], $s['currency'], null, false); } } } } $items[$item_id]['full_price'] = $price; } $total = $cart->total(false); $order = array('total' => $total, 'items' => $items); $order['discount'] = $discount = shopDiscounts::calculate($order); $order['total'] = $total = $total - $order['discount']; $data = wa()->getStorage()->get('shop/checkout'); $this->view->assign('cart', array('items' => $items, 'total' => $total, 'count' => $cart->count())); $this->view->assign('coupon_code', isset($data['coupon_code']) ? $data['coupon_code'] : ''); if (shopAffiliate::isEnabled()) { $affiliate_bonus = 0; if ($this->getUser()->isAuth()) { $customer_model = new shopCustomerModel(); $customer = $customer_model->getById($this->getUser()->getId()); $affiliate_bonus = $customer ? round($customer['affiliate_bonus'], 2) : 0; } $this->view->assign('affiliate_bonus', $affiliate_bonus); $use = !empty($data['use_affiliate']); $this->view->assign('use_affiliate', $use); if ($use) { $discount -= shop_currency(shopAffiliate::convertBonus($order['params']['affiliate_bonus']), $this->getConfig()->getCurrency(true), null, false); $this->view->assign('used_affiliate_bonus', $order['params']['affiliate_bonus']); } $order['currency'] = $this->getConfig()->getCurrency(false); $add_affiliate_bonus = shopAffiliate::calculateBonus($order); $this->view->assign('add_affiliate_bonus', round($add_affiliate_bonus, 2)); } $this->view->assign('discount', $discount); /** * @event frontend_cart * @return array[string]string $return[%plugin_id%] html output */ $this->view->assign('frontend_cart', wa()->event('frontend_cart')); $this->getResponse()->setTitle(_w('Cart')); $checkout_flow = new shopCheckoutFlowModel(); $checkout_flow->add(array('code' => $code, 'step' => 0, 'description' => null)); }