diff --git a/ce/ce4400.cpp b/ce/ce4400.cpp index e172411cf..61790944b 100755 --- a/ce/ce4400.cpp +++ b/ce/ce4400.cpp @@ -67,7 +67,9 @@ class TRigamov : public TRectype public: virtual int compare(const TSortable& s) const; const TRectype& categoria() const; - TRigamov(const int grp, const TString& spc, const int cat) : TRectype(LF_RMOV) { _grp = grp; _spc = spc; _cat = cat;} + const TString& descr_categoria() const; + TRigamov(const int grp, const TString& spc, const int cat) + : TRectype(LF_RMOV) { _grp = grp; _spc = spc; _cat = cat; } }; @@ -76,6 +78,10 @@ const TRectype& TRigamov::categoria() const return ditta_cespiti().categoria(_grp, _spc, _cat, true); } +const TString& TRigamov::descr_categoria() const +{ + return ditta_cespiti().categoria(_grp, _spc, _cat, false).get("S0"); +} //confrontatore di saldi_per_codice int TRigamov::compare(const TSortable& s) const @@ -100,7 +106,7 @@ struct TSaldo_per_codice :public TSortable { TString4 _spc; int _grp, _cat; - TString80 _idcespite; + TString16 _idcespite; real _qnor, _qant, _qacc;//, _qperse; void add(const TRectype& rec_ammce); @@ -313,12 +319,12 @@ protected: virtual bool destroy(); void elabora(); - void genera_mov_per_cat(TArray& righe_mov, const TDate& datareg, const TDate& datacomp, - const TString& codcaus, const bool definitivo); - void genera_mov_per_ces(TArray& righe_mov, const TDate& datareg, const TDate& datacomp, - const TString& codcaus, const bool definitivo); + void genera_mov(TArray& righe_mov, const TDate& datareg, const TDate& datacomp, + const TString& codcaus, const int movdett, const bool definitivo, TLog_report& log); void delete_old_movs(const TDate& ini_es); long get_new_numreg() const; + void fill_head(TRectype& head, const TDate& datacomp, const TDate& datareg, + const long numreg, const TString& codcaus, const bool definitivo); public: @@ -357,16 +363,9 @@ long TTrasf_mov_ce_cg::get_new_numreg() const return mov.curr().get_long(MOV_NUMREG) + 1; } -//metodo per la generazione di movimenti con righe per categoria (chiamata se movdett=0) -void TTrasf_mov_ce_cg::genera_mov_per_cat(TArray& righe_mov, const TDate& datareg, const TDate& datacomp, - const TString& codcaus, const bool definitivo) +void TTrasf_mov_ce_cg::fill_head(TRectype& head, const TDate& datacomp, const TDate& datareg, + const long numreg, const TString& codcaus, const bool definitivo) { - //Riempie i campi della testata movimento - long numreg = get_new_numreg(); - - TMovimentoPN_CE pn; - TRectype& head = pn.curr(); - TEsercizi_contabili esc; const int codes = esc.date2esc(datacomp); head.put(MOV_ANNOES, codes); @@ -376,7 +375,20 @@ void TTrasf_mov_ce_cg::genera_mov_per_cat(TArray& righe_mov, const TDate& datare head.put(MOV_CODCAUS, codcaus); if (!definitivo) head.put(MOV_PROVVIS, 'C'); - head.put(MOV_DESCR, TR("Rilevazione quote ammortamento cespiti")); +} + +//metodo per la generazione di movimenti con righe per categoria (chiamata se movdett=0) +void TTrasf_mov_ce_cg::genera_mov(TArray& righe_mov, const TDate& datareg, const TDate& datacomp, const TString& codcaus, + const int movdett, const bool definitivo, TLog_report& log) +{ + //Riempie i campi della testata movimento + long numreg = get_new_numreg(); + + TMovimentoPN_CE pn; + TRectype& head = pn.curr(); + + fill_head(head, datacomp, datareg, numreg, codcaus, definitivo); + head.put(MOV_DESCR, TR("Rilevazione quote amm. cespiti per categoria")); //Procedura di inserimento delle righe del movimento TImporto fondo; @@ -393,7 +405,7 @@ void TTrasf_mov_ce_cg::genera_mov_per_cat(TArray& righe_mov, const TDate& datare //Controllo dell'eventuale cambio di categoria. Lo fa confrontando la riga iesima appena caricata con.. //..la riga i-1esima (la precedente,insomma) //Se la categoria e' cambiata... - if (i > 0 && rigamov.compare((const TRigamov&)righe_mov[i-1]) != 0) + if (i > 0 && (rigamov.compare((const TRigamov&)righe_mov[i-1]) != 0 || pn.cg_items() > 95)) { //crea una nuova riga per metterci il fondo;in questo momento la riga e' aggiunta ma va riempita!! TRectype& riga_fondo = pn.nuova_riga(); @@ -411,17 +423,34 @@ void TTrasf_mov_ce_cg::genera_mov_per_cat(TArray& righe_mov, const TDate& datare riga_fondo.put(RMV_GRUPPO, stringone.mid(12,3)); riga_fondo.put(RMV_CONTO, stringone.mid(15,3)); riga_fondo.put(RMV_SOTTOCONTO, stringone.mid(18,6)); + const TString& descat = prev_riga_mov.descr_categoria(); + riga_fondo.put(RMV_DESCR, descat); //se il movimento supera le 95 righe va salvato sul file MOV, poi distrutto per poter costruirne uno nuovo.. //..con le righe di righe_mov che sono rimaste - if (pn.cg_items() > 95 || i == righe_mov.last()) + if (pn.cg_items() > 95 || i == righe_mov.last() || movdett > 0) { - pn.write(); //scrive il movimento sul file - pn.destroy_rows(++numreg); //ne elimina le righe per poter ricominciare + if (movdett > 0) //se va per cespite la descrizione cambia per ogni movimento in base alla categoria + { + TString desc; + desc << TR("Quote amm. ") << descat; + desc.cut(50); + head.put(MOV_DESCR, desc); + } + + int err = pn.write(); //scrive il movimento sul file + if (err != NOERR) + { + TString msg; + msg << TR("Impossibile registrare il movimento ") << numreg << "\n"; + log.log(2, msg); + } + pn.destroy_rows(numreg); //ne elimina le righe per poter ricominciare + head.put(MOV_NUMREG, ++numreg); //nuova testata per nuovo movimento } //azzera il valore del fondo in modo da ricominciare a calcolarlo con la nuova categoria - fondo.set(' ',0.0); + fondo.reset(); } //if i>0&&rigamov.compare... //Se la categoria non e' cambiata crea normalmente la nuova riga @@ -433,11 +462,6 @@ void TTrasf_mov_ce_cg::genera_mov_per_cat(TArray& righe_mov, const TDate& datare } -//metodo per la generazione di movimenti con righe per cespite raggruppate e pareggiate per categoria (chiamata se movdett>0) -void TTrasf_mov_ce_cg::genera_mov_per_ces(TArray& righe_mov, const TDate& datareg, const TDate& datacomp, - const TString& codcaus, const bool definitivo) -{ -} //metodo per gestire la successione degli eventi ad alto livello void TTrasf_mov_ce_cg::elabora() @@ -478,7 +502,7 @@ void TTrasf_mov_ce_cg::elabora() //Codice causale da mettere nei movimenti generati const TString4 codcaus = config_ditta_ce.get("COAUQU"); - //Assoc_array Categoria-QammTot-QperseTot + //Assoc_array Categoria-QammTot TAssoc_array quote_per_codice; TProgind pi(nrec, TR("Ricalcolo ammortamenti in corso..."), true, true); @@ -528,7 +552,7 @@ void TTrasf_mov_ce_cg::elabora() saldi_ordinati.add(h->remove_obj()); //accoppa l'assoc quote_per_codice.destroy(); - //e ordina l'array (questo assurdo giro serve perche' l'assoc non e' ordinabile) + //e ordina l'array per categorie e cespite (questo assurdo giro serve perche' l'assoc non e' ordinabile) saldi_ordinati.sort(); //array con le righe movimento CG @@ -545,15 +569,9 @@ void TTrasf_mov_ce_cg::elabora() //a questo punto ha l'array con le righe movimento CG completo (righe_mov); da queste righe deve costruire.. //..uno o piu' movimenti di prima nota - - if (movdett == 0) - { - genera_mov_per_cat(righe_mov, datareg, datacomp, codcaus, definitivo); - } - else - { - genera_mov_per_ces(righe_mov, datareg, datacomp, codcaus, definitivo); - } + //In base al movdett li creera' con righe per categoria o per cespite ma con fondi per categoria + //E' un metodo semimagico + genera_mov(righe_mov, datareg, datacomp, codcaus, movdett, definitivo, cont_cesp_log); //stampa il log degli errori