Besuch auf dem eCommerce Camp 2015!

veröffentlicht in Communication,Software Engineering am 17. Mrz. 2015 Tags: , , ,

logo_400x400

In diesem Jahr hat es mich das erste Mal auf das eCommerce Camp nach Jena verschlagen. Dies ist ein Barcamp, das heißt, hier werden die Vorträge nicht von der Organisation geplant, sondern jeder kann kommen und über ein beliebiges Thema reden. Bei der Session Planung wird zu Beginn abgestimmt, ob andere Teilnehmer etwas über das Thema hören möchten.

Dem Namen des Camps entsprechend ging es in diesem Jahr um eCommerce. Die unterschiedlichen Akteure, wie Shop-Betreiber, Hoster, Shop-Hersteller, diverse Agenturen und andere interessierte Teilnehmer, sorgten für ein spannendes Event. Zu den verschiedenen Sessions gab es eine große Vielzahl von Vorträgen. Vertreten waren Entwickler und Integratoren von Magento, OXID, Shopware, SPHERE.IO, Spryker und PrestaShop. Dennis Heidmann von Intershop hielt einen interessanten Vortrag über die Migration von OXID in Intershop.

Ich war mit zwei Sessions vertreten. Die erste Session „Kann ERP auch Shop? Odoo v8 – ein neuer Ansatz“ hatte ich im Vorfeld schon vorbereitet. In dieser bin ich besonders auf die Funktionen des website_sale Moduls von Odoo eingegangen. Bei diesem Modul handelt es sich um ein Shop-Frontend. Ich habe dargestellt, wie man im B2B-Handel neue Wege gehen kann, welche mit einem klassischen Shop-System oder einem traditionellen CRM schwer umsetzbar wären. Meine Präsentation könnt ihr euch hier ansehen.

In der zweiten Session habe ich Odoo als ERP-System für eCommerce vorgestellt. In einer Live-Demo habe ich von unseren Erfahrungen mit Odoo berichtet. Dabei habe ich gezeigt, wie Odoo genutzt werden kann, um die Probleme und Herausforderung eines Online-Händlers im Bereich Order-Abwicklung, Finanzsteuerung und Controlling zu lösen. Des Weiteren bin ich darauf eingegangen, wie wir von initOS Projekte so umsetzen, dass unsere Kunden auch für die nächsten Wachstumsstufen bereit sind. Ich freue mich, dass die Sessions bei den Zuhörern sehr gut angekommen sind.

Loben möchte ich die familiäre Atmosphäre sowie das gute Essen. Ich werde meinen Kollegen ausführlich vom Camp berichten und bin mir sicher, dass ich im nächsten Jahr mit kollegialer Verstärkung dabei sein werde.

Über Markus Schneider

Als Analytiker und Informatiker ist Markus Schneider Experte für Shop- und ERP-Systeme. Dabei setzt er sein fundiertes Wissen insbesondere im Bereich der Open Source Software ein und kann verschiedene
Anwendungssysteme, z.B. Oxid eSales, OTRS, und Solr Suche, darin integrieren. Auch mit der Onlineshopsoftware Magento kennt sich Herr Schneider bestens aus. Zudem greift er auf gesammelte Erfahrungen unterschiedlicher Systeme wie Sage, SAP und speziell OpenERP / Odoo zurück.

Odoo Community News 2015.01

veröffentlicht in Consulting,Software Engineering am 20. Jan. 2015 Tags: ,

Auch im neuen Jahr möchten wir Euch mit den Neuigkeiten von Odoo und OpenERP auf dem Laufenden halten.

Odoo Community Association News

Die Continues Intergration „Runbot“ der Odoo Community ist jetzt verfügbar. Hier wird jegliche Änderung an OCB und allen Odoo Modulen automatisch getestet. Damit stehen jetzt neben der CI von travis-ci.org zwei parallele Testumgebungen zur Verfügung.
Das neue Projekt der OCA ist die connector telephony. Hier werden nicht nur Module für den Odoo Asterisk connector gesammelt, sondern alle Anpassungen für eine einfache Integration mit verschiedenen Telefonanlagen.

