Páginas filhas
  • ER_LOGWMS01-1621_ME15.5-Convocação_Ativa-Armazenagem_Transferencia

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.
Comentário: Migration of unmigrated content due to installation of a new plugin

 Este documento é material de especificação dos requisitos de inovação, trata-se de conteúdo extremamente técnico.                                                             

  

Informações Gerais

 

Especificação

Produto

Logix

Módulo

WMS

Segmento Executor

Supply Chain

Projeto1

LOGWMS01

IRM1

LOGWMS01-545 - [WMS] - ELLECE - FASE 2 - WMS para Operador Logístico

Requisito1

[WMS] - ME 15.5 - Convocação ativa - Armazenagem e Transferência

Subtarefa1

Gerar Especificação - ME 15.5

País

( x  ) Brasil  (  ) Argentina  (  ) Mexico  (  ) Chile  (  ) Paraguai  (  ) Equador

(  ) USA  (  ) Colombia   (  ) Outro _____________.

Aviso
titleATENÇÃO!

Os requisitos tratados por esta especificação fazem parte de um conjunto de requisitos destinados a atender a funcionalidade de Convocação Ativa.

O desenvolvimento será realizado de forma incremental, sendo assim, cada requisito incrementará a funcionalidade da convocação ativa, que será considerada como completa quando todos os requisitos estiverem concluídos.

Esta especificação trata dos requisito 5 de um total de 13 requisitos. Sendo que as especificações dos requisitos anteriores estão em:

Introdução & Requisito 1 → ER_LOGWMS01-845_ME_15.1-Convocação_Ativa-Grupo_de_Endereços

Requisito 2 → ER_LOGWMS01-942_ME_15.2-Convocação_Ativa-Configuração

Requisito 3 → ER_LOGWMS01-826_ME_15.3-Convocação_Ativa-Gerenciamento

Requisito 4 → ER_LOGWMS01-827_ME_15.4-Convocação_Ativa-Recebimento




Image Added

Objetivo

  1. Objetivos gerais: 
    1. Gerar, atualizar, excluir e finalizar pendência de  de convocação ativa para  para as atividades de armazenagem e transferência de de armazenagem, cancelamento da armazenagem e transferência de endereço.
    2. Permitir que as atividades de armazenagem, cancelamento da armazenegem transferência possam ser executada a partir do programa WMS6743 - Convocação ativa.
    3. Ajustar as rotinas relacionados a execução das atividades de  armazenagem, cancelamento da armazenagem e  e transferência para que possam ser executada executados a partir do programa programa WMS6743 - Convocação ativa.

Definição da Regra de Negócio

Para atingir os objetivos gerais, as implementações abaixo são necessárias:

    1.  


Resumo dos Programas e Funções Criadas e Alteradas

RotinaTipo de OperaçãoRegras de Negócio Objetivo da Alteração
WMSR139AlteraçãoFunção de regra de negócio para geração e atualização de pendencia de convocação ativa → Incluir as funções de geração, atualização
Alterar dicionário de dadosIncluir a coluna processo_moviment INTEGER NULL, nas tabelas wms_conv_ativa e wms_conv_ativa_historico.
WMSR139 - RNL Geração\Exclusão e Atualização de pendência de convocação ativa.Objetivo das alterações a serem realizadas: 
Criar funções para geração
, exclusão e finalização de pendência de
convocaçãoa tiva para os processos de
convocação ativa para as atividades de armazenagem, cancelamento da armazenagem e transferência
de endereço
.
WMS6378AlteraçãoGeração automática de planejamento de armazenagem → Gerar pendência de convocação ativa para atividade de armazenagem.
WMS6177AlteraçãoPlanejamento de armazenagem via desktop Gerar/Excluir pendência de convocação ativa para atividade de armazenagem.
WMS6178AlteraçãoPlanejamento de armazenagem e transferência via coletor  Gerar pendência de convocação ativa para atividade de armazenagem e transferência.
WMS6185AlteraçãoCancelamento do recebimento Gerar/Excluir pendência de convocação ativa paras atividades de armazenagem e cancelamento de armazenagem.
WMS6077AlteraçãoFunção responsável pela execução de um programa para uma determinada atividade  Permitir receber transação da convocação ativa para gerenciar execução de atividades originadas da convocação ativa, e permitir enviar transação da convocação ativa para gerencimento dos respectivos apontamentos na atividade.
WMS6743AlteraçãoGerenciamento da convocação ativa → Permitir convocar usuário para execução das atividades de armazenagem, cancelamento da armazenagem e transferência de endereço.
WMS6180AlteraçãoPrograma responsável pela armazenagem e transferência de endereço de palete → Gerar novas pendências de convocação ativa (drop-point) e não permitir usuário concluir participação na atividade com processsos de movimentos pendentes.
WMSR22AlteraçãoFunção responsável pelo gerenciamento dos apontamentos e situações das atividades e ordens de serviço  Permitir receber transação da convocação ativa com o principal objetivo de finalizar pendências de convocação ativa.
WMS6435aAlteraçãoFunção responsável pelo processamento de alocação/realocação distribuída das atividades de movimentação interna  Atualizar as pendências de convocação ativa com base no processamento realizado.
WMS6435bAlteraçãoFunção responsável pelo processamento de desalocação das atividades de movimentação interna  Excluir as pendências de convocação ativa com base no processamento realizado.
WMS6435cAlteraçãoFunção responsável pelo processamento de alocação/realocação direta das atividades de movimentação interna  Atualizar as pendências de convocação ativa com base no processamento realizado.
WMS663108aAlteraçãoFunção responsável pelo processamento de alocação/realocação distribuída das atividades de movimentação interna  Atualizar as pendências de convocação ativa com base no processamento realizado.
WMS663108bAlteraçãoFunção responsável pelo processamento de desalocação das atividades de movimentação interna  Excluir as pendências de convocação ativa com base no processamento realizado.
WMS663108cAlteraçãoFunção responsável pelo processamento de alocação/realocação distribuída das atividades de movimentação interna  Atualizar as pendências de convocação ativa com base no processamento realizado.

Definição da Regra de Negócio

