Patch level :10.0

Files correlati     :
Ricompilazione Demo : [ ]
Commento            :
personalizzazione crpa in corso


git-svn-id: svn://10.65.10.50/trunk@20385 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
luca 2010-04-28 10:59:13 +00:00
parent bf98e83c14
commit d241a8d841

@ -103,17 +103,19 @@ class TVariazione_budget_mask : public TAutomask
protected:
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
int carica_rmovana();
int load();
bool one_checked() const; //(on_field) controlla se nella colonna dei check ce ne è almeno 1 checkato
void check_all(const bool checked); //(on_field) checka-dechecka la colonna dei check
int find_sister_rows(const int curr_sister, int& first_sister, int& last_sister, const bool by_numreg = false); //(on_field) trova le righe..
//con la stessa chiave della riga corrente e della chiave selezionata
//..con la stessa chiave della riga corrente e della chiave selezionata
void build_key(int i, TToken_string& key); //(find_sister_rows) crea la chiave cdc/fase/conto della riga con cui cercare le sorelle
void build_key_by_numreg(int i, TToken_string& key); //(find_sister_rows) crea la chiave numreg della riga con cui cercare le sorelle
void aggiorna_saldi_preventivi(TSheet_field& sf_righe, const int curr_riga); //(carica_rmovana()) crea i saldi preventivi in base agli importi
void aggiorna_saldi_preventivi(TSheet_field& sf_righe, const int curr_riga); //(load()) crea i saldi preventivi in base agli importi
bool save_commessa(); //(save()) salva i cambiamenti di date della commessa esaminata
bool save_sheet(); //(save()) salva i cambiamenti nello sheet
bool save(); //(on_field) gestisce l'ordine dei salvataggi
int modifica_movana(const long numreg, TSheet_field& sf_righe, const int r); //((save_sheet()) gestisce la modifica di movana esistenti
int crea_movana(TSheet_field& sf_righe, const int n); //(save_sheet()) gestisce la creazione dei nuovi movana
public:
TVariazione_budget_mask();
@ -164,7 +166,7 @@ void TVariazione_budget_mask::build_key(int i, TToken_string& key)
key.add(curr_riga.get(_pos_conto));
}
//crea la chiave numreg/numrig o datacomp/autofcomp/datafcomp
void TVariazione_budget_mask::build_key_by_numreg(int i, TToken_string& key)
{
TSheet_field& sf_righe = sfield(F_RIGHE);
@ -172,6 +174,14 @@ void TVariazione_budget_mask::build_key_by_numreg(int i, TToken_string& key)
//chiave della riga sorella originale
key.cut(0);
key.add(curr_riga.get(_pos_numreg));
if (atol(key) == 0)
{
const TDate datacomp = curr_riga.get(_pos_datacomp);
key.add(datacomp.date2ansi());
key.add(curr_riga.get(_pos_autofcomp));
const TDate datafcomp = curr_riga.get(_pos_datafcomp);
key.add(datafcomp.date2ansi());
}
}
//cerca le righe sorelle per chiave cdc/fase/conto o numreg (dipende da by_numreg)
@ -227,7 +237,7 @@ bool TVariazione_budget_mask::on_field_event(TOperable_field& o, TField_event e,
case F_CODCMS:
if (e == fe_modify)
{
bool e = carica_rmovana() == 0;
bool e = load() == 0;
o.enable(e);
enable(F_DESCRIZ, e);
}
@ -424,90 +434,196 @@ bool TVariazione_budget_mask::save_commessa()
return err == NOERR;
}
//modifica movana esistente in base alle modifiche sulle righe
int TVariazione_budget_mask::modifica_movana(const long numreg, TSheet_field& sf_righe, const int r)
{
TAnal_mov movana(numreg);
int first, last;
//prende tutte le sorelle della riga, così da aggiornare un movana alla volta
const int sisters = find_sister_rows(r, first, last, true);
//giro di controllo sulle date; le righe sheet, eventualmente modificate, devono avere un intervallo date..
//..compatibile con quello del movimento
const TDate datacomp = movana.get_date(MOVANA_DATACOMP);
TDate datafcomp = movana.get_date(MOVANA_DATAFCOMP);
const bool autofcomp = movana.get_bool(MOVANA_AUTOFCOMP);
if (!datafcomp.ok() && !autofcomp)
datafcomp = datacomp;
//controlla le righe sorelle dello sheet; se le date non rientrano in quelle della testata -> le righe..
//..vanno considerate nuove, e quindi va messo a 0 il loro numreg/numrig
bool row_modified = false;
for (int i = last; i >= first; i--)
{
//date testata
const bool r_autofcomp = *sf_righe.cell(i, _pos_autofcomp) > ' ';
const TDate r_datacomp = sf_righe.cell(i, _pos_datacomp);
TDate r_datafcomp = sf_righe.cell(i, _pos_datafcomp);
if (r_datafcomp < r_datacomp)
r_datafcomp = r_datacomp;
//importo riga: se nullo la riga verrà eliminata in quanto inutile all'umanità
const int r_numrig = atoi(sf_righe.cell(i, _pos_numrig));
const real r_importo = sf_righe.cell(i, _pos_imp);
//le righe da liberare sono quelle che non rispettano i vincoli sulle date
if (r_autofcomp != autofcomp || r_datacomp != datacomp || r_datafcomp != datafcomp || r_importo.is_zero())
{
if (!r_importo.is_zero())
{
sf_righe.row(i).add("", _pos_numreg);
sf_righe.row(i).add("", _pos_numrig);
}
//elimina la riga dal movana
row_modified |= movana.destroy_row(r_numrig, true);
}
else //qui invece ci vanno le righe modificate che sono solo da riscrivere (importo e/o descr modificate)
{
TRectype& rmovana = movana.body()[r_numrig];
//importo
const real importo = rmovana.get_real(RMOVANA_IMPORTO);
if (importo != r_importo)
{
rmovana.put(RMOVANA_IMPORTO, r_importo);
row_modified = true;
}
//descrizione
const char* r_descr = sf_righe.cell(i, _pos_descr);
const TString& descr = rmovana.get(RMOVANA_DESCR);
if (descr != r_descr)
{
rmovana.put(RMOVANA_DESCR, r_descr);
row_modified = true;
}
}
} //for(int i=last;i<=first;i--)...
if (row_modified)
{
TLocalisamfile file_movana(LF_MOVANA);
if (movana.rows() > 0)
{
movana.update_totdoc();
movana.rewrite(file_movana);
}
else
movana.remove(file_movana);
}
return last;
}
//crea un nuovo movana in base alle righe sullo sheet
int TVariazione_budget_mask::crea_movana(TSheet_field& sf_righe, const int n)
{
TAnal_mov new_movana;
//trovando numreg=0, le sorelle saranno solo quelle che hanno la stessa chiave datacomp/autofcomp/datafcomp,..
//..in modo da creare movana corretti in termini di date e coerenti con le righe contenute in loro
int first, last;
const int sisters = find_sister_rows(n, first, last, true);
//datacomp/autofcomp/datafcomp vengono presi una volta per tutte le sorelle in quanto sono la chiave della sorellanza
const bool r_autofcomp = *sf_righe.cell(n, _pos_autofcomp) > ' ';
const TDate r_datacomp = sf_righe.cell(n, _pos_datacomp);
TDate r_datafcomp = sf_righe.cell(n, _pos_datafcomp);
if (r_datafcomp < r_datacomp)
r_datafcomp = r_datacomp;
//riempie la testata del movana
const TEsercizi_contabili ec;
const int annoes = ec.date2esc(r_datacomp);
new_movana.put(MOVANA_ANNOES, annoes);
const TDate& datareg = get_date(F_DATAREG);
new_movana.put(MOVANA_DATAREG, datareg);
new_movana.put(MOVANA_DATACOMP, r_datacomp);
new_movana.put(MOVANA_AUTOFCOMP, r_autofcomp);
if (!r_autofcomp && r_datafcomp > r_datacomp)
new_movana.put(MOVANA_DATAFCOMP, r_datafcomp);
const TString& codcaus = get(F_CODCAUS);
new_movana.put(MOVANA_CODCAUS, codcaus);
TString descr;
descr << TR("Preventivo commessa ") << get(F_CODCMS);
new_movana.put(MOVANA_DESCR, descr);
new_movana.put(MOVANA_TIPOMOV, 'P');
//giro sulle sorelle; ogni riga, se di importo non nullo, va aggiunta al new_movana
for (int i = first; i <= last; i++)
{
const real importo = sf_righe.cell(i, _pos_imp);
if (importo != ZERO)
{
//aggiunge la rmovana al movana
TRectype& new_rmovana = new_movana.new_row();
//compila la rmovana
new_rmovana.put(RMOVANA_ANNOES, annoes);
new_rmovana.put(RMOVANA_DATACOMP, r_datacomp);
new_rmovana.put(RMOVANA_CODCMS, get(F_CODCMS));
const TString& cdc = sf_righe.cell(i, _pos_cdc);
new_rmovana.put(RMOVANA_CODCCOSTO, cdc);
const TString& fase = sf_righe.cell(i, _pos_fase);
new_rmovana.put(RMOVANA_CODFASE, fase);
const TString& conto = sf_righe.cell(i, _pos_conto);
new_rmovana.put(RMOVANA_CODCONTO, conto);
const TString& sezione = sf_righe.cell(i, _pos_cosric);
new_rmovana.put(RMOVANA_SEZIONE, sezione == "C" ? 'D' : 'A');
new_rmovana.put(RMOVANA_IMPORTO, importo);
const TString& descr = sf_righe.cell(i, _pos_descr);
new_rmovana.put(RMOVANA_DESCR, descr);
}
} //for(int i = last; i >= first; i--)...
//alla fine si scrive il nuovo movana solo se ha righe!!!
if (new_movana.rows() > 0)
{
new_movana.update_totdoc();
TLocalisamfile file_movana(LF_MOVANA);
new_movana.write(file_movana);
}
return last;
}
//salva lo sheet...lasciate ogni speranza voi che entrate!
bool TVariazione_budget_mask::save_sheet()
{
//1)ordina le righe per numreg/numrig
//1) ordina le righe per numreg/numrig
TSheet_field& sf_righe = sfield(F_RIGHE);
sf_righe.sort(compare_by_numrig);
//file dei movana qui richiamato in quanto può essere modificato in vari punti successivi...
TLocalisamfile file_movana(LF_MOVANA);
//2)cerca le sorelle per numreg/numrig
//2) Aggiorna i movana con le righe di loro competenza: registra solo le righe con NUMREG !=0
FOR_EACH_SHEET_ROW(sf_righe, r, riga)
{
int first, last;
const int sisters = find_sister_rows(r, first, last, true);
const long numreg = sf_righe.row(r).get_long(_pos_numreg);
//giro di controllo sulle date; le righe sheet, eventualmente modificate, devono avere un intervallo date..
//..compatibile con quello del movimento
if (numreg > 0)
{
TAnal_mov movana(numreg);
const TDate datacomp = movana.get_date(MOVANA_DATACOMP);
TDate datafcomp = movana.get_date(MOVANA_DATAFCOMP);
const bool autofcomp = movana.get_bool(MOVANA_AUTOFCOMP);
if (!datafcomp.ok() && !autofcomp)
datafcomp = datacomp;
r = modifica_movana(numreg, sf_righe, r);
//controlla le righe sorelle dello sheet; se le date non rientrano in quelle della testata -> le righe..
//..vanno considerate nuove, e quindi va messo a 0 il loro numreg/numrig
bool row_modified = false;
for (int i = last; i >= first; i--)
{
//date testata
const bool r_autofcomp = *sf_righe.cell(i, _pos_autofcomp) > ' ';
const TDate r_datacomp = sf_righe.cell(i, _pos_datacomp);
TDate r_datafcomp = sf_righe.cell(i, _pos_datafcomp);
if (r_datafcomp < r_datacomp)
r_datafcomp = r_datacomp;
} //FOR_EACH_SHEET_ROW(...
//riordina lo sheet per chiave numreg; in questo modo le righe senza numreg vanno all'inizio e vengono..
//..ordinate per datacomp/autofcomp/datafcomp; tali righe, se hanno importo != 0, vengono aggiunte ad..
//..un nuovo movimento analitico che viene creato sul campo!
sf_righe.sort(compare_by_numrig);
//importo riga: se nullo la riga verrà eliminata in quanto inutile all'umanità
const int r_numrig = atoi(sf_righe.cell(i, _pos_numrig));
const real r_importo = sf_righe.cell(i, _pos_imp);
//3)cerca le sorelle per numreg/numrig: righe con NUMREG = 0
FOR_EACH_SHEET_ROW(sf_righe, n, line)
{
const long numreg = sf_righe.row(n).get_long(_pos_numreg);
//l'ultima sort mette in cima allo sheet tutte le righe con numreg=0; quindi alla prima con numreg>0..
//..tanto vale uscire definitivamente
if (numreg != 0)
break;
n = crea_movana(sf_righe, n);
//le righe da liberare sono quelle che non rispettano i vincoli sulle date
if (r_autofcomp != autofcomp || r_datacomp != datacomp || r_datafcomp != datafcomp || r_importo.is_zero())
{
sf_righe.row(i).add("", _pos_numreg);
sf_righe.row(i).add("", _pos_numrig);
//elimina la riga dal movana
row_modified |= movana.destroy_row(r_numrig, true);
}
else //qui invece ci vanno le righe modificate che sono solo da riscrivere
{
TRectype& rmovana = movana.body()[r_numrig];
const real importo = rmovana.get_real(RMOVANA_IMPORTO);
if (importo != r_importo)
{
rmovana.put(RMOVANA_IMPORTO, r_importo);
row_modified = true;
}
const char* r_descr = sf_righe.cell(i, _pos_descr);
const TString& descr = rmovana.get(RMOVANA_DESCR);
if (descr != r_descr)
{
rmovana.put(RMOVANA_DESCR, r_descr);
row_modified = true;
}
}
}
if (row_modified)
{
movana.update_totdoc();
movana.rewrite(file_movana);
}
}
//finito il giro sulle sorelle; si passa alla successiva famiglia (ovvero al successivo numreg)
r = last;
}
} //FOR_EACH_SHEET_ROW(sf_righe,n...
//le righe vanno rimesse in ordine di chiave cdc/fase/conto
sf_righe.sort(compare_by_fase);
sf_righe.force_update();
load();
return true;
}
@ -576,7 +692,7 @@ void TVariazione_budget_mask::aggiorna_saldi_preventivi(TSheet_field& sf_righe,
}
int TVariazione_budget_mask::carica_rmovana()
int TVariazione_budget_mask::load()
{
TString query;
query << "USE RMOVANA KEY 4\n";