Patch level : 12.0 nopatch

Files correlati     :
Commento        :

Implementazione invio regolarizzazioni al 07/11/2021
This commit is contained in:
smen 2021-11-08 17:43:12 +01:00
parent 4405d1fb25
commit 5e3ae2faaa
14 changed files with 924 additions and 759 deletions

View File

@ -363,7 +363,7 @@ const char* get_ini_codcaus()
return ini_get_string(FILE_CONFIG, FILE_SECTION, F1_CAUS);
}
const char* get_codcaus(const char * tipodoc, const char* codcf)
const char* get_codcaus(const char * tipodoc, const long codcf)
{
TLocalisamfile cfven(LF_CFVEN);
cfven.put(CFV_TIPOCF, "F");

View File

@ -137,7 +137,7 @@ public:
TFppro& fppro_db();
const char* get_ini_codcaus();
const char* get_codcaus(const char * tipodoc, const char* codcf);
const char* get_codcaus(const char * tipodoc, const long codcf);
bool get_endatareg();
TString get_datainireg();
TString get_dataendreg();

View File

@ -114,7 +114,7 @@ bool TEstrazione::check_documento_vendita(const TLocalisamfile& mov, _Out_ bool&
const TDocumento doc(mov.get(MOV_DPROVV)[0], mov.get_int(MOV_DANNO), mov.get(MOV_DCODNUM), mov.get_int(MOV_DNDOC));
exist_doc = true;
if (chiave_paf(doc, hfatt, bfatt))
if (chiave_paf_doc(doc, hfatt, bfatt))
{
query << "SELECT * FROM PAF0100F WHERE P1_KEYHEADERFATT = '" << hfatt << "' AND P1_KEYBODYFATT = '" << bfatt << "';";
fp_db().sq_set_exec(query);

View File

@ -174,7 +174,7 @@ void TPAR_mask::fill()
TString rif = get_dest_sdi(rec.get_string(CFV_TIPOCF)[0], rec.get_long(CFV_CODCF), EMPTY_STRING);
// Se è ancora vuoto potrebbe essere estero
if(rif.empty())
if (rif.empty())
{
// Segno la riga errata
if (first)
@ -275,7 +275,7 @@ void TPAR_mask::connect_keys()
{
// Come prima cosa controllo che effettivamente la chiave di questo doc sia in giro per il mondo
query.cut(0) << "SELECT * FROM PAF0100F WHERE P1_KEYHEADERFATT = '" << campo_hfatt << "' AND P1_KEYBODYFATT = '" << campo_bfatt << "'";
if(fp_db().sq_set_exec(query))
if (fp_db().sq_set_exec(query))
{
msg_log.cut(0) << "Il documento " << campo_bfatt << " è già presente nel DB, verrà saltato";
legno.log(9000, msg_log);
@ -315,7 +315,7 @@ void TPAR_mask::connect_keys()
}
}
if(!found)
if (!found)
{
msg_log.cut(0) << "Il documento " << campo_bfatt << " non è presente nel DB PAF, verrà saltato";
legno.log(9000, msg_log);
@ -347,7 +347,7 @@ void TPAR_mask::connect_keys()
"UPDATE PAF3200F SET PU_KEYHEADERFATT = '" << campo_hfatt << "', PU_KEYBODYFATT = '" << campo_bfatt << "' WHERE PU_KEYPRGINVIO = '" << db_prginv << "' AND PU_KEYHEADERFATT = '" << db_hfatt << "' AND PU_KEYBODYFATT = '" << db_bfatt << "'\n" <<
"UPDATE PAFW300F SET PW_KEYHEADERFATT = '" << campo_hfatt << "', PW_KEYBODYFATT = '" << campo_bfatt << "' WHERE PW_KEYPRGINVIO = '" << db_prginv << "' AND PW_KEYHEADERFATT = '" << db_hfatt << "' AND PW_KEYBODYFATT = '" << db_bfatt << "'\n";
if(fp_db().sq_set_exec(query))
if (fp_db().sq_set_exec(query))
{
msg_log.cut(0) << "Il documento " << campo_bfatt << " e' stato aggiornato correttamente\nChiave precedente: " << db_bfatt << " chiave nuova: " << campo_bfatt;
legno.log(0, msg_log);
@ -489,7 +489,7 @@ bool TPAR_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
break;
default: break;
}
if((e == fe_modify || e >= se_enter) && jolly == 0)
if ((e == fe_modify || e >= se_enter) && jolly == 0)
{
if (o.dlg() >= START_MASK && o.dlg() <= END_MASK)
{
@ -511,7 +511,7 @@ void TPAR_mask::next_page(int p)
_filter_changed = false;
}
}
if(ok)
if (ok)
TAutomask::next_page(p);
}
@ -625,7 +625,7 @@ void TPAR_mask::set_err_paf()
"UPDATE PAF3200F SET PU_GESTIONE = 'E', PU_KEYPRGINVIO = 'DELETED' WHERE PU_KEYHEADERFATT = '" << hfatt << "' AND PU_KEYBODYFATT = '" << bfatt << "';\n" <<
// PAFW3 non ha il flag di gestione
"UPDATE PAFW300F SET PW_KEYPRGINVIO = 'DELETED' WHERE PW_KEYHEADERFATT = '" << hfatt << "' AND PW_KEYBODYFATT = '" << bfatt << "';\n";
if(!fp_db().sq_set_exec(query))
if (!fp_db().sq_set_exec(query))
{
TString err = "Impossibile salvare la regolarizzazione "; err << nreg << "\nVerrà saltata.";
error_box(err);

View File

@ -58,7 +58,7 @@ DATE F_DATAEND
BEGIN
PROMPT 50 1 "Data finale "
VALIDATE DATE_CMP_FUNC >= F_DATAINI
WARNING "La data finale non può essere minore della data iniziale"
WARNING "La data finale non pu essere minore della data iniziale"
CHECKTYPE REQUIRED
END

View File

@ -14,14 +14,14 @@
#include <map>
#define SQL_FLD "sql/"
#define MANCATA_SEND "S" // Se la mail di mancata consegna è già stata inviata P1_ERRINT è segnato con "S"
#define MANCATA_SEND "S" // Se la mail di mancata consegna gi stata inviata P1_ERRINT segnato con "S"
// Typedef per aiutare a capire cosa sono le chiavi
typedef TString MCodice_riga;
typedef TString MTipo_documento;
class TDoc_fp;
enum { no_pdf = -1, pdf_ok = 0, no_alleg = -2};
enum { no_pdf = -1, pdf_ok = 0, no_alleg = -2 };
bool set_connection(SSimple_query& s);
// Ritorna la connessione al DB paf secondo i parametri impostati nel programma di configurazione
@ -283,7 +283,9 @@ public:
TFp_mail_sender() { _error = -1; }
TFp_mail_sender(const int anno, const long ndoc, const TFixed_string& codnum, const TFixed_string& tipodoc, const long codcf, TString mail, bool accord, TString ragsoc, bool sent)
{ set_doc(anno, ndoc, codnum, tipodoc, codcf, mail, accord, ragsoc, sent); }
{
set_doc(anno, ndoc, codnum, tipodoc, codcf, mail, accord, ragsoc, sent);
}
};
class TFPRiga_documento : public TRiga_documento
@ -317,7 +319,7 @@ public:
inline bool operator==(const TFPBuono_di_consegna& l, const TFPBuono_di_consegna& r)
{
TToken_string appo(l._numdoc, '/');
if(appo.items() == 3)
if (appo.items() == 3)
return TString(appo.get(2)) == r._numdoc && l._datadoc == r._datadoc;
return l._numdoc == r._numdoc && l._datadoc == r._datadoc;
}
@ -353,7 +355,7 @@ struct TFP_adg
: _tipo_dato(tipo_dato),
_riferimento_testo(riferimento_testo),
_riferimento_numero(riferimento_numero),
_riferimento_data(riferimento_data){}
_riferimento_data(riferimento_data) {}
};
/**<
@ -415,14 +417,14 @@ public:
inline TFP_custom_cache& cached_custom_fp()
{
static std::shared_ptr<TFP_custom_cache> carmelo;
if(carmelo == nullptr)
if (carmelo == nullptr)
{
carmelo.reset(new TFP_custom_cache);
}
return *carmelo;
}
class TFP_expression : public TObject // ma perchè non derivano da expre documento cazzone ? se sono più espressioni prima si separa la token string
class TFP_expression : public TObject // ma perch non derivano da expre documento cazzone ? se sono pi espressioni prima si separa la token string
{
enum TFP_operator { error, eq, neq, gt, ls, gteq, lseq, and, or };
@ -504,7 +506,7 @@ private:
struct
{
bool _is_valuta_estera{ false }; // Se il documento è in valuta estera
bool _is_valuta_estera{ false }; // Se il documento in valuta estera
TString4 _cod_val;
real _cambio;
} _doc_cambio;
@ -523,7 +525,7 @@ private:
protected:
/**< Funzioni di controllo */
/**< Controlli di testata, non è const per il calcolo della codizione di pagamento */
/**< Controlli di testata, non const per il calcolo della codizione di pagamento */
bool check_initial(TDocumentoEsteso& doc);
/**< Controllo di riga */
bool check_row(const TRiga_documento& rdoc);

View File

@ -77,7 +77,7 @@ string getline(ifstream& f)
bool check_tables()
{
/*
* Da questo programma in poi verrà utilizzato un sistema diverso per la creazione e aggiornamento delle tabelle
* Da questo programma in poi verr utilizzato un sistema diverso per la creazione e aggiornamento delle tabelle
* Verranno utilizzati dei file.sql aggiornati con il numero di patch, leggermente scomodo durante la creazione ma facile per i controlli successivamente
*/
SLIST files = xvt_fsys_list_files(".sql", "sql/fp0/", false);
@ -88,7 +88,7 @@ bool check_tables()
TString version;
if (tabmod.read() == NOERR)
version = tabmod.get("S0");
for(SLIST_ELT file = xvt_slist_get_first(files); file; file = xvt_slist_get_next(files, file))
for (SLIST_ELT file = xvt_slist_get_first(files); file; file = xvt_slist_get_next(files, file))
{
TString file_version = TFilename(file->str).name_only();
file_version = file_version.mid(2, 4);
@ -96,10 +96,10 @@ bool check_tables()
if (file_version <= version)
continue;
ifstream f(file->str);
if(f.is_open())
if (f.is_open())
{
string s;
while(!f.eof())
while (!f.eof())
{
static string r;
r = getline(f);
@ -108,11 +108,11 @@ bool check_tables()
s += r + '\n';
// Cerco un ;
const int limiter = s.find(';') + 1;
if(limiter > 0)
if (limiter > 0)
{
string query = s.substr(0, limiter);
s.erase(0, limiter);
if(!fp_db().sq_set_exec(query, false) || !fp_db().sq_commit())
if (!fp_db().sq_set_exec(query, false) || !fp_db().sq_commit())
{
fatal_box("Impossibile eseguire/salvare la query:\n%s\n%s", query.c_str(), fp_db().sq_get_text_error(false));
}
@ -130,7 +130,7 @@ bool check_tables()
tabmod.put("COD", "SQL");
tabmod.put("CODTAB", "VERSION");
tabmod.put("S0", file_version);
if(tabmod.rewrite_write() != NOERR && !yesno_box("Attenzione! Errore di aggiornamento versione di Database in Campo, continuare? %s", file_version))
if (tabmod.rewrite_write() != NOERR && !yesno_box("Attenzione! Errore di aggiornamento versione di Database in Campo, continuare? %s", file_version))
{
return false;
}
@ -144,7 +144,7 @@ TString& complete_num_fp(const TCodice_numerazione& codnum, const int numdoc)
const TString& prefisso = codnum.prefisso();
const TString& postfisso = codnum.postfisso();
static TString ndoc; ndoc.cut(0) << numdoc;
if(prefisso.full() || postfisso.full())
if (prefisso.full() || postfisso.full())
{
for (; ndoc.len() < len_num_doc;)
ndoc.add_front("0");
@ -215,7 +215,7 @@ bool get_coddest(const char tipocf, const long codcf, TString& coddest, TString&
const TCli_for clifo(tipocf, codcf);
pec = clifo.get("PEC");
if(!cod_ind_sped.empty())
if (!cod_ind_sped.empty())
{
TLocalisamfile indsp(LF_INDSP);
indsp.put(IND_TIPOCF, tipocf);
@ -224,7 +224,7 @@ bool get_coddest(const char tipocf, const long codcf, TString& coddest, TString&
indsp.read();
coddest = indsp.get(IND_PADESTIN);
}
if(coddest.empty())
if (coddest.empty())
coddest = clifo.vendite().get("PADESTIN");
const TAnagrafica anag(LF_CLIFO, tipocf, codcf);
@ -232,7 +232,7 @@ bool get_coddest(const char tipocf, const long codcf, TString& coddest, TString&
{
if (pec.full() || get_esp_pri_empty())
coddest = "0000000";
// Controllo se è straniero
// Controllo se straniero
else if (anag.estero() && anag.stato_partita_IVA() != "IT")
{
coddest = get_esp_est() ? get_esp_est_cod() : "";
@ -248,7 +248,7 @@ inline const TString& no_special(char a)
{
TString& r = get_tmp_string().cut(0);
if(a != '\'')
if (a != '\'')
{
r << a;
}
@ -299,7 +299,7 @@ TString& add_filter(const TString& field, const TString& from, const TString& to
/***************************************************************************
* TPaf_record
***************************************************************************/
// Imposta il valore di un campo variant
// Imposta il valore di un campo variant
void TPaf_record::set(const char* fld, const TVariant& var)
{
CHECK(fld && *fld, "Null field name");
@ -340,7 +340,7 @@ void TPaf_record::set(const char* fld, const char* val)
void TPaf_record::set(const char* fld, const TString& val)
{
const TVariant var(val);
if(!var.is_string() || (val.full()))
if (!var.is_string() || (val.full()))
set(fld, var);
}
@ -403,7 +403,7 @@ const TString& TPaf_record::var2str(const TString& fldname, const TVariant& var)
if (apici && str[0] != '0' && real::is_natural(str))
apici = false;
// Parso i caratteri speciali
for(int i = 0; i < str.len(); i++)
for (int i = 0; i < str.len(); i++)
{
tmp << no_special(str[i]);
}
@ -694,7 +694,7 @@ TAncestor::TAncestor(const TRectype& rdoc)
***************************************************************************/
bool TFPBuono_di_consegna::already_exist(map<TString20, TDate>& ancestors_s) const
{
for(auto it = ancestors_s.begin(); it != ancestors_s.end(); ++it)
for (auto it = ancestors_s.begin(); it != ancestors_s.end(); ++it)
{
TFPBuono_di_consegna b(it->first, it->second);
if (b == *this)
@ -751,11 +751,11 @@ bool TDoc_fp::get_bnp_iban(const TString& abi, const TString& cab, int nprog, TS
bool TDoc_fp::get_bank(TDocumento& doc, TString& iban, TString& abi, TString& cab, TString& istituto) const
{
bool found = false;
if(doc.pagamento().tipo_rata(0) == TTipo_pag::_bonfico)
if (doc.pagamento().tipo_rata(0) == TTipo_pag::_bonfico)
{
found = get_bank_presentazione(doc, iban, abi, cab, istituto);
}
else if(doc.pagamento().tipo_rata(0) == TTipo_pag::_ric_ban || doc.pagamento().tipo_rata(0) == TTipo_pag::_rid)
else if (doc.pagamento().tipo_rata(0) == TTipo_pag::_ric_ban || doc.pagamento().tipo_rata(0) == TTipo_pag::_rid)
{
found = get_bank_appoggio(doc, iban, abi, cab, istituto);
}
@ -788,7 +788,7 @@ bool TDoc_fp::get_bank_presentazione(const TDocumento& doc, TString& iban, TStri
get_bnp_iban(abi, cab, -1, iban);
}
}
if(!found) // Se non trovo banca su CFBAN la cerco su CFVEN
if (!found) // Se non trovo banca su CFBAN la cerco su CFVEN
{
const TRectype& cfven = doc.clifor().vendite();
abi = cfven.get(CFV_CODABIPR);
@ -810,7 +810,7 @@ bool TDoc_fp::get_bank_appoggio(const TDocumento& doc, TString& iban, TString& a
bool found = abi.full() && cab.full();
if (found)
istituto = cache().get("%BAN", abi, "S0");
if(iban.empty())
if (iban.empty())
{
TToken_string key;
key.add("C");
@ -839,10 +839,10 @@ const TString& TDoc_fp::descrizione(const TRiga_documento& rdoc)
tmp.replace('\n', ' ');
tmp.strip_double_spaces();
tmp.trim();
if(tmp.len() > 900)
if (tmp.len() > 900)
{
TString err;
err << "Il documento " << rdoc.doc().anno() << " " << rdoc.doc().codice_numerazione().codice() << " " << rdoc.doc().numero() << " ha la riga numero " << rdoc.numero() << " più lunga di quanto supportato dal formato dell'agenzia delle entrate, verrà troncata a 900 caratteri";
err << "Il documento " << rdoc.doc().anno() << " " << rdoc.doc().codice_numerazione().codice() << " " << rdoc.doc().numero() << " ha la riga numero " << rdoc.numero() << " pi lunga di quanto supportato dal formato dell'agenzia delle entrate, verr troncata a 900 caratteri";
log(1, err);
}
return tmp.left(900);
@ -894,7 +894,7 @@ int TDoc_fp::find_ancestors(const TRiga_documento& rdoc, TArray& ancestors) cons
bool TDoc_fp::insert(TPaf_record& p)
{
bool ok;
if(_cache_insert)
if (_cache_insert)
{
_query.push_back(p.insert_string());
ok = true;
@ -966,7 +966,7 @@ bool TDoc_fp::check_initial(TDocumentoEsteso& doc)
}
TPagamento& pag = doc.pagamento();
if(pag.cond_pag_sdi().empty())
if (pag.cond_pag_sdi().empty())
{
msg.cut(0) << "Non e' valorizzata la condizione di pagamento SDI (TP01, TP02, TP03) per la condizione di pagamento " << pag.code();
log(1, msg);
@ -978,7 +978,7 @@ bool TDoc_fp::check_initial(TDocumentoEsteso& doc)
{
const int rp = nr < pag.n_rate() ? nr : 0;
static TString key_class; key_class.cut(0) << pag.tipo_rata(rp) << pag.ulc_rata(rp);
if(cache().get("%CLR", key_class, "S12").empty())
if (cache().get("%CLR", key_class, "S12").empty())
{
msg.cut(0) << "Non e' valorizzata la tipologia di pagamento SDI (MPXX) per la condizione di pagamento " << pag.code();
log(1, msg);
@ -991,10 +991,10 @@ bool TDoc_fp::check_row(const TRiga_documento& rdoc)
{
bool ok = false;
static TString msg;
if(rdoc.is_spese())
if (rdoc.is_spese())
{
const TSpesa_prest& spesa = rdoc.spesa();
if(spesa.is_percentuale() && spesa.perc().is_zero())
if (spesa.is_percentuale() && spesa.perc().is_zero())
{
msg.cut(0) << "E' corretto che per la spesa " << spesa.codice() << " la percentuale sia zero?";
log(1, msg);
@ -1013,7 +1013,7 @@ bool TDoc_fp::check_riepilogo(const TDocumentoEsteso& doc, const TRiepilogo_iva&
{
bool ok = true;
static TString msg;
if(*get_esigibilita_iva(doc) == 'S' && natura(riva.cod_iva().codice()) == "N6")
if (*get_esigibilita_iva(doc) == 'S' && natura(riva.cod_iva().codice()) == "N6")
{
msg.cut(0) << "Impossibile avere un documento con scissione dei pagamenti e natura iva N6, codice: " << riva.cod_iva().codice();
log(1, msg);
@ -1039,7 +1039,7 @@ bool TDoc_fp::initialize(TDocumentoEsteso& doc)
return false;
// Preparo il log
log(-1, _bfatt);
// Controllo se il documento è almeno in stato di stampa
// Controllo se il documento almeno in stato di stampa
if (doc.stato() < doc.tipo().stato_finale_stampa())
{
log(3, "Il documento non e' stato ancora stampato, verra' saltato");
@ -1067,7 +1067,7 @@ bool TDoc_fp::initialize(TDocumentoEsteso& doc)
_idx_cassa_previdenziale = 1;
// Controllo custom
_has_cust = cached_custom_fp().has_custom(doc);
if(check_initial(doc) || get_check_not_block())
if (check_initial(doc) || get_check_not_block())
{
return _paf_container.clean_and_erase_paf(_hfatt, _bfatt);
}
@ -1085,15 +1085,15 @@ const TRectype& TDoc_fp::cco(const TRectype& doc) const
}
static TLocalisamfile tabmod(LF_TABMOD);
// Controllo se non sono già sul record, così evito read inutili
// Lo sto facendo a mano perchè usare cache() metterebbe FP nella colonna "MOD"
// Controllo se non sono gi sul record, cos evito read inutili
// Lo sto facendo a mano perch usare cache() metterebbe FP nella colonna "MOD"
if (tabmod.get("MOD") != "PA" || tabmod.get("COD") != "CON" || tabmod.get("CODTAB") != conkey)
{
tabmod.zero();
tabmod.put("MOD", "PA");
tabmod.put("COD", "CON");
tabmod.put("CODTAB", conkey);
if(tabmod.read() != NOERR)
if (tabmod.read() != NOERR)
tabmod.zero();
}
return tabmod.curr();
@ -1123,7 +1123,7 @@ void TDoc_fp::log(int severity, const char* msg)
_log->log(severity, txt);
// Scrivo anche su file
std::filebuf fb;
fb.open("fp_err.log", std::ios::out|std::ios::app);
fb.open("fp_err.log", std::ios::out | std::ios::app);
std::ostream os(&fb);
os << txt << std::endl;
fb.close();
@ -1162,7 +1162,7 @@ int TDoc_fp::commit()
{
log(2, "Le fatture sono state esportate in stato diagnosticato");
}
if(r >= 0 && fp_db().sq_commit())
if (r >= 0 && fp_db().sq_commit())
{
r += 2;
}
@ -1193,7 +1193,7 @@ const TString & TDoc_fp::natura(const char* codiva) const
}
const char* TDoc_fp::get_esigibilita_iva(const TDocumentoEsteso& doc)
{
// Esigibilità IVA: Immediata, Differita, Split payment
// Esigibilit IVA: Immediata, Differita, Split payment
const char* eiva = "I";
if (doc.is_split_payment())
eiva = "S";
@ -1205,7 +1205,7 @@ void TDoc_fp::set_IVA(TString codiva, TPaf_record& paf) const
{
if (codiva.empty())
codiva = _codivadefault;
// É necessario il cast a real?
// necessario il cast a real?
paf.set("PI_ALIQUOTAIVA", static_cast<real>(cache().get("%IVA", codiva, "R0")));
paf.set("PI_NATURA", natura(codiva));
}
@ -1258,16 +1258,16 @@ const TString& TDoc_fp::converti_prezzo(const real& prezzo) const
}
void TDoc_fp::set_qta_prezzo(TPaf_record& paf1800f, TFPRiga_documento* rdoc) const
{
// Setto l'unità di misura
// Setto l'unit di misura
paf1800f.set("PI_UNITAMISURA", rdoc->get(RDOC_UMQTA));
const real qta = rdoc->quantita();
// Prendendo la stringa non ho problemi in scrittura della query, a volte accadono cose stupide
TString& qta_string = rdoc->quantita_string();
real prezzo_unit = rdoc->prezzo(_nascondi_sconti_righe_fatt, false);
real prezzo_tot = rdoc->imponibile(false);
if(qta < ZERO)
if (qta < ZERO)
{
// Metto la qualità senza il segno
// Metto la qualit senza il segno
qta_string = qta_string.mid(1);
// E i prezzi in negativo
prezzo_unit = -abs(prezzo_unit);
@ -1338,7 +1338,7 @@ bool TDoc_fp::add_riepilogo_iva(TPaf_record& paf2200f, const TCodiceIVA& cod_iva
paf2200f.set("PL_IMPONIBILE", converti_prezzo(imponibile + riepilogo_agg.imponibile));
// Imposta
paf2200f.set("PL_IMPOSTA", converti_prezzo(imposta + riepilogo_agg.imposta));
// Esigibilità IVA
// Esigibilit IVA
paf2200f.set("PL_ESIGIVA", eiva);
if (*eiva == 'S')
paf2200f.set("PL_RIFNORMATIVO", "Scissione pagamenti art.17-ter DPR 633/72");
@ -1369,7 +1369,7 @@ bool TDoc_fp::add_cassa_previdenziale(TRiga_documento& rdoc)
paf0800f.set("P8_IMPONCASSA", converti_prezzo(imponibile_doc));
// Aliquota applicata alla riga spesa
paf0800f.set("P8_ALIQIVA", rdoc.iva().percentuale());
if(sp.sogg_a_rit())
if (sp.sogg_a_rit())
paf0800f.set("P8_RITENUTA", "SI");
paf0800f.set("P8_NATURA", natura(rdoc.iva().codice()));
// Inserisco il tutto nei dati riepilogo
@ -1385,7 +1385,7 @@ bool TDoc_fp::export_info_articolo(TFPRiga_documento* rdoc, TPaf_record& paf1900
const TString& codartmag = rdoc->get(RDOC_CODARTMAG);
const TString& codart = rdoc->get(RDOC_CODART);
long riga_art = 0;
if(_has_cust)
if (_has_cust)
{
cached_custom_fp().get_custom(rdoc->doc()).load_articolo_paf(paf1900f, *rdoc, riga_xml, *this);
}
@ -1399,7 +1399,7 @@ bool TDoc_fp::export_info_articolo(TFPRiga_documento* rdoc, TPaf_record& paf1900
paf1900f.set("PY_KEYNLINEA", riga_xml);
ok &= add_row_art(riga_art, "Codice articolo interno", codartmag, paf1900f);
}
// Se il codice articolo del magazzino è diverso quello è del cliente
// Se il codice articolo del magazzino diverso quello del cliente
if (codart.full() && codart != codartmag)
{
reset(paf1900f);
@ -1580,7 +1580,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
indsp.put(IND_CODIND, doc.get(DOC_CODINDSP));
indsp.read();
rifamm = indsp.get(IND_PARIFAMM);
if(rifamm.blank())
if (rifamm.blank())
rifamm = doc.clifor().vendite().get(CFV_PARIFAMM);
}
paf0200f.set("P2_RIFAMMINISTR", rifamm);
@ -1624,7 +1624,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
fisc = cliente.codice_fiscale();
if (!stato.full())
stato = "IT";
if(tab_codiso.get_bool("B0") || stato == "IT") // Cliente EU
if (tab_codiso.get_bool("B0") || stato == "IT") // Cliente EU
{
if (piva.full())
{
@ -1642,7 +1642,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
paf0400f.set("P4_FISCIVAPAESE", stato);
paf0400f.set("P4_FISCIVACOD", piva);
}
if(fisc.full())
if (fisc.full())
paf0400f.set("P4_CODFISC", fisc);
}
else // Cliente EXTRA-EU sempre nel campo della partita iva sui paf
@ -1679,7 +1679,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
paf0400f.set("P4_SEDEPROV", cliente.provincia_residenza());
}
// Titolo onorifico!
if(_rec_clifo.vendite().get(CFV_TITOLO).full())
if (_rec_clifo.vendite().get(CFV_TITOLO).full())
{
paf0400f.set("P4_ANATITOLO", cache().get("TIT", _rec_clifo.vendite().get(CFV_TITOLO), "S0"));
}
@ -1705,17 +1705,17 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
// <DatiCassaPrevidenziale>
// Non la mettiamo!
// </DatiCassaPrevidenziale>
// Non inserisco più adesso il paf0700f ma lo faccio alla fine (per inserire le ritenute)
// Non inserisco pi adesso il paf0700f ma lo faccio alla fine (per inserire le ritenute)
/*
* Lo sconto in testata è stato disabilitato in quanto su Campo influenza solo le righe merci mentre dovrebbe modificare tutte le righe
* Lo sconto in testata stato disabilitato in quanto su Campo influenza solo le righe merci mentre dovrebbe modificare tutte le righe
*/
// <DatiGenerali>
TPaf_record& paf2700f = _paf_container.get_paf("PAF2700F");
// 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.
// 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);
if(_has_cust)
if (_has_cust)
{
TPaf_record& paf3400f = _paf_container.get_paf("PAF3400F");
reset(paf3400f);
@ -1739,7 +1739,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
paf2700f.set("PQ_GESTIONE", "D");
ok &= insert(paf2700f);
// <DatiOrdineAcquisto>
if((doc.is_nota_credito() || get_send_all_rifs()) && doc.get(DOC_NUMDOCRIF).full())
if ((doc.is_nota_credito() || get_send_all_rifs()) && doc.get(DOC_NUMDOCRIF).full())
{
TPaf_record& paf1400f = _paf_container.get_paf("PAF1400F");
reset(paf1400f);
@ -1757,8 +1757,8 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
// Codice commessa, spostato nel campo S5 di TABCOM
TString80 com = cco(doc).get("S5");
// Se è una commessa della sanità bisogna aggiungere un cancelletto davanti e dietro
if(cco(doc).get_bool("B0"))
// Se una commessa della sanit bisogna aggiungere un cancelletto davanti e dietro
if (cco(doc).get_bool("B0"))
{
com.add_front_and_back("#");
}
@ -1919,7 +1919,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
ok &= export_info_articolo(rdoc, paf1900f, paf2100f, riga, r);
}
// </CodiceArticolo>
if(rdoc->is_descrizione())
if (rdoc->is_descrizione())
{
paf1800f.set("PI_QUANTITA", UNO);
paf1800f.set("PI_PREZZOUNIT", ZERO);
@ -1931,11 +1931,11 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
if (rdoc->get(RDOC_QTA).is_zero())
{
TString msg;
msg.format("La riga merce %d ha quantità nulla", riga);
msg.format("La riga merce %d ha quantit nulla", riga);
log(1, msg);
}
set_qta_prezzo(paf1800f, rdoc);
if(rdoc->iva().codice().empty())
if (rdoc->iva().codice().empty())
{
set_IVA(_codivadefault, paf1800f);
}
@ -1948,7 +1948,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
*/
/*
* 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
*/
if (!riftesta)
{
@ -2012,7 +2012,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
if (qta.is_zero())
{
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);
qta = UNO;
}
@ -2036,7 +2036,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
paf1800f.set("PI_PREZZOUNIT", converti_prezzo(qta_inverse ? -abs(prz) : abs(prz)));
paf1800f.set("PI_PRZTOTALE", converti_prezzo(imp));
set_IVA(*rdoc, paf1800f);
// Controllo se è una ritenuta fiscale
// Controllo se una ritenuta fiscale
if (sp.tipo_ritenuta() == 'F')
{
paf1800f.set("PI_RITENUTA", "SI");
@ -2056,7 +2056,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
else if (rdoc->is_sconto() || rdoc->is_sconto_perc())
{
TString msg;
msg << "Il documento " << doc.codice_numerazione().codice() << " " << doc.tipo().codice() << " " << doc.numero() << " presenta una o più righe di tipo sconto o sconto percentuale.\n" \
msg << "Il documento " << doc.codice_numerazione().codice() << " " << doc.tipo().codice() << " " << doc.numero() << " presenta una o pi righe di tipo sconto o sconto percentuale.\n" \
"Esportazione impossibile";
log(2, msg);
return false;
@ -2066,7 +2066,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
if (rdoc->get(RDOC_QTA).is_zero())
{
TString msg;
msg.format("La riga omaggi %d ha quantità nulla", riga);
msg.format("La riga omaggi %d ha quantit nulla", riga);
log(1, msg);
}
paf1800f.set("PI_TIPOCESSPREST", "AB");
@ -2086,7 +2086,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
paf1800f.set("PI_PRZTOTALE", converti_prezzo(rdoc->prezzo(false, false) * rdoc->get_real(RDOC_QTA)));
TRiepilogo_agg& riepilogo_agg = _riepilogo_agg[rdoc->iva().codice()];
riepilogo_agg.imponibile += rdoc->imponibile_omaggio(2);
// Non metto l'imposta, è già presente nei totali
// Non metto l'imposta, gi presente nei totali
//riepilogo_agg.imposta += rdoc->iva_omaggio(8, 2);
}
else
@ -2139,7 +2139,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
// </ScontoMaggiorazione>
if (!skip_riga)
{
if(_has_cust)
if (_has_cust)
{
cached_custom_fp().get_custom(doc).load_adg_paf(paf2100f, *rdoc, *this, riga);
}
@ -2183,7 +2183,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
if (doc.is_fattura() && !doc.is_nota_credito())
{
doc.set_riga_esenzione();
if(doc.ha_riga_esenzione())
if (doc.ha_riga_esenzione())
{
const TRiga_documento& riga_es = doc.get_riga_esenzione();
reset(paf1800f);
@ -2227,7 +2227,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
}
// Se il bollo va fatto pagare bisogna aggiungere una riga!
const real importo_bolli = doc.get_real(DOC_BOLLI);
if(doc.get_bool(DOC_ADDBOLLI) && importo_bolli > ZERO)
if (doc.get_bool(DOC_ADDBOLLI) && importo_bolli > ZERO)
{
reset(paf1800f);
paf1800f.set("PI_NUMEROLINEA", riga);
@ -2244,7 +2244,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
// OMAGGI????
// Aggiungo le spese incasso
if(doc.get_real("SPESINC") > ZERO)
if (doc.get_real("SPESINC") > ZERO)
{
reset(paf1800f);
paf1800f.set("PI_NUMEROLINEA", riga);
@ -2262,7 +2262,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
}
// Conai assolto
if(doc.clifor().vendite().get_bool("CONAIASS"))
if (doc.clifor().vendite().get_bool("CONAIASS"))
{
reset(paf1800f);
paf1800f.set("PI_NUMEROLINEA", riga);
@ -2277,8 +2277,8 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
riga++;
}
// Riga sconto di testata
// Se è presente uno sconto in testata devo sottrarlo come riga sconto o lo SDI urla
if(doc.get(DOC_SCONTOPERC).full() && doc.get(DOC_SCONTOPERC) != "0")
// Se presente uno sconto in testata devo sottrarlo come riga sconto o lo SDI urla
if (doc.get(DOC_SCONTOPERC).full() && doc.get(DOC_SCONTOPERC) != "0")
{
TAssoc_array& tiva = doc.tabella_iva(false);
FOR_EACH_ASSOC_OBJECT(tiva, obj, key, itm)
@ -2290,7 +2290,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
paf3000f.set("PT_RIFNUMLINEA", riga);
paf1800f.set("PI_TIPOCESSPREST", "AB");
TString msg = "Riga sconto merci in testata ";
if(riva.cod_iva().percentuale() > ZERO)
if (riva.cod_iva().percentuale() > ZERO)
msg << riva.cod_iva().percentuale() << "%";
else
msg << riva.cod_iva().codice();
@ -2304,7 +2304,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
}
}
const TString& nota_piede_fatt = _riga_npf.get_nota_piede(doc.tipo().codice());
if(nota_piede_fatt.full())
if (nota_piede_fatt.full())
{
reset(paf1800f);
paf1800f.set("PI_NUMEROLINEA", riga);
@ -2320,7 +2320,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
}
// Se dopo tutto ha ancora delle righe di altri dati gestionali che vanno messi a parte
if(_has_cust && cached_custom_fp().get_custom(doc).has_adg_split())
if (_has_cust && cached_custom_fp().get_custom(doc).has_adg_split())
{
reset(paf1800f);
paf1800f.set("PI_NUMEROLINEA", riga);
@ -2336,7 +2336,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
_idx_adg_doc_row = 1L;
ok &= cached_custom_fp().get_custom(doc).load_adg_paf(paf2100f, doc[1], *this, riga, true);
if(_idx_adg_doc_row > 1L)
if (_idx_adg_doc_row > 1L)
ok &= insert(paf1800f) && insert(paf3000f);
riga++;
@ -2344,7 +2344,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
// </DatiBeniServizi>
// <DatiDDT>
// Metto qua i dati DDT per capire se la fattura è accompagnatoria o deriva da bolla
// Metto qua i dati DDT per capire se la fattura accompagnatoria o deriva da bolla
TPaf_record& paf1700f = _paf_container.get_paf("PAF1700F");
if (doc.get("CODVETT1").full() && !_has_bolla)
{
@ -2355,7 +2355,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
if (piva.empty() && codfisc.empty())
{
TString msg = "Il vettore ";
msg << vet.get("S0").mid(0, 50) << " non ha nè codice fiscale nè partita IVA, la fattura " << doc.anno() << " " << doc.codice_numerazione().codice() << " " << doc.numero() << " non può essere trasmessa";
msg << vet.get("S0").mid(0, 50) << " non ha n codice fiscale n partita IVA, la fattura " << doc.anno() << " " << doc.codice_numerazione().codice() << " " << doc.numero() << " non pu essere trasmessa";
log(3, msg);
}
if (piva.full())
@ -2382,16 +2382,16 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
const char* eiva = get_esigibilita_iva(doc);
long num_riep = 0;
TAssoc_array& tiva = doc.tabella_iva(false);
for(TObject* itm = tiva.first_item(); itm != nullptr; itm = tiva.succ_item())
for (TObject* itm = tiva.first_item(); itm != nullptr; itm = tiva.succ_item())
{
const TRiepilogo_iva& riva = *dynamic_cast<const TRiepilogo_iva*>(itm);
if (!check_riepilogo(doc, riva) && !get_check_not_block())
return false;
add_riepilogo_iva(paf2200f, riva.cod_iva(), eiva, riva.imponibile(), riva.imposta());
}
if(!_riepilogo_agg.empty())
if (!_riepilogo_agg.empty())
{
for(auto i = _riepilogo_agg.begin(); i != _riepilogo_agg.end(); ++i)
for (auto i = _riepilogo_agg.begin(); i != _riepilogo_agg.end(); ++i)
{
const TCodiceIVA cod_iva(i->first);
add_riepilogo_iva(paf2200f, cod_iva, eiva);
@ -2405,7 +2405,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
doc.scadenze_recalc(); // Ricalcola array delle rate
TString_array& scad = doc.scadenze();
const char* rateazione = pag.cond_pag_sdi(); // A rate (TP01) o una soluzione(TP02)?
paf2400f.set("PN_RIGA", ZERO); // Al momento non gestiamo più tipologie di pagamento per documento
paf2400f.set("PN_RIGA", ZERO); // Al momento non gestiamo pi tipologie di pagamento per documento
paf2400f.set("PN_CONDPAGAMENTO", rateazione);
paf2400f.set("PN_GESTIONE", "D");
ok &= insert(paf2400f);
@ -2429,7 +2429,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
log(2, TR("Non sono presenti ABI, CAB, IBAN per il pagamento"));
if ((tipo_pag == 8 || tipo_pag == 9) && iban.blank()) // R.I.D. o Bonifico
{
log(1, TR("Non è presente il codice IBAN per il pagamento"));
log(1, TR("Non presente il codice IBAN per il pagamento"));
}
for (int nr = 0; nr < scad.items(); nr++)
{
@ -2455,11 +2455,11 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
{
if (!dongle().active(RSAUT))
{
log(1, "Impossibile generare la fattura, il modulo RS non è abilitato!");
log(1, "Impossibile generare la fattura, il modulo RS non abilitato!");
}
else if (!doc.tipo().main_print_profile(rep, 2))
{
log(1, "Impossibile generare la fattura, non è disponibile un profilo di stampa per questo tipo documento!");
log(1, "Impossibile generare la fattura, non disponibile un profilo di stampa per questo tipo documento!");
}
else
{
@ -2480,7 +2480,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
{
TFilename pdf; pdf.tempdir();
pdf << SLASH << doc.get(DOC_ANNO) << '_' << doc.get(DOC_CODNUM) << '_' << doc.get(DOC_NDOC) << ".pdf";
if (!pdf.exist() && !yesno_box("Attenzione! Non è stato possibile creare il pdf, continuare?"))
if (!pdf.exist() && !yesno_box("Attenzione! Non stato possibile creare il pdf, continuare?"))
{
return false;
}
@ -2494,7 +2494,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
{
if (_def_fld.empty())
{
TString msgerr; msgerr << "Errore: il documento " << _bfatt << " ha degli allegati ma nella configurazione non è stato impostato come trametterli\nCaricare il documento senza allegati?";
TString msgerr; msgerr << "Errore: il documento " << _bfatt << " ha degli allegati ma nella configurazione non stato impostato come trametterli\nCaricare il documento senza allegati?";
load_allegati = false;
if (!yesno_box(msgerr))
return false;
@ -2581,7 +2581,7 @@ bool TDoc_fp::doc_to_paf()
TRectype& TDoc_fp::key_to_doc(const TDoc_key& key)
{
if(_doc_rec != nullptr)
if (_doc_rec != nullptr)
delete _doc_rec;
_doc_rec = new TRectype(LF_DOC);
_doc_rec->put(DOC_PROVV, key.provv());

View File

@ -1,4 +1,4 @@
#ifndef __ISAM_H
+#ifndef __ISAM_H
#define __ISAM_H
#ifndef __CURRENCY_H

View File

@ -165,6 +165,7 @@ protected:
public:
bool valid_cursor() const { return _cursor != NULL; }
virtual TCursor* cursor() const;
void set_filterfunction(FILTERFUNCTION ff, bool update = false) { cursor()->set_filterfunction(ff, update); }
virtual void freeze(bool on = true) { return cursor()->freeze(on); }
virtual void unfreeze() { return cursor()->freeze(false); }
virtual bool frozen() const { return cursor()->frozen(); }

View File

@ -2920,6 +2920,55 @@ void TReport::mask2report(const TMask & m)
}
}
void TReport::reset_export_sections()
{
FOR_EACH_ASSOC_OBJECT(_sections, os, sec_key, sec_item)
{
TReport_section * sect = (TReport_section *)sec_item;
const bool section_shown = _default_shown_sections.is_key(sec_key);
sect->show(section_shown);
}
}
void TReport::set_export_sections(export_type type)
{
switch (type)
{
case _export_printer :
break;
case _export_visualize :
break;
case _export_excel :
{
FOR_EACH_ASSOC_OBJECT(_sections, os, sec_key, sec_item)
{
const TString4 sec_id(sec_key);
TReport_section * sect = (TReport_section *)sec_item;
sect->show(sect->shown() && (sec_id == "H0" || sec_id.starts_with("B")));
}
}
break;
case _export_dbase:
{
FOR_EACH_ASSOC_OBJECT(_sections, os, sec_key, sec_item)
{
const TString4 sec_id(sec_key);
TReport_section * sect = (TReport_section *)sec_item;
sect->show(sect->shown() && sec_id.starts_with("B"));
}
}
break;
case _export_pdf :
break;
case _export_text :
default:
break;
}
}
KEY TReport::run_form(TMask& m)
{
report2mask(m);

View File

@ -370,7 +370,6 @@ protected:
virtual int compare(const TSortable& s) const;
void copy(const TReport_field& rf);
TFieldtypes var_type() const;
const TString& formatted_text() const;
void get_currency(TCurrency& cur) const;
TReport_array_item* get_array_item() const;
@ -381,6 +380,9 @@ public:
TReport_section& section() const { return *_section; }
void set_section(TReport_section* sec) { _section = sec; }
const TString& formatted_text() const;
bool has_font() const { return _font != NULL; }
const TReport_font& font() const;
const TReport_font& print_font() const;
@ -535,6 +537,7 @@ public:
// Internal usage only
typedef void (*FLDMSG_FUNC)(TReport_field& rf, void* jolly);
typedef enum { _export_printer, _export_visualize, _export_excel, _export_pdf, _export_text, _export_dbase } export_type;
class TReport : public TAlex_virtual_machine
{
@ -556,6 +559,7 @@ class TReport : public TAlex_virtual_machine
TString_array _allegati;
TReport_field* _curr_field;
bool _page_split, _page_merge;
TAssoc_array _default_shown_sections;
protected:
virtual const char* class_name() const { return "Report"; }
@ -590,6 +594,9 @@ public:
bool kill_section(char type, int level);
int find_max_level(char type) const;
virtual void reset_export_sections();
virtual void set_export_sections(export_type type);
virtual bool on_link(const TReport_link& link);
virtual bool use_mask() { return true;}

View File

@ -1647,6 +1647,9 @@ HIDDEN bool ask_export_filename(TFilename& fname)
bool TBook::export_text(TFilename& fname, bool signature, int size, bool goto_url, bool ask_filename)
{
TString ext = fname.ext(); ext.lower();
if (ext.blank())
fname.ext("txt");
if (ext == "pdf")
return export_pdf(fname, signature, goto_url, ask_filename);
if (ext.starts_with("xls") || ext.starts_with("htm"))
@ -1843,10 +1846,101 @@ static void reformat_excel(TString& str)
}
}
bool TBook::export_dbase(TFilename& fname, bool signature, TTrec * desc, bool goto_url, bool ask_filename)
{
TFilename temp;
TToken_string line(8192, '\t');
TString ext = fname.ext(); ext.lower();
if (ext.blank())
fname.ext("dbf");
if (desc == nullptr)
{
ifstream ifstream(temp);
int nfields = 0;
while (!ifstream.eof())
{
ifstream.getline(line.get_buffer(), line.size());
if (nfields < line.items())
nfields = line.items();
}
desc = new TTrec;
for (int i = 0; i < nfields; i++)
desc->update_fielddef(i, TToken_string(format("FLD%03d|1|80|0", i)));
desc->update_keydef(0, TToken_string("FLD001|"));
}
if (fname.exist())
{
TFilename f(fname);
f.ext("*");
remove_files(f, false);
}
TExternisamfile dbf(fname, *desc);
temp.temp("exp", "xls");
export_excel(temp, signature);
ifstream ifstream(temp);
while (!ifstream.eof())
{
int i = 0;
ifstream.getline(line.get_buffer(), line.size());
if (line.full())
{
dbf.zero();
FOR_EACH_STR_TOKEN(line, val)
if (*desc->rec().Fd[i].Name != '\0')
switch (desc->rec().Fd[i].TypeF)
{
case _alfafld:
case _charfld:
case _boolfld:
case _memofld:
dbf.put(desc->rec().Fd[i++].Name, val);
break;
case _intfld :
case _longfld :
case _realfld :
case _wordfld :
case _intzerofld :
case _longzerofld :
dbf.put(desc->rec().Fd[i++].Name, real::ita2eng(val));
break;
case _datefld :
dbf.put(desc->rec().Fd[i++].Name, TDate(atoi(val.left(2)), atoi(val.mid(3,2)), 2000 + atoi(val.right(2))));
break;
default :
break;
}
dbf.write();
}
}
remove(temp);
safe_delete(desc);
if (signature && main_app().has_module(FDAUT))
{
char outfile[_MAX_PATH] = "";
if (xvt_sign_file(fname, outfile))
fname = outfile;
}
if (goto_url)
xvt_sys_goto_url(fname, "open");
return true;
}
bool TBook::export_excel(TFilename& fname, bool signature, bool goto_url, bool ask_filename)
{
TTabulator tab;
TString ext = fname.ext(); ext.lower();
if (ext.blank())
fname.ext("xls");
if (ask_filename && !ask_export_filename(fname))
return false;
@ -2286,6 +2380,10 @@ bool TBook::print(size_t pagefrom, size_t pageto, word copies)
bool TBook::export_pdf(TFilename& filename, bool signature, bool goto_url, bool ask_filename)
{
TString ext = filename.ext(); ext.lower();
if (ext.blank())
filename.ext("pdf");
bool ok = (pages() > 0) && main_app().has_module(RSAUT); // Controllo paranoico dei permessi
if (ok)
{
@ -2359,6 +2457,11 @@ bool TBook::esporta()
if (ok)
xvt_sys_goto_url(fname, "open");
break;
case K_DBF:
ok = export_dbase(fname, signature);
if (ok)
xvt_sys_goto_url(fname, "open");
break;
default:
break;
}
@ -2891,7 +2994,7 @@ void TReport_book::add_doc(const TString& name)
TReport* rep = _report; // Salvo variabile globale
add(*eminem, true);
add(*eminem, _export_printer, true);
_report = rep; // Ripristino variabile globale
}
delete eminem;
@ -2900,11 +3003,12 @@ void TReport_book::add_doc(const TString& name)
TBook::add_doc(name);
}
bool TReport_book::add(TReport& rep, bool progind)
bool TReport_book::add(TReport& rep, export_type type, bool progind)
{
if (!init(rep))
return false;
_report->set_export_sections(type);
if (!_report->execute_prescript())
return false;

View File

@ -97,6 +97,8 @@ public:
virtual bool archive(const char* repname, bool signature);
virtual bool preview();
// esporta il book in un file dbf il tracciato record passato viene disallocato
virtual bool export_dbase(TFilename& fname, bool signature, TTrec * desc = nullptr, bool goto_url = false, bool ask_filename = false);
virtual bool export_excel(TFilename& fname, bool signature, bool goto_url = false, bool ask_filename = false);
virtual bool export_pdf(TFilename& fname, bool signature, bool goto_url = false, bool ask_filename = false);
virtual bool export_text(TFilename& fname, bool signature, int size, bool goto_url = false, bool ask_filename = false);
@ -134,7 +136,7 @@ protected:
void print_subsections(int father);
public:
bool add(TReport& report, bool progind = true);
bool add(TReport& report, export_type type = _export_printer, bool progind = true);
virtual int lpi() const;
virtual int cpi() const;

View File

@ -134,7 +134,7 @@ bool check_record(TISAM_recordset* rec, const bool mod_esterometro,
rdoc.put(DOC_NDOC, rec->get("23.DNDOC").as_string());
// Se riesco a generare la chiave, trovo il record e non ha il flag di gestione in errore o un errore esterno, so che è stato inviato
const bool is_sent = rdoc.read(doc) == NOERR && chiave_paf(rdoc, hfatt, bfatt) && paf0100f.search(nullptr, hfatt, bfatt) && paf0100f.sq_get("P1_GESTIONE") != "E" && paf0100f.sq_get("P1_ERREST") != "*";
const bool is_sent = rdoc.read(doc) == NOERR && chiave_paf_doc(rdoc, hfatt, bfatt) && paf0100f.search(nullptr, hfatt, bfatt) && paf0100f.sq_get("P1_GESTIONE") != "E" && paf0100f.sq_get("P1_ERREST") != "*";
// Se voglio solo quelli inviati e non è stato inviato o
// voglio solo quelli non inviati ed è stato inviato, RUSPA!