/* PROCEDURE */
create or replace PROCEDURE CALCULA_METAS_RM
   (
	V_CDFILIAL IN VARCHAR2,  V_NRORG NUMBER, P_CDANO IN NUMBER DEFAULT 0
   )
AS
  TYPE tNome IS VARRAY(7) OF VARCHAR(25);
  V_META		    NUMBER;
  V_CDMES           NUMBER;
  V_CDANO           NUMBER;
  V_VALORMETA       FLOAT;
  V_VALORTCKMED     FLOAT;
  V_METAACUM        FLOAT;
  V_CONTHORA        NUMBER;
  V_NRDIA           NUMBER;
  V_DIAESPECIAL     FLOAT;
  V_VALORTEMP       FLOAT;
  V_DIASDASEMANA	NUMBER;
BEGIN

    IF (P_CDANO = 0)  THEN
		V_CDANO := TO_NUMBER(TO_CHAR(sysdate, 'YYYY'));
	ELSE
		V_CDANO := P_CDANO;
	END IF;
    

	FOR k IN 1..12 LOOP
		V_CDMES := k;
		/* Verifica se ha alguma meta parametrizada para cada unidade */
		BEGIN
			SELECT COUNT(CDFILIAL) INTO V_META FROM METAMES WHERE CDFILIAL = V_CDFILIAL AND CDMES = V_CDMES AND NRORG = V_NRORG;
		EXCEPTION
		WHEN NO_DATA_FOUND THEN
			V_META := 0;
		END;

		/* Caso ja exista meta parametrizada, realiza o calculo do valor real que sera tido como META
		   Caso nao exista, realiza a estimativa de meta.	*/
		IF (V_META > 0) THEN
			UPDATE METAMES SET VRMETAESPECIAL = 0
			WHERE CDFILIAL = V_CDFILIAL AND CDMES = V_CDMES AND CDANO = V_CDANO AND NRORG = V_NRORG;
			FOR j IN 1..7 LOOP
				V_NRDIA := j;
				/* Caso haja a meta, pega as informacoes necessarias para realizar o calculo */
				FOR C_METAS IN (SELECT M.CDFILIAL, M.VRMES * (MD.VRPERCDIA/100) AS METADIAREAL, MD.VRTICKETDIA AS TICKETMEDIO, M.NRORG
								  FROM METAMES M
								  JOIN METADIA MD
								  ON M.CDFILIAL    = MD.CDFILIAL
								  AND MD.NRDIA     = V_NRDIA
								  AND MD.CDMES     = V_CDMES
								  AND MD.CDANO     = V_CDANO
								  WHERE M.CDFILIAL = V_CDFILIAL
								  AND M.CDMES      = V_CDMES
								  AND M.CDANO      = V_CDANO)
				LOOP


					SELECT COUNT(*)
						INTO V_DIASDASEMANA
					FROM DATA
					WHERE TO_CHAR(DTDATA, 'D') = V_NRDIA
						AND TO_CHAR(DTDATA, 'MM') = V_CDMES
						AND TO_CHAR(DTDATA, 'YYYY') = V_CDANO;

					V_VALORTCKMED  := C_METAS.TICKETMEDIO;
					V_VALORMETA    := C_METAS.METADIAREAL/V_DIASDASEMANA;

					FOR C_DATAS IN (
						SELECT DTDATA AS DATAINSERT
						FROM DATA
						WHERE TO_CHAR(DTDATA, 'D') = V_NRDIA
						AND TO_CHAR(DTDATA, 'MM') = V_CDMES
						AND TO_CHAR(DTDATA, 'YYYY') = V_CDANO) LOOP

						/* Limpa as tabelas de Meta Calculada */
						DELETE FROM METADIAREAL
						WHERE TRUNC(DATA) = TRUNC(C_DATAS.DATAINSERT) AND CDFILIAL = V_CDFILIAL AND NRORG = V_NRORG;

						DELETE FROM METAMODALIDADEREAL
						WHERE TRUNC(DATA) = TRUNC(C_DATAS.DATAINSERT) AND CDFILIAL = V_CDFILIAL AND NRORG = V_NRORG;

						DELETE FROM METAHORAREAL
						WHERE TRUNC(DATA) = TRUNC(C_DATAS.DATAINSERT) AND CDFILIAL = V_CDFILIAL AND NRORG = V_NRORG;

						/* Verifica se a data atual e um dia especial */
						BEGIN
							SELECT PERCCORRECAO INTO V_DIAESPECIAL FROM METADIAESPECIAL
							WHERE CDFILIAL = V_CDFILIAL AND TRUNC(DATAESP) = TRUNC(C_DATAS.DATAINSERT);
						EXCEPTION
						WHEN NO_DATA_FOUND THEN
							V_DIAESPECIAL := 0;
						END;

						/* Caso seja, aplica o fator de correcao */
						IF (V_DIAESPECIAL != 0) THEN
							V_VALORTEMP := (V_DIAESPECIAL/100 * V_VALORMETA);
							V_VALORMETA := V_VALORMETA + V_VALORTEMP;
							V_VALORTCKMED := V_VALORTCKMED + (V_DIAESPECIAL/100 * V_VALORTCKMED);

							UPDATE METAMES SET VRMETAESPECIAL = VRMETAESPECIAL + V_VALORTEMP
							WHERE CDFILIAL = V_CDFILIAL AND CDMES = V_CDMES AND CDANO = V_CDANO AND NRORG = V_NRORG;

						END IF;

						INSERT INTO METADIAREAL (CDFILIAL, DATA, CDANO, VRMETADIA, VRTCKMED, NRORG)
						VALUES (V_CDFILIAL, C_DATAS.DATAINSERT, V_CDANO, V_VALORMETA, V_VALORTCKMED, V_NRORG);

						/* Salvando a meta de cada modalidade utilizada */
						FOR C_METAMODALIDADE IN (SELECT IDMODALIDADE, VRPERCMODALIDADE
												 FROM METAMODALIDADEDIA
												 WHERE CDFILIAL = V_CDFILIAL
												 AND NRDIA 		= V_NRDIA
												 AND CDMES      = V_CDMES
												 AND CDANO      = V_CDANO)
						LOOP
							INSERT INTO METAMODALIDADEREAL (CDFILIAL, DATA, IDMODALIDADE, VRMETAMODALIDADE, NRORG)
							VALUES (V_CDFILIAL, C_DATAS.DATAINSERT, C_METAMODALIDADE.IDMODALIDADE,
									V_VALORMETA * (C_METAMODALIDADE.VRPERCMODALIDADE/100), V_NRORG );
						END LOOP;

						V_CONTHORA := 0;
						V_METAACUM := 0;

						WHILE V_CONTHORA <= 23 LOOP
								/* Salvando a meta de cada modalidade utilizada */
								FOR C_METAHORA IN ( SELECT CDFILIAL, VRPERCHORA
													FROM METAHORA
													WHERE CDFILIAL  = V_CDFILIAL
													AND CDHORA 		= V_CONTHORA
													AND NRDIA 		= V_NRDIA
													AND CDMES   	= V_CDMES
													AND CDANO   	= V_CDANO)
								LOOP
									V_METAACUM := V_METAACUM + (V_VALORMETA * (C_METAHORA.VRPERCHORA/100));
								END LOOP;

								INSERT INTO METAHORAREAL (CDFILIAL, DATA, HORA, VRMETAHORAACUM, NRORG)
								VALUES (V_CDFILIAL, C_DATAS.DATAINSERT, V_CONTHORA, V_METAACUM, V_NRORG);

								V_CONTHORA := V_CONTHORA + 1;
						END LOOP;

					END LOOP;


				END LOOP;
			END LOOP;
		END IF;
	END LOOP;
	COMMIT;
END;
/

-- VERSAO --
BEGIN ATUVEROBJ('CALCULA_METAS_RM','6.19.xxx'); END;
/