362 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			362 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| #include <applicat.h>
 | |
| #include <config.h>
 | |
| #include <mask.h>
 | |
| #include <progind.h>
 | |
| #include <relation.h>
 | |
| #include <urldefid.h>
 | |
| #include <utility.h>
 | |
| 
 | |
| #include "../cg/cglib02.h"    
 | |
| #include "../cg/cgsaldac.h"
 | |
| 
 | |
| #include "sc1200.h"
 | |
| 
 | |
| #include <saldi.h>
 | |
| #include <pconti.h>
 | |
| 
 | |
| 
 | |
| class TCreatepart_app : public TApplication
 | |
| { 
 | |
|   TEsercizi_contabili _esc;
 | |
|   bool _num_cli, _num_for;
 | |
|   TString _desccl, _descfo;
 | |
|   TDate _today;
 | |
|   
 | |
|   TLocalisamfile* _conti;
 | |
|   
 | |
| protected:  // Applicat
 | |
|   virtual void on_firm_change();
 | |
|   virtual void on_config_change();
 | |
|   
 | |
|   virtual bool create();
 | |
|   virtual bool destroy();
 | |
|   virtual bool menu(MENU_TAG m);  
 | |
| 
 | |
| protected:
 | |
|   static bool data_handler(TMask_field& f, KEY key);
 | |
|   
 | |
|   void zap_file(int logicnum) const;
 | |
|   bool zap_partite() const;
 | |
|   int crea_partite(int anno_es, int anno_rif, int next_anno_es);
 | |
|   
 | |
| public: 
 | |
|   char is_clifo(int g, int c, long s, int& indbil);
 | |
|   TCreatepart_app() : _today(TODAY) {}
 | |
|   virtual ~TCreatepart_app() {}  
 | |
| };
 | |
| 
 | |
| inline TCreatepart_app& app() { return (TCreatepart_app&)main_app(); }
 | |
| 
 | |
| bool TCreatepart_app::create()
 | |
| {
 | |
|   TApplication::create();
 | |
|   
 | |
|   _conti = new TLocalisamfile(LF_PCON);
 | |
|   
 | |
|   dispatch_e_menu(BAR_ITEM(1));
 | |
|   return TRUE;
 | |
| }
 | |
| 
 | |
| bool TCreatepart_app::destroy()
 | |
| {                                      
 | |
|   delete _conti;
 | |
| 
 | |
|   return TApplication::destroy();        
 | |
| }
 | |
| 
 | |
| void TCreatepart_app::on_firm_change()
 | |
| {
 | |
|   _esc.update();
 | |
| }
 | |
| 
 | |
| void TCreatepart_app::on_config_change()
 | |
| {
 | |
|   TConfig cd(CONFIG_DITTA, "cg");
 | |
|   _num_cli = cd.get_bool("NrCliDx");
 | |
|   _num_for = cd.get_bool("NrForDx");
 | |
|   TPartita::carica_allineamento();
 | |
| }
 | |
| 
 | |
| bool TCreatepart_app::data_handler(TMask_field& f, KEY key)
 | |
| {           
 | |
|   TMask& m = f.mask();                          
 | |
|  
 | |
|   bool ok = TRUE;
 | |
|   if ((key == K_TAB && (f.focusdirty() || !m.is_running())) || 
 | |
|        key == K_ENTER)
 | |
|   { 
 | |
|     const int anno = m.get_int(F_ANNO);
 | |
|     const TDate oggi(f.get());
 | |
|     if (app()._esc.date2esc(oggi) != anno)
 | |
|       ok = f.error_box("La data non appartiene all'esercizio %d", anno);
 | |
|       
 | |
|     if (ok && key == K_TAB)  
 | |
|     {
 | |
|       TString desc(50);
 | |
|       TEdit_field& dc = m.efield(F_DESCCL);
 | |
|       if (dc.empty() || !dc.dirty())
 | |
|       {
 | |
|         desc = "Apertura clienti al "; desc << oggi;
 | |
|         dc.set(desc);
 | |
|         dc.set_dirty(FALSE);
 | |
|       }
 | |
|       
 | |
|       TEdit_field& df = m.efield(F_DESCFO);
 | |
|       if (df.empty() || !df.dirty())
 | |
|       {
 | |
|         desc = "Apertura fornitori al "; desc << oggi;
 | |
|         df.set(desc);
 | |
|         df.set_dirty(FALSE);
 | |
|       }
 | |
|     }
 | |
|   }
 | |
|   return ok;
 | |
| }
 | |
