/**
 * Substitui o prato do cardápio base com o prato alterado no cardápio de trabalho, indicando a região correspondente
 *
 * @param {Number} P_NRCARDAPIOBASE Número do cardápio base para substituição
 * @param {Number} P_NRCARDAPIOTRAB Número do cardápio de trabalho
 * @param {Number} P_NRCOMPCARDTRAB Número da composição de um dia/coluna do cardápio de trabalho 
 * @param {Number} P_NRORG Número da organização logada
 * @param {Varchar2} P_CDOPERADOR Código do operador logado
 * revisada
 */
CREATE OR REPLACE PROCEDURE TROCAPRATO_CARDBASE
(
P_NRCARDAPIOBASE NUMBER,
P_NRCARDAPIOTRAB NUMBER,
P_NRCOMPCARDTRAB NUMBER,
P_CDREGIAO VARCHAR2,
P_NRORG NUMBER,
P_CDOPERADOR VARCHAR2
)
AS
	V_NRSEMANA NUMBER;
	V_NRDIASEMANA NUMBER;
	V_NRDIACARDBASE NUMBER;
	V_NRCONFIGCARDBASE NUMBER;
	V_NRCOMPCARDBASE NUMBER;
	V_CDFILAUXPRAT VARCHAR2(4);
	V_CDPRATO VARCHAR2(10);
	V_NRPRATCOMPCARDBASE NUMBER;
	V_NRPRATCOMPCARDBASE_EXIBICAO NUMBER;
	V_NRREGIAOPRATCARDBASE NUMBER;
