Skip to content

Commit

Permalink
NTR: PIHPS-205 - add new payment method blik
Browse files Browse the repository at this point in the history
  • Loading branch information
Vitalij Mik committed Feb 9, 2024
1 parent 95aa056 commit 8fcb2d3
Show file tree
Hide file tree
Showing 12 changed files with 191 additions and 17 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?php

namespace Kiener\MolliePayments\Components\MollieLimits\Service;
namespace Kiener\MolliePayments\Components\MollieAvailability\Service;

use Exception;
use Kiener\MolliePayments\Exception\MissingCartServiceException;
Expand All @@ -22,7 +22,7 @@
use Symfony\Component\HttpFoundation\Exception\BadRequestException;
use Symfony\Component\HttpFoundation\RequestStack;

class MollieLimitsRemover extends PaymentMethodRemover
class MolliePaymentMethodAvailabilityRemover extends PaymentMethodRemover
{
/**
* @var ActivePaymentMethodsProviderInterface
Expand Down Expand Up @@ -78,6 +78,7 @@ public function removePaymentMethods(PaymentMethodRouteResponse $originalData, S

$price = $cart->getPrice()->getTotalPrice();
}
$countryIsoCode = null;

if ($this->isOrderRoute()) {
try {
Expand All @@ -90,15 +91,27 @@ public function removePaymentMethods(PaymentMethodRouteResponse $originalData, S
}

$price = $order->getAmountTotal();

$billingAddress = $order->getBillingAddress();
if ($billingAddress === null) {
return $originalData;
}
$billingCountry = $billingAddress->getCountry();
if ($billingCountry === null) {
return $originalData;
}
$countryIsoCode = $billingCountry->getIso();
}

if (!isset($price)) {
return $originalData;
}


$availableMolliePayments = $this->paymentMethodsProvider->getActivePaymentMethodsForAmount(
$price,
$context->getCurrency()->getIsoCode(),
(string) $countryIsoCode,
[
$context->getSalesChannel()->getId(),
]
Expand Down
32 changes: 32 additions & 0 deletions src/Handler/Method/BlikPayment.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php

namespace Kiener\MolliePayments\Handler\Method;

use Kiener\MolliePayments\Handler\PaymentHandler;
use Mollie\Api\Types\PaymentMethod;
use Shopware\Core\Checkout\Customer\CustomerEntity;
use Shopware\Core\Checkout\Order\OrderEntity;
use Shopware\Core\System\Locale\LocaleEntity;
use Shopware\Core\System\SalesChannel\SalesChannelContext;

class BlikPayment extends PaymentHandler
{
public const PAYMENT_METHOD_NAME = 'blik';
public const PAYMENT_METHOD_DESCRIPTION = 'Blik';

/** @var string */
protected $paymentMethod = self::PAYMENT_METHOD_NAME;


/**
* @param array<mixed> $orderData
* @param OrderEntity $orderEntity
* @param SalesChannelContext $salesChannelContext
* @param CustomerEntity $customer
* @return array<mixed>
*/
public function processPaymentMethodSpecificParameters(array $orderData, OrderEntity $orderEntity, SalesChannelContext $salesChannelContext, CustomerEntity $customer): array
{
return $orderData;
}
}
10 changes: 5 additions & 5 deletions src/Resources/config/config.xml
Original file line number Diff line number Diff line change
Expand Up @@ -165,11 +165,11 @@
<input-field type="bool">
<name>useMolliePaymentMethodLimits</name>
<defaultValue>false</defaultValue>
<label>Use Mollie Payment Method Limits</label>
<label lang="de-DE">Mollies Limits für Zahlungsarten verwenden</label>
<label lang="nl-NL">Mollie's limieten voor betaalmethoden gebruiken</label>
<helpText>Automatically hides payment methods in the checkout based on the limits of Mollie. For instance, if you can only accept credit card payments up to 500 euros, the checkout for a cart of 600 euros will not display credit card as a payment method.</helpText>
<helpText lang="de-DE">Blendet automatisch Zahlungsart im Checkout basierend auf den Limits von Mollie aus. Wenn Sie beispielsweise nur Kreditkartenzahlungen bis zu 500 Euro akzeptieren können, wird an der Kasse für einen Warenkorb von 600 Euro keine Kreditkarte als Zahlungsarte angezeigt.</helpText>
<label>Use mollie's availability rules for payment methods</label>
<label lang="de-DE">Mollies Verfügbarkeitsregeln für Zahlungsarten verwenden</label>
<label lang="nl-NL">Gebruik de beschikbaarheidsregels van Mollie voor betaalmethoden</label>
<helpText>Automatically hides payment methods in the checkout based on the availability rules for payment methods. Only active payment methods from your mollie dashboard will be shown. If the payment method has a cart limit, currency restriction or billing address restriction, it will be hidden during checkout.</helpText>
<helpText lang="de-DE">Blendet automatisch Zahlungsart im Checkout basierend auf Verfügbarkeitsregeln von Mollie. Es werden nur die aktiven Zahlungsarten aus dem Mollie Dashboard angezeigt. Wenn die Zahlungsart eine Einschränkung auf den Warenkorbwert, Währung oder Rechnungsadresse hat, wird diese auch ausgeblendet.</helpText>
<helpText lang="nl-NL">Verbergt automatisch betaalmethoden in de checkout op basis van Mollie's limieten. Als je bijvoorbeeld alleen creditcardbetalingen tot 500 euro kan accepteren, wordt bij een winkelwagen van 600 euro geen creditcard weergegeven als betaalmethode bij het afrekenen.</helpText>
</input-field>
<input-field type="text">
Expand Down
8 changes: 8 additions & 0 deletions src/Resources/config/services/handlers.xml
Original file line number Diff line number Diff line change
Expand Up @@ -183,5 +183,13 @@
<tag name="shopware.payment.method.async"/>
</service>

