591 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			591 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| //Creazione versamenti per acconti
 | |
| #include <applicat.h>
 | |
| #include <mask.h>
 | |
| #include <tabutil.h> 
 | |
| #include <relation.h>
 | |
| #include <sheet.h>
 | |
| #include <urldefid.h>
 | |
| #include <prefix.h>
 | |
| #include <printer.h>
 | |
| #include <progind.h>
 | |
| #include <utility.h>
 | |
| #include <config.h>
 | |
| #ifndef __CGLIB03_H
 | |
| #include "cglib03.h"
 | |
| #endif
 | |
| #include "cg4800a.h"
 | |
| #include "cg4800b.h"
 | |
| 
 | |
| #define ROUND_MILLELIRE (-3)
 | |
| 
 | |
| class VersAcc_app : public TApplication
 | |
| {
 | |
|   TRelation*    _nditte;
 | |
|   TArray_sheet* _ditte;
 | |
|   TArray        _nomiditte, _desc;
 | |
|   TBit_array    _selected;
 | |
|   
 | |
|   TInteressi_IVA_table* _ver;
 | |
|   TTable*    _lim;  
 | |
|   TTable*    _lia;  
 | |
|   TTable*    _del;
 | |
|   TTable*    _ban; 
 | |
|   TTable*    _ucc; 
 | |
|   TProgind*  _prind;
 | |
|   
 | |
|   int   _year; 
 | |
|   real  _acconto, _credito, _diff, _impver, _acconto_senza_credito;
 | |
|   bool  _calcall, _da_stampare, _print;
 | |
|   TDate _dataver;
 | |
|   TString16 _abi, _cab, _con;
 | |
|   TString16 _abips, _cabps; //dai parametri di studio
 | |
|   
 | |
| protected:               
 | |
|   virtual bool create(); 
 | |
|   virtual bool destroy();
 | |
|   virtual bool menu(MENU_TAG);
 | |
|   virtual void print();
 | |
|   
 | |
|   // handlers             
 | |
|   static bool ch_year_handler(TMask_field& f, KEY key);
 | |
| 
 | |
| public:                                                  
 | |
| 
 | |
|   static VersAcc_app& app() { return (VersAcc_app&)main_app(); }
 | |
|   void build_ditte_sheet();
 | |
|   void build_nomiditte();
 | |
| 
 | |
|   void lettura_delega();
 | |
|   void lettura_anagrafica(bool*);
 | |
|   void crea_riga_stampa(bool);
 | |
|   void aggiorna_delega();
 | |
|   void crea_delega();
 | |
|   void vers_acc();
 | |
|   
 | |
|   bool look_lia();
 | |
|   bool video_conferma(); 
 | |
|   bool check_acc(); 
 | |
|   
 | |
|   VersAcc_app() : _ditte(NULL), _selected(10000), _nomiditte(100), _desc(100) {}
 | |
| };
 | |
| 
 | |
| bool VersAcc_app::look_lia()
 | |
| {
 | |
|   TTable lia ("%LIA");
 | |
|   
 | |
|   TString16 y; y.format("%05ld%04d", _nditte->lfile().get_long("CODDITTA"), _year);
 | |
|   
 | |
|   lia.zero();
 | |
|   lia.put("CODTAB", y);
 | |
|   lia.read();
 | |
|   const bool ok = lia.good(); 
 | |
|   if (ok)
 | |
|   { 
 | |
|     _acconto = lia.get_real("R4");
 | |
|     _credito = lia.get_real("R6");
 | |
|   }
 | |
|   else
 | |
|   {
 | |
|     _acconto = ZERO;
 | |
|     _credito = ZERO;
 | |
|   }  
 | |
|   return ok;
 | |
| }
 | |
| 
 | |
| bool VersAcc_app::create()
 | |
