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 |
Segmento Executor | Supply Chain - Inovação | ||
Projeto1 | IRM1 | LOGWMS01-30 - Processamento via leitura código de barras GS1-128 | |
Requisito1 | Subtarefa1 | ||
Chamado2 |
| ||
País | ( x ) Brasil ( ) Argentina ( ) Mexico ( ) Chile ( ) Paraguai ( ) Equador ( ) USA ( ) Colombia ( ) Outro _____________. | ||
Outros | Esta Story (LOGWMS01-32) é a segunda de um conjunto referente ao Épic (LOGWMS01-30) que contempla todas as funcionalidades previstas para tratamento do código de barras GS1-128. Demais Stories: REQ01 → LOGWMS01-31 - Configuração. REQ03 → LOGWMS01-33 - Tratar GS1-128 na Separação REQ04 → LOGWMS01-34 - Tratar GS1-128 na Conferência da Expedição REQ05 → LOGWMS01-35 - Tratar GS1-128 nas rotinas complementares
|
Legenda: 1 – Inovação 2 – Manutenção (Os demais campos devem ser preenchidos para ambos os processos).
Objetivo
Permitir a leitura de código de barras GS1-128 no programa de conferência do recebimento permitindo assim maior agilidade e confiabilidade no registro das informações.
Definição da Regra de Negócio
Atualmente na rotina de conferência do recebimento o usuário operador obrigatoriamente precisa informar a i) Etiqueta do palete, ii) Etiqueta da de identificação de estoque, podendo ser a mesma do palete e podendo ser ou não agrupadora, iii) Código de barras do SKU e iv) Quantidade de SKUs. Além destas informações obrigatórias, dependendo da configuração do sistema, o usuário deverá operador deve informar vi)Quantidade de Itens no SKU e poderá opcionalmente pode mudar as informações sugeridas pelo sistema como vii) Unidade de medida, viii) Tipo de estoque x Restrição.
O objetivo da implementação a ser realizada e descrita por este documento é permitir agilizar o registro das informações permitindo obtê-las diretamente do código de barras GS1-128, economizando tempo do operador em informar e conferir cada informação. As informações lidas do código de barras GS1-128 não serão deverão ser solicitadas ao operador porém passarão 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 usuário será operador deverá ser notificado e então deverá registráregistra-la manualmente. Vale lembrar que as leitura das informações de etiqueta do palete e de identificação de estoque deverão ser informadas pelo operador uma vez que a montagem da configuração do palete pode variar a cada evento de recebimento.estoque não sofrerão alterações.
Abaixo no item 1) e 2) Abaixo é 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.
- Para o exemplo vamos considerar as seguintes configurações (valores ilustrativos):
- Item ACO3NBR6645
- com dimensionais:
- Lote
- Data de produção
- Data de validade
- com dimensionais:
- 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:
- 128
- 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 conferencia do recebimento. As alterações detalhadas por este documento descrevem alteração que impactam da imagem 5 em diante.
- Tela nova para informar 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.
- Sequencia da imagem do item d), ao acionar a opção de teste.
- Fluxo alternativo partindo do item d), casos em que ocorra algum erro de leitura.
- Telas inicias da conferencia do recebimento. As alterações detalhadas por este documento descrevem alteração que impactam da imagem 5 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 \ 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
- Item \ Item depositante \ Cod. Barras SKU
- 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;
- 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.
- 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.
- 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.
- 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.
- 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.
- Para atingir o resultado esperado detalhado acima, as seguintes alteração 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 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 language sql theme Eclipse title Sugestão de implementação para verificar se depositante utiliza GS1-128? linenumbers true collapse true SELECT val_decimal FROM wms_parametro_complementar WHERE empresa = m empresa AND deposit = m_deposit AND nom_parametro = 'cod_barras_gs1_128'
- 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 language sql theme Eclipse title Exemplo de implementação para verificar se foram encontrados dimensionais no GS1-128. linenumbers true collapse true ... 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
- 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 language sql theme Eclipse title Exemplo de implementação para verificar se foram encontrados atributos na decodificação do GS1-128. linenumbers true collapse true ... 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
- 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)
- Alterar a função wmsr130_set_null() para definir o valor de todos os dimensionais do mr_dimensional_valido para FALSE.
- 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 language sql theme Eclipse title Exemplo de implementação para as funções wmsr130_set_<<dimensional>>_eh_valido(l_eh_valido). linenumbers true collapse true #-------------------------------------------------------------------------# FUNCTION wmsr130_set_lote_eh_valido(l_eh_valido) #-------------------------------------------------------------------------# DEFINE l_eh_valido SMALLINT LET mr_dimensional_valido.lote = l_eh_valido END FUNCTION #-------------------------------------------------------------------------#
- 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 language sql theme Eclipse title Exemplo de implementação para as funções wmsr130_get_<<dimensional>>_eh_valido(). linenumbers true collapse true #-------------------------------------------------------------------------# FUNCTION wmsr130_get_lote_eh_valido() #-------------------------------------------------------------------------# RETURN mr_dimensional_valido.lote END FUNCTION #-------------------------------------------------------------------------#
- Alterar 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 configurado.
- WMS6730 - Função responsável por controlar a interface de coletor de dados referente ao GS1-128.
- 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.
- 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().
- 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.
- 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 - Conferencia 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. 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.
- 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 language sql theme Eclipse title Bloco de código responsável por verificar se código de barras existe. linenumbers true collapse true 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 language sql theme Eclipse title Bloco de código responsável por verificar se item está em processo de inventário. linenumbers true collapse true 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 language sql theme Eclipse title Bloco de código responsável por verificar se o item é controlado pelo WMS. linenumbers true collapse true 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 language sql theme Eclipse title Bloco de código responsável por verificar se o item possui alguma classificação de risco. linenumbers true collapse true 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 language sql theme Eclipse title Bloco de código responsável por verificar se o depositante do item é o depositante da OS. linenumbers true collapse true 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 language sql theme Eclipse title Bloco de código responsável por verificar a possibilidade de misturar itens diferentes no palete. linenumbers true collapse true 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 language sql theme Eclipse title Bloco de código responsável por validar se o item possui controle por endereço. linenumbers true collapse true IF manm8_item_ctr_grade_leitura(mr_parametros.empresa,0,0,0,0,0,l_item,TRUE,1) THEN IF manm8_item_ctr_grade_get_ies_endereco() <> "S" THEN LET l_msg = "O produto informado nao possui controle por endereco (dimensional)." CALL wms6190_help(l_msg) NEXT FIELD cod_barras END IF END IF
- Criar função wms6190_after_field_cod_barras_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 language sql theme Eclipse title Bloco de código responsável por carregar as informações de SKU e Item. linenumbers true collapse true #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 language sql theme Eclipse title Bloco de código responsável por carregar as informações de restrição do item (ONU). linenumbers true collapse true 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 language sql theme Eclipse title Bloco de código responsável por carregar as informações de tipo de estoque e restrição do item. linenumbers true collapse true 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 language sql theme Eclipse title Bloco de código responsável por carregar as informações de unidade de medida do item. linenumbers true collapse true 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 language sql theme Eclipse title Bloco de código responsável por carregar o último cod_barras lido. linenumbers true collapse true 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 language sql theme Eclipse title Bloco de código responsável por carregar as informações para paletização do SKU. linenumbers true collapse true 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
- 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 language sql theme Eclipse title Bloco de código responsável por controlar a informação de dimensionais do item. linenumbers true collapse true 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
- 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 language sql theme Eclipse title Bloco de código responsável por validar se existe mapeamento para receber o palete. linenumbers true collapse true 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
- 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 language sql theme Eclipse title Bloco de código responsável pela validação da etiqueta agrupadora no campo código de barras do SKU. linenumbers true collapse true 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
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 language sql theme Eclipse title Bloco de código responsável por validar unidade de medida. linenumbers true collapse true 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
- 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 language sql theme Eclipse title Bloco de código responsável por validar quantidade de itens no SKU. linenumbers true collapse true 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
- 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 language sql theme Eclipse title Bloco de código responsável por validar o lasto do palete. linenumbers true collapse true # 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
- 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 language sql theme Eclipse title Bloco de código responsável por validar a capacidade máxima de peso no palete. linenumbers true collapse true 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
- 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 language sql theme Eclipse title Bloco de código responsável por validar a quantidade de skus. linenumbers true collapse true 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()
- 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 language sql theme Eclipse title Bloco de código responsável por validar o dimensional número de série. linenumbers true collapse true 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
- 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 language sql theme Eclipse title Sugestão de implementação para validar o dimensional data de validade. linenumbers true collapse true 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
- 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.
- 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 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 END IF
- 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 language sql theme Eclipse title Sugestão para implementação dos valores do código de barras gs1-128 ao record de tela dos dimensionais. linenumbers true collapse true ... 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()
- 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 language sql theme Eclipse title Sugestã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. linenumbers true collapse true 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
- 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 language sql theme Eclipse title Sugestão de implementação para sobrescrever os dimensionais do último pelos dimensionais obtidos do GS1-128. linenumbers true collapse true .... 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 language sql theme Eclipse title Sugestão de implementação para não limpar o record com valores dos dimensionais caso algum dimensional tenha sido obtido do GS1-128. linenumbers true collapse true .... #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
- 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 language sql theme Eclipse title Sugestão de implementação para não reinicializar ma_dimensionais e mr_dimensional caso wms6190_verifica_dimensional_item_conferencia() tenha retornado FALSE. linenumbers true collapse true #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 language sql theme Eclipse title Sugestã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. linenumbers true collapse true 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 language sql theme Eclipse title Sugestã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. linenumbers true collapse true 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
- 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 language sql theme Eclipse title Sugestão de implementação para validação de tipo de estoque x restrição permitidos na conferência do recebimento. linenumbers true collapse true 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 ,
- WMS6190 - Conferencia do Recebimento
- Na função wms6190_processo_conferencia () existe o principal input de dados do processo de recebimento. Será necessário isolar as regras de negócio existentes para cada campo de modo que possam ser executadas de outros pontos além do AFTER FIELD como por exemplo na rotina de preenchimento automático de campos lidos da etiqueta GS1-128. Para preenchimento automático dos campos, os mesmos serão lidos nos eventos de BEFORE FIELD de cada campo, e quando o valor extraído do código de barras for válido, o respectivo campo será preenchido e o fluxo será direcionado para o próximo campo. Para o AFTER FIELD do campo cod_barras, no lugar de toda a estrutura de código existente atualmente, deverão ser criadas novas funções, para realizar as validações, preenchimento de campos, solicitação dos dimensionais, validação dos dimensionais e preencimento de campos pós dimensionais. Quando uma dessas funções retornar falha, exibir mensagem ao usuário informando o erro ocorrido (se possuir mensagem), e voltar o foco para o campo para que uma informação válida seja informada. Caso retorne sucesso o fluxo do programa deverá seguir normalmente, ou seja, ir para o próximo campo da entrada de dados.
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
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 language sql title loco de código responsável por verificar se o item é controlado pelo WMS linenumbers true collapse true 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
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 language sql theme Confluence title Bloco de código responsável por verificar se o item possui alguma classificação de risco linenumbers true collapse true 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
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 language sql theme Confluence title Bloco de código responsável por verificar se o depositante do item é o depositante da OS linenumbers true collapse true 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 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".)- 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 language sql theme
Eclipse title
Sugestão de
implementação para controle do código de barras do SKU, dimensionais e tipos de estoque x restrição. linenumbers true collapse true
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
- 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 language sql theme Eclipse title Sugestão de implementação para a validação e atribuição da unidade de medida recebida do GS1-128. linenumbers true collapse true 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
- 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 language sql theme Eclipse title Sugestão de implementação para a validação e atribuição do item do GS1-128. linenumbers true collapse true 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
- 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 language sql theme
Eclipse title
Sugestão de implementação para a validação e atribuição da quantidade de SKUs recebida do GS1-128. linenumbers true collapse true
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
- 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 language sql theme Eclipse title Sugestão de implementação no evento before field cod_barras para solicitar ou não a leitura de código de barras GS1-128. linenumbers true collapse true Carregar informação da existência ou não de restrição do item (por classe ONU).
Bloco de código language sql theme Confluence title Bloco de código responsável por carregar as informações de restrição do item (ONU) linenumbers true collapse true 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
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 language sql theme Eclipse title Sugestão de implementação no evento before field cod_unid_med para solicitar ou não a informação da unidade de medida. linenumbers true collapse true 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 language sql theme Eclipse title Sugestão de implementação no evento before field qtd_item para solicitar ou não a informação da quantidade de itens. linenumbers true collapse true IF
m_
wmsr130_
gs1_128_existe THEN IF FGL_LASTKEY() = FGL_KEYVAL("UP") OR FGL_LASTKEY() = FGL_KEYVAL("LEFT") THEN NEXT FIELD cod_unid_med ELSE IF wms6190_valid_qtd_item_gs1_128() THEN NEXT FIELD
qtd_sku END IF END IF
- wms6190_valid_endereco_apto_receber_palete()
- wms6190_valid_item_identif_agrup()
- wms6190_controle_dimensionais()
- wms6190_valid_dimensionais()
- A nova função responsável por carregar os dimensionais do item deverá ser chamada de wms6190_solicita_dimensionais().
- Criar função wmsr130_deposit_utiliza_cod_barras_gs1_128() . Retornar TRUE ou FALSE.
- Criar função wmsr130_decodificacao_encontrou_dimensionais()
- Criar função wmsr130_decodificacao_encontrou_atributos()
- Alterar wms6730 mudar tecla de confirmação de f4 para f6. Incluir opção de leitura teste.
- Alterar wmsr130 para que na decodificação ao encontrar codigo de barras preencha automaticamente o item_deposit correspondente.
- 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()
- Na função wms6190_tratar_cod_barras_gs1_128() verificar se o depositante possui cód barras GS1-128 configurado no contrato.
- 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.
- 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.
- 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; Uma vez processado a decodificação do cód. barras com sucesso algumas verificações deverão ser realizadas.
- 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)
- Sim todas as informações do código de barras e do item foram validadas com sucesso.
- Item controla dimensionais? (vamos supor que não)
- foi encontrado O item_depositante possui apenas 1 SKU?
A nova função para validações do código de barras deverá ter o nome de wms6190_valid_cod_barras() e deverá realizar as validações listadas nos subitens abaixo. A ideia dessa função é retornar TRUE para sucesso e FALSE para falha. As possíveis mensagens de erro para o usuário deverão ser realizadas através da função log0030_processa_mensagem().
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.
language | sql |
---|---|
theme | Eclipse |
title | Bloco de código responsável por verificar se código de barras existe |
linenumbers | true |
collapse | true |
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.
language | sql |
---|---|
theme | Confluence |
title | Bloco de código responsável por verificar se item está em processo de inventário |
linenumbers | true |
collapse | true |
#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 as informações de tipo de estoque x restrição do item caso sejam diferentes de vazias.
language | sql |
---|---|
theme | Confluence |
title | Bloco de código responsável por carregar as informações de tipo de estoque e restrição do item. |
linenumbers | true |
collapse | true |
Carregar unidade de medida do item.
language | sql |
---|---|
theme | Confluence |
title | Bloco de código responsável por carregar as informações de unidade de medida do item |
linenumbers | true |
collapse | true |
Carregar informação do último item lido.
Bloco de código | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
LET m_ultimo_cod_barras = mr_conferencia.cod_barras |
Rotina | Tipo de Operação | Opção de Menu | Regras de Negócio |
[ACAA040 – Parâmetros] | [Alteração] | [Atualizações -> Acadêmico-> Tesouraria] | - |
[ACAA050 – Negociação Financeira] | [Envolvida] | [Atualizações -> Acadêmico-> Tesouraria] | - |
[ACAA060 – Cadastro de Pedidos] | [Criação] | [Atualizações -> Acadêmico-> Cadastros] | - |
CALL manm5_item_leitura(mr_parametros.empresa,mr_conferencia.item, FALSE, 1)LET l_ies_ctr_lote = manm5_item_get_ies_ctr_lote()# Verifica se existe controle de dimensionaisLET m_ctr_ender_nao_mapeado = FALSE -- MURILO não precisará alterar valor desta modular pode ser retirada
IF wms6190_verifica_dimensional(l_ies_ctr_lote,mr_conferencia.item) THEN LET m_permite_recebimento = TRUE CALL wms6190_informa_dimensional(mr_conferencia.item) IF NOT m_permite_recebimento THEN NEXT FIELD cod_barras END IF
END IF
Fluxo do Processo
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 language sql theme Eclipse title Sugestão de implementação no evento before field qtd_skus para solicitar ou não a informação da quantidade de SKUs. linenumbers true collapse true IF m_wmsr130_gs1_128_existe THEN IF FGL_LASTKEY() = FGL_KEYVAL("UP") OR FGL_LASTKEY() = FGL_KEYVAL("LEFT") THEN NEXT FIELD qtd_item ELSE IF wms6190_valid_qtd_sku_gs1_128() THEN NEXT FIELD NEXT END IF END IF
Alterar o evento after field do campo cod_barras para que os dimensionais obtidos do GS1-128 sejam validados. Esta validação no after field se faz necessário quando após realizar a leitura do GS1-128 e não encontrar o código item, o operador terá que informar o código de barras do SKU para que seja obtido o item. Após obter o item, será necessário validar os dimensionais para que eles possam ser assumidos sem a necessidade de solicitar ao operador. Para atingir o objetivo, adicionar o código sugerido abaixo antes da instrução LET m_cod_unid_med_orig = mr_conferencia.cod_unid_med existente no after field.
Bloco de código language sql theme Eclipse title Sugestã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. linenumbers true collapse true 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. |
---|