-- ================================================================================
--   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:\WEB_405\SQL\END_CONV\ORACLE\3831_PDVSTPO_SALDO_CAIXA.SQL
-- ================================================================================

CREATE OR REPLACE PROCEDURE SALDO_CAIXA(
P_CDFILIAL      IN SALDOCAIXA.CDFILIAL%TYPE,
P_CDCAIXA       IN SALDOCAIXA.CDCAIXA%TYPE,
P_DTMOVSALDCXA  IN SALDOCAIXA.DTMOVSALDCXA%TYPE,
P_CDOPERADOR    IN SALDOCAIXA.CDOPERADOR%TYPE,
P_DTATUSALDCXA  IN SALDOCAIXA.DTATUSALDCXA%TYPE)

AS

V_ENTRADA        SALDOCAIXA.VRMOVDIACXA%TYPE;
V_ENTRADAOUT     SALDOCAIXA.VRMOVDIACXA%TYPE;
V_SAIDA          SALDOCAIXA.VRMOVDIACXA%TYPE;
V_SAIDAOUT       SALDOCAIXA.VRMOVDIACXA%TYPE;
V_DTMOVSALDCXA   SALDOCAIXA.DTMOVSALDCXA%TYPE;
V_VRSALDACUCXA   SALDOCAIXA.VRSALDACUCXA%TYPE;
V_VRSALDACUCOU   SALDOCAIXA.VRSALDACUCOU%TYPE;
V_DTMAXDATASALDO SALDOCAIXA.DTMOVSALDCXA%TYPE;
V_CDCLIENTE      CLIENTE.CDCLIENTE%TYPE;
V_EXISTE_ENTRADA NUMBER;
V_EXISTE_SAIDA   NUMBER;
V_EXISTE_SALDO   NUMBER;
V_EXISTE_DATA    NUMBER;
V_VALOR          SALDOCAIXA.VRMOVDIACXA%TYPE;
V_VALOROUT       SALDOCAIXA.VRMOVDIACXA%TYPE;

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

   IF V_DTMAXDATASALDO IS NULL THEN
      V_DTMAXDATASALDO :=  TO_DATE(TO_CHAR(P_DTMOVSALDCXA,'DD/MM/YYYY'),'DD/MM/YYYY');
   END IF;
   IF V_DTMAXDATASALDO < TO_DATE(TO_CHAR(P_DTMOVSALDCXA,'DD/MM/YYYY'),'DD/MM/YYYY') THEN
      V_DTMAXDATASALDO :=  TO_DATE(TO_CHAR(P_DTMOVSALDCXA,'DD/MM/YYYY'),'DD/MM/YYYY');
   END IF;

   /*Apaga os registros do caixa controle para importar novamente*/
   DELETE FROM SALDOCAIXA
   WHERE
      CDFILIAL = P_CDFILIAL AND
      CDCAIXA  = P_CDCAIXA  AND
      DTMOVSALDCXA BETWEEN TO_DATE(TO_CHAR(P_DTMOVSALDCXA,'DD/MM/YYYY'),'DD/MM/YYYY') AND V_DTMAXDATASALDO;

   FOR C_TIPORECE IN
      (SELECT DISTINCT CDFILIAL, CDCAIXA, DTMOVIMCAIXA, CDTIPORECE, NVL(CDCLIENTE,'CLIENTEPADRAO') AS CDCLIENTE
       FROM   MOVCAIXA
       WHERE  CDFILIAL            = P_CDFILIAL AND
              CDCAIXA             = P_CDCAIXA  AND
              TO_DATE(TO_CHAR(DTMOVIMCAIXA,'DD/MM/YYYY'),'DD/MM/YYYY') BETWEEN TO_DATE(TO_CHAR(P_DTMOVSALDCXA,'DD/MM/YYYY'),'DD/MM/YYYY') AND V_DTMAXDATASALDO
       ORDER BY DTMOVIMCAIXA) LOOP

      V_ENTRADA := 0;
      V_SAIDA   := 0;

      SELECT COUNT(*)
      INTO   V_EXISTE_ENTRADA
      FROM   MOVCAIXA
      WHERE  (CDFILIAL      = C_TIPORECE.CDFILIAL    ) AND
             (CDCAIXA       = C_TIPORECE.CDCAIXA     ) AND
             (DTMOVIMCAIXA  = C_TIPORECE.DTMOVIMCAIXA) AND
             (CDTIPORECE    = C_TIPORECE.CDTIPORECE  ) AND/*
             (NVL(CDCLIENTE,'CLIENTEPADRAO') = C_TIPORECE.CDCLIENTE) AND*/
             (IDTIPOMOVIVE IN ('A','E','T','U'));

      IF V_EXISTE_ENTRADA > 0 THEN
         SELECT NVL(SUM(VRMOVIVEND),0), NVL(SUM(VRMOVIVEOUT),0)
         INTO V_ENTRADA, V_ENTRADAOUT
         FROM   MOVCAIXA
         WHERE  (CDFILIAL      = C_TIPORECE.CDFILIAL    ) AND
                (CDCAIXA       = C_TIPORECE.CDCAIXA     ) AND
                (DTMOVIMCAIXA  = C_TIPORECE.DTMOVIMCAIXA) AND
                (CDTIPORECE    = C_TIPORECE.CDTIPORECE  ) AND/*
                (NVL(CDCLIENTE,'CLIENTEPADRAO') = C_TIPORECE.CDCLIENTE) AND*/
                (IDTIPOMOVIVE IN ('A','E','T','U'));
      END IF;

      V_ENTRADA    := NVL(V_ENTRADA,0);
      V_ENTRADAOUT := NVL(V_ENTRADAOUT,0);

      SELECT COUNT(*)
      INTO   V_EXISTE_SAIDA
      FROM   MOVCAIXA
      WHERE  (CDFILIAL      = C_TIPORECE.CDFILIAL    ) AND
             (CDCAIXA       = C_TIPORECE.CDCAIXA     ) AND
             (DTMOVIMCAIXA  = C_TIPORECE.DTMOVIMCAIXA) AND
             (CDTIPORECE    = C_TIPORECE.CDTIPORECE  ) AND/*
             (NVL(CDCLIENTE,'CLIENTEPADRAO') = C_TIPORECE.CDCLIENTE) AND*/
             (IDTIPOMOVIVE IN ('S','G'));

      IF V_EXISTE_SAIDA > 0 THEN
         SELECT NVL(SUM(VRMOVIVEND),0), NVL(SUM(VRMOVIVEOUT),0)
         INTO V_SAIDA, V_SAIDAOUT
         FROM   MOVCAIXA
         WHERE  (CDFILIAL      = C_TIPORECE.CDFILIAL    ) AND
                (CDCAIXA       = C_TIPORECE.CDCAIXA     ) AND
                (DTMOVIMCAIXA  = C_TIPORECE.DTMOVIMCAIXA) AND
                (CDTIPORECE    = C_TIPORECE.CDTIPORECE  ) AND/*
                (NVL(CDCLIENTE,'CLIENTEPADRAO') = C_TIPORECE.CDCLIENTE) AND*/
                (IDTIPOMOVIVE IN ('S','G'));
      END IF;

      V_SAIDA    := NVL(V_SAIDA,0);
      V_SAIDAOUT := NVL(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);*/

      V_VALOR    := NVL(V_ENTRADA,0) - NVL(V_SAIDA,0);
      V_VALOROUT := NVL(V_ENTRADAOUT,0) - NVL(V_SAIDAOUT,0);

      IF C_TIPORECE.CDCLIENTE IS NULL THEN
         V_CDCLIENTE := 'CLIENTEPADRAO';
      ELSE
         V_CDCLIENTE := C_TIPORECE.CDCLIENTE;
      END IF;

      SELECT COUNT(*)
      INTO   V_EXISTE_DATA
      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 THEN

         SELECT MAX(DTMOVSALDCXA)
         INTO   V_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 NVL(VRSALDACUCXA,0), NVL(VRSALDACUCOU,0)
         INTO   V_VRSALDACUCXA, V_VRSALDACUCOU
         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);
      ELSE
         V_VRSALDACUCXA := 0;
         V_VRSALDACUCOU := 0;
      END IF;

      SELECT COUNT(*)
      INTO   V_EXISTE_SALDO
      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_SALDO = 0 THEN
         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);
      ELSE
         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 IF;
   END LOOP;

   FOR C_SALDOCXA IN
      (SELECT DISTINCT CDFILIAL, CDCAIXA, DTMOVIMCAIXA
       FROM   MOVCAIXA
       WHERE  CDFILIAL = P_CDFILIAL AND
              CDCAIXA  = P_CDCAIXA  AND
              TO_DATE(TO_CHAR(DTMOVIMCAIXA,'DD/MM/YYYY'),'DD/MM/YYYY') BETWEEN TO_DATE(TO_CHAR(P_DTMOVSALDCXA,'DD/MM/YYYY'),'DD/MM/YYYY') AND V_DTMAXDATASALDO
       ORDER BY DTMOVIMCAIXA) LOOP

       FOR C_RECEB IN
         (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)))) LOOP

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

         IF C_RECEB.CDFILIAL <> '' THEN
            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 IF;

      END LOOP;

   END LOOP;
END;
/

-- VERSAO --
BEGIN ATUVEROBJ('SALDO_CAIXA','4.05.136'); END;
/

