You are on page 1of 13

DROP DATABASE IF EXISTS BD_Control1;

CREATE DATABASE BD_Control1;


USE BD_Control1;

CREATE TABLE persona


(
idPersona INT AUTO_INCREMENT NOT NULL,
nombres VARCHAR (50) NOT NULL,
apellidos VARCHAR (50) NOT NULL,
dni char(8) NOT NULL,
correo VARCHAR (100),
sexo CHAR (1) NOT NULL,
fecha_Nacimiento DATE NOT NULL,
CONSTRAINT pk_idPersona PRIMARY KEY (idPersona),
CONSTRAINT uk_dni UNIQUE (dni)
);

CREATE TABLE empleado


(
idPersona INT AUTO_INCREMENT NOT NULL,
puesto VARCHAR(80) NOT NULL,
fecha_ingreso DATE NOT NULL,
fecha_cese DATE NOT NULL,
CONSTRAINT pk_empleado PRIMARY KEY (idPersona)
);

# ESTABLECEMOS LA RELACION ENTRE LA TABLA EMPLEADO Y LA TABLA PERSONA


ALTER TABLE empleado ADD CONSTRAINT fk_empleado_persona FOREIGN KEY (idPersona)
REFERENCES persona (idPersona);

CREATE TABLE horario


(
idHorario INT AUTO_INCREMENT NOT NULL,
idPersona INT NOT NULL,
hora_Ingreso TIME NOT NULL,
hora_Salida TIME NOT NULL,
dia VARCHAR (12) NOT NULL,
CONSTRAINT pk_horario PRIMARY KEY (idHorario)
);

# ESTABLECEMOS LA RELACION ENTRE LA TABLA REGISTRO Y LA TABLA EMPLEADO


ALTER TABLE horario ADD CONSTRAINT fk_registro_empleado FOREIGN KEY (idPersona)
REFERENCES empleado (idPersona);

CREATE TABLE registro


(
idRegistro INT AUTO_INCREMENT NOT NULL,
idPersona INT NOT NULL,
tipo CHAR (1) NOT NULL,
dia VARCHAR (12) NOT NULL,
hora TIME NOT NULL,
fecha DATE NOT NULL,
tardanza INT NOT NULL,
CONSTRAINT pk_registro PRIMARY KEY (idRegistro)
);

# ESTABLECEMOS LA RELACION ENTRE LA TABLA HORARIO Y LA TABLA EMPLEADO


ALTER TABLE registro ADD CONSTRAINT fk_horario_empleado FOREIGN KEY (idPersona)
REFERENCES empleado (idPersona);
CREATE TABLE usuario
(
idPersona INT NOT NULL,
nombre VARCHAR (50) NOT NULL,
contrasenia VARCHAR (100) NOT NULL,
CONSTRAINT pk_usuario PRIMARY KEY (idPersona)
);

# ESTABLECEMOS LA RELACION ENTRE LA TABLA USUARIO Y LA TABLA PERSONA


ALTER TABLE usuario ADD CONSTRAINT fk_usuario_persona FOREIGN KEY (idPersona)
REFERENCES persona (idPersona);

CREATE TABLE privilegio


(
idPersona INT NOT NULL,
archivo bit(1) DEFAULT NULL,
mantenimiento bit(1) DEFAULT NULL,
reportes bit(1) DEFAULT NULL,
usuario bit(1) DEFAULT NULL,
persona bit(1) DEFAULT NULL,
empleado bit(1) DEFAULT NULL,
horario bit(1) DEFAULT NULL,
asistencia bit(1) DEFAULT NULL,
CONSTRAINT pk_privilegio PRIMARY KEY (idPersona)
);

# ESTABLECEMOS LA RELACION ENTRE LA TABLA PRIVILEGIO Y LA TABLA USUARIO


ALTER TABLE privilegio ADD CONSTRAINT fk_privilegio_usuario FOREIGN KEY (idPersona)
REFERENCES usuario (idPersona);

# PROCEDIMIENTO ALMACENADO PARA INSERTAR PERSONAS


