Páginas filhas
  • ER_LOGWMS01-34_Conferencia_Expedicao

Versões comparadas

Chave

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

 

 

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

  

Informações Gerais

 

Especificação

Produto

Logix

Módulo

WMS - Warehouse Management System

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

Subtarefa1

 

Chamado2

<não se aplica>

País

(   X ) 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

 


Aviso
titleNota!
Para melhor entendimento do processo aqui descrito, recomenda-se o entendimento prévio do Requisito 01 - Configuração código de barras GS1-128 e Requisito 02 - Conferência do recebimento com GS1-128.
  1.  Rotinas de conferência de expedição que terão GS1-128 implementado, conforme demonstrado pelas imagens abaixo:

    • WMS6258 - Conferência via PDV/Desktop por documento com montagem de volume manual (WMS6219  - Tipo de processo 304)

Image Added

 

    • WMS6242- Conferência via coletor de dados por documento com montagem de volume manual (WMS6218 - Tipo de processo 305)

Image Added

 

    • WMS6355- Conferência via coletor de dados por plano com montagem de volumes automático (Tipo de processo 311)

Image Added

 

Painel
titleContextualização do processo.

2. Os diferentes tipos de conferência da expedição podem ser configurados para serem realizadas informando:

i) Código de barras do SKU e os respectivos Dimensionais do item; ou

 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.

 

Nos diferentes processos de conferência da expedição mencionado no item 1, 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 o sistema deverá 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 deverá informar ao operador que o código de barras informado é inválido.

Caso identifique que o código de barras informado é um GS1-128 deverá verificar se todas as informações necessárias para o processo foram obtidas do GS1-128 informado.

Caso alguma informação necessária para o processo não seja identificada no primeiro GS1-128 informado, porém, esteja configurada no WMS6727 - Configuração GS1-128, o sistema deverá abrir uma nova tela para que os demais códigos de barras GS1-128 do EAN/SKU sejam informados.

