diff --git a/src/Api/Collect/CollectApi.php b/src/Api/Collect/CollectApi.php new file mode 100644 index 0000000..df77d72 --- /dev/null +++ b/src/Api/Collect/CollectApi.php @@ -0,0 +1,27 @@ +addQueryFields('/collect/bank-accounts', ['page' => $page, 'limit' => $limit]); + + return $this->run(static::GET, $requestUrl); + } + + public function addBankAccount($accountNumber, $ownerName, $additionalInformation) + { + $fields = [ + 'accountNumber' => $accountNumber, + 'ownerName' => $ownerName, + 'additionalInformation' => $additionalInformation, + ]; + + return $this->run(static::POST, '/collect/bank-accounts', $fields, new CollectBankAccount()); + } +} diff --git a/src/Api/TpayApi.php b/src/Api/TpayApi.php index d791405..66ca600 100644 --- a/src/Api/TpayApi.php +++ b/src/Api/TpayApi.php @@ -5,6 +5,7 @@ use RuntimeException; use Tpay\OpenApi\Api\Accounts\AccountsApi; use Tpay\OpenApi\Api\Authorization\AuthorizationApi; +use Tpay\OpenApi\Api\Collect\CollectApi; use Tpay\OpenApi\Api\Refunds\RefundsApi; use Tpay\OpenApi\Api\Reports\ReportsApi; use Tpay\OpenApi\Api\Transactions\TransactionsApi; @@ -20,6 +21,9 @@ class TpayApi /** @var null|AuthorizationApi */ private $authorization; + /** @var null|CollectApi */ + private $collect; + /** @var null|RefundsApi */ private $refunds; @@ -169,6 +173,22 @@ public function transactions() return $this->transactions; } + /** @return CollectApi */ + public function collect() + { + $this->authorize(); + if (null === $this->collect) { + $this->collect = (new CollectApi($this->token, $this->productionMode)) + ->overrideApiUrl($this->apiUrl); + + if ($this->clientName) { + $this->collect->setClientName($this->clientName); + } + } + + return $this->collect; + } + private function authorize() { $fields = [ diff --git a/src/Model/Fields/Collect/AccountNumber.php b/src/Model/Fields/Collect/AccountNumber.php new file mode 100644 index 0000000..532a8c4 --- /dev/null +++ b/src/Model/Fields/Collect/AccountNumber.php @@ -0,0 +1,14 @@ + AccountNumber::class, + 'ownerName' => OwnerName::class, + 'additionalInformation' => AdditionalInformation::class, + ]; + + public $accountNumber; + + public $ownerName; + + public $additionalInformation; + + public function getRequiredFields() + { + return [ + $this->accountNumber, + $this->ownerName, + $this->additionalInformation, + ]; + } +} diff --git a/tests/Api/Collect/CollectApiTest.php b/tests/Api/Collect/CollectApiTest.php new file mode 100644 index 0000000..80e1f27 --- /dev/null +++ b/tests/Api/Collect/CollectApiTest.php @@ -0,0 +1,125 @@ +createCollectApiWithCurlMock('ok'); + + $result = $collectApi->addBankAccount($accountNumber, $ownerName, $additionalInformation); + + self::assertSame('ok', $result); + } + + /** @dataProvider invalidBankAccountData */ + public function testAddingInvalidBankAccount($accountNumber, $ownerName, $additionalInformation, $exception, $exceptionMessage) + { + $collectApi = $this->createCollectApiWithCurlMock('error'); + + $this->expectException($exception); + $this->expectExceptionMessage($exceptionMessage); + + $collectApi->addBankAccount($accountNumber, $ownerName, $additionalInformation); + } + + public function validBankAccountData() + { + yield 'Valid bank account' => [ + 'accountNumber' => 'PL12345678901234567890123456', + 'ownerName' => 'Jan Kowalski', + 'additionalInformation' => 'Konto firmowe', + ]; + + yield 'Min length owner name' => [ + 'accountNumber' => 'PL00000000000000000000000000', + 'ownerName' => '', + 'additionalInformation' => '', + ]; + + yield 'Max length owner name' => [ + 'accountNumber' => 'PL99999999999999999999999999', + 'ownerName' => str_repeat('A', 1000), + 'additionalInformation' => str_repeat('B', 1000), + ]; + } + + public function invalidBankAccountData() + { + yield 'Empty account number' => [ + 'accountNumber' => '', + 'ownerName' => 'Jan Kowalski', + 'additionalInformation' => 'Konto firmowe', + 'exception' => InvalidArgumentException::class, + 'exceptionMessage' => 'Value of field Tpay\OpenApi\Model\Fields\Collect\AccountNumber is too short. Min required 28', + ]; + + yield 'Invalid account number format - missing PL prefix' => [ + 'accountNumber' => '1234567890123456789012345678', + 'ownerName' => 'Jan Kowalski', + 'additionalInformation' => 'Konto firmowe', + 'exception' => InvalidArgumentException::class, + 'exceptionMessage' => 'Value of field Tpay\OpenApi\Model\Fields\Collect\AccountNumber is invalid. Should match ^PL\d{26}$ pattern', + ]; + + yield 'Account number too short' => [ + 'accountNumber' => 'PL1234567890123456789012345', + 'ownerName' => 'Jan Kowalski', + 'additionalInformation' => 'Konto firmowe', + 'exception' => InvalidArgumentException::class, + 'exceptionMessage' => 'Value of field Tpay\OpenApi\Model\Fields\Collect\AccountNumber is too short. Min required 28', + ]; + + yield 'Account number too long' => [ + 'accountNumber' => 'PL123456789012345678901234567', + 'ownerName' => 'Jan Kowalski', + 'additionalInformation' => 'Konto firmowe', + 'exception' => InvalidArgumentException::class, + 'exceptionMessage' => 'Value of field Tpay\OpenApi\Model\Fields\Collect\AccountNumber is too long. Max allowed 28', + ]; + + yield 'Owner name too long' => [ + 'accountNumber' => 'PL12345678901234567890123456', + 'ownerName' => str_repeat('A', 1001), + 'additionalInformation' => 'Konto firmowe', + 'exception' => InvalidArgumentException::class, + 'exceptionMessage' => 'Value of field Tpay\OpenApi\Model\Fields\Collect\OwnerName is too long. Max allowed 1000', + ]; + + yield 'Additional information too long' => [ + 'accountNumber' => 'PL12345678901234567890123456', + 'ownerName' => 'Jan Kowalski', + 'additionalInformation' => str_repeat('X', 1001), + 'exception' => InvalidArgumentException::class, + 'exceptionMessage' => 'Value of field Tpay\OpenApi\Model\Fields\Collect\AdditionalInformation is too long. Max allowed 1000', + ]; + } + + private function createCollectApiWithCurlMock($response) + { + $accessToken = $this->createMock(AccessToken::class); + + $token = $this->createMock(Token::class); + + $token->access_token = $accessToken; + + $collectApi = new CollectApi($token, false); + + CurlMock::setConsecutiveReturnedTransfers(json_encode($response)); + + return $collectApi; + } +}