Jump to content
Jean-Bruno

[Module] Fonction qui envoie mails (BL, factures) ou fax lors du changement de statut

Recommended Posts

CECI EST UN MODULE ;-) désormais compatible 1.4 (merci à Ludo)

Ce module permet d'adjoindre aux statuts de commandes l'envoi d'un ou plusieurs mails à une ou plusieurs personnes (dont le client) avec templates différends et pièces attachées (pour l'instant BL et Factures)

 

INSTRUCTION DE CONFIGURATION

Simple comme bonjour :

- on fait une sauvegarde de la BDD

- on installe (pour fax+mail, dans la section module vous pourrez enregistrer le mot de passe fourni par OVH)

Tout se configure dans le BO

Et on conserve les données à l'update

email

l’adresse mail à laquelle sera envoyée le mail (NB : {email} pour obtenir l'adresse du client.

pour fax+mail, le numéro de fax du destinataire « 0101010101@ecofax.fr »

template

le nom du template (qui doit se trouver dans le sous dossier du module /mails/lang ) par exemple /modules/mailbyorderstate/mails/fr contient le template new_order . Si on veut l’utiliser , il suffit donc de mettre dans template la valeur ‘new_order’

ou

pour fax+mail, la fonction ecofax il faut utiliser le thème ecofax (ne pas changer le nom)

subject

le sujet du mail . On peut incorporer des variable smarty par exemple {delivery_name} pour le N° de BL ou {order_name} pour le numéro de commande

pour fax+mail, votre numéro de fax fourni par OVH

attachment

delivery = bon de livraison invoice = facture

Pour une autre adresse, un autre statut , un autre template etc …. ben on renouvelle l’opération en créant une nouvelle ligne dans la base.

Pour utiliser

Liste des variables smarty disponibles :

'{firstname}' => $customer->firstname,

'{lastname}' => $customer->lastname,

'{email}' => $customer->email,

'{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_other}' => $delivery->other,

'{delivery_name}' => $order->delivery_number,

'{invoice_company}' => $invoice->company,

'{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_other}' => $invoice->other,

'{order_name}' => sprintf("d", $order->id),

'{shop_name}' => Configuration::get('PS_SHOP_NAME'),

'{date}' => $order_date_text,

'{carrier}' => (($carrier->name == '0') ? Configuration::get('PS_SHOP_NAME') : $carrier->name),

'{payment}' => $order->payment,

'{items}' => $itemsTable,

'{total_paid}' => Tools::displayPrice($order->total_paid, $currency),

'{total_products}' => Tools::displayPrice($order->getTotalProductsWithTaxes(), $currency),

'{total_discounts}' => Tools::displayPrice($order->total_discounts, $currency),

'{total_shipping}' => Tools::displayPrice($order->total_shipping, $currency),

'{total_wrapping}' => Tools::displayPrice($order->total_wrapping, $currency),

'{currency}' => $currency->sign,

'{message}' => $message

LOGS

 

V1.61

Correction bug {email} dans l’objet

Amélioration de l’administration

Nouvelle documentation

Traduction française

 

V0,6

 

Le prémodule devient module

Interface dans le BO

Fonction avec envoi de fax (attention modif du core nécessaires)

V0.5

Correction bug install

V0.4

possibilité d'envoyer un mail au client en ajoutant la variable {email} dans le champ email de la base

fichier install.txt.rtf avec instructions de configuration

V0.3

longueur du sujet passée à 128

autoincrément à la création de table

test desinstall reinstall depuis le BO

paramètre smarty {delivery_name} qui contient le numéro de BL

mailbyorderstateV0.3.zip

mailbyorderstateV0.5.zip

fax+mailbyorderstate1.0.zip

mailbyorderstate1.0.zip

mailbyorderstate1.61.zip

Share this post


Link to post
Share on other sites

Désolé, grand maitre des déplacements. Par contre il y a quand même un souci, c'est qu'un topic placé dans un autre forum que le "discussion générale" est quasi voué à l'echec. Pas moyen de les mettre en avant chacun leur tour ?

merci patric et désolé, je ferait plus
:red:

Share this post


Link to post
Share on other sites

j'arrive pas a avancé, pas clair ces histoires. Quel est le meilleure moyen d'envoyer un mail à mon prestataire logistique quand il y a une commande. module, statut ?

Share this post


Link to post
Share on other sites

Le meilleur moyen c'est le module alertes mails présent dans ton BO. (section tools)
Tu l'installes , tu le configures (c'est on ne peut plus clair à configurer) , et tu y es , tu peux coller autant d'adresses mail que tu souhaites dans le champ prévu à cet effet.

Pourquoi réinventer la roue quand tout est fourni ?

Au passage , la place du topic du coup ne serait plus vraiment en développement, mais tu aurais peut être du commencer par ça :

Quel est le meilleure moyen d’envoyer un mail à mon prestataire logistique quand il y a une commande....


;)

Share this post


Link to post
Share on other sites

Bon ben du coup mon niveau 1 d'exigence est rempli. L'idée pour mon niveau 2 reste quand m^me que cette alerte soit envoyée lorsque je passe ma commande à un statut particulier, et de joindre un bon de livraison pour le niveau 3
Merci quand même cher magicien breton ;-)

Share this post


Link to post
Share on other sites

Lol , je vois ...
Ca me fait une belle réponse à côté de la plaque.
Mea culpa . ;)
Yep j'ai lu un peu trop en diagonale , puis surtout j'ai même pas vu tes '5 étoiles' , ce qui m'aurait évité de faire une bourde pareille.

Pour me faire pardonner je vais donc creuser un peu plus :

