Files correlati : ve6.exe Ricompilazione Demo : [ ] Commento : Riportata la versione 3.1 patch 979 git-svn-id: svn://10.65.10.50/trunk@15623 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			798 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			798 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| #include <defmask.h>
 | |
| #include <recarray.h>
 | |
| #include <relapp.h>
 | |
| #include <sheet.h>
 | |
| 
 | |
| #include "ce1.h"
 | |
| #include "ce2101.h"
 | |
| #include "celib.h"
 | |
| 
 | |
| #include "ce1301a.h"
 | |
| #include "../cg/cglib01.h"
 | |
| 
 | |
| 
 | |
| #include "cespi.h"
 | |
| #include "salce.h"
 | |
| #include "ammce.h"
 | |
| #include "catdi.h"
 | |
| 
 | |
| /////////////////////////////////////////////////////////
 | |
| //Applicazione principale: prima puntata...
 | |
| /////////////////////////////////////////////////////////
 | |
| class TSelect_ammoces : public TRelation_application
 | |
| {
 | |
|   TRelation* _rel;
 | |
|   TAutomask* _msk[4];
 | |
|   int _tipo;  
 | |
|   real _aliqmax, _aliqmin, _aliqant;
 | |
|     
 | |
| private:
 | |
|   
 | |
| protected:
 | |
|   virtual bool user_create();
 | |
|   virtual bool user_destroy();
 | |
|   virtual TRelation* get_relation() const { return _rel; };
 | |
|   virtual bool changing_mask(int mode) { return TRUE; }
 | |
|   virtual TMask* get_mask(int mode);
 | |
|   
 | |
|   void init_mask(TMask& m);
 | |
|   virtual void init_query_mode(TMask& m);
 | |
|   virtual void init_insert_mode(TMask& m);
 | |
|   virtual void init_modify_mode(TMask& m);
 | |
| 
 | |
| public:
 | |
|   void set_tipo_beni(int t)  { _tipo = t; }
 | |
| };
 | |
| 
 | |
| inline TSelect_ammoces& app() { return (TSelect_ammoces&)main_app(); }
 | |
| //Continua piú avanti...
 | |
| //-----------------------------------------------------------------------------------------------------------------------//
 | |
| /////////////////////////////////////
 | |
| //Maschera di query
 | |
| /////////////////////////////////////
 | |
| class TSelam_qmask : public TAutomask
 | |
| {      
 | |
|   int _staat;
 | |
|   real _residuof, _residuoc, _uniprice;
 | |
|   bool _ammo100;
 | |
|  
 | |
| protected:
 | |
|   virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
 | |
|   void on_search_event(TOperable_field& o);
 | |
| 
 | |
|   int calcola_stato_attivita();
 | |
|   bool cespite_ok() const;
 | |
|   
 | |
| public:
 | |
|    int stato_attivita() const { return _staat; }
 | |
|    real get_residuof() const { return _residuof; }
 | |
|    real get_residuoc() const { return _residuoc; }
 | |
|    void calc_res(bool prec);
 | |
|    
 | |
|   TSelam_qmask();
 | |
| };
 | |
| 
 | |
| //scelta tipo ordinamento
 | |
| void TSelam_qmask::on_search_event(TOperable_field& o)
 | |
| {
 | |
|   TToken_string order, fields, header;
 | |
|   if (o.dlg() >= F_SEARCH3)
 | |
|   {
 | |
|     order.add(CESPI_STABILIM); header.add(TR("Stabilimento"));
 | |
|     order.add(CESPI_REPARTO); header.add(FR("Reparto@10"));
 | |
|   }
 | |
|   if (o.dlg() >= F_SEARCH2) 
 | |
|   {
 | |
|     order.add(CESPI_CODIMP); header.add(FR("Impianto@10"));
 | |
|   }
 | |
|   if (o.dlg() >= F_SEARCH1)
 | |
|   {
 | |
|     order.add(CESPI_CODCAT); header.add(TR("Cat"));
 | |
|     order.add(CESPI_DTCOMP); header.add(FR("Data Acq.@10"));
 | |
|   }
 | |
| 
 | |
|   order.add(CESPI_IDCESPITE); header.add(FR("Codice@10"));
 | |
|   
 | |
|   fields = order;
 | |
|   fields.add(CESPI_DESC); header.add(FR("Descrizione@50"));
 | |
|   
 | |
|   TRelation rel(LF_CESPI);
 | |
|   
 | |
|   TString filter;
 | |
|   if (!field(F_IMPIANTO).empty())
 | |
|     filter << CESPI_CODIMP << "==" << get(F_IMPIANTO);
 | |
|   
 | |
|   TSorted_cursor cur(&rel, order, filter);
 | |
|   TCursor_sheet sht(&cur, fields, TR("Cespiti"), header, 0, 1);
 | |
|   if (sht.run() == K_ENTER)
 | |
|   { 
 | |
|     TToken_string& row = sht.row();
 | |
|     const int cod_pos = row.items()-2;
 | |
|     set(F_IDCESPITE, row.get(cod_pos), TRUE);
 | |
|     stop_run(K_AUTO_ENTER);
 | |
|   }
 | |
| }
 | |
| 
 | |
| int TSelam_qmask::calcola_stato_attivita()
 | |
