Files
MBS/PROYECTO/nodir/Copy of noprmt008.4gl
T

1773 lines
58 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
------------------------------------------------------------------------
}
GLOBALS
"noprgb000.4gl"
DEFINE calcula,calcula_tss CHAR(1),
ch_numero CHAR(3)
DEFINE p_mes1,numero_nomina,num_van,tiempo,semanas,p_mes,p_ano SMALLINT
DEFINE valor_tss_emp,valor_tss_cia,salario_tss,otros_ing_tss,ing_regal,factor,renta_p,val_bonifica,valor_renta DECIMAL(12,2)
DEFINE ch_num CHAR(4)
DEFINE porc_dias,dias,meses,porc_emp,porc_cia DECIMAL(8,2)
DEFINE num_ch CHAR(4)
DEFINE numero INTEGER
DEFINE empleados CHAR(500)
DEFINE porciento DECIMAL(9,4)
DEFINE interes,p_valor,p_cantidad,salario_h,renta_pagada_15,renta_pagada_20,
renta_pagada_27,renta_15,renta_20,renta_27,renta_30,porc_extras,valor_bonif,
valor_regal,renta_boni,valor_bonif1,sueldo_boni,renta_pagada,
valor_vacacion DECIMAL(12,2)
DEFINE t,p_codigo,dia,k,p,idx1 INTEGER
DEFINE k1,vacaciones,hay1,hay,bonifica,regalia,p_tipo,encontre,opt1,
retorne CHAR(1)
DEFINE p_fecha_del,p_fecha_al DATE
DEFINE horas INTERVAL HOUR TO MINUTE
DEFINE nombre_mov CHAR(30)
DEFINE t_cantidad_35,t_cantidad_100,horas_ex,sueldo_h,p_h_normal,otros_ing
DECIMAL(8,2)
DEFINE t_horas_ex,horas_35,horas_100,t_horas_35,t_horas_100,acumulado,renta
DECIMAL(12,2)
DEFINE sueldo,sueldo_renta,p_sueldo,salario_semanal DECIMAL(12,2)
DEFINE ingresos_empleado, acum_mes_ss, cuota_ss, acum_ing_mes DECIMAL(12,2)
DEFINE ultima_semana_mes CHAR(1)
DEFINE fecha_ini_mes DATE
DEFINE semanas_mes, ult_nomi_mes INTEGER
DEFINE ss RECORD
salario_sem_hasta LIKE notb00006.salario_sem_hasta,
salario_men_hasta LIKE notb00006.salario_men_hasta,
porc_emp LIKE notb00006.porc_emp,
porc_pat LIKE notb00006.porc_pat
END RECORD
DEFINE globales RECORD
cod_mov SMALLINT,
cantidad_emp LIKE notb00002.cantidad_emp,
clase_mov CHAR(1)
END RECORD
DEFINE h_extras RECORD
fecha DATE,
entrada DATETIME HOUR TO MINUTE,
salida DATETIME HOUR TO MINUTE,
extra_35 INTERVAL HOUR TO MINUTE,
extra_100 INTERVAL HOUR TO MINUTE
END RECORD
DEFINE movi RECORD
cod_mov SMALLINT,
valor DECIMAL(10,2)
END RECORD
DEFINE desp_mov ARRAY[100] OF RECORD
clasifica CHAR(1),
cod_mov SMALLINT,
descrip_mov CHAR(30)
END RECORD
DEFINE datos_nomi RECORD
num_nomi LIKE notb00010.num_nomi,
tipo_emp LIKE notb00010.tipo_emp
END RECORD
DEFINE datos_emp RECORD
num_emp LIKE adtb00003.num_emp,
departamento LIKE adtb00003.departamento,
nivel_emp LIKE adtb00003.nivel_emp,
cod_puesto LIKE adtb00003.cod_puesto,
nom1_emp LIKE adtb00003.nom1_emp,
apell1_emp LIKE adtb00003.apell1_emp,
sueldo LIKE adtb00003.sueldo_ac,
paga_seg LIKE adtb00003.paga_seg,
fecha DATE
END RECORD
DEFINE datos_mov RECORD
cod_mov LIKE notb00002.cod_mov,
clase_mov LIKE notb00002.clase_mov,
cantidad LIKE notb00002.cantidad_emp,
valor LIKE notb00007.valor,
cantidad_emp LIKE notb00002.cantidad_emp,
cantidad_cia LIKE notb00002.cantidad_cia
END RECORD
DEFINE movi_emp ARRAY [52] OF RECORD
num_emp SMALLINT,
cod_mov LIKE notb00002.cod_mov,
clase_mov CHAR(1),
cantidad LIKE notb00002.cantidad_emp,
valor LIKE notb00007.valor
END RECORD
FUNCTION noprmt008()
CLEAR SCREEN
CALL pantalla()
OPTIONS
FORM LINE 9,
PROMPT LINE 12,
ERROR LINE 24,
COMMENT LINE 23
DISPLAY "noprmt008" AT 4,3
DISPLAY "Generacion de nomina" AT 6,30
LET p_formulario = formulario CLIPPED,"nofmmt008"
OPEN FORM nofmmt008 FROM "nofmmt008"
DISPLAY FORM nofmmt008
# Seccion de captura de informacion general de la generacion de
# la nomina
LET int_flag = false
INPUT BY NAME datos_nomi.*
AFTER FIELD num_nomi
IF datos_nomi.num_nomi IS NULL THEN
LET numero_msg = 16
CALL msg(numero_msg)
NEXT FIELD num_nomi
END IF
AFTER FIELD tipo_emp
IF datos_nomi.tipo_emp IS NULL THEN
LET numero_msg = 16
CALL msg(numero_msg)
NEXT FIELD tipo_emp
END IF
# Busqueda del periodo comprendido de la nomina
SELECT fecha_del,fecha_al,h_normal,mes,ano,num_sem INTO
p_fecha_del,p_fecha_al,p_h_normal,p_mes1,p_ano,semanas_mes
FROM notb00010
WHERE num_nomi = datos_nomi.num_nomi and
tipo_emp = datos_nomi.tipo_emp
and status_t is null
IF status = notfound THEN
LET numero_msg = 199
CALL msg(numero_msg)
NEXT FIELD num_nomi
END IF
DISPLAY BY NAME p_fecha_del,p_fecha_al ATTRIBUTE (BOLD)
LET ch_num = datos_nomi.num_nomi
LET numero = datos_nomi.num_nomi
LET num_van= datos_nomi.num_nomi
LET p_mes = MONTH(p_fecha_al)
LET ch_numero = datos_nomi.num_nomi USING "&&&"
LET numero = ch_numero[2,3]
IF datos_nomi.tipo_emp = "Q" THEN
LET numero = 24 - numero + 1
# LET numero = 24
LET porciento = 0.50
END IF
IF datos_nomi.tipo_emp = "V" THEN
LET numero = numero - 100
LET numero = 24 - numero
LET porciento = 1.00
END IF
IF datos_nomi.tipo_emp = "S" THEN
LET numero = numero - 100
LET numero = 53 - numero
LET porciento = 0.0025
END IF
#------------------------------------------------------------------------------
# Determina si es la ultima nomina del mes
#------------------------------------------------------------------------------
LET ultima_semana_mes = NULL
SELECT MAX(num_nomi) INTO ult_nomi_mes
FROM notb00010
WHERE tipo_emp = datos_nomi.tipo_emp AND
mes = p_mes1 AND
ano = p_ano
IF datos_nomi.num_nomi = ult_nomi_mes THEN
LET ultima_semana_mes = "S"
ELSE
LET ultima_semana_mes = "N"
END IF
IF ultima_semana_mes = "S" THEN
SELECT MIN(fecha_del) INTO fecha_ini_mes
FROM notb00010
WHERE tipo_emp = datos_nomi.tipo_emp AND
mes = p_mes1 AND
ano = p_ano
END IF
LET ss.porc_emp = 0.00
LET ss.salario_sem_hasta = 0.00
LET ss.salario_men_hasta = 0.00
LET ss.porc_pat = 0.00
LET salario_semanal = 0.00
AFTER INPUT
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
LET int_flag = false
RETURN
END IF
EXIT INPUT
END INPUT
# Preparacion para busqueda por rango de departamento y rango de ficha del
# empleado
CONSTRUCT criterio ON departamento,num_emp FROM departamento,num_emp
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
LET int_flag = false
RETURN
END IF
CLEAR SCREEN
PROMPT
"ESTA SEGURO DE GENERAR DE NUEVO LA NOMINA (S/N) " FOR CHAR opt1
LET opt1= upshift(opt1)
IF opt1 != "S" THEN
RETURN
END IF
PROMPT
"ESTA NOMINA ES DE REGALIA (S/N) " FOR CHAR regalia
LET regalia = upshift(regalia)
PROMPT
"ESTA NOMINA ES DE VACACIONES COLECTIVAS (S/N) " FOR CHAR vacaciones
LET vacaciones = upshift(vacaciones)
PROMPT
"ESTA NOMINA ES DE BONIFICACION (S/N) " FOR CHAR opt2
LET opt2= upshift(opt2)
DISPLAY "Borrando Nomina... Espere Por Favor" AT 24,1
ATTRIBUTE (BOLD)
DELETE FROM notb00008 WHERE num_nomi = datos_nomi.num_nomi and
tipo_emp = datos_nomi.tipo_emp
# CALL second_scr()
LET p_formulario = formulario CLIPPED, "nofmmt108"
OPEN FORM nofmmt108 FROM "nofmmt108"
DISPLAY FORM nofmmt108
DECLARE tinti CURSOR FOR
SELECT cod_mov,descrip_mov FROM notb00002
ORDER BY 1
LET idx1 = 1
FOREACH tinti INTO desp_mov[idx1].cod_mov,desp_mov[idx1].descrip_mov
IF regalia = "S" or opt2 = "S" THEN
LET desp_mov[idx1].clasifica = "N"
ELSE
LET desp_mov[idx1].clasifica = "S"
END IF
LET scr_l = scr_line()
LET idx1 = idx1 + 1
END FOREACH
CALL set_count(idx1 -1)
INPUT ARRAY desp_mov WITHOUT DEFAULTS FROM s_mov.*
AFTER INPUT
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
LET int_flag = false
RETURN
END IF
EXIT INPUT
END INPUT
CLEAR SCREEN
CALL pantalla()
DISPLAY "noprmt008" AT 4,2
DISPLAY "Generacion de nomina" AT 6,32
# Preparacion de la busqueda de los empleados dependiendo del criterio de
# seleccion
IF datos_nomi.tipo_emp = "S" THEN
LET empleados = "SELECT a.num_emp,a.departamento,a.nivel_emp,a.cod_puesto,a.nom1_emp,",
"a.apell1_emp,a.sueldo_ac,a.paga_seg,a.fech_efec ",
"FROM adtb00003 a ",
" WHERE ",
" a.nomina = ? ",
" AND a.fech_efec <= ? ",
" AND (a.status_t is null or ",
" a.status_t = 'I') ",
"ORDER BY 1"
ELSE
LET empleados = "SELECT a.num_emp,a.departamento,a.nivel_emp,a.cod_puesto,a.nom1_emp,",
"a.apell1_emp,a.sueldo_ac,a.paga_seg,a.fech_efec ",
"FROM adtb00003 a ",
" WHERE ",
" a.nomina = ? ",#" and a.num_emp = 144 ",
" AND a.fech_efec <= ? ",
" AND (a.status_t is null or ",
" a.status_t = 'I') ",
"ORDER BY 1"
END IF
PREPARE comando FROM empleados
DECLARE busca SCROLL CURSOR FOR comando
OPEN busca USING datos_nomi.tipo_emp,p_fecha_al
WHILE STATUS != NOTFOUND
FETCH busca INTO datos_emp.*
IF status = notfound THEN
EXIT WHILE
END IF
LET meses = (p_fecha_al - datos_emp.fecha)
LET salario_tss = datos_emp.sueldo # SEGURIDAD SOCIAL
LET meses = meses / 30
FOR t = 1 TO 12
LET movi_emp[t].num_emp = null
LET movi_emp[t].cod_mov = null
LET movi_emp[t].clase_mov = null
LET movi_emp[t].cantidad = null
LET movi_emp[t].valor = null
END FOR
IF regalia != "S" THEN
# Busca los acumulados de ingresos de los empleados
SELECT sum(a.valor) INTO acumulado from notb00008 a WHERE a.status_t is null and
a.clase_mov in ("I","E") and
a.num_emp = datos_emp.num_emp and
a.fecha between fecha_ini_mes and p_fecha_al
display "Acumulado ", acumulado
END IF
IF acumulado is null THEN
LET acumulado = 0
END IF
DISPLAY "No. Ficha: " at 8,3
DISPLAY datos_emp.num_emp using "&&&" at 8,15
DISPLAY datos_emp.nom1_emp clipped," ",datos_emp.apell1_emp at 8,20
DISPLAY "Acumulado Antes de esta Nomina:" at 9,3
LET sueldo_renta = 0
LET movi_emp[1].cod_mov = 1
LET movi_emp[1].clase_mov = "I"
# Calculo del sueldo normal semanal
IF datos_nomi.tipo_emp = "S" THEN
LET salario_h = datos_emp.sueldo / 190.60
LET p_sueldo = datos_emp.sueldo
LET datos_emp.sueldo = (datos_emp.sueldo / 190.60) *
p_h_normal
LET sueldo_boni = datos_emp.sueldo
END IF
# Calculo del sueldo normal quincenal
IF datos_nomi.tipo_emp = "Q" THEN
LET p_sueldo = datos_emp.sueldo
LET datos_emp.sueldo = datos_emp.sueldo / 2
LET salario_h = datos_emp.sueldo / 95.33
LET sueldo_boni = datos_emp.sueldo
END IF
IF datos_nomi.tipo_emp = "V" THEN
LET sueldo_boni = datos_emp.sueldo
END IF
#-----------------------------------------------------------------------------
LET movi_emp[1].cantidad = p_h_normal
LET movi_emp[1].valor = datos_emp.sueldo
LET sueldo_renta = sueldo_renta + movi_emp[1].valor
FOR i = 1 to idx1
IF movi_emp[i].cod_mov = desp_mov[i].cod_mov THEN
IF desp_mov[i].clasifica = "N"
THEN
LET movi_emp[1].valor = 0
LET movi_emp[1].cantidad = 0
LET sueldo_renta = 0
END IF
END IF
END FOR
# Busqueda de la tabla de novedades cuando la nomina no es de bonificacion
IF opt2 != "S" THEN
DECLARE busca1 CURSOR FOR
SELECT a.cod_mov,b.clase_mov,a.cantidad,a.valor,b.cantidad_emp,cantidad_cia,
b.ch_encabeza
FROM notb00003 a,notb00002 b
WHERE
a.num_emp = datos_emp.num_emp and
a.departamento = datos_emp.departamento and
a.status_t is null and
a.cod_mov = b.cod_mov
UNION
SELECT a.cod_mov,b.clase_mov,a.cantidad,a.valor,b.cantidad_emp,cantidad_cia,
b.ch_encabeza
FROM notb00007 a,notb00002 b
WHERE a.num_nomi = datos_nomi.num_nomi and
a.num_emp = datos_emp.num_emp and
a.tipo_emp = datos_nomi.tipo_emp and
a.departamento = datos_emp.departamento and
a.status_t is null and
a.cod_mov = b.cod_mov
ORDER BY 1
END IF
# Busca de la tabla de novedades si la nomina es de bonificacion
IF opt2 = "S" THEN
DECLARE busca2 CURSOR FOR
SELECT a.cod_mov,b.clase_mov,a.cantidad,a.valor,b.cantidad_emp,cantidad_cia,
b.ch_encabeza
FROM notb00007 a,notb00002 b
WHERE a.num_nomi = datos_nomi.num_nomi and
a.num_emp = datos_emp.num_emp and
a.tipo_emp = datos_nomi.tipo_emp and
a.departamento = datos_emp.departamento and
a.status_t is null and
a.cod_mov = b.cod_mov
ORDER BY 1
END IF
LET modifica = "N"
LET encontre = "N"
LET bonifica = "N"
LET idx = 2
# Para buscar codigos de las nominas normales
IF opt2 = "N" THEN
FOREACH busca1 INTO datos_mov.*
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
LET int_flag = false
RETURN
END IF
# Chequea los movimientos que son balanceados
# Tiene que el movimiento no sea el movimiento 11 porque esta en la tabla
# notb00014 que es donde estan los codigos que se balancean y se puso este
# codigo de movimiento en esta tabla para el proceso de fin de ano de nomina
IF datos_mov.cod_mov != 11 THEN
SELECT a.* FROM notb00014 a
WHERE a.cod_mov = datos_mov.cod_mov
IF status != notfound THEN
SELECT SUM(a.valor) INTO p_valor FROM notb00008 a
WHERE a.num_emp = datos_emp.num_emp and
a.cod_mov = datos_mov.cod_mov
IF status = notfound THEN
LET status = 0
END IF
IF p_valor <= 0 THEN
CONTINUE FOREACH
END IF
END IF
END IF
# Chequea que el codigo tenga la opcion de que si lo quieren generar
FOR i = 1 to idx1
IF datos_mov.cod_mov = desp_mov[i].cod_mov THEN
IF desp_mov[i].clasifica = "N" or desp_mov[i].clasifica is null
THEN
CONTINUE FOREACH
END IF
END IF
END FOR
IF datos_mov.cod_mov != 1 THEN
LET movi_emp[idx].clase_mov = datos_mov.clase_mov
LET movi_emp[idx].cod_mov = datos_mov.cod_mov
END IF
# Calculo de las horas trabajadas en la jornada
# Esto solo lo calcula cuando el usuario poporciona la informacion de las
# horas trabajadas durante el periodo como una novedad
IF datos_mov.cod_mov = 1 THEN
#datos_mov.cod_mov = 9 THEN
LET modifica = "S"
LET sueldo_renta = 0
LET movi_emp[1].cod_mov = datos_mov.cod_mov
LET movi_emp[1].clase_mov = datos_mov.clase_mov
# El 190.60 es para calcular el sueldo por hora
IF datos_mov.cantidad > 0 THEN
LET movi_emp[1].cantidad = datos_mov.cantidad
LET movi_emp[1].valor = (p_sueldo / 190.60) *
datos_mov.cantidad
END IF
IF datos_mov.cantidad = 0 and
datos_mov.cod_mov = 1 THEN
LET movi_emp[1].valor = 0
LET movi_emp[1].cantidad = 0
END IF
IF datos_mov.valor > 0 THEN
LET movi_emp[1].valor = datos_mov.valor
END IF
LET sueldo_renta = sueldo_renta + movi_emp[1].valor
END IF
IF datos_mov.cod_mov > 1 THEN
{
IF datos_mov.cod_mov = 9 THEN
CONTINUE FOREACH
END IF
}
IF datos_mov.cod_mov = 33 THEN
LET bonifica = "S"
END IF
# Cuando el valor o la cantiad tienen algun valor se quedara este valor
# en la variable de asignacion
LET movi_emp[idx].cantidad = datos_mov.cantidad
LET movi_emp[idx].valor = datos_mov.valor
# Cuando es comida, desayuno, cena
IF datos_mov.cantidad_emp > 0 and datos_mov.clase_mov = "D" THEN
LET movi_emp[idx].valor = (datos_mov.cantidad_emp +
datos_mov.cantidad_cia) *
datos_mov.cantidad
LET movi_emp[idx].cantidad = datos_mov.cantidad
END IF
# Calculo incentivo asistencia
IF movi_emp[idx].cod_mov = 9 THEN
IF datos_mov.cantidad > 0 THEN
LET movi_emp[idx].valor = salario_h * movi_emp[idx].cantidad
ELSE
LET movi_emp[idx].valor = datos_mov.valor
END IF
END IF
# Calculo de las horas extras
IF movi_emp[idx].clase_mov = "E" THEN
SELECT a.cantidad_cia INTO porc_extras FROM notb00002 a
WHERE a.cod_mov = movi_emp[idx].cod_mov
LET movi_emp[idx].valor = salario_h * ((porc_extras / 100) + 1)
LET movi_emp[idx].valor = movi_emp[idx].valor * datos_mov.cantidad
END IF
LET idx = idx + 1
END IF
END FOREACH
END IF
LET hay1 = "N"
FOR i = 1 TO idx
IF movi_emp[i].cod_mov = 32 THEN
LET hay1 = "S"
LET valor_regal = movi_emp[i].valor
END IF
END FOR
IF hay1 = "N" THEN
# Nomina de Regalia Pascual
IF regalia = "S" THEN
LET idx = idx + 1
LET movi_emp[idx].cod_mov = 32
LET movi_emp[idx].valor = p_sueldo
IF year(p_fecha_al) = year(datos_emp.fecha) THEN
LET p_mes = month(datos_emp.fecha)
SELECT dias_prod INTO dias FROM mestable
WHERE mes = p_mes
LET porc_dias = (dias - day(datos_emp.fecha)) / dias
LET p_mes = 12 - month(datos_emp.fecha)
LET porc_dias = porc_dias + p_mes
LET movi_emp[idx].valor = (p_sueldo / 12) * porc_dias
END IF
LET movi_emp[idx].cantidad = porc_dias
LET valor_regal = movi_emp[idx].valor
LET movi_emp[idx].clase_mov = "I"
END IF
END IF
# Para Cuando la nomina es de bonificacion
IF opt2 = "S" THEN
FOREACH busca2 INTO datos_mov.*
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
LET int_flag = false
RETURN
END IF
# Chequea los movimientos que son balanceados
# Tiene que el movimiento no sea el movimiento 11 porque esta en la tabla
# notb00014 que es donde estan los codigos que se balancean y se puso este
# codigo de movimiento en esta tabla para el proceso de fin de ano de nomina
IF datos_mov.cod_mov != 11 THEN
SELECT a.* FROM notb00014 a
WHERE a.cod_mov = datos_mov.cod_mov
IF status != notfound THEN
SELECT SUM(a.valor) INTO p_valor FROM notb00008 a
WHERE a.num_emp = datos_emp.num_emp and
a.cod_mov = datos_mov.cod_mov
IF status = notfound THEN
LET status = 0
END IF
IF p_valor <= 0 THEN
CONTINUE FOREACH
END IF
END IF
END IF
# Chequea que el codigo tenga la opcion de que si lo quieren generar
FOR i = 1 to idx1
IF datos_mov.cod_mov = desp_mov[i].cod_mov THEN
IF desp_mov[i].clasifica = "N" or desp_mov[i].clasifica is null
THEN
CONTINUE FOREACH
END IF
END IF
END FOR
IF datos_mov.cod_mov != 1 THEN
LET movi_emp[idx].clase_mov = datos_mov.clase_mov
LET movi_emp[idx].cod_mov = datos_mov.cod_mov
END IF
# Calculo de las horas trabajadas en la jornada
# Esto solo lo calcula cuando el usuario poporciona la informacion de las
# horas trabajadas durante el periodo como una novedad
IF datos_mov.cod_mov = 1 or
datos_mov.cod_mov = 9 THEN
LET modifica = "S"
LET sueldo_renta = 0
LET movi_emp[1].cod_mov = datos_mov.cod_mov
LET movi_emp[1].clase_mov = datos_mov.clase_mov
# El 190.60 es para calcular el sueldo por hora
IF datos_mov.cantidad > 0 THEN
LET movi_emp[1].cantidad = datos_mov.cantidad
LET movi_emp[1].valor = (p_sueldo / 190.60) *
datos_mov.cantidad
END IF
IF datos_mov.cantidad = 0 and
datos_mov.cod_mov = 1 THEN
LET movi_emp[1].valor = 0
LET movi_emp[1].cantidad = 0
END IF
IF datos_mov.valor > 0 THEN
LET movi_emp[1].valor = datos_mov.valor
END IF
LET sueldo_renta = sueldo_renta + movi_emp[1].valor
END IF
IF datos_mov.cod_mov > 1 THEN
IF datos_mov.cod_mov = 9 THEN
CONTINUE FOREACH
END IF
IF datos_mov.cod_mov = 33 THEN
LET bonifica = "S"
END IF
# Cuando el valor o la cantiad tienen algun valor se quedara este valor
# en la variable de asignacion
LET movi_emp[idx].cantidad = datos_mov.cantidad
LET movi_emp[idx].valor = datos_mov.valor
# Cuando es comida, desayuno, cena
IF datos_mov.cantidad_emp > 0 and datos_mov.clase_mov = "D" THEN
LET movi_emp[idx].valor = (datos_mov.cantidad_emp +
datos_mov.cantidad_cia) *
datos_mov.cantidad
LET movi_emp[idx].cantidad = datos_mov.cantidad
END IF
# Calculo incentivo asistencia
IF movi_emp[idx].cod_mov = 9 THEN
LET movi_emp[idx].valor = salario_h * movi_emp[idx].cantidad
END IF
# Calculo de las horas extras
IF movi_emp[idx].clase_mov = "E" THEN
SELECT cantidad_cia INTO porc_extras FROM notb00002
WHERE cod_mov = movi_emp[idx].cod_mov
LET movi_emp[idx].valor = salario_h * ((porc_extras / 100) + 1)
LET movi_emp[idx].valor = movi_emp[idx].valor * datos_mov.cantidad
END IF
LET idx = idx + 1
END IF
END FOREACH
END IF
# Calculo del infotep
FOR i = 1 TO idx
IF movi_emp[i].cod_mov = 33 THEN
LET idx = idx + 1
LET movi_emp[idx].cod_mov = 41
LET movi_emp[idx].clase_mov = "D"
LET movi_emp[idx].valor = movi_emp[i].valor * .005
LET movi_emp[idx].cantidad = 0
EXIT FOR
END IF
END FOR
{
IF regalia != "S" THEN
IF meses >= 3 THEN
# Incentivo al supermercado
# Chequea que el codigo tenga la opcion de que si lo quieren generar
FOR i = 1 to idx1
IF desp_mov[i].cod_mov = 4 THEN
IF desp_mov[i].clasifica = "N" or desp_mov[i].clasifica is null
THEN
GOTO salta1
END IF
END IF
END FOR
LET hay = "N"
FOR i = 1 TO idx
IF movi_emp[i].cod_mov = 4 THEN
LET hay = "S"
EXIT FOR
END IF
END FOR
IF hay = "S" THEN
GOTO salta1
END IF
LET idx = idx + 1
LET movi_emp[idx].clase_mov = "I"
LET movi_emp[idx].cod_mov = 4
LET movi_emp[idx].valor = datos_emp.sueldo * .07
# Quincenales
IF datos_nomi.tipo_emp = "Q" THEN
IF movi_emp[idx].valor > 150 THEN
LET movi_emp[idx].valor = 150
END IF
END IF
# Semanles
IF datos_nomi.tipo_emp = "S" THEN
# Este control tiene 69.23 por que es el equivalente a 300 pesos semanales
# de incentivo a supermercado
IF movi_emp[idx].valor > 69.23 THEN
LET movi_emp[idx].valor = 69.23
END IF
END IF
END IF
# Gerente General
IF datos_emp.num_emp = 148 THEN
LET movi_emp[idx].clase_mov = "I"
LET movi_emp[idx].cod_mov = 4
LET movi_emp[idx].valor = 0
END IF
END IF
}
LABEL salta1:
DISPLAY sueldo_renta at 8,60
DISPLAY acumulado at 9,60
# Busqueda de las novedades globales
DECLARE busca20 CURSOR FOR
SELECT cod_mov,cantidad_emp,clase_mov FROM notb00002
WHERE tipo_mov = "G"
FOREACH busca20 INTO globales.cod_mov,globales.cantidad_emp ,
globales.clase_mov
FOR i = 1 to idx1
IF globales.cod_mov = desp_mov[i].cod_mov THEN
IF desp_mov[i].clasifica = "N" or desp_mov[i].clasifica is null
THEN
CONTINUE FOREACH
END IF
END IF
END FOR
IF globales.clase_mov = "S" THEN
IF datos_emp.paga_seg != "S" THEN
CONTINUE FOREACH
END IF
END IF
FOR i = 1 to idx
IF globales.cod_mov = movi_emp[i].cod_mov THEN
LET movi_emp[i].clase_mov = globales.clase_mov
CONTINUE FOREACH
END IF
END FOR
# Este es el movimiento del descuento de casa club cuando es quincenal
# devide la cantidad que paga el empleado entre dos.
IF globales.cod_mov = 20 THEN
IF datos_nomi.tipo_emp = "Q" THEN
LET globales.cantidad_emp = globales.cantidad_emp / 2
END IF
END IF
LET idx = idx + 1
LET movi_emp[idx].cod_mov = globales.cod_mov
LET movi_emp[idx].valor = globales.cantidad_emp
IF vacaciones = "S" THEN
IF movi_emp[idx].cod_mov != 36 THEN
LET movi_emp[idx].valor = movi_emp[idx].valor * semanas
END IF
END IF
LET movi_emp[idx].clase_mov = globales.clase_mov
END FOREACH
# Calculo del Incentivo comida, desayuno, cena
LET p_valor = 0
FOR p = 1 TO idx
IF movi_emp[p].cod_mov != 0 and movi_emp[p].cod_mov is not null THEN
IF movi_emp[p].cod_mov = 16 or
movi_emp[p].cod_mov = 17 or
movi_emp[p].cod_mov = 18 THEN
SELECT cantidad_cia INTO p_cantidad FROM notb00002
WHERE cod_mov = movi_emp[p].cod_mov
LET p_valor = p_valor + (movi_emp[p].cantidad * p_cantidad)
END IF
END IF
END FOR
IF p_valor > 0 THEN
# Chequea que el codigo tenga la opcion de que si lo quieren generar
FOR i = 1 to idx1
IF desp_mov[i].cod_mov = 5 THEN
IF desp_mov[i].clasifica = "N" or desp_mov[i].clasifica is null
THEN
CONTINUE WHILE
END IF
END IF
END FOR
# Chequea si el codigo de incentivo almuerzo esta en novedades
# para salir del proceso en caso de que este codigo exista como novedad
FOR i = 1 to idx
IF movi_emp[i].cod_mov = 5 THEN
CONTINUE WHILE
END IF
END FOR
LET idx = idx + 1
LET movi_emp[idx].clase_mov = "I"
LET movi_emp[idx].cod_mov = 5
LET movi_emp[idx].valor = p_valor
IF datos_emp.num_emp = 148 THEN
LET movi_emp[idx].clase_mov = "I"
LET movi_emp[idx].cod_mov = 5
LET movi_emp[idx].valor = 0
END IF
END IF
#-----------------------------------------------------------------------------
# Busqueda del impuesto sobre la renta
IF acumulado is null THEN
LET acumulado = 0
END IF
LET renta = 0
# Loop para acumular los otros ingresos para el calculo de la nomina
# se le puso una condicion donde suma los otros ingresos de que solo sume
# los clase_mov = I o E que sean diferentes a el codigo 1 sueldo normal y
# 32 regalia pascual
LET otros_ing = 0
IF vacaciones = "S" THEN
LET sueldo_renta = sueldo_renta - movi_emp[1].valor
LET movi_emp[1].cantidad = 0
LET movi_emp[1].valor = 0
CALL vacaciones_colect()
END IF
FOR i = 1 TO idx
IF vacaciones = "S" THEN
IF movi_emp[i].clase_mov = "D" and
movi_emp[i].cod_mov != 23 and
movi_emp[i].cod_mov != 70 THEN
LET movi_emp[i].valor = movi_emp[i].valor * semanas
END IF
END IF
IF movi_emp[i].clase_mov = "I" or
movi_emp[i].clase_mov = "E" THEN
IF movi_emp[i].cod_mov != 1 THEN
IF vacaciones = "S" THEN
IF movi_emp[i].cod_mov != 31 THEN
IF movi_emp[i].cod_mov != 36 THEN
LET movi_emp[i].valor = movi_emp[i].valor * semanas
END IF
END IF
END IF
LET otros_ing = movi_emp[i].valor + otros_ing
END IF
END IF
END FOR
IF acumulado is null THEN
LET acumulado = 0
END IF
IF otros_ing is null THEN
LET otros_ing = 0
END IF
LET valor_renta = 0
LET valor_renta = valor_renta + acumulado + otros_ing + sueldo_renta
#-----------------------------------------------------------------------
LET calcula = "N"
SELECT *FROM notb00017
WHERE num_emp = datos_emp.num_emp
IF status != notfound THEN
LET calcula = "S"
END IF
# Calculo para cuando la nomina sea de vendedores
IF calcula = "S" THEN
SELECT valor INTO val_bonifica FROM notb00008
WHERE num_emp = datos_emp.num_emp and
cod_mov = 33 #and
# fecha > "31122004"
IF val_bonifica is null THEN
LET val_bonifica = 0
END IF
LET acumulado = acumulado - val_bonifica
LET valor_renta = sueldo_renta + acumulado + otros_ing
LET valor_renta = valor_renta / num_van
IF bonifica = "S" THEN
LET valor_renta = acumulado
LET valor_renta = (valor_renta / (p_mes - 1)) * 12
LET valor_renta = valor_renta + val_bonifica
LET valor_bonif1 = valor_renta + otros_ing
ELSE
LET valor_renta = valor_renta
LET valor_renta = valor_renta + val_bonifica
END IF
END IF
LET retorne = "S"
#------------------------------------------------------------------------
LABEL retorna:
# Si es la nomina de bonificacion
IF retorne = "N" THEN
# Acumualdo sin bonificacion
LET valor_renta = valor_bonif1
END IF
#------------------------------------------------------------------------
IF regalia != "S" THEN
# Busca el monto de regalia el incentivo de asistencia
# que el empleado reciba
# POR ORDEN DEL ING. PAULINO EN EL 2DO SELECT SE QUITO EL CODIGO DEL INCENTIVO
# NO.9 PARA SER GRAVADO POR LA RENTA.
SELECT UNIQUE num_nomi INTO numero_nomina
FROM notb00008
WHERE cod_mov = 32 and
tipo_emp = datos_nomi.tipo_emp and
num_emp = datos_emp.num_emp #and
#fecha > "31122004"
LET valor_regal = 0
SELECT sum(valor) INTO valor_regal
FROM notb00008
WHERE cod_mov in (32) and
num_emp = datos_emp.num_emp #and
#fecha > "31122004"
IF valor_regal is null THEN
LET valor_regal = 0
END IF
{
esta decision se puso en comentario porque la nomina de regalia se modifico
para que el incentivo de asistencia se sumara a la regalia y asi se pagara
menos renta.
IF valor_regal >= 10050 THEN
LET valor_regal = 10050
END IF
}
#------------------------------------------------------------------------------
# CALCULO PARA EL PAGO SEGURIDAD SOCIAL
# EL SALARIO MAXIMO COTIZABLE ES 68460.00 MENSUALES
# 29770 QUINCENALES
# 98000 26/1/2005
#------------------------------------------------------------------------------
LET otros_ing_tss = 0
LET salario_tss = salario_tss + otros_ing_tss
LET globales.cod_mov = 49
LET calcula_tss = "S"
FOR i = 1 to idx1
IF globales.cod_mov = desp_mov[i].cod_mov THEN
IF desp_mov[i].clasifica = "N" or desp_mov[i].clasifica is null
THEN
LET calcula_tss = "N"
EXIT FOR
END IF
END IF
END FOR
IF calcula_tss = "S" THEN
SELECT a.cantidad_emp / 100 INTO porc_emp
FROM notb00002 a
WHERE a.cod_mov = 49
SELECT a.cantidad_cia / 100 INTO porc_cia
FROM notb00002 a
WHERE a.cod_mov = 50
# SEGURIDAD 34230
IF salario_tss < 98000.00 THEN
LET valor_tss_emp = salario_tss * porc_emp
LET valor_tss_cia = salario_tss * porc_cia
LET valor_renta = valor_renta - valor_tss_emp
ELSE
LET valor_tss_emp = 98000.00 * porc_emp
LET valor_tss_cia = 98000.00 * porc_cia
LET valor_renta = valor_renta - valor_tss_emp
END IF
LET idx = idx + 1
LET movi_emp[idx].clase_mov = "D"
LET movi_emp[idx].cod_mov = 49
LET movi_emp[idx].valor = valor_tss_emp / 2
LET idx = idx + 1
LET movi_emp[idx].clase_mov = "T"
LET movi_emp[idx].cod_mov = 50
LET movi_emp[idx].valor = valor_tss_cia / 2
END IF
#--------------------------------------------------------------------------------
LET valor_renta = valor_renta - valor_regal
DISPLAY "2",datos_emp.num_emp, " ",valor_renta
#--------------------------------------------------------------------------------
# INICIO CALCULO DE LA RENTA
# MODIFICACION: ADICION NUEVA ESCALA DEL 30% PARA LAS PERSONAS QUE GANEN MAS DE
# 900,000.00
# FECHA : ENERO 19,2006
#--------------------------------------------------------------------------------
IF valor_renta > 23035.17 THEN
display "Emp ",datos_emp.num_emp, valor_renta
SELECT cod_mov INTO datos_mov.cod_mov FROM notb00002 WHERE
clase_mov = "R"
LET renta_15 = 0
LET renta_20 = 0
LET renta_27 = 0
LET renta_30 = 0
FOR i = 1 to idx1
IF datos_mov.cod_mov = desp_mov[i].cod_mov THEN
IF desp_mov[i].clasifica = "N" OR
desp_mov[i].clasifica IS NULL
THEN
GOTO llega
END IF
END IF
END FOR
# Loop para saber si el codigo del impuesto sea dado mediante a una novedad
FOR i = 1 TO idx
IF datos_mov.cod_mov = movi_emp[i].cod_mov THEN
LET datos_mov.clase_mov = "D"
GOTO llega
END IF
END FOR
IF numero_nomina is null THEN
LET numero_nomina = 1
END IF
{
SELECT SUM(valor) INTO renta_pagada FROM notb00008
WHERE num_emp = datos_emp.num_emp and
(cod_mov = datos_mov.cod_mov or
cod_mov = 70) and num_nomi != numero_nomina and
fecha BETWEEN fecha_ini> "31122004"
}
IF renta_pagada is null THEN
LET renta_pagada = 0
END IF
IF renta_pagada < 0 THEN
LET renta_pagada = renta_pagada * -1
END IF
# Renta al 15 %
IF valor_renta >= 23035.17 and valor_renta <= 34552.66 THEN
LET valor_renta = valor_renta - 23035.17
LET renta = valor_renta * .15
LET renta_15 = renta
ELSE
LET renta = ((34552.66-23035.17) * .15)
LET renta_15 = renta
END IF
# Renta al 20 %
IF valor_renta > 34552.66 AND valor_renta <= 47989.83 THEN
LET valor_renta = valor_renta - 34552.66
LET renta = valor_renta * .20
LET renta_20 = renta
ELSE
IF valor_renta > 32160 THEN
LET renta = ((47989.83-34552.66) * .20)
LET renta_20 = renta
END IF
END IF
# Renta al 25 %
IF valor_renta > 47989.83 AND valor_renta <= 75000 THEN
LET valor_renta = valor_renta - 47989.83
LET renta = valor_renta * .25
LET renta_27 = renta
ELSE
IF valor_renta > 44666.67 THEN
LET renta = ((75000-47989.83) * .25)
LET renta_27 = renta
END IF
END IF
# Renta al 30%
IF valor_renta > 75000 THEN
LET valor_renta = valor_renta - 75000
LET renta = valor_renta * .30
LET renta_30 = renta
END IF
IF renta_15 is null THEN
LET renta_15 = 0
END IF
IF renta_30 is null THEN
LET renta_30 = 0
END IF
IF renta_20 is null THEN
LET renta_20 = 0
END IF
IF renta_27 is null THEN
LET renta_27 = 0
END IF
LET renta = renta_15 + renta_20 + renta_27 + renta_30
IF opt2 != "S" THEN
IF datos_nomi.tipo_emp = "S" THEN
LET p_mes = (12 - p_mes1) + 1
LET renta = (renta - renta_pagada) / p_mes
ELSE
LET renta = renta - renta_pagada
# EN FECHA 28/3/2005 LET renta = (renta - renta_pagada) / (12- MONTH(p_fecha_al)+ 1)
END IF
END IF
IF bonifica = "S" and retorne = "S" THEN
LET renta_boni = renta
LET renta = 0
END IF
IF renta_boni < 0 THEN
LET renta_boni = renta_boni * -1
END IF
{
IF renta < 0 THEN
LET renta = renta * -1
END IF
}
IF renta < 0 THEN
LET renta = 0
END IF
# Introduce el codigo del movimiento de la renta cuando en la decision
# si la nomina es de bonificacion es otra cosa que no sea 'S'
IF renta > 0 THEN
IF opt1 != "S" THEN
LET idx = idx + 1
LET renta = renta * -1
LET movi_emp[idx].clase_mov = "D"
LET movi_emp[idx].cod_mov = datos_mov.cod_mov
LET movi_emp[idx].valor = renta
END IF
END IF
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
LET int_flag = false
RETURN
END IF
END IF
END IF
#------------- TERMINA CALCULO DE LA RENTA ------------------------------
# Retorna a calcular la renta que pagaria con la bonificacion
IF bonifica = "S" and retorne = "S" THEN
LET retorne = "N"
GOTO retorna
END IF
IF opt1 = "S" THEN
IF retorne = "N" THEN
IF datos_mov.cod_mov = 23 THEN
LET renta = renta_boni - renta
LET idx = idx + 1
LET movi_emp[idx].clase_mov = "D"
LET movi_emp[idx].cod_mov = datos_mov.cod_mov
LET movi_emp[idx].valor = renta
END IF
END IF
END IF
# Cuando el empleado no tiene que pagar contando con la bonificacion
# Solo por el sueldo
IF opt1 = "S" THEN
IF bonifica = "N" THEN
FOR i = 1 TO idx
IF movi_emp[i].cod_mov = datos_mov.cod_mov THEN
GOTO llega
END IF
END FOR
LET idx = idx + 1
LET movi_emp[idx].clase_mov = "D"
LET movi_emp[idx].cod_mov = datos_mov.cod_mov
LET movi_emp[idx].valor = renta
END IF
END IF
# Calculo de la renta de regalia pascual
LABEL llega:
IF regalia = "S" THEN
SELECT cod_mov INTO datos_mov.cod_mov FROM notb00002 WHERE
clase_mov = "R"
FOR i = 1 to idx1
IF datos_mov.cod_mov = desp_mov[i].cod_mov THEN
IF desp_mov[i].clasifica = "N" or desp_mov[i].clasifica is null
THEN
GOTO otro_llega
END IF
END IF
END FOR
CALL renta_regalia()
END IF
LABEL otro_llega:
#------------------------------------------------------------------------------
# CALCULO PARA EL PAGO DEL SEGURO SOCIAL
#------------------------------------------------------------------------------
IF datos_emp.paga_seg = "S" THEN
SELECT cod_mov,tipo_mov INTO datos_mov.cod_mov,p_tipo FROM notb00002
WHERE clase_mov = "S"
IF p_tipo = "G" THEN
GOTO salta
END IF
LET ingresos_empleado = 0
LET cuota_ss = 0
LET acum_mes_ss = 0
LET acum_ing_mes = 0
{
FOR i = 1 to idx
IF datos_mov.cod_mov = movi_emp[i].cod_mov THEN
GOTO salta
END IF
END FOR
}
FOR i = 1 to idx1
IF datos_mov.cod_mov = desp_mov[i].cod_mov THEN
IF desp_mov[i].clasifica = "N" OR
desp_mov[i].clasifica is null THEN
GOTO salta
END IF
END IF
END FOR
IF ultima_semana_mes = "S" THEN
# Busca el acumulado de seguro social, para el mes, que tiene el empleado
SELECT SUM(valor) INTO acum_mes_ss
FROM notb00008
WHERE cod_mov = datos_mov.cod_mov AND
num_emp = datos_emp.num_emp AND
fecha between fecha_ini_mes AND p_fecha_al AND
status_t IS NULL
IF acum_mes_ss IS NULL THEN
LET acum_mes_ss = 0
END IF
IF acum_mes_ss <> 0 THEN
LET acum_mes_ss = acum_mes_ss * -1
END IF
# Busca el acumulado de ingresos en el mes, que tiene el empleado
SELECT SUM(valor) INTO acum_ing_mes
FROM notb00008
WHERE clase_mov IN ("I", "E") AND
num_emp = datos_emp.num_emp AND
fecha between fecha_ini_mes AND p_fecha_al AND
status_t IS NULL
IF acum_ing_mes IS NULL THEN
LET acum_ing_mes = 0
END IF
END IF
# Busca la cuota de seguro social que debe pagar el empleado segun los ingresos
# que obtuvo en la semana, si no es la ultima nomina del mes.
IF ultima_semana_mes = "N" THEN
IF datos_nomi.tipo_emp = "S" THEN
LET ingresos_empleado = movi_emp[1].valor + otros_ing
LET salario_semanal = 0
SELECT salario_sem_hasta INTO salario_semanal
FROM notb00006
WHERE salario_sem_desde <= ingresos_empleado and
salario_sem_hasta >= ingresos_empleado
IF status = notfound THEN
LET ss.porc_emp = 23.10
LET ss.salario_sem_hasta = 744.00
LET ss.salario_men_hasta = 3224.01
LET ss.porc_pat = 64.68 #51.17
ELSE
SELECT a.salario_sem_hasta, a.salario_men_hasta, a.porc_emp, a.porc_pat
INTO ss.salario_sem_hasta, ss.salario_men_hasta, ss.porc_emp,
ss.porc_pat
FROM notb00006 a
WHERE a.salario_sem_hasta = salario_semanal
END IF
END IF
IF datos_nomi.tipo_emp = "Q" THEN
LET ingresos_empleado = (p_sueldo / 2)+ otros_ing
#LET ingresos_empleado = p_sueldo + otros_ing
LET salario_semanal = 0
SELECT a.salario_men_hasta INTO salario_semanal
FROM notb00006 a
WHERE a.salario_men_desde <= ingresos_empleado and
a.salario_men_hasta >= ingresos_empleado
IF status = notfound THEN
LET ss.porc_emp = 23.10
LET ss.salario_sem_hasta = 744.00
LET ss.salario_men_hasta = 3224.01
LET ss.porc_pat = 64.68 #51.17
ELSE
SELECT MAX(a.salario_men_hasta),MAX(a.salario_men_hasta),MAX(a.porc_emp),
MAX(a.porc_pat)
INTO ss.salario_sem_hasta, ss.salario_men_hasta, ss.porc_emp,
ss.porc_pat
FROM notb00006 a
WHERE a.salario_men_hasta <= salario_semanal
END IF
END IF
END IF
# Busca la cuota de seguro social que debe pagar el empleado segun los ingresos
# que obtuvo en el mes, si es la ultima nomina del mes.
IF ultima_semana_mes = "S" THEN
IF datos_nomi.tipo_emp = "S" THEN
LET ingresos_empleado = movi_emp[1].valor + otros_ing + acum_ing_mes
LET salario_semanal = 0
SELECT a.salario_sem_hasta INTO salario_semanal
FROM notb00006 a
WHERE a.salario_men_desde <= ingresos_empleado and
a.salario_men_hasta >= ingresos_empleado
IF status = notfound THEN
LET ss.porc_emp = 23.10
LET ss.salario_sem_hasta = 744.00
LET ss.salario_men_hasta = 3224.01
LET ss.porc_pat = 64.68 #51.17
ELSE
SELECT a.salario_sem_hasta, a.salario_men_hasta, a.porc_emp, a.porc_pat
INTO ss.salario_sem_hasta, ss.salario_men_hasta, ss.porc_emp,
ss.porc_pat
FROM notb00006 a
WHERE a.salario_sem_hasta = salario_semanal
END IF
END IF
IF datos_nomi.tipo_emp = "Q" THEN
LET ingresos_empleado = movi_emp[1].valor + otros_ing + acum_ing_mes
LET salario_semanal = 0
SELECT a.salario_men_hasta INTO salario_semanal
FROM notb00006 a
WHERE a.salario_men_desde <= ingresos_empleado and
a.salario_men_hasta >= ingresos_empleado
IF status = notfound THEN
LET ss.porc_emp = 23.10
LET ss.salario_sem_hasta = 744.00
LET ss.salario_men_hasta = 3224.01
LET ss.porc_pat = 64.68 #51.17
ELSE
SELECT MAX(a.salario_men_hasta),MAX(a.salario_men_hasta),MAX(a.porc_emp),
MAX(a.porc_pat)
INTO ss.salario_sem_hasta, ss.salario_men_hasta, ss.porc_emp,
ss.porc_pat
FROM notb00006 a
WHERE a.salario_men_hasta <= salario_semanal
END IF
END IF
END IF
# Determina la cuota de seguro social, si es la ultima nomina del mes
IF ultima_semana_mes = "S" THEN
IF datos_nomi.tipo_emp = "S" THEN
LET cuota_ss = ss.porc_emp * semanas_mes - acum_mes_ss
LET idx = idx + 1
LET movi_emp[idx].clase_mov = "D"
LET movi_emp[idx].cod_mov = datos_mov.cod_mov
LET movi_emp[idx].valor = cuota_ss * -1
END IF
IF datos_nomi.tipo_emp = "Q" THEN
LET cuota_ss = ss.porc_emp * semanas_mes - acum_mes_ss
LET idx = idx + 1
LET movi_emp[idx].clase_mov = "D"
LET movi_emp[idx].cod_mov = datos_mov.cod_mov
LET movi_emp[idx].valor = cuota_ss * -1
END IF
END IF
# Determina la cuota de seguro social, si no es la ultima nomina del mes
IF ultima_semana_mes = "N" THEN
IF datos_nomi.tipo_emp = "S" THEN
LET cuota_ss = ss.porc_emp
LET idx = idx + 1
LET movi_emp[idx].clase_mov = "D"
LET movi_emp[idx].cod_mov = datos_mov.cod_mov
LET movi_emp[idx].valor = cuota_ss * -1
END IF
IF datos_nomi.tipo_emp = "Q" THEN
LET cuota_ss = ss.porc_emp * 2
LET idx = idx + 1
LET movi_emp[idx].clase_mov = "D"
LET movi_emp[idx].cod_mov = datos_mov.cod_mov
LET movi_emp[idx].valor = cuota_ss * -1
END IF
END IF
END IF
LET ss.porc_emp = 0.00
LET ss.salario_sem_hasta = 0.00
LET ss.salario_men_hasta = 0.00
LET ss.porc_pat = 0.00
LET salario_semanal = 0.00
#------------------------------------------------------------------------------
# FIN DEL CALCULO PARA EL PAGO DEL SEGURO SOCIAL
#------------------------------------------------------------------------------
LABEL salta:
LET l = 11
FOR p = 1 TO 25
IF l < 25 THEN
DISPLAY " " at l,3
DISPLAY " " at l,7
DISPLAY " " at l,20
LET l = l + 1
END IF
END FOR
LET l = 11
FOR p = 1 TO idx
IF movi_emp[p].cod_mov is not null THEN
FOR t = 1 TO idx1
LET nombre_mov = null
IF movi_emp[p].cod_mov = desp_mov[t].cod_mov THEN
LET nombre_mov = desp_mov[t].descrip_mov
EXIT FOR
END IF
END FOR
IF l < 25 THEN
DISPLAY movi_emp[p].cod_mov using "&&" at l,3
DISPLAY nombre_mov at l,7
DISPLAY movi_emp[p].cantidad using "##,###.##" at l,40
DISPLAY movi_emp[p].valor using "##,###.##" at l,50
LET l = l + 1
END IF
END IF
END FOR
# Insertar los movimientos del empleado en memoria
FOR p = 1 TO idx
# Caso particular para prestamo cooperativa, farmacia y plaza lama
# Tiene que el movimiento no sea el movimiento 11 porque esta en la tabla
# notb00014 que es donde estan los codigos que se balancean y se puso este
# codigo de movimiento en esta tabla para el proceso de fin de ano de nomina
IF movi_emp[p].cod_mov != 11 THEN
SELECT * FROM notb00014
WHERE @cod_mov = movi_emp[p].cod_mov
IF status != notfound THEN
SELECT sum(valor) INTO p_valor FROM notb00008
WHERE num_emp = datos_emp.num_emp and
cod_mov = movi_emp[p].cod_mov
IF p_valor <= 0 THEN
LET movi_emp[p].num_emp = null
LET movi_emp[p].cod_mov = null
LET movi_emp[p].valor = 0
END IF
IF p_valor < movi_emp[p].valor THEN
LET movi_emp[p].valor = p_valor
END IF
IF movi_emp[p].cod_mov = 12 THEN
LET interes = p_valor * porciento
LET movi_emp[p].valor = movi_emp[p].valor
IF datos_nomi.tipo_emp = "Q" THEN
LET interes = interes / 100
END IF
IF interes > 0 THEN
LET interes = interes * -1
END IF
CASE
WHEN movi_emp[p].cod_mov = 12
LET p_codigo = 110
EXIT CASE
WHEN movi_emp[p].cod_mov = 13
LET p_codigo = 111
EXIT CASE
WHEN movi_emp[p].cod_mov = 19
LET p_codigo = 112
EXIT CASE
END CASE
# Vacaciones Colectivas
IF vacaciones = "S" THEN
LET interes = interes * semanas
END IF
#----------------------------------------------------------------------------
# Inserta los intereses de los perstamos como un movimiento en la
# nomina, el codigo de los interes es el 110
IF movi_emp[p].valor != 0 THEN
INSERT INTO notb00008
VALUES (datos_nomi.num_nomi,datos_nomi.tipo_emp,
datos_emp.num_emp,datos_emp.departamento,datos_emp.nivel_emp,
datos_emp.cod_puesto,p_fecha_al,
p_codigo,movi_emp[p].cantidad,interes,
movi_emp[p].clase_mov,null,user,current,null,null)
END IF
END IF
END IF
# Si el movimiento es de prestamo farmacia o plaza lama
# Si el valor pendiente de estos prestamos esta saldado no inserta el movimiento
IF movi_emp[p].cod_mov = 13 or
movi_emp[p].cod_mov = 19 THEN
IF p_valor <= 0 THEN
LET movi_emp[p].num_emp = null
END IF
END IF
#----------------------------------------------------------------------------
# Cuando el movimiento es de prestamo cooperativa chequea que el valor con
# el 1% sea menor o igual que cero para no insertar movimiento en la tabla
IF movi_emp[p].valor <= 0 THEN
LET movi_emp[p].num_emp = null
END IF
#-------------------------------------------------------------------------
END IF
IF movi_emp[p].cod_mov != 0 and movi_emp[p].cod_mov is not null THEN
IF movi_emp[p].clase_mov = "D" or movi_emp[p].clase_mov = "R" or
movi_emp[p].clase_mov = "S" THEN
LET movi_emp[p].clase_mov = "D"
IF movi_emp[p].valor > 0 THEN
LET movi_emp[p].valor = movi_emp[p].valor * -1
END IF
END IF
IF movi_emp[p].valor is null THEN
LET movi_emp[p].valor = 0
END IF
#------------------------------------------------------------------------
IF movi_emp[p].valor != 0 THEN
IF vacaciones = "S" THEN
IF movi_emp[p].cod_mov = 22 THEN
LET movi_emp[p].valor = movi_emp[p].valor * semanas
END IF
END IF
INSERT INTO notb00008
VALUES (datos_nomi.num_nomi,datos_nomi.tipo_emp,
datos_emp.num_emp,datos_emp.departamento,datos_emp.nivel_emp,
datos_emp.cod_puesto,p_fecha_al,
movi_emp[p].cod_mov,movi_emp[p].cantidad,movi_emp[p].valor,
movi_emp[p].clase_mov,null,user,current,null,null)
IF movi_emp[p].cod_mov = 32 OR movi_emp[p].cod_mov = 31 OR
movi_emp[p].cod_mov = 33 THEN
INSERT INTO notb00008
VALUES (datos_nomi.num_nomi,datos_nomi.tipo_emp,
datos_emp.num_emp,datos_emp.departamento,datos_emp.nivel_emp,
datos_emp.cod_puesto,p_fecha_al,
1,0,0,
movi_emp[p].clase_mov,null,user,current,null,null)
END IF
END IF
END IF
END FOR
LET l = 11
FOR p = 1 TO idx
IF movi_emp[p].cod_mov is not null THEN
FOR t = 1 TO idx1
LET nombre_mov = null
IF movi_emp[p].cod_mov = desp_mov[t].cod_mov THEN
LET nombre_mov = desp_mov[t].descrip_mov
EXIT FOR
END IF
END FOR
IF l < 25 THEN
DISPLAY movi_emp[p].cod_mov using "&&" at l,3
DISPLAY nombre_mov at l,7
DISPLAY movi_emp[p].cantidad using "##,###.##" at l,40
DISPLAY movi_emp[p].valor using "##,###.##" at l,50
LET l = l + 1
END IF
END IF
END FOR
FOR i = 1 TO 50
LET movi_emp[i].num_emp = null
LET movi_emp[i].cod_mov = null
LET movi_emp[i].valor = null
END FOR
END WHILE
END FUNCTION
FUNCTION renta_regalia()
SELECT sum(@valor) INTO valor_renta
FROM notb00008
WHERE @num_emp = datos_emp.num_emp and
clase_mov in ("I","E") and
fecha > "31122006"
LET renta_15 = 0
LET renta_20 = 0
LET renta_27 = 0
LET otros_ing = 0
LET ing_regal = 0
LET l = 18
FOR i = 1 TO idx
IF movi_emp[i].clase_mov = "I" or
movi_emp[i].clase_mov = "E" THEN
IF movi_emp[i].valor is null THEN
LET movi_emp[i].valor = 0
END IF
LET otros_ing = otros_ing + movi_emp[i].valor
END IF
END FOR
# Este comentario pertenece al comentario mas abajo
# LET ing_regal = valor_regal
#-----------------------------------------------------------------------------
LET valor_regal = otros_ing
IF valor_regal > 12060 THEN
# Se puso comentario porque el ano 1995 se calculo los incentivos conjuntamente
# Con la regalia
{IF ing_regal < 10050 THEN
LET valor_regal = valor_regal - ing_regal
END IF}
#------------------------------------------------------------------------------
LET valor_regal = valor_regal - 10050
# Renta al 15 %
IF valor_renta > 60000 and valor_renta<= 100000 THEN
LET renta_15 = valor_regal * .15
END IF
# Renta al 20 %
IF valor_renta >= 100001 and valor_renta < 150000 THEN
LET renta_20 = valor_regal * .20
END IF
# Renta al 27 %
IF valor_renta >= 150000 THEN
LET renta_27 = valor_regal * .25
END IF
LET renta_p = renta_15 + renta_20 + renta_27
LET idx = idx + 1
LET movi_emp[idx].clase_mov = "D"
LET movi_emp[idx].cod_mov = datos_mov.cod_mov
LET movi_emp[idx].valor = renta_p
END IF
END FUNCTION
FUNCTION vacaciones_colect()
# Cuando aplican el codigo de vacaciones colectivas que es el codigo 31
FOR i = 1 TO idx
IF movi_emp[i].cod_mov = 1 THEN
LET movi_emp[i].valor = 0
END IF
IF movi_emp[i].cod_mov = 31 THEN
LET movi_emp[1].cantidad = movi_emp[i].cantidad
LET semanas = movi_emp[i].cantidad / p_h_normal
END IF
END FOR
END FUNCTION