4 Commits

7 changed files with 112 additions and 38 deletions

View File

@ -2,6 +2,7 @@
namespace Incoviba\Common\Define\Cartola;
use Psr\Http\Message\UploadedFileInterface;
use Incoviba\Exception\ServiceAction\Read;
interface Banco
{
@ -9,6 +10,7 @@ interface Banco
* Process bank movements for database inserts
* @param UploadedFileInterface $file
* @return array
* @throws Read
*/
public function process(UploadedFileInterface $file): array;

View File

@ -3,10 +3,16 @@ namespace Incoviba\Common\Ideal\Cartola;
use Incoviba\Common\Define;
use Incoviba\Common\Ideal\Service;
use Incoviba\Exception\ServiceAction\Read;
use Psr\Http\Message\UploadedFileInterface;
abstract class Banco extends Service implements Define\Cartola\Banco
{
/**
* @param UploadedFileInterface $file
* @return array
* @throws Read
*/
public function process(UploadedFileInterface $file): array
{
$filename = $this->processUploadedFile($file);
@ -40,6 +46,7 @@ abstract class Banco extends Service implements Define\Cartola\Banco
* Process the temp file from getFilename and remove it
* @param string $filename
* @return array
* @throws Read
*/
protected function processFile(string $filename): array
{
@ -88,6 +95,7 @@ abstract class Banco extends Service implements Define\Cartola\Banco
* Translate uploaded file data to database data
* @param string $filename
* @return array
* @throws Read
*/
abstract protected function parseFile(string $filename): array;
}

View File

@ -338,6 +338,7 @@
data.errors.forEach(errorData => {
console.error(errorData)
})
throw Error('Error al importar cartolas')
}
this.data.movimientos = data.movimientos.map(movimiento => new Movimiento(movimiento))
this.draw().movimientos()

View File

@ -2,6 +2,7 @@
namespace Incoviba\Controller\API\Contabilidad;
use DateTimeImmutable;
use Incoviba\Exception\ServiceAction\Read;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Incoviba\Common\Ideal\Controller;
@ -117,24 +118,21 @@ class Cartolas extends Controller
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 {
$output['movimientos'] = array_merge($output['movimientos'], $cartolaService->import($body['cuenta_id'][$i], $file));
} catch (EmptyResult) {}
}
} else {
$file = $files['file'];
if (!is_array($files['file'])) {
$files['file'] = [$files['file']];
$body['cuenta_id'] = [$body['cuenta_id']];
}
foreach ($files['file'] as $i => $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) {}
$output['errors'] []= ['filename' => $file->getClientFilename(), 'error' => $errors[$file->getError()]];
continue;
}
try {
$output['movimientos'] = array_merge($output['movimientos'], $cartolaService->import($body['cuenta_id'][$i], $file));
} catch (Read $exception) {
$output['errors'] []= ['filename' => $file->getClientFilename(),
'error' => ['message' => $exception->getMessage(), 'file' => $exception->getFile(),
'line' => $exception->getLine()]];
}
}
return $this->withJson($response, $output);

View File

