Jump to content

Envoi CGV avec mail confirmation de commande


bebeachat

Recommended Posts

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

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

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 by Superbegood (see edit history)
Link to comment
Share on other sites

@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

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

cgv.png

 

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

  • 1 month later...

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

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

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

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 :blink:

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

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;

 

119819iframe.jpg

 

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 by Nutrinat (see edit history)
Link to comment
Share on other sites

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

  • 1 month later...

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

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 !

  • Like 1
Link to comment
Share on other sites

  • 3 weeks later...

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 by zetcompagnie (see edit history)
Link to comment
Share on other sites

  • 10 months later...

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

  • 4 months later...

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

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 by pecheurdunet (see edit history)
Link to comment
Share on other sites

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

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

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

  • Like 1
Link to comment
Share on other sites

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

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 by nicocolt (see edit history)
  • Like 1
Link to comment
Share on other sites

  • 2 weeks later...

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

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 by nadgeda (see edit history)
Link to comment
Share on other sites

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.

  • Like 1
Link to comment
Share on other sites

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

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

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


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 by nadgeda (see edit history)
Link to comment
Share on other sites

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

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 by nicocolt (see edit history)
Link to comment
Share on other sites

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

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

 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

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

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

  • 2 months later...

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 by siriek (see edit history)
Link to comment
Share on other sites

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

  • 2 weeks later...

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

  • 4 months later...

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

  • 9 months later...
  • 11 months later...

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

  • 3 months later...

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 by pascalili (see edit history)
Link to comment
Share on other sites

  • 6 months later...

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

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