<?php
namespace App\Http\Controllers;
use App\Models\AsistenciaRegistros;
use App\Models\EventosRegistros;
use App\Models\TiposDeRegistros;
use App\Models\UsuarioConteos;
use App\Models\UsuarioPremios;
use App\Models\UsuarioRegistros;
use DateTime;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
date_default_timezone_set('America/Mexico_City');
class UsuarioRegistrosController extends Controller
{
public function lista_api(Request $request){
if($request->ajax()){
return datatables()->eloquent(UsuarioRegistros::query()->where('users_id', '=', Auth::user()->id)->with('EventosRegistros', 'EventosRegistros.Eventos' ,'TiposDeRegistros')->orderBy('created_at', 'desc'))
->addColumn('Fecha', function ($row) {
$Fecha = $row->created_at;
return $Fecha;
})
->addColumn('estado', function ($row) {
if($row->habilitado == 0){
$estado = '<span class="badge bg-primary">Registrado</span>';
}else{
$estado = '<span class="badge bg-danger">Cancelado</span>';
}
return $estado;
})
->addColumn('btn', function ($row) {
if($row->habilitado == 0){
$FechaHoraActual = NOW();
if($row->EventosRegistros->fechaHoraEditar < $FechaHoraActual){
$actionBtn = "-";
}else{
$actionBtn = "<div class='btn-group btn-group-sm' role='group'>";
$actionBtn = $actionBtn . "<a href='" . route('mis_actividades.desactivar', ['idUsuarioRegistros' => $row->id]) . "' class='btn btn-danger'>Desvincular</a>";
$actionBtn = $actionBtn . "</div>";
}
}else{
$actionBtn = "-";
}
return $actionBtn;
})
->rawColumns(['btn', 'Fecha', 'estado'])
->toJson();
}
return redirect()->route('mis_actividades.lista');
}
public function lista(){
return view('misActividades.lista-historial');
}
public function activas_api(Request $request){
if($request->ajax()){
return datatables()
->eloquent(UsuarioRegistros::query()
->where('users_id', '=', Auth::user()->id)
->with('EventosRegistros', 'EventosRegistros.Eventos' ,'TiposDeRegistros')
->join('eventos_registros', 'eventos_registros.id', '=', 'usuario_registros.eventos_registros_id')
->join('tipos_de_registros', 'tipos_de_registros.id', '=', 'usuario_registros.tipos_de_registros_id')
->join('eventos', 'eventos.id', '=', 'eventos_registros.eventos_id')
->where('eventos_registros.habilitado', '=', 0)
->where('usuario_registros.habilitado', '=', 0)
->select('usuario_registros.id as idRegistros',
'usuario_registros.created_at as FechaRegistro',
'usuario_registros.habilitado as HabilitadoRegistro',
'eventos_registros.fechaHoraEditar as FechaHoraEditar',
'eventos_registros.nombre as NombreActividad',
'eventos_registros.descripcion as DescripcionActividad',
'tipos_de_registros.nombre as NombreCategoria',
'eventos.nombre as NombreEvento'))
->addColumn('Fecha', function ($row) {
$Fecha = $row->FechaRegistro;
return $Fecha;
})
->addColumn('estado', function ($row) {
if($row->HabilitadoRegistro == 0){
$estado = '<span class="badge bg-primary">Registrado</span>';
}else{
$estado = '<span class="badge bg-danger">Cancelado</span>';
}
return $estado;
})
->addColumn('btn', function ($row) {
if($row->HabilitadoRegistro == 0){
$FechaHoraActual = NOW();
if($row->FechaHoraEditar < $FechaHoraActual){
$actionBtn = "-";
}else{
$actionBtn = "<div class='btn-group btn-group-sm' role='group'>";
$actionBtn = $actionBtn . "<a href='" . route('mis_actividades.desactivar', ['idUsuarioRegistros' => $row->idRegistros]) . "' class='btn btn-danger'>Desvincular</a>";
$actionBtn = $actionBtn . "</div>";
}
}else{
$actionBtn = "-";
}
return $actionBtn;
})
->rawColumns(['btn', 'Fecha', 'estado'])
->toJson();
}
return redirect()->route('mis_actividades.lista');
}
public function activas(){
return view('misActividades.activas');
}
public function asistencias_api(Request $request){
if($request->ajax()){
return datatables()
->eloquent(AsistenciaRegistros::query()
->with('TiposDeRegistros', 'EventosRegistros', 'EventosRegistros.Eventos')
->where('users_id', '=', Auth::user()->id))
->addColumn('Fecha', function ($row) {
$Fecha = $row->created_at;
return $Fecha;
})
->addColumn('BtnCancelar', function ($row) {
if( $row->habilitado == 1){
$actionBtn = '<span class="badge bg-danger">Cancelado</span>';
}else{
$actionBtn = '<span class="badge bg-primary">Activo</span>';
}
return $actionBtn;
})
->rawColumns(['Fecha', 'BtnCancelar'])
->toJson();
}
return redirect()->route('asistencias.lista');
}
public function asistencias(){
return view('misActividades.asistencias');
}
public function premios_api(Request $request){
if($request->ajax()){
return datatables()
->eloquent(UsuarioPremios::query()
->with('TiendaVinculos', 'TiendaVinculos.TiendaPremios', 'TiendaVinculos.TiendaCategorias')
->where('users_id', '=', Auth::user()->id))
->addColumn('Gachapon', function ($row) {
$Garchapon = $row->TiendaVinculos->TiendaCategorias->nombre;
return $Garchapon;
})
->addColumn('Premio', function ($row) {
$Premio = $row->TiendaVinculos->TiendaPremios->nombre;
return $Premio;
})
->addColumn('Puntos', function ($row) {
$Puntos = $row->TiendaVinculos->TiendaCategorias->puntos;
return $Puntos;
})
->addColumn('Fecha', function ($row) {
$Fecha = $row->created_at;
return $Fecha;
})
->addColumn('Estado', function ($row) {
if( $row->finalizar == 1){
$actionBtn = '<span class="badge bg-info">Finalizado</span>';
}else{
$actionBtn = '<span class="badge bg-primary">Pendiente</span>';
}
return $actionBtn;
})
->rawColumns(['Estado'])
->toJson();
}
return redirect()->route('mis_actividades.premios');
}
public function premios(){
return view('misActividades.lista-premios');
}
public function lista_api_actividades(int $idTipoDeCategorias){
$ValidarTipoDeRegistros = TiposDeRegistros::find($idTipoDeCategorias);
if(!$ValidarTipoDeRegistros || $ValidarTipoDeRegistros->filtroUsuario == 1){
return response(404)->header('Content-type', 'text/plain');
}
$ListaDeActividades = EventosRegistros::where('habilitado', '=', 0)
->where('tipos_de_registros_id', '=', $idTipoDeCategorias)
->get();
return response(json_encode($ListaDeActividades), 200)->header('Content-type', 'text/plain');
}
public function nuevo(){
$info['ListaCategorias'] = TiposDeRegistros::where('habilitado', '=', 0)->where('filtroUsuario', '=', 0)->orderBy('nombre', 'ASC')->get();
return view('misActividades.crear', $info);
}
public function ValidarHorarioActividad($horario_inicio, $horario_fin)
{
$usuario_id = auth()->user()->id;
$usuario_registros = UsuarioRegistros::where('usuario_id', $usuario_id)->get();
foreach ($usuario_registros as $registro) {
$actividad = EventosRegistros::find($registro->eventos_registros_id);
if (($horario_inicio >= $actividad->horario_inicio && $horario_inicio <= $actividad->horario_fin) ||
($horario_fin >= $actividad->horario_inicio && $horario_fin <= $actividad->horario_fin)) {
return false; // El horario choca con una actividad ya registrada
}
}
return true; // No hay choque de horarios con ninguna actividad registrada por el usuario actual
}
public function nuevo_post(Request $request){
$request->validate([
'TipoDeActividad' => 'required|numeric',
'Actividad' => 'required|numeric',
], [
'TipoDeActividad.required' => 'La categoría de actividad es requerida.',
'TipoDeActividad.numeric' => 'La categoría de actividad tiene un dato no válido.',
'Actividad.required' => 'La actividad es requerida.',
'Actividad.numeric' => 'La actividad tiene un dato no válido.',
]);
$ValidarTipoDeActividad = TiposDeRegistros::find($request->TipoDeActividad);
$ValidarActividad = EventosRegistros::find($request->Actividad);
if( !$ValidarTipoDeActividad ){
return redirect()->route('mis_actividades.nuevo')->with('mensaje', 'Categoría de actividad inválida.');
}else if( $ValidarTipoDeActividad->habilitado == 1 ){
return redirect()->route('mis_actividades.nuevo')->with('mensaje', 'Categoría de actividad está desactivada y no puede utilizarse.');
}else if ( $ValidarTipoDeActividad->filtroUsuario == 1 ){
return redirect()->route('mis_actividades.nuevo')->with('mensaje', 'Categoría de actividad no está disponible para usuarios.');
}
if( !$ValidarActividad ){
return redirect()->route('mis_actividades.nuevo')->with('mensaje', 'Actividad inválida.');
}else if( $ValidarActividad->habilitado == 1 ){
return redirect()->route('mis_actividades.nuevo')->with('mensaje', 'Está actividad está desactivada y no puede utilizarse.');
}else if ( ($ValidarActividad->maxUsuarios <= $ValidarActividad->vinculosActuales) && $ValidarActividad->maxUsuarios != "-1" ){
return redirect()->route('mis_actividades.nuevo')->with('mensaje', 'La actividad se encuentra llena y no permite más registros.');
}
$ValidarHorarioUsuario = ValidarHorarioDeActividad($horario_inicio, $horario_fin, $actividades);
//Revisa si el horario es válido
if( !$ValidarHorarioUsuario){
return redirect()->route('mis_actividades.nuevo')->with('mensaje', 'El horario de la actividad que elegiste interfiere con una actividad previamente registrada.');
}
$ValidarConteo = UsuarioConteos::where('users_id', '=', Auth::user()->id)
->where('tipos_de_registros_id', '=', $request->TipoDeActividad)->first();
$ValidarRegistroActividadDoble = UsuarioRegistros::where('users_id', '=', Auth::user()->id)
->where('tipos_de_registros_id', '=', $request->TipoDeActividad)
->where('eventos_registros_id', '=', $request->Actividad)
->where('habilitado', '=', 0)
->first();
if($ValidarRegistroActividadDoble){
return redirect()->route('mis_actividades.nuevo')->with('mensaje', 'No puedes registrarte dos veces a una actividad.');
}
$FechaHoraActual = NOW();
if($ValidarActividad->fechaHoraVinculo < $FechaHoraActual){
return redirect()->route('mis_actividades.nuevo')->with('mensaje', 'El tiempo para registrarse en esa actividad ya expiró.');
}
if( $ValidarActividad->tipos_de_registros_id != $request->TipoDeActividad ){
return redirect()->route('mis_actividades.nuevo')->with('mensaje', 'La actividad no corresponde con la categoría de actividad.');
}
if($ValidarConteo){
if( ($ValidarTipoDeActividad->maxCantidad > $ValidarConteo->Cantidad) || $ValidarTipoDeActividad->maxCantidad == -1){
$ConteoActual = $ValidarConteo->Cantidad + 1;
$ValidarConteo->update([
'Cantidad' => $ConteoActual
]);
$NuevoUsuarioRegistros = UsuarioRegistros::create([
'users_id' => Auth::user()->id,
'tipos_de_registros_id' => $request->TipoDeActividad,
'eventos_registros_id' => $request->Actividad,
]);
$ActualizarActividadVinculos = $ValidarActividad->vinculosActuales + 1;
$ValidarActividad->update([
'vinculosActuales' => $ActualizarActividadVinculos,
]);
}else{
return redirect()->route('mis_actividades.nuevo')->with('mensaje', 'Ya alcanzaste el límite de registros para esa categoría de actividad.');
}
}else{
$ConteoNuevo = UsuarioConteos::create([
'users_id' => Auth::user()->id,
'tipos_de_registros_id' => $request->TipoDeActividad,
'Cantidad' => 1,
]);
$NuevoUsuarioRegistros = UsuarioRegistros::create([
'users_id' => Auth::user()->id,
'tipos_de_registros_id' => $request->TipoDeActividad,
'eventos_registros_id' => $request->Actividad,
]);
$ActualizarActividadVinculos = $ValidarActividad->vinculosActuales + 1;
$ValidarActividad->update([
'vinculosActuales' => $ActualizarActividadVinculos,
]);
}
return redirect()->route('mis_actividades.lista')->with('mensaje', 'Registro de actividad correctamente.');
}
public function desactivar(int $idUsuarioRegistros){
$ActividadValidar = UsuarioRegistros::with('EventosRegistros')->where('id', '=', $idUsuarioRegistros)->where('users_id', '=', Auth::user()->id)->first();
if( !$ActividadValidar ){
return redirect()->route('mis_actividades.lista')->with('mensaje', 'No existe esa actividad o no tienes permiso para realizar esa acción.');
}
$FechaHoraActual = NOW();
if($ActividadValidar->EventosRegistros->fechaHoraEditar < $FechaHoraActual){
return redirect()->route('mis_actividades.lista')->with('mensaje', 'El tiempo para desvincularse en esa actividad ya expiró.');
}
$ValidarConteo = UsuarioConteos::where('users_id', '=', Auth::user()->id)
->where('tipos_de_registros_id', '=', $ActividadValidar->tipos_de_registros_id)->first();
$ConteoActual = $ValidarConteo->Cantidad - 1;
$ValidarConteo->update([
'Cantidad' => $ConteoActual
]);
$ActualizarVinculosEventosRegistros = EventosRegistros::find($ActividadValidar->eventos_registros_id);
$ActualizarActividadVinculos = $ActualizarVinculosEventosRegistros->vinculosActuales - 1;
$ActualizarVinculosEventosRegistros->update([
'vinculosActuales' => $ActualizarActividadVinculos,
]);
$ActividadValidar->update([
'habilitado' => 1,
]);
return redirect()->route('mis_actividades.lista')->with('mensaje', 'Te desvinculaste de la actividad.');
}
}