CREATE OR REPLACE FUNCTION SPED_BLOCOK(
   P_CDEMPRESA    IN EMPRESA.CDEMPRESA%TYPE,
   P_CDINSCESTA   IN EMPRESA.CDINSCESTA%TYPE,
   P_DTINICIAL    IN NOTAFISCAL.DTENTRSAID%TYPE,
   P_DTFINAL      IN NOTAFISCAL.DTENTRSAID%TYPE,
   P_NRSEQARQMAG  IN ARQMAGNETICO.NRSEQARQMAG%TYPE,
   P_LIVROMAG     IN LIVROMAGNETICO.CDLIVROMAG%TYPE,
   P_GERABLOCOK   IN DADOSGERSPED.IDGERABLOCOK%TYPE,
   P_ORIGBLOCOK   IN DADOSGERSPED.IDORIGBLOCOK%TYPE,
   P_TOTALIZA     IN NUMBER) RETURN VARCHAR
AS
   V_CONTREGK     NUMBER;
   V_MOVIMENT     NUMBER;
   V_PRODUTO      VARCHAR2(10);
   V_SEQUPROD     NUMBER;
   V_UNID         VARCHAR2(100);
   V_SGUNIDADE    VARCHAR2(100);
   V_COD_PAR      VARCHAR2(100);
   V_CLIENT_INFO  VARCHAR2(64);
   V_CDOPERADOR   OPERADOR.CDOPERADOR%TYPE;
   V_SEQUMOVI     VARCHAR2(20);
   V_PARTICIPANTE VARCHAR2(50);   
