We will be off from 27/1 (Monday) to 31/1 (Friday) (GMT +7) for our Tet Holiday (Lunar New Year) in our country

Commit fa407fef authored by Rik ter Beek's avatar Rik ter Beek

merge and sync with development

parents 69c7a060 80266bd7
<?php
/**
* ######
* ######
* ############ ####( ###### #####. ###### ############ ############
* ############# #####( ###### #####. ###### ############# #############
* ###### #####( ###### #####. ###### ##### ###### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ######
* ############# ############# ############# ############# ##### ######
* ############ ############ ############# ############ ##### ######
* ######
* #############
* ############
*
* Adyen Payment Module
*
* Copyright (c) 2017 Adyen B.V.
* This file is open source and available under the MIT license.
* See the LICENSE file for more info.
*
* Author: Adyen <magento@adyen.com>
*/
namespace Adyen\Payment\Api;
interface AdyenRequestMerchantSessionInterface
{
/**
* @return mixed
*/
public function getMerchantSession();
}
\ No newline at end of file
...@@ -80,14 +80,14 @@ class Installments extends \Magento\Config\Block\System\Config\Form\Field\FieldA ...@@ -80,14 +80,14 @@ class Installments extends \Magento\Config\Block\System\Config\Form\Field\FieldA
$this->addColumn( $this->addColumn(
'amount', 'amount',
[ [
'label' => __('Amount Range (minor units)'), 'label' => __('Amount Range'),
'renderer' => false, 'renderer' => false,
] ]
); );
$this->addColumn( $this->addColumn(
'installments', 'installments',
[ [
'label' => __('Max Number Of Installments'), 'label' => __('Number Of Installments'),
'renderer' => $this->getNumberOfInstallmentsRenderer(), 'renderer' => $this->getNumberOfInstallmentsRenderer(),
] ]
); );
......
<?php
/**
* ######
* ######
* ############ ####( ###### #####. ###### ############ ############
* ############# #####( ###### #####. ###### ############# #############
* ###### #####( ###### #####. ###### ##### ###### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ######
* ############# ############# ############# ############# ##### ######
* ############ ############ ############# ############ ##### ######
* ######
* #############
* ############
*
* Adyen Payment Module
*
* Copyright (c) 2017 Adyen B.V.
* This file is open source and available under the MIT license.
* See the LICENSE file for more info.
*
* Author: Adyen <magento@adyen.com>
*/
namespace Adyen\Payment\Block\Form;
class ApplePay extends \Magento\Payment\Block\Form
{
/**
* @var \Adyen\Payment\Helper\Data
*/
protected $_adyenHelper;
/**
* ApplePay constructor.
*
* @param \Magento\Framework\View\Element\Template\Context $context
* @param \Adyen\Payment\Helper\Data $adyenHelper
* @param array $data
*/
public function __construct(
\Magento\Framework\View\Element\Template\Context $context,
\Adyen\Payment\Helper\Data $adyenHelper,
array $data = []
)
{
parent::__construct($context, $data);
$this->_adyenHelper = $adyenHelper;
}
/**
* @return array
*/
public function getApplePayShippingTypes()
{
$applePayShippingTypes = $this->_adyenHelper->getApplePayShippingTypes();
$types = [];
foreach ($applePayShippingTypes as $applePayShippingType) {
$types[$applePayShippingType['value']] = $applePayShippingType['label'];
}
return $types;
}
}
\ No newline at end of file
<?php
/**
* ######
* ######
* ############ ####( ###### #####. ###### ############ ############
* ############# #####( ###### #####. ###### ############# #############
* ###### #####( ###### #####. ###### ##### ###### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ######
* ############# ############# ############# ############# ##### ######
* ############ ############ ############# ############ ##### ######
* ######
* #############
* ############
*
* Adyen Payment Module
*
* Copyright (c) 2017 Adyen B.V.
* This file is open source and available under the MIT license.
* See the LICENSE file for more info.
*
* Author: Adyen <magento@adyen.com>
*/
namespace Adyen\Payment\Block\Info;
class ApplePay extends Cc
{
}
\ No newline at end of file
...@@ -301,9 +301,6 @@ class Redirect extends \Magento\Payment\Block\Form ...@@ -301,9 +301,6 @@ class Redirect extends \Magento\Payment\Block\Form
// don't allow editable shipping/delivery address // don't allow editable shipping/delivery address
$formFields['billingAddressType'] = "1"; $formFields['billingAddressType'] = "1";
$formFields['deliveryAddressType'] = "1"; $formFields['deliveryAddressType'] = "1";
// make setting to make this optional
$formFields['shopperType'] = "1";
} }
if ($this->_order->getPayment()->getAdditionalInformation("df_value") != "") { if ($this->_order->getPayment()->getAdditionalInformation("df_value") != "") {
......
<?php
/**
* ######
* ######
* ############ ####( ###### #####. ###### ############ ############
* ############# #####( ###### #####. ###### ############# #############
* ###### #####( ###### #####. ###### ##### ###### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ######
* ############# ############# ############# ############# ##### ######
* ############ ############ ############# ############ ##### ######
* ######
* #############
* ############
*
* Adyen Payment Module
*
* Copyright (c) 2017 Adyen B.V.
* This file is open source and available under the MIT license.
* See the LICENSE file for more info.
*
* Author: Adyen <magento@adyen.com>
*/
namespace Adyen\Payment\Gateway\Request;
use Magento\Payment\Gateway\Request\BuilderInterface;
use Magento\Setup\Exception;
class ApplePayAuthorizationDataBuilder implements BuilderInterface
{
/**
* @var \Adyen\Payment\Helper\Data
*/
private $_adyenHelper;
/**
* @var \Adyen\Payment\Logger\AdyenLogger
*/
private $_adyenLogger;
/**
* CaptureDataBuilder constructor.
*
* @param \Adyen\Payment\Helper\Data $adyenHelper
*/
public function __construct(
\Adyen\Payment\Helper\Data $adyenHelper,
\Adyen\Payment\Logger\AdyenLogger $adyenLogger
)
{
$this->_adyenHelper = $adyenHelper;
$this->_adyenLogger = $adyenLogger;
}
public function build(array $buildSubject)
{
$request = [];
$paymentDataObject = \Magento\Payment\Gateway\Helper\SubjectReader::readPayment($buildSubject);
$payment = $paymentDataObject->getPayment();
$token = $payment->getAdditionalInformation('token');
// get payment data
if ($token) {
$parsedToken = json_decode($token);
$paymentData = $parsedToken->token->paymentData;
try {
$paymentData = base64_encode(json_encode($paymentData));
$request['additionalData']['payment.token'] = $paymentData;
} catch (\Exception $exception) {
$this->_adyenLogger->addAdyenDebug("exception: " . $exception->getMessage());
}
} else {
$this->_adyenLogger->addAdyenDebug("PaymentToken is empty");
}
return $request;
}
}
\ No newline at end of file
<?php
/**
* ######
* ######
* ############ ####( ###### #####. ###### ############ ############
* ############# #####( ###### #####. ###### ############# #############
* ###### #####( ###### #####. ###### ##### ###### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ######
* ############# ############# ############# ############# ##### ######
* ############ ############ ############# ############ ##### ######
* ######
* #############
* ############
*
* Adyen Payment Module
*
* Copyright (c) 2017 Adyen B.V.
* This file is open source and available under the MIT license.
* See the LICENSE file for more info.
*
* Author: Adyen <magento@adyen.com>
*/
namespace Adyen\Payment\Gateway\Validator;
use Magento\Payment\Gateway\Validator\AbstractValidator;
class InstallmentValidator extends AbstractValidator
{
/**
* @var \Adyen\Payment\Logger\AdyenLogger
*/
private $adyenLogger;
/**
* @var \Adyen\Payment\Helper\Data
*/
private $adyenHelper;
/**
* @var \Magento\Checkout\Model\Session
*/
private $session;
/**
* InstallmentValidator constructor.
* @param \Magento\Payment\Gateway\Validator\ResultInterfaceFactory $resultFactory
* @param \Adyen\Payment\Logger\AdyenLogger $adyenLogger
* @param \Adyen\Payment\Helper\Data $adyenHelper
* @param \Magento\Framework\App\ObjectManager $objectManager
*/
public function __construct(
\Magento\Payment\Gateway\Validator\ResultInterfaceFactory $resultFactory,
\Adyen\Payment\Logger\AdyenLogger $adyenLogger,
\Adyen\Payment\Helper\Data $adyenHelper,
\Magento\Checkout\Model\Session $session
) {
$this->adyenLogger = $adyenLogger;
$this->adyenHelper = $adyenHelper;
$this->session = $session;
parent::__construct($resultFactory);
}
public function validate(array $validationSubject)
{
$isValid = true;
$fails = [];
$payment = $validationSubject['payment'];
$quote = $this->session->getQuote();
if ($quote) {
$grandTotal = $quote->getGrandTotal();
$installmentsAvailable = $this->adyenHelper->getAdyenCcConfigData('installments');
$installmentSelected = $payment->getAdditionalInformation('number_of_installments');
$ccType = $payment->getAdditionalInformation('cc_type');
if ($installmentsAvailable) {
$installments = unserialize($installmentsAvailable);
}
if ($installmentSelected && $installmentsAvailable) {
$isValid = false;
$fails[] = __('Installments not valid.');
if ($installments) {
foreach ($installments as $ccTypeInstallment => $installment) {
if ($ccTypeInstallment == $ccType) {
foreach ($installment as $amount => $installmentsData) {
if ($installmentSelected == $installmentsData) {
if ($grandTotal >= $amount) {
$isValid = true;
}
}
}
}
}
}
}
}
return $this->createResult($isValid, $fails);
}
}
...@@ -454,6 +454,45 @@ class Data extends AbstractHelper ...@@ -454,6 +454,45 @@ class Data extends AbstractHelper
return $this->getConfigData($field, 'adyen_boleto', $storeId, true); return $this->getConfigData($field, 'adyen_boleto', $storeId, true);
} }
/**
* @desc Gives back adyen_apple_pay configuration values
* @param $field
* @param null $storeId
* @return mixed
*/
public function getAdyenApplePayConfigData($field, $storeId = null)
{
return $this->getConfigData($field, 'adyen_apple_pay', $storeId);
}
/**
* @param null $storeId
* @return mixed
*/
public function getAdyenApplePayMerchantIdentifier($storeId = null)
{
$demoMode = $this->getAdyenAbstractConfigDataFlag('demo_mode');
if ($demoMode) {
return $this->getAdyenApplePayConfigData('merchant_identifier_test', $storeId);
} else {
return $this->getAdyenApplePayConfigData('merchant_identifier_live', $storeId);
}
}
/**
* @param null $storeId
* @return mixed
*/
public function getAdyenApplePayPemFileLocation($storeId = null)
{
$demoMode = $this->getAdyenAbstractConfigDataFlag('demo_mode');
if ($demoMode) {
return $this->getAdyenApplePayConfigData('full_path_location_pem_file_test', $storeId);
} else {
return $this->getAdyenApplePayConfigData('full_path_location_pem_file_live', $storeId);
}
}
/** /**
* @desc Retrieve decrypted hmac key * @desc Retrieve decrypted hmac key
* @return string * @return string
...@@ -778,18 +817,19 @@ class Data extends AbstractHelper ...@@ -778,18 +817,19 @@ class Data extends AbstractHelper
} }
if ($installments) { if ($installments) {
$numberOfInstallments = null; $numberOfInstallments = [];
foreach ($installments as $ccTypeInstallment => $installment) { foreach ($installments as $ccTypeInstallment => $installment) {
if ($ccTypeInstallment == $ccType) { if ($ccTypeInstallment == $ccType) {
foreach ($installment as $amount => $installments) { foreach ($installment as $amount => $installments) {
if ($grandTotal <= $amount) { if ($grandTotal >= $amount) {
$numberOfInstallments = $installments; array_push($numberOfInstallments, $installments);
} }
} }
} }
} }
if ($numberOfInstallments) { if ($numberOfInstallments) {
sort($numberOfInstallments);
$data['number_of_installments'] = $numberOfInstallments; $data['number_of_installments'] = $numberOfInstallments;
} }
} }
...@@ -870,11 +910,33 @@ class Data extends AbstractHelper ...@@ -870,11 +910,33 @@ class Data extends AbstractHelper
return $this->scopeConfig->getValue($path, \Magento\Store\Model\ScopeInterface::SCOPE_STORE, $storeId); return $this->scopeConfig->getValue($path, \Magento\Store\Model\ScopeInterface::SCOPE_STORE, $storeId);
} }
public function getApplePayShippingTypes()
{
return [
[
'value' => 'shipping',
'label' => __('Shipping Method')
],
[
'value' => 'delivery',
'label' => __('Delivery Method')
],
[
'value' => 'storePickup',
'label' => __('Store Pickup Method')
],
[
'value' => 'servicePickup',
'label' => __('Service Pickup Method')
]
];
}
public function getUnprocessedNotifications() public function getUnprocessedNotifications()
{ {
$notifications = $this->_notificationFactory->create(); $notifications = $this->_notificationFactory->create();
$notifications->unprocessedNotificationsFilter(); $notifications->unprocessedNotificationsFilter();
return count($notifications); return $notifications->getSize();;
} }
/** /**
......
<?php
/**
* ######
* ######
* ############ ####( ###### #####. ###### ############ ############
* ############# #####( ###### #####. ###### ############# #############
* ###### #####( ###### #####. ###### ##### ###### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ######
* ############# ############# ############# ############# ##### ######
* ############ ############ ############# ############ ##### ######
* ######
* #############
* ############
*
* Adyen Payment Module
*
* Copyright (c) 2017 Adyen B.V.
* This file is open source and available under the MIT license.
* See the LICENSE file for more info.
*
* Author: Adyen <magento@adyen.com>
*/
namespace Adyen\Payment\Model;
use Adyen\Payment\Api\AdyenRequestMerchantSessionInterface;
class AdyenRequestMerchantSession implements AdyenRequestMerchantSessionInterface
{
/**
* @var \Adyen\Payment\Helper\Data
*/
protected $_adyenHelper;
/**
* @var \Adyen\Payment\Logger\AdyenLogger
*/
protected $_adyenLogger;
/**
* @var \Magento\Store\Model\StoreManagerInterface
*/
protected $_storeManager;
/**
* AdyenRequestMerchantSession constructor.
* @param \Adyen\Payment\Helper\Data $adyenHelper
*/
public function __construct(
\Adyen\Payment\Helper\Data $adyenHelper,
\Adyen\Payment\Logger\AdyenLogger $adyenLogger,
\Magento\Store\Model\StoreManagerInterface $storeManager
) {
$this->_adyenHelper = $adyenHelper;
$this->_adyenLogger = $adyenLogger;
$this->_storeManager = $storeManager;
}
/**
* Get the merchant Session from Apple to start Apple Pay transaction
*
* @return mixed
*/
public function getMerchantSession()
{
// Works for test and live. Maybe we need to switch for validationUrl from callback event waiting for apple to respond
$validationUrl = "https://apple-pay-gateway-cert.apple.com/paymentservices/startSession";
// create a new cURL resource
$ch = curl_init();
$merchantIdentifier = $this->_adyenHelper->getAdyenApplePayMerchantIdentifier();
$domainName = parse_url($this->_storeManager->getStore()->getBaseUrl(\Magento\Framework\UrlInterface::URL_TYPE_WEB))['host'];
$displayName = $this->_storeManager->getStore()->getName();
$data = '{
"merchantIdentifier":"' . $merchantIdentifier . '",
"domainName":"' . $domainName . '",
"displayName":"' . $displayName . '"
}';
$this->_adyenLogger->addAdyenDebug("JSON Requesst is: " . print_r($data,true));
curl_setopt($ch, CURLOPT_URL, $validationUrl);
// location applepay certificates
$fullPathLocationPEMFile = $this->_adyenHelper->getAdyenApplePayPemFileLocation();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSLCERT, $fullPathLocationPEMFile);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Content-Length: ' . strlen($data)
)
);
$result = curl_exec($ch);
$httpStatus = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// log the raw response
$this->_adyenLogger->addAdyenDebug("JSON Response is: " . $result);
// result not 200 throw error
if ($httpStatus != 200 && $result) {
$this->_adyenLogger->addAdyenDebug("Error Apple, API HTTP Status is: " . $httpStatus . " result is:" . $result);
} elseif(!$result) {
$errno = curl_errno($ch);
$message = curl_error($ch);
$msg = "(Network error [errno $errno]: $message)";
$this->_adyenLogger->addAdyenDebug($msg);
}
curl_close($ch);
return $result;
}
}
\ No newline at end of file
...@@ -66,7 +66,6 @@ class Installments extends \Magento\Framework\App\Config\Value ...@@ -66,7 +66,6 @@ class Installments extends \Magento\Framework\App\Config\Value
if ($unserialized !== false) { if ($unserialized !== false) {
return $this; return $this;
} }
$result = []; $result = [];
foreach ($value as $data) { foreach ($value as $data) {
if (!$data) { if (!$data) {
...@@ -83,12 +82,19 @@ class Installments extends \Magento\Framework\App\Config\Value ...@@ -83,12 +82,19 @@ class Installments extends \Magento\Framework\App\Config\Value
$installments = $data['installments']; $installments = $data['installments'];
$ccTypes = $data['cc_types']; $ccTypes = $data['cc_types'];
foreach($ccTypes as $ccType) { foreach ($ccTypes as $ccType) {
$result[$ccType][$amount] = $installments; $result[$ccType][$amount] = $installments;
} }
} }
$this->setValue(serialize($result)); // sort on installments
$finalResult = [];
foreach ($result as $key => $installments) {
asort($installments);
$finalResult[$key] = $installments;
}
$this->setValue(serialize($finalResult));
return $this; return $this;
} }
......
<?php
/**
* ######
* ######
* ############ ####( ###### #####. ###### ############ ############
* ############# #####( ###### #####. ###### ############# #############
* ###### #####( ###### #####. ###### ##### ###### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ######
* ############# ############# ############# ############# ##### ######
* ############ ############ ############# ############ ##### ######
* ######
* #############
* ############
*
* Adyen Payment Module
*
* Copyright (c) 2017 Adyen B.V.
* This file is open source and available under the MIT license.
* See the LICENSE file for more info.
*
* Author: Adyen <magento@adyen.com>
*/
namespace Adyen\Payment\Model\Config\Source;
class ApplePayShippingType implements \Magento\Framework\Option\ArrayInterface
{
/**
* @var \Adyen\Payment\Helper\Data
*/
protected $_adyenHelper;
/**
* ApplePayShippingType constructor.
*
* @param \Adyen\Payment\Helper\Data $adyenHelper
*/
public function __construct(
\Adyen\Payment\Helper\Data $adyenHelper
) {
$this->_adyenHelper = $adyenHelper;
}
/**
* @return array
*/
public function toOptionArray() {
return $this->_adyenHelper->getApplePayShippingTypes();
}
}
\ No newline at end of file
...@@ -1199,7 +1199,7 @@ class Cron ...@@ -1199,7 +1199,7 @@ class Cron
*/ */
protected function _isAutoCapture() protected function _isAutoCapture()
{ {
// validate if payment methods allowes manual capture // validate if payment methods allows manual capture
if ($this->_manualCaptureAllowed()) { if ($this->_manualCaptureAllowed()) {
$captureMode = trim($this->_getConfigData( $captureMode = trim($this->_getConfigData(
'capture_mode', 'adyen_abstract', $this->_order->getStoreId()) 'capture_mode', 'adyen_abstract', $this->_order->getStoreId())
......
<?php
/**
* ######
* ######
* ############ ####( ###### #####. ###### ############ ############
* ############# #####( ###### #####. ###### ############# #############
* ###### #####( ###### #####. ###### ##### ###### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ######
* ############# ############# ############# ############# ##### ######
* ############ ############ ############# ############ ##### ######
* ######
* #############
* ############
*
* Adyen Payment Module
*
* Copyright (c) 2017 Adyen B.V.
* This file is open source and available under the MIT license.
* See the LICENSE file for more info.
*
* Author: Adyen <magento@adyen.com>
*/
namespace Adyen\Payment\Model\Ui;
use Magento\Checkout\Model\ConfigProviderInterface;
use Magento\Payment\Helper\Data as PaymentHelper;
class AdyenApplePayConfigProvider implements ConfigProviderInterface
{
const CODE = 'adyen_apple_pay';
/**
* @var PaymentHelper
*/
protected $_paymentHelper;
/**
* @var \Adyen\Payment\Helper\Data
*/
protected $_adyenHelper;
/**
* @var \Magento\Framework\UrlInterface
*/
protected $_urlBuilder;
/**
* Request object
*
* @var \Magento\Framework\App\RequestInterface
*/
protected $_request;
/**
* AdyenApplePayConfigProvider constructor.
*
* @param PaymentHelper $paymentHelper
* @param \Adyen\Payment\Helper\Data $adyenHelper
* @param \Magento\Framework\App\RequestInterface $request
* @param \Magento\Framework\UrlInterface $urlBuilder
*/
public function __construct(
PaymentHelper $paymentHelper,
\Adyen\Payment\Helper\Data $adyenHelper,
\Magento\Framework\App\RequestInterface $request,
\Magento\Framework\UrlInterface $urlBuilder
) {
$this->_paymentHelper = $paymentHelper;
$this->_adyenHelper = $adyenHelper;
$this->_request = $request;
$this->_urlBuilder = $urlBuilder;
}
/**
* Retrieve assoc array of checkout configuration
*
* @return array
*/
public function getConfig()
{
// set to active
return [
'payment' => [
self::CODE => [
'isActive' => true,
'redirectUrl' => $this->_urlBuilder->getUrl(
'checkout/onepage/success/', ['_secure' => $this->_getRequest()->isSecure()]),
'merchant_identifier' => $this->_adyenHelper->getAdyenApplePayMerchantIdentifier()
]
]
];
}
/**
* Retrieve request object
*
* @return \Magento\Framework\App\RequestInterface
*/
protected function _getRequest()
{
return $this->_request;
}
}
\ No newline at end of file
...@@ -139,9 +139,10 @@ class AdyenCcConfigProvider implements ConfigProviderInterface ...@@ -139,9 +139,10 @@ class AdyenCcConfigProvider implements ConfigProviderInterface
$config['payment']['adyenCc']['hasInstallments'] = false; $config['payment']['adyenCc']['hasInstallments'] = false;
// get Installments // get Installments
$installmentsEnabled = $this->_adyenHelper->getAdyenCcConfigData('enable_installments');
$installments = $this->_adyenHelper->getAdyenCcConfigData('installments'); $installments = $this->_adyenHelper->getAdyenCcConfigData('installments');
if ($installments) { if ($installmentsEnabled && $installments) {
$config['payment']['adyenCc']['installments'] = unserialize($installments); $config['payment']['adyenCc']['installments'] = unserialize($installments);
$config['payment']['adyenCc']['hasInstallments'] = true; $config['payment']['adyenCc']['hasInstallments'] = true;
} else { } else {
......
<?php
/**
* ######
* ######
* ############ ####( ###### #####. ###### ############ ############
* ############# #####( ###### #####. ###### ############# #############
* ###### #####( ###### #####. ###### ##### ###### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ######
* ############# ############# ############# ############# ##### ######
* ############ ############ ############# ############ ##### ######
* ######
* #############
* ############
*
* Adyen Payment Module
*
* Copyright (c) 2017 Adyen B.V.
* This file is open source and available under the MIT license.
* See the LICENSE file for more info.
*
* Author: Adyen <magento@adyen.com>
*/
namespace Adyen\Payment\Observer;
use Magento\Framework\Event\Observer;
use Magento\Payment\Observer\AbstractDataAssignObserver;
use Magento\Quote\Api\Data\PaymentInterface;
/**
* Class DataAssignObserver
*/
class AdyenApplePayDataAssignObserver extends AbstractDataAssignObserver
{
const TOKEN = 'token';
/**
* @var array
*/
protected $additionalInformationList = [
self::TOKEN
];
/**
* @param Observer $observer
* @return void
*/
public function execute(Observer $observer)
{
$data = $this->readDataArgument($observer);
$additionalData = $data->getData(PaymentInterface::KEY_ADDITIONAL_DATA);
if (!is_array($additionalData)) {
return;
}
$paymentInfo = $this->readPaymentModelArgument($observer);
// set ccType
$paymentInfo->setCcType('apple_pay');
foreach ($this->additionalInformationList as $additionalInformationKey) {
if (isset($additionalData[$additionalInformationKey])) {
$paymentInfo->setAdditionalInformation(
$additionalInformationKey,
$additionalData[$additionalInformationKey]
);
}
}
}
}
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
"name": "adyen/module-payment", "name": "adyen/module-payment",
"description": "Official Magento2 Plugin to connect to Payment Service Provider Adyen.", "description": "Official Magento2 Plugin to connect to Payment Service Provider Adyen.",
"type": "magento2-module", "type": "magento2-module",
"version": "2.1.3", "version": "2.2.0",
"license": [ "license": [
"OSL-3.0", "OSL-3.0",
"AFL-3.0" "AFL-3.0"
......
...@@ -46,6 +46,7 @@ ...@@ -46,6 +46,7 @@
<include path="Adyen_Payment::system/adyen_pos.xml"/> <include path="Adyen_Payment::system/adyen_pos.xml"/>
<include path="Adyen_Payment::system/adyen_pay_by_mail.xml"/> <include path="Adyen_Payment::system/adyen_pay_by_mail.xml"/>
<include path="Adyen_Payment::system/adyen_boleto.xml"/> <include path="Adyen_Payment::system/adyen_boleto.xml"/>
<include path="Adyen_Payment::system/adyen_apple_pay.xml"/>
</group> </group>
<group id="test" translate="label" type="text" sortOrder="30" showInDefault="1" showInWebsite="1" showInStore="1"> <group id="test" translate="label" type="text" sortOrder="30" showInDefault="1" showInWebsite="1" showInStore="1">
<label>Test</label> <label>Test</label>
......
<?xml version="1.0"?>
<!--
~ ######
~ ######
~ ############ ####( ###### #####. ###### ############ ############
~ ############# #####( ###### #####. ###### ############# #############
~ ###### #####( ###### #####. ###### ##### ###### ##### ######
~ ###### ###### #####( ###### #####. ###### ##### ##### ##### ######
~ ###### ###### #####( ###### #####. ###### ##### ##### ######
~ ############# ############# ############# ############# ##### ######
~ ############ ############ ############# ############ ##### ######
~ ######
~ #############
~ ############
~
~ Adyen Payment Module
~
~ Copyright (c) 2017 Adyen B.V.
~ This file is open source and available under the MIT license.
~ See the LICENSE file for more info.
~
~ Author: Adyen <magento@adyen.com>
-->
<include xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Config:etc/system_include.xsd">
<group id="adyen_apple_pay" translate="label" type="text" sortOrder="460" showInDefault="1" showInWebsite="1" showInStore="1">
<label><![CDATA[Apple Pay integration]]></label>
<frontend_model>Magento\Paypal\Block\Adminhtml\System\Config\Fieldset\Payment</frontend_model>
<fieldset_css>adyen-method-adyen-cc</fieldset_css>
<comment>Process Apple Pay transactions</comment>
<field id="active" translate="label" type="select" sortOrder="10" showInDefault="1" showInWebsite="1" showInStore="1">
<label>Enabled</label>
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
<config_path>payment/adyen_apple_pay/active</config_path>
</field>
<field id="title" translate="label" type="text" sortOrder="20" showInDefault="1" showInWebsite="1" showInStore="1">
<label>Title</label>
<config_path>payment/adyen_apple_pay/title</config_path>
</field>
<field id="sort_order" translate="label" type="text" sortOrder="30" showInDefault="1" showInWebsite="1" showInStore="1">
<label>Sort Order</label>
<frontend_class>validate-number</frontend_class>
<config_path>payment/adyen_apple_pay/sort_order</config_path>
</field>
<field id="merchant_identifier_test" translate="label" type="text" sortOrder="40" showInDefault="1" showInWebsite="1" showInStore="1">
<label>Test: Apple Merchant Identifier</label>
<tooltip>You can retrieve this from your Apple Account.</tooltip>
<config_path>payment/adyen_apple_pay/merchant_identifier_test</config_path>
</field>
<field id="merchant_identifier_live" translate="label" type="text" sortOrder="50" showInDefault="1" showInWebsite="1" showInStore="1">
<label>Live: Apple Merchant Identifier</label>
<tooltip>You can retrieve this from your Apple Account.</tooltip>
<config_path>payment/adyen_apple_pay/merchant_identifier_live</config_path>
</field>
<field id="full_path_location_pem_file_test" translate="label" type="text" sortOrder="60" showInDefault="1" showInWebsite="1" showInStore="1">
<label>Test: PEM File location</label>
<tooltip>You need to generate a pem file from the apple certificate. You need to upload this to your webserver and define the full path location here.</tooltip>
<config_path>payment/adyen_apple_pay/full_path_location_pem_file_test</config_path>
</field>
<field id="full_path_location_pem_file_live" translate="label" type="text" sortOrder="70" showInDefault="1" showInWebsite="1" showInStore="1">
<label>Live: PEM File location</label>
<tooltip>You need to generate a pem file from the apple certificate. You need to upload this to your webserver and define the full path location here.</tooltip>
<config_path>payment/adyen_apple_pay/full_path_location_pem_file_live</config_path>
</field>
</group>
</include>
\ No newline at end of file
...@@ -67,9 +67,17 @@ ...@@ -67,9 +67,17 @@
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model> <source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
<config_path>payment/adyen_cc/enable_moto</config_path> <config_path>payment/adyen_cc/enable_moto</config_path>
</field> </field>
<field id="installments" translate="label" sortOrder="220" showInDefault="1" showInWebsite="1" showInStore="0"> <field id="enable_installments" translate="label" type="select" sortOrder="219" showInDefault="1" showInWebsite="1" showInStore="1">
<label>Enable Installments</label>
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
<tooltip>Enable installments for each credit card type.</tooltip>
<config_path>payment/adyen_cc/enable_installments</config_path>
</field>
<field id="installments" translate="label" sortOrder="220" showInDefault="1" showInWebsite="1" showInStore="1">
<label>Installments</label> <label>Installments</label>
<tooltip>Configure your installment foreach creditcard type.</tooltip> <depends><field id="enable_installments">1</field></depends>
<tooltip>Configure your installment for each credit card type: Insert the minimum amount required to make the configured installment available in the amount range column.
Example: if the amount range is configured to 100 and the number of installments to 4x, the shopper will see the 4x option only if the payment total is higher or equal than 100.</tooltip>
<frontend_model>Adyen\Payment\Block\Adminhtml\System\Config\Field\Installments</frontend_model> <frontend_model>Adyen\Payment\Block\Adminhtml\System\Config\Field\Installments</frontend_model>
<backend_model>Adyen\Payment\Model\Config\Backend\Installments</backend_model> <backend_model>Adyen\Payment\Model\Config\Backend\Installments</backend_model>
<config_path>payment/adyen_cc/installments</config_path> <config_path>payment/adyen_cc/installments</config_path>
......
...@@ -189,6 +189,25 @@ ...@@ -189,6 +189,25 @@
<can_cancel>1</can_cancel> <can_cancel>1</can_cancel>
<group>adyen</group> <group>adyen</group>
</adyen_boleto> </adyen_boleto>
<adyen_apple_pay>
<active>0</active>
<model>AdyenPaymentApplePayFacade</model>
<title>Adyen Apple Pay</title>
<allowspecific>0</allowspecific>
<sort_order>8</sort_order>
<payment_action>authorize</payment_action>
<is_gateway>1</is_gateway>
<can_use_checkout>1</can_use_checkout>
<can_authorize>1</can_authorize>
<can_capture>1</can_capture>
<can_capture_partial>1</can_capture_partial>
<can_use_internal>0</can_use_internal>
<can_refund_partial_per_invoice>1</can_refund_partial_per_invoice>
<can_refund>1</can_refund>
<can_void>1</can_void>
<can_cancel>1</can_cancel>
<group>adyen</group>
</adyen_apple_pay>
</payment> </payment>
</default> </default>
</config> </config>
...@@ -104,6 +104,16 @@ ...@@ -104,6 +104,16 @@
<argument name="commandPool" xsi:type="object">AdyenPaymentPayByMailCommandPool</argument> <argument name="commandPool" xsi:type="object">AdyenPaymentPayByMailCommandPool</argument>
</arguments> </arguments>
</virtualType> </virtualType>
<virtualType name="AdyenPaymentApplePayFacade" type="Magento\Payment\Model\Method\Adapter">
<arguments>
<argument name="code" xsi:type="const">Adyen\Payment\Model\Ui\AdyenApplePayConfigProvider::CODE</argument>
<argument name="formBlockType" xsi:type="string">Adyen\Payment\Block\Form\ApplePay</argument>
<argument name="infoBlockType" xsi:type="string">Adyen\Payment\Block\Info\ApplePay</argument>
<argument name="valueHandlerPool" xsi:type="object">AdyenPaymentApplePayValueHandlerPool</argument>
<argument name="validatorPool" xsi:type="object">AdyenPaymentApplePayValidatorPool</argument>
<argument name="commandPool" xsi:type="object">AdyenPaymentApplePayCommandPool</argument>
</arguments>
</virtualType>
<!-- Value handlers infrastructure --> <!-- Value handlers infrastructure -->
<virtualType name="AdyenPaymentGenericValueHandlerPool" type="Magento\Payment\Gateway\Config\ValueHandlerPool"> <virtualType name="AdyenPaymentGenericValueHandlerPool" type="Magento\Payment\Gateway\Config\ValueHandlerPool">
...@@ -211,6 +221,19 @@ ...@@ -211,6 +221,19 @@
</arguments> </arguments>
</virtualType> </virtualType>
<virtualType name="AdyenPaymentApplePayValueHandlerPool" type="Magento\Payment\Gateway\Config\ValueHandlerPool">
<arguments>
<argument name="handlers" xsi:type="array">
<item name="default" xsi:type="string">AdyenPaymentApplePayConfigValueHandler</item>
</argument>
</arguments>
</virtualType>
<virtualType name="AdyenPaymentApplePayConfigValueHandler" type="Magento\Payment\Gateway\Config\ConfigValueHandler">
<arguments>
<argument name="configInterface" xsi:type="object">AdyenPaymentApplePayConfig</argument>
</arguments>
</virtualType>
<!-- Configuration reader --> <!-- Configuration reader -->
<virtualType name="AdyenPaymentGenericConfig" type="Magento\Payment\Gateway\Config\Config"> <virtualType name="AdyenPaymentGenericConfig" type="Magento\Payment\Gateway\Config\Config">
<arguments> <arguments>
...@@ -253,6 +276,12 @@ ...@@ -253,6 +276,12 @@
<argument name="methodCode" xsi:type="const">Adyen\Payment\Model\Ui\AdyenPayByMailConfigProvider::CODE</argument> <argument name="methodCode" xsi:type="const">Adyen\Payment\Model\Ui\AdyenPayByMailConfigProvider::CODE</argument>
</arguments> </arguments>
</virtualType> </virtualType>
<virtualType name="AdyenPaymentApplePayConfig" type="Magento\Payment\Gateway\Config\Config">
<arguments>
<argument name="methodCode" xsi:type="const">Adyen\Payment\Model\Ui\AdyenApplePayConfigProvider::CODE</argument>
</arguments>
</virtualType>
<!-- Commands infrastructure --> <!-- Commands infrastructure -->
<virtualType name="AdyenPaymentCcCommandPool" type="Magento\Payment\Gateway\Command\CommandPool"> <virtualType name="AdyenPaymentCcCommandPool" type="Magento\Payment\Gateway\Command\CommandPool">
...@@ -341,6 +370,18 @@ ...@@ -341,6 +370,18 @@
</arguments> </arguments>
</virtualType> </virtualType>
<virtualType name="AdyenPaymentApplePayCommandPool" type="Magento\Payment\Gateway\Command\CommandPool">
<arguments>
<argument name="commands" xsi:type="array">
<item name="authorize" xsi:type="string">AdyenPaymentApplePayAuthorizeCommand</item>
<item name="capture" xsi:type="string">AdyenPaymentCaptureCommand</item>
<item name="void" xsi:type="string">AdyenPaymentCancelCommand</item>
<item name="refund" xsi:type="string">AdyenPaymentRefundCommand</item>
<item name="cancel" xsi:type="string">AdyenPaymentCancelCommand</item>
</argument>
</arguments>
</virtualType>
<!-- Authorization command --> <!-- Authorization command -->
<virtualType name="AdyenPaymentCcAuthorizeCommand" type="Magento\Payment\Gateway\Command\GatewayCommand"> <virtualType name="AdyenPaymentCcAuthorizeCommand" type="Magento\Payment\Gateway\Command\GatewayCommand">
<arguments> <arguments>
...@@ -391,6 +432,16 @@ ...@@ -391,6 +432,16 @@
</arguments> </arguments>
</virtualType> </virtualType>
<virtualType name="AdyenPaymentApplePayAuthorizeCommand" type="Magento\Payment\Gateway\Command\GatewayCommand">
<arguments>
<argument name="requestBuilder" xsi:type="object">AdyenPaymentApplePayAuthorizeRequest</argument>
<argument name="transferFactory" xsi:type="object">Adyen\Payment\Gateway\Http\TransferFactory</argument>
<argument name="client" xsi:type="object">Adyen\Payment\Gateway\Http\Client\TransactionAuthorization</argument>
<argument name="validator" xsi:type="object">GeneralResponseValidator</argument>
<argument name="handler" xsi:type="object">AdyenPaymentResponseHandlerComposite</argument>
</arguments>
</virtualType>
<!-- Capture command --> <!-- Capture command -->
<virtualType name="AdyenPaymentCaptureCommand" type="Magento\Payment\Gateway\Command\GatewayCommand"> <virtualType name="AdyenPaymentCaptureCommand" type="Magento\Payment\Gateway\Command\GatewayCommand">
<arguments> <arguments>
...@@ -496,6 +547,20 @@ ...@@ -496,6 +547,20 @@
</arguments> </arguments>
</virtualType> </virtualType>
<virtualType name="AdyenPaymentApplePayAuthorizeRequest" type="Magento\Payment\Gateway\Request\BuilderComposite">
<arguments>
<argument name="builders" xsi:type="array">
<item name="merchantaccount" xsi:type="string">Adyen\Payment\Gateway\Request\MerchantAccountDataBuilder</item>
<item name="customer" xsi:type="string">Adyen\Payment\Gateway\Request\CustomerDataBuilder</item>
<item name="customerip" xsi:type="string">Adyen\Payment\Gateway\Request\CustomerIpDataBuilder</item>
<item name="address" xsi:type="string">Adyen\Payment\Gateway\Request\AddressDataBuilder</item>
<item name="payment" xsi:type="string">Adyen\Payment\Gateway\Request\PaymentDataBuilder</item>
<item name="browserinfo" xsi:type="string">Adyen\Payment\Gateway\Request\BrowserInfoDataBuilder</item>
<item name="transaction" xsi:type="string">Adyen\Payment\Gateway\Request\ApplePayAuthorizationDataBuilder</item>
</argument>
</arguments>
</virtualType>
<!-- Capture Request --> <!-- Capture Request -->
<virtualType name="AdyenPaymentCaptureRequest" type="Magento\Payment\Gateway\Request\BuilderComposite"> <virtualType name="AdyenPaymentCaptureRequest" type="Magento\Payment\Gateway\Request\BuilderComposite">
<arguments> <arguments>
...@@ -549,6 +614,15 @@ ...@@ -549,6 +614,15 @@
</argument> </argument>
</arguments> </arguments>
</virtualType> </virtualType>
<virtualType name="AdyenPaymentResponseHandlerComposite" type="Magento\Payment\Gateway\Response\HandlerChain">
<arguments>
<argument name="handlers" xsi:type="array">
<item name="payment_details" xsi:type="string">Adyen\Payment\Gateway\Response\PaymentAuthorisationDetailsHandler</item>
<item name="payment_comments" xsi:type="string">Adyen\Payment\Gateway\Response\PaymentCommentHistoryHandler</item>
</argument>
</arguments>
</virtualType>
<virtualType name="AdyenPaymentCaptureResponseHandlerComposite" type="Magento\Payment\Gateway\Response\HandlerChain"> <virtualType name="AdyenPaymentCaptureResponseHandlerComposite" type="Magento\Payment\Gateway\Response\HandlerChain">
<arguments> <arguments>
<argument name="handlers" xsi:type="array"> <argument name="handlers" xsi:type="array">
...@@ -579,6 +653,7 @@ ...@@ -579,6 +653,7 @@
<arguments> <arguments>
<argument name="validators" xsi:type="array"> <argument name="validators" xsi:type="array">
<item name="country" xsi:type="string">AdyenCcCountryValidator</item> <item name="country" xsi:type="string">AdyenCcCountryValidator</item>
<item name="global" xsi:type="string">Adyen\Payment\Gateway\Validator\InstallmentValidator</item>
</argument> </argument>
</arguments> </arguments>
</virtualType> </virtualType>
...@@ -592,6 +667,7 @@ ...@@ -592,6 +667,7 @@
<arguments> <arguments>
<argument name="validators" xsi:type="array"> <argument name="validators" xsi:type="array">
<item name="country" xsi:type="string">AdyenOneclickCountryValidator</item> <item name="country" xsi:type="string">AdyenOneclickCountryValidator</item>
<item name="global" xsi:type="string">Adyen\Payment\Gateway\Validator\InstallmentValidator</item>
</argument> </argument>
</arguments> </arguments>
</virtualType> </virtualType>
...@@ -667,6 +743,19 @@ ...@@ -667,6 +743,19 @@
</arguments> </arguments>
</virtualType> </virtualType>
<virtualType name="AdyenPaymentApplePayValidatorPool" type="Magento\Payment\Gateway\Validator\ValidatorPool">
<arguments>
<argument name="validators" xsi:type="array">
<item name="country" xsi:type="string">AdyenApplePayCountryValidator</item>
</argument>
</arguments>
</virtualType>
<virtualType name="AdyenApplePayCountryValidator" type="Magento\Payment\Gateway\Validator\CountryValidator">
<arguments>
<argument name="config" xsi:type="object">AdyenPaymentApplePayConfig</argument>
</arguments>
</virtualType>
<!--General Response validator--> <!--General Response validator-->
<virtualType name="GeneralResponseValidator" type="Adyen\Payment\Gateway\Validator\GeneralResponseValidator"> <virtualType name="GeneralResponseValidator" type="Adyen\Payment\Gateway\Validator\GeneralResponseValidator">
...@@ -743,4 +832,5 @@ ...@@ -743,4 +832,5 @@
</type> </type>
<preference for="Adyen\Payment\Api\GuestAdyenPaymentMethodManagementInterface" type="Adyen\Payment\Model\GuestAdyenPaymentMethodManagement" /> <preference for="Adyen\Payment\Api\GuestAdyenPaymentMethodManagementInterface" type="Adyen\Payment\Model\GuestAdyenPaymentMethodManagement" />
<preference for="Adyen\Payment\Api\AdyenPaymentMethodManagementInterface" type="Adyen\Payment\Model\AdyenPaymentMethodManagement" /> <preference for="Adyen\Payment\Api\AdyenPaymentMethodManagementInterface" type="Adyen\Payment\Model\AdyenPaymentMethodManagement" />
<preference for="Adyen\Payment\Api\AdyenRequestMerchantSessionInterface" type="Adyen\Payment\Model\AdyenRequestMerchantSession" />
</config> </config>
\ No newline at end of file
...@@ -38,4 +38,7 @@ ...@@ -38,4 +38,7 @@
<event name="payment_method_assign_data_adyen_boleto"> <event name="payment_method_assign_data_adyen_boleto">
<observer name="adyen_boleto_gateway_data_assign" instance="Adyen\Payment\Observer\AdyenBoletoDataAssignObserver" /> <observer name="adyen_boleto_gateway_data_assign" instance="Adyen\Payment\Observer\AdyenBoletoDataAssignObserver" />
</event> </event>
<event name="payment_method_assign_data_adyen_apple_pay">
<observer name="adyen_apple_pay_gateway_data_assign" instance="Adyen\Payment\Observer\AdyenApplePayDataAssignObserver" />
</event>
</config> </config>
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
<item name="adyen_sepa_config_provider" xsi:type="object">Adyen\Payment\Model\Ui\AdyenSepaConfigProvider</item> <item name="adyen_sepa_config_provider" xsi:type="object">Adyen\Payment\Model\Ui\AdyenSepaConfigProvider</item>
<item name="adyen_boleto_config_provider" xsi:type="object">Adyen\Payment\Model\Ui\AdyenBoletoConfigProvider</item> <item name="adyen_boleto_config_provider" xsi:type="object">Adyen\Payment\Model\Ui\AdyenBoletoConfigProvider</item>
<item name="adyen_pos_config_provider" xsi:type="object">Adyen\Payment\Model\Ui\AdyenPosConfigProvider</item> <item name="adyen_pos_config_provider" xsi:type="object">Adyen\Payment\Model\Ui\AdyenPosConfigProvider</item>
<item name="adyen_apple_pay_config_provider" xsi:type="object">Adyen\Payment\Model\Ui\AdyenApplePayConfigProvider</item>
</argument> </argument>
</arguments> </arguments>
</type> </type>
......
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
--> -->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="Adyen_Payment" setup_version="2.1.3"> <module name="Adyen_Payment" setup_version="2.2.0">
<sequence> <sequence>
<module name="Magento_Sales"/> <module name="Magento_Sales"/>
<module name="Magento_Quote"/> <module name="Magento_Quote"/>
......
...@@ -39,6 +39,9 @@ ...@@ -39,6 +39,9 @@
<method name="adyen_hpp"> <method name="adyen_hpp">
<allow_multiple_address>0</allow_multiple_address> <allow_multiple_address>0</allow_multiple_address>
</method> </method>
<method name="adyen_apple_pay">
<allow_multiple_address>0</allow_multiple_address>
</method>
</methods> </methods>
</payment> </payment>
......
...@@ -30,18 +30,24 @@ ...@@ -30,18 +30,24 @@
<route url="/V1/guest-carts/:cartId/retrieve-adyen-payment-methods" method="POST"> <route url="/V1/guest-carts/:cartId/retrieve-adyen-payment-methods" method="POST">
<service class="Adyen\Payment\Api\GuestAdyenPaymentMethodManagementInterface" method="getPaymentMethods"/> <service class="Adyen\Payment\Api\GuestAdyenPaymentMethodManagementInterface" method="getPaymentMethods"/>
<resources> <resources>
<resource ref="anonymous" /> <resource ref="anonymous"/>
</resources> </resources>
</route> </route>
<route url="/V1/carts/mine/retrieve-adyen-payment-methods" method="POST"> <route url="/V1/carts/mine/retrieve-adyen-payment-methods" method="POST">
<service class="Adyen\Payment\Api\AdyenPaymentMethodManagementInterface" method="getPaymentMethods"/> <service class="Adyen\Payment\Api\AdyenPaymentMethodManagementInterface" method="getPaymentMethods"/>
<resources> <resources>
<resource ref="self" /> <resource ref="self"/>
</resources> </resources>
<data> <data>
<parameter name="cartId" force="true">%cart_id%</parameter> <parameter name="cartId" force="true">%cart_id%</parameter>
</data> </data>
</route> </route>
<route url="/V1/adyen/request-merchant-session" method="POST">
<service class="Adyen\Payment\Api\AdyenRequestMerchantSessionInterface" method="getMerchantSession"/>
<resources>
<resource ref="anonymous"/>
</resources>
</route>
</routes> </routes>
\ No newline at end of file
...@@ -50,4 +50,5 @@ ...@@ -50,4 +50,5 @@
"The payment is REFUSED","The payment is REFUSED" "The payment is REFUSED","The payment is REFUSED"
"Failed to disable this contract","Failed to disable this contract" "Failed to disable this contract","Failed to disable this contract"
"You will be redirected to the Adyen App", "You will be redirected to the Adyen App" "You will be redirected to the Adyen App", "You will be redirected to the Adyen App"
"Continue to Adyen App", "Continue to Adyen App" "Continue to Adyen App", "Continue to Adyen App"
\ No newline at end of file "Do not use Installments", "Do not use Installments"
\ No newline at end of file
...@@ -64,6 +64,9 @@ ...@@ -64,6 +64,9 @@
<item name="adyen_pos" xsi:type="array"> <item name="adyen_pos" xsi:type="array">
<item name="isBillingAddressRequired" xsi:type="boolean">true</item> <item name="isBillingAddressRequired" xsi:type="boolean">true</item>
</item> </item>
<item name="adyen_apple_pay" xsi:type="array">
<item name="isBillingAddressRequired" xsi:type="boolean">true</item>
</item>
</item> </item>
</item> </item>
</item> </item>
......
...@@ -61,11 +61,76 @@ ...@@ -61,11 +61,76 @@
background-position: 0 -272px; background-position: 0 -272px;
} }
.checkout-payment-method .payment-method-title label div.adyen-sprite.adyen_apple_pay {
background:url(../images/logos/apple_pay.png) no-repeat;
height:43px;
}
.checkout-payment-method .input-text._has-datepicker { .checkout-payment-method .input-text._has-datepicker {
width:20%; width:20%;
margin-right:10px; margin-right:10px;
} }
.apple-pay-button-with-text {
--apple-pay-scale: 1.5625; /* (height / 32) */
display: inline-flex;
justify-content: center;
font-size: 12px;
border-radius: 5px;
padding: 0px;
box-sizing: border-box;
/*min-width: 200px;*/
width:100%;
min-height: 32px;
max-height: 64px;
margin-bottom: 10px;
cursor: pointer;
}
.apple-pay-button-black-with-text {
background-color: black;
color: white;
}
.apple-pay-button-white-with-text {
background-color: white;
color: black;
}
.apple-pay-button-white-with-line-with-text {
background-color: white;
color: black;
border: .5px solid black;
}
.apple-pay-button-with-text.apple-pay-button-black-with-text > .logo {
background-image: -webkit-named-image(apple-pay-logo-white);
background-color: black;
}
.apple-pay-button-with-text.apple-pay-button-white-with-text > .logo {
background-image: -webkit-named-image(apple-pay-logo-black);
background-color: white;
}
.apple-pay-button-with-text.apple-pay-button-white-with-line-with-text > .logo {
background-image: -webkit-named-image(apple-pay-logo-black);
background-color: white;
}
.apple-pay-button-with-text > .text {
font-family: -apple-system;
font-size: calc(1em * var(--apple-pay-scale));
font-weight: 300;
align-self: center;
margin-right: calc(2px * var(--apple-pay-scale));
}
.apple-pay-button-with-text > .logo {
width: calc(35px * var(--apple-pay-scale));
height: 100%;
background-size: 100% 60%;
background-repeat: no-repeat;
background-position: 0 50%;
margin: 0;
border: none;
min-width: 0px; /* override magento min-width */
min-height: 42px; /* override magento min-height */
}
...@@ -8,7 +8,7 @@ define( ...@@ -8,7 +8,7 @@ define(
], ],
function (ko) { function (ko) {
'use strict'; 'use strict';
var installments = ko.observableArray([]); var installments = ko.observableArray(['key', 'value']);
return { return {
/** /**
* Populate the list of installments * Populate the list of installments
...@@ -17,14 +17,15 @@ define( ...@@ -17,14 +17,15 @@ define(
setInstallments: function (installmentData) { setInstallments: function (installmentData) {
// remove everything from the current list // remove everything from the current list
installments.removeAll(); installments.removeAll();
// populate installments
var i; var i;
for (i = 1; i <= installmentData; i++) { for (i = 0; i < installmentData.length; i++) {
installments.push({ installments.push(
key: i, {
value: i key: installmentData[i].key,
}); value: installmentData[i].value
}
);
} }
}, },
/** /**
......
...@@ -55,6 +55,10 @@ define( ...@@ -55,6 +55,10 @@ define(
{ {
type: 'adyen_boleto', type: 'adyen_boleto',
component: 'Adyen_Payment/js/view/payment/method-renderer/adyen-boleto-method' component: 'Adyen_Payment/js/view/payment/method-renderer/adyen-boleto-method'
},
{
type: 'adyen_apple_pay',
component: 'Adyen_Payment/js/view/payment/method-renderer/adyen-apple-pay-method'
} }
); );
/** Add view logic here if needed */ /** Add view logic here if needed */
......
/*
* ######
* ######
* ############ ####( ###### #####. ###### ############ ############
* ############# #####( ###### #####. ###### ############# #############
* ###### #####( ###### #####. ###### ##### ###### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ######
* ############# ############# ############# ############# ##### ######
* ############ ############ ############# ############ ##### ######
* ######
* #############
* ############
*
* Adyen Payment Module
*
* Copyright (c) 2017 Adyen B.V.
* This file is open source and available under the MIT license.
* See the LICENSE file for more info.
*
* Author: Adyen <magento@adyen.com>
*/
define(
[
'jquery',
'Magento_Checkout/js/model/quote',
'Magento_Checkout/js/view/payment/default',
'Magento_Checkout/js/action/place-order',
'Magento_Checkout/js/model/payment/additional-validators',
'Magento_Checkout/js/model/url-builder',
'mage/storage',
'mage/url',
'Magento_Ui/js/model/messages',
'mage/translate',
],
function ($, quote, Component, placeOrderAction, additionalValidators, urlBuilder, storage, url, Messages, $t) {
'use strict';
return Component.extend({
self: this,
defaults: {
template: 'Adyen_Payment/payment/apple-pay-form'
},
/**
* @returns {Boolean}
*/
isShowLegend: function () {
return true;
},
setPlaceOrderHandler: function (handler) {
this.placeOrderHandler = handler;
},
setValidateHandler: function (handler) {
this.validateHandler = handler;
},
getCode: function () {
return 'adyen_apple_pay';
},
getData: function () {
return {
'method': this.item.method,
'additional_data': {}
};
},
isActive: function () {
return true;
},
/**
* @override
*/
placeApplePayOrder: function (data, event) {
event.preventDefault();
var self = this;
if (!additionalValidators.validate()) {
return false;
}
var request = {
countryCode: quote.billingAddress().countryId,
currencyCode: quote.totals().quote_currency_code,
supportedNetworks: ['visa', 'masterCard', 'amex', 'discover'],
merchantCapabilities: ['supports3DS'],
total: {label: $t('Grand Total'), amount: quote.totals().base_grand_total}
};
var session = new ApplePaySession(2, request);
session.onvalidatemerchant = function (event) {
var promise = self.performValidation(event.validationURL);
promise.then(function (merchantSession) {
session.completeMerchantValidation(merchantSession);
});
}
session.onpaymentauthorized = function (event) {
var data = {
'method': self.item.method,
'additional_data': {'token': JSON.stringify(event.payment)}
};
var promise = self.sendPayment(event.payment, data);
promise.then(function (success) {
var status;
if (success)
status = ApplePaySession.STATUS_SUCCESS;
else
status = ApplePaySession.STATUS_FAILURE;
session.completePayment(status);
if (success) {
window.location.replace(url.build(window.checkoutConfig.payment[quote.paymentMethod().method].redirectUrl));
}
}, function (reason) {
if (reason.message == "ERROR BILLING") {
var status = session.STATUS_INVALID_BILLING_POSTAL_ADDRESS;
} else if (reason.message == "ERROR SHIPPING") {
var status = session.STATUS_INVALID_SHIPPING_POSTAL_ADDRESS;
} else {
var status = session.STATUS_FAILURE;
}
session.completePayment(status);
});
}
session.begin();
},
getControllerName: function () {
return window.checkoutConfig.payment.iframe.controllerName[this.getCode()];
},
getPlaceOrderUrl: function () {
return window.checkoutConfig.payment.iframe.placeOrderUrl[this.getCode()];
},
context: function () {
return this;
},
validate: function () {
return true;
},
showLogo: function () {
return window.checkoutConfig.payment.adyen.showLogo;
},
isApplePayAllowed: function () {
if (window.ApplePaySession) {
return true;
}
return false;
},
performValidation: function (validationURL) {
// Return a new promise.
return new Promise(function (resolve, reject) {
// retrieve payment methods
var serviceUrl = urlBuilder.createUrl('/adyen/request-merchant-session', {});
storage.post(
serviceUrl, JSON.stringify('{}')
).done(
function (response) {
var data = JSON.parse(response);
resolve(data);
}
).fail(function (error) {
console.log(JSON.stringify(error));
reject(Error("Network Error"));
});
});
},
sendPayment: function (payment, data) {
var deferred = $.Deferred();
return $.when(
placeOrderAction(data, new Messages())
).fail(
function (response) {
deferred.reject(Error(response));
}
).done(
function () {
deferred.resolve(true);
}
);
}
});
}
);
...@@ -67,7 +67,10 @@ define( ...@@ -67,7 +67,10 @@ define(
initialize: function () { initialize: function () {
var self = this; var self = this;
this._super(); this._super();
installments.setInstallments(0);
// include dynamic cse javascript // include dynamic cse javascript
var dfScriptTag = document.createElement('script'); var dfScriptTag = document.createElement('script');
dfScriptTag.src = this.getLibrarySource(); dfScriptTag.src = this.getLibrarySource();
...@@ -81,29 +84,42 @@ define( ...@@ -81,29 +84,42 @@ define(
var allInstallments = self.getAllInstallments(); var allInstallments = self.getAllInstallments();
// what card is this ?? // what card is this ??
var creditcardType = creditCardData.creditCard.type;
if (creditcardType) { if (creditCardData.creditCard) {
var creditcardType = creditCardData.creditCard.type;
cvcLength(4); cvcLength(4);
if (creditcardType != "AE") { if (creditcardType != "AE") {
cvcLength(3); cvcLength(3);
} }
if (creditcardType in allInstallments) { if (creditcardType in allInstallments) {
// get for the creditcard the installments // get for the creditcard the installments
var installmentCreditcard = allInstallments[creditcardType]; var installmentCreditcard = allInstallments[creditcardType];
var grandTotal = quote.totals().grand_total; var grandTotal = quote.totals().grand_total;
var numberOfInstallments = 0; var numberOfInstallments = [];
var dividedAmount = 0;
var dividedString = "";
$.each(installmentCreditcard, function (amount, installment) { $.each(installmentCreditcard, function (amount, installment) {
if (grandTotal <= amount) {
numberOfInstallments = installment; if (grandTotal >= amount) {
dividedAmount = (grandTotal / installment).toFixed(quote.getPriceFormat().precision);
dividedString = installment + " x " + dividedAmount + " " + quote.totals().quote_currency_code;
numberOfInstallments.push({
key: [dividedString],
value: installment
});
}
else {
return false; return false;
} }
}); });
}
if (numberOfInstallments > 0) { if (numberOfInstallments) {
installments.setInstallments(numberOfInstallments); installments.setInstallments(numberOfInstallments);
} }
} else { else {
installments.setInstallments(0); installments.setInstallments(0);
} }
} }
...@@ -195,8 +211,16 @@ define( ...@@ -195,8 +211,16 @@ define(
context: function () { context: function () {
return this; return this;
}, },
isCseEnabled: function () {
return window.checkoutConfig.payment.adyenCc.cseEnabled;
},
getCSEKey: function () {
return window.checkoutConfig.payment.adyenCc.cseKey;
},
getLibrarySource: function () { getLibrarySource: function () {
return window.checkoutConfig.payment.adyenCc.librarySource; return window.checkoutConfig.payment.adyenCc.librarySource;
}, },
getGenerationTime: function () { getGenerationTime: function () {
return window.checkoutConfig.payment.adyenCc.generationTime; return window.checkoutConfig.payment.adyenCc.generationTime;
...@@ -214,7 +238,9 @@ define( ...@@ -214,7 +238,9 @@ define(
var form = 'form[data-role=adyen-cc-form]'; var form = 'form[data-role=adyen-cc-form]';
var validate = $(form).validation() && $(form).validation('isValid'); var validate = $(form).validation() && $(form).validation('isValid');
// add extra validation because jqeury validation will not work on non name attributes
// add extra validation because jquery validation will not work on non name attributes
var ccNumber = Boolean($(form + ' #creditCardNumber').valid()); var ccNumber = Boolean($(form + ' #creditCardNumber').valid());
var owner = Boolean($(form + ' #creditCardHolderName').valid()); var owner = Boolean($(form + ' #creditCardHolderName').valid());
var expiration = Boolean($(form + ' #adyen_cc_expiration').valid()); var expiration = Boolean($(form + ' #adyen_cc_expiration').valid());
......
...@@ -146,7 +146,7 @@ define( ...@@ -146,7 +146,7 @@ define(
return self.item.method; return self.item.method;
}; };
result.validate = function () { result.validate = function () {
return self.validate(); return self.validate(value.brandCode);
}; };
result.placeRedirectOrder = function placeRedirectOrder(data) { result.placeRedirectOrder = function placeRedirectOrder(data) {
return self.placeRedirectOrder(data); return self.placeRedirectOrder(data);
...@@ -243,7 +243,8 @@ define( ...@@ -243,7 +243,8 @@ define(
if (brandCode() == "ideal") { if (brandCode() == "ideal") {
additionalData.issuer_id = this.issuerId(); additionalData.issuer_id = this.issuerId();
} else if (self.isPaymentMethodOpenInvoiceMethod()) { }
else if (self.isPaymentMethodOpenInvoiceMethod()) {
additionalData.gender = this.gender(); additionalData.gender = this.gender();
additionalData.dob = this.dob(); additionalData.dob = this.dob();
additionalData.telephone = this.telephone(); additionalData.telephone = this.telephone();
...@@ -320,7 +321,14 @@ define( ...@@ -320,7 +321,14 @@ define(
isIconEnabled: function () { isIconEnabled: function () {
return window.checkoutConfig.payment.adyen.showLogo; return window.checkoutConfig.payment.adyen.showLogo;
}, },
validate: function () { validate: function (brandCode) {
var form = '#payment_form_' + this.getCode() + '_' + brandCode;
var validate = $(form).validation() && $(form).validation('isValid');
if(!validate) {
return false;
}
return true; return true;
}, },
getRatePayDeviceIdentToken: function () { getRatePayDeviceIdentToken: function () {
......
...@@ -110,6 +110,7 @@ define( ...@@ -110,6 +110,7 @@ define(
context: function () { context: function () {
return this; return this;
}, },
canCreateBillingAgreement: function () { canCreateBillingAgreement: function () {
return window.checkoutConfig.payment.adyenCc.canCreateBillingAgreement; return window.checkoutConfig.payment.adyenCc.canCreateBillingAgreement;
}, },
...@@ -129,11 +130,18 @@ define( ...@@ -129,11 +130,18 @@ define(
// pre-define installments if they are set // pre-define installments if they are set
var i, installments = []; var i, installments = [];
if (value.number_of_installments > 0) {
for (i = 1; i <= value.number_of_installments; i++) { var grandTotal = quote.totals().grand_total;
var dividedString = "";
var dividedAmount = 0;
if (value.number_of_installments) {
for (i = 0; i < value.number_of_installments.length; i++) {
dividedAmount = (grandTotal / value.number_of_installments[i]).toFixed(quote.getPriceFormat().precision);
dividedString = value.number_of_installments[i] + " x " + dividedAmount + " " + quote.totals().quote_currency_code;
installments.push({ installments.push({
key: i, key: [dividedString],
value: i value: value.number_of_installments[i]
}); });
} }
} }
...@@ -156,6 +164,7 @@ define( ...@@ -156,6 +164,7 @@ define(
creditCardVerificationNumber: '', creditCardVerificationNumber: '',
creditCardExpMonth: ko.observable(creditCardExpMonth), creditCardExpMonth: ko.observable(creditCardExpMonth),
creditCardExpYear: ko.observable(creditCardExpYear), creditCardExpYear: ko.observable(creditCardExpYear),
getGenerationTime: function () { getGenerationTime: function () {
return window.checkoutConfig.payment.adyenCc.generationTime; return window.checkoutConfig.payment.adyenCc.generationTime;
}, },
......
<!--
/**
* ######
* ######
* ############ ####( ###### #####. ###### ############ ############
* ############# #####( ###### #####. ###### ############# #############
* ###### #####( ###### #####. ###### ##### ###### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ######
* ############# ############# ############# ############# ##### ######
* ############ ############ ############# ############ ##### ######
* ######
* #############
* ############
*
* Adyen Payment module (https://www.adyen.com/)
*
* Copyright (c) 2017 Adyen BV (https://www.adyen.com/)
* See LICENSE.txt for license details.
*
* Author: Adyen <magento@adyen.com>
*/
-->
<!-- ko if: isApplePayAllowed() -->
<div class="payment-method" data-bind="css: {'_active': (getCode() == isChecked())}">
<div class="payment-method-title field choice">
<input type="radio"
name="payment[method]"
class="radio"
data-bind="attr: {'id': getCode()}, value: getCode(), checked: isChecked, click: selectPaymentMethod, visible: isRadioButtonVisible()"/>
<label data-bind="attr: {'for': getCode()}" class="label">
<!-- ko if: showLogo() -->
<div data-bind="attr: { 'class': 'adyen-sprite ' + getCode() }"></div>
<!--/ko-->
<span data-bind="text: getTitle()"></span>
</label>
</div>
<div class="payment-method-content">
<div class="payment-method-billing-address">
<!-- ko foreach: $parent.getRegion(getBillingAddressFormName()) -->
<!-- ko template: getTemplate() --><!-- /ko -->
<!--/ko-->
</div>
<div class="checkout-agreements-block">
<!-- ko foreach: $parent.getRegion('before-place-order') -->
<!-- ko template: getTemplate() --><!-- /ko -->
<!--/ko-->
</div>
<div id="adyen-apple-pay-button" class="apple-pay-button-with-text apple-pay-button-black-with-text"
data-bind= "click: placeApplePayOrder">
<span class="logo"></span>
</div>
</div>
</div>
<!--/ko-->
\ No newline at end of file
...@@ -221,14 +221,16 @@ ...@@ -221,14 +221,16 @@
<span><!-- ko text: $t('Installments')--><!-- /ko --></span> <span><!-- ko text: $t('Installments')--><!-- /ko --></span>
</label> </label>
<div class="control"> <div class="control">
<select class="select"
name="payment[number_of_installments]" <select class="select"
data-bind="attr: {id: getCode() + '_installments', 'data-container': getCode() + '-installments', 'data-validate': JSON.stringify({required:true})}, name="payment[number_of_installments]"
data-bind="attr: {id: getCode() + '_installments', 'data-container': getCode() + '-installments', 'data-validate': JSON.stringify({required:false})},
enable: isActive($parents), enable: isActive($parents),
options: getInstallments, options: getInstallments,
optionsValue: 'value', optionsValue: 'value',
optionsText: 'key', optionsText: 'key',
optionsCaption: $t('Installments'), optionsCaption: $t('Do not use Installments'),
value: installment" value: installment"
data-validate="{required:true}"> data-validate="{required:true}">
</select> </select>
......
...@@ -52,8 +52,8 @@ ...@@ -52,8 +52,8 @@
<!--/ko--> <!--/ko-->
</div> </div>
<fieldset class="fieldset" data-bind='attr: {id: "payment_form_" + $parent.getCode() + "_" + value}'> <form class="form" data-role="adyen-hpp-form" action="#" method="post" data-bind="mageInit: { 'validation':[]}, attr: {id: 'payment_form_' + $parent.getCode() + '_' + value}">
<fieldset class="fieldset" data-bind='attr: {id: "payment_fieldset_" + $parent.getCode() + "_" + value}'>
<!-- ko if: value == 'ideal' --> <!-- ko if: value == 'ideal' -->
<label data-bind="attr: {'for': 'issuerId'}" class="label"> <label data-bind="attr: {'for': 'issuerId'}" class="label">
<span><!-- ko text: $t('Select Your Bank') --><!-- /ko --></span> <span><!-- ko text: $t('Select Your Bank') --><!-- /ko --></span>
...@@ -68,17 +68,16 @@ ...@@ -68,17 +68,16 @@
</select> </select>
<!--/ko--> <!--/ko-->
<!-- ko if: isPaymentMethodOpenInvoiceMethod() --> <!-- ko if: isPaymentMethodOpenInvoiceMethod() -->
<!-- ko if: showGender() --> <!-- ko if: showGender() -->
<div class="field gender type required"> <div class="field gender required">
<label data-bind="attr: {for: getCode() + '_gender_type'}" class="label"> <label data-bind="attr: {for: getCode() + '_gender_type_' + value}" class="label">
<span><!-- ko text: $t('Gender')--><!-- /ko --></span> <span><!-- ko text: $t('Gender')--><!-- /ko --></span>
</label> </label>
<div class="control"> <div class="control">
<select class="select select-gender-type" <select class="select select-gender-type"
name="payment[gender]" name="payment[gender]"
data-bind="attr: {id: getCode() + '_gender_type', 'data-container': getCode() + '-gender-type', 'data-validate': JSON.stringify({required:true})}, data-bind="attr: {id: getCode() + '_gender_type_' + value, 'data-container': getCode() + '-gender-type'},
options: $parent.getGenderTypes(), options: $parent.getGenderTypes(),
optionsValue: 'key', optionsValue: 'key',
optionsText: 'value', optionsText: 'value',
...@@ -92,20 +91,20 @@ ...@@ -92,20 +91,20 @@
<!-- ko if: showDob() --> <!-- ko if: showDob() -->
<div class="field dob type required"> <div class="field dob type required">
<label data-bind="attr: {for: getCode() + '_dob'}" class="label"> <label data-bind="attr: {for: getCode() + '_dob_' + value}" class="label">
<span><!-- ko text: $t('Date of Birth')--><!-- /ko --></span> <span><!-- ko text: $t('Date of Birth')--><!-- /ko --></span>
</label> </label>
<div class="control"> <div class="control">
<input type="text" class="input-text" <input type="text" class="input-text"
name="payment[dob]" name="payment[dob]"
data-bind=" data-bind=" datepicker: { storage: datepickerValue, options: { showOn: 'both', changeYear: true, yearRange: '-99:-1', defaultDate: '-20y' } },
datepicker: { storage: datepickerValue, options: { showOn: 'both', changeYear: true, yearRange: '-99:-1', defaultDate: '-20y' } }, attr: {
attr: { id: getCode() + '_dob_' + value,
title: $t('Date of Birth'), title: $t('Date of Birth'),
'data-container': getCode() + '-dob', 'data-container': getCode() + '-dob'
'data-validate': JSON.stringify({'required':true }) },
}, value: dob"
value: dob" data-validate="{required:true}"
/> />
</div> </div>
</div> </div>
...@@ -113,7 +112,7 @@ ...@@ -113,7 +112,7 @@
<!-- ko if: showTelephone() --> <!-- ko if: showTelephone() -->
<div class="field telephone type required"> <div class="field telephone type required">
<label data-bind="attr: {for: getCode() + '_telephone'}" class="label"> <label data-bind="attr: {for: getCode() + '_telephone_' + value}" class="label">
<span><!-- ko text: $t('Telephone')--><!-- /ko --></span> <span><!-- ko text: $t('Telephone')--><!-- /ko --></span>
</label> </label>
<div class="control"> <div class="control">
...@@ -121,10 +120,10 @@ ...@@ -121,10 +120,10 @@
name="payment[telephone]" name="payment[telephone]"
data-bind=" data-bind="
attr: { attr: {
id: getCode() + '_telephone', id: getCode() + '_telephone_' + value,
title: $t('Telephone'), title: $t('Telephone'),
'data-container': getCode() + '-telephone', 'data-container': getCode() + '-telephone_' + value,
'data-validate': JSON.stringify({'required-number':true }) 'data-validate': JSON.stringify({'required-number':true})
}, },
value: telephone" value: telephone"
data-validate="{required:true}" data-validate="{required:true}"
...@@ -135,7 +134,7 @@ ...@@ -135,7 +134,7 @@
<!-- ko if: showSsn() --> <!-- ko if: showSsn() -->
<div class="field ssn type required"> <div class="field ssn type required">
<label data-bind="attr: {for: getCode() + '_ssn'}" class="label"> <label data-bind="attr: {for: getCode() + '_ssn_' + value}" class="label">
<span><!-- ko text: $t('Personal number (last digits)')--><!-- /ko --></span> <span><!-- ko text: $t('Personal number (last digits)')--><!-- /ko --></span>
</label> </label>
<div class="control"> <div class="control">
...@@ -143,10 +142,10 @@ ...@@ -143,10 +142,10 @@
name="payment[ssn]" name="payment[ssn]"
data-bind=" data-bind="
attr: { attr: {
id: getCode() + '_ssn', id: getCode() + '_ssn_' + value,
title: $t('Social Security Number'), title: $t('Social Security Number'),
'data-container': getCode() + '-ssn', 'data-container': getCode() + '-ssn',
'data-validate': JSON.stringify({'required-number':true }), 'data-validate': JSON.stringify({'required-number':true}),
maxlength : getSsnLength() maxlength : getSsnLength()
}, },
value: ssn" value: ssn"
...@@ -158,6 +157,8 @@ ...@@ -158,6 +157,8 @@
<!--/ko--> <!--/ko-->
</fieldset> </fieldset>
</form>
<div class="checkout-agreements-block"> <div class="checkout-agreements-block">
<!-- ko foreach: $parents[1].getRegion('before-place-order') --> <!-- ko foreach: $parents[1].getRegion('before-place-order') -->
<!-- ko template: getTemplate() --><!-- /ko --> <!-- ko template: getTemplate() --><!-- /ko -->
...@@ -179,10 +180,6 @@ ...@@ -179,10 +180,6 @@
<!--/ko--> <!--/ko-->
<input type="hidden" name="payment[dfValue]" data-bind="attr: { id: 'dfValue', value: dfValue }" />
<!-- ko if: (isPaymentMethodSelectionOnAdyen()) --> <!-- ko if: (isPaymentMethodSelectionOnAdyen()) -->
<div class="payment-method" data-bind="css: {'_active': (getCode() == isChecked())}"> <div class="payment-method" data-bind="css: {'_active': (getCode() == isChecked())}">
......
...@@ -204,7 +204,7 @@ ...@@ -204,7 +204,7 @@
<!--/ko--> <!--/ko-->
<!-- ko if: number_of_installments > 0 --> <!-- ko if: number_of_installments.length > 0 -->
<div class="field required" data-bind="attr: {id: getCode() + '_installments_div'}, visible: getInstallments().length > 0"> <div class="field required" data-bind="attr: {id: getCode() + '_installments_div'}, visible: getInstallments().length > 0">
<label data-bind="attr: {for: getCode() + '_installments'}" class="label"> <label data-bind="attr: {for: getCode() + '_installments'}" class="label">
...@@ -213,12 +213,12 @@ ...@@ -213,12 +213,12 @@
<div class="control"> <div class="control">
<select class="select" <select class="select"
name="payment[number_of_installments]" name="payment[number_of_installments]"
data-bind="attr: {id: getCode() + '_installments', 'data-container': getCode() + '-installments', 'data-validate': JSON.stringify({required:true})}, data-bind="attr: {id: getCode() + '_installments', 'data-container': getCode() + '-installments', 'data-validate': JSON.stringify({required:false})},
enable: $parent.isActive($parents), enable: $parent.isActive($parents),
options: getInstallments, options: getInstallments,
optionsValue: 'value', optionsValue: 'value',
optionsText: 'key', optionsText: 'key',
optionsCaption: $t('Installments'), optionsCaption: $t('Do not use Installments'),
value: installment" value: installment"
data-validate="{required:true}"> data-validate="{required:true}">
</select> </select>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment