1402 lines
		
	
	
		
			40 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			1402 lines
		
	
	
		
			40 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| #include <config.h>
 | |
| #include <mailbox.h>
 | |
| #include <urldefid.h>
 | |
| #include <execp.h>
 | |
| 
 | |
| #include "pagament.h"                 
 | |
| 
 | |
| #include "cg2100.h"
 | |
| #include "cg2102.h"
 | |
| #include "cg21sld.h"
 | |
| 
 | |
| // Nomi dei campi
 | |
| #include <mov.h>
 | |
| #include <clifo.h>
 | |
| #include <rcausali.h>
 | |
| 
 | |
| TPrimanota_application::TPrimanota_application()
 | |
| : _rel(NULL), _mode(0), _iva(nessuna_iva), _causale(NULL), _giornale(NULL),
 | |
|   _lastreg(0), _last_dreg(TODAY), _last_dcom(TODAY)
 | |
| {
 | |
|   memset(_msk, 0, sizeof(_msk));
 | |
| }
 | |
| 
 | |
| TMask* TPrimanota_application::load_mask(int n)
 | |
| { 
 | |
|   if (_msk[n] != NULL) 
 | |
|     return _msk[n];
 | |
| 
 | |
|   TFilename name("cg2100"); name << char(n == 3 ? 'o' : 'a'+n);
 | |
|   TMask* m = new TMask(name);
 | |
|   
 | |
|   switch (n)
 | |
|   {
 | |
|   case 0:        
 | |
|     if (m)
 | |
|     {
 | |
|       m->set_handler(F_NUMREG,   num_handler);
 | |
|       m->set_handler(F_CODCAUS,  caus_query_handler);
 | |
|       m->set_handler(F_DATAREG,  datareg_handler);
 | |
|       m->set_handler(F_DATACOMP, datacomp_handler);
 | |
| 
 | |
|       TConfig c(CONFIG_STUDIO, "cg");  
 | |
| 
 | |
|       // Scelta primo campo col focus    
 | |
|       _firstfocus = c.get_bool("PoCuDr") ? F_DATAREG : F_CODCAUS;
 | |
|       m->first_focus(_firstfocus);
 | |
|       
 | |
|       // Registra e inserisci immediatamente un nuovo movimento
 | |
|       _savenew = !c.get_bool("Cg21SN");
 | |
|     }  
 | |
|     break;
 | |
|   case 2:
 | |
|     if (m)
 | |
|     {                                    
 | |
|       m->set_handler(F_DATADOC, datadoc_handler); 
 | |
|       m->set_handler(F_NUMDOC, numdoc_handler); 
 | |
|       m->set_handler(F_DATA74TER, data74ter_handler); 
 | |
|       m->set_handler(F_PROTIVA, protiva_handler);
 | |
|       m->set_handler(F_CLIENTE, clifo_handler);
 | |
|       m->set_handler(F_FORNITORE, clifo_handler);
 | |
|       m->set_handler(F_RITFIS, ritfis_handler);
 | |
|       m->set_handler(F_RITSOC, ritsoc_handler);
 | |
|       m->set_handler(F_CORRLIRE, corrlire_handler);
 | |
|       m->set_handler(F_CORRVALUTA, corrvaluta_handler);
 | |
|       m->set_handler(F_CODIVA, main_codiva_handler);
 | |
|       m->set_handler(F_OCCASEDIT, occas_handler);
 | |
|       m->set_handler(F_SOLAIVA, solaiva_handler);
 | |
|       m->set_handler(F_SHEETIVA, iva_handler);
 | |
|       m->set_handler(F_CODPAG, codpag_handler);
 | |
|       
 | |
|       TSheet_field& is = (TSheet_field&)m->field(F_SHEETIVA);
 | |
|       is.set_notify(iva_notify);
 | |
|       TMask& ism = is.sheet_mask();
 | |
|       ism.set_handler(101, imponibile_handler);
 | |
|       ism.set_handler(102, codiva_handler);
 | |
|       ism.set_handler(103, detrazione_handler);
 | |
|       ism.set_handler(104, imposta_handler);
 | |
|       ism.set_handler(107, cg_gruppo_handler);
 | |
|       ism.set_handler(109, iva_sottoconto_handler);
 | |
|       ism.set_handler(110, iva_sottoconto_handler);
 | |
|       ism.set_handler(209, sheet_clifo_handler);
 | |
|       ism.set_handler(309, sheet_clifo_handler); 
 | |
|       
 | |
|       // Se esiste lo sheet delle rate
 | |
|       if (is_fattura())
 | |
|       {
 | |
|         TSheet_field& ps = (TSheet_field&)m->field(FS_RATESHEET);
 | |
|         ps.set_notify(pag_notify);                        
 | |
|         m->set_handler(FS_RATESHEET, pag_sheet_handler);
 | |
|         m->set_handler(F_ANNORIF,    annorif_handler);
 | |
|         m->set_handler(F_NUMRIF,     numrif_handler);
 | |
|         m->set_handler(FS_RESET,     reset_handler);
 | |
|         m->set_handler(FS_NRATE,     nrate_handler); 
 | |
|         m->set_handler(FS_RECALC,    recalc_handler);
 | |
|         m->set_handler(FS_NSCAB,     codcab_handler);
 | |
|         m->set_handler(FS_VSCAB,     codcab_handler);
 | |
|         
 | |
|         TMask& sm = ps.sheet_mask();
 | |
|         sm.set_handler(102, ratalit_handler);
 | |
|         sm.set_handler(103, rataval_handler);
 | |
|         sm.set_handler(105, tipopag_handler);
 | |
|         sm.set_handler(106, tipopag_handler);
 | |
|       }  
 | |
|     }   
 | |
|   case 1:
 | |
|     if (m)
 | |
|     {  
 | |
|       m->first_focus(_firstfocus);
 | |
|       m->set_handler(F_DATAREG, datareg_handler);
 | |
|       m->set_handler(F_DATACOMP, datacomp_handler);
 | |
|       m->set_handler(F_DESCR, descr_handler);
 | |
|       m->set_handler(F_CODCAUS, caus_modify_handler);
 | |
|       m->set_handler(F_TOTALE, totdoc_handler);
 | |
|       m->set_handler(F_SHEETCG, cg_handler);
 | |
|       m->set_handler(SK_VALUTA, valuta_handler);
 | |
|       m->set_handler(SK_DATACAMBIO, datacambio_handler);
 | |
|       m->set_handler(SK_CAMBIO, cambio_handler);
 | |
|       m->set_handler(SK_TOTDOCVAL, totdocval_handler);
 | |
| 
 | |
|       TSheet_field& cg = (TSheet_field&)m->field(F_SHEETCG);                                                      
 | |
|       cg.set_notify(cg_notify);
 | |
|       TMask& cgm = cg.sheet_mask();
 | |
|       
 | |
|       cgm.set_handler(CG_DARE, dareavere_handler);
 | |
|       cgm.set_handler(CG_AVERE, dareavere_handler);
 | |
|       cgm.set_handler(CG_GRUPPO, cg_gruppo_handler);
 | |
|       cgm.set_handler(CG_CONTO, cg_conto_handler);
 | |
|       cgm.set_handler(CG_SOTTOCONTO, suspended_handler);
 | |
|       cgm.set_handler(CG_SOTTOCONTO + 100, sheet_clifo_handler);
 | |
|       cgm.set_handler(CG_SOTTOCONTO + 200, sheet_clifo_handler);
 | |
| 
 | |
|       cgm.set_handler(113, suspended_handler);    // Contropartita
 | |
|       cgm.set_handler(213, sheet_clifo_handler);
 | |
|       cgm.set_handler(313, sheet_clifo_handler);
 | |
|     }  
 | |
|     break;
 | |
|   case 3:
 | |
|     m->set_handler(O_CODICE, occas_code_handler);
 | |
|     break;  
 | |
|   default:
 | |
|     CHECKD(0, "Che ca$$o di maschera e' la ", n);
 | |
|     break;  
 | |
|   }
 | |
|   
 | |
|   _msk[n] = m;
 | |
|   return m;
 | |
| }
 | |
| 
 | |
| void TPrimanota_application::open_files(int logicnum, ...)  
 | |
