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