yaroslavbr
8/9/2016 - 10:08 AM

PaymentTransactionListener.php

<?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();
        }

    }


}