| { 
 | |
|   TApplication::create(); 
 | |
| 
 | |
|   _nditte = new TRelation(LF_NDITTE);
 | |
|   _nditte->add(LF_ANAG, "TIPOA=TIPOA|CODANAGR=CODANAGR");
 | |
|   _nditte->add(LF_COMUNI, "COM=COMRF(COMRES)", 1, LF_ANAG);
 | |
|   
 | |
|   _ditte  = new TArray_sheet(-1, -1, -4, -4, "Selezione Ditte",
 | |
|                              "@1|Cod.@5R|Ragione Sociale@50|Vers.");  
 | |
|   _ditte->disable(DLG_USER); // disabilita il pulsante <<Tutti>>
 | |
|   _ver = new TInteressi_IVA_table();
 | |
|   _del = new TTable("%DEL");
 | |
|   _lia = new TTable("%LIA");
 | |
|   _ban = new TTable("%BAN");
 | |
|   _ucc = new TTable("%UCC"); 
 | |
|   _lim = new TTable("LIM");
 | |
|   
 | |
|   TConfig c (CONFIG_STUDIO, "cg");
 | |
|   _abips = c.get("CodABI");
 | |
|   _cabps = c.get("CodCAB");
 | |
|   
 | |
|   TDate oggi(TODAY);
 | |
|   _year = oggi.year();
 | |
|   
 | |
|   begin_wait();
 | |
|   build_nomiditte();
 | |
|   build_ditte_sheet();
 | |
|   end_wait();
 | |
|   
 | |
|   dispatch_e_menu(BAR_ITEM(1));
 | |
|   
 | |
|   return TRUE; 
 | |
| }
 | |
| 
 | |
| bool VersAcc_app::destroy()
 | |
| {                                  
 | |
|   delete _ver;
 | |
|   delete _lim;   
 | |
|   delete _lia;
 | |
|   delete _del;
 | |
|   delete _ban;
 | |
|   delete _ucc;
 | |
|   delete _ditte;
 | |
|   delete _nditte;
 | |
|   
 | |
|   return TApplication::destroy();
 | |
| }
 | |
| 
 | |
| bool VersAcc_app::ch_year_handler(TMask_field& f, KEY key)
 | |
| {                                                    
 | |
|   if (key == K_TAB && f.focusdirty())
 | |
|   {                         
 | |
|     app().begin_wait();
 | |
|     app()._year = atoi(f.get());
 | |
|     app().build_nomiditte();
 | |
|     app().build_ditte_sheet();  
 | |
|     app().end_wait();
 | |
|   }
 | |
|   return TRUE;
 | |
| } 
 | |
| 
 | |
| 
 | |
| void VersAcc_app::build_ditte_sheet()
 | |
| {
 | |
|   // build sheet
 | |
|   _ditte->destroy();
 | |
|   for (int i = 0; i < _nomiditte.items(); i++)
 | |
|   {
 | |
|     TToken_string* d = new TToken_string(64);
 | |
|     *d = (TToken_string&)_nomiditte[i];
 | |
|     const char vers = d->get_char(2);
 | |
|     d->insert(" |", 0);
 | |
|     bool selectable = vers == '?';
 | |
|     const long pos = _ditte->add(d);     
 | |
|     if (selectable)  _ditte->disable_row(pos);
 | |
|   }     
 | |
| }
 | |
| 
 | |
| void VersAcc_app::build_nomiditte()
 | |
