diff --git a/src/ve/ve0100.cpp b/src/ve/ve0100.cpp index 0bb6bf8b9..61cd28779 100755 --- a/src/ve/ve0100.cpp +++ b/src/ve/ve0100.cpp @@ -528,7 +528,7 @@ int TMotore_application::write( const TMask& m ) // C 90 } // 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; } @@ -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 // 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; } @@ -583,12 +583,15 @@ int TMotore_application::rewrite( const TMask& m ) // C 90 bool TMotore_application::remove() // C 90 { TDocumento& d = (TDocumento &) _rel->curr(); - - d.put(DOC_NOTE, "DELETING"); - do_elab(d); - const bool ok = TRelation_application::remove(); - if (ok) - edit_mask().save_father_rows(); + bool ok = checkPlafondDelete(d); + if(ok) + { + d.put(DOC_NOTE, "DELETING"); + do_elab(d); + ok = TRelation_application::remove(); + if(ok) + edit_mask().save_father_rows(); + } return ok; } @@ -1296,15 +1299,13 @@ void TMotore_application::preview() 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()); if(!plafond.hasValidPlafond()) // Se il cliente non mi interessa return NOERR; TAssoc_array tabIva = d.tabella_iva(true); - TDocumento oldDoc; - bool recalc = false; 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(alreadyExist) + if(plaUtil <= ZERO) { - // 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); - } - - // 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); - } + return NOERR; } + real plaRes = plafond.getPlaRes(); TToken_string used; @@ -1361,7 +1329,7 @@ int TMotore_application::checkPlafondAvailability(TDocumento& d, bool alreadyExi { 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 used = plafond.consPlaf(plaUtil, true); @@ -1377,15 +1345,180 @@ int TMotore_application::checkPlafondAvailability(TDocumento& d, bool alreadyExi } else { - if(recalc) - { - // Insert some cool code here - } d.put("PLAFOND", used); 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(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[]) { TMotore_application a; diff --git a/src/ve/ve0100.h b/src/ve/ve0100.h index 518d95676..ad171a5a0 100755 --- a/src/ve/ve0100.h +++ b/src/ve/ve0100.h @@ -108,7 +108,10 @@ public: 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(); }