Archiv der Kategorie: Ecommerce

Ich betreibe einen kleinen Onlineshop und da kann man die eine oder andere Geschichte erzählen. Hier findet ihr ein paar Klassiker und Hilfe rund ums Thema Ecommerce

Finanzübersicht mit Jameica und Hibiscus

Im laufe eines Lebens sammeln sich doch so einige Konten, Ausgaben, Kredite etc an. Um nicht den Überblick zu verlieren, nutze ich für mich die Plattform Jameica mit dem Banking-Plugin Hibiscus. Dieser Artikel soll eine kleine Übersicht bieten und meine Erfahrungen zusammenfassen.

Screenshot Jameica mit Hibiscus (Quelle: https://www.willuhn.de/products/hibiscus/screenshots.php)

Die Jameica-Plattform ist eine freie Laufzeit-Umgebung für Java-Anwendungen, die in Form von Plugins implementiert werden können. Sie stellt ein Framework für die ganzen Plugins zur Verfügung. Hibiscus ist eine freie Homebanking-Anwendung, die vor allem für Banken interessant ist, die HBCI (vgl. API der Banken) nutzten. Durch andere Plugins können aber auch andere Banken mit erfasst werden.

Ich werde hier meine persönliche Anwendung der Software vorstellen. Man kann die Software auch für komplett andere Dinge nutzen, z.B. der Verwaltung eines Vereins. Jameica in Verbindung mit Hibiscus sieht zwar eher „altbacken“ aus, bietet aber alle Funktionen die man benötigt. Außerdem ist man nicht auf ein Betriebssystem angewiesen (vgl. Starmoney) bzw. muss für die Finanzsoftware Geld ausgeben.

Hinweis: Bei den Screenshots habe ich sehr viel verpixelt. Meist habe ich aber einen Eintrag als Beispiel unverpixelt gelassen.

Übersicht der Transaktionen

Um eine vollständige Übersicht aller Finanztransaktionen seiner Banken zu erfassen, müssen diese erst erfasst werden. Das ist schon etwas komplexer, da man gegen die verschiedenen Bank-APIs sprechen muss. Ist es eine „normale“ Bank wie Sparkasse, ING Diba etc. ist das relativ leicht: Im Wiki des Entwicklers finden sich Anleitungen und Einstellungen für die meisten Banken: https://www.willuhn.de/wiki/doku.php?id=support:list:banken

Möchte man allerdings „Sonderbanken“ hinzufügen, gestaltet sich dies etwas schwerer und es sind weitere Plugins nötig. Bei mir sind dies z.B. die Landesbank Berlin (Kreditkarte) oder meine diversen Paypalkonten. Auch viele Bausparer nutzen nicht das HBCI verfahren.

Bisher habe ich es lediglich bei Wüstenrot nicht geschafft die Übersicht in meine Transaktions-Liste zu bringen.

Übersicht der Konten in Hibiscus

Sind alle Konten bzw. Bank-Zugänge eingerichtet ruft Hibiscus (nur durch User-Aktion) alle Transaktionen ab. Dies kann einige Zeit dauern, da hier mit der API der jeweiligen Bank gesprochen wird. Bereits erfasste Transaktionen bleiben in einer SLQlite Datenbank gespeichert. Die Daten sind außerdem mit einem Masterpasswort verschlüsselt. Jameica selbst erstellt auch automatisch bei jedem schließen ein Backup. Um die Sicherung dieses Backups müsst ihr euch natürlich selbst kümmern.

Im Screenshot „sieht“ man die Übersicht der Konten. Hier werden die wichtigsten Informationen zusammengefasst. Ich habe auch eine Kreditkarte (zu erkennen an der roten Bilanz). Dieses Konto ist über ein Script eingebunden. Das Script erfasst dabei die aktuellen Ausgaben (Minusbilanz) und der noch zur Verfügung stehende Kredit. Die Übersicht schafft schnell einen Überblick über das gesamte zur Verfügung stehende Vermögen.

Im Übrigen können hier auch historische Daten erfasst werden. Wenn ihr z.B. eine Bank kündigt, bleiben die Transaktionen erhalten. Der Bankzugang wird dann einfach stillgelegt.

Die Transaktionen

Die Übersicht der Transaktionen bietet eine Fülle an Funktionen die im täglichen Gebrauch sehr praktisch sind.

Suche

Natürlich kann man innerhalb der Transaktionen suchen. Nun hört sich das zunächst überflüssig an, denn meisten reicht ja eine Übersicht. Wer aber am Jahresende seine Steuer machen möchte, kann hier in den Transaktionen suchen, wann etwas passiert ist und in welcher Höhe. Leider dauert die Suche bei vielen Transaktionen aufgrund der Speicherung in SQLite leider relativ lange.

Flags

Ein einfaches Flag „Confirmed“ und „Unconfirmed“ hilft bei der täglichen bzw. wöchentlichen durchschau der Daten. Ich habe einen Onlineshop und muss daher täglich die Transaktionen durchschauen. Das Flag hilft mir dabei nicht die Übersicht zu verlieren. Durch die Durchsicht fallen aber auch Posten auf, die vielleicht schon gar nicht mehr sein müssen (z.B. alte Mitgliedschaften alter Vereine, Abos, etc.) oder unberechtigte Abbuchungen durch Betrüger. Leider passiert auch dies 1-2 mal im Jahr. Wenn man es bemerkt ist das kein Problem, allerdings muss man es auch erst mal bemerken.

Kategorisierung

Jede Transaktion kann einer Kategorie zugeordnet werden. Natürlich auch vollautomatisch. Damit kann man sehr einfach „Unterkonten“ erfassen/erstellen und hat z.B. eine Übersicht über Wiederkehrende Ausgaben.

Bilanz

Ein nettes Gimik: Eine Grafische Auswertung der verschiedenen Konten. Man sieht wie die Tendenz ist, aber viel tatsächlicher Informationsgehalt ist leider nicht enthalten.

Fazit

Ich kann dieses Tool nur jedem Empfehlen. Mit der Fülle an Banken, Konten, Sparplänen, Aktien, Bausparern, Krediten, … kann man schnell die Übersicht verlieren. Jameica in Verbindung mit Hibiscus ist ein einfaches, kostenloses und umfassendes Tool um Licht ins Dunkel zu bringen. Je nachdem wie intensiv man das Tool nutzt, kann man auch weitere Erkenntnisse aus den Bilanzen ziehen.

Vorteile

  • Übersicht aller Transaktionen
  • Nahezu alle Banken
  • Aktive Weiterentwicklung
  • Freie Software
  • Kostenlos

Nachteile

  • Einige kleinere Bugs (bereits gemeldet)
  • Ein paar Banken gibts dann doch nicht
  • Ein wenig Arbeit/Gefrickel bei der Einrichtung ist nötig

Ausblick

Bei der Recherche für diesen Artikel bin ich auf synTAX gestoßen: Eine freie Finanzbuchhaltung für Selbständige und „Nichtbilanzierer“ nach SKR03/04. Die Anwendung läuft als Plugin innerhalb des Frameworks Jameica. Na das hört sich doch super an! Werde ich testen und darüber berichten :).

