Magento Extension nach Bestellung automatisch eine Rechnung generieren und dem Kunden übersenden (create Invoice after Order and send to Customer)

Gepostet am Januar 25, 2013

Folgend stelle ich eine Extension vor, die per Observer eine Rechnung generiert und diese mit einer eigenen Transaktions E-Mail an den Kunden übersendet. Dazu gibt es eine Konfiguration wo die Extension aktiviert werden kann, die Transaktions E-Mail Id eingetragen wird und die Absender E-Mail Adresse für die Rechnung. Geschrieben hatte ich die Extension für Magento 1.7.

Die Extension besteht aus 2 Teilen:
1. die All – diese hat nur eine Funktion im Backend in der Konfiguration einen Tab zu Verfügung zu stellen, wo alle weiteren Extensions eines Herstellers als Untertab gelistet werden.
2. die AutoIncoice – die ein Untertab in der Konfiguration setzt und die Funktion der Rechnungserstellung und die Versendung übernimmt

Schritt 1 – Ordner Anlegen
app/code/local/M28visions/All/etc/
app/code/local/M28visions/All/Helper/

app/code/local/M28visions/Autoinvoice/etc/
app/code/local/M28visions/Autoinvoice/Helper/
app/code/local/M28visions/Autoinvoice/Model/

Schritt 2 – Dateien Anlegen
app/code/local/M28visions/All/etc/config.xml — enthält immer die Konfiguration einer Extension
app/code/local/M28visions/All/etc/system.xml — fügt einen Tab in der Magento Konfiguration hinzu
app/code/local/M28visions/All/Helper/Data.php — enthält nur eine Definition einer Klasse, muss aber vorhanden sein

app/code/local/M28visions/Autoinvoice/etc/config.xml
app/code/local/M28visions/Autoinvoice/etc/system.xml
app/code/local/M28visions/Autoinvoice/Helper/Data.php
app/code/local/M28visions/Autoinvoice/Model/Observer.php — wird nach einem Event von Magento ausgeführt

Schritt 3 – Inhalte

app/code/local/M28visions/All/etc/config.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<config>
    <modules>
        <M28visions_All>
            <version>1.0.0</version>
        </M28visions_All>
    </modules>
    <global>
        <blocks>
            <m28visionsall>
                <class>M28visions_All_Block</class>
            </m28visionsall>
        </blocks>
        <helpers>
            <m28visionsall>
                <class>M28visions_All_Helper</class>
            </m28visionsall>
        </helpers>
    </global>
</config>

app/code/local/M28visions/All/etc/system.xml

1
2
3
4
5
6
7
8
9
<?xml version="1.0"?>
<config>
  <tabs>
    <m28visions translate="label" module="m28visionsall">
      <label>M28visions Module</label>
      <sort_order>101</sort_order>
    </m28visions>
  </tabs>
</config>

app/code/local/M28visions/All/Helper/Data.php

1
2
3
4
<?php
class M28visions_All_Helper_Data extends Mage_Core_Helper_Abstract {
 
}

app/code/local/M28visions/Autoinvoice/etc/config.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<?xml version="1.0" encoding="UTF-8"?>
<config>
  <modules>
    <M28visions_Autoinvoice>
        <version>1.0.0</version>
    </M28visions_Autoinvoice>
  </modules>
  <global>
    <models>
      <autoinvoice>
        <class>M28visions_Autoinvoice_Model</class>
      </autoinvoice>
    </models>
	<helpers>
	  <m28visionsautoinvoice>
	    <class>M28visions_Autoinvoice_Helper</class>
	  </m28visionsautoinvoice>
	</helpers>
  </global>
  <frontend>
    <events>
      <checkout_type_onepage_save_order_after>
        <observers>
          <beliebige_bezeichnung>
            <type>singleton</type>
            <class>autoinvoice/observer</class>
            <method>sendInvoice</method>
          </beliebige_bezeichnung>
        </observers>
      </checkout_type_onepage_save_order_after>
    </events>
  </frontend>
  <adminhtml>
    <acl>
      <resources>
        <all>
          <title>Allow Everything</title>
        </all>
        <admin>
          <children>
            <system>
              <children>
                <config>
                  <children>
                    <autoinvoice>
                      <title>M28visions Autoinvoice</title>
                    </autoinvoice>
                  </children>
                </config>
              </children>
            </system>
          </children>
        </admin>
      </resources>
    </acl>
  </adminhtml>
