Files
MBS/PROYECTO/nodir/noprmt021.4gl
T

257 lines
8.1 KiB
Plaintext

{
----------------------------------------------------------------------------
PROGRAMA ; NOPRMT021
OBJETIVO : GENERAR LAS HORAS DE VACACIONES DE LOS EMPLEADOS SEMANALES
PROGRAMADOR: JUAN F. SOTO
FECHA : NOVIEMBRE 6, 1995.
-----------------------------------------------------------------------------
}
GLOBALS
"noprgb000.4gl"
DEFINE p_fecha_del,p_fecha_al DATE,
valor_vacacion,dias,p_h_normal DECIMAL(8,2),
empleados CHAR(300),
semanas,p_mes,tiempo SMALLINT,
factor DECIMAL(12,2)
DEFINE datos_emp RECORD
num_emp LIKE adtb00003.num_emp,
departamento LIKE adtb00003.departamento,
nivel_emp LIKE adtb00003.nivel_emp,
cod_puesto LIKE adtb00003.cod_puesto,
nom1_emp LIKE adtb00003.nom1_emp,
apell1_emp LIKE adtb00003.apell1_emp,
sueldo LIKE adtb00003.sueldo_ac,
paga_seg LIKE adtb00003.paga_seg,
fecha DATE
END RECORD
DEFINE datos_nomi RECORD
num_nomi LIKE notb00010.num_nomi,
tipo_emp LIKE notb00010.tipo_emp,
mes SMALLINT
END RECORD,
vacaciones DYNAMIC ARRAY OF RECORD
num_nomi INT,
tipo_emp CHAR(2),
num_emp INT,
departamento INT,
nivel_emp SMALLINT,
cod_puesto SMALLINT,
cod_mov SMALLINT,
fecha_entrada DATE,
valor_vaca DEC(12,2)
END RECORD
MAIN
DEFER INTERRUPT
CALL ARG_VAL(1) RETURNING usuarios
CALL ARG_VAL(2) RETURNING clave
CONNECT to "smarmotech" USER usuarios USING clave
SELECT a.* INTO p_companias.* FROM companias a
CALL noprmt021()
END MAIN
FUNCTION noprmt021()
DEFINE criterio1 CHAR(50)
DEFINE movimientos CHAR(200)
DEFINE novedades RECORD LIKE notb00007.*
DEFINE lk SMALLINT
DEFINE normal DECIMAL(8,2)
OPTIONS
FORM LINE 9,
ERROR LINE 24
OPEN FORM nofmmt021 FROM "nofmmtv023"
DISPLAY FORM nofmmt021
INITIALIZE datos_nomi to null
LABEL atras10:
INPUT BY NAME datos_nomi.*
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
LET int_flag = false
RETURN
END IF
# Busqueda del periodo comprendido de la nomina
SELECT fecha_del,fecha_al,h_normal INTO p_fecha_del,p_fecha_al,p_h_normal
FROM notb00010
WHERE num_nomi = datos_nomi.num_nomi and
tipo_emp = datos_nomi.tipo_emp
and status_t is null
IF status = notfound THEN
LET numero_msg = 199
CALL msg(numero_msg)
GOTO atras10
END IF
LET normal = p_h_normal
DISPLAY BY NAME p_fecha_del,p_fecha_al ATTRIBUTE (BOLD)
CONSTRUCT criterio ON departamento,num_emp
FROM departamento,num_emp
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
LET int_flag = false
RETURN
END IF
CONSTRUCT BY NAME criterio1 ON cod_mov
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
LET int_flag = false
RETURN
END IF
LET empleados = "SELECT num_emp,departamento,nivel_emp,cod_puesto,nom1_emp,",
"apell1_emp,sueldo_ac,paga_seg,fech_efec ",
"FROM adtb00003 ",
" WHERE ",criterio clipped,
" AND nomina = ? ",
" AND fech_efec <= ? ",
" AND (status_t is null or ",
" status_t = 'I') ",
"ORDER BY 1"
PREPARE comando1 FROM empleados
DECLARE busca50 CURSOR FOR comando1
OPEN busca50 USING datos_nomi.tipo_emp,p_fecha_al
LET movimientos = "SELECT * FROM notb00007 WHERE ",
"num_nomi = ? and ",
"tipo_emp = ? and ",criterio1 clipped
PREPARE comando20 FROM movimientos
DECLARE busca30 SCROLL CURSOR FOR comando20
OPEN busca30 USING datos_nomi.num_nomi,datos_nomi.tipo_emp
DISPLAY "Estoy Generando Registros" AT 23,1 ATTRIBUTE(BOLD)
DELETE FROM notb00007 WHERE cod_mov = 31 and num_nomi = datos_nomi.num_nomi
FOREACH busca50 INTO datos_emp.*
LET tiempo = p_fecha_al - datos_emp.fecha
LET tiempo = tiempo / 365
LET factor = datos_emp.sueldo / 23.83
# Tabla de vacacaiones segun RAYOVAC
# Calculo cuando el tiempo es menor que un ano
IF tiempo < 1 THEN
LET p_mes = p_fecha_al - datos_emp.fecha
LET p_mes = p_mes / 30
CASE
WHEN p_mes = 5
LET dias = 6
LET p_h_normal = 44
EXIT CASE
WHEN p_mes = 6
LET dias = 7
LET p_h_normal = 52
EXIT CASE
WHEN p_mes = 7
LET dias = 8
LET p_h_normal = 60
EXIT CASE
WHEN p_mes = 8
LET dias = 9
LET p_h_normal = 68
EXIT CASE
WHEN p_mes = 9
LET dias = 10
LET p_h_normal = 76
EXIT CASE
WHEN p_mes = 10
LET dias = 11
LET p_h_normal = 84
EXIT CASE
WHEN p_mes = 11
LET dias = 12
LET p_h_normal = 92
EXIT CASE
END CASE
END IF
# Calculo cuando es mas de un ano
IF tiempo >= 1 and tiempo <= 4 THEN
LET dias = 14
LET p_h_normal = 112
END IF
CASE
WHEN tiempo = 5
LET dias = 14
LET p_h_normal = 112
EXIT CASE
WHEN tiempo = 6
LET dias = 14
LET p_h_normal = 112
EXIT CASE
WHEN tiempo = 7
LET dias = 14
LET p_h_normal = 112
EXIT CASE
WHEN tiempo = 8
LET dias = 14
LET p_h_normal = 112
EXIT CASE
WHEN tiempo = 9
LET dias = 14
LET p_h_normal = 112
EXIT CASE
WHEN tiempo >= 10
LET dias = 16.5
LET p_h_normal = 132
EXIT CASE
END CASE
LET valor_vacacion = factor * dias
LET semanas = p_h_normal/normal
# Loop para buscar los movimientos que se van a descontar una sola vez
# en la nomina de vacaciones los movimientos especificados
LET lk = 1
WHILE status != notfound
FETCH ABSOLUTE lk busca30 INTO novedades.*
IF status = notfound THEN
EXIT WHILE
END IF
LET lk = lk + 1
IF novedades.num_emp = datos_emp.num_emp THEN
LET novedades.valor = novedades.valor / semanas
UPDATE notb00007 set valor = novedades.valor,
us_mod = suser_sname(),
fech_mod = getdate()
WHERE num_emp = novedades.num_emp and
num_nomi = datos_nomi.num_nomi and
tipo_emp = datos_nomi.tipo_emp and
cod_mov = novedades.cod_mov
END IF
END WHILE
LET vacaciones[idx].cod_mov=31
LET vacaciones[idx].cod_puesto = datos_emp.cod_puesto
LET vacaciones[idx].departamento = datos_emp.departamento
LET vacaciones[idx].fecha_entrada =datos_emp.fecha
LET vacaciones[idx].nivel_emp = datos_emp.nivel_emp
LET vacaciones[idx].num_emp = datos_Emp.num_emp
LET vacaciones[idx].num_nomi = datos_nomi.num_nomi
LET vacaciones[idx].tipo_emp=datos_nomi.tipo_emp
LET vacaciones[idx].valor_vaca = valor_vacacion
END FOREACH
INSERT INTO notb00007
VALUES (datos_nomi.num_nomi,datos_nomi.tipo_emp,datos_emp.num_emp,
datos_emp.departamento,datos_emp.nivel_emp,datos_emp.cod_puesto,
31,p_h_normal,valor_vacacion,null,suser_sname(),getdate(),null,null)
END FUNCTION