IF EXISTS(SELECT NAME FROM SYSOBJECTS
          WHERE NAME = 'SALDO_GERENCIAL_GERAL' AND TYPE = 'P')
   DROP PROCEDURE SALDO_GERENCIAL_GERAL
   GO

CREATE PROCEDURE SALDO_GERENCIAL_GERAL
                    @P_CDEMPRESA VARCHAR(02),
                    @P_DATAINIC  DATETIME

AS

DECLARE @V_DTFINACONT  DATETIME;
DECLARE @DATA_SALDO    DATETIME;
DECLARE @DATA_MAX      DATETIME;
DECLARE @DATA_INIC     DATETIME;
DECLARE @V_CONTSALDO   INTEGER;
DECLARE @V_IDSALDEMPR  VARCHAR(01);
DECLARE @V_COUNT       DOUBLE PRECISION;

DECLARE @SALDANT_CDFILIAL   VARCHAR(04);
DECLARE @SALDANT_CDCENTCUST VARCHAR(04);
DECLARE @SALDANT_CDCONTCTBL VARCHAR(20);
DECLARE @SALDANT_DTSALDCCUS DATETIME;
DECLARE @SALDANT_VRSALDCCUS DOUBLE PRECISION;

DECLARE @ATUALIZA_CDFILIAL   VARCHAR(04);
DECLARE @ATUALIZA_CDCENTCUST VARCHAR(04);
DECLARE @ATUALIZA_CDCONTCTBL VARCHAR(20);
DECLARE @ATUALIZA_MENOR_DATA DATETIME;

DECLARE @SOMACONTA_CDFILIAL   VARCHAR(04);
DECLARE @SOMACONTA_CDCENTCUST VARCHAR(04);
DECLARE @SOMACONTA_CDCONTCTBL VARCHAR(20);
DECLARE @SOMACONTA_VALORSALDO DOUBLE PRECISION;

