CREATE OR REPLACE PROCEDURE SOL_ALT_SERVPROPCOM
(
P_NRSERVICOPROPCOM IN NUMBER,
P_IDORIGEM IN VARCHAR2,
P_IDDESTINO IN VARCHAR2,
P_IDMOTIVO IN VARCHAR2,
P_DSOBSERVACAO IN VARCHAR2,
P_TXHISTORICO IN CLOB,
P_CDOPERADOR IN VARCHAR2,
P_NRORG IN NUMBER
)
AS
   V_QTDE NUMBER;
   V_NRHISTNOTIFPROPCOM NUMBER;
   V_NRDETALHESERVPROPCOM NUMBER;
   V_NRDETALHESERVPROPCOMNOVO NUMBER;
   V_NRCARDAPIOTRAB NUMBER;
   V_NRDETSERVPROPCOMPLAN NUMBER;
   V_NRDETSERVPROPCOMPLANNOVO NUMBER;
   V_NRCARDAPIOTRABPLAN NUMBER;
   V_IDSERVICOPROPCOM VARCHAR2(30);
   V_IDSERVICOPROPCOMNOVO VARCHAR2(30);   

   -- Funcao auxiliar para agilizar 
   PROCEDURE MSGERRO(MSG IN VARCHAR2)
   AS
   BEGIN
      RAISE_APPLICATION_ERROR(-20000, MSG);
   END;

