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

 

  • Ler etiqueta do palete
  • Ler etiqueta da ID de estoque
  • Depositante trabalha com GS1-128?Sim → Solicitar cód

    Permitir a leitura de código de barras GS1-128

    1. Informar cód barras GS1-128
    2. Processar decodificação do cód barras GS1-128
    3. Encontrou SKU?
      1. Sim.
        1. Item é válido?
          1. Sim → Ir para item 
  • Não → Ir para
  • Ler cód. barras SKU;
  • Informar dimensionais do item;
  • Informar unidade de medida ???????????????
  • Informar quantidade de itens no SKU;
  • Informar quantidade de SKU;
  • Seguir para próximo leitura.;
  •  

    no programa de conferência do recebimento permitindo assim maior agilidade no registro das informações.

     

    Definição da Regra de Negócio

     

    Atualmente na rotina de conferência do recebimento o operador obrigatoriamente precisa informar a i) Etiqueta do palete, ii) Etiqueta 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 operador deve informar vi)Quantidade de Itens no SKU e 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 deverão ser solicitadas ao operador e 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 operador deverá ser notificado e então registra-la manualmente. Vale lembrar que leitura das informações de etiqueta do palete e de identificação de estoque 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):
      1. Item ACO3NBR6645 com dimensionais:
        1. Lote
        2. Data de produção
        3. Data de validade

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

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

    2. Segue abaixo exemplo do comportamento esperado para o sistema na conferência do recebimento (WMS6190) quando o depositante da ordem de serviço possuir configuração GS1-128 relacionada ao seu contrato :
      1. Telas inicias da 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

    3. Algumas informações adicionais para complementar o comportamento esperado para a funcionalidade de GS1-128 não abordados detalhadamente pelo exemplo acima. Em grande parte representam situações de fluxos alternativos, não devendo representar o comportamento usual\normal durante a operação ou são comentários afirmando um comportamento subentendido:
      1. Item \ Item depositante \ 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 operador será notificado e o dimensional será apresentado ao operador já preenchido porém possibilitando 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 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.
      3. Unidade de medida \ Tipo de estoque x restrição
        • Vale lembrar que estas informações possuem uma chance muita pequena de fazerem parte do código de barras GS1-128 uma vez que a informação ali contida deverá ser conhecida não só pelo WMS Logix como para qualquer outra entidade 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 operador possuir permissão para alterar tipo de estoque restrição. Caso estas premissas não sejam satisfeitas o 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 operador será notificado, o tipo de estoque x restrição padrão será mantido e o 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. 
      4. 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 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 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.
      5. 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 operador poderá manualmente interromper a operação ou informar outro valor para o campo.

    4. 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
            themeEclipse
            titleSugestã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'
        2. Criar função wmsr130_decodificacao_encontrou_dimensionais() para identificar se foram encontrados dimensionais na decodificação do GS1-128.
          • Esta função deverá ser acionada após o conjunto de set de parâmetros e a chamada para a função wmsr130_decodifica_gs1_128() ter sido realizada.

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

            Bloco de código
            languagesql
            themeEclipse
            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
        3. 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
            themeEclipse
            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 
        4. 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)
        5. Alterar a função wmsr130_set_null() para definir o valor de todos os dimensionais  do mr_dimensional_valido para FALSE.
        6. 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
            #-------------------------------------------------------------------------#
        7. 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
            #-------------------------------------------------------------------------#
        8. Alterar funções wmsr130_get_<<dimensional>> para retornar os dimensionais lote, peça, número de série, em caixa alta (maíúsculo\UPSHIFT).
      2. WMS6730 - Função responsável por controlar a interface de coletor de dados referente ao GS1-128.
        1. Criar uma nova variável modular m_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.

      3. 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          ,
                                                                    1  )
                    RETURNING l_eh_tip_cross_docking
                 IF m_conferencia_cross_docking  = "S" THEN
                    IF NOT l_eh_tip_cross_docking THEN
                       CALL wms6190_help("Deve ser utilizado tipo de estoque e restricao cross-docking.")
                       RETURN FALSE
                    END IF
                 ELSE
                    IF l_eh_tip_cross_docking THEN
                       CALL wms6190_help("Tipo de estoque e restricao cross-docking nao podem ser usados na conferencia.")
                       RETURN FALSE
                    END IF
                 END IF
              END IF
            
        23. 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:

            Bloco de código
            languagesql
            themeEclipse
            titleSugestão de implementação para controle do código de barras do SKU, dimensionais e tipos de estoque x restrição.
            linenumberstrue
            collapsetrue
            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, sku, cod_barras_sku
                           FROM wms_item_complemento 
                 INNER JOIN wms_item_sku_cod_barras 
                                 ON wms_item_complemento.empresa = wms_item_sku_cod_barras.empresa
                               AND wms_item_complemento.item = wms_item_sku_cod_barras.item
                              AND wms_item_complemento.deposit = wms_item_sku_cod_barras.deposit         
                        WHERE wms_item_complemento.empresa = :empresa
                             AND wms_item_complemento.item_deposit = :item_deposit
             
               IF tem_somente_um_sku THEN
                   LET mr_conferencia.cod_barras = cod_barras #do sql anterior
                   LET 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 mr_conferencia.cod_barras = wmsr130_get_cod_barras()
                 IF wms6190_valid_cod_barras_sku THEN 
                      CALL wms6190_after_field_cod_barras_sku()
                 ELSE   
                     LET l_cod_barras_valido = FALSE
                 END IF 
             
                 CALL wms6190_set_dimensionais_gs1_128 ()
                 CALL wms6190_controle_dimensionais()
                 
                 IF  l_cod_barras_valido THEN
            
                    IF NOT wms6190_valid_endereco_apto_receber_palete () THEN
                        RETURN FALSE
                    END IF
             
                    IF NOT wms6190_valid_sku_identif_agrup THEN
                       RETURN FALSE
                    END IF
             
                END IF 
            END IF 
             
            IF (  (wmsr130_get_tipo_estoque()  IS NOT NULL  AND wmsr130_get_tipo_estoque()  <> " ") 
            AND  (wmsr130_get_restricao()  IS NOT NULL  AND wmsr130_get_restricao()  <> " ") )  THEN
               IF NOT wms6190_verifica_permissao_usuario THEN
                   CALL wms6190_help("Usuario sem permissao para alterar o tipo de estoque.")
                   RETURN FALSE 
                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 
        24. 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('Nao foi possivel atribuir a unidade de medida do GS1-128. Sistema configurado para nao permitir troca.')
                 RETURN FALSE 
            END IF   
             
            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
        25. 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.

            Bloco de código
            languagesql
            themeEclipse
            titleSugestão de implementação para a validação e atribuição do item do GS1-128.
            linenumberstrue
            collapsetrue
            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     
             
            RETURN TRUE
        26. 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.

            Bloco de código
            languagesql
            themeEclipse
            titleSugestã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     
             
            RETURN TRUE
            
        27. 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   
               ELSE
                      IF wms6190_controle_cod_barras_gs1_128() THEN
                         IF mr_conferencia.cod_barras IS NOT NULL AND mr_conferencia.cod_barras <> " " THEN
                            NEXT FIELD cod_unid_med
                         END IF  
                      END 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
            themeEclipse
            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
               IF FGL_LASTKEY() = FGL_KEYVAL("UP")
               OR FGL_LASTKEY() = FGL_KEYVAL("LEFT") THEN
                   NEXT FIELD cod_barras
               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() 
      WMS6190 - Conferencia do RecebimentoNa 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.Para o AFTER FIELD do campo cod_barras, no lugar de toda a estrutura de código existente atualmente, deverão ser criadas duas funções, uma para realizar as validações e outra para preencher\alimentarcampos do input de dados. 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 é retornarTRUE 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. Validar se o código de barras informado existe. Atualmente é realizado pelo código abaixo. Se l_encontrou for FALSE, chamar a função log0030_processa_mensagem(log0030_mensagem_get_texto()) e retornar FALSE.

      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
    2. 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. Se a chamada  para a função wmsr51_f4_verifica_emp_item retornar TRUE processar a mensagem de erro em modo BATCH através da função log0030_processa_mensagem() e retornar FALSE.

      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
    3. Verificar se o item é controlado pelo WMS. Se l_status retornar FALSE então processar mensagem de erro em modo BATCH através da função log0030_processa_mensagem(log0030_mensagem_get_texto()) e retornar FALSE. Se item  não é controlado pelo WMS também retornar FALSE e processar mensagem em modo BATCH via log0030_processa_mensagem().

      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."
                    CALL wms6190_help(l_msg)
                    NEXT FIELD cod_barras
                 END IF
              END IF
    4. Verificar se o item possui alguma classificação de risco. Para esta função de validação, a variável m_item_com_classe_onu  não precisará ser alimentada (pode ser retirada ). As mensagens de erro deverão ser processadas em modo BATCH através da função  log0030_processa_mensagem() e em seguida deverá ser retornado FALSE.

      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 = 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
    5. Verificar se o depositante do item encontrado para o código de barras do SKU é o mesmo do depositante da OS. As mensagens deverão ser processadas em BATCH via  log0030_processa_mensagem() e em seguida retornar FALSE para a operação.

      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, FALSE, 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
    6. 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.  As mensagens deverão ser processadas em BATCH via  log0030_processa_mensagem() e em seguida retornar FALSE para a operação. (Observar no código abaixo os comentários com o nome "MURILO".)

      Bloco de código
      languagesql
      themeConfluence
      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 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 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
          •  NEXT 
      END IF
          • FIELD qtd_sku
                    
      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  
               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
               
      END IF
          • ELSE
                      
      CALL
          • IF wms6190_
      help(l_msg)
          • valid_qtd_sku_gs1_128() THEN
                            NEXT FIELD 
      cod_barras
          • NEXT
                      END IF
    7. Criar função wmsr130_utiliza_cod_barras_gs1_128() . Retornar TRUE ou FALSE.
    8. 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()
    9. Na função wms6190_tratar_cod_barras_gs1_128() verificar se  o depositante possui cód barras GS1-128 configurado no contrato.
    10. 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.
    11. 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.
    12. 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;
    13. Uma vez processado a decodificação do cód. barras com sucesso algumas verificações deverão ser realizadas.
    14. 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) 
    15. Sim todas as informações do código de barras e do item foram validadas com sucesso. 
    16. Item controla dimensionais? (vamos supor que não)
    17. foi encontrado 
    18. 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]

    -

     

    Fluxo do Processo

     

    <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>. 
          •   
               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.

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