/**
 * Solicita a mudança de situação de um serviço, sinalizando no histórico a alteração
 * Consiste os detalhes da solicitação e emite erro caso encontre
 * @param {Number} P_NRSERVICOPROPCOM Número do serviço da proposta
 * @param {Varchar2} P_IDORIGEM Origem da solicitação, aceita os valores ('GN', 'PLANEJAMENTO')
 * @param {Varchar2} P_IDDESTINO Destino da solicitação, aceita os valores ('GN', 'PLANEJAMENTO')
 * @param {Varchar2} P_IDMOTIVO Motivo da solicitação, aceita os valores
 * SEMCARDBASE, ERROCALCULO, EDITAL, CUSTOMIZACAO, DUVIDA, DUVIDARESPONDIDA, RECUSADO,
   SERVICOCOMPLEMENTAR, FINALIZADO, APROVADO
 * @param {Varchar2} P_DSOBSERVACAO Observação/ Justificativa/ Dúvida da solicitação
 * @param {Clob} P_TXHISTORICO Campo que contém as informações do escopo no momento da solicitação 
 * @param {Varchar2} P_CDOPERADOR Código do operador logado
 * @param {Number} P_NRORG Número da organização logada
 * revisada
 */
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);   

   -- Função 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
      -- Operação bloqueada. Serviço da proposta ainda não configurado pelo gerente de negócio
      MSGERRO(MSG('TCOPROC_SERVPROPCOMERCIAL_N_TRAB_GN'));
   END IF;

   IF P_IDORIGEM = P_IDDESTINO THEN
      -- Operação bloqueada. Origem da solicitação é igual ao destino da solicitação
      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         
         -- Operação bloqueada. Não é possível gerar solicitação com o motivo informado pelo planejamento.
         MSGERRO(MSG('TCOPROC_SOLICITACAO_INCORRETA_PLANEJAMENTO'));
      END IF;
      IF V_IDSERVICOPROPCOM = 'AGUARDANDOPLANEJAMENTO' THEN
         -- Operação bloqueada. Serviço da proposta já está 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
         -- Operação bloqueada. Não é possível gerar solicitação com o motivo informado pelo gerente de negócio.
         MSGERRO(MSG('TCOPROC_SOLICITACAO_INCORRETA_GN'));
      END IF;
      IF V_IDSERVICOPROPCOM <> 'AGUARDANDOPLANEJAMENTO' THEN
         -- Operação bloqueada. Serviço da proposta não está 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
         -- Operação bloqueada. Não é possível gerar solicitação 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
      -- Operação bloqueada. Não é possível gerar solicitação com o motivo informado pelo planejamento.
      MSGERRO(MSG('TCOPROC_SERVPROPOSTA_SITUACAO_N_DEFINIDA'));
   END IF;

   -- Cópia do detalhe de serviço 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;
   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 histórico de notificação do serviço 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;
/

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