cg2100.h Aggiunto F_ADJUST_PRORATA cg2100c.uml Aggiunto bottone di correzione prorata cg2102.h Aggiunti metodi per test prorata cg2103.cpp Aggiunta possibilita' di cambiare il prorata di un registro cg2106.cpp Aggiunti metodi per gestire correzione prorata git-svn-id: svn://10.65.10.50/trunk@4019 c028cbd2-c16b-5b4b-a496-9718f37d4682
550 lines
12 KiB
C++
Executable File
550 lines
12 KiB
C++
Executable File
#include <stdlib.h>
|
|
|
|
#include <prefix.h>
|
|
#include <tabutil.h>
|
|
|
|
#include "cg2103.h"
|
|
|
|
#include <causali.h>
|
|
#include <rcausali.h>
|
|
|
|
const char* iva2name(TipoIVA iva)
|
|
{
|
|
const char* i;
|
|
switch(iva)
|
|
{
|
|
case nessuna_iva:
|
|
i = "Nessuna IVA"; break;
|
|
case iva_acquisti:
|
|
i = "IVA Acquisti"; break;
|
|
case iva_vendite:
|
|
i = "IVA Vendite"; break;
|
|
case iva_generica:
|
|
i = "IVA Generica"; break;
|
|
default:
|
|
i = "IVA ERRATA!"; break;
|
|
}
|
|
return i;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////
|
|
// Registro
|
|
///////////////////////////////////////////////////////////
|
|
|
|
TRegistro::TRegistro(const char* cod, int year) : _rec(LF_TAB), _att(LF_ATTIV)
|
|
{
|
|
read(cod, year);
|
|
}
|
|
|
|
|
|
bool TRegistro::read(const char* cod, int year)
|
|
{
|
|
if (year <= 0)
|
|
{
|
|
const TDate oggi(TODAY);
|
|
year = oggi.year();
|
|
}
|
|
|
|
int err = ~NOERR;
|
|
|
|
TTable reg("REG");
|
|
reg.setkey(1);
|
|
if (cod && *cod > ' ')
|
|
{
|
|
TString16 chiave; chiave.format("%04d%s", year, cod);
|
|
reg.put("CODTAB", chiave);
|
|
err = reg.read();
|
|
}
|
|
_rec = reg.curr();
|
|
|
|
if (err != NOERR)
|
|
_rec.zero();
|
|
read_att();
|
|
|
|
return err == NOERR;
|
|
}
|
|
|
|
bool TRegistro::reread()
|
|
{
|
|
if (ok())
|
|
{
|
|
const TString16 n(name());
|
|
const int y = year();
|
|
return read(n, y);
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
int TRegistro::year() const
|
|
{
|
|
TString16 anno(_rec.get("CODTAB"));
|
|
anno.cut(4);
|
|
return atoi(anno);
|
|
}
|
|
|
|
|
|
const TString& TRegistro::name() const
|
|
{
|
|
return _rec.get("CODTAB").mid(4);
|
|
}
|
|
|
|
|
|
TRegistro& TRegistro::operator =(const TRegistro& r)
|
|
{
|
|
_rec = r._rec;
|
|
_att = r._att;
|
|
_prorata = r._prorata;
|
|
return *this;
|
|
}
|
|
|
|
|
|
int TRegistro::tipo() const
|
|
{
|
|
const int t = _rec.get_int("I0");
|
|
return t;
|
|
}
|
|
|
|
|
|
bool TRegistro::corrispettivi() const
|
|
{
|
|
const bool c = _rec.get_bool("B0");
|
|
return c;
|
|
}
|
|
|
|
|
|
TipoIVA TRegistro::iva() const
|
|
{
|
|
TipoIVA i = (TipoIVA)tipo();
|
|
switch (i)
|
|
{
|
|
case nessuna_iva:
|
|
case iva_vendite:
|
|
case iva_acquisti:
|
|
break;
|
|
case libro_giornale:
|
|
i = nessuna_iva;
|
|
break;
|
|
default:
|
|
error_box("Il registro '%s' non e' un registro IVA o contabile: tipo %d",
|
|
(const char*)name(), i);
|
|
i = nessuna_iva;
|
|
break;
|
|
}
|
|
return i;
|
|
}
|
|
|
|
bool TRegistro::read_att()
|
|
{
|
|
if (!_att.empty())
|
|
return TRUE;
|
|
|
|
TLocalisamfile attiv(LF_ATTIV);
|
|
attiv.setkey(1);
|
|
attiv.put("CODDITTA", prefix().get_codditta());
|
|
attiv.put("CODATT", attivita());
|
|
const int err = attiv.read();
|
|
_att = attiv.curr();
|
|
if (err != NOERR)
|
|
_att.zero();
|
|
|
|
TString16 chiave; // Ditta - Anno - Attivita' - Tipo Attivita' (fissata a 1)
|
|
chiave.format("%05ld", prefix().get_codditta());
|
|
chiave << year(); // non fare << year() << attivita()
|
|
chiave << attivita() << "1";
|
|
|
|
TTable pla("%PLA");
|
|
attiv.setkey(1);
|
|
pla.put("CODTAB", chiave);
|
|
if (pla.read() == NOERR)
|
|
{
|
|
_prorata = pla.get_real("R8");
|
|
_att.put("TIPOATT", pla.get("S7")); // Aggiorna tipo attivita'
|
|
}
|
|
else
|
|
_prorata = 0.0;
|
|
|
|
return err == NOERR;
|
|
}
|
|
|
|
bool TRegistro::agenzia_viaggi()
|
|
{
|
|
bool av = FALSE;
|
|
if (iva() == iva_vendite)
|
|
av = _att.get_bool("REG74TER");
|
|
return av;
|
|
}
|
|
|
|
const TString& TRegistro::tipo_attivita()
|
|
{
|
|
return _att.get("TIPOATT");
|
|
}
|
|
|
|
const real& TRegistro::prorata()
|
|
{
|
|
return _prorata;
|
|
}
|
|
|
|
void TRegistro::set_prorata(const real& pro)
|
|
{
|
|
_prorata = pro;
|
|
}
|
|
|
|
// Certified 99%
|
|
bool TRegistro::update(long protiva, const TDate& datareg)
|
|
{
|
|
bool updated = TRUE;
|
|
|
|
if (protiva > _rec.get_long("I5"))
|
|
{
|
|
_rec.put("I5", protiva);
|
|
updated = FALSE;
|
|
}
|
|
if (datareg > _rec.get_date("D2"))
|
|
{
|
|
_rec.put("D2", datareg);
|
|
updated = FALSE;
|
|
}
|
|
if (!updated)
|
|
{
|
|
TTable reg("REG");
|
|
updated = reg.rewrite(_rec) == NOERR;
|
|
}
|
|
|
|
return updated;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////
|
|
// Libro giornale
|
|
///////////////////////////////////////////////////////////
|
|
|
|
// Legge il libro giornale dell'anno specificato
|
|
bool TLibro_giornale::read(int y)
|
|
{
|
|
bool found = FALSE;
|
|
|
|
if (y <= 0)
|
|
{
|
|
const TDate oggi(TODAY);
|
|
y = oggi.year();
|
|
}
|
|
|
|
TString16 anno; anno.format("%04d", y);
|
|
TTable reg("REG");
|
|
reg.setkey(1);
|
|
reg.put("CODTAB", anno); // Cerca il primo registro dell'anno
|
|
|
|
for (int err = reg.read(_isgteq); err == NOERR; err = reg.next())
|
|
{
|
|
if (reg.get("CODTAB").compare(anno, 4) != 0)
|
|
break; // Sono arrivato all'anno dopo
|
|
|
|
if (reg.get_int("I0") == libro_giornale)
|
|
{
|
|
found = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!found) reg.zero(); // Memorizza record (anche vuoto)
|
|
_rec = reg.curr();
|
|
|
|
return found;
|
|
}
|
|
|
|
TLibro_giornale::TLibro_giornale(int y)
|
|
{
|
|
read(y);
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////
|
|
// Codice IVA
|
|
///////////////////////////////////////////////////////////
|
|
|
|
TCodiceIVA::TCodiceIVA(const char* cod) : TRectype(LF_TABCOM)
|
|
{
|
|
read(cod);
|
|
}
|
|
|
|
bool TCodiceIVA::read(const char* cod)
|
|
{
|
|
int err = ~NOERR;
|
|
if (cod && *cod)
|
|
{
|
|
TTable iva("%IVA");
|
|
iva.put("CODTAB", cod);
|
|
err = iva.read();
|
|
TRectype::operator=(iva.curr());
|
|
}
|
|
if (err != NOERR)
|
|
zero();
|
|
return err == NOERR;
|
|
}
|
|
|
|
real TCodiceIVA::scorpora(real& imponibile) const
|
|
{
|
|
const real percent = percentuale();
|
|
real imposta = abs(imponibile) * percent / (percent + 100.0); imposta.ceil();
|
|
if (imponibile.sign() < 0) imposta = -imposta;
|
|
imponibile -= imposta;
|
|
return imposta;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////
|
|
// Causale
|
|
///////////////////////////////////////////////////////////
|
|
|
|
TCausale::TCausale(const char* cod, int year)
|
|
: TArray(12), _rec(LF_CAUSALI),
|
|
_iva(iva_errata), _corrisp(FALSE),
|
|
_sezione_clifo(' '), _sezione_ritsoc(' ')
|
|
{
|
|
if (*cod) read(cod, year);
|
|
}
|
|
|
|
|
|
// Legge le righe della causale attualmente selezionata sulla maschera
|
|
bool TCausale::read(const char* cod, int year)
|
|
{
|
|
_rec.zero(); // Delete header
|
|
destroy(); // Delete all rows
|
|
_iva = iva_errata; // Delete misc info
|
|
_sezione_clifo = _sezione_ritsoc = ' ';
|
|
_corrisp = FALSE;
|
|
|
|
if (*cod > ' ')
|
|
{
|
|
TLocalisamfile caus(LF_CAUSALI);
|
|
caus.put(CAU_CODCAUS, cod);
|
|
|
|
int err = caus.read();
|
|
if (err != NOERR)
|
|
return FALSE;
|
|
_rec = caus.curr();
|
|
|
|
TLocalisamfile rcaus(LF_RCAUSALI);
|
|
rcaus.put(CAU_CODCAUS, cod);
|
|
rcaus.put(CAU_NRIGA, 0);
|
|
|
|
for (err = rcaus.read(_isgteq); // Find first line
|
|
err == NOERR && rcaus.get(CAU_CODCAUS) == cod;
|
|
err = rcaus.next() // Read next line
|
|
)
|
|
{
|
|
const int riga = rcaus.get_int(CAU_NRIGA);
|
|
add(rcaus.curr(), riga);
|
|
}
|
|
|
|
/*
|
|
rcaus.zero();
|
|
for (int riga = 1; riga < size(); riga++) // Fill gaps
|
|
if (row(riga) == NULL) add(rcaus.curr(), riga);
|
|
*/
|
|
|
|
const TString codreg(caus.get(CAU_REG));
|
|
const bool ok = _reg.read(codreg, year); // Read register
|
|
if (!ok && codreg.not_empty())
|
|
return error_box("Non esiste il registro '%s' del %d",
|
|
(const char*)codreg, year);
|
|
calcIVA();
|
|
}
|
|
else
|
|
{
|
|
_iva = nessuna_iva; // Clear IVA data
|
|
_corrisp = FALSE;
|
|
_reg.read("", year);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
TBill& TCausale::bill(int num, TBill& conto) const
|
|
{
|
|
const TRectype* rec = row(num);
|
|
if (rec != NULL)
|
|
conto.set(rec->get_int(RCA_GRUPPO), rec->get_int(RCA_CONTO),
|
|
rec->get_long(RCA_SOTTOCONTO), rec->get_char(RCA_TIPOCF));
|
|
return conto;
|
|
}
|
|
|
|
const char* TCausale::desc_agg(int num) const
|
|
{
|
|
const char* deag = "";
|
|
|
|
const TRectype* rec = row(num);
|
|
if (rec != NULL)
|
|
{
|
|
const TString& cod = rec->get(RCA_CODDESC);
|
|
if (cod.not_empty())
|
|
{
|
|
TTable da("%DPN");
|
|
da.put("CODTAB", cod);
|
|
if (da.read() == NOERR)
|
|
deag = da.get("S0");
|
|
}
|
|
}
|
|
|
|
return deag;
|
|
}
|
|
|
|
const char* TCausale::descrizione() const
|
|
{ return _rec.get(CAU_DESCR); }
|
|
|
|
const char* TCausale::codice() const
|
|
{ return _rec.get(CAU_CODCAUS); }
|
|
|
|
|
|
bool TCausale::data_doc() const
|
|
{ return _rec.get_bool(CAU_DATADOC); }
|
|
|
|
bool TCausale::num_doc() const
|
|
{ return _rec.get_bool(CAU_NUMDOC); }
|
|
|
|
bool TCausale::apertura() const
|
|
{ return _rec.get_char(CAU_MOVAP) == 'A'; }
|
|
|
|
bool TCausale::chiusura() const
|
|
{ return _rec.get_char(CAU_MOVAP) == 'C'; }
|
|
|
|
bool TCausale::sezionale() const
|
|
{ return _rec.get_bool(CAU_MOVSEZ); }
|
|
|
|
bool TCausale::valuta() const
|
|
{ return _rec.get_bool(CAU_MOVVAL); }
|
|
|
|
bool TCausale::intra() const
|
|
{ return _rec.get_bool(CAU_INTRACOM); }
|
|
|
|
bool TCausale::valintra() const
|
|
{ return _rec.get_bool(CAU_VALINTRA); }
|
|
|
|
const TString& TCausale::causale_inc_imm() const
|
|
{ return _rec.get(CAU_CODCAUSIM); }
|
|
|
|
const TString& TCausale::tipo_doc() const
|
|
{ return _rec.get(CAU_TIPODOC); }
|
|
|
|
int TCausale::tipomov() const
|
|
{ return _rec.get_int(CAU_TIPOMOV); }
|
|
|
|
bool TCausale::saldaconto() const
|
|
{ return tipomov() > 0; }
|
|
|
|
int TCausale::link_m770() const
|
|
{ return _rec.get_int(CAU_M770); }
|
|
|
|
bool TCausale::ok() const
|
|
{
|
|
if (iva() == iva_errata)
|
|
return FALSE;
|
|
|
|
if (corrispettivi() != reg().corrispettivi())
|
|
return error_box("Tipo documento e registro incongruenti per i corrispettivi");
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
char TCausale::sezione(int riga) const
|
|
{
|
|
const TRectype* rec = row(riga);
|
|
char sez = rec ? toupper(rec->get_char(RCA_SEZIONE)) : ' ';
|
|
if (sez <= ' ') // Guess section on tipocf
|
|
{
|
|
const TRectype* uno = row(1);
|
|
char tipocf = uno ? toupper(uno->get_char(RCA_TIPOCF)) : ' ';
|
|
if (tipocf <= ' ')
|
|
tipocf = (iva() == iva_vendite) ? 'C' : 'F'; // Guess tipocf on IVA
|
|
sez = (tipocf == 'C') ? 'D' : 'A';
|
|
}
|
|
return sez;
|
|
}
|
|
|
|
char TCausale::sezione_clifo()
|
|
{
|
|
if (_sezione_clifo == ' ')
|
|
_sezione_clifo = sezione(1);
|
|
return _sezione_clifo;
|
|
}
|
|
|
|
char TCausale::sezione_ritsoc()
|
|
{
|
|
if (_sezione_ritsoc == ' ')
|
|
_sezione_ritsoc = sezione(9);
|
|
return _sezione_ritsoc;
|
|
}
|
|
|
|
void TCausale::calcIVA()
|
|
{
|
|
TipoIVA i = nessuna_iva; // Tipo IVA di default
|
|
bool c = FALSE; // Corrispettivi di default
|
|
|
|
const TString& td = tipo_doc();
|
|
if (td.not_empty())
|
|
{
|
|
TTable tpd("%TPD");
|
|
tpd.put("CODTAB", td);
|
|
if (tpd.read() == NOERR)
|
|
{
|
|
i = (TipoIVA)tpd.get_int("I0"); // IVA acquisti, vendite, generica
|
|
const TipoIVA ri = _reg.iva();
|
|
if (i == iva_generica)
|
|
i = ri;
|
|
if (i != ri)
|
|
{
|
|
error_box("Tipo documento '%s' incompatibile con tipo registro", (const char*)td);
|
|
i = iva_errata;
|
|
}
|
|
c = tpd.get_bool("B0");
|
|
}
|
|
else error_box("Tipo documento sconosciuto: '%s'", (const char*)td);
|
|
}
|
|
_iva = i;
|
|
_corrisp = c;
|
|
}
|
|
|
|
bool TCausale::similar(const TCausale& c) const
|
|
{
|
|
const char* err = "";
|
|
if (sezionale() != c.sezionale()) err = "il segnale di sezionale";
|
|
if (intra() != c.intra()) err = "la gestione dei movimenti intra";
|
|
if (valuta() != c.valuta()) err = "la gestione valuta";
|
|
if (valintra() != c.valintra()) err = "la gestione valuta intracomunitaria";
|
|
if (corrispettivi() != c.corrispettivi()) err = "la gestione dei corrispettivi";
|
|
if (iva() != c.iva()) err = "il tipo di IVA";
|
|
if (tipomov() != c.tipomov()) err = "il tipo di movimento";
|
|
|
|
if (*err)
|
|
error_box("La causale e' diversa per %s", err);
|
|
|
|
return *err ? FALSE : TRUE;
|
|
}
|
|
|
|
bool TCausale::IVA2bill(const TCodiceIVA& iva, TBill& c) const
|
|
{
|
|
const TString& tipo = iva.tipo();
|
|
|
|
if (tipo.not_empty())
|
|
{
|
|
if (tipo == "ES") bill(5, c); else
|
|
if (tipo == "NI") bill(6, c); else
|
|
if (tipo == "NS") bill(7, c);
|
|
}
|
|
|
|
if (!c.ok())
|
|
bill(2, c);
|
|
|
|
const int spric = c.tipo_cr();
|
|
if (spric == 2 || spric == 3)
|
|
{
|
|
const TString& td = tipo_doc();
|
|
if (td == "FV" || td == "NC")
|
|
c.tipo_cr(4);
|
|
}
|
|
|
|
return c.ok();
|
|
}
|
|
|
|
|
|
|