Hotellinx ERP järjestelmän Drupal Commerce integrointi

Tehtävänä oli integroida toiminnanohjausjärjestelmä (ERP) (tarkemmin hotellin hallintaan tarkoitettu Hotellinx), joka on (ja pitäisi aina olla) a single source of truth (SSOT) tuotteille, joita organisaatiolla on ja joita he hallitsevat. Jos tuotteita halutaan myydä - tässä tapauksessa verkkokaupasta - pitää tietenkin tuotteiden data siirtää kauppaa näytettäväksi asiakkaalle. Toisin sanoen verkkokauppa toimii vain käyttöliittymänä asiakkaalle tehdä ostos, mutta kaikki data tallennetaan ERP:hen eli SSOT:hen.

Kun vanha sisältö tuodaan uudelle websivustolle (yleensä vain kerran) puhutaan migraatiosta, joka on osa jokaista projektia. Jos sisältöä eli dataa tuodaan säännöllisesti tai automaatiolla prosessista puhutaan integraationa. Kyllä, integraatioon kuuluu myös toissuuntainen liikenne, josta puhutaan seuraavassa artikkelissa. Tässä postauksessa kerrotaan miten haemme dataa Hotellinxin rajapinnasta, kirjoitamme ne ensin CSV-tiedostoon, josta importoimme ne Commerce tuotteiksi (itseasiassa Product variations) Drupal 8:ssa. Alla kuvaus integraatiosta, mistä tässä kirjoituksessa toteutetaan tiedon tuonti CSV-tiedostoon.

Hotellinx integraatio
Hotellinx integraation arkkitehtuuri kokonaisuudessaan

 

Moduulit joita tarvitaan ovat Commerce, Commerce Feeds, Feeds ja Feeds Tamper. Käytimme Feeds moduulia migraatiossa, koska se on helppo konfiguroida suoraan käyttöliittymästä. Tietysti on olemassa muitakin vaihtoehtoja kuten custom PHP-scriptejä, Drupal Migrate moduuli / framework tai tehdä asia käsin.

Ensiksi tarvitaan luoda custom moduuli, joka hakee datan Hotellinx rajapinnasta ja kirjoittaa tulokset CSV-tiedostoon.

Käytämme MODULE.install tiedostoa MODULE_install() function kanssa siihen, että rajapinnan asetukset voidaan muuttaa kätevästä käyttöliittymästä.

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(); 
  }

 

Luo käyttöliittymä MODULE>src>Form joka mahdollistaa asetukset ja määrittää minne CSV-tiedosto kirjoitetaan. Linkki menuun luodaan MODULE.routing.yml -tiedostossa.

 

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

 

Lisätään module.infoon

 

configure: MODULE.settings

 

viimeiselle riville. Näin linkki asetuksiin on näkyvissä heti, kun moduuli on aktivoitu Laajenna-osiosta. Lisätään linkki vielä admin menuun. Luo tiedosto

MODULE.links.menu.yml

 

ja lisää

 

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

 

Nyt käyttäjä löytää helposti asetukset mm. Rajapinnan osoitteelle, tokeneille tai salasanoille.

Vihdoin päästään asiaan! Käytämme ajastukseen hook_cronia hakuprosessiin, josta kutsutaan seuraavia toimintoja. Käytetään PHP curlia ottamaan yhteys Hotellinxin rajapintaan.

 

$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);

 

$request() näyttää suurinpiirtein tältä:

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

 

Tämä palauttaa pyynnön, joka on määritelty Hotellinxin rajapinnassa - riippuen tietysti mitä parametrejä on annettu pyyntöön. Korvaa siis kohta <HOTELLINX POST REQUEST> halutulla rajapinnan pyynnöllä. Vastaus kirjoitetaan kahteen eri CSV-tiedostoon näin:

 

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

 

Huomaa, että Feeds module dokumentaatiossa lukee: "all strings have to be surrounded by quotes like "string""

Hotellinx kertoo meille huoneet, kuvaukset ja niiden hinnat riippuen kokoonpanosta. Että saamme käännettyä datan Commercin ymmärtämään muotoon (jotta integraatio on teknisesti järkevää) tarvitaan kaksi tiedostoa. Hinnat käännetään Commerce variaatioksia tuotteissa ja yksittäiset huoneet Commerce tuotteiksi (product). Näin jokainen huone voidaan myydä eri variaatioilla (hinta, tarjous, henkilöiden määrä jne.).

Ensimmäinen tiedosto sisältää hinnat ja muita tärkeitä muuttujia, joita tarvitaan integraatiossa.

The first variation file contains the rates and some important variables which are needed later in the integration:

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

 

Erilaiset variaatiot identifioidaan SKU:n avulla. RoomTypeId taas määrittää miten hintaluokkaan "Rates" se kuuluu. Koska Feeds ei osaa etsiä tätä yhteyttä ilman ulkopuolista apua, tarvitaan toinen tiedosto tuotteille.

 

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

 

Tämä tiedosto listaa tuotteet eli tässä tapauksessa hotellin huoneet ja määrittää putken (pipe, |), jotka variaatiot kuuluvat kuhunkin tuotteeseen. (Putkea käytetään Feedsiä laajentavassa Feeds tamper moduulissa).

Kun ohjelma ajetaan (Cron suoritetaan) syntyy kaksi tiedostoa, josta toinen sisältää luotavat Commerce tuotteet ja toinen niiden variaatiot.

Seuraava askel on tehdä import .CSV-tiedostoista eli luoda data tuotteiksi Feeds ja Commerce Feeds moduuleita käyttäen.

Ohjelmoija
Janis Bullert

Lisää uusi kommentti