| {  
 | |
|   va_list marker;
 | |
|   va_start(marker, logicnum);
 | |
|   while (logicnum > 0)
 | |
|   {
 | |
|     CHECKD(_file.objptr(logicnum) == NULL, "File gia' aperto: ", logicnum);
 | |
|     _file.add(new TLocalisamfile(logicnum), logicnum);
 | |
|     logicnum = va_arg(marker, int);
 | |
|   }
 | |
| }
 | |
| 
 | |
| bool TPrimanota_application::user_create()
 | |
| {
 | |
|   open_files(LF_TABCOM, LF_TAB, LF_CAUSALI, LF_RCAUSALI, LF_CLIFO, LF_PCON, 0);
 | |
|   open_files(LF_ATTIV, LF_SALDI, LF_COMUNI, LF_OCCAS, LF_NDITTE, 0);
 | |
|   open_files(LF_SCADENZE, LF_PAGSCA, 0);
 | |
|   
 | |
|   _rel = new TMovimentoPN;
 | |
|   _rel->add(LF_PARTITE, "NREG=NUMREG", 2);        // Collega la partita aperta dalla fattura
 | |
| 
 | |
|   _causale = new TCausale();
 | |
|   _giornale = new TLibro_giornale();
 | |
|   
 | |
|   set_search_field(F_NUMREG);                     // Set field for default search
 | |
| 
 | |
|   _pag = NULL;  
 | |
|   _pag_rows = NULL;
 | |
|   _is_saldaconto = FALSE;                            
 | |
|   
 | |
|   load_mask(0);                                   
 | |
| 
 | |
|   return TRUE;
 | |
| }
 | |
| 
 | |
| 
 | |
| bool TPrimanota_application::save_and_new() const
 | |
| { return _savenew; }
 | |
| 
 | |
| 
 | |
| bool TPrimanota_application::user_destroy()
 | |
| { 
 | |
|   for (int m = 3; m >= 0; m--)
 | |
|     if (_msk[m] != NULL) delete _msk[m];
 | |
|   
 | |
|   if (_pag) delete _pag;
 | |
| 
 | |
|   delete _giornale;  
 | |
|   delete _causale;
 | |
|   delete _rel;
 | |
|   close_files();
 | |
| 
 | |
|   return TRUE;
 | |
| }
 | |
| 
 | |
| // Legge la causale di codice cod ed il relativo registro dell'anno year
 | |
| // Certified 99%
 | |
| bool TPrimanota_application::read_caus(const char* cod, int year)
 | |
| {
 | |
|   bool ok = TRUE;
 | |
| 
 | |
|   if (cod != NULL)
 | |
|     ok = causale().read(cod, year);    
 | |
| 
 | |
|   bool nob = FALSE, dob = FALSE;
 | |
|   TipoIVA iva = nessuna_iva;
 | |
|   _is_saldaconto = FALSE;
 | |
|   
 | |
|   if (ok)
 | |
|   {
 | |
|     _is_saldaconto = gestione_saldaconto() && causale().saldaconto();
 | |
|     dob = is_fattura() || causale().data_doc();
 | |
|     nob = is_fattura() || causale().num_doc();
 | |
|     iva = causale().iva();
 | |
|   } 
 | |
|   
 | |
|   TMask* m = _msk[iva == nessuna_iva ? 1 : 2];
 | |
|   
 | |
|   // Se sono chiamato dai campi di query ho belle che finito
 | |
|   if (_mode == MODE_QUERY || m == NULL)  
 | |
|     return TRUE;
 | |
| 
 | |
|   const bool ins = m->insert_mode();
 | |
|   
 | |
|   m->efield(F_NUMDOC).check_type(nob ? CHECK_REQUIRED : CHECK_NORMAL);  // Num. doc. obbligatorio
 | |
|   m->efield(F_DATADOC).check_type(dob ? CHECK_REQUIRED : CHECK_NORMAL); // Data doc. obbligatoria
 | |
|   
 | |
|   const bool nota_credito = is_nota_credito();
 | |
|   const bool show_games = is_pagamento() || nota_credito;
 | |
|   TMask& cgm = cgs().sheet_mask();
 | |
|   cgm.set_handler(100, show_games ? showpartite_handler : NULL);  // bottoncino riga                                                             
 | |
|   cgm.enable(100, show_games);
 | |
|   if (iva == nessuna_iva)
 | |
|   {
 | |
|     m->enable(F_PROVVISORIO, !_is_saldaconto);        // Il saldaconto vieta i movimenti provvisori
 | |
|     m->show(SK_TIPORIGA, is_pagamento());             // Abilita scelta tipo riga
 | |
|     m->enable(SK_TIPORIGA);
 | |
|   }  
 | |
|   else
 | |
|   {                       
 | |
|     m->efield(F_CODPAG).enable(!nota_credito);
 | |
|     
 | |
|     TEdit_field& numrif = m->efield(F_NUMRIF);
 | |
|     numrif.set_justify(iva == iva_acquisti ? _num_for : _num_cli);
 | |
|     numrif.set_trim(!numrif.right_justified());
 | |
|     activate_numrif(FALSE);
 | |
|     
 | |
|     const bool av = causale().reg().agenzia_viaggi();
 | |
|     m->show(F_DATA74TER, av);
 | |
|     if (!av) m->reset(F_DATA74TER);
 | |
|     
 | |
|     if (ins)
 | |
|     {
 | |
|       const long protiva = causale().reg().protocol() + 1;
 | |
|       m->set(F_PROTIVA, protiva, TRUE); // Aggiorna protocollo IVA
 | |
|     }
 | |
|   }                     
 | |
| 
 | |
|   if (ins && !ci_sono_importi())
 | |
|   {
 | |
|     cgs().reset();
 | |
|     for (int i = 1; i < causale().size(); i++)
 | |
|     {
 | |
|       const TRectype* rcaus = (TRectype*)causale().objptr(i);
 | |
|       if (rcaus == NULL) continue;        // Evita eventuali righe nulle
 | |
| 
 | |
|       const int nriga = rcaus->get_int(RCA_NRIGA);
 | |
|       if (nriga < 1) continue;            // Considera solo righe reali (non riempimenti)
 | |
|       
 | |
|       TBill tc; causale().bill(nriga, tc);
 | |
|       if (tc.gruppo() <= 0) continue;      // Considera solo gruppi validi
 | |
| 
 | |
|       if (tc.tipo() > ' ' && tc.ok())
 | |
|       {
 | |
|         TBill clifo(0, 0, tc.sottoconto(), tc.tipo());
 | |
|         if (clifo.find() && clifo.conto() != 0)          // Legge gruppo e conto
 | |
|           tc = clifo;
 | |
|       }  
 | |
|       
 | |
|       int err = 0;
 | |
|       if (tc.descrizione() == "Sconosciuto") err = 1; 
 | |
|       else if (tc.sospeso()) err = 2;
 | |
|       
 | |
|       if (err)
 | |
|       {          
 | |
|         error_box("Il conto della riga %d della causale e' %s", 
 | |
|                   i, err == 1 ? "sconosciuto" : "sospeso");
 | |
|         continue;          
 | |
|       }
 | |
| 
 | |
|       const char sezione = rcaus->get_char(RCA_SEZIONE);
 | |
|       const TImporto zero('D', ZERO);
 | |
|       const TString80 desc(causale().desc_agg(i));
 | |
| 
 | |
|       if (nriga == 1) m->set(F_DESCR, desc);
 | |
|       
 | |
|       if (iva == nessuna_iva)
 | |
|       {      
 | |
|         char tipr = ' ';                   
 | |
|         if (is_pagamento()) 
 | |
|         {        
 | |
|           if (nriga <= RIGA_DIFFCAM && nriga != RIGA_SPESE) 
 | |
|             continue;  // Si considerano solo le spese
 | |
|           tipr = 'G';
 | |
|         }
 | |
|         const int pos = set_cgs_row(-1, zero, tc, desc, tipr);
 | |
|         if (sezione > ' ')
 | |
|           cgs().disable_cell(pos, sezione == 'A' ? 0 : 1);
 | |
|       }
 | |
|       else
 | |
|       {
 | |
|         if (nriga >= 2 && nriga <= 9)
 | |
|           continue;       // Conti per IVA detraibile e non, ritenute sociali e fiscali
 | |
| 
 | |
|         const char tipo = nriga == 1 ? 'T' : ' ';
 | |
|         if (nriga == 1 && tc.tipo() > ' ' && tc.ok())
 | |
|           m->set(tc.tipo() == 'C' ? F_CLIENTE : F_FORNITORE, tc.sottoconto());
 | |
|         set_cgs_row(-1,zero,tc,desc,tipo);
 | |
|       }
 | |
|     }
 | |
|     fill_sheet(*m);
 | |
|   }
 | |
|   
 | |
|   return ok;
 | |
| } 
 | |
