Patch level : 12.0 656

Files correlati     : fp
Commento            :
- Aggiunta conversione qualsiasi valuta -> Euro
- Aggiunto controllo alle righe che vado a scrivere, ogni tanto finivano delle righe non volute
- Tolto importo in testata
- Camiata lettura importi dettaglio iva
This commit is contained in:
Mattia Tollari 2018-12-10 14:23:41 +01:00
parent fdd0dd4fc9
commit 00048f0239
2 changed files with 212 additions and 180 deletions

View File

@ -835,6 +835,22 @@ bool TDoc_fp::add_row_alleg(TFilename& file, long& nprogr, TPaf_record& paf)
return ok; return ok;
} }
const TString& TDoc_fp::converti_prezzo(const real& prezzo) const
{
TString& ret = get_tmp_string();
ret.cut(0);
if (_is_valuta_estera)
{
TCurrency ret(prezzo);
ret.change_to_euro_val();
return ret.string(true);
}
else
ret << prezzo;
return ret;
}
bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc) bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
{ {
// Azzero // Azzero
@ -859,11 +875,12 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
TString8 coddest; TString8 coddest;
TString pec; TString pec;
const bool is_pa = doc.clifor().get_int("ALLEG") == 7;
#ifndef DBG #ifndef DBG
const bool is_pa = doc.clifor().get_int("ALLEG") == 7;
if (!get_coddest(doc.clifor().tipo(), doc.clifor().codice(), coddest, pec)) if (!get_coddest(doc.clifor().tipo(), doc.clifor().codice(), coddest, pec))
return false; return false;
#else #else
const bool is_pa = true;
coddest = "WSUHKZ"; coddest = "WSUHKZ";
#endif #endif
@ -876,6 +893,8 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
const char* const paese = "IT"; const char* const paese = "IT";
TCausale caus = TCausale(doc.tipo().causale(), doc.anno()); TCausale caus = TCausale(doc.tipo().causale(), doc.anno());
_is_valuta_estera = !is_euro_value(doc.valuta());
// <DatiTrassmissione> // <DatiTrassmissione>
TPaf_record paf0100f("PAF0100F"); TPaf_record paf0100f("PAF0100F");
paf0100f.set("P1_KEYHEADERFATT", _hfatt); paf0100f.set("P1_KEYHEADERFATT", _hfatt);
@ -1032,7 +1051,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
paf0700f.set("P7_KEYBODYFATT", _bfatt); paf0700f.set("P7_KEYBODYFATT", _bfatt);
remove(paf0700f); remove(paf0700f);
paf0700f.set("P7_TIPODOC", tipo_doc_sdi(doc)); paf0700f.set("P7_TIPODOC", tipo_doc_sdi(doc));
paf0700f.set("P7_DIVISA", "EUR"); // Aggiungere codice ISO 4217 a tabella divise (%VAL) paf0700f.set("P7_DIVISA", doc.valuta());
paf0700f.set("P7_DATA", doc.data()); paf0700f.set("P7_DATA", doc.data());
const TCodice_numerazione& codnum = doc.codice_numerazione(); const TCodice_numerazione& codnum = doc.codice_numerazione();
@ -1042,7 +1061,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
paf0700f.set("P7_GESTIONE", "D"); paf0700f.set("P7_GESTIONE", "D");
// <DatiBollo> // <DatiBollo>
paf0700f.set("P7_IMPORTOBOLLO", doc.get("BOLLI")); paf0700f.set("P7_IMPORTOBOLLO", converti_prezzo(doc.get_real("BOLLI")));
// </DatiBollo> // </DatiBollo>
// <DatiCassaPrevidenziale> // <DatiCassaPrevidenziale>
@ -1090,7 +1109,10 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
paf2700f.set("PQ_KEYHEADERFATT", _hfatt); paf2700f.set("PQ_KEYHEADERFATT", _hfatt);
paf2700f.set("PQ_KEYBODYFATT", _bfatt); paf2700f.set("PQ_KEYBODYFATT", _bfatt);
remove(paf2700f); remove(paf2700f);
paf2700f.set("PQ_IMPTOTDOC", doc.totale_doc());
// Disabilitata la scrittura del totale del documento, questo causa problemi se è presente uno sconto in testata e l'addebito del bollo.
// Campo calcola prima il totale, poi lo sconta e ci applica il bollo mentre lo SDI sconta a bollo già applicato.
// paf2700f.set("PQ_IMPTOTDOC", doc.totale_doc());
const TRectype& cont_conv_off = cco(doc); const TRectype& cont_conv_off = cco(doc);
TString causale = cont_conv_off.get("S1"); TString causale = cont_conv_off.get("S1");
@ -1281,11 +1303,6 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
paf3000f.set("PT_RIFNUMLINEA", riga); paf3000f.set("PT_RIFNUMLINEA", riga);
paf3000f.set("PT_COMMENTO", descrizione(*rdoc)); paf3000f.set("PT_COMMENTO", descrizione(*rdoc));
// Nel dubbio preparo la riga di descrizione
paf1800f.set("PI_QUANTITA", UNO);
paf1800f.set("PI_PREZZOUNIT", ZERO);
paf1800f.set("PI_PRZTOTALE", ZERO);
// <CodiceArticolo> // <CodiceArticolo>
long riga_art = 0; long riga_art = 0;
TArticolo& art = rdoc->articolo(); TArticolo& art = rdoc->articolo();
@ -1306,165 +1323,175 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
} }
// </CodiceArticolo> // </CodiceArticolo>
if(rdoc->is_descrizione())
{
paf1800f.set("PI_QUANTITA", UNO);
paf1800f.set("PI_PREZZOUNIT", ZERO);
paf1800f.set("PI_PRZTOTALE", ZERO);
set_IVA(codivadefault, paf1800f); set_IVA(codivadefault, paf1800f);
}
else if (rdoc->is_merce())
{
paf1800f.set("PI_UNITAMISURA", rdoc->get(RDOC_UMQTA));
const real qta = rdoc->get(RDOC_QTA);
if (qta.is_zero())
{
TString msg;
msg.format("La riga merce %d ha quantità nulla", riga);
log(1, msg);
}
if (qta >= ZERO)
{
paf1800f.set("PI_QUANTITA", qta);
paf1800f.set("PI_PREZZOUNIT", converti_prezzo(rdoc->prezzo(false, false)));
}
else
{
paf1800f.set("PI_QUANTITA", -qta);
paf1800f.set("PI_PREZZOUNIT", converti_prezzo(-rdoc->prezzo(true, false)));
}
paf1800f.set("PI_PRZTOTALE", converti_prezzo(rdoc->importo(true, false)));
set_IVA(*rdoc, paf1800f);
if (rdoc->is_merce()) /*
{ const TDate data = doc.get(DOC_DATADOC);
paf1800f.set("PI_UNITAMISURA", rdoc->get(RDOC_UMQTA)); paf1800f.set("PI_DTINIZIOPER", data);
const real qta = rdoc->get(RDOC_QTA); paf1800f.set("PI_DTFINEPER", data);
if (qta.is_zero()) */
{
TString msg;
msg.format("La riga merce %d ha quantità nulla", riga);
log(1, msg);
}
if (qta >= ZERO)
{
paf1800f.set("PI_QUANTITA", qta);
paf1800f.set("PI_PREZZOUNIT", rdoc->prezzo(false, false));
}
else
{
paf1800f.set("PI_QUANTITA", -qta);
paf1800f.set("PI_PREZZOUNIT", -rdoc->prezzo(true, false));
}
paf1800f.set("PI_PRZTOTALE", rdoc->importo(true, false));
set_IVA(*rdoc, paf1800f);
/* // <ScontoMaggiorazione>
const TDate data = doc.get(DOC_DATADOC);
paf1800f.set("PI_DTINIZIOPER", data);
paf1800f.set("PI_DTFINEPER", data);
*/
// <ScontoMaggiorazione> sconto_expr = rdoc->get(RDOC_SCONTO);
if (parse_sconto(sconto_expr, sconti))
sconto_expr = rdoc->get(RDOC_SCONTO); {
if (parse_sconto(sconto_expr, sconti)) long nlin_sconto = 0;
{ FOR_EACH_TOKEN(sconti, str)
long nlin_sconto = 0; {
FOR_EACH_TOKEN(sconti, str) const real perc = str;
{ if (!perc.is_zero())
const real perc = str; {
if (!perc.is_zero()) paf2000f.set("PJ_KEYNLINEA", static_cast<long>(r));
{ paf2000f.set("PJ_KEYNLINAR", ++nlin_sconto);
paf2000f.set("PJ_KEYNLINEA", static_cast<long>(r)); if (perc > ZERO)
paf2000f.set("PJ_KEYNLINAR", ++nlin_sconto); {
if (perc > ZERO) paf2000f.set("PJ_TIPOSCONTO", "SC");
{ paf2000f.set("PJ_PERCSCONTO", perc);
paf2000f.set("PJ_TIPOSCONTO", "SC"); }
paf2000f.set("PJ_PERCSCONTO", perc); else
} {
else paf2000f.set("PJ_TIPOSCONTO", "MG");
{ paf2000f.set("PJ_PERCSCONTO", -perc);
paf2000f.set("PJ_TIPOSCONTO", "MG"); }
paf2000f.set("PJ_PERCSCONTO", -perc); paf2000f.set("PJ_GESTIONE", "D");
} ok &= insert(paf2000f);
paf2000f.set("PJ_GESTIONE", "D"); }
ok &= insert(paf2000f); }
} }
} // </ScontoMaggiorazione>
}
// </ScontoMaggiorazione>
/* /*
* Ogni riga si può rifare a un DDT/Ordine diverso, per questo devo inserire i dati da qua e non in testata * Ogni riga si può rifare a un DDT/Ordine diverso, per questo devo inserire i dati da qua e non in testata
*/ */
TArray ancestors; TArray ancestors;
find_ancestors(*rdoc, ancestors); find_ancestors(*rdoc, ancestors);
for (int i = ancestors.last(); i > 0; i = ancestors.pred(i)) for (int i = ancestors.last(); i > 0; i = ancestors.pred(i))
{ {
const TAncestor& a = (const TAncestor&)ancestors[i]; const TAncestor& a = (const TAncestor&)ancestors[i];
if (i == 1) if (i == 1)
{ {
// <DatiDDT> // <DatiDDT>
TPaf_record paf1600f("PAF1600F"); TPaf_record paf1600f("PAF1600F");
paf1600f.reset(); paf1600f.reset();
paf1600f.set("PF_KEYHEADERFATT", _hfatt); paf1600f.set("PF_KEYHEADERFATT", _hfatt);
paf1600f.set("PF_KEYBODYFATT", _bfatt); paf1600f.set("PF_KEYBODYFATT", _bfatt);
paf1600f.set("PF_RIFNUMLINEA", (long)r); paf1600f.set("PF_RIFNUMLINEA", (long)r);
paf1600f.set("PF_NUMDDDT", a._numdoc); paf1600f.set("PF_NUMDDDT", a._numdoc);
paf1600f.set("PF_DATADDT", a._datadoc); paf1600f.set("PF_DATADDT", a._datadoc);
paf1600f.set("PF_GESTIONE", "D"); paf1600f.set("PF_GESTIONE", "D");
ok &= insert(paf1600f); ok &= insert(paf1600f);
// </DatiDDT> // </DatiDDT>
} }
else if (i == 3) else if (i == 3)
{ {
// <DatiOrdineAcquisto> // <DatiOrdineAcquisto>
TPaf_record paf1000f("PAF1000F"); TPaf_record paf1000f("PAF1000F");
paf1000f.set("P0_KEYHEADERFATT", _hfatt); paf1000f.set("P0_KEYHEADERFATT", _hfatt);
paf1000f.set("P0_KEYBODYFATT", _bfatt); paf1000f.set("P0_KEYBODYFATT", _bfatt);
paf1000f.set("P0_RIFNUMLINEA", (long)r); paf1000f.set("P0_RIFNUMLINEA", (long)r);
paf1000f.set("P0_IDDOC", a._numdoc); paf1000f.set("P0_IDDOC", a._numdoc);
paf1000f.set("P0_DATADOC", a._datadoc); paf1000f.set("P0_DATADOC", a._datadoc);
paf1000f.set("P0_COMMCONVENZ", com); paf1000f.set("P0_COMMCONVENZ", com);
paf1000f.set("P0_CODCUP", cup); paf1000f.set("P0_CODCUP", cup);
paf1000f.set("P0_CODCIG", cig); paf1000f.set("P0_CODCIG", cig);
paf1000f.set("P0_GESTIONE", "D"); paf1000f.set("P0_GESTIONE", "D");
ok &= insert(paf1000f); ok &= insert(paf1000f);
// </DatiOrdineAcquisto> // </DatiOrdineAcquisto>
} }
} }
} }
else if (rdoc->is_spese()) else if (rdoc->is_spese())
{ {
const TSpesa_prest& sp = rdoc->spesa(); const TSpesa_prest& sp = rdoc->spesa();
const real imp = rdoc->importo(true, false); const real imp = rdoc->importo(true, false);
real qta = UNO; real qta = UNO;
if (sp.is_tipo()) if (sp.is_tipo())
{ {
paf1800f.set("PI_UNITAMISURA", rdoc->get(RDOC_UMQTA)); paf1800f.set("PI_UNITAMISURA", rdoc->get(RDOC_UMQTA));
qta = rdoc->get_real(RDOC_QTA); qta = rdoc->get_real(RDOC_QTA);
if (qta.is_zero()) if (qta.is_zero())
{ {
TString msg; TString msg;
msg.format("La riga spese a quantità %d ha quantità nulla (campo %s)", riga, static_cast<const char*>(rdoc->field_qta())); msg.format("La riga spese a quantità %d ha quantità nulla (campo %s)", riga, static_cast<const char*>(rdoc->field_qta()));
log(1, msg); log(1, msg);
qta = UNO; qta = UNO;
} }
paf1800f.set("PI_QUANTITA", qta); paf1800f.set("PI_QUANTITA", qta);
} }
real prz = imp; real prz = imp;
if (qta != UNO) if (qta != UNO)
{ {
prz = rdoc->prezzo(true, false); prz = rdoc->prezzo(true, false);
if (prz.is_zero() && !imp.is_zero()) if (prz.is_zero() && !imp.is_zero())
{ {
const TPrice price(imp / qta); const TPrice price(imp / qta);
prz = price.get_value(); prz = price.get_value();
} }
} }
paf1800f.set("PI_PREZZOUNIT", prz); paf1800f.set("PI_PREZZOUNIT", converti_prezzo(prz));
paf1800f.set("PI_PRZTOTALE", imp); paf1800f.set("PI_PRZTOTALE", converti_prezzo(imp));
set_IVA(*rdoc, paf1800f); set_IVA(*rdoc, paf1800f);
// Controllo se è una ritenuta fiscale // Controllo se è una ritenuta fiscale
// <DatiRitenuta> // <DatiRitenuta>
if (sp.tipo_ritenuta() == 'F') if (sp.tipo_ritenuta() == 'F')
{ {
paf0700f.set("P7_TIPORITENUTA", cliente.fisica() ? "RT01" : "RT02"); paf0700f.set("P7_TIPORITENUTA", cliente.fisica() ? "RT01" : "RT02");
paf0700f.set("P7_IMPORTORIT", doc.imponibile() * sp.perc() / CENTO); paf0700f.set("P7_IMPORTORIT", converti_prezzo(doc.imponibile() * sp.perc() / CENTO));
paf0700f.set("P7_ALIQUOTARIT", TCodiceIVA(sp.cod_iva()).percentuale()); paf0700f.set("P7_ALIQUOTARIT", TCodiceIVA(sp.cod_iva()).percentuale());
paf0700f.set("P7_CAUSPAGAM", cache().get("CA7", to_tstring(sp.caus_770()), "S2")); paf0700f.set("P7_CAUSPAGAM", cache().get("CA7", to_tstring(sp.caus_770()), "S2"));
} }
// </DatiRitenuta> // </DatiRitenuta>
} }
else if (rdoc->is_prestazione()) else if (rdoc->is_prestazione())
{ {
paf1800f.set("PI_UNITAMISURA", rdoc->get(RDOC_UMQTA)); paf1800f.set("PI_UNITAMISURA", rdoc->get(RDOC_UMQTA));
real qta = rdoc->get(RDOC_QTA); real qta = rdoc->get(RDOC_QTA);
if (qta.is_zero()) qta = UNO; if (qta.is_zero()) qta = UNO;
paf1800f.set("PI_QUANTITA", qta); paf1800f.set("PI_QUANTITA", qta);
paf1800f.set("PI_PREZZOUNIT", rdoc->prezzo(false, false)); paf1800f.set("PI_PREZZOUNIT", converti_prezzo(rdoc->prezzo(false, false)));
paf1800f.set("PI_PRZTOTALE", rdoc->importo(true, false)); paf1800f.set("PI_PRZTOTALE", converti_prezzo(rdoc->importo(true, false)));
set_IVA(*rdoc, paf1800f); set_IVA(*rdoc, paf1800f);
} }
else
{
// Salto tutte le altre righe
continue;
}
paf1800f.set("PI_GESTIONE", "D"); paf1800f.set("PI_GESTIONE", "D");
ok &= insert(paf1800f) && insert(paf3000f); ok &= insert(paf1800f) && insert(paf3000f);
} }
// Controllo plafond // Controllo plafond
@ -1510,8 +1537,8 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
paf3000f.set("PT_COMMENTO", "Imposta bollo assolta in modo virtuale"); paf3000f.set("PT_COMMENTO", "Imposta bollo assolta in modo virtuale");
paf1800f.set("PI_QUANTITA", UNO); paf1800f.set("PI_QUANTITA", UNO);
paf1800f.set("PI_PREZZOUNIT", doc.get_real("BOLLI")); paf1800f.set("PI_PREZZOUNIT", converti_prezzo(doc.get_real("BOLLI")));
paf1800f.set("PI_PRZTOTALE", doc.get_real("BOLLI")); paf1800f.set("PI_PRZTOTALE", converti_prezzo(doc.get_real("BOLLI")));
set_IVA(doc.codiva_bolli(), paf1800f); set_IVA(doc.codiva_bolli(), paf1800f);
ok &= insert(paf1800f) && insert(paf3000f); ok &= insert(paf1800f) && insert(paf3000f);
} }
@ -1534,8 +1561,8 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
paf1800f.set("PI_QUANTITA", UNO); paf1800f.set("PI_QUANTITA", UNO);
real imponibile = doc.imponibile(); real imponibile = doc.imponibile();
paf1800f.set("PI_PREZZOUNIT", doc.spese_incasso(imponibile, 6, _netto)); paf1800f.set("PI_PREZZOUNIT", converti_prezzo(doc.spese_incasso(imponibile, 6, _netto)));
paf1800f.set("PI_PRZTOTALE", doc.spese_incasso(imponibile, 6, _netto)); paf1800f.set("PI_PRZTOTALE", converti_prezzo(doc.spese_incasso(imponibile, 6, _netto)));
set_IVA(doc.codiva_spese(), paf1800f); set_IVA(doc.codiva_spese(), paf1800f);
ok &= insert(paf1800f) && insert(paf3000f); ok &= insert(paf1800f) && insert(paf3000f);
@ -1583,21 +1610,25 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
TAssoc_array& tiva = doc.tabella_iva(false); TAssoc_array& tiva = doc.tabella_iva(false);
FOR_EACH_ASSOC_OBJECT(tiva, obj, key, itm) FOR_EACH_ASSOC_OBJECT(tiva, obj, key, itm)
{ {
const TRiepilogo_iva& riva = *(const TRiepilogo_iva*)itm; const TRiepilogo_iva& riva = *(const TRiepilogo_iva*)itm;
const real aliquota = riva.cod_iva().percentuale(); const real aliquota = riva.cod_iva().percentuale();
paf2200f.set("PL_ALIQUOTAIVA", aliquota); paf2200f.set("PL_ALIQUOTAIVA", aliquota);
if (aliquota.is_zero()) if (aliquota.is_zero())
paf2200f.set("PL_NATURA", natura(riva.cod_iva().codice())); paf2200f.set("PL_NATURA", natura(riva.cod_iva().codice()));
paf2200f.set("PL_IMPONIBILE", riva.imponibile()); real imponibile = riva.imp_orig();
paf2200f.set("PL_IMPOSTA", riva.imposta()); if (imponibile <= ZERO)
paf2200f.set("PL_ESIGIVA", eiva); imponibile = riva.imponibile();
if (*eiva == 'S')
paf2200f.set("PL_RIFNORMATIVO", "Scissione pagamenti art.17-ter DPR 633/72"); paf2200f.set("PL_IMPONIBILE", converti_prezzo(imponibile));
else paf2200f.set("PL_IMPOSTA", converti_prezzo(riva.imposta()));
paf2200f.set("PL_RIFNORMATIVO", riva.cod_iva().descrizione()); paf2200f.set("PL_ESIGIVA", eiva);
paf2200f.set("PL_GESTIONE", "D"); if (*eiva == 'S')
ok &= insert(paf2200f); paf2200f.set("PL_RIFNORMATIVO", "Scissione pagamenti art.17-ter DPR 633/72");
else
paf2200f.set("PL_RIFNORMATIVO", riva.cod_iva().descrizione());
paf2200f.set("PL_GESTIONE", "D");
ok &= insert(paf2200f);
} }
// </DatiRiepilogo> // </DatiRiepilogo>
@ -1658,7 +1689,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
TToken_string& riga = scad.row(nr); // Data|Importo TToken_string& riga = scad.row(nr); // Data|Importo
paf2500f.set("PO_DATASCADENZA", TDate(riga.get(0))); // Data scadenza paf2500f.set("PO_DATASCADENZA", TDate(riga.get(0))); // Data scadenza
paf2500f.set("PO_IMPORTO", real(riga.get())); // Importo rata paf2500f.set("PO_IMPORTO", converti_prezzo(real(riga.get()))); // Importo rata
paf2500f.set("PO_GESTIONE", "D"); paf2500f.set("PO_GESTIONE", "D");
ok &= insert(paf2500f); ok &= insert(paf2500f);

