diff --git a/app/src/Model/Inmobiliaria/Cuenta.php b/app/src/Model/Inmobiliaria/Cuenta.php index 33487ef..08459dd 100644 --- a/app/src/Model/Inmobiliaria/Cuenta.php +++ b/app/src/Model/Inmobiliaria/Cuenta.php @@ -2,6 +2,7 @@ namespace Incoviba\Model\Inmobiliaria; use Incoviba\Common\Ideal; +use Incoviba\Common\Implement\Exception\EmptyResult; use Incoviba\Model; class Cuenta extends Ideal\Model @@ -10,6 +11,30 @@ class Cuenta extends Ideal\Model public Model\Banco $banco; public string $cuenta; + protected array $estados; + public function getEstados(): array + { + if (!isset($this->estados)) { + $this->estados = $this->runFactory('estados'); + } + return $this->estados; + } + protected Model\Inmobiliaria\Cuenta\Estado $currentEstado; + public function currentEstado(): Model\Inmobiliaria\Cuenta\Estado + { + if (!isset($this->currentEstado)) { + $estados = $this->getEstados(); + if (count($estados) === 0) { + throw new EmptyResult('Current Estado Cuenta'); + } + usort($estados, function(Model\Inmobiliaria\Cuenta\Estado $a, Model\Inmobiliaria\Cuenta\Estado $b) { + return $a->id - $b->id; + }); + $this->currentEstado = end($estados); + } + return $this->currentEstado; + } + public function jsonSerialize(): mixed { return array_merge(parent::jsonSerialize(), [ diff --git a/app/src/Model/Inmobiliaria/Cuenta/Estado.php b/app/src/Model/Inmobiliaria/Cuenta/Estado.php new file mode 100644 index 0000000..e85fc69 --- /dev/null +++ b/app/src/Model/Inmobiliaria/Cuenta/Estado.php @@ -0,0 +1,22 @@ + $this->cuenta->id, + 'fecha' => $this->fecha->format('Y-m-d'), + 'active' => $this->active + ]); + } +} diff --git a/app/src/Repository/Inmobiliaria/Cuenta/Estado.php b/app/src/Repository/Inmobiliaria/Cuenta/Estado.php new file mode 100644 index 0000000..17cbdf8 --- /dev/null +++ b/app/src/Repository/Inmobiliaria/Cuenta/Estado.php @@ -0,0 +1,62 @@ +setTable('estados_cuentas'); + } + + public function create(?array $data = null): Model\Inmobiliaria\Cuenta\Estado + { + $map = (new Implement\Repository\MapperParser()) + ->register('cuenta_id', (new Implement\Repository\Mapper()) + ->setProperty('cuenta') + ->setFunction(function($data) { + return $this->cuentaRepository->fetchById($data['cuenta_id']); + })) + ->register('fecha', new Implement\Repository\Mapper\DateTime('fecha')) + ->register('active', new Implement\Repository\Mapper\Boolean('active')); + return $this->parseData(new Model\Inmobiliaria\Cuenta\Estado(), $data, $map); + } + public function save(Define\Model $model): Model\Inmobiliaria\Cuenta\Estado + { + $model->id = $this->saveNew([ + 'cuenta_id', 'fecha', 'active' + ], [ + $model->cuenta->id, $model->fecha->format('Y-m-d'), $model->active ? 1 : 0 + ]); + return $model; + } + public function edit(Define\Model $model, array $new_data): Model\Inmobiliaria\Cuenta\Estado + { + return $this->update($model, ['cuenta_id', 'fecha', 'active'], $new_data); + } + + public function fetchByCuenta(int $cuenta_id): array + { + $query = $this->connection->getQueryBuilder() + ->select() + ->from($this->getTable()) + ->where('cuenta_id = ?'); + return $this->fetchMany($query, [$cuenta_id]); + } + public function fetchLastByCuenta(int $cuenta_id): Model\Inmobiliaria\Cuenta\Estado + { + $query = $this->connection->getQueryBuilder() + ->select() + ->from($this->getTable()) + ->where('cuenta_id = ?') + ->order('id DESC') + ->limit(1); + return $this->fetchMany($query, [$cuenta_id]); + } +} diff --git a/app/src/Service/Contabilidad/Informe/Tesoreria.php b/app/src/Service/Contabilidad/Informe/Tesoreria.php index f6d85e6..8a9f113 100644 --- a/app/src/Service/Contabilidad/Informe/Tesoreria.php +++ b/app/src/Service/Contabilidad/Informe/Tesoreria.php @@ -4,7 +4,6 @@ namespace Incoviba\Service\Contabilidad\Informe; use DateTimeInterface; use DateInterval; use Psr\Log\LoggerInterface; -use PhpOffice\PhpSpreadsheet; use Incoviba\Common\Ideal; use Incoviba\Common\Implement; use Incoviba\Model; @@ -13,14 +12,14 @@ use Incoviba\Service; class Tesoreria extends Ideal\Service { - public function __construct(LoggerInterface $logger, - protected Repository\Inmobiliaria $inmobiliariaRepository, - protected Repository\Inmobiliaria\Cuenta $cuentaRepository, - protected Repository\Deposito $depositoRepository, - protected Repository\Cartola $cartolaRepository, - protected Repository\Movimiento $movimientoRepository, + public function __construct(LoggerInterface $logger, + protected Repository\Inmobiliaria $inmobiliariaRepository, + protected Service\Inmobiliaria\Cuenta $cuentaService, + protected Repository\Deposito $depositoRepository, + protected Repository\Cartola $cartolaRepository, + protected Repository\Movimiento $movimientoRepository, protected Service\Contabilidad\Informe\Tesoreria\Excel $excelService, - protected Service\Contabilidad\Informe\Tesoreria\PDF $pdfService) + protected Service\Contabilidad\Informe\Tesoreria\PDF $pdfService) { parent::__construct($logger); @@ -170,7 +169,7 @@ class Tesoreria extends Ideal\Service }; $dataInmobiliaria->inmobiliaria = $inmobiliaria; try { - $cuentas = $this->cuentaRepository->fetchByInmobiliaria($inmobiliaria->rut); + $cuentas = $this->cuentaService->getAllActiveByInmobiliaria($inmobiliaria->rut); } catch (Implement\Exception\EmptyResult) { return $dataInmobiliaria; } diff --git a/app/src/Service/Inmobiliaria/Cuenta.php b/app/src/Service/Inmobiliaria/Cuenta.php new file mode 100644 index 0000000..e40e602 --- /dev/null +++ b/app/src/Service/Inmobiliaria/Cuenta.php @@ -0,0 +1,56 @@ +cuentaRepository->fetchAll()); + return array_values(array_filter($cuentas, function(Model\Inmobiliaria\Cuenta $cuenta) { + return $cuenta->currentEstado()->active; + })); + } + public function getAllActiveByInmobiliaria(int $inmobiliaria_rut): array + { + $cuentas = array_map([$this, 'process'], $this->cuentaRepository->fetchByInmobiliaria($inmobiliaria_rut)); + return array_values(array_filter($cuentas, function(Model\Inmobiliaria\Cuenta $cuenta) { + return $cuenta->currentEstado()->active; + })); + } + public function add(array $data): Model\Inmobiliaria\Cuenta + { + $cuenta = $this->cuentaRepository->create($data); + $cuenta = $this->cuentaRepository->save($cuenta); + $dataEstado = [ + 'cuenta_id' => $cuenta->id, + 'fecha' => new DateTimeImmutable(), + 'active' => true + ]; + $estado = $this->estadoRepository->create($dataEstado); + $this->estadoRepository->save($estado); + return $this->process($cuenta); + } + + protected function process(Model\Inmobiliaria\Cuenta $cuenta): Model\Inmobiliaria\Cuenta + { + $cuenta->addFactory('estados', (new Implement\Repository\Factory()) + ->setCallable(function($cuenta_id) { + return $this->estadoRepository->fetchByCuenta($cuenta_id); + }) + ->setArgs(['cuenta_id' => $cuenta->id])); + return $cuenta; + } +}