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