CREATE OR ALTER procedure SPC_MOVIMENTO_CAIXA (
    ESTABELECIMENTO_ID integer,
    CAIXA_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
               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.CODIGO = :CAIXA_ID -- CB.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_ID AND CB.CODIGO = A.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 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,
                   CAST(SUM(P.VALOR) as NUMERIC(15,2)) AS VALOR
              FROM TBNFS A,
                   TBNFS_PARCELAMENTO P
             WHERE A.CONTROLE = P.NFS_CONTROLE
               AND A.DATA_EMISSAO = :DATA
               AND A.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_ID
           --  AND A.PDV_CAIXA_ID = :CAIXA
               AND ((A.NATUREZA = 1 AND A.SITUACAO = 2) OR
                    (A.NATUREZA = 2 AND A.SITUACAO = 1))
            GROUP BY P.PAGAMENTO_FORMA
           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