| {
 | |
|   const int ese = get_int(F_ESERCIZIO);
 | |
|   const int gru = get_int(F_GRUPPO);
 | |
|   const char* spe = get(F_SPECIE);
 | |
| 
 | |
|   TString16 str;  
 | |
|   str.format("%04d%02d%-4s", ese, gru, spe);
 | |
| 
 | |
|   const TRectype& curr_ccb = cache().get("CCB", str);
 | |
|   if (curr_ccb.get_bool("B1")) // Bollato stampato
 | |
|     _staat = 1;
 | |
|   
 | |
|   TDitta_cespiti& dc = ditta_cespiti();
 | |
|   dc.set_attivita(ese, gru, spe);
 | |
|   
 | |
|   return _staat;
 | |
| }
 | |
| 
 | |
| bool TSelam_qmask::cespite_ok() const
 | |
| {
 | |
|   const TRectype & cespi = cache().get(LF_CESPI, get(F_IDCESPITE));
 | |
|   const bool ok = !cespi.empty();
 | |
|   return ok;
 | |
| }
 | |
| 
 | |
| void TSelam_qmask::calc_res(bool prec)
 | |
| {
 | |
|   TCespite ces (get(F_IDCESPITE));                
 | |
| // calcolo ammortamento sul cespite (per sit. fiscale(1) e civilistica(2))        
 | |
|   TDate fine_es(get(F_FINE_ES));  
 | |
|   ces.calc_amm(1, fine_es);
 | |
|   const TRectype& salce2=ces.sal_pro();    //rectype giá di "tipo fiscale"
 | |
|   const TRectype& ammce2=ces.amm_pro();
 | |
| // determinazione del residuo fiscale
 | |
|   _residuof = ZERO;
 | |
|   _residuof = salce2.get_real(SALCE_CSTO)-salce2.get_real(SALCE_VNONAMM)+salce2.get_real(SALCE_RIV75)+salce2.get_real(SALCE_RIV83)+salce2.get_real(SALCE_RIV90)+salce2.get_real(SALCE_RIV91)+salce2.get_real(SALCE_RIVGF);
 | |
|   _residuof -= ammce2.get_real(AMMCE_QNORP)+ammce2.get_real(AMMCE_QACCP)+ammce2.get_real(AMMCE_QANTP)+ammce2.get_real(AMMCE_QPERSEP)+ammce2.get_real(AMMCE_FPRIVATOP)+ammce2.get_real(AMMCE_QPPRIVATEP);
 | |
|   if (!prec)
 | |
|     _residuof -= ammce2.get_real(AMMCE_QNOR)+ammce2.get_real(AMMCE_QACC)+ammce2.get_real(AMMCE_QANT)+ammce2.get_real(AMMCE_QPERSE)+ammce2.get_real(AMMCE_FPRIVATO)+ammce2.get_real(AMMCE_QPPRIVATE);
 | |
|       
 | |
|   ces.calc_amm(2, fine_es);
 | |
| //rectype giá di "tipo civilistico"
 | |
| // determinazione del residuo civilistico
 | |
|   _residuoc = ZERO;
 | |
|   _residuoc = salce2.get_real(SALCE_CSTO)+salce2.get_real(SALCE_RIV75)+salce2.get_real(SALCE_RIV83)+salce2.get_real(SALCE_RIV90)+salce2.get_real(SALCE_RIV91)+salce2.get_real(SALCE_RIVGC);
 | |
|   _residuoc -= ammce2.get_real(AMMCE_QNORP)+ammce2.get_real(AMMCE_QACCP)+ammce2.get_real(AMMCE_QANTP);
 | |
|   if (!prec)
 | |
|     _residuoc -= ammce2.get_real(AMMCE_QNOR)+ammce2.get_real(AMMCE_QACC)+ammce2.get_real(AMMCE_QANT);
 | |
| }
 | |
| 
 | |
| 
 | |
| bool TSelam_qmask::on_field_event(TOperable_field& o, TField_event e, long jolly)
 | |
