CREATE OR ALTER PROCEDURE SPC_MOVIMENTO_CAIXA (
    ESTABELECIMENTO_ID INTEGER,
    DATA DATE)
RETURNS (
    TIPO INTEGER,
    DESCRICAO VARCHAR(200),
    VALOR NUMERIC(15,2))
AS
DECLARE VARIABLE VESTABELECIMENTO_ID          INTEGER;
DECLARE VARIABLE VESTABELECIMENTO_RAZAOSOCIAL VARCHAR(100);
DECLARE VARIABLE VESTABELECIMENTO_CNPJ        VARCHAR(20);
DECLARE VARIABLE VDATA                        DATE;
DECLARE VARIABLE VDIA                         VARCHAR(20);
DECLARE VARIABLE VCAIXA_ID                    INTEGER;
DECLARE VARIABLE VCAIXA_DESCRICAO             VARCHAR(50);
DECLARE VARIABLE VCONTA                       INTEGER;
DECLARE VARIABLE VCONTA_DESCRICAO             VARCHAR(50);
DECLARE VARIABLE VDATAHORA_ABERTURA           TIMESTAMP;
DECLARE VARIABLE VOPERADOR_ABERTURA           VARCHAR(50);
DECLARE VARIABLE VDATAHORA_FECHAMENTO         TIMESTAMP;
DECLARE VARIABLE VOPERADOR_FECHAMENTO         VARCHAR(50);
DECLARE VARIABLE VSALDO_ABERTURA              NUMERIC(18,2);
DECLARE VARIABLE VSALDO_FECHAMENTO            NUMERIC(18,2);
DECLARE VARIABLE VCLASSIFICACAO_CODIGO        VARCHAR(10);
DECLARE VARIABLE VCLASSIFICACAO_DESCRICAO     VARCHAR(100);
DECLARE VARIABLE VDOCUMENTO                   VARCHAR(100);
DECLARE VARIABLE VFORMA_PAG_ID                INTEGER;
DECLARE VARIABLE VFORMA_PAG_DESCRICAO         VARCHAR(100);
DECLARE VARIABLE VVALOR                       NUMERIC(18,2);
DECLARE VARIABLE VTOTAL                       NUMERIC(18,2);
Begin

     FOR
        SELECT E.CODIGO AS ESTABELECIMENTO_ID,
               E.RAZAOSOCIAL AS ESTABELECIMENTO_RAZAOSOCIAL,
               FN_MASK(E.CNPJ,'CNPJ') AS ESTABELECIMENTO_CNPJ,
               M.DATA,
               FN_DIA_SEMANA(M.DATA) AS DIA,
               A.ID AS CAIXA_ID,
               A.DESCRICAO AS CAIXA_DESCRICAO,
               CB.CODIGO AS CONTA,
               CB.NOME AS CONTA_DESCRICAO,
               M.DATAHORA_ABERTURA,
              (SELECT FIRST 1 U.NOME FROM TBUSUARIO U WHERE U.CODIGO = M.OPERADOR_ABERTURA) OPERADOR_ABERTURA,
               M.DATAHORA_FECHAMENTO,
              (SELECT FIRST 1 U.NOME FROM TBUSUARIO U WHERE U.CODIGO = M.OPERADOR_FECHAMENTO) OPERADOR_FECHAMENTO,

               COALESCE(
               (SELECT FIRST 1 CAST(B.SALDO AS NUMERIC(15,2))
                  FROM TBCAIXABANCO_SALDO_DIARIO B
                 WHERE B.CODIGO = CB.CODIGO
                   AND B.DATA < :DATA
                 ORDER BY B.DATA DESC)
                ,0) SALDO_ABERTURA,
        
               COALESCE(
               (SELECT FIRST 1 CAST(B.SALDO AS NUMERIC(15,2))
                  FROM TBCAIXABANCO_SALDO_DIARIO B
                 WHERE B.CODIGO = CB.CODIGO
                   AND B.DATA <= :DATA
                   ORDER BY B.DATA DESC)
                ,0) SALDO_FECHAMENTO
        
          FROM TBESTABELECIMENTO E,
               TBPDV A
               INNER JOIN TBPDV_CAIXA PC ON PC.PDV_ID = A.ID
               LEFT JOIN TBPDV_MOVIMENTO  M ON M.PDV_ID = A.ID AND CAST(M.DATA AS DATE) = :DATA
          --   LEFT JOIN TBPDV_OPERADOR OPA ON OPA.ID = M.OPERADOR_ABERTURA
          --   LEFT JOIN TBPDV_OPERADOR OPF ON OPF.ID = M.OPERADOR_FECHAMENTO
               LEFT JOIN TBCAIXABANCO    CB ON CB.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_ID AND CB.CODIGO = PC.CAIXABANCO_ID
         WHERE A.ESTABELECIMENTO_ID = E.CODIGO
           AND A.ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
      INTO :vESTABELECIMENTO_ID,
           :vESTABELECIMENTO_RAZAOSOCIAL,
           :vESTABELECIMENTO_CNPJ,
           :vDATA,
           :vDIA,
           :vCAIXA_ID,
           :vCAIXA_DESCRICAO,
           :vCONTA,
           :vCONTA_DESCRICAO,
           :vDATAHORA_ABERTURA,
           :vOPERADOR_ABERTURA,
           :vDATAHORA_FECHAMENTO,
           :vOPERADOR_FECHAMENTO,
           :vSALDO_ABERTURA,
           :vSALDO_FECHAMENTO
        DO BEGIN

           TIPO = 1; VALOR = null; DESCRICAO = 'ESTABELECIMENTO: '||FN_LPAD(vESTABELECIMENTO_ID,2,'0')||' - '||vESTABELECIMENTO_RAZAOSOCIAL; SUSPEND;
           TIPO = 1; VALOR = null; DESCRICAO = 'CNPJ: '||vESTABELECIMENTO_CNPJ; SUSPEND;
           TIPO = 0; VALOR = null; DESCRICAO = ''; SUSPEND;
           TIPO = 2; VALOR = null; DESCRICAO = 'CAIXA: '||FN_LPAD(vCAIXA_ID,2,'0')||' - '||vCAIXA_DESCRICAO; SUSPEND;
           TIPO = 2; VALOR = null; DESCRICAO = 'CONTA: '||FN_LPAD(vCONTA,3,'0')||' - '||vCONTA_DESCRICAO; SUSPEND;
           TIPO = 2; VALOR = null; DESCRICAO = 'DATA: '||FORMATDATE(vDATA)||' - '||vDIA; SUSPEND;
           TIPO = 2; VALOR = null; DESCRICAO = 'DATA/HORA ABERTURA: '||COALESCE(FORMATDATETIME(vDATAHORA_ABERTURA),'NÃO ESTÁ ABERTO')||' - '||COALESCE(vOPERADOR_ABERTURA,''); SUSPEND;
           TIPO = 2; VALOR = null; DESCRICAO = 'DATA/HORA FECHAMENTO: '||COALESCE(FORMATDATETIME(vDATAHORA_FECHAMENTO),'NÃO ESTÁ FECHADO')||' - '||COALESCE(vOPERADOR_FECHAMENTO,''); SUSPEND;
           TIPO = 0; VALOR = null; DESCRICAO = ''; SUSPEND;

           IF(vDATAHORA_ABERTURA is not null) Then
              Begin
              TIPO = 3; VALOR = vSALDO_ABERTURA; DESCRICAO = 'SALDO ABERTURA: '; SUSPEND;
              TIPO = 0; VALOR = null; DESCRICAO = ''; SUSPEND;
              End

           TIPO = 4; VALOR = null; DESCRICAO = 'ENTRADAS DO DIA'; SUSPEND;
           /**/
           vTOTAL = 0;
            FOR
            SELECT FN_MASK(C.CLASSIFICACAO_CONTABIL,'CLASS') AS CLASSIFICACAO_CODIGO,
                   CC.DESCRICAO AS CLASSIFICACAO_DESCRICAO,
                   CAST(SUM(C.VALOR) AS NUMERIC(15,2)) AS VALOR
              FROM TBCAIXABANCO_LANCAMENTO A,
                   TBCAIXABANCO_LANCAMENTO_CLASS C,
                   TBCLASSIFICACAO_CONTABIL CC
             WHERE C.CAIXABANCO_CONTROLE = A.CONTROLE
               AND C.CLASSIFICACAO_CONTABIL = CC.CODIGO
               AND A.CAIXABANCO_CODIGO = :vCONTA
               AND A.DATA_LANCAMENTO = :DATA
               AND A.VALOR_TOTAL > 0
               AND A.NATUREZA = 'D'
          GROUP BY 1,2
           INTO :vCLASSIFICACAO_CODIGO, :vCLASSIFICACAO_DESCRICAO, :vVALOR
             DO BEGIN
                TIPO = 5; VALOR = vVALOR; DESCRICAO = vCLASSIFICACAO_CODIGO||' - '||vCLASSIFICACAO_DESCRICAO; SUSPEND;
                vTOTAL = vTOTAL + vVALOR;
                END
           TIPO = 6; VALOR = vTOTAL; DESCRICAO = 'TOTAL ENTRADAS:'; SUSPEND;
           TIPO = 0; VALOR = null; DESCRICAO = ''; SUSPEND;

           TIPO = 7; VALOR = null; DESCRICAO = 'SAÍDAS DO DIA'; SUSPEND;
           vTOTAL = 0;
            FOR
            SELECT FN_MASK(C.CLASSIFICACAO_CONTABIL,'CLASS') AS CLASSIFICACAO_CODIGO,
                   CC.DESCRICAO AS CLASSIFICACAO_DESCRICAO,
                   CAST(SUM(C.VALOR)*-1 AS NUMERIC(15,2)) AS VALOR
              FROM TBCAIXABANCO_LANCAMENTO A,
                   TBCAIXABANCO_LANCAMENTO_CLASS C,
                   TBCLASSIFICACAO_CONTABIL CC
             WHERE C.CAIXABANCO_CONTROLE = A.CONTROLE
               AND C.CLASSIFICACAO_CONTABIL = CC.CODIGO
               AND A.CAIXABANCO_CODIGO = :vCONTA
               AND A.DATA_LANCAMENTO = :DATA
               AND A.VALOR_TOTAL > 0
               AND A.NATUREZA = 'C'
          GROUP BY 1,2
           INTO :vCLASSIFICACAO_CODIGO, :vCLASSIFICACAO_DESCRICAO, :vVALOR
             DO BEGIN
                TIPO = 8; VALOR = vVALOR; DESCRICAO = vCLASSIFICACAO_CODIGO||' - '||vCLASSIFICACAO_DESCRICAO; SUSPEND;
                vTOTAL = vTOTAL + vVALOR;
                END
           TIPO = 9; VALOR = vTOTAL; DESCRICAO = 'TOTAL SAÍDAS:'; SUSPEND;
           TIPO = 0; VALOR = null; DESCRICAO = ''; SUSPEND;

           IF(vDATAHORA_FECHAMENTO is not null) Then
              Begin
              TIPO = 3; VALOR = vSALDO_FECHAMENTO; DESCRICAO = 'SALDO FECHAMENTO: '; SUSPEND;
              TIPO = 0; VALOR = null; DESCRICAO = ''; SUSPEND;
              End

           TIPO = 10; VALOR = null; DESCRICAO = 'RESUMO DAS VENDAS POR FORMA DE PAGAMENTO: '; SUSPEND;
           /**/
           vTOTAL = 0;
            FOR

            SELECT FORMA_PAG_ID,
                   FORMA_PAG_DESCRICAO,
                   SUM(VALOR) AS VALOR
            FROM (
                    SELECT P.CONTROLE AS ID,
                           COALESCE(P.PAGAMENTO_FORMA,0) AS FORMA_PAG_ID,
                           F.DESCRICAO AS FORMA_PAG_DESCRICAO,
                           P.VALOR
                      FROM TBPDV_CFE A, TBPDV_CFE_FORMA_PAGAMENTO B, TBNFS_PARCELAMENTO P, TBPAGAMENTO_FORMA F
                     WHERE A.ID = B.PDV_CFE_ID
                       AND B.ID = P.PDV_CFE_FORMA_PAGAMENTO_ID
                       AND A.ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                       AND A.DATA_EMISSAO = :DATA
                    -- AND A.PDV_CAIXA_ID = :CAIXA
                       AND(A.SITUACAO = 2)
                       AND F.CODIGO = P.PAGAMENTO_FORMA
                       AND COALESCE(F.PARCELAS_SEM_SALDO,'0') = '0'
                    
                    UNION
                    
                    SELECT P.CONTROLE AS ID,
                           COALESCE(P.PAGAMENTO_FORMA,0) AS FORMA_PAG_ID,
                           F.DESCRICAO AS FORMA_PAG_DESCRICAO,
                           P.VALOR
                      FROM TBNFS S, TBNFS_PARCELAMENTO P, TBPAGAMENTO_FORMA F
                     WHERE S.CONTROLE = P.NFS_CONTROLE
                       AND P.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_ID
                       AND P.DATA_EMISSAO = :DATA
                       AND((S.NATUREZA = 1 AND S.SITUACAO = 2) or (S.NATUREZA = 2 AND S.SITUACAO = 1))
                       AND S.PDV_CAIXA_ID > 0 -- = :CAIXA   
                       AND F.CODIGO = P.PAGAMENTO_FORMA
                       AND COALESCE(F.PARCELAS_SEM_SALDO,'0') = '0'
                    )
            GROUP BY FORMA_PAG_DESCRICAO, FORMA_PAG_ID

           INTO :vFORMA_PAG_ID, :vFORMA_PAG_DESCRICAO, :vVALOR
             DO BEGIN
                TIPO = 11; VALOR = vVALOR; DESCRICAO = FN_LPAD(vFORMA_PAG_ID,3,'0')||' - '||vFORMA_PAG_DESCRICAO; SUSPEND;
                vTOTAL = vTOTAL + vVALOR;
                END
           TIPO = 12; VALOR = vTOTAL; DESCRICAO = 'TOTAL VENDAS:'; SUSPEND;

           TIPO = 0; VALOR = null; DESCRICAO = ''; SUSPEND;


           TIPO = 10; VALOR = null; DESCRICAO = 'OUTROS OPERAÇÕES: '; SUSPEND;
           /**/
           vTOTAL = 0;
            FOR

            SELECT FORMA_PAG_ID,
                   FORMA_PAG_DESCRICAO,
                   SUM(VALOR) AS VALOR
            FROM (
                    SELECT P.CONTROLE AS ID,
                           COALESCE(P.PAGAMENTO_FORMA,0) AS FORMA_PAG_ID,
                           F.DESCRICAO AS FORMA_PAG_DESCRICAO,
                           P.VALOR
                      FROM TBPDV_CFE A, TBPDV_CFE_FORMA_PAGAMENTO B, TBNFS_PARCELAMENTO P, TBPAGAMENTO_FORMA F
                     WHERE A.ID = B.PDV_CFE_ID
                       AND B.ID = P.PDV_CFE_FORMA_PAGAMENTO_ID
                       AND A.ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                       AND A.DATA_EMISSAO = :DATA
                    -- AND A.PDV_CAIXA_ID = :CAIXA
                       AND(A.SITUACAO = 2)
                       AND F.CODIGO = P.PAGAMENTO_FORMA
                       AND COALESCE(F.PARCELAS_SEM_SALDO,'0') = '1'
                    
                    UNION
                    
                    SELECT P.CONTROLE AS ID,
                           COALESCE(P.PAGAMENTO_FORMA,0) AS FORMA_PAG_ID,
                           F.DESCRICAO AS FORMA_PAG_DESCRICAO,
                           P.VALOR
                      FROM TBNFS S, TBNFS_PARCELAMENTO P, TBPAGAMENTO_FORMA F
                     WHERE S.CONTROLE = P.NFS_CONTROLE
                       AND P.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_ID
                       AND P.DATA_EMISSAO = :DATA
                       AND((S.NATUREZA = 1 AND S.SITUACAO = 2) or (S.NATUREZA = 2 AND S.SITUACAO = 1))
                       AND S.PDV_CAIXA_ID > 0 -- = :CAIXA   
                       AND F.CODIGO = P.PAGAMENTO_FORMA
                       AND COALESCE(F.PARCELAS_SEM_SALDO,'0') = '1'
                    )
            GROUP BY FORMA_PAG_DESCRICAO, FORMA_PAG_ID

           INTO :vFORMA_PAG_ID, :vFORMA_PAG_DESCRICAO, :vVALOR
             DO BEGIN
                TIPO = 11; VALOR = vVALOR; DESCRICAO = FN_LPAD(vFORMA_PAG_ID,3,'0')||' - '||vFORMA_PAG_DESCRICAO; SUSPEND;
                vTOTAL = vTOTAL + vVALOR;
                END
           TIPO = 12; VALOR = vTOTAL; DESCRICAO = 'VALOR TOTAL:'; SUSPEND;

           TIPO = 0; VALOR = null; DESCRICAO = ''; SUSPEND;
           TIPO = 0; VALOR = null; DESCRICAO = ''; SUSPEND;





           TIPO = 10; VALOR = null; DESCRICAO = 'DOCUMENTOS CANCELADOS: '; SUSPEND;
           vTOTAL = 0;
           FOR

            SELECT DOCUMENTO, 
                   SUM(VALOR) AS VALOR
            FROM (
                    SELECT 'CF.'||FN_LPAD(A.NUMERO_CFE,6,'0') AS DOCUMENTO,
                           B.VALOR AS VALOR
                      FROM TBPDV_CFE A, TBPDV_CFE_FORMA_PAGAMENTO B, TBPAGAMENTO_FORMA F
                     WHERE A.ID = B.PDV_CFE_ID
                       AND B.PAGAMENTO_FORMA_ID = F.CODIGO 
                       AND A.ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                       AND A.DATA_EMISSAO = :DATA 
                       AND(A.SITUACAO = 3)

                    UNION
                    
                    SELECT 'NF.'||FN_LPAD(S.NUMERO_NOTAFISCAL,6,'0') AS DOCUMENTO,
                           P.VALOR
                      FROM TBNFS S, TBNFS_PARCELAMENTO P, TBPAGAMENTO_FORMA F
                     WHERE S.CONTROLE = P.NFS_CONTROLE
                       AND P.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_ID
                       AND P.DATA_EMISSAO = :DATA
                       AND S.SITUACAO = 3
                       AND S.PDV_CAIXA_ID > 0  
                       AND F.CODIGO = P.PAGAMENTO_FORMA 
                    )
            GROUP BY DOCUMENTO

           INTO :vDOCUMENTO, :vVALOR
             DO BEGIN
                TIPO = 11; VALOR = vVALOR; DESCRICAO = :vDOCUMENTO; SUSPEND;
                vTOTAL = vTOTAL + vVALOR;
                END
           TIPO = 12; VALOR = vTOTAL; DESCRICAO = 'VALOR TOTAL:'; SUSPEND;
           TIPO = 0; VALOR = null; DESCRICAO = ''; SUSPEND;
           TIPO = 0; VALOR = null; DESCRICAO = ''; SUSPEND;

           END
END;