src/Controller/FichajeController.php line 33

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\HttpFoundation\Response;
  5. use Symfony\Component\Routing\Annotation\Route;
  6. use App\Entity\Fichaje;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use Symfony\Component\HttpFoundation\JsonResponse;
  9. use Doctrine\ORM\EntityManagerInterface;
  10. use DateTime;
  11. use DateTimeImmutable;
  12. use DateInterval;
  13. use Symfony\Component\Security\Core\Security;
  14. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  15. class FichajeController extends AbstractController
  16. {
  17. private $entityManager;
  18. private $security;
  19. public function __construct(EntityManagerInterface $entityManager, Security $security)
  20. {
  21. $this->entityManager = $entityManager;
  22. $this->security = $security;
  23. }
  24. /**
  25. * @Route("/", name="fichaje")
  26. * @IsGranted("ROLE_USER")
  27. */
  28. public function index(): Response{
  29. $user = $this->getUser();
  30. if (!$user) {
  31. throw $this->createAccessDeniedException('Debes estar autenticado para acceder a esta página');
  32. }
  33. $username = $user->getUserIdentifier();
  34. $hoy = new DateTime();
  35. $repoFichaje = $this->entityManager->getRepository(Fichaje::class);
  36. $fichajes = $repoFichaje->findAll();
  37. //$fichajesUser = $repoFichaje->findBy(['user' => $username]);
  38. $dataFichajes = array();
  39. //$dataFichajesUser = array();
  40. foreach ($fichajes as $fichaje) {
  41. //calculo de horas totales trabajadas
  42. $arrayHoras = array(
  43. 'inicio_am' => $fichaje->getInicioAm() ? $fichaje->getInicioAm()->format('H:i') : null,
  44. 'fin_am' => $fichaje->getFinAm() ? $fichaje->getFinAm()->format('H:i') : null,
  45. 'inicio_pm' => $fichaje->getInicioPm() ? $fichaje->getInicioPm()->format('H:i') : null,
  46. 'fin_pm' => $fichaje->getFinPm() ? $fichaje->getFinPm()->format('H:i') : null,
  47. 'inicio_descanso_am' => $fichaje->getInicioDescansoAm() ? $fichaje->getInicioDescansoAm()->format('H:i') : null,
  48. 'fin_descanso_am' => $fichaje->getFinDescansoAm() ? $fichaje->getFinDescansoAm()->format('H:i') : null,
  49. 'inicio_descanso_pm' => $fichaje->getInicioDescansoPm() ? $fichaje->getInicioDescansoPm()->format('H:i') : null,
  50. 'fin_descanso_pm' => $fichaje->getFinDescansoPm() ? $fichaje->getFinDescansoPm()->format('H:i') : null,
  51. );
  52. $totalHorasFichadas = $this->calcularHorasTrabajadas($arrayHoras);
  53. //array temporal
  54. $temp = array(
  55. 'id' => $fichaje->getId(),
  56. 'user' => $fichaje->getUser(),
  57. 'fecha' => $fichaje->getFecha(),
  58. 'inicio_am' => $fichaje->getInicioAm() ? $fichaje->getInicioAm()->format('H:i') : null,
  59. 'fin_am' => $fichaje->getFinAm() ? $fichaje->getFinAm()->format('H:i') : null,
  60. 'inicio_pm' => $fichaje->getInicioPm() ? $fichaje->getInicioPm()->format('H:i') : null,
  61. 'fin_pm' => $fichaje->getFinPm() ? $fichaje->getFinPm()->format('H:i') : null,
  62. 'inicio_descanso_am' => $fichaje->getInicioDescansoAm() ? $fichaje->getInicioDescansoAm()->format('H:i') : null,
  63. 'fin_descanso_am' => $fichaje->getFinDescansoAm() ? $fichaje->getFinDescansoAm()->format('H:i') : null,
  64. 'inicio_descanso_pm' => $fichaje->getInicioDescansoPm() ? $fichaje->getInicioDescansoPm()->format('H:i') : null,
  65. 'fin_descanso_pm' => $fichaje->getFinDescansoPm() ? $fichaje->getFinDescansoPm()->format('H:i') : null,
  66. 'total_horas' => $totalHorasFichadas,
  67. );
  68. //se almacena l'array temporal y si el usuario dentro del fichaje coincide con el usuario se añade en un segundo array
  69. // array_push($dataFichajes, $temp);
  70. // if ($fichaje->getUser() === $username) {
  71. // array_push($dataFichajesUser, $temp);
  72. // }
  73. if ($this->isGranted('ROLE_ADMIN')) {
  74. array_push($dataFichajes, $temp);
  75. } elseif ($this->isGranted('ROLE_USER') && $fichaje->getUser() === $username) {
  76. array_push($dataFichajes, $temp);
  77. }
  78. }
  79. // busca en los fichajes el usuario y fecha actual
  80. $dateFichaje = $repoFichaje->findOneBy(['fecha' => $hoy, 'user' => $username]);
  81. //verifica si hay fichaje por la mañana y por la tarde
  82. $fichajeMannana = ($dateFichaje && $dateFichaje->getInicioAm() !== null) ? true : false;
  83. $fichajeTarde = ($dateFichaje && $dateFichaje->getInicioPm() !== null) ? true : false;
  84. $horaInicioAm = ($dateFichaje && $dateFichaje->getInicioAm() !== null) ? $dateFichaje->getInicioAm() : false;
  85. $horaFinAm = ($dateFichaje && $dateFichaje->getFinAm() !== null) ? $dateFichaje->getFinAm() : false;
  86. $horaInicioPm = ($dateFichaje && $dateFichaje->getInicioPm() !== null) ? $dateFichaje->getInicioPm() : false;
  87. $horaFinPm = ($dateFichaje && $dateFichaje->getFinPm() !== null) ? $dateFichaje->getFinPm() : false;
  88. $horaInicioAmString = $horaInicioAm !== false ? $horaInicioAm->format('H:i') : '';
  89. $horaFinAmString = $horaFinAm !== false ? $horaFinAm->format('H:i') : '';
  90. $horaInicioPmString = $horaInicioPm !== false ? $horaInicioPm->format('H:i') : '';
  91. $horaFinPmString = $horaFinPm !== false ? $horaFinPm->format('H:i') : '';
  92. $horaInicioDescansoAm = ($dateFichaje && $dateFichaje->getInicioDescansoAm() !== null) ? $dateFichaje->getInicioDescansoAm()->format('H:i') : false;
  93. $horaFinDescansoAm = ($dateFichaje && $dateFichaje->getFinDescansoAm() !== null) ? $dateFichaje->getFinDescansoAm()->format('H:i') : false;
  94. $horaInicioDescansoPm = ($dateFichaje && $dateFichaje->getInicioDescansoPm() !== null) ? $dateFichaje->getInicioDescansoPm()->format('H:i') : false;
  95. $horaFinDescansoPm = ($dateFichaje && $dateFichaje->getFinDescansoPm() !== null) ? $dateFichaje->getFinDescansoPm()->format('H:i') : false;
  96. //Si hay fichajes tanto en la mañana como en la tarde, muestra el mensaje
  97. if ($fichajeMannana === true && $fichajeTarde === true) {
  98. $this->addFlash('info', '¡No puedes modificar tu fichaje una vez insertadas las horas!');
  99. }
  100. return $this->render('fichaje/index.html.twig', [
  101. 'controller_name' => 'FichajeController',
  102. 'fichajeMannana' => $fichajeMannana,
  103. 'fichajeTarde' => $fichajeTarde,
  104. 'horaInicioAm' => $horaInicioAmString,
  105. 'horaFinAm' => $horaFinAmString,
  106. 'horaInicioPm' => $horaInicioPmString,
  107. 'horaFinPm' => $horaFinPmString,
  108. 'fichajes' => $dataFichajes,
  109. //'fichajesUser' => $dataFichajesUser,
  110. 'horaInicioDescansoAm' => $horaInicioDescansoAm,
  111. 'horaFinDescansoAm' => $horaFinDescansoAm,
  112. 'horaInicioDescansoPm' => $horaInicioDescansoPm,
  113. 'horaFinDescansoPm' => $horaFinDescansoPm,
  114. ]);
  115. }
  116. /**
  117. * @Route("/insertfichaje", name="insert_fichaje")
  118. */
  119. public function insertFichaje(Request $request)
  120. {
  121. $inicioMannana = $request->request->get('inicioMannana');
  122. $finMannana = $request->request->get('finMannana');
  123. $inicioTarde = $request->request->get('inicioTarde');
  124. $finTarde = $request->request->get('finTarde');
  125. $inicioDescansoAm = $request->request->get('inicioDescansoAm');
  126. $finDescansoAm = $request->request->get('finDescansoAm');
  127. $inicioDescansoPm = $request->request->get('inicioDescansoPm');
  128. $finDescansoPm = $request->request->get('finDescansoPm');
  129. $fecha = new DateTime();
  130. $user = $this->getUser();
  131. if (!$user) {
  132. throw $this->createAccessDeniedException('Debes estar autenticado para realizar esta acción');
  133. }
  134. $username = $user->getUserIdentifier();
  135. $repoFichaje = $this->entityManager->getRepository(Fichaje::class);
  136. $dateFichaje = $repoFichaje->findOneBy(['fecha' => $fecha, 'user' => $username]);
  137. // Verificar si todas las horas están completas
  138. if ($dateFichaje && $dateFichaje->getInicioAm() !== null && $dateFichaje->getFinAm() !== null && $dateFichaje->getInicioPm() !== null && $dateFichaje->getFinPm() !== null) {
  139. $this->addFlash('info', '¡No puedes insertar más fichajes, todas las horas están completas!');
  140. return $this->redirectToRoute('fichaje');
  141. }
  142. if ($dateFichaje) {
  143. if ($dateFichaje->getInicioAm() !== null || $dateFichaje->getFinAm() !== null) {
  144. $dateFichaje->setInicioPm(!empty($inicioTarde) ? new DateTimeImmutable('today ' . $inicioTarde) : null);
  145. $dateFichaje->setFinPm(!empty($finTarde) ? new DateTimeImmutable('today ' . $finTarde) : null);
  146. if (!empty($inicioDescansoAm) && !empty($finDescansoAm)) {
  147. $dateFichaje->setInicioDescansoAm(new DateTimeImmutable('today ' . $inicioDescansoAm));
  148. $dateFichaje->setFinDescansoAm(new DateTimeImmutable('today ' . $finDescansoAm));
  149. }
  150. if (!empty($inicioDescansoPm) && !empty($finDescansoPm)) {
  151. $dateFichaje->setInicioDescansoPm(new DateTimeImmutable('today ' . $inicioDescansoPm));
  152. $dateFichaje->setFinDescansoPm(new DateTimeImmutable('today ' . $finDescansoPm));
  153. }
  154. } else {
  155. $dateFichaje->setInicioAm(new DateTimeImmutable('today ' . $inicioMannana));
  156. $dateFichaje->setFinAm(new DateTimeImmutable('today ' . $finMannana));
  157. }
  158. $this->entityManager->persist($dateFichaje);
  159. } else {
  160. $fichaje = new Fichaje();
  161. if (!empty($inicioMannana) && !empty($finMannana)) {
  162. $fichaje->setInicioAm(new DateTimeImmutable('today ' . $inicioMannana));
  163. $fichaje->setFinAm(new DateTimeImmutable('today ' . $finMannana));
  164. }
  165. if (!empty($inicioTarde) && !empty($finTarde)) {
  166. $fichaje->setInicioPm(new DateTimeImmutable('today ' . $inicioTarde));
  167. $fichaje->setFinPm(new DateTimeImmutable('today ' . $finTarde));
  168. }
  169. if (!empty($inicioDescansoAm) && !empty($finDescansoAm)) {
  170. $fichaje->setInicioDescansoAm(new DateTimeImmutable('today ' . $inicioDescansoAm));
  171. $fichaje->setFinDescansoAm(new DateTimeImmutable('today ' . $finDescansoAm));
  172. }
  173. if (!empty($inicioDescansoPm) && !empty($finDescansoPm)) {
  174. $fichaje->setInicioDescansoPm(new DateTimeImmutable('today ' . $inicioDescansoPm));
  175. $fichaje->setFinDescansoPm(new DateTimeImmutable('today ' . $finDescansoPm));
  176. }
  177. $fichaje->setUser($username);
  178. $fichaje->setFecha($fecha);
  179. $this->entityManager->persist($fichaje);
  180. }
  181. $this->entityManager->flush();
  182. return $this->redirectToRoute('fichaje');
  183. }
  184. // Función auxiliar para calcular la diferencia entre dos horas
  185. private function calcularDiferencia($inicio, $fin) {
  186. if ($inicio && $fin) {
  187. $inicioDT = DateTime::createFromFormat('H:i', $inicio);
  188. $finDT = DateTime::createFromFormat('H:i', $fin);
  189. if ($inicioDT && $finDT) {
  190. return $inicioDT->diff($finDT);
  191. }
  192. }
  193. return new DateInterval('PT0H'); // Retorna 0 horas si los valores son inválidos
  194. }
  195. private function calcularHorasTrabajadas($arrayHoras) {
  196. // Calcular horas trabajadas en la mañana
  197. $horasAm = $this->calcularDiferencia($arrayHoras['inicio_am'], $arrayHoras['fin_am']);
  198. $descansoAm = $this->calcularDiferencia($arrayHoras['inicio_descanso_am'], $arrayHoras['fin_descanso_am']);
  199. // Calcular horas trabajadas en la tarde
  200. $horasPm = $this->calcularDiferencia($arrayHoras['inicio_pm'], $arrayHoras['fin_pm']);
  201. $descansoPm = $this->calcularDiferencia($arrayHoras['inicio_descanso_pm'], $arrayHoras['fin_descanso_pm']);
  202. // Restar los descansos
  203. $totalMinutos = ($horasAm->h * 60 + $horasAm->i) + ($horasPm->h * 60 + $horasPm->i)
  204. - ($descansoAm->h * 60 + $descansoAm->i) - ($descansoPm->h * 60 + $descansoPm->i);
  205. // Convertir minutos totales a horas y minutos
  206. $horasTrabajadas = floor($totalMinutos / 60);
  207. $minutosTrabajados = $totalMinutos % 60;
  208. return str_pad($horasTrabajadas, 2, "0", STR_PAD_LEFT).":".str_pad($minutosTrabajados, 2, "0", STR_PAD_LEFT);
  209. //return sprintf('%02d:%02d', $horasTrabajadas, $minutosTrabajados);
  210. }
  211. }