Odoo – deutsche Lokalisierung

Zusammen mit anderen deutschen Partnern arbeiten wir an der deutschen Lokalisierung von Odoo und verwalten zusätzliche Module hierfür unter dem Schirm der OCA. Wer mehr Informationen darüber erhalten möchte, wie sich die OCA die deutsche Lokalisierung vorstellt, für den wurde hier eine Präsentation erstellt. In dieser wird sehr anschaulich erklärt, wie die OCA aufgebaut ist, welche Ziele und Konzepte realisiert werden, wie die Mitarbeit funktioniert und welche Richtlinien dabei zu beachten sind.
Die Repositories der Modulentwicklung für die deutsche OCA Lokalisierung kann man unter diesem Link einsehen.

Odoo v8

Bei Odoo v8 gibt es allerhand Neues zu entdecken. So wurde das connector_odbc Modul entwickelt, um beliebige Datenbanken aber auch Datenquellen, die das ODBC Interface unterstützen, in Odoo zu integrieren, um den Datenim- und export zu ermöglichen.
Neu ist auch eine Vielzahl von POS Modulen, die bei der Anpassung von Kassensystemen behilflich sind. Sie ermöglichen die Verfügbarkeit verschiedener Features von Version 8 auch in Version 7, sowie die Versionsunterstützung von Kreditkartenlesern oder LCD-Displays.

Ein weiteres außerordentlich nützliches Modul ist vertical-community, bei dem man ganz einfach eine Community Plattform bei Odoo bauen kann. Hier werden hilfreiche Apps und Module gebündelt, um grundlegende Bedürfnisse von Non-Profit-Organisationen zu managen. Es eignet sich demnach hervorragend fürs Crowdfunding und Coworking. Die Währung (e-Wallet) ist hierbei vollständig in den finanziellen Teil von Odoo integriert.

Odoo ist für eine komplexe Businessanwendung, im Vergleich zu vielen anderen Systemen, schon sehr übersichtlich aufgebaut und legt großen Wert auf die einfache Bedienung. Dennoch wünscht sich der ein oder andere Nutzer bei manchen Formularen einen schnelleren Zugriff auf eine Hilfe zu bekommen, bei der er das Wissen, z.B. von einer Anwendungsschulung, nachschlagen kann. Dafür gibt es jetzt das Modul „Help online“, durch das ermöglicht wird, die Hilfe direkt bei den Funktionen von Odoo zu integrieren.

OpenERP v7

Auch in OpenERP v7 hat sich so einiges getan, von dem wir Euch berichten möchten.
Wer viel mit Gantt Chart arbeitet, den wird es freuen, dass es ein neues Modul gibt, welches eine verbesserte Gantt Chart-Darstellung und -Benutzung erlaubt. Dies könnt Ihr unter diesem Link einsehen.
Eine andere Neuerung ist, dass nun auch das Modul für den Barcode mit Webkit in OpenERP v7 verwendbar ist. Denn bisher konnte man dieses Modul nur im Standard bei Odoo v8 im qweb benutzen. Hier nochmal der Link zu diesem Modul.

Modul_parent_dependecies ist ein interessantes kleines Modul, das Euch das Leben mit den Updates vereinfachen soll. Hiermit kann man einfacher sehen, welche Module mit dem Update auch geupdatet werden. Ihr behaltet mit diesem Modul den Überblick.
Beim Development Mode Modul handelt es sich um Live- und Testsysteme. Dies ist ein Modul, das beim Einstellen von Datenbanken für den Test- und Entwicklungsmodus hilfreich ist.

OpenMRP

Auch zu den Neuerungen bei OpenMRP sei kurz etwas gesagt. Die Neuheit hier ist eine OpenERP Modul-Sammlung für die Abbildung eines produzierenden Betriebs. Veröffentlicht wurde der Code hier.

