{ ---------------------------------------------------------------------------- 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