377 lines
14 KiB
PHP
377 lines
14 KiB
PHP
<?php
|
|
|
|
// ##############################################################
|
|
|
|
use KupShop\OrderingBundle\Util\Order\OrderItemInfo;
|
|
|
|
function POHODA_Orders($params)
|
|
{
|
|
$request = $params['request'];
|
|
|
|
switch ($request) {
|
|
// odesilani zmen do POHODY
|
|
case 'download':
|
|
return POHODA_OrdersDownload($params);
|
|
break;
|
|
|
|
// prijimani zmen z POHODY
|
|
case 'upload':
|
|
return POHODA_OrdersUpload($params);
|
|
break;
|
|
|
|
// pokud je spatny pozadavek
|
|
default:
|
|
$response = [
|
|
'status' => 400,
|
|
'statusMessage' => getTextString('errors', 400),
|
|
'serverTimestamp' => iso8601_encode(time()),
|
|
'requestedParams' => $params,
|
|
'responseData' => [],
|
|
];
|
|
|
|
return new xmlrpcresp(php_xmlrpc_encode($response));
|
|
break;
|
|
}
|
|
}
|
|
|
|
// ----------------------------------------------------
|
|
// odesilani zmen do POHODY
|
|
|
|
function formatPhoneNumber($phone)
|
|
{
|
|
return preg_replace('/^\+42\d/', '', $phone);
|
|
}
|
|
|
|
function POHODA_OrdersDownload($params)
|
|
{
|
|
global $cfg;
|
|
|
|
$params = $params['requestParams'];
|
|
|
|
logError(__FILE__, __LINE__, print_r($params, true), true);
|
|
|
|
// pokud neni specifikovano datum od kdy hledat udaje vrati chybu
|
|
if (!isset($params['dateFrom'])) {
|
|
$response = [
|
|
'status' => 406,
|
|
'statusMessage' => getTextString('errors', 406),
|
|
'serverTimestamp' => iso8601_encode(time()),
|
|
'requestedParams' => $params,
|
|
'responseData' => [],
|
|
];
|
|
$response2 = php_xmlrpc_encode($response);
|
|
|
|
return new xmlrpcresp($response2);
|
|
}
|
|
|
|
$response = [
|
|
'status' => 200,
|
|
'statusMessage' => getTextString('errors', 200),
|
|
'serverTimestamp' => iso8601_encode(time()),
|
|
'requestedParams' => $params,
|
|
'responseData' => [],
|
|
];
|
|
|
|
$query = POHODA_OrdersQuery($params);
|
|
|
|
$SQL = sqlQuery($query);
|
|
// logError(__FILE__, __LINE__, "Dotaz:$query, pocet radku: ".sqlNumRows($SQL), true);
|
|
if (sqlNumRows($SQL) == 0) {
|
|
$response['status'] = 204;
|
|
$response['statusMessage'] = getTextString('errors', 204);
|
|
|
|
return new xmlrpcresp(php_xmlrpc_encode($response));
|
|
}
|
|
|
|
$POHODA_OSS_VAT_LEVELS = [
|
|
OrderItemInfo::VAT_HIGH => 'historyHigh',
|
|
OrderItemInfo::VAT_LOW => 'historyLow',
|
|
OrderItemInfo::VAT_LOW2 => 'historyThird',
|
|
OrderItemInfo::VAT_NONE => 'none',
|
|
];
|
|
|
|
$count = 0;
|
|
foreach ($SQL as $row) {
|
|
// struktura pro vraceni
|
|
$items = [];
|
|
$TOTAL_PRICE = DecimalConstants::zero();
|
|
|
|
$order = new Order($row['id']);
|
|
$order->createFromDB($row['id']);
|
|
$flags = $order->getFlags();
|
|
$oss = $flags['OSS'] ?? false;
|
|
|
|
$vats = [];
|
|
$vatsSQL = sqlQueryBuilder()->select('*')->from('vats');
|
|
if (findModule(\Modules::OSS_VATS)) {
|
|
$vatsSQL->where(\Query\Operator::equals(['id_country' => $order->delivery_country]));
|
|
}
|
|
foreach ($vatsSQL->execute() as $vat) {
|
|
$data = json_decode($vat['data'] ?: '', true);
|
|
$vats[$vat['vat']] = $data['level'] ?? 'high';
|
|
}
|
|
|
|
// ---------------------------------------------------
|
|
$query = 'SELECT * FROM '.getTableName('order_items').' WHERE id_order='.intval($row['id']);
|
|
$SQL2 = sqlQuery($query);
|
|
foreach ($SQL2 as $row2) {
|
|
$code = POHODA_CreateProductCode($row2['descr'], $row2);
|
|
|
|
$priceUnit = toDecimal($row2['piece_price']);
|
|
$priceTotal = toDecimal($row2['total_price']);
|
|
|
|
// pokud se ma posilat cena uz s DPH
|
|
if (isset($cfg['Pohoda']['payVAT']) && $cfg['Pohoda']['payVAT'] === true) {
|
|
$priceUnit = calcPrice($priceUnit, $row2['tax']);
|
|
$priceTotal = calcPrice($priceTotal, $row2['tax']);
|
|
}
|
|
|
|
$TOTAL_PRICE = $TOTAL_PRICE->add($priceTotal);
|
|
|
|
$levelVat = $vats[$row2['tax']] ?? 'high';
|
|
|
|
if ($row2['tax'] == 0) {
|
|
$levelVat = 'none';
|
|
}
|
|
|
|
$items[] = [
|
|
'code' => cs_win2ascii($code),
|
|
'text' => cs_win2ascii($row2['descr']),
|
|
'quantity' => intval($row2['pieces']),
|
|
'unit' => 'ks',
|
|
'discountPercentage' => 0.0,
|
|
'note' => POHODA_OrdersNote($row2),
|
|
'guaranteeQuantity' => null,
|
|
'guaranteeType' => 'month',
|
|
'currency' => $order->currency,
|
|
'priceUnit' => $priceUnit->printFloatValue(),
|
|
'priceTotal' => $priceTotal->printFloatValue(),
|
|
'rateVAT' => doubleval($row2['tax']),
|
|
'rawRateVAT' => doubleval($row2['tax']),
|
|
'levelVAT' => $POHODA_OSS_VAT_LEVELS[$levelVat] ?? 'historyHigh',
|
|
];
|
|
unset($a);
|
|
// ---------------------------------------------------
|
|
}
|
|
|
|
$currencyDetails = [];
|
|
$currencyDetails[0] = [
|
|
'code' => $order->currency,
|
|
'rate' => $order->currency_rate,
|
|
'amount' => 1,
|
|
];
|
|
|
|
$deliveryType = $order->getDeliveryType();
|
|
|
|
$deliveryName = $deliveryType->delivery ?? '';
|
|
$paymentName = $deliveryType->payment ?? '';
|
|
|
|
if (findModule(Modules::PRICE_LEVELS) && !empty($order->id_user)) {
|
|
$user = User::createFromId($order->id_user);
|
|
$priceLevel = $user->getPriceLevel();
|
|
if ($priceLevel) {
|
|
$priceLevelName = $priceLevel->name;
|
|
}
|
|
}
|
|
|
|
$dataItem = [];
|
|
$dataItem = [
|
|
'header' => [
|
|
'orderId' => intval($row['id']),
|
|
'orderNumber' => cs_win2ascii($row['order_no']),
|
|
'orderType' => 'received',
|
|
'dateCreated' => iso8601_encode(strtotime($row['date_created'] ?? '')),
|
|
'dateAccepted' => iso8601_encode(strtotime($row['date_accept'] ?? '')),
|
|
'dateHandled' => iso8601_encode(strtotime($row['date_updated'] ?? '')),
|
|
'status_payed' => cs_win2ascii($order->status_payed ? 'true' : 'false'),
|
|
'paymentType' => cs_win2ascii($paymentName),
|
|
'deliveryType' => cs_win2ascii($deliveryName),
|
|
'note' => cs_win2ascii($row['note_user']),
|
|
'priceLevel' => cs_win2ascii($priceLevelName ?? ''),
|
|
'noteAdmin' => getNoteAdmin($order),
|
|
'oss' => cs_win2ascii($oss ? 'true' : 'false'),
|
|
'customer' => [
|
|
'name' => cs_win2ascii($row['invoice_name']),
|
|
'surname' => cs_win2ascii($row['invoice_surname']),
|
|
'company' => cs_win2ascii($row['invoice_firm']),
|
|
'ico' => cs_win2ascii(substr($row['invoice_ico'], 0, 10)),
|
|
'dic' => cs_win2ascii(substr($row['invoice_dic'], 0, 18)),
|
|
'street' => cs_win2ascii($row['invoice_street']),
|
|
'city' => cs_win2ascii($row['invoice_city']),
|
|
'zip' => cs_win2ascii(substr($row['invoice_zip'], 0, 10)),
|
|
'country' => cs_win2ascii($row['invoice_country']),
|
|
'phone' => cs_win2ascii(formatPhoneNumber($row['invoice_phone'])),
|
|
'email' => cs_win2ascii($row['invoice_email']),
|
|
'state' => cs_win2ascii($row['invoice_state']),
|
|
],
|
|
'delivery' => [
|
|
'name' => cs_win2ascii($row['delivery_name']),
|
|
'surname' => cs_win2ascii($row['delivery_surname']),
|
|
'company' => cs_win2ascii($row['delivery_firm']),
|
|
'street' => cs_win2ascii($row['delivery_street']),
|
|
'city' => cs_win2ascii($row['delivery_city']),
|
|
'zip' => cs_win2ascii(substr($row['delivery_zip'], 0, 10)),
|
|
'country' => cs_win2ascii($row['delivery_country']),
|
|
'phone' => cs_win2ascii(formatPhoneNumber($row['invoice_phone'])),
|
|
'email' => cs_win2ascii($row['invoice_email']),
|
|
'state' => cs_win2ascii($row['delivery_state']),
|
|
],
|
|
'bank' => [
|
|
'accountNo' => cs_win2ascii($row['account_no'] ?? ''),
|
|
'code' => '',
|
|
'symVar' => cs_win2ascii($row['account_symbol'] ?? ''),
|
|
'symConst' => '',
|
|
'symSpec' => cs_win2ascii($row['account_symbol'] ?? ''),
|
|
'bankName' => cs_win2ascii($row['account_bank'] ?? ''),
|
|
],
|
|
],
|
|
'items' => $items,
|
|
'summary' => [
|
|
'priceRounding' => 0,
|
|
'priceTotal' => $TOTAL_PRICE->printFloatValue(),
|
|
'currency' => $order->currency,
|
|
'currencyDetails' => $currencyDetails,
|
|
],
|
|
];
|
|
|
|
// logError(__FILE__, __LINE__, print_r($dataItem, true), true);
|
|
|
|
$response['responseData'][$count] = $dataItem;
|
|
// $response['responseData'][$count] = $row;
|
|
$count++;
|
|
|
|
unset($delivery);
|
|
}
|
|
|
|
return new xmlrpcresp(php_xmlrpc_encode($response));
|
|
}
|
|
|
|
// ----------------------------------------------------
|
|
// prijimani zmen z POHODY
|
|
|
|
function POHODA_OrdersUpload($params)
|
|
{
|
|
global $cfg;
|
|
|
|
$requestParams = $params['requestParams'];
|
|
|
|
$params = $params['requestData'];
|
|
|
|
// logError(__FILE__, __LINE__, print_r($params, true), true);
|
|
|
|
$response = [
|
|
'status' => 200,
|
|
'statusMessage' => getTextString('errors', 200),
|
|
'requestedParams' => $requestParams,
|
|
'responseData' => [],
|
|
];
|
|
|
|
foreach ($params as $item) {
|
|
$order = $item['header'];
|
|
|
|
$orderRow = POHODA_FindOrderByCode($order['code'], $item);
|
|
|
|
if (!$orderRow) {
|
|
$structItemDetails = POHODA_getDataItemDetails($order['code'], 'warning', 404, '');
|
|
|
|
$response['responseData'][] = $structItemDetails;
|
|
continue;
|
|
}
|
|
|
|
/* Preskočit už vyřízené */
|
|
if (!empty($cfg['Sync']['Orders']['isExecuted']) && $order['isExecuted'] == 'true' && $orderRow['status'] == $cfg['Sync']['Orders']['isExecuted']) {
|
|
$structItemDetails = POHODA_getDataItemDetails(0, 'ok', 200, '');
|
|
|
|
$response['responseData'][] = $structItemDetails;
|
|
continue;
|
|
}
|
|
|
|
if (!empty($cfg['Sync']['Orders']['package_id']) && !empty($order['package_id']) && empty($orderRow['package_id'])) {
|
|
sqlQuery('UPDATE orders set package_id=:package_id where id=:id', ['package_id' => $order['package_id'], 'id' => $orderRow['id']]);
|
|
}
|
|
|
|
$orderObj = new Order($orderRow['id']);
|
|
$orderObj->createFromDB($orderRow['id']);
|
|
|
|
/* Aktualizace do stavu "vyřízeno" - nastavuje se v configu do jakého stavu to má skočit */
|
|
if (!empty($cfg['Sync']['Orders']['changeStatus'])) {
|
|
POHODA_ChangeOrderStatus($orderObj, $item);
|
|
}
|
|
|
|
$structItemDetails = POHODA_getDataItemDetails($orderRow['id'], 'ok', 200, '');
|
|
$response['responseData'][] = $structItemDetails;
|
|
}
|
|
|
|
return new xmlrpcresp(php_xmlrpc_encode($response));
|
|
}
|
|
|
|
// smaze dosavadni polozky objednavky a ulozi nove
|
|
function POHODA_OrdersItemsUpload($params, $orderId)
|
|
{
|
|
$params = $params['items'];
|
|
|
|
$result = [];
|
|
|
|
// logError(__FILE__, __LINE__, print_r($params, true), true);
|
|
|
|
// smazani dosavadnich polozek objednavky
|
|
$queryDelete = 'DELETE FROM '.getTableName('order_items').' WHERE id_order='.intval($orderId).' ';
|
|
|
|
// logError(__FILE__, __LINE__, $queryDelete, true);
|
|
|
|
$SQLDelete = sqlQuery($queryDelete);
|
|
|
|
for ($i = 0; $i < count($params); $i++) {
|
|
// vyber id_product v shopden na zaklade code
|
|
// pokud nenajde produkt s zadanym kodem ulozi do id_product 0
|
|
$queryIdProduct = 'SELECT id FROM '.getTableName('products')." WHERE code='".utf8ToWin1250($params[$i]['code'])."'";
|
|
|
|
$SQL = sqlQuery($queryIdProduct);
|
|
|
|
if (sqlNumRows($SQL) != 0) {
|
|
$productId = sqlResult($SQL, 0, 'id');
|
|
$result[$i]['type'] = 'ok';
|
|
$result[$i]['status'] = 200;
|
|
$result[$i]['statusMessage'] = getTextString('errors', 200);
|
|
} else {
|
|
$productId = 0;
|
|
$result[$i]['type'] = 'warning';
|
|
$result[$i]['status'] = 200;
|
|
$result[$i]['statusMessage'] = getTextString('errors', 200);
|
|
}
|
|
|
|
$queryHead = 'INSERT INTO '.getTableName('order_items').' SET ';
|
|
|
|
$query = '';
|
|
|
|
$priceUnit = doubleval($params[$i]['priceUnit']);
|
|
$priceTotal = doubleval($params[$i]['priceTotal']);
|
|
$vat = doubleval($params[$i]['rateVAT']);
|
|
// pokud je sleva
|
|
if (isset($params[$i]['discountPercentage']) && $params[$i]['discountPercentage'] > 0) {
|
|
$priceUnit = doubleval(number_format(doubleval($params[$i]['priceUnit']) - (doubleval($params[$i]['priceUnit']) * (abs(doubleval($params[$i]['discountPercentage'])) / 100)), 3, '.', ''));
|
|
$priceTotal = doubleval(number_format(doubleval($params[$i]['priceTotal']) - (doubleval($params[$i]['priceTotal']) * (abs(doubleval($params[$i]['discountPercentage'])) / 100)), 3, '.', ''));
|
|
}
|
|
|
|
// pokud se ma posilat cena uz s DPH
|
|
if (isset($cfg['Pohoda']['payVAT']) && $cfg['Pohoda']['payVAT'] === true && $vat > 0) {
|
|
$priceUnit = doubleval(number_format($priceUnit / (1 + ($vat / 100)), 3, '.', ''));
|
|
$priceTotal = doubleval(number_format($priceTotal / (1 + ($vat / 100)), 3, '.', ''));
|
|
}
|
|
|
|
$query .= 'id_order='.intval($orderId).', ';
|
|
$query .= 'id_product='.intval($productId).', ';
|
|
$query .= (isset($params[$i]['quantity'])) ? "pieces='".intval($params[$i]['quantity'])."', " : '';
|
|
$query .= (isset($params[$i]['priceUnit'])) ? "piece_price='".doubleval($priceUnit)."', " : '';
|
|
$query .= (isset($params[$i]['priceTotal'])) ? "total_price='".doubleval($priceTotal)."', " : '';
|
|
$query .= (isset($params[$i]['text'])) ? "descr='".utf8ToWin1250($params[$i]['text'])."', " : '';
|
|
$query .= (isset($params[$i]['rateVAT'])) ? "tax='".utf8ToWin1250($vat)."'" : '';
|
|
|
|
// logError(__FILE__, __LINE__, $queryHead.$query, true);
|
|
|
|
$SQL = sqlQuery($queryHead.$query);
|
|
}
|
|
|
|
return $result;
|
|
}
|