Implemented repository mapper, and venta show

This commit is contained in:
Juan Pablo Vial
2023-08-08 23:53:49 -04:00
parent ef30ae67d2
commit 59825259b6
111 changed files with 2766 additions and 612 deletions

View File

@ -4,7 +4,9 @@ namespace Incoviba\Repository;
use DateTimeImmutable;
use Incoviba\Common\Ideal;
use Incoviba\Common\Define;
use Incoviba\Common\Implement;
use Incoviba\Model;
use Incoviba\Service;
class Venta extends Ideal\Repository
{
@ -12,13 +14,13 @@ class Venta extends Ideal\Repository
Define\Connection $connection,
protected Venta\Propietario $propietarioRepository,
protected Venta\Propiedad $propiedadRepository,
protected Venta\Pie $pieRepository,
protected Service\Venta\Pie $pieService,
protected Venta\BonoPie $bonoPieRepository,
protected Venta\Credito $creditoRepository,
protected Venta\Escritura $escrituraRepository,
protected Venta\Subsidio $subsidioRepository,
protected Venta\Entrega $entregaRepository,
protected Venta\Pago $pagoRepository
protected Service\Venta\Pago $pagoService
)
{
parent::__construct($connection);
@ -27,95 +29,96 @@ class Venta extends Ideal\Repository
public function create(?array $data = null): Define\Model
{
$map = [
'propietario' => [
'function' => function($data) {
return $this->propietarioRepository->fetchById($data['propietario']);
}
],
'propiedad' => [
'function' => function($data) {
return $this->propiedadRepository->fetchById($data['propiedad']);
}
],
'pie' => [
'property' => 'formaPago',
'function' => function($data) {
$fp = new Model\Venta\FormaPago();
$map = [
'pie' => [
'repository' => $this->pieRepository
],
'bono_pie' => [
'property' => 'bonoPie',
'repository' => $this->bonoPieRepository
],
'credito' => [
'repository' => $this->creditoRepository
],
'escritura' => [
'repository' => $this->escrituraRepository
],
'subsidio' => [
'repository' => $this->subsidioRepository
]
];
foreach ($map as $column => $settings) {
if ($data[$column] !== null and $data[$column] !== 0) {
$fp->{$settings['property'] ?? $column} = $settings['repository']->fetchById($data[$column]);
$map = (new Implement\Repository\MapperParser())
->register('propietario', (new Implement\Repository\Mapper())
->setFactory((new Implement\Repository\Factory())
->setCallable([$this->propietarioRepository, 'fetchById'])
->setArgs([$data['propietario']])))
->register('propiedad', (new Implement\Repository\Mapper())
->setFactory((new Implement\Repository\Factory())
->setCallable([$this->propiedadRepository, 'fetchById'])
->setArgs([$data['propiedad']])))
->register('pie', (new Implement\Repository\Mapper())
->setProperty('formaPago')
->setFactory((new Implement\Repository\Factory())
->setCallable(function($repositories, $data) {
$fp = new Model\Venta\FormaPago();
$map = [
'pie' => [
'service' => $repositories->pieService
],
'bono_pie' => [
'property' => 'bonoPie',
'repository' => $repositories->bonoPieRepository
],
'credito' => [
'repository' => $repositories->creditoRepository
],
'escritura' => [
'repository' => $repositories->escrituraRepository
],
'subsidio' => [
'repository' => $repositories->subsidioRepository
],
'devolucion' => [
'service' => $repositories->pagoService
]
];
foreach ($map as $column => $settings) {
if ($data[$column] !== null and $data[$column] !== 0) {
if (isset($settings['repository'])) {
$fp->{$settings['property'] ?? $column} = $settings['repository']->fetchById($data[$column]);
continue;
}
$fp->{$settings['property'] ?? $column} = $settings['service']->getById($data[$column]);
continue;
}
$fp->{$settings['property'] ?? $column} = null;
}
}
return $fp;
}
],
'escriturado' => [
'function' => function($data) {
return $fp;
})
->setArgs([(object) [
'pieService' => $this->pieService,
'bonoPieRepository' => $this->bonoPieRepository,
'creditoRepository' => $this->creditoRepository,
'escrituraRepository' => $this->escrituraRepository,
'subsidioRepository' => $this->subsidioRepository,
'pagoService' => $this->pagoService
], $data])))
/*->register('escriturado', (new Implement\Repository\Mapper())
->setFunction(function($data) {
return $data['escritura'] !== null;
}
],
'entrega' => [
'function' => function($data) {
if ($data['entrega'] !== null and $data['entrega'] !== 0) {
return $this->entregaRepository->fetchById($data['entrega']);
}
}
],
'entregado' => [
'function' => function($data) {
if ($data['entrega'] !== null and $data['entrega'] !== 0) {
return $data['entrega'] !== null;
}
}
],
'fecha' => [
'function' => function($data) {
return new DateTimeImmutable($data['fecha']);
}
],
'valor_uf' => [
'property' => 'valor'
],
//'estado' => [],
'fecha_ingreso' => [
'property' => 'fechaIngreso',
'function' => function($data) {
return new DateTimeImmutable($data['fecha_ingreso']);
}
],
/*'avalchile' => [
],*/
//'agente',
//'uf',
'relacionado' => [
'function' => function($data) {
return $data['relacionado'] !== 0;
}
],
//'promocion',
//'resciliacion',
//'devolucion'
];
}))*/
->register('entrega', (new Implement\Repository\Mapper())
->setFactory((new Implement\Repository\Factory())
->setCallable(function($entrega_id) {
if ($entrega_id !== null and $entrega_id !== 0) {
return $this->entregaRepository->fetchById($entrega_id);
}
return null;
})
->setArgs([$data['entrega']])))
/*->register('entregado', (new Implement\Repository\Mapper())
->setFactory((new Implement\Repository\Factory())
->setCallable(function($entrega_id) {
if ($entrega_id !== null and $entrega_id !== 0) {
return $entrega_id != null;
}
return false;
})
->setArgs([$data['entrega']])))*/
->register('fecha', new Implement\Repository\Mapper\DateTime('fecha'))
->register('valor_uf', (new Implement\Repository\Mapper())
->setProperty('valor'))
//->register('estado')
->register('fecha_ingreso', new Implement\Repository\Mapper\DateTime('fecha_ingreso', 'fechaIngreso'))
//->register('avalchile')
//->register('agente')
//->register('uf')
->register('relacionado', new Implement\Repository\Mapper\Boolean('relacionado'));
//->register('promocion')
//->register('resciliacion')
//->register('devolucion');
return $this->parseData(new Model\Venta(), $data, $map);
}
public function save(Define\Model $model): Define\Model
@ -124,9 +127,9 @@ class Venta extends Ideal\Repository
['propietario', 'propiedad', 'pie', 'bono_pie', 'credito', 'escritura', 'subsidio', 'escriturado',
'entrega', 'entregado', 'fecha', 'valor_uf', 'estado', 'fecha_ingreso', 'avalchile', 'agente', 'uf',
'relacionado', 'promocion', 'resciliacion', 'devolucion'],
[$model->propietario->rut, $model->propiedad->id, $model->formaPago->Pie?->id, $model->formaPago->bonoPie?->id,
$model->formaPago->credito?->id, $model->formaPago->escritura?->id, $model->formaPago->subsidio?->id,
$model->formaPago->escritura !== null ? 1 : 0, null, 0, $model->fecha->format('Y-m-d'), $model->valor,
[$model->propietario->rut, $model->propiedad()->id, $model->formaPago()->Pie?->id, $model->formaPago()->bonoPie?->id,
$model->formaPago()->credito?->id, $model->formaPago()->escritura?->id, $model->formaPago()->subsidio?->id,
$model->formaPago()->escritura !== null ? 1 : 0, null, 0, $model->fecha->format('Y-m-d'), $model->valor,
$model->currentEstado->vigente ? 1 : 0, $model->fechaIngreso->format('Y-m-d'), '', null, 0,
$model->relacionado ? 1 : 0, null, null, null]
);
@ -152,4 +155,17 @@ WHERE ptu.`proyecto` = ? AND tev.`activa`
GROUP BY a.`id`";
return $this->fetchMany($query, [$proyecto_id]);
}
public function fetchByProyectoAndUnidad(string $proyecto_nombre, int $unidad_descripcion): Define\Model
{
$query = "SELECT a.*
FROM `{$this->getTable()}` a
JOIN `propiedad_unidad` pu ON pu.`propiedad` = a.`propiedad`
JOIN `unidad` ON `unidad`.`id` = pu.`unidad` AND pu.`principal` = 1
JOIN `proyecto_tipo_unidad` ptu ON ptu.`id` = `unidad`.`pt`
JOIN `proyecto` ON `proyecto`.`id` = ptu.`proyecto`
JOIN (SELECT e1.* FROM `estado_venta` e1 JOIN (SELECT MAX(`id`) AS 'id', `venta` FROM `estado_venta` GROUP BY `venta`) e0 ON e0.`id` = e1.`id`) ev ON ev.`venta` = a.`id`
JOIN `tipo_estado_venta` tev ON tev.`id` = ev.`estado`
WHERE `proyecto`.`descripcion` = ? AND `unidad`.`descripcion` = ? AND tev.`activa`";
return $this->fetchOne($query, [$proyecto_nombre, $unidad_descripcion]);
}
}