create or replace PROCEDURE REPLICA_VENDAS_RM 
( 
	P_DTCALCULO IN DATE DEFAULT NULL, P_CDFILIAL IN VARCHAR2 DEFAULT 'T', P_VERIFICAR_DIA_ANTERIOR IN VARCHAR2 DEFAULT 'S'
)

AS
  V_VENDASPENDENTES NUMBER;
  V_REGISTROSVDM    NUMBER;
  V_REGISTROSVDT    NUMBER;
  V_NRPESSOASATEND  NUMBER;
  V_NRVENDACAN      NUMBER;
  V_NRVENDACON      NUMBER;
  V_CONTHORA        NUMBER;
  V_TOTALGERAL      FLOAT;
  V_TOTALVENDIDO    FLOAT;
  V_CDFILIAL        VARCHAR2(4);
  V_IDORIGVENDA     VARCHAR2(7);
  V_NOVADATACALCULO VARCHAR2(10);
  V_NRORG NUMBER;
  V_HOJE DATE;
BEGIN
	EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT = ''DD/MM/YYYY''';
	/* Verifica se existem vendas pendentes de verificacao  */
    IF (P_DTCALCULO IS NULL) THEN
		V_HOJE := TRUNC(SYSDATE);
	ELSE 
		V_HOJE := P_DTCALCULO;
	END IF;
	BEGIN
    	SELECT COUNT(IDCONTVEND)
    	INTO V_VENDASPENDENTES
    	FROM VENDA
    	WHERE IDCONTVEND = 'N'
    	AND TRUNC(DTENTRVENDA)  = V_HOJE
		AND (CDFILIAL = P_CDFILIAL OR P_CDFILIAL = 'T');		
  	EXCEPTION
  	WHEN NO_DATA_FOUND THEN
    	V_VENDASPENDENTES := 0;
	END;
  	/* Se encontrar alguma venda no passo anterior, realiza o passo de registra-las na tabela VENDADIAMODALIDADE */
  	IF V_VENDASPENDENTES > 0 THEN
    	FOR C_VENDAS IN
			(SELECT CDFILIAL, NMFILIAL, IDORIGEMVENDA, IDCONTVEND, DTENTRVENDA, NRORG,
			   	SUM(TOTALVEND) TOTALVEND,
			   	TRUNC(SUM(TICKETMEDIO) / SUM(DECODE(VRQTVENDACONC, 0, 1, VRQTVENDACONC)), 2) TICKETMEDIO,
			   	SUM(VRQTVENDACONC) VRQTVENDACONC, SUM(VRQTVENDACANC) VRQTVENDACANC
		  	FROM  (SELECT PARCIAL.CDFILIAL, PARCIAL.NMFILIAL, PARCIAL.IDORIGEMVENDA, PARCIAL.IDCONTVEND, PARCIAL.DTENTRVENDA, PARCIAL.NRORG,
							SUM(DECODE(PARCIAL.IDSITUVENDA, 'C', 0, PARCIAL.TOTALVEND)) TOTALVEND,
							TRUNC(SUM(PARCIAL.TICKETMEDIO)) AS TICKETMEDIO,
							SUM(COUNT(DISTINCT VRQTVENDACONC)) OVER (PARTITION BY CDFILIAL, IDORIGEMVENDA) VRQTVENDACONC,
							SUM(COUNT(DISTINCT VRQTVENDACANC)) OVER (PARTITION BY CDFILIAL, IDORIGEMVENDA) VRQTVENDACANC
				   	FROM (SELECT X.CDFILIAL, X.NMFILIAL, CASE X.IDORIGEMVENDA WHEN 'BAL_AUT' THEN 'TAA' ELSE SUBSTR(X.IDORIGEMVENDA, 0, 3) END AS IDORIGEMVENDA, X.IDCONTVEND, X.DTENTRVENDA, X.NRORG,
									DECODE(IDSITUVENDA, 'C', 0, TRUNC(IT.QTPRODVEND*(IT.VRUNITVEND+NVL(IT.VRUNITVENDCL,0)),2) - NVL(IT.VRDESITVEND,0) + NVL(IT.VRACRITVEND,0)) AS TOTALVEND,
									DECODE(IDSITUVENDA, 'C', 0, TRUNC(IT.QTPRODVEND*(IT.VRUNITVEND+NVL(IT.VRUNITVENDCL,0)),2) - NVL(IT.VRDESITVEND,0) + NVL(IT.VRACRITVEND,0)) AS TICKETMEDIO,
									X.IDSITUVENDA,
									DECODE(IDSITUVENDA, 'O', X.CDFILIAL||X.CDCAIXA||X.NRSEQVENDA) VRQTVENDACONC,
									DECODE(IDSITUVENDA, 'C', X.CDFILIAL||X.CDCAIXA||X.NRSEQVENDA) VRQTVENDACANC
						   	FROM (SELECT DISTINCT V.CDFILIAL,
											V.CDCAIXA,
											V.NRSEQVENDA,
											FLC.NMFILIAL,
											V.IDORIGEMVENDA,
											V.NRORG,
											V.IDCONTVEND,
											V.DTENTRVENDA,
											V.IDSITUVENDA
								   	FROM VENDA V, (SELECT DISTINCT CDFILIAL, NMFILIAL, CDLOJA, CDCAIXA FROM V_FILIALLOJACAIXA WHERE (CDFILIAL = P_CDFILIAL OR P_CDFILIAL = 'T')) FLC
								  	WHERE V.CDCAIXA   = FLC.CDCAIXA
										AND V.CDLOJA      = FLC.CDLOJA
										AND V.CDFILIAL    = FLC.CDFILIAL
										AND TRUNC(V.DTENTRVENDA) = V_HOJE
										AND V.IDCONTVEND  = 'N'
										AND V.IDSITUVENDA IN ('O', 'C')
										ORDER BY V.NRSEQVENDA) X LEFT JOIN ITEMVENDA IT
																		ON X.CDFILIAL = IT.CDFILIAL
																   	AND X.CDCAIXA    = IT.CDCAIXA
																   	AND X.NRSEQVENDA = IT.NRSEQVENDA) PARCIAL
				  	GROUP BY PARCIAL.CDFILIAL, PARCIAL.NMFILIAL, PARCIAL.IDORIGEMVENDA, PARCIAL.IDCONTVEND, PARCIAL.DTENTRVENDA, PARCIAL.NRORG) FINAL
		  	GROUP BY CDFILIAL, NMFILIAL, IDORIGEMVENDA, IDCONTVEND, DTENTRVENDA, NRORG
		  	ORDER BY CDFILIAL) LOOP
      	V_CDFILIAL     := C_VENDAS.CDFILIAL;
      	V_IDORIGVENDA  := C_VENDAS.IDORIGEMVENDA;
      	V_TOTALVENDIDO := C_VENDAS.TOTALVEND;
      	V_NRORG        := C_VENDAS.NRORG;
	  	V_NRVENDACAN   := C_VENDAS.VRQTVENDACANC;
	  	V_NRVENDACON   := C_VENDAS.VRQTVENDACONC;
      	/* Verifica se o registro ja possui campo na tabela VENDADIAMODALIDADE */
      	BEGIN
        	SELECT COUNT(CDFILIAL)
        	INTO V_REGISTROSVDM
        	FROM VENDADIAMODALIDADE VDM
        	WHERE VDM.CDFILIAL     = V_CDFILIAL
        	AND TRUNC(VDM.DTVENDA) = V_HOJE
        	AND VDM.IDMODALIDADE   = V_IDORIGVENDA;
      	EXCEPTION
      	WHEN NO_DATA_FOUND THEN
        	V_VENDASPENDENTES := 0;
      	END;
      	/* Caso nao exista, cria. Se existe, atualiza */
      	IF V_REGISTROSVDM = 0 THEN
        	INSERT
        	INTO VENDADIAMODALIDADE
          	( CDFILIAL, DTVENDA, IDMODALIDADE, VRTOTAL, NRORG )
          	VALUES
          	( V_CDFILIAL, V_HOJE, V_IDORIGVENDA, V_TOTALVENDIDO, V_NRORG );
      	ELSE
        	UPDATE VENDADIAMODALIDADE
        	SET VRTOTAL          = VRTOTAL + V_TOTALVENDIDO
        	WHERE TRUNC(DTVENDA) = V_HOJE
        	AND CDFILIAL         = V_CDFILIAL
        	AND IDMODALIDADE     = V_IDORIGVENDA;
      	END IF;
	  	/* Verifica se o registro ja possui campo na tabela VENDADIATOTAL */
      	BEGIN
        	SELECT COUNT(CDFILIAL)
        	INTO V_REGISTROSVDT
        	FROM VENDADIATOTAL VDT
        	WHERE VDT.CDFILIAL     = V_CDFILIAL
        	AND TRUNC(VDT.DTVENDA) = V_HOJE;
      	EXCEPTION
      	WHEN NO_DATA_FOUND THEN
        	V_VENDASPENDENTES := 0;
      	END;
	  	/* Caso nao exista, cria. Se existe, atualiza */
      	IF V_REGISTROSVDT = 0 THEN
        	INSERT
        	INTO VENDADIATOTAL
          	( CDFILIAL, DTVENDA, NRVENDACON, NRVENDACAN, VRTICKETMED, VRTOTAL, NRORG )
          	VALUES
          	( V_CDFILIAL, V_HOJE, V_NRVENDACON, V_NRVENDACAN, TRUNC(V_TOTALVENDIDO/DECODE(V_NRVENDACON, 0, 1, V_NRVENDACON),2),V_TOTALVENDIDO, V_NRORG );
      	ELSE
        	UPDATE VENDADIATOTAL
        	SET NRVENDACON = NRVENDACON+V_NRVENDACON,
			 	NRVENDACAN = NRVENDACAN+V_NRVENDACAN,
        VRTOTAL = VRTOTAL+V_TOTALVENDIDO,
        VRTICKETMED = TRUNC((VRTOTAL/DECODE(NRVENDACON, 0, 1, NRVENDACON)), 2)
        	WHERE TRUNC(DTVENDA)    = V_HOJE
        	AND CDFILIAL     = V_CDFILIAL;
      	END IF;	
		
	  	/* Calcula venda por hora */
	  	VENDA_HORA(V_CDFILIAL, V_NRORG, V_HOJE);
		
		/* Marca a venda como registrada */
      	UPDATE VENDA
      	SET IDCONTVEND    = 'S'
      	WHERE IDSITUVENDA IN ('O', 'C')
      	AND DTENTRVENDA   = V_HOJE
		AND CDFILIAL = V_CDFILIAL;	
	  	COMMIT;	
		
    	END LOOP;		
	  	
  	END IF;
	IF P_VERIFICAR_DIA_ANTERIOR = 'S' THEN
        V_HOJE := TRUNC((SYSDATE - 1));
    	REPLICA_VENDAS_RM(V_HOJE, 'T', 'N');
	END IF;
END;