FA040DUP
PE para customizar a geracao de duplicatas/parcelas em titulo a receber. Retorna array com as parcelas a gerar.
Assinatura: User Function FA040DUP() --> Array com parcelas: { {dVencto, nValor, cParcela}, ... }
Retorna: Array com parcelas: { {dVencto, nValor, cParcela}, ... }
Modulo: SIGAFIN · Rotina: FINA040 · Momento: Durante geracao automatica de parcelas (condicao de pagamento parcelada)
Parametros (PARAMIXB)
// PARAMIXB tem dados da NF/Pedido origemRetorno esperado
Array com parcelas: { {dVencto, nValor, cParcela}, ... }
Exemplo
User Function FA040DUP()
Local aDup := {}
Local nValor := PARAMIXB[1][1] // valor total
// Gera 3 parcelas customizadas (30/60/90 dias)
aAdd(aDup, {dDataBase + 30, Round(nValor / 3, 2), "01"})
aAdd(aDup, {dDataBase + 60, Round(nValor / 3, 2), "02"})
aAdd(aDup, {dDataBase + 90, nValor - 2 * Round(nValor/3,2), "03"})
Return aDupPegadinhas
- Soma das parcelas deve dar exato o valor total — arredondamento em parcela final.
- Vencimento em fim de semana/feriado: tratar pra dia util ou aceitar default.
- PE substitui calculo padrao — se retornar array vazio, sistema usa default ou erro.
Quando usar
- Customizacao da rotina padrao Protheus
Cuidados gerais
- Idempotencia: PEs podem disparar mais de uma vez em retry ou reprocessamento — codigo deve ser seguro pra rodar varias vezes sem efeito colateral.
- Performance critica: PE roda em fluxo do usuario. Operacoes pesadas (loop sobre milhares de registros, chamada HTTP sincrona) podem travar a tela. Use
StartJobpra background. - Em JOB sem AppServer ativo: PE chamado via RPC pode ter
cFilAnt/cEmpAntvazios — sempre garantaRpcSetEnv. - Begin Sequence + Recover: erros nao tratados em PE podem deixar transacao Protheus em estado inconsistente. Sempre envolver em
Begin Sequence ... End Sequence. - Logging com contexto: use
FwLoggercom identificacao do PE no log — facilita troubleshooting.
Tabelas afetadas
- SE1 — duplicatas (geralmente posicionada quando PE dispara)