From c5b57ec26decea1e910e7d181041a2c8b864c487 Mon Sep 17 00:00:00 2001 From: AnthonyAxenov Date: Wed, 24 Nov 2021 17:54:04 +0800 Subject: [PATCH] =?UTF-8?q?=D0=9A=D0=BB=D0=B0=D1=81=D1=81=20`MoneyTransfer?= =?UTF-8?q?Operator`,=20=D0=BF=D0=BE=D0=BA=D1=80=D1=8B=D1=82=D1=8B=D0=B9?= =?UTF-8?q?=20=D1=82=D0=B5=D1=81=D1=82=D0=B0=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Также мелкофиксы по phpdoc `PayingAgent` и его тестам --- src/Constants/Ffd105Tags.php | 7 +- src/Entities/Kkt.php | 2 +- src/Entities/MoneyTransferOperator.php | 85 +++++++++++++++++ src/Entities/PayingAgent.php | 10 +- src/Enums/AgentTypes.php | 8 +- src/Exceptions/InvalidPhoneException.php | 3 +- .../Entities/MoneyTransferOperatorTest.php | 95 +++++++++++++++++++ .../Tests/Entities/PayingAgentTest.php | 7 +- 8 files changed, 202 insertions(+), 15 deletions(-) create mode 100644 src/Entities/MoneyTransferOperator.php create mode 100644 tests/AtolOnline/Tests/Entities/MoneyTransferOperatorTest.php diff --git a/src/Constants/Ffd105Tags.php b/src/Constants/Ffd105Tags.php index f2b4003..c7b71de 100644 --- a/src/Constants/Ffd105Tags.php +++ b/src/Constants/Ffd105Tags.php @@ -44,13 +44,18 @@ final class Ffd105Tags */ const COMPANY_PADDRESS = 1187; + /** + * Телефон оператора по приёму платежей + */ + const RPO_PHONES = 1074; + /** * ИНН оператора перевода */ const MTO_INN = 1016; /** - * Телефон платежного агента + * Телефон платёжного агента */ const PAGENT_PHONE = 1073; diff --git a/src/Entities/Kkt.php b/src/Entities/Kkt.php index fab9335..7203951 100644 --- a/src/Entities/Kkt.php +++ b/src/Entities/Kkt.php @@ -52,7 +52,7 @@ final class Kkt extends Entity 3 => 'Разрыв соединения при передаче документа на сервер', 4 => 'Некорректный заголовок сессионного пакета', 5 => 'Превышен таймаут ожидания квитанции', - 6 => 'Разрыв соединения при приеме квитанции', + 6 => 'Разрыв соединения при приёме квитанции', 7 => 'Превышен таймаут передачи документа на сервер', 8 => 'ОФД-процесс не иницилизирован', ]; diff --git a/src/Entities/MoneyTransferOperator.php b/src/Entities/MoneyTransferOperator.php new file mode 100644 index 0000000..ddddf66 --- /dev/null +++ b/src/Entities/MoneyTransferOperator.php @@ -0,0 +1,85 @@ +setPhones($phones); + } + + /** + * Возвращает установленные номера телефонов + * + * @todo вытащить в трейт + * @return Collection + */ + public function getPhones(): Collection + { + return $this->phones; + } + + /** + * Устанавливает массив номеров телефонов + * + * @todo вытащить в трейт + * @param array|Collection|null $phones + * @return $this + * @throws InvalidPhoneException + */ + public function setPhones(array|Collection|null $phones): self + { + if (!is_null($phones)) { + $phones = is_array($phones) ? collect($phones) : $phones; + $phones->each(function ($phone) { + $phone = preg_replace('/[^\d]/', '', trim($phone)); + if (preg_match(Constraints::PATTERN_PHONE, $phone) != 1) { + throw new InvalidPhoneException($phone); + } + }); + } + $this->phones = empty($phones) ? collect() : $phones; + return $this; + } + + /** + * @inheritDoc + */ + public function jsonSerialize(): array + { + $json = []; + !$this->getPhones()->isEmpty() && $json['phones'] = $this->getPhones()->toArray(); + return $json; + } +} diff --git a/src/Entities/PayingAgent.php b/src/Entities/PayingAgent.php index 606cfb3..69636c7 100644 --- a/src/Entities/PayingAgent.php +++ b/src/Entities/PayingAgent.php @@ -17,7 +17,7 @@ use AtolOnline\Exceptions\TooLongPayingAgentOperationException; use Illuminate\Support\Collection; /** - * Класс, описывающий данные платёжного агента + * Класс, описывающий платёжного агента * * @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 19 */ @@ -29,7 +29,7 @@ class PayingAgent extends Entity protected ?string $operation = null; /** - * @var Collection Телефоны платежного агента (1073) + * @var Collection Телефоны платёжного агента (1073) */ protected Collection $phones; @@ -37,7 +37,7 @@ class PayingAgent extends Entity * Конструктор * * @param string|null $operation Наименование операции (1044) - * @param array|Collection|null $phones Телефоны платежного агента (1073) + * @param array|Collection|null $phones Телефоны платёжного агента (1073) * @throws TooLongPayingAgentOperationException * @throws InvalidPhoneException */ @@ -81,6 +81,7 @@ class PayingAgent extends Entity /** * Устанавливает массив номеров телефонов * + * @todo вытащить в трейт * @param array|Collection|null $phones * @return $this * @throws InvalidPhoneException @@ -101,8 +102,9 @@ class PayingAgent extends Entity } /** - * Возвращает установленные + * Возвращает установленные номера телефонов * + * @todo вытащить в трейт * @return Collection */ public function getPhones(): Collection diff --git a/src/Enums/AgentTypes.php b/src/Enums/AgentTypes.php index 923d5c4..2fa51fc 100644 --- a/src/Enums/AgentTypes.php +++ b/src/Enums/AgentTypes.php @@ -23,22 +23,22 @@ use AtolOnline\Enum; final class AgentTypes extends Enum { /** - * Банковский платежный агент + * Банковский платёжный агент */ const BANK_PAYING_AGENT = 'bank_paying_agent'; /** - * Банковский платежный субагент + * Банковский платёжный субагент */ const BANK_PAYING_SUBAGENT = 'bank_paying_subagent'; /** - * Платежный агент + * Платёжный агент */ const PAYING_AGENT = 'paying_agent'; /** - * Платежный субагент + * Платёжный субагент */ const PAYING_SUBAGENT = 'paying_subagent'; diff --git a/src/Exceptions/InvalidPhoneException.php b/src/Exceptions/InvalidPhoneException.php index 3e0ac61..a2ad97f 100644 --- a/src/Exceptions/InvalidPhoneException.php +++ b/src/Exceptions/InvalidPhoneException.php @@ -14,13 +14,14 @@ namespace AtolOnline\Exceptions; use AtolOnline\Constants\Ffd105Tags; /** - * Исключение, возникающее при ошибке валидации телефона + * Исключение, возникающее при ошибке валидации номера телефона */ class InvalidPhoneException extends AtolException { protected array $ffd_tags = [ Ffd105Tags::CLIENT_CONTACT, Ffd105Tags::PAGENT_PHONE, + Ffd105Tags::RPO_PHONES, ]; /** diff --git a/tests/AtolOnline/Tests/Entities/MoneyTransferOperatorTest.php b/tests/AtolOnline/Tests/Entities/MoneyTransferOperatorTest.php new file mode 100644 index 0000000..45b8800 --- /dev/null +++ b/tests/AtolOnline/Tests/Entities/MoneyTransferOperatorTest.php @@ -0,0 +1,95 @@ +assertEquals('[]', (string)(new MoneyTransferOperator())); + } + + /** + * Тестирует конструктор с передачей значений и корректное приведение к json + * + * @covers \AtolOnline\Entities\MoneyTransferOperator + * @covers \AtolOnline\Entities\MoneyTransferOperator::jsonSerialize + * @covers \AtolOnline\Entities\MoneyTransferOperator::setPhones + * @covers \AtolOnline\Entities\MoneyTransferOperator::getPhones + * @throws InvalidPhoneException + */ + public function testConstructorWithArgs(): void + { + $this->assertAtolable(new MoneyTransferOperator(['+122997365456']), ['phones' => ['+122997365456']]); + } + + /** + * Провайдер массивов телефонов, которые приводятся к null + * + * @return array + */ + public function providerNullablePhonesArrays(): array + { + return [ + [[]], + [null], + [collect()], + ]; + } + + /** + * Тестирует установку пустых телефонов + * + * @dataProvider providerNullablePhonesArrays + * @covers \AtolOnline\Entities\MoneyTransferOperator + * @covers \AtolOnline\Entities\MoneyTransferOperator::setPhones + * @covers \AtolOnline\Entities\MoneyTransferOperator::getPhones + * @throws InvalidPhoneException + */ + public function testNullablePhones(mixed $phones): void + { + $agent = new MoneyTransferOperator($phones); + $this->assertIsCollection($agent->getPhones()); + $this->assertTrue($agent->getPhones()->isEmpty()); + } + + /** + * Тестирует установку невалидных телефонов + * + * @covers \AtolOnline\Entities\MoneyTransferOperator + * @covers \AtolOnline\Entities\MoneyTransferOperator::setPhones + * @covers \AtolOnline\Exceptions\InvalidPhoneException + * @throws InvalidPhoneException + */ + public function testInvalidPhoneException(): void + { + $this->expectException(InvalidPhoneException::class); + (new MoneyTransferOperator())->setPhones([ + '12345678901234567', // good + '+123456789012345678', // good + '12345678901234567890', // bad + '+12345678901234567890', // bad + ]); + } +} diff --git a/tests/AtolOnline/Tests/Entities/PayingAgentTest.php b/tests/AtolOnline/Tests/Entities/PayingAgentTest.php index afadb13..d835ae0 100644 --- a/tests/AtolOnline/Tests/Entities/PayingAgentTest.php +++ b/tests/AtolOnline/Tests/Entities/PayingAgentTest.php @@ -14,8 +14,7 @@ use AtolOnline\{ Exceptions\InvalidPhoneException, Exceptions\TooLongPayingAgentOperationException, Helpers, - Tests\BasicTestCase -}; + Tests\BasicTestCase}; /** * Набор тестов для проверки работы класса платёжного агента @@ -81,7 +80,7 @@ class PayingAgentTest extends BasicTestCase } /** - * Тестирует установку невалидного имени покупателя + * Тестирует установку невалидной операции * * @covers \AtolOnline\Entities\PayingAgent * @covers \AtolOnline\Entities\PayingAgent::setOperation @@ -96,7 +95,7 @@ class PayingAgentTest extends BasicTestCase /** * Провайдер массивов телефонов, которые приводятся к null * - * @return array> + * @return array */ public function providerNullablePhonesArrays(): array {