| {                 
 | |
|   _nomiditte.destroy();
 | |
|   // ricostruire _nomiditte e rifare build_ditte_sheet
 | |
|   TLocalisamfile& dt = _nditte->lfile();
 | |
|   TString fr(2);
 | |
|   TTable lia("%LIA");
 | |
| 
 | |
|   for (dt.first(); !dt.eof(); dt.next())
 | |
|   {     
 | |
|     // check no archivi
 | |
|     fr = "??";
 | |
|     bool good = prefix().exist(dt.get_long("CODDITTA"));                        
 | |
|     
 | |
|     if (good) 
 | |
|     {   
 | |
|       // check no parametri liquidazione                                               
 | |
|       lia.put("CODTAB", format("%05ld%d",dt.get_long("CODDITTA"),_year));
 | |
|       if (lia.read() != NOERR) good = FALSE; 
 | |
|       else fr = lia.get("S7");
 | |
|     }
 | |
|     else continue;
 | |
| 
 | |
|     TToken_string* d = new TToken_string(64);
 | |
|     
 | |
|     // add record 
 | |
|     d->add(dt.get_long("CODDITTA"));
 | |
|     d->add(dt.get("RAGSOC"));
 | |
|     d->add(fr);
 | |
|     
 | |
|     _nomiditte.add(d);  
 | |
|   }
 | |
| }
 | |
| 
 | |
| bool VersAcc_app::menu(MENU_TAG)
 | |
| {
 | |
|   if (check_acc()) 
 | |
|   { 
 | |
|     if (_calcall || _selected.ones() > 0l)
 | |
|     {
 | |
|       vers_acc();
 | |
|       if (_print)
 | |
|       {
 | |
|        enable_menu_item(M_FILE_PRINT);
 | |
|        print();
 | |
|       }   
 | |
|     }
 | |
|     else warning_box("Nessuna ditta selezionata!");
 | |
|   }
 | |
|   return FALSE;
 | |
| }                
 | |
| 
 | |
| bool VersAcc_app::check_acc()
 | |
| {               
 | |
|   KEY k;
 | |
|   
 | |
|   TMask m("cg4800a");
 | |
|   
 | |
|   m.set_handler(FLD_CGB_YEAR, ch_year_handler);   
 | |
|   
 | |
|   long j;
 | |
|   _calcall = FALSE;
 | |
| 
 | |
|   for (;;)
 | |
|   {
 | |
|     if (k == K_ESC || k == K_ENTER)
 | |
|       break;
 | |
| 
 | |
|     k = m.run();
 | |
|     
 | |
|     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->row_disabled(j)) 
 | |
|             _selected.set(j);
 | |
|        _calcall = TRUE;
 | |
|        k = K_ENTER;
 | |
|        break;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   if (k == K_ENTER) _year = m.get_int(FLD_CGB_YEAR);
 | |
| 
 | |
|   return k == K_ENTER;
 | |
| }
 | |
| 
 | |
| void VersAcc_app::vers_acc()
 | |
| {
 | |
|   char buf[256]; bool tipo;
 | |
|   
 | |
|   _desc.destroy();
 | |
|   _da_stampare = _print = FALSE;
 | |
| 
 | |
|   _prind = new TProgind(_calcall ? 0l : _selected.ones(),
 | |
|                         "         Creazione versam. acconti \n"
 | |
|                         "        preparazione archivi       \n"
 | |
|                         "                                   \n",
 | |
|                         TRUE,TRUE,30);
 | |
|   
 | |
|   if (_ver->read(_year,12)!=NOERR)
 | |
|     warning_box("Errore %d in lettura tabella versamenti ed interessi.",_ver->status());
 | |
|   _acconto_senza_credito = _ver->get(I_ACCONTOIVA);
 | |
|   for (int l = 0; l < _ditte->items(); l++)
 | |
|   {
 | |
|     if (_prind->iscancelled())
 | |
|       break;
 | |
| 
 | |
|     if (!(_calcall || _selected[l]) || _ditte->row_disabled(l)) 
 | |
|       continue;
 | |
|     
 | |
|     _abi = _abips;
 | |
|     _cab = _cabps;
 | |
|     _da_stampare = FALSE;  //relativo a ciascuna ditta
 | |
|     
 | |
|     TApplication::set_firm(_ditte->row(l).get_long(1));
 | |
| 
 | |
|     _nditte->curr().zero();
 | |
|     _nditte->curr().put("CODDITTA",_ditte->row(l).get(1));
 | |
|     _nditte->read();                                                          
 | |
|    
 | |
|     if (!look_lia()) continue;    
 | |
|     
 | |
|     sprintf (buf,"Creazione vers. acconti:\nditta %s\n ",
 | |
|              (const char*)_nditte->lfile().get("RAGSOC"));
 | |
|     _prind->set_text(buf);
 | |
|     
 | |
|     lettura_anagrafica(&tipo);
 | |
|     
 | |
|     lettura_delega();
 | |
|     
 | |
|     if (_da_stampare)
 | |
|     { 
 | |
|       crea_riga_stampa(tipo);
 | |
|       _print = TRUE;   //relativo alla stampa finale 
 | |
|     }
 | |
|      
 | |
|     _prind->addstatus(1);
 | |
|   }
 | |
|   delete _prind;
 | |
| }  
 | |
