0.1.0
This commit is contained in:
30
common/Alias/Controller.php
Normal file
30
common/Alias/Controller.php
Normal file
@ -0,0 +1,30 @@
|
||||
<?php
|
||||
namespace Incoviba\API\Common\Alias;
|
||||
|
||||
use Incoviba\API\Common\Define\Controller\Json;
|
||||
use Incoviba\API\Common\Factory\Mapper as MapperFactory;
|
||||
use Incoviba\Mapper\Mapper;
|
||||
|
||||
class Controller
|
||||
{
|
||||
use Json;
|
||||
|
||||
protected MapperFactory $mapperFactory;
|
||||
public function __construct(MapperFactory $mapperFactory) {
|
||||
$this->mapperFactory = $mapperFactory;
|
||||
}
|
||||
protected array $mappers;
|
||||
public function getMapper(string $name): Mapper
|
||||
{
|
||||
if (!class_exists($name)) {
|
||||
throw new \InvalidArgumentException("Mapper {$name} not found.");
|
||||
}
|
||||
if (!isset($this->mappers)) {
|
||||
$this->mappers = [];
|
||||
}
|
||||
if (!isset($this->mappers[$name])) {
|
||||
$this->mappers[$name] = $this->mapperFactory->get($name);
|
||||
}
|
||||
return $this->mappers[$name];
|
||||
}
|
||||
}
|
@ -5,9 +5,8 @@ use Psr\Http\Message\ServerRequestInterface as Request;
|
||||
use Psr\Http\Message\ResponseInterface as Response;
|
||||
use Incoviba\API\Common\Define\Controller\Json;
|
||||
use Incoviba\API\Common\Service\Auth as Service;
|
||||
use Incoviba\API\Common\Factory\Model as Factory;
|
||||
use Incoviba\Auth\User;
|
||||
use Incoviba\Auth\Login;
|
||||
use Incoviba\API\Common\Service\Login as LoginService;
|
||||
use Incoviba\Mapper\User as UserMapper;
|
||||
|
||||
class Auth {
|
||||
use Json;
|
||||
@ -16,19 +15,19 @@ class Auth {
|
||||
$key = $service->generate();
|
||||
return $this->withJson($response, compact('key'));
|
||||
}
|
||||
public function login(Request $request, Response $response, Service $service, Factory $factory): Response {
|
||||
public function login(Request $request, Response $response, Service $service, LoginService $loginService, UserMapper $mapper): Response {
|
||||
$post = json_decode($request->getBody());
|
||||
$user = $factory->find(User::class)->where([['name', $post->name]])->one();
|
||||
$user = $mapper->fetchByName($post->name);
|
||||
$output = [
|
||||
'login' => false,
|
||||
'token' => ''
|
||||
];
|
||||
if ($user->enabled == 0) {
|
||||
$this->withJson($response, $output);
|
||||
if (!$user or !$user->enabled) {
|
||||
return $this->withJson($response, $output);
|
||||
}
|
||||
if ($user->validate($post->password)) {
|
||||
$token = $service->generateToken();
|
||||
$status = $user->setToken($token->selector, $token->token);
|
||||
$status = $loginService->setToken($user, $token->selector, $token->token);
|
||||
if ($status['logged_in']) {
|
||||
$output['login'] = true;
|
||||
$output['token'] = $token->full;
|
||||
@ -37,46 +36,41 @@ class Auth {
|
||||
}
|
||||
return $this->withJson($response, $output);
|
||||
}
|
||||
protected function getLogin(object $post, Factory $factory): bool|Login {
|
||||
list($selector, $token) = explode(':', $post->token); //Token from the cookie
|
||||
$login = $factory->find(Login::class)->where([['selector', $selector]])->one();
|
||||
if ($login === false or !password_verify($token, $login->token) or !$login->isValid()) {
|
||||
return false;
|
||||
}
|
||||
return $login;
|
||||
}
|
||||
public function validate(Request $request, Response $response, Factory $factory): Response {
|
||||
public function validate(Request $request, Response $response, LoginService $loginService): Response {
|
||||
$post = json_decode($request->getBody());
|
||||
if (!$this->getLogin($post, $factory)) {
|
||||
return $this->withJson($response, ['token' => $post->token, 'error' => 'Not authorized'], 401);
|
||||
$valid = $loginService->validate($post);
|
||||
$output = [
|
||||
'token' => $post->token
|
||||
];
|
||||
if ($valid) {
|
||||
$output['status'] = 'Authorized';
|
||||
} else {
|
||||
$output['error'] = 'Not authorized';
|
||||
}
|
||||
return $this->withJson($response, ['token' => $post->token, 'status' => 'Authorized']);
|
||||
return $this->withJson($response, $output, $valid ? 200 : 401);
|
||||
}
|
||||
public function user(Request $request, Response $response, Factory $factory): Response {
|
||||
public function user(Request $request, Response $response, LoginService $loginService): Response {
|
||||
$post = json_decode($request->getBody());
|
||||
$login = $this->getLogin($post, $factory);
|
||||
if (!$login) {
|
||||
$user = $loginService->getUser($post);
|
||||
if (!$user) {
|
||||
return $this->withJson($response, ['token' => $post->token, 'error' => 'Not authorized'], 401);
|
||||
}
|
||||
$output = [
|
||||
'token' => $post->token,
|
||||
'user' => $login->user()->name
|
||||
'user' => $user->name
|
||||
];
|
||||
return $this->withJson($response, $output);
|
||||
}
|
||||
public function logout(Request $request, Response $response, Factory $factory): Response {
|
||||
public function logout(Request $request, Response $response, LoginService $loginService): Response {
|
||||
$post = json_decode($request->getBody());
|
||||
list($selector, $token) = explode(':', $post->token); //Token from the cookie
|
||||
$login = $factory->find(Login::class)->where([['selector', $selector]])->one();
|
||||
$user = $loginService->getUser($post);
|
||||
if (!$user) {
|
||||
return $this->withJson($response, ['logout' => true]);
|
||||
}
|
||||
$output = [
|
||||
'token' => $post->token,
|
||||
'logout' => false
|
||||
'logout' => $loginService->logout($user)
|
||||
];
|
||||
if ($login !== false) {
|
||||
$output['logout'] = $login->user()->logout();
|
||||
} else {
|
||||
$output['logout'] = true;
|
||||
}
|
||||
return $this->withJson($response, $output);
|
||||
}
|
||||
}
|
||||
|
@ -1,93 +1,141 @@
|
||||
<?php
|
||||
namespace Incoviba\API\Common\Controller;
|
||||
|
||||
use Incoviba\API\Common\Alias\Controller;
|
||||
use Incoviba\Mapper\EstadoVenta;
|
||||
use Psr\Http\Message\ServerRequestInterface as Request;
|
||||
use Psr\Http\Message\ResponseInterface as Response;
|
||||
use Incoviba\API\Common\Define\Controller\Json;
|
||||
use Incoviba\API\Common\Factory\Model as Factory;
|
||||
use Incoviba\Proyecto\Proyecto;
|
||||
use Incoviba\Mapper\Proyecto as ProyectoMapper;
|
||||
use Incoviba\Mapper\Venta as VentaMapper;
|
||||
use Incoviba\Mapper\ProyectoTipoUnidad as TipoMapper;
|
||||
use Incoviba\Mapper\Unidad as UnidadMapper;
|
||||
use Incoviba\Mapper\Precio as PrecioMapper;
|
||||
use Incoviba\Mapper\EstadoPrecio as EstadoMapper;
|
||||
use Incoviba\API\Common\Service\Format;
|
||||
|
||||
class Proyectos {
|
||||
use Json;
|
||||
|
||||
public function __invoke(Request $request, Response $response, Factory $factory): Response {
|
||||
$proyectos = $factory->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;
|
||||
class Proyectos extends Controller {
|
||||
public function __invoke(Request $request, Response $response): Response {
|
||||
$proyectos = $this->getMapper(ProyectoMapper::class)->fetchAll();
|
||||
usort($proyectos, function($a, $b) {
|
||||
return strcmp($a->descripcion, $b->descripcion);
|
||||
});
|
||||
$proyectos = json_decode(json_encode($proyectos), JSON_OBJECT_AS_ARRAY);
|
||||
foreach ($proyectos as &$proyecto) {
|
||||
$proyecto['ventas'] = $this->getMapper(VentaMapper::class)->fetchCountByProyecto($proyecto['id']);
|
||||
}
|
||||
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);
|
||||
}
|
||||
|
||||
public function ventas(Request $request, Response $response, $proyecto_id): Response
|
||||
{
|
||||
$proyecto = $this->getMapper(ProyectoMapper::class)->fetchById($proyecto_id);
|
||||
$ventas = $this->getMapper(VentaMapper::class)->fetchActivaByProyecto($proyecto_id);
|
||||
$output = ['proyecto' => json_decode(json_encode($proyecto), JSON_OBJECT_AS_ARRAY)];
|
||||
$output['proyecto']['ventas'] = json_decode(json_encode($ventas), JSON_OBJECT_AS_ARRAY);
|
||||
foreach ($ventas as $i => $venta) {
|
||||
$estado = $this->getMapper(EstadoVenta::class)->fetchLastByVenta($venta->id);
|
||||
$output['proyecto']['ventas'][$i]['estado'] = $estado;
|
||||
}
|
||||
return $this->withJson($response, $output);
|
||||
}
|
||||
public function precios(Request $request, Response $response, Format $format, $proyecto_id): Response {
|
||||
$proyecto = $this->getMapper(ProyectoMapper::class)->fetchById($proyecto_id);
|
||||
$output = json_decode(json_encode(compact('proyecto')), JSON_OBJECT_AS_ARRAY);
|
||||
$tipos = $this->getMapper(TipoMapper::class)->fetchByProyecto($proyecto_id);
|
||||
usort($tipos, function($a, $b) {
|
||||
$t = strcmp($a->tipo->id, $b->tipo->id);
|
||||
if ($t === 0) {
|
||||
return strcmp($a->nombre, $b->nombre);
|
||||
}
|
||||
return $t;
|
||||
});
|
||||
$output['proyecto']['tipos'] = json_decode(json_encode($tipos), JSON_OBJECT_AS_ARRAY);
|
||||
foreach ($tipos as $i => $tipo) {
|
||||
$unidades = $this->getMapper(UnidadMapper::class)->fetchByTipo($tipo->id);
|
||||
$output['proyecto']['tipos'][$i]['unidades'] = json_decode(json_encode($unidades), JSON_OBJECT_AS_ARRAY);
|
||||
foreach ($unidades as $k => $unidad) {
|
||||
if ($unidad->subtipo === null) {
|
||||
$output['proyecto']['tipos'][$i]['unidades'][$k]['subtipo'] = $tipo->nombre;
|
||||
}
|
||||
$precio = $this->getMapper(PrecioMapper::class)->fetchLastByUnidad($unidad->id);
|
||||
if (!$precio) {
|
||||
$output['proyecto']['tipos'][$i]['unidades'][$k]['precio'] = ['valor' => 0, 'formateado' => 0, 'estado' => ['estado' => ['descripcion' => '']]];
|
||||
continue;
|
||||
}
|
||||
$output['proyecto']['tipos'][$i]['unidades'][$k]['precio'] = json_decode(json_encode($precio), JSON_OBJECT_AS_ARRAY);
|
||||
$output['proyecto']['tipos'][$i]['unidades'][$k]['precio']['estado'] = json_decode(json_encode($this->getMapper(EstadoMapper::class)->fetchLastByPrecio($precio->id)), JSON_OBJECT_AS_ARRAY);
|
||||
$output['proyecto']['tipos'][$i]['unidades'][$k]['precio']['formateado'] = $format->uf($precio->valor);
|
||||
}
|
||||
}
|
||||
return $this->withJson($response, $output);
|
||||
}
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
@ -3,27 +3,34 @@ namespace Incoviba\API\Common\Controller\Proyectos;
|
||||
|
||||
use Psr\Http\Message\ServerRequestInterface as Request;
|
||||
use Psr\Http\Message\ResponseInterface as Response;
|
||||
use Incoviba\API\Common\Factory\Model as Factory;
|
||||
use Incoviba\API\Common\Define\Controller\Json;
|
||||
use Incoviba\Proyecto\Proyecto;
|
||||
use Incoviba\Mapper\Proyecto as ProyectoMapper;
|
||||
use Incoviba\Mapper\Cierre as CierreMapper;
|
||||
|
||||
class Cierres {
|
||||
use Json;
|
||||
|
||||
public function __invoke(Request $request, Response $response, Factory $factory): Response {
|
||||
$proyectos = $factory->find(Proyecto::class)->many();
|
||||
public function __invoke(Request $request, Response $response, ProyectoMapper $proyectoMapper, CierreMapper $cierreMapper): Response {
|
||||
$proyectos = $proyectoMapper->fetchAll();
|
||||
$cierres = [];
|
||||
function filter_cierres($cierres, $estado) {
|
||||
return array_filter($cierres, function ($item) use ($estado) {
|
||||
return $item->estado()->tipo->descripcion === $estado;
|
||||
});
|
||||
}
|
||||
foreach ($proyectos as $proyecto) {
|
||||
if (count($proyecto->cierres()) == 0) {
|
||||
$cs = $cierreMapper->fetchByProyecto($proyecto->id);
|
||||
if (count($cs) == 0) {
|
||||
continue;
|
||||
}
|
||||
$pendientes = filter_cierres($cs, 'pendiente');
|
||||
$cierres[$proyecto->descripcion] = [
|
||||
'proyecto' => $proyecto->descripcion,
|
||||
'total' => count($proyecto->cierres()),
|
||||
'promesados' => count($proyecto->cierres(3)),
|
||||
'rechazados' => count($proyecto->cierres(-1)),
|
||||
'pendientes' => count($proyecto->cierres(2)),
|
||||
'ultimo_pendiente' => (count($proyecto->cierres(2)) > 0) ? $proyecto->cierres(2)[0]->periodo() : 0
|
||||
'total' => count($cs),
|
||||
'promesados' => count(filter_cierres($cs, 'promesado')),
|
||||
'rechazados' => count(filter_cierres($cs, 'rechazado')),
|
||||
'pendientes' => count($pendientes),
|
||||
'ultimo_pendiente' => (count($pendientes) > 0) ? $pendientes[0]->periodo() : 0
|
||||
];
|
||||
}
|
||||
return $this->withJson($response, compact('cierres'));
|
||||
|
@ -1,31 +1,25 @@
|
||||
<?php
|
||||
namespace Incoviba\API\Common\Controller\Proyectos;
|
||||
|
||||
use Incoviba\Proyecto\Proyecto;
|
||||
use Psr\Http\Message\ServerRequestInterface as Request;
|
||||
use Psr\Http\Message\ResponseInterface as Response;
|
||||
use Carbon\Carbon;
|
||||
use Incoviba\Proyecto\Proyecto;
|
||||
use Incoviba\API\Common\Define\Controller\Json;
|
||||
use Incoviba\API\Common\Factory\Model as Factory;
|
||||
use Incoviba\Mapper\Proyecto as ProyectoMapper;
|
||||
use Incoviba\Mapper\Cuota as CuotaMapper;
|
||||
|
||||
class Cuotas {
|
||||
use Json;
|
||||
|
||||
public function __invoke(Request $request, Response $response, Factory $factory): Response {
|
||||
$proyectos = $factory->find(Proyecto::class)->many();
|
||||
$cuotas = [];
|
||||
foreach ($proyectos as $proyecto) {
|
||||
foreach ($proyecto->cuotas() as $cuota) {
|
||||
$cuotas []= $cuota->toArray();
|
||||
}
|
||||
}
|
||||
return $this->withJson($response, ['cuotas' => $cuotas]);
|
||||
}
|
||||
public function mes(Request $request, Response $response, Factory $factory): Response {
|
||||
$proyectos = $factory->find(Proyecto::class)->many();
|
||||
public function mes(Request $request, Response $response, ProyectoMapper $proyectoMapper, CuotaMapper $cuotaMapper): Response {
|
||||
$proyectos = $proyectoMapper->fetchAll();
|
||||
$dias = [];
|
||||
foreach ($proyectos as $proyecto) {
|
||||
foreach ($proyecto->cuotasMes() as $cuota) {
|
||||
$f = $cuota->pago()->fecha();
|
||||
$cuotas = $cuotaMapper->fetchByProyectoAndMes($proyecto->id, new \DateTimeImmutable());
|
||||
foreach ($cuotas as $cuota) {
|
||||
$f = Carbon::createFromTimestamp($cuota->pago->fecha->getTimestamp());
|
||||
if ($f->isoWeekday() == 6 or $f->isoWeekDay() == 7) {
|
||||
$f = $f->copy()->addDays(2)->startOfWeek();
|
||||
}
|
||||
@ -42,21 +36,21 @@ class Cuotas {
|
||||
uksort($dias, function($a, $b) {
|
||||
return strcmp($a, $b);
|
||||
});
|
||||
return $this->withJson($response, ['proyecto' => $proyecto->toArray(), 'dias' => $dias]);
|
||||
return $this->withJson($response, ['dias' => $dias]);
|
||||
}
|
||||
public function hoy(Request $request, Response $response, Factory $factory): Response {
|
||||
$proyectos = $factory->find(Proyecto::class)->many();
|
||||
public function hoy(Request $request, Response $response, ProyectoMapper $proyectoMapper, CuotaMapper $cuotaMapper): Response {
|
||||
$proyectos = $proyectoMapper->fetchAll();
|
||||
$hoy = 0;
|
||||
foreach ($proyectos as $proyecto) {
|
||||
$hoy += count($proyecto->cuotasHoy());
|
||||
$hoy += count($cuotaMapper->fetchByProyectoAndFecha($proyecto->id, new \DateTimeImmutable()));
|
||||
}
|
||||
return $this->withJson($response, ['hoy' => $hoy]);
|
||||
}
|
||||
public function pendientes(Request $request, Response $response, Factory $factory): Response {
|
||||
$proyectos = $factory->find(Proyecto::class)->many();
|
||||
public function pendientes(Request $request, Response $response, ProyectoMapper $proyectoMapper, CuotaMapper $cuotaMapper): Response {
|
||||
$proyectos = $proyectoMapper->fetchAll();
|
||||
$pendientes = 0;
|
||||
foreach ($proyectos as $proyecto) {
|
||||
$pendientes += count($proyecto->cuotasPendientes());
|
||||
$pendientes += count($cuotaMapper->fetchByProyectoAndPendiente($proyecto->id));
|
||||
}
|
||||
return $this->withJson($response, ['pendientes' => $pendientes]);
|
||||
}
|
||||
|
@ -6,150 +6,153 @@ use Psr\Http\Message\ResponseInterface as Response;
|
||||
use Incoviba\API\Common\Define\Controller\Json;
|
||||
use Incoviba\API\Common\Factory\Model as Factory;
|
||||
use Incoviba\Venta\Venta;
|
||||
use Incoviba\Mapper\Venta as VentaMapper;
|
||||
|
||||
class Ventas {
|
||||
use Json;
|
||||
use Json;
|
||||
|
||||
public function __invoke(Request $request, Response $response, Factory $factory): Response {
|
||||
$ventas = $factory->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())
|
||||
]
|
||||
];
|
||||
if ($venta->pie()) {
|
||||
$output['links'] []= [
|
||||
'rel' => 'pie',
|
||||
'title' => 'Pie',
|
||||
'href' => str_replace("/venta/{$venta_id}", "/pie/{$venta->pie}", $request->getUri())
|
||||
];
|
||||
public function __invoke(Request $request, Response $response, Factory $factory, VentaMapper $mapper): Response {
|
||||
$ventas = $mapper->fetchAll();
|
||||
error_log(var_export($ventas, true));
|
||||
$ventas = $factory->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'));
|
||||
}
|
||||
if ($venta->bono()) {
|
||||
$output['links'] []= [
|
||||
'rel' => 'bono_pie',
|
||||
'title' => 'Bono Pie',
|
||||
'href' => str_replace("/venta/{$venta_id}", "/bono/{$venta->bono_pie}", $request->getUri())
|
||||
];
|
||||
}
|
||||
if ($venta->credito()) {
|
||||
$output['links'] []= [
|
||||
'rel' => 'credito',
|
||||
'title' => 'Credito',
|
||||
'href' => str_replace("/venta/{$venta_id}", "/credito/{$venta->credito}", $request->getUri())
|
||||
];
|
||||
}
|
||||
if ($venta->escritura()) {
|
||||
$output['links'] []= [
|
||||
'rel' => 'escritura',
|
||||
'title' => 'Escritura',
|
||||
'href' => str_replace("/venta/{$venta_id}", "/escritura/{$venta->escritura}", $request->getUri())
|
||||
];
|
||||
}
|
||||
if ($venta->subsidio()) {
|
||||
$output['links'] []= [
|
||||
'rel' => 'subsidio',
|
||||
'title' => 'Subsidio',
|
||||
'href' => str_replace("/venta/{$venta_id}", "/subsidio/{$venta->subsidio}", $request->getUri())
|
||||
];
|
||||
}
|
||||
if ($venta->entrega()) {
|
||||
$output['links'] []= [
|
||||
'rel' => 'entrega',
|
||||
'title' => 'Entrega',
|
||||
'href' => str_replace("/venta/{$venta_id}", "/entrega/{$venta->entrega}", $request->getUri())
|
||||
];
|
||||
}
|
||||
if ($venta->proyectoAgente()) {
|
||||
$output['links'] []= [
|
||||
'rel' => 'proyecto_agente',
|
||||
'title' => 'Proyecto Agente',
|
||||
'href' => str_replace("/venta/{$venta_id}", "/proyecto_agente/{$venta->agente}", $request->getUri())
|
||||
];
|
||||
}
|
||||
if ($venta->promocion()) {
|
||||
$output['links'] []= [
|
||||
'rel' => 'promocion',
|
||||
'title' => 'Promocion',
|
||||
'href' => str_replace("/venta/{$venta_id}", "/promocion/{$venta->promocion}", $request->getUri())
|
||||
];
|
||||
}
|
||||
if ($venta->resciliacion()) {
|
||||
$output['links'] []= [
|
||||
'rel' => 'resciliacion',
|
||||
'title' => 'Resciliacion',
|
||||
'href' => str_replace("/venta/{$venta_id}", "/resciliacion/{$venta->resciliacion}", $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 []= [
|
||||
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(),
|
||||
'created' => $venta->is_new() ? $venta->save() : false
|
||||
'link' => [
|
||||
'rel' => 'ventas',
|
||||
'title' => 'Ventas',
|
||||
'href' => str_replace("/venta/{$venta_id}", '/ventas', $request->getUri())
|
||||
]
|
||||
];
|
||||
}
|
||||
} elseif (in_array('venta', $post)) {
|
||||
$venta = Venta::add($factory, $post);
|
||||
$output['venta'] = $venta;
|
||||
$output['created'] = $venta->is_new() ? $venta->save() : false;
|
||||
$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())
|
||||
]
|
||||
];
|
||||
if ($venta->pie()) {
|
||||
$output['links'] []= [
|
||||
'rel' => 'pie',
|
||||
'title' => 'Pie',
|
||||
'href' => str_replace("/venta/{$venta_id}", "/pie/{$venta->pie}", $request->getUri())
|
||||
];
|
||||
}
|
||||
if ($venta->bono()) {
|
||||
$output['links'] []= [
|
||||
'rel' => 'bono_pie',
|
||||
'title' => 'Bono Pie',
|
||||
'href' => str_replace("/venta/{$venta_id}", "/bono/{$venta->bono_pie}", $request->getUri())
|
||||
];
|
||||
}
|
||||
if ($venta->credito()) {
|
||||
$output['links'] []= [
|
||||
'rel' => 'credito',
|
||||
'title' => 'Credito',
|
||||
'href' => str_replace("/venta/{$venta_id}", "/credito/{$venta->credito}", $request->getUri())
|
||||
];
|
||||
}
|
||||
if ($venta->escritura()) {
|
||||
$output['links'] []= [
|
||||
'rel' => 'escritura',
|
||||
'title' => 'Escritura',
|
||||
'href' => str_replace("/venta/{$venta_id}", "/escritura/{$venta->escritura}", $request->getUri())
|
||||
];
|
||||
}
|
||||
if ($venta->subsidio()) {
|
||||
$output['links'] []= [
|
||||
'rel' => 'subsidio',
|
||||
'title' => 'Subsidio',
|
||||
'href' => str_replace("/venta/{$venta_id}", "/subsidio/{$venta->subsidio}", $request->getUri())
|
||||
];
|
||||
}
|
||||
if ($venta->entrega()) {
|
||||
$output['links'] []= [
|
||||
'rel' => 'entrega',
|
||||
'title' => 'Entrega',
|
||||
'href' => str_replace("/venta/{$venta_id}", "/entrega/{$venta->entrega}", $request->getUri())
|
||||
];
|
||||
}
|
||||
if ($venta->proyectoAgente()) {
|
||||
$output['links'] []= [
|
||||
'rel' => 'proyecto_agente',
|
||||
'title' => 'Proyecto Agente',
|
||||
'href' => str_replace("/venta/{$venta_id}", "/proyecto_agente/{$venta->agente}", $request->getUri())
|
||||
];
|
||||
}
|
||||
if ($venta->promocion()) {
|
||||
$output['links'] []= [
|
||||
'rel' => 'promocion',
|
||||
'title' => 'Promocion',
|
||||
'href' => str_replace("/venta/{$venta_id}", "/promocion/{$venta->promocion}", $request->getUri())
|
||||
];
|
||||
}
|
||||
if ($venta->resciliacion()) {
|
||||
$output['links'] []= [
|
||||
'rel' => 'resciliacion',
|
||||
'title' => 'Resciliacion',
|
||||
'href' => str_replace("/venta/{$venta_id}", "/resciliacion/{$venta->resciliacion}", $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);
|
||||
}
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
22
common/Factory/Mapper.php
Normal file
22
common/Factory/Mapper.php
Normal file
@ -0,0 +1,22 @@
|
||||
<?php
|
||||
namespace Incoviba\API\Common\Factory;
|
||||
|
||||
use Incoviba\Mapper\Mapper as BaseMapper;
|
||||
use Psr\Container\ContainerInterface;
|
||||
|
||||
class Mapper
|
||||
{
|
||||
protected ContainerInterface $container;
|
||||
public function __construct(ContainerInterface $container)
|
||||
{
|
||||
$this->container = $container;
|
||||
}
|
||||
|
||||
public function get(string $name): BaseMapper
|
||||
{
|
||||
if (!class_exists($name)) {
|
||||
throw new \InvalidArgumentException();
|
||||
}
|
||||
return $this->container->get($name);
|
||||
}
|
||||
}
|
14
common/Service/Format.php
Normal file
14
common/Service/Format.php
Normal file
@ -0,0 +1,14 @@
|
||||
<?php
|
||||
namespace Incoviba\API\Common\Service;
|
||||
|
||||
class Format
|
||||
{
|
||||
public function uf(float $number)
|
||||
{
|
||||
return number_format($number, 2, ',', '.');
|
||||
}
|
||||
public function pesos(float $number)
|
||||
{
|
||||
return number_format($number, 0, ',', '.');
|
||||
}
|
||||
}
|
90
common/Service/Login.php
Normal file
90
common/Service/Login.php
Normal file
@ -0,0 +1,90 @@
|
||||
<?php
|
||||
namespace Incoviba\API\Common\Service;
|
||||
|
||||
use Carbon\Carbon;
|
||||
use Incoviba\Mapper\User as UserMapper;
|
||||
use Incoviba\Mapper\Login as LoginMapper;
|
||||
use Incoviba\Mapper\Config as ConfigMapper;
|
||||
use Incoviba\Model\Auth\User;
|
||||
|
||||
class Login
|
||||
{
|
||||
protected UserMapper $userMapper;
|
||||
protected LoginMapper $loginMapper;
|
||||
protected ConfigMapper $configMapper;
|
||||
public function __construct(UserMapper $userMapper, LoginMapper $loginMapper, ConfigMapper $configMapper)
|
||||
{
|
||||
$this->userMapper = $userMapper;
|
||||
$this->loginMapper = $loginMapper;
|
||||
$this->configMapper = $configMapper;
|
||||
}
|
||||
|
||||
public function setToken(User $user, string $selector, string $token)
|
||||
{
|
||||
$this->logout($user);
|
||||
$expiration = $this->configMapper->fetchByName('cookie_expiration_time');
|
||||
$data = [
|
||||
'user_id' => $user->id,
|
||||
'time' => (new \DateTimeImmutable())->format('Y-m-d H:i:s '),
|
||||
'selector' => $selector,
|
||||
'token' => $token,
|
||||
'status' => 1
|
||||
];
|
||||
$status = false;
|
||||
try {
|
||||
$login = $this->loginMapper->create($data);
|
||||
$status = $this->loginMapper->save($login);
|
||||
} catch (\PDOException $e) {
|
||||
$login = false;
|
||||
}
|
||||
$output = [
|
||||
'input' => $data,
|
||||
'login' => $login,
|
||||
'logged_in' => $status
|
||||
];
|
||||
if ($login !== false) {
|
||||
$output['expires'] = $login->time->modify("+{$expiration->value} second")->getTimestamp();
|
||||
}
|
||||
return $output;
|
||||
}
|
||||
public function logout(User $user): bool
|
||||
{
|
||||
$logins = $this->validLogins($user);
|
||||
if ($logins === false or count($logins) === 0) {
|
||||
return true;
|
||||
}
|
||||
$bool = true;
|
||||
foreach ($logins as $login) {
|
||||
$login->status = false;
|
||||
$bool &= $this->loginMapper->save($login);
|
||||
}
|
||||
return $bool;
|
||||
}
|
||||
public function validLogins(User $user): bool|array {
|
||||
return $this->loginMapper->fetchActiveByUser($user->id);
|
||||
}
|
||||
public function validate($request): bool
|
||||
{
|
||||
list($selector, $token) = explode(':', $request->token);
|
||||
$login = $this->loginMapper->fetchBySelector($selector);
|
||||
if (!$login or !$login->status or !password_verify($token, $login->token)) {
|
||||
return false;
|
||||
}
|
||||
$expiration = $this->configMapper->fetchByName('cookie_expiration_time');
|
||||
if ((Carbon::createFromTimestamp($login->time->getTimestamp()))->diffInSeconds() > $expiration->value) {
|
||||
$login->status = false;
|
||||
$this->loginMapper->save($login);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
public function getUser($request): User|bool
|
||||
{
|
||||
list($selector, $token) = explode(':', $request->token);
|
||||
$login = $this->loginMapper->fetchBySelector($selector);
|
||||
if (!$login or !$login->status) {
|
||||
return false;
|
||||
}
|
||||
return $login->user;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user