[PrestaShop] Rechnungs-PDF in Bestell-E-Mail

Hallo zusammen,

heute gab es mal wieder ein problem zu lösen das evtl. auch andere interessieren könnte. Zumindest jeden der einen PrestaShop im einsatz hat.

Das problem: Wenn ein kunde etwas im shop bestellt dann erhält er natürlich eine bestellbestätigung per email. Nur wird hier die rechnung nicht mitgeschickt.

Die lösung: Recht einfach, nur nicht einfach zu finden. :-)

Schritt 1) In den administrationsbereich des shops gehen und hier auf “orders” -> “statuses” klicken (sorry, ist bei mir die englische version). Dann in der tabelle bei “invoice” alles anklicken außer “Chanceled” und “Payment error”. – Das müssen wir machen da sonst die rechnung nicht direkt bei der bestellung generiert wird.

Schritt 2) Jetzt müssen wir ein bisschen in den quellcode. Suche die datei “/classes/paymentmodule.php” und suchen sie die folgende passage (ungefähr bei zeile 350):

// Join PDF invoice
if (intval(Configuration::get('PS_INVOICE')) AND Validate::isLoadedObject($orderStatus) AND $orderStatus->invoice AND $order->invoice_number)
{
	$fileAttachment['content'] = PDF::invoice($order, 'S');
	$fileAttachment['name'] = Configuration::get('PS_INVOICE_PREFIX', intval($order->id_lang)).sprintf('%06d', $order->invoice_number).'.pdf';
	$fileAttachment['mime'] = 'application/pdf';
}
else
	$fileAttachment = NULL;

und mache daraus:

// Join PDF invoice
//if (intval(Configuration::get('PS_INVOICE')) AND Validate::isLoadedObject($orderStatus) AND $orderStatus->invoice AND $order->invoice_number)
//{
	$fileAttachment['content'] = PDF::invoice($order, 'S');
	$fileAttachment['name'] = Configuration::get('PS_INVOICE_PREFIX', intval($order->id_lang)).sprintf('%06d', $order->invoice_number).'.pdf';
	$fileAttachment['mime'] = 'application/pdf';
//}
//else
//	$fileAttachment = NULL;

Jetzt wird immer eine Rechnung an die mail angehängt. Es gibt aber noch einen kleinen schönheitsfehler. Den bügeln wir so aus… ca. zeile 300 suchen… sieht in etwa so aus.

...
	// Send an e-mail to customer
	if ($id_order_state != _PS_OS_ERROR_ AND $id_order_state != _PS_OS_CANCELED_ AND $customer->id)
	{
		$invoice = new Address(intval($order->id_address_invoice));
		$delivery = new Address(intval($order->id_address_delivery));
		$carrier = new Carrier(intval($order->id_carrier));
		$delivery_state = $delivery->id_state ? new State(intval($delivery->id_state)) : false;
		$invoice_state = $invoice->id_state ? new State(intval($invoice->id_state)) : false;
...

und hängen da einfach die folgende (letzte) zeile dran

...
	// Send an e-mail to customer
	if ($id_order_state != _PS_OS_ERROR_ AND $id_order_state != _PS_OS_CANCELED_ AND $customer->id)
	{
		$invoice = new Address(intval($order->id_address_invoice));
		$delivery = new Address(intval($order->id_address_delivery));
		$carrier = new Carrier(intval($order->id_carrier));
		$delivery_state = $delivery->id_state ? new State(intval($delivery->id_state)) : false;
		$invoice_state = $invoice->id_state ? new State(intval($invoice->id_state)) : false;
		$order = new Order(intval($order->id));
...

Damit sollte es funktionieren und schön aussehen :-)

Wer nun, wie ich, noch änderungen an der rechnung selbst vornehmen möchte der muss leider auch in den code. Die datei ist “/classes/PDF.php”. Aber bitte nur für änderungen die sonst nicht vorgenommen werden können. Adresse und footer und so kann alles im admin eingestellt werden ;)

Soweit erst einmal dazu. Bei fragen, bitte gleich fragen… bevor ich wieder vergessen hab wie das war :-)

Achso… prestashop 1.3.0.10

