<?php


include(dirname(__FILE__).'/../../config/config.inc.php');
include_once(dirname(__FILE__).'/../../init.php');
include(dirname(__FILE__).'/multisafepay.php');
include_once(_PS_MODULE_DIR_.'multisafepay/api/MultiSafepay.combined.php');

if(isset($_REQUEST['transactionid'])){
$multisafepay 						= 	new Multisafepay();
$msp 								= 	new MultiSafepayConnector();
if(Configuration::get('MULTISAFEPAY_SANDBOX'))
{
	$msp->test 						= 	true;
}
else
{
	$msp->test 						= 	false;
}
$msp->merchant['account_id'] 		=	Configuration::get('MULTISAFEPAY_API_USER');
$msp->merchant['site_id'] 			= 	Configuration::get('MULTISAFEPAY_API_SIGNATURE');
$msp->merchant['site_code'] 		= 	Configuration::get('MULTISAFEPAY_API_PASSWORD');
$msp->transaction['id'] 			= 	$_REQUEST['transactionid'];
$status 							= 	$msp->getStatus();
$details 							= 	$msp->details;
$cart_id  							= 	$details['transaction']['var1'];
$key 								= 	$details['transaction']['var2'];
$total								= 	$details['customer']['amount']/100;
	
if($details['ewallet']['fastcheckout'] == 'YES'){
	$is_fco = true;
}else{
	$is_fco = false;
}
}
 
