Integration des Hotellinx ERP System in Drupal Commerce

Die Aufgabe besteht darin, ein ERP-System (ein Hotelmanagementsystem namens Hotellinx) in eine Drupal Webseite zu integrieren. Das System speichert und verwaltet Produkte. Wenn Sie diese Produkte aus einem anderen System, wie zum Beispiel einem Webshop, heraus verkaufen wollen, müssen Sie die Daten in den Shop übertragen, um Ihre Waren dem Kunden zu präsentieren. Das bedeutet das der Webshop die Waren dem Kunden präsentiert und verkauft, während das ERP-System (oder SSOT) diese Verkäufe verwaltet und speichert.

Das einmalige Importieren alter Inhalte in eine neue Website wird als Migration bezeichnet, was ein normaler Teil jeder Webseitenerstellung ist. Wenn der Import regelmäßig stattfindet, nennt man das Integration. Ja, die Integration geht in der Regel in beide Richtungen, so dass die Fortsetzung des Artikels darüber sprechen wird. Hier werden wir Daten von der Hotellinx-API erhalten, die daraus resultierenden Produkte in eine CSV-Datei schreiben. Anschließend werden wir diese Produkte in unser Drupal-8-Projekt importieren. Das folgende Bild stellt die das System dar, mit dessen Hilfe wir die Daten integrieren werden.

 

Hotellinx Integrationsarchitektur
Komplette Hotellinx ERP Integrationsarchitektur

 

Die Module die wir benötigen sind Commerce, Commerce Feeds, Feeds und Feeds Tamper. Wir verwenden Feeds zum migrieren der Daten weil es in diesem Fall der angemessenste Ansatz ist. Es können natürlich auch andere Methoden verwendet werden wie zum Beispiel PHP Skripte, das Drupal migrate Modul/Framework oder manuelles Kopieren.

Als ersten Schritt erstellen wir ein Modul das die Daten über die Hotellinx API downloadet und das Ergebnis anschließend in eine CSV-Datei schreibt.

Wer erstellen eine MODULE.install mit der Funktion MODULE_install() die es unserem Modul erlaubt Daten in der Drupal Datenbank zu speichern.

function MODULE_install()

  { 
    \Drupal::configFactory()
    ->getEditable('MODULE.settings') 
    ->set('Username', '') 
    ->set('Password', '') 
    ->set('url', 'link/to/hotellinx.api') 
    ->set('filepath', 'public://MODULE/') 
    ->set('productsFileName', 'MODULE_hotellinx_rooms.csv') 
    ->set('VariationsFileName', 'MODULE_hotellinx_variations.csv') 
    ->save(); 
  }

 

Danach erstellen wir eine UI mit deren Hilfe der Administrator verschiedene Settings für unser Modul einstellen kann. Z.B. Passwort und Benutzername für die Hotellinx API. Wir erzeugen dazu unter MODULE>src ein Form. Danach benötigen wir eine MODULE.routing.yml Damit das Form von der Administrationsoberfläche gefunden werden kann.

 

MODULE.settings: 
  path: '/admin/config/services/MODULE' 
  defaults: 
    _form: '\Drupal\MODULE\Form\MigrationAdminUI' 
    _title: 'Hotellinx Settings'
  requirements: 
    _permission: 'access administration pages'

 

Jetzt fügen wir die diese Route am Ende unserer module.info mit einer Zeile hinzu:

 

configure: MODULE.settings 

 

So können die Settings von der Modul-Installationsseite erreicht werden. Zusätzlich fügen wir noch einen Link im Administrationsmenü hinzu. Dafür erstellen wir eine

 

MODULE.links.menu.yml

 

und fügen dies hinzu:

 

MODULE.adminUI: 
  title: 'Hotellinx Settings'
  parent: system.admin_config_services
  route_name: MODULE.settings 
  weight: 10

 

Nun können Administratoren unsere Settings über das Hauptmenü finden. Jetzt können wir uns endlich um die eigentliche Funktionalität unseres Moduls kümmern. Wir verwenden hook_cron() um den Downloadprozess regelmäßig zu aktivieren.

 

Um die Hotellinx API anzusprechen verwenden wir PHP curl.

 

$url = \Drupal::configFactory()
  ->getEditable('module.settings')
  ->get('url'); 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml')); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $request()); 
$xmlstring = curl_exec($ch); 
curl_close($ch);

 

Die Funktiondie in $request() steckt sieht so aus:

$Username = \Drupal::configFactory()
  ->getEditable('module.settings')
  ->get('Username'); 
$Password = \Drupal::configFactory()
  ->getEditable('module.settings')
  ->get('Password'); 
  return "<HOTELLINX POST REQUEST>";

 

Sie gibt die Response der Hotellinx API zurück nachdem notwendige und optionale Parameter hinzugefügt wurden. Sie müssen nur  <HOTELLINX POST REQUEST> mit dem gewünschten Request ersetzen.

Das Ergebnis wird in zwei verschiedene CSV-Dateien geschrieben:

$file = fopen($productsPath, "w"); 
  foreach ($roomlist as $line) 
    { 
      $line .= $productMap[explode(',', $line)[0]]; 
      fwrite($file, $line . "\n"); 
    } 
  fclose($file);

 

Gemäß der Dokumentation des Feeds-Moduls müssen alle Zeichenketten von Anführungszeichen wie "string" umgeben sein.

Hotellinx stellt uns Hotelzimmer zur Verfügung zu verschiedenen Raten vermietet werden. Um diese Daten in Commerce Begriffe zu übersetzen brauchen wir zwei Dateien. Die Raten integrienen wir als Commerce variations und die Hotelzimmer als products. Jedes product kann in verschiedenen variations verkauft werden.(e.g. Price, offer, people in it etc.)

Die erste Datei enthält die variations und einige wichtige Variablen die im späteren Verlauf benötigt werden:

"SKU","RoomTypeId",            "Title"
  104,          67,   "Single package"
  105,          68,   "Family package"
  106,          68,"Newly wed package"

 

Die verschiedenen variations werden durch den Commerce Schlüssel SKU eindeutig identifiziert. Die RoomTypeId definiert zu welchem Hotelzimmer diese variations gehören. Weil das Feeds Modul diese Verbindung nicht ohne externe Hilfe alleine machen kann, brauchen wir eine zweite Datei für die products.

 

"RoomTypeId",      "Title",   "Store",    "SKU"
          67,"Single Room","my_store",    "104"
          68,"Double Room","my_store","105|106"

 

Diese Datei listet die products, in diesem Fall unsere Hotelzimmer und definiert mit einer Pipe '|' als trennendes Element, welche variations zu welchem product gehören. (Beispielsweise in der letzten Zeile ist die SKU "105|106".)

Nachdem Cron ausgeführt wurde, haben wir nun zwei verschiedene Dateien. Eine enthält unsere zukünftigen Commerce products und die andere unsere Commerce variations dieser products.

Im nächsten Schritt migrieren wir diese Daten mithilfe der Module Feeds, Feeds Tamper und Commerce Feeds von unseren CSV-Dateien in unseren Drupal Webshop als Commerce products und variations..

 

Programmierer
Janis Bullert

Neuen Kommentar schreiben