Patch level : 10.0 1054

Files correlati     : fe0.exe fe0100a.msk fetbcon.msk
Ricompilazione Demo : [ ]
Commento            :
Corretta gestione contratti


git-svn-id: svn://10.65.10.50/branches/R_10_00@22392 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2011-07-11 10:28:57 +00:00
parent 7291299ce2
commit 7a187457cf
3 changed files with 92 additions and 70 deletions

@ -53,38 +53,29 @@ static const TString& provincia_di(const TString& codcom)
}
///////////////////////////////////////////////////////////
// TContratti
// TContratto
///////////////////////////////////////////////////////////
const TRectype& contratto(char tipocf, long codcf, const char* codcont)
class TContratto : public TObject
{
TString80 key; key.format("%c%6ld%s", tipocf, codcf, codcont);
TRectype& c = (TRectype&)cache().get("&CON", key);
if (c.empty())
{
int primo_anno = c.get_int("I0");
if (primo_anno < 2010)
{
const TDate inizio = c.get("D0");
primo_anno = inizio.year();
if (primo_anno < 2010)
primo_anno = 2010;
c.put("I0", primo_anno);
}
TRectype _rec;
real importo = c.get("R0");
if (importo <= ZERO)
{
importo = primo_anno > 2010 ? 3000 : 25000;
c.put("R0", importo);
}
}
return c;
}
protected:
bool importo_annuale(int anno, real& importo, real& imposta) const;
bool importo_figli(int anno, real& importo, real& imposta) const;
bool importo_contratto(const TRectype& c, int anno, real& importo, real& imposta)
public:
virtual bool ok() const { return !_rec.empty(); }
bool totale_annuale(int anno, real& importo, real& imposta) const;
bool init(const TRectype& rec);
TContratto(char tipocf, long codcf, const char* codcont);
TContratto(const TRectype& rec) : _rec(rec) { init(rec); }
};
bool TContratto::importo_annuale(int anno, real& importo, real& imposta) const
{
if (c.empty() || anno < 2010)
if (_rec.empty() || anno < 2010)
return false;
// Determina l'indice i [0..3] degli importi del contratto per l'anno richiesto
@ -93,7 +84,7 @@ bool importo_contratto(const TRectype& c, int anno, real& importo, real& imposta
for (i = 3; i > 0; i--)
{
fld[1] = '0'+i;
const int y = c.get_int(fld);
const int y = _rec.get_int(fld);
if (y > 0 && y <= anno)
break;
}
@ -101,17 +92,17 @@ bool importo_contratto(const TRectype& c, int anno, real& importo, real& imposta
// Determina il nome del campo importo corrispondente all'indice i: 0 -> R0; 1 -> R2; 2 -> R4; 3 -> R6
fld[0] = 'R';
fld[1] = '0'+(i*2);
importo = c.get_real(fld);
importo = _rec.get_real(fld);
fld[1]++; // Il campo imposta è sempre quello successivo a quello dell'importo
imposta = c.get_real(fld);
imposta = _rec.get_real(fld);
return importo > ZERO;
}
bool importo_figli_contratto(const TRectype& c, int anno, real& importo, real& imposta)
bool TContratto::importo_figli(int anno, real& importo, real& imposta) const
{
const TString& codtab = c.get("CODTAB");
const TString& codtab = _rec.get("CODTAB");
const TString& prefix = codtab.left(7);
const TString& suffix = codtab.mid(7);
@ -125,33 +116,66 @@ bool importo_figli_contratto(const TRectype& c, int anno, real& importo, real& i
importo = imposta = ZERO;
for (bool ok = recset.move_first(); ok; ok = recset.move_next())
{
real imp, iva;
importo_figli_contratto(recset.cursor()->curr(), anno, imp, iva);
const TContratto child(recset.cursor()->curr());
real imp, iva; child.importo_figli(anno, imp, iva);
importo += imp;
imposta += iva;
}
if (importo <= ZERO)
importo_contratto(c, anno, importo, imposta);
importo_annuale(anno, importo, imposta);
return !importo.is_zero();
}
real importo_totale_contratto(char tipocf, long codcf, const char* codcont, int anno,
real& importo, real& imposta)
bool TContratto::totale_annuale(int anno, real& importo, real& imposta) const
{
importo = imposta = ZERO;
const TRectype& c = contratto(tipocf, codcf, codcont);
if (!c.empty() && anno >= 2010)
if (!_rec.empty() && anno >= 2010)
{
const TString& padre = c.get("S1");
const TString& padre = _rec.get("S1");
if (padre.full())
importo_totale_contratto(tipocf, codcf, padre, anno, importo, imposta);
{
const TString& codtab = _rec.get("CODTAB");
const TContratto master(codtab[0], atol(codtab.mid(1,6)), padre);
master.totale_annuale(anno, importo, imposta);
}
else
importo_figli_contratto(c, anno, importo, imposta);
importo_figli(anno, importo, imposta);
}
return importo > ZERO;
}
bool TContratto::init(const TRectype& rec)
{
_rec = rec;
if (!_rec.empty())
{
int primo_anno = _rec.get_int("I0");
if (primo_anno < 2010)
{
const TDate inizio = _rec.get("D0");
primo_anno = inizio.year();
if (primo_anno < 2010)
primo_anno = 2010;
_rec.put("I0", primo_anno);
}
real importo = _rec.get("R0");
if (importo <= ZERO)
{
importo = primo_anno > 2010 ? 3000 : 25000;
_rec.put("R0", importo);
}
}
return ok();
}
TContratto::TContratto(char tipocf, long codcf, const char* codcont) : _rec(LF_TABMOD)
{
TString80 key; key.format("%c%6ld%s", tipocf, codcf, codcont);
init(cache().get("&CON", key));
}
///////////////////////////////////////////////////////////
// TAnagrafica
///////////////////////////////////////////////////////////
@ -492,14 +516,15 @@ class TDati_rilevanti_set : public TAS400_recordset
protected:
virtual bool set_field(const TAS400_column_info& fi, const TVariant& var);
void init();
bool set_val(int n, const TVariant& v) { return TAS400_recordset::set(n-1, v); }
public:
bool set(unsigned int n, const TVariant& v) { return TAS400_recordset::set(n-1, v); }
bool set(unsigned int n, const TString& v) { return TAS400_recordset::set(n-1, TVariant(v)); }
bool set(unsigned int n, char v) { TString4 str; str << v; return TAS400_recordset::set(n-1, TVariant(str)); }
bool set(unsigned int n, int v) { return TAS400_recordset::set(n-1, TVariant(long(v))); }
bool set(unsigned int n, const real& v) { return TAS400_recordset::set(n-1, v.integer()); }
bool set(unsigned int n, const TDate& v) { return TAS400_recordset::set(n-1, TVariant(v)); }
bool set(unsigned int n, const TVariant& v) { return set_val(n, v); }
bool set(unsigned int n, const TString& v) { return set_val(n, v); }
bool set(unsigned int n, char v) { TString4 str; str << v; return set_val(n, str); }
bool set(unsigned int n, int v) { return set_val(n, long(v)); }
bool set(unsigned int n, const real& v) { return set_val(n, v.integer()); }
bool set(unsigned int n, const TDate& v) { return set_val(n, v); }
void add_control_rec(int zero_o_nove);
TDati_rilevanti_set(int anno);
};
@ -761,8 +786,10 @@ bool TDati_rilevanti_msk::salva_allegato(const TRectype& mov, TFast_isamfile& fa
if (contratto.full())
{
alleg.put(ALL_CONTRATTO, contratto);
const TContratto cont(tipocf, codcf, contratto);
real importotot, impostatot;
importo_totale_contratto(tipocf, codcf, contratto, anno, importotot, impostatot);
cont.totale_annuale(anno, importotot, impostatot);
alleg.put(ALL_IMPORTOTOT, importotot);
alleg.put(ALL_IMPOSTATOT, impostatot);
}
@ -823,19 +850,11 @@ bool TDati_rilevanti_msk::elabora_movimento(const TRectype& mov, TFast_isamfile&
if (natura_operazione == 4 && datareg < data_limite_scontrini)
continue;
const bool com_obbl = ci.get_bool("B6");
if (com_obbl)
{
// Le bollette vengono già spedite dal Enel, per cui non si devono spedire nuovamente
ignora_movimento(mov, TR("oggetto di comunicazione obbligatoria all'anagrafe tributaria"), log);
continue;
}
// Esportazioni
const bool art_8 = ci.get("S2") == "20" && ci.get("S3") == "1";
if (art_8)
{
ignora_movimento(mov, TR("soggetto all'articolo 8 (del dpr 26/10/1972)"), log);
ignora_movimento(mov, TR("soggetto all'articolo 8 (del dpr 26-10-1972)"), log);
continue;
}
@ -1399,9 +1418,9 @@ bool TDati_rilevanti_msk::on_field_event(TOperable_field& o, TField_event e, lon
if (e == fe_modify || (e == fe_init && !o.empty()))
{
TMask& m = o.mask();
const TContratto cont(m.get(A_TIPOCF)[0], m.get_long(A_CODCF), m.get(A_CONTRATTO));
real importo, imposta;
importo_totale_contratto(m.get(A_TIPOCF)[0], m.get_long(A_CODCF), m.get(A_CONTRATTO),
get_int(F_ANNO), importo, imposta);
cont.totale_annuale(get_int(F_ANNO), importo, imposta);
m.set(A_IMPORTOTOT, importo);
m.set(A_IMPOSTATOT, imposta);
}

@ -254,11 +254,14 @@ NUMBER A_NUMREG 7
BEGIN
PROMPT 41 5 "N. operazione "
FIELD NUMREG
USE MOV
USE MOV SELECT (TIPO==#A_TIPOCF)&&(BETWEEN(CODCF,#A_CODCF,#A_CODCF))
JOIN LF_CLIFO INTO TIPOCF==TIPO CODCF==CODCF
INPUT NUMREG A_NUMREG
DISPLAY "Numero@7" NUMREG
DISPLAY "Data@10" DATAREG
DISPLAY "Descrizione@50" DESCR
DISPLAY "Codice" CODCF
DISPLAY "Ragione Sociale@50" LF_CLIFO->RAGSOC
OUTPUT A_NUMREG NUMREG
CHECKTYPE NORMAL
ADD RUN cg2 -0
@ -345,7 +348,7 @@ BEGIN
OUTPUT A_NUMRETT NUMREG
CHECKTYPE NORMAL
ADD RUN cg2 -0
NUM_EXPR #A_NUMRETT!=#A_NUMREG
NUM_EXPR (#A_NUMRETT=0)||(#A_NUMRETT!=#A_NUMREG)
WARNING "Inserire un numero registrazione diverso da quello principale"
END

@ -14,8 +14,8 @@ END
LIST F_CON_TIPOCF 1 9
BEGIN
PROMPT 2 2 ""
ITEM "F|Fornitore"
ITEM "C|Cliente"
ITEM "F|Fornitore"
FIELD CODTAB[1,1]
KEY 1
END
@ -33,8 +33,8 @@ BEGIN
CHECKTYPE REQUIRED
FIELD CODTAB[2,7]
KEY 1
MESSAGE EMPTY ENABLE,F_RAGSOC
MESSAGE DISABLE,F_RAGSOC
MESSAGE EMPTY ENABLE,F_CON_RAGSOC
MESSAGE DISABLE,F_CON_RAGSOC
END
STRING F_CON_RAGSOC 50
@ -56,8 +56,8 @@ BEGIN
FIELD CODTAB[8,25]
USE &CON
JOIN LF_CLIFO INTO TIPOCF=CODTAB[1,1] CODCF=CODTAB[2,7]
INPUT CODTAB[1,1] F_CON_TIPOCF SELECT
INPUT CODTAB[2,7] F_CON_CODCF
INPUT CODTAB[1,1] F_CON_TIPOCF SELECT
INPUT CODTAB[2,7] F_CON_CODCF
INPUT CODTAB[8,25] F_CON_CONTRATTO
DISPLAY "Contratto" CODTAB[8,]
DISPLAY "Descrizione@50" S0
@ -75,7 +75,7 @@ STRING F_CON_DESCRIZIONE 50
BEGIN
PROMPT 2 4 "Descrizione "
FIELD S0
USE &CON KEY 2 SELECT (CODTAB[1,1]==#F_TIPOCF)&&(STR(CODTAB[2,7]=#F_CODCF))
USE &CON KEY 2 SELECT (CODTAB[1,1]==#F_CON_TIPOCF)&&(STR(CODTAB[2,7]=#F_CON_CODCF))
JOIN LF_CLIFO INTO TIPOCF=CODTAB[1,1] CODCF=CODTAB[2,7]
INPUT S0 F_CON_DESCRIZIONE
DISPLAY "Descrizione@50" S0
@ -137,19 +137,19 @@ ENDMASK
PAGE "Rateizzazione" -1 -1 25 5
NUMBER R_ANNO 4
NUMBER R_CON_ANNO 4
BEGIN
PROMPT 1 1 "Anno "
FIELD I0
END
CURRENCY R_IMPORTO 12
CURRENCY R_CON_IMPORTO 12
BEGIN
PROMPT 1 2 "Importo "
FIELD R0
END
CURRENCY R_IMPOSTA 12
CURRENCY R_CON_IMPOSTA 12
BEGIN
PROMPT 1 3 "Imposta "
FIELD R1