404 lines
15 KiB
PHP
404 lines
15 KiB
PHP
<?php
|
|
|
|
namespace App\Helper;
|
|
|
|
use App\Entity\Order;
|
|
use App\Repository\OrderRepository;
|
|
use Psr\Log\LoggerInterface;
|
|
use Symfony\Component\Filesystem\Exception\IOExceptionInterface;
|
|
use Symfony\Component\Filesystem\Filesystem;
|
|
use Symfony\Component\Finder\Finder;
|
|
|
|
class Hiltes
|
|
{
|
|
// init file system
|
|
protected $fsObject;
|
|
protected $current_dir_path;
|
|
protected $apiKey;
|
|
protected $hiltesApiHash = '';
|
|
protected $hiltesUsr;
|
|
protected $hiltesPass;
|
|
protected $hiltesApiUrl;
|
|
|
|
|
|
public function __construct(private OrderRepository $orderRepository, private LoggerInterface $logger)
|
|
{
|
|
$this->fsObject = new Filesystem();
|
|
$this->current_dir_path = getcwd();
|
|
|
|
$this->hiltesApiUrl = $_ENV['HILTES_API_URL'];
|
|
$this->hiltesUsr = $_ENV['HILTES_API_USER'];
|
|
$this->hiltesPass = $_ENV['HILTES_API_PASS'];
|
|
}
|
|
|
|
|
|
/**
|
|
* @param string $data
|
|
* @return void
|
|
*/
|
|
public function export(string $data): void
|
|
{
|
|
try {
|
|
$new_file_path = $this->current_dir_path . "/hiltes/c2h/" . $this->createFileName();
|
|
|
|
if (!$this->fsObject->exists($new_file_path)) {
|
|
$this->fsObject->touch($new_file_path);
|
|
$this->fsObject->chmod($new_file_path, 0777);
|
|
$this->fsObject->dumpFile($new_file_path, $data);
|
|
}
|
|
} catch (IOExceptionInterface $exception) {
|
|
echo "Error creating file at" . $exception->getPath();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Aufbau des Dateinamens:
|
|
* WU + Datum(TTMM) + Fortlaufendenummer (x2) + “.“ +Filialnummer(x4)
|
|
* Beispieldateiname : WU220401.0001
|
|
*/
|
|
public function createFileName(): string
|
|
{
|
|
$date = date('dm');
|
|
$number = '01';
|
|
$filial = '0001';
|
|
return 'WU' . $date . $number . '.' . $filial;
|
|
}
|
|
|
|
/**
|
|
* @param $orderData
|
|
* @return bool|void
|
|
*/
|
|
public function createRequest($orderData)
|
|
{
|
|
|
|
$this->loginToHiltes('', '');
|
|
|
|
/**
|
|
* @var Order
|
|
*/
|
|
$order = $this->orderRepository->findOneBy(array('orderId' => $orderData->getOrderId()));
|
|
|
|
|
|
if ($order) {
|
|
//foreach ($orders as $order) {
|
|
if ($order->getStatus() != 2) {
|
|
$this->logger->error('Order not ready for export ' . $order->getOrderId());
|
|
return false;
|
|
}
|
|
|
|
$tA = $order->getData()[0];#json_decode($order->getData());
|
|
|
|
#dump($tA);
|
|
|
|
#*** Umkonvertieren des Datumstings *****************
|
|
if (!empty($tA['salesdate'])) {
|
|
$tA['orderdate'] = gmdate('Y-m-d\TH:i:s.v\Z', $tA['salesdate'] ? strtotime($tA['salesdate']) : time());
|
|
} else {
|
|
$tA['orderdate'] = gmdate('Y-m-d\TH:i:s.v\Z', time());
|
|
}
|
|
|
|
#*** Aufbau des Arrays ******************************
|
|
$arr = array(
|
|
'File' => array(
|
|
"BranchNumber" => 8, #Die Filialnummer
|
|
"ShopNumber" => 1, #Die Shopnummer
|
|
"SalesDate" => $tA['orderdate'], #Das Umsatzdatu
|
|
"DistributionChannel" => 5, #Der Vertriebskanal
|
|
),
|
|
'SaleList' => array(),
|
|
'CustomerList' => array(),
|
|
);
|
|
#*** Items ***************
|
|
if (!empty($tA['positions']) && is_array($tA['positions'])) {
|
|
$tSalNr = array();
|
|
foreach ($tA['positions'] as $v) {
|
|
if ($v['type'] == 'versandposition' || $v['sku'] == '') {
|
|
// $SalesNumber = '000001';
|
|
// $SalesGoodsGroupNumber = 9350;
|
|
|
|
// Versandkosten werden nicht übermittelt
|
|
continue;
|
|
} else {
|
|
$SalesNumber = (!empty($v['gtin']) ? $v['gtin'] : $v['sku']);
|
|
if (preg_match('/^([0-9]+)_/', $SalesNumber, $tP)) {
|
|
$SalesNumber = $tP[1];
|
|
}
|
|
if (isset($tSalNr[$SalesNumber])) {
|
|
$tSalNr[$SalesNumber]++;
|
|
$SalesNumber .= $tSalNr[$SalesNumber];
|
|
} else {
|
|
$tSalNr[$SalesNumber] = 0;
|
|
}
|
|
$SalesGoodsGroupNumber = 0;
|
|
}
|
|
|
|
#dump($SalesNumber);
|
|
#********
|
|
$v['CalculatedSellingPrice'] = round(str_replace(',', '.', $v['price']), 2);
|
|
$v['AchievedSalesPrice'] = round(str_replace(',', '.', $v['CalculatedSellingPrice']), 2);
|
|
|
|
$arr['SaleList'][] = array(
|
|
"OrderNumber" => $tA['externOrderId'], #X
|
|
"SalesLabel" => 1,#$v['sku'],#X
|
|
"SalesLabelNumber" => $SalesNumber,#X
|
|
"SalesGoodsGroupNumber" => $SalesGoodsGroupNumber,
|
|
#"SizeDescription" => '',#"string",
|
|
"CustomerNumber" => $tA['kundenummer'],
|
|
#"TypeOfEstate" => 0,
|
|
"Amount" => $v['menge'],#X
|
|
"CalculatedSellingPrice" => $v['CalculatedSellingPrice'], #X kalkulierter Verkaufspreis
|
|
"AchievedSalesPrice" => $v['AchievedSalesPrice'], #X erzielter Verkaufspreis
|
|
"TransactionType" => 1, #X die Vorgangsart Sale=Verkauf Exchange=Umtausch / Storno
|
|
"ReceiptNumber" => substr($order->getOrderId(), 3), #Die Belegnummer
|
|
"DateOfSale" => $tA['orderdate'],#X das Verkaufsdatum mit Verkaufszeit
|
|
"PaymentMethod" => 2,#X "CreditCard",
|
|
"Currency" => 'EUR',#X "string",
|
|
"Unit" => 0,#X
|
|
"DistributionChannel" => 5
|
|
);
|
|
}
|
|
}
|
|
#*** Kunde *******************************
|
|
$arr['CustomerList'][] = array(
|
|
"CustomerNumber" => $tA['kundenummer'], # string
|
|
"Surname" => substr($tA['name'],0,40),#"string",
|
|
"Forename" => substr($tA['vorname'],0,40),#"string",
|
|
"AddressCity" => substr($tA['ort'],0,40),#"string",
|
|
"AddressZipCode" => substr($tA['plz'],0,10), #"string",
|
|
"AddressStreet" => substr($tA['strasse'],0,40),#"string",
|
|
"AddressCountry" => substr($tA['land'], 0, 3)
|
|
);
|
|
|
|
//$data = $this->createJson($arr);
|
|
//$this->logger->info(var_export($arr, 1));
|
|
|
|
try {
|
|
return $this->sendOrderToHiltes($arr);
|
|
} catch (\Exception $e) {
|
|
$this->logger->error('Send Order Error ' . $e->getMessage() . __LINE__);
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param $usr
|
|
* @param $pass
|
|
* @return bool
|
|
*/
|
|
public function loginToHiltes($usr, $pass): bool
|
|
{
|
|
$url = $this->hiltesApiUrl . '/api/Authentication/authenticate';
|
|
|
|
$param = array(
|
|
'Username' => (!empty($usr) ? $usr : $this->hiltesUsr),
|
|
'Password' => (!empty($pass) ? $pass : $this->hiltesPass),
|
|
);
|
|
|
|
$r = $this->sendToHiltes($url, $param);
|
|
|
|
if ($r === false) {
|
|
$this->logger->error('Login Error ' . $r . __LINE__);
|
|
return false;
|
|
}
|
|
|
|
$t = json_decode($r, true);
|
|
if ($t['Success']) {
|
|
$this->hiltesApiHash = $t['Data'];
|
|
return true;
|
|
} else {
|
|
$this->logger->error('Login Error ' . var_dump($t['Errors']) . __LINE__);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Sends a request to the specified URL using CURL.
|
|
*
|
|
* @param string $url The URL to send the request to.
|
|
* @param mixed $param The data to send with the request. It should be an associative array.
|
|
* @param bool $auth (Optional) Indicates whether to include authorization in the request headers. Default is false.
|
|
* @return mixed The response from the server.
|
|
*/
|
|
public function sendToHiltes($url, $param, $auth = false)
|
|
{
|
|
$ch = curl_init($url);
|
|
if ($auth) {
|
|
$authorization = "Authorization: Bearer " . $this->hiltesApiHash;
|
|
} else {
|
|
$authorization = false;
|
|
}
|
|
|
|
# Setup request to send json via POST.
|
|
$payload = json_encode($param);
|
|
|
|
if ($auth) {
|
|
$this->logger->info('Send Order ' . $url . ' ' . $payload);
|
|
}
|
|
|
|
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json', $authorization));
|
|
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
|
|
# Return response instead of printing.
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
|
# Send request.
|
|
$result = curl_exec($ch);
|
|
curl_close($ch);
|
|
|
|
if ($auth) {
|
|
$this->logger->info('Result ' . $result);
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* Creates a JSON object based on the given data.
|
|
* @deprecated Use createRequest instead.
|
|
* @param mixed $data The data to be converted to JSON.
|
|
* @return array The JSON object.
|
|
*/
|
|
public function createJson($data): array
|
|
{
|
|
$arr = array(
|
|
'File' => array(
|
|
"BranchNumber" => $data['BranchNumber'], #Die Filialnummer
|
|
"ShopNumber" => $data['ShopNumber'], #Die Shopnummer
|
|
"SalesDate" => $data['SalesDate'], #Das Umsatzdatu
|
|
"DistributionChannel" => $data['DistributionChannel'] #Der Vertriebskanal
|
|
),
|
|
'SaleList' => array(),
|
|
'CustomerList' => array(),
|
|
);
|
|
#*** Sale List
|
|
if (!empty($data['SaleList'])) {
|
|
foreach ($data['SaleList'] as $v) {
|
|
$arr['SaleList'][] = array(
|
|
"OrderNumber" => $v['OrderNumber'],
|
|
"SalesLabel" => $v['SalesLabel'], #Das Etikettkennzeichen
|
|
"SalesLabelNumber" => $v['SalesLabelNumber'], #Etikettennummer
|
|
"SalesGoodsGroupNumber" => $v['SalesGoodsGroupNumber'],
|
|
|
|
#"CustomerNumber" => $v['CustomerNumber'],
|
|
#"TypeOfEstate" => $v['TypeOfEstate'],
|
|
"Amount" => $v['Amount'],
|
|
"CalculatedSellingPrice" => $v['CalculatedSellingPrice'],
|
|
"AchievedSalesPrice" => $v['AchievedSalesPrice'],
|
|
"TransactionType" => $v['TransactionType'],
|
|
"ReceiptNumber" => $v['ReceiptNumber'],
|
|
"DateOfSale" => $v['SalesDate'],#"2023-09-14T11:54:26.708Z",
|
|
"PaymentMethod" => $v['PaymentMethod'],
|
|
"Currency" => $v['Currency'],
|
|
"Unit" => $v['Unit'],
|
|
"DistributionChannel" => $v['DistributionChannel']
|
|
);
|
|
}
|
|
}
|
|
#*** Sale List
|
|
if (true) {
|
|
foreach ($data['CustomerList'] as $v) {
|
|
$arr['CustomerList'][] = array(
|
|
"CustomerNumber" => $v['CustomerNumber'],
|
|
#"CardNumber" => $v['CardNumber'],
|
|
#"SalutionNumber" => $v['SalutionNumber'],
|
|
"Surname" => $v['Surname'],
|
|
"Forename" => $v['Forename'],
|
|
"AddressCity" => $v['AddressCity'],
|
|
"AddressZipCode" => $v['AddressZipCode'],
|
|
"AddressStreet" => $v['AddressStreet'],
|
|
"AddressCountry" => $v['AddressCountry'],
|
|
#"PostOfficeBox" => $v['PostOfficeBox'],
|
|
#"PostOfficeBoxZipCode" => $v['PostOfficeBoxZipCode'],
|
|
#"Title" => $v['Title'],
|
|
#"PhoneNumber1" => $v['PhoneNumber1'],
|
|
#"PhoneNumber2" => $v['PhoneNumber2'],
|
|
#"FaxNumber" => $v['FaxNumber'],#"string",
|
|
#"BirthDay" => $v['BirthDay'],
|
|
#"Gender" => $v['Gender'],
|
|
#"EmailAddress" => $v['EmailAddress'],
|
|
#"Discount" => $v['Discount'],
|
|
#"Limit" => $v['Limit'],
|
|
#"LockMark" => $v['LockMark'],
|
|
#"DubiousMark" => $v['DubiousMark'],
|
|
#"DubiousText" => $v['DubiousText'],
|
|
#"DirectDebit" => $v['DirectDebit'],
|
|
#"BankName1" => $v['BankName1'],#"string",
|
|
#"BankAccountNumber1" => $v['BankAccountNumber1'],#"string",
|
|
#"BankCodeNumber1" => $v['BankCodeNumber1'],#"string",
|
|
#"BankName2" => $v['BankName2'],#"string",
|
|
#"BankAccountNumber2" => $v['BankAccountNumber2'],#"string",
|
|
#"BankCodeNumber2" => $v['BankCodeNumber2'],#"string",
|
|
#"BankName3" => $v['BankName3'],#"string",
|
|
#"BankAccountNumber3" => $v['BankAccountNumber3'],#"string",
|
|
#"BankCodeNumber3" => $v['BankCodeNumber3'],#"string",
|
|
#"CreditcardNumber1" => $v['CreditcardNumber1'],#"string",
|
|
#"CreditcardNumber2" => $v['CreditcardNumber2'],#"string",
|
|
#"CreditcardNumber3" => $v['CreditcardNumber3'],#"string",
|
|
#"CreditcardNumber4" => $v['CreditcardNumber4'],#"string",
|
|
#"ChangeIndicator" => $v['ChangeIndicator'],
|
|
#"Newsletter" => $v['Newsletter'],
|
|
#"Password" => $v['Password'],
|
|
#"AdBan" => $v['AdBan']
|
|
);
|
|
}
|
|
}
|
|
#dump($arr);
|
|
return $arr;
|
|
}
|
|
|
|
/**
|
|
* @param $data
|
|
* @return bool
|
|
* @throws \Exception
|
|
*/
|
|
public function sendOrderToHiltes($data): bool
|
|
{
|
|
$url = $this->hiltesApiUrl . '/api/WebSale/import';
|
|
$r = $this->sendToHiltes($url, $data, true);
|
|
//$r = true;
|
|
|
|
if ($r === false) {
|
|
$this->logger->error('Send Order Error ' . __LINE__);
|
|
return false;
|
|
}
|
|
|
|
$t = json_decode($r, true);
|
|
$order = $this->orderRepository->findOneBy(array('orderId' => $data['SaleList'][0]['OrderNumber']));
|
|
|
|
if (!$order) {
|
|
$this->logger->error('Order not found ' . $data['SaleList'][0]['OrderNumber']);
|
|
return false;
|
|
}
|
|
|
|
if ($t['Success']) {
|
|
|
|
try {
|
|
//Status 3 für erfolgreich exportiert
|
|
$order->setStatus(3);
|
|
// $order->setHiltes($t);
|
|
|
|
$this->orderRepository->update($order, true);
|
|
} catch (\Exception $exception) {
|
|
$this->logger->error('Send Order Error ' . $exception->getMessage() . __LINE__);
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
} else {
|
|
|
|
try {
|
|
//Status 4 für Fehler
|
|
$order->setStatus(4);
|
|
$order->setHiltes($t['Errors']);
|
|
|
|
$this->orderRepository->update($order, true);
|
|
} catch (\Exception $exception) {
|
|
$this->logger->error('Send Order Error ' . $exception->getMessage() . __LINE__);
|
|
return false;
|
|
}
|
|
|
|
$this->logger->error('Send Order Error ' . var_export($t['errors'], 1) . __LINE__);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
} |