campo-sirio/cg/cg2103.cpp
guy cd25e0c500 cg2100.cpp Aggiunto test sulla congruenza del prorata
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
1996-12-18 16:17:47 +00:00

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