403Webshell
Server IP : 80.87.202.40  /  Your IP : 216.73.216.169
Web Server : Apache
System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64
User : bitrix ( 600)
PHP Version : 8.2.27
Disable Function : NONE
MySQL : OFF |  cURL : ON |  WGET : ON |  Perl : ON |  Python : OFF |  Sudo : ON |  Pkexec : ON
Directory :  /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/sale/lib/delivery/rest/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/sale/lib/delivery/rest/requestservice.php
<?php

namespace Bitrix\Sale\Delivery\Rest;

use Bitrix\Main;
use Bitrix\Sale\Delivery\Requests;
use Bitrix\Sale\Delivery;
use Bitrix\Rest\RestException;

if (!Main\Loader::includeModule('rest'))
{
	return;
}

class RequestService extends BaseService
{
	private const ERROR_CODE_ADDRESSEE_IS_NOT_SPECIFIED = 'ADDRESSEE_IS_NOT_SPECIFIED';
	private const ERROR_CODE_ADDRESSEE_UNEXPECTED_VALUE = 'ADDRESSEE_UNEXPECTED_VALUE';
	private const ERROR_CODE_MESSAGE_NOT_SPECIFIED = 'MESSAGE_NOT_SPECIFIED';
	private const ERROR_CODE_MESSAGE_STATUS_NOT_SPECIFIED = 'MESSAGE_STATUS_NOT_SPECIFIED';
	private const ERROR_CODE_MESSAGE_STATUS_SEMANTIC_NOT_SPECIFIED = 'MESSAGE_STATUS_SEMANTIC_NOT_SPECIFIED';
	private const ERROR_CODE_UNEXPECTED_MESSAGE_STATUS_SEMANTIC = 'UNEXPECTED_MESSAGE_STATUS_SEMANTIC';
	private const ERROR_CODE_DELIVERY_ID_NOT_SPECIFIED = 'DELIVERY_ID_NOT_SPECIFIED';
	private const ERROR_CODE_DELIVERY_NOT_FOUND = 'DELIVERY_NOT_FOUND';
	private const ERROR_CODE_REQUEST_ID_NOT_SPECIFIED = 'REQUEST_ID_NOT_SPECIFIED';
	private const ERROR_CODE_REQUEST_NOT_FOUND = 'REQUEST_NOT_FOUND';
	private const ERROR_CODE_REQUEST_SHIPMENT_NOT_FOUND = 'REQUEST_SHIPMENT_NOT_FOUND';
	private const ERROR_CODE_DELETE_REQUEST_INTERNAL_ERROR = 'DELETE_REQUEST_INTERNAL_ERROR';
	private const ERROR_CODE_PROPERTIES_UNEXPECTED_FORMAT = 'PROPERTIES_UNEXPECTED_FORMAT';
	private const ERROR_CODE_PROPERTY_VALUE_UNEXPECTED_FORMAT = 'PROPERTY_VALUE_UNEXPECTED_FORMAT';
	private const ERROR_CODE_PROPERTY_VALUE_TAGS_UNEXPECTED_FORMAT = 'PROPERTY_VALUE_TAGS_UNEXPECTED_FORMAT';
	private const ERROR_CODE_PROPERTY_VALUE_TAG_UNEXPECTED_FORMAT = 'PROPERTY_VALUE_TAG_UNEXPECTED_FORMAT';
	private const ERROR_CODE_UNEXPECTED_REQUEST_FINALIZE_INDICATOR_VALUE = 'UNEXPECTED_REQUEST_FINALIZE_INDICATOR_VALUE';
	private const ERROR_CODE_UNEXPECTED_OVERWRITE_PROPERTIES_VALUE = 'UNEXPECTED_OVERWRITE_PROPERTIES_VALUE';
	private const ERROR_CODE_EMPTY_UPDATE_PAYLOAD = 'EMPTY_UPDATE_PAYLOAD';
	private const ERROR_CODE_UPDATE_REQUEST_INTERNAL_ERROR = 'UPDATE_REQUEST_INTERNAL_ERROR';
	private const ERROR_CODE_STATUS_UNEXPECTED_FORMAT = 'STATUS_UNEXPECTED_FORMAT';
	private const ERROR_CODE_STATUS_TEXT_NOT_SPECIFIED = 'STATUS_TEXT_NOT_SPECIFIED';
	private const ERROR_CODE_STATUS_SEMANTIC_NOT_SPECIFIED = 'STATUS_SEMANTIC_NOT_SPECIFIED';
	private const ERROR_CODE_DATE_VALUE_UNEXPECTED_FORMAT = 'DATE_VALUE_UNEXPECTED_FORMAT';

