您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

480 行
15KB

  1. <?php
  2. namespace App\Controllers;
  3. use App\Entities\PrestadorSolicitudModel;
  4. use App\Models\EncuestaModel;
  5. use App\Models\PreguntaModel;
  6. use App\Models\PrestadorModel;
  7. use App\Models\PrestadorSolicitudModel as ModelsPrestadorSolicitudModel;
  8. use App\Models\SurveyUserModel;
  9. use App\Models\UserModel;
  10. use PHPUnit\Framework\MockObject\Stub\ReturnReference;
  11. class Admin extends BaseController
  12. {
  13. public function home()
  14. {
  15. $data = [
  16. 'title' => 'Inicio',
  17. 'solicitudes' => model(PrestadorSolicitudModel::class)->countSolicitudes(),
  18. 'prestadoresActivos' => model(PrestadorModel::class)->countPrestadoresActivos(),
  19. ];
  20. return view('Admin/index', $data);
  21. }
  22. // PRESTADORES
  23. public function prestadores()
  24. {
  25. $prestadores = model(PrestadorModel::class)->getPrestadoresActivos();
  26. // dd($prestadores[0]);
  27. return view('Admin/prestadores', ['prestadores' => $prestadores]);
  28. }
  29. // SOLICITUDES
  30. public function solicitudes()
  31. {
  32. $data = [
  33. 'title' => 'Solicitudes',
  34. 'solicitudes' => model(PrestadorSolicitudModel::class)->getPrestadorSolicitud(),
  35. ];
  36. return view('Admin/solicitudes', $data);
  37. }
  38. public function revisarSolicitud($id)
  39. {
  40. $model = model(ModelsPrestadorSolicitudModel::class);
  41. if (!$datos = $model->find($id)) {
  42. return redirect()->route('admin_solicitudes')->with('msg', array(
  43. 'type' => 'danger',
  44. 'body' => 'Solicitud no encontrada'
  45. ));
  46. }
  47. $data = [
  48. 'id' => $id,
  49. 'email' => user()->email,
  50. 'escuelas' => model(EscuelaModel::class)->getEscuelas(),
  51. 'departamentos' => model(DepartamentoModel::class)->getDepartamentos(),
  52. 'datos' => $datos,
  53. 'revisar' => true,
  54. ];
  55. return view('Prestador/formulario_inicial', $data);
  56. }
  57. public function aprobarSolicitud($id)
  58. {
  59. $solicitudModel = model(ModelsPrestadorSolicitudModel::class);
  60. // Validar que la solicitud existe
  61. if (!$solicitud = $solicitudModel->find($id)) {
  62. return redirect()->route('admin_solicitudes')->with('msg', array(
  63. 'type' => 'danger',
  64. 'body' => 'Solicitud no encontrada'
  65. ));
  66. }
  67. // Verificar que status de la solicitud == 0
  68. if ($solicitud['status'] != 0) {
  69. return redirect()->route('admin_solicitudes')->with('msg', array(
  70. 'type' => 'danger',
  71. 'body' => 'El status de esta solicitud no permite que sea aprobada'
  72. ));
  73. }
  74. // Encontrar usuario que mandó la solicitud
  75. if (!$user = model(UserModel::class)->findUserWithSolicitud($id)) {
  76. return redirect()->route('admin_solicitudes')->with('msg', array(
  77. 'type' => 'danger',
  78. 'body' => 'Ningún usuario tiene esa solicitud registrada.'
  79. ));
  80. }
  81. // Revisar que ususario no tenga asignado ningún registro de prestador
  82. if ($user->idprestador) {
  83. return redirect()->route('admin_solicitudes')->with('msg', array(
  84. 'type' => 'danger',
  85. 'body' => 'Este usuario ya ha sido aprobado.'
  86. ));
  87. }
  88. // Crear registro en la tabla prestador
  89. $prestadorModel = model(PrestadorModel::class);
  90. $solicitud = $this->completarSolicitud($solicitud);
  91. if (!$prestadorModel->save($solicitud)) {
  92. return redirect()->route('admin_solicitudes')->with('msg', array(
  93. 'type' => 'danger',
  94. 'body' => 'Error al guardar nuevo registro de prestador.'
  95. ));
  96. }
  97. // Asignar id de la tabla prestador al usuario aprobado
  98. $idprestador = $prestadorModel->getInsertID();
  99. $user->idprestador = $idprestador;
  100. model(UserModel::class)->save($user);
  101. // Cambiar status de la solicitud y eliminar datos con 'X'
  102. $this->eliminarDatosSolicitud($solicitudModel, $solicitud);
  103. // enviar correo
  104. $email = service('email');
  105. $sent = $email
  106. ->setTo($solicitud['email'])
  107. ->setSubject('COPARMEX: Solicitud aprobada')
  108. ->setMessage(view('admin/emails/solicitudAprobada'))
  109. ->setMailType('html')
  110. ->send();
  111. return redirect()->route('admin_solicitudes')->with('msg', array(
  112. 'type' => 'success',
  113. 'body' => 'Solicitud aprobada. Se activo la cuenta del prestador.'
  114. ));
  115. }
  116. public function rechazarSolicitud($id)
  117. {
  118. // Validar que la solicitud existe
  119. $solicitudModel = model(ModelsPrestadorSolicitudModel::class);
  120. if (!$solicitud = $solicitudModel->find($id)) {
  121. return redirect()->route('admin_solicitudes')->with('msg', array(
  122. 'type' => 'danger',
  123. 'body' => 'Solicitud no encontrada'
  124. ));
  125. }
  126. // Verificar que status de la solicitud == 0
  127. if ($solicitud['status'] != 0) {
  128. return redirect()->route('admin_solicitudes')->with('msg', array(
  129. 'type' => 'danger',
  130. 'body' => 'El status de esta solicitud no permite que sea rechazada'
  131. ));
  132. }
  133. // cambiar status de solicitud (2)
  134. $solicitud['status'] = 2;
  135. $solicitudModel->save($solicitud);
  136. // enviar correo
  137. $email = service('email');
  138. $motivo = $this->request->getPost('motivo');
  139. $sent = $email
  140. ->setTo($solicitud['email'])
  141. ->setSubject('COPARMEX: Solicitud rechazada')
  142. ->setMessage(view('admin/emails/solicitudRechazada', ['motivo' => $motivo]))
  143. ->setMailType('html')
  144. ->send();
  145. return redirect()->route('admin_solicitudes')->with('msg', array(
  146. 'type' => 'success',
  147. 'body' => 'Solicitud fue rechazada'
  148. ));
  149. }
  150. private function completarSolicitud($solicitud)
  151. {
  152. // Agregar campos para completar el registro de prestador
  153. $solicitud['idusuario_actual'] = user_id();
  154. switch ($solicitud['turno']) {
  155. case 1:
  156. $solicitud['turno'] = 'MATUTINO';
  157. break;
  158. case 2:
  159. $solicitud['turno'] = 'VESPERTINO';
  160. break;
  161. case 3:
  162. $solicitud['turno'] = 'MIXTO';
  163. break;
  164. }
  165. $solicitud['tipo'] = ($solicitud['tipo'] == 1) ? 'SERVICIO SOCIAL' : 'PRACTICAS PROFESIONALES';
  166. return $solicitud;
  167. }
  168. private function eliminarDatosSolicitud($model, $solicitud)
  169. {
  170. $id = $solicitud['id'];
  171. foreach ($solicitud as $key => $value) {
  172. $solicitud[$key] = 'X';
  173. }
  174. $solicitud['id'] = (int)$id;
  175. $solicitud['status'] = 1;
  176. $solicitud['email'] = 'x@x.com';
  177. $solicitud['horas_servicio'] = 0;
  178. $model->save($solicitud);
  179. }
  180. // ENCUESTAS
  181. public function encuestas()
  182. {
  183. $data = [
  184. 'title' => 'Encuestas',
  185. 'encuestas' => model(EncuestaModel::class)->getEncuestas(),
  186. ];
  187. return view('Admin/encuestas.php', $data);
  188. }
  189. public function encuesta($id)
  190. {
  191. $data = [
  192. 'id' => $id,
  193. 'encuesta' => model(EncuestaModel::class)->getEncuestas($id, true),
  194. 'preguntas' => model(PreguntaModel::class)->getPreguntas($id),
  195. ];
  196. return view('Admin/encuesta', $data);
  197. }
  198. public function nuevaEncuesta()
  199. {
  200. // Guardar encuesta
  201. if ($this->request->getMethod() === 'post') {
  202. $encuesta = model(EncuestaModel::class);
  203. $data = $this->request->getPost();
  204. // agregar id del usuario actual
  205. $data['user_id'] = user_id();
  206. // Validar datos
  207. if (!$encuesta->save($data)) {
  208. return redirect()->back()->withInput()->with('errors', $encuesta->errors());
  209. }
  210. return redirect()->route('admin_encuestas')->with('msg', array(
  211. 'type' => 'success',
  212. 'body' => 'Encuesta creada correctamente.'
  213. ));
  214. }
  215. $data = [
  216. 'title' => 'Nueva encuesta',
  217. ];
  218. return view('Admin/formularioEncuesta', $data);
  219. }
  220. public function editarEncuesta($id)
  221. {
  222. $encuesta = model(EncuestaModel::class);
  223. if ($this->request->getMethod() === 'post') {
  224. $data = $this->request->getPost();
  225. if (!$encuesta->update($id, $data)) {
  226. return redirect()->back()->withInput()->with('errors', $encuesta->errors());
  227. }
  228. return redirect()->route('admin_encuestas')->with('msg', array(
  229. 'type' => 'success',
  230. 'body' => 'Encuesta editada correctamente',
  231. ));
  232. }
  233. $data = [
  234. 'id' => $id,
  235. 'title' => 'Modificar encuesta',
  236. 'datos' => $encuesta->getEncuestas($id),
  237. ];
  238. return view('Admin/formularioEncuesta', $data);
  239. }
  240. public function eliminarEncuesta($id)
  241. {
  242. if (!model(EncuestaModel::class)->delete($id)) {
  243. return redirect()->route('admin_encuestas')->with('msg', array(
  244. 'type' => 'error',
  245. 'body' => 'Error al eliminar la encuesta.'
  246. ));
  247. }
  248. return redirect()->route('admin_encuestas')->with('msg', array(
  249. 'type' => 'success',
  250. 'body' => 'Encuesta eliminada correctamente.'
  251. ));
  252. }
  253. public function respuestas()
  254. {
  255. $respuestas = model(SurveyUserModel::class)->getEncuestasContestadas();
  256. $data = [
  257. 'respuestas' => $respuestas,
  258. ];
  259. return view('Admin/respuestas', $data);
  260. }
  261. public function respuestasEncuesta($surveyId)
  262. {
  263. if (!$respuestas = model(RespuestaModel::class)->getRespuestasAll($surveyId)) {
  264. return redirect()->route('admin_respuestas')->with('msg', array(
  265. 'type' => 'danger',
  266. 'body' => 'No se encontraron respuestas de para esta encuesta.',
  267. ));
  268. }
  269. // Agrupar respuestas por usuario
  270. $respuestas = array_reduce($respuestas, function (array $accumulator, array $element) {
  271. $accumulator[$element['user_id']][] = $element;
  272. return $accumulator;
  273. }, []);
  274. // reset array keys
  275. $respuestas = array_values($respuestas);
  276. // Agrupar respuestas de opción múltiple
  277. foreach ($respuestas as &$respuesta) {
  278. $respuesta = array_reduce($respuesta, function (array $accumulator, array $element) {
  279. $accumulator[$element['question_id']][] = $element;
  280. return $accumulator;
  281. }, []);
  282. $respuesta = array_values($respuesta);
  283. }
  284. unset($respuesta);
  285. $data = [
  286. 'tituloEncuesta' => model(EncuestaModel::class)->find($surveyId)['title'],
  287. 'preguntas' => model(PreguntaModel::class)->getPreguntas($surveyId),
  288. 'respuestas' => $respuestas,
  289. ];
  290. // dd($respuestas);
  291. return view('Admin/respuestasGenerales', $data);
  292. }
  293. public function respuesta($surveyId, $userId)
  294. {
  295. if (!$respuestas = model(RespuestaModel::class)->getRespuestas($surveyId, $userId)) {
  296. return redirect()->route('admin_respuestas')->with('msg', array(
  297. 'type' => 'danger',
  298. 'body' => 'No se encontraron respuestas de este usuario.',
  299. ));
  300. }
  301. // Agrupar respuestas de opción múltipe
  302. $respuestas = array_reduce($respuestas, function (array $accumulator, array $element) {
  303. $accumulator[$element['question_id']][] = $element;
  304. return $accumulator;
  305. }, []);
  306. // Datos de prestador
  307. $prestadorId = model(UserModel::class)->find($userId)->idprestador;
  308. $prestador = model(PrestadorModel::class)->find($prestadorId);
  309. $data = [
  310. 'tituloEncuesta' => model(EncuestaModel::class)->find($surveyId)['title'],
  311. 'prestador' => $prestador,
  312. 'respuestas' => $respuestas,
  313. ];
  314. return view('Admin/respuestaIndividual', $data);
  315. }
  316. // PREGUNTAS
  317. public function nuevaPregunta($id)
  318. {
  319. if ($this->request->getMethod() === 'post') {
  320. $pregunta = model(PreguntaModel::class);
  321. $data = $this->request->getPost();
  322. // Relacionar encuesta($id) con pregunta(survey_id)
  323. $data['survey_id'] = $id;
  324. $data['order_by'] = 1;
  325. // Validar y guardar datos
  326. if (!$pregunta->save($data)) {
  327. return redirect()->back()->withInput()->with('errors', $pregunta->errors());
  328. }
  329. $url = 'admin/encuesta/' . $id;
  330. return redirect()->to($url)->with('msg', array(
  331. 'type' => 'success',
  332. 'body' => 'Pregunta registrada correctamente',
  333. ));
  334. }
  335. $data = [
  336. 'title' => 'Nueva pregunta',
  337. 'id' => $id,
  338. ];
  339. return view('Admin/formularioPregunta', $data);
  340. }
  341. public function editarPregunta($id)
  342. {
  343. $pregunta = model(PreguntaModel::class);
  344. if ($this->request->getMethod() === 'post') {
  345. $data = $this->request->getPost();
  346. if (!$pregunta->update($id, $data)) {
  347. return redirect()->back()->withInput()->with('errors', $pregunta->errors());
  348. }
  349. $encuestaId = $pregunta->find($id)['survey_id'];
  350. $url = 'admin/encuesta/' . $encuestaId;
  351. return redirect()->to($url)->with('msg', array(
  352. 'type' => 'success',
  353. 'body' => 'Pregunta registrada correctamente',
  354. ));
  355. }
  356. $data = [
  357. 'preguntaId' => $id,
  358. 'title' => 'Editar pregunta',
  359. 'datos' => $pregunta->find($id),
  360. ];
  361. return view('Admin/formularioPregunta', $data);
  362. }
  363. public function eliminarPregunta(int $id)
  364. {
  365. $model = model('PreguntaModel');
  366. if (!$pregunta = $model->find($id)) {
  367. throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
  368. }
  369. $encuestaId = $pregunta['survey_id'];
  370. $model->delete($id);
  371. $url = 'admin/encuesta/' . $encuestaId;
  372. return redirect()->to($url)->with('msg', array(
  373. 'type' => 'success',
  374. 'body' => 'Pregunta eliminada correctamente',
  375. ));
  376. }
  377. public function preguntaPost()
  378. {
  379. $data = $this->request->getPost();
  380. $data['survey_id'] = 1;
  381. $data['order_by'] = 1;
  382. var_dump($data);
  383. }
  384. // GRUPOS
  385. public function createGroup()
  386. {
  387. // $authorize = service('authorization');
  388. // $id = $authorize->createGroup('Prestador', 'Prestadores de Servicio Social o Prácticas Profesionales');
  389. // echo $id;
  390. }
  391. }