| 
 | |
| 
 | |
| // Certified 100%
 | |
| void TPrimanota_application::print()
 | |
| {
 | |
|   TExternal_app stampa("cg3 -0");
 | |
|   stampa.run();
 | |
| }
 | |
| 
 | |
| 
 | |
| bool TPrimanota_application::changing_mask(int mode)
 | |
| {
 | |
|   if (mode == MODE_QUERY) 
 | |
|   {
 | |
|     const bool flag = _mode != MODE_QUERY; 
 | |
|     return flag;
 | |
|   }  
 | |
|   _iva = iva_errata;
 | |
|   return TRUE;
 | |
| }
 | |
| 
 | |
| 
 | |
| TMask* TPrimanota_application::get_mask(int mode)
 | |
| {
 | |
|   int annoes = 0, annoiva = 0;
 | |
|   TString16 caus;
 | |
| 
 | |
|   _mode = mode;
 | |
| 
 | |
|   switch (mode)
 | |
|   {
 | |
|   case MODE_INS:
 | |
|     annoes  = _msk[0]->get_int(F_ANNOES);
 | |
|     annoiva = _msk[0]->get_int(F_ANNOIVA);
 | |
|     caus    = _msk[0]->get(F_CODCAUS);
 | |
|     break;
 | |
|   case MODE_MOD:
 | |
|     annoes  = _rel->lfile().get_int("ANNOES");
 | |
|     annoiva = _rel->lfile().get_int("ANNOIVA");
 | |
|     caus    = _rel->lfile().get("CODCAUS");
 | |
|     break;
 | |
|   default:
 | |
|     return load_mask(0);
 | |
|   }
 | |
|   
 | |
|   if (giornale().year() != annoes)
 | |
|     giornale().read(annoes);
 | |
|   
 | |
|   const TCausale& c = causale();
 | |
|   if (caus != c.codice() || (c.iva() != nessuna_iva && c.reg().year() != annoiva))
 | |
|     read_caus(caus, annoiva);
 | |
| 
 | |
|   _iva = c.iva();
 | |
|   return load_mask(_iva == nessuna_iva ? 1 : 2); 
 | |
| } 
 | |
| 
 | |
| bool TPrimanota_application::firm_change_enabled() const
 | |
| {
 | |
|   const bool ok = _msk[2] == NULL && TRelation_application::firm_change_enabled();
 | |
|   return ok;
 | |
| }
 | |
| 
 | |
| void TPrimanota_application::on_firm_change()
 | |
| {
 | |
|   TRelation_application::on_firm_change();        // May be useful, who knows?
 | |
|   
 | |
|   _rel->lfile().last();
 | |
|   _lastreg = _rel->lfile().get_long(MOV_NUMREG);  // Init last registration number
 | |
|   
 | |
|   _esercizi.update();                             // Init exercises
 | |
| }  
 | |
| 
 | |
| void TPrimanota_application::on_config_change()
 | |
| {
 | |
|   TConfig cnf(CONFIG_DITTA);
 | |
|   _ges_val       = cnf.get_bool("GesVal");
 | |
|   _ges_sal       = cnf.get_bool("GesSal");
 | |
|   _npart_is_prot = cnf.get_bool("RifPro"); 
 | |
| 
 | |
|   _num_cli       = cnf.get_bool("NrCliDx");
 | |
|   _num_for       = cnf.get_bool("NrForDx");
 | |
|   TPartita::carica_allineamento();
 | |
| }
 | |
| 
 | |
| 
 | |
| void TPrimanota_application::init_mask(TMask& m)
 | |
| {
 | |
|   disable_menu_item(M_FILE_PRINT);
 | |
|   
 | |
|   read_caus(NULL, 0);                      // Setta campi obbligatori
 | |
|   fill_sheet(m);
 | |
| 
 | |
|   const bool valintra = causale().valintra();
 | |
|   const bool corrisp = causale().corrispettivi();
 | |
| 
 | |
|   if (_iva == nessuna_iva)
 | |
|   { 
 | |
|     m.show(-5, _is_saldaconto);    // Abilita campi saldaconto     
 | |
|   }
 | |
|   else
 | |
|   {                        
 | |
|     bool clig, forg;
 | |
|     if (_iva == iva_acquisti)
 | |
|     {
 | |
|       forg = TRUE;
 | |
|       clig = FALSE;
 | |
|     } 
 | |
|     else
 | |
|     {
 | |
|       forg = FALSE;
 | |
|       clig = corrisp ? FALSE : TRUE;
 | |
|     }                              
 | |
|     m.show(-1, clig);
 | |
|     m.show(-2, forg);
 | |
|     if (corrisp) m.hide(F_STATOPAIV);
 | |
|     
 | |
|     // Show/Hide campi valuta: F_VALUTAINTRA, F_CAMBIOINTRA, F_CORRLIRE, F_CORRVAL (GROUP 4)
 | |
|     m.show(-4, valintra);
 | |
|     
 | |
|     m.show(F_CODIVA, m.insert_mode());                   // Codice IVA standard
 | |
|     
 | |
|     if (is_fattura())
 | |
|     {
 | |
|       const TPartita* game = partite().first();
 | |
|       _scad_free = game == NULL || !game->esistono_abbuoni_diffcam(m.get_long(F_NUMREG));
 | |
|       if (m.edit_mode())
 | |
|         m.enable(DLG_DELREC, _scad_free);  // Disabilita tasto elimina
 | |
|       m.enable(-1, _scad_free);            // Disabilita cliente
 | |
|       m.enable(-2, _scad_free);
 | |
|       m.enable(F_ANNORIF, _scad_free);     // Disabilita anno e numero partita
 | |
|       m.enable(F_NUMRIF,  _scad_free);
 | |
|       m.enable(F_SOLAIVA, _scad_free);     // Disabilita movimenti di sola IVA      
 | |
|       m.enable(F_CODPAG,  _scad_free);     // Disabilita codice pagamento
 | |
|       m.enable(FS_RESET,  _scad_free);     // Disabilita tasto di reset
 | |
|       if (!_scad_free) 
 | |
|         m.set(FS_RECALC, "", TRUE);        // Disabilita ricalcolo automatico 
 | |
|       m.enable(FS_RECALC, _scad_free);     
 | |
|     }  
 | |
|   }
 | |
|   
 | |
|   // Show/Hide campi valuta: F_VALUTA, F_CAMBIO, F_DATACAMBIO (GROUP 3)
 | |
|   const bool valuta = _ges_val && is_saldaconto() && causale().valuta();
 | |
|   m.show(-3, valuta);
 | |
| }
 | |
| 
 | |
| void TPrimanota_application::init_query_mode(TMask& m)
 | |
| {
 | |
|   enable_menu_item(M_FILE_PRINT);
 | |
|   
 | |
|   m.set(F_DATAREG, _last_dreg);
 | |
|   m.set(F_DATACOMP, _last_dcom);
 | |
| }
 | |
| 
 | |
| 
 | |
| void TPrimanota_application::fill_sheet(TMask& m) const
 | |
| {                                      
 | |
|   if (_iva != nessuna_iva || !is_saldaconto())
 | |
|   {
 | |
|     TSheet_field& cgs = (TSheet_field&)m.field(F_SHEETCG);
 | |
|     for (int r = cgs.items(); r < 16; r++) cgs.row(r);
 | |
|   }
 | |
|   
 | |
|   if (_iva != nessuna_iva)
 | |
|   {
 | |
|     TSheet_field& ivas = (TSheet_field&)m.field(F_SHEETIVA);
 | |
|     for (int r = ivas.items(); r < 16; r++) ivas.row(r);
 | |
|     ivas.enable_column(2, _iva == iva_acquisti);  // Tipo detrazione
 | |
|     ivas.enable_column(4, !m.insert_mode());      // Tipo costo ricavo
 | |
|   }
 | |
| }
 | |