View File

@ -77,7 +77,7 @@ public:
class TDoc_fp class TDoc_fp
{ {
private: private:
TRectype *_doc_rec; TRectype* _doc_rec;
TAnagrafica _ditta; TAnagrafica _ditta;
TString16 _cofi; TString16 _cofi;
TFilename _dbname; TFilename _dbname;
@ -92,6 +92,7 @@ private:
vector<TString> _query; vector<TString> _query;
TString8 _hfatt; // Codice univoco di 6 caratteri dell'ufficio P.A. o di 7 caratteri per un privato TString8 _hfatt; // Codice univoco di 6 caratteri dell'ufficio P.A. o di 7 caratteri per un privato
TString20 _bfatt; // Codice univoco di 20 caratteri del documento TString20 _bfatt; // Codice univoco di 20 caratteri del documento
bool _is_valuta_estera; // Se il documento è in valuta estera
int parse_line(const TString& line, TString& var, TString& val) const; int parse_line(const TString& line, TString& var, TString& val) const;
bool create_table(TScanner& paf, const TString& table); bool create_table(TScanner& paf, const TString& table);
@ -116,7 +117,7 @@ protected:
static void set_IVA(const TRiga_documento& rdoc, TPaf_record& paf); static void set_IVA(const TRiga_documento& rdoc, TPaf_record& paf);
bool add_row_art(const TString codice_tipo, const TString& codice_valore, TPaf_record& paf); bool add_row_art(const TString codice_tipo, const TString& codice_valore, TPaf_record& paf);
bool add_row_alleg(TFilename& file, long& nprogr, TPaf_record& paf); bool add_row_alleg(TFilename& file, long& nprogr, TPaf_record& paf);
void set_descrizione(const TRiga_documento* doc); const TString& converti_prezzo(const real& prezzo) const;
public: public:
bool doc_to_paf(TDocumentoEsteso& doc); bool doc_to_paf(TDocumentoEsteso& doc);