CREATE OR REPLACE
PROCEDURE APURAC_GESHOSPITALAR (
      P_CDFILIAL    IN FILIAL.CDFILIAL%TYPE,
      P_CDFILIPROC  IN FILIAL.CDFILIAL%TYPE,
      P_CDCLIENTE   IN CLIENTE.CDCLIENTE%TYPE,
      P_DATAINI     IN DATE,
      P_DATAFIM     IN DATE,
      P_NRAPURACFAT IN NOTAFISCAL.NRAPURACFAT%TYPE,
      P_IDGERANOTA  IN VARCHAR DEFAULT 'S')
AS
   /* DECLARACAO DO TIPO (RECORD) QUE CONTERA OS DADOS DO CURSOR */
   TYPE GHOSPRECTYPE IS RECORD (
      CDFILIAL       FILIAL.CDFILIAL%TYPE,
      CDSERVFILI     SERVICO.CDSERVFILI%TYPE,
      CDCLIENTE      CLIENTE.CDCLIENTE%TYPE,
      CDDIETPAD      DIETPADR.CDDIETPAD%TYPE,
      NMSERVICO      SERVICO.NMSERVICO%TYPE,
      QTEFETIVOS     NUMBER);

   /* DECLARACAO DO TIPO DO CURSOR */
   TYPE GHOSPCURTYPE IS REF CURSOR RETURN GHOSPRECTYPE; 

   /* VARIAVEIS QUE CONTERAO O CURSOR E O REGISTRO */
   REC_GHOSP        GHOSPRECTYPE;
   CUR_GHOSP        GHOSPCURTYPE;


   V_NRLANCTONF      VARCHAR2(20);
   V_NRLANCESTQ      VARCHAR2(10);
   V_VRBRUTITEM      FLOAT;
   V_CDDIETPAD       DIETSERV.CDDIETPAD%TYPE;
   V_VRDIETFATU      DIETSERV.VRDIETFATU%TYPE;
   V_CDSERVFILI      DIETSERV.CDSERVFILI%TYPE;
   V_DSDIETPAD       DIETPADR.DSDIETPAD%TYPE;
   V_CDEMPRESA       FILIAL.CDEMPRESA%TYPE;
   V_CDINSCMUNI      FILIAL.CDINSCMUNI%TYPE;
   V_CDINSCESTA      FILIAL.CDINSCESTA%TYPE;
   V_CDSERIE         SERIENF.CDSERIE%TYPE;
   V_TTITENSNF       NUMBER;
   V_PRIM            VARCHAR2(01);
   V_PRODUTO         VARCHAR2(10);
   V_CONTITEM        NUMBER;   
   V_IDUTEFETPAH     VARCHAR2(01); /*IDENTIFICADOR SE UTILIZA EFETIVO DO PAH ('S') OU DO FAI ('N')*/
   V_FECHANOTA       VARCHAR2(01); /*IDENTIFICADOR PARA VERIFICAR SE SERA NECESSARIO FECHAR A NOTA*/ 

   /*CURSOR AUXILIAR PARA DELETAR AS NOTAS FISCAIS*/
   CURSOR C_DELETANF IS
   SELECT CDFILIAL, NRLANCTONF
   FROM NOTAFISCAL
   WHERE CDFILIAL    = P_CDFILIPROC AND
         NRAPURACFAT = P_NRAPURACFAT;

   /*Procedimento utilizado para retornar os efetivos de acordo com o parametro IDUTEFETPAH, do PAH ou do FAI*/
   PROCEDURE OPENEFETHOSPCURSOR(C_GHOSP       IN OUT GHOSPCURTYPE,
                                V_CDFILIAL    IN VARCHAR2,
                                V_CDCLIENTE   IN VARCHAR2,
                                V_DATAINI     IN DATE,
                                V_DATAFIM     IN DATE,
                                V_IDUTEFETPAH IN VARCHAR2) IS
   BEGIN    
      IF (V_IDUTEFETPAH = 'N') THEN  /*UTILIZA EFETIVOS LANCADOS NO FAI*/
         OPEN C_GHOSP FOR
            SELECT E.CDFILIAL, E.CDSERVFILI,   E.CDCLIENTE,
                   E.CDDIETPAD, S.NMSERVICO,
                   SUM(E.QTCOMEFATPAH) AS QTEFETIVOS
              FROM EFECLIFATPAH E, SERVICO S            
             WHERE E.CDFILIAL    = P_CDFILIAL   AND
                   E.CDCLIENTE   = P_CDCLIENTE  AND
                   E.DTEFETFATPAH BETWEEN P_DATAINI AND P_DATAFIM AND
                   E.CDFILIAL    = S.CDFILIAL   AND
                   E.CDSERVFILI  = S.CDSERVFILI
          GROUP BY E.CDFILIAL, E.CDSERVFILI,   E.CDCLIENTE,
                   E.CDDIETPAD, S.NMSERVICO
          ORDER BY E.CDSERVFILI, E.CDDIETPAD ;
      END IF;
      IF (V_IDUTEFETPAH = 'S') THEN  /*UTILIZA EFETIVOS LANCADOS NO PAH*/
         OPEN C_GHOSP FOR
            SELECT E.CDFILIAL, E.CDSERVFILI,   E.CDCLIENTE,
                   E.CDDIETPAD, S.NMSERVICO,
                   SUM(E.QTCOMEFETDIE) AS QTEFETIVOS
              FROM EFETDIET E, SERVICO S
             WHERE E.CDFILIAL    = P_CDFILIAL   AND
                   E.CDCLIENTE   = P_CDCLIENTE  AND
                   E.DTEFETDIET BETWEEN P_DATAINI AND P_DATAFIM AND
                   E.CDFILIAL    = S.CDFILIAL   AND
                   E.CDSERVFILI  = S.CDSERVFILI
          GROUP BY E.CDFILIAL, E.CDSERVFILI,   E.CDCLIENTE,
                   E.CDDIETPAD, S.NMSERVICO
          ORDER BY E.CDSERVFILI, E.CDDIETPAD ;
      END IF;
   END OPENEFETHOSPCURSOR;

