Patch level : 12.0 476
Files correlati : ve Commento : - Divise le funzioni, adesso non ha più senso tenerle tutte collegate - Rifatta modifica del documento, vedere meglio commenti in checkPlafondRewrite() per le casistiche - Aggiunta eliminazione del documento, tranne in casi particolari avvisa soltanto senza limitare l'utente dal combinare danni git-svn-id: svn://10.65.10.50/branches/R_10_00@24193 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
556dc28d00
commit
f152762e16
@ -528,7 +528,7 @@ int TMotore_application::write( const TMask& m ) // C 90
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Aggiunte per il controllo plafond
|
// Aggiunte per il controllo plafond
|
||||||
if(has_module(LIAUT, CHK_DONGLE) && d.tipo().is_fattura() && ini_get_bool(CONFIG_DITTA, "ve", "USELETTERE") && checkPlafondAvailability(d) == -1)
|
if(has_module(LIAUT, CHK_DONGLE) && d.tipo().is_fattura() && ini_get_bool(CONFIG_DITTA, "ve", "USELETTERE") && checkPlafondWrite(d) == -1)
|
||||||
{
|
{
|
||||||
return _isnowarning;
|
return _isnowarning;
|
||||||
}
|
}
|
||||||
@ -564,7 +564,7 @@ int TMotore_application::rewrite( const TMask& m ) // C 90
|
|||||||
d = ((TDocumento_mask&)m).doc(); // Trasferisce il documento da maschera a record
|
d = ((TDocumento_mask&)m).doc(); // Trasferisce il documento da maschera a record
|
||||||
|
|
||||||
// Aggiunte per il controllo plafond
|
// Aggiunte per il controllo plafond
|
||||||
if(has_module(LIAUT, CHK_DONGLE) && d.tipo().is_fattura() && ini_get_bool(CONFIG_DITTA, "ve", "USELETTERE") && checkPlafondAvailability(d, true) == -1)
|
if(has_module(LIAUT, CHK_DONGLE) && d.tipo().is_fattura() && ini_get_bool(CONFIG_DITTA, "ve", "USELETTERE") && checkPlafondRewrite(d) == -1)
|
||||||
{
|
{
|
||||||
return _isnowarning;
|
return _isnowarning;
|
||||||
}
|
}
|
||||||
@ -583,12 +583,15 @@ int TMotore_application::rewrite( const TMask& m ) // C 90
|
|||||||
bool TMotore_application::remove() // C 90
|
bool TMotore_application::remove() // C 90
|
||||||
{
|
{
|
||||||
TDocumento& d = (TDocumento &) _rel->curr();
|
TDocumento& d = (TDocumento &) _rel->curr();
|
||||||
|
bool ok = checkPlafondDelete(d);
|
||||||
d.put(DOC_NOTE, "DELETING");
|
if(ok)
|
||||||
do_elab(d);
|
{
|
||||||
const bool ok = TRelation_application::remove();
|
d.put(DOC_NOTE, "DELETING");
|
||||||
if (ok)
|
do_elab(d);
|
||||||
edit_mask().save_father_rows();
|
ok = TRelation_application::remove();
|
||||||
|
if(ok)
|
||||||
|
edit_mask().save_father_rows();
|
||||||
|
}
|
||||||
return ok;
|
return ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1296,15 +1299,13 @@ void TMotore_application::preview()
|
|||||||
save_and_print(true, screenvis);
|
save_and_print(true, screenvis);
|
||||||
}
|
}
|
||||||
|
|
||||||
int TMotore_application::checkPlafondAvailability(TDocumento& d, bool alreadyExist)
|
int TMotore_application::checkPlafondWrite(TDocumento& d)
|
||||||
{
|
{
|
||||||
TLi_manager plafond(d.tipocf(), d.codcf(), d.data());
|
TLi_manager plafond(d.tipocf(), d.codcf(), d.data());
|
||||||
if(!plafond.hasValidPlafond()) // Se il cliente non mi interessa
|
if(!plafond.hasValidPlafond()) // Se il cliente non mi interessa
|
||||||
return NOERR;
|
return NOERR;
|
||||||
|
|
||||||
TAssoc_array tabIva = d.tabella_iva(true);
|
TAssoc_array tabIva = d.tabella_iva(true);
|
||||||
TDocumento oldDoc;
|
|
||||||
bool recalc = false;
|
|
||||||
|
|
||||||
real plaUtil = ZERO;
|
real plaUtil = ZERO;
|
||||||
|
|
||||||
@ -1316,44 +1317,11 @@ int TMotore_application::checkPlafondAvailability(TDocumento& d, bool alreadyExi
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Se il documento è già stato scritto nel DB sottraggo solo le modifiche
|
if(plaUtil <= ZERO)
|
||||||
if(alreadyExist)
|
|
||||||
{
|
{
|
||||||
// Prima di tutto controllo che non stia salvando la stessa roba che ho già, confronto il totale dei plafond con il totale da calcolare
|
return NOERR;
|
||||||
TToken_string lePlafs(d.get("PLAFOND"), ',');
|
|
||||||
real totPlaf = ZERO;
|
|
||||||
for(int i = 0; i < lePlafs.items(); i++)
|
|
||||||
{
|
|
||||||
// É + ottimizzato rispetto a farlo in una linea sola?
|
|
||||||
//static TToken_string thisPlaf; thisPlaf.cut(0) << lePlafs.get(i);
|
|
||||||
totPlaf += (real)((TToken_string)lePlafs.get(i)).get(_plimporto);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Se sono uguali esco
|
|
||||||
if(totPlaf == plaUtil)
|
|
||||||
return NOERR;
|
|
||||||
|
|
||||||
oldDoc = TDocumento('D', d.anno(), d.numerazione(), d.numero());
|
|
||||||
// Prima di tutto controllo che siano modificabili tutti i documenti dopo di lui
|
|
||||||
// Visto che ho delle funzioni già pronti in TLi_manager gli passo il controllo
|
|
||||||
switch(plafond.checkEditability(oldDoc))
|
|
||||||
{
|
|
||||||
case -1:
|
|
||||||
// ERRORE!
|
|
||||||
error_box("Impossibile modificare il documento, ci sono presenti altri documenti non modificabili successivamente");
|
|
||||||
return -1;
|
|
||||||
case 1:
|
|
||||||
// Altri documenti!
|
|
||||||
if(!yesno_box("Attenzione!! Sono presenti altri documenti successivi a questo, per continuare bisogna ricalcolarli tutti!\nVuoi continuare?"))
|
|
||||||
return -1;
|
|
||||||
else
|
|
||||||
recalc = true;
|
|
||||||
// Notare la mancanza del break
|
|
||||||
case 0:
|
|
||||||
default:
|
|
||||||
plafond.stornaDoc(oldDoc, true);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
real plaRes = plafond.getPlaRes();
|
real plaRes = plafond.getPlaRes();
|
||||||
|
|
||||||
TToken_string used;
|
TToken_string used;
|
||||||
@ -1361,7 +1329,7 @@ int TMotore_application::checkPlafondAvailability(TDocumento& d, bool alreadyExi
|
|||||||
{
|
{
|
||||||
used = plafond.incrPlaf(d, plaUtil, true);
|
used = plafond.incrPlaf(d, plaUtil, true);
|
||||||
}
|
}
|
||||||
else if(plaRes - plaUtil >= ZERO)
|
else
|
||||||
{
|
{
|
||||||
// Il controllo è andato bene, adesso mi segno i plafond che ho utilizzato nel memo del documento
|
// Il controllo è andato bene, adesso mi segno i plafond che ho utilizzato nel memo del documento
|
||||||
used = plafond.consPlaf(plaUtil, true);
|
used = plafond.consPlaf(plaUtil, true);
|
||||||
@ -1377,15 +1345,180 @@ int TMotore_application::checkPlafondAvailability(TDocumento& d, bool alreadyExi
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(recalc)
|
|
||||||
{
|
|
||||||
// Insert some cool code here
|
|
||||||
}
|
|
||||||
d.put("PLAFOND", used);
|
d.put("PLAFOND", used);
|
||||||
return NOERR;
|
return NOERR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int TMotore_application::checkPlafondRewrite(TDocumento& d)
|
||||||
|
{
|
||||||
|
TLi_manager plafond(d.tipocf(), d.codcf(), d.data());
|
||||||
|
if(!plafond.hasValidPlafond()) // Se il cliente non mi interessa
|
||||||
|
return NOERR;
|
||||||
|
|
||||||
|
TAssoc_array tabIva = d.tabella_iva(true);
|
||||||
|
TDocumento oldDoc;
|
||||||
|
|
||||||
|
real plaUtil = ZERO;
|
||||||
|
|
||||||
|
for (TRiepilogo_iva * totali = (TRiepilogo_iva *) tabIva.get(); totali != NULL; totali = (TRiepilogo_iva *) tabIva.get())
|
||||||
|
if(plafond.checkIva(totali->cod_iva().codice())) // Se l'iva del documento è diversa non mi interessa
|
||||||
|
plaUtil += totali->imp_orig();
|
||||||
|
|
||||||
|
if(plaUtil <= ZERO)
|
||||||
|
return NOERR;
|
||||||
|
|
||||||
|
// Prima di tutto controllo che non stia salvando la stessa roba che ho già, confronto il totale dei plafond con il totale da calcolare
|
||||||
|
TToken_string lePlafs(d.get("PLAFOND"), ',');
|
||||||
|
real totPlaf = ZERO;
|
||||||
|
for(int i = 0; i < lePlafs.items(); i++)
|
||||||
|
{
|
||||||
|
// É + ottimizzato rispetto a farlo in una linea sola?
|
||||||
|
//static TToken_string thisPlaf; thisPlaf.cut(0) << lePlafs.get(i);
|
||||||
|
totPlaf += (real)((TToken_string)lePlafs.get(i)).get(_plimporto);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calcolo le differenze tra il plafond attuale da verificare e quello precedente
|
||||||
|
if(totPlaf == plaUtil)
|
||||||
|
return NOERR;
|
||||||
|
|
||||||
|
real plaRes = plafond.getPlaRes();
|
||||||
|
TToken_string used;
|
||||||
|
/* Devo gestire queste modifiche dividendo in 4 parti:
|
||||||
|
* 1) > vecchio Doc : faccio la differenza nuovo - vecchio e provo a generare un used nuovo
|
||||||
|
* 2) > vecchio NC : aggiungo alla parte che già storno
|
||||||
|
* 3) < vecchio Doc : storno parte del plafond già utilizzato
|
||||||
|
* 4) < vecchio NC : verifico che il plafond stornato con questa NC non sia stato utilizzato, in caso negativo tutto OK, positivo blocco.
|
||||||
|
*/
|
||||||
|
if(totPlaf < plaUtil)
|
||||||
|
{
|
||||||
|
if(d.tipo().nota_credito()) // 2
|
||||||
|
{
|
||||||
|
plaUtil -= totPlaf;
|
||||||
|
used = plafond.incrPlaf(d, plaUtil, true);
|
||||||
|
}
|
||||||
|
else // 1
|
||||||
|
{
|
||||||
|
plaUtil -= totPlaf;
|
||||||
|
used = plafond.consPlaf(plaUtil, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(d.tipo().nota_credito()) // 4
|
||||||
|
{
|
||||||
|
if(plafond.checkUtilizzo(d, plaUtil))
|
||||||
|
{
|
||||||
|
TString msg = "Attenzione! Si sta cercando di modificare una Nota di Credito che influisce le seguenti lettere di intento: \n";
|
||||||
|
for(int i = 0; i < lePlafs.items(); i++)
|
||||||
|
{
|
||||||
|
msg << i+1 << " - N." << lePlafs.get(_plnumprot) << "\n";
|
||||||
|
}
|
||||||
|
msg << "Vuoi continuare?";
|
||||||
|
if(yesno_box(msg))
|
||||||
|
{
|
||||||
|
used = plafond.stornaDoc(d, totPlaf - plaUtil, true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
else // 3
|
||||||
|
{
|
||||||
|
used = plafond.stornaDoc(d, totPlaf - plaUtil, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(used.starts_with("ERRORE"))
|
||||||
|
{
|
||||||
|
plafond.revertModifiche();
|
||||||
|
warning_box(used);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
d.put("PLAFOND", used);
|
||||||
|
return NOERR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TMotore_application::checkPlafondDelete(TDocumento& d)
|
||||||
|
{
|
||||||
|
TLi_manager plafond(d.tipocf(), d.codcf(), d.data());
|
||||||
|
if(d.get("PLAFOND").blank() || !plafond.hasValidPlafond()) // Se la fattura non ha nulla scritto in plafond non mi interessa
|
||||||
|
return true;
|
||||||
|
|
||||||
|
TAssoc_array tabIva = d.tabella_iva(true);
|
||||||
|
TDocumento oldDoc;
|
||||||
|
|
||||||
|
// Prima di tutto controllo che non stia salvando la stessa roba che ho già, confronto il totale dei plafond con il totale da calcolare
|
||||||
|
TToken_string lePlafs(d.get("PLAFOND"), ',');
|
||||||
|
real totPlaf = ZERO;
|
||||||
|
for(int i = 0; i < lePlafs.items(); i++)
|
||||||
|
{
|
||||||
|
// É + ottimizzato rispetto a farlo in una linea sola?
|
||||||
|
//static TToken_string thisPlaf; thisPlaf.cut(0) << lePlafs.get(i);
|
||||||
|
totPlaf += (real)((TToken_string)lePlafs.get(i)).get(_plimporto);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calcolo le differenze tra il plafond attuale da verificare e quello precedente
|
||||||
|
if(totPlaf == ZERO)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
real plaRes = plafond.getPlaRes();
|
||||||
|
TToken_string used;
|
||||||
|
/* Devo gestire queste modifiche dividendo in 4 parti:
|
||||||
|
* 1) < vecchio Doc : storno parte del plafond già utilizzato
|
||||||
|
* 2) < vecchio NC : verifico che il plafond stornato con questa NC non sia stato utilizzato, in caso negativo tutto OK, positivo blocco.
|
||||||
|
*/
|
||||||
|
if(d.tipo().nota_credito()) // 2
|
||||||
|
{
|
||||||
|
if(plafond.checkUtilizzo(d, totPlaf))
|
||||||
|
{
|
||||||
|
TString msg = "Attenzione! Si sta cercando di modificare una Nota di Credito che influisce le seguenti lettere di intento: \n";
|
||||||
|
for(int i = 0; i < lePlafs.items(); i++)
|
||||||
|
{
|
||||||
|
TToken_string thisPlaf(lePlafs.get(i));
|
||||||
|
msg << i+1 << " - N." << thisPlaf.get(_plnumprot) << "\n";
|
||||||
|
}
|
||||||
|
msg << "Vuoi continuare?";
|
||||||
|
if(yesno_box(msg))
|
||||||
|
{
|
||||||
|
used = plafond.stornaDoc(d, totPlaf, true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else // 1
|
||||||
|
{
|
||||||
|
real plafSto = ZERO;
|
||||||
|
for(int i = 0; i < lePlafs.items(); i++)
|
||||||
|
{
|
||||||
|
TToken_string thisPlaf(lePlafs.get(i));
|
||||||
|
plafSto += static_cast<real>(thisPlaf.get(_plNC));
|
||||||
|
}
|
||||||
|
if(plafSto > ZERO)
|
||||||
|
{
|
||||||
|
if(!yesno_box(TR("Attenzione! Si sta cercando di eliminare un documento per cui sono presenti una o più note di variazione per un totale di %s€\nContinuare?"), TCurrency(plafSto).string()))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
used = plafond.stornaDoc(d, totPlaf, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(used.starts_with("ERRORE"))
|
||||||
|
{
|
||||||
|
plafond.revertModifiche();
|
||||||
|
warning_box(used);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
int ve0100( int argc, char* argv[])
|
int ve0100( int argc, char* argv[])
|
||||||
{
|
{
|
||||||
TMotore_application a;
|
TMotore_application a;
|
||||||
|
@ -108,7 +108,10 @@ public:
|
|||||||
|
|
||||||
virtual const char* get_next_key( );
|
virtual const char* get_next_key( );
|
||||||
|
|
||||||
int checkPlafondAvailability(TDocumento& d, bool alreadyExist = false); // Controllo aggiunto dal modulo Li per verificare la disponibilità di plafond
|
// Test Plafond
|
||||||
|
int checkPlafondWrite(TDocumento& d);
|
||||||
|
int checkPlafondRewrite(TDocumento& d);
|
||||||
|
bool checkPlafondDelete(TDocumento& d);
|
||||||
};
|
};
|
||||||
|
|
||||||
inline TMotore_application& app() { return (TMotore_application &) main_app(); }
|
inline TMotore_application& app() { return (TMotore_application &) main_app(); }
|
||||||
|
Loading…
x
Reference in New Issue
Block a user