	/**
	 * @param $query
	 * @param $n
	 * @param \CRestServer $server
	 * @return bool
	 * @throws RestException
	 */
	public static function updateRequest($query, $n, \CRestServer $server): bool
	{
		self::checkDeliveryPermission();
		$params = self::prepareIncomingParams($query);

		$requestId = self::getRequestId(
			self::getDeliveryId($params, 'DELIVERY_ID'),
			$params,
			'REQUEST_ID'
		);

		$fields = [];

		if (isset($params['FINALIZE']))
		{
			if (!in_array($params['FINALIZE'], ['Y', 'N'], true))
			{
				throw new RestException(
					'Unexpected parameter FINALIZE value: Y, N expected',
					self::ERROR_CODE_UNEXPECTED_REQUEST_FINALIZE_INDICATOR_VALUE
				);
			}

			if ($params['FINALIZE'] === 'Y')
			{
				$fields['STATUS'] = Requests\Manager::STATUS_PROCESSED;
			}
		}

		$requestStatus = self::getRequestStatus($params, 'STATUS');
		if (!is_null($requestStatus))
		{
			$fields['EXTERNAL_STATUS'] = $requestStatus['TEXT'];
			$fields['EXTERNAL_STATUS_SEMANTIC'] = $requestStatus['SEMANTIC'];
		}

		$properties = self::getRequestProperties($params, 'PROPERTIES');
		if (!is_null($properties))
		{
			$fields['EXTERNAL_PROPERTIES'] = $properties;
		}

		$overwriteProperties = false;
		if (isset($params['OVERWRITE_PROPERTIES']))
		{
			if (!in_array($params['OVERWRITE_PROPERTIES'], ['Y', 'N'], true))
			{
				throw new RestException(
					'Unexpected parameter OVERWRITE_PROPERTIES value: Y, N expected',
					self::ERROR_CODE_UNEXPECTED_OVERWRITE_PROPERTIES_VALUE
				);
			}
			$overwriteProperties = $params['OVERWRITE_PROPERTIES'] === 'Y';
		}

		if (empty($fields))
		{
			throw new RestException(
				'Empty update payload',
				self::ERROR_CODE_EMPTY_UPDATE_PAYLOAD
			);
		}

		$updateResult = Requests\Manager::updateDeliveryRequest(
			$requestId,
			$fields,
			$overwriteProperties
		);
		if (!$updateResult->isSuccess())
		{
			throw new RestException('Internal error', self::ERROR_CODE_UPDATE_REQUEST_INTERNAL_ERROR);
		}

		return true;
	}

	/**
	 * @param array $params
	 * @param string $key
	 * @return array|null
	 * @throws RestException
	 */
	private static function getRequestStatus(array $params, string $key): ?array
	{
		if (!isset($params[$key]))
		{
			return null;
		}

		if (!is_array($params[$key]))
		{
			throw new RestException(
				sprintf('Unexpected status (%s) format: array expected', $key),
				self::ERROR_CODE_STATUS_UNEXPECTED_FORMAT
			);
		}

		if (empty($params[$key]['TEXT']))
		{
			throw new RestException(
				'Status text has not been specified',
				self::ERROR_CODE_STATUS_TEXT_NOT_SPECIFIED
			);
		}

		if (empty($params[$key]['SEMANTIC']))
		{
			throw new RestException(
				'Status semantic has not been specified',
				self::ERROR_CODE_STATUS_SEMANTIC_NOT_SPECIFIED
			);
		}

		if (!in_array($params[$key]['SEMANTIC'], Requests\Manager::getRequestStatusSemantics(), true))
		{
			throw new RestException(
				sprintf('Unexpected request status semantic: %s', $params[$key]['SEMANTIC']),
				self::ERROR_CODE_STATUS_SEMANTIC_NOT_SPECIFIED
			);
		}

		return [
			'TEXT' => $params[$key]['TEXT'],
			'SEMANTIC' => $params[$key]['SEMANTIC'],
		];
	}

