CREATE OR REPLACE PROCEDURE INCLUI_RECEITA_CHECKLIST
(
P_CDFILIAL IN VARCHAR2,
P_NRLISTA_CKLISTS IN VARCHAR2,
P_DTPRODUCAO IN DATE,
P_IDTIPOPLAN IN VARCHAR2,
P_CDSETOR IN VARCHAR2,
P_NRTURNO IN VARCHAR2,
P_NRCATEGORIAPROD IN NUMBER,
P_NRSUBCATEGORIAPROD IN NUMBER,
P_NRTIPOPROD IN NUMBER,
P_NRTIPONEGOCIOINF IN NUMBER,
P_CDRECEITA IN VARCHAR2,
P_QTRECEITA IN FLOAT,
P_DTATENDIMENTO IN DATE,
P_CDCIA IN VARCHAR2,
P_CDRECEITADEST IN VARCHAR2,
P_QTRECEITADEST IN FLOAT,
P_NRVOO IN VARCHAR2,
P_CDTRECHO IN VARCHAR2,
P_CDCLASSE IN VARCHAR2,
P_CDCICLO IN VARCHAR2,
P_NRSERVICOCIAFILI IN NUMBER,
P_CDOPERADOR IN VARCHAR2,
P_NRORG IN NUMBER
)
AS
V_SEQ NUMBER;
V_SEQCKLIST NUMBER;
V_NRCKLISTPRODINF NUMBER;
V_CDCKLISTPRODINF VARCHAR2(20);
V_PREFIXO VARCHAR2(50);
V_MAX_CDCKLIST VARCHAR2(20);
V_EXISTE_PREVISTO NUMBER;
V_IDTIPOPLAN VARCHAR2(30);
V_NRRECCKLISTPRODINF NUMBER;
V_NRDESTCKLISTPRODINF NUMBER;
V_QUEBRA_POR_TIPOPROD VARCHAR2(1);
V_QTRECEITA FLOAT;
V_NRTIPOPROD NUMBER;
BEGIN
   
   IF P_CDFILIAL IS NULL OR
      P_DTPRODUCAO IS NULL OR
      P_CDSETOR IS NULL OR
      P_NRTURNO IS NULL OR
      P_NRCATEGORIAPROD IS NULL OR
      P_NRTIPOPROD IS NULL OR
      P_CDRECEITA IS NULL OR
      P_QTRECEITA IS NULL OR
      P_DTATENDIMENTO IS NULL OR
      P_CDCLASSE IS NULL OR
      P_CDCIA IS NULL THEN
      RETURN;
   END IF;

   V_QUEBRA_POR_TIPOPROD := QUEBRA_POR_TIPOPROD(P_CDFILIAL, P_CDSETOR, P_NRCATEGORIAPROD, P_NRSUBCATEGORIAPROD);

   V_NRTIPOPROD := P_NRTIPOPROD;

   IF V_QUEBRA_POR_TIPOPROD = 'N' THEN
      V_NRTIPOPROD := NULL;
   END IF;

   IF P_QTRECEITA > 0 AND ROUND(P_QTRECEITA, 3) = 0 THEN
      V_QTRECEITA := 0.001;
   ELSE
      V_QTRECEITA := ROUND(P_QTRECEITA, 3);
   END IF;

   IF V_QTRECEITA = 0 THEN
      RETURN;
   END IF;

   /*Verifica se ja existe um checklist para a receita dentro da lista de checklists do processo*/
   SELECT MAX(C.NRCKLISTPRODINF)
     INTO V_NRCKLISTPRODINF
     FROM CKLISTPRODINF c
          INNER JOIN( SELECT CDLISTA FROM LISTA L WHERE L.NRLISTA = P_NRLISTA_CKLISTS ) L ON TO_NUMBER(L.CDLISTA) = C.NRCKLISTPRODINF                                
    WHERE C.CDFILIAL = P_CDFILIAL      
      AND C.DTPRODUCAOCALC = P_DTPRODUCAO
      AND C.CDSETOR = P_CDSETOR
      AND C.NRTURNO = P_NRTURNO
      AND C.NRCATEGORIAPROD = P_NRCATEGORIAPROD
      AND NVL(C.NRSUBCATEGORIAPROD, -73) = NVL(P_NRSUBCATEGORIAPROD, -73)
      AND ((V_QUEBRA_POR_TIPOPROD = 'N') OR (C.NRTIPOPROD = V_NRTIPOPROD))
      AND NVL(C.NRTIPONEGOCIOINF, -73) = NVL(P_NRTIPONEGOCIOINF, -73);
   
   /*Inclui checklist caso, neste processo em execucao, ainda nao exista*/
   IF V_NRCKLISTPRODINF IS NULL THEN
      /*Gera nova chave para o checklist*/
      NOVO_CODIGO_NT('CKLISTPRODINF' || P_CDFILIAL, V_SEQ);
      V_NRCKLISTPRODINF := TO_NUMBER(V_SEQ);

      /*Forma nova numeracao para o checklist*/
      /*>>>>*/
      V_PREFIXO := P_CDFILIAL || TO_CHAR(P_DTPRODUCAO, 'YYYYMMDD');

      SELECT MAX(CDCKLISTPRODINF)
        INTO V_MAX_CDCKLIST
        FROM CKLISTPRODINF
       WHERE CDFILIAL = P_CDFILIAL
         AND DTPRODUCAOCALC = P_DTPRODUCAO;

      IF V_MAX_CDCKLIST IS NULL THEN
         V_SEQCKLIST := 1;
      ELSE
         V_SEQCKLIST := TO_NUMBER(SUBSTR(V_MAX_CDCKLIST, -5)) + 1;
      END IF;

      V_CDCKLISTPRODINF := V_PREFIXO || LPAD(TO_CHAR(V_SEQCKLIST), 5, '0');
      /*<<< Fim da formacao da numeracao do checklist*/      

      INSERT INTO CKLISTPRODINF
      (
      CDFILIAL, NRCKLISTPRODINF, CDCKLISTPRODINF, 
      DTPRODUCAOCALC, DTPRODUCAOINF, 
      CDSETOR, NRTURNO, NRCATEGORIAPROD, NRSUBCATEGORIAPROD, 
      NRTIPOPROD, NRTIPONEGOCIOINF, IDTIPOPLAN, IDSITUACAO,
      NRORG, NRORGINCLUSAO, NRORGULTATU,
      DTINCLUSAO, DTULTATU, 
      CDOPERINCLUSAO, CDOPERULTATU, IDATIVO 
      )
      VALUES
      (
      P_CDFILIAL, V_NRCKLISTPRODINF, V_CDCKLISTPRODINF,
      P_DTPRODUCAO, P_DTPRODUCAO,
      P_CDSETOR, P_NRTURNO, P_NRCATEGORIAPROD, P_NRSUBCATEGORIAPROD,
      V_NRTIPOPROD, P_NRTIPONEGOCIOINF, P_IDTIPOPLAN, 'PENDENTE',
      P_NRORG, P_NRORG, P_NRORG,
      SYSDATE, SYSDATE, 
      P_CDOPERADOR, P_CDOPERADOR, 'S'
      );

      /*Atualiza a lista de checklists deste processo*/
      INSERT INTO LISTA
      (NRLISTA, CDLISTA, NRORG)
      VALUES
      (P_NRLISTA_CKLISTS, TO_CHAR(V_NRCKLISTPRODINF) , P_NRORG);
   END IF;

   /*Busca a receita no checklist, se ja existir*/
   SELECT MAX(R.NRRECCKLISTPRODINF)
     INTO V_NRRECCKLISTPRODINF
     FROM RECCKLISTPRODINF R
    WHERE R.CDFILIAL = P_CDFILIAL
      AND R.NRCKLISTPRODINF = V_NRCKLISTPRODINF
      AND R.CDRECEITA = P_CDRECEITA;

   /*Se a receita ainda nao esta no checklist, faz a inclusao*/
   IF V_NRRECCKLISTPRODINF IS NULL THEN
      /*Gera nova chave para a receita*/
      NOVO_CODIGO_NT('RECCKLISTPRODINF' || P_CDFILIAL, V_SEQ);
      V_NRRECCKLISTPRODINF := TO_NUMBER(V_SEQ);
      
      INSERT INTO RECCKLISTPRODINF
      (
      CDFILIAL, NRRECCKLISTPRODINF, NRCKLISTPRODINF, 
      CDRECEITA, QTRECEITACALC, QTRECEITAINF, 
      QTRECEITAEST, QTRECEITAPROD, QTRECEITAREJDESP,
      NRORG, NRORGINCLUSAO, NRORGULTATU,
      DTINCLUSAO, DTULTATU, 
      CDOPERINCLUSAO, CDOPERULTATU, IDATIVO
      )
      VALUES
      (
      P_CDFILIAL, V_NRRECCKLISTPRODINF, V_NRCKLISTPRODINF,
      P_CDRECEITA, 0.00, 0.00,
      0.00, 0.00, 0.00,      
      P_NRORG, P_NRORG, P_NRORG,
      SYSDATE, SYSDATE, 
      P_CDOPERADOR, P_CDOPERADOR, 'S'
      );      
   END IF;

   /*Busca receita no destino*/
   SELECT MAX(NRDESTCKLISTPRODINF)
     INTO V_NRDESTCKLISTPRODINF
     FROM DESTCKLISTPRODINF
    WHERE CDFILIAL = P_CDFILIAL
      AND NRRECCKLISTPRODINF = V_NRRECCKLISTPRODINF
      AND CDCIA  = P_CDCIA
      AND NVL(NRVOO, '>>>NENHUM<<<')  = NVL(P_NRVOO, '>>>NENHUM<<<')
      AND NVL(CDTRECHO, '>>>NENHUM<<<')  = NVL(P_CDTRECHO, '>>>NENHUM<<<')
      AND NVL(CDRECEITADEST, '<<<SEM RECEITA DESTINO>>>>') = NVL(P_CDRECEITADEST, '<<<SEM RECEITA DESTINO>>>>')
      AND CDCLASSE  = P_CDCLASSE
      AND NVL(CDCICLO, '>>>NENHUM<<<') = NVL(P_CDCICLO, '>>>NENHUM<<<')
      AND NVL(NRSERVICOCIAFILI, -7777777777) = NVL(P_NRSERVICOCIAFILI, -7777777777);

   IF V_NRDESTCKLISTPRODINF IS NULL THEN
      /*Gera nova chave para o destino da receita*/
      NOVO_CODIGO_NT('DESTCKLISTPRODINF' || P_CDFILIAL, V_SEQ);
      V_NRDESTCKLISTPRODINF := TO_CHAR(V_SEQ);

      /*Insere receita no destino*/
      INSERT INTO DESTCKLISTPRODINF
      (
      CDFILIAL, NRRECCKLISTPRODINF, NRDESTCKLISTPRODINF,
      DTATENDIMENTO, CDRECEITADEST, QTRECEITADEST, 
      CDCIA, NRVOO, CDTRECHO, CDCLASSE, 
      CDCICLO, NRSERVICOCIAFILI, 
      QTRECEITACALC, QTRECEITAINF, 
      QTRECEITAEST, QTRECEITAPROD, QTRECEITAREJDESP,   
      NRORG, NRORGINCLUSAO, NRORGULTATU,
      DTINCLUSAO, DTULTATU, 
      CDOPERINCLUSAO, CDOPERULTATU, IDATIVO
      )
      VALUES
      (
      P_CDFILIAL, V_NRRECCKLISTPRODINF, V_NRDESTCKLISTPRODINF,
      P_DTATENDIMENTO, P_CDRECEITADEST, P_QTRECEITADEST, 
      P_CDCIA, P_NRVOO, P_CDTRECHO, P_CDCLASSE, 
      P_CDCICLO, P_NRSERVICOCIAFILI, 
      V_QTRECEITA, V_QTRECEITA, 
      0.00, 0.00, 0.00,
      P_NRORG, P_NRORG, P_NRORG,
      SYSDATE, SYSDATE, 
      P_CDOPERADOR, P_CDOPERADOR, 'S'
      );
   ELSE
      UPDATE DESTCKLISTPRODINF       
         SET QTRECEITACALC = QTRECEITACALC + V_QTRECEITA,
             QTRECEITAINF = QTRECEITAINF + V_QTRECEITA,
             NRORGULTATU = P_NRORG,
             CDOPERULTATU = P_CDOPERADOR,
             DTULTATU = SYSDATE
       WHERE CDFILIAL = P_CDFILIAL
         AND NRDESTCKLISTPRODINF = V_NRDESTCKLISTPRODINF;
   END IF;

   /*Atualiza a receita no checklist*/
   UPDATE RECCKLISTPRODINF
      SET QTRECEITACALC = QTRECEITACALC + V_QTRECEITA,
          QTRECEITAINF = QTRECEITAINF + V_QTRECEITA,
          NRORGULTATU = P_NRORG,
          CDOPERULTATU = P_CDOPERADOR,
          DTULTATU = SYSDATE
    WHERE CDFILIAL = P_CDFILIAL
      AND NRRECCKLISTPRODINF = V_NRRECCKLISTPRODINF;      
END;
/