Corretto calcolo prospetto SS

git-svn-id: svn://10.65.10.50/branches/R_10_00@22981 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2014-07-30 12:58:29 +00:00
parent 3de99221c0
commit 1fdd0d560e
2 changed files with 110 additions and 60 deletions

View File

@ -211,8 +211,8 @@ class TTrasferimento770 : public TObject
bool _save_headers;
protected:
bool riepiloga_ss(const TRecord770& rec, TArray& riep_ss) const;
bool riepiloga_sx(const TRecord770& rec, TArray& riep_sx) const;
void riepiloga_ss(const TRecord770& rec, TArray& riep_ss) const;
void riepiloga_sx(const TRecord770& rec, TArray& riep_sx) const;
public:
bool open(const char* path = "", char mode = 'r', int volume = 0);
@ -272,7 +272,9 @@ bool TForm770::validate(TForm_item &cf, TToken_string &s)
{
const TString& prov = cf.get();
if (prov == "EE") // Il 770 non gradisce la provincia EE associata agli stati esteri
cf.set("");
cf.set(""); else
if (prov == "FO") // Ci sono ancora vecchie province :-(
cf.set("FC");
return true;
}
@ -554,6 +556,42 @@ TRecnotype TForm770::trasfer(long codditta, TTrasferimento770& file, char rectyp
int err = first(); // Deve sempre tornare NOERR
for (; err == NOERR; err = next())
{
// Normalizza cognome e nome delle persone fisiche
if (cur.relation()->log2ind(LF_ANAG) > 0)
{
TLocalisamfile& anag = cur.file(-216); // Anagrafica percipiente
const TString& ragsoc = anag.get(ANA_RAGSOC);
const TString& nome = ragsoc.mid(30);
if (nome.blank() && anag.get_char(ANA_TIPOA) == 'F')
{
TToken_string rs(ragsoc, ' '); rs.strip_double_spaces();
const int pezzi = rs.items();
int spc = 0;
if (pezzi >= 4)
{
int spc = rs.find(' ', 0);
spc = rs.find(' ', spc+1);
}
else
{
spc = rs.find(' ', 3);
if (spc <= 5 && rs.starts_with("DE", true) && pezzi >= 3)
spc = rs.find(' ', spc+1);
if (spc < 0)
spc = rs.find(' ', 0);
}
if (spc >= 2)
{
const TString80 nome = rs.mid(spc+1);
rs.cut(spc); rs.overwrite(nome, 30, 20);
anag.put(ANA_RAGSOC, rs);
if (pezzi == 2) // Salvo solo quando sono sicuro!
anag.rewrite();
}
}
}
transfer_section(body, rigo, rec, file);
rigo++;
if (rigo > rpm)
@ -880,7 +918,7 @@ TTracciato770::~TTracciato770()
const TTracciato770& TTracciati770::tracciato(char tipo)
{
CHECK(tipo >= 'A' && tipo <= 'Z');
CHECK(tipo >= 'A' && tipo <= 'Z', "Tipo record non valido");
const int pos = tipo - 'A';
TTracciato770* trc = (TTracciato770*)_trc.objptr(pos);
if (trc == NULL)
@ -1396,7 +1434,7 @@ bool TTrasferimento770::append_record_b()
rec.set(47, rec_anagiu.get(ANG_SITSOC));
}
rec.set(75, 1); // Reazione della dichiarazione (sezione I)
rec.set(75, 1); // Redazione della dichiarazione (sezione I)
rec.set(76, 0); // Comunicazioni relative a certificazioni lavoro dipendente
const int autonomi = conta_certificazioni();
const bool prosp_st = casella_prospetto_st();
@ -1417,18 +1455,23 @@ bool TTrasferimento770::append_record_b()
key.cut(0) << "F|" << rec_nditte.get(NDT_RAPPR);
const TRectype& rec_rap = _cache770.get(LF_ANAG, key);
const TRectype& rec_rap_fis = _cache770.get(LF_ANAGFIS, key.get(1));
key.cut(0) << "|" << rec_rap_fis.get(ANF_COMNASC);
const TRectype& rec_com_nas = _cache770.get(LF_COMUNI, key);
key.cut(0) << "|" << rec_rap.get(ANA_COMRES);
const TRectype& rec_com_res = _cache770.get(LF_COMUNI, key);
rec.set(126, rec_rap.get(ANA_COFI));
rec.set(127, rec_nditte.get(NDT_CARRAPP));
rec.set(131, rec_rap.get(ANA_RAGSOC).left(24));
rec.set(132, rec_rap.get(ANA_RAGSOC).mid(30, 20));
rec.set(133, rec_rap_fis.get(ANF_SESSO));
rec.set(134, rec_rap_fis.get_date(ANF_DATANASC));
rec.set(135, rec_com_nas.get(COM_DENCOM));
rec.set(136, rec_com_nas.get(COM_PROVCOM));
if (!rec_rap_fis.empty())
{
key.cut(0) << "|" << rec_rap_fis.get(ANF_COMNASC);
const TRectype& rec_com_nas = _cache770.get(LF_COMUNI, key);
key.cut(0) << "|" << rec_rap.get(ANA_COMRES);
const TRectype& rec_com_res = _cache770.get(LF_COMUNI, key);
rec.set(126, rec_rap.get(ANA_COFI));
rec.set(127, rec_nditte.get(NDT_CARRAPP));
rec.set(131, rec_rap.get(ANA_RAGSOC).left(24));
rec.set(132, rec_rap.get(ANA_RAGSOC).mid(30, 20));
rec.set(133, rec_rap_fis.get(ANF_SESSO));
rec.set(134, rec_rap_fis.get_date(ANF_DATANASC));
rec.set(135, rec_com_nas.get(COM_DENCOM));
rec.set(136, rec_com_nas.get(COM_PROVCOM));
}
else
cantread_box("dati del legale rappresentante");
// Ignoro la parte "estera"
@ -1450,7 +1493,15 @@ long TTrasferimento770::append_quadro(const char* quadro, long codditta, TProgin
return items;
}
bool TTrasferimento770::riepiloga_ss(const TRecord770& rec, TArray& riep_ss) const
static real& real_at(TArray& riep, int idx)
{
real* r = (real*)riep.objptr(idx);
if (r == NULL)
riep.add(r = new real, idx);
return *r;
}
void TTrasferimento770::riepiloga_ss(const TRecord770& rec, TArray& riep_ss) const
{
TString8 code;
real val;
@ -1458,33 +1509,20 @@ bool TTrasferimento770::riepiloga_ss(const TRecord770& rec, TArray& riep_ss) con
{
const TString& key = code.right(3);
const int num = atoi(key);
if (num >= 26 && num <= 31)
if (num >= 27 && num <= 35)
{
const int idx = num-26;
real* r = (real*)riep_ss.objptr(idx);
if (r == NULL)
{
r = new real;
riep_ss.add(r, idx);
}
*r += val;
real& r = real_at(riep_ss, num-27); // AU_27-AU_47 -> SS003001
r += val;
} else
if (num >= 43 && num <= 48)
if (num >= 47 && num <= 55)
{
const int idx = num-43;
real* r = (real*)riep_ss.objptr(idx);
if (r == NULL)
{
r = new real;
riep_ss.add(r, idx);
}
*r -= val;
real& r = real_at(riep_ss, num-47);
r -= val;
}
}
return !riep_ss.empty();
}
bool TTrasferimento770::riepiloga_sx(const TRecord770& rec, TArray& riep_sx) const
void TTrasferimento770::riepiloga_sx(const TRecord770& rec, TArray& riep_sx) const
{
TString8 code;
real val;
@ -1494,16 +1532,10 @@ bool TTrasferimento770::riepiloga_sx(const TRecord770& rec, TArray& riep_sx) con
const int col = atoi(code.mid(5,3));
if (rig >= 2 && rig <= 25 && col >= 4 && col <= 5)
{
real* r = (real*)riep_sx.objptr(5); // SX004005
if (r == NULL)
{
r = new real;
riep_sx.add(r, 5);
}
*r += val;
real& r = real_at(riep_sx, 5); // SX004005
r += val;
}
}
return !riep_sx.empty();
}
@ -1600,21 +1632,22 @@ bool TTrasferimento770::split(const char* path)
}
outfile << recf;
totale['F'-'A']++; // Praticamente vale sempre 1
riep_sx.destroy();
riep_sx.destroy(); // La prossima volta non deve salvare nulla
}
outfile << rec;
written++;
// Tengo traccia degli eventuali riepiloghi
if (_save_headers)
{
totale[tipo_rec - 'A']++;
if (tipo_rec == 'E')
riepiloga_sx(rec, riep_sx);
if (tipo_rec == 'H')
riepiloga_ss(rec, riep_ss);
switch (tipo_rec)
{
case 'E': riepiloga_sx(rec, riep_sx); break;
case 'H': riepiloga_ss(rec, riep_ss); break;
default : break;
}
}
if (written >= records_per_disk)
@ -1625,7 +1658,7 @@ bool TTrasferimento770::split(const char* path)
if (_save_headers)
{
// Compila record di riepilogo SS
if (riep_ss.items() > 0)
if (!riep_ss.empty())
{
rec.tipo_record('J');
rec.set(2, cod_fis_dic());
@ -1634,10 +1667,10 @@ bool TTrasferimento770::split(const char* path)
FOR_EACH_ARRAY_ITEM(riep_ss, i, obj)
{
const real* val = (const real*)obj;
if (val != NULL)
if (val != NULL && !val->is_zero())
{
TString8 code;
code.format("SS003%03d", i+1); // i=0 -> SS0003001 -> AUXXX026-AUXXX043
code.format("SS003%03d", i+1); // i=0 -> SS0003001 -> AUXXX027-AUXXX047
rec.np_put(code, *val);
}
}
@ -1703,7 +1736,7 @@ bool TTransfer770_msk::on_field_event(TOperable_field& of, TField_event fe, long
{
TFilename name = of.get();
if (!name.exist())
return error_box("Il percorso non e' valido");
return cantread_box(name);
}
break;
default:
@ -1714,6 +1747,7 @@ bool TTransfer770_msk::on_field_event(TOperable_field& of, TField_event fe, long
TTransfer770_msk::TTransfer770_msk() : TAutomask("777100a")
{
/*
int anno = ini_get_int(CONFIG_STUDIO, "77", "AnnoDic");
if (anno <= 0)
{
@ -1721,6 +1755,8 @@ TTransfer770_msk::TTransfer770_msk() : TAutomask("777100a")
anno = oggi.year()-1;
}
set(F_ANNO, anno);
*/
set(F_ANNO, ANNO_DIC);
}
class TTransfer770_app : public TSkeleton_application
@ -1773,7 +1809,17 @@ void TTransfer770_app::main_loop()
else
tmp = m.get(F_PATH);
t.split(tmp);
if (t.split(tmp))
{
tmp.add(t.default_name());
TString msg; msg << TR("E' stato generato il file ") << tmp;
xvt_dm_popup_message(msg);
}
else
{
tmp.add(t.default_name());
cantwrite_box(tmp);
}
t.remove();
}

View File

@ -125,9 +125,8 @@ END
STRINGA 12
BEGIN
KEY "CODICE COMUNE"
KEY "CODICE COMUNE SOLO SE CAUSALE=N"
PROMPT 78 5 ""
FIELD 218@->COMRES
SPECIAL STRING TRASFER "AU001011" "AN"
END
@ -163,6 +162,8 @@ BEGIN
PROMPT 90 7 ""
FIELD 216@->COFIEST
SPECIAL STRING TRASFER "AU001015" "AN"
MESSAGE EMPTY HIDE,15@
MESSAGE SHOW,15@
END
STRINGA 16
@ -170,6 +171,7 @@ BEGIN
KEY "LOCALITA' ESTERA DI RES."
PROMPT 75 7 ""
SPECIAL STRING TRASFER "AU001016" "AN"
GROUP 15
END
STRINGA 17
@ -177,6 +179,7 @@ BEGIN
KEY "INDIRIZZO DI RES. ESTERO"
PROMPT 75 7 ""
SPECIAL STRING TRASFER "AU001017" "AN"
GROUP 15
END
NUMERO 18
@ -185,6 +188,7 @@ BEGIN
PROMPT 75 7 ""
FIELD 216@->STATORES
SPECIAL STRING TRASFER "AU001018" "NU"
GROUP 15
END
STRINGA 19