10 Kommentare
  1. Holle sagte:

    Moinsen Gordon, fast genau das suche ich schon seit Monaten….. mit dem kleinen Unterschied, daß ich die Rechnung erst bei “Zahlung akzeptiert” (schätze mal payment accepted in der englischen Version) an die entsprechende Mail hängen möchte. Inwiefern müßte ich deine Änderungen ändern?

    lieb

    H

    Antworten
  2. Gordon sagte:

    Hallo Holle,

    das ist nicht so einfach. Diese Änderung hier schickt die mails gleich bei der Bestellung raus. Was Du probieren könntest ist im Admin unter order->status nur Paypal Accepted auf Invoice setzen. Also nicht nur das, aber das abwählen was die Rechnung gleich mitschicken würde (ich kann gerade nicht checken was dieses ist). So das erst eine Rechnung augestellt wird wenn Paypal auf akzeptiert steht.
    Dann darfst du die obigen Änderungen aber nicht machen weil sonst ein Fehler bei der Bestellung kommt (da die Rechnung ja noch nicht existiert). Also quasi keine Änderungen im Quellcode und nur bei order->status paypal akzeptiert auf invoice setzen. Vielleicht geht es, probiere mal aus.

    Antworten
  3. Holle sagte:

    Hallo Gordon, danke für deine Hilfe. Im Grunde mache ich es genau so. Allerdings für Überweisung und nicht für Paypal. Ist ein bekannter Bug, den aber so wirklich (jedenfalls für meinen Fall) noch niemand gelöst hat. Das liebe System weigert sich heroisch die Rechnung anzuhängen ;-) …. naja, gibt schlimmeres.

    lieb

    H.

    Antworten
  4. Gordon sagte:

    Hi Holle,

    hmm… wenn es ein bekannter bug ist dann hat vielleicht schon jemand die lösung gefunden ;) Aber wenn du es genau so machst und es bei überweisungen funktioniert… dann sollte der bug im paypal modul sein. Würde ich jetzt mal spontan schätzen.
    Vielleicht beim überweisungs modul mal vergleichen/schnüffeln gehen ;)

    Antworten
  5. moteno sagte:

    Hallo Gordon,

    hab genau Deine Anweisungen befolgt aber leider tut sich gar nichts. Bei keiner der mails wird die Rechnung angehängt.. :(

    Weisst Du Rat?

    Antworten
  6. Hauke sagte:

    Hallo Gordon,

    die Beschreibung ist super!
    Noch eine kleine Frage, kannst du “deine” pdf.php mal online stellen? Bzw. wie kann man die PDF formatieren. Ich möchte z.B. das Rechnungsadresse und Lieferaddressefeld kleiner machen und die Beschreibung der RG (Artikel, Summe usw.) etwas weiter nach unten schieben (sieht momentan alles zusammengeklebt aus).. :)

    Viele Grüße,
    Hauke

    Antworten
  7. Gordon sagte:

    Hallo Hauke,

    vielen Dank.

    Die pdf.php kann ich hier leider nicht online stellen, da es sich um einen Kundenauftrag handelt. Aber wäre auch ein bisschen viel. Google doch einfach mal nach FPDF (das ist der Name der PDF Klasse) und Dokumentation oder Tutorial.

    Ich denk was Du brauchst ist “$pdf->Ln(x);” – x durch eine Zahl ersetzen. z.B. 10. Einfach mal rumprobieren.
    $pdf->Ln macht Zeilenumbrüche. Also Abstände.
    Packe es nach oder vor eine Zelle ($pdf->cell() ).

    Viele Grüße
    Gordon

    Antworten
  8. Jörg sagte:

    Hey Gordon,

    habe gerade deinen Beitrag über Prestashop (Thema Rechnung im Anhang) gelesen.

    Kannst du mir vielleicht sagen in welcher Datei das Template für die Bestellbestätigung schlummert? Würde das nämlich gerne etwas anpassen, das erste Feld mit der Referenznummer ist etwas sehr breit und die anderen Felder sind gequetscht.

    im Ordner classes bin ich angekommen
    aber welche order…. php ist die richtige?

    Danke
    Gruß
    Jörg

    Antworten

Trackbacks & Pingbacks

  1. [PrestaShop] Rechnungs-PDF in Bestell-E-Mail sagt:

    […] [PrestaShop] Rechnungs-PDF in Bestell-E-Mail […]…

Hinterlasse einen Kommentar

An der Diskussion beteiligen?
Hinterlasse uns deinen Kommentar!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Ich stimme der Datenschutzerklärung zu