| {
 | |
|   switch (o.dlg())
 | |
|   {
 | |
|   case F_ESERCIZIO:            
 | |
|     if (e == fe_close)
 | |
|       calcola_stato_attivita();
 | |
|     break;
 | |
|     
 | |
|   case F_SEARCH1:
 | |
|   case F_SEARCH2:
 | |
|   case F_SEARCH3:
 | |
|     if (e == fe_button)
 | |
|       on_search_event(o);
 | |
|     break;
 | |
|     
 | |
|   case F_IDCESPITE:            //é come fare l'OR (F_IDCESPITE || F_IDCESPITE_I)
 | |
|   case F_IDCESPITE_I:
 | |
|     if (e == fe_close)  
 | |
|     { 
 | |
|       if (!cespite_ok())
 | |
|         return error_box(TR("Inserire un cespite valido")); //controlla che esista il cespite
 | |
|       if (stato_attivita() == 1)
 | |
|         warning_box(TR("E' stato stampato il bollato dell'anno:\nnon sono permesse modifiche")); //il bollato é stato stampato
 | |
|         
 | |
|       TCespite ces (get(F_IDCESPITE));                 // controlla che la categoria del cespite sia ammortizzabile
 | |
|       const TRectype& categoria = ces.categoria();
 | |
|       bool non_ammortizzabile = categoria.get_bool("B0");
 | |
|       if (non_ammortizzabile)
 | |
|         return error_box(TR("Impossibile effettuare ammortamenti perché il cespite\nappartiene ad una categoria di beni non ammortizzabili"));
 | |
|       
 | |
|       int materiale = categoria.get_int("I0");      
 | |
|       app().set_tipo_beni(materiale);  //inizializza la variabile tipo
 | |
|        
 | |
|       if (materiale == 0)                                // controlla che il cespite non sia per caso in leasing 
 | |
|       {                                                  // solo i cespiti materiali possono essere in leasing..
 | |
|         if (ces.get_bool(CESPI_LEASING) == TRUE)
 | |
|           return error_box(TR("Impossibile impostare le scelte per cespiti ceduti in leasing"));
 | |
|       }   
 | |
|       
 | |
|       const TDate& datafunz = ces.get_date("DTFUNZ");    // se la data di entrata in funzione non é nulla....
 | |
|       if (datafunz.ok())
 | |
|       {
 | |
|         calc_res(TRUE);                                  // controllo dei residui fiscale e civilistico in ingresso (prec=TRUE)
 | |
|         if (_residuof==ZERO)
 | |
|         {
 | |
|           message_box(TR("Il valore fiscale del cespite risulta giá completamente ammortizzato"));
 | |
|           return TRUE;
 | |
|         }
 | |
|         
 | |
|         if (_residuoc==ZERO)
 | |
|         {
 | |
|           message_box(TR("Il valore civilistico del cespite risulta giá completamente ammortizzato"));
 | |
|           return TRUE;
 | |
|         }
 | |
|       }
 | |
|       
 | |
| 			TString key;
 | |
| 
 | |
| 			key = get(F_IDCESPITE);
 | |
| 			key  << '|' << get(F_ESERCIZIO) << "|2|1";
 | |
| 
 | |
|       const TRectype & ammce = cache().get(LF_AMMCE, key);
 | |
|       if (!ammce.empty())
 | |
|       {
 | |
|         if (ammce.get_bool(AMMCE_FZPER) == TRUE)        
 | |
|           return error_box(TR("Sul cespite sono state forzate le Percentuali:\nprocedere dalla forzatura ammortamenti su cespite"));
 | |
|         if (ammce.get_bool(AMMCE_FZQUO) == TRUE)        
 | |
|           return error_box(TR("Sul cespite sono state forzate le Quote:\nprocedere dalla forzatura ammortamenti su cespite"));
 | |
|       }
 | |
|         
 | |
| 			key = get(F_IDCESPITE);
 | |
| 			key  << '|' << get(F_ESERCIZIO) << "|1";
 | |
|       const TRectype & salce = cache().get(LF_SALCE, key);              // controlla se ammesso ammortamento 100% per beni inferiori a 516.46 Euro
 | |
| 
 | |
|       _ammo100 = FALSE;
 | |
|       _uniprice = 516.46;
 | |
|       if (! salce.get_date(SALCE_DTSTBOLL).ok())
 | |
|       {
 | |
|         if (datafunz.ok() && (datafunz > get_date(F_INIZIO_ES) && datafunz < get_date(F_FINE_ES)) && salce.get_int(SALCE_ANNIAMM) == 0)
 | |
|         {
 | |
|           if (ces.get_bool(CESPI_TUIR) == TRUE)
 | |
|           { 
 | |
|             const TDate& data_fine_es = get_date(F_FINE_ES);
 | |
|             ces.calc_amm(2, data_fine_es);
 | |
|             real valore = salce.get_real(SALCE_CSTO)-salce.get_real(SALCE_VNONAMM)+salce.get_real(SALCE_RIV75)+salce.get_real(SALCE_RIV83)+salce.get_real(SALCE_RIV90)+salce.get_real(SALCE_RIV91)+salce.get_real(SALCE_RIVGF);
 | |
|             real valoreuni = valore / salce.get_int(SALCE_NUMELE);
 | |
|             if (valoreuni <= _uniprice)
 | |
|               _ammo100 = TRUE;
 | |
|           }
 | |
|         }
 | |
|       }
 | |
|       else
 | |
|       {
 | |
|         real valore = salce.get_real(SALCE_CSTO)-salce.get_real(SALCE_VNONAMM)+salce.get_real(SALCE_RIV75)+salce.get_real(SALCE_RIV83)+salce.get_real(SALCE_RIV90)+salce.get_real(SALCE_RIV91)+salce.get_real(SALCE_RIVGF);
 | |
|         real valoreuni = valore / salce.get_int(SALCE_NUMELE);
 | |
|         if (valoreuni <= _uniprice)
 | |
|           _ammo100 = TRUE;       
 | |
|       }     
 | |
| 
 | |
|     }
 | |
|     break;
 | |
|     
 | |
|   default:
 | |
|   break;
 | |
|   }  
 | |
|   return TRUE;
 | |
| }
 | |
| 
 | |
| TSelam_qmask::TSelam_qmask() : TAutomask("ce1301a") 
 | |
| {
 | |
|   first_focus(F_IDCESPITE);
 | |
| }
 | |
| 
 | |
| //-----------------------------------------------------------------------------------------------------------------------//
 | |
| //////////////////////////////////////////////////////////////////
 | |
| //Maschera BENI MATERIALI
 | |
| //////////////////////////////////////////////////////////////////
 | |
