Lefthand to programy księgowe i handlowo-magazynowe dla firm. Nie ukrywam, że po raz pierwszy spotkałem się z tym oprogramowaniem wówczas gdy jeden z klientów dla którego wdrażaliśmy Magento poprosił nas o to by zautomatyzować przepływ stanów magazynowych oraz zamówień.

Podstawowy zakres integracji Magento z Lefthand.

W słowie podstawowy kryje się aktualizacja stanów w Magento na podstawie informacji pobieranych z aplikacji Lefthand oraz eksport zamówień z Magento do Lefthand. Pobieranie danych oraz aktualizacja w aplikacji Lefthand odbywa się bezpośrednio na bazie danych. Lefthand działa w oparciu o bazę Firebird. W środowisku PHP wygodnie można komunikować się z tą bazą dzięki PDO. Najpierw trzeba jednak sprawdzić czy Twój serwer obsługuje ten silnik bazy danych. Oto prosta funkcja, którą użyłem by upewnić się, że serwer na którym instalujemy Magento obsługuje również bazę Firebird. public function init($ip,$dbname,$username,$password){ try { $drivers = array(); foreach (PDO::getAvailableDrivers() as $driver) { $drivers[] = $driver; } $drivers = array_flip($drivers); if (array_key_exists('firebird', $drivers)) { $res = $this->conection($ip, $dbname, $username, $password); return $res; } else { return 'Brak odpowiedniego drajwera bazy danych.'; } } catch (Exception $e) { return 'Błąd połączenia z Baza Danych : ' . $e->getMessage(); } } Następnie gdy już mamy pewność, że mam jak połączyć się z bazą wykonujemy dwa połączenia: pierwsze służy odczytom z bazy Firebird a drugie niezależne wyłącznie do zapisywania w niej danych. private function conection($ip,$dbname,$username,$password){ try { $this->conRead = new PDO('firebird:host=' . $ip . ';dbname=' . $ip . $dbname, $username, $password); $this->conWrite = new PDO('firebird:host=' . $ip . ';dbname=' . $ip . $dbname, $username, $password); return true; } catch (Exception $e) { return 'Błąd połączenia z Baza Danych : ' . $e->getMessage(); } }

Odczyt stanów magazynowych z Lefthand

Przygotowałem prostą funkcję, która pobiera dane o produktach z programu Lefthand. private function getProductStocks(){ try { $sth = $this->con->prepare("SELECT lw.ID, lw.CODE, lw.NAME, lws.ITEM_AMOUNT FROM LH_WAREHOUSE lw JOIN LH_WAREHOUSE_STATES lws ON lws.ID_LH_WAREHOUSE = lw.ID ORDER BY lw. ID_LH_WAREHOUSE_GROUP ASC, lw.CODE ASC"); $sth->execute(); $result = $sth->fetchall(PDO::FETCH_ASSOC); return $result; } catch (PDOException $e) { return 'Błąd odczytu stanów produktów : ' . $e->getMessage(); } } Dzięki tym kilku linijkom kodu otrzymujemy wszystko co jest nam potrzebne by zaktualizować stany magazynowe w sklepie Magento. Sama funkcja odpowiedzialna z aktualizację stanów magazynowych w Magento wygląda następująco: private function updateStock($data){ try { $sku = $data['sku']; $newQty = $data['stock']; $name = $data['name']; $product = Mage::getModel('catalog/product')->loadByAttribute('sku', $sku); if ($product) { $productId = $product->getId(); $stockItem = Mage::getModel('cataloginventory/stock_item')->loadByProduct($productId); if($stockItem->getData('manage_stock')) { if($newQty > 0) { $stockItem->setData('is_in_stock', 1); $stockItem->setData('qty', (integer)$newQty); $stockItem->save(); } } Mage::log('Nowy stan : '.$newQty.' dla produktu ::' . $sku . ' :: '.$name.'<br/>', null, $this->logFilenameSuccess); }else{ Mage::log('Brak produktu ::' . $sku . ' :: '.$name.'<br/>', null, $this->logFilenameErrors); } } catch (Exception $e) { Mage::log('Błąd stanu : '.$newQty.' dla produktu ::' . $sku . ' :: '.$name.' :: '.$e->getMessage().'<br/>', null, $this->logFilenameErrors); } } W zależności od potrzeb moduł aktualizujący stany magazynowe w Magento uruchamiamy w harmonogramie Cron o dogodnej częstotliwości. Służy temu odpowiedni wpis w pliku konfiguracyjnym rozszerzenia, który wygląda następująco: <crontab> <jobs> <lefthand_importstocks> <schedule><cron_expr>*/50 * * * *</cron_expr></schedule> <run><model>lefthand/cron::ImportStocks</model></run> </lefthand_importstocks> </jobs> </crontab>

Eksport zamówień z Magento do Lefthand

W przypadku eksportu zamówień z Magento i zapisywanie ich do systemu Lefthand jest znacznie więcej kodu. W aplikacji Lefthand dane typu:
  • Kraje
  • Województwa
  • Miasta
  • Adresy
  • Reprezentanci
są zapisywane w formie słowników, dlatego najpierw trzeba przygotować kilka numerów ID dla danych jakie zawiera nowe zamówienie. $id_contr = $this->saveOrGetCustomerId($data); $id_city = $this->saveOrGetCityId( $data['client']["BillingCity"] ); $id_district = $this->saveOrGetRegionId($data['client']["BillingRegion"]); $id_country = $this->saveOrGetCountryId($data['client']["BillingCountry"]); $id_adres = $this->saveOrGetAddressId( $data['client']["BillingAddress"], $data['client']["BillingPostalCode"], $id_contr,$id_city,$id_district, $id_country); if($data['client']["DiffrentShippingAddress"]) { $id_city_wys = $this->saveOrGetCityId( $data['client']["ShippingCity"] );; $id_district_wys = $this->saveOrGetRegionId($data['client']["ShippingRegion"]); $id_country_wys = $this->saveOrGetCountryId($data['client']["ShippingCountry"]); $id_adres_wys = $this->saveOrGetAddressId( $data['client']["ShippingAddress"], $data['client']["ShippingPostalCode"], $id_contr,$id_city_wys,$id_district_wys, $id_country_wys); }else{ $id_city_wys = 0; $id_district_wys = 0; $id_country_wys = 0; $id_adres_wys = 0; } $id_rep = $this->saveOrGetReprezentantaId($data,$id_contr); a następnie zapisać nowe zamówienie do aplikacji Lefthand. Jeśli na co dzień pracujesz z wspomnianymi systemami (Magento oraz Lefthand) i nadal ręcznie przepisujesz zamówienia do Lefthand to sądzę, że warto zastanowić się nad przyśpieszeniem i automatyzacją tych funkcji. Zapraszam do kontaktu w sprawie integracji Magento nie tylko z aplikacją Lefthand.