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\Implement\Exception\EmptyResult;
use Incoviba\Controller\API\withJson;
use Incoviba\Model\Inmobiliaria;
use Incoviba\Repository;
use Incoviba\Service;
@ -97,62 +96,47 @@ class Cartolas extends Controller
return $this->withJson($response, $output);
}
public function importar(ServerRequestInterface $request, ResponseInterface $response,
Repository\Inmobiliaria\Cuenta $cuentaRepository,
Service\Contabilidad\Cartola $cartolaService,
Service\Contabilidad\Movimiento $movimientoService): ResponseInterface
Service\Contabilidad\Cartola $cartolaService): ResponseInterface
{
$body = $request->getParsedBody();
$files = $request->getUploadedFiles();
$output = [
'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'])) {
foreach ($files['file'] as $i => $file) {
if ($file->getError() !== UPLOAD_ERR_OK) {
$output['errors'] []= ['filename' => $file->getClientFilename(), 'error' => $errors[$file->getError()]];
continue;
}
try {
$cuenta = $cuentaRepository->fetchById($body['cuenta_id'][$i]);
$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));
$output['movimientos'] = array_merge($output['movimientos'], $cartolaService->import($body['cuenta_id'][$i], $file));
} catch (EmptyResult) {}
}
} else {
try {
$cuenta = $cuentaRepository->fetchById($body['cuenta_id']);
$movimientos = $cartolaService->process($cuenta->banco, $files['file']);
$this->addMovimientos($movimientoService, $cuenta, $movimientos);
$inmobiliaria = $cuenta->inmobiliaria;
$output['movimientos'] = array_map(function($movimiento) use ($inmobiliaria) {
$movimiento['sociedad'] = $inmobiliaria;
return $movimiento;
}, $movimientos);
} catch (EmptyResult) {}
$file = $files['file'];
if ($file->getError() !== UPLOAD_ERR_OK) {
$output['errors'][] = ['filename' => $file->getClientFilename(), 'error' => $errors[$file->getError()]];
} else {
try {
$output['movimientos'] = $cartolaService->import($body['cuenta_id'], $file);
} catch (EmptyResult) {}
}
}
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);
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
{