DELIMITER $$
CREATE PROCEDURE up_persona_insertar
(
IN _nombres VARCHAR(50),
IN _apellidos VARCHAR(50),
IN _dni INT,
IN _correo VARCHAR(100),
IN _sexo CHAR(1),
IN _fecha_nacimiento DATE
)
BEGIN
INSERT INTO persona (nombres, apellidos,dni,correo, sexo, fecha_nacimiento)
VALUES(_nombres, _apellidos,_dni,_correo,_sexo,_fecha_nacimiento);
END
$$

# PROCEDIMIENTO ALMACENADO PARA EDITAR PERSONAS


DELIMITER $$
CREATE PROCEDURE up_persona_editar
(
IN _idpersona int,
IN _nombres VARCHAR(50),
IN _apellidos VARCHAR(50),
IN _dni INT,
IN _correo VARCHAR(100),
IN _sexo CHAR(1),
IN _fecha_nacimiento DATE
)
BEGIN
UPDATE persona SET nombres = _nombres,
apellidos = _apellidos,
dni = _dni,
correo = _correo,
sexo = _sexo,
fecha_nacimiento = _fecha_nacimiento
WHERE idpersona = _idpersona;
END
$$

# PROCEDIMIENTO ALMACENADO PARA ELIMINAR PERSONAS


DELIMITER $$
CREATE PROCEDURE up_persona_eliminar
(
IN _idpersona int
)
BEGIN
DELETE FROM persona WHERE idpersona = _idpersona;
END
$$

# PROCEDIMIENTO ALMACENADO PARA LISTAR PERSONAS


DELIMITER $$
CREATE PROCEDURE up_persona_listar
(
)
BEGIN
SELECT idpersona, nombres, apellidos, dni, correo, sexo, fecha_nacimiento FROM
persona;
END
$$

# PROCEDIMIENTO ALMACENADO PARA BUSCAR PERSONAS


DELIMITER $$
CREATE PROCEDURE up_persona_buscar
(
IN _idpersona int
)
BEGIN
select idpersona, nombres, apellidos from persona
where idpersona= _idpersona;
END
$$

# PROCEDIMIENTO ALMACENADO PARA FILTRAR PERSONAS


DELIMITER $$
CREATE PROCEDURE up_persona_filtrar
(
IN _opcion varchar(1),
IN _nombres VARCHAR(50),
IN _apellidos VARCHAR(50),
IN _dni char(8)
)
BEGIN

IF _opcion = '1' THEN


select idpersona, nombres,apellidos,dni,correo,sexo,fecha_nacimiento
from persona
where (persona.nombres Like CONCAT(_nombres,'%'));
END IF;

IF _opcion = '2' THEN


select idpersona, nombres,apellidos,dni,correo,sexo,fecha_nacimiento
from persona
where (persona.apellidos Like CONCAT(_apellidos,'%'));
END IF;

IF _opcion = '3' THEN


select idpersona, nombres,apellidos,dni,correo,sexo,fecha_nacimiento
from persona
where (persona.dni Like CONCAT(_dni,'%'));
END IF;

END
$$

# PROCEDIMIENTO ALMACENADO PARA INSERTAR EMPLEADOS


DELIMITER $$
CREATE PROCEDURE up_empleado_insertar
(
IN _idpersona INT,
IN _puesto VARCHAR(80),
IN _fecha_ingreso DATE,
IN _fecha_cese DATE
)
BEGIN
INSERT INTO empleado (idpersona, puesto, fecha_ingreso, fecha_cese)
values(_idpersona,_puesto,_fecha_ingreso,_fecha_cese);
END
$$

# PROCEDIMIENTO ALMACENADO PARA EDITAR EMPLEADOS


DELIMITER $$
CREATE PROCEDURE up_empleado_editar
(
IN _idpersona int,
IN _puesto varchar(80),
IN _fecha_ingreso DATE ,
IN _fecha_cese DATE
)
BEGIN
UPDATE empleado SET puesto = _puesto,
fecha_ingreso = _fecha_ingreso,
fecha_cese = _fecha_cese
WHERE idpersona = _idpersona;
END
$$

# PROCEDIMIENTO ALMACENADO PARA ELIMINAR EMPLEADOS


DELIMITER $$
CREATE PROCEDURE up_empleado_eliminar
(
IN _idpersona int
)
BEGIN
DELETE FROM Empleado WHERE idpersona = _idpersona;
END
$$

# PROCEDIMIENTO ALMACENADO PARA LISTAR EMPLEADOS


