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

View File

@ -103,17 +103,19 @@ class TVariazione_budget_mask : public TAutomask
protected: protected:
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); 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 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 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.. 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(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 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_commessa(); //(save()) salva i cambiamenti di date della commessa esaminata
bool save_sheet(); //(save()) salva i cambiamenti nello sheet bool save_sheet(); //(save()) salva i cambiamenti nello sheet
bool save(); //(on_field) gestisce l'ordine dei salvataggi 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: public:
TVariazione_budget_mask(); 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)); 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) void TVariazione_budget_mask::build_key_by_numreg(int i, TToken_string& key)
{ {
TSheet_field& sf_righe = sfield(F_RIGHE); 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 //chiave della riga sorella originale
key.cut(0); key.cut(0);
key.add(curr_riga.get(_pos_numreg)); 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) //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: case F_CODCMS:
if (e == fe_modify) if (e == fe_modify)
{ {
bool e = carica_rmovana() == 0; bool e = load() == 0;
o.enable(e); o.enable(e);
enable(F_DESCRIZ, e); enable(F_DESCRIZ, e);
} }
@ -424,28 +434,17 @@ bool TVariazione_budget_mask::save_commessa()
return err == NOERR; return err == NOERR;
} }
//salva lo sheet...lasciate ogni speranza voi che entrate! //modifica movana esistente in base alle modifiche sulle righe
bool TVariazione_budget_mask::save_sheet() int TVariazione_budget_mask::modifica_movana(const long numreg, TSheet_field& sf_righe, const int r)
{ {
//1)ordina le righe per numreg/numrig TAnal_mov movana(numreg);
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
FOR_EACH_SHEET_ROW(sf_righe, r, riga)
{
int first, last; 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); 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.. //giro di controllo sulle date; le righe sheet, eventualmente modificate, devono avere un intervallo date..
//..compatibile con quello del movimento //..compatibile con quello del movimento
if (numreg > 0)
{
TAnal_mov movana(numreg);
const TDate datacomp = movana.get_date(MOVANA_DATACOMP); const TDate datacomp = movana.get_date(MOVANA_DATACOMP);
TDate datafcomp = movana.get_date(MOVANA_DATAFCOMP); TDate datafcomp = movana.get_date(MOVANA_DATAFCOMP);
const bool autofcomp = movana.get_bool(MOVANA_AUTOFCOMP); const bool autofcomp = movana.get_bool(MOVANA_AUTOFCOMP);
@ -470,22 +469,26 @@ bool TVariazione_budget_mask::save_sheet()
//le righe da liberare sono quelle che non rispettano i vincoli sulle date //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_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_numreg);
sf_righe.row(i).add("", _pos_numrig); sf_righe.row(i).add("", _pos_numrig);
}
//elimina la riga dal movana //elimina la riga dal movana
row_modified |= movana.destroy_row(r_numrig, true); row_modified |= movana.destroy_row(r_numrig, true);
} }
else //qui invece ci vanno le righe modificate che sono solo da riscrivere else //qui invece ci vanno le righe modificate che sono solo da riscrivere (importo e/o descr modificate)
{ {
TRectype& rmovana = movana.body()[r_numrig]; TRectype& rmovana = movana.body()[r_numrig];
//importo
const real importo = rmovana.get_real(RMOVANA_IMPORTO); const real importo = rmovana.get_real(RMOVANA_IMPORTO);
if (importo != r_importo) if (importo != r_importo)
{ {
rmovana.put(RMOVANA_IMPORTO, r_importo); rmovana.put(RMOVANA_IMPORTO, r_importo);
row_modified = true; row_modified = true;
} }
//descrizione
const char* r_descr = sf_righe.cell(i, _pos_descr); const char* r_descr = sf_righe.cell(i, _pos_descr);
const TString& descr = rmovana.get(RMOVANA_DESCR); const TString& descr = rmovana.get(RMOVANA_DESCR);
if (descr != r_descr) if (descr != r_descr)
@ -494,20 +497,133 @@ bool TVariazione_budget_mask::save_sheet()
row_modified = true; row_modified = true;
} }
} }
} } //for(int i=last;i<=first;i--)...
if (row_modified) if (row_modified)
{
TLocalisamfile file_movana(LF_MOVANA);
if (movana.rows() > 0)
{ {
movana.update_totdoc(); movana.update_totdoc();
movana.rewrite(file_movana); movana.rewrite(file_movana);
} }
else
movana.remove(file_movana);
} }
//finito il giro sulle sorelle; si passa alla successiva famiglia (ovvero al successivo numreg) return last;
r = 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
TSheet_field& sf_righe = sfield(F_RIGHE);
sf_righe.sort(compare_by_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)
{
const long numreg = sf_righe.row(r).get_long(_pos_numreg);
if (numreg > 0)
r = modifica_movana(numreg, sf_righe, r);
} //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);
//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);
} //FOR_EACH_SHEET_ROW(sf_righe,n...
//le righe vanno rimesse in ordine di chiave cdc/fase/conto //le righe vanno rimesse in ordine di chiave cdc/fase/conto
sf_righe.sort(compare_by_fase); load();
sf_righe.force_update();
return true; 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; TString query;
query << "USE RMOVANA KEY 4\n"; query << "USE RMOVANA KEY 4\n";