CREATE OR REPLACE PROCEDURE DUPLICA_SERVICOPROPCOM
(
	P_NRSERVICOPROPCOM NUMBER,
	P_NRNOVAVERSAOPROPCOM NUMBER,
	P_NRORG NUMBER,
	P_CDOPERADOR VARCHAR2
)
AS
	V_NRSERVICOPROPCOM NUMBER;
	V_NRDETALHESERVPROPCOM NUMBER;
	V_NRDETALHESERVPROPCOMNOVO NUMBER;
   V_NRSERVICOPROPCOMCOMPL NUMBER;
   V_NRSERVICOPROPCOMCOMPLNOVO NUMBER;
   V_NRSERVICOPROPOSTA NUMBER;
   V_NRPADRAOQUALIDADE NUMBER;
   V_NRTIPOPUBLICO NUMBER;
   V_NRCARDAPIOTRAB NUMBER;
BEGIN	
   -- Busca as informacoes do servico a duplicar
	SELECT MAX(S.NRDETALHESERVPROPCOM), MAX(S.NRSERVICOPROPCOMCOMPL),
          MAX(S.NRSERVICOPROPOSTA), MAX(S.NRPADRAOQUALIDADE), MAX(S.NRTIPOPUBLICO),
          MAX(D.NRCARDAPIOTRAB)
	  INTO V_NRDETALHESERVPROPCOM, V_NRSERVICOPROPCOMCOMPL,
          V_NRSERVICOPROPOSTA, V_NRPADRAOQUALIDADE, V_NRTIPOPUBLICO,
          V_NRCARDAPIOTRAB
	  FROM SERVICOPROPCOM S
          INNER JOIN DETALHESERVPROPCOM D ON D.NRDETALHESERVPROPCOM = S.NRDETALHESERVPROPCOM
	 WHERE S.NRSERVICOPROPCOM = P_NRSERVICOPROPCOM;

   -- Caso seja um servico complementar, verifica na nova versao quem ele complementa
   IF V_NRSERVICOPROPCOMCOMPL IS NOT NULL THEN
      SELECT MAX(NRSERVICOPROPCOM)
        INTO V_NRSERVICOPROPCOMCOMPLNOVO
        FROM SERVICOPROPCOM
       WHERE NRVERSAOPROPCOM = P_NRNOVAVERSAOPROPCOM
         AND NRSERVICOPROPOSTA = V_NRSERVICOPROPOSTA
         AND NRPADRAOQUALIDADE = V_NRPADRAOQUALIDADE
         AND NRTIPOPUBLICO = V_NRTIPOPUBLICO;
   END IF; 

   /* Duplica estrutura do detalhe do servico. Novo detalhe gerado estara apontando para o detalhe de origem
   ele e movido ao final da rotina para o servico de destino*/
	IF(V_NRDETALHESERVPROPCOM IS NOT NULL) THEN
		COPIA_DETALHESERVPROPCOM(V_NRDETALHESERVPROPCOM, 'S', P_CDOPERADOR, P_NRORG, V_NRDETALHESERVPROPCOMNOVO);
	END IF;
   
   --Insere a copia do servico na nova versao
   V_NRSERVICOPROPCOM := TO_NUMBER(RETORNA_NOVO_CODIGO('SERVICOPROPCOM', 1));

   INSERT INTO SERVICOPROPCOM
   (
      NRSERVICOPROPCOM, NRVERSAOPROPCOM,
      NRSERVICOPROPOSTA, NRPADRAOQUALIDADE, NRTIPOPUBLICO,      
      IDSERVICOPROPCOM,
      NRDETALHESERVPROPCOM, NRSERVICOPROPCOMCOMPL,
      QTSEGSEX, QTSABADO, QTDOMFERI, 
      QTTOTDIAS, QTTURNOS, QTTOTREFEICOES,
      NRCARDAPIOBASE,
      NRORG, NRORGINCLUSAO, NRORGULTATU,
      DTINCLUSAO, DTULTATU,
      CDOPERINCLUSAO, CDOPERULTATU
   )
   SELECT V_NRSERVICOPROPCOM, P_NRNOVAVERSAOPROPCOM,
          S.NRSERVICOPROPOSTA, S.NRPADRAOQUALIDADE, S.NRTIPOPUBLICO,           
          CASE WHEN V_NRCARDAPIOTRAB IS NULL THEN 'PENDENTE' ELSE 'CALCULADO' END,
          V_NRDETALHESERVPROPCOMNOVO, V_NRSERVICOPROPCOMCOMPLNOVO,
          S.QTSEGSEX, S.QTSABADO, S.QTDOMFERI, 
      	 S.QTTOTDIAS, S.QTTURNOS, S.QTTOTREFEICOES,
      	 S.NRCARDAPIOBASE,
      	 P_NRORG, P_NRORG, P_NRORG,
      	 SYSDATE, SYSDATE,
      	 P_CDOPERADOR, P_CDOPERADOR
     FROM SERVICOPROPCOM S
    WHERE S.NRSERVICOPROPCOM = P_NRSERVICOPROPCOM;

   -- Aponta o detalhe gerado para o servico duplicado.
   UPDATE DETALHESERVPROPCOM
      SET NRSERVICOPROPCOM = V_NRSERVICOPROPCOM
    WHERE NRDETALHESERVPROPCOM = V_NRDETALHESERVPROPCOMNOVO;
END;
/