{
-------------------------------------------------------------------------------
PROGRAMA              :  adprrp044b
OBJETIVO              :  Listar las informaciones generales de los 
                         Empleados Quincenales y Semanales y Ex-Empleados
                         Agrupados por los Deptos. Corporativos. 
PROGRAMADOR           :  Oscar A. Castillo
FECHA REALIZACION     :  Friday, 16 March, 2001
-------------------------------------------------------------------------------
}
GLOBALS "adprgb000.4gl"
 DEFINE tipo_l CHAR(1),
        fecha1,fecha2,fecha_ini_e,fecha_fin_e DATE,
        mes1,mes2,ano SMALLINT,
        l_monto_emp,m_monto_emp,l_sueld_con,sueld_con,sueld_con1,ingresos LIKE adtb00003.sueldo_ac,
        m_plan INTEGER, 
        m_categ CHAR(1),
       corporativo  LIKE adtb00042.dep_corp,
       m_v98,v_comp,benef,otros_ben,horas,bonificacion,reg_pascual DECIMAL(12,2),
       adtb40 RECORD LIKE adtb00040.*,edad,edad1 INTEGER,
       superm,pormes,vida,myd,comision DECIMAL(12,2)
        

        

FUNCTION adprrp044b()

## SE DEFINE EL REGISTRO DE BUSQUEDA CON LOS CAMPOS NECESARIOS PARA EL REPORTE
    DEFINE list_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,
       cedula           LIKE adtb00003.cedula,
       serie            LIKE adtb00003.serie,
       telefono         LIKE adtb00003.telefono,
       fech_nac         LIKE adtb00003.fech_nac,
       tipo_sangre      LIKE adtb00003.tipo_sangre,
       licencia         LIKE adtb00003.licencia,
       fech_efec        LIKE adtb00003.fech_efec,
       sueldo_ac        LIKE adtb00003.sueldo_ac,
       nom_dpto         LIKE adtb00001.nom_dpto,
       nom_puesto       LIKE adtb00004.nom_puesto,
       calle            LIKE adtb00003.calle,
       casa_num         LIKE adtb00003.casa_num,
       barrio           LIKE adtb00003.barrio,
       urbanizacion     LIKE adtb00003.urbanizacion,
       sexo             LIKE adtb00030.sexo,
       dep_corp         LIKE adtb00042.dep_corp,
       clase_emp        LIKE adtb00003.clase_emp,
       monto_seg_dental LIKE adtb00003.monto_seg_dental,
       monto_asegurado  LIKE adtb00003.monto_asegurado,
       cod_plan         LIKE adtb00003.cod_plan,
       estado           CHAR(1)
    END RECORD,
        dura DECIMAL(8,2)
       
#WHENEVER ERROR CONTINUE

    OPTIONS
       FORM LINE 8,
       ERROR LINE 23,
       COMMENT LINE 21

    CLEAR SCREEN

    OPEN FORM adfmrp044 FROM "adfmrp044"
    DISPLAY FORM adfmrp044
    CALL pantalla()
    DISPLAY "adprrp044" AT 4,3 ATTRIBUTE(RED)
    DISPLAY "Empleados Deartamentos Corporativos " AT 6,23 ATTRIBUTE(BLACK)

## INDICA EL PAPEL NECESARIO PARA IMPRIMIR EL REPORTE. 1 - PAPEL 9 1/2 X 11
## 2 - PAPEL 14 7/8 X 11
    LET tipo_papel = 1
    CALL msgrp000(tipo_papel)
    CALL defecto(impresor) RETURNING imprime, letras.*, archivo

## AQUI SE DIGITA LA VARIABLE QUE INDICA LA CONDICION DEL REPORTE, ES DECIR
## SI SE TRATA DE EMPLEADOS SEMANALES O QUINCENALES
     INPUT BY NAME mes1,mes2,ano   
    
    ON KEY(CONTROL-P)
      CALL busca_printer() RETURNING imprime,letras.*, archivo
 
 AFTER FIELD mes1   
   IF mes1 IS NULL THEN
      LET numero_msg = 16
      CALL msg(numero_msg)
      NEXT FIELD mes1   
   END IF
 
AFTER FIELD mes2   
   IF mes2 IS NULL THEN
      LET numero_msg = 16
      CALL msg(numero_msg)
      NEXT FIELD mes2   
   END IF

