Files correlati : cg4.exe Ricompilazione Demo : [ ] Commento : Gestione IVA a liquidazione differita git-svn-id: svn://10.65.10.50/trunk@16288 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			625 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			625 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| // -----------------------------------------------------------------
 | |
| // Calcolo liquidazione
 | |
| // part 4: casi particolari
 | |
| // fv 2-2-94
 | |
| // -----------------------------------------------------------------
 | |
| 
 | |
| #include "cg4300.h"
 | |
| 
 | |
| void TLiquidazione_app::add_plafond(int month, const char* codatt, int type,
 | |
|                                     const real& howmuch, bool intra)
 | |
| {
 | |
|   look_ppa(month,codatt,type);
 | |
|   const char* field = intra ? "R1" : "R0";
 | |
|   real r = _ppa_r->get(field);
 | |
|   r += howmuch; 
 | |
|   _ppa_r->put(field, r);
 | |
|   _ppa->rewrite();
 | |
| }    
 | |
| 
 | |
| void TLiquidazione_app::zero_plafond (int month, const char* codatt)
 | |
| {
 | |
|   for (int jj = 1; jj <= 3; jj++) // three types of plafond
 | |
|   {
 | |
|     real r;
 | |
|     look_ppa(month,codatt,jj,TRUE);
 | |
|     if (month == 1 /*is_first_trim(month)*/) // controlla da sola nel caso di freq. mensile...
 | |
|     {
 | |
|       r = (jj == 1 ? _p8 : (jj == 2 ? _p8b : _p9)); 
 | |
|     }
 | |
|     else 
 | |
|     {
 | |
|       const long rn = _ppa->recno();
 | |
|       
 | |
|       // se non c'e' quello del mese prima c'e' poco da fare,
 | |
|       // si ricalcola tutto
 | |
|       bool is_ok = TRUE;
 | |
|       if (!look_ppa(month == 1 ? 1 : month -1/*previous_month(month)*/, codatt,jj))
 | |
|         // mazza che bella chiamata ricorsiva
 | |
|       { 
 | |
|         if (_recalc != needed)
 | |
|         {
 | |
|           describe_error(TR("Progressivi plafond non ricalcolati per "
 | |
|                          "i mesi precedenti: possibili errori"),
 | |
|                          codatt);
 | |
|           is_ok = FALSE;
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|           if (!update_att(previous_month(month),codatt, FALSE))
 | |
|             describe_error(TR("Progressivi plafond non ricalcolati per "
 | |
|                            "i mesi precedenti: possibili errori"),
 | |
|                            codatt);
 | |
|           look_ppa(previous_month(month),codatt,jj); 
 | |
|         }
 | |
|       }
 | |
|       
 | |
|       if (is_ok) // Se il record prec. esiste allora esegue i calcoli; In caso contrario diventa un errore sistematico
 | |
|         r = _ppa_r->get_real("R2") - 
 | |
|             _ppa_r->get_real("R0") - 
 | |
|             _ppa_r->get_real("R1"); 
 | |
|       
 | |
|       _ppa->readat(rn);
 | |
|     }
 | |
|     _ppa_r->put("R2",r);
 | |
|     _ppa_r->put("R0","");
 | |
|     _ppa_r->put("R1","");
 | |
|     _ppa->rewrite();
 | |
|   } // for tipo esenzione plafond      
 | |
| }                                     
 | |
| 
 | |
| // ricalcolo dei corrispettivi
 | |
| void TLiquidazione_app::recalc_corrispettivi(int month, const char* codatt)
 | |
