Files
MBS/PROYECTO/nodir/noprmt008_1.4gl
T

2242 lines
74 KiB
Plaintext

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