From d42478793dbd6444e191fa5935676b1acbffdcb2 Mon Sep 17 00:00:00 2001
From: guy <guy@c028cbd2-c16b-5b4b-a496-9718f37d4682>
Date: Fri, 7 Mar 2014 14:12:45 +0000
Subject: [PATCH] git-svn-id: svn://10.65.10.50/branches/R_10_00@22918
 c028cbd2-c16b-5b4b-a496-9718f37d4682

---
 cg/cg0200a.uml  |   4 +-
 cg/cg1300.cpp   |   9 +-
 cg/cg1301.h     |   1 +
 cg/cg2100.cpp   |  15 +-
 cg/cg2102.h     |   1 +
 cg/cg2105.cpp   |  50 +++++-
 cg/cg3200.cpp   |  22 +--
 cg/cg3400.cpp   |   7 +-
 cg/cg4100.cpp   |  98 ++++++------
 cg/cg4300.cpp   |  31 ++--
 cg/cg4300.h     |  19 ++-
 cg/cg4300a.uml  |   1 +
 cg/cg4301.cpp   | 418 ++++++++++++++++++++++++++++++------------------
 cg/cg4302.cpp   |  84 +++++-----
 cg/cg4303.cpp   |  22 +--
 cg/cg4304.cpp   |  83 +++++-----
 cg/cg4305.cpp   |   2 +-
 cg/cg4400.cpp   |   9 +-
 cg/cg4500.cpp   |  24 +--
 cg/cg4501.cpp   |   8 +-
 cg/cg5700.cpp   |  13 +-
 cg/cgmenu.men   |   3 +-
 cg/cgsaldac.cpp |  18 ++-
 23 files changed, 555 insertions(+), 387 deletions(-)

diff --git a/cg/cg0200a.uml b/cg/cg0200a.uml
index cdff54b89..0de17b435 100755
--- a/cg/cg0200a.uml
+++ b/cg/cg0200a.uml
@@ -1677,7 +1677,7 @@ END
 
 STRING F_CODCAUS 3
 BEGIN
-  PROMPT 41 11 "Causale contabile              "
+  PROMPT 43 11 "Causale contabile            "
   FIELD LF_CFVEN->CODCAUS
   USE LF_CAUSALI
   INPUT CODCAUS F_CODCAUS
@@ -1703,7 +1703,7 @@ END
 
 STRING F_CODCAUSINC 3
 BEGIN
-  PROMPT 41 12 "Causale contabile Anticipi     "
+  PROMPT 43 12 "Causale contabile Anticipi   "
   FIELD LF_CFVEN->CODCAUSINC
   USE LF_CAUSALI
   INPUT CODCAUS F_CODCAUSINC
diff --git a/cg/cg1300.cpp b/cg/cg1300.cpp
index bedd19641..e42085285 100755
--- a/cg/cg1300.cpp
+++ b/cg/cg1300.cpp
@@ -127,12 +127,15 @@ int cg1300(int argc, char* argv[])
       a.run(argc, argv, TR("Aggiornamento tipo conto"));    // cg1302
     }
     break;
-  case 'Z':
-    elimina_zoppi(argc, argv);
-    break;
   case 'M':
     setta_meseliq(argc, argv);
     break;
+  case 'X':
+    xref_check(argc, argv);
+    break;
+  case 'Z':
+    elimina_zoppi(argc, argv);
+    break;
   default:
     break;
   }
diff --git a/cg/cg1301.h b/cg/cg1301.h
index 5fdc24162..1208d016f 100755
--- a/cg/cg1301.h
+++ b/cg/cg1301.h
@@ -3,3 +3,4 @@ void elimina_zoppi(int argc, char* argv[]);
 void setta_meseliq(int argc, char* argv[]);
 void controlla_PIVA(int argc, char* argv[]);
 void agg_iban(int argc, char* argv[]);
+void xref_check(int argc, char* argv[]);
diff --git a/cg/cg2100.cpp b/cg/cg2100.cpp
index ead5d6985..7e28fd41d 100755
--- a/cg/cg2100.cpp
+++ b/cg/cg2100.cpp
@@ -14,6 +14,7 @@
 // Campi su file
 #include <clifo.h>
 #include <cfven.h>
+#include <causali.h>
 #include <rcausali.h>
 
 // Campi su maschera
@@ -734,6 +735,14 @@ bool TPrimanota_application::can_I_write(const TRelation* rel) const
   return TRelation_application::can_I_write(rel);
 }
 
+const char* TPrimanota_application::record_description(const TRelation& rel) const
+{
+  const TString& desc = cache().get(LF_CAUSALI, rel.curr().get(MOV_CODCAUS), CAU_DESCR);
+  if (desc.full())
+    return desc;
+  return TR("Movimento");
+}
+
 // Ritorna il prossimo numero di registrazione libero
 // Certified 100%
 bool TPrimanota_application::get_next_key(TToken_string& tmp)
@@ -2315,11 +2324,11 @@ bool TPrimanota_application::link_intra(const TMask& m, const char* action)
 bool TPrimanota_application::link_anal(const TMask& msk, const char* action)
 {                        
   // Controlla autorizzazione
-  if (!(has_module(CMAUT) || has_module(CAAUT)))
+  if (!(has_module(CMAUT) || has_module(CAAUT) || has_module(CIAUT)))
     return false;
   
   // Controlla flag sulla causale
-  if (!causale().link_analitica())
+  if (!(causale().link_analitica() || causale().link_industriale()))
     return false;
   
   // Controlla l'esistenza del programma dei movimenti analitici
@@ -2387,6 +2396,8 @@ bool TPrimanota_application::link_anal(const TMask& msk, const char* action)
   {
     TConfig config(ini, "Transaction");
     config.set("Action", action);
+    if (has_module(CIAUT) && !has_module(CAAUT))
+      config.set("Mode", "A"); // Salva automaticamente i movimenti di sola industriale
 
     TString4 para; para << LF_MOVANA;
     config.set_paragraph(para);
diff --git a/cg/cg2102.h b/cg/cg2102.h
index 1b8d6ec8e..bafe8612e 100755
--- a/cg/cg2102.h
+++ b/cg/cg2102.h
@@ -191,6 +191,7 @@ protected:                              // TRelation_application
   virtual void write_enable(bool) {}
   virtual bool protected_record(TRectype& rec);
   virtual bool can_I_write(const TRelation* rel) const;
+  virtual const char* record_description(const TRelation& rel) const;
 
 protected:
   void check_saldi();
diff --git a/cg/cg2105.cpp b/cg/cg2105.cpp
index 6acd11c9f..c05b4ff35 100755
--- a/cg/cg2105.cpp
+++ b/cg/cg2105.cpp
@@ -1099,7 +1099,51 @@ bool TGame_mask::partite_notify(TSheet_field& partite, int r, KEY k)
           row.add(sum.get(PART_TIPOMOV), 11);
           tot_lit += soc;
         }
-      }
+
+        // Gli abbuoni e le differenze cambio esistono solo se e' a saldo
+        // NON sarebbe possibile, ma la contabilizzazione potrebbe mettere a saldo i non assegnati
+        if (pag.get_char(PAGSCA_ACCSAL) == 'S' || !pag.get_real(PAGSCA_ABBUONI).is_zero())
+        {
+          const TImporto abb(sez, pag.get_real(PAGSCA_ABBUONI));
+          if (!abb.is_zero())
+          {
+            const char tipo_abb = pag.get_char(PAGSCA_PASSATT);
+            TToken_string& rabb = gm.add_colored_row(sheet, tipo_abb);
+            rabb.add(tipo_abb == 'A' ? TR("Abbuoni attivi") : TR("Abbuoni passivi"), 4);
+            if (in_valuta)
+            {                   
+              TImporto abb_lit = abb;
+              prima_valuta.val2eur(abb_lit);
+              gm.add_importo(rabb, abb_lit);
+              gm.add_importo(rabb, abb, prima_valuta.codice());
+              
+              tot_lit += abb_lit;
+              tot_val += abb;
+            }  
+            else  
+            {
+              gm.add_importo(rabb, abb);
+              rabb.add("");
+              tot_lit += abb;
+            }
+            rabb.add(sum.get(PART_TIPOMOV), 11);
+          }
+/* Continuo a ritenre impossibile ... per ora
+          // Le differenze cambio possono esistere solo in valuta
+          if (in_valuta)  
+          {
+            const TImporto diff(sez, pag.get_real(PAGSCA_DIFFCAM));
+            if (!diff.is_zero())
+            {
+              TToken_string& rdiff = gm.add_colored_row(sheet, 'C');
+              rdiff.add(TR("Differenza cambio"), 4);
+              gm.add_importo(rdiff, diff);
+              rdiff.add(sum.get(PART_TIPOMOV), 11);
+            }
+          }           
+*/
+        }      // Il pagamento era a saldo
+      }        // Fine ciclo non assegnati 
       
       if (lastrow > 0)
       {        
@@ -1148,7 +1192,7 @@ bool TGame_mask::partite_notify(TSheet_field& partite, int r, KEY k)
     return FALSE;                            // Rifiuta l'aggiunta di una riga
   }
   
-  return TRUE;
+  return true;
 }
 
 bool TGame_mask::scadenze_notify(TSheet_field& scadenze, int r, KEY k)
@@ -1159,7 +1203,7 @@ bool TGame_mask::scadenze_notify(TSheet_field& scadenze, int r, KEY k)
     gm.send_key(K_CTRL + 'N', 0, &scadenze); // Simula la pressione del tasto nuovo
     return FALSE;                            // Rifiuta l'aggiunta di una riga
   }
-  return TRUE;
+  return true;
 }
 
 
diff --git a/cg/cg3200.cpp b/cg/cg3200.cpp
index 27691f8a9..0c184e0e9 100755
--- a/cg/cg3200.cpp
+++ b/cg/cg3200.cpp
@@ -92,7 +92,8 @@ class TMastrini_application : public TPrintapp
   real _saldo_movimenti,_saldo_progressivi,_totale_saldo,_riporto_footer_dare,_riporto_footer_avere;
   TString _ragsoc,_indulc,_civulc,_capulc,_com,_prov,_comulc;
   long _codice_ditta,_s_prec;
-  TString _tipodoc,_codcaus,_descrcaus,_descrdociva,_regiva,_g_contr,_c_contr,_s_contr,_descrcontr,_numivd;
+  TString4 _tipodoc,_codcaus,_regiva;
+  TString _descrcaus,_descrdociva,_g_contr,_c_contr,_s_contr,_descrcontr,_numivd;
   char    _sezivd,_lettivd; 
   TString _descrizione,_sezione,_numdoc,_descrizionemov,_numrivd,_descr;
   TString _dataregs, _datadocs;
@@ -1426,7 +1427,7 @@ bool TMastrini_application::preprocess_page(int file, int counter)
 
       // Controlla se saldo e' diverso da 0
 
-      if (((_annoes == _annomsk) || (_annomsk == 0)) && (_totale_saldo != 0.0))
+      if (((_annoes == _annomsk) || (_annomsk == 0)) && (!_totale_saldo.is_zero()))
       { 
         _sezione = rmov.get(RMV_SEZIONE);     
 
@@ -2163,8 +2164,7 @@ void TMastrini_application::stampa_totaliiva()
 // sull'archivio CAUS.dta
 void TMastrini_application::descrizione_causale()
 {
-	const TRectype & caus = cache().get(LF_CAUSALI, _codcaus);
-
+	const TRectype& caus = cache().get(LF_CAUSALI, _codcaus);
   _descrcaus = caus.get(CAU_DESCR);
 }       
 
@@ -2188,14 +2188,14 @@ void TMastrini_application::documenti_iva()
 void TMastrini_application::ricerca_regiva()
 {
   _tabreg->zero();
+  _tipo = 0;
   if (_annoiva > 0 && _regiva.full())
   {
-    TString8 dep;
-    dep.format("%04d%3s", _annoiva, (const char*)_regiva); 
+    TString8 dep; dep.format("%04d%3s", _annoiva, (const char*)_regiva); 
     _tabreg->put("CODTAB", dep);
-    _tabreg->read();
+    if (_tabreg->read() == NOERR)
+      _tipo = _tabreg->get_int("I0");
   }
-  _tipo = _tabreg->get_int("I0");
 }    
 
 bool TMastrini_application::preprocess_print(int file, int counter) 
@@ -2366,7 +2366,7 @@ bool TMastrini_application::set_print(int m)
     }
      
     enable_print_menu();
