Páginas filhas
  • ER_LOGWMS01-34_Conferencia_Expedicao

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

 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 - Warehouse Management System

Segmento Executor

Supply Chain

Projeto1

LOGWMS01 - Supply Chain - WMS

IRM1

LOGWMS01-30 - Processamento via leitura código de barras GS1-128

Requisito1

LOGWMS01-34 - Tratar GS1-128 na Conferência da Expedição

Subtarefa1

 

Chamado2

<não se aplica>

País

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

(  ) USA  (  ) Colombia   (  ) Outro _____________.

Outros

Esta Story (LOGWMS01-34) é a quarta de um conjunto referente ao Épic (LOGWMS01-30) que contempla todas as funcionalidades previstas para tratamento do código de barras GS1-128.

Demais Stories:

REQ01 → LOGWMS01-31 - Configuração.

REQ02 → LOGWMS01-32 - Tratar GS1-128 na Conferência do Recebimento

REQ03 → LOGWMS01-33 - Tratar GS1-128 na Separação

REQ05 → LOGWMS01-35 - Tratar GS1-128 nas rotinas complementares

   Legenda: 1 – Inovação 2 – Manutenção (Os demais campos devem ser preenchidos para ambos os processos). 

Objetivo

 

Definição da Regra de Negócio

 

  1. Para atingir o resultado esperado detalhado acima, as seguintes alteração de funções e programas serão necessárias:
    1. WMS6218 - Conferencia da expedição via coletor de dados
      1. Criar função wms6218_validar_valores_validos_dimensionais(l_arr_curr) para isolar regras de negócio referente a validação de valor válido para dimensionais sem que possua dependência direta dos componentes de tela (screen arrays\campos).
        • Atualmente a wms6218_valida_dimensional() e a wms6218_valida_dimensional_sem_split() cumprem dois papéis, i) validar se o valor digitado para um dimensional é válido, ii) verificar se existe saldo para o item, quantidade  e dimensional informado. A ideia proposta é mover a parte i) referente as validações de valores para esta função wms6218_validar_valores_validos_dimensionais() . Para atender esta necessidade mover o bloco de código abaixo da função wms6218_valida_dimensional() e da wms6218_valida_dimensional_sem_split() para a função wms6218_validar_valores_validos_dimensionais();

          Bloco de código
          languagesql
          themeEclipse
          titleBloco de código a ser movido da wms6218_valida_dimensional() para wms6218_validar_valores_validos_dimensionais()
          linenumberstrue
          collapsetrue
          # Verificar a consistencia do dado informado
           IF ma_dimensional_aux[l_arr_curr].campo = "dat_hor_producao"
           OR ma_dimensional_aux[l_arr_curr].campo = "dat_hor_validade" THEN
              LET l_data_valida = ma_dimensional[l_arr_curr].val_dimensional
              LET ma_dimensional[l_arr_curr].val_dimensional = l_data_valida
          
              IF ma_dimensional[l_arr_curr].val_dimensional IS NULL THEN
                 CALL wms6218_mensagem('Dimensional','Data invalida.')
                 RETURN FALSE
              END IF
           END IF


        • Além de mover o bloco de código, veja que a instrução DISPLAY e o índice do array de tela foram descartados para que não exista dependência de tela para realizar a validação;

      2. Alterar função wms6218_valida_dimensional_sem_split() adequando o seu nome a sua funcionalidade e retirando a dependência da tela (screen arrays\campos) 
        1. Remover o bloco de código movido para a função  wms6218_validar_valores_validos_dimensionais() mencionado acima no item a. i);
        2. Retirar a declaração das variáveis utilizadas exclusivamente no bloco de código movido;
        3. Retirar o parâmetro l_scr_line;
        4. Mudar seu nome para wms6218_validar_saldo_reservas_dimensionais_sem_split().
      3. Alterar função wms6218_valida_dimensional() adequando o seu nome a sua funcionalidade e retirando a dependência da tela (screen arrays\campos) 
        • Remover o bloco de código movido para a função  wms6218_validar_valores_validos_dimensionais() mencionado acima no item a. i);
        • Retirar a declaração das variáveis utilizadas exclusivamente no bloco de código movido;
        • Retirar o parâmetro l_scr_line;
        • Mudar seu nome para wms6218_validar_saldo_reservas_dimensionais().
      4. Alterar função wms6218_informa_dimensionais() na estrutura de INPUT no after field do campo val_dimensional ajustar para adequar as modificações mencionadas nos itens acima a. i) e a. iii)
        • No lugar de todo o conteúdo atual do after field do campo val_dimensional, adicionar as verificações abaixo. (ao final uma sugestão de implementação);
        • Se val_dimensional for NULL, posicionar novamente no campo val_dimensional (NEXT FIELD val_dimensional);
        • Em seguida, verificar se o valor digitado é um valor válido através da função wms6218_validar_valores_validos_dimensionais(). Não sendo válido, realizar o DISPLAY em tela do valor e posicionar novamente no campo para que o operador informe algo válido  (NEXT FIELD val_dimensional).
        • Após verificar que o valor informado não é nulo e é um valor válido, realizar o DISPLAY em tela e em seguida verificar se existe saldo em reserva para a quantidade e dimensional informado através da função wms6218_validar_saldo_reservas_dimensionais(). Caso não exista saldo a função irá retornar FALSE e então neste caso posicionar novamente no campo para que o usuário informe algo válido (NEXT FIELD val_dimensional).

        • Abaixo sugestão de implementação para todos os itens mencionados acima.

          Bloco de código
          languagesql
          themeEclipse
          titleSugestão de implementação dos ajustes necessário na validação dos dimensionais.
          linenumberstrue
          collapsetrue
          AFTER FIELD val_dimensional
                  IF ma_dimensional[l_arr_curr].val_dimensional IS NULL THEN      
                     NEXT FIELD
                  END IF
                  
                  IF NOT wms6218_validar_valores_validos_dimensionais(l_arr_curr) THEN           
                     DISPLAY ma_dimensional[l_arr_curr].val_dimensional TO sr_dimensional[l_scr_line].val_dimensional              
                     NEXT FIELD val_dimensional              
                  END IF 
                     
                  DISPLAY ma_dimensional[l_arr_curr].val_dimensional TO sr_dimensional[l_scr_line].val_dimensional
                        
                  IF NOT wms6218_validar_saldo_reservas_dimensionais(l_arr_curr) THEN
                     NEXT FIELD val_dimensional
                  END IF               
      5. Criar função Crirar função wms6218_encontrou_controletodos_coddimensionais_barrasitem_gs1_128()  que finalmente irá solicitar o código de barras para identificar se todos os dimensionais controlados pelo item foram obtidos do GS1-128. 
        • O primeiro passo é encontrar o código do item obtido do GS1-128. Para chegar neste código existem duas opções:
          • i) Obter o código do item através do depositante (mr_solicit_carga_compl.deposit) e do código do item depositante obtido do GS1-128 (wmsr130_get_item_depositante()). 
          • ii) Obter o código do item através do depositante (mr_solicit_carga_compl.deposit) e do código de barras do SKU obtido do GS1-128 (wmsr130_get_cod_barras_sku()).
        • Em seguida verificar os dimensionais controlados pelo item considerando a configuração de dimensionais a serem restringidos na conferência da expedição conforme parametrizado no completo do item WMS em MA9922.
        • Para cada dimensional a ser solicitado na conferência da expedição verificar se foi obtido algum valor do GS1-128.
        • Caso algum destes dimensionais não possua valor, retornar FALSE. Caso todos possuam valor, retornar TRUE.
        • Segue abaixo a sugestão de implementação considerando todos os itens mencionados acima:

          Bloco de código
          languagesql
          titleSugestão de implementação para consultar os dimensionais que serão solicitados na conferência da expedição e verificar se todos eles tiveram valores obtidos do GS1-128
          linenumberstrue
          collapsetrue
          SELECT DISTINCT 
                      item.cod_item,
                      CASE WHEN ( (rest_dimensional_conferencia = 'S' AND solicitar_lote_conferencia = 'S' AND ies_ctr_lote = 'S') OR
                                  ( (rest_dimensional_conferencia IS NULL OR rest_dimensional_conferencia = 'N') AND ies_ctr_lote = 'S') )
                           THEN 'S' ELSE 'N' END AS ies_ctr_lote_conf,
                      CASE WHEN ( (rest_dimensional_conferencia = 'S' AND solic_dat_validade_conferencia = 'S' AND ies_dat_validade = 'S') OR
                                  ( (rest_dimensional_conferencia IS NULL OR rest_dimensional_conferencia = 'N') AND ies_dat_validade = 'S') )
                           THEN 'S' ELSE 'N' END AS ies_ctr_dat_validade_conf,
                      CASE WHEN ( (rest_dimensional_conferencia = 'S' AND solic_dat_producao_conferencia = 'S' AND ies_dat_producao = 'S') OR
                                  ( (rest_dimensional_conferencia IS NULL OR rest_dimensional_conferencia = 'N') AND ies_dat_producao = 'S') )
                           THEN 'S' ELSE 'N' END AS ies_ctr_dat_producao_conf,
                      CASE WHEN ( (rest_dimensional_conferencia = 'S' AND solicitar_volume_conferencia = 'S' AND ies_volume = 'S') OR
                                  ( (rest_dimensional_conferencia IS NULL OR rest_dimensional_conferencia = 'N') AND ies_volume = 'S') )
                           THEN 'S' ELSE 'N' END AS ies_ctr_volume_conf,
                      CASE WHEN ( (rest_dimensional_conferencia = 'S' AND solic_comprimento_conferencia = 'S' AND ies_comprimento = 'S') OR
                                  ( (rest_dimensional_conferencia IS NULL OR rest_dimensional_conferencia = 'N') AND ies_comprimento = 'S') )
                           THEN 'S' ELSE 'N' END AS ies_ctr_comprimento_conf,
                      CASE WHEN ( (rest_dimensional_conferencia = 'S' AND solicitar_altura_conferencia = 'S' AND ies_altura = 'S') OR
                                  ( (rest_dimensional_conferencia IS NULL OR rest_dimensional_conferencia = 'N') AND ies_altura = 'S') )
                           THEN 'S' ELSE 'N' END AS ies_ctr_altura_conf,
                      CASE WHEN ( (rest_dimensional_conferencia = 'S' AND solicitar_largura_conferencia = 'S' AND ies_largura = 'S') OR
                                  ( (rest_dimensional_conferencia IS NULL OR rest_dimensional_conferencia = 'N') AND ies_largura = 'S') )
                           THEN 'S' ELSE 'N' END AS ies_ctr_largura_conf,
                      CASE WHEN ( (rest_dimensional_conferencia = 'S' AND solicitar_diametro_conferencia = 'S' AND ies_diametro = 'S') OR
                                  ( (rest_dimensional_conferencia IS NULL OR rest_dimensional_conferencia = 'N') AND ies_diametro = 'S') )
                           THEN 'S' ELSE 'N' END AS ies_ctr_diametro_conf,
                      CASE WHEN ( (rest_dimensional_conferencia = 'S' AND solicitar_peca_conferencia = 'S' AND reservado_1 = 'S') OR
                                  ( (rest_dimensional_conferencia  IS NULL OR rest_dimensional_conferencia = 'N') AND reservado_1 = 'S') )
                           THEN 'S' ELSE 'N' END AS ies_ctr_peca_conf,
                      CASE WHEN ( (rest_dimensional_conferencia = 'S' AND solicitar_serie_conferencia = 'S' AND reservado_2 = 'S') OR
                                  ( (rest_dimensional_conferencia  IS NULL OR rest_dimensional_conferencia = 'N') AND reservado_2 = 'S') )
                           THEN 'S' ELSE 'N' END AS ies_ctr_serie_conf
                     INTO
                      l_ies_ctr_lote_conf,
                      l_ies_ctr_dat_validade_conf,
                      l_ies_ctr_dat_producao_conf,
                      l_ies_ctr_volume_conf,
                      l_ies_ctr_comprimento_conf,
                      l_ies_ctr_altura_conf,
                      l_ies_ctr_largura_conf
                      l_ies_ctr_diametro_conf,
                      l_ies_ctr_peca_conf,
                      l_ies_ctr_serie_conf,
                 FROM item 
           INNER JOIN item_ctr_grade
                   ON item.cod_empresa = item_ctr_grade.cod_empresa
                  AND item.cod_item = item_ctr_grade.cod_item
           INNER JOIN wms_item_complemento
                   ON item.cod_empresa = wms_item_complemento.empresa                                                  
                  AND item.cod_item    = wms_item_complemento.item
           INNER JOIN wms_item_sku_cod_barras
                   ON item.cod_empresa =   wms_item_sku_cod_barras.empresa
                  AND item.cod_item    =   wms_item_sku_cod_barras.item
                WHERE item.cod_empresa = p_cod_empresa
                  AND wms_item_complemento.deposit = mr_solicit_carga_compl.deposit                                                              
                  AND ( (wms_item_complemento.item_deposit = wmsr130_get_item_depositante()) OR (wmsr130_get_item_depositante() IS NULL))
                  AND ( (wms_item_sku_cod_barras.cod_barras = wmsr130_get_cod_barras_sku()) OR (wmsr130_get_cod_barras_sku() IS NULL))
          #MURILO --> para cada dimensional, se controla, verifica se tem valor.. 
          #se nao tem valor retorna FALSE, no final se ngm retornar FALSE, retorna TRUE
          IF l_ies_ctr_lote_conf = 'S' THEN
             IF wmsr130_get_lote() IS NULL OR wmsr130_get_lote() = '' THEN
                RETURN FALSE
             END IF 
          END IF 
          IF ies_ctr_dat_validade_conf = 'S' THEN
          .....   
          RETURN TRUE
          
          
      6. Criar função wms6218_controle_cod_barras_gs1_128() que finalmente irá solicitar o código de barras GS1-128
        • Esta função é a que finalmente irá solicitar\tratar o(s) código(s) de barras GS1-128. Abaixo serão detalhados os vários procedimentos e
        • Esta função é a que finalmente irá solicitar\tratar o(s) código(s) de barras GS1-128. Abaixo serão detalhados os vários procedimentos e ao final uma sugestão de implementação contemplando a descrição destes passos.
        • O primeiro passo para a função será verificar se o depositante utiliza ou não GS1-128. Caso ele não utilize a função poderá retornar FALSE sem executar nenhum processamento adicional. ou não GS1-128. Caso ele não utilize a função poderá retornar FALSE sem executar nenhum processamento adicional. 
        • O depositante utilizando GS1-128, verificar se o código de barras informado é um GS1-128 tentando decodifica-lo (wmsr130_decodifica_gs1_128). Caso tenha retornado FALSE, o código de barras não é um GS1-128 e deverá retornar mensagem de código inválido conforme já informa o operador atualmente. Caso tenha retornado TRUE da decodificação, verificar se as informações necessárias para o processo foram obtidas. Caso o item controle SKU e dimensionais, será necessário verificar se foram obtidas as informações de código de barras do SKU, Em seguida, tentar 
        • O depositante utilizando GS1-128 então os códigos de barras GS1-128 deverão ser solicitados ao operador. Para isso atribuir os parâmetros para wms6730 (wms6730_set_<<param>>) e chamar a função wms6730_solicita_cod_barras_gs1_128()Importante! Na passagem dos parâmetros para o WMS6730, enviar o código de barras informado pelo operador em tela já por parâmetro através da função wms6730_set_cod_barras().
        • Logo após a chamada para wms6730_solicita_cod_barras_gs1_128(), limpar os campos de tela referente a ean_codigo_barras, sku item. Em seguida verificar se foi encontrado algum atributo na decodificação, para isso chamar a função wmsr130_decodificacao_encontrou_atributos(). Caso não tenha encontrado, retornar FALSE na função wms6190_controle_cod_barras_gs1_128() e não executar mais nenhuma operação. Caso tenha encontrado, alimentar a variável m_encontrou_cod_barras_sku_gs1_128 com FALSE.
        • Caso tenha encontrado atributos, o primeiro passo é verificar se o código de barras do SKU não foi obtido do GS1-128 e o item depositante foi. Neste caso, verificar se o item depositante obtido do GS1-128 possui um, e somente um código de barras SKU vinculado. Nesta busca pelo código de barras do SKU, caso o atributo qtd_itens_sku tenha valor, utilizá-lo na busca. Ao encontrar somente um código de barras SKU para o item depositante do GS1-128, carregar as variáveis de tela do código de barras do SKU(mr_item_conferido.ean_codigo_barras), e do item (mr_item_conferido.item). Atribuir TRUE a variável m_encontrou_cod_barras_sku_gs1_128 indicando que o código de barras do SKU foi encontrado. Caso não tenha encontrado um SKU, limpar as variáveis de tela mr_item_conferido. mr_item_conferido.item.
        • O próximo passo é validar o código de barras SKU obtido do GS1-128, para isso verificar se o código de barras do SKU é diferente de vazio\null, se sim carregar a variável de tela mr_item_conferido.cod_barras e então tentar buscar o item através da função  wmsm86_wms_item_sku_cod_barras_leitura()Caso não encontre um item, limpar os campos de tela cod_barras (mr_item_conferido.cod_barras) e item(mr_item_conferido.cod_barras) e retornar FALSE.Caso encontre, atribuir TRUE a variável m_encontrou_cod_barras_sku_gs1_128 indicando que o código de barras do SKU foi encontrado
        • Segue abaixo sugestão de implementação contendo todos os passos mencionados acima:

      7. Criar modular SMALLINT m_wmsr130_gs1_128_existe para representar a existência ou não da nova função wmsr130. Isso se faz necessário para que caso a equipe de manutenção precise enviar uma correção ao cliente não gere a necessidade de ter que enviar todos os fontes do projeto GS1-128. A utilização desta variável ao longo do programa WMS6218 estará descrita nos demais tópicos deste documento.
      8. Criar modular SMALLINT m_encontrou_cod_barras_sku_gs1_128 para indicar se encontrou ou não código de barras do SKU no GS1-128. Este indicador servirá para que os valores obtidos do GS1-128 não sejam limpos ao identificar atributos do GS1-128 porém não encontrar o código de barras do SKU.
      9. Alterar função wms6218_ean_cod_barras() para realizar os tratamentos necessários na utilização do GS1-128.

        • Já no início da função, caso a função wmsr130 exista, iniciar as variáveis m_wmsr130_gs1_128_existe com TRUE m_encontrou_cod_barras_sku_gs1_128 com FALSE.

          Bloco de código
          languagesql
          themeEclipse
          titleBloco de código responsável por armazenar o indicativo de existência ou não da função de regra de negócio do gs1-128 wmsr130.
          linenumberstrue
          collapsetrue
          LET m_wmsr130_gs1_128_existe = FALSE
          IF find4GLfunction('wmsr130_decodifica_gs1_128') THEN
             LET m_wmsr130_gs1_128_existe = TRUE
             LET m_encontrou_cod_barras_sku_gs1_128 = FALSE
          END IF 
        • No input de dados, alterar o evento before field do campo ean_codigo_barras. Ao final do evento, caso exista a função wmsr130 e o indicador de que o código de barras do SKU foi encontrado no GS1-128 seja FALSE (m_encontrou_cod_barras_sku_gs1_128), limpar os valores das funções referente ao GS1-128.

          Bloco de código
          languagesql
          themeEclipse
          titleSugestão de implementação no evento before field ean_codigo_barras para solicitar ou não a leitura de código de barras GS1-128.
          linenumberstrue
          collapsetrue
          IF m_wmsr130_gs1_128_existe THEN
              IF NOT m_encontrou_cod_barras_sku_gs1_128  THEN
                 CALL wmsr130_set_null()
                 CALL wmsr6730_set_null()
              END IF
          END IF
        • Alterar o evento after field do campo ean_codigo_barras. Para que caso o código de barras informado pelo operador não seja encontrado, antes de disparar mensagem de códgo de barras inválido, tente identificar se o código de barras é um GS1-128 e realize a respectiva decodificação. Para isso, logo após o retorno FALSE da chamada a função wmsm86_wms_item_sku_cod_barras_leitura() chamar a função wms6218_controle_cod_barras_gs1_128()Caso a função wms6218_controle_cod_barras_gs1_128() retorne FALSEexibir a mensagem ao usuário de código de barras inválidoCaso retorne TRUE seguir o processamento do after fieldCaso o codigo de barras seja encontrado e exista a função wmsr130, alimentar a variável m_encontrou_cod_barras_sku_gs1_128 com TRUE indicando que foram encontrados atributos GS1-128 porém o código de barras do SKU ou foi obtido manualmente ou via GS1-128.

          Bloco de código
          languagesql
          themeEclipse
          titleSugestão de implementação no evento after field ean_cod_barras
          linenumberstrue
          collapsetrue
          ......
          IF NOT wmsm86_wms_item_sku_cod_barras_leitura(p_cod_empresa,
                                                                    mr_item_conferido.ean_codigo_barras,
                                                                    mr_solicit_carga_compl.deposit,
                                                                    TRUE,
                                                                    1) THEN
             #MURILO --> Tentar tratar como GS1-128
             IF m_wmsr130_gs1_128_existe THEN
                IF NOT wms6218_controle_cod_barras_gs1_128() THEN
                   CALL wms6218_mensagem('EAN/Codigo Barras', NULL)
                   NEXT FIELD ean_codigo_barras
                ELSE
                   IF NOT m_encontrou_cod_barras_sku_gs1_128 THEN
                      CALL wms6218_mensagem("EAN/Codigo Barras","Foram encontrados atributos validos para GS1-128 porem nao foi encontrado o SKU\ITEM. Por favor, informe o SKU\Item") 
                      NEXT FIELD ean_codigo_barras
                   END IF
                END IF
             ELSE
                CALL wms6218_mensagem('EAN/Codigo Barras', NULL)
                NEXT FIELD ean_codigo_barras
             END IF
             #MURILO --> Tentar tratar como GS1-128
          ELSE
              #MURILO --> indica que encontrou sku
             IF m_wmsr130_gs1_128_existe THEN
                LET m_encontrou_cod_barras_sku_gs1_128 = TRUE #indica que encontrou atributos gs1-128 e SKU foi informado manualmente ou foi obtido do gs1-128
             END IF
              #MURILO --> indica que encontrou sku
          END IF        
           
          LET mr_item_conferido.item = wmsm86_wms_item_sku_cod_barras_get_item()
          LET mr_item_conferido.sku  = wmsm86_wms_item_sku_cod_barras_get_sku()



 

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