AFTER FIELD ano   
   IF ano IS NULL THEN
      LET numero_msg = 16
      CALL msg(numero_msg)
      NEXT FIELD ano   
   END IF

   SELECT a.fecha_corte
     INTO fecha2
     FROM prdtable a
    WHERE a.ano = ano
      AND a.mes = mes2

   SELECT a.fecha_inicio
     INTO fecha1
     FROM prdtable a
    WHERE a.ano = ano
      AND a.mes = mes1
 
    AFTER INPUT
    EXIT INPUT
  END INPUT

    IF int_flag THEN
       LET numero_msg = 2
       CALL msg(numero_msg)
       LET int_flag = FALSE
       RETURN
    END IF

CONSTRUCT BY NAME criterio ON a.num_emp 

 ON KEY(CONTROL-P)
      CALL busca_printer() RETURNING imprime,letras.*, archivo
    AFTER CONSTRUCT
    EXIT CONSTRUCT
  END CONSTRUCT

  IF int_flag THEN
     LET numero_msg = 2
     CALL msg(numero_msg)
     LET int_flag = FALSE
     RETURN
  END IF

## SE SELECCIONAN LOS CAMPOS NECESARIOS PARA EL REPORTE DE LOS QUINCENALES
 #IF tipo_l = "N" THEN

  LET SELEC = 
   "SELECT UNIQUE a.num_emp,a.departamento,a.nivel_emp,a.cod_puesto, ",
   "       a.nom1_emp,a.apell1_emp,a.cedula,a.serie,a.telefono,a.fech_nac, ",
   "       a.tipo_sangre,a.licencia,a.fech_efec,a.sueldo_ac,c.nom_dpto, ",
   "       b.nom_puesto,a.calle,a.casa_num,a.barrio,a.urbanizacion,d.sexo, ",
   "       e.dep_corp,a.clase_emp,a.monto_seg_dental,a.monto_asegurado,a.cod_plan,a.status_t ",
   "FROM adtb00003 a,adtb00004 b,adtb00001 c,adtb00030 d,notb00008 t, OUTER adtb00043 e ",
   "WHERE (a.cod_puesto=b.cod_puesto) AND (a.departamento=c.departamento) AND ",
   #"      (a.status_t is null OR a.status_t NOT IN('D','E','T')) AND ",
   "     (a.num_emp = d.num_emp AND a.num_emp = e.num_emp AND ",
   "      d.num_emp = e.num_emp AND a.num_emp = t.num_emp AND ",
   "     t.fecha BETWEEN ? AND ? AND ", criterio CLIPPED,
   ") ORDER BY 22,1 "


     DISPLAY "Buscando Informacion ... Espere Por Favor" AT 19,14
     ATTRIBUTE (REVERSE,BOLD)

## AQUI SE PREPARA LA INFORMACION SELECCIONADA

    PREPARE busca FROM selec
    DECLARE accion CURSOR FOR busca
    OPEN accion USING fecha1,fecha2

    DISPLAY "                                                " AT 19,14
    DISPLAY "<< Reporte Generandose ...  Por Favor Espere. >>" 
              AT 19,14 ATTRIBUTE (REVERSE) 

    START REPORT empleadosb TO archivo

 # display "fechas ",fecha1, "  ",fecha2         
## AQUI SE BUSCA LA INFORMACION DE LOS CAMPOS DEL REGISTRO PARA DARLE
## SALIDA AL REPORTE

    WHILE STATUS != NOTFOUND
    FETCH accion INTO list_emp.* 
      IF STATUS = NOTFOUND THEN
         EXIT WHILE
      END IF
      
      IF int_flag THEN
         LET numero_msg = 2
         CALL msg(numero_msg)
         LET int_flag = FALSE
         RETURN
      END IF
  
      SELECT MIN(a.fecha) INTO fecha_ini_e
      FROM notb00008 a
      WHERE a.fecha between fecha1 AND
                            fecha2 AND
            a.num_emp = list_emp.num_emp
 
      SELECT MAX(a.fecha) INTO fecha_fin_e
      FROM notb00008 a
      WHERE a.fecha between fecha1 AND
                            fecha2 AND
            a.num_emp = list_emp.num_emp

      LET dura = fecha_fin_e - fecha_ini_e
      
      LET pormes = dura / 30 USING "###" 