DELIMITER $$
CREATE PROCEDURE up_empleado_listar
(
)
BEGIN
SELECT Persona.idpersona,Persona.nombres, Persona.apellidos, puesto,
fecha_ingreso, fecha_cese FROM empleado
INNER JOIN persona ON empleado.idpersona = persona.idpersona;
END
$$

# PROCEDIMIENTO ALMACENADO PARA BUSCAR EMPLEADOS


DELIMITER $$
CREATE PROCEDURE up_empleado_buscar
(
IN _idpersona int
)
BEGIN
select persona.idpersona, persona.nombres, persona.apellidos from persona
where persona.idpersona = _idpersona ;
END
$$

# PROCEDIMIENTO ALMACENADO PARA FILTRAR EMPLEADOS


DELIMITER $$
CREATE PROCEDURE up_empleado_filtrar
(
IN _opcion varchar(1),
IN _nombres VARCHAR(50),
IN _apellidos VARCHAR(50)
)
BEGIN

IF _opcion = '1' THEN


SELECT Persona.idpersona,Persona.nombres, Persona.apellidos, puesto,
fecha_ingreso, fecha_cese FROM empleado
INNER JOIN persona ON empleado.idpersona = persona.idpersona
WHERE (Persona.nombres Like CONCAT(_nombres,'%'));
END IF;

IF _opcion = '2' THEN


SELECT Persona.idpersona,Persona.nombres, Persona.apellidos, puesto,
fecha_ingreso, fecha_cese FROM empleado
INNER JOIN persona ON empleado.idpersona = persona.idpersona
WHERE (Persona.apellidos Like CONCAT(_apellidos,'%'));
END IF;

END
$$

# PROCEDIMIENTO ALMACENADO PARA INSERTAR USUARIOS


DELIMITER $$
CREATE PROCEDURE up_usuario_insertar
(
IN _idpersona int,
IN _nombre VARCHAR(50),
IN _contrasenia VARCHAR(100)
)
BEGIN
INSERT INTO usuario (idpersona, nombre, contrasenia)
VALUES(_idpersona,_nombre,_contrasenia);
END
$$

# PROCEDIMIENTO ALMACENADO PARA EDITAR USUARIOS


DELIMITER $$
CREATE PROCEDURE up_usuario_editar
(
IN _idpersona int,
IN _nombre varchar(50),
IN _contrasenia varchar(100)
)
BEGIN
UPDATE usuario SET nombre = _nombre,
contrasenia = _contrasenia
WHERE idpersona = _idpersona;
END
$$

# PROCEDIMIENTO ALMACENADO PARA ELIMINAR USUARIOS


DELIMITER $$
CREATE PROCEDURE up_usuario_eliminar
(
IN _idpersona int
)
BEGIN
DELETE FROM usuario WHERE idpersona = _idpersona;
END
$$

# PROCEDIMIENTO ALMACENADO PARA LISTAR USUARIOS


DELIMITER $$
CREATE PROCEDURE up_usuario_listar
(
)
BEGIN
SELECT Persona.idpersona,Persona.nombres, Persona.apellidos,nombre,
SHA(contrasenia) FROM usuario
INNER JOIN persona ON usuario.idpersona = persona.idpersona;
END
$$

# PROCEDIMIENTO ALMACENADO PARA BUSCAR USUARIOS


DELIMITER $$
CREATE PROCEDURE up_usuario_buscar
(
IN _nombre varchar(50)
)
BEGIN
SELECT Persona.apellidos, Persona.nombres FROM usuario
INNER JOIN persona ON usuario.idpersona = persona.idpersona
WHERE usuario.nombre = _nombre;
END
$$

# PROCEDIMIENTO ALMACENADO PARA FILTRAR USUARIOS


DELIMITER $$
CREATE PROCEDURE up_usuario_filtrar
(
IN _opcion varchar(1),
IN _nombres VARCHAR(50),
IN _apellidos VARCHAR(50)
)
BEGIN

IF _opcion = '1' THEN


SELECT Persona.idpersona,Persona.nombres, Persona.apellidos, nombre,
SHA(contrasenia) FROM usuario
INNER JOIN persona ON usuario.idpersona = persona.idpersona
WHERE (Persona.nombres Like CONCAT(_nombres,'%'));
END IF;

