Páginas filhas
  • ER_LOGWMS01-32_Conferencia_Recebimento

Informações Gerais

Especificação

Produto

Logix

Módulo

WMS

Segmento Executor

Supply Chain - Logística - Inovação

Projeto1

LOGWMS01 - Supply Chain - WMS

IRM1

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

Requisito1

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

Subtarefa1

LOGWMS01-335 - Gerar Especificação

País

( x ) Brasil  (  ) Argentina  (  ) México  (  ) Chile  (  ) Paraguai  (  ) Equador

(  ) USA  (  ) Colômbia   (  ) Outro _____________.

Outros

Esta Story (LOGWMS01-32) é a segunda 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.

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

REQ04 LOGWMS01-34 - Tratar GS1-128 na Conferência da Expediçã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

Permitir a leitura de código de barras GS1-128 no programa de Conferência do Recebimento, proporcionando assim mais agilidade no registro das informaçõe

 

Definição da Regra de Negócio

Atualmente na rotina de Conferência do Recebimento o operador precisa informar obrigatoriamente: i) Etiqueta do palete, ii) Etiqueta de identificação de estoque, podendo ser a mesma do palete e ser ou não agrupadora, iii) Código de barras do SKU e  iv) Quantidade de SKUs.

Além destas informações obrigatórias, dependendo da configuração do sistema, o operador deve informar: vi)Quantidade de Itens no SKU e, opcionalmente, pode alterar as informações sugeridas pelo sistema como vii) Unidade de medida, viii) Tipo de estoque x Restrição.  

O objetivo da implementação a ser realizada e descrita por este documento é agilizar o registro das informações, permitindo obtê-las diretamente do código de barras GS1-128, economizando tempo do operador em informar e conferir cada informação.

As informações lidas do código de barras GS1-128 não deverão ser solicitadas ao operador e deverão passar pelas mesmas validações de quando são digitadas pelo operador. Caso alguma informação lida do código de barras GS1-128 seja inválida para o processo, o operador deverá ser notificado e, então, registrar todas as informações manualmente. Vale lembrar que a leitura das informações de etiqueta do palete e de identificação de estoque não sofrerão alterações.