Update zum „Best Of…“ meiner Kunden

Haja ich mag sie einfach und manche Situationen sind wirklich top. Ich möchte hier ein kleines Update zu meiner Serie „Best of Aktionen meiner Kunden“ geben.

„… und dann möchte ich noch gern meinen Tabakkopf zurückgeben.“

Ein Kunde den ich persönlich zum ersten mal bei mir im Geschäft gesehen habe kauft ein und dann plötzlich der Kunde

„Kann ich dann noch den Einlochkopf zurück geben?“

Und da es sich so anhörte, als ob das schon ausgemacht war und ich mir dachte, vielleicht hab ich irgend was übersehen oder vergessen kam dann folgende Konversation zustande:

Timo: „Welcher Einlochkopf?“

Kunde: „Na den den ich damals gekauft habe.“

Timo: „Hast du eine Rechnung dabei damit ich mir das mal anschauen kann?“

Kunde: „Nein.“

Timo: „Hast du den Tabakkopf dabei?“

Kunde: „Nein.“

(An dieser Stelle war dann meine Verwunderung am Höhepunkt)

Timo: „Was ist denn an dem Tabakkopf kaputt?“

Kunde: „Der geht nicht so gut.“

Tjaja ;). So reklamiert man heut zu Tage ;).

„YOLO!“

Kunde kauft kräftig nach Weihnachten ein und ist schon die ganze Zeit etwas hibbelig. Als er dann den Gesamtpreis sieht kommt dieser sagenhafte Kommentar zustande:

„Wenn meine Mutter das mitbekommt, dass ich das ganze Geld für Shisha ausgeb bringt sie mich um! … Aber hey: YOLO!“

Die ganze Situation war einfach zu witzig, weil seine Kumpels dann in einem Lachflash verfallen sind und ich mich auch fast nicht mehr halten konnte. Dann hoffen wir mal das die Mutter den Kopf dran lässt ;).

bier-kaufen.de und seine vielen Sekretärinnen

Ein Kunde ruft an, weil er eine Frage zu seiner Bestellung hat. Wir hatten vorher schon per Email Kontakt:

Kunde: „[schwäbisch an]Ich hab da eine Email von einer netten Frau bekommen…[schwäbisch aus]“

Timo: „Die nette Frau war ich.“

Alte Freunde

Also spätestens jetzt weiß ich, dass ich alt bin. Diese Jugendsprache. Herrlich!

Jugendsprache vom allerfeinsten.

Jugendsprache vom allerfeinsten.

Und es geht noch weiter:

Jugendsprache vom allerfeinsten - Teil 2

Jugendsprache vom allerfeinsten – Teil 2

Bei blubberladen wird noch persönlich ausgeliefert

Kundenanfrage zu den Lieferbedingungen

Kundenanfrage zu den Lieferbedingungen

Gewährleistung ausreizen

Der nächste Kunde will das mit der Gewährleistung aber ganz schön ausreizen ;), aber wenigstens ist er ehrlich.

Gewährleistung mal anders

Gewährleistung mal anders

Mit Magento 1.9 Umsätze für die Umsatzsteuervoranmeldung korrekt berechnen

Halli Leute,

Magento ist ja schon ein tolles System, aber geht es um die deutsche Bürokratie, wird Magento etwas nachlässig. Mit ein bisschen Trickserei kriegt man dies aber auf in den Griff. Es stellten sich mir folgende Probleme:

  1. Wie berechne ich die Umsätze korrekt aufgeschlüsselt nach Steuersatz korrekt? Denn möglich sind 19%, 7% und 0% MwSt.
  2. Wie arbeitet Magento, und was bedeuten die Zahlen beim Export