	/**
	 * @param array $params
	 * @param string $key
	 * @return array|null
	 * @throws RestException
	 */
	private static function getRequestProperties(array $params, string $key): ?array
	{
		if (!isset($params[$key]))
		{
			return null;
		}

		if (!is_array($params[$key]))
		{
			throw new RestException(
				sprintf('Unexpected properties (%s) format: array expected', $key),
				self::ERROR_CODE_PROPERTIES_UNEXPECTED_FORMAT
			);
		}

		$result = [];
		foreach ($params[$key] as $propertyKey => $propertyValue)
		{
			$isExpectedFormat = (
				is_array($propertyValue)
				&& isset($propertyValue['NAME'])
				&& is_string($propertyValue['NAME'])
				&& !empty($propertyValue['NAME'])
				&& isset($propertyValue['VALUE'])
				&& is_string($propertyValue['VALUE'])
			);
			if (!$isExpectedFormat)
			{
				throw new RestException(
					sprintf('Unexpected property value (%s.%s) format', $key, $propertyKey),
					self::ERROR_CODE_PROPERTY_VALUE_UNEXPECTED_FORMAT
				);
			}
			$resultItem = [
				'NAME' => $propertyValue['NAME'],
				'VALUE' => $propertyValue['VALUE'],
			];

			if (isset($propertyValue['TAGS']))
			{
				if (!is_array($propertyValue['TAGS']))
				{
					throw new RestException(
						sprintf(
							'Unexpected property value\'s tags format (%s.%s) format: array expected',
							$key,
							$propertyKey
						),
						self::ERROR_CODE_PROPERTY_VALUE_TAGS_UNEXPECTED_FORMAT
					);
				}

				foreach ($propertyValue['TAGS'] as $tag)
				{
					if (!is_string($tag))
					{
						throw new RestException(
							sprintf(
								'Property value (%s.%s) tag must be of string type',
								$key,
								$propertyKey
							),
							self::ERROR_CODE_PROPERTY_VALUE_TAG_UNEXPECTED_FORMAT
						);
					}
				}

				$resultItem['TAGS'] = $propertyValue['TAGS'];
			}

			$result[] = $resultItem;
		}

		return $result;
	}

	/**
	 * @param $query
	 * @param $n
	 * @param \CRestServer $server
	 * @return bool
	 * @throws RestException
	 */
	public static function deleteRequest($query, $n, \CRestServer $server): bool
	{
		self::checkDeliveryPermission();
		$params = self::prepareIncomingParams($query);

		$deliveryId = self::getDeliveryId($params, 'DELIVERY_ID');
		$requestId = self::getRequestId($deliveryId, $params, 'REQUEST_ID');

		$deleteResult = Requests\Manager::deleteDeliveryRequest($requestId);
		if (!$deleteResult->isSuccess())
		{
			throw new RestException('Internal error', self::ERROR_CODE_DELETE_REQUEST_INTERNAL_ERROR);
		}

		return true;
	}

	/**
	 * @param $query
	 * @param $n
	 * @param \CRestServer $server
	 * @return bool
	 * @throws RestException
	 */
	public static function sendMessage($query, $n, \CRestServer $server): bool
	{
		self::checkDeliveryPermission();
		$params = self::prepareIncomingParams($query);

		$delivery = self::getDelivery($params, 'DELIVERY_ID');

		$requestId = self::getRequestId($delivery->getId(), $params, 'REQUEST_ID');

		Requests\Manager::sendMessage(
			self::getAddressee($params, 'ADDRESSEE'),
			self::getMessage($params, 'MESSAGE')->setCurrency($delivery->getCurrency()),
			$requestId,
			self::getShipmentId($requestId, $params, 'SHIPMENT_REQUEST_ID')
		);

		return true;
	}

	/**
	 * @param array $params
	 * @param string $key
	 * @return int
	 */
	private static function getDeliveryId(array $params, string $key): int
	{
		$delivery = self::getDelivery($params, $key);

		return $delivery->getId();
	}

	/**
	 * @param array $params
	 * @param string $key
	 * @return Delivery\Services\Base
	 * @throws RestException
	 */
	private static function getDelivery(array $params, string $key): Delivery\Services\Base
	{
		if (!isset($params[$key]))
		{
			throw new RestException(
				sprintf('Parameter %s is not specified', $key),
				self::ERROR_CODE_DELIVERY_ID_NOT_SPECIFIED
			);
		}

		/** @var Delivery\Services\Base $delivery */
		$delivery = Delivery\Services\Manager::getObjectById((int)$params[$key]);
		if (!$delivery)
		{
			throw new RestException(
				'Delivery service has not been found',
				self::ERROR_CODE_DELIVERY_NOT_FOUND
			);
		}

		return $delivery;
	}

	/**
	 * @param array $params
	 * @param string $key
	 * @return string
	 * @throws RestException
	 */
	private static function getAddressee(array $params, string $key): string
	{
		if (empty($params[$key]))
		{
			throw new RestException(
				sprintf('Parameter %s is not specified', $key),
				self::ERROR_CODE_ADDRESSEE_IS_NOT_SPECIFIED
			);
		}

		if (!in_array($params[$key], Requests\Manager::getMessageAddressees(), true))
		{
			throw new RestException(
				sprintf('Unexpected %s parameter value', $key),
				self::ERROR_CODE_ADDRESSEE_UNEXPECTED_VALUE
			);
		}

		return $params[$key];
	}

