Files
MBS/PROYECTO/addir/adprmt017_capacitacion.sql

111 lines
5.0 KiB
Transact-SQL

/* ------------------------------------------------------------------
ADPRMT017 - Accion de Personal: movimientos de CAPACITACION
Fecha : 2026-10-05
Crea : adtb00059 (catalogo de capacitaciones)
adtb00060 (capacitacion por empleado: requerida / tomada)
movimientos en adtb00009
vista vw_capacitacion_empleado (requeridas vs tomadas)
Correr en: marmotech (probar primero en .40.9)
Idempotente: se puede correr mas de una vez.
------------------------------------------------------------------- */
SET NOCOUNT ON;
/* 1. Catalogo de capacitaciones */
IF OBJECT_ID('dbo.adtb00059') IS NULL
BEGIN
CREATE TABLE dbo.adtb00059 (
cod_cap INT IDENTITY(1,1) NOT NULL CONSTRAINT pk_adtb00059 PRIMARY KEY,
nom_cap VARCHAR(100) NOT NULL,
evento SMALLINT NULL, -- 1 Seminario 2 Curso 3 Taller 4 Conferencia (igual que adtb00022)
horas DECIMAL(6,2) NULL, -- horas estandar del curso
status_t CHAR(1) NULL,
us_crea VARCHAR(50) NULL,
fech_crea DATETIME NULL,
us_mod VARCHAR(50) NULL,
fech_mod DATETIME NULL
);
CREATE UNIQUE INDEX ux_adtb00059_nom ON dbo.adtb00059(nom_cap) WHERE status_t IS NULL;
END
GO
/* 2. Capacitacion por empleado
tipo_reg 'R' = requerida (plan), 'T' = tomada (ejecutada)
Una 'T' puede referenciar la 'R' que cubre (id_requerida). */
IF OBJECT_ID('dbo.adtb00060') IS NULL
BEGIN
CREATE TABLE dbo.adtb00060 (
id_cap INT IDENTITY(1,1) NOT NULL CONSTRAINT pk_adtb00060 PRIMARY KEY,
num_trx INT NOT NULL, -- adtb00020.num_trx
num_emp INT NOT NULL,
tipo_reg CHAR(1) NOT NULL CONSTRAINT ck_adtb00060_tipo CHECK (tipo_reg IN ('R','T')),
cod_cap INT NOT NULL CONSTRAINT fk_adtb00060_cap REFERENCES dbo.adtb00059(cod_cap),
id_requerida INT NULL CONSTRAINT fk_adtb00060_req REFERENCES dbo.adtb00060(id_cap),
horas_req DECIMAL(6,2) NULL,
horas_tom DECIMAL(6,2) NULL,
fecha_ini DATE NULL,
fecha_fin DATE NULL,
institucion VARCHAR(100) NULL,
costo DECIMAL(12,2) NULL,
status_t CHAR(1) NULL, -- 'E' = anulado (junto con la accion)
us_crea VARCHAR(50) NULL,
fech_crea DATETIME NULL,
us_mod VARCHAR(50) NULL,
fech_mod DATETIME NULL
);
CREATE INDEX ix_adtb00060_emp ON dbo.adtb00060(num_emp, tipo_reg) INCLUDE (cod_cap, horas_req, horas_tom, status_t);
CREATE INDEX ix_adtb00060_trx ON dbo.adtb00060(num_trx);
CREATE INDEX ix_adtb00060_req ON dbo.adtb00060(id_requerida);
END
GO
/* 3. Movimientos de accion de personal */
IF NOT EXISTS (SELECT 1 FROM dbo.adtb00009 WHERE tipo_mov = 'CAPACITACION REQUERIDA')
INSERT INTO dbo.adtb00009 (cod_mto, desc_mto, tipo_mov, status_t, us_crea, fech_crea)
SELECT ISNULL(MAX(cod_mto),0) + 1, 'CAPACITACION REQUERIDA', 'CAPACITACION REQUERIDA', NULL, SUSER_SNAME(), GETDATE()
FROM dbo.adtb00009;
IF NOT EXISTS (SELECT 1 FROM dbo.adtb00009 WHERE tipo_mov = 'CAPACITACION TOMADA')
INSERT INTO dbo.adtb00009 (cod_mto, desc_mto, tipo_mov, status_t, us_crea, fech_crea)
SELECT ISNULL(MAX(cod_mto),0) + 1, 'CAPACITACION TOMADA', 'CAPACITACION TOMADA', NULL, SUSER_SNAME(), GETDATE()
FROM dbo.adtb00009;
GO
/* 4. Vista: por empleado, cada capacitacion requerida con lo tomado debajo.
Las tomadas sin requerida asociada salen con tipo 'T' y horas_req 0. */
IF OBJECT_ID('dbo.vw_capacitacion_empleado') IS NOT NULL
DROP VIEW dbo.vw_capacitacion_empleado;
GO
CREATE VIEW dbo.vw_capacitacion_empleado AS
SELECT e.num_emp,
RTRIM(e.nom1_emp) + ' ' + RTRIM(e.apell1_emp) AS empleado,
e.departamento,
d.nom_dpto,
r.tipo_reg,
r.id_cap,
c.cod_cap,
c.nom_cap,
c.evento,
CASE c.evento WHEN 1 THEN 'SEMINARIO' WHEN 2 THEN 'CURSO'
WHEN 3 THEN 'TALLER' WHEN 4 THEN 'CONFERENCIA' END AS tipo_evento,
CASE WHEN r.tipo_reg = 'R' THEN ISNULL(r.horas_req,0) ELSE 0 END AS horas_requeridas,
CASE WHEN r.tipo_reg = 'R'
THEN ISNULL((SELECT SUM(t.horas_tom) FROM dbo.adtb00060 t
WHERE t.id_requerida = r.id_cap AND t.status_t IS NULL),0)
ELSE ISNULL(r.horas_tom,0) END AS horas_tomadas,
CASE WHEN r.tipo_reg = 'R'
THEN ISNULL(r.horas_req,0) - ISNULL((SELECT SUM(t.horas_tom) FROM dbo.adtb00060 t
WHERE t.id_requerida = r.id_cap AND t.status_t IS NULL),0)
ELSE 0 END AS horas_pendientes,
r.fecha_ini,
r.fecha_fin,
r.institucion,
r.costo,
r.num_trx
FROM dbo.adtb00060 r
JOIN dbo.adtb00059 c ON c.cod_cap = r.cod_cap
JOIN dbo.adtb00003 e ON e.num_emp = r.num_emp
LEFT JOIN dbo.adtb00001 d ON d.departamento = e.departamento
WHERE r.status_t IS NULL
AND (r.tipo_reg = 'R' OR r.id_requerida IS NULL);
GO