SET DEFINE OFF;


UPDATE SICFOPS SET cfopSt = 1949, cfopDevolucaoRetorno = 1949, cfopEntrada = 1949, cfopEntradaIndustrializacao = 1949, cfopEntradaUsoConsumo = 1949 WHERE cfop = 5929;
UPDATE SICFOPS SET cfopSt = 2949, cfopDevolucaoRetorno = 2949, cfopEntrada = 2949, cfopEntradaIndustrializacao = 2949, cfopEntradaUsoConsumo = 2949 WHERE cfop = 6929;

COMMIT;

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_PREV_GRAVA (
    p_estabelecimentoAtivo         IN NUMBER,
    p_idAtividadePrevOrcamento     IN NUMBER,
    p_idItemOrcamento              IN NUMBER,
    p_sequencia                    IN NUMBER,
    p_atividadeServico             IN NUMBER,
    p_descricao                    IN VARCHAR2,
    p_tecnico                      IN NUMBER,
    p_statusAtividadeServico       IN CHAR,
    p_dataInicio                   IN DATE,
    p_dataTermino                  IN DATE,
    p_quantidade                   IN NUMBER,
    p_observacoes                  IN VARCHAR2,
    p_gravarAtividadeRealizada     IN NUMBER,
    p_idAtividadeRealOrcamento     IN NUMBER,
    p_atReal_dataInicio            IN DATE,
    p_atReal_dataTermino           IN DATE,
    p_atReal_quantidade            IN NUMBER,
    /* Retornos */
    r_idAtividadePrevOrcamento     OUT NUMBER,
    r_idAtividadeRealOrcamento     OUT NUMBER)    
IS
BEGIN
  r_idAtividadePrevOrcamento := p_idAtividadePrevOrcamento;
  IF (r_idAtividadePrevOrcamento = 0) THEN
    r_idAtividadePrevOrcamento := FUNC_BUSCA_PROXIMO_ID ('MOORCAMENTOXATIVIDADEPREV', p_estabelecimentoAtivo, NULL);
  END IF;
  r_idAtividadeRealOrcamento := p_idAtividadeRealOrcamento;
  MERGE INTO MOORCAMENTOXATIVIDADEPREV a USING (
    SELECT
      r_idAtividadePrevOrcamento     idAtividadePrevOrcamento,
      p_idItemOrcamento              idItemOrcamento,
      p_sequencia                    sequencia,
      p_atividadeServico             atividadeServico,
      p_descricao                    descricao,
      p_tecnico                      tecnico,
      p_statusAtividadeServico       statusAtividadeServico,
      p_dataInicio                   dataInicio,
      p_dataTermino                  dataTermino,
      p_quantidade                   quantidade,
      p_observacoes                  observacoes
    FROM DUAL
  ) b ON (a.idAtividadePrevOrcamento = b.idAtividadePrevOrcamento)
  WHEN MATCHED THEN UPDATE SET
    a.idItemOrcamento               = b.idItemOrcamento,
    a.sequencia                     = b.sequencia,
    a.atividadeServico              = b.atividadeServico,
    a.descricao                     = b.descricao,
    a.tecnico                       = b.tecnico,
    a.statusAtividadeServico        = b.statusAtividadeServico,
    a.dataInicio                    = b.dataInicio,
    a.dataTermino                   = b.dataTermino,
    a.quantidade                    = b.quantidade,
    a.observacoes                   = b.observacoes
  WHEN NOT MATCHED THEN INSERT (
    idAtividadePrevOrcamento,
    idItemOrcamento,
    sequencia,
    atividadeServico,
    descricao,
    tecnico,
    statusAtividadeServico,
    dataInicio,
    dataTermino,
    quantidade,
    observacoes)
  VALUES (
    b.idAtividadePrevOrcamento,
    b.idItemOrcamento,
    b.sequencia,
    b.atividadeServico,
    b.descricao,
    b.tecnico,
    b.statusAtividadeServico,
    b.dataInicio,
    b.dataTermino,
    b.quantidade,
    b.observacoes);
  IF p_gravarAtividadeRealizada = 1 THEN
    ADD_ORCAMENTO_ITEM_REAL_GRAVA (
      p_estabelecimentoAtivo,
      p_idAtividadeRealOrcamento,
      r_idAtividadePrevOrcamento,
      1,
      p_atividadeServico,
      p_descricao,
      p_tecnico,
      p_statusAtividadeServico,
      p_atReal_dataInicio,
      p_atReal_dataTermino,
      p_atReal_quantidade,
      p_observacoes,
      /* Retornos */
      r_idAtividadeRealOrcamento);
  END IF;
  IF NOT(p_statusAtividadeServico IN ('A','I','P')) THEN
    UPDATE MOORCAMENTOXATIVIDADEPREV prev
    SET prev.tecnico = CASE WHEN prev.tecnico = 0 THEN p_tecnico ELSE prev.tecnico END,
      prev.statusAtividadeServico = 'P',
      prev.dataInicio = CASE WHEN prev.dataInicio IS NULL THEN SYSDATE ELSE prev.dataInicio END,
      prev.dataTermino = CASE WHEN prev.dataTermino IS NULL THEN SYSDATE ELSE prev.dataTermino END
    WHERE prev.idItemOrcamento = p_idItemOrcamento
    AND prev.statusAtividadeServico = 'A'
    AND prev.sequencia =
      ( SELECT MIN (prev2.sequencia)
        FROM MOORCAMENTOXATIVIDADEPREV prev2
        WHERE prev2.idItemOrcamento = prev.idItemOrcamento
        AND prev2.statusAtividadeServico IN ('A','I','P'));
  END IF;
  UPDATE MOORCAMENTOXITENS a
  SET a.statusAtividadeServico =
    CASE
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEPREV prev
        WHERE prev.idItemOrcamento = a.idItemOrcamento
        AND prev.statusAtividadeServico = 'I')
      THEN 'I'
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEPREV prev
        WHERE prev.idItemOrcamento = a.idItemOrcamento
        AND prev.statusAtividadeServico = 'P')
      THEN 'P'
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEPREV prev
        WHERE prev.idItemOrcamento = a.idItemOrcamento
        AND prev.statusAtividadeServico = 'A')
      THEN 'A'
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEPREV prev
        WHERE prev.idItemOrcamento = a.idItemOrcamento
        AND prev.statusAtividadeServico = 'C')
      THEN 'C'
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEPREV prev
        WHERE prev.idItemOrcamento = a.idItemOrcamento
        AND prev.statusAtividadeServico = 'E')
      THEN 'E'
      ELSE 'A'
    END
  WHERE a.idItemOrcamento = p_idItemOrcamento
  AND a.statusAtividadeServico <>
    CASE
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEPREV prev
        WHERE prev.idItemOrcamento = a.idItemOrcamento
        AND prev.statusAtividadeServico = 'I')
      THEN 'I'
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEPREV prev
        WHERE prev.idItemOrcamento = a.idItemOrcamento
        AND prev.statusAtividadeServico = 'P')
      THEN 'P'
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEPREV prev
        WHERE prev.idItemOrcamento = a.idItemOrcamento
        AND prev.statusAtividadeServico = 'A')
      THEN 'A'
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEPREV prev
        WHERE prev.idItemOrcamento = a.idItemOrcamento
        AND prev.statusAtividadeServico = 'C')
      THEN 'C'
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEPREV prev
        WHERE prev.idItemOrcamento = a.idItemOrcamento
        AND prev.statusAtividadeServico = 'E')
      THEN 'E'
      ELSE 'A'
    END;
