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 generateUserBill(Estudiante $estudiante, $month = null, $year = null, $ignorePaidAndCancel = false)
 {
     if ($month === null) {
         $month = date('n');
     }
     if ($year === null) {
         $year = date('Y');
     }
     if ($estudiante->getEgresado()) {
         $this->logger->addInfo(sprintf('The student %s has already left', $estudiante->getId()));
         return;
     }
     $factura = $this->em->getRepository('AppBundle:FacturaEstudiante')->retrieveFacturaOfEstudiantePerMonthAndYear($estudiante, $month, $year);
     if ($factura) {
         if (!$ignorePaidAndCancel) {
             if ($factura->getPago()) {
                 $this->logger->addInfo(sprintf('The student %s has the bill of %s/%s paid', $estudiante->getId(), $month, $year));
                 return;
             }
             if ($factura->getCancelado()) {
                 $this->logger->addInfo(sprintf('The student %s has the bill of %s/%s cancelled', $estudiante->getId(), $month, $year));
                 return;
             }
         }
     } else {
         $factura = new FacturaEstudiante();
     }
     if ($estudiante->getAnioIngreso() > date('Y')) {
         if ($factura->getId() > 0) {
             $this->em->remove($factura);
             $this->em->flush($factura);
         }
         $this->logger->addInfo(sprintf('The student %s starting year is %s. No bill generated', $estudiante->getId(), $estudiante->getAnioIngreso()));
         return;
     }
     $factura->setEstudiante($estudiante);
     $factura->setMonth($month);
     $factura->setTotal(0);
     $factura->setYear($year);
     $factura->setFechavencimiento(new \DateTime());
     $this->em->persist($factura);
     $total = 0;
     $listadoDetalles = array();
     if ($estudiante->getHorario() !== null) {
         $costoHorario = $this->getCostoOfHorario($estudiante->getHorario());
         $total = $costoHorario;
         $detalleMensualidad = new FacturaEstudianteDetalle();
         $detalleMensualidad->setAmount($costoHorario);
         $detalleMensualidad->setDescription('Mensualidad');
         $detalleMensualidad->setFactura($factura);
         $detalleMensualidad->setAutogenerated(true);
         $listadoDetalles[$detalleMensualidad->generateUniqueHash()] = $detalleMensualidad;
     }
     // Descuento de hermano
     $activeBrother = 0;
     foreach ($estudiante->getMyBrothers() as $brother) {
         if (!$brother->getEgresado()) {
             ++$activeBrother;
         }
     }
     $descuento = $this->em->getRepository('AppBundle:Descuento')->findOneBy(array('cantidadDeHermanos' => $activeBrother));
     if ($descuento && $descuento->getPorcentaje() > 0) {
         $amount = ceil($total * $descuento->getPorcentaje() / 100 * -1);
         $detalleDescuentoHermano = new FacturaEstudianteDetalle();
         $detalleDescuentoHermano->setAmount($amount);
         $detalleDescuentoHermano->setDescription('Descuento hermano');
         $detalleDescuentoHermano->setFactura($factura);
         $detalleDescuentoHermano->setAutogenerated(true);
         $listadoDetalles[$detalleDescuentoHermano->generateUniqueHash()] = $detalleDescuentoHermano;
         $total += $amount;
     }
     if ($estudiante->getDescuento() && $estudiante->getDescuento() > 0) {
         $amount = ceil($total * $estudiante->getDescuento() / 100 * -1);
         $detalleDescuento = new FacturaEstudianteDetalle();
         $detalleDescuento->setAmount($amount);
         $detalleDescuento->setDescription('Descuento usuario');
         $detalleDescuento->setFactura($factura);
         $detalleDescuento->setAutogenerated(true);
         $listadoDetalles[$detalleDescuento->generateUniqueHash()] = $detalleDescuento;
         $total += $amount;
     }
     foreach ($estudiante->getActividades() as $actividad) {
         $detalleActividad = new FacturaEstudianteDetalle();
         $detalleActividad->setAmount($actividad->getCosto());
         $detalleActividad->setDescription($actividad->getNombre());
         $detalleActividad->setFactura($factura);
         $detalleActividad->setAutogenerated(true);
         $listadoDetalles[$detalleActividad->generateUniqueHash()] = $detalleActividad;
         $total += $actividad->getCosto();
     }
     foreach ($factura->getFacturaDetalles() 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);
     }
     $factura->setTotal($total);
     $this->em->persist($factura);
     $this->em->flush();
 }