dans /adminxxx/tabs/AdminOrders.php on a ça :

       /* 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 = intval(Tools::getValue('id_order'))) AND Validate::isLoadedObject($order = new Order($id_order)))
       {
           if ($this->tabAccess['edit'] === '1')
           {
               $_GET['view'.$this->table] = true;
               if (!$newOrderStatusId = intval(Tools::getValue('id_order_state')))
                   $this->_errors[] = Tools::displayError('Invalid new order status!');
               else
               {
                   $history = new OrderHistory();
                   $history->id_order = $id_order;
                   $history->changeIdOrderState(intval($newOrderStatusId), intval($id_order));
                   $history->id_employee = intval($cookie->id_employee);
                   $carrier = new Carrier(intval($order->id_carrier), intval($order->id_lang));
                   $templateVars = array('{followup}' => ($history->id_order_state == _PS_OS_SHIPPING_ AND $order->shipping_number) ? str_replace('@', $order->shipping_number, $carrier->url) : '');
                   if ($history->addWithemail(true, $templateVars))
                       Tools::redirectAdmin($currentIndex.'&id;_order='.$id_order.'&vieworder;'.'&token;='.$this->token);
                   $this->_errors[] = Tools::displayError('an error occurred while changing status or was unable to send e-mail to the customer');
               }
           }
           else
               $this->_errors[] = Tools::displayError('You do not have permission to edit anything here.');
       }



Sauf que $history->addWithemail(true, $templateVars) , c'est pour envoyer un mail au client , d'ailleurs on le retrouve dans OrderHistory.php , dans la fonction proprement dite. La requête est clairement écrite pour l'envoi d'un mail au client.

A moins de modifier le code natif (pas classe) , c'est duraille.

Moi je ferais ça dans un module . D'autant qu'on a un hook pour ça : updateOrderStatus .

Si donc , en schématisant, on a un module avec :
- une table
orderstatemail {
id_order_state :int 10,
email : varchar 128
}

Dans la fonction HookUpdateOrderStatus :

- on récupère tous les mails associés au statut courant.
- on récupère les 'templateVars'
- on génère le mail à partir d'un template mail existant ou un autre :dans ce cas on pourrais également associer un nom de template dans la nouvelle table , pour chaque enregistrement .
orderstatemail {
id_order_state :int 10,
email : varchar 128,
template: varchar
}

Ainsi pour chaque statut, on peut définir l'envoi à un ou plusieurs mails , avec un ou plusieurs templates.

Ca ferait pas l'affaire?

Encore sorry pour la méprise. Quoique ça n'aura ridiculisé que moi :D

Share this post


Link to post
Share on other sites

Ca c'est une réponse comme je les aime ;-) Heureux de t'avoir pris en défaut lol
Je vais me pencher sur la doc des modules ou trouver un approchant pour coller ça dedans
Merci l'ami
NB : 5 étoiles c'est un gage d'expérience, pas de connaissance ;-)

Share this post


Link to post
Share on other sites

Mais l'expérience ne mène-t-elle pas à la connaissance ? ;)
Si j'ai le temps je t'enverrais un squelette de module , semi fonctionnel, d'ici lundi.
Ce module m'intéresse pour mes clients , c'est une liberté supplémentaire...
Par contre je fais vraiment que le BA- ba , il faudra remplir les champs bdd à la main , dans un premier temps.

Share this post


Link to post
Share on other sites

cool je ferais faire le reste si besoin. Merci Magic man
Je veux bien ton contact en privé si j'ai des besoins.
a lundi l'ami

Share this post


Link to post
Share on other sites

Comme l'a dit très bien Broceliande, tu peux sans problème créer un module pour faire cela...

Tu te greffe sur le hook "updateOrderStatus" et ensuite tu as une fonction qui ressemblerai pour ou moins à celle qui suit :

function hookupdateOrderStatus($params)
{
   $os = $params['newOrderStatus'];

   if ($os->id == 2)
   {
       Mail::Send(2, 'TONTEMPLATE', 'TON SUJET', array(), 'fournisseur@email.com', NULL, $configuration['PS_SHOP_EMAIL'], $configuration['PS_SHOP_NAME'], NULL, NULL, dirname(__FILE__).'/mails/');
   }
}



Evidemment tu comprendras que la fonction est basique... Mais cela devrait sans problème te montrer la marche à suivre pour la suite :)

Share this post


Link to post
Share on other sites

Voilà j'ai pu trouver une heure dans mon we pour mettre en application ce que nous suggérions . Une bonne partie de ce dont nous avons besoin pour ce module est déja présent dans le module mails alerts.
A la différence près que ce n'est pas le même hook sur lequel on se greffe, et que contrairement au hook newOrder, on ne reçoit pas directement les objets orders etc ... il fallait donc les recréer.

Voici donc un module installable .

Pas de configuration , comme je le disais : il va falloir mettre (juste un peu) la main à la pâte :

- on installe

- on édite alors dans la bdd la table créee par le module , (ps_)mailbyorderstate

- pour faire un test , il suffit de renseigner 4 champs :

- id_order_state : l'id d'état de la commande sur laquelle on veut greffer un envoi de mail , ex : 2 (Paiement Accepté)

- email : l'adresse mail à laquelle sera envoyée le mail

- template : le nom du template (qui doit se trouver dans le sous dossier du module /mails/lang )
par exemple /modules/mailbyorderstate/mails/fr contient le template new_order .
Si on veut l'utiliser , il suffit donc de mettre dans template la valeur 'new_order'

- subject : le sujet du mail .


Pour une autre adresse, un autre statut , un autre template etc .... ben on renouvelle l'opération .

Il ne te reste plus qu'à effectuer les changements d'état correspondants pour recevoir le résultat

Ce n'est qu'un prototype finalement assez simple, mais fonctionnel , comme je te l'annonçais hier

Enjoy ;)

Edit : j'ai des petits soucis avec les retours à la ligne , bizarre , sorry si c'est confus

mailbyorderstate.zip

Share this post


Link to post
Share on other sites

N'en jetez plus ! Merci les amis
Je test tout ça et je reviens vers vous pour vous donner des nouvelles.
Bonne journée Pierre-Yves et Broceliande

Share this post


Link to post
Share on other sites

Brocéliande c'est PARFAIT !
Pour aller un peu plus loin, saurais tu comment incorporer le numéro de commande dans le sujet ?
J'ai essayé {order_name} mais je pense que je me mélange les Smarties. Ca donne "Erreur : les paramètres du mail sont corrompus"
Une idée ?
Et également pour le futur comment incorporer un fichier PDF attaché (ici le BL)

MILLE MERCIS et à bientôt

Share this post


Link to post
Share on other sites

Pour {order_name}, c'était la bonne idée , sauf que les variables de template ne sont remplacées que dans le template lui même, bizarrement pas dans le sujet.

Celà dit , ce n'est pas un problème, une petite ligne et zou , tu peux désormais utiliser les variables de template dans ton sujet .

Ca se passe là , mais j'ai mis à jour le post contenant le module avec les nouveaux fichiers:

       foreach($mails as $mail)
       {
               $mail['subject'] = str_replace(array_keys($templateVars), array_values($templateVars), $mail['subject']);
           if (file_exists(dirname(__FILE__).'/mails/'.$iso.'/'.$mail['template'].'.txt') AND file_exists(dirname(__FILE__).'/mails/'.$iso.'/'.$mail['template'].'.html'))
           Mail::Send($id_lang, $mail['template'], $mail['subject'], $templateVars, $mail['email'], NULL, $configuration['PS_SHOP_EMAIL'], $configuration['PS_SHOP_NAME'], NULL, NULL, dirname(__FILE__).'/mails/');
       }



Reste le dernier point , un peu plus délicat.

La pièce jointe que tu souhaites envoyer , il faut alors que le module la télécharge, tout comme si tu le faisais toi même.
Je me pencherais sur la question , mais disons que l'idée est sans doute d'indiquer l'url du fichier à joindre dans la bdd,
en espérant que celà suffira à satisfaire les pièces jointes dynamiques comme les pièces jointes statiques.
J'avoue que je ne sais pas si ça fonctionnera.

Share this post


Link to post
Share on other sites

Trop fort, merci l'ami.
Fait comme tu peux, mais ça fait deux ans que j'attends que quelqun daigne se pencher sur ce truc. Bravo et encore merci.
Je vais essayer de em servir de ta base pour comprendre comment fonctionne un module en comparant avec sa maman module.
a+

Share this post


Link to post
Share on other sites

Qu'à celà ne tiennne , je met à jour le module.

Il faut malheureusement désinstaller et réinstaller le module pour avoir le nouveau champ 'attachment' ,
ou alors si tu es à l'aise avec phpmyadmin , le créer : c'est un varchar 10.

pour ajouter une pièce jointe il faut renseigner le champ attachment . tu as deux choix:

delivery = bon de livraison

invoice = facture

Bien sûr , si tu mets rien , pas de pièce jointe

Share this post


Link to post
Share on other sites

wow

ça ressemble a mon niveau 3 ce que tu me dis là. Tu as quand même fini par me clouer le bec ;-)
Allez, je mets un petit "resolu" en attendant de peaufiner le module.Si un expert du module passe par là ce serait sympa d'y jeter un oeil.
Bonne soirée le Barde

Share this post


Link to post
Share on other sites

Désolé Brocéliande
J'ai essayé de désinstaller réinstaller mais attachment n'apparait pas
Je l'ai créé (j'ai peut être fait une boulette) mais le mail ne part pas
Par contre maintenant il reconnait les variable Smarty dans le sujet, c'est parfait de ce côté.
2 autres truc que j'aimerais comprendre
Pourquoi le nom de la boutique apparait dans le sujet ?
Comment incorporer le numéro de BL au template ? J'ai essayé "BON DE LIVRAISON N°{delivery_name}" mais sans succès
Merci d'avance et bonne journée

EDIT : je ne suis pas sûr que tu ai mis la modif de attachment dans le fichier, je ne la trouve pas.

Share this post


Link to post
Share on other sites

Ben écoute Jean-bruno,

Je suis allé jusqu'à re télécharger le module ici même , et tu as la bonne version , ça c'est certain.
{delivery_name} n'existe pas , ce qui peut expliquer ton problème, {delivery_lastname} existe en revanche
je vais peut être juste complèter la liste des champs s'il t'en manque et dans ce cas te la copier ici .
En tout cas , chez moi tout fonctionne , j'ai bien le BL en pièce jointe
Je vais tester la désinstall réinstall du module pour voir si la table est bien supprimée..
Après ça je sais pas , je veux bien voir sur ton hebergement ce qui cloche si tu veux.

Share this post


Link to post
Share on other sites

Voici le php modifié , avec cette fois un paramètre {delivery_name} qui contient le numéro de BL .

Comme il n'existait pas , et qu'aucun autre ne contenait la valeur du BL ... je te l'ai ajouté

Pour les paramètres , la liste est dans le php (il n'est pas bien difficile de savoir ce qu'ils contiennent mais si tu as des questions ... )

            '{firstname}' => $customer->firstname,
           '{lastname}' => $customer->lastname,
           '{email}' => $customer->email,
           '{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_other}' => $delivery->other,
           '{delivery_name}' => $order->delivery_number,
           '{invoice_company}' => $invoice->company,
           '{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_other}' => $invoice->other,
           '{order_name}' => sprintf("d", $order->id),
           '{shop_name}' => Configuration::get('PS_SHOP_NAME'),
           '{date}' => $order_date_text,
           '{carrier}' => (($carrier->name == '0') ? Configuration::get('PS_SHOP_NAME') : $carrier->name),
           '{payment}' => $order->payment,
           '{items}' => $itemsTable,
           '{total_paid}' => Tools::displayPrice($order->total_paid, $currency),
           '{total_products}' => Tools::displayPrice($order->getTotalProductsWithTaxes(), $currency),
           '{total_discounts}' => Tools::displayPrice($order->total_discounts, $currency),
           '{total_shipping}' => Tools::displayPrice($order->total_shipping, $currency),
           '{total_wrapping}' => Tools::displayPrice($order->total_wrapping, $currency),
           '{currency}' => $currency->sign,
           '{message}' => $message

mailbyorderstate.php

Share this post


Link to post
Share on other sites

Voici une nouvelle mise à jour : il manquait un autoincrément à la création de table , je ne sais pas si ça influe .
En revanche j'ai testé la désinstall réinstall du module (a partir du bo bien sur) et la no soucy , la table est bien supprimée et recrée.

mailbyorderstate.zip

Share this post


Link to post
Share on other sites

MAGNIFICO
ça fonctionne au poil. Mille merci l'ami. J'ai passé le module en V0.3 et je l'ai placé en tête de post, c'est plus pratique. Bon et bien on va pouvoir passer au back office.
Une question
sait tu ce qui renvoie la liste des produit dans le mail envoyé par new order. j'aimerai virer les prix mais pas moyen d'y arriver.

Share this post


Link to post
Share on other sites

Bien vu .

Pour le détail des articles , c'est là :

        foreach ($cart->getProducts() AS $key => $product)
       {
           $unit_price = Product::getPriceStatic($product['id_product'], true, $product['id_product_attribute']);
           $price = Product::getPriceStatic($product['id_product'], true, $product['id_product_attribute'], 6, NULL, false, true, $product['cart_quantity']);
           $itemsTable .=
               '
'.$product['reference'].'
'.$product['name'].(isset($product['attributes_small']) ? ' '.$product['attributes_small'] : '').'
'.Tools::displayPrice($unit_price, $currency, false, false).'
'.intval($product['cart_quantity']).'
'.Tools::displayPrice(($price * $product['cart_quantity']), $currency, false, false).'
';
       }



Et plus exactement , ici :

                    '.Tools::displayPrice(($price * $product['cart_quantity']), $currency, false, false).'



c'est stocké dans la variable {items} par la suite , une fois ajoutés les réductions.

Seulement si tu vires ça du code , c'est mort pour ceux qui veulent afficher le prix.

Idéalement, il faudrait dans ce cas avoir une variable de template supplémentaire, genre {itemswithoutprices}

Ce pour ajouter une fonctionnalité sans pour autant en enlever d'autres.

Sinon on pourrait aussi splitter les élements (prix, ref, designation etc) dans des listes séparées et rendre encore plus flexible la personnalisation des templates

Share this post


Link to post
Share on other sites

savez vous comment ajouter une colonne au bon de commande et à la facture

j'aimerais rajouter la marque

merci

Share this post


Link to post
Share on other sites

Salut Brocéliande
Saurais tu quelle magie utiliser pour que la facture soit envoyée au client (il y a un code a rentrer dans la base à la place du mail ?) Mille mercis.
EDIT : Si tu sais également comment joindre les PDF attachés aux produits (je pense à un statut "envoyer les fiches techniques")

Share this post


Link to post
Share on other sites

Le problème n'est pas pour joindre mais pour que ça parte au client. Du coup on ne peut pas renseigner ce champ. On pourrait peut être dire "si pas de mail renseigné alors on envoie au client" ?? Mais là ça dépasse mes compétences.
;-)
EDIT : comment ajouté en smarty les statuts de la commande (l'idée est de faire un statut "demande de renseignement logistique" qui ferait apparaitre l'historique.

Merci l'ami

Share this post


Link to post
Share on other sites

Ah ok...

Donc voici la 0.4 Tu peux la remettre en tête de thread, ce que je ne peux pas faire, ensuite je la supprimerais de ce post.

Pour envoyer le mail au client, dans le champ email , tu mets {email}

Edit :

A noter au cas ou ... :

Si on veut deux ou plusieurs mails qui partent à des destinataires différents pour un seul changement de statut, il suffit d'ajouter des lignes dans la bdd. Il va de soi que le module va chercher l'ensemble des mails à générer pour un statut donné, et que celà ne se limite pas à un seul enregistrement.
Tout est donc permis

Share this post


Link to post
Share on other sites

WOW !

PARFAIT (et mis en tête de post) J'ai remis mes modifs précédentes (Subject à 128 et fichier d'instructions pour la config)
Pour les statuts de la commande (l’idée est de faire un statut “demande de renseignement logistique” qui ferait apparaitre l’historique.
Sinon donne moi le principe de base pour intégrer un $templateVars
A plus l'ami et encore milles mercis.

Share this post


Link to post
Share on other sites

Bonjour,

Merci pour votre boulot et merci a Jean-Bruno de m'avoir orienté sur ce post!

Je n'arrive pas a installer la dernière version 0.4 du module:

The following module(s) were not installed successfully: * mailbyorderstate

Test effectué sur PS 1.2.5 et 1.3

Cordialement.

Share this post


Link to post
Share on other sites
Bonjour,

Merci pour votre boulot et merci a Jean-Bruno de m'avoir orienté sur ce post!

Je n'arrive pas a installer la dernière version 0.4 du module:

The following module(s) were not installed successfully: * mailbyorderstate

Test effectué sur PS 1.2.5 et 1.3

Cordialement.


Ma foi mais c'est ben vrai !

Voici correction 0.5 .

mailbyorderstate.zip

Share this post


Link to post
Share on other sites

Module installé.

Je gère comment? Il n'y a pas de "configuration" au niveau du BO?

Personnellement je cherche à permettre aux clients de télécharger leur produit "virtuel.zip" après avoir passer leur commande et après que j'aurais approuvé et contrôlé leur payement, (pour éviter les fraudeurs), sachant que le "virtuel.zip" n'est pas présent avec le produit au moment de l'achat.

J'espère que c'est pas trop charabia.... :red:

Share this post


Link to post
Share on other sites
WOW !

PARFAIT (et mis en tête de post) J'ai remis mes modifs précédentes (Subject à 128 et fichier d'instructions pour la config)
Pour les statuts de la commande (l’idée est de faire un statut “demande de renseignement logistique” qui ferait apparaitre l’historique.
Sinon donne moi le principe de base pour intégrer un $templateVars
A plus l'ami et encore milles mercis.


Pour intégrer une variable supplémentaire , ça se passe dans mailbyorderstate.php à partir de la ligne 92 :
       // Filling-in vars for email
       $templateVars = array(
           '{firstname}' => $customer->firstname,
           '{lastname}' => $customer->lastname,
           '{email}' => $customer->email,
             etc .........
           );




$templateVars est donc un tableau de données/valeurs , chaque ligne étant sous la forme :

'{firstname}' => $customer->firstname



La partie de gauche représente la façon donc on identifie la variable dans les différents templates mails, voire , comme on l'a vu, dans le sujet , ou encore dans l'adresse mail , via {email}...
Ce n'est que du texte brut, qui sera remplacé , c'est pourquoi il est entre ' '


La partie de droite est la valeur que l'on souhaite donner à la variable . Ici $customer->firstname contient le prénom .

$customer étant un Objet de la classe customer, qui contient nombre d'informations...

C'est donc très simple d'ajouter des variables à templateVars, mais il faut avant tout savoir aller chercher dynamiquement en php la valeur que l'on doit lui assigner. Sur ce point , c'est de la compréhension de php, des classes, des objets... qu'il s'agit. Il n'y a pas de réponse toute faite.

'{mavariable}' => 3,
'{mavariable}' => 'toto',
'{mavariable}' => $customer->id_customer, ....


Tout ceci est correct ... Dans les deux premiers cas c'est une affectation statique , 3 est une valeur numérique, 'toto' une chaine de caractères, ce qui n'a pas un grand intéret .

Dans le troisième cas, on utilise l'objet $customer pour aller lire sa propriété id_customer.


On pourrait avoir aussi un truc du genre :

'{mavariable}' => $monobjet->samethode()

Dans ce cas on accède non plus à une propriété directe, mais à une méthode , qui peut nous retourner une valeur , en revanche....

Je ne peux guère développer plus ;) , j'espère que ça t'aidera

Share this post


Link to post
Share on other sites
Module installé.

Je gère comment? Il n'y a pas de "configuration" au niveau du BO?

Personnellement je cherche à permettre aux clients de télécharger leur produit "virtuel.zip" après avoir passer leur commande et après que j'aurais approuvé et contrôlé leur payement, (pour éviter les fraudeurs), sachant que le "virtuel.zip" n'est pas présent avec le produit au moment de l'achat.

J'espère que c'est pas trop charabia.... :red:



Non ce n'est pas charabia ;)

Je vais voir comment on peut rendre plus dynamique le choix de la pièce jointe .

Il n'y a pas encore de configuration , celà se fait pour l'heure dans phpmyadmin par exemple .

Ce module est un prototype , qui a vu le jour il y a une semaine à peine si je ne me trompe pas.


Mais allez ... La configuration c'est pour lundi :)

Share this post


Link to post
Share on other sites

Cependant,

j'aimerais savoir en quoi le système actuel de prestashop ne te permet pas de parvenir à tes fins concernant le download ?

Je veux dire, qu'il me semble :
Seules les commandes valides permettent de télécharger un produit type 'download'
Si c'est le moyen de paiement que tu veux contrôler, dans ce cas ne suffit-il pas de changer le statut paiement accepté afin qu'il ne valide pas la commande ?

Je comprends bien la demande, mais pas les raisons qui la motivent , en ce sens que pour moi , prestashop a tout ce qu'il faut pour ça , en natif.
Il doit donc me manquer des éléments ? ;)

Share this post


Link to post
Share on other sites

Example:

Le vendeur vend un produit téléchargeable qu'il n'a pas.
Il souhaite mettre le produit virtuel à disposition de l'acheteur "après" que la commande ai été validée.

Attention! Le "fichier.zip" à télécharger n'est pas disponible avec le produit au moment de la commande.

Share this post


Link to post
Share on other sites

Ok je comprends mieux.

Mais la problèmatique est différente, si le produit à télécharger n'existe pas encore.

Plein de questions me viennent du coup , par exemple , comment automatiser l'envoi d'un fichier par rapport à un statut de commande, alors que l'on ne connais pas encore le nom du zip , et que ce zip n'est pas encore dans un produit ?

Bref beaucoup de contraintes sur le sujet , c'est une problèmatique bien particulière, et pour en faire un cas général , il va falloir creuser plus.

On en parle quand tu veux. A tout problème existe une solution , mais la solution implique aussi des contraintes , en terme de faisabilité.

Share this post


Link to post
Share on other sites

En effet, mai je ne cherche pas que cela soit automatisé.

Share this post


Link to post
Share on other sites

Brocéliande tu es un mage ;-)
Merci de cette explication, j'aime ceux qui savent partager leurs savoirs.
A lundi

Share this post


Link to post
Share on other sites

Au passage petite info en exclu (je ferais un post en conséquence au moment voulu) , je ne sais pas si ça intéressera du monde, mais je suis en train d'achever un module qui permet de regrouper des zones en groupes de zones, et d'affecter un ou plusieurs groupes de zones par transporteur.

Comme tout le monde sait , il est très difficile de gérer les zones par transporteur , lorsqu'on sait que ces dernières diffèrent selon chacun de ces transporteurs.

La seule solution à ce jour est de créer une zone par pays.

C'est efficace mais celà rend parfaitement ingérable les mises à jours de tarifs, de par la quantité des champs à entrer.

Mon module ajoute une interface qui permet donc de gérer ces tarifs par 'regroupement de zones' . le déroulement ressemble à ça :

On a donc une zone par pays (dans la version finale un bouton permettra de le faire en un clic), nommées du même nom que le pays.

On crée un groupe de zones genre 'TNT zone 1'

On y met les zones de notre choix , par exemple une vingtaine de pays.

On choisi le transporteur tnt auquel on veut affecter le groupe TNT zone 1.

Dans l'interface , on mettra donc a jour en une seule fois les tarifs des 20 zones .

Celà ressemble forcément à ce qui se passe si on garde les zones europe etc de prestashop , sauf que cette fois , les zones peuvent être différentes pour chaque transporteur.



Je ne sais pas si je me fais bien comprendre, mais je ferais mieux comme explication plus tard.

Share this post


Link to post
Share on other sites

Bonne nouvelle m^me si mon problème est différend : j'ai un seul transporteur et ses zones sont en fait des villes ou des départements, Dommage !!!

Share this post


Link to post
Share on other sites

Ca ne me parait pas du tout incompatible ça ,
Tu ne livres donc qu'en france , et tu dois avoir entré les départements dans les états .
Tu dois donc avoir une zône par état/ville si je ne m'abuse , ou un truc ressemblant ?

Share this post


Link to post
Share on other sites

Oui j'avais essayé ça mais en fait c'était un peu le souk puisqu'aucun lien entre l'adresse du client et les états a part à choisir sur une liste de 50 noms
Du coup j'ai fait une moyenne de mes livraisons. Sauf qu'aujourd'hui j'ai changé de transporteur et la livraison est souvent excessive par rapport à ce que mes clients devraient payer (je fais du prix coutant)

Share this post


Link to post
Share on other sites

Effectivement, dans ton cas de figure c'est un module de transport sur mesure qu'il te faudrait.
Un peu dans le genre de ceux que j'ai fais pour http://www.lespaniersvillage.fr

La dessus , tout est fonction du code postal , de la possibilité de commander tel ou tel produit , au choix du transporteur etc . Nul besoin de faire un dessin sur ce qu'il a fallu déployer comme ruses pour parvenir à nos fins. ;)

Share this post


Link to post
Share on other sites

Salut l'ami

Je deviens gourmand et rêveur puisque j'imagine mon étape 4 : pourrat-on par exemple développer une formule magique qui envoie mes BL à chaque fournisseur à partir d'une m^me commande.

En 2011 ? ;-)

Merci et à bientôt

Share this post


Link to post
Share on other sites

Wahou ! héhé .
Comme tu y vas !... lol :D
Je n'ai déja pas tout à fait fini l'admin , mais ça arrive.

Cette 4è etape :

C'est est un cas de figure absolument particulier. Celà s'apparente un peu trop au développement perso... ce dont je vis...
Rien n'est impossible , certes , mais je ne crois pas pousser aussi loin pour un simple module communautaire.

Enfin ... Ne dit on pas qu'il ne faut jamais dire jamais ? ;)

J'arrive vite promis avec ma version dotée d'une admin. Dès que je trouve le temps de la finir.

Share this post


Link to post
Share on other sites

;-)

cool. Je n'ai pas dis que je ne voulais pas payer. Je suis donateur de plusieurs modules et j'ai par ailleurs payé des modules inutilisables ;-)
Mais cette fonction ne m'est pas réservée. Je pense à ton site de paniers (à ce propos va faire un tour sur ecoringo.com) qui pourrait par exemple envoyer chaque commande aux producteurs séparément. On peut ainsi proposer du "no stock" comme le faisait la feu Camif.

Isn't it ?

Share this post


Link to post
Share on other sites

Attention, jeune druide, pas de message en anglais sinon, pan, je suis modérateur tout de même :cheese:
EDIT ha ben nein ich bin nicht on this forum

Share this post


Link to post
Share on other sites

Bonjour,

J'ai bien compris qu'il était nécessaire de renseigner la table mailbyorderstate
mais de quelle manière, avez vous un modèle de celle-ci pour que je comprenne le principe.
Merci d'avance.

La table en question:

-- Structure de la table `mailbyorderstate`
--

CREATE TABLE IF NOT EXISTS `mailbyorderstate` (
 `id_custom_mail` int(10) unsigned NOT NULL auto_increment,
 `id_order_state` int(10) unsigned NOT NULL default '0',
 `email` varchar(128) NOT NULL default '',
 `template` varchar(60) default NULL,
 `subject` varchar(128) default NULL,
 `attachment` varchar(10) default NULL,
 PRIMARY KEY  (`id_custom_mail`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

--
-- Contenu de la table `mailbyorderstate`
--

Share this post


Link to post
Share on other sites

Salut, de mémoire :
Ces champs la doivent être renseignés sachant que :

`id_order_state` est l'id du statut au cours duquel on souhaite intervenir ex : 2 = paiement accepté

`email` = email ou l'on souhaite envoyer le mail ... no comment

`template` le template du mail , sans extension , qui doit être présent dans le sous dossier mail du module

`subject` = ben le sujet du mail ...

`attachment` = la pièce jointe , soit invoice (facture) , soit delivery (bon de livraison)

PS : si quelqu'un ici peut m'indiquer comment on fait les retours lignes dans les posts :s ....

Share this post


Link to post
Share on other sites

Salut les amis
Brocéliande : les retours lignes normalement c'est enter. Essaye sinon Maj Enter
Prosilver : as tu lu le fichier install.txt joins au module. J'ai tout détaillé

A+

Share this post


Link to post
Share on other sites

Bonjour,
oui, c'est bon, cela doit-être du style:

INSERT INTO `mailbyorderstate` (`id_custom_mail`, `id_order_state`, `email`, `template`, `subject`, `attachment`) VALUES
(2, 3, 'mon@email.fr', 'new_order', 'order_name', 'invoice');


mais ça ne donne pas le résultat que j'espérais. Dommage.
Merci...

Share this post


Link to post
Share on other sites
Bonjour,
oui, c'est bon, cela doit-être du style:
INSERT INTO `mailbyorderstate` (`id_custom_mail`, `id_order_state`, `email`, `template`, `subject`, `attachment`) VALUES
(2, 3, 'mon@email.fr', 'new_order', 'order_name', 'invoice');


mais ça ne donne pas le résultat que j'espérais. Dommage.
Merci...




Peut être pourrais tu commencer par le résultat que tu recherches ?

Share this post


Link to post
Share on other sites

Au secours (résolu)

Je ne sais pas pourquoi j'ai une erreur "Invalid date" qui est apparu. J'ai essayé de passer en 0.5 et même combat. Tu aurais une idée ?
Bonne journée l'ami

EDIT : il fallait passer en statut "commande prise en compte" et c'est tout bon.
MERCi ce 'pré)module c'est de la bombe

Share this post


Link to post
Share on other sites

bonjour
j'ai essayé le module et il marche bien
bravo pour cette explication.

Est ce que dans le même ordre d'esprit
je peux l'utiliser pour recevoir le mail envoyé au client pour sa commande
et le réceptionner pour l'administrateur du site ?
ou dupliquer l'email envoyé au client pour l'envoyer à une autre adresse ?

Est ce que ce serait la bonne méthode ?
Merci de votre réponse.

Share this post


Link to post
Share on other sites

Salut redtango
Tu peux faire quasi ce que tu veux.
Tu choisi un état et tu mets autant de lignes que de destinataires

une pure merveille

a+

Share this post


Link to post
Share on other sites

Merci Jean Bruno
d'être si réactif, bravo pour cet ajout fonctionnel bien utile.

je l'ai mis en place sur ne version Test, mais je ne me souviens plus du résultat

- On installe le pré-module :
- on renseigne l'id du mail 1 pour commande + [mon@email.fr ]

- on renseigne la BDD
INSERT INTO `mailbyorderstate` (`id_custom_mail`, `id_order_state`, `email`, `template`, `subject`, `attachment`) VALUES
(2, 3, 'mon@email.fr', 'new_order', 'order_name', 'invoice');

je renouvelle l'opération pour d'autres étapes et un nouveau mail (par exemple)

PS envoie alors deux mails à deux adresses :
- le premier order return au client ( par l'appel new_order)
- et le second par (id_order_state) au statut et au mail indiqué

Il suffit juste de modifier le template dans le fichier mail d' id_order_state [ ou de remettre le template mail client Order Return ?] ,
ou faut t'il rajouter quelque chose dans un autre fichier php ?
c'est bien cela ou j'ai raté une etape ?

C'est de la bombe , en effet !

Share this post


Link to post
Share on other sites

Heu je suis un peu embrouillé là

En gros tu installes le premodule
tu renseignes une ligne dans ta base par destinataire (cf fichier install.txt) en configurant si tu veux le bl ou la facture attachée en PDF
tu fais un modèle de mail dans Modules>mailbyorderstate>mails par type de mail que tu veux envoyer (ex : "bonjour Monsieur bidule...." pour ton client et " SalutRedtango, il y a une commande à expédier alors passe la seconde" pour ton magasinier préféré ;-)

clair cette fois ?

a+

Share this post


Link to post
Share on other sites

J'ai testé


Ma BDD :

Textes complets id_custom_mail id_order_state email template subject attachment
Modifier Effacer 3 3 philo@mail.fr order_customer_comment order_name invoice
Modifier Effacer 1 5 philo@mail.fr order_conf order_name invoice
Modifier Effacer 2 6 philo@mail.fr order_canceled order_name invoice


Mes Statuts de mails :


1 Confirmationde commande - livraison [1] [1] order_conf
2 Paiement accepté [1] [1] payment
3 Préparation en cours [1] [1] preparation
4 En cours de livraison [1] [1] shipped
5 Livré [1] [1] order_conf
6 Annulé [1] [0] order_canceled

Le client reçoit les deux mails : philo@mail.fr ne reçoit rien

Les deux mails du client :
Un reçu rempli avec les champs textes de personnalisation
l'autre avec le moule du mail : sauf le prix et le n° de commande ( à mon avis c'est un retour OK le fichier ne doit pas être bon.)

Si je comprends : le client reçoit les états 1 et 5 des statuts :

En fait j'aimerais ( vu le nombre de consultations du thread - on est nombreux)

recevoir à philo@mail.fr l'order_conf avec le détail des champs textes de personnalisation
les PJ
et si possible :
comment faire un retour à la ligne des champs dans le coprs du mail.

As tu des fichiers tests pour un retour de ce mail ?

Avec ton aide, je chauffe, on s'approche de la solution.
Cordialement

Redtango

34338_uvWY5QZikwDyt2O0zZO1_t

Share this post


Link to post
Share on other sites

Question suivante :
avec votre solution, est ce que l'on peut récupérer history.php comme dans
l'image attachée ?

34340_omA7omB6rRk3fs9V17mQ_t

Share this post


Link to post
Share on other sites

Jean-Bruno

oui c'est cela je n'avais pas vu ton message au dessus

je teste les statuts mais rien n'y fait.

(est ce que par hasard l'adresse expéditeur ne serait pas la même, ce qui expliquerait que le mail soit doublé ?)

Share this post


Link to post
Share on other sites

Bonjour,

Je m'ennuyais et j'ai vu une demande d'envoi par fax sur le forum.
Je me suis permis de modifier ce prémodule de facon a pouvoir utiliser l'envoi de FAX avec OVH.
On peux renseigner le mot de passe fourni par OVH dans le BO.



Mais il faut modifier le fichier classes/Mail.php
a la ligne 22

static public function Send($id_lang, $template, $subject, $templateVars, $to, $toName = NULL, $from = NULL, $fromName = NULL, $fileAttachment = NULL,  $modeSMTP = NULL, $templatePath = _PS_MAIL_DIR_, $pdf= NULL,)



Et remplacer apres la ligne

global $_LANGMAIL;



if ($pdf AND isset($pdf))
           {
           $message = new Swift_Message(((is_array($_LANGMAIL) AND key_exists($subject, $_LANGMAIL)) ? $_LANGMAIL[$subject] : $subject));
           $templateVars['{shop_logo}'] = (file_exists(_PS_IMG_DIR_.'logo.jpg')) ;
           $templateVars['{shop_name}'] = Configuration::get('PS_SHOP_NAME');
           $templateVars['{shop_url}'] = 'http://'.Tools::getHttpHost(false, true).__PS_BASE_URI__;
           $swift->attachPlugin(new Swift_Plugin_Decorator(array($to_plugin => $templateVars)), 'decorator');
           if ($configuration['PS_MAIL_TYPE'] == 3 OR $configuration['PS_MAIL_TYPE'] == 2)
               $message->attach(new Swift_Message_Part($templateTxt, 'text/plain', '8bit', 'utf-8'));
           if ($configuration['PS_MAIL_TYPE'] == 3 OR $configuration['PS_MAIL_TYPE'] == 1)
               $message->attach(new Swift_Message_Part($templateHtml, 'text/html', '8bit', 'utf-8'));
           if ($fileAttachment AND isset($fileAttachment['content']) AND isset($fileAttachment['name']) AND isset($fileAttachment['mime']))
               $message->attach(new Swift_Message_Attachment($fileAttachment['content'], $fileAttachment['name'], $fileAttachment['mime']));

           $send = $swift->send($message, $to, new Swift_Address($from, $fromName));
           $swift->disconnect();
           return $send;
           }
           else            
               {
           $message = new Swift_Message('['.Configuration::get('PS_SHOP_NAME').'] '.((is_array($_LANGMAIL) AND key_exists($subject, $_LANGMAIL)) ? $_LANGMAIL[$subject] : $subject));
           $templateVars['{shop_logo}'] = (file_exists(_PS_IMG_DIR_.'logo.jpg')) ? $message->attach(new Swift_Message_Image(new Swift_File(_PS_IMG_DIR_.'logo.jpg'))) : '';
           $templateVars['{shop_name}'] = Configuration::get('PS_SHOP_NAME');
           $templateVars['{shop_url}'] = 'http://'.Tools::getHttpHost(false, true).__PS_BASE_URI__;
           $swift->attachPlugin(new Swift_Plugin_Decorator(array($to_plugin => $templateVars)), 'decorator');
           if ($configuration['PS_MAIL_TYPE'] == 3 OR $configuration['PS_MAIL_TYPE'] == 2)
               $message->attach(new Swift_Message_Part($templateTxt, 'text/plain', '8bit', 'utf-8'));
           if ($configuration['PS_MAIL_TYPE'] == 3 OR $configuration['PS_MAIL_TYPE'] == 1)
               $message->attach(new Swift_Message_Part($templateHtml, 'text/html', '8bit', 'utf-8'));
           if ($fileAttachment AND isset($fileAttachment['content']) AND isset($fileAttachment['name']) AND isset($fileAttachment['mime']))
               $message->attach(new Swift_Message_Attachment($fileAttachment['content'], $fileAttachment['name'], $fileAttachment['mime']));         

 /* Send mail */
           $send = $swift->send($message, $to, new Swift_Address($from, $fromName));
           $swift->disconnect();
           return $send;
           }