| 
 | |
| void VersAcc_app::print()
 | |
| {
 | |
|   printer().open();
 | |
|   
 | |
|   TPrintrow row;
 | |
|   
 | |
|   row.put("Gestione iva", 0);
 | |
|   row.put("Data @>", 106);
 | |
|   row.put("Pag.@#", 124);
 | |
|   printer().setheaderline(0,row);
 | |
|   
 | |
|   row.reset(); 
 | |
|   TString256 t("@bCREAZIONE VERSAMENTI PER ACCONTI DICEMBRE");
 | |
|   t <<' '<<_year;
 | |
|   row.put(t,34); 
 | |
|   printer().setheaderline(1,row);
 | |
|   
 | |
|   t = "";
 | |
|   t.fill('-',132);
 | |
|   row.reset();
 | |
|   row.put(t,0);
 | |
|   printer().setheaderline(2,row);
 | |
|   printer().setheaderline(4,row);  
 | |
|   
 | |
|   row.reset();
 | |
|   row.put("Ditta",0);
 | |
|   row.put("Denominazione",7);
 | |
|   row.put("Importo",46);
 | |
|   row.put("Banca",55);
 | |
|   row.put("Dipendenza",62);
 | |
|   row.put("Concessione",74);
 | |
|   printer().setheaderline(3,row);
 | |
|   
 | |
|   for (int i = 0; i < _desc.items(); i++)
 | |
|   {
 | |
|     TToken_string& tt = (TToken_string&)_desc[i]; 
 | |
|     
 | |
|     TParagraph_string rs (tt.get(1),30);
 | |
|     
 | |
|     row.reset();
 | |
|     row.put(tt.get(0),0);  
 | |
|     const real imp(real::ita2eng(tt.get(2)));
 | |
|     row.put(imp.string("###.###.###.###"),38);
 | |
|     if (tt.get_int(7) == 0)
 | |
|     {        
 | |
|       row.put(tt.get(3),55);
 | |
|       row.put(tt.get(4),63);
 | |
|     }
 | |
|     else row.put(tt.get(5),77);
 | |
|     
 | |
|     const TString80 descr(tt.get(6));
 | |
|     row.put(descr.left(45),86);    
 | |
|     const char* r;
 | |
|     while ((r = rs.get()) != NULL)
 | |
|     {
 | |
|       row.put(r,7);
 | |
|       printer().print(row);
 | |
|       row.reset(); 
 | |
|     }
 | |
|   }                 
 | |
|   printer().close();
 | |
| }
 | |
| 
 | |
| void VersAcc_app::lettura_delega()
 | |