END ADD_ORCAMENTO_ITEM_PREV_GRAVA;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_PREV_INSERE (
    p_usuarioLogado           IN NUMBER,
    p_estabelecimentoAtivo    IN NUMBER,
    p_idItemOrcamento         IN NUMBER,
    p_atividadeServicoOs      IN NUMBER,
    p_ativServ_validoPrevisto IN NUMBER)    
IS
    v_sequenciaAtividade      NUMBER;
    v_auxTecnico              NUMBER;
    v_auxNumber               NUMBER;  
    CURSOR c_ativOsXPrev IS
      SELECT *
      FROM PAATIVIDADEOSXPREVISTA
      WHERE atividadeServicoOs = p_atividadeServicoOs
      AND ativo = 1
      AND sugestao = 1
      ORDER BY
        atividadeServicoOs,
        ordenacao,
        id;
BEGIN
  SELECT COALESCE (MAX (tecnico),0)
  INTO v_auxTecnico
  FROM CATECNICOS
  WHERE tecnico = p_usuarioLogado
  AND ativo = 1;
  v_sequenciaAtividade := 0;
  FOR ativOsXPrev IN c_ativOsXPrev
  LOOP
    v_sequenciaAtividade := v_sequenciaAtividade + 1;  
    ADD_ORCAMENTO_ITEM_PREV_GRAVA (
      p_estabelecimentoAtivo,
      0,
      p_idItemOrcamento,
      v_sequenciaAtividade,
      ativOsXPrev.atividadeServicoPrevista,
      ' ',
      CASE WHEN v_sequenciaAtividade = 1 AND ativOsXPrev.tecnico = 0 THEN v_auxTecnico ELSE ativOsXPrev.tecnico END,
      CASE WHEN v_sequenciaAtividade = 1 THEN CASE WHEN CASE WHEN ativOsXPrev.tecnico = 0 THEN v_auxTecnico ELSE ativOsXPrev.tecnico END = p_usuarioLogado THEN 'I' ELSE 'P' END ELSE 'A' END,
      CASE WHEN v_sequenciaAtividade = 1 THEN SYSDATE ELSE NULL END,
      CASE WHEN v_sequenciaAtividade = 1 THEN SYSDATE ELSE NULL END,
      0,
      ativOsXPrev.observacoes,
      CASE WHEN v_sequenciaAtividade = 1 AND CASE WHEN ativOsXPrev.tecnico = 0 THEN v_auxTecnico ELSE ativOsXPrev.tecnico END = p_usuarioLogado THEN 1 ELSE 0 END,
      0,
      CASE WHEN v_sequenciaAtividade = 1 AND CASE WHEN ativOsXPrev.tecnico = 0 THEN v_auxTecnico ELSE ativOsXPrev.tecnico END = p_usuarioLogado THEN SYSDATE ELSE NULL END,
      NULL,
      0,
      /* Retornos */
      v_auxNumber,
      v_auxNumber);
  END LOOP;
  IF v_sequenciaAtividade = 0 AND p_ativServ_validoPrevisto = 1 THEN
    ADD_ORCAMENTO_ITEM_PREV_GRAVA (
      p_estabelecimentoAtivo,
      0,
      p_idItemOrcamento,
      1,
      p_atividadeServicoOs,
      ' ',
      v_auxTecnico,
      'P',
      SYSDATE,
      SYSDATE,
      0,
      ' ',
      0,
      0,
      NULL,
      NULL,
      0,
      /* Retornos */
      v_auxNumber,
      v_auxNumber);
  END IF;
