-- ================================================================================
--   Created on    :  12/06/2002  09:54
--   Programador   :  Luciana Correa
--   @C:\MARGEM
--  EXECUTE MARGEM_BRUTA('01','28/05/2002','28/05/2002','2854','9999','','T','','T','','T',5,:A);
--  @C:\WIN_V4\SQL\END_CONV\ORACLE\3841_PDVSTPO.SQL
--  EXECUTE MARGEM_BRUTA('08', '01/10/2002','01/10/2002','0500','0500','001','','','T','','T',5,:B);
-- ================================================================================

CREATE OR REPLACE PROCEDURE MARGEM_BRUTA(
P_CDEMPRESA     IN EMPRESA.CDEMPRESA%TYPE,
P_DTVENDAINI    IN DATE,
P_DTVENDAFIN    IN DATE,
P_CDFILIAL      IN SALDOCAIXA.CDFILIAL%TYPE,
P_FILIPROC      IN SALDOCAIXA.CDFILIAL%TYPE,
P_CDCAIXA       IN VARCHAR2,
P_TCDCAIXA      IN VARCHAR2,
P_CDLOJA        IN VARCHAR2,
P_TCDLOJA       IN VARCHAR2,
P_CDSUBGRPROD   IN SUBGRUPPROD.CDSUBGRPROD%TYPE,
P_TCDSUBGRPROD  IN VARCHAR2,
P_TIPOCUSTO     IN NUMBER,
P_MARGEMBRUTA   OUT NUMBER,
P_LOJA          IN LOJA.CDLOJA%TYPE DEFAULT NULL)

AS

V_VRTOTALMARGEMBRUTA  NUMBER;
V_CUSTOACUMULADO_AUX  NUMBER;
V_CUSTOACUMULADO      NUMBER;
V_NRPRODUTOS          NUMBER;
V_RESULT              FILIAL.CDFILIAL%TYPE;
V_VRCUSTO             NUMBER;

