2016-01-04 12:48:08 +01:00
< ? php
2017-12-18 09:44:27 +01:00
class PaymentModule extends PaymentModuleCore
{
public function validateOrder ( $id_cart , $id_order_state , $amountPaid , $paymentMethod = 'Unknown' , $message = NULL , $extraVars = array (), $currency_special = NULL , $dont_touch_amount = false , $secure_key = false )
{
global $cart ;
$cart = new Cart (( int )( $id_cart ));
// Does order already exists ?
if ( Validate :: isLoadedObject ( $cart ) AND $cart -> OrderExists () == false )
2016-01-04 12:48:08 +01:00
{
2017-12-18 09:44:27 +01:00
/* @ Override
* do not die and create Order in error state
*/
// die(Tools::displayError());
if ( $secure_key !== false AND $secure_key != $cart -> secure_key ) {
$id_order_state = Configuration :: get ( 'PS_OS_ERROR' );
$message = " Problème de sercure_key. A valider manuellement " . " \n \n " . $message ;
Logger :: addLog ( 'Invalid secure_key' , 4 , '0000001' , 'Cart' , intval ( $id_cart ));
}
// Copying data from cart
$order = new Order ();
$order -> appli = 0 ;
if ( Tools :: isApi ()) {
$order -> appli = 1 ;
} elseif ( Tools :: isMobile ()) {
$order -> appli = 2 ;
}
$order -> id_carrier = ( int )( $cart -> id_carrier );
$order -> id_customer = ( int )( $cart -> id_customer );
$order -> id_address_invoice = ( int )( $cart -> id_address_invoice );
$order -> id_address_delivery = ( int )( $cart -> id_address_delivery );
$vat_address = new Address (( int )( $order -> { Configuration :: get ( 'PS_TAX_ADDRESS_TYPE' )}));
$order -> id_currency = ( $currency_special ? ( int )( $currency_special ) : ( int )( $cart -> id_currency ));
$order -> id_lang = ( int )( $cart -> id_lang );
$order -> id_cart = ( int )( $cart -> id );
$customer = new Customer (( int )( $order -> id_customer ));
$order -> secure_key = ( $secure_key ? pSQL ( $secure_key ) : pSQL ( $customer -> secure_key ));
$order -> payment = $paymentMethod ;
if ( isset ( $this -> name ))
$order -> module = $this -> name ;
$order -> recyclable = $cart -> recyclable ;
$order -> gift = ( int )( $cart -> gift );
$order -> gift_message = $cart -> gift_message ;
$currency = new Currency ( $order -> id_currency );
$order -> conversion_rate = $currency -> conversion_rate ;
$amountPaid = ! $dont_touch_amount ? Tools :: ps_round (( float )( $amountPaid ), 2 ) : $amountPaid ;
$order -> total_paid_real = $amountPaid ;
$order -> total_products = ( float )( $cart -> getOrderTotal ( false , Cart :: ONLY_PRODUCTS ));
$order -> total_products_wt = ( float )( $cart -> getOrderTotal ( true , Cart :: ONLY_PRODUCTS ));
$order -> total_discounts = ( float )( abs ( $cart -> getOrderTotal ( true , Cart :: ONLY_DISCOUNTS )));
$order -> total_shipping = ( float )( $cart -> getOrderShippingCost ());
$order -> carrier_tax_rate = ( float ) Tax :: getCarrierTaxRate ( $cart -> id_carrier , ( int ) $cart -> { Configuration :: get ( 'PS_TAX_ADDRESS_TYPE' )});
$order -> total_wrapping = ( float )( abs ( $cart -> getOrderTotal ( true , Cart :: ONLY_WRAPPING )));
$order -> total_paid = ( float )( Tools :: ps_round (( float )( $cart -> getOrderTotal ( true , Cart :: BOTH )), 2 ));
$order -> invoice_date = '0000-00-00 00:00:00' ;
$order -> delivery_date = '0000-00-00 00:00:00' ;
// Amount paid by customer is not the right one -> Status = payment error
// We don't use the following condition to avoid the float precision issues : http://www.php.net/manual/en/language.types.float.php
// if ($order->total_paid != $order->total_paid_real)
// We use number_format in order to compare two string
if ( number_format ( $order -> total_paid , 2 ) != number_format ( $order -> total_paid_real , 2 ))
$id_order_state = Configuration :: get ( 'PS_OS_ERROR' );
// Creating order
if ( $cart -> OrderExists () == false )
$result = $order -> add ();
else
2016-01-04 12:48:08 +01:00
{
2017-12-18 09:44:27 +01:00
$errorMessage = Tools :: displayError ( 'An order has already been placed using this cart.' );
Logger :: addLog ( $errorMessage , 4 , '0000001' , 'Cart' , intval ( $order -> id_cart ));
die ( $errorMessage );
}
2016-01-04 12:48:08 +01:00
2017-12-18 09:44:27 +01:00
// Next !
if ( $result AND isset ( $order -> id ))
{
if ( ! $secure_key )
$message .= $this -> l ( 'Warning : the secure key is empty, check your payment account before validation' );
// Optional message to attach to this order
if ( isset ( $message ) AND ! empty ( $message ))
2016-01-04 12:48:08 +01:00
{
2017-12-18 09:44:27 +01:00
$msg = new Message ();
$message = strip_tags ( $message , '<br>' );
if ( Validate :: isCleanHtml ( $message ))
2016-01-04 12:48:08 +01:00
{
2017-12-18 09:44:27 +01:00
$msg -> message = $message ;
$msg -> id_order = intval ( $order -> id );
$msg -> private = 1 ;
$msg -> add ();
2016-01-04 12:48:08 +01:00
}
2017-12-18 09:44:27 +01:00
}
2016-01-04 12:48:08 +01:00
2017-12-18 09:44:27 +01:00
// Insert products from cart into order_detail table
$products = $cart -> getProducts ();
$productsList = '' ;
$db = Db :: getInstance ();
$query = 'INSERT INTO `' . _DB_PREFIX_ . ' order_detail `
( `id_order` , `product_id` , `product_attribute_id` , `product_name` , `product_quantity` , `product_quantity_in_stock` , `product_price` , `reduction_percent` , `reduction_amount` , `group_reduction` , `product_quantity_discount` , `product_ean13` , `product_upc` , `product_reference` , `product_supplier_reference` , `product_weight` , `tax_name` , `tax_rate` , `ecotax` , `ecotax_tax_rate` , `discount_quantity_applied` , `download_deadline` , `download_hash` )
VALUES ' ;
2016-01-04 12:48:08 +01:00
2017-12-18 09:44:27 +01:00
$customizedDatas = Product :: getAllCustomizedDatas (( int )( $order -> id_cart ));
Product :: addCustomizationPrice ( $products , $customizedDatas );
$outOfStock = false ;
2016-01-04 12:48:08 +01:00
2017-12-18 09:44:27 +01:00
$storeAllTaxes = array ();
2016-01-04 12:48:08 +01:00
2017-12-18 09:44:27 +01:00
$id_country = ( int ) Country :: getDefaultCountryId ();
fix 500:
[Tue Dec 05 10:30:11.214323 2017] [:error] [pid 8149] [client 176.145.145.87:58320] exception 'ErrorException' with message 'Undefined variable: id_country' in /home/www/bebeboutik.com/www/override/classes/PaymentModule.php:252\nStack trace:\n#0 /home/www/bebeboutik.com/www/override/classes/PaymentModule.php(252): Laravel\Lumen\Application->Laravel\Lumen\Concerns\{closure}(8, 'Undefined varia...', '/home/www/bebeb...', 252, Array)\n#1 /home/www/bebeboutik.com/www/modules/paybox/paybox.php(428): PaymentModule->validateOrder(1772217, 2, 26.9, 'Paybox', '<b>Successful o...', Array, NULL, false, 'c38f95c9a167ab7...')
2017-12-05 10:56:29 +01:00
2017-12-18 09:44:27 +01:00
foreach ( $products AS $key => $product )
{
$productQuantity = ( int )( Product :: getQuantity (( int )( $product [ 'id_product' ]), ( $product [ 'id_product_attribute' ] ? ( int )( $product [ 'id_product_attribute' ]) : NULL )));
$quantityInStock = ( $productQuantity - ( int )( $product [ 'cart_quantity' ]) < 0 ) ? $productQuantity : ( int )( $product [ 'cart_quantity' ]);
if ( $id_order_state != Configuration :: get ( 'PS_OS_CANCELED' ) AND $id_order_state != Configuration :: get ( 'PS_OS_ERROR' ))
2016-01-04 12:48:08 +01:00
{
2017-12-18 09:44:27 +01:00
if ( Product :: updateQuantity ( $product , ( int ) $order -> id ))
$product [ 'stock_quantity' ] -= $product [ 'cart_quantity' ];
if ( $product [ 'stock_quantity' ] < 0 && Configuration :: get ( 'PS_STOCK_MANAGEMENT' ))
$outOfStock = true ;
2016-01-04 12:48:08 +01:00
2017-12-18 09:44:27 +01:00
Product :: updateDefaultAttribute ( $product [ 'id_product' ]);
}
$price = Product :: getPriceStatic (( int )( $product [ 'id_product' ]), false , ( $product [ 'id_product_attribute' ] ? ( int )( $product [ 'id_product_attribute' ]) : NULL ), 6 , NULL , false , true , $product [ 'cart_quantity' ], false , ( int )( $order -> id_customer ), ( int )( $order -> id_cart ), ( int )( $order -> { Configuration :: get ( 'PS_TAX_ADDRESS_TYPE' )}));
$price_wt = Product :: getPriceStatic (( int )( $product [ 'id_product' ]), true , ( $product [ 'id_product_attribute' ] ? ( int )( $product [ 'id_product_attribute' ]) : NULL ), 2 , NULL , false , true , $product [ 'cart_quantity' ], false , ( int )( $order -> id_customer ), ( int )( $order -> id_cart ), ( int )( $order -> { Configuration :: get ( 'PS_TAX_ADDRESS_TYPE' )}));
/* Store tax info */
$id_state = 0 ;
$id_county = 0 ;
$rate = 0 ;
$id_address = $cart -> { Configuration :: get ( 'PS_TAX_ADDRESS_TYPE' )};
$address_infos = Address :: getCountryAndState ( $id_address );
if ( $address_infos [ 'id_country' ])
{
$id_country = ( int )( $address_infos [ 'id_country' ]);
$id_state = ( int ) $address_infos [ 'id_state' ];
$id_county = ( int ) County :: getIdCountyByZipCode ( $address_infos [ 'id_state' ], $address_infos [ 'postcode' ]);
}
$allTaxes = TaxRulesGroup :: getTaxes (( int ) Product :: getIdTaxRulesGroupByIdProduct (( int ) $product [ 'id_product' ]), $id_country , $id_state , $id_county );
2016-01-04 12:48:08 +01:00
$nTax = 0 ;
foreach ( $allTaxes AS $res )
{
if ( ! isset ( $storeAllTaxes [ $res -> id ]))
$storeAllTaxes [ $res -> id ] = array ();
$storeAllTaxes [ $res -> id ][ 'name' ] = $res -> name [( int ) $order -> id_lang ];
$storeAllTaxes [ $res -> id ][ 'rate' ] = $res -> rate ;
if ( ! $nTax ++ )
2017-12-18 09:44:27 +01:00
$storeAllTaxes [ $res -> id ][ 'amount' ] = ( $price * ( 1 + ( $res -> rate * 0.01 ))) - $price ;
2016-01-04 12:48:08 +01:00
else
{
2017-12-18 09:44:27 +01:00
$priceTmp = $price_wt / ( 1 + ( $res -> rate * 0.01 ));
$storeAllTaxes [ $res -> id ][ 'amount' ] = $price_wt - $priceTmp ;
2016-01-04 12:48:08 +01:00
}
}
2017-12-18 09:44:27 +01:00
/* End */
2016-01-04 12:48:08 +01:00
2017-12-18 09:44:27 +01:00
// Add some informations for virtual products
$deadline = '0000-00-00 00:00:00' ;
$download_hash = NULL ;
if ( $id_product_download = ProductDownload :: getIdFromIdProduct (( int )( $product [ 'id_product' ])))
2016-01-04 12:48:08 +01:00
{
2017-12-18 09:44:27 +01:00
$productDownload = new ProductDownload (( int )( $id_product_download ));
$deadline = $productDownload -> getDeadLine ();
$download_hash = $productDownload -> getHash ();
}
2016-01-04 12:48:08 +01:00
2017-12-18 09:44:27 +01:00
// Exclude VAT
if ( Tax :: excludeTaxeOption ())
{
$product [ 'tax' ] = 0 ;
$product [ 'rate' ] = 0 ;
$tax_rate = 0 ;
}
else
$tax_rate = Tax :: getProductTaxRate (( int )( $product [ 'id_product' ]), $cart -> { Configuration :: get ( 'PS_TAX_ADDRESS_TYPE' )});
$ecotaxTaxRate = 0 ;
if ( ! empty ( $product [ 'ecotax' ]))
$ecotaxTaxRate = Tax :: getProductEcotaxRate ( $order -> { Configuration :: get ( 'PS_TAX_ADDRESS_TYPE' )});
$product_price = ( float ) Product :: getPriceStatic (( int )( $product [ 'id_product' ]), false , ( $product [ 'id_product_attribute' ] ? ( int )( $product [ 'id_product_attribute' ]) : NULL ), ( Product :: getTaxCalculationMethod (( int )( $order -> id_customer )) == PS_TAX_EXC ? 2 : 6 ), NULL , false , false , $product [ 'cart_quantity' ], false , ( int )( $order -> id_customer ), ( int )( $order -> id_cart ), ( int )( $order -> { Configuration :: get ( 'PS_TAX_ADDRESS_TYPE' )}), $specificPrice , false , false );
$group_reduction = ( float ) GroupReduction :: getValueForProduct (( int ) $product [ 'id_product' ], $customer -> id_default_group ) * 100 ;
if ( ! $group_reduction )
$group_reduction = Group :: getReduction (( int ) $order -> id_customer );
$quantityDiscount = SpecificPrice :: getQuantityDiscount (( int ) $product [ 'id_product' ], Shop :: getCurrentShop (), ( int ) $cart -> id_currency , ( int ) $vat_address -> id_country , ( int ) $customer -> id_default_group , ( int ) $product [ 'cart_quantity' ]);
$unitPrice = Product :: getPriceStatic (( int ) $product [ 'id_product' ], true , ( $product [ 'id_product_attribute' ] ? intval ( $product [ 'id_product_attribute' ]) : NULL ), 2 , NULL , false , true , 1 , false , ( int ) $order -> id_customer , NULL , ( int ) $order -> { Configuration :: get ( 'PS_TAX_ADDRESS_TYPE' )});
$quantityDiscountValue = $quantityDiscount ? (( Product :: getTaxCalculationMethod (( int ) $order -> id_customer ) == PS_TAX_EXC ? Tools :: ps_round ( $unitPrice , 2 ) : $unitPrice ) - $quantityDiscount [ 'price' ] * ( 1 + $tax_rate / 100 )) : 0.00 ;
$query .= '(' . ( int )( $order -> id ) . ' ,
'.(int)($product[' id_product ']).' ,
'.(isset($product[' id_product_attribute ']) ? (int)($product[' id_product_attribute ']) : ' NULL ').' ,
\ '' . pSQL ( $product [ 'name' ] . (( isset ( $product [ 'attributes' ]) AND $product [ 'attributes' ] != NULL ) ? ' - ' . $product [ 'attributes' ] : '' )) . ' \ ' ,
'.(int)($product[' cart_quantity ']).' ,
'.$quantityInStock.' ,
'.$product_price.' ,
'.(float)(($specificPrice AND $specificPrice[' reduction_type '] == ' percentage ') ? $specificPrice[' reduction '] * 100 : 0.00).' ,
'.(float)(($specificPrice AND $specificPrice[' reduction_type '] == ' amount ') ? (!$specificPrice[' id_currency '] ? Tools::convertPrice($specificPrice[' reduction '], $order->id_currency) : $specificPrice[' reduction ']) : 0.00).' ,
'.$group_reduction.' ,
'.$quantityDiscountValue.' ,
'.(empty($product[' ean13 ']) ? ' NULL ' : ' \ '' . pSQL ( $product [ 'ean13' ]) . '\'' ) . ' ,
'.(empty($product[' upc ']) ? ' NULL ' : ' \ '' . pSQL ( $product [ 'upc' ]) . '\'' ) . ' ,
'.(empty($product[' reference ']) ? ' NULL ' : ' \ '' . pSQL ( $product [ 'reference' ]) . '\'' ) . ' ,
'.(empty($product[' supplier_reference ']) ? ' NULL ' : ' \ '' . pSQL ( $product [ 'supplier_reference' ]) . '\'' ) . ' ,
'.(float)($product[' id_product_attribute '] ? $product[' weight_attribute '] : $product[' weight ']).' ,
\ '' . ( empty ( $tax_rate ) ? '' : pSQL ( $product [ 'tax' ])) . ' \ ' ,
'.(float)($tax_rate).' ,
'.(float)Tools::convertPrice(floatval($product[' ecotax ']), intval($order->id_currency)).' ,
'.(float)$ecotaxTaxRate.' ,
'.(($specificPrice AND $specificPrice[' from_quantity '] > 1) ? 1 : 0).' ,
\ '' . pSQL ( $deadline ) . ' \ ' ,
\ '' . pSQL ( $download_hash ) . '\'),' ;
$customizationQuantity = 0 ;
if ( isset ( $customizedDatas [ $product [ 'id_product' ]][ $product [ 'id_product_attribute' ]]))
{
$customizationText = '' ;
foreach ( $customizedDatas [ $product [ 'id_product' ]][ $product [ 'id_product_attribute' ]] AS $customization )
2016-01-04 12:48:08 +01:00
{
2017-12-18 09:44:27 +01:00
if ( isset ( $customization [ 'datas' ][ _CUSTOMIZE_TEXTFIELD_ ]))
foreach ( $customization [ 'datas' ][ _CUSTOMIZE_TEXTFIELD_ ] AS $text )
$customizationText .= $text [ 'name' ] . ':' . ' ' . $text [ 'value' ] . '<br />' ;
if ( isset ( $customization [ 'datas' ][ _CUSTOMIZE_FILE_ ]))
$customizationText .= sizeof ( $customization [ 'datas' ][ _CUSTOMIZE_FILE_ ]) . ' ' . Tools :: displayError ( 'image(s)' ) . '<br />' ;
$customizationText .= '---<br />' ;
2016-01-04 12:48:08 +01:00
}
2017-12-18 09:44:27 +01:00
$customizationText = rtrim ( $customizationText , '---<br />' );
$customizationQuantity = ( int )( $product [ 'customizationQuantityTotal' ]);
$productsList .=
'<tr style="background-color: ' . ( $key % 2 ? '#DDE2E6' : '#EBECEE' ) . ' ; " >
< td style = " padding: 0.6em 0.4em; " > '.$product[' reference '].' </ td >
< td style = " padding: 0.6em 0.4em; " >< strong > '.$product[' name '].(isset($product[' attributes ']) ? ' - '.$product[' attributes '] : ' ').' - '.$this->l(' Customized ').(!empty($customizationText) ? ' - '.$customizationText : ' ').' </ strong ></ td >
< td style = " padding: 0.6em 0.4em; text-align: right; " > '.Tools::displayPrice(Product::getTaxCalculationMethod() == PS_TAX_EXC ? $price : $price_wt, $currency, false).' </ td >
< td style = " padding: 0.6em 0.4em; text-align: center; " > '.$customizationQuantity.' </ td >
< td style = " padding: 0.6em 0.4em; text-align: right; " > '.Tools::displayPrice($customizationQuantity * (Product::getTaxCalculationMethod() == PS_TAX_EXC ? $price : $price_wt), $currency, false).' </ td >
2016-01-04 12:48:08 +01:00
</ tr > ' ;
}
2017-12-18 09:44:27 +01:00
if ( ! $customizationQuantity OR ( int ) $product [ 'cart_quantity' ] > $customizationQuantity )
$productsList .=
'<tr style="background-color: ' . ( $key % 2 ? '#DDE2E6' : '#EBECEE' ) . ' ; " >
< td style = " padding: 0.6em 0.4em; " > '.$product[' reference '].' </ td >
< td style = " padding: 0.6em 0.4em; " >< strong > '.$product[' name '].(isset($product[' attributes ']) ? ' - '.$product[' attributes '] : ' ').' </ strong ></ td >
< td style = " padding: 0.6em 0.4em; text-align: right; " > '.Tools::displayPrice(Product::getTaxCalculationMethod() == PS_TAX_EXC ? $price : $price_wt, $currency, false).' </ td >
< td style = " padding: 0.6em 0.4em; text-align: center; " > '.((int)($product[' cart_quantity ']) - $customizationQuantity).' </ td >
< td style = " padding: 0.6em 0.4em; text-align: right; " > '.Tools::displayPrice(((int)($product[' cart_quantity ']) - $customizationQuantity) * (Product::getTaxCalculationMethod() == PS_TAX_EXC ? $price : $price_wt), $currency, false).' </ td >
</ tr > ' ;
} // end foreach ($products)
$query = rtrim ( $query , ',' );
$result = $db -> Execute ( $query );
/* Add carrier tax */
$shippingCostTaxExcl = $cart -> getOrderShippingCost (( int ) $order -> id_carrier , false );
$allTaxes = TaxRulesGroup :: getTaxes (( int ) Carrier :: getIdTaxRulesGroupByIdCarrier (( int ) $order -> id_carrier ), $id_country , $id_state , $id_county );
$nTax = 0 ;
2016-01-04 12:48:08 +01:00
2017-12-18 09:44:27 +01:00
foreach ( $allTaxes AS $res )
{
if ( ! isset ( $res -> id ))
continue ;
if ( ! isset ( $storeAllTaxes [ $res -> id ]))
$storeAllTaxes [ $res -> id ] = array ();
if ( ! isset ( $storeAllTaxes [ $res -> id ][ 'amount' ]))
$storeAllTaxes [ $res -> id ][ 'amount' ] = 0 ;
$storeAllTaxes [ $res -> id ][ 'name' ] = $res -> name [( int ) $order -> id_lang ];
$storeAllTaxes [ $res -> id ][ 'rate' ] = $res -> rate ;
if ( ! $nTax ++ )
$storeAllTaxes [ $res -> id ][ 'amount' ] += ( $shippingCostTaxExcl * ( 1 + ( $res -> rate * 0.01 ))) - $shippingCostTaxExcl ;
else
2016-01-04 12:48:08 +01:00
{
2017-12-18 09:44:27 +01:00
$priceTmp = $order -> total_shipping / ( 1 + ( $res -> rate * 0.01 ));
$storeAllTaxes [ $res -> id ][ 'amount' ] += $order -> total_shipping - $priceTmp ;
2016-01-04 12:48:08 +01:00
}
2017-12-18 09:44:27 +01:00
}
2016-01-04 12:48:08 +01:00
2017-12-18 09:44:27 +01:00
/* Store taxes */
foreach ( $storeAllTaxes AS $t )
Db :: getInstance () -> Execute ( '
INSERT INTO '._DB_PREFIX_.' order_tax ( id_order , tax_name , tax_rate , amount )
VALUES ( '.(int)$order->id.' , \ '' . pSQL ( $t [ 'name' ]) . '\', \'' . ( float )( $t [ 'rate' ]) . '\', ' . ( float ) $t [ 'amount' ] . ')' );
// Insert discounts from cart into order_discount table
$discounts = $cart -> getDiscounts ();
$discountsList = '' ;
$total_discount_value = 0 ;
$shrunk = false ;
foreach ( $discounts AS $discount )
{
$objDiscount = new Discount (( int ) $discount [ 'id_discount' ]);
$value = $objDiscount -> getValue ( sizeof ( $discounts ), $cart -> getOrderTotal ( true , Cart :: ONLY_PRODUCTS ), $order -> total_shipping , $cart -> id );
if ( $objDiscount -> id_discount_type == 2 AND in_array ( $objDiscount -> behavior_not_exhausted , array ( 1 , 2 )))
$shrunk = true ;
if ( $shrunk AND ( $total_discount_value + $value ) > ( $order -> total_products_wt + $order -> total_shipping + $order -> total_wrapping ))
2016-01-04 12:48:08 +01:00
{
2017-12-18 09:44:27 +01:00
$amount_to_add = ( $order -> total_products_wt + $order -> total_shipping + $order -> total_wrapping ) - $total_discount_value ;
if ( $objDiscount -> id_discount_type == 2 AND $objDiscount -> behavior_not_exhausted == 2 )
{
$voucher = new Discount ();
foreach ( $objDiscount AS $key => $discountValue )
$voucher -> $key = $discountValue ;
$voucher -> name = 'VSRK' . ( int ) $order -> id_customer . 'O' . ( int ) $order -> id ;
$voucher -> value = ( float ) $value - $amount_to_add ;
$voucher -> add ();
$params [ '{voucher_amount}' ] = Tools :: displayPrice ( $voucher -> value , $currency , false );
$params [ '{voucher_num}' ] = $voucher -> name ;
$params [ '{firstname}' ] = $customer -> firstname ;
$params [ '{lastname}' ] = $customer -> lastname ;
$params [ '{id_order}' ] = $order -> id ;
@ Mail :: Send (( int ) $order -> id_lang , 'voucher' , Mail :: l ( 'New voucher regarding your order #' ) . $order -> id , $params , $customer -> email , $customer -> firstname . ' ' . $customer -> lastname );
}
2016-01-04 12:48:08 +01:00
}
2017-12-18 09:44:27 +01:00
else
$amount_to_add = $value ;
$order -> addDiscount ( $objDiscount -> id , $objDiscount -> name , $amount_to_add );
$total_discount_value += $amount_to_add ;
if ( $id_order_state != Configuration :: get ( 'PS_OS_ERROR' ) AND $id_order_state != Configuration :: get ( 'PS_OS_CANCELED' ))
$objDiscount -> quantity = $objDiscount -> quantity - 1 ;
$objDiscount -> update ();
$discountsList .=
' < tr style = " background-color:#EBECEE; " >
< td colspan = " 4 " style = " padding: 0.6em 0.4em; text-align: right; " > '.$this->l(' Voucher code : ').' '.$objDiscount->name.' </ td >
< td style = " padding: 0.6em 0.4em; text-align: right; " > '.($value != 0.00 ? ' - ' : ' ').Tools::displayPrice($value, $currency, false).' </ td >
</ tr > ' ;
}
2016-01-04 12:48:08 +01:00
2017-12-18 09:44:27 +01:00
// Specify order id for message
$oldMessage = Message :: getMessageByCartId (( int )( $cart -> id ));
if ( $oldMessage )
{
$message = new Message (( int ) $oldMessage [ 'id_message' ]);
$message -> id_order = ( int ) $order -> id ;
$message -> update ();
}
2016-01-04 12:48:08 +01:00
2017-12-18 09:44:27 +01:00
// Hook new order
$orderStatus = new OrderState (( int ) $id_order_state , ( int ) $order -> id_lang );
if ( Validate :: isLoadedObject ( $orderStatus ))
{
Hook :: newOrder ( $cart , $order , $customer , $currency , $orderStatus );
foreach ( $cart -> getProducts () AS $product )
if ( $orderStatus -> logable )
ProductSale :: addProductSale (( int ) $product [ 'id_product' ], ( int ) $product [ 'cart_quantity' ]);
}
2016-01-04 12:48:08 +01:00
2017-12-18 09:44:27 +01:00
if ( isset ( $outOfStock ) && $outOfStock && Configuration :: get ( 'PS_STOCK_MANAGEMENT' ))
{
$history = new OrderHistory ();
$history -> id_order = ( int ) $order -> id ;
$history -> changeIdOrderState ( Configuration :: get ( 'PS_OS_OUTOFSTOCK' ), ( int ) $order -> id );
$history -> addWithemail ();
}
2016-01-04 12:48:08 +01:00
2017-12-18 09:44:27 +01:00
// Set order state in order history ONLY even if the "out of stock" status has not been yet reached
// So you migth have two order states
$new_history = new OrderHistory ();
$new_history -> id_order = ( int ) $order -> id ;
$new_history -> changeIdOrderState (( int ) $id_order_state , ( int ) $order -> id );
$new_history -> addWithemail ( true , $extraVars );
2016-01-04 12:48:08 +01:00
2017-12-18 09:44:27 +01:00
// Order is reloaded because the status just changed
$order = new Order ( $order -> id );
2016-01-04 12:48:08 +01:00
2017-12-18 09:44:27 +01:00
// Send an e-mail to customer
if ( $id_order_state != Configuration :: get ( 'PS_OS_ERROR' ) AND $id_order_state != Configuration :: get ( 'PS_OS_CANCELED' ) AND $customer -> id )
{
2017-01-11 18:02:31 +01:00
2017-12-18 09:44:27 +01:00
$invoice = new Address (( int )( $order -> id_address_invoice ));
$delivery = new Address (( int )( $order -> id_address_delivery ));
$carrier = new Carrier (( int )( $order -> id_carrier ), $order -> id_lang );
/**
* #Override Antadis - Mondiale relay - Socol
*/
$_tr_delivery_desc = array ();
$_tr_delivery_desc [ 2 ] = array (
'MR' => " <p>Votre colis sera livré <strong>chez un commerçant</strong> du réseau Mondial Relay. Vous serez prévenu de la mise à disposition de votre colis par e-mail. Vous disposez alors de 10 jours ouvrables pour le récupérer. Passé ce délai, il nous sera automatiquement retourné.</p> " ,
'SOCOL_OOH' => " <p>Vous serez prévenu de la mise à disposition de votre colis par e-mail. Vous disposez alors de 10 jours ouvrables pour le récupérer. Passé ce délai, il nous sera automatiquement retourné.<p> " ,
'DOM' => " <p>Vos produits vous seront remis en main propre <strong>à l’ adresse de votre commande</strong>. Vous recevrez un email contenant le numéro de suivi du colis 48h avant. En cas d’ absence, votre colis sera déposé dans votre boîte aux lettres si son volume le permet.<br/>Dans le cas contraire, un avis de passage vous sera remis. Vous disposez alors de 10 jours ouvrables pour retirer votre colis dans votre bureau de poste. Passé ce délai, celui-ci nous sera automatiquement renvoyé. Et nous vous contacterons.</p> " ,
);
$_tr_delivery_desc [ 3 ] = array (
'DOM' => " <p>Recibirás un email con el número de seguimiento de tu pedido 48h antes.</p> "
);
$socol_carriers = array_map ( 'intval' , explode ( ',' , Configuration :: get ( 'ANT_CARRIERS_SOCOL' )));
$mr_carriers = array_map ( 'intval' , explode ( ',' , Configuration :: get ( 'ANT_CARRIERS_MR' )));
$dom_carriers = ( int ) Configuration :: get ( 'ANT_CARRIER_DOM' );
$drop_carriers = ( int ) Configuration :: get ( 'ANT_CARRIER_DROP' );
if (( int ) $order -> id_carrier == $dom_carriers || ( int ) $order -> id_carrier == $drop_carriers ) {
$delivery_carrier = 'DOM' ;
} elseif ( in_array (( int ) $order -> id_carrier , $socol_carriers )) {
$delivery_carrier = 'SOCOL_OOH' ;
} elseif ( in_array (( int ) $order -> id_carrier , $mr_carriers )) {
$delivery_carrier = 'MR' ;
} else {
$delivery_carrier = 'DOM' ;
}
$delivery_state = $delivery -> id_state ? new State (( int )( $delivery -> id_state )) : false ;
$invoice_state = $invoice -> id_state ? new State (( int )( $invoice -> id_state )) : false ;
// $date = new DateTime();
// $date->add(new DateInterval('P21D'));
// $date = $date->format('d/m/Y');
$date_order = new DateTime ();
$date_order = $date_order -> format ( 'd/m/Y' );
$date = new DateTime ();
$date -> add ( new DateInterval ( 'P21D' ));
$date = $date -> format ( 'd/m/Y' );
$date_int = new DateTime ();
$date_int -> add ( new DateInterval ( 'P25D' ));
$date_int = $date_int -> format ( 'd/m/Y' );
// Hook module delay
$params = array ( 'id_order' => $order -> id , 'id_lang' => $order -> id_lang );
$delivery_date = Module :: hookExec ( 'deliveryDelay' , $params );
// @Override Mondial relay delivery
if ( $mr = Db :: getInstance () -> getRow ( '
SELECT s .* , c . `id_country`
FROM `' . _DB_PREFIX_ . 'mr_selected` s
LEFT JOIN `' . _DB_PREFIX_ . 'mr_method` m
ON m . `id_mr_method` = s . `id_method`
LEFT JOIN `' . _DB_PREFIX_ . 'country` c
ON c . `iso_code` = s . `MR_Selected_Pays`
WHERE m . `id_carrier` = ' . (int) $order->id_carrier . '
AND s . `id_cart` = ' . (int) $order->id_cart . '
AND s . `MR_Selected_Num` IS NOT NULL
AND m . `id_mr_method` IS NOT NULL
' )) {
$delivery -> firstname = $mr [ 'MR_Selected_LgAdr1' ];
$delivery -> lastname = $mr [ 'MR_Selected_LgAdr2' ];
$delivery -> address1 = $mr [ 'MR_Selected_LgAdr3' ];
$delivery -> address2 = $mr [ 'MR_Selected_LgAdr4' ];
$delivery -> postcode = $mr [ 'MR_Selected_CP' ];
$delivery -> city = $mr [ 'MR_Selected_Ville' ];
$delivery -> id_country = isset ( $mr [ 'id_country' ]) && $mr [ 'id_country' ] ? ( int ) $mr [ 'id_country' ] : 8 ;
}
$delivery_block_html = $this -> _getFormatedAddress (
$delivery ,
" <br /> " ,
array (
'firstname' => '<span style="color:#DB3484; font-weight:bold;">%s</span>' ,
'lastname' => '<span style="color:#DB3484; font-weight:bold;">%s</span>' )
);
$data = array (
'{firstname}' => $customer -> firstname ,
'{lastname}' => $customer -> lastname ,
'{email}' => $customer -> email ,
'{delivery_block_txt}' => $this -> _getFormatedAddress ( $delivery , " \n " ),
'{invoice_block_txt}' => $this -> _getFormatedAddress ( $invoice , " \n " ),
'{delivery_block_html}' => $delivery_block_html ,
'{invoice_block_html}' => $this -> _getFormatedAddress ( $invoice , " <br /> " ,
array (
'firstname' => '<span style="color:#DB3484; font-weight:bold;">%s</span>' ,
'lastname' => '<span style="color:#DB3484; font-weight:bold;">%s</span>' )),
'{delivery_company}' => $delivery -> company ,
'{delivery_firstname}' => $delivery -> firstname ,
'{delivery_lastname}' => $delivery -> lastname ,
'{delivery_address1}' => $delivery -> address1 ,
'{delivery_address2}' => $delivery -> address2 ,
'{delivery_city}' => $delivery -> city ,
'{delivery_postal_code}' => $delivery -> postcode ,
'{delivery_country}' => $delivery -> country ,
'{delivery_state}' => $delivery -> id_state ? $delivery_state -> name : '' ,
'{delivery_phone}' => ( $delivery -> phone ) ? $delivery -> phone : $delivery -> phone_mobile ,
'{delivery_other}' => $delivery -> other ,
'{invoice_company}' => $invoice -> company ,
'{invoice_vat_number}' => $invoice -> vat_number ,
'{invoice_firstname}' => $invoice -> firstname ,
'{invoice_lastname}' => $invoice -> lastname ,
'{invoice_address2}' => $invoice -> address2 ,
'{invoice_address1}' => $invoice -> address1 ,
'{invoice_city}' => $invoice -> city ,
'{invoice_postal_code}' => $invoice -> postcode ,
'{invoice_country}' => $invoice -> country ,
'{invoice_state}' => $invoice -> id_state ? $invoice_state -> name : '' ,
'{invoice_phone}' => ( $invoice -> phone ) ? $invoice -> phone : $invoice -> phone_mobile ,
'{invoice_other}' => $invoice -> other ,
'{order_name}' => sprintf ( " #%06d " , ( int )( $order -> id )),
'{date}' => $date_order , //Tools::displayDate(date('Y-m-d H:i:s'), (int)($order->id_lang), 1),
'{delivery_date}' => $delivery_date ,
'{carrier}' => $carrier -> name ,
'{payment}' => Tools :: substr ( $order -> payment , 0 , 32 ),
'{products}' => $productsList ,
'{discounts}' => $discountsList ,
'{total_paid}' => Tools :: displayPrice ( $order -> total_paid , $currency , false ),
'{total_products}' => Tools :: displayPrice ( $order -> total_paid - $order -> total_shipping - $order -> total_wrapping + $order -> total_discounts , $currency , false ),
'{total_discounts}' => Tools :: displayPrice ( $order -> total_discounts , $currency , false ),
'{total_shipping}' => Tools :: displayPrice ( $order -> total_shipping , $currency , false ),
'{total_wrapping}' => Tools :: displayPrice ( $order -> total_wrapping , $currency , false ),
'{delivery_desc}' => $_tr_delivery_desc [( int ) $cart -> id_lang ][ $delivery_carrier ]
);
if ( is_array ( $extraVars ))
$data = array_merge ( $data , $extraVars );
// Join PDF invoice
if (( int )( Configuration :: get ( 'PS_INVOICE' )) AND Validate :: isLoadedObject ( $orderStatus ) AND $orderStatus -> invoice AND $order -> invoice_number )
{
$fileAttachment [ 'content' ] = PDF :: invoice ( $order , 'S' );
$fileAttachment [ 'name' ] = Configuration :: get ( 'PS_INVOICE_PREFIX' , ( int )( $order -> id_lang )) . sprintf ( '%06d' , $order -> invoice_number ) . '.pdf' ;
$fileAttachment [ 'mime' ] = 'application/pdf' ;
}
else
$fileAttachment = NULL ;
if ( Validate :: isEmail ( $customer -> email )){
Mail :: Send (( int ) $order -> id_lang , 'order_conf' , Mail :: l ( 'Order confirmation' , ( int ) $order -> id_lang ), $data , $customer -> email , $customer -> firstname . ' ' . $customer -> lastname , NULL , NULL , $fileAttachment );
2016-01-04 12:48:08 +01:00
}
}
2017-12-18 09:44:27 +01:00
$this -> currentOrder = ( int ) $order -> id ;
return true ;
2016-01-04 12:48:08 +01:00
}
else
{
2017-12-18 09:44:27 +01:00
$errorMessage = Tools :: displayError ( 'Order creation failed' );
Logger :: addLog ( $errorMessage , 4 , '0000002' , 'Cart' , intval ( $order -> id_cart ));
2016-01-04 12:48:08 +01:00
die ( $errorMessage );
}
}
2017-12-18 09:44:27 +01:00
else
2016-01-04 12:48:08 +01:00
{
2017-12-18 09:44:27 +01:00
$errorMessage = Tools :: displayError ( 'Cart can\'t be loaded or an order has already been placed using this cart' );
Logger :: addLog ( $errorMessage , 4 , '0000001' , 'Cart' , intval ( $cart -> id ));
die ( $errorMessage );
2016-01-04 12:48:08 +01:00
}
}
2017-12-18 09:44:27 +01:00
protected function _getFormatedAddress ( Address $the_address , $line_sep , $fields_style = array ())
{
return AddressFormat :: generateAddress ( $the_address , array ( 'avoid' => array ()), $line_sep , ' ' , $fields_style );
}
}