OXID – ERP-Systeme integrieren

Einleitung

Im B2B-Bereich kommen immer mehr und mehr ERP-Systeme zum Einsatz, sei es SAP, Navision, Odoo oder ähnliches. Meist wenn dann auch noch ein Online-Shop im Einsatz ist, kommt der Wunsch auf eine Integration des Shops an das bestehende ERP-System zu realisieren. OXID gibt viel her in der Enterprise-Version und dem ERP-Modul was die Kommunikation zwischen einem ERP-System und dem Shop ermöglicht. Es lassen sich Bestellungen abholen, Benutzer anlegen, Artikel verwalten und vieles mehr. Aber was passiert wenn fremde Module oder aus eigener Hand entwickelte Module ebenso von einem ERP-System Datensätze erhalten  müssen oder von dort abgeholt werden müssen?

In einem solchen Fall müssen ERP-Plugins für OXID entwickelt werden. Nun ist es in der Realität nun ja auch so, dass ggf. im Laufe der Zeit die Anforderungen für das Zusammenspiel zwischen Shop und ERP-System wachsen, meist müssen dahingehend Prozesse die die Kommunikation zwischen den beiden Systemen betreffen angepasst werden, wir aber als Entwickler möchten nicht Module wieder erneut anfassen und erweitern. Daher muss eine flexible Lösung her um ERP-Plugins auch für spätere Change-Requests vorzubereiten.

 

ERP-Plugins für ERP-Systeme

Nehmen wir an, wir haben ein Modul welches den OXID-Shop um Buchungskonten erweitert. Das Modul dafür ist bereits entwickelt. Bestellungen können neuerdings in der ERP-Schnitstelle von OXID abgeholt werden, allerdings finden sich die dazugehörigen Buchungskonten im Shop wie aber auch im ERP-System. Im Shop werden Bestellungen einem entsprechenden Buchungskonto zugeordnet. Der Shop kennt nur die Buchungskonten die für ihn relevant sind. Nun müssen natürlich diese Buchungskonten auch abgeholt werden, auch wenn sich Änderungen der Datenbankschemas ergeben. Ebenso wenn ein neues Buchungskonto hinzukommt, aber im nachhinein ein weiteres nützliches Attribut vom ERP-System übergeben wird, wollen wir dieses auch im Nachgang erfassen können, ohne eine entsprechende Änderung am ERP-Plugin durchführen zu müssen. Wie stellen wir dies an? Dazu gibt es eine kompakte aber feine Lösung.

 

Einfügen/Bearbeiten von Datensätzen

 

<?php

class setBookingAccountPlugin extends oxErpPluginBase{
    
    public function invoke($aParams) {
        $aResult = array();
        $sMessage = "ERROR";
        $aParams = array_change_key_case($aParams, CASE_UPPER);
        /* @var $oBookingAccount BookingAccount */
        $oBookingAccount = oxNew( 'BookingAccount' );
        if(array_key_exists("OXID", $aParams)){
            $oBookingAccount->load($aParams["OXID"]);       
        }

        $oBookingAccount->assign($aParams);
        $blResult = $oBookingAccount->save();
        if($blResult){
            $aResult = array(
                'OXID' => $oBookingAccount->getId(),
            );
            $sMessage = "OK";
        }
        
        $oResult = new oxERPReturn();
        $oResult->aResult = $aResult;
        $oResult->blResult = $blResult;
        $oResult->sMessage = $sMessage;
        return $oResult;
    }
}

Dieses ERP-Plugin versucht, wenn eine OxID übergeben wurde,  anhand der OxID einen Datensatz aus der Datenbank in ein Objekt vom Entitätstypen BookingAccount zu laden. Wenn dies nicht möglich war, gibt standardgemäß OXID ein false zurück. Dieses ist für uns uninteressant, da dann dass Objekt sowieso leer ist, und wenn die OxID invalid ist, handelt es sich meist um ein neuen Datensatz, daher werden die übergebenen Werte assigned wenn möglich und ein neues Objekt in die Datenbank geschrieben. Welche Felder dahingehend übergeben werden ist irrelevant, solange sie existent sind. Wenn Felder übergeben werden, die sich im Datenbankschema nicht finden lassen können, werden sie ignoriert.

Ausgeben von Datensätzen

 

<?php
class getBookingAccountsPlugin extends oxErpPluginBase{
    
    public function invoke($aParams) {
        $sViewName = getViewName("myBookingAccount");
        $sSql = "SELECT $sViewName.* FROM $sViewName";
        
        
        /* @var $oList oxList */
        $oList = oxNew("oxList"); // wenn kein listobject implementiert wurde
        $oList->selectString($sSql);
        
        foreach($oList as $oData){
            $aFields        = array(
                'OXID'  => $oData->getFieldData('OXID'),
            );
            
            $oResult = new oxERPReturn();
            $oResult->aResult = $aFields;
            $oResult->blResult = true;
            $oResult->sMessage = "OK";
            $aResult[] = $oResult;
        }
        return $aResult;
    }
}

oder für einen einzelnen Datensatz:

<?php
class getBookingAccountPlugin extends oxErpPluginBase{

    public function invoke($aParams) {
         $aResult = array();
        $blStatus = false;
        $sMessage = "ERROR";
        
        $sId = $aParams['OXID'];
        /* @var $oBookingAccount BookingAccount */
        $oBookingAccount = oxNew( 'BookingAccount' );
        
        $aFilledFields = array();
        if ( $oBookingAccount->load($sId) ) {
            $aFields = $oBookingAccount->getFieldNames();
            
            foreach($aFields as $sFieldname){
                $sUpperfieldName = strtoupper($sFieldname);
                $aFilledFields[$sUpperfieldName] = $oBookingAccount->getFieldData($sFieldname);
            }
            
            $aResult = $aFilledFields;
            $blStatus = true;
            $sMessage = "OK";
        }

        $oResult = new oxERPReturn();
        $oResult->aResult = $aResult;
        $oResult->blResult = $blStatus;
        $oResult->sMessage = $sMessage;
        return $oResult;
    }
}

Löschen von Datensätzen

 

<?php
class removeBookingAccountPlugin extends oxErpPluginBase{
    
    public function invoke($aParams){
        $aResult = array();
        $blStatus = false;
        $sMessage = "Error";
        
        $oResult = new oxERPReturn();
        $aParams = array_change_key_case($aParams, CASE_UPPER);
        
        $sOXID = $aParams["OXID"];
        /* @var $oBookingAccount BookingAccount */
        $oBookingAccount = oxNew("BookingAccount");
        $blIsLoaded = $oBookingAccount->load($sOXID);
        
        if($blIsLoaded){
            $blStatus = $oBookingAccount->delete();
            if($blStatus){
                $sMessage = "OK";
            }
        }else{
            $sMessage = "Booking Account not found";
        }
        
        $oResult->aResult = $aResult;
        $oResult->sMessage = $sMessage;
        $oResult->blResult = $blStatus;
        return $oResult;
    }
}

Im übrigen, besitzt ihr das ERP-Modul noch nicht? Dieses lässt sich übrigens hier kaufen.

0

Leave a Reply