Páginas filhas
  • OLD_ER-LOGWMS01-32_Conferencia_recebimento

Versões comparadas

Chave

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

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

  

Informações Gerais

 

Especificação

Produto

Logix

Módulo

WMS

Segmento Executor

Supply Chain - Inovação

Projeto1

LOGWMS01 - Supply Chain - WMS

IRM1

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

Requisito1

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

Subtarefa1

LOGWMS01-335 - Gerar Especificação

Chamado2

 

País

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

(  ) USA  (  ) Colombia   (  ) Outro _____________.

Outros

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

Demais Stories:

REQ01 → LOGWMS01-31 - Configuração.

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

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

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

 

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

Objetivo

Permitir a leitura de código de barras GS1-128 no programa de conferência do recebimento permitindo assim maior agilidade e confiabilidade no registro das informações.

 

Definição da Regra de Negócio

Atualmente na rotina de conferência do recebimento o usuário operador obrigatoriamente precisa informar a i) Etiqueta do palete, ii) Etiqueta da de identificação de estoque, podendo ser a mesma do palete e podendo ser ou não agrupadora, iii) Código de barras do SKU e  iv) Quantidade de SKUs. Além destas informações obrigatórias, dependendo da configuração do sistema, o usuário deverá operador deve informar vi)Quantidade de Itens no SKU e poderá opcionalmente pode mudar as informações sugeridas pelo sistema como vii) Unidade de medida, viii) Tipo de estoque x Restrição.  