Para atingir os objetivos gerais, as implementações abaixo são necessárias. Esta sugestão de implementação tem o objetivo de sugerir um caminho a ser seguido sendo que ajustes podem ser necessários para que os objetivos mencionados acima possam ser 100% atendidos. Este item (e) será considerado concluído se os objetivos acima mencionados forem alcançados.

    1. WMSR139 - RNL Geração/Exclusão e Atualização de pendência de convocação ativa.
      1. Objetivo das alterações a serem realizadas: 
        1. Criar funções para: 
          1. Geração de pendência de convocação ativa de cancelamento de armazenagem por CESV.
            1. Uma pendência de convocação para cada Ordem de Serviço/Atividade relacionada ao CESV. O objetivo é que seja chamada ao final do cancelamento, quando as tabelas wms_os_ativ_executor e wms_processo_moviment já existirem  para os parâmetros do cancelamento realizado. Desta forma não se faz necessário filtros adicionais como por depositante por exemplo. 
              1. NOTA: A tabela wms_os_ativ_executor pode até não existir, porém caso exista serão assumidos os executores, um registro de pendência de convocação ativa para cada, e um registro de pendência de convocação ativa sem executor para os processos de movimento sem executor.
          2. Geração de pendência de convocação ativa de armazenagem ou transferência com base em Ordem de Serviço/Atividade.
            1. Uma pendência de convocação ativa para a Ordem de Serviço/Atividade. O objetivo é que seja chamada após a existência das tabelas wms_os_ativ_executor ou wms_processo_moviment. 
              1. NOTA: A tabela wms_os_ativ_executor pode até não existir, porém caso exista serão assumidos os executores, um registro de pendência de convocação ativa para cada, e um registro de pendência de convocação ativa sem executor para os processos de movimento sem executor.
          3. Exclusão de pendência de convocação ativa de armazenagem ou transferência com base em Ordem de Serviço/Atividade.
            1. Excluir todas ass pendências de convocação ativa para a ordem de serviço/atividade.
          4. Ajuste de pendência de convocação ativa de armazenagem, cancelamento da armazenagem ou transferência com base em Ordem de Serviço/Atividade.
            1. Excluir os registros de pendência de convocação ativa que possuam usuário executor onde este usuário executor não possua mais processos de movimento em aberto para a ordem de serviço/atividade.
            2. Excluir os registros de pendência de convocação ativa que não possuam usuário executor e também não existam mais processos de movimento em aberto e sem usuário executor para a ordem de serviço/atividade.
            3. Incluir novo registro de pendência de convocação ativa por ordem de serviço/atividade e usuário executor quando existir algum processo de movimento em aberto com usuário executor para a ordem de serviço/atividade e que ainda não possua pendência de convocação ativa.
            4. Incluir novo registro de pendência de convocação ativa por ordem de serviço/atividade sem executor quando existir algum processo de movimento em aberto sem usuário executor para a ordem de serviço/atividade e que ainda não possua pendência de convocação ativa.
          5. Finalização de pendência de convocação ativa com base em Ordem de Serviço/Atividade.
            1. Incluir novo registro no histórico da convocação ativa.
            2. Excluir registro das pendências de convocação ativa.
            3. Realizar ajuste nos registros de pendência de convocação atica (item d) com base na ordem de serviço/atividade.

      2. Sugestão de implementação: 
        1. Criar uma nova função
      Sugestão de implementação para atender os objetivos mencionados acima.  Esta sugestão de implementação tem o objetivo de sugerir um caminho a ser seguido sendo que ajustes podem ser necessários para que os objetivos mencionados acima possam ser 100% atendidos. Este item (e) será considerado concluído se os objetivos acima mencionados forem alcançados.
    2. Criar função wmsr139_gera_pendencia_conv_ativa_transf_armzEsta função deverá receber como parâmetro empresa(l_empresa), processo de movimento(l_processo_moviment), e modo de exibição de mensagem(l_modo_exibicao_msg). Com base no código do processo de movimento recebido por parâmetro a função deverá gerar um novo registro na wms_conv_ativa. Utilizar consulta SQL nas tabelas wms_processo_moviment, wms_ordem_servico, wms_clas_operacao, wms_ordem_servico_ativ, wms_ativ, wms_tip_processo para obter todas as informações necessárias para inclusão de um novo registro na wms_conv_ativa. Retornar status do processamento(l_status) e o código da transação criada na wms_conv_ativa (l_trans_conv_ativa). Em caso de erro, retornar 0 para o código da transação.
      1. Expandir
        titleNOTA: Origem das informações para gravação na wms_conv_ativ:
        1. wms_conv_ativ.empresa = p_cod_empresa;
        2. wms_conv_ativ.trans_conv_ativa = Gerado automaticamente. Apenas pegar retorno;
        3. wms_conv_ativ.ctr_ent_sai_veic_docum= wms_ordem_servico.ctr_ent_sai_veic_docum;
        4. wms_conv_ativ.ordem_servico= wms_processo_moviment.ordem_servico;
        5. wms_conv_ativ.aitv= wms_processo_moviment.ativ;
        6. wms_conv_ativ.tip_classe_operacao = wms_clas_operacao.tip_clas_operacao;
        7. wms_conv_ativ.conv_ativa_operacao = wms_tip_processo.conv_ativa_operacao;
        8. wms_conv_ativ.tip_processo = wms_tip_processo.tip_processo;
        9. wms_conv_ativ.dat_hor_inclusao = Data e hora da execução da operação;
        10. wms_conv_ativ.usuario_alocacao = SE wms_processo_moviment.usuario_executor IS NOT NULL ENTÃO wms_processo_moviment.usuario_inclusao SENÃO NULL;
        11. wms_conv_ativ.dat_hor_alocacao_executor = wms_processo_moviment.data_atribuicao_executor;
        12. wms_conv_ativ.usuario_executor = wms_processo_moviment.usuario_executor;
        13. wms_conv_ativ.deposit = wms_ordem_servico.deposit;
        14. wms_.conv_ativa.endereco_origem = wms_processo_moviment.endereco_origem;
        15. wms_.conv_ativa.endereco_destino = wms_processo_moviment.endereco_destino.
    3. Criar uma nova função wmsr139_exclui_pendencia_conv_ativa_transf_armz. Esta função deverá receber como parâmetro empresa(l_empresa), processo de movimento(l_processo_moviment), e modo de exibição de mensagem(l_modo_exibicao_msg).Com base no código do processo de movimento recebido por parâmetro a função deverá excluir o(s) registro(s) da wms_conv_ativa para o processo de movimento recebido por parâmetro.
    4. Criar uma nova função wmsr139_finaliza_pendencia_conv_ativa_transf_armz. Esta função deverá receber como parâmetro empresa(l_empresa), processo de movimento(l_processo_moviment), e modo de exibição de mensagem(l_modo_exibicao_msg).Com base no código do processo de movimento recebido por parâmetro a função deverá:
      1. Validar se situação do processo de movimento está FI-Finalziado. Caso não esteja, retornar FALSE e a mensagem "Processo de movimento não está finalizado, pendência de convocação ativa não pode ser finalizada."
      2. Estando o processo de movimento FI-Finalizado, incluir novo registro na wms_conv_ativa_historico com base no registro da wms_conv_ativa. O campo wms_conv_ativa_historico.dat_hor_fim deve ser a data em que o processamento está sendo realizado.
      3. Após inclusão do registro na wms_conv_ativa_historico, o registro deve ser excluído da wms_conv_ativa.
      4. Por fim, a função deverá retornar TRUE quando sucesso e FALSE caso ocorra alguma falha durante o processamento.
      WMS6378 - Planejamento automático da armazenagem.
      1. Objetivo das alterações a serem realizadas: Ao realizar o planejamento da armazenagem e criar cada processo de movimento, gerar um registro de pendência de convocação ativa vinculado com o processo de movimento recém gerado. 
        Sugestão de implementação para atender os objetivos mencionados acima.  Esta sugestão de implementação tem o objetivo de sugerir um caminho a ser seguido sendo que ajustes podem ser necessários para que os objetivos mencionados acima possam ser 100% atendidos. Este item (e) será considerado concluído se os objetivos acima mencionados forem alcançados.
        1. Criar variável modular m_utiliza_conv_ativa para que seja armazenado o valor do parâmetro utiliza_conv_ativa.
        2. Alterar a função wms6378_incluir_processo_moviment para que seja feita leitura do parâmetro utiliza_conv_ativa e seu valor seja armazenado na variável m_utiliza_conv_ativa. Logo no início da função.
        3. Alterar a função wms6378_gera_tabelas_processo_movimentacao para que logo após a inclusão de cada processo de movimento realizado pela função wmsr19_grava_processo_moviment uma nova pendência de convocação ativa seja gerada. Para isso realizar chamada para a função  wmsr139_gera_pendencia_conv_ativa_transfcanc_armz_cesvCondicionar esta alteração a utilização da convocação ativa (m_utiliza_conv_ativa = 'S'
      WMS6177 - Planejamento de armazenagem desktopObjetivo das alterações a serem realizadas: 
    5. Ao realizar o planejamento da armazenagem e criar cada processo de movimento do planejamento da armazenagem, gerar um registro de pendência de convocação ativa vinculado com o processo de movimento recém gerado. Obter atividade, ordem de serviço, e CESV da ordem de serviço e vincular ao registro de convocação ativa. 
    6. Ao cancelar o planejamento da armazenagem e excluir cada processo de movimento do planejamento de armazenagem, excluir o registro de pendência de convocação ativa vinculado.  
      Sugestão de implementação para atender os objetivos mencionados acima.  Esta sugestão de implementação tem o objetivo de sugerir um caminho a ser seguido sendo que ajustes podem ser necessários para que os objetivos mencionados acima possam ser 100% atendidos. Este item (e) será considerado concluído se os objetivos acima mencionados forem alcançados.
    7. Alterar a função wms6177_incluir_processo_moviment para que logo após a inclusão de cada processo de movimento realizado pela função wmsr19_grava_processo_moviment uma nova pendência de convocação ativa seja gerada. Para isso realizar chamada para a função wmsr139_gera_pendencia_conv_ativa_transf_armz.
    8. Alterar a função wms6177_excluir_os_reserva_processo para que logo após a exclusão de cada processo de movimento realizado pela função wmsm151_wms_processo_moviment_exclui apendência de convocação ativa seja excluída. Para isso realizar chamada para a função wmsr139_exclui_pendencia_conv_ativa_transf_armz.
      WMS6178 - Planejamento de Armazenagem / Transferência de endereço coletor de dados.Objetivo das alterações a serem realizadas: Ao realizar o planejamento da armazenagem ou transferência e criar cada processo de movimento, gerar um registro de pendência de convocação ativa vinculado com o processo de movimento recém gerado. 
      Sugestão de implementação para atender os objetivos mencionados acima.  Esta sugestão de implementação tem o objetivo de sugerir um caminho a ser seguido sendo que ajustes podem ser necessários para que os objetivos mencionados acima possam ser 100% atendidos. Este item (e) será considerado concluído se os objetivos acima mencionados forem alcançados.
    9. Criar variável modular m_utiliza_conv_ativa para que seja armazenado o valor do parâmetro utiliza_conv_ativa.
    10. Alterar a função wms6178_before_menu para que seja feita leitura do parâmetro utiliza_conv_ativa e seu valor seja armazenado na variável m_utiliza_conv_ativa. 
    11. Alterar a função wms6178_gera_tabelas_processo_movimentacao para que logo após a inclusão de cada processo de movimento realizado pela função wmsr19_grava_processo_moviment uma nova pendência de convocação ativa seja gerada. Para isso realizar chamada para a função wmsr139_gera_pendencia_conv_ativa_transf_armzCondicionar esta alteração a utilização da convocação ativa (m_utiliza_conv_ativa = 'S'
      WMS6077 - Função de controle para execução de atividades.Objetivo das alterações a serem realizadas: 
      Atualmente para abrir o programa de execução de uma determinada  atividade são recebidos os parâmetros de empresa, ordem de serviço, atividade, usuário, recurso. Para que seja possível convocar o usuário para um determinado processo de movimento, deve também ser  possível passar o código do processo de movimento a ser executado. 
      Sugestão de implementação para atender os objetivos mencionados acima.  Esta sugestão de implementação tem o objetivo de sugerir um caminho a ser seguido sendo que ajustes podem ser necessários para que os objetivos mencionados acima possam ser 100% atendidos. Este item (e) será considerado concluído se os objetivos acima mencionados forem alcançados.
    12. Criar variável modular m_processo_moviment INTEGER que será responsável por armazenar o código do processo de movimento a ser executado pelas rotinas de armazenagem e transferência de endereço.
    13. Criar função wms6077_set_processo_moviment. Esta função deverá receber como parâmetro um código de processo de movimento(l_processo_moviment INTEGER) e armazenar este valor na modular m_processo_moviment.
    14. Alterar a função wms6077_consultar_programa para que ao alimentar a variável l_caminho quando  m_programa <> 'SUP2065', seja passado como último parâmetro o código do processo de movimento (m_processo_moviment).Condicionar esta alteração a utilização da convocação ativa (m_utiliza_conv_ativa = 'S'
      WMS6743 - Convocação ativaObjetivo das alterações a serem realizadas: 
    15. Alterar a busca por atividades a serem executadas considerando:
      1. O novo campo referente ao processo de movimento.
      2. A situação do processo de movimento para identificar se processo está "Em andamento", ou "Pendente" para definição da ordenação para convocação. Sendo:
        1. AT e IT > "Em andamento." .
        2. PE e NI > "Pendente."
        3. Outros status, o processo de movimento não está pronto para execução.
      3. Considerar "usuário_executor" do processo de movimneto para considerar atividade  "Alocado" ou "Não alocado". Sendo:
        1. wms_processo_movimento.usuario_executor IS NOT NULL > "Alocado";
        2. wms_processo_movimento.usuario_executor IS NULL > "Não Alocado";
    16. Ao abrir o programa, adicionar nas funções de ajuste da tabela wms_conv_ativa e wms_conv_ativa_historico a verificação de existencia de algum processo de movimento FI-Finalizado porém com algum registro na wms_conv_ativa. Nesta situação, realizar a finalização das pendências de convocação ativa.
        1. Esta função deverá receber como parâmetro empresa(l_empresa), cesv(l_cesv), e modo de exibição de mensagem(l_modo_exibicao_msg). Com base no código do CESV recebido por parâmetro a função deverá gerar novos registros na wms_conv_ativa, um para cada ordem de serviço/atividade de cancelamento de armazenagem . Utilizar consulta SQL nas tabelas wms_ordem_servico, wms_clas_operacao, wms_ordem_servico_ativ, wms_ativ, wms_tip_processo(conv_ativa_atividade = 9) para obter todas as informações necessárias para inclusão dos novos registros na wms_conv_ativa. Retornar TRUE em caso de sucesso e FALSE em caso de erro. 
          1. Bloco de código
            languagesql
            titleSugestão de implementação
            linenumberstrue
            collapsetrue
            wms_conv_ativ.empresa = p_cod_empresa;
            wms_conv_ativ.trans_conv_ativa = Gerado automaticamente. Apenas pegar retorno;
            wms_conv_ativ.ctr_ent_sai_veic_docum= wms_ordem_servico.ctr_ent_sai_veic_docum;
            wms_conv_ativ.ordem_servico= wms_ordem_servico_ativ.ordem_servico;
            wms_conv_ativ.aitv= wms_ordem_servico_ativ.ativ;
            wms_conv_ativ.tip_classe_operacao = wms_clas_operacao.tip_clas_operacao;
            wms_conv_ativ.conv_ativa_operacao = wms_tip_processo.conv_ativa_atividade;
            wms_conv_ativ.tip_processo = wms_tip_processo.tip_processo;
            wms_conv_ativ.dat_hor_inclusao = Data e hora da execução da operação;
            wms_conv_ativ.usuario_alocacao = NULL
            wms_conv_ativ.dat_hor_alocacao_executor = NULL
            wms_conv_ativ.usuario_executor = NULL
            wms_conv_ativ.deposit = wms_ordem_servico.deposit;
            wms_.conv_ativa.endereco_origem = Caso possua apenas um endereço origem para os processos de movimento da ordem de serviço então preencher com este endereço, senão NULL.
            wms_.conv_ativa.endereco_destino = NULL.
            
            
            --inclui registros da convocacao ativa(wms_conv_ativa) para as situações onde:
            ------ exista usuario executor em atividade pendente e ainda nao exista pendencia de convocação ativa
            ------------ (usuario executor = NULL para processos de movimento sem alocação)
            ------------  (usuario executor <> NULL para processos de movimento com alocação)
              INSERT INTO wms_conv_ativa
                          (empresa,ctr_ent_sai_veic_docum,ordem_servico,ativ,
                          tip_classe_operacao,conv_ativa_atividade,tip_processo,
                          usuario_executor, deposit,
                          endereco_origem)
                   SELECT DISTINCT
                          wms_ordem_servico.empresa, wms_ordem_servico.ctr_ent_sai_veic_docum, wms_ordem_servico.ordem_servico, wms_ativ.ativ,
                          wms_clas_operacao.tip_clas_operacao, wms_tip_processo.conv_ativa_atividade, wms_tip_processo.tip_processo,
                          wms_os_ativ_executor.usuario  AS usuario_executor, wms_ordem_servico.deposit,
                          CASE WHEN (SELECT COUNT(DISTINCT mov.endereco_origem)
                                       FROM wms_processo_moviment mov
                                      WHERE mov.empresa       = p_cod_empresa
                                        AND mov.ordem_servico = l_ordem_servico
                                        AND mov.ativ          = l_atividade
                                        AND mov.sit_processo_moviment NOT IN ('FI','CA')
                                        AND ( ( wms_os_ativ_executor.usuario IS NOT NULL AND mov.usuario_executor = wms_os_ativ_executor.usuario)
                                            OR( wms_os_ativ_executor.usuario IS NULL AND mov.usuario_executor IS NULL)   )) = 1
                               THEN (SELECT DISTINCT mov.endereco_origem
                                       FROM wms_processo_moviment mov
                                      WHERE mov.empresa       = p_cod_empresa
                                        AND mov.ordem_servico = l_ordem_servico
                                        AND mov.ativ          = l_atividade
                                        AND mov.sit_processo_moviment NOT IN ('FI','CA')
                                        AND ( ( wms_os_ativ_executor.usuario IS NOT NULL AND mov.usuario_executor = wms_os_ativ_executor.usuario)
                                            OR( wms_os_ativ_executor.usuario IS NULL AND mov.usuario_executor IS NULL)   ))
                               ELSE NULL
                          END endereco_origem
                     FROM wms_ordem_servico_ativ
               INNER JOIN wms_ordem_servico
                       ON wms_ordem_servico.empresa = wms_ordem_servico_ativ.empresa
                      AND wms_ordem_servico.ordem_servico = wms_ordem_servico_ativ.ordem_servico
               INNER JOIN wms_clas_operacao
                       ON wms_clas_operacao.empresa = wms_ordem_servico.empresa
                      AND wms_clas_operacao.classe_operacao = wms_ordem_servico.classe_operacao
               INNER JOIN wms_ativ
                       ON wms_ativ.empresa = wms_ordem_servico_ativ.empresa
                      AND wms_ativ.ativ = wms_ordem_servico_ativ.ativ
               INNER JOIN wms_tip_processo
                       ON wms_tip_processo.tip_processo = wms_ativ.tip_processo
                 LEFT JOIN wms_os_ativ_executor
                       ON wms_os_ativ_executor.empresa = tt_movimentos.empresa
                      AND wms_os_ativ_executor.ordem_servico = tt_movimentos.ordem_servico
                      AND wms_os_ativ_executor.ativ = tt_movimentos.atividade
                     AND (wms_os_ativ_executor.recurso_adicional = 'N' OR wms_os_ativ_executor.recurso_adicional IS NULL)
                      AND wms_os_ativ_executor.sit_execucao NOT IN (3,5,6,7)  
                    WHERE wms_ordem_servico.empresa                = p_cod_empresa
                      AND wms_ordem_servico.ctr_ent_sai_veic_docum = l_ctr_ent_sai_veic_docum
                      AND wms_tip_processo.conv_ativa_atividade = 9
                      AND wms_ordem_servico_ativ.sit_ativ NOT IN (3,5,6)
                      AND EXISTS (  SELECT DISTINCT 1
                                      FROM wms_processo_moviment mov
                                     WHERE mov.empresa       = p_cod_empresa
                                       AND mov.ordem_servico = l_ordem_servico
                                       AND mov.ativ          = l_atividade
                                       AND mov.sit_processo_moviment NOT IN ('FI','CA')
                                       AND ( ( wms_os_ativ_executor.usuario IS NOT NULL AND mov.usuario_executor = wms_os_ativ_executor.usuario)
                                           OR( wms_os_ativ_executor.usuario IS NULL AND mov.usuario_executor IS NULL) ))
                      AND NOT EXISTS ( SELECT DISTINCT 1
                                         FROM wms_conv_ativa cv
                                        WHERE cv.empresa       = p_cod_empresa
                                          AND cv.ordem_servico = l_ordem_servico
                                          AND cv.ativ          = l_atividade
                                          AND ( ( wms_os_ativ_executor.usuario IS NOT NULL AND cv.usuario_executor = wms_os_ativ_executor.usuario)
                                              OR( wms_os_ativ_executor.usuario IS NULL AND cv.usuario_executor IS NULL) ))
            -- atualiza as colunas que não tiveram valores inseridos NO INSERT anterior. INSERT com SELECT nao aceita variáveis
            -------- somente atualiza campos de alocação se realmente existir uma alocação para o usuário
              UPDATE wms_conv_ativa
                 SET dat_hor_inclusao          = l_data_atual,
                     usuario_alocacao          = CASE WHEN usuario_executor IS NOT NULL THEN p_user ELSE NULL END,
                     dat_hor_alocacao_executor = CASE WHEN usuario_executor IS NOT NULL THEN l_data_atual ELSE NULL END
               WHERE wms_conv_ativa.empresa       = p_cod_empresa
                 AND wms_conv_ativa.ordem_servico = l_ordem_servico
                 AND wms_conv_ativa.ativ          = l_atividade
                 AND dat_hor_inclusao IS NULL AND usuario_alocacao IS NULL AND dat_hor_alocacao_executor IS NULL
            
            
        2. Criar uma nova função wmsr139_gera_pendencia_conv_ativa_transf_armz_osEsta função deverá receber como parâmetro empresa(l_empresa), ordem de serviço(l_ordem_servico), atividade(l_ativ), e modo de exibição de mensagem(l_modo_exibicao_msg). Com base no código da ordem de serviço e atividade recebido por parâmetro a função deverá gerar um novo registro na wms_conv_ativa (caso já não exista)Utilizar consulta SQL nas tabelas wms_ordem_servico, wms_clas_operacao, wms_ordem_servico_ativ, wms_ativ, wms_tip_processo(conv_ativa_atividade IN(8,9,10)) para obter todas as informações necessárias para inclusão de um novo registro na wms_conv_ativa. Retornar status do processamento(l_status) e o código da transação criada na wms_conv_ativa (l_trans_conv_ativa). Em caso de erro, retornar 0 para o código da transação.
          1. Bloco de código
            languagesql
            titleSugestão de implementação
            linenumberstrue
            collapsetrue
             wms_conv_ativ.empresa = p_cod_empresa;wms_conv_ativ.trans_conv_ativa = Gerado automaticamente. Apenas pegar retorno;wms_conv_ativ.ctr_ent_sai_veic_docum= wms_ordem_servico.ctr_ent_sai_veic_docum;wms_conv_ativ.ordem_servico= wms_ordem_servico_ativ.ordem_servico;wms_conv_ativ.aitv= wms_ordem_servico_ativ.ativ;wms_conv_ativ.tip_classe_operacao = wms_clas_operacao.tip_clas_operacao;wms_conv_ativ.conv_ativa_operacao = wms_tip_processo.conv_ativa_operacao;wms_conv_ativ.tip_processo = wms_tip_processo.tip_processo;wms_conv_ativ.dat_hor_inclusao = Data e hora da execução da operação;wms_conv_ativ.usuario_alocacao = NULLwms_conv_ativ.dat_hor_alocacao_executor = NULLwms_conv_ativ.usuario_executor = NULLwms_conv_ativ.deposit = wms_ordem_servico.endereco_origemwms_.conv_ativa.endereco_origem = Caso possua apenas um endereço origem para os processos de movimento da ordem de serviço então preencher com este endereço, senão NULL.wms_.conv_ativa.endereco_destino = NULL
            
            --inclui registros da convocacao ativa(wms_conv_ativa) para as situações onde:
            ------ exista usuario executor em atividade pendente e ainda nao exista pendencia de convocação ativa
            ------------ (usuario executor = NULL para processos de movimento sem alocação)
            ------------  (usuario executor <> NULL para processos de movimento com alocação)
              INSERT INTO wms_conv_ativa
                          (empresa,ctr_ent_sai_veic_docum,ordem_servico,ativ,
                          tip_classe_operacao,conv_ativa_atividade,tip_processo,
                          usuario_executor, deposit,
                          endereco_origem)
                   SELECT DISTINCT
                          wms_ordem_servico.empresa, wms_ordem_servico.ctr_ent_sai_veic_docum, wms_ordem_servico.ordem_servico, wms_ativ.ativ,
                          wms_clas_operacao.tip_clas_operacao, wms_tip_processo.conv_ativa_atividade, wms_tip_processo.tip_processo,
                          wms_os_ativ_executor.usuario  AS usuario_executor, wms_ordem_servico.deposit,
                          CASE WHEN (SELECT COUNT(DISTINCT mov.endereco_origem)
                                       FROM wms_processo_moviment mov
                                      WHERE mov.empresa       = p_cod_empresa
                                        AND mov.ordem_servico = l_ordem_servico
                                        AND mov.ativ          = l_atividade
                                        AND mov.sit_processo_moviment NOT IN ('FI','CA')
                                        AND ( ( wms_os_ativ_executor.usuario IS NOT NULL AND mov.usuario_executor = wms_os_ativ_executor.usuario)
                                            OR( wms_os_ativ_executor.usuario IS NULL AND mov.usuario_executor IS NULL)   )) = 1
                               THEN (SELECT DISTINCT mov.endereco_origem
                                       FROM wms_processo_moviment mov
                                      WHERE mov.empresa       = p_cod_empresa
                                        AND mov.ordem_servico = l_ordem_servico
                                        AND mov.ativ          = l_atividade
                                        AND mov.sit_processo_moviment NOT IN ('FI','CA')
                                        AND ( ( wms_os_ativ_executor.usuario IS NOT NULL AND mov.usuario_executor = wms_os_ativ_executor.usuario)
                                            OR( wms_os_ativ_executor.usuario IS NULL AND mov.usuario_executor IS NULL)   ))
                               ELSE NULL
                          END endereco_origem
                     FROM wms_ordem_servico_ativ
               INNER JOIN wms_ordem_servico
                       ON wms_ordem_servico.empresa = wms_ordem_servico_ativ.empresa
                      AND wms_ordem_servico.ordem_servico = wms_ordem_servico_ativ.ordem_servico
               INNER JOIN wms_clas_operacao
                       ON wms_clas_operacao.empresa = wms_ordem_servico.empresa
                      AND wms_clas_operacao.classe_operacao = wms_ordem_servico.classe_operacao
               INNER JOIN wms_ativ
                       ON wms_ativ.empresa = wms_ordem_servico_ativ.empresa
                      AND wms_ativ.ativ = wms_ordem_servico_ativ.ativ
               INNER JOIN wms_tip_processo
                       ON wms_tip_processo.tip_processo = wms_ativ.tip_processo
                 LEFT JOIN wms_os_ativ_executor
                       ON wms_os_ativ_executor.empresa = tt_movimentos.empresa
                      AND wms_os_ativ_executor.ordem_servico = tt_movimentos.ordem_servico
                      AND wms_os_ativ_executor.ativ = tt_movimentos.atividade
                     AND (wms_os_ativ_executor.recurso_adicional = 'N' OR wms_os_ativ_executor.recurso_adicional IS NULL)
                      AND wms_os_ativ_executor.sit_execucao NOT IN (3,5,6,7)  
                    WHERE wms_ordem_servico_ativ.empresa       = p_cod_empresa
                      AND wms_ordem_servico_ativ.ordem_servico = l_ordem_servico
                      AND wms_ordem_servico_ativ.ativ     = l_atividade
                      AND wms_tip_processo.conv_ativa_atividade IN (8,9,10)
                      AND wms_ordem_servico_ativ.sit_ativ NOT IN (3,5,6)
                      AND EXISTS (  SELECT DISTINCT 1
                                      FROM wms_processo_moviment mov
                                     WHERE mov.empresa       = p_cod_empresa
                                       AND mov.ordem_servico = l_ordem_servico
                                       AND mov.ativ          = l_atividade
                                       AND mov.sit_processo_moviment NOT IN ('FI','CA')
                                       AND ( ( wms_os_ativ_executor.usuario IS NOT NULL AND mov.usuario_executor = wms_os_ativ_executor.usuario)
                                           OR( wms_os_ativ_executor.usuario IS NULL AND mov.usuario_executor IS NULL) ))
                      AND NOT EXISTS ( SELECT DISTINCT 1
                                         FROM wms_conv_ativa cv
                                        WHERE cv.empresa       = p_cod_empresa
                                          AND cv.ordem_servico = l_ordem_servico
                                          AND cv.ativ          = l_atividade
                                          AND ( ( wms_os_ativ_executor.usuario IS NOT NULL AND cv.usuario_executor = wms_os_ativ_executor.usuario)
                                              OR( wms_os_ativ_executor.usuario IS NULL AND cv.usuario_executor IS NULL) ))
            
            -- atualiza as colunas que não tiveram valores inseridos NO INSERT anterior. INSERT com SELECT nao aceita variáveis
            -------- somente atualiza campos de alocação se realmente existir uma alocação para o usuário
              UPDATE wms_conv_ativa
                 SET dat_hor_inclusao          = l_data_atual,
                     usuario_alocacao          = CASE WHEN usuario_executor IS NOT NULL THEN p_user ELSE NULL END,
                     dat_hor_alocacao_executor = CASE WHEN usuario_executor IS NOT NULL THEN l_data_atual ELSE NULL END
               WHERE wms_conv_ativa.empresa       = p_cod_empresa
                 AND wms_conv_ativa.ordem_servico = l_ordem_servico
                 AND wms_conv_ativa.ativ          = l_atividade
                 AND dat_hor_inclusao IS NULL AND usuario_alocacao IS NULL AND dat_hor_alocacao_executor IS NULL
        3. Criar uma nova função wmsr139_exclui_pendencia_conv_ativa_transf_armz_os. Esta função deverá receber como parâmetro empresa(l_empresa), ordem de serviço(l_ordem_servico), atividade(l_ativ), e modo de exibição de mensagem(l_modo_exibicao_msg). Com base no código da ordem de serviço e atividade recebido por parâmetro a função deverá excluir o(s) registro(s) da wms_conv_ativ. Retornar TRUE quando sucesso e FALSE caso ocorra alguma falha durante o processamento.

        4. Criar uma nova função wmsr139_ajusta_pendencia_conv_ativa_movtos_os_ativ.  Esta função deverá receber como parâmetro empresa(l_empresa), ordem de serviço(l_ordem_servico), atividade(l_ativ), e modo de exibição de mensagem(l_modo_exibicao_msg).Com base no código da ordem de serviço e atividade recebido por parâmetro a função deverá:
          1. Excluir os registros de pendência de convocação ativa (wms_conv_ativa) que possuam usuário executor onde este usuário executor não possua mais processos de movimento para a ordem de serviço/atividade.
          2. Excluir os registros de pendência de convocação ativa (wms_conv_ativa) que não possuam usuário executor e também não existam mais processos de movimento para a ordem de serviço/atividade.
          3. Incluir novo registro de pendência de convocação ativa (wms_conv_ativa)  por ordem de serviço/atividade e usuário executor quando existir algum processo de movimento com usuário executor para a ordem de serviço/atividade e que ainda não possua pendência de convocação ativa.
          4. Incluir novo registro de pendência de convocação ativa (wms_conv_ativa)  por ordem de serviço/atividade sem executor quando existir algum processo de movimento sem usuário executor para a ordem de serviço/atividade e que ainda não possua pendência de convocação ativa.
          5. Bloco de código
            languagesql
            titleSegue sugestão de comandos SQL contendo todos os passos acima mencionados
            linenumberstrue
            collapsetrue
            --exclui registros da convocacao ativa(wms_conv_ativa) onde:
            ------ usuario executor da convocação ativa não exista em nenhum processo de movimento das ordens de serviço/atividade processadas
            ------ usuario executor da convocação ativa esteja nulo e não existam processos de movimento das ordens de serviço/atividade processadas pendentes de alocação
              DELETE
                FROM wms_conv_ativa
               WHERE wms_conv_ativa.empresa       = p_cod_empresa
                 AND wms_conv_ativa.ordem_servico = l_ordem_servico
                 AND wms_conv_ativa.atividade     = l_atividade
                 AND wms_conv_ativa.conv_ativa_atividade IN (8,9,10)
                 AND ( (wms_conv_ativa.usuario_executor IS NOT NULL
                        AND NOT EXISTS (SELECT DISTINCT 1
                                          FROM wms_processo_moviment                             
                                         WHERE wms_processo_moviment.empresa          = p_cod_empresa
                                           AND wms_processo_moviment.ordem_servico    = l_ordem_servico
                                           AND wms_processo_moviment.ativ             = l_atividade
                                           AND wms_processo_moviment.usuario_executor = wms_conv_ativa.usuario_executor
                                           AND wms_processo_moviment.sit_processo_moviment NOT IN ('FI','CA')))
                       OR
                       (wms_conv_ativa.usuario_executor IS NULL
                        AND NOT EXISTS (SELECT DISTINCT 1
                                         WHERE wms_processo_moviment.empresa          = p_cod_empresa
                                           AND wms_processo_moviment.ordem_servico    = l_ordem_servico
                                           AND wms_processo_moviment.ativ             = l_atividade
                                           AND wms_processo_moviment.usuario_executor IS NULL
                                           AND wms_processo_moviment.sit_processo_moviment NOT IN ('FI','CA'))))
             
            CALL wmsr139_gera_pendencia_conv_ativa_transf_armz_os(l_empresa, l_ordem_servico, l_atividade, l_modo_exibicao_msg)
             
        5. Criar uma nova função wmsr139_finaliza_pendencia_conv_ativa_transf_armz. Esta função deverá receber como parâmetro empresa(l_empresa), transação da convocação ativa (l_trans_conv_ativa), ordem de serviço(l_ordem_servico), atividade(l_ativ), e modo de exibição de mensagem(l_modo_exibicao_msg). Com base na transação da convocação ativa recebida por parâmetro a função deverá:
          1. Caso a transação da pendência de convocação ativa (l_trans_conv_ativa) não seja nulo, incluir o registro de pendência de convocação ativa no histórico (wms_conv_ativa_historico).

            Bloco de código
            languagesql
            titleSugestão implementação
            linenumberstrue
            collapsetrue
            INSERT INTO wms_conv_ativa_historico (
                             empresa,trans_conv_ativa,ctr_ent_sai_veic_docum,ordem_servico,ativ,tip_classe_operacao,conv_ativa_atividade,tip_processo,
                            dat_hor_inclusao,usuario_alocacao,dat_hor_alocacao_executor,usuario_executor,deposit,endereco_origem,endereco_destino)
            SELECT empresa,trans_conv_ativa,ctr_ent_sai_veic_docum,ordem_servico,ativ,tip_classe_operacao,conv_ativa_atividade,tip_processo,
                            dat_hor_inclusao,usuario_alocacao,dat_hor_alocacao_executor,usuario_executor,deposit,endereco_origem,endereco_destino
              FROM wms_conv_ativa
              WHERE empresa = l_empresa 
                    AND trans_conv_ativa = l_trans_conv_ativa
             
            UPDATE wms_conv_ativa_historico
                   SET  dat_hor_fim = l_data_hora_atual
              WHERE empresa = l_empresa 
                    AND trans_conv_ativa = l_trans_conv_ativa
            
             
          2. Caso a transação da pendência de convocação ativa (l_trans_conv_ativa) não seja nulo, excluir o registro do controle de pendência de convocação ativa (wms_conv_ativa).

            Bloco de código
            languagesql
            titleSugestão implementação
            linenumberstrue
            collapsetrue
            DELETE 
               FROM wms_conv_ativa 
              WHERE empresa = l_empresa 
                    AND trans_conv_ativa = l_trans_conv_ativa
             
          3. Caso a transação da pendência de convocação ativa (l_trans_conv_ativa) não seja nulo e ordem de serviço(l_ordem_servico) e atividade(l_atividade) sejam nulos, obter ordem de serviço(l_ordem_servico) e atividade(l_atividade) da pendência de convocaçãoa tiva.

            Bloco de código
            languagesql
            titleSugestão implementação
            linenumberstrue
            collapsetrue
            SELECT ordem_servico, atividade
                INTO l_ordem_servico, l_atividade
               FROM wms_conv_ativa 
              WHERE empresa = l_empresa 
                    AND trans_conv_ativa = l_trans_conv_ativa
             
          4. Por fim, independente de ter ou não um código de transação de pendência de convocação ativa(l_trans_conv_ativa), caso a ordem de serviço(l_ordem_servico) e atividade(l_atividade) não sejam nulos, realizar chamada a função wmsr139_ajusta_pendencia_conv_ativa_movtos_os_ativ passando ordem de serviço e atividade.
          5. Retornar TRUE quando sucesso e FALSE caso ocorra algum ERRO durante o processamento. 
          6. Criar transação de banco de dados para englobar todos os passos acima.


    17. WMS6378 - Planejamento automático da armazenagem. (Chamado do WMS6190 - Conferência do recebimento)
      1. Objetivo das alterações a serem realizadas: 
        1. Ao realizar o planejamento da armazenagem, gerar uma pendência de convocação ativa para a ordem de serviço/atividade criada durante o planejamento da armazenagem. 

      2. Sugestão de implementação:
        1. Alterar a função wms6378_incluir_processo_moviment, criar variável l_utiliza_conv_ativa para que seja armazenado o valor do parâmetro utiliza_conv_ativa.
        2. Alterar a função wms6378_incluir_processo_moviment para que seja feita leitura do parâmetro utiliza_conv_ativa e seu valor seja armazenado na variável l_utiliza_conv_ativa. Implementar alteração logo no início da função.
        3. Alterar a função wms6378_incluir_processo_moviment para que logo após a inclusão dos processos de movimento realizados, após liberar o  cursor (cq_incluir_processo_palete) as pendências de convocação ativa sejam geradas. Para isso realizar chamada para a função wmsr139_gera_pendencia_conv_ativa_transf_armz_osCondicionar esta alteração a utilização da convocação ativa (m_utiliza_conv_ativa = 'S'


    18. WMS6177 - Planejamento de armazenagem desktop
      1. Objetivo das alterações a serem realizadas: 
        1. Ao realizar o planejamento da armazenagem, gerar uma pendência de convocação ativa para a ordem de serviço/atividade criada durante o planejamento da armazenagem.
        2. Ao cancelar o planejamento da armazenagem excluir o(s) registro(s) de pendência de convocação ativa vinculado(s) a ordem de serviço/atividade.

      2. Sugestão de implementação:
        1. Criar variável modular m_utiliza_conv_ativa para que seja armazenado o valor do parâmetro utiliza_conv_ativa.
        2. Alterar a função wms6177_after_load para que seja feita leitura do parâmetro utiliza_conv_ativa e seu valor seja armazenado na variável m_utiliza_conv_ativaLogo no início da função.
        3. Alterar a função wms6177_incluir_processo_moviment para que logo após a inclusão dos processos de movimentos realizados no cursor cq_incluir_processo_palete as pendências de convocação ativa sejam geradas. Para isso realizar chamada para a função wmsr139_gera_pendencia_conv_ativa_transf_armz_os. Condicionar esta alteração a utilização da convocação ativa (m_utiliza_conv_ativa = 'S'
        4. Alterar a função wms6177_excluir_os_reserva_processo para que logo após a exclusão dos processos de movimentos e a verificação de que não existem mais processos de movimento relacionados a OS (IF l_contador = 0 THEN), a pendência de convocação ativa seja excluída. Para isso realizar chamada para a função wmsr139_exclui_pendencia_conv_ativa_transf_armz_os (dentro e ao final do bloco condicional F l_contador = 0 THEN)Condicionar esta alteração a utilização da convocação ativa (m_utiliza_conv_ativa = 'S').


    19. WMS6178 - Planejamento de Armazenagem / Transferência de endereço coletor de dados. (Chamado de WMS6281 - Planejamento Armazenagem e WMS6282 - Planejamento Transferência)
      1. Objetivo das alterações a serem realizadas: 
        1. Ao realizar o planejamento da armazenagem ou transferência, gerar uma pendência de convocação ativa para a ordem de serviço/atividade.

      2. Sugestão de implementação:
        1. Criar variável modular m_utiliza_conv_ativa para que seja armazenado o valor do parâmetro utiliza_conv_ativa.
        2. Alterar a função wms6178_before_menu para que seja feita leitura do parâmetro utiliza_conv_ativa e seu valor seja armazenado na variável m_utiliza_conv_ativa
        3. Alterar a função wms6178_gera_tabelas_processo_movimentacao para que logo após a inclusão de cada processo de movimento realizado pela função wmsr19_grava_processo_moviment uma nova pendência de convocação ativa seja gerada. Para isso realizar chamada para a função wmsr139_gera_pendencia_conv_ativa_transf_armz_osCondicionar esta alteração a utilização da convocação ativa (m_utiliza_conv_ativa = 'S'


    20. WMS6077 - Função de controle para execução de atividades. (Chamado de WMS6070 lista pública e WMS6069 lista particular)
      1. Objetivo das alterações a serem realizadas: 
        1. Atualmente para abrir o programa de execução de uma determinada  atividade são recebidos os parâmetros de empresa, ordem de serviço, atividade, usuário, recurso. Para que seja possível identificar que determinada atividade foi chamada da convocação ativa e de qual transação, receber também o código da transação da convocação ativa que originou a chamada ao programa.
        2. Após a finalização de execução do programa de execucação de uma determinada atividade, enviar o código da transação da convocação ativa. 

      2. Sugestão de implementação:
        1. Criar variável modular m_trans_conv_ativa INTEGER que será responsável por armazenar o código da transação da pendência de convocação ativa.
        2. Criar função wms6077_set_trans_conv_ativa. Esta função deverá receber como parâmetro um código de transação (l_trans_conv_ativa INTEGER) e armazenar este valor na modular m_trans_conv_ativa.
        3. Alterar a função wms6077_verifica_retorno. Esta função é executada após encerramento do programa de uma atividade. Antes de efetuar a chamada para a função wmsr22_mantem_os_em_aberto, chamar a função wmsr22_set_trans_conv_ativa (a ser criada neste requisito). 
        4. Para que não fique "lixo" nas novas modulares, ao final da função wms6077_administra_os limpar as variáveis (NULL).


    21. WMS6743 - Convocação ativa
      1. Objetivo das alterações a serem realizadas: 
        1. Adicionar à regra de busca de atividades para convocação ativa, as ordens de serviço/atividades relacionadas a armazenagem, cancelamento da armazenagem e transferência de endereço. 
          1. As execuções de atividades(wms_os_ativ_executor) "em andamento" serão as que tiverem status(sit_execucao) de "2-Em andamento" e "4-Interrompido". E as "pendentes" de execução serão as que tiverem status de 1-Pendente. Lembrando que terão prioridade para execução serão as "em andamento" e em seguida as "pendentes".
        2. Ao realizar alocação da pendência da convocação ativa para um usuário, verificar os processos de movimentos da ordem de serviço/atividade e definir como executor todos os processos de movimentos possíveis de acordo com as configurações de endereço. Para buscar todos os processos de movimentos possíveis, além de considerar o depositante do processo de movimento com os depositantes configurados para o usuário(wms_conv_ativa_config_deposit), considerar também o endereços de origem dos processos de movimentos contemplados pelos grupos de endereços do usuário (wms_conv_ativa_config_grp_end). 
          1. Caso não seja possível alocar todos os processos de movimento da ordem de serviço/atividade, gerar nova pendência de convocação ativa para a ordem de serviço/atividade. Desta forma algum outro usuário poderá ser alocado para execução dos movimentos restantes.
        3. Ao encontrar ordem de serviço/atividade para execução, exibir em tela os campos abaixo.
          1. Quando Armazenagem ou Cancelamento da Armazenagem
            1. Identificador 1 = CESV (pode existir casos da CESV estar em branco).
            2. Identificador 2 = Endereço origem (podendo apresentar a descrição VARIOS)
            3. Identificador 3 = Endereço destino (podendo apresentar a descrição VARIOS)
          2. Qiamdo Transferência
            1. Identificador 1 = Depositante.
            2. Identificador 2 = Endereço origem (podendo apresentar a descrição VARIOS)
            3. Identificador 3 = Endereço destino (podendo apresentar a descrição VARIOS)
          3. NOTA: No item 9 da especificação do requisito 15.3 é possível verificar o protótipo de tela onde estas informações devem ser apresentadas.

      2. Sugestão de implementação:
        1. Não é possível determinar o ponto de alteração pois o programa ainda encontra-se em desenvolvimento. As indicações acabam se limitando ao objetivo final, ficando a cargo do programador definir durante o desenvolvimento junto ao analista o melhor ponto para alteração.


    22. WMS6180 - Armazenagem / Transferência de endereço. (Chamado da lista pública WMS6070 ou particular WMS6069)
      1. Objetivos das alterações a serem realizadas: 
        1. Gerar nova pendência de convocação ativa ao depositar palete em endereço drop-point. Desta forma será possível a convocação do próximo usuário para que seja realizado o movimento do drop-point ao endereço destino planejado.
        2. Gerar nova pendência de convocação ativa ao liberar equipamento e depositar palete em endereço diferente de armazém. Desta forma será possível a convocação do próximo usuário para que seja realizado o movimento do endereço onde o palete foi depositante ao endereço destino planejado.
        3. Não permitir o usuário concluir sua participação na ordem de serviço/atividade de armazenagem/transferência com processos de movimentos alocados para o usuário. Nesta situação o usuário só deverá conseguir interromper a atividade. Com esta alteração será psosível estabelecer a correta prioridade para o usuário. Mantendo sua participação na ordem de serviço em aberto ele continuará sendo convocado até que todos os processos de movimentos planejados sejam encerrados.

      2. Sugestão de implementação:
        1. Criar variável modular m_utiliza_conv_ativa para que seja armazenado o valor do parâmetro utiliza_conv_ativa.
        2. Alterar a função wms6180_movimentacao_armazenamento para que seja feita leitura do parâmetro utiliza_conv_ativa e seu valor seja armazenado na variável m_utiliza_conv_ativa. Esta alteração deverá estar já no início da função.
        3. Criar uma nova função wms6180_possui_processo_moviment_os_pendente_usuario.  Esta função deverá verificar se existem processos de movimento alocados para o usuário(wms_processo_moviment.usuario_execucao=p_user) na ordem de serviço/atividade que ainda não foram executados (wms_processo_moviment.sit_processo_moviment NOT IN('FI','CA'))
        4. Alterar a função wms6180_entrada_etiqueta para que ao acionar a opção F4 (ON KEY (f4, control-k)), já no início do bloco condicional (IF l_processou_palete THEN) seja verificado se existem processos de movimento pendentes para o usuário através da função wms6180_possui_processo_moviment_os_pendente_usuario. Caso existam o usuário deverá ser notificado "Usuário possui outros movimentos pendentes de conclusão" e o cursor deverá voltar ao campo palete (NEXT FIELD m_etiq_mov). Condicionar esta alteração a utilização da convocação ativa (m_utiliza_conv_ativa = 'S').
        5. Alterar a função wms6180_gera_nova_seq_processo_movtcao para que logo após a inclusão do processo de movimento realizado pela função wmsr19_grava_processo_moviment uma nova pendência de convocação ativa seja gerada. Para isso realizar chamada para a função wmsr139_gera_pendencia_conv_ativa_transf_armz_osCondicionar esta alteração a utilização da convocação ativa (m_utiliza_conv_ativa = 'S'). Estas alterações tem o objetivo de gerar uma nova pendênca de convocação ativa para a ordem de serviço gerada quando o palete é armazenado em um endereço drop-point ou quando o equipamento é liberado e o palete é depositado em um endereço de picking.


    23. WMSR22 - Função de controle de execução de ordem de serviço
      1. Objetivo das alterações a serem realizadas: 
        1. Finalizar a pendência de convocação ativa para o usuário ao concluir sua participação na ordem de serviço.
          1. Ao finalizar pendência de convocação ativa, verificar se ainda existem processos de movimentos pendentes na ordem de serviço/atividade e gerar nova pendência para que outro usuário possa ser convocado para execução destes movimentos pendentes.
          2. Realizar ajuste de registros para as pendências de convocação ativa da ordem de serviço/atividade para casos de inconsistência por queda de sinal ou outro motivo.

      1. Sugestão de implementação:
        1. Criar variável modular m_trans_conv_ativa INTEGER que será responsável por armazenar o código da transação da pendência de convocação ativa.
        2. Criar nova função wmsr22_set_trans_conv_ativa. Esta função deverá receber como parâmetro um código de transação (l_trans_conv_ativa INTEGER) e armazenar este valor na modular m_trans_conv_ativa.
        3. Alterar função wmsr22_aponta_tempo_executor_os:
          1. Criar variável local l_utiliza_conv_ativa para que seja armazenado o valor do parâmetro utiliza_conv_ativa.
          2. Já no início da função realizar leitura do parâmetro utiliza_conv_ativa e armazenar em l_utiliza_conv_ativa. 
          3. Alterar para que ao encerrar a participação do usuário na ordem de serviço/atividade seja encerrada também sua pendência de convocação ativa para isso adicionar chamada a função wmsr139_finaliza_pendencia_conv_ativa_transf_armz. Existem dois pontos onde a participação do usuário é encerrada, na estrutura IF e ELSE resultante da busca do código da transação(trans) da participação do usuário(wms_os_ativ_executor). Ao final destas estruturas (IF e ELSE) realizar chamada a função wmsr139_finaliza_pendencia_conv_ativa_transf_armz. Condicionar esta alteração a utilização da convocação ativa (m_utiliza_conv_ativa = 'S') e a situação da participação do usuário(l_situacao) Encerrada (5). (Procurar ponto de alteração no fonte por  "Não existe, então inser uma para o usuário").
          4. Para que não fique "lixo" na nova modular (m_trans_conv_ativa), ao final da função limpar a variável m_trans_conv_ativa  (NULL).


    24. WMS6185 - Cancelamento do recebimento
      1. Objetivo das alterações a serem realizadas: 
        1. Excluir pendência(s) de convocação ativa para a(s) ordem(ns) de serviço/atividade(s) de armazenagem quando o cancelamento é realizado e os processos de movimento de armazenagem ainda se encontram pendentes/não iniciados.
        2. Gerar pendência de convocação ativa para a atividade de cancelamento da armazenagem para o(s) palete(s) já armazenados com destino a doca de recebimento para posterior cancelamento do recebimento.

      2. Sugestão de implementação:
        1. Criar variável modular m_utiliza_conv_ativa para que seja armazenado o valor do parâmetro utiliza_conv_ativa.
        2. Alterar a função wms6185_before_menu para que seja feita leitura do parâmetro utiliza_conv_ativa e seu valor seja armazenado na variável m_utiliza_conv_ativa. Adicionar a leitura do parâmetro logo após a leitura e validação existente para o parâmetro oper_confer_entrada_normal.
        3. Alterar a função wms6185_cancela_processo_armazenagem para que logo após a exclusão dos processos de movimentos e a verificação de que não existem mais processos de movimento relacionados a OS/Atividade (IF l_contador = 0 THEN), a pendência de convocação ativa seja excluída. Para isso realizar chamada para a função wmsr139_exclui_pendencia_conv_ativa_transf_armz_os (dentro e ao final do bloco condicional F l_contador = 0 THEN)Condicionar esta alteração a utilização da convocação ativa (m_utiliza_conv_ativa = 'S').
        4. Alterar a função wms6185_cancela_processo_armazenagem_por_aviso para que logo após a exclusão dos processos de movimentos e a verificação de que não existem mais processos de movimento relacionados a OS/Atividade (IF l_contador = 0 THEN), a pendência de convocação ativa seja excluída. Para isso realizar chamada para a função wmsr139_exclui_pendencia_conv_ativa_transf_armz_os (dentro e ao final do bloco condicional F l_contador = 0 THEN)Condicionar esta alteração a utilização da convocação ativa (m_utiliza_conv_ativa = 'S').
        5. Alterar a função wms6185_gera_movimentacao_palete_doca para que logo após a liberação do cursor cq_incluir_processo_palete (FREE cq_incluir_processo_palete)  seja chamada a função wmsr139_gera_pendencia_conv_ativa_canc_armz_cesv para que as pendências de convocação ativa da(s) ordem(ns) de serviço/atividade de cancelamento da armazenagem sejam geradas. Condicionar esta alteração a utilização da convocação ativa (m_utiliza_conv_ativa = 'S').
        6. Alterar a função wms6185_gera_movimentacao_palete_doca_por_aviso para que logo após a liberação do cursor cq_incluir_processo_palete (FREE cq_incluir_processo_palete)  seja chamada a função wmsr139_gera_pendencia_conv_ativa_canc_armz_cesv para que as pendências de convocação ativa da(s) ordem(ns) de serviço/atividade de cancelamento da armazenagem sejam geradas. Condicionar esta alteração a utilização da convocação ativa (m_utiliza_conv_ativa = 'S').


    25. WMS6430 - Central do planejador 
      1. Objetivo das alterações a serem realizadas: 
        1. Excluir, atualizar o executor e gerar novas pendências de convocação ativa com base nas operações de alocação, desalocação e realocação das atividades de armazenagem, cancelamento da armazenagem e transferência de endereço.

      2. Sugestão de implementação:
        1. Alterar a função wms6435a_cria_temporarias para que seja criada uma nova temporária tt_os_ativ_movimentos. Esta nova temporária deverá conter os campos empresa CHAR(02), ordem_servico CHAR(17) e atividade CHAR(06). Seguir mesmos procedimentos existentes para a criação das temporárias tt_movimentos e tt_recursos.
        2. Alterar a função wms6435a_carrega_movimentos para que logo após a execução da inclusão de registros na tabela temporária tt_movimentos seja carregada também a tabela temporária tt_os_ativ_movimentos. Para carregar esta nova tabela temporária, buscar as diferentes ordens de serviço e atividades geradas para os movimentos. Veja abaixo 

          Bloco de código
          languagesql
          titleComando SQL para carregar a tabela temporária tt_os_ativ_movimentos com as diferentes ordens de serviço e atividades dos movimentos processados
          linenumberstrue
          collapsetrue
           
          INSERT INTO tt_os_ativ_movimentos (empresa, ordem_servico, atividade) 
          SELECT DISTINCT empresa, ordem_servico, atividade FROM tt_movimentos).
           
        3. Criar uma nova função wms6435a_atualiza_conv_ativ. Esta função deverá atualizar os registros da wms_conv_ativa com base no processamento da alocação/realocação efetuada, para isso utilizar como como base as tabelas tt_os_ativ_movimentos, wms_os_ativ_executor e wms_processo_moviment. Segue abaixo passo a passo e ao final uma sugestão de implementação considerando todos os itens:
          1. Excluir os registros de pendência de convocação ativa (wms_conv_ativa) que possuam usuário executor onde este usuário executor não possua mais processos de movimento para as ordens de serviço/atividade processadas (tt_os_ativ_movimentos).
          2. Excluir os registros de pendência de convocação ativa (wms_conv_ativa) que não possuam usuário executor e também não existam mais processos de movimento para as ordens de serviço/atividade processadas (tt_os_ativ_movimentos).
          3. Incluir novo registro de pendência de convocação ativa (wms_conv_ativa)  por ordem de serviço/atividade e usuário executor quando existir algum processo de movimento com usuário executor para as ordens de serviço/atividade processadas(tt_os_ativ_movimentos) e que ainda não possua pendência de convocação ativa.
          4. Incluir novo registro de pendência de convocação ativa (wms_conv_ativa)  por ordem de serviço/atividade sem executor quando existir algum processo de movimento sem usuário executor para as ordens de serviço/atividade processadas(tt_os_ativ_movimentos) e que ainda não possua pendência de convocação ativa.
          5. Bloco de código
            languagesql
            titleSegue sugestão de comandos SQL contendo todos os passos acima mencionados. Não foi utilizado RNL pois o processamento pode ocorrer para um volume considerável de ordens de serviço/atividade e a ideia é evitar a utilização de cursores para melhorar performance.
            linenumberstrue
            collapsetrue
            --exclui registros da convocacao ativa(wms_conv_ativa) onde:
            ------ usuario executor da convocação ativa não exista em nenhum processo de movimento das ordens de serviço/atividade processadas
            ------ usuario executor da convocação ativa esteja nulo e não existam processos de movimento das ordens de serviço/atividade processadas pendentes de alocação
              DELETE
                FROM wms_conv_ativa
               WHERE wms_conv_ativa.empresa = p_cod_empresa
                 AND wms_conv_ativa.conv_ativa_atividade IN (8,9,10)
                 AND ( (wms_conv_ativa.usuario_executor IS NOT NULL
                        AND NOT EXISTS (SELECT DISTINCT 1
                                          FROM wms_processo_moviment
                                    INNER JOIN tt_os_ativ_movimentos
                                            ON tt_os_ativ_movimentos.empresa = wms_processo_moviment.empresa
                                           AND tt_os_ativ_movimentos.ordem_servico = wms_processo_moviment.ordem_servico
                                           AND tt_os_ativ_movimentos.atividade = wms_processo_moviment.ativ
                                         WHERE wms_processo_moviment.empresa          = p_cod_empresa
                                           AND wms_processo_moviment.empresa          = wms_conv_ativa.empresa
                                           AND wms_processo_moviment.ordem_servico    = wms_conv_ativa.ordem_servico
                                           AND wms_processo_moviment.ativ             = wms_conv_ativa.ativ
                                           AND wms_processo_moviment.usuario_executor = wms_conv_ativa.usuario_executor
                                           AND wms_processo_moviment.sit_processo_moviment NOT IN ('FI','CA')))
                       OR
                       (wms_conv_ativa.usuario_executor IS NULL
                        AND NOT EXISTS (SELECT DISTINCT 1
                                          FROM wms_processo_moviment
                                    INNER JOIN tt_os_ativ_movimentos
                                            ON tt_os_ativ_movimentos.empresa       = wms_processo_moviment.empresa
                                           AND tt_os_ativ_movimentos.ordem_servico = wms_processo_moviment.ordem_servico
                                           AND tt_os_ativ_movimentos.atividade     = wms_processo_moviment.ativ
                                         WHERE wms_processo_moviment.empresa          = p_cod_empresa
                                           AND wms_processo_moviment.empresa          = wms_conv_ativa.empresa
                                           AND wms_processo_moviment.ordem_servico    = wms_conv_ativa.ordem_servico
                                           AND wms_processo_moviment.ativ             = wms_conv_ativa.ativ
                                           AND wms_processo_moviment.usuario_executor IS NULL
                                           AND wms_processo_moviment.sit_processo_moviment NOT IN ('FI','CA'))))
            
            --inclui registros da convocacao ativa(wms_conv_ativa) para as situações onde:
            ------ exista usuario executor em atividade pendente e ainda nao exista pendencia de convocação ativa
            ------------ (usuario executor = NULL para processos de movimento sem alocação)
            ------------  (usuario executor <> NULL para processos de movimento com alocação)
              INSERT INTO wms_conv_ativa
                          (empresa,ctr_ent_sai_veic_docum,ordem_servico,ativ,
                          tip_classe_operacao,conv_ativa_atividade,tip_processo,
                          usuario_executor, deposit,
                          endereco_origem)
                   SELECT DISTINCT
                          wms_ordem_servico.empresa, wms_ordem_servico.ctr_ent_sai_veic_docum, wms_ordem_servico.ordem_servico, wms_ativ.ativ,
                          wms_clas_operacao.tip_clas_operacao, wms_tip_processo.conv_ativa_atividade, wms_tip_processo.tip_processo,
                          wms_os_ativ_executor.usuario  AS usuario_executor, wms_ordem_servico.deposit,
                          CASE WHEN (SELECT COUNT(DISTINCT mov.endereco_origem)
                                       FROM wms_processo_moviment mov
                                      WHERE mov.empresa = tt_movimentos.empresa
                                        AND mov.ordem_servico = tt_movimentos.ordem_servico
                                        AND mov.ativ = tt_movimentos.atividade
                                        AND mov.sit_processo_moviment NOT IN ('FI','CA')
                                        AND ( ( wms_os_ativ_executor.usuario IS NOT NULL AND mov.usuario_executor = wms_os_ativ_executor.usuario)
                                            OR( wms_os_ativ_executor.usuario IS NULL AND mov.usuario_executor IS NULL)   )) = 1
                               THEN (SELECT DISTINCT mov.endereco_origem
                                       FROM wms_processo_moviment mov
                                      WHERE mov.empresa = tt_movimentos.empresa
                                        AND mov.ordem_servico = tt_movimentos.ordem_servico
                                        AND mov.ativ = tt_movimentos.atividade
                                        AND mov.sit_processo_moviment NOT IN ('FI','CA')
                                        AND ( ( wms_os_ativ_executor.usuario IS NOT NULL AND mov.usuario_executor = wms_os_ativ_executor.usuario)
                                            OR( wms_os_ativ_executor.usuario IS NULL AND mov.usuario_executor IS NULL)   ))
                               ELSE NULL
                          END endereco_origem
                     FROM tt_movimentos
               INNER JOIN wms_ordem_servico
                       ON wms_ordem_servico.empresa = tt_movimentos.empresa
                      AND wms_ordem_servico.ordem_servico = tt_movimentos.ordem_servico
               INNER JOIN wms_clas_operacao
                       ON wms_clas_operacao.empresa = wms_ordem_servico.empresa
                      AND wms_clas_operacao.classe_operacao = wms_ordem_servico.classe_operacao
               INNER JOIN wms_ativ
                       ON wms_ativ.empresa = tt_movimentos.empresa
                      AND wms_ativ.ativ = tt_movimentos.atividade
               INNER JOIN wms_tip_processo
                       ON wms_tip_processo.tip_processo = wms_ativ.tip_processo
               INNER JOIN wms_ordem_servico_ativ
                       ON wms_ordem_servico_ativ.empresa = tt_movimentos.empresa
                      AND wms_ordem_servico_ativ.ordem_servico = tt_movimentos.ordem_servico
                      AND wms_ordem_servico_ativ.ativ = tt_movimentos.atividade
                  LEFT JOIN wms_os_ativ_executor
                       ON wms_os_ativ_executor.empresa = tt_movimentos.empresa
                      AND wms_os_ativ_executor.ordem_servico = tt_movimentos.ordem_servico
                      AND wms_os_ativ_executor.ativ = tt_movimentos.atividade
                      AND (wms_os_ativ_executor.recurso_adicional = 'N' OR wms_os_ativ_executor.recurso_adicional IS NULL)
                      AND wms_os_ativ_executor.sit_execucao NOT IN (3,5,6,7)
                    WHERE tt_movimentos.empresa = p_cod_empresa
                      AND wms_tip_processo.conv_ativa_atividade IN (8,9,10)
                      AND wms_ordem_servico_ativ.sit_ativ NOT IN (3,5,6)
                      AND EXISTS (  SELECT DISTINCT 1
                                      FROM wms_processo_moviment mov
                                     WHERE mov.empresa       = wms_ordem_servico_ativ.empresa
                                       AND mov.ordem_servico = wms_ordem_servico_ativ.ordem_servico
                                       AND mov.ativ          =  wms_ordem_servico_ativ.ativ
                                       AND mov.sit_processo_moviment NOT IN ('FI','CA')
                                       AND (  ( wms_os_ativ_executor.usuario IS NOT NULL AND mov.usuario_executor = wms_os_ativ_executor.usuario)
                                              OR  ( wms_os_ativ_executor.usuario IS NULL AND mov.usuario_executor IS NULL)   ))
                      AND NOT EXISTS ( SELECT DISTINCT 1
                                         FROM wms_conv_ativa cv
                                        WHERE cv.empresa       = wms_ordem_servico_ativ.empresa
                                          AND cv.ordem_servico = wms_ordem_servico_ativ.ordem_servico
                                          AND cv.ativ          = wms_ordem_servico_ativ.ativ
                                          AND (  ( wms_os_ativ_executor.usuario IS NOT NULL AND cv.usuario_executor = wms_os_ativ_executor.usuario)
                                                 OR ( wms_os_ativ_executor.usuario IS NULL AND cv.usuario_executor IS NULL)   ))
            
            -- atualiza as colunas que não tiveram valores inseridos NO INSERT anterior. INSERT com SELECT nao aceita variáveis
            -------- somente atualiza campos de alocação se realmente existir uma alocação para o usuário
              UPDATE wms_conv_ativa
                 SET dat_hor_inclusao = l_data_atual,
                     usuario_alocacao = CASE WHEN usuario_executor IS NOT NULL THEN p_user ELSE NULL END,
                     dat_hor_alocacao_executor = CASE WHEN usuario_executor IS NOT NULL THEN l_data_atual ELSE NULL END
               WHERE wms_conv_ativa.empresa = p_cod_empresa
                 AND EXISTS (SELECT DISTINCT 1
                               FROM tt_os_ativ_movimentos
                              WHERE tt_os_ativ_movimentos.empresa = wms_conv_ativa.empresa
                                AND tt_os_ativ_movimentos.ordem_servico = wms_conv_ativa.ordem_servico
                                AND tt_os_ativ_movimentos.atividade = wms_conv_ativa.ativ)
                 AND dat_hor_inclusao IS NULL AND usuario_alocacao IS NULL AND dat_hor_alocacao_executor IS NULL
             
            -- bastar adicionar os tratamentos de erro (whenever error) e retornar true ao final da função. Nenhum comando pode retornar sqlstatus <> 0.
        4. Alterar a função wms6435a_atualiza_dados_alocacao (alocação & realocação) para que ao final da função seja chamada a função wms6435a_atualiza_conv_ativCondicionar esta alteração a utilização da convocação ativa (m_utiliza_conv_ativa = 'S').


        5. Alterar a função wms6435b_cria_temporarias para que seja criada uma nova temporária tt_os_ativ_movimentos. Esta nova temporária deverá conter os campos empresa CHAR(02)ordem_servico CHAR(17) e atividade CHAR(06). Seguir mesmos procedimentos existentes para a criação da temporária tt_movimentos.
        6. Alterar a função wms6435b_carrega_movimentos para que logo após a execução da inclusão de registros na tabela temporária tt_movimentos seja carregada também a tabela temporária tt_os_ativ_movimentos. Para carregar esta nova tabela temporária, buscar as diferentes ordens de serviço e atividades geradas para os movimentos. Veja abaixo 

          Bloco de código
          languagesql
          titleComando SQL para carregar a tabela temporária tt_os_ativ_movimentos com as diferentes ordens de serviço e atividades dos movimentos processados
          linenumberstrue
          collapsetrue
           
          INSERT INTO tt_os_ativ_movimentos (empresa, ordem_servico, atividade) 
          SELECT DISTINCT empresa, ordem_servico, atividade FROM tt_movimentos).
           
        7. Criar uma nova função wms6435b_atualiza_conv_ativ. Esta função deverá atualizar os registros da wms_conv_ativa com base no processamento da desalocação efetuada, para isso utilizar como como base as tabelas tt_os_ativ_movimentoswms_os_ativ_executor e wms_processo_moviment. Segue abaixo passo a passo e ao final uma sugestão de implementação considerando todos os itens:

          1. Excluir os registros de pendência de convocação ativa (wms_conv_ativa) que possuam usuário executor onde este usuário executor não possua mais processos de movimento para as ordens de serviço/atividade processadas (tt_os_ativ_movimentos).
          2. Excluir os registros de pendência de convocação ativa (wms_conv_ativa) que não possuam usuário executor e também não existam mais processos de movimento para as ordens de serviço/atividade processadas (tt_os_ativ_movimentos).
          3. Semelhante ao item 3, contendo apenas exclusão.

            Bloco de código
            languagesql
            titleSegue sugestão de comandos SQL contendo todos os passos acima mencionados. Não foi utilizado RNL pois o processamento pode ocorrer para um volume considerável de ordens de serviço/atividade e a ideia é evitar a utilização de cursores para melhorar performance.
            linenumberstrue
            collapsetrue
            --exclui registros da convocacao ativa(wms_conv_ativa) onde:
            ------ usuario executor da convocação ativa não exista em nenhum processo de movimento das ordens de serviço/atividade processadas
            ------ usuario executor da convocação ativa esteja nulo e não existam processos de movimento das ordens de serviço/atividade processadas pendentes de alocação
              DELETE
                FROM wms_conv_ativa
               WHERE wms_conv_ativa.empresa = p_cod_empresa
                 AND wms_conv_ativa.conv_ativa_atividade IN (8,9,10)
                 AND ( (wms_conv_ativa.usuario_executor IS NOT NULL
                        AND NOT EXISTS (SELECT DISTINCT 1
                                          FROM wms_processo_moviment
                                    INNER JOIN tt_os_ativ_movimentos
                                            ON tt_os_ativ_movimentos.empresa = wms_processo_moviment.empresa
                                           AND tt_os_ativ_movimentos.ordem_servico = wms_processo_moviment.ordem_servico
                                           AND tt_os_ativ_movimentos.atividade = wms_processo_moviment.ativ
                                         WHERE wms_processo_moviment.empresa          = p_cod_empresa
                                           AND wms_processo_moviment.empresa          = wms_conv_ativa.empresa
                                           AND wms_processo_moviment.ordem_servico    = wms_conv_ativa.ordem_servico
                                           AND wms_processo_moviment.ativ             = wms_conv_ativa.ativ
                                           AND wms_processo_moviment.usuario_executor = wms_conv_ativa.usuario_executor
                                           AND wms_processo_moviment.sit_processo_moviment NOT IN ('FI','CA')))
                       OR
                       (wms_conv_ativa.usuario_executor IS NULL
                        AND NOT EXISTS (SELECT DISTINCT 1
                                          FROM wms_processo_moviment
                                    INNER JOIN tt_os_ativ_movimentos
                                            ON tt_os_ativ_movimentos.empresa       = wms_processo_moviment.empresa
                                           AND tt_os_ativ_movimentos.ordem_servico = wms_processo_moviment.ordem_servico
                                           AND tt_os_ativ_movimentos.atividade     = wms_processo_moviment.ativ
                                         WHERE wms_processo_moviment.empresa          = p_cod_empresa
                                           AND wms_processo_moviment.empresa          = wms_conv_ativa.empresa
                                           AND wms_processo_moviment.ordem_servico    = wms_conv_ativa.ordem_servico
                                           AND wms_processo_moviment.ativ             = wms_conv_ativa.ativ
                                           AND wms_processo_moviment.usuario_executor IS NULL
                                           AND wms_processo_moviment.sit_processo_moviment NOT IN ('FI','CA'))))
        8. Alterar a função wms6435b_desalocar_movimento (desalocação) para que ao final da função seja chamada a função wms6435a_atualiza_conv_ativ
    26. Ao encontrar atividade para execução, exibir em tela os campos abaixo. 
      1. Armazenagem
        1. Identificador 1 = CESV.
        2. Identificador 2 = Palete do processo de movimento.
      2. Transferência
        1. Identificador 1 = Processo de movimento.
        2. Identificador 2 = Palete.
      3. NOTA: No item 9 da especificação do requisito 15.3 é possível verificar o protótipo de tela onde estas informações devem ser apresentadas.
    27. Ao executar a chamada para execução da atividade de Armazenagem ou Transferência, enviar o código do processo de movimento.
      Sugestão de implementação para atender os objetivos mencionados acima.  Esta sugestão de implementação tem o objetivo de sugerir um caminho a ser seguido sendo que ajustes podem ser necessários para que os objetivos mencionados acima possam ser 100% atendidos. Este item (e) será considerado concluído se os objetivos acima mencionados forem alcançados.
      1. Para o objeivo 1 e 2, não é possível determinar o ponto de alteração pois o programa ainda encontra-se em desenvolvimento. As indicações acabam se limitando ao objetivo final, ficando a cargo do programador definir durante o desenvolvimento junto ao analista o melhor ponto para alteração.
      2. Para o objetivo 3, realizar chamada a nova função wms6077_set_processo_moviment, passando o processo de movimento, e em seguida realizar chamada a função wms6077_administra_os.
      WMS6180 - Armazenagem / Transferência de endereço.Objetivo das alterações a serem realizadas: 
    28. Permitir receber por parâmetro o código de um determinado processo de movimento para execução. Este código de processo de movimento será enviado pelo programa de convocação ativa.
    29. Validar se o palete informado pelo usuário corresponde ao palete do processo de movimento recebido do programa de convocação ativa.
    30. Ao acionar a função F6/CTRL-E - End/Palt exibir apenas o endereço e o palete do processo de movimento recebido do programa de convocação ativa.
    31. Gerar pendência de convocação ativa ao depositar palete em endereço drop-point ou ao liberar equipamento e depositar palete em endereço diferente de armazém.
    32. Ao concluir a armazenagem do palete do processo de movimento recebido do programa de convocação ativa, encerrar o programa de armazenagem encerrando a atividade do usuário e a pendência da convocação ativa.
      Sugestão de implementação para atender os objetivos mencionados acima.  Esta sugestão de implementação tem o objetivo de sugerir um caminho a ser seguido sendo que ajustes podem ser necessários para que os objetivos mencionados acima possam ser 100% atendidos. Este item (e) será considerado concluído se os objetivos acima mencionados forem alcançados.
      1. Criar variável modular m_utiliza_conv_ativa para que seja armazenado o valor do parâmetro utiliza_conv_ativa.
      2. Alterar o record mr_parametros para incluir duas novas variáveis: pocesso de movimento(processo_moviment) e palete(palete). 
      3. Criar função wms6180_retorna_palete. Esta função deverá receber como parâmetro empresa e processo de movimento e retornar o palete do processo de movimento recebido como parâmetro.
      4. Alterar a função wms6180_movimentacao_armazenamento para que:
      1. Seja feita leitura do parâmetro utiliza_conv_ativa e seu valor seja armazenado na variável m_utiliza_conv_ativa. Esta alteração deverá estar já no início da função.
      2. Seja lido o processo de movimento recebido como parâmetro. O código do processo de movimento será o sexto parâmetro recebido pela rotina (arg_val(6)) e seu valor deverá ser armazenado na nova variável mr_parametro.processo_moviment.
      3. Logo em seguida seja chamada a função wms6180_retorna_palete para obter o palete do processo de movimento(mr_parametro.processo_moviment). O palete obtido deve ser armazenado na nova variável mr_parametros.palete
      4. As alterações (b) e (c) devem estar condicionadas a utilização da convocação ativa (m_utiliza_conv_ativa = 'S').
      5. Caso a convocação ativa não seja utilizada (m_utiliza_conv_ativa = 'N') ou não tenha sido recebido um processo de moviment como parâmetro, as novas varíaveis deverão possuir seu valor NULL.
    33. Alterar a função wms6180_entrada_etiqueta na estrutura de input de dados, no after field do campo m_etiq_mov. Logo após as validações existentes que verificam se o palete informado não é nulo e se o palete existe, alterar para verificar também se o palete informado (mr_movimento.identif_palete) é igual ao palete do processo movimento que o usuário foi convocado para realizar armazenagem (mr_parametro.palete). Caso não seja igual, usuário deve ser notificado "Palete informado difere do palete convocado para armazenagem." Estas implementações devem estar condicionadas a utilização da convocação ativa (m_utiliza_conv_ativa = 'S') e a existência de um processo de movimento recebido por parâmetro (mr_parametro.processo_movimento IS NOT NULL).
    34. Alterar a função wms6180_entrada_etiqueta na estrutura de input de dados, na função F6/CTRL-E - End/Palt. Passar o palete (mr_parametro.palete) do processo de movimento recebido como parâmetro para a função wms6236_mostra_endereco_palete. Na função wms6236_mostra_endereco_palete o palete é o último parâmetro, atualmente é passado NULL.
    35. Alterar a função wms6180_gera_tabelas_processo_movimentacao logo após o bloco de código condicional de chamada a fução wmsr40_desbloqueia_separacao. Neste ponto o processo de movimento está finalizado, sendo assim a pendência da convocação ativa poderá ser concluída. Para isso, realizar chamada a função wmsr139_finaliza_pendencia_conv_ativa_transf_armzCondicionar esta alteração a utilização da convocação ativa (m_utiliza_conv_ativa = 'S'
    36. Alterar a função wms6180_entrada_finaliza_processo imediatamente antes do COMMIT  da conclusão do processo de armazenagem do palete no endereço destino. Verificar se não existem movimentos em abertos com o usuário (wms6180_verifica_processos_movtcao_em_aberto() = FALSE) e em seguida se existem movimentos ainda pendentes para a ordem de serviço (wms6180_verifica_processos_movtcao_pendentes() = TRUE). Atendendo essas duas situações realizar o encerramento da execução da atividade para o usuário. Para isso alterar o valor da variável m_status_encer para "F" e m_finaliza_apenas_usuario para "S". Em seguida chamar a função wms6180_prepara_retorno. Condicionar estas alterações a utilização da convocação ativa (m_utiliza_conv_ativa = 'S') e a existência de um processo de movimento recebido por parâmetro (mr_parametro.processo_movimento IS NOT NULL). O objetivo desta alteração é que o processamento do programa wms6180 seja concluído voltando a execução do programa chamador (convocação ativa).
    37. Alterar a função wms6180_gera_nova_seq_processo_movtcao para que logo após a inclusão de cada processo de movimento realizado pela função wmsr19_grava_processo_moviment uma nova pendência de convocação ativa seja gerada. Para isso realizar chamada para a função wmsr139_gera_pendencia_conv_ativa_transf_armzCondicionar esta alteração a utilização da convocação ativa (m_utiliza_conv_ativa = 'S'). Estas alterações tem o objetivo de gerar uma nova pendênca de convocação ativa para o processo de movimento gerado quando o palete é armazenado em um endereço drop-point ou quando o equipamento é liberado e o palete é depositado em um endereço de picking.
      WMS6185 - Cancelamento do recebimento
      1. Objetivo das alterações a serem realizadas: 
      2. Excluir pendência de convocação ativa para as atividades de armazenagem quando o cancelamento é realizado e os processos de movimento de armazenagem ainda se encontram pendentes/não iniciados.
      3. Gerar pendência de convocação ativa para a atividade de transferência de endereço para os paletes já armazenados com destino a doca de recebimento para posterior cancelamento do recebimento.
        Sugestão de implementação para atender os objetivos mencionados acima.  Esta sugestão de implementação tem o objetivo de sugerir um caminho a ser seguido sendo que ajustes podem ser necessários para que os objetivos mencionados acima possam ser 100% atendidos. Este item (e) será considerado concluído se os objetivos acima mencionados forem alcançados.
        1. Criar variável modular m_utiliza_conv_ativa para que seja armazenado o valor do parâmetro utiliza_conv_ativa.
        2. Alterar a função wms6185_before_menu para que seja feita leitura do parâmetro utiliza_conv_ativa e seu valor seja armazenado na variável m_utiliza_conv_ativa. Adicionar a leitura do parâmetro logo após a leitura e validação existente para o parâmetro oper_confer_entrada_normal.
        3. Alterar a função wms6185_cancela_processo_armazenagem para que logo após a exclusão de cada processo de movimento realizado pela função wmsm151_wms_processo_moviment_exclui a pendência de convocação ativa seja excluída. Para isso realizar chamada para a função wmsr139_exclui_pendencia_conv_ativa_transf_armzCondicionar esta alteração a utilização da convocação ativa (m_utiliza_conv_ativa = 'S'
        4. Alterar a função wms6185_cancela_processo_armazenagem_por_aviso para que logo após a exclusão de cada processo de movimento realizado pela função wmsm151_wms_processo_moviment_exclui a pendência de convocação ativa seja excluída. Para isso realizar chamada para a função wmsr139_exclui_pendencia_conv_ativa_transf_armzCondicionar esta alteração a utilização da convocação ativa (m_utiliza_conv_ativa = 'S'
        5. Alterar a função wms6185_gera_movimentacao_palete_doca para que logo após a inclusão de cada processo de movimento realizado pela função wmsr19_grava_processo_moviment uma nova pendência de convocação ativa seja gerada. Para isso realizar chamada para a função wmsr139_gera_pendencia_conv_ativa_transf_armzCondicionar esta alteração a utilização da convocação ativa (m_utiliza_conv_ativa = 'S'

        6. Alterar a função wms6185função wms6435c_gera_movimentacao_palete_doca_por_aviso para que logo após a inclusão de cada processo de movimento realizado pela função wmsr19_grava_processo_moviment uma nova pendência de convocação ativa seja gerada. Para isso realizar chamada para a função wmsr139_gera_pendencia_conv_ativa_transf_armzCondicionar esta alteração a utilização da convocação ativa (m_utiliza_conv_ativa = 'S'
      WMS6430 - Central do planejador Objetivo das alterações a serem realizadas: ..
      Sugestão de implementação para atender os objetivos mencionados acima.  Esta sugestão de implementação tem o objetivo de sugerir um caminho a ser seguido sendo que ajustes podem ser necessários para que os objetivos mencionados acima possam ser 100% atendidos. Este item (e) será considerado concluído se os objetivos acima mencionados forem alcançados.wms6430 - wms6435 -  wms64353 - armazenagem - wms64354 - transferencia de endereço
      WMS6631 - Alocação de recursoObjetivo das alterações a serem realizadas: ..
      Sugestão de implementação para atender os objetivos mencionados acima.  Esta sugestão de implementação tem o objetivo de sugerir um caminho a ser seguido sendo que ajustes podem ser necessários para que os objetivos mencionados acima possam ser 100% atendidos. Este item (e) será considerado concluído se os objetivos acima mencionados forem alcançados.
      1. 1...

Resumo dos Programas e Funções Criadas e Alteradas

RotinaTipo de OperaçãoRegras de Negócio
WMSR139CriaçãoFunção de regra de negócio para geração e atualização de pendencia de convocação ativa.
WMS6378AlteraçãoGeração automática de planejamento de armazenagem
WMS6177AlteraçãoPlanejamento de armazenagem via desktop
WMS6178AlteraçãoPlanejamento de armazenagem e transferência via coletor
WMS6077AlteraçãoFunção responsável pela execução efetiva de um programa para uma determinada atividade
WMS6743AlteraçãoGerenciamento da convocação ativa
WMS6180AlteraçãoPrograma responsável pela armazenagem e transferência de endereço de palete
WMS6185AlteraçãoCancelamento do recebimento.

Dicionário de Dados

Alteração da tabela wms_conv_ativa e wms_conv_ativa_historico para inclusão de nova coluna.

NomeTipoObrigatória
processo_movimentoINTNão
        1. cria_temporarias para que seja criada uma nova temporária tt_os_ativ_movimentos. Esta nova temporária deverá conter os campos empresa CHAR(02)ordem_servico CHAR(17) e atividade CHAR(06). Seguir mesmos procedimentos existentes para a criação da temporária tt_movimentos. 
        2. Criar uma nova função wms6435c_tt_os_ativ_movimentos_inclui. Esta nova função deverá incluir um novo regitro na tabela temporária tt_os_ativ_movimentos. Sendo assim, esta função deverá receber como parâmetro empresa CHAR(02)ordem_servico CHAR(17) e atividade CHAR(06). Só incluir um novo registro caso não exista um registro com as mesmas informações.
        3. Criar uma nova função wms6435c_atualiza_conv_ativa. Replicar conteúdo da função wms6435a_atualiza_conv_ativ.
        4. Alterar a função wms6435c_confirmar (alocação & realocação direta) para que logo após o loop nos processos de movimento END FOR e antes das operações de roolback ou commit (antes IF l_houve_erro THEN) seja feita chamada para função wms6435c_atualiza_conv_ativaCondicionar esta alteração a utilização da convocação ativa (m_utiliza_conv_ativa = 'S'


    1. WMS6631 - Alocação de recurso
      1. Objetivo das alterações a serem realizadas: 
        1. Excluir e gerar novas pendências de convocação ativa com base nas operações de alocação, desalocação e realocação das atividades de armazenagem, cancelamento da armazenagem e transferência de endereço.

      2. Sugestão de implementação:
        1. Alterar a função wms663108a. As alterações a serem realizadas são as mesmas descritas para wms6435a.
        2. Alterar a função wms663108b. As alterações a serem realizadas são as mesmas descritas para wms6435b.
        3. Alterar a função wms663108c. As alterações a serem realizadas são as mesmas descritas para wms6435c.
 

 

 Este documento é material de especificação dos requisitos de inovação, trata-se de conteúdo extremamente técnico.