| {
 | |
|   const int items = _corr_arr.items();
 | |
|   if (items == 0) return;
 | |
|   real imponibile,imposta;
 | |
|   // Se siamo in annuale non aggiornare i PIM/PAM/PLM dei mesi calcolati
 | |
|   
 | |
|   // ricalcola (solo per il mese in corso!) operando sull'array 
 | |
|   for (int i = 0; i < items; i++)
 | |
|   {
 | |
|     _CorrItem* ci = (_CorrItem*)&_corr_arr[i];
 | |
|     // memorizza  per codiva
 | |
|     
 | |
|     if (ci->_month != month || ci->_codatt != codatt) 
 | |
|       continue;             
 | |
|     lordo2netto(ci->_totale, imponibile, imposta, ci->_aliquota);
 | |
| 
 | |
|     // aggiusto l'IVA vendite nei plm
 | |
|     look_plm(month, codatt);
 | |
|     real ive = _plm->get_real("R0");
 | |
|     ive     += imposta;
 | |
|     _plm->put("R0",ive);
 | |
|     _plm->rewrite();
 | |
|     // .. e il volume di affari nei pam
 | |
|     real vaf = _pam->get_real("R1");
 | |
|     vaf     += imponibile; 
 | |
|     _pam->put("R1", vaf);
 | |
|     _pam->rewrite();
 | |
|     // Aggiorna il totale IVA periodica CD1_1
 | |
|     if (month == 13 && look_iva(ci->_codiva))
 | |
|     {
 | |
|       if (_iva->get("S10").not_empty()) // Solo CD1_1 ha senso coi corrispettivi...
 | |
|       {
 | |
|         real cd1_1 = _pum->get_real("R14");
 | |
|         cd1_1 += imponibile;
 | |
|         _pum->put("R14", cd1_1);
 | |
|         _pum->rewrite();
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| // ricalcolo della malefica ventilazione
 | |
| void TLiquidazione_app::recalc_ventilation(int month, const char* codatt)
 | |
| {
 | |
|   if (!_isvent || _isagricolo || _isviaggio || _vend_arr.items() == 0) return;
 | |
| 
 | |
|   TString att(codatt);
 | |
|   
 | |
|   
 | |
|   // 1) ricalcola i pim dei mesi dal primo al corrente se necessario
 | |
|   recalc rcl = _recalc;
 | |
|   _recalc = needed;
 | |
| 	int m;
 | |
|   for (m = 1; m < month; m++)
 | |
|     update_att(m,codatt, FALSE);
 | |
|   _recalc = rcl;
 | |
|   
 | |
|   _vent_arr.destroy();
 | |
|   
 | |
|   m = month == 13 ? 13 : 1; // In annuale legge solo il PIM13
 | |
|     
 | |
|   for (; m <= month; m++)
 | |
|   {
 | |
|     // aggiunge gli acquisti del mese m operando sui pim  
 | |
|     for (_pim->first(); !_pim->eof(); _pim->next())
 | |
|     {
 | |
|       if (_year != *_pim_anno) continue;
 | |
|       
 | |
|       // se e' acquisto beni per rivendita
 | |
|       int tipocr  = atoi(*_pim_tipocr);
 | |
|       int mese    = atoi(*_pim_mese);     
 | |
|       int tipodet = atoi(*_pim_tipodet);
 | |
|       look_iva(*_pim_codiva);
 | |
|       // base di riparto solo se non esente, non soggetto, non imponibile
 | |
|       TString16 tipoiva(_iva->get("S1"));                        
 | |
|       TString16 reg = *_pim_codreg;
 | |
|       
 | |
|       
 | |
|       /*
 | |
|        * caso particolare SENSU Vladimiro (1995) #MI3001   
 | |
|        * questi vengono pero' conteggiati nel totale
 | |
|        * acquisti per rivendita
 | |
|        */
 | |
|       if (tipodet == 1 ||( tipocr == 5 && tipodet == 3) || tipodet == 9)
 | |
|         continue;
 | |
|       
 | |
|       TString att(codatt);                     
 | |
|       
 | |
|       if (tipocr == 1 && (mese == m) && 
 | |
|           att == (const char*)(*_pim_codatt))  
 | |
|       {
 | |
|         if (tipoiva != "NS" && tipoiva != "NI" && tipoiva != "ES")   
 | |
|         {
 | |
|           real lurd     = _pim->get_real("R0");
 | |
|           lurd         += _pim->get_real("R1");
 | |
|           real perc     = _iva->get_real("R0");
 | |
|           TString other = _iva->get("S6");
 | |
|           if (!other.empty())
 | |
|           {
 | |
|             // ventila a un altro codice
 | |
|             look_iva(other);
 | |
|             perc = _iva->get_real("R0");
 | |
|           }
 | |
|           add_ventilation(perc / CENTO, lurd, *_pim_codiva, other);
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   }
 | |
|   
 | |
|   // 2) calcola totale acquisti su tutte le aliquote
 | |
|   real totacq = 0.0;
 | |
|   real totven = 0.0;
 | |
|   
 | |
|   const int vent_items = _vent_arr.items();
 | |
| 	int j;
 | |
|   for (j = 0; j < vent_items; j++)
 | |
|   {
 | |
|     _VentItem& vv = (_VentItem&)_vent_arr[j];
 | |
|     totacq += vv._totale;
 | |
|   }
 | |
|   
 | |
|   // 3) ricalcola (solo per il mese in corso!) operando sull'array 
 | |
|   const int vend_items = _vend_arr.items();
 | |
|   for (int i = 0; i < vend_items; i++)
 | |
|   {
 | |
|     _VendItem* vi = (_VendItem*)&_vend_arr[i];
 | |
|     totven += vi->_totale;
 | |
|   }
 | |
|   
 | |
|   /*
 | |
|    * Udite! Udite! Per editto di sua maesta' la ventilazione
 | |
|    * va calcolata in modo uguale al frigorifero (cioe' sbagliato)
 | |
|    * I migliori auguri per una pronta guarigione dallo stato di 
 | |
|    * infermita' mentale che vi affligge tutti.
 | |
|    * Bando ai convenevoli e passiamo alla spiegazione (se siete
 | |
|    * rigorosamente razionali fermatevi qui e non andate oltre):
 | |
|    *   la ventilazione, in breve, consiste in questo:
 | |
|    *   si totalizzano gli acquisti beni per rivendita da inizio anno
 | |
|    *   e le vendite (solo del periodo) da scorporare (corrispettivi).
 | |
|    *   A questo punto si dovranno "scaglionare" le vendite in 
 | |
|    *   proporzione agli acquisti dello stesso codice IVA. Avremo quindi N
 | |
|    *   importi vendite lordi, la cui somma dovra' sempre dare il totale vendite
 | |
|    *   calcolato inizialmente. Per ogni scaglione ottenuto si procedera' poi
 | |
|    *   allo scorporo dell'iva, in modo che il tutto risulti coerente.
 | |
|    * 
 | |
|    * La nostra implementazione:
 | |
|    *  si calcolino il totale acquisti beni per rivendita da inizio anno e 
 | |
|    *  le vendite da ventilare nel periodo.
 | |
|    *  Si istanzia un TDistrib (vedi la classe) sul totale delle vendite da ripartire,
 | |
|    *  quindi per ogni aliquota acquisti presente si aggiunge una percentuale di ripartizione
 | |
|    *  (acquisti/totale acquisti) al suddetto oggetto. 
 | |
|    *  In tal modo avremo che il totale delle vendite sara' sempre
 | |
|    *  uguale all'originale senza perdite 0 aggiunte di insignificanti lirette.
 | |
|    *  come ultima cosa si estraggono le varie suddivisioni ottenute a da li si procede
 | |
|    *  allo scorporo dell'iva.
 | |
|    *
 | |
|    * La loro implementazione:
 | |
|    *  come nel nostro caso si effettua la totalizzazione degli acquisti e delle vendite
 | |
|    *  a questo punto pero' si introduce il leggendario moltiplicatore, che serve, se non
 | |
|    *  altro a far sbagliare i conti sugli arrotondamenti e sui totali. Tale moltiplicatore
 | |
|    *  e' dato dal rapporto tra totale acquisti e totale vendite. Per ogni aliquota iva 
 | |
|    *  acquisti si effettua percio' la seguente operazione per ottenere il relativo 
 | |
|    *  importo vendite:
 | |
|    *    ROUND(acquisti * moltiplicatore)
 | |
|    *  come si puo' notare, gia' qui si introduce un errore, perche' non e' affatto detto
 | |
|    *  che la somma di tutti gli importi vendite ottenuti dia ancora l'importo complessivo originale.
 | |
|    *  Infine si scorpora l'iva come nel nostro caso.
 | |
|    *
 | |
|    * Ebbene si': il nostro metodo (corretto) e' stato bandito e sostituito con quello
 | |
|    * super-mega-maxi-iper-errato del sistema. Si lascia commentato per memoria futura
 | |
|    * l'implementazione corretta, anche perche' forse in futuro (possibilita' molto remota)
 | |
|    * cambieranno idea.
 | |
|    *
 | |
|    * Sigh!
 | |
|    *
 | |
|   {
 | |
|     _VendItem* vi = (_VendItem*)&_vend_arr[0];
 | |
| 
 | |
|     // 3.2) calcola percentuali di ripartizione e prepara l'affettatrice
 | |
|     TDistrib dst(totven, ROUND_LIRA);
 | |
|     for (j = 0; j < vent_items; j++)
 | |
|     {
 | |
|       _VentItem* vv = (_VentItem*)&_vent_arr[j];
 | |
|       dst.add(vv->_totale/totacq);
 | |
|     }
 | |
|     
 | |
|     // 3.3) affetta l'importo
 | |
|     real tlor = 0.0;
 | |
| 
 | |
|     for (j = 0; j < vent_items; j++)
 | |
|     {
 | |
|       _VentItem* vv = (_VentItem*)&_vent_arr[j];
 | |
|       real imponibile = dst.get();  
 | |
|       real div(1.0); div += vv->_aliquota;   
 | |
|       real totale = imponibile;
 | |
|       real imposta    = imponibile - (imponibile/div);
 | |
|       imposta.ceil(ROUND_LIRA);
 | |
|       imponibile -= imposta;
 | |
|       // quadratura del cerchione
 | |
|       real delta = totale - imponibile - imposta; 
 | |
|       if (!delta.is_zero())
 | |
|         imposta += delta;
 | |
|       
 | |
|       tlor += imponibile + imposta;     
 | |
| 
 | |
|       // quadratura generale (solo per unita', che peraltro
 | |
|       // dovrebbe essere l'unica possibile stronzata
 | |
|       if ((totven - tlor) == real(1.0))
 | |
|         imposta += real(1.0);
 | |
|       
 | |
|       // aggiusto l'IVA vendite nei plm
 | |
|       look_plm(month, codatt);
 | |
|       real ive = _plm->get_real("R0");
 | |
|       ive     += imposta;
 | |
|       _plm->put("R0",ive);
 | |
|       _plm->rewrite();
 | |
|       // .. e il volume di affari nei pam
 | |
|       real vaf = _pam->get_real("R1");
 | |
|       vaf     += imponibile; 
 | |
|       _pam->put("R1", vaf);
 | |
|       _pam->rewrite();
 | |
|   
 | |
|       // Aggiorno i luridi pim
 | |
|       bool was = look_pim(month, codatt, vi->_codreg, "0", vv->_codiva, vi->_tipodet, TRUE);
 | |
|         
 | |
|       imponibile += _pim->get_real("R0");
 | |
|       imposta    += _pim->get_real("R1");
 | |
|       _pim->put("R0", imponibile);
 | |
|       _pim->put("R1", imposta);            
 | |
|       _pim->put("S4", vv->_other);
 | |
|       // segnale per comodita' in stampa prospetto
 | |
|       _pim->put("B1","X");
 | |
|       // se e' nuovo, il segnale per usare l'importo nel calcolo del rimborso 
 | |
|       // viene amorosamente messo a quanto il codice IVA prevede
 | |
|       if (!was)
 | |
|       {  
 | |
|         look_iva(vv->_codiva);
 | |
|         _pim->put("I1", (long)vendita);
 | |
|         if (!_iva->get_bool("B4")) _pim->put("B3", "X");
 | |
|       }
 | |
|       _pim->rewrite();
 | |
|     }
 | |
|   }   
 | |
|   */
 | |
|    
 | |
|   // Di seguito l'implementazione del sistema (errata come spiegato sopra).
 | |
|   
 | |
|   real moltiplicatore =  totven / totacq;
 | |
|   moltiplicatore.round(9);
 | |
|   real  imponibile, imposta;
 | |
|   _VendItem* vi = (_VendItem*)&_vend_arr[0];
 | |
| 
 | |
|   for (j = 0; j < vent_items; j++)
 | |
|   {
 | |
|     _VentItem* vv = (_VentItem*)&_vent_arr[j];
 | |
|     imponibile = vv->_totale * moltiplicatore; // Importo lordo vendite
 | |
|     round_alla_lira(imponibile);
 | |
|     lordo2netto(imponibile, imposta, vv->_aliquota); // Scorpora l'iva
 | |
|     // aggiusto l'IVA vendite nei plm
 | |
|     look_plm(month, codatt);
 | |
|     real ive = _plm->get_real("R0");
 | |
|     ive     += imposta;
 | |
|     _plm->put("R0",ive);
 | |
|     _plm->rewrite();
 | |
|     // .. e il volume di affari nei pam
 | |
|     real vaf = _pam->get_real("R1");
 | |
|     vaf     += imponibile; 
 | |
|     _pam->put("R1", vaf);
 | |
|     _pam->rewrite();
 | |
| 
 | |
|     // Aggiorna il totale IVA periodica CD1_1
 | |
|     if (month == 13 && look_iva(vv->_codiva))
 | |
|     {
 | |
|       if (_iva->get("S10").not_empty()) // Solo CD1_1 ha senso coi corrispettivi
 | |
|       {
 | |
|         real cd1_1 = _pum->get_real("R14");
 | |
|         cd1_1 += imponibile;
 | |
|         _pum->put("R14", cd1_1);
 | |
|         _pum->rewrite();
 | |
|       }
 | |
|     }
 | |
|   
 | |
|     // Aggiorno i luridi pim
 | |
|     bool was = look_pim(month, codatt, vi->_codreg, "0", vv->_codiva, vi->_tipodet, TRUE);
 | |
|         
 | |
|     imponibile += _pim->get_real("R0");
 | |
|     imposta    += _pim->get_real("R1");
 | |
|     _pim->put("R0", imponibile);
 | |
|     _pim->put("R1", imposta);            
 | |
|     _pim->put("S4", vv->_other);
 | |
|     // segnale per comodita' in stampa prospetto
 | |
|     _pim->put("B1","X");
 | |
|     // se e' nuovo, il segnale per usare l'importo nel calcolo del rimborso 
 | |
|     // viene amorosamente messo a quanto il codice IVA prevede
 | |
|     if (!was)
 | |
|     {  
 | |
|       look_iva(vv->_codiva);
 | |
|       _pim->put("I1", (long)vendita);
 | |
|       if (!_iva->get_bool("B4")) _pim->put("B3", "X");
 | |
|     }
 | |
|     _pim->rewrite();
 | |
|   }
 | |
|   
 | |
|   // memorizza totali per il prospettino di m.
 | |
|   look_plm(month, codatt);
 | |
| 
 | |
|   // PAM e PUM
 | |
|   _pam->put("R2",totacq);
 | |
|   _pam->put("R3",totven);
 | |
|   _pam->rewrite();
 | |
| }                               
 | |
| 
 | |
| // ricalcolo iva dovuta agenzie viaggio
 | |
| void TLiquidazione_app::recalc_viaggio(int month, const char* codatt)
 | |
| {
 | |
|   if (!_isviaggio)
 | |
|     return;
 | |
|   
 | |
|   real c_CEE, c_mCEE, c_fCEE, a_CEE, a_mCEE, a_fCEE, a_mfCEE;
 | |
|   
 | |
|   for (int mese = month == 13 ? 13 : 1; mese <= month; mese++)
 | |
|   {
 | |
|     if (!is_month_ok(mese,month) || !look_plm(mese, codatt)) 
 | |
|       continue;                 
 | |
| 
 | |
|     c_CEE   += _plm->get_real("R5");  // corrispettivi CEE
 | |
|     c_mCEE  += _plm->get_real("R9");  // corrispettivi misti CEE 
 | |
|     c_fCEE  += _plm->get_real("R6");  // corrispettivi fuori CEE
 | |
|     a_CEE   += _plm->get_real("R7");  // acquisti CEE
 | |
|     a_mCEE  += _plm->get_real("R10"); // acquisti misti parte CEE
 | |
|     a_fCEE  += _plm->get_real("R8");  // acquisti fuori CEE
 | |
|     a_mfCEE += _plm->get_real("R11"); // acquisti misti parte fuori CEE
 | |
|   }
 | |
|   if (month == 13) // Arrotondamento 13a liquidazione
 | |
|   {
 | |
|     round_imposta(c_CEE);
 | |
|     round_imposta(c_mCEE);
 | |
|     round_imposta(c_fCEE);
 | |
|     round_imposta(a_CEE);
 | |
|     round_imposta(a_mCEE);
 | |
|     round_imposta(a_fCEE);
 | |
|     round_imposta(a_mfCEE);
 | |
|   }
 | |
|   
 | |
|   // calcolo debito mensile da aggiornare su tabella POM
 | |
|   real perc_r = a_mCEE.is_zero() ? ZERO : (a_mCEE * CENTO)/(a_mCEE + a_mfCEE); perc_r.round(2);
 | |
|   real ivm = (c_mCEE * perc_r)/CENTO; 
 | |
|   if (month == 13)
 | |
|     round_imposta(ivm);
 | |
|   else
 | |
|     round_alla_lira(ivm, TRUE);
 | |
|   
 | |
|   const real tc = c_CEE + ivm;
 | |
|   const real ta = a_CEE + a_mCEE;
 | |
|   const real bi = tc - ta - credito_costo_prec(month);
 | |
|   
 | |
|   real deb_mens;
 | |
|   
 | |
|   if (bi > ZERO)
 | |
|   {
 | |
|     const real alivia = aliquota_agvia();
 | |
|     deb_mens = bi * alivia / (CENTO + alivia);
 | |
|     if (month == 13)
 | |
|       round_imposta(deb_mens);
 | |
|     else
 | |
|       round_alla_lira(deb_mens, TRUE);
 | |
|   }
 | |
|   if (look_plm(month,codatt))
 | |
|   {
 | |
|     _pom->put("R13", deb_mens); // Scrive il valore corretto (mensile/trimestrale/annuale)
 | |
|     _pom->rewrite();
 | |
|   }
 | |
| }
 | |
| 
 | |
| _DescrItem* TLiquidazione_app::recalc_rimborso(int month, const char* codatts,
 | |
|                                                bool stliq)
 | |
| {
 | |
|   // calcola condizioni per il diritto al rimborso infracazzuale
 | |
|   // chiamata soltanto per i trimestri anche se annuale
 | |
|   // aggiornata a normative per anno liq. > 1994
 | |
|   
 | |
|   bool rimborsami = FALSE;
 | |
|   _DescrItem* d = NULL;
 | |
|   TToken_string atts(codatts);
 | |
|   const char* tmpatt; 
 | |
|   TString att;
 | |
|   const bool is_mens = _freqviva == "M";
 | |
| 
 | |
|   // variabili per condizione 1
 | |
|   real es_ni   = 0.0;
 | |
|   real vol_aff = 0.0;
 | |
|   int m;
 | |
|   
 | |
|   if (is_mens) m = month; // per le mensili considera solo il mese attuale
 | |
|   else m = next_trim(month)-2; // per le trimestrali considera i mesi del trimestre
 | |
|   
 | |
|   if (month == 13) m = 13;  // se annuale considera solo il mese 13
 | |
|   
 | |
|   // variabili per condizione 2
 | |
|   real   vtot = 0.0;
 | |
|   real   atot = 0.0;
 | |
|   real   ivav = 0.0;
 | |
|   real   ivaa = 0.0; 
 | |
| 
 | |
|   real alv = 0.0;    // aliquota media vendite
 | |
|   real ala = 0.0;    // aliquota media acquisti  
 | |
| 
 | |
| 
 | |
|   // Condizione 1...
 | |
|   
 | |
|   while ((tmpatt = atts.get()) != NULL)
 | |
|   {
 | |
|     att = tmpatt;
 | |
|     for (; m <= month; m++)
 | |
|     { 
 | |
|       if (!look_plm(m,att)) continue;
 | |
|       
 | |
|       vol_aff   += _pam->get_real("R1");
 | |
|       es_ni     += _pum->get_real("R12");
 | |
|       if (_isagricolo) // questo calcolo per il regime agricolo, riguarda la condizione 2
 | |
|       {
 | |
|         vtot += _pum->get_real("R11");
 | |
|         ivav += _plm->get_real("R6");
 | |
|       }
 | |
|     }                            
 | |
|   }
 | |
| 
 | |
|   // condizione 1:   prc = es_ni / vol_aff
 | |
|   
 | |
|   if (stliq && !vol_aff.is_zero())  
 | |
|   {                 
 | |
|     real prc = es_ni / vol_aff;               
 | |
|     prc.round(2);
 | |
|     if (prc > MIN_PARTE_ESENTE)
 | |
|     {
 | |
|       rimborsami = TRUE;
 | |
|       d = new _DescrItem(RIMBORSO);
 | |
|       d->_f0 = TRUE;
 | |
|       d->_r0 = es_ni;
 | |
|       d->_r1 = vol_aff;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   // Condizione 2...
 | |
|   // scorri i bellissimi progressivi mensili
 | |
|   // Nota: i valori ricavati vanno poi integrati con R3, dove sono memorizzati i corrispettivi da scorporare
 | |
|   // anche qui si accumula per codice iva e si effettua lo scorporo alla fine del ciclo.
 | |
|   TAssoc_array corr_ann;
 | |
|   TString codiva;
 | |
|   _CorrItem cx,*cc;
 | |
|   bool is_key;
 | |
|   
 | |
|   const int year  = atoi((const char*)_year);
 | |
|   for (_pim->first(); !_pim->eof(); _pim->next()) 
 | |
|   {                                   
 | |
|     int ryear = atoi(*_pim_anno);
 | |
|     int rmese = atoi(*_pim_mese);
 | |
|     int tipodet = atoi(*_pim_tipodet);
 | |
|     codiva = *_pim_codiva;
 | |
|     
 | |
|     // B3 significa che e' acq. o vendita valido per rimb. per aliquota                                    
 | |
|     if (!_pim->get_bool("B3")) continue;
 | |
|     
 | |
|     // Se il tipo di codice e' NS non va considerato nella sommatoria del tot. acquisti
 | |
|     look_iva(codiva);
 | |
|     const bool non_sogg = _iva->get("S1") == "NS";
 | |
| 
 | |
|     if (!is_mens) // Trimestrali
 | |
|     {
 | |
|       if (year != ryear  || 
 | |
|           (rmese < (next_trim(month)-2) || rmese > month))
 | |
|         continue; 
 | |
|     } else // Mensili
 | |
|       if (year != ryear || month !=  rmese)
 | |
|         continue; 
 | |
|     
 | |
|     int tipomov = (tiporeg)_pim->get_long("I1");
 | |
|     
 | |
|     const real imp = _pim->get("R0");
 | |
|     const real iva = _pim->get("R1");
 | |
|     
 | |
|     // totali imponibili 
 | |
|     if (tipomov == vendita)
 | |
|     {
 | |
|       if (!_isagricolo)
 | |
|       { // per il regime agricolo il calcolo e' a parte: si reperiscono PUM->R11(Imponibile) e PLM->R6(Imposta)
 | |
|         // vedi sopra...
 | |
|         vtot += imp;     
 | |
|         ivav += iva;
 | |
| 				ivav += _pim->get_real("R29");
 | |
|         is_key =  corr_ann.is_key(codiva);
 | |
|         cx._totale = 0;
 | |
|         _CorrItem& ca = is_key ? (_CorrItem&) corr_ann[codiva] : cx;
 | |
|         ca._totale += _pim->get_real("R3");
 | |
|         if (!is_key) // se non c'e' lo aggiunge
 | |
|         {
 | |
|           ca._aliquota = _iva->get_real("R0")/CENTO; // Se e' nuovo setta l'aliquota
 | |
|           corr_ann.add(codiva,ca);
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|     else 
 | |
|       if (tipodet != 9) // I progressivi con tipo detraibilita' a 9 vanno saltati (MI2209)
 | |
|       {
 | |
|         if (!non_sogg)
 | |
|           atot += imp;
 | |
|         ivaa += iva;  
 | |
|       }
 | |
|   } // end of for
 | |
|   
 | |
|   real impc,ivac; // Aggiunge lo scorporo dei corrispettivi alle vendite calcolate
 | |
|   for (cc = (_CorrItem *)corr_ann.first_item(); cc != NULL; cc = (_CorrItem *)corr_ann.succ_item())
 | |
|   {
 | |
|     lordo2netto(cc->_totale,impc,ivac,cc->_aliquota);
 | |
|     vtot += impc;
 | |
|     ivav += ivac;
 | |
|   }
 | |
| 
 | |
|   // finalmente
 | |
|   alv = ivav.is_zero() ? ZERO : ivav/vtot; alv.round(4);
 | |
|   ala = ivaa.is_zero() ? ZERO : ivaa/atot; ala.round(4);
 | |
| 
 | |
|   // vedi condizioni  
 | |
|   rimborsami = ala > alv;
 | |
| 
 | |
|   if (rimborsami && !alv.is_zero())
 | |
|   { 
 | |
|     // vedi di quanto ala eccede alv; deve essere > 10%
 | |
|     real          ecc = (ala/alv) - real(1.0);
 | |
|     rimborsami = (ecc >= SOGLIA_MAGGIORE_ALIQUOTA_DEL_CAZZO_PER_AVER_DIRITTO_AL_RIMBORSO);
 | |
|   }
 | |
|   
 | |
|   if (stliq && rimborsami)
 | |
|   {
 | |
|     if (d == NULL) d = new _DescrItem(RIMBORSO);
 | |
|     d->_f1 = TRUE;
 | |
|     d->_r2 = vtot; 
 | |
|     d->_r3 = atot; 
 | |
|     d->_r4 = ivav; 
 | |
|     d->_r5 = ivaa; 
 | |
|     d->_r6 = alv * CENTO; 
 | |
|     d->_r7 = ala * CENTO; 
 | |
|   } 
 | |
|   
 | |
|   if (rimborsami && is_month_ok_strict(month))
 | |
|   {
 | |
|     look_lim(month);
 | |
|     _lim->put("B2", "X");
 | |
|     _lim->rewrite();
 | |
|   }
 | |
|   return d;
 | |
| }
 |