# SEGURO MEDICO
      SELECT UNIQUE a.plan,a.categ
      INTO m_plan,m_categ
      FROM smtb00012 a
      WHERE a.num_emp = list_emp.num_emp
      AND a.status_t IS NULL

         IF STATUS != NOTFOUND THEN 
            SELECT a.monto_empresa
             INTO l_monto_emp
             FROM smtb00003 a
            WHERE a.plan = m_plan
              AND a.categ = m_categ
              AND a.status_t IS NULL
         ELSE
            LET l_monto_emp = 0
         END IF
          
           IF l_monto_emp IS NULL THEN
              LET l_monto_emp = 0
           END IF
           
           #DISPLAY "PASO ",l_monto_emp

           LET m_monto_emp = l_monto_emp * pormes
           #DISPLAY "PASO 11",m_monto_emp
# SEGURO SOCIAL
         SELECT SUM(a.valor)
           INTO m_v98
           FROM notb00008 a
          WHERE a.num_emp = list_emp.num_emp
            AND a.cod_mov = 98
            #AND a.status_t IS NULL
            AND a.fecha BETWEEN fecha1 AND fecha2
# SEGURO DENTAL
        SELECT SUM(a.valor) 
          FROM notb00008 a
         WHERE a.num_emp = list_emp.num_emp AND
              a.fecha between fecha1 AND fecha2
      
        IF STATUS != NOTFOUND THEN
           #LET STATUS = 0 
           IF list_emp.monto_seg_dental != 0 THEN
   
              LET v_comp = (list_emp.monto_seg_dental * 0.70)     
              LET v_comp = v_comp * pormes
     
           END IF
        END IF

#  Seguro Social
# CALCULO SEGURO DE VIDA
          SELECT SUM(a.valor)
            FROM notb00008 a
           WHERE a.num_emp = list_emp.num_emp
             AND a.fecha BETWEEN fecha1 AND fecha2
             #AND a.status_t IS NULL
             
    IF STATUS != NOTFOUND THEN
 
       IF list_emp.monto_asegurado > 0 THEN

          SELECT a.*
            INTO adtb40.*
            FROM adtb00040 a
           WHERE a.cod_plan = list_emp.cod_plan
             AND a.status_t IS NULL

        IF STATUS != NOTFOUND THEN

          IF adtb40.porc_vida IS NULL THEN
             LET adtb40.porc_vida = 0
          END IF

          IF adtb40.porc_mid IS NULL THEN
             LET adtb40.porc_mid = 0
          END IF

          IF adtb40.porc_comision IS NULL THEN
             LET adtb40.porc_comision = 0
          END IF

          LET edad1 = 0
          LET edad1 = TODAY - list_emp.fech_nac
          LET edad = edad1/365
          
          LET vida  = (list_emp.monto_asegurado * (adtb40.porc_vida / 100))
          LET myd   = (list_emp.monto_asegurado * (adtb40.porc_mid / 100))
          
          IF edad >= 60 THEN
             LET comision = 0
          ELSE
             LET comision = (list_emp.monto_asegurado * (adtb40.porc_comision / 100))
          END IF

          LET vida = vida * pormes
          LET myd  = myd * pormes
          LET comision = comision * pormes

         END IF
       END IF
      END IF
#-----------------------------------------------------------------------------------------
       IF vida IS NULL THEN
          LET vida = 0
       END IF
       IF myd IS NULL THEN
          LET myd = 0
       END IF
       IF comision IS NULL THEN
          LET comision = 0 
       END IF
       IF v_comp IS NULL THEN
          LET v_comp = 0
       END IF
       IF m_v98 IS NULL THEN
          LET m_v98 = 0
       END IF
       IF superm IS NULL THEN
          LET superm = 0
       END IF
       IF m_monto_emp IS NULL THEN
          LET m_monto_emp = 0
       END IF

        LET sueld_con = 0
        LET sueld_con1 = 0
        LET ingresos = 0

  SELECT SUM(a.valor) INTO ingresos
    FROM notb00008 a
    WHERE a.clase_mov in ("E","I")
      AND a.cod_mov != 1       
      AND a.num_emp = list_emp.num_emp
      AND a.fecha between fecha1 and fecha2
      
       SELECT SUM(a.valor) INTO sueld_con1
       FROM notb00008 a
       WHERE a.cod_mov = 1
         AND a.num_emp = list_emp.num_emp
         AND a.fecha between fecha1 and fecha2
         

       IF ingresos IS NULL THEN
          LET ingresos = 0
        END IF

       IF sueld_con1 IS NULL THEN
          LET sueld_con1 = 0
       END IF

       LET sueld_con = sueld_con1 + ingresos
       IF sueld_con > 11580 THEN
          LET sueld_con = 11580
       END IF

       LET sueld_con = sueld_con * pormes
       LET l_sueld_con = 0
       LET l_sueld_con = sueld_con * 0.02

       LET sueld_con = 0
       LET sueld_con1 = 0
       LET ingresos = 0

       LET benef = 0

       LET benef = vida + myd + comision + v_comp + m_v98 + m_monto_emp + l_sueld_con

      SELECT SUM(a.valor),SUM(a.cantidad)
        INTO list_emp.sueldo_ac,horas
        FROM notb00008 a
       WHERE a.num_emp = list_emp.num_emp
         AND a.cod_mov IN (1,34)
         AND a.fecha BETWEEN fecha1 AND fecha2
       #  AND a.status_t IS NULL
      
      SELECT SUM(a.valor)
        INTO otros_ben
        FROM notb00008 a
       WHERE a.num_emp = list_emp.num_emp
         AND a.cod_mov IN (2,3,4,5,6,7,8,9,10,32,33,36,37,40,44)
         AND a.fecha BETWEEN fecha1 AND fecha2
       # AND a.status_t IS NULL


      OUTPUT TO REPORT empleadosb(list_emp.*,horas,bonificacion,reg_pascual,otros_ben,benef,
                                  vida,myd,comision,v_comp,m_v98,m_monto_emp,l_sueld_con)

       LET vida = 0
       LET myd = 0
       LET comision = 0
       LET v_comp = 0
       LET m_v98 = 0
       LET m_monto_emp = 0
       LET l_sueld_con = 0


    END WHILE  
    FINISH REPORT empleadosb
    RUN imprime

    CLEAR SCREEN