O objetivo da implementação a ser realizada e descrita por este documento é permitir agilizar o registro das informações permitindo obtê-las diretamente do código de barras GS1-128, economizando tempo do operador em informar e conferir cada informação. As informações lidas do código de barras GS1-128 não serão deverão ser solicitadas ao operador e passarão deverão passar pelas mesmas validações de quando digitadas pelo operador. Caso alguma informação lida do código de barras GS1-128 seja inválida para o processo, o usuário será operador deverá ser notificado e então deverá registráregistra-la manualmente. Vale lembrar que as leitura das informações de etiqueta do palete e de identificação de estoque deverão ser informadas pelo operadorestoque não sofrerão alterações.

  Abaixo no item 1) e 2) é possível visualizar através de imagens um exemplo do comportamento esperado para o funcionamento do programa de conferencia do recebimento. , no item 3) são explanados fluxos alternativos e afirmações de comportamentos esperados não abordados ou sub-entendidos no exemplo e no item 4) é detalhada a parte técnica, mencionando onde e como as alterações deverão ser realizadas.


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

        1. Código de barras GS1-128 da embalagem
          Image Removed
              1. Image Added

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


          1. Segue abaixo exemplo do comportamento esperado para o sistema na conferência do recebimento (WMS6190) quando o depositante da ordem de serviço possuir configuração GS1-128 relacionada ao seu contrato :

              Image Removed

              Image Removed

              Image Removed

              Image Removed

              Image Removed

              Image Removed

                1. Telas inicias da conferencia do recebimento. As alterações detalhadas por este documento descrevem alteração que impactam da imagem 5 em diante.
                  Image Added
                2. Tela nova para informar GS1-128.
                  Image Added

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

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

                5. Sequencia da imagem do item d), ao acionar a opção de teste.
                  Image Added

                6. Fluxo alternativo partindo do item d), casos em que ocorra algum erro de leitura.
                  Image Added


              1. Algumas informações adicionais para complementar o comportamento esperado para a funcionalidade de GS1-128 não abordados detalhadamente pelo exemplo acima. Em grande parte representam situações de fluxos alternativos, não devendo representar o comportamento usual\normal durante a operação ou são comentários afirmando um comportamento subentendido:
                1. Item \ Item depositante \ Cod. Barras SKU
                  • No momento da leitura do código de barras GS1-128 caso o código de barras GS1-128 possua a informação do item depositante (EAN13\GTIN13) porém não seja encontrado um item depositante com este código, a informação do código de barras GS1-128 será desconsiderada  e será assumido o item do código de barras do SKU (que poderá ser informado pelo operador ou obtido do GS1-128). Ou seja, o código de um item depositante obtido do GS1-128 não cadastrado no sistema não será motivo de bloqueio para o processo de conferência do recebimento;
                  • No momento da leitura do código de barras GS1-128 caso o código de barras GS1-128 possua a informação do item depositante (EAN13\GTIN13) porém não possua a informação do código de barras do SKU (DUN14\GTIN14), o sistema irá verificar se o item possui apenas um SKU cadastrado, se sim, irá carregar automaticamente o código de barras deste SKU no campo código de barras do SKU. Caso nenhum, ou mais de um SKU seja encontrado para o item, esta informação será desconsiderada e o código de barras do SKU deverá ser informado pelo operador. Ou seja, afim de aproveitar o máximo possível as informações do GS1-128, caso não tenha a informação do código de barras do SKU no GS1-128, será tentado identificar um SKU cadastrado no sistema para o item para que seja utilizado no processo de conferência do recebimento. Em caso de uma possível inconsistência entre o código de barras do SKU obtido do sistema e o físico, provavelmente as validações realizadas posteriormente pelo sistema apontarão a divergência, seja através de inconsistência por conta do lastro\quantidade de itens no SKU, seja por notificação de falta\excesso;
                  • Caso o código de barras do SKU (DUN14\GTIN14) seja obtido com sucesso do GS1-128 porém apresente alguma inconsistência de sistema, o operador será notificado e o cursor ficará no campo código de barras do SKU para que o operador possa informar manualmente ou interromper o processo. Os campos posteriores que tiveram as informações obtidas do GS1-128 serão preenchidas automaticamente após informado o código de barras do SKU;
                2. Dimensionais
                  • No momento da leitura do código de barras GS1-128 caso algum dimensional seja inválido, o
              usuário
                  • operador será notificado e o dimensional será apresentado ao
              usuário
                  • operador já preenchido porém possibilitando
              ao operador alterar o valor
                  • ser alterado manualmente;
                  • No momento da leitura do código de barras GS1-128 caso não seja obtido a informação do item\sku, os dimensionais serão lidos do GS1-128 e o cursor voltará para o campo código de barras do SKU para que seja informado um código de barras. Após sair do campo, os dimensionais controlados pelo item terão seus valores atribuídos conforme obtido do GS1-128. Caso algum dimensional seja inválido o operador será notificado e o dimensional será solicitado ao
              usuário
                  • operador com o valor obtido do código de barras já preenchido porém possibilitando o operador alterar o valor manualmente;
                  • Os dimensionais obtidos do código de barras GS1-128 que não sejam controlados pelo item serão desconsiderados;
                  • Conforme já mencionado, caso todos os dimensionais tenham sido obtidos com sucesso do GS-128, nenhum dimensional será solicitado ao operador;
                  • Conforme já mencionado, caso algum dimensional controlado pelo item não esteja no GS1-128, este dimensional, e somente este, será solicitado ao operador.
                1. Unidade de medida \ Tipo de estoque x restrição
                  • Vale lembrar que estas informações possuem uma chance muita pequena de fazerem parte do código de barras GS1-128 uma vez que a informação ali contida deverá ser conhecida não só pelo WMS Logix como para qualquer outra entidade a manipular a embalagem;
                  • Caso exista a informação de unidade de medida e tipo de estoque x restrição no código de barras GS1-128 estes só serão aceitos se o parâmetro que permite alteração de unidade de medida estiver ativo e se o
              usuário
                  • operador possuir permissão para alterar tipo de estoque restrição. Caso estas premissas não sejam satisfeitas o
              usuário
                  • operador será notificado a respeito das inconsistências e não poderá alterar os valores padrões, porém a conferência poderá ser finalizada.
                  • Se o parâmetro que permite alteração de unidade de medida estiver ativo porém a unidade de medida não existir no WMS Logix, o operador será notificado e o cursor ficará no campo unidade de medida com o valor preenchido conforme obtido do GS1-128.
                  • Se o operador possuir permissão para alterar tipo de estoque x restrição porém o tipo de estoque x restrição obtido for inválido, o
              usuário
                  • operador será notificado, o tipo de estoque x restrição padrão será mantido e o
              usuário
                  • operador poderá concluir a conferência do recebimento. Ou seja, neste caso o tipo de estoque x restrição do código de barras GS1-128 será desconsiderado.
                  • Nenhum valor será atribuido ao tipo de estoque x restrição se estas duas informações não estiverem presente no GS1-128. 
                1. Quantidade de itens no SKU
                  • Caso a quantidade de itens no SKU obtido do GS1-128 seja inválida como por exemplo divergente do cadastrado para um item que controle SKU, o
              usuário
                  • operador será notificado. Se no contrato do depositante o apontamento de produto for automático, ou seja, a quantidade de itens no SKU é buscados do cadastro, o operador não terá a opção de alterar a quantidade de itens no SKU, neste caso então ele será notificado da possível divergência porém poderá dar continuidade ao processo. Se no contrato do depositante o apontamento de
              produto não
                  • produto não for automático, então após a notificação o cursor irá para o campo quantidade de itens no SKU e o operador deverá alterar a quantidade pois não conseguirá seguir com uma quantidade inválida informada no processo. Ou seja, caso deseja-se maior segurança ao processo, recomenda-se o desligamento da opção de apontamento automático. Caso deseja-se maior agilidade com menos segurança e por consequência com alguma possibilidade de erro, recomenda-se habilitar a opção de apontamento automático. Lembrando que ao final de todo o processo ainda existirá a consistência do conferido x esperado em NF.
                1. Quantidade de SKUs
                  • Em caso de quantidade de SKUs divergente, como por exemplo ao exceder a capacidade de um palete, o operador será notificado e o cursor ficará no campo quantidade de skus com a quantidade obtida do GS1-128, desta forma o
              usuário
                  • operador poderá manualmente interromper a operação ou informar outro valor para o campo.

               


              1. Para atingir o resultado esperado detalhado acima, as seguintes alteração de funções e programas serão necessárias: 
                1. WMSR130 - Função responsável pelas principais regras relacionadas ao GS1-128.
                  1. Criar função wmsr130_deposit_utiliza_cod_barras_gs1_128() para verificar se o depositante possui configuração GS1-128 configurado.
                    • Os parâmetros de empresa e depositante necessários para a implementação terão sido setados via wmsr130_set_empresa() e wmsr130_set_deposit.().
                    • Se a consulta SQL abaixo retornar NULL, então retorno da função de verá ser FALSE, senão retorno deverá ser TRUE.

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

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

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

                      Bloco de código
                      languagesql
                      theme
                5. Confluence
                    • Eclipse
                      titleExemplo de implementação para verificar se foram encontrados atributos na decodificação do GS1-128.
                      linenumberstrue
                      collapsetrue
                          ...
                         IF mr_atributos_logix_gs1_128.cod_barras_sku IS NOT NULL AND mr_atributos_logix_gs1_128.cod_barras_sku <> ' ' THEN
                            RETURN TRUE
                         END IF 
                         ...
                         IF wmsr130_decodificacao_encontrou_dimensionais()  THEN
                            RETURN TRUE
                         END IF 
                         
                         RETUN FALSE 
                      END FUNCTION 
                6. WMS6730 - Função responsável por controlar a interface de coletor de dados referente ao GS1-128.
                  1. Criar uma nova variável modular m_leitura_teste responsável por controlar quando uma leitura de código de barras GS1-128 será ou não teste.
                  2. Alterar função wms6730_solicita_cod_barras_gs1_128() para que as opções disponíveis por teclas de função sejam alteradas quando a rotina origem for diferente do WMS6728.
                    • Já no início da função, logo após declaração de variáveis inicializar o valor da variável m_leitura_teste como FALSE;
                    • No input de dados, no evento disparado ao pressionar F10 (ON KEY F10), quando a rotina origem for diferente de WMS6728 exibir "<ESC> Voltar", "F6/CTRL-L Confirma" e "F8/CTRL-O Ini Test". Quando rotina origem for WMS6728 permanecer "<ESC> Voltar" e "F4/CTRL-K Confirma";
                    • No input de dados, no evento disparado ao pressionar F4 (ON KEY F4), tratar para que só seja disparado alguma ação quando a rotina origem for igual a WMS6728;
                    • No input de dados, no evento disparado ao pressionar F8 (ON KEY F8), caso a rotina origem seja diferente de WMS6728 atribuir TRUE para a variável m_leitura_teste caso ela esteja como FALSE, e atribuir FALSE caso ela esteja como TRUE. Ao atribuir TRUE escrever em tela "Leitura teste" conforme demonstrado através de imagem nos exemplos acima (tela 5.2.1). Ao atribuir FALSE apagar "Leitura teste" da tela.
                    • No input de dados, no evento disparado ao pressionar F6 (ON KEY F6), caso a rotina origem seja diferente de WMS6728, processar a decodificação do GS1-128 através da função wms6730_processa_cod_barras_gs1_128().
                  3. Alterar a função wms6730_processa_cod_barras_gs1_128() para que não apresente em tela os atributos decodificados do GS1-128 caso a rotina origem seja diferente de WMS6728 ou caso a leitura não seja teste.
                    • Se m_leitura_teste = FALSE então não apresentar os atributos decodificados do GS1-128 em tela.
                    • Se m_leitura_teste = TRUE OR m_rotina_origem = 'WMS6728' , continuar apresentando em tela os atributos obtidos do GS1-128.
                  4. Nota! Como resultado final, independente da rotina origem e do tipo de leitura (teste ou não) manter a validação que não permite informar códigos de barras GS1-128 repetidos, e da leitura máxima de códigos de barras para disparar a decodificação.
                7. WMS6190 - Conferencia do Recebimento
                  1. Criar novo record mr_dimensional_valido com todos os dimensionais, o tipo de dados deve ser SMALLINT para todos eles. O objetivo é que este record indique quais dimensionais obtidos do GS1-128 foram validados pela rotina chamadora (mais detalhes nos próximos passos)
                  2. Alterar a função wmsr130_set_null() para definir o valor de todos os dimensionais  do mr_dimensional_valido para FALSE.
                  3. Criar funções wmsr130_set_<<dimensional>_eh_valido(eh_valido) para identificar se o valor obtido do código de barras GS-128 é válido para o processo no qual está sendo usado. O objetivo é que o chamador da rotina obtenha o valor do GS1-128, valide no processo que está sendo usado e então o marque como válido através destas funções. O parâmetro recebido pela função deverá alimentar o respectivo dimensional do record mr_dimensional_valido.
                    • Segue abaixo exemplo do resultado esperado

                      Bloco de código
                      languagesql
                      themeEclipse
                      titleExemplo de implementação para as funções wmsr130_set_<<dimensional>>_eh_valido(l_eh_valido).
                      linenumberstrue
                      collapsetrue
                      #-------------------------------------------------------------------------#
                      FUNCTION wmsr130_set_lote_eh_valido(l_eh_valido)
                      #-------------------------------------------------------------------------#
                         DEFINE l_eh_valido SMALLINT
                         LET mr_dimensional_valido.lote = l_eh_valido
                      END FUNCTION
                      #-------------------------------------------------------------------------#
                  4. Criar as funções wmsr130_get_<<dimensional>>_eh_valido() para identificar se o valor obtido do GS1-128 já foi validado e pode ser utilizado no processo.
                    • Segue abaixo exemplo do resultado esperado.

                      Bloco de código
                      languagesql
                      themeEclipse
                      titleExemplo de implementação para as funções wmsr130_get_<<dimensional>>_eh_valido().
                      linenumberstrue
                      collapsetrue
                      #-------------------------------------------------------------------------#
                      FUNCTION wmsr130_get_lote_eh_valido()
                      #-------------------------------------------------------------------------#
                         RETURN mr_dimensional_valido.lote
                      END FUNCTION
                      #-------------------------------------------------------------------------#
                  5. Alterar funções wmsr130_get_<<dimensional>> para retornar os dimensionais lote, peça, número de série, em caixa alta (maíúsculo\UPSHIFT).
                8. WMS6730 - Função responsável por controlar a interface de coletor de dados referente ao GS1-128.
                  1. Criar uma nova variável modular m_leitura_teste responsável por controlar quando uma leitura de código de barras GS1-128 será ou não teste.
                  2. Alterar função wms6730_solicita_cod_barras_gs1_128() para que as opções disponíveis por teclas de função sejam alteradas quando a rotina origem for diferente do WMS6728.
                    • Já no início da função, logo após declaração de variáveis inicializar o valor da variável m_leitura_teste como FALSE;
                    • No input de dados, no evento disparado ao pressionar F10 (ON KEY F10), quando a rotina origem for diferente de WMS6728 exibir "<ESC> Voltar", "F6/CTRL-L Confirma" e "F8/CTRL-O Ini Test". Quando rotina origem for WMS6728 permanecer "<ESC> Voltar" e "F4/CTRL-K Confirma";
                    • No input de dados, no evento disparado ao pressionar F4 (ON KEY F4), tratar para que só seja disparado alguma ação quando a rotina origem for igual a WMS6728;
                    • No input de dados, no evento disparado ao pressionar F8 (ON KEY F8), caso a rotina origem seja diferente de WMS6728 atribuir TRUE para a variável m_leitura_teste caso ela esteja como FALSE, e atribuir FALSE caso ela esteja como TRUE. Ao atribuir TRUE escrever em tela "Leitura teste" conforme demonstrado através de imagem nos exemplos acima (tela 5.2.1). Ao atribuir FALSE apagar "Leitura teste" da tela.
                    • No input de dados, no evento disparado ao pressionar F6 (ON KEY F6), caso a rotina origem seja diferente de WMS6728, processar a decodificação do GS1-128 através da função wms6730_processa_cod_barras_gs1_128().
                  3. Alterar a função wms6730_processa_cod_barras_gs1_128() para que não apresente em tela os atributos decodificados do GS1-128 caso a rotina origem seja diferente de WMS6728 ou caso a leitura não seja teste.
                    • Se m_leitura_teste = FALSE então não apresentar os atributos decodificados do GS1-128 em tela.
                    • Se m_leitura_teste = TRUE OR m_rotina_origem = 'WMS6728' , continuar apresentando em tela os atributos obtidos do GS1-128.
                  4. Nota! Como resultado final, independente da rotina origem e do tipo de leitura (teste ou não) manter a validação que não permite informar códigos de barras GS1-128 repetidos, e da leitura máxima de códigos de barras para disparar a decodificação.

                9. WMS6190 - Conferencia do Recebimento
                  1. Antes de detalhar cada alteração necessária, vale explicar o objetivo geral da maior parte do esforço. Como será necessário ler as informações do código de barras GS1-128, validá-las e não solicitar a informação ao operador, será preciso encapsular em funções as validações hoje realizadas na estrutura de input de dados através dos eventos after field. Encapsulando em funções será possível chamar estas rotinas de validação em outras situação como por exemplo logo após a leitura dos atributos do GS1-128.
                  2. Ainda sem mencionar uma alteração específica e explicando o objetivo das alterações neste programa, vale explicar de que modo se estruturou a forma de implementação das alterações. Logo após informar a identificação de estoque (before field cod_barras) será solicitado o código de barras GS1-128 (tela 5 das imagens do exemplo). Após a confirmação, os valores de código de barras do SKU e dimensionais obtidos do GS1-128 serão validados, caso tudo ocorra com sucesso, o cursor deverá ser direcionado ao próximo campo (next field), no before field deste próximo campo ocorrerá a validação da informação deste campo obtido do GS-128, estando ok, o cursor é direcionado ao próximo campo e assim por diante. Desta forma, ao final, caso todos os campos sejam válidos, uma nova leitura de palete será solicitada. Caso algum valor seja inválido ou não tenha sido obtido do GS1-128, ao invés de direcionar o cursor para o campo seguinte, o foco ficará no próprio campo para que o operador possa informa-lo\corrigi-lo, ou mesmo interromper a operação.
                  3. Criar função wms6190_valid_cod_barras_sku() paracentralizar o códigos responsáveis pela validação do código de barras do SKU.
                    • Diversos passos deverão ser realizados para validar o código de barras do SKU. Todos eles estão listados abaixo e podem ser implementados nesta mesma sequencia que são apresentados. A função deverá retornar TRUE para sucesso e FALSE para falha. Os blocos de códigos mencionados abaixo foram copiados do próprio input de dados da função wms6190_processo_conferencia(), do evento after field cod_barras, por conta disso substituir as instrução NEXT FIELD cod_barras por RETURN FALSE.

                    • Para validar se o código de barras informado existe, segue abaixo:

                      Bloco de código
                      languagesql
                      themeEclipse
                      titleBloco de código responsável por verificar se código de barras existe.
                      linenumberstrue
                      collapsetrue
                      CALL wmst86_wms_item_sku_cod_barras_verifica_cod_barras(mr_parametros.empresa,mr_conferencia.cod_barras,m_depositante,1) 
                                 RETURNING l_encontrou ,l_item, l_sku        
                              IF l_encontrou = FALSE THEN
                                 LET l_msg = log0030_mensagem_get_texto()
                                 CALL wms6190_help(l_msg)
                                 NEXT FIELD cod_barras
                              END IF
                    • Sendo o código de barras válido, o item será retornado na função anterior. Validar se o item do código de barras do SKU está em processo de inventário.

                      Bloco de código
                      languagesql
                      themeEclipse
                      titleBloco de código responsável por verificar se item está em processo de inventário.
                      linenumberstrue
                      collapsetrue
                      IF wmsr51_f4_verifica_emp_item(p_cod_empresa,mr_conferencia.item) THEN
                                 LET l_msg = "Nao e possivel realizar a conferencia do recebimento pois o item esta em processo de inventario."
                                 CALL wms6190_help(l_msg)
                                 NEXT FIELD cod_barras
                              END IF
                    • Em seguida verificar se o item é controlado pelo WMS.

                      Bloco de código
                      languagesql
                      themeEclipse
                      titleBloco de código responsável por verificar se o item é controlado pelo WMS.
                      linenumberstrue
                      collapsetrue
                      CALL wms0004_item_sob_controle_wms(mr_parametros.empresa,mr_conferencisa.item) RETURNING l_status , l_item_wms
                              IF l_status = FALSE THEN
                                 RETURN FALSE
                              ELSE
                                 IF l_item_wms = FALSE THEN
                                    LET l_msg = "Item nao e controlado pelo WMS."
                                    CALL wms6190_help(l_msg)
                                    NEXT FIELD cod_barras
                                 END IF
                              END IF
                    • Para verificar se o item possui alguma classificação de risco segue bloco abaixo. Para esta função de validação, a variável m_item_com_classe_onu  não precisará ser alimentada (pode ser retirada ).

                      Bloco de código
                      languagesql
                      themeEclipse
                      titleBloco de código responsável por verificar se o item possui alguma classificação de risco.
                      linenumberstrue
                      collapsetrue
                      LET m_item_com_classe_onu = FALSE
                              IF wmsm140_wms_item_restrito_existe(mr_parametros.empresa,mr_conferencia.item,TRUE,1)THEN
                                 IF wms6190_verifica_classific_ONU(mr_conferencia.item) THEN
                                    LET l_msg = "O palete possui itens que sao incompativeis ao item informado."
                                    CALL wms6190_help(l_msg)
                                    NEXT FIELD cod_barras
                                 END IF
                                 CALL wmsr29_verifica_restricao_item_endereco(mr_parametros.empresa, mr_conferencia.item, m_endereco_conferencia,1) RETURNING l_status, l_status2
                                 IF (l_status = TRUE  AND l_status2 = TRUE )
                                 OR (l_status = FALSE AND l_status2 = FALSE ) THEN
                                    IF l_status = TRUE THEN
                                       LET l_msg = "O endereco da conferencia possui itens incompativeis com o item informado."
                                       CALL wms6190_help(l_msg)
                                    END IF
                                    NEXT FIELD cod_barras
                                 END IF
                                 LET m_item_com_classe_onu = TRUE
                              END IF
                    • Para verificar se o depositante do item encontrado para o código de barras do SKU é o mesmo do depositante da OS.

                      Bloco de código
                      languagesql
                      themeEclipse
                      titleBloco de código responsável por verificar se o depositante do item é o depositante da OS.
                      linenumberstrue
                      collapsetrue
                      IF NOT wmsm81_wms_item_complemento_leitura(mr_parametros.empresa, mr_conferencia.item, TRUE, 1) THEN
                                 LET l_msg = "Item nao cadastrado no WMS."
                                 CALL wms6190_help(l_msg)
                                 NEXT FIELD cod_barras
                              END IF
                                      
                              LET l_deposit             = wmsm81_wms_item_complemento_get_deposit()
                              IF l_deposit <> m_depositante THEN
                                 LET l_msg = "Produto nao pertence ao depositante da OS."
                                 CALL wms6190_help(l_msg)
                                 NEXT FIELD cod_barras
                              END IF
                    • Além de verificar se  o depositante da OS é o mesmo do depositante do item, deve-se consistir se no palete existem itens que permitem ser misturados com outros bem como verificar se o item que está sendo incluído no palete permite ser misturado com outros que já estão no palete.  (Observar no código abaixo os comentários com o nome "MURILO".)

                      Bloco de código
                      languagesql
                      themeEclipse
                      titleBloco de código responsável por verificar a possibilidade de misturar itens diferentes no palete.
                      linenumberstrue
                      collapsetrue
                      LET l_palete_misto        = wmsm81_wms_item_complemento_get_permite_palete_misto()
                              #Se o depositante restringe item na armazenagem não permite receber paletes mistos mesmo o SKU permitindo
                              IF m_deposit_resting_item_unico = 'S' THEN
                                 LET l_palete_misto = "N"
                              END IF
                              IF  l_palete_misto = "N" THEN
                                  # O item nao pode ser armazenado em palete misto. Verifica se no palete existem produtos diferentes do atual.
                                  #MURILO: VERIFICAR A POSSIBILIDADE DE COLOCAR A CONSULTA SQL ABAIXO EM UMA FUNÇÃO. wms6190_get_qtd_itens_diferentes_no_palete()
                                  WHENEVER ERROR CONTINUE
                                  SELECT COUNT(wms_iden_estoque_conferencia.item)
                                    INTO l_produtos_diferentes  #MURILO alterar para uma modular pois será utilziado em outra função
                                    FROM wms_iden_estoque_conferencia
                                   WHERE wms_iden_estoque_conferencia.empresa = mr_parametros.empresa
                                     AND wms_iden_estoque_conferencia.palete = mr_conferencia.etiq_palete
                                     AND ((wms_iden_estoque_conferencia.item <> mr_conferencia.item)
                                        OR (wms_iden_estoque_conferencia.item = mr_conferencia.item AND wms_iden_estoque_conferencia.sku <> mr_conferencia.sku))
                                     AND wms_iden_estoque_conferencia.identif_estoque <> mr_conferencia.etiq_estoque
                                  WHENEVER ERROR STOP
                                  IF  sqlca.sqlcode <> 0 AND sqlca.sqlcode <> NOTFOUND THEN
                                      LET l_msg = "Falha! SELECT wms_iden_estoque_conferencia"
                                      CALL wms6190_help(l_msg)
                                      NEXT FIELD cod_barras
                                  END IF
                              ELSE
                                   #MURILO: VERIFICAR A POSSIBILIDADE DE COLOCAR A CONSULTA SQL ABAIXO EM UMA FUNÇÃO. wms6190_get_qtd_itens_nao_permite_misto_no_palete()
                                  WHENEVER ERROR CONTINUE
                                  SELECT COUNT(wms_iden_estoque_conferencia.item)
                                    INTO l_produtos_diferentes #MURILO alterar para uma modular pois será utilziado em outra função
                                    FROM wms_iden_estoque_conferencia, wms_item_complemento
                                   WHERE wms_iden_estoque_conferencia.empresa = mr_parametros.empresa
                                     AND wms_iden_estoque_conferencia.palete = mr_conferencia.etiq_palete
                                     AND ((wms_iden_estoque_conferencia.item <> mr_conferencia.item)
                                        OR (wms_iden_estoque_conferencia.item = mr_conferencia.item AND wms_iden_estoque_conferencia.sku <> mr_conferencia.sku))
                                     AND wms_iden_estoque_conferencia.identif_estoque <> mr_conferencia.etiq_estoque
                                     AND wms_item_complemento.empresa = wms_iden_estoque_conferencia.empresa
                                     AND wms_item_complemento.item = wms_iden_estoque_conferencia.item
                                     AND wms_item_complemento.permite_palete_misto = "N"
                                  WHENEVER ERROR STOP
                                  IF  sqlca.sqlcode <> 0 AND sqlca.sqlcode <> NOTFOUND THEN
                                      LET l_msg = "Falha! SELECT wms_iden_estoque_conferencia"
                                      CALL wms6190_help(l_msg)
                                      NEXT FIELD cod_barras
                                  END IF
                              END IF
                              
                              #MURILO este tratamento de ser for NULL retornar 0 pode ficar dentro das funções mencionadas acima.
                              IF  l_produtos_diferentes IS NULL THEN
                                  LET l_produtos_diferentes = 0
                              END IF
                       
                              IF  l_produtos_diferentes > 0 THEN
                                  LET l_msg = "O produto informado nao pode ser armazenado em palete misto."
                                  IF m_deposit_resting_item_unico = 'S' THEN
                                     LET l_msg = l_msg CLIPPED, " Contrato restringe"
                                  END IF
                                  CALL wms6190_help(l_msg)
                                  NEXT FIELD cod_barras
                              END IF
                    • Validar se o item controla o dimensional endereço (para itens wms é obrigatório). 

                      Bloco de código
                      languagesql
                      themeEclipse
                      titleBloco de código responsável por validar se o item possui controle por endereço.
                      linenumberstrue
                      collapsetrue
                      IF manm8_item_ctr_grade_leitura(mr_parametros.empresa,0,0,0,0,0,l_item,TRUE,1) THEN
                         IF manm8_item_ctr_grade_get_ies_endereco() <> "S" THEN
                            LET l_msg = "O produto informado nao possui controle por endereco (dimensional)."
                            CALL wms6190_help(l_msg)
                            NEXT FIELD cod_barras
                         END IF
                      END IF 
                  4. Criar função wms6190_after_field_cod_barras_sku() . O objetivo desta função é preencher\carregar campos da tela uma vez que o código de barras informado seja válido.
                    • Da mesma forma que na função e validação mencionada acima, diversos passos deverão ser realizados para realizar o carregamento\preenchendo dos campos uma vez que o código de barras do SKU seja válido. Todos estes passos estão listados abaixo e podem ser implementados nesta mesma sequencia que são apresentados. Os blocos de códigos mencionados abaixo foram copiados do próprio after field cod_barras do input de dados da função wms6190_processo_conferencia().
                    • Carregar as informações do SKU e do item.

                      Bloco de código
                      languagesql
                      themeEclipse
                      titleBloco de código responsável por carregar as informações de SKU e Item.
                      linenumberstrue
                      collapsetrue
                      #MURILO Não existe necessidade de testar erro no retorno das funções uma vez que este procedimento já foi feito no valid.
                      CALL wmst86_wms_item_sku_cod_barras_verifica_cod_barras(mr_parametros.empresa,mr_conferencia.cod_barras,m_depositante,1) 
                                 RETURNING l_encontrou ,l_item, l_sku        
                       
                      LET mr_conferencia.sku = l_sku
                      LET mr_conferencia.item = l_item
                    • Carregar informação da existência ou não de restrição do item (por classe ONU).

                      Bloco de código
                      languagesql
                      themeEclipse
                      titleBloco de código responsável por carregar as informações de restrição do item (ONU).
                      linenumberstrue
                      collapsetrue
                      LET m_item_com_classe_onu = FALSE
                      IF wmsm140_wms_item_restrito_existe(mr_parametros.empresa,mr_conferencia.item,TRUE,1)THEN
                         LET m_item_com_classe_onu = TRUE
                      END IF
                    • Carregar as informações de tipo de estoque x restrição do item caso sejam diferentes de vazias.

                      Bloco de código
                      languagesql
                      themeEclipse
                      titleBloco de código responsável por carregar as informações de tipo de estoque e restrição do item.
                      linenumberstrue
                      collapsetrue
                      CALL wmsm81_wms_item_complemento_leitura(mr_parametros.empresa, mr_conferencia.item, FALSE, 1)
                       
                      LET m_bloqueia_identif = FALSE        
                              LET l_tip_estoque_recebto = wmsm81_wms_item_complemento_get_tip_estoque_recebto()
                              LET l_restricao_recebto   = wmsm81_wms_item_complemento_get_restricao_recebto()
                              IF (l_tip_estoque_recebto CLIPPED IS NOT NULL) AND
                                 (l_restricao_recebto CLIPPED IS NOT NULL) THEN
                                 LET mr_conferencia.tip_estoque = l_tip_estoque_recebto
                                 LET mr_conferencia.restricao = l_restricao_recebto
                                 DISPLAY mr_conferencia.tip_estoque TO tip_estoque
                                 DISPLAY mr_conferencia.restricao TO restricao
                                 LET m_bloqueia_identif = TRUE
                              END IF
                      
                      
                    • Carregar unidade de medida do item.

                      Bloco de código
                      languagesql
                      themeEclipse
                      titleBloco de código responsável por carregar as informações de unidade de medida do item.
                      linenumberstrue
                      collapsetrue
                      CALL manm5_item_leitura(mr_parametros.empresa,mr_conferencia.item, TRUE, 1)
                       
                      LET mr_conferencia.cod_unid_med = manm5_item_get_cod_unid_med()
                      LET m_cod_unid_med_orig = mr_conferencia.cod_unid_med
                      DISPLAY mr_conferencia.cod_unid_med TO cod_unid_med   
                    • Carregar informação do último item lido.

                      Bloco de código
                      languagesql
                      themeEclipse
                      titleBloco de código responsável por carregar o último cod_barras lido.
                      linenumberstrue
                      collapsetrue
                      LET m_ultimo_cod_barras = mr_conferencia.cod_barras
                    • Carregar as modulares referente as informações para paletização do SKU.

                      Bloco de código
                      languagesql
                      themeEclipse
                      titleBloco de código responsável por carregar as informações para paletização do SKU.
                      linenumberstrue
                      collapsetrue
                      IF wmsm60_wms_item_sku_leitura(mr_parametros.empresa,mr_conferencia.item ,mr_conferencia.sku ,TRUE,1) THEN
                         LET m_qtd_item = wmsm60_wms_item_sku_get_qtd_item()
                         LET m_qtd_caixa_altura = wmsm60_wms_item_sku_get_qtd_caixa_altura()
                         LET m_qtd_caixa_lastro = wmsm60_wms_item_sku_get_qtd_caixa_lastro()
                         LET m_controla_lastro_altura = wmsm60_wms_item_sku_get_controla_lastro_altura()
                      END IF
                  5. Criar função wms6190_controle_dimensionais() para centralizar as regras referente a verificação e solicitação dos dimensionais. 
                    • Incluir o bloco de código mencionado abaixo, foi copiado do próprio after field cod_barras do input de dados da função wms6190_processo_conferencia(). (Observar no código abaixo os comentários com o nome "MURILO".)

                      Bloco de código
                      languagesql
                      themeEclipse
                      titleBloco de código responsável por controlar a informação de dimensionais do item.
                      linenumberstrue
                      collapsetrue
                      CALL manm5_item_leitura(mr_parametros.empresa,mr_conferencia.item, FALSE, 1)
                      LET l_ies_ctr_lote = manm5_item_get_ies_ctr_lote()
                      # Verifica se existe controle de dimensionais
                      LET m_ctr_ender_nao_mapeado = FALSE # MURILO não precisará alterar valor desta modular pode ser retirada
                      IF wms6190_verifica_dimensional(l_ies_ctr_lote,mr_conferencia.item) THEN
                         LET m_permite_recebimento = TRUE
                         CALL wms6190_informa_dimensional(mr_conferencia.item)
                         IF NOT m_permite_recebimento THEN
                            NEXT FIELD cod_barras # MURILO RETORNAR FALSE
                         END IF
                      END IF
                      #MURILO RETORNAR TRUE
                  6. Criar função wms6190_valid_endereco_apto_receber_palete() para centralizar as regras referente a validação da existência ou não de endereços mapeados para receber o palete. Por ser uma função de validação deverá retornar TRUE para sucesso e FALSE para falha.
                    • Incluir o bloco de código mencionado abaixo, foi copiado do próprio after field cod_barras do input de dados da função wms6190_processo_conferencia(), por conta disso substituir a instrução NEXT FIELD cod_barras por RETURN FALSE. Ao final da função retornar TRUE.

                      Bloco de código
                      languagesql
                      themeEclipse
                      titleBloco de código responsável por validar se existe mapeamento para receber o palete.
                      linenumberstrue
                      collapsetrue
                      IF  l_produtos_diferentes > 0 THEN #MURILO SUBSTITUIR PELA MODULAR QUE DEVE TER SIDO CRIADO NO ITEM c) iii)
                                  LET mr_item_palete.item           = mr_conferencia.item
                                  LET mr_item_palete.sku            = mr_conferencia.sku
                                  LET mr_item_palete.categoria_item = wmsm81_wms_item_complemento_get_cat_item()
                                  LET mr_item_palete.tipo_estoque   = mr_conferencia.tip_estoque
                                  LET mr_item_palete.restricao      = mr_conferencia.restricao
                                  LET mr_item_palete.qtd_sku        = 1 # não será utilizado
                      
                                  IF  NOT wmsr24_verifica_existe_mapeamento_palete(mr_parametros.empresa,
                                                                                   m_local_conferencia,
                                                                                   mr_conferencia.etiq_palete,
                                                                                   mr_item_palete.*,
                                                                                   1) THEN
                                     LET l_msg = "Nao existe endereco apto a receber os itens do palete."   
                                     CALL wms6190_help(l_msg)
                                     NEXT FIELD cod_barras
                                  END IF
                              END IF
                  7. Criar função wms6190_valid_sku_identif_agrup() para centralizar as validações referente a identificação agrupadora ao informar o código de barras do SKU. 
                    • Incluir o bloco de código mencionado abaixo, foi copiado do próprio after field cod_barras do input de dados da função wms6190_processo_conferencia(), por conta disso substituir a instrução NEXT FIELD cod_barras por RETURN FALSE. Ao final da função retornar TRUE. 

                      Bloco de código
                      languagesql
                      themeEclipse
                      titleBloco de código responsável pela validação da etiqueta agrupadora no campo código de barras do SKU.
                      linenumberstrue
                      collapsetrue
                      IF m_identif_agrupadora THEN
                                 IF wms6190_verifica_item_sku_identif_agrup() THEN
                                    LET l_msg = "Item ja conferido para essa identificacao agrupadora, porem com um SKU diferente."
                                    CALL wms6190_help(l_msg)
                                    NEXT FIELD cod_barras
                                 END IF
                                 IF wms6190_verifica_item_identif_agrup() THEN
                                    LET l_msg = "Item ja conferido para essa identificacao agrupadora. Sera  considerada a nova quantidade digitada. Caso queira excluir o item, informe 0 na quantidade."
                                    CALL wms6190_help(l_msg)
                                 END IF
                              END IF
                  8. Criar função wms6190_valid_cod_unid_med() para centralizar as validações referente a unidade de medida. 

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

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

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

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

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

                      Bloco de código
                      languagesql
                      themeEclipse
                      titleBloco de código responsável por validar a quantidade de skus.
                      linenumberstrue
                      collapsetrue
                                    IF  mr_conferencia.qtd_sku IS NULL OR mr_conferencia.qtd_sku < 0 THEN
                                        NEXT FIELD qtd_sku
                                    END IF
                                    IF  mr_conferencia.qtd_sku <> 0 AND mr_conferencia.qtd_item = 0 THEN
                                       LET l_msg = "Quantidade incorreta de item no  SKU."
                                       CALL wms6190_help(l_msg)
                                       NEXT FIELD qtd_item
                                    END IF
                                    IF NOT wmsm134_wms_iden_estoque_conferencia_validate_qtd_sku(mr_conferencia.qtd_sku,1) THEN
                                       NEXT FIELD qtd_sku
                                    END IF
                    • Após as validações acima referente a quantidade de SKU, fazer chamada para as funções wms6190_valid_peso_palete(), wms6190_valid_lastro_palete(). Este conjunto de código deve fazer parte da função wms6190_valid_qtd_sku()
                  13. Criar função wms6190_valid_numero_serie() para centralizar as validações referente ao dimensional número de série.
                    • Atualmente a validação de número de série consiste em verificar e garantir que não existe outro número de série igual para o mesmo item no estoque. O número de série deve ser o identificador único do item.
                    • Incluir o bloco de código mencionado abaixo, foi copiado do próprio after field valor do input de dados da função wms6190_informa_dimensional(), por conta disso substituir a instrução NEXT FIELD valor por RETURN FALSE e remover a instrução CURRENT WINDOW. Ao final da função retornar TRUE. 

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

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

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

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

                      Bloco de código
                      languagesql
                      themeEclipse
                      titleSugestão para implementação dos valores do código de barras gs1-128 ao record de tela dos dimensionais.
                      linenumberstrue
                      collapsetrue
                      ...
                      IF  manm5_item_leitura(empresa, item, FALSE,1) THEN
                         IF manm5_item_get_ies_ctr_lote() = "s" THEN
                            IF wmsr130_get_lote() IS NOT NULL AND wmsr130_get_lote() <> " "THEN  
                               LET mr_dimensional.lote =  wmsr130_get_lote()
                               wmsr130_set_lote_eh_valido(TRUE)
                            END IF 
                         END IF 
                      END IF
                      ...
                      IF manm8_item_ctr_grade_leitura(empresa,0,0,0,0,0,item,TRUE,1)  THEN
                         IF  manm8_item_ctr_grade_get_ies_dat_validade() = "S" THEN
                            IF wmsr130_get_data_validade() IS NOT NULL AND wmsr130_get_data_validade() <> l_date_time_null THEN  
                               LET mr_dimensional.dat_validade =  wmsr130_get_data_validade()
                               CALL wmsr130_set_data_validade_eh_valido(TRUE)         
                               IF NOT wms6190_valid_dt_hor_validade() THEN
                                  CALL wmsr130_set_data_validade_eh_valido(FALSE)             
                              END IF  
                            END IF  
                         END IF 
                      END IF
                      ...
                      CALL wms6190_valida_valor_dimensionais()
                  19. Alterar função wms6190_verifica_existe_conferencia() para buscar e exibir os dimensionais já informados anteriormente da identificação de estoque somente se estes não tenham sido lidos do GS1-128. Os dimensionais lidos do GS1-128 devem prevalecer sobre os informados anteriormente para a identificação de estoque, para isso seguir os passos abaixo:
                    • Caso o dimensional tenha sido lido do GS1-128 e seja válido, o dimensional não deverá ser solicitado ao operador, sendo assim, o ma_dimensionais e o ma_dimensionais_aux não devem ser carregados para este dimensional. Caso o valor não seja válido, porém tenha sido algum valor do GS1-128 este deve ser apresentado ao operador que poderá alterar  o valor quando for apresentado em tela. Para que este passos sejam realizados segue abaixo a sugestão de implementação.O exemplo abaixo é para o dimensional lote, replicar o trecho comentado com "#MURILO" para cada bloco de dimensional existente na função wms6190_verifica_existe_conferencia().

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

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

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

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

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

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

                      Bloco de código
                      languagesql
                      themeEclipse
                      titleSugestão de implementação para validação de tipo de estoque x restrição permitidos na conferência do recebimento.
                      linenumberstrue
                      collapsetrue
                      LET m_sel_tip_estoque_falta_inv = FALSE
                        IF wmsr51_verifica_tipo_estoque_falta_inventario(mr_parametros.empresa,l_tip_estoque) THEN
                           CALL wms6190_help("Tipo de estoque de falta de inventario nao pode ser usado na conferencia.")
                           LET m_sel_tip_estoque_falta_inv = TRUE
                           RETURN FALSE
                        END IF
                        IF wmsr90_verifica_tip_estoque_restricao(mr_parametros.empresa,l_tip_estoque,l_restricao) THEN
                           CALL wms6190_help("Tipo de estoque/restricao de reconferencia da expedicao nao pode ser usado na conferencia.")
                           RETURN FALSE 
                        END IF
                        IF find4GLFunction('wmsr81_eh_tip_estoque_restricao_cross_docking') THEN
                           CALL wmsr81_eh_tip_estoque_restricao_cross_docking(mr_parametros.empresa,
                                                                              m_depositante        ,
                                                                              l_tip_estoque        ,
                                                                              l_restricao          ,
                        
                  23. Antes de detalhar cada alteração necessária, vale explicar o objetivo geral da maior parte do esforço. Como será necessário ler as informações do código de barras GS1-128, validá-las e não solicitar a informação ao operador, será preciso encapsular em funções as validações hoje realizadas na estrutura de input de dados através dos eventos after field. Encapsulando em funções será possível chamar estas rotinas de validação tanto através dos input de dados quanto em outras situação como por exemplo logo após a leitura dos atributos do GS1-128.
                  24. Ainda sem mencionar uma alteração específica e explicando o objetivo das alterações neste programa a serem mencionadas abaixo, vale explicar de que modo se estruturou a forma de implementação das alterações. Logo após informar a identificação de estoque (before field cod_barras) será solicitado o código de barras GS1-128 (tela 5 das imagens do exemplo). Após a confirmação, os valores de código de barras do SKU e dimensionais obtidos do GS1-128 serão validados, caso tudo ocorra com sucesso, o cursor deverá ser direcionado ao próximo campo (next field), no before field deste próximo campo ocorrerá a validação da informação deste campo obtido do GS-128, estando ok, o cursor é direcionado ao próximo campo e assim por diante. Desta forma, ao final, caso todos os campos sejam válidos, uma nova leitura de palete será solicitada. Caso algum valor seja inválido ou não tenha sido obtido do GS1-128, ao invés de direcionar o cursor para o campo seguinte, o foco ficará no próprio campo para que o operador possa informa-lo\corrigi-lo, ou mesmo interromper a operação.
                  25. Criar função wms6190_valid_cod_barras_sku() paracentralizar o códigos responsáveis pela validação do código de barras do SKU.
                    • Diversos passos deverão ser realizados para validar o código de barras do SKU. Todos eles estão listados abaixo e podem ser implementados nesta mesma sequencia que são apresentados. A função deverá retornar TRUE para sucesso e FALSE para falha. As possíveis mensagens de erro para o usuário deverão ser realizadas através da função log0030_processa_mensagem() via batchOs blocos de códigos mencionados abaixo foram copiados do próprio after field cod_barras por conta disso substituir as instruções wms6190_help() por log0030_processa_mensagem() e NEXT FIELD cod_barras por RETURN FALSE.
                    • Para validar se o código de barras informado existe. Atualmente é realizado pelo código abaixo.

                      Bloco de código
                      languagesql
                      themeEclipse
                      titleBloco de código responsável por verificar se código de barras existe
                      linenumberstrue
                      collapsetrue
                      CALL wmst86_wms_item_sku_cod_barras_verifica_cod_barras(mr_parametros.empresa,mr_conferencia.cod_barras,m_depositante,1) 
                                 RETURNING l_encontrou ,l_item, l_sku        
                              IF l_encontrou = FALSE THEN
                                 LET l_msg = log0030_mensagem_get_texto()
                                 CALL wms6190_help(l_msg)
                                 NEXT FIELD cod_barras
                              END IF
                    • Sendo o código de barras válido, o item será retornado na função anterior. Validar se o item do código de barras do SKU está em processo de inventário.

                      Bloco de código
                      languagesql
                      themeConfluence
                      titleBloco de código responsável por verificar se item está em processo de inventário
                      linenumberstrue
                      collapsetrue
                      IF wmsr51_f4_verifica_emp_item(p_cod_empresa,mr_conferencia.item) THEN
                                 LET l_msg = "Nao e possivel realizar a conferencia do recebimento pois o item esta em processo de inventario."
                                 CALL wms6190_help(l_msg)
                                 NEXT FIELD cod_barras
                              END IF
                    • Em seguida verificar se o item é controlado pelo WMS.

                      Bloco de código
                      languagesql
                      titleloco de código responsável por verificar se o item é controlado pelo WMS
                      linenumberstrue
                      collapsetrue
                      CALL wms0004_item_sob_controle_wms(mr_parametros.empresa,mr_conferencisa.item) RETURNING l_status , l_item_wms
                              IF l_status = FALSE THEN
                                 RETURN FALSE
                              ELSE
                                 IF l_item_wms = FALSE THEN
                                    LET l_msg = "Item nao e controlado pelo WMS."
                                                              1 CALL wms6190_help(l_msg)
                              RETURNING l_eh_tip_cross_docking
                           NEXT FIELD cod_barras
                          IF m_conferencia_cross_docking  = "S" THEN
                             END IF NOT l_eh_tip_cross_docking THEN
                              END IF

                      Para verificar se o item possui alguma classificação de risco segue bloco abaixo. Para esta função de validação, a variável m_item_com_classe_onu  não precisará ser alimentada (pode ser retirada ).

                      Bloco de código
                      languagesql
                      themeConfluence
                      titleBloco de código responsável por verificar se o item possui alguma classificação de risco
                      linenumberstrue
                      collapsetrue
                      LET m_item_com_classe_onu =   CALL wms6190_help("Deve ser utilizado tipo de estoque e restricao cross-docking.")
                                 RETURN FALSE
                              END IF wmsm140_wms_item_restrito_existe(mr_parametros.empresa,mr_conferencia.item,TRUE,1)
                           ELSE
                              IF l_eh_tip_cross_docking THEN
                                 IFCALL wms6190_verifica_classific_ONU(mr_conferencia.item) THEN
                         help("Tipo de estoque e restricao cross-docking nao podem ser usados na conferencia.")
                                 RETURN FALSE
                              END IF
                         LET l_msg =END "OIF
                       palete possui itens que sao incompativeis ao item informado."
                                    CALL wms6190_help(l_msg)
                                    NEXT FIELD cod_barras
                                 END IF
                                 CALL wmsr29_verifica_restricao_item_endereco(mr_parametros.empresa, mr_conferencia.item, m_endereco_conferencia,1) RETURNING l_status, l_status2
                                 IF (l_status = TRUE  AND l_status2 = TRUE )
                                 OR (l_status = FALSE AND l_status2 = FALSE ) THEN
                                    IF l_status = TRUE THEN
                                       LET l_msg = "O endereco da conferencia possui itens incompativeis com o item informado."
                                       CALL wms6190_help(l_msg)
                                    END IF
                                    NEXT FIELD cod_barras
                                 END IF
                                 LET m_item_com_classe_onu = TRUE
                              END IF
                    • Para verificar se o depositante do item encontrado para o código de barras do SKU é o mesmo do depositante da OS.

                      Bloco de código
                      languagesql
                      themeConfluence
                      titleBloco de código responsável por verificar se o depositante do item é o depositante da OS
                      linenumberstrue
                      collapsetrue
                      IF NOT wmsm81_wms_item_complemento_leitura(mr_parametros.empresa, mr_conferencia.item, TRUE, 1) THEN
                                 LET l_msg = "Item nao cadastrado no WMS."
                                 CALL wms6190_help(l_msg)
                                 NEXT FIELD cod_barras
                              END IF
                                      
                              LET l_deposit             = wmsm81_wms_item_complemento_get_deposit()
                              IF l_deposit <> m_depositante THEN
                                 LET l_msg = "Produto nao pertence ao depositante da OS."
                                 CALL wms6190_help(l_msg)
                                 NEXT FIELD cod_barras
                              END IF
                    • END IF
                      
                  26. Criar função wms6190_controle_cod_barras_gs1_128() que finalmente irá solicitar o código de barras GS1-128
                    • Esta função é a que finalmente irá solicitar o(s) código(s) de barras GS1-128. Abaixo serão detalhados os vários procedimentos e ao final uma sugestão de implementação contemplando a descrição destes passos.
                    • O primeiro passo para a função será verificar se o depositante utiliza ou não GS1-128. Caso ele não utilize a função poderá retornar FALSE sem executar nenhum processamento adicional.
                    • O depositante utilizando GS1-128 então os códigos de barras GS1-128 deverão ser solicitados ao operador. Para isso atribuir os parâmetros para wms6730 (wms6730_set_<<param>>) e chamar a função wms6730_solicita_cod_barras_gs1_128. 
                    • Logo após a chamada para wms6730_solicita_cod_barras_gs1_128, 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 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. Ao encontrar somente um código de barras SKU para o item depositante do GS1-128, carregar as variáveis de tela do código de barras do SKU(mr_conferencia.cod_barras) e do item (mr_conferencia.item).
                    • O próximo passo é validar o código de barras do GS1-128, para isso verificar se o código de barras é diferente de vazio\null, se sim carregar a variável de tela mr_conferencia.cod_barras e então chamar a função wms6190_valid_cod_barras_sku(). Se a função de validação retornar FALSE, então uma variável de controle deverá ser marcada como FALSE para que ao final seja retornado FALSE para a função wms6190_controle_cod_barras_gs1_128(). 
                    • Se a validação através da função  wms6190_valid_cod_barras_sku() ocorreu com sucesso, a função wms6190_after_field_cod_barras_sku deverá ser chamada para que os valores de tela referente ao item e código de barras SKU sejam carregados.
                    • Em seguida chamar a função wms6190_set_dimensionais_gs1_128() para que os valores dos dimensionais obtidos do GS1-128 sejam atribuídos ao record de tela que armazena os valores dos dimensionais.
                    • Após ter carregado o record de tela com os valores dos dimensionais, chamar a função wms6190_controle_dimensionais().
                    • Em seguida chamar a  função wms6190_valid_endereco_apto_receber_palete para verificar os endereços que podem receber o palete. Caso a função retorne FALSE, então a função wms6190_controle_cod_barras_gs1_128() também deverá retornar FALSE.
                    • Em seguida chamar a função wms6190_valid_sku_identif_agrup() para validar se o SKU é válido caso o processo for de etiqueta agrupadora.
                    • Para finalizar, a última validação deverá ser sobre o tipo de estoque x restrição obtido obtido do GS1-128. Para isso verificar se os atributos  tipo de estoque x restrição foram obtidos do GS1-128 (se possuem valores em wmsr130_get_). Possuindo valores, verificar se o operador possui permissão para alterar tipo de estoque x restrição através da função wms6190_verifica_permissao_usuario(). Caso não possua permissão o operador deverá ser notificado "Usuario sem permissao para alterar o tipo de estoque." e retornar FALSE. Possuindo permissão, passar os valores de tipo de estoque x restrição como parâmetro para a função wms6190_valid_tipo_estoque_restricao() que deverá retornar true quando tipo de estoque x restrição válido e FALSE quando inválido. Ao retornar tipo de estoque x restrição inválido, o operador já terá sido notificado e então continuar o processamento normal da função wms6190_controle_cod_barras_gs1_128(). Se retornar tipo de estoque x restrição válido, alimentar as variáveis de tela mr_conferencia.tip_estoque e mr_conferencia.restricao e realizar o DISPLAY em tela das mesmas.
                    • Segue abaixo sugestão de implementação contendo todos os passos mencionados acima:Além de verificar se  o depositante da OS é o mesmo do depositante do item, deve-se consistir se no palete existem itens que permitem ser misturados com outros bem como verificar se o item que está sendo incluído no palete permite ser misturados com outros que já estão no palete.  (Observar no código abaixo os comentários com o nome "MURILO".)

                      Bloco de código
                      languagesql
                      themeConfluenceEclipse
                      titleBloco Sugestão de código responsável por verificar a possibilidade de misturar itens diferentes no paleteimplementação para controle do código de barras do SKU, dimensionais e tipos de estoque x restrição.
                      linenumberstrue
                      collapsetrue
                      LET l_palete_misto        = wmsm81_wms_item_complemento_get_permite_palete_misto()
                              #Se o depositante restringe item na armazenagem não permite receber paletes mistos mesmo o SKU permitindo
                              IF m_deposit_resting_item_unico = 'S' THEN
                                 LET l_palete_misto = "N"
                              END IF
                              IF  l_palete_misto = "N" THEN
                                  # O item nao pode ser armazenado em palete misto. Verifica se no palete existem produtos diferentes do atual.
                                  #MURILO: VERIFICAR A POSSIBILIDADE DE COLOCAR A CONSULTA SQL ABAIXO EM UMA FUNÇÃO. wms6190_get_qtd_itens_diferentes_no_palete()
                                  WHENEVER ERROR CONTINUE
                                  SELECT COUNT(wms_iden_estoque_conferencia.item)IF NOT wmsr130_deposit_utiliza_cod_barras_gs1_128() THEN
                         RETURN FALSE
                      END IF
                      CALL  wms6730_set_null()
                      CALL wms6730_set_empresa(empresa)
                      CALL wms6730_set_depositante(depositante)
                      CALL wms6730_set_rotina_origem('WMS6190')
                      CALL wms6730_solicita_cod_barras_gs1_128()
                       
                      IF NOT wmsr130_decodificacao_encontrou_atributos() THEN
                         RETURN FALSE
                      END IF 
                       
                      IF ( wmsr130_get_item_depositante() IS NOT NULL AND wmsr130_get_item_depositante() <> "  ") AND (wmsr130_get_cod_barras_sku()  IS NULL OR wmsr130_get_cod_barras_sku() = " "))
                      	    #MURILO verificar se possui apenas um codigo de barras do SKU
                                  SELECT item, INTOsku, lcod_produtosbarras_diferentessku
                        #MURILO alterar para uma modular pois será utilziado em outra função
                          FROM wms_item_complemento 
                           INNER JOIN  FROM wms_idenitem_sku_estoquecod_conferenciabarras 
                                   WHERE        ON wms_idenitem_estoque_conferenciacomplemento.empresa = mr_parametroswms_item_sku_cod_barras.empresa
                                         AND wms_idenitem_estoque_conferenciacomplemento.paleteitem = mr_conferencia.etiq_palete
                      wms_item_sku_cod_barras.item
                                        AND ((wms_idenitem_estoque_conferenciacomplemento.itemdeposit <> mr_conferencia.item)
                      = wms_item_sku_cod_barras.deposit           
                             OR (wms_iden_estoque_conferencia.item = mr_conferencia.item AND     WHERE wms_idenitem_estoque_conferenciacomplemento.skuempresa <> mr_conferencia.sku))= :empresa
                                       AND wms_idenitem_estoque_conferenciacomplemento.identifitem_estoquedeposit <>= mr_conferencia.etiq_estoque:item_deposit
                       
                         IF tem_somente_um_sku THEN
                              WHENEVER ERROR STOP
                         LET mr_conferencia.cod_barras = cod_barras #do sql anterior
                             LET  IF  sqlca.sqlcode <> 0 AND sqlca.sqlcode <> NOTFOUND THEN
                                   mr_conferencia.item= item #do sql anterior
                         END IF
                      END IF 
                       
                      IF wmsr130_get_cod_barras() IS NOT NULL AND wmsr130_get_cod_barras() <> " " THEN
                         LET l_msgmr_conferencia.cod_barras = "Falha! SELECT wms_iden_estoque_conferencia"wmsr130_get_cod_barras()
                           IF wms6190_valid_cod_barras_sku THEN 
                                CALL wms6190_help(l_msgafter_field_cod_barras_sku()
                           ELSE   
                              NEXT FIELDLET l_cod_barras_valido = FALSE
                           END IF 
                       
                            END IFCALL wms6190_set_dimensionais_gs1_128 ()
                              ELSECALL wms6190_controle_dimensionais()
                           
                           IF   #MURILO: VERIFICAR A POSSIBILIDADE DE COLOCAR A CONSULTA SQL ABAIXO EM UMA FUNÇÃO. wms6190_get_qtd_itens_nao_permite_misto_no_palete()l_cod_barras_valido THEN
                      
                              IF NOT wms6190_valid_endereco_apto_receber_palete () THEN
                                  WHENEVERRETURN ERROR CONTINUEFALSE
                              END IF
                       
                         SELECT COUNT(wms_iden_estoque_conferencia.item)
                          IF NOT wms6190_valid_sku_identif_agrup THEN
                             INTO l_produtos_diferentes #MURILO alterar paraRETURN umaFALSE
                       modular pois será utilziado em outra função
                       END IF
                       
                          END IF 
                      END IF 
                       
                      IF (   FROM wms_iden_estoque_conferencia, wms_item_complemento
                                   WHERE wms_iden_estoque_conferencia.empresa = mr_parametros.empresa
                                     AND wms_iden_estoque_conferencia.palete = mr_conferencia.etiq_palete(wmsr130_get_tipo_estoque()  IS NOT NULL  AND wmsr130_get_tipo_estoque()  <> " ") 
                      AND  (wmsr130_get_restricao()  IS NOT NULL  AND wmsr130_get_restricao()  <> " ") )  THEN
                         IF NOT wms6190_verifica_permissao_usuario THEN
                             CALL wms6190_help("Usuario sem permissao para alterar o tipo AND ((wms_iden_estoque_conferencia.item <> mr_conferencia.itemde estoque.")
                             RETURN FALSE 
                          END IF 
                       
                         OR (wms_iden_estoque_conferencia.item = mr_conferencia.item AND wms_iden_estoque_conferencia.sku <> mr_conferencia.sku))
                                     AND wms_iden_estoque_conferencia.identif_estoque <> mr_conferencia.etiq_estoque
                                     AND wms_item_complemento.empresa = wms_iden_estoque_conferencia.empresa
                                     AND wms_item_complemento.item = wms_iden_estoque_conferencia.item
                                     AND wms_item_complemento.permite_palete_misto = "N"
                                  WHENEVER ERROR STOP
                                  IF  sqlca.sqlcode <> 0 AND sqlca.sqlcode <> NOTFOUND THEN
                                      LET l_msg = "Falha! SELECT wms_iden_estoque_conferencia"
                                      CALL wms6190_help(l_msg)
                                      NEXT FIELD cod_barras
                                  END IF
                              END IF
                              
                              #MURILO este tratamento de ser for NULL retornar 0 pode ficar dentro das funções mencionadas acima.
                              IF  l_produtos_diferentes IS NULL THEN
                                  LET l_produtos_diferentes = 0
                              END IF
                       
                              IF  l_produtos_diferentes > 0 THEN
                                  LET l_msg = "O produto informado nao pode ser armazenado em palete misto."
                                  IF m_deposit_resting_item_unico = 'S' THEN
                                     LET l_msg = l_msg CLIPPED, " Contrato restringe"
                                  END IF
                               IF NOT wms6190_valid_tipo_estoque_restricao(tipo_estoque, restricao) THEN
                              RETURN FALSE
                          END IF
                         
                          LET mr_conferencia.tip_estoque =  wmsr130_get_tipo_estoque()
                          LET mr_conferencia.restricao =  wmsr130_get_restricao()
                          DISPLAY mr_conferencia.tip_estoque
                          DISPLAY mr_conferencia.restricao 
                      END IF 
                  27. Criar a função wms6190_valid_cod_unid_med_gs1_128() para validar se a unidade de medida do GS1-128 é válida e pode ser utilizado no processo.
                    • Esta função deverá verificar se a unidade de medida foi obtida da decodificação do GS1-128, se sim, deverá verificar se permite alteração de unidade de medida (m_wms_permite_alt_unid_med_receb). Caso não permita (="N"), uma mensagem deverá ser disparada ao operador "Nao foi possivel atribuir a unidade de medida do GS1-128. Sistema configurado para nao permitir troca." e entao retornar FALSE para a função. Caso permita alteração de unidade de medida então deverá alimentar a variável de tela com o valor obtido do GS1-128 e realizar o DISPLAYda mesma. Em seguida deverá  chamar a função wms6190_valid_cod_unid_med(). Se a unidade de medida for inválida, a própria função irá disparar mensagem ao operador e retornar FALSE, ao retornar FALSE, retornar FALSE para a função wms6190_valid_cod_unid_med_gs1_128(). Se a unidade de medida for válida então a função wms6190_valid_cod_unid_med_gs1_128 deverá retornar TRUE.
                    • Segue abaixo sugestão de implementação.

                      Bloco de código
                      languagesql
                      themeEclipse
                      titleSugestão de implementação para a validação e atribuição da unidade de medida recebida do GS1-128.
                      linenumberstrue
                      collapsetrue
                       IF wmsr130_get_unidade_medida() IS NULL OR wmsr130_get_unidade_medida() = " " THEN
                          RETURN FALSE
                       END IF 
                      IF m_wms_permite_alt_unid_med_receb = 'N' THEN
                          CALL wms6190_help(l_msg)
                                  NEXT FIELD cod_barras'Nao foi possivel atribuir a unidade de medida do GS1-128. Sistema configurado para nao permitir troca.')
                           RETURN FALSE  
                      END IF
                    • Validar se o item controla o dimensional endereço (para itens wms é obrigatório). 

                      Bloco de código
                      languagesql
                      themeConfluence
                      titleBloco de código responsável por validar se o item possui controle por endereço
                      linenumberstrue
                      collapsetrue
                      IF manm8_item_ctr_grade_leitura(mr_parametros.empresa,0,0,0,0,0,l_item,TRUE,1) THEN
                         IF manm8_item_ctr_grade_get_ies_endereco() <> "S" THEN
                            LET l_msg = "O produto informado nao possui controle por endereco (dimensional)."
                            CALL wms6190_help(l_msg)
                            NEXT FIELD cod_barras
                         END IF
                      END IF 
                    Criar função  wms6190_after_field_cod_barras() . O objetivo desta função é preencher\carregar campos da tela uma vez que o código de barras informado é válido.
                    •    
                       
                      LET mr_conferencia.cod_unid_med = wmsr130_get_unidade_medida()
                      DISPLAY  mr_conferencia.cod_unid_med
                       
                      IF NOT wms6190_valid_cod_unid_med THEN
                             RETURN FALSE
                      END IF     
                       
                      RETURN TRUE
                  28. Criar a função wms6190_valid_qtd_item_gs1_128() para validar se a quantidade de itens obtido do GS1-128 é válida e pode ser utilizada no processo.
                    • Esta função deverá verificar se a quantidade de item foi obtida da decodificação do GS1-128, se sim, deverá alimentar a variável de tela com o valor obtido do GS1-128 e realizar o DISPLAY da mesma. Em seguida  deverá verificar se o valor é válido através da função wms6190_valid_qtd_item(). Caso a função wms6190_valid_qtd_item() retorne FALSE, a função wms6190_valid_qtd_item_gs1_128() também deverá retornar FALSE. Ao final da função retornar TRUE
                    • Segue abaixo sugestão de implementação

                    • Carregar as informações do SKU e do item
                    • .

                      Bloco de código
                      languagesql
                      theme
                    • Confluence
                    • Eclipse
                      title
                    • Bloco de código responsável por carregar as informações de SKU e Item
                    • Sugestão de implementação para a validação e atribuição do item do GS1-128.
                      linenumberstrue
                      collapsetrue
                    • #MURILO Não existe necessidade de testar erro no retorno das funções uma vez que este procedimento já foi feito no valid. CALL wmst86_wms_item_sku_cod_barras_verifica_cod_barras(mr_parametros.empresa,mr_conferencia.cod_barras,m_depositante,1) RETURNING l_encontrou ,l_item, l_sku
                    • IF wmsr130_get_qtd_item() IS NULL AND wmsr130_get_qtd_item() = " " THEN
                         RETURN FALSE
                      END IF 
                      LET mr_conferencia.qtd_item= wmsr130_get_qtd_item()
                      DISPLAY  mr_conferencia.qtd_item
                      
                      IF NOT wms6190_valid_qtd_item() THEN
                         RETURN FALSE
                      END IF     
                       
                      
                    • LET mr_conferencia.sku = l_sku LET mr_conferencia.item = l_item
                    • Carregar informação da existência ou não de restrição do item (por classe ONU).

                      Bloco de código
                      languagesql
                      themeConfluence
                      titleBloco de código responsável por carregar as informações de restrição do item (ONU)
                      linenumberstrue
                      collapsetrue
                      LET m_item_com_classe_onu = FALSE
                      IF wmsm140_wms_item_restrito_existe(mr_parametros.empresa,mr_conferencia.item,TRUE,1)THEN
                         LET m_item_com_classe_onu = TRUE
                      END IF
                    • RETURN TRUE
                  29. Criar a função wms6190_valid_qtd_sku_gs1_128() para validar se a quantidade de skus obtido do GS1-128 é valida e pode ser utilizada no processo.
                    • Esta função deverá verificar se a quantidade de skus foi obtida da decodificação do GS1-128, se sim, deverá alimentar a variável de tela com o valor obtido do GS1-128 e realizar o DISPLAY da mesma. Também deverá verificar se o valor é válido através da função wms6190_valid_qtd_sku(). Verificar também se o lastro e o peso são válidos para o palete através das funções wms6190_valid_lastro_palete(), wms6190_valid_peso_palete(). Cada algumas da funções retorne FALSE a função wms6190_valid_qtd_sku_gs1_128 também deverá retornar FALSE..Ao final da função retornar TRUE.
                    • Segue abaixo sugestão de implementação

                    • Carregar as informações de tipo de estoque x restrição do item caso sejam diferentes de vazias
                    • .

                      Bloco de código
                      languagesql
                      theme
                    • Confluence
                    • Eclipse
                      title
                    • Bloco de código responsável por carregar as informações de tipo de estoque e restrição do item.linenumberstruecollapsetrueCALL wmsm81_wms_item_complemento_leitura(mr_parametros.empresa, mr_conferencia.item, FALSE, 1)   LET m_bloqueia_identif = FALSE LET l_tip_estoque_recebto = wmsm81_wms_item_complemento_get_tip_estoque_recebto() LET l_restricao_recebto = wmsm81_wms_item_complemento_get_restricao_recebto() IF (l_tip_estoque_recebto CLIPPED IS NOT NULL) AND (l_restricao_recebto CLIPPED IS NOT NULL
                    • Sugestão de implementação para a validação e atribuição da quantidade de SKUs recebida do GS1-128.
                      linenumberstrue
                      collapsetrue
                       IF wmsr130_get_qtd_sku() IS NULL AND wmsr130_get_qtd_sku() = " " THEN
                         RETURN FALSE
                      END IF
                      
                      LET mr_conferencia.qtd_sku =  wmsr130_get_qtd_sku()
                      DISPLAY  mr_conferencia.qtd_sku
                      
                      IF NOT wms6190_valid_qtd_sku() THEN
                         RETURN FALSE
                      END IF     
                       
                    • LET mr_conferencia.tip_estoque = l_tip_estoque_recebto LET mr_conferencia.restricao = l_restricao_recebto DISPLAY mr_conferencia.tip_estoque TO tip_estoque DISPLAY mr_conferencia.restricao TO restricao
                    • 
                      RETURN TRUE
                      
                  30. Altera a função wms6190_processo_conferencia para realizar os tratamentos necessários na navegação dos campos quando existirem valores obtidos do GS1-128.
                    • Alterar o evento before field do campo cod_barras. Ao final do evento, caso exista a função wmsr130, chamar a função que verifica se o depositante utiliza ou não o código de barras GS1-128 para  solicitar ou não esse tipo de código de barras. A função responsável por  essas verificações é a wms6190_controle_cod_barras_gs1_128(). Ao retornar true indicando que foi possível obter os valores do código de barras do SKU e dos dimensionais, o cursor deverá ser direcionado ao próximo campo unidade de medida. Segue abaixo sugestão de implementação:

                      Bloco de código
                      languagesql
                      themeEclipse
                      titleSugestão de implementação no evento before field cod_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 FGL_LASTKEY() = FGL_KEYVAL("UP")
                         OR FGL_LASTKEY() = FGL_KEYVAL("LEFT") THEN
                             NEXT FIELD etiq_estoque  
                    LET
                    •  
                    m_bloqueia_identif = TRUE
                    • 
                         ELSE
                           
                    END
                    •  
                    IF

                    Carregar unidade de medida do item.

                    Bloco de código
                    languagesql
                    themeConfluence
                    titleBloco de código responsável por carregar as informações de unidade de medida do item
                    linenumberstrue
                    collapsetrue
                    CALL
                    •  
                    manm5_item_leitura(mr_parametros.empresa,mr_conferencia.item,
                    •  
                    TRUE,
                    •  
                    1)   LET mr_conferencia.cod_unid_med = manm5_item_get_cod_unid_med() LET m_cod_unid_med_orig =
                    •  IF wms6190_controle_cod_barras_gs1_128() THEN
                                   IF mr_conferencia.cod_
                    unid_med DISPLAY
                    • barras IS NOT NULL AND mr_conferencia.cod_
                    unid_med TO
                    • barras <> " " THEN
                                      NEXT FIELD cod_unid_med
                                   END IF  
                                END 

                    Carregar informação do último item lido.

                    Bloco de código
                    languagesql
                    themeConfluence
                    titleBloco de código responsável por carregar o último cod_barras lido
                    linenumberstrue
                    collapsetrue
                    LET m_ultimo_cod_barras = mr_conferencia.cod_barras
                    A nova função para tratamento do dimensionais informados deverá se chamarwms6190_controle_dimensionais(). O principal motivo da criação desta função é apenas permitir melhor distribuição das atribuições de cada bloco de código. Sendo assim, o bloco de código abaixo deverá ser movido para esta nova função. As mensagens deverão ser processadas em BATCH via  log0030_processa_mensagem() e em seguida retornar FALSE para a operação.
                    • IF
                         END IF
                      END IF
                    • Alterar o evento before field do campo cod_unid_med. Logo no início do evento,  caso exista a função wmsr130, chamar a função wms6190_valid_cod_unid_med_gs1_128() para verificar se o GS1-128 obteve unidade de medida e se esta unidade de medida é válida. Caso seja inválida, o operador será notificado pela própria função de valid e se o sistema permitir alterar unidade de medida o cursor deverá ficar no campo unidade de medida. Caso seja válido o cursor deverá ser direcionado ao próximo campo. Segue abaixo sugestão de implementação:

                      Bloco de código
                      languagesql
                      theme
                    ConfluencetitleBloco de código responsável por controlar a informação de dimensionais do itemlinenumberstruecollapsetrueCALL manm5_item_leitura(mr_parametros.empresa,mr_conferencia.item, FALSE, 1) LET l_ies_ctr_lote = manm5_item_get_ies_ctr_lote() # Verifica se existe controle de dimensionais LET m_ctr_ender_nao_mapeado = FALSE -- MURILO não precisará alterar valor desta modular pode ser retirada IF wms6190_verifica_dimensional(l_ies_ctr_lote,mr_conferencia.item)
                    • Eclipse
                      titleSugestão de implementação no evento before field cod_unid_med para solicitar ou não a informação da unidade de medida.
                      linenumberstrue
                      collapsetrue
                       IF m_wmsr130_gs1_128_existe THEN
                         
                    LET
                    • IF 
                    m_permite_recebimento
                    • FGL_LASTKEY() = 
                    TRUE
                    • FGL_KEYVAL("UP")
                         
                    CALL
                    • OR 
                    wms6190
                    • FGL_
                    informa_dimensional(mr_conferencia.item) IF NOT m_permite_recebimento
                    • LASTKEY() = FGL_KEYVAL("LEFT") THEN
                             NEXT FIELD cod_barras
                    END IF
                    • 
                      
                    END IF
                  31. wms6190_valid_endereco_apto_receber_palete()
                  32. wms6190_valid_item_identif_agrup()
                  33. wms6190_controle_dimensionais()
                  34. wms6190_valid_dimensionais()
                  35. A nova função responsável por carregar os dimensionais do item deverá ser chamada de wms6190_solicita_dimensionais().

              FOI MENCIONADA A SUBSTITUIÇÃO DOS CÓDIGOS NO INPUT PELAS NOVAS FUNÇÕES?

              1. Na função wms6190_processo_conferencia () existe o principal input de dados do processo de recebimento. Será necessário isolar as regras de negócio existentes para cada campo de modo que possam ser executadas de outros pontos além do AFTER FIELD como por exemplo na rotina de preenchimento automático de campos lidos da etiqueta GS1-128. Para preenchimento automático dos campos, os mesmos serão lidos nos eventos de BEFORE FIELD de cada campo, e quando o valor extraído do código de barras for válido, o respectivo campo será preenchido e o fluxo será direcionado para o próximo campo.
              2. Para o AFTER FIELD do campo cod_barras, no lugar de toda a estrutura de código existente atualmente, deverão ser criadas novas funções, para realizar as validaçõespreenchimento de campos, solicitação dos dimensionais, validação dos dimensionais e preencimento de campos pós dimensionais. Quando uma dessas funções retornar falha, exibir mensagem ao usuário informando o erro ocorrido (se possuir mensagem), e voltar o foco para o campo para que uma informação válida seja informada. Caso retorne sucesso o fluxo do programa deverá seguir normalmente, ou seja, ir para o próximo campo da entrada de dados.
                • A nova função para validações do código de barras deverá ter o nome de wms6190_valid_cod_barras() e deverá realizar as validações listadas nos subitens abaixo. A ideia dessa função é retornar TRUE para sucesso e FALSE para falha. As possíveis mensagens de erro para o usuário deverão ser realizadas através da função log0030_processa_mensagem(). 
              1. Na função wms6190_processo_conferencia () existe o principal input de dados do processo de recebimento. Será necessário isolar as regras de negócio existentes para cada campo de modo que possam ser executadas de outros pontos além do AFTER FIELD como por exemplo na rotina de preenchimento automático de campos lidos da etiqueta GS1-128. Para preenchimento automático dos campos, os mesmos serão lidos nos eventos de BEFORE FIELD de cada campo, e quando o valor extraído do código de barras for válido, o respectivo campo será preenchido e o fluxo será direcionado para o próximo campo.
              2. Para o AFTER FIELD do campo cod_barras, no lugar de toda a estrutura de código existente atualmente, deverão ser criadas novas funções, para realizar as validaçõespreenchimento de campos, solicitação dos dimensionais, validação dos dimensionais e preencimento de campos pós dimensionais. Quando uma dessas funções retornar falha, exibir mensagem ao usuário informando o erro ocorrido (se possuir mensagem), e voltar o foco para o campo para que uma informação válida seja informada. Caso retorne sucesso o fluxo do programa deverá seguir normalmente, ou seja, ir para o próximo campo da entrada de dados.
                • A nova função para validações do código de barras deverá ter o nome de wms6190_valid_cod_barras() e deverá realizar as validações listadas nos subitens abaixo. A ideia dessa função é retornar TRUE para sucesso e FALSE para falha. As possíveis mensagens de erro para o usuário deverão ser realizadas através da função log0030_processa_mensagem(). 
                1. Alterar wmsr130 para que na decodificação ao encontrar codigo de barras preencha automaticamente o item_deposit correspondente.
                2. No evento before field do campo cod_barras na função wms6190_processo_conferencia após os pontos de entrada chamar nova função wms6190_tratar_cod_barras_gs1_128()
                3. Na função wms6190_tratar_cod_barras_gs1_128() verificar se  o depositante possui cód barras GS1-128 configurado no contrato.
                4. Se depositante não possuir GS1-128 configurado então deverá retornar para a função wms6190_processo_conferencia  e o processo deve seguir normalmente.
                5. Se depositante possuir GS1 128 configurado no contrato então chamar a função wms6730_solicita_cod_barras_gs1_128 para que seja solicitado os códigos GS1-128.
                6. Processar leitura do código de barras através da função wms6730_processa_cod_barras_gs1_128() → wmsr130_decodifica_gs1_128(). Caso a função wmsr130_decodifica_gs1_128 retorne FALSE exibir mensagem de erro de modo que o usuário possa ler e confirmar. Ao confirmar deverá voltar novamente para o input que solicita os códigos de barras;
                7. Uma vez processado a decodificação do cód. barras com sucesso algumas verificações deverão ser realizadas.
                  1. Foi identificado o atributo item_depositante? O item_depositante existe no sistema? Se sim, o item_depositante possui apenas 1 SKU? Se sim, então validar se as informações do item e do SKU encontrado são válidos para o processo de conferencia do recebimento. COMO??? (VALIDAÇÕES AFTER FIELD) 
                  2. Sim todas as informações do código de barras e do item foram validadas com sucesso. 
                  3. Item controla dimensionais? (vamos supor que não)
                  4. foi encontrado 
                  5. O item_depositante possui apenas 1 SKU? 

              Rotina

              Tipo de Operação

              Opção de Menu

              Regras de Negócio

              [ACAA040 – Parâmetros]

              [Alteração]

              [Atualizações -> Acadêmico-> Tesouraria]

              -

              [ACAA050 – Negociação Financeira]

              [Envolvida]

              [Atualizações -> Acadêmico-> Tesouraria]

              -

              [ACAA060 – Cadastro de Pedidos]

              [Criação]

              [Atualizações -> Acadêmico-> Cadastros]

              -

               

              CALL manm5_item_leitura(mr_parametros.empresa,mr_conferencia.item, FALSE, 1)LET l_ies_ctr_lote = manm5_item_get_ies_ctr_lote()# Verifica se existe controle de dimensionaisLET m_ctr_ender_nao_mapeado = FALSE -- MURILO não precisará alterar valor desta modular pode ser retirada
              IF wms6190_verifica_dimensional(l_ies_ctr_lote,mr_conferencia.item) THEN   LET m_permite_recebimento = TRUE   CALL wms6190_informa_dimensional(mr_conferencia.item)   IF NOT m_permite_recebimento THEN      NEXT FIELD cod_barras    END IF
              END IF

               

              WMSR130

              Fluxo do Processo

               

                    •    ELSE
                                IF wms6190_valid_cod_unid_med_gs1_128() THEN
                                      NEXT FIELD qtd_item
                                END IF  
                         END IF
                      
                    • Alterar o evento before field do campo qtd_item. Logo no início do evento, caso exista a função wmsr130, chamar a função wms6190_valid_qtd_item_gs1_128() para verificar se o GS1-128 obteve a quantidade de itens e se esta quantidade é válida. Caso seja inválida, o operador será notificado pela própria função de valid e o cursor deverá ficar no campo quantidade de itens do SKU. Caso seja válido o cursor deverá ser direcionado ao próximo campo. Segue abaixo sugestão de implementação:

                      Bloco de código
                      languagesql
                      themeEclipse
                      titleSugestão de implementação no evento before field qtd_item para solicitar ou não a informação da quantidade de itens.
                      linenumberstrue
                      collapsetrue
                        IF m_wmsr130_gs1_128_existe THEN
                         IF FGL_LASTKEY() = FGL_KEYVAL("UP")
                         OR FGL_LASTKEY() = FGL_KEYVAL("LEFT") THEN
                             NEXT FIELD cod_unid_med
                         ELSE
                                IF wms6190_valid_qtd_item_gs1_128() THEN
                                      NEXT FIELD qtd_sku
                                END IF  
                         END IF
                       
                    • Alterar o evento before field do campo qtd_sku. Logo no início do evento, caso exista a função wmsr130, chamar a função wms6190_valid_qtd_sku_gs1_128() para verificar se o GS1-128 obteve a quantidade de SKUS e se esta quantidade é válida. Caso seja inválida, o operador será notificado pela própria função de valid e o cursor deverá ficar no campo quantidade de itens do SKU. Caso seja válido o cursor deverá ser direcionado ao próximo campo. Segue abaixo sugestão de implementação:

                      Bloco de código
                      languagesql
                      themeEclipse
                      titleSugestão de implementação no evento before field qtd_skus para solicitar ou não a informação da quantidade de SKUs.
                      linenumberstrue
                      collapsetrue
                         IF m_wmsr130_gs1_128_existe THEN
                         IF FGL_LASTKEY() = FGL_KEYVAL("UP")
                         OR FGL_LASTKEY() = FGL_KEYVAL("LEFT") THEN
                             NEXT FIELD qtd_item
                         ELSE
                                IF wms6190_valid_qtd_sku_gs1_128() THEN
                                      NEXT FIELD NEXT
                                END IF  
                         END IF
                      
                      
                    • Alterar o evento after field do campo cod_barras para que os dimensionais obtidos do GS1-128 sejam validados. Esta validação no after field se faz necessário quando após realizar a leitura do GS1-128 e não encontrar o código item, o operador terá que informar o código de barras do SKU para que seja obtido o item. Após obter o item, será necessário validar os dimensionais para que eles possam ser assumidos sem a necessidade de solicitar ao operador. Para atingir o objetivo, adicionar o código sugerido abaixo antes da instrução LET m_cod_unid_med_orig = mr_conferencia.cod_unid_med existente no after field.

                      Bloco de código
                      languagesql
                      themeEclipse
                      titleSugestão de implementação para que os dimensionais obtidos do GS1-128 sejam validados no after field do cod_barras. Situação onde o item não foi obtido no momento anterior, na leitura do GS1-128.
                      linenumberstrue
                      collapsetrue
                      IF m_wmsr130_gs1_128_existe THEN
                         IF wmsr130_decodificacao_encontrou_dimensionais()  THEN
                            CALL wms6190_set_dimensionais_gs1_128() 
                         END IF
                      END IF 
                    • Alterar a função wms6190_crossdock_tela_conf_nf() considerando as mesmas alterações realizadas na função wms6190_processo_conferencia(). Esta alteração tem o objetivo de dar também ao processo de cossdocking a possibilidade de utilização do código de barras GS1-128

               

              Rotina

              Tipo de operação

              Opção de menu

              Regras de negócio

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

              [Alteração]

              <não se aplica>

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

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

              [Alteração]

              <não se aplica>

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

              wms6190 - Função responsável pela conferencia do recebimento

              [Alteração]

              <não se aplica>

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

              <Nesta etapa incluir representações gráficas que descrevam o problema a ser resolvido e o sistema a ser desenvolvido. Exemplo: Diagrama - Caso de Uso, Diagrama de Atividades, Diagrama de Classes, Diagrama de Entidade e Relacionamento e Diagrama de Sequência>. 

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