From 427b030783187789ffed178576deec0af88f2ed7 Mon Sep 17 00:00:00 2001 From: Karol Wojciechowski Date: Mon, 24 Aug 2026 15:48:39 +0200 Subject: [PATCH 1/2] Anchor date --- .../Fields/Recurring/Schedule/AnchorDay.php | 25 +++++++++ src/Model/Objects/Recurring/Schedule.php | 5 ++ tests/Api/Recurring/RecurringApiTest.php | 52 +++++++++++++++++++ 3 files changed, 82 insertions(+) create mode 100644 src/Model/Fields/Recurring/Schedule/AnchorDay.php diff --git a/src/Model/Fields/Recurring/Schedule/AnchorDay.php b/src/Model/Fields/Recurring/Schedule/AnchorDay.php new file mode 100644 index 0000000..01b99ab --- /dev/null +++ b/src/Model/Fields/Recurring/Schedule/AnchorDay.php @@ -0,0 +1,25 @@ + IntervalType::class, 'chargeCount' => ChargeCount::class, 'retryIntervals' => [RetryInterval::class], + 'anchorDay' => AnchorDay::class, ]; /** @var Amount */ @@ -43,6 +45,9 @@ class Schedule extends Objects /** @var RetryInterval */ public $retryIntervals; + /** @var AnchorDay */ + public $anchorDay; + public function getRequiredFields() { return [ diff --git a/tests/Api/Recurring/RecurringApiTest.php b/tests/Api/Recurring/RecurringApiTest.php index b841bdb..6c3320a 100644 --- a/tests/Api/Recurring/RecurringApiTest.php +++ b/tests/Api/Recurring/RecurringApiTest.php @@ -2,6 +2,7 @@ namespace Tpay\Tests\OpenApi\Api\Recurring; +use InvalidArgumentException; use PHPUnit\Framework\TestCase; use Tpay\OpenApi\Api\Recurring\RecurringApi; use Tpay\OpenApi\Model\Fields\Token\AccessToken; @@ -93,6 +94,57 @@ public function testUpdatePaymentInstrumentInProductionModeAllowsTestPaymentType self::assertSame('ok', $result); } + public function testCreateRecurringAcceptsAnchorDayInSchedule() + { + CurlMock::setConsecutiveReturnedTransfers('"ok"'); + + $result = $this->createRecurringApi(false)->createRecurring($this->recurringFields(28)); + + self::assertSame('ok', $result); + } + + public function testCreateRecurringAcceptsNullAnchorDayInSchedule() + { + CurlMock::setConsecutiveReturnedTransfers('"ok"'); + + $result = $this->createRecurringApi(false)->createRecurring($this->recurringFields(null)); + + self::assertSame('ok', $result); + } + + public function testCreateRecurringDoesNotAllowAnchorDayOutOfRange() + { + CurlMock::expectNoCurlExecCall(); + + $this->expectException(InvalidArgumentException::class); + + $this->createRecurringApi(false)->createRecurring($this->recurringFields(32)); + } + + /** @param null|int $anchorDay */ + private function recurringFields($anchorDay) + { + return [ + 'description' => 'Recurring Order AB-CD-12', + 'payer' => [ + 'email' => 'jan.kowalski@example.com', + 'name' => 'Jan Kowalski', + ], + 'schedule' => [ + 'amount' => 12.34, + 'currency' => 'PLN', + 'firstChargeDate' => '2025-11-12T12:34:00+02:00', + 'interval' => 1, + 'intervalType' => 'months', + 'anchorDay' => $anchorDay, + ], + 'paymentInstrument' => [ + 'paymentType' => 'card_token', + 'value' => 'card-token-value', + ], + ]; + } + private function createRecurringApi($productionMode) { $accessToken = $this->createMock(AccessToken::class); From 32f5c7469aeb2aed03658be96e261771dc114880 Mon Sep 17 00:00:00 2001 From: Karol Wojciechowski Date: Mon, 24 Aug 2026 21:37:37 +0200 Subject: [PATCH 2/2] fix --- tests/Api/Recurring/RecurringApiTest.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/Api/Recurring/RecurringApiTest.php b/tests/Api/Recurring/RecurringApiTest.php index 6c3320a..9e8a4a6 100644 --- a/tests/Api/Recurring/RecurringApiTest.php +++ b/tests/Api/Recurring/RecurringApiTest.php @@ -125,6 +125,7 @@ public function testCreateRecurringDoesNotAllowAnchorDayOutOfRange() private function recurringFields($anchorDay) { return [ + 'id' => 'rec_12345678901234567890AB', 'description' => 'Recurring Order AB-CD-12', 'payer' => [ 'email' => 'jan.kowalski@example.com', @@ -142,6 +143,7 @@ private function recurringFields($anchorDay) 'paymentType' => 'card_token', 'value' => 'card-token-value', ], + 'callbackUrl' => 'https://example.com/callback', ]; }