Franck/élone Posted November 11, 2012 Share Posted November 11, 2012 J'ai bien suivi toutes les instructions ci dessus, j'ai cherché partout et je ne comprends pas pourquoi je n'ai qu'une partie de mes cgv qui est générée dans ma facture et dans mon lien de téléchargement. Environ 1/2 n'apparait pas. La colonne de gauche n'est pas remplie entièrement. Si quelqu'un a une idée, car là je bloque. Merci, Link to comment Share on other sites More sharing options...
Mellow Posted November 12, 2012 Share Posted November 12, 2012 J'ai bien suivi toutes les instructions ci dessus, j'ai cherché partout et je ne comprends pas pourquoi je n'ai qu'une partie de mes cgv qui est générée dans ma facture et dans mon lien de téléchargement. Environ 1/2 n'apparait pas. La colonne de gauche n'est pas remplie entièrement. Si quelqu'un a une idée, car là je bloque. Merci, Oups! très bizarre.... Est ce que ça fonctionnait bien avec les précédentes versions de PDF.php ? Link to comment Share on other sites More sharing options...
Franck/élone Posted November 12, 2012 Share Posted November 12, 2012 Oups! très bizarre.... Est ce que ça fonctionnait bien avec les précédentes versions de PDF.php ? Avec le fichier.txt c'était pire..je n'avais que le titre. J'ai regardé dans mon code html directement dans preference/cms/... Je n'ai rien vu. Merci en tout cas pour ton temps. Franck Link to comment Share on other sites More sharing options...
Superbegood31 Posted November 18, 2012 Share Posted November 18, 2012 (edited) Bonjour à tous et merci pour vos contributions, Ma boutique tourne avec la version 1.5.0.17 de prestashop et voilà ce qui fonctionne et ce qui ne fonctionne pas. Ce qui fonctionne: - Affichage des CGV dans une div au-dessus de la case à cocher - Lien permettant de télécharger les CGV au format PDF - Ajout de quelques informations relatives aux CGV dans l'email de confirmation de commande Ce qui ne fonctionne pas: - Blocage du processus de commande si le client ne télécharge pas les CGV (avec affichage "vous devez télécharger les CGV pour continuer") - Ajout des CGV en pièces jointes dans l'email de confirmation de commande au client - Génération des CGV au dos des factures. Pour informations, j'ai mis à la racine le fichier pdf-cgv.php. De plus, j'ai mofifier le fichier PDF.php par celui fournit par Mellow mais aucuns changements... En tous les cas merci à vous tous qui œuvrez pour une meilleur conformité. Bruce J'ai réussi à inclure les CGV à l'email de confirmation de commande grâce à la solution de Mellow (adapté à mon cas). J'ai ajouté ce bout de code après la ligne 251 (juste avant /* Send mail */) if (substr($template,3) == "order_conf" && file_exists(_PS_ROOT_DIR_.'/CGV/cgv.pdf')) { $CGVcms = new CMS((int)(Configuration::get('PS_CONDITIONS_CMS_ID')), (int)$id_lang); $message->attach(new Swift_Message_Attachment(new Swift_File(_PS_ROOT_DIR_.'/CGV/cgv.pdf'), $CGVcms->meta_title.'.pdf', 'application/pdf')); } Pour rappel, je tourne sous la 1.5.0.17 Bonne journéé. Edited January 2, 2013 by Superbegood (see edit history) Link to comment Share on other sites More sharing options...
Franck/élone Posted November 18, 2012 Share Posted November 18, 2012 Bonjour à tous, Si quelqu'un avait un bout de code pour bloquer le process. de commande si le client ne télécharge pas les cgv se serait idéal. Je pense que nous sommes nombreux a être intéressé par cela, et surtout cela nous permettrais d'être 100% légal. Merci à tous. Link to comment Share on other sites More sharing options...
Superbegood31 Posted November 21, 2012 Share Posted November 21, 2012 Bonjour, Est-ce que rendre le téléchargement des CGV obligatoire (si non blocage du processu de commande) se fait en javascript ? Link to comment Share on other sites More sharing options...
Mellow Posted November 22, 2012 Share Posted November 22, 2012 @Superbegood La méthode avec PDF.php ne marchera, je n'avais pas remarqué mais la génération des pdf n'a pas du tout la même structure dans PS1.5.x. Voici un code pour désactiver par défaut la case d'acceptation des cgv, et l'activer lorsque le client click sur le lien de téléchargement : <a id="downloadcgv" href="lien-de-telechargement">Texte de telechargement</a> <script type="text/javascript"> $(document).ready(function(){ if(!$('#cgv').is(':checked')) $('#cgv').attr('disabled', true); $('#downloadcgv').click(function(){ $('#cgv').removeAttr('disabled'); //if(!$('#cgv').is(':checked')) $('#cgv').attr('checked', true); }); }); </script> Tel quel, le script réactive la case, mais le client doit encore cliquer dessus après avoir téléchargé pour accepter les cgv. Si tu active la ligne qui est en commentaire (enlever //), le script va aussi cocher la case, mais ça na sera pris en compte que dans la commande en 5 étapes. (en one page checkout il y a de l'ajax derrière la case à cocher, et ça ne suffit pas) Link to comment Share on other sites More sharing options...
Superbegood31 Posted November 22, 2012 Share Posted November 22, 2012 Bonjour Mellow et merci pour votre aide ! Je fais un petit retour pour les gens dans mon cas. Voici le bout de code concernant les CGV de mon fichier order-carrier.tpl: {if $conditions AND $cms_id} <h3 class="condition_title">{l s='Terms of service'}</h3> <div class="clear"> <div style="height:200px;margin:5px;padding:5px;border:1px solid #E0E0E0"> <iframe id="fancybox-frame" frameborder="0" hspace="0" scrolling="auto" src="{$link_conditions}"></iframe> </div> </div> <p><img src="{$img_dir}icon/attention.png"><strong><i> Vous devez télécharger nos conditions générales de vente pour poursuivre votre commande</i></strong></br></br> <script type="text/javascript"> function PopupWindow(source, strWindowToOpen){ var strWindowFeatures = "toolbar=no,resize=no,titlebar=no,"; strWindowFeatures = strWindowFeatures + "menubar=no,width=900,height=600,top=20,left=20,maximize=null"; window.open(strWindowToOpen, '', strWindowFeatures); } </script> <a id="downloadcgv" href="javascript:PopupWindow(this,'{$base_dir}CGV/Conditions générales de vente.pdf');" title="{l s='Terms and conditions of use'}"><img src="{$img_dir}icon/pdf.gif" alt="{l s='Terms and conditions of use'}" class="icon" />{l s='Download our terms and conditions of use'}</a> <script type="text/javascript"> $(document).ready(function(){ if(!$('#cgv').is(':checked')) $('#cgv').attr('disabled', true); $('#downloadcgv').click(function(){ $('#cgv').removeAttr('disabled'); if(!$('#cgv').is(':checked')) $('#cgv').attr('checked', true); }); }); </script> </p> <p class="checkbox"> <input type="checkbox" name="cgv" id="cgv" value="1" {if $checkedTOS}checked="checked"{/if} /> <label for="cgv">{l s='I agree to the Terms of Service and will adhere to them unconditionally.'}</label> <a href="{$link_conditions}" class="iframe">{l s='(Read Terms of Service)'}</a> <script type="text/javascript">$('a.iframe').fancybox();</script> </p> {/if} J'ai aussi ajouter un autre message d'avertissement vers la ligne 40 du même fichier var msg2 = "{l s='You must dowload for agree to the terms of service before continuing.' js=1}"; Ensuite, j'ai fait la traduction dans le BO : Vous devez télécharger nos conditions générales de vente pour les accepter et poursuivre votre commande. Et voici le rendu visuel Pour résumer : - affichage d'une div avec les CGV (depuis le cms CGV) - ajout du lien de téléchargement au format PDF (s'ouvre dans une fenêtre dimensionnée) - blocage du processus de commande si le client ne télécharge pas les CGV (avec message d'avertissement modifié) - envoi des CGV en pièce jointe dans l'email de confirmation de commande (order_conf) Un grand merci à toutes les personnes qui m'ont permis de mettre en place cette solution et de coller le plus possible à la règlementation. Bruce Link to comment Share on other sites More sharing options...
papich Posted December 25, 2012 Share Posted December 25, 2012 Bonjour, Je reprend le sujet en cours @superbegood ton code fonctionne sous ps 1.5.2? Peux t on joindre la facture avec les CGV dans le mail de confirmation de commande? Peux t on ajouter la miniature du produit dans le mail de la commande pour identifier le produit? Merci Link to comment Share on other sites More sharing options...
Superbegood31 Posted December 25, 2012 Share Posted December 25, 2012 Bonsoir, Pour la 1.5.2 je ne sais pas je suis sur la 1.5.0.17. Pour les factures, la fonction existe déjà avec les status de commande. Pour les miniarures, je penses que cela se joue au niveau de $templatevars array... Bonnes fêtes Link to comment Share on other sites More sharing options...
papich Posted January 2, 2013 Share Posted January 2, 2013 Dans ton dernier post tu dit Ce qui ne fonctionne pas: - Blocage du processus de commande si le client ne télécharge pas les CGV (avec affichage "vous devez télécharger les CGV pour continuer") - Ajout des CGV en pièces jointes dans l'email de confirmation de commande au client - Génération des CGV au dos des factures. Y a t il du nouveau et un processus à respecter pour que je teste sous 1.5.2? Merci Link to comment Share on other sites More sharing options...
Superbegood31 Posted January 2, 2013 Share Posted January 2, 2013 Bonjour Papich, As-tu fais les tests sur ta boutique ? Dis nous ce qui fonctionne et ce qui ne fonctionne pas. Link to comment Share on other sites More sharing options...
papich Posted January 2, 2013 Share Posted January 2, 2013 Je ne sais pas par ou commencer....tellement il y a eu des modifications... Link to comment Share on other sites More sharing options...
machpro Posted January 3, 2013 Share Posted January 3, 2013 Bsr, J'ai utilisé la modif préconisée par jomcdonald, un client vient de me faire un retour comme quoi les cgv ne s'ouvre pas dans l'iframe et l'on ne peut pas choisir son transporteur, ce bug se produit sur tablette ipad; avez eu vous aussi connaissance de ce pb, personnellement je n'ai pas de tablette pour reproduire le bug. Link to comment Share on other sites More sharing options...
papich Posted January 4, 2013 Share Posted January 4, 2013 Peut être il faut conseiller de lire les CGV et pas de les télécharger C'est pour cela que ca beug sur l'ipad puisqu'il ne doit pas savoir ou stocker... Link to comment Share on other sites More sharing options...
lokiiy Posted January 7, 2013 Share Posted January 7, 2013 (edited) Merci a tous pour cette contribution ... Je suis en 1.4.9 et la méthode donné par bruce un peu plus en en post #108 fonctionne à merveille !! Edited January 7, 2013 by lokiiy (see edit history) Link to comment Share on other sites More sharing options...
lokiiy Posted January 9, 2013 Share Posted January 9, 2013 (edited) Bonjour, Avec la fancy-box j'ai un petit soucis !! J'ai mon fond blanc et mon ecriture etant blanche du coup les CGV faut surligner le texte pour les lires ^^Pas très pro tout ca !!! J'ai essayé pas mal de chose mais rien ne change ... Je trouve pas ce qu'il faut que je modifie pour avoir un fond de la même couleur que mon site .... Si quelqu'un peu me dire le fichier qu'il faut que je modifie franchement ca serait suuuuperrr cool Un visuel vaut tjrs mieux que de longgggg discours !! Site web ici : aidez moi s'il vous pleaseee Pour faciliter la connexion : email : [email protected] pass: testcgv Il faut bien entendu faire style de passer commande et aller jusqu'au frais de port la ou il y a la fancy-box visible et la non visible des CGV avec laquel j'ai des problèmess... Merci de votre soutien !!! Ps: j'ai installé sur une 1.4.9 pas de soucis et la sur une 1.4.6.2 ya problème Edited January 9, 2013 by lokiiy (see edit history) Link to comment Share on other sites More sharing options...
Cateye Posted January 9, 2013 Share Posted January 9, 2013 (edited) Bonjour, Tout d'abord, merci pour cette contribution à la mise en légalité de Prestashop. J'ai ajouté l'iframe dans order-carrier.tpl et je me retrouve en bas de page cms, avec un bout de l'image background de la boutique (partie marron). J'ai bien ajouté dans global.css : #cms div.content_only { background: #ffffff; Est-ce que quelqu'un aurait une idée comment résoudre la cause de ce bug d'affichage? La version Prestashop est : 1.4.3. Merci par avance. Edited January 11, 2013 by Nutrinat (see edit history) Link to comment Share on other sites More sharing options...
Matista19 Posted January 13, 2013 Share Posted January 13, 2013 Oui je pense que Prestashop à ce niveau , au niveau du thème de base ainsi que du back office et des données enregistré est bien valide au yeux de la loi. Si tu préfère plus de sécurité, je te conseille d'aller voir un Avocat via la chambre des commerces qui ets gratuit et qui peut te dire si tout est en règle en fonction de ton activités et de tes modes de fonctionnement. Link to comment Share on other sites More sharing options...
jeckyl Posted February 26, 2013 Share Posted February 26, 2013 Bonjour, voici ce que nous proposons : http://www.prestashop.com/forums/topic/228467-module-envoyez-vos-cgv-aux-clients/ Link to comment Share on other sites More sharing options...
Romain84 Posted February 26, 2013 Share Posted February 26, 2013 Mais vous imaginez un client devant à chaque commande télécharger des CGV ? Pour un acheteur utilisant un PC de manière occasionnelle, il va finir par se retrouver avec "CGV-MonMagasin-N°3-26/02/13(12)" ("12" signifiant qu'il les avait déjà 12 fois avant >.< Au niveau de la clientèle, ça pourrait passer comme une sorte de harcèlement ! Pourquoi pas tout simplement envoyer les CGV en papier par courrier postal dés l'inscription d'un nouveau client, l'informant que la loi nous oblige à ce qu'il l'ait en papier, lui envoyer un email avec les CGV à l'inscription. A chaque modification, un email avec les CGV directement lisibles (comme le fait paypal il me semble) et la version papier à la première commande qui suit le changement des CGV. Et ... Derrière la facture, ça compte pas ? Pourquoi ça ? L'acheteur n'est pas censé contrôler la facture ? Parce que s'il passe une commande à 100€ et que je lui débite les 150€ qu'il y a sur la facture, la procédure n'est pas la même que si le débit est différent du prix indiqué sur facture ! Link to comment Share on other sites More sharing options...
bebeachat Posted February 26, 2013 Author Share Posted February 26, 2013 Et ... Derrière la facture, ça compte pas ? Pourquoi ça ? Simplement parce que le client DOIT avoir les CGV (sur un support durable) AVANT de passer commande. Au verso de la facture, c'est trop tard, selon la loi. Pourquoi pas tout simplement envoyer les CGV en papier par courrier postal dés l'inscription d'un nouveau client Ouch, le budget La Poste va exploser ! Et le temps à y consacrer... Non, irréalisable ! 1 Link to comment Share on other sites More sharing options...
Ducluzeau Posted March 20, 2013 Share Posted March 20, 2013 (edited) MODULE CGV Prestadget • INSTALLATION très mal expliquée • SERVICE APRES-VENTE INEXISTANT Je suis client Prestadget depuis mai 2012 avec : 1) Email_Template (qui n'a jamais fonctionné), 2) Prestadget pour iPhone (assez pratique), 3) Catch Attention, 4) Facebook Opengraph, 5) URL Alias redirection... Mais je déplore que Thomas Decaux n'assure pas le suivi de ses modules correctement ; - Il faut le relancer plusieurs fois pour qu'il réponde, - Il ne tient pas compte des demandes, et répond à côté (très mauvais suivi), - Il donne des explications insuffisantes - et incompréhensibles - pour l'utilisateur de base (que je suis), Et surtout, après m'avoir demandé un accès ftp pour le module CGV que je n'arrive pas à installer et qui ne fonctionne pas, il refuse d'aller voir ce qui ne va pas… Et j'ai pourtant insisté gentiment et poliment ! Contrairement à ce qu'il écrit dans le forum : "Mais si après l'achat vous me fournissez par mail un accès FTP et un horaire d'intervention je l'installe gratuitement (vu que le module est déjà payant) sous 48h" Et contrairement à ce qui est indiqué sur son site : "Des problèmes d'installation ? Nous vous installons gratuitement ce module si votre boutique est en 1.4 ou 1.5 ! Envoyez nous juste après votre commande un email sur prestadget[at]gmail.com avec vos codes FTP et horaires souhaités." PAS SERIEUX ! http://www.prestadget.com… A éviter ! ! ! Edited March 20, 2013 by zetcompagnie (see edit history) Link to comment Share on other sites More sharing options...
CodeShaker Posted January 24, 2014 Share Posted January 24, 2014 Bon, hé bien je m'intéresse à ce topic depuis hier, et pour ma part je pense que la solution iframe proposée par jomcdonald devrait très bien faire l'affaire pour l'affichage en direct des CGV. Merci à lui Pour l'envoi des CGV par mail, j'ai fait la petite modif suivante dans /classes/Mail.php : Ça consiste juste à placer les pdf des CGV dans le dossier /docs/ sous la forme CGV_fr.pdf, CGV_en.pdf, etc... Ensuite dans Mail.php, juste après : if ($fileAttachment && isset($fileAttachment['content']) && isset($fileAttachment['name']) && isset($fileAttachment['mime'])) $message->attach(new Swift_Message_Attachment($fileAttachment['content'], $fileAttachment['name'], $fileAttachment['mime'])); On ajoute : if (substr($template,3) == "order_conf" && file_exists(_PS_ROOT_DIR_.'/docs/CGV_'.$iso.'.pdf')) { $CGVcms = new CMS((int)(Configuration::get('PS_CONDITIONS_CMS_ID')), (int)$id_lang); $message->attach(new Swift_Message_Attachment(new Swift_File(_PS_ROOT_DIR_.'/docs/CGV_'.$iso.'.pdf'), $CGVcms->meta_title.'.pdf', 'application/pdf')); } Explication :Si il s'agit bien du message de confirmation de commande, et que le fichier CGV existe dans la bonne langue, on récupère le CMS CGV pour en extraire le titre, et on utilise ce titre pour nommer le fichier qu'on attache ensuite au message. Voila, avec ça plus l'affichage en iframe lors de la commande, je pense qu'on ne devrait pas être bien loin de la législation... Après il ne faudra pas oublier de changer les fichier si les CGV changent. Et il y a surement un moyen de générer le pdf à la volée à partir du cms CGV, mais ça à l'air assez corsé... Bonjour à tous, Pour ceux que ca intéresse, je confirme le bon fonctionnement du bout de code de Mellow avec Prestashop 1.5.6.1. A placer juste avant ceci vers la ligne 310-320 du fichier /classes/Mail.php : /* Send mail */ $send = $swift->send($message, $to, new Swift_Address($from, $from_name)); $swift->disconnect(); Par contre, cela concerne uniquement les mails "order_conf", si j'ajoute un OR "bankwire", cela peut fonctionner? Link to comment Share on other sites More sharing options...
nicocolt Posted May 26, 2014 Share Posted May 26, 2014 (edited) Hello, Je dépoussière Est-ce la même manip sous presta 1.6 ? Et comment ajouter également le formulaire de rétractation de la nouvelle loi Hamon ? Merci de votre aide, Amicalement, Nico Edited May 26, 2014 by nicocolt (see edit history) Link to comment Share on other sites More sharing options...
Constantin.MDWeb Posted May 27, 2014 Share Posted May 27, 2014 Bonjour, pour les plus néophytes d'entre vous il est possible d'installer directement ce module http://addons.prestashop.com/fr/modules-processus-de-commande/16804-envoi-des-cgv-loi-hamon.html pour pourvoir envoyer vos conditions générales de ventes en même temps que la confirmation de commande ! Link to comment Share on other sites More sharing options...
Le-cathare Posted May 27, 2014 Share Posted May 27, 2014 Bonjour, Moi j'utilise ce module depuis 1 an : http://www.prestatoolbox.fr/outils-administration/255-loi-hamon-envoyez-vos-cgv-aux-clients.html Link to comment Share on other sites More sharing options...
nicocolt Posted May 27, 2014 Share Posted May 27, 2014 Hello, Oui, vous avez raison, mais ce sont tous les deux des modules payants, et je ne veux pas payer car ça ne parait pas si compliqué que ça de joindre un pdf à un mail envoyé par presta (Il suffit de regarder le prix du module qui n'est pas très cher en soi). Mon soucis est de trouver comment le faire proprement. J'imagine que presta embarque tous les outils pour récupérer un pdf sur le serveur local et le joindre en pièce jointe au mail. Je sais le faire "à l'arrache" mais je doute que soit bien sécurisé. L'idée serait d'utiliser les classes offertes par presta, mais le soucis est que je ne sais pas quelles sont ces classes. Amicalement, Nico Link to comment Share on other sites More sharing options...
pecheurdunet Posted May 31, 2014 Share Posted May 31, 2014 (edited) Bonjour, j'ai utilisé la méthode évoquée en post #108 et je rencontre un soucis : lorsque l'on clique sur "télécharger les CGV" une fenetre s'ouvre bien mais une erreur page introuvable surgit et pas de download des CGV. Je viens de tester une solution qui semble bien fonctionner : j'ai créer un dossier "CGV" et dedans j'ai mis mes CGV au format ZIP ensuite j'ai modifié le code trouvé en post #108 ainsi : {if $conditions AND $cms_id} <h3 class="condition_title">{l s='Terms of service'}</h3> <div class="clear"> <div style="height:200px;margin:5px;padding:5px;border:1px solid #E0E0E0"> <iframe id="fancybox-frame" frameborder="0" hspace="0" scrolling="auto" src="{$link_conditions}"></iframe> </div> </div> <p><img src="{$img_dir}icon/attention.png"><strong><i> Vous devez télécharger nos conditions générales de vente pour poursuivre votre commande</i></strong></br></br> <script type="text/javascript"> function PopupWindow(source, strWindowToOpen){ var strWindowFeatures = "toolbar=no,resize=no,titlebar=no,"; strWindowFeatures = strWindowFeatures + "menubar=no,width=900,height=600,top=20,left=20,maximize=null"; window.open(strWindowToOpen, '', strWindowFeatures); } </script> <a id="downloadcgv" href="javascript:PopupWindow(this,'{$base_dir}CGV/cgv.zip');" title="{l s='Terms and conditions of use'}"><img src="{$img_dir}icon/pdf.gif" alt="{l s='Terms and conditions of use'}" class="icon" />{l s='Download our terms and conditions of use'}</a> <script type="text/javascript"> $(document).ready(function(){ if(!$('#cgv').is(':checked')) $('#cgv').attr('disabled', true); $('#downloadcgv').click(function(){ $('#cgv').removeAttr('disabled'); if(!$('#cgv').is(':checked')) $('#cgv').attr('checked', true); }); }); </script> </p> <p class="checkbox"> <input type="checkbox" name="cgv" id="cgv" value="1" {if $checkedTOS}checked="checked"{/if} /> <label for="cgv">{l s='I agree to the Terms of Service and will adhere to them unconditionally.'}</label> <a href="{$link_conditions}" class="iframe">{l s='(Read Terms of Service)'}</a> <script type="text/javascript">$('a.iframe').fancybox();</script> </p> {/if} et là ca fonctionne si jamais ca peut aider j'utilise PrestaShop™ 1.4.11.0 Edited May 31, 2014 by pecheurdunet (see edit history) Link to comment Share on other sites More sharing options...
Mediacom87 Posted June 1, 2014 Share Posted June 1, 2014 Hello, Oui, vous avez raison, mais ce sont tous les deux des modules payants, et je ne veux pas payer car ça ne parait pas si compliqué que ça de joindre un pdf à un mail envoyé par presta (Il suffit de regarder le prix du module qui n'est pas très cher en soi). Mon soucis est de trouver comment le faire proprement. J'imagine que presta embarque tous les outils pour récupérer un pdf sur le serveur local et le joindre en pièce jointe au mail. Je sais le faire "à l'arrache" mais je doute que soit bien sécurisé. L'idée serait d'utiliser les classes offertes par presta, mais le soucis est que je ne sais pas quelles sont ces classes. Amicalement, Nico Bonjour, Et donc depuis le temps vous avez du trouver une solution aussi pratique est moins onéreuse que le module proposé ? Link to comment Share on other sites More sharing options...
nicocolt Posted June 2, 2014 Share Posted June 2, 2014 Bonjour Prestashop Fanatic, Oui, j'ai trouvé la solution, et elle respecte les standards Prestashop. J'ai également prévu, en plus des CGV, d'envoyer le formulaire de rétractation. Prestashop'ment, Nico Link to comment Share on other sites More sharing options...
pecheurdunet Posted June 5, 2014 Share Posted June 5, 2014 Bonjour Prestashop Fanatic, Oui, j'ai trouvé la solution, et elle respecte les standards Prestashop. J'ai également prévu, en plus des CGV, d'envoyer le formulaire de rétractation. Prestashop'ment, Nico Bonjour, et la solution que tu as trouvé tu peux nous la faire partager? Link to comment Share on other sites More sharing options...
nicocolt Posted June 5, 2014 Share Posted June 5, 2014 Hello, Oui pas de soucis, je vais vous partager cela. Je suis en plein lancement de ma boutique du coup je vous fais ça ASAP. La solution ressemble à celle de Mellow (post #124), sauf que je ne l'ai pas implémenté dans la classe Mail.php Prestashop'ment, Nico 1 Link to comment Share on other sites More sharing options...
pecheurdunet Posted June 5, 2014 Share Posted June 5, 2014 Bonjour, pensez bien a faire la modification sur votre thème mobile également Link to comment Share on other sites More sharing options...
nicocolt Posted June 5, 2014 Share Posted June 5, 2014 Bonjour, J'ai un thème responsive donc pas besoin de modifier les tpl du thème mobile. Prestashop'ment Nico Link to comment Share on other sites More sharing options...
masera Posted June 10, 2014 Share Posted June 10, 2014 bonjour a tous, moi j'ai bien modifier le fichier comme dit dans le poste #108, sa fonctionne bien a l'exception : Les CGV sur la page de commande sont plus petite que la fenêtre ( ou regler la largeur? ) , et deuxième chose, les CGV ne sont pas envoyé par mail avec la commande............ test en ligne, la commande arrive bien mais pas les CGV.... petit aide? Link to comment Share on other sites More sharing options...
nicocolt Posted June 10, 2014 Share Posted June 10, 2014 Hello, Quelle classe as-tu modifié pour l'envoi des CGV par mail ? Prestashop'ment, Nico Link to comment Share on other sites More sharing options...
masera Posted June 10, 2014 Share Posted June 10, 2014 aucunes classes justement, j'ai juste fait les modif comme sur le post 108 Link to comment Share on other sites More sharing options...
nicocolt Posted June 10, 2014 Share Posted June 10, 2014 (edited) Le post #108 indique quelle classe modifier pour pouvoir télécharger les CGV dans le tunnel de commande, mais n'indique pas quelle classe modifier pour les envoyer par mail. Pour ma part j'ai overridé la classe PaymentModule.php afin de joindre les CGV dans le mail. Comme je l'ai dit plus haut, je suis en plein lancement de ma boutique, du coup je vous poste les modifs asap. Prestashop'ment, Nico Edited June 10, 2014 by nicocolt (see edit history) 1 Link to comment Share on other sites More sharing options...
masera Posted June 10, 2014 Share Posted June 10, 2014 alors je les lit asap.... Link to comment Share on other sites More sharing options...
masera Posted June 23, 2014 Share Posted June 23, 2014 sniff, toujours pas de nouvelles??? Link to comment Share on other sites More sharing options...
nicocolt Posted June 23, 2014 Share Posted June 23, 2014 Hello, De mon côté je n'ai même pas encore mis en prod la loi Hamon. Voici ce que j'ai mis en place sur ma plateforme de qualif: J'ai overridé la classe PaymentModule.php dans le rep override/classes et j'ai modifié le code comme suit (vers la ligne 760 chez moi, mais recherchez simplement "Join PDF invoice"): // Join PDF invoice if ((int)Configuration::get('PS_INVOICE') && $order_status->invoice && $order->invoice_number) { $pdf = new PDF($order->getInvoicesCollection(), PDF::TEMPLATE_INVOICE, $this->context->smarty); $file_attachement['content'] = $pdf->render(false); $file_attachement['name'] = Configuration::get('PS_INVOICE_PREFIX', (int)$order->id_lang, null, $order->id_shop).sprintf('%06d', $order->invoice_number).'.pdf'; $file_attachement['mime'] = 'application/pdf'; if (file_exists(_PS_ROOT_DIR_.'/docs/CGV_'.$iso.'.pdf')) { $CGVcms = new CMS((int)(Configuration::get('PS_CONDITIONS_CMS_ID')), (int)$id_lang); $message->attach(new Swift_Message_Attachment(new Swift_File(_PS_ROOT_DIR_.'/docs/CGV_'.$iso.'.pdf'), $CGVcms->meta_title.'.pdf', 'application/pdf')); $cgv_attachement['name'] = $CGVcms->meta_title.'.pdf' $cgv_attachement['mime'] = 'application/pdf'; $CGVFile = new Swift_File(_PS_ROOT_DIR_.'/docs/CGV_'.$iso.'.pdf'); $CGVString = $CGVFile->readFull(); $cgv_attachement['content'] = $CGVString; } $file_attachements = array($file_attachement, $cgv_attachement); } else { //$file_attachement = null; if (file_exists(_PS_ROOT_DIR_.'/docs/CGV_'.$iso.'.pdf')) { $CGVcms = new CMS((int)(Configuration::get('PS_CONDITIONS_CMS_ID')), (int)$id_lang); $message->attach(new Swift_Message_Attachment(new Swift_File(_PS_ROOT_DIR_.'/docs/CGV_'.$iso.'.pdf'), $CGVcms->meta_title.'.pdf', 'application/pdf')); $cgv_attachement['name'] = $CGVcms->meta_title.'.pdf' $cgv_attachement['mime'] = 'application/pdf'; $CGVFile = new Swift_File(_PS_ROOT_DIR_.'/docs/CGV_'.$iso.'.pdf'); $CGVString = $CGVFile->readFull(); $cgv_attachement['content'] = $CGVString; } $file_attachements = $cgv_attachement; } if (Validate::isEmail($this->context->customer->email)) { Mail::Send( (int)$order->id_lang, 'order_conf', Mail::l('Order confirmation', (int)$order->id_lang), $data, $this->context->customer->email, $this->context->customer->firstname.' '.$this->context->customer->lastname, null, null, $file_attachements, null, _PS_MAIL_DIR_, false, (int)$order->id_shop ); } Il suffit juste de comparer avec la classe native pour identifier les changements. Il suffit également de répéter cette méthode pour joindre le formulaire de rétractation. (je n'ai pas encore mis en place). Bien entendu cela peut être amélioré, mais cette solution marche très bien sur ma plateforme de qualif. Je vous conseille fortement de ne pas effectuer ces modifs directement en prod mais de la tester avant sur votre environnement de dev/qualif et de penser à bien backuper vos données de prod avant de transférer vos modifs, mais cela va sans dire. Prestashop'ment, Nico Link to comment Share on other sites More sharing options...
nadgeda Posted June 23, 2014 Share Posted June 23, 2014 (edited) J'essaye de trouver comment afficher la cellule du cms ou il y a le contenu des CGV. Dans class/PaymentModule.php apres la ligne 775 ajouter une ligne du style: '{cgv}' => (le contenu des cgv de la table)<= c'est ca que j'arrive pas a faire, tout est dans la table ps_cms_lang => content Puis dans order conf ajouter tout simplement a la fin {cgv} Pour avoir les CGV a la fin du mail de confirmation de commande, ca serait pas plus simple ? Edited June 23, 2014 by nadgeda (see edit history) Link to comment Share on other sites More sharing options...
nicocolt Posted June 23, 2014 Share Posted June 23, 2014 Hello, Pas certain de comprendre ce que tu veux faire. Prestashop'ment, Nico Link to comment Share on other sites More sharing options...
nadgeda Posted June 23, 2014 Share Posted June 23, 2014 (edited) Pour ajouter les cgv dans la confirmation de commande ( pas en pdf )par mail Edited June 23, 2014 by nadgeda (see edit history) Link to comment Share on other sites More sharing options...
nicocolt Posted June 23, 2014 Share Posted June 23, 2014 La confirmation de commande envoyée par mail c'est bien ça ? Si oui, pourquoi tu ne veux pas envoyer les CGV en pièce jointe ? Prestashop'ment, Nico Link to comment Share on other sites More sharing options...
nadgeda Posted June 23, 2014 Share Posted June 23, 2014 Rien n'empeche de faire les deux mais je pense que le clic de la piece jointe pourra etre contre le vendeur ( trop dur pour le client ) Link to comment Share on other sites More sharing options...
nadgeda Posted June 23, 2014 Share Posted June 23, 2014 je viens de trouver ca: "communiquer au consommateur leurs conditions de vente dans un format imprimable standard non modifiable (type PDF) comprenant une date d’effet, un numéro de version ainsi qu’un système d’horodatage." Donc pas besoin de se prendre la tete a vouloir inclure dans le mail, je vais inclure ta solution. 1 Link to comment Share on other sites More sharing options...
masera Posted June 23, 2014 Share Posted June 23, 2014 je viens de trouver ca: "communiquer au consommateur leurs conditions de vente dans un format imprimable standard non modifiable (type PDF) comprenant une date d’effet, un numéro de version ainsi qu’un système d’horodatage." Donc pas besoin de se prendre la tete a vouloir inclure dans le mail, je vais inclure ta solution. Un lien ? Link to comment Share on other sites More sharing options...
nadgeda Posted June 23, 2014 Share Posted June 23, 2014 http://www.journaldunet.com/ebusiness/expert/57604/e-commerce---apres-la-loi-hamon--ce-qui-va-changer.shtml Link to comment Share on other sites More sharing options...
nadgeda Posted July 1, 2014 Share Posted July 1, 2014 Hello, De mon côté je n'ai même pas encore mis en prod la loi Hamon. Voici ce que j'ai mis en place sur ma plateforme de qualif: J'ai overridé la classe PaymentModule.php dans le rep override/classes et j'ai modifié le code comme suit (vers la ligne 760 chez moi, mais recherchez simplement "Join PDF invoice"): // Join PDF invoice if ((int)Configuration::get('PS_INVOICE') && $order_status->invoice && $order->invoice_number) { $pdf = new PDF($order->getInvoicesCollection(), PDF::TEMPLATE_INVOICE, $this->context->smarty); $file_attachement['content'] = $pdf->render(false); $file_attachement['name'] = Configuration::get('PS_INVOICE_PREFIX', (int)$order->id_lang, null, $order->id_shop).sprintf('%06d', $order->invoice_number).'.pdf'; $file_attachement['mime'] = 'application/pdf'; if (file_exists(_PS_ROOT_DIR_.'/docs/CGV_'.$iso.'.pdf')) { $CGVcms = new CMS((int)(Configuration::get('PS_CONDITIONS_CMS_ID')), (int)$id_lang); $message->attach(new Swift_Message_Attachment(new Swift_File(_PS_ROOT_DIR_.'/docs/CGV_'.$iso.'.pdf'), $CGVcms->meta_title.'.pdf', 'application/pdf')); $cgv_attachement['name'] = $CGVcms->meta_title.'.pdf' $cgv_attachement['mime'] = 'application/pdf'; $CGVFile = new Swift_File(_PS_ROOT_DIR_.'/docs/CGV_'.$iso.'.pdf'); $CGVString = $CGVFile->readFull(); $cgv_attachement['content'] = $CGVString; } $file_attachements = array($file_attachement, $cgv_attachement); } else { //$file_attachement = null; if (file_exists(_PS_ROOT_DIR_.'/docs/CGV_'.$iso.'.pdf')) { $CGVcms = new CMS((int)(Configuration::get('PS_CONDITIONS_CMS_ID')), (int)$id_lang); $message->attach(new Swift_Message_Attachment(new Swift_File(_PS_ROOT_DIR_.'/docs/CGV_'.$iso.'.pdf'), $CGVcms->meta_title.'.pdf', 'application/pdf')); $cgv_attachement['name'] = $CGVcms->meta_title.'.pdf' $cgv_attachement['mime'] = 'application/pdf'; $CGVFile = new Swift_File(_PS_ROOT_DIR_.'/docs/CGV_'.$iso.'.pdf'); $CGVString = $CGVFile->readFull(); $cgv_attachement['content'] = $CGVString; } $file_attachements = $cgv_attachement; } if (Validate::isEmail($this->context->customer->email)) { Mail::Send( (int)$order->id_lang, 'order_conf', Mail::l('Order confirmation', (int)$order->id_lang), $data, $this->context->customer->email, $this->context->customer->firstname.' '.$this->context->customer->lastname, null, null, $file_attachements, null, _PS_MAIL_DIR_, false, (int)$order->id_shop ); } Il suffit juste de comparer avec la classe native pour identifier les changements. Il suffit également de répéter cette méthode pour joindre le formulaire de rétractation. (je n'ai pas encore mis en place). Bien entendu cela peut être amélioré, mais cette solution marche très bien sur ma plateforme de qualif. Je vous conseille fortement de ne pas effectuer ces modifs directement en prod mais de la tester avant sur votre environnement de dev/qualif et de penser à bien backuper vos données de prod avant de transférer vos modifs, mais cela va sans dire. Prestashop'ment, Nico Chez moi ca fonctionne pas, rien ne change. Link to comment Share on other sites More sharing options...
nicocolt Posted July 1, 2014 Share Posted July 1, 2014 Hello, As-tu bien pensé à supprimer le fichier class_index.php du repertoire cache ? Prestashop'ment, Nico Link to comment Share on other sites More sharing options...
nadgeda Posted July 1, 2014 Share Posted July 1, 2014 en le suppirmant j'ai une erreur: Parse error: syntax error, unexpected '$cgv_attachement' (T_VARIABLE) in /srv/data/web/vhosts/www./htdocs/catalog/override/classes/PaymentModule.php on line 792 Link to comment Share on other sites More sharing options...
nicocolt Posted July 1, 2014 Share Posted July 1, 2014 Parfait alors C'est que de une ton override est bien pris en compte, et de deux ben tu as une erreur identifiée. Quelle est le contenu de la ligne 792 ainsi que la dizaine de ligne qui précède ? Prestashop'ment, Nico Link to comment Share on other sites More sharing options...
nadgeda Posted July 1, 2014 Share Posted July 1, 2014 (edited) if ((int)Configuration::get('PS_INVOICE') && $order_status->invoice && $order->invoice_number) { $pdf = new PDF($order->getInvoicesCollection(), PDF::TEMPLATE_INVOICE, $this->context->smarty); $file_attachement['content'] = $pdf->render(false); $file_attachement['name'] = Configuration::get('PS_INVOICE_PREFIX', (int)$order->id_lang, null, $order->id_shop).sprintf('%06d', $order->invoice_number).'.pdf'; $file_attachement['mime'] = 'application/pdf'; if (file_exists(_PS_ROOT_DIR_.'/docs/CGV_'.$iso.'.pdf')) { $CGVcms = new CMS((int)(Configuration::get('PS_CONDITIONS_CMS_ID')), (int)$id_lang); $message->attach(new Swift_Message_Attachment(new Swift_File(_PS_ROOT_DIR_.'/docs/CGV_'.$iso.'.pdf'), $CGVcms->meta_title.'.pdf', 'application/pdf')); $cgv_attachement['name'] = $CGVcms->meta_title.'.pdf' 792 $cgv_attachement['mime'] = 'application/pdf'; $CGVFile = new Swift_File(_PS_ROOT_DIR_.'/docs/CGV_'.$iso.'.pdf'); $CGVString = $CGVFile->readFull(); $cgv_attachement['content'] = $CGVString; } Edited July 1, 2014 by nadgeda (see edit history) Link to comment Share on other sites More sharing options...
nicocolt Posted July 1, 2014 Share Posted July 1, 2014 Je ne vois pas la ligne en gras Link to comment Share on other sites More sharing options...
nadgeda Posted July 1, 2014 Share Posted July 1, 2014 le gras passe pas j'ai ecris 792 a la place Link to comment Share on other sites More sharing options...
nicocolt Posted July 1, 2014 Share Posted July 1, 2014 t'as oublié le ; (point virgule) à la ligne 791 Link to comment Share on other sites More sharing options...
nadgeda Posted July 1, 2014 Share Posted July 1, 2014 Merci J'avais copié de ton code lol, bon va tester ^^ Link to comment Share on other sites More sharing options...
nicocolt Posted July 1, 2014 Share Posted July 1, 2014 Oui en effet, j'ai mal copié, car dans mon code sur ma plateforme il y a le point virgule Link to comment Share on other sites More sharing options...
nadgeda Posted July 1, 2014 Share Posted July 1, 2014 J'ai remis 2 ; puis : Parse error: syntax error, unexpected 'else' (T_ELSE) in /srv/data/web/vhosts/www./htdocs/catalog/override/classes/PaymentModule.php on line 855 // if the available quantities depends on the physical stock if (StockAvailable::dependsOnStock($product['product_id'])) { // synchronizes StockAvailable::synchronize($product['product_id'], $order->id_shop); } } } } else { $error = Tools::displayError('Order creation failed'); PrestaShopLogger::addLog($error, 4, '0000002', 'Cart', intval($order->id_cart)); die($error); } } // End foreach $order_detail_list // Use the last order as currentOrder $this->currentOrder = (int)$order->id; return true; } 855=> else { $error = Tools::displayError('Cart cannot be loaded or an order has already been placed using this cart'); PrestaShopLogger::addLog($error, 4, '0000001', 'Cart', intval($this->context->cart->id)); die($error); } } Link to comment Share on other sites More sharing options...
nicocolt Posted July 1, 2014 Share Posted July 1, 2014 Bé qu'est-ce que j'ai foutu ? faut que je regarde plus en détail car c'est bizarre Link to comment Share on other sites More sharing options...
nicocolt Posted July 1, 2014 Share Posted July 1, 2014 Curieux car dans le code que j'ai copié il ne me semble pas y avoir d'erreur dans les structures de contrôles. Tu es certain de ne pas avoir enlevé une accolade de trop sans faire exprès ? Link to comment Share on other sites More sharing options...
nadgeda Posted July 1, 2014 Share Posted July 1, 2014 on doit etre 2 a vouloir faire fonctionner ca lol. Oui j'ai copié/collé, j'ai un niveau bas en php mais bon ca je pense que je maitrise quand meme, je reverifie en meme temps Link to comment Share on other sites More sharing options...
nadgeda Posted July 1, 2014 Share Posted July 1, 2014 J'ai trouvé, il manquait une } a la fin, par contre toujorus pas de CGV dans la commande Link to comment Share on other sites More sharing options...
nicocolt Posted July 1, 2014 Share Posted July 1, 2014 Pourtant chez moi ça fonctionne, bizarre Link to comment Share on other sites More sharing options...
nicocolt Posted July 1, 2014 Share Posted July 1, 2014 (edited) Essaye avec ce code: if ((int)Configuration::get('PS_INVOICE') && $order_status->invoice && $order->invoice_number) { $pdf = new PDF($order->getInvoicesCollection(), PDF::TEMPLATE_INVOICE, $this->context->smarty); $file_attachement['content'] = $pdf->render(false); //$file_attachement['name'] = Configuration::get('PS_INVOICE_PREFIX', (int)$order->id_lang, null, $order->id_shop).sprintf('%06d', $order->invoice_number).'.pdf'; $file_attachement['name'] = 'if.pdf'; $file_attachement['mime'] = 'application/pdf'; //$CGVcms = new CMS((int)(Configuration::get('PS_CONDITIONS_CMS_ID')), (int)$id_lang); $CGVFile = new Swift_File(_PS_ROOT_DIR_.'/docs/CGV_fr.pdf'); $CGVString = $CGVFile->readFull(); //new Swift_Message_Attachment(new Swift_File(_PS_ROOT_DIR_.'/docs/CGV_fr.pdf'), 'CGV_fr.pdf', 'application/pdf')); $retract_attachement['content'] = $CGVString; $retract_attachement['name'] = 'Retractation_if_PaymentModule.pdf'; $retract_attachement['mime'] = 'application/pdf'; $file_attachements = array($file_attachement, $retract_attachement); //$file_attachements = $retract_attachement; } else { //$file_attachement = null; //$CGVcms = new CMS((int)(Configuration::get('PS_CONDITIONS_CMS_ID')), (int)$id_lang); $CGVFile = new Swift_File(_PS_ROOT_DIR_.'/docs/CGV_fr.pdf'); $CGVString = $CGVFile->readFull(); //new Swift_Message_Attachment(new Swift_File(_PS_ROOT_DIR_.'/docs/CGV_fr.pdf'), 'CGV_fr.pdf', 'application/pdf')); $retract_attachement['content'] = $CGVString; $retract_attachement['name'] = 'Retractation_else_PaymentModule.pdf'; $retract_attachement['mime'] = 'application/pdf'; $file_attachements = $retract_attachement; } if (Validate::isEmail($this->context->customer->email)) { Mail::Send( (int)$order->id_lang, 'order_conf', Mail::l('Order confirmation', (int)$order->id_lang), $data, $this->context->customer->email, $this->context->customer->firstname.' '.$this->context->customer->lastname, null, null, $file_attachements, null, _PS_MAIL_DIR_, false, (int)$order->id_shop ); } C'est le code que j'utilise sur ma plateforme de qualif, il est encore en développement mais il fonctionne. Ne prête pas attention au contenu envoyé, il ne correspond pas aux variables. Par ailleurs, le fichier des cgv existe bien dans le rep docs ? Edited July 1, 2014 by nicocolt (see edit history) Link to comment Share on other sites More sharing options...
nadgeda Posted July 1, 2014 Share Posted July 1, 2014 le fichier des cgv, je l'avais crée en l'appelant CGV_fr, c'est ca ? Link to comment Share on other sites More sharing options...
nadgeda Posted July 1, 2014 Share Posted July 1, 2014 t'a deuxieme solution me met en piece jointe un pdf Retractation_else_PaymentModule.pdf vide et rien d autre Link to comment Share on other sites More sharing options...
nicocolt Posted July 1, 2014 Share Posted July 1, 2014 Ben oui normal si le fichier existe pas. Tu le créés et tu mets ce que tu veux dedans. A toi d'adapter ensuite. Link to comment Share on other sites More sharing options...
nadgeda Posted July 1, 2014 Share Posted July 1, 2014 Ok, je vais voir ca, merci. Bizarre que rien ne se passe avec la 1ere methode Link to comment Share on other sites More sharing options...
nadgeda Posted July 2, 2014 Share Posted July 2, 2014 Je pense qu'il faudrait faire autrement pour rendre le tout automatique. Je me suis fais un plan: -création dans class/pdf HTLMTemplateCGV.php comme ca on aura "TEMPLATE_CGV" - dans pdf/ creer le .tpl Idem pour le formulaire de retractation Link to comment Share on other sites More sharing options...
nicocolt Posted July 2, 2014 Share Posted July 2, 2014 Hello, Je vois pas ce que tu veux faire. C'est déjà automatisé. Prestashop'ment, Nico Link to comment Share on other sites More sharing options...
nadgeda Posted July 2, 2014 Share Posted July 2, 2014 Ton 2e code si je mets pas de cgv_fr dans docs lors de la validation a la derniere etape je crois ca me met un message d'erreur. Si je le mets les cgv_fr.pdf le pdf est joint ou (dans quel mail ) ? Car moi j'ai rien Quand j'apelle automatique pour moi ca veut dire que lors d'une commande validée ( donc payée ), joint avec le mail de confirmation, la facture et les cgv qui vont etre prise automatiquement dans la bdd vu que la page cms existe et mis en pdf. Ca evite d update manuellement le pdf ( si t'as plusieurs boutique ca va vite etre chiant d'y penser ) Link to comment Share on other sites More sharing options...
nicocolt Posted July 2, 2014 Share Posted July 2, 2014 if (Validate::isEmail($this->context->customer->email)) { Mail::Send( (int)$order->id_lang, 'order_conf', Mail::l('Order confirmation', (int)$order->id_lang), $data, $this->context->customer->email, $this->context->customer->firstname.' '.$this->context->customer->lastname, null, null, $file_attachements, null, _PS_MAIL_DIR_, false, (int)$order->id_shop ); } Tu as vu que dans cette méthode ce n'est plus $file_attachement mais $file_attachements avec un 's' au bout ? Link to comment Share on other sites More sharing options...
nicocolt Posted July 2, 2014 Share Posted July 2, 2014 Et pour le multi boutique OK je comprends. Moi j'ai qu'une boutique, donc le fait de mettre mes CGV en pdf dans le rep doc ne me pose pas de soucis. Maintenant l'idée est bien d'automatiser en fonction de la langue et à priori de dynamiser la génération du pdf, bien que sur ce dernier point je ne suis pas certain que ce soit très performant. Les CGV ne changent pas tous les jours. Générer un pdf des CGV à chaque facturation me semble donc coûteux. Link to comment Share on other sites More sharing options...
nadgeda Posted July 2, 2014 Share Posted July 2, 2014 Lost in space lol Link to comment Share on other sites More sharing options...
nadgeda Posted July 2, 2014 Share Posted July 2, 2014 Et pour le multi boutique OK je comprends. Moi j'ai qu'une boutique, donc le fait de mettre mes CGV en pdf dans le rep doc ne me pose pas de soucis. Maintenant l'idée est bien d'automatiser en fonction de la langue et à priori de dynamiser la génération du pdf, bien que sur ce dernier point je ne suis pas certain que ce soit très performant. Les CGV ne changent pas tous les jours. Générer un pdf des CGV à chaque facturation me semble donc coûteux. CGV a chaque facturation, on est un peu obligé non ? Link to comment Share on other sites More sharing options...
nicocolt Posted July 2, 2014 Share Posted July 2, 2014 de les joindre oui, mais pas de les générer à chaque fois Link to comment Share on other sites More sharing options...
nadgeda Posted July 2, 2014 Share Posted July 2, 2014 j'avais lu trop vite ^^ 1 Link to comment Share on other sites More sharing options...
siriek Posted September 20, 2014 Share Posted September 20, 2014 (edited) Bonjour à tous, Je suis sur la version 1.6.0.9 et j'ai donc modifié le fichier ...monsite/classes/PaymentModule.php avec le script de nicocolt, juste quelques modifs dans les nom de fichiers, voila le code : // Join PDF invoice if ((int)Configuration::get('PS_INVOICE') && $order_status->invoice && $order->invoice_number) { $pdf = new PDF($order->getInvoicesCollection(), PDF::TEMPLATE_INVOICE, $this->context->smarty); $file_attachement['content'] = $pdf->render(false); //$file_attachement['name'] = Configuration::get('PS_INVOICE_PREFIX', (int)$order->id_lang, null, $order->id_shop).sprintf('%06d', $order->invoice_number).'.pdf'; $file_attachement['name'] = 'if.pdf'; $file_attachement['mime'] = 'application/pdf'; //$CGVcms = new CMS((int)(Configuration::get('PS_CONDITIONS_CMS_ID')), (int)$id_lang); $CGVFile = new Swift_File(_PS_ROOT_DIR_.'/docs/bdp-cgv.pdf'); $CGVString = $CGVFile->readFull(); //new Swift_Message_Attachment(new Swift_File(_PS_ROOT_DIR_.'/docs/CGV_fr.pdf'), 'CGV_fr.pdf', 'application/pdf')); $retract_attachement['content'] = $CGVString; $retract_attachement['name'] = 'bdp-bdr.pdf'; $retract_attachement['mime'] = 'application/pdf'; $file_attachements = array($file_attachement, $retract_attachement); //$file_attachements = $retract_attachement; } else { if (self::DEBUG_MODE) PrestaShopLogger::addLog('PaymentModule::validateOrder - Mail is about to be sent', 1, null, 'Cart', (int)$id_cart, true); //$file_attachement = null; //$CGVcms = new CMS((int)(Configuration::get('PS_CONDITIONS_CMS_ID')), (int)$id_lang); $CGVFile = new Swift_File(_PS_ROOT_DIR_.'/docs/bdp-cgv.pdf'); $CGVString = $CGVFile->readFull(); //new Swift_Message_Attachment(new Swift_File(_PS_ROOT_DIR_.'/docs/CGV_fr.pdf'), 'CGV_fr.pdf', 'application/pdf')); $retract_attachement['content'] = $CGVString; $retract_attachement['name'] = 'bdp-bdr.pdf'; $retract_attachement['mime'] = 'application/pdf'; $file_attachements = $retract_attachement; } if (Validate::isEmail($this->context->customer->email)) { Mail::Send( (int)$order->id_lang, 'order_conf', Mail::l('Order confirmation', (int)$order->id_lang), $data, $this->context->customer->email, $this->context->customer->firstname.' '.$this->context->customer->lastname, null, null, $file_attachements, null, _PS_MAIL_DIR_, false, (int)$order->id_shop ); } je me retrouve avec le site en vrac, pages blanches à tous les étages.... J'ai vérifié les accolades, points virgules et autre chose rigolotes mais rien n'y fait. Les fichier pdf sont bien au bon endroit... je sèche... Une idée?? Merci Alain Edited September 20, 2014 by siriek (see edit history) Link to comment Share on other sites More sharing options...
siriek Posted September 27, 2014 Share Posted September 27, 2014 Voila le message d'erreur en mode debug : Parse error: syntax error, unexpected 'else' (T_ELSE) in /home/monsite/www/rep/classes/PaymentModule.php on line 820 A priori je ne vois pas de problème de ponctuation... Un avis? merci Link to comment Share on other sites More sharing options...
nicocolt Posted September 27, 2014 Share Posted September 27, 2014 Hello A mon avis il te manque une accolade quelque part Nico Link to comment Share on other sites More sharing options...
siriek Posted September 28, 2014 Share Posted September 28, 2014 Hello Nico, Je viens de passer la matinée à chercher cette accolade, mais là je sèche, à tout hasard je laisse une partie du code jusqu'à la ligne 822, si tu vois un truc pas claire, d'avance merci, je continue à chercher... <?php /* * 2007-2014 PrestaShop * * NOTICE OF LICENSE * * This source file is subject to the Open Software License (OSL 3.0) * that is bundled with this package in the file LICENSE.txt. * It is also available through the world-wide-web at this URL: * http://opensource.org/licenses/osl-3.0.php * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to [email protected] so we can send you a copy immediately. * * DISCLAIMER * * Do not edit or add to this file if you wish to upgrade PrestaShop to newer * versions in the future. If you wish to customize PrestaShop for your * needs please refer to http://www.prestashop.com for more information. * * @author PrestaShop SA <[email protected]> * @copyright 2007-2014 PrestaShop SA * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) * International Registered Trademark & Property of PrestaShop SA */ abstract class PaymentModuleCore extends Module { /** @var integer Current order's id */ public $currentOrder; public $currencies = true; public $currencies_mode = 'checkbox'; const DEBUG_MODE = false; public function install() { if (!parent::install()) return false; // Insert currencies availability if ($this->currencies_mode == 'checkbox') { if (!$this->addCheckboxCurrencyRestrictionsForModule()) return false; } elseif ($this->currencies_mode == 'radio') { if (!$this->addRadioCurrencyRestrictionsForModule()) return false; } else Tools::displayError('No currency mode for payment module'); // Insert countries availability $return = $this->addCheckboxCountryRestrictionsForModule(); if (!Configuration::get('CONF_'.strtoupper($this->name).'_FIXED')) Configuration::updateValue('CONF_'.strtoupper($this->name).'_FIXED', '0.2'); if (!Configuration::get('CONF_'.strtoupper($this->name).'_VAR')) Configuration::updateValue('CONF_'.strtoupper($this->name).'_VAR', '2'); if (!Configuration::get('CONF_'.strtoupper($this->name).'_FIXED_FOREIGN')) Configuration::updateValue('CONF_'.strtoupper($this->name).'_FIXED_FOREIGN', '0.2'); if (!Configuration::get('CONF_'.strtoupper($this->name).'_VAR_FOREIGN')) Configuration::updateValue('CONF_'.strtoupper($this->name).'_VAR_FOREIGN', '2'); return $return; } public function uninstall() { if (!Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.'module_country` WHERE id_module = '.(int)$this->id) || !Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.'module_currency` WHERE id_module = '.(int)$this->id) || !Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.'module_group` WHERE id_module = '.(int)$this->id)) return false; return parent::uninstall(); } /** * Add checkbox currency restrictions for a new module * @param array $shops * * @return bool */ public function addCheckboxCurrencyRestrictionsForModule(array $shops = array()) { if (!$shops) $shops = Shop::getShops(true, null, true); foreach ($shops as $s) { if (!Db::getInstance()->execute(' INSERT INTO `'._DB_PREFIX_.'module_currency` (`id_module`, `id_shop`, `id_currency`) SELECT '.(int)$this->id.', "'.(int)$s.'", `id_currency` FROM `'._DB_PREFIX_.'currency` WHERE deleted = 0')) return false; } return true; } /** * Add radio currency restrictions for a new module * @param array $shops * * @return bool */ public function addRadioCurrencyRestrictionsForModule(array $shops = array()) { if (!$shops) $shops = Shop::getShops(true, null, true); foreach ($shops as $s) if (!Db::getInstance()->execute('INSERT INTO `'._DB_PREFIX_.'module_currency` (`id_module`, `id_shop`, `id_currency`) VALUES ('.(int)$this->id.', "'.(int)$s.'", -2)')) return false; return true; } /** * Add checkbox country restrictions for a new module * @param array $shops * * @return bool */ public function addCheckboxCountryRestrictionsForModule(array $shops = array()) { $countries = Country::getCountries((int)Context::getContext()->language->id, true); //get only active country $country_ids = array(); foreach ($countries as $country) $country_ids[] = $country['id_country']; return Country::addModuleRestrictions($shops, $countries, array(array('id_module' => (int)$this->id))); } /** * Validate an order in database * Function called from a payment module * * @param integer $id_cart * @param integer $id_order_state * @param float $amount_paid Amount really paid by customer (in the default currency) * @param string $payment_method Payment method (eg. 'Credit card') * @param null $message Message to attach to order * @param array $extra_vars * @param null $currency_special * @param bool $dont_touch_amount * @param bool $secure_key * @param Shop $shop * * @return bool * @throws PrestaShopException */ public function validateOrder($id_cart, $id_order_state, $amount_paid, $payment_method = 'Unknown', $message = null, $extra_vars = array(), $currency_special = null, $dont_touch_amount = false, $secure_key = false, Shop $shop = null) { if (self::DEBUG_MODE) PrestaShopLogger::addLog('PaymentModule::validateOrder - Function called', 1, null, 'Cart', (int)$id_cart, true); $this->context->cart = new Cart($id_cart); $this->context->customer = new Customer($this->context->cart->id_customer); $this->context->language = new Language($this->context->cart->id_lang); $this->context->shop = ($shop ? $shop : new Shop($this->context->cart->id_shop)); ShopUrl::resetMainDomainCache(); $id_currency = $currency_special ? (int)$currency_special : (int)$this->context->cart->id_currency; $this->context->currency = new Currency($id_currency, null, $this->context->shop->id); if (Configuration::get('PS_TAX_ADDRESS_TYPE') == 'id_address_delivery') $context_country = $this->context->country; $order_status = new OrderState((int)$id_order_state, (int)$this->context->language->id); if (!Validate::isLoadedObject($order_status)) { PrestaShopLogger::addLog('PaymentModule::validateOrder - Order Status cannot be loaded', 3, null, 'Cart', (int)$id_cart, true); throw new PrestaShopException('Can\'t load Order status'); } if (!$this->active) { PrestaShopLogger::addLog('PaymentModule::validateOrder - Module is not active', 3, null, 'Cart', (int)$id_cart, true); die(Tools::displayError()); } // Does order already exists ? if (Validate::isLoadedObject($this->context->cart) && $this->context->cart->OrderExists() == false) { if ($secure_key !== false && $secure_key != $this->context->cart->secure_key) { PrestaShopLogger::addLog('PaymentModule::validateOrder - Secure key does not match', 3, null, 'Cart', (int)$id_cart, true); die(Tools::displayError()); } // For each package, generate an order $delivery_option_list = $this->context->cart->getDeliveryOptionList(); $package_list = $this->context->cart->getPackageList(); $cart_delivery_option = $this->context->cart->getDeliveryOption(); // If some delivery options are not defined, or not valid, use the first valid option foreach ($delivery_option_list as $id_address => $package) if (!isset($cart_delivery_option[$id_address]) || !array_key_exists($cart_delivery_option[$id_address], $package)) foreach ($package as $key => $val) { $cart_delivery_option[$id_address] = $key; break; } $order_list = array(); $order_detail_list = array(); do $reference = Order::generateReference(); while (Order::getByReference($reference)->count()); $this->currentOrderReference = $reference; $order_creation_failed = false; $cart_total_paid = (float)Tools::ps_round((float)$this->context->cart->getOrderTotal(true, Cart::BOTH), 2); foreach ($cart_delivery_option as $id_address => $key_carriers) foreach ($delivery_option_list[$id_address][$key_carriers]['carrier_list'] as $id_carrier => $data) foreach ($data['package_list'] as $id_package) { // Rewrite the id_warehouse $package_list[$id_address][$id_package]['id_warehouse'] = (int)$this->context->cart->getPackageIdWarehouse($package_list[$id_address][$id_package], (int)$id_carrier); $package_list[$id_address][$id_package]['id_carrier'] = $id_carrier; } // Make sure CarRule caches are empty CartRule::cleanCache(); $cart_rules = $this->context->cart->getCartRules(); foreach ($cart_rules as $cart_rule) { if (($rule = new CartRule((int)$cart_rule['obj']->id)) && Validate::isLoadedObject($rule)) { if ($error = $rule->checkValidity($this->context, true, true)) { $this->context->cart->removeCartRule((int)$rule->id); if (isset($this->context->cookie) && isset($this->context->cookie->id_customer) && $this->context->cookie->id_customer && !empty($rule->code)) { if (Configuration::get('PS_ORDER_PROCESS_TYPE') == 1) Tools::redirect('index.php?controller=order-opc&submitAddDiscount=1&discount_name='.urlencode($rule->code)); Tools::redirect('index.php?controller=order&submitAddDiscount=1&discount_name='.urlencode($rule->code)); } else { $rule_name = isset($rule->name[(int)$this->context->cart->id_lang]) ? $rule->name[(int)$this->context->cart->id_lang] : $rule->code; $error = Tools::displayError(sprintf('CartRule ID %1s (%2s) used in this cart is not valid and has been withdrawn from cart', (int)$rule->id, $rule_name)); PrestaShopLogger::addLog($error, 3, '0000002', 'Cart', (int)$this->context->cart->id); } } } } foreach ($package_list as $id_address => $packageByAddress) foreach ($packageByAddress as $id_package => $package) { $order = new Order(); $order->product_list = $package['product_list']; if (Configuration::get('PS_TAX_ADDRESS_TYPE') == 'id_address_delivery') { $address = new Address($id_address); $this->context->country = new Country($address->id_country, $this->context->cart->id_lang); if (!$this->context->country->active) throw new PrestaShopException('The delivery address country is not active.'); } $carrier = null; if (!$this->context->cart->isVirtualCart() && isset($package['id_carrier'])) { $carrier = new Carrier($package['id_carrier'], $this->context->cart->id_lang); $order->id_carrier = (int)$carrier->id; $id_carrier = (int)$carrier->id; } else { $order->id_carrier = 0; $id_carrier = 0; } $order->id_customer = (int)$this->context->cart->id_customer; $order->id_address_invoice = (int)$this->context->cart->id_address_invoice; $order->id_address_delivery = (int)$id_address; $order->id_currency = $this->context->currency->id; $order->id_lang = (int)$this->context->cart->id_lang; $order->id_cart = (int)$this->context->cart->id; $order->reference = $reference; $order->id_shop = (int)$this->context->shop->id; $order->id_shop_group = (int)$this->context->shop->id_shop_group; $order->secure_key = ($secure_key ? pSQL($secure_key) : pSQL($this->context->customer->secure_key)); $order->payment = $payment_method; if (isset($this->name)) $order->module = $this->name; $order->recyclable = $this->context->cart->recyclable; $order->gift = (int)$this->context->cart->gift; $order->gift_message = $this->context->cart->gift_message; $order->mobile_theme = $this->context->cart->mobile_theme; $order->conversion_rate = $this->context->currency->conversion_rate; $amount_paid = !$dont_touch_amount ? Tools::ps_round((float)$amount_paid, 2) : $amount_paid; $order->total_paid_real = 0; $order->total_products = (float)$this->context->cart->getOrderTotal(false, Cart::ONLY_PRODUCTS, $order->product_list, $id_carrier); $order->total_products_wt = (float)$this->context->cart->getOrderTotal(true, Cart::ONLY_PRODUCTS, $order->product_list, $id_carrier); $order->total_discounts_tax_excl = (float)abs($this->context->cart->getOrderTotal(false, Cart::ONLY_DISCOUNTS, $order->product_list, $id_carrier)); $order->total_discounts_tax_incl = (float)abs($this->context->cart->getOrderTotal(true, Cart::ONLY_DISCOUNTS, $order->product_list, $id_carrier)); $order->total_discounts = $order->total_discounts_tax_incl; $order->total_shipping_tax_excl = (float)$this->context->cart->getPackageShippingCost((int)$id_carrier, false, null, $order->product_list); $order->total_shipping_tax_incl = (float)$this->context->cart->getPackageShippingCost((int)$id_carrier, true, null, $order->product_list); $order->total_shipping = $order->total_shipping_tax_incl; if (!is_null($carrier) && Validate::isLoadedObject($carrier)) $order->carrier_tax_rate = $carrier->getTaxesRate(new Address($this->context->cart->{Configuration::get('PS_TAX_ADDRESS_TYPE')})); $order->total_wrapping_tax_excl = (float)abs($this->context->cart->getOrderTotal(false, Cart::ONLY_WRAPPING, $order->product_list, $id_carrier)); $order->total_wrapping_tax_incl = (float)abs($this->context->cart->getOrderTotal(true, Cart::ONLY_WRAPPING, $order->product_list, $id_carrier)); $order->total_wrapping = $order->total_wrapping_tax_incl; $order->total_paid_tax_excl = (float)Tools::ps_round((float)$this->context->cart->getOrderTotal(false, Cart::BOTH, $order->product_list, $id_carrier), 2); $order->total_paid_tax_incl = (float)Tools::ps_round((float)$this->context->cart->getOrderTotal(true, Cart::BOTH, $order->product_list, $id_carrier), 2); $order->total_paid = $order->total_paid_tax_incl; $order->invoice_date = '0000-00-00 00:00:00'; $order->delivery_date = '0000-00-00 00:00:00'; if (self::DEBUG_MODE) PrestaShopLogger::addLog('PaymentModule::validateOrder - Order is about to be added', 1, null, 'Cart', (int)$id_cart, true); // Creating order $result = $order->add(); if (!$result) { PrestaShopLogger::addLog('PaymentModule::validateOrder - Order cannot be created', 3, null, 'Cart', (int)$id_cart, true); throw new PrestaShopException('Can\'t save Order'); } // Amount paid by customer is not the right one -> Status = payment error // We don't use the following condition to avoid the float precision issues : http://www.php.net/manual/en/language.types.float.php // if ($order->total_paid != $order->total_paid_real) // We use number_format in order to compare two string if ($order_status->logable && number_format($cart_total_paid, 2) != number_format($amount_paid, 2)) $id_order_state = Configuration::get('PS_OS_ERROR'); $order_list[] = $order; if (self::DEBUG_MODE) PrestaShopLogger::addLog('PaymentModule::validateOrder - OrderDetail is about to be added', 1, null, 'Cart', (int)$id_cart, true); // Insert new Order detail list using cart for the current order $order_detail = new OrderDetail(null, null, $this->context); $order_detail->createList($order, $this->context->cart, $id_order_state, $order->product_list, 0, true, $package_list[$id_address][$id_package]['id_warehouse']); $order_detail_list[] = $order_detail; if (self::DEBUG_MODE) PrestaShopLogger::addLog('PaymentModule::validateOrder - OrderCarrier is about to be added', 1, null, 'Cart', (int)$id_cart, true); // Adding an entry in order_carrier table if (!is_null($carrier)) { $order_carrier = new OrderCarrier(); $order_carrier->id_order = (int)$order->id; $order_carrier->id_carrier = (int)$id_carrier; $order_carrier->weight = (float)$order->getTotalWeight(); $order_carrier->shipping_cost_tax_excl = (float)$order->total_shipping_tax_excl; $order_carrier->shipping_cost_tax_incl = (float)$order->total_shipping_tax_incl; $order_carrier->add(); } } // The country can only change if the address used for the calculation is the delivery address, and if multi-shipping is activated if (Configuration::get('PS_TAX_ADDRESS_TYPE') == 'id_address_delivery') $this->context->country = $context_country; if (!$this->context->country->active) { PrestaShopLogger::addLog('PaymentModule::validateOrder - Country is not active', 3, null, 'Cart', (int)$id_cart, true); throw new PrestaShopException('The order address country is not active.'); } if (self::DEBUG_MODE) PrestaShopLogger::addLog('PaymentModule::validateOrder - Payment is about to be added', 1, null, 'Cart', (int)$id_cart, true); // Register Payment only if the order status validate the order if ($order_status->logable) { // $order is the last order loop in the foreach // The method addOrderPayment of the class Order make a create a paymentOrder // linked to the order reference and not to the order id if (isset($extra_vars['transaction_id'])) $transaction_id = $extra_vars['transaction_id']; else $transaction_id = null; if (!$order->addOrderPayment($amount_paid, null, $transaction_id)) { PrestaShopLogger::addLog('PaymentModule::validateOrder - Cannot save Order Payment', 3, null, 'Cart', (int)$id_cart, true); throw new PrestaShopException('Can\'t save Order Payment'); } } // Next ! $only_one_gift = false; $cart_rule_used = array(); $products = $this->context->cart->getProducts(); // Make sure CarRule caches are empty CartRule::cleanCache(); foreach ($order_detail_list as $key => $order_detail) { $order = $order_list[$key]; if (!$order_creation_failed && isset($order->id)) { if (!$secure_key) $message .= '<br />'.Tools::displayError('Warning: the secure key is empty, check your payment account before validation'); // Optional message to attach to this order if (isset($message) & !empty($message)) { $msg = new Message(); $message = strip_tags($message, '<br>'); if (Validate::isCleanHtml($message)) { if (self::DEBUG_MODE) PrestaShopLogger::addLog('PaymentModule::validateOrder - Message is about to be added', 1, null, 'Cart', (int)$id_cart, true); $msg->message = $message; $msg->id_order = intval($order->id); $msg->private = 1; $msg->add(); } } // Insert new Order detail list using cart for the current order //$orderDetail = new OrderDetail(null, null, $this->context); //$orderDetail->createList($order, $this->context->cart, $id_order_state); // Construct order detail table for the email $products_list = ''; $virtual_product = true; $product_var_tpl_list = array(); foreach ($order->product_list as $product) { $price = Product::getPriceStatic((int)$product['id_product'], false, ($product['id_product_attribute'] ? (int)$product['id_product_attribute'] : null), 6, null, false, true, $product['cart_quantity'], false, (int)$order->id_customer, (int)$order->id_cart, (int)$order->{Configuration::get('PS_TAX_ADDRESS_TYPE')}); $price_wt = Product::getPriceStatic((int)$product['id_product'], true, ($product['id_product_attribute'] ? (int)$product['id_product_attribute'] : null), 2, null, false, true, $product['cart_quantity'], false, (int)$order->id_customer, (int)$order->id_cart, (int)$order->{Configuration::get('PS_TAX_ADDRESS_TYPE')}); $product_price = Product::getTaxCalculationMethod() == PS_TAX_EXC ? Tools::ps_round($price, 2) : $price_wt; $product_var_tpl = array( 'reference' => $product['reference'], 'name' => $product['name'].(isset($product['attributes']) ? ' - '.$product['attributes'] : ''), 'unit_price' => Tools::displayPrice($product_price, $this->context->currency, false), 'price' => Tools::displayPrice($product_price * $product['quantity'], $this->context->currency, false), 'quantity' => $product['quantity'], 'customization' => array() ); $customized_datas = Product::getAllCustomizedDatas((int)$order->id_cart); if (isset($customized_datas[$product['id_product']][$product['id_product_attribute']])) { $product_var_tpl['customization'] = array(); foreach ($customized_datas[$product['id_product']][$product['id_product_attribute']][$order->id_address_delivery] as $customization) { $customization_text = ''; if (isset($customization['datas'][Product::CUSTOMIZE_TEXTFIELD])) foreach ($customization['datas'][Product::CUSTOMIZE_TEXTFIELD] as $text) $customization_text .= $text['name'].': '.$text['value'].'<br />'; if (isset($customization['datas'][Product::CUSTOMIZE_FILE])) $customization_text .= sprintf(Tools::displayError('%d image(s)'), count($customization['datas'][Product::CUSTOMIZE_FILE])).'<br />'; $customization_quantity = (int)$product['customization_quantity']; $product_var_tpl['customization'][] = array( 'customization_text' => $customization_text, 'customization_quantity' => $customization_quantity, 'quantity' => Tools::displayPrice($customization_quantity * $product_price, $this->context->currency, false) ); } } $product_var_tpl_list[] = $product_var_tpl; // Check if is not a virutal product for the displaying of shipping if (!$product['is_virtual']) $virtual_product &= false; } // end foreach ($products) $product_list_txt = ''; $product_list_html = ''; if (count($product_var_tpl_list) > 0) { $product_list_txt = $this->getEmailTemplateContent('order_conf_product_list.txt', Mail::TYPE_TEXT, $product_var_tpl_list); $product_list_html = $this->getEmailTemplateContent('order_conf_product_list.tpl', Mail::TYPE_HTML, $product_var_tpl_list); } $cart_rules_list = array(); $total_reduction_value_ti = 0; $total_reduction_value_tex = 0; foreach ($cart_rules as $cart_rule) { $package = array('id_carrier' => $order->id_carrier, 'id_address' => $order->id_address_delivery, 'products' => $order->product_list); $values = array( 'tax_incl' => $cart_rule['obj']->getContextualValue(true, $this->context, CartRule::FILTER_ACTION_ALL_NOCAP, $package), 'tax_excl' => $cart_rule['obj']->getContextualValue(false, $this->context, CartRule::FILTER_ACTION_ALL_NOCAP, $package) ); // If the reduction is not applicable to this order, then continue with the next one if (!$values['tax_excl']) continue; /* IF ** - This is not multi-shipping ** - The value of the voucher is greater than the total of the order ** - Partial use is allowed ** - This is an "amount" reduction, not a reduction in % or a gift ** THEN ** The voucher is cloned with a new value corresponding to the remainder */ if (count($order_list) == 1 && $values['tax_incl'] > ($order->total_products_wt - $total_reduction_value_ti) && $cart_rule['obj']->partial_use == 1 && $cart_rule['obj']->reduction_amount > 0) { // Create a new voucher from the original $voucher = new CartRule($cart_rule['obj']->id); // We need to instantiate the CartRule without lang parameter to allow saving it unset($voucher->id); // Set a new voucher code $voucher->code = empty($voucher->code) ? substr(md5($order->id.'-'.$order->id_customer.'-'.$cart_rule['obj']->id), 0, 16) : $voucher->code.'-2'; if (preg_match('/\-([0-9]{1,2})\-([0-9]{1,2})$/', $voucher->code, $matches) && $matches[1] == $matches[2]) $voucher->code = preg_replace('/'.$matches[0].'$/', '-'.(intval($matches[1]) + 1), $voucher->code); // Set the new voucher value if ($voucher->reduction_tax) { $voucher->reduction_amount = $values['tax_incl'] - ($order->total_products_wt - $total_reduction_value_ti); // Add total shipping amout only if reduction amount > total shipping if ($voucher->free_shipping == 1 && $voucher->reduction_amount >= $order->total_shipping_tax_incl) $voucher->reduction_amount -= $order->total_shipping_tax_incl; } else { $voucher->reduction_amount = $values['tax_excl'] - ($order->total_products - $total_reduction_value_tex); // Add total shipping amout only if reduction amount > total shipping if ($voucher->free_shipping == 1 && $voucher->reduction_amount >= $order->total_shipping_tax_excl) $voucher->reduction_amount -= $order->total_shipping_tax_excl; } $voucher->id_customer = $order->id_customer; $voucher->quantity = 1; $voucher->quantity_per_user = 1; $voucher->free_shipping = 0; if ($voucher->add()) { // If the voucher has conditions, they are now copied to the new voucher CartRule::copyConditions($cart_rule['obj']->id, $voucher->id); $params = array( '{voucher_amount}' => Tools::displayPrice($voucher->reduction_amount, $this->context->currency, false), '{voucher_num}' => $voucher->code, '{firstname}' => $this->context->customer->firstname, '{lastname}' => $this->context->customer->lastname, '{id_order}' => $order->reference, '{order_name}' => $order->getUniqReference() ); Mail::Send( (int)$order->id_lang, 'voucher', sprintf(Mail::l('New voucher for your order %s', (int)$order->id_lang), $order->reference), $params, $this->context->customer->email, $this->context->customer->firstname.' '.$this->context->customer->lastname, null, null, null, null, _PS_MAIL_DIR_, false, (int)$order->id_shop ); } $values['tax_incl'] -= $values['tax_incl'] - $order->total_products_wt; $values['tax_excl'] -= $values['tax_excl'] - $order->total_products; } $total_reduction_value_ti += $values['tax_incl']; $total_reduction_value_tex += $values['tax_excl']; $order->addCartRule($cart_rule['obj']->id, $cart_rule['obj']->name, $values, 0, $cart_rule['obj']->free_shipping); if ($id_order_state != Configuration::get('PS_OS_ERROR') && $id_order_state != Configuration::get('PS_OS_CANCELED') && !in_array($cart_rule['obj']->id, $cart_rule_used)) { $cart_rule_used[] = $cart_rule['obj']->id; // Create a new instance of Cart Rule without id_lang, in order to update its quantity $cart_rule_to_update = new CartRule($cart_rule['obj']->id); $cart_rule_to_update->quantity = max(0, $cart_rule_to_update->quantity - 1); $cart_rule_to_update->update(); } $cart_rules_list[] = array( 'voucher_name' => $cart_rule['obj']->name, 'voucher_reduction' => ($values['tax_incl'] != 0.00 ? '-' : '').Tools::displayPrice($values['tax_incl'], $this->context->currency, false) ); } $cart_rules_list_txt = ''; $cart_rules_list_html = ''; if (count($cart_rules_list) > 0) { $cart_rules_list_txt = $this->getEmailTemplateContent('order_conf_cart_rules.txt', Mail::TYPE_TEXT, $cart_rules_list); $cart_rules_list_html = $this->getEmailTemplateContent('order_conf_cart_rules.tpl', Mail::TYPE_HTML, $cart_rules_list); } // Specify order id for message $old_message = Message::getMessageByCartId((int)$this->context->cart->id); if ($old_message) { $update_message = new Message((int)$old_message['id_message']); $update_message->id_order = (int)$order->id; $update_message->update(); // Add this message in the customer thread $customer_thread = new CustomerThread(); $customer_thread->id_contact = 0; $customer_thread->id_customer = (int)$order->id_customer; $customer_thread->id_shop = (int)$this->context->shop->id; $customer_thread->id_order = (int)$order->id; $customer_thread->id_lang = (int)$this->context->language->id; $customer_thread->email = $this->context->customer->email; $customer_thread->status = 'open'; $customer_thread->token = Tools::passwdGen(12); $customer_thread->add(); $customer_message = new CustomerMessage(); $customer_message->id_customer_thread = $customer_thread->id; $customer_message->id_employee = 0; $customer_message->message = $update_message->message; $customer_message->private = 0; if (!$customer_message->add()) $this->errors[] = Tools::displayError('An error occurred while saving message'); } if (self::DEBUG_MODE) PrestaShopLogger::addLog('PaymentModule::validateOrder - Hook validateOrder is about to be called', 1, null, 'Cart', (int)$id_cart, true); // Hook validate order Hook::exec('actionValidateOrder', array( 'cart' => $this->context->cart, 'order' => $order, 'customer' => $this->context->customer, 'currency' => $this->context->currency, 'orderStatus' => $order_status )); foreach ($this->context->cart->getProducts() as $product) if ($order_status->logable) ProductSale::addProductSale((int)$product['id_product'], (int)$product['cart_quantity']); if (self::DEBUG_MODE) PrestaShopLogger::addLog('PaymentModule::validateOrder - Order Status is about to be added', 1, null, 'Cart', (int)$id_cart, true); // Set the order status $new_history = new OrderHistory(); $new_history->id_order = (int)$order->id; $new_history->changeIdOrderState((int)$id_order_state, $order, true); $new_history->addWithemail(true, $extra_vars); // Switch to back order if needed if (Configuration::get('PS_STOCK_MANAGEMENT') && $order_detail->getStockState()) { $history = new OrderHistory(); $history->id_order = (int)$order->id; $history->changeIdOrderState(Configuration::get('PS_OS_OUTOFSTOCK'), $order, true); $history->addWithemail(); } unset($order_detail); // Order is reloaded because the status just changed $order = new Order($order->id); // Send an e-mail to customer (one order = one email) if ($id_order_state != Configuration::get('PS_OS_ERROR') && $id_order_state != Configuration::get('PS_OS_CANCELED') && $this->context->customer->id) { $invoice = new Address($order->id_address_invoice); $delivery = new Address($order->id_address_delivery); $delivery_state = $delivery->id_state ? new State($delivery->id_state) : false; $invoice_state = $invoice->id_state ? new State($invoice->id_state) : false; $data = array( '{firstname}' => $this->context->customer->firstname, '{lastname}' => $this->context->customer->lastname, '{email}' => $this->context->customer->email, '{delivery_block_txt}' => $this->_getFormatedAddress($delivery, "\n"), '{invoice_block_txt}' => $this->_getFormatedAddress($invoice, "\n"), '{delivery_block_html}' => $this->_getFormatedAddress($delivery, '<br />', array( 'firstname' => '<span style="font-weight:bold;">%s</span>', 'lastname' => '<span style="font-weight:bold;">%s</span>' )), '{invoice_block_html}' => $this->_getFormatedAddress($invoice, '<br />', array( 'firstname' => '<span style="font-weight:bold;">%s</span>', 'lastname' => '<span style="font-weight:bold;">%s</span>' )), '{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->phone : $delivery->phone_mobile, '{delivery_other}' => $delivery->other, '{invoice_company}' => $invoice->company, '{invoice_vat_number}' => $invoice->vat_number, '{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->phone : $invoice->phone_mobile, '{invoice_other}' => $invoice->other, '{order_name}' => $order->getUniqReference(), '{date}' => Tools::displayDate(date('Y-m-d H:i:s'), null, 1), '{carrier}' => ($virtual_product || !isset($carrier->name)) ? Tools::displayError('No carrier') : $carrier->name, '{payment}' => Tools::substr($order->payment, 0, 32), '{products}' => $product_list_html, '{products_txt}' => $product_list_txt, '{discounts}' => $cart_rules_list_html, '{discounts_txt}' => $cart_rules_list_txt, '{total_paid}' => Tools::displayPrice($order->total_paid, $this->context->currency, false), '{total_products}' => Tools::displayPrice($order->total_paid - $order->total_shipping - $order->total_wrapping + $order->total_discounts, $this->context->currency, false), '{total_discounts}' => Tools::displayPrice($order->total_discounts, $this->context->currency, false), '{total_shipping}' => Tools::displayPrice($order->total_shipping, $this->context->currency, false), '{total_wrapping}' => Tools::displayPrice($order->total_wrapping, $this->context->currency, false), '{total_tax_paid}' => Tools::displayPrice(($order->total_products_wt - $order->total_products) + ($order->total_shipping_tax_incl - $order->total_shipping_tax_excl), $this->context->currency, false)); if (is_array($extra_vars)) $data = array_merge($data, $extra_vars); // Join PDF invoice if ((int)Configuration::get('PS_INVOICE') && $order_status->invoice && $order->invoice_number) { $pdf = new PDF($order->getInvoicesCollection(), PDF::TEMPLATE_INVOICE, $this->context->smarty); $file_attachement['content'] = $pdf->render(false); //$file_attachement['name'] = Configuration::get('PS_INVOICE_PREFIX', (int)$order->id_lang, null, $order->id_shop).sprintf('%06d', $order->invoice_number).'.pdf'; $file_attachement['name'] = 'if.pdf'; $file_attachement['mime'] = 'application/pdf'; //$CGVcms = new CMS((int)(Configuration::get('PS_CONDITIONS_CMS_ID')), (int)$id_lang); $CGVFile = new Swift_File(_PS_ROOT_DIR_.'/docs/bdp-cgv.pdf'); $CGVString = $CGVFile->readFull(); //new Swift_Message_Attachment(new Swift_File(_PS_ROOT_DIR_.'/docs/CGV_fr.pdf'), 'CGV_fr.pdf', 'application/pdf')); $retract_attachement['content'] = $CGVString; $retract_attachement['name'] = 'bdp-bdr.pdf'; $retract_attachement['mime'] = 'application/pdf'; $file_attachements = array($file_attachement, $retract_attachement); //$file_attachements = $retract_attachement; } else { //$file_attachement = null; //$CGVcms = new CMS((int)(Configuration::get('PS_CONDITIONS_CMS_ID')), (int)$id_lang); $CGVFile = new Swift_File(_PS_ROOT_DIR_.'/docs/bdp-cgv.pdf'); $CGVString = $CGVFile->readFull(); //new Swift_Message_Attachment(new Swift_File(_PS_ROOT_DIR_.'/docs/CGV_fr.pdf'), 'CGV_fr.pdf', 'application/pdf')); $retract_attachement['content'] = $CGVString; $retract_attachement['name'] = 'bdp-bdr.pdf'; $retract_attachement['mime'] = 'application/pdf'; $file_attachements = $retract_attachement; } if (Validate::isEmail($this->context->customer->email)) { Mail::Send( (int)$order->id_lang, 'order_conf', Mail::l('Order confirmation', (int)$order->id_lang), $data, $this->context->customer->email, $this->context->customer->firstname.' '.$this->context->customer->lastname, null, null, $file_attachements, null, _PS_MAIL_DIR_, false, (int)$order->id_shop ); } // updates stock in shops if (Configuration::get('PS_ADVANCED_STOCK_MANAGEMENT')) { $product_list = $order->getProducts(); foreach ($product_list as $product) { // if the available quantities depends on the physical stock if (StockAvailable::dependsOnStock($product['product_id'])) { // synchronizes StockAvailable::synchronize($product['product_id'], $order->id_shop); } } } } else { $error = Tools::displayError('Order creation failed'); PrestaShopLogger::addLog($error, 4, '0000002', 'Cart', intval($order->id_cart)); die($error); } } // End foreach $order_detail_list // Use the last order as currentOrder $this->currentOrder = (int)$order->id; if (self::DEBUG_MODE) PrestaShopLogger::addLog('PaymentModule::validateOrder - End of validateOrder', 1, null, 'Cart', (int)$id_cart, true); return true; // CECI EST LA LIGNE 820 } else { Encore merci Alain Link to comment Share on other sites More sharing options...
nicocolt Posted October 10, 2014 Share Posted October 10, 2014 Hello, Rien vu d'anormal comme ça rapidement. Tu as résolu ton problème depuis ? Prestashop'ment, Nico Link to comment Share on other sites More sharing options...
siriek Posted October 10, 2014 Share Posted October 10, 2014 Hello, non je n'ai pas trouvé encore l'erreur, j'ai replacé le fichier d’origine, je vais installer une version en local pour essayer de trouver l'erreur de syntaxe... Je vous tiens au courant... De votre côté si vous avez une piste, you're welcome... Encore merci Alain Link to comment Share on other sites More sharing options...
nicocolt Posted October 10, 2014 Share Posted October 10, 2014 Je n'ai pas trop le temps pour travailler dessus en ce moment, mais j'ai bon espoir que cela puisse changer Prestashop'ment, Nico Link to comment Share on other sites More sharing options...
gillesdeperetti Posted February 18, 2015 Share Posted February 18, 2015 Bonjour à tous ! J'ai essayé la solution du post n°124 seulement je n'ai pas de dossier "docs", j'ai essayé en mettant les cgv dans le dossier "HTDOCS" mais ca n'a pas marché. Auriez vous trouvé une solution fiable ? Je suis sur la version 1.6.0.11 et j'ai remarqué dans le fichier mail.php qu'il y avait cela : // Multiple attachments? if (!is_array(current($file_attachment))) $file_attachment = array($file_attachment); foreach ($file_attachment as $attachment) if (isset($attachment['content']) && isset($attachment['name']) && isset($attachment['mime'])) $message->attach(new Swift_Message_Attachment($attachment['content'], $attachment['name'], $attachment['mime'])); } /* Send mail */ $send = $swift->send($message, $to_list, new Swift_Address($from, $from_name)); $swift->disconnect(); ShopUrl::resetMainDomainCache(); Est ce que si je remplace le code ci-dessus par : // Multiple attachments? if (!is_array(current($CGV_fr))) $file_attachment = array($file_attachment); foreach ($CGV_fr as $attachment) if (isset($attachment['content']) && isset($attachment['CGV_fr']) && isset($attachment['mime'])) $message->attach(new Swift_Message_Attachment($attachment['content'], $attachment['CGV'], $attachment['mime'])); } /* Send mail */ $send = $swift->send($message, $to_list, new Swift_Address($from, $from_name)); $swift->disconnect(); ShopUrl::resetMainDomainCache(); Pensez vous que cela pourrait fonctionner ? Je ne comprend rien en "code" donc j'ai pas tenté mais je me dis que c'est peut être ca ! Merci d'avance Link to comment Share on other sites More sharing options...
tofbayonne Posted December 4, 2015 Share Posted December 4, 2015 Merci nico ton code marche a la perfection Link to comment Share on other sites More sharing options...
nicocolt Posted December 6, 2015 Share Posted December 6, 2015 (edited) Hello, Ravi que ça serve Edited December 6, 2015 by nicocolt (see edit history) Link to comment Share on other sites More sharing options...
karopresta Posted November 7, 2016 Share Posted November 7, 2016 Bonjour En plus de ce que j'ai dit un peux plus haut, depuis ce WE les CGV sont au dos de mes factures. Comme sa on pourra rien me dire. enfin je crois. (CGV présent sur le site et téléchargeable en pdf, dans le mail suivi de commande mail en pdf, et au dos des factures) PS : faire rentrée 8 pages dans une à était compliquer, obliger d'écrire en taille 4,5 Bonjour, Illégal ! Un document présentant des informations pouvant être utilisées devant un tribunal doivent avoir une police minimum de 6. Link to comment Share on other sites More sharing options...
pascalili Posted March 5, 2017 Share Posted March 5, 2017 (edited) Bonjour, j'ai essayé de mettre le code proposé par nicocolt dans ma version de prestashop 1.6.1.11 mais ça ne fonctionne pas. J'ai adapté un peu le code mais ça ne passe pas. Voici l'erreur que j'ai Fatal error: Class 'Swift_File' not found in /homepages/33/d644326605/htdocs/ps16/classes/PaymentModule.php on line 793 Il doit manquer quelque chose... Quelqu'un pourrait m'aider ? Edited March 5, 2017 by pascalili (see edit history) Link to comment Share on other sites More sharing options...
mylesk42 Posted September 12, 2017 Share Posted September 12, 2017 Bonjour, Je reviens sur ce sujet d'intégration du code fourni par Nicocolt dans Ps 16116. Je pense avoir tout essayé mais rien n'y fait, je n'ai pas d'erreur de code mais le ficher des CGV ne se retrouve jamais attaché à l'email de commande après paiement. Seul la facture s'y trouve. J'ai conservé le code de la PS16116 dans cette partie en l'adaptant mais çà ne veut pas le faire. @Nicocolt : as-tu essayé d'intégrer/adapter ce code pour PS16116 ? Ou quelqu'un a t-il réussi ? Merci Link to comment Share on other sites More sharing options...
nicocolt Posted September 12, 2017 Share Posted September 12, 2017 (edited) Bonjour, Je ne travaille plus avec Prestashop depuis un moment maintenant, désolé. N'existe t-il pas des modules gratuits et compatibles avec cette version de Presta maintenant ? Ce serait plus simple je pense. Edited September 12, 2017 by nicocolt (see edit history) Link to comment Share on other sites More sharing options...
mylesk42 Posted September 12, 2017 Share Posted September 12, 2017 Certainement, mais je ne me suis pas penché sur la question. Cà devrait être possible d'adapter le code logiquement mais pour le moment je n'arrive pas à le faire fonctionner. Cdlt Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now