1
0
2022-09-05 09:20:32 -05:00

480 Zeilen
15 KiB
PHP

<?php
namespace App\Controllers;
use App\Entities\PrestadorSolicitudModel;
use App\Models\EncuestaModel;
use App\Models\PreguntaModel;
use App\Models\PrestadorModel;
use App\Models\PrestadorSolicitudModel as ModelsPrestadorSolicitudModel;
use App\Models\SurveyUserModel;
use App\Models\UserModel;
use PHPUnit\Framework\MockObject\Stub\ReturnReference;
class Admin extends BaseController
{
public function home()
{
$data = [
'title' => 'Inicio',
'solicitudes' => model(PrestadorSolicitudModel::class)->countSolicitudes(),
'prestadoresActivos' => model(PrestadorModel::class)->countPrestadoresActivos(),
];
return view('Admin/index', $data);
}
// PRESTADORES
public function prestadores()
{
$prestadores = model(PrestadorModel::class)->getPrestadoresActivos();
// dd($prestadores[0]);
return view('Admin/prestadores', ['prestadores' => $prestadores]);
}
// SOLICITUDES
public function solicitudes()
{
$data = [
'title' => 'Solicitudes',
'solicitudes' => model(PrestadorSolicitudModel::class)->getPrestadorSolicitud(),
];
return view('Admin/solicitudes', $data);
}
public function revisarSolicitud($id)
{
$model = model(ModelsPrestadorSolicitudModel::class);
if (!$datos = $model->find($id)) {
return redirect()->route('admin_solicitudes')->with('msg', array(
'type' => 'danger',
'body' => 'Solicitud no encontrada'
));
}
$data = [
'id' => $id,
'email' => user()->email,
'escuelas' => model(EscuelaModel::class)->getEscuelas(),
'departamentos' => model(DepartamentoModel::class)->getDepartamentos(),
'datos' => $datos,
'revisar' => true,
];
return view('Prestador/formulario_inicial', $data);
}
public function aprobarSolicitud($id)
{
$solicitudModel = model(ModelsPrestadorSolicitudModel::class);
// Validar que la solicitud existe
if (!$solicitud = $solicitudModel->find($id)) {
return redirect()->route('admin_solicitudes')->with('msg', array(
'type' => 'danger',
'body' => 'Solicitud no encontrada'
));
}
// Verificar que status de la solicitud == 0
if ($solicitud['status'] != 0) {
return redirect()->route('admin_solicitudes')->with('msg', array(
'type' => 'danger',
'body' => 'El status de esta solicitud no permite que sea aprobada'
));
}
// Encontrar usuario que mandó la solicitud
if (!$user = model(UserModel::class)->findUserWithSolicitud($id)) {
return redirect()->route('admin_solicitudes')->with('msg', array(
'type' => 'danger',
'body' => 'Ningún usuario tiene esa solicitud registrada.'
));
}
// Revisar que ususario no tenga asignado ningún registro de prestador
if ($user->idprestador) {
return redirect()->route('admin_solicitudes')->with('msg', array(
'type' => 'danger',
'body' => 'Este usuario ya ha sido aprobado.'
));
}
// Crear registro en la tabla prestador
$prestadorModel = model(PrestadorModel::class);
$solicitud = $this->completarSolicitud($solicitud);
if (!$prestadorModel->save($solicitud)) {
return redirect()->route('admin_solicitudes')->with('msg', array(
'type' => 'danger',
'body' => 'Error al guardar nuevo registro de prestador.'
));
}
// Asignar id de la tabla prestador al usuario aprobado
$idprestador = $prestadorModel->getInsertID();
$user->idprestador = $idprestador;
model(UserModel::class)->save($user);
// Cambiar status de la solicitud y eliminar datos con 'X'
$this->eliminarDatosSolicitud($solicitudModel, $solicitud);
// enviar correo
$email = service('email');
$sent = $email
->setTo($solicitud['email'])
->setSubject('COPARMEX: Solicitud aprobada')
->setMessage(view('admin/emails/solicitudAprobada'))
->setMailType('html')
->send();
return redirect()->route('admin_solicitudes')->with('msg', array(
'type' => 'success',
'body' => 'Solicitud aprobada. Se activo la cuenta del prestador.'
));
}
public function rechazarSolicitud($id)
{
// Validar que la solicitud existe
$solicitudModel = model(ModelsPrestadorSolicitudModel::class);
if (!$solicitud = $solicitudModel->find($id)) {
return redirect()->route('admin_solicitudes')->with('msg', array(
'type' => 'danger',
'body' => 'Solicitud no encontrada'
));
}
// Verificar que status de la solicitud == 0
if ($solicitud['status'] != 0) {
return redirect()->route('admin_solicitudes')->with('msg', array(
'type' => 'danger',
'body' => 'El status de esta solicitud no permite que sea rechazada'
));
}
// cambiar status de solicitud (2)
$solicitud['status'] = 2;
$solicitudModel->save($solicitud);
// enviar correo
$email = service('email');
$motivo = $this->request->getPost('motivo');
$sent = $email
->setTo($solicitud['email'])
->setSubject('COPARMEX: Solicitud rechazada')
->setMessage(view('admin/emails/solicitudRechazada', ['motivo' => $motivo]))
->setMailType('html')
->send();
return redirect()->route('admin_solicitudes')->with('msg', array(
'type' => 'success',
'body' => 'Solicitud fue rechazada'
));
}
private function completarSolicitud($solicitud)
{
// Agregar campos para completar el registro de prestador
$solicitud['idusuario_actual'] = user_id();
switch ($solicitud['turno']) {
case 1:
$solicitud['turno'] = 'MATUTINO';
break;
case 2:
$solicitud['turno'] = 'VESPERTINO';
break;
case 3:
$solicitud['turno'] = 'MIXTO';
break;
}
$solicitud['tipo'] = ($solicitud['tipo'] == 1) ? 'SERVICIO SOCIAL' : 'PRACTICAS PROFESIONALES';
return $solicitud;
}
private function eliminarDatosSolicitud($model, $solicitud)
{
$id = $solicitud['id'];
foreach ($solicitud as $key => $value) {
$solicitud[$key] = 'X';
}
$solicitud['id'] = (int)$id;
$solicitud['status'] = 1;
$solicitud['email'] = 'x@x.com';
$solicitud['horas_servicio'] = 0;
$model->save($solicitud);
}
// ENCUESTAS
public function encuestas()
{
$data = [
'title' => 'Encuestas',
'encuestas' => model(EncuestaModel::class)->getEncuestas(),
];
return view('Admin/encuestas.php', $data);
}
public function encuesta($id)
{
$data = [
'id' => $id,
'encuesta' => model(EncuestaModel::class)->getEncuestas($id, true),
'preguntas' => model(PreguntaModel::class)->getPreguntas($id),
];
return view('Admin/encuesta', $data);
}
public function nuevaEncuesta()
{
// Guardar encuesta
if ($this->request->getMethod() === 'post') {
$encuesta = model(EncuestaModel::class);
$data = $this->request->getPost();
// agregar id del usuario actual
$data['user_id'] = user_id();
// Validar datos
if (!$encuesta->save($data)) {
return redirect()->back()->withInput()->with('errors', $encuesta->errors());
}
return redirect()->route('admin_encuestas')->with('msg', array(
'type' => 'success',
'body' => 'Encuesta creada correctamente.'
));
}
$data = [
'title' => 'Nueva encuesta',
];
return view('Admin/formularioEncuesta', $data);
}
public function editarEncuesta($id)
{
$encuesta = model(EncuestaModel::class);
if ($this->request->getMethod() === 'post') {
$data = $this->request->getPost();
if (!$encuesta->update($id, $data)) {
return redirect()->back()->withInput()->with('errors', $encuesta->errors());
}
return redirect()->route('admin_encuestas')->with('msg', array(
'type' => 'success',
'body' => 'Encuesta editada correctamente',
));
}
$data = [
'id' => $id,
'title' => 'Modificar encuesta',
'datos' => $encuesta->getEncuestas($id),
];
return view('Admin/formularioEncuesta', $data);
}
public function eliminarEncuesta($id)
{
if (!model(EncuestaModel::class)->delete($id)) {
return redirect()->route('admin_encuestas')->with('msg', array(
'type' => 'error',
'body' => 'Error al eliminar la encuesta.'
));
}
return redirect()->route('admin_encuestas')->with('msg', array(
'type' => 'success',
'body' => 'Encuesta eliminada correctamente.'
));
}
public function respuestas()
{
$respuestas = model(SurveyUserModel::class)->getEncuestasContestadas();
$data = [
'respuestas' => $respuestas,
];
return view('Admin/respuestas', $data);
}
public function respuestasEncuesta($surveyId)
{
if (!$respuestas = model(RespuestaModel::class)->getRespuestasAll($surveyId)) {
return redirect()->route('admin_respuestas')->with('msg', array(
'type' => 'danger',
'body' => 'No se encontraron respuestas de para esta encuesta.',
));
}
// Agrupar respuestas por usuario
$respuestas = array_reduce($respuestas, function (array $accumulator, array $element) {
$accumulator[$element['user_id']][] = $element;
return $accumulator;
}, []);
// reset array keys
$respuestas = array_values($respuestas);
// Agrupar respuestas de opción múltiple
foreach ($respuestas as &$respuesta) {
$respuesta = array_reduce($respuesta, function (array $accumulator, array $element) {
$accumulator[$element['question_id']][] = $element;
return $accumulator;
}, []);
$respuesta = array_values($respuesta);
}
unset($respuesta);
$data = [
'tituloEncuesta' => model(EncuestaModel::class)->find($surveyId)['title'],
'preguntas' => model(PreguntaModel::class)->getPreguntas($surveyId),
'respuestas' => $respuestas,
];
// dd($respuestas);
return view('Admin/respuestasGenerales', $data);
}
public function respuesta($surveyId, $userId)
{
if (!$respuestas = model(RespuestaModel::class)->getRespuestas($surveyId, $userId)) {
return redirect()->route('admin_respuestas')->with('msg', array(
'type' => 'danger',
'body' => 'No se encontraron respuestas de este usuario.',
));
}
// Agrupar respuestas de opción múltipe
$respuestas = array_reduce($respuestas, function (array $accumulator, array $element) {
$accumulator[$element['question_id']][] = $element;
return $accumulator;
}, []);
// Datos de prestador
$prestadorId = model(UserModel::class)->find($userId)->idprestador;
$prestador = model(PrestadorModel::class)->find($prestadorId);
$data = [
'tituloEncuesta' => model(EncuestaModel::class)->find($surveyId)['title'],
'prestador' => $prestador,
'respuestas' => $respuestas,
];
return view('Admin/respuestaIndividual', $data);
}
// PREGUNTAS
public function nuevaPregunta($id)
{
if ($this->request->getMethod() === 'post') {
$pregunta = model(PreguntaModel::class);
$data = $this->request->getPost();
// Relacionar encuesta($id) con pregunta(survey_id)
$data['survey_id'] = $id;
$data['order_by'] = 1;
// Validar y guardar datos
if (!$pregunta->save($data)) {
return redirect()->back()->withInput()->with('errors', $pregunta->errors());
}
$url = 'admin/encuesta/' . $id;
return redirect()->to($url)->with('msg', array(
'type' => 'success',
'body' => 'Pregunta registrada correctamente',
));
}
$data = [
'title' => 'Nueva pregunta',
'id' => $id,
];
return view('Admin/formularioPregunta', $data);
}
public function editarPregunta($id)
{
$pregunta = model(PreguntaModel::class);
if ($this->request->getMethod() === 'post') {
$data = $this->request->getPost();
if (!$pregunta->update($id, $data)) {
return redirect()->back()->withInput()->with('errors', $pregunta->errors());
}
$encuestaId = $pregunta->find($id)['survey_id'];
$url = 'admin/encuesta/' . $encuestaId;
return redirect()->to($url)->with('msg', array(
'type' => 'success',
'body' => 'Pregunta registrada correctamente',
));
}
$data = [
'preguntaId' => $id,
'title' => 'Editar pregunta',
'datos' => $pregunta->find($id),
];
return view('Admin/formularioPregunta', $data);
}
public function eliminarPregunta(int $id)
{
$model = model('PreguntaModel');
if (!$pregunta = $model->find($id)) {
throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
}
$encuestaId = $pregunta['survey_id'];
$model->delete($id);
$url = 'admin/encuesta/' . $encuestaId;
return redirect()->to($url)->with('msg', array(
'type' => 'success',
'body' => 'Pregunta eliminada correctamente',
));
}
public function preguntaPost()
{
$data = $this->request->getPost();
$data['survey_id'] = 1;
$data['order_by'] = 1;
var_dump($data);
}
// GRUPOS
public function createGroup()
{
// $authorize = service('authorization');
// $id = $authorize->createGroup('Prestador', 'Prestadores de Servicio Social o Prácticas Profesionales');
// echo $id;
}
}