From ae6f8137004cb358629200e21e68e8f6b571a9e9 Mon Sep 17 00:00:00 2001 From: luca Date: Mon, 11 May 2009 13:54:00 +0000 Subject: [PATCH] Patch level :10.0 300 Files correlati : Ricompilazione Demo : [ ] Commento : prima stesura semifunzionante del bilancio di commessa con i movimenti oltre che i saldi git-svn-id: svn://10.65.10.50/trunk@18851 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- ca/ca0600a.uml | 1 + ca/ca3883.cpp | 88 +++++++++++++++++++++++++++++++++++--------------- ca/ca3883.h | 2 +- 3 files changed, 64 insertions(+), 27 deletions(-) diff --git a/ca/ca0600a.uml b/ca/ca0600a.uml index 8286eb83d..ee40740a1 100755 --- a/ca/ca0600a.uml +++ b/ca/ca0600a.uml @@ -212,6 +212,7 @@ DATE F_CMS_DATAINIZIO BEGIN PROMPT 2 4 "Data inizio " FIELD DATAINIZIO + CHECKTYPE REQUIRED END DATE F_CMS_DATAFINE diff --git a/ca/ca3883.cpp b/ca/ca3883.cpp index 76bd39f23..d034e2dbf 100755 --- a/ca/ca3883.cpp +++ b/ca/ca3883.cpp @@ -879,26 +879,57 @@ 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, const TDate& datafinesc, - TDate& dataini, TDate& datafine) const +long TPrint_saldana_recordset::durata_commessa(const TRectype& rec_commesse, TDate& dataini, TDate& datafine) const { - //data iniziale commessa - dataini = rec_commesse.get(COMMESSE_DATAINIZIO); + //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) && rec_commesse.get(COMMESSE_DATAPROR).ok()) - datafine = rec_commesse.get(COMMESSE_DATAPROR); - else - datafine = rec_commesse.get(COMMESSE_DATAFINE); - - //datafine.ok() va messo per gli utonti che mettono le commesse all'infinito senza specificare la datafine - //in questo modo la commessa e' come se terminasse l'anno dopo e viene stampata nella sezione 2 (vedi sotto) - if (!datafine.ok()) + if (rec_commesse.get_bool(COMMESSE_PROROGA)) { - datafine = datafinesc; - datafine.addyear(1); + 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.. + 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; } @@ -910,7 +941,7 @@ int TPrint_saldana_recordset::ricava_sezione_di_stampa(const TRectype& rec_comme //data iniziale commessa TDate dataini, datafine; - durata_commessa(rec_commesse, datafinesc, dataini, datafine); + 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: @@ -977,11 +1008,12 @@ TString TPrint_saldana_recordset::ricava_chiave_cdc_fase(const TString& codcms, const TDate TPrint_saldana_recordset::calcola_min_datacomp(const TDate& datainiesc, const TDate& datafinesc) const { TDate data_min_comp = datainiesc; - TISAM_recordset recset("USE COMMESSE"); //\nSELECT BETWEEN(DATAFINE,#DATAINIESC,0)||BETWEEN(DATAPROR,#DATAINIESC,0)||(DATAFINE='')"); + TISAM_recordset recset("USE COMMESSE"); + const TRectype& rec_commessa = recset.cursor()->curr(); for (bool ok = recset.move_first(); ok; ok = recset.move_next()) { TDate dataini, datafine; - durata_commessa(recset.cursor()->curr(), datafinesc, dataini, datafine); + durata_commessa(rec_commessa, dataini, datafine); if (datafine >= datainiesc && dataini < data_min_comp) data_min_comp = dataini; } @@ -1113,42 +1145,42 @@ void TPrint_saldana_recordset::parse_rmovana(TAssoc_array* cms, const TDate& dat //cerca tutte le rmovana che soddisfano gli innumerevoli parametri TString query; - query << "USE RMOVANA KEY 3\nJOIN MOVANA INTO NUMREG==NUMREG\n"; + query << "USE RMOVANA KEY 3\n"; switch (_tipostampa) { case 1: case 4: if (_fase.full()) - query << " SELECT CODFASE=\"" << _fase << "\"\n"; + query << "SELECT CODFASE=\"" << _fase << "\"\n"; break; case 2: case 8: if (_cdc.full()) - query << " SELECT CODCCOSTO=\"" << _cdc << "\"\n"; + query << "SELECT CODCCOSTO=\"" << _cdc << "\"\n"; break; case 3: if (_fase.full() || _cdc.full()) { if (_fase.full() && _cdc.full()) - query << " SELECT (CODFASE=\"" << _fase << "\")&&(CODCCOSTO=\"" << _cdc << "\")\n"; + query << "SELECT (CODFASE=\"" << _fase << "\")&&(CODCCOSTO=\"" << _cdc << "\")\n"; else { if (_fase.full()) - query << " SELECT CODFASE=\"" << _fase << "\"\n"; + query << "SELECT CODFASE=\"" << _fase << "\"\n"; else - query << " SELECT CODCCOSTO=\"" << _cdc << "\"\n"; + query << "SELECT CODCCOSTO=\"" << _cdc << "\"\n"; } } break; } - query << "FROM DATACOMP=#MINDATACOMP\nTO DATACOMP=#DATACALCOLO"; + query << "JOIN MOVANA INTO NUMREG==NUMREG\nFROM DATACOMP=#MINDATACOMP\nTO DATACOMP=#DATACALCOLO"; TISAM_recordset recset(query); recset.set_var("#DATACALCOLO", _datacalcolo); recset.set_var("#MINDATACOMP", min_datacomp); - const long recset_items = recset.items(); + const TRecnotype recset_items = recset.items(); //se ci sono movana che non expirano prima dell'inizio esercizio e la cui datacomp è anteriore a datacalcolo... if (recset_items > 0) { @@ -1193,8 +1225,12 @@ void TPrint_saldana_recordset::parse_rmovana(TAssoc_array* cms, const TDate& dat { //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, datafinesc, datainicms, datafcomp); + 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; + if (!datafcomp.ok()) + datafcomp = datacomp; //finalmente la tanto agognata vita della riga di movana! //si aggiunge 1 perchè se un movimento ha datacomp=datafcomp (come in generale accade) in realtà.. //..il poveretto vive un giorno, non 0 diff --git a/ca/ca3883.h b/ca/ca3883.h index 0fd2db393..8531ed3c3 100755 --- a/ca/ca3883.h +++ b/ca/ca3883.h @@ -101,7 +101,7 @@ protected: const TRectype& saldana, const bool inverti = false, const bool cms_detraz = false) const; real calcola_avanzamento_tempo() const; void create_lines_to_print(const TString& query); - long durata_commessa(const TRectype& rec_commesse, const TDate& datafinesc, TDate& dataini, TDate& datafine) 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;