END FUNCTION

## AQUI SE DEFINE EL REGISTRO DE IMPRESION CON LOS CAMPOS NECESARIOS PARA
## EL REPORTE
    REPORT empleadosb(x,p_horas,p_boni,p_regalia,p_otros,p_benef,
                 pvida,pmyd,pcomision,pv_comp,pm_v98,pm_monto_emp,pl_sueld_con)

       DEFINE x 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,
       cedula           LIKE adtb00003.cedula,
       serie            LIKE adtb00003.serie,
       telefono         LIKE adtb00003.telefono,
       fech_nac         LIKE adtb00003.fech_nac,
       tipo_sangre      LIKE adtb00003.tipo_sangre,
       licencia         LIKE adtb00003.licencia,
       fech_efec        LIKE adtb00003.fech_efec,
       sueldo_ac        LIKE adtb00003.sueldo_ac,
       nom_dpto         LIKE adtb00001.nom_dpto,
       nom_puesto       LIKE adtb00004.nom_puesto,
       calle            LIKE adtb00003.calle,
       casa_num         LIKE adtb00003.casa_num,
       barrio           LIKE adtb00003.barrio,
       urbanizacion     LIKE adtb00003.urbanizacion,
       sexo             LIKE adtb00030.sexo,
       dep_corp         LIKE adtb00042.dep_corp,
       clase_emp        LIKE adtb00003.clase_emp,
       monto_seg_dental LIKE adtb00003.monto_seg_dental,
       monto_asegurado  LIKE adtb00003.monto_asegurado,
       cod_plan         LIKE adtb00003.cod_plan,
       estado           CHAR(1)
    END RECORD,
       p_corp LIKE adtb00042.dep_corp,
       nombre_corp LIKE adtb00042.nombre_depto,
       p_benef,p_otros,p_horas,p_boni,p_regalia DECIMAL(12,2),
       pvida,pmyd,pcomision,pv_comp,pm_v98,pm_monto_emp,pl_sueld_con DECIMAL(12,2)

       
## DEFINICION DE LAS VARIABLES DE IMPRESION
    
    DEFINE hora CHAR(5)
    DEFINE l SMALLINT
    DEFINE varia CHAR(12),
           m_cedula LIKE adtb00038.cedula_n,
           m_sexo     LIKE adtb00030.sexo

    OUTPUT
## DEFINICION DE LOS MARGENES DE IMPRESION
     TOP MARGIN 0
      LEFT MARGIN 2
      BOTTOM MARGIN 4

     ORDER BY x.dep_corp

    FORMAT
      PAGE HEADER
       
        LET hora = time

        IF decide = "Q" THEN
           LET varia = "QUINCENALES"
        END IF 
        IF decide = "S" THEN
           LET varia = "SEMANALES"
        END IF
        IF decide = "T" THEN
           LET varia = "EX-EMPLEADOS"
        END IF
## SE CALCULA LA LONGITUD DE LA VARIABLE -VARIA-
           LET l = (135 - LENGTH(varia))/2

