Páginas filhas
  • OLD_ER-LOGWMS01-32_Conferencia_recebimento

Versões comparadas

Chave

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

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

  

Informações Gerais

 

Especificação

Produto

Logix

Módulo

WMS

Segmento Executor

Supply Chain - Inovação

Projeto1

LOGWMS01 - Supply Chain - WMS

IRM1

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

Requisito1

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

Subtarefa1

LOGWMS01-335 - Gerar Especificação

Chamado2

 

País

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

(  ) USA  (  ) Colombia   (  ) Outro _____________.

Outros

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

Demais Stories:

REQ01 → LOGWMS01-31 - Configuração.

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

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

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

 

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

Objetivo

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

 

Definição da Regra de Negócio

Atualmente na rotina de conferência do recebimento o usuário obrigatoriamente precisa informar a i) Etiqueta do palete, ii) Etiqueta da 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á informar vi)Quantidade de Itens no SKU e poderá opcionalmente mudar 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 obter as informações diretamente 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 solicitadas ao operador porém passarão pelas mesmas validações de quando digitado pelo operador. Caso alguma informação lida do código de barras GS1-128 conforme configuração previamente realizada. seja inválida para o processo, o usuário será notificado e então deverá registrá-la manualmente.


Vale lembrar que as 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.

Todas as informações. Sendo as principais validações conforme abai



 

  1. WMS6190 - Conferencia do Recebimento
    1. Na função wms6190_processo_conferencia () existe o principal input de dados do processo de recebimento. Será necessário isolar as regras de negócio existentes para cada campo de modo que possam ser executadas de outros pontos além do AFTER FIELD como por exemplo na rotina de preenchimento automático de campos lidos da etiqueta GS1-128. Para preenchimento automático dos campos, os mesmos serão lidos nos eventos de BEFORE FIELD de cada campo, e quando o valor extraído do código de barras for válido, o respectivo campo será preenchido e o fluxo será direcionado para o próximo campo.
      1. Para o AFTER FIELD do campo cod_barras, no lugar de toda a estrutura de código existente atualmente, deverão ser criadas novas funções, para realizar as validaçõespreenchimento de campos, solicitação dos dimensionais, validação dos dimensionais e preencimento de campos pós dimensionais. Quando uma dessas funções retornar falha, exibir mensagem ao usuário informando o erro ocorrido (se possuir mensagem), e voltar o foco para o campo para que uma informação válida seja informada. Caso retorne sucesso o fluxo do programa deverá seguir normalmente, ou seja, ir para o próximo campo da entrada de dados.
        • A nova função para validações do código de barras deverá ter o nome de wms6190_valid_cod_barras() e deverá realizar as validações listadas nos subitens abaixo. A ideia dessa função é retornar TRUE para sucesso e FALSE para falha. As possíveis mensagens de erro para o usuário deverão ser realizadas através da função log0030_processa_mensagem(). 
          1. Validar se o código de barras informado existe. Atualmente é realizado pelo código abaixo. Se l_encontrou for FALSE, chamar a função log0030_processa_mensagem(log0030_mensagem_get_texto()) e retornar FALSE.

            Bloco de código
            languagesql
            themeEclipse
            titleBloco de código responsável por verificar se código de barras existe
            linenumberstrue
            collapsetrue
            CALL wmst86_wms_item_sku_cod_barras_verifica_cod_barras(mr_parametros.empresa,mr_conferencia.cod_barras,m_depositante,1) 
                       RETURNING l_encontrou ,l_item, l_sku        
                    IF l_encontrou = FALSE THEN
                       LET l_msg = log0030_mensagem_get_texto()
                       CALL wms6190_help(l_msg)
                       NEXT FIELD cod_barras
                    END IF
          2. Sendo o código de barras válido, o item será retornado na função anterior. Validar se o item do código de barras do SKU está em processo de inventário. Se a chamada  para a função wmsr51_f4_verifica_emp_item retornar TRUE processar a mensagem de erro em modo BATCH através da função log0030_processa_mensagem() e retornar FALSE.

            Bloco de código
            languagesql
            themeConfluence
            titleBloco de código responsável por verificar se item está em processo de inventário
            linenumberstrue
            collapsetrue
            IF wmsr51_f4_verifica_emp_item(p_cod_empresa,mr_conferencia.item) THEN
                       LET l_msg = "Nao e possivel realizar a conferencia do recebimento pois o item esta em processo de inventario."
                       CALL wms6190_help(l_msg)
                       NEXT FIELD cod_barras
                    END IF
          3. Verificar se o item é controlado pelo WMS. Se l_status retornar FALSE então processar mensagem de erro em modo BATCH através da função log0030_processa_mensagem(log0030_mensagem_get_texto()) e retornar FALSE. Se item  não é controlado pelo WMS também retornar FALSE e processar mensagem em modo BATCH via log0030_processa_mensagem().

            Bloco de código
            languagesql
            titleloco de código responsável por verificar se o item é controlado pelo WMS
            linenumberstrue
            collapsetrue
            CALL wms0004_item_sob_controle_wms(mr_parametros.empresa,mr_conferencisa.item) RETURNING l_status , l_item_wms
                    IF l_status = FALSE THEN
                       RETURN FALSE
                    ELSE
                       IF l_item_wms = FALSE THEN
                          LET l_msg = "Item nao e controlado pelo WMS."
                          CALL wms6190_help(l_msg)
                          NEXT FIELD cod_barras
                       END IF
                    END IF
          4. Verificar se o item possui alguma classificação de risco. Para esta função de validação, a variável m_item_com_classe_onu  não precisará ser alimentada (pode ser retirada ). As mensagens de erro deverão ser processadas em modo BATCH através da função  log0030_processa_mensagem() e em seguida deverá ser retornado FALSE.

            Bloco de código
            languagesql
            themeConfluence
            titleBloco de código responsável por verificar se o item possui alguma classificação de risco
            linenumberstrue
            collapsetrue
            LET m_item_com_classe_onu = FALSE
                    IF wmsm140_wms_item_restrito_existe(mr_parametros.empresa,mr_conferencia.item,TRUE,1)THEN
                       IF wms6190_verifica_classific_ONU(mr_conferencia.item) THEN
                          LET l_msg = "O palete possui itens que sao incompativeis ao item informado."
                          CALL wms6190_help(l_msg)
                          NEXT FIELD cod_barras
                       END IF
                       CALL wmsr29_verifica_restricao_item_endereco(mr_parametros.empresa, mr_conferencia.item, m_endereco_conferencia,1) RETURNING l_status, l_status2
                       IF (l_status = TRUE  AND l_status2 = TRUE )
                       OR (l_status = FALSE AND l_status2 = FALSE ) THEN
                          IF l_status = TRUE THEN
                             LET l_msg = "O endereco da conferencia possui itens incompativeis com o item informado."
                             CALL wms6190_help(l_msg)
                          END IF
                          NEXT FIELD cod_barras
                       END IF
                       LET m_item_com_classe_onu = TRUE
                    END IF
          5. Verificar se o depositante do item encontrado para o código de barras do SKU é o mesmo do depositante da OS. As mensagens deverão ser processadas em BATCH via  log0030_processa_mensagem() e em seguida retornar FALSE para a operação.

            Bloco de código
            languagesql
            themeConfluence
            titleBloco de código responsável por verificar se o depositante do item é o depositante da OS
            linenumberstrue
            collapsetrue
            IF NOT wmsm81_wms_item_complemento_leitura(mr_parametros.empresa, mr_conferencia.item, 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
          6. Além de verificar se  o depositante da OS é o mesmo do depositante do item, deve-se consistir se no palete existem itens que permitem ser misturados com outros bem como verificar se o item que está sendo incluído no palete permite ser misturados com outros que já estão no palete.  As mensagens deverão ser processadas em BATCH via  log0030_processa_mensagem() e em seguida retornar FALSE para a operação. (Observar no código abaixo os comentários com o nome "MURILO".)

            Bloco de código
            languagesql
            themeConfluence
            titleBloco de código responsável por verificar a possibilidade de misturar itens diferentes no palete.
            linenumberstrue
            collapsetrue
            LET l_palete_misto        = wmsm81_wms_item_complemento_get_permite_palete_misto()
                    #Se o depositante restringe item na armazenagem não permite receber paletes mistos mesmo o SKU permitindo
                    IF m_deposit_resting_item_unico = 'S' THEN
                       LET l_palete_misto = "N"
                    END IF
                    IF  l_palete_misto = "N" THEN
                        # O item nao pode ser armazenado em palete misto. Verifica se no palete existem produtos diferentes do atual.
                        #MURILO: VERIFICAR A POSSIBILIDADE DE COLOCAR A CONSULTA SQL ABAIXO EM UMA FUNÇÃO. wms6190_get_qtd_itens_diferentes_no_palete()
                        WHENEVER ERROR CONTINUE
                        SELECT COUNT(wms_iden_estoque_conferencia.item)
                          INTO l_produtos_diferentes  #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
          7. Validar se o item controla o dimensional endereço (para itens wms é obrigatório). As mensagens deverão ser processadas em BATCH via  log0030_processa_mensagem() e em seguida retornar FALSE para a operação.

            Bloco de código
            languagesql
            themeConfluence
            titleBloco de código responsável por validar se o item possui controle por endereço
            linenumberstrue
            collapsetrue
            IF manm8_item_ctr_grade_leitura(mr_parametros.empresa,0,0,0,0,0,l_item,TRUE,1) THEN
               IF manm8_item_ctr_grade_get_ies_endereco() <> "S" THEN
                  LET l_msg = "O produto informado nao possui controle por endereco (dimensional)."
                  CALL wms6190_help(l_msg)
                  NEXT FIELD cod_barras
               END IF
            END IF 
        • A nova função para preenchimento dos dados após validar o código de barras deverá ter o nome de wms6190_after_field_cod_barras() . O objetivo desta função é preencher\carregar campos da tela uma vez que o código de barras informado é válido.
          1. Carregar as informações do SKU e do item.

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

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

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

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

            Bloco de código
            languagesql
            themeConfluence
            titleBloco de código responsável por carregar o último cod_barras lido
            linenumberstrue
            collapsetrue
            LET m_ultimo_cod_barras = mr_conferencia.cod_barras



        • A nova função para tratamento do dimensionais informados deverá se chamarwms6190_controle_dimensionais(). O principal motivo da criação desta função é apenas permitir melhor distribuição das atribuições de cada bloco de código. Sendo assim, o bloco de código abaixo deverá ser movido para esta nova função. As mensagens deverão ser processadas em BATCH via  log0030_processa_mensagem() e em seguida retornar FALSE para a operação.

          Bloco de código
          languagesql
          themeConfluence
          titleBloco de código responsável por controlar a informação de dimensionais do item
          linenumberstrue
          collapsetrue
          CALL manm5_item_leitura(mr_parametros.empresa,mr_conferencia.item, FALSE, 1)
          LET l_ies_ctr_lote = manm5_item_get_ies_ctr_lote()
          # Verifica se existe controle de dimensionais
          LET m_ctr_ender_nao_mapeado = FALSE -- MURILO não precisará alterar valor desta modular pode ser retirada
          IF wms6190_verifica_dimensional(l_ies_ctr_lote,mr_conferencia.item) THEN
             LET m_permite_recebimento = TRUE
             CALL wms6190_informa_dimensional(mr_conferencia.item)
             IF NOT m_permite_recebimento THEN
                NEXT FIELD cod_barras 
             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().
  2. Criar função wmsr130_deposit_utiliza_cod_barras_gs1_128() . Retornar TRUE ou FALSE.
  3. Criar função wmsr130_decodificacao_encontrou_dimensionais()
  4. Criar função wmsr130_decodificacao_encontrou_atributos()
  5. Alterar wms6730 mudar tecla de confirmação de f4 para f6. Incluir opção de leitura teste.




  1. Alterar wmsr130 para que na decodificação ao encontrar codigo de barras preencha automaticamente o item_deposit correspondente.
  2. No evento before field do campo cod_barras na função wms6190_processo_conferencia após os pontos de entrada chamar nova função wms6190_tratar_cod_barras_gs1_128()
  3. Na função wms6190_tratar_cod_barras_gs1_128() verificar se  o depositante possui cód barras GS1-128 configurado no contrato.
  4. Se depositante não possuir GS1-128 configurado então deverá retornar para a função wms6190_processo_conferencia  e o processo deve seguir normalmente.
  5. Se depositante possuir GS1 128 configurado no contrato então chamar a função wms6730_solicita_cod_barras_gs1_128 para que seja solicitado os códigos GS1-128.
  6. Processar leitura do código de barras através da função wms6730_processa_cod_barras_gs1_128() → wmsr130_decodifica_gs1_128(). Caso a função wmsr130_decodifica_gs1_128 retorne FALSE exibir mensagem de erro de modo que o usuário possa ler e confirmar. Ao confirmar deverá voltar novamente para o input que solicita os códigos de barras;
  7. Uma vez processado a decodificação do cód. barras com sucesso algumas verificações deverão ser realizadas.
    1. Foi identificado o atributo item_depositante? O item_depositante existe no sistema? Se sim, o item_depositante possui apenas 1 SKU? Se sim, então validar se as informações do item e do SKU encontrado são válidos para o processo de conferencia do recebimento. COMO??? (VALIDAÇÕES AFTER FIELD) 
    2. Sim todas as informações do código de barras e do item foram validadas com sucesso. 
    3. Item controla dimensionais? (vamos supor que não)
    4. foi encontrado 
    5. O item_depositante possui apenas 1 SKU? 

 


 

Rotina

Tipo de Operação

Opção de Menu

Regras de Negócio

[ACAA040 – Parâmetros]

[Alteração]

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

-

[ACAA050 – Negociação Financeira]

[Envolvida]

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

-

[ACAA060 – Cadastro de Pedidos]

[Criação]

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

-

 

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

Fluxo do Processo

 

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

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