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 8560720
Show file tree
Hide file tree
Showing 10 changed files with 176 additions and 5 deletions.
15 changes: 14 additions & 1 deletion src/Components/MollieLimits/Service/MollieLimitsRemover.php
Original file line number Diff line number Diff line change
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,18 +91,30 @@ 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(),
[
$context->getSalesChannel()->getId(),
]
],
$countryIsoCode
);

/** @var PaymentMethodEntity $paymentMethod */
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;
}
}
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>
8 changes: 6 additions & 2 deletions src/Service/Payment/Provider/ActivePaymentMethodsProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ public function __construct(MollieApiFactory $mollieApiFactory, MollieOrderPrice
* @param array<mixed> $salesChannelIDs
* @return Method[]
*/
public function getActivePaymentMethodsForAmount(float $price, string $currency, array $salesChannelIDs): array
public function getActivePaymentMethodsForAmount(float $price, string $currency, array $salesChannelIDs, ?string $billingCountryCode): array
{
if ($price < 0.01) {
return [];
Expand All @@ -61,9 +61,13 @@ public function getActivePaymentMethodsForAmount(float $price, string $currency,
'amount' => [
'value' => $this->priceFormatter->formatValue($price),
'currency' => strtoupper($currency),
]
],
];

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

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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,5 @@ interface ActivePaymentMethodsProviderInterface
* @param array<string> $salesChannelIDs
* @return array<Method>
*/
public function getActivePaymentMethodsForAmount(float $price, string $currency, array $salesChannelIDs): array;
public function getActivePaymentMethodsForAmount(float $price, string $currency, array $salesChannelIDs, ?string $billingCountryCode): 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,67 @@
<?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\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);
$paymentMethod = TwintPayment::PAYMENT_METHOD_NAME;

$this->paymentHandler = new TwintPayment(
$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, $paymentMethod, $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' => $paymentMethod,
'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 @@ -23,7 +23,7 @@ public function testOrderBuild(): void
$this->router->method('generate')->willReturn($redirectWebhookUrl);
$paymentMethod = TwintPayment::PAYMENT_METHOD_NAME;

$this->paymentHandler = new KlarnaPayLaterPayment(
$this->paymentHandler = new TwintPayment(
$this->loggerService,
new FakeContainer()
);
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 8560720

Please sign in to comment.