diff --git a/cg/cg1100.cpp b/cg/cg1100.cpp index 4c28b649a..1140b5e75 100755 --- a/cg/cg1100.cpp +++ b/cg/cg1100.cpp @@ -1,1462 +1,1462 @@ -// 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; -} +// 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; +} diff --git a/cg/cg4.cpp b/cg/cg4.cpp index a5af8bb16..30abe6e5e 100755 --- a/cg/cg4.cpp +++ b/cg/cg4.cpp @@ -1,36 +1,40 @@ -#include -#include - -#define __MAIN__ -#include "cg4.h" - -const char* const usage = "Errore - uso : %s -{0|1|2|3|4|5}"; - -int main(int argc,char** argv) -{ - const int n = argc > 1 ? atoi(argv[1]+1) : -1; - - switch (n) - { - case 0: - cg4100(argc,argv); break; - case 1: - cg4200(argc,argv); break; - case 2: - cg4300(argc,argv); break; - case 3: - cg4400(argc,argv); break; - case 4: - cg4500(argc,argv); break; - case 5: - cg4600(argc,argv); break; - default: - error_box(usage, argv[0]); - } - - return n < 0; -} - - - - +#include +#include + +#define __MAIN__ +#include "cg4.h" + +const char* const usage = "Errore - uso : %s -{0|1|2|3|4|5}"; + +int main(int argc,char** argv) +{ + const int n = argc > 1 ? atoi(argv[1]+1) : -1; + + switch (n) + { + case 0: + cg4100(argc,argv); break; + case 1: + cg4200(argc,argv); break; + case 2: + cg4300(argc,argv); break; + case 3: + cg4400(argc,argv); break; + case 4: + cg4500(argc,argv); break; + case 5: + cg4600(argc,argv); break; + case 6: + cg4700(argc,argv); break; + case 7: + cg4800(argc,argv); break; + default: + error_box(usage, argv[0]); + } + + return n < 0; +} + + + + diff --git a/cg/cg4.h b/cg/cg4.h index fd6ac8d10..50edc527e 100755 --- a/cg/cg4.h +++ b/cg/cg4.h @@ -1,26 +1,28 @@ -#ifndef __CG4_H -#define __CG4_H - -#ifndef __STRINGS_H -#include -#endif - -int cg4100(int argc, char* argv[]); -int cg4200(int argc, char* argv[]); -int cg4300(int argc, char* argv[]); -int cg4400(int argc, char* argv[]); -int cg4500(int argc, char* argv[]); -int cg4600(int argc, char* argv[]); - -#ifdef __MAIN__ -#define extern -#endif - -extern TString256 TMP; - -#ifdef __MAIN__ -#undef extern -#endif - -#endif // __CG4_H - +#ifndef __CG4_H +#define __CG4_H + +#ifndef __STRINGS_H +#include +#endif + +int cg4100(int argc, char* argv[]); +int cg4200(int argc, char* argv[]); +int cg4300(int argc, char* argv[]); +int cg4400(int argc, char* argv[]); +int cg4500(int argc, char* argv[]); +int cg4600(int argc, char* argv[]); +int cg4700(int argc, char* argv[]); +int cg4800(int argc, char* argv[]); + +#ifdef __MAIN__ +#define extern +#endif + +extern TString256 TMP; + +#ifdef __MAIN__ +#undef extern +#endif + +#endif // __CG4_H + diff --git a/cg/cg4.url b/cg/cg4.url index cf36a3063..792ffa330 100755 --- a/cg/cg4.url +++ b/cg/cg4.url @@ -1,53 +1,59 @@ -#include - -/* cg4 -0 Calcolo movimenti e saldi */ - -MENU TASK_MENUBAR - SUBMENU MENU_FILE "~File" - -/* cg4 -1 Copia archivi piano conti, causali, clienti/fornitori iv direttiva */ -MENUBAR MENU_BAR(1) - -MENU MENU_BAR(1) - SUBMENU MENU_FILE "~File" - -/* cg4 -2 Calcolo liquidazione IVA */ - -MENUBAR MENU_BAR(2) - -MENU MENU_BAR(2) - SUBMENU MENU_FILE "~File" -/* - ITEM BAR_ITEM(1) "~Liquidazione" - ITEM BAR_ITEM(2) "~Deleghe" - ITEM BAR_ITEM(3) "~Acconto" -*/ - -/* cg4 -3 Stampa registri IVA */ - -MENUBAR MENU_BAR(3) - -MENU MENU_BAR(3) - SUBMENU MENU_FILE "~File" - -/* cg4 -4 Apertura nuovo esercizio/nuovo esercizio IVA */ - -MENUBAR MENU_BAR(4) - -MENU MENU_BAR(4) - SUBMENU MENU_FILE "~File" - -/* cg4 -5 Chiusura Apertura Conti */ - -MENUBAR MENU_BAR(5) - -MENU MENU_BAR(5) - SUBMENU MENU_FILE "~File" - -/* cg4 -6 Visualizzazione liquidazione */ - -MENUBAR MENU_BAR(6) - -MENU MENU_BAR(6) - SUBMENU MENU_FILE "~File" - +#include + +/* cg4 -0 Calcolo movimenti e saldi */ + +MENU TASK_MENUBAR + SUBMENU MENU_FILE "~File" + +/* cg4 -1 Copia archivi piano conti, causali, clienti/fornitori iv direttiva */ +MENUBAR MENU_BAR(1) + +MENU MENU_BAR(1) + SUBMENU MENU_FILE "~File" + +/* cg4 -2 Calcolo liquidazione IVA */ + +MENUBAR MENU_BAR(2) + +MENU MENU_BAR(2) + SUBMENU MENU_FILE "~File" +/* + ITEM BAR_ITEM(1) "~Liquidazione" + ITEM BAR_ITEM(2) "~Deleghe" + ITEM BAR_ITEM(3) "~Acconto" +*/ + +/* cg4 -3 Stampa registri IVA */ + +MENUBAR MENU_BAR(3) + +MENU MENU_BAR(3) + SUBMENU MENU_FILE "~File" + +/* cg4 -4 Apertura nuovo esercizio/nuovo esercizio IVA */ + +MENUBAR MENU_BAR(4) + +MENU MENU_BAR(4) + SUBMENU MENU_FILE "~File" + +/* cg4 -5 Chiusura Apertura Conti */ + +MENUBAR MENU_BAR(5) + +MENU MENU_BAR(5) + SUBMENU MENU_FILE "~File" + +/* cg4 -6 Gestione acconti */ + +MENUBAR MENU_BAR(6) + +MENU MENU_BAR(6) + SUBMENU MENU_FILE "~File" + +/* cg4 -7 Creazione versam. acconti dicembre */ + +MENUBAR MENU_BAR(7) + +MENU MENU_BAR(7) + SUBMENU MENU_FILE "~File" \ No newline at end of file diff --git a/cg/cg4302.cpp b/cg/cg4302.cpp index 8b9eb2f36..908ab6509 100755 --- a/cg/cg4302.cpp +++ b/cg/cg4302.cpp @@ -1,701 +1,701 @@ -// ------------------------------------------------------------- -// calcolo liquidazioni -// part 3: utilities -// fv 2-2-94 -// -------------------------------------------------------------- - -#include -#include -#include - -#include "cg4300.h" - -bool TLiquidazione_app::is_trim(int x) - // TRUE se il mese passato e' un trimestre -{ return x == 3 || x == 6 || x == 9 || x == 12; } - -bool TLiquidazione_app::is_month_ok_strict(int x, int month) - // TRUE se il mese passato e' compatibile con il regime - // di liquidazione e (opz) non e' maggiore di quello scelto -{ - if (month == -1) month = x; - return _freqviva == "M" ? - ( x > 0 && x <= month) : - ( x <= month && is_trim(x)); -} - -bool TLiquidazione_app::is_month_plain(int x) - // la piu' semplice: vero se mese == _month o se fa parte del - // trimestre indicato da month -{ - bool ok = x == _month; - if (!ok && _freqviva == "T") - { - // aggiusta al trimestre il mese da calcolare - int mto = _month; - mto += 2 - ((mto-1) % 3); - ok = x > (mto - 3) && x <= mto; - } - return ok; -} - -bool TLiquidazione_app::is_month_ok(int x, int mtocalc) - // TRUE se il mese passato e' compatibile con il mese da calcolare - // rispetto al regime di liquidazione scelto -{ - bool ret = x == mtocalc; - if (!ret && _freqviva == "T" && mtocalc != 13) - { - // aggiusta al trimestre il mese da calcolare - mtocalc += 2 - ((mtocalc-1) % 3); - ret = x > (mtocalc - 3) && x <= mtocalc; - } - else if (!ret && mtocalc == 13) - { - // per l'annuale ritorna TRUE per tutti i mesi da liquidare - ret = x <= 13; - } - return ret; -} - -int TLiquidazione_app::liq_month(int x) - // ritorna il mese da liquidare (= LIM presente) - // che corrisponde al mese passato -{ - if (x == 13 || _freqviva == "M") - return x; - else return next_trim(x); -} - -int TLiquidazione_app::next_trim(int x) -{ - if (x == 13) x = 12; - return x + (2 - ((x-1) % 3)); -} - -bool TLiquidazione_app::is_in_liq_period(TDate& d) -{ - bool ok = FALSE; - if (_freqviva == "M") ok = d.month() == _month; - else - { - int m = liq_month(_month); - ok = d.month() > m - 3 && d.month() <= m; - } - return ok; -} - -bool TLiquidazione_app::is_first_month(int m) -{ - return _freqviva == "M" ? - m == 1 : m == 3; -} - -int TLiquidazione_app::previous_month(int m) -{ - // vale per LIM (mese o trimestre precedente) - if (_freqviva == "M") - return m == 1 ? 1 : m - 1; - else return m == 3 ? 3 : m - 3; -} - -bool TLiquidazione_app::is_date_ok(TDate& d, int month) - // TRUE se la data (di mov o pim) passata va considerata nel - // ricalcolo dei progressivi mensili per il mese e anno - // selezionati; se month == 13 vanno bene tutte purche' - // sia giusto l'anno -{ - if (d.month() > month || d.year() != atoi(_year)) - return FALSE; - if (month == 13) return d.month() <= month; - else return d.month() == month; -} - - -void TLiquidazione_app::add_ventilation(real iva, real howmuch, - const char* codiva, const char* other) -{ - _VentItem* vi = NULL; - for (int i = 0; i < _vent_arr.items(); i++) - { - vi = (_VentItem*)&_vent_arr[i]; - if (vi->_codiva == codiva) - break; - } - if (i == _vent_arr.items()) - { - _vent_arr.add(vi = new _VentItem); - vi->_aliquota = iva; - vi->_codiva = codiva; - vi->_other = other; - } - vi->_totale += howmuch; -} - -void TLiquidazione_app::add_vendite(int month, const char* codreg, - int tipodet, real& r) -{ - _VendItem* vi = NULL; - - for (int i = 0; i < _vend_arr.items(); i++) - { - vi = (_VendItem*)&_vend_arr[i]; - if (vi->_codreg == codreg && vi->_month == month && vi->_tipodet == tipodet) - break; - } - if (i == _vend_arr.items()) - { - _vend_arr.add(vi = new _VendItem); - vi->_codreg = codreg; - vi->_month = month; - vi->_tipodet = tipodet; - } - vi->_totale += r; -} - -void TLiquidazione_app::add_corrisp(int month, const char* codreg, real& r, - real& p, int tipodet, const char* codiva, - const char* codatt) -{ - _CorrItem* ci = NULL; - const int nitems = _corr_arr.items(); - - for (int i = 0; i < nitems; i++) - { - ci = (_CorrItem*)&_corr_arr[i]; - if (ci->_codreg == codreg && ci->_month == month && - ci->_codiva == codiva && ci->_tipodet == tipodet && - ci->_codatt == codatt) - break; - } - if (i == nitems) - { - _corr_arr.add(ci = new _CorrItem); - ci->_codreg = codreg; - ci->_month = month; - ci->_codiva = codiva; - ci->_codatt = codatt; - ci->_tipodet = tipodet; - ci->_aliquota = p; - } - ci->_totale += r; -} - - -bool TLiquidazione_app::look_pim(int month, const char* codatt, const char* codreg, - const char* tipocr, const char* codiva, int tipodet, - bool create) - // ritorna il PIM corrispondente alla chiave passata; se - // create = TRUE lo crea se non lo trova. Ritorna se c'era -{ - bool ok = FALSE; - _pim_r->zero(); - (*_pim_anno) = _year; - (*_pim_mese) = format("%02d", month); - (*_pim_codreg) = codreg; - (*_pim_codiva) = codiva; - (*_pim_codatt) = codatt; - (*_pim_tipocr) = tipocr; - (*_pim_tipodet) = tipodet; - - TString s = _pim_r->get("CODTAB"); - - _pim->read(); - ok = _pim->good(); - - if (!ok && create) - { - _pim_r->zero(); - _pim_r->put("CODTAB",s); - _pim->write(); - } - return ok; -} - -bool TLiquidazione_app::look_plm(int m, const char* a, bool create) -{ - bool ok = FALSE; - - _plm_r->zero(); - (*_plm_codatt) = format("%06ld", atol(a)); - (*_plm_mese) = format("%02d",m); - (*_plm_anno) = _year; - - TString s = _plm_r->get("CODTAB"); - _plm->read(); - ok = _plm->good(); - - if (!ok && create) - { - _plm_r->zero(); - _plm_r->put("CODTAB",s); - _plm->write(); - } - // crea/posiziona tabelle gemelle PAM, PUM, POM - look_pam(m,a,!ok); - look_pum(m,a,!ok); - look_pom(m,a,!ok); - return ok; -} - -bool TLiquidazione_app::look_pum(int m, const char* a, bool create) -{ - bool ok = FALSE; - - _pum->zero(); - (*_pum_codatt) = format("%06ld", atol(a)); - (*_pum_mese) = format("%02d",m); - (*_pum_anno) = _year; - - TString s = _pum->get("CODTAB"); - _pum->read(); - ok = _pum->good(); - - if (!ok && create) - { - _pum->zero(); - _pum->put("CODTAB",s); - _pum->write(); - } - return ok; -} - -bool TLiquidazione_app::look_pom(int m, const char* a, bool create) -{ - bool ok = FALSE; - - _pom->zero(); - (*_pom_codatt) = format("%06ld", atol(a)); - (*_pom_mese) = format("%02d",m); - (*_pom_anno) = _year; - - TString s = _pom->get("CODTAB"); - _pom->read(); - ok = _pom->good(); - - if (!ok && create) - { - _pom->zero(); - _pom->put("CODTAB",s); - _pom->write(); - } - return ok; -} - -bool TLiquidazione_app::look_pam(int m, const char* a, bool create) -{ - bool ok = FALSE; - - _pam->zero(); - (*_pam_codatt) = format("%06ld", atol(a)); - (*_pam_mese) = format("%02d",m); - (*_pam_anno) = _year; - - TString s = _pam->get("CODTAB"); - _pam->read(); - ok = _pam->good(); - - if (!ok && create) - { - _pam->zero(); - _pam->put("CODTAB",s); - _pam->write(); - } - return ok; -} - -bool TLiquidazione_app::look_lim(int m, bool create) -{ - bool ok = FALSE; - - _lim_r->zero(); - (*_lim_mese) = format("%02d",m); - (*_lim_anno) = _year; - - TString s = _lim_r->get("CODTAB"); - _lim->read(); - ok = _lim->good(); - - if (!ok && create) - { - _lim_r->zero(); - _lim_r->put("CODTAB",s); - _lim->write(); - } - - // crea o posiziona la tabella gemella LAM - look_lam(m, !ok); - - return ok; -} - -bool TLiquidazione_app::look_lam(int m, bool create) -{ - bool ok = FALSE; - - _lam_r->zero(); - (*_lam_mese) = format("%02d",m); - (*_lam_anno) = _year; - - TString s = _lam_r->get("CODTAB"); - _lam->read(); - ok = _lam->good(); - - if (!ok && create) - { - _lam_r->zero(); - _lam_r->put("CODTAB",s); - _lam->write(); - } - return ok; -} - -bool TLiquidazione_app::look_pla(const char* a, bool create) -{ - bool ok = FALSE; - _pla_r->zero(); - - // forza il tipoatt a 1 - char buf[10]; strcpy(buf,a); - buf[strlen(buf) - 1] = '1'; - - (*_pla_ditta) = format("%05ld", get_firm()); - (*_pla_anno) = _year; - (*_pla_codatt) = format("%06ld", atol(buf)); - - TString16 s = _pla_r->get("CODTAB"); - _pla->read(); - ok = _pla->good(); - - if (!ok && create) - { - real es_b1, es_b2, es_b3, prorata; - // alla creazione del PLA - // si prendono i valori di prorata e plafond dall'anno scorso - _pla_r->zero(); - (*_pla_ditta) = format("%05ld", get_firm()); - (*_pla_anno) = atoi(_year) - 1; - (*_pla_codatt) = format("%06ld", atol(buf)); - if (_pla->read() == NOERR) - { - es_b1 = _pla->get_real("R1"); - es_b2 = _pla->get_real("R2"); - es_b3 = _pla->get_real("R3"); - es_b1 = _pla->get_real("R9"); - } - _pla->zero(); - _pla_r->put("CODTAB",s); - _pla->put("R5",es_b1); - _pla->put("R6",es_b2); - _pla->put("R7",es_b3); - _pla->put("R8",prorata); - _pla->write(); - } - return ok; -} - -bool TLiquidazione_app::look_reg(const char* reg) -{ - _reg_r->zero(); - TString s(12); s << _year; s << format("%-3s",reg); - _reg_r->put("CODTAB",(const char*)s); - _reg->read(); - return _reg->good(); -} - -bool TLiquidazione_app::look_iva(const char* cod) -{ - _iva->zero(); - _iva->put("CODTAB",cod); - _iva->read(); - return _iva->good(); -} - -bool TLiquidazione_app::look_ppa(int month, const char* codatt, int type, bool create) -{ - _ppa->zero(); - (*_ppa_year) = _year; - (*_ppa_month) = format("%02d",month); - (*_ppa_codatt) = format("%06ld", atol(codatt)); - (*_ppa_kind) = type; - TString ctab = _ppa_r->get("CODTAB"); - _ppa->read(); - - bool ok = _ppa->good(); - - if (!ok && create) - { - _ppa_r->zero(); - _ppa_r->put("CODTAB",ctab); - _ppa->write(); - } - return ok; -} - - -bool TLiquidazione_app::look_del(int month, int type, bool create) -{ - // se chiamata con il flag di creazione, aggiorna le info su - // codici tributo, concessione, conto fiscale anche se la - // delega esiste gia' - - long ditta = _nditte->curr().get_long("CODDITTA"); - _del->zero(); - (*_del_ditta) = format("%05ld", ditta); - (*_del_anno) = _year; - (*_del_mese) = format("%02d", month); - (*_del_tipo) = format("%1d", type); - - TString16 ctab = _del->get("CODTAB"); - _del->read(); - - bool ok = _del->good(); - - if (!ok && create) - { - _del->zero(); - _del->put("CODTAB",ctab); - } - if (create) - { - // vedi se titolare conto fiscale - bool titcf = FALSE; - bool isdel = FALSE; - TLocalisamfile anag(LF_ANAG); - anag.zero(); - anag.put("TIPOA", _nditte->lfile().get("TIPOA")); - anag.put("CODANAGR", _nditte->lfile().get("CODANAGR")); - if (anag.read() == NOERR) - { - titcf = anag.get_bool("TITCF"); - isdel = anag.get_long("TIPOSTDEL") == 0l; - } - - if (!titcf || isdel) - { - // non titolare conto fiscale oppure paga con delega: - // cerca banca - // codici ABI e CAB da anagrafica ditte - TString abi = _nditte->lfile().get("ABIBAN"); - TString cab = _nditte->lfile().get("CABBAN"); - - if (abi.empty()) - { - abi = anag.get("CODABI"); - abi = anag.get("CODCAB"); - } - - _del->put("S7", abi); - _del->put("S8", cab); - - // descrizione banca - TTable ban("%BAN"); - ban.zero(); - TString codban = format("%05ld", atol(abi)); - if (!cab.empty()) codban << format("%05ld", atol(cab)); - ban.put("CODTAB", codban); - if (ban.read() != NOERR) - { - TString desban(ban.get("S0")); - _del->put("S1", desban); - } - } - else - { - // non usa delega bensi' bollettino o distinta: - // cerca concessione comune - // infila ufficio concessione in S9 - // e descrizione comune in S2 - TString16 con; TString uva; - if (look_conc(con, uva)) - { - _del->put("S9", con); - _del->put("S2", uva); - } - } - - // scrive codice tributo - int ctri = 6000; - if (month == 13 && type == 7) - ctri = 6035; // acconto IVA annuale (trimestrali?) - else if (month == 13 && type == 1) - ctri = 6099; // IVA annuale - else if (month < 13 && type == 7) - ctri = 6013; // acconto mensile - else if (month < 13 && type == 1) // regular - ctri = _freqviva == "M" ? 6000 + month : 6030 + (month/3); - - _del->put("S6", format("%d",ctri)); - - if (!ok) _del->write(); - else _del->rewrite(); - } - return ok; -} - -bool TLiquidazione_app::look_lia(long ditta, bool create, int year) -{ - if (year == 0) year = atoi(_year); - if (ditta == 0l) ditta = get_firm(); - TString16 y; y.format("%05ld%04d", ditta, year); - - _lia->zero(); - _lia->put("CODTAB", y); - _lia->read(); - const bool ok = _lia->good(); - if (!ok && create) - { - _lia->zero(); - _lia->put("CODTAB", y); - _lia->put("S7", _freqviva); - _lia->write(); - } - return ok; -} - -real TLiquidazione_app::result_liq(int month) - // risultato esatto della liquidazione del mese month, <0 a credito - // > 0 a debito; comprende TUTTI, anche il conguaglio prorata in annuale -{ - real r(0.0); - // ulteriori detrazioni, acconti, versamenti, - // rettifiche, conguagli sono gia' compresi in R0 - if (look_lim(month)) - r = _lim->get_real("R0"); - return r; -} - - -real TLiquidazione_app::debt_prec(int month) -{ - real r(0.0); - if (!is_first_month(month)) - { - if (look_lim(previous_month(month))) - { - r = result_liq(previous_month(month)); - if (!(r.sign() > 0 && r < IVA_DA_RIPORTARE)) - r = ZERO; - } - } - return r; -} - - -real TLiquidazione_app::credito_prec(int month) - // ritorna l'appropriato credito precedente al mese in corso -{ - real c(0.0); - - if (is_first_month(month)) - { - // credito inizio anno - if (look_lia()) - c = _lia->get_real("R0"); - // e' positivo o 0 - } -else -{ - c = result_liq(previous_month(month)); - if (c.sign() < 0) c = abs(c); - else c = real(0.0); -} - -return c; -} - -real TLiquidazione_app::credito_costo_prec(int month) - // ritorna l'appropriato credito di costo precedente al mese in corso - // (travel agency only) -{ - real c(0.0); - if (is_first_month(month)) - { - // credito inizio anno - if (look_lia()) - c = _lia->get_real("R5"); - } - else - { - if (look_lim(previous_month(month))) - // qui il rimborso non c'e' - c = _lim->get_real("R2"); - } - look_lim(month); - return c; -} - - -real TLiquidazione_app::versamenti_IVA(int month, const char* types, bool intr) -{ - real ret(0.0); TToken_string typ(types); - - for (int i = 0; i < typ.items(); i++) - { - int tp = typ.get_int(i); - if (look_del(month,tp)) - { - if (_del->get_bool("B0") || _is_visliq) // solo se stampata, a meno - // che non sia per visliq - ret += _del->get_real("R0"); - if (intr) ret -= _del->get_real("R1"); // al netto degli interessi - } - } - return ret; -} - -real TLiquidazione_app::aliquota_agvia() -{ - TConfig cnf(CONFIG_STUDIO); - look_iva(cnf.get("CodAgv")); - real r = _iva->get_real("R0"); - return r; -} - - -real TLiquidazione_app::interesse_trimestrale(int month) -{ - month /= 3; month--; - TConfig cnf(CONFIG_STUDIO); - real r(cnf.get("InTr", NULL, month)); - return r; -} - - -bool TLiquidazione_app::look_conc(TString& uffcon, TString& uffiva) -{ - // piazza nelle TString passate: l'ufficio concessioni - // l'ufficio IVA. Quest'ultimo e' preso dall'anagrafica se - // c'e', dal comune (primo non vuoto) se non - - // Assume _nditte correctly positioned - TString ana(_nditte->lfile().get("TIPOA")); - TString codana(_nditte->lfile().get("CODANAGR")); - // look anagrafica - TLocalisamfile anagr(LF_ANAG); - anagr.zero(); - anagr.put("TIPOA", ana); - anagr.put("CODANAGR", codana); - if (anagr.read() != NOERR) return FALSE; - - // becca comune residenza fiscale - TString com(anagr.get("COMRF")); - // se non c'e', residenza - if (com.empty()) - com = anagr.get("COMRES"); - - if (com.empty()) return FALSE; - - // becca comune - TLocalisamfile comuni(LF_COMUNI); - comuni.zero(); // STATO = "" ovvero ITAGLIA - comuni.put("COM", com); - if (comuni.read() != NOERR) return FALSE; - - uffcon = comuni.get("UFFCONC"); - uffiva = comuni.get("DENCOM"); - if (!comuni.get("PROVCOM").empty()) - uffiva << " (" << comuni.get("PROVCOM") << ")"; - - return TRUE; -} +// ------------------------------------------------------------- +// calcolo liquidazioni +// part 3: utilities +// fv 2-2-94 +// -------------------------------------------------------------- + +#include +#include +#include + +#include "cg4300.h" + +bool TLiquidazione_app::is_trim(int x) + // TRUE se il mese passato e' un trimestre +{ return x == 3 || x == 6 || x == 9 || x == 12; } + +bool TLiquidazione_app::is_month_ok_strict(int x, int month) + // TRUE se il mese passato e' compatibile con il regime + // di liquidazione e (opz) non e' maggiore di quello scelto +{ + if (month == -1) month = x; + return _freqviva == "M" ? + ( x > 0 && x <= month) : + ( x <= month && is_trim(x)); +} + +bool TLiquidazione_app::is_month_plain(int x) + // la piu' semplice: vero se mese == _month o se fa parte del + // trimestre indicato da month +{ + bool ok = x == _month; + if (!ok && _freqviva == "T") + { + // aggiusta al trimestre il mese da calcolare + int mto = _month; + mto += 2 - ((mto-1) % 3); + ok = x > (mto - 3) && x <= mto; + } + return ok; +} + +bool TLiquidazione_app::is_month_ok(int x, int mtocalc) + // TRUE se il mese passato e' compatibile con il mese da calcolare + // rispetto al regime di liquidazione scelto +{ + bool ret = x == mtocalc; + if (!ret && _freqviva == "T" && mtocalc != 13) + { + // aggiusta al trimestre il mese da calcolare + mtocalc += 2 - ((mtocalc-1) % 3); + ret = x > (mtocalc - 3) && x <= mtocalc; + } + else if (!ret && mtocalc == 13) + { + // per l'annuale ritorna TRUE per tutti i mesi da liquidare + ret = x <= 13; + } + return ret; +} + +int TLiquidazione_app::liq_month(int x) + // ritorna il mese da liquidare (= LIM presente) + // che corrisponde al mese passato +{ + if (x == 13 || _freqviva == "M") + return x; + else return next_trim(x); +} + +int TLiquidazione_app::next_trim(int x) +{ + if (x == 13) x = 12; + return x + (2 - ((x-1) % 3)); +} + +bool TLiquidazione_app::is_in_liq_period(TDate& d) +{ + bool ok = FALSE; + if (_freqviva == "M") ok = d.month() == _month; + else + { + int m = liq_month(_month); + ok = d.month() > m - 3 && d.month() <= m; + } + return ok; +} + +bool TLiquidazione_app::is_first_month(int m) +{ + return _freqviva == "M" ? + m == 1 : m == 3; +} + +int TLiquidazione_app::previous_month(int m) +{ + // vale per LIM (mese o trimestre precedente) + if (_freqviva == "M") + return m == 1 ? 1 : m - 1; + else return m == 3 ? 3 : m - 3; +} + +bool TLiquidazione_app::is_date_ok(TDate& d, int month) + // TRUE se la data (di mov o pim) passata va considerata nel + // ricalcolo dei progressivi mensili per il mese e anno + // selezionati; se month == 13 vanno bene tutte purche' + // sia giusto l'anno +{ + if (d.month() > month || d.year() != atoi(_year)) + return FALSE; + if (month == 13) return d.month() <= month; + else return d.month() == month; +} + + +void TLiquidazione_app::add_ventilation(real iva, real howmuch, + const char* codiva, const char* other) +{ + _VentItem* vi = NULL; + for (int i = 0; i < _vent_arr.items(); i++) + { + vi = (_VentItem*)&_vent_arr[i]; + if (vi->_codiva == codiva) + break; + } + if (i == _vent_arr.items()) + { + _vent_arr.add(vi = new _VentItem); + vi->_aliquota = iva; + vi->_codiva = codiva; + vi->_other = other; + } + vi->_totale += howmuch; +} + +void TLiquidazione_app::add_vendite(int month, const char* codreg, + int tipodet, real& r) +{ + _VendItem* vi = NULL; + + for (int i = 0; i < _vend_arr.items(); i++) + { + vi = (_VendItem*)&_vend_arr[i]; + if (vi->_codreg == codreg && vi->_month == month && vi->_tipodet == tipodet) + break; + } + if (i == _vend_arr.items()) + { + _vend_arr.add(vi = new _VendItem); + vi->_codreg = codreg; + vi->_month = month; + vi->_tipodet = tipodet; + } + vi->_totale += r; +} + +void TLiquidazione_app::add_corrisp(int month, const char* codreg, real& r, + real& p, int tipodet, const char* codiva, + const char* codatt) +{ + _CorrItem* ci = NULL; + const int nitems = _corr_arr.items(); + + for (int i = 0; i < nitems; i++) + { + ci = (_CorrItem*)&_corr_arr[i]; + if (ci->_codreg == codreg && ci->_month == month && + ci->_codiva == codiva && ci->_tipodet == tipodet && + ci->_codatt == codatt) + break; + } + if (i == nitems) + { + _corr_arr.add(ci = new _CorrItem); + ci->_codreg = codreg; + ci->_month = month; + ci->_codiva = codiva; + ci->_codatt = codatt; + ci->_tipodet = tipodet; + ci->_aliquota = p; + } + ci->_totale += r; +} + + +bool TLiquidazione_app::look_pim(int month, const char* codatt, const char* codreg, + const char* tipocr, const char* codiva, int tipodet, + bool create) + // ritorna il PIM corrispondente alla chiave passata; se + // create = TRUE lo crea se non lo trova. Ritorna se c'era +{ + bool ok = FALSE; + _pim_r->zero(); + (*_pim_anno) = _year; + (*_pim_mese) = format("%02d", month); + (*_pim_codreg) = codreg; + (*_pim_codiva) = codiva; + (*_pim_codatt) = codatt; + (*_pim_tipocr) = tipocr; + (*_pim_tipodet) = tipodet; + + TString s = _pim_r->get("CODTAB"); + + _pim->read(); + ok = _pim->good(); + + if (!ok && create) + { + _pim_r->zero(); + _pim_r->put("CODTAB",s); + _pim->write(); + } + return ok; +} + +bool TLiquidazione_app::look_plm(int m, const char* a, bool create) +{ + bool ok = FALSE; + + _plm_r->zero(); + (*_plm_codatt) = format("%06ld", atol(a)); + (*_plm_mese) = format("%02d",m); + (*_plm_anno) = _year; + + TString s = _plm_r->get("CODTAB"); + _plm->read(); + ok = _plm->good(); + + if (!ok && create) + { + _plm_r->zero(); + _plm_r->put("CODTAB",s); + _plm->write(); + } + // crea/posiziona tabelle gemelle PAM, PUM, POM + look_pam(m,a,!ok); + look_pum(m,a,!ok); + look_pom(m,a,!ok); + return ok; +} + +bool TLiquidazione_app::look_pum(int m, const char* a, bool create) +{ + bool ok = FALSE; + + _pum->zero(); + (*_pum_codatt) = format("%06ld", atol(a)); + (*_pum_mese) = format("%02d",m); + (*_pum_anno) = _year; + + TString s = _pum->get("CODTAB"); + _pum->read(); + ok = _pum->good(); + + if (!ok && create) + { + _pum->zero(); + _pum->put("CODTAB",s); + _pum->write(); + } + return ok; +} + +bool TLiquidazione_app::look_pom(int m, const char* a, bool create) +{ + bool ok = FALSE; + + _pom->zero(); + (*_pom_codatt) = format("%06ld", atol(a)); + (*_pom_mese) = format("%02d",m); + (*_pom_anno) = _year; + + TString s = _pom->get("CODTAB"); + _pom->read(); + ok = _pom->good(); + + if (!ok && create) + { + _pom->zero(); + _pom->put("CODTAB",s); + _pom->write(); + } + return ok; +} + +bool TLiquidazione_app::look_pam(int m, const char* a, bool create) +{ + bool ok = FALSE; + + _pam->zero(); + (*_pam_codatt) = format("%06ld", atol(a)); + (*_pam_mese) = format("%02d",m); + (*_pam_anno) = _year; + + TString s = _pam->get("CODTAB"); + _pam->read(); + ok = _pam->good(); + + if (!ok && create) + { + _pam->zero(); + _pam->put("CODTAB",s); + _pam->write(); + } + return ok; +} + +bool TLiquidazione_app::look_lim(int m, bool create) +{ + bool ok = FALSE; + + _lim_r->zero(); + (*_lim_mese) = format("%02d",m); + (*_lim_anno) = _year; + + TString s = _lim_r->get("CODTAB"); + _lim->read(); + ok = _lim->good(); + + if (!ok && create) + { + _lim_r->zero(); + _lim_r->put("CODTAB",s); + _lim->write(); + } + + // crea o posiziona la tabella gemella LAM + look_lam(m, !ok); + + return ok; +} + +bool TLiquidazione_app::look_lam(int m, bool create) +{ + bool ok = FALSE; + + _lam_r->zero(); + (*_lam_mese) = format("%02d",m); + (*_lam_anno) = _year; + + TString s = _lam_r->get("CODTAB"); + _lam->read(); + ok = _lam->good(); + + if (!ok && create) + { + _lam_r->zero(); + _lam_r->put("CODTAB",s); + _lam->write(); + } + return ok; +} + +bool TLiquidazione_app::look_pla(const char* a, bool create) +{ + bool ok = FALSE; + _pla_r->zero(); + + // forza il tipoatt a 1 + char buf[10]; strcpy(buf,a); + buf[strlen(buf) - 1] = '1'; + + (*_pla_ditta) = format("%05ld", get_firm()); + (*_pla_anno) = _year; + (*_pla_codatt) = format("%06ld", atol(buf)); + + TString16 s = _pla_r->get("CODTAB"); + _pla->read(); + ok = _pla->good(); + + if (!ok && create) + { + real es_b1, es_b2, es_b3, prorata; + // alla creazione del PLA + // si prendono i valori di prorata e plafond dall'anno scorso + _pla_r->zero(); + (*_pla_ditta) = format("%05ld", get_firm()); + (*_pla_anno) = atoi(_year) - 1; + (*_pla_codatt) = format("%06ld", atol(buf)); + if (_pla->read() == NOERR) + { + es_b1 = _pla->get_real("R1"); + es_b2 = _pla->get_real("R2"); + es_b3 = _pla->get_real("R3"); + es_b1 = _pla->get_real("R9"); + } + _pla->zero(); + _pla_r->put("CODTAB",s); + _pla->put("R5",es_b1); + _pla->put("R6",es_b2); + _pla->put("R7",es_b3); + _pla->put("R8",prorata); + _pla->write(); + } + return ok; +} + +bool TLiquidazione_app::look_reg(const char* reg) +{ + _reg_r->zero(); + TString s(12); s << _year; s << format("%-3s",reg); + _reg_r->put("CODTAB",(const char*)s); + _reg->read(); + return _reg->good(); +} + +bool TLiquidazione_app::look_iva(const char* cod) +{ + _iva->zero(); + _iva->put("CODTAB",cod); + _iva->read(); + return _iva->good(); +} + +bool TLiquidazione_app::look_ppa(int month, const char* codatt, int type, bool create) +{ + _ppa->zero(); + (*_ppa_year) = _year; + (*_ppa_month) = format("%02d",month); + (*_ppa_codatt) = format("%06ld", atol(codatt)); + (*_ppa_kind) = type; + TString ctab = _ppa_r->get("CODTAB"); + _ppa->read(); + + bool ok = _ppa->good(); + + if (!ok && create) + { + _ppa_r->zero(); + _ppa_r->put("CODTAB",ctab); + _ppa->write(); + } + return ok; +} + + +bool TLiquidazione_app::look_del(int month, int type, bool create) +{ + // se chiamata con il flag di creazione, aggiorna le info su + // codici tributo, concessione, conto fiscale anche se la + // delega esiste gia' + + long ditta = _nditte->curr().get_long("CODDITTA"); + _del->zero(); + (*_del_ditta) = format("%05ld", ditta); + (*_del_anno) = _year; + (*_del_mese) = format("%02d", month); + (*_del_tipo) = format("%1d", type); + + TString16 ctab = _del->get("CODTAB"); + _del->read(); + + bool ok = _del->good(); + + if (!ok && create) + { + _del->zero(); + _del->put("CODTAB",ctab); + } + if (create) + { + // vedi se titolare conto fiscale + bool titcf = FALSE; + bool isdel = FALSE; + TLocalisamfile anag(LF_ANAG); + anag.zero(); + anag.put("TIPOA", _nditte->lfile().get("TIPOA")); + anag.put("CODANAGR", _nditte->lfile().get("CODANAGR")); + if (anag.read() == NOERR) + { + titcf = anag.get_bool("TITCF"); + isdel = anag.get_long("TIPOSTDEL") == 0l; + } + + if (!titcf || isdel) + { + // non titolare conto fiscale oppure paga con delega: + // cerca banca + // codici ABI e CAB da anagrafica ditte + TString abi = _nditte->lfile().get("ABIBAN"); + TString cab = _nditte->lfile().get("CABBAN"); + + if (abi.empty()) + { + abi = anag.get("CODABI"); + cab = anag.get("CODCAB"); + } + + _del->put("S7", abi); + _del->put("S8", cab); + + // descrizione banca + TTable ban("%BAN"); + ban.zero(); + TString codban = format("%05ld", atol(abi)); + if (!cab.empty()) codban << format("%05ld", atol(cab)); + ban.put("CODTAB", codban); + if (ban.read() != NOERR) + { + TString desban(ban.get("S0")); + _del->put("S1", desban); + } + } + else + { + // non usa delega bensi' bollettino o distinta: + // cerca concessione comune + // infila ufficio concessione in S9 + // e descrizione comune in S2 + TString16 con; TString uva; + if (look_conc(con, uva)) + { + _del->put("S9", con); + _del->put("S2", uva); + } + } + + // scrive codice tributo + int ctri = 6000; + if (month == 13 && type == 7) + ctri = 6035; // acconto IVA annuale (trimestrali?) + else if (month == 13 && type == 1) + ctri = 6099; // IVA annuale + else if (month < 13 && type == 7) + ctri = 6013; // acconto mensile + else if (month < 13 && type == 1) // regular + ctri = _freqviva == "M" ? 6000 + month : 6030 + (month/3); + + _del->put("S6", format("%d",ctri)); + + if (!ok) _del->write(); + else _del->rewrite(); + } + return ok; +} + +bool TLiquidazione_app::look_lia(long ditta, bool create, int year) +{ + if (year == 0) year = atoi(_year); + if (ditta == 0l) ditta = get_firm(); + TString16 y; y.format("%05ld%04d", ditta, year); + + _lia->zero(); + _lia->put("CODTAB", y); + _lia->read(); + const bool ok = _lia->good(); + if (!ok && create) + { + _lia->zero(); + _lia->put("CODTAB", y); + _lia->put("S7", _freqviva); + _lia->write(); + } + return ok; +} + +real TLiquidazione_app::result_liq(int month) + // risultato esatto della liquidazione del mese month, <0 a credito + // > 0 a debito; comprende TUTTI, anche il conguaglio prorata in annuale +{ + real r(0.0); + // ulteriori detrazioni, acconti, versamenti, + // rettifiche, conguagli sono gia' compresi in R0 + if (look_lim(month)) + r = _lim->get_real("R0"); + return r; +} + + +real TLiquidazione_app::debt_prec(int month) +{ + real r(0.0); + if (!is_first_month(month)) + { + if (look_lim(previous_month(month))) + { + r = result_liq(previous_month(month)); + if (!(r.sign() > 0 && r < IVA_DA_RIPORTARE)) + r = ZERO; + } + } + return r; +} + + +real TLiquidazione_app::credito_prec(int month) + // ritorna l'appropriato credito precedente al mese in corso +{ + real c(0.0); + + if (is_first_month(month)) + { + // credito inizio anno + if (look_lia()) + c = _lia->get_real("R0"); + // e' positivo o 0 + } +else +{ + c = result_liq(previous_month(month)); + if (c.sign() < 0) c = abs(c); + else c = real(0.0); +} + +return c; +} + +real TLiquidazione_app::credito_costo_prec(int month) + // ritorna l'appropriato credito di costo precedente al mese in corso + // (travel agency only) +{ + real c(0.0); + if (is_first_month(month)) + { + // credito inizio anno + if (look_lia()) + c = _lia->get_real("R5"); + } + else + { + if (look_lim(previous_month(month))) + // qui il rimborso non c'e' + c = _lim->get_real("R2"); + } + look_lim(month); + return c; +} + + +real TLiquidazione_app::versamenti_IVA(int month, const char* types, bool intr) +{ + real ret(0.0); TToken_string typ(types); + + for (int i = 0; i < typ.items(); i++) + { + int tp = typ.get_int(i); + if (look_del(month,tp)) + { + if (_del->get_bool("B0") || _is_visliq) // solo se stampata, a meno + // che non sia per visliq + ret += _del->get_real("R0"); + if (intr) ret -= _del->get_real("R1"); // al netto degli interessi + } + } + return ret; +} + +real TLiquidazione_app::aliquota_agvia() +{ + TConfig cnf(CONFIG_STUDIO); + look_iva(cnf.get("CodAgv")); + real r = _iva->get_real("R0"); + return r; +} + + +real TLiquidazione_app::interesse_trimestrale(int month) +{ + month /= 3; month--; + TConfig cnf(CONFIG_STUDIO); + real r(cnf.get("InTr", NULL, month)); + return r; +} + + +bool TLiquidazione_app::look_conc(TString& uffcon, TString& uffiva) +{ + // piazza nelle TString passate: l'ufficio concessioni + // l'ufficio IVA. Quest'ultimo e' preso dall'anagrafica se + // c'e', dal comune (primo non vuoto) se non + + // Assume _nditte correctly positioned + TString ana(_nditte->lfile().get("TIPOA")); + TString codana(_nditte->lfile().get("CODANAGR")); + // look anagrafica + TLocalisamfile anagr(LF_ANAG); + anagr.zero(); + anagr.put("TIPOA", ana); + anagr.put("CODANAGR", codana); + if (anagr.read() != NOERR) return FALSE; + + // becca comune residenza fiscale + TString com(anagr.get("COMRF")); + // se non c'e', residenza + if (com.empty()) + com = anagr.get("COMRES"); + + if (com.empty()) return FALSE; + + // becca comune + TLocalisamfile comuni(LF_COMUNI); + comuni.zero(); // STATO = "" ovvero ITAGLIA + comuni.put("COM", com); + if (comuni.read() != NOERR) return FALSE; + + uffcon = comuni.get("UFFCONC"); + uffiva = comuni.get("DENCOM"); + if (!comuni.get("PROVCOM").empty()) + uffiva << " (" << comuni.get("PROVCOM") << ")"; + + return TRUE; +} diff --git a/cg/cg4304.cpp b/cg/cg4304.cpp index 28e85bb04..a69998247 100755 --- a/cg/cg4304.cpp +++ b/cg/cg4304.cpp @@ -1,1986 +1,1988 @@ -// ------------------------------------------------------------ -// Calcolo liquidazioni -// Part 5: stampa -// fv 21-1-94 -// ------------------------------------------------------------ - -#include - -#include "cg4300.h" - -// flags per annuale -#define IS_PRORATA 0x0001 - - -// minchietta per prospetto ventilazione -class _vDesc : public TObject -{ -public: - TString _codiva; - real _acq; - real _vnd; - real _viv; - _vDesc() : _codiva(5) {} - virtual ~_vDesc() {} -}; - -static char sep[] = -"------------------------------------------------------------------" -"------------------------------------------------------------------"; - -void TLiquidazione_app::set_page(int file, int cnt) -{ - _DescrItem& d = (_DescrItem&)_descr_arr[cnt]; - - set_auto_ff(FALSE); - reset_print(); - - switch(d._flags) - { - case CHG_PARMS: - set_att(d); - break; - case SET_FIRM: - set_firm(d); - break; - case PIM_ROW: - set_pim(d); - break; - case PIM_HEAD: - set_pim_head(); - break; - case MISC_LIQ: - set_pumpam(d); - break; - case TOT_ROW: - set_plm(d); - break; - case PLAFOND: - set_plafond(d); - break; - case VENTILA: - set_ventila(d); - break; - case REGAGR: - set_regagr(d); - break; - case REGVIA: - set_viaggio(d); - break; - case THE_END: - set_grand(d); - break; - case ACCONTO: - set_acconto_p(d); - break; - case ACCHEAD: - set_acchead_p(d); - break; - case DELDEB: - set_deltab(d, FALSE); - break; - case DELCRED: - set_deltab(d, TRUE); - break; - } -} - -print_action TLiquidazione_app::postprocess_page(int file, int cnt) -{ - if (_descr_arr.items() == 0 || cnt == _descr_arr.items()-1) - return NEXT_PAGE; - return REPEAT_PAGE; -} - -bool TLiquidazione_app::preprocess_page(int file, int cnt) -{ - return _descr_arr.items() != 0; -} - -// ---------------------------------------------------------------- -// Print description -// ---------------------------------------------------------------- - -void TLiquidazione_app::describe_att(int month, const char* codatt, - bool isresult, char flags) -{ - TToken_string atts(codatt); - - if (_isprint && _canprint) - { - describe_name(month, atts, flags); - if (atts.items() == 1 && _isplafond) - describe_plafond(month, codatt); - if (atts.items() == 1 && _isvent) - describe_ventilation(month, codatt); - if (atts.items() == 1 && _isagricolo) - describe_agricolo(month, codatt); - if (atts.items() == 1 && _isviaggio) - describe_viaggio(month, codatt); - if (/* isresult || month == 13 */ TRUE) - describe_pims(month,codatt); - if (atts.items() == 1) - describe_consistence(codatt); - } -} - -void TLiquidazione_app::describe_name(int month, TToken_string& codatts, char flags) -{ - _DescrItem* d = new _DescrItem(CHG_PARMS); - - d->_s0 = _nditte->curr().get("CODDITTA"); - d->_s1 = _nditte->curr().get("RAGSOC"); - d->_s2 = _nditte->curr(LF_ATTIV).get("CODATT"); - d->_s3 = codatts.items() == 1 ? (const char*)_nditte->curr(LF_ATTIV).get("DESCR") : ""; - d->_s4 = _freqviva; - - d->_f1 = month; - d->_f2 = _isbenzinaro; - d->_f3 = (word)flags; - - if (_mixed && codatts.items() == 1) - d->_f0 = atoi(codatts.mid(5)); - else d->_f0 = 0; - _descr_arr.add(d); -} - -void TLiquidazione_app::describe_firm(int month) -{ - if (!_isprint || !_canprint) return; - - _DescrItem* d = new _DescrItem(SET_FIRM); - - d->_s0 = _nditte->curr().get("CODDITTA"); - d->_s1 = _nditte->curr().get("RAGSOC"); - d->_s2 = _freqviva; - d->_f1 = month; - _descr_arr.add(d); - -} - - -void TLiquidazione_app::describe_plafond(int month, const char* codatt) -{ - // prepara la descrizione del riepilogo da stampare e lo accoda - real t1, t2, t3; - _DescrItem* d = new _DescrItem(PLAFOND); - - for (int jj = 1; jj <= 3; jj++) // three types of plafond - { - t1 = 0.0; t2 = 0.0; t3 = 0.0; - for (int m = 1; m <= month && m < 13; m++) - { - if (is_month_ok(m,month) && look_ppa(m,codatt,jj)) - { - t1 += _ppa->get_real("R0"); - t2 += _ppa->get_real("R1"); - t3 = _ppa->get_real("R2"); - } - } - switch (jj) - { - case 1: - d->_r0 = t1; d->_r1 = t2; d->_r2 = t3; - break; - case 2: - d->_r3 = t1; d->_r4 = t2; d->_r5 = t3; - break; - case 3: - d->_r6 = t1; d->_r7 = t2; d->_r8 = t3; - break; - } - } // for tipo esenzione plafond - - _descr_arr.add(d); - - // bookmark -} - -void TLiquidazione_app::describe_ventilation(int month, const char* codatt) -{ - if (!_isvent || _isagricolo || _isviaggio) return; - - _DescrItem* d = new _DescrItem(VENTILA); - TString att(codatt); - - look_plm(month, att); - - for (_pim->first(); !_pim->eof(); _pim->next()) - { - if (strcmp(*_pim_codatt,att) != 0) - continue; - - look_reg(*_pim_codreg); - look_iva(*_pim_codiva); - - int tipocr = atoi(*_pim_tipocr); - int tipodet = atoi(*_pim_tipodet); - int mese = atoi(*_pim_mese); - bool corrisp = _reg->get_bool("B0"); - real imponibile = _pim->get_real("R0"); - real imposta = _pim->get_real("R1"); - tiporeg tipomov = (tiporeg)_reg->get_long("I0"); - TString tipoiva = _iva->get("S1"); - - if (_year != *_pim_anno) continue; - - if (imponibile.is_zero() && imposta.is_zero()) continue; - - // questi non vanno in liquidazione, i totali sono - // gia' calcolati altrove - if (tipodet == 1 || (tipodet == 3 && tipocr == 5) || tipodet == 9) - continue; - - // questi non si devono vedere perche' so' bbrutti - if (tipoiva == "NS" || tipoiva == "ES" || tipoiva == "NI") - continue; - - if (mese <= month) - { - if (tipocr == 1 && tipomov == acquisto) - { - // somma agli acquisti - _vDesc* vd = NULL; - for (int i = 0; i < d->_arr.items(); i++) - { - _vDesc* vv = (_vDesc*)&(d->_arr[i]); - if (strcmp(vv->_codiva,*_pim_codiva) == 0) - { vd = vv; break; } - } - if (vd == NULL) { vd = new _vDesc; } - - vd->_acq += (imponibile+imposta); - d->_r0 += (imponibile+imposta); - - if (vd->_codiva.empty()) - { - vd->_codiva = *_pim_codiva; - d->_arr.add(vd); - } - } - else if ((is_month_ok(mese,month) || month == 13) && corrisp - && _pim->get_bool("B1") && - tipocr == 0 && tipomov == vendita) - // non sono sicurissimo della above condition - { - // somma alle vendite - _vDesc* vd = NULL; - for (int i = 0; i < d->_arr.items(); i++) - { - _vDesc* vv = (_vDesc*)&(d->_arr[i]); - if (strcmp(vv->_codiva,*_pim_codiva) == 0) - { vd = vv; break; } - } - if (vd == NULL) { vd = new _vDesc; } - - vd->_vnd += imponibile; - vd->_viv += imposta; - - d->_r1 += imponibile+imposta; - - if (vd->_codiva.empty()) - { - vd->_codiva = *_pim_codiva; - d->_arr.add(vd); - } - } - } - } - if (d->_r1.is_zero() || d->_r0.is_zero()) - delete d; - else - _descr_arr.add(d); -} - -void TLiquidazione_app::describe_agricolo(int month, const char* codatt) -{ - _DescrItem* d = new _DescrItem(REGAGR); - - for (int mese = 1; mese <= month; mese++) - { - if (!is_month_ok(mese,month)) - continue; - - if (!look_plm(mese, codatt)) - continue; - - d->_r0 += _plm->get_real("R5"); - d->_r1 += _plm->get_real("R6"); - d->_r2 += _plm->get_real("R7"); - d->_r3 += _plm->get_real("R8"); - d->_r4 += _plm->get_real("R9"); - d->_r5 += _plm->get_real("R10"); - d->_r6 += _plm->get_real("R11"); - d->_r7 += _pum->get_real("R10"); - d->_r8 += _pum->get_real("R11"); - } - _descr_arr.add(d); -} - -void TLiquidazione_app::describe_viaggio(int month, const char* codatt) -{ - if (!look_lim(month)) return; - - _DescrItem* d = new _DescrItem(REGVIA); - - for (int mese = 1; mese <= month; mese++) - { - if (!is_month_ok(mese,month) || !look_plm(mese, codatt)) - continue; - - d->_r0 += _plm->get_real("R5"); // corrispettivi CEE - d->_r1 += _plm->get_real("R9"); // corrispettivi misti CEE - d->_r2 += _plm->get_real("R6"); // corrispettivi fuori CE - d->_r3 += _plm->get_real("R7"); // acquisti CEE - d->_r4 += _plm->get_real("R10"); // acquisti misti parte CEE - d->_r5 += _plm->get_real("R8"); // acquisti fuori CEE - d->_r6 += _plm->get_real("R11"); // acquisti misti parte fuori CEE - } - - // credito di costo precedente (CHECK annuale) - d->_r8 = credito_costo_prec(month); - - _descr_arr.add(d); -} - - -void TLiquidazione_app::describe_pims(int month, const char* codatt) - // le si passa una tokenstring (o un codatt) e lei, da brava, calcola - // cumulando per tutte le attivita' nominatele - // ogni riga riguarda un codiva ma tutti i registri - // se il mese e' 13 si guarda tutto l'anno - // se si tratta di una sola attivita' in att. mista evidenziata o servizievole, - // stampa solo vendite e corrispettivi -{ - TToken_string atts(codatt); - TString ref(atts.items() == 1 ? codatt : "ALL"); - const char* tmpatt; - int last = _descr_arr.last(); - bool isfirst = TRUE; - real t0, t1, t2, t3, t4, t5; - real autodafe, autodafe_iva; - - bool skip_acq = atts.items() == 1 && _mixed; - - // descrittore riga autodafe' - _DescrItem* ads = NULL; - // descrittore riga iva dovuta ag. viaggio' - _DescrItem* iads = NULL; - // questa cazzata serve per far apparire l'intestazione delle colonne - // anche se le colonne non ci sono; in tal modo si ottiene una peggior - // chiarezza, una peggiore efficienza, una gran rottura di coglioni, - // ma risulta identico al dio Sistema. - _DescrItem* hea = new _DescrItem(PIM_HEAD); - _descr_arr.add(hea); - - while ((tmpatt = atts.get()) != NULL) - { - TString att(tmpatt); - - for (_pim->first(); !_pim->eof(); _pim->next()) - { - _DescrItem* d = NULL; - // compute - bool ok = look_reg(*_pim_codreg); - ok |= look_iva(*_pim_codiva); - bool isnew = FALSE; - - if (!ok) continue; - - tiporeg tipomov = (tiporeg)_reg->get_long("I0"); - bool corrisp = _reg->get_bool("B0"); - TString tipoiva = _iva->get("S1"); - int tipodet = atoi(*_pim_tipodet); - TString codiva((const char*)(*_pim_codiva)); - TString other = _pim->get("S4"); - - // ACHTUNG! Corrispettivi da ventileer possono ventilare - // ad un altro codiva; in tal caso si scrive quello - if (corrisp && !other.empty()) - { - look_iva(other); - codiva = other; - } - // se e' corrispettivo da ventilare non - // scrivo un cannolo ripieno visto che e' stato ventilato - if (tipomov == vendita && tipoiva == "VE") continue; - - // se e' il dettaglio di una attivita' mista non stampa - // gli acquisti, il perche' losalamadonna - if (tipomov == acquisto && skip_acq) continue; - - // questi non vanno in liquidazione, i totali sono - // gia' calcolati altrove - if (tipodet == 1 || tipodet == 3 || tipodet == 9) - continue; - - // se ha tutti gli importi nulli viene da un annullamento di - // progressivi esistenti (achtung fatture con scontrino) - if (_pim->get_real("R0").is_zero() && - _pim->get_real("R1").is_zero() && - _pim->get_real("R2").is_zero() && - _pim->get_real("R5").is_zero() && - _pim->get_real("R6").is_zero()) - continue; - - if (strcmp((const char*)*_pim_codatt, att) == 0 && - (is_month_ok(atoi(*_pim_mese),month)) && - _year == (const char*)*_pim_anno) - { - // vedi se c'e' gia' un item corrispondente - for(int i = last+1; i < _descr_arr.items(); i++) - { - d = (_DescrItem*)&_descr_arr[i]; - if (d->_flags == PIM_ROW && - d->_s0 == ref && - d->_s1 == codiva) - break; - if (d->_s1 > codiva) - { - isnew = TRUE; - _DescrItem* dd = new _DescrItem(PIM_ROW); - // CicciaPrassi li vuole in ordine crescente - _descr_arr.insert(dd,i); - // che due maron stereofonic: se quello dopo - // era il primo, quello prima va dopo - if (d->_f0) - { - dd->_f0 = TRUE; - d->_f0 = FALSE; - } - else if (isfirst) - { - d->_f0 = TRUE; - isfirst = FALSE; - } - d = dd; - break; - } - } - if (!isnew && i == _descr_arr.items()) - { - isnew = TRUE; - d = new _DescrItem(PIM_ROW); - if (isfirst) { d->_f0 = TRUE; isfirst = FALSE; } - _descr_arr.add(d); - } - - if (tipomov == acquisto) - { - d->_r4 += _pim->get_real("R0"); - d->_r5 += _pim->get_real("R1"); - t4 += _pim->get_real("R0"); - t5 += _pim->get_real("R1"); - } - else // vendita - { - // vedi corrispettivi veri e falsi - real cvi = _pim->get_real("R0"); // imp. totale - real cvv = _pim->get_real("R1"); // iva totale - real cfi = _pim->get_real("R13"); // imp. falsi corrispettivi - real cfv = _pim->get_real("R14"); // iva falsi corrispettivi - - if (corrisp) - { - cvi -= cfi; - cvv -= cfv; - } - - if (corrisp) - { - // usa R0 e R1 visto che la ventilazione e' gia' - // stata calcolata - real ifs(_pim->get_real("R5")); // imp. fatture con scontrino - real vfs(_pim->get_real("R6")); // iva fatture con scontrino - - d->_r2 += (cvi /* - ifs */); // tolgo FS dai corrispettivi - d->_r3 += (cvv /* - vfs */); - d->_r0 += ifs; // aggiungo FS alle vendite - d->_r1 += vfs; - t2 += (cvi /* - ifs */); // idem per i totali - t3 += (cvv /* - vfs */); // non sono molto convinto ma vogliono cio' - t0 += ifs; // ...avevo ragione e infatti l'ho cambiato - t1 += vfs; - } - - if (!corrisp || (!cfv.is_zero() || !cfi.is_zero())) - { - real adf, adi; // autofatture non residenti art. 17 - - real vendi = corrisp ? cfi : _pim->get_real("R0"); - real vendv = corrisp ? cfv : _pim->get_real("R1"); - - // si scorporano solo per l'annuale, altrimenti - // vengono normalmente considerati nelle vendite - if (month == 13) - { - adf = _pim->get_real("R7"); - adi = _pim->get_real("R8"); - } - - d->_r0 += vendi - adf; - d->_r1 += vendv - adi; - t0 += vendi /* - adf */; - t1 += vendv /* - adi */; - - autodafe += adf; - autodafe_iva += adi; - } - } - if (isnew) - { - d->_s0 = ref; - d->_s1 = codiva; - // flag per stampare l'intestazione colonne - } - } - } - - look_plm(month,att); - real iva74t = _pom->get_real("R13"); - if (iva74t.sign() > 0) - { - if(iads == NULL) iads = new _DescrItem(PIM_ROW); - iads->_s0 = "74TER"; // cosi' vollero - iads->_s1 = "IVA "; // cosi' vollero - iads->_s2 = " dovuta - 74 ter"; // cosi' vollero - iads->_r1 += iva74t; - t1 += iva74t; - if (isfirst) - { - isfirst = FALSE; - iads->_f0 = TRUE; - } - } - } - - if (autodafe.sign() > 0 || autodafe_iva.sign() > 0) - { - _DescrItem* ads = new _DescrItem(PIM_ROW); - ads->_s0 = ref; - ads->_s1 = "A35"; // cosi' vollero - ads->_r0 = autodafe; - ads->_r1 = autodafe_iva; - if (isfirst) - { - isfirst = FALSE; - ads->_f0 = TRUE; - } - _descr_arr.add(ads); - } - - // ag. viaggio: iva dovuta 74 ter la vogliono in mezzo ai progressivi - if (iads != NULL) _descr_arr.add(iads); - - // prepara una bella riga di totali - if (/* !isfirst */ TRUE) - { - _DescrItem* d = new _DescrItem(TOT_ROW); - d->_r0 = t0; d->_r1 = t1; - d->_r2 = t2; d->_r3 = t3; - d->_r4 = t4; d->_r5 = t5; - - // aggiunge dati ptm - _DescrItem* t = new _DescrItem(MISC_LIQ); - t->_f1 = isfirst; // per il form feed - - TToken_string ttm("0|0|0"); - - for (int m = 1; m <= month && m < 13; m++) - { - if (!is_month_ok(m,month)) continue; - - atts.restart(); - while ((tmpatt = atts.get()) != NULL) - { - TString att(tmpatt); - look_plm(m, att); - real ad1, ad2; - - d->_r6 += _pom->get_real("R0"); // acq. intracomunitari - d->_r7 += _pom->get_real("R1"); // inded. art 19 - d->_r8 += _pom->get_real("R2"); // IVA su inded. art. 19 - t->_r0 += _pom->get_real("R3"); // acq. ammortizz. detr - t->_r1 += _pom->get_real("R4"); // IVA acq. ammort. detr - t->_r2 += _pum->get_real("R2"); // ammort. detr. 6% - t->_r3 += _pum->get_real("R3"); // IVA ammort detr. 6% - t->_r4 += _pom->get_real("R5"); // acq. beni rivendita - t->_r5 += _pom->get_real("R6"); // IVA acq. beni rivendita - t->_r6 += _pom->get_real("R7"); // acq. leasing - t->_r7 += _pom->get_real("R8"); // IVA acq. leasing - t->_r8 += _pum->get_real("R0"); // cessioni beni ammort. - t->_r9 += _pum->get_real("R1"); // IVA su cessioni ammort. - t->_r10 += _pum->get_real("R4"); // tot. esenti IVA - t->_r11 += _plm->get_real("R2"); // pro-rata indetraibile - - ad1 = real(ttm.get(1)); - ad2 = real(ttm.get(2)); - ad1 += _pom->get_real("R11"); - ad2 += _pom->get_real("R12"); - ttm.add(_plm->get("R12"), 0); // % pro-rata - ttm.add(ad1.string(),1); // imp. acq. amm. indetr. - ttm.add(ad2.string(),2); // IVA acq. amm. indetr - t->_s0 = ttm; - - t->_f0 = !_prorata.is_zero() && (month != 13); // flag per segnalare l'esistenza - d->_r9 += _pom->get_real("R9"); // acq. inded. su ricavi esenti - d->_r10 += _pom->get_real("R10"); // IVA acq. inded. su ricavi esenti - - // passaggi interni - real aipip(d->_s0); // progressivo ... - real aipivp(d->_s1); // ... (che mazzata sulle palle...) - aipip += _pum->get_real("R8"); // acq. inded. per pass. int - aipivp += _pum->get_real("R9"); // IVA acq. inded. per pass. int - d->_s0 = aipip.string(); // risbatto ... - d->_s1 = aipivp.string(); // .. - - // spese generali. - real spgnp(t->_s2); // progressivo ... - real spgnvp(t->_s3); // ... (che doppia mazzata sulle palle...) - spgnp += _pam->get_real("R10"); // spese generali. - spgnvp += _pam->get_real("R11"); // IVA spese generali. - t->_s2 = spgnp.string(); // risbatto ... - t->_s3 = spgnvp.string(); // .. - - // sospensione imposta: non piu' due palle, ma QUATTRO - TToken_string tt(t->_s4); - real aqsi(tt.get(0)); - real aqsv(tt.get(1)); - real vnsi(tt.get(2)); - real vnsv(tt.get(3)); - - aqsi += _pam->get_real("R6"); - aqsv += _pam->get_real("R7"); - vnsi += _pam->get_real("R8"); - vnsv += _pam->get_real("R9"); - - tt = ""; - tt.add(aqsi.string()); - tt.add(aqsv.string()); - tt.add(vnsi.string()); - tt.add(vnsv.string()); - t->_s4 = tt; - - } // while (attivita') - } // for (mese ok) - - - // annual follows in _arr - if (month == 13 && ref != "ALL") - { - // tutte quelle cose che vanno alla liquidazione annuale, come il - // calcolo del prorata o del nuovo plafond o .... - if (look_pla(codatt)) - { - real v1 = _pla->get_real("R14"); - real v2(_pla->get("S1")); - real ris = v1 + v2; - real e1 = _pla->get_real("R1"); - real e2 = _pla->get_real("R2"); - real e3 = _pla->get_real("R3"); - real am = _pla->get_real("R4"); - real iaq = _pla->get_real("R11"); // IVA acquisti - real ppg = _pla->get_real("R12"); // pro-rata pagato - - // calcola nuovo prorata per ogni attivita' (miste: 1+2) - real pr(0.0); - if (!ris.is_zero()) - pr = (e1/ris) * CENTO; - real co = 0.0; - real topay = 0.0; - pr.round(ROUND_LIRA); - if (pr != _prorata) - { - // calcolo conguaglio -- se positivo e' a debito - topay = (iaq + ppg) * (pr / CENTO); - topay.round(ROUND_MILLELIRE); - co = topay - ppg; - co.round(ROUND_MILLELIRE); - } - - _DescrItem* dd = new _DescrItem(ANNUAL); - - // prorata - if (!_prorata.is_zero()) - dd->_f0 |= IS_PRORATA; - dd->_r0 = ris; - dd->_r1 = e1; - dd->_r2 = pr; - dd->_r3 = co; - dd->_r4 = e2; - dd->_r5 = e3; - dd->_r6 = topay; - t->_arr.add(dd); - } - } - _descr_arr.add(d); - _descr_arr.add(t); - } -} - - -void TLiquidazione_app::describe_liq(int month, const char* codatts, - _DescrItem* di) -{ - if (!_isprint || !_canprint) return; - - if (!look_lim(month)) return; - - _DescrItem* d = new _DescrItem(THE_END); - - // gli diamo la stessa struttura di LIM - d->_r0 = _lim->get_real("R0"); - d->_r1 = _lim->get_real("R1"); - d->_r2 = _lim->get_real("R2"); - d->_r3 = _lim->get_real("R3"); - d->_r4 = _lim->get_real("R4"); - d->_r5 = _lim->get_real("R5"); - d->_r6 = _lim->get_real("R6"); - d->_r7 = _lim->get_real("R14"); - d->_r9 = _lim->get_real("R9"); - d->_r10 = _lim->get_real("R7"); // totale conguaglio prorata - - TToken_string tt(80); - tt.add(_lam->get_real("R0").string()); - tt.add(_lam->get_real("R1").string()); - tt.add(_lam->get_real("R2").string()); - tt.add(_lam->get_real("R3").string()); - - d->_s0 = tt; - d->_s1 = _lim->get_real("R11").string(); - d->_s2 = _lim->get_real("R12").string(); - d->_s3 = _lim->get_real("R13").string(); - - // descrizione rettifiche - if (month < 13) - { - d->_s4 = _lim->get("S0"); - d->_s5 = _lim->get("S1"); - } - d->_r11 = (const char*)_lim->get("R10"); // tasso di interesse - - d->_f1 = is_first_month(month); - - if (_is_visliq) - { - // tutti i versamenti, sempre e comunque - d->_r8 = versamenti_IVA(_month, "1"); - } - else - // rispettiamo tutte le casistiche per i versamenti - d->_r8 = _lim->get_real("R8"); - - - // aggiunge eventuale satellite per rimborso infraannuale - if (di != NULL) - { - if (d->_r0.sign() < 0) - d->_arr.add(di); - else delete di; - } - - if (!_is_visliq) - { - _DescrItem* dv = describe_deleghe(month); - if (dv != NULL) d->_arr.add(dv); - } - _descr_arr.add(d); -} - -_DescrItem* TLiquidazione_app::describe_deleghe(int month) -{ - if (!look_del(month,1)) return NULL; - - _DescrItem* d = new _DescrItem(DELEGA); - - if (_del->get_bool("B0")) - { - d->_s0 = _del->get("S2"); // localita' - d->_s1 = _del->get("S1"); // banca - d->_s2 = _del->get("S7"); // ABI - d->_s3 = _del->get("S8"); // CAB - d->_r0 = _del->get_real("R0"); - d->_d0 = _del->get_date("D0"); - } // altrimenti lascia tutto in bianco e ci scriveranno i dati a mano - - return d; -} - -void TLiquidazione_app::describe_consistence(const char* codatt) -{ - // controlla eventuali condizioni di conflitto con le normative - // per la ditta e crea i messaggi appropriati - // tutte le condizioni sono valutate sull'esercizio precedente - int pryear = atoi(_year) - 1; - TString att = codatt; - - _pla->zero(); - *_pla_ditta = get_firm(); - *_pla_anno = pryear; - *_pla_codatt = att; - - if (_pla->read() == NOERR) - { - real va = _pla->get_real("R0"); - - // 1) consistenza volume d'affari <-> frequenza versamenti - // deve essere: trimestrale ammesso solo se < 360.000.000 - // per servizi, < 1.000.000.000 per altre imprese - // a meno che non sia benzinaro che ha diritto comunque - - if (_freqviva == "T" && !_isbenzinaro) - { - bool err = FALSE; - if (_isservizio) err = va > SOGLIA_TRIM_SERVIZI; - else err = va > SOGLIA_TRIM_ALTRE; - if (err) - describe_error("Incoerenza volume affari/frequenza versamenti", - att); - } - } -} - - -void TLiquidazione_app::describe_error(const char* err, const char* codatt) -{ - if (!_isprint || !_canprint) return; - _errors.add(new _ErrItem(err,codatt,_nditte->curr().get("CODDITTA"))); -} - -// ---------------------------------------------------------------- -// Setrows -// ---------------------------------------------------------------- - -void TLiquidazione_app::set_firm(_DescrItem& d) -{ - TString tim_title(80); - tim_title << "Liquidazione IVA"; - - if (d._f1 == 13) - tim_title << format(": Riepilogo Annuale %s",(const char*)_year); - else - { - if (d._s2 == "T") - tim_title << format(" del %d° Trimestre %s", d._f1/3, (const char *) _year); - else - tim_title << format(" del mese di %s %s", itom(d._f1), - (const char*)_year); - } - - reset_header(); - int soh = 1; - if (!_isregis) - { - set_header(soh++,"Ditta %s %s@109gData @<@125gPag. @#", - (const char*)(d._s0), (const char*)(d._s1)); - set_header(soh++,""); - } - set_header(soh++,sep); - set_header(soh++,"%s@102gFrequenza %s", - (const char*)tim_title, - d._s2 == "T" ? "Trimestrale" : "Mensile"); - set_header(soh++,sep); - set_header(soh++,""); - - // notify errors if any - int j = 0; - for (int i = 0; i < _errors.items(); i++) - { - _ErrItem& s = (_ErrItem&)_errors[i]; - if (s._att == "ALL" && s._firm == d._s0) - { j++; set_row(i+3, "@5g@b*** %s ***@r", (const char*)s._err); } - } - if (j) set_row(i+3,""); -} - - -void TLiquidazione_app::set_att(_DescrItem& d) -{ - // set header - TString tim_title(78); - TString att_title(48); - - // Bookmark - TString book_name(d._s3); - char flags = (char)d._f3; - - if (flags == '1') book_name << " (servizi)"; - else if (flags == '2') book_name << " (altre)"; - else if (flags == 'M') book_name = "Riepilogo att. mista"; - else if (flags == 'Q') book_name = "Riepilogo quater"; - - if (_firm_bookmark == -1) - _firm_bookmark = set_bookmark(d._s1); - _att_bookmark = set_bookmark(book_name, _firm_bookmark); - - tim_title << "Liquidazione IVA"; - - if (d._f1 == 13) - { - if (d._s4 == "T" && !(d._f2)) // trimestrale e non benzinaro - tim_title << format(": Riepilogo Annuale %s",(const char*)_year); - else - tim_title << format(": Dichiarazione Annuale %s",(const char*)_year); - } - else - { - if (d._s4 == "T") - tim_title << format(" del %d° Trimestre %s", d._f1/3, (const char *) _year); - else - tim_title << format(" del mese di %s %s", itom(d._f1), - (const char*)_year); - } - - TString tipatt; - - if (d._f0 > 0) - tipatt.format(d._f0 == 1 ? "SERVIZI" : "ALTRE ATTIVITA'"); - - if (d._s3.empty()) - { - att_title = flags == 'M' ? "Riepilogo attivita' mista" : - "Riepilogo quater"; - // att_title << d._s2; - } - else - att_title = format("Attivita' %s %s %s", - (const char*)(d._s2), - (const char*)(d._s3), - (const char*)tipatt); - - reset_header(); - int soh = 1; - if (!_isregis) - { - set_header(soh++,"Ditta %s %s@109gData @<@125gPag. @#", - (const char*)(d._s0), (const char*)(d._s1)); - set_header(soh++,""); - } - set_header(soh++,sep); - set_header(soh++,"%s@55g%s", (const char*)tim_title, (const char*)att_title); - set_header(soh++,sep); - set_header(soh++,""); - - // notify errors if any - int j = 0; - for (int i = 0; i < _errors.items(); i++) - { - _ErrItem& s = (_ErrItem&)_errors[i]; - if (d._s2 == s._att && s._firm == d._s0) - { j++; set_row(i+10, "@5g@b*** %s ***@r", (const char*)s._err); } - } - if (j) set_auto_ff(TRUE); -} - - -void TLiquidazione_app::set_plafond(_DescrItem& d) -{ - if (_isregis) return; - - set_bookmark("Quadro plafond", _att_bookmark); - - real r1 = d._r2 - d._r1 - d._r0; - real r2 = d._r5 - d._r4 - d._r3; - real r3 = d._r8 - d._r7 - d._r6; - - set_print_zero(TRUE); - - set_row(1,"QUADRO RELATIVO ALLA DISPONIBILITA' ED ALL'UTILIZZO " - "MENSILE DEI PLAFOND"); - - set_row(2,""); set_row(3,""); - set_row(4,"Art. 8 1° comma lettere a-b@31gDisponibile@48g%r", - &(d._r2)); - set_row(5,"Utilizzato all'interno@48g%r", &(d._r0)); - set_row(6,"Utilizzato per l'importazione@48g%r@69gRiporto@78g%r", - &(d._r1), &r1); - - set_row(7,""); - set_row(8,"Art. 8bis 1° comma@31gDisponibile@48g%r", - &(d._r5)); - set_row(9,"Utilizzato all'interno@48g%r", &(d._r3)); - set_row(10,"Utilizzato per l'importazione@48g%r@69gRiporto@78g%r", - &(d._r4), &(r2)); - - set_row(11,""); - set_row(12,"Art. 9 1° comma@31gDisponibile@48g%r", - &(d._r8)); - set_row(13,"Utilizzato all'interno@48g%r", &(d._r6)); - set_row(14,"Utilizzato per l'importazione@48g%r@69gRiporto@78g%r", - &(d._r7), &r3); - - set_print_zero(FALSE); - set_auto_ff(); -} - -void TLiquidazione_app::set_pim_head() -{ - set_bookmark("Riepilogo progressivi", _att_bookmark); - set_row(1," Cod.@41gVENDITE@71gCORRISPETTIVI@106gACQUISTI"); - set_row(2," IVA Descrizione@30gImponibile@49gImposta@63gImponibile" - "@82gImposta@96gImponibile@115gImposta"); - set_row(3,""); -} - -void TLiquidazione_app::set_pim(_DescrItem& d) -{ - // succede con le autocazzate non residenti non movimentate eccetera - if ((d._r0 + d._r1 + d._r2 + d._r3 + d._r4 + d._r5) == ZERO) - return; - - int rw = 1; - if (d._s1 == "A35") - d._s2 = "Artt.17c3/74c1"; - else if (d._s0 == "74TER") - rw++; - else - { - look_iva(d._s1); - d._s2 = _iva->get("S0"); - if (d._s2.len() > 19) d._s2.cut(19); - } - - if (d._f0) // e' il primo: non fa piu' nulla perche' l'intestazione - // viene fatta comunque da set_pim_head - {} - - set_row(rw++,"%4s %s@25g%r@41g%r@58g%r@74g%r@91g%r@107g%r", - (const char*)d._s1, - (const char*)d._s2, - &(d._r0), - &(d._r1), - &(d._r2), - &(d._r3), - &(d._r4), - &(d._r5)); -} - -void TLiquidazione_app::set_plm(_DescrItem& d) -{ - int rw = 1; - if (!(d._r0.is_zero() && - d._r1.is_zero() && - d._r2.is_zero() && - d._r3.is_zero() && - d._r4.is_zero() && - d._r5.is_zero())) - { - set_row(rw++,""); set_row(rw++,""); - set_row(rw++,"Totale@25g%r@41g%r@58g%r@74g%r@91g%r@107g%r", - &(d._r0), - &(d._r1), - &(d._r2), - &(d._r3), - &(d._r4), - &(d._r5)); - set_row(rw++,""); - } - if (!d._r6.is_zero()) - { - set_row(rw++,"di cui per acquisti intracomunitari@107g%r", &(d._r6)); - } - if (!(d._r7.is_zero() && d._r8.is_zero())) - { - set_row(rw++,"Totali acquisti indeducibili per art.19@91g%r@107g%r", - &(d._r7), &(d._r8)); - } - if (! (d._r9.is_zero() && d._r10.is_zero())) - { - set_row(rw++, "Totale acquisti indeducibili su ricavi esenti@91g%r@107g%r", - &(d._r9), - &(d._r10)); - } - - real acq_pint(d._s0); - real acq_pint_iva(d._s1); - - if (! (acq_pint.is_zero() && acq_pint_iva.is_zero())) - { - set_row(rw++, "Totale acquisti indeducibili per passaggi interni@91g%r@107g%r", - &acq_pint, - &acq_pint_iva); - } - - real tot1 = d._r7 + d._r4 + d._r9 + acq_pint; - real tot2 = d._r8 + d._r5 + d._r10 + acq_pint_iva; - - if (tot1 != d._r4 || tot2 != d._r5) - { - // i corrispettivi finiscono nelle vendite - d._r0 += d._r2; - d._r1 += d._r3; - d._r2 = ZERO; - d._r3 = ZERO; - // per ora lascio r2 e r3 anche se sono sempre 0 - set_row(rw++, ""); - set_row(rw++,"Totale Generale IVA@25g%r@41g%r@58g%r@74g%r@91g%r@107g%r", - &(d._r0), - &(d._r1), - &(d._r2), - &(d._r3), - &tot1, - &tot2); - } -} - - -void TLiquidazione_app::set_pumpam(_DescrItem& d) -{ - bool printed = FALSE; - - // d._f1 dice se c'era qualcosa sopra nella stessa pagina - real spgn(d._s2); - real spgn_iva(d._s3); - - TToken_string tt(d._s4); // Token String - TToken_string dp(d._s0); // Due Palle - real aqsi(tt.get(0)); - real aqsv(tt.get(1)); - real vnsi(tt.get(2)); - real vnsv(tt.get(3)); - real ammindi(dp.get(1)); - real ammindv(dp.get(2)); - - int row = 5; - - if (!(aqsi.is_zero() && aqsv.is_zero())) - { - printed = TRUE; - set_row(row++, "Acquisti in sospensione di imposta@50g%r@69g%r", - &aqsi, - &aqsv); - } - if (!(vnsi.is_zero() && vnsv.is_zero())) - { - printed = TRUE; - set_row(row++, "Vendite in sospensione di imposta@50g%r@69g%r", - &vnsi, - &vnsv); - } - if (!(d._r8.is_zero() && d._r9.is_zero())) - { - printed = TRUE; - set_row(row++, "Cessione beni ammortizzabili@50g%r@69g%r", - &(d._r8), - &(d._r9)); - } - if (! (d._r4.is_zero() && d._r5.is_zero())) - { - printed = TRUE; - set_row(row++, "Acquisto beni destinati alla rivendita@50g%r@69g%r", - &(d._r4), - &(d._r5)); - } - if (! (ammindi.is_zero() && ammindv.is_zero())) - { - printed = TRUE; - set_row(row++, "Acquisto beni ammortizzabili IVA indetraibile@50g%r@69g%r", - &ammindi, - &ammindv); - } - if (! (d._r0.is_zero() && d._r1.is_zero())) - { - printed = TRUE; - set_row(row++, "Acquisto beni ammortizzabili IVA detraibile@50g%r@69g%r", - &(d._r0), - &(d._r1)); - } - if (!(d._r6.is_zero() && d._r7.is_zero())) - { - printed = TRUE; - set_row(row++, "Altri beni strumentali acquisiti in leasing@50g%r@69g%r", - &(d._r6), - &(d._r7)); - } - if (!(d._r2.is_zero() && d._r3.is_zero())) - { - printed = TRUE; - real rn = d._r2 * real(DETRAZIONE_6PERCENTO); - set_row(row++, "Acquisto beni soggetti a detrazione (6%%)" - "@50g%r@69g%r@86g%r", - &(d._r2), - &(d._r3), - &rn); - } - if (!(spgn.is_zero() && spgn_iva.is_zero())) - { - printed = TRUE; - set_row(row++, "Spese generali@50g%r@69g%r", - &spgn, - &spgn_iva); - } - if (d._f0) - { - printed = TRUE; - real prc(dp.get(0)); - - set_row(row++, "%% PRO-RATA ed IVA non detraibile (%s%%)@69g%r", - (const char*)prc.string(), &(d._r11)); - } - - // items vari per dichiarazione annuale - for (int i = 0; i < d._arr.items(); i++) - { - _DescrItem& dd = (_DescrItem&)d._arr[i]; - printed |= set_annual(dd); - } - - if (printed) - { - set_bookmark("Altri dati", _att_bookmark); - - set_row(1,""); - set_row(2,""); - set_row(3,"ALTRI DATI RELATIVI ALLA DICHIARAZIONE@55gimponibile" - "@77gimposta@91gdetrazione"); - set_row(4,""); - } - else /* if (!d._f1) */ - set_row(1,""); - - // form feed - /* if (printed || !d._f1) */ set_auto_ff(TRUE); -} - -void TLiquidazione_app::set_grand(_DescrItem& d) -{ - real& risultato = d._r0; - real& rimborso = d._r1; - real& cred_cost = d._r2; - real& deb_mens = d._r3; - real& rettifiche = d._r5; - real& detrazioni = d._r6; - real& interessi = d._r7; - real& versamenti = d._r8; - real& vers_int = d._r9; - real& conguaglio = d._r10; - TToken_string tt(d._s0); - real iva_vend(tt.get(0)); - real iva_acq(tt.get(1)); - real cred_prec(tt.get(2)); - real debt_prec(tt.get(3)); - - real acc_dec(d._s1); - real res_cred(d._s2); - real res_debt(d._s3); - real rett_debt(0.0); - real rett_cred(0.0); - real& interesse = d._r11; - - if (rettifiche.sign() > 0) rett_debt = rettifiche; - if (rettifiche.sign() < 0) rett_cred = -rettifiche; - - set_bookmark("Riepilogativo liquidazione", _firm_bookmark); - - set_row(1,""); set_row(2,""); set_row(3,""); set_row(4,""); - set_row(5,"@11g@bCALCOLO LIQUIDAZIONE D'IMPOSTA@r"); - set_row(6,""); int rw = 7; - set_row(rw++," @66gCredito@84gDebito"); set_row(rw++,""); - set_row(rw++,"@11gIva sulle operazioni di vendita@75g%r", &iva_vend); - set_row(rw++,"%s@11gRettifiche IVA a debito%s@75g%r", - _is_visliq ? "$[r]" : "", _is_visliq ? "$[n]" : "", &rett_debt); - set_row(rw++,"%s@11gIva chiesta a rimborso%s@75g%r", - _is_visliq ? "$[r]" : "", _is_visliq ? "$[n]" : "", &rimborso); - - // conguaglio prorata - if (conguaglio.sign() > 0) - { - set_row(rw++,"@11gConguaglio pro-rata@75g%r", &conguaglio); - } - - // debito liq. precedente < 50000 - if (debt_prec > ZERO) - set_row(rw++,"@11gDebito da liquidazione precedente@75g%r", &debt_prec); - - set_row(rw++,"@11gRISULTATO@75g%r", &res_debt); - set_row(rw++,"@11gIva sulle operazioni di acquisto@58g%r", &iva_acq); - if (_isannual || d._f1) - set_row(rw++,"@11gCredito inizio anno@58g%r", &cred_prec); - else - set_row(rw++,"@11gCredito precedente@58g%r", &cred_prec); - - if (!acc_dec.is_zero()) - set_row(rw++,"%s@11gVersamento acconto dicembre%s@58g%r", - _is_visliq ? "$[r]" : "", _is_visliq ? "$[n]" : "", &acc_dec); - - if (!detrazioni.is_zero()) - set_row(rw++,"@11gUlteriori detrazioni@58g%r", &detrazioni); - - set_row(rw++,"%s@11gRettifiche IVA a credito%s@58g%r", - _is_visliq ? "$[r]" : "", _is_visliq ? "$[n]" : "", &rett_cred); - - if (!_is_visliq) - { - // versamenti effettuati - if (!versamenti.is_zero()) - { - set_row(rw++,"@11gVersamenti effettuati@58g%r", &versamenti); - } - // versamenti integrativi - if (!vers_int.is_zero()) - { - set_row(rw++,"@11gVersamenti integrativi@58g%r", &vers_int); - } - } - if (conguaglio.sign() < 0) - { - real cg = conguaglio; - cg = -cg; - set_row(rw++,"@11gConguaglio pro-rata@58g%r", &cg); - } - set_row(rw++,"@11gRISULTATO@58g%r", &res_cred); - - // se non c'e' nulla da versare stampa solo una riga vuota - // Serve, non toglierla, stronzo. - if (risultato.is_zero()) - set_row(rw++,""); - else - { - if (risultato.sign() < 0) - { - real iva = abs(risultato); - if (_isannual || _isriepilogo) iva.round(ROUND_MILLELIRE); - set_row(rw++,"@23gCREDITO ATTUALE@58g%r",&iva); - } - else - { - real iva = risultato + interessi; - if (_isannual || _isriepilogo) iva.round(ROUND_MILLELIRE); - if (!iva.is_zero()) - { - if (!interessi.is_zero()) - { - set_row(rw++,"@23gIVA DOVUTA@75g%r",&risultato); - set_row(rw++,"@23gInteresse %6.2r %%@75g%r",&interesse, &interessi); - } - if (iva >= IVA_DA_RIPORTARE || _isannual || _isriepilogo) - set_row(rw++,"@23gIVA DA VERSARE@75g%r",&iva); - else - set_row(rw++,"@23gIVA A DEBITO DA NON VERSARE@75g%r",&iva); - } - } - } - - if (_is_visliq) - { - // stampa versamenti (anche 0) ad uso visualizzazione liquidazione IVA - rw ++; - set_row(rw++,"@11g$[r]Versamenti effettuati$[n]@58g%r", &versamenti); - set_row(rw++, ""); - set_row(rw++, ""); - } - - if (!_is_visliq) - { - // descrizione rettifiche - if (!(d._s4.empty() && d._s5.empty())) - { - rw++; - set_row(rw++, "@11g@bDESCRIZIONE RETTIFICHE@r"); - rw++; - } - if (!d._s4.empty()) { set_row(rw++, "@11g%t", &(d._s4)); } - if (!d._s5.empty()) { set_row(rw++, "@11g%t", &(d._s5)); } - } - - // rapportini per rimborso infraannuale - // non si stampano se la stampa serve per la visualizz. - //modifica del 07/07/1995 - //*** solo in st.di prova in coda ai registri deve scendere - // il prospetto di rimborso - //*** sempre (cioe' in bollato e in prova) deve scendere - // il prospettino versamento (boh???????????????????) - //if (d._arr.items() > 0 && !_is_visliq && !_isregis) - if (d._arr.items() > 0 && !_is_visliq) - { - for (int i = 0; i < d._arr.items(); i++) - { - _DescrItem& di = (_DescrItem&)d._arr[i]; - - if (di._flags == RIMBORSO) - { - if (!_isregis || (_isregis && !_isfinal)) - { - set_print_zero(TRUE); - set_row(rw++,""); - set_row(rw++,""); - - set_bookmark("Prospetto di rimborso", _firm_bookmark); - - set_row(rw++, " PROSPETTO DI RIMBORSO"); - - if (di._f0) - { - // esenti e non imponibili - set_row(rw++,""); - set_row(rw++,"1) Soggetto con quota di operazioni esenti e non" - " imponibili superiore al 25%%"); - - real perc = (di._r0/di._r1); perc *= CENTO; perc.ceil(ROUND_LIRA); - - TString sep(strlen(REAL_PICTURE)+2); sep.fill('-'); - set_row(rw++,""); - set_row(rw++,"@26gTotale operazioni esenti e non imp.@66g%r", - &(di._r0)); - set_row(rw++,"@66g%t x 100 = %3r%%", &sep, &perc); - set_row(rw++,"@26gVolume di affari lordo@66g%r", &(di._r1)); - set_row(rw++,""); - } - - if (di._f1) - { - set_row(rw++,""); - set_row(rw++,"2) Soggetto con acquisti ad aliquota media " - "superiore a quella delle vendite"); - TString sep(strlen(REAL_PICTURE)+2); sep.fill('-'); - set_row(rw++,""); - set_row(rw++,"@26gTotale imposte sugli acquisti@66g%r", &(di._r5)); - set_row(rw++,"@66g%t x 100 = %5.2r%%", &sep, &(di._r7)); - set_row(rw++,"@26gTotale imponibili sugli acquisti@66g%r", - &(di._r3)); - set_row(rw++,""); - set_row(rw++,"@26gTotale imposte sulle vendite@66g%r", &(di._r4)); - set_row(rw++,"@66g%t x 100 = %5.2r%%", &sep, &(di._r6)); - set_row(rw++,"@26gTotale imponibili sulle vendite@66g%r", &(di._r2)); - } - - set_print_zero(FALSE); - } - } - // prospettino versamento - else if (di._flags == DELEGA) - { - int rr = rw; - if (rw < (printer().formlen() - 10)) - rw = printer().formlen() - 10; - - for (int i = rr; i < rw; i++) set_row(i,""); - - set_bookmark("Riepilogo versamenti", _firm_bookmark); - - TString dt = di._d0.string(); - TString vr = di._r0.string("###.###.###.###"); - - // la cincia non vuole lo zero - if (atof(vr) == 0.0 && vr[vr.len()-1] == '0') vr[vr.len()-1] = ' '; - - set_row(rw++, "Versamento di L. %s effettuato il %s@68gdiretto all'ufficio IVA di %s", - (const char*)vr, - (const char*)dt, - (const char*)(di._s0)); - set_row(rw++, "@68gtramite %s", (const char*)(di._s1)); - set_row(rw++, "@68gcodice azienda %s codice dipendenza %s", - (const char*)(di._s2), (const char*)(di._s3)); - } - } - } - - if (!_is_visliq) set_auto_ff(TRUE); - else set_auto_ff(FALSE); - - _firm_bookmark = -1; -} - - -bool TLiquidazione_app::set_annual(_DescrItem& d) -{ - // chiamata internamente a set_pims - bool ret = FALSE; - - int row = get_maxrow()+1; - if (d._f0 & IS_PRORATA) - { - // non lo ha stampato prima se annuale, perche' vladimiro il nefido - // pretende l'assurdo aggiornamento della perc. a quella nuova - set_row(++row, "%% PRO-RATA ed IVA non detraibile (%s%%)@69g%r", - (const char*)(d._r2.string()), &(d._r6)); - row++; - - set_bookmark("Calcolo pro-rata", _att_bookmark); - - ret = TRUE; - set_print_zero(TRUE); - set_row(row++,""); - set_row(row++,"CALCOLO DELLA PERCENTUALE DI INDETRAIBILITA'"); - set_row(row++,""); - set_row(row++,"Operazioni esenti riga B1@30g%r", &(d._r1)); - set_row(row++,"Operazioni esenti riga B2@30g%r", &(d._r4)); - set_row(row++,"Operazioni esenti riga B3@30g%r", &(d._r5)); - set_row(row++,"Volume d'affari riga B4@30g%r", &(d._r0)); - set_row(row++,"Indetraibilita'@30g%r%%", &(d._r2)); - if (!(d._r3.is_zero())) - { - const char* sss = d._r3.sign() < 0 ? "credito" : "debito"; - real ccc = abs(d._r3); - set_row(row++,"Conguaglio a %s@30g%r", sss, &ccc); - } - set_print_zero(FALSE); - } - return ret; -} - - -void TLiquidazione_app::set_ventila(_DescrItem& d) -{ - if (d._arr.items() == 0 || d._r0.is_zero()) - return; - - set_bookmark("Prospetto ventilazione", _att_bookmark); - - set_row(1,"@54gPROSPETTO VENTILAZIONE"); - set_row(2,""); - set_row(3,""); - set_row(4,"@10gTotale acquisti destinati alla rivendita@55g%r", - &(d._r0)); - set_row(5,"@10gTotale dei corrispettivi da ventilare@55g%r", - &(d._r1)); - real m = d._r1 / d._r0; - set_row(6,"@10gMoltiplicatore@59g%3.9r",&m); - set_row(7,""); - set_row(8,"@10gCod."); - set_row(9,"@10gIVA@17gDescrizione@48gAcquisti" - "@65gImponibile vendite@89gImposta vendite"); - set_row(10,""); - int row = 11; - real t1, t2, t3; - for(int i = 0; i < d._arr.items(); i++) - { - _vDesc& vd = (_vDesc&)d._arr[i]; - look_iva(vd._codiva); - TString s0 = _iva->get("S0"); - set_row(row+i,"@8g%5s@17g%s@41g%r@68g%r@89g%r", - (const char*)vd._codiva, - (const char*)s0, - &(vd._acq), - &(vd._vnd), - &(vd._viv)); - t1 += vd._acq; - t2 += vd._vnd; - t3 += vd._viv; - } - set_row(row+i+1,""); - set_row(row+i+2,"@10gTotale@41g%r@68g%r@89g%r", - &t1, &t2, &t3); - set_auto_ff(TRUE); -} - -void TLiquidazione_app::set_regagr(_DescrItem& d) -{ - set_print_zero(TRUE); - - real& agr_1 = d._r0; - real& agr_2 = d._r1; - real& agr_3 = d._r2; - real& agr_4 = d._r3; - real& agr_5 = d._r4; - real& agr_6 = d._r5; - real& agr_7 = d._r6; - real& agr_1i = d._r7; - real& agr_2i = d._r8; - - real ara = agr_5 + agr_6; - real arn = agr_3 + agr_4; - - // percentuale detraibilita' - // real pdetr = (); - set_bookmark("Prospetto regime agricolo", _att_bookmark); - - set_row(1,"@50gPROSPETTO REGIME AGRICOLO"); - set_row(2,""); - set_row(3, "Cessioni in regime agricolo (Tabella A/I)@54g%r",&agr_1); - set_row(4, ""); - set_row(5, "Cessioni non in regime agricolo@54g%r",&agr_2); - set_row(6, ""); - set_row(7, "Acquisti in regime agricolo@54g%r",&ara); - set_row(8, ""); - set_row(9, "Acquisti non in regime agricolo@54g%r",&arn); - set_row(10, "... di cui beni ammortizzabili@54g%r",&agr_4); - set_row(11, ""); - set_row(12, "Acquisti ad uso promiscuo@54g%r",&agr_7); - - if (/*agr_7.sign() > 0*/ TRUE) - { - real pdetr = (agr_2i / (agr_1i + agr_2i)); - pdetr.round(2); - real ivadt = agr_7 * pdetr; - pdetr *= CENTO; - pdetr.round(ROUND_LIRA); - ivadt.round(ROUND_LIRA); - - TString up = agr_2i.string("."); - up << " x 100"; - TString dn = agr_1i.string("."); - dn << " + " << agr_2i.string("."); - int ln = max(up.len(), dn.len()) + 2; - TString den(ln); den.fill('-'); - up.center_just(ln); dn.center_just(ln); - - set_row(13, ""); - set_row(14, "@31g%s", (const char*)up); - set_row(15, "Percentuale di detraibilita'@31g%s = @54g%r", - (const char*)den, - &pdetr); - set_row(16, "@31g%s", (const char*)dn); - - up = agr_7.string("."); - up << " x " << pdetr.string("."); - dn = "100"; - if ((max(up.len(), dn.len()) + 2) > ln) - ln = max(up.len(), dn.len()) + 2; - TString den1(ln); den1.fill('-'); - up.center_just(ln); dn.center_just(ln); - - set_row(17, ""); - set_row(18, "@31g%s", (const char*)up); - set_row(19, "Iva detraibile@31g%s = @54g%r", - (const char*)den1, - &ivadt); - set_row(20, "@31g%s", (const char*)dn); - } - - set_auto_ff(TRUE); - set_print_zero(FALSE); -} - -void TLiquidazione_app::set_viaggio(_DescrItem& d) -{ - // the longest & stronzest - // Nel corso della scrittura di questa funzione - // Berlusconi + Fini + Bossi hanno vinto le elezioni - // ... lungo commento cancellato - - real& corr_CEE = d._r0; - real& corr_misCEE = d._r1; - real& corr_noCEE = d._r2; - real& acq_CEE = d._r3; - real& acq_misCEE = d._r4; - real& acq_noCEE = d._r5; - real& acq_misnoCEE = d._r6; - real& cred_cos = d._r8; - - real perc_r = (acq_misCEE * CENTO)/(acq_misCEE + acq_misnoCEE); perc_r.round(2); - real ivm = (corr_misCEE * perc_r)/CENTO; ivm.round(ROUND_LIRA); - real tc = (corr_CEE + ivm); - real ta = (acq_CEE + acq_misCEE); - real bi = tc - ta - cred_cos; - - real tcc = corr_CEE + corr_noCEE + corr_misCEE; - real tco = acq_CEE + acq_noCEE + acq_misCEE + acq_misnoCEE; - real tma = acq_CEE + acq_misCEE; - // real rip = perc_r; rip.round(2); - // real cim = (d._r1 * d._r7)/CENTO; cim.round(ROUND_LIRA); - - - set_print_zero(TRUE); - - set_bookmark("Prospetto 74 ter", _att_bookmark); - - set_row(1,""); - set_row(2,"@54gRIEPILOGO 74 TER"); - set_row(3,""); - set_row(4,"Ammontare dei corrispettivi relativi a viaggi eseguiti" - " interamente nella CEE .....................@100g%r", &(corr_CEE)); - set_row(5,"Ammontare dei corrispettivi relativi a viaggi misti (dentro" - " e fuori CEE) ......................... @100g%r", &(corr_misCEE)); - set_row(6,"Ammontare dei corrispettivi relativi a viaggi eseguiti" - " interamente fuori CEE ..................... @100g%r", &(corr_noCEE)); - - - set_row(7,""); - set_row(8,"@56gTotale corrispettivi@100g%r", &tcc); - set_row(9,""); - - set_row(10,"Ammontare dei costi relativi a viaggi interamente" - " svolti nella CEE ............................... @100g%r", - &(acq_CEE)); - set_row(11,"Ammontare dei costi relativi a viaggi misti (per la" - " parte CEE) ................................... @100g%r", - &(acq_misCEE)); - set_row(12,"Ammontare dei costi relativi a viaggi interamente" - " svolti fuori CEE ............................... @100g%r", - &(acq_noCEE)); - set_row(13,"Ammontare dei costi relativi a viaggi misti (per la" - " parte fuori CEE) .............................@100g%r", - &(acq_misnoCEE)); - - - set_row(14,""); - set_row(15,"@64gTotale costi@100g%r", &tco); - - set_row(16,""); - set_row(17,"DETERMINAZIONE CORRISPETTIVI IMPONIBILI " - "RELATIVI A VIAGGI MISTI"); - set_row(18,""); - - // la bella frazioncina della percentuale di ripartizione - TString tmp(acq_misCEE.string(REAL_PICTURE)); tmp.ltrim(); - TString up = tmp; - up << " x 100"; - TString dn = tmp; - tmp = acq_misnoCEE.string(REAL_PICTURE); tmp.ltrim(); - dn << " + " << tmp; - int ln = max(up.len(), dn.len()) + 2; - TString den(ln); den.fill('-'); - up.center_just(ln); dn.center_just(ln); - - // la bella frazioncina degli imponibili viaggi misti - TString tmp2 = corr_misCEE.string(REAL_PICTURE); tmp2.ltrim(); - TString up2 = tmp2; - up2 << " x " << perc_r.string(2); - TString dn2 = "100"; - int ln2 = max(up2.len(), 3) + 2; - TString den2(ln2); den2.fill('-'); - up2.center_just(ln2); dn2.center_just(ln2); - - // la gran frazionazza centrata e stupenda - int tot = 35 + ln + ln2; - int rem1 = (100 - tot)/2; if (rem1 < 0) rem1 = 0; - int pos1 = rem1 + 13; - int rem2 = pos1+ den.len() + 11; - int pos2 = rem2 + 20; - - - set_row(19,format("@%dg%%t@%dg%%t", pos1, pos2), - &up, &up2); - set_row(20,format("@%dgPerc. rip. = %%t = %%5.2r; @%dg" - "Imp. viaggi misti = %%t = @100g%%r", - rem1, rem2), - &den, &perc_r, &den2, &ivm); - set_row(21,format("@%dg%%t@%dg%%t", pos1, pos2), - &dn, &dn2); - - real tmr = corr_CEE + ivm; - - // whew, come dicono su Topolino - - tmp = corr_CEE.string(REAL_PICTURE); tmp.ltrim(); - up = "("; up << tmp << " + "; - tmp = ivm.string(REAL_PICTURE); tmp.ltrim(); - up << tmp << ")"; - den.fill('.',59-up.len()); - set_row(23,"Ammontare dei corrispettivi imponibili@40g%t %t@100g%r", - &up, &den, &tmr); - - // se e' l'annuale non ha senso altro - if (d._f1) return; - - tmp = acq_CEE.string(REAL_PICTURE); tmp.ltrim(); - up = "("; up << tmp << " + "; - tmp = acq_misCEE.string(REAL_PICTURE); tmp.ltrim(); - up << tmp << ")"; - den.fill('.',59-up.len()); - set_row(24,"Ammontare dei costi deducibili@40g%t %t@100g%r", - &up, &den, &tma); - den.fill('.',60); - set_row(25,"Credito di costo precedente @40g%t@100g%r", &den, &(cred_cos)); - - tmp = tmr.string(REAL_PICTURE); tmp.ltrim(); - up = "["; up << tmp << " - ("; - tmp = tma.string(REAL_PICTURE); tmp.ltrim(); - up << tmp << " + "; - tmp = d._r8.string(REAL_PICTURE); tmp.ltrim(); - up << tmp << ")]"; - den.fill('.',59-up.len()); - - set_row(26,"Base imponibile lorda@40g%t %t@100g%r", &up, &den, &bi); - set_row(27,""); - - if (bi.sign() > 0) - { - real aliva = aliquota_agvia(); - real alcnt = aliva + CENTO; - real dovuta = (bi/(alcnt/CENTO)) * (aliva/CENTO); - dovuta.ceil(ROUND_LIRA); // ceil voluto da MI3074 - - tmp = bi.string(REAL_PICTURE); tmp.ltrim(); - up = tmp; - up << " x " << aliva.string(5,2); - dn = alcnt.string(); - ln = max(up.len(), 3) + 2; - den.fill('-',ln); - up.center_just(ln); dn.center_just(ln); - - tmp.fill('.', 59 - den.len()); - - set_row(28,"@40g%t",&up); - set_row(29,"IVA A DEBITO@40g%t %t@100g%r", &den, &tmp, &dovuta); - set_row(30,"@40g%t", &dn); - } - else if (bi.sign() < 0) - { - bi = abs(bi); - set_row(28,""); - set_row(29,"CREDITO DI COSTO DA RIPORTARE@100g%r", &bi); - } - - set_print_zero(FALSE); - set_auto_ff(TRUE); -} - -void TLiquidazione_app::set_acconto_p(_DescrItem& d) -{ - set_print_zero(TRUE); - - const char* errmsg[3] = { - {"manca la tabella risultati liquidazione per l'anno corrente"}, -{"manca la tabella risultati liquidazione per l'anno precedente"}, -{"manca la tabella dichiarazione annuale per l'anno precedente"}}; - -set_row(1,"%t@8g%t",&(d._s0), &(d._s1)); -if (d._f2) - set_row(1,"@50g@b*** %s ***@r", errmsg[d._f2 -1]); -else -{ - if (d._f0) // base anno in corso - { - if (d._f1) // stampa base di calcolo - { - real bc = d._r0; - if (bc.sign() < 0) - { - bc = abs(bc); - set_row(1,"@73g%r@86g%r@119g%s", &bc, &d._r1, - d._f3 ? "Si" : "No"); - } - else - set_row(1,"@55g%r@86g%r@119g%s", &bc, &(d._r1), - d._f3 ? "Si" : "No"); - } - else - { - set_row(1,"@51g%r@75g%s", &(d._r1), d._f3 ? "Si" : "No"); - } - } - else - { - if (d._f1) // stampa base di calcolo - set_row(1,"@57g%r@85g%r", &(d._r0), &(d._r1)); - else - set_row(1,"@85g%r",&(d._r1)); - } -} -set_print_zero(FALSE); -} - -void TLiquidazione_app::set_acchead_p(_DescrItem& d) -{ - reset_header(); - set_header(1,"Gestione IVA@109gData @<@125gPag. @#"); - set_header(3,sep); - - if (d._f0) // base anno in corso - { - set_header(2,"@40gCALCOLO ACCONTI IVA DICEMBRE " - "1994 (base anno in corso)"); - if (d._f1) // stampa base calcolo - { - set_header(4,"@51g------- Base di calcolo -------"); - set_header(5,"@1gDitta@8gDenominazione@55gDebito@73gCredito" - "@86gACCONTO calcolato@109gLiq. differita"); - set_header(6,sep); - set_header(7,""); - } - else - { - set_header(4,"@1gDitta@8gDenominazione@51gACCONTO calcolato" - "@75gLiq. differita"); - set_header(5,sep); - set_header(6,""); - } - } - else - { - set_header(5,sep); - set_header(6,""); - if (d._f1) - set_header(4,"@1gDitta@8gDenominazione@57gBase di calcolo" - "@85gACCONTO calcolato"); - else - set_header(4,"@1gDitta@8gDenominazione@85gACCONTO calcolato"); - } -} - - -// --------------------------------------------------------------------- -// Tabulato deleghe -// --------------------------------------------------------------------- - -void TLiquidazione_app::set_deltab(_DescrItem& d, bool iscred) -{ - reset_header(); - int rw = 1; - static bool credpr; - - if (iscred) - { - // set header - set_header(1,"ELENCO DITTE A CREDITO@30g%s %s@109gData @<@125gPag. @#", - d._f0 == 13 ? "Annuale " : itom(d._f0), (const char*)_year); - set_header(2,sep); - set_header(3,"@40gF@60gImporto a"); - set_header(4,"Cod.@8gDenominazione@40gR@62gcredito"); - set_header(5,sep); - set_header(6,""); - - // set rows - for (int i = 0; i < d._arr.items(); i++) - { - TToken_string& tt = (TToken_string&)(d._arr)[i]; - TString cod(tt.get(0)); - TParagraph_string rgs(tt.get(1), 30); - TString diocantaro(rgs.get(0)); - TString frq(tt.get(2)); - real tp (tt.get(3)); - real in (tt.get(4)); - tp -= in; - tp = -tp; - set_row(rw++, "%-5s@8g%-30s@40g%1s@54g%r", - (const char*)cod, (const char*)diocantaro, - (const char*)frq, &tp); - for (int i = 1; i < rgs.items(); i++) - set_row(rw++, "@8g%-30s", (const char*)rgs.get(i)); - } - } - else - { - // set header - set_header(1,"ELENCO DITTE A DEBITO@30g%s %s@109gData @<@125gPag. @#", - d._f0 == 13 ? "Annuale " : itom(d._f0), (const char*)_year); - set_header(2,sep); - set_header(3,"@40gF@60gImporto da@73gCodice@83gCod."); - set_header(4,"Cod.@8gDenominazione@40gR Numero telefonico@63gversare Banca Dip. Con."); - set_header(5,sep); - set_header(6,""); - - - // set rows - for (int i = 0; i < d._arr.items(); i++) - { - TToken_string& tt = (TToken_string&)(d._arr)[i]; - TString cod(tt.get(0)); - TParagraph_string rgs(tt.get(1), 30); - TString diocantaro(rgs.get(0)); - TString frq(tt.get(2)); - real tp (tt.get(3)); - real in (tt.get(4)); - TString abi(tt.get(5)); - TString cab(tt.get(6)); - TString con(tt.get(7)); - TString tel(tt.get(8)); - if (!tel.blank()) - tel << '/'; - tel << tt.get(9); - tp += in; - - - set_row(rw++, "%-5s@8g%-30s@40g%1s %s @55g%r %5s %5s %3s", - (const char*)cod, (const char*)diocantaro, (const char*)frq, - (const char*)tel, &tp, (const char*)abi, - (const char*)cab, (const char*)con); - - for (int i = 1; i < rgs.items(); i++) - set_row(rw++, "@8g%-30s", (const char*)rgs.get(i)); - } - } - set_auto_ff(TRUE); -} +// ------------------------------------------------------------ +// Calcolo liquidazioni +// Part 5: stampa +// fv 21-1-94 +// ------------------------------------------------------------ + +#include + +#include "cg4300.h" + +// flags per annuale +#define IS_PRORATA 0x0001 + + +// minchietta per prospetto ventilazione +class _vDesc : public TObject +{ +public: + TString _codiva; + real _acq; + real _vnd; + real _viv; + _vDesc() : _codiva(5) {} + virtual ~_vDesc() {} +}; + +static char sep[] = +"------------------------------------------------------------------" +"------------------------------------------------------------------"; + +void TLiquidazione_app::set_page(int file, int cnt) +{ + _DescrItem& d = (_DescrItem&)_descr_arr[cnt]; + + set_auto_ff(FALSE); + reset_print(); + + switch(d._flags) + { + case CHG_PARMS: + set_att(d); + break; + case SET_FIRM: + set_firm(d); + break; + case PIM_ROW: + set_pim(d); + break; + case PIM_HEAD: + set_pim_head(); + break; + case MISC_LIQ: + set_pumpam(d); + break; + case TOT_ROW: + set_plm(d); + break; + case PLAFOND: + set_plafond(d); + break; + case VENTILA: + set_ventila(d); + break; + case REGAGR: + set_regagr(d); + break; + case REGVIA: + set_viaggio(d); + break; + case THE_END: + set_grand(d); + break; + case ACCONTO: + set_acconto_p(d); + break; + case ACCHEAD: + set_acchead_p(d); + break; + case DELDEB: + set_deltab(d, FALSE); + break; + case DELCRED: + set_deltab(d, TRUE); + break; + } +} + +print_action TLiquidazione_app::postprocess_page(int file, int cnt) +{ + if (_descr_arr.items() == 0 || cnt == _descr_arr.items()-1) + return NEXT_PAGE; + return REPEAT_PAGE; +} + +bool TLiquidazione_app::preprocess_page(int file, int cnt) +{ + return _descr_arr.items() != 0; +} + +// ---------------------------------------------------------------- +// Print description +// ---------------------------------------------------------------- + +void TLiquidazione_app::describe_att(int month, const char* codatt, + bool isresult, char flags) +{ + TToken_string atts(codatt); + + if (_isprint && _canprint) + { + describe_name(month, atts, flags); + if (atts.items() == 1 && _isplafond) + describe_plafond(month, codatt); + if (atts.items() == 1 && _isvent) + describe_ventilation(month, codatt); + if (atts.items() == 1 && _isagricolo) + describe_agricolo(month, codatt); + if (atts.items() == 1 && _isviaggio) + describe_viaggio(month, codatt); + if (/* isresult || month == 13 */ TRUE) + describe_pims(month,codatt); + if (atts.items() == 1) + describe_consistence(codatt); + } +} + +void TLiquidazione_app::describe_name(int month, TToken_string& codatts, char flags) +{ + _DescrItem* d = new _DescrItem(CHG_PARMS); + + d->_s0 = _nditte->curr().get("CODDITTA"); + d->_s1 = _nditte->curr().get("RAGSOC"); + d->_s2 = _nditte->curr(LF_ATTIV).get("CODATT"); + d->_s3 = codatts.items() == 1 ? (const char*)_nditte->curr(LF_ATTIV).get("DESCR") : ""; + d->_s4 = _freqviva; + + d->_f1 = month; + d->_f2 = _isbenzinaro; + d->_f3 = (word)flags; + + if (_mixed && codatts.items() == 1) + d->_f0 = atoi(codatts.mid(5)); + else d->_f0 = 0; + _descr_arr.add(d); +} + +void TLiquidazione_app::describe_firm(int month) +{ + if (!_isprint || !_canprint) return; + + _DescrItem* d = new _DescrItem(SET_FIRM); + + d->_s0 = _nditte->curr().get("CODDITTA"); + d->_s1 = _nditte->curr().get("RAGSOC"); + d->_s2 = _freqviva; + d->_f1 = month; + _descr_arr.add(d); + +} + + +void TLiquidazione_app::describe_plafond(int month, const char* codatt) +{ + // prepara la descrizione del riepilogo da stampare e lo accoda + real t1, t2, t3; + _DescrItem* d = new _DescrItem(PLAFOND); + + for (int jj = 1; jj <= 3; jj++) // three types of plafond + { + t1 = 0.0; t2 = 0.0; t3 = 0.0; + for (int m = 1; m <= month && m < 13; m++) + { + if (is_month_ok(m,month) && look_ppa(m,codatt,jj)) + { + t1 += _ppa->get_real("R0"); + t2 += _ppa->get_real("R1"); + t3 = _ppa->get_real("R2"); + } + } + switch (jj) + { + case 1: + d->_r0 = t1; d->_r1 = t2; d->_r2 = t3; + break; + case 2: + d->_r3 = t1; d->_r4 = t2; d->_r5 = t3; + break; + case 3: + d->_r6 = t1; d->_r7 = t2; d->_r8 = t3; + break; + } + } // for tipo esenzione plafond + + _descr_arr.add(d); + + // bookmark +} + +void TLiquidazione_app::describe_ventilation(int month, const char* codatt) +{ + if (!_isvent || _isagricolo || _isviaggio) return; + + _DescrItem* d = new _DescrItem(VENTILA); + TString att(codatt); + + look_plm(month, att); + + for (_pim->first(); !_pim->eof(); _pim->next()) + { + if (strcmp(*_pim_codatt,att) != 0) + continue; + + look_reg(*_pim_codreg); + look_iva(*_pim_codiva); + + int tipocr = atoi(*_pim_tipocr); + int tipodet = atoi(*_pim_tipodet); + int mese = atoi(*_pim_mese); + bool corrisp = _reg->get_bool("B0"); + real imponibile = _pim->get_real("R0"); + real imposta = _pim->get_real("R1"); + tiporeg tipomov = (tiporeg)_reg->get_long("I0"); + TString tipoiva = _iva->get("S1"); + + if (_year != *_pim_anno) continue; + + if (imponibile.is_zero() && imposta.is_zero()) continue; + + // questi non vanno in liquidazione, i totali sono + // gia' calcolati altrove + if (tipodet == 1 || (tipodet == 3 && tipocr == 5) || tipodet == 9) + continue; + + // questi non si devono vedere perche' so' bbrutti + if (tipoiva == "NS" || tipoiva == "ES" || tipoiva == "NI") + continue; + + if (mese <= month) + { + if (tipocr == 1 && tipomov == acquisto) + { + // somma agli acquisti + _vDesc* vd = NULL; + for (int i = 0; i < d->_arr.items(); i++) + { + _vDesc* vv = (_vDesc*)&(d->_arr[i]); + if (strcmp(vv->_codiva,*_pim_codiva) == 0) + { vd = vv; break; } + } + if (vd == NULL) { vd = new _vDesc; } + + vd->_acq += (imponibile+imposta); + d->_r0 += (imponibile+imposta); + + if (vd->_codiva.empty()) + { + vd->_codiva = *_pim_codiva; + d->_arr.add(vd); + } + } + else if ((is_month_ok(mese,month) || month == 13) && corrisp + && _pim->get_bool("B1") && + tipocr == 0 && tipomov == vendita) + // non sono sicurissimo della above condition + { + // somma alle vendite + _vDesc* vd = NULL; + for (int i = 0; i < d->_arr.items(); i++) + { + _vDesc* vv = (_vDesc*)&(d->_arr[i]); + if (strcmp(vv->_codiva,*_pim_codiva) == 0) + { vd = vv; break; } + } + if (vd == NULL) { vd = new _vDesc; } + + vd->_vnd += imponibile; + vd->_viv += imposta; + + d->_r1 += imponibile+imposta; + + if (vd->_codiva.empty()) + { + vd->_codiva = *_pim_codiva; + d->_arr.add(vd); + } + } + } + } + if (d->_r1.is_zero() || d->_r0.is_zero()) + delete d; + else + _descr_arr.add(d); +} + +void TLiquidazione_app::describe_agricolo(int month, const char* codatt) +{ + _DescrItem* d = new _DescrItem(REGAGR); + + for (int mese = 1; mese <= month; mese++) + { + if (!is_month_ok(mese,month)) + continue; + + if (!look_plm(mese, codatt)) + continue; + + d->_r0 += _plm->get_real("R5"); + d->_r1 += _plm->get_real("R6"); + d->_r2 += _plm->get_real("R7"); + d->_r3 += _plm->get_real("R8"); + d->_r4 += _plm->get_real("R9"); + d->_r5 += _plm->get_real("R10"); + d->_r6 += _plm->get_real("R11"); + d->_r7 += _pum->get_real("R10"); + d->_r8 += _pum->get_real("R11"); + } + _descr_arr.add(d); +} + +void TLiquidazione_app::describe_viaggio(int month, const char* codatt) +{ + if (!look_lim(month)) return; + + _DescrItem* d = new _DescrItem(REGVIA); + + for (int mese = 1; mese <= month; mese++) + { + if (!is_month_ok(mese,month) || !look_plm(mese, codatt)) + continue; + + d->_r0 += _plm->get_real("R5"); // corrispettivi CEE + d->_r1 += _plm->get_real("R9"); // corrispettivi misti CEE + d->_r2 += _plm->get_real("R6"); // corrispettivi fuori CE + d->_r3 += _plm->get_real("R7"); // acquisti CEE + d->_r4 += _plm->get_real("R10"); // acquisti misti parte CEE + d->_r5 += _plm->get_real("R8"); // acquisti fuori CEE + d->_r6 += _plm->get_real("R11"); // acquisti misti parte fuori CEE + } + + // credito di costo precedente (CHECK annuale) + d->_r8 = credito_costo_prec(month); + + _descr_arr.add(d); +} + + +void TLiquidazione_app::describe_pims(int month, const char* codatt) + // le si passa una tokenstring (o un codatt) e lei, da brava, calcola + // cumulando per tutte le attivita' nominatele + // ogni riga riguarda un codiva ma tutti i registri + // se il mese e' 13 si guarda tutto l'anno + // se si tratta di una sola attivita' in att. mista evidenziata o servizievole, + // stampa solo vendite e corrispettivi +{ + TToken_string atts(codatt); + TString ref(atts.items() == 1 ? codatt : "ALL"); + const char* tmpatt; + int last = _descr_arr.last(); + bool isfirst = TRUE; + real t0, t1, t2, t3, t4, t5; + real autodafe, autodafe_iva; + + bool skip_acq = atts.items() == 1 && _mixed; + + // descrittore riga autodafe' + _DescrItem* ads = NULL; + // descrittore riga iva dovuta ag. viaggio' + _DescrItem* iads = NULL; + // questa cazzata serve per far apparire l'intestazione delle colonne + // anche se le colonne non ci sono; in tal modo si ottiene una peggior + // chiarezza, una peggiore efficienza, una gran rottura di coglioni, + // ma risulta identico al dio Sistema. + _DescrItem* hea = new _DescrItem(PIM_HEAD); + _descr_arr.add(hea); + + while ((tmpatt = atts.get()) != NULL) + { + TString att(tmpatt); + + for (_pim->first(); !_pim->eof(); _pim->next()) + { + _DescrItem* d = NULL; + // compute + bool ok = look_reg(*_pim_codreg); + ok |= look_iva(*_pim_codiva); + bool isnew = FALSE; + + if (!ok) continue; + + tiporeg tipomov = (tiporeg)_reg->get_long("I0"); + bool corrisp = _reg->get_bool("B0"); + TString tipoiva = _iva->get("S1"); + int tipodet = atoi(*_pim_tipodet); + TString codiva((const char*)(*_pim_codiva)); + TString other = _pim->get("S4"); + + // ACHTUNG! Corrispettivi da ventileer possono ventilare + // ad un altro codiva; in tal caso si scrive quello + if (corrisp && !other.empty()) + { + look_iva(other); + codiva = other; + } + // se e' corrispettivo da ventilare non + // scrivo un cannolo ripieno visto che e' stato ventilato + if (tipomov == vendita && tipoiva == "VE") continue; + + // se e' il dettaglio di una attivita' mista non stampa + // gli acquisti, il perche' losalamadonna + if (tipomov == acquisto && skip_acq) continue; + + // questi non vanno in liquidazione, i totali sono + // gia' calcolati altrove + if (tipodet == 1 || tipodet == 3 || tipodet == 9) + continue; + + // se ha tutti gli importi nulli viene da un annullamento di + // progressivi esistenti (achtung fatture con scontrino) + if (_pim->get_real("R0").is_zero() && + _pim->get_real("R1").is_zero() && + _pim->get_real("R2").is_zero() && + _pim->get_real("R5").is_zero() && + _pim->get_real("R6").is_zero()) + continue; + + if (strcmp((const char*)*_pim_codatt, att) == 0 && + (is_month_ok(atoi(*_pim_mese),month)) && + _year == (const char*)*_pim_anno) + { + // vedi se c'e' gia' un item corrispondente + for(int i = last+1; i < _descr_arr.items(); i++) + { + d = (_DescrItem*)&_descr_arr[i]; + if (d->_flags == PIM_ROW && + d->_s0 == ref && + d->_s1 == codiva) + break; + if (d->_s1 > codiva) + { + isnew = TRUE; + _DescrItem* dd = new _DescrItem(PIM_ROW); + // CicciaPrassi li vuole in ordine crescente + _descr_arr.insert(dd,i); + // che due maron stereofonic: se quello dopo + // era il primo, quello prima va dopo + if (d->_f0) + { + dd->_f0 = TRUE; + d->_f0 = FALSE; + } + else if (isfirst) + { + d->_f0 = TRUE; + isfirst = FALSE; + } + d = dd; + break; + } + } + if (!isnew && i == _descr_arr.items()) + { + isnew = TRUE; + d = new _DescrItem(PIM_ROW); + if (isfirst) { d->_f0 = TRUE; isfirst = FALSE; } + _descr_arr.add(d); + } + + if (tipomov == acquisto) + { + d->_r4 += _pim->get_real("R0"); + d->_r5 += _pim->get_real("R1"); + t4 += _pim->get_real("R0"); + t5 += _pim->get_real("R1"); + } + else // vendita + { + // vedi corrispettivi veri e falsi + real cvi = _pim->get_real("R0"); // imp. totale + real cvv = _pim->get_real("R1"); // iva totale + real cfi = _pim->get_real("R13"); // imp. falsi corrispettivi + real cfv = _pim->get_real("R14"); // iva falsi corrispettivi + + if (corrisp) + { + cvi -= cfi; + cvv -= cfv; + } + + if (corrisp) + { + // usa R0 e R1 visto che la ventilazione e' gia' + // stata calcolata + real ifs(_pim->get_real("R5")); // imp. fatture con scontrino + real vfs(_pim->get_real("R6")); // iva fatture con scontrino + + d->_r2 += (cvi /* - ifs */); // tolgo FS dai corrispettivi + d->_r3 += (cvv /* - vfs */); + d->_r0 += ifs; // aggiungo FS alle vendite + d->_r1 += vfs; + t2 += (cvi /* - ifs */); // idem per i totali + t3 += (cvv /* - vfs */); // non sono molto convinto ma vogliono cio' + t0 += ifs; // ...avevo ragione e infatti l'ho cambiato + t1 += vfs; + } + + if (!corrisp || (!cfv.is_zero() || !cfi.is_zero())) + { + real adf, adi; // autofatture non residenti art. 17 + + real vendi = corrisp ? cfi : _pim->get_real("R0"); + real vendv = corrisp ? cfv : _pim->get_real("R1"); + + // si scorporano solo per l'annuale, altrimenti + // vengono normalmente considerati nelle vendite + if (month == 13) + { + adf = _pim->get_real("R7"); + adi = _pim->get_real("R8"); + } + + d->_r0 += vendi - adf; + d->_r1 += vendv - adi; + t0 += vendi /* - adf */; + t1 += vendv /* - adi */; + + autodafe += adf; + autodafe_iva += adi; + } + } + if (isnew) + { + d->_s0 = ref; + d->_s1 = codiva; + // flag per stampare l'intestazione colonne + } + } + } + + look_plm(month,att); + real iva74t = _pom->get_real("R13"); + if (iva74t.sign() > 0) + { + if(iads == NULL) iads = new _DescrItem(PIM_ROW); + iads->_s0 = "74TER"; // cosi' vollero + iads->_s1 = "IVA "; // cosi' vollero + iads->_s2 = " dovuta - 74 ter"; // cosi' vollero + iads->_r1 += iva74t; + t1 += iva74t; + if (isfirst) + { + isfirst = FALSE; + iads->_f0 = TRUE; + } + } + } + + if (autodafe.sign() > 0 || autodafe_iva.sign() > 0) + { + _DescrItem* ads = new _DescrItem(PIM_ROW); + ads->_s0 = ref; + ads->_s1 = "A35"; // cosi' vollero + ads->_r0 = autodafe; + ads->_r1 = autodafe_iva; + if (isfirst) + { + isfirst = FALSE; + ads->_f0 = TRUE; + } + _descr_arr.add(ads); + } + + // ag. viaggio: iva dovuta 74 ter la vogliono in mezzo ai progressivi + if (iads != NULL) _descr_arr.add(iads); + + // prepara una bella riga di totali + if (/* !isfirst */ TRUE) + { + _DescrItem* d = new _DescrItem(TOT_ROW); + d->_r0 = t0; d->_r1 = t1; + d->_r2 = t2; d->_r3 = t3; + d->_r4 = t4; d->_r5 = t5; + + // aggiunge dati ptm + _DescrItem* t = new _DescrItem(MISC_LIQ); + t->_f1 = isfirst; // per il form feed + + TToken_string ttm("0|0|0"); + + for (int m = 1; m <= month && m < 13; m++) + { + if (!is_month_ok(m,month)) continue; + + atts.restart(); + while ((tmpatt = atts.get()) != NULL) + { + TString att(tmpatt); + look_plm(m, att); + real ad1, ad2; + + d->_r6 += _pom->get_real("R0"); // acq. intracomunitari + d->_r7 += _pom->get_real("R1"); // inded. art 19 + d->_r8 += _pom->get_real("R2"); // IVA su inded. art. 19 + t->_r0 += _pom->get_real("R3"); // acq. ammortizz. detr + t->_r1 += _pom->get_real("R4"); // IVA acq. ammort. detr + t->_r2 += _pum->get_real("R2"); // ammort. detr. 6% + t->_r3 += _pum->get_real("R3"); // IVA ammort detr. 6% + t->_r4 += _pom->get_real("R5"); // acq. beni rivendita + t->_r5 += _pom->get_real("R6"); // IVA acq. beni rivendita + t->_r6 += _pom->get_real("R7"); // acq. leasing + t->_r7 += _pom->get_real("R8"); // IVA acq. leasing + t->_r8 += _pum->get_real("R0"); // cessioni beni ammort. + t->_r9 += _pum->get_real("R1"); // IVA su cessioni ammort. + t->_r10 += _pum->get_real("R4"); // tot. esenti IVA + t->_r11 += _plm->get_real("R2"); // pro-rata indetraibile + + ad1 = real(ttm.get(1)); + ad2 = real(ttm.get(2)); + ad1 += _pom->get_real("R11"); + ad2 += _pom->get_real("R12"); + ttm.add(_plm->get("R12"), 0); // % pro-rata + ttm.add(ad1.string(),1); // imp. acq. amm. indetr. + ttm.add(ad2.string(),2); // IVA acq. amm. indetr + t->_s0 = ttm; + + t->_f0 = !_prorata.is_zero() && (month != 13); // flag per segnalare l'esistenza + d->_r9 += _pom->get_real("R9"); // acq. inded. su ricavi esenti + d->_r10 += _pom->get_real("R10"); // IVA acq. inded. su ricavi esenti + + // passaggi interni + real aipip(d->_s0); // progressivo ... + real aipivp(d->_s1); // ... (che mazzata sulle palle...) + aipip += _pum->get_real("R8"); // acq. inded. per pass. int + aipivp += _pum->get_real("R9"); // IVA acq. inded. per pass. int + d->_s0 = aipip.string(); // risbatto ... + d->_s1 = aipivp.string(); // .. + + // spese generali. + real spgnp(t->_s2); // progressivo ... + real spgnvp(t->_s3); // ... (che doppia mazzata sulle palle...) + spgnp += _pam->get_real("R10"); // spese generali. + spgnvp += _pam->get_real("R11"); // IVA spese generali. + t->_s2 = spgnp.string(); // risbatto ... + t->_s3 = spgnvp.string(); // .. + + // sospensione imposta: non piu' due palle, ma QUATTRO + TToken_string tt(t->_s4); + real aqsi(tt.get(0)); + real aqsv(tt.get(1)); + real vnsi(tt.get(2)); + real vnsv(tt.get(3)); + + aqsi += _pam->get_real("R6"); + aqsv += _pam->get_real("R7"); + vnsi += _pam->get_real("R8"); + vnsv += _pam->get_real("R9"); + + tt = ""; + tt.add(aqsi.string()); + tt.add(aqsv.string()); + tt.add(vnsi.string()); + tt.add(vnsv.string()); + t->_s4 = tt; + + } // while (attivita') + } // for (mese ok) + + + // annual follows in _arr + if (month == 13 && ref != "ALL") + { + // tutte quelle cose che vanno alla liquidazione annuale, come il + // calcolo del prorata o del nuovo plafond o .... + if (look_pla(codatt)) + { + real v1 = _pla->get_real("R14"); + real v2(_pla->get("S1")); + real ris = v1 + v2; + real e1 = _pla->get_real("R1"); + real e2 = _pla->get_real("R2"); + real e3 = _pla->get_real("R3"); + real am = _pla->get_real("R4"); + real iaq = _pla->get_real("R11"); // IVA acquisti + real ppg = _pla->get_real("R12"); // pro-rata pagato + + // calcola nuovo prorata per ogni attivita' (miste: 1+2) + real pr(0.0); + if (!ris.is_zero()) + pr = (e1/ris) * CENTO; + real co = 0.0; + real topay = 0.0; + pr.round(ROUND_LIRA); + if (pr != _prorata) + { + // calcolo conguaglio -- se positivo e' a debito + topay = (iaq + ppg) * (pr / CENTO); + topay.round(ROUND_MILLELIRE); + co = topay - ppg; + co.round(ROUND_MILLELIRE); + } + + _DescrItem* dd = new _DescrItem(ANNUAL); + + // prorata + if (!_prorata.is_zero()) + dd->_f0 |= IS_PRORATA; + dd->_r0 = ris; + dd->_r1 = e1; + dd->_r2 = pr; + dd->_r3 = co; + dd->_r4 = e2; + dd->_r5 = e3; + dd->_r6 = topay; + t->_arr.add(dd); + } + } + _descr_arr.add(d); + _descr_arr.add(t); + } +} + + +void TLiquidazione_app::describe_liq(int month, const char* codatts, + _DescrItem* di) +{ + if (!_isprint || !_canprint) return; + + if (!look_lim(month)) return; + + _DescrItem* d = new _DescrItem(THE_END); + + // gli diamo la stessa struttura di LIM + d->_r0 = _lim->get_real("R0"); + d->_r1 = _lim->get_real("R1"); + d->_r2 = _lim->get_real("R2"); + d->_r3 = _lim->get_real("R3"); + d->_r4 = _lim->get_real("R4"); + d->_r5 = _lim->get_real("R5"); + d->_r6 = _lim->get_real("R6"); + d->_r7 = _lim->get_real("R14"); + d->_r9 = _lim->get_real("R9"); + d->_r10 = _lim->get_real("R7"); // totale conguaglio prorata + + TToken_string tt(80); + tt.add(_lam->get_real("R0").string()); + tt.add(_lam->get_real("R1").string()); + tt.add(_lam->get_real("R2").string()); + tt.add(_lam->get_real("R3").string()); + + d->_s0 = tt; + d->_s1 = _lim->get_real("R11").string(); + d->_s2 = _lim->get_real("R12").string(); + d->_s3 = _lim->get_real("R13").string(); + + // descrizione rettifiche + if (month < 13) + { + d->_s4 = _lim->get("S0"); + d->_s5 = _lim->get("S1"); + } + d->_r11 = (const char*)_lim->get("R10"); // tasso di interesse + + d->_f1 = is_first_month(month); + + if (_is_visliq) + { + // tutti i versamenti, sempre e comunque + d->_r8 = versamenti_IVA(_month, "1"); + } + else + // rispettiamo tutte le casistiche per i versamenti + d->_r8 = _lim->get_real("R8"); + + + // aggiunge eventuale satellite per rimborso infraannuale + if (di != NULL) + { + if (d->_r0.sign() < 0) + d->_arr.add(di); + else delete di; + } + + if (!_is_visliq) + { + _DescrItem* dv = describe_deleghe(month); + if (dv != NULL) d->_arr.add(dv); + } + _descr_arr.add(d); +} + +_DescrItem* TLiquidazione_app::describe_deleghe(int month) +{ + if (!look_del(month,1)) return NULL; + + _DescrItem* d = new _DescrItem(DELEGA); + + if (_del->get_bool("B0")) + { + d->_s0 = _del->get("S2"); // localita' + d->_s1 = _del->get("S1"); // banca + d->_s2 = _del->get("S7"); // ABI + d->_s3 = _del->get("S8"); // CAB + d->_r0 = _del->get_real("R0"); + d->_d0 = _del->get_date("D0"); + } // altrimenti lascia tutto in bianco e ci scriveranno i dati a mano + + return d; +} + +void TLiquidazione_app::describe_consistence(const char* codatt) +{ + // controlla eventuali condizioni di conflitto con le normative + // per la ditta e crea i messaggi appropriati + // tutte le condizioni sono valutate sull'esercizio precedente + int pryear = atoi(_year) - 1; + TString att = codatt; + + _pla->zero(); + *_pla_ditta = get_firm(); + *_pla_anno = pryear; + *_pla_codatt = att; + + if (_pla->read() == NOERR) + { + real va = _pla->get_real("R0"); + + // 1) consistenza volume d'affari <-> frequenza versamenti + // deve essere: trimestrale ammesso solo se < 360.000.000 + // per servizi, < 1.000.000.000 per altre imprese + // a meno che non sia benzinaro che ha diritto comunque + + if (_freqviva == "T" && !_isbenzinaro) + { + bool err = FALSE; + if (_isservizio) err = va > SOGLIA_TRIM_SERVIZI; + else err = va > SOGLIA_TRIM_ALTRE; + if (err) + describe_error("Incoerenza volume affari/frequenza versamenti", + att); + } + } +} + + +void TLiquidazione_app::describe_error(const char* err, const char* codatt) +{ + if (!_isprint || !_canprint) return; + _errors.add(new _ErrItem(err,codatt,_nditte->curr().get("CODDITTA"))); +} + +// ---------------------------------------------------------------- +// Setrows +// ---------------------------------------------------------------- + +void TLiquidazione_app::set_firm(_DescrItem& d) +{ + TString tim_title(80); + tim_title << "Liquidazione IVA"; + + if (d._f1 == 13) + tim_title << format(": Riepilogo Annuale %s",(const char*)_year); + else + { + if (d._s2 == "T") + tim_title << format(" del %d° Trimestre %s", d._f1/3, (const char *) _year); + else + tim_title << format(" del mese di %s %s", itom(d._f1), + (const char*)_year); + } + + reset_header(); + int soh = 1; + if (!_isregis) + { + set_header(soh++,"Ditta %s %s@109gData @<@125gPag. @#", + (const char*)(d._s0), (const char*)(d._s1)); + set_header(soh++,""); + } + set_header(soh++,sep); + set_header(soh++,"%s@102gFrequenza %s", + (const char*)tim_title, + d._s2 == "T" ? "Trimestrale" : "Mensile"); + set_header(soh++,sep); + set_header(soh++,""); + + // notify errors if any + int j = 0; + for (int i = 0; i < _errors.items(); i++) + { + _ErrItem& s = (_ErrItem&)_errors[i]; + if (s._att == "ALL" && s._firm == d._s0) + { j++; set_row(i+3, "@5g@b*** %s ***@r", (const char*)s._err); } + } + if (j) set_row(i+3,""); +} + + +void TLiquidazione_app::set_att(_DescrItem& d) +{ + // set header + TString tim_title(78); + TString att_title(48); + + // Bookmark + TString book_name(d._s3); + char flags = (char)d._f3; + + if (flags == '1') book_name << " (servizi)"; + else if (flags == '2') book_name << " (altre)"; + else if (flags == 'M') book_name = "Riepilogo att. mista"; + else if (flags == 'Q') book_name = "Riepilogo quater"; + + if (_firm_bookmark == -1) + _firm_bookmark = set_bookmark(d._s1); + _att_bookmark = set_bookmark(book_name, _firm_bookmark); + + tim_title << "Liquidazione IVA"; + + if (d._f1 == 13) + { + if (d._s4 == "T" && !(d._f2)) // trimestrale e non benzinaro + tim_title << format(": Riepilogo Annuale %s",(const char*)_year); + else + tim_title << format(": Dichiarazione Annuale %s",(const char*)_year); + } + else + { + if (d._s4 == "T") + tim_title << format(" del %d° Trimestre %s", d._f1/3, (const char *) _year); + else + tim_title << format(" del mese di %s %s", itom(d._f1), + (const char*)_year); + } + + TString tipatt; + + if (d._f0 > 0) + tipatt.format(d._f0 == 1 ? "SERVIZI" : "ALTRE ATTIVITA'"); + + if (d._s3.empty()) + { + att_title = flags == 'M' ? "Riepilogo attivita' mista" : + "Riepilogo quater"; + // att_title << d._s2; + } + else + att_title = format("Attivita' %s %s %s", + (const char*)(d._s2), + (const char*)(d._s3), + (const char*)tipatt); + + reset_header(); + int soh = 1; + if (!_isregis) + { + set_header(soh++,"Ditta %s %s@109gData @<@125gPag. @#", + (const char*)(d._s0), (const char*)(d._s1)); + set_header(soh++,""); + } + set_header(soh++,sep); + set_header(soh++,"%s@55g%s", (const char*)tim_title, (const char*)att_title); + set_header(soh++,sep); + set_header(soh++,""); + + // notify errors if any + int j = 0; + for (int i = 0; i < _errors.items(); i++) + { + _ErrItem& s = (_ErrItem&)_errors[i]; + if (d._s2 == s._att && s._firm == d._s0) + { j++; set_row(i+10, "@5g@b*** %s ***@r", (const char*)s._err); } + } + if (j) set_auto_ff(TRUE); +} + + +void TLiquidazione_app::set_plafond(_DescrItem& d) +{ + if (_isregis) return; + + set_bookmark("Quadro plafond", _att_bookmark); + + real r1 = d._r2 - d._r1 - d._r0; + real r2 = d._r5 - d._r4 - d._r3; + real r3 = d._r8 - d._r7 - d._r6; + + set_print_zero(TRUE); + + set_row(1,"QUADRO RELATIVO ALLA DISPONIBILITA' ED ALL'UTILIZZO " + "MENSILE DEI PLAFOND"); + + set_row(2,""); set_row(3,""); + set_row(4,"Art. 8 1° comma lettere a-b@31gDisponibile@48g%r", + &(d._r2)); + set_row(5,"Utilizzato all'interno@48g%r", &(d._r0)); + set_row(6,"Utilizzato per l'importazione@48g%r@69gRiporto@78g%r", + &(d._r1), &r1); + + set_row(7,""); + set_row(8,"Art. 8bis 1° comma@31gDisponibile@48g%r", + &(d._r5)); + set_row(9,"Utilizzato all'interno@48g%r", &(d._r3)); + set_row(10,"Utilizzato per l'importazione@48g%r@69gRiporto@78g%r", + &(d._r4), &(r2)); + + set_row(11,""); + set_row(12,"Art. 9 1° comma@31gDisponibile@48g%r", + &(d._r8)); + set_row(13,"Utilizzato all'interno@48g%r", &(d._r6)); + set_row(14,"Utilizzato per l'importazione@48g%r@69gRiporto@78g%r", + &(d._r7), &r3); + + set_print_zero(FALSE); + set_auto_ff(); +} + +void TLiquidazione_app::set_pim_head() +{ + set_bookmark("Riepilogo progressivi", _att_bookmark); + set_row(1," Cod.@41gVENDITE@71gCORRISPETTIVI@106gACQUISTI"); + set_row(2," IVA Descrizione@30gImponibile@49gImposta@63gImponibile" + "@82gImposta@96gImponibile@115gImposta"); + set_row(3,""); +} + +void TLiquidazione_app::set_pim(_DescrItem& d) +{ + // succede con le autocazzate non residenti non movimentate eccetera + if ((d._r0 + d._r1 + d._r2 + d._r3 + d._r4 + d._r5) == ZERO) + return; + + int rw = 1; + if (d._s1 == "A35") + d._s2 = "Artt.17c3/74c1"; + else if (d._s0 == "74TER") + rw++; + else + { + look_iva(d._s1); + d._s2 = _iva->get("S0"); + if (d._s2.len() > 19) d._s2.cut(19); + } + + if (d._f0) // e' il primo: non fa piu' nulla perche' l'intestazione + // viene fatta comunque da set_pim_head + {} + + set_row(rw++,"%4s %s@25g%r@41g%r@58g%r@74g%r@91g%r@107g%r", + (const char*)d._s1, + (const char*)d._s2, + &(d._r0), + &(d._r1), + &(d._r2), + &(d._r3), + &(d._r4), + &(d._r5)); +} + +void TLiquidazione_app::set_plm(_DescrItem& d) +{ + int rw = 1; + if (!(d._r0.is_zero() && + d._r1.is_zero() && + d._r2.is_zero() && + d._r3.is_zero() && + d._r4.is_zero() && + d._r5.is_zero())) + { + set_row(rw++,""); set_row(rw++,""); + set_row(rw++,"Totale@25g%r@41g%r@58g%r@74g%r@91g%r@107g%r", + &(d._r0), + &(d._r1), + &(d._r2), + &(d._r3), + &(d._r4), + &(d._r5)); + set_row(rw++,""); + } + if (!d._r6.is_zero()) + { + set_row(rw++,"di cui per acquisti intracomunitari@107g%r", &(d._r6)); + } + if (!(d._r7.is_zero() && d._r8.is_zero())) + { + set_row(rw++,"Totali acquisti indeducibili per art.19@91g%r@107g%r", + &(d._r7), &(d._r8)); + } + if (! (d._r9.is_zero() && d._r10.is_zero())) + { + set_row(rw++, "Totale acquisti indeducibili su ricavi esenti@91g%r@107g%r", + &(d._r9), + &(d._r10)); + } + + real acq_pint(d._s0); + real acq_pint_iva(d._s1); + + if (! (acq_pint.is_zero() && acq_pint_iva.is_zero())) + { + set_row(rw++, "Totale acquisti indeducibili per passaggi interni@91g%r@107g%r", + &acq_pint, + &acq_pint_iva); + } + + real tot1 = d._r7 + d._r4 + d._r9 + acq_pint; + real tot2 = d._r8 + d._r5 + d._r10 + acq_pint_iva; + + if (tot1 != d._r4 || tot2 != d._r5) + { + // i corrispettivi finiscono nelle vendite + d._r0 += d._r2; + d._r1 += d._r3; + d._r2 = ZERO; + d._r3 = ZERO; + // per ora lascio r2 e r3 anche se sono sempre 0 + set_row(rw++, ""); + set_row(rw++,"Totale Generale IVA@25g%r@41g%r@58g%r@74g%r@91g%r@107g%r", + &(d._r0), + &(d._r1), + &(d._r2), + &(d._r3), + &tot1, + &tot2); + } +} + + +void TLiquidazione_app::set_pumpam(_DescrItem& d) +{ + bool printed = FALSE; + + // d._f1 dice se c'era qualcosa sopra nella stessa pagina + real spgn(d._s2); + real spgn_iva(d._s3); + + TToken_string tt(d._s4); // Token String + TToken_string dp(d._s0); // Due Palle + real aqsi(tt.get(0)); + real aqsv(tt.get(1)); + real vnsi(tt.get(2)); + real vnsv(tt.get(3)); + real ammindi(dp.get(1)); + real ammindv(dp.get(2)); + + int row = 5; + + if (!(aqsi.is_zero() && aqsv.is_zero())) + { + printed = TRUE; + set_row(row++, "Acquisti in sospensione di imposta@50g%r@69g%r", + &aqsi, + &aqsv); + } + if (!(vnsi.is_zero() && vnsv.is_zero())) + { + printed = TRUE; + set_row(row++, "Vendite in sospensione di imposta@50g%r@69g%r", + &vnsi, + &vnsv); + } + if (!(d._r8.is_zero() && d._r9.is_zero())) + { + printed = TRUE; + set_row(row++, "Cessione beni ammortizzabili@50g%r@69g%r", + &(d._r8), + &(d._r9)); + } + if (! (d._r4.is_zero() && d._r5.is_zero())) + { + printed = TRUE; + set_row(row++, "Acquisto beni destinati alla rivendita@50g%r@69g%r", + &(d._r4), + &(d._r5)); + } + if (! (ammindi.is_zero() && ammindv.is_zero())) + { + printed = TRUE; + set_row(row++, "Acquisto beni ammortizzabili IVA indetraibile@50g%r@69g%r", + &ammindi, + &ammindv); + } + if (! (d._r0.is_zero() && d._r1.is_zero())) + { + printed = TRUE; + set_row(row++, "Acquisto beni ammortizzabili IVA detraibile@50g%r@69g%r", + &(d._r0), + &(d._r1)); + } + if (!(d._r6.is_zero() && d._r7.is_zero())) + { + printed = TRUE; + set_row(row++, "Altri beni strumentali acquisiti in leasing@50g%r@69g%r", + &(d._r6), + &(d._r7)); + } + if (!(d._r2.is_zero() && d._r3.is_zero())) + { + printed = TRUE; + real rn = d._r2 * real(DETRAZIONE_6PERCENTO); + set_row(row++, "Acquisto beni soggetti a detrazione (6%%)" + "@50g%r@69g%r@86g%r", + &(d._r2), + &(d._r3), + &rn); + } + if (!(spgn.is_zero() && spgn_iva.is_zero())) + { + printed = TRUE; + set_row(row++, "Spese generali@50g%r@69g%r", + &spgn, + &spgn_iva); + } + if (d._f0) + { + printed = TRUE; + real prc(dp.get(0)); + + set_row(row++, "%% PRO-RATA ed IVA non detraibile (%s%%)@69g%r", + (const char*)prc.string(), &(d._r11)); + } + + // items vari per dichiarazione annuale + for (int i = 0; i < d._arr.items(); i++) + { + _DescrItem& dd = (_DescrItem&)d._arr[i]; + printed |= set_annual(dd); + } + + if (printed) + { + set_bookmark("Altri dati", _att_bookmark); + + set_row(1,""); + set_row(2,""); + set_row(3,"ALTRI DATI RELATIVI ALLA DICHIARAZIONE@55gimponibile" + "@77gimposta@91gdetrazione"); + set_row(4,""); + } + else /* if (!d._f1) */ + set_row(1,""); + + // form feed + /* if (printed || !d._f1) */ set_auto_ff(TRUE); +} + +void TLiquidazione_app::set_grand(_DescrItem& d) +{ + real& risultato = d._r0; + real& rimborso = d._r1; + real& cred_cost = d._r2; + real& deb_mens = d._r3; + real& rettifiche = d._r5; + real& detrazioni = d._r6; + real& interessi = d._r7; + real& versamenti = d._r8; + real& vers_int = d._r9; + real& conguaglio = d._r10; + TToken_string tt(d._s0); + real iva_vend(tt.get(0)); + real iva_acq(tt.get(1)); + real cred_prec(tt.get(2)); + real debt_prec(tt.get(3)); + + real acc_dec(d._s1); + real res_cred(d._s2); + real res_debt(d._s3); + real rett_debt(0.0); + real rett_cred(0.0); + real& interesse = d._r11; + + if (rettifiche.sign() > 0) rett_debt = rettifiche; + if (rettifiche.sign() < 0) rett_cred = -rettifiche; + + set_bookmark("Riepilogativo liquidazione", _firm_bookmark); + + set_row(1,""); set_row(2,""); set_row(3,""); set_row(4,""); + set_row(5,"@11g@bCALCOLO LIQUIDAZIONE D'IMPOSTA@r"); + set_row(6,""); int rw = 7; + set_row(rw++," @66gCredito@84gDebito"); set_row(rw++,""); + set_row(rw++,"@11gIva sulle operazioni di vendita@75g%r", &iva_vend); + set_row(rw++,"%s@11gRettifiche IVA a debito%s@75g%r", + _is_visliq ? "$[r]" : "", _is_visliq ? "$[n]" : "", &rett_debt); + set_row(rw++,"%s@11gIva chiesta a rimborso%s@75g%r", + _is_visliq ? "$[r]" : "", _is_visliq ? "$[n]" : "", &rimborso); + + // conguaglio prorata + if (conguaglio.sign() > 0) + { + set_row(rw++,"@11gConguaglio pro-rata@75g%r", &conguaglio); + } + + // debito liq. precedente < 50000 + if (debt_prec > ZERO) + set_row(rw++,"@11gDebito da liquidazione precedente@75g%r", &debt_prec); + + set_row(rw++,"@11gRISULTATO@75g%r", &res_debt); + set_row(rw++,"@11gIva sulle operazioni di acquisto@58g%r", &iva_acq); + if (_isannual || d._f1) + set_row(rw++,"@11gCredito inizio anno@58g%r", &cred_prec); + else + set_row(rw++,"@11gCredito precedente@58g%r", &cred_prec); + + if (!acc_dec.is_zero()) + set_row(rw++,"%s@11gVersamento acconto dicembre%s@58g%r", + _is_visliq ? "$[r]" : "", _is_visliq ? "$[n]" : "", &acc_dec); + + if (!detrazioni.is_zero()) + set_row(rw++,"@11gUlteriori detrazioni@58g%r", &detrazioni); + + set_row(rw++,"%s@11gRettifiche IVA a credito%s@58g%r", + _is_visliq ? "$[r]" : "", _is_visliq ? "$[n]" : "", &rett_cred); + + if (!_is_visliq) + { + // versamenti effettuati + if (!versamenti.is_zero()) + { + set_row(rw++,"@11gVersamenti effettuati@58g%r", &versamenti); + } + // versamenti integrativi + if (!vers_int.is_zero()) + { + set_row(rw++,"@11gVersamenti integrativi@58g%r", &vers_int); + } + } + if (conguaglio.sign() < 0) + { + real cg = conguaglio; + cg = -cg; + set_row(rw++,"@11gConguaglio pro-rata@58g%r", &cg); + } + set_row(rw++,"@11gRISULTATO@58g%r", &res_cred); + + // se non c'e' nulla da versare stampa solo una riga vuota + // Serve, non toglierla, stronzo. + if (risultato.is_zero()) + set_row(rw++,""); + else + { + if (risultato.sign() < 0) + { + real iva = abs(risultato); + if (_isannual || _isriepilogo) iva.round(ROUND_MILLELIRE); + set_row(rw++,"@23gCREDITO ATTUALE@58g%r",&iva); + } + else + { + real iva = risultato + interessi; + if (_isannual || _isriepilogo) iva.round(ROUND_MILLELIRE); + if (!iva.is_zero()) + { + if (!interessi.is_zero()) + { + set_row(rw++,"@23gIVA DOVUTA@75g%r",&risultato); + set_row(rw++,"@23gInteresse %6.2r %%@75g%r",&interesse, &interessi); + } + if (iva >= IVA_DA_RIPORTARE || _isannual || _isriepilogo) + set_row(rw++,"@23gIVA DA VERSARE@75g%r",&iva); + else + set_row(rw++,"@23gIVA A DEBITO DA NON VERSARE@75g%r",&iva); + } + } + } + + if (_is_visliq) + { + // stampa versamenti (anche 0) ad uso visualizzazione liquidazione IVA + rw ++; + set_row(rw++,"@11g$[r]Versamenti effettuati$[n]@58g%r", &versamenti); + set_row(rw++, ""); + set_row(rw++, ""); + } + + if (!_is_visliq) + { + // descrizione rettifiche + if (!(d._s4.empty() && d._s5.empty())) + { + rw++; + set_row(rw++, "@11g@bDESCRIZIONE RETTIFICHE@r"); + rw++; + } + if (!d._s4.empty()) { set_row(rw++, "@11g%t", &(d._s4)); } + if (!d._s5.empty()) { set_row(rw++, "@11g%t", &(d._s5)); } + } + + // rapportini per rimborso infraannuale + // non si stampano se la stampa serve per la visualizz. + //modifica del 07/07/1995 + //*** solo in st.di prova in coda ai registri deve scendere + // il prospetto di rimborso + //*** sempre (cioe' in bollato e in prova) deve scendere + // il prospettino versamento (boh???????????????????) + //if (d._arr.items() > 0 && !_is_visliq && !_isregis) + if (d._arr.items() > 0 && !_is_visliq) + { + for (int i = 0; i < d._arr.items(); i++) + { + _DescrItem& di = (_DescrItem&)d._arr[i]; + + if (di._flags == RIMBORSO) + { + if (!_isregis || (_isregis && !_isfinal)) + { + set_print_zero(TRUE); + set_row(rw++,""); + set_row(rw++,""); + + set_bookmark("Prospetto di rimborso", _firm_bookmark); + + set_row(rw++, " PROSPETTO DI RIMBORSO"); + + if (di._f0) + { + // esenti e non imponibili + set_row(rw++,""); + set_row(rw++,"1) Soggetto con quota di operazioni esenti e non" + " imponibili superiore al 25%%"); + + real perc = (di._r0/di._r1); perc *= CENTO; perc.ceil(ROUND_LIRA); + + TString sep(strlen(REAL_PICTURE)+2); sep.fill('-'); + set_row(rw++,""); + set_row(rw++,"@26gTotale operazioni esenti e non imp.@66g%r", + &(di._r0)); + set_row(rw++,"@66g%t x 100 = %3r%%", &sep, &perc); + set_row(rw++,"@26gVolume di affari lordo@66g%r", &(di._r1)); + set_row(rw++,""); + } + + if (di._f1) + { + set_row(rw++,""); + set_row(rw++,"2) Soggetto con acquisti ad aliquota media " + "superiore a quella delle vendite"); + TString sep(strlen(REAL_PICTURE)+2); sep.fill('-'); + set_row(rw++,""); + set_row(rw++,"@26gTotale imposte sugli acquisti@66g%r", &(di._r5)); + set_row(rw++,"@66g%t x 100 = %5.2r%%", &sep, &(di._r7)); + set_row(rw++,"@26gTotale imponibili sugli acquisti@66g%r", + &(di._r3)); + set_row(rw++,""); + set_row(rw++,"@26gTotale imposte sulle vendite@66g%r", &(di._r4)); + set_row(rw++,"@66g%t x 100 = %5.2r%%", &sep, &(di._r6)); + set_row(rw++,"@26gTotale imponibili sulle vendite@66g%r", &(di._r2)); + } + + set_print_zero(FALSE); + } + } + // prospettino versamento + else if (di._flags == DELEGA) + { + int rr = rw; + if (rw < (printer().formlen() - 10)) + rw = printer().formlen() - 10; + + for (int i = rr; i < rw; i++) set_row(i,""); + + set_bookmark("Riepilogo versamenti", _firm_bookmark); + + TString dt = di._d0.string(); + TString vr = di._r0.string("###.###.###.###"); + + // la cincia non vuole lo zero + if (atof(vr) == 0.0 && vr[vr.len()-1] == '0') vr[vr.len()-1] = ' '; + + set_row(rw++, "Versamento di L. %s effettuato il %s@68gdiretto all'ufficio IVA di %s", + (const char*)vr, + (const char*)dt, + (const char*)(di._s0)); + set_row(rw++, "@68gtramite %s", (const char*)(di._s1)); + set_row(rw++, "@68gcodice azienda %s codice dipendenza %s", + (const char*)(di._s2), (const char*)(di._s3)); + } + } + } + + if (!_is_visliq) set_auto_ff(TRUE); + else set_auto_ff(FALSE); + + _firm_bookmark = -1; +} + + +bool TLiquidazione_app::set_annual(_DescrItem& d) +{ + // chiamata internamente a set_pims + bool ret = FALSE; + + int row = get_maxrow()+1; + if (d._f0 & IS_PRORATA) + { + // non lo ha stampato prima se annuale, perche' vladimiro il nefido + // pretende l'assurdo aggiornamento della perc. a quella nuova + set_row(++row, "%% PRO-RATA ed IVA non detraibile (%s%%)@69g%r", + (const char*)(d._r2.string()), &(d._r6)); + row++; + + set_bookmark("Calcolo pro-rata", _att_bookmark); + + ret = TRUE; + set_print_zero(TRUE); + set_row(row++,""); + set_row(row++,"CALCOLO DELLA PERCENTUALE DI INDETRAIBILITA'"); + set_row(row++,""); + set_row(row++,"Operazioni esenti riga B1@30g%r", &(d._r1)); + set_row(row++,"Operazioni esenti riga B2@30g%r", &(d._r4)); + set_row(row++,"Operazioni esenti riga B3@30g%r", &(d._r5)); + set_row(row++,"Volume d'affari riga B4@30g%r", &(d._r0)); + set_row(row++,"Indetraibilita'@30g%r%%", &(d._r2)); + if (!(d._r3.is_zero())) + { + const char* sss = d._r3.sign() < 0 ? "credito" : "debito"; + real ccc = abs(d._r3); + set_row(row++,"Conguaglio a %s@30g%r", sss, &ccc); + } + set_print_zero(FALSE); + } + return ret; +} + + +void TLiquidazione_app::set_ventila(_DescrItem& d) +{ + if (d._arr.items() == 0 || d._r0.is_zero()) + return; + + set_bookmark("Prospetto ventilazione", _att_bookmark); + + set_row(1,"@54gPROSPETTO VENTILAZIONE"); + set_row(2,""); + set_row(3,""); + set_row(4,"@10gTotale acquisti destinati alla rivendita@55g%r", + &(d._r0)); + set_row(5,"@10gTotale dei corrispettivi da ventilare@55g%r", + &(d._r1)); + real m = d._r1 / d._r0; + set_row(6,"@10gMoltiplicatore@59g%3.9r",&m); + set_row(7,""); + set_row(8,"@10gCod."); + set_row(9,"@10gIVA@17gDescrizione@48gAcquisti" + "@65gImponibile vendite@89gImposta vendite"); + set_row(10,""); + int row = 11; + real t1, t2, t3; + for(int i = 0; i < d._arr.items(); i++) + { + _vDesc& vd = (_vDesc&)d._arr[i]; + look_iva(vd._codiva); + TString s0 = _iva->get("S0"); + set_row(row+i,"@8g%5s@17g%s@41g%r@68g%r@89g%r", + (const char*)vd._codiva, + (const char*)s0, + &(vd._acq), + &(vd._vnd), + &(vd._viv)); + t1 += vd._acq; + t2 += vd._vnd; + t3 += vd._viv; + } + set_row(row+i+1,""); + set_row(row+i+2,"@10gTotale@41g%r@68g%r@89g%r", + &t1, &t2, &t3); + set_auto_ff(TRUE); +} + +void TLiquidazione_app::set_regagr(_DescrItem& d) +{ + set_print_zero(TRUE); + + real& agr_1 = d._r0; + real& agr_2 = d._r1; + real& agr_3 = d._r2; + real& agr_4 = d._r3; + real& agr_5 = d._r4; + real& agr_6 = d._r5; + real& agr_7 = d._r6; + real& agr_1i = d._r7; + real& agr_2i = d._r8; + + real ara = agr_5 + agr_6; + real arn = agr_3 + agr_4; + + // percentuale detraibilita' + // real pdetr = (); + set_bookmark("Prospetto regime agricolo", _att_bookmark); + + set_row(1,"@50gPROSPETTO REGIME AGRICOLO"); + set_row(2,""); + set_row(3, "Cessioni in regime agricolo (Tabella A/I)@54g%r",&agr_1); + set_row(4, ""); + set_row(5, "Cessioni non in regime agricolo@54g%r",&agr_2); + set_row(6, ""); + set_row(7, "Acquisti in regime agricolo@54g%r",&ara); + set_row(8, ""); + set_row(9, "Acquisti non in regime agricolo@54g%r",&arn); + set_row(10, "... di cui beni ammortizzabili@54g%r",&agr_4); + set_row(11, ""); + set_row(12, "Acquisti ad uso promiscuo@54g%r",&agr_7); + + if (/*agr_7.sign() > 0*/ TRUE) + { + real pdetr = (agr_2i / (agr_1i + agr_2i)); + pdetr.round(2); + real ivadt = agr_7 * pdetr; + pdetr *= CENTO; + pdetr.round(ROUND_LIRA); + ivadt.round(ROUND_LIRA); + + TString up = agr_2i.string("."); + up << " x 100"; + TString dn = agr_1i.string("."); + dn << " + " << agr_2i.string("."); + int ln = max(up.len(), dn.len()) + 2; + TString den(ln); den.fill('-'); + up.center_just(ln); dn.center_just(ln); + + set_row(13, ""); + set_row(14, "@31g%s", (const char*)up); + set_row(15, "Percentuale di detraibilita'@31g%s = @54g%r", + (const char*)den, + &pdetr); + set_row(16, "@31g%s", (const char*)dn); + + up = agr_7.string("."); + up << " x " << pdetr.string("."); + dn = "100"; + if ((max(up.len(), dn.len()) + 2) > ln) + ln = max(up.len(), dn.len()) + 2; + TString den1(ln); den1.fill('-'); + up.center_just(ln); dn.center_just(ln); + + set_row(17, ""); + set_row(18, "@31g%s", (const char*)up); + set_row(19, "Iva detraibile@31g%s = @54g%r", + (const char*)den1, + &ivadt); + set_row(20, "@31g%s", (const char*)dn); + } + + set_auto_ff(TRUE); + set_print_zero(FALSE); +} + +void TLiquidazione_app::set_viaggio(_DescrItem& d) +{ + // the longest & stronzest + // Nel corso della scrittura di questa funzione + // Berlusconi + Fini + Bossi hanno vinto le elezioni + // ... lungo commento cancellato + + real& corr_CEE = d._r0; + real& corr_misCEE = d._r1; + real& corr_noCEE = d._r2; + real& acq_CEE = d._r3; + real& acq_misCEE = d._r4; + real& acq_noCEE = d._r5; + real& acq_misnoCEE = d._r6; + real& cred_cos = d._r8; + + real perc_r = (acq_misCEE * CENTO)/(acq_misCEE + acq_misnoCEE); perc_r.round(2); + real ivm = (corr_misCEE * perc_r)/CENTO; ivm.round(ROUND_LIRA); + real tc = (corr_CEE + ivm); + real ta = (acq_CEE + acq_misCEE); + real bi = tc - ta - cred_cos; + + real tcc = corr_CEE + corr_noCEE + corr_misCEE; + real tco = acq_CEE + acq_noCEE + acq_misCEE + acq_misnoCEE; + real tma = acq_CEE + acq_misCEE; + // real rip = perc_r; rip.round(2); + // real cim = (d._r1 * d._r7)/CENTO; cim.round(ROUND_LIRA); + + + set_print_zero(TRUE); + + set_bookmark("Prospetto 74 ter", _att_bookmark); + + set_row(1,""); + set_row(2,"@54gRIEPILOGO 74 TER"); + set_row(3,""); + set_row(4,"Ammontare dei corrispettivi relativi a viaggi eseguiti" + " interamente nella CEE .....................@100g%r", &(corr_CEE)); + set_row(5,"Ammontare dei corrispettivi relativi a viaggi misti (dentro" + " e fuori CEE) ......................... @100g%r", &(corr_misCEE)); + set_row(6,"Ammontare dei corrispettivi relativi a viaggi eseguiti" + " interamente fuori CEE ..................... @100g%r", &(corr_noCEE)); + + + set_row(7,""); + set_row(8,"@56gTotale corrispettivi@100g%r", &tcc); + set_row(9,""); + + set_row(10,"Ammontare dei costi relativi a viaggi interamente" + " svolti nella CEE ............................... @100g%r", + &(acq_CEE)); + set_row(11,"Ammontare dei costi relativi a viaggi misti (per la" + " parte CEE) ................................... @100g%r", + &(acq_misCEE)); + set_row(12,"Ammontare dei costi relativi a viaggi interamente" + " svolti fuori CEE ............................... @100g%r", + &(acq_noCEE)); + set_row(13,"Ammontare dei costi relativi a viaggi misti (per la" + " parte fuori CEE) .............................@100g%r", + &(acq_misnoCEE)); + + + set_row(14,""); + set_row(15,"@64gTotale costi@100g%r", &tco); + + set_row(16,""); + set_row(17,"DETERMINAZIONE CORRISPETTIVI IMPONIBILI " + "RELATIVI A VIAGGI MISTI"); + set_row(18,""); + + // la bella frazioncina della percentuale di ripartizione + TString tmp(acq_misCEE.string(REAL_PICTURE)); tmp.ltrim(); + TString up = tmp; + up << " x 100"; + TString dn = tmp; + tmp = acq_misnoCEE.string(REAL_PICTURE); tmp.ltrim(); + dn << " + " << tmp; + int ln = max(up.len(), dn.len()) + 2; + TString den(ln); den.fill('-'); + up.center_just(ln); dn.center_just(ln); + + // la bella frazioncina degli imponibili viaggi misti + TString tmp2 = corr_misCEE.string(REAL_PICTURE); tmp2.ltrim(); + TString up2 = tmp2; + up2 << " x " << perc_r.string(2); + TString dn2 = "100"; + int ln2 = max(up2.len(), 3) + 2; + TString den2(ln2); den2.fill('-'); + up2.center_just(ln2); dn2.center_just(ln2); + + // la gran frazionazza centrata e stupenda + int tot = 35 + ln + ln2; + int rem1 = (100 - tot)/2; if (rem1 < 0) rem1 = 0; + int pos1 = rem1 + 13; + int rem2 = pos1+ den.len() + 11; + int pos2 = rem2 + 20; + + + set_row(19,format("@%dg%%t@%dg%%t", pos1, pos2), + &up, &up2); + set_row(20,format("@%dgPerc. rip. = %%t = %%5.2r; @%dg" + "Imp. viaggi misti = %%t = @100g%%r", + rem1, rem2), + &den, &perc_r, &den2, &ivm); + set_row(21,format("@%dg%%t@%dg%%t", pos1, pos2), + &dn, &dn2); + + real tmr = corr_CEE + ivm; + + // whew, come dicono su Topolino + + tmp = corr_CEE.string(REAL_PICTURE); tmp.ltrim(); + up = "("; up << tmp << " + "; + tmp = ivm.string(REAL_PICTURE); tmp.ltrim(); + up << tmp << ")"; + den.fill('.',59-up.len()); + set_row(23,"Ammontare dei corrispettivi imponibili@40g%t %t@100g%r", + &up, &den, &tmr); + + // se e' l'annuale non ha senso altro + if (d._f1) return; + + tmp = acq_CEE.string(REAL_PICTURE); tmp.ltrim(); + up = "("; up << tmp << " + "; + tmp = acq_misCEE.string(REAL_PICTURE); tmp.ltrim(); + up << tmp << ")"; + den.fill('.',59-up.len()); + set_row(24,"Ammontare dei costi deducibili@40g%t %t@100g%r", + &up, &den, &tma); + den.fill('.',60); + set_row(25,"Credito di costo precedente @40g%t@100g%r", &den, &(cred_cos)); + + tmp = tmr.string(REAL_PICTURE); tmp.ltrim(); + up = "["; up << tmp << " - ("; + tmp = tma.string(REAL_PICTURE); tmp.ltrim(); + up << tmp << " + "; + tmp = d._r8.string(REAL_PICTURE); tmp.ltrim(); + up << tmp << ")]"; + den.fill('.',59-up.len()); + + set_row(26,"Base imponibile lorda@40g%t %t@100g%r", &up, &den, &bi); + set_row(27,""); + + if (bi.sign() > 0) + { + real aliva = aliquota_agvia(); + real alcnt = aliva + CENTO; + real dovuta = (bi/(alcnt/CENTO)) * (aliva/CENTO); + dovuta.ceil(ROUND_LIRA); // ceil voluto da MI3074 + + tmp = bi.string(REAL_PICTURE); tmp.ltrim(); + up = tmp; + up << " x " << aliva.string(5,2); + dn = alcnt.string(); + ln = max(up.len(), 3) + 2; + den.fill('-',ln); + up.center_just(ln); dn.center_just(ln); + + tmp.fill('.', 59 - den.len()); + + set_row(28,"@40g%t",&up); + set_row(29,"IVA A DEBITO@40g%t %t@100g%r", &den, &tmp, &dovuta); + set_row(30,"@40g%t", &dn); + } + else if (bi.sign() < 0) + { + bi = abs(bi); + set_row(28,""); + set_row(29,"CREDITO DI COSTO DA RIPORTARE@100g%r", &bi); + } + + set_print_zero(FALSE); + set_auto_ff(TRUE); +} + +void TLiquidazione_app::set_acconto_p(_DescrItem& d) +{ + //set_print_zero(TRUE); + + const char* errmsg[3] = { + {"manca la tabella risultati liquidazione per l'anno corrente"}, + {"manca la tabella risultati liquidazione per l'anno precedente"}, + {"manca la tabella dichiarazione annuale per l'anno precedente"}}; + + set_row(1,"%t@7g%t",&(d._s0), &(d._s1)); + if (d._f2) + set_row(1,"@50g@b*** %s ***@r", errmsg[d._f2 -1]); + else + { + if (d._f0) // base anno in corso + { + if (d._f1) // stampa base di calcolo + { + /*** + real bc = d._r0; + if (bc.sign() < 0) + { + bc = abs(bc); + set_row(1,"@73g%r@86g%r@119g%s", &bc, &d._r1, + d._f3 ? "Si" : "No"); + } + else + set_row(1,"@55g%r@86g%r@119g%s", &bc, &(d._r1), + d._f3 ? "Si" : "No"); + ***/ + set_row(1,"@58g%r@74g%r@96g%r@122g%s", &(d._r3), + &(d._r2), &(d._r1), d._f3 ? "Si" : "No"); + } + else set_row(1,"@62g%r@91g%s", &(d._r1), d._f3 ? "Si" : "No"); + } + else + { + if (d._f1) // stampa base di calcolo + set_row(1,"@58g%r@88g%r", &(d._r0), &(d._r1)); + else + set_row(1,"@87g%r",&(d._r1)); + } + } + //set_print_zero(FALSE); +} + +void TLiquidazione_app::set_acchead_p(_DescrItem& d) +{ + reset_header(); + set_header(1,"Gestione IVA@109gData @<@125gPag. @#"); + set_header(3,sep); + + if (d._f0) // base anno in corso + { + set_header(2,"@40gCALCOLO ACCONTI IVA DICEMBRE %s " + "(base anno in corso)", (const char*) _year); + if (d._f1) // stampa base calcolo + { + set_header(4,"@58g------- Base di calcolo -------"); + set_header(5,"Ditta@7gDenominazione@62gDebito@78gCredito" + "@94gACCONTO calcolato@115gLiq. differita"); + set_header(6,sep); + set_header(7,""); + } + else + { + set_header(4,"Ditta@7gDenominazione@60gACCONTO calcolato" + "@84gLiq. differita"); + set_header(5,sep); + set_header(6,""); + } + } + else + { + set_header(2,"@40gCALCOLO ACCONTI IVA DICEMBRE %s", (const char*) _year); + set_header(5,sep); + set_header(6,""); + if (d._f1) + set_header(4,"Ditta@7gDenominazione@58gBase di calcolo" + "@86gACCONTO calcolato"); + else + set_header(4,"Ditta@7gDenominazione@85gACCONTO calcolato"); + } +} + + +// --------------------------------------------------------------------- +// Tabulato deleghe +// --------------------------------------------------------------------- + +void TLiquidazione_app::set_deltab(_DescrItem& d, bool iscred) +{ + reset_header(); + int rw = 1; + static bool credpr; + + if (iscred) + { + // set header + set_header(1,"ELENCO DITTE A CREDITO@30g%s %s@109gData @<@125gPag. @#", + d._f0 == 13 ? "Annuale " : itom(d._f0), (const char*)_year); + set_header(2,sep); + set_header(3,"@40gF@60gImporto a"); + set_header(4,"Cod.@8gDenominazione@40gR@62gcredito"); + set_header(5,sep); + set_header(6,""); + + // set rows + for (int i = 0; i < d._arr.items(); i++) + { + TToken_string& tt = (TToken_string&)(d._arr)[i]; + TString cod(tt.get(0)); + TParagraph_string rgs(tt.get(1), 30); + TString diocantaro(rgs.get(0)); + TString frq(tt.get(2)); + real tp (tt.get(3)); + real in (tt.get(4)); + tp -= in; + tp = -tp; + set_row(rw++, "%-5s@8g%-30s@40g%1s@54g%r", + (const char*)cod, (const char*)diocantaro, + (const char*)frq, &tp); + for (int i = 1; i < rgs.items(); i++) + set_row(rw++, "@8g%-30s", (const char*)rgs.get(i)); + } + } + else + { + // set header + set_header(1,"ELENCO DITTE A DEBITO@30g%s %s@109gData @<@125gPag. @#", + d._f0 == 13 ? "Annuale " : itom(d._f0), (const char*)_year); + set_header(2,sep); + set_header(3,"@40gF@60gImporto da@73gCodice@83gCod."); + set_header(4,"Cod.@8gDenominazione@40gR Numero telefonico@63gversare Banca Dip. Con."); + set_header(5,sep); + set_header(6,""); + + + // set rows + for (int i = 0; i < d._arr.items(); i++) + { + TToken_string& tt = (TToken_string&)(d._arr)[i]; + TString cod(tt.get(0)); + TParagraph_string rgs(tt.get(1), 30); + TString diocantaro(rgs.get(0)); + TString frq(tt.get(2)); + real tp (tt.get(3)); + real in (tt.get(4)); + TString abi(tt.get(5)); + TString cab(tt.get(6)); + TString con(tt.get(7)); + TString tel(tt.get(8)); + if (!tel.blank()) + tel << '/'; + tel << tt.get(9); + tp += in; + + + set_row(rw++, "%-5s@8g%-30s@40g%1s %s @55g%r %5s %5s %3s", + (const char*)cod, (const char*)diocantaro, (const char*)frq, + (const char*)tel, &tp, (const char*)abi, + (const char*)cab, (const char*)con); + + for (int i = 1; i < rgs.items(); i++) + set_row(rw++, "@8g%-30s", (const char*)rgs.get(i)); + } + } + set_auto_ff(TRUE); +} diff --git a/cg/cg4305.cpp b/cg/cg4305.cpp index 793e6beae..a7af26f28 100755 --- a/cg/cg4305.cpp +++ b/cg/cg4305.cpp @@ -1,453 +1,470 @@ -// cg4306: liquidazione IVA -// funzionalita' accessorie (calcolo acconto, estrazione deleghe) - -#include -#include -#include -#include -#include -#include - -#include "cg4300.h" -#include "cg4300b.h" -#include "cg4300c.h" - -// -------------------------------------------------- estrazione deleghe -bool TLiquidazione_app::set_deleghe() -{ - TMask m("cg4300b.msk"); - - m.field(FLD_CGB_YEAR).set(_year); - m.field(FLD_CGB_YEAR).set_handler(ch_year_handler); - m.field(CHK_CGB_PRINT).set(_isprint ? "X" : ""); - - int k = 0; - long j; - _calcall = FALSE; - - for (;;) - { - if (k == K_ESC || k == K_ENTER) - break; - - k = m.run(); - - _isprint = m.get_bool(CHK_CGB_PRINT); - - switch (k) - { - case DLG_SELECT: - - _ditte->run(); - for (j = 0l; j < _ditte->items(); j++) - if (_ditte->checked(j)) _selected.set(j); - break; - - case BUT_CGB_ALL: - - _ditte->check(-1); - for (j = 0l; j < _ditte->items(); j++) - if (_ditte->checked(j) && !_ditte->disabled(j)) - _selected.set(j); - _calcall = TRUE; - k = K_ENTER; - break; - } - } - - if (k == K_ENTER) - { - _year = m.get(FLD_CGB_YEAR); - _month = atoi(m.get(FLD_CGB_MONTH)); - } - - return k == K_ENTER; -} - -bool TLiquidazione_app::extract_deleghe() -{ - char buf[256]; TArray desc; - _prind = new TProgind(_calcall ? _n_ditte : _selected.ones(), - " Estrazione deleghe \n" - " preparazione archivi \n " - " \n ", - TRUE,TRUE,40); - - for (int l = 0; l < _ditte->items(); l++) - { - if (_prind->iscancelled()) - break; - - if (!(_calcall || _selected[l]) || _ditte->disabled(l)) - continue; - - TApplication::set_firm(atol(_ditte->row(l).get(1))); - - _nditte->curr().zero(); - _nditte->curr().put("CODDITTA",_ditte->row(l).get(1)); - _nditte->read(); - - // must succeed - look_lia(); - _freqviva = _lia->get("S7"); - - sprintf (buf,"Estrazione deleghe (%d):\nditta %s\n ", - _month, - (const char*)_nditte_r->get("RAGSOC")); - _prind->set_text(buf); - - - if (is_month_ok_strict(_month) || _month == 13) - { - _isbenzinaro = _nditte->curr(LF_ATTIV).get_bool("ART74/4"); - bool mens = _freqviva == "M"; - _isannual = (_month == 12 && !mens && !_isbenzinaro) || - (_month == 13 && (mens || _isbenzinaro)); - _isriepilogo = _month == 13; - _isendliq = _isannual || _isriepilogo; - - extract_delega(_month, desc); - } - _prind->addstatus(1); - } - - TApplication::set_firm(__firm); - delete _prind; - - if (_isprint) - { - _DescrItem* ddeb = NULL; - _DescrItem* dcrd = NULL; - - // scorri desc e prepara descritems - for (int i = 0; i < desc.items(); i++) - { - TToken_string& tt = (TToken_string&)desc[i]; - - real tp(tt.get(3)); - if (tp.sign() > 0) - { - if (ddeb == NULL) - { - ddeb = new _DescrItem(DELDEB); - ddeb->_f0 = _month; - } - ddeb->_arr.add(tt); - } - else - { - if (dcrd == NULL) - { - dcrd = new _DescrItem(DELCRED); - dcrd->_f0 = _month; - } - dcrd->_arr.add(tt); - } - } - if (dcrd != NULL) _descr_arr.add(dcrd); - if (ddeb != NULL) _descr_arr.add(ddeb); - } - - return TRUE; -} - -bool TLiquidazione_app::extract_delega(int month, TArray& desc) -{ - TToken_string* tt = NULL; - - if (look_lim(month)) - { - real topay = result_liq(month); // TBC non si puo' fa' accussi'!!!!! pena il casino! - real intr = _lim->get_real("R14"); - topay += intr; // lo vogliono registrato con interessi - real nrnd = topay; - topay.round(-3); - - if (!topay.is_zero()) - { - tt = new TToken_string(80); - tt->add(_nditte->curr().get("CODDITTA")); - tt->add(_nditte->curr().get("RAGSOC")); - tt->add(_freqviva); - tt->add(topay.string()); - tt->add(""); - // tt->add(intr.string()); - } - - if (topay.sign() > 0) - { - look_del(month, _isannual ? 2 : 1, TRUE); - _del->put("R0",topay); - _del->put("R1",intr); - _del->put("R2",nrnd); // non arrotondato, per calcolo risultato a debito/cr - _del->rewrite(); - - tt->add(_del->get("S7")); - tt->add(_del->get("S8")); - tt->add(_del->get("S9")); - tt->add(_nditte->curr().get("PTEL")); - tt->add(_nditte->curr().get("TEL")); - } - } - - if (tt != NULL) - desc.add(tt); - - return TRUE; -} - -// -------------------------------------------- calcolo acconto dicembre -bool TLiquidazione_app::set_acconto(real& inf, real& ina) -{ - TMask m("cg4300c.msk"); - m.set(CHK_CGC_PRINT,"X"); - m.field(FLD_CGC_YEAR).set_handler(ch_year_handler); - int k = 0; long j; - - _calcall = FALSE; - - for (;;) - { - if (k == K_ESC || k == K_ENTER) - break; - k = m.run(); - - _year = m.get(FLD_CGC_YEAR); - _isprint = m.get_bool(CHK_CGC_PRINT); - _isbase = m.get_bool(CHK_CGC_BASE); - _basecalc = (tbc)m.get_long(RDB_CGC_BASE); - - inf = real(m.get(FLD_CGC_INF)); - ina = real(m.get(FLD_CGC_INA)); - - switch (k) - { - case DLG_SELECT: - - // scegli ditte - _ditte->run(); - - for (j = 0l; j < _ditte->items(); j++) - if (_ditte->checked(j)) _selected.set(j); - - break; - case BUT_CGC_ALL: - _ditte->check(-1); - for (j = 0l; j < _ditte->items(); j++) - if (_ditte->checked(j) && !_ditte->disabled(j)) - _selected.set(j); - _calcall = TRUE; - k = K_ENTER; - break; - } - } - return k == K_ENTER; -} - - -bool TLiquidazione_app::recalc_acconti(real& inf, real& ina) -{ - char buf[256]; - - bool onemade = FALSE; - - long firm = TApplication::get_firm(); - _prind = new TProgind(_n_ditte, - " Calcolo acconto " - "\n Preparazione archivi " - "\n ", - TRUE,TRUE,40); - - for (int l = 0; l < _ditte->items(); l++) - { - if (_prind->iscancelled()) - break; - if ((_calcall || _selected[l]) && !_ditte->disabled(l)) - { - if (onemade == FALSE && _isprint) - { - _DescrItem* d = new _DescrItem(ACCHEAD); - d->_f0 = _basecalc == incorso; - d->_f1 = _isbase; - _descr_arr.add(d); - } - - _nditte->curr().zero(); - _nditte->curr().put("CODDITTA",_ditte->row(l).get(1)); - _nditte->read(); - - TApplication::set_firm(_nditte->curr().get_long("CODDITTA")); - sprintf (buf,"Calcolo acconto:\nditta %s", - (const char*)_nditte_r->get("RAGSOC")); - _prind->set_text(buf); - recalc_acconto(inf, ina); - onemade = TRUE; - } - _prind->addstatus(1); - } - - TApplication::set_firm(firm); - delete _prind; - return TRUE; -} - -bool TLiquidazione_app::recalc_acconto(real& inf, real& ina) -{ - real bc, acc; - bool isdifferita = FALSE; - bool error = FALSE; - - // TBI rewrite from scratch - // this is absolutely fundamental - if (_basecalc == precedente) - { - // determina casistica - enum { mm, tt, mt, tm, boh } history = boh; - char thh = *_freqviva; - - TString16 thyear = _year; - _year = format("%d", atoi(_year)-1); - - if (!look_lia()) - error = 3; - else - { - char ohh = _lia->get_char("S7"); - - if (ohh == 'M') history = thh == 'M' ? mm : mt; - if (ohh == 'T') history = thh == 'M' ? tm : tt; - if (history == boh) return FALSE; - - // casino benzinari - TString attprev = _nditte->curr().get("CODATTPREV"); - long codd = _nditte->curr().get_long("CODDITTA"); - TLocalisamfile& atts = _nditte->lfile(LF_ATTIV); - atts.zero(); - atts.put("CODDITTA", codd); - atts.put("CODATT", attprev); - if (atts.read() != NOERR) atts.zero(); - if (atts.get_bool("ART74/4")) // e' proprio un gran benzinaro - { - TConfig cnf(CONFIG_DITTA, "cg"); - history = cnf.get_bool("GesT74") ? mm : tt; - } - - switch (history) - { - case mm: - // base calcolo: 12a anno preced, Rideterminare a seconda dell'acconto - // versato; ris = 88% del debito (0 se credito) - if (!look_lim(12)) error = 2; - else - { - bc += _lim->get_real("R0"); - real av = _lim->get_real("R11"); - bc += av; - } - break; - case tt: - case tm: - // base calcolo: 13a anno precedente. Rideterm. per eventuale acconto - if (!look_lim(12)) error = 2; // TBC sara' 13a davvero? Secondo me e' 12 - else - { - bc += _lim->get_real("R0"); - real av = _lim->get_real("R11"); - bc += av; - } - if (_basecalc == tm) - // tm come tt ma si divide per 3 la base di calcolo prima di calcolare l'88% - bc /= real(3.0); - break; - case mt: - // basecalcolo: 10, 11, 12 anno prec., 10 e 11 se a debito, 12 vedi acconto; - // sommare e prendi 88% se a debito - if (!look_lim(10)) error = 2; - else bc += _lim->get_real("R0"); - if (!look_lim(11)) error = 2; - else bc += _lim->get_real("R0"); - if (!look_lim(12)) error = 2; - else - { - bc += _lim->get_real("R0"); - real av = _lim->get_real("R11"); - bc += av; - } - break; - } - - if (bc.sign() > 0) - { - acc = bc * ACCONTO_DICEMBRE; - acc.round(ROUND_LIRA); - } - } - _year = thyear; - } -else if (_basecalc == incorso) -{ - // that's pazzesc but as it turns out there's no better way - _comp_acconto = TRUE; - // force recalc of current month - _recalc = one; - // insozza il water - update_firm(12); - - // calcola l'acconto - if (look_lim(12)) - { - // TBC trimestrali, differite - bc = result_liq(12); - // somma i non fatturati/non annotati - bc += inf + ina; - if (bc.sign() > 0) acc = bc; - } - else error = 1; - - // pulisci il water - _comp_acconto = FALSE; - update_firm(12); -} - -// sbatti l'acconto in LIA -if (look_lia()) -{ - _lia->put("R4",acc); - isdifferita = _lia->get_bool("B1"); - _lia->rewrite(); -} - -bool wasdel = look_del(12,7); - -if (acc.sign() > 0 && acc > ACCONTO_MINIMO_DA_VERSARE) -{ - // crea o aggiorna delega - // TBC everything - look_del(12,7,TRUE); - _del->put("R0", acc); - _del->rewrite(); -} -else if (wasdel) - _del->remove(); - - // per questa volta lasciamo perdere la describe_acconto - if (_isprint) -{ - // segnalazioni di errore da gesticolare: - // error = 0: no error - // error = 1: manca tabella risultati liquidazione per l'anno indicato - // error = 2: manca tabella risultati liquidazione per l'anno precedente - // error = 3: manca tabella dichiarazione annuale per l'anno precedente - _DescrItem* d = new _DescrItem(ACCONTO); - d->_r0 = bc; - d->_r1 = acc; - d->_f0 = _basecalc == incorso; - d->_f1 = _isbase; - d->_f2 = error; - d->_f3 = isdifferita; - d->_s0 = _nditte->curr().get("CODDITTA"); - d->_s1 = _nditte->curr().get("RAGSOC"); - _descr_arr.add(d); -} -return TRUE; -} +// cg4306: liquidazione IVA +// funzionalita' accessorie (calcolo acconto, estrazione deleghe) + +#include +#include +#include +#include +#include +#include + +#include "cg4300.h" +#include "cg4300b.h" +#include "cg4300c.h" + +// -------------------------------------------------- estrazione deleghe +bool TLiquidazione_app::set_deleghe() +{ + TMask m("cg4300b.msk"); + + m.field(FLD_CGB_YEAR).set(_year); + m.field(FLD_CGB_YEAR).set_handler(ch_year_handler); + m.field(CHK_CGB_PRINT).set(_isprint ? "X" : ""); + + int k = 0; + long j; + _calcall = FALSE; + + for (;;) + { + if (k == K_ESC || k == K_ENTER) + break; + + k = m.run(); + + _isprint = m.get_bool(CHK_CGB_PRINT); + + switch (k) + { + case DLG_SELECT: + + _ditte->run(); + for (j = 0l; j < _ditte->items(); j++) + if (_ditte->checked(j)) _selected.set(j); + break; + + case BUT_CGB_ALL: + + _ditte->check(-1); + for (j = 0l; j < _ditte->items(); j++) + if (_ditte->checked(j) && !_ditte->disabled(j)) + _selected.set(j); + _calcall = TRUE; + k = K_ENTER; + break; + } + } + + if (k == K_ENTER) + { + _year = m.get(FLD_CGB_YEAR); + _month = atoi(m.get(FLD_CGB_MONTH)); + } + + return k == K_ENTER; +} + +bool TLiquidazione_app::extract_deleghe() +{ + char buf[256]; TArray desc; + _prind = new TProgind(_calcall ? _n_ditte : _selected.ones(), + " Estrazione deleghe \n" + " preparazione archivi \n " + " \n ", + TRUE,TRUE,40); + + for (int l = 0; l < _ditte->items(); l++) + { + if (_prind->iscancelled()) + break; + + if (!(_calcall || _selected[l]) || _ditte->disabled(l)) + continue; + + TApplication::set_firm(atol(_ditte->row(l).get(1))); + + _nditte->curr().zero(); + _nditte->curr().put("CODDITTA",_ditte->row(l).get(1)); + _nditte->read(); + + // must succeed + look_lia(); + _freqviva = _lia->get("S7"); + + sprintf (buf,"Estrazione deleghe (%d):\nditta %s\n ", + _month, + (const char*)_nditte_r->get("RAGSOC")); + _prind->set_text(buf); + + + if (is_month_ok_strict(_month) || _month == 13) + { + _isbenzinaro = _nditte->curr(LF_ATTIV).get_bool("ART74/4"); + bool mens = _freqviva == "M"; + _isannual = (_month == 12 && !mens && !_isbenzinaro) || + (_month == 13 && (mens || _isbenzinaro)); + _isriepilogo = _month == 13; + _isendliq = _isannual || _isriepilogo; + + extract_delega(_month, desc); + } + _prind->addstatus(1); + } + + TApplication::set_firm(__firm); + delete _prind; + + if (_isprint) + { + _DescrItem* ddeb = NULL; + _DescrItem* dcrd = NULL; + + // scorri desc e prepara descritems + for (int i = 0; i < desc.items(); i++) + { + TToken_string& tt = (TToken_string&)desc[i]; + + real tp(tt.get(3)); + if (tp.sign() > 0) + { + if (ddeb == NULL) + { + ddeb = new _DescrItem(DELDEB); + ddeb->_f0 = _month; + } + ddeb->_arr.add(tt); + } + else + { + if (dcrd == NULL) + { + dcrd = new _DescrItem(DELCRED); + dcrd->_f0 = _month; + } + dcrd->_arr.add(tt); + } + } + if (dcrd != NULL) _descr_arr.add(dcrd); + if (ddeb != NULL) _descr_arr.add(ddeb); + } + + return TRUE; +} + +bool TLiquidazione_app::extract_delega(int month, TArray& desc) +{ + TToken_string* tt = NULL; + + if (look_lim(month)) + { + real topay = result_liq(month); // TBC non si puo' fa' accussi'!!!!! pena il casino! + real intr = _lim->get_real("R14"); + topay += intr; // lo vogliono registrato con interessi + real nrnd = topay; + topay.round(-3); + + if (!topay.is_zero()) + { + tt = new TToken_string(80); + tt->add(_nditte->curr().get("CODDITTA")); + tt->add(_nditte->curr().get("RAGSOC")); + tt->add(_freqviva); + tt->add(topay.string()); + tt->add(""); + // tt->add(intr.string()); + } + + if (topay.sign() > 0) + { + look_del(month, _isannual ? 2 : 1, TRUE); + _del->put("R0",topay); + _del->put("R1",intr); + _del->put("R2",nrnd); // non arrotondato, per calcolo risultato a debito/cr + _del->rewrite(); + + tt->add(_del->get("S7")); + tt->add(_del->get("S8")); + tt->add(_del->get("S9")); + tt->add(_nditte->curr().get("PTEL")); + tt->add(_nditte->curr().get("TEL")); + } + } + + if (tt != NULL) + desc.add(tt); + + return TRUE; +} + +// -------------------------------------------- calcolo acconto dicembre +bool TLiquidazione_app::set_acconto(real& inf, real& ina) +{ + TMask m("cg4300c.msk"); + m.set(CHK_CGC_PRINT,"X"); + m.field(FLD_CGC_YEAR).set_handler(ch_year_handler); + int k = 0; long j; + + _calcall = FALSE; + + for (;;) + { + if (k == K_ESC || k == K_ENTER) + break; + k = m.run(); + + _year = m.get(FLD_CGC_YEAR); + _isprint = m.get_bool(CHK_CGC_PRINT); + _isbase = m.get_bool(CHK_CGC_BASE); + _basecalc = (tbc)m.get_long(RDB_CGC_BASE); + + //inf = real(m.get(FLD_CGC_INF)); + //ina = real(m.get(FLD_CGC_INA)); + + inf = ina = ZERO; + + switch (k) + { + case DLG_SELECT: + + // scegli ditte + _ditte->run(); + + for (j = 0l; j < _ditte->items(); j++) + if (_ditte->checked(j)) _selected.set(j); + + break; + case BUT_CGC_ALL: + _ditte->check(-1); + for (j = 0l; j < _ditte->items(); j++) + if (_ditte->checked(j) && !_ditte->disabled(j)) + _selected.set(j); + _calcall = TRUE; + k = K_ENTER; + break; + } + } + return k == K_ENTER; +} + + +bool TLiquidazione_app::recalc_acconti(real& inf, real& ina) +{ + char buf[256]; + + bool onemade = FALSE; + + long firm = TApplication::get_firm(); + _prind = new TProgind(_n_ditte, + " Calcolo acconto " + "\n Preparazione archivi " + "\n ", + TRUE,TRUE,40); + + for (int l = 0; l < _ditte->items(); l++) + { + if (_prind->iscancelled()) + break; + if ((_calcall || _selected[l]) && !_ditte->disabled(l)) + { + if (onemade == FALSE && _isprint) + { + _DescrItem* d = new _DescrItem(ACCHEAD); + d->_f0 = _basecalc == incorso; + d->_f1 = _isbase; + _descr_arr.add(d); + } + + _nditte->curr().zero(); + _nditte->curr().put("CODDITTA",_ditte->row(l).get(1)); + _nditte->read(); + + TApplication::set_firm(_nditte->curr().get_long("CODDITTA")); + sprintf (buf,"Calcolo acconto:\nditta %s", + (const char*)_nditte_r->get("RAGSOC")); + _prind->set_text(buf); + recalc_acconto(inf, ina); + onemade = TRUE; + } + _prind->addstatus(1); + } + + TApplication::set_firm(firm); + delete _prind; + return TRUE; +} + +bool TLiquidazione_app::recalc_acconto(real& inf, real& ina) +{ + real bc, acc, cre, deb; + bool isdifferita = FALSE; + bool error = FALSE; + + // TBI rewrite from scratch + // this is absolutely fundamental + if (_basecalc == precedente) + { + // determina casistica + enum { mm, tt, mt, tm, boh } history = boh; + char thh = *_freqviva; + + TString16 thyear = _year; + _year = format("%d", atoi(_year)-1); + + if (!look_lia()) + error = 3; + else + { + char ohh = _lia->get_char("S7"); + + if (ohh == 'M') history = thh == 'M' ? mm : mt; + if (ohh == 'T') history = thh == 'M' ? tm : tt; + if (history == boh) return FALSE; + + // casino benzinari + TString attprev = _nditte->curr().get("CODATTPREV"); + long codd = _nditte->curr().get_long("CODDITTA"); + TLocalisamfile& atts = _nditte->lfile(LF_ATTIV); + atts.zero(); + atts.put("CODDITTA", codd); + atts.put("CODATT", attprev); + if (atts.read() != NOERR) atts.zero(); + if (atts.get_bool("ART74/4")) // e' proprio un gran benzinaro + { + TConfig cnf(CONFIG_DITTA, "cg"); + history = cnf.get_bool("GesT74") ? mm : tt; + } + + switch (history) + { + case mm: + // base calcolo: 12a anno preced, Rideterminare a seconda dell'acconto + // versato; ris = 88% del debito (0 se credito) + if (!look_lim(12)) error = 2; + else + { + bc += _lim->get_real("R0"); + real av = _lim->get_real("R11"); + bc += av; + } + break; + case tt: + case tm: + // base calcolo: 13a anno precedente. Rideterm. per eventuale acconto + if (!look_lim(12)) error = 2; // TBC sara' 13a davvero? Secondo me e' 12 + else + { + bc += _lim->get_real("R0"); + real av = _lim->get_real("R11"); + bc += av; + } + if (_basecalc == tm) + // tm come tt ma si divide per 3 la base di calcolo prima di calcolare l'88% + bc /= real(3.0); + break; + case mt: + // basecalcolo: 10, 11, 12 anno prec., 10 e 11 se a debito, 12 vedi acconto; + // sommare e prendi 88% se a debito + if (!look_lim(10)) error = 2; + else + { + real app = _lim->get_real("R0"); + if (app.sign() > 0) //a debito + bc += app; + } + if (!look_lim(11)) error = 2; + else + { + real app = _lim->get_real("R0"); + if (app.sign() > 0) //a debito + bc += app; + } + if (!look_lim(12)) error = 2; + else + { + bc += _lim->get_real("R0"); + real av = _lim->get_real("R11"); + bc += av; + } + break; + } + + if (bc.sign() > 0) //debito + { + acc = bc * ACCONTO_DICEMBRE; + acc.round(ROUND_LIRA); + } + } + _year = thyear; + } +else if (_basecalc == incorso) +{ + // that's pazzesc but as it turns out there's no better way + _comp_acconto = TRUE; + // force recalc of current month + _recalc = one; + // insozza il water + update_firm(12); + + // calcola l'acconto + if (look_lim(12)) + { + // TBC trimestrali, differite + bc = result_liq(12); + // somma i non fatturati/non annotati + //bc += inf + ina; + cre = _lim->get_real("R12"); + deb = _lim->get_real("R13"); + if (bc.sign() > 0) acc = bc; + } + else error = 1; + + // pulisci il water + _comp_acconto = FALSE; + update_firm(12); +} + +// sbatti l'acconto in LIA +if (look_lia()) +{ + isdifferita = _lia->get_bool("B1"); + if (isdifferita && _basecalc == incorso) acc *= real(double(2/3)); + _lia->put("R4",acc); + _lia->rewrite(); +} + +bool wasdel = look_del(12,7); + +if (acc.sign() > 0 && acc >= ACCONTO_MINIMO_DA_VERSARE) +{ + // crea o aggiorna delega + // TBC everything + look_del(12,7,TRUE); + _del->put("R0", acc); + _del->rewrite(); +} +else if (wasdel) + _del->remove(); + + // per questa volta lasciamo perdere la describe_acconto + if (_isprint) +{ + // segnalazioni di errore da gesticolare: + // error = 0: no error + // error = 1: manca tabella risultati liquidazione per l'anno indicato + // error = 2: manca tabella risultati liquidazione per l'anno precedente + // error = 3: manca tabella dichiarazione annuale per l'anno precedente + _DescrItem* d = new _DescrItem(ACCONTO); + d->_r0 = bc; + d->_r1 = acc; + d->_r2 = cre; + d->_r3 = deb; + d->_f0 = _basecalc == incorso; + d->_f1 = _isbase; + d->_f2 = error; + d->_f3 = isdifferita; + d->_s0 = _nditte->curr().get("CODDITTA"); + d->_s1 = _nditte->curr().get("RAGSOC"); + _descr_arr.add(d); +} +return TRUE; +}