Jump to content

[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 « [email protected] »

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

Link to comment
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:

Link to comment
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....


;)
Link to comment
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 ;-)

Link to comment
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

Link to comment
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.

Link to comment
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(), '[email protected]', 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 :)

Link to comment
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

Link to comment
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

Link to comment
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.

Link to comment
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+

Link to comment
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

Link to comment
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

Link to comment
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.

Link to comment
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.

Link to comment
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

Link to comment
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.

Link to comment
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

Link to comment
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")

Link to comment
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

Link to comment
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

Link to comment
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.

Link to comment
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.

Link to comment
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:

Link to comment
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

Link to comment
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 :)
Link to comment
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 ? ;)

Link to comment
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.

Link to comment
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é.

Link to comment
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.

Link to comment
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)

Link to comment
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. ;)

Link to comment
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.

Link to comment
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 ?

Link to comment
Share on other sites

  • 3 weeks later...

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

Link to comment
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 ....

Link to comment
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, '[email protected]', '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 ?
Link to comment
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

Link to comment
Share on other sites

  • 2 weeks later...

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.

Link to comment
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 + [[email protected] ]

- on renseigne la BDD
INSERT INTO `mailbyorderstate` (`id_custom_mail`, `id_order_state`, `email`, `template`, `subject`, `attachment`) VALUES
(2, 3, '[email protected]', '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 !

Link to comment
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+

Link to comment
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 [email protected] order_customer_comment order_name invoice
Modifier Effacer 1 5 [email protected] order_conf order_name invoice
Modifier Effacer 2 6 [email protected] 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 : [email protected] 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 à [email protected] 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

Link to comment
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.

Link to comment
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

Link to comment
Share on other sites

  • 2 weeks later...
  • 2 weeks later...

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

Link to comment
Share on other sites

tu peux mettre plusieurs adresses pour tes mails de test. Est tu sur que tu n'a pas de souci d'envois de mail ??? (teste avec un message client sur une commande test)
Est tu sur que le statut que tu as testé est le 2 ?
as tu essayé avec un template de base ?

Link to comment
Share on other sites

  • 3 weeks later...

Bonjour,

J'essai d'utiliser ce module, mais j'ai le même probleme.

"les parametres du mail sont corrompu", dès lors que je met {email} dans le champ email.


Mes tests :
Si je met une adresse en static, ça marche sans problème. Le mail est bien expedié.
Si je met la balise {email} sans le sujet par exemple, la valeur est bonne dans le mail.

Merci pour votre aide

Link to comment
Share on other sites

C'est bon j'ai trouvé le bug.

Ligne 169, il faut rajouter ce code

$mail['email'] = str_replace(array_keys($templateVars), array_values($templateVars), $mail['email']);



en effet, le destinataire dans le champ mail n'était pas transformé par le replacement de la balise, alors que dans les autre champs (subject ou mail) c'était ok.

Link to comment
Share on other sites

  • 3 months later...

Bonjour et bravo pour ce module bien pratique.

J'ai une question sur les fichiers joints. Comment faire pour attacher autre chose que le bon de commande? J'ai par exemple un pdf généré par un autre module que je voudrais joindre automatiquement à certains mails suivant le statut.

J'ai trouvé la fonction getMailAttachement, je duplique le 'if' mais ensuite je ne sais pas quoi renseigner dans 'content'.
Idéalement, un lien, un fichier ou mon PDF généré par un module (un devis tiré de la facture).
merci

Link to comment
Share on other sites

  • 3 months later...
  • 1 month later...
  • 3 weeks later...

Bonsoir,

 

Je tenais en premier a remercier Broceliande, Jean-Bbruno et Luggy pour le super taf sur ce module... vraiment bien pratique !

J'en ai profité pour apporter ma petit contrib avec cette nouvelle version 0.61 (compatible 1.4.x) qui inclus

  • Correction bug {email} dans l’objet
  • Amélioration de l’administration
  • Nouvelle documentation
  • Traduction française

mailbyorderstate.zip

Link to comment
Share on other sites

Hoho, merci Ludo mais je n'ai fait que les demandes ;-)

 

J'ai un besoin complémentaire qui serait de pousser le module à "filtrer" les mail et BL par fabricant.

L'idée et de reprendre dans les BL uniquement les produits par fournisseur afin de faire de l'envoi direct

C'est gravement compliqué ou a partir de ce qu'on a on pourrait aller jusque là ???

 

Merci à tous

Link to comment
Share on other sites

Bonjour tout le monde,

 

Merci pour ce module, il s'avère extremement pratique et je dirais meme indispensable.

Cependant, je rencontre un petit problème concernant les pièces jointes (mail ou facture). La facture (pour mon cas) est bien attachée en pièce jointe au mail du client mais gros problème elle n'a ni numéro, ni date (photo pièce jointe). Et pourtant lorsque je passe directement par l'onglet commande dans le back office et que je télécharge le BL ou la facture, pas de problème avec la date ni le numéro de facture.

J'ai fais le test avec le BL c'est le même problème.

 

Merci d'avance de votre aide.

post-217571-0-16814400-1319395127_thumb.jpg

Link to comment
Share on other sites

  • 3 months later...

Merci beaucoup pour ce module, je m'arrachais les cheveux depuis une journée !

Une petite question, peut-on récupérer la quantité de produits achetés dans le template new_order ? J'ai un petit texte au dessus du récapitulatif il il faudrait que j'insère cette phrase : Bonjour, Nous vous confirmons la réservation de XX place(s) au nom de...

 

Merci de m'indiquer si vous avez une astuce pour cela.

Link to comment
Share on other sites

  • 1 month later...

Bonjour

 

J'ai un problème important pour ce module.

 

En effet je suis sous prestashop 1.4 et quand mes clients passent une commande, au moment de passer le statut en paiement accepté la facture ne se génère pas et du coup le client arrive sur une page avec l'erreur 'invalide order state".

 

J'ai donc désactivé le module et depuis, plus d'erreur !

 

Merci :)