	/**
	 * @param int $deliveryId
	 * @param array $params
	 * @param string $key
	 * @return int
	 * @throws RestException
	 */
	private static function getRequestId(int $deliveryId, array $params, string $key): int
	{
		if (empty($params[$key]))
		{
			throw new RestException(
				sprintf('Parameter %s is not specified', $key),
				self::ERROR_CODE_REQUEST_ID_NOT_SPECIFIED
			);
		}

		$requestList = Requests\RequestTable::getList([
			'filter' => [
				'=DELIVERY_ID' => $deliveryId,
				'=EXTERNAL_ID' => $params[$key],
			]
		]);
		$request = $requestList->fetch();

		if (!$request)
		{
			throw new RestException(
				'Request has not been found',
				self::ERROR_CODE_REQUEST_NOT_FOUND
			);
		}

		return (int)$request['ID'];
	}

	/**
	 * @param int $requestId
	 * @param array $params
	 * @param string $key
	 * @return int
	 * @throws RestException
	 */
	private static function getShipmentId(int $requestId, array $params, string $key): int
	{
		$requestShipmentFilter = ['=REQUEST_ID' => $requestId];
		if (isset($params[$key]))
		{
			$requestShipmentFilter['=EXTERNAL_ID'] = (int)$params[$key];
		}
		$requestShipment = Requests\ShipmentTable::getList(['filter' => $requestShipmentFilter])->fetch();
		if (!$requestShipment)
		{
			throw new RestException(
				'Shipment has not been found',
				self::ERROR_CODE_REQUEST_SHIPMENT_NOT_FOUND
			);
		}

		return (int)$requestShipment['SHIPMENT_ID'];
	}

	/**
	 * @param array $params
	 * @param string $key
	 * @return Requests\Message\Message
	 * @throws RestException
	 */
	private static function getMessage(array $params, string $key): Requests\Message\Message
	{
		if (
			!isset($params[$key])
			|| !is_array($params[$key])
			|| (
				(!is_string($params[$key]['SUBJECT']) || empty($params[$key]['SUBJECT']))
				&& (!is_string($params[$key]['BODY']) || empty($params[$key]['BODY']))
			)
		)
		{
			throw new RestException(
				sprintf('Parameter %s is not specified', $key),
				self::ERROR_CODE_MESSAGE_NOT_SPECIFIED
			);
		}

		$message = new Requests\Message\Message();

		if (!empty($params[$key]['SUBJECT']))
		{
			$message->setSubject($params[$key]['SUBJECT']);
		}
		if (!empty($params[$key]['BODY']))
		{
			$message->setBody($params[$key]['BODY']);
		}

		if (isset($params[$key]['MONEY_VALUES']) && is_array($params[$key]['MONEY_VALUES']))
		{
			foreach ($params[$key]['MONEY_VALUES'] as $moneyKey => $moneyValue)
			{
				$message->addMoneyValue(
					(string)$moneyKey,
					(float)$moneyValue
				);
			}
		}

		if (isset($params[$key]['DATE_VALUES']) && is_array($params[$key]['DATE_VALUES']))
		{
			foreach ($params[$key]['DATE_VALUES'] as $dateKey => $dateValue)
			{
				if (!isset($dateValue['VALUE']) || !isset($dateValue['FORMAT']))
				{
					throw new RestException(
						'Unexpected date value format',
						self::ERROR_CODE_DATE_VALUE_UNEXPECTED_FORMAT
					);
				}

				$message->addDateValue(
					(string)$dateKey,
					(int)$dateValue['VALUE'],
					(string)$dateValue['FORMAT']
				);
			}
		}

		if (isset($params[$key]['STATUS']))
		{
			if (!is_string($params[$key]['STATUS']['MESSAGE']) || empty($params[$key]['STATUS']['MESSAGE']))
			{
				throw new RestException(
					'Status message is not specified',
					self::ERROR_CODE_MESSAGE_STATUS_NOT_SPECIFIED
				);
			}

			if (!is_string($params[$key]['STATUS']['SEMANTIC']) || empty($params['MESSAGE']['STATUS']['SEMANTIC']))
			{
				throw new RestException(
					'Message status semantic is not specified',
					self::ERROR_CODE_MESSAGE_STATUS_SEMANTIC_NOT_SPECIFIED
				);
			}

			if (!in_array($params[$key]['STATUS']['SEMANTIC'], Requests\Message\Status::getAvailableSemantics(), true))
			{
				throw new RestException(
					sprintf('Unexpected message status semantic: %s', $params['MESSAGE']['STATUS']['SEMANTIC']),
					self::ERROR_CODE_UNEXPECTED_MESSAGE_STATUS_SEMANTIC
				);
			}

			$message->setStatus(
				new Requests\Message\Status(
					$params[$key]['STATUS']['MESSAGE'],
					$params[$key]['STATUS']['SEMANTIC']
				)
			);
		}

		return $message;
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit