CREATE OR REPLACE PROCEDURE IMPORTA_SERVICOPROPCOM
(
	P_NRPROPOSTACOMERCIALORI IN NUMBER,
	P_NRVERSAOPROPCOMORI IN NUMBER,
	P_SERVICOSORIGEM IN VARCHAR2,
	P_NRVERSAOPROPCOMDEST IN NUMBER,
	P_COMPLEMENTAR IN VARCHAR2,
	P_CDOPERADOR IN VARCHAR2,
	P_NRORG IN NUMBER,
	P_CDFILIALLOGADA IN VARCHAR2,
	P_NRLISTAERROS OUT NUMBER
)
AS
	V_NRPROPOSTACOMERCIAL NUMBER;
	V_CDPAIS VARCHAR2(4);
	V_SGESTADO VARCHAR2(2);
	V_CDMUNICIPIO VARCHAR2(4);
	V_CDREGIAOORI VARCHAR2(3);
	V_CDREGIAODEST VARCHAR2(3);
	V_CDSEGMERDEST VARCHAR2(5);
	V_NRSERVICOPROPCOMDEST NUMBER;
	V_NRDETALHESERVPROPCOM NUMBER;
	V_NRSERVICOPROPCOMCOMPL NUMBER;

	V_SERVICO VARCHAR2(500);
	V_PADRAOQ VARCHAR2(500);
	V_PUBLICO VARCHAR2(500);

	V_IDATIVO VARCHAR2(1);
	V_DTINIVIGENCIA DATE;
	V_DTFIMVIGENCIA DATE;

	V_VALIDO VARCHAR2(1);
	V_IDSITUACAO VARCHAR2(30);

	V_QTDE NUMBER;

	-- Procedure auxiliar para agilizar inclusao na lista de erros
   PROCEDURE I_L(MENSAGEM IN VARCHAR2)
   AS
   BEGIN
      INSERE_LISTA_ERROS(P_CDFILIALLOGADA, MENSAGEM,
                         P_CDOPERADOR, P_NRORG, P_NRLISTAERROS);
   END;
