-- ================================================================================
--   Created on    :  12/06/2002  09:54
--   Programador   :  Luciana Correa
--   @C:\SALDOCAIXA
--   EXECUTE SALDO_CAIXA('8984','001','20/06/2002','999','25/06/2002');
--   @C:\WIN_V1.53\SQL\SQLSERVER\3831_PDVSTP_FECHAMENTO_CAIXA.SQL
-- ================================================================================
IF EXISTS (SELECT *
           FROM SYSOBJECTS O, SYSUSERS U
           WHERE O.NAME = 'SALDO_CAIXA'
             AND TYPE   = 'P'
             AND U.UID  = O.UID
             AND U.NAME = USER)

   DROP PROCEDURE SALDO_CAIXA
   GO

CREATE PROCEDURE SALDO_CAIXA
  @P_CDFILIAL      VARCHAR(4),
  @P_CDCAIXA       VARCHAR(3),
  @P_DTMOVSALDCXA  DATETIME  ,
  @P_CDOPERADOR    VARCHAR(12),
  @P_DTATUSALDCXA  DATETIME

AS

  DECLARE @V_ENTRADA        NUMERIC(16,2);
  DECLARE @V_ENTRADAOUT     NUMERIC(16,2);
  DECLARE @V_SAIDA          NUMERIC(16,2);
  DECLARE @V_SAIDAOUT       NUMERIC(16,2);
  DECLARE @V_DTMOVSALDCXA   DATETIME;
  DECLARE @V_VRSALDACUCXA   NUMERIC(16,2);
  DECLARE @V_VRSALDACUCOU   NUMERIC(16,2);
  DECLARE @V_DTMAXDATASALDO DATETIME;
  DECLARE @V_CDCLIENTE      VARCHAR(21);
  DECLARE @V_EXISTE_ENTRADA NUMERIC;
  DECLARE @V_EXISTE_SAIDA   NUMERIC;
  DECLARE @V_EXISTE_SALDO   NUMERIC;
  DECLARE @V_EXISTE_DATA    NUMERIC;
  DECLARE @V_VALOR          NUMERIC(16,2);
  DECLARE @V_VALOROUT       NUMERIC(16,2);

  -- CURSOR PRINCIPAL C_TIPORECE
  DECLARE @C_TIPORECE_CDFILIAL       VARCHAR(4);
  DECLARE @C_TIPORECE_CDCAIXA        VARCHAR(3);
  DECLARE @C_TIPORECE_DTMOVIMCAIXA   DATETIME;
  DECLARE @C_TIPORECE_CDTIPORECE     VARCHAR(3);
  DECLARE @C_TIPORECE_CDCLIENTE      VARCHAR(21);

  -- CURSOR C_SALDOCXA
  DECLARE @C_SALDOCXA_CDFILIAL       VARCHAR(4);
  DECLARE @C_SALDOCXA_CDCAIXA        VARCHAR(3);
  DECLARE @C_SALDOCXA_DTMOVIMCAIXA   DATETIME;

  -- CURSOR C_RECEB
  DECLARE @C_RECEB_CDFILIAL       VARCHAR(4);
  DECLARE @C_RECEB_CDCAIXA        VARCHAR(3);
  DECLARE @C_RECEB_DTMOVSALDCXA   DATETIME;
  DECLARE @C_RECEB_CDTIPORECE     VARCHAR(3);
  DECLARE @C_RECEB_CDCLIENTECXA   VARCHAR(21);
  DECLARE @C_RECEB_VRSALDACUCXA   NUMERIC(16,2);
  DECLARE @C_RECEB_VRSALDACUCOU   NUMERIC(16,2);

