Comence con las vistas. El modelo de agenda está practicamente terminado
This commit is contained in:
@@ -76,4 +76,5 @@ class AgendaController extends Controller
|
||||
'message' => 'Registro eliminado correctamente',
|
||||
], 200);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,237 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\CredencialCliente;
|
||||
use App\Models\CredencialProfesional;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
class AuthController extends Controller
|
||||
{
|
||||
public function loginClienteWeb(Request $request): RedirectResponse
|
||||
{
|
||||
$request->validate([
|
||||
'correo' => ['required', 'string'],
|
||||
'contra' => ['required', 'string'],
|
||||
]);
|
||||
|
||||
$correo = trim((string) $request->input('correo'));
|
||||
$contra = (string) $request->input('contra');
|
||||
|
||||
$credencial = CredencialCliente::where('correo', $correo)->first();
|
||||
if (!$credencial || !$this->credencialValida($contra, (string) $credencial->contra)) {
|
||||
return back()
|
||||
->withInput($request->except('contra'))
|
||||
->with('login_error', 'Usuario o contraseña incorrectos.');
|
||||
}
|
||||
|
||||
$token = Str::random(64);
|
||||
$credencial->token = $token;
|
||||
$credencial->fecha_hora = now();
|
||||
$credencial->save();
|
||||
|
||||
return back()->with('login_success', 'Login exitoso.');
|
||||
}
|
||||
|
||||
public function loginPersonalWeb(Request $request): RedirectResponse
|
||||
{
|
||||
$request->validate([
|
||||
'usuario' => ['required', 'string'],
|
||||
'contra' => ['required', 'string'],
|
||||
]);
|
||||
|
||||
$usuario = trim((string) $request->input('usuario'));
|
||||
$contra = (string) $request->input('contra');
|
||||
|
||||
$credencial = CredencialProfesional::where('usuario', $usuario)->first();
|
||||
if (!$credencial || !$this->credencialValida($contra, (string) $credencial->contra)) {
|
||||
return back()
|
||||
->withInput($request->except('contra'))
|
||||
->with('login_error', 'Usuario o contraseña incorrectos.');
|
||||
}
|
||||
|
||||
$token = Str::random(64);
|
||||
$credencial->token = $token;
|
||||
$credencial->fecha_hora = now();
|
||||
$credencial->save();
|
||||
|
||||
return back()->with('login_success', 'Login exitoso.');
|
||||
}
|
||||
|
||||
public function loginCliente(Request $request): JsonResponse
|
||||
{
|
||||
$request->validate([
|
||||
'correo' => ['required', 'string'],
|
||||
'contra' => ['required', 'string'],
|
||||
]);
|
||||
|
||||
$correo = trim((string) $request->input('correo'));
|
||||
$contra = (string) $request->input('contra');
|
||||
|
||||
$credencial = CredencialCliente::where('correo', $correo)->first();
|
||||
if (!$credencial || !$this->credencialValida($contra, (string) $credencial->contra)) {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Credenciales invalidas',
|
||||
], 401);
|
||||
}
|
||||
|
||||
$token = Str::random(64);
|
||||
$credencial->token = $token;
|
||||
$credencial->fecha_hora = now();
|
||||
$credencial->save();
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'data' => [
|
||||
'tipo' => 'cliente',
|
||||
'id_credencial' => $credencial->id,
|
||||
'token' => $token,
|
||||
],
|
||||
'message' => 'Login de cliente exitoso',
|
||||
], 200);
|
||||
}
|
||||
|
||||
public function loginPersonal(Request $request): JsonResponse
|
||||
{
|
||||
$request->validate([
|
||||
'usuario' => ['required', 'string'],
|
||||
'contra' => ['required', 'string'],
|
||||
]);
|
||||
|
||||
$usuario = trim((string) $request->input('usuario'));
|
||||
$contra = (string) $request->input('contra');
|
||||
|
||||
$credencial = CredencialProfesional::where('usuario', $usuario)->first();
|
||||
if (!$credencial || !$this->credencialValida($contra, (string) $credencial->contra)) {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Credenciales invalidas',
|
||||
], 401);
|
||||
}
|
||||
|
||||
$token = Str::random(64);
|
||||
$credencial->token = $token;
|
||||
$credencial->fecha_hora = now();
|
||||
$credencial->save();
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'data' => [
|
||||
'tipo' => 'personal',
|
||||
'rol' => $credencial->rol,
|
||||
'id_credencial' => $credencial->id,
|
||||
'token' => $token,
|
||||
],
|
||||
'message' => 'Login de personal exitoso',
|
||||
], 200);
|
||||
}
|
||||
|
||||
public function login(Request $request): JsonResponse
|
||||
{
|
||||
$request->validate([
|
||||
'identificador' => ['required', 'string'],
|
||||
'contra' => ['required', 'string'],
|
||||
'tipo' => ['nullable', 'in:cliente,profesional'],
|
||||
]);
|
||||
|
||||
$identificador = trim((string) $request->input('identificador'));
|
||||
$contra = (string) $request->input('contra');
|
||||
$tipo = $request->input('tipo');
|
||||
|
||||
$credencial = null;
|
||||
$tipoDetectado = null;
|
||||
|
||||
if ($tipo === 'cliente') {
|
||||
$credencial = CredencialCliente::where('correo', $identificador)->first();
|
||||
$tipoDetectado = 'cliente';
|
||||
} elseif ($tipo === 'profesional') {
|
||||
$credencial = CredencialProfesional::where('usuario', $identificador)->first();
|
||||
$tipoDetectado = 'personal';
|
||||
} else {
|
||||
$credencial = CredencialCliente::where('correo', $identificador)->first();
|
||||
$tipoDetectado = $credencial ? 'cliente' : null;
|
||||
|
||||
if (!$credencial) {
|
||||
$credencial = CredencialProfesional::where('usuario', $identificador)->first();
|
||||
$tipoDetectado = $credencial ? 'personal' : null;
|
||||
}
|
||||
}
|
||||
|
||||
if (!$credencial || !$this->credencialValida($contra, (string) $credencial->contra)) {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Credenciales invalidas',
|
||||
], 401);
|
||||
}
|
||||
|
||||
$token = Str::random(64);
|
||||
$credencial->token = $token;
|
||||
$credencial->fecha_hora = now();
|
||||
$credencial->save();
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'data' => [
|
||||
'tipo' => $tipoDetectado,
|
||||
'rol' => $credencial instanceof CredencialProfesional ? $credencial->rol : null,
|
||||
'id_credencial' => $credencial->id,
|
||||
'token' => $token,
|
||||
],
|
||||
'message' => 'Login exitoso',
|
||||
], 200);
|
||||
}
|
||||
|
||||
public function logout(Request $request): JsonResponse
|
||||
{
|
||||
$token = (string) $request->input('token', '');
|
||||
if ($token === '') {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Token requerido',
|
||||
], 422);
|
||||
}
|
||||
|
||||
$credencialCliente = CredencialCliente::where('token', $token)->first();
|
||||
if ($credencialCliente) {
|
||||
$credencialCliente->token = null;
|
||||
$credencialCliente->fecha_hora = now();
|
||||
$credencialCliente->save();
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'message' => 'Logout exitoso',
|
||||
], 200);
|
||||
}
|
||||
|
||||
$credencialProfesional = CredencialProfesional::where('token', $token)->first();
|
||||
if ($credencialProfesional) {
|
||||
$credencialProfesional->token = null;
|
||||
$credencialProfesional->fecha_hora = now();
|
||||
$credencialProfesional->save();
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'message' => 'Logout exitoso',
|
||||
], 200);
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Token invalido',
|
||||
], 401);
|
||||
}
|
||||
|
||||
private function credencialValida(string $contraIngresada, string $contraGuardada): bool
|
||||
{
|
||||
if ($contraIngresada === $contraGuardada) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return Hash::check($contraIngresada, $contraGuardada);
|
||||
}
|
||||
}
|
||||
@@ -3,7 +3,6 @@
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\EstadoTurno;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class EstadoTurnoController extends Controller
|
||||
@@ -11,41 +10,43 @@ class EstadoTurnoController extends Controller
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
public function index(): JsonResponse
|
||||
public function index() : JsonResponse
|
||||
{
|
||||
$items = EstadoTurno::all();
|
||||
|
||||
$estadoTurnos = EstadoTurno::all();
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'data' => $items,
|
||||
'message' => 'Registros obtenidos correctamente',
|
||||
'data' => $estadoTurnos,
|
||||
'message' => 'Estados de turno obtenidos correctamente'
|
||||
], 200);
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*/
|
||||
public function store(Request $request): JsonResponse
|
||||
public function store(Request $request) : JsonResponse
|
||||
{
|
||||
$payload = $request->only((new EstadoTurno())->getFillable());
|
||||
$estadoTurno = EstadoTurno::create($payload);
|
||||
$validated = $request->validate([
|
||||
'descripcion' => 'required|string|max:255|unique:estado_turnos,descripcion',
|
||||
]);
|
||||
|
||||
$estadoTurno = EstadoTurno::create($validated);
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'data' => $estadoTurno,
|
||||
'message' => 'Registro creado correctamente',
|
||||
'message' => 'Estado de turno creado correctamente'
|
||||
], 201);
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the specified resource.
|
||||
*/
|
||||
public function show(EstadoTurno $estadoTurno): JsonResponse
|
||||
public function show(EstadoTurno $estadoTurno) : JsonResponse
|
||||
{
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'data' => $estadoTurno,
|
||||
'message' => 'Registro obtenido correctamente',
|
||||
'message' => 'Estado de turno obtenido correctamente'
|
||||
], 200);
|
||||
}
|
||||
|
||||
@@ -54,26 +55,28 @@ class EstadoTurnoController extends Controller
|
||||
*/
|
||||
public function update(Request $request, EstadoTurno $estadoTurno): JsonResponse
|
||||
{
|
||||
$payload = $request->only((new EstadoTurno())->getFillable());
|
||||
$estadoTurno->update($payload);
|
||||
$validated = $request->validate([
|
||||
'descripcion' => 'required|string|max:255|unique:estado_turnos,descripcion,' . $estadoTurno->id,
|
||||
]);
|
||||
|
||||
$estadoTurno->update($validated);
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'data' => $estadoTurno,
|
||||
'message' => 'Registro actualizado correctamente',
|
||||
], 200);
|
||||
'message' => 'Estado de turno actualizado correctamente'
|
||||
], 200);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified resource from storage.
|
||||
*/
|
||||
public function destroy(EstadoTurno $estadoTurno): JsonResponse
|
||||
public function destroy(EstadoTurno $estadoTurno) : JsonResponse
|
||||
{
|
||||
$estadoTurno->delete();
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'message' => 'Registro eliminado correctamente',
|
||||
], 200);
|
||||
'message' => 'Estado de turno eliminado correctamente'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,6 +6,8 @@ use App\Models\Profesional;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
use App\Http\Controllers\LogSeguridadController;
|
||||
|
||||
class ProfesionalController extends Controller
|
||||
{
|
||||
/**
|
||||
@@ -22,21 +24,54 @@ class ProfesionalController extends Controller
|
||||
], 200);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*/
|
||||
public function store(Request $request): JsonResponse
|
||||
{
|
||||
$payload = $request->only((new Profesional())->getFillable());
|
||||
$profesional = Profesional::create($payload);
|
||||
public function store(Request $request): JsonResponse
|
||||
{
|
||||
// 1. Validamos los datos de entrada
|
||||
$validated = $request->validate([
|
||||
'inicio' => 'required|date_format:Y-m-d H:i:s',
|
||||
'correo' => 'nullable|email|max:255',
|
||||
'nombrecompleto' => 'nullable|string|max:255',
|
||||
'descripcion' => 'required|string',
|
||||
'cliente_id' => 'nullable|exists:clientes,id',
|
||||
'estadoturno_id' => 'required|exists:estadosturnos,id',
|
||||
'agenda_id' => 'required|exists:agendas,id',
|
||||
'profesional_id' => 'required|exists:profesionales,id',
|
||||
'servicio_id' => 'required|exists:servicios,id',
|
||||
'modalidad_id' => 'required|exists:modalidades,id',
|
||||
]);
|
||||
// 2. Verificamos si el profesional ya tiene un turno en ese "inicio"
|
||||
$existeTurno = Turno::where('profesional_id', $validated['profesional_id'])
|
||||
->where('inicio', $validated['inicio'])
|
||||
->whereIn('estadoturno_id', [1, 2]) // 1: Pendiente, 2: Confirmado
|
||||
->exists();
|
||||
|
||||
if ($existeTurno) {
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'data' => $profesional,
|
||||
'message' => 'Registro creado correctamente',
|
||||
], 201);
|
||||
'success' => false,
|
||||
'message' => 'Horario no disponible.',
|
||||
], 422); // Error de validación lógica
|
||||
}
|
||||
|
||||
$turno = Turno::create($validated);
|
||||
|
||||
// 3. Registramos el evento en el log de seguridad
|
||||
$personaId = auth()->check() ? auth()->user()->persona->id : null;
|
||||
LogSeguridadController::registrarAccion('Creacion de turno ID: ' . $turno->id, 'Profesional', 17, $personaId);
|
||||
|
||||
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'data' => $turno,
|
||||
'message' => 'Turno agendado correctamente para el ' . $turno->inicio->format('d/m/Y H:i'),
|
||||
], 201);
|
||||
|
||||
}
|
||||
/**
|
||||
* Display the specified resource.
|
||||
*/
|
||||
@@ -76,4 +111,14 @@ class ProfesionalController extends Controller
|
||||
'message' => 'Registro eliminado correctamente',
|
||||
], 200);
|
||||
}
|
||||
|
||||
public function aceptarFormulario(Formulario $formulario): JsonResponse
|
||||
{
|
||||
$turno->update(['estadoturno_id' => 2]);
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'message' => 'Turno aceptado correctamente',
|
||||
], 200);
|
||||
}
|
||||
}
|
||||
@@ -76,4 +76,59 @@ class TurnoController extends Controller
|
||||
'message' => 'Registro eliminado correctamente',
|
||||
], 200);
|
||||
}
|
||||
|
||||
public function confirmar(Turno $turno): JsonResponse
|
||||
{
|
||||
$turno->confirmar();
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'data' => $turno,
|
||||
'message' => 'Turno confirmado correctamente',
|
||||
], 200);
|
||||
}
|
||||
|
||||
public function cancelar(Turno $turno): JsonResponse
|
||||
{
|
||||
$turno->cancelar();
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'data' => $turno,
|
||||
'message' => 'Turno cancelado correctamente',
|
||||
], 200);
|
||||
}
|
||||
|
||||
public function reprogramar(Turno $turno): JsonResponse
|
||||
{
|
||||
$turno->reprogramar();
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'data' => $turno,
|
||||
'message' => 'Turno reprogramado correctamente',
|
||||
], 200);
|
||||
}
|
||||
|
||||
public function clienteAusente(Turno $turno): JsonResponse
|
||||
{
|
||||
$turno->clienteAusente();
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'data' => $turno,
|
||||
'message' => 'Turno marcado como cliente ausente',
|
||||
], 200);
|
||||
}
|
||||
|
||||
public function clientePresente(Turno $turno): JsonResponse
|
||||
{
|
||||
$turno->clientePresente();
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'data' => $turno,
|
||||
'message' => 'Turno marcado como cliente presente',
|
||||
], 200);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user