Skip to content
Merged
4 changes: 2 additions & 2 deletions Block/Form/PayByLink.php
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ public function getMaxExpiryTimestamp()
*/
private function getNowPlusDays($days, $timestamp = true)
{
$date = new DateTime('now', new DateTimeZone('UTC'));
$date = new DateTime('now');
try {
$date->add(new DateInterval('P' . $days . 'D'));
} catch (Exception $e) {
Expand All @@ -89,6 +89,6 @@ private function getNowPlusDays($days, $timestamp = true)
date is within the accepted range
*/
}
return $timestamp ? $date->getTimestamp() * 1000 : $date->format(AdyenPayByLinkConfigProvider::DATE_FORMAT);
return $timestamp ? $date->getTimestamp() * 1000 : $date->format(AdyenPayByLinkConfigProvider::DATE_TIME_FORMAT);
}
}
2 changes: 1 addition & 1 deletion Gateway/Request/ExpiryDateDataBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ public function build(array $buildSubject): array
if ($expiryDate) {
$expiryDateTime = date_create_from_format(
AdyenPayByLinkConfigProvider::DATE_TIME_FORMAT,
$expiryDate . ' 23:59:59'
$expiryDate
);

$request['body']['expiresAt'] = $expiryDateTime->format(DATE_ATOM);
Expand Down
15 changes: 8 additions & 7 deletions Gateway/Validator/PaymentLinksRequestValidator.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,17 +24,18 @@ class PaymentLinksRequestValidator extends AbstractValidator
public function validate(array $validationSubject)
{
$payment = $validationSubject['payment'];
$expiresAt = $payment->getAdyenPblExpiresAt() . ' 23:59:59';

$expiresAt = $payment->getAdyenPblExpiresAt();
$isValid = true;
$errorMessages = [];

if ($expiryDate = date_create_from_format(AdyenPayByLinkConfigProvider::DATE_TIME_FORMAT, $expiresAt)) {
$daysToExpire = ($expiryDate->getTimestamp() - time()) / 86400;
if ($expiresAt) {
$expiryDate = date_create_from_format(AdyenPayByLinkConfigProvider::DATE_TIME_FORMAT, $expiresAt);
$expiryInSeconds = $expiryDate->getTimestamp();
$minExpiryInSeconds = strtotime('+' . AdyenPayByLinkConfigProvider::MIN_EXPIRY_DAYS . 'day')
- AdyenPayByLinkConfigProvider::EXPIRY_BUFFER_IN_SECONDS;
$maxExpiryInSeconds = strtotime('+' . AdyenPayByLinkConfigProvider::MAX_EXPIRY_DAYS. 'day');

if ($daysToExpire <= AdyenPayByLinkConfigProvider::MIN_EXPIRY_DAYS ||
$daysToExpire >= AdyenPayByLinkConfigProvider::MAX_EXPIRY_DAYS
) {
if ($expiryInSeconds < $minExpiryInSeconds || $expiryInSeconds >= $maxExpiryInSeconds) {
$isValid = false;
$errorMessages[] = 'Invalid expiry date selected for Adyen Pay By Link';
}
Expand Down
1 change: 1 addition & 0 deletions Model/Ui/AdyenPayByLinkConfigProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ class AdyenPayByLinkConfigProvider implements ConfigProviderInterface
const EXPIRES_AT_KEY = 'payByLinkExpiresAt';
const URL_KEY = 'payByLinkUrl';
const ID_KEY = 'payByLinkId';
const EXPIRY_BUFFER_IN_SECONDS = 60;

/**
* Request object
Expand Down
14 changes: 8 additions & 6 deletions Test/Unit/Block/Form/PayByLinkTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -43,26 +43,28 @@ protected function setUp(): void

public function testGetDefaultExpiryDate()
{
$tomorrow = new \DateTime('tomorrow', new \DateTimeZone('UTC'));
$expectedDate = new \DateTime();
$expectedDate->modify('+1 day');

$this->assertEquals(
$this->payByLink->getDefaultExpiryDate(),
$tomorrow->format(AdyenPayByLinkConfigProvider::DATE_FORMAT)
$expectedDate->format(AdyenPayByLinkConfigProvider::DATE_TIME_FORMAT)
);
}

public function testGetMinExpiryTimestamp()
{
$date = new \DateTime('now', new \DateTimeZone('UTC'));
$date->add(new \DateInterval('P' . AdyenPayByLinkConfigProvider::MIN_EXPIRY_DAYS . 'D'));
$expectedDate = new \DateTime('now');
$expectedDate->add(new \DateInterval('P' . AdyenPayByLinkConfigProvider::MIN_EXPIRY_DAYS . 'D'));
$this->assertEquals(
$this->payByLink->getMinExpiryTimestamp(),
$date->getTimestamp() * 1000
$expectedDate->getTimestamp() * 1000
);
}

public function testGetMaxExpiryTimestamp()
{
$date = new \DateTime('now', new \DateTimeZone('UTC'));
$date = new \DateTime('now');
$date->add(new \DateInterval('P' . AdyenPayByLinkConfigProvider::MAX_EXPIRY_DAYS . 'D'));
$this->assertEquals(
$this->payByLink->getMaxExpiryTimestamp(),
Expand Down
8 changes: 4 additions & 4 deletions Test/Unit/Gateway/Request/ExpiryDateDataBuilderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ public function testBuildFromRequest()
];

$formFields = [
AdyenPayByLinkDataAssignObserver::PBL_EXPIRY_DATE => '01-01-1970'
AdyenPayByLinkDataAssignObserver::PBL_EXPIRY_DATE => '01-01-1970 00:00:00'
];

$this->requestMock->expects($this->once())
Expand All @@ -70,7 +70,7 @@ public function testBuildFromRequest()

$this->assertArrayHasKey('body', $request);
$this->assertArrayHasKey('expiresAt', $request['body']);
$this->assertStringStartsWith('1970-01-01T23:59:59', $request['body']['expiresAt']);
$this->assertStringStartsWith('1970-01-01T00:00:00', $request['body']['expiresAt']);
}

/**
Expand All @@ -81,7 +81,7 @@ public function testBuildFromPayment()
$paymentMock = $this->createMock(Payment::class);
$paymentMock->method('getAdditionalInformation')
->with(AdyenPayByLinkDataAssignObserver::PBL_EXPIRY_DATE)
->willReturn('01-01-1970');
->willReturn('01-01-1970 00:00:00');

$paymentDataObjectMock = $this->createConfiguredMock(PaymentDataObject::class, [
'getPayment' => $paymentMock
Expand All @@ -102,6 +102,6 @@ public function testBuildFromPayment()

$this->assertArrayHasKey('body', $request);
$this->assertArrayHasKey('expiresAt', $request['body']);
$this->assertStringStartsWith('1970-01-01T23:59:59', $request['body']['expiresAt']);
$this->assertStringStartsWith('1970-01-01T00:00:00', $request['body']['expiresAt']);
}
}
39 changes: 21 additions & 18 deletions Test/Unit/Gateway/Validator/PaymentLinksRequestValidatorTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,11 @@ protected function setUp(): void
/**
* @dataProvider adyenPblExpiresAtDataProvider
*/
public function testValidate($adyenPblExpiresAt, $valid, $message = [])
public function testValidate($dateModification, $valid, $message = [])
{
$date = new \DateTime();
$date->modify($dateModification);
$adyenPblExpiresAt = $date->format(AdyenPayByLinkConfigProvider::DATE_TIME_FORMAT);
$this->payment->method('getAdyenPblExpiresAt')->willReturn($adyenPblExpiresAt);
$validationSubject['payment'] = $this->payment;

Expand All @@ -85,37 +88,37 @@ public function testValidate($adyenPblExpiresAt, $valid, $message = [])

public static function adyenPblExpiresAtDataProvider()
{
$today = date(AdyenPayByLinkConfigProvider::DATE_FORMAT);
return [
[
date(
AdyenPayByLinkConfigProvider::DATE_FORMAT,
strtotime($today . ' + ' . (AdyenPayByLinkConfigProvider::MAX_EXPIRY_DAYS - 1) . ' days')
),
'+' . (AdyenPayByLinkConfigProvider::MAX_EXPIRY_DAYS - 1) . ' days',
true
],
[
date(
AdyenPayByLinkConfigProvider::DATE_FORMAT,
strtotime($today . ' + ' . (AdyenPayByLinkConfigProvider::MIN_EXPIRY_DAYS + 1) . ' days')
),
'+' . (AdyenPayByLinkConfigProvider::MIN_EXPIRY_DAYS + 1) . ' days',
true
],
[
date(
AdyenPayByLinkConfigProvider::DATE_FORMAT,
strtotime($today . ' + ' . (AdyenPayByLinkConfigProvider::MAX_EXPIRY_DAYS) . ' days')
),
'+' . AdyenPayByLinkConfigProvider::MAX_EXPIRY_DAYS . ' days',
false,
['Invalid expiry date selected for Adyen Pay By Link']
],
[
date(
AdyenPayByLinkConfigProvider::DATE_FORMAT,
strtotime($today . ' + ' . (AdyenPayByLinkConfigProvider::MIN_EXPIRY_DAYS) . ' days')
),
'+' . AdyenPayByLinkConfigProvider::MAX_EXPIRY_DAYS . ' days -1 minute',
true
],
[
' + ' . AdyenPayByLinkConfigProvider::MIN_EXPIRY_DAYS . ' days',
true
],
[
' + ' . AdyenPayByLinkConfigProvider::MIN_EXPIRY_DAYS . ' days -5 minute',
false,
['Invalid expiry date selected for Adyen Pay By Link']
],
[
' + ' . AdyenPayByLinkConfigProvider::MIN_EXPIRY_DAYS . ' days -' . AdyenPayByLinkConfigProvider::EXPIRY_BUFFER_IN_SECONDS . ' seconds',
true
]
];
}
}
26 changes: 14 additions & 12 deletions view/adminhtml/templates/form/pay_by_link.phtml
Original file line number Diff line number Diff line change
Expand Up @@ -24,17 +24,21 @@ if (!isset($escaper)) {
$minData = $escaper->escapeHtml($block->getMinExpiryTimestamp());
$maxData = $escaper->escapeHtml($block->getMaxExpiryTimestamp());
$defaultExpiry = $block->escapeJs($block->getDefaultExpiryDate());
$serverTimezone = date(' (T)');

$scriptString = <<<script
require(["jquery", "mage/calendar"],
function ($) {
$("#adyen_pbl_expires_at").calendar({
changeYear: true,
changeMonth: true,
buttonText: 'Select Expiry Date',
dateFormat: 'dd-mm-yy',
minDate: new Date($minData),
maxDate: new Date($maxData)
require([
'jquery',
'jquery-ui-modules/widget',
'jquery-ui-modules/datepicker',
'jquery-ui-modules/timepicker'
], function ($) {
$("#adyen_pbl_expires_at").datetimepicker({
dateFormat: 'dd-mm-yy',
timeFormat: 'HH:mm:ss',
minDate: new Date($minData),
maxDate: new Date($maxData),
showSecond: false
}).val('$defaultExpiry');
});
script;
Expand All @@ -48,9 +52,7 @@ script;
style="display: none">
<div class="admin__field _required">
<label for="adyen_pbl_expires_at" class="admin__field-label">
<span>
<?= $escaper->escapeHtml(__('Payment link expires at')) ?>
</span>
<?= $escaper->escapeHtml(__('Payment link expires at') . $serverTimezone) ?>
</label>
<div class="admin__field-control">
<input type="text" id="adyen_pbl_expires_at" name="payment[adyen_pbl_expires_at]"
Expand Down
Loading