## AQUI SE INDICA LA IMPRESION DE LOS ENCABEZADOS
           PRINT COLUMN   1, letras.doce,letras.comp_on,letras.negrillas_on
           PRINT COLUMN   1, "adprrp044",
                 COLUMN  44, "R A Y . O . V A C  D O M I N I C A N A,  S. A.",
                 COLUMN 104, "Pag. ",pageno using "###"
           PRINT COLUMN  44, "    Sistema de Administracion de Personal",
                 COLUMN 102, today using "dd/mm/yyyy"
           PRINT COLUMN  44, "       Maestra de Personal ",varia CLIPPED,
                 COLUMN 107, hora

        SKIP 1 LINE
        PRINT COLUMN 2, "Desde : ",fecha1 USING "dd/mm/yyyy",
                        "   Hasta : ",fecha2 USING "dd/mm/yyyy"
        PRINT COLUMN 2, "---------------------------------------------------",
                        "---------------------------------------------------",
                        "-------------------------"

           PRINT COLUMN  49, "Seguro",
                 COLUMN  65, "Seguro",
                 COLUMN  80, "Seguro",
                 COLUMN  95, "Seguro",
                 COLUMN  105, "Accidente"

           PRINT COLUMN   2, "Codigo No.",
                 COLUMN  18, "Nombre Empleado",
                 COLUMN  49, "Vida",
                 COLUMN  65, "Medico",
                 COLUMN  80, "Dental",
                 COLUMN  95, "Social",
                 COLUMN  105, "Trabajo",
                 COLUMN  115, "   Beneficios"

        PRINT COLUMN 2, "---------------------------------------------------",
                        "---------------------------------------------------",
                        "------------------------"

    PRINT letras.negrillas_off
## AQUI SE INDICA LA IMPRESION DEL DETALLE

   BEFORE GROUP OF x.dep_corp

      SELECT a.nombre_depto
        INTO nombre_corp
        FROM adtb00042 a
       WHERE a.dep_corp = x.dep_corp
         AND a.status_t IS NULL

      PRINT COLUMN 1, "Departamento : ",x.dep_corp USING "#####"," - ",
                                        nombre_corp CLIPPED
      SKIP 1 LINE
 
      ON EVERY ROW

       INITIALIZE m_cedula,m_sexo TO NULL

       
         PRINT COLUMN   1, letras.negrillas_on,
               COLUMN   3, x.num_emp USING "&&&&","-",
                           x.departamento USING "&&&&","-",
                           x.nivel_emp USING "&&","-",x.cod_puesto USING "&&",
                           " ",x.apell1_emp clipped,", ",x.nom1_emp clipped,
               COLUMN  47, pvida+pcomision using "###,###.##",
               COLUMN  62, pm_monto_emp using "###,###.##",
               COLUMN  78, pv_comp using "##,###,###.##",
               COLUMN  95, pm_v98 USING "##,###.##",
               COLUMN  105, pl_sueld_con USING "##,###.##",
               COLUMN  115, p_benef using "##,###,###.##"
{
       PRINT Pvida 
       PRINT Pmyd 
       PRINT Pcomision 
       PRINT Pv_comp 
       PRINT Pm_v98 
       PRINT Pm_monto_emp 
       PRINT Pl_sueld_con 
}

   AFTER GROUP OF x.dep_corp
          SKIP 1 LINE

          PRINT COLUMN 4, "Sub-Total  ",
                COLUMN 44, GROUP SUM(x.sueldo_ac) USING "##,###,###.##",
                COLUMN 59, GROUP SUM(p_horas) USING "##,###,###.##",
                COLUMN 78, GROUP SUM(p_otros) USING "##,###,###.##",
                COLUMN 93, GROUP SUM(p_benef) USING "##,###,###.##"

          SKIP 1 LINE
          PRINT COLUMN 2, "Total Departamento = ", GROUP count(*) using "###"
          SKIP 1 LINE
          
   ON LAST ROW
          SKIP 1 LINE
          PRINT COLUMN 4, "Total  ",
                COLUMN 44, SUM(x.sueldo_ac) USING "##,###,###.##",
                COLUMN 59, SUM(p_horas) USING "##,###,###.##",
                COLUMN 78, SUM(p_otros) USING "##,###,###.##",
                COLUMN 93, SUM(p_benef) USING "##,###,###.##"
          SKIP 1 LINE
          PRINT COLUMN 2, "Total de Registros Impresos = ", count(*) using "###"
          PRINT letras.comp_off,ASCII 27, ASCII 80

   END REPORT

