diff --git a/ca/ca3883.cpp b/ca/ca3883.cpp index 8b04bc6f4..b6b3f7859 100755 --- a/ca/ca3883.cpp +++ b/ca/ca3883.cpp @@ -373,7 +373,7 @@ real TPrint_saldana_recordset::calcola_avanzamento_tempo() const const TString& codcms = get("CODCMS").as_string(); const TRectype& rec_commesse = cache().get(LF_COMMESSE, codcms); - durata_commessa(rec_commesse, dataini, datafine); + ca_durata_commessa(rec_commesse, dataini, datafine); } //Si prende SOLO la Fine Esercizio come riferimento di avanzamento (in realta' si.. @@ -440,60 +440,6 @@ void TPrint_saldana_recordset::aggiorna_importi(TAssoc_array& riga_array, } } -//calcola la durata di una commessa e le sue date di inizio e fine -long TPrint_saldana_recordset::durata_commessa(const TRectype& rec_commesse, TDate& dataini, TDate& datafine) const -{ - //date iniziale e finale commessa - dataini = rec_commesse.get_date(COMMESSE_DATAINIZIO); - datafine = rec_commesse.get_date(COMMESSE_DATAFINE); - - //per la data fine deve tener conto di eventuali proroghe.. - if (rec_commesse.get_bool(COMMESSE_PROROGA)) - { - const TDate datapror = rec_commesse.get_date(COMMESSE_DATAPROR); - if (datapror.ok()) - datafine = datapror; - } - - //se almeno una delle due date risultasse incompleta.. - if (!dataini.ok() || !datafine.ok()) - { - //prende l'anno - TEsercizi_contabili esc; - int anno = rec_commesse.get_int(COMMESSE_ANNO); - //se non trova un anno valido (non sono ammesse commesse prima del XX secolo!) - if (anno <= 1900) - { - //prova con dataini, se è buona... - if (dataini.ok()) - anno = esc.date2esc(dataini); - else - { - //allora prova con datafine, se è buona... - if (datafine.ok()) - anno = esc.date2esc(datafine); - else - anno = esc.first(); //se nessuna data è buona mette l'anno = al primo esercizio - } - } - - //se entrambe le date fossero vuote, visto che comunque adesso l'anno ce l'ha, le può ricavare.. - if (!dataini.ok() && !datafine.ok()) - esc.code2range(anno, dataini, datafine); - else //solo una data o nessuna data non buona - { - TDate dummy; - //dataini viene messa = ad inizio anno commessa - if (!dataini.ok()) - esc.code2range(anno, dataini, dummy); - //datafine viene messa = alla data di scadenza dell'ultimo esercizio valido + 1 anno (mantiene corrette le sezioni di stampa) - if (!datafine.ok()) - esc.code2range(esc.last() + 1, dummy, datafine); - } - - } //if (!dataini.ok() || !datafine.ok()) - return datafine - dataini + 1; -} //trova la sezione del report in cui ricade in base alle date int TPrint_saldana_recordset::ricava_sezione_di_stampa(const TRectype& rec_commesse, @@ -503,7 +449,7 @@ int TPrint_saldana_recordset::ricava_sezione_di_stampa(const TRectype& rec_comme //data iniziale commessa TDate dataini, datafine; - durata_commessa(rec_commesse, dataini, datafine); + ca_durata_commessa(rec_commesse, dataini, datafine); //Le commesse vengono suddivise in varie sezioni in base alle loro date di inizio/fine/proroga.. //..e al fatto che possono essere di appoggio (Adolf rikiesten!) secondo lo schema: @@ -575,7 +521,7 @@ const TDate TPrint_saldana_recordset::calcola_min_datacomp(const TDate& datainie for (bool ok = recset.move_first(); ok; ok = recset.move_next()) { TDate dataini, datafine; - durata_commessa(rec_commessa, dataini, datafine); + ca_durata_commessa(rec_commessa, dataini, datafine); if (datafine >= datainiesc && dataini < data_min_comp) data_min_comp = dataini; } @@ -876,7 +822,7 @@ void TPrint_saldana_recordset::elabora_rmovana(TAssoc_array* cms, const TDate& d { //data del cazzo che serve per non rovinare datacomp, che è la data sulla riga, non quella iniziale di cms TDate datainicms; - durata_commessa(rec_commesse, datainicms, datafcomp); + ca_durata_commessa(rec_commesse, datainicms, datafcomp); } //se siamo in presenza di un movimento senza datafcomp (inserito precdentemente alla nascita di datafcomp.. //..per tutti i movimenti, come nel gestore dei movana mette datafcomp = datacomp; diff --git a/ca/ca3883.h b/ca/ca3883.h index 30dee3016..07ff35786 100755 --- a/ca/ca3883.h +++ b/ca/ca3883.h @@ -114,7 +114,6 @@ protected: void aggiorna_importo(TAssoc_array& riga_array, const TString& livello, const int indbil, const TRectype& saldana, const bool inverti = false, const bool cms_detraz = false) const; real calcola_avanzamento_tempo() const; - long durata_commessa(const TRectype& rec_commesse, TDate& dataini, TDate& datafine) const; const TDate calcola_min_datacomp(const TDate& datainiesc, const TDate& datafinesc) const; int ricava_sezione_di_stampa(const TRectype& rec_commesse, const TDate& datainiesc, const TDate& datafinesc) const; TString ricava_chiave_cdc_fase(const TString& codcms, const TString& fase, const TString& cdc) const; diff --git a/ca/calib01.cpp b/ca/calib01.cpp index 19fb4cfc0..43f641adf 100755 --- a/ca/calib01.cpp +++ b/ca/calib01.cpp @@ -1291,9 +1291,19 @@ void TAnal_mov::saldo_set_reset(const TRectype& row, bool reset) annies.add(esc_iniziale); const char tipomov = get_char(MOVANA_TIPOMOV); -// i movimenti analitici possono avere una data di scadenza come la mozzarella + // i movimenti analitici possono avere una data di scadenza come la mozzarella const TDate datacomp = get_date(MOVANA_DATACOMP); - const TDate datafcomp = get_date(MOVANA_DATAFCOMP); + TDate datafcomp = get_date(MOVANA_DATAFCOMP); + //caso cazzuto della scadenza con la fine della commessa (come nella stampa bilancio commessa) + if (get_bool(MOVANA_AUTOFCOMP)) + { + const TString& codcms = row.get(RMOVANA_CODCMS); + const TRectype& rec_commesse = cache().get(LF_COMMESSE, codcms); + //data del cazzo che serve per non rovinare datacomp, che è la data sulla riga, non quella iniziale di cms + TDate datainicms; + ca_durata_commessa(rec_commesse, datainicms, datafcomp); + } + if (datafcomp.ok() && datafcomp > datacomp) { TEsercizi_contabili esc; @@ -1320,9 +1330,6 @@ void TAnal_mov::saldo_set_reset(const TRectype& row, bool reset) TToken_string giorni_annies; //lista dei giorni di saldo per annoes TEsercizi_contabili esc; - const TDate datacomp = get_date(MOVANA_DATACOMP); - const TDate datafcomp = get_date(MOVANA_DATAFCOMP); - TDate inizio_esc_iniziale, fine_esc_iniziale; esc.code2range(esc_iniziale, inizio_esc_iniziale, fine_esc_iniziale); giorni_annies.add(fine_esc_iniziale - datacomp + 1); //primo esercizio @@ -2088,3 +2095,60 @@ bool ca_extract_sheet_field(const TSheet_field& sheet, const int row, const int } return codice.full(); } + +/////////////////////////////////////////////////////////////////////////////////////// +//calcola la durata di una commessa e le sue date di inizio e fine +/////////////////////////////////////////////////////////////////////////////////////// +long ca_durata_commessa(const TRectype& rec_commesse, TDate& dataini, TDate& datafine) +{ + //date iniziale e finale commessa + dataini = rec_commesse.get_date(COMMESSE_DATAINIZIO); + datafine = rec_commesse.get_date(COMMESSE_DATAFINE); + + //per la data fine deve tener conto di eventuali proroghe.. + if (rec_commesse.get_bool(COMMESSE_PROROGA)) + { + const TDate datapror = rec_commesse.get_date(COMMESSE_DATAPROR); + if (datapror.ok()) + datafine = datapror; + } + + //se almeno una delle due date risultasse incompleta.. + if (!dataini.ok() || !datafine.ok()) + { + //prende l'anno + TEsercizi_contabili esc; + int anno = rec_commesse.get_int(COMMESSE_ANNO); + //se non trova un anno valido (non sono ammesse commesse prima del XX secolo!) + if (anno <= 1900) + { + //prova con dataini, se è buona... + if (dataini.ok()) + anno = esc.date2esc(dataini); + else + { + //allora prova con datafine, se è buona... + if (datafine.ok()) + anno = esc.date2esc(datafine); + else + anno = esc.first(); //se nessuna data è buona mette l'anno = al primo esercizio + } + } + + //se entrambe le date fossero vuote, visto che comunque adesso l'anno ce l'ha, le può ricavare.. + if (!dataini.ok() && !datafine.ok()) + esc.code2range(anno, dataini, datafine); + else //solo una data o nessuna data non buona + { + TDate dummy; + //dataini viene messa = ad inizio anno commessa + if (!dataini.ok()) + esc.code2range(anno, dataini, dummy); + //datafine viene messa = alla data di scadenza dell'ultimo esercizio valido + 1 anno (mantiene corrette le sezioni di stampa) + if (!datafine.ok()) + esc.code2range(esc.last() + 1, dummy, datafine); + } + + } //if (!dataini.ok() || !datafine.ok()) + return datafine - dataini + 1; +} \ No newline at end of file diff --git a/ca/calib01.h b/ca/calib01.h index e3236e69d..89c589fdc 100755 --- a/ca/calib01.h +++ b/ca/calib01.h @@ -227,4 +227,6 @@ void ca_copia_campo(const TRectype& src, const char* campo_src, TRectype& dst, c //metodo per ricavare la stringa dei codici dai campi dello sheet bool ca_extract_sheet_field(const TSheet_field& sheet, const int row, const int logicnum, TString& codice); +//metodo per ricavare la durata di una commessa +long ca_durata_commessa(const TRectype& rec_commesse, TDate& dataini, TDate& datafine); #endif