diff --git a/src/Sylius/Bundle/PayumBundle/Action/CapturePaymentAction.php b/src/Sylius/Bundle/PayumBundle/Action/CapturePaymentAction.php index 775ddedc286..547ed6ae61b 100644 --- a/src/Sylius/Bundle/PayumBundle/Action/CapturePaymentAction.php +++ b/src/Sylius/Bundle/PayumBundle/Action/CapturePaymentAction.php @@ -17,12 +17,26 @@ use Payum\Core\Model\Payment as PayumPayment; use Payum\Core\Request\Capture; use Payum\Core\Request\Convert; +use Sylius\Bundle\PayumBundle\Provider\PaymentDescriptionProviderInterface; use Sylius\Bundle\PayumBundle\Request\GetStatus; use Sylius\Component\Core\Model\OrderInterface; use Sylius\Component\Core\Model\PaymentInterface as SyliusPaymentInterface; final class CapturePaymentAction extends GatewayAwareAction { + /** + * @var PaymentDescriptionProviderInterface + */ + private $paymentDescriptionProvider; + + /** + * @param PaymentDescriptionProviderInterface $paymentDescriptionProvider + */ + public function __construct(PaymentDescriptionProviderInterface $paymentDescriptionProvider) + { + $this->paymentDescriptionProvider = $paymentDescriptionProvider; + } + /** * {@inheritdoc} * @@ -51,11 +65,7 @@ public function execute($request) $payumPayment->setCurrencyCode($order->getCurrencyCode()); $payumPayment->setClientEmail($order->getCustomer()->getEmail()); $payumPayment->setClientId($order->getCustomer()->getId()); - $payumPayment->setDescription(sprintf( - 'Payment contains %d items for a total of %01.2f', - $order->getItems()->count(), - round($totalAmount / 100, 2) - )); + $payumPayment->setDescription($this->paymentDescriptionProvider->getPaymentDescription($payment)); $payumPayment->setDetails($payment->getDetails()); $this->gateway->execute($convert = new Convert($payumPayment, 'array', $request->getToken())); diff --git a/src/Sylius/Bundle/PayumBundle/Provider/PaymentDescriptionProvider.php b/src/Sylius/Bundle/PayumBundle/Provider/PaymentDescriptionProvider.php new file mode 100644 index 00000000000..e5155f631f6 --- /dev/null +++ b/src/Sylius/Bundle/PayumBundle/Provider/PaymentDescriptionProvider.php @@ -0,0 +1,53 @@ + + */ +final class PaymentDescriptionProvider implements PaymentDescriptionProviderInterface +{ + /** + * @var TranslatorInterface + */ + private $translator; + + /** + * @param TranslatorInterface $translator + */ + public function __construct(TranslatorInterface $translator) + { + $this->translator = $translator; + } + + /** + * {@inheritdoc} + */ + public function getPaymentDescription(PaymentInterface $payment) + { + /** @var OrderInterface $order */ + $order = $payment->getOrder(); + + return $this->translator->transChoice( + 'sylius.payum_action.payment.description', + $order->getItems()->count(), + [ + '%items%' => $order->getItems()->count(), + '%total%' => round($order->getTotal() / 100, 2), + ] + ); + } +} diff --git a/src/Sylius/Bundle/PayumBundle/Provider/PaymentDescriptionProviderInterface.php b/src/Sylius/Bundle/PayumBundle/Provider/PaymentDescriptionProviderInterface.php new file mode 100644 index 00000000000..92e1a8c3cd3 --- /dev/null +++ b/src/Sylius/Bundle/PayumBundle/Provider/PaymentDescriptionProviderInterface.php @@ -0,0 +1,27 @@ + + */ +interface PaymentDescriptionProviderInterface +{ + /** + * @param PaymentInterface $payment + * + * @return string + */ + public function getPaymentDescription(PaymentInterface $payment); +} diff --git a/src/Sylius/Bundle/PayumBundle/Resources/config/services.xml b/src/Sylius/Bundle/PayumBundle/Resources/config/services.xml index cc7ed9e6dfc..d3ac6c881be 100644 --- a/src/Sylius/Bundle/PayumBundle/Resources/config/services.xml +++ b/src/Sylius/Bundle/PayumBundle/Resources/config/services.xml @@ -21,6 +21,7 @@ + diff --git a/src/Sylius/Bundle/PayumBundle/Resources/config/services/action.xml b/src/Sylius/Bundle/PayumBundle/Resources/config/services/action.xml index f28900e7c97..d9e5c2c6525 100644 --- a/src/Sylius/Bundle/PayumBundle/Resources/config/services/action.xml +++ b/src/Sylius/Bundle/PayumBundle/Resources/config/services/action.xml @@ -7,6 +7,7 @@ + diff --git a/src/Sylius/Bundle/PayumBundle/Resources/config/services/provider.xml b/src/Sylius/Bundle/PayumBundle/Resources/config/services/provider.xml new file mode 100644 index 00000000000..676c525db69 --- /dev/null +++ b/src/Sylius/Bundle/PayumBundle/Resources/config/services/provider.xml @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/src/Sylius/Bundle/PayumBundle/Resources/translations/messages.en.yml b/src/Sylius/Bundle/PayumBundle/Resources/translations/messages.en.yml index c007837b3ca..04d545eafdb 100644 --- a/src/Sylius/Bundle/PayumBundle/Resources/translations/messages.en.yml +++ b/src/Sylius/Bundle/PayumBundle/Resources/translations/messages.en.yml @@ -15,3 +15,6 @@ sylius: offline: Offline paypal_express_checkout: Paypal express checkout stripe_checkout: Stripe checkout + payum_action: + payment: + description: Payment contains %items% item for a total of %total%|Payment contains %items% items for a total of %total% diff --git a/src/Sylius/Bundle/PayumBundle/spec/Action/CapturePaymentActionSpec.php b/src/Sylius/Bundle/PayumBundle/spec/Action/CapturePaymentActionSpec.php new file mode 100644 index 00000000000..d77bb2affbb --- /dev/null +++ b/src/Sylius/Bundle/PayumBundle/spec/Action/CapturePaymentActionSpec.php @@ -0,0 +1,59 @@ + + */ +final class CapturePaymentActionSpec extends ObjectBehavior +{ + function let(PaymentDescriptionProviderInterface $paymentDescriptionProvider) + { + $this->beConstructedWith($paymentDescriptionProvider); + } + + function it_is_initializable() + { + $this->shouldHaveType(CapturePaymentAction::class); + } + + function it_extends_gateway_aware_action() + { + $this->shouldHaveType(GatewayAwareAction::class); + } + + function it_should_throw_exception_when_unsupported_request(Capture $capture) + { + $this->shouldThrow('\Payum\Core\Exception\RequestNotSupportedException')->duringExecute($capture); + } + + function it_should_perform_basic_capture( + PaymentDescriptionProviderInterface $paymentDescriptionProvider, + GatewayInterface $gateway, + Capture $capture, + PaymentInterface $payment, + OrderInterface $order + ) { + $this->setGateway($gateway); + + $payment->getOrder()->willReturn($order); + $payment->getDetails()->willReturn([]); + $capture->getModel()->willReturn($payment); + + $payment->setDetails([])->shouldBeCalled(); + $capture->setModel(new ArrayObject())->shouldBeCalled(); + + $this->execute($capture); + } +} diff --git a/src/Sylius/Bundle/PayumBundle/spec/Provider/PaymentDescriptionProviderSpec.php b/src/Sylius/Bundle/PayumBundle/spec/Provider/PaymentDescriptionProviderSpec.php new file mode 100644 index 00000000000..6ef4a3ef924 --- /dev/null +++ b/src/Sylius/Bundle/PayumBundle/spec/Provider/PaymentDescriptionProviderSpec.php @@ -0,0 +1,42 @@ + + */ +final class PaymentDescriptionProviderSpec extends ObjectBehavior +{ + function let(TranslatorInterface $translator) + { + $translator->transChoice('sylius.payum_action.payment.description', 2, [ + '%items%' => 2, + '%total%' => 100.00, + ])->willReturn('Payment contains 2 items for a total of 100'); + + $this->beConstructedWith($translator); + } + + function it_is_initializable() + { + $this->shouldHaveType(PaymentDescriptionProvider::class); + } + + function it_should_generate_a_description_string(PaymentInterface $payment, OrderInterface $order) + { + $order->getItems()->willReturn(new ArrayCollection([new OrderItem(), new OrderItem()])); + $order->getTotal()->willReturn(10000); + $payment->getOrder()->willReturn($order); + + $this->getPaymentDescription($payment)->shouldReturn('Payment contains 2 items for a total of 100'); + } +}