| 
 | |
| void TCreatepart_app::zap_file(int logicnum) const
 | |
| {
 | |
|   TDir dir;
 | |
|   dir.get(logicnum, _lock, _nordir, _sysdirop);
 | |
|   dir.eod() = 0;
 | |
|   dir.put(logicnum, _nordir, _sysdirop);
 | |
|   
 | |
|   TSystemisamfile f(logicnum);
 | |
|   f.pack();
 | |
| }
 | |
| 
 | |
| bool TCreatepart_app::zap_partite() const
 | |
| {                  
 | |
|   bool ok = TRUE;                 
 | |
| 
 | |
|   TSystemisamfile partite(LF_PARTITE);
 | |
|   partite.open();
 | |
|   bool zap = partite.items() != 0;
 | |
|   partite.close();
 | |
|   
 | |
|   if (zap)
 | |
|   {
 | |
|     zap = yesno_box("Il saldaconto non e' vuoto.\n"
 | |
|                     "La procedura lo azzera completamente.\n"
 | |
|                     "Si desidera proseguire?");     
 | |
|     if (zap)
 | |
|       zap = yesno_box("Confermare l'azzeramento del saldaconto esistente");  
 | |
|     
 | |
|     if (zap)
 | |
|     {
 | |
|       zap_file(LF_PARTITE);
 | |
|       zap_file(LF_SCADENZE);
 | |
|       zap_file(LF_PAGSCA);
 | |
|     }
 | |
|     else
 | |
|       ok = FALSE;
 | |
|   }
 | |
|   
 | |
|   return ok;
 | |
| }
 | |
| 
 | |
| 
 | |
| char TCreatepart_app::is_clifo(int g, int c, long s, int& indbil)
 | |
| {
 | |
|   _conti->zero();
 | |
|   _conti->put(PCN_GRUPPO, g);
 | |
|   _conti->put(PCN_CONTO, c);
 | |
|   
 | |
|   if (_conti->read() != NOERR)      
 | |
|   {
 | |
|     warning_box("Archivio saldi disallineato con il piano dei conti\n record saldi non elaborato : gruppo %d conto %d sottoconto %ld", g, c, s);
 | |
|     return '\0'; 
 | |
|   }
 | |
|   
 | |
|   const char cf = _conti->get_char(PCN_TMCF);    
 | |
|   indbil = _conti->get_int(PCN_INDBIL);
 | |
| 
 | |
|   return cf;
 | |
| }
 | |
| 
 | |
| int TCreatepart_app::crea_partite(int anno_es, int anno_rif, int next_anno_es)
 | |