| class TSelam_mmask : public TAutomask
 | |
| {
 | |
|   int _staat;
 | |
| 
 | |
| protected:
 | |
|   virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
 | |
|   
 | |
|           bool test_min(short quota, short minimo) const;
 | |
|           bool test_max(short nor, short ant, short acc) const;
 | |
|           
 | |
| public:
 | |
|   void set_stato_attivita(int sa) { _staat = sa; }
 | |
|   int stato_attivita() const { return _staat; }
 | |
| 
 | |
|   TSelam_mmask() : TAutomask("ce1301b") { }
 | |
| };
 | |
| 
 | |
| bool TSelam_mmask::test_min(short quota, short minimo) const
 | |
| {
 | |
|   bool warning = FALSE;
 | |
|   const bool ammrit = get_bool(F_AMMRIT_CE);
 | |
|   if (!ammrit)
 | |
|   {
 | |
|     const real perq(get(quota));
 | |
|     const real minq(get(minimo));
 | |
|     warning = perq < minq;
 | |
|   }
 | |
|   return warning;
 | |
| }
 | |
| 
 | |
| bool TSelam_mmask::test_max(short nor, short ant, short acc) const
 | |
| {
 | |
|   real tot;
 | |
|   tot += get_real(nor);
 | |
|   tot += get_real(ant);
 | |
|   tot += get_real(acc);
 | |
|   return tot > 100.0;
 | |
| }
 | |
| 
 | |
| bool TSelam_mmask::on_field_event(TOperable_field& o, TField_event e, long jolly)
 | |
| {
 | |
|   switch (o.dlg())
 | |
|   {
 | |
|   case F_CATEGORIA:
 | |
|     {
 | |
|       TDitta_cespiti& dc = ditta_cespiti();
 | |
|       dc.on_category_event(o, e, jolly);
 | |
|     }
 | |
|     break;
 | |
|     
 | |
|   case F_AMMFISC_NOR_CE:                     
 | |
|     if (e == fe_modify || e == fe_close)
 | |
|     { 
 | |
|       if (get_bool(F_AMM100_CE) == FALSE)
 | |
|       {
 | |
|         if (test_min(F_AMMFISC_NOR_CE, F_NORMIN))        // controlla se si producono quote perse fiscali
 | |
|           warning_box(TR("L'ammortamento normale è inferiore al minimo della tabella ministeriale:\n"
 | |
|                       "Se non si seleziona l'ammortamento ritardato verranno generate delle quote perse"));
 | |
|         if (test_max(F_AMMFISC_NOR_CE, F_AMMFISC_ANT_CE, F_AMMFISC_ACC_CE))     // controlla totale percentuali impostate fiscali
 | |
|           return error_box(TR("Il totale delle percentuali di ammortamento fiscale supera il 100%"));
 | |
|       }   
 | |
|     }    
 | |
|     break; 
 | |
| 
 | |
|   case F_AMMFISC_ACC_CE:
 | |
|     if (e == fe_modify || e == fe_close)
 | |
|     {
 | |
|       if (test_max(F_AMMFISC_NOR_CE, F_AMMFISC_ANT_CE, F_AMMFISC_ACC_CE))     // controlla totale percentuali impostate fiscali
 | |
|         return error_box(TR("Il totale delle percentuali di ammortamento fiscale supera il 100%"));
 | |
|     }
 | |
|     break;
 | |
|                  
 | |
|   case F_AMMFISC_ANT_CE:
 | |
|     if (e == fe_modify || e == fe_close)
 | |
|     { 
 | |
|       if (test_max(F_AMMFISC_NOR_CE, F_AMMFISC_ANT_CE, F_AMMFISC_ACC_CE))     // controlla totale percentuali impostate fiscali
 | |
|         return error_box(TR("Il totale delle percentuali di ammortamento fiscale supera il 100%"));
 | |
|     
 | |
|       if (!o.empty() && test_min(F_AMMFISC_NOR_CE, F_NORMAX))
 | |
|         return error_box(TR("E' necessario completare l'ammortamento normale fiscale prima di calcolare quello anticipato fiscale"));
 | |
|     }
 | |
|     break;    
 | |
| 
 | |
|   case F_AMMCIV_NOR_CE:                     
 | |
|     if (e == fe_modify || e == fe_close)
 | |
|     {
 | |
|       if (test_max(F_AMMCIV_NOR_CE, F_AMMCIV_ANT_CE, F_AMMCIV_ACC_CE))     // controlla totale percentuali impostate civilistiche
 | |
|         return error_box(TR("Il totale delle percentuali di ammortamento civilistico supera il 100%"));    
 | |
|     }    
 | |
|     break;
 | |
| 
 | |
|   case F_AMMCIV_ANT_CE:
 | |
|     if (e == fe_modify || e == fe_close)
 | |
|     { 
 | |
|       if (test_max(F_AMMCIV_NOR_CE, F_AMMCIV_ANT_CE, F_AMMCIV_ACC_CE))     // controlla totale percentuali impostate civilistiche
 | |
|         return error_box(TR("Il totale delle percentuali di ammortamento civilistico supera il 100%"));
 | |
|     
 | |
|       if (!o.empty() && test_min(F_AMMCIV_NOR_CE, F_NORMAX))
 | |
|         return error_box(TR("E' necessario completare l'ammortamento normale civilistico prima di calcolare quello anticipato civilistico"));
 | |
|     }
 | |
|     break;
 | |
| 
 | |
|   case F_AMMCIV_ACC_CE:
 | |
|     if (e == fe_modify || e == fe_close)
 | |
|     {
 | |
|       if (test_max(F_AMMCIV_NOR_CE, F_AMMCIV_ANT_CE, F_AMMCIV_ACC_CE))     // controlla totale percentuali impostate civilistiche
 | |
|         return error_box(TR("Il totale delle percentuali di ammortamento civilistico supera il 100%"));
 | |
|     }
 | |
|     break;
 | |
|     
 | |
|   case F_AMMRIT_CE:
 | |
|     if (e == fe_modify || e == fe_close)
 | |
|     {
 | |
|       if (get_bool(F_AMMRIT_CE) == TRUE)
 | |
|       {
 | |
|         if ((get_real(F_AMMFISC_NOR_CE) >= get_real(F_NORMIN)) || (get_real(F_AMMCIV_NOR_CE) >= get_real(F_NORMIN)))
 | |
|           return error_box(TR("Indicata la scelta di ammortamento ritardato ma il Normale supera il Minimo ministeriale"));
 | |
|         if (get_real(F_AMMFISC_ACC_CE) != 0 || get_real(F_AMMCIV_ACC_CE) != 0)
 | |
|           return error_box(TR("Impossibile scegliere contemporaneamente ammortamento Accelerato e Ritardato"));
 | |
|       }
 | |
|     }
 | |
|     break;
 | |
|     
 | |
|   case F_ANTMIN:
 | |
|   case F_SCELTA:
 | |
|     if (e == fe_modify || e == fe_init)
 | |
|     {
 | |
|       if (((get_int(F_SCELTA) == 1) && (get_real(F_ANTMIN) == 0)) || get_int(F_SCELTA) != 1)
 | |
|       {  
 | |
|         disable(F_AMMFISC_ANT_CE);
 | |
|         reset(F_AMMFISC_ANT_CE);
 | |
|       }  
 | |
|       else
 | |
|         enable(F_AMMFISC_ANT_CE);
 | |
|     }
 | |
|     break; 
 | |
|   
 | |
| 	
 | |
| 
 | |
|   default:
 | |
|   break;    
 | |
|   }    
 | |
|   return TRUE;
 | |
| } 
 | |