| {
 | |
|   TString16 cod;
 | |
|   TString16 y (format("%05ld", _nditte->lfile().get_long("CODDITTA")));
 | |
|   
 | |
|   _diff = _acconto - _credito;  
 | |
|   _diff.round(ROUND_MILLELIRE);
 | |
|   
 | |
|   cod << y << _year << 12 << 7;
 | |
|   
 | |
|   _del->zero();
 | |
|   _del->put("CODTAB", cod);
 | |
|   
 | |
|   if (_del->read() == NOERR)
 | |
|   {
 | |
|     if (_diff < _acconto_senza_credito)  //l'importo non e' dovuto
 | |
|     {
 | |
|       //cancello la delega
 | |
|       _del->remove();
 | |
|       return;
 | |
|     }
 | |
|     
 | |
|     // se sono qui e' perche' l'importo e' dovuto (_diff >= _acconto_senza_credito)
 | |
|     bool stampata = _del->get_bool("B0");
 | |
|     
 | |
|     _impver = _del->get_real("R0");
 | |
|     _dataver = _del->get_date("D0");
 | |
|     
 | |
|     if (stampata)
 | |
|     {       
 | |
|       _abi = _del->get("S7");
 | |
|       _cab = _del->get("S8");
 | |
|       _con = _del->get("S9"); 
 | |
|       if (_diff != _impver)
 | |
|         video_conferma(); 
 | |
|       return;  
 | |
|     }
 | |
|     else 
 | |
|     {
 | |
|       aggiorna_delega();
 | |
|       _da_stampare = TRUE;  
 | |
|     }
 | |
|   }
 | |
|   else //non esiste la delega
 | |
|   {
 | |
|     if (_diff >= _acconto_senza_credito)
 | |
|     //creo record delega
 | |
|     {
 | |
|       crea_delega(); 
 | |
|       _da_stampare = TRUE;
 | |
|     }
 | |
|   }
 | |
|   return;  
 | |
| }
 | |
| 
 | |
| void VersAcc_app::crea_delega()
 | |
| {
 | |
|   TString16 y (format("%05ld", _nditte->lfile().get_long("CODDITTA")));
 | |
|   TString16 cod;
 | |
|   
 | |
|   cod << y << _year << 12 << 7;
 | |
|   
 | |
|   _del->zero();
 | |
|   _del->put("CODTAB", cod);
 | |
|   _del->put("S7", _abi);
 | |
|   _del->put("S8", _cab);
 | |
|   _del->put("S9", _con);
 | |
|   _del->put("R0", _diff);
 | |
|   
 | |
|   _del->write();  
 | |
| }
 | |
| 
 | |
| void VersAcc_app::aggiorna_delega()
 | |
| { 
 | |
|   _del->put("S7", _abi);
 | |
|   _del->put("S8", _cab);
 | |
|   _del->put("S9", _con);
 | |
|   _del->put("R0", _diff);
 | |
|   
 | |
|   _del->rewrite();
 | |
| }                 
 | |
| 
 | |
| void VersAcc_app::lettura_anagrafica(bool* tipo)
 | |
| {
 | |
|   TLocalisamfile& anag = _nditte->lfile(LF_ANAG);
 | |
|   TLocalisamfile& com  = _nditte->lfile(LF_COMUNI); // Comune residenza fiscale
 | |
|     
 | |
|   const bool cf = anag.get_bool("TITCF");    
 | |
|   const int isdel = anag.get_int("TIPOSTDEL");
 | |
|   
 | |
|   if (cf && (isdel == 1 || isdel == 2))
 | |
|   {
 | |
|     *tipo = TRUE;
 | |
|     const int con = com.get_int("UFFCONC"); 
 | |
|     _abi = "";
 | |
|     _cab = "";
 | |
|     _con = format("%03d",con);
 | |
|   }  
 | |
|   else
 | |
|   {
 | |
|     *tipo = FALSE;
 | |
|     _con = "";
 | |
|     //const long codabi = anag.get_long("CODABI");
 | |
|     //const long codcab = anag.get_long("CODCAB");
 | |
|     const long codabi = _nditte->lfile().get_long("ABIBAN");
 | |
|     const long codcab = _nditte->lfile().get_long("CABBAN");
 | |
|     //if (codabi != 0 || codcab != 0)
 | |
|     if (codabi != 0 && codcab != 0)
 | |
|     {
 | |
|       _abi = format("%05ld", codabi);
 | |
|       _cab = format("%05ld", codcab);
 | |
|     }
 | |
|   }
 | |
| }  
 | |