Zum Schluss möchten wir Euch noch eine neue Plattform vorstellen, auf der man jetzt alle Apps finden kann. Sie nennt sich Odoo Apps und ist sehr übersichtlich gestaltet worden. Neu an ihr ist vor allem, dass der Support für Githup Repositories integriert ist.

Über Markus Schneider

Als Analytiker und Informatiker ist Markus Schneider Experte für Shop- und ERP-Systeme. Dabei setzt er sein fundiertes Wissen insbesondere im Bereich der Open Source Software ein und kann verschiedene
Anwendungssysteme, z.B. Oxid eSales, OTRS, und Solr Suche, darin integrieren. Auch mit der Onlineshopsoftware Magento kennt sich Herr Schneider bestens aus. Zudem greift er auf gesammelte Erfahrungen unterschiedlicher Systeme wie Sage, SAP und speziell OpenERP / Odoo zurück.

Robust Data Import/Export in Odoo Using connector_flow as a Basis

veröffentlicht in Consulting,Software Engineering am 9. Dez. 2014 Tags: , , ,

This is the English translation of Robuster Daten-Import/Export in Odoo auf Basis von connector_flow.

An ERP system is normally not a self-contained IT system, but instead incorporated into a multitude of processes that require interaction with other systems, for example the import of the product master data of an Excel catalogue, the transfer of orders to a logistics service provider via FTP or enabling a bank to import account movements. Although other programs can indeed access Odoo (for example via RPC or REST-API), a solution that can be directly implemented in Odoo is normally the easiest solution for all tasks that extend past pure data conversion.
This is where our Odoo module connector_flow comes into play.
It provides a structure in Odoo in which recurring tasks can be implemented and which handles standard tasks such as FTP download/upload and CSV processing. Individual procedures can be implemented separately and combined to form one process via defined interfaces. connector_flow is based on the excellent tried and tested Connector Framework, which facilitates a checkable, traceable and parallelisable workflow.
The following screenshots provide an example of a greatly simplified import of product master data from a CSV file. We also used the same technical basis to create an import that reads product data for approximately half a million products from a CSV file for two of our clients.

Our product import can be divided up into two stages: we first import the CSV file and then manage the products in Odoo. The associated technical process (Task Flow) is therefore comprised of these two tasks.

A two-stage Task Flow for the product import from CSV


A two-stage Task Flow for the product import from CSV


When carrying out the first stage, namely handling the CSV file, we are able to use a task that is already provided with the connector_flow module. This csv_import splits a CSV file into its separate lines and stores each of these individual lines as a Python data structure (a list or dictionary), also known as a chunk.
In the second stage, the creation of the product in Odoo, we can then add or update a product from such a chunk (a line of the CSV). For the technical implementation, we need to both program this task and compile the Task Flow.

We first deal with the task required for the creation of the product. The fact that this task receives a chunk from the previous task (reading the CSV file) as an entry means that we inherit the class abstract_chunk_read_task from the connector_flow module. In the chunk-data parameter we receive a dictionary so that we can suitably configure the reading of the CSV. The keys of the dictionary correspond to the column names of the CSV file (example files), meaning that creating the product in Odoo on the basis of the chunk is just a matter of a few clicks:

1
2
3
4
5
6
7
8
9
10
11
12
class product_catalog_import(abstract_chunk_read_task):
    def read_chunk(self, config=None, chunk_data=None, async=True):
        product_data = {
            'name': chunk_data.get('Name'),
            'list_price': float(chunk_data.get('Preis VK')),
            'standard_price': float(chunk_data.get('Preis EK')),
        }
        product_image_url = chunk_data.get('Image URL')
        if product_image_url:
            url_obj = urllib2.urlopen(product_image_url)
            product_data['image'] = b64encode(url_obj.read())
        self.session.create('product.product', product_data)

