diff --git a/app/resources/views/contabilidad/cartolas/import.blade.php b/app/resources/views/contabilidad/cartolas/import.blade.php index 5532770..aba2459 100644 --- a/app/resources/views/contabilidad/cartolas/import.blade.php +++ b/app/resources/views/contabilidad/cartolas/import.blade.php @@ -30,6 +30,7 @@
Sigla | Fecha | Glosa | Cargo | @@ -65,21 +66,25 @@ get banco() { return $(`#${this.ids.banco}${this.props.index}`).dropdown('get value') } + get mes() { + return $(`#${this.ids.mes}${this.props.index}`).calendar('get date') + } get file() { return $(`#archivo${this.props.index}`)[0].files[0] } get data() { return { sociedad_rut: this.sociedad, - banco_id: this.banco, + cuenta_id: this.banco, + mes: [this.mes.getFullYear(), this.mes.getMonth() + 1, 1].join('-'), file: this.file, index: this.props.index } } - draw({sociedades, bancos}) { + draw({sociedades}) { const output = [ `||||
---|---|---|---|---|---|---|---|
${this.props.sociedad.sigla} | `, `${formatters.date.format(fecha)} | `, `${this.props.glosa} | `, `${formatters.number.format(this.props.cargo ?? 0)} | `, @@ -229,6 +259,14 @@ } } }, + fetch() { + return { + bancos: sociedad_rut => { + const url = `{{$urls->api}}/inmobiliaria/${sociedad_rut}/cuentas` + return fetchAPI(url) + } + } + }, import() { return { cartolas: () => { @@ -237,7 +275,8 @@ const body = new FormData() this.data.cartolas.forEach(cartola => { Object.entries(cartola.data).forEach(([key, value]) => { - body.append(key, value) + const name = `${key}[${cartola.props.index - 1}]` + body.append(name, value) }) }) @@ -290,6 +329,7 @@ cartolas: { sociedad: 'sociedad', banco: 'banco', + mes: 'mes', buttons: { remove: 'remove' } diff --git a/app/src/Controller/API/Contabilidad/Cartolas.php b/app/src/Controller/API/Contabilidad/Cartolas.php index b8ad3e0..bfe0d36 100644 --- a/app/src/Controller/API/Contabilidad/Cartolas.php +++ b/app/src/Controller/API/Contabilidad/Cartolas.php @@ -2,17 +2,14 @@ namespace Incoviba\Controller\API\Contabilidad; use DateTimeImmutable; +use Psr\Http\Message\ResponseInterface; +use Psr\Http\Message\ServerRequestInterface; use Incoviba\Common\Ideal\Controller; use Incoviba\Common\Implement\Exception\EmptyResult; use Incoviba\Controller\API\withJson; -use Incoviba\Model\Contabilidad\Banco; use Incoviba\Model\Inmobiliaria; use Incoviba\Repository; use Incoviba\Service; -use PhpParser\Node\Stmt\TryCatch; -use Psr\Http\Message\ResponseInterface; -use Psr\Http\Message\ServerRequestInterface; -use Psr\Log\LoggerInterface; class Cartolas extends Controller { @@ -33,7 +30,7 @@ class Cartolas extends Controller $banco = $bancoRepository->fetchById($body['banco']); $mes = new DateTimeImmutable($body['mes']); $file = $request->getUploadedFiles()['file']; - $output['movimientos'] = $cartolaService->process($inmobiliaria, $banco, $mes, $file); + $output['movimientos'] = $cartolaService->process($banco, $file); } catch (EmptyResult) {} return $this->withJson($response, $output); } @@ -100,9 +97,6 @@ class Cartolas extends Controller return $this->withJson($response, $output); } public function importar(ServerRequestInterface $request, ResponseInterface $response, - LoggerInterface $logger, - Repository\Inmobiliaria $inmobiliariaRepository, - Repository\Contabilidad\Banco $bancoRepository, Repository\Inmobiliaria\Cuenta $cuentaRepository, Service\Contabilidad\Cartola $cartolaService, Service\Contabilidad\Movimiento $movimientoService): ResponseInterface @@ -120,22 +114,26 @@ class Cartolas extends Controller continue; } try { - $inmobiliaria = $inmobiliariaRepository->fetchById($body['sociedad_rut'][$i]); - $banco = $bancoRepository->fetchById($body['banco_id'][$i]); - $movimientos = $cartolaService->process($inmobiliaria, $banco, new DateTimeImmutable($body['mes'][$i]), $file); - $cuenta = $cuentaRepository->fetchByInmobiliariaAndBanco($inmobiliaria->rut, $banco->id); + $cuenta = $cuentaRepository->fetchById($body['cuenta_id'][$i]); + $movimientos = $cartolaService->process($cuenta->banco, $file); $this->addMovimientos($movimientoService, $cuenta, $movimientos); - $output['movimientos'] = array_merge($output['movimientos'], $movimientos); + $inmobiliaria = $cuenta->inmobiliaria; + $output['movimientos'] = array_merge($output['movimientos'], array_map(function($movimiento) use ($inmobiliaria) { + $movimiento['sociedad'] = $inmobiliaria; + return $movimiento; + }, $movimientos)); } catch (EmptyResult) {} } } else { try { - $inmobiliaria = $inmobiliariaRepository->fetchById($body['sociedad_rut']); - $banco = $bancoRepository->fetchById($body['banco_id']); - $movimientos = $cartolaService->process($inmobiliaria, $banco, new DateTimeImmutable($body['mes']), $files['file']); - $cuenta = $cuentaRepository->fetchByInmobiliariaAndBanco($inmobiliaria->rut, $banco->id); + $cuenta = $cuentaRepository->fetchById($body['cuenta_id']); + $movimientos = $cartolaService->process($cuenta->banco, $files['file']); $this->addMovimientos($movimientoService, $cuenta, $movimientos); - $output['movimientos'] = $movimientos; + $inmobiliaria = $cuenta->inmobiliaria; + $output['movimientos'] = array_map(function($movimiento) use ($inmobiliaria) { + $movimiento['sociedad'] = $inmobiliaria; + return $movimiento; + }, $movimientos); } catch (EmptyResult) {} } return $this->withJson($response, $output); @@ -145,12 +143,14 @@ class Cartolas extends Controller { foreach ($movimientos as $dataMovimiento) { $dataMovimiento['cuenta_id'] = $cuenta->id; - $dataMovimiento['centro_costo_id'] = $dataMovimiento['centro_costo']; + if (array_key_exists('centro_costo', $dataMovimiento)) { + $dataMovimiento['centro_costo_id'] = $dataMovimiento['centro_costo']; + } $dataMovimiento['fecha'] = new DateTimeImmutable($dataMovimiento['fecha']); if (array_key_exists('rut', $dataMovimiento)) { list($rut, $digito) = explode('-', $dataMovimiento['rut']); - $dataMovimiento['rut'] = preg_replace('/\D+/', '', $rut); - $dataMovimiento['digito'] = $digito; + $dataMovimiento['rut'] = trim(preg_replace('/\D+/', '', $rut)); + $dataMovimiento['digito'] = trim($digito); } $movimientoService->add($dataMovimiento); } diff --git a/app/src/Service/Contabilidad/Cartola.php b/app/src/Service/Contabilidad/Cartola.php index cd19242..d13038e 100644 --- a/app/src/Service/Contabilidad/Cartola.php +++ b/app/src/Service/Contabilidad/Cartola.php @@ -31,7 +31,7 @@ class Cartola extends Service $this->bancos[$name] = $banco; return $this; } - public function process(Model\Inmobiliaria $inmobiliaria, Model\Contabilidad\Banco $banco, DateTimeInterface $mes, UploadedFileInterface $file): array + public function process(Model\Contabilidad\Banco $banco, UploadedFileInterface $file): array { return $this->bancos[strtolower($banco->nombre)]->process($file); } diff --git a/app/src/Service/Contabilidad/Cartola/Itau.php b/app/src/Service/Contabilidad/Cartola/Itau.php index 17bc111..d17d682 100644 --- a/app/src/Service/Contabilidad/Cartola/Itau.php +++ b/app/src/Service/Contabilidad/Cartola/Itau.php @@ -38,11 +38,13 @@ class Itau extends Banco } protected function getFilename(UploadedFileInterface $uploadedFile): string { - return '/tmp/cartola.xls'; + $ext = pathinfo($uploadedFile->getClientFilename(), PATHINFO_EXTENSION); + return "/tmp/cartola.{$ext}"; } protected function parseFile(string $filename): array { - $reader = PhpSpreadsheet\IOFactory::createReader('Xls'); + $ext = pathinfo($filename, PATHINFO_EXTENSION); + $reader = PhpSpreadsheet\IOFactory::createReader(ucwords($ext)); $xlsx = $reader->load($filename); $sheet = $xlsx->getActiveSheet(); @@ -145,6 +147,9 @@ class Itau extends Banco $value = $sheet->getCell("{$columnIndex}{$row->getRowIndex()}")->getCalculatedValue(); $mapped = $this->columnMap()[$column] ?? $column; if ($mapped === 'fecha') { + if ($value === '') { + continue; + } $value = PhpSpreadsheet\Shared\Date::excelToDateTimeObject($value, 'America/Santiago')->format('Y-m-d'); } if (in_array($mapped, ['abono', 'cargo', 'saldo'])) { @@ -154,7 +159,16 @@ class Itau extends Banco } $data []= $rowData; } - return $data; + // Remove empty rows + return array_filter($data, function($data) { + $empties = 0; + foreach ($data as $field) { + if ($field === '' or $field === null or $field === 0) { + $empties++; + } + } + return $empties < count($data) - 1; + }); } protected function identifySheet(PhpSpreadsheet\Worksheet\Worksheet $sheet): int