Jump to content

Trier par emplacement le Bon de Livraison (pdf delivery-slip customisé) [RESOLU]


Mag

Recommended Posts

Bonjour à tous,
je souhaite faire un tri par ordre croissant des champs emplacements dans le pdf de bon de livraison.

J'ai donc créer une customisation du fichier pdf Bon de Livraison (=DeliverySlip), ajouter le champ emplacement et afficher le résultat dans la génération du pdf,
seul hic je souhaite trier les lignes des emplacements par ordre croissant mais je m'embrouille un peu.

J'ai tenté un override du fichier override/classes/order/OrderSlip.php comme ceci :

class OrderSlip extends OrderSlipCore
{
        
    public function getOrdersSlipDetail()
    {
       return Db::getInstance()->ExecuteS('
       SELECT *
       FROM `'._DB_PREFIX_.'order_details` od
       WHERE od.`product`
       ORDER BY od.`warehouse_location` DESC');
    }


}

J'ai tenté plusieurs combinaisons sur les textes en gras ci-dessus, en tentant d'atteindre cette fameuse table warehouse_location et d'y ajouter l'ORDER BY...
Je pense me tromper sur le pointage des tables, ou mal faire l'override, je tourne en rond depuis un ptit moment maintenant,
je m'en remet à ce forum pour peut-être m'éclairer.

Merci par avance pour votre aide et tuyaux :)
Si besoin d'infos complémentaires, n'hésitez pas à demander.


 

 

Edited by Mag (see edit history)
Link to comment
Share on other sites

Salut,

Votre méthode de substitution est fausse. Par défaut, la fonction getOrdersSlipDetail () de OrderSlipCore possède deux paramètres. Par conséquent, pour remplacer la méthode getOrdersSlipDetail (), vous devez passer deux paramètres. Le nom de la classe dans le fichier de substitution doit être identique au nom de la classe par défaut pour remplacer la classe.

Fonction par défaut

public static function getOrdersSlipDetail($id_order_slip = false, $id_order_detail = false)
{
   
}

 

Votre fonction

public function getOrdersSlipDetail () 
{ 
   return Db :: getInstance () -> ExecuteS (' 
   SELECT * 
   FROM `' ._DB_PREFIX_. ' order_details` od 
   WHERE od.` product ` 
   ORDER BY od.` warehouse_location` DESC' ); 
}

 

 

 

Vous avez également utilisé le mauvais nom de table. Il devrait être order_detail au lieu de order_details. Pour obtenir la valeur de l'emplacement de l'entrepôt, vous pouvez utiliser la table "warehouse_product_location" et utiliser la valeur de l'emplacement trouvée dans cette table dans votre PDF de bordereau de commande.

Edited by Knowband Plugins (see edit history)
Link to comment
Share on other sites

Salut,
merci pour ces explications.

J'ai donc changé l'override de la classe, passer les deux paramètres à la fonction "getOrdersSlipDetail" et changer les appels de table comme ceci :

class OrderSlipCore extends OrderSlip
{
    public static function getOrdersSlipDetail($id_order_slip = false, $id_order_detail = false) 
	{
    	return Db::getInstance()->ExecuteS('
    	SELECT *
		FROM `' ._DB_PREFIX_. 'order_detail`
		WHERE `warehouse_product_location`
		ORDER BY `location` DESC' );
	}
}


Cela ne fonctionne toujours pas.
Soit j'ai encore fait une erreur sur la façon d'appeler ma table ou mon override, soit je me trompe de "fonction".

Dans mon fichier pdf/delivery-slip.tpl customisé, pour appeler le champ "emplacement" je déclare de cette façon :

{if empty($product.warehouse_location)}
	---
{else}
	{$product.warehouse_location}
{/if}


Peut-être que l'appel de table dans mon override ne correspond pas et donc n'ordonne pas les lignes dans le pdf.
J'ai tentée aussi ceci qui ne fonctionne pas :

public static function getOrdersSlipDetail($id_order_slip = false, $id_order_detail = false)
	{
		return Db::getInstance()->ExecuteS('
		SELECT *
		FROM `' ._DB_PREFIX_. 'product`
		WHERE `warehouse_location`
		ORDER BY `location` DESC' );
	}


Je continue mes recherches.. si une idée vous viens je suis preneuse !
Merci !

Edited by Mag (see edit history)
Link to comment
Share on other sites

Re,
voilà je viens de comprendre mon erreur.

En effet l'override de base n'est pas bon, comme expliqué dans mon commentaire précédent j'utilise une fonction customisée pour afficher ce fameux "$product.wharehouse_location" (= champ emplacement dans le bon de livraison)

Comme vous n'aviez pas visibilité sur mon code et mes customisations, du coup je vous ai induit en erreur ! My bad !
Voici l'astuce que j'avais suivi pour customiser le bon de livraison et ajouter le champ des emplacements :
https://www.prestashop.com/forums/topic/203840-warehouse-location-into-delivery-slip/
=> voir la solution proposée par PhpMadman

Mon override du fichier override/classes/order/OrderSlip.php était inutile car la variable $product.wharehouse_location est créer dans le fichier HTMLTemplateDeliverySlip.php, j'aurai pu tourner encore et encore...

Ce qu'il fallait faire était un simple "asort()" en php dans le fichier classes/pdf/HTMLTemplateDeliverySlip.php dans la fonction $order_details

// on instancie $order_details
        $order_details = $this->order_invoice->getProducts();
        foreach ($order_details as $key => $order_detail)
        {
            $order_details[$key]['warehouse_name'] = "--";
            $order_details[$key]['warehouse_location'] = "--";
            asort($order_details);
            if ($order_detail['id_warehouse'] != 0)
            {
                $warehouse = new Warehouse((int)$order_detail['id_warehouse']);
                $warehouse_location = $warehouse->getProductLocation($order_detail["product_id"],$order_detail["product_attribute_id"],$warehouse->id);
                $order_details[$key]['warehouse_name'] = $warehouse->name;
                $order_details[$key]['warehouse_location'] = $warehouse_location;
            }
        }

Voilà !
Merci encore pour votre aide :)

Link to comment
Share on other sites

  • 1 year later...

Bonjour,

Je cherche à faire apparaitre dans un Bon de livraison l'emplacement stock d'un produit. En modifiant le fichier pdf/delivery-slip.product-tab.tpl j'ai réussi à afficher cette info pour un produit simple, mais cela ne fonctionne pas pour un produit ayant des déclinaisons (bien que l'emplacement stock ai bien été renseigné pour chaque déclinaison du produit concerné).

Auriez-vous une piste ? J'ai essayé le code proposé dans le fichier classes/pdf/HTMLTemplateDeliverySlip.php dans la fonction $order_details , mais j'obtiens comme résultat l'affichage suivant "--" et non la valeur de l'emplacement stock de la déclinaison. Je suis sur PS 1.7.6.1

Merci par avance pour votre aide !

Link to comment
Share on other sites

  • 4 months later...
On 12/12/2019 at 1:30 PM, petitbruno said:

Bonjour,

Je cherche à faire apparaitre dans un Bon de livraison l'emplacement stock d'un produit. En modifiant le fichier pdf/delivery-slip.product-tab.tpl j'ai réussi à afficher cette info pour un produit simple, mais cela ne fonctionne pas pour un produit ayant des déclinaisons (bien que l'emplacement stock ai bien été renseigné pour chaque déclinaison du produit concerné).

