Files
MBS/PROYECTO/nodir/noprmt008.4gl
T
Abel LópezandClaude Sonnet 5 7638c1046b Corregir noprmt008 (Generacion de Nomina): checkbox no aplicaba su
valor por defecto

El checkbox "GENERO NOMINA ACTIVOS" (opt1) y los demas checkboxes de
la pantalla inicial no entregaban su defaultValue a la variable si el
usuario no los tocaba explicitamente, quedando en "N". Como el codigo
hace "IF opt1 != 'S' THEN RETURN" sin ningun mensaje, el programa
generaba 0 registros y se cerraba en silencio pareciendo exitoso.

Se inicializan opt1/opt2/opt3/regalia/vacaciones explicitamente antes
del INPUT BY NAME para que coincidan con los defaults del formulario,
sin depender de esa interaccion.

Se retiro tambien la funcion debuglog() (y su entrada FGLSPOOL) usada
solo para diagnosticar este problema.

Verificado generando la nomina 2701/Q completa: 4798 registros para
628 empleados, con calculo correcto de sueldo quincenal (50% primera
quincena) y descuentos de TSS/ARS.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 12:16:53 -04:00

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