Patch level : 12.0 452

Files correlati     : tf
Commento            : 
- Ottimizzato le TString
- Aggiunto algoritmo per prelevare il numero documento se il cliente registra i documenti in maniera non ordinata. 
Es. prima registra doc 1 poi 2 poi di nuovo aggiunge una registrazione dell'1
- Sostituite TToken_string di ricerca con std::map
- Tolto controllo flag prima dell'esportazione
- Aggiornato controllo record in tfutility

git-svn-id: svn://10.65.10.50/branches/R_10_00@24099 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
mtollari 2017-09-21 14:07:17 +00:00
parent a2f70340fd
commit 3347af023b
3 changed files with 38 additions and 18 deletions

View File

@ -878,14 +878,17 @@ TString TTrFa_app::getBody(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 /* 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 * Ok per OGNI cliente devo assegnarli un identificativo del numero della fattura
*/ */
TString keyMap; keyMap << strarr->get_char(_tipocf) << "|" << strarr->get_int(_codcf); static TString keyMap; keyMap.cut(0) << strarr->get_char(_tipocf) << "|" << strarr->get_int(_codcf);
clifoDoc app = mCliDoc[keyMap]; clifoDoc app = mCliDoc[keyMap];
if(add) if(add)
{
app.countDoc += 1; app.countDoc += 1;
app.docID.insert(std::pair<TString,long>(strarr->get(_numdoc), app.countDoc));
}
mCliDoc[keyMap] = app; mCliDoc[keyMap] = app;
TString body; body.format("%010d%010d", app.contCliFo, app.countDoc); static TString body; body.format("%010d%010d", app.contCliFo, app.docID[strarr->get(_numdoc)]);
return body; return body;
} }
@ -1078,7 +1081,8 @@ bool TTrFa_app::tff0400(TSheet_field& sheet)
{ {
// Siccome non siamo in grado di fare delle join devo in qualche modo evitare di caricare clienti già caricati quindi mi salvo tutto in un bel TToken_string e controllo // Siccome non siamo in grado di fare delle join devo in qualche modo evitare di caricare clienti già caricati quindi mi salvo tutto in un bel TToken_string e controllo
// Era troppo complicato fare una join codice cliente con i documenti per prendere solo quelli valorizzati. // Era troppo complicato fare una join codice cliente con i documenti per prendere solo quelli valorizzati.
TToken_string clifoSent = ""; std::map<TString, bool> clifoSent;
bool ok = true; bool ok = true;
TProgress_monitor p(sheet.items(),"Caricamento Clienti/Fornitori"); TProgress_monitor p(sheet.items(),"Caricamento Clienti/Fornitori");
FOR_EACH_SHEET_ROW(sheet, r, strarr) FOR_EACH_SHEET_ROW(sheet, r, strarr)
@ -1106,15 +1110,15 @@ bool TTrFa_app::tff0400(TSheet_field& sheet)
} }
// Controllo il clifo, se non c'è lo aggiungo altrimenti salto sto giro // Controllo il clifo, se non c'è lo aggiungo altrimenti salto sto giro
if(clifoSent.get_pos(checkClifo) < 0) if(clifoSent.find(checkClifo) == clifoSent.end())
clifoSent.add(checkClifo); clifoSent.insert(std::pair<TString, bool>(checkClifo,true));
else else
continue; continue;
TVariant vtipocf = strarr->get(_tipocf), vcodcf = strarr->get(_codcf), voccas = strarr->get(_occas); TVariant vtipocf = strarr->get(_tipocf), vcodcf = strarr->get(_codcf), voccas = strarr->get(_occas);
#ifdef DBG #ifdef DBG
if(vtipocf.as_string() == "F" && vcodcf.as_string() == "1814") if(vtipocf.as_string() == "C" && (vcodcf.as_string() == "2699" || vcodcf.as_string() == "3610"))
bool tolla = true; bool tolla = true;
#endif #endif
@ -1286,25 +1290,36 @@ bool TTrFa_app::tff0700(TSheet_field& sheet)
* Fattura * * Fattura *
********************************************************************************************************************/ ********************************************************************************************************************/
// Mentre per i clienti è una porcata per le fatture non posso fare altrimenti, potrebbe essere che i clienti mettono righe in fondo customizzate spezzando fatture // Mentre per i clienti è una porcata per le fatture non posso fare altrimenti, potrebbe essere che i clienti mettono righe in fondo customizzate spezzando fatture
TToken_string fattSent = ""; std::map<TString, bool> fattSent;
std::map<TString, long> docRighe;
bool ok = true; bool ok = true;
TProgress_monitor p(sheet.items(), "Caricamento Fatture"); TProgress_monitor p(sheet.items(), "Caricamento Fatture");
TString oldKey = ""; TString oldKey = "";
int numRiga; int numRiga;
FOR_EACH_SHEET_ROW(sheet, r, strarr) FOR_EACH_SHEET_ROW(sheet, r, strarr)
{ {
#ifdef DBG
if(strarr->get_char(_tipocf) == 'F' && strarr->get_long(_codcf) == 2409 && ((strcmp(strarr->get(_numdoc), "28070") == 0) || strcmp(strarr->get(_numdoc), "28072") == 0))
bool tolla = true;
#endif
if(!p.add_status()) if(!p.add_status())
return false; return false;
IF_IS_ENABLED(strarr); IF_IS_ENABLED(strarr);
// Chiave: Tipo C/F, Cod C/F, Numero doc. anno doc // Chiave: Tipo C/F, Cod C/F, Numero doc. anno doc
TString checkFatt; checkFatt << strarr->get_char(_tipocf) << "," << strarr->get_long(_codcf) << "," << strarr->get(_numdoc) << "," << TString(strarr->get(_datadoc)).right(4); static TString checkFatt;
if(fattSent.get_pos(checkFatt) < 0) checkFatt.cut(0) << strarr->get_long(_codcf) << "," << strarr->get(_numdoc) << "," << TString(strarr->get(_datadoc)).right(4);
if(fattSent.find(checkFatt) == fattSent.end())
{ {
fattSent.add(checkFatt); fattSent.insert(std::pair<TString, bool>(checkFatt,true));
// <DatiFatturaBody> // <DatiFatturaBody>
TTrFa_record tff0700f("TFF0700F"); TTrFa_record tff0700f("TFF0700F");
@ -1327,14 +1342,20 @@ bool TTrFa_app::tff0700(TSheet_field& sheet)
if(!ok) return false; if(!ok) return false;
} }
// In qualsiasi caso va messa la riga ma prima elaboro il numero della riga! // In qualsiasi caso va messa la riga ma prima elaboro il numero della riga!
TString newKey = getBody(strarr, false); static TString newKey; newKey.cut(0) << getBody(strarr, false);
if(oldKey != newKey)
if(docRighe.find(newKey) == docRighe.end())
{ {
numRiga = 1; numRiga = 1;
oldKey = newKey; docRighe.insert(std::pair<TString,long>(newKey, numRiga));
} }
else else
numRiga++; {
// Incremento e aggiorno
numRiga = docRighe[newKey] + 1;
docRighe[newKey] = numRiga;
}
ok = tff2200(strarr, numRiga); ok = tff2200(strarr, numRiga);
// E dopo l'inserimento del tff2200 // E dopo l'inserimento del tff2200
@ -1488,8 +1509,6 @@ void TTrFa_app::main_loop()
{ {
if(msk.checkNotEmpty()) if(msk.checkNotEmpty())
{ {
// Sistemo tutti i flag prima di inviare
msk.theFinalCheckDown();
send(&msk); send(&msk);
//ini_set_string(CONFIG_DITTA, "tf", "LastSend", ++TDate(msk.get(F_DATAFIN))); //ini_set_string(CONFIG_DITTA, "tf", "LastSend", ++TDate(msk.get(F_DATAFIN)));
} }

View File

@ -237,6 +237,7 @@ struct clifoDoc
{ {
long contCliFo; long contCliFo;
long countDoc; long countDoc;
std::map<TString, long> docID;
}; };
class TTrFa_app : public TSkeleton_application class TTrFa_app : public TSkeleton_application

View File

@ -97,7 +97,7 @@ bool checkRecord(TISAM_recordset* rec)
TCausale caus(rec->get("23.CODCAUS").as_string()); TCausale caus(rec->get("23.CODCAUS").as_string());
if(caus.soloiva() && (caus.reverse_charge() || caus.regime_speciale() == 3)) if(caus.soloiva() && (caus.reverse_charge() || caus.regime_speciale() == 3))
return false; return false;
} else if(rclifo.get("PAIV")[0] != '0' && rclifo.get("PAIV")[0] != '1' && rclifo.get("COFI")[0] >= '8') } else if((rclifo.get("STATOPAIV").blank() || rclifo.get("STATOPAIV") == "IT") && rclifo.get("PAIV")[0] != '0' && rclifo.get("PAIV")[0] != '1' && (rclifo.get("COFI")[0] == '8' || rclifo.get("COFI")[0] == '9'))
// Salto tutti i fornitori con cod cf che inizia per 8 o 9 e con p.iva non valida // Salto tutti i fornitori con cod cf che inizia per 8 o 9 e con p.iva non valida
{ {
return false; return false;