END ADD_ORCAMENTO_ITEM_PREV_INSERE;

/

UPDATE MOORCAMENTOXITENS a
SET a.statusAtividadeServico =
  CASE
    WHEN EXISTS (
      SELECT 1
      FROM MOORCAMENTOXATIVIDADEPREV prev
      WHERE prev.idItemOrcamento = a.idItemOrcamento
      AND prev.statusAtividadeServico = 'I')
    THEN 'I'
    WHEN EXISTS (
      SELECT 1
      FROM MOORCAMENTOXATIVIDADEPREV prev
      WHERE prev.idItemOrcamento = a.idItemOrcamento
      AND prev.statusAtividadeServico = 'P')
    THEN 'P'
    WHEN EXISTS (
      SELECT 1
      FROM MOORCAMENTOXATIVIDADEPREV prev
      WHERE prev.idItemOrcamento = a.idItemOrcamento
      AND prev.statusAtividadeServico = 'A')
    THEN 'A'
    WHEN EXISTS (
      SELECT 1
      FROM MOORCAMENTOXATIVIDADEPREV prev
      WHERE prev.idItemOrcamento = a.idItemOrcamento
      AND prev.statusAtividadeServico = 'C')
    THEN 'C'
    WHEN EXISTS (
      SELECT 1
      FROM MOORCAMENTOXATIVIDADEPREV prev
      WHERE prev.idItemOrcamento = a.idItemOrcamento
      AND prev.statusAtividadeServico = 'E')
    THEN 'E'
    ELSE 'A'
  END
WHERE a.idItemOrcamento > 0
AND EXISTS (
  SELECT 1
  FROM MOORCAMENTOS orc
  WHERE orc.orcamento = a.orcamento
  AND orc.tipoDocumento = 102)
AND a.statusAtividadeServico <>
  CASE
    WHEN EXISTS (
      SELECT 1
      FROM MOORCAMENTOXATIVIDADEPREV prev
      WHERE prev.idItemOrcamento = a.idItemOrcamento
      AND prev.statusAtividadeServico = 'I')
    THEN 'I'
    WHEN EXISTS (
      SELECT 1
      FROM MOORCAMENTOXATIVIDADEPREV prev
      WHERE prev.idItemOrcamento = a.idItemOrcamento
      AND prev.statusAtividadeServico = 'P')
    THEN 'P'
    WHEN EXISTS (
      SELECT 1
      FROM MOORCAMENTOXATIVIDADEPREV prev
      WHERE prev.idItemOrcamento = a.idItemOrcamento
      AND prev.statusAtividadeServico = 'A')
    THEN 'A'
    WHEN EXISTS (
      SELECT 1
      FROM MOORCAMENTOXATIVIDADEPREV prev
      WHERE prev.idItemOrcamento = a.idItemOrcamento
      AND prev.statusAtividadeServico = 'C')
    THEN 'C'
    WHEN EXISTS (
      SELECT 1
      FROM MOORCAMENTOXATIVIDADEPREV prev
      WHERE prev.idItemOrcamento = a.idItemOrcamento
      AND prev.statusAtividadeServico = 'E')
    THEN 'E'
    ELSE 'A'
  END;

INSERT INTO SIVERSOESSISTEMA (idVersaoSistema, versaoAplicativo, dataLiberacaoVersao, possuiConversaoTabelas, atualizada, dataAtualizacaoVersao, observacoes) VALUES (2022002025, '2022.2.25', sysdate, 1, 1, sysdate, ' ');

COMMIT;

--exec dbms_utility.compile_schema('ADDERI');
--exec dbms_stats.gather_schema_stats('ADDERI');

/*
*/