1203 lines
41 KiB
PHP
Executable File
1203 lines
41 KiB
PHP
Executable File
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace mirzaev\arming_bot\controllers;
|
|
|
|
// Files of the project
|
|
use mirzaev\arming_bot\controllers\core,
|
|
mirzaev\arming_bot\models\cart,
|
|
mirzaev\arming_bot\models\deliveries\cdek,
|
|
mirzaev\arming_bot\models\enumerations\delivery as company;
|
|
|
|
// Framework for PHP
|
|
use mirzaev\minimal\http\enumerations\content,
|
|
mirzaev\minimal\http\enumerations\protocol,
|
|
mirzaev\minimal\http\request;
|
|
|
|
// Build-in libraries
|
|
use DateTime as datetime;
|
|
|
|
/**
|
|
* Controller of delivery
|
|
*
|
|
* @package mirzaev\arming_bot\controllers
|
|
*
|
|
* @param model|null $cart Instance of the cart
|
|
* @param array $errors Registry of errors
|
|
*
|
|
* @method null write(string|null $company, ?string $location, ?string $street) Validate and write delivery data to account and session buffers
|
|
* @method null calculate() Calculate delivery by validated data from buffers
|
|
*
|
|
* @license http://www.wtfpl.net/ Do What The Fuck You Want To Public License
|
|
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
|
|
*/
|
|
final class delivery extends core
|
|
{
|
|
/**
|
|
* Cart
|
|
*
|
|
* @var model|null $cart Instance of the cart
|
|
*/
|
|
protected readonly ?cart $cart;
|
|
|
|
/**
|
|
* Errors
|
|
*
|
|
* @var array $errors Registry of errors
|
|
*/
|
|
protected array $errors = [
|
|
'session' => [],
|
|
'account' => [],
|
|
'buffer' => [],
|
|
'delivery' => []
|
|
];
|
|
|
|
/**
|
|
* Write
|
|
*
|
|
* Validate and write delivery data to account and session buffers
|
|
*
|
|
* @param string|null $company Name of delivery company
|
|
* @param string|null $location Receiver location (city)
|
|
* @param string|null $street Receiver address (street with house)
|
|
* @param string|int|null $apartament Receiver apartament
|
|
* @param string|null $type Delivery type ('office', 'door')
|
|
* @param string|int|null $tariff Delivery tariff
|
|
* @param string|int|float|null $longitude Receiver longitude
|
|
* @param string|int|float|null $latitude Receiver latitude
|
|
*
|
|
* @return null
|
|
*/
|
|
public function write(
|
|
string|null $company = null,
|
|
?string $location = null,
|
|
?string $street = null,
|
|
string|int|null $apartament = null,
|
|
?string $type = null,
|
|
string|int|null $tariff = null,
|
|
string|int|float|null $longitude = null,
|
|
string|int|float|null $latitude = null
|
|
): null {
|
|
if (str_contains($this->request->headers['accept'], content::json->value)) {
|
|
// Request for JSON response
|
|
|
|
// Declaring response buffer
|
|
$response = [
|
|
'ready' => false
|
|
];
|
|
|
|
if (isset($company)) {
|
|
// Received company name
|
|
|
|
if (mb_strlen($company) < 65) {
|
|
// Validated company name
|
|
|
|
// Declating variable for normalized value of company namme
|
|
$normalized = '';
|
|
|
|
// Normalizing company name
|
|
if (preg_match('/[\w]+/u', urldecode($company), $matches)) $normalized = $matches[0] ?? '';
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($matches);
|
|
|
|
// Writing to the session buffer
|
|
$this->core->request(new request('PATCH', '/session/write', protocol::http_3, parameters: ['delivery_company' => $normalized]));
|
|
|
|
// Writing to the account buffer
|
|
$this->core->request(new request('PATCH', '/account/write', protocol::http_3, parameters: ['delivery_company' => $normalized]));
|
|
|
|
// Writing to the buffer of the response
|
|
/* $response['company'] = $normalized; */
|
|
|
|
// Initializing the cart
|
|
$this->cart ??= $this->account?->cart() ?? $this->session?->cart();
|
|
|
|
if ($this->cart instanceof cart) {
|
|
// Initialized the cart
|
|
|
|
// Initializing products in the cart
|
|
$products = $this->cart->products(language: $this->language, currency: $this->currency);
|
|
|
|
// Declaring buffer of formatted products
|
|
$formatted = [];
|
|
|
|
if (!empty($products)) {
|
|
// Initialized products
|
|
|
|
foreach ($products as $product) {
|
|
// Iterating over products
|
|
|
|
// Formatting products
|
|
for ($i = 0; $i < $product['amount']; ++$i) {
|
|
$formatted[] = [
|
|
'weight' => $product['document']['weight'] ?? 0,
|
|
...$product['document']['dimensions']
|
|
];
|
|
}
|
|
}
|
|
}
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($product);
|
|
|
|
// Writing delivery section to the buffer of the response (@todo add check for exists)
|
|
$response['delivery'] = [
|
|
'html' => $this->view->render('cart/elements/deliveries/' . $normalized . '/section.html'),
|
|
'javascript' => match ($normalized) {
|
|
'cdek' => [
|
|
[
|
|
'code' => $this->view->render('cart/elements/deliveries/' . $normalized . '/javascript.html', [
|
|
'formatted' => $formatted
|
|
])
|
|
]
|
|
],
|
|
default => null
|
|
}
|
|
];
|
|
}
|
|
|
|
// Initialization buffer of delivery parameters
|
|
$delivery = $this->account?->buffer['delivery'] ?? $this->session?->buffer['delivery'] ?? [];
|
|
|
|
// Writing readiness status to the buffer of the response
|
|
$response['ready'] = $this->model::ready(company::{$normalized}, $delivery[$normalized] ?? []);
|
|
|
|
if ($response['ready']) {
|
|
// Initialized required parameters
|
|
|
|
// Writing to the session buffer
|
|
$this->core->request(new request('PATCH', '/session/write', protocol::http_3, parameters: [$name = 'delivery_' . $normalized . '_ready' => true]));
|
|
|
|
// Writing to the account buffer
|
|
$this->core->request(new request('PATCH', '/account/write', protocol::http_3, parameters: [$name => true]));
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($name);
|
|
} else {
|
|
// Not initialized required parameters
|
|
|
|
// Writing to the session buffer
|
|
$this->core->request(new request('PATCH', '/session/write', protocol::http_3, parameters: [
|
|
$name_ready = 'delivery_' . $normalized . '_ready' => false,
|
|
$name_cost = 'delivery_' . $normalized . '_cost' => null,
|
|
$name_days = 'delivery_' . $normalized . '_days' => null
|
|
]));
|
|
|
|
// Writing to the account buffer
|
|
$this->core->request(new request('PATCH', '/account/write', protocol::http_3, parameters: [
|
|
$name_ready => false,
|
|
$name_cost => null,
|
|
$name_days => null
|
|
]));
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($name_ready, $name_cost, $name_days);
|
|
}
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($delivery, $normalized);
|
|
|
|
// Writing status of execution to the buffer of the response
|
|
$response['status'] = 'success';
|
|
}
|
|
} else if (isset($location)) {
|
|
// Received location name
|
|
|
|
if (mb_strlen($location) < 257) {
|
|
// Validated location name
|
|
|
|
// Declating variable for result value of location name
|
|
$result = '';
|
|
|
|
// Declating variable for separated values of location name
|
|
$separated = '';
|
|
|
|
// Separating location name
|
|
if (preg_match_all('/[^\W][\w\s\-]+/u', trim(urldecode($location)), $matches)) $separated = $matches[0];
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($matches);
|
|
|
|
// Initialization buffer of delivery parameters
|
|
$delivery = $this->account?->buffer['delivery'] ?? $this->session?->buffer['delivery'] ?? [];
|
|
|
|
if (!empty($delivery['company'])) {
|
|
// Initialized delivery company
|
|
|
|
if (!empty($separated)) {
|
|
// Serapated location name
|
|
|
|
// Declaring variable for normalized separated values of location name
|
|
$normalized = [];
|
|
|
|
// Normalizing location name
|
|
foreach ($separated as $value) $normalized[] = mb_ucfirst($value);
|
|
/* foreach ($separated as $value) $normalized[] = $value; */
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($separated, $value);
|
|
|
|
// Reinitializing result value of location name
|
|
$result = $normalized[0];
|
|
|
|
// Declaring of universalized locations buffer
|
|
$locations = null;
|
|
|
|
if ($delivery['company'] === 'cdek') {
|
|
// CDEK
|
|
|
|
// Searching for locations by name (first part with spaces before first comma or any non word symbol)
|
|
$cdek = cdek::location($normalized[0], $this->errors['delivery'])?->items;
|
|
|
|
foreach ($cdek ?? [] as $location) {
|
|
// Iterating over found locations
|
|
|
|
// Initializing structure
|
|
$structure = [$location->country];
|
|
|
|
// Initializing additional instances in the structure
|
|
if (!empty($location->region) && $location->region !== $location->city)
|
|
$structure[] = $location->region;
|
|
if (!empty($location->sub_region) && $location->sub_region !== $location->region && $location->sub_region !== $location->city)
|
|
$structure[] = $location->sub_region;
|
|
|
|
// Universalizing and writing to locations buffer
|
|
$locations[] = [
|
|
'identifier' => $location->code,
|
|
'name' => $location->city,
|
|
'structure' => $structure,
|
|
'longitude' => $location->longitude,
|
|
'latitude' => $location->latitude,
|
|
'data' => $location
|
|
];
|
|
}
|
|
|
|
// Deinitializing of response data from CDEK
|
|
unset($cdek);
|
|
}
|
|
|
|
if (!empty($locations)) {
|
|
// Found locations
|
|
|
|
// Declaring buffer of validated locations by input values
|
|
$buffer = [];
|
|
|
|
// Initialization of 80% of received input values (required minimum to match location characteristics)
|
|
$minimum = count($normalized) * 80 / 100;
|
|
|
|
foreach ($locations as $_location) {
|
|
// Iterating over locations
|
|
|
|
// Declaring variable with score of matching input values with location characteristics
|
|
$score = 0;
|
|
|
|
foreach ([$_location['name'], ...$_location['structure']] as $value) {
|
|
// Iterating over location characteristics
|
|
|
|
foreach ($normalized as $_value) {
|
|
// Iterating over normalized parts of location name
|
|
|
|
// Match normalized parts of location name with location characteristics using the Levenshtein algorithm
|
|
$match = levenshtein($value, $_value);
|
|
|
|
if ($match < 3) {
|
|
// The values are approximately the same
|
|
|
|
if (++$score > $minimum) {
|
|
// More than $minimum matches found
|
|
|
|
// Writing to buffer of validated locations by normalized parts of location name
|
|
$buffer[] = $_location;
|
|
|
|
// Exit from iteration of location characteristics
|
|
break 2;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($_value);
|
|
}
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($value);
|
|
}
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($_location);
|
|
|
|
// Reinitializating locations from buffer of validated locations by input values
|
|
$locations = $buffer;
|
|
|
|
/* if (count($locations) === 1) */
|
|
if (count($locations) > 0) {
|
|
// Identificated location
|
|
|
|
// Writing to the session buffer
|
|
$this->core->request(new request('PATCH', '/session/write', protocol::http_3, parameters: [$name = 'delivery_' . $delivery['company'] . '_location' => $locations[0]]));
|
|
|
|
// Writing to the account buffer
|
|
$this->core->request(new request('PATCH', '/account/write', protocol::http_3, parameters: [$name => $locations[0]]));
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($name);
|
|
|
|
// Writing result value of location name
|
|
$result = $locations[0]['name'] . ', ' . implode(', ', array_reverse($locations[0]['structure']));
|
|
|
|
// Writing to the actual buffer copy
|
|
$delivery[$delivery['company']]['location'] = $result;
|
|
|
|
// Writing location data to the buffer of the response
|
|
/* $response['location'] = [
|
|
'identifier' => $locations[0]['identifier'],
|
|
'input' => $result
|
|
]; */
|
|
|
|
// Writing readiness status to the buffer of the response
|
|
$response['ready'] = $this->model::ready(company::{$delivery['company']}, $delivery[$delivery['company']] ?? []);
|
|
|
|
if ($response['ready']) {
|
|
// Initialized required parameters
|
|
|
|
// Writing to the session buffer
|
|
$this->core->request(new request('PATCH', '/session/write', protocol::http_3, parameters: [$name = 'delivery_' . $delivery['company'] . '_ready' => true]));
|
|
|
|
// Writing to the account buffer
|
|
$this->core->request(new request('PATCH', '/account/write', protocol::http_3, parameters: [$name => true]));
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($name);
|
|
} else {
|
|
// Not initialized required parameters
|
|
|
|
// Writing to the session buffer
|
|
$this->core->request(new request('PATCH', '/session/write', protocol::http_3, parameters: [
|
|
$name_ready = 'delivery_' . $delivery['company'] . '_ready' => false,
|
|
$name_cost = 'delivery_' . $delivery['company'] . '_cost' => null,
|
|
$name_days = 'delivery_' . $delivery['company'] . '_days' => null
|
|
]));
|
|
|
|
// Writing to the account buffer
|
|
$this->core->request(new request('PATCH', '/account/write', protocol::http_3, parameters: [
|
|
$name_ready => false,
|
|
$name_cost => null,
|
|
$name_days => null
|
|
]));
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($name_ready, $name_cost, $name_days);
|
|
}
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($delivery);
|
|
|
|
// Writing locations into response buffer
|
|
$response['locations'] = [];
|
|
|
|
// Writing status of execution to the buffer of the response
|
|
$response['status'] = 'success';
|
|
} else {
|
|
// Not identificated location
|
|
|
|
// Writing to the session buffer
|
|
$this->core->request(new request('PATCH', '/session/write', protocol::http_3, parameters: [
|
|
$name_location = 'delivery_' . $delivery['company'] . '_location' => $result,
|
|
$name_ready = 'delivery_' . $delivery['company'] . '_ready' => false,
|
|
$name_cost = 'delivery_' . $delivery['company'] . '_cost' => null,
|
|
$name_days = 'delivery_' . $delivery['company'] . '_days' => null
|
|
]));
|
|
|
|
// Writing to the account buffer
|
|
$this->core->request(new request('PATCH', '/account/write', protocol::http_3, parameters: [
|
|
$name_location => $result,
|
|
$name_ready => false,
|
|
$name_cost => null,
|
|
$name_days => null
|
|
]));
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($name_location, $name_ready, $name_cost, $name_days);
|
|
|
|
// Writing status of execution to the buffer of the response (???)
|
|
$response['status'] = 'success';
|
|
|
|
// Declaring buffer of data to send
|
|
$buffer = [];
|
|
|
|
foreach ($locations as $_location) {
|
|
// Iterating over locations
|
|
|
|
// Writing to buffer of data to send
|
|
$buffer[] = [
|
|
'name' => $_location['name'],
|
|
'structure' => $_location['structure']
|
|
];
|
|
}
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($_location);
|
|
|
|
// Writing locations into response buffer
|
|
$response['locations'] = $buffer;
|
|
|
|
// Deinitializing buffer of data to send
|
|
unset($buffer);
|
|
}
|
|
} else {
|
|
// Not found locations
|
|
|
|
// Writing to the session buffer
|
|
$this->core->request(new request('PATCH', '/session/write', protocol::http_3, parameters: [
|
|
$name_location = 'delivery_' . $delivery['company'] . '_location' => null,
|
|
$name_ready = 'delivery_' . $delivery['company'] . '_ready' => false,
|
|
$name_cost = 'delivery_' . $delivery['company'] . '_cost' => null,
|
|
$name_days = 'delivery_' . $delivery['company'] . '_days' => null
|
|
]));
|
|
|
|
// Writing to the account buffer
|
|
$this->core->request(new request('PATCH', '/account/write', protocol::http_3, parameters: [
|
|
$name_location => null,
|
|
$name_ready => false,
|
|
$name_cost => null,
|
|
$name_days => null
|
|
]));
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($name_location, $name_ready, $name_cost, $name_days);
|
|
}
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($normalized);
|
|
} else {
|
|
// Value is empty after separating
|
|
|
|
// Not initialized required parameters
|
|
|
|
// Writing to the session buffer
|
|
$this->core->request(new request('PATCH', '/session/write', protocol::http_3, parameters: [
|
|
$name_location = 'delivery_' . $delivery['company'] . '_location' => null,
|
|
$name_ready = 'delivery_' . $delivery['company'] . '_ready' => false,
|
|
$name_cost = 'delivery_' . $delivery['company'] . '_cost' => null,
|
|
$name_days = 'delivery_' . $delivery['company'] . '_days' => null
|
|
]));
|
|
|
|
// Writing to the account buffer
|
|
$this->core->request(new request('PATCH', '/account/write', protocol::http_3, parameters: [
|
|
$name_location => null,
|
|
$name_ready => false,
|
|
$name_cost => null,
|
|
$name_days => null
|
|
]));
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($name_location, $name_ready, $name_cost, $name_days);
|
|
}
|
|
}
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($delivery, $normalized);
|
|
|
|
// Writing to the session buffer
|
|
$this->core->request(new request('PATCH', '/session/write', protocol::http_3, parameters: ['delivery_location' => $result]));
|
|
|
|
// Writing to the account buffer
|
|
$this->core->request(new request('PATCH', '/account/write', protocol::http_3, parameters: ['delivery_location' => $result]));
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($location, $result, $normalized);
|
|
}
|
|
} else if (isset($street)) {
|
|
// Received sreet
|
|
|
|
if (mb_strlen($street) < 129) {
|
|
// Validated street
|
|
|
|
// Declating variable for normalized value of the parameter
|
|
$normalized = '';
|
|
|
|
// Normalizing street
|
|
if (preg_match('/[\w\d\s\.\,\-]+/u', urldecode($street), $matches)) $normalized = mb_ucfirst($matches[0] ?? '');
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($matches);
|
|
|
|
// Initialization buffer of delivery parameters
|
|
$delivery = $this->account?->buffer['delivery'] ?? $this->session?->buffer['delivery'] ?? [];
|
|
|
|
if (isset($delivery['company'])) {
|
|
// Initialized delivery company
|
|
|
|
// Writing to the session buffer
|
|
$this->core->request(new request('PATCH', '/session/write', protocol::http_3, parameters: [$name = 'delivery_' . $delivery['company'] . '_street' => $normalized]));
|
|
|
|
// Writing to the account buffer
|
|
$this->core->request(new request('PATCH', '/account/write', protocol::http_3, parameters: [$name => $normalized]));
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($name);
|
|
|
|
// Writing to the actual buffer copy
|
|
$delivery[$delivery['company']]['street'] = $normalized;
|
|
|
|
// Writing readiness status to the buffer of the response
|
|
$response['ready'] = $this->model::ready(company::{$delivery['company']}, $delivery[$delivery['company']] ?? []);
|
|
|
|
if ($response['ready']) {
|
|
// Initialized required parameters
|
|
|
|
// Writing to the session buffer
|
|
$this->core->request(new request('PATCH', '/session/write', protocol::http_3, parameters: [$name = 'delivery_' . $delivery['company'] . '_ready' => true]));
|
|
|
|
// Writing to the account buffer
|
|
$this->core->request(new request('PATCH', '/account/write', protocol::http_3, parameters: [$name => true]));
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($name);
|
|
} else {
|
|
// Not initialized required parameters
|
|
|
|
// Writing to the session buffer
|
|
$this->core->request(new request('PATCH', '/session/write', protocol::http_3, parameters: [
|
|
$name_ready = 'delivery_' . $delivery['company'] . '_ready' => false,
|
|
$name_cost = 'delivery_' . $delivery['company'] . '_cost' => null,
|
|
$name_days = 'delivery_' . $delivery['company'] . '_days' => null
|
|
]));
|
|
|
|
// Writing to the account buffer
|
|
$this->core->request(new request('PATCH', '/account/write', protocol::http_3, parameters: [
|
|
$name_ready => false,
|
|
$name_cost => null,
|
|
$name_days => null
|
|
]));
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($name_ready, $name_cost, $name_days);
|
|
}
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($delivery);
|
|
|
|
// Writing status of execution to the buffer of the response
|
|
$response['status'] = 'success';
|
|
}
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($delivery);
|
|
|
|
// Writing to the session buffer
|
|
$this->core->request(new request('PATCH', '/session/write', protocol::http_3, parameters: ['delivery_street' => $normalized]));
|
|
|
|
// Writing to the account buffer
|
|
$this->core->request(new request('PATCH', '/account/write', protocol::http_3, parameters: ['delivery_street' => $normalized]));
|
|
|
|
// Writing street to the buffer of the response
|
|
/* $response['street'] = $normalized; */
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($normalized);
|
|
}
|
|
} else if (isset($type)) {
|
|
// Received delivery type
|
|
|
|
if (mb_strlen($type) < 30) {
|
|
// Validated delivery type
|
|
|
|
// Declating variable for result value of delivery type
|
|
$result = '';
|
|
|
|
// Declating variable for normalized value of delivery type
|
|
$normalized = '';
|
|
|
|
// Normalizing delivery type
|
|
if (preg_match('/[\w]+/', trim(urldecode($type)), $matches)) $normalized = $matches[0];
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($matches);
|
|
|
|
// Initialization buffer of delivery parameters
|
|
$delivery = $this->account?->buffer['delivery'] ?? $this->session?->buffer['delivery'] ?? [];
|
|
|
|
if (isset($delivery['company'])) {
|
|
// Initialized delivery company
|
|
|
|
// Writing to the session buffer
|
|
$this->core->request(new request('PATCH', '/session/write', protocol::http_3, parameters: [$name = 'delivery_' . $delivery['company'] . '_type' => $normalized]));
|
|
|
|
// Writing to the account buffer
|
|
$this->core->request(new request('PATCH', '/account/write', protocol::http_3, parameters: [$name => $normalized]));
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($name);
|
|
|
|
// Writing to the actual buffer copy
|
|
$delivery[$delivery['company']]['type'] = $normalized;
|
|
|
|
// Writing result value of delivery type
|
|
$result = $normalized;
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($normalized);
|
|
|
|
// Writing readiness status to the buffer of the response
|
|
$response['ready'] = $this->model::ready(company::{$delivery['company']}, $delivery[$delivery['company']] ?? []);
|
|
|
|
if ($response['ready']) {
|
|
// Initialized required parameters
|
|
|
|
// Writing to the session buffer
|
|
$this->core->request(new request('PATCH', '/session/write', protocol::http_3, parameters: [$name = 'delivery_' . $delivery['company'] . '_ready' => true]));
|
|
|
|
// Writing to the account buffer
|
|
$this->core->request(new request('PATCH', '/account/write', protocol::http_3, parameters: [$name => true]));
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($name);
|
|
} else {
|
|
// Not initialized required parameters
|
|
|
|
// Writing to the session buffer
|
|
$this->core->request(new request('PATCH', '/session/write', protocol::http_3, parameters: [
|
|
$name_ready = 'delivery_' . $delivery['company'] . '_ready' => false,
|
|
$name_cost = 'delivery_' . $delivery['company'] . '_cost' => null,
|
|
$name_days = 'delivery_' . $delivery['company'] . '_days' => null
|
|
]));
|
|
|
|
// Writing to the account buffer
|
|
$this->core->request(new request('PATCH', '/account/write', protocol::http_3, parameters: [
|
|
$name_ready => false,
|
|
$name_cost => null,
|
|
$name_days => null
|
|
]));
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($name_ready, $name_cost, $name_days);
|
|
}
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($delivery);
|
|
|
|
// Writing status of execution to the buffer of the response
|
|
$response['status'] = 'success';
|
|
}
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($delivery, $result, $normalized);
|
|
}
|
|
} else if (isset($tariff)) {
|
|
// Received delivery tariff
|
|
|
|
if ((is_string($tariff) && mb_strlen($tariff) < 30) || (is_int($tariff && $tariff < 10000))) {
|
|
// Validated delivery tariff
|
|
|
|
// Declating variable for result value of delivery tariff
|
|
$result = '';
|
|
|
|
// Declating variable for normalized value of delivery tariff
|
|
$normalized = '';
|
|
|
|
// Normalizing delivery tariff
|
|
if (preg_match('/[\w\d]+/', trim(urldecode($tariff)), $matches)) $normalized = $matches[0];
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($matches);
|
|
|
|
// Initialization buffer of delivery parameters
|
|
$delivery = $this->account?->buffer['delivery'] ?? $this->session?->buffer['delivery'] ?? [];
|
|
|
|
if (isset($delivery['company'])) {
|
|
// Initialized delivery company
|
|
|
|
// Writing to the session buffer
|
|
$this->core->request(new request('PATCH', '/session/write', protocol::http_3, parameters: [$name = 'delivery_' . $delivery['company'] . '_tariff' => $normalized]));
|
|
|
|
// Writing to the account buffer
|
|
$this->core->request(new request('PATCH', '/account/write', protocol::http_3, parameters: [$name => $normalized]));
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($name);
|
|
|
|
// Writing to the actual buffer copy
|
|
$delivery[$delivery['company']]['tariff'] = $normalized;
|
|
|
|
// Writing result value of delivery tariff
|
|
$result = $normalized;
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($normalized);
|
|
|
|
// Writing readiness status to the buffer of the response
|
|
$response['ready'] = $this->model::ready(company::{$delivery['company']}, $delivery[$delivery['company']] ?? []);
|
|
|
|
if ($response['ready']) {
|
|
// Initialized required parameters
|
|
|
|
// Writing to the session buffer
|
|
$this->core->request(new request('PATCH', '/session/write', protocol::http_3, parameters: [$name = 'delivery_' . $delivery['company'] . '_ready' => true]));
|
|
|
|
// Writing to the account buffer
|
|
$this->core->request(new request('PATCH', '/account/write', protocol::http_3, parameters: [$name => true]));
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($name);
|
|
} else {
|
|
// Not initialized required parameters
|
|
|
|
// Writing to the session buffer
|
|
$this->core->request(new request('PATCH', '/session/write', protocol::http_3, parameters: [
|
|
$name_ready = 'delivery_' . $delivery['company'] . '_ready' => false,
|
|
$name_cost = 'delivery_' . $delivery['company'] . '_cost' => null,
|
|
$name_days = 'delivery_' . $delivery['company'] . '_days' => null
|
|
]));
|
|
|
|
// Writing to the account buffer
|
|
$this->core->request(new request('PATCH', '/account/write', protocol::http_3, parameters: [
|
|
$name_ready => false,
|
|
$name_cost => null,
|
|
$name_days => null
|
|
]));
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($name_ready, $name_cost, $name_days);
|
|
}
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($delivery);
|
|
|
|
// Writing status of execution to the buffer of the response
|
|
$response['status'] = 'success';
|
|
}
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($delivery, $result, $normalized);
|
|
}
|
|
} else if (isset($longitude)) {
|
|
// Received delivery receiver longitude
|
|
|
|
// Declating variable for result value of delivery receiver longitude
|
|
$result = '';
|
|
|
|
// Declating variable for normalized value of delivery receiver longitude
|
|
$normalized = '';
|
|
|
|
// Normalizing receiver longitude
|
|
$normalized = filter_var($longitude, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
|
|
|
|
if ($normalized >= -180 && $normalized <= 180) {
|
|
// Validated delivery receiver longitude
|
|
|
|
// Initialization buffer of delivery parameters
|
|
$delivery = $this->account?->buffer['delivery'] ?? $this->session?->buffer['delivery'] ?? [];
|
|
|
|
if (isset($delivery['company'])) {
|
|
// Initialized delivery company
|
|
|
|
// Writing to the session buffer
|
|
$this->core->request(new request('PATCH', '/session/write', protocol::http_3, parameters: [$name = 'delivery_' . $delivery['company'] . '_longitude' => $normalized]));
|
|
|
|
// Writing to the account buffer
|
|
$this->core->request(new request('PATCH', '/account/write', protocol::http_3, parameters: [$name => $normalized]));
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($name);
|
|
|
|
// Writing to the actual buffer copy
|
|
$delivery[$delivery['company']]['longitude'] = $normalized;
|
|
|
|
// Writing result value of delivery receiver longitude
|
|
$result = $normalized;
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($normalized);
|
|
|
|
// Writing readiness status to the buffer of the response
|
|
$response['ready'] = $this->model::ready(company::{$delivery['company']}, $delivery[$delivery['company']] ?? []);
|
|
|
|
if ($response['ready']) {
|
|
// Initialized required parameters
|
|
|
|
// Writing to the session buffer
|
|
$this->core->request(new request('PATCH', '/session/write', protocol::http_3, parameters: [$name = 'delivery_' . $delivery['company'] . '_ready' => true]));
|
|
|
|
// Writing to the account buffer
|
|
$this->core->request(new request('PATCH', '/account/write', protocol::http_3, parameters: [$name => true]));
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($name);
|
|
} else {
|
|
// Not initialized required parameters
|
|
|
|
// Writing to the session buffer
|
|
$this->core->request(new request('PATCH', '/session/write', protocol::http_3, parameters: [
|
|
$name_ready = 'delivery_' . $delivery['company'] . '_ready' => false,
|
|
$name_cost = 'delivery_' . $delivery['company'] . '_cost' => null,
|
|
$name_days = 'delivery_' . $delivery['company'] . '_days' => null
|
|
]));
|
|
|
|
// Writing to the account buffer
|
|
$this->core->request(new request('PATCH', '/account/write', protocol::http_3, parameters: [
|
|
$name_ready => false,
|
|
$name_cost => null,
|
|
$name_days => null
|
|
]));
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($name_ready, $name_cost, $name_days);
|
|
}
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($delivery);
|
|
|
|
// Writing status of execution to the buffer of the response
|
|
$response['status'] = 'success';
|
|
}
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($delivery, $result, $normalized);
|
|
}
|
|
} else if (isset($latitude)) {
|
|
// Received delivery receiver latitude
|
|
|
|
// Declating variable for result value of delivery receiver latitude
|
|
$result = '';
|
|
|
|
// Declating variable for normalized value of delivery receiver latitude
|
|
$normalized = '';
|
|
|
|
// Normalizing receiver latitude
|
|
$normalized = filter_var($latitude, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
|
|
|
|
if ($normalized >= -90 && $normalized <= 90) {
|
|
// Validated delivery receiver latitude
|
|
|
|
// Initialization buffer of delivery parameters
|
|
$delivery = $this->account?->buffer['delivery'] ?? $this->session?->buffer['delivery'] ?? [];
|
|
|
|
if (isset($delivery['company'])) {
|
|
// Initialized delivery company
|
|
|
|
// Writing to the session buffer
|
|
$this->core->request(new request('PATCH', '/session/write', protocol::http_3, parameters: [$name = 'delivery_' . $delivery['company'] . '_latitude' => $normalized]));
|
|
|
|
// Writing to the account buffer
|
|
$this->core->request(new request('PATCH', '/account/write', protocol::http_3, parameters: [$name => $normalized]));
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($name);
|
|
|
|
// Writing to the actual buffer copy
|
|
$delivery[$delivery['company']]['latitude'] = $normalized;
|
|
|
|
// Writing result value of delivery receiver latitude
|
|
$result = $normalized;
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($normalized);
|
|
|
|
// Writing readiness status to the buffer of the response
|
|
$response['ready'] = $this->model::ready(company::{$delivery['company']}, $delivery[$delivery['company']] ?? []);
|
|
|
|
if ($response['ready']) {
|
|
// Initialized required parameters
|
|
|
|
// Writing to the session buffer
|
|
$this->core->request(new request('PATCH', '/session/write', protocol::http_3, parameters: [$name = 'delivery_' . $delivery['company'] . '_ready' => true]));
|
|
|
|
// Writing to the account buffer
|
|
$this->core->request(new request('PATCH', '/account/write', protocol::http_3, parameters: [$name => true]));
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($name);
|
|
} else {
|
|
// Not initialized required parameters
|
|
|
|
// Writing to the session buffer
|
|
$this->core->request(new request('PATCH', '/session/write', protocol::http_3, parameters: [
|
|
$name_ready = 'delivery_' . $delivery['company'] . '_ready' => false,
|
|
$name_cost = 'delivery_' . $delivery['company'] . '_cost' => null,
|
|
$name_days = 'delivery_' . $delivery['company'] . '_days' => null
|
|
]));
|
|
|
|
// Writing to the account buffer
|
|
$this->core->request(new request('PATCH', '/account/write', protocol::http_3, parameters: [
|
|
$name_ready => false,
|
|
$name_cost => null,
|
|
$name_days => null
|
|
]));
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($name_ready, $name_cost, $name_days);
|
|
}
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($delivery);
|
|
|
|
// Writing status of execution to the buffer of the response
|
|
$response['status'] = 'success';
|
|
}
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($delivery, $result, $normalized);
|
|
}
|
|
} else if (isset($apartament)) {
|
|
// Received delivery receiver apartament
|
|
|
|
// Declating variable for result value of delivery receiver apartament
|
|
$result = '';
|
|
|
|
// Declating variable for normalized value of delivery receiver apartament
|
|
$normalized = '';
|
|
|
|
// Normalizing receiver apartament
|
|
$normalized = filter_var($apartament, FILTER_SANITIZE_NUMBER_INT, FILTER_FLAG_ALLOW_FRACTION);
|
|
|
|
if ($normalized > 0 && $normalized <= 1000) {
|
|
// Validated delivery receiver apartament
|
|
|
|
// Initialization buffer of delivery parameters
|
|
$delivery = $this->account?->buffer['delivery'] ?? $this->session?->buffer['delivery'] ?? [];
|
|
|
|
if (isset($delivery['company'])) {
|
|
// Initialized delivery company
|
|
|
|
// Writing to the session buffer
|
|
$this->core->request(new request('PATCH', '/session/write', protocol::http_3, parameters: [$name = 'delivery_' . $delivery['company'] . '_apartament' => $normalized]));
|
|
|
|
// Writing to the account buffer
|
|
$this->core->request(new request('PATCH', '/account/write', protocol::http_3, parameters: [$name => $normalized]));
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($name);
|
|
|
|
// Writing to the actual buffer copy
|
|
$delivery[$delivery['company']]['apartment'] = $normalized;
|
|
|
|
// Writing result value of delivery receiver apartament
|
|
$result = $normalized;
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($normalized);
|
|
|
|
// Writing readiness status to the buffer of the response
|
|
$response['ready'] = $this->model::ready(company::{$delivery['company']}, $delivery[$delivery['company']] ?? []);
|
|
|
|
if ($response['ready']) {
|
|
// Initialized required parameters
|
|
|
|
// Writing to the session buffer
|
|
$this->core->request(new request('PATCH', '/session/write', protocol::http_3, parameters: [$name = 'delivery_' . $delivery['company'] . '_ready' => true]));
|
|
|
|
// Writing to the account buffer
|
|
$this->core->request(new request('PATCH', '/account/write', protocol::http_3, parameters: [$name => true]));
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($name);
|
|
} else {
|
|
// Not initialized required parameters
|
|
|
|
// Writing to the session buffer
|
|
$this->core->request(new request('PATCH', '/session/write', protocol::http_3, parameters: [
|
|
$name_ready = 'delivery_' . $delivery['company'] . '_ready' => false,
|
|
$name_cost = 'delivery_' . $delivery['company'] . '_cost' => null,
|
|
$name_days = 'delivery_' . $delivery['company'] . '_days' => null
|
|
]));
|
|
|
|
// Writing to the account buffer
|
|
$this->core->request(new request('PATCH', '/account/write', protocol::http_3, parameters: [
|
|
$name_ready => false,
|
|
$name_cost => null,
|
|
$name_days => null
|
|
]));
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($name_ready, $name_cost, $name_days);
|
|
}
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($delivery);
|
|
|
|
// Writing status of execution to the buffer of the response
|
|
$response['status'] = 'success';
|
|
}
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($delivery, $location, $result, $normalized);
|
|
}
|
|
}
|
|
|
|
// Sending response
|
|
$this->response
|
|
->start()
|
|
->clean()
|
|
->sse()
|
|
->json($response + [
|
|
'errors' => $this->errors
|
|
])
|
|
->validate($this->request)
|
|
?->body()
|
|
->end();
|
|
|
|
// Deinitializing response buffer
|
|
unset($response);
|
|
}
|
|
|
|
// Exit (success/fail)
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Calculate
|
|
*
|
|
* Calculate delivery by validated data from buffers
|
|
* and write to the cart buffer
|
|
*
|
|
* @return null
|
|
*/
|
|
public function calculate(): null
|
|
{
|
|
if (str_contains($this->request->headers['accept'], content::json->value)) {
|
|
// Request for JSON response
|
|
|
|
// Initialization buffer of delivery parameters
|
|
$delivery = $this->account?->buffer['delivery'] ?? $this->session?->buffer['delivery'] ?? [];
|
|
|
|
if (isset($delivery['company'])) {
|
|
// Initialized delivery company
|
|
|
|
// Declaring response buffer
|
|
$response = [];
|
|
|
|
if (!empty($delivery[$delivery['company']]['location']) && !empty($delivery[$delivery['company']]['street'])) {
|
|
// Required parameters initialized: company, location, street
|
|
|
|
if ($delivery['company'] === 'cdek') {
|
|
// Delivery by CDEK
|
|
|
|
// Initializing the cart
|
|
$this->cart ??= $this->account?->cart() ?? $this->session?->cart();
|
|
|
|
// Initializing products in the cart
|
|
$products = $this->cart?->products(language: $this->language, currency: $this->currency);
|
|
|
|
if (!empty($products)) {
|
|
// Initialized products
|
|
|
|
// Declaring buffer of formatted products
|
|
$formatted = [];
|
|
|
|
foreach ($products as $product) {
|
|
// Iterating over products
|
|
|
|
// Formatting products
|
|
for ($i = 0; $i < $product['amount']; ++$i) {
|
|
$formatted[] = [
|
|
'weight' => $product['document']['weight'] ?? 0,
|
|
...$product['document']['dimensions']
|
|
];
|
|
}
|
|
}
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($products, $product);
|
|
|
|
if (!empty($formatted)) {
|
|
// Formatted products
|
|
|
|
// Calculating delivery by validated data from buffers
|
|
$cdek = @cdek::calculate(
|
|
from_location: 248,
|
|
from_street: 'Екатерининская 116', // @todo issues #13
|
|
to_location: $delivery[$delivery['company']]['location']['identifier'],
|
|
to_street: $delivery[$delivery['company']]['street'],
|
|
tariff: $delivery[$delivery['company']]['tariff'] ?? 368,
|
|
products: $formatted,
|
|
date: new datetime(), // @todo weekdays only? + timezones
|
|
errors: $this->errors['delivery']
|
|
);
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($formatted);
|
|
|
|
if ($cdek) {
|
|
// Calculated delivery
|
|
|
|
// Writing to the session buffer
|
|
$this->core->request(
|
|
new request(
|
|
'PATCH',
|
|
'/session/write',
|
|
protocol::http_3,
|
|
parameters: [
|
|
'delivery_' . $delivery['company'] . '_cost' => $cdek->total_sum,
|
|
'delivery_' . $delivery['company'] . '_days' => $cdek->calendar_max
|
|
]
|
|
)
|
|
);
|
|
|
|
// Writing to the account buffer
|
|
$this->core->request(
|
|
new request(
|
|
'PATCH',
|
|
'/account/write',
|
|
protocol::http_3,
|
|
parameters: [
|
|
'delivery_' . $delivery['company'] . '_cost' => $cdek->total_sum,
|
|
'delivery_' . $delivery['company'] . '_days' => $cdek->calendar_max
|
|
]
|
|
)
|
|
);
|
|
|
|
// Writing to the cart buffer
|
|
$this->cart->buffer_write(['delivery' => [
|
|
'company' => 'cdek',
|
|
'location' => [
|
|
'identifier' => $delivery[$delivery['company']]['location']['identifier'],
|
|
'name' => $delivery[$delivery['company']]['location']['name'],
|
|
],
|
|
'street' => $delivery[$delivery['company']]['street'],
|
|
'cost' => $cdek->total_sum,
|
|
'days' => $cdek->calendar_max,
|
|
'type' => $delivery[$delivery['company']]['type'] ?? 368,
|
|
]], $this->errors['buffer']);
|
|
|
|
// Writing to response buffer
|
|
$response['cost'] = $cdek->total_sum;
|
|
$response['days'] = $cdek->calendar_max;
|
|
$response['longitude'] = $delivery[$delivery['company']]['location']['data']['longitude'];
|
|
$response['latitude'] = $delivery[$delivery['company']]['location']['data']['latitude'];
|
|
}
|
|
}
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($formatted);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Sending response
|
|
$this->response
|
|
->start()
|
|
->clean()
|
|
->sse()
|
|
->json($response + [
|
|
'errors' => $this->errors
|
|
])
|
|
->validate($this->request)
|
|
?->body()
|
|
->end();
|
|
|
|
// Deinitializing response buffer
|
|
unset($response);
|
|
}
|
|
|
|
// Deinitializing unnecessary variables
|
|
unset($delivery);
|
|
}
|
|
|
|
// Exit (success/fail)
|
|
return null;
|
|
}
|
|
}
|