Nesse vídeo demonstraremos a utilização da função MaPvlNfs, que serve para faturar (gerar um documento de saída na SF2 e SD2) através do pedido de venda.
Abaixo o código fonte desenvolvido para o exemplo em vídeo acima:
//Bibliotecas
#Include "Totvs.ch"
/*/{Protheus.doc} User Function zExe339
Efetua a geração do documento de saída pelo pedido de venda liberado
@type Function
@author Atilio
@since 12/03/2023
@see https://tdn.totvs.com/pages/releaseview.action?pageId=578374528
@obs
Função MaPvlNfs
Parâmetros
+ aPvlNfs , Array , Array com os itens a serem gerados
+ cSerieNFS , Caractere , Serie da Nota Fiscal
+ lMostraCtb , Lógico , Mostra Lançamento Contábil
+ lAglutCtb , Lógico , Aglutina Lançamento Contábil
+ lCtbOnLine , Lógico , Contabiliza On-Line
+ lCtbCusto , Lógico , Contabiliza Custo On-Line
+ lReajuste , Lógico , Reajuste de preço na Nota Fiscal
+ nCalAcrs , Numérico , Tipo de Acréscimo Financeiro
+ nArredPrcLis , Numérico , Tipo de Arredondamento
+ lAtuSA7 , Lógico , Atualiza Amarração Cliente x Produto
+ lECF , Lógico , Cupom Fiscal
+ cEmbExp , Caractere , Número do Embarque de Exportação
+ bAtuFin , Bloco de Código , Bloco de Código para complemento de atualização dos títulos financeiros
+ bAtuPGerNF , Bloco de Código , Bloco de Código para complemento de atualização dos dados após a geração da Nota Fiscal
+ bAtuPvl , Bloco de Código , Bloco de Código de atualização do Pedido de Venda antes da geração da Nota Fiscal
+ bFatSE1 , Bloco de Código , Bloco de Código para indicar se o valor do Titulo a Receber será gravado no campo F2_VALFAT quando o parâmetro MV_TMSMFAT estiver com o valor igual a "2".
+ dDataMoe , Data , Data da cotação para conversão dos valores da Moeda do Pedido de Venda para a Moeda Forte
+ lJunta , Lógico , Aglutina Pedido Iguais
Retorno
+ cNumNFS , Caractere , Número da NF gerada
**** Apoie nosso projeto, se inscreva em https://www.youtube.com/TerminalDeInformacao ****
/*/
User Function zExe339()
Local aArea := FWGetArea()
Local cPedido := FWInputBox("Digite um número de pedido:")
Local aPvlDocS := {}
Local cDocument := ""
Local cSerie := "B"
Local cFunBkp := ""
Local lAbortar
//Somente se não tiver sido abortado
If ! lAbortar
DbSelectArea("SC5")
SC5->(DbSetOrder(1)) // C5_FILIAL + C5_NUM
//Somente se encontrar o pedido e ele não tiver tido nota emitida ainda
If SC5->(MsSeek(FWxFilial("SC5") + cPedido)) .And. Empty(SC5->C5_NOTA)
DbSelectArea('SC6')
SC6->(DbSetOrder(1)) // C6_FILIAL+C6_NUM+C6_ITEM+C6_PRODUTO
SC6->(DbGoTop())
SC6->( MsSeek( SC5->C5_FILIAL + SC5->C5_NUM ) )
//É necessário carregar a pergunta em memória
Pergunte("MT460A", .F.)
//Abre as tabelas que serão usadas
DbSelectArea("SC9")
SC9->(DbSetOrder(1)) //C9_FILIAL + C9_PEDIDO + C9_ITEM + C9_SEQUEN + C9_PRODUTO + C9_BLEST + C9_BLCRED
DbSelectArea("SE4")
SE4->(DbSetOrder(1)) //E4_FILIAL + E4_CODIGO
DbSelectArea("SB1")
SB1->(DbSetOrder(1)) //B1_FILIAL + B1_COD
DbSelectArea("SB2")
SB2->(DbSetOrder(1)) //B2_FILIAL + B2_COD + B2_LOCAL
DbSelectArea("SF4")
SF4->(DbSetOrder(1)) //F4_FILIAL + F4_CODIGO
//Percorre todos os itens do pedido para pode carregar o array que irá gerar a NF
While ! SC6->(Eof()) .And. SC6->C6_FILIAL == SC5->C5_FILIAL .And. SC6->C6_NUM == SC5->C5_NUM
//Posiciona nas tabelas
SC9->(MsSeek(FWxFilial("SC9")+SC6->(C6_NUM+C6_ITEM)))
SE4->(MsSeek(FWxFilial("SE4")+SC5->C5_CONDPAG) )
SB1->(MsSeek(FWxFilial("SB1")+SC6->C6_PRODUTO))
SB2->(MsSeek(FWxFilial("SB2")+SC6->(C6_PRODUTO+C6_LOCAL)))
SF4->(MsSeek(FWxFilial("SF4")+SC6->C6_TES))
//Se tiver liberado o BLEST e BLCRED
If Empty(SC9->C9_BLEST) .And. Empty(SC9->C9_BLCRED)
aAdd(aPvlDocS,{ SC9->C9_PEDIDO,;
SC9->C9_ITEM,;
SC9->C9_SEQUEN,;
SC9->C9_QTDLIB,;
SC9->C9_PRCVEN,;
SC9->C9_PRODUTO,;
.F.,;
SC9->(RecNo()),;
SC5->(RecNo()),;
SC6->(RecNo()),;
SE4->(RecNo()),;
SB1->(RecNo()),;
SB2->(RecNo()),;
SF4->(RecNo())})
EndIf
SC6->(DbSkip())
EndDo
If Len(aPvlDocS) > 0
cFunBkp := FunName()
SetFunName("MATA461")
cDocument := MaPvlNfs(;
aPvlDocS,; // 01 - aPvlNfs - Array com os itens a serem gerados
cSerie,; // 02 - cSerieNFS - Serie da Nota Fiscal
.F.,; // 03 - lMostraCtb - Mostra Lançamento Contábil
.F.,; // 04 - lAglutCtb - Aglutina Lançamento Contábil
.F.,; // 05 - lCtbOnLine - Contabiliza On-Line
.T.,; // 06 - lCtbCusto - Contabiliza Custo On-Line
.F.,; // 07 - lReajuste - Reajuste de preço na Nota Fiscal
0,; // 08 - nCalAcrs - Tipo de Acréscimo Financeiro
0,; // 09 - nArredPrcLis - Tipo de Arredondamento
.T.,; // 10 - lAtuSA7 - Atualiza Amarração Cliente x Produto
.F.,; // 11 - lECF - Cupom Fiscal
"",; // 12 - cEmbExp - Número do Embarque de Exportação
{||},; // 13 - bAtuFin - Bloco de Código para complemento de atualização dos títulos financeiros
{||},; // 14 - bAtuPGerNF - Bloco de Código para complemento de atualização dos dados após a geração da Nota Fiscal
{||},; // 15 - bAtuPvl - Bloco de Código de atualização do Pedido de Venda antes da geração da Nota Fiscal
{|| .T. },; // 16 - bFatSE1 - Bloco de Código para indicar se o valor do Titulo a Receber será gravado no campo F2_VALFAT quando o parâmetro MV_TMSMFAT estiver com o valor igual a "2".
Date(),; // 17 - dDataMoe - Data da cotação para conversão dos valores da Moeda do Pedido de Venda para a Moeda Forte
.F.; // 18 - lJunta - Aglutina Pedido Iguais
)
SetFunName(cFunBkp)
If Empty(cDocument)
lAbortar := .T.
Else
FWAlertSuccess("Documento gerado: " + cDocument, "Teste MaPvlNfs")
EndIf
Else
lAbortar := .T.
EndIf
EndIf
If lAbortar
FWAlertError("Não foi possível gerar o Documento de Saída!", "Atenção")
EndIf
EndIf
FWRestArea(aArea)
Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.
Mestre, ao utilizar essa função estou enfrentando o seguinte erro:
ERROR: Saída no final: Problema Numeracao NF
FINAL – MSFINAL.PRW(269) – Params: CSTR:Problema Numeracao NF,CSTR1:,LLOGOFF:.F.,LLOGIN:.F.,NTIMER:0,ATHBTN: )
NXTSX5NOTA – MATXFUNA.PRX(3314) – Params: CINISER:01 ,LLIBERA:.T.,CTPNRNFS:1,LAVANCA:.F.,CTAB:01,CALITP:NFF,CSERIEID:01 ,LVERSE1:.T. )
MAPVLNFS – MATA461.PRX(1772) – Params: @APVLNFS:,CSERIENFS:01 ,LMOSTRACTB:.F.,LAGLUTCTB:.F.,LCTBONLINE:.F.,LCTBCUSTO:.F.,LREAJUSTE:.F.,NCALACRS:0,NARREDPRCLIS:0,LATUSA7:.T.,LECF:.F.,CEMBEXP:NIL,BATUFIN:NIL,BATUPGERNF:{||},BATUPVL:{||},BFATSE1:{|| .T. },DDATAMOE:2024/12/02,LJUNTA:.F. )
U_RBXDOCS – RBXFUNC.PRW(187) – Params: CCODFIL:01,CCODPED:SV0639,@ARECSC6:,CSERIENF:01 )
DOCSAIDA – RBXCLASS.PRW(2865) – Params: CUUID:D6B7EA1791CF4F118236005056B48E55,CCODSERIE:01 )
SAIDASMODELO21 – RBXCLASS.PRW(2631) – Params: CUUID: )
U_RBXDEBUG – RBXSCH02.PRW(110)
O que pode ser?
Bom dia Jaime, tudo joia?
Essa mensagem geralmente é devido ao controle de numerações da NF.
A série que você passou “01 “, você controla pela SX5? Se sim, como ela está cadastrada no Configurador? (esta exclusiva, compartilhada, esta com 0 a esquerda mesmo, etc)
Ficamos no aguardo.
Tenha uma ótima e abençoada terça feira.
Um grande abraço.
Boa tarde,
Sabe informar quando executa a NF via MaPvlNfs mesma a TES configurada para F4_DUPLIC = ‘S’ o título a receber não está sendo gerado.
Há a necessidade de executar execauto de boleto posteriormente para criação do título?
Bom dia Felipe, tudo joia?
Era para gerar a SE1 sim, se na TES está configurado.
O que você pode fazer, é dentro do seu laço que é criado o array com as informações, coloque um breakpoint na linha do aAdd e veja se a TES em memória, bate com a que está validando, veja os campos SF4->F4_CODIGO, SF4->F4_DUPLIC.
Tenha uma ótima e abençoada querta feira.
Um forte abraço.
Bom dia,
Preciso alterar E1_TIPO que é gerado, como posso fazer essa alteração usando “bAtuFin” .
Att.
Bom dia Elcilei, tudo joia?
Você pode usar o ponto de entrada M460COND, e dentro dele alterar a variável MVNOTAFIS, que é a informação que vai para o E1_TIPO.
Abaixo segue um exemplo:
User Function M460COND() Local aArea := FWGetArea() Local dDataCond := ParamIXB[1] //Por padrão pega do SF2->F2_EMISSAO //Se for algum estado do sudeste If Alltrim(SF2->F2_EST) $ "SP;MG;RJ;ES;" MVNOTAFIS := AvKey("SUD", "E1_TIPO") //Senão, tipo padrão Else MVNOTAFIS := AvKey("NF", "E1_TIPO") EndIf FWRestArea(aArea) Return dDataCondBom pessoal, por hoje é só.
Abraços e até a próxima.