From f589ff960bb8af371f5725de7740581a9fb100ae Mon Sep 17 00:00:00 2001 From: Aldarien Date: Tue, 30 Nov 2021 18:04:41 -0300 Subject: [PATCH] Files --- common/Alias/Model.php | 120 ++++++++ common/Controller/Bancos.php | 80 ++++++ common/Controller/Base.php | 22 ++ common/Controller/Inmobiliarias.php | 166 ++++++++++++ common/Controller/Propietarios.php | 91 +++++++ common/Controller/Proyectos.php | 93 +++++++ common/Controller/Sociedades.php | 39 +++ common/Controller/Ventas.php | 92 +++++++ common/Define/Controller/Json.php | 13 + common/Define/Model.php | 62 +++++ common/Factory/Model.php | 377 ++++++++++++++++++++++++++ common/Middleware/Auth.php | 30 ++ common/Service/Auth.php | 51 ++++ public/index.php | 7 + resources/routes/auth.php | 12 + resources/routes/bancos.php | 12 + resources/routes/base.php | 5 + resources/routes/inmobiliarias.php | 13 + resources/routes/propietarios.php | 12 + resources/routes/proyectos.php | 12 + resources/routes/tipos.php | 16 ++ resources/routes/tipos/sociedades.php | 12 + resources/routes/ventas.php | 12 + setup/app.php | 53 ++++ setup/composer.php | 6 + setup/databases.php | 24 ++ setup/middlewares/01_error.php | 4 + setup/middlewares/02_auth.php | 2 + setup/router.php | 9 + setup/settings/01_env.php | 5 + setup/settings/02_databases.php | 24 ++ setup/settings/03_common.php | 15 + setup/setups/01_env.php | 11 + setup/setups/02_auth.php | 15 + src/Common/Banco.php | 13 + src/Common/Comuna.php | 14 + src/Common/Direccion.php | 24 ++ src/Common/Provincia.php | 29 ++ src/Common/Region.php | 23 ++ src/Inmobiliaria/Inmobiliaria.php | 44 +++ src/Inmobiliaria/TipoSociedad.php | 9 + src/Proyecto/Proyecto.php | 40 +++ src/Venta/Agente.php | 6 + src/Venta/BonoPie.php | 6 + src/Venta/Credito.php | 6 + src/Venta/Entrega.php | 6 + src/Venta/Escritura.php | 6 + src/Venta/EstadoVenta.php | 6 + src/Venta/Pago.php | 6 + src/Venta/Pie.php | 6 + src/Venta/Promocion.php | 6 + src/Venta/Propiedad.php | 6 + src/Venta/Propietario.php | 31 +++ src/Venta/Resciliacion.php | 6 + src/Venta/Subsidio.php | 6 + src/Venta/Venta.php | 144 ++++++++++ 56 files changed, 1960 insertions(+) create mode 100644 common/Alias/Model.php create mode 100644 common/Controller/Bancos.php create mode 100644 common/Controller/Base.php create mode 100644 common/Controller/Inmobiliarias.php create mode 100644 common/Controller/Propietarios.php create mode 100644 common/Controller/Proyectos.php create mode 100644 common/Controller/Sociedades.php create mode 100644 common/Controller/Ventas.php create mode 100644 common/Define/Controller/Json.php create mode 100644 common/Define/Model.php create mode 100644 common/Factory/Model.php create mode 100644 common/Middleware/Auth.php create mode 100644 common/Service/Auth.php create mode 100644 public/index.php create mode 100644 resources/routes/auth.php create mode 100644 resources/routes/bancos.php create mode 100644 resources/routes/base.php create mode 100644 resources/routes/inmobiliarias.php create mode 100644 resources/routes/propietarios.php create mode 100644 resources/routes/proyectos.php create mode 100644 resources/routes/tipos.php create mode 100644 resources/routes/tipos/sociedades.php create mode 100644 resources/routes/ventas.php create mode 100644 setup/app.php create mode 100644 setup/composer.php create mode 100644 setup/databases.php create mode 100644 setup/middlewares/01_error.php create mode 100644 setup/middlewares/02_auth.php create mode 100644 setup/router.php create mode 100644 setup/settings/01_env.php create mode 100644 setup/settings/02_databases.php create mode 100644 setup/settings/03_common.php create mode 100644 setup/setups/01_env.php create mode 100644 setup/setups/02_auth.php create mode 100644 src/Common/Banco.php create mode 100644 src/Common/Comuna.php create mode 100644 src/Common/Direccion.php create mode 100644 src/Common/Provincia.php create mode 100644 src/Common/Region.php create mode 100644 src/Inmobiliaria/Inmobiliaria.php create mode 100644 src/Inmobiliaria/TipoSociedad.php create mode 100644 src/Proyecto/Proyecto.php create mode 100644 src/Venta/Agente.php create mode 100644 src/Venta/BonoPie.php create mode 100644 src/Venta/Credito.php create mode 100644 src/Venta/Entrega.php create mode 100644 src/Venta/Escritura.php create mode 100644 src/Venta/EstadoVenta.php create mode 100644 src/Venta/Pago.php create mode 100644 src/Venta/Pie.php create mode 100644 src/Venta/Promocion.php create mode 100644 src/Venta/Propiedad.php create mode 100644 src/Venta/Propietario.php create mode 100644 src/Venta/Resciliacion.php create mode 100644 src/Venta/Subsidio.php create mode 100644 src/Venta/Venta.php diff --git a/common/Alias/Model.php b/common/Alias/Model.php new file mode 100644 index 0000000..81df5c6 --- /dev/null +++ b/common/Alias/Model.php @@ -0,0 +1,120 @@ +factory = $factory; + return $this; + } + + protected function validateDefinitions(array $definitions, array $minimum_requirements, array $default_values): array { + foreach ($default_values as $key => $val) { + if (!isset($definitions[$key])) { + $definitions[$key] = $val; + } + } + foreach ($minimum_requirements as $key) { + if (!isset($definitions[$key])) { + $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1); + $class = get_called_class(); + throw new InvalidArgumentException("Missing {$key} in {$trace[1]['function']} called in {$class}."); + } + } + return $definitions; + } + public function parentOf(string $child_class, array $definitions): ?array { + $definitions = $this->validateDefinitions( + $definitions, + [Model::CHILD_KEY, Model::SELF_KEY], + [Model::SELF_KEY => 'id'] + ); + $where = [[$definitions[Model::CHILD_KEY], $this->{$definitions[Model::SELF_KEY]}]]; + return $this->factory->find($child_class)->where($where)->many(); + } + public function childOf(string $parent_class, array $definitions): ?ModelInterface { + $definitions = $this->validateDefinitions( + $definitions, + [Model::PARENT_KEY, Model::SELF_KEY], + [Model::PARENT_KEY => 'id'] + ); + $where = [[$definitions[Model::PARENT_KEY], $this->{$definitions[Model::SELF_KEY]}]]; + return $this->factory->find($parent_class)->where($where)->one(); + } + public function siblingOf(string $sibling_class, string $connecting_table, array $definitions): ?array { + $definitions = $this->validateDefinitions( + $definitions, + [Model::SIBLING_KEY, Model::SIBLING_THROUGH_KEY, Model::SELF_THROUGH_KEY, Model::SELF_KEY], + [Model::SIBLING_KEY => 'id', Model::SELF_KEY => 'id'] + ); + $sibling_table = (new $sibling_class())->getTable(); + $joins = [ + [ + $connecting_table, + "{$connecting_table}.{$definitions[Model::SIBLING_THROUGH_KEY]}", + "{$sibling_table}.{$definitions[Model::SIBLING_KEY]}" + ] + ]; + $where = [ + [$definitions[Model::SIBLING_KEY], "{$connecting_table}.{$definitions[Model::SIBLING_THROUGH_KEY]}"], + ["{$connecting_table}.{$definitions[Model::SELF_THROUGH_KEY]}", $this->{$definitions[Model::SELF_KEY]}] + ]; + return $this->factory + ->find($sibling_class) + ->join($joins) + ->select("{$sibling_table}.*") + ->where($where) + ->many(); + } + + public function toArray(): array { + return $this->as_array(); + } + + protected static function parseInput($input): array { + return array_intersect_key((array) $input, array_combine(static::$fields, static::$fields)); + } + public static function add(ModelFactory $factory, $input): ?ModelInterface { + $data = static::parseInput($input); + $class = get_called_class(); + if (method_exists($class, 'find')) { + $obj = static::find($factory, $input); + } else { + $where = $data; + array_walk($where, function(&$item, $key) { + $item = [$key, $item]; + }); + $where = array_values($where); + $obj = $factory->find($class)->where($where)->one(); + } + if ($obj === null) { + $obj = $factory->create($class, $data); + } + return $obj; + } + public function edit($input): ?array { + $data = static::parseInput($input); + foreach (static::$fields as $field) { + if ($this->{$field} != $data[$field]) { + $this->{$field} = $data[$field]; + } + } + return $this->save(); + } +} diff --git a/common/Controller/Bancos.php b/common/Controller/Bancos.php new file mode 100644 index 0000000..be283cc --- /dev/null +++ b/common/Controller/Bancos.php @@ -0,0 +1,80 @@ +find(Banco::class)->array(); + $url = '' . $request->getUri(); + array_walk($bancos, function (&$item) use ($url) { + $item['link'] = [ + 'rel' => 'banco', + 'title' => $item['nombre'], + 'href' => str_replace('/bancos', "/banco/{$item['id']}", $url) + ]; + }); + return $this->withJson($response, compact('bancos')); + } + public function show(Request $request, Response $response, Factory $factory, $banco_id): Response { + $banco = $factory->find(Banco::class)->one($banco_id); + $output = [ + 'input' => $banco_id, + 'banco' => $banco->toArray(), + 'link' => [ + 'rel' => 'bancos', + 'title' => 'Bancos', + 'href' => str_replace("/banco/{$banco_id}", '/bancos', $request->getUri()) + ] + ]; + return $this->withJson($response, $output); + } + public function add(Request $request, Response $response, Factory $factory): Response { + $post = $request->getParsedBody(); + $output = [ + 'input' => $post + ]; + if (in_array('bancos', $post)) { + $output['bancos'] = []; + foreach ($post['bancos'] as $input) { + $banco = Banco::add($factory, $input); + $banco []= [ + 'banco' => $banco->toArray(), + 'created' => $banco->is_new() ? $banco->save() : false + ]; + } + } elseif (in_array('banco', $post)) { + $banco = Banco::add($factory, $post); + $output['banco'] = $banco; + $output['created'] = $banco->is_new() ? $banco->save() : false; + } + return $this->withJson($response, $output); + } + public function edit(Request $request, Response $response, Factory $factory, $banco_id): Response { + $post = $request->getParsedBody(); + $input = compact('banco_id', 'post'); + $banco = $factory->find(Banco::class)->one($banco_id); + $output = [ + 'input' => $input, + 'banco' => $banco->toArray() + ]; + $output['edited'] = $banco->edit($post); + $output['changes'] = $banco->toArray(); + return $this->withJson($response, $output); + } + public function delete(Request $request, Response $response, Factory $factory, $banco_id): Response { + $banco = $factory->find(Banco::class)->one($banco_id); + $output = [ + 'input' => $banco_id, + 'banco' => $banco->toArray() + ]; + $output['deleted'] = $banco->delete(); + return $this->withJson($response, $output); + } +} diff --git a/common/Controller/Base.php b/common/Controller/Base.php new file mode 100644 index 0000000..2cc7fa2 --- /dev/null +++ b/common/Controller/Base.php @@ -0,0 +1,22 @@ +withJson($response, [ + 'api' => [ + 'version' => '1.0.0' + ] + ]); + } + public function info(Request $request, Response $response): Response { + phpinfo(); + return $response; + } +} diff --git a/common/Controller/Inmobiliarias.php b/common/Controller/Inmobiliarias.php new file mode 100644 index 0000000..e89d5a6 --- /dev/null +++ b/common/Controller/Inmobiliarias.php @@ -0,0 +1,166 @@ +find(Inmobiliaria::class)->array(); + $base_url = str_replace('/inmobiliarias', '{URL}', $request->getUri()); + array_walk($inmobiliarias, function (&$item) use ($base_url) { + $link = [ + 'rel' => 'inmobiliaria', + 'title' => $item['abreviacion'], + 'href' => str_replace('{URL}',"/inmobiliaria/{$item['rut']}", $base_url) + ]; + $item['link'] = $link; + }); + return $this->withJson($response, compact('inmobiliarias')); + } + protected function getInmobiliaria(Factory $factory, $inmobiliaria_rut): bool|Inmobiliaria { + return $factory->find(Inmobiliaria::class)->where([['rut', $inmobiliaria_rut]])->one(); + } + public function show(Request $request, Response $response, Factory $factory, $inmobiliaria_rut): Response { + $inmobiliaria = $this->getInmobiliaria($factory, $inmobiliaria_rut); + $output = [ + 'input' => $inmobiliaria_rut, + 'inmobiliaria' => $inmobiliaria->toArray(), + 'link' => [ + 'rel' => 'inmobiliarias', + 'title' => 'Inmobiliarias', + 'href' => str_replace("/inmobiliaria/{$inmobiliaria_rut}", '/inmobiliarias', $request->getUri()) + ] + ]; + $base_url = str_replace("/inmobiliaria/{$inmobiliaria_rut}", "/inmobiliaria/{$inmobiliaria_rut}{URL}", $request->getUri()); + $output['inmobiliaria']['links'] = [ + [ + 'rel' => 'banco', + 'title' => $inmobiliaria->banco()->nombre, + 'href' => str_replace("/inmobiliaria/{$inmobiliaria_rut}", "/banco/{$inmobiliaria->banco}", $request->getUri()) + ], + [ + 'rel' => 'sociedad', + 'title' => $inmobiliaria->sociedad()->descripcion, + 'href' => str_replace("/inmobiliaria/{$inmobiliaria_rut}", "/sociedad/{$inmobiliaria->sociedad}", $request->getUri()) + ], + [ + 'rel' => 'proyectos', + 'title' => 'Proyectos', + 'href' => str_replace('{URL}', '/proyectos', $base_url) + ] + ]; + return $this->withJson($response, $output); + } + public function add(Request $request, Response $response, Factory $factory): Response { + $post = $request->getParsedBody(); + $output = [ + 'input' => $post + ]; + if (in_array('inmobiliarias', $post)) { + $output['inmobiliarias'] = []; + foreach ($post['inmobiliarias'] as $input) { + $inmobiliaria = Inmobiliaria::add($factory, $input); + $inmobiliarias []= [ + 'inmobiliaria' => $inmobiliaria->toArray(), + 'created' => $inmobiliaria->is_new() ? $inmobiliaria->save() : false + ]; + } + } elseif (in_array('inmobiliaria', $post)) { + $inmobiliaria = Inmobiliaria::add($factory, $post); + $output['inmobiliaria'] = $inmobiliaria; + $output['created'] = $inmobiliaria->is_new() ? $inmobiliaria->save() : false; + } + return $this->withJson($response, $output); + } + public function edit(Request $request, Response $response, Factory $factory, $inmobiliaria_rut): Response { + $post = $request->getParsedBody(); + $input = compact('inmobiliaria_rut', 'post'); + $inmobiliaria = $this->getInmobiliaria($factory, $inmobiliaria_rut); + $output = [ + 'input' => $input, + 'inmobiliaria' => $inmobiliaria->toArray() + ]; + $output['edited'] = $inmobiliaria->edit($post); + $output['changes'] = $inmobiliaria->toArray(); + return $this->withJson($response, $output); + } + public function delete(Request $request, Response $response, Factory $factory, $inmobiliaria_rut): Response { + $inmobiliaria = $this->getInmobiliaria($factory, $inmobiliaria_rut); + $output = [ + 'input' => $inmobiliaria_rut, + 'inmobiliaria' => $inmobiliaria->toArray() + ]; + $output['deleted'] = $inmobiliaria->delete(); + return $this->withJson($response, $output); + } + public function proyectos(Request $request, Response $response, Factory $factory, $inmobiliaria_rut): Response { + $inmobiliaria = $this->getInmobiliaria($factory, $inmobiliaria_rut); + $proyectos = $inmobiliaria?->proyectos(); + $base_url = str_replace("/inmobiliaria/{$inmobiliaria_rut}/proyectos", '{URL}', $request->getUri()); + $output = [ + 'input' => $inmobiliaria_rut, + 'inmobiliaria' => $inmobiliaria->toArray(), + 'proyectos' => ($proyectos) ? array_map(function ($item) use ($base_url) { + $arr = $item->toArray(); + $arr['link'] = [ + 'rel' => 'proyecto', + 'title' => $item->descripcion, + 'href' => str_replace('{URL}', "/proyecto/{$item->id}", $base_url) + ]; + return $arr; + }, $proyectos) : [] + ]; + $output['inmobiliaria']['link'] = [ + 'rel' => 'inmobiliaria', + 'title' => $inmobiliaria->abreviacion, + 'href' => str_replace('{URL}', "/inmobiliaria/{$inmobiliaria_rut}", $base_url) + ]; + return $this->withJson($response, $output); + } + public function sociedad(Request $request, Response $response, Factory $factory, $inmobiliaria_rut): Response { + $inmobiliaria = $this->getInmobiliaria($factory, $inmobiliaria_rut); + $base_url = str_replace("/inmobiliaria/{$inmobiliaria_rut}/sociedad", '{URL}', $request->getUri()); + $output = [ + 'input' => $inmobiliaria_rut, + 'inmobiliaria' => $inmobiliaria->toArray(), + 'sociedad' => $inmobiliaria->sociedad()->toArray() + ]; + $output['inmobiliaria']['link'] = [ + 'rel' => 'inmobiliaria', + 'title' => $inmobiliaria->abreviacion, + 'href' => str_replace('{URL}', "/inmobiliaria/{$inmobiliaria_rut}", $base_url) + ]; + $output['sociedad']['link'] = [ + 'rel' => 'tipo_sociedad', + 'title' => $inmobiliaria->sociedad()->descripcion, + 'href' => str_replace('{URL}', "/tipos/sociedad/{$inmobiliaria->sociedad}", $base_url) + ]; + return $this->withJson($response, $output); + } + public function banco(Request $request, Response $response, Factory $factory, $inmobiliaria_rut): Response { + $inmobiliaria = $this->getInmobiliaria($factory, $inmobiliaria_rut); + $base_url = str_replace("/inmobiliaria/{$inmobiliaria_rut}/banco", '{URL}', $request->getUri()); + $output = [ + 'input' => $inmobiliaria_rut, + 'inmobiliaria' => $inmobiliaria->toArray(), + 'banco' => $inmobiliaria->banco()->toArray() + ]; + $output['inmobiliaria']['link'] = [ + 'rel' => 'inmobiliaria', + 'title' => $inmobiliaria->abreviacion, + 'href' => str_replace('{URL}', "/inmobiliaria/{$inmobiliaria_rut}", $base_url) + ]; + $output['banco']['link'] = [ + 'rel' => 'banco', + 'title' => $inmobiliaria->banco()->nombre, + 'href' => str_replace('{URL}', "/banco/{$inmobiliaria->banco}", $base_url) + ]; + return $this->withJson($response, $output); + } +} diff --git a/common/Controller/Propietarios.php b/common/Controller/Propietarios.php new file mode 100644 index 0000000..44182b9 --- /dev/null +++ b/common/Controller/Propietarios.php @@ -0,0 +1,91 @@ +find(Propietario::class)->array(); + $base_url = str_replace('/propietarios', '{URL}', $request->getUri()); + array_walk($propietarios, function (&$item) use ($base_url) { + $link = [ + 'rel' => 'propietario', + 'title' => implode(' ', [$item['nombres'], $item['apellido_paterno'], $item['apellido_materno']]), + 'href' => str_replace('{URL}', "/propietario/{$item['rut']}", $base_url) + ]; + $item['link'] = $link; + }); + return $this->withJson($response, compact('propietarios')); + } + protected function get(Factory $factory, string $class, $rut) { + return $factory->find($class)->where([['rut', $rut]])->one(); + } + public function show(Request $request, Response $response, Factory $factory, $propietario_rut): Response { + $propietario = $this->get($factory, Propietario::class, $propietario_rut); + $output = [ + 'input' => $propietario_rut, + 'propietario' => $propietario->toArray(), + 'link' => [ + 'rel' => 'propietarios', + 'title' => 'Propietarios', + 'href' => str_replace("/propietario/{$propietario_rut}", '/propietarios', $request->getUri()) + ] + ]; + $output['links'] = [ + [ + 'rel' => 'direccion', + 'title' => $propietario->direccion()->calle, + 'href' => str_replace("/propietario/{$propietario_rut}", "/direccion/{$propietario->direccion}", $request->getUri()) + ] + ]; + return $this->withJson($response, $output); + } + public function add(Request $request, Response $response, Factory $factory): Response { + $post = $request->getParsedBody(); + $output = [ + 'input' => $post + ]; + if (in_array('propietarios', $post)) { + $output['propietarios'] = []; + foreach ($post['propietarios'] as $input) { + $propietario = Propietario::add($factory, $input); + $propietario []= [ + 'propietario' => $propietario->toArray(), + 'created' => $propietario->is_new() ? $propietario->save() : false + ]; + } + } elseif (in_array('propietario', $post)) { + $propietario = Propietario::add($factory, $post); + $output['propietario'] = $propietario; + $output['created'] = $propietario->is_new() ? $propietario->save() : false; + } + return $this->withJson($response, $output); + } + public function edit(Request $request, Response $response, Factory $factory, $propietario_rut): Response { + $post = $request->getParsedBody(); + $input = compact('propietario_rut', 'post'); + $propietario = $this->get($factory, Propietario::class, $propietario_rut); + $output = [ + 'input' => $input, + 'propietario' => $propietario->toArray() + ]; + $output['edited'] = $propietario->edit($post); + $output['changes'] = $propietario->toArray(); + return $this->withJson($response, $output); + } + public function delete(Request $request, Response $response, Factory $factory, $propietario_rut): Response { + $propietario = $this->get($factory, Propietario::class, $propietario_rut); + $output = [ + 'input' => $propietario_rut, + 'propietario' => $propietario->toArray() + ]; + $output['deleted'] = $propietario->delete(); + return $this->withJson($response, $output); + } +} diff --git a/common/Controller/Proyectos.php b/common/Controller/Proyectos.php new file mode 100644 index 0000000..6e7136b --- /dev/null +++ b/common/Controller/Proyectos.php @@ -0,0 +1,93 @@ +find(Proyecto::class)->array(); + $base_url = str_replace('/proyectos', '{URL}', $request->getUri()); + array_walk($proyectos, function (&$item) use ($base_url) { + $link = [ + 'rel' => 'proyecto', + 'title' => $item['descripcion'], + 'href' => str_replace('{URL}', "/proyecto/{$item['id']}", $base_url) + ]; + $item['link'] = $link; + }); + return $this->withJson($response, compact('proyectos')); + } + public function show(Request $request, Response $response, Factory $factory, $proyecto_id): Response { + $proyecto = $factory->find(Proyecto::class)->one($proyecto_id); + $output = [ + 'input' => $proyecto_id, + 'proyecto' => $proyecto->toArray(), + 'link' => [ + 'rel' => 'proyectos', + 'title' => 'Proyectos', + 'href' => str_replace("/proyecto/{$proyecto_id}", '/proyectos', $request->getUri()) + ] + ]; + $output['links'] = [ + [ + 'rel' => 'inmobiliaria', + 'title' => $proyecto->inmobiliaria()->abreviacion, + 'href' => str_replace("/proyecto/{$proyecto_id}", "/inmobiliaria/{$proyecto->inmobiliaria()->rut}", $request->getUri()) + ], + [ + 'rel' => 'direccion', + 'title' => $proyecto->direccion()->calle, + 'href' => str_replace("/proyecto/{$proyecto_id}", "/direccion/{$proyecto->direccion}", $request->getUri()) + ] + ]; + return $this->withJson($response, $output); + } + public function add(Request $request, Response $response, Factory $factory): Response { + $post = $request->getParsedBody(); + $output = [ + 'input' => $post + ]; + if (in_array('proyectos', $post)) { + $output['proyectos'] = []; + foreach ($post['proyectos'] as $input) { + $proyecto = Proyecto::add($factory, $input); + $proyecto []= [ + 'proyecto' => $proyecto->toArray(), + 'created' => $proyecto->is_new() ? $proyecto->save() : false + ]; + } + } elseif (in_array('proyecto', $post)) { + $proyecto = Proyecto::add($factory, $post); + $output['proyecto'] = $proyecto; + $output['created'] = $proyecto->is_new() ? $proyecto->save() : false; + } + return $this->withJson($response, $output); + } + public function edit(Request $request, Response $response, Factory $factory, $proyecto_id): Response { + $post = $request->getParsedBody(); + $input = compact('proyecto_id', 'post'); + $proyecto = $factory->find(Proyecto::class)->one($proyecto_id); + $output = [ + 'input' => $input, + 'proyecto' => $proyecto->toArray() + ]; + $output['edited'] = $proyecto->edit($post); + $output['changes'] = $proyecto->toArray(); + return $this->withJson($response, $output); + } + public function delete(Request $request, Response $response, Factory $factory, $proyecto_id): Response { + $proyecto = $factory->find(Proyecto::class)->one($proyecto_id); + $output = [ + 'input' => $proyecto_id, + 'proyecto' => $proyecto->toArray() + ]; + $output['deleted'] = $proyecto->delete(); + return $this->withJson($response, $output); + } +} diff --git a/common/Controller/Sociedades.php b/common/Controller/Sociedades.php new file mode 100644 index 0000000..3233e2b --- /dev/null +++ b/common/Controller/Sociedades.php @@ -0,0 +1,39 @@ +find(TipoSociedad::class)->array(); + $base_url = str_replace('/sociedades', '{URL}', $request->getUri()); + array_walk($sociedades, function (&$item) use ($base_url) { + $link = [ + 'rel' => 'sociedad', + 'title' => $item['descripcion'], + 'href' => str_replace('{URL}', "/sociedad/{$item['id']}", $base_url) + ]; + $item['link'] = $link; + }); + return $this->withJson($response, compact('sociedades')); + } + public function show(Request $request, Response $response, Factory $factory, $sociedad_id): Response { + $sociedad = $factory->find(TipoSociedad::class)->one($sociedad_id); + $output = [ + 'input' => $sociedad_id, + 'sociedad' => $sociedad->toArray(), + 'link' => [ + 'rel' => 'sociedades', + 'title' => 'Sociedades', + 'href' => str_replace("/sociedad/{$sociedad_id}", '/sociedades', $request->getUri()) + ] + ]; + return $this->withJson($response, $output); + } +} diff --git a/common/Controller/Ventas.php b/common/Controller/Ventas.php new file mode 100644 index 0000000..ba3025a --- /dev/null +++ b/common/Controller/Ventas.php @@ -0,0 +1,92 @@ +find(Venta::class)->array(); + $url = '' . $request->getUri(); + array_walk($ventas, function (&$item) use ($url) { + $item['link'] = [ + 'rel' => 'venta', + 'title' => 'Venta', + 'href' => str_replace('/ventas', "/venta/{$item['id']}", $url) + ]; + }); + return $this->withJson($response, compact('ventas')); + } + public function show(Request $request, Response $response, Factory $factory, $venta_id): Response { + $venta = $factory->find(Venta::class)->one($venta_id); + $output = [ + 'input' => $venta_id, + 'venta' => $venta->toArray(), + 'link' => [ + 'rel' => 'ventas', + 'title' => 'Ventas', + 'href' => str_replace("/venta/{$venta_id}", '/ventas', $request->getUri()) + ] + ]; + $output['links'] = [ + [ + 'rel' => 'propietario', + 'title' => $venta->propietario()->nombreCompleto(), + 'href' => str_replace("/venta/{$venta_id}", "/propietario/{$venta->propietario}", $request->getUri()) + ], + [ + 'rel' => 'propiedad', + 'title' => 'Propiedad', + 'href' => str_replace("/venta/{$venta_id}", "/propiedad/{$venta->propiedad}", $request->getUri()) + ] + ]; + return $this->withJson($response, $output); + } + public function add(Request $request, Response $response, Factory $factory): Response { + $post = $request->getParsedBody(); + $output = [ + 'input' => $post + ]; + if (in_array('ventas', $post)) { + $output['ventas'] = []; + foreach ($post['ventas'] as $input) { + $venta = Venta::add($factory, $input); + $venta []= [ + 'venta' => $venta->toArray(), + 'created' => $venta->is_new() ? $venta->save() : false + ]; + } + } elseif (in_array('venta', $post)) { + $venta = Venta::add($factory, $post); + $output['venta'] = $venta; + $output['created'] = $venta->is_new() ? $venta->save() : false; + } + return $this->withJson($response, $output); + } + public function edit(Request $request, Response $response, Factory $factory, $venta_id): Response { + $post = $request->getParsedBody(); + $input = compact('venta_id', 'post'); + $venta = $factory->find(Venta::class)->one($venta_id); + $output = [ + 'input' => $input, + 'venta' => $venta->toArray() + ]; + $output['edited'] = $venta->edit($post); + $output['changes'] = $venta->toArray(); + return $this->withJson($response, $output); + } + public function delete(Request $request, Response $response, Factory $factory, $venta_id): Response { + $venta = $factory->find(Venta::class)->one($venta_id); + $output = [ + 'input' => $venta_id, + 'venta' => $venta->toArray() + ]; + $output['deleted'] = $venta->delete(); + return $this->withJson($response, $output); + } +} diff --git a/common/Define/Controller/Json.php b/common/Define/Controller/Json.php new file mode 100644 index 0000000..f49805b --- /dev/null +++ b/common/Define/Controller/Json.php @@ -0,0 +1,13 @@ +getBody()->write(json_encode($data, JSON_UNESCAPED_SLASHES)); + return $response + ->withStatus($status) + ->withHeader('content-type', 'application/json'); + } +} diff --git a/common/Define/Model.php b/common/Define/Model.php new file mode 100644 index 0000000..0356d9e --- /dev/null +++ b/common/Define/Model.php @@ -0,0 +1,62 @@ +find($class); + } + protected function reset(): Model { + $resets = ['columns', 'joins', 'conditions', 'groups', 'orders', 'having', 'limit', 'offset']; + foreach ($resets as $r) { + $this->{$r} = null; + } + return $this; + } + + public function create(string $model_class, array $data = null): bool|ModelInterface { + // Check if it already exists + if ($data !== null) { + $model = $this->find($model_class); + foreach ($data as $f => $v) { + $model = $model->where([[$f, $v]]); + } + $model = $model->one(); + if ($model !== null) { + return $model; + } + } + $model = BaseModel::factory($model_class)->create($data); + if (is_a($model, \ORMWrapper::class)) { + $model = $model->find_one(); + } + $model->setFactory($this); + return $model; + } + + protected string $class; + public function find(string $class): Model { + $this->reset(); + if (!class_exists($class)) { + throw new InvalidArgumentException("Model {$class} not found."); + } + $this->class = $class; + return $this; + } + + protected ?array $columns; + public function select($columns): Model { + if (!is_array($columns)) { + $columns = [$columns]; + } + foreach ($columns as $c) { + $this->addColumn($c); + } + return $this; + } + protected function addColumn($column) { + $col = [ + 'table' => '', + 'column' => $column + ]; + if (is_array($column)) { + $col['table'] = $column['table'] ?? $column[0]; + $col['column'] = $column['column'] ?? $column[1]; + } + $this->columns []= $col; + } + protected function parseColumns(ORM $orm): ORM { + if ($this->columns === null) { + return $orm; + } + foreach ($this->columns as $column) { + $orm = $orm->select("{$column['table']}.{$column['column']}"); + } + return $orm; + } + + protected ?array $joins; + public function join($joins): Model { + foreach ($joins as $join) { + $this->addJoin($join); + } + return $this; + } + protected function addJoin($join) { + $map = [ + 'table' => ['table', 't', 0], + 'from' => ['from', 'f', 1], + 'to' => ['to', 2], + 'operator' => ['operator', 'op', 'o', 3], + 'type' => 'type', + 'alias' => 'alias', + 'params' => ['parameters', 'params'] + ]; + $defaults = ['operator' => '=', 'type' => 'inner']; + $required = ['table', 'from', 'to', 'operator', 'type']; + + $j = []; + foreach ($join as $key => $val) { + $k = -1; + foreach ($map as $i => $m) { + if (is_array($m)) { + if (in_array($key, $m)) { + $k = $i; + break; + } + continue; + } + if ($m == $key) { + $k = $i; + } + } + $j[$k] = $val; + } + foreach ($defaults as $key => $val) { + if (!isset($j[$key])) { + $j[$key] = $val; + } + } + foreach ($required as $key) { + if (!isset($j[$key])) { + throw new InvalidArgumentException("Missing {$key} when joining in " . get_class()); + } + } + $this->joins []= (object) $j; + } + protected function parseJoins(ORM $orm): ORM { + if ($this->joins === null) { + return $orm; + } + foreach ($this->joins as $join) { + $method = match(strtolower($join->type)) { + 'raw' => 'rawJoin', + 'inner' => 'innerJoin', + 'left', 'left outer', 'left_outer', 'leftouter' => 'leftOuterJoin', + 'right', 'right outer', 'right_outer', 'rightouter' => 'rightOuterJoin', + 'full', 'full outer', 'full_outer', 'fullouter', 'outer' => 'fullOuterJoin' + }; + if (strtolower($join->type) == 'raw') { + if (isset($join->alias)) { + $orm = $orm->{$method}($join->table, [$join->from, $join->operator, $join->to], $join->alias, $join->params); + } else { + $orm = $orm->{$method}($join->table, [$join->from, $join->operator, $join->to], $join->params); + } + } + if (isset($join->alias)) { + $orm = $orm->{$method}($join->table, [$join->from, $join->operator, $join->to], $join->alias); + } else { + $orm = $orm->{$method}($join->table, [$join->from, $join->operator, $join->to]); + } + } + return $orm; + } + + protected ?array $conditions; + public function where(array $conditions): Model { + foreach ($conditions as $condition) { + $this->addCondition($condition); + } + return $this; + } + protected function addCondition(array $condition) { + $map = [ + 'column' => ['column', 'field', 'col', 'c', 'f', 0], + 'value' => ['value', 'val', 'v', 1], + 'operator' => ['operator', 'op', 'o', 'type', 't', 2] + ]; + $defaults = ['operator' => '=', 'type' => 'eq']; + $required = ['column', 'value', 'operator']; + + $c = []; + foreach ($condition as $key => $val) { + $k = -1; + foreach ($map as $i => $m) { + if (is_array($m)) { + if (in_array($key, $m)) { + $k = $i; + break; + } + continue; + } + if ($key == $m) { + $k = $i; + } + } + $c[$k] = $val; + } + foreach ($defaults as $key => $val) { + if (!isset($c[$key])) { + $c[$key] = $val; + } + } + foreach ($required as $key) { + if (!isset($c[$key])) { + throw new InvalidArgumentException("Missing {$key} when adding conditions in " . get_class()); + } + } + $this->conditions []= (object) $c; + } + protected function parseConditions(ORM $orm): ORM { + if ($this->conditions === null) { + return $orm; + } + foreach ($this->conditions as $condition) { + $method = match(strtolower($condition->operator)) { + '', '=', 'eq', 'equal', 'equals' => 'where', + '<', 'lt', 'less than', 'less_than', 'lessthan' => 'whereLt', + '<=', 'lte', 'less equal', 'less equals', 'less_equal', 'less_equals', 'lessequal', 'lessequals', + 'less than equal', 'less than equals', 'less_than_equal', 'less_than_equals', 'lessthanequal', + 'lessthanequals' => 'whereLte', + '>', 'gt', 'greater than', 'greater_than', 'greaterthan' => 'whereGt', + '>=', 'gte', 'greater equal', 'greater equals', 'greater_equal', 'greater_equals', 'greaterequal', + 'greaterequals', 'greater than equal', 'greater than equals', 'greater_than_equal', 'greater_than_equals', + 'greaterthanequal', 'greaterthanequals' => 'whereGte', + '!=', 'not equal', 'not equals', 'not_equal', 'not_equals', 'notequal', 'notequals' => 'whereNotEqual', + 'like' => 'whereLike', + 'not like', 'not_like', 'notlike' => 'whereNotLike', + 'in' => 'whereIn', + 'not in', 'not_in', 'notin' => 'whereNotIn', + 'raw' => 'raw' + }; + $orm = $orm->{$method}($condition->column, $condition->value); + } + return $orm; + } + + protected ?array $groups; + public function group($groups): Model { + if (!is_array($groups)) { + $groups = [$groups]; + } + foreach ($groups as $group) { + $this->addGroup($group); + } + return $this; + } + protected function addGroup(string $group) { + $this->groups []= $group; + } + protected function parseGroups(ORM $orm): ORM { + if ($this->groups === null) { + return $orm; + } + foreach ($this->groups as $group) { + if (str_contains($group, '(')) { + $orm = $orm->groupByExpr($group); + continue; + } + $orm = $orm->groupBy($group); + } + return $orm; + } + + protected ?array $orders; + public function order($orders): Model { + if (!is_array($orders)) { + $orders = [$orders]; + } + foreach ($orders as $order) { + $this->addOrder($order); + } + return $this; + } + protected function addOrder($order) { + $defaults = ['direction' => 'asc']; + $required = ['column', 'direction']; + $o = []; + foreach ($order as $key => $val) { + $k = match (strtolower($key)) { + 'column', 'col', 'c', 0 => 'column', + 'direction', 'dir', 'd', 1 => 'direction' + }; + $o[$k] = $val; + } + foreach ($defaults as $key => $val) { + if (!isset($o[$key])) { + $o[$key] = $val; + } + } + foreach ($required as $key) { + if (!isset($o[$key])) { + throw new InvalidArgumentException("Missing {$key} in order."); + } + } + $this->orders []= (object) $o; + } + protected function parseOrders(ORM $orm): ORM { + if ($this->orders === null) { + return $orm; + } + foreach ($this->orders as $order) { + if (str_contains($order->column, '(')) { + $orm = $orm->orderByExpr($order->column); + continue; + } + $method = match (strtolower($order->direction)) { + 'ascending', 'asc', '' => 'orderByAsc', + 'descending', 'desc' => 'orderByDesc' + }; + $orm = $orm->{$method}($order->column); + } + return $orm; + } + + protected ?int $limit; + public function limit(int $limit): Model { + $this->limit = $limit; + return $this; + } + protected function parseLimit(ORM $orm): ORM { + if ($this->limit === null) { + return $orm; + } + return $orm->limit($this->limit); + } + + protected ?int $offset; + public function offset(int $offset): Model { + $this->offset = $offset; + return $this; + } + protected function parseOffset(ORM $orm): ORM { + if ($this->offset === null) { + return $orm; + } + return $orm->offset($this->offset); + } + + public function build(): ORM { + $orm = BaseModel::factory($this->class); + $methods = [ + 'columns', + 'joins', + 'conditions', + 'groups', + 'orders', + 'limit', + 'offset' + ]; + foreach ($methods as $m) { + $method = 'parse' . ucfirst($m); + $orm = $this->{$method}($orm); + } + return $orm; + } + + public function one(?int $id = null): bool|ModelInterface { + $result = $this->build()->find_one($id); + if ($result !== false) { + $result->setFactory($this); + } + return $result; + } + public function many(): bool|array { + $results = $this->build()->find_many(); + if ($results !== false) { + foreach ($results as &$result) { + $result->setFactory($this); + } + } + return $results; + } + public function array(): ?array { + $results = $this->many(); + if ($results === false) { + return null; + } + return array_map(function($item) { + return $item->toArray(); + }, $results); + } +} diff --git a/common/Middleware/Auth.php b/common/Middleware/Auth.php new file mode 100644 index 0000000..38dde05 --- /dev/null +++ b/common/Middleware/Auth.php @@ -0,0 +1,30 @@ +service = $service; + $this->factory = $factory; + $this->exceptions = $exception_routes; + } + public function __invoke(Request $request, Handler $handler): Response { + $path = $request->getUri()->getPath(); + if (in_array($path, $this->exceptions) or $this->service->isValid($request)) { + return $handler->handle($request); + } + $response = $this->factory->createResponse(); + $response->getBody()->write(json_encode(['message' => 'Not authorized.'])); + return $response + ->withStatus(401) // unauthorized + ->withHeader('content-type', 'application/json'); + } +} diff --git a/common/Service/Auth.php b/common/Service/Auth.php new file mode 100644 index 0000000..b0ad30c --- /dev/null +++ b/common/Service/Auth.php @@ -0,0 +1,51 @@ +key = $key; + } + public function isValid(Request $request): bool { + $api_key = ''; + if ($request->hasHeader('Authorization')) { + $api_key = $request->getHeader('Authorization'); + if (is_array($api_key)) { + $api_key = $api_key[0]; + } + if (str_contains($api_key, 'Bearer')) { + $api_key = explode(' ', $api_key)[1]; + } + } elseif ($request->getParsedBody() !== null and in_array('API_KEY', $request->getParsedBody())) { + $api_key = $request->getParsedBody()['API_KEY']; + } elseif ($request->getQueryParams() !== null and in_array('API_KEY', array_keys($request->getQueryParams()))) { + $api_key = $request->getQueryParams()['API_KEY']; + } + if ($this->key == $api_key) { + return true; + } + return false; + } + public function generate(int $length = 32, bool $removeSimilarCharacters = true): string { + $token = ""; + try { + $bytesWithMargin = random_bytes($length*3); + + $base64 = base64_encode($bytesWithMargin); + $purified = preg_replace("/[+=\/.]/", "", $base64); + + if ($removeSimilarCharacters){ + $purified = preg_replace("/[I1l0Oo]/", "", $purified); + } + + $token = substr($purified, 0, $length); + + } catch (\Exception $e){ + echo $e->getMessage(); + } + + return $token; + } +} diff --git a/public/index.php b/public/index.php new file mode 100644 index 0000000..7785631 --- /dev/null +++ b/public/index.php @@ -0,0 +1,7 @@ +run(); diff --git a/resources/routes/auth.php b/resources/routes/auth.php new file mode 100644 index 0000000..83f7a11 --- /dev/null +++ b/resources/routes/auth.php @@ -0,0 +1,12 @@ +get('/auth/generate', function(Request $request, Response $response, Service $service): Response { + $key = $service->generate(); + $response->getBody()->write(json_encode(['key' => $key])); + return $response + ->withStatus(200) + ->withHeader('content-type', 'application/json'); +}); diff --git a/resources/routes/bancos.php b/resources/routes/bancos.php new file mode 100644 index 0000000..156b242 --- /dev/null +++ b/resources/routes/bancos.php @@ -0,0 +1,12 @@ +group('/bancos', function ($app) { + $app->post('/add[/]', [Bancos::class, 'add']); + $app->get('[/]', Bancos::class); +}); +$app->group('/banco/{banco_id}', function ($app) { + $app->put('/edit[/]', [Bancos::class, 'edit']); + $app->delete('/delete[/]', [Bancos::class, 'delete']); + $app->get('[/]', [Bancos::class, 'show']); +}); diff --git a/resources/routes/base.php b/resources/routes/base.php new file mode 100644 index 0000000..5205d2c --- /dev/null +++ b/resources/routes/base.php @@ -0,0 +1,5 @@ +get('[/]', Base::class); +$app->get('/php/info[/]', [Base::class, 'info']); diff --git a/resources/routes/inmobiliarias.php b/resources/routes/inmobiliarias.php new file mode 100644 index 0000000..a12800e --- /dev/null +++ b/resources/routes/inmobiliarias.php @@ -0,0 +1,13 @@ +group('/inmobiliarias', function ($app) { + $app->post('/add[/]', [Inmobiliarias::class, 'add']); + $app->get('[/]', Inmobiliarias::class); +}); +$app->group('/inmobiliaria/{inmobiliaria_rut}', function ($app) { + $app->get('/proyectos[/]', [Inmobiliarias::class, 'proyectos']); + $app->put('/edit[/]', [Inmobiliarias::class, 'edit']); + $app->delete('/delete[/]', [Inmobiliarias::class, 'delete']); + $app->get('[/]', [Inmobiliarias::class, 'show']); +}); diff --git a/resources/routes/propietarios.php b/resources/routes/propietarios.php new file mode 100644 index 0000000..07419db --- /dev/null +++ b/resources/routes/propietarios.php @@ -0,0 +1,12 @@ +group('/propietarios', function ($app) { + $app->post('/add[/]', [Propietarios::class, 'add']); + $app->get('[/]', Propietarios::class); +}); +$app->group('/propietario/{propietario_rut}', function ($app) { + $app->put('/edit[/]', [Propietarios::class, 'edit']); + $app->delete('/edit[/]', [Propietarios::class, 'delete']); + $app->get('[/]', [Propietarios::class, 'show']); +}); diff --git a/resources/routes/proyectos.php b/resources/routes/proyectos.php new file mode 100644 index 0000000..be72690 --- /dev/null +++ b/resources/routes/proyectos.php @@ -0,0 +1,12 @@ +group('/proyectos', function ($app) { + $app->post('/add[/]', [Proyectos::class, 'add']); + $app->get('[/]', Proyectos::class); +}); +$app->group('/proyecto/{proyecto_id}', function ($app) { + $app->put('/edit[/]', [Proyectos::class, 'edit']); + $app->delete('/edit[/]', [Proyectos::class, 'delete']); + $app->get('[/]', [Proyectos::class, 'show']); +}); diff --git a/resources/routes/tipos.php b/resources/routes/tipos.php new file mode 100644 index 0000000..8c70c52 --- /dev/null +++ b/resources/routes/tipos.php @@ -0,0 +1,16 @@ +group('/tipos', function ($app) use ($folder) { + $files = new DirectoryIterator($folder); + foreach ($files as $file) { + if ($file->isDir() or $file->getExtension() !== 'php') { + continue; + } + include_once $file->getRealPath(); + } + }); +} diff --git a/resources/routes/tipos/sociedades.php b/resources/routes/tipos/sociedades.php new file mode 100644 index 0000000..98f6356 --- /dev/null +++ b/resources/routes/tipos/sociedades.php @@ -0,0 +1,12 @@ +group('/sociedades', function ($app) { + $app->post('/add[/]', [Sociedades::class, 'add']); + $app->get('[/]', Sociedades::class); +}); +$app->group('/sociedad/{sociedad_id}', function ($app) { + $app->put('/edit[/]', [Sociedades::class, 'edit']); + $app->delete('/edit[/]', [Sociedades::class, 'delete']); + $app->get('[/]', [Sociedades::class, 'show']); +}); diff --git a/resources/routes/ventas.php b/resources/routes/ventas.php new file mode 100644 index 0000000..14b4bd4 --- /dev/null +++ b/resources/routes/ventas.php @@ -0,0 +1,12 @@ +group('/ventas', function ($app) { + $app->post('/add[/]', [Ventas::class, 'add']); + $app->get('[/]', Ventas::class); +}); +$app->group('/venta/{venta_id}', function ($app) { + $app->put('/edit[/]', [Ventas::class, 'edit']); + $app->delete('/edit[/]', [Ventas::class, 'delete']); + $app->get('[/]', [Ventas::class, 'show']); +}); diff --git a/setup/app.php b/setup/app.php new file mode 100644 index 0000000..f4f511b --- /dev/null +++ b/setup/app.php @@ -0,0 +1,53 @@ +isDir()) { + continue; + } + $builder->addDefinitions($file->getRealPath()); + } +} + +$container = $builder->build(); +$app = Bridge::create($container); +if ($app->getContainer()->has('base_url')) { + $app->setBasePath($app->getContainer()->get('base_url')); +} + +$folder = implode(DIRECTORY_SEPARATOR, [ + __DIR__, + 'middlewares' +]); +if (file_exists($folder)) { + $files = new DirectoryIterator($folder); + foreach ($files as $file) { + if ($file->isDir() and $file->getExtension() != 'php') { + continue; + } + include_once $file->getRealPath(); + } +} + +$app->addRoutingMiddleware(); + +include_once 'databases.php'; +include_once 'router.php'; diff --git a/setup/composer.php b/setup/composer.php new file mode 100644 index 0000000..c3360d5 --- /dev/null +++ b/setup/composer.php @@ -0,0 +1,6 @@ +getContainer()->get('database'); + +foreach ($database->databases as $name => $settings) { + switch (strtolower($settings->engine)) { + case 'mysql': + $dsn = "mysql:host={$settings->host->name};dbname={$settings->name}" . (isset($settings->host->port) ? ';port=' . $settings->host->port : ''); + ORM::configure([ + 'connection_string' => $dsn, + 'username' => $settings->user->name, + 'password' => $settings->user->password + ], null, $name); + break; + } + if (isset($settings->logging) and $settings->logging) { + ORM::configure('logging', true, $name); + } + if (isset($settings->caching) and $settings->caching) { + ORM::configure('caching', true, $name); + } +} +if (isset($database->short_names) and $database->short_names) { + Model::$short_table_names = true; +} diff --git a/setup/middlewares/01_error.php b/setup/middlewares/01_error.php new file mode 100644 index 0000000..fb9d456 --- /dev/null +++ b/setup/middlewares/01_error.php @@ -0,0 +1,4 @@ +add($app->getContainer()->get(Zeuxisoo\Whoops\Slim\WhoopsMiddleware::class)); diff --git a/setup/middlewares/02_auth.php b/setup/middlewares/02_auth.php new file mode 100644 index 0000000..9e399ea --- /dev/null +++ b/setup/middlewares/02_auth.php @@ -0,0 +1,2 @@ +add($app->getContainer()->get(Incoviba\API\Common\Middleware\Auth::class)); diff --git a/setup/router.php b/setup/router.php new file mode 100644 index 0000000..5fee462 --- /dev/null +++ b/setup/router.php @@ -0,0 +1,9 @@ +getContainer()->get('folders')->routes; +$files = new DirectoryIterator($folder); +foreach ($files as $file) { + if ($file->isDir() or $file->getExtension() != 'php') { + continue; + } + include_once $file->getRealPath(); +} diff --git a/setup/settings/01_env.php b/setup/settings/01_env.php new file mode 100644 index 0000000..d59e03d --- /dev/null +++ b/setup/settings/01_env.php @@ -0,0 +1,5 @@ + $_ENV['DEBUG'] ?? false, + 'AUTH_KEY' => $_ENV['API_KEY'] +]; diff --git a/setup/settings/02_databases.php b/setup/settings/02_databases.php new file mode 100644 index 0000000..15bb617 --- /dev/null +++ b/setup/settings/02_databases.php @@ -0,0 +1,24 @@ + function() { + $arr = [ + 'default' => (object) [ + 'engine' => 'mysql', + 'host' => (object) [ + 'name' => $_ENV['MYSQL_HOST'] ?? 'db' + ], + 'user' => (object) [ + 'name' => $_ENV['MYSQL_USER'], + 'password' => $_ENV['MYSQL_PASSWORD'] + ], + 'name' => $_ENV['MYSQL_DATABASE'], + 'logging' => true, + 'caching' => true + ] + ]; + return (object) [ + 'short_names' => true, + 'databases' => $arr + ]; + } +]; diff --git a/setup/settings/03_common.php b/setup/settings/03_common.php new file mode 100644 index 0000000..67cf060 --- /dev/null +++ b/setup/settings/03_common.php @@ -0,0 +1,15 @@ + function() { + $arr = ['base' => dirname(__FILE__, 3)]; + $arr['resources'] = implode(DIRECTORY_SEPARATOR, [ + $arr['base'], + 'resources' + ]); + $arr['routes'] = implode(DIRECTORY_SEPARATOR, [ + $arr['resources'], + 'routes' + ]); + return (object) $arr; + } +]; diff --git a/setup/setups/01_env.php b/setup/setups/01_env.php new file mode 100644 index 0000000..6e4141b --- /dev/null +++ b/setup/setups/01_env.php @@ -0,0 +1,11 @@ + function(Container $c) { + return new Zeuxisoo\Whoops\Slim\WhoopsMiddleware([ + 'enable' => $c->get('debug'), + 'editor' => 'vscode' + ]); + } +]; \ No newline at end of file diff --git a/setup/setups/02_auth.php b/setup/setups/02_auth.php new file mode 100644 index 0000000..86304c6 --- /dev/null +++ b/setup/setups/02_auth.php @@ -0,0 +1,15 @@ + function(Container $c) { + return new Incoviba\API\Common\Service\Auth($c->get('AUTH_KEY')); + }, + Incoviba\API\Common\Middleware\Auth::class => function(Container $c) { + return new Incoviba\API\Common\Middleware\Auth( + $c->get(Incoviba\API\Common\Service\Auth::class), + $c->get(Slim\Psr7\Factory\ResponseFactory::class), + ['/auth/generate'] + ); + } +]; diff --git a/src/Common/Banco.php b/src/Common/Banco.php new file mode 100644 index 0000000..8d655bf --- /dev/null +++ b/src/Common/Banco.php @@ -0,0 +1,13 @@ +comuna_o === null) { + $this->comuna_o = $this->childOf(Comuna::class, [Model::SELF_KEY => 'comuna']); + } + return $this->comuna_o; + } +} diff --git a/src/Common/Provincia.php b/src/Common/Provincia.php new file mode 100644 index 0000000..044d5cf --- /dev/null +++ b/src/Common/Provincia.php @@ -0,0 +1,29 @@ +region_o === null) { + $this->region_o = $this->childOf(Region::class, [Model::SELF_KEY => 'region']); + } + return $this->region_o; + } + protected ?array $comunas; + public function comunas(): ?array { + if ($this->comunas === null) { + $this->comunas = $this->parentOf(Comuna::class, [Model::CHILD_KEY => 'provincia']); + } + return $this->comunas; + } +} diff --git a/src/Common/Region.php b/src/Common/Region.php new file mode 100644 index 0000000..977a7be --- /dev/null +++ b/src/Common/Region.php @@ -0,0 +1,23 @@ +provincias === null) { + $this->provincias = $this->parentOf(Provincia::class, [Model::CHILD_KEY => 'region']); + } + return $this->provincias; + } +} diff --git a/src/Inmobiliaria/Inmobiliaria.php b/src/Inmobiliaria/Inmobiliaria.php new file mode 100644 index 0000000..6ec69ea --- /dev/null +++ b/src/Inmobiliaria/Inmobiliaria.php @@ -0,0 +1,44 @@ +banco_o === null) { + $this->banco_o = $this->childOf(Banco::class, [Model::SELF_KEY => 'banco']); + } + return $this->banco_o; + } + protected $sociedad_o; + public function sociedad() { + if ($this->sociedad_o === null) { + $this->sociedad_o = $this->childOf(TipoSociedad::class, [Model::SELF_KEY => 'sociedad']); + } + return $this->sociedad_o; + } + + protected $proyectos; + public function proyectos(): ?array { + if ($this->proyectos === null) { + $this->proyectos = $this->parentOf(Proyecto::class, [Model::CHILD_KEY => 'inmobiliaria', Model::SELF_KEY => 'rut']); + } + return $this->proyectos; + } +} diff --git a/src/Inmobiliaria/TipoSociedad.php b/src/Inmobiliaria/TipoSociedad.php new file mode 100644 index 0000000..e3f2892 --- /dev/null +++ b/src/Inmobiliaria/TipoSociedad.php @@ -0,0 +1,9 @@ +direccion_o === null) { + $this->direccion_o = $this->childOf(Direccion::class, [Model::SELF_KEY => 'direccion']); + } + return $this->direccion_o; + } + protected $inmobiliaria_o; + public function inmobiliaria() { + if ($this->inmobiliaria_o === null) { + $this->inmobiliaria_o = $this->childOf(Inmobiliaria::class, [Model::SELF_KEY => 'inmobiliaria', Model::PARENT_KEY => 'rut']); + } + return $this->inmobiliaria_o; + } +} diff --git a/src/Venta/Agente.php b/src/Venta/Agente.php new file mode 100644 index 0000000..7d46f08 --- /dev/null +++ b/src/Venta/Agente.php @@ -0,0 +1,6 @@ +direccion_o === null) { + $this->direccion_o = $this->childOf(Direccion::class, [Model::SELF_KEY => 'direccion']); + } + return $this->direccion_o; + } + + public function nombreCompleto() { + return implode(' ', [ + $this->nombres, + $this->apellidos() + ]); + } + public function apellidos() { + return implode(' ', [ + $this->apellido_paterno, + $this->apellido_materno + ]); + } +} diff --git a/src/Venta/Resciliacion.php b/src/Venta/Resciliacion.php new file mode 100644 index 0000000..cb3b321 --- /dev/null +++ b/src/Venta/Resciliacion.php @@ -0,0 +1,6 @@ +propietario_o === null) { + $this->propietario_o = $this->childOf(Propietario::class, [Model::SELF_KEY => 'propietario', Model::PARENT_KEY => 'rut']); + } + return $this->propietario_o; + } + protected $propiedad_o; + public function propiedad() { + if ($this->propiedad_o === null) { + $this->propiedad_o = $this->childOf(Propiedad::class, [Model::SELF_KEY => 'propiedad']); + } + return $this->propiedad_o; + } + protected $pie_o; + public function pie() { + if($this->pie_o === null) { + $this->pie_o = $this->childOf(Pie::class, [Model::SELF_KEY => 'pie']); + } + return $this->pie_o; + } + protected $bono; + public function bono() { + if ($this->bono === null) { + $this->bono = $this->childOf(BonoPie::class, [Model::SELF_KEY => 'bono_pie']); + } + return $this->bono; + } + protected $credito_o; + public function credito() { + if ($this->credito_o === null) { + $this->credito_o = $this->childOf(Credito::class, [Model::SELF_KEY => 'credito']); + } + return $this->credito_o; + } + protected $escritura_o; + public function escritura() { + if ($this->escritura_o === null) { + $this->escritura_o = $this->childOf(Escritura::class, [Model::SELF_KEY => 'escritura']); + } + return $this->escritura_o; + } + protected $subsidio_o; + public function subsidio() { + if ($this->subsidio_o === null) { + $this->subsidio_o = $this->childOf(Subsidio::class, [Model::SELF_KEY => 'subsidio']); + } + return $this->subsidio_o; + } + protected $entrega_o; + public function entrega() { + if ($this->entrega_o === null) { + $this->entrega_o = $this->childOf(Entrega::class, [Model::SELF_KEY => 'entrega']); + } + return $this->entrega_o; + } + protected $agente_o; + public function agente() { + if ($this->agente_o === null) { + $this->agente_o = $this->childOf(Agente::class, [Model::SELF_KEY => 'agente']); + } + return $this->agente_o; + } + protected $promocion_o; + public function promocion() { + if ($this->promocion_o === null) { + $this->promocion_o = $this->childOf(Promocion::class, [Model::SELF_KEY => 'promocion']); + } + return $this->promocion_o; + } + protected $resciliacion_o; + public function resciliacion() { + if ($this->resciliacion_o === null) { + $this->resciliacion_o = $this->childOf(Resciliacion::class, [Model::SELF_KEY => 'resciliacion']); + } + return $this->resciliacion_o; + } + protected $devolucion_o; + public function devolucion() { + if ($this->devolucion_o === null) { + $this->devolucion_o = $this->childOf(Pago::class, [Model::SELF_KEY => 'devolucion']); + } + return $this->devolucion_o; + } + + protected $estados; + public function estados() { + if ($this->estados === null) { + $this->estados = $this->parentOf(EstadoVenta::class, [Model::CHILD_KEY => 'venta']); + } + return $this->estados; + } + protected $estado; + public function estado() { + if ($this->estado === null) { + $estados = $this->estados(); + usort($estados, function ($a, $b) { + $f = $b->fecha - $a->fecha; + if ($f == 0) { + return $b->id - $a->id; + } + return $f; + }); + $this->estado = $estados[0]; + } + return $this->estado; + } +}