IF _opcion = '2' THEN


SELECT Persona.idpersona,Persona.nombres, Persona.apellidos, nombre,
SHA(contrasenia) FROM usuario
INNER JOIN persona ON usuario.idpersona = persona.idpersona
WHERE (Persona.apellidos Like CONCAT(_apellidos,'%'));
END IF;

END
$$

# PROCEDIMIENTO ALMACENADO PARA VALIDAR USUARIOS


DELIMITER $$
CREATE PROCEDURE up_usuario_validar
(
IN _nombre varchar(50),
IN _contrasenia varchar(50)
)
BEGIN
SELECT usuario.nombre, usuario.contrasenia FROM usuario
where usuario.nombre = _nombre and usuario.contrasenia = _contrasenia;
END
$$

# PROCEDIMIENTO ALMACENADO PARA INSERTAR HORARIOS


DELIMITER $$
CREATE PROCEDURE up_horario_insertar
(
IN _idpersona INT,
IN _hora_Ingreso TIME,
IN _hora_Salida TIME,
IN _dia VARCHAR(12)
)
BEGIN
INSERT INTO horario (idpersona, hora_Ingreso, hora_Salida, dia)
VALUES(_idpersona,_hora_Ingreso,_hora_Salida,_dia);
END
$$
# PROCEDIMIENTO ALMACENADO PARA EDITAR HORARIOS
DELIMITER $$
CREATE PROCEDURE up_horario_editar
(
IN _idhorario int,
IN _idpersona int,
IN _hora_ingreso time,
IN _hora_salida time,
IN _dia varchar(12)
)
BEGIN
UPDATE horario SET idpersona = _idpersona,
hora_ingreso = _hora_ingreso,
hora_salida = _hora_salida,
dia = _dia
WHERE idhorario = _idhorario;
END
$$

# PROCEDIMIENTO ALMACENADO PARA ELIMINAR HORARIOS


DELIMITER $$
CREATE PROCEDURE up_horario_eliminar
(
IN _idhorario int
)
BEGIN
DELETE FROM horario WHERE idhorario = _idhorario;
END
$$

# PROCEDIMIENTO ALMACENADO PARA LISTAR HORARIOS


DELIMITER $$
CREATE PROCEDURE up_horario_listar
(
)
BEGIN
SELECT horario.idhorario, persona.idPersona, persona.nombres,
persona.apellidos, horario.hora_Ingreso, horario.hora_Salida, horario.dia FROM
horario
INNER join persona ON horario.idpersona = persona.idpersona;
END
$$

# PROCEDIMIENTO ALMACENADO PARA FILTRAR HORARIOS


DELIMITER $$
CREATE PROCEDURE up_horario_filtrar
(
IN _opcion varchar(1),
IN _nombres VARCHAR(50),
IN _apellidos VARCHAR(50)
)
BEGIN

IF _opcion = '1' THEN


SELECT horario.idhorario, persona.idPersona, persona.nombres,
persona.apellidos, horario.hora_Ingreso, horario.hora_Salida,
horario.dia FROM horario
INNER join persona ON horario.idpersona = persona.idpersona
WHERE (Persona.nombres Like CONCAT(_nombres,'%'));
END IF;

IF _opcion = '2' THEN


SELECT horario.idhorario, persona.idPersona, persona.nombres,
persona.apellidos, horario.hora_Ingreso, horario.hora_Salida,
horario.dia FROM horario
INNER join persona ON horario.idpersona = persona.idpersona
WHERE (Persona.apellidos Like CONCAT(_apellidos,'%'));
END IF;

END
$$

# PROCEDIMIENTO ALMACENADO PARA BUSCAR HORARIOS EMPLEADOS


DELIMITER $$
CREATE PROCEDURE up_empleado_horario
(
IN _idpersona int
)
BEGIN
select persona.idpersona, persona.nombres, persona.apellidos from empleado
inner join persona on empleado.idPersona = persona.idPersona
where empleado.idpersona = _idpersona ;
END
$$

# PROCEDIMIENTO ALMACENADO PARA INSERTAR PRIVILEGIOS