| 
 | |
| //-----------------------------------------------------------------------------------------------------------------------//
 | |
| ////////////////////////////////////////////////////////////////////
 | |
| //Maschera BENI IMMATERIALI
 | |
| ////////////////////////////////////////////////////////////////////
 | |
| class TSelam_imask : public TAutomask
 | |
| {      
 | |
| protected:
 | |
|   virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
 | |
| 
 | |
| public:  
 | |
|   TSelam_imask() : TAutomask("ce1301c") { }
 | |
| };
 | |
| 
 | |
| bool TSelam_imask::on_field_event(TOperable_field& o, TField_event e, long jolly)
 | |
| {
 | |
|   switch (o.dlg())
 | |
|   {
 | |
|   case F_CATEGORIA:
 | |
|   case F_DESC_CAT:
 | |
|     {
 | |
|       TDitta_cespiti& dc = ditta_cespiti();
 | |
|       return dc.on_category_event(o, e, jolly);
 | |
|     }
 | |
|     break;
 | |
|     
 | |
|   case F_AMMFISC_CE:
 | |
|   case F_AMMCIV_CE:
 | |
|     if (e == fe_modify || e == fe_close)
 | |
|     {
 | |
|       TCespite ces(get(F_IDCESPITE));
 | |
|       if ( (ces.get_int(CESPI_VINCOLO) != 2) && ( (get(F_AMMFISC_CE) > get(F_ALIQMAX)) || (get(F_AMMCIV_CE) > get(F_ALIQMAX)) ) )
 | |
|         return error_box(TR("L' ammortamento richiesto supera il limite della categoria"));
 | |
|     }
 | |
|   break;
 | |
|   
 | |
|   default:
 | |
|     break;
 | |
|   }  
 | |
|   return TRUE;
 | |
| }
 | |
| 
 | |
| //-----------------------------------------------------------------------------------------------------------------------//
 | |
| ///////////////////////////////////////////////////////////
 | |
| // Maschera di costi pluriennali
 | |
| ///////////////////////////////////////////////////////////
 | |
| 
 | |
| class TSelam_pmask : public TAutomask
 | |
| {      
 | |
| protected:
 | |
|   virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
 | |
| 
 | |
| public:  
 | |
|   TSelam_pmask() : TAutomask("ce1301d") { }
 | |
| };
 | |
| 
 | |
| bool TSelam_pmask::on_field_event(TOperable_field& o, TField_event e, long jolly)
 | |
