Histórico da Página
Este documento é material de especificação dos requisitos de inovação, trata-se de conteúdo extremamente técnico. |
---|
Informações Gerais
Especificação | |||
Produto | Logix | Módulo | WMS - Warehouse Management System |
Segmento Executor | Supply Chain | ||
Projeto1 | IRM1 | LOGWMS01-30 - Processamento via leitura código de barras GS1-128 | |
Requisito1 | Subtarefa1 |
| |
Chamado2 | <não se aplica> | ||
País | ( ) Brasil ( ) Argentina ( ) Mexico ( ) Chile ( ) Paraguai ( ) Equador ( ) USA ( ) Colombia ( ) Outro _____________. | ||
Outros | Esta Story (LOGWMS01-34) é a quarta de um conjunto referente ao Épic (LOGWMS01-30) que contempla todas as funcionalidades previstas para tratamento do código de barras GS1-128. Demais Stories: REQ01 → LOGWMS01-31 - Configuração. REQ02 → LOGWMS01-32 - Tratar GS1-128 na Conferência do Recebimento REQ03 → LOGWMS01-33 - Tratar GS1-128 na Separação REQ05 → LOGWMS01-35 - Tratar GS1-128 nas rotinas complementares |
Legenda: 1 – Inovação 2 – Manutenção (Os demais campos devem ser preenchidos para ambos os processos).
Objetivo
Definição da Regra de Negócio
- Para atingir o resultado esperado detalhado acima, as seguintes alteração de funções e programas serão necessárias:
- WMS6218 - Conferencia da expedição via coletor de dados
- Criar função wms6218_validar_valores_validos_dimensionais(l_arr_curr) para isolar regras de negócio referente a validação de valor válido para dimensionais sem que possua dependência direta dos componentes de tela (screen arrays\campos).
Atualmente a wms6218_valida_dimensional() e a wms6218_valida_dimensional_sem_split() cumprem dois papéis, i) validar se o valor digitado para um dimensional é válido, ii) verificar se existe saldo para o item, quantidade e dimensional informado. A ideia proposta é mover a parte i) referente as validações de valores para esta função wms6218_validar_valores_validos_dimensionais() . Para atender esta necessidade mover o bloco de código abaixo da função wms6218_valida_dimensional() e da wms6218_valida_dimensional_sem_split() para a função wms6218_validar_valores_validos_dimensionais();
Bloco de código language sql theme Eclipse title Bloco de código a ser movido da wms6218_valida_dimensional() para wms6218_validar_valores_validos_dimensionais() linenumbers true collapse true # Verificar a consistencia do dado informado IF ma_dimensional_aux[l_arr_curr].campo = "dat_hor_producao" OR ma_dimensional_aux[l_arr_curr].campo = "dat_hor_validade" THEN LET l_data_valida = ma_dimensional[l_arr_curr].val_dimensional LET ma_dimensional[l_arr_curr].val_dimensional = l_data_valida IF ma_dimensional[l_arr_curr].val_dimensional IS NULL THEN CALL wms6218_mensagem('Dimensional','Data invalida.') RETURN FALSE END IF END IF
Além de mover o bloco de código, veja que a instrução DISPLAY e o índice do array de tela foram descartados para que não exista dependência de tela para realizar a validação;
- Alterar função wms6218_valida_dimensional_sem_split() adequando o seu nome a sua funcionalidade e retirando a dependência da tela (screen arrays\campos)
- Remover o bloco de código movido para a função wms6218_validar_valores_validos_dimensionais() mencionado acima no item a. i);
- Retirar a declaração das variáveis utilizadas exclusivamente no bloco de código movido;
- Retirar o parâmetro l_scr_line;
- Mudar seu nome para wms6218_validar_saldo_reservas_dimensionais_sem_split().
- Alterar função wms6218_valida_dimensional() adequando o seu nome a sua funcionalidade e retirando a dependência da tela (screen arrays\campos)
- Remover o bloco de código movido para a função wms6218_validar_valores_validos_dimensionais() mencionado acima no item a. i);
- Retirar a declaração das variáveis utilizadas exclusivamente no bloco de código movido;
- Retirar o parâmetro l_scr_line;
- Mudar seu nome para wms6218_validar_saldo_reservas_dimensionais().
- Alterar função wms6218_informa_dimensionais() na estrutura de INPUT no after field do campo val_dimensional ajustar para adequar as modificações mencionadas nos itens acima a. i) e a. iii).
- No lugar de todo o conteúdo atual do after field do campo val_dimensional, adicionar as verificações abaixo. (ao final uma sugestão de implementação);
- Se val_dimensional for NULL, posicionar novamente no campo val_dimensional (NEXT FIELD val_dimensional);
- Em seguida, verificar se o valor digitado é um valor válido através da função wms6218_validar_valores_validos_dimensionais(). Não sendo válido, realizar o DISPLAY em tela do valor e posicionar novamente no campo para que o operador informe algo válido (NEXT FIELD val_dimensional).
Após verificar que o valor informado não é nulo e é um valor válido, realizar o DISPLAY em tela e em seguida verificar se existe saldo em reserva para a quantidade e dimensional informado através da função wms6218_validar_saldo_reservas_dimensionais(). Caso não exista saldo a função irá retornar FALSE e então neste caso posicionar novamente no campo para que o usuário informe algo válido (NEXT FIELD val_dimensional).
Abaixo sugestão de implementação para todos os itens mencionados acima.
Bloco de código language sql theme Eclipse title Sugestão de implementação dos ajustes necessário na validação dos dimensionais. linenumbers true collapse true AFTER FIELD val_dimensional IF ma_dimensional[l_arr_curr].val_dimensional IS NULL THEN NEXT FIELD END IF IF NOT wms6218_validar_valores_validos_dimensionais(l_arr_curr) THEN DISPLAY ma_dimensional[l_arr_curr].val_dimensional TO sr_dimensional[l_scr_line].val_dimensional NEXT FIELD val_dimensional END IF DISPLAY ma_dimensional[l_arr_curr].val_dimensional TO sr_dimensional[l_scr_line].val_dimensional IF NOT wms6218_validar_saldo_reservas_dimensionais(l_arr_curr) THEN NEXT FIELD val_dimensional END IF
- Crirar função wms6218_encontrou_todos_dimensionais_item_gs1_128() para identificar se todos os dimensionais controlados pelo item foram obtidos do GS1-128.
- O primeiro passo é encontrar o código do item obtido do GS1-128. Para chegar neste código existem duas opções:
- i) Obter o código do item através do depositante (mr_solicit_carga_compl.deposit) e do código do item depositante obtido do GS1-128 (wmsr130_get_item_depositante()).
- ii) Obter o código do item através do depositante (mr_solicit_carga_compl.deposit) e do código de barras do SKU obtido do GS1-128 (wmsr130_get_cod_barras_sku()).
- Em seguida verificar os dimensionais controlados pelo item considerando a configuração de dimensionais a serem restringidos na conferência da expedição conforme parametrizado no completo do item WMS em MA9922.
- Para cada dimensional a ser solicitado na conferência da expedição verificar se foi obtido algum valor do GS1-128.
- Caso algum destes dimensionais não possua valor, retornar FALSE. Caso todos possuam valor, retornar TRUE.
Segue abaixo a sugestão de implementação considerando todos os itens mencionados acima:
Bloco de código language sql title Sugestão de implementação para consultar os dimensionais que serão solicitados na conferência da expedição e verificar se todos eles tiveram valores obtidos do GS1-128 linenumbers true collapse true SELECT DISTINCT item.cod_item, CASE WHEN ( (rest_dimensional_conferencia = 'S' AND solicitar_lote_conferencia = 'S' AND ies_ctr_lote = 'S') OR ( (rest_dimensional_conferencia IS NULL OR rest_dimensional_conferencia = 'N') AND ies_ctr_lote = 'S') ) THEN 'S' ELSE 'N' END AS ies_ctr_lote_conf, CASE WHEN ( (rest_dimensional_conferencia = 'S' AND solic_dat_validade_conferencia = 'S' AND ies_dat_validade = 'S') OR ( (rest_dimensional_conferencia IS NULL OR rest_dimensional_conferencia = 'N') AND ies_dat_validade = 'S') ) THEN 'S' ELSE 'N' END AS ies_ctr_dat_validade_conf, CASE WHEN ( (rest_dimensional_conferencia = 'S' AND solic_dat_producao_conferencia = 'S' AND ies_dat_producao = 'S') OR ( (rest_dimensional_conferencia IS NULL OR rest_dimensional_conferencia = 'N') AND ies_dat_producao = 'S') ) THEN 'S' ELSE 'N' END AS ies_ctr_dat_producao_conf, CASE WHEN ( (rest_dimensional_conferencia = 'S' AND solicitar_volume_conferencia = 'S' AND ies_volume = 'S') OR ( (rest_dimensional_conferencia IS NULL OR rest_dimensional_conferencia = 'N') AND ies_volume = 'S') ) THEN 'S' ELSE 'N' END AS ies_ctr_volume_conf, CASE WHEN ( (rest_dimensional_conferencia = 'S' AND solic_comprimento_conferencia = 'S' AND ies_comprimento = 'S') OR ( (rest_dimensional_conferencia IS NULL OR rest_dimensional_conferencia = 'N') AND ies_comprimento = 'S') ) THEN 'S' ELSE 'N' END AS ies_ctr_comprimento_conf, CASE WHEN ( (rest_dimensional_conferencia = 'S' AND solicitar_altura_conferencia = 'S' AND ies_altura = 'S') OR ( (rest_dimensional_conferencia IS NULL OR rest_dimensional_conferencia = 'N') AND ies_altura = 'S') ) THEN 'S' ELSE 'N' END AS ies_ctr_altura_conf, CASE WHEN ( (rest_dimensional_conferencia = 'S' AND solicitar_largura_conferencia = 'S' AND ies_largura = 'S') OR ( (rest_dimensional_conferencia IS NULL OR rest_dimensional_conferencia = 'N') AND ies_largura = 'S') ) THEN 'S' ELSE 'N' END AS ies_ctr_largura_conf, CASE WHEN ( (rest_dimensional_conferencia = 'S' AND solicitar_diametro_conferencia = 'S' AND ies_diametro = 'S') OR ( (rest_dimensional_conferencia IS NULL OR rest_dimensional_conferencia = 'N') AND ies_diametro = 'S') ) THEN 'S' ELSE 'N' END AS ies_ctr_diametro_conf, CASE WHEN ( (rest_dimensional_conferencia = 'S' AND solicitar_peca_conferencia = 'S' AND reservado_1 = 'S') OR ( (rest_dimensional_conferencia IS NULL OR rest_dimensional_conferencia = 'N') AND reservado_1 = 'S') ) THEN 'S' ELSE 'N' END AS ies_ctr_peca_conf, CASE WHEN ( (rest_dimensional_conferencia = 'S' AND solicitar_serie_conferencia = 'S' AND reservado_2 = 'S') OR ( (rest_dimensional_conferencia IS NULL OR rest_dimensional_conferencia = 'N') AND reservado_2 = 'S') ) THEN 'S' ELSE 'N' END AS ies_ctr_serie_conf INTO l_ies_ctr_lote_conf, l_ies_ctr_dat_validade_conf, l_ies_ctr_dat_producao_conf, l_ies_ctr_volume_conf, l_ies_ctr_comprimento_conf, l_ies_ctr_altura_conf, l_ies_ctr_largura_conf l_ies_ctr_diametro_conf, l_ies_ctr_peca_conf, l_ies_ctr_serie_conf, FROM item INNER JOIN item_ctr_grade ON item.cod_empresa = item_ctr_grade.cod_empresa AND item.cod_item = item_ctr_grade.cod_item INNER JOIN wms_item_complemento ON item.cod_empresa = wms_item_complemento.empresa AND item.cod_item = wms_item_complemento.item INNER JOIN wms_item_sku_cod_barras ON item.cod_empresa = wms_item_sku_cod_barras.empresa AND item.cod_item = wms_item_sku_cod_barras.item WHERE item.cod_empresa = p_cod_empresa AND wms_item_complemento.deposit = mr_solicit_carga_compl.deposit AND ( (wms_item_complemento.item_deposit = wmsr130_get_item_depositante()) OR (wmsr130_get_item_depositante() IS NULL)) AND ( (wms_item_sku_cod_barras.cod_barras = wmsr130_get_cod_barras_sku()) OR (wmsr130_get_cod_barras_sku() IS NULL)) #MURILO --> para cada dimensional, se controla, verifica se tem valor.. #se nao tem valor retorna FALSE, no final se ngm retornar FALSE, retorna TRUE IF l_ies_ctr_lote_conf = 'S' THEN IF wmsr130_get_lote() IS NULL OR wmsr130_get_lote() = '' THEN RETURN FALSE END IF END IF IF ies_ctr_dat_validade_conf = 'S' THEN ..... RETURN TRUE
- O primeiro passo é encontrar o código do item obtido do GS1-128. Para chegar neste código existem duas opções:
- Criar função wms6218_controle_cod_barras_gs1_128() que finalmente irá 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, verificar se o código de barras informado é um GS1-128 tentando decodifica-lo (wmsr130_decodifica_gs1_128). Caso tenha retornado FALSE, o código de barras não é um GS1-128 e deverá retornar mensagem de código inválido conforme já informa o operador atualmente. Caso tenha retornado TRUE da decodificação, verificar se as informações necessárias para o processo foram obtidas. Caso o item controle SKU e dimensionais, será necessário verificar se foram obtidas as informações de código de barras do SKU,
- 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 referente a ean_codigo_barras, sku e 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_item_conferido.ean_codigo_barras), e do item (mr_item_conferido.item). 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_item_conferido. mr_item_conferido.item.
- O próximo passo é validar o código de barras SKU obtido do GS1-128, para isso verificar se o código de barras do SKU é diferente de vazio\null, se sim carregar a variável de tela mr_item_conferido.cod_barras e então tentar buscar o item através da função wmsm86_wms_item_sku_cod_barras_leitura(). Caso não encontre um item, limpar os campos de tela cod_barras (mr_item_conferido.cod_barras) e item(mr_item_conferido.cod_barras) e retornar FALSE.Caso encontre, atribuir TRUE a variável m_encontrou_cod_barras_sku_gs1_128 indicando que o código de barras do SKU foi encontrado
Segue abaixo sugestão de implementação contendo todos os passos mencionados acima:
- Criar modular SMALLINT m_wmsr130_gs1_128_existe para representar a existência ou não da nova função wmsr130. Isso se faz necessário para que caso a equipe de manutenção precise enviar uma correção ao cliente não gere a necessidade de ter que enviar todos os fontes do projeto GS1-128. A utilização desta variável ao longo do programa WMS6218 estará descrita nos demais tópicos deste documento.
- 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 wms6218_ean_cod_barras() para realizar os tratamentos necessários na utilização do GS1-128.
Já no início da função, caso a função wmsr130 exista, iniciar as variáveis m_wmsr130_gs1_128_existe com TRUE e m_encontrou_cod_barras_sku_gs1_128 com FALSE.
Bloco de código language sql theme Eclipse title Bloco 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. linenumbers true collapse true LET m_wmsr130_gs1_128_existe = FALSE IF find4GLfunction('wmsr130_decodifica_gs1_128') THEN LET m_wmsr130_gs1_128_existe = TRUE LET m_encontrou_cod_barras_sku_gs1_128 = FALSE END IF
No input de dados, alterar o evento before field do campo ean_codigo_barras. Ao final do evento, caso exista a função wmsr130 e o indicador de que o código de barras do SKU foi encontrado no GS1-128 seja FALSE (m_encontrou_cod_barras_sku_gs1_128), limpar os valores das funções referente ao GS1-128.
Bloco de código language sql theme Eclipse title Sugestão de implementação no evento before field ean_codigo_barras para solicitar ou não a leitura de código de barras GS1-128. linenumbers true collapse true IF m_wmsr130_gs1_128_existe THEN IF NOT m_encontrou_cod_barras_sku_gs1_128 THEN CALL wmsr130_set_null() CALL wmsr6730_set_null() END IF END IF
Alterar o evento after field do campo ean_codigo_barras. Para que caso o código de barras informado pelo operador não seja encontrado, antes de disparar mensagem de códgo de barras inválido, tente identificar se o código de barras é um GS1-128 e realize a respectiva decodificação. Para isso, logo após o retorno FALSE da chamada a função wmsm86_wms_item_sku_cod_barras_leitura() chamar a função wms6218_controle_cod_barras_gs1_128(). Caso a função wms6218_controle_cod_barras_gs1_128() retorne 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 codigo de barras seja encontrado e exista a função wmsr130, alimentar a variável m_encontrou_cod_barras_sku_gs1_128 com TRUE indicando que foram encontrados atributos GS1-128 porém o código de barras do SKU ou foi obtido manualmente ou via GS1-128.
Bloco de código language sql theme Eclipse title Sugestão de implementação no evento after field ean_cod_barras linenumbers true collapse true ...... IF NOT wmsm86_wms_item_sku_cod_barras_leitura(p_cod_empresa, mr_item_conferido.ean_codigo_barras, mr_solicit_carga_compl.deposit, TRUE, 1) THEN #MURILO --> Tentar tratar como GS1-128 IF m_wmsr130_gs1_128_existe THEN IF NOT wms6218_controle_cod_barras_gs1_128() THEN CALL wms6218_mensagem('EAN/Codigo Barras', NULL) NEXT FIELD ean_codigo_barras ELSE IF NOT m_encontrou_cod_barras_sku_gs1_128 THEN CALL wms6218_mensagem("EAN/Codigo Barras","Foram encontrados atributos validos para GS1-128 porem nao foi encontrado o SKU\ITEM. Por favor, informe o SKU\Item") NEXT FIELD ean_codigo_barras END IF END IF ELSE CALL wms6218_mensagem('EAN/Codigo Barras', NULL) NEXT FIELD ean_codigo_barras END IF #MURILO --> Tentar tratar como GS1-128 ELSE #MURILO --> indica que encontrou sku IF m_wmsr130_gs1_128_existe THEN LET m_encontrou_cod_barras_sku_gs1_128 = TRUE #indica que encontrou atributos gs1-128 e SKU foi informado manualmente ou foi obtido do gs1-128 END IF #MURILO --> indica que encontrou sku END IF LET mr_item_conferido.item = wmsm86_wms_item_sku_cod_barras_get_item() LET mr_item_conferido.sku = wmsm86_wms_item_sku_cod_barras_get_sku()
- Criar função wms6218_validar_valores_validos_dimensionais(l_arr_curr) para isolar regras de negócio referente a validação de valor válido para dimensionais sem que possua dependência direta dos componentes de tela (screen arrays\campos).
- WMS6218 - Conferencia da expedição via coletor de dados
Este documento é material de especificação dos requisitos de inovação, trata-se de conteúdo extremamente técnico. |
---|