From 77a9cb0b47e97e190124a4f3ef2ce342f5e18de6 Mon Sep 17 00:00:00 2001 From: luca Date: Wed, 27 Jan 2010 15:10:52 +0000 Subject: [PATCH] Patch level : Files correlati : Ricompilazione Demo : [ ] Commento : git-svn-id: svn://10.65.10.50/trunk@19996 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- ca/ca3700.cpp | 292 ++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 222 insertions(+), 70 deletions(-) diff --git a/ca/ca3700.cpp b/ca/ca3700.cpp index 539076a86..ec99bc70b 100755 --- a/ca/ca3700.cpp +++ b/ca/ca3700.cpp @@ -158,7 +158,7 @@ bool TPrint_rendiconto_ca_mask::on_field_event(TOperable_field& o, TField_event TPrint_rendiconto_ca_mask::TPrint_rendiconto_ca_mask() - :TAnal_report_mask("ca3700") + :TAnal_report_mask("ca3700") { TConfig& cfg = ca_config(); const bool use_pdcc = cfg.get_bool("UsePdcc"); @@ -323,6 +323,7 @@ class TPrint_rendiconto_ca_recordset : public TISAM_recordset bool _implode_rows; TString _prefix; TAssoc_array _ratrisc; + TString_array _num_fdr; TRiclass _ricl; protected: @@ -338,12 +339,19 @@ protected: bool valid_record(const TRelation& rel) const; virtual void set_custom_filter(TCursor& cur) const; + void calcola_date_da_maschera(const TMask& msk, TDate& dal, TDate& al); + int crea_filtro_rmovana_antica(const TMask& msk, TRectype& da_rmovana, TRectype& a_rmovana, TString& filtro); + int crea_filtro_rmovana_moderna(const TMask& msk, TRectype& da_rmovana, TRectype& a_rmovana, TString& filtro); void crea_righe_da_rmovana(TLocalisamfile& tmp, const TPrint_rendiconto_ca_mask& msk, TLog_report& log); + int crea_filtro_rdoc_antica(const TMask& msk, TRectype& da_rdoc, TRectype& a_rdoc, TString& filtro_date); + int crea_filtro_rdoc_moderna(const TMask& msk, TRectype& da_rdoc, TRectype& a_rdoc, TString& filtro_date); void crea_righe_da_rdoc(TLocalisamfile& tmp, const TPrint_rendiconto_ca_mask& msk, TLog_report& log); + void crea_trr(const TFilename& trr) const; void scrive_riga(TLocalisamfile& tmp, const TRectype& rmovana, const TRectype& movana, const TDocumento* doc, TLog_report& log); void scrive_riga_speciale(TLocalisamfile& tmp, const TDocumento* doc, const TString_array& special_docs); + int sort_indbil(int indbil) const; const TString& riclassifica(const TBill& zio, TRectype& tmpcurr) const; const TString& riclassifica(const TString& contone, TRectype& tmpcurr) const; @@ -378,6 +386,15 @@ TPrint_rendiconto_ca_recordset::TPrint_rendiconto_ca_recordset(const TString& sq break; _ratrisc.add(codcaus, codcaus); } + + //TString_array contenente le numerazioni delle fatture da ricevere + for (int j = 0;;j++) + { + const TString& codfdr = config.get("NF", NULL, j); //scansione delle righe NF(i)=.. sul paragrafo di configurazione CA + if (codfdr.blank()) + break; + _num_fdr.add(codfdr); + } } @@ -1227,28 +1244,31 @@ void TPrint_rendiconto_ca_recordset::scrive_riga_speciale(TLocalisamfile& tmp, c } // for (inti=1;i<=rows... } - -//scanning delle righe dei movimenti di analitica -void TPrint_rendiconto_ca_recordset::crea_righe_da_rmovana(TLocalisamfile& tmp, const TPrint_rendiconto_ca_mask& msk, - TLog_report& log) +void TPrint_rendiconto_ca_recordset::calcola_date_da_maschera(const TMask& msk, TDate& dal, TDate& al) { - TRelation rel_rmovana(LF_RMOVANA); - rel_rmovana.add(LF_MOVANA, "NUMREG==NUMREG"); //aggiunge le testate x avere tipi mov e descr + //se siamo fortunati l'anno si può trovare così.. + int anno = msk.get_int(F_ANNO); + if (anno > 0) + { + TEsercizi_contabili esc; + esc.code2range(anno, dal, al); + } + if (_dadata.ok()) + dal = _dadata; + if (_adata.ok()) + al = _adata; +} - //..crea un cursore su rmovana per vedere se i conti selezionati hanno veri movimenti che soddisfano - //i parametri del filtro sulla maschera. ACHTUNG! Questo filtro ha senso solo se non esiste la - //riclassificazione!!! - TRectype da_rmovana(LF_RMOVANA); - TRectype a_rmovana(LF_RMOVANA); - if (!_riclassificato) +//vecchio modo di stabilire il filtro ed i darec arec, quando non esistevano chiavi su codcms e codcdc su lf_rmovana +int TPrint_rendiconto_ca_recordset::crea_filtro_rmovana_antica(const TMask& msk, TRectype& da_rmovana, TRectype& a_rmovana, TString& filtro) +{ + int cur_key = 2; + if (!_riclassificato) { - da_rmovana.put(RMOVANA_CODCONTO, _daconto); + da_rmovana.put(RMOVANA_CODCONTO, _daconto); a_rmovana.put(RMOVANA_CODCONTO, _aconto); } - - TString filtro; TDate dal, al; - //se siamo fortunati l'anno si può trovare così.. int anno = msk.get_int(F_ANNO); if (anno > 0) @@ -1266,9 +1286,19 @@ void TPrint_rendiconto_ca_recordset::crea_righe_da_rmovana(TLocalisamfile& tmp, else al = TDate(); - - filtro << "BETWEEN(DATACOMP," << dal.date2ansi() << ',' << al.date2ansi() << ')'; - + //gestione della chiave di ricerca: se specificata almeno _dadata usa la chiave 3 per DATACOMP,.. + //..nell'altro caso usa la chiave 2 per CODCONTO + if (dal.ok()) + { + cur_key = 3; + da_rmovana.put(RMOVANA_DATACOMP, dal); + if (al.ok()) + a_rmovana.put(RMOVANA_DATACOMP, al); + if (!_riclassificato) + filtro << "BETWEEN(CODCONTO,\"" << _daconto << "\",\"" << _aconto << "\")"; + } + else + filtro << "BETWEEN(DATACOMP," << dal.date2ansi() << ',' << al.date2ansi() << ')'; if (_codcosto.not_empty()) { @@ -1289,7 +1319,70 @@ void TPrint_rendiconto_ca_recordset::crea_righe_da_rmovana(TLocalisamfile& tmp, filtro << "(" << RMOVANA_CODFASE << "==\"" << _codfas << "\")"; } - TCursor cur_rmovana(&rel_rmovana, filtro, 2, &da_rmovana, &a_rmovana); + return cur_key; +} + +//nuovo modo di costruire il filtro e darec arec, da quando esistono le chiavi per codcm e codcdc su lf_rmovana +int TPrint_rendiconto_ca_recordset::crea_filtro_rmovana_moderna(const TMask& msk, TRectype& da_rmovana, TRectype& a_rmovana, TString& filtro) +{ + int cur_key = 4; + //intanto sistema darec arec + da_rmovana.put(RMOVANA_CODCMS, _codcms); + da_rmovana.put(RMOVANA_CODCCOSTO, _codcosto); + a_rmovana = da_rmovana; + + const TString& first_lev = ca_config().get("Level", "ca", 1); + //se il primo livello è cdc deve cambiare la chiave.. + if (first_lev == "CDC") + cur_key = 5; + + //adesso tocca al filtro + //conti + if (!_riclassificato) + filtro << "BETWEEN(CODCONTO,\"" << _daconto << "\",\"" << _aconto << "\")"; + + //date + if (!_vitaintera) + { + TDate dal, al; + calcola_date_da_maschera(msk, dal, al); + + if (filtro.not_empty()) + filtro << "&&"; + filtro << "(BETWEEN(DATACOMP," << dal.date2ansi() << ',' << al.date2ansi() << "))"; + } + + //fase + if (_codfas.not_empty()) + { + if (filtro.not_empty()) + filtro << "&&"; + filtro << "(" << RMOVANA_CODFASE << "==\"" << _codfas << "\")"; + } + + return cur_key; +} + +//scanning delle righe dei movimenti di analitica +void TPrint_rendiconto_ca_recordset::crea_righe_da_rmovana(TLocalisamfile& tmp, const TPrint_rendiconto_ca_mask& msk, + TLog_report& log) +{ + TRelation rel_rmovana(LF_RMOVANA); + rel_rmovana.add(LF_MOVANA, "NUMREG==NUMREG"); //aggiunge le testate x avere tipi mov e descr + + //..crea un cursore su rmovana per vedere se i conti selezionati hanno veri movimenti che soddisfano + //i parametri del filtro sulla maschera. ACHTUNG! Questo filtro ha senso solo se non esiste la + //riclassificazione!!! + TRectype da_rmovana(LF_RMOVANA); + TRectype a_rmovana(LF_RMOVANA); + TString filtro; + + //antico metodo di filtraggio (chiave 2 o 3) + //int cur_key = crea_filtro_rmovana_antica(msk, da_rmovana, a_rmovana, filtro); + //nuovo metodo di filtraggio (chiave 4 o 5) + int cur_key = crea_filtro_rmovana_moderna(msk, da_rmovana, a_rmovana, filtro); + + TCursor cur_rmovana(&rel_rmovana, filtro, cur_key, &da_rmovana, &a_rmovana); const TRecnotype rmovana_items = cur_rmovana.items(); //scorre le righe movimenti di analitica che soddisfano il filtro //il join a movana serve nel caso necessitino dati di testata per la riga in questione @@ -1356,33 +1449,26 @@ void TPrint_rendiconto_ca_recordset::crea_righe_da_rmovana(TLocalisamfile& tmp, } } -//scanning delle righe dei documenti -void TPrint_rendiconto_ca_recordset::crea_righe_da_rdoc(TLocalisamfile& tmp, const TPrint_rendiconto_ca_mask& msk, - TLog_report& log) -{ - TRelation rel_rdoc(LF_RIGHEDOC); - rel_rdoc.add(LF_DOC, "CODNUM==CODNUM|ANNO==ANNO|PROVV==PROVV|NDOC==NDOC"); //aggiunge le testate - - TRectype dardoc(LF_RIGHEDOC); - TRectype ardoc(LF_RIGHEDOC); - TString filtro_date; - dardoc.put(RDOC_PROVV, 'D'); - ardoc.put(RDOC_PROVV, 'D'); +int TPrint_rendiconto_ca_recordset::crea_filtro_rdoc_antica(const TMask& msk, TRectype& da_rdoc, TRectype& a_rdoc, TString& filtro_date) +{ + int curr_key = 3; + //intanto darec arec + da_rdoc.put(RDOC_PROVV, 'D'); + a_rdoc.put(RDOC_PROVV, 'D'); TDate dal, al; - //se siamo fortunati l'anno si può trovare così.. int anno = msk.get_int(F_ANNO); if (anno > 0) { - dardoc.put(RDOC_ANNO, anno); - ardoc.put(RDOC_ANNO, anno); + da_rdoc.put(RDOC_ANNO, anno); + a_rdoc.put(RDOC_ANNO, anno); } else { - dardoc.put(RDOC_ANNO, _dadata.year()); - ardoc.put(RDOC_ANNO, _adata.year()); + da_rdoc.put(RDOC_ANNO, _dadata.year()); + a_rdoc.put(RDOC_ANNO, _adata.year()); if (_dadata.year() == _adata.year()) anno = _dadata.year(); } @@ -1402,32 +1488,67 @@ void TPrint_rendiconto_ca_recordset::crea_righe_da_rdoc(TLocalisamfile& tmp, con else al = TDate(); - filtro_date << "BETWEEN(33->DATADOC," << dal.date2ansi() << ',' << al.date2ansi() << ')'; + + return curr_key; +} + +//fatta su chiave 6 e 7 di lf_rdoc; non controlla le date, ammettendo movimenti non rientranti nell'intervallo di.. +//..date scelto dalla maschera, purchè tali movimenti appartengano a commessa/cdc in esame +int TPrint_rendiconto_ca_recordset::crea_filtro_rdoc_moderna(const TMask& msk, TRectype& da_rdoc, TRectype& a_rdoc, TString& filtro_date) +{ + int cur_key = 6; + //intanto sistema darec arec + da_rdoc.put(RDOC_CODCMS, _codcms); + da_rdoc.put(RDOC_CODCOSTO, _codcosto); + a_rdoc = da_rdoc; + + //gestione chiave di scansione + const TString& first_lev = ca_config().get("Level", "ca", 1); + //se il primo livello è cdc.. + if (first_lev == "CDC") + cur_key = 7; + + //filtro date + if (!_vitaintera) + { + TDate dal, al; + calcola_date_da_maschera(msk, dal, al); + + if (filtro_date.not_empty()) + filtro_date << "&&"; + filtro_date << "(BETWEEN(33->DATADOC," << dal.date2ansi() << ',' << al.date2ansi() << "))"; + } + return cur_key; +} + +//scanning delle righe dei documenti +void TPrint_rendiconto_ca_recordset::crea_righe_da_rdoc(TLocalisamfile& tmp, const TPrint_rendiconto_ca_mask& msk, + TLog_report& log) +{ + TRelation rel_rdoc(LF_RIGHEDOC); + rel_rdoc.add(LF_DOC, "CODNUM==CODNUM|ANNO==ANNO|PROVV==PROVV|NDOC==NDOC"); //aggiunge le testate + TRectype da_rdoc(LF_RIGHEDOC); + TRectype a_rdoc(LF_RIGHEDOC); + TString filtro_date; + + //metodo antico + //const int cur_key = crea_filtro_rdoc_antica(msk, da_rdoc, a_rdoc, filtro_date); + //metodo moderno + const int cur_key = crea_filtro_rdoc_moderna(msk, da_rdoc, a_rdoc, filtro_date); TContabilizzazione_analitica cont_anal; //oggetto necessario per contabilizzare il documento in osservazione //inizialmente il filtro di scansione delle righedoc coincide con quello sulle date TString filtro = filtro_date; - //Controlla sul file di configurazione di CA (ditta.ini,[ca]) se esistono numerazioni relative - //..alle fatture da ricevere che devono essere trattate in modo particolare - TConfig& config = ca_config(); - //TString_array contenente le numerazioni delle fatture da ricevere - TString_array num_fdr; - for (int j = 0;;j++) - { - const TString& codfdr = config.get("NF", NULL, j); //scansione delle righe NF(i)=.. sul paragrafo di configurazione CA - if (codfdr.blank()) - break; - num_fdr.add(codfdr); - } //Filtro sulle righe documento (e testate collegate) //Controlla sul file di configurazione di CA (ditta.ini,[ca]) se esistono numerazioni da escludere.. //..e se, per alcune numerazioni, deve tener conto dello stato del documento bool update = false; + TConfig& config = ca_config(); for (int i = 0;;i++) //scansione delle righe ND(i)=.. sul paragrafo di configurazione CA { TToken_string num_doc(config.get("ND", NULL, i)); @@ -1453,19 +1574,22 @@ void TPrint_rendiconto_ca_recordset::crea_righe_da_rdoc(TLocalisamfile& tmp, con } //poi deve aggiungere il filtro per cdc/cms/fas - if (_codcosto.not_empty()) - { - if (filtro.not_empty()) - filtro << "&&"; - filtro << "(" << RDOC_CODCOSTO << "==\"" << _codcosto << "\")"; - } - if (_codcms.not_empty()) - { - if (filtro.not_empty()) - filtro << "&&"; - filtro << "(" << RDOC_CODCMS << "==\"" << _codcms << "\")"; - } - if (_codfas.not_empty()) + if (cur_key == 3) //questo solo se si usa la chiave 3 (metodo restrittivo antico) + { + if (_codcosto.not_empty()) + { + if (filtro.not_empty()) + filtro << "&&"; + filtro << "(" << RDOC_CODCOSTO << "==\"" << _codcosto << "\")"; + } + if (_codcms.not_empty()) + { + if (filtro.not_empty()) + filtro << "&&"; + filtro << "(" << RDOC_CODCMS << "==\"" << _codcms << "\")"; + } + } + if (_codfas.not_empty()) //questo in ogni modo, anche con chiave 6 o 7 (oltre che 3) { if (filtro.not_empty()) filtro << "&&"; @@ -1473,7 +1597,7 @@ void TPrint_rendiconto_ca_recordset::crea_righe_da_rdoc(TLocalisamfile& tmp, con } //il filtro è completo;può eseguire la scansione - TCursor cur_rdoc(&rel_rdoc, "", 3, &dardoc, &ardoc); + TCursor cur_rdoc(&rel_rdoc, "", cur_key, &da_rdoc, &a_rdoc); cur_rdoc.setfilter(filtro, update); const TRecnotype rdoc_items = cur_rdoc.items(); @@ -1507,7 +1631,7 @@ void TPrint_rendiconto_ca_recordset::crea_righe_da_rdoc(TLocalisamfile& tmp, con //..importo verra' poi messo nel fatturato. const TRectype& curr_rdoc = cur_rdoc.curr(); const TString& rdoc_dacodnum = curr_rdoc.get(RDOC_DACODNUM); - const bool is_special_doc = num_fdr.find(rdoc_dacodnum) > 0; + const bool is_special_doc = _num_fdr.find(rdoc_dacodnum) > 0; //documento non contabilizzato o fattura da ricevere con numerazione configurata speciale if (numregca == 0 || is_special_doc) { @@ -1551,7 +1675,7 @@ void TPrint_rendiconto_ca_recordset::crea_righe_da_rdoc(TLocalisamfile& tmp, con else { //righe di documento configurate come da emettere/ricevere (documenti speciali) - scrive_riga_speciale(tmp, &doc, num_fdr); + scrive_riga_speciale(tmp, &doc, _num_fdr); } } //if (numregca==0... @@ -2060,17 +2184,45 @@ void TPrint_rendiconto_ca::main_loop() { TToken_string& row = sheet.row(-1); //crea la prima riga dello sheet + //si amplia il range di ricerca temporale di 1 anno nel passato perchè i movana.. + //..preventivi possono essere stati decisi prima dell'inizio effettivo commessa + TDate dataini, datafin; + const int anno = mask.get_int(F_ANNO); + if (anno > 0) //se non è stata specificata alcuna dataini, ma è stato specificato un anno di esercizio... + { + TEsercizi_contabili esc; + esc.code2range(anno, dataini, datafin); + } + if (!mask.field(F_DATAINI).empty()) + dataini = mask.get_date(F_DATAINI); + if (!mask.field(F_DATAFIN).empty()) + datafin = mask.get_date(F_DATAFIN); + const TMultilevel_code_info& liv1 = get_first_level(); //stabilisce quale è il primo livello (tra CDC e CMS).. - TISAM_recordset set(liv1.logic() == LF_CDC ? "USE CDC" : "USE COMMESSE"); //..e di conseguenza scrive la use giusta + const bool is_cms = liv1.logic() == LF_COMMESSE; + TISAM_recordset set(is_cms ? "USE COMMESSE" : "USE CDC"); //..e di conseguenza scrive la use giusta TProgind pi(set.items(), video_string, true, true); for (int i = 0; set.move_to(i); i++) //fighissimo metodo per scandire un file in 1 riga! { - pi.addstatus(1); - if (pi.iscancelled()) + if (!pi.addstatus(1)) break; + + //Filtro sulle date + //DATE VALIDE STRETTAMENTE PER COMMESSE + //per prima cosa controlla se veramente la commessa rientri nei parametri temporali impostati sulla maschera + //Se infatti è completamente al di fuori di tale intervallo, che cavolo la controlla a fare row = set.get((unsigned int)0).as_string(); //prende il valore del primo campo del file (CDC o CMS code) + if (is_cms && (dataini.ok() || datafin.ok())) + { + const TRectype& rec_commesse = set.cursor()->curr(); + TDate datainicms, datafcomp; + ca_durata_commessa(rec_commesse, datainicms, datafcomp); + if ((dataini.ok() && datafcomp < dataini) || (datafin.ok() && datainicms > datafin)) + continue; + } + video_string = TR("Scansione"); video_string << " " << row; //completa la stringa da visualizzare sulla progind pi.set_text(video_string);