Move Cartola::import into the Service and added errors

This commit is contained in:
Juan Pablo Vial
2024-08-26 15:24:42 -04:00
parent 936830ae64
commit d9e27d5af7
2 changed files with 49 additions and 40 deletions

View File

@ -7,7 +7,6 @@ use Psr\Http\Message\ServerRequestInterface;
use Incoviba\Common\Ideal\Controller; use Incoviba\Common\Ideal\Controller;
use Incoviba\Common\Implement\Exception\EmptyResult; use Incoviba\Common\Implement\Exception\EmptyResult;
use Incoviba\Controller\API\withJson; use Incoviba\Controller\API\withJson;
use Incoviba\Model\Inmobiliaria;
use Incoviba\Repository; use Incoviba\Repository;
use Incoviba\Service; use Incoviba\Service;
@ -97,62 +96,47 @@ class Cartolas extends Controller
return $this->withJson($response, $output); return $this->withJson($response, $output);
} }
public function importar(ServerRequestInterface $request, ResponseInterface $response, public function importar(ServerRequestInterface $request, ResponseInterface $response,
Repository\Inmobiliaria\Cuenta $cuentaRepository, Service\Contabilidad\Cartola $cartolaService): ResponseInterface
Service\Contabilidad\Cartola $cartolaService,
Service\Contabilidad\Movimiento $movimientoService): ResponseInterface
{ {
$body = $request->getParsedBody(); $body = $request->getParsedBody();
$files = $request->getUploadedFiles(); $files = $request->getUploadedFiles();
$output = [ $output = [
'input' => $body, 'input' => $body,
'movimientos' => [] 'movimientos' => [],
'errors' => []
];
$errors = [
UPLOAD_ERR_OK => 'Ok',
UPLOAD_ERR_INI_SIZE => 'El archivo excede el tamaño máximo permitido',
UPLOAD_ERR_FORM_SIZE => 'El archivo excede el tamaño máximo permitido',
UPLOAD_ERR_PARTIAL => 'El archivo fue subido parcialmente',
UPLOAD_ERR_NO_FILE => 'No se subió ningún archivo',
UPLOAD_ERR_NO_TMP_DIR => 'Falta la carpeta temporal',
UPLOAD_ERR_CANT_WRITE => 'No se pudo escribir el archivo',
UPLOAD_ERR_EXTENSION => 'Una extensión de PHP detuvo la subida del archivo'
]; ];
if (is_array($files['file'])) { if (is_array($files['file'])) {
foreach ($files['file'] as $i => $file) { foreach ($files['file'] as $i => $file) {
if ($file->getError() !== UPLOAD_ERR_OK) { if ($file->getError() !== UPLOAD_ERR_OK) {
$output['errors'] []= ['filename' => $file->getClientFilename(), 'error' => $errors[$file->getError()]];
continue; continue;
} }
try { try {
$cuenta = $cuentaRepository->fetchById($body['cuenta_id'][$i]); $output['movimientos'] = array_merge($output['movimientos'], $cartolaService->import($body['cuenta_id'][$i], $file));
$movimientos = $cartolaService->process($cuenta->banco, $file);
$this->addMovimientos($movimientoService, $cuenta, $movimientos);
$inmobiliaria = $cuenta->inmobiliaria;
$output['movimientos'] = array_merge($output['movimientos'], array_map(function($movimiento) use ($inmobiliaria) {
$movimiento['sociedad'] = $inmobiliaria;
return $movimiento;
}, $movimientos));
} catch (EmptyResult) {} } catch (EmptyResult) {}
} }
} else { } else {
try { $file = $files['file'];
$cuenta = $cuentaRepository->fetchById($body['cuenta_id']); if ($file->getError() !== UPLOAD_ERR_OK) {
$movimientos = $cartolaService->process($cuenta->banco, $files['file']); $output['errors'][] = ['filename' => $file->getClientFilename(), 'error' => $errors[$file->getError()]];
$this->addMovimientos($movimientoService, $cuenta, $movimientos); } else {
$inmobiliaria = $cuenta->inmobiliaria; try {
$output['movimientos'] = array_map(function($movimiento) use ($inmobiliaria) { $output['movimientos'] = $cartolaService->import($body['cuenta_id'], $file);
$movimiento['sociedad'] = $inmobiliaria; } catch (EmptyResult) {}
return $movimiento; }
}, $movimientos);
} catch (EmptyResult) {}
} }
return $this->withJson($response, $output); return $this->withJson($response, $output);
} }
protected function addMovimientos(Service\Contabilidad\Movimiento $movimientoService, Inmobiliaria\Cuenta $cuenta, array $movimientos): void
{
foreach ($movimientos as $dataMovimiento) {
$dataMovimiento['cuenta_id'] = $cuenta->id;
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'] = trim(preg_replace('/\D+/', '', $rut));
$dataMovimiento['digito'] = trim($digito);
}
$movimientoService->add($dataMovimiento);
}
}
} }

View File

@ -91,6 +91,31 @@ class Cartola extends Service
$cartola = $this->buildCartola($cuenta, $fecha, $cartolaData); $cartola = $this->buildCartola($cuenta, $fecha, $cartolaData);
return compact('cartola', 'movimientos'); return compact('cartola', 'movimientos');
} }
public function import(int $cuenta_id, UploadedFileInterface $file): array
{
$cuenta = $this->cuentaRepository->fetchById($cuenta_id);
$movimientos = $this->process($cuenta->banco, $file);
foreach ($movimientos as $dataMovimiento) {
$dataMovimiento['cuenta_id'] = $cuenta->id;
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'] = trim(preg_replace('/\D+/', '', $rut));
$dataMovimiento['digito'] = trim($digito);
}
$this->movimientoService->add($dataMovimiento);
}
$inmobiliaria = $cuenta->inmobiliaria;
return array_map(function($movimiento) use ($inmobiliaria) {
$movimiento['sociedad'] = $inmobiliaria;
return $movimiento;
}, $movimientos);
}
protected function getMovimientosDiarios(Model\Contabilidad\Banco $banco, UploadedFileInterface $file): array protected function getMovimientosDiarios(Model\Contabilidad\Banco $banco, UploadedFileInterface $file): array
{ {