| {
 | |
|   switch (o.dlg())
 | |
|   {
 | |
|   case F_CATEGORIA:
 | |
|   case F_DESC_CAT:
 | |
|     {
 | |
|       TDitta_cespiti& dc = ditta_cespiti();
 | |
|       return dc.on_category_event(o, e, jolly);
 | |
|     }
 | |
|     break;
 | |
|     
 | |
|   case F_AMMFISC_CE:
 | |
|   case F_AMMCIV_CE:
 | |
|     if (e == fe_modify || e == fe_close)
 | |
|     { 
 | |
|       TCespite ces(get(F_IDCESPITE));
 | |
|       if (ces.get_int(CESPI_VINCOLO) == 1)      
 | |
|       {
 | |
|         if (ces.get_int(CESPI_ANNIRIC) == 0)
 | |
|         { 
 | |
|           real amm_fisc(o.get());
 | |
|           if (amm_fisc == ZERO)     //controlla l'obbligatorietá e la validitá dei campi (fiscale)
 | |
|             return error_box(TR("Compilare l'ammortamento scelto"));
 | |
|           else
 | |
|           {
 | |
|             if (amm_fisc < get_real(F_ALIQMIN))
 | |
|               return error_box(TR("L'ammortamento scelto é inferiore al minimo da Tabella"));
 | |
|             if (amm_fisc > get_real(F_ALIQMAX))
 | |
|               return error_box(TR("L'ammortamento scelto é superiore al minimo da Tabella"));
 | |
|           }   
 | |
|         }
 | |
|       }
 | |
|       else
 | |
|       { 
 | |
|         real anni_ammo = get_real(F_ANNIAMMOREQ);
 | |
|         if ((anni_ammo == ZERO) && ces.get_bool(CESPI_LEASING) == TRUE)
 | |
|           return error_box(TR("Compilare gli anni ammortamento richiesti"));
 | |
|         else if (anni_ammo > get_int(F_ENTROANNI))
 | |
|           return error_box(TR("Il numero di anni di ammortamento scelti supera il limite da tabella"));  
 | |
|       } 
 | |
|     }
 | |
|     break;  
 | |
|     
 | |
|   default:
 | |
|     break;
 | |
|   }  
 | |
|   return TRUE;
 | |
| }
 | |
| 
 | |
| //---------------------------------------------------------------------------------------------------------//
 | |
| ///////////////////////////////////////////////////////////
 | |
| // Applicazione principale: seconda puntata
 | |
| ///////////////////////////////////////////////////////////
 | |
| 
 | |
| TMask* TSelect_ammoces::get_mask(int mode)
 | |
| {
 | |
|   TMask* m = NULL;
 | |
|   if (mode == MODE_QUERY || mode == MODE_QUERYINS)
 | |
|   {
 | |
|     if (_msk[0] == NULL)
 | |
|        _msk[0] = new TSelam_qmask;
 | |
|     m = _msk[0];
 | |
|   }  
 | |
|   else
 | |
|   {
 | |
|     switch(_tipo)
 | |
|     {
 | |
|     case 1: 
 | |
|       if (_msk[2] == NULL)
 | |
|         _msk[2] = new TSelam_imask;
 | |
|       break;
 | |
|     case 2:
 | |
|       if (_msk[3] == NULL)
 | |
|         _msk[3] = new TSelam_pmask;
 | |
|       break;
 | |
|     default:
 | |
|       if (_msk[1] == NULL)
 | |
|         _msk[1] = new TSelam_mmask;
 | |
|       break;
 | |
|     }
 | |
|     m = _msk[_tipo+1];
 | |
|   }
 | |
|   return m;
 | |
| }
 | |
| 
 | |
| bool TSelect_ammoces::user_create()
 | |
| {             
 | |
|   open_files(LF_TABCOM, LF_TAB, LF_CESPI, LF_SALCE, LF_AMMCE, LF_CATDI, 0);
 | |
|   _rel = new TRelation (LF_AMMCE);                               // relazione principale su AMMCE
 | |
|   TString expr69, expr77;
 | |
|   expr69 << "IDCESPITE==IDCESPITE|CODES==CODES|TPSALDO==TPSALDO|TPAMM==2";   //seconda relazione su AMMCE (quella con i TPAMM=2)
 | |
|   _rel->add(LF_AMMCE, expr69, 1, 0, 69);                                   //69 é l'alias di AMMCE
 | |
|   _rel->write_enable(-69);                   //abilita la scrittura su secondo AMMCE
 | |
|   expr77 << "IDCESPITE==IDCESPITE|CODES==CODES|TPSALDO==TPSALDO|TPAMM==3";   //terza relazione su AMMCE (quella con i TPAMM=3)
 | |
|   _rel->add(LF_AMMCE, expr77, 1, 0, 77);                                   //77 é l'alias di AMMCE
 | |
|   _rel->write_enable(-77);                   //abilita la scrittura su terzo AMMCE  
 | |
|   _rel->add(LF_CESPI, "IDCESPITE==IDCESPITE");    //estende la relazione con CESPI
 | |
|   _rel->add(LF_SALCE, "IDCESPITE==IDCESPITE|CODES==CODES|TPSALDO==TPSALDO");
 | |
|   memset(_msk, 0, sizeof(_msk));
 | |
| 
 | |
|   return TRUE;
 | |
| }
 | |
| 
 | |
| bool TSelect_ammoces::user_destroy()
 | |
| {                                
 | |
|   for (int m = 3; m >= 0; m--)
 | |
|     if (_msk[m]) delete _msk[m];
 | |
|   delete _rel;
 | |
|   return TRUE;
 | |
| }
 | |
| 
 | |
| void TSelect_ammoces::init_query_mode(TMask& m)
 | |
| {
 | |
|   ditta_cespiti().init_mask(m);
 | |
| }
 | |