<!-- Blick PaymentHandler -->
<service id="Kiener\MolliePayments\Handler\Method\BlikPayment">
<argument type="service" id="mollie_payments.logger"/>
<argument type="service" id="service_container"/>
<tag name="shopware.payment.method.async"/>
</service>


</services>
</container>
3 changes: 2 additions & 1 deletion src/Resources/config/services/payment.xml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@
<tag name="mollie_payments.payment_method.remover.sw64"/>
</service>

<service id="Kiener\MolliePayments\Components\MollieLimits\Service\MollieLimitsRemover">

<service id="Kiener\MolliePayments\Components\MollieAvailability\Service\MolliePaymentMethodAvailabilityRemover">
<argument type="service" id="service_container"/>
<argument type="service" id="request_stack"/>
<argument type="service" id="Kiener\MolliePayments\Service\OrderService"/>
Expand Down
9 changes: 7 additions & 2 deletions src/Service/Payment/Provider/ActivePaymentMethodsProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,11 @@ public function __construct(MollieApiFactory $mollieApiFactory, MollieOrderPrice
*
* @param float $price
* @param string $currency
* @param string $billingCountryCode
* @param array<mixed> $salesChannelIDs
* @return Method[]
*/
public function getActivePaymentMethodsForAmount(float $price, string $currency, array $salesChannelIDs): array
public function getActivePaymentMethodsForAmount(float $price, string $currency,string $billingCountryCode, array $salesChannelIDs): array
{
if ($price < 0.01) {
return [];
Expand All @@ -61,9 +62,13 @@ public function getActivePaymentMethodsForAmount(float $price, string $currency,
'amount' => [
'value' => $this->priceFormatter->formatValue($price),
'currency' => strtoupper($currency),
]
],
];

if (mb_strlen($billingCountryCode) > 0) {
$params['billingCountry'] = $billingCountryCode;
}

return $this->getActivePaymentMethods($params, $salesChannelIDs);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,11 @@
interface ActivePaymentMethodsProviderInterface
{
/**
* @param float $price
* @param string $currency
* @param float $price
* @param string $currency
* @param string $billingCountryCode
* @param array<string> $salesChannelIDs
* @return array<Method>
*/
public function getActivePaymentMethodsForAmount(float $price, string $currency, array $salesChannelIDs): array;
public function getActivePaymentMethodsForAmount(float $price, string $currency,string $billingCountryCode, array $salesChannelIDs): array;
}
2 changes: 2 additions & 0 deletions src/Service/PaymentMethodService.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
use Kiener\MolliePayments\Handler\Method\BankTransferPayment;
use Kiener\MolliePayments\Handler\Method\BelfiusPayment;
use Kiener\MolliePayments\Handler\Method\BilliePayment;
use Kiener\MolliePayments\Handler\Method\BlikPayment;
use Kiener\MolliePayments\Handler\Method\CreditCardPayment;
use Kiener\MolliePayments\Handler\Method\EpsPayment;
use Kiener\MolliePayments\Handler\Method\GiftCardPayment;
Expand Down Expand Up @@ -417,6 +418,7 @@ public function getPaymentHandlers(): array
In3Payment::class,
PosPayment::class,
TwintPayment::class,
BlikPayment::class,
// IngHomePayPayment::class, // not allowed anymore
// DirectDebitPayment::class, // only allowed when updating subsriptions, aka => not allowed anymore
];
Expand Down
43 changes: 43 additions & 0 deletions tests/Cypress/cypress/e2e/storefront/payment-methods/blik.cy.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import Devices from "Services/utils/Devices";
import Session from "Services/utils/Session"
// ------------------------------------------------------
import PaymentAction from "Actions/storefront/checkout/PaymentAction";
import DummyBasketScenario from "Scenarios/DummyBasketScenario";
// ------------------------------------------------------


const devices = new Devices();
const session = new Session();

const paymentAction = new PaymentAction();
const scenarioDummyBasket = new DummyBasketScenario(1);

const device = devices.getFirstDevice();


describe('Blik payment method', () => {

context(devices.getDescription(device), () => {

before(function () {
devices.setDevice(device);
})

beforeEach(() => {
session.resetBrowserSession();
devices.setDevice(device);
});

it('Blik is existing in checkout', () => {

scenarioDummyBasket.execute();

paymentAction.switchPaymentMethod('Blik');

// payment would only work using currency CHF which cannot be done at the moment
})

})

})

Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
<?php declare(strict_types=1);

namespace MolliePayments\Tests\Service\MollieApi\Builder\Payments;

use DateTime;
use DateTimeZone;
use Faker\Extension\Container;
use Kiener\MolliePayments\Handler\Method\BlikPayment;
use Kiener\MolliePayments\Handler\Method\KlarnaPayLaterPayment;
use Kiener\MolliePayments\Handler\Method\TwintPayment;
use Kiener\MolliePayments\Service\MollieApi\Builder\MollieOrderPriceBuilder;
use Mollie\Api\Types\PaymentMethod;
use MolliePayments\Tests\Fakes\FakeContainer;
use MolliePayments\Tests\Service\MollieApi\Builder\AbstractMollieOrderBuilder;
use Shopware\Core\Checkout\Cart\Price\Struct\CartPrice;
use Shopware\Core\Framework\Uuid\Uuid;
use Shopware\Core\System\Currency\CurrencyEntity;

class BlikOrderBuilderTest extends AbstractMollieOrderBuilder
{
public function testOrderBuild(): void
{
$redirectWebhookUrl = 'https://foo';
$this->router->method('generate')->willReturn($redirectWebhookUrl);


$this->paymentHandler = new BlikPayment(
$this->loggerService,
new FakeContainer()
);

$transactionId = Uuid::randomHex();
$amountTotal = 27.0;
$taxStatus = CartPrice::TAX_STATE_GROSS;
$currencyISO = 'EUR';

$currency = new CurrencyEntity();
$currency->setId(Uuid::randomHex());
$currency->setIsoCode($currencyISO);

$orderNumber = 'foo number';
$lineItems = $this->getDummyLineItems();

$order = $this->getOrderEntity($amountTotal, $taxStatus, $currencyISO, $lineItems, $orderNumber);

$actual = $this->builder->buildOrderPayload($order, $transactionId, $this->paymentHandler::PAYMENT_METHOD_NAME, $this->salesChannelContext, $this->paymentHandler, []);

$expectedOrderLifeTime = (new DateTime())->setTimezone(new DateTimeZone('UTC'))
->modify(sprintf('+%d day', $this->expiresAt))
->format('Y-m-d');

$expected = [
'amount' => (new MollieOrderPriceBuilder())->build($amountTotal, $currencyISO),
'locale' => $this->localeCode,
'method' => $this->paymentHandler::PAYMENT_METHOD_NAME,
'orderNumber' => $orderNumber,
'payment' => ['webhookUrl' => $redirectWebhookUrl],
'redirectUrl' => $redirectWebhookUrl,
'webhookUrl' => $redirectWebhookUrl,
'lines' => $this->getExpectedLineItems($taxStatus, $lineItems, $currency),
'billingAddress' => $this->getExpectedTestAddress($this->address, $this->email),
'shippingAddress' => $this->getExpectedTestAddress($this->address, $this->email),
'expiresAt' => $expectedOrderLifeTime
];

self::assertSame($expected, $actual);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,8 @@ public function testOrderBuild(): void
{
$redirectWebhookUrl = 'https://foo';
$this->router->method('generate')->willReturn($redirectWebhookUrl);
$paymentMethod = TwintPayment::PAYMENT_METHOD_NAME;

$this->paymentHandler = new KlarnaPayLaterPayment(
$this->paymentHandler = new TwintPayment(
$this->loggerService,
new FakeContainer()
);
Expand All @@ -42,7 +41,7 @@ public function testOrderBuild(): void

$order = $this->getOrderEntity($amountTotal, $taxStatus, $currencyISO, $lineItems, $orderNumber);

$actual = $this->builder->buildOrderPayload($order, $transactionId, $paymentMethod, $this->salesChannelContext, $this->paymentHandler, []);
$actual = $this->builder->buildOrderPayload($order, $transactionId, $this->paymentHandler::PAYMENT_METHOD_NAME, $this->salesChannelContext, $this->paymentHandler, []);

$expectedOrderLifeTime = (new DateTime())->setTimezone(new DateTimeZone('UTC'))
->modify(sprintf('+%d day', $this->expiresAt))
Expand All @@ -51,7 +50,7 @@ public function testOrderBuild(): void
$expected = [
'amount' => (new MollieOrderPriceBuilder())->build($amountTotal, $currencyISO),
'locale' => $this->localeCode,
'method' => $paymentMethod,
'method' => $this->paymentHandler::PAYMENT_METHOD_NAME,
'orderNumber' => $orderNumber,
'payment' => ['webhookUrl' => $redirectWebhookUrl],
'redirectUrl' => $redirectWebhookUrl,
Expand Down
2 changes: 2 additions & 0 deletions tests/PHPUnit/Service/PaymentMethodServiceTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
use Kiener\MolliePayments\Handler\Method\BankTransferPayment;
use Kiener\MolliePayments\Handler\Method\BelfiusPayment;
use Kiener\MolliePayments\Handler\Method\BilliePayment;
use Kiener\MolliePayments\Handler\Method\BlikPayment;
use Kiener\MolliePayments\Handler\Method\CreditCardPayment;
use Kiener\MolliePayments\Handler\Method\EpsPayment;
use Kiener\MolliePayments\Handler\Method\GiftCardPayment;
Expand Down Expand Up @@ -127,6 +128,7 @@ public function testSupportedMethods(): void
In3Payment::class,
PosPayment::class,
TwintPayment::class,
BlikPayment::class,
];

$handlers = $this->paymentMethodService->getPaymentHandlers();
Expand Down

0 comments on commit 8fcb2d3

Please sign in to comment.