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

Permitir realizar o processo de conferência da expedição via coletor de dados ou PDV\Desktop utilizando a leitura de código de barras GS1-128

Definição da regra de negócio

 WMS6258 -> WMS6219
  1.  Rotinas de conferência de expedição que terão GS1-128 implementado.

    • WMS6258 Conferência PDV com montagem de volume manual (WMS6219  - Tipo de

processo304
    • processo 304)

Image Modified

 

    • WMS6242- Conferência por documento via coletor de dados (WMS6218

-
    •  Tipo de processo 305)

\

Image Added

 

 

    • WMS6355-

Conferência
    •  Conferência por plano via coletor de dados com montagem de volumes automático (WMS6353 -

 
    • Tipo de processo 311)

Image Added

 

2. A conferência da expedição pode ser configurada para ser realizada informado:

i) código de barras do SKU e os respectivos dimensionais do item, ou informado

ii) código de barras do SKU, dimensionais, e a respectiva quantidade em SKU ou em quantidade de Itens

Quando o item controla SKU, as quantidades podem ser informadas em quantidade de SKUs ou em quantidade de Itens. Quando o item não controla SKU as quantidades podem ser informadas apenas em quantidade de itens.

Sobre o comportamento do GS-128 no processo, o código de barras GS1-128 deverá ser informado no campo código de barras do SKU. Caso não encontre um SKU para o código de barras informado irá verificar se  o depositante trabalha com GS1-128. Neste caso então tentará verificar se o código de barras é um GS1-128. Não sendo um GS1-128 irá informar ao operador que o código de barras informado é inválido. Caso identifique que o código de barras informado é um GS1-128 irá verificar se todas as informações necessárias para o processo foram obtidas do GS1-128 informado. Caso alguma informação necessárias para o processo e não identifica no GS1-128 esteja configurado no WMS6727 - Configuração GS1-128 então abrirá uma nova tela para os demais códigos de barras GS1-128 da embalagem sejam informados. Após obter todas as informações possíveis do GS1-128 algumas possibilidades serão tratadas:

    • Ao obter o item depositante e não possuir a informação do SKU. Tentar buscar o código de barras do SKU através do item depositante e da quantidade de itens no SKU caso esta informação tenha sido obtida do GS-128;
    • Ao obter o código de barras do SKU do GS1-128, verificar se o mesmo existe no sistema, caso não exista informar o operador, limpar qualquer outra informação obtida do GS1-128 e posicionar o cursor no campo código de barras do SKU para início de uma nova leitura;
    • Os dimensionais obtidos do GS1-128 que porventura não sejam controlados pelo item ou não estejam configurados para serem informados na conferência da expedição deverão ser ignorados;
    • Os dimensionais controlados no processo de conferencia da expedição porém não obtidos do GS1-128 deverão ser solicitados ao operador;
    • Os dimensionais obtidos do GS1-128 e controlados pelo processo de conferencia da expedição não deverão ser solicitados ao operador porém deverão sofrer as mesmas validações de quando digitado pelo usuário. Ou seja, deverá ser validado se o valor informado é um valor válido e se existe saldo de reserva para os dimensionais obtidos;
    • Caso seja obtido somente os dimensionais do GS1-128 e não tenha sido obtido o código de barras do SKU, posicionar o cursor novamente no campo código de barras para que o operador informe o código de barras do SKU manualmente e o processo tenha sequencia. 
    •  Após obter as informações do código de barras do SKU manualmente ou automaticamente via GS1-128 , os respectivos dimensionais, e esteja configurado para não informar quantidades, realizar o processamento da conferência automaticamente, de modo que o usuário seja questionamento diretamente da próxima embalagem. No processamento da conferência da embalagem caso identifique algumas inconsistência de um atributo obtido do GS1-128, posicionar o cursor no campo código de barras novamente e limpar as informações obtidas do GS1-128 de modo que o operador de início a uma nova leitura;
    •  Ao informar a quantidade manualmente e não exista saldo para a quantidade, notificar o operador, posicionar o cursor novamente no campo quantidade e manter as informações obtidas do GS1-128 de modo que ao informar a quantidade correta o processa siga com informações obtidas do GS1-128 e solicite então uma nova embalagem para conferência.

    3. Para atingir o resultado esperado detalhado acima, as seguintes alteração 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ções para recuperar se determinado atributo logix está na configuração GS1-128 ou não. Para atingir esse objetivo criar as funções abaixo;
      2. Criar função wmsr130_get_atributo_configurado_gs1_128(l_atributo_logix) que deverá consultar se determinado atributo recebido por parâmetro está na configuração GS1-128 ou não. Segue abaixo sugestão de implementação:

        Bloco de código
        languagesql
        themeEclipse
        titleSugestão de implementação para consultar se determinado atributo Logix recebido por parâmetro está na configuração GS1-128 ou não.
        linenumberstrue
        collapsetrue
        #-------------------------------------------------------------------------------------------#
        FUNCTION wmsr130_get_atributo_configurado_gs1_128(l_atributo_logix)
        #-------------------------------------------------------------------------------------------#
         
         SELECT DISTINCT 1
            FROM wms_cod_barras_item_gs1_128 
           WHERE empresa        = m_empresa 
             AND config_gs1_128 = m_cod_config_gs1_128
             AND atributo_logix = l_atributo_logix
        
        
          SE RETORNOSQL <> 0 ENTAO
             RETURN FALSE
          FIM SE
        
          RETURN TRUE
        
        END FUNCTION


      3. Para cada atributo criar uma função wmsr130_get_<<atributo>>_configurado_gs1_128() que deverá verificar se o atributo está ou não na configuração GS1-128 fazendo uso da função criada acima. Segue abaixo sugestão de implementação:

        Bloco de código
        languagesql
        themeEclipse
        titleSugestão de implementação para consultar se determinado atributo Logix está na configuração GS1-128 ou não.
        linenumberstrue
        collapsetrue
         
        #----------------------------------------------------------------------------------------------------------#
        FUNCTION wmsr130_get_cod_barras_sku_configurado_gs1_128()
        #----------------------------------------------------------------------------------------------------------#
         
        IF wmsr130_get_atributo_configurado_gs1_128("COD_BARRAS_SKU") THEN
           RETURN TRUE
        ELSE
           RETURN FALSE
        END IF 
        
        END FUNCTION
         
        #----------------------------------------------------------------------------------------------------------#
        FUNCTION wmsr130_get_lote_configurado_gs1_128()
        #----------------------------------------------------------------------------------------------------------#
         
        IF wmsr130_get_atributo_configurado_gs1_128("LOTE") THEN
           RETURN TRUE
        ELSE
           RETURN FALSE
        END IF 
         
        END FUNCTION
         
        ....


    2. Conferencias da expedição WMS6218 \ WMS6219 \ WMS6353
      1. Criar função wmsXXXX_validar_valores_validos_dimensionais(l_arr_currpara 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 wmsXXXX_valida_dimensional() e a wmsXXXX_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 wmsXXXX_validar_valores_validos_dimensionais() . Para atender esta necessidade mover o bloco de código abaixo da função wmsXXXX_valida_dimensional() e da wmsXXXX_valida_dimensional_sem_split() para a função wmsXXXX_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 wmsXXXX_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 wmsXXXX_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  wmsXXXX_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 wmsXXXX_validar_saldo_reservas_dimensionais_sem_split().
      3. Alterar função wmsXXXX_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  wmsXXXX_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 wmsXXXX_validar_saldo_reservas_dimensionais().
      4. Alterar função wmsXXXX_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 wmsXXXX_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 wmsXXXX_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 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 dos programas de conferência estará descrita nos demais tópicos deste documento.
      6. 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.

      7. Criar modular SMALLINT m_dimensionais_gs1_128_valido para indicar quando houve falha com um dimensional obtido do GS1-128.
      8. Crirar função wmsXXXX_encontrou_todos_dimensionais_item_gs1_128() para identificar se todos os dimensionais controlados pelo item na conferência da expedição foram obtidos do GS1-128.
  1.  
        • 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 complemento do item WMS em MA9922.
        • Para cada dimensional a ser solicitado na conferência da expedição verificar se o mesmo está na configuração GS1-128 e se foi obtido algum valor do GS1-128.
        • Caso algum destes dimensionais estejam na configuração e não tenham retornado 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
          themeEclipse
          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
          #consulta SQL que verifica os dimensionais controlados pelo item e destes dimensionais quais estao configurados para serem solicitados na conferencia da expedicao
          SELECT DISTINCT 
                      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))
                  AND ( (wmsr130_get_item_depositante() IS NOT NULL ) OR (wmsr130_get_cod_barras_sku IS NOT NULL) )
           
          #MURILO --> caso o retorno da consulta seja 100 (NOTFOUND) alimentar todas as variaveis l_ies_ctr_<<dimensinal>> como 'S' e deixar o processamento da função seguir até o final.
          
          #MURILO --> para cada dimensional, verificar i) se é controlado na conferencia da expedição, ii) se está na configuracao gs1-128  iii) e então verificar se tem valor.. 
          #caso nao satisfaça as 3 condições acima retorna FALSE. Ao final se ngm retornar FALSE, retorna TRUE.
          IF l_ies_ctr_lote_conf = 'S' THEN
             IF ( wmsr130_get_lote_configurado_gs1_128() AND (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
      1. Alterar a função wmsXXXX_existe_dimensionais() para que não carregue o array de record que contém as informações dos dimensionais com os dimensionais encontrados na decodificação do GS1-128 pois estas serão apresentadas em tela.
        • Antes de alimentar os arrays de record ma_dimensional ma_dimensional_aux verificar se o valor do dimensional não foi capturado do GS1-128. Desta forma o dimensional não será solicitado ao operador.
        •  Abaixo sugestão de implementação. Replicar para cada dimensional.

          Bloco de código
          languagesql
          themeEclipse
          titleSugestão de implementação para que os dimensionais não sejam questionados ao operador
          linenumberstrue
          collapsetrue
          ...
            IF l_parametro_conf AND l_solic_dat_producao_conferencia = 'S' OR l_parametro_conf = FALSE
            OR l_parametro_conf  IS NULL THEN
               IF manm8_item_ctr_grade_get_ies_dat_producao() = "S" THEN
                  #MURILO --> tratamento para verificar se o dimensional foi obtido do gs1-128
                  LET l_encontrou_dimensional_gs1_128 = FALSE
                  IF m_wmsr130_gs1_128_existe THEN
                     IF wmsr130_get_dat_producao() IS NOT NULL AND wmsr130_get_dat_producao() <> " " THEN
                        LET l_encontrou_dimensional_gs1_128 = TRUE      
                     END IF 
                  END IF
                  #MURILO --> fim tratamento para verificar se o dimensional foi obtido do gs1-128
           
                  #MURILO--> utilizacao da variavel para nao depender do r130
                  IF NOT l_encontrou_dimensional_gs1_128 THEN
                  #MURILO---> fim utilizacao da variavel para nao depender do r130
                     LET m_ind_dim = m_ind_dim + 1
                     LET ma_dimensional[m_ind_dim].label_dimensional = wms6218_retorna_label_dimensional("den_dat_prod")
                     LET ma_dimensional_aux[m_ind_dim].campo         = "dat_hor_producao"
                  #MURILO--> end if
                  END IF 
                  #MURILO--> fim end if
               END IF
            END IF
            IF l_parametro_conf AND l_solic_dat_validade_conferencia = 'S' OR l_parametro_conf = FALSE
            OR l_parametro_conf  IS NULL THEN
               IF manm8_item_ctr_grade_get_ies_dat_validade() = "S" THEN
          ....


      2. Criar função wmsXXXX_set_dimensionais_gs1_128() para que as informações de dimensionais obtidas do GS1-128 sejam carregadas no array de record. 
        • Esta função deverá identificar os dimensionais a serem solicitados na conferencia da expedição e carregar os que foram obtidos através do GS1-128 já que estes não serão informados pelo operador;

        • Segue abaixo sugestão de implementação. Replicar para todos dimensionais;

        • Nota! Veja que  o SQL desta função e da função wmsXXXX_encontrou_todos_dimensionais_item_gs1_128() são semelhantes. Verificar a possibilidade de unifica-los em um cursor que receba parâmetros ou algo semelhante..

          Bloco de código
          languagesql
          themeEclipse
          titleSugestão de implementação para atribuir ao processo os valores dos dimensionais obtidos do GS1-128
          linenumberstrue
          collapsetrue
          IF NOT wmsr130_decodificacao_encontrou_dimensionais()
             RETURN TRUE
          END IF 
           
          IF ( (m_ind_dim IS NULL) OR (m_ind_dim = 0) )
             LET m_ind_dim = 0 
             INITIALIZE ma_dimensional TO NULL
             INITIALIZE ma_dimensional_aux TO NULL
          END IF 
           
          #consulta SQL que verifica os dimensionais controlados pelo item e destes dimensionais quais estao configurados para serem solicitados na conferencia da expedicao
          SELECT DISTINCT 
                      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 = mr_item_conferido.item
          #MURILO --> caso o retorno da consulta seja 100 (NOTFOUND) sair da função sem executar outros procedimentos.
          
          IF l_ies_ctr_lote_conf = 'S' THEN
             IF ( wmsr130_get_lote() IS NOT NULL AND wmsr130_get_lote() <> " ")) THEN   
                  LET m_ind_dim = m_ind_dim + 1
                  LET ma_dimensional[m_ind_dim].label_dimensional = wms6218_retorna_label_dimensional("den_lote")
                  LET ma_dimensional_aux[m_ind_dim].campo         = "num_lote"
                  LET ma_dimensional[m_ind_dim],val_dimensional = wmsr130_get_lote()
                  IF NOT wms6218_validar_valores_validos_dimensionais(m_ind_dim) THEN           
                     RETURN FALSE
                  END IF 
                  IF NOT wms6218_validar_saldo_reservas_dimensionais(m_ind_dim) THEN
                     RETURN FALSE
                  END IF  
             END IF
          END IF 
          IF ies_ctr_dat_validade_conf = 'S' THEN
          .....   
          
          RETURN TRUE


      3. Alterar a função wmsXXXX_processa_quantidade_conferida() para que adicione os dimensionais obtidos do GS1-128(wmsXXXX_set_dimensionais_gs1_128()) no array de record referente aos dimensionais.
        • Adicionar os dimensionais obtidos do GS1-128 logo após o operador ter informado em tela os dimensionais não obtidos do GS1-128. Para isso, logo após a chamada para a função wmsXXXX_informa_dimensionais() chamara função wmsXXXX_set_dimensionais_gs1_128(). Caso ocorra alguma falha na validação dos dimensionais obtidos do GS1-128, notificar o operador, limpar as informações do GS1-128 e posicionar o cursor do código de barras do SKU novamente.Marcar a variável m_dimensionais_gs1_128_valido como FALSE indicando que houve erro na validação dos dimensionais do GS1-128.
        • Caso não identifique nenhum dimensional a ser informado pelo usuário através da função wmsXXXX_existe_dimensionais(), chamar a função wmsXXXX_set_dimensionais_gs1_128() paraacrescentar os possíveis dimensionais obtidos do GS1-128. 
        • Segue sugestão de implementação considerando os itens acima.

          Bloco de código
          languagesql
          themeEclipse
          titleSugestão de implementação para incluir os dimensionais obtidos do GS1-128.
          linenumberstrue
          collapsetrue
          #---------------------------------------------------------------------------#
           FUNCTION wmsXXXX_processa_quantidade_conferida()
          #---------------------------------------------------------------------------#
          IF wms6218_existe_dimensionais() THEN
                IF NOT wms6218_informa_dimensionais() THEN
                   INITIALIZE m_sql_dimensionais TO NULL
                   RETURN FALSE
                END IF
                #MURILO --->>> inclui os dimensionais do GS1-128#
                IF m_wmsr130_gs1_128_existe THEN
                   LET m_dimensionais_gs1_128_valido = TRUE
                   IF NOT wms6218_set_dimensionais_gs1_128() THEN
                      INITIALIZE ma_dimensional TO NULL
                      INITIALIZE ma_dimensional_aux TO NULL
                      INITIALIZE m_sql_dimensionais TO NULL
                      LET m_dimensionais_gs1_128_valido = FALSE
                      RETURN FALSE
                   END IF 
                END IF 
               #MURILO -->> fim inclui dimensionais do GS1-128#
             ELSE
                #MURILO --->>> inclui os dimensionais do GS1-128#
                IF m_wmsr130_gs1_128_existe THEN
                   LET m_dimensionais_gs1_128_valido = TRUE         
                   IF NOT wms6218_set_dimensionais_gs1_128() THEN
                      INITIALIZE ma_dimensional TO NULL
                      INITIALIZE ma_dimensional_aux TO NULL
                      INITIALIZE m_sql_dimensionais TO NULL
                      LET m_dimensionais_gs1_128_valido = FALSE
                      RETURN FALSE
                   END IF 
                END IF 
                #MURILO -->> fim inclui dimensionais do GS1-128#
              
                #MURILO -->> adicionado este if para apenas limpar quando nao existir dimensionais
                IF ( (m_ind_dim IS NULL) OR (m_ind_dim = 0) ) THEN
                #MURILO --> fim if
                   INITIALIZE m_data_1, m_data_2 TO NULL
                   INITIALIZE m_sql_dimensionais TO NULL
               #MURILO --> end if
               END IF 
                #MURILO --> fim end if
             END IF


      4. Criar função wmsXXXX_busca_sku_por_item_despoit_gs1_128() que deverá tentar encontrar o código de barras de SKU através do depositante, do item depositante e também da quantidade de itens por SKU obtidos do GS1-128. Caso a quantidade de ites do SKU não tenha tido valor capturado do GS1-128 desconsiderá-lo da busca. 
        • Abaixo segue sugestão de implementação. 

          Bloco de código
          languagesql
          themeEclipse
          titleSugestão de implementação para encontrar o código de barras do SKU através do depositante, item depositante e quantidade de itens no SKU. A quantidade de itens no SKU é desconsiderado caso não tenha valor.
          linenumberstrue
          collapsetrue
             #MURILO verificar se possui apenas um codigo de barras do 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 = p_cod_empresa
                 AND wms_item_complemento.deposit = mr_solicit_carga_compl.deposit
                 AND wms_item_complemento.item_deposit = wmsr130_get_item_depositante()
                 AND ( (wms_sku_item.qtd_item = wmsr130_get_qtd_tens_sku() AND wmsr130_get_qtd_tens_sku() IS NOT NULL) OR (wmsr130_get_qtd_tens_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_item_conferido.ean_cod_barras = cod_barras #do sql anterior
                 LET mr_item_conferido.item= item #do sql anterior      
                 LET mr_item_conferido.sku= sku #do sql anterior  
             END IF    
          END IF 
          RETURN TRUE
      5. Criar função wmsXXXX_carrega_dados_sku_gs1_128() para carregas as informações do código do SKU e do código do item com base no código de barras do SKU.
        • Abaixo segue sugestão de implementação.

          Bloco de código
          languagesql
          themeEclipse
          titleSugestão de implementação para carregas os códigos do SKU e do Item com base no código de barras do SKU.
          linenumberstrue
          collapsetrue
           IF NOT wmsm86_wms_item_sku_cod_barras_leitura(mr_item_conferido.empresa,wmsr130_get_cod_barras(),mr_solicit_carga_compl.deposit,TRUE,1) THEN
                RETURN FALSE
             END IF 
             LET mr_item_conferido.ean_cod_barras = wmsr130_get_cod_barras()
             LET mr_item_conferido.sku  = wmsm86_wms_item_sku_cod_barras_get_sku()
             LET mr_item_conferido.item = wmsm86_wms_item_sku_cod_barras_get_item()
             RETURN TRUE
      6. Criar função wmsXXXX_controle_cod_barras_gs1_128() que finalmente irá tratar o código de barras GS1-128
        • Esta função é a que finalmente irá 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, 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 todas as informações necessárias para o processo foram obtidas, neste caso não será necessário abrir tela solicitando novos códigos de barras. Caso não possua todas as informações necessárias para o processo e estas estejam configuradas no cadastro de configuração GS1-128(WMS6727) então a tela para solicitar outros códigos de barras deverá ser apresentada. 
          • As informações necessárias para o processo são i) Código de barras do SKU, ii) Dimensionais e iii) Quantidade de SKU quando o item do SKU controla SKU (mr_item_conferido.controla_sku = 'S') e o processo está configurado para solicitar esta informação (mr_solicit_carga_compl.conferencia_informando_sku = 'S'). Sendo assim para cada informação verificar através das funções wmsr130_get_<atributo>_configurado_gs1_128() se o atributo está configurado no WMS6727. Caso alguma das informações esteja configurado e não possua valor, então deverá ser aberta a tela para solicitar os demais código de barras (WMS6730). 
          • A informação do código de barras do SKU, pode-se obter através do código de barras do SKU obtido do GS1-128 (wmsr130_get_cod_barras_sku()) ou pelo item depositante (wmsr130_get_item_deposit()) utilizando a função wmsXXXX_busca_sku_por_item_despoit_gs1_128();
          • Para verificar se todos os dimensionais esperados foram obtidos do GS1-128, utilizar a função wmsXXXX_encontrou_todos_dimensionais_item_gs1_128() que já leva em consideração os dimensionais controlados pelo item e os dimensionais restringidos na conferência da expedição.
          • Para verificar a necessidade da quantidade de SKUs do GS1-128, verificar se o item controla SKU(mr_item_conferido.controla_sku = 'S'), se a conferencia da expedição está configurada para informar quantidade((mr_solicit_carga_compl.conferencia_informando_sku = 'S') e se o campo está previsto na configuração(wmsr130_get_qtd_sku_configurado_gs1_128()).
        • Segue abaixo sugestão de implementação comentada e abrangendo os itens mencionados acima.

          Bloco de código
          languagesql
          themeEclipse
          titleSugestão de implementação para controle do código de barras do SKU, dimensionais e tipos de estoque x restrição.
          linenumberstrue
          collapsetrue
          {o objetivo desta funcao e verificar se todas as informacoes necessarias
          para o processo foram obtidas no primeiro gs1-128 informado e entao valida-las.
          caso nem todas as informacoes foram obtidas neste primeiro g1-128 e estao configuradas
          na config gs1-128(wms6727) entao devera pedir os demais cod barras gs1-128}
          
          IF NOT wmsr130_deposit_utiliza_cod_barras_gs1_128() THEN
             RETURN FALSE
          END IF
           
          CALL wmsr130_set_null()
          CALL wmsr130_set_empresa(empresa)
          CALL wmsr130_set_depositante(depositante)
          CALL wmsr130_set_rotina_origem('WMS6218')
          CALL wmsr130_set_cod_barras(mr_item_conferido.ean_codigo_barras)
          CALL wmsr130_decodifica_gs1_128()
          IF NOT wmsr130_decodificacao_encontrou_atributos() THEN
             RETURN FALSE
          END IF
          
          LET l_encontrou_todos_atributos_esperados_gs1_128 = TRUE
          LET m_encontrou_cod_barras_sku_gs1_128 = FALSE
          LET l_cod_barras_informado_usuario  = mr_item_conferido.ean_codigo_barras
          #limpa os campos de tela que dependem do sku
          
          INITIALIZE mr_item_conferido.ean_codigo_barras,
                     mr_item_conferido.item,
                     mr_item_conferido.sku,
                     mr_item_conferido.controla_sku,
                     mr_item_conferido.des_reduz_sku,
                     mr_item_conferido.unid_medida,
                     mr_item_conferido.qtd_item,
                     mr_item_conferido.qtd_sku,
                     mr_item_conferido.qtd_item_sku TO NULL
          
          #verifica se o item_deposit está configurado para ser lido do gs1-128
          #se sim e não possuir valor, devera pedir outros gs1-128
          #se possuir valor tentará encontrar o sku com base no item_deposit
          IF wmsr130_get_item_deposit_configurado_gs1_128() THEN
             #se item_deposit esta null entao poderá pedir mais códigos gs1-128 pois 
             #nem todas as informações configuradas estao presentes no cod. barras informado
             #pelo usuário.
             IF ( wmsr130_get_item_depositante() IS NULL OR wmsr130_get_item_depositante() = "  ") 
                LET l_encontrou_todos_atributos_esperados_gs1_128 = FALSE      
             END IF 
             
             #se tiver item depositante já valida se o item depositante capturado é válido 
             #tentando encontrar um código de barras, a função do item depositante é encontrar um sku.
             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() = " "))
                IF NOT wms6218_busca_sku_por_item_deposit_gs1_128() THEN
                   RETURN FALSE
                END IF
                LET m_encontrou_cod_barras_sku_gs1_128 = TRUE        
             END IF       
          END IF 
          
          #verifica se o sku está configurado para ser lido do gs1-128
          #se sim e nao possuir valor deverá pedir outros gs1-128
          #se possuir valor verifica se é um sku válido, 
          IF wmsr130_get_cod_barras_sku_configurado_gs1_128() THEN
             IF ( wmsr130_get_cod_barras_sku() IS NULL OR wmsr130_get_cod_barras_sku = " " )            
                IF NOT m_encontrou_cod_barras_sku_gs1_128 THEN
                   LET l_encontrou_todos_atributos_esperados_gs1_128 = FALSE 
                END IF
             ELSE
                IF NOT wms6218_carrega_dados_sku_gs1_128() THEN
                   RETURN FALSE 
                END IF
                LET m_encontrou_cod_barras_sku_gs1_128 = TRUE
                #joga novamente pra true pois se encontrou SKU e só o item deposit não possuir valor 
                #entao nao precisa pedir novos gs1-128
                LET l_encontrou_todos_atributos_esperados_gs1_128 = TRUE
             END IF
          END IF 
          
          
          #se encontrou sku pelo gs1-128 entao carrega as informacoes de tela 
          #relacionadas ao sku\item
          IF m_encontrou_cod_barras_sku_gs1_128 THEN
             CALL wms6218_carrega_info_item()
          END IF
          
          IF (wmsr130_get_qtd_sku_configurado_gs1_128() THEN 
             IF (wmsr130_get_qtd_sku() IS NULL OR wmsr130_get_qtd_sku() =" ") ) THEN 
                IF m_encontrou_cod_barras_sku_gs1_128 THEN
                   IF (mr_item_conferido.controla_sku = 'S' AND mr_solicit_carga_compl.conferencia_informando_sku = 'S') THEN
                      LET l_encontrou_todos_atributos_esperados_gs1_128 = FALSE 
                   END IF 
                ELSE
                   LET l_encontrou_todos_atributos_esperados_gs1_128 = FALSE 
                END IF 
             END IF 
          END IF 
          
          #para cada dimensional ira verificar se o mesmo esta config para o gs1-128
          #e se esta configurado para ser solicitado no processo. 
          #caso algum dimensional configurado esteja configurado e nao possua valor
          #entao devera solicitar mais codigos gs1-128.
          IF NOT wms6218_encontrou_todos_dimensionais_item_gs1_128() THEN
             LET l_encontrou_todos_atributos_esperados_gs1_128 = FALSE
          END IF 
          #---
            
          #caso alguma informacao configurada para o gs1-128 nao possua valor 
          #entao abrira tela pedindo outros codigos de barras gs1-128
          IF NOT l_encontrou_todos_atributos_esperados_gs1_128 THEN
             
             INITIALIZE mr_item_conferido.ean_codigo_barras,
                     mr_item_conferido.item,
                     mr_item_conferido.sku,
                     mr_item_conferido.controla_sku,
                     mr_item_conferido.des_reduz_sku,
                     mr_item_conferido.unid_medida,
                     mr_item_conferido.qtd_item,
                     mr_item_conferido.qtd_sku,
                     mr_item_conferido.qtd_item_sku TO NULL
                     
             LET m_encontrou_cod_barras_sku_gs1_128 = FALSE        
             CALL wms6730_set_null()
             CALL wms6730_set_empresa(empresa)
             CALL wms6730_set_depositante(depositante)
             CALL wms6730_set_rotina_origem('WMS6218')
             CALL wms6730_set_cod_barras(l_cod_barras_informado_usuario)
             CALL wms6730_solicita_cod_barras_gs1_128()
             
             IF NOT wmsr130_decodificacao_encontrou_atributos() THEN
                RETURN FALSE
             END IF
             
             #valida novamente a informacao do item depositante pois o codigo anteriormente informado
             #pode ser sido apagado e outros codigos de barras podem ter sido informados
             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() = " "))
                IF NOT wms6218_busca_sku_por_item_deposit_gs1_128() THEN
                   RETURN FALSE
                END IF 
                LET m_encontrou_cod_barras_sku_gs1_128 = TRUE        
             END IF 
          
             #valida novamente a informacao do codigo de barras do sku pois o codigo anteriormente informado
             #pode ser sido apagado e outros codigos de barras podem ter sido informados
             IF ( wmsr130_get_cod_barras_sku() IS NOT NULL AND wmsr130_get_cod_barras_sku <> " " )      
                IF NOT wmsm86_wms_item_sku_cod_barras_leitura(p_cod_empresa,
                                                              wmsr130_get_cod_barras_sku(),
                                                              mr_solicit_carga_compl.deposit,
                                                              TRUE,
                                                              1) THEN
                   RETURN FALSE
                END IF
                LET m_encontrou_cod_barras_sku_gs1_128 = TRUE        
             END IF 
             
             #dimensionais e quantidades serao tratados nos eventos de before input de cada informacao
          END IF 
      7. Alterar função wmsXXXX_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 FALSEm_encontrou_cod_barras_sku_gs1_128 com TRUE, e m_dimensionais_gs1_128_valido  também como TRUE. 

          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
           LET m_encontrou_cod_barras_sku_gs1_128 = TRUE
           LET m_dimensionais_gs1_128_valido = TRUE         
          IF find4GLfunction('wmsr130_decodifica_gs1_128') THEN
             LET m_wmsr130_gs1_128_existe = TRUE
          
          END IF 
        • 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 TRUE (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 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 wmsXXXX_controle_cod_barras_gs1_128()Caso a função wmsXXXX_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 wmsXXXX_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 wmsXXXX_mensagem('EAN/Codigo Barras', NULL)
                NEXT FIELD ean_codigo_barras
             END IF
             #MURILO --> Fim 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()
        • Alterar o evento before field do campo qtd_sku. Ao final do evento, caso tenha sido obtido a quantidade de SKUs do GS1-128, processar a conferência com esta quantidade. Caso o processamento seja realizado com sucesso iniciar conferência de um novo SKU com os campos limpos e o curso no campo código de barras do SKU. Caso o processamento apresenta alguma irregularidade voltar o cursor para o código de barras do SKU e limpar as informações obtidas do GS1-128.

          Bloco de código
          languagesql
          themeEclipse
          titleSugestão de implementação para processar a quantidade de SKUs com a quantidade obtida do GS1-128.
          linenumberstrue
          collapsetrue
          ...
          ELSE
             IF mr_item_conferido.qtd_sku IS NULL OR mr_item_conferido.qtd_sku = 0 THEN
                INITIALIZE mr_item_conferido.qtd_item TO NULL
                DISPLAY mr_item_conferido.qtd_item TO qtd_item
             END IF
          END IF
          #MURILO --> bloco para pegara informacao da quantidade de skus do gs1-128 e processar a conferencia
          IF m_wmsr130_gs1_128_existe THEN
             IF wmsr130_get_qtd_sku() IS NOT NULL AND wmsr130_get_qtd_sku() <> " " THEN
                LET mr_item_conferido.qtd_sku = wmsr130_get_qtd_sku()
                IF NOT wmsXXXX_processa_quantidade_conferida() THEN
                   NEXT FIELD ean_codigo_barras
                ELSE   
                   EXIT INPUT
                END IF 
             END IF
          END IF 
          #MURILO --> fim bloco.
        • Alterar o evento after field do campo qtd_sku para que após o usuário informar a quantidade manualmente  e caso não possua reserva disponível para um dimensional obtido do GS1-128 o cursor sera direcionado ao código de barras do SKU e as informações do GS1-128 obtidas anteriormente sejam limpas fazendo com que o operador de início a uma nova leitura. A variável m_dimensionais_gs1_128_valido vai indicar se o problema ocorreu com algum dimensional do GS1-128 ou não.

          Bloco de código
          languagesql
          themeEclipse
          titleSugestão de implementação para retornar ao campo código de barras do SKU quando um dimensional obtido do GS1-128 for inváliado.
          linenumberstrue
          collapsetrue
          LET mr_item_conferido.qtd_item = mr_item_conferido.qtd_sku * mr_item_conferido.qtd_item_sku
                      DISPLAY mr_item_conferido.qtd_item TO qtd_item
                      IF mr_solicit_carga_compl.conferencia_informando_sku = 'S' THEN
                         IF NOT wmsXXXX_processa_quantidade_conferida() THEN                  
                           #MURILO --> trecho sugerido para direcionar cursor ao código de barras do SKU quando houve falha com algum dimensional do GS1-128.
                            IF m_wmsr130_gs1_128_existe THEN
                               IF m_dimensionais_gs1_128_valido THEN
                                  NEXT FIELD qtd_sku
                               ELSE
                                  NEXT FIELD ean_codigo_barras
                               END IF 
                            ELSE
                            #MURILO -->
                               NEXT FIELD qtd_sku
                            END IF 
                         ELSE
                            EXIT INPUT
                         END IF
                      END IF

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