| 
 | |
| void TSelect_ammoces::init_mask(TMask& m)
 | |
| {
 | |
|   TDitta_cespiti& dc = ditta_cespiti();                 //se il bollato dell'esercizio é stato stampato inibisce il REGISTRA
 | |
|   const int ese = _msk[0]->get_int(F_ESERCIZIO);        //prende i dati attivitá dalla maschera di selezione
 | |
|   const int gru = _msk[0]->get_int(F_GRUPPO);
 | |
|   const char* spe = _msk[0]->get(F_SPECIE);
 | |
|   dc.set_attivita(ese, gru, spe);
 | |
|   dc.init_mask(m);
 | |
|   const bool can_edit = !dc.bollato_stampato();
 | |
|   m.enable(DLG_SAVEREC, can_edit);         // inibisce la registrazione se bollato stampato
 | |
|   m.enable(DLG_DELREC, can_edit);
 | |
|   const TString16 idcespite = m.get(F_IDCESPITE);
 | |
|   const TCespite ces (idcespite);
 | |
|   
 | |
|   TString key;
 | |
| 
 | |
| 	key = m.get(F_ESERCIZIO);
 | |
|   key << '|' << m.get(F_GRUPPO) << '|';
 | |
|   key << m.get(F_SPECIE) << '|';
 | |
|   key << m.get(F_CATEGORIA);
 | |
|   
 | |
| 	const TRectype &  catdi = cache().get(LF_CATDI, key);       //legge i valori dal file CATDI e li mette nei campi solo output delle msk
 | |
|   const int annofunz = m.get_date(F_DTFUNZ).year();   //getta l'anno di entrata in funzione del cespite
 | |
|   
 | |
| 	key = m.get(F_IDCESPITE);
 | |
|   key << '|' << m.get(F_ESERCIZIO) << "|1";
 | |
|   const TRectype & salce1 = cache().get(LF_SALCE, key);              
 | |
|  
 | |
|   switch (_tipo)
 | |
|   {
 | |
|   case 1: //immateriali
 | |
|       if (ces.get_int(CESPI_VINCOLO) == 2)    //Controllo tipo ammortamento da categoria
 | |
|       {
 | |
|         m.clear(F_ALIQMAX);
 | |
|         m.clear(F_AMMFISC_CE);
 | |
|         m.clear(F_AMMCIV_CE);
 | |
|         m.set(F_ANNIAMMOREQ, ces.get_int(CESPI_ANNIRIC));
 | |
|       }
 | |
|       else
 | |
|       {
 | |
|         m.set(F_ALIQMAX, ces.get_real(CESPI_PIMM));
 | |
|         m.set(F_AMMFISC_CE, _rel->curr().get_real(AMMCE_PNOR));
 | |
|         m.set(F_AMMCIV_CE, _rel->curr(-69).get_real(AMMCE_PNOR));
 | |
|         m.clear(F_ANNIAMMOREQ);
 | |
|       }
 | |
|       
 | |
|       if (annofunz < 1988)    //mette i valori di categoria nei campi solo output
 | |
|       {
 | |
|         m.set(F_AMMFISC_CT, catdi.get(CATDI_PFNORVN));
 | |
|         m.set(F_AMMCIV_CT, catdi.get(CATDI_PCNORVN));
 | |
|       }
 | |
|       else if (annofunz == 1988)
 | |
|       {
 | |
|         m.set(F_AMMFISC_CT, catdi.get(CATDI_PFNORVT));
 | |
|         m.set(F_AMMCIV_CT, catdi.get(CATDI_PCNORVT));
 | |
|       }
 | |
|       else
 | |
|       {
 | |
|         m.set(F_AMMFISC_CT, catdi.get(CATDI_PFNORNT));
 | |
|         m.set(F_AMMCIV_CT, catdi.get(CATDI_PCNORNT));
 | |
|       }
 | |
|       
 | |
|     break;
 | |
|     
 | |
|   case 2: //pluriennali
 | |
|       m.set(F_ENTROANNI, ces.categoria().get("I3")); //scrive sulla maschera il numero di anni per l'ammortamento
 | |
|       
 | |
|       if (annofunz < 1988)    //mette i valori di categoria nei campi solo output
 | |
|       {
 | |
|         m.set(F_AMMFISC_CT, catdi.get(CATDI_PFNORVN));
 | |
|         m.set(F_AMMCIV_CT, catdi.get(CATDI_PCNORVN));
 | |
|       }
 | |
|       else if (annofunz == 1988)
 | |
|       {
 | |
|         m.set(F_AMMFISC_CT, catdi.get(CATDI_PFNORVT));
 | |
|         m.set(F_AMMCIV_CT, catdi.get(CATDI_PCNORVT));
 | |
|       }
 | |
|       else
 | |
|       {
 | |
|         m.set(F_AMMFISC_CT, catdi.get(CATDI_PFNORNT));
 | |
|         m.set(F_AMMCIV_CT, catdi.get(CATDI_PCNORNT));
 | |
|       }
 | |
|       
 | |
|       if (ces.get_int(CESPI_VINCOLO) == 3) //se il cespite é a quote costanti...
 | |
|       { 
 | |
|         if (!salce1.empty())
 | |
|         {
 | |
|           if (salce1.get_int(SALCE_ANNIAMM) != 0)    //controlla la modificabilitá delle scelte dopo il primo anno
 | |
|           { 
 | |
|             m.disable(DLG_SAVEREC); 
 | |
|             error_box(TR("Ammortamento in quote costanti:\nimpossibile modificare le scelte dopo il primo esercizio di ammortamento"));
 | |
|           }
 | |
|           else
 | |
|           {
 | |
|             m.disable(F_AMMFISC_CE);
 | |
|             m.disable(F_AMMCIV_CE);
 | |
|           }
 | |
|         }
 | |
|       }
 | |
|       else
 | |
|       {
 | |
|         if (m.get_int(F_ENTROANNI) <= m.get_int(F_NUMESERAMM))
 | |
|         {
 | |
|           m.disable(DLG_SAVEREC);
 | |
|           error_box(TR("Impossibile proseguire:\nammortamento oltre il limite di anni della Tabella"));
 | |
|         }
 | |
|       }           
 | |
|     break;
 | |
|     
 | |
|   default: //materiali
 | |
|     {    
 | |
|       _aliqmax = ces.get_real(CESPI_PMAT);    // calcola i valori predefiniti delle aliquote limite per cespiti materiali    
 | |
|       _aliqmin = _aliqmax * 0.5;
 | |
|       if (!salce1.empty())
 | |
|       {
 | |
|         if (ces.get_bool(CESPI_USATO) == FALSE)
 | |
|         {
 | |
|           if (salce1.get_int(SALCE_ANNIAMM) <= 2)
 | |
|           {
 | |
|             if (ces.get_bool(CESPI_TUIR) == TRUE)
 | |
|               _aliqant = _aliqmax;
 | |
|             else
 | |
|               _aliqant = 15.0;
 | |
|           }
 | |
|           else
 | |
|             _aliqant = 0.0;    
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|           if (salce1.get_int(SALCE_ANNIAMM) != 0)
 | |
|             _aliqant = 0.0;
 | |
|           else
 | |
|             _aliqant = _aliqmax;
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|     m.set(F_NORMIN, _aliqmin);
 | |
|     m.set(F_NORMAX, _aliqmax);
 | |
|     m.set(F_ANTMIN, _aliqant);
 | |
|         
 | |
|     if (annofunz < 1988)                              //mette i valori di categoria nei campi solo output
 | |
|     {
 | |
|       m.set(F_AMMFISC_NOR_CT, catdi.get(CATDI_PFNORVN));
 | |
|       m.set(F_AMMFISC_ANT_CT, catdi.get(CATDI_PFANTVN));
 | |
|       m.set(F_AMMCIV_NOR_CT, catdi.get(CATDI_PCNORVN));
 | |
|       m.set(F_AMMCIV_ANT_CT, catdi.get(CATDI_PCANTVN));
 | |
|     }
 | |
|     else if (annofunz == 1988)
 | |
|     {
 | |
|       m.set(F_AMMFISC_NOR_CT, catdi.get(CATDI_PFNORVT));
 | |
|       m.set(F_AMMFISC_ANT_CT, catdi.get(CATDI_PFANTVT));
 | |
|       m.set(F_AMMCIV_NOR_CT, catdi.get(CATDI_PCNORVT));
 | |
|       m.set(F_AMMCIV_ANT_CT, catdi.get(CATDI_PCANTVT));
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|       m.set(F_AMMFISC_NOR_CT, catdi.get(CATDI_PFNORNT));
 | |
|       m.set(F_AMMFISC_ANT_CT, catdi.get(CATDI_PFANTNT));
 | |
|       m.set(F_AMMCIV_NOR_CT, catdi.get(CATDI_PCNORNT));
 | |
|       m.set(F_AMMCIV_ANT_CT, catdi.get(CATDI_PCANTNT));
 | |
|     }
 | |
|       
 | |
|     m.set(F_AMMFISC_ACC_CT, catdi.get(CATDI_PFACC));
 | |
|     m.set(F_AMMCIV_ACC_CT, catdi.get(CATDI_PCACC));
 | |
|     m.set(F_AMMRIT_CT, catdi.get(CATDI_AMMRIT));
 | |
|     m.set(F_AMM100_CT, catdi.get(CATDI_CSCEN));
 | |
|     
 | |
| 		if (ces.get_bool(CESPI_VEIDIP) && ces.get_int(CESPI_FLGTPVEI) > 1 && ces.get_int(CESPI_FLGTPVEI) < 5)
 | |
| 			m.show(F_FRINGEBEN);
 | |
| 		else
 | |
| 			m.hide(F_FRINGEBEN);
 | |
| 
 | |
|     break;
 | |
|   } //chiude lo switch
 | |
|   
 | |
| 
 | |
| }
 | |
| 
 | |
| void TSelect_ammoces::init_insert_mode(TMask& m)
 | |
| { 
 | |
|   init_mask(m);
 | |
| }
 | |
| 
 | |
| void TSelect_ammoces::init_modify_mode(TMask& m)
 | |
| { 
 | |
|   init_mask(m);
 | |
| }
 | |
| 
 | |
| int ce1300(int argc, char* argv[])
 | |
| {
 | |
|   TSelect_ammoces a;
 | |
|   a.run(argc, argv, TR("Scelta ammortamento per cespite"));
 | |
|   return 0;
 | |
| }
 | |
| 
 |