PHP Class: ESR Einzahlungsscheine

class.Einzahlungsschein.php

Last changes on this page: April 16, 2012

Yeehaa, the class now also red and orange Einzahlungsscheine, however this page has not yet been updated. See example files after downloading the source code.

This is what you can create with this class. Click to see better.

Eine PHP-Klasse, mit welcher sich Schweizer Einzahlungsscheine mit ESR-Nummer generieren lassen.

To my English speaking friends:
A php class to create Swiss Einzahlungsscheine with ESR number. There seems to be a bit of a confusion how an Einzahlungsschein should be called in English. You can choose: payment slip, paying in slip, pay-in slip, pay slip, credit slip… whatever! I decided to stick with Einzahlungsschein. It just a Swiss thing anyways, right?

This class is based on FPDF, a php class to create pdf files. F from FPDF stands for Free: you may use it for any kind of usage and modify it to suit your needs.

You’re welcome!

Do you like this class? You’re invited to donate a few bucks.
You know, Thank You Economy and all that stuff…
I promise I won’t get high on it.

Getting started

ESR or BESR is a way to handle Swiss Einzahlungsscheine completely automatically. It’s the orange Einzahlungsscheine, not the red ones. A reference number on the Einzahlungsschein allows you to use software to track who paid your invoices and how didn’t. You need to set up your ESR accounts with your bank before this class is any helpful for you!

There’s more to an Einzahlungsschein than just some correct placement of texts. There are check digits within the reference numbers which have to be calculated correctly based on your data. And there’s even some standards about which fonts to use. This class takes care of all that stuff.

Installation

  1. Download source code right here, right now!
  2. Get FPDF (German or English)
  3. Get OCRB font
    (get here and convert here or get the already converted font right here [ZIP, 20kB])
  4. Move OCRB font files into the font folder of the FPDF class.
  5. Open class.Einzahlungsschein.php and adjust the path to the FPDF class file.

Example

Here’s a simple example of how to create an Einzahlungsschein:

require_once('class.einzahlungsschein.php');

//create instance
$ezs = new Einzahlungsschein(190, 0);

//set data of you banking account
$ezs->setBankData("Berner Kantonalbank AG", "3001 Bern", "01-200000-7");

//Set data of you as recipient of the money. Name, address, zip code with town and you customer identification code (also provided by your bank)
$ezs->setRecipientData("My Company Ltd.", "Company Address Rd. 23", "3001 City", "999999");

//Set data of the person who has to pay the bill. You have four lines for name and address
$ezs->setPayerData("Heinz Müller", "Payer Court Street 23", "3072 Payertown", "Switzerland");

//Set payment data: Amount in Swiss francs and your individual reference number for this bill (max. 20 digits)
$ezs->setPaymentData(100.00,111111);

//Do the magic! Yes, we want to output the result and yes we want to include an actual image of an Einzahlungsschein.
$ezs->createEinzahlungsschein(true, true);

But you can do more!

Invoice with attached Einzahlungsschein
A very common usage is to create an invoice with an Einzahlungsschein attached to it. In thiscase you can create your invoice first and then simply add the Einzahlungsschein. The whole thing will be printed on a sheet of paper with the actual Einzahlungsschein already attached to it.

//Create a new pdf to create your invoice, already using FPDF
$pdf = new FPDF('P','mm','A4');
$pdf->AddPage();
$pdf->SetAutoPageBreak(0,0);
$pdf->SetFont('Arial','',9);
$pdf->Cell(50, 4, "Just some dummy text.");

//now simply include your Einzahlungsschein, sending your pdf instance to the Einzahlungsschein class
$ezs = new Einzahlungsschein(196, 0, $pdf);
$ezs->setBankData("Berner Kantonalbank AG", "3001 Bern", "01-200000-7");
$ezs->setRecipientData("My Company Ltd.", "Exampleway 61", "3001 Bern", "123456");
$ezs->setPayerData("Heinz Müller", "Beispielweg 23", "3072 Musterlingen");
$ezs->setPaymentData(100.00,111111);
$ezs->createEinzahlungsschein(false);

//ouput the initial pdf
$pdf->output();