BEGIN
	SELECT C.CDFILAUXPRAT, C.CDPRATO, D.NRSEMANA, D.NRDIASEMANA, CNF.NRCONFIGCARDBASE
	  INTO V_CDFILAUXPRAT, V_CDPRATO, V_NRSEMANA, V_NRDIASEMANA, V_NRCONFIGCARDBASE
	  FROM COMPCARDTRAB C
	       INNER JOIN DIACARDTRAB D ON D.NRDIACARDTRAB = C.NRDIACARDTRAB
	       INNER JOIN CONFIGCARDTRAB CNF ON CNF.NRCONFIGCARDTRAB = C.NRCONFIGCARDTRAB
	 WHERE C.NRCOMPCARDTRAB = P_NRCOMPCARDTRAB
	   AND C.NRCARDAPIOTRAB = P_NRCARDAPIOTRAB;

	IF (V_NRCONFIGCARDBASE IS NOT NULL) THEN
		SELECT MAX(NRDIACARDBASE)
		  INTO V_NRDIACARDBASE
		  FROM DIACARDBASE
		 WHERE NRCARDAPIOBASE = P_NRCARDAPIOBASE
		   AND NRSEMANA = V_NRSEMANA
		   AND NRDIASEMANA = V_NRDIASEMANA;

		IF V_NRDIACARDBASE IS NOT NULL THEN
			SELECT MAX(NRCOMPCARDBASE)
			  INTO V_NRCOMPCARDBASE
			  FROM COMPCARDBASE
			 WHERE NRCARDAPIOBASE = P_NRCARDAPIOBASE
			   AND NRDIACARDBASE = V_NRDIACARDBASE
			   AND NRCONFIGCARDBASE = V_NRCONFIGCARDBASE;

			IF (V_NRCOMPCARDBASE IS NOT NULL) THEN
				-- Verifica se o prato informado já está no cardápio
				SELECT MAX(NRPRATCOMPCARDBASE)
				  INTO V_NRPRATCOMPCARDBASE
				  FROM PRATCOMPCARDBASE
				 WHERE NRCOMPCARDBASE = V_NRCOMPCARDBASE
				   AND CDFILAUXPRAT = V_CDFILAUXPRAT
				   AND CDPRATO = V_CDPRATO;
				-- inclui caso o prato ainda não esteja no cardápio
				IF V_NRPRATCOMPCARDBASE IS NULL THEN
					V_NRPRATCOMPCARDBASE := TO_NUMBER(RETORNA_NOVO_CODIGO('PRATCOMPCARDBASE', 1));

		            INSERT INTO PRATCOMPCARDBASE
		            (NRPRATCOMPCARDBASE, NRCOMPCARDBASE,
		             CDFILAUXPRAT, CDPRATO, IDPRATOEXIBICAO,
		             NRORG, NRORGINCLUSAO, NRORGULTATU,
		             CDOPERINCLUSAO, CDOPERULTATU,
		             DTINCLUSAO, DTULTATU)
		            VALUES
		            (V_NRPRATCOMPCARDBASE, V_NRCOMPCARDBASE,
		             V_CDFILAUXPRAT, V_CDPRATO, 'N',
		             P_NRORG, P_NRORG, P_NRORG,
		             P_CDOPERADOR, P_CDOPERADOR,
		             SYSDATE, SYSDATE);
				END IF;

				-- Apaga a região do prato que a atende
				FOR C_REGIAO IN
				(
					SELECT NRREGIAOPRATCARDBASE				  
					  FROM PRATCOMPCARDBASE P
					       INNER JOIN REGIAOPRATCARDBASE R ON P.NRPRATCOMPCARDBASE = R.NRPRATCOMPCARDBASE
					 WHERE P.NRCOMPCARDBASE = V_NRCOMPCARDBASE
					   AND CDREGIAO = P_CDREGIAO
				) LOOP
					DELETE FROM REGIAOPRATCARDBASE WHERE NRREGIAOPRATCARDBASE = C_REGIAO.NRREGIAOPRATCARDBASE;										
				END LOOP;

				-- Limpa pratos que não possuem região vinculada
				FOR C_PRATOS IN
				(
					SELECT NRPRATCOMPCARDBASE
					  FROM PRATCOMPCARDBASE P
					 WHERE P.NRCOMPCARDBASE = V_NRCOMPCARDBASE
					   AND P.NRPRATCOMPCARDBASE <> V_NRPRATCOMPCARDBASE
					   AND NOT EXISTS
					   (
					      SELECT 1
					        FROM REGIAOPRATCARDBASE R
					       WHERE R.NRPRATCOMPCARDBASE = P.NRPRATCOMPCARDBASE
					   )
				) LOOP
					DELETE FROM PRATCOMPCARDBASE WHERE NRPRATCOMPCARDBASE = C_PRATOS.NRPRATCOMPCARDBASE;
				END LOOP;

				-- Indica que a região é atendida pelo prato substituído.
				V_NRREGIAOPRATCARDBASE := TO_NUMBER(RETORNA_NOVO_CODIGO('REGIAOPRATCARDBASE', 1));

				INSERT INTO REGIAOPRATCARDBASE
				(NRREGIAOPRATCARDBASE, NRPRATCOMPCARDBASE, CDREGIAO,
				NRORG, NRORGINCLUSAO, NRORGULTATU,
				CDOPERINCLUSAO, CDOPERULTATU,
				DTINCLUSAO, DTULTATU)
				VALUES				
				(V_NRREGIAOPRATCARDBASE, V_NRPRATCOMPCARDBASE, P_CDREGIAO,
				P_NRORG, P_NRORG, P_NRORG,
				P_CDOPERADOR, P_CDOPERADOR,
				SYSDATE, SYSDATE);

				-- Atualiza o prato de exibição na planilha do cardápio base
				SELECT MAX(NRPRATCOMPCARDBASE)
				  INTO V_NRPRATCOMPCARDBASE_EXIBICAO
				  FROM PRATCOMPCARDBASE
				 WHERE NRCOMPCARDBASE = V_NRCOMPCARDBASE
				   AND IDPRATOEXIBICAO = 'S';
				
				IF V_NRPRATCOMPCARDBASE_EXIBICAO IS NULL THEN
					UPDATE PRATCOMPCARDBASE
					   SET IDPRATOEXIBICAO = 'S'
					 WHERE NRPRATCOMPCARDBASE = V_NRPRATCOMPCARDBASE;
				END IF;
			END IF;
		END IF;

	END IF;	
	RETURN;
END;
/

-- VERSAO --
BEGIN ATUVEROBJ('TROCAPRATO_CARDBASE','6.35.009'); END;
/
