257 lines
8.1 KiB
Plaintext
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
|