| 
 | |
| 
 | |
| // Ritorna il prossimo numero di registrazione libero
 | |
| // Certified 100%
 | |
| const char* TPrimanota_application::get_next_key()
 | |
| { 
 | |
|   _tmp.cut(0);
 | |
|   _tmp.add(F_NUMREG); _tmp.add(_lastreg+1);
 | |
|   
 | |
|   if (_rel->good())                                 // Not reinsert
 | |
|   {
 | |
|     TMask& m = curr_mask();
 | |
|     if (m.insert_mode())
 | |
|     {
 | |
|       _tmp.add(F_CODCAUS);  _tmp.add(m.get(F_CODCAUS));   // Ricopia causale
 | |
|       _tmp.add(F_DATAREG);  _tmp.add(m.get(F_DATAREG));   //         data operazione 
 | |
|       _tmp.add(F_DATACOMP); _tmp.add(m.get(F_DATACOMP));  //              competenza
 | |
|       
 | |
|       if (iva() == iva_vendite)
 | |
|       {
 | |
|         _tmp.add(F_DATADOC); _tmp.add(m.get(F_DATADOC));  // Ricopia data documento
 | |
| 
 | |
|         const long n = m.get_long(F_NUMDOC);
 | |
|         if (n > 0)
 | |
|         { _tmp.add(F_NUMDOC); _tmp.add(n+1); }            // incrementa numero documento
 | |
|       }  
 | |
|     }  
 | |
|   }  
 | |
| 
 | |
|   return _tmp;
 | |
| }
 | |
| 
 | |
| 
 | |
| void TPrimanota_application::init_insert_mode(TMask& m)
 | |
| {
 | |
|   init_mask(m);             
 | |
|   
 | |
|   m.first_focus(_firstfocus);
 | |
| 
 | |
|   if (causale().reg().agenzia_viaggi())
 | |
|     m.set(F_DATA74TER, m.get(F_DATAREG));              
 | |
|   
 | |
|   if (iva() != nessuna_iva)
 | |
|   {
 | |
|     occas_mask().reset();
 | |
|     m.hide(F_OCCASEDIT);
 | |
|   }
 | |
|   
 | |
|   partite().destroy();
 | |
|   if (is_fattura())
 | |
|   { 
 | |
|     activate_numrif(FALSE);
 | |
|     const TString16 dt(m.get(F_DATADOC));
 | |
|     set_pagamento(NULL,dt);  
 | |
|     set_scadenze(m);
 | |
|   }  
 | |
|   else
 | |
|   {                   
 | |
|     set_pagamento(NULL,NULL);         // Annulla gestione rate
 | |
|   }  
 | |
| 
 | |
|   _saldi.reset();                       // Inizializza saldi
 | |
| 
 | |
|   _as400 = FALSE;          // Un movimento nuovo non puo' essere trasferito da AS400
 | |
| }
 | |
| 
 | |
| 
 | |
| void TPrimanota_application::init_modify_mode(TMask& m)
 | |
| { 
 | |
|   init_mask(m);             // Inizializzazione standard                   
 | |
|   calcola_saldo();          // Verifica eventuali sbilanci contabili
 | |
|   
 | |
|   // Determina se il movimento e' stato trasferito da AS/400: 
 | |
|   // praticamente controlla che non ci sia nessun tipo movimento sulle righe contabili.
 | |
|   _as400 = FALSE;
 | |
|   if (is_saldaconto() || iva() != nessuna_iva)
 | |
|   {
 | |
|     TSheet_field& cg = cgs();
 | |
|     if (cg.items() > 0)
 | |
|     {
 | |
|       _as400 = TRUE;
 | |
|       for (int i = cg.items()-1; i >= 0 && _as400; i--)
 | |
|       {
 | |
|         const char rt = row_type(cg.row(i));
 | |
|         _as400 = rt <= ' ';
 | |
|       }
 | |
|     }  
 | |
|   }
 | |
|   
 | |
|   if (_as400 && is_pagamento())
 | |
|   {
 | |
|     m.set(SK_TIPORIGA, "A");   // Forza il tipo riga normale
 | |
|     m.disable(SK_TIPORIGA);    // Disabilita la sua modifica
 | |
|   }
 | |
| }
 | |
| 
 | |
| // Controlla sulla causale se il segno del totale documento (ritsoc=FALSE) 
 | |
| // o quello delle ritenute sociali (ritsoc=TRUE) e' invertito rispetto al normale
 | |
| bool TPrimanota_application::test_swap(bool ritsoc)
 | |
| {
 | |
|   const char sez = ritsoc ? causale().sezione_ritsoc() : causale().sezione_clifo();
 | |
|   const bool s = (iva() == iva_vendite) ^ sez == 'D';
 | |
|   return s;
 | |
| }
 | |
| 
 | |
| 
 | |
| int TPrimanota_application::read(TMask& m)
 | |
| {
 | |
|   m.reset();           // Azzera campi e relativi dirty = 3
 | |
|   m.autoload(*_rel);    // Carica testata
 | |
|   
 | |
|   const long numreg = _rel->curr().get_long(MOV_NUMREG);
 | |
| 
 | |
|   partite().destroy(); // Azzera tutte le partite
 | |
|   
 | |
|   cgs().reset();       // Azzera tutte le righe contabili
 | |
| 
 | |
|   if (iva() != nessuna_iva)
 | |
|   { 
 | |
|     ivas().reset();   // Azzera tutte le righe iva
 | |
|     
 | |
|     occas_mask().reset();
 | |
|     const TString16 occode(_rel->lfile().get("OCFPI"));
 | |
|     occas_mask().set(O_CODICE, occode);
 | |
| 
 | |
|     const char clifo = _rel->lfile().get_char("TIPO");
 | |
|     if (_iva == iva_acquisti && clifo == 'C')
 | |
|       error_box("Registrazione di acquisto attribuita ad un cliente"); else
 | |
|         if (_iva == iva_vendite && clifo == 'F')
 | |
|           error_box("Registrazione di vendita attribuita ad un fornitore");
 | |
|   }
 | |
| 
 | |
|   _saldi.reset();                                // Azzera saldi
 | |
|   _saldi.set_movprovv(_rel->lfile().get_char("PROVVIS") > ' ');   
 | |
|   tiposal tsal = causale().apertura() ? apertura : 
 | |
|                 (causale().chiusura() ? chiusura : normale);
 | |
|   _saldi.set_tipo_saldo(tsal);
 | |
|   _saldi.set_anno_es(m.get_int(F_ANNOES));
 | |
|   _saldi.set_num_ulmov(numreg);
 | |
|   _saldi.set_data_ulmov((TDate)m.get(F_DATAREG));
 | |
| 
 | |
|   for (int i = 0; i < _rel->cg_items(); i++)
 | |
|   {
 | |
|     const TRectype& r = _rel->cg(i);
 | |
|     TToken_string& riga = cgs().row(i);          // Vuota la riga
 | |
| 
 | |
|     TImporto import(r.get_char("SEZIONE"), r.get_real("IMPORTO"));
 | |
|     import.add_to(riga, 0);                      // Dare/Avere 101-102
 | |
| 
 | |
|     TBill conto; conto.get(r);
 | |
|     riga.add(conto.string(0x3));                 // Conto 103-107
 | |
|     
 | |
|     _saldi.aggiorna(conto, import, FALSE);
 | |
|     
 | |
|     riga.add("");                                // Codice descrizione 108
 | |
|     riga.add(r.get("DESCR"));                    // Descrizione riga 109
 | |
| 
 | |
|     conto.get(r, TRUE);
 | |
|     riga.add(conto.string(0x3));                 // Contropartita 110-114
 | |
|     riga.add(r.get("NUMGIO"));
 | |
|     const char tipo = r.get_char("ROWTYPE");         
 | |
|     riga.add(tipo);                              // Tipo di riga 115
 | |
|     
 | |
|     disable_cgs_cells(i, tipo);
 | |
|   }      
 | |
| 
 | |
|   if (_iva == nessuna_iva) 
 | |
|     return _rel->status();
 | |
|   
 | |
|   const bool solaiva = i == 0;
 | |
|   m.set(F_SOLAIVA, solaiva ? "X" : " ", TRUE);
 | |
|   
 | |
|   const bool to_swap = test_swap(FALSE);
 | |
|   if (to_swap)
 | |
|   {
 | |
|     real totdoc(m.get(F_TOTALE));  
 | |
|     totdoc = -totdoc;
 | |
|     m.set(F_TOTALE, totdoc.string());
 | |
|   }
 | |
|   for (i = 0; i < _rel->iva_items(); i++)
 | |
|   {
 | |
|     TRectype& r = _rel->iva(i);
 | |
|     TToken_string& riga = ivas().row(i);
 | |
|     
 | |
|     real imponibile(r.get("IMPONIBILE"));
 | |
|     if (to_swap) imponibile = -imponibile;
 | |
|     riga.add(imponibile.string());       // Imponibile 101
 | |
| 
 | |
|     riga.add(r.get("CODIVA"));           // IVA        102
 | |
|     riga.add(r.get("TIPODET"));          // Detrazione 103
 | |
| 
 | |
|     real imposta(r.get("IMPOSTA"));
 | |
|     if (to_swap) imposta = -imposta;
 | |
|     if (imponibile.sign() * imposta.sign() < 0)
 | |
|     {
 | |
|       error_box("Registrazione con imponibile e imposta con segni discordi:\n"
 | |
|                 "assegnato il segno dell'imponibile");
 | |
|       imposta = -imposta;
 | |
|     }  
 | |
|     riga.add(imposta.string());          // Imposta    104
 | |
| 
 | |
|     TBill c; c.get(r);
 | |
|     c.add_to(riga, 4, 0x7);              // Conto 105-110
 | |
|   }           
 | |
|   
 | |
|   calcola_imp();                         // Calcola totale imponibile ed imposte
 | |
|   
 | |
|   if (is_fattura())                      // Ci dovrebbero essere delle scadenze
 | |
|   {                        
 | |
|     pags().reset();                      // Azzera sheet rate
 | |
|     if (!read_scadenze(m))               // Se non esiste fattura
 | |
|     {
 | |
|       const TString dd(m.get(F_DATADOC));
 | |
|       set_pagamento(NULL, dd);           // Ignora codice pagamento in testata
 | |
|     }  
 | |
|   }
 | |
|   
 | |
|   return _rel->status();
 | |
| }
 | |
