diff --git a/src/ve/clifor.cpp b/src/ve/clifor.cpp index ecb048cbf..ef4a92e3a 100755 --- a/src/ve/clifor.cpp +++ b/src/ve/clifor.cpp @@ -179,8 +179,6 @@ void TCli_for::init() // _ven_tipo = new TRecfield(_ven_rec, CFV_TIPOCF); // _ven_codice = new TRecfield(_ven_rec, CFV_CODCF); _use_lettere = main_app().has_module(LIAUT, CHK_DONGLE); - if (_use_lettere) - _use_lettere = ini_get_bool(CONFIG_DITTA, "ve", "USELETTERE"); } const TString& TCli_for::find_listino_al(const TDate& datadoc) const diff --git a/src/ve/clifor.h b/src/ve/clifor.h index 44b4bc0b0..2c2cb0ccc 100755 --- a/src/ve/clifor.h +++ b/src/ve/clifor.h @@ -21,7 +21,7 @@ #include #endif -class TDocumento; + class TDocumento; class TOccasionale : public TRectype { diff --git a/src/ve/ve0100.cpp b/src/ve/ve0100.cpp index bb9c70287..d411abc90 100755 --- a/src/ve/ve0100.cpp +++ b/src/ve/ve0100.cpp @@ -7,7 +7,6 @@ #include #include #include -#include "../li/lilib01.h" #include "ve0100.h" #include "veini.h" @@ -529,12 +528,6 @@ 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") && check_plafond_write(d) == -1) - { - return _isnowarning; - } - const int err = TRelation_application::write(m); if (err == NOERR) @@ -559,25 +552,19 @@ int TMotore_application::rewrite( const TMask& m ) // C 90 { TDocumento& d = (TDocumento &) _rel->curr(); TDocumento_mask& mask = (TDocumento_mask&) m; + int err = NOERR; - if (d.bloccato()) - return NOERR; - mask.mask2doc(); - 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") && check_plafond_rewrite(d) == -1) + if (!d.bloccato()) { - return _isnowarning; - } - - const int err = TRelation_application::rewrite(m); - - if (err == NOERR) - { - do_elab(d); - mask.update_father_rows(); - mask.save_father_rows(); + mask.mask2doc(); + d = ((TDocumento_mask&)m).doc(); // Trasferisce il documento da maschera a record + err = TRelation_application::rewrite(m); + if (err == NOERR) + { + do_elab(d); + mask.update_father_rows(); + mask.save_father_rows(); + } } return err; } @@ -585,15 +572,14 @@ int TMotore_application::rewrite( const TMask& m ) // C 90 bool TMotore_application::remove() // C 90 { TDocumento& d = (TDocumento &) _rel->curr(); - bool ok = check_plafond_delete(d); - if(ok) - { - d.put(DOC_NOTE, "DELETING"); - do_elab(d); - ok = TRelation_application::remove(); - if(ok) - edit_mask().save_father_rows(); - } + + d.put(DOC_NOTE, "DELETING"); + do_elab(d); + + bool ok = TRelation_application::remove(); + + if (ok) + edit_mask().save_father_rows(); return ok; } @@ -1315,226 +1301,6 @@ void TMotore_application::preview() save_and_print(true, screenvis); } -int TMotore_application::check_plafond_write(TDocumento& d) -{ - TLi_manager plafond(d.tipocf(), d.codcf(), d.data()); - if(!plafond.has_valid_plafond()) // Se il cliente non mi interessa - return NOERR; - - TAssoc_array tab_iva = d.tabella_iva(true); - - real pla_util = ZERO; - - for (TRiepilogo_iva * totali = dynamic_cast(tab_iva.get()); totali != nullptr; totali = dynamic_cast(tab_iva.get())) - { - if(plafond.check_iva(totali->cod_iva().codice())) // Se l'iva del documento è diversa non mi interessa - { - pla_util += totali->imp_orig(); - } - } - - if(pla_util <= ZERO) - { - return NOERR; - } - - real pla_res = plafond.get_pla_res(); - - TToken_string used; - if(d.tipo().nota_credito()) - { - used = plafond.incr_plaf(d, pla_util, true); - } - else - { - // Il controllo è andato bene, adesso mi segno i plafond che ho utilizzato nel memo del documento - used = plafond.cons_plaf(pla_util, true); - } - - if(used.starts_with("ERRORE")) - { - plafond.revert_modifiche(); - TString msg("Attenzione il plafond è stato superato di "); - msg << TCurrency(-(pla_res - pla_util)).string() << "€"; - warning_box(msg); - return -1; - } - else - { - d.put("PLAFOND", used); - return NOERR; - } -} - -int TMotore_application::check_plafond_rewrite(TDocumento& d) -{ - TLi_manager plafond(d.tipocf(), d.codcf(), d.data()); - if(!plafond.has_valid_plafond()) // Se il cliente non mi interessa - return NOERR; - - TAssoc_array tab_iva = d.tabella_iva(true); - TDocumento old_doc; - - real pla_util = ZERO; - - for (TRiepilogo_iva * totali = dynamic_cast(tab_iva.get()); totali != nullptr; totali = dynamic_cast(tab_iva.get())) - if(plafond.check_iva(totali->cod_iva().codice())) // Se l'iva del documento è diversa non mi interessa - pla_util += totali->imp_orig(); - - if(pla_util <= 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 le_plafs(d.get("PLAFOND"), ','); - real tot_plaf = ZERO; - for(int i = 0; i < le_plafs.items(); i++) - { - // É + ottimizzato rispetto a farlo in una linea sola? - //static TToken_string thisPlaf; thisPlaf.cut(0) << lePlafs.get(i); - tot_plaf += static_cast(static_cast(le_plafs.get(i)).get(_plimporto)); - } - - // Calcolo le differenze tra il plafond attuale da verificare e quello precedente - if(tot_plaf == pla_util) - return NOERR; - - real pla_res = plafond.get_pla_res(); - 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(tot_plaf < pla_util) - { - if(d.tipo().nota_credito()) // 2 - { - pla_util -= tot_plaf; - used = plafond.incr_plaf(d, pla_util, true); - } - else // 1 - { - pla_util -= tot_plaf; - used = plafond.cons_plaf(pla_util, true); - } - } - else - { - if(d.tipo().nota_credito()) // 4 - { - if(plafond.check_utilizzo(d, pla_util)) - { - 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 < le_plafs.items(); i++) - { - msg << i+1 << " - N." << le_plafs.get(_plnumprot) << "\n"; - } - msg << "Vuoi continuare?"; - if(yesno_box(msg)) - { - used = plafond.storna_doc(d, tot_plaf - pla_util, true); - } - else - return -1; - } - else - return -1; - } - else // 3 - { - used = plafond.storna_doc(d, tot_plaf - pla_util, true); - } - } - - if(used.starts_with("ERRORE")) - { - plafond.revert_modifiche(); - warning_box(used); - return -1; - } - else - { - d.put("PLAFOND", used); - return NOERR; - } -} - -bool TMotore_application::check_plafond_delete(TDocumento& d) -{ - TLi_manager plafond(d.tipocf(), d.codcf(), d.data()); - if(d.get("PLAFOND").blank() || !plafond.has_valid_plafond()) // Se la fattura non ha nulla scritto in plafond non mi interessa - return true; - - TAssoc_array tab_iva = d.tabella_iva(true); - TDocumento old_doc; - - // 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 le_plafs(d.get("PLAFOND"), ','); - real totPlaf = ZERO; - for(int i = 0; i < le_plafs.items(); i++) - { - // É + ottimizzato rispetto a farlo in una linea sola? - //static TToken_string thisPlaf; thisPlaf.cut(0) << lePlafs.get(i); - totPlaf += static_cast(static_cast(le_plafs.get(i)).get(_plimporto)); - } - - // Calcolo le differenze tra il plafond attuale da verificare e quello precedente - if(totPlaf == ZERO) - return true; - - real pla_res = plafond.get_pla_res(); - 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.check_utilizzo(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 < le_plafs.items(); i++) - { - TToken_string this_plaf(le_plafs.get(i)); - msg << i+1 << " - N." << this_plaf.get(_plnumprot) << "\n"; - } - msg << "Vuoi continuare?"; - if(yesno_box(msg)) - { - used = plafond.storna_doc(d, totPlaf, true); - } - else - return false; - } - else - return false; - } - else // 1 - { - real plaf_sto = ZERO; - for(int i = 0; i < le_plafs.items(); i++) - { - TToken_string this_plaf(le_plafs.get(i)); - plaf_sto += static_cast(this_plaf.get(_plNC)); - } - if(plaf_sto > 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(plaf_sto).string())) - return false; - } - used = plafond.storna_doc(d, totPlaf, true); - } - - if(used.starts_with("ERRORE")) - { - plafond.revert_modifiche(); - 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 ef1610e05..5033721aa 100755 --- a/src/ve/ve0100.h +++ b/src/ve/ve0100.h @@ -109,10 +109,6 @@ public: bool TMotore_application::get_next_key(TToken_string& key); // virtual const char* get_next_key( ); - // Test Plafond - int check_plafond_write(TDocumento& d); - int check_plafond_rewrite(TDocumento& d); - bool check_plafond_delete(TDocumento& d); }; inline TMotore_application& app() { return (TMotore_application &) main_app(); } diff --git a/src/ve/ve0200b.uml b/src/ve/ve0200b.uml index 92a9ef460..cc8f8812d 100755 --- a/src/ve/ve0200b.uml +++ b/src/ve/ve0200b.uml @@ -77,22 +77,16 @@ BEGIN FIELD LIVPERART END -BOOLEAN F_USELETTERE -BEGIN - PROMPT 2 14 "Utilizzo lettere d'intento" - FIELD USELETTERE -END - CURRENCY F_IMPMINFAT 10 BEGIN - PROMPT 2 15 "Importo minimo fatture " + PROMPT 2 14 "Importo minimo fatture " FIELD IMPMINFAT PICTURE "." END CURRENCY F_IMPMINEFF 10 BEGIN - PROMPT 2 16 "Importo minimo per effetti " + PROMPT 2 15 "Importo minimo per effetti " FIELD IMPMINEFF PICTURE "." END diff --git a/src/ve/ve0600.cpp b/src/ve/ve0600.cpp index d5d664f9b..c8dba9996 100755 --- a/src/ve/ve0600.cpp +++ b/src/ve/ve0600.cpp @@ -7,7 +7,7 @@ #include #include -#include "../cg/cglib01.h" +#include "../cg/cglib.h" /////////////////////////////////////////////////////////// // Applicazione per gestione maschere di modulo diff --git a/src/ve/ve1500.cpp b/src/ve/ve1500.cpp index def22948d..a79bd2d8a 100755 --- a/src/ve/ve1500.cpp +++ b/src/ve/ve1500.cpp @@ -7,7 +7,7 @@ #include #include -#include "../cg/cg2103.h" +#include "../cg/cglib.h" #include "velib.h" #include "ve1.h" diff --git a/src/ve/ve3800.cpp b/src/ve/ve3800.cpp index 2b91ceed5..2a8880b63 100755 --- a/src/ve/ve3800.cpp +++ b/src/ve/ve3800.cpp @@ -9,7 +9,7 @@ #include #include -#include "../cg/cglib01.h" +#include "../cg/cglib.h" #include "velib07.h" /////////////////////////////////////////////////////////// diff --git a/src/ve/ve6.cpp b/src/ve/ve6.cpp index 9e74295af..ce37093ae 100755 --- a/src/ve/ve6.cpp +++ b/src/ve/ve6.cpp @@ -4,12 +4,8 @@ int main( int argc, char** argv ) { - //int r = (argc > 1) ? argv[1][1]-'0' : -1; - /* - if(argv[1][2] > 0) - r = r * 10 + argv[1][2]-'0'; - */ - int r = (argc > 1) ? atoi(++argv[1]) : -1; + const char * s = argv[1]; s++; + int r = (argc > 1) ? atoi(s) : -1; switch (r) { diff --git a/src/ve/ve6200.cpp b/src/ve/ve6200.cpp index 83f6d5970..6a81fe856 100755 --- a/src/ve/ve6200.cpp +++ b/src/ve/ve6200.cpp @@ -1,6 +1,7 @@ //#include #include #include +#include #include "velib04.h" #include "ve6200.h" @@ -34,50 +35,17 @@ bool TFatturazione_bolle_app::process(TProgress_monitor& iw, TElaborazione & eld if (eld.elabora(din, dout, data_elab)) { TString msg; + msg << din.items() << TR(" documenti raggruppati in ") << dout.items(); iw.set_text(msg); // Messaggio sul cliente do_events(); // Attende visualizzazione + lint_batch(true); + lint_reset_msg(); + int err = dout.write(); // Scrive documenti di output - // Test Plafond - TToken_string tipi, stati; - create_tipi_stati(tipi, stati); - int clifo = din[0].clifor().codice(); - - TDate aData(data_elab); - TLi_manager currentCli('C', clifo, aData); // Inizializzo l'oggetto per la gestione del plafond - real plafond, res_plafond, tot_fat; - if (currentCli.has_valid_plafond()) - { - plafond = currentCli.get_plafond(); - res_plafond = plafond - currentCli.elab_util(tipi, stati, aData); - for (int i = 0; i < din.items(); ++i) - tot_fat += din[i].totale_doc(); - - TLog_report lerr; - if (tot_fat > res_plafond) - { - bool plur = din.items() > 1; - TString err; - err << "Errore durante la generazione del plafond:\n" << - (plur ? "I documenti da elaborare superano" : "Il documento da elaborare supera") << " il plafond per questo cliente.\n" - "Plafond rimanente: %s\n" << - (plur ? "Totale fatture: %s\n" : "Totale fattura: %s\n") << - (plur ? "Le fatture non sono state create." : "La fattura non e' stata creata."); - return error_box(err, res_plafond.string(), tot_fat.string()); - } - - // Una volta che di documenti sono elaborati ci scrivo sopra il valore del plafond - scrivi_plafond(dout, data_elab); - //if (!popola_plafond(dout, data_elab)) - //{ - // return error_box("Errore durante la generazione del plafond, le fatture non son state create"); - //} - - } - - int err = dout.write(); // Scrive documenti di output - if (err == NOERR) + lint_batch(false); + if (err == NOERR) { err = din.rewrite(); // Aggiorna stato dei documenti di input if (err != NOERR) @@ -85,7 +53,12 @@ bool TFatturazione_bolle_app::process(TProgress_monitor& iw, TElaborazione & eld } else ok = error_box("Errore %d durante l'aggiornamento dei documenti da raggruppare!", err); - } + + const TString & str = lint_get_msg(); + + if (str.full()) + ok = error_box(str); + } return ok; } @@ -423,40 +396,66 @@ bool TFatturazione_bolle_app::test_dicint(const TMask& m) const long dn = m.get_long(F_NUMERO_DOCUMENTO_DA); const long an = m.get_long(F_NUMERO_DOCUMENTO_A); - TElaborazione& eld = *elab(m.get(F_CODICE_ELAB)); + TElaborazione * eld = elab(m.get(F_CODICE_ELAB)); TToken_string tipidoc(24), statidoc(10); - eld.tipi_stati_iniziali(tipidoc, statidoc); + eld->tipi_stati_iniziali(tipidoc, statidoc); - TTipo_documento t(eld.tipo_iniziale(0)); + TTipo_documento t(eld->tipo_iniziale(0)); char tipocf(t.tipocf()); TLista_cf clienti(tipocf); + TString msg(80); + const int tot_cli = clienti.leggi_doc(*eld, dd, ad, dc, ac, da, aa, dz, az); + TLog_report lerr(TR("Errori controllo plafond")); + bool err = false; - const int tot_cli = clienti.leggi_doc(eld, dd, ad, dc, ac, da, aa, dz, az); - - TString msg(80); - - - TLog_report lerr(TR("Errori controllo plafond e CONAI")); - lerr.log(0,"\n"); - bool err = false; + lerr.log(0,"\n"); for (int c = 0; c < tot_cli; c++) { const long codcli = clienti[c]; // Codice cliente in esame + TLi_manager cli('C', codcli, data_elab.year()); // Inizializzo l'oggetto per la gestione del plafond - TLi_manager currentCli(tipocf, codcli, ad); // Inizializzo l'oggetto per la gestione del plafond + if (cli.has_valid_plafond()) + { + bool ok = true; + real plafond, res_plafond, utilizzo; + TLista_documenti din; // Legge tutti i documenti di input + din.read('D', tipocf, codcli, anno, tipidoc, statidoc, dd, ad, codnum, dn, an); - if (currentCli.has_valid_plafond()) - { - TLista_documenti din; // Legge tutti i documenti di input - din.read('D', tipocf, codcli, anno, tipidoc, statidoc, dd, ad, codnum, dn, an); - if (din.items() > 0) - { - err |= currentCli.test_plafond(din, lerr); - } - } + lint_batch(true); + lint_reset_msg(); + plafond = cli.get_plafond(); + res_plafond = cli.get_residuo(); + for (int i = 0; i < din.items(); i++) + { + const real importo_utilizzato = din[i].importo_plafond(); + TToken_string plafs(din[i].get(DOC_PLAFOND), ','); + const TDate datadoc = din[i].get_date(DOC_DATADOC); + + utilizzo += importo_utilizzato; + ok = cli.utilizza_plafond(din[i], plafs, importo_utilizzato); + } + cli.set_dirty(false); + lint_batch(false); + if (!ok || utilizzo > res_plafond) + { + bool plur = din.items() > 1; + TString err; + const TString & str = lint_get_msg(); + + msg << TR("Errore durante la generazione del plafond:\n"); + msg << (plur ? TR("I documenti da elaborare superano") : TR("Il documento da elaborare supera")); + msg << TR(" il plafond per questo cliente.") << '\n'; + msg << TR("Plafond rimanente: ") << res_plafond << '\n'; + msg << TR("Totale plafond in fattura : ") << utilizzo << '\n'; + msg << (plur ? TR("Le fatture non sono state create.") : TR("La fattura non e' stata creata.")); + if (str.full()) + msg << '\n' << str; + lerr.log(0, msg); + } + err &= !ok; + } } - - delete &eld; + safe_delete(eld); if(err) { lerr.print_or_preview(); diff --git a/src/ve/ve6500.cpp b/src/ve/ve6500.cpp index e7833ffdf..c4c7014e3 100755 --- a/src/ve/ve6500.cpp +++ b/src/ve/ve6500.cpp @@ -6,7 +6,7 @@ #include #include -#include "../cg/cglib01.h" +#include "../cg/cglib.h" #include "../mg/mglib.h" #include "ve6.h" diff --git a/src/ve/ve6600.cpp b/src/ve/ve6600.cpp index a663d1365..6a70b7c5a 100755 --- a/src/ve/ve6600.cpp +++ b/src/ve/ve6600.cpp @@ -3,7 +3,7 @@ #include #include -#include "../cg/cg2103.h" +#include "../cg/cglib.h" #include "../mg/anamag.h" #include diff --git a/src/ve/ve6b00.cpp b/src/ve/ve6b00.cpp index 2578fcad7..e6816f2ee 100644 --- a/src/ve/ve6b00.cpp +++ b/src/ve/ve6b00.cpp @@ -31,7 +31,7 @@ public: // Controlla se lo stato ed il tipo del documento sono validi e rispettano la selezione bool doc_tipo_stato_ok(const TRectype& doc); // Constructor and Distructor - TEliminazione_documenti_mask(): TAutomask("ve61000a") {} + TEliminazione_documenti_mask(): TAutomask("ve6b00a") {} ~TEliminazione_documenti_mask() {} }; diff --git a/src/ve/velib.h b/src/ve/velib.h index 772ee7d2b..63609a353 100755 --- a/src/ve/velib.h +++ b/src/ve/velib.h @@ -58,7 +58,9 @@ class TSelect_color_mask; #include #endif -#include +#ifndef __LILIB01_H +#include "../li/lilib01.h" +#endif #define RIGA_MERCE 'M' #define RIGA_SPESEDOC 'S' @@ -710,9 +712,7 @@ public: TRiga_documento(TDocumento* doc, const char* tipo = NULL); TRiga_documento(const TRiga_documento & row); - /* Maialata inguardabile: guai a chi la riporta! - TRiga_documento(const TRiga_documento& rec, TDocumento* doc, const char* tipo = NULL); */ - virtual ~TRiga_documento() {} + virtual ~TRiga_documento() {} }; enum TTipo_importo { _lordo, _netto, _imposta }; @@ -772,6 +772,7 @@ class TDocumento : public TMultiple_rectype // velib03 char _stato_originale; TCli_for _cli_for; + TLi_manager *_plafond; TOccasionale _occas; TPagamento _pag; TAssoc_array _tabella_iva; // tabella di imponibili ed imposte @@ -842,6 +843,9 @@ public: const TRiepilogo_iva * riepilogo_iva(const char * cod) const { return (const TRiepilogo_iva *) _tabella_iva.objptr(cod); } const TRiepilogo_iva * riepilogo_iva(int index) const { return (index >= 0 && index < _cod_iva.items()) ? riepilogo_iva(_cod_iva.row(index)) : NULL; } TCli_for& clifor(bool force_reload = false) const; + TLi_manager & plafond(bool force_reload = false); + const real importo_plafond() const; + const real importo_plafond_salvato() const; TOccasionale& occas() const; const TAgente& agente(bool first = true) const; const TString& riferimento(TString& rif) const { return tipo().riferimento(*this, rif); } diff --git a/src/ve/velib03.cpp b/src/ve/velib03.cpp index 18ca76bb3..4eed420d6 100755 --- a/src/ve/velib03.cpp +++ b/src/ve/velib03.cpp @@ -5,8 +5,7 @@ #include #include -#include "velib.h" - +#include "../cg/cglib.h" #include "../db/dblib.h" #include "../pr/prlib.h" #include "../li/letint.h" @@ -18,11 +17,11 @@ #include #include "veini.h" - +#include "velib.h" #include "sconti.h" #include "vepriv.h" #include "veuml.h" -#include + /////////////////////////////////////////////////////////// // TTipo_documento_cache @@ -252,6 +251,7 @@ void TDocumento::init() _codcf = new TRecfield(*this, DOC_CODCF); _cod_occas = new TRecfield(*this, DOC_OCFPI); + _plafond = nullptr; _sconto = _esenzione = _valfisc = nullptr; _stato_originale = ' '; _dirty_deny = false; @@ -309,6 +309,7 @@ TDocumento::~TDocumento() safe_delete(_sconto); safe_delete(_esenzione); safe_delete(_valfisc); + safe_delete(_plafond); } const TString& TDocumento::codiva_spese() const @@ -935,23 +936,17 @@ void TDocumento::set_riga_sconto() void TDocumento::update_esenzione() { - if (clifor().use_lettere()) + if (!clifor().use_lettere()) { bool to_update = false; const TString4 codiva = codesiva(); - for (int i = physical_rows(); !to_update && i > 0; i--) - { - const TString & cod = row(i).get(RDOC_CODIVA); - to_update = cod.full() && cod != codiva; - } - - if (to_update) - for (int i = physical_rows(); i > 0; i--) + + for (int i = physical_rows(); i > 0; i--) { TRiga_documento & rdoc = row(i); const TString& cod = rdoc.get(RDOC_CODIVA); - if (cod.full()) + if (cod.blank()) { if (codiva.full()) rdoc.put(RDOC_CODIVA, codiva); @@ -995,78 +990,71 @@ void TDocumento::update_esenzione() } } } - } + } } } void TDocumento::set_riga_esenzione() -{ - TCli_for & c = clifor(); - const TCodiceIVA codes(c.vendite().get(CFV_ASSFIS)); - TString16 v_esenzione; - TString16 v_data_esenzione; - TString16 n_registrazione; - TString16 n_data_registrazione; - const bool multi_plaf = c.use_lettere() && get("PLAFOND").full(); // Gestione multiplafond su documento - if (codes.codice().full() && !multi_plaf) +{ + TCli_for & c = clifor(); + + if (c.use_lettere()) { - get_protocolli_esenzione(v_esenzione, v_data_esenzione, n_registrazione, n_data_registrazione); - } - // Tradotto: se ha il cod. esenzione AND (i protocolli pieni OR multiplaf) - bool esente = codes.tipo().not_empty() && ((v_esenzione.not_empty() && - v_data_esenzione.not_empty() && n_registrazione.not_empty() && - n_data_registrazione.not_empty()) || multi_plaf); - if (esente) - { - esente = false; - const TString4 codiva = codes.codice(); - for (int i = physical_rows(); !esente && i > 0; i--) - esente = row(i).get(RDOC_CODIVA) == codiva; - } - - if (!esente) - { - if (_esenzione != NULL) - { - delete _esenzione; - _esenzione = NULL; - } - } - else - { - static TString4 _tipo_riga_es; - static TString80 _des_esenz; - static real _bollo_es; - if (_tipo_riga_es.empty()) - { - TConfig conf(CONFIG_STUDIO, "ve"); - _tipo_riga_es = conf.get("TRESENZ", "ve"); - _bollo_es = (real)conf.get("BOLLIES", "ve"); - if (_tipo_riga_es.empty()) - { - _tipo_riga_es = "05"; - conf.set("TRESENZ", _tipo_riga_es); - warning_box("Il tipo riga esenzione non risultava impostato.\n L'applicazione userà automaticamente il tipo %s", (const char*) _tipo_riga_es); - } - _des_esenz = conf.get("DESESENZ", "ve"); - if (_des_esenz.not_empty()) - _des_esenz.insert(" "); - _des_esenz.insert("Fattura non imponibile"); - } - if (_esenzione == NULL) - _esenzione = new TRiga_documento(this, _tipo_riga_es); - TString d = _des_esenz; - TToken_string le_plafs(get("PLAFOND"), ','); - d << (multi_plaf ? " come dalle vostre dichiarazioni:\n" : " come da vostra dichiarazione:\n"); - for(int i = 0; i < le_plafs.items(); i++) + const TCodiceIVA codes(c.vendite().get(CFV_ASSFIS)); + bool esente = false; + + if (codes.tipo().not_empty() || iva_plafond().not_empty()) + for (int i = physical_rows(); !esente && i > 0; i--) + esente = check_iva_plafond(row(i).get(RDOC_CODIVA)); + if (!esente) + safe_delete(_esenzione); + else { - static TToken_string this_plaf; this_plaf.cut(0) << le_plafs.get(i); - static TString key; key.cut(0) << this_plaf.get(0) << "|" << this_plaf.get(1); - TRectype plaf = cache().get(LF_LETINT, key); - d << "N. di protocollo di invio: " << plaf.get(LETINT_PROTINTF) << "-" << plaf.get(LETINT_PROTINTS) << " del " << plaf.get(LETINT_VSDATA) << "\n"; + static TString4 _tipo_riga_es; + static TString80 _des_esenz; + static real _bollo_es; + + if (_tipo_riga_es.empty()) + { + TConfig conf(CONFIG_STUDIO, "ve"); + _tipo_riga_es = conf.get("TRESENZ", "ve"); + _bollo_es = (real)conf.get("BOLLIES", "ve"); + if (_tipo_riga_es.empty()) + { + _tipo_riga_es = "05"; + conf.set("TRESENZ", _tipo_riga_es); + warning_box("Il tipo riga esenzione non risultava impostato.\n L'applicazione userà automaticamente il tipo %s", (const char*)_tipo_riga_es); + } + _des_esenz = conf.get("DESESENZ", "ve"); + if (_des_esenz.not_empty()) + _des_esenz.insert(" "); + _des_esenz.insert("Fattura non imponibile"); + } + if (_esenzione == NULL) + _esenzione = new TRiga_documento(this, _tipo_riga_es); + + TString d = _des_esenz; + TToken_string plafs(get(DOC_PLAFOND), ','); + const int items = plafs.items(); + + d << (items > 1 ? TR("come dalle vostre dichiarazioni:\n") : TR(" come da vostra dichiarazione:\n")); + for (int i = 0; i < items; i++) + { + TToken_string plaf(plafs.get(i)); + real utilizzo = plaf.get_real(_plimporto); + + if (utilizzo != ZERO) + { + + TToken_string key(plaf.get(_planno)); key.add(plaf.get(_plnumprot)); + const TRectype & rec_plaf = cache().get(LF_LETINT, key); + + d << TR("N. di protocollo di invio: ") << rec_plaf.get(LETINT_PROTINTF) << TR("-") << rec_plaf.get(LETINT_PROTINTS) << " del " << rec_plaf.get(LETINT_VSDATA) << "\n"; + } + } + _esenzione->set_descr(d); } - _esenzione->set_descr(d); - } + } } void TDocumento::set_riga_valfisc() @@ -1570,7 +1558,10 @@ int TDocumento::write_rewrite(TBaseisamfile & f, bool re) const ((TDocumento *)this)->put(DOC_DOCEVASO, docevaso); // Tutte le righe evase -> doc evaso } // Almeno una riga aperta -> doc aperto - err = TMultiple_rectype::write_rewrite(f, re); + // Aggiunte per il controllo plafond + ((TDocumento &)*this).plafond().write_rewrite((TDocumento &)*this, re); + + err = TMultiple_rectype::write_rewrite(f, re); if (!doc_bloccato && err == NOERR) { @@ -1673,6 +1664,7 @@ int TDocumento::remove(TBaseisamfile& f) const TDocumento& myself = *((TDocumento *)this); myself.update_provvigioni(true); } + ((TDocumento &)*this).plafond().remove((TDocumento &)*this); } return TMultiple_rectype::remove(f); } @@ -2677,21 +2669,25 @@ void TDocumento::put_str(const char* fieldname, const char* val) } else dirty_fields(); - } else - if (fn == DOC_CODCF) - { - const TString8 v(val); - put(DOC_SPESEUPD, TRectype::get(DOC_CODCF) == v); - TAuto_variable_rectype::put_str(fieldname, v); - dirty_fields(); - } - else - { - TAuto_variable_rectype::put_str(fieldname, val); - dirty_fields(); - if (fn == DOC_SCONTOPERC) - set_riga_sconto(); } + else + if (fn == DOC_CODCF) + { + put(DOC_SPESEUPD, TRectype::get(DOC_CODCF) == val); + TAuto_variable_rectype::put_str(fieldname, val); + dirty_fields(); + plafond(); + } + else + { + TAuto_variable_rectype::put_str(fieldname, val); + dirty_fields(); + if (fn == DOC_SCONTOPERC) + set_riga_sconto(); + else + if (fn == DOC_DATADOC) + plafond(); + } } const TString& TDocumento::get_str(const char* fieldname) const @@ -2720,6 +2716,55 @@ TCli_for& TDocumento::clifor(bool force_reload) const return cf; } +const real TDocumento::importo_plafond() const +{ + real importo_plafond; + + FOR_EACH_PHYSICAL_RDOC(*this, r, row) + // Se l'iva del documento è diversa non mi interessa + if (!row->is_descrizione() && !row->is_descrizione()) + { + const TString & codiva = row->iva().codice(); + + if (codiva.full() && check_iva_plafond(codiva)) + importo_plafond += row->imponibile(); + } + if (is_nota_credito()) + importo_plafond = -importo_plafond; + return importo_plafond; +} + +const real TDocumento::importo_plafond_salvato() const +{ + real importo_plafond; + TToken_string plafs(get(DOC_PLAFOND), ','); + const int items = plafs.items(); + + for (int i = 0; i < items; i++) + { + TToken_string plaf(plafs.get(i)); + + importo_plafond += plaf.get_real(_plimporto); + } + return importo_plafond; +} + +TLi_manager & TDocumento::plafond(bool force_reload) +{ + const char tipo = tipocf(); + const long codice = codcf(); + const TDate data = get_date(DOC_DATADOC); + const int anno = data.year(); + + if (_plafond == nullptr) + _plafond = new TLi_manager(tipo, codice, anno); + else + if (force_reload || _plafond->tipo() != tipo || _plafond->codice() != codice || + anno != _plafond->anno()) + _plafond->read(tipo, codice, anno); + return *_plafond; +} + TOccasionale& TDocumento::occas() const { const TString16 occ_code = cod_occas(); // Codice occasionale in testata diff --git a/src/ve/velib04a.cpp b/src/ve/velib04a.cpp index 2c4a925c5..f99d2ad01 100755 --- a/src/ve/velib04a.cpp +++ b/src/ve/velib04a.cpp @@ -436,16 +436,17 @@ bool TFatturazione_bolle::elabora(TLista_documenti& doc_in, TLista_documenti& do if (oname == RDOC_CODIVA) { const TString4 codesiva = campione.codesiva(); + FOR_EACH_PHYSICAL_RDOC(campione, i, rdoc) { // Elabora solo righe articolo, spese o prestazioni valide - if (!rdoc->is_descrizione()) + if (!rdoc->is_descrizione() && rdoc->get(RDOC_CODIVA).blank()) { if (codesiva.full()) { - if (rdoc->imponibile().is_zero()) +/* if (rdoc->imponibile().is_zero()) rdoc->zero(RDOC_CODIVA); - else + else */ rdoc->put(RDOC_CODIVA, codesiva); } else @@ -552,7 +553,7 @@ bool TFatturazione_bolle::elabora(TLista_documenti& doc_in, TLista_documenti& do // Aggiungilo alla lista dei documenti in uscita od = doc_out.add(new_doc); - new_doc->put("FATID", od + 1); + new_doc->put(DOC_FATID, od + 1); } if (change_clifo()) @@ -634,13 +635,13 @@ bool TFatturazione_bolle::elabora(TLista_documenti& doc_in, TLista_documenti& do docrefs.destroy(i); } else - d.put("FATID", 0); + d.put(DOC_FATID, 0); } for (int i = doc_out.items() - 1; i >= 0; i--) // Aggiorna esenzione { TDocumento& d = doc_out[i]; d.update_esenzione(); - } + } return doc_out.items() > 0; } diff --git a/src/ve/velib04f.cpp b/src/ve/velib04f.cpp index e06b96b51..64004edb7 100755 --- a/src/ve/velib04f.cpp +++ b/src/ve/velib04f.cpp @@ -6,7 +6,6 @@ #include "../ca/movana.h" #include "../ca/rmovana.h" #include "../ca/rrip.h" -#include "../cg/cg2101.h" #include "../cg/cglib.h" #include "../mg/anamag.h" diff --git a/src/ve/velib06a.cpp b/src/ve/velib06a.cpp index 10a4e5393..4aa3d2b1e 100755 --- a/src/ve/velib06a.cpp +++ b/src/ve/velib06a.cpp @@ -2036,23 +2036,6 @@ bool codartmag_handler( TMask_field& f, KEY key ) { TMask & m = f.mask(); - /* Modo vecchio con funzionamento dubbiamente legato a !mask.is_running - TSheet_field& s = *m.get_sheet(); - TDocumento_mask& mask= (TDocumento_mask&)s.mask(); - - bool to_check = key == K_TAB && f.focusdirty(); - if (!to_check) - to_check = !mask.is_running(); - - if (to_check) - { - const bool artmag = !f.empty() && TRiga_documento::tipo(m.get(FR_TIPORIGA)).is_merce(); - m.show(FR_UMQTA, artmag); - m.show(FR_UMQTA2, !artmag); - mask.update_giacenza(); - } -*/ - if (key == K_TAB) { // const bool artmag = !f.empty() && TRiga_documento::tipo(m.get(FR_TIPORIGA)).is_merce(); @@ -2068,7 +2051,6 @@ bool codartmag_handler( TMask_field& f, KEY key ) mask.update_giacenza(); } } - return true; } diff --git a/src/ve/vepriv.h b/src/ve/vepriv.h index 431262111..46820411f 100755 --- a/src/ve/vepriv.h +++ b/src/ve/vepriv.h @@ -34,7 +34,7 @@ bool pricerange_handler(TMask_field& f, KEY key ); bool link_handler( TMask_field& f, KEY key ); bool cdc_mag_handler(TMask_field& f, KEY key); bool cms_mag_handler(TMask_field& f, KEY key); -bool evasion_check_handler( TMask_field& f, KEY key ); +bool evasion_check_handler(TMask_field& f, KEY key ); bool distinta_link_handler(TMask_field& f, KEY key ); bool gen_livelli_handler(TMask_field& f, KEY key ); bool peso_conai_handler(TMask_field& f, KEY key );