Add citas module: scheduling, calendar, blocked schedules

This commit is contained in:
2026-04-08 00:48:36 -06:00
parent e19eb205db
commit 91da97685f
21 changed files with 3406 additions and 4 deletions

View File

@@ -0,0 +1,226 @@
@extends('admin.layouts.master')
@section('title', 'Editar Cita - Lash Vanshy')
@section('page-title', 'Editar Cita')
@section('content')
<!-- Breadcrumb -->
<nav aria-label="breadcrumb" class="mb-4">
<ol class="breadcrumb">
<li class="breadcrumb-item"><a href="{{ route('admin.dashboard') }}">Dashboard</a></li>
<li class="breadcrumb-item"><a href="{{ route('admin.citas.index') }}">Citas</a></li>
<li class="breadcrumb-item active" aria-current="page">Editar Cita</li>
</ol>
</nav>
<div class="row">
<div class="col-lg-8">
<div class="card-admin">
<div class="card-header">
<i class="fas fa-edit me-2"></i>Editar Cita
</div>
<div class="card-body">
<form method="POST" action="{{ route('admin.citas.update', $cita) }}">
@csrf
@method('PUT')
<div class="row">
<!-- Cliente Nombre -->
<div class="col-md-6 mb-3">
<label for="cliente_nombre" class="form-label">
Nombre del Cliente <span class="text-danger">*</span>
</label>
<input type="text"
class="form-control @error('cliente_nombre') is-invalid @enderror"
id="cliente_nombre"
name="cliente_nombre"
value="{{ old('cliente_nombre', $cita->cliente_nombre) }}"
required>
@error('cliente_nombre')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
<!-- Cliente Email -->
<div class="col-md-6 mb-3">
<label for="cliente_email" class="form-label">
Email <span class="text-danger">*</span>
</label>
<input type="email"
class="form-control @error('cliente_email') is-invalid @enderror"
id="cliente_email"
name="cliente_email"
value="{{ old('cliente_email', $cita->cliente_email) }}"
required>
@error('cliente_email')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
<!-- Cliente Teléfono -->
<div class="col-md-6 mb-3">
<label for="cliente_telefono" class="form-label">
Teléfono
</label>
<input type="tel"
class="form-control @error('cliente_telefono') is-invalid @enderror"
id="cliente_telefono"
name="cliente_telefono"
value="{{ old('cliente_telefono', $cita->cliente_telefono) }}">
@error('cliente_telefono')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
<!-- Servicio -->
<div class="col-md-6 mb-3">
<label for="servicio" class="form-label">
Servicio
</label>
<select class="form-select @error('servicio') is-invalid @enderror"
id="servicio"
name="servicio">
<option value="Lash Extensions" {{ old('servicio', $cita->servicio) == 'Lash Extensions' ? 'selected' : '' }}>Lash Extensions</option>
<option value="Lash Lift" {{ old('servicio', $cita->servicio) == 'Lash Lift' ? 'selected' : '' }}>Lash Lift</option>
<option value="Lash Removal" {{ old('servicio', $cita->servicio) == 'Lash Removal' ? 'selected' : '' }}>Lash Removal</option>
<option value="Relleno" {{ old('servicio', $cita->servicio) == 'Relleno' ? 'selected' : '' }}>Relleno</option>
<option value="Otro" {{ old('servicio', $cita->servicio) == 'Otro' ? 'selected' : '' }}>Otro</option>
</select>
</div>
</div>
<hr class="my-4">
<div class="row">
<!-- Fecha -->
<div class="col-md-6 mb-3">
<label for="fecha" class="form-label">
Fecha <span class="text-danger">*</span>
</label>
<input type="date"
class="form-control @error('fecha') is-invalid @enderror"
id="fecha"
name="fecha"
value="{{ old('fecha', $cita->fecha->format('Y-m-d')) }}"
min="{{ date('Y-m-d') }}"
required>
@error('fecha')
<div class="invalid-feedback">{{ $message }}</div>
@else
<small class="text-muted">
<i class="fas fa-info-circle me-1"></i>
Horario: 9:00 AM - 7:00 PM
</small>
@enderror
</div>
<!-- Hora Inicio -->
<div class="col-md-6 mb-3">
<label for="hora_inicio" class="form-label">
Hora <span class="text-danger">*</span>
</label>
<select class="form-select @error('hora_inicio') is-invalid @enderror"
id="hora_inicio"
name="hora_inicio"
required
disabled>
<option value="{{ $cita->hora_inicio }}">{{ \Carbon\Carbon::parse($cita->hora_inicio)->format('h:i A') }}</option>
</select>
@error('hora_inicio')
<div class="invalid-feedback">{{ $message }}</div>
@else
<small class="text-muted" id="horaHelp">
Duración: 60 minutos
</small>
@enderror
<div class="loading-spinner d-none" id="horaLoading">
<div class="spinner"></div>
</div>
</div>
</div>
<!-- Estado -->
<div class="mb-3">
<label for="estado" class="form-label">Estado</label>
<select class="form-select @error('estado') is-invalid @enderror"
id="estado"
name="estado">
<option value="pendiente" {{ old('estado', $cita->estado) == 'pendiente' ? 'selected' : '' }}>Pendiente</option>
<option value="confirmada" {{ old('estado', $cita->estado) == 'confirmada' ? 'selected' : '' }}>Confirmada</option>
<option value="completada" {{ old('estado', $cita->estado) == 'completada' ? 'selected' : '' }}>Completada</option>
<option value="cancelada" {{ old('estado', $cita->estado) == 'cancelada' ? 'selected' : '' }}>Cancelada</option>
</select>
</div>
<!-- Notas -->
<div class="mb-3">
<label for="notas" class="form-label">Notas</label>
<textarea class="form-control @error('notas') is-invalid @enderror"
id="notas"
name="notas"
rows="3"
placeholder="Notas adicionales...">{{ old('notas', $cita->notas) }}</textarea>
@error('notas')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
<div class="d-flex justify-content-between mt-4">
<a href="{{ route('admin.citas.index') }}" class="btn btn-secondary-admin">
<i class="fas fa-arrow-left me-2"></i>Volver
</a>
<button type="submit" class="btn btn-primary-admin">
<i class="fas fa-save me-2"></i>Guardar Cambios
</button>
</div>
</form>
</div>
</div>
</div>
<!-- Sidebar Info -->
<div class="col-lg-4">
<div class="card-admin mb-3">
<div class="card-header">
<i class="fas fa-info-circle me-2"></i>Información de la Cita
</div>
<div class="card-body">
<dl class="row mb-0">
<dt class="col-sm-5">Fecha Creación:</dt>
<dd class="col-sm-7">{{ $cita->created_at->format('d/m/Y H:i') }}</dd>
<dt class="col-sm-5">Última Actualización:</dt>
<dd class="col-sm-7">{{ $cita->updated_at->format('d/m/Y H:i') }}</dd>
@if($cita->mensaje)
<dt class="col-sm-5">Desde Mensaje:</dt>
<dd class="col-sm-7">
<a href="{{ route('admin.mensajes.show', $cita->mensaje) }}">Ver mensaje</a>
</dd>
@endif
</dl>
</div>
</div>
<div class="card-admin">
<div class="card-header">
<i class="fas fa-exclamation-triangle me-2"></i>¿Cancelar Cita?
</div>
<div class="card-body">
<p class="text-muted mb-3">
¿Necesita cancelar esta cita? Puede cambiar el estado a "Cancelada" desde el formulario o eliminarla permanentemente.
</p>
<form action="{{ route('admin.citas.destroy', $cita) }}" method="POST"
onsubmit="return confirm('¿Estás seguro de que deseas eliminar esta cita? Esta acción no se puede deshacer.')">
@csrf
@method('DELETE')
<button type="submit" class="btn btn-danger-admin w-100">
<i class="fas fa-trash me-2"></i>Eliminar Cita
</button>
</form>
</div>
</div>
</div>
</div>
@endsection