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

144 lines
6.1 KiB
PHP
Raw Normal View History

2024-01-17 10:33:11 -03:00
<?php
2024-03-26 09:38:20 -03:00
namespace Incoviba\Service\Contabilidad;
2024-01-17 10:33:11 -03:00
2024-02-08 00:06:29 -03:00
use DateTimeImmutable;
2024-03-26 09:38:20 -03:00
use DateTimeInterface;
2024-01-17 10:33:11 -03:00
use Incoviba\Common\Define\Cartola\Banco;
use Incoviba\Common\Define\Contabilidad\Exporter;
2024-03-26 09:38:20 -03:00
use Incoviba\Common\Ideal\Service;
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-03-26 09:38:20 -03:00
use Psr\Http\Message\StreamFactoryInterface;
use Psr\Http\Message\UploadedFileInterface;
use Psr\Log\LoggerInterface;
2024-01-17 10:33:11 -03:00
2024-02-12 09:52:48 -03:00
class Cartola extends Service
2024-01-17 10:33:11 -03:00
{
2024-03-26 09:38:20 -03:00
public function __construct(LoggerInterface $logger,
protected StreamFactoryInterface $streamFactory, protected Exporter $exporter,
protected Repository\Inmobiliaria $inmobiliariaRepository,
protected Repository\Inmobiliaria\Cuenta $cuentaRepository,
protected Repository\Contabilidad\Movimiento $movimientoRepository,
protected Movimiento $movimientoService,
protected Repository\Contabilidad\Cartola $cartolaRepository) {
2024-02-12 09:52:48 -03:00
parent::__construct($logger);
}
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;
}
2024-07-18 21:25:10 -04:00
public function process(Model\Contabilidad\Banco $banco, UploadedFileInterface $file): array
2024-01-17 10:33:11 -03:00
{
return $this->bancos[strtolower($banco->nombre)]->process($file);
}
2024-03-26 09:38:20 -03:00
public function export(Model\Inmobiliaria $inmobiliaria, Model\Contabilidad\Banco $banco, DateTimeInterface $mes, array $movimientos): string
2024-01-17 10:33:11 -03:00
{
return $this->exporter->export($inmobiliaria, $banco, $mes, $movimientos);
}
2024-02-19 22:39:22 -03:00
public function diaria(Model\Inmobiliaria\Cuenta $cuenta, DateTimeInterface $fecha, UploadedFileInterface $file): array
2024-02-08 00:06:29 -03:00
{
2024-02-19 22:39:22 -03:00
$ms = $this->getMovimientosDiarios($cuenta->banco, $file);
2024-02-08 00:06:29 -03:00
2024-03-21 22:08:30 -03:00
$this->groupedMovimientos = [];
2024-02-08 00:06:29 -03:00
$movimientos = [];
foreach ($ms as $m) {
2024-02-08 13:04:05 -03:00
$movimiento = $this->buildMovimiento($cuenta, $m);
2024-03-04 19:55:49 -03:00
$movimiento = $this->movimientoService->process($movimiento);
2024-03-21 21:57:32 -03:00
$this->groupMovimientoByDay($movimiento);
2024-02-12 09:52:48 -03:00
if ($movimiento->fecha->getTimestamp() === $fecha->getTimestamp()) {
$movimientos []= $movimiento;
2024-03-21 21:57:32 -03:00
}
}
foreach ($this->groupedMovimientos as $timestamp => $movimientos) {
$cartolaData = [
'cargos' => 0,
'abonos' => 0,
'saldo' => end($movimientos)->saldo
];
foreach ($movimientos as $movimiento) {
2024-02-08 13:04:05 -03:00
$cartolaData['cargos'] += $movimiento->cargo;
$cartolaData['abonos'] += $movimiento->abono;
2024-02-08 00:06:29 -03:00
}
2024-03-21 21:57:32 -03:00
$this->buildCartola($cuenta, end($movimientos)->fecha, $cartolaData);
2024-02-08 00:06:29 -03:00
}
2024-03-21 21:57:32 -03:00
$cartola = $this->cartolaRepository->fetchByCuentaAndFecha($cuenta->id, $fecha);
2024-02-08 13:04:05 -03:00
return compact('cartola', 'movimientos');
}
2024-02-23 10:20:44 -03:00
public function diariaManual(Model\Inmobiliaria\Cuenta $cuenta, DateTimeInterface $fecha, array $data): array
{
$cartolaData = [
'cargos' => 0,
'abonos' => 0,
'saldos' => 0
];
$movimientos = [];
foreach ($data as $row) {
$dataMovimiento = $row;
$dataMovimiento['fecha'] = $fecha->format('Y-m-d');
$dataMovimiento['documento'] = '';
$movimiento = $this->buildMovimiento($cuenta, $dataMovimiento);
2024-03-04 19:55:49 -03:00
$movimiento = $this->movimientoService->process($movimiento);
2024-02-23 10:20:44 -03:00
$movimientos []= $movimiento;
$cartolaData['cargos'] += $movimiento->cargo;
$cartolaData['abonos'] += $movimiento->abono;
$cartolaData['saldo'] = $movimiento->saldo;
}
$cartola = $this->buildCartola($cuenta, $fecha, $cartolaData);
return compact('cartola', 'movimientos');
}
2024-02-08 13:04:05 -03:00
2024-03-26 09:38:20 -03:00
protected function getMovimientosDiarios(Model\Contabilidad\Banco $banco, UploadedFileInterface $file): array
2024-02-08 13:04:05 -03:00
{
$movimientos = $this->bancos[strtolower($banco->nombre)]->process($file);
2024-02-19 22:39:22 -03:00
return $this->bancos[strtolower($banco->nombre)]->processMovimientosDiarios($movimientos);
2024-02-08 13:04:05 -03:00
}
2024-03-21 21:57:32 -03:00
protected array $groupedMovimientos = [];
2024-03-26 09:38:20 -03:00
protected function groupMovimientoByDay(Model\Contabilidad\Movimiento $movimiento): Cartola
2024-03-21 21:57:32 -03:00
{
if (!isset($this->groupedMovimientos[$movimiento->fecha->getTimestamp()])) {
$this->groupedMovimientos[$movimiento->fecha->getTimestamp()] = [];
}
$this->groupedMovimientos[$movimiento->fecha->getTimestamp()] []= $movimiento;
return $this;
}
2024-03-26 09:38:20 -03:00
protected function buildCartola(Model\Inmobiliaria\Cuenta $cuenta, DateTimeInterface $fecha, array $data): Model\Contabilidad\Cartola
2024-02-08 13:04:05 -03:00
{
2024-02-08 00:06:29 -03:00
try {
2024-02-08 13:04:05 -03:00
return $this->cartolaRepository->fetchByCuentaAndFecha($cuenta->id, $fecha);
2024-02-08 00:06:29 -03:00
} catch (Exception\EmptyResult) {
2024-02-08 13:04:05 -03:00
$data['cuenta_id'] = $cuenta->id;
$data['fecha'] = $fecha->format('Y-m-d');
$cartola = $this->cartolaRepository->create($data);
return $this->cartolaRepository->save($cartola);
}
}
2024-03-26 09:38:20 -03:00
protected function buildMovimiento(Model\Inmobiliaria\Cuenta $cuenta, array $data): Model\Contabilidad\Movimiento
2024-02-08 13:04:05 -03:00
{
try {
return $this->movimientoRepository
2024-07-17 22:33:33 -04:00
->fetchByCuentaAndFechaAndGlosaAndCargoAndAbonoAndSaldo(
2024-02-08 13:04:05 -03:00
$cuenta->id,
new DateTimeImmutable($data['fecha']),
2024-07-17 22:33:33 -04:00
$data['glosa'],
2024-02-23 10:20:44 -03:00
$data['cargo'] ?? 0,
$data['abono'] ?? 0,
$data['saldo']
2024-02-08 13:04:05 -03:00
);
2024-02-19 22:39:22 -03:00
} catch (Exception\EmptyResult $exception) {
2024-02-08 13:04:05 -03:00
$data['cuenta_id'] = $cuenta->id;
$movimiento = $this->movimientoRepository->create($data);
2024-03-18 17:54:27 -03:00
try {
return $this->movimientoRepository->save($movimiento);
} catch (\PDOException $exception) {
$this->logger->critical(var_export($data,true));
throw $exception;
}
2024-02-08 00:06:29 -03:00
}
}
2024-01-17 10:33:11 -03:00
}