BEGIN
	IF (P_NRVERSAOPROPCOMORI = P_NRVERSAOPROPCOMDEST) THEN
		-- Simulacao de origem e igual a simulacao de destino
		I_L(MSG('TCOPROC_SIMUORI_IGUAL_SIMUDEST'));
	ELSE
		SELECT MAX(NRPROPOSTACOMERCIAL)
		  INTO V_NRPROPOSTACOMERCIAL
		  FROM VERSAOPROPCOM
		 WHERE NRVERSAOPROPCOM = P_NRVERSAOPROPCOMDEST;

		-- Dados da proposta comercial de origem
		SELECT MAX(CDPAIS), MAX(SGESTADO), MAX(CDMUNICIPIO)
		  INTO V_CDPAIS, V_SGESTADO, V_CDMUNICIPIO
		  FROM PROPOSTACOMERCIAL
		 WHERE NRPROPOSTACOMERCIAL = P_NRPROPOSTACOMERCIALORI;

		SELECT MAX(CDREGIAO)
		  INTO V_CDREGIAOORI
		  FROM MUNICIPIO
		 WHERE CDPAIS = V_CDPAIS
		   AND SGESTADO = V_SGESTADO
		   AND CDMUNICIPIO = V_CDMUNICIPIO;
		-- Dados da proposta comercial de destino
		SELECT MAX(CDPAIS), MAX(SGESTADO), MAX(CDMUNICIPIO), MAX(CDSEGMER)
		  INTO V_CDPAIS, V_SGESTADO, V_CDMUNICIPIO, V_CDSEGMERDEST
		  FROM PROPOSTACOMERCIAL
		 WHERE NRPROPOSTACOMERCIAL = P_NRPROPOSTACOMERCIALORI;	

		SELECT MAX(CDREGIAO)
		  INTO V_CDREGIAODEST
		  FROM MUNICIPIO
		 WHERE CDPAIS = V_CDPAIS
		   AND SGESTADO = V_SGESTADO
		   AND CDMUNICIPIO = V_CDMUNICIPIO;

		IF (V_CDREGIAOORI <> V_CDREGIAODEST) THEN
			-- Regiao da proposta de origem e diferente da regiao da proposta de destino
			I_L(MSG('TCOPROC_REGIAO_DIF'));
		END IF;

		V_IDSITUACAO := SIT_VERSAOPROPCOM(P_NRVERSAOPROPCOMDEST);

		IF (V_IDSITUACAO IN ('CONCLUIDA', 'APROVADA')) THEN
			-- Simulacao de destino se encontra concluida ou aprovada
			I_L(MSG('TCOPROC_SIMULA_JA_CONC'));
			RETURN;
		END IF;

		-- Percorre os servicos selecionados para importacao
		FOR C_SERVICOS_SELEC IN
		(
			SELECT S.NRSERVICOPROPCOM
			  FROM SERVICOPROPCOM S
			 WHERE S.NRVERSAOPROPCOM = P_NRVERSAOPROPCOMORI
			   AND VALOR_NA_LISTA(S.NRSERVICOPROPCOM, P_SERVICOSORIGEM) > 0
			   AND S.NRSERVICOPROPCOMCOMPL IS NULL 
		) LOOP
			-- Busca as informacoes do servico e dos servicos complementares vinculados a ele
			FOR C_SERVICOS IN
			(
				SELECT S.NRSERVICOPROPCOM, S.NRDETALHESERVPROPCOM, S.NRCARDAPIOBASE, 
			       SP.NRSERVICOPROPOSTA, SP.CDSERVICOPROPOSTA, SP.NMSERVICOPROPOSTA,
			       PQ.NRPADRAOQUALIDADE, PQ.CDPADRAOQUALIDADE, PQ.NMPADRAOQUALIDADE,
	             TP.NRTIPOPUBLICO, TP.CDTIPOPUBLICO, TP.NMTIPOPUBLICO,
	             S.QTSEGSEX, S.QTSABADO, S.QTDOMFERI,
					 S.QTTOTDIAS, S.QTTURNOS, S.QTTOTREFEICOES,
					 CASE WHEN S.NRSERVICOPROPCOMCOMPL = C_SERVICOS_SELEC.NRSERVICOPROPCOM THEN 'S' 
					      ELSE 'N' END AS IDCOMPLEMENTAR
			  FROM SERVICOPROPCOM S
			  	    INNER JOIN SERVICOPROPOSTA SP ON SP.NRSERVICOPROPOSTA = S.NRSERVICOPROPOSTA
	             INNER JOIN PADRAOQUALIDADE PQ ON PQ.NRPADRAOQUALIDADE = S.NRPADRAOQUALIDADE
	             INNER JOIN TIPOPUBLICO TP ON TP.NRTIPOPUBLICO = S.NRTIPOPUBLICO            
			 WHERE S.NRVERSAOPROPCOM = P_NRVERSAOPROPCOMORI
			   AND (S.NRSERVICOPROPCOM = C_SERVICOS_SELEC.NRSERVICOPROPCOM OR 
			   	  S.NRSERVICOPROPCOMCOMPL = C_SERVICOS_SELEC.NRSERVICOPROPCOM)
			 ORDER BY IDCOMPLEMENTAR
			) LOOP
				-- O servico selecionado sempre e processado. Os servicos complementares depende do parametro
				IF ((C_SERVICOS.IDCOMPLEMENTAR = 'N') OR 
					 (C_SERVICOS.IDCOMPLEMENTAR = 'S' AND P_COMPLEMENTAR = 'S' AND V_NRSERVICOPROPCOMCOMPL IS NOT NULL)) THEN
					V_SERVICO := C_SERVICOS.NMSERVICOPROPOSTA;
					V_PADRAOQ := C_SERVICOS.NMPADRAOQUALIDADE;
					V_PUBLICO := C_SERVICOS.NMTIPOPUBLICO;					

					IF C_SERVICOS.NRCARDAPIOBASE IS NULL THEN
						-- Cardapio base nao informado para o servico de origem __PARAM0__ __PARAM1__ __PARAM2__
						I_L(MSG('TCOPROC_REGIAO_DIF', V_SERVICO, V_PADRAOQ, V_PUBLICO));
					ELSE
						SELECT MAX(IDATIVO), MAX(DTINIVIGENCIA), MAX(DTFIMVIGENCIA)
						  INTO V_IDATIVO, V_DTINIVIGENCIA, V_DTFIMVIGENCIA
						  FROM CARDAPIOBASE
						 WHERE NRCARDAPIOBASE = C_SERVICOS.NRCARDAPIOBASE;
						V_VALIDO := 'S';
						IF V_IDATIVO = 'N' THEN
						   -- Cardapio base do servico de origem __PARAM0__ __PARAM1__ __PARAM2__ esta inativo
						   I_L(MSG('TCOPROC_CARDBASE_SERV_INATIVO', V_SERVICO, V_PADRAOQ, V_PUBLICO));
							V_VALIDO :='N';
						END IF;

						IF NOT (TRUNC(SYSDATE) BETWEEN V_DTINIVIGENCIA AND V_DTFIMVIGENCIA) THEN			   
						   -- Cardapio base do servico de origem __PARAM0__ __PARAM1__ __PARAM2__ nao esta vigente
						   I_L(MSG('TCOPROC_CARDBASE_SERV_NVIGENTE', V_SERVICO, V_PADRAOQ, V_PUBLICO));
							V_VALIDO := 'N';
						END IF;

						SELECT COUNT(1)
						  INTO V_QTDE			 
						  FROM SEGMERCARDBASE
						 WHERE NRCARDAPIOBASE = C_SERVICOS.NRCARDAPIOBASE
						   AND CDSEGMER = V_CDSEGMERDEST;
						IF V_QTDE = 0 THEN				
							-- Cardapio base do servico de origem __PARAM0__ __PARAM1__ __PARAM2__ nao atende ao segmento da proposta de destino
						   I_L(MSG('TCOPROC_CARDBASE_SERV_NATENDE_SEG', V_SERVICO, V_PADRAOQ, V_PUBLICO));
						END IF;

						IF V_VALIDO = 'S' THEN
							-- Verifica se o servico ja existe no destino
							SELECT MAX(NRSERVICOPROPCOM)
							  INTO V_NRSERVICOPROPCOMDEST
							  FROM SERVICOPROPCOM
							 WHERE NRVERSAOPROPCOM = P_NRVERSAOPROPCOMDEST
							   AND NRSERVICOPROPOSTA =  C_SERVICOS.NRSERVICOPROPOSTA
							   AND NRPADRAOQUALIDADE = C_SERVICOS.NRPADRAOQUALIDADE
							   AND NRTIPOPUBLICO = C_SERVICOS.NRTIPOPUBLICO;
							
							IF V_NRSERVICOPROPCOMDEST IS NOT NULL THEN
								V_IDSITUACAO := SIT_SERVICOPROPCOM(V_NRSERVICOPROPCOMDEST);
								IF V_IDSITUACAO NOT IN ('PENDENTE', 'CALCULADO', 'FINALIZADOPLANEJAMENTO', 'RECUSADO') THEN
								   -- Servico __PARAM0__ __PARAM1__ __PARAM2__ no destino nao pode ser alterado pois aguarda solicitacao no planejamento
							      I_L(MSG('TCOPROC_SERVPROPCOM_AGUARDA_PLAN', V_SERVICO, V_PADRAOQ, V_PUBLICO));
							      -- Passa para o proximo servico
							      CONTINUE;
							   END IF;
							ELSE
							   V_NRSERVICOPROPCOMDEST := TO_NUMBER(RETORNA_NOVO_CODIGO('SERVICOPROPCOM', 1));							   

								INSERT INTO SERVICOPROPCOM
								(NRSERVICOPROPCOM, NRVERSAOPROPCOM, NRSERVICOPROPOSTA,
								 NRPADRAOQUALIDADE, NRTIPOPUBLICO,
								 QTSEGSEX, QTSABADO, QTDOMFERI,
							    QTTOTDIAS, QTTURNOS, QTTOTREFEICOES,
								 NRORG, NRORGINCLUSAO, NRORGULTATU,
								 CDOPERINCLUSAO, CDOPERULTATU,
								 DTINCLUSAO, DTULTATU)
								VALUES
								(V_NRSERVICOPROPCOMDEST, P_NRVERSAOPROPCOMDEST, C_SERVICOS.NRSERVICOPROPOSTA,
								 C_SERVICOS.NRPADRAOQUALIDADE, C_SERVICOS.NRTIPOPUBLICO,
								 0,0,0,0,0,0,
								 P_NRORG, P_NRORG, P_NRORG,
								 P_CDOPERADOR, P_CDOPERADOR,
								 SYSDATE, SYSDATE);
							END IF;

							-- Se o servico principal foi incluido / atualizado na versao de destino, indica o servico incluido para os complementares
							IF (C_SERVICOS.IDCOMPLEMENTAR = 'N') THEN					
								V_NRSERVICOPROPCOMCOMPL := V_NRSERVICOPROPCOMDEST;
							END IF;				

							COPIA_DETALHESERVPROPCOM(C_SERVICOS.NRDETALHESERVPROPCOM, 'S', P_CDOPERADOR,
								                      P_NRORG, V_NRDETALHESERVPROPCOM, V_NRSERVICOPROPCOMDEST);

							UPDATE SERVICOPROPCOM
							   SET NRDETALHESERVPROPCOM = V_NRDETALHESERVPROPCOM,
							       IDSERVICOPROPCOM = 'CALCULADO',
							       QTSEGSEX = C_SERVICOS.QTSEGSEX, 
							       QTSABADO = C_SERVICOS.QTSABADO, 
							       QTDOMFERI = C_SERVICOS.QTDOMFERI,
							       QTTOTDIAS = C_SERVICOS.QTTOTDIAS, 
							       QTTURNOS = C_SERVICOS.QTTURNOS, 
							       QTTOTREFEICOES = C_SERVICOS.QTTOTREFEICOES,
							       NRCARDAPIOBASE = C_SERVICOS.NRCARDAPIOBASE,
							       NRSERVICOPROPCOMCOMPL = CASE WHEN C_SERVICOS.IDCOMPLEMENTAR = 'S' THEN 
							                                       V_NRSERVICOPROPCOMCOMPL
							                                    ELSE
							                                       NULL
							                               END
							 WHERE NRSERVICOPROPCOM = V_NRSERVICOPROPCOMDEST;
						END IF;

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