Abaixo, nos itens 1 e 2,  é possível visualizar por meio de imagens um exemplo do comportamento esperado para o funcionamento do programa de conferência do recebimento. No item 3 são detalhados os fluxos alternativos e as afirmações de comportamentos esperados, não abordados ou subentendidos no exemplo e, no item 4, é detalhada a parte técnica, mencionando onde e como as alterações deverão ser realizadas.

  1. Para o exemplo, vamos considerar as seguintes configurações (valores ilustrativos):
    1. Item ACO3NBR6645 com dimensionais:
      1. Lote
      2. Data de produção
      3. Data de validade

    2. Código de barras GS1-128 da embalagem


    3. Configuração GS1-128 
      1. Configuração padrão sugerida pelo Logix WMS, conforme detalhado em LOGWMS01-31 - Configuração, onde:
        • 02 → Código de barras do SKU (DUN14\GTIN14)
        • 11 → Data de produção
        • 17 → Data de validade

  2. Segue abaixo exemplo do comportamento esperado para o sistema na Conferência do Recebimento (WMS6190), quando o depositante da ordem de serviço possuir configuração GS1-128 relacionada ao seu contrato :
    1. Telas inicias da Conferência do Recebimento. As alterações detalhadas por este documento descrevem as alterações que impactam da imagem 4 em diante.

    2. Tela nova para informar mais de um código de barras GS1-128.


    3. Partindo do item b, caso o operador não opte pela opção de teste.



    4. Fluxo alternativo, partindo do item b, caso o operador opte pela opção de teste.



    5. Sequência da imagem do item d,  ao acionar a opção de teste.



    6. Fluxo alternativo partindo do item d, se ocorrer algum erro de leitura.



  3. Algumas informações adicionais para complementar o comportamento esperado para a funcionalidade de GS1-128 não abordados detalhadamente pelo exemplo acima. Em grande parte representam situações de fluxos alternativos, não devendo representar o comportamento usual/normal durante a operação ou são comentários afirmando um comportamento subentendido. 
    1. Item / Item Depositante / Cód. Barras SKU
      • No momento da decodificação do código de barras GS1-128, caso o código de barras GS1-128 possua a informação do item depositante (EAN13\GTIN13), porém não possua a informação do código de barras do SKU (DUN14\GTIN14), o sistema verificará se o item possui apenas um SKU cadastrado. Se sim,  carregará automaticamente o código de barras deste SKU, no campo Código de Barras do SKU. Caso nenhum ou mais de um SKU seja encontrado para o item, o operador deverá ser notificado da falta da informação do código de barras do SKU; as informações do GS1-128 serão desconsideradas e o cursor voltará à tela de Montagem do Palete, no  campo Código de Barras.
        Importante! Caso tenha sido obtida a informação da quantidade de itens no SKU do GS1-128, esta informação será utilizada para tentar encontrar o código de barras do SKU.
      • Se o código de barras do SKU (DUN14\GTIN14) for obtido com sucesso do GS1-128, porém apresente alguma inconsistência de sistema, o operador será notificado, as informações do GS1-128 serão desconsideradas e o cursor voltará à tela de Montagem do Palete, no campo Código de Barras
    2. Dimensionais
      • No momento da decodificação do código de barras GS1-128, caso algum dimensional seja inválido, o operador será notificado, as informações do GS1-128 serão desconsideradas e o cursor voltará à tela de Montagem do Palete, no campo Código de Barras.
      • No momento da decodificação do código de barras GS1-128, se não for obtida a informação do item/SKU, os dimensionais serão lidos do GS1-128 e o cursor voltará ao campo Código de Barras do SKU, para que seja informado um código de barras. Após sair do campo, os dimensionais controlados pelo item terão seus valores atribuídos conforme obtido do GS1-128. Caso algum dimensional seja inválido, o operador será notificado, as informações do GS1-128 serão desconsideradas e o cursor voltará à tela de Montagem do Palete, no campo Código de Barras
      • Os dimensionais obtidos do código de barras GS1-128 que não sejam controlados pelo item serão desconsiderados;
      • Conforme já mencionado, caso todos os dimensionais tenham sido obtidos com sucesso do GS-128, nenhum dimensional será solicitado ao operador;
      • Conforme já mencionado, caso algum dimensional controlado pelo item não esteja no GS1-128, este dimensional, e somente este, será solicitado ao operador.
    3. Unidade de Medida / Tipo de Estoque x Restrição
      • Vale lembrar que estas informações possuem uma chance muita pequena de fazerem parte do código de barras GS1-128, uma vez que a informação ali contida deverá ser conhecida não só pelo WMS Logix, como para qualquer outra entidade à manipular a embalagem.
      • Caso exista a informação de unidade de medida e tipo de estoque x restrição no código de barras GS1-128, estes serão aceitos independentemente se o parâmetro que permite alteração de unidade de medida estiver ativo ou se o operador possuir permissão para alterar tipo de estoque restrição.
      • Se unidade de medida não existir no WMS Logix ou for inválida, o operador será notificado, as informações do GS1-128 serão desconsideradas e o cursor voltará à tela de Montagem do Palete, no campo Código de Barras
      • Se o tipo de estoque x restrição obtido for inválido, o operador será notificado, as informações do GS1-128 serão desconsideradas e o cursor voltará à tela de Montagem do Palete, no campo Código de Barras
    4. Quantidade de Itens no SKU
      • Se a quantidade de itens no SKU obtido do GS1-128 for inválida como, por exemplo, divergente do cadastrado para um item que controle SKU, o operador será notificado, as informações do GS1-128 serão desconsideradas e o cursor voltará à tela de Montagem do Palete, no campo Código de Barras
    5. Quantidade de SKUs
      • Se a quantidade de SKUs for inválida como, por exemplo, ao exceder a capacidade de um palete, o operador será notificado, as informações do GS1-128 serão desconsideradas e o cursor voltará à tela de Montagem do Palete, no campo Código de Barras

  4. Para atingir o resultado esperado, detalhado acima, as seguintes alterações de funções e programas serão necessárias: 
    1. WMSR130 - Função responsável pelas principais regras relacionadas ao GS1-128:

      1. Criar função wmsr130_deposit_utiliza_cod_barras_gs1_128() para verificar se o depositante possui configuração GS1-128 definida.
        • Os parâmetros de empresa e depositante, necessários para a implementação, terão sido setados via wmsr130_set_empresa() e wmsr130_set_deposit.().
        • Se a consulta SQL abaixo retornar NULL, então, o retorno da função deverá ser FALSE, senão retorno deverá ser TRUE.
           

          Sugestão de implementação para verificar se depositante utiliza GS1-128?
          SELECT val_decimal FROM  wms_parametro_complementar WHERE empresa = m empresa AND deposit = m_deposit AND nom_parametro = 'cod_barras_gs1_128'
      2. Criar função wmsr130_decodificacao_encontrou_dimensionais() para identificar se foram encontrados dimensionais na decodificação do GS1-128.
        • Esta função deverá ser acionada após o conjunto de set de parâmetros e a chamada para a função wmsr130_decodifica_gs1_128() ter sido realizada.

        • A função deverá verificar se os dimensionais obtidos da decodificação do GS1-128 possuem valores diferente de NULL e dos valores padrões de inicialização. Os valores padrões de inicialização podem ser consultados na função wms6190_valida_valor_dimensionais(). Abaixo exemplo da implementação esperada:
           

          Exemplo de implementação para verificar se foram encontrados dimensionais no GS1-128.
             ...
             LET l_date_time_null = EXTEND("1900-01-01 00:00:00", YEAR TO SECOND)
             ...
             IF mr_atributos_logix_gs1_128.dat_producao IS NOT NULL AND mr_atributos_logix_gs1_128.dat_producao <> l_date_time_null THEN  
                RETURN TRUE
             END IF 
             ...
             IF mr_atributos_logix_gs1_128.volume IS NOT NULL AND mr_atributos_logix_gs1_128.volume <> 0 THEN  
                RETURN TRUE
             END IF 
             ...
             RETURN FALSE
          END FUNCTION
      3. Criar a função wmsr130_decodificacao_encontrou_atributos() para identificar se foram encontrados atributos na decodificação do GS-128.
        • Esta função deverá ser acionada após o conjunto de set de parâmetros e a chamada para a função wmsr130_decodifica_gs1_128() ter sido realizada.
        • A função deverá verificar se os atributos obtidos da decodificação do GS1-128 possuem valores diferente de null e dos valores padrões de inicialização. Todos os atributos devem ser verificados, inclusive os dimensionais que podem ser verificados pela função wmsr130_decodificacao_encontrou_dimensionais(). Caso algum atributo possua valor, a função deverá retornar TRUE, senão FALSE. Abaixo exemplo da implementação esperada:
           

          Exemplo de implementação para verificar se foram encontrados atributos na decodificação do GS1-128.
              ...
             IF mr_atributos_logix_gs1_128.cod_barras_sku IS NOT NULL AND mr_atributos_logix_gs1_128.cod_barras_sku <> ' ' THEN
                RETURN TRUE
             END IF 
             ...
             IF wmsr130_decodificacao_encontrou_dimensionais()  THEN
                RETURN TRUE
             END IF 
             
             RETUN FALSE 
          END FUNCTION 
      4. Criar a função wmsr130_decodificacao_encontrou_todos_atributos_configurados() para identificar se todos os atributos configurados no WMS6727 foram encontrados no processo de decodificação do GS1-128.
        • Esta função deverá ser acionada após o conjunto de set de parâmetros e a chamada para a função wmsr130_decodifica_gs1_128() ter sido realizada.
        • A função deverá verificar se todos atributos(wms_cod_barras_item_gs1_128) marcados como "Utiliza Processo" = "SIM" (utiliza_processo="S") possuem valor obtido da decodificação. Se sim, retornar TRUE, se não retornar FALSE.
        • Sugestão de implementação:
           

          Sugestão de implementação para verificar se todos os atributos a serem utilizados no processo foram decodificados
          SELECT atributo_logix 
          FROM wms_cod_barras_item_gs1_128 
          WHERE empresa = m_empresa
          AND config_gs1_128 = m_config_gs1_128
          AND utiliza_processo = 'S'
           
          LOOP CADA REGISTRO (CURSOR)
           
             #MURILO --> repetir este bloco IF dentro do loop para cada atributo logix.
             IF atributo_logix = 'ITEM_DEPOSITANTE' THEN
                IF mr_atributo_logix.item_depositante IS NULL OR mr_atributo_logix.item_depositante = " " THEN   
                   RETURN FALSE
                END IF 
             END IF 
             #MURILO --> fim bloco IF, repetir este bloco dentro do loop para cada atributo logix
           
          FIM LOOP
           
          RETURN TRUE
           
      5. Alterar as funções wmsr130_get_<<dimensional>> para retornar os dimensionais lote, peça, número de série, em caixa alta (maíúsculo\UPSHIFT).

    2. WMS6730 - Função responsável por controlar a interface de coletor de dados referente ao GS1-128.

      1. Criar uma nova variável modular m_cod_barras_gs1_128 CHAR(200), responsável por armazenar o primeiro código de barras que poderá ser recebido via set.
      2. Criar uma nova função wms6730_set_cod_barras_gs1_128(l_cod_barras), para que as rotinas externas possam indicar por parâmetro o primeiro código de barras. 
        • A variável l_cod_barras_gs1_128 CHAR(200) deverá setar a variável modular m_cod_barras_gs1_128.
      3. Alterar a função wms6730_solicta_cod_barras_gs1_128() para que, caso tenha recebido por parâmetro um código de barras, verifique se o mesmo possui todas as informações configuradas em WMS6727 - Configuração GS1-128 ou se a quantidade máxima de leitura foi atingida (1). Caso uma das duas condições sejam aceitas, não se faz necessário abrir a tela de input para o operador.
        • Serão descritas abaixo algumas etapas para atingir o objetivo final; o último item é uma sugestão de implementação contemplando todas as etapas mencionadas;
        • Criar variável local l_cod_barras_default CHAR(200) para armazenar o m_cod_barras_gs1_128 recebido por parâmetro através da sua respectiva função set.
        • Caso tenha recebido um código de barras por parâmetro (set), atribuir à variável l_cod_barras_default o valor da variável m_cod_barras_gs1_128 e executar os procedimentos abaixo.
        • Logo antes de realizar o input dos dados, chamar as funções do wmsr130 para que o código de barras armazenado em l_cod_barras_default seja decodificado.
          Caso a função wmsr130_decodifica_gs1_128() retorne FALSE, retornar da função wms6370_solicita_cod_barras_gs1_128() sem realizar nenhuma outra operação.
          Caso a função wmsr130_decodifica_gs1_128 () retorne TRUE, continuar a execução da função wms6370_solicita_cod_barras_gs1_128();
        • Logo após a decodificação, verificar se a quantidade máxima de código de barras é 1 (um).
          Se sim, retornar da função wms6370_solicita_cod_barras_gs1_128() sem realizar nenhuma outra operação.
          Se a quantidade máxima for diferente de 1 (um), continuar a execução da função wms6370_solicita_cod_barras_gs1_128().
        • Em seguida, verificar se todos os atributos configurados foram identificados; utilizar a função wmsr130_decodificacao_encontrou_todos_atributos_configurados().
           
          Se retornar TRUE, retornar da função wms6370_solicita_cod_barras_gs1_128() sem realizar nenhuma outra operação.
        • Por fim, caso tenha sido recebido o código de barras por parâmetro e ainda serão solicitados outros códigos de barras GS1-128, atribuir o primeiro código de barras ao array.
        • Segue abaixo sugestão de implementação:

          Sugestão de implementação para que ao receber um código de barras por parâmetro solicite ou não os demais códigos de barras.
          DEFINE l_cod_barras_default CHAR(200)
           
          ....
          #MURILO sugestao para adicionar bloo de codigo antes do input
          IF m_cod_barras_gs1_128 IS NOT NULL AND m_cod_barras_gs1_128 <> " " THEN
             LET l_cod_barras_default  = m_cod_barras_gs1_128 
             CALL wmsr130_set_null()
             CALL wmsr130_set_empresa(m_empresa)
             CALL wmsr130_set_depositante(m_depositante)
             CALL wmsr130_set_modo_exibicao(1)
             CALL wmsr130_add_cod_barras_gs1_128(l_cod_barras_default  )
             IF NOT wmsr130_decodifica_gs1_128() THEN   
                 RETURN 
             END IF 
           
             IF l_qtd_max_cod_barras IS NOT NULL AND l_qtd_max_cod_barras = 1 THEN 
                RETURN
             END IF 
           
             IF wmsr130_decodificacao_encontrou_todos_atributos_configurados() THEN
                RETURN
             END IF 
           
             LET ma_cod_barras_gs1_128[1].cod_barras_gs1_128 = l_cod_barras_gs1_128_default
             CALL set_count(2)
          END IF 
          #MURILO fim sugestao para adicionar bloco de codigo antes do input
          INPUT ARRAY ......


      4. Alterar input de dados da função wms6370_solicita_cod_barras_gs1_128() , evento before field cod_barras_gs1_128 para que caso tenha recebido algum código de barras por parâmetro posicione o cursor na segunda linha do array.
        • Segue abaixo sugestão de implementação

          Sugestão de implementação para que ao receber um código de barras por parâmetro posicione o curso na segunda linha do array.
             IF l_arr_curr = 1 THEN
                IF l_cod_barras_gs1_128_default IS NOT NULL 
                AND l_cod_barras_gs1_128_default <> " " THEN
                   LET l_cod_barras_gs1_128_default = NULL
                   CALL fgl_dialog_setcurrline(2,2)
                END IF
             END IF 
      5. Criar uma nova variável modular m_leitura_teste SMALLINT responsável por controlar quando uma leitura de código de barras GS1-128 será ou não teste.
      6. Criar função wms6730_set_leitura_teste(l_leitura_teste) para que rotinas externas possam indicar se tela deverá abrir como leitura teste ou não.
        • A variável l_leitura_teste SMALLINT recebida por parâmetro deverá setar a variável modular m_leitura_teste.
      7. Alterar a função wms6730_set_null() para inicializar a variável m_leitura_teste como TRUE.
        • Deverá receber l_leitura_teste SMALLINT como parâmetro e setar a variável modular m_leitura_teste;
      8. Alterar função wms6730_solicita_cod_barras_gs1_128() para que as opções disponíveis por teclas de função sejam alteradas quando a rotina origem for diferente do WMS6728 - Teste Leitura GS1-128.
        • Caso m_leitura_teste esteja como TRUE, então escrever em tela "Leitura teste" em tela  conforme demonstrado através de imagem nos exemplos acima (tela 5.2.1)
        • No input de dados, no evento disparado ao pressionar F10 (ON KEY F10), quando a rotina origem for diferente de WMS6728 exibir "<ESC> Voltar", "F4/CTRL-L Confirma" e "F8/CTRL-O Ini Test" quando m_leitura_teste = FALSE e "F8/CTRL-O Fim Test" quando m_leitura = TRUE . Quando rotina origem for WMS6728 - Teste Leitura GS1-128 permanecer "<ESC> Voltar" e "F4/CTRL-K Confirma";
        • No input de dados, no evento disparado ao pressionar F8 (ON KEY F8), caso a rotina origem seja diferente de WMS6728 atribuir TRUE para a variável m_leitura_teste caso ela esteja como FALSE, e atribuir FALSE caso ela esteja como TRUE. Ao atribuir TRUE escrever em tela "Leitura teste" conforme demonstrado através de imagem nos exemplos acima (tela 5.2.1). Ao atribuir FALSE apagar "Leitura teste" da tela.
      9. Alterar a função wms6730_processa_cod_barras_gs1_128() para que não apresente em tela os atributos decodificados do GS1-128 caso a rotina origem seja diferente de WMS6728 - Teste Leitura GS1-128 ou caso a leitura não seja teste.
        • Se m_leitura_teste = FALSE então não apresentar os atributos decodificados do GS1-128 em tela.
        • Se m_leitura_teste = TRUE , continuar apresentando em tela os atributos obtidos do GS1-128.
      10. Nota! Como resultado final, independente da rotina origem e do tipo de leitura (teste ou não) manter a validação que não permite informar códigos de barras GS1-128 repetidos, e da leitura máxima de códigos de barras para disparar a decodificação.

    3. WMS6190 - Conferência do Recebimento

      1. Antes de detalhar cada alteração necessária, vale explicar o objetivo geral da maior parte do esforço. Como será necessário ler as informações do código de barras GS1-128, validá-las e não solicitar a informação ao operador, será preciso encapsular em funções as validações hoje realizadas na estrutura de input de dados através dos eventos after field. Encapsulando em funções será possível chamar estas rotinas de validação em outras situação como, por exemplo, logo após a leitura dos atributos do GS1-128.
      2. Ainda sem mencionar uma alteração específica e explicando o objetivo das alterações neste programa, vale explicar de que modo se estruturou a forma de implementação das alterações:
        • Ao informar o código de barras do SKU (after field cod_barras), caso o código informado não esteja cadastrado no WMS6173 - Cadastro de SKU o sistema deverá verificar se  o depositante da ordem de serviço possui uma configuração de GS1-128 relacionada ao contrato.
        • Caso o depositante não possua a configuração de GS1-128, o operador será notificado que não foi possível encontrar um Item/SKU. 
        • Caso o depositante possua a configuração de GS1-128, o sistema deverá tentar decodificar o código de barras informado a fim de identificar se o código de barras informado é um GS1-128. 
        • Caso não consiga decodificar, o usuário deverá ser notificado que não foi possível encontrar item/SKU. 
        • Caso consiga decodificar alguma informação, deverá verificar se as informações obtidas do GS1-128 são válidas para o processo e se foi possível obter todas as informações configuradas no WMS6727 - Configuração GS1-128. 
        • Caso alguma informação seja inválida, o usuário será notificado e o cursor deverá voltar para o campo código de barras do SKU e as informações obtidas do GS1-128 deverão ser desconsideradas. 
        • Caso as informações decodificadas sejam válidas, porém, nem todos os atributos configurados foram obtidos do código de barras, então, a tela de códigos GS1-128 deverá ser aberta para que o operador informe todos os códigos de barras GS1-128 da embalagem. Caso alguma informação obtida do GS1-128 seja inválida, o usuário será notificado, o cursor deverá voltar para o campo Código de Barras do SKU e todas as informações obtidas do GS1-128 deverão ser desconsideradas.
        • Caso as informações decodificadas sejam válidas e todos os atributos válidos tenham sido obtidos do código de barras, ou então após obter todos os códigos GS1-128 com sucesso, o cursor será posicionado no próximo campo não obtido do GS1-128. Caso todas as informações obrigatórias tenham sido obtidas, a tela para montagem de um novo palete será apresentada.
      3. Para atender os itens i) e ii) todas as alterações abaixo serão necessárias.
      4. Criar função wms6190_valid_cod_unid_med() para centralizar as validações referentes à unidade de medida. 

        • Incluir o bloco de código mencionado abaixo, foi copiado do próprio after field cod_unid_med do input de dados da função wms6190_processo_conferencia(). Por conta disso, substituir a instrução NEXT FIELD cod_unid_med por RETURN FALSE. Ao final da função retornar TRUE. 

          Bloco de código responsável por validar unidade de medida.
            IF  mr_conferencia.cod_unid_med IS NOT NULL
                  AND mr_conferencia.cod_unid_med <> ' ' THEN
                     IF m_cod_unid_med_orig <> mr_conferencia.cod_unid_med THEN
                        IF NOT wms6190_busca_fator_conversao() THEN
                           NEXT FIELD cod_unid_med
                        END IF
                     ELSE
                        LET m_fat_conver_unid = 1
                     END IF
                     IF m_fat_conver_unid IS NULL
                     OR m_fat_conver_unid = ' ' THEN
                        LET l_msg = "Fator de conversao nao encontrado."
                        CALL wms6190_help(l_msg)
                        NEXT FIELD cod_unid_med
                     END IF
                  ELSE
                     LET l_msg = "Unidade de medida deve ser informada."
                     CALL wms6190_help(l_msg)
                     NEXT FIELD cod_unid_med
                  END IF
      5. Criar a função wms6190_valid_qtd_item() para centralizar as validações referentes à quantidade de itens no SKU.
        • Incluir o bloco de código mencionado abaixo, foi copiado do próprio after field qtd_item do input de dados da função wms6190_processo_conferencia(). Por conta disso, substituir a instrução NEXT FIELD qtd_Item por RETURN FALSE. Ao final da função retornar TRUE.

          Bloco de código responsável por validar quantidade de itens no SKU.
                       IF mr_conferencia.qtd_item IS NULL OR  mr_conferencia.qtd_item < 0 THEN
                           NEXT FIELD qtd_item
                        END IF
          
                        IF wmsm81_wms_item_complemento_leitura(mr_parametros.empresa,
                                                               mr_conferencia.item,FALSE,1) THEN
                           LET l_controla_sku = wmsm81_wms_item_complemento_get_controla_sku()
                        END IF
                        IF l_controla_sku CLIPPED IS NULL THEN
                           LET l_controla_sku = 'S'
                        END IF
                        IF l_controla_sku = 'S' THEN
                           IF mr_conferencia.qtd_item <> m_qtd_item THEN
                              LET l_msg = "Quantidade incorreta de item no SKU."
                              CALL wms6190_help(l_msg)
                              NEXT FIELD qtd_item
                           END IF
                        END IF
      6. Criar função wms6190_valid_lastro_palete() para centralizar as validações referente ao lastro do palete.
        • Incluir o bloco de código mencionado abaixo, foi copiado do próprio after field qtd_sku do input de dados da função wms6190_processo_conferencia(). Por conta disso, substituir a instrução NEXT FIELD qtd_sku por RETURN FALSE. Ao final da função retornar TRUE.

          Bloco de código responsável por validar o lasto do palete.
                       # Lastro:
                        # - verificar se existe apenas o produto atual e o sku atual no palete
                        #   se existir apenas o atual, verifica a quantidade ja existente mais a nova se passa do lastro
                        #   senao nao valida lastro
                       IF  mr_conferencia.qtd_sku IS NOT NULL AND mr_conferencia.qtd_sku > 0THEN
                            WHENEVER ERROR CONTINUE
                            SELECT DISTINCT wms_iden_estoque_conferencia.item,
                                   wms_iden_estoque_conferencia.sku
                              FROM wms_iden_estoque_conferencia
                             WHERE wms_iden_estoque_conferencia.empresa = mr_parametros.empresa
                               AND wms_iden_estoque_conferencia.palete = mr_conferencia.etiq_palete
                               AND wms_iden_estoque_conferencia.identif_estoque <> mr_conferencia.etiq_estoque
                               AND ( wms_iden_estoque_conferencia.item <> mr_conferencia.item
                                OR wms_iden_estoque_conferencia.sku <> mr_conferencia.sku )
                            WHENEVER ERROR STOP
                            IF  sqlca.sqlcode <> 0 AND sqlca.sqlcode <> NOTFOUND AND sqlca.sqlcode <> -284 THEN
                                LET l_msg = "Falha! SELECT wms_iden_estoque_conferencia"
                                CALL wms6190_help(l_msg)
                                NEXT FIELD qtd_sku
                            END IF
                            IF sqlca.sqlcode = NOTFOUND THEN
                               #Verificar se deve controlar lastro/altura
                               IF m_controla_lastro_altura IS NULL OR
                                  m_controla_lastro_altura = 'P' THEN
                                  LET m_controla_lastro_altura = m_wms_valida_lastro_recebto
                               END IF
                               IF m_controla_lastro_altura = "S" THEN
                                  # verifica a quantidade de sku ja existente para o item/sku atual
                                  WHENEVER ERROR CONTINUE
                                  SELECT SUM(wms_iden_estoque_conferencia.qtd_sku)
                                    INTO l_qtd_sku
                                    FROM wms_iden_estoque_conferencia
                                   WHERE wms_iden_estoque_conferencia.empresa = mr_parametros.empresa
                                     AND wms_iden_estoque_conferencia.palete = mr_conferencia.etiq_palete
                                     AND wms_iden_estoque_conferencia.identif_estoque <> mr_conferencia.etiq_estoque
                                     AND wms_iden_estoque_conferencia.item = mr_conferencia.item
                                     AND wms_iden_estoque_conferencia.sku = mr_conferencia.sku
                                  WHENEVER ERROR STOP
                                  IF sqlca.sqlcode <> 0 AND sqlca.sqlcode <> NOTFOUND THEN
                                     LET l_msg = "Falha! SELECT wms_iden_estoque_conferencia"
                                     CALL wms6190_help(l_msg)
                                     NEXT FIELD qtd_sku
                                  END IF
                                  IF l_qtd_sku IS NULL THEN
                                     LET l_qtd_sku = 0
                                  END IF
                                  IF ( l_qtd_sku + mr_conferencia.qtd_sku ) > ( m_qtd_caixa_altura * m_qtd_caixa_lastro ) THEN
                                     LET l_msg = "Quantidade de SKU ultrapassa o lastro do item."
                                     CALL wms6190_help(l_msg)
                                     IF m_cod_unid_med_orig <> mr_conferencia.cod_unid_med THEN
                                        LET mr_conferencia.qtd_sku = mr_conferencia.qtd_sku / m_fat_conver_unid
                                     END IF
                                     NEXT FIELD qtd_sku
                                  END IF
                               END IF
                            END IF
                        END IF  
      7. Criar função wms6190_valid_peso_palete() para centralizar as validações referentes à capacidade de peso do palete.
        • Incluir o bloco de código mencionado abaixo, foi copiado do próprio after field qtd_sku do input de dados da função wms6190_processo_conferencia(). Por conta disso, substituir a instrução NEXT FIELD qtd_sku por RETURN FALSE. Ao final da função retornar TRUE.

          Bloco de código responsável por validar a capacidade máxima de peso no palete.
                       IF  mr_conferencia.qtd_sku IS NOT NULL AND mr_conferencia.qtd_sku > 0THEN
                            ##Início - OS 588253
                            #Retorna peso dos itens no palete                  
                            WHENEVER ERROR CONTINUE
                            SELECT SUM(wms_iden_estoque_conferencia.qtd_sku * wms_item_sku.peso_bruto)
                              INTO l_peso_armazenado_sku
                              FROM wms_iden_estoque_conferencia, wms_item_sku
                             WHERE wms_iden_estoque_conferencia.empresa = wms_item_sku.empresa
                               AND wms_iden_estoque_conferencia.item = wms_item_sku.item
                               AND wms_iden_estoque_conferencia.sku = wms_item_sku.sku
                               AND wms_iden_estoque_conferencia.identif_estoque <> mr_conferencia.etiq_estoque
                               AND wms_iden_estoque_conferencia.empresa = mr_parametros.empresa
                               AND wms_iden_estoque_conferencia.palete = mr_conferencia.etiq_palete
                            WHENEVER ERROR STOP
                            IF  sqlca.sqlcode <> 0 AND sqlca.sqlcode <> NOTFOUND THEN
                                LET l_msg = "Falha! SELECT wms_iden_estoque_conferencia"
                                CALL wms6190_help(l_msg)
                                NEXT FIELD qtd_sku
                            END IF
                            IF l_peso_armazenado_sku IS NULL THEN
                               LET l_peso_armazenado_sku = 0
                            END IF
                            #Retorna tipo do palete
                            CALL wmsr21_retorna_tip_palete(mr_parametros.empresa,
                                                           mr_conferencia.etiq_palete,
                                                           mr_conferencia.item,
                                                           mr_conferencia.sku)
                               RETURNING l_status, l_tip_palete, l_msg
                            IF l_status THEN
                               IF l_tip_palete IS NULL
                               OR l_tip_palete = ' ' THEN
                                  CALL wmst251_retorna_tip_palete_padrao(mr_parametros.empresa,1) RETURNING l_status,l_tip_palete
                                  IF NOT l_status THEN
                                     LET l_msg = log0030_mensagem_get_texto()
                                     CALL wms6190_help(l_msg)
                                     NEXT FIELD qtd_sku
                                  END IF
                               END IF
                               IF l_controla_sku = 'S' THEN
                                  #Verifica se o palete suporta o peso dos itens
                                  CALL wmsr21_verifica_palete_suporta_peso(mr_parametros.empresa,
                                                                           l_tip_palete,
                                                                           mr_conferencia.item,
                                                                           mr_conferencia.sku,
                                                                           l_peso_armazenado_sku,
                                                                           mr_conferencia.qtd_sku)
                                     RETURNING l_status, l_msg
                               ELSE
                                  LET l_qtd_itens = mr_conferencia.qtd_sku * mr_conferencia.qtd_item
                                  #Verifica se o palete suporta o peso dos itens
                                  CALL wmsr21_verifica_palete_suporta_peso_sem_sku(mr_parametros.empresa,
                                                                                   l_tip_palete,
                                                                                   mr_conferencia.item,
                                                                                   mr_conferencia.sku,
                                                                                   l_peso_armazenado_sku,
                                                                                   l_qtd_itens)
                                     RETURNING l_status, l_msg
                               END IF
                            END IF
                            IF NOT l_status THEN
                               CALL wms6190_help(l_msg)
                               IF m_cod_unid_med_orig <> mr_conferencia.cod_unid_med THEN
                                  LET mr_conferencia.qtd_sku = mr_conferencia.qtd_sku / m_fat_conver_unid
                               END IF
                               NEXT FIELD qtd_sku
                            END IF
                            ##Fim - OS 588253
                        END IF
      8. Criar função wms6190_valid_qtd_sku() para centralizar as validações referente a quantidade de SKUs.
        • Incluir o conjunto de bloco de código na mesma sequência da mencionada abaixo, foi copiado do próprio after field qtd_sku do input de dados da função wms6190_processo_conferencia(). Por  conta disso, substituir a instrução NEXT FIELD qtd_sku por RETURN FALSE. Ao final da função retornar TRUE.

          Bloco de código responsável por validar a quantidade de skus.
                        IF  mr_conferencia.qtd_sku IS NULL OR mr_conferencia.qtd_sku < 0 THEN
                            NEXT FIELD qtd_sku
                        END IF
                        IF  mr_conferencia.qtd_sku <> 0 AND mr_conferencia.qtd_item = 0 THEN
                           LET l_msg = "Quantidade incorreta de item no  SKU."
                           CALL wms6190_help(l_msg)
                           NEXT FIELD qtd_item
                        END IF
                        IF NOT wmsm134_wms_iden_estoque_conferencia_validate_qtd_sku(mr_conferencia.qtd_sku,1) THEN
                           NEXT FIELD qtd_sku
                        END IF
        • Após as validações acima referentes à quantidade de SKU, efetuar  chamada para as funções wms6190_valid_peso_palete(), wms6190_valid_lastro_palete(). Este conjunto de código deve fazer parte da função wms6190_valid_qtd_sku().

      9. Criar função wms6190_valid_numero_serie() para centralizar as validações referentes ao dimensional número de série.
        • Atualmente a validação de número de série consiste em verificar e garantir que não existe outro número de série igual para o mesmo item no estoque. O número de série deve ser o identificador único do item.
        • Incluir o bloco de código mencionado abaixo, foi copiado do próprio after field valor do input de dados da função wms6190_informa_dimensional(). Por conta disso, substituir a instrução NEXT FIELD valor por RETURN FALSE e remover a instrução CURRENT WINDOW. Ao final da função retornar TRUE. 

          Bloco de código responsável por validar o dimensional número de série.
                         IF  mr_dimensional.num_serie IS NULL AND mr_dimensional.num_serie = " " THEN
                               RETURN FALSE
                          END IF 
               
                            WHENEVER ERROR CONTINUE
                            SELECT 1
                              FROM estoque_lote_ender
                             WHERE estoque_lote_ender.cod_empresa = mr_parametros.empresa
                               AND estoque_lote_ender.cod_item = mr_conferencia.item
                               AND estoque_lote_ender.num_serie = mr_dimensional.num_serie
                               AND estoque_lote_ender.qtd_saldo > 0
                               AND estoque_lote_ender.identif_estoque <> mr_conferencia.etiq_estoque
                            WHENEVER ERROR STOP
                            IF  sqlca.sqlcode = 0 OR sqlca.sqlcode = -284 THEN
                                LET l_msg = "Ja existe ocorrencia no estoque para o numero de serie informado. Recebimento nao permitido."
                                CALL wms6190_help(l_msg)
                                CURRENT WINDOW IS w_wms6190c
                                NEXT FIELD valor
                            END IF
          
      10. Criar função wms6190_valid_dt_hor_validade() para centralizar as validações referentes ao dimensional data de validade.
        • Atualmente a validação existente para a data de validade é o prazo máximo para recebimento. O item possui uma parametrização de quantidade de dias máximo para vencimento a partir da data de recebimento. Se a data atual mais este prazo máximo for maior que o prazo de validade, significa que este produto vence em uma data inferior ao aceito para o item.

        • Caso a variável do  item da tela não tenha sido carregado, então a função deverá retornar FALSE.
        • Incluir o bloco de código mencionado abaixo, foi copiado do próprio after field valor do input de dados da função wms6190_informa_dimensional(), por conta disso substituir a instrução NEXT FIELD valor por RETURN FALSE e remover a instrução CURRENT WINDOW. Ao final da função retornar TRUE

          Sugestão de implementação para validar o dimensional data de validade.
                   IF mr_conferencia.item IS NULL OR mr_conferencia.item = ""  
                        RETURN FALSE
                   END IF 
           
                      LET l_dias = wmsm81_wms_item_complemento_get_qtd_dia_prazo_maximo_recebto()
                        IF  l_dias IS NOT NULL AND l_dias > 0 THEN
                            LET l_data_calc = CURRENT YEAR TO SECOND + l_dias UNITS DAY
                            IF  l_data_calc > mr_dimensional.dat_validade THEN
                                # Não permitir o recebimento
                                LET l_msg = "Data de validade ultrapassa o prazo maximo para recebimento. Recebimento nao permitido."
                                CALL wms6190_help(l_msg)
                                CURRENT WINDOW IS w_wms6190c
                                NEXT FIELD valor
                            END IF
                        END IF
      11. As alterações realizadas no WMS6190 até aqui consistiram no encapsulamento em funções das principais regras de validação dos campos. As próximas alterações a serem mencionadas abaixo tem o objetivo de iniciar a preparação das funções para leitura e tratamento do código de barras GS1-128 e fará uso de todas as funções criadas até aqui.
      12. 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.
      13. 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.
      14. Alterar função wms6190_recebimento_conferencia para inicializar o valor da variável modular e verificar a existência ou não do wmsr130.
        • Segue sugestão de implementação:

          Bloco 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.
            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 = TRUE
            END IF 
      15. Criar função wms6190_set_dimensionais_gs1_128() para carregar os valores dos dimensionais controlados pelo item com os valores obtidos do GS1-128.
        • Verificar quais são os dimensionais controlados pelo item e carregar os records de tela com os valores obtidos do GS1-128. Os dimensionais que possam ter sido capturados pelo GS1-128, porém, não são controlados pelo item não devem ter seu valor carregado nos records de tela.
        • Para verificar se o item controla lote utilizar manm5_item_leitura(empresa, item, FALSE,1) e manm5_item_get_ies_ctr_lote(). Para verificar se o item controla os demais dimensionais utilizar manm8_item_ctr_grade_leitura(empresa,0,0,0,0,0,item,TRUE,1) e manm8_item_ctr_grade_get_<<dimensional>>(). 
        • Ao identificar o controle de um determinado dimensional, verificar se este dimensional foi lido do código de barras GS1-128, verificando se  wmsr130_get_<<dimensional>>() não é nulo e é diferente do valor padrão de inicialização. 
        • O item controlando um determinado dimensional e este possuindo valor lido do GS1-128, o record de tela mr_dimensional.<<dimensional>> deverá ser preenchido.
        • Para os dimensionais data de validade e número de série, logo após atribuir valor para o mr_dimensional, validar se os valores são válidos através das funções wms6190_valid_dt_hor_validade()wms6190_valid_numero_serie() respectivamente. Sendo o valor inválido, retornar FALSE para a função wms6190_set_dimensionais_gs1_128().
        • Ao final da função chamar a função wms6190_valida_valor_dimensionais() para corrigir possíveis problemas de inicialização de valores inválidos para os dimensionais e retornar TRUE.
        • Segue exemplo da implementação esperada considerando os itens acima mencionados:

          Sugestão para implementação dos valores do código de barras gs1-128 ao record de tela dos dimensionais.
          ...
          IF  manm5_item_leitura(empresa, item, FALSE,1) THEN
             IF manm5_item_get_ies_ctr_lote() = "s" THEN
                IF wmsr130_get_lote() IS NOT NULL AND wmsr130_get_lote() <> " "THEN  
                   LET mr_dimensional.lote =  wmsr130_get_lote()
                END IF 
             END IF 
          END IF
          ...
          IF manm8_item_ctr_grade_leitura(empresa,0,0,0,0,0,item,TRUE,1)  THEN
             IF  manm8_item_ctr_grade_get_ies_dat_validade() = "S" THEN
                IF wmsr130_get_data_validade() IS NOT NULL AND wmsr130_get_data_validade() <> l_date_time_null THEN  
                   LET mr_dimensional.dat_validade =  wmsr130_get_data_validade()
                   IF NOT wms6190_valid_dt_hor_validade() THEN
                      RETURN FALSE
                  END IF  
                END IF  
             END IF 
          END IF
          ...
          CALL wms6190_valida_valor_dimensionais()
          RETURN TRUE
      16. Alterar a função wms6190_verifica_existe_conferencia() para carregar variáveis de controle de input dos dimensionais, caso estes tenham sido obtidos do GS1-128.
        • Caso o dimensional tenha sido lido do GS1-128, o dimensional não deverá ser solicitado ao operador, sendo assim, o ma_dimensionais e o ma_dimensionais_aux não devem ser carregados para este dimensional. Segue abaixo a sugestão de implementação.O exemplo abaixo é para o dimensional lote; replicar o trecho comentado com "#MURILO" para cada bloco de dimensional existente na função wms6190_verifica_existe_conferencia().

          Sugestão de implementação para que não seja solicitado ao operador um dimensional válido obtido do GS1-128. Caso não seja válido, dimensional poderá ser apresentado ao operador com o valor obtido do GS1-128.
          IF l_ies_ctr_lote = "S" THEN  
               #MURILO referente gs1-128 inicio
               LET l_encontrou_dimensional_gs1_128 = FALSE
               IF m_wmsr130_gs1_128_existe THEN
                  IF wmsr130_get_<<dimensional>>() IS NOT NULL AND wmsr130_get_<<dimensional>>() <> " "  THEN
                     LET l_encontrou_dimensional_gs1_128 = TRUE       
                  END IF 
               END IF 
               #MURILO referente gs1-128 fim     
               IF NOT  l_encontrou_dimensional_gs1_128 THEN    #MURILO caso ja tenha encontrado o dimensional nao carrega ma
                  LET l_status = TRUE
                  LET l_ind = l_ind + 1
                  LET ma_dimensionais_aux[l_ind].label = "den_lote"
                  IF supm5_par_sup_pad_leitura(p_cod_empresa,"den_lote",TRUE,1) THEN
                     LET ma_dimensionais[l_ind].label = supm5_par_sup_pad_get_par_txt()
                  END IF
                  IF ma_dimensionais[l_ind].label IS NULL
                  OR ma_dimensionais[l_ind].label = " " THEN
                     LET ma_dimensionais[l_ind].label = "Lote"
                  END IF
                  LET ma_dimensionais_aux[l_ind].tipo = "CHAR"
                  LET ma_dimensionais[l_ind].valor    = lr_dimensionais.lote_item
               END IF       
            END IF
      17. Alterar A função wms6190_verifica_dimensional_item_conferencia() para carregar somente as informações dos dimensionais do item anterior ,caso não tenha sido obtido os dimensionais de um GS1-128. Os dimensionais lidos do GS1-128 devem prevalecer sobre os informados anteriormente para o item. Para isso, seguir os passos abaixo:
        • Após capturar os dimensionais do último item através da consulta SQL sobre a estoque_lote_ender, verificar se nenhum dos dimensionais foi obtido através do GS1-128. Se sim, os valores destes dimensionais do GS1-128 deverão ser atribuídos ao record mr_dimensional. Para isso, logo após a consulta SQL aplicar o exemplo abaixo para todos os dimensionais:

          Sugestão de implementação para sobrescrever os dimensionais do último pelos dimensionais obtidos do GS1-128.
          ....
          FROM estoque_lote_ender
                  WHERE estoque_lote_ender.cod_empresa     = p_cod_empresa
                    AND estoque_lote_ender.identif_estoque = l_identif_estoque
                    AND estoque_lote_ender.deposit         = m_depositante
               WHENEVER ERROR STOP
               IF sqlca.sqlcode <> 0 THEN
                  RETURN FALSE
               END IF
           
              #MURILO
               IF m_wmsr130_gs1_128_existe THEN
                   #MURILO fazer o bloco de iIF para cada dimensional  
                  IF wmsr130_get_<<dimensional>> <> valor_null_padrao THEN
                     LET mr_dimensional<<dimensional>> = wmsr130_get_<<dimensional>>
                  END IF
               END IF
             #MURILO
             .....
          ELSE
          ....
        • Caso o parâmetro que permite sugerir informações da última identificação de estoque lida para o item esteja desabilitado (m_repete_item_identif_anterior = 'N'), não limpar o record de dimensionais. Segue sugestão de implementação:

          Sugestão de implementação para não limpar o record com valores dos dimensionais caso algum dimensional tenha sido obtido do GS1-128.
          ....      
               #MURILO
               IF NOT m_wmsr130_gs1_128_existe THEN 
                  INITIALIZE mr_dimensional.* TO NULL
               ELSE
                  IF NOT wmsr130_decodificacao_encontrou_dimensionais() THEN
                     INITIALIZE mr_dimensional.* TO NULL
                  END IF 
               END IF
          END IF 
           
          RETURN TRUE
           
          END FUNCTION
      18. Alterar a função wms6190_verifica_dimensional() para 1) preparar para exibição somente os dimensionais não obtidos pelo GS1-128, 2) não limpar os campos volume, num_peca, num_serie, 3) não carregar os arrays de record responsáveis por solicitador ao operador os dimensionais com os registros dos dimensionais obtidos do GS1-128.
        • Não reinicializar ma_dimensionais e mr_dimensional caso a função wms6190_verifica_dimensional_item_conferencia() tenha retornado FALSE, pois isso pagaria os valores previamente carregados pela leitura do GS1-128. Para isso, segue sugestão abaixo:

          Sugestão de implementação para não reinicializar ma_dimensionais e mr_dimensional caso wms6190_verifica_dimensional_item_conferencia() tenha retornado FALSE.
                  #MURILO somente limpar caso não tenha sido lido dimensionais atraves do GS1-128
                  IF NOT m_wmsr130_gs1_128_existe THEN 
                     INITIALIZE ma_dimensionais, mr_dimensional.* TO NULL
                  ELSE
                     IF NOT wmsr130_decodificacao_encontrou_dimensionais() THEN
                        INITIALIZE ma_dimensionais, mr_dimensional.* TO NULL
                     END IF 
                  END IF 
                  #MURILO
        • Não limpar os valores dos dimensionais volume, peça e número de série, caso tenham sido obtidos através do GS1-128.

          Sugestão de implementação para não limpar os valores dos dimensionais volume, peça, número de série caso estes tenham sido obtidos do GS1-128.
          ....
            END IF
           
            LET mr_dimensional.volume = NULL
            #MURILO caso tenha sido lido algum valor do GS1-128 manter este valor
            IF m_wmsr130_gs1_128_existe THEN
               IF wmsr130_get_<<dimensional>> <> valor_padrao_nulo THEN
                  LET mr_dimensional.volume = wmsr130_get_<<dimensional>>
               END IF
            END IF    
          ...
            IF l_ies_ctr_lote = "S" THEN
        • Alteração para que não seja carregado o ma_dimensionais com dimensionais obtidos do GS1-128 (similar ao item xv). Desta forma, os dimensionais obtidos do GS1-128 não serão apresentados ao operador. Repetir implementação para cada bloco de dimensional.

          Sugestão de implementação para não carregar os arrays de record ma_dimensioanis e ma_dimensionais_aux com dimensionais válidos obtidos do GS1-128.
          IF l_ies_ctr_lote = "S" THEN
             #MURILO  alteracao para pedir apenas dimensionais nao identificados na etiqueta gs1-128 
             LET l_encontrou_dimensional_gs1_128 = FALSE
             IF m_wmsr130_gs1_128_existe THEN
                  IF wmsr130_get_lote() IS NOT NULL AND wmsr130_get_lote() <> " " THEN
                     LET l_encontrou_dimensional_gs1_128 = TRUE       
                  END IF  
             END IF
          END IF 
               #MURILO
          
              #MURILO 
              IF NOT  l_encontrou_dimensional_gs1_128 THEN
              #MURILO
                  LET l_status = TRUE
                  LET l_ind = l_ind + 1
                  LET ma_dimensionais_aux[l_ind].label = "den_lote"
                  IF supm5_par_sup_pad_leitura(p_cod_empresa , "den_lote",  TRUE, 1) THEN
                     LET ma_dimensionais[l_ind].label = supm5_par_sup_pad_get_par_txt()
                  END IF
                  IF ma_dimensionais[l_ind].label IS NULL OR ma_dimensionais[l_ind].label = " " THEN
                     LET ma_dimensionais[l_ind].label = "Lote"
                  END IF
                  LET ma_dimensionais_aux[l_ind].tipo = "CHAR"
                  LET ma_dimensionais[l_ind].valor = mr_dimensional.lote
               END IF 
           #MURILO  
          END IF
           #MURILO
      19. Criar função wms6190_valid_tipo_estoque_restricao() para centralizar as validações referentes a um tipo de estoque x restrição diferente do padrão sugerido inicialmente pela conferência do recebimento.
        • A função para validação do tipo de estoque x restrição deverá validar se o tipo de estoque x restrição obtido do GS1-128 não é de falta de inventário, reconferência da expedição e cross docking. Para isso, segue abaixo sugestão de implementação mais abaixo. Receber como parâmetro tip_estoque e restricao para ser validado pela função.
        • Este trecho de código foi copiado da função wms6190_zoom_f7(), onde atualmente se encontra a validação do tipo de estoque restrição ao acionar a opção de troca.

          Sugestão de implementação para validação de tipo de estoque x restrição permitidos na conferência do recebimento.
          LET m_sel_tip_estoque_falta_inv = FALSE
            IF wmsr51_verifica_tipo_estoque_falta_inventario(mr_parametros.empresa,l_tip_estoque) THEN
               CALL wms6190_help("Tipo de estoque de falta de inventario nao pode ser usado na conferencia.")
               LET m_sel_tip_estoque_falta_inv = TRUE
               RETURN FALSE
            END IF
            IF wmsr90_verifica_tip_estoque_restricao(mr_parametros.empresa,l_tip_estoque,l_restricao) THEN
               CALL wms6190_help("Tipo de estoque/restricao de reconferencia da expedicao nao pode ser usado na conferencia.")
               RETURN FALSE 
            END IF
            IF find4GLFunction('wmsr81_eh_tip_estoque_restricao_cross_docking') THEN
               CALL wmsr81_eh_tip_estoque_restricao_cross_docking(mr_parametros.empresa,
                                                                  m_depositante        ,
                                                                  l_tip_estoque        ,
                                                                  l_restricao          ,
                                                                  1  )
                  RETURNING l_eh_tip_cross_docking
               IF m_conferencia_cross_docking  = "S" THEN
                  IF NOT l_eh_tip_cross_docking THEN
                     CALL wms6190_help("Deve ser utilizado tipo de estoque e restricao cross-docking.")
                     RETURN FALSE
                  END IF
               ELSE
                  IF l_eh_tip_cross_docking THEN
                     CALL wms6190_help("Tipo de estoque e restricao cross-docking nao podem ser usados na conferencia.")
                     RETURN FALSE
                  END IF
               END IF
            END IF
          
      20. Criar função wms6190_controle_cod_barras_gs1_128() que finalmente 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 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. 
        • 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 referentes ao cod_barras e o 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_conferencia.cod_barras) do item (mr_conferencia.item), e 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_conferencia.cod_barras, mr_conferencia.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_conferencia.cod_barras e, então, tentar buscar o item através da função  wmst86_wms_item_sku_cod_barras_verifica_cod_barras. Caso não encontre um item, limpar os campos de tela cod_barras (mr_conferencia.cod_barras) e item(mr_conferencia.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:

          Sugestão de implementação para controle do código de barras do SKU, dimensionais e tipos de estoque x restrição.
          IF NOT wmsr130_deposit_utiliza_cod_barras_gs1_128() THEN
             RETURN FALSE
          END IF
           
          CALL wms6730_set_null()
          CALL wms6730_set_empresa(empresa)
          CALL wms6730_set_depositante(depositante)
          CALL wms6730_set_rotina_origem('WMS6190')
          CALL wms6730_set_cod_barras(mr_conferencia.cod_barras)
          CALL wms6730_solicita_cod_barras_gs1_128()
           
          LET mr_conferencia.cod_barras = NULL
          LET mr_conferencia.item= NULL
           
          IF NOT wmsr130_decodificacao_encontrou_atributos() THEN
             RETURN FALSE
          END IF
          
          LET m_encontrou_cod_barras_sku_gs1_128 = FALSE
          IF ( wmsr130_get_item_depositante() IS NOT NULL AND wmsr130_get_item_depositante() <> "  ") AND (wmsr130_get_cod_barras_sku()  IS NULL OR wmsr130_get_cod_barras_sku() = " "))
          	    #MURILO verificar se possui apenas um codigo de barras do SKU
                      LET l_qtd_itens_sku = wmsr130_get_qtd_tens_sku()
                      SELECT item, sku, cod_barras_sku
                         FROM wms_item_complemento 
               INNER JOIN wms_sku_item
                              ON wms_item_complemento.empresa = wms_sku_item.empresa
                            AND wms_item_complemento.item = wms_sku_item.item
               INNER JOIN wms_item_sku_cod_barras 
                               ON wms_item_complemento.empresa = wms_item_sku_cod_barras.empresa
                             AND wms_item_complemento.item = wms_item_sku_cod_barras.item
                            AND wms_item_complemento.deposit = wms_item_sku_cod_barras.deposit         
                      WHERE wms_item_complemento.empresa = :empresa
                           AND wms_item_complemento.item_deposit = :item_deposit
                           AND ( (wms_sku_item.qtd_item = l_qtd_itens_sku AND l_qtd_itens_sku IS NOT NULL) OR (l_qtd_itens_sku IS NULL) )
           
             IF nao_tem_sku THEN #MURILO --> nao retornou registros
                CALL log0030_processa_mensagem("Nao foi encontrado codigo de barras de SKU para o item depositante do GS1-128. Verifqiue!","exclamation",1)
                RETURN FALSE
             ENDIF
           
             IF tem_mais_de_um_sku THEN #MURILO --> mais de um registro
                 CALL log0030_processa_mensagem("Foi encontrado mais de um codigo de barras de SKU para o item depositante do GS1-128. Verifqiue!","exclamation",1)
                 RETURN FALSE
             END IF 
           
             IF tem_somente_um_sku THEN #MURILO --> um registro
                 LET mr_conferencia.cod_barras = cod_barras #do sql anterior
                 LET mr_conferencia.item= item #do sql anterior      
                 LET m_encontrou_cod_barras_sku_gs1_128 = TRUE
             END IF
           
          END IF 
           
          IF wmsr130_get_cod_barras() IS NOT NULL AND wmsr130_get_cod_barras() <> " " THEN
             LET mr_conferencia.cod_barras = wmsr130_get_cod_barras()
             CALL wmst86_wms_item_sku_cod_barras_verifica_cod_barras(mr_parametros.empresa,mr_conferencia.cod_barras,m_depositante,1) 
                     RETURNING l_encontrou ,l_item, l_sku        
             IF NOT l_encontrou THEN   
                LET mr_conferencia.cod_barras = NULL
                LET mr_conferencia.item = NULL
                RETURN FALSE
             END IF 
             LET mr_conferencia.item= l_item
             LET m_encontrou_cod_barras_sku_gs1_128 = TRUE
          END IF 
          
          RETURN TRUE
      21. Criar função wms6190_valid_tipo_estoque_restricao_gs1_128()  para verificar se o tipo de estoque x restrição obtido do GS1-128 é válido para o processo.
        • Caso GS1-128 tenha a informação de restrição, porém, não tenha informação do tipo de estoque, exibir erro e retornar FALSE
        • Caso GS1-128 tenha a informação do tipo de estoque e não tenha a informação da restrição, exibir erro e retornar FALSE
        • Segue sugestão de implementação para os itens acima:

          Sugestão de implementação para validação da troca do tipo de estoque x restrição padrão pelo recebido no GS1-128
          IF (  (wmsr130_get_tipo_estoque()  IS NULL  AND wmsr130_get_tipo_estoque()  = " ") 
          AND (wmsr130_get_restricao()  IS NOT NULL  AND wmsr130_get_restricao() <> " ") )  THEN
             CALL wms6190("Código de barras GS1-128 contém restricao sem tipo de estoque. Verifique!")   
             RETURN FALSE
          END IF
          
          IF (  (wmsr130_get_tipo_estoque()  IS NOT NULL  AND wmsr130_get_tipo_estoque()  <> " ") 
          AND (wmsr130_get_restricao()  IS NULL  AND wmsr130_get_restricao() = " ") )  THEN
              CALL wms6190("Código de barras GS1-128 contém tipo de estoque sem restrição. Verifique!")   
             RETURN FALSE
          END IF
           
          IF (  (wmsr130_get_tipo_estoque()  IS NOT NULL  AND wmsr130_get_tipo_estoque()  <> " ") 
          AND  (wmsr130_get_restricao()  IS NOT NULL  AND wmsr130_get_restricao()  <> " ") )  THEN   
              IF NOT wms6190_valid_tipo_estoque_restricao(wmsr130_get_tipo_estoque(), wmsr130_get_restricao()) THEN
                 RETURN FALSE
              END IF
              LET m_usuario_alterou_tip_est    = TRUE
              LET mr_conferencia.tip_estoque =  wmsr130_get_tipo_estoque(),
              LET mr_conferencia.restricao = wmsr130_get_restricao()
              DISPLAY mr_conferencia.tip_estoque
              DISPLAY mr_conferencia.restricao 
          END IF 
      22. Criar a função wms6190_valid_cod_unid_med_gs1_128() para validar se a unidade de medida do GS1-128 é válida e pode ser utilizado no processo.
        • Esta função deverá verificar se a unidade de medida foi obtida da decodificação do GS1-128. Se sim, deverá verificar se a unidade de medida obtida é válida através da função wms6190_valid_cod_unid_med(). Se a unidade de medida for inválida, a própria função irá disparar mensagem ao operador e retornar FALSE, ao retornar FALSE, retornar FALSE para a função wms6190_valid_cod_unid_med_gs1_128(). Se a unidade de medida for válida, então a função wms6190_valid_cod_unid_med_gs1_128() deverá retornar TRUE.
        • Segue abaixo sugestão de implementação:

          Sugestão de implementação para a validação e atribuição da unidade de medida recebida do GS1-128.
          LET l_cod_unid_med = mr_conferencia.cod_unid_med
           
          IF wmsr130_get_unidade_medida() IS NULL OR wmsr130_get_unidade_medida() = " " THEN
             RETURN TRUE
          END IF 
           
          LET mr_conferencia.cod_unid_med = wmsr130_get_unidade_medida()
           
          IF NOT wms6190_valid_cod_unid_med THEN
             LET mr_conferencia.cod_unid_med = l_cod_unid_med 
             RETURN FALSE
          END IF     
           
          DISPLAY  mr_conferencia.cod_unid_med
           
          RETURN TRUE
      23. Criar a função wms6190_valid_qtd_item_gs1_128() para validar se a quantidade de itens obtido do GS1-128 é válida e pode ser utilizada no processo.
        • Esta função deverá verificar se a quantidade de item foi obtida da decodificação do GS1-128. Se sim, deverá alimentar a variável de tela com o valor obtido do GS1-128 e realizar o DISPLAY da mesma. Em seguida,  deverá verificar se o valor é válido através da função wms6190_valid_qtd_item(). Caso a função wms6190_valid_qtd_item() retorne FALSE, a função wms6190_valid_qtd_item_gs1_128() também deverá retornar FALSEAo final da função retornar TRUE.
        • Segue abaixo sugestão de implementação:

          Sugestão de implementação para a validação e atribuição do item do GS1-128.
          LET l_qtd_item =  mr_conferencia.qtd_item
           
          IF wmsr130_get_qtd_item() IS NULL AND wmsr130_get_qtd_item() = " " THEN
             RETURN TRUE
          END IF 
          
          LET mr_conferencia.qtd_item= wmsr130_get_qtd_item()
          
          IF NOT wms6190_valid_qtd_item() THEN
             LET mr_conferencia.qtd_item = l_qtd_item 
             RETURN FALSE
          END IF 
              
          DISPLAY  mr_conferencia.qtd_item 
          RETURN TRUE
      24. Criar a função wms6190_valid_qtd_sku_gs1_128() para validar se a quantidade de SKUs obtidos do GS1-128 é valida e pode ser utilizada no processo.
        • Esta função deverá verificar se a quantidade de SKUs foi obtida da decodificação do GS1-128. Se sim, deverá alimentar a variável de tela com o valor obtido do GS1-128 e realizar o DISPLAY da mesma. Também deverá verificar se o valor é válido através da função wms6190_valid_qtd_sku(). Verificar também se o lastro e o peso são válidos para o palete pelas funções wms6190_valid_lastro_palete(), wms6190_valid_peso_palete(). Caso algumas da funções retorne FALSE, a função wms6190_valid_qtd_sku_gs1_128() também deverá retornar FALSE. Ao final da função retornar TRUE.
        • Segue abaixo sugestão de implementação:

          Sugestão de implementação para a validação e atribuição da quantidade de SKUs recebida do GS1-128.
          LET l_qtd_sku =  mr_conferencia.l_qtd_sku 
           
           IF wmsr130_get_qtd_sku() IS NULL AND wmsr130_get_qtd_sku() = " " THEN
             RETURN FALSE
          END IF
          
          LET mr_conferencia.qtd_sku =  wmsr130_get_qtd_sku()
          
          IF NOT wms6190_valid_qtd_sku() THEN
             LET mr_conferencia.qtd_sku =  l_qtd_sku 
             RETURN FALSE
          END IF     
           
          IF NOT wms6190_valid_lastro_palete() THEN
             LET mr_conferencia.qtd_sku =  l_qtd_sku 
             RETURN FALSE
          END IF 
           
          IF NOT wms6190_valid_peso_palete() THEN
             LET mr_conferencia.qtd_sku =  l_qtd_sku 
             RETURN FALSE
          END IF 
          
          DISPLAY  mr_conferencia.qtd_sku
           
          RETURN TRUE
          
      25. Altera a função wms6190_processo_conferencia() para realizar os tratamentos necessários na navegação dos campos, quando existirem valores obtidos do GS1-128.
        • Já no início da função, caso m_wmsr130_gs1_128_existe, então,  inicializar a modular m_encontrou_cod_barras_sku_gs1_128 com TRUE.

        • Alterar o evento before field do campo cod_barras. Ao final do evento, caso exista a função wmsr130 e o indicador de código de barras do SKU ter sido encontrado no GS1-128 seja falso(m_encontrou_cod_barras_sku_gs1_128), limpar os valores das funções referentes ao GS1-128.

          Sugestão de implementação no evento before field cod_barras para solicitar ou não a leitura de código de barras GS1-128.
          IF m_wmsr130_gs1_128_existe THEN
              IF  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 cod_barras para que, caso o código de barras informado pelo operador não seja encontrado, antes de disparar a 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 wmst86_wms_item_sku_cod_barras_verifica_cod_barras(), chamar a função wms6190_controle_cod_barras_gs1_128(). Caso a função wms6190_controle_cod_barras_gs1_128() retorne FALSE, exibir a mensagem ao usuário de código de barras inválido. Caso retorne TRUE, seguir o processamento do after field. Caso o código 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, ou o código de barras do SKU foi obtido manualmente ou via GS1-128.

          Sugestão de implementação no evento after field cod_barras
          CALL wmst86_wms_item_sku_cod_barras_verifica_cod_barras(mr_parametros.empresa,mr_conferencia.cod_barras,m_depositante,1) 
             RETURNING l_encontrou ,l_item, l_sku        
          IF l_encontrou = FALSE THEN
             LET l_msg = log0030_mensagem_get_texto()
             #MURILO --> Tentar tratar como GS1-128
             IF m_wmsr130_gs1_128_existe THEN
                IF NOT wms6190_controle_cod_barras_gs1_128() THEN
                   LET l_msg = log0030_mensagem_get_texto()                                
                   CALL wms6190_help(l_msg)
                   NEXT FIELD cod_barras
                ELSE
                   IF NOT m_encontrou_cod_barras_sku_gs1_128 THEN
                      CALL wms6190_help("Foram encontrados atributos validos para GS1-128 porem nao foi encontrado o SKU\ITEM. Por favor, informe o SKU\Item") 
                      NEXT FIELD cod_barras                          
                   END IF
                END IF
             ELSE
                CALL wms6190_help(l_msg)
                NEXT FIELD cod_barras
             END IF
          ELSE
             #MURILO --> Era antes do IF l_encontrou = FALSE THEN    
             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
             LET mr_conferencia.sku = l_sku
             LET mr_conferencia.item = l_item
          END IF        
        • Alterar o evento after field do campo cod_barras para que os dimensionais obtidos do GS1-128 sejam validados. Após obter o item e antes de solicitar os dimensionais, será necessário obter e validar os dimensionais do GS1-128 para que eles possam ser assumidos sem a necessidade de solicitar ao operador. Para atingir o objetivo, adicionar o código sugerido abaixo antes da instrução LET m_cod_unid_med_orig = mr_conferencia.cod_unid_med existente no after field.

          Sugestão de implementação para que os dimensionais obtidos do GS1-128 sejam validados no after field do cod_barras. Situação onde o item não foi obtido no momento anterior, na leitura do GS1-128.
          IF m_wmsr130_gs1_128_existe THEN
             IF wmsr130_decodificacao_encontrou_dimensionais()  THEN
                CALL wms6190_set_dimensionais_gs1_128() 
             END IF
          END IF 
        • Alterar o evento before field do campo cod_unid_med. Logo no início do evento, caso exista a função wmsr130, chamar a função wms6190_valid_cod_unid_med_gs1_128() para verificar se o GS1-128 obteve unidade de medida e se esta unidade de medida é válida. Caso seja inválida, o operador será notificado pela própria função de valid e o cursor deverá voltar ao campo cod_barras, para que o processo tenha novo início. Caso seja válido, o cursor deverá ser direcionado ao próximo campo. Segue abaixo sugestão de implementação:

          Sugestão de implementação no evento before field cod_unid_med para solicitar ou não a informação da unidade de medida.
          IF m_wmsr130_gs1_128_existe THEN
             IF FGL_LASTKEY() = FGL_KEYVAL("UP")
             OR FGL_LASTKEY() = FGL_KEYVAL("LEFT") THEN
                 NEXT FIELD cod_barras
             ELSE
                    IF NOT wms6190_valid_cod_unid_med_gs1_128() THEN
                          NEXT FIELD cod_barras
                    END IF  
                    IF NOT wms6190_valid_cod_unid_med_gs1_128() THEN
                          NEXT FIELD cod_barras
                    END IF  
             END IF
          END IF
          
        • Alterar o evento before field do campo qtd_item. Logo no início do evento, caso exista a função wmsr130, chamar a função wms6190_valid_qtd_item_gs1_128() para verificar se o GS1-128 obteve a quantidade de itens e se esta quantidade é válida. Caso seja inválida,o operador será notificado pela própria função de valid e o cursor deverá voltar ao campo cod_barras, para que o processo tenha novo início. Segue abaixo sugestão de implementação:

          Sugestão de implementação no evento before field qtd_item para solicitar ou não a informação da quantidade de itens.
            IF m_wmsr130_gs1_128_existe THEN
             IF FGL_LASTKEY() = FGL_KEYVAL("UP")
             OR FGL_LASTKEY() = FGL_KEYVAL("LEFT") THEN
                 NEXT FIELD cod_unid_med
             ELSE
                    IF NOT wms6190_valid_qtd_item_gs1_128() THEN
                          NEXT FIELD cod_barras
                    END IF  
             END IF
           
        • Alterar o evento before field do campo qtd_sku. Logo no início do evento, caso exista a função wmsr130, chamar a função wms6190_valid_qtd_sku_gs1_128() para verificar se o GS1-128 obteve a quantidade de SKUs e se esta quantidade é válida. Caso seja inválida, o operador será notificado pela própria função de valid e o cursor deverá voltar ao campo cod_barras, para que o processo tenha novo início. Segue abaixo sugestão de implementação:

          Sugestão de implementação no evento before field qtd_skus para solicitar ou não a informação da quantidade de SKUs.
             IF m_wmsr130_gs1_128_existe THEN
             IF FGL_LASTKEY() = FGL_KEYVAL("UP")
             OR FGL_LASTKEY() = FGL_KEYVAL("LEFT") THEN
                 NEXT FIELD qtd_item
             ELSE
                    IF NOT wms6190_valid_qtd_sku_gs1_128() THEN
                          NEXT FIELD cod_barras
                    ELSE
                          NEXT FIELD NEXT
                    END IF 
             END IF
          
          
      26. Alterar a função wms6190_crossdock_tela_conf_nf() considerando as mesmas alterações realizadas na função wms6190_processo_conferencia(), detalha no item acima (xxv). Esta alteração objetiva possibilitar a utilização do código de barras GS1-128 também pelo processo de cross docking.

 

Rotina

Tipo de operação

Opção de menu

Regras de negócio

wmsr130 - Função responsável pelas regras relacionadas ao GS1-128.

[Alteração]

<não se aplica>

Inclusão de funções para identificar se o depositante utiliza GS1-128 e se seus atributos foram identificados na decodificação.

wms6730 - Função responsável por controlar a interface de coletor de dados referente ao GS1-128.

[Alteração]

<não se aplica>

Tratamentos para quando a tela de coletor de dados que manipula os códigos de barras GS1-128 for aberta por outras rotinas, que não seja a rotina de teste de leitura.

wms6190 - Função responsável pela conferência do recebimento

[Alteração]

<não se aplica>

Criação de funções para as regras de validação de campos, inclusão da regra de negócio do GS1-128, com suas respectivas modificações na forma de navegação dos campos.

 

 

Protótipo de Telas

Compilação em uma única visão das imagens apresentadas no início da especificação (Item 2.)

 

 

 

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