57565a44ac
git-svn-id: svn://10.65.10.50/branches/R_10_00@23132 c028cbd2-c16b-5b4b-a496-9718f37d4682
406 lines
9.4 KiB
C++
406 lines
9.4 KiB
C++
// Programma per la gestione e la stampa della dichiarazione periodica IVA
|
|
#include <applicat.h>
|
|
#include <automask.h>
|
|
#include <execp.h>
|
|
#include <progind.h>
|
|
#include <recarray.h>
|
|
#include <relation.h>
|
|
#include <reprint.h>
|
|
|
|
#include "cg5900a.h"
|
|
#include "cglib03.h"
|
|
|
|
#include <attiv.h>
|
|
#include <causali.h>
|
|
#include <mov.h>
|
|
#include <rmov.h>
|
|
#include <rmoviva.h>
|
|
|
|
///////////////////////////////////////////////////////////
|
|
// TProrata_set
|
|
///////////////////////////////////////////////////////////
|
|
|
|
static int _year = 0;
|
|
static long _attiv = 0;
|
|
static TAssoc_array _causali;
|
|
|
|
static bool prorata_filter(const TRelation* rel)
|
|
{
|
|
const TRectype& mov = rel->curr(LF_MOV);
|
|
|
|
if (mov.get_char(MOV_TIPO) != 'F') // Solo movimenti fornitori
|
|
return false;
|
|
|
|
if (mov.get_char(MOV_PROVVIS) > ' ') // Solo movimenti definitivi
|
|
return false;
|
|
|
|
if (_year > 0)
|
|
{
|
|
const int anno = mov.get_int(MOV_ANNOIVA);
|
|
if (anno != _year)
|
|
return false;
|
|
}
|
|
|
|
const TBill zio(rel->curr());
|
|
const int cric = zio.tipo_cr();
|
|
if (cric >= 2 && cric <= 4) // Beni strumentali
|
|
return false;
|
|
|
|
const TString& codcaus = mov.get(MOV_CODCAUS);
|
|
TCausale* caus = (TCausale*)_causali.objptr(codcaus);
|
|
if (caus == NULL)
|
|
{
|
|
caus = new TCausale(codcaus, _year);
|
|
_causali.add(codcaus, caus);
|
|
}
|
|
if (caus->iva() != iva_acquisti)
|
|
return false;
|
|
|
|
if (caus->intra())
|
|
return false;
|
|
|
|
if (caus->tipodoc() == "AF")
|
|
return false;
|
|
|
|
if (_year > 0 && _attiv > 0)
|
|
{
|
|
const TRegistro& reg = caus->reg();
|
|
const long attiv = atol(reg.attivita());
|
|
if (attiv != _attiv)
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
class TProrata_set : public TISAM_recordset
|
|
{
|
|
protected:
|
|
virtual void set_custom_filter(TCursor& c) const;
|
|
virtual const TVariant& get_field(int logic, const char* fldname) const;
|
|
real perc_det() const;
|
|
|
|
public:
|
|
TProrata_set(const char* sql) : TISAM_recordset(sql) { }
|
|
};
|
|
|
|
void TProrata_set::set_custom_filter(TCursor& c) const
|
|
{
|
|
c.set_filterfunction(prorata_filter);
|
|
}
|
|
|
|
real TProrata_set::perc_det() const
|
|
{
|
|
real i = CENTO;
|
|
const TRectype& rmi = cursor()->curr();
|
|
if (rmi.get(RMI_TIPODET).full())
|
|
{
|
|
const TRectype& mov = cursor()->curr(LF_MOV);
|
|
real percind; get_tipodet_from_rmi(rmi, mov, percind);
|
|
i = CENTO-percind;
|
|
}
|
|
return i;
|
|
}
|
|
|
|
const TVariant& TProrata_set::get_field(int logic, const char* fldname) const
|
|
{
|
|
const TVariant& var = TISAM_recordset::get_field(logic, fldname);
|
|
if (logic == 0 || logic == LF_RMOVIVA)
|
|
{
|
|
if (xvt_str_same(fldname, RMI_IMPOSTA))
|
|
{
|
|
const real pd = perc_det();
|
|
if (pd < CENTO)
|
|
{
|
|
real i = var.as_real() * pd / CENTO;
|
|
return get_tmp_var() = i.round(2);
|
|
}
|
|
} else
|
|
if (xvt_str_same(fldname, "PERCDET"))
|
|
{
|
|
return get_tmp_var() = perc_det();
|
|
}
|
|
}
|
|
return var;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////
|
|
// TProrata_rep
|
|
///////////////////////////////////////////////////////////
|
|
|
|
class TProrata_rep : public TReport
|
|
{
|
|
protected:
|
|
virtual bool use_mask() { return false; }
|
|
virtual bool set_recordset(const TString& sql);
|
|
|
|
public:
|
|
TProrata_rep();
|
|
};
|
|
|
|
bool TProrata_rep::set_recordset(const TString& sql)
|
|
{
|
|
TString query = sql;
|
|
|
|
if (_year > 0 && query.find("FROM ") < 0)
|
|
{
|
|
const TDate dal( 1, 1, _year);
|
|
const TDate al(31, 12, _year);
|
|
TISAM_recordset mov("USE MOV KEY 2\nFROM DATAREG=#DAL\nTO DATAREG=#AL");
|
|
mov.set_var("#DAL", dal);
|
|
mov.set_var("#AL", al);
|
|
|
|
long danumreg = 0;
|
|
long anumreg = 0;
|
|
const TRectype& curr = mov.cursor()->curr();
|
|
for (bool good = mov.move_first(); good; good = mov.move_next())
|
|
{
|
|
const long numreg = curr.get_long(MOV_NUMREG);
|
|
if (danumreg == 0 || numreg < danumreg)
|
|
danumreg = numreg;
|
|
if (numreg > anumreg)
|
|
anumreg = numreg;
|
|
}
|
|
query << "\nFROM NUMREG=" << danumreg << "\nTO NUMREG=" << anumreg;
|
|
}
|
|
|
|
TProrata_set* prs = new TProrata_set(query);
|
|
return TReport::set_recordset(prs);
|
|
}
|
|
|
|
TProrata_rep::TProrata_rep()
|
|
{
|
|
const char* name = "cg5900a.rep";
|
|
if (!load(name))
|
|
cantread_box(name);
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////
|
|
// TProrata_msk
|
|
///////////////////////////////////////////////////////////
|
|
|
|
class TProrata_msk : public TAutomask
|
|
{
|
|
protected:
|
|
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
|
|
real get_perc_prorata();
|
|
bool genera_mov(TFilename& ininame);
|
|
|
|
public:
|
|
TProrata_msk() : TAutomask("cg5900a") {}
|
|
};
|
|
|
|
real TProrata_msk::get_perc_prorata()
|
|
{
|
|
const long f = get_long(F_CODDITTA);
|
|
const int y = get_date(F_DATAFIN).year();
|
|
const long a = get_long(F_CODATT);
|
|
TString16 codtab;
|
|
codtab.format("%05ld%4d%05ld1", f, y, a);
|
|
const real pr = cache().get("%PLA", codtab, "R8");
|
|
set(F_PRORATA, pr);
|
|
_year = y;
|
|
|
|
TToken_string key; key.format("%05ld", prefix().get_codditta());
|
|
TRecord_array att(key, LF_ATTIV);
|
|
if (att.rows() > 1)
|
|
_attiv = a;
|
|
else
|
|
_attiv = 0;
|
|
return pr;
|
|
}
|
|
|
|
bool TProrata_msk::genera_mov(TFilename& ininame)
|
|
{
|
|
ininame.temp("cg5900", "ini");
|
|
TConfig trans(ininame, "Transaction");
|
|
trans.set("Action", "INSERT");
|
|
|
|
const TString& codcaus = get(F_CAUSALE);
|
|
const TCausale caus(codcaus, _year);
|
|
|
|
trans.set_paragraph("23");
|
|
trans.set(MOV_CODCAUS, codcaus);
|
|
trans.set(MOV_DATAREG, TDate(TODAY));
|
|
TString descr; descr << "PRO-RATA " << _year;
|
|
trans.set(MOV_DESCR, descr);
|
|
|
|
TProrata_rep rep;
|
|
rep.mask2report(*this);
|
|
TRecordset& recset = *rep.recordset();
|
|
TProgress_monitor pi(recset.items(), TR("Calcolo pro-rata"), false);
|
|
|
|
TAssoc_array mconti;
|
|
TString80 key;
|
|
|
|
const real prorata = get_perc_prorata();
|
|
|
|
for (bool good = recset.move_first(); good; good = recset.move_next())
|
|
{
|
|
if (!pi.add_status())
|
|
break;
|
|
|
|
const real impdet = recset.get(RMI_IMPOSTA).as_real(); // Imposta detraibile
|
|
if (!impdet.is_zero())
|
|
{
|
|
const int gruppo = recset.get(RMI_GRUPPO).as_int();
|
|
const int conto = recset.get(RMI_CONTO).as_int();
|
|
const long sottoconto = recset.get(RMI_SOTTOCONTO).as_int();
|
|
const TString& codiva = recset.get(RMI_CODIVA).as_string();
|
|
key.format("%03d|%03d|%06ld|%s", gruppo, conto, sottoconto, (const char*)codiva);
|
|
real* pr = (real*)mconti.objptr(key);
|
|
if (pr == NULL)
|
|
{
|
|
pr = new real;
|
|
mconti.add(key, pr);
|
|
}
|
|
|
|
real imp = impdet * prorata / CENTO;
|
|
imp.round(2);
|
|
*pr += imp;
|
|
}
|
|
}
|
|
|
|
TString_array aconti;
|
|
FOR_EACH_ASSOC_OBJECT(mconti, o, k, i)
|
|
{
|
|
TToken_string* row = new TToken_string(k);
|
|
*row << '|' << *i;
|
|
aconti.add(row);
|
|
}
|
|
aconti.sort();
|
|
int riga = 0;
|
|
real tot;
|
|
const char* seziva = caus.sezione(1) == 'A' ? "A" : "D";
|
|
const char* sezimp = caus.sezione(1) == 'A' ? "D" : "A";
|
|
|
|
TString8 para;
|
|
|
|
FOR_EACH_ARRAY_ROW(aconti, r, row)
|
|
{
|
|
const int gruppo = row->get_int(0);
|
|
const int conto = row->get_int();
|
|
const long sottoconto = row->get_long();
|
|
const TString4 codiva = row->get();
|
|
const real imp = row->get();
|
|
if (!imp.is_zero())
|
|
{
|
|
para.format("%d,%d", LF_RMOV, ++riga);
|
|
trans.set_paragraph(para);
|
|
trans.set(RMV_SEZIONE, sezimp);
|
|
trans.set(RMV_IMPORTO, imp.string());
|
|
trans.set(RMV_GRUPPO, gruppo);
|
|
trans.set(RMV_CONTO, conto);
|
|
trans.set(RMV_SOTTOCONTO, sottoconto);
|
|
descr.cut(0) << TR("Codice IVA") << ' ' << codiva;
|
|
trans.set(RMV_DESCR, descr);
|
|
tot += imp;
|
|
}
|
|
}
|
|
|
|
TBill civa; caus.bill(1, civa);
|
|
para.format("%d,%d", LF_RMOV, ++riga);
|
|
trans.set_paragraph(para);
|
|
trans.set(RMV_SEZIONE, seziva);
|
|
trans.set(RMV_IMPORTO, tot.string());
|
|
trans.set(RMV_GRUPPO, civa.gruppo());
|
|
trans.set(RMV_CONTO, civa.conto());
|
|
trans.set(RMV_SOTTOCONTO, civa.sottoconto());
|
|
|
|
return true;
|
|
}
|
|
|
|
bool TProrata_msk::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
|
{
|
|
switch (o.dlg())
|
|
{
|
|
case DLG_PREVIEW:
|
|
case DLG_PRINT:
|
|
if (e == fe_button)
|
|
{
|
|
TProrata_rep rep;
|
|
if (rep.ok())
|
|
{
|
|
rep.mask2report(*this);
|
|
if (o.dlg() == DLG_PRINT)
|
|
rep.print();
|
|
else
|
|
rep.preview();
|
|
}
|
|
return false;
|
|
}
|
|
break;
|
|
case F_CODATT:
|
|
if (e == fe_init)
|
|
{
|
|
TBrowse& b = *((TEdit_field&)o).browse();
|
|
TCursor& c = *b.cursor();
|
|
const TRecnotype i = c.items();
|
|
if (i > 0)
|
|
{
|
|
c = 0L;
|
|
o.set(c.curr().get(ATT_CODATT));
|
|
b.do_output();
|
|
o.enable(i > 1);
|
|
}
|
|
else
|
|
o.disable();
|
|
}
|
|
if (!o.empty() && (e == fe_init || e == fe_modify))
|
|
get_perc_prorata();
|
|
break;
|
|
case F_DATAINI:
|
|
if (e == fe_init)
|
|
{
|
|
TDate d(TODAY); d.set_day(1); --d;
|
|
d.set_day(1);
|
|
o.set(d);
|
|
d.set_end_month();
|
|
set(F_DATAFIN, d, 0x3);
|
|
}
|
|
break;
|
|
case F_DATAFIN:
|
|
if (!o.empty() && (e == fe_init || e == fe_modify))
|
|
get_perc_prorata();
|
|
break;
|
|
case DLG_ELABORA:
|
|
if (e == fe_button)
|
|
{
|
|
TFilename ininame;
|
|
if (genera_mov(ininame))
|
|
{
|
|
TString app; app << "cg2 -0 /i" << ininame;
|
|
TExternal_app a(app);
|
|
a.run();
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////
|
|
// TProrata_app
|
|
///////////////////////////////////////////////////////////
|
|
|
|
class TProrata_app : public TSkeleton_application
|
|
{
|
|
public:
|
|
virtual void main_loop();
|
|
};
|
|
|
|
void TProrata_app::main_loop()
|
|
{
|
|
TProrata_msk m;
|
|
m.run();
|
|
}
|
|
|
|
int cg5900(int argc, char* argv[])
|
|
{
|
|
TProrata_app a;
|
|
a.run(argc, argv, TR("Stampa pro-rata"));
|
|
return 0;
|
|
}
|