@ -1,18 +1,21 @@
<?php
namespace Incoviba\Service\Contabilidad;
use DateMalformedStringException;
use PDOException;
use DateTimeImmutable;
use DateTimeInterface;
use Psr\Http\Message\StreamFactoryInterface;
use Psr\Http\Message\UploadedFileInterface;
use Psr\Log\LoggerInterface;
use PhpOffice\PhpSpreadsheet;
use Incoviba\Common\Define\Cartola\Banco;
use Incoviba\Common\Define\Contabilidad\Exporter;
use Incoviba\Common\Ideal\Service;
use Incoviba\Common\Implement\Exception;
use Incoviba\Exception\ServiceAction\Read;
use Incoviba\Model;
use Incoviba\Repository;
use Psr\Http\Message\StreamFactoryInterface;
use Psr\Http\Message\UploadedFileInterface;
use Psr\Log\LoggerInterface;
class Cartola extends Service
{
@ -32,6 +35,13 @@ class Cartola extends Service
$this->bancos[$name] = $banco;
return $this;
}
/**
* @param Model\Contabilidad\Banco $banco
* @param UploadedFileInterface $file
* @return array
* @throws Read
*/
public function process(Model\Contabilidad\Banco $banco, UploadedFileInterface $file): array
{
return $this->bancos[strtolower($banco->nombre)]->process($file);
@ -93,9 +103,19 @@ class Cartola extends Service
return compact('cartola', 'movimientos');
}
/**
* @param int $cuenta_id
* @param UploadedFileInterface $file
* @return array
* @throws Read
*/
public function import(int $cuenta_id, UploadedFileInterface $file): array
{
$cuenta = $this->cuentaRepository->fetchById($cuenta_id);
try {
$cuenta = $this->cuentaRepository->fetchById($cuenta_id);
} catch (Exception\EmptyResult $exception) {
throw new Read(__CLASS__, $exception);
}
$movimientos = $this->process($cuenta->banco, $file);
$inmobiliaria = $cuenta->inmobiliaria;
@ -106,15 +126,23 @@ class Cartola extends Service
if (array_key_exists('centro_costo', $dataMovimiento) and $dataMovimiento['centro_costo'] !== 0) {
$dataMovimiento['centro_costo_id'] = $dataMovimiento['centro_costo'];
}
$dataMovimiento['fecha'] = new DateTimeImmutable($dataMovimiento['fecha']);
try {
$dataMovimiento['fecha'] = new DateTimeImmutable($dataMovimiento['fecha']);
} catch (DateMalformedStringException) {
continue;
}
if (array_key_exists('rut', $dataMovimiento)) {
$ruts = $this->parseRut($dataMovimiento['rut']);
if (key_exists('rut', $ruts)) {
$dataMovimiento['rut'] = $ruts['rut'];
$dataMovimiento['digito'] = $ruts['digito'];
if ($dataMovimiento['rut'] === '') {
unset($dataMovimiento['rut']);
} else {
$dataMovimiento['rut'] = $ruts[0]['rut'];
$dataMovimiento['digito'] = $ruts[0]['digito'];
$ruts = $this->parseRut($dataMovimiento['rut']);
if (key_exists('rut', $ruts)) {
$dataMovimiento['rut'] = $ruts['rut'];
$dataMovimiento['digito'] = $ruts['digito'];
} else {
$dataMovimiento['rut'] = $ruts[0]['rut'];
$dataMovimiento['digito'] = $ruts[0]['digito'];
}
}
}
try {
@ -133,14 +161,28 @@ class Cartola extends Service
$fechas = array_unique(array_map(function($movimiento) {
return $movimiento['fecha']->format('Y-m-d');
}, $movimientos));
if (count($fechas) === 0) {
throw new Read(__CLASS__);
}
foreach ($fechas as $dia) {
try {
$this->cartolaRepository->fetchByCuentaAndFecha($cuenta->id, new DateTimeImmutable($dia));
$dayDate = new DateTimeImmutable($dia);
} catch (DateMalformedStringException) {
continue;
}
try {
$this->cartolaRepository->fetchByCuentaAndFecha($cuenta->id, $dayDate);
continue;
} catch (Exception\EmptyResult) {}
$movs = array_filter($movimientos, function($movimiento) use ($dia) {
return $movimiento['fecha'] === $dia;
return $movimiento['fecha']->format('Y-m-d') === $dia;
});
if (count($movs) === 0) {
continue;
}
$cargos = array_sum(array_map(function($movimiento) {
return $movimiento['cargo'];
}, $movs));
@ -153,11 +195,19 @@ class Cartola extends Service
'abonos' => $abonos,
'saldo' => $saldo
];
$this->buildCartola($cuenta, new DateTimeImmutable($dia), $cartolaData);
$this->buildCartola($cuenta, $dayDate, $cartolaData);
}
$startDate = new DateTimeImmutable(min($fechas));
$endDate = new DateTimeImmutable(max($fechas));
try {
$startDate = new DateTimeImmutable(min($fechas));
} catch (DateMalformedStringException $exception) {
throw new Read(__CLASS__, $exception);
}
try {
$endDate = new DateTimeImmutable(max($fechas));
} catch (DateMalformedStringException $exception) {
throw new Read(__CLASS__, $exception);
}
$movimientosFaltantes = $this->movimientoService->findMissing($cuenta, $addedMovimientos, $startDate, $endDate);
$movimientosObsoletos = [];
if (count($movimientosFaltantes) > 0) {

View File

@ -3,6 +3,7 @@ namespace Incoviba\Service\Contabilidad\Cartola;
use DateTimeImmutable;
use Incoviba\Common\Ideal\Cartola\Banco;
use Incoviba\Exception\ServiceAction\Read;
use PhpOffice\PhpSpreadsheet;
use Psr\Http\Message\UploadedFileInterface;
@ -10,8 +11,8 @@ class Itau extends Banco
{
use isExcel;
const CUENTA_CORRIENTE = 0;
const ULTIMOS_MOVIMIENTOS = 1;
const int CUENTA_CORRIENTE = 0;
const int ULTIMOS_MOVIMIENTOS = 1;
public function processMovimientosDiarios(array $movimientos): array
{
@ -44,6 +45,12 @@ class Itau extends Banco
$ext = pathinfo($uploadedFile->getClientFilename(), PATHINFO_EXTENSION);
return "/tmp/cartola.{$ext}";
}
/**
* @param string $filename
* @return array
* @throws Read
*/
protected function parseFile(string $filename): array
{
$ext = pathinfo($filename, PATHINFO_EXTENSION);
@ -62,7 +69,7 @@ class Itau extends Banco
break;
}
} catch (PhpSpreadsheet\Exception $exception) {
$this->logger->critical($exception);
throw new Read(__CLASS__, $exception);
}
return $data;
}
@ -166,6 +173,11 @@ class Itau extends Banco
});
}
/**
* @param PhpSpreadsheet\Worksheet\Worksheet $sheet
* @return int
* @throws PhpSpreadsheet\Exception
*/
protected function identifySheet(PhpSpreadsheet\Worksheet\Worksheet $sheet): int
{
foreach ($sheet->getRowIterator(1, 10) as $row) {
@ -177,7 +189,7 @@ class Itau extends Banco
return self::ULTIMOS_MOVIMIENTOS;
}
}
throw new PhpSpreadsheet\Exception();
throw new PhpSpreadsheet\Exception('Incorrect type of Worksheet');
}
protected function getDateRange(PhpSpreadsheet\Worksheet\Row $row): array
{

View File

@ -12,6 +12,9 @@ class MiIndicador implements Provider
public function __construct(protected ClientInterface $client) {}
/**
* @param string $money_symbol
* @param DateTimeInterface|null $dateTime
* @return float
* @throws EmptyResponse
*/
public function get(string $money_symbol, ?DateTimeInterface $dateTime = null): float
@ -33,7 +36,7 @@ class MiIndicador implements Provider
$body = $response->getBody();
$json = json_decode($body->getContents());
if (empty($json) or $json->codigo !== $money_symbol or count($json->serie) === 0) {
if (empty($json) or !isset($json->codigo) or !isset($json->serie) or $json->codigo !== $money_symbol or count($json->serie) === 0) {
throw new EmptyResponse($request_uri);
}
return $json->serie[0]->valor;