<?php
namespace OroB2B\Bundle\OrderBundle\EventListener\ORM;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Event\OnFlushEventArgs;
use Doctrine\Common\Collections\ArrayCollection;
use OroB2B\Bundle\OrderBundle\Entity\Order;
use OroB2B\Bundle\PaymentBundle\Entity\PaymentStatus;
use OroB2B\Bundle\PaymentBundle\Entity\PaymentTransaction;
use OroB2B\Bundle\PaymentBundle\Event\TransactionPersistedEvent;
use OroB2B\Bundle\PaymentBundle\Provider\PaymentStatusProvider;
class PaymentTransactionListener
{
/** @var PaymentStatusProvider */
protected $statusProvider;
/** @var Order */
protected $order;
/** @var EntityManagerInterface */
protected $em;
/**
* PaymentTransactionListener constructor.
* @param PaymentStatusProvider $provider
* @param EntityManagerInterface $entityManager
*/
public function __construct(PaymentStatusProvider $provider, EntityManagerInterface $entityManager)
{
$this->statusProvider = $provider;
$this->em = $entityManager;
}
/**
* @param OnFlushEventArgs $args
*/
public function onFlush(OnFlushEventArgs $args)
{
$entityManager = $args->getEntityManager();
$unitOfWork = $entityManager->getUnitOfWork();
$insertions = $unitOfWork->getScheduledEntityInsertions();
foreach ($insertions as $entity) {
if ($entity instanceof PaymentTransaction &&
$this->order && $this->order->getId() ==
$entity->getEntityIdentifier()) {
$transactions = new ArrayCollection($this->statusProvider->getSavedTransactions($entity));
$transactions->add($entity);
$paymentStatus = $this->statusProvider->computeActualStatus($entity, $transactions);
$paymentMethods = $this->statusProvider->getPaymentMethodsString($transactions);
$changeSet = [
'paymentStatus' => [null, $paymentStatus],
'paymentMethods' => [null, $paymentMethods],
];
$unitOfWork->scheduleExtraUpdate($this->order, $changeSet);
} elseif ($entity instanceof Order) {
$this->order = $entity;
}
}
}
/**
* @param TransactionPersistedEvent $event
*/
public function onTransactionPersisted(TransactionPersistedEvent $event)
{
$transaction = $event->getTransaction();
if ($transaction->getEntityClass() == Order::class) {
//$this->em->getRepository('OroB2BPaymentBundle:PaymentStatus');
$paymentStatus = new PaymentStatus();
$paymentStatus->setPaymentStatus('123');
$paymentStatus->setPaymentMethods('123');
$paymentStatus->setEntityClass($transaction->getEntityClass());
$paymentStatus->setEntityIdentifier($transaction->getEntityIdentifier());
$this->em->persist($paymentStatus);
$this->em->flush();
}
}
}