Patch level : 12.0 no-patch

Files correlati     : tf
Commento            : Inizio preparazione modifiche esterometro discusse in riunione.
- Aggiunti filtri clienti per webapp, esteri e soggetti
- Aggiunti filtri fornitori per esteri e soggetti
- Pulizia del codice generale
This commit is contained in:
Mattia Tollari 2019-03-07 18:11:41 +01:00
parent d273645f03
commit 3798a79bd0
10 changed files with 785 additions and 567 deletions

View File

@ -10,7 +10,7 @@
/////////////////////////////////////////////////////////////////////////////////////
// Le funzioni quelle belle
TString getTipoDoc(int id)
TString get_tipo_doc(int id)
{
TString ret;
switch(id)
@ -42,27 +42,33 @@ TString getTipoDoc(int id)
case B_TIPO_FATTSCO:
ret = "FS";
break;
/*
case B_TIPO_CORRNINC:
ret = "CN";
case B_ESTEROMETRO:
ret = "ESTER";
break;
case B_TIPO_CORR:
ret = "CR";
case B_PAF_NOT_SENT:
ret = "PAF_NS";
break;
case B_TIPO_RICFIS:
ret = "RF";
case B_PAF_SENT:
ret = "PAF_S";
break;
case B_TIPO_RICFISNI:
ret = "RN";
case B_PAF_SOG_FAT:
ret = "PAF_SF";
break;
case B_TIPO_SCONT:
ret = "SC";
case B_PAF_ESTERI:
ret = "PAF_E";
break;
case B_TIPO_SCONTNI:
ret = "SN";
case B_PAA_NOT_SENT:
ret = "PAA_NS";
break;
case B_PAA_SENT:
ret = "PAA_S";
break;
case B_PAA_ESTERI:
ret = "PAA_E";
break;
case B_PAA_SOG_FAT:
ret = "PAA_SF";
break;
*/
default:
ret = "ERR";
break;
@ -70,23 +76,17 @@ TString getTipoDoc(int id)
return ret;
}
int getTipoDoc(TString id)
int get_tipo_doc(const TString id)
{
int ret = -1;
if(id == "AF") ret = B_TIPO_AUTOFATT;
if(id == "AF") ret = B_TIPO_AUTOFATT;
else if(id == "BD") ret = B_TIPO_BOLLADOG;
// else if(id == "CN") ret = B_TIPO_CORRNINC;
// else if(id == "CR") ret = B_TIPO_CORR;
else if(id == "FA") ret = B_TIPO_FATTACQ;
else if(id == "FF") ret = B_TIPO_FATTFISC;
else if(id == "FS") ret = B_TIPO_FATTSCO;
else if(id == "FV") ret = B_TIPO_FATTVEN;
else if(id == "NC") ret = B_TIPO_NOTC;
else if(id == "ND") ret = B_TIPO_NOTD;
// else if(id == "RF") ret = B_TIPO_RICFIS;
// else if(id == "RN") ret = B_TIPO_RICFISNI;
// else if(id == "SC") ret = B_TIPO_SCONT;
// else if(id == "SN") ret = B_TIPO_SCONTNI;
else if(id == "ST") ret = B_TIPO_STORDOC;
return ret;
}
@ -133,7 +133,7 @@ bool xvt_fsys_fupdate(const char* src, const char* dst)
* TD10: Fatt di acquisto intra beni
* TD11: Fatt di acquisto intra servizi
*/
const char* decodTipo(TToken_string* strarr)
const char* decod_tipo(TToken_string* strarr)
{
const TString tipodoc = strarr->get(_codnum);
TRectype mov = cache().get(LF_MOV, strarr->get(_numero));
@ -178,18 +178,18 @@ const char* decodTipo(TToken_string* strarr)
intraval.get_keys(keys);
for(int i = 0; i < keys.items(); i++)
{
TString key = *(TString*)keys.objptr(i);
real valItem = *(real*)intraval.objptr(key);
if(valItem > max)
TString key = *static_cast<TString*>(keys.objptr(i));
real val_item = *static_cast<real*>(intraval.objptr(key));
if(val_item > max)
{
keyMax = key;
max = valItem;
max = val_item;
}
}
// Una volta che ho trovato il nostro vincitore vado a prendere il tipo di fattura dal GCS
TString keyPCon = keyMax.ssub(keyMax.find('|') + 1);
if(cache().get(LF_PCON, keyPCon, "RICSER") == "1")
TString key_p_con = keyMax.ssub(keyMax.find('|') + 1);
if(cache().get(LF_PCON, key_p_con, "RICSER") == "1")
return "TD11";
else
return "TD10";
@ -230,48 +230,48 @@ const char* decodTipo(TToken_string* strarr)
}
/* Salvo il record modificato in TFCustom */
bool saveRec(TToken_string row, bool esportato)
bool save_rec(TToken_string row, const bool esportato)
{
static TLocalisamfile trasfatt(LF_TRASFATT);
static TLocalisamfile mov(LF_MOV);
static TString invio; invio.cut(0);
static TString key; key.cut(0) << row.get(_numero) << "|"<< row.get(_aliquota);
TRectype rCust = cache().get(LF_TRASFATT, key);
TRectype r_cust = cache().get(LF_TRASFATT, key);
// Se la riga non esiste metto la chiave
if(rCust.empty())
if(r_cust.empty())
{
rCust.put("NUMREG", row.get(_numero));
r_cust.put("NUMREG", row.get(_numero));
}
rCust.put("TIPO", row.get(_tipocf));
rCust.put("CODCF", row.get(_codcf));
rCust.put("OCCAS", row.get(_occas));
rCust.put("TIPODOC", row.get(_codnum));
rCust.put("TIPODOCAE", row.get(_codnumAE));
rCust.put("NUMDOC", row.get(_numdoc));
rCust.put("DATAREG", row.get(_datareg));
rCust.put("DATADOC", row.get(_datadoc));
rCust.put("IMPONIBILE", row.get(_imponibile));
rCust.put("IMPOSTA", row.get(_importoIVA));
rCust.put("CODIVA", row.get(_aliquota));
rCust.put("NATURA", row.get(_natura));
rCust.put("AUTOFATT", row.get(_autofatt));
r_cust.put("TIPO", row.get(_tipocf));
r_cust.put("CODCF", row.get(_codcf));
r_cust.put("OCCAS", row.get(_occas));
r_cust.put("TIPODOC", row.get(_codnum));
r_cust.put("TIPODOCAE", row.get(_codnumAE));
r_cust.put("NUMDOC", row.get(_numdoc));
r_cust.put("DATAREG", row.get(_datareg));
r_cust.put("DATADOC", row.get(_datadoc));
r_cust.put("IMPONIBILE", row.get(_imponibile));
r_cust.put("IMPOSTA", row.get(_importoIVA));
r_cust.put("CODIVA", row.get(_aliquota));
r_cust.put("NATURA", row.get(_natura));
r_cust.put("AUTOFATT", row.get(_autofatt));
if(esportato)
{
invio << "I";
rCust.put("TFDATA", TDate(TODAY));
r_cust.put("TFDATA", TDate(TODAY));
}
else
{
invio << row.get(_invio);
}
rCust.put("TFINVIO", invio);
r_cust.put("TFINVIO", invio);
return rCust.write_rewrite(trasfatt) == NOERR;
return r_cust.write_rewrite(trasfatt) == NOERR;
}
inline const char * noSpecial(char a)
inline const char * no_special(const char a)
{
if(a == 'à')
return "a''";
@ -289,14 +289,14 @@ inline const char * noSpecial(char a)
bool bd2017()
{
static TDate today = TDate(TODAY), lastDay = TDate(31,12,2017);
return today <= lastDay;
static TDate today = TDate(TODAY), last_day = TDate(31,12,2017);
return today <= last_day;
}
TTrFa_mask& msk()
{
static TTrFa_mask* msk = NULL;
if (msk == NULL)
static TTrFa_mask* msk = nullptr;
if (msk == nullptr)
msk = new TTrFa_mask("tf0100a");
return *msk;
}
@ -419,7 +419,7 @@ const TString& TTrFa_record::var2str(const TString& fldname, const TVariant& var
{
if (tmp[a] == speciali[i])
{
tmp2.cut(0) << tmp.left(a) << noSpecial(speciali[i]) << tmp.mid(a+1);
tmp2.cut(0) << tmp.left(a) << no_special(speciali[i]) << tmp.mid(a+1);
tmp = tmp2;
}
}
@ -544,15 +544,15 @@ void TTrFa_app::log(int severity, const char* msg)
{
if (severity < 0)
{
_logTFF = msg;
_log_tff = msg;
} else
if (_log == NULL)
{
_log = new TLog_report;
if (_logTFF.full())
if (_log_tff.full())
{
TString txt;
txt << _logTFF << ": " << msg;
txt << _log_tff << ": " << msg;
_log->log(severity, txt);
}
else
@ -685,7 +685,7 @@ bool TTrFa_app::create()
return false;
// Questa funzione crea/verifica il DB
verifyDB(create);
verify_db(create);
// Setto se ha il modulo FP
msk().set_has_fp(has_module(FPAUT));
@ -694,28 +694,28 @@ bool TTrFa_app::create()
}
// Sincronizzo il DB SQL con quello di campo
bool TTrFa_app::syncronizeDB()
bool TTrFa_app::syncronize_db()
{
//xvt_sql_begin(_db);
return true;
}
bool TTrFa_app::verifyDB(const bool create)
bool TTrFa_app::verify_db(const bool create)
{
const TFilename ini = "tff.ini";
bool ok = ini.exist();
if (ok)
{
xvt_sql_begin(_db);
TScanner TFF(ini);
while (ok && !TFF.eof())
TScanner tff(ini);
while (ok && !tff.eof())
{
const TString& p = TFF.line();
const TString& p = tff.line();
if (p.starts_with("[TF") && p.ends_with("F]"))
{
TString16 table = p; table.strip("[]");
ok = create_table(TFF, table);
ok = create_table(tff, table);
}
}
if(ok && create)
@ -740,7 +740,7 @@ bool TTrFa_app::verifyDB(const bool create)
return true;
}
bool TTrFa_app::copySSA()
bool TTrFa_app::copy_ssa()
{
TFilename tmp;
@ -772,14 +772,14 @@ bool TTrFa_app::copySSA()
bool TTrFa_app::send(TTrFa_mask* msk)
{
// Controllo se è la prima esecuzione, in caso positivo chiedo se vuole controllare p.iva e cf
bool first = ini_get_bool(CONFIG_DITTA, "tf", "FirstExec", true);
const bool first = ini_get_bool(CONFIG_DITTA, "tf", "FirstExec", true);
if(first)
{
ini_set_bool(CONFIG_DITTA, "tf", "FirstExec", false);
if(yesno_box("Stai eseguendo il programma per la prima volta,\nvuoi controllare di avere tutti i Codici Fiscali e Partite IVA corrette?"))
{
TExternal_app checkApp("cg1 -2 L");
checkApp.run();
TExternal_app check_app("cg1 -2 L");
check_app.run();
if(!yesno_box("Desideri proseguire con l'esportazione?"))
{
return false;
@ -812,11 +812,11 @@ bool TTrFa_app::send(TTrFa_mask* msk)
// Imposto l'esportazione
if(yesno_box("Vuoi segnare i record esportati?"))
{
if(setEsportato(sheet))
if(set_esportato(sheet))
message_box("Record segnati correttamente!");
else
message_box("Ci sono stati degli errori durante la riscrittura dei records");
msk->setFilterChanged();
msk->set_filter_changed();
}
}
@ -825,21 +825,21 @@ bool TTrFa_app::send(TTrFa_mask* msk)
return true;
}
TString TTrFa_app::getKey(TToken_string* strarr)
TString TTrFa_app::get_key(TToken_string* strarr)
{
return strarr->get_char(_tipocf) == 'C' ? DTE_PROVV : DTR_PROVV;
}
TString TTrFa_app::getHeader(TToken_string* strarr)
TString TTrFa_app::get_header(TToken_string* strarr)
{
/* Devo crearmi una struttura dove immagazzino delle strutture di clienti e all'interno ci metto i numeratori che mi chiedono
* Così facendo mando a puttane persino l'append che potevo tranquillamente implementare prima e creare fastidiose query per capire dove cazzo sto
*/
// Chiave header (20): TIPOCF(1) + CODCF(6)
static long int idHeader = 0L;
static long int id_header = 0L;
// Cerco/Aggiungo il Clifo all'std::map
static TString keyMap; keyMap.cut(0);
static TString key_map; key_map.cut(0);
static TString tipocf, codcf, occas;
tipocf.cut(0); codcf.cut(0); occas.cut(0);
@ -858,29 +858,29 @@ TString TTrFa_app::getHeader(TToken_string* strarr)
occas << strarr->get(_occas);
}
keyMap << tipocf << "|" << codcf << "|" << occas;
key_map << tipocf << "|" << codcf << "|" << occas;
clifoDoc app;
clifo_doc app;
// Non è presente e lo inserisco per la chiave body
if(mCliDoc.find(keyMap) == mCliDoc.end())
if(_m_cli_doc.find(key_map) == _m_cli_doc.end())
{
idHeader++;
app.contCliFo = idHeader;
app.countDoc = 0L;
mCliDoc.insert(std::pair<TString,clifoDoc>(keyMap, app));
id_header++;
app._cont_cli_fo = id_header;
app._count_doc = 0L;
_m_cli_doc.insert(std::pair<TString,clifo_doc>(key_map, app));
}
static TString header;
static TString formatString; formatString.cut(0) << "%c%0";
static TString format_string; format_string.cut(0) << "%c%0";
if(occas.blank())
{
formatString << 13 - codcf.len() << "d";
header.format(formatString, tipocf[0], 0);
format_string << 13 - codcf.len() << "d";
header.format(format_string, tipocf[0], 0);
header << codcf; // Perchè cazzo non va il %s!?
}
else
{
formatString << 13 - occas.len() << "d";
header.format(formatString, 'O', 0);
format_string << 13 - occas.len() << "d";
header.format(format_string, 'O', 0);
header << occas;
}
@ -888,23 +888,23 @@ TString TTrFa_app::getHeader(TToken_string* strarr)
return header;
}
TString TTrFa_app::getBody(TToken_string* strarr, bool add)
TString TTrFa_app::get_body(TToken_string* strarr, bool add)
{
/* Sembra che utilizzare identificatori chiari e sensati in questo mondo non è concesso, quindi adesso vi sbatto un bell'ID numerico
* Ok per OGNI cliente devo assegnarli un identificativo del numero della fattura
*/
static TString keyMap; keyMap.cut(0) << strarr->get_char(_tipocf) << "|" << strarr->get_int(_codcf) << "|" << strarr->get(_occas);
static TString key_map; key_map.cut(0) << strarr->get_char(_tipocf) << "|" << strarr->get_int(_codcf) << "|" << strarr->get(_occas);
clifoDoc app = mCliDoc[keyMap];
static TString numDoc; numDoc.cut(0) << strarr->get(_numdoc) << "|" << TDate(strarr->get(_datadoc)).year();
clifo_doc app = _m_cli_doc[key_map];
static TString num_doc; num_doc.cut(0) << strarr->get(_numdoc) << "|" << TDate(strarr->get(_datadoc)).year();
if(add)
{
app.countDoc += 1;
app.docID.insert(std::pair<TString,long>(numDoc, app.countDoc));
app._count_doc += 1;
app._doc_id.insert(std::pair<TString,long>(num_doc, app._count_doc));
}
mCliDoc[keyMap] = app;
_m_cli_doc[key_map] = app;
static TString body; body.format("%07d%07d", app.contCliFo, app.docID[numDoc]);
static TString body; body.format("%07d%07d", app._cont_cli_fo, app._doc_id[num_doc]);
return body;
}
@ -934,13 +934,13 @@ bool TTrFa_app::tff0100(TSheet_field& sheet)
// Controllo la presenza di un caricamento in attesa
if(dte.search(DTE_PROVV))
{
bool sent = dte.get("P1_KEYPRGINVIO").as_string() == DTE_PROVV;
const bool sent = dte.get("P1_KEYPRGINVIO").as_string() == DTE_PROVV;
if(sent)
{
TString msg = "É presente un'altra esportazione non ancora elaborata vuoi eliminarla?";
static const TString msg = "É presente un'altra esportazione non ancora elaborata vuoi eliminarla?";
if(yesno_box(msg))
{
if(!emptyTables(DTE_PROVV))
if(!empty_tables(DTE_PROVV))
{
error_box("Fallita eliminazione record!!!");
return false;
@ -969,13 +969,13 @@ bool TTrFa_app::tff0100(TSheet_field& sheet)
// Controllo la presenza di un caricamento in attesa
if(dtr.search(DTR_PROVV))
{
bool sent = dtr.get("P1_KEYPRGINVIO").as_string() == DTR_PROVV;
TString msg = "É presente un'altra esportazione non ancora elaborata vuoi eliminarla?";
const bool sent = dtr.get("P1_KEYPRGINVIO").as_string() == DTR_PROVV;
static const TString msg = "É presente un'altra esportazione non ancora elaborata vuoi eliminarla?";
if(sent)
{
if(yesno_box(msg))
{
if(!emptyTables(DTR_PROVV))
if(!empty_tables(DTR_PROVV))
{
error_box("Fallita eliminazione record!!!");
return false;
@ -999,7 +999,7 @@ bool TTrFa_app::tff0100(TSheet_field& sheet)
return ok;
}
bool TTrFa_app::tff0200(TString key)
bool TTrFa_app::tff0200(const TString& key)
{
/********************************************************************************************************************
* Cedeprest *
@ -1038,10 +1038,10 @@ bool TTrFa_app::tff0200(TString key)
tff0200f.set("P2_SEDENAZ", nazione);
}
myrfso = "";
if(haveRFSO(myrfso))
_myrfso = "";
if(have_rfso(_myrfso))
{
TRectype r_ana = cache().get(LF_ANAG, TString(myrfso.left(1)) << "|" << myrfso.sub(1));
TRectype r_ana = cache().get(LF_ANAG, TString(_myrfso.left(1)) << "|" << _myrfso.sub(1));
if(r_ana.get_char("TIPORFSO") == 'S') // Stabile Organizzazione
{
TAnagrafica rfso(r_ana);
@ -1161,8 +1161,8 @@ bool TTrFa_app::tff0400(TSheet_field& sheet)
}
TTrFa_record tff0400f("TFF0400F");
tff0400f.set("P4_KEYPRGINVIO", getKey(strarr));
tff0400f.set("P4_KEYHEADERFATT", getHeader(strarr));
tff0400f.set("P4_KEYPRGINVIO", get_key(strarr));
tff0400f.set("P4_KEYHEADERFATT", get_header(strarr));
// Autofattura
if(strcmp(strarr->get(_autofatt),"X") == 0)
@ -1351,30 +1351,30 @@ bool TTrFa_app::tff0700(TSheet_field& sheet)
// <DatiFatturaBody>
TTrFa_record tff0700f("TFF0700F");
tff0700f.set("P7_KEYPRGINVIO", getKey(strarr));
tff0700f.set("P7_KEYPRGINVIO", get_key(strarr));
static TString header;
header.cut(0) << getHeader(strarr);
header.cut(0) << get_header(strarr);
tff0700f.set("P7_KEYHEADERFATT", header);
tff0700f.set("P7_KEYBODYFATT", getBody(strarr));
tff0700f.set("P7_KEYBODYFATT", get_body(strarr));
TString natura = strarr->get(_natura);
tff0700f.set("P7_TIPODOC", strarr->get(_codnumAE));
// Controllo il tipo di esigilità
tff0700f.set("P7_DATA", toDate(strarr->get(_datadoc)));
tff0700f.set("P7_DATA", to_date(strarr->get(_datadoc)));
static TString ndoc;
ndoc.cut(0) << cache().get(LF_MOV, strarr->get(_numero), "NUMDOCEXT").right(20);
if(ndoc.blank())
ndoc.cut(0) << strarr->get(_numdoc);
tff0700f.set("P7_NUMERO", ndoc);
tff0700f.set("P7_DATAREG", toDate(strarr->get(_datareg))); // Obbligatoria nei DTR
tff0700f.set("P7_DATAREG", to_date(strarr->get(_datareg))); // Obbligatoria nei DTR
tff0700f.set("P7_GESTIONE", "");
// Campi di controllo
tff0700f.set("P7_CLIFOR", header);
tff0700f.set("P7_NRODOC", ndoc);
tff0700f.set("P7_DTADOC", toDate(strarr->get(_datadoc)));
tff0700f.set("P7_DTADOC", to_date(strarr->get(_datadoc)));
ok = tff0700f.insert();
@ -1383,7 +1383,7 @@ bool TTrFa_app::tff0700(TSheet_field& sheet)
if(!ok) return false;
}
// In qualsiasi caso va messa la riga ma prima elaboro il numero della riga!
static TString newKey; newKey.cut(0) << getBody(strarr, false);
static TString newKey; newKey.cut(0) << get_body(strarr, false);
if(docRighe.find(newKey) == docRighe.end())
{
@ -1408,9 +1408,9 @@ bool TTrFa_app::tff0700(TSheet_field& sheet)
bool TTrFa_app::tff2200(TToken_string* strarr, int nriga)
{
TTrFa_record tff2200f("TFF2200F");
tff2200f.set("PL_KEYPRGINVIO", getKey(strarr));
tff2200f.set("PL_KEYHEADERFATT", getHeader(strarr));
tff2200f.set("PL_KEYBODYFATT", getBody(strarr, false));
tff2200f.set("PL_KEYPRGINVIO", get_key(strarr));
tff2200f.set("PL_KEYHEADERFATT", get_header(strarr));
tff2200f.set("PL_KEYBODYFATT", get_body(strarr, false));
TString numriga; numriga.format("%020d", nriga);
@ -1446,8 +1446,8 @@ bool TTrFa_app::tff2200(TToken_string* strarr, int nriga)
bool TTrFa_app::tff3100(TToken_string* strarr, TRectype r_ana)
{
TTrFa_record tff3100f("TFF3100F");
tff3100f.set("PH_KEYPRGINVIO", getKey(strarr));
tff3100f.set("PH_KEYHEADERFATT", getHeader(strarr));
tff3100f.set("PH_KEYPRGINVIO", get_key(strarr));
tff3100f.set("PH_KEYHEADERFATT", get_header(strarr));
if(_append)
tff3100f.remove();
@ -1496,7 +1496,7 @@ bool TTrFa_app::tff3100(TToken_string* strarr, TRectype r_ana)
return tff3100f.insert();
}
bool TTrFa_app::setEsportato(TSheet_field& sheet)
bool TTrFa_app::set_esportato(TSheet_field& sheet)
{
bool ok = true;
TProgress_monitor p(sheet.items(),"Segno l'esportazione sui records");
@ -1507,7 +1507,7 @@ bool TTrFa_app::setEsportato(TSheet_field& sheet)
TString modificato = strarr->get(_forzata);
if(modificato == "X")
{
ok = saveRec(*strarr, true);
ok = save_rec(*strarr, true);
if(!ok) return false;
}
else
@ -1526,7 +1526,7 @@ bool TTrFa_app::setEsportato(TSheet_field& sheet)
return ok;
}
bool TTrFa_app::emptyTables(TString key)
bool TTrFa_app::empty_tables(TString key)
{
TString query;
query << "DELETE FROM TFF0100F WHERE P1_KEYPRGINVIO = '" << key << "';\n";
@ -1542,11 +1542,11 @@ bool TTrFa_app::emptyTables(TString key)
void TTrFa_app::main_loop()
{
// Sposto SSA
if(!copySSA()) return;
if(!copy_ssa()) return;
while (msk().run() == K_ENTER)
{
if(msk().checkNotEmpty())
if(msk().check_not_empty())
{
send(&msk());
//ini_set_string(CONFIG_DITTA, "tf", "LastSend", ++TDate(msk.get(F_DATAFIN)));

View File

@ -1,62 +1,72 @@
#define START_MASK 401
#define START_MASK 401
#define F_DATAINI 401
#define F_DATAFIN 402
#define F_TIPOCF 403
#define F_CODCF 404
#define F_RAGSOC 405
#define F_FATTSEL 406
#define F_DATAINI 401
#define F_DATAFIN 402
#define F_TIPOCF 403
#define F_CODCF 404
#define F_RAGSOC 405
#define F_FATTSEL 406
/* Campi booleani documento */
#define START_BOOLEAN 407
#define START_BOOLEAN 407
#define START_BOOLEAN_FATT 407
#define B_TIPO_AUTOFATT 407
#define B_TIPO_FATTACQ 408
#define B_TIPO_FATTFISC 409
#define B_TIPO_FATTVEN 410
#define B_TIPO_FATTSCO 415
#define B_TIPO_NOTC 411
#define B_TIPO_NOTD 412
#define B_TIPO_BOLLADOG 413
#define B_TIPO_STORDOC 414
#define B_TIPO_AUTOFATT 407
#define B_TIPO_FATTACQ 408
#define B_TIPO_FATTFISC 409
#define B_TIPO_FATTVEN 410
#define B_TIPO_FATTSCO 415
#define B_TIPO_NOTC 411
#define B_TIPO_NOTD 412
#define B_TIPO_BOLLADOG 413
#define B_TIPO_STORDOC 414
#define END_BOOLEAN_FATT 415
// Boolean filtri FP
#define B_ESTEROMETRO 416
#define B_PAF_SENT 417
#define B_PAF_NOT_SENT 418
#define B_REVCHARGE 419
#define B_ESTEROMETRO 416
#define B_PAF_NOT_SENT 417
#define B_PAF_SENT 418
#define B_PAF_SOG_FAT 419
#define B_PAF_ESTERI 420
#define END_BOOLEAN 419
#define B_PAA_NOT_SENT 421
#define B_PAA_SENT 422
#define B_PAA_ESTERI 423
#define B_PAA_SOG_FAT 424
#define END_MASK 421
#define END_BOOLEAN 424
#define F_RIGHE 301 // Sheet righe tf
#define END_MASK 424
#define START_SHEET 101
#define A_DATAREG 101
#define A_TIPODOC 102
#define A_TIPODOCAE 103
#define A_NUMDOC 104
#define A_DATADOC 105
#define A_ALIQUOTA 106
#define A_IMPONIBILE 107
#define A_IMPOSTA 108
#define A_NATURA 109
#define A_DETRAIB 110
#define A_TIPOCF 111
#define A_CODCF 112
#define A_OCFPI 113
#define A_RAGSOC 114
#define A_RFSO 115
#define A_RAGSOCRFSO 116
#define A_PAIV 117
#define A_COFI 118
#define A_REVERSE 119
#define A_AUTOFATT 120
#define A_SPEDITA 121
#define A_INVIO 122
#define A_FORZATA 123
#define A_NUMERO 124
#define A_CODERR 125
#define F_RIGHE 301 // Sheet righe tf
#define END_SHEET 125
#define START_SHEET 101
#define A_DATAREG 101
#define A_TIPODOC 102
#define A_TIPODOCAE 103
#define A_NUMDOC 104
#define A_DATADOC 105
#define A_ALIQUOTA 106
#define A_IMPONIBILE 107
#define A_IMPOSTA 108
#define A_NATURA 109
#define A_DETRAIB 110
#define A_TIPOCF 111
#define A_CODCF 112
#define A_OCFPI 113
#define A_RAGSOC 114
#define A_RFSO 115
#define A_RAGSOCRFSO 116
#define A_PAIV 117
#define A_COFI 118
#define A_REVERSE 119
#define A_AUTOFATT 120
#define A_SPEDITA 121
#define A_INVIO 122
#define A_FORZATA 123
#define A_NUMERO 124
#define A_CODERR 125
#define END_SHEET 125

View File

@ -37,6 +37,12 @@ BEGIN
PICTURE TOOL_EMAIL
END
BUTTON DLG_PDF 2 2
BEGIN
PROMPT 1 1 "Cambio stato"
PICTURE TOOL_EDIT
END
#include <helpbar.h>
ENDPAGE
@ -165,38 +171,78 @@ BEGIN
FLAGS ""
END
GROUPBOX DLG_NULL 65 6
BEGIN
PROMPT 30 11 "Filtri clienti FP"
MODULE FP
END
ENDPAGE
PAGE "Esterometro" 0 2 0 0
BOOLEAN B_ESTEROMETRO
BEGIN
PROMPT 31 12 "Modalità esterometro"
MESSAGE FALSE DISABLE,10@
MESSAGE TRUE ENABLE,10@
PROMPT 1 1 "Modalità esterometro"
MESSAGE FALSE DISABLE,10@ | DISABLE,20@
MESSAGE TRUE ENABLE,10@ | ENABLE,20@
END
BOOLEAN B_PAF_SENT
GROUPBOX DLG_NULL 65 6
BEGIN
PROMPT 31 13 "Fatture Inviate"
GROUP 10
FLAGS ""
PROMPT 0 2 "Clienti FP"
MODULE FP
END
BOOLEAN B_PAF_NOT_SENT
BEGIN
PROMPT 31 14 "Fatture non Inviate"
PROMPT 1 3 "Fatture non inviate (Fatturazione Campo)"
GROUP 10
END
BOOLEAN B_PAF_SENT
BEGIN
PROMPT 1 4 "Fatture inviate (Fatturazione Campo)"
GROUP 10
END
BOOLEAN B_PAF_SOG_FAT
BEGIN
PROMPT 1 5 "Soggetti a fatturazione elettronica"
GROUP 10
END
BOOLEAN B_PAF_ESTERI
BEGIN
PROMPT 1 6 "Esteri"
GROUP 10
END
GROUPBOX DLG_NULL 65 6
BEGIN
PROMPT 0 8 "FORNITORI FP"
MODULE FP
END
BOOLEAN B_PAA_NOT_SENT
BEGIN
PROMPT 1 9 "Fatture non ricevute (Fatturazione Campo)"
GROUP 10
FLAGS "H"
END
BOOLEAN B_PAA_SENT
BEGIN
PROMPT 1 10 "Fatture ricevute (Fatturazione Campo)"
GROUP 10
FLAGS "H"
END
BOOLEAN B_PAA_ESTERI
BEGIN
PROMPT 1 11 "Esteri"
GROUP 20
FLAGS ""
END
BOOLEAN B_REVCHARGE
BOOLEAN B_PAA_SOG_FAT
BEGIN
PROMPT 31 15 "Fatture in reverse charge"
GROUP 10
FLAGS ""
PROMPT 1 12 "Soggetti a fatturazione elettronica"
GROUP 20
END
ENDPAGE

View File

@ -1,3 +1,5 @@
#pragma once
#include <applicat.h>
#include <automask.h>
#include <config.h>
@ -39,7 +41,7 @@ enum return_code
// Su DB: X o ''->Da inviare, F->Forzato, I->Inviato, N->Non inviare
enum filter_fatt
{
toSend, // "", "X", "F", "E"
to_send, // "", "X", "F", "E"
sent, // "I"
untouched, // "", "X"
forced, // "F"
@ -59,8 +61,6 @@ enum filter_fatt
#define FLAG_FORZATO "F"
#define FLAG_INVIATO "I"
#define SPESOMETROBASE "ModuliSirio"
#define REG_ATT 1
#define REG_PAS 2
#ifndef CARATTERI_SPECIALI
#define CARATTERI_SPECIALI "àèéìòù°"
@ -68,7 +68,7 @@ enum filter_fatt
/* Così facendo basta modificare la maschera (e le dichiarazioni di conseguenza)
* per avere l'inserimento nello sheet corretto */
enum spesometroFields{
enum spesometro_fields{
_spedita = A_SPEDITA - SHEET_GAP,
_invio = A_INVIO - SHEET_GAP,
_forzata = A_FORZATA - SHEET_GAP,
@ -101,23 +101,23 @@ enum spesometroFields{
/////////////////////////////////////////////////////////////////////////////////////
// Da un id ritorna il tipo doc corrispondente
TString getTipoDoc(int id);
int getTipoDoc(TString id);
TString get_tipo_doc(int id);
int get_tipo_doc(TString id);
// Cerca una stringa all'interno di una SLIST (Potrebbe diventare una funzione di XVT.h)
static SLIST_ELT xvt_slist_find_str(SLIST list, const char* str);
// Aggiorna il file dst se più vecchio di src (Potrebbe diventare una funzione di XVT.h)
bool xvt_fsys_fupdate(const char* src, const char* dst);
// Decodifica il tipo di documento per il trasferimento fatture
const char * decodTipo(TToken_string* strarr);
const char * decod_tipo(TToken_string* strarr);
// Salvo un singolo record
bool saveRec(TToken_string row, bool esportato = false);
bool save_rec(TToken_string row, bool esportato = false);
// Ritorno una data in formato ANSI
inline TDate toDate(const char * date) { return TDate(date).string(); }
inline TDate to_date(const char * date) { return TDate(date).string(); }
// Salto se la riga non è abilitata
#define IF_IS_ENABLED(strarr) if(strcmp(strarr->get(_invio), FLAG_INVIO) != 0 && strcmp(strarr->get(_invio), FLAG_FORZATO) != 0 && strcmp(strarr->get(_invio), FLAG_INVIATO) != 0) continue;
// Ritorno il carattere senza accento maiuscolo
inline const char * noSpecial(char a);
inline const char * no_special(char a);
// Ritorno se è ancora valida la bolla doganale senza informazioni fornitore
bool bd2017();
@ -152,8 +152,8 @@ public:
bool search();
bool search(const char* k1, const char* k2 = NULL, const char* k3 = NULL);
virtual TObject* dup() const { return new TTrFa_record(*this); }
virtual bool ok() const { return _table.not_empty(); }
TObject* dup() const override { return new TTrFa_record(*this); }
bool ok() const override { return _table.not_empty(); }
TTrFa_record& operator=(const TTrFa_record& rec) { copy(rec); return *this; }
TTrFa_record(const TTrFa_record& rec) { copy(rec); }
@ -170,26 +170,44 @@ public:
class TTrFa_cursors : TObject
{
friend class TCursor;
TISAM_recordset* c_rmoviva;
TISAM_recordset* c_trasfatt;
bool _newMov;
bool _newCust;
TISAM_recordset* _c_rmoviva;
TISAM_recordset* _c_trasfatt;
bool _new_mov;
bool _new_cust;
// Se trovo un record custom devo saltare tutti quelli che trovo successivamente, per fare ciò utilizzo una TToken_string
TToken_string _alqCust;
bool _has_fp;
TToken_string _alq_cust;
bool _esterometro;
// paf non inviati
bool _paf_ns;
// paf inviati
bool _paf_s;
// paf sogg. fatt
bool _paf_sf;
// paf esteri
bool _paf_e;
// paa non inviati
bool _paa_ns;
// paa inviati
bool _paa_s;
// paa sogg. fatt
bool _paa_sf;
// paa esteri
bool _paa_e;
TRectype _next(return_code& code, TString& tipocf, TString& codcf, TString& ocfpi); // Si sposta avanti di un elemento
TRectype _nextCust(return_code& code, TString& tipocf, TString& codcf, TString& ocfpi); // Si sposta avanti di un elemento tra quelli custom
bool checkEnabled(TISAM_recordset* origCur);
TRectype _next_cust(return_code& code, TString& tipocf, TString& codcf, TString& ocfpi); // Si sposta avanti di un elemento tra quelli custom
bool check_enabled(TISAM_recordset* orig_cur);
void reset_esterometro();
public:
TTrFa_cursors(bool has_fp) : c_rmoviva(nullptr), c_trasfatt(nullptr), _newMov(false), _newCust(false), _has_fp(has_fp){}
TTrFa_cursors();
~TTrFa_cursors();
long int getIvaItems() { return c_rmoviva->items(); }
long int getIvaPos() { return c_rmoviva->cursor()->pos(); }
TRectype getIva() { return c_rmoviva->cursor()->curr(); }
long int get_iva_items() const { return _c_rmoviva->items(); }
long int get_iva_pos() const { return _c_rmoviva->cursor()->pos(); }
TRectype get_iva() const { return _c_rmoviva->cursor()->curr(); }
int next(TAssoc_array& recimposte, bool& ok, TString& tipocf, TString& codcf, TString& ocfpi); // Legge tutto il prossimo movimento, in importi mette per ogni codiva la somma
int updateFilters(const char tipocf, const long codcf, TDate dal, TDate al, int cod = toSend);
int update_filters(const char tipocf, const long codcf, TDate dal, TDate al, int cod = to_send);
};
/////////////////////////////////////////////////////////////////////////////////////
@ -206,51 +224,51 @@ class TTrFa_mask : public TAutomask
bool _has_fp;
protected:
virtual void next_page(int p);
TRecnotype nuovo_progr() const;
void changeInvio(TString tipocf, TString codcf, TString numdoc, TString invio) const;
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
void openJava();
void next_page(int p) override;
static TRecnotype nuovo_progr();
void change_invio(const TString& tipocf, const TString& codcf, const TString& numdoc, const TString& invio) const;
bool on_field_event(TOperable_field& o, TField_event e, long jolly) override;
void open_java();
public:
void set_has_fp(bool has_fp) { _has_fp = has_fp; }
void setFilterChanged() { _filter_changed = true; }
void set_has_fp(const bool has_fp) { _has_fp = has_fp; }
void set_filter_changed() { _filter_changed = true; }
void load_sheet();
TTrFa_mask(TString msk);
TTrFa_mask(const TString& msk);
~TTrFa_mask();
// Carico i tipi documento all'inizio
void loadConfig();
void load_config();
// Salvo i tipi documento
void saveConfig();
void save_config() const;
// Salvo tutti i records
bool saveAll();
bool save_all() const;
// Controllo tutti i records
bool checkAll();
bool check_all();
// Testo validità record
bool checkRec(TPrinter* stampa, TToken_string* rec);
static bool check_rec(TPrinter* stampa, TToken_string* rec);
// Controllo che siano presenti records
bool checkNotEmpty();
bool check_not_empty();
// Controllo finale prima di inviare il tutto, se ci sono fatture
// con più volte lo stesso codice aliquota disabilito il precedente
void theFinalCheckDown();
void the_final_check_down();
// Mette il flag di invio = [flag] per la riga numero [nrow]
void flagRow(int nrow, TString flag);
void flag_row(int nrow, const TString& flag);
// Salto se la riga ha un tipo invio non del filtro
bool checkInvio(const TString& invio);
bool check_invio(const TString& invio) const;
};
// Funzione inline di stampa
inline void printError(TPrinter* stampa, TString movimento, TString documento, TString msgerr);
inline void print_error(TPrinter* stampa, const TString& movimento, const TString& documento, const TString& msgerr);
TTrFa_mask& msk();
/////////////////////////////////////////////////////////////////////////////////////
// TTrFa_app
/////////////////////////////////////////////////////////////////////////////////////
struct clifoDoc
struct clifo_doc
{
long contCliFo;
long countDoc;
std::map<TString, long> docID;
long _cont_cli_fo;
long _count_doc;
std::map<TString, long> _doc_id;
};
class TTrFa_app : public TSkeleton_application
@ -259,41 +277,41 @@ class TTrFa_app : public TSkeleton_application
TString16 _cofi;
TFilename _dbname;
TLog_report* _log;
TString _logTFF;
TString _log_tff;
bool _append;
TString myrfso;
static long header;
TString _myrfso;
static long _header;
// Solitamente nei programmi di campo cerco di sfruttare le classi interne ma per mancanza di tempo sono costretto a usare l'std::vector
std::map<TString, clifoDoc> mCliDoc;
std::map<TString, clifo_doc> _m_cli_doc;
private:
int parse_line(const TString& line, TString& var, TString& val) const;
bool create_table(TScanner& TFF, const TString& table);
TString getKey(TToken_string* strarr);
TString getHeader(TToken_string* strarr);
TString getBody(TToken_string* strarr, bool add = true);
bool create_table(TScanner& tff, const TString& table);
static TString get_key(TToken_string* strarr);
TString get_header(TToken_string* strarr);
TString get_body(TToken_string* strarr, bool add = true);
bool tff0100(TSheet_field& sheet); // Header esportazione
bool tff0200(TString key); // Anagrafica ditta
bool tff0200(const TString& key); // Anagrafica ditta
bool tff0300(TString key, TRectype r_ana); // Rappresentante fiscale ditta
bool tff0400(TSheet_field& sheet); // Anagrafica clifo
bool tff0700(TSheet_field& sheet); // Testata documento
bool tff2200(TToken_string* strarr, int nriga); // Riepilogo aliquote
bool tff3100(TToken_string* strarr, TRectype r_ana); // Rappresentante fiscale clifo
bool setEsportato(TSheet_field& sheet);
bool emptyTables(TString key); // Cancella da tutte le tabelle i record con chiave key
bool set_esportato(TSheet_field& sheet);
bool empty_tables(TString key); // Cancella da tutte le tabelle i record con chiave key
protected:
void log(int severity, const char* msg);
bool show_log();
bool syncronizeDB();
bool verifyDB(const bool create);
bool copySSA();
bool syncronize_db();
bool verify_db(const bool create);
bool copy_ssa();
public:
virtual bool create();
virtual bool destroy();
virtual void main_loop();
bool create() override;
bool destroy() override;
void main_loop() override;
bool send(TTrFa_mask* msk);
TTrFa_app() : _log(NULL) {}
TTrFa_app() : _log(nullptr) {}
};

View File

@ -53,17 +53,23 @@ bool TTrFa_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
}
}
break;
case DLG_PDF:
{
TMask cs_mask("Cambiamento stato movimenti", 1, 20, 10);
}
break;
case F_RIGHE:
if (e == se_notify_add)
{
TSheet_field& s = (TSheet_field&)o;
TSheet_field& s = dynamic_cast<TSheet_field&>(o);
TToken_string& row = s.row(jolly);
row.add(nuovo_progr(), s.cid2index(A_NUMERO));
row.add(get(F_TIPOCF), s.cid2index(A_TIPOCF));
} else
if (e == se_query_del)
{
TSheet_field& s = (TSheet_field&)o;
TSheet_field& s = dynamic_cast<TSheet_field&>(o);
TToken_string& row = s.row(jolly);
const TRecnotype progr = row.get_long(0);
return progr >= MOV_CUSTOM;
@ -78,7 +84,7 @@ bool TTrFa_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
// Mi interessa solo fe_edit
if(e != fe_modify) break;
// Controllo che la data sia < della data documento e l'esercizio sia quello richiesto
TDate datareg = o.get(), datadoc = o.mask().get(A_DATADOC);
TDate datareg = static_cast<const char*>(o.get()), datadoc = o.mask().get_date(A_DATADOC);
if(datareg >= get_date(F_DATAINI) && datareg <= get_date(F_DATAFIN))
{
// Controllo la data del documento
@ -102,7 +108,7 @@ bool TTrFa_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
// Mi interessa solo fe_edit
if(e != fe_modify) break;
TDate datareg = o.mask().get(A_DATAREG), datadoc = o.get();
TDate datareg = o.mask().get_date(A_DATAREG), datadoc = static_cast<const char*>(o.get());
// Controllo la data di registrazione
if(datareg.ok())
{
@ -120,7 +126,7 @@ bool TTrFa_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
// Calcolo la natura
o.mask().set(A_NATURA, natura(o.get()));
// Se esiste un imponibile calcolo l'imposta
real imponibile = o.mask().get(A_IMPONIBILE), imposta = ZERO;
real imponibile = o.mask().get_real(A_IMPONIBILE), imposta = ZERO;
if(imponibile > 0)
{
imposta = imponibile * real(cache().get("%IVA", o.get(), "R0")) / 100;
@ -133,9 +139,9 @@ bool TTrFa_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
if(e == fe_modify)
{
// Se esiste l'iva calcolo l'imposta
real imponibile = o.get(), imposta = ZERO;
real imponibile = static_cast<const char*>(o.get()), imposta = ZERO;
TString codiva = o.mask().get(A_ALIQUOTA);
if(codiva != "")
if(codiva.full())
{
imposta = imponibile * real(cache().get("%IVA", codiva, "R0")) / 100;
if(imposta != o.mask().get_real(A_IMPOSTA) && yesno_box("Aggiornare l'imposta?"))
@ -147,17 +153,17 @@ bool TTrFa_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
if(e == fe_modify)
{
// Controllo dell'esistenza sia di codiva che dell'imponibile e verifico che l'importo immesso sia corretto
real imponibile = o.mask().get(A_IMPONIBILE), imposta = ZERO;
real imponibile = o.mask().get_real(A_IMPONIBILE), imposta = ZERO;
TString codiva = o.mask().get(A_ALIQUOTA);
if(codiva != "" && imponibile > ZERO)
if(codiva.full() && imponibile > ZERO)
{
imposta = imponibile * real(cache().get("%IVA", codiva, "R0")) / 100; imposta = imposta.round(2);
// Controllo che l'aliquota calcolata sia == a quella che ho qua
real impostaInserita = o.get();
if(impostaInserita != imposta)
real imposta_inserita = static_cast<const char*>(o.get());
if(imposta_inserita != imposta)
{
TString msg;
msg << "Attenzione!! Il valore immesso " << impostaInserita.string() << "€ non è corretto!\n";
msg << "Attenzione!! Il valore immesso " << imposta_inserita.string() << "€ non è corretto!\n";
msg << "Valore corretto: " << imposta.string() << "\nVuoi proseguire?";
if(!yesno_box(msg))
{
@ -180,7 +186,7 @@ bool TTrFa_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
TRectype app = getCli(tipocf, codcf, ocfpi);
o.mask().set(A_RAGSOC, app.get("RAGSOC"));
o.mask().set(A_RFSO, app.get("CODRFSO"));
o.mask().set(A_RAGSOCRFSO, getRFSO(app.get("CODRFSO")));
o.mask().set(A_RAGSOCRFSO, get_rfso(app.get("CODRFSO")));
o.mask().set(A_PAIV, app.get("PAIV"));
o.mask().set(A_COFI, app.get("COFI"));
@ -199,11 +205,11 @@ bool TTrFa_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
break;
case DLG_SAVEREC:
if(e == fe_button)
saveAll();
save_all();
break;
case DLG_ARCHIVE:
if(e == fe_button)
checkAll();
check_all();
break;
case DLG_EDIT:
if(e == fe_button)
@ -263,18 +269,18 @@ bool TTrFa_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
// Vado a cercare la riga
FOR_EACH_SHEET_ROW(sheet, r, strarr)
{
long thisProg;
TString thisAlq;
strarr->get(_numero, thisProg);
strarr->get(_aliquota, thisAlq);
if(thisProg == progr && thisAlq == codalq) break;
long this_prog;
TString this_alq;
strarr->get(_numero, this_prog);
strarr->get(_aliquota, this_alq);
if(this_prog == progr && this_alq == codalq) break;
}
sheet.destroy(r); // Aggiorna in automatico
// Se ha cancellato un movimento custom che deriva dalla prima nota propongo di andarlo a ripescare
if(progr < MOV_CUSTOM && yesno_box("Hai cancellato una riga custom di un movimento in prima nota, vuoi ricaricare la tabella?\n(Tutti i record verranno salvati per non perdere le modifiche!)"))
{
saveAll();
save_all();
load_sheet();
return true;
}
@ -282,8 +288,25 @@ bool TTrFa_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
break;
case DLG_EMAIL:
if(e == fe_button)
openJava();
open_java();
break;
case B_PAF_NOT_SENT:
case B_PAF_SENT:
{
const bool ena_no_wa = !(get_bool(B_PAF_NOT_SENT) || get_bool(B_PAF_SENT));
enable(B_PAF_SOG_FAT, ena_no_wa);
enable(B_PAF_ESTERI, ena_no_wa);
break;
}
case B_PAA_NOT_SENT:
case B_PAA_SENT:
{
const bool ena_no_wa = !(get_bool(B_PAA_NOT_SENT) || get_bool(B_PAA_SENT));
enable(B_PAA_SOG_FAT, ena_no_wa);
enable(B_PAA_ESTERI, ena_no_wa);
break;
}
default:
break;
}
@ -300,7 +323,7 @@ bool TTrFa_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
TString invio = o.mask().get(A_INVIO);
if(invio != FLAG_FORZATO && invio != FLAG_ERRORE)
changeInvio(o.mask().get(A_TIPOCF), o.mask().get(A_CODCF), o.mask().get(A_NUMDOC), invio);
change_invio(o.mask().get(A_TIPOCF), o.mask().get(A_CODCF), o.mask().get(A_NUMDOC), invio);
}
}
}
@ -308,18 +331,17 @@ bool TTrFa_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
if (id >= START_MASK && id <= END_MASK)
{
setFilterChanged();
set_filter_changed();
}
if(id >= START_BOOLEAN && id <= END_BOOLEAN)
saveConfig();
save_config();
}
return true;
}
void TTrFa_mask::openJava()
void TTrFa_mask::open_java()
{
TFilename tmp;
tmp = SPESOMETROBASE "\\ModuliSirio.jar";
TFilename tmp = SPESOMETROBASE "\\ModuliSirio.jar";
tmp.make_absolute_path();
DIRECTORY old_dir; xvt_fsys_get_dir(&old_dir);
@ -333,38 +355,49 @@ void TTrFa_mask::openJava()
}
else
{
error_box(FR("Impossibile eseguire Java -jar %s"), (const char*)tmp);
error_box(FR("Impossibile eseguire Java -jar %s"), static_cast<const char*>(tmp));
}
xvt_fsys_set_dir(&old_dir);
}
void TTrFa_mask::loadConfig()
void TTrFa_mask::load_config()
{
// Rilevo i tipi scelti
TToken_string tipidoc(ini_get_string(CONFIG_DITTA, "tf", "TIPIDOC"));
// Potrei fare un for su TToken_string ma non darebbe la possibilità di flaggare tutto in caso di prima installazione
for(int pos = 0; pos < tipidoc.items(); pos++)
{
int field = getTipoDoc(tipidoc.get(pos));
const int field = get_tipo_doc(tipidoc.get(pos));
if(field != -1)
set(field, "X");
}
for(int id = END_BOOLEAN_FATT + 1; id <= END_BOOLEAN; id++)
{
set(id, ini_get_bool(CONFIG_DITTA, "tf", get_tipo_doc(id)) ? "X" : "");
}
}
void TTrFa_mask::saveConfig()
void TTrFa_mask::save_config() const
{
TToken_string tipidoc;
for(int id = START_BOOLEAN; id <= END_BOOLEAN; id++)
int id = START_BOOLEAN_FATT;
for(; id <= END_BOOLEAN_FATT; id++)
{
if(get_bool(id))
{
tipidoc.add(getTipoDoc(id));
tipidoc.add(get_tipo_doc(id));
}
}
ini_set_string(CONFIG_DITTA, "tf", "TIPIDOC", tipidoc);
for (; id <= END_BOOLEAN; id++)
{
ini_set_bool(CONFIG_DITTA, "tf", get_tipo_doc(id), get_bool(id));
}
}
/* salvo tutti i record modificati */
bool TTrFa_mask::saveAll()
bool TTrFa_mask::save_all() const
{
TSheet_field& sheet = sfield(F_RIGHE);
//TString_array& strarr = sheet.rows_array();
@ -378,7 +411,7 @@ bool TTrFa_mask::saveAll()
bool ok, retry = false;
do
{
ok = saveRec(*strarr);
ok = save_rec(*strarr);
if(!ok)
{
TString msg = "Errore durante il salvataggio del movimento ";
@ -401,10 +434,10 @@ bool TTrFa_mask::saveAll()
return true;
}
bool TTrFa_mask::checkAll()
bool TTrFa_mask::check_all()
{
// Controllo di avere uno sheet pieno
if(!checkNotEmpty()) return true;
if(!check_not_empty()) return true;
if(yesno_box("Controllare tutti i C.F. P.IVA?"))
{
@ -413,7 +446,7 @@ bool TTrFa_mask::checkAll()
}
// Sistemo i flag
theFinalCheckDown();
the_final_check_down();
static TPrinter stampa;
stampa.reset();
@ -435,7 +468,7 @@ bool TTrFa_mask::checkAll()
TSheet_field& sheet = sfield(F_RIGHE);
FOR_EACH_SHEET_ROW(sheet, r, strarr)
{
checkRec(&stampa, strarr);
check_rec(&stampa, strarr);
}
riga.reset();
riga.put(TR("------------------ Fine controllo! ------------------"), 30);
@ -444,7 +477,7 @@ bool TTrFa_mask::checkAll()
return true;
}
inline void printError(TPrinter* stampa, TString movimento, TString documento, TString msgerr)
inline void print_error(TPrinter* stampa, const TString& movimento, const TString& documento, const TString& msgerr)
{
TPrintrow riga;
riga.put(movimento, 0);
@ -453,40 +486,42 @@ inline void printError(TPrinter* stampa, TString movimento, TString documento, T
stampa->print(riga);
}
bool TTrFa_mask::checkRec(TPrinter* stampa, TToken_string* rec)
bool TTrFa_mask::check_rec(TPrinter* stampa, TToken_string* rec)
{
bool ok = true;
TString numMov = rec->get(_numero), numDoc = rec->get(_numdoc);
const TString num_mov = rec->get(_numero);
const TString num_doc = rec->get(_numdoc);
TString msgerr;
TString coderr;
// Controllo date ***********************************************************************************
TDate reg = rec->get(_datareg), doc = rec->get(_datadoc);
const TDate reg = rec->get(_datareg), doc = rec->get(_datadoc);
if(reg < doc)
{
ok = false;
msgerr.cut(0) << "Data registrazione precedente alla data del documento";
printError(stampa, numMov, numDoc, msgerr);
print_error(stampa, num_mov, num_doc, msgerr);
coderr << "1;";
}
// Controllo aliquota, imponibile e imposta *********************************************************
TCodiceIVA codiva(rec->get(_aliquota));
TString nat = rec->get(_natura), realNat(natura(rec->get(_aliquota)));
TString nat = rec->get(_natura);
const TString real_nat(natura(rec->get(_aliquota)));
nat.ltrim(); // Se vuoto arriva con uno spazio
real imponibile = rec->get(_imponibile), imposta = rec->get(_importoIVA);
if(nat != realNat)
const real imponibile = static_cast<const char*>(rec->get(_imponibile)), imposta = static_cast<const char*>(rec->get(_importoIVA));
if(nat != real_nat)
{
msgerr.cut(0) << "Natura del movimento errata, valore dichiarato: " << nat << " valore corretto: " << realNat;
printError(stampa, numMov, numDoc, msgerr);
msgerr.cut(0) << "Natura del movimento errata, valore dichiarato: " << nat << " valore corretto: " << real_nat;
print_error(stampa, num_mov, num_doc, msgerr);
coderr << "2;";
}
real realImp = imponibile * codiva.percentuale() / CENTO;
realImp.round(2);
if(imposta > realImp + TOLLARANZA || imposta < realImp - TOLLARANZA)
real real_imp = imponibile * codiva.percentuale() / CENTO;
real_imp.round(2);
if(imposta > real_imp + TOLLARANZA || imposta < real_imp - TOLLARANZA)
{
msgerr.cut(0) << "Imposta errata, valore dichiarato: " << imposta.string() << " valore \"potenzialmente\" corretto: " << realImp.string();
printError(stampa, numMov, numDoc, msgerr);
msgerr.cut(0) << "Imposta errata, valore dichiarato: " << imposta.string() << " valore \"potenzialmente\" corretto: " << real_imp.string();
print_error(stampa, num_mov, num_doc, msgerr);
coderr << "3;";
}
@ -494,7 +529,7 @@ bool TTrFa_mask::checkRec(TPrinter* stampa, TToken_string* rec)
{
ok = false;
msgerr.cut(0) << "Non riesco a determinare il tipo di documento corretto per l'agenzia delle entrate!";
printError(stampa, numMov, numDoc, msgerr);
print_error(stampa, num_mov, num_doc, msgerr);
coderr << "4;";
}
@ -504,7 +539,7 @@ bool TTrFa_mask::checkRec(TPrinter* stampa, TToken_string* rec)
return ok;
}
bool TTrFa_mask::checkNotEmpty()
bool TTrFa_mask::check_not_empty()
{
TSheet_field& sheet = sfield(F_RIGHE);
TString msg;
@ -522,49 +557,48 @@ bool TTrFa_mask::checkNotEmpty()
return sheet.full();
}
void TTrFa_mask::theFinalCheckDown() // IT'S THE FINAL CHECKDOOOOOOOWN! WE'RE CHECKING TOGEEEETHEEEEER!!!!
void TTrFa_mask::the_final_check_down() // IT'S THE FINAL CHECKDOOOOOOOWN! WE'RE CHECKING TOGEEEETHEEEEER!!!!
{
TSheet_field& sheet = sfield(F_RIGHE);
TAssoc_array cliDocs;
TAssoc_array cli_docs;
FOR_EACH_SHEET_ROW(sheet, r, strarr)
{
// Chiave: TIPOCF + CODCF + NUMDOC + CODIVA
TString key; key << strarr->get_char(_tipocf) << "|" << strarr->get_int(_codcf) << "|" << strarr->get(_numdoc) << "|" << strarr->get(_aliquota);
TToken_string newNumero; newNumero.add(r, 0); newNumero.add(strarr->get_char(_invio), 1);
if(cliDocs.is_key(key))
if(cli_docs.is_key(key))
{
TToken_string oldnumero = *(TToken_string*)cliDocs.objptr(key);
TToken_string oldnumero = *dynamic_cast<TToken_string*>(cli_docs.objptr(key));
TString oldflag; oldnumero.get(1, oldflag);
if(oldflag == FLAG_FORZATO)
flagRow(r, FLAG_NINVIO);
flag_row(r, FLAG_NINVIO);
else
{
int oldr; oldnumero.get(0, oldr);
flagRow(oldr, FLAG_NINVIO);
flag_row(oldr, FLAG_NINVIO);
}
cliDocs.add(key, newNumero);
cli_docs.add(key, newNumero);
}
else
{
cliDocs.add(key, newNumero);
cli_docs.add(key, newNumero);
}
}
// Forzo l'aggiornamento dello sheet
sfield(F_RIGHE).force_update();
}
void TTrFa_mask::flagRow(int nrow, TString flag)
void TTrFa_mask::flag_row(const int nrow, const TString& flag)
{
TSheet_field& sheet = sfield(F_RIGHE);
TToken_string& row = sheet.row(nrow);
row.add(flag, _invio);
sfield(F_RIGHE).row(nrow).add(flag, _invio);
}
TRecnotype TTrFa_mask::nuovo_progr() const
TRecnotype TTrFa_mask::nuovo_progr()
{
static TRectype app(LF_TRASFATT);
app.last(TLocalisamfile(LF_TRASFATT));
static TLocalisamfile ltrasfatt(LF_TRASFATT);
app.last(ltrasfatt);
// Lo inizializzo solo la prima volta poi incremento
static TRecnotype numreg = app.get_long("NUMREG") > MOV_CUSTOM ? app.get_long("NUMREG") : MOV_CUSTOM;
numreg++;
@ -572,7 +606,7 @@ TRecnotype TTrFa_mask::nuovo_progr() const
}
// Dato un cliente e il suo numero documento imposto il nuovo flag di invio su tutti i campi
void TTrFa_mask::changeInvio(TString tipocf, TString codcf, TString numdoc, TString invio) const
void TTrFa_mask::change_invio(const TString& tipocf, const TString& codcf, const TString& numdoc, const TString& invio) const
{
TSheet_field& sheet = sfield(F_RIGHE);
TString rtipo, rcod, rnum, rinvio;
@ -611,10 +645,10 @@ void TTrFa_mask::load_sheet()
}
//TString key; key << "TIPOA=" << prefix().firm().get("TIPOA")<< ",CODANAGR=" << prefix().firm().get("CODANAGR");
TString key; key << prefix().firm().get("TIPOA") << "|" << prefix().firm().get("CODANAGR");
static const TString pivaDitta = cache().get(LF_ANAG, key, "PAIV");
static const TString cofiDitta = cache().get(LF_ANAG, key, "COFI");
static const TString piva_ditta = cache().get(LF_ANAG, key, "PAIV");
static const TString cofi_ditta = cache().get(LF_ANAG, key, "COFI");
TTrFa_cursors c(_has_fp);
TTrFa_cursors c;
TSheet_field& sheet = sfield(F_RIGHE);
@ -622,24 +656,24 @@ void TTrFa_mask::load_sheet()
if(!sheet.empty())
sheet.destroy();
TAssoc_array recimposte;
int items = c.updateFilters(tipo, codice, dal, al, get_int(F_FATTSEL));
const int items = c.update_filters(tipo, codice, dal, al, get_int(F_FATTSEL));
TString tipocf, codcf, ocfpi, nat;
for(bool ok = true; items > 0 && ok;)
{
tipocf.cut(0), codcf.cut(0), ocfpi.cut(0), nat.cut(0);
int err = c.next(recimposte, ok, tipocf, codcf, ocfpi);
const int err = c.next(recimposte, ok, tipocf, codcf, ocfpi);
// Carico i clienti
TRectype cli = getCli(tipocf, codcf, ocfpi);
FOR_EACH_ASSOC_OBJECT(recimposte, h, iva, rec)
{
TRectype movimento = *(TRectype*)rec;
TRectype movimento = *dynamic_cast<TRectype*>(rec);
// Controllo che sia un tipo documento da leggere
int tipoDoc = getTipoDoc(movimento.get("TIPODOC"));
if(tipoDoc != -1 && !get_bool(tipoDoc)) continue;
const int tipo_doc = get_tipo_doc(movimento.get("TIPODOC"));
if(tipo_doc != -1 && !get_bool(tipo_doc)) continue;
// A volte mi pesca movimenti con invio sbagliato
if(!checkInvio(movimento.get("TFINVIO"))) continue;
if(!check_invio(movimento.get("TFINVIO"))) continue;
// Creo una nuova riga nello sheet
TToken_string& row = sheet.row(-1);
@ -647,59 +681,59 @@ void TTrFa_mask::load_sheet()
/* Siccome mi cambiano l'ordine ogni volta e non ho voglia di cambiare tutto ovunque
* basta settare i valori negli enum e lo sheet
*/
TRectype isCust = getTrasFatt(movimento.get("NUMREG"), iva);
TRectype is_cust = getTrasFatt(movimento.get("NUMREG"), iva);
#ifdef DBG
if(isCust.full() && (err < foundcust || err > foundidcust))
if(is_cust.full() && (err < foundcust || err > foundidcust))
bool tolla = true;
#endif
const char * toSend = movimento.get("TFINVIO").blank() ? FLAG_INVIO : movimento.get("TFINVIO");
row.add(movimento.get("TFINVIO") == FLAG_INVIATO ? "X" : "", _spedita); // Spedita
row.add(toSend); // Da spedire
row.add(isCust.full() ? "X" : "", _forzata); // Modificato
row.add(movimento.get_long("NUMREG"), _numero); // Numero registrazione
row.add(movimento.get_date("DATAREG"), _datareg); // Data Registrazione
row.add(movimento.get("TIPO"), _tipocf); // Tipo Cli/For
row.add(movimento.get("CODCF"), _codcf); // Codice Cli/For
row.add(movimento.get("OCCAS"), _occas); // Codice Occasionale
row.add(cli.get("RAGSOC"), _ragsoc); // Ragione sociale
row.add(cli.get("CODRFSO"), _rfso); // Codice RF/SO
row.add(getRFSO(cli.get("CODRFSO")), _ragsocrfso); // Ragione Sociale RF/SO
row.add(movimento.get("NUMDOC"), _numdoc); // Numero documento
row.add(movimento.get_date("DATADOC"), _datadoc); // Data documento
const char * to_send = movimento.get("TFINVIO").blank() ? FLAG_INVIO : movimento.get("TFINVIO");
row.add(movimento.get("TFINVIO") == FLAG_INVIATO ? "X" : "", _spedita); // Spedita
row.add(to_send); // Da spedire
row.add(is_cust.full() ? "X" : "", _forzata); // Modificato
row.add(movimento.get_long("NUMREG"), _numero); // Numero registrazione
row.add(movimento.get_date("DATAREG"), _datareg); // Data Registrazione
row.add(movimento.get("TIPO"), _tipocf); // Tipo Cli/For
row.add(movimento.get("CODCF"), _codcf); // Codice Cli/For
row.add(movimento.get("OCCAS"), _occas); // Codice Occasionale
row.add(cli.get("RAGSOC"), _ragsoc); // Ragione sociale
row.add(cli.get("CODRFSO"), _rfso); // Codice RF/SO
row.add(get_rfso(cli.get("CODRFSO")), _ragsocrfso); // Ragione Sociale RF/SO
row.add(movimento.get("NUMDOC"), _numdoc); // Numero documento
row.add(movimento.get_date("DATADOC"), _datadoc); // Data documento
nat.cut(0) << movimento.get("NATURA");
row.add(nat.full() ? nat : natura(iva), _natura); // NATURA!
row.add(iva, _aliquota); // Codice aliquota!
row.add(findDetraib(movimento.get("TIPODET")), _detraibile); // Detraibilità
row.add(movimento.get_real("IMPONIBILE"), _imponibile); // Imponibile
row.add(movimento.get_real("IMPOSTA"), _importoIVA); // Imposta
row.add(revCharge(movimento.get("NUMREG"), movimento.get_date("DATAREG").year()), _reverse); // Rev.Charge
row.add(nat.full() ? nat : natura(iva), _natura); // NATURA!
row.add(iva, _aliquota); // Codice aliquota!
row.add(find_detraib(movimento.get("TIPODET")), _detraibile); // Detraibilità
row.add(movimento.get_real("IMPONIBILE"), _imponibile); // Imponibile
row.add(movimento.get_real("IMPOSTA"), _importoIVA); // Imposta
row.add(rev_charge(movimento.get("NUMREG"), movimento.get_date("DATAREG").year()), _reverse); // Rev.Charge
row.add(movimento.get("TIPODOC"), _codnum);
// Calcolo il tipo documento alla fine per sicurezza
if (isCust.full())
if (is_cust.full())
{
row.add(movimento.get("TIPODOCAE").blank() ? decodTipo(&row) : movimento.get("TIPODOCAE"), _codnumAE); // Tipo documento
row.add(movimento.get("TIPODOCAE").blank() ? decod_tipo(&row) : movimento.get("TIPODOCAE"), _codnumAE); // Tipo documento
}
else
row.add(decodTipo(&row), _codnumAE); // Tipo documento
row.add(decod_tipo(&row), _codnumAE); // Tipo documento
/*
* Possono esistere movimenti custom dove il cliente ha una partita IVA propria
* ma è stato flaggato l'autofattura, quindi in trasfat è presente il codice cliente con PIVA e CODFIS della ditta.
* Controllo sia il movimento che il cliente
*/
if(movimento.get("AUTOFATT") == "X" || pivaDitta == cli.get("PAIV")) // Se è un autofattura
if(movimento.get("AUTOFATT") == "X" || piva_ditta == cli.get("PAIV")) // Se è un autofattura
{
row.add("X", _autofatt); // AutoFatt
row.add(pivaDitta, _paiv); // P.IVA
row.add(cofiDitta, _codfis); // Codice Fiscale
row.add("X", _autofatt); // AutoFatt
row.add(piva_ditta, _paiv); // P.IVA
row.add(cofi_ditta, _codfis); // Codice Fiscale
}
else
{
row.add("", _autofatt); // AutoFatt
row.add(cli.get("PAIV"), _paiv); // P.IVA
row.add(cli.get("COFI"), _codfis); // Codice Fiscale
row.add("", _autofatt); // AutoFatt
row.add(cli.get("PAIV"), _paiv); // P.IVA
row.add(cli.get("COFI"), _codfis); // Codice Fiscale
}
sheet.enable_cell(sheet.items()-1, _occas, movimento.get("OCCAS").full());
}
@ -710,19 +744,19 @@ void TTrFa_mask::load_sheet()
}
bool TTrFa_mask::checkInvio(const TString& invio)
bool TTrFa_mask::check_invio(const TString& invio) const
{
bool ok;
switch(get_int(F_FATTSEL))
{
case toSend:
ok = invio == "" || invio == FLAG_INVIO || invio == FLAG_FORZATO || invio == FLAG_ERRORE;
case to_send:
ok = invio.empty() || invio == FLAG_INVIO || invio == FLAG_FORZATO || invio == FLAG_ERRORE;
break;
case sent:
ok = invio == FLAG_INVIATO;
break;
case untouched:
ok = invio == "" || invio == FLAG_INVIO;
ok = invio.empty() || invio == FLAG_INVIO;
case forced:
ok = invio == FLAG_FORZATO;
break;
@ -741,10 +775,10 @@ bool TTrFa_mask::checkInvio(const TString& invio)
}
TTrFa_mask::TTrFa_mask(TString msk)
TTrFa_mask::TTrFa_mask(const TString& msk)
: TAutomask(msk), _filter_changed(true)
{
loadConfig();
load_config();
#ifndef DBG
// Controllo che abbia aggiornato le causali dopo l'ultima patch cg0500

View File

@ -7,10 +7,10 @@
/////////////////////////////////////////////////////////////////////////////////////
TTrFa_cursors::~TTrFa_cursors()
{
if(c_rmoviva != NULL)
delete c_rmoviva;
if(c_trasfatt != NULL)
delete c_trasfatt;
if(_c_rmoviva != NULL)
delete _c_rmoviva;
if(_c_trasfatt != NULL)
delete _c_trasfatt;
}
int TTrFa_cursors::next(TAssoc_array& recimposte, bool& ok, TString& tipocf, TString& codcf, TString& ocfpi)
@ -23,7 +23,7 @@ int TTrFa_cursors::next(TAssoc_array& recimposte, bool& ok, TString& tipocf, TSt
TRectype record = _next(err, tipocf, codcf, ocfpi);
if(err == eof)
{
record = _nextCust(err, tipocf, codcf, ocfpi);
record = _next_cust(err, tipocf, codcf, ocfpi);
}
while(err < nextmov)
{
@ -55,172 +55,195 @@ int TTrFa_cursors::next(TAssoc_array& recimposte, bool& ok, TString& tipocf, TSt
*/
TRectype TTrFa_cursors::_next(return_code& code, TString& tipocf, TString& codcf, TString& ocfpi)
{
TString numMov = c_rmoviva->get("23.NUMREG").as_string();
const TString num_mov = _c_rmoviva->get("23.NUMREG").as_string();
// Record di ritorno
TRectype retRec(LF_TRASFATT);
TRectype ret_rec(LF_TRASFATT);
// Variabile di appoggio per forzare il controllo sui movimenti nuovi,
// così facendo riesco a entrare nel ciclo sotto. Prima c'era un else
bool newMov = _newMov;
const bool new_mov = _new_mov;
// Controllo che non sia il primo record del movimento
if(_newMov)
if(_new_mov)
{
_newMov = false;
tipocf = c_rmoviva->get("23.TIPO").as_string();
codcf = c_rmoviva->get("23.CODCF").as_string();
ocfpi = c_rmoviva->get("23.OCFPI").as_string();
_new_mov = false;
tipocf = _c_rmoviva->get("23.TIPO").as_string();
codcf = _c_rmoviva->get("23.CODCF").as_string();
ocfpi = _c_rmoviva->get("23.OCFPI").as_string();
}
// Se non è un movimento o il controllo fallisce mi sposto
int tipoDoc = getTipoDoc(c_rmoviva->get("23.TIPODOC").as_string());
if(!newMov || !checkRecord(c_rmoviva, _has_fp) || tipoDoc == -1 || !msk().get_bool(tipoDoc))
const int tipo_doc = get_tipo_doc(_c_rmoviva->get("23.TIPODOC").as_string());
if(!new_mov ||
!check_record(_c_rmoviva, _esterometro, _paf_ns, _paf_s, _paf_sf, _paf_e, _paa_ns, _paa_s, _paa_sf, _paa_e) ||
tipo_doc == -1 || !msk().get_bool(tipo_doc))
{
static TString codiva;
do
{
// Se ritorna false ho finito i records
if(!c_rmoviva->move_next())
if(!_c_rmoviva->move_next())
{
code = eof;
return retRec;
return ret_rec;
}
else
{
// Controllo se ho cambiato movimento
_newMov = numMov != c_rmoviva->get("23.NUMREG").as_string();
codiva.cut(0) << c_rmoviva->get("25.CODIVA").as_string();
_new_mov = num_mov != _c_rmoviva->get("23.NUMREG").as_string();
codiva.cut(0) << _c_rmoviva->get("25.CODIVA").as_string();
}
} // Ciclo finchè non trovo un nuovo movimento o trovo cod IVA già presi da cust
while((!_newMov && _alqCust.get_pos(codiva) > -1) || !checkEnabled(c_rmoviva) || !checkRecord(c_rmoviva, _has_fp));
while((!_new_mov && _alq_cust.get_pos(codiva) > -1) || !check_enabled(_c_rmoviva) ||
!check_record(_c_rmoviva, _esterometro, _paf_ns, _paf_s, _paf_sf, _paf_e, _paa_ns, _paa_s, _paa_sf, _paa_e));
}
// Se ho cambiato movimento ritorno, leggerò poi al prossimo giro
if(_newMov)
if(_new_mov)
{
_alqCust.cut(0);
_alq_cust.cut(0);
code = nextmov;
return retRec;
return ret_rec;
}
else
code = found;
#ifdef DBG
if(c_rmoviva->get("23.NUMREG").as_int() == 1930131)
if(_c_rmoviva->get("23.NUMREG").as_int() == 1930131)
bool tolla = true;
#endif
// Controllo dell'esistenza di un record custom in tasfatt
retRec = getTrasFatt(c_rmoviva->get("23.NUMREG").as_string(), c_rmoviva->get("25.CODIVA").as_string());
if(retRec.empty())
ret_rec = getTrasFatt(_c_rmoviva->get("23.NUMREG").as_string(), _c_rmoviva->get("25.CODIVA").as_string());
if(ret_rec.empty())
{
code = found;
// Carico il record
retRec.put("NUMREG", c_rmoviva->get("23.NUMREG").as_int());
retRec.put("TIPO", c_rmoviva->get("23.TIPO").as_string());
retRec.put("CODCF", c_rmoviva->get("23.CODCF").as_string());
retRec.put("OCCAS", c_rmoviva->get("23.OCFPI").as_string());
retRec.put("TIPODOC", c_rmoviva->get("23.TIPODOC").as_string());
retRec.put("NUMDOC", c_rmoviva->get("23.NUMDOC").as_string());
retRec.put("DATAREG", c_rmoviva->get("23.DATAREG").as_date());
retRec.put("DATADOC", c_rmoviva->get("23.DATADOC").as_date());
retRec.put("TFINVIO", c_rmoviva->get("23.TFINVIO").as_string());
retRec.put("IMPONIBILE", c_rmoviva->get("25.IMPONIBILE").as_real());
retRec.put("IMPOSTA", c_rmoviva->get("25.IMPOSTA").as_real());
retRec.put("CODIVA", c_rmoviva->get("25.CODIVA").as_string());
retRec.put("TIPODET", c_rmoviva->get("25.TIPODET").as_string());
ret_rec.put("NUMREG", _c_rmoviva->get("23.NUMREG").as_int());
ret_rec.put("TIPO", _c_rmoviva->get("23.TIPO").as_string());
ret_rec.put("CODCF", _c_rmoviva->get("23.CODCF").as_string());
ret_rec.put("OCCAS", _c_rmoviva->get("23.OCFPI").as_string());
ret_rec.put("TIPODOC", _c_rmoviva->get("23.TIPODOC").as_string());
ret_rec.put("NUMDOC", _c_rmoviva->get("23.NUMDOC").as_string());
ret_rec.put("DATAREG", _c_rmoviva->get("23.DATAREG").as_date());
ret_rec.put("DATADOC", _c_rmoviva->get("23.DATADOC").as_date());
ret_rec.put("TFINVIO", _c_rmoviva->get("23.TFINVIO").as_string());
ret_rec.put("IMPONIBILE", _c_rmoviva->get("25.IMPONIBILE").as_real());
ret_rec.put("IMPOSTA", _c_rmoviva->get("25.IMPOSTA").as_real());
ret_rec.put("CODIVA", _c_rmoviva->get("25.CODIVA").as_string());
ret_rec.put("TIPODET", _c_rmoviva->get("25.TIPODET").as_string());
}
else
{
_alqCust.add(c_rmoviva->get("25.CODIVA").as_string());
_alq_cust.add(_c_rmoviva->get("25.CODIVA").as_string());
code = foundcust;
}
return retRec;
return ret_rec;
}
TRectype TTrFa_cursors::_nextCust(return_code& code, TString& tipocf, TString& codcf, TString& ocfpi)
TRectype TTrFa_cursors::_next_cust(return_code& code, TString& tipocf, TString& codcf, TString& ocfpi)
{
bool ok;
// Preparo il nuovo cursore
if(_newCust)
if(_new_cust)
{
ok = c_trasfatt->move_first();
_newCust = false;
ok = _c_trasfatt->move_first();
_new_cust = false;
}
else
{
ok = c_trasfatt->move_next();
ok = _c_trasfatt->move_next();
}
tipocf = c_trasfatt->get("TIPO").as_string();
codcf = c_trasfatt->get("CODCF").as_string();
ocfpi = c_trasfatt->get("OCFPI").as_string();
tipocf = _c_trasfatt->get("TIPO").as_string();
codcf = _c_trasfatt->get("CODCF").as_string();
ocfpi = _c_trasfatt->get("OCFPI").as_string();
code = ok ? foundidcust : eofcust;
return c_trasfatt->cursor()->curr();
return _c_trasfatt->cursor()->curr();
}
bool TTrFa_cursors::checkEnabled(TISAM_recordset* origCur)
bool TTrFa_cursors::check_enabled(TISAM_recordset* orig_cur)
{
// Controllo che il record sia effettivamente abilitato
static TString flag; flag.cut(0);
// Controllo se sono su un movimento custom
if(origCur->find_column("MOV.REG") >= 0)
if(orig_cur->find_column("MOV.REG") >= 0)
{
TRectype rCust = getTrasFatt(c_rmoviva->get("23.NUMREG").as_string(), c_rmoviva->get("25.CODIVA").as_string());
if(rCust.empty())
flag << origCur->get("23.TFINVIO");
TRectype r_cust = getTrasFatt(_c_rmoviva->get("23.NUMREG").as_string(), _c_rmoviva->get("25.CODIVA").as_string());
if(r_cust.empty())
flag << orig_cur->get("23.TFINVIO");
else
flag << rCust.get("TFINVIO");
flag << r_cust.get("TFINVIO");
}
else
{
flag << origCur->get("TFINVIO").as_string();
flag << orig_cur->get("TFINVIO").as_string();
}
return msk().checkInvio(flag);
return msk().check_invio(flag);
}
void TTrFa_cursors::reset_esterometro()
{
_esterometro = msk().get_bool(B_ESTEROMETRO);
_paf_ns = msk().get_bool(B_PAF_NOT_SENT);
_paf_s = msk().get_bool(B_PAF_SENT);
_paf_sf = msk().get_bool(B_PAF_SOG_FAT);
_paf_e = msk().get_bool(B_PAF_ESTERI);
_paa_ns = msk().get_bool(B_PAA_NOT_SENT);
_paa_s = msk().get_bool(B_PAA_SENT);
_paa_sf = msk().get_bool(B_PAA_ESTERI);
_paa_e = msk().get_bool(B_PAA_SOG_FAT);
}
int TTrFa_cursors::updateFilters(const char tipocf, const long codcf, TDate dal, TDate al, int cod)
TTrFa_cursors::TTrFa_cursors(): _c_rmoviva(nullptr), _c_trasfatt(nullptr), _new_mov(false), _new_cust(false),
_esterometro(false), _paf_ns(false), _paf_s(false), _paf_sf(false), _paf_e(false),
_paa_ns(false), _paa_s(false), _paa_sf(false), _paa_e(false) {}
int TTrFa_cursors::update_filters(const char tipocf, const long codcf, TDate dal, TDate al, int cod)
{
// Svuoto la cache per aggiornare i file custom
cache().discard(LF_TRASFATT);
TString query = "USE RMOVIVA\n", queryCust = "USE TRASFATT\n";
query << "SELECT (23.REG!=\"\")&&BETWEEN(23.DATAREG,#DADATAREG,#ADATAREG)&&(23.TIPO=\"" << tipocf << "\")";
queryCust << "SELECT BETWEEN(DATAREG,#DADATAREG,#ADATAREG)&&(TIPO=\"" << tipocf << "\")";
// Resetto i filtri booleani
reset_esterometro();
TString query = "USE RMOVIVA\n", query_cust = "USE TRASFATT\n";
query << R"(SELECT (23.REG!="")&&BETWEEN(23.DATAREG,#DADATAREG,#ADATAREG)&&(23.TIPO=")" << tipocf << "\")";
query_cust << "SELECT BETWEEN(DATAREG,#DADATAREG,#ADATAREG)&&(TIPO=\"" << tipocf << "\")";
if(codcf > 0)
{
query << "&&STR((23.CODCF=#CODCF))";
queryCust << "&&STR((CODCF=#CODCF))";
query_cust << "&&STR((CODCF=#CODCF))";
}
query << "\nJOIN MOV INTO NUMREG==NUMREG\n";
queryCust << "\nFROM NUMREG=" << MOV_CUSTOM;
query_cust << "\nFROM NUMREG=" << MOV_CUSTOM;
c_rmoviva = new TISAM_recordset(query);
c_trasfatt= new TISAM_recordset(queryCust);
_c_rmoviva = new TISAM_recordset(query);
_c_trasfatt= new TISAM_recordset(query_cust);
if(dal.empty()) dal = "20170101"; // Data in cui questo modulo è diventato valido
if(al.empty()) al = TODAY;
c_rmoviva->set_var("#DADATAREG", dal);
c_rmoviva->set_var("#ADATAREG", al);
c_trasfatt->set_var("#DADATAREG", dal);
c_trasfatt->set_var("#ADATAREG", al);
_c_rmoviva->set_var("#DADATAREG", dal);
_c_rmoviva->set_var("#ADATAREG", al);
_c_trasfatt->set_var("#DADATAREG", dal);
_c_trasfatt->set_var("#ADATAREG", al);
if(codcf > 0)
{
c_rmoviva->set_var("#CODCF", codcf);
c_trasfatt->set_var("#CODCF", codcf);
_c_rmoviva->set_var("#CODCF", codcf);
_c_trasfatt->set_var("#CODCF", codcf);
}
int items = c_rmoviva->items() + c_trasfatt->items();
const int items = _c_rmoviva->items() + _c_trasfatt->items();
if(items > 0)
{
_newMov = true;
_newCust = true;
_new_mov = true;
_new_cust = true;
return items;
}
return -1;

View File

@ -20,8 +20,6 @@
#include "tf0200a.h"
#define CAMPI_CON_BOOLEAN F_TOTOPATT
#define REG_ATT 1
#define REG_PAS 2
// ComLiqPerIva: Comunicazione Liquidazioni Periodiche IVA
@ -470,14 +468,14 @@ void ComLiqPerIva_mask::extractinator() // Per gli amici GTFO
// Se è un movimento IvaXCassa o LiqDiff
if(hasIXC && (curIva.get("23.IVAXCASSA").as_bool() || curIva.get("23.LIQDIFF").as_bool()))
{
if(tiporeg == REG_ATT)
if(tiporeg == iva_vendite)
totopattxc += imp;
else
totoppasxc += imp;
}
else
{
if(tiporeg == REG_ATT)
if(tiporeg == iva_vendite)
{
// Controllo il reverse charge, non va calcolato nel totale delle operazioni attive!
// Se non ha una riga di movimento non lo sommo
@ -510,7 +508,7 @@ void ComLiqPerIva_mask::extractinator() // Per gli amici GTFO
real imposta_diff, imposta_xcas;
imposta_diff = imposta_xcas = ZERO;
// 1 = Vendite
calc_inc_diff(anno, start, REG_ATT, imposta_diff, imposta_xcas);
calc_inc_diff(anno, start, iva_vendite, imposta_diff, imposta_xcas);
ivaesxc = ivaesxc + imposta_xcas;
ivaesdiff = ivaesdiff + imposta_diff;
@ -519,7 +517,7 @@ void ComLiqPerIva_mask::extractinator() // Per gli amici GTFO
TString pippo = ivadetxc.stringa();
TString pluto = imposta_xcas.stringa();
// 2 = Acquisti
calc_inc_diff(anno, start, REG_PAS, imposta_diff, imposta_xcas);
calc_inc_diff(anno, start, iva_acquisti, imposta_diff, imposta_xcas);
pippo = ivadetxc.stringa();
pluto = imposta_xcas.stringa();
ivadetxc = ivadetxc + imposta_xcas;

View File

@ -10,10 +10,10 @@
#include "modaut.h"
/****************************************************************************************************
* TSpeCheck_msk
* TSpe_check_msk
****************************************************************************************************/
class TSpeCheck_msk : public TAutomask
class TSpe_check_msk : public TAutomask
{
private:
TAnagrafica _ditta;
@ -21,24 +21,24 @@ private:
bool _has_fp;
void refresh();
void fillNoFilter();
void fillDiff();
void foundHomeland(TToken_string& row, TString numreg, TString codiva, TRectype& clifo);
void fillCust();
void getFilFlag(TString& query);
void enableEdit(bool en);
void selectAll();
void saveAll();
void deleteAll();
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
void fill_no_filter();
void fill_diff();
void find_homeland(TToken_string& row, TString numreg, TString codiva, TRectype& clifo);
void fill_cust();
void get_fil_flag(TString& query);
void enable_edit(bool en);
void select_all();
void save_all();
void delete_all();
bool on_field_event(TOperable_field& o, TField_event e, long jolly) override;
public:
void set_has_fp(bool has_fp) { _has_fp = has_fp; }
TSpeCheck_msk();
virtual ~TSpeCheck_msk() {};
void set_has_fp(const bool has_fp) { _has_fp = has_fp; }
TSpe_check_msk();
virtual ~TSpe_check_msk() {};
};
bool TSpeCheck_msk::on_field_event(TOperable_field& o, TField_event e, long jolly)
bool TSpe_check_msk::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
switch(o.dlg())
{
@ -52,13 +52,13 @@ bool TSpeCheck_msk::on_field_event(TOperable_field& o, TField_event e, long joll
break;
case DLG_ALL:
if(e != fe_button) break;
selectAll();
select_all();
break;
case DLG_SAVEREC:
saveAll();
save_all();
break;
case DLG_DELREC:
deleteAll();
delete_all();
break;
case DLG_EDIT:
if(e == fe_button)
@ -87,7 +87,7 @@ bool TSpeCheck_msk::on_field_event(TOperable_field& o, TField_event e, long joll
TRectype app = getCli(tipocf, codcf, ocfpi);
o.mask().set(A_RAGSOC, app.get("RAGSOC"));
o.mask().set(A_RFSO, app.get("CODRFSO"));
o.mask().set(A_RAGSOCRFSO, getRFSO(app.get("CODRFSO")));
o.mask().set(A_RAGSOCRFSO, get_rfso(app.get("CODRFSO")));
o.mask().set(A_PAIV, app.get("PAIV"));
o.mask().set(A_COFI, app.get("COFI"));
@ -111,32 +111,32 @@ bool TSpeCheck_msk::on_field_event(TOperable_field& o, TField_event e, long joll
return true;
}
void TSpeCheck_msk::refresh()
void TSpe_check_msk::refresh()
{
switch(get_long(F_TIPOCONTROLLO))
{
case 0:
fillNoFilter();
fill_no_filter();
break;
case 1:
fillDiff();
fill_diff();
break;
case 2:
fillCust();
fill_cust();
default:
break;
}
return;
}
void TSpeCheck_msk::fillNoFilter()
void TSpe_check_msk::fill_no_filter()
{
TString query = "USE RMOVIVA\n";
query << "SELECT (23.REG!=\"\")&&BETWEEN(23.DATAREG,#DADATAREG,#ADATAREG)&&(23.TIPO=\"" << get(F_TIPOCF) << "\")";
if(get(F_CODCF) != "")
query << R"(SELECT (23.REG!="")&&BETWEEN(23.DATAREG,#DADATAREG,#ADATAREG)&&(23.TIPO=")" << get(F_TIPOCF) << "\")";
if(get(F_CODCF).full())
query << "&&STR((23.CODCF=#CODCF))";
getFilFlag(query);
get_fil_flag(query);
query << "\nJOIN MOV INTO NUMREG==NUMREG\n";
@ -159,7 +159,7 @@ void TSpeCheck_msk::fillNoFilter()
// Setto le variabili
rset.set_var("#DADATAREG", dadatareg);
rset.set_var("#ADATAREG", adatareg);
if(get(F_CODCF) != "")
if(get(F_CODCF).full())
rset.set_var("#CODCF", get(F_CODCF));
int nrec = rset.items();
@ -176,7 +176,7 @@ void TSpeCheck_msk::fillNoFilter()
for(bool ok = rset.move_first(); ok; ok = rset.move_next())
{
// Devo prendere tutti quelli che non vanno bene di records
if(checkRecord(&rset, _has_fp)) continue;
if(check_record(&rset, _has_fp)) continue;
TRectype clifo = getCli(rset.get("23.TIPO").as_string(), rset.get("23.CODCF").as_string(), rset.get("23.OCCAS").as_string());
TToken_string& row = s.row(-1);
@ -191,7 +191,7 @@ void TSpeCheck_msk::fillNoFilter()
// NATURA
row.add(natura(rset.get("25.CODIVA").as_string()), s.cid2index(A_NATURA));
// DETR
row.add(findDetraib(rset.get("25.TIPODET").as_string()), s.cid2index(A_DETRAIB));
row.add(find_detraib(rset.get("25.TIPODET").as_string()), s.cid2index(A_DETRAIB));
row.add(rset.get("23.TIPO").as_string(), s.cid2index(A_TIPOCF));
row.add(rset.get("23.CODCF").as_string(), s.cid2index(A_CODCF));
@ -201,9 +201,9 @@ void TSpeCheck_msk::fillNoFilter()
// RFSO
row.add(clifo.get("CODRFSO"), s.cid2index(A_RFSO));
// RSOC RFSO
row.add(getRFSO(clifo.get("CODRFSO")), s.cid2index(A_RAGSOCRFSO));
row.add(get_rfso(clifo.get("CODRFSO")), s.cid2index(A_RAGSOCRFSO));
// RC
row.add((revCharge(rset.get("NUMREG").as_string(), rset.get("23.DATAREG").as_date().year())), s.cid2index(A_REVERSE));
row.add((rev_charge(rset.get("NUMREG").as_string(), rset.get("23.DATAREG").as_date().year())), s.cid2index(A_REVERSE));
// AUTOFATT
if(_ditta.partita_IVA() == clifo.get("PAIV"))
{
@ -222,10 +222,10 @@ void TSpeCheck_msk::fillNoFilter()
}
s.force_update();
s.show();
enableEdit(false);
enable_edit(false);
}
void TSpeCheck_msk::fillDiff()
void TSpe_check_msk::fill_diff()
{
// Apro la tabella TRASFATT e per ogni record lo ricostruisco l'originale
TString query = "USE TRASFATT\n";
@ -233,7 +233,7 @@ void TSpeCheck_msk::fillDiff()
if(get(F_CODCF) != "")
query << "&&STR((CODCF=#CODCF))";
getFilFlag(query);
get_fil_flag(query);
TISAM_recordset rset(query);
TDate dadatareg = get_date(F_DATAINI);
@ -274,7 +274,7 @@ void TSpeCheck_msk::fillDiff()
// Creo la riga della prima nota
TToken_string& orig = s.row(-1);
foundHomeland(orig, rset.get("NUMREG").as_string(), rset.get("CODIVA").as_string(), clifo);
find_homeland(orig, rset.get("NUMREG").as_string(), rset.get("CODIVA").as_string(), clifo);
TToken_string& row = s.row(-1);
@ -290,7 +290,7 @@ void TSpeCheck_msk::fillDiff()
nat.cut(0) << rset.get("NATURA").as_string();
row.add(nat.full() ? nat : natura(rset.get("CODIVA").as_string()), s.cid2index(A_NATURA));
// DETR
row.add(findDetraib(rset.get("TIPODET").as_string()), s.cid2index(A_DETRAIB));
row.add(find_detraib(rset.get("TIPODET").as_string()), s.cid2index(A_DETRAIB));
row.add(rset.get("TIPO").as_string(), s.cid2index(A_TIPOCF));
row.add(rset.get("CODCF").as_string(), s.cid2index(A_CODCF));
@ -300,9 +300,9 @@ void TSpeCheck_msk::fillDiff()
// RFSO
row.add(clifo.get("CODRFSO"), s.cid2index(A_RFSO));
// RSOC RFSO
row.add(getRFSO(clifo.get("CODRFSO")), s.cid2index(A_RAGSOCRFSO));
row.add(get_rfso(clifo.get("CODRFSO")), s.cid2index(A_RAGSOCRFSO));
// RC
row.add((revCharge(rset.get("NUMREG").as_string(), rset.get("DATAREG").as_date().year())), s.cid2index(A_REVERSE));
row.add((rev_charge(rset.get("NUMREG").as_string(), rset.get("DATAREG").as_date().year())), s.cid2index(A_REVERSE));
// AUTOFATT
if(rset.get("AUTOFATT").as_string() == "X" || _ditta.partita_IVA() == clifo.get("PAIV"))
{
@ -328,10 +328,10 @@ void TSpeCheck_msk::fillDiff()
s.force_update();
s.show();
enableEdit(true);
enable_edit(true);
}
void TSpeCheck_msk::foundHomeland(TToken_string& row, TString numreg, TString codiva, TRectype& clifo)
void TSpe_check_msk::find_homeland(TToken_string& row, TString numreg, TString codiva, TRectype& clifo)
{
TSheet_field& s = sfield(F_RIGHE);
static TLocalisamfile mov(LF_MOV), rmov(LF_RMOVIVA);
@ -372,7 +372,7 @@ void TSpeCheck_msk::foundHomeland(TToken_string& row, TString numreg, TString co
// NATURA
row.add(natura(recRmov.get("CODIVA")), s.cid2index(A_NATURA));
// DETR
row.add(findDetraib(recRmov.get("TIPODET")), s.cid2index(A_DETRAIB));
row.add(find_detraib(recRmov.get("TIPODET")), s.cid2index(A_DETRAIB));
row.add(recMov.get("TIPO"), s.cid2index(A_TIPOCF));
row.add(recMov.get("CODCF"), s.cid2index(A_CODCF));
@ -382,9 +382,9 @@ void TSpeCheck_msk::foundHomeland(TToken_string& row, TString numreg, TString co
// RFSO
row.add(clifo.get("CODRFSO"), s.cid2index(A_RFSO));
// RSOC RFSO
row.add(getRFSO(clifo.get("CODRFSO")), s.cid2index(A_RAGSOCRFSO));
row.add(get_rfso(clifo.get("CODRFSO")), s.cid2index(A_RAGSOCRFSO));
// RC
row.add((revCharge(recMov.get("NUMREG"), recMov.get_date("DATAREG").year())), s.cid2index(A_REVERSE));
row.add((rev_charge(recMov.get("NUMREG"), recMov.get_date("DATAREG").year())), s.cid2index(A_REVERSE));
// AUTOFATT
if(_ditta.partita_IVA() == clifo.get("PAIV"))
{
@ -403,14 +403,14 @@ void TSpeCheck_msk::foundHomeland(TToken_string& row, TString numreg, TString co
}
void TSpeCheck_msk::fillCust()
void TSpe_check_msk::fill_cust()
{
TString query = "USE TRASFATT\n";
query << "SELECT BETWEEN(DATAREG,#DADATAREG,#ADATAREG)&&(TIPO=\"" << get(F_TIPOCF) << "\")";
if(get(F_CODCF) != "")
query << "&&STR((CODCF=#CODCF))";
getFilFlag(query);
get_fil_flag(query);
TISAM_recordset rset(query);
@ -462,7 +462,7 @@ void TSpeCheck_msk::fillCust()
nat.cut(0) << rset.get("NATURA").as_string();
row.add(nat.full() ? nat : natura(rset.get("CODIVA").as_string()), s.cid2index(A_NATURA));
// DETR
row.add(findDetraib(rset.get("TIPODET").as_string()), s.cid2index(A_DETRAIB));
row.add(find_detraib(rset.get("TIPODET").as_string()), s.cid2index(A_DETRAIB));
row.add(rset.get("TIPO").as_string(), s.cid2index(A_TIPOCF));
row.add(rset.get("CODCF").as_string(), s.cid2index(A_CODCF));
@ -472,9 +472,9 @@ void TSpeCheck_msk::fillCust()
// RFSO
row.add(clifo.get("CODRFSO"), s.cid2index(A_RFSO));
// RSOC RFSO
row.add(getRFSO(clifo.get("CODRFSO")), s.cid2index(A_RAGSOCRFSO));
row.add(get_rfso(clifo.get("CODRFSO")), s.cid2index(A_RAGSOCRFSO));
// RC
row.add((revCharge(rset.get("NUMREG").as_string(), rset.get("DATAREG").as_date().year())), s.cid2index(A_REVERSE));
row.add((rev_charge(rset.get("NUMREG").as_string(), rset.get("DATAREG").as_date().year())), s.cid2index(A_REVERSE));
// AUTOFATT
if(rset.get("AUTOFATT").as_string() == "X" || _ditta.partita_IVA() == clifo.get("PAIV"))
{
@ -493,15 +493,15 @@ void TSpeCheck_msk::fillCust()
}
s.force_update();
s.show();
enableEdit(true);
enable_edit(true);
}
void TSpeCheck_msk::getFilFlag(TString& query)
void TSpe_check_msk::get_fil_flag(TString& query)
{
switch(get_int(F_FLAG))
{
case 1:
query << "&&((TFINVIO=\"\")||(TFINVIO=\"X\")||(TFINVIO=\"F\")||(TFINVIO=\"E\"))";
query << R"(&&((TFINVIO="")||(TFINVIO="X")||(TFINVIO="F")||(TFINVIO="E")))";
break;
case 2:
query << "&&(TFINVIO=\"I\")";
@ -514,7 +514,7 @@ void TSpeCheck_msk::getFilFlag(TString& query)
}
}
void TSpeCheck_msk::enableEdit(bool en)
void TSpe_check_msk::enable_edit(const bool en)
{
// Abilito i bottoni
enable(DLG_ALL,en);
@ -554,7 +554,7 @@ void TSpeCheck_msk::enableEdit(bool en)
s.force_update();
}
void TSpeCheck_msk::selectAll()
void TSpe_check_msk::select_all()
{
_selected = !_selected;
TSheet_field& s = sfield(F_RIGHE);
@ -567,7 +567,7 @@ void TSpeCheck_msk::selectAll()
s.force_update();
}
void TSpeCheck_msk::saveAll()
void TSpe_check_msk::save_all()
{
TSheet_field& s = sfield(F_RIGHE);
FOR_EACH_SHEET_ROW(s, r, strarr)
@ -600,7 +600,7 @@ void TSpeCheck_msk::saveAll()
}
}
void TSpeCheck_msk::deleteAll()
void TSpe_check_msk::delete_all()
{
TSheet_field& s = sfield(F_RIGHE);
FOR_EACH_SHEET_ROW(s, r, strarr)
@ -623,7 +623,7 @@ void TSpeCheck_msk::deleteAll()
}
}
TSpeCheck_msk::TSpeCheck_msk() : TAutomask("tf0400a")
TSpe_check_msk::TSpe_check_msk() : TAutomask("tf0400a")
{
_ditta.init(LF_NDITTE, prefix().get_codditta());
_selected = false;
@ -643,7 +643,7 @@ TSpeCheck_app& app() { return (TSpeCheck_app&)main_app(); }
void TSpeCheck_app::main_loop()
{
TSpeCheck_msk msk;
TSpe_check_msk msk;
msk.set_has_fp(has_module(FPAUT));
msk.run();
}

View File

@ -35,11 +35,10 @@ TRectype getCli(const TString& tipocf, const TString& codcf, const TString& ocfp
}
// Controlla se l'azienda ha un RFSO
bool haveRFSO(TString& codrfso)
bool have_rfso(TString& codrfso)
{
codrfso = cache().get(LF_NDITTE, prefix().firm().codice(), "CODRFSO");
if(codrfso == "") return false;
return true;
return codrfso.full();
}
const char * natura(const TString& codiva)
@ -51,29 +50,29 @@ const char * natura(const TString& codiva)
return natura;
}
TString findDetraib(TString tipodet)
TString find_detraib(const TString& tipodet)
{
real perc = cache().get("%DET", tipodet, "R0");
real perc = static_cast<const char*>(cache().get("%DET", tipodet, "R0"));
return perc.stringa(6,2);
}
real get_IVA(const TString& codiva)
real get_iva(const TString& codiva)
{
const TRectype& ai = cache().get("%IVA", codiva);
return ai.get_real("R0");
}
TString revCharge(TString numreg, int year)
TString rev_charge(const TString& numreg, const int year)
{
// Controllo se la causale ha il reverse charge, se il cliente non l'ha impostata giusta sono ARAZZI suoi
TString key = numreg;
const TString& key = numreg;
TCausale caus(cache().get(LF_MOV, key, "CODCAUS"), year);
if(caus.reverse_charge())
bool tolla = true;
return caus.reverse_charge() ? "X" : "";
}
TString getRFSO(TString codrfso)
TString get_rfso(TString codrfso)
{
TString key; key << codrfso[0] << "|" << codrfso.mid(1);
return cache().get(LF_ANAG, key, "RAGSOC");
@ -82,19 +81,37 @@ TString getRFSO(TString codrfso)
/* Utilizzo questa funzione per filtrare al meglio i record, tutti i casi che devo omettere verranno rilevati e ritorneranno false
* Nota bene: viene sfruttato un puntatore di TISAM_Recordset per non creare nuovi oggetti e velocizzare la chiamata
* a questo punto il programma non ha ancora creato un record di $trasfatt con i dati che mi interessano
*
* ********************************************************************************************************************************
* Aggiornamento 06/03/2019: Aggiunta modalità esterometro! Che succede se abilito questa magia?
*
* Movimenti Attivi:
* Il ragionamento parte con questo presupposto: filtro in automatico che esclude tutti i soggetti che normalmente dovrebbero ricevere la fattura.
* Overrides:
* paf_sent: Anzichè filtrare codesti soggetti vado a vedere direttamente sui PAFFI per capire cosa ho inviato
* paf_not_sent: Stessa roba ma mostro solo i non inviati
* paf_sog_fat: Questo flag si considera solo se i primi due non sono abilitati, aggiunge allo sheet anche i soggetti a fattura (quindi è come se disabilitasse il filtro)
* paf_esteri: Questo flag si considera solo se i primi due non sono abilitati, aggiunge i clienti esteri
* I booleani paf_sent && paf_not_sent sono complementari così come paf_sog_fat && paf_esteri
* MA NOTA BENE CHE senza mod_esterometro nessun booleano viene preso in considerazione!
*
* Movimenti Passivi:
* Stessa roba sopra ma con paa_*
*/
bool checkRecord(TISAM_recordset* rec, bool has_fp)
bool check_record(TISAM_recordset* rec, const bool mod_esterometro,
const bool paf_not_sent, const bool paf_sent, const bool paf_sog_fat, const bool paf_esteri,
const bool paa_not_sent, const bool paa_sent, const bool paa_sog_fat, const bool paa_esteri)
{
// Il record non è valido se non è presente un cliente
if(rec->get("23.TIPO").as_string()[0] == '\0' || rec->get("23.CODCF").as_int() == 0)
return false;
TAnagrafica anaCli(rec->get("23.TIPO").as_string()[0], rec->get("23.CODCF").as_int(), rec->get("23.OCFPI").as_string());
TAnagrafica ana_cli(rec->get("23.TIPO").as_string()[0], rec->get("23.CODCF").as_int(), rec->get("23.OCFPI").as_string());
static TString keyClifo; keyClifo.cut(0) << rec->get("23.TIPO").as_string() << "|" << rec->get("23.CODCF").as_string();
TRectype rclifo = cache().get(LF_CLIFO, keyClifo);
static TString key_clifo; key_clifo.cut(0) << rec->get("23.TIPO").as_string() << "|" << rec->get("23.CODCF").as_string();
TRectype rclifo = cache().get(LF_CLIFO, key_clifo);
// Salto le schede carburanti
if(rclifo.get("ALLEG") == "C")
if(rclifo.get_char("ALLEG") == 'C')
return false;
// Clienti
@ -102,46 +119,111 @@ bool checkRecord(TISAM_recordset* rec, bool has_fp)
{
// Tolgo tutti i movimenti di sola IVA e in reverse charge o di tipo 3 (Acquisto di beni e servizi di soggetti non residenti)
TCausale caus(rec->get("23.CODCAUS").as_string(), rec->get("23.DATAREG").as_date().year());
const bool filter_revcharge = msk().get_bool(B_ESTEROMETRO) ? msk().get_bool(B_REVCHARGE) : false;
if(!filter_revcharge && caus.soloiva() && (caus.reverse_charge() || caus.regime_speciale() == 3))
if(caus.soloiva() && (caus.reverse_charge() || caus.regime_speciale() == 3))
return false;
// controllo se la fattura non è già stata spedita con la fatt. elettronica
static TPaf_record paf0100f("PAF0100F");
// controllo se il movimento è agganciato a un documento
if(msk().get_bool(B_ESTEROMETRO) && !rec->get("23.DPROVV").is_empty() && !rec->get("23.DANNO").is_empty() && !rec->get("23.DCODNUM").is_empty() && !rec->get("23.DNDOC").is_empty())
if (mod_esterometro)
{
// Controllo valido solo per utenti non F8
const bool check_paf_sent = msk().get_bool(B_PAF_SENT);
const bool check_paf_not_sent = msk().get_bool(B_PAF_NOT_SENT);
// Se l'utente ha il modulo FP e uno dei due filtri possibili non è stato selezionato, abilito il controllo sui paf
if(has_fp && (!check_paf_sent || !check_paf_not_sent))
// Parte Sirio FP w/ WebApp
// Faccio controlli per evitare controlli
if(paf_not_sent && paf_sent)
{
TString hfatt, bfatt;
TRectype rdoc(LF_DOC);
static TLocalisamfile doc(LF_DOC);
rdoc.put(DOC_PROVV, rec->get("23.DPROVV").as_string());
rdoc.put(DOC_PROVV, rec->get("23.DANNO").as_string());
rdoc.put(DOC_PROVV, rec->get("23.DCODNUM").as_string());
rdoc.put(DOC_PROVV, rec->get("23.DNDOC").as_string());
return true;
}
else if (paf_not_sent || paf_sent)
{
// controllo se la fattura non è già stata spedita con la fatt. elettronica
static TPaf_record paf0100f("PAF0100F");
// controllo se il movimento è agganciato a un documento
if (rec->get("23.DPROVV").is_full() && rec->get("23.DANNO").is_full() && rec->get("23.DCODNUM").is_full() && rec->get("23.DNDOC").is_full())
{
TString hfatt, bfatt;
TRectype rdoc(LF_DOC);
static TLocalisamfile doc(LF_DOC);
rdoc.put(DOC_PROVV, rec->get("23.DPROVV").as_string());
rdoc.put(DOC_PROVV, rec->get("23.DANNO").as_string());
rdoc.put(DOC_PROVV, rec->get("23.DCODNUM").as_string());
rdoc.put(DOC_PROVV, rec->get("23.DNDOC").as_string());
// Se riesco a generare la chiave, trovo il record e ha il flag di gestione in errore o un errore esterno, so che è stato inviato
const bool paf_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") != "*";
// Se voglio solo quelli inviati e non è stato inviato, RUSPA!
if (check_paf_sent && !paf_sent)
// Se riesco a generare la chiave, trovo il record e 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") != "*";
// Se voglio solo quelli inviati e non è stato inviato o
// voglio solo quelli non inviati ed è stato inviato, RUSPA!
if ((is_sent && !paf_sent) || (is_sent && paf_not_sent))
return false;
}
else
{
static bool warn_user = true;
if(warn_user)
{
TString msg;
msg << "Attenzione: il movimento " << rec->get("23.NUMREG") << " non deriva da nessuna fattura.\nSi desidera includerlo nella ricerca?";
switch (yesnoall_box(msg))
{
case K_YES:
return true;
break;
case K_SPACE:
warn_user = false;
case K_NO:
default:
return false;
}
}
// Se non dovrebbe capitare
return false;
// Se voglio solo quelli non inviati ed è stato inviato, RUSPA!
if (check_paf_not_sent && paf_sent)
}
}
// Parte tirchi che non comprano la mia WebApp
// Solito controllo per evitare controlli
else if(paf_sog_fat && paf_esteri)
{
return true;
}
else
{
const bool is_fatturabile = ana_cli.stato_partita_IVA() == "IT" || ana_cli.stato_partita_IVA() == "SM";
if ((is_fatturabile && !paf_sog_fat) || (is_fatturabile && paf_esteri))
return false;
}
}
} else if(anaCli.italiano() && anaCli.partita_IVA()[0] != '0' && anaCli.partita_IVA()[0] != '1' && anaCli.codice_fiscale()[0] > '8')
// Salto tutti i fornitori con cod cf che inizia per 8 o 9 e con p.iva non valida
} else
{
return false;
// Salto tutti i fornitori con cod cf che inizia per 8 o 9 e con p.iva non valida
if (ana_cli.italiano() && ana_cli.partita_IVA()[0] != '0' && ana_cli.partita_IVA()[0] != '1' && ana_cli.codice_fiscale()[0] > '8')
return false;
if (mod_esterometro)
{
// Parte Sirio FP w/ WebApp
// Faccio controlli per evitare controlli
if (paf_not_sent && paf_sent)
{
return true;
}
else if (paf_not_sent || paf_sent)
{
// Disabilitato, non si vuole implementare al momento
return false;
}
// Parte tirchi che non comprano la mia WebApp
// Solito controllo per evitare controlli
else if (paf_sog_fat && paf_esteri)
{
return true;
}
else
{
const bool is_fatturabile = ana_cli.stato_partita_IVA() == "IT" || ana_cli.stato_partita_IVA() == "SM";
if ((is_fatturabile && !paf_sog_fat) || (is_fatturabile && paf_esteri))
return false;
}
}
}
return true;

View File

@ -1,3 +1,6 @@
#ifndef __TFUTILITY_H
#define __TFUTILITY_H
#include <strings.h>
#include <recset.h>
@ -10,16 +13,20 @@ TRectype getTrasFatt(TString reg, TString codiva);
// Ritorna il cliente in un record di $clifo, con tipocf = "O" lo cerca in $occas
TRectype getCli(const TString& tipocf, const TString& codcf, const TString& ocfpi);
// Controlla se l'azienda ha un RFSO
bool haveRFSO(TString& codrfso);
bool have_rfso(TString& codrfso);
// Ritorna la natura da un codice IVA
const char * natura(const TString& codiva);
// Ritorna l'IVA
real get_IVA(const TString& codiva);
real get_iva(const TString& codiva);
// Ritorna la % di detraibilità
TString findDetraib(TString tipodet);
TString find_detraib(const TString& tipodet);
// Ritorna "X" se ha il reverse charge
TString revCharge(TString numreg, int year);
TString rev_charge(const TString& numreg, int year);
// Ritorna la ragione sociale del RFSO
TString getRFSO(TString codrfso);
TString get_rfso(TString codrfso);
// Controllo che sia un record che mi interessa
bool checkRecord(TISAM_recordset* rec, bool has_fp);
bool check_record(TISAM_recordset* rec, const bool mod_esterometro = false,
const bool paf_not_sent = false, const bool paf_sent = false, const bool paf_sog_fat = false, const bool paf_esteri = false,
const bool paa_not_sent = false, const bool paa_sent = false, const bool paa_sog_fat = false, const bool paa_esteri = false);
#endif //!__TFUTILITY_H