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
|
|
|
}
|