| {
 | |
|   TWait_cursor hourglass;
 | |
| 
 | |
|   const bool check = anno_es != next_anno_es;
 | |
|   TRelation saldi(LF_SALDI);                                                 
 | |
|   
 | |
|   saldi.curr().put(SLD_ANNOES, anno_es);
 | |
| 
 | |
|   TCursor cur(&saldi, "", 1, &saldi.curr(), &saldi.curr());      
 | |
|   const long items = cur.items();
 | |
|   
 | |
|   if (items == 0)
 | |
|     return 0;
 | |
| 
 | |
|   // Apre i files per usarli con l'oggetto TPartita
 | |
|   TLocalisamfile partite(LF_PARTITE);
 | |
|   TLocalisamfile scadenze(LF_SCADENZE);
 | |
|   TLocalisamfile pagamenti(LF_PAGSCA);
 | |
| 
 | |
|   int n_part = 0;
 | |
|   TProgind prind(items, "Creazione saldaconto", FALSE, TRUE, 45);
 | |
|    
 | |
|   for (cur = 0; cur.pos() < items; ++cur)
 | |
|   {               
 | |
|     const int gruppo  = cur.curr().get_int(SLD_GRUPPO);
 | |
|     const int conto   = cur.curr().get_int(SLD_CONTO);  
 | |
|     const long sottoc = cur.curr().get_long(SLD_SOTTOCONTO);    
 | |
|     int indbil;
 | |
|     const char cf = is_clifo(gruppo, conto, sottoc, indbil);
 | |
|     if (check)
 | |
|     {
 | |
|       TLocalisamfile work_saldi(LF_SALDI);
 | |
|       work_saldi.zero();
 | |
|       work_saldi.put(SLD_GRUPPO, gruppo);
 | |
|       work_saldi.put(SLD_CONTO, conto);  
 | |
|       work_saldi.put(SLD_SOTTOCONTO, sottoc);    
 | |
|       work_saldi.put(SLD_ANNOES, next_anno_es); 
 | |
|       work_saldi.put(SLD_FLSCA, "");
 | |
|       if (work_saldi.read() == NOERR)
 | |
|         continue;
 | |
|     }
 | |
|     if (cf > ' ')
 | |
|     {
 | |
|       TSaldo sld;
 | |
|       real s;     
 | |
| 
 | |
|       // ciuccia il saldo e vedi se e' movimentato nell'esercizio corrente 
 | |
|       if (!sld.ultima_immissione_verifica(anno_es, gruppo, conto, sottoc, indbil, 1))
 | |
|       {
 | |
|         // non movimentato: se e' conto patrimoniale....
 | |
|         if (!(indbil == 1 || indbil == 2 || indbil == 5))
 | |
|         { 
 | |
|           prind.addstatus(1);
 | |
|           continue;          
 | |
|         }
 | |
|         // .. vedi saldo esercizio precedente, altrimenti inkul
 | |
|         s = sld.saldofin_esprec(anno_es, gruppo, conto, sottoc);
 | |
|       }
 | |
|       else
 | |
|         s = sld.saldo();
 | |
|       
 | |
|       // genera importo con sezione appropriata       
 | |
|       TImporto saldo('D', s);
 | |
|       saldo.normalize(); // Non togliere, serve per stabilire fattura/nota credito
 | |
|   
 | |
|       if (!saldo.is_zero())
 | |
|       {                                            
 | |
|         const TBill clifo(gruppo, conto, sottoc, cf);
 | |
|         TString16 numero("*");             
 | |
|         if ((cf == 'C' && _num_cli) || (cf == 'F' && _num_for))
 | |
|           numero.right_just(7);
 | |
|         
 | |
|         TPartita game(clifo, anno_rif, numero);
 | |
| /*        
 | |
|         if (check)
 | |
|         {                                  
 | |
|           for (int p = game.last(); p > 0; p = game.pred(p))
 | |
|           {         
 | |
|             const TRiga_partite& riga = game.riga(p);
 | |
|             const int g = riga.get_int(PART_GRUPPOCL);
 | |
|             const int c = riga.get_int(PART_CONTOCL);
 | |
|             if (gruppo == g && conto == c)
 | |
|               break;     // Esiste gia' una riga con questo conto
 | |
|           }
 | |
|           if (p > 0)     // Il cliente esiste gia', per cui ignoro il saldo
 | |
|             continue;
 | |
|         } 
 | |
| */
 | |
|         
 | |
|         TRiga_partite& riga = game.new_row();
 | |
|         riga.put(PART_DATAREG,  _today);
 | |
|         riga.put(PART_DATADOC,  _today);
 | |
|         riga.put(PART_SEZ,      saldo.sezione());
 | |
|         riga.put(PART_IMPORTO,  saldo.valore());
 | |
|         riga.put(PART_IMPTOTDOC,saldo.valore());
 | |
|         riga.put(PART_DESCR, cf == 'C' ? _desccl : _descfo);
 | |
|             
 | |
|         // cazzata dare/avere/fare/baciare/cagare 
 | |
|         const tipo_movimento tipo = (cf == 'C') ^ (saldo.sezione() == 'A') ? 
 | |
|                                     tm_fattura : tm_nota_credito;
 | |
|         riga.put(PART_TIPOMOV, (int)tipo);
 | |
|             
 | |
|         if (tipo == tm_fattura)
 | |
|         {
 | |
|           TRiga_scadenze& scad = riga.new_row();
 | |
|           scad.put(SCAD_IMPORTO, saldo.valore());
 | |
|           scad.put(SCAD_DATASCAD, _today);
 | |
|           scad.put(SCAD_TIPOPAG, 1);        // rimessa diretta
 | |
|         } 
 | |
|         else
 | |
|         {
 | |
|           riga.put(PART_DATAPAG, _today);
 | |
|           const int r = riga.get_int(PART_NRIGA);
 | |
|           TRectype& unas = game.unassigned().row(r, TRUE);
 | |
|           unas.put(PAGSCA_IMPORTO, saldo.valore());
 | |
|           unas.put(PAGSCA_ACCSAL, 'A');
 | |
|         }
 | |
|         
 | |
|         if (game.write())
 | |
|           n_part++;
 | |
|         else
 | |
|         {
 | |
|           error_box("Impossibile scrivere la partita %d %s", 
 | |
|                     anno_rif, (const char *)numero);
 | |
|           break;
 | |
|         }  
 | |
|       }
 | |
|     }
 | |
|     prind.addstatus(1);  
 | |
|   }
 | |
| 
 | |
|   return n_part;
 | |
| }
 | |
