diff --git a/src/Data/Statement/CartInfoData.php b/src/Data/Statement/CartInfoData.php new file mode 100644 index 0000000..018e5b5 --- /dev/null +++ b/src/Data/Statement/CartInfoData.php @@ -0,0 +1,19 @@ + -// use Spatie\LaravelData\Data; -// - -//
-// class RurTransferData extends Data { - //
- // public function __construct( + public ?CartInfoData $cartInfo = null, + public ?string $deliveryKind = null, + public ?DepartmentalInfoData $departmentalInfo = null, public ?string $payeeAccount = null, public ?string $payeeBankBic = null, public ?string $payeeBankCorrAccount = null, @@ -38,10 +26,10 @@ class RurTransferData extends Data public ?string $payerInn = null, public ?string $payerKpp = null, public ?string $payerName = null, + public ?string $payingCondition = null, public ?string $paymentKind110 = null, - public ?string $priority = null, + public ?string $purposeCode = null, public ?string $receiptDate = null, public ?string $valueDate = null, ) {} - //
} diff --git a/src/Data/Statement/SwiftTransferData.php b/src/Data/Statement/SwiftTransferData.php new file mode 100644 index 0000000..3fb3073 --- /dev/null +++ b/src/Data/Statement/SwiftTransferData.php @@ -0,0 +1,41 @@ + -// use Spatie\LaravelData\Attributes\DataCollectionOf; use Spatie\LaravelData\Data; use Spatie\LaravelData\DataCollection; -//
- -//
-// class TransactionCollectionData extends Data { - //
- // public function __construct( #[DataCollectionOf(TransactionData::class)] - public DataCollection $transactions - ) { - } - //
+ public DataCollection $transactions, + public ?array $_links = null, + ) {} } diff --git a/src/Data/Statement/TransactionData.php b/src/Data/Statement/TransactionData.php index 606cb02..86fcb8d 100644 --- a/src/Data/Statement/TransactionData.php +++ b/src/Data/Statement/TransactionData.php @@ -1,39 +1,32 @@ -// use Spatie\LaravelData\Data; -//
- -//
-// class TransactionData extends Data { - //
- // public function __construct( public string $uuid, public string $transactionId, public string $operationDate, public string $number, - public string $direction, // DEBIT, CREDIT - public AmountData $amount, // Nested DTO for amount - public AmountData $amountRub, // Nested DTO for amount in RUB + public string $direction, + public AmountData $amount, + public AmountData $amountRub, + public ?string $documentDate = null, + public ?string $filial = null, + public ?string $operationCode = null, public ?string $paymentPurpose = null, - public ?RurTransferData $rurTransfer = null, // Nested DTO for RUR specific transfer details + public ?string $priority = null, + public ?string $revaln = null, public ?string $correspondingAccount = null, + public ?string $debtorCode = null, + public ?string $extendedDebtorCode = null, + public ?RurTransferData $rurTransfer = null, + public ?SwiftTransferData $swiftTransfer = null, + public ?CurTransferData $curTransfer = null, ) {} - //
} diff --git a/src/Requests/Statement/GetTransactionsRequest.php b/src/Requests/Statement/GetTransactionsRequest.php index 5e96553..98d3b01 100644 --- a/src/Requests/Statement/GetTransactionsRequest.php +++ b/src/Requests/Statement/GetTransactionsRequest.php @@ -1,48 +1,30 @@ -// use Apoloz\AlfaBank\Data\Statement\TransactionCollectionData; -use Apoloz\AlfaBank\Traits\HasAlfaPagination; use Saloon\Enums\Method; use Saloon\Http\Request; use Saloon\Http\Response; class GetTransactionsRequest extends Request { - use HasAlfaPagination; - protected Method $method = Method::GET; public function __construct( protected string $accountNumber, protected string $statementDate, - ?int $limit = 1000, - ?int $offset = 0 - ) { - $this->limit = $limit; - $this->offset = $offset; - } + protected int $page = 1, + protected ?string $curFormat = null, + ) {} public function resolveEndpoint(): string { return '/api/jp/v1/statement/transactions'; } - //
- //
- // public function createDtoFromResponse(Response $response): TransactionCollectionData { return TransactionCollectionData::from($response->json()); @@ -50,10 +32,11 @@ class GetTransactionsRequest extends Request protected function defaultQuery(): array { - return array_merge([ + return array_filter([ 'accountNumber' => $this->accountNumber, 'statementDate' => $this->statementDate, - ], $this->getPaginationQuery()); + 'page' => $this->page, + 'curFormat' => $this->curFormat, + ], fn ($v) => $v !== null); } - //
} diff --git a/tests/Feature/Statement/StatementTest.php b/tests/Feature/Statement/StatementTest.php index 7e8e8f4..7066e05 100644 --- a/tests/Feature/Statement/StatementTest.php +++ b/tests/Feature/Statement/StatementTest.php @@ -7,22 +7,66 @@ use Saloon\Http\Faking\MockResponse; test('can get transactions statement', function (): void { $mockClient = new \Saloon\Http\Faking\MockClient([ GetTransactionsRequest::class => MockResponse::make([ - 'pagination' => [ - 'totalCount' => 1, - 'limit' => 10, - 'offset' => 0, + '_links' => [ + ['rel' => 'prev', 'href' => '?accountNumber=40702810500006103990&statementDate=2018-03-15&page=1'], + ['rel' => 'next', 'href' => '?accountNumber=40702810500006103990&statementDate=2018-03-15&page=3'], ], 'transactions' => [ [ - 'uuid' => 'uuid-123', - 'transactionId' => 'tx-123', - 'operationDate' => '2023-01-01', - 'number' => '1', + 'uuid' => '55daccdf-de87-3879-976c-8b8415c8caf9', + 'transactionId' => '1211206MOCO#DS0000017', + 'operationDate' => '2018-12-31T00:00:00Z', + 'number' => '1843', 'direction' => 'CREDIT', 'amount' => ['amount' => 100.00, 'currencyName' => 'RUB'], - 'amountRub' => ['amount' => 100.00, 'currencyName' => 'RUB'], - 'paymentPurpose' => 'Test', - 'correspondingAccount' => '408...', + 'amountRub' => ['amount' => 100.00, 'currencyName' => 'RUR'], + 'documentDate' => '2021-10-07', + 'filial' => 'АО "АЛЬФА-БАНК"', + 'operationCode' => '01', + 'paymentPurpose' => 'НДС не облагается', + 'priority' => '5', + 'revaln' => 'ПК', + 'correspondingAccount' => '30101810400000000225', + 'debtorCode' => '0', + 'extendedDebtorCode' => '50012008', + 'rurTransfer' => [ + 'cartInfo' => [ + 'documentCode' => 'doc-code', + 'documentNumber' => 'doc-num', + ], + 'deliveryKind' => 'электронно', + 'departmentalInfo' => [ + 'kbk' => '39210202010061000160', + 'oktmo' => '11605000', + ], + 'payeeAccount' => '40802810401300015422', + 'payeeBankBic' => '044525593', + 'payeeInn' => '7728168971', + 'payeeName' => 'Наименование получателя', + 'payerAccount' => '40802810701300000761', + 'payerBankBic' => '044525593', + 'payerInn' => '7728168971', + 'payerName' => 'Гаврилов Добрыня Петрович', + 'payingCondition' => 'payingCondition', + 'paymentKind110' => '1', + 'purposeCode' => '1', + 'receiptDate' => '2018-12-31', + 'valueDate' => '2018-12-31', + ], + 'swiftTransfer' => [ + 'bankOperationCode' => 'CRED', + 'beneficiaryBankAccount' => 'LOYDGB21323', + 'beneficiaryBankName' => 'АО "АЛЬФА-БАНК"', + 'exchangeRate' => '67,74', + 'instructedAmount' => 'USD70,00', + ], + 'curTransfer' => [ + 'bankOperationCode' => 'CRED', + 'intermediaryBankOption' => 'D', + 'intermediaryBankName' => 'АО "АЛЬФА-БАНК"', + 'orderingCustomerName' => 'ООО Радуга', + 'exchangeRate' => '67,74', + ], ], ], ], 200, ['Content-Type' => 'application/json']), @@ -32,10 +76,69 @@ test('can get transactions statement', function (): void { $connector = new AlfaBankConnector($config); $connector->withMockClient($mockClient); - $request = new GetTransactionsRequest('408...', '2023-01-01', '2023-01-02'); + $request = new GetTransactionsRequest( + accountNumber: '40702810500006103990', + statementDate: '2018-03-15', + page: 2, + curFormat: 'swiftTransfer', + ); $response = $connector->send($request); - expect($response->status())->toBe(200) - ->and($response->dto()->transactions[0]->transactionId)->toBe('tx-123') - ->and($response->dto()->transactions[0]->amount->amount)->toBe(100.00); + $dto = $response->dto(); + + expect($response->status())->toBe(200); + expect($dto->_links)->toBeArray()->toHaveCount(2); + expect($dto->transactions)->toHaveCount(1); + + $tx = $dto->transactions[0]; + expect($tx->transactionId)->toBe('1211206MOCO#DS0000017') + ->and($tx->direction)->toBe('CREDIT') + ->and($tx->amount->amount)->toBe(100.00) + ->and($tx->amountRub->currencyName)->toBe('RUR') + ->and($tx->documentDate)->toBe('2021-10-07') + ->and($tx->filial)->toBe('АО "АЛЬФА-БАНК"') + ->and($tx->operationCode)->toBe('01') + ->and($tx->priority)->toBe('5') + ->and($tx->revaln)->toBe('ПК') + ->and($tx->debtorCode)->toBe('0') + ->and($tx->extendedDebtorCode)->toBe('50012008'); + + expect($tx->rurTransfer)->not->toBeNull(); + expect($tx->rurTransfer->cartInfo)->not->toBeNull(); + expect($tx->rurTransfer->cartInfo->documentCode)->toBe('doc-code'); + expect($tx->rurTransfer->deliveryKind)->toBe('электронно'); + expect($tx->rurTransfer->departmentalInfo)->not->toBeNull(); + expect($tx->rurTransfer->departmentalInfo->kbk)->toBe('39210202010061000160'); + expect($tx->rurTransfer->payingCondition)->toBe('payingCondition'); + expect($tx->rurTransfer->purposeCode)->toBe('1'); + expect($tx->rurTransfer->receiptDate)->toBe('2018-12-31'); + + expect($tx->swiftTransfer)->not->toBeNull(); + expect($tx->swiftTransfer->bankOperationCode)->toBe('CRED'); + expect($tx->swiftTransfer->instructedAmount)->toBe('USD70,00'); + + expect($tx->curTransfer)->not->toBeNull(); + expect($tx->curTransfer->orderingCustomerName)->toBe('ООО Радуга'); +}); + +test('can get transactions with default page', function (): void { + $mockClient = new \Saloon\Http\Faking\MockClient([ + GetTransactionsRequest::class => MockResponse::make([ + '_links' => [], + 'transactions' => [], + ], 200, ['Content-Type' => 'application/json']), + ]); + + $config = createTestConfig(); + $connector = new AlfaBankConnector($config); + $connector->withMockClient($mockClient); + + $request = new GetTransactionsRequest( + accountNumber: '40702810500006103990', + statementDate: '2018-03-15', + ); + $response = $connector->send($request); + + expect($response->status())->toBe(200); + expect($response->dto()->transactions)->toHaveCount(0); });