BEGIN

   V_PRIM   := 'S';
   V_FECHANOTA := 'N';

   SELECT MAX(CDEMPRESA), MAX(CDINSCMUNI), MAX(CDINSCESTA), MAX(CDSERIE)
     INTO V_CDEMPRESA, V_CDINSCMUNI, V_CDINSCESTA, V_CDSERIE
     FROM FILIAL
    WHERE CDFILIAL = P_CDFILIAL;


   SELECT NVL(MAX(NRMAXITNF),10)
     INTO V_TTITENSNF
     FROM SERIENF
    WHERE CDEMPRESA  = V_CDEMPRESA  AND
          CDINSCESTA = V_CDINSCESTA AND
          CDSERIE    = V_CDSERIE;

   V_CONTITEM  := 0;

   FOR C_NOTAFISCAL IN C_DELETANF LOOP
      DELETA_NF(C_NOTAFISCAL.CDFILIAL, C_NOTAFISCAL.NRLANCTONF);
   END LOOP;
   
   /*VERIFICA DE QUAL TABELA SERAO SELECIONADOS OS EFETIVOS - 'S' DA EFETDIET E 'N' DA EFECLIFATPAH*/
   SELECT IDUTEFETPAH
     INTO V_IDUTEFETPAH
     FROM PARAMGERAL;

   OPENEFETHOSPCURSOR(CUR_GHOSP, P_CDFILIAL, P_CDCLIENTE, P_DATAINI, P_DATAFIM, V_IDUTEFETPAH);
   LOOP
      FETCH CUR_GHOSP INTO REC_GHOSP;
      EXIT WHEN CUR_GHOSP%NOTFOUND;

      /*Verifica se existem efetivs para gerar a nota*/
      IF REC_GHOSP.QTEFETIVOS > 0 THEN
         /*se existir efetivs verifica se a dieta tem preco*/        
         SELECT MAX(SC.CDDIETPAD), MAX(SC.VRSERVFATUPAH),
                MAX(SC.CDSERVFILI), MAX(DP.DSDIETPAD)
           INTO V_CDDIETPAD , V_VRDIETFATU,
                V_CDSERVFILI, V_DSDIETPAD
           FROM SERVCLIEPAH SC, DIETPADR DP
          WHERE (SC.CDFILIAL   = P_CDFILIAL)  AND
                (SC.CDSERVFILI = REC_GHOSP.CDSERVFILI) AND
                (SC.CDCLIENTE = REC_GHOSP.CDCLIENTE) AND
                (SC.CDDIETPAD  = REC_GHOSP.CDDIETPAD)  AND
                (SC.CDDIETPAD  = DP.CDDIETPAD);
         V_VRBRUTITEM   := V_VRDIETFATU;

         IF V_VRBRUTITEM IS NOT NULL THEN          
         /* verifica se a dieta tem preco*/
            IF V_PRIM = 'S' THEN
            /*se for o primeiro registro ou se for lancar uma nova nota*/   
               NOVO_CODIGO('LANCNF/FILIAL' || P_CDFILIPROC,V_NRLANCTONF);
   
               V_NRLANCTONF := SUBSTR(V_NRLANCTONF,11,10);
      
               GERA_NOTAFISCAL_CORPO(P_CDFILIPROC, P_CDFILIAL, V_CDEMPRESA, '01',
                                     V_CDSERIE, P_CDCLIENTE, P_DATAFIM, 'FAI',
                                     V_NRLANCTONF, V_NRLANCESTQ, 'N', P_NRAPURACFAT,
                                     V_NRLANCTONF);
               V_PRIM   := 'N';
               V_FECHANOTA := 'S';/*RECEBE 'S' PARA FECHAR A NOTA NO FIM DA ROTINA*/
            END IF;

            SELECT MAX(CDPRODUTO)
              INTO V_PRODUTO
              FROM SERVICO
             WHERE CDSERVFILI = REC_GHOSP.CDSERVFILI
               AND CDFILIAL   = P_CDFILIAL;
 
            GERA_NOTAFISCAL_PRODUTO(P_CDFILIPROC,  V_NRLANCTONF, V_PRODUTO,
                                    V_CDSERVFILI, V_DSDIETPAD || ' - ' || REC_GHOSP.NMSERVICO,
                                    REC_GHOSP.QTEFETIVOS, V_VRBRUTITEM);
 
            V_CONTITEM  := V_CONTITEM + 1;

            IF (V_CONTITEM = V_TTITENSNF) THEN
               GERA_NOTAFISCAL_FECHAMENTO(P_CDFILIPROC, V_NRLANCTONF);                           
               V_PRIM  := 'S';
               V_FECHANOTA := 'N'; /*RECEBE 'N' PORQUE A NOTA JA FOI FECHADA*/
            END IF;                     
         END IF;
      END IF;
   END LOOP;
   CLOSE CUR_GHOSP;   

   IF V_FECHANOTA = 'S' THEN
      GERA_NOTAFISCAL_FECHAMENTO(P_CDFILIPROC, V_NRLANCTONF);                              
   END IF;   
   /*ATUALIZA OS CAMPOS NRAPURACFAT E CDFILIFATU DA TABELA DE EFETIVOS UTILIZADA PARA CONTROLE*/
   IF V_IDUTEFETPAH = 'S' THEN  /*ATUALIZA A TABELA UTILIZADA PELO PAH*/
      UPDATE EFETDIET
         SET CDFILIFATU = P_CDFILIPROC,
             NRAPURACFAT = P_NRAPURACFAT
       WHERE CDFILIAL    = P_CDFILIAL   AND
             CDCLIENTE   = P_CDCLIENTE  AND
             DTEFETDIET BETWEEN P_DATAINI AND P_DATAFIM;
   END IF;
   IF V_IDUTEFETPAH = 'N' THEN /*ATUALIZA A TABELA UTILIZADA PELO FAI*/
      UPDATE EFECLIFATPAH
         SET CDFILIFATU = P_CDFILIPROC,
             NRAPURACFAT = P_NRAPURACFAT
       WHERE CDFILIAL    = P_CDFILIAL   AND
             CDCLIENTE   = P_CDCLIENTE  AND
             DTEFETFATPAH BETWEEN P_DATAINI AND P_DATAFIM;
   END IF;           
END;
/