shop.balmet.com

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

order.php (31220B)


      1 <?php
      2 class ControllerApiOrder extends Controller {
      3 	public function add() {
      4 		$this->load->language('api/order');
      5 
      6 		$json = array();
      7 
      8 		if (!isset($this->session->data['api_id'])) {
      9 			$json['error'] = $this->language->get('error_permission');
     10 		} else {
     11 			// Customer
     12 			if (!isset($this->session->data['customer'])) {
     13 				$json['error'] = $this->language->get('error_customer');
     14 			}
     15 
     16 			// Payment Address
     17 			if (!isset($this->session->data['payment_address'])) {
     18 				$json['error'] = $this->language->get('error_payment_address');
     19 			}
     20 
     21 			// Payment Method
     22 			if (!$json && !empty($this->request->post['payment_method'])) {
     23 				if (empty($this->session->data['payment_methods'])) {
     24 					$json['error'] = $this->language->get('error_no_payment');
     25 				} elseif (!isset($this->session->data['payment_methods'][$this->request->post['payment_method']])) {
     26 					$json['error'] = $this->language->get('error_payment_method');
     27 				}
     28 
     29 				if (!$json) {
     30 					$this->session->data['payment_method'] = $this->session->data['payment_methods'][$this->request->post['payment_method']];
     31 				}
     32 			}
     33 
     34 			if (!isset($this->session->data['payment_method'])) {
     35 				$json['error'] = $this->language->get('error_payment_method');
     36 			}
     37 
     38 			// Shipping
     39 			if ($this->cart->hasShipping()) {
     40 				// Shipping Address
     41 				if (!isset($this->session->data['shipping_address'])) {
     42 					$json['error'] = $this->language->get('error_shipping_address');
     43 				}
     44 
     45 				// Shipping Method
     46 				if (!$json && !empty($this->request->post['shipping_method'])) {
     47 					if (empty($this->session->data['shipping_methods'])) {
     48 						$json['error'] = $this->language->get('error_no_shipping');
     49 					} else {
     50 						$shipping = explode('.', $this->request->post['shipping_method']);
     51 
     52 						if (!isset($shipping[0]) || !isset($shipping[1]) || !isset($this->session->data['shipping_methods'][$shipping[0]]['quote'][$shipping[1]])) {
     53 							$json['error'] = $this->language->get('error_shipping_method');
     54 						}
     55 					}
     56 
     57 					if (!$json) {
     58 						$this->session->data['shipping_method'] = $this->session->data['shipping_methods'][$shipping[0]]['quote'][$shipping[1]];
     59 					}
     60 				}
     61 
     62 				// Shipping Method
     63 				if (!isset($this->session->data['shipping_method'])) {
     64 					$json['error'] = $this->language->get('error_shipping_method');
     65 				}
     66 			} else {
     67 				unset($this->session->data['shipping_address']);
     68 				unset($this->session->data['shipping_method']);
     69 				unset($this->session->data['shipping_methods']);
     70 			}
     71 
     72 			// Cart
     73 			if ((!$this->cart->hasProducts() && empty($this->session->data['vouchers'])) || (!$this->cart->hasStock() && !$this->config->get('config_stock_checkout'))) {
     74 				$json['error'] = $this->language->get('error_stock');
     75 			}
     76 
     77 			// Validate minimum quantity requirements.
     78 			$products = $this->cart->getProducts();
     79 
     80 			foreach ($products as $product) {
     81 				$product_total = 0;
     82 
     83 				foreach ($products as $product_2) {
     84 					if ($product_2['product_id'] == $product['product_id']) {
     85 						$product_total += $product_2['quantity'];
     86 					}
     87 				}
     88 
     89 				if ($product['minimum'] > $product_total) {
     90 					$json['error'] = sprintf($this->language->get('error_minimum'), $product['name'], $product['minimum']);
     91 
     92 					break;
     93 				}
     94 			}
     95 
     96 			if (!$json) {
     97 				$json['success'] = $this->language->get('text_success');
     98 				
     99 				$order_data = array();
    100 
    101 				// Store Details
    102 				$order_data['invoice_prefix'] = $this->config->get('config_invoice_prefix');
    103 				$order_data['store_id'] = $this->config->get('config_store_id');
    104 				$order_data['store_name'] = $this->config->get('config_name');
    105 				$order_data['store_url'] = $this->config->get('config_url');
    106 
    107 				// Customer Details
    108 				$order_data['customer_id'] = $this->session->data['customer']['customer_id'];
    109 				$order_data['customer_group_id'] = $this->session->data['customer']['customer_group_id'];
    110 				$order_data['firstname'] = $this->session->data['customer']['firstname'];
    111 				$order_data['lastname'] = $this->session->data['customer']['lastname'];
    112 				$order_data['email'] = $this->session->data['customer']['email'];
    113 				$order_data['telephone'] = $this->session->data['customer']['telephone'];
    114 				$order_data['custom_field'] = $this->session->data['customer']['custom_field'];
    115 
    116 				// Payment Details
    117 				$order_data['payment_firstname'] = $this->session->data['payment_address']['firstname'];
    118 				$order_data['payment_lastname'] = $this->session->data['payment_address']['lastname'];
    119 				$order_data['payment_company'] = $this->session->data['payment_address']['company'];
    120 				$order_data['payment_address_1'] = $this->session->data['payment_address']['address_1'];
    121 				$order_data['payment_address_2'] = $this->session->data['payment_address']['address_2'];
    122 				$order_data['payment_city'] = $this->session->data['payment_address']['city'];
    123 				$order_data['payment_postcode'] = $this->session->data['payment_address']['postcode'];
    124 				$order_data['payment_zone'] = $this->session->data['payment_address']['zone'];
    125 				$order_data['payment_zone_id'] = $this->session->data['payment_address']['zone_id'];
    126 				$order_data['payment_country'] = $this->session->data['payment_address']['country'];
    127 				$order_data['payment_country_id'] = $this->session->data['payment_address']['country_id'];
    128 				$order_data['payment_address_format'] = $this->session->data['payment_address']['address_format'];
    129 				$order_data['payment_custom_field'] = (isset($this->session->data['payment_address']['custom_field']) ? $this->session->data['payment_address']['custom_field'] : array());
    130 
    131 				if (isset($this->session->data['payment_method']['title'])) {
    132 					$order_data['payment_method'] = $this->session->data['payment_method']['title'];
    133 				} else {
    134 					$order_data['payment_method'] = '';
    135 				}
    136 
    137 				if (isset($this->session->data['payment_method']['code'])) {
    138 					$order_data['payment_code'] = $this->session->data['payment_method']['code'];
    139 				} else {
    140 					$order_data['payment_code'] = '';
    141 				}
    142 
    143 				// Shipping Details
    144 				if ($this->cart->hasShipping()) {
    145 					$order_data['shipping_firstname'] = $this->session->data['shipping_address']['firstname'];
    146 					$order_data['shipping_lastname'] = $this->session->data['shipping_address']['lastname'];
    147 					$order_data['shipping_company'] = $this->session->data['shipping_address']['company'];
    148 					$order_data['shipping_address_1'] = $this->session->data['shipping_address']['address_1'];
    149 					$order_data['shipping_address_2'] = $this->session->data['shipping_address']['address_2'];
    150 					$order_data['shipping_city'] = $this->session->data['shipping_address']['city'];
    151 					$order_data['shipping_postcode'] = $this->session->data['shipping_address']['postcode'];
    152 					$order_data['shipping_zone'] = $this->session->data['shipping_address']['zone'];
    153 					$order_data['shipping_zone_id'] = $this->session->data['shipping_address']['zone_id'];
    154 					$order_data['shipping_country'] = $this->session->data['shipping_address']['country'];
    155 					$order_data['shipping_country_id'] = $this->session->data['shipping_address']['country_id'];
    156 					$order_data['shipping_address_format'] = $this->session->data['shipping_address']['address_format'];
    157 					$order_data['shipping_custom_field'] = (isset($this->session->data['shipping_address']['custom_field']) ? $this->session->data['shipping_address']['custom_field'] : array());
    158 
    159 					if (isset($this->session->data['shipping_method']['title'])) {
    160 						$order_data['shipping_method'] = $this->session->data['shipping_method']['title'];
    161 					} else {
    162 						$order_data['shipping_method'] = '';
    163 					}
    164 
    165 					if (isset($this->session->data['shipping_method']['code'])) {
    166 						$order_data['shipping_code'] = $this->session->data['shipping_method']['code'];
    167 					} else {
    168 						$order_data['shipping_code'] = '';
    169 					}
    170 				} else {
    171 					$order_data['shipping_firstname'] = '';
    172 					$order_data['shipping_lastname'] = '';
    173 					$order_data['shipping_company'] = '';
    174 					$order_data['shipping_address_1'] = '';
    175 					$order_data['shipping_address_2'] = '';
    176 					$order_data['shipping_city'] = '';
    177 					$order_data['shipping_postcode'] = '';
    178 					$order_data['shipping_zone'] = '';
    179 					$order_data['shipping_zone_id'] = '';
    180 					$order_data['shipping_country'] = '';
    181 					$order_data['shipping_country_id'] = '';
    182 					$order_data['shipping_address_format'] = '';
    183 					$order_data['shipping_custom_field'] = array();
    184 					$order_data['shipping_method'] = '';
    185 					$order_data['shipping_code'] = '';
    186 				}
    187 
    188 				// Products
    189 				$order_data['products'] = array();
    190 
    191 				foreach ($this->cart->getProducts() as $product) {
    192 					$option_data = array();
    193 
    194 					foreach ($product['option'] as $option) {
    195 						$option_data[] = array(
    196 							'product_option_id'       => $option['product_option_id'],
    197 							'product_option_value_id' => $option['product_option_value_id'],
    198 							'option_id'               => $option['option_id'],
    199 							'option_value_id'         => $option['option_value_id'],
    200 							'name'                    => $option['name'],
    201 							'value'                   => $option['value'],
    202 							'type'                    => $option['type']
    203 						);
    204 					}
    205 
    206 					$order_data['products'][] = array(
    207 						'product_id' => $product['product_id'],
    208 						'name'       => $product['name'],
    209 						'model'      => $product['model'],
    210 						'option'     => $option_data,
    211 						'download'   => $product['download'],
    212 						'quantity'   => $product['quantity'],
    213 						'subtract'   => $product['subtract'],
    214 						'price'      => $product['price'],
    215 						'total'      => $product['total'],
    216 						'tax'        => $this->tax->getTax($product['price'], $product['tax_class_id']),
    217 						'reward'     => $product['reward']
    218 					);
    219 				}
    220 
    221 				// Gift Voucher
    222 				$order_data['vouchers'] = array();
    223 
    224 				if (!empty($this->session->data['vouchers'])) {
    225 					foreach ($this->session->data['vouchers'] as $voucher) {
    226 						$order_data['vouchers'][] = array(
    227 							'description'      => $voucher['description'],
    228 							'code'             => token(10),
    229 							'to_name'          => $voucher['to_name'],
    230 							'to_email'         => $voucher['to_email'],
    231 							'from_name'        => $voucher['from_name'],
    232 							'from_email'       => $voucher['from_email'],
    233 							'voucher_theme_id' => $voucher['voucher_theme_id'],
    234 							'message'          => $voucher['message'],
    235 							'amount'           => $voucher['amount']
    236 						);
    237 					}
    238 				}
    239 
    240 				// Order Totals
    241 				$this->load->model('setting/extension');
    242 
    243 				$totals = array();
    244 				$taxes = $this->cart->getTaxes();
    245 				$total = 0;
    246 
    247 				// Because __call can not keep var references so we put them into an array.
    248 				$total_data = array(
    249 					'totals' => &$totals,
    250 					'taxes'  => &$taxes,
    251 					'total'  => &$total
    252 				);
    253 			
    254 				$sort_order = array();
    255 
    256 				$results = $this->model_setting_extension->getExtensions('total');
    257 
    258 				foreach ($results as $key => $value) {
    259 					$sort_order[$key] = $this->config->get('total_' . $value['code'] . '_sort_order');
    260 				}
    261 
    262 				array_multisort($sort_order, SORT_ASC, $results);
    263 
    264 				foreach ($results as $result) {
    265 					if ($this->config->get('total_' . $result['code'] . '_status')) {
    266 						$this->load->model('extension/total/' . $result['code']);
    267 						
    268 						// We have to put the totals in an array so that they pass by reference.
    269 						$this->{'model_extension_total_' . $result['code']}->getTotal($total_data);
    270 					}
    271 				}
    272 
    273 				$sort_order = array();
    274 
    275 				foreach ($total_data['totals'] as $key => $value) {
    276 					$sort_order[$key] = $value['sort_order'];
    277 				}
    278 
    279 				array_multisort($sort_order, SORT_ASC, $total_data['totals']);
    280 
    281 				$order_data = array_merge($order_data, $total_data);
    282 
    283 				if (isset($this->request->post['comment'])) {
    284 					$order_data['comment'] = $this->request->post['comment'];
    285 				} else {
    286 					$order_data['comment'] = '';
    287 				}
    288 
    289 				if (isset($this->request->post['affiliate_id'])) {
    290 					$subtotal = $this->cart->getSubTotal();
    291 
    292 					// Affiliate
    293 					$this->load->model('account/customer');
    294 
    295 					$affiliate_info = $this->model_account_customer->getAffiliate($this->request->post['affiliate_id']);
    296 
    297 					if ($affiliate_info) {
    298 						$order_data['affiliate_id'] = $affiliate_info['customer_id'];
    299 						$order_data['commission'] = ($subtotal / 100) * $affiliate_info['commission'];
    300 					} else {
    301 						$order_data['affiliate_id'] = 0;
    302 						$order_data['commission'] = 0;
    303 					}
    304 
    305 					// Marketing
    306 					$order_data['marketing_id'] = 0;
    307 					$order_data['tracking'] = '';
    308 				} else {
    309 					$order_data['affiliate_id'] = 0;
    310 					$order_data['commission'] = 0;
    311 					$order_data['marketing_id'] = 0;
    312 					$order_data['tracking'] = '';
    313 				}
    314 
    315 				$order_data['language_id'] = $this->config->get('config_language_id');
    316 				$order_data['currency_id'] = $this->currency->getId($this->session->data['currency']);
    317 				$order_data['currency_code'] = $this->session->data['currency'];
    318 				$order_data['currency_value'] = $this->currency->getValue($this->session->data['currency']);
    319 				$order_data['ip'] = $this->request->server['REMOTE_ADDR'];
    320 
    321 				if (!empty($this->request->server['HTTP_X_FORWARDED_FOR'])) {
    322 					$order_data['forwarded_ip'] = $this->request->server['HTTP_X_FORWARDED_FOR'];
    323 				} elseif (!empty($this->request->server['HTTP_CLIENT_IP'])) {
    324 					$order_data['forwarded_ip'] = $this->request->server['HTTP_CLIENT_IP'];
    325 				} else {
    326 					$order_data['forwarded_ip'] = '';
    327 				}
    328 
    329 				if (isset($this->request->server['HTTP_USER_AGENT'])) {
    330 					$order_data['user_agent'] = $this->request->server['HTTP_USER_AGENT'];
    331 				} else {
    332 					$order_data['user_agent'] = '';
    333 				}
    334 
    335 				if (isset($this->request->server['HTTP_ACCEPT_LANGUAGE'])) {
    336 					$order_data['accept_language'] = $this->request->server['HTTP_ACCEPT_LANGUAGE'];
    337 				} else {
    338 					$order_data['accept_language'] = '';
    339 				}
    340 
    341 				$this->load->model('checkout/order');
    342 
    343 				$json['order_id'] = $this->model_checkout_order->addOrder($order_data);
    344 
    345 				// Set the order history
    346 				if (isset($this->request->post['order_status_id'])) {
    347 					$order_status_id = $this->request->post['order_status_id'];
    348 				} else {
    349 					$order_status_id = $this->config->get('config_order_status_id');
    350 				}
    351 
    352 				$this->model_checkout_order->addOrderHistory($json['order_id'], $order_status_id);
    353 				
    354 				// clear cart since the order has already been successfully stored.
    355 				$this->cart->clear();
    356 			}
    357 		}
    358 
    359 		$this->response->addHeader('Content-Type: application/json');
    360 		$this->response->setOutput(json_encode($json));
    361 	}
    362 
    363 	public function edit() {
    364 		$this->load->language('api/order');
    365 
    366 		$json = array();
    367 
    368 		if (!isset($this->session->data['api_id'])) {
    369 			$json['error'] = $this->language->get('error_permission');
    370 		} else {
    371 			$this->load->model('checkout/order');
    372 
    373 			if (isset($this->request->get['order_id'])) {
    374 				$order_id = $this->request->get['order_id'];
    375 			} else {
    376 				$order_id = 0;
    377 			}
    378 
    379 			$order_info = $this->model_checkout_order->getOrder($order_id);
    380 
    381 			if ($order_info) {
    382 				// Customer
    383 				if (!isset($this->session->data['customer'])) {
    384 					$json['error'] = $this->language->get('error_customer');
    385 				}
    386 
    387 				// Payment Address
    388 				if (!isset($this->session->data['payment_address'])) {
    389 					$json['error'] = $this->language->get('error_payment_address');
    390 				}
    391 
    392 				// Payment Method
    393 				if (!$json && !empty($this->request->post['payment_method'])) {
    394 					if (empty($this->session->data['payment_methods'])) {
    395 						$json['error'] = $this->language->get('error_no_payment');
    396 					} elseif (!isset($this->session->data['payment_methods'][$this->request->post['payment_method']])) {
    397 						$json['error'] = $this->language->get('error_payment_method');
    398 					}
    399 
    400 					if (!$json) {
    401 						$this->session->data['payment_method'] = $this->session->data['payment_methods'][$this->request->post['payment_method']];
    402 					}
    403 				}
    404 
    405 				if (!isset($this->session->data['payment_method'])) {
    406 					$json['error'] = $this->language->get('error_payment_method');
    407 				}
    408 
    409 				// Shipping
    410 				if ($this->cart->hasShipping()) {
    411 					// Shipping Address
    412 					if (!isset($this->session->data['shipping_address'])) {
    413 						$json['error'] = $this->language->get('error_shipping_address');
    414 					}
    415 
    416 					// Shipping Method
    417 					if (!$json && !empty($this->request->post['shipping_method'])) {
    418 						if (empty($this->session->data['shipping_methods'])) {
    419 							$json['error'] = $this->language->get('error_no_shipping');
    420 						} else {
    421 							$shipping = explode('.', $this->request->post['shipping_method']);
    422 
    423 							if (!isset($shipping[0]) || !isset($shipping[1]) || !isset($this->session->data['shipping_methods'][$shipping[0]]['quote'][$shipping[1]])) {
    424 								$json['error'] = $this->language->get('error_shipping_method');
    425 							}
    426 						}
    427 
    428 						if (!$json) {
    429 							$this->session->data['shipping_method'] = $this->session->data['shipping_methods'][$shipping[0]]['quote'][$shipping[1]];
    430 						}
    431 					}
    432 
    433 					if (!isset($this->session->data['shipping_method'])) {
    434 						$json['error'] = $this->language->get('error_shipping_method');
    435 					}
    436 				} else {
    437 					unset($this->session->data['shipping_address']);
    438 					unset($this->session->data['shipping_method']);
    439 					unset($this->session->data['shipping_methods']);
    440 				}
    441 
    442 				// Cart
    443 				if ((!$this->cart->hasProducts() && empty($this->session->data['vouchers'])) || (!$this->cart->hasStock() && !$this->config->get('config_stock_checkout'))) {
    444 					$json['error'] = $this->language->get('error_stock');
    445 				}
    446 
    447 				// Validate minimum quantity requirements.
    448 				$products = $this->cart->getProducts();
    449 
    450 				foreach ($products as $product) {
    451 					$product_total = 0;
    452 
    453 					foreach ($products as $product_2) {
    454 						if ($product_2['product_id'] == $product['product_id']) {
    455 							$product_total += $product_2['quantity'];
    456 						}
    457 					}
    458 
    459 					if ($product['minimum'] > $product_total) {
    460 						$json['error'] = sprintf($this->language->get('error_minimum'), $product['name'], $product['minimum']);
    461 
    462 						break;
    463 					}
    464 				}
    465 
    466 				if (!$json) {
    467 					$json['success'] = $this->language->get('text_success');
    468 					
    469 					$order_data = array();
    470 
    471 					// Store Details
    472 					$order_data['invoice_prefix'] = $this->config->get('config_invoice_prefix');
    473 					$order_data['store_id'] = $this->config->get('config_store_id');
    474 					$order_data['store_name'] = $this->config->get('config_name');
    475 					$order_data['store_url'] = $this->config->get('config_url');
    476 
    477 					// Customer Details
    478 					$order_data['customer_id'] = $this->session->data['customer']['customer_id'];
    479 					$order_data['customer_group_id'] = $this->session->data['customer']['customer_group_id'];
    480 					$order_data['firstname'] = $this->session->data['customer']['firstname'];
    481 					$order_data['lastname'] = $this->session->data['customer']['lastname'];
    482 					$order_data['email'] = $this->session->data['customer']['email'];
    483 					$order_data['telephone'] = $this->session->data['customer']['telephone'];
    484 					$order_data['custom_field'] = $this->session->data['customer']['custom_field'];
    485 
    486 					// Payment Details
    487 					$order_data['payment_firstname'] = $this->session->data['payment_address']['firstname'];
    488 					$order_data['payment_lastname'] = $this->session->data['payment_address']['lastname'];
    489 					$order_data['payment_company'] = $this->session->data['payment_address']['company'];
    490 					$order_data['payment_address_1'] = $this->session->data['payment_address']['address_1'];
    491 					$order_data['payment_address_2'] = $this->session->data['payment_address']['address_2'];
    492 					$order_data['payment_city'] = $this->session->data['payment_address']['city'];
    493 					$order_data['payment_postcode'] = $this->session->data['payment_address']['postcode'];
    494 					$order_data['payment_zone'] = $this->session->data['payment_address']['zone'];
    495 					$order_data['payment_zone_id'] = $this->session->data['payment_address']['zone_id'];
    496 					$order_data['payment_country'] = $this->session->data['payment_address']['country'];
    497 					$order_data['payment_country_id'] = $this->session->data['payment_address']['country_id'];
    498 					$order_data['payment_address_format'] = $this->session->data['payment_address']['address_format'];
    499 					$order_data['payment_custom_field'] = $this->session->data['payment_address']['custom_field'];
    500 
    501 					if (isset($this->session->data['payment_method']['title'])) {
    502 						$order_data['payment_method'] = $this->session->data['payment_method']['title'];
    503 					} else {
    504 						$order_data['payment_method'] = '';
    505 					}
    506 
    507 					if (isset($this->session->data['payment_method']['code'])) {
    508 						$order_data['payment_code'] = $this->session->data['payment_method']['code'];
    509 					} else {
    510 						$order_data['payment_code'] = '';
    511 					}
    512 
    513 					// Shipping Details
    514 					if ($this->cart->hasShipping()) {
    515 						$order_data['shipping_firstname'] = $this->session->data['shipping_address']['firstname'];
    516 						$order_data['shipping_lastname'] = $this->session->data['shipping_address']['lastname'];
    517 						$order_data['shipping_company'] = $this->session->data['shipping_address']['company'];
    518 						$order_data['shipping_address_1'] = $this->session->data['shipping_address']['address_1'];
    519 						$order_data['shipping_address_2'] = $this->session->data['shipping_address']['address_2'];
    520 						$order_data['shipping_city'] = $this->session->data['shipping_address']['city'];
    521 						$order_data['shipping_postcode'] = $this->session->data['shipping_address']['postcode'];
    522 						$order_data['shipping_zone'] = $this->session->data['shipping_address']['zone'];
    523 						$order_data['shipping_zone_id'] = $this->session->data['shipping_address']['zone_id'];
    524 						$order_data['shipping_country'] = $this->session->data['shipping_address']['country'];
    525 						$order_data['shipping_country_id'] = $this->session->data['shipping_address']['country_id'];
    526 						$order_data['shipping_address_format'] = $this->session->data['shipping_address']['address_format'];
    527 						$order_data['shipping_custom_field'] = $this->session->data['shipping_address']['custom_field'];
    528 
    529 						if (isset($this->session->data['shipping_method']['title'])) {
    530 							$order_data['shipping_method'] = $this->session->data['shipping_method']['title'];
    531 						} else {
    532 							$order_data['shipping_method'] = '';
    533 						}
    534 
    535 						if (isset($this->session->data['shipping_method']['code'])) {
    536 							$order_data['shipping_code'] = $this->session->data['shipping_method']['code'];
    537 						} else {
    538 							$order_data['shipping_code'] = '';
    539 						}
    540 					} else {
    541 						$order_data['shipping_firstname'] = '';
    542 						$order_data['shipping_lastname'] = '';
    543 						$order_data['shipping_company'] = '';
    544 						$order_data['shipping_address_1'] = '';
    545 						$order_data['shipping_address_2'] = '';
    546 						$order_data['shipping_city'] = '';
    547 						$order_data['shipping_postcode'] = '';
    548 						$order_data['shipping_zone'] = '';
    549 						$order_data['shipping_zone_id'] = '';
    550 						$order_data['shipping_country'] = '';
    551 						$order_data['shipping_country_id'] = '';
    552 						$order_data['shipping_address_format'] = '';
    553 						$order_data['shipping_custom_field'] = array();
    554 						$order_data['shipping_method'] = '';
    555 						$order_data['shipping_code'] = '';
    556 					}
    557 
    558 					// Products
    559 					$order_data['products'] = array();
    560 
    561 					foreach ($this->cart->getProducts() as $product) {
    562 						$option_data = array();
    563 
    564 						foreach ($product['option'] as $option) {
    565 							$option_data[] = array(
    566 								'product_option_id'       => $option['product_option_id'],
    567 								'product_option_value_id' => $option['product_option_value_id'],
    568 								'option_id'               => $option['option_id'],
    569 								'option_value_id'         => $option['option_value_id'],
    570 								'name'                    => $option['name'],
    571 								'value'                   => $option['value'],
    572 								'type'                    => $option['type']
    573 							);
    574 						}
    575 
    576 						$order_data['products'][] = array(
    577 							'product_id' => $product['product_id'],
    578 							'name'       => $product['name'],
    579 							'model'      => $product['model'],
    580 							'option'     => $option_data,
    581 							'download'   => $product['download'],
    582 							'quantity'   => $product['quantity'],
    583 							'subtract'   => $product['subtract'],
    584 							'price'      => $product['price'],
    585 							'total'      => $product['total'],
    586 							'tax'        => $this->tax->getTax($product['price'], $product['tax_class_id']),
    587 							'reward'     => $product['reward']
    588 						);
    589 					}
    590 
    591 					// Gift Voucher
    592 					$order_data['vouchers'] = array();
    593 
    594 					if (!empty($this->session->data['vouchers'])) {
    595 						foreach ($this->session->data['vouchers'] as $voucher) {
    596 							$order_data['vouchers'][] = array(
    597 								'description'      => $voucher['description'],
    598 								'code'             => token(10),
    599 								'to_name'          => $voucher['to_name'],
    600 								'to_email'         => $voucher['to_email'],
    601 								'from_name'        => $voucher['from_name'],
    602 								'from_email'       => $voucher['from_email'],
    603 								'voucher_theme_id' => $voucher['voucher_theme_id'],
    604 								'message'          => $voucher['message'],
    605 								'amount'           => $voucher['amount']
    606 							);
    607 						}
    608 					}
    609 
    610 					// Order Totals
    611 					$this->load->model('setting/extension');
    612 
    613 					$totals = array();
    614 					$taxes = $this->cart->getTaxes();
    615 					$total = 0;
    616 					
    617 					// Because __call can not keep var references so we put them into an array. 
    618 					$total_data = array(
    619 						'totals' => &$totals,
    620 						'taxes'  => &$taxes,
    621 						'total'  => &$total
    622 					);
    623 			
    624 					$sort_order = array();
    625 
    626 					$results = $this->model_setting_extension->getExtensions('total');
    627 
    628 					foreach ($results as $key => $value) {
    629 						$sort_order[$key] = $this->config->get('total_' . $value['code'] . '_sort_order');
    630 					}
    631 
    632 					array_multisort($sort_order, SORT_ASC, $results);
    633 
    634 					foreach ($results as $result) {
    635 						if ($this->config->get('total_' . $result['code'] . '_status')) {
    636 							$this->load->model('extension/total/' . $result['code']);
    637 							
    638 							// We have to put the totals in an array so that they pass by reference.
    639 							$this->{'model_extension_total_' . $result['code']}->getTotal($total_data);
    640 						}
    641 					}
    642 
    643 					$sort_order = array();
    644 
    645 					foreach ($total_data['totals'] as $key => $value) {
    646 						$sort_order[$key] = $value['sort_order'];
    647 					}
    648 
    649 					array_multisort($sort_order, SORT_ASC, $total_data['totals']);
    650 
    651 					$order_data = array_merge($order_data, $total_data);
    652 
    653 					if (isset($this->request->post['comment'])) {
    654 						$order_data['comment'] = $this->request->post['comment'];
    655 					} else {
    656 						$order_data['comment'] = '';
    657 					}
    658 
    659 					if (isset($this->request->post['affiliate_id'])) {
    660 						$subtotal = $this->cart->getSubTotal();
    661 
    662 						// Affiliate
    663 						$this->load->model('account/customer');
    664 
    665 						$affiliate_info = $this->model_account_customer->getAffiliate($this->request->post['affiliate_id']);
    666 
    667 						if ($affiliate_info) {
    668 							$order_data['affiliate_id'] = $affiliate_info['customer_id'];
    669 							$order_data['commission'] = ($subtotal / 100) * $affiliate_info['commission'];
    670 						} else {
    671 							$order_data['affiliate_id'] = 0;
    672 							$order_data['commission'] = 0;
    673 						}
    674 					} else {
    675 						$order_data['affiliate_id'] = 0;
    676 						$order_data['commission'] = 0;
    677 					}
    678 
    679 					$this->model_checkout_order->editOrder($order_id, $order_data);
    680 
    681 					// Set the order history
    682 					if (isset($this->request->post['order_status_id'])) {
    683 						$order_status_id = $this->request->post['order_status_id'];
    684 					} else {
    685 						$order_status_id = $this->config->get('config_order_status_id');
    686 					}
    687 					
    688 					$this->model_checkout_order->addOrderHistory($order_id, $order_status_id);
    689 				}
    690 			} else {
    691 				$json['error'] = $this->language->get('error_not_found');
    692 			}
    693 		}
    694 
    695 		$this->response->addHeader('Content-Type: application/json');
    696 		$this->response->setOutput(json_encode($json));
    697 	}
    698 
    699 	public function delete() {
    700 		$this->load->language('api/order');
    701 
    702 		$json = array();
    703 
    704 		if (!isset($this->session->data['api_id'])) {
    705 			$json['error'] = $this->language->get('error_permission');
    706 		} else {
    707 			$this->load->model('checkout/order');
    708 
    709 			if (isset($this->request->get['order_id'])) {
    710 				$order_id = $this->request->get['order_id'];
    711 			} else {
    712 				$order_id = 0;
    713 			}
    714 
    715 			$order_info = $this->model_checkout_order->getOrder($order_id);
    716 
    717 			if ($order_info) {
    718 				$this->model_checkout_order->deleteOrder($order_id);
    719 
    720 				$json['success'] = $this->language->get('text_success');
    721 			} else {
    722 				$json['error'] = $this->language->get('error_not_found');
    723 			}
    724 		}
    725 		
    726 		$this->response->addHeader('Content-Type: application/json');
    727 		$this->response->setOutput(json_encode($json));
    728 	}
    729 
    730 	public function info() {
    731 		$this->load->language('api/order');
    732 
    733 		$json = array();
    734 
    735 		if (!isset($this->session->data['api_id'])) {
    736 			$json['error'] = $this->language->get('error_permission');
    737 		} else {
    738 			$this->load->model('checkout/order');
    739 
    740 			if (isset($this->request->get['order_id'])) {
    741 				$order_id = $this->request->get['order_id'];
    742 			} else {
    743 				$order_id = 0;
    744 			}
    745 
    746 			$order_info = $this->model_checkout_order->getOrder($order_id);
    747 
    748 			if ($order_info) {
    749 				$json['order'] = $order_info;
    750 
    751 				$json['success'] = $this->language->get('text_success');
    752 			} else {
    753 				$json['error'] = $this->language->get('error_not_found');
    754 			}
    755 		}
    756 
    757 		$this->response->addHeader('Content-Type: application/json');
    758 		$this->response->setOutput(json_encode($json));
    759 	}
    760 
    761 	public function history() {
    762 		$this->load->language('api/order');
    763 
    764 		$json = array();
    765 
    766 		if (!isset($this->session->data['api_id'])) {
    767 			$json['error'] = $this->language->get('error_permission');
    768 		} else {
    769 			// Add keys for missing post vars
    770 			$keys = array(
    771 				'order_status_id',
    772 				'notify',
    773 				'override',
    774 				'comment'
    775 			);
    776 
    777 			foreach ($keys as $key) {
    778 				if (!isset($this->request->post[$key])) {
    779 					$this->request->post[$key] = '';
    780 				}
    781 			}
    782 
    783 			$this->load->model('checkout/order');
    784 
    785 			if (isset($this->request->get['order_id'])) {
    786 				$order_id = $this->request->get['order_id'];
    787 			} else {
    788 				$order_id = 0;
    789 			}
    790 
    791 			$order_info = $this->model_checkout_order->getOrder($order_id);
    792 
    793 			if ($order_info) {
    794 				$this->model_checkout_order->addOrderHistory($order_id, $this->request->post['order_status_id'], $this->request->post['comment'], $this->request->post['notify'], $this->request->post['override']);
    795 
    796 				$json['success'] = $this->language->get('text_success');
    797 			} else {
    798 				$json['error'] = $this->language->get('error_not_found');
    799 			}
    800 		}
    801 
    802 		$this->response->addHeader('Content-Type: application/json');
    803 		$this->response->setOutput(json_encode($json));
    804 	}
    805 }