private function getNewsletterGroupsOfStudent(Estudiante $estudiante)
 {
     $toAddGroups = array();
     if ($estudiante->getActive()) {
         if ($estudiante->getEgresado()) {
             $newsLetterUserGroup = $this->em->getRepository('MaithNewsletterBundle:UserGroup')->findOneBy(array('name' => 'EGRESADOS'));
             if ($newsLetterUserGroup) {
                 $toAddGroups[$newsLetterUserGroup->getId()] = $newsLetterUserGroup;
             }
         } else {
             if ($estudiante->getAnioIngreso()) {
                 $today = new \DateTime();
                 if ($today->format('Y') <= $estudiante->getAnioIngreso()) {
                     $newsLetterUserGroup = $this->em->getRepository('MaithNewsletterBundle:UserGroup')->findOneBy(array('name' => 'Futuros'));
                     if ($newsLetterUserGroup) {
                         $toAddGroups[$newsLetterUserGroup->getId()] = $newsLetterUserGroup;
                     }
                 } else {
                     $newsLetterUserGroup = $this->em->getRepository('MaithNewsletterBundle:UserGroup')->findOneBy(array('name' => 'PADRES'));
                     if ($newsLetterUserGroup) {
                         $toAddGroups[$newsLetterUserGroup->getId()] = $newsLetterUserGroup;
                     }
                     if ($estudiante->getClase() && $estudiante->getHorario()) {
                         $newsLetterUserGroup = $this->em->getRepository('MaithNewsletterBundle:UserGroup')->findOneBy(array('name' => $estudiante->getClase()->getName() . ' (' . $estudiante->getHorario()->getName() . ')'));
                         $toAddGroups[$newsLetterUserGroup->getId()] = $newsLetterUserGroup;
                     }
                 }
             }
             foreach ($estudiante->getActividades() as $actividad) {
                 $toAddGroups[$actividad->getNewsLetterGroup()->getId()] = $actividad->getNewsLetterGroup();
             }
         }
     }
     return $toAddGroups;
 }
 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();
 }