From 6a5efba272d0dd15bd1ded75f387bce9b47d47a2 Mon Sep 17 00:00:00 2001 From: Juan Pablo Vial Date: Mon, 7 Mar 2022 16:36:21 -0300 Subject: [PATCH] Informe de Contabilidad Resumen --- app/Controller/Informes.php | 10 +- app/Service/Informe/Contabilidad/Resumen.php | 155 +++++++++++++++++++ 2 files changed, 164 insertions(+), 1 deletion(-) create mode 100644 app/Service/Informe/Contabilidad/Resumen.php diff --git a/app/Controller/Informes.php b/app/Controller/Informes.php index 67cb000..43862a2 100644 --- a/app/Controller/Informes.php +++ b/app/Controller/Informes.php @@ -1,10 +1,12 @@ findOne($id); $fecha = get('fecha'); + + $service = new Resumen(); + $service->build($id, new \DateTimeImmutable($fecha)); + + return; + + $proyecto = model(Proyecto::class)->findOne($id); $mes = null; if ($fecha != null) { $mes = Carbon::parse($fecha)->addMonths(1)->subDays(1); diff --git a/app/Service/Informe/Contabilidad/Resumen.php b/app/Service/Informe/Contabilidad/Resumen.php new file mode 100644 index 0000000..cad97df --- /dev/null +++ b/app/Service/Informe/Contabilidad/Resumen.php @@ -0,0 +1,155 @@ +separator = $separator; + } + + protected function getVentas($id_proyecto) + { + $proyecto = model(Proyecto::class)->findOne($id_proyecto); + return $proyecto->ventas(); + } + protected function startOfYear(DateTimeInterface $up_to) + { + return new DateTimeImmutable(DateTimeImmutable::createFromInterface($up_to)->format('1-1-Y')); + } + protected function defaultValueDate(DateTimeInterface $up_to) + { + return (object) ['fecha' => $this->startOfYear($up_to), 'valor' => 0]; + } + protected function extractValueDate(Pago $pago) + { + return (object) ['fecha' => $pago->fecha(), 'valor' => $pago->valor]; + } + protected function getAnticipos(Venta $venta, DateTimeInterface $up_to) + { + $cuotas = $venta->pie()->cuotas('fecha', $up_to); + $ly = $this->startOfYear($up_to); + $older = array_reduce($cuotas, function($sum, $item) use ($ly) { + if ($item->pago()->estado()->tipo()->active != 1) { + return $sum; + } + if ($item->pago()->fecha() >= $ly) { + return $sum; + } + return $sum + $item->pago()->valor; + }); + $current = array_map([$this, 'extractValueDate'], array_filter($cuotas, function($item) use ($ly) { + return $item->pago()->fecha() >= $ly; + })); + return array_merge([(object) ['fecha' => $ly, 'valor' => $older]], $current); + } + protected function getReajuste(Venta $venta, DateTimeInterface $up_to) + { + if ($venta->pie()->reajuste == null) { + return $this->defaultValueDate($up_to); + } + return $this->extractValueDate($venta->pie()->reajuste()); + } + protected function getAbono(Venta $venta, DateTimeInterface $up_to) + { + if ($venta->escritura == null) { + return $this->defaultValueDate($up_to); + } + return $this->extractValueDate($venta->escritura()->pago()); + } + protected function getBono(Venta $venta, DateTimeInterface $up_to) + { + if ($venta->bono_pie == null) { + return $this->defaultValueDate($up_to); + } + return $this->extractValueDate($venta->bonoPie()->pago()); + } + protected function getCredito(Venta $venta, DateTimeInterface $up_to) + { + if ($venta->credito == null) { + return $this->defaultValueDate($up_to); + } + return $this->extractValueDate($venta->credito()->pago()); + } + protected function getSubsidio(Venta $venta, DateTimeInterface $up_to) + { + if ($venta->subsidio == null) { + return $this->defaultValueDate($up_to); + } + return [$this->extractValueDate($venta->subsidio()->pago()), $this->extractValueDate($venta->subsidio()->subsidio())]; + } + protected function getPagos(Venta $venta, DateTimeInterface $up_to) + { + $pagos = []; + $pagos = array_merge($pagos, $this->getAnticipos($venta, $up_to)); + $pagos []= $this->getReajuste($venta, $up_to); + $pagos []= $this->getAbono($venta, $up_to); + $pagos []= $this->getBono($venta, $up_to); + $pagos []= $this->getCredito($venta, $up_to); + $pagos = array_merge($pagos, $this->getSubsidio($venta, $up_to)); + return array_filter($pagos, function($item) { + return $item->valor != 0; + }); + } + + protected function formatValue(float $value) + { + return number_format($value, 0, ',', '.'); + } + protected function buildLibro(Venta $venta, DateTimeInterface $up_to) + { + $pagos = $this->getPagos($venta, $up_to); + $output = ["Cuenta: Anticipos Dpto {$venta->unidad()->descripcion}"]; + $debe = 0; + $haber = 0; + foreach ($pagos as $pago) { + if ($pago->valor > 0) { + $output []= implode($this->separator, [$pago->fecha->format('d/m/Y'), $this->formatValue($pago->valor), '']); + $debe += $pago->valor; + } + else { + $output []= implode($this->separator, [$pago->fecha->format('d/m/Y'), '', $this->formatValue(-$pago->valor)]); + $haber -= $pago->valor; + } + } + $output []= implode($this->separator, ['', $debe, $haber]); + return $output; + } + + public function build(int $id_proyecto, DateTimeInterface $up_to) + { + $ventas = $this->getVentas($id_proyecto); + + + $output = []; + foreach ($ventas as $venta) { + $output = array_merge($output, $this->buildLibro($venta, $up_to), []); + } + + $filename = "Contabilidad - Resumen - {$venta->proyecto()->descripcion} - {$up_to->format('Y-m-d')}.csv"; + + header("Content-Type: text/csv; charset=utf-8"); + header('Content-Disposition: attachment; filename="' . $filename . '"'); + header('Cache-Control: max-age=0'); + + file_put_contents('php://output', implode(PHP_EOL, $output)); + } +}