Informações Gerais
Especificação | |||
Produto | Logix | Módulo | WMS |
Segmento Executor | Supply Chain - Logística - Inovação | ||
Projeto1 | IRM1 | LOGWMS01-30 - Processamento via leitura código de barras GS1-128 | |
Requisito1 | Subtarefa1 | ||
País | ( x ) Brasil ( ) Argentina ( ) México ( ) Chile ( ) Paraguai ( ) Equador ( ) USA ( ) Colômbia ( ) Outro _____________. | ||
Outros | Esta Story (LOGWMS01-32) é a segunda de um conjunto referente ao Épic (LOGWMS01-30) que contempla todas as funcionalidades previstas para tratamento do código de barras GS1-128. Demais Stories: REQ01 → LOGWMS01-31 - Configuração. REQ03 → LOGWMS01-33 - Tratar GS1-128 na Separação REQ04 → LOGWMS01-34 - Tratar GS1-128 na Conferência da Expedição REQ05 → LOGWMS01-35 - Tratar GS1-128 nas rotinas complementares |
Legenda: 1 – Inovação 2 – Manutenção (Os demais campos devem ser preenchidos para ambos os processos).
Objetivo
Permitir a leitura de código de barras GS1-128 no programa de Conferência do Recebimento, proporcionando assim mais agilidade no registro das informaçõe
Definição da Regra de Negócio
Atualmente na rotina de Conferência do Recebimento o operador precisa informar obrigatoriamente: i) Etiqueta do palete, ii) Etiqueta de identificação de estoque, podendo ser a mesma do palete e ser ou não agrupadora, iii) Código de barras do SKU e iv) Quantidade de SKUs.
Além destas informações obrigatórias, dependendo da configuração do sistema, o operador deve informar: vi)Quantidade de Itens no SKU e, opcionalmente, pode alterar as informações sugeridas pelo sistema como vii) Unidade de medida, viii) Tipo de estoque x Restrição.
O objetivo da implementação a ser realizada e descrita por este documento é agilizar o registro das informações, permitindo obtê-las diretamente do código de barras GS1-128, economizando tempo do operador em informar e conferir cada informação.
As informações lidas do código de barras GS1-128 não deverão ser solicitadas ao operador e deverão passar pelas mesmas validações de quando são digitadas pelo operador. Caso alguma informação lida do código de barras GS1-128 seja inválida para o processo, o operador deverá ser notificado e, então, registrar todas as informações manualmente. Vale lembrar que a leitura das informações de etiqueta do palete e de identificação de estoque não sofrerão alterações.
Abaixo, nos itens 1 e 2, é possível visualizar por meio de imagens um exemplo do comportamento esperado para o funcionamento do programa de conferência do recebimento. No item 3 são detalhados os fluxos alternativos e as afirmações de comportamentos esperados, não abordados ou subentendidos no exemplo e, no item 4, é detalhada a parte técnica, mencionando onde e como as alterações deverão ser realizadas.
- Para o exemplo, vamos considerar as seguintes configurações (valores ilustrativos):
- Item ACO3NBR6645 com dimensionais:
- Lote
- Data de produção
- Data de validade
- Código de barras GS1-128 da embalagem
- Configuração GS1-128
- 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
- Configuração padrão sugerida pelo Logix WMS, conforme detalhado em LOGWMS01-31 - Configuração, onde:
- Item ACO3NBR6645 com dimensionais:
- 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 :
- Telas inicias da Conferência do Recebimento. As alterações detalhadas por este documento descrevem as alterações que impactam da imagem 4 em diante.
- Tela nova para informar mais de um código de barras GS1-128.
- Partindo do item b, caso o operador não opte pela opção de teste.
- Fluxo alternativo, partindo do item b, caso o operador opte pela opção de teste.
- Sequência da imagem do item d, ao acionar a opção de teste.
- Fluxo alternativo partindo do item d, se ocorrer algum erro de leitura.
- Telas inicias da Conferência do Recebimento. As alterações detalhadas por este documento descrevem as alterações que impactam da imagem 4 em diante.
- 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.
- Item / Item Depositante / Cód. Barras SKU
- No momento da decodificação do código de barras GS1-128, caso o código de barras GS1-128 possua a informação do item depositante (EAN13\GTIN13), porém não possua a informação do código de barras do SKU (DUN14\GTIN14), o sistema verificará se o item possui apenas um SKU cadastrado. Se sim, carregará automaticamente o código de barras deste SKU, no campo Código de Barras do SKU. Caso nenhum ou mais de um SKU seja encontrado para o item, o operador deverá ser notificado da falta da informação do código de barras do SKU; as informações do GS1-128 serão desconsideradas e o cursor voltará à tela de Montagem do Palete, no campo Código de Barras.
Importante! Caso tenha sido obtida a informação da quantidade de itens no SKU do GS1-128, esta informação será utilizada para tentar encontrar o código de barras do SKU. - Se o código de barras do SKU (DUN14\GTIN14) for obtido com sucesso do GS1-128, porém apresente alguma inconsistência de sistema, o operador será notificado, as informações do GS1-128 serão desconsideradas e o cursor voltará à tela de Montagem do Palete, no campo Código de Barras.
- No momento da decodificação do código de barras GS1-128, caso o código de barras GS1-128 possua a informação do item depositante (EAN13\GTIN13), porém não possua a informação do código de barras do SKU (DUN14\GTIN14), o sistema verificará se o item possui apenas um SKU cadastrado. Se sim, carregará automaticamente o código de barras deste SKU, no campo Código de Barras do SKU. Caso nenhum ou mais de um SKU seja encontrado para o item, o operador deverá ser notificado da falta da informação do código de barras do SKU; as informações do GS1-128 serão desconsideradas e o cursor voltará à tela de Montagem do Palete, no campo Código de Barras.
- Dimensionais
- No momento da decodificação do código de barras GS1-128, caso algum dimensional seja inválido, o operador será notificado, as informações do GS1-128 serão desconsideradas e o cursor voltará à tela de Montagem do Palete, no campo Código de Barras.
- No momento da decodificação do código de barras GS1-128, se não for obtida a informação do item/SKU, os dimensionais serão lidos do GS1-128 e o cursor voltará ao campo Código de Barras do SKU, para que seja informado um código de barras. Após sair do campo, os dimensionais controlados pelo item terão seus valores atribuídos conforme obtido do GS1-128. Caso algum dimensional seja inválido, o operador será notificado, as informações do GS1-128 serão desconsideradas e o cursor voltará à tela de Montagem do Palete, no campo Código de Barras.
- Os dimensionais obtidos do código de barras GS1-128 que não sejam controlados pelo item serão desconsiderados;
- Conforme já mencionado, caso todos os dimensionais tenham sido obtidos com sucesso do GS-128, nenhum dimensional será solicitado ao operador;
- Conforme já mencionado, caso algum dimensional controlado pelo item não esteja no GS1-128, este dimensional, e somente este, será solicitado ao operador.
- Unidade de Medida / Tipo de Estoque x Restrição
- Vale lembrar que estas informações possuem uma chance muita pequena de fazerem parte do código de barras GS1-128, uma vez que a informação ali contida deverá ser conhecida não só pelo WMS Logix, como para qualquer outra entidade à manipular a embalagem.
- Caso exista a informação de unidade de medida e tipo de estoque x restrição no código de barras GS1-128, estes serão aceitos independentemente se o parâmetro que permite alteração de unidade de medida estiver ativo ou se o operador possuir permissão para alterar tipo de estoque restrição.
- Se unidade de medida não existir no WMS Logix ou for inválida, o operador será notificado, as informações do GS1-128 serão desconsideradas e o cursor voltará à tela de Montagem do Palete, no campo Código de Barras.
- Se o tipo de estoque x restrição obtido for inválido, o operador será notificado, as informações do GS1-128 serão desconsideradas e o cursor voltará à tela de Montagem do Palete, no campo Código de Barras.
- Quantidade de Itens no SKU
- Se a quantidade de itens no SKU obtido do GS1-128 for inválida como, por exemplo, divergente do cadastrado para um item que controle SKU, o operador será notificado, as informações do GS1-128 serão desconsideradas e o cursor voltará à tela de Montagem do Palete, no campo Código de Barras.
- Quantidade de SKUs
- Se a quantidade de SKUs for inválida como, por exemplo, ao exceder a capacidade de um palete, o operador será notificado, as informações do GS1-128 serão desconsideradas e o cursor voltará à tela de Montagem do Palete, no campo Código de Barras.
- Se a quantidade de SKUs for inválida como, por exemplo, ao exceder a capacidade de um palete, o operador será notificado, as informações do GS1-128 serão desconsideradas e o cursor voltará à tela de Montagem do Palete, no campo Código de Barras.
- Item / Item Depositante / Cód. Barras SKU
- Para atingir o resultado esperado, detalhado acima, as seguintes alterações de funções e programas serão necessárias:
- WMSR130 - Função responsável pelas principais regras relacionadas ao GS1-128:
- Criar função wmsr130_deposit_utiliza_cod_barras_gs1_128() para verificar se o depositante possui configuração GS1-128 definida.
- Os parâmetros de empresa e depositante, necessários para a implementação, terão sido setados via wmsr130_set_empresa() e wmsr130_set_deposit.().
Se a consulta SQL abaixo retornar NULL, então, o retorno da função deverá ser FALSE, senão retorno deverá ser TRUE.
- 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:
- Criar a função wmsr130_decodificacao_encontrou_atributos() para identificar se foram encontrados atributos na decodificação do GS-128.
- Esta função deverá ser acionada após o conjunto de set de parâmetros e a chamada para a função wmsr130_decodifica_gs1_128() ter sido realizada.
A função deverá verificar se os atributos obtidos da decodificação do GS1-128 possuem valores diferente de null e dos valores padrões de inicialização. Todos os atributos devem ser verificados, inclusive os dimensionais que podem ser verificados pela função wmsr130_decodificacao_encontrou_dimensionais(). Caso algum atributo possua valor, a função deverá retornar TRUE, senão FALSE. Abaixo exemplo da implementação esperada:
- Criar a função wmsr130_decodificacao_encontrou_todos_atributos_configurados() para identificar se todos os atributos configurados no WMS6727 foram encontrados no processo de decodificação do GS1-128.
- Esta função deverá ser acionada após o conjunto de set de parâmetros e a chamada para a função wmsr130_decodifica_gs1_128() ter sido realizada.
- A função deverá verificar se todos atributos(wms_cod_barras_item_gs1_128) marcados como "Utiliza Processo" = "SIM" (utiliza_processo="S") possuem valor obtido da decodificação. Se sim, retornar TRUE, se não retornar FALSE.
Sugestão de implementação:
- Alterar as funções wmsr130_get_<<dimensional>> para retornar os dimensionais lote, peça, número de série, em caixa alta (maíúsculo\UPSHIFT).
- Criar função wmsr130_deposit_utiliza_cod_barras_gs1_128() para verificar se o depositante possui configuração GS1-128 definida.
- WMS6730 - Função responsável por controlar a interface de coletor de dados referente ao GS1-128.
- Criar uma nova variável modular m_cod_barras_gs1_128 CHAR(200), responsável por armazenar o primeiro código de barras que poderá ser recebido via set.
- Criar uma nova função wms6730_set_cod_barras_gs1_128(l_cod_barras), para que as rotinas externas possam indicar por parâmetro o primeiro código de barras.
- A variável l_cod_barras_gs1_128 CHAR(200) deverá setar a variável modular m_cod_barras_gs1_128.
- Alterar a função wms6730_solicta_cod_barras_gs1_128() para que, caso tenha recebido por parâmetro um código de barras, verifique se o mesmo possui todas as informações configuradas em WMS6727 - Configuração GS1-128 ou se a quantidade máxima de leitura foi atingida (1). Caso uma das duas condições sejam aceitas, não se faz necessário abrir a tela de input para o operador.
- Serão descritas abaixo algumas etapas para atingir o objetivo final; o último item é uma sugestão de implementação contemplando todas as etapas mencionadas;
- Criar variável local l_cod_barras_default CHAR(200) para armazenar o m_cod_barras_gs1_128 recebido por parâmetro através da sua respectiva função set.
- Caso tenha recebido um código de barras por parâmetro (set), atribuir à variável l_cod_barras_default o valor da variável m_cod_barras_gs1_128 e executar os procedimentos abaixo.
- Logo antes de realizar o input dos dados, chamar as funções do wmsr130 para que o código de barras armazenado em l_cod_barras_default seja decodificado.
Caso a função wmsr130_decodifica_gs1_128() retorne FALSE, retornar da função wms6370_solicita_cod_barras_gs1_128() sem realizar nenhuma outra operação.
Caso a função wmsr130_decodifica_gs1_128 () retorne TRUE, continuar a execução da função wms6370_solicita_cod_barras_gs1_128(); - Logo após a decodificação, verificar se a quantidade máxima de código de barras é 1 (um).
Se sim, retornar da função wms6370_solicita_cod_barras_gs1_128() sem realizar nenhuma outra operação.
Se a quantidade máxima for diferente de 1 (um), continuar a execução da função wms6370_solicita_cod_barras_gs1_128(). - Em seguida, verificar se todos os atributos configurados foram identificados; utilizar a função wmsr130_decodificacao_encontrou_todos_atributos_configurados().
Se retornar TRUE, retornar da função wms6370_solicita_cod_barras_gs1_128() sem realizar nenhuma outra operação. - Por fim, caso tenha sido recebido o código de barras por parâmetro e ainda serão solicitados outros códigos de barras GS1-128, atribuir o primeiro código de barras ao array.
Segue abaixo sugestão de implementação:
- Alterar input de dados da função wms6370_solicita_cod_barras_gs1_128() , evento before field cod_barras_gs1_128 para que caso tenha recebido algum código de barras por parâmetro posicione o cursor na segunda linha do array.
Segue abaixo sugestão de implementação
- Criar uma nova variável modular m_leitura_teste SMALLINT responsável por controlar quando uma leitura de código de barras GS1-128 será ou não teste.
- Criar função wms6730_set_leitura_teste(l_leitura_teste) para que rotinas externas possam indicar se tela deverá abrir como leitura teste ou não.
- A variável l_leitura_teste SMALLINT recebida por parâmetro deverá setar a variável modular m_leitura_teste.
- Alterar a função wms6730_set_null() para inicializar a variável m_leitura_teste como TRUE.
- Deverá receber l_leitura_teste SMALLINT como parâmetro e setar a variável modular m_leitura_teste;
- Alterar função wms6730_solicita_cod_barras_gs1_128() para que as opções disponíveis por teclas de função sejam alteradas quando a rotina origem for diferente do WMS6728 - Teste Leitura GS1-128.
- Caso m_leitura_teste esteja como TRUE, então escrever em tela "Leitura teste" em tela conforme demonstrado através de imagem nos exemplos acima (tela 5.2.1)
- No input de dados, no evento disparado ao pressionar F10 (ON KEY F10), quando a rotina origem for diferente de WMS6728 exibir "<ESC> Voltar", "F4/CTRL-L Confirma" e "F8/CTRL-O Ini Test" quando m_leitura_teste = FALSE e "F8/CTRL-O Fim Test" quando m_leitura = TRUE . Quando rotina origem for WMS6728 - Teste Leitura GS1-128 permanecer "<ESC> Voltar" e "F4/CTRL-K Confirma";
- No input de dados, no evento disparado ao pressionar F8 (ON KEY F8), caso a rotina origem seja diferente de WMS6728 atribuir TRUE para a variável m_leitura_teste caso ela esteja como FALSE, e atribuir FALSE caso ela esteja como TRUE. Ao atribuir TRUE escrever em tela "Leitura teste" conforme demonstrado através de imagem nos exemplos acima (tela 5.2.1). Ao atribuir FALSE apagar "Leitura teste" da tela.
- Alterar a função wms6730_processa_cod_barras_gs1_128() para que não apresente em tela os atributos decodificados do GS1-128 caso a rotina origem seja diferente de WMS6728 - Teste Leitura GS1-128 ou caso a leitura não seja teste.
- Se m_leitura_teste = FALSE então não apresentar os atributos decodificados do GS1-128 em tela.
- Se m_leitura_teste = TRUE , continuar apresentando em tela os atributos obtidos do GS1-128.
- 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.
- WMS6190 - Conferência do Recebimento
- 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.
- Ainda sem mencionar uma alteração específica e explicando o objetivo das alterações neste programa, vale explicar de que modo se estruturou a forma de implementação das alterações:
- Ao informar o código de barras do SKU (after field cod_barras), caso o código informado não esteja cadastrado no WMS6173 - Cadastro de SKU o sistema deverá verificar se o depositante da ordem de serviço possui uma configuração de GS1-128 relacionada ao contrato.
- Caso o depositante não possua a configuração de GS1-128, o operador será notificado que não foi possível encontrar um Item/SKU.
- Caso o depositante possua a configuração de GS1-128, o sistema deverá tentar decodificar o código de barras informado a fim de identificar se o código de barras informado é um GS1-128.
- Caso não consiga decodificar, o usuário deverá ser notificado que não foi possível encontrar item/SKU.
- Caso consiga decodificar alguma informação, deverá verificar se as informações obtidas do GS1-128 são válidas para o processo e se foi possível obter todas as informações configuradas no WMS6727 - Configuração GS1-128.
- Caso alguma informação seja inválida, o usuário será notificado e o cursor deverá voltar para o campo código de barras do SKU e as informações obtidas do GS1-128 deverão ser desconsideradas.
- Caso as informações decodificadas sejam válidas, porém, nem todos os atributos configurados foram obtidos do código de barras, então, a tela de códigos GS1-128 deverá ser aberta para que o operador informe todos os códigos de barras GS1-128 da embalagem. Caso alguma informação obtida do GS1-128 seja inválida, o usuário será notificado, o cursor deverá voltar para o campo Código de Barras do SKU e todas as informações obtidas do GS1-128 deverão ser desconsideradas.
- Caso as informações decodificadas sejam válidas e todos os atributos válidos tenham sido obtidos do código de barras, ou então após obter todos os códigos GS1-128 com sucesso, o cursor será posicionado no próximo campo não obtido do GS1-128. Caso todas as informações obrigatórias tenham sido obtidas, a tela para montagem de um novo palete será apresentada.
- Para atender os itens i) e ii) todas as alterações abaixo serão necessárias.
Criar função wms6190_valid_cod_unid_med() para centralizar as validações referentes à unidade de medida.
Incluir o bloco de código mencionado abaixo, foi copiado do próprio after field cod_unid_med do input de dados da função wms6190_processo_conferencia(). Por conta disso, substituir a instrução NEXT FIELD cod_unid_med por RETURN FALSE. Ao final da função retornar TRUE.
- Criar a função wms6190_valid_qtd_item() para centralizar as validações referentes à quantidade de itens no SKU.
Incluir o bloco de código mencionado abaixo, foi copiado do próprio after field qtd_item do input de dados da função wms6190_processo_conferencia(). Por conta disso, substituir a instrução NEXT FIELD qtd_Item por RETURN FALSE. Ao final da função retornar TRUE.
- 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.
- Criar função wms6190_valid_peso_palete() para centralizar as validações referentes à capacidade de peso do palete.
Incluir o bloco de código mencionado abaixo, foi copiado do próprio after field qtd_sku do input de dados da função wms6190_processo_conferencia(). Por conta disso, substituir a instrução NEXT FIELD qtd_sku por RETURN FALSE. Ao final da função retornar TRUE.
- Criar função wms6190_valid_qtd_sku() para centralizar as validações referente a quantidade de SKUs.
Incluir o conjunto de bloco de código na mesma sequência da mencionada abaixo, foi copiado do próprio after field qtd_sku do input de dados da função wms6190_processo_conferencia(). Por conta disso, substituir a instrução NEXT FIELD qtd_sku por RETURN FALSE. Ao final da função retornar TRUE.
- Após as validações acima referentes à quantidade de SKU, efetuar chamada para as funções wms6190_valid_peso_palete(), wms6190_valid_lastro_palete(). Este conjunto de código deve fazer parte da função wms6190_valid_qtd_sku().
- Criar função wms6190_valid_numero_serie() para centralizar as validações referentes ao dimensional número de série.
- Atualmente a validação de número de série consiste em verificar e garantir que não existe outro número de série igual para o mesmo item no estoque. O número de série deve ser o identificador único do item.
Incluir o bloco de código mencionado abaixo, foi copiado do próprio after field valor do input de dados da função wms6190_informa_dimensional(). Por conta disso, substituir a instrução NEXT FIELD valor por RETURN FALSE e remover a instrução CURRENT WINDOW. Ao final da função retornar TRUE.
- Criar função wms6190_valid_dt_hor_validade() para centralizar as validações referentes ao dimensional data de validade.
Atualmente a validação existente para a data de validade é o prazo máximo para recebimento. O item possui uma parametrização de quantidade de dias máximo para vencimento a partir da data de recebimento. Se a data atual mais este prazo máximo for maior que o prazo de validade, significa que este produto vence em uma data inferior ao aceito para o item.
- Caso a variável do item da tela não tenha sido carregado, então a função deverá retornar FALSE.
Incluir o bloco de código mencionado abaixo, foi copiado do próprio after field valor do input de dados da função wms6190_informa_dimensional(), por conta disso substituir a instrução NEXT FIELD valor por RETURN FALSE e remover a instrução CURRENT WINDOW. Ao final da função retornar TRUE.
- 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.
- 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.
- Criar modular SMALLINT m_encontrou_cod_barras_sku_gs1_128 para indicar se encontrou ou não código de barras do SKU no GS1-128. Este indicador servirá para que os valores obtidos do GS1-128 não sejam limpos ao identificar atributos do GS1-128, porém não encontrar o código de barras do SKU.
- 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:
- Criar função wms6190_set_dimensionais_gs1_128() para carregar os valores dos dimensionais controlados pelo item com os valores obtidos do GS1-128.
- Verificar quais são os dimensionais controlados pelo item e carregar os records de tela com os valores obtidos do GS1-128. Os dimensionais que possam ter sido capturados pelo GS1-128, porém, não são controlados pelo item não devem ter seu valor carregado nos records de tela.
- Para verificar se o item controla lote utilizar manm5_item_leitura(empresa, item, FALSE,1) e manm5_item_get_ies_ctr_lote(). Para verificar se o item controla os demais dimensionais utilizar manm8_item_ctr_grade_leitura(empresa,0,0,0,0,0,item,TRUE,1) e manm8_item_ctr_grade_get_<<dimensional>>().
- Ao identificar o controle de um determinado dimensional, verificar se este dimensional foi lido do código de barras GS1-128, verificando se wmsr130_get_<<dimensional>>() não é nulo e é diferente do valor padrão de inicialização.
- O item controlando um determinado dimensional e este possuindo valor lido do GS1-128, o record de tela mr_dimensional.<<dimensional>> deverá ser preenchido.
- Para os dimensionais data de validade e número de série, logo após atribuir valor para o mr_dimensional, validar se os valores são válidos através das funções wms6190_valid_dt_hor_validade() e wms6190_valid_numero_serie() respectivamente. Sendo o valor inválido, retornar FALSE para a função wms6190_set_dimensionais_gs1_128().
- Ao final da função chamar a função wms6190_valida_valor_dimensionais() para corrigir possíveis problemas de inicialização de valores inválidos para os dimensionais e retornar TRUE.
Segue exemplo da implementação esperada considerando os itens acima mencionados:
- Alterar a função wms6190_verifica_existe_conferencia() para carregar variáveis de controle de input dos dimensionais, caso estes tenham sido obtidos do GS1-128.
Caso o dimensional tenha sido lido do GS1-128, o dimensional não deverá ser solicitado ao operador, sendo assim, o ma_dimensionais e o ma_dimensionais_aux não devem ser carregados para este dimensional. Segue abaixo a sugestão de implementação.O exemplo abaixo é para o dimensional lote; replicar o trecho comentado com "#MURILO" para cada bloco de dimensional existente na função wms6190_verifica_existe_conferencia().
- Alterar A função wms6190_verifica_dimensional_item_conferencia() para carregar somente as informações dos dimensionais do item anterior ,caso não tenha sido obtido os dimensionais de um GS1-128. Os dimensionais lidos do GS1-128 devem prevalecer sobre os informados anteriormente para o item. Para isso, seguir os passos abaixo:
Após capturar os dimensionais do último item através da consulta SQL sobre a estoque_lote_ender, verificar se nenhum dos dimensionais foi obtido através do GS1-128. Se sim, os valores destes dimensionais do GS1-128 deverão ser atribuídos ao record mr_dimensional. Para isso, logo após a consulta SQL aplicar o exemplo abaixo para todos os dimensionais:
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:
- Alterar a função wms6190_verifica_dimensional() para 1) preparar para exibição somente os dimensionais não obtidos pelo GS1-128, 2) não limpar os campos volume, num_peca, num_serie, 3) não carregar os arrays de record responsáveis por solicitador ao operador os dimensionais com os registros dos dimensionais obtidos do GS1-128.
Não reinicializar ma_dimensionais e mr_dimensional caso a função wms6190_verifica_dimensional_item_conferencia() tenha retornado FALSE, pois isso pagaria os valores previamente carregados pela leitura do GS1-128. Para isso, segue sugestão abaixo:
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.
Alteração para que não seja carregado o ma_dimensionais com dimensionais obtidos do GS1-128 (similar ao item xv). Desta forma, os dimensionais obtidos do GS1-128 não serão apresentados ao operador. Repetir implementação para cada bloco de dimensional.
- Criar função wms6190_valid_tipo_estoque_restricao() para centralizar as validações referentes a um tipo de estoque x restrição diferente do padrão sugerido inicialmente pela conferência do recebimento.
- A função para validação do tipo de estoque x restrição deverá validar se o tipo de estoque x restrição obtido do GS1-128 não é de falta de inventário, reconferência da expedição e cross docking. Para isso, segue abaixo sugestão de implementação mais abaixo. Receber como parâmetro tip_estoque e restricao para ser validado pela função.
Este trecho de código foi copiado da função wms6190_zoom_f7(), onde atualmente se encontra a validação do tipo de estoque restrição ao acionar a opção de troca.
- Criar função wms6190_controle_cod_barras_gs1_128() que finalmente solicitará o código de barras GS1-128.
- Esta função é a que finalmente irá solicitar/tratar o(s) código(s) de barras GS1-128. Abaixo serão detalhados os vários procedimentos e ao final uma sugestão de implementação contemplando a descrição destes passos.
- O primeiro passo para a função será verificar se o depositante utiliza ou não GS1-128. Caso ele não utilize a função poderá retornar FALSE sem executar nenhum processamento adicional.
- O depositante utilizando GS1-128, então os códigos de barras GS1-128 deverão ser solicitados ao operador. Para isso, atribuir os parâmetros para wms6730 (wms6730_set_<<param>>) e chamar a função wms6730_solicita_cod_barras_gs1_128().
Importante! Na passagem dos parâmetros para o WMS6730, enviar o código de barras informado pelo operador em tela já por parâmetro através da função wms6730_set_cod_barras(). - Logo após a chamada para wms6730_solicita_cod_barras_gs1_128(), limpar os campos de tela referentes ao cod_barras e o item. Em seguida, verificar se foi encontrado algum atributo na decodificação. Para isso, chamar a função wmsr130_decodificacao_encontrou_atributos(). Caso não tenha encontrado, retornar FALSE na função wms6190_controle_cod_barras_gs1_128() e não executar mais nenhuma operação. Caso tenha encontrado, alimentar a variável m_encontrou_cod_barras_sku_gs1_128 com FALSE.
- Caso tenha encontrado atributos, o primeiro passo é verificar se o código de barras do SKU não foi obtido do GS1-128 e o item depositante foi. Neste caso, verificar se o item depositante obtido do GS1-128 possui um, e somente um código de barras SKU vinculado. Nesta busca pelo código de barras do SKU, caso o atributo qtd_itens_sku tenha valor, utilizá-lo na busca. Ao encontrar somente um código de barras SKU para o item depositante do GS1-128, carregar as variáveis de tela do código de barras do SKU(mr_conferencia.cod_barras) do item (mr_conferencia.item), e atribuir TRUE a variável m_encontrou_cod_barras_sku_gs1_128, indicando que o código de barras do SKU foi encontrado. Caso não tenha encontrado um SKU, limpar as variáveis de tela mr_conferencia.cod_barras, mr_conferencia.item.
- O próximo passo é validar o código de barras SKU obtido do GS1-128, para isso, verificar se o código de barras do SKU é diferente de vazio/null. Se sim, carregar a variável de tela mr_conferencia.cod_barras e, então, tentar buscar o item através da função wmst86_wms_item_sku_cod_barras_verifica_cod_barras. Caso não encontre um item, limpar os campos de tela cod_barras (mr_conferencia.cod_barras) e item(mr_conferencia.cod_barras) e retornar FALSE. Caso encontre, atribuir TRUE a variável m_encontrou_cod_barras_sku_gs1_128 indicando que o código de barras do SKU foi encontrado.
Segue abaixo sugestão de implementação contendo todos os passos mencionados acima:
- Criar função wms6190_valid_tipo_estoque_restricao_gs1_128() para verificar se o tipo de estoque x restrição obtido do GS1-128 é válido para o processo.
- Caso GS1-128 tenha a informação de restrição, porém, não tenha informação do tipo de estoque, exibir erro e retornar FALSE.
- Caso GS1-128 tenha a informação do tipo de estoque e não tenha a informação da restrição, exibir erro e retornar FALSE.
Segue sugestão de implementação para os itens acima:
- Criar a função wms6190_valid_cod_unid_med_gs1_128() para validar se a unidade de medida do GS1-128 é válida e pode ser utilizado no processo.
- Esta função deverá verificar se a unidade de medida foi obtida da decodificação do GS1-128. Se sim, deverá verificar se a unidade de medida obtida é válida através da função wms6190_valid_cod_unid_med(). Se a unidade de medida for inválida, a própria função irá disparar mensagem ao operador e retornar FALSE, ao retornar FALSE, retornar FALSE para a função wms6190_valid_cod_unid_med_gs1_128(). Se a unidade de medida for válida, então a função wms6190_valid_cod_unid_med_gs1_128() deverá retornar TRUE.
Segue abaixo sugestão de implementação:
- 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:
- Criar a função wms6190_valid_qtd_sku_gs1_128() para validar se a quantidade de SKUs obtidos do GS1-128 é valida e pode ser utilizada no processo.
- Esta função deverá verificar se a quantidade de SKUs foi obtida da decodificação do GS1-128. Se sim, deverá alimentar a variável de tela com o valor obtido do GS1-128 e realizar o DISPLAY da mesma. Também deverá verificar se o valor é válido através da função wms6190_valid_qtd_sku(). Verificar também se o lastro e o peso são válidos para o palete pelas funções wms6190_valid_lastro_palete(), wms6190_valid_peso_palete(). Caso algumas da funções retorne FALSE, a função wms6190_valid_qtd_sku_gs1_128() também deverá retornar FALSE. Ao final da função retornar TRUE.
Segue abaixo sugestão de implementação:
- Altera a função wms6190_processo_conferencia() para realizar os tratamentos necessários na navegação dos campos, quando existirem valores obtidos do GS1-128.
Já no início da função, caso m_wmsr130_gs1_128_existe, então, inicializar a modular m_encontrou_cod_barras_sku_gs1_128 com TRUE.
Alterar o evento before field do campo cod_barras. Ao final do evento, caso exista a função wmsr130 e o indicador de código de barras do SKU ter sido encontrado no GS1-128 seja falso(m_encontrou_cod_barras_sku_gs1_128), limpar os valores das funções referentes ao GS1-128.
Alterar o evento after field do campo cod_barras para que, caso o código de barras informado pelo operador não seja encontrado, antes de disparar a mensagem de códgo de barras inválido, tente identificar se o código de barras é um GS1-128 e realize a respectiva decodificação. Para isso, logo após o retorno FALSE da chamada a função wmst86_wms_item_sku_cod_barras_verifica_cod_barras(), chamar a função wms6190_controle_cod_barras_gs1_128(). Caso a função wms6190_controle_cod_barras_gs1_128() retorne FALSE, exibir a mensagem ao usuário de código de barras inválido. Caso retorne TRUE, seguir o processamento do after field. Caso o código de barras seja encontrado e exista a função wmsr130, alimentar a variável m_encontrou_cod_barras_sku_gs1_128 com TRUE, indicando que foram encontrados atributos GS1-128, porém, ou o código de barras do SKU foi obtido manualmente ou via GS1-128.
Alterar o evento after field do campo cod_barras para que os dimensionais obtidos do GS1-128 sejam validados. Após obter o item e antes de solicitar os dimensionais, será necessário obter e validar os dimensionais do GS1-128 para que eles possam ser assumidos sem a necessidade de solicitar ao operador. Para atingir o objetivo, adicionar o código sugerido abaixo antes da instrução LET m_cod_unid_med_orig = mr_conferencia.cod_unid_med existente no after field.
Alterar o evento before field do campo cod_unid_med. Logo no início do evento, caso exista a função wmsr130, chamar a função wms6190_valid_cod_unid_med_gs1_128() para verificar se o GS1-128 obteve unidade de medida e se esta unidade de medida é válida. Caso seja inválida, o operador será notificado pela própria função de valid e o cursor deverá voltar ao campo cod_barras, para que o processo tenha novo início. Caso seja válido, o cursor deverá ser direcionado ao próximo campo. Segue abaixo sugestão de implementação:
Alterar o evento before field do campo qtd_item. Logo no início do evento, caso exista a função wmsr130, chamar a função wms6190_valid_qtd_item_gs1_128() para verificar se o GS1-128 obteve a quantidade de itens e se esta quantidade é válida. Caso seja inválida,o operador será notificado pela própria função de valid e o cursor deverá voltar ao campo cod_barras, para que o processo tenha novo início. Segue abaixo sugestão de implementação:
Alterar o evento before field do campo qtd_sku. Logo no início do evento, caso exista a função wmsr130, chamar a função wms6190_valid_qtd_sku_gs1_128() para verificar se o GS1-128 obteve a quantidade de SKUs e se esta quantidade é válida. Caso seja inválida, o operador será notificado pela própria função de valid e o cursor deverá voltar ao campo cod_barras, para que o processo tenha novo início. Segue abaixo sugestão de implementação:
- Alterar a função wms6190_crossdock_tela_conf_nf() considerando as mesmas alterações realizadas na função wms6190_processo_conferencia(), detalha no item acima (xxv). Esta alteração objetiva possibilitar a utilização do código de barras GS1-128 também pelo processo de cross docking.
Rotina | Tipo de operação | Opção de menu | Regras de negócio |
wmsr130 - Função responsável pelas regras relacionadas ao GS1-128. | [Alteração] | <não se aplica> | Inclusão de funções para identificar se o depositante utiliza GS1-128 e se seus atributos foram identificados na decodificação. |
wms6730 - Função responsável por controlar a interface de coletor de dados referente ao GS1-128. | [Alteração] | <não se aplica> | Tratamentos para quando a tela de coletor de dados que manipula os códigos de barras GS1-128 for aberta por outras rotinas, que não seja a rotina de teste de leitura. |
wms6190 - Função responsável pela conferência do recebimento | [Alteração] | <não se aplica> | Criação de funções para as regras de validação de campos, inclusão da regra de negócio do GS1-128, com suas respectivas modificações na forma de navegação dos campos. |
Protótipo de Telas
Compilação em uma única visão das imagens apresentadas no início da especificação (Item 2.)
Este documento é material de especificação dos requisitos de inovação, trata-se de conteúdo extremamente técnico. |
---|