diff --git a/app/resources/routes/api/proyectos.php b/app/resources/routes/api/proyectos.php index 5216427..784b0d1 100644 --- a/app/resources/routes/api/proyectos.php +++ b/app/resources/routes/api/proyectos.php @@ -9,4 +9,5 @@ $app->group('/proyecto/{proyecto_id}', function($app) { $app->get('/estados[/]', [Proyectos\EstadosProyectos::class, 'byProyecto']); $app->get('/estado[/]', [Proyectos\EstadosProyectos::class, 'currentByProyecto']); $app->get('/inicio[/]', [Proyectos\EstadosProyectos::class, 'firstByProyecto']); + $app->get('/recepcion[/]', [Proyectos\EstadosProyectos::class, 'recepcionByProyecto']); }); diff --git a/app/resources/views/proyectos/list.blade.php b/app/resources/views/proyectos/list.blade.php index f0dc90d..3dbdb83 100644 --- a/app/resources/views/proyectos/list.blade.php +++ b/app/resources/views/proyectos/list.blade.php @@ -11,6 +11,7 @@ Etapa Estado Tiempo Total + Tiempo RF @@ -21,6 +22,7 @@ + @endforeach @@ -38,7 +40,8 @@ this.id = id this.estados = { start: null, - current: null + current: null, + recepcion: null } } get() { @@ -60,6 +63,21 @@ }).then(data => { this.estados.current = data.estado }) + }, + recepcion: () => { + return fetch('{{$urls->api}}/proyecto/' + this.id + '/recepcion').then(response => { + if (response.ok) { + if (response.status === 204) { + return null + } + return response.json() + } + }).then(data => { + if (data === null) { + return + } + this.estados.recepcion = data.estado + }) } } } @@ -87,10 +105,10 @@ if (diff >= 30) { diff /= 30 frame = 'meses' - } - if (diff >= 12) { - diff /= 12 - frame = 'años' + if (diff >= 12) { + diff /= 12 + frame = 'años' + } } if (diff > 0) { estado += ' (hace ' + Math.floor(diff) + ' ' + frame + ')' @@ -111,83 +129,55 @@ if (diff >= 30) { diff /= 30 frame = 'meses' - } - if (diff >= 12) { - diff /= 12 - frame = 'años' + if (diff >= 12) { + diff /= 12 + frame = 'años' + } } - row.find('.tiempo').html('Hace ' + Math.floor(diff) + ' ' + frame) + row.find('.tiempo').html(Math.floor(diff) + ' ' + frame) + }, + recepcion: () => { + if (this.estados.recepcion === null) { + return + } + let diff = (today - new Date(this.estados.recepcion.fecha.date)) / (1000 * 60 * 60 * 24) + if (isNaN(diff) || diff === 0) { + return + } + + let frame = 'dias' + if (diff >= 30) { + diff /= 30 + frame = 'meses' + if (diff >= 12) { + diff /= 12 + frame = 'años' + } + } + + row.find('.recepcion').html(Math.floor(diff) + ' ' + frame) } } } } - function showTiempo(proyecto_id, tiempo) { - if (tiempo.trim() === '') { - return - } - const row = $(".proyecto[data-id='" + proyecto_id + "']") - row.find('.tiempo').html(tiempo) - } - function getEstados(proyecto_id) { - return fetch('{{$urls->api}}/proyecto/' + proyecto_id + '/estados').then(response => { - if (response.ok) { - return response.json() - } - }).then(data => { - let tiempo = 0 - const current = new Date(data.estados.at(-1).fecha.date) - const start = new Date(data.estados[0].fecha.date) - tiempo = (current - start) / (1000 * 60 * 60 * 24) - if (isNaN(tiempo) || tiempo === 0) { - return - } - let frame = 'días' - if (tiempo > 30) { - tiempo /= 30 - frame = 'meses' - } - if (tiempo > 12) { - tiempo /= 12 - frame = 'años' - } - showTiempo(data.proyecto_id, 'Hace ' + Math.ceil(tiempo) + ' ' + frame) - }) - } - function showEtapa(proyecto_id, etapa) { - const row = $(".proyecto[data-id='" + proyecto_id + "']") - row.find('.etapa').html(etapa) - } - function showEstado(proyecto_id, estado) { - const row = $(".proyecto[data-id='" + proyecto_id + "']") - row.find('.estado').html(estado) - } - function getEstado(proyecto_id) { - return fetch('{{$urls->api}}/proyecto/' + proyecto_id + '/estado').then(response => { - if (response.ok) { - return response.json() - } - }).then(data => { - showEtapa(data.proyecto_id, data.estado.tipo_estado_proyecto.etapa.descripcion) - showEstado(data.proyecto_id, data.estado.tipo_estado_proyecto.descripcion) - }) - } + function loadEstados(proyecto_id) { const proyecto = new Proyecto(proyecto_id) const promises = [] promises.push(proyecto.get().start()) promises.push(proyecto.get().current()) + promises.push(proyecto.get().recepcion()) Promise.all(promises).then(() => { proyecto.show().etapa() proyecto.show().current() proyecto.show().tiempo() + proyecto.show().recepcion() }) } $(document).ready(() => { @foreach ($proyectos as $proyecto) loadEstados('{{$proyecto->id}}') - /*getEstado('{{$proyecto->id}}') - getEstados('{{$proyecto->id}}')*/ @endforeach }) diff --git a/app/src/Controller/API/Proyectos/EstadosProyectos.php b/app/src/Controller/API/Proyectos/EstadosProyectos.php index bc03d06..9fc451f 100644 --- a/app/src/Controller/API/Proyectos/EstadosProyectos.php +++ b/app/src/Controller/API/Proyectos/EstadosProyectos.php @@ -50,4 +50,17 @@ class EstadosProyectos } return $this->withJson($response, $output); } + public function recepcionByProyecto(ServerRequestInterface $request, ResponseInterface $response, Repository\Proyecto\EstadoProyecto $estadoProyectoRepository, int $proyecto_id): ResponseInterface + { + $output = [ + 'proyecto_id' => $proyecto_id, + 'estado' => null + ]; + try { + $output['estado'] = $estadoProyectoRepository->fetchRecepcionByProyecto($proyecto_id); + } catch (EmptyResult) { + return $this->emptyBody($response); + } + return $this->withJson($response, $output); + } } diff --git a/app/src/Repository/Proyecto.php b/app/src/Repository/Proyecto.php index 924d62b..21b1c7e 100644 --- a/app/src/Repository/Proyecto.php +++ b/app/src/Repository/Proyecto.php @@ -102,7 +102,7 @@ ORDER BY a.`descripcion`"; SELECT MAX(e1.`id`) AS 'id', e1.`proyecto` FROM `estado_proyecto` e1 JOIN ( - SELECT MAX(`id`) AS 'id', `proyecto`, `fecha` + SELECT `id`, `proyecto`, MAX(`fecha`) as 'fecha' FROM `estado_proyecto` GROUP BY `proyecto`, `fecha` ) e0 ON e1.`id` = e0.`id` diff --git a/app/src/Repository/Proyecto/EstadoProyecto.php b/app/src/Repository/Proyecto/EstadoProyecto.php index b27a0ca..ff6ece5 100644 --- a/app/src/Repository/Proyecto/EstadoProyecto.php +++ b/app/src/Repository/Proyecto/EstadoProyecto.php @@ -70,4 +70,12 @@ FROM `{$this->getTable()}` a WHERE a.`proyecto` = ?"; return $this->fetchOne($query, [$proyecto_id]); } + public function fetchRecepcionByProyecto(int $proyecto_id): Model\Proyecto\EstadoProyecto + { + $query = "SELECT a.* +FROM `{$this->getTable()}` a + JOIN `tipo_estado_proyecto` tep ON tep.`id` = a.`estado` +WHERE a.`proyecto` = ? AND tep.`descripcion` = 'Recepción Final'"; + return $this->fetchOne($query, [$proyecto_id]); + } }