Create Einzahlungsschein to print it on single Einzahlungsscheine.
Have a bunch of single Einzahlungsscheine and need to print them? Here you go:

//Create a A4 page in landscape mode and place the Einzahlungsschein 52mm from the top and 87mm from the left.
//The actual measurements may vary on your printer.
$ezs = new Einzahlungsschein(52, 87, false, "L", "A4");

Save the Einzahlungsschein to a file
You can save the Einzahlungsschein into a file.

/* Output? True! Image of Einzahlungsschein? Up to you, here true!
 * Add a filename. And an action what to do with the file.
 * For options for the last parameter see
 * http://www.fpdf.org/en/doc/output.htm */
$ezs->createEinzahlungsschein(true, true, "filename.pdf", "I");

Feedback?

Get in touch: @sprain on Twitter or email me.

49 Gedanken zu „PHP Class: ESR Einzahlungsscheine“

  1. Hi there

    I absolutely love your class. I just test-installed and tried it and it works like a charm.

    However, I really need it to print red ES as well, and since my knowledge of PHP is limited, I simply can’t figure out how to properly explode and place the amount … it has these amount boxes, you know. Also, I’d need the software to fill the comment box (and of course, leave out the bottom line as well as reference number altogether).

    Do you think you could kindly change your script for me, so Red ES are also a possibility? You would absolutely rescue my project :D

    Thanks a lot!

    Best, Thomas

  2. Die Lösung bei Marc nach E-Mail-Abklärung:
    Das Bild des EZS erscheint nur, wenn der entsprechende Parameter gesetzt ist.

    $ezs->createEinzahlungsschein(true, true);

    Im example.php des Downloads ist der zweite Wert nicht gesetzt und somit standardmässig auf false.

  3. Bei mir ist der Ausdruck mit der Grafik einwandfrei. Wenn ich abe einen Einzahlungsschein dagegenhalte bin ich mit allem eine Zeile zu weit unten und die Schrift könnte etwas grösser sein.
    Leider habe ich die einstellungen dazu noch nicht gefunden. Wenn ich “$marginTop = 0″ auf “$marginTop = -10″ ändere passirt nichts.
    Was mach ich falsch?

  4. @all
    Tinus Positionierungsproblem liess sich nach Abklärung ganz einfach mit den Positionen im Constructor feinjustieren:

    $ezs = new Einzahlungsschein($top, $left);
    
  5. Hi sprain – gerade zufällig hier rüber gestolpert. Freut mich, dass du die modulo10-Funktion gebrauchen konntest. Ich hätte damals fast überbissen, als ich den alltickets-shop gecodet hatte und ESR-Scheine bedrucken musste :D

  6. Hallo Sprain
    deine Klasse gefällt mir ausgezeichnet. Ich möchte auch gerne die Klasse so abändern, dass das Generieren von roten Einzahlungsscheinen möglich ist. Kannst du mir sagen, wie ich vorgehen muss, resp. was ich an der Klasse ändern muss?
    Danke im voraus bestens und wünsche dir eine gute Zeit.
    Heinz

  7. Hallo Sprain

    Geniale Klasse! Vielen Dank. Bei mir werden Umlaute in den Strings, die auf dem EZS aufgedruckt werden nicht richtig ausgegeben, ö wird zu ? etc… Im restlichen Dokument funktionierts. Hast du mir einen Tipp?

    Im Voraus schon vielen Dank und Gruss,
    Adrian.

  8. @Adrian, das hat mit dem Zeichensatz zu tun.

    Mit UTF8 geht das zb. so, schreib im HTML-Header einfach:

    Gruss Dave

  9. kanns nicht schreiben, wird automatisch gelöscht….
    such einfach mal nach html header charset,

    Gruss dave

  10. @Adrian,

    das hat mit dem Charset deiner HTMl/PHP datei zu tun.

    Du musst im HTML Header was reinschreiben, kann das aber hier nicht posten weils automatisch gefiltert wird.
    such einfach mal nach html header charset,

    Gruss dave

  11. Hi Sprain

    ich warte sehnlichst auf die von Dir angekündigte Version für die roten Einzahlungsscheine. Gibts schon news?

    Greez
    Oli

  12. Wow, tolle Klasse. Wir haben noch das Problem, dass die Kodierzeile im weissen Bereich (der OCR-Font) je nach PDF-Reader falsch oder gar nicht dargestellt wird. Wir generieren die PDFs mit TCPDF (sprich haben deine Klasse leicht angepasst). Weisst du vielleicht wieso der OCR-Font nicht klappt?

  13. @Sam
    Hmm, leider keine Ahnung. Da es je nach Reader unterschiedlich ist, vermute ich mal, dass es vielleicht an TCPDF liegt, denn mit FPDF hatte ich dieses Problem noch nie.

    Gib Bescheid, wenn du etwas rausfindest!

  14. Hallo.

    Gibt es eine Möglichkeit die Papierquelle (Fach) des Druckers zu bestimmen, also durch ein Befehl, wenn man die PDF Datei öffnet,
    Drucker hat zwei unterschiedliche Papierquellen, oft muss Rechnung mit ESR und Ohne, normales Papier drucken, möchte aber nicht jedes mal Drucker-Eigenschaften öffnen usw.
    für eine Lösung würde ich auch Finanziell entgegenkommen.

  15. Hallo.

    Vielen Dank für diese Klasse. Bin gerade am umstellen auf ESR, darum kommt sie mir sehr gelegen.

    Noch eine Anmerkung: Laut einigen Quellen darf die Referenznummer höchsten 27 Zeichen lang sein (inkl. Prüfsumme). Je nach Bankkennnummer generiert die Klasse aber längere Referenznummern. Ich habe daher auf Zeile 461 in der Funktion createCompleteReferenceNumber das 2. Argument von str_pad von “20″ auf “(26- strlen($this->ezs_bankingCustomerIdentification))” geändert. Nun funktionniert auch das mit den 27 Zeichen.

  16. Hallo
    Ich hab Probleme mit dem Script
    Warning: filesize() [function.filesize]: stat failed for ..\pdf\font\96787a06563b0a75083534590b589c05_ocrb10.z in C:\www\www.curasoft.ch\pdf\fpdf.php on line 1170
    FPDF error: Font file not found
    irgendwie findet er das font file nicht
    ich habe ocrb10.php am richtigen Ort hintergelegt
    Vielen Dank im Voraus
    Mathias

  17. hat sich erledigt … sorry für die Störung.

    Ich war so blöd und habe das z file nicht reinkopiert :-(
    dir vielen Dank und Merci
    lg mathias

  18. hallo
    2 Fragen
    1. wie spreche ich die roten Einzahlungsscheine an?
    2. Mein Kunde hat nur eine Postcheckkonto bei der Postfinance. Kann ich nun einfach die Postcheckontonummer als Kontonummer nehmen?
    Dir schon mal vielen Dank im Voraus.
    lg mathias

  19. Hallo zusammen

    Bin schon lange auf der Suche nach einem Modul der ESR erzeugt für meinen Shop der auf Gambio läuft.

    Leider bis heute ohne Erfolg.

    Gruss
    Urs

  20. Tolles Script! Danke!
    Bin mir aber nicht sicher, ob die Berechnung stimmt. Ist etwas doof, dass du für die mitgelieferten Beispiele nicht gültige Werte nimmst.

    In Deinem EZR Orange-Bsp. setzt du folgende Werte:
    $amount= “150.20″;
    $ref=”5000001195″; // sollte nach meinem Verständnis eine Referenznummer ohne Prüfziffer sein (15 oder 26 Stellen)
    $ezs->setBankData(“Berner Kantonalbank AG”, “3001 Bern”, “01-200000-7″); // Annahme: 01-200000-7 ist die Kontonummer des Empfängers
    $ezs->setRecipientData(“My Company Ltd.”, “Exampleway 61″, “3001 Bern”, “123456″); // was ist 123456 ??

    Ich habe überprüft mit:
    http://www.kreaktiv.ch/programmierung/SQL_PHP/vesr.html
    Könntest du bitte ein das kurz überprüfen und vielleicht eben formal richtige Nummern eingeben.

    Vielen Dank

    Michael

  21. @Michael

    $ref=”5000001195″; // Referenznr. Fehlende Ziffern werden mit Nullen aufgeführt.
    $ezs->setBankData(“Berner Kantonalbank AG”, “3001 Bern”, “01-200000-7″); // 01-200000-7 ist die Kontonummer des Empfängers
    $ezs->setRecipientData(“My Company Ltd.”, “Exampleway 61″, “3001 Bern”, “123456″); // 123456 ist die ESR-Teilnehmernummer, die du von der Bank erhältst
    
  22. Danke! (Fast) alles klar. Ich habe eine Nummer mit Muster XX-XXXXX-X. Einfach “-” ignorieren?
    Wie lange darf $ref max. sein?

    Schönen Abend

    Michael

  23. Sali sprain

    Erstmals möchte auch mich herzlich für das tolle Script bei dir bedanken.

    Die meisten Kundenanforderungen konnte ich damit bereits umsetzen. Nun hat aber ein Kunde den Wunsch, Einzahlungsschein und Rechnung (liegt im HTML-Format vor) auf einem PDF zu haben. Also quasi oben die Rechnung un unten gleich den Einzahlungsschein drüber. Dein bisheriger Parameter aus dem Beispiel “Invoice with attached Einzahlungsschein” erlaubt nur String-Übergaben. Gibt es eine Möglichkeit, dem ezs gleich HTML-Code zu übergeben damit dann der in das Schluss-PDF integriert wird?

    Herzlichen Dank für deine Hilfe
    Alex

  24. @Michael Bischof: $ref darf laut Zürcher Kantonalbank maximal 20 Stellen haben. Sonst kriegst du es nicht mehr auf den Einzahlunsschein resp. es wird von der Bank nicht mehr verarbeitet meines Wissens.

  25. Vielen Dank. Folgende offene Punkte:
    1. (Bug?) Im PDF werden Umlaute nicht richtig dargestellt und zwar nur am ESR werden Sie falsch dargestellt (im Freitext oberhalb ESR, den ich selbst gestaltet habe, kein Problem). Bsp. Z?rich
    2. (Nice-to-have) Rechnungen an Firmen schreibt man ja meistens nur Firma/Adresse, manchmal auch Firma / Person / Adresse. Wäre vielleicht sinnvoll auch diese Option anzubieten.

  26. In aller Kürze nach bestem Wissen und Gewissen:
    1. Versuche mal, die Umlaute wie folgt zu Erfassen:
    ü–> ü
    ä–> ä
    ö–> ö
    hab’s zwar nicht ausprobiert, ist aber die offizielle HTML-Codierung für Umlaute.
    2. Erfasse doch einen Parameter einfach mit “”, dann bleibt die letzte Zeile leer. Mitgeben musst du den Parameter allerdings. Also zum Beispiel:
    (“Muster AG”, “8000 Zürich”, “”)
    Grüsse
    Alex

  27. tut mir leid, das CRM hat meine Umlaut-Definition einfach gelöscht. Die Idee wäre:
    ü–> & uuml; (ohne Abstand)
    ö–> & ouml; (ohne Abstand)
    ä–> & auml; (ohne Abstand)

  28. An das habe ich auch zuerst gedacht. Funktioniert aber nicht. Interessanterweise hat fpdf sonst überhaupt kein Problem mit Umlauten.

  29. Firmendaten. Klar, leerlassen ist kein Problem, aber es bräuchte ja eine zusätzliche Zeile – nicht eine weniger .. Aber wie gesagt, mich stört es nicht – ich schreib nur den firmennamen rein

  30. Umlaute: noch eine Idee – liegts am Font ocrb10.php – wenn natürlich keine Umlaute definiert hat ..

  31. @Michael
    Die OCR-Font wird in meinem Skript nur für die Fusszeile verwendet, ansonsten kommt Arial zum Einsatz. Dein Umlaut-Problem muss anderswo herkommen. Da kann es 1000 Gründe geben dafür.

    Was die Adresse betrifft: Du hast alternativ auch die Methode $ezs->setPayerFullAddress() zur Verfügung. Dort kannst du freien Text schicken für die Adresse. Musst dich aber selbst um Zeilenumbrüche kümmern.

    Grundsätzlich gilt: Code lesen hilft. Was es zu verbessern gibt, darf gerne verbessert werden und als Pull-Request geschickt werden.

  32. Hallo sprain
    Bitte check doch noch kurz meine Anfrage: gibt es eine Möglichkeit deiner Klasse fertigen html-Code zu übergeben? Du hast ja im Beispiel “Invoice with attached Einzahlungsschein” nur die Möglichkeit der String-Übergabe erwähnt.
    Merci und Grüsse
    Alex

  33. @Alex
    Der Klasse übergeben kannst du das nicht. Die Klasse macht nur den Einzahlungsschein. Das Beispiel zeigt, wie man den Einzahlungsschein in ein anderes PDF integriert.

    Das heisst, du musst rausfinden, ob du mit FPDF grundsätzlich HTML verwenden kannst. Da weiss ich leider gerade keine passende Lösung. Wenn es eine gibt, kannst du dies aber auf jeden Fall mit der Klasse kombinieren.

  34. Umlautproblem gelöst. Eigentl. vollkommen unnötig, weil ich in der Realversion sowieso die Daten aus der DB erhalten hätte und damit kein Problem gehabt hätte:-)
    Lösung: mein Source-File war nicht als UTF-8 abgespeichert. Alternative könntest du dein Script erweitern:
    private function detect_and_convert_utf8( $s ) {
    if( mb_detect_encoding( $s ) == “UTF-8″ ) {
    return utf8_decode( $s );
    } else {
    return $s;
    }
    }

  35. Guten Abend miteinander

    Mir hat die Klasse super geholfen und ich möchte es nicht missen, der Community meinen Lösungsansatz zurück zu geben (auch wenn ein wenig gebastelt).

    Solange man weiterhin mit FPDF arbeitet, kann man die ESR-Klasse mit anderen HTML2PDF-Konvertern kombinieren (vorausgesetzt eben FPDF als Basis).

    Ich habe folgende Klasse genommen: http://sourceforge.net/projects/html2fpdf/

    Anschliessend habe ich der html2pdf-Klasse einfach normalen HTML-Code (nur Body-Part) übergeben:
    // convert in PDF
    require_once (‘lib/html2fpdf/html2fpdf.php’);
    $pdf = new HTML2FPDF(‘P’,'mm’,'A4′);
    $pdf->AddPage();
    $pdf->SetAutoPageBreak(0,0);
    $pdf->SetFont(‘Arial’,”,11);
    $pdf->WriteHTML($strContent);
    Zu guter Letzt dann noch den ESR-Teil wie von sprain empfohlen eingepflegt und dann ausgegeben.
    //now simply include your esr, sending your pdf instance to the esr class
    require (‘lib/class.einzahlungsschein.php’);
    //create instance
    $ezs = new einzahlungsschein(195, 0, $pdf);

    Das Hauptproblem war noch, dass beide Klassen (class.einzahlungsschein und html2pdf) die FPDF-Klasse definieren. Also musste ich bei einem der beiden noch die FPDF-Dateien so modifizieren und anders aufrufen, dass sie einmal als FPDFOrg und das andere Male als FPDF definiert waren. Ausserdem verwendet die HTML2PDF-Klasse eine deprecated PHP-Funktion (ereg). Diese kann mit preg ersetzt werden (Details auf php.net).

    Hoffe, das hilft dem einen oder anderen, diese Super-Klasse weiter zu erweitern.

    Grüsse
    Alex

  36. Hallo Sprain

    Deine Klasse ist klasse! ;-)

    Frage: Wenn ich den EZS im Browser (Firefox) ausdrucke, stimmen die Felder überhaupt nicht überein mit dem EZS. Speichere ich das PDF jedoch lokal ab und drucke es über den Adobe Acrobat, so passt das bestens.

    Habe zudem festgestellt, dass der EZS viel schöner und feiner gedruckt wird, wenn ich das PDF vorab lokal abspeichere. Gibt es andere Leute, die das Problem kennen oder bereits eine Lösung gefunden haben?

    Herzlichen Dank für deine Arbeit!

    Grüsse
    Cyrill

Hinterlasse eine Antwort

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

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>