Actualización de lector con código qr

This commit is contained in:
2026-02-13 17:12:28 -06:00
parent 5fe41a4557
commit d88f33ccf4
14 changed files with 358 additions and 61 deletions
+7 -7
View File
@@ -2,10 +2,11 @@
namespace App\Http\Controllers;
use Illuminate\Routing\Controller;
use App\Models\Plantel;
use App\Models\User;
use App\Models\Plantel;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\DB;
use Spatie\Permission\Models\Role;
class UserController extends Controller
@@ -29,11 +30,11 @@ class UserController extends Controller
public function create()
{
$plantels = Plantel::where('status','=','1')->get();
$codigos = DB::table('area_code')->get();
$roles= Role::all();
return view('user.create',compact('roles','plantels'));
return view('user.create',compact('roles','plantels','codigos'));
}
public function store(Request $request,User $user)
{
$user= User::create($request->except(['plantels']));
@@ -44,18 +45,17 @@ class UserController extends Controller
return redirect()->route('user.edit',compact('user'))->with('info','Se creó el usuario correctamente');
}
public function show(User $user)
{
return view('user.show',compact('user'));
}
public function edit(User $user)
{
$plantels=Plantel::all();
$codigos = DB::table('area_code')->get();
$roles= Role::all();
return view('user.edit',compact('user','roles','plantels'));
return view('user.edit',compact('user','roles','plantels','codigos'));
}
public function update(Request $request, User $user)
+231 -8
View File
@@ -2,8 +2,13 @@
namespace App\Livewire;
use Carbon\Carbon;
use App\Models\Code;
use App\Models\User;
use Livewire\Component;
use Livewire\Attributes\On;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Auth;
class CodeScanner extends Component
{
@@ -12,15 +17,233 @@ class CodeScanner extends Component
public function qrLeido($texto, $lat, $lng)
{
$dia = now()->translatedFormat('l');
dd($dia);
$this->dispatch('swal',
icon: 'success',
title: 'Asistencia registrada!',
text: $lat,
timer: 2000,
confirm: false,
closeModal: true
);
$codigo = DB::table('area_code')
->where('name', $texto)
->first();
$corporativo = DB::table('area_code')
->where('name','like', '%COR%')
->first();
$user = Auth::user();
if($user->code == $corporativo->id){
if($codigo){
$planteles = $user->plantelUsuarios;
$match=0;
foreach($planteles as $plantel){
$latCentro = $plantel->latitud;
$lngCentro = $plantel->longitud;
$radioPermitido = 100; // metros
$distancia = $this->calcularDistancia($lat,$lng,$latCentro,$lngCentro);
if($distancia > $radioPermitido){
$match=1;
}else{
$match = 0;
break;
}
}
if($match == 1){
$this->dispatch('swal',
icon: 'error',
title: 'Error!',
text: 'Fuera del area permitida',
confirm: false,
closeModal: true
);
return;
}
$hoy = Carbon::today();
$asistenciasHoy = Code::where('user_id',$user->id)
->whereDate('registro',$hoy)
->orderBy('registro','desc')
->get();
if($asistenciasHoy->count() >= 4){
$this->dispatch('swal',
icon: 'warning',
title: 'Chequeos completos!',
text: 'Límite de registros alcanzados',
confirm: false,
closeModal: true,
);
return;
}
if($asistenciasHoy->count() > 0){
$ultima = Code::where('user_id',$user->id)
->whereDate('registro', today())
->latest('registro')
->first();
if($ultima->registro->diffInMinutes(now()) < 40){
$this->dispatch('swal',
icon: 'warning',
title: 'Espera!',
text: 'podrás checar 40 minutos despues de tu ultimo registro',
confirm: false,
closeModal: true,
);
return;
}
}
Code::create([
'user_id' => $user->id,
'codigo' => $texto,
'registro' => Carbon::now('America/Mexico_City')->format('d-m-Y H:i:s'),
'latitud' => $lat,
'longitud' => $lng,
]);
$this->dispatch('swal',
icon: 'success',
title: 'Excelente!',
text: 'asistencia registrada',
confirm: false,
closeModal: true,
reload:true
);
}else{
$this->dispatch('swal',
icon: 'error',
title: 'Código inexistente',
text: 'Este codigo no es institucional',
confirm: false,
closeModal: true
);
return;
}
}else{
if($codigo->id != $user->code){
$this->dispatch('swal',
icon: 'error',
title: 'Error!',
text: 'Este codigo no corresponde a tu area',
confirm: false,
closeModal: true
);
return;
}
$planteles = $user->plantelUsuarios;
$match=0;
foreach($planteles as $plantel){
$latCentro = $plantel->latitud;
$lngCentro = $plantel->longitud;
$radioPermitido = 100; // metros
$distancia = $this->calcularDistancia($lat,$lng,$latCentro,$lngCentro);
if($distancia > $radioPermitido){
$match=1;
}else{
$match = 0;
break;
}
}
if($match == 1){
$this->dispatch('swal',
icon: 'error',
title: 'Error!',
text: 'Fuera del area permitida',
confirm: false,
closeModal: true
);
return;
}
$hoy = Carbon::today();
$asistenciasHoy = Code::where('user_id',$user->id)
->whereDate('registro',$hoy)
->orderBy('registro','desc')
->get();
if($asistenciasHoy->count() >= 4){
$this->dispatch('swal',
icon: 'warning',
title: 'Chequeos completos!',
text: 'Límite de registros alcanzados',
confirm: false,
closeModal: true,
);
return;
}
if($asistenciasHoy->count() > 0){
$ultima = $asistenciasHoy->first();
if($ultima->registro->diffInMinutes(now()) < 40){
$this->dispatch('swal',
icon:'info',
title:'Aún no pasan 40 minutos'
);
return;
}
}
Code::create([
'user_id' => $user->id,
'codigo' => $texto,
'registro' => Carbon::now('America/Mexico_City')->format('d-m-Y H:i:s'),
'latitud' => $lat,
'longitud' => $lng,
]);
$this->dispatch('swal',
icon: 'success',
title: 'Excelente!',
text: 'asistencia registrada',
confirm: false,
closeModal: true,
reload:true
);
}
}
private function calcularDistancia($lat1,$lon1,$lat2,$lon2)
{
$radioTierra = 6371000;
$dLat = deg2rad($lat2 - $lat1);
$dLon = deg2rad($lon2 - $lon1);
$a = sin($dLat/2) * sin($dLat/2) +
cos(deg2rad($lat1)) *
cos(deg2rad($lat2)) *
sin($dLon/2) * sin($dLon/2);
$c = 2 * atan2(sqrt($a), sqrt(1-$a));
return $radioTierra * $c;
}
public function render()
-12
View File
@@ -11,7 +11,6 @@ use Laravel\Fortify\TwoFactorAuthenticatable;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\HasOne;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
@@ -25,11 +24,6 @@ class User extends Authenticatable
use TwoFactorAuthenticatable;
use HasRoles;
/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $fillable = [
'name',
'email',
@@ -50,16 +44,10 @@ class User extends Authenticatable
'status',
];
protected $appends = [
'profile_photo_url',
];
/**
* Get the attributes that should be cast.
*
* @return array<string, string>
*/
protected function casts(): array
{
return [