public function load(ObjectManager $manager)
 {
     $sqlFacturaUsuario = 'select id, usuario_id, total, month, year, enviado, pago, cancelado, fechavencimiento from facturaUsuario order by  usuario_id ASC , year ASC , MONTH ASC';
     $sqlFacturaUsuarioDetalle = 'select id, factura_id, description, amount from facturaUsuarioDetalle where factura_id = ?';
     $sqlFacturaFinal = 'select id, total, month, year, pago, cancelado, enviado, cuenta_id, fechavencimiento, pagadodeltotal from facturaFinal where id in (select factura_final_id from facturausuariofinal where factura_usuario_id = ?)';
     $sqlFacturaFinalDetalle = 'select id, factura_id, description, amount from facturaFinalDetalle where factura_id = ?';
     $username = DataFixturesConstants::DBUSER;
     $password = DataFixturesConstants::DBPASS;
     $database = DataFixturesConstants::DBSCHEMA;
     return;
     $conn = new \PDO(sprintf('mysql:host=localhost;dbname=%s', $database), $username, $password, array(\PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));
     $stmt = $conn->prepare($sqlFacturaUsuario);
     $stmt->execute();
     $stmtUsuarioDetalle = $conn->prepare($sqlFacturaUsuarioDetalle);
     $stmtFactura = $conn->prepare($sqlFacturaFinal);
     $stmtFacturaDetalle = $conn->prepare($sqlFacturaFinalDetalle);
     $metadata = $manager->getClassMetaData(get_class(new FacturaEstudiante()));
     $metadata->setIdGeneratorType(\Doctrine\ORM\Mapping\ClassMetadata::GENERATOR_TYPE_NONE);
     $metadataDetalle = $manager->getClassMetaData(get_class(new FacturaEstudianteDetalle()));
     $metadataDetalle->setIdGeneratorType(\Doctrine\ORM\Mapping\ClassMetadata::GENERATOR_TYPE_NONE);
     $metadataFactura = $manager->getClassMetaData(get_class(new FacturaFinal()));
     $metadataFactura->setIdGeneratorType(\Doctrine\ORM\Mapping\ClassMetadata::GENERATOR_TYPE_NONE);
     $metadataFacturaDetalle = $manager->getClassMetaData(get_class(new FacturaFinalDetalle()));
     $metadataFacturaDetalle->setIdGeneratorType(\Doctrine\ORM\Mapping\ClassMetadata::GENERATOR_TYPE_NONE);
     $facturasList = array();
     while ($row = $stmt->fetch()) {
         // Adding cobro
         $facturaUsuario = new FacturaEstudiante();
         $facturaUsuario->setId($row['id']);
         $fechavencimiento = $row['fechavencimiento'];
         if ($fechavencimiento) {
             $facturaUsuario->setFechavencimiento(new \DateTime($fechavencimiento));
         }
         $facturaUsuario->setCancelado($row['cancelado']);
         $facturaUsuario->setEnviado($row['enviado']);
         $facturaUsuario->setMonth($row['month']);
         $facturaUsuario->setPago($row['pago']);
         $facturaUsuario->setTotal($row['total']);
         $facturaUsuario->setYear($row['year']);
         $facturaUsuario->setEstudiante($manager->getRepository('AppBundle:Estudiante')->find($row['usuario_id']));
         $manager->persist($facturaUsuario);
         $stmtUsuarioDetalle->execute(array($row['id']));
         while ($rowUsuarioDetalle = $stmtUsuarioDetalle->fetch()) {
             $usuarioDetalle = new FacturaEstudianteDetalle();
             $usuarioDetalle->setId($rowUsuarioDetalle['id']);
             $usuarioDetalle->setAmount($rowUsuarioDetalle['amount']);
             $usuarioDetalle->setDescription($rowUsuarioDetalle['description']);
             $usuarioDetalle->setFactura($facturaUsuario);
             $manager->persist($usuarioDetalle);
         }
         $stmtFactura->execute(array($row['id']));
         while ($rowFactura = $stmtFactura->fetch()) {
             if (!isset($facturasList[$rowFactura['id']])) {
                 $facturaFinal = new FacturaFinal();
                 $facturaFinal->setCancelado($rowFactura['cancelado']);
                 $facturaFinal->setCuenta($manager->getRepository('AppBundle:Cuenta')->find($rowFactura['cuenta_id']));
                 $facturaFinal->setEnviado($rowFactura['enviado']);
                 $fechavencimiento = $rowFactura['fechavencimiento'];
                 if ($fechavencimiento) {
                     $facturaFinal->setFechavencimiento(new \DateTime($fechavencimiento));
                 }
                 $facturaFinal->setId($rowFactura['id']);
                 $facturaFinal->setMonth($rowFactura['month']);
                 $facturaFinal->setPagadodeltotal($rowFactura['pagadodeltotal']);
                 $facturaFinal->setPago($rowFactura['pago']);
                 $facturaFinal->setTotal($rowFactura['total']);
                 $facturaFinal->setYear($rowFactura['year']);
                 $manager->persist($facturaFinal);
                 $facturasList[$rowFactura['id']] = $facturaFinal;
                 $stmtFacturaDetalle->execute(array($rowFactura['id']));
                 while ($rowDetalle = $stmtFacturaDetalle->fetch()) {
                     $facturaFinalDetalle = new FacturaFinalDetalle();
                     $facturaFinalDetalle->setAmount($rowDetalle['amount']);
                     $facturaFinalDetalle->setDescription($rowDetalle['description']);
                     $facturaFinalDetalle->setFactura($facturaFinal);
                     $facturaFinalDetalle->setId($rowDetalle['id']);
                     $manager->persist($facturaFinalDetalle);
                 }
             } else {
                 $facturaFinal = $facturasList[$rowFactura['id']];
             }
             $facturaUsuario->setFacturaFinal($facturaFinal);
         }
         $manager->persist($facturaUsuario);
     }
     $manager->flush();
 }
 public function generateFinalBill(Cuenta $cuenta, $month = null, $year = null, $ignorePaidAndCancel = false)
 {
     if ($month === null) {
         $month = date('n');
     }
     if ($year === null) {
         $year = date('Y');
     }
     $factura = $this->em->getRepository('AppBundle:FacturaFinal')->retrieveFacturaFinalOfAccountPerMonthAndYear($cuenta, $month, $year);
     $pagoDelTotal = 0;
     if ($factura) {
         if (!$ignorePaidAndCancel) {
             if ($factura->getPago()) {
                 $this->logger->addInfo(sprintf('The account %s has the bill of %s/%s paid', $cuenta->getId(), $month, $year));
                 return $factura;
             }
             if ($factura->getCancelado()) {
                 $this->logger->addInfo(sprintf('The account %s has the bill of %s/%s cancelled', $cuenta->getId(), $month, $year));
                 return $factura;
             }
         }
         $pagoDelTotal = $factura->getPagadodeltotal();
         $this->logger->addInfo(sprintf('The account %s has the bill of %s/%s resting to debt. Debt: %s , bill old total: %s. ZZZAAA', $cuenta->getId(), $month, $year, $cuenta->getDebe(), $factura->getTotal()));
         $cuenta->setDebe($cuenta->getDebe() - $factura->getTotal());
     } else {
         $factura = new FacturaFinal();
         $factura->setCuenta($cuenta);
     }
     $total = 0;
     $factura->setTotal($total);
     $factura->setFechavencimiento(new \DateTime());
     $factura->setPagadodeltotal($pagoDelTotal);
     $factura->setMonth($month);
     $factura->setYear($year);
     $this->em->persist($factura);
     $facturasEstudiantes = $this->em->getRepository('AppBundle:FacturaEstudiante')->retrieveFacturaOfEstudiantePerAccountMonthAndYear($cuenta, $month, $year);
     $studentsQuantity = count($facturasEstudiantes);
     $listadoDetalles = array();
     foreach ($facturasEstudiantes as $facturaEstudiante) {
         $this->em->refresh($facturaEstudiante);
         foreach ($facturaEstudiante->getFacturaDetalles() as $detalle) {
             $facturaFinalDetalle = new FacturaFinalDetalle();
             $facturaFinalDetalle->setAmount($detalle->getAmount());
             $facturaFinalDetalle->setFactura($factura);
             $total += $detalle->getAmount();
             $descripcion = '';
             if ($studentsQuantity > 1) {
                 $descripcion = sprintf('[%s] %s', $facturaEstudiante->getEstudiante()->getNombre(), $detalle->getDescription());
             } else {
                 $descripcion = $detalle->getDescription();
             }
             $facturaFinalDetalle->setDescription($descripcion);
             $listadoDetalles[] = $facturaFinalDetalle;
         }
         $facturaEstudiante->setFacturaFinal($factura);
         $this->em->persist($facturaEstudiante);
     }
     foreach ($factura->getFacturaFinalDetalles() as $detalle) {
         if (count($listadoDetalles) > 0) {
             $auxDetalle = array_pop($listadoDetalles);
             $detalle->setAmount($auxDetalle->getAmount());
             $detalle->setDescription($auxDetalle->getDescription());
             $this->em->persist($detalle);
         } else {
             $this->em->remove($detalle);
         }
     }
     foreach ($listadoDetalles as $detalle) {
         $this->em->persist($detalle);
     }
     if ($total > 0 && $total <= $pagoDelTotal) {
         $factura->setPago(true);
     }
     $factura->setTotal($total);
     $this->em->persist($factura);
     $cuenta->setDebe($cuenta->getDebe() + $factura->getTotal());
     $this->em->persist($cuenta);
     $this->em->flush();
     return $factura;
 }