{ ----------------------------------------------------------------------- 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 ------------------------------------------------------------------------ } GLOBALS "noprgb000.4gl" DEFINE calcula,calcula_tss CHAR(1), ch_numero CHAR(3) DEFINE p_mes1,numero_nomina,num_van,tiempo,semanas,p_mes,p_ano SMALLINT DEFINE valor_tss_emp,valor_tss_cia,salario_tss,otros_ing_tss,ing_regal,factor,renta_p,val_bonifica,valor_renta DECIMAL(12,2) DEFINE ch_num CHAR(4) DEFINE porc_dias,dias,meses,porc_emp,porc_cia DECIMAL(8,2) DEFINE num_ch CHAR(4) DEFINE numero INTEGER DEFINE empleados CHAR(500) DEFINE porciento DECIMAL(9,4) DEFINE interes,p_valor,p_cantidad,salario_h,renta_pagada_15,renta_pagada_20, renta_pagada_27,renta_15,renta_20,renta_27,renta_30,porc_extras,valor_bonif, valor_regal,renta_boni,valor_bonif1,sueldo_boni,renta_pagada, valor_vacacion DECIMAL(12,2) DEFINE t,p_codigo,dia,k,p,idx1 INTEGER DEFINE k1,vacaciones,hay1,hay,bonifica,regalia,p_tipo,encontre,opt1, retorne CHAR(1) DEFINE p_fecha_del,p_fecha_al DATE DEFINE horas INTERVAL HOUR TO MINUTE DEFINE nombre_mov CHAR(30) DEFINE t_cantidad_35,t_cantidad_100,horas_ex,sueldo_h,p_h_normal,otros_ing DECIMAL(8,2) DEFINE t_horas_ex,horas_35,horas_100,t_horas_35,t_horas_100,acumulado,renta DECIMAL(12,2) DEFINE sueldo,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 fecha_ini_mes DATE DEFINE 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 h_extras RECORD fecha DATE, entrada DATETIME HOUR TO MINUTE, salida DATETIME HOUR TO MINUTE, extra_35 INTERVAL HOUR TO MINUTE, extra_100 INTERVAL HOUR TO MINUTE END RECORD DEFINE movi RECORD cod_mov SMALLINT, valor DECIMAL(10,2) END RECORD DEFINE desp_mov ARRAY[100] OF RECORD 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 DATE 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 END RECORD DEFINE movi_emp ARRAY [52] 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 FUNCTION noprmt008() CLEAR SCREEN CALL pantalla() OPTIONS FORM LINE 9, PROMPT LINE 12, ERROR LINE 24, COMMENT LINE 23 DISPLAY "noprmt008" AT 4,3 DISPLAY "Generacion de nomina" AT 6,30 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.* 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 SELECT fecha_del,fecha_al,h_normal,mes,ano,num_sem INTO p_fecha_del,p_fecha_al,p_h_normal,p_mes1,p_ano,semanas_mes FROM notb00010 WHERE num_nomi = datos_nomi.num_nomi and tipo_emp = datos_nomi.tipo_emp and status_t is null IF status = notfound THEN LET numero_msg = 199 CALL msg(numero_msg) NEXT FIELD num_nomi END IF DISPLAY BY NAME p_fecha_del,p_fecha_al ATTRIBUTE (BOLD) LET ch_num = datos_nomi.num_nomi LET numero = datos_nomi.num_nomi LET num_van= datos_nomi.num_nomi LET p_mes = MONTH(p_fecha_al) LET ch_numero = datos_nomi.num_nomi USING "&&&" LET numero = ch_numero[2,3] IF datos_nomi.tipo_emp = "Q" THEN LET numero = 24 - numero + 1 # LET numero = 24 LET porciento = 0.50 END IF IF datos_nomi.tipo_emp = "V" THEN LET numero = numero - 100 LET numero = 24 - numero LET porciento = 1.00 END IF IF datos_nomi.tipo_emp = "S" THEN LET numero = numero - 100 LET numero = 53 - numero LET porciento = 0.0025 END IF #------------------------------------------------------------------------------ # Determina si es la ultima nomina del mes #------------------------------------------------------------------------------ LET ultima_semana_mes = NULL SELECT MAX(num_nomi) INTO ult_nomi_mes FROM notb00010 WHERE tipo_emp = datos_nomi.tipo_emp AND mes = p_mes1 AND ano = p_ano 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 MIN(fecha_del) INTO fecha_ini_mes FROM notb00010 WHERE tipo_emp = datos_nomi.tipo_emp AND mes = p_mes1 AND ano = p_ano 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 criterio ON departamento,num_emp FROM departamento,num_emp IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = false RETURN END IF 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 # CALL second_scr() LET p_formulario = formulario CLIPPED, "nofmmt108" OPEN FORM nofmmt108 FROM "nofmmt108" DISPLAY FORM nofmmt108 DECLARE tinti CURSOR FOR SELECT cod_mov,descrip_mov FROM notb00002 ORDER BY 1 LET idx1 = 1 FOREACH tinti INTO desp_mov[idx1].cod_mov,desp_mov[idx1].descrip_mov 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 CALL pantalla() DISPLAY "noprmt008" AT 4,2 DISPLAY "Generacion de nomina" AT 6,32 # Preparacion de la busqueda de los empleados dependiendo del criterio de # seleccion IF datos_nomi.tipo_emp = "S" THEN 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,a.fech_efec ", "FROM adtb00003 a ", " WHERE ", " a.nomina = ? ", " AND a.fech_efec <= ? ", " AND (a.status_t is null or ", " a.status_t = 'I') ", "ORDER BY 1" 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,a.fech_efec ", "FROM adtb00003 a ", " WHERE ", " a.nomina = ? ",#" and a.num_emp = 144 ", " AND a.fech_efec <= ? ", " AND (a.status_t is null or ", " a.status_t = 'I') ", "ORDER BY 1" END IF PREPARE comando FROM empleados DECLARE busca SCROLL CURSOR FOR comando OPEN busca USING datos_nomi.tipo_emp,p_fecha_al WHILE STATUS != NOTFOUND FETCH busca INTO datos_emp.* IF status = notfound THEN EXIT WHILE END IF LET meses = (p_fecha_al - datos_emp.fecha) LET salario_tss = datos_emp.sueldo # SEGURIDAD SOCIAL 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 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 fecha_ini_mes and p_fecha_al display "Acumulado ", acumulado END IF IF acumulado is null THEN LET acumulado = 0 END IF DISPLAY "No. Ficha: " at 8,3 DISPLAY datos_emp.num_emp using "&&&" at 8,15 DISPLAY datos_emp.nom1_emp clipped," ",datos_emp.apell1_emp at 8,20 DISPLAY "Acumulado Antes de esta Nomina:" at 9,3 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 LET sueldo_boni = datos_emp.sueldo END IF # Calculo del sueldo normal quincenal IF datos_nomi.tipo_emp = "Q" THEN LET p_sueldo = datos_emp.sueldo LET datos_emp.sueldo = datos_emp.sueldo / 2 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, b.ch_encabeza 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 UNION SELECT a.cod_mov,b.clase_mov,a.cantidad,a.valor,b.cantidad_emp,cantidad_cia, b.ch_encabeza 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 ORDER BY 1 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, b.ch_encabeza 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 ORDER BY 1 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 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 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 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 = 9 THEN CONTINUE FOREACH END IF } IF datos_mov.cod_mov = 33 THEN LET bonifica = "S" 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 IF datos_mov.cantidad > 0 THEN LET movi_emp[idx].valor = salario_h * movi_emp[idx].cantidad ELSE LET movi_emp[idx].valor = datos_mov.valor END IF END IF # Calculo de las horas extras IF movi_emp[idx].clase_mov = "E" THEN SELECT a.cantidad_cia INTO porc_extras FROM notb00002 a WHERE a.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 END IF LET idx = idx + 1 END IF END FOREACH 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 LET movi_emp[idx].valor = p_sueldo IF year(p_fecha_al) = year(datos_emp.fecha) THEN LET p_mes = month(datos_emp.fecha) SELECT dias_prod INTO dias FROM mestable WHERE mes = p_mes 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 / 12) * 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 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 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 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" 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 = salario_h * movi_emp[idx].cantidad END IF # Calculo de las horas extras IF movi_emp[idx].clase_mov = "E" 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 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 = 41 LET movi_emp[idx].clase_mov = "D" LET movi_emp[idx].valor = movi_emp[i].valor * .005 LET movi_emp[idx].cantidad = 0 EXIT FOR END IF END FOR { IF regalia != "S" THEN IF meses >= 3 THEN # Incentivo al supermercado # Chequea que el codigo tenga la opcion de que si lo quieren generar FOR i = 1 to idx1 IF desp_mov[i].cod_mov = 4 THEN IF desp_mov[i].clasifica = "N" or desp_mov[i].clasifica is null THEN GOTO salta1 END IF END IF END FOR LET hay = "N" FOR i = 1 TO idx IF movi_emp[i].cod_mov = 4 THEN LET hay = "S" EXIT FOR END IF END FOR IF hay = "S" THEN GOTO salta1 END IF LET idx = idx + 1 LET movi_emp[idx].clase_mov = "I" LET movi_emp[idx].cod_mov = 4 LET movi_emp[idx].valor = datos_emp.sueldo * .07 # Quincenales IF datos_nomi.tipo_emp = "Q" THEN IF movi_emp[idx].valor > 150 THEN LET movi_emp[idx].valor = 150 END IF END IF # Semanles IF datos_nomi.tipo_emp = "S" THEN # Este control tiene 69.23 por que es el equivalente a 300 pesos semanales # de incentivo a supermercado IF movi_emp[idx].valor > 69.23 THEN LET movi_emp[idx].valor = 69.23 END IF END IF END IF # Gerente General IF datos_emp.num_emp = 148 THEN 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: DISPLAY sueldo_renta at 8,60 DISPLAY acumulado at 9,60 # Busqueda de las novedades globales DECLARE busca20 CURSOR FOR SELECT cod_mov,cantidad_emp,clase_mov FROM notb00002 WHERE tipo_mov = "G" 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 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 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 IF datos_emp.num_emp = 148 THEN LET movi_emp[idx].clase_mov = "I" LET movi_emp[idx].cod_mov = 5 LET movi_emp[idx].valor = 0 END IF 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 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 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 otros_ing is null THEN LET otros_ing = 0 END IF LET valor_renta = 0 LET valor_renta = valor_renta + acumulado + otros_ing + sueldo_renta #----------------------------------------------------------------------- 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 valor INTO val_bonifica FROM notb00008 WHERE num_emp = datos_emp.num_emp and cod_mov = 33 #and # fecha > "31122004" IF val_bonifica is null THEN LET val_bonifica = 0 END IF LET acumulado = acumulado - val_bonifica LET valor_renta = sueldo_renta + acumulado + otros_ing LET valor_renta = valor_renta / num_van IF bonifica = "S" THEN LET valor_renta = acumulado LET valor_renta = (valor_renta / (p_mes - 1)) * 12 LET valor_renta = valor_renta + val_bonifica LET valor_bonif1 = valor_renta + otros_ing ELSE LET valor_renta = valor_renta 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 # 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 > "31122004" 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 > "31122004" 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 68460.00 MENSUALES # 29770 QUINCENALES # 98000 26/1/2005 #------------------------------------------------------------------------------ LET otros_ing_tss = 0 LET salario_tss = salario_tss + otros_ing_tss LET globales.cod_mov = 49 LET calcula_tss = "S" 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 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 # SEGURIDAD 34230 IF salario_tss < 98000.00 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 = 98000.00 * porc_emp LET valor_tss_cia = 98000.00 * porc_cia LET valor_renta = valor_renta - valor_tss_emp END IF 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 / 2 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 / 2 END IF #-------------------------------------------------------------------------------- LET valor_renta = valor_renta - valor_regal DISPLAY "2",datos_emp.num_emp, " ",valor_renta #-------------------------------------------------------------------------------- # INICIO CALCULO DE LA RENTA # MODIFICACION: ADICION NUEVA ESCALA DEL 30% PARA LAS PERSONAS QUE GANEN MAS DE # 900,000.00 # FECHA : ENERO 19,2006 #-------------------------------------------------------------------------------- IF valor_renta > 23035.17 THEN display "Emp ",datos_emp.num_emp, valor_renta 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 LET renta_30 = 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 fecha_ini> "31122004" } 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 >= 23035.17 and valor_renta <= 34552.66 THEN LET valor_renta = valor_renta - 23035.17 LET renta = valor_renta * .15 LET renta_15 = renta ELSE LET renta = ((34552.66-23035.17) * .15) LET renta_15 = renta END IF # Renta al 20 % IF valor_renta > 34552.66 AND valor_renta <= 47989.83 THEN LET valor_renta = valor_renta - 34552.66 LET renta = valor_renta * .20 LET renta_20 = renta ELSE IF valor_renta > 32160 THEN LET renta = ((47989.83-34552.66) * .20) LET renta_20 = renta END IF END IF # Renta al 25 % IF valor_renta > 47989.83 AND valor_renta <= 75000 THEN LET valor_renta = valor_renta - 47989.83 LET renta = valor_renta * .25 LET renta_27 = renta ELSE IF valor_renta > 44666.67 THEN LET renta = ((75000-47989.83) * .25) LET renta_27 = renta END IF END IF # Renta al 30% IF valor_renta > 75000 THEN LET valor_renta = valor_renta - 75000 LET renta = valor_renta * .30 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 IF datos_nomi.tipo_emp = "S" THEN LET p_mes = (12 - p_mes1) + 1 LET renta = (renta - renta_pagada) / p_mes ELSE LET renta = renta - renta_pagada # EN FECHA 28/3/2005 LET renta = (renta - renta_pagada) / (12- MONTH(p_fecha_al)+ 1) END IF END IF IF bonifica = "S" and retorne = "S" THEN LET renta_boni = renta LET renta = 0 END IF IF renta_boni < 0 THEN LET renta_boni = renta_boni * -1 END IF { IF renta < 0 THEN LET renta = renta * -1 END IF } IF renta < 0 THEN LET renta = 0 END IF # Introduce el codigo del movimiento de la renta cuando en la decision # si la nomina es de bonificacion es otra cosa que no sea 'S' 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 END IF #------------- TERMINA CALCULO DE LA RENTA ------------------------------ # 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 IF retorne = "N" THEN IF datos_mov.cod_mov = 23 THEN 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 ingresos_empleado = 0 LET cuota_ss = 0 LET acum_mes_ss = 0 LET acum_ing_mes = 0 { 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 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 IN ("I", "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 a.salario_sem_hasta, a.salario_men_hasta, a.porc_emp, a.porc_pat INTO ss.salario_sem_hasta, ss.salario_men_hasta, ss.porc_emp, ss.porc_pat FROM notb00006 a WHERE a.salario_sem_hasta = salario_semanal END IF END IF IF datos_nomi.tipo_emp = "Q" THEN LET ingresos_empleado = (p_sueldo / 2)+ otros_ing #LET ingresos_empleado = p_sueldo + otros_ing LET salario_semanal = 0 SELECT a.salario_men_hasta INTO salario_semanal FROM notb00006 a WHERE a.salario_men_desde <= ingresos_empleado and a.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 MAX(a.salario_men_hasta),MAX(a.salario_men_hasta),MAX(a.porc_emp), MAX(a.porc_pat) INTO ss.salario_sem_hasta, ss.salario_men_hasta, ss.porc_emp, ss.porc_pat FROM notb00006 a WHERE a.salario_men_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 a.salario_sem_hasta INTO salario_semanal FROM notb00006 a WHERE a.salario_men_desde <= ingresos_empleado and a.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 a.salario_sem_hasta, a.salario_men_hasta, a.porc_emp, a.porc_pat INTO ss.salario_sem_hasta, ss.salario_men_hasta, ss.porc_emp, ss.porc_pat FROM notb00006 a WHERE a.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 a.salario_men_hasta INTO salario_semanal FROM notb00006 a WHERE a.salario_men_desde <= ingresos_empleado and a.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 MAX(a.salario_men_hasta),MAX(a.salario_men_hasta),MAX(a.porc_emp), MAX(a.porc_pat) INTO ss.salario_sem_hasta, ss.salario_men_hasta, ss.porc_emp, ss.porc_pat FROM notb00006 a WHERE a.salario_men_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 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 * semanas_mes - acum_mes_ss 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 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 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 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 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 #------------------------------------------------------------------------------ # FIN DEL CALCULO PARA EL PAGO DEL SEGURO SOCIAL #------------------------------------------------------------------------------ LABEL salta: LET l = 11 FOR p = 1 TO 25 IF l < 25 THEN DISPLAY " " at l,3 DISPLAY " " at l,7 DISPLAY " " at l,20 LET l = l + 1 END IF END FOR LET l = 11 FOR p = 1 TO idx IF movi_emp[p].cod_mov is not null THEN FOR t = 1 TO idx1 LET nombre_mov = null IF movi_emp[p].cod_mov = desp_mov[t].cod_mov THEN LET nombre_mov = desp_mov[t].descrip_mov EXIT FOR END IF END FOR IF l < 25 THEN DISPLAY movi_emp[p].cod_mov using "&&" at l,3 DISPLAY nombre_mov at l,7 DISPLAY movi_emp[p].cantidad using "##,###.##" at l,40 DISPLAY movi_emp[p].valor using "##,###.##" at l,50 LET l = l + 1 END IF END IF END FOR # 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 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 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,user,current,null,null) 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 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,user,current,null,null) 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,user,current,null,null) END IF END IF END IF END FOR LET l = 11 FOR p = 1 TO idx IF movi_emp[p].cod_mov is not null THEN FOR t = 1 TO idx1 LET nombre_mov = null IF movi_emp[p].cod_mov = desp_mov[t].cod_mov THEN LET nombre_mov = desp_mov[t].descrip_mov EXIT FOR END IF END FOR IF l < 25 THEN DISPLAY movi_emp[p].cod_mov using "&&" at l,3 DISPLAY nombre_mov at l,7 DISPLAY movi_emp[p].cantidad using "##,###.##" at l,40 DISPLAY movi_emp[p].valor using "##,###.##" at l,50 LET l = l + 1 END IF END IF END FOR FOR i = 1 TO 50 LET movi_emp[i].num_emp = null LET movi_emp[i].cod_mov = null LET movi_emp[i].valor = null END FOR END WHILE 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") and fecha > "31122006" 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 > 12060 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 - 10050 # Renta al 15 % IF valor_renta > 60000 and valor_renta<= 100000 THEN LET renta_15 = valor_regal * .15 END IF # Renta al 20 % IF valor_renta >= 100001 and valor_renta < 150000 THEN LET renta_20 = valor_regal * .20 END IF # Renta al 27 % IF valor_renta >= 150000 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