BEGIN

   SELECT @V_DTFINACONT = DTFINACONT
   FROM CONTOPECTBL
   WHERE (CDEMPRESA = @P_CDEMPRESA);

   DELETE FROM SALDCCUS
   WHERE (SALDCCUS.CDEMPRESA   = @P_CDEMPRESA) AND
         (SALDCCUS.DTSALDCCUS >= @P_DATAINIC);

   DECLARE SALDANT CURSOR FOR
      SELECT SALDCCUS.CDFILIAL,   SALDCCUS.CDCENTCUST,
             SALDCCUS.CDCONTCTBL, SALDCCUS.DTSALDCCUS,
             SALDCCUS.VRSALDCCUS
      FROM SALDCCUS
      WHERE (SALDCCUS.CDEMPRESA  = @P_CDEMPRESA) AND
            (SALDCCUS.DTSALDCCUS IN (SELECT MAX(S.DTSALDCCUS)
                                     FROM SALDCCUS S
                                     WHERE (S.CDEMPRESA  = @P_CDEMPRESA)        AND
                                           (S.CDFILIAL   = SALDCCUS.CDFILIAL)   AND
                                           (S.CDCENTCUST = SALDCCUS.CDCENTCUST) AND
                                           (S.CDCONTCTBL = SALDCCUS.CDCONTCTBL) AND
                                           (S.DTSALDCCUS < @P_DATAINIC)));

   OPEN SALDANT;
   FETCH NEXT FROM SALDANT INTO @SALDANT_CDFILIAL,   @SALDANT_CDCENTCUST, @SALDANT_CDCONTCTBL,
                                @SALDANT_DTSALDCCUS, @SALDANT_VRSALDCCUS;
   WHILE (@@FETCH_STATUS = 0) BEGIN
      SET @DATA_SALDO = DATEADD(MM, 1, @SALDANT_DTSALDCCUS) - DAY(DATEADD(MM, 1, @SALDANT_DTSALDCCUS));
      WHILE (@DATA_SALDO <= @V_DTFINACONT) BEGIN
         INSERT INTO SALDCCUS
            (CDEMPRESA, CDFILIAL, CDCENTCUST, CDCONTCTBL, DTSALDCCUS, VRSALDCCUS)
         (SELECT @P_CDEMPRESA, @SALDANT_CDFILIAL, @SALDANT_CDCENTCUST, CDCONTCTBL, @DATA_SALDO, 0
          FROM CONTCTBL
          WHERE (CDCONTCTBL NOT IN (SELECT DISTINCT CDCONTCTBL
                                    FROM SALDCCUS
                                    WHERE (CDEMPRESA  = @P_CDEMPRESA)          AND
                                          (DTSALDCCUS = @DATA_SALDO)           AND
                                          (CDFILIAL   = @SALDANT_CDFILIAL)     AND
                                          (CDCENTCUST = @SALDANT_CDCENTCUST))) AND
                (CHARINDEX(RTRIM(CONTCTBL.CDCONTCTBL), @SALDANT_CDCONTCTBL) = 1));
         SET @DATA_SALDO = DATEADD(MM, 1, @DATA_SALDO);
         SET @DATA_SALDO = DATEADD(MM, 1, @DATA_SALDO) - DAY(DATEADD(MM, 1, @DATA_SALDO));
      END;

      UPDATE SALDCCUS
      SET VRSALDCCUS = @SALDANT_VRSALDCCUS
      WHERE (SALDCCUS.DTSALDCCUS >= @P_DATAINIC)        AND
            (SALDCCUS.CDEMPRESA  = @P_CDEMPRESA)        AND
            (SALDCCUS.CDFILIAL   = @SALDANT_CDFILIAL)   AND
            (SALDCCUS.CDCENTCUST = @SALDANT_CDCENTCUST) AND
            (SALDCCUS.CDCONTCTBL = @SALDANT_CDCONTCTBL);

      FETCH NEXT FROM SALDANT INTO @SALDANT_CDFILIAL,   @SALDANT_CDCENTCUST, @SALDANT_CDCONTCTBL,
                                   @SALDANT_DTSALDCCUS, @SALDANT_VRSALDCCUS;
   END;
   CLOSE SALDANT;
   DEALLOCATE SALDANT;

   DECLARE ATUALIZA CURSOR FOR
      SELECT LANCCCUSTO.CDFILIAL, LANCCCUSTO.CDCENTCUST,
             LANCCONT.CDCONTCTBL, MIN(DTLANCCONT) AS MENOR_DATA
      FROM LANCCONT, LANCCCUSTO
      WHERE (LANCCONT.CDEMPRESA    = @P_CDEMPRESA)        AND
            (LANCCONT.DTLANCCONT  >= @P_DATAINIC)         AND
            (LANCCCUSTO.CDEMPRESA  = @P_CDEMPRESA)        AND
            (LANCCCUSTO.NRLANCCONT = LANCCONT.NRLANCCONT) AND
            (LANCCCUSTO.NRSEQLANC  = LANCCONT.NRSEQLANC)
      GROUP BY LANCCCUSTO.CDFILIAL, LANCCCUSTO.CDCENTCUST, LANCCONT.CDCONTCTBL;

   OPEN ATUALIZA;
   FETCH NEXT FROM ATUALIZA INTO @ATUALIZA_CDFILIAL, @ATUALIZA_CDCENTCUST, @ATUALIZA_CDCONTCTBL, @ATUALIZA_MENOR_DATA;
   WHILE (@@FETCH_STATUS = 0) BEGIN
      SET @DATA_SALDO = DATEADD(MM, 1, @ATUALIZA_MENOR_DATA) - DAY(DATEADD(MM, 1, @ATUALIZA_MENOR_DATA));
      SELECT @V_CONTSALDO = COUNT(*)
      FROM SALDCCUS
      WHERE (CDEMPRESA  = @P_CDEMPRESA)         AND
            (CDCONTCTBL = @ATUALIZA_CDCONTCTBL) AND
            (CDFILIAL   = @ATUALIZA_CDFILIAL)   AND
            (CDCENTCUST = @ATUALIZA_CDCENTCUST) AND
            (DTSALDCCUS = @DATA_SALDO);

      IF (@V_CONTSALDO = 0.0) BEGIN
         WHILE (@DATA_SALDO <= @V_DTFINACONT) BEGIN
            INSERT INTO SALDCCUS
               (CDEMPRESA, CDFILIAL, CDCENTCUST, CDCONTCTBL, DTSALDCCUS, VRSALDCCUS)
            (SELECT @P_CDEMPRESA, @ATUALIZA_CDFILIAL, @ATUALIZA_CDCENTCUST, CDCONTCTBL, @DATA_SALDO, 0
             FROM CONTCTBL
             WHERE (CDCONTCTBL NOT IN (SELECT DISTINCT CDCONTCTBL
                                       FROM SALDCCUS
                                       WHERE ((CDEMPRESA   = @P_CDEMPRESA)         AND
                                               (CDFILIAL   = @ATUALIZA_CDFILIAL)   AND
                                               (CDCENTCUST = @ATUALIZA_CDCENTCUST) AND
                                               (DTSALDCCUS = @DATA_SALDO))))       AND
                   (CHARINDEX(RTRIM(CONTCTBL.CDCONTCTBL), @ATUALIZA_CDCONTCTBL) = 1));

            SET @DATA_SALDO = DATEADD(MM, 1, @DATA_SALDO);
            SET @DATA_SALDO = DATEADD(MM, 1, @DATA_SALDO) - DAY(DATEADD(MM, 1, @DATA_SALDO))
         END;
      END;

      SET @DATA_SALDO = DATEADD(MM, 1, @ATUALIZA_MENOR_DATA) - DAY(DATEADD(MM, 1, @ATUALIZA_MENOR_DATA));

      WHILE (@DATA_SALDO <= @V_DTFINACONT) BEGIN
         DECLARE SOMACONTA CURSOR FOR
            SELECT LANCCCUSTO.CDFILIAL, LANCCCUSTO.CDCENTCUST,
                   LANCCONT.CDCONTCTBL, SUM(LANCCCUSTO.VRLANCCUST) AS VALORSALDO
            FROM LANCCONT,LANCCCUSTO
            WHERE (LANCCONT.CDEMPRESA    = @P_CDEMPRESA)                             AND
                  (LANCCCUSTO.DTCOMPCUSTO BETWEEN @ATUALIZA_MENOR_DATA AND @DATA_SALDO) AND
                  (LANCCCUSTO.CDFILIAL   = @ATUALIZA_CDFILIAL)                       AND
                  (LANCCCUSTO.CDCENTCUST = @ATUALIZA_CDCENTCUST)                     AND
                  (LANCCONT.CDCONTCTBL   = @ATUALIZA_CDCONTCTBL)                     AND
                  (LANCCCUSTO.CDEMPRESA  = @P_CDEMPRESA)                             AND
                  (LANCCONT.NRLANCCONT   = LANCCCUSTO.NRLANCCONT)                    AND
                  (LANCCONT.NRSEQLANC    = LANCCCUSTO.NRSEQLANC)
            GROUP BY LANCCCUSTO.CDFILIAL, LANCCCUSTO.CDCENTCUST, LANCCONT.CDCONTCTBL;

         OPEN SOMACONTA;
         FETCH NEXT FROM SOMACONTA INTO @SOMACONTA_CDFILIAL,   @SOMACONTA_CDCENTCUST,
                                        @SOMACONTA_CDCONTCTBL, @SOMACONTA_VALORSALDO;
         WHILE(@@FETCH_STATUS = 0) BEGIN
            UPDATE SALDCCUS
            SET VRSALDCCUS = SALDCCUS.VRSALDCCUS + @SOMACONTA_VALORSALDO
            WHERE (SALDCCUS.DTSALDCCUS = @DATA_SALDO)           AND
                  (SALDCCUS.CDEMPRESA  = @P_CDEMPRESA)          AND
                  (SALDCCUS.CDFILIAL   = @SOMACONTA_CDFILIAL)   AND
                  (SALDCCUS.CDCENTCUST = @SOMACONTA_CDCENTCUST) AND
                  (CHARINDEX(RTRIM(SALDCCUS.CDCONTCTBL), @SOMACONTA_CDCONTCTBL) = 1);

            FETCH NEXT FROM SOMACONTA INTO @SOMACONTA_CDFILIAL,   @SOMACONTA_CDCENTCUST,
                                           @SOMACONTA_CDCONTCTBL, @SOMACONTA_VALORSALDO;
         END;
         CLOSE SOMACONTA;
         DEALLOCATE SOMACONTA;

         SET @DATA_SALDO = DATEADD(MM, 1, @DATA_SALDO);
         SET @DATA_SALDO = DATEADD(MM, 1, @DATA_SALDO) - DAY(DATEADD(MM, 1, @DATA_SALDO))
      END;
      FETCH NEXT FROM ATUALIZA INTO @ATUALIZA_CDFILIAL, @ATUALIZA_CDCENTCUST, @ATUALIZA_CDCONTCTBL, @ATUALIZA_MENOR_DATA;
   END;
   CLOSE ATUALIZA;
   DEALLOCATE ATUALIZA;
   /* COMMIT;
       EXCEPTION
        WHEN OTHERS THEN
         ROLLBACK;
      RAISE; */
END;
GO


-- VERSAO --
EXEC ATUVEROBJ 'SALDO_GERENCIAL_GERAL','5.05.020';
GO

