SalonSync DB
Accede al portal de administración y base de datos de la peluquería.
"La belleza respaldada por datos."
Gestión de clientes, citas e inventario en tiempo real.
Accede al portal de administración y base de datos de la peluquería.
Gestión de clientes, citas e inventario en tiempo real.
-- ==============================================
-- ESTE CÓDIGO ESTÁ LISTO PARA SER IMPLEMENTADO
-- EN UN MOTOR MYSQL REAL PARA VOLVERLO FULL-STACK
-- ==============================================
CREATE TABLE Clientes (
id_cliente INT PRIMARY KEY AUTO_INCREMENT,
nombre VARCHAR(100) NOT NULL,
telefono VARCHAR(20),
email VARCHAR(100) UNIQUE,
fecha_registro TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE Empleados (
id_empleado INT PRIMARY KEY AUTO_INCREMENT,
nombre VARCHAR(100) NOT NULL,
especialidad VARCHAR(50), -- Ej: Colorista, Barbero, Manicurista
porcentaje_comision DECIMAL(5,2) DEFAULT 0.00
);
CREATE TABLE Servicios (
id_servicio INT PRIMARY KEY AUTO_INCREMENT,
nombre_servicio VARCHAR(100) NOT NULL,
duracion_minutos INT NOT NULL,
precio DECIMAL(10,2) NOT NULL
);
CREATE TABLE Citas (
id_cita INT PRIMARY KEY AUTO_INCREMENT,
id_cliente INT,
id_empleado INT,
id_servicio INT,
fecha_hora DATETIME NOT NULL,
estado ENUM('Pendiente', 'Completado', 'Cancelado') DEFAULT 'Pendiente',
FOREIGN KEY (id_cliente) REFERENCES Clientes(id_cliente),
FOREIGN KEY (id_empleado) REFERENCES Empleados(id_empleado),
FOREIGN KEY (id_servicio) REFERENCES Servicios(id_servicio)
);
-- ==============================================
-- FUNCIONES Y PROCEDIMIENTOS ALMACENADOS
-- ==============================================
-- 1. Función para agendar una nueva cita verificando disponibilidad
DELIMITER //
CREATE PROCEDURE AgendarCita(
IN p_cliente_id INT,
IN p_empleado_id INT,
IN p_servicio_id INT,
IN p_fecha_hora DATETIME
)
BEGIN
DECLARE v_conflictos INT;
-- Verificar si el empleado ya tiene una cita en esa hora exacta
SELECT COUNT(*) INTO v_conflictos
FROM Citas
WHERE id_empleado = p_empleado_id
AND fecha_hora = p_fecha_hora AND estado != 'Cancelado';
IF v_conflictos > 0 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'El estilista ya tiene una cita en ese horario.';
ELSE
INSERT INTO Citas (id_cliente, id_empleado, id_servicio, fecha_hora)
VALUES (p_cliente_id, p_empleado_id, p_servicio_id, p_fecha_hora);
END IF;
END //
DELIMITER ;
-- 2. Función para calcular ingresos del día
DELIMITER //
CREATE FUNCTION CalcularIngresosDelDia(fecha_consulta DATE)
RETURNS DECIMAL(10,2)
DETERMINISTIC
BEGIN
DECLARE total_ingresos DECIMAL(10,2);
SELECT SUM(s.precio) INTO total_ingresos
FROM Citas c
JOIN Servicios s ON c.id_servicio = s.id_servicio
WHERE DATE(c.fecha_hora) = fecha_consulta
AND c.estado = 'Completado';
RETURN IFNULL(total_ingresos, 0.00);
END //
DELIMITER ;
-- 3. Vista rápida (VIEW) para el Dashboard Frontend
CREATE VIEW VistaCitasDeHoy AS
SELECT
c.id_cita,
cl.nombre AS cliente,
s.nombre_servicio AS servicio,
e.nombre AS estilista,
TIME(c.fecha_hora) AS hora,
c.estado
FROM Citas c
JOIN Clientes cl ON c.id_cliente = cl.id_cliente
JOIN Servicios s ON c.id_servicio = s.id_servicio
JOIN Empleados e ON c.id_empleado = e.id_empleado
WHERE DATE(c.fecha_hora) = CURDATE()
ORDER BY c.fecha_hora ASC;