Files
oficial/app/src/Service/Cartola.php

82 lines
3.2 KiB
PHP
Raw Normal View History

2024-01-17 10:33:11 -03:00
<?php
namespace Incoviba\Service;
use DateTimeInterface;
2024-02-08 00:06:29 -03:00
use DateTimeImmutable;
2024-01-17 10:33:11 -03:00
use Psr\Http\Message\StreamFactoryInterface;
use Psr\Http\Message\UploadedFileInterface;
use Incoviba\Common\Define\Cartola\Banco;
use Incoviba\Common\Define\Contabilidad\Exporter;
2024-02-08 00:06:29 -03:00
use Incoviba\Common\Implement\Exception;
2024-01-17 10:33:11 -03:00
use Incoviba\Model;
2024-02-08 00:06:29 -03:00
use Incoviba\Repository;
2024-01-17 10:33:11 -03:00
class Cartola
{
2024-02-08 00:06:29 -03:00
public function __construct(protected StreamFactoryInterface $streamFactory, protected Exporter $exporter,
protected Repository\Inmobiliaria\Cuenta $cuentaRepository,
protected Repository\Movimiento $movimientoRepository,
protected Repository\Cartola $cartolaRepository) {}
2024-01-17 10:33:11 -03:00
protected array $bancos;
public function register(string $name, Banco $banco): Cartola
{
$this->bancos[$name] = $banco;
return $this;
}
public function process(Model\Inmobiliaria $inmobiliaria, Model\Banco $banco, DateTimeInterface $mes, UploadedFileInterface $file): array
{
return $this->bancos[strtolower($banco->nombre)]->process($file);
}
public function export(Model\Inmobiliaria $inmobiliaria, Model\Banco $banco, DateTimeInterface $mes, array $movimientos): string
{
return $this->exporter->export($inmobiliaria, $banco, $mes, $movimientos);
}
2024-02-08 00:06:29 -03:00
public function diaria(Model\Inmobiliaria $inmobiliaria, Model\Banco $banco, DateTimeInterface $fecha, UploadedFileInterface $file): array
{
$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'];
$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);
}
$movimientos []= $movimiento;
if ($movimiento->fecha === $fecha) {
$cargos += $movimiento->cargo;
$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);
}
return compact('cartola', 'movimientos');
}
2024-01-17 10:33:11 -03:00
}