Patch level : 12.0 982

Files correlati     : ve0.exe ve1.exe ve5.exe ve6.exe ve0200b.msk
Commento            :

Ristrutturato modulo li
This commit is contained in:
Alessandro Bonazzi 2020-07-26 20:18:55 +02:00
parent 59005050c9
commit 8bdb4472ef
19 changed files with 247 additions and 467 deletions

View File

@ -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

View File

@ -21,7 +21,7 @@
#include <occas.h>
#endif
class TDocumento;
class TDocumento;
class TOccasionale : public TRectype
{

View File

@ -7,7 +7,6 @@
#include <toolfld.h>
#include <utility.h>
#include <urldefid.h>
#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<TRiepilogo_iva *>(tab_iva.get()); totali != nullptr; totali = dynamic_cast<TRiepilogo_iva *>(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<TRiepilogo_iva *>(tab_iva.get()); totali != nullptr; totali = dynamic_cast<TRiepilogo_iva *>(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<real>(static_cast<TToken_string>(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<real>(static_cast<TToken_string>(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<real>(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;

View File

@ -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(); }

View File

@ -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

View File

@ -7,7 +7,7 @@
#include <recset.h>
#include <tabmod.h>
#include "../cg/cglib01.h"
#include "../cg/cglib.h"
///////////////////////////////////////////////////////////
// Applicazione per gestione maschere di modulo

View File

@ -7,7 +7,7 @@
#include <reprint.h>
#include <tabutil.h>
#include "../cg/cg2103.h"
#include "../cg/cglib.h"
#include "velib.h"
#include "ve1.h"

View File

@ -9,7 +9,7 @@
#include <textset.h>
#include <utility.h>
#include "../cg/cglib01.h"
#include "../cg/cglib.h"
#include "velib07.h"
///////////////////////////////////////////////////////////

View File

@ -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)
{

View File

@ -1,6 +1,7 @@
//#include <recset.h>
#include <reputils.h>
#include <dongle.h>
#include <utility.h>
#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();

View File

@ -6,7 +6,7 @@
#include <reprint.h>
#include <utility.h>
#include "../cg/cglib01.h"
#include "../cg/cglib.h"
#include "../mg/mglib.h"
#include "ve6.h"

View File

@ -3,7 +3,7 @@
#include <applicat.h>
#include <execp.h>
#include "../cg/cg2103.h"
#include "../cg/cglib.h"
#include "../mg/anamag.h"
#include <mov.h>

View File

@ -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() {}
};

View File

@ -58,7 +58,9 @@ class TSelect_color_mask;
#include <rdoc.h>
#endif
#include <map>
#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); }

View File

@ -5,8 +5,7 @@
#include <tabutil.h>
#include <utility.h>
#include "velib.h"
#include "../cg/cglib.h"
#include "../db/dblib.h"
#include "../pr/prlib.h"
#include "../li/letint.h"
@ -18,11 +17,11 @@
#include <causali.h>
#include "veini.h"
#include "velib.h"
#include "sconti.h"
#include "vepriv.h"
#include "veuml.h"
#include <set>
///////////////////////////////////////////////////////////
// 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

View File

@ -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;
}

View File

@ -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"

View File

@ -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;
}

View File

@ -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 );