/* ------------------------------------------------------------------ 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