if($_REQUEST['type'] == 'shipping')
{
	$string = '';
	foreach($_REQUEST as $key => $value){
			$string .= $key .' - '.$value.' --';
	}
	
	
	$weight 									= 	0;
	$weight 									= 	number_format(str_replace(',','.', $_REQUEST['weight']),6); 
	$amount										= 	str_replace(',','',number_format(($_REQUEST['amount']/100),2));
	$countrycode 								= 	strtoupper($_REQUEST['countrycode']);
	$shippers 									=  	array();
	$xml										=	'<?xml version="1.0" encoding="UTF-8"?>';
	$xml										.= 	'<shipping-info>';
		
	$sql = 'SELECT * FROM '._DB_PREFIX_.'carrier';
	$carriers = array();

	
	
	if(Configuration::get('PS_SHIPPING_METHOD') == 1 )
	{
		//Start shippingmethods based on weight	
		if ($carriers = Db::getInstance()->ExecuteS($sql))
		{
			foreach ($carriers as $carrier)
			{
				if($carrier['deleted'] != '1')
				{
					$carrier_id = $carrier['id_carrier'];
					$carrier_name = $carrier['name'];
						
					$sql = 'SELECT * FROM '._DB_PREFIX_.'range_weight WHERE id_carrier=\''.$carrier_id.'\'';
					if ($ranges = Db::getInstance()->ExecuteS($sql))
					{
						foreach ($ranges as $range)
						{
							$start 		= $range['delimiter1'];
							$end		= $range['delimiter2'];
							
							
							
							$range_id 	= $range['id_range_weight'];
							if($weight >= $start && $weight <= $end)
							{
								$sql = 'SELECT * FROM '._DB_PREFIX_.'country WHERE iso_code=\''.$countrycode.'\'';
								if ($countries = Db::getInstance()->ExecuteS($sql))
								{
									foreach ($countries as $country)
									{
										$zone_id = $country['id_zone'];
										$sql = 'SELECT * FROM '._DB_PREFIX_.'delivery WHERE id_carrier=\''.$carrier_id.'\' AND id_range_weight=\''.$range_id.'\' AND id_zone=\''.$zone_id.'\'';
										
										
										if ($prices = Db::getInstance()->ExecuteS($sql))
										{
											foreach ($prices as $price)
											{							
												$sql = 'SELECT * FROM '._DB_PREFIX_.'configuration WHERE name=\'PS_SHIPPING_HANDLING\'';
												if ($config = Db::getInstance()->ExecuteS($sql))
												{
													$handling_fee = $config[0]['value'];
												}
												else
												{
													$handling_fee =0;
												}
												
												$sql = 'SELECT * FROM '._DB_PREFIX_.'configuration WHERE name=\'PS_SHIPPING_FREE_WEIGHT\'';
												if ($config = Db::getInstance()->ExecuteS($sql))
												{
													$free_shipping_starts_at_weigth = $config[0]['value'];

													if ( $config[0]['value'] > 0 && $weight >= $free_shipping_starts_at_weigth)
													{
														$handling_fee   = 0;
														$price['price'] = 0;
													}
												
												}
												$t_amount = 0;
												if(Configuration::get('MULTISAFEPAY_TAX_SHIPPING') == 1 || Configuration::get('MULTISAFEPAY_TAX_SHIPPING') =='1'){
													$t_amount = Configuration::get('MULTISAFEPAY_DEFAULT_TAX');
													$t_amount = $t_amount/100+1;
													
												}
												
												
												
												$shipping_price = round($price['price'], 4) + $handling_fee;
												//$shipping_price = $shipping_price* $t_amount;
	//											if($shipping_price > 0)
	//											{
													$ship 					= '<shipping>';
													$ship 					.= '<shipping-name>'.$carrier_name.'</shipping-name>';
													$ship 					.= '<shipping-cost currency="EUR">'.$shipping_price.'</shipping-cost>';
													$ship 					.= '<shipping-id>'.$carrier_name.'|'.$carrier_id.'|'.$range_id.'|'.$zone_id.'|'.($price['id_delivery']*$t_amount).'</shipping-id>';//standard_shipping|DHL|EU+ > 12kg|24.57|7
													$ship 					.= '</shipping>';
													$shippers[] = $ship;	
	//											}
																					}
										}
									}
								}
							}
						}
					}else{
						if ($carrier['is_free'] ) {
							$ship 					= '<shipping>';
							$ship 					.= '<shipping-name>'.$carrier_name. '</shipping-name>';
							$ship 					.= '<shipping-cost currency="EUR">0</shipping-cost>';
							$ship 					.= '<shipping-id>'.$carrier_name.'|carrier_id|0.00|999|123</shipping-id>';
							$ship 					.= '</shipping>';
							$shippers[] = $ship;
						}
					
					}
					
				}
			}
		}
		//end shippingmethods based on weight
	}else{
		$sql = 'SELECT * FROM '._DB_PREFIX_.'carrier';
		$carriers = array();
		//Start shippingmethods based on price
		if ($carriers = Db::getInstance()->ExecuteS($sql))
		{
		
			foreach ($carriers as $carrier)
			{
				if($carrier['deleted'] != '1')
				{
					$carrier_id = $carrier['id_carrier'];
					$carrier_name = $carrier['name'];
						
					$sql = 'SELECT * FROM '._DB_PREFIX_.'range_price WHERE id_carrier=\''.$carrier_id.'\'';
					

					if ($ranges = Db::getInstance()->ExecuteS($sql))
					{
						foreach ($ranges as $range)
						{
							$amount		= (double)$amount;
							$start 		= (double)round($range['delimiter1'], 2 );
							$end		= (double)round($range['delimiter2'], 2);
						
							$range_id 	= $range['id_range_price'];
							if($amount >= $start && $amount <= $end)
							{
							
								$sql = 'SELECT * FROM '._DB_PREFIX_.'country WHERE iso_code=\''.$countrycode.'\'';
								if ($countries = Db::getInstance()->ExecuteS($sql))
								{
									foreach ($countries as $country)
									{
										$zone_id = $country['id_zone'];
										$sql = 'SELECT * FROM '._DB_PREFIX_.'delivery WHERE id_carrier=\''.$carrier_id.'\' AND id_range_price=\''.$range_id.'\' AND id_zone=\''.$zone_id.'\'';
										
										
										if ($prices = Db::getInstance()->ExecuteS($sql))
										{
											
											foreach ($prices as $price)
											{
											
												$sql = 'SELECT * FROM '._DB_PREFIX_.'configuration WHERE name=\'PS_SHIPPING_HANDLING\'';
												if ($config = Db::getInstance()->ExecuteS($sql))
												{
													$handling_fee = $config[0]['value'];
												}
												else
												{
													$handling_fee =0;
												}
												
												$sql = 'SELECT * FROM '._DB_PREFIX_.'configuration WHERE name=\'PS_SHIPPING_FREE_PRICE\'';
												
												
												if ($config = Db::getInstance()->ExecuteS($sql))
												{
													$free_shipping_starts_at_price = $config[0]['value'];

													if ( $config[0]['value'] > 0 && $amount >= $free_shipping_starts_at_price)
													{
														$handling_fee   = 0;
														$price['price'] = 0;
													}
												
												}
												$t_amount = 0;
												if(Configuration::get('MULTISAFEPAY_TAX_SHIPPING') == 1 || Configuration::get('MULTISAFEPAY_TAX_SHIPPING') =='1'){
													$t_amount = Configuration::get('MULTISAFEPAY_DEFAULT_TAX');
													$t_amount = $t_amount/100+1;
													
												}
												
												
													
												$shipping_price = round($price['price'], 4) + $handling_fee;
												
												if($t_amount != 0){
													//$shipping_price = $shipping_price* $t_amount;
												}
												
												if($shipping_price >= 0)
												{
													$ship 					= '<shipping>';
													$ship 					.= '<shipping-name>'.$carrier_name.'</shipping-name>';
													$ship 					.= '<shipping-cost currency="EUR">'.$shipping_price.'</shipping-cost>';
													$ship 					.= '<shipping-id>'.$carrier_name.'|'.$carrier_id.'|'.$range_id.'|'.$zone_id.'|'.($price['id_delivery']*$t_amount).'</shipping-id>';//standard_shipping|DHL|EU+ > 12kg|24.57|7
													$ship 					.= '</shipping>';
													$shippers[] = $ship;	
												}
											}
										}
									}
								}
							}
						}
					}
					else{
						if ($carrier['is_free'] ) {
							$ship 					= '<shipping>';
							$ship 					.= '<shipping-name>'.$carrier_name. '</shipping-name>';
							$ship 					.= '<shipping-cost currency="EUR">0</shipping-cost>';
							$ship 					.= '<shipping-id>'.$carrier_name.'|carrier_id|0.00|999|123</shipping-id>';
							$ship 					.= '</shipping>';
							$shippers[] = $ship;
						}
					
					}
				}
			}
		}
		//End shippingmethods based on price
	}

	
	$shippers = array_unique($shippers);
	$v = 0;
	while(isset($shippers[$v]))
	{
		$xml .= $shippers[$v];
		$v++;
	}
	$xml							.= '</shipping-info>';
	print_r($xml);
}
elseif($_REQUEST['mode'] == 'fastcheckout' || $is_fco)
{	
	$multisafepay 						=   new Multisafepay();
	$order_id 							= 	$_REQUEST['transactionid'];
		
	$msp 								= 	new MultiSafepayConnector();
	if(Configuration::get('MULTISAFEPAY_SANDBOX'))
	{
		$msp->test 						= 	true;
	}
	else
	{
		$msp->test 						= 	false;
	}
	$msp->merchant['account_id'] 		=	Configuration::get('MULTISAFEPAY_API_USER');
	$msp->merchant['site_id'] 			= 	Configuration::get('MULTISAFEPAY_API_SIGNATURE');
	$msp->merchant['site_code'] 		= 	Configuration::get('MULTISAFEPAY_API_PASSWORD');
	$msp->transaction['id']            	= 	$order_id;
	$status 							= 	$msp->getStatus();
	$extra_data 						= 	json_decode($msp->details['transaction']['var1']);
	$shipping_method 					= 	$msp->parsed_xml['status']['checkoutdata']['order-adjustment']['shipping']['flat-rate-shipping']['shipping-name']['VALUE'];
	
	$sql = 'SELECT * FROM '._DB_PREFIX_.'carrier WHERE name=\''.$shipping_method .'\'';
		
	if ($carriers = Db::getInstance()->ExecuteS($sql))
	{
		foreach ($carriers as $carrier)
		{
			$carrier_id = $carrier['id_carrier'];
		}
	}	
	
	$address 							=	null;
	$customer 							= 	null;
	$cart 								= 	new Cart((int)$order_id);

	if($msp->details['transaction']['var2'] != '0' || $msp->details['transaction']['var2'] != 0)
	{
		$customer 						= 	new Customer($msp->details['transaction']['var2']);
		$secure_key 					= 	$extra_data->secure_key;
	}
	else{	
		$sql = 'SELECT * FROM '._DB_PREFIX_.'customer WHERE email=\''.$msp->details['customer']['email'].'\'';
		
		if ($customer_exists = Db::getInstance()->ExecuteS($sql))
		{
			foreach ($customer_exists as $customer_data)
			{
				$customer 				= 	new Customer($customer_data['id_customer']);
				$secure_key 			= 	$customer->secure_key;
			}
		}
		else
		{
			$customer 					= 	new Customer();
			$customer->email 			= 	$msp->details['customer']['email'];
			$customer->lastname 		= 	trim(htmlspecialchars($msp->details['customer']['lastname']));
			$customer->firstname 		= 	trim(htmlspecialchars($msp->details['customer']['firstname']));
			$cleanpass 					= 	Tools::passwdGen();
			$customer->passwd 			= 	Tools::encrypt($cleanpass);

			$customer->add();
			$secure_key 				= 	$customer->secure_key;
			
			Mail::Send(intval($extra_data->id_lang), 'account', 'Welcome!', array('{firstname}' => $customer->firstname, '{lastname}' => $customer->lastname, '{email}' => $customer->email, '{passwd}' => $cleanpass), $customer->email, $customer->firstname.' '.$customer->lastname);
		}
	}
	$address2 = array();
	
	//Start checking and adding billing address
	foreach ($customer->getAddresses($extra_data->id_lang) as $billaddress)
	{
		$billing 						= 	$msp->details['customer']['address1'].' '.$msp->details['customer']['housenumber'];
		
		if ($billaddress['alias'] == 'Multisafepay Billing' && $billaddress['address1'] == $billing && $billaddress['deleted'] != '1')
		{
			$address 					= 	new Address($billaddress['id_address']);
			$id_billing_address 		=	 $address->id;
		}
	}
	
	foreach ($customer->getAddresses($extra_data->id_lang) as $shipaddress)
	{
		$delivery = $msp->details['customer-delivery']['address1'].' '.$msp->details['customer-delivery']['housenumber'];
		
		if($shipaddress['alias'] == 'Multisafepay Shipping' && $shipaddress['address1'] == $delivery && $shipaddress['deleted'] != '1')
		{
			$address2 = new Address($shipaddress['id_address']);
			$id_shipping_address 	= $address2->id;
		}
	}
		
	if ((!$address || !$address->id) && $customer->id)
	{
		$address 				= new Address();
		$address->id_country 	= Country::getByIso($msp->details['customer']['country']);
		$address->alias 		= 'Multisafepay Billing';
		$address->lastname 		= trim(htmlspecialchars($msp->details['customer']['lastname']));
		$address->firstname 	= trim(htmlspecialchars($msp->details['customer']['firstname']));
		$address->address1 		= trim(htmlspecialchars($msp->details['customer']['address1'])).' '.trim(htmlspecialchars($msp->details['customer']['housenumber']));
		$address->city 			= trim(htmlspecialchars($msp->details['customer']['city']));
		$address->postcode 		= $msp->details['customer']['zipcode'];
		$address->id_customer 	= $customer->id;
		$address->add();
		$id_billing_address 	= $address->id;
	}
	
	if ((!$address2 || !$address2->id) && $customer->id)
	{
		$address2 				= new Address();
		$address2->id_country 	= Country::getByIso(htmlspecialchars($msp->details['customer-delivery']['country']));
		$address2->alias 		= 'Multisafepay Shipping';
		$address2->lastname 	= trim(htmlspecialchars($msp->details['customer']['lastname']));
		$address2->firstname 	= trim(htmlspecialchars($msp->details['customer-delivery']['firstname']));
		$address2->address1 	= trim(htmlspecialchars($msp->details['customer-delivery']['address1'])).' '.trim(htmlspecialchars($msp->details['customer-delivery']['housenumber']));
		$address2->city 		= trim(htmlspecialchars($msp->details['customer-delivery']['city']));
		$address2->postcode 	= trim(htmlspecialchars($msp->details['customer-delivery']['zipcode']));
		$address2->id_customer 	= $customer->id;
		$address2->add();
		$id_shipping_address 	= $address2->id;
	}
		
	if ($address->id && $customer->id && $address2->id)
	{
		$cart->id_customer 				= $customer->id;
		$cart->id_guest 				= $msp->details['transaction']['var3'];
		$cart->id_address_invoice 		= $id_billing_address;
		$cart->id_address_delivery 		= $id_shipping_address;
		
	}

	$cart->id_carrier			= $carrier_id; 
	$delivery_option_list = $cart->getDeliveryOptionList();
	
	if (count($delivery_option_list) == 1)
	{
		$delivery_option 	= 	reset($delivery_option_list);
		$key 				= 	$carrier_id.',';

		foreach ($delivery_option_list as $id_address => $options)
		{
			if (isset($options[$key]))
			{
				$cart->id_carrier = $carrier_id;
				$cart->setDeliveryOption(array($id_address => $key));			
			}
		}
	}
	$cart->update();

	//End checking and adding billing address
	$paid = $msp->details['transaction']['amount'] /100;
	

	
	if (!$cart->id)
	{
		echo 'NOK';
	}	
	elseif (Order::getOrderByCartId((int)($order_id)))
	{
		$order = new Order(Order::getOrderByCartId((int)($order_id)));
		
		if($order->getCurrentState() != _PS_OS_PAYMENT_)
		{
			switch ($status)
			{
				// waiting
				case "initialized":
					if($order->getCurrentState() != _PS_OS_PREPARATION_)
						$order->setCurrentState(_PS_OS_PREPARATION_);
					break;
				// payment complete
				case "completed":
					if($order->getCurrentState() != _PS_OS_PAYMENT_)
						$order->setCurrentState(_PS_OS_PAYMENT_);
					break;
				// waiting (credit cards or direct debit)
				case "uncleared":
					if($order->getCurrentState() != _PS_OS_PREPARATION_)
						$order->setCurrentState(_PS_OS_PREPARATION_);
					if($pay_method =='PAYAFTER')	
						$order->setCurrentState(Configuration::get('MULTISAFEPAY_OS_PAYAFTER'));
					break;
				// canceled
				case "void":
					if($order->getCurrentState() != _PS_OS_CANCELED_)
						$order->setCurrentState(_PS_OS_CANCELED_);
					break;
				// declined
				case "declined":
					if($order->getCurrentState() != _PS_OS_CANCELED_)
						$order->setCurrentState(_PS_OS_CANCELED_);
					break;
				// refunded
				case "refunded":
					if($order->getCurrentState() != _PS_OS_REFUND_)
						$order->setCurrentState(_PS_OS_REFUND_);
					break;
				// expired
				case "expired":
					if($order->getCurrentState() != _PS_OS_CANCELED_)
						$order->setCurrentState(_PS_OS_CANCELED_);
					break;
				default:
					if($order->getCurrentState() != _PS_OS_ERROR_)
						$order->setCurrentState(_PS_OS_ERROR_);
					break;
			}			
		}
	}	
	else
	{
		global $link;
		$link = new Link(); 
		
		switch ($status)
		{
			// waiting
			case "initialized":
					//$multisafepay->validateOrder((int)$order_id, Configuration::get('PS_OS_PREPARATION'), (float)($paid),
					//$multisafepay->displayName, null, array(), null, false, $secure_key);//we can add shop instance for multistore support ->store id is available already using $extra_data->id_shop
					$multisafepay->validateOrder((int)$order_id, Configuration::get('PS_OS_PREPARATION'), $paid, 'Multisafepay', null, array(), null, false, $secure_key);
				break;
			// payment complete
			case "completed":
					$multisafepay->validateOrder((int)$order_id, Configuration::get('PS_OS_PAYMENT'), $paid, 'Multisafepay', null, array(), null, false, $secure_key);
				break;
			// waiting (credit cards or direct debit)
			case "uncleared":
				if($pay_method =='PAYAFTER'){	
					$multisafepay->validateOrder((int)$order_id, Configuration::get('MULTISAFEPAY_OS_PAYAFTER'), $paid, 'Multisafepay', null, array(), null, false, $secure_key);
				}
				else{
					$multisafepay->validateOrder((int)$order_id, Configuration::get('_PS_OS_PREPARATION_'), $paid, 'Multisafepay', null, array(), null, false, $secure_key);
				}
				break;
			// canceled
			case "void":
					$multisafepay->validateOrder((int)$order_id, Configuration::get('PS_OS_CANCELED'), $paid, 'Multisafepay', null, array(), null, false, $secure_key);
				break;
			// declined
			case "declined":
					$multisafepay->validateOrder((int)$order_id, Configuration::get('PS_OS_CANCELED'), $paid, 'Multisafepay', null, array(), null, false, $secure_key);
				break;
			// refunded
			case "refunded":
					$multisafepay->validateOrder((int)$order_id, Configuration::get('PS_OS_REFUND'), $paid, 'Multisafepay', null, array(), null, false, $secure_key);
				break;
			// expired
			case "expired":
					$multisafepay->validateOrder((int)$order_id, Configuration::get('PS_OS_CANCELED'), $paid, 'Multisafepay', null, array(), null, false, $secure_key);
				break;
			default:
					$multisafepay->validateOrder((int)$order_id, Configuration::get('PS_OS_ERROR'), $paid, 'Multisafepay', null, array(), null, false, $secure_key);
				break;
		}
	}
	//UPDATE the addresses for the order manually. This must be done because the prestashop way of doing it will fail if the address already exists and it will default to the first in list.
	$sql = 'UPDATE '._DB_PREFIX_.'orders SET id_address_delivery=\''.$id_shipping_address.'\' WHERE id_cart=\''.$order_id.'\'';
	Db::getInstance()->ExecuteS($sql);
	$sql = 'UPDATE '._DB_PREFIX_.'orders SET id_address_invoice=\''.$id_billing_address.'\' WHERE id_cart=\''.$order_id.'\'';
	Db::getInstance()->ExecuteS($sql);
	$initial_request	= (isset($_GET['type']) == 'initial');
	if(isset($_GET['redirect'])){
		Tools::redirect('index.php?controller=order-confirmation&id_cart='.$cart_id.'&id_module='.$multisafepay->id.'&id_order='.$orderid.'&key='.$key);
	}else{
		if ($initial_request) 
		{
			echo '<a href="'.(Configuration::get('PS_SSL_ENABLED') ? 'https://' : 'http://').htmlspecialchars($_SERVER['HTTP_HOST'], ENT_COMPAT, 'UTF-8').__PS_BASE_URI__.'" />Return to webshop..</a>';
		}else{
			echo "ok";
		}
	}
}
else
{
	$multisafepay 						= 	new Multisafepay();
	$msp 								= 	new MultiSafepayConnector();
	if(Configuration::get('MULTISAFEPAY_SANDBOX'))
	{
		$msp->test 						= 	true;
	}
	else
	{
		$msp->test 						= 	false;
	}
	$msp->merchant['account_id'] 		=	Configuration::get('MULTISAFEPAY_API_USER');
	$msp->merchant['site_id'] 			= 	Configuration::get('MULTISAFEPAY_API_SIGNATURE');
	$msp->merchant['site_code'] 		= 	Configuration::get('MULTISAFEPAY_API_PASSWORD');
	$msp->transaction['id'] 			= 	$_REQUEST['transactionid'];
	$status 							= 	$msp->getStatus();
	$details 							= 	$msp->details;
	$cart_id  							= 	$details['transaction']['var1'];
	$key 								= 	$details['transaction']['var2'];
	$total								= 	$details['customer']['amount']/100;
	
	$pay_method  = $details['paymentdetails']['type'];
	
	if($details['ewallet']['fastcheckout'] == 'YES'){
		$cart_id = $msp->transaction['id'];
	}

	$query = "SELECT * FROM `"._DB_PREFIX_."orders` WHERE `id_cart`='".$cart_id ."'";
	$orderid = Db::getInstance()->getValue($query);
	$send_confirm = Configuration::get('MULTISAFEPAY_SEND_CONFIRMATION');
	$initial_request	= (isset($_GET['type']) == 'initial');

	
	if(!isset($orderid) || $orderid =="")
	{

		if($send_confirm == 1 )
		{
			$multisafepay->validateOrder((int)$cart_id, Configuration::get('PS_OS_PREPARATION'), $total, 'Multisafepay', null, array(), null, false, $key);
			$query = "SELECT * FROM `"._DB_PREFIX_."orders` WHERE `id_cart`='".$cart_id ."'";
			$orderid = Db::getInstance()->getValue($query);
			
			$order = new Order($orderid);
			
			if($order->getCurrentState() != _PS_OS_PAYMENT_)
			{
				switch ($status)
				{
					// waiting
					case "initialized":
						if($order->getCurrentState() != _PS_OS_PREPARATION_)
							$order->setCurrentState(_PS_OS_PREPARATION_);
							
						break;
					// payment complete
					case "completed":
						if($order->getCurrentState() != _PS_OS_PAYMENT_)
							$order->setCurrentState(_PS_OS_PAYMENT_);
						break;
					// waiting (credit cards or direct debit)
					case "uncleared":
						if($order->getCurrentState() != _PS_OS_PREPARATION_)
							$order->setCurrentState(_PS_OS_PREPARATION_);
						if($pay_method =='PAYAFTER')	
							$order->setCurrentState(Configuration::get('MULTISAFEPAY_OS_PAYAFTER'));
						break;
					// canceled
					case "void":
						if($order->getCurrentState() != _PS_OS_CANCELED_)
							$order->setCurrentState(_PS_OS_CANCELED_);
						break;
					// declined
					case "declined":
						if($order->getCurrentState() != _PS_OS_CANCELED_)
							$order->setCurrentState(_PS_OS_CANCELED_);
						break;
					// refunded
					case "refunded":
						if($order->getCurrentState() != _PS_OS_REFUND_)
							$order->setCurrentState(_PS_OS_REFUND_);
						break;
					// expired
					case "expired":
						if($order->getCurrentState() != _PS_OS_CANCELED_)
							$order->setCurrentState(_PS_OS_CANCELED_);
						break;
					default:
						if($order->getCurrentState() != _PS_OS_ERROR_)
							$order->setCurrentState(_PS_OS_ERROR_);
						break;
				}	
			}	
			$initial_request	= (isset($_GET['type']) == 'initial');
	
			if(isset($_GET['redirect'])){
				Tools::redirect('index.php?controller=order-confirmation&id_cart='.$cart_id.'&id_module='.$multisafepay->id.'&id_order='.$orderid.'&key='.$key);
			}
		}elseif($status != 'uncleared' && $status != 'void' && $status != 'declined' && $status != 'expired'){
			$multisafepay->validateOrder((int)$cart_id, Configuration::get('PS_OS_PREPARATION'), $total, 'Multisafepay', null, array(), null, false, $key);
			$query = "SELECT * FROM `"._DB_PREFIX_."orders` WHERE `id_cart`='".$cart_id ."'";
			$orderid = Db::getInstance()->getValue($query);
			$order = new Order($orderid);
			if($order->getCurrentState() != _PS_OS_PAYMENT_)
			{
				switch ($status)
				{
					// waiting
					case "initialized":
						if($order->getCurrentState() != _PS_OS_PREPARATION_)
							$order->setCurrentState(_PS_OS_PREPARATION_);
							
						break;
					// payment complete
					case "completed":
						if($order->getCurrentState() != _PS_OS_PAYMENT_)
							$order->setCurrentState(_PS_OS_PAYMENT_);
						break;
					// waiting (credit cards or direct debit)
					case "uncleared":
						if($order->getCurrentState() != _PS_OS_PREPARATION_)
							$order->setCurrentState(_PS_OS_PREPARATION_);
						if($pay_method =='PAYAFTER')	
							$order->setCurrentState(Configuration::get('MULTISAFEPAY_OS_PAYAFTER'));
						break;
					// canceled
					case "void":
						if($order->getCurrentState() != _PS_OS_CANCELED_)
							$order->setCurrentState(_PS_OS_CANCELED_);
						break;
					// declined
					case "declined":
						if($order->getCurrentState() != _PS_OS_CANCELED_)
							$order->setCurrentState(_PS_OS_CANCELED_);
						break;
					// refunded
					case "refunded":
						if($order->getCurrentState() != _PS_OS_REFUND_)
							$order->setCurrentState(_PS_OS_REFUND_);
						break;
					// expired
					case "expired":
						if($order->getCurrentState() != _PS_OS_CANCELED_)
							$order->setCurrentState(_PS_OS_CANCELED_);
						break;
					default:
						if($order->getCurrentState() != _PS_OS_ERROR_)
							$order->setCurrentState(_PS_OS_ERROR_);
						break;
				}	
			}	
			$initial_request	= (isset($_GET['type']) == 'initial');
			
			if(isset($_GET['redirect'])){
				Tools::redirect('index.php?controller=order-confirmation&id_cart='.$cart_id.'&id_module='.$multisafepay->id.'&id_order='.$orderid.'&key='.$key);
			}
		}else{
			if(isset($_GET['redirect'])){
				Tools::redirect((Configuration::get('PS_SSL_ENABLED') ? 'https://' : 'http://').htmlspecialchars($_SERVER['HTTP_HOST'], ENT_COMPAT, 'UTF-8').__PS_BASE_URI__.'order.php?step=3');
				
			}
		}
	}else{
		$order = new Order(Order::getOrderByCartId((int)($cart_id)));
		
		if($order->getCurrentState() != _PS_OS_PAYMENT_)
		{
			switch ($status)
			{
				// waiting
				case "initialized":
					if($order->getCurrentState() != _PS_OS_PREPARATION_)
						$order->setCurrentState(_PS_OS_PREPARATION_);
					break;
				// payment complete
				case "completed":
					if($order->getCurrentState() != _PS_OS_PAYMENT_)
						$order->setCurrentState(_PS_OS_PAYMENT_);
					break;
				// waiting (credit cards or direct debit)
				case "uncleared":
					if($order->getCurrentState() != _PS_OS_PREPARATION_)
						$order->setCurrentState(_PS_OS_PREPARATION_);
					if($pay_method =='PAYAFTER')	
						$order->setCurrentState(Configuration::get('MULTISAFEPAY_OS_PAYAFTER'));
					break;
				// canceled
				case "void":
					if($order->getCurrentState() != _PS_OS_CANCELED_)
						$order->setCurrentState(_PS_OS_CANCELED_);
					break;
				// declined
				case "declined":
					if($order->getCurrentState() != _PS_OS_CANCELED_)
						$order->setCurrentState(_PS_OS_CANCELED_);
					break;
				// refunded
				case "refunded":
					if($order->getCurrentState() != _PS_OS_REFUND_)
						$order->setCurrentState(_PS_OS_REFUND_);
					break;
				// expired
				case "expired":
					if($order->getCurrentState() != _PS_OS_CANCELED_)
						$order->setCurrentState(_PS_OS_CANCELED_);
					break;
				default:
					if($order->getCurrentState() != _PS_OS_ERROR_)
						$order->setCurrentState(_PS_OS_ERROR_);
					break;
			}			
		}
	}
	if(isset($_GET['redirect'])){
				Tools::redirect('index.php?controller=order-confirmation&id_cart='.$cart_id.'&id_module='.$multisafepay->id.'&id_order='.$orderid.'&key='.$key);
			}
	if ($initial_request) 
	{
		echo '<a href="'.(Configuration::get('PS_SSL_ENABLED') ? 'https://' : 'http://').htmlspecialchars($_SERVER['HTTP_HOST'], ENT_COMPAT, 'UTF-8').__PS_BASE_URI__.'" />Return to webshop..</a>';
	}else{
		echo "ok";
	}	
}
