{ ----------------------------------------------------------------------- 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), xafecta_tss CHAR(2) DEFINE p_mes1,numero_nomina,num_van,semanas,p_mes,p_ano,cantidad_empleados, control_empleado SMALLINT, pestado BOOLEAN DEFINE impuesto_c,sueldo_ganado,ing_regal,renta_p,val_bonifica,valor_renta,sueldo_boni, valor_seguridad1,descuento_tss,descuento_tss1, monto_ars,monto_afp,valor_ars_emp_pagado,valor_tss_emp_pagado,sueldo_h DECIMAL(12,2) DEFINE ch_num CHAR(4), calcula_interes CHAR(2) DEFINE porc_dias,meses,factor 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(10,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(12,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(8,2) DEFINE acumulado,renta DECIMAL(12,2) DEFINE sueldo_renta,p_sueldo,salario_semanal DECIMAL(12,2) DEFINE ingresos_empleado, acum_mes_ss, cuota_ss, acum_ing_mes DECIMAL(12,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) 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) 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 END RECORD MAIN DEFER INTERRUPT CALL ARG_VAL(1) RETURNING usuarios CALL ARG_VAL(2) RETURNING clave CONNECT to "smarmotech" USER usuarios USING clave CALL noprmt008() END MAIN FUNCTION noprmt008() OPTIONS FORM LINE 9, PROMPT LINE 12, ERROR LINE 24, COMMENT LINE 23 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,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 INPUT IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = false RETURN END IF IF datos_nomi.tipo_emp IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD tipo_emp END IF LET selec = "SELECT CONVERT(CHAR(10),fecha_del,103) ,CONVERT(CHAR(10),fecha_al,103), h_normal,mes,ano,num_sem ", " 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 # Busqueda del periodo comprendido de la nomina EXECUTE comando20 INTO p_fecha_del,p_fecha_al,p_h_normal,p_mes1,p_ano,semanas_mes IF status = notfound THEN LET numero_msg = 199 CALL msg(numero_msg) NEXT FIELD num_nomi END IF 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 DISPLAY "datos 5 ",datos_nomi.tipo_emp ," ",p_fecha_al USING "DD/MM/YYYY"," ",datos_nomi.num_nomi #------------------------------------------------------------------------------ # 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 " PREPARE busca_f1 FROM selec EXECUTE busca_f1 INTO fecha_ult USING datos_nomi.tipo_emp,p_mes1,p_ano 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 " 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 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 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 LET opt1= upshift(opt1) IF opt1 != "S" THEN RETURN END IF LET regalia = upshift(regalia) LET vacaciones = upshift(vacaciones) 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 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" 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 LET empleados = "SELECT num_emp,departamento,nivel_emp,cod_puesto,nom1_emp,", "apell1_emp,sueldo_ac,paga_seg,fech_efec ", "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 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) ", "FROM adtb00003 a ", " WHERE ", " a.nomina = '",datos_nomi.tipo_emp,"' and (",criterio clipped, ") AND a.fech_efec <= '",p_fecha_al USING "mm/dd/yyyy","'", " 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 = ",datos_nomi.num_nomi, " and x.status_t is null) and ", criterio CLIPPED, " ORDER BY a.num_emp" END IF DISPLAY "BUSCANDO EMPLEADOS..." to estado PREPARE comando FROM empleados DECLARE busca CURSOR FOR comando DISPLAY "datos 6 ",datos_nomi.tipo_emp ,p_fecha_al,datos_nomi.num_nomi OPEN busca #USING datos_nomi.tipo_emp ,p_fecha_al,datos_nomi.num_nomi 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.* IF status = notfound THEN EXIT WHILE END IF # 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 DISPLAY "empleado 1 ",datos_emp.num_emp LET meses = (p_fecha_al - datos_emp.fecha) LET meses = meses / 30 FOR t = 1 TO 12 LET movi_emp[t].num_emp = null LET movi_emp[t].cod_mov = null LET movi_emp[t].clase_mov = null LET movi_emp[t].cantidad = null LET movi_emp[t].valor = null END FOR 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 LET sueldo_renta = 0 LET movi_emp[1].cod_mov = 1 LET movi_emp[1].clase_mov = "I" # 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 / 95.33 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 DECLARE busca1 CURSOR FOR SELECT a.cod_mov,b.clase_mov,a.cantidad,a.valor,b.cantidad_emp,cantidad_cia, "fijos" FROM notb00003 a,notb00002 b WHERE a.num_emp = datos_emp.num_emp and a.departamento = datos_emp.departamento 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" 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.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 FROM notb00008 b,notb00002 a WHERE b.num_emp = datos_emp.num_emp and b.tipo_emp = datos_nomi.tipo_emp AND # b.departamento = datos_emp.departamento 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 #ORDER BY b.cod_mov 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" FROM notb00003 a,notb00002 b WHERE (a.num_emp = datos_emp.num_emp and a.departamento = datos_emp.departamento 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" 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 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 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 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 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 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 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 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 # 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 idx = idx + 1 END IF END FOREACH DISPLAY "empleado 2 ",datos_emp.num_emp 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,24,5) 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,24,5) 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) 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 # 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 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 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 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].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].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 # 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 IF p_valor > 0 THEN # Chequea que el codigo tenga la opcion de que si lo quieren generar FOR i = 1 to idx1 IF desp_mov[i].cod_mov = 5 THEN IF desp_mov[i].clasifica = "N" or desp_mov[i].clasifica is null THEN CONTINUE WHILE END IF IF desp_mov[i].todos = "N" AND datos_mov.identifica = "fijos" THEN CONTINUE WHILE END IF END IF END FOR # Chequea si el codigo de incentivo almuerzo esta en novedades # para salir del proceso en caso de que este codigo exista como novedad FOR i = 1 to idx IF movi_emp[i].cod_mov = 5 THEN CONTINUE WHILE END IF END FOR LET idx = idx + 1 LET movi_emp[idx].clase_mov = "I" LET movi_emp[idx].cod_mov = 5 LET movi_emp[idx].valor = p_valor END IF #----------------------------------------------------------------------------- # 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 CALL vacaciones_colect() END IF # OTROS INGRESOS PARA EL CALCULO DE AFP 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 DISPLAY "otros tss ",otros_ing_tss," fecha ",p1_fecha_del," ",p1_fecha_al," ",datos_emp.num_emp 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# 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[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 # BUSCA INFORMACION TSS SELECT a.afecta_tss INTO xafecta_tss FROM notb00002 a WHERE a.cod_mov = movi_emp[i].cod_mov IF xafecta_tss = "SI" THEN # IF movi_emp[i].cod_mov = 40 OR movi_emp[i].cod_mov = 36 OR movi_emp[i].cod_mov = 5 OR # movi_emp[i].cod_mov = 24 OR movi_emp[i].cod_mov = 31 OR movi_emp[i].cod_mov = 16 THEN LET otros_ing_tss = movi_emp[i].valor + otros_ing_tss END IF LET otros_ing = movi_emp[i].valor + otros_ing 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_renta * 2) + otros_ing_tss LET salario_tss = sueldo_ganado + sueldo_renta + otros_ing_tss DISPLAY "salario tss 2 ",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" { SELECT *FROM notb00017 WHERE num_emp = datos_emp.num_emp IF status != notfound THEN LET calcula = "S" END IF # Calculo para cuando la nomina sea de vendedores IF calcula = "S" THEN SELECT SUM(valor) INTO val_bonifica FROM notb00008 WHERE num_emp = datos_emp.num_emp and cod_mov = 33 AND fecha >= fecha_inicio_p IF val_bonifica is null THEN LET val_bonifica = 0 END IF LET acumulado = acumulado - val_bonifica # Modificado el 11/4/2002 LET valor_renta = sueldo_renta + acumulado + otros_ing Modificado el 11/2/2005 LET valor_renta = sueldo_renta + otros_ing + acumulado LET valor_renta = sueldo_renta IF bonifica = "S" THEN LET valor_renta = acumulado LET valor_renta = (valor_renta / (p_mes - 1)) * 12 LET valor_renta = val_bonifica LET valor_bonif1 = valor_renta + otros_ing ELSE LET valor_renta = valor_renta + val_bonifica END IF END IF } 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 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) IF valor_regal is null THEN LET valor_regal = 0 END IF { esta decision se puso en comentario porque la nomina de regalia se modifico para que el incentivo de asistencia se sumara a la regalia y asi se pagara menos renta. IF valor_regal >= 10050 THEN LET valor_regal = 10050 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 DISPLAY "PAGO TSS ",valor_tss_emp #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 DISPLAY "empleado 3 ",datos_emp.num_emp LET idx = idx + 1 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 #-------------------------------------------------------------------------------- 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 LET valor_renta = sueldo_boni + acumulado # SE COLOCO CUANDO ES DE # BONIFICACION NO TRAE EL VALOR_RENTA # SUMATORIA DEL AFP Y ARS LET valor_seguridad1 = 0 SELECT SUM(valor) 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 #CALL fgl_winmessage("renta",valor_renta,"stop") #CALL fgl_winmessage("excento",excento,"stop") IF valor_renta > excento THEN SELECT cod_mov INTO datos_mov.cod_mov FROM notb00002 WHERE clase_mov = "R" { LET excento = 11535 LET hasta_15 = 19225.08 LET hasta_20 = 28837.58 LET hasta_25 = 28837.58 } 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 #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 # 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 # 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 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 #---------------------------------------------------------------------------- #CALL fgl_winmessage("renta",renta,"stop") 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 ------------------------------ { Se Modifico el 11/11/2002 # Retorna a calcular la renta que pagaria con la bonificacion IF bonifica = "S" and retorne = "S" THEN LET retorne = "N" GOTO retorna END IF } 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 { SE PUSO EN COMENTARIO PORQUE LOS EMPLEADOS 596, 600, 601 ESTABAN DANDO PROBLEMAS DE CALCULO SEGURO SOCIAL 22/5/2002 FOR i = 1 to idx IF datos_mov.cod_mov = movi_emp[i].cod_mov THEN GOTO salta END IF END FOR } 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 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 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 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 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 movi_emp.getLength() # 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 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 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 INSERT INTO notb00008 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,null,SUSER_SNAME(),GETDATE(),null,null) 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 #------------------------------------------------------------------------- # IF movi_emp[p].valor <> 0 THEN INSERT INTO notb00008 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,null,usuarios,GETDATE(),null,null) # END IF #IF movi_emp[p].cod_mov = 32 OR movi_emp[p].cod_mov = 31 OR # movi_emp[p].cod_mov = 33 THEN # INSERT INTO notb00008 # 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, # 1,0,0, # movi_emp[p].clase_mov,null,SUSER_SNAME(),GETDATE(),null,null) # IF STATUS < 0 THEN #CALL fgl_winmessage("STOP","ERROR INSERTANDO INFORMACION","STOP") #ROLLBACK WORK #EXIT PROGRAM #END IF #END IF END IF END IF END FOR CALL movi_emp.clear() COMMIT WORK END WHILE 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