Após obter todas as informações possíveis do GS1-128, algumas possibilidades deverão ser tratadas:

    • Ao obter o Item Depositante do GS1-128 e não possuir a informação do Código de barras SKU no GS1-128, o sistema tentará buscar o Código de barras do SKU por meio do Item Depositante e da Quantidade de itens no SKU, caso esta informação tenha sido obtida do GS1-128.
    • Ao obter o Código de barras do SKU do GS1-128, o sistema deverá 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 (considerando a config. de restrição de dimensionais na conferência da expedição).
    • Os Dimensionais controlados no processo de conferência da expedição, porém não obtidos do GS1-128, deverão ser solicitados ao operador (somente estes).
    • Os Dimensionais obtidos do GS1-128 e controlados pelo processo de conferência 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 sejam obtidos 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 do SKU para que o operador o informe manualmente e o processo tenha sequência. 
    • Após obter as informações do Código de barras do SKU manualmente ou 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 diretamente questionado do próximo EAN/SKU. No processamento da conferência do EAN/SKU, caso identifique alguma inconsistência de um atributo obtido do GS1-128, notificar o usuário, posicionar o cursor no campo Código de barras do SKU novamente e limpar as informações obtidas do GS1-128, de modo que o operador inicie a conferência do EAN/SKU novamente.
    •  Após obter as informações do Código de barras do SKU manualmente ou via GS1-128, os respectivos Dimensionais e esteja configurado para informar alguma quantidade, o sistema preencherá os campos referentes ao item/SKU automaticamente e solicitará as quantidades ao operador.
    • Em seguida, assumirá os Dimensionais obtidos do GS1-128, questionará o operador de algum dimensional faltante e então processará a conferência do EAN/SKU.
    • Caso alguma informação obtida do GS1-128  seja inválida (por exemplo, ausência de reserva dos dimensionais), o sistema deve notificar o operador, limpar as informações obtidas do GS1-128 e, então, posicionar o cursor no campo Código de barras do SKU, para que o operador reinicie o processo de conferência do EAN/SKU.
    • Os campos de quantidade não terão seu preenchimento automatizado. Ou seja, mesmo que configurados os campos de quantidades (Qtd. Itens SKU, Qtd. SKU) no GS1-128 estes serão desconsiderados obrigando o preenchimento manual.
       
  1. 3. 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ções para recuperar se determinado atributo Logix está na configuração GS1-128 ou não. Para atingir este 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. WMS6218 - Conferências da expedição por documento via coletor de dados.
      1. Criar a função wms6218_validar_valores_validos_dimensionais(l_arr_currpara isolar regras de negócio referentes à validação de valor válido para dimensionais, sem que possua dependência direta dos componentes de tela (screen arrays/campos).
        • Atualmente a wms6218_valida_dimensional() e a wms6218_valida_dimensional_sem_split() cumprem dois papéis:
          i) Validar se o valor digitado para um dimensional é válido.
          ii) Verificar se existe saldo para o item, quantidade  e dimensional informado.
          A ideia proposta é mover a parte i) referente às validações de valores para esta função wms6218_validar_valores_validos_dimensionais().
          Para atender esta necessidade, mover o bloco de código abaixo da função wms6218_valida_dimensional() e da wms6218_valida_dimensional_sem_split() para a função wms6218_validar_valores_validos_dimensionais();

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


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

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


      10. Criar função wms6218_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 conferência da expedição e carregar os que foram obtidos por meio 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 wms6218_encontrou_todos_dimensionais_item_gs1_128() são semelhantes. Verificar a possibilidade de unificá-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


      11. Alterar a função wms6218_processa_quantidade_conferida() para que adicione os dimensionais obtidos do GS1-128 (wms6218_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 wms6218_informa_dimensionais() chamara função wms6218_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 por meio da  função wms6218_existe_dimensionais(), chamar a função wms6218_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 wms6218_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


      12. Criar a função wms6218_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 itens 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
      13. Criar a função wms6218_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
      14. Criar função wms6218_controle_cod_barras_gs1_128() que finalmente tratará o código de barras GS1-128.
        • Esta função é a que finalmente 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 configurada 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 ser obtida pelo 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 wms6218_busca_sku_por_item_despoit_gs1_128().
          • Para verificar se todos os dimensionais esperados foram obtidos do GS1-128, utilizar a função wms6218_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}
          
          CALL wmsr130_set_null()
          CALL wmsr130_set_empresa(empresa)
          CALL wmsr130_set_depositante(depositante)
           
          IF NOT wmsr130_deposit_utiliza_cod_barras_gs1_128() THEN
             RETURN FALSE
          END IF
           
          CALL wmsr130_add_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 wms6218_busca_sku_por_item_deposit_gs1_128() THEN
                   LET m_encontrou_cod_barras_sku_gs1_128 = TRUE       
               END IF 
             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
          
          #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 wms6218_busca_sku_por_item_deposit_gs1_128() THEN
                   LET m_encontrou_cod_barras_sku_gs1_128 = TRUE        
                END IF 
             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 
      15. Alterar a função wms6218_ean_cod_barras() para realizar os tratamentos necessários na utilização do GS1-128.

        • Já no início da função, caso a função wmsr130 exista, iniciar as variáveis m_wmsr130_gs1_128_existe com 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 referentes 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 wms6218_controle_cod_barras_gs1_128()

        • Caso a função wms6218_controle_cod_barras_gs1_128() retorne FALSEexibir a mensagem ao usuário de código de barras inválidoCaso retorne TRUE, seguir o processamento do after 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, o código de barras do SKU ou foi obtido manualmente ou via GS1-128.

          Bloco de código
          languagesql
          themeEclipse
          titleSugestão de implementação no evento after field ean_cod_barras
          linenumberstrue
          collapsetrue
          ......
          IF NOT wmsm86_wms_item_sku_cod_barras_leitura(p_cod_empresa,
                                                                    mr_item_conferido.ean_codigo_barras,
                                                                    mr_solicit_carga_compl.deposit,
                                                                    TRUE,
                                                                    1) THEN
             #MURILO --> Tentar tratar como GS1-128
             IF m_wmsr130_gs1_128_existe THEN
                IF NOT wms6218_controle_cod_barras_gs1_128() THEN
                   CALL wms6218_mensagem('EAN/Codigo Barras', NULL)
                   NEXT FIELD ean_codigo_barras
                ELSE
                   IF NOT m_encontrou_cod_barras_sku_gs1_128 THEN
                      CALL wms6218_mensagem("EAN/Codigo Barras","Foram encontrados atributos validos para GS1-128 porem nao foi encontrado o SKU\ITEM. Por favor, informe o SKU\Item") 
                      NEXT FIELD ean_codigo_barras
                   END IF
                END IF
             ELSE
                CALL wms6218_mensagem('EAN/Codigo Barras', NULL)
                NEXT FIELD ean_codigo_barras
             END IF
             #MURILO --> 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 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 inicie 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 wms6218_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
    3. WMS6219 - Conferência da expedição por documento via PDV/Desktop.

      1. Criar a função wms6219_validar_valores_validos_dimensionais(l_arr_currpara isolar regras de negócio referente à validação de valor válido para dimensionais, sem que possua dependência direta dos componentes de tela (screen arrays\campos).
        • Atualmente a wms6219_valida_dimensional() e a wms6219_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 às validações de valores para esta função wms6219_validar_valores_validos_dimensionais(). 
          Para atender esta necessidade, mover o bloco de código abaixo da função wms6219_valida_dimensional() e da wms6219_valida_dimensional_sem_split() para a função wms6219_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 wms6219_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 a função wms6219_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  wms6219_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 wms62198_validar_saldo_reservas_dimensionais_sem_split().
      3. Alterar a função wms6219_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  wms6219_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 o seu nome para wms6219_validar_saldo_reservas_dimensionais().
      4. Alterar a função wms6219_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 por meio da função wms6219_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 wms6219_validar_saldo_reservas_dimensionais(). Caso não exista saldo a função, 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 wms6219_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 wms6219_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. Criar a função wms6219_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.
        • 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
      9. Alterar a função wms6219_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.

        • Sugestão de implementação para que os dimensionais não sejam questionados ao operador.

          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
          ....
      10. Criar função wms6219_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 conferência 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 wms6219_encontrou_todos_dimensionais_item_gs1_128() são semelhantes. Verificar a possibilidade de unificá-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 wms6219_validar_valores_validos_dimensionais(m_ind_dim) THEN           
                     RETURN FALSE
                  END IF 
                  IF NOT wms6219_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

           

      11. Alterar a função wms6219_processa_quantidade_conferida() para que adicione os dimensionais obtidos do GS1-128(wms6219_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 wms6219_informa_dimensionais(), chamar a função wms6219_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 wms6219_existe_dimensionais(), chamar a função wms6219_set_dimensionais_gs1_128() para acrescentar 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 wms6219_processa_quantidade_conferida()
          #---------------------------------------------------------------------------#
          IF wms6219_existe_dimensionais() THEN
                IF NOT wms6219_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 wms6219_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 wms6219_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


      12. Criar função wms6219_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 itens do SKU não tenha tido valor capturado do GS1-128, desconsiderá-lo da busca. 

        • Abaixo segue sugestão de implementação. 

  2. Para atingir o resultado esperado detalhado acima, as seguintes alteração de funções e programas serão necessárias:WMS6218 - Conferencia da expedição via coletor de dadosCriar função wms6218_validar_valores_validos_dimensionais(l_arr_curr) para isolar regras de negócio referente a validação de valor válido para dimensionais sem que possua dependência direta dos componentes de tela (screen arrays\campos).

    Atualmente a wms6218_valida_dimensional() e a wms6218_valida_dimensional_sem_split() cumprem dois papéis, i) validar se o valor digitado para um dimensional é válido, ii) verificar se existe saldo para o item, quantidade  e dimensional informado. A ideia proposta é mover a parte i) referente as validações de valores para esta função wms6218_validar_valores_validos_dimensionais() . Para atender esta necessidade mover o bloco de código abaixo da função wms6218_valida_dimensional() e da wms6218_valida_dimensional_sem_split() para a função wms6218_validar_valores_validos_dimensionais();

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

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

  11. Abaixo sugestão de implementação para todos os itens mencionados acima.
        • Bloco de código
          languagesql
          themeEclipse
          titleSugestão de implementação
  12. dos ajustes necessário na validação dos dimensionais
        • 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
  13. AFTER FIELD val_dimensional
        •    #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
                  
  14. IF
        • ON 
  15. ma
        • wms_
  16. dimensional[l_arr_curr].val_dimensional IS NULL THEN
        • item_complemento.empresa = wms_sku_item.empresa
                 
        • AND wms_item_complemento.item = wms_sku_item.item
          INNER JOIN wms_item_sku_cod_barras 
               
  17. NEXT
        •  
  18. FIELD
        •   ON wms_item_complemento.empresa = wms_item_sku_cod_barras.empresa
             
  19. END
        •  
  20. IF
        •    AND wms_item_complemento.item 
        • = wms_item_sku_cod_barras.item
                 
  21. IF NOT wms6218_validar_valores_validos_dimensionais(l_arr_curr) THEN
        • AND wms_item_complemento.deposit = wms_item_sku_cod_barras.deposit         
               
        • WHERE wms_item_complemento.empresa = p_cod_empresa
                 
  22. DISPLAY ma_dimensional[l_arr_curr].val_dimensional TO sr_dimensional[l_scr_line].val_dimensional
        • 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() 
  23. NEXT FIELD val_dimensional
        • 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 
  24. END IF
        • 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 
  25. DISPLAY ma_dimensional[l_arr_curr].val_dimensional TO sr_dimensional[l_scr_line].val_dimensional
        • tem_mais_de_um_sku THEN #MURILO --> mais de um registro
                 CALL 
  26. IF NOT wms6218_validar_saldo_reservas_dimensionais(l_arr_curr) THEN
        • log0030_processa_mensagem("Foi encontrado mais de um codigo de barras de SKU para o item depositante do GS1-128. Verifqiue!","exclamation",1)
                
  27. NEXT
        •  
  28. FIELD
        • RETURN 
  29. val_dimensional
        • FALSE
             END IF 
           
            
  30. END
        •  IF tem_somente_um_sku THEN #MURILO --> um registro
                 
  31. Crirar função wms6218_encontrou_todos_dimensionais_item_gs1_128() para identificar se todos os dimensionais controlados pelo item foram obtidos do GS1-128. 
  32. 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()).
  33. Em seguida verificar os dimensionais controlados pelo item considerando a configuração de dimensionais a serem restringidos na conferência da expedição conforme parametrizado no completo do item WMS em MA9922.
  34. Para cada dimensional a ser solicitado na conferência da expedição verificar se foi obtido algum valor do GS1-128.
  35. Caso algum destes dimensionais não possua valor, retornar FALSE. Caso todos possuam valor, retornar TRUE.
  36. Segue abaixo a sugestão de implementação considerando todos os itens mencionados acima
        • 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
      1. Criar a função wms6219_carrega_dados_sku_gs1_128() para carregar 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
  37. consultar os dimensionais que serão solicitados na conferência da expedição e verificar se todos eles tiveram valores obtidos do GS1-128
        • carregas os códigos do SKU e do Item com base no código de barras do SKU.
          linenumberstrue
          collapsetrue
  38. SELECT
        •  IF 
  39. DISTINCT item.cod_item,
        • 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 
           
  40. CASE
        •  
  41. WHEN
        •  
  42. ( (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
        • 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
      1. Criar a função wms6219_solicita_cod_barras() para tratar os códigos de barras, quando for necessário informar mais de um código de barras GS1-128.
        • No item 1, imagem de número 4, é apresentado uma pequena tela com array para que sejam informados diversos códigos de barras. Sendo assim, esta função deverá abrir uma tela conforme protótipo da imagem. Considerar a quantidade máxima de leitura para confirmar os códigos de barras informados.
        • CTRL+C deverá limpar os dados da tela.
        • ESC deverá confirmar o input de dados, caso o usuário queira confirmar a leitura antes da quantidade máxima de códigos de barras.
        • Esta pequena tela deverá possuir comportamento semelhante a função existente WMS6730 para coletor.
      2. Criar a função wms6219_controle_cod_barras_gs1_128(), que finalmente tratará o código de barras GS1-128.
        • Esta função é a que finalmente 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 decodificá-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 a 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 configurada 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 ser obtida pelo 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 wms6219_busca_sku_por_item_despoit_gs1_128().
          • Para verificar se todos os dimensionais esperados foram obtidos do GS1-128, utilizar a função wms6219_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 conferência 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}
          
          CALL wmsr130_set_null()
          CALL wmsr130_set_empresa(empresa)
          CALL wmsr130_set_depositante(depositante)
           
          IF NOT wmsr130_deposit_utiliza_cod_barras_gs1_128() THEN
             RETURN FALSE
          END IF
           
          CALL wmsr130_add_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
          
          CALL wms6219_limpa_informacao_item()
          
          #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 wms6219_busca_sku_por_item_deposit_gs1_128() THEN
                    LET m_encontrou_cod_barras_sku_gs1_128 = TRUE   
  43. (
        •  
  44. (rest_dimensional_conferencia
        •  
  45. IS
        •  
  46. NULL
        •  
  47. OR
        •  
  48. rest_dimensional_conferencia
        • 
           
  49. =
        •  
  50. 'N')
        •  
  51. AND
        •  
  52. ies_largura
        •  
  53. =
        •  
  54. 'S') )
        • END IF
             END IF       
          END IF 
          
          #verifica se o sku 
  55. THEN
        • está 
  56. 'S'
        • configurado 
  57. ELSE
        • para 
  58. 'N'
        • ser 
  59. END
        • lido 
  60. AS ies_ctr_largura_conf, CASE WHEN ( (rest_dimensional_conferencia = 'S' AND solicitar_diametro_conferencia = 'S' AND ies_diametro = 'S') OR
        • 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
                
  61. (
        •  
  62. (rest_dimensional_conferencia
        •  
  63. IS
        •  
  64. NULL OR rest_dimensional_conferencia = 'N') AND ies_diametro = 'S') )
        • LET l_encontrou_todos_atributos_esperados_gs1_128 = FALSE 
                END IF
             ELSE
                IF NOT wms6218_carrega_dados_sku_gs1_128() THEN
               
  65. THEN
        •  
  66. 'S'
        •  
  67. ELSE
        •  
  68. 'N'
        •  
  69. END
        • RETURN 
  70. AS ies_ctr_diametro_conf,
        • FALSE 
                END IF
               
  71. CASE
        •  
  72. WHEN ( (rest_dimensional_conferencia = 'S' AND solicitar_peca_conferencia = 'S' AND reservado_1 = 'S') OR
        • 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
           
  73. (
        •  
  74. (rest_dimensional_conferencia
        •   
  75. IS
        •  
  76. NULL
        •  
  77. OR rest_dimensional_conferencia = 'N') AND reservado_1 = 'S') )
        • 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 
  78. THEN 'S' ELSE 'N' END AS ies_ctr_peca_conf,
        • 
          #relacionadas ao sku\item
          IF m_encontrou_cod_barras_sku_gs1_128 THEN
             CALL wms6219_carrega_info_item()
          END IF
          
          #para cada dimensional ira verificar se o 
  79. CASE
        • mesmo 
  80. WHEN
        • esta 
  81. ( (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
        • 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 wms6219_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
             
             CALL wms6219_limpa_informacao_item() 
             LET m_encontrou_cod_barras_sku_gs1_128 = FALSE        
  82. INTO
        • 
             CALL wms6219_solicita_cod_barras_gs1_128()
             
             IF NOT 
  83. l
        • wmsr130_
  84. ies
        • decodificacao_
  85. ctr_lote_conf,
        • encontrou_atributos() THEN
                RETURN FALSE
             END 
  86. 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,
        • 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() = " "))
                
  87. l_ies_ctr_largura_conf
        • IF wms6219_busca_sku_por_item_deposit_gs1_128() THEN
                   
  88. l_ies_ctr_diametro_conf,
        • LET m_encontrou_cod_barras_sku_gs1_128 = TRUE        
  89. l_ies_ctr_peca_conf,
        • 
                END 
  90. l_ies_ctr_serie_conf,
        • IF 
             END IF 
          
            
  91. FROM
        •  
  92. item
        • #valida 
        • novamente 
  93. INNER
        • a 
  94. JOIN item_ctr_grade ON item.cod_empresa = item_ctr_grade.cod_empresa
        • informacao do codigo de barras do sku pois o codigo anteriormente informado
             #pode ser sido apagado e 
  95. AND item.cod_item = item_ctr_grade.cod_item INNER JOIN wms_item_complemento
        • outros codigos de barras podem ter sido informados
             IF ( wmsr130_get_cod_barras_sku() IS NOT NULL 
  96. ON item.cod_empresa = wms_item_complemento.empresa
        • AND wmsr130_get_cod_barras_sku <> " " )      
                IF NOT wmsm86_wms_item_sku_cod_barras_leitura(p_cod_empresa,
                                             
        •         
  97. AND
        •  
  98. item.cod_item
        •     
  99. =
        •  
  100. wms_item_complemento.item
        •  
  101. INNER
        •  
  102. JOIN
        •  
  103. wms
        • wmsr130_
  104. item
        • get_
  105. sku_
        • cod_barras_sku(),
                   
  106. ON
        •  
  107. item.cod_empresa
        •  
  108. =
        •    
  109. wms_item_sku_cod_barras.empresa
        •         
  110. AND
        •  
  111. item.cod_item
        •     
  112. =
        •    
  113. wms_item_sku_cod_barras.item
        •         
  114. WHERE
        •  
  115. item.cod_empresa
        •  
  116. =
        •  
  117. p_cod_empresa
        •         
  118. AND
        •  
  119. wms_item_complemento.deposit
        •  
  120. =
        •  mr_solicit_carga_compl.deposit,
                                                              TRUE,
                    
        •         
  121. AND
        •  
  122. (
        •  
  123. (wms_item_complemento.item_deposit
        •  
  124. =
        •  
  125. wmsr130_get_item_depositante())
        •  
  126. OR
        •  
  127. (wmsr130_get_item_depositante()
        •  
  128. IS
        •  
  129. NULL))
        •         
  130. AND
        •  
  131. (
        •  
  132. (wms_item_sku_cod_barras.cod_barras
        •  
  133. =
        •  
  134. wmsr130_get_cod_barras_sku())
        •  
  135. OR
        •  
  136. (wmsr130_get_cod_barras_sku()
        •  
  137. IS
        •  
  138. NULL)) #MURILO
        •  
  139. -->
        •  
  140. para
        •  
  141. cada
        •  
  142. dimensional,
        •  
  143. se
        •  
  144. controla,
        •  
  145. verifica
        •  
  146. se
        •  
  147. tem
        •  
  148. valor..
        • 1) THEN
          
  149. #se nao tem valor
        •  
  150. retorna
        •  
  151. FALSE,
        •  
  152. no
        •  
  153. final
        •  
  154. se
        •  
  155. ngm
        •  
  156. retornar
        •  
  157. FALSE,
        •  
  158. retorna
        • RETURN 
  159. TRUE
        • FALSE
          
  160. IF
        •  
  161. l_ies_ctr_lote_conf
        •  
  162. =
        •  
  163. 'S'
        •  
  164. THEN
        •   END IF
  165. wmsr130_get_lote() IS NULL OR wmsr130_get_lote() = '' THEN
        • 
                LET m_encontrou_cod_barras_sku_gs1_128 = TRUE       
  166. RETURN
        •  
  167. FALSE
        • 
             END IF 
          
  168. END
        •   
  169. IF
        •  
          
  170. IF ies_ctr_dat_validade_conf = 'S' THEN ..... RETURN TRUE Criar função wms6218_controle_cod_barras_gs1_128() que finalmente irá solicitar o código de barras GS1-128
  171. 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.
  172. 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. 
  173. O depositante utilizando GS1-128, verificar se o código de barras informado é um GS1-128 tentando decodifica-lo (wmsr130_decodifica_gs1_128). Caso tenha retornado FALSE, o código de barras não é um GS1-128 e deverá retornar mensagem de código inválido conforme já informa o operador atualmente. Caso tenha retornado TRUE da decodificação, verificar se as informações necessárias para o processo foram obtidas. Caso o item controle SKU e dimensionais, será necessário verificar se foram obtidas as informações de código de barras do SKU, 
  174. 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().
        •    #dimensionais e quantidades serao tratados nos eventos de before input de cada informacao
          END IF 
      1. Alterar a função wms6219_conferencia() 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 
      2. 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 referentes 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 
  175. Logo após a chamada para wms6730_solicita_cod_barras_gs1_128(), limpar os campos de tela referente a ean_codigo_barras, sku item. Em seguida verificar se foi encontrado algum atributo na decodificação, para isso chamar a função wmsr130_decodificacao_encontrou_atributos(). Caso não tenha encontrado, retornar FALSE na função wms6190_controle_cod_barras_gs1_128() e não executar mais nenhuma operação. Caso tenha encontrado, alimentar a variável 
      1. m_encontrou_cod_barras_sku_gs1_
  176. 128 
      1. 128  THEN
               CALL wmsr130_set_null()
            END IF
        END IF

         

      2. 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 wms6219_controle_cod_barras_gs1_128()
        Caso a função wms6219_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 field
        Caso o código de barras seja encontrado e exista a função wmsr130, alimentar

  177. com FALSE.Caso tenha encontrado atributos, o primeiro passo é verificar se o código de barras do SKU não foi obtido do GS1-128 e o item depositante foi. Neste caso, verificar se o item depositante obtido do GS1-128 possui um, e somente um código de barras SKU vinculado. Nesta busca pelo código de barras do SKU, caso o atributo qtd_itens_sku tenha valor, utilizá-lo na busca. Ao encontrar somente um código de barras SKU para o item depositante do GS1-128, carregar as variáveis de tela do código de barras do SKU(mr_item_conferido.ean_codigo_barras), e do item (mr_item_conferido.item). Atribuir TRUE 
      1. a variável m_encontrou_cod_barras_sku_gs1_128 com TRUE, indicando que

  178. o código
      1. foram encontrados atributos GS1-128, porém, o código de barras do SKU

  179. foi encontrado. Caso não tenha encontrado um SKU, limpar as variáveis de tela mr_item_conferido. mr_item_conferido.item.O próximo passo é validar o código de barras SKU obtido do GS1-128, para isso verificar se o código de barras do SKU é diferente de vazio\null, se sim carregar a variável de tela mr_item_conferido.cod_barras e então tentar buscar o item através da função  
      1. 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(
  180. )Caso não encontre um item, limpar os campos de tela cod_barras (
      1. p_cod_empresa,
                                                                  mr_item_conferido.
  181. cod_barras) e item(mr_item_conferido.cod_barras) e retornar FALSE.Caso encontre, atribuir TRUE a variável m_encontrou_cod_barras_sku_gs1_128 indicando que o código de barras do SKU foi encontrado
  182. Segue abaixo sugestão de implementação contendo todos os passos mencionados acima:

  183. Criar modular SMALLINT 
      1. ean_codigo_barras,
                                                                  mr_solicit_carga_compl.deposit,
                                                                  TRUE,
                                                                  0) THEN
           #MURILO --> Tentar tratar como GS1-128
           IF m_wmsr130_gs1_128_existe
  184.  para representar a existência ou não da nova função wmsr130. Isso se faz necessário para que caso a equipe de manutenção precise enviar uma correção ao cliente não gere a necessidade de ter que enviar todos os fontes do projeto GS1-128. A utilização desta variável ao longo do programa WMS6218 estará descrita nos demais tópicos deste documento.Criar modular SMALLINT m_encontrou
      1.  THEN
              IF NOT wms6219_controle_cod_barras_
  185. 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.

    Alterar função wms6218_ean_cod_barras() para realizar os tratamentos necessários na utilização do GS1-128.

    Já no início da função, caso a função wmsr130 exista, iniciar as variáveis m_wmsr130_gs1_128_existe com TRUE 
      1. gs1_128() THEN
                 CALL log0030_processa_mensagem(log0030_mensagem_get_texto(),"exclamation",0) 
                 CALL wms6219_limpa_informacao_item()         
                 NEXT FIELD ean_codigo_barras
              ELSE
                 IF NOT m_encontrou_cod_barras_sku_gs1
  186. _128 com FALSE.
    Bloco de código
    languagesql
    themeEclipse
    titleBloco de código responsável por armazenar o indicativo de existência ou não da função de regra de negócio do gs1-128 wmsr130.
    linenumberstrue
    collapsetrue
    LET m_wmsr130_gs1_128_existe = FALSE
    IF find4GLfunction('wmsr130_decodifica_gs1_128') THEN
       LET m_wmsr130_gs1_128_existe = TRUE
       LET m_encontrou_cod_barras_sku_gs1_128 = FALSE
    END IF 

    No input de dados, alterar o evento before field do campo ean_codigo_barras. Ao final do evento, caso exista a função wmsr130 e o indicador de que o código de barras do SKU foi encontrado no GS1-128 seja FALSE (m_encontrou_cod_barras_sku_gs1_128), limpar os valores das funções referente ao GS1-128.

    Bloco de código
    languagesql
    themeEclipse
    titleSugestão de implementação no evento before field ean_codigo_barras para solicitar ou não a leitura de código de barras GS1-128.
    linenumberstrue
    collapsetrue
      1. _128 THEN
                    CALL log0030_processa_mensagem("Foram encontrados atributos validos para GS1-128 porem nao foi encontrado o SKU\ITEM. Por favor, informe o SKU\Item","exclamation",0) 
                    NEXT FIELD ean_codigo_barras
        
                 END IF
              END IF
           ELSE
              CALL wms6219_limpa_informacao_item()
              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
             
  187. IF
      1.  
  188. NOT
      1. LET m_encontrou_cod_barras_sku_gs1_128 = 
  189. THEN CALL wmsr130_set_null()
      1. TRUE #indica que encontrou atributos gs1-128 e SKU foi informado manualmente ou foi obtido do gs1-128
           END IF
            
  190. CALL wmsr6730_set_null() END IF END IFAlterar 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 
      1. #MURILO --> indica que encontrou sku
        END IF        
         
        LET mr_item_conferido.item = wmsm86_wms_item_sku_cod_barras_get_
  191. leitura
      1. item()
  192.  chamar a função wms6218_controle_cod_barras_gs1_128()Caso a função wms6218_controle_
      1. 
        LET mr_item_conferido.sku  = wmsm86_wms_item_sku_cod_barras_
  193. gs1
      1. get_
  194. 128
      1. sku()
  195.  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
      1. 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 seja  direcionado ao código de barras do SKU e as informações do GS1-128 obtidas anteriormente sejam limpas, fazendo com que o operador inicie 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
  196. no evento after field ean_cod_barras
      1. para retornar ao campo código de barras do SKU quando um dimensional obtido do GS1-128 for inváliado.
        linenumberstrue
        collapse
  197. true...... IF NOT wmsm86_wms_item_sku_cod_barras_leitura(p_cod_empresa,
      1. true
        LET mr_item_conferido.qtd_item = mr_item_conferido.qtd_sku * mr_item_conferido.
  198. ean
      1. qtd_
  199. codigo
      1. item_
  200. barras,
      1. sku
                    DISPLAY mr_item_conferido.qtd_item_conf TO qtd_item_conf
                    
      1. IF mr_solicit_carga_compl.
  201. deposit,
      1. conferencia_informando_sku = 'S' THEN
                       IF NOT wms6219_processa_quantidade_conferida() 
  202. TRUE,
      1. THEN                  
                         #MURILO --> trecho sugerido para direcionar cursor ao código de barras do SKU quando houve falha com algum dimensional do GS1-128.
              
  203. 1)
      1.  
  204. THEN
      1.    
  205. #MURILO
      1.  
  206. -->
      1.  
  207. Tentar
      1.  
  208. tratar
      1.  
  209. como
      1.  
  210. GS1-128
      1.    IF m_wmsr130_gs1_128_existe THEN
              
  211. IF
      1.  
  212. NOT
      1.  
  213. wms6218_controle_cod_barras_gs1_128()
      1.  
  214. THEN
      1.          
  215. CALL
      1.  
  216. wms6218_mensagem('EAN/Codigo
      1.  
  217. Barras', NULL)
      1.  IF m_dimensionais_gs1_128_valido THEN
               
  218. NEXT
      1.  
  219. FIELD
      1.  
  220. ean_codigo_barras
      1.       
  221. ELSE
      1.          
  222. IF
      1. NEXT 
  223. NOT
      1. FIELD 
  224. m_encontrou_cod_barras_sku_gs1_128 THEN
      1. qtd_sku
                      
  225. CALL
      1.  
  226. wms6218_mensagem("EAN/Codigo
      1.  
  227. Barras","Foram
      1.  
  228. encontrados
      1.  
  229. atributos
      1.  
  230. validos
      1.  
  231. para
      1.  
  232. GS1-128
      1. ELSE
         
  233. porem
      1.  
  234. nao
      1.  
  235. foi
      1.  
  236. encontrado
      1.  
  237. o
      1.  
  238. SKU\ITEM.
      1.  
  239. Por
      1.  
  240. favor,
      1.  
  241. informe
      1.  
  242. o
      1.  
  243. SKU\Item")
      1.  
      1.             NEXT FIELD ean_codigo_barras
                   
  244. END
      1.     
  245. IF
      1.       END IF 
               
  246. ELSE
      1.         
  247. CALL
      1.  
  248. wms6218_mensagem('EAN/Codigo
      1.  
  249. Barras',
      1.  
  250. NULL)
      1. ELSE
              
  251. NEXT
      1.     
  252. FIELD
      1.  
  253. ean_codigo_barras
      1.    
  254. END
      1.  
  255. IF
      1.    #MURILO -->
  256. Tentar tratar como GS1-128 ELSE
      1. 
                          
  257. #MURILO
      1.  
  258. -->
      1.  
  259. indica
      1.  
  260. que
      1. NEXT 
  261. encontrou
      1. FIELD qtd_sku
                    
  262. IF m_wmsr130_gs1_128_existe THEN
      1.       END IF 
                       ELSE
         
  263. LET
      1.  
  264. m_encontrou_cod_barras_sku_gs1_128
      1.  
  265. =
      1.  
  266. TRUE
      1.  
  267. #indica
      1.  
  268. que
      1.  
  269. encontrou
      1.  
  270. atributos
      1.  
  271. gs1-128
      1.  
  272. e
      1.  
  273. SKU
      1.  
  274. foi
      1.  
  275. informado
      1.  
  276. manualmente
      1.  
  277. ou
      1.  
  278. foi
      1.  
  279. obtido
      1.  
  280. do
      1. EXIT 
  281. gs1-128
      1. INPUT
           
  282. END
      1.    
  283. IF
      1.     
  284. #MURILO
      1.  
  285. -->
      1.  
  286. indica
      1.  
  287. que
      1.  
  288. encontrou
      1.  
  289. sku
      1. END IF
                
  290.   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()
      1.     END IF
    1. WMS6355 - Conferência da expedição por plano via coletor de dados com montagem de volume automático.
      1. O detalhamento técnico para este programa está limitado ao entendimento das imagens que representam o comportamento esperado juntamente com o item 2, descrevendo as situações esperadas em detalhes.

 

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