In order to use our product_catalog_import class in the Task Flow, we still need to register it in the Odoo model impexp.task. This is carried out using the normal Odoo inheritance process. On the one hand, an identifier needs to be added to _get_available_tasks and on the other hand, a method …_class needs to be created and given a name that corresponds to the selected identifier.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class product_catalog_import_task(orm.Model):
    _inherit = 'impexp.task'
 
    def _get_available_tasks(self, cr, uid, context=None):
        return super(product_catalog_import_task, self) \
            ._get_available_tasks(cr, uid, context=context) \
            + [('product_catalog_import', 'Produkt Catalog Import')]
 
    _columns = {
        'task': fields.selection(_get_available_tasks, string='Task',
                                 required=True),
    }
 
    def product_catalog_import_class(self):
        return product_catalog_import

This enables us to set up our Task Flow. Although this can also be carried out manually via the Odoo interface, a configuration via XML is recommended in the interest of clarity. When completing this configuration, we create records for the Task Flow, the two tasks and a transition between the two tasks. The first task in the Task Flow needs to have the flow_start property. In our case, this is the csv_import, which comes with the connector_flow module. We then configure it using the includes_header property in the config value so that it uses the first line of the CSV file as a title, which it in turn uses to create dictionaries from the remaining lines. The second task is the product_catalog_import in accordance with the indicator that we chose above in the impexp.task model. We then finish off by adding a transition between the tasks.

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
        <!-- Task flow -->
 
        <record model="impexp.task.flow" id="task_flow_product_catalog_import">
            <field name="name">Product Catalog Import</field>
        </record>
 
        <!-- Task and task transition -->
 
        <record model="impexp.task" id="task_product_catalog_import_1">
            <field name="name">Product catalog CSV to chunks</field>
            <field name="task">csv_import</field>
            <field name="flow_id" ref="task_flow_product_catalog_import"/>
            <field name="flow_start" eval="True"/>
            <field name="config"><![CDATA[{'includes_header': True}]]></field>
        </record>
 
        <record model="impexp.task" id="task_product_catalog_import_2">
            <field name="name">Product catalog chunks to products</field>
            <field name="task">product_catalog_import</field>
            <field name="flow_id" ref="task_flow_product_catalog_import"/>
        </record>
 
        <record model="impexp.task.transition" id="task_product_catalog_import_1">
            <field name="task_from_id" ref="task_product_catalog_import_1"/>
            <field name="task_to_id" ref="task_product_catalog_import_2"/>
        </record>

To carry out the product import, we use the wizard available under Connector > Import/Export > Run Task. We select „Product Catalog Import“ as the Task Flow and our CSV file as the file.

Carrying out the product import

Carrying out the product import


Example files for the product import

Example files for the product import

Shortly (how shortly depends on the configuration of the connector framework) after Run Task has been clicked, three products have been added to Odoo; the fourth product, „orange“, from the input file is missing.

The example products, apple, kiwi and lime, have been imported.

The example products, apple, kiwi and lime, have been imported.

Under Connector > Queue > Procedures we can see that the execution of the second task has failed because the image URL is incorrect. In order to still be able to import the product, we can click on the Related button to edit the raw data and, for example, correct or delete the URL. After this data correction, the procedure can be started again so that the orange is also available in Odoo.

A line in the CSV file contains incorrect data.

A line in the CSV file contains incorrect data.

The source code of the connector_flow module is available on Github, where you will also find the example code presented above under the name of connector_flow_example_product together with an example CSV (contrib/fruit_catalog.csv).

If you are also interested in Odoo/Open ERP or require our expertise for your ERP project, please feel free to contact us. We will be happy to help you further!
You can contact us by calling +49 4105 5615699 or by sending us an e-mail at {This email is obscured. Your must have javascript enabled to see it}.

Über Thomas Rehn

Der promovierte Mathematiker Thomas Rehn ist begeisterter Problemlöser in C++, Java, Perl, PHP und Python. Seine jahrelange Erfahrung als System-Administrator sorgt für den reibungslosen Betrieb unserer Web-, Datenbank und Applicationserver. Nebenbei ist er Autor von und Contributor zu verschiedener mathematischer Open-Source-Software.

Kommentare deaktiviert für Robust Data Import/Export in Odoo Using connector_flow as a Basis
Nächste Seite »