diff --git a/cg/cg1100.cpp b/cg/cg1100.cpp index f365b2ea1..4c28b649a 100755 --- a/cg/cg1100.cpp +++ b/cg/cg1100.cpp @@ -1,1202 +1,1462 @@ -// cg1100.cpp -// Stampa piano dei conti - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "cg1.h" -#include "cg1100.h" - -const char * TAB_ANABIL = "%IVD"; -const char * TAB_IVD = "%IVD"; - -const int CODTABLEN = 15; - -enum stampe { - completa=1, - con_IV_direttiva, - senza_IV_direttiva, - completa_bil, - con_ana_bil, - senza_ana_bil - }; - -class CG1100_application : public TPrintapp -{ - struct bil_ivd - { - char sez; - char let; - char numr[5]; - char num[4]; - char gruppo[4]; - char conto[4]; - char sottoc[8]; - char descr[52]; - char sez_opp; - char let_opp; - char numr_opp[5]; - int num_opp; - }; - - bil_ivd* _bil; - TTable* _tab; // tabella codici IV direttiva - TRectype* _rec; - TSort* _sort; - TRelation* _rel; - TMask* _msk; - TParagraph_string _d1, _d2; // qui - const char* _buf; - stampe _tipo_stampa; - bool _salto_pag,_resetta_righe_stampa; - int _old_gruppo; - int _pcont_reclen,_i; - int _cur_c1, _cur_c2; - TString _clivd, _clivdo; - char _sez_da_stamp,_sez_stamp,_let_da_stamp,_let_stamp; - TString _numr_da_stamp,_numr_stamp; - int _gruppo,_conto,_num_da_stamp,_num_stamp,_g_prec,_c_prec; - long _sottoc,_s_prec; - TString _classe_da_stampare,_classe_stampata; - bool _conto_classificato,_sottoc_classificato,_stampa_riga_vuota; - bool _prima_volta; - TDate _data_stampa; - -public: - - virtual bool user_destroy() ; - virtual bool user_create() ; - - virtual void set_page (int,int); - virtual bool preprocess_print (int,int); - virtual bool preprocess_page (int,int); - virtual print_action postprocess_page (int,int); - virtual void postclose_print (); - - virtual bool set_print(int); - - void intesta (stampe); - - - bool elabora_riga(); // decide se fare salto pagina o no - void do_sort(); - void set_completa (); - void set_con_IV (); - void set_senza_IV (); - void set_con_ana (); - void set_senza_ana (); - void init_sort(); - const char* descrizione_numero(char, char, int, int); - // void setta_righe_descr(TParagraph_string*); - int leggo_sottoc(int,int,long); - void riempi_record(char,char,const TString&,int,int,int,long,const TString&,char,char,const TString&,int); - void set_bil_key(bil_ivd* b, char sezione, char lettera, - const char* numero_romano, int numero, - int gruppo = 0, int conto = 0, long sottoconto = 0L); - void set_bil_val(bil_ivd* b, const char* descr,char sez_opp,char let_opp, - const char* numr_opp,int num_opp); - - void process_link(int id, const char* txt); - - CG1100_application() : _clivd(8), _clivdo(8), _d1("", 30), _d2("", 40) {} -}; - -void CG1100_application::process_link(int id, const char* txt) -{ - TString ss = "1|"; ss << txt; - TMessage fs(cmd2name("cg0","-0"), MSG_LN, ss); - TMailbox m; - m.send(fs); - TExternal_app cg0("cg0 -0"); - if (cg0.run()) beep(); -} - -void CG1100_application::init_sort() -{ - switch (_tipo_stampa) - { - case con_IV_direttiva: - _sort->reset(sizeof(bil_ivd)); - - _sort -> addsortkey ((char*)&(_bil->sez) - (char*)&(_bil->sez),1); - _sort -> addsortkey ((char*)&(_bil->let) - (char*)&(_bil->sez),1); - _sort -> addsortkey ((char*)&(_bil->numr) - (char*)&(_bil->sez),4); - _sort -> addsortkey ((char*)&(_bil->num) - (char*)&(_bil->sez),2); - _sort -> addsortkey ((char*)&(_bil->gruppo) - (char*)&(_bil->sez),3); - _sort -> addsortkey ((char*)&(_bil->conto) - (char*)&(_bil->sez),3); - _sort -> addsortkey ((char*)&(_bil->sottoc) - (char*)&(_bil->sez),6); - break; - case con_ana_bil: - { - TRecfield codcbl (*_rec, PCN_CODCBL); - - _sort->reset(_rec->len()); - _sort->addsortkey (codcbl); - break; - } - default: - break; - } -} - -void CG1100_application::set_bil_key(bil_ivd* b, char sezione, char lettera, - const char* numero_romano, int numero, - int gruppo, int conto,long sottoconto) -{ - b->sez = sezione; - b->let = lettera; - strcpy(b->numr, numero_romano); - sprintf(b->num , "%2d", numero); - sprintf(b->gruppo , "%3d", gruppo); - sprintf(b->conto , "%3d", conto); - sprintf(b->sottoc , "%6ld", sottoconto); -} - -void CG1100_application::set_bil_val(bil_ivd* b, const char* descr, - char sez_opp,char let_opp, - const char* numr_opp,int num_opp) -{ - strcpy(b->descr, descr); - b->sez_opp = sez_opp; - b->let_opp = let_opp; - strcpy(b->numr_opp, numr_opp); - b->num_opp = num_opp; -} - -void CG1100_application::riempi_record(char sez,char let,const TString& numr, - int numero,int g,int c,long s, - const TString& descr,char sez_opp, - char let_opp,const TString& numr_opp, - int num_opp) -{ - set_bil_key(_bil, sez, let, numr, numero, g, c, s); - set_bil_val(_bil, descr, sez_opp, let_opp, numr_opp, num_opp); - _sort->sort ((const char*) _bil); -} - -void CG1100_application::postclose_print() -{ - // if (_tipo_stampa == con_IV_direttiva) - // delete _sort; -} - -print_action CG1100_application::postprocess_page(int file,int counter) -{ - switch (_tipo_stampa) - { - case completa: - case senza_IV_direttiva: - case senza_ana_bil: - break; - case con_IV_direttiva: - case con_ana_bil: - { - //const char * buf; - struct bil_ivd* bil = (struct bil_ivd*) _buf; - /* - if (_sez_da_stamp != _sez_stamp) - { - if (_sez_da_stamp == '5' || _sez_da_stamp == '9') - { - reset_print(); - _i = 1; - set_con_IV(); - _resetta_righe_stampa = FALSE; - } - else - _resetta_righe_stampa = TRUE; - } - else - _resetta_righe_stampa = TRUE; - */ - _sez_stamp = _sez_da_stamp; - _let_stamp = _let_da_stamp; - _numr_stamp = _numr_da_stamp; - _num_stamp = _num_da_stamp; - _classe_stampata.format("%c%c%s%2d",_sez_stamp,_let_stamp,(const char*)_numr_stamp,_num_stamp); - - - - if ( (_buf = _sort->retrieve()) != NULL) - { - bil = (struct bil_ivd*) _buf; - _sez_da_stamp = bil->sez; - _let_da_stamp = bil->let; - _numr_da_stamp = bil->numr; - _numr_da_stamp.ltrim(); - _num_da_stamp = atoi(bil->num); - _gruppo = atoi(bil->gruppo); - _conto = atoi(bil->conto); - _sottoc = atol(bil->sottoc); - _classe_da_stampare.format("%c%c%s%2d",_sez_da_stamp,_let_da_stamp,(const char*)_numr_da_stamp,_num_da_stamp); - - //set_auto_ff(FALSE); - - return REPEAT_PAGE; - } - break; - } - default: - break; - - } - return NEXT_PAGE; -} - -void CG1100_application::set_page(int file,int counter) -{ - //const char* buf; - - intesta (_tipo_stampa); - switch (_tipo_stampa) - { - case con_IV_direttiva: - { - // if (_resetta_righe_stampa) - // { - reset_print(); - _i = 1; - // } - - if (_sez_da_stamp != _sez_stamp) - // { - // if (_sez_da_stamp=='1' || _sez_da_stamp=='2') - set_con_IV (); - // if (_sez_da_stamp == '5' || _sez_da_stamp == '9') - // { - // set_row (_i,"%s",""); - // set_auto_ff(TRUE); - // } - // } - else - if (_buf != NULL) - set_con_IV(); - } - break; - case con_ana_bil: - set_con_ana(); - break; - case senza_IV_direttiva: - set_senza_IV(); - break; - case senza_ana_bil: - set_senza_ana(); - break; -default: - break; -} -} - -////////////////////////////////////////////////////////////// -// Crea sort se necessario e seleziona il cursore opportuno -////////////////////////////////////////////////////////////// -void CG1100_application::do_sort() -{ - switch (_tipo_stampa) - { - case completa: - case senza_IV_direttiva: - case senza_ana_bil: - break; - case con_IV_direttiva: - { - char sez_conto,let_conto; - TString numr_conto; - int num_conto; - bool classe_conto = FALSE; - - _sort->init(); - select_cursor (_cur_c1); - - TCursor * cursor = current_cursor(); - TRectype & rec = cursor->curr(); - - long last = cursor->items(); - - for ( *cursor = 0; cursor->pos() < last; ++(*cursor) ) - { - int g = rec.get_int(PCN_GRUPPO); - int c = rec.get_int(PCN_CONTO); - long s = rec.get_int(PCN_SOTTOCONTO); - - if (g != 0 && c == 0 && s == 0) continue; - - char sez = rec.get_char(PCN_SEZIVD); - char let = rec.get_char(PCN_LETTIVD); - TString numr = rec.get (PCN_NUMRIVD); - int num = rec.get_int (PCN_NUMIVD); - TString descr = rec.get (PCN_DESCR); - char sez_opp = rec.get_char(PCN_SEZIVDOPP); - char let_opp = rec.get_char(PCN_LETTIVDOPP); - TString numr_opp = rec.get (PCN_NUMRIVDOPP); - int num_opp = rec.get_int (PCN_NUMIVDOPP); - - if ((g != 0) && (c != 0) && (s == 0)) - { - if (sez != '\0' && sez != '0') - { - sez_conto = sez; - - if (let != '\0') - let_conto = let; - else - if ((sez == '1')||(sez == '2')) - let_conto = 'Z'; - else - let_conto = let; - - numr_conto = numr; - num_conto = num; - classe_conto = TRUE; - riempi_record(sez_conto,let_conto,numr_conto,num_conto,g,c,s,descr,sez_opp,let_opp,numr_opp,num_opp); - } - else - classe_conto = FALSE; - } - - if ((g != 0) && (c != 0) && (s != 0)) - { - if (classe_conto) - riempi_record(sez_conto,let_conto,numr_conto,num_conto,g,c,s,descr,sez_opp,let_opp,numr_opp,num_opp); - else - { - if (sez != '\0' && sez != '0') - { - if (let == '\0') - if ((sez == '1')||(sez == '2')) - let = 'Z'; - - riempi_record(sez,let,numr,num,g,c,s,descr,sez_opp,let_opp,numr_opp,num_opp); - } - } - } - } - - _sort->endsort(); - // delete _bil; - select_cursor (_cur_c2); - - break; - } - - case con_ana_bil: - { - _sort->init(); - - select_cursor (_cur_c1); - - TCursor * cursor = current_cursor(); - TRectype & rec = cursor->curr(); - - long last = cursor->items(); - TString c1(12); - - for ( *cursor = 0; cursor->pos() < last; ++(*cursor) ) - { - if (rec.get(PCN_CONTO).not_empty() && rec.get(PCN_SOTTOCONTO).empty()) - c1 = rec.get(PCN_CODCBL); - else - if (rec.get(PCN_SOTTOCONTO).not_empty() && rec.get(PCN_CODCBL).empty()) - rec.put(PCN_CODCBL, c1); - if (rec.get(PCN_CODCBL).not_empty() ) - _sort->sort (rec.string()); - } - - _sort->endsort(); - select_cursor (_cur_c2); - break; - } - default: - break; - } -} - -bool CG1100_application::preprocess_print (int file,int counter) -{ - do_sort(); - switch (_tipo_stampa) - { - case con_IV_direttiva: - case con_ana_bil: - { - struct bil_ivd* bil = (struct bil_ivd*) _buf; - - if ((_buf = _sort->retrieve()) != NULL) - { - bil = (struct bil_ivd*) _buf; - _sez_da_stamp = bil->sez; - _let_da_stamp = bil->let; - _numr_da_stamp = bil->numr; - _numr_da_stamp.ltrim(); - _num_da_stamp = atoi(bil->num); - _gruppo = atoi(bil->gruppo); - _conto = atoi(bil->conto); - _sottoc = atol(bil->sottoc); - _classe_da_stampare.format("%c%c%s%2d",_sez_da_stamp,_let_da_stamp,(const char*)_numr_da_stamp,_num_da_stamp); - - return TRUE; - } - else - return FALSE; - } - break; -default: - break; -} - return TRUE; -} - -void CG1100_application::set_con_IV() -{ - struct bil_ivd* bil = (struct bil_ivd*) _buf; - - TString descrizione,descr; - char sez_opp,let_opp; - int num_opp,numr_opp; - bool stampa_classe = TRUE; - int numr = atoi(_numr_da_stamp); - TString numrom = itor(numr); - - sez_opp = bil->sez_opp; - let_opp = bil->let_opp; - numr_opp = atoi(bil->numr_opp); - TString numrom_opp = itor(numr_opp); - num_opp = bil->num_opp; - - descrizione = descrizione_numero(_sez_da_stamp,_let_da_stamp,numr,_num_da_stamp); - descr = bil->descr; - - //Se la classe prelevata dal record corrente del sort e' diversa dalla classe - //prelevata dal record precedente, allora stampo la nuova classe con i relativi - //sottoconti. In caso contrario continuo a stampare solo i sottoconti. - - if (_classe_da_stampare != _classe_stampata) - { - if (_sez_da_stamp != _sez_stamp) - { - if ((_sez_da_stamp == '1')&&(_let_da_stamp == 'Z')) - { - char app = ' '; - set_row (_i++,"@0g%c", app); - set_row (_i++,"@0gCONTI D' ORDINE ATTIVI"); - set_row (_i++,"@0g%c", app); - stampa_classe = FALSE; - } - else - if ((_sez_da_stamp == '1')&&(_let_da_stamp != 'Z')) - { - char app = ' '; - set_row (_i++,"@0g%c", app); - set_row (_i++,"@0gATTIVO"); - set_row (_i++,"@0g%c", app); - } - - if ((_sez_da_stamp == '2')&&(_let_da_stamp == 'Z')) - { - char app = ' '; - set_row(_i++,"@0g%c", app); - set_row (_i++,"@0gCONTI D' ORDINE PASSIVI"); - set_row(_i++,"@0g%c", app); - stampa_classe = FALSE; - } - else - if ((_sez_da_stamp == '2')&&(_let_da_stamp != 'Z')) - { - char app = ' '; - set_row(_i++,"@0g%c", app); - set_row (_i++,"@0gPASSIVO"); - set_row(_i++,"@0g%c", app); - } - - if (_sez_da_stamp == '5') - { - char app = ' '; - set_row(_i++,"@0g%c", app); - set_row (_i++,"@0gCONTI D' ORDINE"); - set_row(_i++,"@0g%c", app); - stampa_classe = FALSE; - } - - if (_sez_da_stamp == '9') - { - char app = ' '; - set_row(_i++,"@0g%c", app); - set_row (_i++,"@0gCONTO ECONOMICO"); - set_row(_i++,"@0g%c", app); - } - } - else - if ((_let_da_stamp!=_let_stamp)&&(_sez_da_stamp==_sez_stamp)) - { - if ((_sez_da_stamp == '1')&&(_let_da_stamp == 'Z')) - { - char app = ' '; - set_row (_i++,"@0g%c", app); - set_row (_i++,"@0gCONTI D' ORDINE ATTIVI"); - set_row (_i++,"@0g%c", app); - stampa_classe = FALSE; - } - if ((_sez_da_stamp == '2')&&(_let_da_stamp == 'Z')) - { - char app = ' '; - set_row(_i++,"@0g%c", app); - set_row (_i++,"@0gCONTI D' ORDINE PASSIVI"); - set_row(_i++,"@0g%c", app); - stampa_classe = FALSE; - } - } - - if (stampa_classe) - { - if ((_sez_da_stamp=='1')||(_sez_da_stamp=='2')||(_sez_da_stamp== '9')) - { - char app = ' '; - set_row (_i++,"@0g%c", app); - if (_let_da_stamp != ' ') - set_row(_i,"@0g%c", _let_da_stamp); - - if (_numr_da_stamp != "") - set_row(_i,"@2g%8s", (const char*) numrom); - - if (_num_da_stamp != 0) - set_row(_i,"@11g%2d", _num_da_stamp); - - _d2 = (const char*) descrizione; - set_row(_i,"@14g#a", &_d2); - // setta_righe_descr(_descr); - } - } - } - set_row (_i,"@58g$[r]%3d$[n]", _gruppo); - set_row (_i,"@62g$[r]%3d$[n]", _conto); - if (_sottoc != 0) - set_row (_i,"@66g$[r]%6ld$[n]", _sottoc); - set_row (_i,"@73g%.40s", (const char*) descr); - - if (sez_opp != '0') - { - set_row (_i,"@116g%c", sez_opp); - - if (let_opp != '\0') - set_row (_i,"@118g%c", let_opp); - - if (numr_opp != 0) - set_row (_i,"@120g%8s", (const char*) numrom_opp); - - if (num_opp != 0) - set_row (_i++,"@129g%2d", num_opp); - } - else - _i++; -} - -/*void CG1100_application::setta_righe_descr(TParagraph_string* str) - { - const char* r; - - while ((r = str->get()) != NULL) - { - set_row (_i,"@14g%s",r); - _i++; - } - _i--; - } */ - -void CG1100_application::set_senza_IV() -{ - int i; - - TRectype & rec = current_cursor()->curr(); - - int gruppo = rec.get_int (PCN_GRUPPO); - int conto = rec.get_int (PCN_CONTO); - long sottoc = rec.get_long(PCN_SOTTOCONTO); - - reset_print (); - i = 1; - - if (_prima_volta) - { - _g_prec = gruppo; - _c_prec = conto; - _prima_volta = FALSE; - } - - if (sottoc == 0L) // Se si tratta di un conto - { - if (gruppo != _g_prec) - _stampa_riga_vuota = TRUE; - } - else - { - if (gruppo != _g_prec || conto != _c_prec) - _stampa_riga_vuota = TRUE; - } - - if (_stampa_riga_vuota) - { - char app = ' '; - set_row (i++,"@0g%c", app); - _stampa_riga_vuota = FALSE; - } - - set_row (i, "$[r]@pn$[n] $[r]@pn$[n] $[r]@pn$[n]", - FLD(LF_PCON, PCN_GRUPPO, "###"), FLD(LF_PCON,PCN_CONTO, "###"), - FLD(LF_PCON, PCN_SOTTOCONTO, "######")); - - - set_row (i, "@16g@50s", FLD(LF_PCON,PCN_DESCR) ); - - if (conto != 0 && sottoc == 0l) - { - //set_row (i, "@76g@pn", FLD(LF_PCON, PCN_INDBIL, "##") ); - set_row (i, "@76g@pn", FLD(LF_PCON, PCN_INDBIL, "#") ); - set_row (i, "@82g@1s", FLD(LF_PCON, PCN_TMCF) ); - set_row (i, "@89g@f", FLD(LF_PCON, PCN_STSOTTBIL) ); - set_row (i, "@98g@f", FLD(LF_PCON, PCN_COMPENS) ); - set_row (i, "@121g@f", FLD(LF_PCON, PCN_STSOTTAB) ); - } - if (sottoc != 0l) - { - char tipospric = rec.get_char(PCN_TIPOSPRIC); - if (tipospric == '\0') tipospric = '0'; - set_row (i, "@104g@1n", FLD(LF_PCON, PCN_RICSER) ); - //set_row (i, "@109g@1n", FLD(LF_PCON, PCN_TIPOSPRIC) ); - set_row (i, "@109g%c", tipospric); - set_row (i, "@115g@1s", FLD(LF_PCON, PCN_SEZSALDI) ); - set_row (i, "@129g@f", FLD(LF_PCON, PCN_STSOTTAB) ); - } -} - -void CG1100_application::set_con_ana() -{ - // gruppo, conto e sottoconto - int g,c; - long s; - char tmcf; - int TipoSpric, IndBil; - - reset_row (1); - - g = _rec->get_int (PCN_GRUPPO); - c = _rec->get_int (PCN_CONTO); - s = _rec->get_long (PCN_SOTTOCONTO); - tmcf = _rec->get(PCN_TMCF)[0]; - TipoSpric = _rec->get_int(PCN_TIPOSPRIC); - IndBil = _rec->get_int(PCN_INDBIL); - - TString cod(_rec->get(PCN_CODCBL)); - - set_row (1, "%-10s", (const char *) cod); - - set_row (1, "@15g%-40s", "") ; /* TBI */ - set_row (1, "@60g$[r]%3d$[n] $[r]%3d$[n] $[r]%6ld$[n]", g, c, s); - _d1 = _rec->get (PCN_DESCR); - - set_row (1, "@78g#a", &_d1); - - /* const char * s2 = s1.get(); - - if (s2) - { - reset_row(2); - set_row (2, "@78g%-30s", s2); - }*/ -} - -void CG1100_application::set_senza_ana() -{ - reset_row (1); - - set_row (1, "$[r]@pn$[n] $[r]@pn$[n] $[r]@pn$[n]", - FLD(LF_PCON, PCN_GRUPPO, "###"), FLD(LF_PCON,PCN_CONTO, "###"), - FLD(LF_PCON, PCN_SOTTOCONTO, "######")); - - set_row (1, "@16g@50s", FLD(LF_PCON,PCN_DESCR) ); - - set_row (1, "@69g@1s", FLD(LF_PCON, PCN_SEZIVD) ); - set_row (1, "@71g@1s", FLD(LF_PCON, PCN_LETTIVD) ); - set_row (1, "@73g#-8t", &_clivd); - set_row (1, "@82g@pn", FLD(LF_PCON, PCN_NUMIVD, "@@") ); - - //set_row (1, "@87g@pn", FLD(LF_PCON, PCN_INDBIL, "##") ); - set_row (1, "@87g@pn", FLD(LF_PCON, PCN_INDBIL, "#") ); - set_row (1, "@92g@1s", FLD(LF_PCON, PCN_TMCF) ); - set_row (1, "@99g@f", FLD(LF_PCON, PCN_STSOTTBIL) ); - set_row (1, "@107g@f", FLD(LF_PCON, PCN_COMPENS) ); - //set_row (1, "@114g@1n", FLD(LF_PCON, PCN_TIPOSPRIC) ); - set_row (1, "@120g@1s", FLD(LF_PCON, PCN_SEZSALDI) ); -} - - -void CG1100_application::set_completa() -{ - TRectype& rec = current_cursor()->curr(); - char sezione; - int i; - - int gruppo = rec.get_int (PCN_GRUPPO); - int conto = rec.get_int (PCN_CONTO); - long sottoc = rec.get_long(PCN_SOTTOCONTO); - sezione = rec.get_char(PCN_SEZIVD); - TString desc = rec.get(PCN_DESCR); - - if (_prima_volta) - { - _s_prec = 0; - _prima_volta = FALSE; - } - - if (sottoc != 0l && _s_prec != 0l) - i = 1; - else - { - i = 1; - char app = ' '; - set_row (i++,"@0g%c", app); - } - - reset_print (); - - set_row (i, "$[r]@pn$[n] $[r]@pn$[n] $[r]@pn$[n]", - FLD(LF_PCON, PCN_GRUPPO, "###"), FLD(LF_PCON,PCN_CONTO, "###"), - FLD(LF_PCON, PCN_SOTTOCONTO, "######")); - - - // set_row (1, "@16g@50s", FLD(LF_PCON,PCN_DESCR) ); - set_row (i, "@16g%.40s", (const char*) desc); // ??? - - if (sezione != '0' && sezione != '9') - set_row (i, "@58g@1s", FLD(LF_PCON, PCN_SEZIVD) ); - set_row (i, "@60g@1s", FLD(LF_PCON, PCN_LETTIVD) ); - set_row (i, "@62g#-8t", &_clivd ); - set_row (i, "@71g@pn", FLD(LF_PCON, PCN_NUMIVD, "@@") ); - - if (conto != 0 && sottoc == 0l) - { - //set_row (i, "@76g@pn", FLD(LF_PCON, PCN_INDBIL, "##") ); - set_row (i, "@76g@pn", FLD(LF_PCON, PCN_INDBIL, "#") ); - set_row (i, "@82g@1s", FLD(LF_PCON, PCN_TMCF) ); - set_row (i, "@89g@f", FLD(LF_PCON, PCN_STSOTTBIL) ); - set_row (i, "@98g@f", FLD(LF_PCON, PCN_COMPENS) ); - set_row (i, "@121g@f", FLD(LF_PCON, PCN_STSOTTAB) ); - } - if (sottoc != 0l) - { - char tipospric = rec.get_char(PCN_TIPOSPRIC); - if (tipospric == '\0') tipospric = '0'; - set_row (i, "@104g@1n", FLD(LF_PCON, PCN_RICSER) ); - //set_row (i, "@109g@1n", FLD(LF_PCON, PCN_TIPOSPRIC) ); - set_row (i, "@109g%c", tipospric); - set_row (i, "@115g@1s", FLD(LF_PCON, PCN_SEZSALDI) ); - set_row (i, "@129g@f", FLD(LF_PCON, PCN_STSOTTAB) ); - } - _s_prec = sottoc; -} - -bool CG1100_application::elabora_riga() -{ - TRectype& curr_rec = *_rec; - - switch (_tipo_stampa) - { - case completa: - case senza_IV_direttiva: - curr_rec = current_cursor()->curr(); - break; - case senza_ana_bil: - { - curr_rec = current_cursor()->curr(); - int conto = curr_rec.get_int(PCN_CONTO); - long sottoc = curr_rec.get_long(PCN_SOTTOCONTO); - if (conto != 0) - { - // se e' un sottoconto stampo sotttab in 127 - if (sottoc != 0) - { - char tipospric = curr_rec.get_char(PCN_TIPOSPRIC); - if (tipospric == '\0') tipospric = '0'; - set_row (1, "@114g%c", tipospric); - set_row (1, "@127g@f", FLD(LF_PCON, PCN_STSOTTAB)); - set_row (1, "@117g "); - } - else - // se e' un conto stampo sotttab in 124 - { - set_row (1, "@117g@f", FLD(LF_PCON, PCN_STSOTTAB)); - set_row (1, "@127g "); - } - } - break; - } - case con_ana_bil: - case con_IV_direttiva: - curr_rec = *_rec; - break; - default: - break; - } - - // Gestione salto pagina - if (_tipo_stampa == con_ana_bil) // || _tipo_stampa == con_IV_direttiva) - return FALSE; - - int new_gruppo = curr_rec.get_int(PCN_GRUPPO); - - if (_salto_pag && new_gruppo != _old_gruppo) - { - const bool salta = _old_gruppo > 0; - _old_gruppo = new_gruppo; - return salta; - } - return FALSE; -} - -int CG1100_application::leggo_sottoc(int gruppo,int conto,long sottoc) -{ - TLocalisamfile pconti (LF_PCON,FALSE); - char sez; - int gr,co; - int esito = 0; - bool esiste_conto_classificato = FALSE; - bool esiste_conto_non_classificato = FALSE; - - pconti.zero(); - pconti.put(PCN_GRUPPO, gruppo); - pconti.put(PCN_CONTO, conto); - pconti.put(PCN_SOTTOCONTO, sottoc); - - for (pconti.read(); !pconti.eof() ;pconti.next()) - { - gr = pconti.get_int (PCN_GRUPPO); - co = pconti.get_int (PCN_CONTO); - - if (gruppo != gr || conto != co) break; - - sez = pconti.get_char(PCN_SEZIVD); - - if (sez != '0') - esiste_conto_classificato = TRUE; - - if (sez == '0') - esiste_conto_non_classificato = TRUE; - } - - if (!esiste_conto_classificato && esiste_conto_non_classificato) - esito = 0; - - if (esiste_conto_classificato && esiste_conto_non_classificato) - esito = 1; - - if (esiste_conto_classificato && !esiste_conto_non_classificato) - esito = 2; - - return esito; -} - -bool CG1100_application::preprocess_page(int file,int counter) -{ - static int c1 = 0; - static TString16 a1; - char sez; - - if (_tipo_stampa == completa) - set_completa(); - - if (_tipo_stampa == senza_IV_direttiva) - { - if (file == LF_PCON) - { - TRectype& rec = current_cursor()->curr(); - int gruppo = rec.get_int (PCN_GRUPPO); - int conto = rec.get_int (PCN_CONTO); - long sottoc = rec.get_long(PCN_SOTTOCONTO); - - force_setpage(); - - if (conto == 0) return FALSE; //Scarto i gruppi - - if (sottoc == 0L) // Se si tratta di un conto - { - sez = rec.get_char(PCN_SEZIVD); - - if (sez == '0') - { - _sottoc_classificato = leggo_sottoc(gruppo,conto,sottoc); - if (_sottoc_classificato == 0) - _conto_classificato = TRUE; - else - if (_sottoc_classificato == 1) - { - _conto_classificato = FALSE; - return FALSE; - } - else - if (_sottoc_classificato == 2) - { - _conto_classificato = TRUE; - return FALSE; - } - } - else - { - _conto_classificato = TRUE; - return FALSE; - } - } - else // Se si tratta di un sottoconto - { - if (!_conto_classificato) - { - char sezione = rec.get_char(PCN_SEZIVD); - - if (sezione != '0') - return FALSE; - } - else - return FALSE; - } - _g_prec = gruppo; - _c_prec = conto; - } - } - if (_tipo_stampa == senza_ana_bil) - { - TRectype& rec = current_cursor()->curr(); - force_setpage(); - if (rec.get_int(PCN_CONTO) == 0) return FALSE; - if (rec.get_long(PCN_SOTTOCONTO) == 0L) - a1 = rec.get(PCN_CODCBL); - else - if (rec.get(PCN_CODCBL).empty()) - rec.put(PCN_CODCBL, a1); - if (rec.get(PCN_CODCBL).not_empty()) return FALSE; - } - if (elabora_riga()) - printer().formfeed(); - - const int c3 = atoi(_rec->get(PCN_NUMRIVD)); - const int o3 = atoi(_rec->get(PCN_NUMRIVDOPP)); - - _clivd = itor(c3); - _clivdo = itor(o3); - - return TRUE; -} - -bool CG1100_application::set_print(int) -{ - KEY tasto; - - _old_gruppo = 0; - tasto = _msk->run(); - - if (tasto == K_ENTER) - { - _tipo_stampa = (stampe)_msk->get_int(F_SCELTA_STAMPA); - _salto_pag = _msk->get_bool (F_SALTO_PAGINA); - _data_stampa = _msk->get (F_DATA_STAMPA); - - // scegli_cur(); - enable_link("Collegamento Piano dei conti : ", 'r'); - set_multiple_link(TRUE); - - _sez_stamp = ' '; - _let_stamp = ' '; - _numr_stamp = ""; - _num_stamp = 0; - _classe_stampata = ""; - - if (_tipo_stampa == senza_IV_direttiva) - { - _conto_classificato = TRUE; - _sottoc_classificato = 0; - _stampa_riga_vuota = FALSE; - _prima_volta = TRUE; - } - - switch (_tipo_stampa) - { - case completa: - case senza_IV_direttiva: - case senza_ana_bil: - select_cursor (_cur_c1); break; - case con_IV_direttiva: - case con_ana_bil: - select_cursor (_cur_c2); break; - default: - break; - } - init_sort(); - _resetta_righe_stampa = TRUE; - - printer().footerlen(5); - - return TRUE; - } - return FALSE; -} - -void CG1100_application::intesta (stampe tipo) -{ - int soh = 1; // riga d'inizio dell'intestazione - const long firm = get_firm(); - - reset_header (); - TLocalisamfile ditte(LF_NDITTE); - ditte.zero(); - ditte.put(NDT_CODDITTA, firm); - ditte.read(); - if (ditte.bad()) ditte.zero(); - - TString s(132); - s = ditte.get(NDT_RAGSOC); - TString data = _data_stampa.string(); - - set_header (soh++, "Ditta : %ld %s@110gData@115g%s Pag. @#", firm, (const char *) s, (const char*) data); - - - set_header (soh,"@0gPIANO DEI CONTI"); - - switch (tipo) - { - case completa: - set_header (soh++, "@20gStampa completa per IV direttiva"); - s.fill('-'); - set_header (soh++, (const char *) s); - set_header (soh++, "Conto @59gSez. Classe@75gTipo@86gNo Dettaglio@104gT@107gSpesa@118gDet.alleg.bil."); - set_header (soh++, "Sottoconto @16gDescrizione@61gIV dir.@75gConto@81gC/F@86gBilancio@97gComp.@104gA@107gRicavo@114gSez@118gSot.con * Mov."); - break; - - case con_IV_direttiva: - set_header (soh++, "@20gStampa conti riclassificati per IV direttiva"); - s.fill('_'); - set_header (soh++, (const char *) s); - set_header (soh++, "@58gCodici Piano@116gSez. e Classe"); - set_header (soh++, "Classe@14gDescrizione@58gdei Conti @73gDescrizione@116gdi segno opposto"); - - break; - - case senza_IV_direttiva: - set_header (soh++, "@20gStampa conti non collegati per IV direttiva"); - s.fill('_'); - set_header (soh++, (const char *) s); - set_header (soh++, "Conto @75gTipo@86gNo Dettaglio@104gT@107gSpesa@118gDet.alleg.bil."); - set_header (soh++, "Sottoconto @16gDescrizione@75gConto@81gC/F@86gBilancio@97gComp.@104gA@107gRicavo@114gSez@118gSot.con * Mov."); - break; - - case con_ana_bil: - - s.fill('_'); - set_header (soh++, (const char *) s); - set_header (soh++, "Codice @61gCodici Piano@113gDett.alleg.Bilancio"); - set_header (soh++, "Tabella@16gDescrizione@60gdei Conti @78gDescrizione @113gSot.con. * Moviment."); - - break; - - case senza_ana_bil: - s.fill('_'); - set_header (soh++, (const char *) s); - set_header (soh++, "Conto @67gSez. Classe@85gTipo@96gNo Dettaglio@112gSpesa @123gDet.bil."); - set_header (soh++, "Sottoconto @16gDescrizione@68gIV dir. @85gConto @91gC/F @96gBilancio @106gComp. @112gRicavo @119gSez"); - break; - - default: - break; - } - - set_header (soh++,(const char*)s); - set_header (soh, ""); - -} - -const char* CG1100_application::descrizione_numero(char sezione, char lettera, int numr, int numero) -{ - TTable& tabivd = *_tab; - TString dep,dep2; - - tabivd.zero(); - if (numr == 0 && numero == 0) - dep = format("%c%c",sezione,lettera); - else - if (numero == 0) - { - if (numr != 0) - dep = format("%1c%1c%04d",sezione, lettera, numr); - else - dep = format("%c%c ",sezione,lettera); - } - else - { - if (numr != 0) - dep = format("%1c%1c%04d%02d",sezione, lettera, numr,numero); - else - dep = format("%c%c %02d",sezione,lettera,numero); - } - - tabivd.put("CODTAB", dep); - tabivd.read(); - dep2 = tabivd.get("CODTAB"); - if (dep == dep2) - tmp = tabivd.get("S0"); - else - tmp = ""; - return tmp; -} - - -bool CG1100_application::user_create() -{ - _rel = new TRelation (LF_PCON); - _tab = new TTable(TAB_IVD); - _msk = new TMask ("cg1100a") ; - - TCursor *cursor = new TCursor (_rel); - - _cur_c1 = add_cursor (cursor); - - _rec = new TRectype (cursor->curr()); - - _pcont_reclen = _rec->len(); - _sort = new TSort(_pcont_reclen); - - _cur_c2 = add_cursor (NULL); - - add_file(LF_PCON); - - //set_print_zero(); - - _tipo_stampa = completa; - _salto_pag = FALSE; - _bil = new bil_ivd; - _sort = new TSort(); - return TRUE; -} - -bool CG1100_application::user_destroy() -{ - delete _rel; - delete _tab; - delete _msk; - delete _rec; - // delete _descr; - delete _bil; - delete _sort; - return TRUE; -} - -int cg1100(int argc, char* argv[]) -{ - CG1100_application a; - a.run(argc, argv, "Stampa Piano dei Conti"); - return 0; -} +// cg1100.cpp +// Stampa piano dei conti + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "cg1.h" +#include "cg1100.h" + +const char * TAB_ANABIL = "%IVD"; +const char * TAB_IVD = "%IVD"; + +const int CODTABLEN = 15; + +enum stampe { + completa=1, + con_IV_direttiva, + senza_IV_direttiva, + completa_bil, + con_ana_bil, + senza_ana_bil + }; + +class CG1100_application : public TPrintapp +{ + struct bil_ivd + { + char sez; + char let; + char numr[5]; + char num[4]; + char gruppo[4]; + char conto[4]; + char sottoc[8]; + char descr[52]; + char sez_opp; + char let_opp; + char numr_opp[5]; + int num_opp; + }; + + bil_ivd* _bil; + TTable* _tab; // tabella codici IV direttiva + TIsamtempfile* _tpcon; + TLocalisamfile* _pcon; + TRectype* _rec; + TSort* _sort; + TRelation* _rel, *_relt; + TMask* _msk; + TParagraph_string _d1, _d2; // qui + const char* _buf; + stampe _tipo_stampa; + bool _salto_pag,_resetta_righe_stampa; + int _old_gruppo; + int _pcont_reclen,_i; + int _cur_c1, _cur_c2, _cur_c3; + TString _clivd, _clivdo; + char _sez_da_stamp,_sez_stamp,_let_da_stamp,_let_stamp; + TString _numr_da_stamp,_numr_stamp; + int _gruppo,_conto,_num_da_stamp,_num_stamp,_g_prec,_c_prec; + long _sottoc,_s_prec; + TString _classe_da_stampare,_classe_stampata,_codcbl_da_stamp,_codcbl_stamp; + bool _conto_classificato,_sottoc_classificato,_stampa_riga_vuota; + bool _prima_volta, _stampa_g, _stampa_c; + TDate _data_stampa; + +public: + + virtual bool user_destroy() ; + virtual bool user_create() ; + + virtual void set_page (int,int); + virtual bool preprocess_print (int,int); + virtual bool preprocess_page (int,int); + virtual print_action postprocess_page (int,int); + virtual void postclose_print (); + + virtual bool set_print(int); + + void intesta (stampe); + + bool elabora_riga(); // decide se fare salto pagina o no + void do_sort(); + void set_completa (); + void set_con_IV (); + void set_senza_IV_ana (); + void set_con_ana (); +// void set_senza_ana (); + void prepara_pcon_temp(); + void cancella(int,int,long); + void init_sort(); + const char* descrizione_numero(char, char, int, int); + const char* descrizione_codcbl(TString&); + // void setta_righe_descr(TParagraph_string*); + int leggo_sottoc(int,int,long); + void riempi_record(char,char,const TString&,int,int,int,long,const TString&,char,char,const TString&,int); + void set_bil_key(bil_ivd* b, char sezione, char lettera, + const char* numero_romano, int numero, + int gruppo = 0, int conto = 0, long sottoconto = 0L); + void set_bil_val(bil_ivd* b, const char* descr,char sez_opp,char let_opp, + const char* numr_opp,int num_opp); + + void process_link(int id, const char* txt); + + CG1100_application() : _clivd(8), _clivdo(8), _d1("", 30), _d2("", 40) {} +}; + +void CG1100_application::process_link(int id, const char* txt) +{ + TString ss = "1|"; ss << txt; + TMessage fs(cmd2name("cg0","-0"), MSG_LN, ss); + TMailbox m; + m.send(fs); + TExternal_app cg0("cg0 -0"); + if (cg0.run()) beep(); +} + +void CG1100_application::init_sort() +{ + switch (_tipo_stampa) + { + case con_IV_direttiva: + _sort->reset(sizeof(bil_ivd)); + + _sort -> addsortkey ((char*)&(_bil->sez) - (char*)&(_bil->sez),1); + _sort -> addsortkey ((char*)&(_bil->let) - (char*)&(_bil->sez),1); + _sort -> addsortkey ((char*)&(_bil->numr) - (char*)&(_bil->sez),4); + _sort -> addsortkey ((char*)&(_bil->num) - (char*)&(_bil->sez),2); + _sort -> addsortkey ((char*)&(_bil->gruppo) - (char*)&(_bil->sez),3); + _sort -> addsortkey ((char*)&(_bil->conto) - (char*)&(_bil->sez),3); + _sort -> addsortkey ((char*)&(_bil->sottoc) - (char*)&(_bil->sez),6); + break; + case con_ana_bil: + { + TRecfield codcbl (*_rec, PCN_CODCBL); + TRecfield gruppo (*_rec, PCN_GRUPPO); + TRecfield conto (*_rec, PCN_CONTO); + TRecfield sottoc (*_rec, PCN_SOTTOCONTO); + + _sort->reset(_rec->len()); + _sort->addsortkey (codcbl); + _sort->addsortkey (gruppo); + _sort->addsortkey (conto); + _sort->addsortkey (sottoc); + + break; + } + default: + break; + } +} + +void CG1100_application::set_bil_key(bil_ivd* b, char sezione, char lettera, + const char* numero_romano, int numero, + int gruppo, int conto,long sottoconto) +{ + b->sez = sezione; + b->let = lettera; + strcpy(b->numr, numero_romano); + sprintf(b->num , "%2d", numero); + sprintf(b->gruppo , "%3d", gruppo); + sprintf(b->conto , "%3d", conto); + sprintf(b->sottoc , "%6ld", sottoconto); +} + +void CG1100_application::set_bil_val(bil_ivd* b, const char* descr, + char sez_opp,char let_opp, + const char* numr_opp,int num_opp) +{ + strcpy(b->descr, descr); + b->sez_opp = sez_opp; + b->let_opp = let_opp; + strcpy(b->numr_opp, numr_opp); + b->num_opp = num_opp; +} + +void CG1100_application::riempi_record(char sez,char let,const TString& numr, + int numero,int g,int c,long s, + const TString& descr,char sez_opp, + char let_opp,const TString& numr_opp, + int num_opp) +{ + set_bil_key(_bil, sez, let, numr, numero, g, c, s); + set_bil_val(_bil, descr, sez_opp, let_opp, numr_opp, num_opp); + _sort->sort ((const char*) _bil); +} + +void CG1100_application::postclose_print() +{ + if (_tipo_stampa == senza_ana_bil) + { + delete _tpcon; + delete _relt; + } +} + +print_action CG1100_application::postprocess_page(int file,int counter) +{ + switch (_tipo_stampa) + { + case completa: + case senza_IV_direttiva: + case completa_bil: + case senza_ana_bil: + break; + case con_IV_direttiva: + { + struct bil_ivd* bil = (struct bil_ivd*) _buf; + + _sez_stamp = _sez_da_stamp; + _let_stamp = _let_da_stamp; + _numr_stamp = _numr_da_stamp; + _num_stamp = _num_da_stamp; + _classe_stampata.format("%c%c%s%2d",_sez_stamp,_let_stamp,(const char*)_numr_stamp,_num_stamp); + + if ( (_buf = _sort->retrieve()) != NULL) + { + bil = (struct bil_ivd*) _buf; + _sez_da_stamp = bil->sez; + _let_da_stamp = bil->let; + _numr_da_stamp = bil->numr; + _numr_da_stamp.ltrim(); + _num_da_stamp = atoi(bil->num); + _gruppo = atoi(bil->gruppo); + _conto = atoi(bil->conto); + _sottoc = atol(bil->sottoc); + _classe_da_stampare.format("%c%c%s%2d",_sez_da_stamp,_let_da_stamp,(const char*)_numr_da_stamp,_num_da_stamp); + + //set_auto_ff(FALSE); + + return REPEAT_PAGE; + } + } + break; + case con_ana_bil: + { + TRectype rec (LF_PCON); + + _codcbl_stamp = _codcbl_da_stamp; + + if ( (_buf = _sort->retrieve()) != NULL) + { + rec = _buf; + _codcbl_da_stamp = rec.get(PCN_CODCBL); + _gruppo = rec.get_int(PCN_GRUPPO); + _conto = rec.get_int(PCN_CONTO); + _sottoc = rec.get_long(PCN_SOTTOCONTO); + + return REPEAT_PAGE; + } + break; + } + default: + break; + } + return NEXT_PAGE; +} + +void CG1100_application::set_page(int file,int counter) +{ + //intesta (_tipo_stampa); + switch (_tipo_stampa) + { + case con_IV_direttiva: + { + reset_print(); + _i = 1; + + if (_sez_da_stamp != _sez_stamp) + set_con_IV (); + else + if (_buf != NULL) + set_con_IV(); + } + break; + case con_ana_bil: + { + reset_print(); + _i = 1; + + if (_codcbl_da_stamp != _codcbl_stamp) + set_con_ana (); + else + if (_buf != NULL) + set_con_ana(); + } + break; + case senza_IV_direttiva: + set_senza_IV_ana(); + break; + case senza_ana_bil: + set_senza_IV_ana(); + break; + default: + break; + } +} + +////////////////////////////////////////////////////////////// +// Crea sort se necessario e seleziona il cursore opportuno +////////////////////////////////////////////////////////////// +void CG1100_application::do_sort() +{ + if (_tipo_stampa == con_IV_direttiva) + { + char sez_conto,let_conto; + TString numr_conto; + int num_conto; + bool classe_conto = FALSE; + + _sort->init(); + select_cursor (_cur_c1); + + TCursor * cursor = current_cursor(); + TRectype & rec = cursor->curr(); + + long last = cursor->items(); + + TProgind prg (last, "Elaborazione Piano dei Conti... Prego attendere", FALSE, TRUE, 30); + + for ( *cursor = 0; cursor->pos() < last; ++(*cursor) ) + { + prg.addstatus(1); + + int g = rec.get_int(PCN_GRUPPO); + int c = rec.get_int(PCN_CONTO); + long s = rec.get_int(PCN_SOTTOCONTO); + + if (g != 0 && c == 0 && s == 0) continue; + + char sez = rec.get_char(PCN_SEZIVD); + char let = rec.get_char(PCN_LETTIVD); + TString numr = rec.get (PCN_NUMRIVD); + int num = rec.get_int (PCN_NUMIVD); + TString descr = rec.get (PCN_DESCR); + char sez_opp = rec.get_char(PCN_SEZIVDOPP); + char let_opp = rec.get_char(PCN_LETTIVDOPP); + TString numr_opp = rec.get (PCN_NUMRIVDOPP); + int num_opp = rec.get_int (PCN_NUMIVDOPP); + + if ((g != 0) && (c != 0) && (s == 0)) + { + if (sez != '\0' && sez != '0') + { + sez_conto = sez; + + if (let != '\0') + let_conto = let; + else + if ((sez == '1')||(sez == '2')) + let_conto = 'Z'; + else + let_conto = let; + + numr_conto = numr; + num_conto = num; + classe_conto = TRUE; + riempi_record(sez_conto,let_conto,numr_conto,num_conto,g,c,s,descr,sez_opp,let_opp,numr_opp,num_opp); + } + else + classe_conto = FALSE; + } + + if ((g != 0) && (c != 0) && (s != 0)) + { + if (classe_conto) + riempi_record(sez_conto,let_conto,numr_conto,num_conto,g,c,s,descr,sez_opp,let_opp,numr_opp,num_opp); + else + { + if (sez != '\0' && sez != '0') + { + if (let == '\0') + if ((sez == '1')||(sez == '2')) + let = 'Z'; + + riempi_record(sez,let,numr,num,g,c,s,descr,sez_opp,let_opp,numr_opp,num_opp); + } + } + } + } + + _sort->endsort(); + select_cursor (_cur_c2); + } + + if (_tipo_stampa == con_ana_bil) + { + bool livello_conto = FALSE; + + _sort->init(); + + select_cursor (_cur_c1); + + TCursor * cursor = current_cursor(); + TRectype & rec = cursor->curr(); + + long last = cursor->items(); + + TProgind prg (last, "Elaborazione Piano dei Conti... Prego attendere", FALSE, TRUE, 30); + + TString c1(12); + + int conto_p = -1; + + for ( *cursor = 0; cursor->pos() < last; ++(*cursor) ) + { + prg.addstatus(1); + + int gruppo = rec.get_int (PCN_GRUPPO); + int conto = rec.get_int (PCN_CONTO); + long sottoc = rec.get_long(PCN_SOTTOCONTO); + + if (livello_conto && (conto != conto_p) ) + { + c1 = ""; + livello_conto = FALSE; + } + + conto_p = conto; + + if (conto == 0) // Si tratta di un gruppo + c1 = rec.get(PCN_CODCBL); + else + if (sottoc == 0) // Si tratta di un conto + { + if (rec.get(PCN_CODCBL).empty()) + rec.put(PCN_CODCBL, c1); + else + { + c1 = rec.get(PCN_CODCBL); + livello_conto = TRUE; + } + } + else // Si tratta di un sottoconto + if (rec.get(PCN_CODCBL).empty()) + rec.put(PCN_CODCBL, c1); + + if (rec.get(PCN_CODCBL).not_empty() ) + _sort->sort (rec.string()); + } + + _sort->endsort(); + select_cursor (_cur_c2); + } +} + +void CG1100_application::cancella(int g, int c, long s) +{ + _tpcon->setkey(1); + _tpcon->zero(); + _tpcon->put(PCN_GRUPPO, g); + _tpcon->put(PCN_CONTO, c); + _tpcon->put(PCN_SOTTOCONTO, s); + if (_tpcon->read() == NOERR) + _tpcon->remove(); +} + +void CG1100_application::prepara_pcon_temp() +{ + TLocalisamfile pcon (LF_PCON); + TRectype rec (LF_PCON); + bool gruppo_riclassificato = FALSE; + bool conto_riclassificato = FALSE; + + int g_prec = -1; + int c_prec = -1; + + long items = pcon.items(); + + TProgind prog (items,"Elaborazione Piano dei Conti... Prego attendere", FALSE, TRUE, 30); + + for (pcon.first(); !pcon.eof(); pcon.next()) + { + prog.addstatus(1); + + int g = pcon.get_int (PCN_GRUPPO); + int c = pcon.get_int (PCN_CONTO); + long s = pcon.get_long(PCN_SOTTOCONTO); + + if (gruppo_riclassificato && g == g_prec) + continue; + else + gruppo_riclassificato = FALSE; + + if (conto_riclassificato && (g == g_prec && c == c_prec) ) + continue; + else + conto_riclassificato = FALSE; + + TString16 codcbl = pcon.get(PCN_CODCBL); + + if (c == 0) // Se si tratta di un gruppo + { + if (codcbl.empty()) + { + rec = pcon.curr(); + + _tpcon->zero(); + _tpcon->curr() = rec; + _tpcon->write(); + } + else + gruppo_riclassificato = TRUE; + } + else + if (s == 0) // Se si tratta di un conto + { + if (codcbl.empty()) + { + rec = pcon.curr(); + + _tpcon->zero(); + _tpcon->curr() = rec; + _tpcon->write(); + } + else + { + int gruppo = pcon.get_int(PCN_GRUPPO); + + cancella(gruppo,0,0); // Cancella l'eventuale gruppo + + conto_riclassificato = TRUE; + } + } + else // Se si tratta di un sottoconto + { + if (codcbl.empty()) + { + rec = pcon.curr(); + + _tpcon->zero(); + _tpcon->curr() = rec; + _tpcon->write(); + } + else + { + int gruppo = pcon.get_int(PCN_GRUPPO); + int conto = pcon.get_int(PCN_CONTO); + + cancella(gruppo,0,0); // Cancella l'eventuale gruppo + cancella(gruppo,conto,0); // Cancella l'eventuale conto + } + } + } + select_cursor(_cur_c3); // Seleziono il cursore definito sul piano dei conti temporaneo + _tpcon->first(); +} + +bool CG1100_application::preprocess_print (int file,int counter) +{ + switch (_tipo_stampa) + { + case completa: + case completa_bil: + case senza_IV_direttiva: + break; + case con_IV_direttiva: + { + struct bil_ivd* bil = (struct bil_ivd*) _buf; + + if ((_buf = _sort->retrieve()) != NULL) + { + bil = (struct bil_ivd*) _buf; + _sez_da_stamp = bil->sez; + _let_da_stamp = bil->let; + _numr_da_stamp = bil->numr; + _numr_da_stamp.ltrim(); + _num_da_stamp = atoi(bil->num); + _gruppo = atoi(bil->gruppo); + _conto = atoi(bil->conto); + _sottoc = atol(bil->sottoc); + _classe_da_stampare.format("%c%c%s%2d",_sez_da_stamp,_let_da_stamp,(const char*)_numr_da_stamp,_num_da_stamp); + + return TRUE; + } + else + return FALSE; + } + break; + case con_ana_bil: + { + TRectype rec (LF_PCON); + + if ((_buf = _sort->retrieve()) != NULL) + { + rec = _buf; + _codcbl_da_stamp = rec.get(PCN_CODCBL); + _gruppo = rec.get_int(PCN_GRUPPO); + _conto = rec.get_int(PCN_CONTO); + _sottoc = rec.get_long(PCN_SOTTOCONTO); + + return TRUE; + } + else + return FALSE; + } + break; + case senza_ana_bil: + break; + default: + break; + } + return TRUE; +} + +void CG1100_application::set_con_IV() +{ + struct bil_ivd* bil = (struct bil_ivd*) _buf; + + TString descrizione,descr; + char sez_opp,let_opp; + int num_opp,numr_opp; + bool stampa_classe = TRUE; + int numr = atoi(_numr_da_stamp); + TString numrom = itor(numr); + + sez_opp = bil->sez_opp; + let_opp = bil->let_opp; + numr_opp = atoi(bil->numr_opp); + TString numrom_opp = itor(numr_opp); + num_opp = bil->num_opp; + + descrizione = descrizione_numero(_sez_da_stamp,_let_da_stamp,numr,_num_da_stamp); + descr = bil->descr; + + //Se la classe prelevata dal record corrente del sort e' diversa dalla classe + //prelevata dal record precedente, allora stampo la nuova classe con i relativi + //sottoconti. In caso contrario continuo a stampare solo i sottoconti. + + if (_classe_da_stampare != _classe_stampata) + { + if (_sez_da_stamp != _sez_stamp) + { + if ((_sez_da_stamp == '1')&&(_let_da_stamp == 'Z')) + { + char app = ' '; + set_row (_i++,"@0g%c", app); + set_row (_i++,"@0gCONTI D' ORDINE ATTIVI"); + set_row (_i++,"@0g%c", app); + stampa_classe = FALSE; + } + else + if ((_sez_da_stamp == '1')&&(_let_da_stamp != 'Z')) + { + char app = ' '; + set_row (_i++,"@0g%c", app); + set_row (_i++,"@0gATTIVO"); + set_row (_i++,"@0g%c", app); + } + + if ((_sez_da_stamp == '2')&&(_let_da_stamp == 'Z')) + { + char app = ' '; + set_row(_i++,"@0g%c", app); + set_row (_i++,"@0gCONTI D' ORDINE PASSIVI"); + set_row(_i++,"@0g%c", app); + stampa_classe = FALSE; + } + else + if ((_sez_da_stamp == '2')&&(_let_da_stamp != 'Z')) + { + char app = ' '; + set_row(_i++,"@0g%c", app); + set_row (_i++,"@0gPASSIVO"); + set_row(_i++,"@0g%c", app); + } + + if (_sez_da_stamp == '5') + { + char app = ' '; + set_row(_i++,"@0g%c", app); + set_row (_i++,"@0gCONTI D' ORDINE"); + set_row(_i++,"@0g%c", app); + stampa_classe = FALSE; + } + + if (_sez_da_stamp == '9') + { + char app = ' '; + set_row(_i++,"@0g%c", app); + set_row (_i++,"@0gCONTO ECONOMICO"); + set_row(_i++,"@0g%c", app); + } + } + else + if ((_let_da_stamp!=_let_stamp)&&(_sez_da_stamp==_sez_stamp)) + { + if ((_sez_da_stamp == '1')&&(_let_da_stamp == 'Z')) + { + char app = ' '; + set_row (_i++,"@0g%c", app); + set_row (_i++,"@0gCONTI D' ORDINE ATTIVI"); + set_row (_i++,"@0g%c", app); + stampa_classe = FALSE; + } + if ((_sez_da_stamp == '2')&&(_let_da_stamp == 'Z')) + { + char app = ' '; + set_row(_i++,"@0g%c", app); + set_row (_i++,"@0gCONTI D' ORDINE PASSIVI"); + set_row(_i++,"@0g%c", app); + stampa_classe = FALSE; + } + } + + if (stampa_classe) + { + if ((_sez_da_stamp=='1')||(_sez_da_stamp=='2')||(_sez_da_stamp== '9')) + { + char app = ' '; + set_row (_i++,"@0g%c", app); + if (_let_da_stamp != ' ') + set_row(_i,"@0g%c", _let_da_stamp); + + if (_numr_da_stamp != "") + set_row(_i,"@2g%8s", (const char*) numrom); + + if (_num_da_stamp != 0) + set_row(_i,"@11g%2d", _num_da_stamp); + + _d2 = (const char*) descrizione; + set_row(_i,"@14g#a", &_d2); + // setta_righe_descr(_descr); + } + } + } + set_row (_i,"@58g$[r]%3d$[n]", _gruppo); + set_row (_i,"@62g$[r]%3d$[n]", _conto); + if (_sottoc != 0) + set_row (_i,"@66g$[r]%6ld$[n]", _sottoc); + set_row (_i,"@73g%.40s", (const char*) descr); + + if (sez_opp != '0') + { + set_row (_i,"@116g%c", sez_opp); + + if (let_opp != '\0') + set_row (_i,"@118g%c", let_opp); + + if (numr_opp != 0) + set_row (_i,"@120g%8s", (const char*) numrom_opp); + + if (num_opp != 0) + set_row (_i++,"@129g%2d", num_opp); + } + else + _i++; +} + +/*void CG1100_application::setta_righe_descr(TParagraph_string* str) + { + const char* r; + + while ((r = str->get()) != NULL) + { + set_row (_i,"@14g%s",r); + _i++; + } + _i--; + } */ + +void CG1100_application::set_senza_IV_ana() +{ + int i; + + TRectype & rec = current_cursor()->curr(); + + int gruppo = rec.get_int (PCN_GRUPPO); + int conto = rec.get_int (PCN_CONTO); + long sottoc = rec.get_long(PCN_SOTTOCONTO); + + reset_print (); + i = 1; + + if (_prima_volta) + { + _g_prec = gruppo; + _c_prec = conto; + _prima_volta = FALSE; + } + + if (sottoc == 0L) // Se si tratta di un conto + { + if (gruppo != _g_prec) + _stampa_riga_vuota = TRUE; + } + else + { + if (gruppo != _g_prec || conto != _c_prec) + _stampa_riga_vuota = TRUE; + } + + if (_stampa_riga_vuota) + { + char app = ' '; + set_row (i++,"@0g%c", app); + _stampa_riga_vuota = FALSE; + } + + set_row (i, "$[r]@pn$[n] $[r]@pn$[n] $[r]@pn$[n]", + FLD(LF_PCON, PCN_GRUPPO, "###"), FLD(LF_PCON,PCN_CONTO, "###"), + FLD(LF_PCON, PCN_SOTTOCONTO, "######")); + + + set_row (i, "@16g@50s", FLD(LF_PCON,PCN_DESCR) ); + + if (conto != 0 && sottoc == 0l) + { + set_row (i, "@76g@pn", FLD(LF_PCON, PCN_INDBIL, "#") ); + set_row (i, "@82g@1s", FLD(LF_PCON, PCN_TMCF) ); + set_row (i, "@89g@f", FLD(LF_PCON, PCN_STSOTTBIL) ); + set_row (i, "@98g@f", FLD(LF_PCON, PCN_COMPENS) ); + set_row (i, "@121g@f", FLD(LF_PCON, PCN_STSOTTAB) ); + } + if (sottoc != 0l) + { + char tipospric = rec.get_char(PCN_TIPOSPRIC); + if (tipospric == '\0') tipospric = '0'; + set_row (i, "@104g@1n", FLD(LF_PCON, PCN_RICSER) ); + set_row (i, "@109g%c", tipospric); + set_row (i, "@115g@1s", FLD(LF_PCON, PCN_SEZSALDI) ); + set_row (i, "@129g@f", FLD(LF_PCON, PCN_STSOTTAB) ); + } +} + +void CG1100_application::set_con_ana() +{ + TRectype rec (LF_PCON); + TString16 val; + + rec = _buf; + + TString descrizione,descr; + bool stampa_codcbl = TRUE; + + TString codcbl = rec.get(PCN_CODCBL); + int gruppo = rec.get_int (PCN_GRUPPO); + int conto = rec.get_int (PCN_CONTO); + long sottoc = rec.get_long(PCN_SOTTOCONTO); + bool stsobi = rec.get_bool(PCN_STSOTTBIL); + if (stsobi) + val = "Si"; + else + val = "No"; + + descrizione = descrizione_codcbl(codcbl); + descr = rec.get(PCN_DESCR); + + char app = ' '; + set_row (_i++,"@0g%c", app); + + if (_codcbl_da_stamp != _codcbl_stamp) + { + set_row (_i,"@0g%10s", (const char*) _codcbl_da_stamp); + set_row (_i,"@12g%s", (const char*) descrizione); + } + + set_row (_i,"@62g$[r]%3d$[n]", _gruppo); + set_row (_i,"@65g$[r]%3d$[n]", _conto); + + if (_sottoc != 0) + set_row (_i,"@68g$[r]%6ld$[n]", _sottoc); + + set_row (_i,"@76g%.40s", (const char*) descr); + + if (conto != 0 && sottoc == 0l) + set_row (_i, "@121g%s", (const char*) val); + else + if (sottoc != 0l) + set_row (_i, "@129g%s", (const char*) val); + + _i++; +} + +/********* +void CG1100_application::set_senza_ana() +{ + reset_row (1); + + set_row (1, "$[r]@pn$[n] $[r]@pn$[n] $[r]@pn$[n]", + FLD(LF_PCON, PCN_GRUPPO, "###"), FLD(LF_PCON,PCN_CONTO, "###"), + FLD(LF_PCON, PCN_SOTTOCONTO, "######")); + + set_row (1, "@16g@50s", FLD(LF_PCON,PCN_DESCR) ); + + set_row (1, "@69g@1s", FLD(LF_PCON, PCN_SEZIVD) ); + set_row (1, "@71g@1s", FLD(LF_PCON, PCN_LETTIVD) ); + set_row (1, "@73g#-8t", &_clivd); + set_row (1, "@82g@pn", FLD(LF_PCON, PCN_NUMIVD, "@@") ); + + set_row (1, "@87g@pn", FLD(LF_PCON, PCN_INDBIL, "#") ); + set_row (1, "@92g@1s", FLD(LF_PCON, PCN_TMCF) ); + set_row (1, "@99g@f", FLD(LF_PCON, PCN_STSOTTBIL) ); + set_row (1, "@107g@f", FLD(LF_PCON, PCN_COMPENS) ); + set_row (1, "@120g@1s", FLD(LF_PCON, PCN_SEZSALDI) ); +} +*********/ + +void CG1100_application::set_completa() +{ + TRectype& rec = current_cursor()->curr(); + char sezione; + int i; + + int gruppo = rec.get_int (PCN_GRUPPO); + int conto = rec.get_int (PCN_CONTO); + long sottoc = rec.get_long(PCN_SOTTOCONTO); + sezione = rec.get_char(PCN_SEZIVD); + TString desc = rec.get(PCN_DESCR); + + if (_prima_volta) + { + _s_prec = 0; + _prima_volta = FALSE; + } + + if (sottoc != 0l && _s_prec != 0l) + i = 1; + else + { + i = 1; + char app = ' '; + set_row (i++,"@0g%c", app); + } + + reset_print (); + + set_row (i, "$[r]@pn$[n] $[r]@pn$[n] $[r]@pn$[n]", + FLD(LF_PCON, PCN_GRUPPO, "###"), FLD(LF_PCON,PCN_CONTO, "###"), + FLD(LF_PCON, PCN_SOTTOCONTO, "######")); + + + set_row (i, "@16g%.40s", (const char*) desc); // ??? + + if (_tipo_stampa == completa) + { + if (sezione != '0' && sezione != '9') + set_row (i, "@58g@1s", FLD(LF_PCON, PCN_SEZIVD) ); + set_row (i, "@60g@1s", FLD(LF_PCON, PCN_LETTIVD) ); + set_row (i, "@62g#-8t", &_clivd ); + set_row (i, "@71g@pn", FLD(LF_PCON, PCN_NUMIVD, "@@") ); + } + else + if (_tipo_stampa == completa_bil) + set_row (i, "@60g@10s", FLD(LF_PCON, PCN_CODCBL) ); + + if (conto != 0 && sottoc == 0l) + { + set_row (i, "@76g@pn", FLD(LF_PCON, PCN_INDBIL, "#") ); + set_row (i, "@82g@1s", FLD(LF_PCON, PCN_TMCF) ); + set_row (i, "@89g@f", FLD(LF_PCON, PCN_STSOTTBIL) ); + set_row (i, "@98g@f", FLD(LF_PCON, PCN_COMPENS) ); + set_row (i, "@121g@f", FLD(LF_PCON, PCN_STSOTTAB) ); + } + if (sottoc != 0l) + { + char tipospric = rec.get_char(PCN_TIPOSPRIC); + if (tipospric == '\0') tipospric = '0'; + set_row (i, "@104g@1n", FLD(LF_PCON, PCN_RICSER) ); + set_row (i, "@109g%c", tipospric); + set_row (i, "@114g@1s", FLD(LF_PCON, PCN_SEZSALDI) ); + set_row (i, "@129g@f", FLD(LF_PCON, PCN_STSOTTAB) ); + } + _s_prec = sottoc; +} + +bool CG1100_application::elabora_riga() +{ + TRectype& curr_rec = *_rec; + + switch (_tipo_stampa) + { + case completa: + case senza_IV_direttiva: + curr_rec = current_cursor()->curr(); + break; + case senza_ana_bil: + { + curr_rec = current_cursor()->curr(); + int conto = curr_rec.get_int(PCN_CONTO); + long sottoc = curr_rec.get_long(PCN_SOTTOCONTO); + if (conto != 0) + { + // se e' un sottoconto stampo sotttab in 127 + if (sottoc != 0) + { + char tipospric = curr_rec.get_char(PCN_TIPOSPRIC); + if (tipospric == '\0') tipospric = '0'; + set_row (1, "@114g%c", tipospric); + set_row (1, "@127g@f", FLD(LF_PCON, PCN_STSOTTAB)); + set_row (1, "@117g "); + } + else + // se e' un conto stampo sotttab in 124 + { + set_row (1, "@117g@f", FLD(LF_PCON, PCN_STSOTTAB)); + set_row (1, "@127g "); + } + } + break; + } + case con_ana_bil: + case con_IV_direttiva: + curr_rec = *_rec; + break; + default: + break; + } + + // Gestione salto pagina + if (_tipo_stampa == con_ana_bil) // || _tipo_stampa == con_IV_direttiva) + return FALSE; + + int new_gruppo = curr_rec.get_int(PCN_GRUPPO); + + if (_salto_pag && new_gruppo != _old_gruppo) + { + const bool salta = _old_gruppo > 0; + _old_gruppo = new_gruppo; + return salta; + } + return FALSE; +} + +int CG1100_application::leggo_sottoc(int gruppo,int conto,long sottoc) +{ + TLocalisamfile pconti (LF_PCON,FALSE); + char sez; + int gr,co; + int esito = 0; + bool esiste_conto_classificato = FALSE; + bool esiste_conto_non_classificato = FALSE; + + pconti.zero(); + pconti.put(PCN_GRUPPO, gruppo); + pconti.put(PCN_CONTO, conto); + pconti.put(PCN_SOTTOCONTO, sottoc); + + for (pconti.read(); !pconti.eof() ;pconti.next()) + { + gr = pconti.get_int (PCN_GRUPPO); + co = pconti.get_int (PCN_CONTO); + + if (gruppo != gr || conto != co) break; + + sez = pconti.get_char(PCN_SEZIVD); + + if (sez != '0') + esiste_conto_classificato = TRUE; + + if (sez == '0') + esiste_conto_non_classificato = TRUE; + } + + if (!esiste_conto_classificato && esiste_conto_non_classificato) + esito = 0; + + if (esiste_conto_classificato && esiste_conto_non_classificato) + esito = 1; + + if (esiste_conto_classificato && !esiste_conto_non_classificato) + esito = 2; + + return esito; +} + +bool CG1100_application::preprocess_page(int file,int counter) +{ + static int c1 = 0; + static TString16 a1; + char sez; + TString16 codcbl; + + if (_tipo_stampa == completa || _tipo_stampa == completa_bil) + set_completa(); + + if (_tipo_stampa == senza_IV_direttiva) + { + if (file == LF_PCON) + { + TRectype& rec = current_cursor()->curr(); + int gruppo = rec.get_int (PCN_GRUPPO); + int conto = rec.get_int (PCN_CONTO); + long sottoc = rec.get_long(PCN_SOTTOCONTO); + + force_setpage(); + + if (conto == 0) return FALSE; //Scarto i gruppi + + if (sottoc == 0L) // Se si tratta di un conto + { + sez = rec.get_char(PCN_SEZIVD); + + if (sez == '0') + { + _sottoc_classificato = leggo_sottoc(gruppo,conto,sottoc); + if (_sottoc_classificato == 0) + _conto_classificato = TRUE; + else + if (_sottoc_classificato == 1) + { + _conto_classificato = FALSE; + return FALSE; + } + else + if (_sottoc_classificato == 2) + { + _conto_classificato = TRUE; + return FALSE; + } + } + else + { + _conto_classificato = TRUE; + return FALSE; + } + } + else // Se si tratta di un sottoconto + { + if (!_conto_classificato) + { + char sezione = rec.get_char(PCN_SEZIVD); + + if (sezione != '0') + return FALSE; + } + else + return FALSE; + } + _g_prec = gruppo; + _c_prec = conto; + } + } + + if (_tipo_stampa == senza_ana_bil) + { + if (file == LF_PCON) + { + TRectype& rec = current_cursor()->curr(); + int gruppo = rec.get_int (PCN_GRUPPO); + int conto = rec.get_int (PCN_CONTO); + long sottoc = rec.get_long(PCN_SOTTOCONTO); + + force_setpage(); + + if (gruppo != _g_prec) + { + _stampa_g = TRUE; + _stampa_c = TRUE; + } + + if ( (gruppo != _g_prec || conto != _c_prec) && _stampa_g) + _stampa_c = TRUE; + + _g_prec = gruppo; + _c_prec = conto; + + if (conto == 0) // Si tratta di un gruppo + { + _stampa_g = FALSE; + _stampa_c = FALSE; + return TRUE; + } + + if (sottoc == 0) // Si tratta di un conto + { + if (_stampa_g) + { + _stampa_c = FALSE; + return TRUE; + } + else + return FALSE; + } + + if (sottoc != 0) // Si tratta di un sottoconto + { + if (_stampa_c) + return TRUE; + else + return FALSE; + } + } + } + + if (elabora_riga()) + printer().formfeed(); + + const int c3 = atoi(_rec->get(PCN_NUMRIVD)); + const int o3 = atoi(_rec->get(PCN_NUMRIVDOPP)); + + _clivd = itor(c3); + _clivdo = itor(o3); + + return TRUE; +} + +bool CG1100_application::set_print(int) +{ + KEY tasto; + + _old_gruppo = 0; + tasto = _msk->run(); + + if (tasto == K_ENTER) + { + _tipo_stampa = (stampe)_msk->get_int(F_SCELTA_STAMPA); + _salto_pag = _msk->get_bool (F_SALTO_PAGINA); + _data_stampa = _msk->get (F_DATA_STAMPA); + + // scegli_cur(); + enable_link("Collegamento Piano dei conti : ", 'r'); + set_multiple_link(TRUE); + + _sez_stamp = ' '; + _let_stamp = ' '; + _numr_stamp = ""; + _num_stamp = 0; + _classe_stampata = ""; + + _resetta_righe_stampa = TRUE; + + if (_tipo_stampa == senza_IV_direttiva) + { + _conto_classificato = TRUE; + _sottoc_classificato = 0; + _stampa_riga_vuota = FALSE; + _prima_volta = TRUE; + } + + switch (_tipo_stampa) + { + case completa: + case completa_bil: + case senza_IV_direttiva: + select_cursor(_cur_c1); + break; + case senza_ana_bil: + { + _tpcon = new TIsamtempfile (LF_PCON, "ab", TRUE); + _relt = new TRelation (_tpcon); + TCursor *tcursor = new TCursor (_relt); + + _cur_c3 = add_cursor (tcursor); + + select_cursor(_cur_c1); + prepara_pcon_temp(); + break; + } + case con_IV_direttiva: + case con_ana_bil: + init_sort(); + do_sort(); + select_cursor (_cur_c2); break; + default: + break; + } + //init_sort(); + + intesta (_tipo_stampa); + + printer().footerlen(5); + + return TRUE; + } + return FALSE; +} + +void CG1100_application::intesta (stampe tipo) +{ + int soh = 1; // riga d'inizio dell'intestazione + const long firm = get_firm(); + + reset_header (); + TLocalisamfile ditte(LF_NDITTE); + ditte.zero(); + ditte.put(NDT_CODDITTA, firm); + ditte.read(); + if (ditte.bad()) ditte.zero(); + + TString s(132); + s = ditte.get(NDT_RAGSOC); + TString data = _data_stampa.string(); + + set_header (soh++, "Ditta : %ld %s@110gData@115g%s Pag. @#", firm, (const char *) s, (const char*) data); + + + set_header (soh,"@0gPIANO DEI CONTI"); + + switch (tipo) + { + case completa: + set_header (soh++, "@20gStampa completa per IV direttiva"); + s.fill('-'); + set_header (soh++, (const char *) s); + set_header (soh++, "Conto @59gSez. Classe@75gTipo@86gNo Dettaglio@104gT@107gSpesa@118gDet.alleg.bil."); + set_header (soh++, "Sottoconto @16gDescrizione@61gIV dir.@75gConto@81gC/F@86gBilancio@97gComp.@104gA@107gRicavo@114gSez@118gSot.con * Mov."); + break; + + case con_IV_direttiva: + set_header (soh++, "@20gStampa conti riclassificati per IV direttiva"); + s.fill('-'); + set_header (soh++, (const char *) s); + set_header (soh++, "@58gCodici Piano@116gSez. e Classe"); + set_header (soh++, "Classe@14gDescrizione@58gdei Conti @73gDescrizione@116gdi segno opposto"); + + break; + + case senza_IV_direttiva: + set_header (soh++, "@20gStampa conti non collegati per IV direttiva"); + s.fill('-'); + set_header (soh++, (const char *) s); + set_header (soh++, "Conto @75gTipo@86gNo Dettaglio@104gT@107gSpesa@118gDet.alleg.bil."); + set_header (soh++, "Sottoconto @16gDescrizione@75gConto@81gC/F@86gBilancio@97gComp.@104gA@107gRicavo@114gSez@118gSot.con * Mov."); + break; + + case completa_bil: + soh++; + s.fill('-'); + set_header (soh++, "Conto@60gCod.tabella@75gTipo@86gNo Dettaglio@104gT@107gSpesa@118gDet.alleg.bil."); + set_header (soh++, "Sottoconto @16gDescrizione@60gAnalis.bil.@75gConto@81gC/F@86gBilancio@97gComp.@104gA@107gRicavo@114gSez@118gSot.con * Mov."); + break; + + case con_ana_bil: + soh++; + s.fill('-'); + set_header (soh++, (const char *) s); + set_header (soh++, "Codice @63gCodici Piano@118gDet.alleg.bil."); + set_header (soh++, "Tabella@12gDescrizione@63gdei Conti @76gDescrizione@118gSot.con * Mov."); + break; + + case senza_ana_bil: + soh++; + s.fill('-'); + set_header (soh++, (const char *) s); + set_header (soh++, "Conto@74gTipo@86gNo Dettaglio@107gSpesa@114gT@116gDett.alleg.bil."); + set_header (soh++, "Sottoconto@16gDescrizione@74gConto@81gC/F@86gBilancio@96gCompensaz.@107gRicavo@114gA@116gSot.con * Movim."); + break; + + default: + break; + } + + set_header (soh++,(const char*)s); + set_header (soh, ""); + +} + +const char* CG1100_application::descrizione_numero(char sezione, char lettera, int numr, int numero) +{ + TTable& tabivd = *_tab; + TString dep,dep2; + + tabivd.zero(); + if (numr == 0 && numero == 0) + dep = format("%c%c",sezione,lettera); + else + if (numero == 0) + { + if (numr != 0) + dep = format("%1c%1c%04d",sezione, lettera, numr); + else + dep = format("%c%c ",sezione,lettera); + } + else + { + if (numr != 0) + dep = format("%1c%1c%04d%02d",sezione, lettera, numr,numero); + else + dep = format("%c%c %02d",sezione,lettera,numero); + } + + tabivd.put("CODTAB", dep); + tabivd.read(); + dep2 = tabivd.get("CODTAB"); + if (dep == dep2) + tmp = tabivd.get("S0"); + else + tmp = ""; + return tmp; +} + +const char* CG1100_application::descrizione_codcbl(TString& codcbl) +{ + TLocalisamfile abpcon (LF_ABPCON); + + abpcon.setkey(1); + abpcon.zero(); + abpcon.put("CODCBL", codcbl); + if (abpcon.read() == NOERR) + tmp = abpcon.get("DESCR"); + else + tmp = ""; + return tmp; +} + +bool CG1100_application::user_create() +{ + _rel = new TRelation (LF_PCON); + _tab = new TTable(TAB_IVD); + _msk = new TMask ("cg1100a") ; + + _pcon = new TLocalisamfile (LF_PCON); + + TCursor *cursor = new TCursor (_rel); + + _cur_c1 = add_cursor (cursor); + +// _tpcon = new TIsamtempfile (LF_PCON, "ab", TRUE); +// _relt = new TRelation (_tpcon); +// TCursor *tcursor = new TCursor (_relt); + +// _cur_c3 = add_cursor (tcursor); + + _rec = new TRectype (cursor->curr()); + + _pcont_reclen = _rec->len(); + _sort = new TSort(_pcont_reclen); + + _cur_c2 = add_cursor (NULL); + + add_file(LF_PCON); + + //set_print_zero(); + + _tipo_stampa = completa; + _salto_pag = FALSE; + _bil = new bil_ivd; + _sort = new TSort(); + return TRUE; +} + +bool CG1100_application::user_destroy() +{ + delete _rel; + delete _tab; + delete _pcon; + //delete _tpcon; + delete _msk; + delete _rec; + // delete _descr; + delete _bil; + delete _sort; + return TRUE; +} + +int cg1100(int argc, char* argv[]) +{ + CG1100_application a; + a.run(argc, argv, "Stampa Piano dei Conti"); + return 0; +}