DELIMITER $$
CREATE PROCEDURE up_privilegio_insertar
(
IN _idpersona INT,
IN _archivo bit(1),
IN _mantenimiento bit(1),
IN _reportes bit(1),
IN _usuario bit(1),
IN _persona bit(1),
IN _empleado bit(1),
IN _horario bit(1),
IN _asistencia bit(1)
)
BEGIN
INSERT INTO privilegio
(idPersona,archivo,mantenimiento,reportes,usuario,persona,empleado,horario,asistenc
ia)
VALUES(_idpersona,_archivo,_mantenimiento,_reportes,_usuario,_persona,_empleado,_ho
rario,_asistencia);
END
$$

# PROCEDIMIENTO ALMACENADO PARA EDITAR PRIVILEGIOS


DELIMITER $$
CREATE PROCEDURE up_privilegio_editar
(
IN _idpersona INT,
IN _archivo bit(1),
IN _mantenimiento bit(1),
IN _reportes bit(1),
IN _usuario bit(1),
IN _persona bit(1),
IN _empleado bit(1),
IN _horario bit(1),
IN _asistencia bit(1)
)
BEGIN
UPDATE privilegio SET archivo = _archivo,
mantenimiento = _mantenimiento,
reportes = _reportes,
usuario = _usuario,
persona = _persona,
empleado = _empleado,
horario = _horario,
asistencia = _asistencia
WHERE idpersona = _idpersona;
END
$$

# PROCEDIMIENTO ALMACENADO PARA ELIMINAR Privilegios


DELIMITER $$
CREATE PROCEDURE up_privilegio_eliminar
(
IN _idpersona int
)
BEGIN
DELETE FROM privilegio WHERE idpersona = _idpersona;
END
$$

# PROCEDIMIENTO ALMACENADO PARA LISTAR PRIVILEGIOS


DELIMITER $$
CREATE PROCEDURE up_privilegio_listar
(
)
BEGIN
SELECT usuario.idpersona,usuario.nombre, archivo, mantenimiento, reportes,
usuario, persona, empleado, horario, asistencia FROM privilegio
INNER JOIN usuario ON privilegio.idpersona = usuario.idpersona;
END
$$

# PROCEDIMIENTO ALMACENADO PARA BUSCAR USUARIOS-PRIVILEGIOS


DELIMITER $$
CREATE PROCEDURE up_privilegio_buscar
(
IN _idpersona INT
)
BEGIN
SELECT usuario.idPersona, usuario.nombre FROM usuario
WHERE usuario.idPersona = _idpersona;
END
$$

# PROCEDIMIENTO ALMACENADO PARA FILTRAR PRIVILEGIOS


DELIMITER $$
CREATE PROCEDURE up_privilegio_filtrar
(
IN _nombres VARCHAR(50)
)
BEGIN
SELECT usuario.idpersona,usuario.nombre, archivo, mantenimiento,
reportes, usuario, persona, empleado, horario, asistencia
FROM privilegio
INNER JOIN usuario ON privilegio.idpersona = usuario.idpersona
WHERE (usuario.nombre Like CONCAT(_nombres,'%'));

END
$$

# PROCEDIMIENTO ALMACENADO PARA VALIDAR PRIVILEGIOS


DELIMITER $$
CREATE PROCEDURE up_privilegios_validar
(
IN _nombre varchar(50),
IN _contrasenia varchar(50)
)
BEGIN
SELECT archivo, mantenimiento, reportes, usuario, persona, empleado, horario,
asistencia FROM privilegio
inner join usuario on privilegio.idPersona = usuario.idPersona
where usuario.nombre = _nombre and usuario.contrasenia = _contrasenia;
END
$$

DELIMITER $$
CREATE PROCEDURE up_registro_datos(
IN _codigo INT
)
BEGIN
SELECT CONCAT(per.apellidos,', ',per.nombres) AS 'APELLIDOS Y NOMBRES',
IF(reg.tipo='I','INGRESO','SALIDA')AS 'TIPO',reg.dia,reg.hora, reg.fecha,
reg.tardanza
FROM persona per INNER JOIN registro reg ON per.idpersona = reg.idpersona
WHERE reg.idpersona = _codigo ORDER BY reg.idregistro DESC LIMIT 1;
END
$$