BEGIN
   SELECT @V_DTMAXDATASALDO = MAX(DTMOVSALDCXA)
   FROM   SALDOCAIXA
   WHERE  CDFILIAL  = @P_CDFILIAL AND
          CDCAIXA   = @P_CDCAIXA;

   IF @V_DTMAXDATASALDO IS NULL BEGIN
      SET @V_DTMAXDATASALDO =  CONVERT(DATETIME, CONVERT(VARCHAR,@P_DTMOVSALDCXA,103));
   END;
   IF @V_DTMAXDATASALDO < CONVERT(DATETIME, CONVERT(VARCHAR, @P_DTMOVSALDCXA, 103)) BEGIN
      SET @V_DTMAXDATASALDO =  CONVERT(DATETIME, CONVERT(VARCHAR,@P_DTMOVSALDCXA,103));
   END;
   
   /*Apaga os registros do caixa controle para importar novamente*/
   DELETE FROM SALDOCAIXA
   WHERE
      CDFILIAL = @P_CDFILIAL AND
      CDCAIXA  = @P_CDCAIXA  AND
      DTMOVSALDCXA BETWEEN CONVERT(DATETIME, CONVERT(VARCHAR,@P_DTMOVSALDCXA,103)) AND @V_DTMAXDATASALDO;
	  
   DECLARE C_TIPORECE CURSOR FOR
      SELECT DISTINCT CDFILIAL, CDCAIXA, DTMOVIMCAIXA, CDTIPORECE, ISNULL(CDCLIENTE,'CLIENTEPADRAO') AS CDCLIENTE
      FROM   MOVCAIXA
      WHERE  CDFILIAL            = @P_CDFILIAL AND
             CDCAIXA             = @P_CDCAIXA  AND
             CONVERT(DATETIME,CONVERT(VARCHAR,DTMOVIMCAIXA,103)) BETWEEN CONVERT(DATETIME,CONVERT(VARCHAR, @P_DTMOVSALDCXA, 103)) AND @V_DTMAXDATASALDO
      ORDER BY DTMOVIMCAIXA

   OPEN C_TIPORECE;
   FETCH NEXT FROM C_TIPORECE INTO @C_TIPORECE_CDFILIAL  , @C_TIPORECE_CDCAIXA, @C_TIPORECE_DTMOVIMCAIXA,
                                   @C_TIPORECE_CDTIPORECE, @C_TIPORECE_CDCLIENTE;
   WHILE (@@FETCH_STATUS = 0) BEGIN

      SET @V_ENTRADA = 0;
      SET @V_SAIDA   = 0;

      SELECT @V_EXISTE_ENTRADA = COUNT(*)
      FROM   MOVCAIXA
      WHERE  (CDFILIAL      = @C_TIPORECE_CDFILIAL    ) AND
             (CDCAIXA       = @C_TIPORECE_CDCAIXA     ) AND
             (DTMOVIMCAIXA  = @C_TIPORECE_DTMOVIMCAIXA) AND
             (CDTIPORECE    = @C_TIPORECE_CDTIPORECE  ) AND
             (ISNULL(CDCLIENTE,'CLIENTEPADRAO') = @C_TIPORECE_CDCLIENTE) AND
             (IDTIPOMOVIVE IN ('A','E','T','U'));

      IF @V_EXISTE_ENTRADA > 0 BEGIN
         SELECT @V_ENTRADA = SUM(ISNULL(VRMOVIVEND,0)), @V_ENTRADAOUT = SUM(ISNULL(VRMOVIVEOUT,0))
         FROM   MOVCAIXA
         WHERE  (CDFILIAL      = @C_TIPORECE_CDFILIAL    ) AND
                (CDCAIXA       = @C_TIPORECE_CDCAIXA     ) AND
                (DTMOVIMCAIXA  = @C_TIPORECE_DTMOVIMCAIXA) AND
                (CDTIPORECE    = @C_TIPORECE_CDTIPORECE  ) AND
                (ISNULL(CDCLIENTE,'CLIENTEPADRAO') = @C_TIPORECE_CDCLIENTE) AND
                (IDTIPOMOVIVE IN ('A','E','T','U'));
      END;

      SET @V_ENTRADA    = ISNULL(@V_ENTRADA,0);
      SET @V_ENTRADAOUT = ISNULL(@V_ENTRADAOUT,0);

      SELECT @V_EXISTE_SAIDA = COUNT(*)
      FROM   MOVCAIXA
      WHERE  (CDFILIAL      = @C_TIPORECE_CDFILIAL    ) AND
             (CDCAIXA       = @C_TIPORECE_CDCAIXA     ) AND
             (DTMOVIMCAIXA  = @C_TIPORECE_DTMOVIMCAIXA) AND
             (CDTIPORECE    = @C_TIPORECE_CDTIPORECE  ) AND
             (ISNULL(CDCLIENTE,'CLIENTEPADRAO') = @C_TIPORECE_CDCLIENTE) AND
             (IDTIPOMOVIVE IN ('S','G'));

      IF @V_EXISTE_SAIDA > 0 BEGIN
         SELECT @V_SAIDA = SUM(ISNULL(VRMOVIVEND,0)), @V_SAIDAOUT = SUM(ISNULL(VRMOVIVEOUT,0))
         FROM   MOVCAIXA
         WHERE  (CDFILIAL      = @C_TIPORECE_CDFILIAL    ) AND
                (CDCAIXA       = @C_TIPORECE_CDCAIXA     ) AND
                (DTMOVIMCAIXA  = @C_TIPORECE_DTMOVIMCAIXA) AND
                (CDTIPORECE    = @C_TIPORECE_CDTIPORECE  ) AND
                (ISNULL(CDCLIENTE,'CLIENTEPADRAO') = @C_TIPORECE_CDCLIENTE) AND
                (IDTIPOMOVIVE IN ('S','G'));
      END;

      SET @V_SAIDA    = ISNULL(@V_SAIDA,0);
      SET @V_SAIDAOUT = ISNULL(@V_SAIDAOUT,0);

      /*DBMS_OUTPUT.PUT_LINE(C_TIPORECE.CDFILIAL||' - '||C_TIPORECE.CDCAIXA||' - '||C_TIPORECE.DTMOVIMCAIXA||' - '||C_TIPORECE.CDTIPORECE||' - '||C_TIPORECE.CDCLIENTE);
      DBMS_OUTPUT.PUT_LINE(V_ENTRADA||' - '||V_SAIDA);*/

      SET @V_VALOR    = ISNULL(@V_ENTRADA,0   ) - ISNULL(@V_SAIDA,0);
      SET @V_VALOROUT = ISNULL(@V_ENTRADAOUT,0) - ISNULL(@V_SAIDAOUT,0);

      IF @C_TIPORECE_CDCLIENTE IS NULL BEGIN
         SET @V_CDCLIENTE = 'CLIENTEPADRAO'
      END ELSE BEGIN
         SET @V_CDCLIENTE = @C_TIPORECE_CDCLIENTE;
      END;

      SELECT @V_EXISTE_DATA = COUNT(*)
      FROM   SALDOCAIXA
      WHERE  (CDFILIAL     = @C_TIPORECE_CDFILIAL    ) AND
             (CDCAIXA      = @C_TIPORECE_CDCAIXA     ) AND
             (DTMOVSALDCXA < @C_TIPORECE_DTMOVIMCAIXA) AND
             (CDTIPORECE   = @C_TIPORECE_CDTIPORECE  ) AND
             (CDCLIENTECXA = @V_CDCLIENTE   );

      IF @V_EXISTE_DATA > 0 BEGIN

         SELECT @V_DTMOVSALDCXA = MAX(DTMOVSALDCXA)
         FROM   SALDOCAIXA
         WHERE  (CDFILIAL     = @C_TIPORECE_CDFILIAL    ) AND
                (CDCAIXA      = @C_TIPORECE_CDCAIXA     ) AND
                (DTMOVSALDCXA < @C_TIPORECE_DTMOVIMCAIXA) AND
                (CDTIPORECE   = @C_TIPORECE_CDTIPORECE  ) AND
                (CDCLIENTECXA = @V_CDCLIENTE);

         SELECT @V_VRSALDACUCXA = ISNULL(VRSALDACUCXA,0), @V_VRSALDACUCOU = ISNULL(VRSALDACUCOU,0)
         FROM   SALDOCAIXA
         WHERE  (CDFILIAL     = @C_TIPORECE_CDFILIAL    ) AND
                (CDCAIXA      = @C_TIPORECE_CDCAIXA     ) AND
                (DTMOVSALDCXA = @V_DTMOVSALDCXA         ) AND
                (CDTIPORECE   = @C_TIPORECE_CDTIPORECE  ) AND
                (CDCLIENTECXA = @V_CDCLIENTE)

      END ELSE BEGIN
         SET @V_VRSALDACUCXA = 0;
         SET @V_VRSALDACUCOU = 0;
      END;

      SELECT @V_EXISTE_SALDO = COUNT(*)
      FROM   SALDOCAIXA
      WHERE  (CDFILIAL      = @C_TIPORECE_CDFILIAL    ) AND
             (CDCAIXA       = @C_TIPORECE_CDCAIXA     ) AND
             (DTMOVSALDCXA  = @C_TIPORECE_DTMOVIMCAIXA) AND
             (CDTIPORECE    = @C_TIPORECE_CDTIPORECE  );


      IF @V_EXISTE_SALDO = 0 BEGIN
         INSERT INTO SALDOCAIXA
          (CDFILIAL,CDCAIXA,DTMOVSALDCXA,CDTIPORECE,CDCLIENTECXA,VRENTRADACXA,VRSAIDACXA,VRMOVDIACXA,VRSALDACUCXA,CDOPERADOR,
           DTATUSALDCXA,VRMOVDIACXOU,VRSALDACUCOU,VRENTRADACOU,VRSAIDACXAOU)
         VALUES
          (@C_TIPORECE_CDFILIAL,@C_TIPORECE_CDCAIXA,@C_TIPORECE_DTMOVIMCAIXA,@C_TIPORECE_CDTIPORECE,
           @V_CDCLIENTE,@V_ENTRADA, @V_SAIDA, @V_VALOR,(@V_VRSALDACUCXA+@V_VALOR), @P_CDOPERADOR, @P_DTATUSALDCXA,
           @V_VALOROUT,(@V_VRSALDACUCOU+@V_VALOROUT),@V_ENTRADAOUT,@V_SAIDAOUT);
      END ELSE BEGIN
         UPDATE SALDOCAIXA
         SET    VRENTRADACXA  = @V_ENTRADA,
                VRSAIDACXA    = @V_SAIDA,
                VRMOVDIACXA   = @V_VALOR,
                VRSALDACUCXA  = (@V_VRSALDACUCXA + @V_VALOR),
                VRENTRADACOU  = @V_ENTRADAOUT,
                VRSAIDACXAOU  = @V_SAIDAOUT,
                VRMOVDIACXOU  = @V_VALOROUT,
                VRSALDACUCOU  = (@V_VRSALDACUCOU + @V_VALOROUT)
         WHERE  (CDFILIAL     = @C_TIPORECE_CDFILIAL    ) AND
                (CDCAIXA      = @C_TIPORECE_CDCAIXA     ) AND
                (DTMOVSALDCXA = @C_TIPORECE_DTMOVIMCAIXA) AND
                (CDTIPORECE   = @C_TIPORECE_CDTIPORECE  ) AND
                (CDCLIENTECXA = @V_CDCLIENTE);
      END;

      FETCH NEXT FROM C_TIPORECE INTO @C_TIPORECE_CDFILIAL  , @C_TIPORECE_CDCAIXA, @C_TIPORECE_DTMOVIMCAIXA,
                                      @C_TIPORECE_CDTIPORECE, @C_TIPORECE_CDCLIENTE;

   END;

   CLOSE      C_TIPORECE;
   DEALLOCATE C_TIPORECE;

   DECLARE C_SALDOCXA CURSOR FOR
      SELECT DISTINCT CDFILIAL, CDCAIXA, DTMOVIMCAIXA
      FROM   MOVCAIXA
      WHERE  CDFILIAL = @P_CDFILIAL AND
             CDCAIXA  = @P_CDCAIXA  AND
             CONVERT(DATETIME,CONVERT(VARCHAR,DTMOVIMCAIXA,103)) BETWEEN CONVERT(DATETIME,CONVERT(VARCHAR, @P_DTMOVSALDCXA,103)) AND @V_DTMAXDATASALDO
      ORDER BY DTMOVIMCAIXA

   OPEN C_SALDOCXA;
   FETCH NEXT FROM C_SALDOCXA INTO @C_SALDOCXA_CDFILIAL, @C_SALDOCXA_CDCAIXA, @C_SALDOCXA_DTMOVIMCAIXA;
   WHILE (@@FETCH_STATUS = 0) BEGIN

      DECLARE C_RECEB CURSOR FOR
         SELECT CDFILIAL, CDCAIXA, DTMOVSALDCXA, CDTIPORECE, CDCLIENTECXA,VRSALDACUCXA,VRSALDACUCOU
         FROM   SALDOCAIXA
         WHERE  (CDFILIAL     = @C_SALDOCXA_CDFILIAL    ) AND
                (CDCAIXA      = @C_SALDOCXA_CDCAIXA     ) AND
                (DTMOVSALDCXA = (SELECT MAX(DTMOVSALDCXA)
                                 FROM SALDOCAIXA
                                 WHERE (CDFILIAL     = @C_SALDOCXA_CDFILIAL    )
                                   AND (CDCAIXA      = @C_SALDOCXA_CDCAIXA     )
                                   AND (DTMOVSALDCXA < @C_SALDOCXA_DTMOVIMCAIXA)))
                                   AND (CDTIPORECE+CDCLIENTECXA NOT IN (SELECT CDTIPORECE+CDCLIENTECXA
                                                                         FROM SALDOCAIXA
                                                                         WHERE (CDFILIAL     = @C_SALDOCXA_CDFILIAL)
                                                                           AND (CDCAIXA      = @C_SALDOCXA_CDCAIXA )
                                                                           AND (DTMOVSALDCXA = @C_SALDOCXA_DTMOVIMCAIXA)))

      OPEN C_RECEB;
      FETCH NEXT FROM C_RECEB INTO @C_RECEB_CDFILIAL    , @C_RECEB_CDCAIXA     , @C_RECEB_DTMOVSALDCXA, @C_RECEB_CDTIPORECE,
                                   @C_RECEB_CDCLIENTECXA, @C_RECEB_VRSALDACUCXA, @C_RECEB_VRSALDACUCOU;
      WHILE (@@FETCH_STATUS = 0) BEGIN


         /*DBMS_OUTPUT.PUT_LINE(C_RECEB.CDFILIAL||'-'||C_RECEB.CDTIPORECE||'-'||C_RECEB.VRSALDACUCXA);*/

         IF @C_RECEB_CDFILIAL <> ' ' BEGIN
            INSERT INTO SALDOCAIXA
             (CDFILIAL,CDCAIXA,DTMOVSALDCXA,CDTIPORECE,CDCLIENTECXA,VRENTRADACXA,VRSAIDACXA,VRMOVDIACXA,VRSALDACUCXA,CDOPERADOR,
              DTATUSALDCXA,VRMOVDIACXOU,VRSALDACUCOU,VRENTRADACOU,VRSAIDACXAOU)
            VALUES
             (@C_SALDOCXA_CDFILIAL,@C_SALDOCXA_CDCAIXA,@C_SALDOCXA_DTMOVIMCAIXA,@C_RECEB_CDTIPORECE,@C_RECEB_CDCLIENTECXA,
              0,0,0,@C_RECEB_VRSALDACUCXA, @P_CDOPERADOR, @P_DTATUSALDCXA,0,@C_RECEB_VRSALDACUCOU,0,0);
         END;

         FETCH NEXT FROM C_RECEB INTO @C_RECEB_CDFILIAL    , @C_RECEB_CDCAIXA     , @C_RECEB_DTMOVSALDCXA, @C_RECEB_CDTIPORECE,
                                      @C_RECEB_CDCLIENTECXA, @C_RECEB_VRSALDACUCXA, @C_RECEB_VRSALDACUCOU;

      END;

      CLOSE      C_RECEB;
      DEALLOCATE C_RECEB;

      FETCH NEXT FROM C_SALDOCXA INTO @C_SALDOCXA_CDFILIAL, @C_SALDOCXA_CDCAIXA, @C_SALDOCXA_DTMOVIMCAIXA;

   END;

   CLOSE      C_SALDOCXA;
   DEALLOCATE C_SALDOCXA;

END;
GO

-- VERSAO --
EXEC ATUVEROBJ 'SALDO_CAIXA','5.30.001';
GO


