diff --git a/adm/tabs/AdminOrders.php b/adm/tabs/AdminOrders.php index 592855b0..ee5744a8 100755 --- a/adm/tabs/AdminOrders.php +++ b/adm/tabs/AdminOrders.php @@ -136,6 +136,276 @@ class AdminOrders extends AdminTab $this->_errors[] = Tools::displayError('You do not have permission to edit here.'); } + elseif(Tools::getValue('send_return_instruction') && Tools::getValue('id_order_return')) { + $id_order = (int) Tools::getValue('id_order'); + $id_order_return = (int) Tools::getValue('id_order_return'); + if(Validate::isLoadedObject($order = new Order($id_order))) { + $customer = new Customer($order->id_customer); + $return_link = Db::getInstance()->getRow(' + SELECT `return_number`, `link` + FROM `'._DB_PREFIX_.'order_return_link` + WHERE `id_order_return` = '.(int) $id_order_return.' + '); + $products = Db::getInstance()->ExecuteS(' + SELECT `id_order_detail`, `product_quantity` + FROM `'._DB_PREFIX_.'order_return_detail` + WHERE `id_order_return` = '.(int) $id_order_return.' + '); + $product_list = ''; + Mail::Send( + intval($order->id_lang), + 'order_return_2', + $subject[(int) $order->id_lang], + array( + '{id_order}' => $order->id, + '{return_link}' => $return_link['link'], + '{product_list}' => $product_list, + '{product_list_txt}' => implode("\r\n", $product_list_txt), + ), + $customer->email, + $customer->firstname.' '.$customer->lastname + ); + } + } + elseif(Tools::isSubmit('submitCreateReturn')) { + $id_order = (int) Tools::getValue('id_order'); + if(Validate::isLoadedObject($order = new Order($id_order)) && ($address_delivery = Db::getInstance()->getRow(' + SELECT * + FROM `'._DB_PREFIX_.'address` + WHERE `id_address` = '.(int) $order->id_address_delivery.' + ')) && in_array((int) $address_delivery['id_country'], array(3, 6, 8, 12))) { + $returnable = array(); + foreach(Db::getInstance()->ExecuteS(' + SELECT d.`id_order_detail`, d.`id_order`, d.`product_name`, d.`product_quantity_return`, d.`product_quantity_refunded`, d.`product_quantity`, c.`id_sale`, d.`product_weight` + FROM `'._DB_PREFIX_.'order_detail` d + LEFT JOIN `'._DB_PREFIX_.'product_ps_cache` c + ON d.`product_id` = c.`id_product` + WHERE d.`id_order` = '.(int) $order->id.' + ') as $product) { + $qty = OrderReturn::getOrderDetailReturnQty($product); + if($qty > 0) { + $returnable[$product['id_order_detail']] = array($product['product_name'], $qty, $product['product_weight']); + } + } + } + $error = FALSE; + $total_weight = 0.0; + $return_reasons = array(); + foreach(Tools::getValue('return_product') as $id_order_detail => $qty) { + if(!isset($returnable[(int) $id_order_detail]) || $returnable[(int) $id_order_detail][1] < $qty) { + $error = TRUE; + } else { + for($i = 1; $i <= $qty; $i++) { + if(!($return_reason = Tools::getValue('return_reason_'.$id_order_detail.'_'.$i))) { + $error = true; + $this->_errors[] = Tools::displayError('Order detail #%s empty return reason'); + } elseif(!($return_instruction = Tools::getValue('return_instruction_'.$id_order_detail.'_'.$i))) { + $error = true; + $this->_errors[] = Tools::displayError('Order detail #%s empty return instruction'); + } else { + $return_reasons[] = array($id_order_detail, $i, $return_reason, $return_instruction); + } + } + $total_weight += $qty * $returnable[(int) $id_order_detail][2]; + } + } + if(!$error) { + Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'order_return` + VALUES ( + DEFAULT, + '.(int) $order->id_customer.', + '.(int) $order->id.', + 2, + "'.''/* QUESTION */.'", + NOW(), + NOW() + ) + '); + $id_order_return = Db::getInstance()->Insert_ID(); + foreach($return_reasons as $return_reason) { + Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'order_return_detail_qty` (`id_order_return`, `id_order_detail`, `qty`, `reason`, `instruction`) + VALUES ( + '.(int) $id_order_return.', + '.(int) $return_reason[0].', + '.(int) $return_reason[1].', + '.(int) $return_reason[2].', + '.(int) $return_reason[3].' + ) + '); + } + $product_list = ''; + if($order->id_lang == 3) { + // Spain + if((int) Tools::getValue('return_option') == 2) { + // Free + $pcode = '11'; + $chars = array('I', 'O', 'P', 'S', 'T', ); + $return_link = 'http://devoluciones.puntopack.es/d/F1BEBEBO/?SiteId=F1BEBEBO&Country=ES&Language=es'; + } + // else { + // // Paid + // $pcode = '08'; + // $chars = array('A', 'E', 'K', 'R', 'Z', ); + // $return_link = 'http://devoluciones.puntopack.es/d/F1BEBEBO/?SiteId=F1BEBEBO4&Country=ES&Language=es'; + // } + } else { + if((int) $address_delivery['id_country'] == 3) { + // Belgium + if((int) Tools::getValue('return_option') == 2) { + // Free + $pcode = '36'; + $chars = array('K', 'P', 'T', 'S', 'W', 'Z', ); + $return_link = 'http://retours.mondialrelay.com/d/F1BEBEBO/?SiteId=F1BEBEBO&Country=BE&Language=fr'; + } + // else { + // // Paid + // $pcode = '24'; + // $chars = array('C', 'J', 'L', 'M', 'N', 'R', ); + // $return_link = 'http://retours.mondialrelay.com/d/F1BEBEBO/?SiteId=F1BEBEBO5&Country=BE&Language=fr'; + // } + } elseif((int) $address_delivery['id_country'] == 6) { + // Spain + if((int) Tools::getValue('return_option') == 2) { + // Free + $pcode = '11'; + $chars = array('I', 'O', 'P', 'S', 'T', ); + $return_link = 'http://devoluciones.puntopack.es/d/F1BEBEBO/?SiteId=F1BEBEBO&Country=ES&Language=fr'; + } + // else { + // // Paid + // $pcode = '08'; + // $chars = array('A', 'E', 'K', 'R', 'Z', ); + // $return_link = 'http://devoluciones.puntopack.es/d/F1BEBEBO/?SiteId=F1BEBEBO4&Country=ES&Language=fr'; + // } + } elseif((int) $address_delivery['id_country'] == 8) { + // France + if((int) Tools::getValue('return_option') == 2) { + // Free + $pcode = '05'; + $chars = array('L', 'J', 'R', 'N', 'W', ); + $return_link = 'http://retours.mondialrelay.com/d/F1BEBEBO/?SiteId=F1BEBEBO&Country=FR&Language=fr'; + } + // else { + // // Paid + // $pcode = '01'; + // $chars = array('B', 'C', 'D', 'G', 'V', ); + // $return_link = 'http://retours.mondialrelay.com/d/F1BEBEBO/?SiteId=F1BEBEBO6&Country=FR&Language=fr'; + // } + } + // elseif((int) $address_delivery['id_country'] == 12) { + // // Luxemburg + // if((int) Tools::getValue('return_option') == 2) { + // // Free + // $pcode = '05'; + // $chars = array('L', 'J', 'R', 'N', 'W', ); + // $return_link = 'http://retours.mondialrelay.com/d/F1BEBEBO/?SiteId=F1BEBEBO&Country=LU&Language=fr'; + // } else { + // // Paid + // $pcode = '01'; + // $chars = array('B', 'C', 'D', 'G', 'V', ); + // $return_link = 'http://retours.mondialrelay.com/d/F1BEBEBO/?SiteId=F1BEBEBO6&Country=LU&Language=fr'; + // } + // } + } + Db::getInstance()->Execute('SET AUTOCOMMIT = 0'); + Db::getInstance()->Execute('START TRANSACTION'); + $cpt = Db::getInstance()->ExecuteS(' + SELECT `number` + FROM `'._DB_PREFIX_.'order_return_link_number` + WHERE `carrier` = "mondialrelay" + FOR UPDATE + '); + $cpt = (int) $cpt[0]['number'] + 1; + Db::getInstance()->ExecuteS(' + UPDATE `'._DB_PREFIX_.'order_return_link_number` + SET `number` = '.(int) $cpt.' + WHERE `carrier` = "mondialrelay" + '); + Db::getInstance()->Execute('COMMIT'); + Db::getInstance()->Execute('SET AUTOCOMMIT = 1'); + $cpt = sprintf('%06d', $cpt); + $return_number = 'R'.substr($cpt, 0, 2).chr(65 + rand(0, 25)).substr($cpt, 2, 2).$chars[rand(0, count($chars) - 1)].substr($cpt, 4, 2).'P'.$pcode.substr($pcode, 0, 1).substr($cpt, 5, 1).substr($pcode, 1, 1); + $return_link .= '&Email='.rawurlencode(Db::getInstance()->getValue(' + SELECT `email` + FROM `'._DB_PREFIX_.'customer` + WHERE `id_customer` = '.(int) $order->id_customer.' + ')).'&CustomReference='.$return_number.'&Adress1='.rawurlencode($address_delivery['lastname']).'&Adress2='.rawurlencode($address_delivery['firstname']).'&Adress3='.rawurlencode($address_delivery['address1']).'&Adress4='.rawurlencode($address_delivery['address2']).'&PostCode='.rawurlencode($address_delivery['postcode']).'&City='.rawurlencode($address_delivery['city']).'&WeightInGramm='.((int) ($total_weight * 1000)); + Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'order_return_link` + VALUES ( + '.(int) $id_order_return.', + '.(int) $cookie->id_employee.', + NOW(), + '.((int) Tools::getValue('return_option') == 2? 1: 0).', + 0, + "mondialrelay", + "'.pSQL($return_number).'", + "'.pSQL($return_link).'", + "'.pSQL(nl2br2(strip_tags(trim(Tools::getValue('return_comment')))), TRUE).'" + ) + '); + $subject = array( + 1 => 'Your order return #'.$id_order_return, + 2 => 'Votre demande de retour n°'.$id_order_return, + 3 => 'Solicitud de devolución n°'.$id_order_return, + 5 => 'La vostra domanda di restituzione #'.$id_order_return, + 6 => 'Your order return #'.$id_order_return, + ); + $customer = new Customer($order->id_customer); + Mail::Send( + intval($order->id_lang), + 'order_return_'.((int) Tools::getValue('return_option') == 2? '2': '3'), + $subject[(int) $order->id_lang], + array( + '{id_order}' => $order->id, + '{return_link}' => $return_link, + '{product_list}' => $product_list, + '{product_list_txt}' => implode("\r\n", $product_list_txt), + ), + $customer->email, + $customer->firstname.' '.$customer->lastname + ); + } + header('Location: '.$_SERVER['REQUEST_URI']); + exit; + } + + /* Change order state, add a new entry in order history and send an e-mail to the customer if needed */ elseif (Tools::isSubmit('submitState') AND ($id_order = (int)(Tools::getValue('id_order'))) AND Validate::isLoadedObject($order = new Order($id_order))) { @@ -511,6 +781,15 @@ class AdminOrders extends AdminTab $sent_logistics[(int) $row['id_order_detail']] = (int) $row['quantity']; } + foreach(Db::getInstance()->ExecuteS(' + SELECT SUM(`quantity`) AS `quantity`, `id_order_detail` + FROM `'._DB_PREFIX_.'mondialrelay_parcel` + WHERE `id_order_detail` IN ('.implode(', ', array_keys($parcel_quantities)).') + GROUP BY `id_order_detail` + ') as $row) { + $sent_logistics[(int) $row['id_order_detail']] = (int) $row['quantity']; + } + foreach(Db::getInstance()->ExecuteS(' SELECT SUM(`quantity`) AS `quantity`, `id_order_detail` FROM `'._DB_PREFIX_.'exapaqws` @@ -989,6 +1268,23 @@ class AdminOrders extends AdminTab
 
'; + $product_psale = array(); + $products_ids = array(); + foreach(Db::getInstance()->ExecuteS(' + SELECT DISTINCT `product_id` + FROM `'._DB_PREFIX_.'order_detail` + WHERE `id_order` = '.(int) $order->id.' + ') as $row) { + $products_ids[] = (int) $row['product_id']; + } + foreach(Db::getInstance()->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'product_ps_cache` + WHERE `id_product` IN ('.implode(', ', $products_ids).') + ') as $row) { + $product_psale[(int) $row['id_product']] = (int) $row['id_sale']; + } + // List of products echo '
@@ -1222,9 +1518,116 @@ class AdminOrders extends AdminTab foreach ($returns as $return) { $state = new OrderReturnState($return['state']); + + /* Mondial relay return */ + $return_link = FALSE; + if($state->id == 2) { + $return_link = Db::getInstance()->getRow(' + SELECT `return_number`, `link` + FROM `'._DB_PREFIX_.'order_return_link` + WHERE `id_order_return` = '.(int) $return['id_order_return'].' + '); + } + echo '('.Tools::displayDate($return['date_upd'], $cookie->id_lang).') : '.$this->l('#').sprintf('%06d', $return['id_order_return']).' - - '.$state->name[$cookie->id_lang].'
'; + '.$state->name[$cookie->id_lang].'
'.($return_link? ' ('.$this->l('return link:').' '.$return_link['return_number'].' '.$this->l('Renvoyer les instructions retour').')': ''); + } + + if(in_array($addressDelivery->id_country, array(3, 6, 8))) { + $returnable = array(); + foreach ($products as $k => $product) { + $product['id_sale'] = $product_psale[(int) $product['product_id']]; + $qty = OrderReturn::getOrderDetailReturnQty($product); + if($qty > 0) { + $returnable[$product['id_order_detail']] = array($product['product_name'], $qty); + } + } + if(count($returnable) > 0) { + $instructions = array( + 1 => 'Remboursement + Mise en stock', + 2 => 'Échange', + 3 => 'Défectueux', + ); + $reasons = array( + // 1 => 'CLIENT : Annulation pré-envoi', + 2 => 'CLIENT : Rétractation post-envoi', + 11 => 'CLIENT : Annulation pour ré-achat', + 4 => 'FEUR : Problème SAV', + 5 => 'FEUR : Produit manquant', + 3 => 'BBB : Erreur Achat / Prod', + 6 => 'BBB : Erreur Logistique ', + 8 => 'BBB : Pbme Site / Paiment', + 12 => 'BBB : Suspicion de fraude', + 9 => 'TRANS : Colis détruit', + 10 => 'TRANS : Colis perdu', + 7 => 'Autre' + ); + + echo ' +

+

'.$this->l('Create a product return').'

+
+ +

+ + +

+

+ + +

+

+
'; + } else { + echo '

'.$this->l('No product can currently be returned on this order').'

'; + } } echo ''; diff --git a/adm/tabs/AdminReturn.php b/adm/tabs/AdminReturn.php index 96330a7d..c531040d 100755 --- a/adm/tabs/AdminReturn.php +++ b/adm/tabs/AdminReturn.php @@ -1,6 +1,6 @@ array('title' => $this->l('Order ID'), 'width' => 75, 'align' => 'center'), 'name' => array('title' => $this->l('Status'), 'width' => 150, 'align' => 'center'), 'date_add' => array('title' => $this->l('Date issued'), 'width' => 60, 'type' => 'date', 'align' => 'right')); - + $this->optionTitle = $this->l('Merchandise return (RMA) options'); $this->_fieldsOptions = array( 'PS_ORDER_RETURN' => array('title' => $this->l('Enable returns:'), 'desc' => $this->l('Select whether or not to activate merchandise return for your shop'), 'cast' => 'intval', 'type' => 'bool'), 'PS_ORDER_RETURN_NB_DAYS' => array('title' => $this->l('Time limit of validity:'), 'desc' => $this->l('Number of days the customer can make a return after the delivery date'), 'cast' => 'intval', 'type' => 'text', 'size' => '2'), ); - + parent::__construct(); } - + public function postProcess() { global $currentIndex, $cookie; - + if (Tools::isSubmit('deleteorder_return_detail')) { if ($this->tabAccess['delete'] === '1') @@ -118,11 +118,22 @@ class AdminReturn extends AdminTab } parent::postProcess(); } - + public function display() { global $currentIndex, $cookie; + if($return_number = Tools::getValue('return_number')) { + if($return = Db::getInstance()->getRow(' + SELECT * + FROM `'._DB_PREFIX_.'order_return_link` + WHERE `return_number` = "'.pSQL($return_number).'" + ')) { + header('Location: /adm/index.php?tab=AdminReturn&id_order_return='.(int) $return['id_order_return'].'&updateorder_return&token='.Tools::getValue('token')); + exit; + } + } + // Include current tab if (isset($_GET['update'.$this->table])) { @@ -137,13 +148,40 @@ class AdminReturn extends AdminTab else { $this->getList((int)($cookie->id_lang), !Tools::getValue($this->table.'Orderby') ? 'date_add' : NULL, !Tools::getValue($this->table.'Orderway') ? 'DESC' : NULL); + echo ' +
+ '.$this->l('Find order return by return number').' +

+ + '.$this->l('Submit').' +

+
+
+ + '; + $this->displayList(); $this->displayOptionsList(); $this->includeSubTab('display'); } } - + public function displayListContent($token = NULL) { global $currentIndex, $cookie; @@ -159,12 +197,12 @@ class AdminReturn extends AdminTab echo ''; } } - + public function displayForm($isMainTab = true) { global $currentIndex, $cookie; parent::displayForm(); - + if (!($obj = $this->loadObject(true))) return; diff --git a/mails/fr/order_return_2.html b/mails/fr/order_return_2.html new file mode 100644 index 00000000..d207b5c1 --- /dev/null +++ b/mails/fr/order_return_2.html @@ -0,0 +1,66 @@ + + + + + Message de {shop_name} + + + + + + + + + + + + + + + + + + + + + + +
+ {shop_name} +
 
Cher(e) client(e),
 
+ Vous avez fait une demande de retour gratuit concernant votre commande n°{id_order} pour le(s) produit(s) suivant(s) : +

+ {product_list} +

+ Nous sommes heureux de vous faire bénéficier d'une étiquette de retour prépayée. +

+ Pour cela Il vous suffit de cliquer sur le lien suivant et de suivre les instructions + indiquées par notre prestataire retour, Mondial Relay : +

+ Cliquez ici pour obtenir votre étiquette de retour +


+ Voici un tutoriel pour bien retourner votre colis : +

+ Vous devez utiliser un emballage fermé, résistant, à même de protéger le contenu + et respectant les exigences du transport et son traitement industriel. +

+ Le produit doit être contenu dans son emballage d'origine. +

+ Veuillez glisser dans le colis une copie de votre facture ou tout autre justificatif + permettant de retrouver votre commande. +

+ Vous devez coller l'étiquette fournie par Mondial Relay sur une face bien visible du colis. +


+ Le dépôt des colis se fait dans l'un des 4 500 Point Relais® de France. +
+ Vous pouvez retrouver la liste des points relais près de chez vous en cliquant sur ce lien +
+ Le commerçant vous remettra un justificatif à conserver pour justifier votre dépôt + en cas de besoin. +
 
+ Le service client +
 
+ {shop_name} - {shop_url} +
+ + diff --git a/mails/fr/order_return_2.txt b/mails/fr/order_return_2.txt new file mode 100644 index 00000000..5d57acae --- /dev/null +++ b/mails/fr/order_return_2.txt @@ -0,0 +1,36 @@ +Cher(e) client(e), + +Vous avez fait une demande de retour gratuit concernant votre commande n°{id_order} +pour le(s) produit(s) suivant(s) : + +{product_list_txt} + +Nous sommes heureux de vous faire bénéficier d'une étiquette de retour prépayée. +Pour cela Il vous suffit de cliquer sur le lien suivant et de suivre les instructions +indiquées par notre prestataire retour, Mondial Relay : + +{return_link} + +Voici un tutoriel pour bien retourner votre colis : + +Vous devez utiliser un emballage fermé, résistant, à même de protéger le contenu +et respectant les exigences du transport et son traitement industriel. + +Le produit doit être contenu dans son emballage d'origine. + +Veuillez glisser dans le colis une copie de votre facture ou tout autre justificatif +permettant de retrouver votre commande. + +Vous devez coller l'étiquette fournie par Mondial Relay sur une face bien visible du colis. + +Le dépôt des colis se fait dans l'un des 4 500 Points Relais® de France. +Vous pouvez retrouver la liste des points relais près de chez vous en cliquant sur ce lien: + +http://www.mondialrelay.fr/trouver-le-point-relais-le-plus-proche-de-chez-moi/ + +Le commerçant vous remettra un justificatif à conserver pour justifier votre dépôt +en cas de besoin. + +Le service client + +{shop_name} - {shop_url} diff --git a/mails/fr/order_return_3.html b/mails/fr/order_return_3.html new file mode 100644 index 00000000..ca4afaab --- /dev/null +++ b/mails/fr/order_return_3.html @@ -0,0 +1,61 @@ + + + + + Message de {shop_name} + + + + + + + + + + + + + + + + + + + + + + +
+ {shop_name} +
 
Cher(e) client(e),
 
+ Vous avez fait une demande de retour concernant votre commande n°{id_order} pour le(s) produit(s) suivant(s) : +

+ {product_list} +

+ Veuillez trouver ci-dessous le lien qui vous permettra d'obtenir une étiquette de + retour pré-remplie :

+ Cliquez ici pour obtenir votre étiquette de retour

+ Il vous suffit de cliquer sur le lien et de suivre les instructions indiquées par + notre prestataire retour : Mondial Relay.


+ Voici un tutoriel pour bien retourner votre colis : +

+ Vous devez utiliser un emballage fermé, résistant, à même de protéger le contenu + et respectant les exigences du transport et son traitement industriel. +

+ Le produit doit être contenu dans son emballage d'origine. +

+ Veuillez glisser dans le colis une copie de votre facture ou tout autre justificatif + permettant de retrouver votre commande. +

+ Vous devez coller l'étiquette fournie pas Mondial Relay sur une face bien visible du colis. +


+ Le dépôt des colis se fait dans l'un des 4 500 Point Relais® de France.
+ Le commerçant vous remettra un justificatif à cênserver pour justifier votre dépôt + en cas de besoin. +
 
+ Le service client +
 
+ {shop_name} - {shop_url} +
+ + diff --git a/mails/fr/order_return_3.txt b/mails/fr/order_return_3.txt new file mode 100644 index 00000000..5f517bad --- /dev/null +++ b/mails/fr/order_return_3.txt @@ -0,0 +1,34 @@ +Cher(e) client(e), + +Vous avez fait une demande de retour concernant votre commande n°{id_order} pour +le(s) produit(s) suivant(s) : + +{product_list_txt} + +Veuillez trouver ci-dessous le lien qui vous permettra d'obtenir une étiquette de +retour pré-remplie : + +{return_link} + +Il vous suffit de cliquer sur le lien et de suivre les instructions indiquées par +notre prestataire retour : Mondial Relay. + +Voici un tutoriel pour bien retourner votre colis : + +Vous devez utiliser un emballage fermé, résistant, à même de protéger le contenu +et respectant les exigences du transport et son traitement industriel. + +Le produit doit être contenu dans son emballage d'origine. + +Veuillez glisser dans le colis une copie de votre facture ou tout autre justificatif +permettant de retrouver votre commande. + +Vous devez coller l'étiquette fournie pas Mondial Relay sur une face bien visible du colis. + +Le dépôt des colis se fait dans l'un des 4 500 Point Relais® de France. +Le commerçant vous remettra un justificatif à conserver pour justifier votre dépôt +en cas de besoin. + +Le service client + +{shop_name} - {shop_url} diff --git a/override/classes/OrderReturn.php b/override/classes/OrderReturn.php new file mode 100644 index 00000000..6f9525e1 --- /dev/null +++ b/override/classes/OrderReturn.php @@ -0,0 +1,34 @@ +getRow(' + SELECT `id_order` + FROM `'._DB_PREFIX_.'shipping_history` + WHERE `id_order` = '.(int) $product['id_order'].' + AND `id_sale` = '.(int) $product['id_sale'].' + ')) { + $qty = (int) $product['product_quantity'] - max((int) $product['product_quantity_refunded'], (int) $product['product_quantity_return']); + } else { + $qty = (int) Db::getInstance()->getValue(' + SELECT SUM(`quantity`) + FROM `'._DB_PREFIX_.'lapostews` + WHERE `id_order_detail` = '.(int) $product['id_order_detail'].' + ') + (int) Db::getInstance()->getValue(' + SELECT SUM(`quantity`) + FROM `'._DB_PREFIX_.'mondialrelay_parcel` + WHERE `id_order_detail` = '.(int) $product['id_order_detail'].' + ') - max($product['product_quantity_return'], $product['product_quantity_refunded']); + } + $qty -= (int) Db::getInstance()->getValue(' + SELECT SUM(d.`product_quantity`) + FROM `'._DB_PREFIX_.'order_return_detail` d + LEFT JOIN `'._DB_PREFIX_.'order_return` r + ON d.`id_order_return` = r.`id_order_return` + WHERE d.`id_order_detail` = '.(int) $product['id_order_detail'].' + AND r.`state` < 3 + '); + return $qty; + } +} +