Naiver Ansatz: Steuerbericht

Das Berichtswesen von Magento bietet nur die Basics. So kann man sich folgende Berichte erstellen:

  • Umsatzbericht (Bestell-Bericht)
  • Steuerbericht

Eigentlich sollte das ja schon reichen. Leider fehlen beim Steuerbericht aber die Steueranteile mit 0% MwSt. (in der Regel Auslandsbestellungen). Klar, warum sollten diese auch auftauchen, es wird ja keine Steuer berechnet. Leider möchte das Finanzamt aber genau diese Umsätze auch aufgeschlüsselt haben.

Zunächst: Berichte verstehen

ACHTUNG: Bevor ihr irgend etwas macht, müssen die Berichte aktuell sein. Es hat mich etwas Zeit gekostet zu erkennen, dass meine nicht aktuell sind, dadurch stimmen die Zahlen nicht mehr. Unter Bericht -> Statistiken aktualisieren alle auswählen und „Gesamt-Statistiken aktualisieren“ auswählen.

Mehr als die 2 angesprochenen Berichte braucht man eigentlich nicht. Zunächst sollte man aber verstehen, was einem da angezeigt wird.

Bericht: Bestellungen

Durch die Filter kann man alle möglichen Zeiträume, Übersichten und Co erstellen lassen. Ich habe folgende Einstellungen gewählt:

  • Bestellerstellungs-Datum
  • Zeitraum: Monat
  • 01.01.2015 bis 31.03.2015 (erstes Quartal)
  • Leere Zeilen: Nein
  • Akutelle Werte: Nein

Dadurch wird mir eine Tabelle angezeigt, die nach Monaten getrennt ist und in der letzten Zeile eine Gesamtsumme.

Die Punkte

  • Zeitraum
  • Bestellungen
  • Verkaufte Artikel

sollten selbsterklärend sein.

  • Gesamt: Die Gesamtsumme der Einnahmen inklusive aller Steuersätze. Also egal ob 0%, 19% oder 7% MwSt. Die Gutschriften wurden hier noch NICHT abgezogen. Stornierte Bestellungen sind hier nicht enthalten.
  • Berechnet: Die Summe der in Rechnung gestellten Beträge. Also der Beträge für die eine Rechnung ausgestellt worden ist. Sind keine Bestellungen mehr offen (oder on hold), sollten die Werte „Gesamt“ und „Berechnet“ identisch sein. Stornierte Bestellungen sind hier nicht enthalten.
  • Erstattet:  Die Summe der erstellten Gutschriften im Berichtszeitraum. Stornierte Bestellungen sind hier nicht enthalten.
  • Steuer: Der gesamte Steuerbetrag im Berichtszeitraum zusammengesetzt aus 19% und 7% MwSt. 0% MwSt. sind hier natürlich nicht enthalten.Stornierte Bestellungen sind hier nicht enthalten.

Die nächsten 3 Punkte

  • Versand: Gesamtsumme der Versandkosten ohne Steuer. Stornierte Bestellungen sind hier nicht enthalten.
  • Rabatt: Gesamtsumme des gewährten Rabatt
  • Storniert: Stornierte Bestellungen, also Bestellungen die vor der Rechnungserstellung geschlossen wurden. Diese tauchen nicht in den Statistiken auf und können ignoriert werden.

Sind zusätzliche Informationen, werden aber nicht für die Steuerberechnung benötigt.

Bericht: Steuer

Hier verwende ich genau die selben Filtereinstellungen und erhalte folgende Spalten:

  • Zeitraum: Berichtszeitaum
  • Steuer: Die Bezeichnung der verschiedenen Steuern. Magento verwaltet jeweils einen Steuersatz für verschiedene Länder. Es sollten eigentlich nur 19% und 7% MwSt. Steuersätze auftauchen.
  • Satz: Der verwendete Steuersatz nochmals als Zahl
  • Anzahl der Bestellungen: Die Anzahl der Bestellungen mit diesem Steuersatz
  • Steuerbetrag: Gesamtbetrag der Steuern. Dieser sollte identisch sein mit dem Betrag vom Bericht „Bestellungen“.

Wo sind die Rechnungen mit 0% Mehrwertssteuer?

Die Frage ist etwas trickreich denn im Steuerbericht taucht nirgends ein 0% Steuersatz auf. Hier können wir also nicht schauen. Der Gesamtbetrag der Rechnungen mit 0% Mehrwertssteuer kann nur berechnet werden und wird nirgends angezeigt. Dazu verwende ich den Bestell-Bericht:

  • G0 = Der gesuchte Gesamtbetrag der Rechnungen mit 0% MwSt.
  • G = Gesamtbetrag „Gesamt“ aus Bericht
  • S = Gesamtsteuerbetrag „Steuer“ aus Bericht

G0 = G – ( S * 100 * 1,19 / 19 )

Die Rechnung ist ganz einfach erklärt. Mit der Rechnung in der Klammer, erhalte ich den Bruttobetrag aus dem Steuerbetrag S und ziehe diesen vom Gesamtbetrag ab. Übrig bleiben sollte der Gesamtbetrag der Rechnungen mit 0% MwSt.