</config>

app/code/local/M28visions/Autoinvoice/etc/system.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<?xml version="1.0"?>
<config>
  <sections>
    <autoinvoice translate="label" module="m28visionsautoinvoice">
      <label>AutoInvoice Konfiguration</label>
      <comment>This extension was developed by schmidtmarcel.de</comment>
      <tab>m28visions</tab>
      <frontend_type>text</frontend_type>
      <sort_order>10</sort_order>
      <show_in_default>1</show_in_default>
      <show_in_website>1</show_in_website>
      <show_in_store>1</show_in_store>
      <groups>
        <autoinvoiceglobalconfig translate="label">
          <label>Grundeinstellungen</label>
          <comment></comment>
          <sort_order>200</sort_order>
          <show_in_default>1</show_in_default>
          <show_in_website>1</show_in_website>
          <show_in_store>1</show_in_store>
		  <comment>
		  <![CDATA[
			<div style="padding:10px;background-color:#fff;border:1px solid #ddd;margin-bottom:7px;">
			This module is written by <a href="http://schmidtmarcel.de/" target="_blank">http://schmidtmarcel.de/</a>.
			</div>
		  ]]>
	      </comment>
          <fields>
            <enabled translate="label comment">
              <label>Enabled</label>
              <frontend_type>select</frontend_type>
              <source_model>adminhtml/system_config_source_enabledisable</source_model>
              <sort_order>0</sort_order>
              <show_in_default>1</show_in_default>
              <show_in_website>1</show_in_website>
              <show_in_store>0</show_in_store>
            </enabled>
            <fromemail translate="label">
              <label>From E-Mail:</label>
              <frontend_type>text</frontend_type>
              <sort_order>1</sort_order>
              <show_in_default>1</show_in_default>
              <show_in_website>1</show_in_website>
              <show_in_store>0</show_in_store>
              <comment>
                <![CDATA[E-Mail Adresse]]>
              </comment>
            </fromemail>
			<transactiontemplateid translate="label">
              <label>Transaktionstemplate Id:</label>
              <frontend_type>text</frontend_type>
              <sort_order>1</sort_order>
              <show_in_default>1</show_in_default>
              <show_in_website>1</show_in_website>
              <show_in_store>0</show_in_store>
            </transactiontemplateid>
 
          </fields>
        </autoinvoiceglobalconfig>
      </groups>
    </autoinvoice>
  </sections>
</config>

app/code/local/M28visions/Autoinvoice/Helper/Data.php

1
2
3
4
<?php
class M28visions_Autoinvoice_Helper_Data extends Mage_Core_Helper_Abstract {
 
}

