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:

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:

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:

3. Quando ocorre uma inconsistência durante a execução do processo

3.1 Quando não usa o Identificador de Regras VEN-140LIBTR01:

3.2 Quando usa o Identificador de Regras VEN-140LIBTR01:

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:

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.

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:

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.

Este artigo ajudou você?