BEGIN

   V_VRTOTALMARGEMBRUTA := 0;
   V_CUSTOACUMULADO_AUX := 0;
   V_CUSTOACUMULADO     := 0;

   FOR C_PRODUTO IN
      (SELECT VE.CDFILIAL,IT.CDPRODUTO, SUM(NVL(IT.QTPRODVEND,0)) AS QTPRODVEND,
              ROUND(NVL(IT.VRUNITVEND, 0) + NVL(IT.VRUNITVENDCL, 0), 2) AS VRPREBRUTO,
              ROUND(((NVL(IT.VRUNITVEND, 0) + NVL(IT.VRUNITVENDCL, 0)) -
                     (NVL(IT.VRDESITVEND, 0) / DECODE(IT.QTPRODVEND, 0, 1, IT.QTPRODVEND))) - (((NVL(IT.VRUNITVEND, 0) +
                      NVL(IT.VRUNITVENDCL,0)) - (NVL(IT.VRDESITVEND, 0) /
                      DECODE(IT.QTPRODVEND, 0, 1, IT.QTPRODVEND))) * NVL(IM.VRPEALPRODIT, 0) / 100), 2) AS VRPRELIQ
       FROM   VENDA VE, CAIXA CA, ITEMVENDA IT, ITVENDAIMPOS IM
       WHERE VE.CDFILIAL  = P_CDFILIAL
         AND ((INSTR(P_CDLOJA, CA.CDFILIAL||CA.CDLOJA              ) > 0) OR (P_TCDLOJA      = 'T'))
         AND ((INSTR(P_CDCAIXA, CA.CDFILIAL||CA.CDCAIXA            ) > 0) OR (P_TCDCAIXA     = 'T'))
         AND ((INSTR(P_CDSUBGRPROD, IT.CDSUBGRPROD) > 0) OR (P_TCDSUBGRPROD = 'T'))
         AND VE.DTENTRVENDA BETWEEN P_DTVENDAINI AND P_DTVENDAFIN
         AND VE.CDFILIAL   = IT.CDFILIAL
         AND VE.CDCAIXA    = IT.CDCAIXA
         AND VE.NRSEQVENDA = IT.NRSEQVENDA
         AND VE.CDCAIXA    = CA.CDCAIXA
         AND VE.IDSITUVENDA <> 'C'
         AND VE.CDFILIAL   = CA.CDFILIAL
         AND IM.CDFILIAL (+) = IT.CDFILIAL
         AND IM.CDCAIXA  (+) = IT.CDCAIXA
         AND IM.NRSEQVENDA(+)= IT.NRSEQVENDA
         AND IM.NRSEQUITVEND(+) = IT.NRSEQUITVEND
       GROUP BY
          VE.CDFILIAL,IT.CDPRODUTO,
          (NVL(IT.VRUNITVEND, 0) + NVL(IT.VRUNITVENDCL, 0)),
          ROUND(((NVL(IT.VRUNITVEND, 0) + NVL(IT.VRUNITVENDCL, 0)) -
                 (NVL(IT.VRDESITVEND, 0) / DECODE(IT.QTPRODVEND, 0, 1, IT.QTPRODVEND))) - (((NVL(IT.VRUNITVEND, 0) +
                  NVL(IT.VRUNITVENDCL,0)) - (NVL(IT.VRDESITVEND, 0) /
                  DECODE(IT.QTPRODVEND, 0, 1, IT.QTPRODVEND))) * NVL(IM.VRPEALPRODIT, 0) / 100), 2)
       ORDER BY
          VE.CDFILIAL,IT.CDPRODUTO ) LOOP

      /* VERIFICA COMPOSICAO LOCAL */
      SELECT COUNT(*)
      INTO   V_NRPRODUTOS
      FROM   ROTFABLOCAL
      WHERE (CDFILIAL  = P_CDFILIAL ) AND
            (CDPRODUTO = C_PRODUTO.CDPRODUTO);

      IF V_NRPRODUTOS > 0 THEN
         V_RESULT := P_CDFILIAL;
      ELSE
         V_RESULT := 'P';
      END IF;

      CUSTO_COMP_PROD(C_PRODUTO.CDPRODUTO,P_CDFILIAL,P_FILIPROC,P_TIPOCUSTO,1, P_LOJA, V_VRCUSTO);

      V_CUSTOACUMULADO_AUX  := NVL(V_VRCUSTO,0);

      DBMS_OUTPUT.PUT_LINE(C_PRODUTO.CDPRODUTO);
      DBMS_OUTPUT.PUT_LINE((C_PRODUTO.QTPRODVEND * C_PRODUTO.VRPRELIQ) - (V_VRCUSTO * C_PRODUTO.QTPRODVEND));
      DBMS_OUTPUT.PUT_LINE(V_VRCUSTO);

      V_CUSTOACUMULADO      := V_CUSTOACUMULADO + (V_CUSTOACUMULADO_AUX * C_PRODUTO.QTPRODVEND);
      /*DBMS_OUTPUT.PUT_LINE('QTDE'||C_PRODUTO.QTPRODVEND||'-'||'PRECO'||C_PRODUTO.VRPRELIQ);*/
      V_VRTOTALMARGEMBRUTA  := V_VRTOTALMARGEMBRUTA + (C_PRODUTO.QTPRODVEND * C_PRODUTO.VRPRELIQ) - (ROUND(V_CUSTOACUMULADO_AUX,2) * C_PRODUTO.QTPRODVEND);

      V_CUSTOACUMULADO_AUX  := 0;

   END LOOP;
   P_MARGEMBRUTA := ROUND(V_VRTOTALMARGEMBRUTA,2);
   DBMS_OUTPUT.PUT_LINE(V_VRTOTALMARGEMBRUTA);
END;
/


-- VERSAO --
BEGIN ATUVEROBJ('MARGEM_BRUTA','6.19.XXX'); END;
/


