Jump to content

Prise en compte poids emballage


Recommended Posts

  • 2 months later...

Bonjour :)

 

L'emballage est une propriété prise en compte lors du calcul des frais de port dans la section "transporteurs > destinations d’expédition et coûts". Vous pourrez alors configurer le prix total proposé en fonction des plages de poids des différents colis. 

 

Bonne soirée ! 

Link to comment
Share on other sites

même question, comment ajouter le poids de l'emballage final des produits pour le calcul des frais de port ?

 

quelqu'un a-t-il une idée de l'endroit où se trouve le code-source qui régit ce truc ?

Dans la classe cart.php, recherchez la fonction

	public function getTotalWeight($products = null)
	{
	    if (!is_null($products))
	    {
		$total_weight = 0;

                ...

Et remplacez le 0 de $total_weight (poids de départ avant d'ajouter celui de chaque produit du panier) par le poids de votre emballage (en kilos).

Mais tout ceci est relatif, car suivant le nombre de produits ou leurs dimensions, l'emballage ne sera pas forcément le même.

  • Like 2
Link to comment
Share on other sites

  • 4 years later...
On 12/29/2014 at 7:36 PM, Eolia said:

 

Dans la classe cart.php, recherchez la fonction


	public function getTotalWeight($products = null)
	{
	    if (!is_null($products))
	    {
		$total_weight = 0;

                ...

Et remplacez le 0 de $total_weight (poids de départ avant d'ajouter celui de chaque produit du panier) par le poids de votre emballage (en kilos).

Mais tout ceci est relatif, car suivant le nombre de produits ou leurs dimensions, l'emballage ne sera pas forcément le même.

Merci Eolia pour cette solution est elle valable pour 1.6.1.24 ? Juste une question pour 270 gr, je dois remplacer par $total_weight = 0,270; ou alors $total_weight = 0.270;

Link to comment
Share on other sites

  • 2 years later...

En prenant le temps de créer une table pour les dimensions de cartons et leur poids associés on peut arriver à quelque chose de plus précis^^

	public function getTotalWeight($products = null)
	{
        $cache = is_null($products) ? 1 : 0;
        
        if(!isset(self::$_totalWeight[$this->id])) {
            
            if ($cache)
                $products = $this->getProducts();
            
            $total_weight = 
            $volume = 0;
            $data = array();
            foreach ($products as $product) {
                
                if (!isset($product['weight_attribute']) || is_null($product['weight_attribute']))
                    $total_weight += $product['weight'] * $product['cart_quantity'];
                else
                    $total_weight += $product['weight_attribute'] * $product['cart_quantity'];
                $volume += $product['height'] * $product['width'] * $product['depth'] * $product['cart_quantity'];
            }
            if(!$volume)
                return $total_weight;
           
            $data['Volume'] = $volume;
            $data['Initial weight'] = $total_weight;
            $packages = Db::getInstance()->executeS('
                            SELECT *
                            FROM `'._DB_PREFIX_.'package`
                            ORDER BY volume ASC');
            // First step, one package matches totally                
            foreach($packages as $package) {
                
                if($volume <= $package['volume']) {
                    $total_weight += $package['weight'];  
                    $data['Packages'][] = array(
                                                'Name' => $package['name'],
                                                'Weight' => round((float)$total_weight, 3),
                                                'Volume' => $package['volume'],
                                                'Quantity' => 1
                                            );                          
                    break;                            
                }
            }
           
            // Second step, find bigger package if first step fails
            if(!isset($data['Packages'])) {
                               
                $new_packages = array_reverse($packages);
                
                foreach($new_packages as $new_package) {
                    
                    if($volume) {
                        
                        $nb_of_package = (int)($volume / $new_package['volume']);
                        if($nb_of_package) {
                        
                            $sold =  $volume % $new_package['volume'];                   
                            $weight_ratio = ($volume - $sold) / $volume;
                            $package_weight = $total_weight * $weight_ratio + $new_package['weight'] * $nb_of_package;
                            $data['Packages'][] = array(
                                                        'Name' => $new_package['name'],
                                                        'Weight' => round((float)$package_weight, 3),
                                                        'Volume' => $new_package['volume'] * $nb_of_package,
                                                        'Quantity' => $nb_of_package
                                                    );
                            $total_weight += $new_package['weight'] * $nb_of_package;
                            
                            // Third step, find smallest package to set sold                        
                            if($sold) {                                                     
                                foreach($packages as $package) {
                                    
                                    if($sold <= $package['volume']) {
                                        $data['Packages'][] = array(
                                                                    'Name' => $package['name'],
                                                                    'Weight' => round((float)$total_weight - (float)$package_weight + (float)$package['weight'], 3),
                                                                    'Volume' => $package['volume'],
                                                                    'Quantity' => 1
                                                                );
                                        $total_weight += $package['weight']; 
                                        $sold = 0;
                                        break 2;                            
                                    }
                                    else
                                        $volume = $sold; 
                                }                        
                            }
                            else
                                break;
                        }
                    }
                }                            
            }
           
            $data['Nb of packages'] = count($data['Packages']);
            $data['Total weight'] = $total_weight; 
            
            if(!$cache)
                return $total_weight;
            Db::getInstance()->execute('UPDATE `'._DB_PREFIX_.'cart` SET `packages` = \''.json_encode($data).'\' WHERE `id_cart` = '.(int)$this->id);           
            self::$_totalWeight[$this->id] = $total_weight;
        }
        return self::$_totalWeight[$this->id];

image.png.275230200723171d8a5ca9f7447b226c.png

Link to comment
Share on other sites

1 hour ago, passicool said:

Pas de raison que ça ne marche pas, en override bien activer la fonction dans le back office. Dans les 2 cas effacer le cache et recharger la page pour tester

et pourtant le cache est vidé (même s'il est désactivé) , j'ai jeté le fichier "class_index.php" du dossier "cache", mais rien n'y fait ;

j'ai passé $total_weight à 0.710, avec un produit de 850g -> je devrais donc dépasser ma tranche 0 à 1kg à 4.50€… mais non je reste à 4.50€ dans le panier ?

public function getTotalWeight($products = null)
    {
        if (!is_null($products)) {
            $total_weight = 0.710;
            foreach ($products as $product) {
                if (!isset($product['weight_attribute']) || is_null($product['weight_attribute'])) {
                    $total_weight += $product['weight'] * $product['cart_quantity'];
                } else {
                    $total_weight += $product['weight_attribute'] * $product['cart_quantity'];
                }
            }
            return $total_weight;
        }

 

Capture 1.png

Link to comment
Share on other sites

Ok, parce que vous n'êtes pas dans la première partie de la fonction ($products n'est pas défini)

Un peu plus bas, remplacez

self::$_totalWeight[$this->id] = round((float)$weight_product_with_attribute + (float)$weight_product_without_attribute, 6);

Par

self::$_totalWeight[$this->id] = round(0.71 + (float)$weight_product_with_attribute + (float)$weight_product_without_attribute, 6);

Et laissez bien $total_weight = 0.710; dans la 1ère partie, comme ça vous ajouterez bien le poids de l'emballage dans les 2 cas ;) 

Link to comment
Share on other sites

  • 3 months later...
On 1/3/2022 at 10:05 PM, Eolia said:

Ok, parce que vous n'êtes pas dans la première partie de la fonction ($products n'est pas défini)

Un peu plus bas, remplacez

self::$_totalWeight[$this->id] = round((float)$weight_product_with_attribute + (float)$weight_product_without_attribute, 6);

Par

self::$_totalWeight[$this->id] = round(0.71 + (float)$weight_product_with_attribute + (float)$weight_product_without_attribute, 6);

Et laissez bien $total_weight = 0.710; dans la 1ère partie, comme ça vous ajouterez bien le poids de l'emballage dans les 2 cas ;) 

Bonjour,
 

Je me greffe à la discussion car j'ai fais tout ceci, sans le faire afficher dans le panier, et le calcul est bien pris en compte. (chez moi  $total_weight = 0.055)

J'ai juste un problème : le poids de l'emballage n'est pas inclus dans le poids du colis en back-office qui va servir ensuite à générer les étiquettes du transporteur.

Exemple :
Pour une commande de 5 produits de 0.045 kg => 0.225 kg + 0.055 kg de poids d'emballage = 0.280 kg pour le colis final.
Pour le transporteur Colissimo sans signature, les tranches sont :  [0;0.250[ = 5.96€ et [0.250:0.5[ = 6.71€.
Dans le panier, les frais Colissimo sans signature sont de 6.71 et correspondent à la bonne tranche, signe que le 0.055 ( $total_weight ) est bien ajouté.

Dans la page de commande en back-office, le poids indiqué est de 0.225 au lieu de 0.280 , soit seulement le poids du produit*5 sans le  0.055.
Je peux heureusement modifier ce poids au moment de générer l'étiquette via le module Colissimo, mais je serai plus rassurée d'avoir directement le bon Total dans la commande.

Sauriez-vous où se réfère le poids de la commande dans le back-office ?

Merci d'avance pour votre aide!

1.Livraison_Commande.JPG

Edited by PriscilleD (see edit history)
Link to comment
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
×
×
  • Create New...