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 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,
                           COALESCE((SELECT FIRST 1 F.DESCRICAO FROM TBPAGAMENTO_FORMA F WHERE F.CODIGO = P.PAGAMENTO_FORMA),'NAO INFORMADA') AS FORMA_PAG_DESCRICAO,
                           P.VALOR
                      FROM TBPDV_CFE A, TBPDV_CFE_FORMA_PAGAMENTO B, TBNFS_PARCELAMENTO P
                     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)                 
                    
                    UNION
                    
                    SELECT P.CONTROLE AS ID,
                           COALESCE(P.PAGAMENTO_FORMA,0) AS FORMA_PAG_ID,
                           COALESCE((SELECT FIRST 1 F.DESCRICAO FROM TBPAGAMENTO_FORMA F WHERE F.CODIGO = P.PAGAMENTO_FORMA),'NAO INFORMADA') AS FORMA_PAG_DESCRICAO,
                           P.VALOR
                      FROM TBNFS S, TBNFS_PARCELAMENTO P
                     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
                    )
            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 = 0; VALOR = NULL; DESCRICAO = ''; SUSPEND;
           END

END