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');
+ }
+}