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