419 lines
9.4 KiB
C++
Executable File
419 lines
9.4 KiB
C++
Executable File
// -------------------------------------------------------------
|
|
// calcolo liquidazioni
|
|
// part 3: utilities
|
|
// fv 2-2-94
|
|
// --------------------------------------------------------------
|
|
|
|
#include <config.h>
|
|
#include "cg4300.h"
|
|
|
|
bool CG4300_App::is_trim(int x)
|
|
// TRUE se il mese passato e' un trimestre
|
|
{ return x == 3 || x == 6 || x == 9 || x == 12; }
|
|
|
|
bool CG4300_App::is_month_ok(int x, int month)
|
|
// TRUE se il mese passato e' compatibile con il regime
|
|
// di liquidazione e (opz) non e' maggiore di quello scelto
|
|
{
|
|
if (month == -1) month = x;
|
|
return _nditte_r->get("FREQVIVA") == "M" ?
|
|
( x > 0 && x <= month) :
|
|
( x <= month && is_trim(x));
|
|
}
|
|
|
|
bool CG4300_App::is_first_month(int m)
|
|
{
|
|
return _nditte_r->get("FREQVIVA") == "M" ?
|
|
m == 1 : m == 3;
|
|
}
|
|
|
|
int CG4300_App::previous_month(int m)
|
|
{
|
|
if (m == 13) m = 12;
|
|
if (_nditte_r->get("FREQVIVA") == "M")
|
|
return m == 1 ? 1 : m - 1;
|
|
else return m == 3 ? 3 : m - 3;
|
|
}
|
|
|
|
bool CG4300_App::check_month(int m, int m2)
|
|
// se si sta ricalcolando una liquidazione
|
|
// annuale di check, ritorna TRUE per tutti i
|
|
// mesi, altrimenti solo per quello in corso
|
|
// di calcolo
|
|
{
|
|
return (_isannual || _isriepilogo) ? m < 13 : m == m2;
|
|
}
|
|
|
|
bool CG4300_App::is_date_ok(TDate& d, int month)
|
|
// TRUE se la data passata va considerata nel
|
|
// ricalcolo dei progressivi per il mese e anno
|
|
// selezionati
|
|
{
|
|
if (d.month() > month || d.year() != atoi(_year))
|
|
return FALSE;
|
|
return _nditte_r->get("FREQVIVA") == "M" ?
|
|
(d.month() == month):
|
|
((month - d.month()) >= 0 &&
|
|
(month - d.month()) < 3);
|
|
}
|
|
|
|
|
|
void CG4300_App::add_ventilation(real iva, real howmuch, const char* codiva)
|
|
{
|
|
_VentItem* vi = NULL;
|
|
for (int i = 0; i < _vent_arr.items(); i++)
|
|
{
|
|
vi = (_VentItem*)&_vent_arr[i];
|
|
if (vi->_codiva == codiva)
|
|
break;
|
|
}
|
|
if (i == _vent_arr.items())
|
|
{
|
|
_vent_arr.add(vi = new _VentItem);
|
|
vi->_aliquota = iva;
|
|
vi->_codiva = codiva;
|
|
}
|
|
vi->_totale += howmuch;
|
|
}
|
|
|
|
void CG4300_App::add_vendite(int month, const char* codreg, real& r)
|
|
{
|
|
_VendItem* vi = NULL;
|
|
|
|
for (int i = 0; i < _vend_arr.items(); i++)
|
|
{
|
|
vi = (_VendItem*)&_vend_arr[i];
|
|
if (vi->_codreg == codreg && vi->_month == month)
|
|
break;
|
|
}
|
|
if (i == _vend_arr.items())
|
|
{
|
|
_vend_arr.add(vi = new _VendItem);
|
|
vi->_codreg = codreg;
|
|
vi->_month = month;
|
|
}
|
|
vi->_totale += r;
|
|
}
|
|
|
|
|
|
bool CG4300_App::look_pim(int month, const char* codatt, const char* codreg,
|
|
const char* tipocr, const char* codiva,
|
|
bool create)
|
|
// ritorna il PIM corrispondente alla chiave passata; se
|
|
// create = TRUE lo crea se non lo trova. Ritorna se c'era
|
|
{
|
|
bool ok = FALSE;
|
|
_pim_r->zero();
|
|
(*_pim_anno) = _year;
|
|
(*_pim_mese) = format("%d", month);
|
|
(*_pim_codreg) = codreg;
|
|
(*_pim_codiva) = codiva;
|
|
(*_pim_codatt) = codatt;
|
|
(*_pim_tipocr) = tipocr;
|
|
|
|
TString s = _pim_r->get("CODTAB");
|
|
|
|
_pim->read();
|
|
ok = _pim->good();
|
|
|
|
if (!ok && create)
|
|
{
|
|
_pim_r->zero();
|
|
_pim_r->put("CODTAB",s);
|
|
_pim->write();
|
|
}
|
|
return ok;
|
|
}
|
|
|
|
bool CG4300_App::look_plm(int m, const char* a, bool create)
|
|
{
|
|
bool ok = FALSE;
|
|
|
|
_plm_r->zero();
|
|
(*_plm_codatt) = a;
|
|
(*_plm_mese) = format("%d",m);
|
|
(*_plm_anno) = _year;
|
|
|
|
TString s = _plm_r->get("CODTAB");
|
|
_plm->read();
|
|
ok = _plm->good();
|
|
|
|
if (!ok && create)
|
|
{
|
|
_plm_r->zero();
|
|
_plm_r->put("CODTAB",s);
|
|
_plm->write();
|
|
}
|
|
return ok;
|
|
}
|
|
|
|
bool CG4300_App::look_ptm(int m, const char* a, bool create)
|
|
{
|
|
bool ok = FALSE;
|
|
|
|
_ptm->zero();
|
|
(*_ptm_codatt) = a;
|
|
(*_ptm_mese) = format("%d",m);
|
|
(*_ptm_anno) = _year;
|
|
|
|
TString s = _ptm->get("CODTAB");
|
|
_ptm->read();
|
|
ok = _ptm->good();
|
|
|
|
if (!ok && create)
|
|
{
|
|
_ptm->zero();
|
|
_ptm->put("CODTAB",s);
|
|
_ptm->write();
|
|
}
|
|
return ok;
|
|
}
|
|
|
|
bool CG4300_App::look_lim(int m, bool create)
|
|
{
|
|
bool ok = FALSE;
|
|
|
|
_lim_r->zero();
|
|
(*_lim_mese) = format("%d",m);
|
|
(*_lim_anno) = _year;
|
|
|
|
TString s = _lim_r->get("CODTAB");
|
|
_lim->read();
|
|
ok = _lim->good();
|
|
|
|
if (!ok && create)
|
|
{
|
|
_lim_r->zero();
|
|
_lim_r->put("CODTAB",s);
|
|
_lim->write();
|
|
}
|
|
return ok;
|
|
}
|
|
|
|
bool CG4300_App::look_pla(const char* a, bool create)
|
|
{
|
|
bool ok = FALSE;
|
|
_pla_r->zero();
|
|
(*_pla_codatt) = a;
|
|
(*_pla_anno) = _year;
|
|
|
|
TString s = _pla_r->get("CODTAB");
|
|
_pla->read();
|
|
ok = _pla->good();
|
|
|
|
if (!ok && create)
|
|
{
|
|
real es_b1, es_b2, es_b3, prorata;
|
|
// alla creazione del PLA
|
|
// si prendono i valori di prorata e plafond dall'anno scorso
|
|
// e (TBI) si controllano incompatibilita' con la normativa
|
|
|
|
_pla_r->zero();
|
|
(*_pla_codatt) = a;
|
|
(*_pla_anno) = atoi(_year) - 1;
|
|
if (_pla->read() == NOERR)
|
|
{
|
|
es_b1 = _pla->get_real("R1");
|
|
es_b2 = _pla->get_real("R2");
|
|
es_b3 = _pla->get_real("R3");
|
|
es_b1 = _pla->get_real("R9");
|
|
}
|
|
_pla->zero();
|
|
_pla_r->put("CODTAB",s);
|
|
_pla->put("R5",es_b1);
|
|
_pla->put("R6",es_b2);
|
|
_pla->put("R7",es_b3);
|
|
_pla->put("R8",prorata);
|
|
_pla->write();
|
|
}
|
|
return ok;
|
|
}
|
|
|
|
bool CG4300_App::look_reg(const char* reg)
|
|
{
|
|
_reg_r->zero();
|
|
_reg_r->put("CODTAB",format("%4s%-3s",(const char*)_year, reg));
|
|
_reg->read();
|
|
return _reg->good();
|
|
}
|
|
|
|
bool CG4300_App::look_iva(const char* cod)
|
|
{
|
|
_iva->zero();
|
|
_iva->put("CODTAB",cod);
|
|
_iva->read();
|
|
return _iva->good();
|
|
}
|
|
|
|
bool CG4300_App::look_ppa(int month, const char* codatt, int type, bool create)
|
|
{
|
|
_ppa->zero();
|
|
(*_ppa_year) = _year;
|
|
(*_ppa_month) = month;
|
|
(*_ppa_codatt) = codatt;
|
|
(*_ppa_kind) = type;
|
|
TString ctab = _ppa_r->get("CODTAB");
|
|
_ppa->read();
|
|
|
|
bool ok = _ppa->good();
|
|
|
|
if (!ok && create)
|
|
{
|
|
_ppa_r->zero();
|
|
_ppa_r->put("CODTAB",ctab);
|
|
_ppa->write();
|
|
}
|
|
return ok;
|
|
}
|
|
|
|
bool CG4300_App::look_del(int month, int type, bool create)
|
|
{
|
|
TString ditta = _nditte->curr().get("CODDITTA");
|
|
_del->zero();
|
|
(*_del_ditta) = ditta;
|
|
(*_del_anno) = _year;
|
|
(*_del_mese) = month;
|
|
(*_del_tipo) = type;
|
|
TString ctab = _del->get("CODTAB");
|
|
_del->read();
|
|
|
|
bool ok = _del->good();
|
|
|
|
if (!ok && create)
|
|
{
|
|
_del->zero();
|
|
_del->put("CODTAB",ctab);
|
|
_del->write();
|
|
}
|
|
return ok;
|
|
}
|
|
|
|
bool CG4300_App::look_lia(bool create, int year)
|
|
{
|
|
if (year == 0) year = atoi(_year);
|
|
TString y(4); y << year;
|
|
|
|
_lia->zero();
|
|
_lia->put("CODTAB", y);
|
|
_lia->read();
|
|
bool ok = _lia->good();
|
|
if (!ok && create)
|
|
{
|
|
_lia->zero();
|
|
_lia->put("CODTAB", y);
|
|
_lia->put("S7", _nditte->curr().get("FREQVIVA"));
|
|
_lia->write();
|
|
}
|
|
return ok;
|
|
}
|
|
|
|
|
|
real CG4300_App::credito_prec(int month)
|
|
// ritorna l'appropriato credito precedente al mese in corso
|
|
// lascia PLM posizionata sul mese passato
|
|
{
|
|
real c(0.0);
|
|
|
|
// se c'e' un credito nei parametri ditta, si usa quello e vaffanculo
|
|
TConfig cnf(CONFIG_DITTA);
|
|
|
|
c = (const char*)cnf.get("CrIvAp");
|
|
if (!c.is_zero()) return c;
|
|
|
|
if (is_first_month(month))
|
|
{
|
|
int yr = atoi(_year) - 1;
|
|
_lim->zero();
|
|
*_lim_anno = yr;
|
|
*_lim_mese = 12;
|
|
if (_lim->read() == NOERR)
|
|
// considera anche il rimborso
|
|
c = _lim->get_real("R0") - _lim->get_real("R1");
|
|
// e le eventuali rettifiche a debito
|
|
real rett = _lim->get_real("R5");
|
|
if (rett.sign() > 0)
|
|
c -= rett;
|
|
// e l'acconto versato a dicembre
|
|
_del->zero();
|
|
TString ditta = _nditte->curr().get("CODDITTA");
|
|
*_del_ditta = ditta;
|
|
*_del_anno = yr;
|
|
*_del_mese = 12;
|
|
*_del_tipo = 7;
|
|
if (_del->read() == NOERR)
|
|
c -= _del->get_real("R0");
|
|
}
|
|
else
|
|
{
|
|
bool ok = look_lim(previous_month(month));
|
|
if (!ok || !_lim->get_bool("B0"))
|
|
{
|
|
update_firm(previous_month(month), FALSE);
|
|
look_lim(previous_month(month));
|
|
}
|
|
c = _lim->get_real("R0") - _lim->get_real("R1");
|
|
real rett = _lim->get_real("R5");
|
|
if (rett.sign() > 0)
|
|
c -= rett;
|
|
}
|
|
look_lim(month);
|
|
|
|
if (c.sign() < 0) c = abs(c); else c = real(0.0);
|
|
return c;
|
|
}
|
|
|
|
real CG4300_App::credito_costo_prec(int month, const char* codatt)
|
|
// ritorna l'appropriato credito di costo precedente al mese in corso
|
|
// (travel agency only)
|
|
{
|
|
real c = 0.0;
|
|
if (is_first_month(month))
|
|
{
|
|
int yr = atoi(_year) - 1;
|
|
_lim->zero();
|
|
*_lim_anno = yr;
|
|
*_lim_mese = 12;
|
|
if (_lim->read() == NOERR) c = _lim->get_real("R2");
|
|
}
|
|
else
|
|
{
|
|
bool ok = look_lim(previous_month(month));
|
|
if (!ok || !_lim->get_bool("B0"))
|
|
{
|
|
// Super Prassi a questo punto vorrebbe una update_firm
|
|
update_att(previous_month(month), codatt, FALSE);
|
|
look_lim(previous_month(month));
|
|
}
|
|
// qui il rimborso non c'e'
|
|
c = _lim->get_real("R2");
|
|
}
|
|
look_lim(month);
|
|
return c;
|
|
}
|
|
|
|
|
|
real CG4300_App::aliquota_agvia()
|
|
{
|
|
TConfig cnf(CONFIG_STUDIO);
|
|
look_iva(cnf.get("CodAgv"));
|
|
real r = _iva->get_real("R0");
|
|
return r;
|
|
}
|
|
|
|
|
|
real CG4300_App::interesse_trimestrale(int month)
|
|
{
|
|
month /= 3; month--;
|
|
TConfig cnf(CONFIG_STUDIO);
|
|
real r = cnf.get("InTr", NULL, month);
|
|
return r;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|