From 8710c8a111e36a710434485e9a656c0f60742a45 Mon Sep 17 00:00:00 2001 From: Juan Pablo Vial Date: Tue, 2 Apr 2024 23:02:52 -0300 Subject: [PATCH] Agentes --- app/resources/routes/api/inmobiliarias.php | 11 ++ .../routes/api/inmobiliarias/agentes.php | 11 ++ app/src/Controller/API/Inmobiliarias.php | 25 +++++ .../Controller/API/Inmobiliarias/Agentes.php | 90 +++++++++++++++ app/src/Model/Inmobiliaria/Agente.php | 40 +++++++ app/src/Model/Inmobiliaria/AgenteTipo.php | 10 ++ app/src/Model/Inmobiliaria/SociedadAgente.php | 19 ++++ app/src/Model/Inmobiliaria/TipoAgente.php | 11 ++ app/src/Repository/Inmobiliaria/Agente.php | 47 ++++++++ .../Repository/Inmobiliaria/AgenteTipo.php | 68 ++++++++++++ .../Inmobiliaria/SociedadAgente.php | 105 ++++++++++++++++++ .../Repository/Inmobiliaria/TipoAgente.php | 20 ++++ 12 files changed, 457 insertions(+) create mode 100644 app/resources/routes/api/inmobiliarias/agentes.php create mode 100644 app/src/Controller/API/Inmobiliarias/Agentes.php create mode 100644 app/src/Model/Inmobiliaria/Agente.php create mode 100644 app/src/Model/Inmobiliaria/AgenteTipo.php create mode 100644 app/src/Model/Inmobiliaria/SociedadAgente.php create mode 100644 app/src/Model/Inmobiliaria/TipoAgente.php create mode 100644 app/src/Repository/Inmobiliaria/Agente.php create mode 100644 app/src/Repository/Inmobiliaria/AgenteTipo.php create mode 100644 app/src/Repository/Inmobiliaria/SociedadAgente.php create mode 100644 app/src/Repository/Inmobiliaria/TipoAgente.php diff --git a/app/resources/routes/api/inmobiliarias.php b/app/resources/routes/api/inmobiliarias.php index 55c61fb..e751cbb 100644 --- a/app/resources/routes/api/inmobiliarias.php +++ b/app/resources/routes/api/inmobiliarias.php @@ -2,9 +2,20 @@ use Incoviba\Controller\API\Inmobiliarias; $app->group('/inmobiliarias', function($app) { + $folder = implode(DIRECTORY_SEPARATOR, [__DIR__, 'inmobiliarias']); + if (file_exists($folder)) { + $files = new FilesystemIterator($folder); + foreach ($files as $file) { + if ($file->isDir()) { + continue; + } + include_once $file->getRealPath(); + } + } $app->get('[/]', Inmobiliarias::class); }); $app->group('/inmobiliaria/{inmobiliaria_rut}', function($app) { + $app->post('/agentes', [Inmobiliarias::class, 'agentes']); $app->get('/cuentas[/]', [Inmobiliarias::class, 'cuentas']); $app->get('/proyectos[/]', [Inmobiliarias::class, 'proyectos']); }); diff --git a/app/resources/routes/api/inmobiliarias/agentes.php b/app/resources/routes/api/inmobiliarias/agentes.php new file mode 100644 index 0000000..9e4efef --- /dev/null +++ b/app/resources/routes/api/inmobiliarias/agentes.php @@ -0,0 +1,11 @@ +group('/agentes', function($app) { + $app->post('/add[/]', [Agentes::class, 'add']); + $app->post('/register[/]', [Agentes::class, 'register']); + $app->get('[/]', Agentes::class); +}); +$app->group('/agente/{agente_id}', function($app) { + $app->post('/edit[/]', [Agentes::class, 'edit']); +}); diff --git a/app/src/Controller/API/Inmobiliarias.php b/app/src/Controller/API/Inmobiliarias.php index d6fc8c2..98bdd84 100644 --- a/app/src/Controller/API/Inmobiliarias.php +++ b/app/src/Controller/API/Inmobiliarias.php @@ -55,4 +55,29 @@ class Inmobiliarias } catch (EmptyResult) {} return $this->withJson($response, $output); } + public function agentes(ServerRequestInterface $request, ResponseInterface $response, + Repository\Inmobiliaria $inmobiliariaRepository, + Repository\Inmobiliaria\SociedadAgente $sociedadAgenteRepository, + Repository\Inmobiliaria\TipoAgente $tipoAgenteRepository, + int $inmobiliaria_rut): ResponseInterface + { + $input = $request->getParsedBody(); + $output = [ + 'sociedad_rut' => $inmobiliaria_rut, + 'input' => $input, + 'sociedad' => null, + 'agentes' => [] + ]; + try { + $inmobiliaria = $inmobiliariaRepository->fetchById($inmobiliaria_rut); + $output['sociedad'] = $inmobiliaria; + if (isset($input['tipo_agente_id'])) { + $tipo = $tipoAgenteRepository->fetchById($input['tipo_agente_id']); + $output['agentes'] = $sociedadAgenteRepository->fetchBySociedadAndTipo($inmobiliaria->rut, $tipo->id); + } else { + $output['agentes'] = $sociedadAgenteRepository->fetchBySociedad($inmobiliaria->rut); + } + } catch (EmptyResult) {} + return $this->withJson($response, $output); + } } diff --git a/app/src/Controller/API/Inmobiliarias/Agentes.php b/app/src/Controller/API/Inmobiliarias/Agentes.php new file mode 100644 index 0000000..d4aa95b --- /dev/null +++ b/app/src/Controller/API/Inmobiliarias/Agentes.php @@ -0,0 +1,90 @@ + [] + ]; + try { + $output['agentes'] = $agenteRepository->fetchAll('abreviacion'); + } catch (EmptyResult) {} + return $this->withJson($response, $output); + } + public function add(ServerRequestInterface $request, ResponseInterface $response, Repository\Inmobiliaria\Agente $agenteRepository): ResponseInterface + { + $input = $request->getParsedBody(); + $output = [ + 'input' => $input, + 'agente' => null + ]; + try { + $agente = $agenteRepository->create($input); + $output['agente'] = $agenteRepository->save($agente); + } catch (EmptyResult) {} + return $this->withJson($response, $output); + } + public function edit(ServerRequestInterface $request, ResponseInterface $response, + Repository\Inmobiliaria\Agente $agenteRepository, int $agente_id): ResponseInterface + { + $input = $request->getParsedBody(); + $output = [ + 'agente_id' => $agente_id, + 'input' => $input, + 'agente' => null + ]; + try { + $agente = $agenteRepository->fetchById($agente_id); + $output['agente'] = $agenteRepository->edit($agente, $input); + } catch (EmptyResult) {} + return $this->withJson($response, $output); + } + public function register(ServerRequestInterface $request, ResponseInterface $response, + Repository\Inmobiliaria $inmobiliariaRepository, + Repository\Inmobiliaria\Agente $agenteRepository, + Repository\Inmobiliaria\TipoAgente $tipoAgenteRepository, + Repository\Inmobiliaria\AgenteTipo $agenteTipoRepository, + Repository\Inmobiliaria\SociedadAgente $sociedadAgenteRepository): ResponseInterface + { + $input = $request->getParsedBody(); + $output = [ + 'input' => $input, + 'sociedad' => null, + 'agente' => null, + 'tipo_agente' => null, + 'sociedad_agente' => null + ]; + try { + $sociedad = $inmobiliariaRepository->fetchById($input['sociedad_rut']); + $output['sociedad'] = $sociedad; + $agente = $agenteRepository->fetchById($input['agente_id']); + $output['agente'] = $agente; + $tipo = $tipoAgenteRepository->fetchById($input['tipo_agente_id']); + $output['tipo_agente'] = $tipo; + $agenteTipo = $agenteTipoRepository->fetchByAgenteAndTipo($agente->id, $tipo->id); + try { + $output['sociedad_agente'] = $sociedadAgenteRepository->fetchBySociedadAndAgenteAndTipo($sociedad->rut, $agente->id, $tipo->id); + } catch (EmptyResult) { + $data = [ + 'sociedad_rut' => $sociedad->rut, + 'agente_tipo_id' => $agenteTipo->id + ]; + $sociedadAgente = $sociedadAgenteRepository->create($data); + $output['sociedad_agente'] = $sociedadAgenteRepository->save($sociedadAgente); + } + } catch (EmptyResult) { + + } + return $this->withJson($response, $output); + } +} diff --git a/app/src/Model/Inmobiliaria/Agente.php b/app/src/Model/Inmobiliaria/Agente.php new file mode 100644 index 0000000..e96de2a --- /dev/null +++ b/app/src/Model/Inmobiliaria/Agente.php @@ -0,0 +1,40 @@ +tiposAgentes)) { + $this->tiposAgentes = $this->runFactory('tipos_agentes'); + } + return $this->tiposAgentes; + } + + public function jsonSerialize(): mixed + { + return array_merge(parent::jsonSerialize(), [ + 'rut' => $this->rut, + 'descripcion' => $this->descripcion, + 'contacto' => $this->contacto, + 'telefono' => $this->telefono, + 'correo' => $this->correo, + 'direccion' => $this->direccion, + 'giro' => $this->giro, + 'abreviacion' => $this->abreviacion, + ]); + } +} diff --git a/app/src/Model/Inmobiliaria/AgenteTipo.php b/app/src/Model/Inmobiliaria/AgenteTipo.php new file mode 100644 index 0000000..de2a094 --- /dev/null +++ b/app/src/Model/Inmobiliaria/AgenteTipo.php @@ -0,0 +1,10 @@ + $this->sociedad->rut, + 'agente_tipo_id' => $this->agenteTipo->id + ]; + } +} diff --git a/app/src/Model/Inmobiliaria/TipoAgente.php b/app/src/Model/Inmobiliaria/TipoAgente.php new file mode 100644 index 0000000..8152e73 --- /dev/null +++ b/app/src/Model/Inmobiliaria/TipoAgente.php @@ -0,0 +1,11 @@ +setTable('agente'); + } + + public function create(?array $data = null): Model\Inmobiliaria\Agente + { + $map = (new Implement\Repository\MapperParser(['rut', 'descripcion', 'telefono', 'correo', 'giro', 'abreviacion'])) + ->register('representante', (new Implement\Repository\Mapper()) + ->setProperty('contacto')) + ->register('direccion', (new Implement\Repository\Mapper()) + ->setFunction(function(?array $data) { + if ($data === null) { + return null; + } + return $this->direccionRepository->fetchById($data['direccion']); + })); + return $this->parseData(new Model\Inmobiliaria\Agente(), $data, $map); + } + public function save(Define\Model $model): Model\Inmobiliaria\Agente + { + $model->id = $this->saveNew([ + 'rut', 'descripcion', 'representante', 'telefono', 'correo', 'giro', 'abreviacion' + ], [ + $model->rut, $model->descripcion, $model->contacto, $model->telefono, $model->correo, $model->giro, $model->abreviacion + ]); + return $model; + } + public function edit(Define\Model $model, array $new_data): Model\Inmobiliaria\Agente + { + return $this->update($model, [ + 'rut', 'descripcion', 'representante', 'telefono', 'correo', 'giro', 'abreviacion' + ], $new_data); + } +} diff --git a/app/src/Repository/Inmobiliaria/AgenteTipo.php b/app/src/Repository/Inmobiliaria/AgenteTipo.php new file mode 100644 index 0000000..0ec9ed6 --- /dev/null +++ b/app/src/Repository/Inmobiliaria/AgenteTipo.php @@ -0,0 +1,68 @@ +setTable('agente_tipo'); + } + + public function create(?array $data = null): Model\Inmobiliaria\AgenteTipo + { + $map = (new Implement\Repository\MapperParser()) + ->register('agente', (new Implement\Repository\Mapper()) + ->setFunction(function(?array $data) { + return ($data === null) ? null : $this->agenteRepository->fetchById($data['agente']); + })) + ->register('tipo', (new Implement\Repository\Mapper()) + ->setFunction(function(?array $data) { + return ($data === null) ? null : $this->tipoAgenteRepository->fetchById($data['tipo']); + })); + return $this->parseData(new Model\Inmobiliaria\AgenteTipo(), $data, $map); + } + public function save(Define\Model $model): Model\Inmobiliaria\AgenteTipo + { + $model->id = $this->saveNew(['agente', 'tipo'], [ + $model->agente->id, $model->agenteTipo->id + ]); + return $model; + } + public function edit(Define\Model $model, array $new_data): Model\Inmobiliaria\AgenteTipo + { + return $this->update($model, ['agente', 'tipo'], $new_data); + } + + public function fetchByAgente(int $agente_id): array + { + $query = $this->connection->getQueryBuilder() + ->select() + ->from($this->getTable()) + ->where('agente = ?'); + return $this->fetchMany($query, [$agente_id]); + } + public function fetchByTipo(int $tipo_agente_id): array + { + $query = $this->connection->getQueryBuilder() + ->select() + ->from($this->getTable()) + ->where('tipo = ?'); + return $this->fetchMany($query, [$tipo_agente_id]); + } + public function fetchByAgenteAndTipo(int $agente_id, int $tipo_agente_id): Model\Inmobiliaria\AgenteTipo + { + $query = $this->connection->getQueryBuilder() + ->select() + ->from($this->getTable()) + ->where('agente = ? AND tipo = ?'); + return $this->fetchOne($query, [$agente_id, $tipo_agente_id]); + } +} diff --git a/app/src/Repository/Inmobiliaria/SociedadAgente.php b/app/src/Repository/Inmobiliaria/SociedadAgente.php new file mode 100644 index 0000000..e759385 --- /dev/null +++ b/app/src/Repository/Inmobiliaria/SociedadAgente.php @@ -0,0 +1,105 @@ +setTable('sociedad_agente'); + } + public function create(?array $data = null): Model\Inmobiliaria\SociedadAgente + { + $map = (new Implement\Repository\MapperParser()) + ->register('sociedad_rut', (new Implement\Repository\Mapper()) + ->setProperty('sociedad') + ->setFunction(function(?array $data) { + return ($data === null) ? null : $this->inmobiliariaRepository->fetchById($data['sociedad_rut']); + })) + ->register('agente_tipo_id', (new Implement\Repository\Mapper()) + ->setProperty('agenteTipo') + ->setFunction(function(?array $data) { + return ($data === null) ? null : $this->agenteRepository->fetchById($data['agente_tipo_id']); + })); + return $this->parseData(new Model\Inmobiliaria\SociedadAgente(), $data, $map); + } + public function save(Define\Model $model): Model\Inmobiliaria\SociedadAgente + { + $model->id = $this->saveNew([ + 'sociedad_rut', 'agente_tipo_id' + ], [ + $model->sociedad->rut, $model->agenteTipo->id + ]); + return $model; + } + public function edit(Define\Model $model, array $new_data): Model\Inmobiliaria\SociedadAgente + { + return $this->update($model, ['sociedad_rut', 'agente_tipo_id'], $new_data); + } + public function load(array $data_row): Define\Model + { + $model = $this->create($data_row); + return $model; + } + + public function fetchBySociedad(int $sociedad_rut): array + { + $query = $this->connection->getQueryBuilder() + ->select() + ->from($this->getTable()) + ->where('sociedad_rut = ?'); + return $this->fetchMany($query, [$sociedad_rut]); + } + public function fetchByAgente(int $agente_id): array + { + $query = $this->connection->getQueryBuilder() + ->select('a.*') + ->from("{$this->getTable()} a") + ->joined('JOIN agente_tipo at ON a.agente_tipo_id = at.id') + ->where('at.agente = ?'); + return $this->fetchMany($query, [$agente_id]); + } + public function fetchByTipo(int $tipo_agente_id): array + { + $query = $this->connection->getQueryBuilder() + ->select('a.*') + ->from("{$this->getTable()} a") + ->joined('JOIN agente_tipo at ON a.agente_tipo_id = at.id') + ->where('at.tipo = ?'); + return $this->fetchMany($query, [$tipo_agente_id]); + } + public function fetchBySociedadAndTipo(int $sociedad_rut, int $tipo_agente_id): array + { + $query = $this->connection->getQueryBuilder() + ->select('a.*') + ->from("{$this->getTable()} a") + ->joined('JOIN agente_tipo at ON a.agente_tipo_id = at.id') + ->where('sociedad_rut = ? AND at.tipo = ?'); + return $this->fetchMany($query, [$sociedad_rut, $tipo_agente_id]); + } + public function fetchBySociedadAndAgente(int $sociedad_rut, int $agente_id): array + { + $query = $this->connection->getQueryBuilder() + ->select('a.*') + ->from("{$this->getTable()} a") + ->joined('JOIN agente_tipo at ON a.agente_tipo_id = at.id') + ->where('sociedad_rut = ? AND at.agente = ?'); + return $this->fetchMany($query, [$sociedad_rut, $agente_id]); + } + public function fetchBySociedadAndAgenteAndTipo(int $sociedad_rut, int $agente_id, int $tipo_agente_id): array + { + $query = $this->connection->getQueryBuilder() + ->select('a.*') + ->from("{$this->getTable()} a") + ->joined('JOIN agente_tipo at ON a.agente_tipo_id = at.id') + ->where('sociedad_rut = ? AND at.agente = ? AND at.tipo = ?'); + return $this->fetchMany($query, [$sociedad_rut, $agente_id, $tipo_agente_id]); + } +} diff --git a/app/src/Repository/Inmobiliaria/TipoAgente.php b/app/src/Repository/Inmobiliaria/TipoAgente.php new file mode 100644 index 0000000..0c3c648 --- /dev/null +++ b/app/src/Repository/Inmobiliaria/TipoAgente.php @@ -0,0 +1,20 @@ +setTable('tipo_agente'); + } + + protected function getBlank(): Model\Inmobiliaria\TipoAgente + { + return new Model\Inmobiliaria\TipoAgente(); + } +}