-    enable_link("Collegamento prima nota: ", 'b');
+    enable_link(TR("Collegamento prima nota: "), 'b');
     
     do 
 	    print();
@@ -3699,10 +3699,10 @@ bool TMastrini_application::user_create()
   _rel->add("CMS", "CODTAB==CODCMS", 1, LF_RMOV, 501);
   _rel->add("FSC", "CODTAB==FASCMS", 1, LF_RMOV, 502);
 
-  _cur1=add_cursor(new TCursor(_rel,"FLSCA=\" \"",2)); 
+  _cur1=add_cursor(new TCursor(_rel, "FLSCA<=\" \"",2)); 
   open_files(LF_TAB, LF_TABCOM,LF_NDITTE, LF_UNLOC, LF_COMUNI, LF_MOV,
 						 LF_CLIFO, LF_CAUSALI, 0);
-  _cur2=add_cursor(new TSorted_cursor(_rel,"DESCR","FLSCA=\" \"",2)); 
+  _cur2=add_cursor(new TSorted_cursor(_rel, "DESCR","FLSCA<=\" \"",2)); 
   
   _tabivd = new TTable (TAB_IVD);
   _tabtpd = new TTable (TAB_TPD);
diff --git a/cg/cg3400.cpp b/cg/cg3400.cpp
index f404463d3..35c1e0edc 100755
--- a/cg/cg3400.cpp
+++ b/cg/cg3400.cpp
@@ -662,8 +662,6 @@ int TStampa_giornale::set_headers()
 {
   int r=1;
   TString riga(_stampa_width);
-  TString16 data_da = _data_da.string();
-  TString16 data_a  = _data_a.string();
 
   if (_stampa_intesta || !_stampa_definitiva) 
     r = stampa_intestazione_ditta();
@@ -673,6 +671,9 @@ int TStampa_giornale::set_headers()
   if (_stampa_definitiva)                                         
     set_header(r++, FR("Codice libro: %s %s "),(const char *) _reg_cod, (const char *) _reg_descr);
   else
+  {
+    const TString16 data_da = _data_da.string();
+    const TString16 data_a  = _data_a.string();
     set_header(r++, FR("Codice libro: %s %s @%dgdalla data: %s alla data: %s @%dgEsercizio: %04d"),
                (const char *) _reg_cod, (const char *) _reg_descr,
                _stampa_width == 132 ? 69 : 135,
@@ -680,6 +681,7 @@ int TStampa_giornale::set_headers()
                _stampa_width == 132 ? 117 : 183,
                _ae
                );
+  }
 
   riga.fill('-'); 
   set_header(r++, riga);
@@ -736,6 +738,7 @@ void TStampa_giornale::preprocess_header()
 	  const int anno = esc[esercizio].inizio().year();  //anno finale dell'esercizio
 	  TString16 numpag, riga;
 	  numpag.format("%d/%d", anno, _pagina_da+pag);
+    //numpag.format("%d/%d", esercizio, _pagina_da+pag); // Mediapadania 2013
     const int tab = _stampa_width - numpag.len();
     riga.format("@%dg%s", tab, (const char*)numpag);
     set_header(2, riga); // Sempre quasi sulla prima riga!
diff --git a/cg/cg4100.cpp b/cg/cg4100.cpp
index 978dcf8a3..94c7b3498 100755
--- a/cg/cg4100.cpp
+++ b/cg/cg4100.cpp
@@ -106,55 +106,63 @@ bool CG4100_App::sort_sal()
   {
     if (!prnd.addstatus(1))
       break;
-    if (_year == rmov.get_int(RMV_ANNOES))
+    if (_year != rmov.get_int(RMV_ANNOES))
+      continue;
+    
+    numreg = rmov.get_long(RMV_NUMREG);
+      
+    gruppo = rmov.get_int(RMV_GRUPPO);
+    conto = rmov.get_int(RMV_CONTO);
+    sottoconto = rmov.get_long(RMV_SOTTOCONTO);                     
+
+    bool scaricato = false;
+    if (numreg != oldnumreg)
     {
-      numreg = rmov.get_long(RMV_NUMREG);
-      
-      gruppo = rmov.get_int(RMV_GRUPPO);
-      conto = rmov.get_int(RMV_CONTO);
-      sottoconto = rmov.get_long(RMV_SOTTOCONTO);                     
-      bool scaricato = FALSE;
-      
-      if (numreg != oldnumreg)
+      if (sal.items() > 0)
       {
-        if (sal.items() > 0)
-        {
-          sal.registra();
-          sal.reset();
-        }
-        oldnumreg = numreg;
-        mov.zero();
-        mov.put(MOV_NUMREG, numreg);
-        mov.read();
-        CHECK(mov.good(),"Archivi movimenti e righe inconsistenti");
-
-        // Tipo saldo normale per default
-        tsal = normale;
-        const TString& codcaus = mov.get(MOV_CODCAUS); 
-        const TRectype& causale = cache().get(LF_CAUSALI, codcaus);
-        if (!causale.empty())
-        {
-          const char ac = causale.get_char(CAU_MOVAP);
-          if (ac == 'A') 
-            tsal = apertura; else 
-          if (ac == 'C') 
-            tsal = chiusura;
-        }  
-
-        scaricato = mov.get_bool(MOV_SCARCON);
-        provvis   = mov.get(MOV_PROVVIS).not_empty();
-        datareg   = mov.get_date(MOV_DATAREG);
-
-        sal.set_anno_es(_year);
-        sal.set_tipo_saldo(tsal);
-        sal.set_movprovv(provvis);
-        sal.set_data_ulmov(datareg);
-        sal.set_num_ulmov(oldnumreg);
+        sal.registra();
+        sal.reset();
       }
-      const char sezione = rmov.get(RMV_SEZIONE)[0];
-      const real importo = rmov.get(RMV_IMPORTO);
+      oldnumreg = numreg;
+      mov.zero();
+      mov.put(MOV_NUMREG, numreg);
+      mov.read();
+      CHECK(mov.good(),"Archivi movimenti e righe inconsistenti");
 
-      sal.aggiorna(gruppo, conto, sottoconto, importo, sezione, TRUE, scaricato);
+      // Tipo saldo normale per default
+      tsal = normale;
+      const TString& codcaus = mov.get(MOV_CODCAUS); 
+      const TRectype& causale = cache().get(LF_CAUSALI, codcaus);
+      if (!causale.empty())
+      {
+        const char ac = causale.get_char(CAU_MOVAP);
+        if (ac == 'A') 
+          tsal = apertura; else 
+        if (ac == 'C') 
+          tsal = chiusura;
+      }  
+
+      scaricato = mov.get_bool(MOV_SCARCON);
+      provvis   = mov.get(MOV_PROVVIS).not_empty();
+      datareg   = mov.get_date(MOV_DATAREG);
+
+      sal.set_anno_es(_year);
+      sal.set_tipo_saldo(tsal);
+      sal.set_movprovv(provvis);
+      sal.set_data_ulmov(datareg);
+      sal.set_num_ulmov(oldnumreg);
+    }
+    const char sezione = rmov.get(RMV_SEZIONE)[0];
+    const real importo = rmov.get(RMV_IMPORTO);
+
+    if (!importo.is_zero())
+    {
+      if (gruppo <= 0 || conto <= 0 || sottoconto <= 0)
+      {
+        warning_box(FR("Conto non valido alla riga %d nel movimento %ld"), rmov.get_int(RMV_NUMRIG), numreg);
+        continue;
+      }
+      sal.aggiorna(gruppo, conto, sottoconto, importo, sezione, true, scaricato);
     }
   }
 
diff --git a/cg/cg4300.cpp b/cg/cg4300.cpp
index 9a51cf567..5fe387dc6 100755
--- a/cg/cg4300.cpp
+++ b/cg/cg4300.cpp
@@ -79,13 +79,12 @@ const real& _ProrataItem::percentuale(const char* year) const
 inline TLiquidazione_app& app()
 { return (TLiquidazione_app&)main_app(); }
 
-TLiquidazione_app::TLiquidazione_app(int m) :
-_ditte(NULL), _selected(16),
-_year(4), _nomiditte(100), _menu(m), _firm_bookmark(-1)
+TLiquidazione_app::TLiquidazione_app(int m) 
+                 : _ditte(NULL), _selected(16), _nomiditte(16), _menu(m), _firm_bookmark(-1)
 { 
   _isprint = _is_interactive = _canprint = true; 
   _isplafond = _printonly = _is_visliq = false; 
-  _isvent = _isagricolo = _isbenzinaro = _isviaggio = _isdiff = false; 
+  _isvent = _isagricolo = _isbenzinaro = _isviaggio = _isdiff = _isdiffacc = false; 
   _row = 1;  _what = all; _comp_acconto = false; 
   _isriepilogo = false; _calcall = false;
   _recalc_only = _recalc_regis = _isfinal = _isregis = false;     
@@ -121,11 +120,7 @@ bool TLiquidazione_app::user_create()
 #endif
 
   
-  TProgind* pnd = NULL;
-  if (_is_interactive) 
-    pnd = new TProgind (3,TR("Preparazione archivi"), false, true); 
-  else 
-    begin_wait();
+  TProgress_monitor pnd(3, TR("Preparazione archivi"), false); 
 
   _nditte = new TRelation(LF_NDITTE);
   _nditte->add(LF_ATTIV,"CODDITTA=CODDITTA");
@@ -179,8 +174,7 @@ bool TLiquidazione_app::user_create()
     is_header   = subj.items() == 8;
     printer().formlen(bodylen); 
   }
-  
-  if(pnd) pnd->addstatus(1);
+  pnd.add_status(1);
   
   _rel = new TRelation(LF_MOV);
   _rel->add(LF_RMOVIVA,"NUMREG=NUMREG");
@@ -309,15 +303,15 @@ bool TLiquidazione_app::user_create()
   
   __firm = TApplication::get_firm();
 
-  if (pnd) pnd->addstatus(1);
+  pnd.add_status(1);
   
   if (_is_interactive)
   { 
-    build_nomiditte(pnd);            
+    build_nomiditte();            
     build_ditte_sheet(all);
   }
 
-  if (pnd) pnd->addstatus(1);
+  pnd.add_status(1);
 
   TApplication::set_firm(__firm);
   set_real_picture(REAL_PICTURE);
@@ -338,7 +332,7 @@ bool TLiquidazione_app::user_create()
     TApplication::set_firm(ditta);
     
     if (!look_lia()) 
-    { end_wait();  return FALSE; }
+    { end_wait();  return false; }
     
     TIva_round ir; // Imposta arrotondamento iva
     ir.set_default_iva_mode(atoi(_year), _month > 12, ditta);
@@ -415,11 +409,8 @@ bool TLiquidazione_app::user_create()
     }    
             
     TApplication::set_firm(__firm);      
-    end_wait();
     user_destroy();
   }                    
-  else 
-    delete pnd; 
   
   return _is_interactive;
 }
@@ -620,7 +611,7 @@ bool TLiquidazione_app::ch_year_handler(TMask_field& f, KEY key)
   return true;
 } 
 
-void TLiquidazione_app::build_nomiditte(TProgind* pnd)
+void TLiquidazione_app::build_nomiditte()
 {                 
   _nomiditte.destroy();
   // ricostruire _nomiditte e rifare build_ditte_sheet
@@ -657,8 +648,6 @@ void TLiquidazione_app::build_nomiditte(TProgind* pnd)
     }
     _nomiditte.add(d);  
   }
-  if (pnd) 
-    pnd->addstatus(1);
 }
 
 bool TLiquidazione_app::to_ditt_handler(TMask_field& f, KEY key)
diff --git a/cg/cg4300.h b/cg/cg4300.h
index c6862014e..ce93fbf2f 100755
--- a/cg/cg4300.h
+++ b/cg/cg4300.h
@@ -448,8 +448,7 @@ protected:
     
   static TLiquidazione_app& app() { return (TLiquidazione_app&)main_app(); }
 
-  bool residuo_da_liquidare(long numreg, int numrig, const TDate& last_pag, 
-                            real& importo_res, real& imponibile_res, real& imposta_res) const;
+  bool residuo_da_liquidare(const TRectype& lastid, real& importo_res, real& imponibile_res, real& imposta_res) const;
   bool print_inc_diff_log(int& rw, int tipoatt, int tipoiva);
   bool print_dainc_diff_log(int& rw, int tipoatt, int tipoiva);
   bool ivadiff_chiusa(const TRectype& mov, const TDate& fine) const;
