{ ----------------------------------------------------------------------- PROGRAMA : NOPRMT008 OBJETIVO : Generar los registros que va a contener la nomina de empleados a partir de sus movimientos PROGRAMADOR : Juan F. Soto FECHA : Septiembre 10, 1993. MODIFICACION : MONTO EXCENTO DE LA RENTA ANTES ERA DE 84000, AHORA ES DE 90,072.00 FECHA : 9 DE FEBRERO DE 1998 MODIFICACION : SEGURIDAD SOCIAL FECHA : Junio 10, 2003 ------------------------------------------------------------------------ } GLOBALS "noprgb000.4gl" DEFINE p10, calcula, calcula_ars, calcula_tss CHAR(1) DEFINE p_mes1, numero_nomina, num_van, semanas, p_mes, p_ano, cantidad_empleados, control_empleado SMALLINT, pestado BOOLEAN, xestado_legal VARCHAR(20), opt3 VARCHAR(3) DEFINE impuesto_c, sueldo_ganado, ing_regal, renta_p, val_bonifica, valor_renta, sueldo_boni, valor_seguridad1, descuento_tss, descuento_tss1, monto_descuento_fase, monto_ars, monto_afp, valor_ars_emp_pagado, sueldo_h DECIMAL(16, 2) DEFINE ch_num CHAR(4), calcula_interes, xafecta_tss CHAR(2) DEFINE porc_dias, meses, factor, tasa DECIMAL(8, 2) DEFINE numero INTEGER DEFINE empleados CHAR(500) DEFINE porc_emp, porc_emp_ars, porc_cia, porc_cia_ars, porciento DECIMAL(9, 4), afp_pago_emp, afp_pago_cia, cuota_ss_pa, valor_tss_emp, valor_ars_emp, valor_tss_cia, valor_ars_cia, salario_tss, otros_ing_tss DECIMAL(16, 2), fecha_ext1, fecha_ext2, fecha_ult DATE DEFINE interes, p_cantidad, salario_h, renta_15, renta_20, renta_27, renta_30, porc_extras, valor_regal, valor_bonif1, renta_pagada, excento, hasta_15, hasta_20, hasta_25 DECIMAL(16, 2) DEFINE t, p_codigo, p, idx1 INTEGER DEFINE vacaciones, hay1, bonifica, regalia, p_tipo, encontre, retorne CHAR(1) DEFINE fecha_ini_mes, fecha_inicio_p, p_fecha_del, p_fecha_al, p1_fecha_del, p1_fecha_al DATE DEFINE p_h_normal, otros_ing DECIMAL(16, 2) DEFINE acumulado, renta DECIMAL(16, 2) DEFINE sueldo_renta, p_sueldo, salario_semanal DECIMAL(16, 2) DEFINE ingresos_empleado, acum_mes_ss, cuota_ss, acum_ing_mes DECIMAL(16, 2) DEFINE ultima_semana_mes CHAR(1) DEFINE num_periodo, semanas_mes, ult_nomi_mes INTEGER DEFINE ss RECORD salario_sem_hasta LIKE notb00006.salario_sem_hasta, salario_men_hasta LIKE notb00006.salario_men_hasta, porc_emp LIKE notb00006.porc_emp, porc_pat LIKE notb00006.porc_pat END RECORD DEFINE globales RECORD cod_mov SMALLINT, cantidad_emp LIKE notb00002.cantidad_emp, clase_mov CHAR(1) END RECORD DEFINE desp_mov DYNAMIC ARRAY OF RECORD todos CHAR(1), clasifica CHAR(1), cod_mov SMALLINT, descrip_mov CHAR(30) END RECORD DEFINE datos_nomi RECORD num_nomi LIKE notb00010.num_nomi, tipo_emp LIKE notb00010.tipo_emp END RECORD 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 CHAR(10), moneda VARCHAR(3) END RECORD DEFINE datos_mov RECORD cod_mov LIKE notb00002.cod_mov, clase_mov LIKE notb00002.clase_mov, cantidad LIKE notb00002.cantidad_emp, valor LIKE notb00007.valor, cantidad_emp LIKE notb00002.cantidad_emp, cantidad_cia LIKE notb00002.cantidad_cia, identifica CHAR(20), departamento INT END RECORD DEFINE movi_emp DYNAMIC ARRAY OF RECORD num_emp SMALLINT, cod_mov LIKE notb00002.cod_mov, clase_mov CHAR(1), cantidad LIKE notb00002.cantidad_emp, valor LIKE notb00007.valor, departamento INT 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 noprmt008() END MAIN FUNCTION noprmt008() #CLEAR SCREEN OPTIONS FORM LINE 9, PROMPT LINE 12, ERROR LINE 24, COMMENT LINE 23 #DISPLAY "noprmt008" AT 4,3 ATTRIBUTE(RED) #DISPLAY "Generacion de nomina" AT 6,30 ATTRIBUTE(BLACK) #LET p_formulario = formulario CLIPPED,"nofmmt008" OPEN FORM nofmmt008 FROM "nofmmt008" DISPLAY FORM nofmmt008 # Seccion de captura de informacion general de la generacion de # la nomina LET int_flag = FALSE INPUT BY NAME datos_nomi.*, opt1, opt2, opt3, regalia, vacaciones AFTER FIELD num_nomi IF datos_nomi.num_nomi IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD num_nomi END IF AFTER FIELD tipo_emp IF datos_nomi.tipo_emp IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD tipo_emp END IF # Busqueda del periodo comprendido de la nomina LET selec = "SELECT CONVERT(CHAR(10),fecha_del,103) ,CONVERT(CHAR(10),fecha_al,103), h_normal,mes,ano,num_sem,estado_legal ", " FROM notb00010 ", " WHERE num_nomi = '", datos_nomi.num_nomi, "' and ", " tipo_emp = '", datos_nomi.tipo_emp, "' ", "and (status_t is null)" PREPARE comando20 FROM selec EXECUTE comando20 INTO p_fecha_del, p_fecha_al, p_h_normal, p_mes1, p_ano, semanas_mes, xestado_legal IF status = NOTFOUND THEN LET numero_msg = 199 CALL msg(numero_msg) NEXT FIELD num_nomi END IF DISPLAY BY NAME xestado_legal LET selec = "SELECT CONVERT(CHAR(10),MIN(a.fecha_del),103),CONVERT(CHAR(10),MAX(a.fecha_al),103) ", " FROM notb00010 a ", " WHERE a.ano ='", p_ano, "' ", " and a.mes = '", p_mes1, "' ", " and a.tipo_emp ='", datos_nomi.tipo_emp, "' " PREPARE comando21 FROM selec EXECUTE comando21 INTO p1_fecha_del, p1_fecha_al # Busca el mes inicial del periodo LET selec = "SELECT CONVERT(CHAR(10),MIN(a.fecha_Del),103) ", "FROM notb00010 a ", "WHERE a.ano = '", p_ano, "' AND ", " a.tipo_emp = '", datos_nomi.tipo_emp, "' " PREPARE comando22 FROM selec EXECUTE comando22 INTO fecha_inicio_p SELECT MAX(a.monto_excento), MAX(a.porc_15), MAX(a.porc_20), MAX(a.porc_25), MAX(a.monto_ars), MAX(a.monto_afp) INTO excento, hasta_15, hasta_20, hasta_25, monto_ars, monto_afp FROM notb00023 a WHERE #a.fecha = "01012001" AND a.tipo_emp = datos_nomi.tipo_emp SELECT a.numero_nomina INTO num_periodo FROM notb00023 a WHERE #a.fecha = "01012001" AND a.tipo_emp = datos_nomi.tipo_emp SELECT COUNT(*) INTO cantidad_empleados FROM adtb00003 a WHERE a.status_t IS NULL OR a.status_t IN ("I") LET factor = (100 * 24) / cantidad_empleados { LET excento = 11535 LET hasta_15 = 17396 LET hasta_20 = 26095 LET hasta_25 = 26096 } DISPLAY BY NAME p_fecha_del, p_fecha_al ATTRIBUTE(BOLD) LET ch_num = datos_nomi.num_nomi USING "&&&&" LET numero = ch_num[3, 4] LET num_van = datos_nomi.num_nomi LET p_mes = MONTH(p_fecha_al) IF datos_nomi.tipo_emp = "Q" THEN LET numero = num_periodo - numero LET porciento = 0.50 END IF IF datos_nomi.tipo_emp = "V" THEN LET numero = num_periodo - numero LET porciento = 1.00 END IF IF datos_nomi.tipo_emp = "S" THEN LET numero = num_periodo - numero LET porciento = 0.0025 END IF #------------------------------------------------------------------------------ # Determina si es la ultima nomina del mes #------------------------------------------------------------------------------ LET ultima_semana_mes = NULL LET fecha_ult = NULL LET SELEC = "SELECT CONVERT(CHAR(10),MAX(a.fecha_al),103) ", " FROM notb00010 a ", " WHERE a.tipo_emp = ? AND ", " a.mes = ? AND ", " a.ano = ? AND a.num_nomi NOT IN (46,22) AND ", " (a.status_t IS NULL OR a.status_t ='P')" PREPARE busca_f1 FROM selec EXECUTE busca_f1 INTO fecha_ult USING datos_nomi.tipo_emp, p_mes1, p_ano DISPLAY fecha_ult LET SELEC = "SELECT MAX(a.num_nomi) ", " FROM notb00010 a ", " WHERE a.tipo_emp = ? AND ", " a.mes = ? AND ", " a.ano = ? AND a.num_nomi NOT IN (46,22) AND ", " a.fecha_al = ? AND ", " (a.status_t IS NULL OR a.status_t = 'P')" PREPARE busca_f2 FROM selec EXECUTE busca_f2 INTO ult_nomi_mes USING datos_nomi.tipo_emp, p_mes1, p_ano, fecha_ult IF datos_nomi.num_nomi = ult_nomi_mes THEN LET ultima_semana_mes = "S" ELSE LET ultima_semana_mes = "N" END IF IF ultima_semana_mes = "S" THEN SELECT CONVERT(CHAR(10), MIN(fecha_del), 103) INTO fecha_ini_mes FROM notb00010 WHERE tipo_emp = datos_nomi.tipo_emp AND mes = p_mes1 AND ano = p_ano AND num_nomi NOT IN (9924, 9951, 46, 22, 50) AND (status_t IS NULL OR status_t = 'P') END IF LET ss.porc_emp = 0.00 LET ss.salario_sem_hasta = 0.00 LET ss.salario_men_hasta = 0.00 LET ss.porc_pat = 0.00 LET salario_semanal = 0.00 AFTER INPUT IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE RETURN END IF EXIT INPUT END INPUT # Preparacion para busqueda por rango de departamento y rango de ficha del # empleado CONSTRUCT BY NAME criterio ON a.departamento, a.num_emp IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE RETURN END IF #CLEAR SCREEN # PROMPT #"ESTA SEGURO DE GENERAR DE NUEVO LA NOMINA (S/N) " FOR CHAR opt1 LET opt1 = upshift(opt1) IF opt1 != "S" THEN RETURN END IF #PROMPT #"ESTA NOMINA ES DE REGALIA (S/N) " FOR CHAR regalia LET regalia = upshift(regalia) # PROMPT #"ESTA NOMINA ES DE VACACIONES COLECTIVAS (S/N) " FOR CHAR vacaciones LET vacaciones = upshift(vacaciones) #PROMPT #"ESTA NOMINA ES DE BONIFICACION (S/N) " FOR CHAR opt2 LET opt2 = upshift(opt2) DISPLAY "Borrando Nomina... Espere Por Favor" AT 24, 1 ATTRIBUTE(BOLD) DELETE FROM notb00008 WHERE num_nomi = datos_nomi.num_nomi AND tipo_emp = datos_nomi.tipo_emp AND clase_mov NOT IN ("F") # CALL second_scr() #LET p_formulario = formulario CLIPPED, "nofmmt108" OPEN FORM nofmmt108 FROM "nofmmt108" DISPLAY FORM nofmmt108 IF regalia = "S" THEN INPUT BY NAME fecha_ext1, fecha_ext2 AFTER FIELD fecha_ext2 IF fecha_ext2 < fecha_ext1 THEN LET numero_msg = 51 CALL msg(numero_msg) NEXT FIELD fecha_ext1 END IF EXIT INPUT END INPUT END IF DECLARE tinti CURSOR FOR SELECT cod_mov, descrip_mov FROM notb00002 WHERE status_t IS NULL ORDER BY cod_mov #3522 LET idx1 = 1 FOREACH tinti INTO desp_mov[idx1].cod_mov, desp_mov[idx1].descrip_mov LET desp_mov[idx1].todos = "Y" IF regalia = "S" OR opt2 = "S" OR opt3 = 'S' THEN LET desp_mov[idx1].clasifica = "N" ELSE LET desp_mov[idx1].clasifica = "S" END IF LET scr_l = scr_line() LET idx1 = idx1 + 1 END FOREACH CALL set_count(idx1 - 1) INPUT ARRAY desp_mov WITHOUT DEFAULTS FROM s_mov.* AFTER INPUT IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE RETURN END IF EXIT INPUT END INPUT # CLEAR SCREEN #DISPLAY "noprmt008" AT 4,2 #DISPLAY "Generacion de nomina" AT 6,32 # Preparacion de la busqueda de los empleados dependiendo del criterio de # seleccion OPEN WINDOW w1 WITH FORM "nofmmt208" IF datos_nomi.tipo_emp = "S" THEN DISPLAY "empleados1" LET empleados = "SELECT num_emp,departamento,nivel_emp,cod_puesto,nom1_emp,", "apell1_emp,sueldo_ac,paga_seg,fech_efec,moneda ", "FROM adtb00003 ", " WHERE ", " nomina = ? ", " AND CONVERT(DATE,a.fech_efec,101) <= ? ", " AND (status_t is null or ", " status_t = 'I') AND ", criterio CLIPPED, " ORDER BY num_emp" ELSE IF opt3 <> 'S' THEN DISPLAY "empleados2" LET empleados = "SELECT a.num_emp,a.departamento,a.nivel_emp,a.cod_puesto,a.nom1_emp,", "a.apell1_emp,a.sueldo_ac,a.paga_seg, ", "CONVERT(CHAR(10),a.fech_efec,103),moneda ", "FROM adtb00003 a ", " WHERE ", " a.nomina = ? and (", criterio CLIPPED, #" and a.num_emp =162 ", # ") AND CONVERT (CHAR(10),a.fech_efec,103) <= ? ", ") AND a.fech_efec <= ? ", " AND (a.status_t is null or ", " a.status_t = 'I') AND ", " a.num_emp not in (select x.num_Emp from adtb00032 x where x.num_nomi_no = ? and x.status_t is null) ", " AND a.estado_legal = ? AND ", criterio CLIPPED, " ORDER BY a.num_emp" ELSE DISPLAY "empleados3" LET empleados = "SELECT a.num_emp,a.departamento,a.nivel_emp,a.cod_puesto,a.nom1_emp,", "a.apell1_emp,a.sueldo_ac,a.paga_seg, ", "CONVERT(CHAR(10),a.fech_efec,103),moneda ", "FROM adtb00003 a,[dbo].[tmpinactivos2026] b ", " WHERE ", " a.nomina = ? and (", criterio CLIPPED, ") AND a.num_emp = b.num_emp ", " ORDER BY a.num_emp" END IF END IF #call fgl_winmessage("w",empleados,"stop") DISPLAY "BUSCANDO EMPLEADOS..." TO estado PREPARE comando FROM empleados DECLARE busca SCROLL CURSOR FOR comando OPEN busca USING datos_nomi.tipo_emp, p_fecha_al, datos_nomi.num_nomi, xestado_legal LET control_empleado = 0 LET progreso = 5 DISPLAY progreso TO progreso CALL ui.Interface.refresh() DISPLAY "LOOP EMPLEADOS..." TO estado FOREACH busca INTO datos_emp.* # DESPLEGA INFORMACION DISPLAY datos_emp.num_emp TO num_emp DISPLAY datos_emp.nom1_emp || datos_emp.apell1_emp TO nombre DISPLAY "BUSCANDO NOVEDADES EMPLEADOS..." TO estado LET meses = (p_fecha_al - datos_emp.fecha) LET meses = meses / 30 CALL movi_emp.clear() LET valor_renta = 0 IF regalia != "S" THEN # Busca los acumulados de ingresos de los empleados SELECT SUM(a.valor) INTO acumulado FROM notb00008 a WHERE a.status_t IS NULL AND (a.clase_mov IN ("I", "E") AND a.num_emp = datos_emp.num_emp AND a.fecha BETWEEN p1_fecha_del AND p1_fecha_al) #fecha_inicio_p END IF IF acumulado IS NULL THEN LET acumulado = 0 END IF ################ # BUSCA LA TASA FINANCIERA DEL MES ################ SELECT AVG(a.tasa) INTO tasa FROM cgtb00084 a WHERE a.mes = MONTH(TODAY) AND a.ano = YEAR(TODAY) AND a.ventas = datos_emp.moneda IF tasa IS NULL THEN LET tasa = 1 END IF LET datos_emp.sueldo = datos_emp.sueldo * tasa LET sueldo_renta = 0 LET movi_emp[1].cod_mov = 1 LET movi_emp[1].clase_mov = "I" LET movi_emp[1].departamento = datos_emp.departamento # Calculo del sueldo normal semanal IF datos_nomi.tipo_emp = "S" THEN LET salario_h = datos_emp.sueldo / 190.60 LET p_sueldo = datos_emp.sueldo LET datos_emp.sueldo = (datos_emp.sueldo / 190.60) * p_h_normal # Mdificado el 11/11/2002 LET sueldo_boni = datos_emp.sueldo END IF # Calculo del sueldo normal quincenal IF datos_nomi.tipo_emp = "Q" OR datos_nomi.tipo_emp = "J" THEN # Calculo para los empleados quincenales, segun reunion con el gerente general # gerente recursos humanos y gerente informatica, se acordo que los empleados # quincenales cobraran el 35% de su sueldo la primera quincena y el restante # la quincena siguiente. # Fecha modificacion 3/4/2002. SEGURIDAD SOCIAL # Modificado por el Ing. Juan Francisco Soto LET sueldo_ganado = 0 LET p_sueldo = datos_emp.sueldo SELECT SUM(a.valor) INTO sueldo_ganado FROM notb00008 a WHERE (a.cod_mov = 1 AND a.num_emp = datos_emp.num_emp AND a.fecha BETWEEN p1_fecha_del AND p1_fecha_al) IF sueldo_ganado = 0 OR sueldo_ganado IS NULL THEN LET datos_emp.sueldo = datos_emp.sueldo * .50 ELSE #DISPLAY "EMPLEADO2 ",datos_emp.num_emp,' ',datos_Emp.sueldo, ' ',sueldo_ganado LET datos_emp.sueldo = datos_emp.sueldo - sueldo_ganado #DISPLAY "EMPLEADO3 ",datos_emp.num_emp,' ',datos_Emp.sueldo, ' ',sueldo_ganado IF datos_emp.sueldo > p_sueldo / 12 THEN LET datos_emp.sueldo = p_sueldo / 2 END IF END IF LET salario_h = (datos_emp.sueldo / 23.83) / 8 LET sueldo_boni = datos_emp.sueldo END IF IF datos_nomi.tipo_emp = "V" THEN LET sueldo_boni = datos_emp.sueldo END IF #----------------------------------------------------------------------------- LET movi_emp[1].cantidad = p_h_normal LET movi_emp[1].valor = datos_emp.sueldo LET sueldo_renta = sueldo_renta + movi_emp[1].valor FOR i = 1 TO idx1 IF movi_emp[i].cod_mov = desp_mov[i].cod_mov THEN IF desp_mov[i].clasifica = "N" THEN LET movi_emp[1].valor = 0 LET movi_emp[1].cantidad = 0 LET sueldo_renta = 0 END IF END IF END FOR # Busqueda de la tabla de novedades cuando la nomina no es de bonificacion IF opt2 != "S" THEN DISPLAY "este es el query" DECLARE busca1 CURSOR FOR SELECT a.cod_mov, b.clase_mov, a.cantidad, a.valor, b.cantidad_emp, cantidad_cia, "fijos", c.departamento FROM notb00003 a, notb00002 b, adtb00003 c WHERE a.num_emp = datos_emp.num_emp AND a.num_emp = c.num_emp AND a.status_t IS NULL AND a.cod_mov = b.cod_mov AND CAST(a.cod_mov AS CHAR(3)) + CAST(a.num_emp AS CHAR(4)) NOT IN (SELECT CAST(a.cod_mov AS CHAR(3)) + CAST(a.num_emp AS CHAR(4)) FROM notb00007 a WHERE a.num_nomi = datos_nomi.num_nomi AND a.num_emp = datos_emp.num_emp AND a.tipo_emp = datos_nomi.tipo_emp) UNION SELECT a.cod_mov, b.clase_mov, a.cantidad, a.valor, b.cantidad_emp, cantidad_cia, "novedades", a.departamento_afecta FROM notb00007 a, notb00002 b WHERE a.num_nomi = datos_nomi.num_nomi AND a.num_emp = datos_emp.num_emp AND a.tipo_emp = datos_nomi.tipo_emp AND a.status_t IS NULL AND a.cod_mov = b.cod_mov UNION SELECT b.cod_mov, a.clase_mov, SUM(b.cantidad), SUM(b.valor), a.cantidad_emp, a.cantidad_cia, a.ch_encabeza, c.departamento FROM notb00008 b, notb00002 a, adtb00003 c WHERE b.num_emp = datos_emp.num_emp AND b.num_emp = c.num_emp AND b.tipo_emp = datos_nomi.tipo_emp AND b.cod_mov = a.cod_mov AND b.status_t IS NULL AND b.cod_mov = 19 AND b.fecha BETWEEN p_fecha_del AND p_Fecha_al AND b.clase_mov = "F" GROUP BY b.cod_mov, a.clase_mov, a.cantidad_emp, a.cantidad_cia, a.ch_encabeza, C.departamento END IF # Busca de la tabla de novedades si la nomina es de bonificacion IF opt2 = "S" THEN DECLARE busca2 CURSOR FOR SELECT a.cod_mov, b.clase_mov, a.cantidad, a.valor, b.cantidad_emp, cantidad_cia, "fijos", c.departamento FROM notb00003 a, notb00002 b, adtb00003 c WHERE (a.num_emp = datos_emp.num_emp AND a.num_emp = c.num_emp AND a.cod_mov = b.cod_mov) AND a.status_t IS NULL AND CAST(a.cod_mov AS CHAR(3)) + CAST(a.num_emp AS CHAR(4)) NOT IN (SELECT CAST(a.cod_mov AS CHAR(3)) + CAST(a.num_emp AS CHAR(4)) FROM notb00007 a WHERE a.num_nomi = datos_nomi.num_nomi AND a.num_emp = datos_emp.num_emp AND a.tipo_emp = datos_nomi.tipo_emp) UNION SELECT a.cod_mov, b.clase_mov, a.cantidad, a.valor, b.cantidad_emp, cantidad_cia, "novedades", a.departamento_afecta FROM notb00007 a, notb00002 b WHERE (a.num_nomi = datos_nomi.num_nomi AND a.num_emp = datos_emp.num_emp AND a.tipo_emp = datos_nomi.tipo_emp AND # a.departamento = datos_emp.departamento and a.cod_mov = b.cod_mov) AND a.status_t IS NULL # ORDER BY a.cod_mov END IF LET modifica = "N" LET encontre = "N" LET bonifica = "N" LET idx = 2 # Para buscar codigos de las nominas normales IF opt2 = "N" THEN DISPLAY "estoy en normal" LET descuento_tss = 0 FOREACH busca1 INTO datos_mov.* IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE RETURN END IF # Chequea los movimientos que son balanceados # Tiene que el movimiento no sea el movimiento 11 porque esta en la tabla # notb00014 que es donde estan los codigos que se balancean y se puso este # codigo de movimiento en esta tabla para el proceso de fin de ano de nomina DISPLAY "inicia ", datos_mov.cod_mov, " ", datos_emp.num_emp IF datos_mov.cod_mov != 11 THEN SELECT a.* FROM notb00014 a WHERE a.cod_mov = datos_mov.cod_mov IF status != NOTFOUND THEN SELECT SUM(a.valor) INTO p_valor FROM notb00008 a WHERE (a.num_emp = datos_emp.num_emp AND a.cod_mov = datos_mov.cod_mov) AND a.status_t IS NULL IF p_valor = 0 THEN CONTINUE FOREACH ELSE IF p_valor < datos_mov.valor THEN LET datos_mov.valor = p_valor END IF END IF END IF END IF # Chequea que el codigo tenga la opcion de que si lo quieren generar FOR i = 1 TO idx1 IF datos_mov.cod_mov = desp_mov[i].cod_mov THEN DISPLAY "data1: clasifica: ", desp_mov[i].clasifica, " COD MOV ", desp_mov[i].cod_mov IF desp_mov[i].clasifica = "N" THEN CONTINUE FOREACH END IF IF desp_mov[i].todos = "N" AND datos_mov.identifica = "fijos" THEN CONTINUE FOREACH END IF END IF END FOR IF datos_mov.cod_mov != 1 THEN LET movi_emp[idx].clase_mov = datos_mov.clase_mov LET movi_emp[idx].cod_mov = datos_mov.cod_mov END IF # Calculo de las horas trabajadas en la jornada # Esto solo lo calcula cuando el usuario poporciona la informacion de las # horas trabajadas durante el periodo como una novedad IF datos_mov.cod_mov = 1 THEN #datos_mov.cod_mov = 9 THEN LET modifica = "S" LET sueldo_renta = 0 LET movi_emp[1].cod_mov = datos_mov.cod_mov LET movi_emp[1].clase_mov = datos_mov.clase_mov # El 8 es para calcular el sueldo por hora #IF datos_mov.cantidad > 0 THEN # LET movi_emp[1].cantidad = datos_mov.cantidad # LET movi_emp[1].valor = (p_sueldo / 8) * # datos_mov.cantidad # END IF IF datos_mov.cantidad = 0 AND datos_mov.cod_mov = 1 THEN LET movi_emp[1].valor = 0 LET movi_emp[1].cantidad = 0 END IF IF datos_mov.valor > 0 THEN LET movi_emp[1].valor = datos_mov.valor END IF LET sueldo_renta = sueldo_renta + movi_emp[1].valor END IF IF datos_mov.cod_mov > 1 THEN LET datos_mov.valor = datos_mov.valor * tasa IF datos_mov.cod_mov = 33 THEN LET bonifica = "S" LET sueldo_renta = movi_emp[1].valor LET sueldo_boni = datos_mov.valor # Modificado el 11/11/2002 END IF # Cuando el valor o la cantiad tienen algun valor se quedara este valor # en la variable de asignacion LET movi_emp[idx].cantidad = datos_mov.cantidad LET movi_emp[idx].valor = datos_mov.valor # Cuando es comida, desayuno, cena IF datos_mov.cantidad_emp > 0 AND datos_mov.clase_mov = "D" THEN LET movi_emp[idx].valor = (datos_mov.cantidad_emp + datos_mov.cantidad_cia) * datos_mov.cantidad LET movi_emp[idx].cantidad = datos_mov.cantidad END IF # Calculo descuento adicional TSS IF movi_emp[idx].cod_mov = 29 THEN LET descuento_tss = movi_emp[idx].valor END IF # Calculo incentivo asistencia IF movi_emp[idx].cod_mov = 9 THEN IF datos_mov.cantidad > 0 THEN LET movi_emp[idx].valor = sueldo_h * movi_emp[idx].cantidad ELSE LET movi_emp[idx].valor = datos_mov.valor END IF END IF # Calculo movimientos 6 y 4 IF movi_emp[idx].cod_mov = 6 OR movi_emp[idx].cod_mov = 4 THEN IF movi_emp[idx].cantidad > 0 THEN LET movi_emp[idx].valor = movi_emp[idx].cantidad * movi_emp[idx].valor END IF END IF LET movi_emp[idx].departamento = datos_mov.departamento LET idx = idx + 1 END IF END FOREACH LET control_empleado = control_empleado + 1 CALL desplega() DISPLAY "DESPLEGANDO NOVEDADES EN SCREEN.." TO estado IF control_empleado >= factor THEN LET control_empleado = 0 LET progreso = progreso + 1 IF progreso > 95 THEN LET progreso = 95 END IF DISPLAY progreso TO progreso CALL ui.Interface.refresh() END IF END IF LET hay1 = "N" FOR i = 1 TO idx IF movi_emp[i].cod_mov = 32 THEN LET hay1 = "S" LET valor_regal = movi_emp[i].valor END IF END FOR IF hay1 = "N" THEN # Nomina de Regalia Pascual IF regalia = "S" THEN LET idx = idx + 1 LET movi_emp[idx].cod_mov = 32 IF YEAR(p_fecha_al) <> YEAR(datos_emp.fecha) THEN IF p10 IS NULL THEN LET p10 = "N" END IF SELECT SUM(a.valor) / 12 INTO p_sueldo FROM notb00008 a WHERE a.cod_mov IN (1, 40, 5, 24, 16, 34, 51, 56) AND a.num_emp = datos_emp.num_emp AND a.fecha BETWEEN fecha_ext1 AND fecha_ext2 LET movi_emp[idx].valor = p_sueldo END IF IF YEAR(p_fecha_al) = YEAR(datos_emp.fecha) THEN SELECT SUM(a.valor) / 12 INTO p_sueldo FROM notb00008 a WHERE (a.cod_mov IN (1, 40, 5, 24, 16, 34, 51) AND a.num_emp = datos_emp.num_emp AND a.fecha BETWEEN fecha_ext1 AND fecha_ext2) LET p_mes = MONTH(datos_emp.fecha) SELECT dias_prod INTO dias FROM mestable WHERE mes = p_mes LET porc_dias = 0 # LET porc_dias = (dias - day(datos_emp.fecha)) / dias LET p_mes = 12 - MONTH(datos_emp.fecha) LET porc_dias = porc_dias + p_mes LET movi_emp[idx].valor = p_sueldo #* porc_dias END IF LET movi_emp[idx].cantidad = porc_dias LET valor_regal = movi_emp[idx].valor LET movi_emp[idx].clase_mov = "I" END IF END IF # Para Cuando la nomina es de bonificacion IF opt2 = "S" THEN FOREACH busca2 INTO datos_mov.* IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE RETURN END IF # Chequea los movimientos que son balanceados # Tiene que el movimiento no sea el movimiento 11 porque esta en la tabla # notb00014 que es donde estan los codigos que se balancean y se puso este # codigo de movimiento en esta tabla para el proceso de fin de ano de nomina IF datos_mov.cod_mov != 11 THEN SELECT * FROM notb00014 WHERE cod_mov = datos_mov.cod_mov IF status != NOTFOUND THEN SELECT SUM(valor) INTO p_valor FROM notb00008 WHERE (num_emp = datos_emp.num_emp AND cod_mov = datos_mov.cod_mov) AND status_t IS NULL IF status = NOTFOUND THEN LET status = 0 END IF IF p_valor = 0 THEN CONTINUE FOREACH END IF END IF END IF # Chequea que el codigo tenga la opcion de que si lo quieren generar FOR i = 1 TO idx1 IF datos_mov.cod_mov = desp_mov[i].cod_mov THEN IF desp_mov[i].clasifica = "N" OR desp_mov[i].clasifica IS NULL THEN CONTINUE FOREACH END IF IF desp_mov[i].todos = "N" AND datos_mov.identifica = "fijos" THEN CONTINUE FOREACH END IF END IF END FOR IF datos_mov.cod_mov != 1 THEN LET movi_emp[idx].clase_mov = datos_mov.clase_mov LET movi_emp[idx].cod_mov = datos_mov.cod_mov END IF # Calculo de las horas trabajadas en la jornada # Esto solo lo calcula cuando el usuario poporciona la informacion de las # horas trabajadas durante el periodo como una novedad IF datos_mov.cod_mov = 1 OR datos_mov.cod_mov = 9 THEN LET modifica = "S" LET sueldo_renta = 0 LET movi_emp[1].cod_mov = datos_mov.cod_mov LET movi_emp[1].clase_mov = datos_mov.clase_mov LET movi_emp[1].departamento = datos_mov.departamento # El 190.60 es para calcular el sueldo por hora IF datos_mov.cantidad > 0 THEN LET movi_emp[1].cantidad = datos_mov.cantidad LET movi_emp[1].valor = (p_sueldo / 190.60) * datos_mov.cantidad END IF IF datos_mov.cantidad = 0 AND datos_mov.cod_mov = 1 THEN LET movi_emp[1].valor = 0 LET movi_emp[1].cantidad = 0 END IF LET datos_mov.valor = datos_mov.valor * tasa IF datos_mov.valor > 0 THEN LET movi_emp[1].valor = datos_mov.valor END IF LET sueldo_renta = sueldo_renta + movi_emp[1].valor END IF IF datos_mov.cod_mov > 1 THEN LET datos_mov.valor = datos_mov.valor * tasa IF datos_mov.cod_mov = 9 THEN CONTINUE FOREACH END IF IF datos_mov.cod_mov = 33 THEN LET bonifica = "S" LET sueldo_boni = datos_mov.valor # Se Agrego el 11/11/2002 END IF # Cuando el valor o la cantiad tienen algun valor se quedara este valor # en la variable de asignacion LET movi_emp[idx].cantidad = datos_mov.cantidad LET movi_emp[idx].valor = datos_mov.valor # Cuando es comida, desayuno, cena IF datos_mov.cantidad_emp > 0 AND datos_mov.clase_mov = "D" THEN LET movi_emp[idx].valor = (datos_mov.cantidad_emp + datos_mov.cantidad_cia) * datos_mov.cantidad LET movi_emp[idx].cantidad = datos_mov.cantidad END IF # Calculo incentivo asistencia IF movi_emp[idx].cod_mov = 9 THEN LET movi_emp[idx].valor = sueldo_h * movi_emp[idx].cantidad END IF # Calculo movimientos 6 y 4 IF movi_emp[idx].cod_mov = 6 OR movi_emp[idx].cod_mov = 4 THEN IF movi_emp[idx].cantidad > 0 THEN LET movi_emp[idx].valor = movi_emp[idx].cantidad * movi_emp[idx].valor END IF END IF # Calculo de las horas extras IF movi_emp[idx].clase_mov = "E" THEN IF datos_mov.cantidad > 0 THEN SELECT cantidad_cia INTO porc_extras FROM notb00002 WHERE cod_mov = movi_emp[idx].cod_mov LET movi_emp[idx].valor = salario_h * ((porc_extras / 100) + 1) LET movi_emp[idx].valor = movi_emp[idx].valor * datos_mov.cantidad ELSE LET movi_emp[idx].valor = datos_mov.valor END IF END IF LET movi_emp[idx].departamento = datos_mov.departamento LET idx = idx + 1 END IF END FOREACH END IF # Calculo del infotep FOR i = 1 TO idx IF movi_emp[i].cod_mov = 33 THEN LET idx = idx + 1 LET movi_emp[idx].departamento = datos_emp.departamento LET movi_emp[idx].cod_mov = 42 LET movi_emp[idx].clase_mov = "D" LET movi_emp[idx].valor = movi_emp[i].valor * .005 LET movi_emp[idx].cantidad = 0 LET val_bonifica = movi_emp[i].valor EXIT FOR END IF END FOR IF regalia != "S" THEN IF meses < 3 THEN LET idx = idx + 1 LET movi_emp[idx].clase_mov = "I" LET movi_emp[idx].cod_mov = 4 LET movi_emp[idx].valor = 0 END IF END IF LABEL salta1: # Busqueda de las novedades globales DECLARE busca20 CURSOR FOR SELECT cod_mov, cantidad_emp, clase_mov FROM notb00002 WHERE tipo_mov = "G" AND status_t IS NULL FOREACH busca20 INTO globales.cod_mov, globales.cantidad_emp, globales.clase_mov FOR i = 1 TO idx1 IF globales.cod_mov = desp_mov[i].cod_mov THEN IF desp_mov[i].clasifica = "N" OR desp_mov[i].clasifica IS NULL THEN CONTINUE FOREACH END IF IF desp_mov[i].todos = "N" AND datos_mov.identifica = "fijos" THEN CONTINUE FOREACH END IF END IF END FOR IF globales.clase_mov = "S" THEN IF datos_emp.paga_seg != "S" THEN CONTINUE FOREACH END IF END IF FOR i = 1 TO idx IF globales.cod_mov = movi_emp[i].cod_mov THEN LET movi_emp[i].clase_mov = globales.clase_mov CONTINUE FOREACH END IF END FOR # Este es el movimiento del descuento de casa club cuando es quincenal # devide la cantidad que paga el empleado entre dos. IF globales.cod_mov = 20 THEN IF datos_nomi.tipo_emp = "Q" THEN LET globales.cantidad_emp = globales.cantidad_emp / 2 END IF END IF LET idx = idx + 1 LET movi_emp[idx].departamento = datos_emp.departamento LET movi_emp[idx].cod_mov = globales.cod_mov LET movi_emp[idx].valor = globales.cantidad_emp IF vacaciones = "S" THEN IF movi_emp[idx].cod_mov != 36 THEN LET movi_emp[idx].valor = movi_emp[idx].valor * semanas END IF END IF LET movi_emp[idx].clase_mov = globales.clase_mov END FOREACH LET monto_descuento_fase = 0 # Calculo del Incentivo comida, desayuno, cena LET p_valor = 0 FOR p = 1 TO idx IF movi_emp[p].cod_mov != 0 AND movi_emp[p].cod_mov IS NOT NULL THEN IF movi_emp[p].cod_mov = 16 OR movi_emp[p].cod_mov = 17 OR movi_emp[p].cod_mov = 18 THEN SELECT cantidad_cia INTO p_cantidad FROM notb00002 WHERE cod_mov = movi_emp[p].cod_mov LET p_valor = p_valor + (movi_emp[p].cantidad * p_cantidad) END IF END IF END FOR #----------------------------------------------------------------------------- # Busqueda del impuesto sobre la renta IF acumulado IS NULL THEN LET acumulado = 0 END IF LET renta = 0 # Loop para acumular los otros ingresos para el calculo de la nomina # se le puso una condicion donde suma los otros ingresos de que solo sume # los clase_mov = I o E que sean diferentes a el codigo 1 sueldo normal y # 32 regalia pascual LET otros_ing = 0 IF vacaciones = "S" THEN LET sueldo_renta = sueldo_renta - movi_emp[1].valor LET movi_emp[1].cantidad = 0 LET movi_emp[1].valor = 0 LET movi_emp[1].departamento = datos_emp.departamento CALL vacaciones_colect() END IF LET otros_ing_tss = 0 SELECT SUM(a.valor) INTO otros_ing_tss FROM notb00008 a, notb00002 b WHERE a.cod_mov = b.cod_mov AND b.afecta_tss = "SI" AND a.num_emp = datos_emp.num_emp AND a.fecha BETWEEN p1_fecha_del AND p1_fecha_al AND a.status_t IS NULL #fecha_inicio_p LET afp_pago_emp = 0 SELECT SUM(valor) INTO afp_pago_emp FROM notb00008 WHERE (cod_mov IN (49) AND num_emp = datos_emp.num_emp AND fecha BETWEEN p1_fecha_del AND p1_fecha_al) AND status_t IS NULL #fecha_inicio_p LET afp_pago_cia = 0 SELECT SUM(valor) INTO afp_pago_cia FROM notb00008 WHERE (cod_mov IN (50) AND num_emp = datos_emp.num_emp AND fecha BETWEEN p1_fecha_del AND p1_fecha_al) AND status_t IS NULL #fecha_inicio_p # DESCUENTO POR FAMILIAR EXTRA LET descuento_tss1 = 0 SELECT SUM(valor * - 1) INTO descuento_tss1 FROM notb00008 WHERE (cod_mov IN (29) AND num_emp = datos_emp.num_emp AND fecha BETWEEN p1_fecha_del AND p1_fecha_al) AND status_t IS NULL #fecha_inicio_p# # DESCUENTO ESPECIAL FASE SELECT ISNULL(SUM(valor * - 1), 0) INTO monto_descuento_fase FROM notb00008 WHERE (cod_mov IN (55) AND num_emp = datos_emp.num_emp AND fecha BETWEEN p1_fecha_del AND p1_fecha_al) AND status_t IS NULL IF descuento_tss1 IS NULL THEN LET descuento_tss1 = 0 END IF LET descuento_tss = descuento_tss + descuento_tss1 IF afp_pago_emp IS NULL THEN LET afp_pago_emp = 0 END IF IF afp_pago_cia IS NULL THEN LET afp_pago_cia = 0 END IF IF otros_ing_tss IS NULL THEN LET otros_ing_tss = 0 END IF FOR i = 1 TO idx IF vacaciones = "S" THEN IF movi_emp[i].clase_mov = "D" AND movi_emp[i].cod_mov != 23 AND movi_emp[i].cod_mov != 70 THEN LET movi_emp[1].departamento = datos_emp.departamento LET movi_emp[i].valor = movi_emp[i].valor * semanas END IF END IF # IF movi_emp[i].clase_mov = "I" or # movi_emp[i].clase_mov = "E" THEN IF movi_emp[i].cod_mov != 1 THEN IF vacaciones = "S" THEN IF movi_emp[i].cod_mov != 31 THEN IF movi_emp[i].cod_mov != 36 THEN LET movi_emp[i].valor = movi_emp[i].valor * semanas END IF END IF END IF SELECT a.afecta_tss, a.clase_mov INTO xafecta_tss, globales.clase_mov FROM notb00002 a WHERE a.cod_mov = movi_emp[i].cod_mov IF xafecta_tss = "SI" THEN IF globales.clase_mov = 'I' THEN LET otros_ing_tss = movi_emp[i].valor + otros_ing_tss ELSE LET otros_ing_tss = otros_ing_tss - movi_emp[i].valor END IF END IF IF movi_emp[i].valor IS NULL THEN LET movi_emp[i].valor = 0 END IF IF otros_ing IS NULL THEN LET otros_ing = 0 END IF IF globales.clase_mov = 'I' OR globales.clase_mov = 'E' THEN LET otros_ing = movi_emp[i].valor + otros_ing END IF END IF IF movi_emp[i].cod_mov = 55 THEN LET monto_descuento_fase = movi_emp[i].valor + monto_descuento_fase END IF #END IF END FOR IF acumulado IS NULL THEN LET acumulado = 0 END IF IF sueldo_ganado IS NULL THEN LET sueldo_ganado = 0 END IF IF otros_ing_tss IS NULL THEN LET otros_ing_tss = 0 END IF IF datos_nomi.tipo_emp = "Q" OR datos_nomi.tipo_emp = "J" THEN LET salario_tss = sueldo_ganado + sueldo_renta + otros_ing_tss IF ultima_semana_mes = "S" THEN LET valor_renta = sueldo_renta + acumulado + otros_ing ELSE LET valor_renta = valor_renta * 2 + acumulado + otros_ing END IF IF ultima_semana_mes = "N" THEN LET valor_renta = sueldo_renta + acumulado + otros_ing ELSE LET valor_renta = sueldo_renta + acumulado + otros_ing END IF ELSE IF ultima_semana_mes = "S" THEN LET valor_renta = sueldo_renta + acumulado END IF END IF #----------------------------------------------------------------------- LET calcula = "N" LET retorne = "S" #------------------------------------------------------------------------ LABEL retorna: # Si es la nomina de bonificacion IF retorne = "N" THEN # Acumualdo sin bonificacion LET valor_renta = valor_bonif1 END IF #------------------------------------------------------------------------ IF regalia != "S" THEN # Busca el monto de regalia el incentivo de asistencia # que el empleado reciba # POR ORDEN DEL ING. PAULINO EN EL 2DO SELECT SE QUITO EL CODIGO DEL INCENTIVO # NO.9 PARA SER GRAVADO POR LA RENTA. SELECT UNIQUE num_nomi INTO numero_nomina FROM notb00008 WHERE cod_mov = 32 AND tipo_emp = datos_nomi.tipo_emp AND num_emp = datos_emp.num_emp AND fecha >= fecha_inicio_p LET valor_regal = 0 SELECT SUM(valor) INTO valor_regal FROM notb00008 WHERE (cod_mov IN (32) AND num_emp = datos_emp.num_emp AND fecha >= fecha_inicio_p) AND status_t IS NULL IF valor_regal IS NULL THEN LET valor_regal = 0 END IF #------------------------------------------------------------------------------ # CALCULO PARA EL PAGO SEGURIDAD SOCIAL # EL SALARIO MAXIMO COTIZABLE ES 75340 MENSUALES # 37670 QUINCENALES # 98,000.00 MENSUALES 25/1/2005 # MODIFIACION PARA LA INCLUSION DEL REGIMEN DE SALUD, EL 4/5/2007, # LOS CODIGOS DE MOVIMIENTOS SON: 53 Y 54 #------------------------------------------------------------------------------ LET globales.cod_mov = 49 LET calcula_tss = "S" # PARA LOS EMPLEADOS QUE NO DEBEN CALCULAR AFP Y SFS CALL fcalcula_tss( globales.cod_mov, datos_emp.num_emp) RETURNING pestado IF pestado THEN FOR i = 1 TO idx1 IF globales.cod_mov = desp_mov[i].cod_mov THEN IF desp_mov[i].clasifica = "N" OR desp_mov[i].clasifica IS NULL THEN LET calcula_tss = "N" EXIT FOR END IF END IF END FOR ELSE LET calcula_tss = "N" END IF LET globales.cod_mov = 53 LET calcula_ars = "S" CALL fcalcula_tss( globales.cod_mov, datos_emp.num_emp) RETURNING pestado IF pestado THEN FOR i = 1 TO idx1 IF globales.cod_mov = desp_mov[i].cod_mov THEN IF desp_mov[i].clasifica = "N" OR desp_mov[i].clasifica IS NULL THEN LET calcula_ars = "N" EXIT FOR END IF END IF END FOR ELSE LET calcula_ars = "N" END IF IF calcula_tss = "S" THEN SELECT a.cantidad_emp / 100 INTO porc_emp FROM notb00002 a WHERE a.cod_mov = 49 SELECT a.cantidad_cia / 100 INTO porc_cia FROM notb00002 a WHERE a.cod_mov = 50 SELECT a.cantidad_cia / 100 INTO porc_cia_ars FROM notb00002 a WHERE a.cod_mov = 54 SELECT a.cantidad_emp / 100 INTO porc_emp_ars FROM notb00002 a WHERE a.cod_mov = 53 # BUSCA VALOR PAGADO EN EL MES SELECT ISNULL(SUM(a.valor * - 1), 0) INTO valor_ars_emp_pagado FROM notb00008 a WHERE a.num_emp = datos_emp.num_emp AND a.cod_mov = 53 AND a.fecha BETWEEN p1_fecha_del AND p1_fecha_al IF salario_tss < (monto_afp) THEN LET valor_tss_emp = salario_tss * porc_emp LET valor_tss_cia = salario_tss * porc_cia LET valor_renta = valor_renta - valor_tss_emp ELSE LET valor_tss_emp = (monto_afp) * porc_emp LET valor_tss_cia = (monto_afp) * porc_cia LET valor_renta = valor_renta - valor_tss_emp END IF #EL TOPE SALARIAL MENSUAL PARA LA ARS ES 98550 IF salario_tss < monto_ars THEN LET valor_ars_emp = salario_tss * porc_emp_ars # PAGOS ARS EMPLEADOS LET valor_ars_cia = salario_tss * porc_cia_ars # PAGOS ARS EMPRESA ELSE LET valor_ars_emp = (monto_ars) * porc_emp_ars # PAGOS ARS EMPLEADOS LET valor_ars_cia = (monto_ars) * porc_cia_ars # PAGOS ARS EMPRESA END IF LET valor_tss_emp = valor_tss_emp - (afp_pago_emp * -1) LET valor_tss_cia = valor_tss_cia - (afp_pago_cia * -1) LET valor_renta = valor_renta - valor_ars_emp LET idx = idx + 1 LET movi_emp[idx].departamento = datos_emp.departamento LET movi_emp[idx].clase_mov = "D" LET movi_emp[idx].cod_mov = 49 LET movi_emp[idx].valor = valor_tss_emp LET idx = idx + 1 LET movi_emp[idx].clase_mov = "T" LET movi_emp[idx].cod_mov = 50 LET movi_emp[idx].valor = valor_tss_cia IF calcula_ars = "S" THEN LET idx = idx + 1 LET movi_emp[idx].clase_mov = "D" LET movi_emp[idx].cod_mov = 53 LET movi_emp[idx].valor = valor_ars_emp - valor_ars_emp_pagado LET idx = idx + 1 LET movi_emp[idx].clase_mov = "T" LET movi_emp[idx].cod_mov = 54 LET movi_emp[idx].valor = valor_ars_cia END IF END IF IF monto_descuento_fase IS NULL THEN LET monto_descuento_fase = 0 END IF LET valor_renta = valor_renta - monto_descuento_fase #-------------------------------------------------------------------------------- LET valor_renta = valor_renta - valor_regal - descuento_tss # ESTOY FORZANDO EL ACUMULADO PARA EL IMPUESTO CUANDO LA NOMINA SEA DE BONIFICACION # LET valor_renta = 0 # IF opt2 = "S" THEN # SELECT SUM(a.valor) INTO valor_renta # FROM notb00008 a # WHERE a.num_emp = datos_emp.num_emp AND a.clase_mov IN ("E","I") AND # a.fecha BETWEEN p1_fecha_del AND p1_fecha_al # LET valor_renta = valor_renta + val_bonifica # END IF # ------------------------------------------------------------------------ # INICIO CALCULO IMPUESTO SOBRE LA RENTA # ------------------------------------------------------------------------ IF opt2 = "S" THEN IF acumulado IS NULL THEN LET acumulado = 0 END IF LET valor_renta = sueldo_boni + acumulado # SE COLOCO CUANDO ES DE # BONIFICACION NO TRAE EL VALOR_RENTA # SUMATORIA DEL AFP Y ARS DISPLAY "sueldo_boni ", sueldo_boni, " acumulado ", acumulado LET valor_seguridad1 = 0 SELECT ISNULL(SUM(valor), 0) INTO valor_seguridad1 FROM notb00008 WHERE num_emp = datos_emp.num_emp AND cod_mov IN (49, 53, 29) AND num_nomi != numero_nomina AND fecha BETWEEN p1_fecha_del AND p1_fecha_al LET valor_seguridad1 = valor_seguridad1 * -1 # CALL fgl_winmessage("seguridad",valor_seguridad1,"stop") LET valor_renta = valor_renta - valor_Seguridad1 END IF #SUMATORIA ESPECIAL POR EL TEMA DE FASE IF valor_renta > excento THEN SELECT cod_mov INTO datos_mov.cod_mov FROM notb00002 WHERE clase_mov = "R" LET renta_15 = 0 LET renta_20 = 0 LET renta_27 = 0 FOR i = 1 TO idx1 IF datos_mov.cod_mov = desp_mov[i].cod_mov THEN IF desp_mov[i].clasifica = "N" OR desp_mov[i].clasifica IS NULL THEN GOTO llega END IF END IF END FOR # Loop para saber si el codigo del impuesto sea dado mediante a una novedad FOR i = 1 TO idx IF datos_mov.cod_mov = movi_emp[i].cod_mov THEN LET datos_mov.clase_mov = "D" GOTO llega END IF END FOR IF numero_nomina IS NULL THEN LET numero_nomina = 1 END IF SELECT SUM(valor) INTO renta_pagada FROM notb00008 WHERE num_emp = datos_emp.num_emp AND (cod_mov = datos_mov.cod_mov OR cod_mov = 70) AND num_nomi != numero_nomina AND fecha BETWEEN p1_fecha_del AND p1_fecha_al IF renta_pagada IS NULL THEN LET renta_pagada = 0 END IF IF renta_pagada < 0 THEN LET renta_pagada = renta_pagada * -1 END IF # Renta al 15 % IF valor_renta > excento AND valor_renta <= hasta_15 THEN LET valor_renta = valor_renta - excento LET renta = valor_renta * .15 LET renta_15 = renta ELSE LET renta = ((hasta_15 - excento) * .15) LET renta_15 = renta END IF DISPLAY " 15 ", renta_15 #CALL fgl_winmessage("renta15",renta_15,"stop") # Renta al 20 % IF valor_renta > hasta_15 AND valor_renta <= hasta_20 THEN LET valor_renta = valor_renta - hasta_15 LET renta = valor_renta * .20 LET renta_20 = renta ELSE IF valor_renta > hasta_20 THEN LET renta = ((hasta_20 - hasta_15) * .20) LET renta_20 = renta END IF END IF DISPLAY " RENTA 20 ", renta_20 # Renta al 25 % IF valor_renta > hasta_20 AND valor_renta <= hasta_25 THEN LET valor_renta = valor_renta - hasta_20 LET renta = valor_renta * .25 LET renta_27 = renta ELSE IF valor_renta > hasta_25 THEN LET renta = ((hasta_25 - hasta_20) * .25) LET renta_27 = renta END IF END IF DISPLAY "renta 25 ", renta_27 # Renta al 30 % LET renta_30 = 0 IF valor_renta > hasta_25 THEN LET valor_renta = valor_renta - hasta_25 LET renta = valor_renta * .25 LET renta_30 = renta END IF DISPLAY "renta 30 ", renta_30 IF renta_15 IS NULL THEN LET renta_15 = 0 END IF IF renta_30 IS NULL THEN LET renta_30 = 0 END IF IF renta_20 IS NULL THEN LET renta_20 = 0 END IF IF renta_27 IS NULL THEN LET renta_27 = 0 END IF LET renta = renta_15 + renta_20 + renta_27 + renta_30 IF opt2 = "S" THEN LET renta = renta_pagada - renta END IF IF opt2 != "S" THEN IF datos_nomi.tipo_emp = "S" THEN LET p_mes = (12 - p_mes1) + 1 LET renta = (renta_pagada - renta) #/ p_mes ELSE #IF ultima_semana_mes = "N" THEN IF ultima_semana_mes = "N" THEN LET renta = (renta_pagada - renta) ELSE LET renta = (renta_pagada - renta) END IF #ELSE # LET renta = renta_pagada - renta #END IF END IF END IF IF renta < 0 THEN LET renta = renta * -1 END IF IF renta < 0 THEN LET renta = 0 END IF # Cuando es renta de bonificacion Se Agrego el 11/11/2002 #---------------------------------------------------------------------------- IF renta > 0 THEN IF opt1 != "S" THEN LET idx = idx + 1 LET renta = renta * -1 LET movi_emp[idx].clase_mov = "D" LET movi_emp[idx].cod_mov = datos_mov.cod_mov LET movi_emp[idx].valor = renta END IF END IF IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE RETURN END IF END IF #----------------------------------------------------------------------- # COMPENSACION IMPUESTO SOBRE LA RENTA #----------------------------------------------------------------------- LET impuesto_c = 0 SELECT SUM(a.valor) INTO impuesto_c FROM notb00008 a WHERE a.num_emp = datos_emp.num_emp AND a.cod_mov = 48 IF impuesto_c < 0 THEN LET idx = idx + 1 IF renta < 0 THEN LET renta = renta * -1 END IF LET impuesto_c = impuesto_c * -1 IF renta > impuesto_c THEN LET movi_emp[idx].clase_mov = "D" LET movi_emp[idx].cod_mov = 48 LET movi_emp[idx].valor = impuesto_c ELSE LET movi_emp[idx].clase_mov = "D" LET movi_emp[idx].cod_mov = 48 LET movi_emp[idx].valor = renta END IF END IF END IF #------------- TERMINA CALCULO DE LA RENTA ------------------------------ IF opt1 = "S" THEN # Se modifico el 11/11/2002 IF retorne = "N" THEN IF datos_mov.cod_mov = 23 THEN # Modifico 11/11/2002 LET renta = renta_boni - renta LET idx = idx + 1 LET movi_emp[idx].clase_mov = "D" LET movi_emp[idx].cod_mov = datos_mov.cod_mov LET movi_emp[idx].valor = renta END IF # END IF END IF # Cuando el empleado no tiene que pagar contando con la bonificacion # Solo por el sueldo IF opt1 = "S" THEN IF bonifica = "N" THEN FOR i = 1 TO idx IF movi_emp[i].cod_mov = datos_mov.cod_mov THEN GOTO llega END IF END FOR LET idx = idx + 1 LET movi_emp[idx].clase_mov = "D" LET movi_emp[idx].cod_mov = datos_mov.cod_mov LET movi_emp[idx].valor = renta END IF END IF # Calculo de la renta de regalia pascual LABEL llega: IF regalia = "S" THEN SELECT cod_mov INTO datos_mov.cod_mov FROM notb00002 WHERE clase_mov = "R" FOR i = 1 TO idx1 IF datos_mov.cod_mov = desp_mov[i].cod_mov THEN IF desp_mov[i].clasifica = "N" OR desp_mov[i].clasifica IS NULL THEN GOTO otro_llega END IF END IF END FOR CALL renta_regalia() END IF LABEL otro_llega: #------------------------------------------------------------------------------ # CALCULO PARA EL PAGO DEL SEGURO SOCIAL #------------------------------------------------------------------------------ IF datos_emp.paga_seg = "S" THEN SELECT cod_mov, tipo_mov INTO datos_mov.cod_mov, p_tipo FROM notb00002 WHERE clase_mov = "S" IF p_tipo = "G" THEN GOTO salta END IF LET cuota_ss = 0 LET acum_mes_ss = 0 LET acum_ing_mes = 0 FOR i = 1 TO idx1 IF datos_mov.cod_mov = desp_mov[i].cod_mov THEN IF desp_mov[i].clasifica = "N" OR desp_mov[i].clasifica IS NULL THEN GOTO salta END IF END IF END FOR IF ultima_semana_mes = "S" THEN # Busca el acumulado de seguro social, para el mes, que tiene el empleado SELECT SUM(valor) INTO acum_mes_ss FROM notb00008 WHERE cod_mov = datos_mov.cod_mov AND num_emp = datos_emp.num_emp AND fecha BETWEEN fecha_ini_mes AND p_fecha_al AND cod_mov != 33 AND status_t IS NULL IF acum_mes_ss IS NULL THEN LET acum_mes_ss = 0 END IF IF acum_mes_ss <> 0 THEN LET acum_mes_ss = acum_mes_ss * -1 END IF # Busca el acumulado de ingresos en el mes, que tiene el empleado SELECT SUM(valor) INTO acum_ing_mes FROM notb00008 WHERE (clase_mov = "I" OR clase_mov = "E") AND num_emp = datos_emp.num_emp AND fecha BETWEEN fecha_ini_mes AND p_fecha_al AND status_t IS NULL IF acum_ing_mes IS NULL THEN LET acum_ing_mes = 0 END IF END IF # Busca la cuota de seguro social que debe pagar el empleado segun los ingresos # que obtuvo en la semana, si no es la ultima nomina del mes. IF ultima_semana_mes = "N" THEN IF datos_nomi.tipo_emp = "S" THEN LET ingresos_empleado = movi_emp[1].valor + otros_ing LET salario_semanal = 0 SELECT salario_sem_hasta INTO salario_semanal FROM notb00006 WHERE salario_sem_desde <= ingresos_empleado AND salario_sem_hasta >= ingresos_empleado IF status = NOTFOUND THEN LET ss.porc_emp = 23.10 LET ss.salario_sem_hasta = 744.00 LET ss.salario_men_hasta = 3224.01 LET ss.porc_pat = 64.68 #51.17 ELSE SELECT salario_sem_hasta, salario_men_hasta, porc_emp, porc_pat INTO ss.salario_sem_hasta, ss.salario_men_hasta, ss.porc_emp, ss.porc_pat FROM notb00006 WHERE salario_sem_hasta = salario_semanal END IF END IF IF datos_nomi.tipo_emp = "Q" THEN LET ingresos_empleado = (p_sueldo / 190.6) * 44 + otros_ing LET salario_semanal = 0 SELECT salario_sem_hasta INTO salario_semanal FROM notb00006 WHERE salario_sem_desde <= ingresos_empleado AND salario_sem_hasta >= ingresos_empleado IF status = NOTFOUND THEN LET ss.porc_emp = 13.03 LET ss.salario_sem_hasta = 744.00 LET ss.salario_men_hasta = 3224.01 LET ss.porc_pat = 64.68 #51.17 ELSE SELECT salario_sem_hasta, salario_men_hasta, porc_emp, porc_pat INTO ss.salario_sem_hasta, ss.salario_men_hasta, ss.porc_emp, ss.porc_pat FROM notb00006 WHERE salario_sem_hasta = salario_semanal END IF END IF END IF # Busca la cuota de seguro social que debe pagar el empleado segun los ingresos # que obtuvo en el mes, si es la ultima nomina del mes. IF ultima_semana_mes = "S" THEN IF datos_nomi.tipo_emp = "S" THEN LET ingresos_empleado = movi_emp[1].valor + otros_ing + acum_ing_mes LET salario_semanal = 0 SELECT salario_sem_hasta INTO salario_semanal FROM notb00006 WHERE salario_men_desde <= ingresos_empleado AND salario_men_hasta >= ingresos_empleado IF status = NOTFOUND THEN LET ss.porc_emp = 23.10 LET ss.salario_sem_hasta = 744.00 LET ss.salario_men_hasta = 3224.01 LET ss.porc_pat = 64.68 #51.17 ELSE SELECT salario_sem_hasta, salario_men_hasta, porc_emp, porc_pat INTO ss.salario_sem_hasta, ss.salario_men_hasta, ss.porc_emp, ss.porc_pat FROM notb00006 WHERE salario_sem_hasta = salario_semanal END IF END IF IF datos_nomi.tipo_emp = "Q" THEN LET ingresos_empleado = movi_emp[1].valor + otros_ing + acum_ing_mes LET salario_semanal = 0 SELECT salario_sem_hasta INTO salario_semanal FROM notb00006 WHERE salario_men_desde <= ingresos_empleado AND salario_men_hasta >= ingresos_empleado IF status = NOTFOUND THEN LET ss.porc_emp = 13.03 LET ss.salario_sem_hasta = 744.00 LET ss.salario_men_hasta = 3224.01 LET ss.porc_pat = 64.68 #51.17 ELSE SELECT salario_sem_hasta, salario_men_hasta, porc_emp, porc_pat INTO ss.salario_sem_hasta, ss.salario_men_hasta, ss.porc_emp, ss.porc_pat FROM notb00006 WHERE salario_sem_hasta = salario_semanal END IF END IF END IF # Determina la cuota de seguro social, si es la ultima nomina del mes IF ultima_semana_mes = "S" THEN IF datos_nomi.tipo_emp = "S" THEN LET cuota_ss = ss.porc_emp * semanas_mes - acum_mes_ss LET cuota_ss_pa = ss.porc_pat * semanas_mes LET idx = idx + 1 LET movi_emp[idx].clase_mov = "D" LET movi_emp[idx].cod_mov = datos_mov.cod_mov LET movi_emp[idx].valor = cuota_ss * -1 LET idx = idx + 1 LET movi_emp[idx].clase_mov = "T" LET movi_emp[idx].cod_mov = 98 LET movi_emp[idx].valor = cuota_ss_pa END IF IF datos_nomi.tipo_emp = "Q" THEN LET cuota_ss = ss.porc_emp * semanas_mes - acum_mes_ss LET cuota_ss_pa = ss.porc_pat * semanas_mes LET idx = idx + 1 LET movi_emp[idx].clase_mov = "D" LET movi_emp[idx].cod_mov = datos_mov.cod_mov LET movi_emp[idx].valor = cuota_ss * -1 LET idx = idx + 1 LET movi_emp[idx].clase_mov = "T" LET movi_emp[idx].cod_mov = 98 LET movi_emp[idx].valor = cuota_ss_pa END IF END IF # Determina la cuota de seguro social, si no es la ultima nomina del mes IF ultima_semana_mes = "N" THEN IF datos_nomi.tipo_emp = "S" THEN LET cuota_ss = ss.porc_emp LET cuota_ss_pa = 0 #ss.porc_pat LET idx = idx + 1 LET movi_emp[idx].clase_mov = "T" LET movi_emp[idx].cod_mov = 98 LET movi_emp[idx].valor = cuota_ss_pa LET movi_emp[idx].departamento = datos_emp.departamento LET idx = idx + 1 LET movi_emp[idx].departamento = datos_emp.departamento LET movi_emp[idx].clase_mov = "D" LET movi_emp[idx].cod_mov = datos_mov.cod_mov LET movi_emp[idx].valor = cuota_ss * -1 END IF IF datos_nomi.tipo_emp = "Q" THEN LET cuota_ss = ss.porc_emp * 2 LET cuota_ss_pa = 0 #ss.porc_pat * 2 LET idx = idx + 1 LET movi_emp[idx].clase_mov = "D" LET movi_emp[idx].cod_mov = datos_mov.cod_mov LET movi_emp[idx].valor = cuota_ss * -1 LET movi_emp[idx].departamento = datos_emp.departamento LET idx = idx + 1 LET movi_emp[idx].clase_mov = "T" LET movi_emp[idx].cod_mov = 98 LET movi_emp[idx].valor = cuota_ss_pa LET movi_emp[idx].departamento = datos_emp.departamento END IF END IF END IF LET ss.porc_emp = 0.00 LET ss.salario_sem_hasta = 0.00 LET ss.salario_men_hasta = 0.00 LET ss.porc_pat = 0.00 LET salario_semanal = 0.00 LET cuota_ss_pa = 0.00 #------------------------------------------------------------------------------ # FIN DEL CALCULO PARA EL PAGO DEL SEGURO SOCIAL #------------------------------------------------------------------------------ LABEL salta: #BEGIN WORK # Insertar los movimientos del empleado en memoria FOR p = 1 TO idx # Caso particular para prestamo cooperativa, farmacia y plaza lama # Tiene que el movimiento no sea el movimiento 11 porque esta en la tabla # notb00014 que es donde estan los codigos que se balancean y se puso este # codigo de movimiento en esta tabla para el proceso de fin de ano de nomina IF movi_emp[p].cod_mov != 11 THEN SELECT * FROM notb00014 WHERE @cod_mov = movi_emp[p].cod_mov IF status != NOTFOUND THEN SELECT SUM(valor) INTO p_valor FROM notb00008 WHERE num_emp = datos_emp.num_emp AND cod_mov = movi_emp[p].cod_mov AND status_t IS NULL IF p_valor <= 0 THEN LET movi_emp[p].num_emp = NULL LET movi_emp[p].cod_mov = NULL LET movi_emp[p].valor = 0 END IF LET p_valor = p_valor * tasa IF p_valor < movi_emp[p].valor THEN LET movi_emp[p].valor = p_valor END IF IF movi_emp[p].cod_mov = 12 THEN LET interes = p_valor * porciento LET movi_emp[p].valor = movi_emp[p].valor IF datos_nomi.tipo_emp = "Q" THEN LET interes = interes / 100 END IF IF interes > 0 THEN LET interes = interes * -1 END IF CASE WHEN movi_emp[p].cod_mov = 12 LET p_codigo = 110 EXIT CASE WHEN movi_emp[p].cod_mov = 13 LET p_codigo = 111 EXIT CASE WHEN movi_emp[p].cod_mov = 19 LET p_codigo = 112 EXIT CASE END CASE # Vacaciones Colectivas IF vacaciones = "S" THEN LET interes = interes * semanas END IF #---------------------------------------------------------------------------- # Inserta los intereses de los perstamos como un movimiento en la # nomina, el codigo de los interes es el 110 IF calcula_interes = "SI" THEN IF movi_emp[p].valor != 0 THEN LET movi_emp[p].departamento = datos_emp.departamento INSERT INTO notb00008( num_nomi, tipo_emp, num_emp, departamento, nivel_emp, cod_puesto, fecha, cod_mov, cantidad, valor, clase_mov, us_crea, fech_crea) VALUES(datos_nomi.num_nomi, datos_nomi.tipo_emp, datos_emp.num_emp, datos_emp.departamento, datos_emp.nivel_emp, datos_emp.cod_puesto, p_fecha_al, p_codigo, movi_emp[p].cantidad, interes, movi_emp[p].clase_mov, SUSER_SNAME(), GETDATE()) END IF END IF END IF END IF # Si el movimiento es de prestamo farmacia o plaza lama # Si el valor pendiente de estos prestamos esta saldado no inserta el movimiento IF movi_emp[p].cod_mov = 13 OR movi_emp[p].cod_mov = 19 THEN IF p_valor <= 0 THEN LET movi_emp[p].num_emp = NULL END IF END IF #---------------------------------------------------------------------------- # Cuando el movimiento es de prestamo cooperativa chequea que el valor con # el 1% sea menor o igual que cero para no insertar movimiento en la tabla IF movi_emp[p].valor <= 0 THEN LET movi_emp[p].num_emp = NULL END IF #------------------------------------------------------------------------- END IF IF movi_emp[p].cod_mov != 0 AND movi_emp[p].cod_mov IS NOT NULL THEN IF movi_emp[p].clase_mov = "D" OR movi_emp[p].clase_mov = "R" OR movi_emp[p].clase_mov = "S" THEN LET movi_emp[p].clase_mov = "D" IF movi_emp[p].valor > 0 THEN LET movi_emp[p].valor = movi_emp[p].valor * -1 END IF END IF IF movi_emp[p].valor IS NULL THEN LET movi_emp[p].valor = 0 END IF #------------------------------------------------------------------------ IF movi_emp[p].valor != 0 THEN IF vacaciones = "S" THEN IF movi_emp[p].cod_mov = 22 THEN LET movi_emp[p].valor = movi_emp[p].valor * semanas END IF END IF # --------------------------------- COMPENSACION ISR --------------------- IF movi_emp[p].cod_mov = 48 THEN IF movi_emp[p].valor < 0 THEN LET movi_emp[p].valor = movi_emp[p].valor * -1 END IF END IF #------------------------------------------------------------------------- INSERT INTO notb00008( num_nomi, tipo_emp, num_emp, departamento, nivel_emp, cod_puesto, fecha, cod_mov, cantidad, valor, clase_mov, us_crea, fech_crea, departamento_afecta) VALUES(datos_nomi.num_nomi, datos_nomi.tipo_emp, datos_emp.num_emp, datos_emp.departamento, datos_emp.nivel_emp, datos_emp.cod_puesto, p_fecha_al, movi_emp[p].cod_mov, movi_emp[p].cantidad, movi_emp[p].valor, movi_emp[p].clase_mov, usuarios, GETDATE(), movi_emp[p].departamento) END IF END IF END FOR CALL movi_emp.clear() #CLEAR FORM #COMMIT WORK END FOREACH LET progreso = 100 DISPLAY progreso TO progreso CALL ui.Interface.refresh() CALL fgl_winmessage("MENSAJE", "GENERACION NOMINA TERMINADA", "STOP") CLOSE WINDOW w1 END FUNCTION FUNCTION renta_regalia() SELECT SUM(@valor) INTO valor_renta FROM notb00008 WHERE @num_emp = datos_emp.num_emp AND clase_mov IN ("I", "E") LET renta_15 = 0 LET renta_20 = 0 LET renta_27 = 0 LET otros_ing = 0 LET ing_regal = 0 LET l = 18 FOR i = 1 TO idx IF movi_emp[i].clase_mov = "I" OR movi_emp[i].clase_mov = "E" THEN IF movi_emp[i].valor IS NULL THEN LET movi_emp[i].valor = 0 END IF LET otros_ing = otros_ing + movi_emp[i].valor END IF END FOR # Este comentario pertenece al comentario mas abajo # LET ing_regal = valor_regal #----------------------------------------------------------------------------- LET valor_regal = otros_ing IF valor_regal > 14475 THEN # Se puso comentario porque el ano 1995 se calculo los incentivos conjuntamente # Con la regalia {IF ing_regal < 10050 THEN LET valor_regal = valor_regal - ing_regal END IF} #------------------------------------------------------------------------------ LET valor_regal = valor_regal - 14475 # Renta al 15 % IF valor_renta > 97800 AND valor_renta <= 162996 THEN LET renta_15 = valor_regal * .15 END IF # Renta al 20 % IF valor_renta > 162996 AND valor_renta < 244488 THEN LET renta_20 = valor_regal * .20 END IF # Renta al 27 % IF valor_renta > 244488 THEN LET renta_27 = valor_regal * .25 END IF LET renta_p = renta_15 + renta_20 + renta_27 LET idx = idx + 1 LET movi_emp[idx].clase_mov = "D" LET movi_emp[idx].cod_mov = datos_mov.cod_mov LET movi_emp[idx].valor = renta_p END IF END FUNCTION FUNCTION vacaciones_colect() # Cuando aplican el codigo de vacaciones colectivas que es el codigo 31 FOR i = 1 TO idx IF movi_emp[i].cod_mov = 1 THEN LET movi_emp[i].valor = 0 END IF IF movi_emp[i].cod_mov = 31 THEN LET movi_emp[1].cantidad = movi_emp[i].cantidad LET semanas = movi_emp[i].cantidad / p_h_normal END IF END FOR END FUNCTION FUNCTION desplega() DEFINE pidx SMALLINT, nombre_mov CHAR(30) FOR pidx = 1 TO 9 IF movi_emp[pidx].cod_mov > 0 THEN IF movi_emp[pidx].cantidad IS NOT NULL OR movi_emp[pidx].valor IS NOT NULL THEN SELECT a.descrip_mov INTO nombre_mov FROM notb00002 a WHERE a.cod_mov = movi_emp[pidx].cod_mov DISPLAY movi_emp[pidx].cod_mov TO sdetalle[pidx].cod_mov DISPLAY nombre_mov TO sdetalle[pidx].descripcion DISPLAY movi_emp[pidx].cantidad TO sdetalle[pidx].cantidad DISPLAY movi_emp[pidx].valor TO sdetalle[pidx].valor END IF END IF END FOR END FUNCTION FUNCTION fcalcula_tss(pcod_mov, pnumemp) DEFINE pcod_mov, pnumemp SMALLINT SELECT a.cod_mov FROM notb00003 a WHERE a.cod_mov = pcod_mov AND a.num_emp = pnumemp AND a.valor = 0 IF STATUS = NOTFOUND THEN RETURN TRUE ELSE RETURN FALSE END IF END FUNCTION