Tratamentos durante o Processo 126 - Faturamento de Pedidos
1. Sobre o processo
O processo automático 126 - Faturamento de Pedidos executa a geração de notas fiscais de saída a partir de pedidos.
Para cada pedido faturado seguem as etapas desse processo:
- Geração do Cabeçalho
- Geração dos Itens
- Fechamento
- Emissão
Em sua versão 1 ou na versão 2 com o modo de execução original, esse processo possui uma transação aberta antes da geração do cabeçalho e fechada após a emissão, englobando todas as etapas do processo.
Essa arquitetura tem como características:
- Uma nota fiscal somente é persistida (gravada) na base de dados quando houver sucesso em todas as etapas desse processo;
- A tabela da série permanece travada durante o faturamento de cada pedido (durante todas as etapas mencionadas anteriormente);
- Pode ocorrer lentidão e/ou travamentos no faturamento de Notas Fiscais para outros usuários/processos, por conta do longo tempo que a tabela da série fica travada;
- Para evitar lentidão e/ou travamentos, geralmente utiliza-se o Identificador de Regras VEN-140LIBTR01.
2. Identificador VEN-140LIBTR01 x Processo Automático 126 - Faturamento de Pedido:
O uso do Identificador de Regras faz com que o processo tenha o seguinte comportamento:
- Grave o cabeçalho logo após sua geração;
- Feche a Transação aberta no início do processo, logo após a geração do cabeçalho;
- Libere a Tabela de Série, quando a transação do cabeçalho é liberada;
- Abra uma nova Transação, englobando todas as demais etapas não executadas que foram mencionadas no tópico "1. Sobre o processo".
3. Quando ocorre uma inconsistência durante a execução do processo
3.1 Quando não usa o Identificador de Regras VEN-140LIBTR01:
- Quando ocorre alguma inconsistência em qualquer uma das etapas do processo, o sistema descarta todas as alterações feitas e libera a numeração utilizada na Nota Fiscal gerada pelo Processo Automático 126 - Faturamento de Pedido
3.2 Quando usa o Identificador de Regras VEN-140LIBTR01:
- Quando ocorre alguma inconsistência após a gravação do cabeçalho (nas demais etapas), o sistema exclui o cabeçalho que havia sido gerado caso o número da nota gerada seja o ultimo número da série.
- No entanto, quando já existem outras notas com a numeração acima da numeração da nota gerada pelo processo, então não é possível excluir o cabeçalho, que é mantido na base de dados sem itens.
- Esse registro deve ser inutilizado de forma manual, ou pendenciado para exclusão por meio do Identificador de Regras VEN-140NTNEXC1.
4. Como tratar notas que não puderam ser excluídas:
Para tratar Notas Fiscais que não puderam ser excluídas, sugere-se a implementação de um processo que será descritos nos tópicos a seguir. Esse processo será composto pelas seguintes etapas:
- Pendenciar em uma tabela de usuário um registro para cada nota fiscal que não pode ser excluída, para que um processo automático consuma esses registros;
- Consumir as pendências por meio de um processo automático que inutilizará as notas fiscais pendenciadas na tabela de usuário;
- Remover as pendências;
- Atualizar as pendências;
- Registrar o que foi feito de forma a garantir rastreabilidade.
4.1 Tabela de Usuário
Cria uma tabela de usuário. Os campos abaixo mencionado são os campos básicos para o funcionamento. Fica a critério do cliente a criação de novos campos para se adequar a sua rotina.
- Nome Tabela: USU_TE140NFV
- Campos:
- USU_CodEmp;
Descrição: Código da Empresa da Nota Fiscal de Saída;
Mascara: ZZZ9 - USU_CodFil;
Descrição: Código da Filial da Nota Fiscal de Saída;
Mascara: ZZZZ9. - USU_NumNfv;
Descrição: Numero da Nota Fiscal de Saída;
Mascara: ZZZ.ZZZ.ZZ9. - USU_CodSnf;
Descrição: Código da Série da Nota Fiscal de Saída;
Mascara: U[3]. - USU_DatGer;
Descrição: Data de Inserção do Registro na Base;
Mascara: DD/MM/YYYY. - USU_SitPen
Descrição: Situação da Pendência: “P - Pendente”, “E - Erro”;
Mascara: A[1].
4.2 Geração de Pendências de Cancelamento:
Utiliza o Identificador de Regras VEN-140NTNEXC1 para inserir registros na tabela de usuário toda vez que um cabeçalho de nota não puder ser excluído pelo processo automático.
Abaixo segue um exemplo que deve ser adaptado de acordo com a tabela/os campos criados na base.
Exemplo de Regra:
Definir Numero VenNCodemp;
Definir Numero VenNCodFil;
Definir Numero VenNNumNfv;
Definir Alfa VenACodSnf;
Definir Data VenDDataHoje;
Definir Alfa xSituacaoPendencia;
xSituacaoPendencia = "P";
DataHoje(VenDDataHoje);
ExecSQl"INSERT INTO USU_TE140NFV(USU_CodEmp, USU_CodFil, USU_NumNfv, USU_CodSnf, USU_DatGer, USU_SitPen) \
VALUES (:VenNCodemp, :VenNCodFil, :VenNNumNfv, :VenACodSnf, :VenDDataHoje, :xSituacaoPendencia)";
x = y;
4.3 Consumir Pendências de Cancelamento:
Cria um processo automático e vincula à uma regra.
Regra de exemplo:
@Funções utilizadas na Regra@ Definir Funcao Definir_Parametrizacoes(); Definir Funcao Definir_Comando_Sql(); Definir Funcao Variaveis_Para_Cursor(); Definir Funcao Cursor_Para_Variaveis(); Definir Funcao Popular_Valores_WS(); Definir Funcao Preencher_ObsCan(); Definir Funcao Executar_Ws_Cancelar(); Definir Funcao Retornos_Linhas_WS(); Definir Funcao Retornos_Etapa1_Documentos(); Definir Funcao Retornos_Etapa2_Retornos(); Definir Funcao Retornos_Etapa3_Erros(); Definir Funcao Definir_Filtro_Pendencia(); Definir Funcao Remover_Pendencia_Cancelamento(); Definir Funcao Executar_Update_ErroPendencia(); Definir Funcao Informar_Erro_Cancelamento(); @Definição de Variáves@ Definir Alfa CancelarNotas; Definir Alfa xComando_Sql; Definir Alfa xADataCorte; Definir Numero xCodEmp; Definir Numero xCodFil; Definir Numero xNumNfv; Definir Alfa xCodSnf; Definir Alfa xObservacaoCan; Definir Alfa xMensagemRetorno_Linha_WS; Definir Numero xTipoRetorno; Definir Alfa xMensagem_RetornoWS; Definir Numero xQuantidade_Registros; Definir Numero xEmpresa_Sql; Definir Numero xFilial_Sql; Definir Alfa xSerie_Sql; Definir Numero xNota_Sql; Definir Alfa xObservacaoNota; @Definição do WS@ Definir interno.com.senior.g5.co.int.venda.documentofiscal.Cancelar WsCancelarNotas; @------------------------------------------------------------------------------@ @Inicio Regra@ @------------------------------------------------------------------------------@ Definir_Parametrizacoes(); Definir_Comando_Sql(); SQL_Criar(CancelarNotas); Sql_UsarSqlSenior2(CancelarNotas, 0); Sql_UsarAbrangencia(CancelarNotas, 0); Sql_DefinirComando(CancelarNotas, xComando_Sql); Variaveis_Para_Cursor(); Sql_AbrirCursor(CancelarNotas); Se ((Sql_Eof(CancelarNotas) <> 0)) Inicio Cancel; Fim; Enquanto (Sql_Eof(CancelarNotas) = 0) Inicio Cursor_Para_Variaveis(); Popular_Valores_WS(); Sql_Proximo(CancelarNotas); Fim; Executar_Ws_Cancelar(); @------------------------------------------------------------------------------@ @Fim Regra@ @------------------------------------------------------------------------------@ @------------------------------------------------------------------------------@ @Inicio Funções@ @------------------------------------------------------------------------------@ /* Inicializa os parâmetros principais usados na regra */ Funcao Definir_Parametrizacoes(); Inicio xCodEmp = 1; xCodFil = 1; xCodSnf = "NE"; xQuantidade_Registros = 1; Fim /* Monta o comando SQL que será executado para buscar as Pendencias de Cancelamento */ Funcao Definir_Comando_Sql(); Inicio Definir Alfa xSql_Quantidade_Select; Definir Alfa xSql_Quantidade_Condicao; Definir Alfa xSql_Quantidade_Final; RowNum(xQuantidade_Registros, "S", "N", xSql_Quantidade_Select); RowNum(xQuantidade_Registros, "C", "S", xSql_Quantidade_Condicao); RowNum(xQuantidade_Registros, "F", "N", xSql_Quantidade_Final); xComando_Sql = " SELECT " + xSql_Quantidade_Select + " USU_TE140NFV.USU_CODEMP, \ USU_TE140NFV.USU_CODFIL, \ USU_TE140NFV.USU_CODSNF, \ USU_TE140NFV.USU_NUMNFV \ FROM USU_TE140NFV \ LEFT JOIN E140IPV \ ON E140IPV.CODEMP = USU_TE140NFV.USU_CODEMP \ AND E140IPV.CODFIL = USU_TE140NFV.USU_CODFIL \ AND E140IPV.CODSNF = USU_TE140NFV.USU_CODSNF \ AND E140IPV.NUMNFV = USU_TE140NFV.USU_NUMNFV \ WHERE USU_TE140NFV.USU_CODEMP = :CODEMP \ AND USU_TE140NFV.USU_CODFIL = :CODFIL \ AND USU_TE140NFV.USU_CODSNF = :CODSNF \ AND USU_TE140NFV.USU_SITPEN = 'P' " + xSql_Quantidade_Condicao + " AND E140IPV.SEQIPV IS NULL \ ORDER BY USU_TE140NFV.USU_DATGER ASC " + xSql_Quantidade_Final; Fim; /* Passa os valores das variáveis para os parâmetros do cursor */ Funcao Variaveis_Para_Cursor(); Inicio SQL_DefinirInteiro(CancelarNotas, "CodEmp", xCodEmp); SQL_DefinirInteiro(CancelarNotas, "CodFil", xCodFil); SQL_DefinirAlfa(CancelarNotas, "CodSnf", xCodSnf); Fim /* Carrega os dados do cursor para as variáveis locais da regra */ Funcao Cursor_Para_Variaveis(); Inicio Sql_RetornarInteiro(CancelarNotas, "USU_CodEmp", xCodEmp); Sql_RetornarInteiro(CancelarNotas, "USU_CodFil", xCodfil); Sql_RetornarAlfa(CancelarNotas, "USU_CodSnf", xCodSnf); Sql_RetornarInteiro(CancelarNotas, "USU_NumNfv", xNumNfv); Fim /* Preenche os valores que serão enviados para o WebService de cancelamento */ Funcao Popular_Valores_WS(); Inicio WsCancelarNotas.cabecalho.CriarLinha(); WsCancelarNotas.cabecalho.CodEmp = xCodEmp; WsCancelarNotas.cabecalho.CodFil = xCodFil; WsCancelarNotas.cabecalho.NumNfv = xNumNfv; WsCancelarNotas.cabecalho.CodSnf = xCodSnf; Preencher_ObsCan(); WsCancelarNotas.cabecalho.ObsCan = xObservacaoCan; Fim; /* Preenche a Observação de Cancelamento utilizada no WS */ Funcao Preencher_ObsCan(); Inicio xObservacaoCan = "Solicitado Cancelamento da Nota Fiscal de Saída sem itens gerada via Processo Automático 126."; Fim; /* Executa o WS de Canelamento em Modo Local (ModoExecucao = 1) */ Funcao Executar_Ws_Cancelar(); Inicio WsCancelarNotas.ModoExecucao = 1; WsCancelarNotas.Executar(); Retornos_Linhas_WS(); Fim /* Trata Retorno do WS */ Funcao Retornos_Linhas_WS(); Inicio xTipoRetorno = WsCancelarNotas.TipoRetorno; xMensagem_RetornoWS = WsCancelarNotas.MensagemRetorno; /* Não podemos verificar se houve sucesso (0) ou erro (-1) pois podem ter multiplos registros. Dentro desses muitos registros pode haver um onde houve erro e/ou um que houve sucesso. Em casos como esse, o sistema retorna 0 - Sucesso. Dessa forma é necessário validar registro por registro. Se(xTipoRetorno <> 0) */ Retornos_Etapa1_Documentos(); Fim; /* Trata o nível 1 do Retorno da Execução do WS */ Funcao Retornos_Etapa1_Documentos(); Inicio Se (WsCancelarNotas.RetornosDocumentos.QtdLinhas > 0) Inicio Para (x = 0; x < WsCancelarNotas.RetornosDocumentos.QtdLinhas; x++) Inicio WsCancelarNotas.RetornosDocumentos.LinhaAtual = x; Retornos_Etapa2_Retornos(); Fim; Fim; Fim; /* Trata o nível 2 do Retorno da Execução do WS */ Funcao Retornos_Etapa2_Retornos(); Inicio Definir Alfa xTipoRetorno_Etapa2; Se (WsCancelarNotas.RetornosDocumentos.Retornos.QtdLinhas > 0) Para (y = 0; y < WsCancelarNotas.RetornosDocumentos.Retornos.QtdLinhas; y++) Inicio WsCancelarNotas.RetornosDocumentos.Retornos.LinhaAtual = y; xTipoRetorno_Etapa2 = WsCancelarNotas.RetornosDocumentos.Retornos.TipoRetorno; Se(xTipoRetorno_Etapa2 = "0") Inicio Remover_Pendencia_Cancelamento(); Fim SeNao Inicio Retornos_Etapa3_Erros(); Fim; Fim; Fim /* Trata o nível 3 do Retorno da Execução do WS */ Funcao Retornos_Etapa3_Erros(); Inicio Se (WsCancelarNotas.RetornosDocumentos.Retornos.Erros.QtdLinhas > 0) Inicio Para (z = 0; z < WsCancelarNotas.RetornosDocumentos.Retornos.Erros.QtdLinhas; z++) Inicio WsCancelarNotas.RetornosDocumentos.Retornos.Erros.LinhaAtual = z; Se (WsCancelarNotas.RetornosDocumentos.Retornos.Erros.QtdLinhas > 0) Inicio Executar_Update_ErroPendencia(); Fim; Fim; Fim; Fim; /* Definir os filtros que serão utilizados para Atualizar/Deletar Pendencia*/ Funcao Definir_Filtro_Pendencia(); Inicio xEmpresa_Sql = WsCancelarNotas.RetornosDocumentos.CodEmp; xFilial_Sql = WsCancelarNotas.RetornosDocumentos.CodFil; xSerie_Sql = WsCancelarNotas.RetornosDocumentos.CodSnf; xNota_Sql = WsCancelarNotas.RetornosDocumentos.NumNfv; Fim; /* Gera uma observação na Nota Canelada e Remove a Pendencia da tabela de Usuario */ Funcao Remover_Pendencia_Cancelamento(); Inicio Definir_Filtro_Pendencia(); xObservacaoNota = "Nota Cancelada via Regra. Cabeçalho gerado sem Itens via Processo Automático 126."; GeraObsNfv(xEmpresa_Sql, xFilial_Sql, xSerie_Sql, xNota_Sql, xObservacaoNota); ExecSql"DELETE FROM USU_TE140NFV WHERE Usu_CodEmp = :xEmpresa_Sql AND Usu_CodFil = :xFilial_Sql AND Usu_CodSnf = :xSerie_Sql AND Usu_NumNfv = :xNota_Sql"; Fim; /* Atualiza a Pendencia para erro quando houve um erro no cancelmento */ Funcao Executar_Update_ErroPendencia(); Inicio Definir_Filtro_Pendencia(); xMensagemRetorno_Linha_WS = WsCancelarNotas.RetornosDocumentos.Retornos.Erros.Mensagem; xObservacaoNota = "Erro ao Cancelar Nota Fiscal via Regra: " + xMensagemRetorno_Linha_WS; GeraObsNfv(xEmpresa_Sql, xFilial_Sql, xSerie_Sql, xNota_Sql, xObservacaoNota); ExecSql"UPDATE USU_TE140NFV SET Usu_SitPen = 'E' WHERE Usu_CodEmp = :xEmpresa_Sql AND Usu_CodFil = :xFilial_Sql AND Usu_CodSnf = :xSerie_Sql AND Usu_NumNfv = :xNota_Sql"; @Informar_Erro_Cancelamento@ Fim; /* Enviar email informando sobre a solicitação do Cancelamento */ Funcao Informar_Erro_Cancelamento(); Inicio Fim @------------------------------------------------------------------------------@ @Fim Funções@ @------------------------------------------------------------------------------@
O que a regra faz:
- Busca as notas mapeadas e inseridas em uma tabela de usuário através da execução do Identificador de Regras VEN-140NTNEXC1;
- Instancia o web service CancelarDocumentosFiscais;
- Carrega o web service com a quantidade de registros definida por meio da variável xSql_Quantidade_Select;
- Executa o web service, solicitando o Cancelamento/Inutilização das Notas carregadas;
- Gera uma observação nas notas fiscais de saída canceladas;
- Retira da tabela de usuário as notas canceladas com sucesso;
- Caso ocorrer uma inconsistência no cancelamento, a regra gera uma observação, incluindo a inconsistência retornada no web service para as notas impactadas;
- Atualiza os registros de pendência de cancelamento dos documentos que apresentaram inconsistência no retorno, alterando a Situação da Pendência para “E = Erro". Isso é feito para que os registros que apresentem inconsistências durante o cancelamento não sejam tratados novamente pelo processo automático, uma vez que precisam de intervenção do usuário. Para esses registros que retornaram uma inconsistência ao cancelar, o usuário precisará verificar manualmente o que foi retornado e ajustar. Após os ajustes, o usuário pode solicitar o Cancelamento/Inutilização manualmente ou
atualizar a Situação do Registro na Tabela de Usuário para “P - Pendente”. Dessa forma, a regra do
processo automático poderá consumi-lo novamente.
Atenção
Antes de quaisquer parametrizações, é extremamente necessário validar toda a regra e entender o intuito dela. Após isso, é preciso executar as alterações necessárias para deixar compatível com a Rotinas/Ambiente do cliente.
É extremamente importante ajustar a frequência e a quantidade de execuções do Processo Automático, em conjunto com a quantidade de registros carregados no SELECT (variável xSql_Quantidade_Select da Regra), afim de garantir que o Processo Automático dê conta de inutilizar todas as notas que não são excluídas e são pendenciadas para inutilização a partir do Identificador de Regras VEN-140NTNEXC1, quando não é possível excluir a nota no Processo Automático 126 - Faturamento de Pedido.
English
Español
English
Español


