diff --git a/app/src/Service/Cartola.php b/app/src/Service/Cartola.php index 295ca89..e870f53 100644 --- a/app/src/Service/Cartola.php +++ b/app/src/Service/Cartola.php @@ -36,46 +36,71 @@ class Cartola { $cuenta = $this->cuentaRepository->fetchByInmobiliariaAndBanco($inmobiliaria->rut, $banco->id); - $ms = $this->bancos[strtolower($banco->nombre)]->process($file); - $ms = array_reverse($ms); - $c = array_shift($ms); - $cargos = 0; - $abonos = 0; - $saldo = $c['saldo']; + $ms = $this->getMovimientosDiarios($banco, $file); + $cartolaData = [ + 'cargos' => 0, + 'abonos' => 0, + 'saldo' => 0 + ]; $movimientos = []; foreach ($ms as $m) { - $m['cuenta_id'] = $cuenta->id; - try { - $movimiento = $this->movimientoRepository - ->fetchByCuentaAndFechaAndMonto( - $cuenta->id, - new DateTimeImmutable($m['fecha']), - $m['cargo'] ?? $m['abono'] - ); - } catch (Exception\EmptyResult) { - $movimiento = $this->movimientoRepository->create($m); - $movimiento = $this->movimientoRepository->save($movimiento); - } + $movimiento = $this->buildMovimiento($cuenta, $m); $movimientos []= $movimiento; + if ($movimiento->fecha === $fecha) { - $cargos += $movimiento->cargo; - $abonos += $movimiento->abono; + $cartolaData['cargos'] += $movimiento->cargo; + $cartolaData['abonos'] += $movimiento->abono; } - $saldo = $m['saldo']; - } - try { - $cartola = $this->cartolaRepository->fetchByCuentaAndFecha($cuenta->id, $fecha); - } catch (Exception\EmptyResult) { - $cartola = $this->cartolaRepository->create([ - 'cuenta_id' => $cuenta->id, - 'fecha' => $fecha->format('Y-m-d'), - 'cargos' => $cargos, - 'abonos' => $abonos, - 'saldo' => $saldo - ]); - $cartola = $this->cartolaRepository->save($cartola); + $cartolaData['saldo'] = $movimiento->saldo; } + $cartola = $this->buildCartola($cuenta, $fecha, $cartolaData); return compact('cartola', 'movimientos'); } + + protected function getMovimientosDiarios(Model\Banco $banco, UploadedFileInterface $file): array + { + $movimientos = $this->bancos[strtolower($banco->nombre)]->process($file); + switch ($banco->nombre) { + case 'security': + $movimientos = $this->processMovimientosDiariosSecurity($movimientos); + break; + case 'itau': + case 'santander': + break; + } + return $movimientos; + } + protected function processMovimientosDiariosSecurity(array $movimientos): array + { + $movimientos = array_reverse($movimientos); + array_shift($movimientos); + return $movimientos; + } + protected function buildCartola(Model\Inmobiliaria\Cuenta $cuenta, DateTimeInterface $fecha, array $data): Model\Cartola + { + try { + return $this->cartolaRepository->fetchByCuentaAndFecha($cuenta->id, $fecha); + } catch (Exception\EmptyResult) { + $data['cuenta_id'] = $cuenta->id; + $data['fecha'] = $fecha->format('Y-m-d'); + $cartola = $this->cartolaRepository->create($data); + return $this->cartolaRepository->save($cartola); + } + } + protected function buildMovimiento(Model\Inmobiliaria\Cuenta $cuenta, array $data): Model\Movimiento + { + try { + return $this->movimientoRepository + ->fetchByCuentaAndFechaAndMonto( + $cuenta->id, + new DateTimeImmutable($data['fecha']), + $data['cargo'] ?? $data['abono'] + ); + } catch (Exception\EmptyResult) { + $data['cuenta_id'] = $cuenta->id; + $movimiento = $this->movimientoRepository->create($data); + return $this->movimientoRepository->save($movimiento); + } + } }