Je sais pas si cela va servir a quelqu'un mais il n'y a pas cette fonctionalité sur prestashop.

Share this post


Link to post
Share on other sites

Bon 3 téléchargement c'est bof, mais je suis sur que ca va aller un peu plus vite maintenant.

Donc j'ai continuer a modifier le module
Maintenant plus besoin d'aller dans la base de données
Vous pouvez rentrer toutes les données depuis le BO.
Mais ATTENTION pour celui avec la fonction FAX il faut faire les modifs du POST juste au dessus.
Sinon a la prochaine commande ca va buguer.

Ya encore quelques modifications de présentation a faire mais je m'arrête la.

34969_WZXHsu220RgTAezXFnP5_t

mailorderstate.zip

mailbyorderstateEtFax.zip

Share this post


Link to post
Share on other sites

Wowowo cher Luggy

merci beaucoup
Je remonte ça en tête de pont après avoir tester.

tres tres cool l'ami

Share this post


Link to post
Share on other sites

Bonjour,

je souhaiterais joindre des factures au mail envoyé aux clients. J'ai installé votre module et rélgler les paramètres à l'aide du fichier d'installation, mais rien ne se passe.
Voici les paramètres que j'ai rentré :

id_order_state :2
email : {email}
template : payment
subjects : order_name
attachlent : invoice

Share this post


Link to post
Share on other sites