Corretta generazione NAC
git-svn-id: svn://10.65.10.50/branches/R_10_00@22791 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
07bb60d62b
commit
b2556eb707
152
ha/ha0500.cpp
152
ha/ha0500.cpp
@ -115,8 +115,8 @@ protected:
|
||||
void elabora_documenti(const TMask& mask, TISAM_recordset& recset, TLog_report& log);
|
||||
|
||||
//metodi medio livello
|
||||
bool aggiorna_contratti(const TRiga_documento& rdoc, TContratto_premi& contratto, TLog_report& log);
|
||||
bool elabora_contratti(TDocumento& curr_doc, TArray& contratti_cliente, TLog_report& log);
|
||||
bool aggiorna_contratto(const TRiga_documento& rdoc, TContratto_premi& contratto, TLog_report& log);
|
||||
bool elabora_contratti(TDocumento& curr_doc, TArray& contratti_cliente, const TDate& data_fine, TLog_report& log);
|
||||
bool genera_nac(const TMask& mask, TArray& contratti_cliente, TArray& documenti_cliente, TLog_report& log);
|
||||
|
||||
//metodi basso livello
|
||||
@ -231,33 +231,21 @@ long THardy_elab_docs::genera_recordset(const TMask& mask, TISAM_recordset& recs
|
||||
|
||||
//se c'è l'agente specificato...
|
||||
const TString& agente = mask.get(F_CODAGE);
|
||||
const bool has_007 = agente.full();
|
||||
if (has_007)
|
||||
query << "&&(CODAG=#CODAG)";
|
||||
//ordinamento agente-codcf-numdoc
|
||||
query << "\nBY ";
|
||||
if (has_007)
|
||||
query << DOC_CODAG << " ";
|
||||
|
||||
query << DOC_CODCF << " " << DOC_NDOC;
|
||||
//ordinamento (agente)-codcf-ndoc
|
||||
query << "\nBY " << DOC_CODCF << " " << DOC_NDOC;
|
||||
|
||||
//from-to dipendente da chiave
|
||||
switch (key)
|
||||
{
|
||||
case 2: //chiave per tipocf-codcf-provv-anno-datadoc-codnum
|
||||
{
|
||||
query << "\nFROM TIPOCF=C CODCF=#CODCF PROVV=D ANNO=#ANNO DATADOC=#DADATA";
|
||||
query << "\nTO TIPOCF=C CODCF=#CODCF PROVV=D ANNO=#ANNO DATADOC=#ADATA";
|
||||
}
|
||||
query << "\nFROM TIPOCF=C CODCF=#CODCF PROVV=D ANNO=#ANNO DATADOC=#DADATA"
|
||||
<< "\nTO TIPOCF=C CODCF=#CODCF PROVV=D ANNO=#ANNO DATADOC=#ADATA";
|
||||
break;
|
||||
|
||||
case 3: //chiave per datadoc-provv-anno-codnum
|
||||
{
|
||||
query << "\nFROM DATADOC=#DADATA PROVV=D ANNO=#ANNO";
|
||||
query << "\nTO DATADOC=#ADATA PROVV=D ANNO=#ANNO";
|
||||
}
|
||||
query << "\nFROM DATADOC=#DADATA PROVV=D ANNO=#ANNO"
|
||||
<< "\nTO DATADOC=#ADATA PROVV=D ANNO=#ANNO";
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@ -269,7 +257,6 @@ long THardy_elab_docs::genera_recordset(const TMask& mask, TISAM_recordset& recs
|
||||
const TDate adata = mask.get_date(F_ADATA);
|
||||
TDate dadata = mask.get_date(F_DADATA);
|
||||
//se la data iniziale è vuota deve coincidere con l'inizio dell'esercizio della data finale (obbligatoria!)
|
||||
int esc = adata.year();
|
||||
if (!dadata.ok())
|
||||
check_date(adata, dadata);
|
||||
|
||||
@ -281,7 +268,7 @@ long THardy_elab_docs::genera_recordset(const TMask& mask, TISAM_recordset& recs
|
||||
recset.set_var("#CODAG", agente);
|
||||
if (codcf > 0)
|
||||
recset.set_var("#CODCF", codcf);
|
||||
recset.set_var("#ANNO", long(esc));
|
||||
recset.set_var("#ANNO", long(adata.year()));
|
||||
recset.set_var("#DADATA", dadata);
|
||||
recset.set_var("#ADATA", adata);
|
||||
|
||||
@ -308,10 +295,13 @@ int THardy_elab_docs::find_contratti_cliente(const long codcfatt, const TMask& m
|
||||
|
||||
FOR_EACH_ASSOC_OBJECT(cod_num_cont, h, k, o)
|
||||
{
|
||||
const TString& agente = mask.get(F_CODAGE);
|
||||
|
||||
//deve cercare tutti i contratti del cliente e metterli nell'array
|
||||
TString query;
|
||||
query << "USE DOC KEY 5";
|
||||
query << "\nSELECT ((TIPODOC=#A_TIPODOC)||(TIPODOC=#R_TIPODOC)||(TIPODOC=#P_TIPODOC))&&(STR(DOC2=#CODCF))";
|
||||
if (agente.full()) query << "&&(CODAG=#CODAG)";
|
||||
query << "\nFROM PROVV=D CODNUM=" << k;
|
||||
query << "\nTO PROVV=D CODNUM=" << k;
|
||||
|
||||
@ -322,6 +312,7 @@ int THardy_elab_docs::find_contratti_cliente(const long codcfatt, const TMask& m
|
||||
recset.set_var("#P_TIPODOC", tip_post);
|
||||
|
||||
recset.set_var("#CODCF", codcfatt);
|
||||
recset.set_var("#CODAG", agente);
|
||||
|
||||
const long n_contratti = recset.items(); //questo serve solo al sagace programmatore
|
||||
|
||||
@ -335,8 +326,8 @@ int THardy_elab_docs::find_contratti_cliente(const long codcfatt, const TMask& m
|
||||
//controlla validità del contratto con le date scelte per l'elaborazione dei documenti
|
||||
const TDate data_ini_contratto = recset.get(DOC_DATACOMP).as_date();
|
||||
|
||||
TDate data_ini_elab = mask.get_date(F_DADATA);
|
||||
const TDate data_fine_elab = mask.get_date(F_ADATA);
|
||||
TDate data_ini_elab = mask.get_date(F_DADATA);
|
||||
if (!data_ini_elab.ok())
|
||||
check_date(data_fine_elab, data_ini_elab);
|
||||
|
||||
@ -359,6 +350,7 @@ int THardy_elab_docs::find_contratti_cliente(const long codcfatt, const TMask& m
|
||||
TContratto_premi* curr_contratto = new TContratto_premi(recset.cursor()->curr());
|
||||
//azzeratore del campo con il totale reso per elaborazione, nel caso di contratti Anticipo/Rifatturazione, riga spese
|
||||
const char tipo_contr = curr_contratto->tipo_contratto();
|
||||
|
||||
if (tipo_contr == 'A' || tipo_contr == 'R')
|
||||
{
|
||||
FOR_EACH_PHYSICAL_RDOC(*curr_contratto, r, rdoc)
|
||||
@ -366,10 +358,20 @@ int THardy_elab_docs::find_contratti_cliente(const long codcfatt, const TMask& m
|
||||
if (rdoc->get(RDOC_TIPORIGA) == HARDY_TIPORIGA_SOMMA)
|
||||
{
|
||||
rdoc->zero(RCA_2_RESO_CORRENTE);
|
||||
|
||||
const real prezzo = rdoc->prezzo(false, false);
|
||||
const real resost = rdoc->get(RCA_2_RESO_STORICO);
|
||||
if (resost >= prezzo) // Contratto esaurito da ignorare
|
||||
{
|
||||
delete curr_contratto;
|
||||
curr_contratto = NULL;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (curr_contratto != NULL) // Ignora contratti chiusi
|
||||
contratti_cliente.add(curr_contratto);
|
||||
}
|
||||
}
|
||||
@ -377,7 +379,7 @@ int THardy_elab_docs::find_contratti_cliente(const long codcfatt, const TMask& m
|
||||
}
|
||||
|
||||
|
||||
bool THardy_elab_docs::aggiorna_contratti(const TRiga_documento& rdoc, TContratto_premi& contratto, TLog_report& log)
|
||||
bool THardy_elab_docs::aggiorna_contratto(const TRiga_documento& rdoc, TContratto_premi& contratto, TLog_report& log)
|
||||
{
|
||||
bool elaborato = false;
|
||||
const char tipo_contratto = contratto.tipo_contratto();
|
||||
@ -429,7 +431,7 @@ bool THardy_elab_docs::aggiorna_contratti(const TRiga_documento& rdoc, TContratt
|
||||
elaborato = true;
|
||||
|
||||
TString msg;
|
||||
msg.format("Documento %d/%s %ld - %s: %s %s -> Bonus %s su contratto %d/%s %ld",
|
||||
msg.format("Doc. %d/%s %ld - %s: %s %s -> Bonus %s Contr. %d/%s %ld",
|
||||
rdoc.get_int(RDOC_ANNO), (const char*)rdoc.get(RDOC_CODNUM), rdoc.get_long(RDOC_NDOC),
|
||||
(const char*)rdoc_codart, normalized_rdoc_qta.stringa(4, 0), (const char*)rdoc_umqta, bonus.stringa(7,2),
|
||||
contratto.get_int(DOC_ANNO), (const char*)contratto.get(DOC_CODNUM), contratto.get_long(DOC_NDOC));
|
||||
@ -446,17 +448,32 @@ bool THardy_elab_docs::aggiorna_contratti(const TRiga_documento& rdoc, TContratt
|
||||
|
||||
//aggiorna, in base al documento in esame curr_doc, le somme restituite nelle righe di tipo verigh02 nei contratti validi..
|
||||
//..del cliente
|
||||
bool THardy_elab_docs::elabora_contratti(TDocumento& curr_doc, TArray& contratti_cliente, TLog_report& log)
|
||||
bool THardy_elab_docs::elabora_contratti(TDocumento& curr_doc, TArray& contratti_cliente, const TDate& data_fine, TLog_report& log)
|
||||
{
|
||||
const TDate datadoc = curr_doc.get(DOC_DATADOC);
|
||||
bool elaborato = false;
|
||||
|
||||
FOR_EACH_PHYSICAL_RDOC(curr_doc, r, rdoc) if (rdoc->is_merce()) //giro su tutte le righe merce delle fatture
|
||||
{
|
||||
//controlla se il codart della riga esiste in uno dei contratti validi
|
||||
//controlla se il codart della riga esiste in uno o più contratti validi
|
||||
for (int i = 0; i < contratti_cliente.items(); i++)
|
||||
{
|
||||
TContratto_premi& contratto = (TContratto_premi&)contratti_cliente[i];
|
||||
elaborato |= aggiorna_contratti(*rdoc, contratto, log);
|
||||
if (!contratto.data_valida(datadoc))
|
||||
continue;
|
||||
|
||||
// Calcola l'inizio di validità dei documenti in base alla frequenza (14-01-2013)
|
||||
TDate data_inizio(1, 1, data_fine.year());
|
||||
switch (contratto.frequenza())
|
||||
{
|
||||
case 'S': data_inizio.set_month(data_fine.month() > 6 ? 7 : 1); break;
|
||||
case 'T': data_inizio.set_month(max(1, data_fine.month()-2)); break;
|
||||
default: break;
|
||||
}
|
||||
|
||||
// Elabora solo i documenti che ricadano nell'intervallo valido
|
||||
if (datadoc >= data_inizio && datadoc <= data_fine)
|
||||
elaborato |= aggiorna_contratto(*rdoc, contratto, log);
|
||||
} //for(int i..
|
||||
} //FOR_EACH...
|
||||
|
||||
@ -464,8 +481,11 @@ bool THardy_elab_docs::elabora_contratti(TDocumento& curr_doc, TArray& contratti
|
||||
}
|
||||
|
||||
|
||||
bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente, TArray& /*documenti_cliente*/, TLog_report& log)
|
||||
bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente, TArray& documenti_cliente, TLog_report& log)
|
||||
{
|
||||
if (documenti_cliente.empty())
|
||||
return false;
|
||||
|
||||
//si informa se l'elaborazione è definitiva o meno
|
||||
const bool definitivo = mask.get_bool(F_DEFINITIVO);
|
||||
|
||||
@ -479,7 +499,7 @@ bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente,
|
||||
|
||||
//segnaliamo l'elaborazione del contratto sul log
|
||||
TString log_msg;
|
||||
log_msg.format("Contratto:%6ld Cliente:%6ld", ndoc, codcf);
|
||||
log_msg.format(FR("Contratto:%6ld Cliente:%6ld"), ndoc, codcf);
|
||||
|
||||
// generazione del documento NAC dal contratto
|
||||
// -------------------------------------------
|
||||
@ -518,7 +538,8 @@ bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente,
|
||||
cod_riga = codspesa;
|
||||
}
|
||||
|
||||
const int anno = mask.get_date(F_ADATA).year();
|
||||
const TDate datadoc = mask.get(F_DATAELAB);
|
||||
const int anno = datadoc.year();
|
||||
//solo in caso di elaborazione definitiva si scrivono NAC di tipo D;
|
||||
//sennò di tipo P, che sono uccidibili all'inizio di ogni nuova elaborazione
|
||||
const char provv = definitivo ? 'D' : 'P';
|
||||
@ -526,7 +547,7 @@ bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente,
|
||||
TDocumento nac(provv, anno, nac_codnum, 0); //num_doc = 0 perchè viene aggiornato in fase di registrazione
|
||||
nac.set_tipo(nac_tipo);
|
||||
nac.put(DOC_STATO, 1);
|
||||
nac.put(DOC_DATADOC, mask.get(F_DATAELAB));
|
||||
nac.put(DOC_DATADOC, datadoc);
|
||||
nac.put(DOC_TIPOCF, 'C');
|
||||
nac.put(DOC_CODCF, codcf);
|
||||
nac.put(DOC_CODAG, codage);
|
||||
@ -543,6 +564,30 @@ bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente,
|
||||
const TString80 descr_riga_spp = rec_spp.get("S0");
|
||||
const TString4 codiva = rec_spp.get("S3");
|
||||
|
||||
TDate adata = mask.get_date(F_ADATA);
|
||||
|
||||
TDate dadata = mask.get_date(F_DADATA);
|
||||
if (!dadata.ok())
|
||||
check_date(adata, dadata);
|
||||
|
||||
TDate dmin(1, 1, adata.year());
|
||||
switch (contratto.frequenza())
|
||||
{
|
||||
case 'S': dmin.set_month(adata.month() > 6 ? 7 : 1); break;
|
||||
case 'T': dmin.set_month(max(1, adata.month()-2)); break;
|
||||
default: break;
|
||||
}
|
||||
if (dmin > dadata)
|
||||
dadata = dmin;
|
||||
|
||||
if (!contratto.data_valida(dadata))
|
||||
dadata = contratto.data_inizio();
|
||||
|
||||
if (!contratto.data_valida(adata))
|
||||
adata = contratto.data_fine();
|
||||
|
||||
TString msg_date; msg_date << " " << dadata << " -- " << adata;
|
||||
|
||||
//giro sulle righe del contratto, che originano le righe NAC
|
||||
for (int i = 1; i <= contratto.rows(); i++)
|
||||
{
|
||||
@ -564,15 +609,7 @@ bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente,
|
||||
|
||||
//panegirico della descrizione
|
||||
nac_row.put(RDOC_DESCR, descr_riga_spp);
|
||||
|
||||
TString msg;
|
||||
const TDate adata = mask.get_date(F_ADATA);
|
||||
TDate dadata = mask.get_date(F_DADATA);
|
||||
if (!dadata.ok())
|
||||
check_date(adata, dadata);
|
||||
|
||||
msg << " " << dadata << " -- " << adata;
|
||||
nac_row.put(RDOC_DESCEST, msg);
|
||||
nac_row.put(RDOC_DESCEST, msg_date);
|
||||
nac_row.put(RDOC_DESCLUNGA, "X");
|
||||
|
||||
//importi, qta, umqta
|
||||
@ -610,15 +647,7 @@ bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente,
|
||||
|
||||
//panegirico della descrizione
|
||||
nac_row.put(RDOC_DESCR, descr_riga_spp);
|
||||
|
||||
TString msg;
|
||||
const TDate adata = mask.get_date(F_ADATA);
|
||||
TDate dadata = mask.get_date(F_DADATA);
|
||||
if (!dadata.ok())
|
||||
check_date(adata, dadata);
|
||||
|
||||
msg << " " << dadata << " -- " << adata;
|
||||
nac_row.put(RDOC_DESCEST, msg);
|
||||
nac_row.put(RDOC_DESCEST, msg_date);
|
||||
nac_row.put(RDOC_DESCLUNGA, "X");
|
||||
|
||||
//importi, qta
|
||||
@ -640,9 +669,9 @@ bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente,
|
||||
// viene scritta comunque, con provv='D' se elaborazione definitiva
|
||||
int err = nac.write();
|
||||
|
||||
TString wrk_msg;
|
||||
if (err == NOERR)
|
||||
{
|
||||
TString wrk_msg;
|
||||
wrk_msg.format(" -- Generata NAC: %-4s%-4s%c %7ld", (const char*)nac_codnum, (const char*)nac_tipo, provv, nac.get_long(DOC_NDOC));
|
||||
log_msg << wrk_msg;
|
||||
}
|
||||
@ -715,10 +744,9 @@ void THardy_elab_docs::elabora_documenti(const TMask& mask, TISAM_recordset& fat
|
||||
if (codcf != old_codcf)
|
||||
{
|
||||
//generazione NAC del cliente precedente (una per contratto cliente)
|
||||
if (old_codcf > 0)
|
||||
if (old_codcf > 0 && !documenti_cliente.empty())
|
||||
genera_nac(mask, contratti_cliente, documenti_cliente, log);
|
||||
|
||||
CHECK(codcf > old_codcf, "Ordinamento clienti errato!");
|
||||
//aggiorna old_codcf in modo da poter controllare i contratti solo al cambio codcf
|
||||
old_codcf = codcf;
|
||||
|
||||
@ -730,17 +758,19 @@ void THardy_elab_docs::elabora_documenti(const TMask& mask, TISAM_recordset& fat
|
||||
if (n_contratti == 0)
|
||||
{
|
||||
TString msg;
|
||||
msg << "Il cliente " << codcf << " non ha un contratto premi valido nel periodo di elaborazione selezionato ma ha fatture.";
|
||||
msg << "Il cliente " << codcf << " non ha un contratto valido nel periodo selezionato pur avendo fatture.";
|
||||
log.log_error(msg);
|
||||
}
|
||||
}
|
||||
|
||||
if (contratti_cliente.items() > 0)
|
||||
{
|
||||
const TDate data_fine = mask.get(F_ADATA);
|
||||
|
||||
//se ha trovato uno o più contratti validi nel periodo passa alla elaborazione dei documenti del cliente
|
||||
TDocumento* curr_doc = new TDocumento(fatture.cursor()->curr());
|
||||
//elabora il documento corrente aggiornando le somme restituite sui contratti validi
|
||||
if (elabora_contratti(*curr_doc, contratti_cliente, log))
|
||||
if (elabora_contratti(*curr_doc, contratti_cliente, data_fine, log))
|
||||
documenti_cliente.add(curr_doc);
|
||||
else
|
||||
delete(curr_doc);
|
||||
@ -748,6 +778,7 @@ void THardy_elab_docs::elabora_documenti(const TMask& mask, TISAM_recordset& fat
|
||||
} //for (bool ok = recset.move_first()...
|
||||
|
||||
//generazione NAC dell'ultimo cliente (una per contratto cliente)
|
||||
if (!documenti_cliente.empty())
|
||||
genera_nac(mask, contratti_cliente, documenti_cliente, log);
|
||||
|
||||
//se elaborazione definitiva -> cambia lo stato ai documenti di vendita elaborati, mettendolo uguale..
|
||||
@ -755,8 +786,7 @@ void THardy_elab_docs::elabora_documenti(const TMask& mask, TISAM_recordset& fat
|
||||
const bool definitivo = mask.get_bool(F_DEFINITIVO);
|
||||
if (definitivo)
|
||||
{
|
||||
TConfig config(CONFIG_DITTA, "ha");
|
||||
const TString& stato_finale = config.get("StatoFinFatt");
|
||||
const TString4 stato_finale = ini_get_string(CONFIG_DITTA, "ha", "StatoFinFatt");
|
||||
FOR_EACH_ARRAY_ITEM(documenti_cliente, r, riga)
|
||||
{
|
||||
TDocumento& fattura = *(TDocumento*)riga;
|
||||
@ -764,11 +794,8 @@ void THardy_elab_docs::elabora_documenti(const TMask& mask, TISAM_recordset& fat
|
||||
fattura.rewrite();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
//metodo di alto livello con i punti principali del programma (come da analisi...)
|
||||
void THardy_elab_docs::elabora(const TMask& mask)
|
||||
{
|
||||
@ -779,7 +806,6 @@ void THardy_elab_docs::elabora(const TMask& mask)
|
||||
|
||||
//log report con segnalazioni sui clienti trattati (bene o male)
|
||||
TLog_report log("Sintesi elaborazione");
|
||||
log.kill_duplicates();
|
||||
log.log(0, "");
|
||||
|
||||
//2) recordset ordinato codag-codcf-numdoc con tutti i docs che soddisfano i parametri dell'utente
|
||||
@ -787,9 +813,7 @@ void THardy_elab_docs::elabora(const TMask& mask)
|
||||
TISAM_recordset recset("");
|
||||
const long items = genera_recordset(mask, recset);
|
||||
if (items == 0)
|
||||
{
|
||||
log.log(1, "Non esistono documenti di vendita che soddisfino i parametri selezionati!");
|
||||
}
|
||||
log.log(1, TR("Non esistono documenti di vendita che soddisfino i parametri selezionati!"));
|
||||
|
||||
//3) elaborazione documenti e contratti, generazione NAC, salvataggi
|
||||
// ---------------------------------------------------------------
|
||||
|
20
ha/halib.cpp
20
ha/halib.cpp
@ -32,6 +32,26 @@ char TContratto_premi::tipo_contratto() const
|
||||
return 'P';
|
||||
}
|
||||
|
||||
char TContratto_premi::frequenza() const
|
||||
{
|
||||
char f = get_char(DOC_CATVEN);
|
||||
if (f < 'A') f = 'A';
|
||||
return f;
|
||||
}
|
||||
|
||||
bool TContratto_premi::data_valida(const TDate& datadoc) const
|
||||
{
|
||||
const TDate i = data_inizio();
|
||||
if (i.ok() && datadoc < i)
|
||||
return false;
|
||||
|
||||
const TDate f = data_fine();
|
||||
if (f.ok() && datadoc > f)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
long TContratto_premi::codcf_fatt() const
|
||||
{
|
||||
long cod = get_long(DOC_DOC2);
|
||||
|
@ -27,12 +27,17 @@
|
||||
|
||||
class TContratto_premi : public TDocumento
|
||||
{
|
||||
static TString4 _tipo_ant, _tipo_post, _tipo_rifa;
|
||||
static TString4 _tipo_ant, _tipo_post, _tipo_rifa;
|
||||
|
||||
public:
|
||||
char tipo_contratto() const;
|
||||
char frequenza() const;
|
||||
long codcf_fatt() const;
|
||||
|
||||
TDate data_inizio() const { return get_date(DOC_DATACOMP); }
|
||||
TDate data_fine() const { return get_date(DOC_DATAFCOMP); }
|
||||
bool data_valida(const TDate& datadoc) const;
|
||||
|
||||
TContratto_premi(char provv, int anno, const char* codnum, long ndoc);
|
||||
TContratto_premi(const TRectype& rec_doc);
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user