| 
 | |
| 
 | |
| // Trasferisce i dati da maschera a movimento di prima nota
 | |
| void TPrimanota_application::mask2rel(const TMask& m)
 | |
| {
 | |
|   m.autosave(*_rel);
 | |
|   
 | |
|   TRectype& rec = _rel->curr();             // Record della testata
 | |
|   
 | |
|   const long numreg = m.get_long(F_NUMREG);
 | |
|   const TDate datareg(m.get(F_DATAREG));
 | |
|   const int annoes = m.get_int(F_ANNOES);
 | |
| 
 | |
|   _saldi.set_movprovv(m.get(F_PROVVISORIO)[0] > ' ');
 | |
|   tiposal tsal = causale().apertura() ? apertura : 
 | |
|                 (causale().chiusura() ? chiusura : normale);
 | |
|   _saldi.set_tipo_saldo(tsal);
 | |
|   _saldi.set_anno_es(annoes);
 | |
|   _saldi.set_num_ulmov(numreg);
 | |
|   _saldi.set_data_ulmov((TDate)m.get(F_DATAREG));
 | |
|   
 | |
|   const int tm = causale().tipomov();
 | |
|   char s[2];
 | |
|   if (tm > 0) 
 | |
|   {
 | |
|     s[0] = tm+'0';
 | |
|     s[1] = '\0';
 | |
|   }  
 | |
|   else
 | |
|     s[0] = '\0';
 | |
|   rec.put(MOV_TIPOMOV, s);  // Tolto dalla maschera (su file e' alfanumerico)!
 | |
| 
 | |
|   _rel->destroy_rows(numreg);            // Destroy all records
 | |
|   cgs_pack();                            // Destroy all null rows
 | |
| 
 | |
|   TArray& rows = cgs().rows_array();
 | |
|   
 | |
|   // Controlla se e' un movimento con righe contabili
 | |
|   if (iva() == nessuna_iva || !m.get_bool(F_SOLAIVA))  
 | |
|   {                         
 | |
|     for (int i = 0; i < rows.items(); i++)
 | |
|     {
 | |
|       TToken_string& row = (TToken_string&)rows[i];
 | |
| 
 | |
|       TImporto n; n = row;                         
 | |
|       const TBill conto(row, 2, 0x3);
 | |
|       _saldi.aggiorna(conto, n, TRUE);
 | |
|       
 | |
|       TRectype &r = _rel->cg(i);
 | |
|       r.zero();
 | |
| 
 | |
|       r.put("NUMREG", numreg);              // Numero registrazione
 | |
|       r.put("ANNOES", annoes);              // Anno esercizio
 | |
|       r.put("DATAREG", datareg);            // Data di registrazione
 | |
|       r.put("NUMRIG", i+1);                 // Numero riga
 | |
|       
 | |
|       r.put("SEZIONE", n.sezione());        // Sezione
 | |
|       r.put("IMPORTO", n.valore());         // Importo
 | |
|       conto.put(r);                         // Conto
 | |
|       
 | |
|       row.get();                            // Codice descrizione (ignorato)
 | |
|       const char* descr = row.get();        // Descrizione aggiuntiva
 | |
|       if (i > 0 || m.get(F_DESCR) != descr) // Salva la prima descrizione se diversa da testata
 | |
|         r.put("DESCR", descr);              // Descrizione riga
 | |
| 
 | |
|       r.put("TIPOCC", row.get());           // Contropartita
 | |
|       r.put("GRUPPOC", row.get());
 | |
|       r.put("CONTOC", row.get());
 | |
|       r.put("SOTTOCONTC", row.get());
 | |
|       row.get();                            // Descrizione contropartita
 | |
|       r.put("NUMGIO", row.get());           // Numero riga giornale
 | |
|       r.put("ROWTYPE", row.get());          // Tipo riga
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   if (_iva == nessuna_iva) return;
 | |
|   
 | |
|   if (causale().corrispettivi())
 | |
|   {
 | |
|     rec.put("TIPO", ""); 
 | |
|     rec.put("CODCF", "");  // Azzera il cliente nei movimenti dei corrispettivi
 | |
|   }
 | |
|   else
 | |
|   {
 | |
|     rec.put("TIPO", clifo()); 
 | |
| 
 | |
|     int err = ~NOERR;    
 | |
|     if (m.field(F_OCCASEDIT).active())        // Se e' un occasionale
 | |
|     {
 | |
|       TRelation occas(LF_OCCAS);
 | |
|       const TMask& om = occas_mask();
 | |
|       om.autosave(occas);                    // Salva i dati anagrafici
 | |
|       
 | |
|       err = occas.write();
 | |
|       if (err == _isreinsert)
 | |
|         err = occas.rewrite();
 | |
|       
 | |
|       if (err == NOERR)
 | |
|         rec.put("OCFPI", occas_mask().get(O_CODICE));
 | |
|       else
 | |
|         error_box("Errore di scrittura sul file dei clienti/fornitori occasionali: %d", err);  
 | |
|     }
 | |
|     if (err) 
 | |
|       rec.zero("OCFPI");
 | |
|   }
 | |
|   
 | |
|   const bool to_swap = test_swap(FALSE);                                   
 | |
|   if (to_swap)
 | |
|   {
 | |
|     real totale = rec.get("TOTDOC");
 | |
|     totale = -totale;
 | |
|     rec.put("TOTDOC", totale);
 | |
|   }
 | |
|   
 | |
|   const bool intra = causale().intra();
 | |
| 
 | |
|   TArray& irows = ivas().rows_array();
 | |
|   ivas_pack();
 | |
| 
 | |
|   for (int i = 0; i < irows.items(); i++)
 | |
|   {
 | |
|     TToken_string& row = (TToken_string&)irows[i];
 | |
| 
 | |
|     TRectype &r = _rel->iva(i);
 | |
|     r.zero();
 | |
|     r.put("NUMREG", numreg);
 | |
|     r.put("NUMRIG", i+1);
 | |
|     
 | |
|     r.put("ANNOES", annoes);              // Anno d'esercizio della testata (che ca$$ata!)
 | |
|     r.put("INTRA", intra);                // Causale intra (che ca$$ata!)
 | |
|     
 | |
|     real imponibile(row.get(0));
 | |
|     if (to_swap) imponibile = -imponibile;
 | |
|     r.put("IMPONIBILE", imponibile);
 | |
|     
 | |
|     r.put("CODIVA", row.get());
 | |
|     r.put("TIPODET", row.get());
 | |
|     
 | |
|     real imposta(row.get());
 | |
|     if (to_swap) imposta = -imposta;
 | |
|     r.put("IMPOSTA", imposta);
 | |
|     
 | |
|     r.put("TIPOCR", row.get());
 | |
| 
 | |
|     const TBill c(row, -1, 0x1);
 | |
|     const int rimp = bill2pos(c, 'I')+1;
 | |
|     r.put("RIGAIMP", rimp);
 | |
|     c.put(r);
 | |
|   } 
 | |
| }
 | |
| 
 | |
| 
 | |
| void TPrimanota_application::check_saldi()
 | |
| {
 | |
|   TString_array& rows = cgs().rows_array();
 | |
|   const int anno = _rel->curr().get_int("ANNOES");
 | |
|   
 | |
|   for (int i = 0; i < rows.items(); i++)
 | |
|   {
 | |
|     TToken_string& row = (TToken_string&)rows[i];
 | |
|     TBill conto(row, 2, 0x3);
 | |
|     conto.find();
 | |
|     const char sez = conto.sezione();
 | |
|     if (sez > ' ')
 | |
|     {
 | |
|       const TConto* c = _saldi.find(conto, anno);
 | |
|       if (c && !c->saldo_finale().is_zero() && c->saldo_finale().sezione() != sez)
 | |
|         warning_box("Il conto della riga %i ha un saldo finale in %s, "
 | |
|                     "contrariamente a quanto indicato sul piano dei conti", 
 | |
|                     i+1, sez == 'A' ? "dare" : "avere");
 | |
|     }                
 | |
|   }
 | |
| }  
 | |
| 
 | |
| 
 | |
| int TPrimanota_application::write(const TMask& m)
 | |
| {     
 | |
|   static int lasterr = NOERR;
 | |
|   
 | |
|   const long numreg = m.get_long(F_NUMREG);
 | |
|   if (numreg > _lastreg) _lastreg = numreg;             // Aggiorna ultima registrazione libera
 | |
|   
 | |
|   if (lasterr == NOERR)                           
 | |
|     mask2rel(m);                                        // Altrimenti raddoppia i saldi!
 | |
|   
 | |
|   _last_dreg = m.get(F_DATAREG);  
 | |
|   _last_dcom = m.get(F_DATACOMP);  
 | |
|   
 | |
|   const int err = _rel->write(TRUE);
 | |
|   if (err == NOERR)
 | |
|   {
 | |
|     _saldi.registra();
 | |
|     check_saldi();
 | |
|     
 | |
|     bool salvaconto = FALSE;
 | |
|     const long old_nreg = numreg - (lasterr == _isreinsert ? 1 : 0);
 | |
|     
 | |
|     if (iva() != nessuna_iva)
 | |
|     {
 | |
|       causale().reg().reread();                         // Aggiorna protocollo IVA
 | |
|       if (is_saldaconto())
 | |
|       {   
 | |
|         switch (causale().tipomov()) 
 | |
|         {
 | |
|         case tm_fattura:
 | |
|           partite().update_reg(_rel->curr(), old_nreg);
 | |
|           write_scadenze(m);                            // Salva fattura
 | |
|           break;
 | |
|         case tm_nota_credito:  
 | |
|           salvaconto = TRUE;                            // Salva nota credito
 | |
|            break;
 | |
|         default:
 | |
|           break;
 | |
|         }    
 | |
|       }  
 | |
|       else 
 | |
|       {  
 | |
|         // Genera incasso immediato se e' una fattura e non c'e' gestione saldaconto
 | |
|         if (!m.get_bool(F_SOLAIVA) && !gestione_saldaconto())                     
 | |
|         {
 | |
|           const TString causimm(causale().causale_inc_imm());
 | |
|           if (causimm.not_empty())
 | |
|             genera_incasso(causimm);                    
 | |
|         }    
 | |
|       }  
 | |
|     }    
 | |
|     else 
 | |
|     {
 | |
|       salvaconto = is_pagamento();
 | |
|     }  
 | |
|     
 | |
|     if (salvaconto)
 | |
|     {     
 | |
|       const long old_nreg = numreg - (lasterr == _isreinsert ? 1 : 0);
 | |
|       partite().update_reg(_rel->curr(), old_nreg);
 | |
|       partite().write();
 | |
|     }  
 | |
| 
 | |
|     link_m770();
 | |
|   } 
 | |
|   
 | |
|   lasterr = err;
 | |
|   return err;
 | |
| }
 | |
| 
 | |
| 
 | |
| int TPrimanota_application::rewrite(const TMask& m)
 | |
| {
 | |
|   mask2rel(m);
 | |
|   const int err = _rel->rewrite(TRUE);
 | |
|   if (err == NOERR)
 | |
|   {
 | |
|     _saldi.registra();
 | |
|     check_saldi();
 | |
|     
 | |
|     if (is_saldaconto())
 | |
|     {            
 | |
|       bool salvaconto = FALSE;
 | |
|       if (iva() != nessuna_iva) 
 | |
|       {                       
 | |
|         if (causale().tipomov() == tm_nota_credito)
 | |
|           salvaconto = TRUE;
 | |
|         else  
 | |
|         {
 | |
|           partite().update_reg(_rel->curr());
 | |
|           write_scadenze(m);  
 | |
|         }  
 | |
|       }  
 | |
|       else
 | |
|       {
 | |
|         salvaconto = is_pagamento();                   
 | |
|       }  
 | |
|       
 | |
|       if (salvaconto)
 | |
|       {
 | |
|         partite().update_reg(_rel->curr());
 | |
|         partite().rewrite();
 | |
|       }  
 | |
|     }    
 | |
|     
 | |
|     link_m770();
 | |
|   }
 | |
|   
 | |
|   return err;
 | |
| }
 | |
| 
 | |
| 
 | |
| bool TPrimanota_application::remove()
 | |
| {
 | |
|   const bool ok = TRelation_application::remove();
 | |
|   if (ok)
 | |
|   {
 | |
|     _saldi.registra();  
 | |
|     check_saldi();
 | |
|     
 | |
|     if (is_saldaconto()) 
 | |
|     {                   
 | |
|       if (is_fattura())
 | |
|       {          
 | |
|         TMask& m = curr_mask();
 | |
|         m.reset(F_ANNORIF); 
 | |
|         m.reset(F_NUMRIF);
 | |
|         write_scadenze(m);
 | |
|       }  
 | |
|       else
 | |
|       {                          
 | |
|         notify_cgline_deletion(-1);               // Notify deletion of all cg lines
 | |
|         partite().rewrite();
 | |
|       }
 | |
|     }  
 | |
|   }  
 | |
|   return ok;
 | |
| }
 | |
| 
 | |
| 
 | |
| HIDDEN bool incasso_handler(TMask_field& f, KEY k)
 | |
| {
 | |
|   if (k == K_ENTER)
 | |
|   {
 | |
|     TMask& m = f.mask();
 | |
|     TImporto tot(m.get(I_SEZIONE1)[0], (real)m.get(F_TOTALE));
 | |
|     
 | |
|     for (int i = 2; i < 5; i++)
 | |
|     {
 | |
|       const int sid = i == 2 ? I_SEZIONE2 : (i == 3 ? I_SEZIONE3 : I_SEZIONE4);
 | |
|       const real val(m.get(sid+1));
 | |
|       const TImporto imp(m.get(sid)[0], val);
 | |
|       tot += imp;
 | |
|     }
 | |
|     if (!tot.is_zero())
 | |
|       return f.error_box("Il movimento e' sbilanciato di %s", tot.valore().string("."));
 | |
|   }
 | |
|   return TRUE;
 | |
| }
 | |
| 
 | |
| 
 | |
| void TPrimanota_application::genera_incasso(const char* causimm)
 | |
| {
 | |
|   TMask m("cg2100i");
 | |
|   if (iva() == iva_acquisti) m.set_caption("Movimento di pagamento immediato");
 | |
|   
 | |
|   m.set_handler(F_DATAREG,  datareg_handler);
 | |
|   m.set_handler(F_DATACOMP, datacomp_handler);
 | |
|   m.set_handler(F_TOTALE,   incasso_handler);
 | |
|   
 | |
|   TCausale caus(causimm);             // Causale da usare
 | |
|   
 | |
|   if (caus.data_doc()) m.efield(F_DATADOC).check_type(CHECK_REQUIRED);
 | |
|   if (caus.num_doc()) m.efield(F_NUMDOC).check_type(CHECK_REQUIRED);
 | |
| 
 | |
|   m.set(F_DATAREG, curr_mask().get(F_DATAREG));
 | |
|   m.set(F_DATACOMP, curr_mask().get(F_DATACOMP));
 | |
|   m.set(F_DATADOC, curr_mask().get(F_DATADOC));
 | |
|   m.set(F_NUMDOC, curr_mask().get(F_NUMDOC));
 | |
|   m.set(F_NUMREG, _lastreg+1);                  // Incrementa numero di registrazione
 | |
|   m.set(F_DESCR, caus.desc_agg(1));             // Descrizione
 | |
|   m.set(F_CODCAUS, causimm);                    // Cambia causale
 | |
|   m.set(F_DESCRCAUS, caus.descrizione()); 
 | |
|   
 | |
|   m.set(I_SEZIONE1, caus.sezione_clifo() == 'D' ? "D" : "A");
 | |
|   m.set(F_TOTALE, curr_mask().get(F_TOTALE));                       
 | |
|   
 | |
|   m.set(F_CLIFO, _rel->cg(0).get("TIPOC"));
 | |
|   m.set(F_GRUPPOCLIFO, _rel->cg(0).get("GRUPPO"));
 | |
|   m.set(F_CONTOCLIFO, _rel->cg(0).get("CONTO"));
 | |
|   const TString& clifo = _rel->cg(0).get("SOTTOCONTO");
 | |
|   m.set(F_CLIENTE, clifo); m.set(F_FORNITORE, clifo); m.set(I_SOTTOCONTO, clifo);
 | |
|   
 | |
|   TBill conto; caus.bill(2, conto);   // Conto della seconda riga della causale
 | |
|   m.set(I_SEZIONE2, caus.sezione_clifo() == 'D' ? "A" : "D");
 | |
|   m.set(I_IMPORTO2, curr_mask().get(F_TOTALE));                       
 | |
|   m.set(I_GRUPPO2, conto.gruppo());
 | |
|   m.set(I_CONTO2, conto.conto());
 | |
|   m.set(I_SOTTOCONTO2, conto.sottoconto());
 | |
|   
 | |
|   if (m.run() == K_SAVE)
 | |
|   {
 | |
|     TMovimentoPN inc;                  // Nuovo movimento di incasso immediato
 | |
|     TRectype& curr = inc.curr();
 | |
|     curr.zero();
 | |
|     m.autosave(inc);                                            
 | |
|     
 | |
|     curr.put("TIPODOC", caus.tipo_doc());      // Tipo documento
 | |
|     curr.put("REG", caus.reg().name());        // Registro
 | |
|     curr.zero(MOV_TIPO);
 | |
|     curr.zero(MOV_CODCF);
 | |
|     curr.zero(MOV_TOTDOC);
 | |
|     curr.zero(MOV_ANNOIVA);
 | |
|     
 | |
|     const int annoes = m.get_int(F_ANNOES);
 | |
|     const TString16 datareg = m.get(F_DATAREG);
 | |
|     long num = m.get_long(F_NUMREG);                           
 | |
|     
 | |
|     inc.destroy_rows(num);
 | |
|     
 | |
|     TRectype& r = inc.cg(0);       
 | |
|     r.zero();
 | |
|     r.put("NUMREG", num);
 | |
|     r.put("NUMRIG", 1);
 | |
|     r.put("DATAREG", datareg);
 | |
|     r.put("ANNOES", annoes);
 | |
|     r.put("SEZIONE", m.get(I_SEZIONE1));
 | |
|     r.put("IMPORTO", m.get(F_TOTALE));
 | |
|     r.put("TIPOC", m.get(F_CLIFO));
 | |
|     r.put("GRUPPO", m.get(F_GRUPPOCLIFO));
 | |
|     r.put("CONTO", m.get(F_CONTOCLIFO));
 | |
| 
 | |
|     short clifo_id;
 | |
|     switch (m.get(F_CLIFO)[0])
 | |
|     {
 | |
|     case 'C': 
 | |
|       clifo_id = F_CLIENTE; break;
 | |
|     case 'F': 
 | |
|       clifo_id = F_FORNITORE; break;
 | |
|       default : 
 | |
|       clifo_id = I_SOTTOCONTO; break;
 | |
|     }  
 | |
|     r.put("SOTTOCONTO", m.get(clifo_id));
 | |
|     r.put("DESCR", m.get(F_DESCR));
 | |
|     r.put("TIPOCC", " ");
 | |
|     r.put("GRUPPOC", m.get(I_GRUPPO2));
 | |
|     r.put("CONTOC", m.get(I_CONTO2));
 | |
|     r.put("SOTTOCONTC", m.get(I_SOTTOCONTO2));
 | |
| 
 | |
|     r.put("ROWTYPE", " ");
 | |
|     
 | |
|     for (int i = 2; i < 5; i++)
 | |
|     { 
 | |
|       const int sid = i == 2 ? I_SEZIONE2 : (i == 3 ? I_SEZIONE3 : I_SEZIONE4);
 | |
|       const TString& imp = m.get(sid+1);
 | |
|       if (imp.empty()) break;
 | |
| 
 | |
|       TRectype& r = inc.cg(i-1);
 | |
|       r.zero();
 | |
|       r.put("IMPORTO", imp);
 | |
|       r.put("NUMREG", num);
 | |
|       r.put("NUMRIG", i);
 | |
|       r.put("DATAREG", datareg);
 | |
|       r.put("ANNOES", annoes);
 | |
|       r.put("SEZIONE", m.get(sid));
 | |
|       r.put("TIPOC", ' ');
 | |
|       r.put("GRUPPO", m.get(sid+2));
 | |
|       r.put("CONTO", m.get(sid+3));
 | |
|       r.put("SOTTOCONTO", m.get(sid+4));
 | |
|       if (i == 2) 
 | |
|         r.put("DESCR", caus.desc_agg(2));
 | |
|       
 | |
|       r.put("TIPOCC", m.get(F_CLIFO));
 | |
|       r.put("GRUPPOC", m.get(F_GRUPPOCLIFO));
 | |
|       r.put("CONTOC", m.get(F_CONTOCLIFO));
 | |
|       r.put("SOTTOCONTC", m.get(clifo_id));
 | |
|       
 | |
|       r.put("ROWTYPE", " ");
 | |
|     }
 | |
|     
 | |
|     while (inc.write() == _isreinsert)           // In caso di riscrittura
 | |
|     {                                  
 | |
|       num++;                                     // Incrementa numero registrazione
 | |
|       inc.lfile().put("NUMREG", num);            
 | |
|     }  
 | |
|     
 | |
|     if (inc.good())
 | |
|     {                                         
 | |
|       if (num > _lastreg) _lastreg = num;
 | |
|       
 | |
|       _saldi.reset();                              // Inizializza saldi
 | |
|       _saldi.set_movprovv(FALSE);
 | |
|       _saldi.set_tipo_saldo(normale);
 | |
|       _saldi.set_anno_es(m.get_int(F_ANNOES));
 | |
|       _saldi.set_num_ulmov(_lastreg);
 | |
|       _saldi.set_data_ulmov((TDate)m.get(F_DATAREG));
 | |
|       for (int r = 0; r < inc.cg_items(); r++)
 | |
|       {                
 | |
|         const TRectype& rec = inc.cg(r);
 | |
|         TBill c; c.get(rec);
 | |
|         const TImporto im(rec.get_char("SEZIONE"), rec.get_real("IMPORTO"));
 | |
|         _saldi.aggiorna(c, im, TRUE);    
 | |
|       } 
 | |
|       _saldi.registra();
 | |
|       check_saldi();
 | |
|     }  
 | |
|   }
 | |
| }
 | |
| 
 | |
| bool TPrimanota_application::is_percipient(long forn, char& tipper, long& codper) const
 | |
| {
 | |
|   TLocalisamfile fornitori(LF_CLIFO);
 | |
|   fornitori.put("TIPOCF", "F");  
 | |
|   fornitori.put("CODCF", forn);  
 | |
|   fornitori.read();
 | |
|   tipper = fornitori.get_char(CLI_TIPOAPER);
 | |
|   codper = fornitori.get_long(CLI_CODANAGPER);
 | |
|   return codper > 0;
 | |
| }
 | |
| 
 | |
| long TPrimanota_application::calcola_m770(int tipo_coll, real& spese, real& compenso, 
 | |
|                                           real& iva, real& ritfis)
 | |
| {                   
 | |
|   const int m770 = causale().link_m770();
 | |
|   long forn = 0;
 | |
| 
 | |
|   if (tipo_coll == 1)
 | |
|   {            
 | |
|     TString_array& riva = ivas().rows_array();
 | |
|     TCodiceIVA codiva; 
 | |
|     for (int i = 0; i < riva.items(); i++)
 | |
|     {                           
 | |
|       TToken_string& row = riva.row(i);
 | |
|       codiva.read(row.get(1));
 | |
|       const TString& tipoiva = codiva.tipo();
 | |
| 
 | |
|       const real imponibile(row.get(0));
 | |
|       if ((tipoiva == "ES" || tipoiva == "NI" ||tipoiva == "NS") && riva.items() > 1)
 | |
|       { 
 | |
|         if (m770 != 5)
 | |
|           spese += imponibile;
 | |
|       }
 | |
|       else
 | |
|         compenso += imponibile;
 | |
| 
 | |
|       const real imposta(row.get(3));
 | |
|       iva += imposta;
 | |
|     }
 | |
|     
 | |
|     i = type2pos('F');
 | |
|     if (i >= 0)
 | |
|     {
 | |
|       TImporto imp; imp = cgs().row(i);
 | |
|       ritfis = imp.valore();
 | |
|     }
 | |
|   }  
 | |
|   
 | |
|   if (tipo_coll == 3 || tipo_coll == 7)
 | |
|   { 
 | |
|     TImporto imp;
 | |
|     TString_array& rcg = cgs().rows_array();
 | |
|     for (int i = 0; i < rcg.items(); i++)
 | |
|     {
 | |
|       TToken_string& row = rcg.row(i);
 | |
|       imp = row;
 | |
| 
 | |
|       const char cf = row.get_char(2);
 | |
|       if (cf == 'F')                    // Evviva, e' un fornitore!
 | |
|       {            
 | |
|         const long cod = row.get_long(5);
 | |
|         char tipper;
 | |
|         long codper;
 | |
|         if (!is_percipient(cod, tipper, codper))  
 | |
|           continue;                     // Se non e' percipente ignoralo
 | |
|           
 | |
|         if (forn == 0 && tipo_coll == 3)
 | |
|         {
 | |
|           forn = cod;                   // E' il primo che trovo!
 | |
|         }  
 | |
|         else                            // Fine ricerca.
 | |
|         {
 | |
|           forn = 0;
 | |
|           compenso = ZERO;
 | |
|           break;
 | |
|         }  
 | |
|         compenso = imp.valore();
 | |
|       }  
 | |
|     }  
 | |
|   }    
 | |
|   
 | |
|   if (tipo_coll == 4)
 | |
|   {
 | |
|     TBill zio; causale().bill(2, zio);
 | |
|     
 | |
|     TString_array& rcg = cgs().rows_array();
 | |
|     for (int i = 0; i < rcg.items(); i++)
 | |
|     {                    
 | |
|       TToken_string& r = rcg.row(i);
 | |
|       const TBill bill(r, 3, 0x0);
 | |
|       if (zio == bill)
 | |
|       {
 | |
|         TImporto imp; imp = r;
 | |
|         ritfis = imp.valore(); 
 | |
|         break;
 | |
|       }  
 | |
|     }
 | |
|   }
 | |
|   
 | |
|   if (tipo_coll == 6)
 | |
|   {
 | |
|     TString_array& rcg = cgs().rows_array();
 | |
|     TToken_string& row = rcg.row(0);
 | |
|     TImporto imp;
 | |
|     imp = row;
 | |
|     if (imp.sezione() == 'D')
 | |
|       compenso = imp.valore();
 | |
|     else
 | |
|       compenso = ZERO;  
 | |
|   }
 | |
|   
 | |
|   return forn;
 | |
| }
 | |
| 
 | |
| bool TPrimanota_application::link_m770()
 | |
| {                                           
 | |
|   const int m770 = causale().link_m770();
 | |
|   if (!has_module(4) || iva() == iva_vendite || m770 == 0)
 | |
|     return FALSE;
 | |
|   
 | |
|   int tipo_coll = 0;
 | |
|   char tipper = ' ';
 | |
|   long codper = 0;
 | |
|   real spese, compenso, imposte, ritenute;
 | |
|   
 | |
|   if (iva() == iva_acquisti)
 | |
|   {       
 | |
|     if (m770 == 1 || m770 == 5)
 | |
|     {
 | |
|       const long forn = curr_mask().get_long(F_FORNITORE);  
 | |
|       if (is_percipient(forn, tipper, codper))
 | |
|         calcola_m770(tipo_coll = 1, spese, compenso, imposte, ritenute);
 | |
|     }    
 | |
|   }
 | |
|   else            // Movimento puramente contabile
 | |
|     switch (m770)
 | |
|     {
 | |
|     case 1:
 | |
|     {                                  
 | |
|       tipo_coll = is_saldaconto() ? 7 : 3;
 | |
|       const long forn = calcola_m770(tipo_coll, spese, compenso, imposte, ritenute);
 | |
|       if (forn != 0)                           
 | |
|         is_percipient(forn, tipper, codper);
 | |
|       else 
 | |
|         tipo_coll = 7;
 | |
|     }  
 | |
|     break;
 | |
|   case 2:
 | |
|     calcola_m770(tipo_coll = 4, spese, compenso, imposte, ritenute);
 | |
|     break;
 | |
|   case 6:
 | |
|     calcola_m770(tipo_coll = 6, spese, compenso, imposte, ritenute);
 | |
|     break;
 | |
|   default:
 | |
|     break;  
 | |
|   }
 | |
|   
 | |
|   if (tipo_coll)
 | |
|   {
 | |
|     TToken_string s(80);
 | |
|     s.add(tipo_coll);
 | |
|     s.add(curr_mask().insert_mode() ? "I" : "M");
 | |
|     s.add(tipper);
 | |
|     s.add(codper);
 | |
|     s.add(curr_mask().get(F_NUMREG));
 | |
|     s.add(curr_mask().get(F_NUMDOC));
 | |
|     s.add(curr_mask().get(F_DATADOC));
 | |
|     if (iva() == iva_acquisti)
 | |
|       s.add(curr_mask().get(F_TOTALE));
 | |
|     else
 | |
|       s.add("");
 | |
|     s.add(spese.string());    
 | |
|     s.add(compenso.string());    
 | |
|     s.add(imposte.string());    
 | |
|     s.add(ritenute.string());   
 | |
|     
 | |
|     const char* name = (tipo_coll == 4) ? "770 -1" : "770 -0";
 | |
|     TMessage m(name, "LINK770", s);                                                      
 | |
|     m.send();
 | |
|     
 | |
|     TExternal_app a(name);
 | |
|     a.run();
 | |
|   }
 | |
|   
 | |
|   return tipo_coll > 0; 
 | |
| }
 | |
| 
 | |
| 
 | |
| int cg2100 (int argc, char** argv)
 | |
| {
 | |
|   TPrimanota_application* a = new TPrimanota_application;
 | |
|   a->run(argc, argv, "Prima nota");
 | |
|   delete a;
 | |
|   return 0;
 | |
| }
 |