DELIMITER $$
CREATE PROCEDURE up_registro_listar
(
)
BEGIN
SELECT CONCAT(persona.apellidos,', ',persona.nombres)AS 'Apellidos y Nombres',
IF(registro.tipo='I','Ingreso','Salida')AS 'Tipo',registro.dia,registro.hora,
registro.fecha, registro.tardanza from registro
inner join persona on registro.idpersona = persona.idpersona
order by registro.fecha DESC;
END
$$

DELIMITER $$
CREATE PROCEDURE up_registro_rango
(
IN _fecha_ini date,
IN _fecha_fin date
)
BEGIN
SELECT CONCAT(persona.apellidos,', ',persona.nombres)AS 'Apellidos y
Nombres',
IF(registro.tipo='I','Ingreso','Salida')AS 'Tipo',registro.dia,registro.hora,
registro.fecha, registro.tardanza from registro
inner join persona on persona.idpersona = registro.idpersona
WHERE DATE(registro.fecha) BETWEEN _fecha_ini AND _fecha_fin
order by registro.idRegistro;
END
$$

DELIMITER $$
CREATE PROCEDURE up_registro(
IN _dni INT
)

BEGIN

DECLARE _codigo BIGINT DEFAULT 0;


DECLARE _tipo_registro CHAR(1) DEFAULT '';

DECLARE _hora_asignada TIME DEFAULT '00:00:00';

SELECT per.idpersona INTO _codigo FROM persona per WHERE dni = _dni;

SELECT reg.tipo INTO _tipo_registro FROM registro reg WHERE reg.idpersona =


_codigo

ORDER BY reg.idregistro DESC LIMIT 1;

SET _hora_asignada = (SELECT HORA_ASIGNADA(_codigo, DAYNAME(NOW()),


_tipo_registro));

CASE _tipo_registro

WHEN 'I' THEN

INSERT INTO registro VALUES


(NULL,_codigo,'S',DAYNAME(NOW()),TIME(NOW()),DATE(NOW()), (SELECT penalizacion
(_hora_asignada, TIME(NOW()), _tipo_registro)));

WHEN 'S' THEN

INSERT INTO registro VALUES


(NULL,_codigo,'I',DAYNAME(NOW()),TIME(NOW()),DATE(NOW()), (SELECT penalizacion
(_hora_asignada, TIME(NOW()), _tipo_registro)));

ELSE

INSERT INTO registro VALUES


(NULL,_codigo,'I',DAYNAME(NOW()),TIME(NOW()),DATE(NOW()), (SELECT penalizacion
(_hora_asignada, TIME(NOW()), _tipo_registro)));

END CASE;

END
$$

#DROP FUNCTION penalizacion


DELIMITER $$
CREATE FUNCTION penalizacion(_hasignada TIME, hregistrada TIME, _tipo CHAR) RETURNS
INT
BEGIN
DECLARE _minutos INT DEFAULT 0;
#Aqui inverti las condiciones de los case
CASE _tipo

WHEN 'S' THEN


SET _minutos = HOUR(SUBTIME(hregistrada,_hasignada))*60 +
MINUTE(SUBTIME(hregistrada,_hasignada));
IF(SUBTIME(hregistrada,_hasignada)>0) THEN
RETURN _minutos;
ELSE
RETURN 0;
END IF;

WHEN 'I' THEN


SET _minutos = HOUR(SUBTIME(_hasignada,hregistrada))*60 +
MINUTE(SUBTIME(hregistrada,_hasignada));
IF(SUBTIME(_hasignada,hregistrada)>0) THEN
RETURN _minutos;
ELSE
RETURN 0;
END IF;
END CASE;
END
$$

#DROP FUNCTION HORA_ASIGNADA


DELIMITER $$
CREATE FUNCTION HORA_ASIGNADA(_idpersona INT,_dia VARCHAR(10), _tipo CHAR(1))
RETURNS TIME
BEGIN
DECLARE _hora TIME DEFAULT '00:00:00';
#Aqui tambien invertir las condiciones del if
IF(_tipo='S')THEN
SELECT hora_ingreso INTO _hora FROM horario WHERE idpersona = _idpersona AND
dia= _dia;
ELSE
SELECT hora_salida INTO _hora FROM horario WHERE idpersona = _idpersona AND dia=
_dia;
END IF;
RETURN _hora;
END
$$

You might also like