{
-----------------------------------------------------------------------
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 CHAR(1)
DEFINE p_mes1,numero_nomina,num_van,tiempo,semanas,p_mes,p_ano SMALLINT
DEFINE ing_regal,factor,renta_p,val_bonifica,valor_renta 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 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,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)

      IF datos_nomi.tipo_emp = "Q" THEN
         LET numero = 24 - numero 
         LET porciento = 0.50
      END IF

      IF datos_nomi.tipo_emp = "V" THEN
            LET numero = 26 - numero
            LET porciento = 1.00
      END IF

      IF datos_nomi.tipo_emp = "S" THEN
         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  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
                        status_t IS NULL
   END IF 
   LET ss.porc_emp           = 0.00 
   LET ss.salario_sem_hasta  = 0.00 
   LET ss.salario_men_hasta  = 0.00 
   LET ss.porc_pat           = 0.00 
   LET salario_semanal       = 0.00 

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 num_emp,departamento,nivel_emp,cod_puesto,nom1_emp,",
                  "apell1_emp,sueldo_ac,paga_seg,fech_efec ",
                  "FROM adtb00003 ",
                  " WHERE ",criterio clipped,
                  "  AND nomina = ? ",
                  "  AND fech_efec <= ? ",
                  "  AND (status_t is null or ",
                  "      status_t = 'I') ",
                  "ORDER BY 1"
ELSE
  LET empleados = "SELECT num_emp,departamento,nivel_emp,cod_puesto,nom1_emp,",
                  "apell1_emp,sueldo_ac,paga_seg,fech_efec ",
                  "FROM adtb00003 ",
                  " WHERE ",criterio clipped,
                  "  AND nomina = ? ",
                  "  AND fech_efec <= ? ",
                  "  AND (status_t is null or ",
                  "      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

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 > "31121999"
 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 * 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 = 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 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
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"
            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
  IF datos_nomi.tipo_emp = "Q" or datos_nomi.tipo_emp = "S" THEN
     LET valor_renta = (sueldo_renta * (numero + 1))
  END IF
  IF bonifica = "S" THEN
     LET valor_renta = (sueldo_boni * (numero + 1))
  END IF
  LET valor_bonif1 = valor_renta + acumulado
  LET valor_renta = valor_renta + acumulado + otros_ing
#-----------------------------------------------------------------------
  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 > "31121999"
 
     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 * 24
        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 > "31121999"

    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 > "31121999"


    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
}
  LET valor_renta = valor_renta - valor_regal
  IF valor_renta > 102792 THEN
     SELECT cod_mov INTO datos_mov.cod_mov FROM notb00002 WHERE
            clase_mov = "R"
     LET renta_15 = 0
     LET renta_20 = 0
     LET renta_27 = 0
     FOR i = 1 to idx1
         IF datos_mov.cod_mov = desp_mov[i].cod_mov THEN
            IF desp_mov[i].clasifica = "N" OR 
               desp_mov[i].clasifica IS NULL
            THEN
               GOTO llega      
            END IF
         END IF
     END FOR

# Loop para saber si el codigo del impuesto sea dado mediante a una novedad

    FOR i = 1 TO idx
        IF datos_mov.cod_mov = movi_emp[i].cod_mov THEN
           LET datos_mov.clase_mov = "D"
           GOTO llega
        END IF
   END FOR
   IF numero_nomina is null THEN
      LET numero_nomina = 1
   END IF

 
    SELECT SUM(valor) INTO renta_pagada FROM notb00008
    WHERE num_emp = datos_emp.num_emp and
          (cod_mov = datos_mov.cod_mov or  
          cod_mov = 70) and num_nomi != numero_nomina and
          fecha > "31121999"


 
     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 > 102792 and valor_renta <= 171309 THEN
        LET valor_renta = valor_renta - 102792
        LET renta = valor_renta * .15
        LET renta_15 = renta
     ELSE
        LET renta = ((171309-102792.01) * .15)  
        LET renta_15 = renta
     END IF

# Renta al 20 %
     IF valor_renta > 171309 AND valor_renta <= 256957 THEN
        LET valor_renta = valor_renta - 171309.01
        LET renta = valor_renta * .20
        LET renta_20 = renta
     ELSE
        IF valor_renta > 171309 THEN
        LET renta = ((256957-171309.01) * .20)  
           LET renta_20 =  renta
        END IF
     END IF

# Renta al 25 %
     IF valor_renta > 256957 THEN
        LET valor_renta = valor_renta - 256957.01
        LET renta = valor_renta * .25
        LET renta_27 = renta
     END IF

     IF renta_15 is null THEN
        LET renta_15 = 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
     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) / (numero + 1)
        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          = 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 / 2)+ otros_ing 
          #LET ingresos_empleado = p_sueldo + otros_ing 
          LET salario_semanal = 0

          SELECT salario_men_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          = 51.17 
          ELSE
             SELECT MAX(salario_men_hasta),MAX(salario_men_hasta),MAX(porc_emp),
                    MAX(porc_pat)
               INTO ss.salario_sem_hasta, ss.salario_men_hasta, ss.porc_emp, 
                    ss.porc_pat
             FROM notb00006
             WHERE 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 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          = 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_men_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          = 51.17 
          ELSE
             SELECT MAX(salario_men_hasta),MAX(salario_men_hasta),MAX(porc_emp), 
                    MAX(porc_pat)
               INTO ss.salario_sem_hasta, ss.salario_men_hasta, ss.porc_emp, 
                    ss.porc_pat
             FROM notb00006
             WHERE 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 > "31121999"
     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

 