Link to comment
Share on other sites

Bonjour,

 

J'aurai une question concernant ce module au niveau des pièces jointe. Est ce possible de joindre une pièce jointe autre ques les traditionnel " facture, bon de livraison " .

 

Exemple, je souhaite joindre un pdf sur la procédure de sav en même temp que la confirmation de commande.

 

 

Merci d'avance

Link to comment
Share on other sites

Bonjour,

 

Je viens de découvrir ce module qui correspond totalement à ce que je cherchais, mais la fonction qui m'intéresse le plus, le fax avec ecofax ne fonctionne pas.

Ovh demande 3 choses, le destinataire doit être [email protected], l'objet doit être le login ecofax seul et le mot de passe dans le corps de mail.

 

Théoriquement c'est très simple, mais, prestashop ajoute [$shop_name] à l'objet dans la classe mail donc le login n'est pas reconnu, j'ai remedié à ce soucis en modifiant la classe mail.php avec une condition sur le template. Après avoir vérifié de nombreuses fois tout est ok, cependant le service télécopie renvoie "erreur de traitement".

 

Donc je me demandais si quelqu'un avait déjà réussi à faire fonctionner cette fonction avec ovh.

 

Merci.

Link to comment
Share on other sites

Bonjour,

 

voila la partie qui gere le pdf a expédié. J'aimerai pouvoir expédié un pdf précis qui soit toujours le même, pour le SAV. Est ce que quelqu'un pourrait m'aide a modifier ou rajouter le beau de code qu'il faut.

 

Merci d'avance

 

public function getMailAttachment($attachmentType='', $order)
{
 $fileAttachment = array();
 if($attachmentType == 'delivery')
 {
  $fileAttachment['content'] = PDF::invoice($order, 'S', false, $tmp, false, $order->delivery_number);
  $fileAttachment['name'] = Configuration::get('PS_DELIVERY_PREFIX', intval($order->id_lang)).sprintf('%06d', $order->delivery_number).'.pdf';
  $fileAttachment['mime'] = 'application/pdf';
  return $fileAttachment;
 }
 if($attachmentType == 'invoice')
 {
  $fileAttachment['content'] = PDF::invoice($order, 'S', false, $tmp, false, false);
  $fileAttachment['name'] = Configuration::get('PS_INVOICE_PREFIX', intval($order->id_lang)).sprintf('%06d', $order->invoice_number).'.pdf';
  $fileAttachment['mime'] = 'application/pdf';
  return $fileAttachment;
 }

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