@@ -467,7 +466,7 @@ public:
   void          build_ditte_sheet(wht);
   void          reset_choices(TMask&);
   void          set_choice_limits(TMask&);
-  void          build_nomiditte(TProgind* pnd = NULL);
+  void          build_nomiditte();
   void          set_year(const char* y) { _year  = y; }
   void          set_month(const int m)  { _month = m; }
   
@@ -555,7 +554,7 @@ public:
   // e' scritto sui parametri liquidazione (LIA)
   // Se si passa 0 (default) vede prende la ditta correntemente in corso di calcolo
   // Analogamente per l'anno
-  bool is_differita(long firm = 0, int year = 0);
+  bool is_acconto_differito(long firm = 0, int year = 0);
   
   // ritorna l'aliquota ordinaria dal
   // codice IVA apposito immesso nei parametri studio
@@ -587,7 +586,7 @@ public:
   void set_firm(_DescrItem& d);
   void set_att(_DescrItem& d);
   void set_pim(_DescrItem& d);
-  void set_pumpam(_DescrItem& d);
+  void set_pumpam(const _DescrItem& d);
 	void set_plm_diff(const _DescrItem& d);
   void set_plm(_DescrItem& d);
   bool set_annual(_DescrItem& d);
@@ -645,18 +644,18 @@ public:
   // da prendere in considerazione per la liquidazione 
   // controllando il regime trimestrale o mensile e 
   // il ricalcolo annuale
-  bool is_month_ok(int x, int mtocalc);
+  bool is_month_ok(int x, int mtocalc) const;
   // is_month_ok_strict controlla che il mese sia OK per la
   // liquidazione, ma ritorna TRUE per le trimestrali solo
   // se il mese cade ESATTAMENTE su un trimestre
-  bool is_month_ok_strict(int x, int month = -1);
+  bool is_month_ok_strict(int x, int month = -1) const;
   // questa e' la piu' semplice, per vedere se devo
   // calcolare il mese fottendomene dell'annuale
-  bool is_month_plain(int x); 
+  bool is_month_plain(int x) const; 
   // questa serve per i progressivi: la data passata va bene
   // se il movimento deve essere considerato in calcolo e riepilogo
   // per la liquidazione di month
-  bool is_date_ok     (const TDate& d, int month, int liqmonth, int year);
+  bool is_date_ok     (const TDate& d, int month, int liqmonth, int year) const;
   bool is_in_liq_period(const TDate& d);
   bool is_first_month (int m);
   int  liq_month(int x);
@@ -689,7 +688,7 @@ public:
   
   // cippiuppiu'  
   TLiquidazione_app(int men);
-  virtual ~TLiquidazione_app() {}
+  
 };
 
 
diff --git a/cg/cg4300a.uml b/cg/cg4300a.uml
index 0039ec975..741faf111 100755
--- a/cg/cg4300a.uml
+++ b/cg/cg4300a.uml
@@ -23,6 +23,7 @@ NUMBER CG43_FLD_ANNO 4
 BEGIN
   PROMPT 28 2 "Anno      "
   HELP "Anno per cui effettuare il calcolo"
+  FLAGS "Z"
   CHECKTYPE REQUIRED
 END
 
diff --git a/cg/cg4301.cpp b/cg/cg4301.cpp
index a91e88d6b..5b6d38c0b 100755
--- a/cg/cg4301.cpp
+++ b/cg/cg4301.cpp
@@ -36,15 +36,19 @@ bool TLiquidazione_app::recalc_all()
   TString msg;
   msg = _printonly ? TR("Stampa") : TR("Calcolo");
   msg << TR(" liquidazione:\npreparazione archivi...");
