separator = $separator; } protected function getVentas($id_proyecto) { $proyecto = model(Proyecto::class)->findOne($id_proyecto); $ventas = $proyecto->ventas(); $output = []; foreach ($ventas as $venta) { $found = false; foreach ($output as $v) { if ($v->unidad()->descripcion == $venta->unidad()->descripcion) { $found = true; break; } } if (!$found) { $output []= $venta; } } return $output; } protected function startOfYear(DateTimeInterface $up_to) { return new DateTimeImmutable((clone $up_to)->sub(new DateInterval('P1Y'))->format('31-12-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) { if ($venta->pie == 0) { return [$this->defaultValueDate($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_filter($cuotas, function($item) use ($ly) { return $item->pago()->fecha() >= $ly; }); foreach ($current as &$item) { $item = $this->extractValueDate($item->pago()); } return array_merge([(object) ['fecha' => $ly, 'valor' => $older]], $current); } protected function getReajuste(Venta $venta, DateTimeInterface $up_to) { if ($venta->pie == 0 or $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 == 0) { return $this->defaultValueDate($up_to); } return $this->extractValueDate($venta->escritura()->pago()); } protected function getBono(Venta $venta, DateTimeInterface $up_to) { if ($venta->bono_pie == 0) { return $this->defaultValueDate($up_to); } return $this->extractValueDate($venta->bonoPie()->pago()); } protected function getCredito(Venta $venta, DateTimeInterface $up_to) { if ($venta->credito == 0) { return [$this->defaultValueDate($up_to), $this->defaultValueDate($up_to)]; } return $this->extractValueDate($venta->credito()->pago()); } protected function getSubsidio(Venta $venta, DateTimeInterface $up_to) { if ($venta->subsidio == 0) { return [$this->defaultValueDate($up_to), $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 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 []= ['', $pago->fecha->format('d/m/Y'), '', $pago->valor]; $debe += $pago->valor; } else { $output []= ['', $pago->fecha->format('d/m/Y'), -$pago->valor, '']; $haber -= $pago->valor; } } $output []= ['', '', $haber, $debe]; return $output; } public function build(int $id_proyecto, DateTimeInterface $up_to) { $ventas = $this->getVentas($id_proyecto); $output = ["Libro Mayor {$ventas[0]->proyecto()->descripcion}", '']; foreach ($ventas as $venta) { $output = array_merge($output, $this->buildLibro($venta, $up_to), [''], ['']); } $filename = "Contabilidad - Resumen - {$ventas[0]->proyecto()->descripcion} - {$up_to->format('Y-m-d')}.xlsx"; $informe = new Informe(); $informe->createSpreadsheet() ->addArray($output) ->formatColumn('C') ->formatColumn('D') ->send($filename); return; 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)); } }