Auriez-vous une piste ? J'ai essayé le code proposé dans le fichier classes/pdf/HTMLTemplateDeliverySlip.php dans la fonction $order_details , mais j'obtiens comme résultat l'affichage suivant "--" et non la valeur de l'emplacement stock de la déclinaison. Je suis sur PS 1.7.6.1

Merci par avance pour votre aide !

Bonjour,

j'ai exactement le même souci aujourd'hui.

Auriez-vous trouvé une solution?

Merci de votre retour.

Link to comment
Share on other sites

9 minutes ago, petitbruno said:

Je suis preneur de votre solution ! Merci par avance.

Re,

1 - Alors j'ai téléchargé un module gratuit (amproductfields).

Je l'ai modifié à ma sauce (gardé qu'un seul champ, et renommé dans le code en "emplacement"). => Ca créé un champs "emplacement" à la fin de la table "ps_product".

Après modification du fichier "product.phpé, je l'ai rajouté dans "www/override/classes/" (comme indiqué dans les explications du module)

-----------------------------------

2 - Dupliqué, pui modifié le fichier : www/override/classes/order/orderInvoice.php

Modifié : la fonction "getProductsDetail", pour prendre en compte la table "stock_available".

La requête en commentaire est l'originale.

    public function getProductsDetail()
    {
/*
        SELECT *
        FROM `' . _DB_PREFIX_ . 'order_detail` od
        LEFT JOIN `' . _DB_PREFIX_ . 'product` p
        ON p.id_product = od.product_id
        LEFT JOIN `' . _DB_PREFIX_ . 'product_shop` ps ON (ps.id_product = p.id_product AND ps.id_shop = od.id_shop)
        WHERE od.`id_order` = ' . (int) $this->id_order . '
        ' . ($this->id && $this->number ? ' AND od.`id_order_invoice` = ' . (int) $this->id : '') . ' ORDER BY od.`product_name`');
        */
        return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('    
        SELECT *,psa.location as stock_location
        FROM `' . _DB_PREFIX_ . 'order_detail` od
        LEFT JOIN `' . _DB_PREFIX_ . 'product` p
        ON p.id_product = od.product_id
        LEFT JOIN `' . _DB_PREFIX_ . 'product_shop` ps ON (ps.id_product = p.id_product AND ps.id_shop = od.id_shop)
        LEFT JOIN `' . _DB_PREFIX_ . 'stock_available` psa ON (psa.id_product_attribute = od.product_attribute_id AND psa.id_shop = od.id_shop)
        WHERE od.`id_order` = ' . (int) $this->id_order . '
        ' . ($this->id && $this->number ? ' AND od.`id_order_invoice` = ' . (int) $this->id : '') . ' ORDER BY od.`product_name`');        
    }

-------

Après j'ai rajouté cette ligne dans la fonction "getProducts":

$row['champ_stock_location'] = $row['stock_location'];

-----------------------------------

3 - J'ai dupliqué "delivery-slip.product-tab.tpl" dans www/themes/xxxx/pdf/delivery-slip.product-tab.tpl

Rajouté une colonne en entête :

<th class="product header small" width="10%">{l s='Emplacement.' d='Shop.Pdf' pdf='true'}</th>

Puis rajouté :

                <td>
                {if $order_detail.champ_stock_location!=""}
                    {$order_detail.champ_stock_location}
                {else}
                    {$order_detail.emplacement}
                {/if}
                </td>   

 

Voilà ....

Bonne continuation à tous !

Et restez chez vous !

COURAGE !

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...