Files
MBS/PROYECTO/nodir/noprmt008.virus
T

2031 lines
66 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 calcula,calcula_ars,calcula_tss CHAR(1)
DEFINE p_mes1,numero_nomina,num_van,tiempo,semanas,p_mes,p_ano SMALLINT
DEFINE impuesto_c,sueldo_ganado,ing_regal,factor,renta_p,val_bonifica,valor_renta,sueldo_boni DECIMAL(12,2)
DEFINE ch_num CHAR(4)
DEFINE porc_dias,dias,meses DECIMAL(8,2)
DEFINE num_ch CHAR(4)
DEFINE numero INTEGER
DEFINE empleados CHAR(500)
DEFINE porc_emp,porc_emp_ars,porc_cia,porc_cia_ars,porciento DECIMAL(9,4),
afp_pago_emp,afp_pago_cia,cuota_ss_pa,valor_tss_emp,valor_ars_emp,valor_tss_cia,valor_ars_cia,salario_tss,otros_ing_tss DECIMAL(10,2),
fecha_inicio_p DATE
DEFINE interes,p_valor,p_cantidad,salario_h,renta_pagada_15,renta_pagada_20,
renta_pagada_27,renta_15,renta_20,renta_27,renta_30,porc_extras,valor_bonif,
valor_regal,renta_boni,valor_bonif1,sueldfo_boni,renta_pagada,
excento,hasta_15,hasta_20,hasta_25,valor_vacacion DECIMAL(12,2)
DEFINE t,p_codigo,l,dia,k,p,idx1 INTEGER
DEFINE k1,vacaciones,hay1,hay,bonifica,regalia,p_tipo,encontre,opt1,
retorne CHAR(1)
DEFINE fecha_ini_per,p_fecha_del,p_fecha_al,p1_fecha_del,p1_fecha_al DATE
DEFINE horas INTERVAL HOUR TO MINUTE
DEFINE nombre_mov CHAR(30)
DEFINE t_cantidad_35,t_cantidad_100,horas_ex,sueldo_h,p_h_normal,otros_ing
DECIMAL(8,2)
DEFINE t_horas_ex,horas_35,horas_100,t_horas_35,t_horas_100,acumulado,renta
DECIMAL(12,2)
DEFINE sueldo,sueldo_renta,p_sueldo,salario_semanal DECIMAL(12,2)
DEFINE ingresos_empleado, acum_mes_ss, cuota_ss, acum_ing_mes DECIMAL(12,2)
DEFINE ultima_semana_mes CHAR(1)
DEFINE fecha_ini_mes DATE
DEFINE 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 h_extras RECORD
fecha DATE,
entrada DATETIME HOUR TO MINUTE,
salida DATETIME HOUR TO MINUTE,
extra_35 INTERVAL HOUR TO MINUTE,
extra_100 INTERVAL HOUR TO MINUTE
END RECORD
DEFINE movi RECORD
cod_mov SMALLINT,
valor DECIMAL(10,2)
END RECORD
DEFINE desp_mov ARRAY[100] OF RECORD
clasifica CHAR(1),
cod_mov SMALLINT,
descrip_mov CHAR(30)
END RECORD
DEFINE datos_nomi RECORD
num_nomi LIKE notb00010.num_nomi,
tipo_emp LIKE notb00010.tipo_emp
END RECORD
DEFINE datos_emp RECORD
num_emp LIKE adtb00003.num_emp,
departamento LIKE adtb00003.departamento,
nivel_emp LIKE adtb00003.nivel_emp,
cod_puesto LIKE adtb00003.cod_puesto,
nom1_emp LIKE adtb00003.nom1_emp,
apell1_emp LIKE adtb00003.apell1_emp,
sueldo LIKE adtb00003.sueldo_ac,
paga_seg LIKE adtb00003.paga_seg,
fecha DATE
END RECORD
DEFINE datos_mov RECORD
cod_mov LIKE notb00002.cod_mov,
clase_mov LIKE notb00002.clase_mov,
cantidad LIKE notb00002.cantidad_emp,
valor LIKE notb00007.valor,
cantidad_emp LIKE notb00002.cantidad_emp,
cantidad_cia LIKE notb00002.cantidad_cia
END RECORD
DEFINE movi_emp ARRAY [52] OF RECORD
num_emp SMALLINT,
cod_mov LIKE notb00002.cod_mov,
clase_mov CHAR(1),
cantidad LIKE notb00002.cantidad_emp,
valor LIKE notb00007.valor
END RECORD
FUNCTION noprmt008()
CLEAR SCREEN
CALL pantalla()
OPTIONS
FORM LINE 9,
PROMPT LINE 12,
ERROR LINE 24,
COMMENT LINE 23
DISPLAY "noprmt008" AT 4,3 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.*
AFTER FIELD num_nomi
IF datos_nomi.num_nomi IS NULL THEN
LET numero_msg = 16
CALL msg(numero_msg)
NEXT FIELD num_nomi
END IF
AFTER FIELD tipo_emp
IF datos_nomi.tipo_emp IS NULL THEN
LET numero_msg = 16
CALL msg(numero_msg)
NEXT FIELD tipo_emp
END IF
# Busqueda del periodo comprendido de la nomina
SELECT fecha_del,fecha_al,h_normal,mes,ano,num_sem INTO
p_fecha_del,p_fecha_al,p_h_normal,p_mes1,p_ano,semanas_mes
FROM notb00010
WHERE num_nomi = datos_nomi.num_nomi and
tipo_emp = datos_nomi.tipo_emp
and status_t is null
IF status = notfound THEN
LET numero_msg = 199
CALL msg(numero_msg)
NEXT FIELD num_nomi
END IF
SELECT MIN(a.fecha_del),MAX(a.fecha_al)
INTO p1_fecha_del,p1_fecha_al
FROM notb00010 a
WHERE a.ano = p_ano
and a.mes = p_mes1
and a.tipo_emp = datos_nomi.tipo_emp
#and a.status_t is null
# Busca el mes inicial del periodo
SELECT MIN(a.fecha_Del) INTO fecha_inicio_p
FROM notb00010 a
WHERE a.ano = p_ano AND
a.tipo_emp = datos_nomi.tipo_emp
SELECT MAX(a.monto_excento),MAX(a.porc_15),MAX(a.porc_20),MAX(a.porc_25)
INTO excento,hasta_15,hasta_20,hasta_25
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
{
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
SELECT MAX(num_nomi) INTO ult_nomi_mes
FROM notb00010
WHERE tipo_emp = datos_nomi.tipo_emp AND
mes = p_mes1 AND
ano = p_ano AND num_nomi NOT IN (46,22) AND
status_t IS NULL
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 <> "E"
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
DECLARE tinti CURSOR FOR
SELECT cod_mov,descrip_mov FROM notb00002 WHERE status_t IS NULL
ORDER BY 1
LET idx1 = 1
FOREACH tinti INTO desp_mov[idx1].cod_mov,desp_mov[idx1].descrip_mov
IF regalia = "S" or opt2 = "S" THEN
LET desp_mov[idx1].clasifica = "N"
ELSE
LET desp_mov[idx1].clasifica = "S"
END IF
LET scr_l = scr_line()
LET idx1 = idx1 + 1
END FOREACH
CALL set_count(idx1 -1)
INPUT ARRAY desp_mov WITHOUT DEFAULTS FROM s_mov.*
AFTER INPUT
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
LET int_flag = false
RETURN
END IF
EXIT INPUT
END INPUT
CLEAR SCREEN
CALL pantalla()
DISPLAY "noprmt008" AT 4,2
DISPLAY "Generacion de nomina" AT 6,32
# Preparacion de la busqueda de los empleados dependiendo del criterio de
# seleccion
IF datos_nomi.tipo_emp = "S" THEN
LET empleados = "SELECT num_emp,departamento,nivel_emp,cod_puesto,nom1_emp,",
"apell1_emp,sueldo_ac,paga_seg,fech_efec ",
"FROM adtb00003 ",
" WHERE ",
" nomina = ? ",
" AND fech_efec <= ? ",
" AND (status_t is null or ",
" status_t = 'I') ",
"ORDER BY 1"
ELSE
LET empleados = "SELECT a.num_emp,a.departamento,a.nivel_emp,a.cod_puesto,a.nom1_emp,",
"a.apell1_emp,a.sueldo_ac,a.paga_seg,a.fech_efec ",
"FROM adtb00003 a ",
" WHERE ",
" a.nomina = ? ", #" and a.num_emp = 144 ",
" AND a.fech_efec <= ? ",
" AND (a.status_t is null or ",
" a.status_t = 'I') ",
"ORDER BY 1"
END IF
PREPARE comando FROM empleados
DECLARE busca SCROLL CURSOR FOR comando
OPEN busca USING datos_nomi.tipo_emp,p_fecha_al
WHILE STATUS != NOTFOUND
FETCH busca INTO datos_emp.*
IF status = notfound THEN
EXIT WHILE
END IF
LET meses = (p_fecha_al - datos_emp.fecha)
LET meses = meses / 30
FOR t = 1 TO 12
LET movi_emp[t].num_emp = null
LET movi_emp[t].cod_mov = null
LET movi_emp[t].clase_mov = null
LET movi_emp[t].cantidad = null
LET movi_emp[t].valor = null
END FOR
LET valor_renta = 0
IF regalia != "S" THEN
# Busca los acumulados de ingresos de los empleados
SELECT sum(valor) INTO acumulado from notb00008 WHERE status_t is null and
clase_mov in ("I","E") and
num_emp = datos_emp.num_emp
AND fecha BETWEEN p1_fecha_del AND p1_fecha_al #fecha_inicio_p
END IF
IF acumulado is null THEN
LET acumulado = 0
END IF
DISPLAY "No. Ficha: " at 8,3
DISPLAY datos_emp.num_emp using "&&&" at 8,15
DISPLAY datos_emp.nom1_emp clipped," ",datos_emp.apell1_emp at 8,20
DISPLAY "Acumulado Antes de esta Nomina:" at 9,3
LET sueldo_renta = 0
LET movi_emp[1].cod_mov = 1
LET movi_emp[1].clase_mov = "I"
# Calculo del sueldo normal semanal
IF datos_nomi.tipo_emp = "S" THEN
LET salario_h = datos_emp.sueldo / 190.60
LET p_sueldo = datos_emp.sueldo
LET datos_emp.sueldo = (datos_emp.sueldo / 190.60) *
p_h_normal
# Mdificado el 11/11/2002 LET sueldo_boni = datos_emp.sueldo
END IF
# Calculo del sueldo normal quincenal
IF datos_nomi.tipo_emp = "Q" 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.fecha between p1_fecha_del AND
p1_fecha_al AND
a.num_emp = datos_emp.num_emp AND
a.cod_mov = 1
IF sueldo_ganado = 0 OR sueldo_ganado IS NULL THEN
LET datos_emp.sueldo = datos_emp.sueldo *.50
ELSE
LET datos_emp.sueldo = datos_emp.sueldo - sueldo_ganado
IF datos_emp.sueldo > p_sueldo / 12 THEN
LET datos_emp.sueldo = p_sueldo / 2
END IF
END IF
LET salario_h = datos_emp.sueldo / 95.33
LET sueldo_boni = datos_emp.sueldo
END IF
IF datos_nomi.tipo_emp = "V" THEN
LET sueldo_boni = datos_emp.sueldo
END IF
#-----------------------------------------------------------------------------
LET movi_emp[1].cantidad = p_h_normal
LET movi_emp[1].valor = datos_emp.sueldo
LET sueldo_renta = sueldo_renta + movi_emp[1].valor
FOR i = 1 to idx1
IF movi_emp[i].cod_mov = desp_mov[i].cod_mov THEN
IF desp_mov[i].clasifica = "N"
THEN
LET movi_emp[1].valor = 0
LET movi_emp[1].cantidad = 0
LET sueldo_renta = 0
END IF
END IF
END FOR
# Busqueda de la tabla de novedades cuando la nomina no es de bonificacion
IF opt2 != "S" THEN
DECLARE busca1 CURSOR FOR
SELECT a.cod_mov,b.clase_mov,a.cantidad,a.valor,b.cantidad_emp,cantidad_cia,
b.ch_encabeza
FROM notb00003 a,notb00002 b
WHERE
a.num_emp = datos_emp.num_emp and
a.departamento = datos_emp.departamento and
a.status_t is null and
a.cod_mov = b.cod_mov
UNION
SELECT a.cod_mov,b.clase_mov,a.cantidad,a.valor,b.cantidad_emp,cantidad_cia,
b.ch_encabeza
FROM notb00007 a,notb00002 b
WHERE a.num_nomi = datos_nomi.num_nomi and
a.num_emp = datos_emp.num_emp and
a.tipo_emp = datos_nomi.tipo_emp and
a.departamento = datos_emp.departamento and
a.status_t is null and
a.cod_mov = b.cod_mov
ORDER BY 1
END IF
# Busca de la tabla de novedades si la nomina es de bonificacion
IF opt2 = "S" THEN
DECLARE busca2 CURSOR FOR
SELECT a.cod_mov,b.clase_mov,a.cantidad,a.valor,b.cantidad_emp,cantidad_cia,
b.ch_encabeza
FROM notb00003 a,notb00002 b
WHERE
a.num_emp = datos_emp.num_emp and
a.departamento = datos_emp.departamento and
a.status_t is null and
a.cod_mov = b.cod_mov
UNION
SELECT a.cod_mov,b.clase_mov,a.cantidad,a.valor,b.cantidad_emp,cantidad_cia,
b.ch_encabeza
FROM notb00007 a,notb00002 b
WHERE a.num_nomi = datos_nomi.num_nomi and
a.num_emp = datos_emp.num_emp and
a.tipo_emp = datos_nomi.tipo_emp and
a.departamento = datos_emp.departamento and
a.status_t is null and
a.cod_mov = b.cod_mov
ORDER BY 1
END IF
LET modifica = "N"
LET encontre = "N"
LET bonifica = "N"
LET idx = 2
# Para buscar codigos de las nominas normales
IF opt2 = "N" THEN
FOREACH busca1 INTO datos_mov.*
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
LET int_flag = false
RETURN
END IF
# Chequea los movimientos que son balanceados
# Tiene que el movimiento no sea el movimiento 11 porque esta en la tabla
# notb00014 que es donde estan los codigos que se balancean y se puso este
# codigo de movimiento en esta tabla para el proceso de fin de ano de nomina
IF datos_mov.cod_mov != 11 THEN
SELECT * FROM notb00014
WHERE @cod_mov = datos_mov.cod_mov
IF status != notfound THEN
SELECT SUM(valor) INTO p_valor FROM notb00008
WHERE num_emp = datos_emp.num_emp and
cod_mov = datos_mov.cod_mov
IF status = notfound THEN
LET status = 0
END IF
IF p_valor = 0 THEN
CONTINUE FOREACH
END IF
END IF
END IF
# Chequea que el codigo tenga la opcion de que si lo quieren generar
FOR i = 1 to idx1
IF datos_mov.cod_mov = desp_mov[i].cod_mov THEN
IF desp_mov[i].clasifica = "N" or desp_mov[i].clasifica is null
THEN
CONTINUE FOREACH
END IF
END IF
END FOR
IF datos_mov.cod_mov != 1 THEN
LET movi_emp[idx].clase_mov = datos_mov.clase_mov
LET movi_emp[idx].cod_mov = datos_mov.cod_mov
END IF
# Calculo de las horas trabajadas en la jornada
# Esto solo lo calcula cuando el usuario poporciona la informacion de las
# horas trabajadas durante el periodo como una novedad
IF datos_mov.cod_mov = 1 THEN
#datos_mov.cod_mov = 9 THEN
LET modifica = "S"
LET sueldo_renta = 0
LET movi_emp[1].cod_mov = datos_mov.cod_mov
LET movi_emp[1].clase_mov = datos_mov.clase_mov
# El 190.60 es para calcular el sueldo por hora
IF datos_mov.cantidad > 0 THEN
LET movi_emp[1].cantidad = datos_mov.cantidad
LET movi_emp[1].valor = (p_sueldo / 190.60) *
datos_mov.cantidad
END IF
IF datos_mov.cantidad = 0 and
datos_mov.cod_mov = 1 THEN
LET movi_emp[1].valor = 0
LET movi_emp[1].cantidad = 0
END IF
IF datos_mov.valor > 0 THEN
LET movi_emp[1].valor = datos_mov.valor
END IF
LET sueldo_renta = sueldo_renta + movi_emp[1].valor
END IF
IF datos_mov.cod_mov > 1 THEN
IF datos_mov.cod_mov = 33 THEN
LET bonifica = "S"
LET sueldo_renta = movi_emp[1].valor
LET sueldo_boni = datos_mov.valor # Modifcado 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
IF datos_mov.cantidad > 0 THEN
LET movi_emp[idx].valor = salario_h * movi_emp[idx].cantidad
ELSE
LET movi_emp[idx].valor = datos_mov.valor
END IF
END IF
# Calculo de las horas extras
IF movi_emp[idx].clase_mov = "E" THEN
SELECT 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)
display movi_emp[idx].valor at 17,1
LET movi_emp[idx].valor = movi_emp[idx].valor * datos_mov.cantidad
END IF
LET idx = idx + 1
END IF
END FOREACH
END IF
LET hay1 = "N"
FOR i = 1 TO idx
IF movi_emp[i].cod_mov = 32 THEN
LET hay1 = "S"
LET valor_regal = movi_emp[i].valor
END IF
END FOR
IF hay1 = "N" THEN
# Nomina de Regalia Pascual
IF regalia = "S" THEN
LET idx = idx + 1
LET movi_emp[idx].cod_mov = 32
LET movi_emp[idx].valor = p_sueldo
IF year(p_fecha_al) = year(datos_emp.fecha) THEN
LET p_mes = month(datos_emp.fecha)
SELECT dias_prod INTO dias FROM mestable
WHERE mes = p_mes
LET porc_dias = (dias - day(datos_emp.fecha)) / dias
LET p_mes = 12 - month(datos_emp.fecha)
LET porc_dias = porc_dias + p_mes
LET movi_emp[idx].valor = (p_sueldo / 12) * porc_dias
END IF
LET movi_emp[idx].cantidad = porc_dias
LET valor_regal = movi_emp[idx].valor
LET movi_emp[idx].clase_mov = "I"
END IF
END IF
# Para Cuando la nomina es de bonificacion
IF opt2 = "S" THEN
FOREACH busca2 INTO datos_mov.*
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
LET int_flag = false
RETURN
END IF
# Chequea los movimientos que son balanceados
# Tiene que el movimiento no sea el movimiento 11 porque esta en la tabla
# notb00014 que es donde estan los codigos que se balancean y se puso este
# codigo de movimiento en esta tabla para el proceso de fin de ano de nomina
IF datos_mov.cod_mov != 11 THEN
SELECT * FROM notb00014
WHERE cod_mov = datos_mov.cod_mov
IF status != notfound THEN
SELECT SUM(valor) INTO p_valor FROM notb00008
WHERE num_emp = datos_emp.num_emp and
cod_mov = datos_mov.cod_mov
IF status = notfound THEN
LET status = 0
END IF
IF p_valor = 0 THEN
CONTINUE FOREACH
END IF
END IF
END IF
# Chequea que el codigo tenga la opcion de que si lo quieren generar
FOR i = 1 to idx1
IF datos_mov.cod_mov = desp_mov[i].cod_mov THEN
IF desp_mov[i].clasifica = "N" or desp_mov[i].clasifica is null
THEN
CONTINUE FOREACH
END IF
END IF
END FOR
IF datos_mov.cod_mov != 1 THEN
LET movi_emp[idx].clase_mov = datos_mov.clase_mov
LET movi_emp[idx].cod_mov = datos_mov.cod_mov
END IF
# Calculo de las horas trabajadas en la jornada
# Esto solo lo calcula cuando el usuario poporciona la informacion de las
# horas trabajadas durante el periodo como una novedad
IF datos_mov.cod_mov = 1 or
datos_mov.cod_mov = 9 THEN
LET modifica = "S"
LET sueldo_renta = 0
LET movi_emp[1].cod_mov = datos_mov.cod_mov
LET movi_emp[1].clase_mov = datos_mov.clase_mov
# El 190.60 es para calcular el sueldo por hora
IF datos_mov.cantidad > 0 THEN
LET movi_emp[1].cantidad = datos_mov.cantidad
LET movi_emp[1].valor = (p_sueldo / 190.60) *
datos_mov.cantidad
END IF
IF datos_mov.cantidad = 0 and
datos_mov.cod_mov = 1 THEN
LET movi_emp[1].valor = 0
LET movi_emp[1].cantidad = 0
END IF
IF datos_mov.valor > 0 THEN
LET movi_emp[1].valor = datos_mov.valor
END IF
LET sueldo_renta = sueldo_renta + movi_emp[1].valor
END IF
IF datos_mov.cod_mov > 1 THEN
IF datos_mov.cod_mov = 9 THEN
CONTINUE FOREACH
END IF
IF datos_mov.cod_mov = 33 THEN
LET bonifica = "S"
LET sueldo_boni = datos_mov.valor # Se Agrego el 11/11/2002
END IF
# Cuando el valor o la cantiad tienen algun valor se quedara este valor
# en la variable de asignacion
LET movi_emp[idx].cantidad = datos_mov.cantidad
LET movi_emp[idx].valor = datos_mov.valor
# Cuando es comida, desayuno, cena
IF datos_mov.cantidad_emp > 0 and datos_mov.clase_mov = "D" THEN
LET movi_emp[idx].valor = (datos_mov.cantidad_emp +
datos_mov.cantidad_cia) *
datos_mov.cantidad
LET movi_emp[idx].cantidad = datos_mov.cantidad
END IF
# Calculo incentivo asistencia
IF movi_emp[idx].cod_mov = 9 THEN
LET movi_emp[idx].valor = salario_h * movi_emp[idx].cantidad
END IF
# Calculo de las horas extras
IF movi_emp[idx].clase_mov = "E" THEN
SELECT cantidad_cia INTO porc_extras FROM notb00002
WHERE cod_mov = movi_emp[idx].cod_mov
LET movi_emp[idx].valor = salario_h * ((porc_extras / 100) + 1)
LET movi_emp[idx].valor = movi_emp[idx].valor * datos_mov.cantidad
END IF
LET idx = idx + 1
END IF
display "MOV ",datos_mov.cod_mov
END FOREACH
END IF
# Calculo del infotep
FOR i = 1 TO idx
IF movi_emp[i].cod_mov = 33 THEN
LET idx = idx + 1
LET movi_emp[idx].cod_mov = 41
LET movi_emp[idx].clase_mov = "D"
LET movi_emp[idx].valor = movi_emp[i].valor * .005
LET movi_emp[idx].cantidad = 0
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
# Gerente General
IF datos_emp.num_emp = 148 THEN
LET movi_emp[idx].clase_mov = "I"
LET movi_emp[idx].cod_mov = 4
LET movi_emp[idx].valor = 0
END IF
END IF
LABEL salta1:
DISPLAY sueldo_renta at 8,60
DISPLAY acumulado at 9,60
# Busqueda de las novedades globales
DECLARE busca20 CURSOR FOR
SELECT cod_mov,cantidad_emp,clase_mov FROM notb00002
WHERE tipo_mov = "G" 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
END IF
END FOR
IF globales.clase_mov = "S" THEN
IF datos_emp.paga_seg != "S" THEN
CONTINUE FOREACH
END IF
END IF
FOR i = 1 to idx
IF globales.cod_mov = movi_emp[i].cod_mov THEN
LET movi_emp[i].clase_mov = globales.clase_mov
CONTINUE FOREACH
END IF
END FOR
# Este es el movimiento del descuento de casa club cuando es quincenal
# devide la cantidad que paga el empleado entre dos.
IF globales.cod_mov = 20 THEN
IF datos_nomi.tipo_emp = "Q" THEN
LET globales.cantidad_emp = globales.cantidad_emp / 2
END IF
END IF
LET idx = idx + 1
LET movi_emp[idx].cod_mov = globales.cod_mov
LET movi_emp[idx].valor = globales.cantidad_emp
IF vacaciones = "S" THEN
IF movi_emp[idx].cod_mov != 36 THEN
LET movi_emp[idx].valor = movi_emp[idx].valor * semanas
END IF
END IF
LET movi_emp[idx].clase_mov = globales.clase_mov
END FOREACH
# Calculo del Incentivo comida, desayuno, cena
LET p_valor = 0
FOR p = 1 TO idx
IF movi_emp[p].cod_mov != 0 and movi_emp[p].cod_mov is not null THEN
IF movi_emp[p].cod_mov = 16 or
movi_emp[p].cod_mov = 17 or
movi_emp[p].cod_mov = 18 THEN
SELECT cantidad_cia INTO p_cantidad FROM notb00002
WHERE cod_mov = movi_emp[p].cod_mov
LET p_valor = p_valor + (movi_emp[p].cantidad * p_cantidad)
END IF
END IF
END FOR
IF p_valor > 0 THEN
# Chequea que el codigo tenga la opcion de que si lo quieren generar
FOR i = 1 to idx1
IF desp_mov[i].cod_mov = 5 THEN
IF desp_mov[i].clasifica = "N" or desp_mov[i].clasifica is null
THEN
CONTINUE WHILE
END IF
END IF
END FOR
# Chequea si el codigo de incentivo almuerzo esta en novedades
# para salir del proceso en caso de que este codigo exista como novedad
FOR i = 1 to idx
IF movi_emp[i].cod_mov = 5 THEN
CONTINUE WHILE
END IF
END FOR
LET idx = idx + 1
LET movi_emp[idx].clase_mov = "I"
LET movi_emp[idx].cod_mov = 5
LET movi_emp[idx].valor = p_valor
IF datos_emp.num_emp = 148 THEN
LET movi_emp[idx].clase_mov = "I"
LET movi_emp[idx].cod_mov = 5
LET movi_emp[idx].valor = 0
END IF
END IF
#-----------------------------------------------------------------------------
# Busqueda del impuesto sobre la renta
IF acumulado is null THEN
LET acumulado = 0
END IF
LET renta = 0
# Loop para acumular los otros ingresos para el calculo de la nomina
# se le puso una condicion donde suma los otros ingresos de que solo sume
# los clase_mov = I o E que sean diferentes a el codigo 1 sueldo normal y
# 32 regalia pascual
LET otros_ing = 0
IF vacaciones = "S" THEN
LET sueldo_renta = sueldo_renta - movi_emp[1].valor
LET movi_emp[1].cantidad = 0
LET movi_emp[1].valor = 0
CALL vacaciones_colect()
END IF
# OTROS INGRESOS PARA EL CALCULO DE AFP
LET otros_ing_tss = 0
SELECT sum(valor) INTO otros_ing_tss from notb00008 WHERE status_t is null and
cod_mov in (40,36) AND
num_emp = datos_emp.num_emp
AND fecha BETWEEN p1_fecha_del AND p1_fecha_al #fecha_inicio_p
LET afp_pago_emp = 0
SELECT sum(valor) INTO afp_pago_emp from notb00008 WHERE status_t is null and
cod_mov in (49) AND
num_emp = datos_emp.num_emp
AND fecha BETWEEN p1_fecha_del AND p1_fecha_al #fecha_inicio_p
LET afp_pago_cia = 0
SELECT sum(valor) INTO afp_pago_cia from notb00008 WHERE status_t is null and
cod_mov in (50) AND
num_emp = datos_emp.num_emp
AND fecha BETWEEN p1_fecha_del AND p1_fecha_al #fecha_inicio_p
IF afp_pago_emp IS NULL THEN
LET afp_pago_emp = 0
END IF
IF afp_pago_cia IS NULL THEN
LET afp_pago_cia = 0
END IF
IF otros_ing_tss is null THEN
LET otros_ing_tss = 0
END IF
FOR i = 1 TO idx
IF vacaciones = "S" THEN
IF movi_emp[i].clase_mov = "D" and
movi_emp[i].cod_mov != 23 and
movi_emp[i].cod_mov != 70 THEN
LET movi_emp[i].valor = movi_emp[i].valor * semanas
END IF
END IF
IF movi_emp[i].clase_mov = "I" or
movi_emp[i].clase_mov = "E" THEN
IF movi_emp[i].cod_mov != 1 THEN
IF vacaciones = "S" THEN
IF movi_emp[i].cod_mov != 31 THEN
IF movi_emp[i].cod_mov != 36 THEN
LET movi_emp[i].valor = movi_emp[i].valor * semanas
END IF
END IF
END IF
IF movi_emp[i].cod_mov = 40 OR movi_emp[i].cod_mov = 36 THEN
LET otros_ing_tss = movi_emp[i].valor + otros_ing_tss
END IF
LET otros_ing = movi_emp[i].valor + otros_ing
END IF
END IF
END FOR
IF acumulado is null THEN
LET acumulado = 0
END IF
IF sueldo_ganado IS NULL THEN
LET sueldo_ganado = 0
END IF
IF otros_ing_tss IS NULL THEN
LET otros_ing_tss = 0
END IF
IF datos_nomi.tipo_emp = "Q" THEN
# LET salario_tss = (sueldo_renta * 2) + otros_ing_tss
LET salario_tss = sueldo_ganado + sueldo_renta + otros_ing_tss
#display datos_emp.num_emp," ",salario_tss," ",datos_emp.sueldo," ",sueldo_ganado," ",sueldo_renta," ",otros_ing_tss
IF ultima_semana_mes = "S" THEN
LET valor_renta = sueldo_renta + acumulado + otros_ing
display datos_emp.num_emp," ",valor_renta
ELSE
LET valor_renta = valor_renta * 2 + acumulado + otros_ing
END IF
IF ultima_semana_mes = "N" THEN
LET valor_renta = sueldo_renta *2 + 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
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"
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
LET globales.cod_mov = 53
LET calcula_ars = "S"
FOR i = 1 to idx1
IF globales.cod_mov = desp_mov[i].cod_mov THEN
IF desp_mov[i].clasifica = "N" or desp_mov[i].clasifica is null
THEN
LET calcula_ars = "N"
EXIT FOR
END IF
END IF
END FOR
IF calcula_tss = "S" THEN
SELECT a.cantidad_emp / 100 INTO porc_emp
FROM notb00002 a
WHERE a.cod_mov = 49
SELECT a.cantidad_cia / 100 INTO porc_cia
FROM notb00002 a
WHERE a.cod_mov = 50
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
IF salario_tss < 98000 THEN
LET valor_tss_emp = salario_tss * porc_emp
LET valor_tss_cia = salario_tss * porc_cia
LET valor_renta = valor_renta - valor_tss_emp
ELSE
LET valor_tss_emp = 98000 * porc_emp
LET valor_tss_cia = 98000 * porc_cia
LET valor_renta = valor_renta - valor_tss_emp
END IF
IF salario_tss < 56350 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 = 56350 * porc_emp_ars # PAGOS ARS EMPLEADOS
LET valor_ars_cia = 56350 * 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].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
LET idx = idx + 1
LET movi_emp[idx].clase_mov = "T"
LET movi_emp[idx].cod_mov = 54
LET movi_emp[idx].valor = valor_ars_cia
END IF
END IF
#--------------------------------------------------------------------------------
LET valor_renta = valor_renta - valor_regal
# 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
# ------------------------------------------------------------------------
display "valor renta ",valor_renta
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 p1_fecha_del," ",p1_fecha_al ," ",renta_pagada
# 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 " renta 15 ",renta_15," ",datos_emp.num_emp
# 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
display datos_emp.num_emp," ",renta_27
ELSE
IF valor_renta > hasta_25 THEN
LET renta = ((hasta_25-hasta_20) * .25)
LET renta_27 = renta
END IF
END IF
display "renta 27 ",renta_27
display "valor renta ",valor_renta
# 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
display "renta total ",renta
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) /2
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 ------------------------------
{ Se Modifico el 11/11/2002 # Retorna a calcular la renta que pagaria con la bonificacion
IF bonifica = "S" and retorne = "S" THEN
LET retorne = "N"
GOTO retorna
END IF
}
IF opt1 = "S" THEN
# Se modifico el 11/11/2002 IF retorne = "N" THEN
IF datos_mov.cod_mov = 23 THEN
# Modifico 11/11/2002 LET renta = renta_boni - renta
LET idx = idx + 1
LET movi_emp[idx].clase_mov = "D"
LET movi_emp[idx].cod_mov = datos_mov.cod_mov
LET movi_emp[idx].valor = renta
END IF
# END IF
END IF
# Cuando el empleado no tiene que pagar contando con la bonificacion
# Solo por el sueldo
IF opt1 = "S" THEN
IF bonifica = "N" THEN
FOR i = 1 TO idx
IF movi_emp[i].cod_mov = datos_mov.cod_mov THEN
GOTO llega
END IF
END FOR
LET idx = idx + 1
LET movi_emp[idx].clase_mov = "D"
LET movi_emp[idx].cod_mov = datos_mov.cod_mov
LET movi_emp[idx].valor = renta
END IF
END IF
# Calculo de la renta de regalia pascual
LABEL llega:
IF regalia = "S" THEN
SELECT cod_mov INTO datos_mov.cod_mov FROM notb00002 WHERE
clase_mov = "R"
FOR i = 1 to idx1
IF datos_mov.cod_mov = desp_mov[i].cod_mov THEN
IF desp_mov[i].clasifica = "N" or desp_mov[i].clasifica is null
THEN
GOTO otro_llega
END IF
END IF
END FOR
CALL renta_regalia()
END IF
LABEL otro_llega:
#------------------------------------------------------------------------------
# CALCULO PARA EL PAGO DEL SEGURO SOCIAL
#------------------------------------------------------------------------------
IF datos_emp.paga_seg = "S" THEN
SELECT cod_mov,tipo_mov INTO datos_mov.cod_mov,p_tipo FROM notb00002
WHERE clase_mov = "S"
IF p_tipo ="G" THEN
GOTO salta
END IF
LET cuota_ss = 0
LET acum_mes_ss = 0
LET acum_ing_mes = 0
{ SE PUSO EN COMENTARIO PORQUE LOS EMPLEADOS 596, 600, 601
ESTABAN DANDO PROBLEMAS DE CALCULO SEGURO SOCIAL 22/5/2002
FOR i = 1 to idx
IF datos_mov.cod_mov = movi_emp[i].cod_mov THEN
GOTO salta
END IF
END FOR
}
FOR i = 1 to idx1
IF datos_mov.cod_mov = desp_mov[i].cod_mov THEN
IF desp_mov[i].clasifica = "N" OR
desp_mov[i].clasifica is null THEN
GOTO salta
END IF
END IF
END FOR
IF ultima_semana_mes = "S" THEN
# Busca el acumulado de seguro social, para el mes, que tiene el empleado
SELECT SUM(valor) INTO acum_mes_ss
FROM notb00008
WHERE cod_mov = datos_mov.cod_mov AND
num_emp = datos_emp.num_emp AND
fecha between fecha_ini_mes AND p_fecha_al AND
cod_mov != 33 AND
status_t IS NULL
IF acum_mes_ss IS NULL THEN
LET acum_mes_ss = 0
END IF
IF acum_mes_ss <> 0 THEN
LET acum_mes_ss = acum_mes_ss * -1
END IF
# Busca el acumulado de ingresos en el mes, que tiene el empleado
SELECT SUM(valor) INTO acum_ing_mes
FROM notb00008
WHERE (clase_mov = "I" OR clase_mov = "E") AND
num_emp = datos_emp.num_emp AND
fecha between fecha_ini_mes AND p_fecha_al AND
status_t IS NULL
IF acum_ing_mes IS NULL THEN
LET acum_ing_mes = 0
END IF
END IF
# Busca la cuota de seguro social que debe pagar el empleado segun los ingresos
# que obtuvo en la semana, si no es la ultima nomina del mes.
IF ultima_semana_mes = "N" THEN
IF datos_nomi.tipo_emp = "S" THEN
LET ingresos_empleado = movi_emp[1].valor + otros_ing
LET salario_semanal = 0
SELECT salario_sem_hasta INTO salario_semanal
FROM notb00006
WHERE salario_sem_desde <= ingresos_empleado and
salario_sem_hasta >= ingresos_empleado
IF status = notfound THEN
LET ss.porc_emp = 23.10
LET ss.salario_sem_hasta = 744.00
LET ss.salario_men_hasta = 3224.01
LET ss.porc_pat = 64.68 #51.17
ELSE
SELECT salario_sem_hasta, salario_men_hasta, porc_emp, porc_pat
INTO ss.salario_sem_hasta, ss.salario_men_hasta, ss.porc_emp,
ss.porc_pat
FROM notb00006
WHERE salario_sem_hasta = salario_semanal
END IF
END IF
IF datos_nomi.tipo_emp = "Q" THEN
LET ingresos_empleado = (p_sueldo / 190.6) * 44 + otros_ing
LET salario_semanal = 0
SELECT salario_sem_hasta INTO salario_semanal
FROM notb00006
WHERE salario_sem_desde <= ingresos_empleado and
salario_sem_hasta >= ingresos_empleado
IF status = notfound THEN
LET ss.porc_emp = 13.03
LET ss.salario_sem_hasta = 744.00
LET ss.salario_men_hasta = 3224.01
LET ss.porc_pat = 64.68 #51.17
ELSE
SELECT salario_sem_hasta, salario_men_hasta, porc_emp, porc_pat
INTO ss.salario_sem_hasta, ss.salario_men_hasta, ss.porc_emp,
ss.porc_pat
FROM notb00006
WHERE salario_sem_hasta = salario_semanal
END IF
END IF
END IF
# Busca la cuota de seguro social que debe pagar el empleado segun los ingresos
# que obtuvo en el mes, si es la ultima nomina del mes.
IF ultima_semana_mes = "S" THEN
IF datos_nomi.tipo_emp = "S" THEN
LET ingresos_empleado = movi_emp[1].valor + otros_ing + acum_ing_mes
LET salario_semanal = 0
SELECT salario_sem_hasta INTO salario_semanal
FROM notb00006
WHERE salario_men_desde <= ingresos_empleado and
salario_men_hasta >= ingresos_empleado
IF status = notfound THEN
LET ss.porc_emp = 23.10
LET ss.salario_sem_hasta = 744.00
LET ss.salario_men_hasta = 3224.01
LET ss.porc_pat = 64.68 #51.17
ELSE
SELECT salario_sem_hasta, salario_men_hasta, porc_emp, porc_pat
INTO ss.salario_sem_hasta, ss.salario_men_hasta, ss.porc_emp,
ss.porc_pat
FROM notb00006
WHERE salario_sem_hasta = salario_semanal
END IF
END IF
IF datos_nomi.tipo_emp = "Q" THEN
LET ingresos_empleado = movi_emp[1].valor + otros_ing + acum_ing_mes
LET salario_semanal = 0
SELECT salario_sem_hasta INTO salario_semanal
FROM notb00006
WHERE salario_men_desde <= ingresos_empleado and
salario_men_hasta >= ingresos_empleado
IF status = notfound THEN
LET ss.porc_emp = 13.03
LET ss.salario_sem_hasta = 744.00
LET ss.salario_men_hasta = 3224.01
LET ss.porc_pat = 64.68 #51.17
ELSE
SELECT salario_sem_hasta, salario_men_hasta, porc_emp, porc_pat
INTO ss.salario_sem_hasta, ss.salario_men_hasta, ss.porc_emp,
ss.porc_pat
FROM notb00006
WHERE salario_sem_hasta = salario_semanal
END IF
END IF
END IF
# Determina la cuota de seguro social, si es la ultima nomina del mes
IF ultima_semana_mes = "S" THEN
IF datos_nomi.tipo_emp = "S" THEN
LET cuota_ss = ss.porc_emp * semanas_mes - acum_mes_ss
LET cuota_ss_pa = ss.porc_pat * semanas_mes
LET idx = idx + 1
LET movi_emp[idx].clase_mov = "D"
LET movi_emp[idx].cod_mov = datos_mov.cod_mov
LET movi_emp[idx].valor = cuota_ss * -1
LET idx = idx + 1
LET movi_emp[idx].clase_mov = "T"
LET movi_emp[idx].cod_mov = 98
LET movi_emp[idx].valor = cuota_ss_pa
END IF
IF datos_nomi.tipo_emp = "Q" THEN
LET cuota_ss = ss.porc_emp * semanas_mes - acum_mes_ss
LET cuota_ss_pa = ss.porc_pat * semanas_mes
LET idx = idx + 1
LET movi_emp[idx].clase_mov = "D"
LET movi_emp[idx].cod_mov = datos_mov.cod_mov
LET movi_emp[idx].valor = cuota_ss * -1
LET idx = idx + 1
LET movi_emp[idx].clase_mov = "T"
LET movi_emp[idx].cod_mov = 98
LET movi_emp[idx].valor = cuota_ss_pa
END IF
END IF
# Determina la cuota de seguro social, si no es la ultima nomina del mes
IF ultima_semana_mes = "N" THEN
IF datos_nomi.tipo_emp = "S" THEN
LET cuota_ss = ss.porc_emp
LET cuota_ss_pa = 0 #ss.porc_pat
LET idx = idx + 1
LET movi_emp[idx].clase_mov = "T"
LET movi_emp[idx].cod_mov = 98
LET movi_emp[idx].valor = cuota_ss_pa
LET idx = idx + 1
LET movi_emp[idx].clase_mov = "D"
LET movi_emp[idx].cod_mov = datos_mov.cod_mov
LET movi_emp[idx].valor = cuota_ss * -1
END IF
IF datos_nomi.tipo_emp = "Q" THEN
LET cuota_ss = ss.porc_emp * 2
LET cuota_ss_pa = 0 #ss.porc_pat * 2
LET idx = idx + 1
LET movi_emp[idx].clase_mov = "D"
LET movi_emp[idx].cod_mov = datos_mov.cod_mov
LET movi_emp[idx].valor = cuota_ss * -1
LET idx = idx + 1
LET movi_emp[idx].clase_mov = "T"
LET movi_emp[idx].cod_mov = 98
LET movi_emp[idx].valor = cuota_ss_pa
END IF
END IF
END IF
LET ss.porc_emp = 0.00
LET ss.salario_sem_hasta = 0.00
LET ss.salario_men_hasta = 0.00
LET ss.porc_pat = 0.00
LET salario_semanal = 0.00
LET cuota_ss_pa = 0.00
#------------------------------------------------------------------------------
# FIN DEL CALCULO PARA EL PAGO DEL SEGURO SOCIAL
#------------------------------------------------------------------------------
LABEL salta:
LET l = 11
FOR p = 1 TO 25
IF l < 25 THEN
DISPLAY " " at l,3
DISPLAY " " at l,7
DISPLAY " " at l,20
LET l = l + 1
END IF
END FOR
LET l = 11
FOR p = 1 TO idx
IF movi_emp[p].cod_mov is not null THEN
FOR t = 1 TO idx1
LET nombre_mov = null
IF movi_emp[p].cod_mov = desp_mov[t].cod_mov THEN
LET nombre_mov = desp_mov[t].descrip_mov
EXIT FOR
END IF
END FOR
IF l < 25 THEN
DISPLAY movi_emp[p].cod_mov using "&&" at l,3
DISPLAY nombre_mov at l,7
DISPLAY movi_emp[p].cantidad using "##,###.##" at l,40
DISPLAY movi_emp[p].valor using "##,###.##" at l,50
LET l = l + 1
END IF
END IF
END FOR
# Insertar los movimientos del empleado en memoria
FOR p = 1 TO idx
# Caso particular para prestamo cooperativa, farmacia y plaza lama
# Tiene que el movimiento no sea el movimiento 11 porque esta en la tabla
# notb00014 que es donde estan los codigos que se balancean y se puso este
# codigo de movimiento en esta tabla para el proceso de fin de ano de nomina
IF movi_emp[p].cod_mov != 11 THEN
SELECT * FROM notb00014
WHERE @cod_mov = movi_emp[p].cod_mov
IF status != notfound THEN
SELECT sum(valor) INTO p_valor FROM notb00008
WHERE num_emp = datos_emp.num_emp and
cod_mov = movi_emp[p].cod_mov
IF p_valor <= 0 THEN
LET movi_emp[p].num_emp = null
LET movi_emp[p].cod_mov = null
LET movi_emp[p].valor = 0
END IF
IF p_valor < movi_emp[p].valor THEN
LET movi_emp[p].valor = p_valor
END IF
IF movi_emp[p].cod_mov = 12 THEN
LET interes = p_valor * porciento
LET movi_emp[p].valor = movi_emp[p].valor
IF datos_nomi.tipo_emp = "Q" THEN
LET interes = interes / 100
END IF
IF interes > 0 THEN
LET interes = interes * -1
END IF
CASE
WHEN movi_emp[p].cod_mov = 12
LET p_codigo = 110
EXIT CASE
WHEN movi_emp[p].cod_mov = 13
LET p_codigo = 111
EXIT CASE
WHEN movi_emp[p].cod_mov = 19
LET p_codigo = 112
EXIT CASE
END CASE
# Vacaciones Colectivas
IF vacaciones = "S" THEN
LET interes = interes * semanas
END IF
#----------------------------------------------------------------------------
# Inserta los intereses de los perstamos como un movimiento en la
# nomina, el codigo de los interes es el 110
IF movi_emp[p].valor != 0 THEN
INSERT INTO notb00008
VALUES (datos_nomi.num_nomi,datos_nomi.tipo_emp,
datos_emp.num_emp,datos_emp.departamento,datos_emp.nivel_emp,
datos_emp.cod_puesto,p_fecha_al,
p_codigo,movi_emp[p].cantidad,interes,
movi_emp[p]=clase_mov,null,user,current,null,null)
END IF
END IF
END IF
# Si el movimiento es de prestamo farmacia o plaza lama
# Si el valor pendiente de estos prestamos esta saldado no inserta el movimiento
IF movi_emp[p].cod_mov = 13 or
movi_emp[p].cod_mov = 19 THEN
IF p_valor <= 0 THEN
LET movi_emp[p].num_emp = null
END IF
END IF
#----------------------------------------------------------------------------
# Cuando el movimiento es de prestamo cooperativa chequea que el valor con
# el 1% sea menor o igual que cero para no insertar movimiento en la tabla
IF movi_emp[p].valor <= 0 THEN
LET movi_emp[p].num_emp = null
END IF
#-------------------------------------------------------------------------
END IF
IF movi_emp[p].cod_mov != 0 and movi_emp[p].cod_mov is not null THEN
IF movi_emp[p].clase_mov = "D" or movi_emp[p].clase_mov = "R" or
movi_emp[p].clase_mov = "S" THEN
LET movi_emp[p].clase_mov = "D"
IF movi_emp[p].valor > 0 THEN
LET movi_emp[p].valor = movi_emp[p].valor * -1
END IF
END IF
IF movi_emp[p].valor is null THEN
LET movi_emp[p].valor = 0
END IF
#------------------------------------------------------------------------
IF movi_emp[p].valor != 0 THEN
IF vacaciones = "S" THEN
IF movi_emp[p].cod_mov = 22 THEN
LET movi_emp[p].valor = movi_emp[p].valor * semanas
END IF
END IF
# --------------------------------- 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
VALUES (datos_nomi.num_nomi,datos_nomi.tipo_emp,
datos_emp.num_emp,datos_emp.departamento,datos_emp.nivel_emp,
datos_emp.cod_puesto,p_fecha_al,
movi_emp[p].cod_mov,movi_emp[p].cantidad,movi_emp[p].valor,
movi_emp[p].clase_mov,null,user,current,null,null)
IF movi_emp[p].cod_mov = 32 OR movi_emp[p].cod_mov = 31 OR
movi_emp[p].cod_mov = 33 THEN
INSERT INTO notb00008
VALUES (datos_nomi.num_nomi,datos_nomi.tipo_emp,
datos_emp.num_emp,datos_emp.departamento,datos_emp.nivel_emp,
datos_emp.cod_puesto,p_fecha_al,
1,0,0,
movi_emp[p].clase_mov,null,user,current,null,null)
END IF
END IF
END IF
END FOR
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,user,current,null,null)
LET l = 11
FOR p = 1 TO idx
IF movi_emp[p].cod_mov is not null THEN
FOR t = 1 TO idx1
LET nombre_mov = null
IF movi_emp[p].cod_mov = desp_mov[t].cod_mov THEN
LET nombre_mov = desp_mov[t].descrip_mov
EXIT FOR
END IF
END FOR
IF l < 25 THEN
DISPLAY movi_emp[p].cod_mov using "&&" at l,3
DISPLAY nombre_mov at l,7
DISPLAY movi_emp[p].cantidad using "##,###.##" at l,40
DISPLAY movi_emp[p].valor using "##,###.##" at l,50
LET l = l + 1
END IF
END IF
END FOR
FOR i = 1 TO idx
LET movi_emp[i].num_emp = null
LET movi_emp[i].cod_mov = null
LET movi_emp[i].valor = null
END FOR
END WHILE
END FUNCTION
FUNCTION renta_regalia()
SELECT sum(@valor) INTO valor_renta
FROM notb00008
WHERE @num_emp = datos_emp.num_emp and
clase_mov in ("I","E")
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