Files
oficial/app/src/Service/Contabilidad/Exporter/Nubox.php
2024-01-17 10:33:11 -03:00

116 lines
4.7 KiB
PHP

<?php
namespace Incoviba\Service\Contabilidad\Exporter;
use DateTimeImmutable;
use DateTimeInterface;
use Incoviba\Common\Define\Contabilidad\Exporter;
use Incoviba\Model;
use Incoviba\Repository;
use PhpOffice\PhpSpreadsheet;
class Nubox implements Exporter
{
public function __construct(protected Repository\CentroCosto $centroCostoRepository, protected string $uploadFolder) {}
public function export(Model\Inmobiliaria $inmobiliaria, Model\Banco $banco, DateTimeInterface $mes, array $movimientos): string
{
PhpSpreadsheet\Settings::setLocale('es-CL');
$workbook = new PhpSpreadsheet\Spreadsheet();
$sheet = $workbook->getActiveSheet();
$rowIndex = $this->buildHeaders($sheet);
foreach ($movimientos as $movimiento) {
$tipoCentro = '';
$cuenta = '';
$centro = '';
if ($movimiento->centro_costo !== '') {
$centroCosto = $this->centroCostoRepository->fetchById($movimiento->centro_costo);
$tipoCentro = substr($centroCosto->tipoCentro->descripcion, 0, 1);
$cuenta = $centroCosto->cuentaContable;
$centro = $centroCosto->id;
}
$fecha = (new DateTimeImmutable($movimiento->fecha))->format('d/m/Y');
$rowIndex = $this->add($sheet, [
'Número' => '0',
'Tipo' => $tipoCentro,
'Fecha' => $fecha,
'Glosa' => $movimiento->detalle,
'Cuenta Detalle' => $cuenta,
'Glosa Detalle' => '',
'Centro Costo' => $centro,
'Sucursal' => '',
'Debe' => $movimiento->abono === 0 ? '' : $movimiento->abono,
'Haber' => $movimiento->cargo === 0 ? '' : $movimiento->cargo,
'Tipo Auxiliar' => 'B',
'A: Rut Cliente-Proveedor/H: Rut Prestador' => '',
'A: Razon Social/B: Descripción Movimiento Bancario/ H: Nombre Prestador' => $movimiento->glosa,
'A: Tipo De Documento/H: Tipo De Boleta Honorario' => '',
'A: Folio /B: Numero Documento/H: Folio Boleta' => $movimiento->documento,
'A/B/H: Monto' => ($movimiento->abono === 0) ? $movimiento->cargo : $movimiento->abono,
'A: Fecha Vencimiento /B: Fecha /H: Fecha Emisión (DD/MM/AAAA)' => $fecha
], $rowIndex);
}
$sheet->getStyle("I1:J{$rowIndex}")->getNumberFormat()
->setFormatCode('#,##0');
$sheet->getStyle("O1:O{$rowIndex}")->getNumberFormat()
->setFormatCode('##0');
$sheet->getStyle("P1:P{$rowIndex}")->getNumberFormat()
->setFormatCode('#,##0');
foreach (range('A', 'Q') as $col) {
$sheet->getColumnDimension($col)->setAutoSize(true);
}
$sheet->getSheetView()->setZoomScale(90);
$writer = PhpSpreadsheet\IOFactory::createWriter($workbook, 'Xlsx');
$filename = "Cartola {$banco->nombre} - {$inmobiliaria->abreviacion} - {$mes->format('M Y')}.xlsx";
$writer->save(implode(DIRECTORY_SEPARATOR, [
$this->uploadFolder,
$filename
]));
return $filename;
}
protected function getHeaders(): array
{
return [
'Número',
'Tipo',
'Fecha',
'Glosa',
'Cuenta Detalle',
'Glosa Detalle',
'Centro Costo',
'Sucursal',
'Debe',
'Haber',
'Tipo Auxiliar',
'A: Rut Cliente-Proveedor/H: Rut Prestador',
'A: Razon Social/B: Descripción Movimiento Bancario/ H: Nombre Prestador',
'A: Tipo De Documento/H: Tipo De Boleta Honorario',
'A: Folio /B: Numero Documento/H: Folio Boleta',
'A/B/H: Monto',
'A: Fecha Vencimiento /B: Fecha /H: Fecha Emisión (DD/MM/AAAA)'
];
}
protected function buildHeaders(PhpSpreadsheet\Worksheet\Worksheet &$sheet, int $rowIndex = 1): int
{
$map = $this->getHeaders();
foreach ($map as $index => $header) {
$columnIndex = $index + 1;
$sheet->getCell([$columnIndex, $rowIndex])->setValue($header);
}
return $rowIndex + 1;
}
protected function add(PhpSpreadsheet\Worksheet\Worksheet &$sheet, array $row, int $rowIndex): int
{
$headers = $this->getHeaders();
foreach ($headers as $index => $header) {
$columnIndex = $index + 1;
$sheet->getCell([$columnIndex, $rowIndex])->setValue($row[$header]);
$sheet->getCell([$columnIndex, $rowIndex + 1])->setValue(($header === 'Tipo Auxiliar') ? 'A' : '');
}
return $rowIndex + 2;
}
}