BEGIN
   SELECT COUNT(1), MAX(S.NRDETALHESERVPROPCOM), MAX(D.NRCARDAPIOTRAB), MAX(S.IDSERVICOPROPCOM),
          MAX(S.NRDETSERVPROPCOMPLAN), MAX(DP.NRCARDAPIOTRAB)
     INTO V_QTDE, V_NRDETALHESERVPROPCOM, V_NRCARDAPIOTRAB, V_IDSERVICOPROPCOM, 
          V_NRDETSERVPROPCOMPLAN, V_NRCARDAPIOTRABPLAN
     FROM SERVICOPROPCOM S
          LEFT JOIN DETALHESERVPROPCOM D ON D.NRDETALHESERVPROPCOM = S.NRDETALHESERVPROPCOM
          LEFT JOIN DETALHESERVPROPCOM DP ON DP.NRDETALHESERVPROPCOM = S.NRDETSERVPROPCOMPLAN
    WHERE S.NRSERVICOPROPCOM = P_NRSERVICOPROPCOM;   

   IF V_NRDETALHESERVPROPCOM IS NULL THEN
      -- Operacao bloqueada. Servico da proposta ainda nao configurado pelo gerente de negocio
      MSGERRO(MSG('TCOPROC_SERVPROPCOMERCIAL_N_TRAB_GN'));
   END IF;

   IF P_IDORIGEM = P_IDDESTINO THEN
      -- Operacao bloqueada. Origem da solicitacao e igual ao destino da solicitacao
      MSGERRO(MSG('TCOPROC_ORIGEM_SOL=DESTINO_SOL'));
   END IF;

   IF P_IDMOTIVO = 'SEMCARDBASE' OR 
      P_IDMOTIVO = 'ERROCALCULO' OR      
      P_IDMOTIVO = 'EDITAL' OR 
      P_IDMOTIVO = 'CUSTOMIZACAO' OR
      P_IDMOTIVO = 'DUVIDARESPONDIDA' OR
      P_IDMOTIVO = 'SERVICOCOMPLEMENTAR' THEN
      IF P_IDORIGEM <> 'GN' THEN         
         -- Operacao bloqueada. Nao e possivel gerar solicitacao com o motivo informado pelo planejamento.
         MSGERRO(MSG('TCOPROC_SOLICITACAO_INCORRETA_PLANEJAMENTO'));
      END IF;
      IF V_IDSERVICOPROPCOM = 'AGUARDANDOPLANEJAMENTO' THEN
         -- Operacao bloqueada. Servico da proposta ja esta aguardando planejamento
         MSGERRO(MSG('TCOPROC_SERVPROPOSTA_EM_PLANEJAMENTO'));
      END IF;
      V_IDSERVICOPROPCOMNOVO := 'AGUARDANDOPLANEJAMENTO';
   END IF;

   V_NRDETALHESERVPROPCOMNOVO := V_NRDETALHESERVPROPCOM;   

   IF P_IDMOTIVO = 'DUVIDA' OR
      P_IDMOTIVO = 'RECUSADO' OR
      P_IDMOTIVO = 'FINALIZADO' THEN
      IF P_IDORIGEM <> 'PLANEJAMENTO' THEN
         -- Operacao bloqueada. Nao e possivel gerar solicitacao com o motivo informado pelo gerente de negocio.
         MSGERRO(MSG('TCOPROC_SOLICITACAO_INCORRETA_GN'));
      END IF;
      IF V_IDSERVICOPROPCOM <> 'AGUARDANDOPLANEJAMENTO' THEN
         -- Operacao bloqueada. Servico da proposta nao esta aguardando planejamento
         MSGERRO(MSG('TCOPROC_SERVPROPOSTA_N_ESTA_EM_PLANEJAMENTO'));
      END IF;

      IF P_IDMOTIVO = 'DUVIDA' THEN
         V_IDSERVICOPROPCOMNOVO := 'AGUARDANDOGN';
      ELSIF P_IDMOTIVO = 'RECUSADO' THEN
         V_IDSERVICOPROPCOMNOVO := 'RECUSADO';
      ELSIF P_IDMOTIVO = 'FINALIZADO' THEN         
         V_NRDETALHESERVPROPCOMNOVO := NVL(V_NRDETSERVPROPCOMPLAN, V_NRDETALHESERVPROPCOM);
         V_IDSERVICOPROPCOMNOVO := 'FINALIZADOPLANEJAMENTO';
      END IF;      
   END IF;

   IF P_IDMOTIVO = 'APROVADO' THEN      
      IF P_IDORIGEM <> 'GN' THEN
         -- Operacao bloqueada. Nao e possivel gerar solicitacao com o motivo informado pelo planejamento.
         MSGERRO(MSG('TCOPROC_SOLICITACAO_INCORRETA_PLANEJAMENTO'));
      END IF;

      V_IDSERVICOPROPCOMNOVO := V_IDSERVICOPROPCOM;      
   END IF;
   
   IF V_IDSERVICOPROPCOMNOVO IS NULL THEN
      -- Operacao bloqueada. Nao e possivel gerar solicitacao com o motivo informado pelo planejamento.
      MSGERRO(MSG('TCOPROC_SERVPROPOSTA_SITUACAO_N_DEFINIDA'));
   END IF;

   -- Copia do detalhe de servico caso esteja enviando ao planejamento   
   V_NRDETSERVPROPCOMPLANNOVO := V_NRDETSERVPROPCOMPLAN;
   IF P_IDORIGEM = 'GN' THEN
      IF P_IDMOTIVO IN ('CUSTOMIZACAO', 'EDITAL', 'SERVICOCOMPLEMENTAR', 'ERROCALCULO') THEN
         COPIA_DETALHESERVPROPCOM(V_NRDETALHESERVPROPCOM, 'S', P_CDOPERADOR, P_NRORG, V_NRDETSERVPROPCOMPLANNOVO);
      END IF;      
   END IF;

   IF P_IDMOTIVO IN ('RECUSADO', 'FINALIZADO') THEN
      V_NRDETSERVPROPCOMPLANNOVO := NULL;

      -- Se recusado e existem produtos com custo zero, apaga o cardapio (calculo) do servico da proposta
      IF P_IDMOTIVO = 'RECUSADO' THEN
         IF PROD_CUSTZERO_CARDTRAB(V_NRCARDAPIOTRABPLAN) = 'S' THEN
            UPDATE DETALHESERVPROPCOM
               SET NRCARDAPIOTRAB = NULL,
                   CDOPERULTATU = P_CDOPERADOR,
                   DTULTATU = SYSDATE
             WHERE NRDETALHESERVPROPCOM IN (V_NRDETALHESERVPROPCOMNOVO, V_NRDETSERVPROPCOMPLAN);
         END IF;
      END IF;      
   END IF;

   UPDATE SERVICOPROPCOM
      SET IDSERVICOPROPCOM = V_IDSERVICOPROPCOMNOVO,
          NRDETALHESERVPROPCOM = V_NRDETALHESERVPROPCOMNOVO,
          NRDETSERVPROPCOMPLAN = V_NRDETSERVPROPCOMPLANNOVO,
          NRORGULTATU = P_NRORG,
          CDOPERULTATU = P_CDOPERADOR,
          DTULTATU = SYSDATE
    WHERE NRSERVICOPROPCOM = P_NRSERVICOPROPCOM;

   -- Registro do historico de notificacao do servico da proposta
   V_NRHISTNOTIFPROPCOM := TO_NUMBER(RETORNA_NOVO_CODIGO('HISTNOTIFPROPCOM', 1));   
   INSERT INTO HISTNOTIFPROPCOM
   (NRHISTNOTIFPROPCOM, NRSERVICOPROPCOM,
    IDORIGEM, IDDESTINO, IDMOTIVO,
    DSOBSERVACAO, TXHISTORICO, NRDETALHESERVPROPCOM,
    NRORG, NRORGINCLUSAO, NRORGULTATU,
    CDOPERINCLUSAO, CDOPERULTATU,
    DTINCLUSAO, DTULTATU)
   VALUES
   (V_NRHISTNOTIFPROPCOM, P_NRSERVICOPROPCOM,
    P_IDORIGEM, P_IDDESTINO, P_IDMOTIVO,
    P_DSOBSERVACAO, P_TXHISTORICO, NVL(V_NRDETSERVPROPCOMPLANNOVO, V_NRDETALHESERVPROPCOMNOVO),
    P_NRORG, P_NRORG, P_NRORG,
    P_CDOPERADOR, P_CDOPERADOR,
    SYSDATE, SYSDATE);
END;
/