BEGIN
   V_SEQUPROD := NVL(P_TOTALIZA,0);

   IF P_GERABLOCOK IN ('S','E') THEN

      /*REGISTRO K100 - PERIODO DE APURACAO*/
      V_CONTREGK := NVL(V_CONTREGK,0) + 1;
      INSERT INTO ARQMAGNETICO
        (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
      VALUES
        ('75'||LPAD(RTRIM(V_CONTREGK),8,'0'), '|K100'||'|'||TO_CHAR(P_DTINICIAL,'DDMMYYYY')||'|'||TO_CHAR(P_DTFINAL,'DDMMYYYY')||'|', P_NRSEQARQMAG);

      /*REGISTRO K200: ESTOQUE ESCRITURADO*/
      FOR C_REGK200 IN (SELECT '|K200'                                  ||'|'||
                               NVL(TO_CHAR(P_DTFINAL,'DDMMYYYY'),'')    ||'|'||
                               E.CDARVPROD                              ||'|'||
                               REPLACE(LTRIM(TO_CHAR(NVL(ROUND(E.QTD,3),0), '999999999990.000')), '.', ',') ||'|'||
                               E.IND_EST                                ||'|' AS ARQ_K200,
                               --REPLACE(REPLACE(REPLACE(REPLACE(E.IDPARTICIPANTE||E.PARTICIPANTE,'.'),'-'),'/'),' ') ||'|'
                               E.CDPRODUTO, E.IDPARTICIPANTE||E.PARTICIPANTE AS PARTICIPANTE
                          FROM TABLE(BLOCOK_ESTOQUE(P_CDEMPRESA, P_CDINSCESTA, P_DTFINAL, P_LIVROMAG))E) LOOP

         V_PARTICIPANTE := '';
         /* CODIGO DO PARTICIPANTE */
         SELECT MAX(CDCHAVEREG)
           INTO V_COD_PAR
           FROM TMP_REGDADOSSPED
          WHERE CDCHAVEREG = C_REGK200.PARTICIPANTE
            AND CDREGISTRO = '0150';

         IF (V_COD_PAR IS NULL) AND (C_REGK200.PARTICIPANTE IS NOT NULL) THEN
            V_PARTICIPANTE := RETORNA_PARTICIPANTE_SPED(C_REGK200.PARTICIPANTE);
            IF V_PARTICIPANTE IS NULL THEN
               V_SEQUPROD := NVL(V_SEQUPROD,0) + 1;
               INSERT INTO TMP_REGDADOSSPED
                 (CDREGISTRO, CDCONTREGI, CDCHAVEREG)
               VALUES
                 ('0150', V_SEQUPROD, C_REGK200.PARTICIPANTE);
            END IF;
         END IF;

         V_PARTICIPANTE := REPLACE(REPLACE(REPLACE(REPLACE(NVL(V_PARTICIPANTE,C_REGK200.PARTICIPANTE),'.'),'-'),'/'),' ')||'|';

         /*CODIGO DO PRODUTO*/
         SELECT MAX(CDCHAVEREG)
           INTO V_PRODUTO
           FROM TMP_REGDADOSSPED
          WHERE CDCHAVEREG = C_REGK200.CDPRODUTO
            AND CDREGISTRO = '0200';

         IF (V_PRODUTO IS NULL) AND (C_REGK200.CDPRODUTO IS NOT NULL) THEN
            V_SEQUPROD := NVL(V_SEQUPROD,0) + 1;
            INSERT INTO TMP_REGDADOSSPED
               (CDREGISTRO, CDCONTREGI, CDCHAVEREG)
            VALUES
               ('0200', V_SEQUPROD, C_REGK200.CDPRODUTO);
         END IF;

         /*UNIDADE DE MEDIDA */
         BEGIN
            SELECT SGUNIDADE
              INTO V_SGUNIDADE
              FROM PRODUTO
             WHERE CDPRODUTO = C_REGK200.CDPRODUTO;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_SGUNIDADE := NULL;
         END;

         SELECT MAX(CDCHAVEREG)
           INTO V_UNID
           FROM TMP_REGDADOSSPED
          WHERE CDCHAVEREG = V_SGUNIDADE
            AND CDREGISTRO = '0190';

         IF (V_UNID IS NULL) AND (V_SGUNIDADE IS NOT NULL) THEN
             V_SEQUPROD := NVL(V_SEQUPROD,0) + 1;
             INSERT INTO TMP_REGDADOSSPED
               (CDREGISTRO, CDCONTREGI, CDCHAVEREG)
             VALUES
               ('0190', V_SEQUPROD, V_SGUNIDADE);
         END IF;
         V_UNID := NULL;

         V_CONTREGK := NVL(V_CONTREGK,0) + 1;
         INSERT INTO ARQMAGNETICO
            (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
         VALUES
            ('75'||LPAD(RTRIM(V_CONTREGK), 8, '0'), C_REGK200.ARQ_K200||V_PARTICIPANTE, P_NRSEQARQMAG);
      END LOOP;

      IF P_GERABLOCOK = 'S' THEN
         /*REGISTRO K220: OUTRAS MOVIMENTACOES INTERNAS ENTRE MERCADORIAS*/
         --Nao Sera Implementado, ainda nao existe a reclassificacao de produtos no Sistema

         /*CASO GERE O ARQUIVO COM INFORMACOES DO PLANEJAMENTO ALIMENTAR, DEVE GRAVAR A TABELA COM A RECEITA PADRAO*/
         IF P_ORIGBLOCOK IN ('0','2') THEN
            DBMS_APPLICATION_INFO.READ_CLIENT_INFO(V_CLIENT_INFO);
            V_CDOPERADOR := SUBSTR(V_CLIENT_INFO,1,12);
            BLOCOK_PROD_PLANEJ(P_CDEMPRESA, P_CDINSCESTA, P_DTINICIAL, P_DTFINAL, V_CDOPERADOR);
         END IF;

         /*REGISTRO K230: ITENS PRODUZIDOS*/
         FOR C_REGK230 IN (SELECT '|K230'                                  ||'|'||
                                  NVL(TO_CHAR(P.DTINICIOOP,'DDMMYYYY'),'') ||'|'||
                                  NVL(TO_CHAR(P.DTFINALOP, 'DDMMYYYY'),'') ||'|'||
                                  P.NRORDPROD                              ||'|'||
                                  P.CDARVPROD                              ||'|'||
                                  REPLACE(LTRIM(TO_CHAR(NVL(ROUND(CASE WHEN P.DTPRODACABADO BETWEEN P_DTINICIAL AND P_DTFINAL
                                                                       THEN P.QTPRACABADO ELSE 0 END,6),0), '999999999990.000000')), '.', ',') ||'|' AS ARQ_K230,
                                  P.NRORDPROD, P.CDPRODUTO, TO_DATE('') AS DTRETIRADA, '' AS CDFILIAL,
                                  '' AS CDSERVFILI, '' AS CDFILANCESTQ, '' AS NRLANCESTQ,'P' AS IDORIGEM
                             FROM BLOCOK_PRODUCAO_K230 P
                            WHERE P.CDEMPRESA    = P_CDEMPRESA
                              AND P.CDINSCESTA   = P_CDINSCESTA
                              AND ((P.DTPRODACABADO BETWEEN P_DTINICIAL AND P_DTFINAL) OR
                                   (P.DTSAIDAEST    BETWEEN P_DTINICIAL AND P_DTFINAL))
                              AND P.CDPRODINSUMO IS NULL
                              AND P_ORIGBLOCOK IN ('1','2')
                            UNION ALL
                           SELECT '|K230'                                  ||'|'||
                                  NVL(TO_CHAR(A.DTRETIRADA,'DDMMYYYY'),'') ||'|'||
                                  NVL(TO_CHAR(A.DTRETIRADA,'DDMMYYYY'),'') ||'|'||
                                  A.NRPRODUCAO                             ||'|'||
                                  A.CDARVPRODACAB                          ||'|'||
                                  REPLACE(LTRIM(TO_CHAR(NVL(ROUND(A.QTEFETIVOS,6),0), '999999999990.000000')), '.', ',') ||'|' AS ARQ_K230,
                                  TO_CHAR(A.NRPRODUCAO) AS NRORDPROD, A.CDPRODACABADO AS CDPRODUTO, A.DTRETIRADA, A.CDFILIAL,
                                  A.CDSERVFILI, A.CDFILANCESTQ, A.NRLANCESTQ, 'A' AS IDORIGEM
                             FROM TABLE(BLOCOK_PROD_REAL_PAI(P_CDINSCESTA,P_CDEMPRESA,P_DTINICIAL,P_DTFINAL,P_LIVROMAG))A
                            WHERE ROUND(A.QTEFETIVOS,6) > 0
                              AND P_ORIGBLOCOK IN ('0','2')) LOOP

             /*CODIGO DO PRODUTO*/
             SELECT MAX(CDCHAVEREG)
               INTO V_PRODUTO
               FROM TMP_REGDADOSSPED
              WHERE CDCHAVEREG = C_REGK230.CDPRODUTO
                AND CDREGISTRO = '0200';

             IF (C_REGK230.CDPRODUTO IS NOT NULL) THEN
                IF (V_PRODUTO IS NULL) THEN
                   V_SEQUPROD := NVL(V_SEQUPROD,0) + 1;
                   INSERT INTO TMP_REGDADOSSPED
                      (CDREGISTRO, CDCONTREGI, CDCHAVEREG, CDCAMPO1)
                   VALUES
                      ('0200', V_SEQUPROD, C_REGK230.CDPRODUTO, 'S');
                ELSE
                   UPDATE TMP_REGDADOSSPED
                      SET CDCAMPO1   = 'S'
                    WHERE CDCHAVEREG = C_REGK230.CDPRODUTO
                      AND CDREGISTRO = '0200';
                END IF;
             END IF;

             /*UNIDADE DE MEDIDA */
             BEGIN
                SELECT SGUNIDADE
                  INTO V_SGUNIDADE
                  FROM PRODUTO
                 WHERE CDPRODUTO = C_REGK230.CDPRODUTO;
             EXCEPTION
                WHEN NO_DATA_FOUND THEN
                   V_SGUNIDADE := NULL;
             END;

             SELECT MAX(CDCHAVEREG)
               INTO V_UNID
               FROM TMP_REGDADOSSPED
              WHERE CDCHAVEREG = V_SGUNIDADE
                AND CDREGISTRO = '0190';

             IF (V_UNID IS NULL) AND (V_SGUNIDADE IS NOT NULL) THEN
                V_SEQUPROD := NVL(V_SEQUPROD,0) + 1;
                INSERT INTO TMP_REGDADOSSPED
                  (CDREGISTRO, CDCONTREGI, CDCHAVEREG)
                VALUES
                  ('0190', V_SEQUPROD, V_SGUNIDADE);
             END IF;
             V_UNID := NULL;

             V_CONTREGK := NVL(V_CONTREGK,0) + 1;
             INSERT INTO ARQMAGNETICO
                (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
             VALUES
                ('75'||LPAD(RTRIM(V_CONTREGK), 8, '0'), C_REGK230.ARQ_K230, P_NRSEQARQMAG);

             FOR C_REGK235 IN (SELECT '|K235'                                  ||'|'||
                                      NVL(TO_CHAR(P.DTSAIDAEST,'DDMMYYYY'),'') ||'|'||
                                      P.CDARVPRODINSU                          ||'|'||
                                      REPLACE(LTRIM(TO_CHAR(SUM(NVL(ROUND(P.QTRETINSUMO,6),0)), '999999999990.000000')), '.', ',') ||'|'||
                                      CDINSUMOSUBST                            ||'|' AS ARQ_K235,
                                      P.CDPRODINSUMO                
                                 FROM BLOCOK_PRODUCAO_K230 P
                                WHERE P.CDEMPRESA    = P_CDEMPRESA
                                  AND P.CDINSCESTA   = P_CDINSCESTA
                                  AND P.DTSAIDAEST   BETWEEN P_DTINICIAL AND P_DTFINAL
                                  AND P.NRORDPROD    = C_REGK230.NRORDPROD
                                  AND P.CDPRODUTO    = C_REGK230.CDPRODUTO
                                  AND P.CDPRODINSUMO IS NOT NULL
                                  AND C_REGK230.IDORIGEM = 'P'
                                  AND P_ORIGBLOCOK IN ('1','2')
                                  GROUP BY P.DTSAIDAEST, P.CDARVPRODINSU, P.CDINSUMOSUBST, P.CDPRODINSUMO
                                UNION ALL
                               SELECT '|K235'                                  ||'|'||
                                      NVL(TO_CHAR(C_REGK230.DTRETIRADA,'DDMMYYYY'),'') ||'|'||
                                      A.CDARVPROD                              ||'|'||
                                      REPLACE(LTRIM(TO_CHAR(NVL(ROUND(A.QTRETIRADA,6),0), '999999999990.000000')), '.', ',') ||'|'||
                                      ''                                       ||'|' AS ARQ_K235,
                                      A.CDPRODUTO
                                 FROM TABLE(BLOCOK_PROD_REAL_FILHO(P_CDINSCESTA, P_CDEMPRESA, P_DTINICIAL, P_DTFINAL, C_REGK230.DTRETIRADA,
                                                                   C_REGK230.CDFILIAL, C_REGK230.CDSERVFILI, C_REGK230.CDFILANCESTQ, C_REGK230.NRLANCESTQ, P_LIVROMAG)) A
                                WHERE C_REGK230.IDORIGEM = 'A'
                                  AND ROUND(A.QTRETIRADA,3) > 0
                                  AND P_ORIGBLOCOK IN ('0','2')) LOOP
             /*CODIGO DO PRODUTO*/
             SELECT MAX(CDCHAVEREG)
               INTO V_PRODUTO
               FROM TMP_REGDADOSSPED
              WHERE CDCHAVEREG = C_REGK235.CDPRODINSUMO
                AND CDREGISTRO = '0200';

             IF (V_PRODUTO IS NULL) AND (C_REGK235.CDPRODINSUMO IS NOT NULL) THEN
                V_SEQUPROD := NVL(V_SEQUPROD,0) + 1;
                INSERT INTO TMP_REGDADOSSPED
                   (CDREGISTRO, CDCONTREGI, CDCHAVEREG)
                VALUES
                   ('0200', V_SEQUPROD, C_REGK235.CDPRODINSUMO);
             END IF;

             /*UNIDADE DE MEDIDA */
             BEGIN
                SELECT SGUNIDADE
                  INTO V_SGUNIDADE
                  FROM PRODUTO
                 WHERE CDPRODUTO = C_REGK235.CDPRODINSUMO;
             EXCEPTION
                WHEN NO_DATA_FOUND THEN
                   V_SGUNIDADE := NULL;
             END;

             SELECT MAX(CDCHAVEREG)
               INTO V_UNID
               FROM TMP_REGDADOSSPED
              WHERE CDCHAVEREG = V_SGUNIDADE
                AND CDREGISTRO = '0190';

             IF (V_UNID IS NULL) AND (V_SGUNIDADE IS NOT NULL) THEN
                V_SEQUPROD := NVL(V_SEQUPROD,0) + 1;
                INSERT INTO TMP_REGDADOSSPED
                  (CDREGISTRO, CDCONTREGI, CDCHAVEREG)
                VALUES
                  ('0190', V_SEQUPROD, V_SGUNIDADE);
             END IF;
             V_UNID := NULL;

             V_CONTREGK := NVL(V_CONTREGK,0) + 1;
             INSERT INTO ARQMAGNETICO
                (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
             VALUES
                ('75'||LPAD(RTRIM(V_CONTREGK), 8, '0'), C_REGK235.ARQ_K235, P_NRSEQARQMAG);
             END LOOP;
         END LOOP;

         FOR C_REGK250 IN (SELECT '|K250'                                  ||'|'||
                                  NVL(TO_CHAR(N.DTENTRSAID,'DDMMYYYY'),'') ||'|'||
                                  P.CDARVPROD                              ||'|'||
                                  REPLACE(LTRIM(TO_CHAR(NVL(SUM(ROUND(I.QTITEMPROD,6)),0), '999999999990.000000')), '.', ',') ||'|' AS ARQ_K250,
                                  N.NRLANCTONF, N.CDFILIAL, N.DTENTRSAID, P.CDPRODUTO, I.CDPRODNCMTRANS AS CDCLASFISC
                             FROM NOTAFISCAL N, ITEMPRODUTO I, TIPOOPERAC T, TPOPERCFOP O, PRODUTO P
                            WHERE N.CDEMPRESA    = P_CDEMPRESA
                              AND N.CDINSCESTA   = P_CDINSCESTA
                              AND N.DTENTRSAID   BETWEEN P_DTINICIAL AND P_DTFINAL
                              AND N.IDENTRSAIDOP = 'E'
                              AND N.CDFILIAL     = I.CDFILIAL
                              AND N.NRLANCTONF   = I.NRLANCTONF
                              AND I.CDFISOPEITEM IN ('5124','6124')
                              AND I.CDPRODUTO    = P.CDPRODUTO
                              AND N.IDENTRSAIDOP = T.IDENTRSAIDOP
                              AND N.CDTIPOOPER   = T.CDTIPOOPER
                              AND T.IDNFRETIND   = 'S'
                              AND T.IDENTRSAIDOP = O.IDENTRSAIDOP
                              AND T.CDTIPOOPER   = O.CDTIPOOPER
                              AND O.CDFISCOPER   = I.CDFISOPEITEM
                              AND (O.IDATUESTTPCFOP = 'S' OR
                                   (O.IDENTRSAIDOP, O.CDTIPOOPER, O.CDFISCOPER, I.CDPRODUTO )IN (SELECT IDENTRSAIDOP, CDTIPOOPER, CDFISCOPER, CDPRODUTO
                                                                                                   FROM TPOPERCFOPEXCP))
                            GROUP BY N.DTENTRSAID, P.CDARVPROD, N.NRLANCTONF, N.CDFILIAL, N.DTENTRSAID, P.CDPRODUTO, I.CDPRODNCMTRANS) LOOP

            SELECT MAX(CDCHAVEREG)
              INTO V_PRODUTO
              FROM TMP_REGDADOSSPED
             WHERE CDCHAVEREG = C_REGK250.CDPRODUTO
               AND CDREGISTRO = '0200';

            IF (C_REGK250.CDPRODUTO IS NOT NULL) THEN
               IF (V_PRODUTO IS NULL) THEN
                  V_SEQUPROD := NVL(V_SEQUPROD,0) + 1;
                  INSERT INTO TMP_REGDADOSSPED
                     (CDREGISTRO, CDCONTREGI, CDCHAVEREG, CDCAMPO1, CDCAMPO3)
                  VALUES
                     ('0200', V_SEQUPROD, C_REGK250.CDPRODUTO, 'S', C_REGK250.CDCLASFISC);
               ELSE
                  UPDATE TMP_REGDADOSSPED
                     SET CDCAMPO1   = 'S'
                   WHERE CDCHAVEREG = C_REGK250.CDPRODUTO
                     AND CDREGISTRO = '0200';
               END IF;
            END IF;

            V_CONTREGK := NVL(V_CONTREGK,0) + 1;
            INSERT INTO ARQMAGNETICO
               (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
            VALUES
               ('75'||LPAD(RTRIM(V_CONTREGK), 8, '0'), C_REGK250.ARQ_K250, P_NRSEQARQMAG);

            FOR C_REGK255 IN (SELECT '|K255'                                          ||'|'||
                                     NVL(TO_CHAR(C_REGK250.DTENTRSAID,'DDMMYYYY'),'') ||'|'||
                                     P.CDARVPROD                                      ||'|'||
                                     REPLACE(LTRIM(TO_CHAR(NVL(SUM(ROUND(I.QTITEMPROD,6)),0), '999999999990.000000')), '.', ',') ||'|' ||
                                     '' ||'|' AS ARQ_K255, P.CDPRODUTO, I.CDPRODNCMTRANS AS CDCLASFISC
                                FROM ITEMPRODUTO I, PRODUTO P
                               WHERE I.CDFILIAL     = C_REGK250.CDFILIAL
                                 AND I.NRLANCTONF   = C_REGK250.NRLANCTONF
                                 AND I.CDFISOPEITEM IN ('5902','6902')
                                 AND I.CDPRODUTO    = P.CDPRODUTO
                               GROUP BY P.CDARVPROD, P.CDPRODUTO, I.CDPRODNCMTRANS) LOOP

               SELECT MAX(CDCHAVEREG)
                 INTO V_PRODUTO
                 FROM TMP_REGDADOSSPED
                WHERE CDCHAVEREG = C_REGK255.CDPRODUTO
                  AND CDREGISTRO = '0200';

               IF (V_PRODUTO IS NULL) AND (C_REGK255.CDPRODUTO IS NOT NULL) THEN
                  V_SEQUPROD := NVL(V_SEQUPROD,0) + 1;
                  INSERT INTO TMP_REGDADOSSPED
                     (CDREGISTRO, CDCONTREGI, CDCHAVEREG, CDCAMPO3)
                  VALUES
                     ('0200', V_SEQUPROD, C_REGK255.CDPRODUTO, C_REGK255.CDCLASFISC);
               END IF;

               V_CONTREGK := NVL(V_CONTREGK,0) + 1;
               INSERT INTO ARQMAGNETICO
                  (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
               VALUES
                  ('75'||LPAD(RTRIM(V_CONTREGK), 8, '0'), C_REGK255.ARQ_K255, P_NRSEQARQMAG);
            END LOOP;
         END LOOP;
      END IF;

      /*REGISTRO K280: CORRECAO DE APONTAMENTO  ESTOQUE ESCRITURADO*/
      NOVO_CODIGO_NT('RELAT_MOVIEST_K280',V_SEQUMOVI);
      V_SEQUMOVI := SUBSTR(V_SEQUMOVI,11,10);
      MOVIMENTACAO_ESTOQUE_K280(P_CDEMPRESA, P_CDINSCESTA, P_DTINICIAL, P_DTFINAL, V_SEQUMOVI);

      FOR C_REGK280 IN (SELECT '|K280'          ||'|'||
                               NVL(TO_CHAR(ADD_MONTHS(TO_DATE(P_DTFINAL),-1),'DDMMYYYY'),'') ||'|'||
                               E.CDPRODMOVIEST  ||'|'||
                               CASE WHEN (E.QTLANCTOEST - E.QTTOTALANT) > 0
                                    THEN REPLACE(LTRIM(TO_CHAR(NVL(ROUND((E.QTLANCTOEST - E.QTTOTALANT),3),0), '999999999990.000')), '.', ',')
                                    ELSE '' END ||'|'||
                               CASE WHEN (E.QTLANCTOEST - E.QTTOTALANT) < 0
                                    THEN REPLACE(LTRIM(TO_CHAR(NVL(ROUND(ABS((E.QTLANCTOEST - E.QTTOTALANT)),3),0), '999999999990.000')), '.', ',')
                                    ELSE '' END ||'|'||
                               IND_EST          ||'|' AS ARQ_K280,
                               --REPLACE(REPLACE(REPLACE(REPLACE(E.IDPARTICIPANTE||E.PARTICIPANTE,'.'),'-'),'/'),' ') ||'|'
                               E.CDPRODUTO, E.IDPARTICIPANTE||E.PARTICIPANTE AS PARTICIPANTE
                          FROM RELACPRODITGEN R, TIPOITEMBLOCOK T,
                               (SELECT R.CDPRODMOVIEST, R.CDPRODUTO, SUM(A.QTLANCTOEST) AS QTLANCTOEST, SUM(R.QTTOTALANT) AS QTTOTALANT,
                                       FC.IDPARTICIPANTE, FC.PARTICIPANTE, CASE WHEN NVL(FC.CDALMOXINFO,  'X') <> 'X' THEN '1'
                                                                                WHEN NVL(FC.CDALMOXTERC,  'X') <> 'X' THEN '2'
                                                                                WHEN NVL(FC.CDALMOXARIFE, 'X') <> 'X' THEN '2'
                                                                                ELSE '0' END IND_EST
                                  FROM RELAT_MOVIEST_K280 R, LOTE L,
                                       ITLANCTOEST A LEFT JOIN (SELECT A.CDFILIAL, A.CDCLIENTE AS PARTICIPANTE, 'C' AS IDPARTICIPANTE, A.CDALMOXARIFE,
                                                                       A.CDLOCALESTOQ, C.NRINSJURCLIE AS NRINSJUR,
                                                                       A.CDALMOXTERCCLI CDALMOXTERC, A.CDLOCALTERCCLI CDLOCALTERC,
                                                                       A.CDALMOXINFOCLI CDALMOXINFO, A.CDLOCALINFOCLI CDLOCALINFO
                                                                  FROM AGENTETERCECLI A, CLIENTE C
                                                                 WHERE A.CDCLIENTE  = C.CDCLIENTE
                                                                 UNION
                                                                SELECT A.CDFILIAL, A.CDFORNECED AS PARTICIPANTE, 'F' AS IDPARTICIPANTE, A.CDALMOXARIFE,
                                                                       A.CDLOCALESTOQ, C.NRINSJURFORN AS NRINSJUR,
                                                                       A.CDALMOXTERCFOR CDALMOXTERC, A.CDLOCALTERCFOR CDLOCALTERC,
                                                                       A.CDALMOXINFOFOR CDALMOXINFO, A.CDLOCALINFOFOR CDLOCALINFO
                                                                  FROM AGENTETERCEFOR A, FORNECEDOR C
                                                                 WHERE A.CDFORNECED = C.CDFORNECED) FC ON (FC.CDFILIAL       = A.CDFILIAL AND
                                                                                                          ((FC.CDALMOXARIFE = A.CDALMOXARIFE AND
                                                                                                            FC.CDLOCALESTOQ = A.CDLOCALESTOQ) OR
                                                                                                           (FC.CDALMOXTERC  = A.CDALMOXARIFE AND
                                                                                                            FC.CDLOCALTERC  = A.CDLOCALESTOQ) OR
                                                                                                           (FC.CDALMOXINFO  = A.CDALMOXARIFE AND
                                                                                                            FC.CDLOCALINFO  = A.CDLOCALESTOQ)))
                                 WHERE R.NRRELATMOVI  = V_SEQUMOVI
                                   AND A.CDFILIAL     = R.CDFILLANCMEST
                                   AND A.CDFILIMOVI   = R.CDFILIMOVIEST
                                   AND A.NRLANCESTQ   = R.NRLANCMOVIEST
                                   AND A.NRSEQUITEM   = R.NRSEQUMOVIEST
                                   AND A.CDALMOXARIFE = R.CDALMOXARIRM
                                   AND A.CDLOCALESTOQ = R.CDLOCALESTRM
                                   AND A.IDTIPOMOVI   = R.IDTIPOMOVIEST
                                   AND A.IDTIPOMOVI   = '1'
                                   AND A.CDFILIMOVI   = L.CDFILIAL
                                   AND A.NRLOTEESTQ   = L.NRLOTEESTQ
                                   AND A.NRSUBLOTE    = L.NRSUBLOTE
                                   AND A.CDPRODMOVI   = L.CDPRODUTO
                                   AND ABS(ROUND(A.QTLANCTOEST - R.QTTOTALANT,3)) > 0
                                 GROUP BY R.CDPRODMOVIEST, R.CDPRODUTO, FC.IDPARTICIPANTE, FC.PARTICIPANTE,
                                       CASE WHEN NVL(FC.CDALMOXINFO,  'X') <> 'X' THEN '1'
                                            WHEN NVL(FC.CDALMOXTERC,  'X') <> 'X' THEN '2'
                                            WHEN NVL(FC.CDALMOXARIFE, 'X') <> 'X' THEN '2'
                                            ELSE '0' END)E
                         WHERE R.CDPRODUTO     = E.CDPRODUTO
                           AND R.CDLIVROMAG    = P_LIVROMAG
                           AND R.CDTPITEMPROD  = T.CDTPITEMPROD
                           AND T.IDITEMESTOQUE = 'S') LOOP

         V_PARTICIPANTE := '';
         /* CODIGO DO PARTICIPANTE */
         SELECT MAX(CDCHAVEREG)
           INTO V_COD_PAR
           FROM TMP_REGDADOSSPED
          WHERE CDCHAVEREG = C_REGK280.PARTICIPANTE
            AND CDREGISTRO = '0150';

         IF (V_COD_PAR IS NULL) AND (C_REGK280.PARTICIPANTE IS NOT NULL) THEN
            V_PARTICIPANTE := RETORNA_PARTICIPANTE_SPED(C_REGK280.PARTICIPANTE);
            IF V_PARTICIPANTE IS NULL THEN
               V_SEQUPROD := NVL(V_SEQUPROD,0) + 1;
               INSERT INTO TMP_REGDADOSSPED
                 (CDREGISTRO, CDCONTREGI, CDCHAVEREG)
               VALUES
                 ('0150', V_SEQUPROD, C_REGK280.PARTICIPANTE);
            END IF;
         END IF;

         V_PARTICIPANTE := REPLACE(REPLACE(REPLACE(REPLACE(NVL(V_PARTICIPANTE,C_REGK280.PARTICIPANTE),'.'),'-'),'/'),' ')||'|';
                           
         /*CODIGO DO PRODUTO*/
         SELECT MAX(CDCHAVEREG)
           INTO V_PRODUTO
           FROM TMP_REGDADOSSPED
          WHERE CDCHAVEREG = C_REGK280.CDPRODUTO
            AND CDREGISTRO = '0200';

         IF (V_PRODUTO IS NULL) AND (C_REGK280.CDPRODUTO IS NOT NULL) THEN
            V_SEQUPROD := NVL(V_SEQUPROD,0) + 1;
            INSERT INTO TMP_REGDADOSSPED
               (CDREGISTRO, CDCONTREGI, CDCHAVEREG)
            VALUES
               ('0200', V_SEQUPROD, C_REGK280.CDPRODUTO);
         END IF;

         /*UNIDADE DE MEDIDA */
         BEGIN
            SELECT SGUNIDADE
              INTO V_SGUNIDADE
              FROM PRODUTO
             WHERE CDPRODUTO = C_REGK280.CDPRODUTO;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_SGUNIDADE := NULL;
         END;

         SELECT MAX(CDCHAVEREG)
           INTO V_UNID
           FROM TMP_REGDADOSSPED
          WHERE CDCHAVEREG = V_SGUNIDADE
            AND CDREGISTRO = '0190';

         IF (V_UNID IS NULL) AND (V_SGUNIDADE IS NOT NULL) THEN
             V_SEQUPROD := NVL(V_SEQUPROD,0) + 1;
             INSERT INTO TMP_REGDADOSSPED
               (CDREGISTRO, CDCONTREGI, CDCHAVEREG)
             VALUES
               ('0190', V_SEQUPROD, V_SGUNIDADE);
         END IF;
         V_UNID := NULL;

         V_CONTREGK := NVL(V_CONTREGK,0) + 1;
         INSERT INTO ARQMAGNETICO
            (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
         VALUES
            ('75'||LPAD(RTRIM(V_CONTREGK), 8, '0'), C_REGK280.ARQ_K280||V_PARTICIPANTE, P_NRSEQARQMAG);
      END LOOP;
   END IF;

   IF P_DTINICIAL >= '01/01/2016' THEN
      IF V_CONTREGK <> 0 THEN
         V_MOVIMENT := 0;
      ELSE
         V_MOVIMENT := 1;
      END IF;

      /* ABERTURA DO REGISTRO K */
      V_CONTREGK := NVL(V_CONTREGK,0) + 1;
      INSERT INTO ARQMAGNETICO
        (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
      VALUES
        ('75'||LPAD('0', 8, '0'), '|K001'|| '|' ||V_MOVIMENT|| '|', P_NRSEQARQMAG);

      /* ENCERRAMENTO DO BLOCO K */
      V_CONTREGK := NVL(V_CONTREGK,0) + 1;
      INSERT INTO ARQMAGNETICO
        (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
      VALUES
        ('79'||LPAD(RTRIM(V_CONTREGK), 8, '0'), '|K990'|| '|' ||V_CONTREGK|| '|', P_NRSEQARQMAG);
   END IF;

   RETURN(LPAD(TO_CHAR(NVL(V_CONTREGK,0)),10, '0')||LPAD(TO_CHAR(NVL(V_SEQUPROD,0)),10,'0'));
END;
/