Улучшен класс Kkt

+ setCallbackUrl(): валидация
* setLogin() и setPassword() более не зависят от тестового режима
* setPassword(): выброс AtolKktPasswordTooLongException
* auth(): выброс AtolAuthFailedException
* valid_strlen()
* Constraints::MAX_LENGTH_LOGIN
* Constraints::MAX_LENGTH_PASSWORD
* Constraints::PATTERN_CALLBACK_URL
* phpdoc
* исправление опечаток при выбросе некоторых исключений
pull/2/head
Anthony Axenov 2020-06-07 19:36:52 +08:00
parent 989c06a383
commit 9ed999f9fc
1 changed files with 67 additions and 28 deletions

View File

@ -9,14 +9,19 @@
namespace AtolOnline\Api; namespace AtolOnline\Api;
use AtolOnline\{Constants\TestEnvParams, use AtolOnline\{Constants\Constraints,
Constants\TestEnvParams,
Entities\Company, Entities\Company,
Entities\Document, Entities\Document,
Exceptions\AtolAuthFailedException,
Exceptions\AtolCallbackUrlTooLongException,
Exceptions\AtolCorrectionInfoException, Exceptions\AtolCorrectionInfoException,
Exceptions\AtolInvalidCallbackUrlException,
Exceptions\AtolInvalidUuidException, Exceptions\AtolInvalidUuidException,
Exceptions\AtolKktLoginEmptyException, Exceptions\AtolKktLoginEmptyException,
Exceptions\AtolKktLoginTooLongException, Exceptions\AtolKktLoginTooLongException,
Exceptions\AtolKktPasswordEmptyException, Exceptions\AtolKktPasswordEmptyException,
Exceptions\AtolKktPasswordTooLongException,
Exceptions\AtolWrongDocumentTypeException Exceptions\AtolWrongDocumentTypeException
}; };
use GuzzleHttp\Client; use GuzzleHttp\Client;
@ -60,6 +65,7 @@ class Kkt extends Client
* @throws \AtolOnline\Exceptions\AtolKktLoginEmptyException Логин ККТ не может быть пустым * @throws \AtolOnline\Exceptions\AtolKktLoginEmptyException Логин ККТ не может быть пустым
* @throws \AtolOnline\Exceptions\AtolKktLoginTooLongException Слишком длинный логин ККТ * @throws \AtolOnline\Exceptions\AtolKktLoginTooLongException Слишком длинный логин ККТ
* @throws \AtolOnline\Exceptions\AtolKktPasswordEmptyException Пароль ККТ не может быть пустым * @throws \AtolOnline\Exceptions\AtolKktPasswordEmptyException Пароль ККТ не может быть пустым
* @throws \AtolOnline\Exceptions\AtolKktPasswordTooLongException Слишком длинный пароль ККТ
* @see https://guzzle.readthedocs.io/en/latest/request-options.html * @see https://guzzle.readthedocs.io/en/latest/request-options.html
*/ */
public function __construct( public function __construct(
@ -117,12 +123,10 @@ class Kkt extends Client
*/ */
public function setLogin(string $login) public function setLogin(string $login)
{ {
if (!$this->isTestMode()) { if (empty($login)) {
if (empty($login)) { throw new AtolKktLoginEmptyException();
throw new AtolKktLoginEmptyException(); } elseif (valid_strlen($login) > Constraints::MAX_LENGTH_LOGIN) {
} elseif ((function_exists('mb_strlen') ? mb_strlen($login) : strlen($login)) > 100) { throw new AtolKktLoginTooLongException($login, Constraints::MAX_LENGTH_LOGIN);
throw new AtolKktLoginTooLongException($login, 100);
}
} }
$this->kkt_config['prod']['login'] = $login; $this->kkt_config['prod']['login'] = $login;
return $this; return $this;
@ -144,13 +148,14 @@ class Kkt extends Client
* @param string $password * @param string $password
* @return $this * @return $this
* @throws \AtolOnline\Exceptions\AtolKktPasswordEmptyException Пароль ККТ не может быть пустым * @throws \AtolOnline\Exceptions\AtolKktPasswordEmptyException Пароль ККТ не может быть пустым
* @throws \AtolOnline\Exceptions\AtolKktPasswordTooLongException Слишком длинный пароль ККТ
*/ */
public function setPassword(string $password) public function setPassword(string $password)
{ {
if (!$this->isTestMode()) { if (empty($password)) {
if (empty($password)) { throw new AtolKktPasswordEmptyException();
throw new AtolKktPasswordEmptyException(); } elseif (valid_strlen($password) > Constraints::MAX_LENGTH_PASSWORD) {
} throw new AtolKktPasswordTooLongException($password, Constraints::MAX_LENGTH_PASSWORD);
} }
$this->kkt_config['prod']['pass'] = $password; $this->kkt_config['prod']['pass'] = $password;
return $this; return $this;
@ -171,9 +176,16 @@ class Kkt extends Client
* *
* @param string $url * @param string $url
* @return $this * @return $this
* @throws \AtolOnline\Exceptions\AtolCallbackUrlTooLongException Слишком длинный Callback URL
* @throws \AtolOnline\Exceptions\AtolInvalidCallbackUrlException Невалидный Callback URL
*/ */
public function setCallbackUrl(string $url) public function setCallbackUrl(string $url)
{ {
if (valid_strlen($url) > Constraints::MAX_LENGTH_CALLBACK_URL) {
throw new AtolCallbackUrlTooLongException($url, Constraints::MAX_LENGTH_CALLBACK_URL);
} elseif (preg_match(Constraints::PATTERN_CALLBACK_URL, $url)) {
throw new AtolInvalidCallbackUrlException();
}
$this->kkt_config[$this->isTestMode() ? 'test' : 'prod']['callback_url'] = $url; $this->kkt_config[$this->isTestMode() ? 'test' : 'prod']['callback_url'] = $url;
return $this; return $this;
} }
@ -223,11 +235,14 @@ class Kkt extends Client
/** /**
* Регистрирует документ прихода * Регистрирует документ прихода
* *
* @param \AtolOnline\Entities\Document $document * @param \AtolOnline\Entities\Document $document Объект документа
* @param string|null $external_id Уникальный код документа (если не указан, то будет создан UUID) * @param string|null $external_id Уникальный код документа (если не указан, то будет создан UUID)
* @return \AtolOnline\Api\KktResponse * @return \AtolOnline\Api\KktResponse
* @throws \AtolOnline\Exceptions\AtolWrongDocumentTypeException Некорректный тип документа * @throws \AtolOnline\Exceptions\AtolAuthFailedException Ошибка авторизации
* @throws \AtolOnline\Exceptions\AtolCorrectionInfoException В документе есть данные коррекции * @throws \AtolOnline\Exceptions\AtolCorrectionInfoException В документе есть данные коррекции
* @throws \AtolOnline\Exceptions\AtolInnWrongLengthException Некорректная длина ИНН
* @throws \AtolOnline\Exceptions\AtolPaymentAddressTooLongException Слишком длинный адрес места расчётов
* @throws \AtolOnline\Exceptions\AtolWrongDocumentTypeException Некорректный тип документа
* @throws \GuzzleHttp\Exception\GuzzleException * @throws \GuzzleHttp\Exception\GuzzleException
*/ */
public function sell(Document $document, ?string $external_id = null) public function sell(Document $document, ?string $external_id = null)
@ -241,18 +256,22 @@ class Kkt extends Client
/** /**
* Регистрирует документ возврата прихода * Регистрирует документ возврата прихода
* *
* @param \AtolOnline\Entities\Document $document * @param \AtolOnline\Entities\Document $document Объект документа
* @param string|null $external_id Уникальный код документа (если не указан, то будет создан UUID) * @param string|null $external_id Уникальный код документа (если не указан, то будет создан UUID)
* @return \AtolOnline\Api\KktResponse * @return \AtolOnline\Api\KktResponse
* @throws \AtolOnline\Exceptions\AtolAuthFailedException Ошибка авторизации
* @throws \AtolOnline\Exceptions\AtolCorrectionInfoException В документе есть данные коррекции
* @throws \AtolOnline\Exceptions\AtolInnWrongLengthException Некорректная длина ИНН
* @throws \AtolOnline\Exceptions\AtolPaymentAddressTooLongException Слишком длинный адрес места расчётов
* @throws \AtolOnline\Exceptions\AtolPriceTooHighException Слишком большая сумма * @throws \AtolOnline\Exceptions\AtolPriceTooHighException Слишком большая сумма
* @throws \AtolOnline\Exceptions\AtolTooManyVatsException Слишком много ставок НДС * @throws \AtolOnline\Exceptions\AtolTooManyVatsException Слишком много ставок НДС
* @throws \AtolOnline\Exceptions\AtolWrongDocumentTypeException Некорректный тип документа * @throws \AtolOnline\Exceptions\AtolWrongDocumentTypeException Некорректный тип документа
* @throws \AtolOnline\Exceptions\AtolCorrectionInfoException В документе есть данные коррекции * @throws \GuzzleHttp\Exception\GuzzleException
*/ */
public function sellRefund(Document $document, ?string $external_id = null) public function sellRefund(Document $document, ?string $external_id = null)
{ {
if ($document->getCorrectionInfo()) { if ($document->getCorrectionInfo()) {
throw new AtolCorrectionInfoException('Некорректная операция над документом коррекции'); throw new AtolCorrectionInfoException('Invalid operation on correction document');
} }
return $this->registerDocument('sell_refund', 'receipt', $document->clearVats(), $external_id); return $this->registerDocument('sell_refund', 'receipt', $document->clearVats(), $external_id);
} }
@ -260,12 +279,15 @@ class Kkt extends Client
/** /**
* Регистрирует документ коррекции прихода * Регистрирует документ коррекции прихода
* *
* @param \AtolOnline\Entities\Document $document * @param \AtolOnline\Entities\Document $document Объект документа
* @param string|null $external_id Уникальный код документа (если не указан, то будет создан UUID) * @param string|null $external_id Уникальный код документа (если не указан, то будет создан UUID)
* @return \AtolOnline\Api\KktResponse * @return \AtolOnline\Api\KktResponse
* @throws \AtolOnline\Exceptions\AtolWrongDocumentTypeException Некорректный тип документа * @throws \AtolOnline\Exceptions\AtolAuthFailedException Ошибка авторизации
* @throws \AtolOnline\Exceptions\AtolCorrectionInfoException В документе отсутствуют данные коррекции * @throws \AtolOnline\Exceptions\AtolCorrectionInfoException В документе отсутствуют данные коррекции
* @throws \AtolOnline\Exceptions\AtolInnWrongLengthException Некорректная длина ИНН
* @throws \AtolOnline\Exceptions\AtolPaymentAddressTooLongException Слишком длинный адрес места расчётов
* @throws \AtolOnline\Exceptions\AtolTooManyItemsException Слишком много предметов расчёта * @throws \AtolOnline\Exceptions\AtolTooManyItemsException Слишком много предметов расчёта
* @throws \AtolOnline\Exceptions\AtolWrongDocumentTypeException Некорректный тип документа
* @throws \GuzzleHttp\Exception\GuzzleException * @throws \GuzzleHttp\Exception\GuzzleException
*/ */
public function sellCorrection(Document $document, ?string $external_id = null) public function sellCorrection(Document $document, ?string $external_id = null)
@ -283,14 +305,17 @@ class Kkt extends Client
* @param \AtolOnline\Entities\Document $document * @param \AtolOnline\Entities\Document $document
* @param string|null $external_id Уникальный код документа (если не указан, то будет создан UUID) * @param string|null $external_id Уникальный код документа (если не указан, то будет создан UUID)
* @return \AtolOnline\Api\KktResponse * @return \AtolOnline\Api\KktResponse
* @throws \AtolOnline\Exceptions\AtolWrongDocumentTypeException Некорректный тип документа * @throws \AtolOnline\Exceptions\AtolAuthFailedException Ошибка авторизации
* @throws \AtolOnline\Exceptions\AtolCorrectionInfoException В документе есть данные коррекции * @throws \AtolOnline\Exceptions\AtolCorrectionInfoException В документе есть данные коррекции
* @throws \AtolOnline\Exceptions\AtolInnWrongLengthException Некорректная длина ИНН
* @throws \AtolOnline\Exceptions\AtolPaymentAddressTooLongException Слишком длинный адрес места расчётов
* @throws \AtolOnline\Exceptions\AtolWrongDocumentTypeException Некорректный тип документа
* @throws \GuzzleHttp\Exception\GuzzleException * @throws \GuzzleHttp\Exception\GuzzleException
*/ */
public function buy(Document $document, ?string $external_id = null) public function buy(Document $document, ?string $external_id = null)
{ {
if ($document->getCorrectionInfo()) { if ($document->getCorrectionInfo()) {
throw new AtolCorrectionInfoException('Некорректная операция над документом коррекции'); throw new AtolCorrectionInfoException('Invalid operation on correction document');
} }
return $this->registerDocument('buy', 'receipt', $document, $external_id); return $this->registerDocument('buy', 'receipt', $document, $external_id);
} }
@ -301,16 +326,19 @@ class Kkt extends Client
* @param \AtolOnline\Entities\Document $document * @param \AtolOnline\Entities\Document $document
* @param string|null $external_id Уникальный код документа (если не указан, то будет создан UUID) * @param string|null $external_id Уникальный код документа (если не указан, то будет создан UUID)
* @return \AtolOnline\Api\KktResponse * @return \AtolOnline\Api\KktResponse
* @throws \AtolOnline\Exceptions\AtolAuthFailedException Ошибка авторизации
* @throws \AtolOnline\Exceptions\AtolCorrectionInfoException В документе есть данные коррекции
* @throws \AtolOnline\Exceptions\AtolInnWrongLengthException Некорректная длина ИНН
* @throws \AtolOnline\Exceptions\AtolPaymentAddressTooLongException Слишком длинный адрес места расчётов
* @throws \AtolOnline\Exceptions\AtolPriceTooHighException Слишком большая сумма * @throws \AtolOnline\Exceptions\AtolPriceTooHighException Слишком большая сумма
* @throws \AtolOnline\Exceptions\AtolTooManyVatsException Слишком много ставок НДС * @throws \AtolOnline\Exceptions\AtolTooManyVatsException Слишком много ставок НДС
* @throws \AtolOnline\Exceptions\AtolWrongDocumentTypeException Некорректный тип документа * @throws \AtolOnline\Exceptions\AtolWrongDocumentTypeException Некорректный тип документа
* @throws \AtolOnline\Exceptions\AtolCorrectionInfoException В документе есть данные коррекции
* @throws \GuzzleHttp\Exception\GuzzleException * @throws \GuzzleHttp\Exception\GuzzleException
*/ */
public function buyRefund(Document $document, ?string $external_id = null) public function buyRefund(Document $document, ?string $external_id = null)
{ {
if ($document->getCorrectionInfo()) { if ($document->getCorrectionInfo()) {
throw new AtolCorrectionInfoException('Некорректная операция над документом коррекции'); throw new AtolCorrectionInfoException('Invalid operation on correction document');
} }
return $this->registerDocument('buy_refund', 'receipt', $document->clearVats(), $external_id); return $this->registerDocument('buy_refund', 'receipt', $document->clearVats(), $external_id);
} }
@ -318,12 +346,15 @@ class Kkt extends Client
/** /**
* Регистрирует документ коррекции расхода * Регистрирует документ коррекции расхода
* *
* @param Document $document * @param \AtolOnline\Entities\Document $document
* @param string|null $external_id Уникальный код документа (если не указан, то будет создан UUID) * @param string|null $external_id Уникальный код документа (если не указан, то будет создан UUID)
* @return \AtolOnline\Api\KktResponse * @return \AtolOnline\Api\KktResponse
* @throws \AtolOnline\Exceptions\AtolWrongDocumentTypeException Некорректный тип документа * @throws \AtolOnline\Exceptions\AtolAuthFailedException Ошибка авторизации
* @throws \AtolOnline\Exceptions\AtolCorrectionInfoException В документе отсутствуют данные коррекции * @throws \AtolOnline\Exceptions\AtolCorrectionInfoException В документе отсутствуют данные коррекции
* @throws \AtolOnline\Exceptions\AtolInnWrongLengthException Некорректная длтина ИНН
* @throws \AtolOnline\Exceptions\AtolPaymentAddressTooLongException Слишком длинный адрес места расчётов
* @throws \AtolOnline\Exceptions\AtolTooManyItemsException Слишком много предметов расчёта * @throws \AtolOnline\Exceptions\AtolTooManyItemsException Слишком много предметов расчёта
* @throws \AtolOnline\Exceptions\AtolWrongDocumentTypeException Некорректный тип документа
* @throws \GuzzleHttp\Exception\GuzzleException * @throws \GuzzleHttp\Exception\GuzzleException
*/ */
public function buyCorrection(Document $document, ?string $external_id = null) public function buyCorrection(Document $document, ?string $external_id = null)
@ -340,7 +371,9 @@ class Kkt extends Client
* *
* @param string $uuid UUID регистрации * @param string $uuid UUID регистрации
* @return \AtolOnline\Api\KktResponse * @return \AtolOnline\Api\KktResponse
* @throws \AtolOnline\Exceptions\AtolAuthFailedException Ошибка авторизации
* @throws \AtolOnline\Exceptions\AtolInvalidUuidException Некорректный UUID документа * @throws \AtolOnline\Exceptions\AtolInvalidUuidException Некорректный UUID документа
* @throws \GuzzleHttp\Exception\GuzzleException
*/ */
public function getDocumentStatus(string $uuid) public function getDocumentStatus(string $uuid)
{ {
@ -360,7 +393,9 @@ class Kkt extends Client
* @param int $retry_count Количество попыток * @param int $retry_count Количество попыток
* @param int $timeout Таймаут в секундах между попытками * @param int $timeout Таймаут в секундах между попытками
* @return \AtolOnline\Api\KktResponse * @return \AtolOnline\Api\KktResponse
* @throws \AtolOnline\Exceptions\AtolException Некорректный UUID документа * @throws \AtolOnline\Exceptions\AtolAuthFailedException Ошибка авторизации
* @throws \AtolOnline\Exceptions\AtolInvalidUuidException Некорректный UUID документа
* @throws \GuzzleHttp\Exception\GuzzleException
*/ */
public function pollDocumentStatus(string $uuid, int $retry_count = 5, int $timeout = 1) public function pollDocumentStatus(string $uuid, int $retry_count = 5, int $timeout = 1)
{ {
@ -485,6 +520,7 @@ class Kkt extends Client
* Производит авторизацию на ККТ и получает токен доступа для дальнейших HTTP-запросов * Производит авторизацию на ККТ и получает токен доступа для дальнейших HTTP-запросов
* *
* @return bool * @return bool
* @throws \AtolOnline\Exceptions\AtolAuthFailedException Ошибка авторизации
* @throws \GuzzleHttp\Exception\GuzzleException * @throws \GuzzleHttp\Exception\GuzzleException
*/ */
protected function auth() protected function auth()
@ -495,7 +531,7 @@ class Kkt extends Client
'pass' => $this->getPassword(), 'pass' => $this->getPassword(),
]); ]);
if (!$result->isValid() || !$result->getContent()->token) { if (!$result->isValid() || !$result->getContent()->token) {
return false; throw new AtolAuthFailedException($result);
} }
$this->auth_token = $result->getContent()->token; $this->auth_token = $result->getContent()->token;
} }
@ -510,7 +546,10 @@ class Kkt extends Client
* @param \AtolOnline\Entities\Document $document Объект документа * @param \AtolOnline\Entities\Document $document Объект документа
* @param string|null $external_id Уникальный код документа (если не указан, то будет создан UUID) * @param string|null $external_id Уникальный код документа (если не указан, то будет создан UUID)
* @return \AtolOnline\Api\KktResponse * @return \AtolOnline\Api\KktResponse
* @throws \AtolOnline\Exceptions\AtolWrongDocumentTypeException * @throws \AtolOnline\Exceptions\AtolAuthFailedException Ошибка авторизации
* @throws \AtolOnline\Exceptions\AtolWrongDocumentTypeException Некорректный тип документа
* @throws \AtolOnline\Exceptions\AtolInnWrongLengthException Некорректная длина ИНН
* @throws \AtolOnline\Exceptions\AtolPaymentAddressTooLongException Слишком длинный адрес места расчётов
* @throws \GuzzleHttp\Exception\GuzzleException * @throws \GuzzleHttp\Exception\GuzzleException
*/ */
protected function registerDocument(string $api_method, string $type, Document $document, ?string $external_id = null) protected function registerDocument(string $api_method, string $type, Document $document, ?string $external_id = null)