ACHTUNG: Durch die Berechnung des Bruttobetrags aus dem Steuerbetrag kommt es sehr schnell zu Rundungsfehlern! Diese sollten sich aber im Cent-Bereich bewegen.

Die Gesamtanzahl der Bestellungen mit 0% MwSt. erhält man durch einen Vergleich der Gesamtbestellung aus dem Steuerbericht und der Anzahl der Bestellungen aus dem Bestellbericht. Hat man mehr Bestellungen im Bestellbericht als im Steuerbericht, hatte man auch Bestellungen ins Ausland.

Aufschlüsselung nach 7% und 19% MwSt.

Die Aufteilung in 7% und 19% MwSt. sollte jemder mit ein bisschen Mathematik aus dem Steuerbericht selbst hinkriegen.

Fazit

Das Berichtswesen von Magento gibt einem zwar alle Informationen die man braucht, aber nicht gerade schön aufbereitet. Es hat mich etwas Zeit und viel Testerei gebraucht, bis ich komplett hinter das System gestiegen bin. Was tut man nicht alles, um das Finanzamt glücklich zu machen ;).

Mehrere robots.txt für unterschiedliche Shops in Magento

Hallo Leute,

nutzt man die Multishop-Fähigkeit von Magento darf man mit allerhand Dingen jonglieren. So auch mit der robots.txt. Meine robots.txt sieht wie folgt aus:

User-agent: *
Disallow: /*.js$
Disallow: /*.css$
Disallow: /*.php$
Disallow: /customer/
Disallow: /review/
Disallow: checkout/
Disallow: /admin/
Disallow: /app/
Disallow: /skin/
Disallow: /var/
Disallow: /wishlist/
Sitemap: https://www.blubberladen.de/media/sitemap/blula/sitemap.xml

Da die robots.txt aber im root-Verzeichnis liegt und ich mehrere Shops mit einer Magento Instanz habe, müsste ich eigentlich zwei verschiedene robots.txt für beide Shops haben. Nichts leichter als das.

Mehrere robots.txt mittels .htaccess

Fügt in der .htaccess-Datei im root-Verzeichnis von Magento folgendes bei Zeile 116 ein:

############################################
## enable rewrites

    Options +FollowSymLinks
    RewriteEngine on

###########################################
## different robots.txt for both sites

    # Page1
    RewriteCond %{HTTP_HOST} blubberladen\.de$
    RewriteRule ^robots\.txt$ /robots-blula.txt [L]

    # Page 2
    RewriteCond %{HTTP_HOST} bier-kaufen\.de$
    RewriteRule ^robots\.txt$ /robots-bika.txt [L]

Bei mir sind es blubberladen.de und bier-kaufen.de (das www spielt dabei keine Rolle) die unterschieden werden sollen.  Wenn die robots.txt der entsprechenden Webseite aufgerufen wird, wird diese auf robots-bika.txt bzw. robots-blula.txt umgeleitet.

So einfach kann man mehrere robots.txt in einer Magentoinstallation einstellen.

Update 13.09.2014

Na ich bin ja einer, verbiete den Bots auf /media/ zu gehen und stell dort meine Sitemap zur Verfügung… Ist gefixt.

Vollständige URLs in Dataflow exportierten CSV-Dateien von Magento

Hallo Leute,

Preisvergleichsportale sind ein gutes Mittel um kontrolliert Kunden auf seinen Onlineshop los zu lassen. Dazu nötig ist aber eine CSV-Datei, die alle nötigen Daten enthält. Dies kann man erreichen, indem man sich entweder teure Plugins kauft oder die etwas komplizierte Funktion von Magento nutzt. Es gibt dabei allerdings ein kleines Problem, welches ich mit diesem Beitrag lösen möchte.

Das Problem

Das Problem auf welches ich beim Export von Produktdaten in eine CSV-Datei gestoßen bin: Wenn man die URL zu Produktbildern in der exportierten CSV-Datei haben möchte, wird nicht die vollständige URL angezeigt, also:

p/r/produkt.jpg

statt

https://website.de/media/catalog/product/p/r/produkt.jpg

Die Lösung

Die Lösungsidee klingt simpel: Ich möchte einen Prefix-String vor die Ausgabe schreiben. Klingt einfach, aber benötigt ein wenig Arbeit am Quelltext.

Zunächst muss eine eigenes MapperModel geschrieben werden. Erstellt dazu eine Datei und die fehlenden Ordner in

app/code/local/Mage/Dataflow/Model/Convert/Mapper/MyColumn.php

mit folgendem Inhalt:

<?php
class Mage_Dataflow_Model_Convert_Mapper_MyColumn extends Mage_Dataflow_Model_Convert_Mapper_Column
{
    public function map()
    {
        $batchModel  = $this->getBatchModel();
        $batchExport = $this->getBatchExportModel();

        $batchExportIds = $batchExport
            ->setBatchId($this->getBatchModel()->getId())
            ->getIdCollection();

        $onlySpecified = (bool)$this->getVar('_only_specified') === true;

        if (!$onlySpecified) {
            foreach ($batchExportIds as $batchExportId) {
                $batchExport->load($batchExportId);
                $batchModel->parseFieldList($batchExport->getBatchData());
            }

            return $this;
        }

        if ($this->getVar('map') && is_array($this->getVar('map'))) {
            $attributesToSelect = $this->getVar('map');
        }
        else {
            $attributesToSelect = array();
        }
        if ($this->getVar('prepend') && is_array($this->getVar('prepend'))) {
                $prepend = $this->getVar('prepend');
        } else {
                $prepend = array();
        }
        if (!$attributesToSelect) {
            $this->getBatchExportModel()
                ->setBatchId($this->getBatchModel()->getId())
                ->deleteCollection();

            throw new Exception(Mage::helper('dataflow')->__('Error in field mapping: field list for mapping is not defined.'));
        }

        foreach ($batchExportIds as $batchExportId) {
            $batchExport = $this->getBatchExportModel()->load($batchExportId);
            $row = $batchExport->getBatchData();

            $newRow = array();
            foreach ($attributesToSelect as $field => $mapField) {
                $prepend_2 = isset($prepend[$field]) ? $prepend[$field] : '';
                $newRow[$mapField] = isset($row[$field]) ? $prepend_2 . $row[$field] : null;
            }

            $batchExport->setBatchData($newRow)
                ->setStatus(2)
                ->save();
            $this->getBatchModel()->parseFieldList($batchExport->getBatchData());
        }

        return $this;
    }
}

Es handelt sich dabei um eine Kopie der Funktion map() aus der Datei /app/code/core/Mage/Dataflow/Model/Convert/Mapper/Column.php mit kleineren Anpassungen in Zeile 30-34 und Zeile 49-50. Im Grunde haben wir uns jetzt eine eigene Funktion geschaffen, der wir eine weitere Variable „prepend“ übergeben können, welche dann zu den Werten einer bestimmten Spalte hinzugefügt wird.

Nun müssen wir noch die Datei

app/code/core/Mage/Dataflow/Model/Convert/Profile/Collection.php

in das Verzeichnis

app/code/local/Mage/Dataflow/Model/Convert/Profile/Collection.php

kopieren und eine Zeile im Code anpassen (Achtung dazu muss ein weiterer Ordner hinzugefügt werden). Sucht nach folgender Passage im Code (müsste bei Zeile 165 sein):

 /** @var $varNode Varien_Simplexml_Element */
            foreach ($actionNode->var as $key => $varNode) {
                if ($varNode['name'] == 'map') {
                    $mapData = array();
                    foreach ($varNode->map as $mapNode) {
                        $mapData[(string)$mapNode['name']] = (string)$mapNode;
                    }
                    $container->setVar((string)$varNode['name'], $mapData);
                }  else {

und erweitert die if-Abfrage wie folgt:

 /** @var $varNode Varien_Simplexml_Element */
            foreach ($actionNode->var as $key => $varNode) {
                if ($varNode['name'] == 'map' || $varNode['name'] == 'prepend') {
                    $mapData = array();
                    foreach ($varNode->map as $mapNode) {
                        $mapData[(string)$mapNode['name']] = (string)$mapNode;
                    }
                    $container->setVar((string)$varNode['name'], $mapData);
                }  else {

Dies ist nötig, damit die Variable mit dem Namen „prepend“ auch aufgelöst wird.

Funktionsweise

Die Funktionsweise kann man am besten an einem Beispiel erklären. Ich habe dazu in der Administrationsoberfläche von Magento über System -> Import/Export -> Dataflow – Erweiterte Profile ein Profil angelegt.

2014-07-17 09_53_02-Erweiterte wiederkehrende Leistungen _ Import und Export _ System _ Magento Admi

 

Das erstellte Beispiel soll SKU (Artikelnummer), Artikelname und das Produktfoto in eine CSV exportieren.

<action type="catalog/convert_adapter_product" method="load">
	<var name="store"><![CDATA[2]]></var>
	<var name="filter/qty/from"><![CDATA[1]]></var>
	<var name="filter/qty/to"><![CDATA[999999999]]></var>
	<var name="filter/status"><![CDATA[1]]></var>
</action>

<action type="catalog/convert_parser_product" method="unparse">
	<var name="store"><![CDATA[2]]></var>
</action>

<action type="dataflow/convert_mapper_myColumn" method="map">
	<var name="map">
		<map name="sku"><![CDATA[Artikelnummer]]></map>
		<map name="name"><![CDATA[Artikelbezeichnung]]></map>
		<map name="image"><![CDATA[image]]></map>
	</var>
	<var name="prepend">
		<map name="image"><![CDATA[https://www.bier-kaufen.de/media/catalog/product]]></map>
	</var>
	<var name="_only_specified">true</var>
</action>

<action type="dataflow/convert_parser_csv" method="unparse">
	<var name="delimiter"><![CDATA[,]]></var>
	<var name="enclose"><![CDATA["]]></var>
	<var name="fieldnames">true</var>
</action>

<action type="dataflow/convert_adapter_io" method="save">
	<var name="type">file</var>
	<var name="path">var/export/bika/</var>
	<var name="filename"><![CDATA[products.csv]]></var>
</action>

Da vielleicht nicht jeder schon mit Dataflow-XML-Dateien gearbeitet hat, möchte ich dieses kleine Beispiel zerlegen und erklären. Die XML teilt sich in 5 Bereiche auf:

<action type="catalog/convert_adapter_product" method="load">
	<var name="store"><![CDATA[2]]></var>
	<var name="filter/qty/from"><![CDATA[1]]></var>
	<var name="filter/qty/to"><![CDATA[999999999]]></var>
	<var name="filter/status"><![CDATA[1]]></var>
</action>

<action type="catalog/convert_parser_product" method="unparse">
	<var name="store"><![CDATA[2]]></var>
</action>

In diesem ersten Bereich werden allgemeine Artikelfilter festgelegt. Als z.B.:

  • Es soll store=2 (der Shop den ich verwenden möchte) verwendet werden
  • Es sollen nur Artikel angezeigt werden, mit einem Lagerbestand von 1 bis 999999999
  • Es sollen nur Artikel angezeigt werden, deren status=1 (aktiv) ist.
<action type="dataflow/convert_mapper_myColumn" method="map">
	<var name="map">
		<map name="sku"><![CDATA[Artikelnummer]]></map>
		<map name="name"><![CDATA[Artikelbezeichnung]]></map>
		<map name="image"><![CDATA[BildURL]]></map>
	</var>
	<var name="prepend">
		<map name="image"><![CDATA[https://www.bier-kaufen.de/media/catalog/product]]></map>
	</var>
	<var name="_only_specified">true</var>
</action>

Hier ist nun der interessante Bereich, weswegen der ganze Aufwand getrieben wird. Die Map-Funktion mapped das Feld in der Datenbank auf das Feld in der CSV-Datei. In diesem Beispiel also:

  • Datenbankfeld  „sku“ wird auf die Spalte „Artikelnummer“ in der CSV gemapped
  • Datenbankfeld „name“ wird auf die Spalte „Artikelbezeichnung“ in der CSV gemapped
  • Datenbankfeld „image“ wird auf die Spalte „BildURL“ in der CSV gemapped

Bitte beachtet, dass hier unser eigener Mapper type=“dataflow/convert_mapper_myColumn“ statt dem normalen type=“dataflow/convert_mapper_Column“ verwendet wird.

In der zweiten Variable „prepend“ legen wir dann fest, dass das Feld „image“ noch zusätzlich den Prefix „https://www.bier-kaufen.de/media/catalog/product“ vorangestellt werden soll. Dies kann natürlich mit jedem anderen Feld auch gemacht werden.

<action type="dataflow/convert_parser_csv" method="unparse">
	<var name="delimiter"><![CDATA[,]]></var>
	<var name="enclose"><![CDATA["]]></var>
	<var name="fieldnames">true</var>
</action>

In diesem Teil der XML wird festgelegt wie die CSV-Datei aussehen soll. Also was als Separator verwendet werden soll, oder dass die erste Zeile die Spaltenbezeichnung sein soll.

<action type="dataflow/convert_adapter_io" method="save">
	<var name="type">file</var>
	<var name="path">var/export/bika/</var>
	<var name="filename"><![CDATA[products.csv]]></var>
</action>

Am Schluss legen wir dann nur noch fest, wo die Datei gespeichert wird. Wenn wir nun den Export starten, fällt eine CSV-Datei mit dem gewünschten Inhalt und einer kompletten URL beim Bild heraus.

Fazit

Ich finde es schade, dass Magento eine solche Funktionalität nicht schon von Haus aus mitbringt. Bei der Recherche einer Lösung bin ich auf viele Betroffene gestoßen. Die hier beschriebene Umsetzung ist leider auch nicht 100%-ig schön, weil wir die „Collection.php“ komplett mit einer Eigenen ersetzen. Wenn hier jemand bessere Lösungen hat, immer her damit :). Man sollte bei jedem Update von Magento zur Sicherheit prüfen, ob noch alles so funktioniert, wie gewollt.

Mir haben bei der Lösungsfindung zwei Blog- bzw. Stackoverflow-Beiträge geholfen:

  • http://stackoverflow.com/questions/21789380/magento-advanced-profiles-export-prepend-url-to-image-path um zu verstehen was geändert werden muss
  • http://www.magentocommerce.com/knowledge-base/entry/introduction-to-magento-dataflow um zu verstehen wie Dataflow arbeitet

Ich würde mich über Feedback sehr freuen 🙂 und hoffe dem einen oder anderen weitergeholfen zu haben.

Wie wehre ich mich gegen Werbepost am Beispiel kaffee-partner.de

Halli Leute,

wenn man ein Unternehmen gründet kommt man schnell in diverse Verzeichnisse und kann sich bald vor Werbepost nicht mehr retten. Aber auch privat kommt oft viel Unerwünschtes. Ich möchte euch einige Mittel vorstellen, wie ihr euch aktiv dagegen wehren könnt. Das Ganze geht natürlich am Besten an einem Beispiel und ich habe hierzu die besonders hartnäckige Firma „Kaffee Partner“ gewählt. Zunächst aber erst mal ein paar allgemeine Punkte.

Wie kann ich mich gegen unverwünschte Werbepost wehren?

1. Eintragen in die Robinson-Liste

Die Robinsonliste ist eine Schutzliste, in die sich jeder eintragen kann. Seriöse Firmen prüfen, bevor sie Werbepost verschicken, ob die Adresse hier eingetragen ist. Ist dies der Fall, wird die Werbepost nicht versandt. Natürlich halten sich nicht alle Firmen an die Liste, aber die Werbeflut wird enorm verkleinert.

Der Eintrag in die Robinsonliste geht über die Website: www.robinsonliste.de

2. Aktiv die Weiternutzung der Daten verbieten und die Löschung von Personenbezogenen Daten verlangen

Die Werbepost einfach weg zu werfen ist der falsche Weg. Klar geht es schnell, aber wenn man sich nicht wehrt, wird die Werbeflut nur größer und größer. Jeder deutsche Staatsbürger hat das Recht, die Lösung seiner Daten zu verlangen und darf natürlich auch die weitere Nutzung untersagen. Hierzu gibt es verschiedene Blankos im Internet. Ich habe mich an Folgendem orientiert:

Sehr geehrte Damen und Herren,

in Ihrer Kundendatei sind personenbezogene Daten meine Person betreffend gespeichert. Für den Fall einer Weiterveräußerung dieser Daten widerrufe ich meine Einwilligung in die Nutzung, Speicherung und Weitergabe und fordere Sie auf, gemäß § 35 Bundesdatenschutzgesetz (BDSG) alle Daten, die Sie von mir gespeichert haben, unverzüglich zu löschen.

Ich bitte Sie, dafür zu sorgen, dass die Löschung auch von den Stellen durchgeführt wird, denen Sie meine Daten übermittelt haben, insbesondere auch von Unternehmen, die Daten in Ihrem Auftrag verarbeiten.

Bitte bestätigen Sie mir kurz die Berücksichtigung meines Widerrufs und den umfänglichen Vollzug der Datenlöschung.I ch setze Ihnen zur Erfüllung meiner Forderungen eine Frist bis zum [Eine Frist von 2 Wochen ab Zusendung der Unterlassungserkläurng]. Sollten Sie dieses Schreiben ignorieren, werde ich mich an den zuständigen Landesdatenschutzbeauftragten wenden. Außerdem behalte ich mir weitere rechtliche Schritte vor.

Diesen Text in euren Briefkopf packen, unterschreiben und per Post oder Fax an die Firma senden. Beides sind rechtssichere Wege und beim Fax habt ihr sogar noch den Vorteil einer Sende-/Empfangsbestätigung.

3. Selbst Daten sammeln

Für die spätere Beweisführung ist es besonders wichtig, dass ihr alle Schreiben und Briefumschläge aufhebt. Also, das Schreiben an sich und sogar das Kuvert in dem es euch zugesandt wurde. Auch das Schreiben, das ihr an die Firma sendet ist wichtig, sowie jeglicher sonstige Schriftverkehr.

Ihr werdet euch jetzt fragen, warum man diesen Aufwand treiben muss, aber wenn gar nichts mehr hilft kann man sich auch an den Datenschutzbeauftragten wenden oder weitere rechtliche Schritte einleiten und dann ist der Schriftwechsel Gold wert.

4. Den Landesbeauftragten für Datenschutz einschalten

Wenn alles nichts hilft und ihr trotz Unterlassungserklärung weiter Post erhaltet, empfehle ich euch den „sanften rechtlichen Weg“. Wer hätte es geglaubt, aber jedes Bundesland hat einen eigenen Beauftragten für Datenschutz. Die sind genau für sowas zuständig und der Ablauf ist ziemlich einfach. Sucht euch zunächst den richtigen Datenschutzbeauftragten raus. Es ist immer der Beauftragte des Bundeslandes zuständig, in welchem die Werbefirma sitzt (im Fall Kaffee-Partner, Osnabrück z.B. Niedersachsen). Eine Liste der Beauftragten ist hier zu finden: https://www.datenschutz-bayern.de/ (Menüpunkt „Zuständigkeiten“). Dann einfach eine Email mit einer kurzen Fallbeschreibung an die richtige Stelle senden und fertig ist das Ganze.

Ich habe leider noch keine Erfahrungen, in wiefern man hier dann Antwort erhält, was unternommen wurde oder was man noch machen kann. Ich werde euch aber im aktuellen Fall Kaffee Partner auf dem laufenden halten.

Der Fall Kaffee-Partner

Ich habe euch nun ein paar Tricks gezeigt wie man sich gegen lästige Werbefirmen wehren kann. Ein besonders hartnäckiger Fall ist Kaffee-Partner.de und ich möchte euch kurz zeigen, was ich unternommen habe.

Kaffee-Partner vertreibt Vollautomaten, Leihverträge und Leasingzeugsel rund um Kaffee und sitzt in Osnabrück. Da ich keinen Kaffee trinke, ist das für mich eher uninteressante Werbung und ich habe der Zustellung zu 100% nicht zugesagt.

14.12.2013 – Erste Werbebotschaft

Kaffee Partner unerwünschte Werbung Kaffee Partner unerwünschte Werbung

Ich habe von „Kaffee Partner“ per Post direkt an mich einen Werbeflyer
erhalten. Die Adresse war „Timo Schindler, Hard- und Softwarehandel…“. Ich habe diesen Firmennamen lediglich bei der Gewerbeanmeldung verwendet. Die Daten sind offenbar
aus dem Register entnommen worden. Die Werbung ist total toll personalisiert und ich fühle mich natürlich sofort angesprochen und bin interessiert….. nicht.

15.12.2013 – Aufforderung zur Löschung meiner Daten

Schreiben für Kaffee Partner

Ich habe mir schon ein hübsches Blanko zurecht gelegt und investiere gerne das Porto. Bei den meisten Firmen klappt das super und die lästige Werbung war einmal. Gesagt getan, die Firma Kaffee-Partner hat Post von mir erhalten und wurde über meinen Widerruf der Einwilligung (die ich nie gegeben habe) und Löschung meiner personenbezogenen Daten informiert bzw. aufgefordert. Der Text stammt von einem Blanko und darf gerne von jedem weiter verwendet werden.

23.05.2014 – Zweite Werbebotschaft

Kaffee Partner unerwünschte Werbung Kaffee Partner unerwünschte Werbung

 

kaffee-partner6

Wieder habe ich Post von „Kaffee Partner“ erhalten. Aber hey, sie haben diesmal immerhin hübsches Hochglanzpapier verwendet. Am Schreiben selbst hat sich aber nichts geändert. Ich hab euch auch mal den Kuvert eingescannt. „Infopost“ ist aber ein schöner Name für Spam… Offenbar hat also meine Aufforderung nichts gebracht.

26.05.2014 – Landesdatenschutzbeauftragter ist eingeschaltet

Nach einem sehr netten Telefonat mit dem bayrischen und niedersächsischen Leuten für Datenschutz habe ich, wie oben beschreiben, eine Email mit allen Daten an die richtige Stelle geschickt. Nun heißt es mal abwarten, was weiter passiert. Ich werde euch mit Updates auf dem Laufenden halten.

Fazit – Bringt das überhaupt was?

Ich praktiziere diese „Techniken“ nun schon seit etwa einem Jahr und muss sagen, das sich die Flut der Werbepost deutlich verringert hat. Lediglich ein paar hartnäckige Fälle sind dabei. Von manchen erhält man sogar sehr nette „Entschuldigungsschreiben“ und wird informiert, das sowas ja natürlich nicht mehr passiert. Hier ein Beispiel von Daimler:

daimler1 daimler2Der Fall kaffee-partner.de zeigt aber auch, das es einige lästige und nervige Amateur-Vereine gibt, die sich nicht an geltendes Recht halten. Diesen kann man nur auf den Schlips treten, in dem man sich wehrt. In diesem Sinne: Happy Brief-schreibing ;).

 

Die Frechheit von Onlinekunden

Es ist schon etwas länger her, aber ich möchte euch nicht die Geschichte dieser einen Bestellung vorenthalten. Einer meiner Kunden kauft bei mir im Onlineshop eine sehr schöne Wasserpfeife ein und ein wenig Tabak dazu. Natürlich freue ich mich über jede Bestellung und so kommt auch diese Pfeife samt Zubehör beim vermeintlich glücklichen Kunden an. Zumindest war er dies am Anfang, denn nach ca. 6 Monaten erhalte ich eine Email die etwa so klang:

Jo Alter,

mir gefällt meine Wasserpfeife nicht mehr und will mein Geld zurück!

Die Anrede ist Original! Ich bin davon ausgegangen, dass etwas an der Wasserpfeife defekt sei und so habe ich nachgefragt was denn kaputt ist. Ich musste die Bestellung über die Emailadresse zuordnen, denn von einem aussagekräftigen Betreff, Angabe der Bestellnummer oder Namen halten manche wohl nichts. Der Kunde hat dann geantwortet, dass nichts kaputt sei, er sich aber eine bessere kaufen möchte und deshalb das Geld für die „alte“ Pfeife zurück haben möchte. Ich musste ja schon etwas schmunzeln, aber hey: Versuchen kann mans ja mal. Sagt ja keiner was.

Ich erklärte ihm dann höflich, dass dies leider nicht möglich ist und habe ihm sogar einen Rabatt auf eine neue Wasserpfeife angeboten (manchmal bin ich zu nett). Die Antwort die dann kam, hat mir die Sprache verschlagen:

Ich bin erst 15 Jahre alt, entweder du gibst mir das Geld zurück oder ich zeige dich an.

Zur Erinnerung: Tabak darf man erst ab 18 kaufen. Dann habe ich etwas nachgeforscht. Der Account: Gefälscht, dort steht er ist 18. Das Konto: Von seiner Mutter. Er hat sich also mit offensichtlichem Wissen der Mutter einen gefälschten Account bei meinem Onlineshop erstellt und hat dann versucht mich zu erpressen. Manche Kunden sind schon echt der Wahnsinn ;).

Best of Aktionen meiner Kunden

Hier mal eine kleine Sammlung der „Best of“-Emails meiner Kunden:

Verirrter Kunde

Eines Tages erreichte mich eine Email über das Kontaktformular mit folgendem Inhalt:

Ich habe bei ihnen Ware bestellt, aber kein Kundenkonto erstellt.

Das war der gesamte Inhalt der Nachicht. Kein Name, kein Betreff. Nichts! Als ich dem Kunden dann erklärte, dass eine Bestellung ohne Kundenkonto nicht möglich sei kam folgende Antwort:

Dann habe ich wohl doch ein Konto.

Es hat sich herausgestellt, dass er bei einem anderen Onlineshop bestellt hat ;).

Lob von Kunden für den Onlineshop

Guten Tag,

haben Sie meine Bestellung schon versendet? Wenn ja haben Sie das sehr gut gemacht.

Die Email hat mich wieder ins Kleinkindalter zurückversetzt, ich hab mich aber trotzdem drüber gefreut was richtig gemacht zu haben.

Erotik im Kundengespräch

haben ja gerade telefoniert

höchst erotische stimme haste ;D

Danke. Ich weiß 😉