-  _prind = new TProgind(_selected.ones()*2,  msg, true, true);
+  const int nSel = _selected.ones();
+  if (nSel > 1)
+    _prind = new TProgind(nSel,  msg, true, true);
+  else
+    _prind = new TProgind(1,  msg, false, false);
 
   for (int l = 0; l < _ditte->items(); l++)
   {                           
-    if (_prind->iscancelled())
-      break;
-
     if (_selected[(long)l])
     {                                     
+      if (!_prind->addstatus(1))
+        break;
+
       TToken_string& nomeditta = _ditte->row(l);
       const long codditta = nomeditta.get_long(1);
       const int save_month = _month;
@@ -87,8 +91,7 @@ bool TLiquidazione_app::recalc_all()
       TIva_round ir; 
       ir.set_default_iva_mode(atoi(_year), _isannual, codditta);
       
-      _prind->addstatus(1);              
-      
+     
       /*
        * trimestrali impropriamente selezionate per mesi intermedi
        * provocano il ricalcolo dei progressivi mensili ma non la stampa    
@@ -120,11 +123,7 @@ bool TLiquidazione_app::recalc_all()
        for (m = 1; m <= _month; m++)   // fino a 13 compreso
        {
          if (is_month_plain(m) || _recalc == ever)
-         {               
-           if (_prind->iscancelled()) 
-             break;
            update_firm(m);
-         }
        }
       
       // se ci sono altri mesi dopo l'ultimo calcolato, invalida il 
@@ -140,13 +139,12 @@ bool TLiquidazione_app::recalc_all()
       _month = save_month;      
     }  
   }
-  bool canc = _prind->iscancelled();
-  if (!canc) _prind->addstatus(1);
+  const bool good = _prind->addstatus(1);
 
   TApplication::set_firm(__firm);
   delete _prind;  _prind = NULL;
   
-  return !canc;
+  return good;
 }
 
 bool TLiquidazione_app::update_firm(int month, bool recalc)
@@ -171,9 +169,9 @@ bool TLiquidazione_app::update_firm(int month, bool recalc)
 		}
 	}
 
-  look_lim(liq_month(month), TRUE);
-  _isdiffacc  = is_differita();   // Gestione differimento acconto IVA
-  _isdifferita = _isdiffacc;
+  look_lim(liq_month(month), true);
+  _isdiffacc  = is_acconto_differito();   // Gestione differimento acconto IVA
+  _isdifferita = _isdiffacc;              // Gestione IVA differita con stesso flag!   
 
   look_lia();
   _isintr = _freqviva == "T" && !_lia->get_bool("B3");  // was CNF_DITTA->InTrtr
@@ -358,7 +356,7 @@ bool TLiquidazione_app::update_firm(int month, bool recalc)
 
       // se attivit� mista stampa riepilogo
       if (_mixed && month == _month && riepliq) 
-        describe_att(month,cattivs, TRUE, 'M');
+        describe_att(month,cattivs, true, 'M');
         
       // se sta calcolando l'annuale, scrive tutti i dati calcolati per il trasferimento
       // sui files adibiti a mantenere le informazioni per IVA 11: tab1100a e tab1100b
@@ -506,7 +504,8 @@ void TLiquidazione_app::zero_att(int month, const char* codatt)
   {
     TTable * tab = (TTable*) arr[i];
     CHECK(tab, "Invalid table element");
-    for (tab->first(); !tab->eof(); tab->next()) // Ciclo per i record di tabella
+    tab->zero(); tab->put("CODTAB", _year);
+    for (int err = tab->read(_isgteq); err == NOERR; err = tab->next()) // Ciclo per i record di tabella
     {
       codtab = tab->get("CODTAB");
       m = atoi(codtab.mid(13,2));
@@ -526,7 +525,7 @@ void TLiquidazione_app::zero_att(int month, const char* codatt)
     if (look_plm(month, codatt))
     {
       // zero PLM, POM, PAM, PUM
-      const TString16 codtab(_plm->get("CODTAB"));
+      const TString16 codtab = _plm->get("CODTAB");
       _plm->zero();
       _pom->zero();   
       _pam->zero();   
@@ -560,7 +559,7 @@ void TLiquidazione_app::zero_att(int month, const char* codatt)
   if (_isplafond && month != 13)
     zero_plafond(month,codatt);
 
-  if (month != 13 && !_recalc_regis) // Aggiunto test per evitare azzeramenti in stampa registri 19-06-2013
+  if (!_recalc_regis) // Aggiunto test per evitare azzeramenti in stampa registri 19-06-2013
     zero_diff(month,codatt);
 }
 
@@ -569,7 +568,8 @@ bool TLiquidazione_app::ivadiff_chiusa(const TRectype& mov, const TDate& fine) c
   const long numreg = mov.get_long(MOV_NUMREG);
 
   TString query;
-  query << "USA IVADIFF SELECT BETWEEN(DATAREGP,0," << fine.date2ansi() << ')'
+  query << "USE IVADIFF"
+        << "\nSELECT BETWEEN(DATAREGP,0," << fine.date2ansi() << ")"
         << "\nFROM NUMREG=" << numreg
         << "\nTO NUMREG=" << numreg;
   TISAM_recordset id(query);
@@ -648,19 +648,21 @@ bool TLiquidazione_app::sarebbe_da_pagare(const TRectype& mov, const TDate& fine
   return false;
 }
 
-bool TLiquidazione_app::residuo_da_liquidare(long numreg, int numrig, const TDate& last_pag, 
-                                             real& importo_res, real& imponib_res, real& imposta_res) const
+bool TLiquidazione_app::residuo_da_liquidare(const TRectype& lastid, real& importo_res, real& imponib_res, real& imposta_res) const
 {
+  const long numreg = lastid.get_long(RMI_NUMREG);
+  const int  numrig = lastid.get_int(RMI_NUMRIG);
   CHECKD(numreg > 0 && numrig > 0, "Numero registrazione non valido ", numreg);
+  const long lastpro = lastid.get_long("NUMPRO");
 
   bool found = false;
 
-  if (!found)
+  if (!found) // dummy bracketing test
   {
     TString query;
-    query << "USE " << LF_IVADIFF 
-          << "\nFROM NUMREG=" << numreg << " NUMRIG="  << numrig
-          << "\nTO NUMREG=" << numreg << " NUMRIG="  << numrig;
+    query << "USE IVADIFF" 
+          << "\nFROM NUMREG=" << numreg << " NUMRIG=" << numrig
+          << "\nTO   NUMREG=" << numreg << " NUMRIG=" << numrig;
     TISAM_recordset id(query);
     found = id.items() >= 2;  // riga fattura ed almeno un pagamento o nota di credito
     if (found)
@@ -669,22 +671,13 @@ bool TLiquidazione_app::residuo_da_liquidare(long numreg, int numrig, const TDat
       for (bool ok = id.move_first(); ok; ok = id.move_next())
       {
         const char sez = id.get("SEZIONE").as_string()[0];
-        const tipo_movimento tipomov = (tipo_movimento)id.get(PART_TIPOMOV).as_int();
-        if (tipomov <= tm_nota_credito || !last_pag.ok()) 
+        const long numpro = id.get("NUMPRO").as_int();
+        if (numpro != lastpro) 
         {
           importo += TImporto(sez, id.get(PAGSCA_IMPORTO).as_real());
           imponib += TImporto(sez, id.get(RMI_IMPONIBILE).as_real());
           imposta += TImporto(sez, id.get(RMI_IMPOSTA).as_real());
         }
-        else
-        {
-          const TDate data_pag = id.get("DATAREGP").as_date();
-          if (data_pag >= last_pag)
-            continue;
-          importo += TImporto(sez, id.get(PAGSCA_IMPORTO).as_real());
-          imponib += TImporto(sez, id.get(RMI_IMPONIBILE).as_real());
-          imposta += TImporto(sez, id.get(RMI_IMPOSTA).as_real());
-        }
       }
 
       bool is_good = imponib.valore() > ZERO;
@@ -730,6 +723,70 @@ static bool partita_chiusa_al(const TPartita& p, const TDate& d)
   return c;
 }
 
+static void LOG_IVA_DIFF(const TRectype& id)
+{
+#ifndef NDEBUG
+  static FILE* file[3] = { NULL, NULL, NULL };
+
+  if (id.get_int(PART_TIPOMOV) < 3)
+    return;
+  int nf = 0;
+  if (id.get_int("TIPOIVA") == 2)      // Acquisti
+    nf += 2;
+  else
+    nf += id.get_int("TIPODIFF") == 1; // Differita
+  FILE*& f = file[nf];
+  if (f == NULL)
+  {
+    const char* name = NULL;
+    switch (nf)
+    {
+    case 0: name = "IVA_Ven_xCas.log"; break;
+    case 1: name = "IVA_Ven_Diff.log"; break;
+    case 2: name = "IVA_Acq_xCas.log"; break;
+    default: break;
+    }
+    fopen_s(&f, name, "w");
+    if (f == NULL)
+    {
+      cantwrite_box(name);
+      fopen_s(&f, name, "w");
+    }
+    if (f != NULL)
+      fprintf(f, "NUMREG\tNUMRIG\tNUMPRO\tNUMREGP\tDATAPAG\t \tGen\tFeb\tMar\tApr\tMag\tGiu\tLug\tAgo\tSet\tOtt\tNov\tDic\n");
+  }
+  if (f != NULL)
+  {
+    TToken_string msg(255, '\t');
+    msg.add(id.get(RMI_NUMREG));
+    msg.add(id.get(RMI_NUMRIG));
+    msg.add(id.get("NUMPRO"));
+    msg.add(id.get("NUMREGP"));
+    msg.add(id.get("DATAREGP"));
+    for (int i = id.get_int("MESELIQ"); i > 0; i--)
+      msg.add(" ");
+    msg.add(id.get_real(RMI_IMPOSTA).stringa(0,2));
+    fprintf(f, "%s\n", (const char*)msg);
+  }
+#endif
+}
+
+static bool is_autofattura_articolo_17(const TRectype& mov)
+{
+  // E' giusto prendere il tipo documento dal movimento senza fidarsi della causale? si. 
+  bool af = mov.get(MOV_TIPODOC) == "AF"; // Semplice autofattura (Adesso il tipocr==4 non c'entra piu' un tubo)
+  // Dal 24-02-2014 controlliamo meglio
+  if (af)
+  {
+    TString8 key; 
+    key << mov.get(MOV_TIPO) << '|' << mov.get(MOV_CODCF);
+    const int tp = atoi(cache().get(LF_CLIFO, key, CLI_ALLEG));
+    af = tp == 5 || tp == 9; // cliente estero CEE o non CEE
+  }
+
+  return af;
+}
+
 void TLiquidazione_app::recalc_att(int month, const char* codatt)
 // il codatt passato e' codice att + tipo att ( IN {1|2} )
 // occhecasino. Se _comp_acconto e' TRUE, i movimenti considerati
@@ -844,9 +901,9 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
   // ma con anno documento precedente. Di conseguenza per un corretto calcolo prorata
   // e' necessario distinguire gli importi, appunto, per anno.
   // Questo nuovo calcolo prorata, vale solo per gli anni oltre il 1998.
-  TAssoc_array    acq_iva_anni_prec; 
+  TAssoc_array acq_iva_anni_prec; 
   
-  TTable *arr[4]      = { _pim, _pis, _prm, _prp }; //Tabelle con la stessa struttura
+  TTable *arr[4] = { _pim, _pis, _prm, _prp }; //Tabelle con la stessa struttura
   
   const int year_int    = atoi(_year); // Basta con le atoi()...
 
@@ -896,7 +953,6 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
 		}
 	}
   
-  //TDate f(1, month == 13 ? 1 : month, year_int); 
 	const TDate fromdate(1, month == 13 ? 1 : month, year_int);
   TDate t;
 	TDate f74;
@@ -908,8 +964,6 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
   if (_isviaggio)
     f74 = TDate(1, 1, year_int-1);
   
-//  if (_isdiff)
-//    f = TDate(1, 1, year_int-5);
   if (year_int < 1998 || _recalc_regis) // Vecchia selezione o calcolo progressivi per stampa registri bollati
   {
     t.set_month(month == 13 ? 12 : month);
@@ -950,7 +1004,7 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
 
   *_cur = 0;
   
-  TString16 trueatt(codatt);
+  TString8 trueatt(codatt);
   const int tipatt = trueatt[5] - '0';
   trueatt.cut(5);
 
@@ -977,9 +1031,11 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
       if (tipodoc == "NC")
         tm = tm_nota_credito;
     }
-    
-    if (_mov->get_long(MOV_NUMREG) == 29103)
+
+#ifndef NDEBUG
+    if (_mov->get_long(MOV_NUMREG) == 14281)
       int cazzone = 1;
+#endif
     
     if (_isviaggio)
     {
@@ -994,7 +1050,7 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
     const bool cau_valintra = rcs.get_bool(CAU_VALINTRA);
 
     // Inizio gestione IVA differita
-    const bool iva_diff = _isdiff && _mov->get_bool(MOV_LIQDIFF); 
+    const bool iva_diff = _mov->get_bool(MOV_LIQDIFF); 
     const bool iva_cass = !iva_diff && _mov->get_bool(MOV_IVAXCASSA) && tm > 0;
 		const bool movdiff = (iva_diff || iva_cass) && !_recalc_regis;  // Aggiunto test su ricalcolo da registri 13-12-2012
 		bool dok = is_date_ok(date, month, liqmonth, year_int); 
@@ -1018,11 +1074,26 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
         const TPartita* p = arrpart.first();
    			const int row = p ? p->mov2rig(numreg, 0) : 0;
         game_found = row > 0;
-        if (game_found && !ivadiff_chiusa(_mov->curr(), fine))
+        if (game_found && !ivadiff_chiusa(_mov->curr(), inizio))  // 25-02-2014  sostituito inizio al posto di fine
         {
      		  const TRiga_partite& rp = p->riga(row);
           TImporto pg, nc;
           flag_pg_nc = rp.calcola_pagato_periodo(inizio+1L, fine, pg, nc, &pagscatt);
+          if (pagscatt.items() >= 2)
+          {
+            // Fondo righe generate dallo stesso pagamento
+            for (int p = pagscatt.last(); p > 0; p--)
+            {
+              const TRectype& p0 = (const TRectype&)pagscatt[p];
+              const TRectype& p1 = (const TRectype&)pagscatt[p-1];
+              if (p0.get_int(PAGSCA_NRIGP) == p1.get_int(PAGSCA_NRIGP))
+              {
+                const real imp = p0.get_real(PAGSCA_IMPORTO);
+                ((TRectype&)p1).add(PAGSCA_IMPORTO, imp);
+                pagscatt.destroy(p, true);
+              }
+            }       
+          }
           if (sarebbe_da_pagare(_mov->curr(), fine))
           {
             rp.calcola_pagato_periodo(TDate(0L), fine, pg, nc, NULL);
@@ -1128,11 +1199,21 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
       real nin_imp   = ZERO;         // imponibile non incassati
       real nin_iva   = ZERO;         // imposta non incassati
 
-      look_iva(_rmoviva->get(RMI_CODIVA));
-      const TString4 codiva   = _iva->get("CODTAB");
+      const TString4 codiva = _rmoviva->get(RMI_CODIVA);
+      if (!look_iva(codiva))
+      {
+        error_box(FR("Codice IVA \"%s\" non riconosciuto alla riga %d del movimento %ld."), 
+                  (const char*)codiva, _rmoviva->get_int(RMI_NUMRIG), _rmoviva->get_long(RMI_NUMREG));
+        continue;
+      }
+      else
+      {
+        CHECKS(codiva == _iva->get("CODTAB"), "Codice IVA simile ", (const char*)codiva);
+      }
+
       const TString4 tipoiva  = _iva->get("S1");
-      const TString8 tipoes_v = _iva->get("S2");
-      const TString8 tipoes_a = _iva->get("S9");
+      const TString4 tipoes_v = _iva->get("S2");
+      const TString4 tipoes_a = _iva->get("S9");
       const int tipoagr       = _iva->get_int("S4");
       const int tipoag        = _iva->get_int("S5");
       const int tipopla       = _iva->get_int("S3");
@@ -1144,9 +1225,8 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
       const int tipocr        = atoi(tipocr_s);        
       const bool intra        = _rmoviva->get_bool(RMI_INTRA);
 
-      // autofatture art. 17 per non residenti, con trattamento
-      // speciale in liquidazione annuale
-      const bool autodafe = tipodoc == "AF";  //Adesso il tipocr==4 non c'entra piu' un tubo
+      // autofatture art. 17 per non residenti, con trattamento speciale in liquidazione annuale
+      const bool autodafe = is_autofattura_articolo_17(_mov->curr());
       // vendite art. 40 c. 5/6/8 acq.intra., con trattamento
       // speciale in liquidazione annuale (VA7 in stampa)
       const bool art40 = (tipodoc != "AF" &&  tipoiva != "NS" && !rcs.get_bool("AUTOFATT") && rcs.get_bool("VALINTRA") && !intra);
@@ -1183,6 +1263,7 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
         CHECKD(rmi_tipoatt > 0, "Invalid tipo att ", rmi_tipoatt);
         id.put("TIPOATT", rmi_tipoatt);
         id.put("ANNOLIQ", datareg.year());
+        
         int mesereg = datareg.month();
         if (_freqviva[0] == 'T')
         {
@@ -1190,11 +1271,12 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
           if (resto > 0)
             mesereg += 3-resto;
         }
+
         id.put("MESELIQ", mesereg);
         id.put("TIPOIVA", tipomov == 2 ? 2 : 1);
         id.put("TIPODIFF", iva_cass ? 2 : 1);
         id.put(MOV_DATAREG, _mov->get(MOV_DATADOC));
-        id.put(RMI_CODIVA, _rmoviva->get(RMI_CODIVA));
+        id.put(RMI_CODIVA, codiva);
         id.put("SEZIONE", sezfat);
         
         id.put("IMPORTO", imponibile_orig+imposta_orig);
@@ -1221,22 +1303,33 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
         const real totfat = _mov->get(MOV_TOTDOC);
 
         TLocalisamfile id(LF_IVADIFF);
+        TRectype& idcurr = id.curr();
         FOR_EACH_ARRAY_ITEM(pagscatt, r, obj)
         {
           const TRectype& pagsca = *(TRectype*)obj;
           const int nrigp = pagsca.get_int(PAGSCA_NRIGP);
 
           id.zero();
-          id.put(RMI_NUMREG, _rmoviva->get(RMI_NUMREG));
-          id.put(RMI_NUMRIG, _rmoviva->get(RMI_NUMRIG));
-          id.put(MOV_DATAREG, _mov->get(MOV_DATADOC));
+          idcurr.put(RMI_NUMREG, _rmoviva->get(RMI_NUMREG));
+          idcurr.put(RMI_NUMRIG, _rmoviva->get(RMI_NUMRIG));
           CHECKD(nrigp > 0, "Invalid NRIGP ", nrigp);
-          id.put("NUMPRO", min(nrigp, 999));
+          idcurr.put("NUMPRO", min(nrigp, 999));
+          if (id.read(_isequal, _lock) != NOERR)
+          {
+            id.zero();
+            idcurr.put(RMI_NUMREG, _rmoviva->get(RMI_NUMREG));
+            idcurr.put(RMI_NUMRIG, _rmoviva->get(RMI_NUMRIG));
+            idcurr.put("NUMPRO", min(nrigp, 999));
+            if (id.write() != NOERR)
+              error_box("Errore %d in creazione record IVADIFF", id.status());
+          }
+
+          idcurr.put(MOV_DATAREG, _mov->get(MOV_DATADOC));
           CHECKD(rmi_tipoatt > 0, "Invalid tipo att ", rmi_tipoatt);
-          id.put("TIPOATT", rmi_tipoatt);
-          id.put("TIPOIVA", tipomov == 2 ? 2 : 1);
-          id.put("TIPODIFF", iva_cass ? 2 : 1);
-          id.put(RMI_CODIVA, _rmoviva->get(RMI_CODIVA));
+          idcurr.put("TIPOATT", rmi_tipoatt);
+          idcurr.put("TIPOIVA", tipomov == 2 ? 2 : 1);
+          idcurr.put("TIPODIFF", iva_cass ? 2 : 1);
+          idcurr.put(RMI_CODIVA, codiva);
 
           TImporto pagtmp;
           bool ultimo = false;
@@ -1246,41 +1339,31 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
             const TPartita& p = arrpart.partita(pagsca);
             const TRiga_partite& rp = p.riga(nrigp);
             tipomov_pag = rp.tipo();
-            id.put(PART_TIPOMOV, tipomov_pag);
-            id.put("NUMREGP", rp.get(PART_NREG));
-            id.put("NUMRIGP", rp.get(PART_NUMRIG));
+            idcurr.put(PART_TIPOMOV, tipomov_pag);
+            idcurr.put("NUMREGP", rp.get(PART_NREG));
+            idcurr.put("NUMRIGP", rp.get(PART_NUMRIG));
             TDate d = rp.get(PART_DATAPAG);
             if (!d.ok())
               d = rp.get(PART_DATADOC);
             if (!d.ok())
               d = rp.get(PART_DATAREG);
-            id.put("DATAREGP", d);
+            idcurr.put("DATAREGP", d);
             pagtmp = p.importo_pagsca(pagsca);
-            if (tipomov_pag >= tm_pagamento && partita_chiusa_al(p, fine))
-            {
-              ultimo = true;
-              for (int r = p.last(); r > nrigp; r = p.pred(r))
-              {
-                if (p.riga(r).tipo() >= tm_pagamento)
-                {
-                  ultimo = false;
-                  break;
-                }
-              }
-            }
+            pagtmp.normalize(sezpag);
+            ultimo = (r == pagscatt.last()) && partita_chiusa_al(p, fine);
           }
           else
           {
             // Falso record generato da datainc
-            id.put(PART_TIPOMOV, tipomov_pag);
-            id.put("NUMREGP", _mov->get(MOV_NUMREG));
-            id.put("NUMRIGP", nrigp);         
-            id.put("DATAREGP", _mov->get(MOV_DATAINC));         
+            idcurr.put(PART_TIPOMOV, tipomov_pag);
+            idcurr.put("NUMREGP", _mov->get(MOV_NUMREG));
+            idcurr.put("NUMRIGP", nrigp);         
+            idcurr.put("DATAREGP", _mov->get(MOV_DATAINC));         
             pagtmp.set(sezpag, pagsca.get_real(PAGSCA_IMPORTO));
             ultimo = true;
           }
 
-          id.put("ANNOLIQ", year_int);
+          idcurr.put("ANNOLIQ", year_int);
           int meseliq = id.get_date("DATAREGP").month();
           if (_freqviva[0] == 'T')
           {
@@ -1288,47 +1371,49 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
             if (resto > 0)
               meseliq += 3-resto;
           }
-          id.put("MESELIQ", meseliq);
+          idcurr.put("MESELIQ", meseliq);
 
-          id.put("SEZIONE", pagtmp.sezione());
+          if (pagtmp.sezione() != sezpag)
+            int cazzone = 2;
+          idcurr.put("SEZIONE", pagtmp.sezione());
           if (ultimo)
           {
             real importo, imponibile, imposta;
-            residuo_da_liquidare(id.get_long(RMI_NUMREG), id.get_int(RMI_NUMRIG), id.get_date("DATAREGP"),
-                                 importo, imponibile, imposta);
-            id.put(PAGSCA_IMPORTO, importo);
-            id.put(RMI_IMPONIBILE, imponibile);
-            id.put(RMI_IMPOSTA, imposta);
-
-            incdiff_imp += imponibile;
-            incdiff_iva += imposta;
+            residuo_da_liquidare(idcurr, importo, imponibile, imposta);
+            idcurr.put("IMPORTO",      importo);
+            idcurr.put(RMI_IMPONIBILE, imponibile);
+            idcurr.put(RMI_IMPOSTA,    imposta);
+            if (tipomov_pag >= tm_pagamento)  // 5-3-2014  incremento incdiff_imp solo coi pagamenti! Coerentemente con !ultimo
+            {
+              incdiff_imp += imponibile;
+              incdiff_iva += imposta;
+            }
           }
           else
           {
-            // Spostato in basso ricalcolo importo ragguagliato  24/09/2013
-            // id.put(PAGSCA_IMPORTO, pagtmp.valore());
-            // pagtmp.normalize(sezpag);
-
             const real perc = pagtmp.valore() / totfat;
+
             real val_imp = imponibile_orig * perc;
-					  round_imposta(val_imp);
-            id.put(RMI_IMPONIBILE, val_imp);
-
-            if (tipomov_pag >= tm_pagamento)
-              incdiff_imp += val_imp;
-
+					  round_al_centesimo(val_imp);
+            
             real val_iva = imposta_orig * perc;
-  				  round_imposta(val_iva);
-            id.put(RMI_IMPOSTA, val_iva);
+  				  round_al_centesimo(val_iva);
+     
+            idcurr.put("IMPORTO",      val_imp + val_iva);
+            idcurr.put(RMI_IMPONIBILE, val_imp);
+            idcurr.put(RMI_IMPOSTA,    val_iva);
+            
             if (tipomov_pag >= tm_pagamento)
+            {
+              incdiff_imp += val_imp;
               incdiff_iva += val_iva;
-
-            id.put(PAGSCA_IMPORTO, val_imp + val_iva); // Ricalcolo importo
+            }
           }
 
-          int err = id.write_rewrite();
+          int err = id.rewrite();
           if (err != NOERR)
             error_box("Errore %d in aggiornamento file IVADIFF", err);
+          LOG_IVA_DIFF(id.curr());
 
           const long numreg = _rmoviva->get_long(RMI_NUMREG);
           if (numreg > 0)  // Chiude o riapre la partita
@@ -1347,19 +1432,25 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
             }
           }
         }
-  	  	diff_imp = imponibile_orig;
-	  		diff_iva = imposta_orig;
+        if (is_date_ok(date, month, liqmonth, year_int)) // 5-3-2014
+        {
+  	  	  diff_imp = imponibile_orig;
+	  		  diff_iva = imposta_orig;
+        }
 			}
 			else
       {
 				if (movdiff)
 				{
-					diff_imp = imponibile_orig;
-					diff_iva = imposta_orig;
+          if (is_date_ok(date, month, liqmonth, year_int)) // 5-3-2014
+          {
+					  diff_imp = imponibile_orig;
+					  diff_iva = imposta_orig;
+          }
 				}
 				else
 					analizza_IVA(imponibile_orig, imposta_orig, percind, corrisp, false, codiva,
-												impon_det, impos_det, impon_ind, impos_ind);
+											 impon_det, impos_det, impon_ind, impos_ind);
       }
 
 			for (int is_detraibile = 0; is_detraibile < 2; is_detraibile++)
@@ -1433,6 +1524,11 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
           const TString& iva_vpn = _iva->get(tipomov == vendita ? "S10" : "S11");
           if (iva_vpn.full())
           {
+            if (_mov->get(MOV_ANNOIVA) != _year)
+            {
+              int cazzone = 2;
+            }
+            else
             switch (tipomov)
             {
               case vendita: // CD1 - 1 2 3 4
@@ -1442,29 +1538,23 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
                   bool is_valid = tipodoc != "AF" && sosp_imp != normale && sosp_imp != liquidazione;
 								  if (is_valid)
 								  {
-                    if (movdiff) // 21-02-2013 Comprendere IVA differita registrata nell'anno! (imponibile=0)
-                    {
-                      if (date.year() == year_int)
-                        cessioni_cd1_1 += imponibile_orig;   
-                    }
-                    else
-									    cessioni_cd1_1 += imponibile;
+  							    cessioni_cd1_1 += imponibile_orig;
 										if (iva_vpn.starts_with("CD1"))
 										{
 											if (tipocr == 4)
-												cessioni_cd1_5 += imponibile;
+												cessioni_cd1_5 += imponibile_orig;
 										}
 									  if (!cau_intra)
 									  {
 										  if (iva_vpn == "CD12")
-											  cessioni_cd1_2 += imponibile; else
+											  cessioni_cd1_2 += imponibile_orig; else
 										  if (iva_vpn == "CD13")
-											  cessioni_cd1_3 += imponibile;
+											  cessioni_cd1_3 += imponibile_orig;
 									  }
 									  else
 									  {
 										  if (iva_vpn == "CD14")
-											  cessioni_cd1_4 += imponibile;
+											  cessioni_cd1_4 += imponibile_orig;
 									  }
 								  }
 
@@ -1472,34 +1562,34 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
               break;
               case acquisto: // CD2 - 1 2 3 4 
 							  {		
-								  acquisti_cd2_1 += imponibile;
+								  acquisti_cd2_1 += imponibile_orig;
 									if (iva_vpn.starts_with("CD2"))
 									{
 										if (tipocr == 2 || tipocr == 3 || tipocr == 8)
-											acquisti_cd2_5 += imponibile;
+											acquisti_cd2_5 += imponibile_orig;
 									}
 								  if (!cau_intra)
 								  {
 										if (iva_vpn == "CD22")
-											acquisti_cd2_2 += imponibile;
+											acquisti_cd2_2 += imponibile_orig;
 										else
 											if (iva_vpn == "CD23")
-												acquisti_cd2_3 += imponibile;
+												acquisti_cd2_3 += imponibile_orig;
 								  }
 								  else
 								  {
 									  if (iva_vpn == "CD24")
-										  acquisti_cd2_4 += imponibile;
+										  acquisti_cd2_4 += imponibile_orig;
 								  }
 								  if (iva_vpn == "CD31")
 								  {
-									  oroargento_cd3_1 += imponibile;
-									  oroargento_cd3_2 += imposta;
+									  oroargento_cd3_1 += imponibile_orig;
+									  oroargento_cd3_2 += imposta_orig;
 								  }
 								  if (iva_vpn == "CD33")
 								  {
-									  rottami_cd3_3 += imponibile;
-									  rottami_cd3_4 += imposta;
+									  rottami_cd3_3 += imponibile_orig;
+									  rottami_cd3_4 += imposta_orig;
 								  }
 							  }
               break;
@@ -1662,7 +1752,7 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
           }
 
           // operazioni esenti
-          if (tipoiva == "ES")
+          if (tipoiva == "ES" && !imponibile.is_zero())
           {
             if (tipomov == vendita)
             {
@@ -1777,10 +1867,10 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
                           if (look_iva(_pcon_2_r->get(PCN_IVACOMP)))
                             ivacomp = _iva->get("CODTAB");  // Ecco il codice IVA di compensazione
                         }
-                    look_pia(month, codatt, codiva, ivacomp, TRUE); // Crea il record in tabella se non esiste
-                    real pia_imp = _pia->get_real("R0") + agr_imp; // Aggiorna...
+                    look_pia(month, codatt, codiva, ivacomp, true); // Crea il record in tabella se non esiste
+                    real pia_imp = _pia->get_real("R0") + agr_imp;  // Aggiorna...
                     _pia->put("R0", pia_imp);
-                    _pia->put("B0", TRUE); // Seguo l'esempio dei PIM per il ricalcolo acquisti alla fine del ciclo
+                    _pia->put("B0", true); // Seguo l'esempio dei PIM per il ricalcolo acquisti alla fine del ciclo
                     _pia->rewrite(); // infine scrive
                   }
                 }
@@ -1988,7 +2078,8 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
               lor += imponibile + imposta;   
               lorcor += imponibile+imposta;
               real tot = imponibile+imposta;   
-              if (liq) add_corrisp(month, reg, tot, perciva, tipodet, codiva, codatt);
+              if (liq) 
+                add_corrisp(month, reg, tot, perciva, tipodet, codiva, codatt);
             }
           } 
           else if (tipodoc == "FF")   // CM500415: prima non c'era questo if
@@ -2213,9 +2304,20 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
 					{
 						if (tipomov == vendita)
 						{
-							// fatture vendita a liquidazione differita                     
+#ifndef NDEBUG
+            if (month == 7 && reg == "VEN" && !incdiff_iva.is_zero())
+            {
+              const real oldv = _pim->get("R29");
+              const real newv = oldv + incdiff_iva;
+              __trace("%s %s\t%s\t%s\t%7ld\t%s\t+\t%s\t=\t%s", tab->name(), (const char*)tab->curr().get("CODTAB"), (const char*)reg, (const char*)tipocr_s,
+                      _mov->get_long(MOV_NUMREG), oldv.stringa(12, 2), incdiff_iva.stringa(12, 2), newv.stringa(12, 2));
+            }
+#endif
+
+              
+              // fatture vendita a liquidazione differita                     
 							tab->curr().add("R26", diff_imp);       
-							tab->curr().add("R27", diff_iva);       
+							tab->curr().add("R27", diff_iva);
 							tab->curr().add("R28", incdiff_imp);       
 							tab->curr().add("R29", incdiff_iva);     
 							fdiff_imp += diff_imp;
@@ -2237,7 +2339,7 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
 							tab->curr().add("R33", incdiff_iva);     
 							fdiff_imp_acq += diff_imp;
 							fdiff_iva_acq += diff_iva;
-							fdiffinc_imp_acq += incdiff_imp;
+							fdiffinc_imp_acq += incdiff_imp;         
 							fdiffinc_iva_acq += incdiff_iva;
 							if (_mov->get_int(MOV_ANNOIVA) < year_int)
 							{
@@ -2541,8 +2643,8 @@ void TLiquidazione_app::iva11_set_arr_phase_1(const TString& codatt)
   const TString4 codiva  = _iva->get("CODTAB");
   const TString4 tipoiva = _iva->get("S1");
   const real  ali          = _iva->get_real("R0");
-  const TString16 tipoes_v = _iva->get("S2");
-  const TString16 tipoes_a = _iva->get("S9");
+  const TString4 tipoes_v  = _iva->get("S2");
+  const TString4 tipoes_a  = _iva->get("S9");
   const int tipoagr        = _iva->get_int("S4");
   const TRectype& rcs      = _cur->curr(LF_CAUSALI);
   const bool autofattura   = rcs.get_bool("AUTOFATT");
@@ -2748,7 +2850,7 @@ void TLiquidazione_app::iva11_set_arr_phase_1(const TString& codatt)
   
     if (intracom || !valintra)
     {
-      if (tipoes_v.not_empty()) // Inutile fare troppi controlli...
+      if (tipoes_v.full()) // Inutile fare troppi controlli...
       {
         if (tipoes_v == "24")
           array.add(imponibile,TAB11_EC106);
@@ -2952,7 +3054,7 @@ void TLiquidazione_app::iva11_set_arr_phase_2(const TString& codatt)
             break;
           case 1:
           case 5:
-              array.add(imp,TAB11_IMA03);
+            array.add(imp,TAB11_IMA03);
             break;
           default:
             break;
@@ -3224,6 +3326,7 @@ void TLiquidazione_app::write_liq(int month, const char* codatts)
   const bool new_age_2000 = (year_int >= 2000) && (_lia->get("S9") == "NV");
 
   real risultato    = ZERO;
+
   real detrazioni   = ZERO;
   real versamenti   = ZERO;
   real vers_int     = ZERO;
@@ -3352,7 +3455,8 @@ void TLiquidazione_app::write_liq(int month, const char* codatts)
 
           iva_vend  += vend;
           iva_acq   += acq;
-					risultato += (vend - acq + diffinc_iva - diffinc_iva_acq);
+          risultato += (vend - acq + diffinc_iva - diffinc_iva_acq);
+
           res_debt  += vend + diffinc_iva;
           res_cred  += acq;
 					fdiff_imp += diff_imp;
@@ -3548,12 +3652,10 @@ void TLiquidazione_app::write_liq(int month, const char* codatts)
     }    
     if (attivita_agricola)
     {
-      real perc; // percentuale di deducibilita'
-      real iva_ded; // iva deducibile
-      
-      perc = imp_agr2.is_zero() ? ZERO : imp_agr2 / (imp_agr1 + imp_agr2);
+      // percentuale di deducibilita'
+      real perc = imp_agr2.is_zero() ? ZERO : imp_agr2 / (imp_agr1 + imp_agr2);
       perc.round(2);
-      iva_ded = acq_noCEE * perc;
+      real iva_ded = acq_noCEE * perc; // iva deducibile
       round_al_centesimo(iva_ded);
       iva_acq   += iva_ded;
       res_debt  += iva_vend;
@@ -3606,7 +3708,8 @@ void TLiquidazione_app::write_liq(int month, const char* codatts)
         // Calcola credito utilizzabile da riportare nell'anno successivo
         credito_utilizzabile = credito_utilizzabile_inizio_anno;
         credito_utilizzabile -= credito_utilizzato(13, TRUE, TRUE); 
-        if (credito_utilizzabile < ZERO) credito_utilizzabile = ZERO;
+        if (credito_utilizzabile < ZERO) 
+          credito_utilizzabile = ZERO;
       }
     }
     else
@@ -3717,7 +3820,7 @@ void TLiquidazione_app::write_liq(int month, const char* codatts)
         }
         _year = yr;         
 
-        // Aggiusta DiffIncIVAAcq sul record della 13ma che non poteva ancora sapere il proata definitivo!
+        // Aggiusta DiffIncIVAAcq sul record della 13ma che non poteva ancora sapere il prorata definitivo!
         if (!prorata.is_zero() && look_plm(13, att))
         {
           const real old_r33 = _plm->get("R33");
@@ -4065,12 +4168,13 @@ void TLiquidazione_app::recalc_annual(const char* att)
   _CorrItem *cc;
   bool is_key;
   
-  for (_pim->first(); !_pim->eof(); _pim->next())
+  _pim->zero(); _pim->put("CODTAB", _year); // 24-02-2014 Partiamo dall'anno giusto
+  for (int err = _pim->read(_isgteq); err == NOERR; err = _pim->next())
   {           
     if (_year != *_pim_anno || _month != atoi(*_pim_mese)) // In questo caso _month vale sempre 13
       continue;
     
-    int tipocr = atoi(*_pim_tipocr);
+    const int tipocr = atoi(*_pim_tipocr);
     codiva = *_pim_codiva;
     reg    = *_pim_codreg;      
     look_iva(codiva); look_reg(reg);  
diff --git a/cg/cg4302.cpp b/cg/cg4302.cpp
index fa4856a2f..a4141bb2f 100755
--- a/cg/cg4302.cpp
+++ b/cg/cg4302.cpp
@@ -12,21 +12,22 @@
 #include "cglib03.h"
 #include "cg4300.h"
 
-bool TLiquidazione_app::is_trim(int x) 
+#include <attiv.h>
+#include <nditte.h>
+
+bool TLiquidazione_app::is_trim(int x)
   // TRUE se il mese passato e' un trimestre
 { return x == 3 || x == 6 || x == 9 || x == 12; }
 
-bool TLiquidazione_app::is_month_ok_strict(int x, int month)
+bool TLiquidazione_app::is_month_ok_strict(int x, int month) const
   // TRUE se il mese passato e' compatibile con il regime
   // di liquidazione e (opz) non e' maggiore di quello scelto
 { 
   if (month == -1) month = x;
-  return _freqviva == "M" ? 
-    ( x > 0 && x <= month) :
-  ( x <= month && is_trim(x));
+  return _freqviva == "M" ? ( x > 0 && x <= month) : ( x <= month && is_trim(x));
 } 
 
-bool TLiquidazione_app::is_month_plain(int x)
+bool TLiquidazione_app::is_month_plain(int x) const
   // la piu' semplice: vero se mese == _month o se fa parte del
   // trimestre indicato da month
 {                             
@@ -41,7 +42,7 @@ bool TLiquidazione_app::is_month_plain(int x)
   return ok;
 }               
 
-bool TLiquidazione_app::is_month_ok(int x, int mtocalc)
+bool TLiquidazione_app::is_month_ok(int x, int mtocalc) const
   // TRUE se il mese passato e' compatibile con il mese da calcolare
   // rispetto al regime di liquidazione scelto
 { 
@@ -107,36 +108,36 @@ int TLiquidazione_app::previous_month(int m) const
     return m == 3 ? 3 : m - 3;
 }
 
-bool TLiquidazione_app::is_date_ok(const TDate& d, int month, int liqmonth, int year)
+bool TLiquidazione_app::is_date_ok(const TDate& d, int month, int liqmonth, int year) const
   // TRUE se la data passata va considerata nel
   // ricalcolo dei progressivi mensili per il mese e anno
   // selezionati. Vedi cg4301.cpp per maggiori informazioni
   // sul nuovo filtro di selezione movimenti.
 {
-	if (d.year() != year)
-		return false;
+  CHECKD(year > 2000, "Invalid year ", year);
+  const int regmonth = d.month();
+  const int regyear  = d.year();
+
+  // if (regyear() != year) return false;
   if (year < 1998 || _recalc_regis) // Vecchia selezione o calcolo progressivi per stampa registri bollati
   {
-    if (d.month() > month || d.year() != atoi(_year))
+    if (regyear != year || regmonth > month)
 			return false;
 	
     if (month == 13)                                    
-      return d.month() <= month;
+      return true; // was regmonth <= month;
     else   
     {
       if (_freqviva == "M")        // Guy!!!
-        return d.month() == month;
+        return regmonth == month;
       else  
-        return d.month() >= month-2 && d.month() <= month;
+        return regmonth >= month-2 && regmonth <= month;
     }
   }
   else   // Nuova selezione dal 1998 in poi
   {
-    const int regmonth = d.month();
-    const int regyear  = d.year();
-
     if (month <= 12)
-      return (regmonth == month && liqmonth == 0) || (liqmonth == month);
+      return (regyear == year) && ((regmonth == month && liqmonth == 0) || (liqmonth == month));
     else // Annuale, month == 13
       return (regyear == year && liqmonth != 12) || (regyear == year + 1 && liqmonth == 12);
   }
@@ -357,7 +358,7 @@ bool TLiquidazione_app::look_plm(int m, const char* att, bool create)
   (*_plm_anno)   = _year;
 
   const TString16 s = _plm_r->get("CODTAB");
-  bool ok = _plm->read() == NOERR;
+  const bool ok = _plm->read() == NOERR;
   
   if (!ok && create)
   {
@@ -366,9 +367,10 @@ bool TLiquidazione_app::look_plm(int m, const char* att, bool create)
     _plm->write();
   }  
   // crea/posiziona tabelle gemelle PAM, PUM, POM
-  look_pam(m,att,!ok);
-  look_pum(m,att,!ok);    
-  look_pom(m,att,!ok);    
+  look_pam(m, att, !ok);
+  look_pum(m, att, !ok);    
+  look_pom(m, att, !ok);    
+  
   return ok;
 }
 
@@ -454,16 +456,14 @@ bool TLiquidazione_app::look_pom(int m, const char* a, bool create)
 
 bool TLiquidazione_app::look_pam(int m, const char* a, bool create)
 {
-  bool ok = FALSE;
-
   _pam->zero();
   (*_pam_codatt) = format("%6s", a);
   (*_pam_mese)   = format("%02d",m);
   (*_pam_anno)   = _year;
 
-  TString s = _pam->get("CODTAB");
-  _pam->read();
-  ok = _pam->good();
+  const TString16 s = _pam->get("CODTAB");
+  
+  const bool ok = _pam->read() == NOERR;
   
   if (!ok && create)
   {
@@ -480,8 +480,9 @@ bool TLiquidazione_app::look_lim(int m, bool create)
   (*_lim_mese)   = format("%02d",m);
   (*_lim_anno)   = _year;
 
-  const TString s = _lim_r->get("CODTAB");
+  const TString8 s = _lim_r->get("CODTAB");
   const bool ok = _lim->read() == NOERR;
+
   if (!ok && create)
   {
     _lim_r->zero();
@@ -501,7 +502,7 @@ bool TLiquidazione_app::look_lam(int m, bool create)
   (*_lam_mese)   = format("%02d",m);
   (*_lam_anno)   = _year;
 
-  const TString s = _lam_r->get("CODTAB");
+  const TString8 s = _lam_r->get("CODTAB");
   const bool ok = _lam->read() == NOERR;
   if (!ok && create)
   {
@@ -516,7 +517,7 @@ int TLiquidazione_app::count_activities() const
 {
   TRelation rel(LF_ATTIV);
   TRectype& rec = rel.curr();
-  rec.put("CODDITTA", get_firm());
+  rec.put(ATT_CODDITTA, get_firm());
   TCursor cur(&rel, "", 1, &rec, &rec);
   return cur.items();
 }
@@ -788,7 +789,7 @@ real TLiquidazione_app::result_liq(int month)
   // risultato esatto della liquidazione del mese month, <0 a credito
   // > 0 a debito; comprende TUTTI, anche il conguaglio prorata in annuale
 {  
-  real r(0.0);                               
+  real r;                               
   // ulteriori detrazioni, acconti, versamenti,
   // rettifiche, conguagli sono gia' compresi in R0
   if (look_lim(month))
@@ -953,13 +954,14 @@ void TLiquidazione_app::round_al_centesimo(real& d) const
 // e' scritto sui parametri liquidazione (LIA)
 // Se si passa 0 (default) vede prende la ditta correntemente in corso di calcolo
 // Analogamente per l'anno
-bool TLiquidazione_app::is_differita(long firm, int year)
+bool TLiquidazione_app::is_acconto_differito(long firm, int year)
 {
   bool diff = false;
-  const long d = (firm <= 0) ? _nditte->curr().get_long("CODDITTA") : firm;
+  const long d = (firm <= 0) ? _nditte->curr().get_long(NDT_CODDITTA) : firm;
   const int  y = (year <= 0) ? atoi(_year) : year;
   if (look_lia(d, y > 0, y))   // 26/03/2012 aggiunto   ,y)
     diff = _lia->get_bool("B1");
+
   return diff;
 }
 
@@ -987,23 +989,23 @@ bool TLiquidazione_app::look_conc(TString& uffcon, TString& uffiva)
   // c'e', dal comune (primo non vuoto) se non
   
   // Assume _nditte correctly positioned
-  TString ana(_nditte->lfile().get("TIPOA"));
-  TString codana(_nditte->lfile().get("CODANAGR"));
+  const TString4 ana(_nditte->lfile().get("TIPOA"));
+  const TString8 codana(_nditte->lfile().get("CODANAGR"));
   // look anagrafica
 	TString16 key;
-
 	key.format("%s|%s", (const char *) ana, (const char *) codana);
 	  
 	const TRectype & anag = cache().get(LF_ANAG, key);
-  if (anag.empty()) return FALSE;
+  if (anag.empty()) return false;
   
   // becca comune residenza fiscale
-  TString com(anag.get("COMRF")); 
+  TString4 com(anag.get("COMRF")); 
   // se non c'e', residenza
   if (com.empty())
     com = anag.get("COMRES");
   
-  if (com.empty()) return FALSE;
+  if (com.empty()) 
+    return false;
   
   // becca comune
 	key.format("|%s", (const char *) com);
@@ -1021,7 +1023,8 @@ bool TLiquidazione_app::look_conc(TString& uffcon, TString& uffiva)
     if (!ucc.empty())
       uffiva = ucc.get("S0");
   }   
-  return TRUE;
+  
+  return true;
 }
 
 real TLiquidazione_app::credito_utilizzato(int month, bool iva, bool f24) const
@@ -1045,3 +1048,4 @@ real TLiquidazione_app::credito_utilizzato(int month, bool iva, bool f24) const
   
   return credito;
 }
+
diff --git a/cg/cg4303.cpp b/cg/cg4303.cpp
index ec7cf9d6e..dff2a3996 100755
--- a/cg/cg4303.cpp
+++ b/cg/cg4303.cpp
@@ -6,7 +6,9 @@
 
 #include "cg4300.h"
 
-#include "recset.h"
+#include <progind.h>
+#include <recarray.h>
+#include <recset.h>
 
 void TLiquidazione_app::add_plafond(int month, const char* codatt, int type,
                                     const real& howmuch, bool intra)
@@ -631,25 +633,25 @@ void TLiquidazione_app::zero_diff(int month, const char* codatt)
   if (!_nditte->is_first_match(LF_ATTIV))
     return;
 
-  if (month > 12 || (_freqviva == "T" && (month % 3) != 1))
+  if (month > 12 || (_freqviva == "T" && (month % 3) != 1)) 
     return;
-
-#ifdef DBG
-  TString msg; msg.
-  format("Azzeramento IVADIFF mese %s %s attivit� %s", 
-         itom(month), (const char*)_year, codatt);
-  xvtil_statbar_set(msg);
-#endif
-
+  
+  TFast_isamfile fid(LF_IVADIFF);
   TString query; 
   query << "USE IVADIFF KEY 2";
   query << "\nFROM ANNOLIQ=" << _year;
+  // Se calcolo gennaio (o marzo trimestrale) azzero tutto l'anno, altrimenti solo il mese selezionato
   if (month > (_freqviva == "T" ? 3 : 1)) 
     query << " MESELIQ=" << month;
   TISAM_recordset id(query);
+
+  TString msg;
+  msg.format("Azzeramento IVADIFF %s %s attivit� %s", month <= 12 ? itom(month) : "13ma", (const char*)_year, codatt);
+  TProgress_monitor pi(id.items(), msg, false);
   TLocalisamfile& file = id.cursor()->file();
   for (bool ok = id.move_first(); ok; ok = id.move_next())
   {
+    pi.add_status(1);
     file.zero("ANNOLIQ");
     file.zero("MESELIQ");
     file.zero("IMPORTO");
diff --git a/cg/cg4304.cpp b/cg/cg4304.cpp
index 2aca755a5..036df1462 100755
--- a/cg/cg4304.cpp
+++ b/cg/cg4304.cpp
@@ -553,27 +553,30 @@ void TLiquidazione_app::describe_pims(int month, const char* codatt, const bool
   {
     const TString8 att(tmpatt);          
     
-    for (tab->first(); !tab->eof(); tab->next())
+    tab->zero(); tab->put("CODTAB", _year);  // 24-02-2014 partiamo dall'anno giusto!
+    for (int terr = tab->read(_isgteq); terr == NOERR; terr = tab->next())
     {
       _DescrItem* d = NULL;
       // compute
       const TString80 codtab  = tab->get("CODTAB");
       const TString4 anno    = codtab.mid(0,4);
       const TString8 activity= codtab.mid(4,6);
-      const TString4 codreg  = codtab.mid(10,3);
       const int mese = atoi(codtab.mid(13,2));
-      TString4 codiva = codtab.mid(16,4); codiva.trim();
       const int tipodet  = atoi(codtab.mid(20,1));
-      bool ok = look_reg(codreg);
-      ok |= look_iva(codiva);
-      
-      if (!ok) continue;
 
-      tiporeg tipomov  = (tiporeg)_reg->get_long("I0");
-      bool    corrisp  = _reg->get_bool("B0");  
-      TString tipoiva  = _iva->get("S1");
+      const TString4 codreg  = codtab.mid(10,3);
+      if (!look_reg(codreg)) 
+        continue;
+
+      TString4 codiva = codtab.mid(16,4); codiva.trim();
+      if (!look_iva(codiva))
+        continue;
+
+      tiporeg tipomov = (tiporeg)_reg->get_int("I0");
+      bool    corrisp = _reg->get_bool("B0");  
+      const TString4 tipoiva = _iva->get("S1");
       const TString4 other = tab->get("S4");
-      TToken_string    s1(tab->get("S1"),'!'); // Imponibile/iva fatture in ritardo
+      TToken_string s1(tab->get("S1"), '!'); // Imponibile/iva fatture in ritardo
       real rit_imp(s1.get(0));
       real rit_iva(s1.get(1));
 
@@ -593,7 +596,7 @@ void TLiquidazione_app::describe_pims(int month, const char* codatt, const bool
 			diffincimp = tab->get_real("R28");
 			diffinciva = tab->get_real("R29");
 
-      diffimp_acq     = tab->get_real("R30");
+      diffimp_acq    = tab->get_real("R30");
 			diffiva_acq    = tab->get_real("R31");
 			diffincimp_acq = tab->get_real("R32");
 			diffinciva_acq = tab->get_real("R33");
@@ -863,13 +866,12 @@ void TLiquidazione_app::describe_pims(int month, const char* codatt, const bool
 						t31 += diffiva_acq;
 					}
           */
-					if (!diffincimp.is_zero() || !diffinciva.is_zero() ||
+					if (!diffincimp.is_zero()     || !diffinciva.is_zero() ||
 							!diffincimp_acq.is_zero() || !diffinciva_acq.is_zero())
 					{
 						const word id = describe_pis ? PIS_ROW_DI : PIM_ROW_DI;
-						int j;
-
 						d = NULL;
+            int j;
 						for (j = totpos + 1; j < _descr_arr.items(); j++)
 						{
 							_DescrItem* wd = (_DescrItem*)&_descr_arr[j];
@@ -1243,8 +1245,10 @@ void TLiquidazione_app::describe_liq(int month, const char* codatts, _DescrItem*
   d->_r29 = _lim->get_real("R29"); // fdiffinc_iva_ven
   d->_r33 = _lim->get_real("R33"); // fdiffinc_iva_acq
   
-  if (atoi(_year) <= 1997) // Dal 1998 in poi il conguaglio prorata non va stampato, ma conglobato nell'iva acquisti
+  /* Dal 1998 in poi il conguaglio prorata non va stampato, ma conglobato nell'iva acquisti
+  if (atoi(_year) <= 1997)           
     d->_r10 = _lim->get_real("R7"); // totale conguaglio prorata
+  */
 
   TToken_string tt(80); 
   tt.add(_lam->get_real("R0").string());  // IVA Vendite
@@ -1638,9 +1642,8 @@ int TLiquidazione_app::calc_inc_diff(int tipoiva, real& imponibile_diff, real& i
 
   TString limit; limit << "ANNOLIQ=" << _year;
   if (_month < 13) limit << " MESELIQ=" << _month;
-  TString query; // righe pagamento (TIPOMOV>=3) relative a fatture (TOTDOC>0) ed escluse NC!
-  query << "USE IVADIFF KEY 2 SELECT (TIPOMOV>2)&&(MOV.TOTDOC>0)&&(TIPOIVA=" << tipoiva << ')'
-        <<  "\nJOIN MOV INTO NUMREG==NUMREG"
+  TString query; // righe pagamento (TIPOMOV>=3) ed escluse NC!
+  query << "USE IVADIFF KEY 2 SELECT (TIPOMOV>2)&&(TIPOIVA=" << tipoiva << ')'
         << "\nFROM " << limit << "\nTO " << limit;
   
   TISAM_recordset id(query);
@@ -2007,21 +2010,21 @@ void TLiquidazione_app::set_pim(_DescrItem& d)
 
   if (d._flags == PIM_ROW || d._flags == PIS_ROW)
  	{
-		set_row(rw++,"%4s %s@25g%r@41g%r@58g%r@74g%r@91g%r@107g%r",
+		set_row(rw++,"%-4s %s@25g%r@41g%r@58g%r@74g%r@91g%r@107g%r",
 						(const char*)d._s1, (const char*)d._s2,
 						&(d._r0),	&(d._r1),	&(d._r2), &(d._r3), &(d._r4),	&(d._r5));
 	}
 	else
 		if (d._flags == PIM_ROW_D || d._flags == PIS_ROW_D)
 		{
-			set_row(rw++,"%4s %s@25g%r@41g%r@91g%r@107g%r",
+			set_row(rw++,"%-4s %s@25g%r@41g%r@91g%r@107g%r",
 							(const char*)d._s1, (const char*)d._s2,
 							&(d._r26),	&(d._r27), &(d._r30),	&(d._r31));
 		}
 	  else 
 			if (d._flags == PIM_ROW_DI || d._flags == PIS_ROW_DI)
 			{
-				set_row(rw++,"%4s %s@25g%r@41g%r@91g%r@107g%r",
+				set_row(rw++,"%-4s %s@25g%r@41g%r@91g%r@107g%r",
 								(const char*)d._s1, (const char*)d._s2,
 								&(d._r28),	&(d._r29), &(d._r32),	&(d._r33));
 			}
@@ -2112,7 +2115,7 @@ void TLiquidazione_app::set_plm(_DescrItem& d)
 }
 
 
-void TLiquidazione_app::set_pumpam(_DescrItem& d)
+void TLiquidazione_app::set_pumpam(const _DescrItem& d)
 {
   bool printed = FALSE;
   
@@ -2455,9 +2458,10 @@ void TLiquidazione_app::print_importo(int rw, const char* prompt, real imp, bool
   set_row(rw, str, &imp);
 }
 
+// d._flags == THE_END
 void TLiquidazione_app::set_grand_2000(_DescrItem& d, int &rw)
 {
-  const real& risultato  = d._r0;
+  real risultato  = d._r0; // Figuccia lo puo' cambiare
   const real& rimborso   = d._r1;
   const real& cred_cost  = d._r2;
   const real& deb_mens   = d._r3;
@@ -2538,6 +2542,8 @@ void TLiquidazione_app::set_grand_2000(_DescrItem& d, int &rw)
   real iva_deb_cred = iva_vend - iva_acq + diffinc_iva - diffinc_iva_acq + xcasinc_iva - xcasinc_iva_acq;
   if (_is_visliq)
     iva_deb_cred += rett_debt - rett_cred;
+  if (_isannual) 
+    iva_deb_cred.round(0);
     
   print_importo(rw++, TR("IVA a debito o a credito per il periodo"), iva_deb_cred);
   
@@ -2556,7 +2562,7 @@ void TLiquidazione_app::set_grand_2000(_DescrItem& d, int &rw)
   set_row(rw++,FR("%s@11gRimborsi%s@75g%r"),
           _is_visliq ? "$[r]" : "", _is_visliq ? "$[n]" : "", &rimborso);   
   set_row(rw++,FR("@11gCredito IVA compensabile detratto@58g%r"), &credito_utilizzato_iva);          
-  
+
   real cre_deb_per = risultato + crediti_speciali + acc_dec + vers_int;
   if (_month == 13) cre_deb_per += versamenti;
   
@@ -2566,43 +2572,28 @@ void TLiquidazione_app::set_grand_2000(_DescrItem& d, int &rw)
     set_row(rw++,FR("%s@11gCrediti speciali%s@58g%r"), 
             _is_visliq ? "$[r]" : "", _is_visliq ? "$[n]" : "", &crediti_speciali);          
 
-  if (_freqviva == "T" && interessi != ZERO)
+  if (_freqviva == "T" && !interessi.is_zero())
     set_row(rw++,FR("@11gInteressi dovuti per liquidazioni trimestrali %6.2r%%@75g%r"),&interesse, &interessi);
   else
-  {
-    if (_is_visliq)
-      rw++;
-  }
+    if (_is_visliq) rw++;
 
   if (!acc_dec.is_zero())
     set_row(rw++,FR("%s@11gAcconto versato%s@58g%r"), 
             _is_visliq ? "$[r]" : "", _is_visliq ? "$[n]" : "", &acc_dec); 
   else
-  {
-    if (_is_visliq)
-      rw++;
-  }
+    if (_is_visliq) rw++;
 
   // versamenti effettuati
   if (!versamenti.is_zero() && (_month==13 || !_is_visliq))
-  {        
     set_row(rw++,FR("@11gVersamenti effettuati@58g%r"), &versamenti);
-  }
   else
-  {
-    if (_is_visliq)
-      rw++;
-  }
+    if (_is_visliq) rw++;
+
   // versamenti integrativi
   if (!vers_int.is_zero() && !_is_visliq)
-  {        
     set_row(rw++,FR("@11gVersamenti integrativi@58g%r"), &vers_int);
-  }  
   else
-  {
-    if (_is_visliq)
-      rw++;
-  }
+    if (_is_visliq) rw++;
 
   const real iva = risultato + interessi; 
   if (iva > ZERO)        
diff --git a/cg/cg4305.cpp b/cg/cg4305.cpp
index 9bdbd0457..0374f9815 100755
--- a/cg/cg4305.cpp
+++ b/cg/cg4305.cpp
@@ -546,7 +546,7 @@ bool TLiquidazione_app::recalc_acconto(real& inf, real& ina)
   real iva_pro = 0.0;
   real cre_pre = 0.0; 
   real acq_intr = 0.0;
-  const bool isdifferita = is_differita(); // MI3262...
+  const bool isdifferita = is_acconto_differito(); // MI3262...
   int error = FALSE;
   
   TString16 tipo_acc;
diff --git a/cg/cg4400.cpp b/cg/cg4400.cpp
index 33bec5e5a..f926217ff 100755
--- a/cg/cg4400.cpp
+++ b/cg/cg4400.cpp
@@ -1911,7 +1911,7 @@ bool TStampa_registri_app::some_IVAxCassa(int da_mese, int a_mese) const
     return false;
 
   TString query;
-  query = "USE IVADIFF KEY 2 SELECT (TIPOMOV>2)";
+  query = "USE IVADIFF KEY 2 SELECT (TIPOMOV>2)&&(MESELIQ<13)";
   query << "\nFROM ANNOLIQ=" << _data_da.year() << " MESELIQ=" << da_mese;
   query << "\nTO ANNOLIQ=" << _data_a.year() << " MESELIQ=" << a_mese;
   TISAM_recordset id(query);
@@ -1924,8 +1924,7 @@ bool TStampa_registri_app::some_IVAxCassa(int da_mese, int a_mese) const
   else
     msg << "Nel mese di " << itom(da_mese);
   msg << " ci sarebbero " << recs << " incassi/pagamenti per cassa.";
-  xvtil_statbar_set(msg); 
-  xvt_sys_sleep(1000);
+  __trace(msg); 
 #endif
 
   return recs > 0;
@@ -1959,7 +1958,7 @@ bool TStampa_registri_app::print_IVAxCassa(int da_month, int a_month)
   }
 
   TString query;
-  query = "USE IVADIFF SELECT (BETWEEN(DATAREGP,#DAL,#AL))&&(MOV.REG=#REG)&&(TIPOMOV>2)&&(STR(MOV.TOTDOC>0))";
+  query = "USE IVADIFF SELECT (BETWEEN(DATAREGP,#DAL,#AL))&&(MOV.REG=#REG)&&(STR((MESELIQ<13)&&(TIPOMOV>2)&&(MOV.TOTDOC>0)))";
   query << "\nBY DATAREGP DATAREG NUMPRO";
   query << "\nJOIN MOV INTO NUMREG==NUMREG";
   query << "\nJOIN CLIFO TO MOV INTO TIPOCF==TIPO CODCF==CODCF";
@@ -1980,7 +1979,7 @@ bool TStampa_registri_app::print_IVAxCassa(int da_month, int a_month)
   else
     msg << "Nel mese di " << itom(da_month);
   msg << " ci sono effettivamente " << recs << " incassi/pagamenti per cassa.";
-  xvtil_statbar_set(msg); 
+  __trace(msg); 
 #endif
 
   if (recs > 0)
diff --git a/cg/cg4500.cpp b/cg/cg4500.cpp
index fbfb3c4fb..f5d4db8ac 100755
--- a/cg/cg4500.cpp
+++ b/cg/cg4500.cpp
@@ -256,23 +256,15 @@ bool TAp_eser::check_esercizio(const int cod_es, TDate s1, TDate f1)
 
 int cg4500 (int argc, char* argv[])
 {
-  switch (toupper(*argv[2]))
+  if (toupper(*argv[2]) == 'I')
   {
-  case 'C':
-    {
-      TAp_eser a;
-      a.run(argc, argv, TR("Apertura nuovo esercizio"));
-    }
-    break;
-  case 'I':
-    {
-      TAp_iva a;      
-      a.run(argc, argv, TR("Apertura nuovo esercizio IVA"));
-    }
-    break;
-  default:
-		error_box("Uso: cg4 -4 [C,I]");
-    break;
+    TAp_iva a;      
+    a.run(argc, argv, TR("Apertura nuovo esercizio IVA"));
+  }
+  else
+  {
+    TAp_eser a;
+    a.run(argc, argv, TR("Apertura nuovo esercizio"));
   }
   return 0;
 }
diff --git a/cg/cg4501.cpp b/cg/cg4501.cpp
index 5ec6f8bcc..4ea68a3c6 100755
--- a/cg/cg4501.cpp
+++ b/cg/cg4501.cpp
@@ -5,7 +5,6 @@
 #include <relation.h>
 #include <tabutil.h>
 
-
 #include <nditte.h>
 
 bool TAp_iva::mask_annoiva (TMask_field& f, KEY k)
@@ -17,7 +16,7 @@ bool TAp_iva::mask_annoiva (TMask_field& f, KEY k)
     if (annoivap > 0 && annoiva != annoivap + 1)
       return f.error_box(FR("Il nuovo anno esercizio IVA deve essere %d"), (annoivap+1));
   }
-  return TRUE;
+  return true;
 }  
 
 bool TAp_iva::create()
@@ -28,6 +27,7 @@ bool TAp_iva::create()
   return TSkeleton_application::create();
 }
 
+/*
 void TAp_iva::libro_unico()
 {
   TString4 annoiva;
@@ -64,6 +64,7 @@ void TAp_iva::libro_unico()
     lbu.write();  
   }   
 }
+*/
 
 bool TAp_iva::apertura_iva()
 {
@@ -153,8 +154,7 @@ bool TAp_iva::apertura_iva()
   }
 
   //viene aggiornato l'anno iva sui parametri ditta 
-  TConfig conf(CONFIG_DITTA);
-  conf.set("AnLiIv", annoiva);
+  ini_set_int(CONFIG_DITTA, "cg", "AnLiIv", _annoiva);
 
   //sull'anagrafica ditte viene aggiornata la frequenza versamento
   TLocalisamfile nditte (LF_NDITTE);
diff --git a/cg/cg5700.cpp b/cg/cg5700.cpp
index 7a0d21a61..71db98106 100755
--- a/cg/cg5700.cpp
+++ b/cg/cg5700.cpp
@@ -232,7 +232,7 @@ class TDich_periodica_iva_mask : public TAutomask
        _is_euro;         // importi in euro
 protected:
   void read_iva_data();
-  real imposta_diff() const;
+  real imposta_diff(int tipo) const;
 
 public:
   void set_prospect();
@@ -261,7 +261,8 @@ TDich_periodica_iva_mask::TDich_periodica_iva_mask(TDich_periodica_selfirm_mask
   }
 }
 
-real TDich_periodica_iva_mask::imposta_diff() const
+// tipo=1 vendite; 2 = acquisti
+real TDich_periodica_iva_mask::imposta_diff(int tipo) const
 {
   real imposta;
 
@@ -270,8 +271,9 @@ real TDich_periodica_iva_mask::imposta_diff() const
   const TDate data_a(31,12,anno);
 
   TString query;
-  query = "USE IVADIFF SELECT (BETWEEN(DATAREGP,#DAL,#AL))&&(TIPOMOV>2)&&(STR(MOV.TOTDOC>0))";
-  query << "\nBY DATAREGP DATAREG";
+  query << "USE IVADIFF SELECT (BETWEEN(DATAREGP,#DAL,#AL))&&(STR("
+        << "(MOV.TOTDOC>0)&&(TIPOMOV>2)&&(MESELIQ<13)&&(TIPOIVA=" << tipo << ')'
+        << "))";
   query << "\nJOIN MOV INTO NUMREG==NUMREG";
   TISAM_recordset id(query);
   id.set_var("#DAL", data_da);
@@ -360,12 +362,13 @@ void TDich_periodica_iva_mask::read_iva_data()
     const real rettifica = lim.get_real("R5"); // Rettifiche
 
     real cd4 = lam.get_real("R0"); // Iva esigibile per il periodo
-    cd4 += imposta_diff();
+    cd4 += imposta_diff(1);
     if (rettifica > ZERO)
       cd4 += rettifica;
     cd4.round();
       
     real cd5       = lam.get_real("R1"); // Iva che si detrae per il periodo
+    cd5 += imposta_diff(2);
     if (rettifica < ZERO && !exclude_sign)
       cd5 += abs(rettifica);
     cd5.round();
diff --git a/cg/cgmenu.men b/cg/cgmenu.men
index 547343b89..beae6b69e 100755
--- a/cg/cgmenu.men
+++ b/cg/cgmenu.men
@@ -181,7 +181,8 @@ Item_09 = "Correzione righe di prima nota", "cg1 -2 Z", "FP"
 Item_10 = "Impostazione mese liquidazione", "cg1 -2 M", "FP"
 Item_11 = "Controllo P.I. e C.F. clienti/fornitori", "cg1 -2 L", "FP"
 Item_12 = "Allineamento IBAN su Banche x Cliente", "cg1 -2 B", "FP"
-Item_13 = "Collegamento bilanci", [CGMENU_025]
+Item_13 = "Controllo integrit� archivi", "cg1 -2 X", "F"
+Item_14 = "Collegamento bilanci", [CGMENU_025]
 
 [CGMENU_019]
 Caption = "Invio"
diff --git a/cg/cgsaldac.cpp b/cg/cgsaldac.cpp
index 4583c206f..26d3fe13e 100755
--- a/cg/cgsaldac.cpp
+++ b/cg/cgsaldac.cpp
@@ -1166,17 +1166,29 @@ int TRiga_partite::calcola_pagato_periodo(const TDate& dal, const TDate& al, TIm
     }
   }
 
+  // Ordino i pagamenti per DATAPAG/NRATA/NRIGP
   for (int i = 0; i < pags.items(); i++)
   {
     for (int j = i+1; j < pags.items(); j++)
     {
       const TRectype& pi = *(TRectype*)pags.objptr(i);
       const TRectype& pj = *(TRectype*)pags.objptr(j);
-      const TRiga_partite& si = partita().riga(pi.get_int(PAGSCA_NRIGP));
-      const TRiga_partite& sj = partita().riga(pj.get_int(PAGSCA_NRIGP));
+      const int ni = pi.get_int(PAGSCA_NRIGP);
+      const int nj = pj.get_int(PAGSCA_NRIGP);
+      const TRiga_partite& si = partita().riga(ni);
+      const TRiga_partite& sj = partita().riga(nj);
       const TDate di = si.get(PART_DATAPAG);
       const TDate dj = sj.get(PART_DATAPAG);
-      if (di > dj)
+      long cmp = di - dj;
+      if (cmp == 0)
+      {
+        const int ri = pi.get_int(PAGSCA_NRATA);
+        const int rj = pj.get_int(PAGSCA_NRATA);
+        cmp = ri - rj;
+        if (cmp == 0)
+          cmp = ni - nj;
+      }
+      if (cmp > 0)
         pags.swap(i, j);
     }
   }