|    
 | |
| bool VersAcc_app::video_conferma()
 | |
| {                                               
 | |
|   TMask m("cg4800b");  
 | |
| 
 | |
|   m.field(F_CODDITTA).set(_nditte->lfile().get("CODDITTA"));
 | |
|   m.field(F_RAGSOC).set(_nditte->lfile().get("RAGSOC"));
 | |
|   m.field(F_DATAVER).set(_dataver);
 | |
|   m.field(F_ABI).set(_abi);
 | |
|   m.field(F_CAB).set(_cab);
 | |
|   m.field(F_CON).set(_con);       
 | |
|   m.field(F_IMPVER).set(_impver.string());
 | |
|   m.field(F_NEWIMP).set(_diff.string());    
 | |
| 
 | |
|   for (bool stop = FALSE; !stop;)
 | |
|   {
 | |
|     KEY k = m.run();        
 | |
|     
 | |
|     switch(k)
 | |
|     {
 | |
|      case K_SAVE: 
 | |
|        {
 | |
|          KEY k = yesnocancel_box("Delega gia' stampata. Si desidera ugualmente confermare l'aggiornamento?");
 | |
|          if (k ==  K_YES)
 | |
|          {
 | |
|            _da_stampare = TRUE;
 | |
|            _del->put("R0",_diff);
 | |
|            _del->put("B0", "");
 | |
|            _del->rewrite();
 | |
|          }
 | |
|          if (k == K_YES || k == K_NO) 
 | |
|            stop = TRUE;
 | |
|        }    
 | |
|        break;  
 | |
|      case K_ESC:
 | |
|      //case K_QUIT:     
 | |
|        stop = TRUE;
 | |
|        break;
 | |
|     }
 | |
|   }
 | |
|   return TRUE;
 | |
| }    
 | |
| 
 | |
| void VersAcc_app::crea_riga_stampa(bool tipost)
 | |
| {
 | |
|   TToken_string* tt = new TToken_string(150);    
 | |
|   TString80 desc; 
 | |
|   
 | |
|   if (tipost) //prendo la descrizione dell'ufficio concessione
 | |
|   {
 | |
|     if (_con.not_empty())
 | |
|     {
 | |
|      TTable ucc("%UCC");
 | |
|      ucc.zero();
 | |
|      ucc.put("CODTAB", _con);
 | |
|      if (ucc.read() == NOERR)
 | |
|        desc = ucc.get("S0");
 | |
|     }   
 | |
|   }
 | |
|   else       //prendo la descrizione della banca
 | |
|   {
 | |
|     if (_abi.not_empty())
 | |
|     {
 | |
|      TTable ban("%BAN");
 | |
|      TString16 cod;
 | |
|      cod = _abi; if (!_cab.empty()) cod << _cab; 
 | |
|      ban.zero();
 | |
|      ban.put("CODTAB", cod);
 | |
|      if (ban.read() == NOERR)
 | |
|        desc = ban.get("S0");
 | |
|     }
 | |
|   }                        
 | |
|   
 | |
|   tt->add(_nditte->lfile().get("CODDITTA"));
 | |
|   tt->add(_nditte->lfile().get("RAGSOC"));
 | |
|   tt->add(_diff.string());
 | |
|   tt->add(_abi);
 | |
|   tt->add(_cab);
 | |
|   tt->add(_con);
 | |
|   tt->add(desc);
 | |
|   tt->add(tipost);
 | |
|   
 | |
|   if (tt != NULL) _desc.add(tt);  
 | |
| }
 | |
| 
 | |
| int cg4800(int argc, char* argv[])
 | |
| {
 | |
|   VersAcc_app app;
 | |
|   app.run(argc, argv, "Creazione versam. acconti dicembre");
 | |
|   return 0;
 | |
| }
 |