| 
 | |
| bool TCreatepart_app::menu(MENU_TAG)
 | |
| { 
 | |
|   TMask m("sc1200a");
 | |
|   m.set_handler(F_DATA, data_handler);
 | |
| 
 | |
|   int anno_es = _esc.last();
 | |
|   m.set(F_ANNO, anno_es);
 | |
|   if (_esc.date2esc(_today) != anno_es)
 | |
|     _today = _esc[anno_es].inizio();
 | |
|   m.set(F_DATA, _today);
 | |
|   
 | |
|   while (m.run() == K_ENTER) 
 | |
|   {
 | |
|     anno_es = m.get_int(F_ANNO);
 | |
|     _today  = m.get(F_DATA);
 | |
|     _desccl = m.get(F_DESCCL);
 | |
|     _descfo = m.get(F_DESCFO);
 | |
|     
 | |
|     if (!zap_partite()) 
 | |
|       continue;         
 | |
|     
 | |
|     const TEsercizio& selected_es = _esc.esercizio(anno_es);
 | |
|     const int anno_rif = selected_es.inizio().year();
 | |
|     int n_part = crea_partite(anno_es, anno_rif, selected_es.codice());
 | |
|   
 | |
|     const int pred_es = _esc.pred(anno_es);
 | |
|     if (pred_es > 0)
 | |
|     {
 | |
|       const int p = crea_partite(pred_es, anno_rif, selected_es.codice());
 | |
|       if (p > 0) n_part += p;                       
 | |
|     }  
 | |
|     
 | |
|     if (n_part > 0)    
 | |
|     {
 | |
|       TString msg(80);
 | |
|       msg << "Sono state create " << n_part << " partite";
 | |
|       message_box(msg);
 | |
|       break;
 | |
|     }  
 | |
|   } // while run 
 | |
|   
 | |
|   return FALSE;
 | |
| }
 | |
| 
 | |
| 
 | |
| int sc1200(int argc, char** argv)
 | |
| {
 | |
|   TCreatepart_app a;
 | |
|   a.run(argc, argv, "Apertura scadenze da saldi");
 | |
|   return 0;
 | |
| }
 |