app/code/local/M28visions/Autoinvoice/Model/Observer.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
<?php
  class M28visions_Autoinvoice_Model_Observer extends Mage_Core_Model_Abstract {
 
	var $enabled;
	var $fromemail;
	var $transactiontemplateid;
 
    public function __construct() {
	    $this->enabled = Mage::getStoreConfig('autoinvoice/autoinvoiceglobalconfig/enabled',Mage::app()->getStore());
		$this->fromemail = Mage::getStoreConfig('autoinvoice/autoinvoiceglobalconfig/fromemail',Mage::app()->getStore());
		$this->transactiontemplateid = Mage::getStoreConfig('autoinvoice/autoinvoiceglobalconfig/transactiontemplateid',Mage::app()->getStore());
	}
 
	public function sendTransactionalEmail($invoice,$_order,$toEmail,$toName) {
 
		$pdf = Mage::getModel('sales/order_pdf_invoice')->getPdf( array($invoice) );
 
		// Transactional Email Template's ID
		$templateId = $this->transactiontemplateid;
 
		// Set sender information          
		$senderName = Mage::getStoreConfig('trans_email/ident_support/name');
		$senderEmail = Mage::getStoreConfig('trans_email/ident_support/email');    
		$sender = array('name' => 'Shop',
					'email' => $this->fromemail);
 
		// Set recepient information
		$recepientEmail = $toEmail;
		$recepientName = $toName;       
 
		// Get Store ID    
		$storeId = Mage::app()->getStore()->getId();
 
		// Set variables that can be used in email template
		$vars = array('customerName' => $toName,
				  'customerEmail' => $toEmail);
 
		$translate  = Mage::getSingleton('core/translate');
 
		// Get E-Mail Template
		$transactionalEmail = Mage::getModel('core/email_template')->setDesignConfig(array('area'=>'frontend', 'store'=>1));
 
		//Set Attachment
		$attachment = $transactionalEmail->getMail()->createAttachment( $pdf->render() );
		$attachment->filename = $_order->getIncrementId().'.pdf';
 
		// Send Transactional Email
		$transactionalEmail->sendTransactional($templateId, $sender, $recepientEmail, $recepientName, $vars, $storeId);
 
		$translate->setTranslateInline(true);   
 
	}
 
 
    public function sendInvoice($observer) {
 
		if ($this->enabled && !empty($this->transactiontemplateid) && !empty($this->fromemail)) {		
			$_order = $observer->getEvent()->getOrder();
			$err = '';
			try {
				//create order
				if(!$_order->canInvoice()){
					Mage::throwException($err = Mage::helper('core')->__('Cannot create an invoice.'));
				} 
				$invoice = Mage::getModel('sales/service_order', $_order)->prepareInvoice(); 
				if (!$invoice->getTotalQty()) {
					Mage::throwException($err = Mage::helper('core')->__('Cannot create an invoice without products.'));
				} 
 
				if (empty($err)) {
					$invoice->setRequestedCaptureCase(Mage_Sales_Model_Order_Invoice::CAPTURE_ONLINE);
					$invoice->register();
					$transactionSave = Mage::getModel('core/resource_transaction')->addObject($invoice)->addObject($invoice->getOrder());
					$transactionSave->save();
 
					//send mail
					$tomail = $_order->getShippingAddress()->getEmail();
					$toname = $_order->getShippingAddress()->getName();
					$this->sendTransactionalEmail($invoice,$_order,$tomail,$toname);
				}
 
			}catch (Mage_Core_Exception $e) { }
		}
	}
 
  }
?>

Schritt 4 – 2 Dateien zum Aktivieren der Extensions

app/etc/modules/M28visions_All.xml <- Erstellen

1
2
3
4
5
6
7
8
9
<?xml version="1.0"?>
<config>
    <modules>
        <M28visions_All>
            <active>true</active>
            <codePool>local</codePool>
        </M28visions_All>
    </modules>
</config>

app/etc/modules/M28visions_Autoinvoice.xml <- Erstellen

1
2
3
4
5
6
7
8
9
<?xml version="1.0"?>
<config>
    <modules>
        <M28visions_Autoinvoice>
            <active>true</active>
            <codePool>local</codePool>
        </M28visions_Autoinvoice>
    </modules>
</config>

Schritt 5 – Cache leeren
„Backend -> System -> Cache Verwaltung“ und alle Aktualisieren

Tags: ,

5 Antworten bis “Magento Extension nach Bestellung automatisch eine Rechnung generieren und dem Kunden übersenden (create Invoice after Order and send to Customer)”

  1. Hümmer Markus
    Mai 30, 2013
    Reply

    Ist dieses Test-Modul schon bei Magento 1.7.0.2 getestet worden ?


    • Marcel
      Jun 06, 2013
      Reply

      Nein, das war ein 1.6 Version, aber viel sollte sich da nicht verändert haben.


  2. Kerim
    Dez 11, 2013
    Reply

    Hi,

    was trage ich in das Feld „Transaktionstemplate Id:“ ein?

    Benutze Magento 1.7.0.2 und das VIANETZ-MODULE „Advanced Invoice Layout“

    VG
    Keim


    • Marcel
      Dez 11, 2013
      Reply

      Hallo,

      diese Extension ist nur für das Standard-System geschrieben und in die „Transaktionstemplate Id:“ muss die Id des Rechnungstemplates (Transaktionsmails), welches verwendet werden soll. Die „Advanced Invoice Layout“ überschreibt die Standardfunktionen von Magento und somit müsste die „Advanced Invoice Layout“ Extension durch den oben gezeigten „Observer“ erweitert und umgeschrieben werden.

      Grüße
      Marcel


      • Kerim
        Dez 11, 2013
        Reply

        Ok Marcel vielen Dank für die Info.



Leave a Reply

 

Posts of Current Category



Facebook: