/** * {@inheritdoc} */ public function resolvePaymentState(OrderInterface $order) { $paymentState = PaymentInterface::STATE_NEW; if ($order->hasPayments()) { $payments = $order->getPayments(); $completedPaymentTotal = 0; foreach ($payments as $payment) { if (PaymentInterface::STATE_COMPLETED === $payment->getState()) { $completedPaymentTotal += $payment->getAmount(); } } if ($completedPaymentTotal >= $order->getTotal()) { // Payment is completed if we have received full amount. $paymentState = PaymentInterface::STATE_COMPLETED; } else { // Payment is processing if one of the payment is. if ($payments->exists(function ($key, $payment) { return in_array($payment->getState(), [PaymentInterface::STATE_PROCESSING, PaymentInterface::STATE_PENDING]); })) { $paymentState = PaymentInterface::STATE_PROCESSING; } } } $order->setPaymentState($paymentState); }
function it_marks_order_as_new_if_no_payment_is_in_process(OrderInterface $order) { $payment1 = new Payment(); $payment1->setAmount(6000); $payment1->setState(PaymentInterface::STATE_NEW); $payment2 = new Payment(); $payment2->setAmount(4000); $payment2->setState(PaymentInterface::STATE_NEW); $payments = new ArrayCollection(array($payment1, $payment2)); $order->hasPayments()->willReturn(true); $order->getPayments()->willReturn($payments); $order->getTotal()->willReturn(10000); $order->setPaymentState(PaymentInterface::STATE_NEW)->shouldBeCalled(); $this->resolvePaymentState($order); }