-- Tabla de colaboradores
CREATE TABLE colaboradores (
id_codcolaborador NUMBER PRIMARY KEY,
nombre VARCHAR2(25),
apellido VARCHAR2(25),
cedula VARCHAR2(12),
sexo CHAR(1),
fecha_nacimiento DATE,
fecha_ingreso DATE,
status CHAR(1),
salario_mensual NUMBER(15,2)
);
-- Tabla de salarios quincenales
CREATE TABLE salario_quincenal (
id_salario NUMBER PRIMARY KEY,
id_codcolaborador NUMBER,
fecha_pago DATE,
salario_quincenal NUMBER(15,2),
seguro_social NUMBER(15,2),
seguro_educativo NUMBER(15,2),
salario_neto NUMBER(15,2),
CONSTRAINT fk_colaborador FOREIGN KEY (id_codcolaborador)
REFERENCES colaboradores(id_codcolaborador)
);
-- Secuencia para IDs de colaboradores
CREATE SEQUENCE seq_id_colaborador
START WITH 1
INCREMENT BY 1
NOCACHE;
-- Secuencia para IDs de salarios
CREATE SEQUENCE seq_id_salario
START WITH 1
INCREMENT BY 1
NOCACHE;
SET SERVEROUTPUT ON;
DECLARE
v_id_codcolaborador colaboradores.id_codcolaborador%TYPE;
v_nombre [Link]%TYPE := '&nombre';
v_apellido [Link]%TYPE := '&apellido';
v_cedula [Link]%TYPE := '&cedula';
v_sexo [Link]%TYPE := '&sexo';
v_fecha_nacimiento DATE := TO_DATE('&fecha_nacimiento', 'YYYY-MM-DD');
v_fecha_ingreso DATE := TO_DATE('&fecha_ingreso', 'YYYY-MM-DD');
v_status [Link]%TYPE := '&status';
v_salario_mensual colaboradores.salario_mensual%TYPE := &salario_mensual;
BEGIN
SELECT seq_id_colaborador.NEXTVAL INTO v_id_codcolaborador FROM dual;
INSERT INTO colaboradores (
id_codcolaborador, nombre, apellido, cedula, sexo,
fecha_nacimiento, fecha_ingreso, status, salario_mensual
) VALUES (
v_id_codcolaborador, v_nombre, v_apellido, v_cedula, v_sexo,
v_fecha_nacimiento, v_fecha_ingreso, v_status, v_salario_mensual
);
DBMS_OUTPUT.PUT_LINE('Colaborador insertado con ID: ' || v_id_codcolaborador);
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
DBMS_OUTPUT.PUT_LINE('Error al insertar colaborador: ' || SQLERRM);
END;
/
DECLARE
CURSOR cur_colaboradores IS
SELECT id_codcolaborador, salario_mensual
FROM colaboradores
WHERE status = 'A';
v_id_colaborador colaboradores.id_codcolaborador%TYPE;
v_salario_mensual colaboradores.salario_mensual%TYPE;
v_salario_quincenal salario_quincenal.salario_quincenal%TYPE;
v_seguro_social salario_quincenal.seguro_social%TYPE;
v_seguro_educativo salario_quincenal.seguro_educativo%TYPE;
v_ir NUMBER(15,2);
v_salario_neto salario_quincenal.salario_neto%TYPE;
v_id_salario salario_quincenal.id_salario%TYPE;
v_fecha_pago DATE := TO_DATE('&fecha_pago', 'YYYY-MM-DD');
BEGIN
IF TO_CHAR(v_fecha_pago, 'DD') NOT IN ('15', '30') THEN
RAISE_APPLICATION_ERROR(-20001, 'La fecha debe ser el día 15 o 30 del
mes.');
END IF;
OPEN cur_colaboradores;
LOOP
FETCH cur_colaboradores INTO v_id_colaborador, v_salario_mensual;
EXIT WHEN cur_colaboradores%NOTFOUND;
v_salario_quincenal := v_salario_mensual / 2;
v_seguro_social := v_salario_quincenal * 0.0975;
v_seguro_educativo := v_salario_quincenal * 0.0125;
v_ir := v_salario_quincenal * 0.15;
v_salario_neto := v_salario_quincenal - v_seguro_social -
v_seguro_educativo - v_ir;
SELECT seq_id_salario.NEXTVAL INTO v_id_salario FROM dual;
INSERT INTO salario_quincenal (
id_salario, id_codcolaborador, fecha_pago,
salario_quincenal, seguro_social, seguro_educativo, salario_neto
) VALUES (
v_id_salario, v_id_colaborador, v_fecha_pago,
v_salario_quincenal, v_seguro_social, v_seguro_educativo,
v_salario_neto
);
END LOOP;
CLOSE cur_colaboradores;
COMMIT;
DBMS_OUTPUT.PUT_LINE('Cálculo completado para fecha: ' || TO_CHAR(v_fecha_pago,
'DD-MM-YYYY'));
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM);
END;
/
CREATE OR REPLACE VIEW vista_cumplimiento_salarios AS
SELECT
c.id_codcolaborador AS codigo,
[Link],
[Link],
c.salario_mensual,
sq.salario_quincenal,
sq.seguro_social,
sq.seguro_educativo,
sq.salario_neto
FROM
colaboradores c
JOIN (
SELECT id_codcolaborador, salario_quincenal, seguro_social,
seguro_educativo, salario_neto, fecha_pago
FROM salario_quincenal sq1
WHERE fecha_pago = (
SELECT MAX(fecha_pago)
FROM salario_quincenal sq2
WHERE sq2.id_codcolaborador = sq1.id_codcolaborador
)
) sq ON c.id_codcolaborador = sq.id_codcolaborador
WHERE [Link] = 'A'
ORDER BY c.id_codcolaborador;
//consulta a la vista
SELECT
codigo,
nombre,
apellido,
salario_mensual,
ROUND(salario_quincenal, 2) AS salario_quincenal,
ROUND(seguro_social, 2) AS seguro_social,
ROUND(seguro_educativo, 2) AS seguro_educativo,
ROUND(salario_neto, 2) AS salario_neto
FROM
vista_cumplimiento_salarios
ORDER BY
codigo;