Es típico tener una relación Maestro -Detalle en una aplicación. En mi caso tengo un sistema de inventarios y necesito que el stock de productos se actualice a medida que existan entradas y salidas.
He visto en varias aplicaciones que es necesario correr algún proceso que actualice el inventario, pero en Symfony es más fácil de lo que creía.
Lo que hice fue crear un escucha de evento que este pendiente de las entradas y que a cada item dentro de la entrada, le actualice el stock.
Para este ejemplo llamaré a la clase EntranceProductListener y usaré el evento OnFlush de Doctrine para hacer todo el proceso. El resultado final de la clase luce como se muestra a continuación.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
namespace AppBundle\EventListener; use AppBundle\Entity\EntranceDetail; use AppBundle\Entity\Product; use Doctrine\ORM\Event\OnFlushEventArgs; class EntranceProductListener { public function onFlush(OnFlushEventArgs $args) { $em = $args->getEntityManager(); $uow = $em->getUnitOfWork(); foreach ($uow->getScheduledEntityInsertions() AS $entity) { if($entity instanceof EntranceDetail) { $product = $em->getRepository('AppBundle:Product')->find($entity->getProduct()->getId()); $stock = $entity->getProduct()->getStock(); $product->setStock($stock + $entity->getQuantity()); $em->persist($product); $classMetadata = $em->getClassMetadata(get_class($product)); $uow->recomputeSingleEntityChangeSet($classMetadata, $product); } } } } |