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

2413 lines
80 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)
DEFINE p_mes1,numero_nomina,num_van,semanas,p_mes,p_ano,cantidad_empleados,
control_empleado SMALLINT,
pestado BOOLEAN,
xestado_legal VARCHAR(20),
opt3 VARCHAR(3)
DEFINE impuesto_c,sueldo_ganado,ing_regal,renta_p,val_bonifica,valor_renta,sueldo_boni,
valor_seguridad1,descuento_tss,descuento_tss1,
monto_descuento_fase,monto_ars,monto_afp,valor_ars_emp_pagado,sueldo_h DECIMAL(16,2)
DEFINE ch_num CHAR(4),
calcula_interes,xafecta_tss CHAR(2)
DEFINE porc_dias,meses,factor,tasa DECIMAL(8,2)
DEFINE numero INTEGER
DEFINE empleados CHAR(500)
DEFINE porc_emp,porc_emp_ars,porc_cia,porc_cia_ars,porciento DECIMAL(9,4),
afp_pago_emp,afp_pago_cia,cuota_ss_pa,valor_tss_emp,valor_ars_emp,valor_tss_cia,valor_ars_cia,salario_tss,otros_ing_tss DECIMAL(16,2),
fecha_ext1,fecha_ext2,fecha_ult DATE
DEFINE interes,p_cantidad,salario_h,
renta_15,renta_20,renta_27,renta_30,porc_extras,
valor_regal,valor_bonif1,renta_pagada,
excento,hasta_15,hasta_20,hasta_25 DECIMAL(16,2)
DEFINE t,p_codigo,p,idx1 INTEGER
DEFINE vacaciones,hay1,bonifica,regalia,p_tipo,encontre,
retorne CHAR(1)
DEFINE
fecha_ini_mes,fecha_inicio_p,p_fecha_del,p_fecha_al,p1_fecha_del,p1_fecha_al DATE
DEFINE p_h_normal,otros_ing
DECIMAL(16,2)
DEFINE acumulado,renta DECIMAL(16,2)
DEFINE sueldo_renta,p_sueldo,salario_semanal DECIMAL(16,2)
DEFINE ingresos_empleado, acum_mes_ss, cuota_ss, acum_ing_mes DECIMAL(16,2)
DEFINE ultima_semana_mes CHAR(1)
DEFINE num_periodo,semanas_mes, ult_nomi_mes INTEGER
DEFINE ss RECORD
salario_sem_hasta LIKE notb00006.salario_sem_hasta,
salario_men_hasta LIKE notb00006.salario_men_hasta,
porc_emp LIKE notb00006.porc_emp,
porc_pat LIKE notb00006.porc_pat
END RECORD
DEFINE globales RECORD
cod_mov SMALLINT,
cantidad_emp LIKE notb00002.cantidad_emp,
clase_mov CHAR(1)
END RECORD
DEFINE desp_mov DYNAMIC ARRAY OF RECORD
todos CHAR(1),
clasifica CHAR(1),
cod_mov SMALLINT,
descrip_mov CHAR(30)
END RECORD
DEFINE datos_nomi RECORD
num_nomi LIKE notb00010.num_nomi,
tipo_emp LIKE notb00010.tipo_emp
END RECORD
DEFINE datos_emp RECORD
num_emp LIKE adtb00003.num_emp,
departamento LIKE adtb00003.departamento,
nivel_emp LIKE adtb00003.nivel_emp,
cod_puesto LIKE adtb00003.cod_puesto,
nom1_emp LIKE adtb00003.nom1_emp,
apell1_emp LIKE adtb00003.apell1_emp,
sueldo LIKE adtb00003.sueldo_ac,
paga_seg LIKE adtb00003.paga_seg,
fecha CHAR(10),
moneda VARCHAR(3)
END RECORD
DEFINE datos_mov RECORD
cod_mov LIKE notb00002.cod_mov,
clase_mov LIKE notb00002.clase_mov,
cantidad LIKE notb00002.cantidad_emp,
valor LIKE notb00007.valor,
cantidad_emp LIKE notb00002.cantidad_emp,
cantidad_cia LIKE notb00002.cantidad_cia,
identifica CHAR(20),
departamento INT
END RECORD
DEFINE movi_emp DYNAMIC ARRAY OF RECORD
num_emp SMALLINT,
cod_mov LIKE notb00002.cod_mov,
clase_mov CHAR(1),
cantidad LIKE notb00002.cantidad_emp,
valor LIKE notb00007.valor,
departamento INT
END RECORD
MAIN
DEFER INTERRUPT
CALL ARG_VAL(1) RETURNING usuarios
CALL ARG_VAL(2) RETURNING clave
CONNECT to "smarmotech" USER usuarios USING clave
SELECT a.* INTO p_companias.* FROM companias a
CALL noprmt008()
END MAIN
FUNCTION noprmt008()
#CLEAR SCREEN
OPTIONS
FORM LINE 9,
PROMPT LINE 12,
ERROR LINE 24,
COMMENT LINE 23
#DISPLAY "noprmt008" AT 4,3 ATTRIBUTE(RED)
#DISPLAY "Generacion de nomina" AT 6,30 ATTRIBUTE(BLACK)
#LET p_formulario = formulario CLIPPED,"nofmmt008"
OPEN FORM nofmmt008 FROM "nofmmt008"
DISPLAY FORM nofmmt008
# Seccion de captura de informacion general de la generacion de
# la nomina
LET int_flag = false
INPUT BY NAME datos_nomi.*,opt1,opt2,opt3,regalia,vacaciones
AFTER FIELD num_nomi
IF datos_nomi.num_nomi IS NULL THEN
LET numero_msg = 16
CALL msg(numero_msg)
NEXT FIELD num_nomi
END IF
AFTER FIELD tipo_emp
IF datos_nomi.tipo_emp IS NULL THEN
LET numero_msg = 16
CALL msg(numero_msg)
NEXT FIELD tipo_emp
END IF
# Busqueda del periodo comprendido de la nomina
LET selec =
"SELECT CONVERT(CHAR(10),fecha_del,103) ,CONVERT(CHAR(10),fecha_al,103), h_normal,mes,ano,num_sem,estado_legal ",
" FROM notb00010 ",
" WHERE num_nomi = '",datos_nomi.num_nomi,"' and ",
" tipo_emp = '",datos_nomi.tipo_emp,"' ",
"and (status_t is null)"
PREPARE comando20 FROM selec
EXECUTE comando20 INTO p_fecha_del,p_fecha_al,p_h_normal,p_mes1,p_ano,semanas_mes,xestado_legal
IF status = notfound THEN
LET numero_msg = 199
CALL msg(numero_msg)
NEXT FIELD num_nomi
END IF
DISPLAY BY NAME xestado_legal
LET selec=
"SELECT CONVERT(CHAR(10),MIN(a.fecha_del),103),CONVERT(CHAR(10),MAX(a.fecha_al),103) ",
" FROM notb00010 a ",
" WHERE a.ano ='", p_ano,"' ",
" and a.mes = '",p_mes1,"' ",
" and a.tipo_emp ='", datos_nomi.tipo_emp, "' "
PREPARE comando21 FROM selec
EXECUTE comando21 INTO p1_fecha_del,p1_fecha_al
# Busca el mes inicial del periodo
LET selec =
"SELECT CONVERT(CHAR(10),MIN(a.fecha_Del),103) ",
"FROM notb00010 a ",
"WHERE a.ano = '",p_ano,"' AND ",
" a.tipo_emp = '",datos_nomi.tipo_emp,"' "
PREPARE comando22 FROM selec
EXECUTE comando22 INTO fecha_inicio_p
SELECT MAX(a.monto_excento),MAX(a.porc_15),MAX(a.porc_20),MAX(a.porc_25) ,MAX(a.monto_ars),MAX(a.monto_afp)
INTO excento,hasta_15,hasta_20,hasta_25,monto_ars,monto_afp
FROM notb00023 a
WHERE #a.fecha = "01012001" AND
a.tipo_emp = datos_nomi.tipo_emp
SELECT a.numero_nomina INTO num_periodo
FROM notb00023 a
WHERE #a.fecha = "01012001" AND
a.tipo_emp = datos_nomi.tipo_emp
SELECT COUNT(*) INTO cantidad_empleados FROM adtb00003 a
WHERE a.status_t IS NULL OR a.status_t IN ("I")
LET factor = (100* 24)/cantidad_empleados
{
LET excento = 11535
LET hasta_15 = 17396
LET hasta_20 = 26095
LET hasta_25 = 26096
}
DISPLAY BY NAME p_fecha_del,p_fecha_al ATTRIBUTE (BOLD)
LET ch_num = datos_nomi.num_nomi USING "&&&&"
LET numero = ch_num[3,4]
LET num_van= datos_nomi.num_nomi
LET p_mes = MONTH(p_fecha_al)
IF datos_nomi.tipo_emp = "Q" THEN
LET numero = num_periodo - numero
LET porciento = 0.50
END IF
IF datos_nomi.tipo_emp = "V" THEN
LET numero = num_periodo - numero
LET porciento = 1.00
END IF
IF datos_nomi.tipo_emp = "S" THEN
LET numero = num_periodo - numero
LET porciento = 0.0025
END IF
#------------------------------------------------------------------------------
# Determina si es la ultima nomina del mes
#------------------------------------------------------------------------------
LET ultima_semana_mes = NULL
LET fecha_ult = NULL
LET SELEC =
"SELECT CONVERT(CHAR(10),MAX(a.fecha_al),103) ",
" FROM notb00010 a ",
" WHERE a.tipo_emp = ? AND ",
" a.mes = ? AND ",
" a.ano = ? AND a.num_nomi NOT IN (46,22) AND ",
" (a.status_t IS NULL OR a.status_t ='P')"
PREPARE busca_f1 FROM selec
EXECUTE busca_f1 INTO fecha_ult USING datos_nomi.tipo_emp,p_mes1,p_ano
DISPLAY fecha_ult
LET SELEC =
"SELECT MAX(a.num_nomi) ",
" FROM notb00010 a ",
" WHERE a.tipo_emp = ? AND ",
" a.mes = ? AND ",
" a.ano = ? AND a.num_nomi NOT IN (46,22) AND ",
" a.fecha_al = ? AND ",
" (a.status_t IS NULL OR a.status_t = 'P')"
PREPARE busca_f2 FROM selec
EXECUTE busca_f2 INTO ult_nomi_mes USING datos_nomi.tipo_emp,p_mes1,p_ano,fecha_ult
IF datos_nomi.num_nomi = ult_nomi_mes THEN
LET ultima_semana_mes = "S"
ELSE
LET ultima_semana_mes = "N"
END IF
IF ultima_semana_mes = "S" THEN
SELECT CONVERT(CHAR(10),MIN(fecha_del),103) INTO fecha_ini_mes
FROM notb00010
WHERE tipo_emp = datos_nomi.tipo_emp AND
mes = p_mes1 AND
ano = p_ano AND num_nomi not in (9924,9951,46,22,50) and
(status_t IS NULL OR status_t ='P')
END IF
LET ss.porc_emp = 0.00
LET ss.salario_sem_hasta = 0.00
LET ss.salario_men_hasta = 0.00
LET ss.porc_pat = 0.00
LET salario_semanal = 0.00
AFTER INPUT
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
LET int_flag = false
RETURN
END IF
EXIT INPUT
END INPUT
# Preparacion para busqueda por rango de departamento y rango de ficha del
# empleado
CONSTRUCT BY NAME criterio ON a.departamento,a.num_emp
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
LET int_flag = false
RETURN
END IF
#CLEAR SCREEN
# PROMPT
#"ESTA SEGURO DE GENERAR DE NUEVO LA NOMINA (S/N) " FOR CHAR opt1
LET opt1= upshift(opt1)
IF opt1 != "S" THEN
RETURN
END IF
#PROMPT
#"ESTA NOMINA ES DE REGALIA (S/N) " FOR CHAR regalia
LET regalia = upshift(regalia)
# PROMPT
#"ESTA NOMINA ES DE VACACIONES COLECTIVAS (S/N) " FOR CHAR vacaciones
LET vacaciones = upshift(vacaciones)
#PROMPT
#"ESTA NOMINA ES DE BONIFICACION (S/N) " FOR CHAR opt2
LET opt2= upshift(opt2)
DISPLAY "Borrando Nomina... Espere Por Favor" AT 24,1
ATTRIBUTE (BOLD)
DELETE FROM notb00008 WHERE num_nomi = datos_nomi.num_nomi and
tipo_emp = datos_nomi.tipo_emp AND
clase_mov not in ("F")
# CALL second_scr()
#LET p_formulario = formulario CLIPPED, "nofmmt108"
OPEN FORM nofmmt108 FROM "nofmmt108"
DISPLAY FORM nofmmt108
IF regalia = "S" THEN
INPUT BY NAME fecha_ext1,fecha_ext2
AFTER FIELD fecha_ext2
IF fecha_ext2 < fecha_ext1 THEN
LET numero_msg = 51
CALL msg(numero_msg)
NEXT FIELD fecha_ext1
END IF
EXIT INPUT
END INPUT
END IF
DECLARE tinti CURSOR FOR
SELECT cod_mov,descrip_mov FROM notb00002 WHERE status_t IS NULL
ORDER BY cod_mov
#3522
LET idx1 = 1
FOREACH tinti INTO desp_mov[idx1].cod_mov,desp_mov[idx1].descrip_mov
LET desp_mov[idx1].todos = "Y"
IF regalia = "S" or opt2 = "S" OR opt3 = 'S' THEN
LET desp_mov[idx1].clasifica = "N"
ELSE
LET desp_mov[idx1].clasifica = "S"
END IF
LET scr_l = scr_line()
LET idx1 = idx1 + 1
END FOREACH
CALL set_count(idx1 -1)
INPUT ARRAY desp_mov WITHOUT DEFAULTS FROM s_mov.*
AFTER INPUT
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
LET int_flag = false
RETURN
END IF
EXIT INPUT
END INPUT
# CLEAR SCREEN
#DISPLAY "noprmt008" AT 4,2
#DISPLAY "Generacion de nomina" AT 6,32
# Preparacion de la busqueda de los empleados dependiendo del criterio de
# seleccion
OPEN WINDOW w1 WITH FORM "nofmmt208"
IF datos_nomi.tipo_emp = "S" THEN
LET empleados = "SELECT num_emp,departamento,nivel_emp,cod_puesto,nom1_emp,",
"apell1_emp,sueldo_ac,paga_seg,fech_efec,moneda ",
"FROM adtb00003 ",
" WHERE ",
" nomina = ? ",
" AND CONVERT(DATE,a.fech_efec,101) <= ? ",
" AND (status_t is null or ",
" status_t = 'I') AND ",criterio CLIPPED,
" ORDER BY num_emp"
ELSE
IF opt3 <> 'S' THEN
LET empleados = "SELECT a.num_emp,a.departamento,a.nivel_emp,a.cod_puesto,a.nom1_emp,",
"a.apell1_emp,a.sueldo_ac,a.paga_seg, ",
"CONVERT(CHAR(10),a.fech_efec,103),moneda ",
"FROM adtb00003 a ",
" WHERE ",
" a.nomina = ? and (",criterio clipped, #" and a.num_emp =162 ",
# ") AND CONVERT (CHAR(10),a.fech_efec,103) <= ? ",
") AND a.fech_efec <= ? ",
" AND (a.status_t is null or ",
" a.status_t = 'I') AND ",
" a.num_emp not in (select x.num_Emp from adtb00032 x where x.num_nomi_no = ? and x.status_t is null) ",
" AND a.estado_legal = ? AND ",
criterio CLIPPED,
" ORDER BY a.num_emp"
ELSE
LET empleados = "SELECT a.num_emp,a.departamento,a.nivel_emp,a.cod_puesto,a.nom1_emp,",
"a.apell1_emp,a.sueldo_ac,a.paga_seg, ",
"CONVERT(CHAR(10),a.fech_efec,103),moneda ",
"FROM adtb00003 a,tmpbono2023inactivos b ",
" WHERE ",
" a.nomina = ? and (",criterio clipped,
") AND a.num_emp = b.num_emp ",
" ORDER BY a.num_emp"
END IF
END IF
#call fgl_winmessage("w",empleados,"stop")
DISPLAY "BUSCANDO EMPLEADOS..." to estado
PREPARE comando FROM empleados
DECLARE busca SCROLL CURSOR FOR comando
OPEN busca USING datos_nomi.tipo_emp ,p_fecha_al,datos_nomi.num_nomi,xestado_legal
LET control_empleado = 0
LET progreso = 5
DISPLAY progreso TO progreso
CALL ui.Interface.refresh()
DISPLAY "LOOP EMPLEADOS..." to estado
WHILE STATUS != NOTFOUND
FETCH 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
LET meses = (p_fecha_al - datos_emp.fecha)
LET meses = meses / 30
CALL movi_emp.clear()
LET valor_renta = 0
IF regalia != "S" THEN
# Busca los acumulados de ingresos de los empleados
SELECT sum(a.valor) INTO acumulado from notb00008 a WHERE
a.status_t is null and
(a.clase_mov in ("I","E") and
a.num_emp = datos_emp.num_emp
AND a.fecha BETWEEN p1_fecha_del AND p1_fecha_al) #fecha_inicio_p
END IF
IF acumulado is null THEN
LET acumulado = 0
END IF
################
# BUSCA LA TASA FINANCIERA DEL MES
################
SELECT AVG(a.tasa) INTO tasa FROM cgtb00084 a WHERE a.mes = MONTH(TODAY) AND a.ano = YEAR(TODAY) AND
a.ventas = datos_emp.moneda
IF tasa IS NULL THEN
LET tasa = 1
END IF
LET datos_emp.sueldo = datos_emp.sueldo * tasa
LET sueldo_renta = 0
LET movi_emp[1].cod_mov = 1
LET movi_emp[1].clase_mov = "I"
LET movi_emp[1].departamento = datos_emp.departamento
# Calculo del sueldo normal semanal
IF datos_nomi.tipo_emp = "S" THEN
LET salario_h = datos_emp.sueldo / 190.60
LET p_sueldo = datos_emp.sueldo
LET datos_emp.sueldo = (datos_emp.sueldo / 190.60) *
p_h_normal
# Mdificado el 11/11/2002 LET sueldo_boni = datos_emp.sueldo
END IF
# Calculo del sueldo normal quincenal
IF datos_nomi.tipo_emp = "Q" OR datos_nomi.tipo_emp = "J" THEN
# Calculo para los empleados quincenales, segun reunion con el gerente general
# gerente recursos humanos y gerente informatica, se acordo que los empleados
# quincenales cobraran el 35% de su sueldo la primera quincena y el restante
# la quincena siguiente.
# Fecha modificacion 3/4/2002. SEGURIDAD SOCIAL
# Modificado por el Ing. Juan Francisco Soto
LET sueldo_ganado = 0
LET p_sueldo = datos_emp.sueldo
SELECT SUM(a.valor) INTO sueldo_ganado
FROM notb00008 a
WHERE
(a.cod_mov = 1 AND
a.num_emp = datos_emp.num_emp AND
a.fecha between p1_fecha_del AND
p1_fecha_al )
IF sueldo_ganado = 0 OR sueldo_ganado IS NULL THEN
LET datos_emp.sueldo = datos_emp.sueldo *.50
ELSE
#DISPLAY "EMPLEADO2 ",datos_emp.num_emp,' ',datos_Emp.sueldo, ' ',sueldo_ganado
LET datos_emp.sueldo = datos_emp.sueldo - sueldo_ganado
#DISPLAY "EMPLEADO3 ",datos_emp.num_emp,' ',datos_Emp.sueldo, ' ',sueldo_ganado
IF datos_emp.sueldo > p_sueldo / 12 THEN
LET datos_emp.sueldo = p_sueldo / 2
END IF
END IF
LET salario_h = (datos_emp.sueldo / 23.83)/8
LET sueldo_boni = datos_emp.sueldo
END IF
IF datos_nomi.tipo_emp = "V" THEN
LET sueldo_boni = datos_emp.sueldo
END IF
#-----------------------------------------------------------------------------
LET movi_emp[1].cantidad = p_h_normal
LET movi_emp[1].valor = datos_emp.sueldo
LET sueldo_renta = sueldo_renta + movi_emp[1].valor
FOR i = 1 to idx1
IF movi_emp[i].cod_mov = desp_mov[i].cod_mov THEN
IF desp_mov[i].clasifica = "N"
THEN
LET movi_emp[1].valor = 0
LET movi_emp[1].cantidad = 0
LET sueldo_renta = 0
END IF
END IF
END FOR
# Busqueda de la tabla de novedades cuando la nomina no es de bonificacion
IF opt2 != "S" THEN
DECLARE busca1 CURSOR FOR
SELECT a.cod_mov,b.clase_mov,a.cantidad,a.valor,b.cantidad_emp,cantidad_cia,
"fijos",c.departamento
FROM notb00003 a,notb00002 b,adtb00003 c
WHERE
a.num_emp = datos_emp.num_emp AND
a.num_emp = c.num_emp AND
a.status_t is null and
a.cod_mov = b.cod_mov and
CAST(a.cod_mov as char(3)) +
CAST(a.num_emp as char(4))
not in
(SELECT CAST(a.cod_mov as char(3)) +
CAST(a.num_emp as char(4)) FROM notb00007 a
WHERE a.num_nomi = datos_nomi.num_nomi and
a.num_emp = datos_emp.num_emp and
a.tipo_emp = datos_nomi.tipo_emp)
UNION
SELECT a.cod_mov,b.clase_mov,a.cantidad,a.valor,b.cantidad_emp,cantidad_cia,
"novedades",a.departamento_afecta
FROM notb00007 a,notb00002 b
WHERE a.num_nomi = datos_nomi.num_nomi and
a.num_emp = datos_emp.num_emp and
a.tipo_emp = datos_nomi.tipo_emp and
# a.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,c.departamento
FROM notb00008 b,notb00002 a,adtb00003 c
WHERE b.num_emp = datos_emp.num_emp AND
b.num_emp = c.num_emp and
b.tipo_emp = datos_nomi.tipo_emp AND
# b.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,C.departamento
#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",c.departamento
FROM notb00003 a,notb00002 b,adtb00003 c
WHERE
(a.num_emp = datos_emp.num_emp AND
a.num_emp = c.num_emp AND
a.cod_mov = b.cod_mov) and a.status_t is null and
CAST(a.cod_mov as char(3)) +
CAST(a.num_emp as char(4))
not in
(SELECT CAST(a.cod_mov as char(3)) +
CAST(a.num_emp as char(4)) FROM notb00007 a
WHERE a.num_nomi = datos_nomi.num_nomi and
a.num_emp = datos_emp.num_emp and
a.tipo_emp = datos_nomi.tipo_emp)
UNION
SELECT a.cod_mov,b.clase_mov,a.cantidad,a.valor,b.cantidad_emp,cantidad_cia,
"novedades",a.departamento_afecta
FROM notb00007 a,notb00002 b
WHERE (a.num_nomi = datos_nomi.num_nomi and
a.num_emp = datos_emp.num_emp and
a.tipo_emp = datos_nomi.tipo_emp and
# a.departamento = datos_emp.departamento and
a.cod_mov = b.cod_mov) and a.status_t is null
# ORDER BY a.cod_mov
END IF
LET modifica = "N"
LET encontre = "N"
LET bonifica = "N"
LET idx = 2
# Para buscar codigos de las nominas normales
IF opt2 = "N" THEN
LET descuento_tss = 0
FOREACH busca1 INTO datos_mov.*
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
LET int_flag = false
RETURN
END IF
# Chequea los movimientos que son balanceados
# Tiene que el movimiento no sea el movimiento 11 porque esta en la tabla
# notb00014 que es donde estan los codigos que se balancean y se puso este
# codigo de movimiento en esta tabla para el proceso de fin de ano de nomina
DISPLAY "inicia ",datos_mov.cod_mov," ", datos_emp.num_emp
IF datos_mov.cod_mov != 11 THEN
SELECT a.* FROM notb00014 a
WHERE a.cod_mov = datos_mov.cod_mov
IF status != notfound THEN
SELECT SUM(a.valor) INTO p_valor FROM notb00008 a
WHERE (a.num_emp = datos_emp.num_emp and
a.cod_mov = datos_mov.cod_mov) AND
a.status_t IS null
IF p_valor = 0 THEN
CONTINUE FOREACH
ELSE
IF p_valor < datos_mov.valor THEN
LET datos_mov.valor = p_valor
END IF
END IF
END IF
END IF
# Chequea que el codigo tenga la opcion de que si lo quieren generar
FOR i = 1 to idx1
IF datos_mov.cod_mov = desp_mov[i].cod_mov THEN
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 8 es para calcular el sueldo por hora
#IF datos_mov.cantidad > 0 THEN
# LET movi_emp[1].cantidad = datos_mov.cantidad
# LET movi_emp[1].valor = (p_sueldo / 8) *
# datos_mov.cantidad
# END IF
IF datos_mov.cantidad = 0 and
datos_mov.cod_mov = 1 THEN
LET movi_emp[1].valor = 0
LET movi_emp[1].cantidad = 0
END IF
IF datos_mov.valor > 0 THEN
LET movi_emp[1].valor = datos_mov.valor
END IF
LET sueldo_renta = sueldo_renta + movi_emp[1].valor
END IF
IF datos_mov.cod_mov > 1 THEN
LET datos_mov.valor = datos_mov.valor * tasa
IF datos_mov.cod_mov = 33 THEN
LET bonifica = "S"
LET sueldo_renta = movi_emp[1].valor
LET sueldo_boni = datos_mov.valor # Modificado el 11/11/2002
END IF
# Cuando el valor o la cantiad tienen algun valor se quedara este valor
# en la variable de asignacion
LET movi_emp[idx].cantidad = datos_mov.cantidad
LET movi_emp[idx].valor = datos_mov.valor
# Cuando es comida, desayuno, cena
IF datos_mov.cantidad_emp > 0 and datos_mov.clase_mov = "D" THEN
LET movi_emp[idx].valor = (datos_mov.cantidad_emp +
datos_mov.cantidad_cia) *
datos_mov.cantidad
LET movi_emp[idx].cantidad = datos_mov.cantidad
END IF
# Calculo descuento adicional TSS
IF movi_emp[idx].cod_mov = 29 THEN
LET descuento_tss = movi_emp[idx].valor
END IF
# Calculo incentivo asistencia
IF movi_emp[idx].cod_mov = 9 THEN
IF datos_mov.cantidad > 0 THEN
LET movi_emp[idx].valor = sueldo_h * movi_emp[idx].cantidad
ELSE
LET movi_emp[idx].valor = datos_mov.valor
END IF
END IF
# Calculo movimientos 6 y 4
IF movi_emp[idx].cod_mov = 6 OR movi_emp[idx].cod_mov = 4 THEN
IF movi_emp[idx].cantidad > 0 THEN
LET movi_emp[idx].valor = movi_emp[idx].cantidad * movi_emp[idx].valor
END IF
END IF
# Calculo de las horas extras
{
IF movi_emp[idx].clase_mov = "E" THEN
IF datos_mov.cantidad > 0 THEN
SELECT cantidad_cia INTO porc_extras FROM notb00002
WHERE cod_mov = movi_emp[idx].cod_mov
LET movi_emp[idx].valor = salario_h * ((porc_extras / 100) + 1)
LET movi_emp[idx].valor = movi_emp[idx].valor * datos_mov.cantidad
ELSE
LET movi_emp[idx].valor = datos_mov.valor
END IF
END IF}
LET movi_emp[idx].departamento = datos_mov.departamento
LET idx = idx + 1
END IF
END FOREACH
LET control_empleado = control_empleado + 1
CALL desplega()
DISPLAY "DESPLEGANDO NOVEDADES EN SCREEN.." TO estado
IF control_empleado >= factor THEN
LET control_empleado =0
LET progreso = progreso + 1
IF progreso > 95 THEN
LET progreso = 95
END IF
DISPLAY progreso TO progreso
CALL ui.Interface.refresh()
END IF
END IF
LET hay1 = "N"
FOR i = 1 TO idx
IF movi_emp[i].cod_mov = 32 THEN
LET hay1 = "S"
LET valor_regal = movi_emp[i].valor
END IF
END FOR
IF hay1 = "N" THEN
# Nomina de Regalia Pascual
IF regalia = "S" THEN
LET idx = idx + 1
LET movi_emp[idx].cod_mov = 32
IF year(p_fecha_al) <> year(datos_emp.fecha) THEN
if p10 is null then
let p10 = "N"
end if
SELECT SUM(a.valor)/12 INTO p_sueldo
FROM notb00008 a
WHERE a.cod_mov in (1,40,5,24,16,34,51) AND
a.num_emp = datos_emp.num_emp AND
a.fecha BETWEEN fecha_ext1 and fecha_ext2
LET movi_emp[idx].valor = p_sueldo
END IF
IF year(p_fecha_al) = year(datos_emp.fecha) THEN
SELECT SUM(a.valor)/12 INTO p_sueldo
FROM notb00008 a
WHERE (a.cod_mov in (1,40,5,24,16,34,51) AND
a.num_emp = datos_emp.num_emp AND
a.fecha BETWEEN fecha_ext1 and fecha_ext2)
LET p_mes = month(datos_emp.fecha)
SELECT dias_prod INTO dias FROM mestable
WHERE mes = p_mes
let porc_dias = 0
# LET porc_dias = (dias - day(datos_emp.fecha)) / dias
LET p_mes = 12 - month(datos_emp.fecha)
LET porc_dias = porc_dias + p_mes
LET movi_emp[idx].valor = p_sueldo #* porc_dias
END IF
LET movi_emp[idx].cantidad = porc_dias
LET valor_regal = movi_emp[idx].valor
LET movi_emp[idx].clase_mov = "I"
END IF
END IF
# Para Cuando la nomina es de bonificacion
IF opt2 = "S" THEN
FOREACH busca2 INTO datos_mov.*
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
LET int_flag = false
RETURN
END IF
# Chequea los movimientos que son balanceados
# Tiene que el movimiento no sea el movimiento 11 porque esta en la tabla
# notb00014 que es donde estan los codigos que se balancean y se puso este
# codigo de movimiento en esta tabla para el proceso de fin de ano de nomina
IF datos_mov.cod_mov != 11 THEN
SELECT * FROM notb00014
WHERE cod_mov = datos_mov.cod_mov
IF status != notfound THEN
SELECT SUM(valor) INTO p_valor FROM notb00008
WHERE (num_emp = datos_emp.num_emp and
cod_mov = datos_mov.cod_mov) AND status_t IS null
IF status = notfound THEN
LET status = 0
END IF
IF p_valor = 0 THEN
CONTINUE FOREACH
END IF
END IF
END IF
# Chequea que el codigo tenga la opcion de que si lo quieren generar
FOR i = 1 to idx1
IF datos_mov.cod_mov = desp_mov[i].cod_mov THEN
IF desp_mov[i].clasifica = "N" or desp_mov[i].clasifica is null
THEN
CONTINUE FOREACH
END IF
IF desp_mov[i].todos = "N" AND datos_mov.identifica = "fijos" THEN
CONTINUE FOREACH
END IF
END IF
END FOR
IF datos_mov.cod_mov != 1 THEN
LET movi_emp[idx].clase_mov = datos_mov.clase_mov
LET movi_emp[idx].cod_mov = datos_mov.cod_mov
END IF
# Calculo de las horas trabajadas en la jornada
# Esto solo lo calcula cuando el usuario poporciona la informacion de las
# horas trabajadas durante el periodo como una novedad
IF datos_mov.cod_mov = 1 or
datos_mov.cod_mov = 9 THEN
LET modifica = "S"
LET sueldo_renta = 0
LET movi_emp[1].cod_mov = datos_mov.cod_mov
LET movi_emp[1].clase_mov = datos_mov.clase_mov
LET movi_emp[1].departamento = datos_mov.departamento
# El 190.60 es para calcular el sueldo por hora
IF datos_mov.cantidad > 0 THEN
LET movi_emp[1].cantidad = datos_mov.cantidad
LET movi_emp[1].valor = (p_sueldo / 190.60) *
datos_mov.cantidad
END IF
IF datos_mov.cantidad = 0 and
datos_mov.cod_mov = 1 THEN
LET movi_emp[1].valor = 0
LET movi_emp[1].cantidad = 0
END IF
LET datos_mov.valor = datos_mov.valor * tasa
IF datos_mov.valor > 0 THEN
LET movi_emp[1].valor = datos_mov.valor
END IF
LET sueldo_renta = sueldo_renta + movi_emp[1].valor
END IF
IF datos_mov.cod_mov > 1 THEN
LET datos_mov.valor = datos_mov.valor * tasa
IF datos_mov.cod_mov = 9 THEN
CONTINUE FOREACH
END IF
IF datos_mov.cod_mov = 33 THEN
LET bonifica = "S"
LET sueldo_boni = datos_mov.valor # Se Agrego el 11/11/2002
END IF
# Cuando el valor o la cantiad tienen algun valor se quedara este valor
# en la variable de asignacion
LET movi_emp[idx].cantidad = datos_mov.cantidad
LET movi_emp[idx].valor = datos_mov.valor
# Cuando es comida, desayuno, cena
IF datos_mov.cantidad_emp > 0 and datos_mov.clase_mov = "D" THEN
LET movi_emp[idx].valor = (datos_mov.cantidad_emp +
datos_mov.cantidad_cia) *
datos_mov.cantidad
LET movi_emp[idx].cantidad = datos_mov.cantidad
END IF
# Calculo incentivo asistencia
IF movi_emp[idx].cod_mov = 9 THEN
LET movi_emp[idx].valor = sueldo_h * movi_emp[idx].cantidad
END IF
# Calculo movimientos 6 y 4
IF movi_emp[idx].cod_mov = 6 OR movi_emp[idx].cod_mov = 4 THEN
IF movi_emp[idx].cantidad > 0 THEN
LET movi_emp[idx].valor = movi_emp[idx].cantidad * movi_emp[idx].valor
END IF
END IF
# Calculo de las horas extras
IF movi_emp[idx].clase_mov = "E" THEN
IF datos_mov.cantidad > 0 THEN
SELECT cantidad_cia INTO porc_extras FROM notb00002
WHERE cod_mov = movi_emp[idx].cod_mov
LET movi_emp[idx].valor = salario_h * ((porc_extras / 100) + 1)
LET movi_emp[idx].valor = movi_emp[idx].valor * datos_mov.cantidad
ELSE
LET movi_emp[idx].valor = datos_mov.valor
END IF
END IF
LET movi_emp[idx].departamento = datos_mov.departamento
LET idx = idx + 1
END IF
END FOREACH
END IF
# Calculo del infotep
FOR i = 1 TO idx
IF movi_emp[i].cod_mov = 33 THEN
LET idx = idx + 1
LET movi_emp[idx].departamento = datos_emp.departamento
LET movi_emp[idx].cod_mov = 42
LET movi_emp[idx].clase_mov = "D"
LET movi_emp[idx].valor = movi_emp[i].valor * .005
LET movi_emp[idx].cantidad = 0
LET val_bonifica = movi_emp[i].valor
EXIT FOR
END IF
END FOR
IF regalia != "S" THEN
IF meses < 3 THEN
LET idx = idx + 1
LET movi_emp[idx].clase_mov = "I"
LET movi_emp[idx].cod_mov = 4
LET movi_emp[idx].valor = 0
END IF
END IF
LABEL salta1:
# Busqueda de las novedades globales
DECLARE busca20 CURSOR FOR
SELECT cod_mov,cantidad_emp,clase_mov FROM notb00002
WHERE tipo_mov = "G" and status_t is null
FOREACH busca20 INTO globales.cod_mov,globales.cantidad_emp ,
globales.clase_mov
FOR i = 1 to idx1
IF globales.cod_mov = desp_mov[i].cod_mov THEN
IF desp_mov[i].clasifica = "N" or desp_mov[i].clasifica is null
THEN
CONTINUE FOREACH
END IF
IF desp_mov[i].todos = "N" AND datos_mov.identifica = "fijos" THEN
CONTINUE FOREACH
END IF
END IF
END FOR
IF globales.clase_mov = "S" THEN
IF datos_emp.paga_seg != "S" THEN
CONTINUE FOREACH
END IF
END IF
FOR i = 1 to idx
IF globales.cod_mov = movi_emp[i].cod_mov THEN
LET movi_emp[i].clase_mov = globales.clase_mov
CONTINUE FOREACH
END IF
END FOR
# Este es el movimiento del descuento de casa club cuando es quincenal
# devide la cantidad que paga el empleado entre dos.
IF globales.cod_mov = 20 THEN
IF datos_nomi.tipo_emp = "Q" THEN
LET globales.cantidad_emp = globales.cantidad_emp / 2
END IF
END IF
LET idx = idx + 1
LET movi_emp[idx].departamento = datos_emp.departamento
LET movi_emp[idx].cod_mov = globales.cod_mov
LET movi_emp[idx].valor = globales.cantidad_emp
IF vacaciones = "S" THEN
IF movi_emp[idx].cod_mov != 36 THEN
LET movi_emp[idx].valor = movi_emp[idx].valor * semanas
END IF
END IF
LET movi_emp[idx].clase_mov = globales.clase_mov
END FOREACH
LET monto_descuento_fase = 0
# Calculo del Incentivo comida, desayuno, cena
LET p_valor = 0
FOR p = 1 TO idx
IF movi_emp[p].cod_mov != 0 and movi_emp[p].cod_mov is not null THEN
IF movi_emp[p].cod_mov = 16 or
movi_emp[p].cod_mov = 17 or
movi_emp[p].cod_mov = 18 THEN
SELECT cantidad_cia INTO p_cantidad FROM notb00002
WHERE cod_mov = movi_emp[p].cod_mov
LET p_valor = p_valor + (movi_emp[p].cantidad * p_cantidad)
END IF
END IF
END FOR
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
#COLOQUE ESTE COMENTARIO PORQUE NO ENTIENDO EL HECHO DE NO CONTINUAR SI EL CODIGO ES 5
# FOR i = 1 to idx
DISPLAY "identifica ",movi_emp[i].cod_mov," ",movi_emp[i].valor
# IF movi_emp[i].cod_mov = 5 THEN
# CONTINUE WHILE
# END IF
# END FOR
#LO COLOQUE EN COMENTARIO 11/02/2022
# 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
LET movi_emp[1].departamento = datos_emp.departamento
CALL vacaciones_colect()
END IF
LET otros_ing_tss = 0
SELECT sum(a.valor) INTO otros_ing_tss from notb00008 a,notb00002 b
WHERE
a.cod_mov =b.cod_mov AND
b.afecta_tss = "SI" AND
a.num_emp = datos_emp.num_emp
AND a.fecha BETWEEN p1_fecha_del AND p1_fecha_al and
a.status_t is null #fecha_inicio_p
LET afp_pago_emp = 0
SELECT sum(valor) INTO afp_pago_emp from notb00008 WHERE
(cod_mov in (49) AND
num_emp = datos_emp.num_emp
AND fecha BETWEEN p1_fecha_del AND p1_fecha_al) and
status_t is null #fecha_inicio_p
LET afp_pago_cia = 0
SELECT sum(valor) INTO afp_pago_cia from notb00008 WHERE
(cod_mov in (50) AND
num_emp = datos_emp.num_emp
AND fecha BETWEEN p1_fecha_del AND p1_fecha_al) and
status_t is null #fecha_inicio_p
# DESCUENTO POR FAMILIAR EXTRA
LET descuento_tss1 = 0
SELECT sum(valor*-1) INTO descuento_tss1 from notb00008 WHERE
(cod_mov in (29) AND
num_emp = datos_emp.num_emp
AND fecha BETWEEN p1_fecha_del AND p1_fecha_al) and
status_t is null #fecha_inicio_p#
# DESCUENTO ESPECIAL FASE
SELECT ISNULL(sum(valor*-1),0) INTO monto_descuento_fase from notb00008 WHERE
(cod_mov in (55) AND
num_emp = datos_emp.num_emp
AND fecha BETWEEN p1_fecha_del AND p1_fecha_al) and
status_t is null
If descuento_tss1 IS NULL THEN
LET descuento_tss1 = 0
END IF
LET descuento_tss = descuento_tss + descuento_tss1
IF afp_pago_emp IS NULL THEN
LET afp_pago_emp = 0
END IF
IF afp_pago_cia IS NULL THEN
LET afp_pago_cia = 0
END IF
IF otros_ing_tss is null THEN
LET otros_ing_tss = 0
END IF
FOR i = 1 TO idx
IF vacaciones = "S" THEN
IF movi_emp[i].clase_mov = "D" and
movi_emp[i].cod_mov != 23 and
movi_emp[i].cod_mov != 70 THEN
LET movi_emp[1].departamento = datos_emp.departamento
LET movi_emp[i].valor = movi_emp[i].valor * semanas
END IF
END IF
# IF movi_emp[i].clase_mov = "I" or
# movi_emp[i].clase_mov = "E" THEN
IF movi_emp[i].cod_mov != 1 THEN
IF vacaciones = "S" THEN
IF movi_emp[i].cod_mov != 31 THEN
IF movi_emp[i].cod_mov != 36 THEN
LET movi_emp[i].valor = movi_emp[i].valor * semanas
END IF
END IF
END IF
SELECT a.afecta_tss,a.clase_mov INTO xafecta_tss,globales.clase_mov
FROM notb00002 a WHERE a.cod_mov = movi_emp[i].cod_mov
IF xafecta_tss = "SI" THEN
IF globales.clase_mov = 'I' THEN
LET otros_ing_tss = movi_emp[i].valor + otros_ing_tss
ELSE
LET otros_ing_tss = otros_ing_tss - movi_emp[i].valor
END IF
END IF
IF movi_emp[i].valor IS NULL THEN
LET movi_emp[i].valor =0
END IF
IF otros_ing IS NULL THEN
LET otros_ing = 0
END IF
IF globales.clase_mov = 'I' OR globales.clase_mov='E' THEN
#DISPLAY "valor renta mes ",valor_renta," ",sueldo_renta," ",acumulado," ",otros_ing," ",movi_emp[i].valor
LET otros_ing = movi_emp[i].valor + otros_ing
END IF
END IF
IF movi_emp[i].cod_mov = 55 THEN
LET monto_descuento_fase = movi_emp[i].valor + monto_descuento_fase
END IF
#END IF
END FOR
IF acumulado is null THEN
LET acumulado = 0
END IF
IF sueldo_ganado IS NULL THEN
LET sueldo_ganado = 0
END IF
IF otros_ing_tss IS NULL THEN
LET otros_ing_tss = 0
END IF
IF datos_nomi.tipo_emp = "Q" OR datos_nomi.tipo_emp = "J" THEN
# LET salario_tss = (sueldo_renta * 2) + otros_ing_tss
LET salario_tss = sueldo_ganado + sueldo_renta + otros_ing_tss
IF ultima_semana_mes = "S" THEN
LET valor_renta = sueldo_renta + acumulado + otros_ing
ELSE
LET valor_renta = valor_renta * 2 + acumulado + otros_ing
END IF
IF ultima_semana_mes = "N" THEN
LET valor_renta = sueldo_renta + acumulado + otros_ing
ELSE
LET valor_renta = sueldo_renta + acumulado + otros_ing
END IF
ELSE
IF ultima_semana_mes = "S" THEN
LET valor_renta = sueldo_renta + acumulado
END IF
END IF
#-----------------------------------------------------------------------
LET calcula = "N"
{ 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
# POR ORDEN DEL ING. PAULINO EN EL 2DO SELECT SE QUITO EL CODIGO DEL INCENTIVO
# NO.9 PARA SER GRAVADO POR LA RENTA.
SELECT UNIQUE num_nomi INTO numero_nomina
FROM notb00008
WHERE cod_mov = 32 and
tipo_emp = datos_nomi.tipo_emp and
num_emp = datos_emp.num_emp AND
fecha >= fecha_inicio_p
LET valor_regal = 0
SELECT sum(valor) INTO valor_regal
FROM notb00008
WHERE (cod_mov in (32) and
num_emp = datos_emp.num_emp
AND fecha >= fecha_inicio_p) AND status_t IS null
IF valor_regal is null THEN
LET valor_regal = 0
END IF
{
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
DISPLAY "VALOR RENTA ANTES ",valor_renta
# 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
DISPLAY "valor renta despues ",valor_renta," valor tss ",valor_tss_emp
ELSE
LET valor_tss_emp = (monto_afp) * porc_emp
LET valor_tss_cia = (monto_afp) * porc_cia
LET valor_renta = valor_renta - valor_tss_emp
END IF
#EL TOPE SALARIAL MENSUAL PARA LA ARS ES 98550
IF salario_tss < monto_ars THEN
LET valor_ars_emp = salario_tss * porc_emp_ars # PAGOS ARS EMPLEADOS
LET valor_ars_cia = salario_tss * porc_cia_ars # PAGOS ARS EMPRESA
ELSE
LET valor_ars_emp = (monto_ars) * porc_emp_ars # PAGOS ARS EMPLEADOS
LET valor_ars_cia = (monto_ars) * porc_cia_ars # PAGOS ARS EMPRESA
END IF
LET valor_tss_emp = valor_tss_emp - (afp_pago_emp * -1)
LET valor_tss_cia = valor_tss_cia - (afp_pago_cia * -1)
LET valor_renta = valor_renta - valor_ars_emp
LET idx = idx + 1
LET movi_emp[idx].departamento = datos_emp.departamento
LET movi_emp[idx].clase_mov = "D"
LET movi_emp[idx].cod_mov = 49
LET movi_emp[idx].valor = valor_tss_emp
LET idx = idx + 1
LET movi_emp[idx].clase_mov = "T"
LET movi_emp[idx].cod_mov = 50
LET movi_emp[idx].valor = valor_tss_cia
IF calcula_ars = "S" THEN
LET idx = idx + 1
LET movi_emp[idx].clase_mov = "D"
LET movi_emp[idx].cod_mov = 53
LET movi_emp[idx].valor = valor_ars_emp - valor_ars_emp_pagado
LET idx = idx + 1
LET movi_emp[idx].clase_mov = "T"
LET movi_emp[idx].cod_mov = 54
LET movi_emp[idx].valor = valor_ars_cia
END IF
END IF
IF monto_descuento_fase IS NULL THEN
LET monto_descuento_fase = 0
END IF
DISPLAY "monto fase ",monto_descuento_fase," VALOR RENTA ",valor_renta," VALOR TSS ",valor_tss_emp," valor ars ",valor_ars_emp
LET valor_renta = valor_renta - monto_descuento_fase
DISPLAY "valor renta final ",valor_Renta
#--------------------------------------------------------------------------------
LET valor_renta = valor_renta - valor_regal - descuento_tss
# ESTOY FORZANDO EL ACUMULADO PARA EL IMPUESTO CUANDO LA NOMINA SEA DE BONIFICACION
# LET valor_renta = 0
# IF opt2 = "S" THEN
# SELECT SUM(a.valor) INTO valor_renta
# FROM notb00008 a
# WHERE a.num_emp = datos_emp.num_emp AND a.clase_mov IN ("E","I") AND
# a.fecha BETWEEN p1_fecha_del AND p1_fecha_al
# LET valor_renta = valor_renta + val_bonifica
# END IF
# ------------------------------------------------------------------------
# INICIO CALCULO IMPUESTO SOBRE LA RENTA
# ------------------------------------------------------------------------
IF opt2 = "S" THEN
IF acumulado IS NULL THEN
LET acumulado = 0
END IF
LET valor_renta = sueldo_boni + acumulado # SE COLOCO CUANDO ES DE
# BONIFICACION NO TRAE EL VALOR_RENTA
# SUMATORIA DEL AFP Y ARS
DISPLAY "sueldo_boni ",sueldo_boni," acumulado ",acumulado
LET valor_seguridad1 = 0
SELECT ISNULL(SUM(valor),0) INTO valor_seguridad1 FROM notb00008
WHERE num_emp = datos_emp.num_emp and
cod_mov in(49,53,29) and num_nomi != numero_nomina
AND fecha BETWEEN p1_fecha_del AND p1_fecha_al
LET valor_seguridad1 = valor_seguridad1 * -1
# CALL fgl_winmessage("seguridad",valor_seguridad1,"stop")
LET valor_renta = valor_renta - valor_Seguridad1
END IF
#CALL fgl_winmessage("renta",valor_renta,"stop")
#CALL fgl_winmessage("excento",excento,"stop")
#SUMATORIA ESPECIAL POR EL TEMA DE FASE
DISPLAY "valor renta: ",valor_renta,"excento ",excento
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
DISPLAY "renta pagada ",renta_pagada," 15 ",hasta_15
# Renta al 15 %
IF valor_renta > excento and valor_renta <= hasta_15 THEN
LET valor_renta = valor_renta - excento
LET renta = valor_renta * .15
LET renta_15 = renta
ELSE
LET renta = ((hasta_15-excento) * .15)
LET renta_15 = renta
END IF
DISPLAY " 15 ",renta_15
#CALL fgl_winmessage("renta15",renta_15,"stop")
# Renta al 20 %
IF valor_renta > hasta_15 AND valor_renta <= hasta_20 THEN
LET valor_renta = valor_renta - hasta_15
LET renta = valor_renta * .20
LET renta_20 = renta
ELSE
IF valor_renta > hasta_20 THEN
LET renta = ((hasta_20-hasta_15) * .20)
LET renta_20 = renta
END IF
END IF
DISPLAY " RENTA 20 ",renta_20
# Renta al 25 %
IF valor_renta > hasta_20 AND valor_renta <= hasta_25 THEN
LET valor_renta = valor_renta - hasta_20
LET renta = valor_renta * .25
LET renta_27 = renta
ELSE
IF valor_renta > hasta_25 THEN
LET renta = ((hasta_25-hasta_20) * .25)
LET renta_27 = renta
END IF
END IF
DISPLAY "renta 25 ",renta_27
# Renta al 30 %
LET renta_30 = 0
IF valor_renta > hasta_25 THEN
LET valor_renta = valor_renta - hasta_25
LET renta = valor_renta * .25
LET renta_30 = renta
END IF
DISPLAY "renta 30 ",renta_30
IF renta_15 is null THEN
LET renta_15 = 0
END IF
IF renta_30 is null THEN
LET renta_30 = 0
END IF
IF renta_20 is null THEN
LET renta_20 = 0
END IF
IF renta_27 is null THEN
LET renta_27 = 0
END IF
LET renta = renta_15 + renta_20 + renta_27 + renta_30
IF opt2 = "S" THEN
LET renta = renta_pagada - renta
END IF
IF opt2 != "S" THEN
IF datos_nomi.tipo_emp = "S" THEN
LET p_mes = (12 - p_mes1) + 1
LET renta = (renta_pagada - renta) #/ p_mes
ELSE
#IF ultima_semana_mes = "N" THEN
IF ultima_semana_mes = "N" THEN
LET renta = (renta_pagada - renta)
ELSE
LET renta = (renta_pagada - renta)
END IF
#ELSE
# LET renta = renta_pagada - renta
#END IF
END IF
END IF
IF renta < 0 THEN
LET renta = renta * -1
END IF
IF renta < 0 THEN
LET renta = 0
END IF
# Cuando es renta de bonificacion Se Agrego el 11/11/2002
#----------------------------------------------------------------------------
#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 movi_emp[idx].departamento = datos_emp.departamento
LET idx = idx + 1
LET movi_emp[idx].departamento = datos_emp.departamento
LET movi_emp[idx].clase_mov = "D"
LET movi_emp[idx].cod_mov = datos_mov.cod_mov
LET movi_emp[idx].valor = cuota_ss * -1
END IF
IF datos_nomi.tipo_emp = "Q" THEN
LET cuota_ss = ss.porc_emp * 2
LET cuota_ss_pa = 0 #ss.porc_pat * 2
LET idx = idx + 1
LET movi_emp[idx].clase_mov = "D"
LET movi_emp[idx].cod_mov = datos_mov.cod_mov
LET movi_emp[idx].valor = cuota_ss * -1
LET movi_emp[idx].departamento = datos_emp.departamento
LET idx = idx + 1
LET movi_emp[idx].clase_mov = "T"
LET movi_emp[idx].cod_mov = 98
LET movi_emp[idx].valor = cuota_ss_pa
LET movi_emp[idx].departamento = datos_emp.departamento
END IF
END IF
END IF
LET ss.porc_emp = 0.00
LET ss.salario_sem_hasta = 0.00
LET ss.salario_men_hasta = 0.00
LET ss.porc_pat = 0.00
LET salario_semanal = 0.00
LET cuota_ss_pa = 0.00
#------------------------------------------------------------------------------
# FIN DEL CALCULO PARA EL PAGO DEL SEGURO SOCIAL
#------------------------------------------------------------------------------
LABEL salta:
DISPLAY "inicio for 1 ",movi_emp[p].num_emp," ",movi_emp[p].cod_mov," ",movi_emp[p].valor
#BEGIN WORK
# Insertar los movimientos del empleado en memoria
FOR p = 1 TO idx
DISPLAY "inicio for ",movi_emp[p].num_emp," ",movi_emp[p].cod_mov," ",movi_emp[p].valor
# Caso particular para prestamo cooperativa, farmacia y plaza lama
# Tiene que el movimiento no sea el movimiento 11 porque esta en la tabla
# notb00014 que es donde estan los codigos que se balancean y se puso este
# codigo de movimiento en esta tabla para el proceso de fin de ano de nomina
IF movi_emp[p].cod_mov != 11 THEN
SELECT * FROM notb00014
WHERE @cod_mov = movi_emp[p].cod_mov
IF status != notfound THEN
SELECT sum(valor) INTO p_valor FROM notb00008
WHERE num_emp = datos_emp.num_emp and
cod_mov = movi_emp[p].cod_mov AND
status_t IS null
IF p_valor <= 0 THEN
LET movi_emp[p].num_emp = null
LET movi_emp[p].cod_mov = null
LET movi_emp[p].valor = 0
END IF
LET p_valor = p_valor * tasa
IF p_valor < movi_emp[p].valor THEN
LET movi_emp[p].valor = p_valor
END IF
IF movi_emp[p].cod_mov = 12 THEN
LET interes = p_valor * porciento
LET movi_emp[p].valor = movi_emp[p].valor
IF datos_nomi.tipo_emp = "Q" THEN
LET interes = interes / 100
END IF
IF interes > 0 THEN
LET interes = interes * -1
END IF
CASE
WHEN movi_emp[p].cod_mov = 12
LET p_codigo = 110
EXIT CASE
WHEN movi_emp[p].cod_mov = 13
LET p_codigo = 111
EXIT CASE
WHEN movi_emp[p].cod_mov = 19
LET p_codigo = 112
EXIT CASE
END CASE
# Vacaciones Colectivas
IF vacaciones = "S" THEN
LET interes = interes * semanas
END IF
#----------------------------------------------------------------------------
# Inserta los intereses de los perstamos como un movimiento en la
# nomina, el codigo de los interes es el 110
IF calcula_interes = "SI" THEN
IF movi_emp[p].valor != 0 THEN
LET movi_emp[p].departamento = datos_emp.departamento
INSERT INTO notb00008 (num_nomi
,tipo_emp
,num_emp
,departamento
,nivel_emp
,cod_puesto
,fecha
,cod_mov
,cantidad
,valor
,clase_mov
,us_crea
,fech_crea
)
VALUES (datos_nomi.num_nomi,datos_nomi.tipo_emp,
datos_emp.num_emp,datos_emp.departamento,datos_emp.nivel_emp,
datos_emp.cod_puesto,p_fecha_al,
p_codigo,movi_emp[p].cantidad,interes,
movi_emp[p].clase_mov,SUSER_SNAME(),GETDATE())
END IF
END IF
END IF
END IF
# Si el movimiento es de prestamo farmacia o plaza lama
# Si el valor pendiente de estos prestamos esta saldado no inserta el movimiento
IF movi_emp[p].cod_mov = 13 or
movi_emp[p].cod_mov = 19 THEN
IF p_valor <= 0 THEN
LET movi_emp[p].num_emp = null
END IF
END IF
#----------------------------------------------------------------------------
# Cuando el movimiento es de prestamo cooperativa chequea que el valor con
# el 1% sea menor o igual que cero para no insertar movimiento en la tabla
IF movi_emp[p].valor <= 0 THEN
LET movi_emp[p].num_emp = null
END IF
#-------------------------------------------------------------------------
END IF
IF movi_emp[p].cod_mov != 0 and movi_emp[p].cod_mov is not null THEN
IF movi_emp[p].clase_mov = "D" or movi_emp[p].clase_mov = "R" or
movi_emp[p].clase_mov = "S" THEN
LET movi_emp[p].clase_mov = "D"
IF movi_emp[p].valor > 0 THEN
LET movi_emp[p].valor = movi_emp[p].valor * -1
END IF
END IF
IF movi_emp[p].valor is null THEN
LET movi_emp[p].valor = 0
END IF
#------------------------------------------------------------------------
IF movi_emp[p].valor != 0 THEN
IF vacaciones = "S" THEN
IF movi_emp[p].cod_mov = 22 THEN
LET movi_emp[p].valor = movi_emp[p].valor * semanas
END IF
END IF
# --------------------------------- COMPENSACION ISR ---------------------
IF movi_emp[p].cod_mov = 48 THEN
IF movi_emp[p].valor < 0 THEN
LET movi_emp[p].valor = movi_emp[p].valor * -1
END IF
END IF
#-------------------------------------------------------------------------
# DISPLAY "insertando ",movi_emp[p].num_emp," ",movi_emp[p].cod_mov," ",movi_emp[p].valor
INSERT INTO notb00008 (num_nomi,tipo_emp,num_emp,departamento,nivel_emp,cod_puesto,fecha,cod_mov,cantidad,valor,
clase_mov,us_crea,fech_crea,departamento_afecta)
VALUES (datos_nomi.num_nomi,datos_nomi.tipo_emp,
datos_emp.num_emp,datos_emp.departamento,datos_emp.nivel_emp,
datos_emp.cod_puesto,p_fecha_al,
movi_emp[p].cod_mov,movi_emp[p].cantidad,movi_emp[p].valor,
movi_emp[p].clase_mov,usuarios,GETDATE(),movi_emp[p].departamento)
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 (num_nomi,tipo_emp,num_emp,departamento,nivel_emp,cod_puesto,fecha,cod_mov,cantidad,valor,
clase_mov,us_crea,fech_crea,departamento_afecta)
VALUES (datos_nomi.num_nomi,datos_nomi.tipo_emp,
datos_emp.num_emp,datos_emp.departamento,datos_emp.nivel_emp,
datos_emp.cod_puesto,p_fecha_al,
1,0,0,
movi_emp[p].clase_mov,usuarios,GETDATE(),movi_emp[p].departamento)
#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)
END IF
END IF
END IF
END FOR
INSERT INTO notb00008 (num_nomi,tipo_emp,num_emp,departamento,nivel_emp,cod_puesto,fecha,cod_mov,cantidad,valor,
clase_mov,us_crea,fech_crea,departamento_afecta)
VALUES (datos_nomi.num_nomi,datos_nomi.tipo_emp,
datos_emp.num_emp,datos_emp.departamento,datos_emp.nivel_emp,
datos_emp.cod_puesto,p_fecha_al,
4,0,0,
"I",usuarios,GETDATE(),movi_emp[p].departamento)
# 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,
# 4,0,0,"I",null,usuarios,GETDATE(),null,null)
#IF STATUS < 0 THEN
# CALL fgl_winmessage("STOP","ERROR INSERTANDO INFORMACION","STOP")
# ROLLBACK WORK
# EXIT PROGRAM
# END IF
CALL movi_emp.clear()
#CLEAR FORM
#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