diff --git a/app/src/Controller/API/Contabilidad/Cartolas.php b/app/src/Controller/API/Contabilidad/Cartolas.php index bfe0d36..845c68f 100644 --- a/app/src/Controller/API/Contabilidad/Cartolas.php +++ b/app/src/Controller/API/Contabilidad/Cartolas.php @@ -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); - } - } } diff --git a/app/src/Service/Contabilidad/Cartola.php b/app/src/Service/Contabilidad/Cartola.php index d13038e..f733f00 100644 --- a/app/src/Service/Contabilidad/Cartola.php +++ b/app/src/Service/Contabilidad/Cartola.php @@ -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 {