Jump to content

AdminOrdersControllers ajout / tri de la quantité de produits (pack disséqué) d'une commande


Recommended Posts

Bonjour le Forum,

J'ai besoin d'un petit coup de main pour terminer une requête qui permet d'afficher la quantité de produits contenus dans une commande sans oublier compter le nombre de produits contenus dans les packs. Cette quantité s'affiche dans une colonne dans le listing des commandes AdminOrdersController.

Jusque là j'ai avancé correctement et mon code permet déjà d'afficher la bonne quantité de produits. En revanche, je n'arrive pas à mettre en place le tri (croissant/décroissant) des commandes par ordre de quantité de produits...

Dans le fichier AdminOrdersController :

La requête SQL :

$this->_select = '
		a.id_currency,
		a.id_order AS id_pdf,
		a.id_order AS nbre_pot,
		a.reference AS reference,
		CONCAT(LEFT(c.`firstname`, 1), \'. \', c.`lastname`) AS `customer`,
		osl.`name` AS `osname`,
		os.`color`,
		IF((SELECT so.id_order FROM `'._DB_PREFIX_.'orders` so WHERE so.id_customer = a.id_customer AND so.id_order < a.id_order LIMIT 1) > 0, 0, 1) as new,
		country_lang.name as cname,
		IF(a.valid, 1, 0) badge_success';

        $this->_join = '
		LEFT JOIN `'._DB_PREFIX_.'customer` c ON (c.`id_customer` = a.`id_customer`)
		LEFT JOIN `'._DB_PREFIX_.'address` address ON address.id_address = a.id_address_delivery
		LEFT JOIN `'._DB_PREFIX_.'country` country ON address.id_country = country.id_country
		LEFT JOIN `'._DB_PREFIX_.'country_lang` country_lang ON (country.`id_country` = country_lang.`id_country` AND country_lang.`id_lang` = '.(int)$this->context->language->id.')
		LEFT JOIN `'._DB_PREFIX_.'order_state` os ON (os.`id_order_state` = a.`current_state`)
		LEFT JOIN `'._DB_PREFIX_.'order_state_lang` osl ON (os.`id_order_state` = osl.`id_order_state` AND osl.`id_lang` = '.(int)$this->context->language->id.')';
        $this->_orderBy = 'id_order';
        $this->_orderWay = 'DESC';
        $this->_use_found_rows = true;

Pour afficher la colonne :

        $this->fields_list = array_merge($this->fields_list, array(
            'total_paid_tax_incl' => array(
                'title' => $this->l('Total'),
                'align' => 'text-left',
                'type' => 'price',
                'currency' => true,
                'callback' => 'setOrderCurrency',
                'badge_success' => true
            ),// Ajout de la colonne
			'nbre_pot' => array(
                'title' => $this->l('Nbre pots'),
                'align' => 'text-center',
                'callback' => 'calculnombrepot',
				'orderby' => false
            )
        ));

La fonction calculnombrepot :

public function calculnombrepot($id_order, $tr){
		
		// Requete pour compter le nombre de pots sans distinction du nombre de pots contenu dans un pack
		$nombre_pot = Db::getInstance()->executeS('
			SELECT SUM(product_quantity) AS qt 
			FROM `'._DB_PREFIX_.'order_detail` od 
			WHERE od.`id_order` = '.(int)$id_order);
		// Si une commande ne comptabilise pas de pack, on obtient le nombre de pots simplement
		$quantite = $nombre_pot[0]['qt'];
		
		// On recommence sans SUM pour analyser les produits de la commande
		$nombre_pots = Db::getInstance()->executeS('
			SELECT product_id, id_order, product_quantity
			FROM '._DB_PREFIX_.'order_detail
			WHERE id_order = '.(int)$id_order);
		foreach($nombre_pots as $nbp){
			$is_pack = Db::getInstance()->getRow('
					SELECT cache_is_pack, id_product 
					FROM '._DB_PREFIX_.'product
					WHERE id_product = '.$nbp['product_id']);
			//Si le produit est un pack
			if($is_pack['cache_is_pack'] == 1){
				// On compte le nombre de produit dans le pack
				$pdt_in_pack = Db::getInstance()->executeS('
					SELECT SUM(quantity) AS qtp 
					FROM `'._DB_PREFIX_.'pack` as pck
					WHERE pck.`id_product_pack` = '.(int)$is_pack['id_product']);
					
				// On ajoute à $quantite le nombre de produit dans le pack
				// multiplié par la quantité de pack
				// on soustrait du final la quantité de pack
				$quantite += (($pdt_in_pack[0]['qtp']*$nbp['product_quantity'])-$nbp['product_quantity']);
			}
		}
		
		return $quantite;
}

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More