diff --git a/lv/f166.dir b/lv/f166.dir
index 04435c3d9..9f6c68483 100755
--- a/lv/f166.dir
+++ b/lv/f166.dir
@@ -1,3 +1,3 @@
 166
 0
-$lvconsplan|0|0|57|0|Planning consegne|||
+$lvclifogiac|0|0|702|0|Giacenze per cliente|||
diff --git a/lv/f166.trr b/lv/f166.trr
index 7b3ffa619..cc80f3b50 100755
--- a/lv/f166.trr
+++ b/lv/f166.trr
@@ -1,14 +1,55 @@
 166
-9
-CODPLAN|3|6|0|Codice del planning
-DTCONS|5|8|0|Data consegna
-GGCONS|2|1|0|Giorno consegna
-CODAUT|1|2|0|Autista
-CODMEZ|1|2|0|Mezzo
-CODITI|2|3|0|Codice itinerario
-UTULAGG|1|16|0|Utente che aggiornato per ultimo il planning
-DTULAGG|5|8|0|Data ultimo aggionamento del planning
-ORULAGG|10|6|0|Ora ultimo aggiornamento del planning
+50
+TIPOCF|1|1|0|Tipo <C>liente <F>ornitore
+CODCF|3|6|0|Codice Cliente Fornitore
+INDSPED|2|3|0|Codice indirizzo di spedizione
+CODMAG|1|5|0|Codice magazzino e deposito
+CODART|1|20|0|Codice articolo
+LIVELLO|1|15|0|Livello di magazzino
+NRIGA|2|3|0|-numero riga per sheet anagrafica-
+ANNOES|1|4|0|Codice esercizio
+DATARIF|5|8|0|Data di riferimento
+UBICAZ|1|12|0|Codice ubicazione
+RIM|4|15|5|Rimanenze iniziali
+VALRIM|4|18|3|Valore rimanenze iniziali
+ACQ|4|15|5|Acquistato
+VALACQ|4|18|3|Valore acquistato
+ENT|4|15|5|Entrato
+VALENT|4|18|3|Valore entrato
+VEN|4|15|5|Venduto
+VALVEN|4|18|3|Valore venduto
+USC|4|15|5|Uscito
+VALUSC|4|18|3|Valore uscito
+GIAC|4|15|5|Giacenza
+ORDF|4|15|5|Ordinato fornitori
+VALORDF|4|18|3|Valore ordinato fornitori
+ORDC|4|15|5|Ordinato clienti
+VALORDC|4|18|3|Valore ordinato clienti
+INCL|4|15|5|In conto lavorazione
+ACL|4|15|5|A conto lavorazione
+PRODCOMP|4|15|5|Componenti in produzione
+PRODFIN|4|15|5|Assemblati in produzione
+NLABEL|4|10|0|Numero etichette da stampare
+NDIST|4|15|5|Distinte da scaricare
+SCARTI|4|15|5|Scarti
+VALSCARTI|4|15|5|Valore scarti
+LIVRIOR|4|15|3|Livello di riordino
+LOTTORIOR|4|15|3|Lotto minimo di riordino
+LOTTOIRIOR|4|15|3|Lotto incrementale di riordino
+GIORNIRIOR|4|5|1|Numero di giorni di riordino
+SCORTAMIN|4|15|5|Scorta minima
+USER1|4|15|5|campo definito dall'utente
+USERVAL1|4|18|3|valore
+USER2|4|15|5|campo definito dall'utente
+USERVAL2|4|18|3|valore
+USER3|4|15|5|campo definito dall'utente
+USERVAL3|4|18|3|valore
+USER4|4|15|5|campo definito dall'utente
+USERVAL4|4|18|3|valore
+USER5|4|15|5|campo definito dall'utente
+USERVAL5|4|18|3|valore
+USER6|4|15|5|campo definito dall'utente
+USERVAL6|4|18|3|valore
 2
-CODPLAN| 
-DTCONS+CODPLAN|X
\ No newline at end of file
+TIPOCF+CODCF+INDSPED+ANNOES+CODART+NRIGA| 
+TIPOCF+CODCF+INDSPED+ANNOES+CODMAG+CODART+LIVELLO|X
diff --git a/lv/lv0600.cpp b/lv/lv0600.cpp
index e00ef14a1..89486a381 100755
--- a/lv/lv0600.cpp
+++ b/lv/lv0600.cpp
@@ -85,7 +85,7 @@ int TPeriodi_sosp::controlli(const TMask& mask)
 
 bool TPeriodi_sosp::user_create()
 {    
-  _rel = new TRelation(LF_LVTIPISOSP);
+  _rel = new TRelation(LF_LVPERISOSP);
   _mask = new TPeriodi_sosp_mask;
   return true;
 }
diff --git a/lv/lv2.cpp b/lv/lv2.cpp
index 9d213eecc..37f4cacd2 100755
--- a/lv/lv2.cpp
+++ b/lv/lv2.cpp
@@ -7,6 +7,8 @@ int main(int argc, char** argv)
   const int r = (argc > 1) ? argv[1][1] - '0' : 0;
   switch (r)
   {
+  case 0: lv2100(argc, argv); break; //generazione automatica del planning
+  case 1: lv2200(argc, argv); break; //manipolazione e stampa del planning
   default: lv2100(argc, argv); break; //generazione automatica del planning
   }
   return 0;
diff --git a/lv/lv2.h b/lv/lv2.h
index 8d818faa0..0f93b1470 100755
--- a/lv/lv2.h
+++ b/lv/lv2.h
@@ -2,5 +2,6 @@
 #define __LV2_H
 
 int lv2100(int argc, char* argv[]);
+int lv2200(int argc, char* argv[]);
 
 #endif // __LV2_H
\ No newline at end of file
diff --git a/lv/lv2100.cpp b/lv/lv2100.cpp
index eb9abffbf..04363bc37 100755
--- a/lv/lv2100.cpp
+++ b/lv/lv2100.cpp
@@ -46,23 +46,6 @@ bool TGenera_planning_mask::on_field_event(TOperable_field& o, TField_event e, l
   }
   return true;
 }
-/*
-/////////////////////////////////////////////////////////////
-//	TGenera_planning recordset
-/////////////////////////////////////////////////////////////
-
-class TGenera_planning_recordset : public TCSV_recordset
-{
-public:
-	TEsporta_ps0713_recordset();
-};
-
-
-TGenera_planning_recordset::TEsporta_ps0713_recordset() 
-                          : TCSV_recordset("CSV(\"\t\")")
-{
-}
-*/
 
 ///////////////////////////////////////////////////////////
 // TGenera_planning applicazione
@@ -273,7 +256,7 @@ void TGenera_planning_app::elabora_passaggio(const TDate& dadata, const TDate& a
   if (dadatacont > adata || (adatacont.ok() && adatacont < dadata))
     return; // Inutile proseguire
 
-    //cache sulla tabella frequenze consegne
+  //cache sulla tabella frequenze consegne
   TString8 keycoditi;
   keycoditi << coditi;
   const TRectype& iti = cache().get("&ITI",keycoditi);
diff --git a/lv/lv2100a.h b/lv/lv2100a.h
index ee8411922..e86d4ee6e 100755
--- a/lv/lv2100a.h
+++ b/lv/lv2100a.h
@@ -1,8 +1,5 @@
 // generazione automatica planning
 // definizione campi per maschera lv2100a
-
-#define F_CODDITTA   101
-#define F_RAGSOC     102
 #define F_DADATA     103
 #define F_ADATA      104
 #define F_CODITI     105
diff --git a/lv/lv2100a.uml b/lv/lv2100a.uml
index fa4ad69a7..c7eeea61f 100755
--- a/lv/lv2100a.uml
+++ b/lv/lv2100a.uml
@@ -4,51 +4,30 @@ TOOLBAR "" 0 0 0 2
 #include <elabar.h>
 ENDPAGE
 
-PAGE "Generazione planning" -1 -1 78 20
-
-GROUPBOX DLG_NULL 76 3
-BEGIN
-  PROMPT 1 1 "@bDitta corrente"
-END
-
-NUMBER F_CODDITTA 5
-BEGIN
-  PROMPT 2 2 "Codice      "
-  FLAGS "FD"
-  USE LF_NDITTE
-  INPUT CODDITTA F_CODDITTA
-  OUTPUT F_RAGSOC RAGSOC
-  CHECKTYPE REQUIRED
-END
-
-STRING F_RAGSOC 50
-BEGIN
-  PROMPT 23 2 ""
-  FLAGS "D"
-END
+PAGE "Generazione planning" -1 -1 76 20
 
 GROUPBOX DLG_NULL 76 5
 BEGIN
-  PROMPT 1 4 "@bDati per la generazione del planning"
+  PROMPT 1 1 "@bDati per la generazione del planning"
 END
 
 DATE F_DADATA
 BEGIN
-  PROMPT 2 5 "Genera il planning dal "
+  PROMPT 2 2 "Genera il planning dal "
   FIELD DADATA
   CHECKTYPE REQUIRED
 END
 
 DATE F_ADATA
 BEGIN
-  PROMPT 45 5 "al "
+  PROMPT 45 2 "al "
   FIELD ADATA
   CHECKTYPE REQUIRED
 END
 
 STRING F_CODITI 3
 BEGIN
-  PROMPT 2 6 "Itinerario "
+  PROMPT 2 3 "Itinerario "
   FLAGS "UZ"
   USE &ITI
   INPUT CODTAB F_CODITI
@@ -60,7 +39,7 @@ END
 
 STRING F_DESCRITI 50
 BEGIN
-  PROMPT 23 6 ""
+  PROMPT 23 3 ""
   USE &ITI KEY 2
   INPUT S0 F_DESCRITI
   DISPLAY "Descrizione@50" S0
@@ -70,7 +49,7 @@ END
 
 NUMBER F_CODCF 6
 BEGIN
-  PROMPT 2 7 "Cliente    "
+  PROMPT 2 4 "Cliente    "
   FLAGS "U"
   USE LF_CLIFO KEY 1
   INPUT TIPOCF "C"
@@ -83,7 +62,7 @@ END
 
 STRING F_RAGSOCCLI 50
 BEGIN
-  PROMPT 23 7 ""
+  PROMPT 23 4 ""
   USE LF_CLIFO KEY 2
   INPUT TIPOCF "C"
   INPUT RAGSOC F_RAGSOCCLI
diff --git a/lv/lv2200.cpp b/lv/lv2200.cpp
new file mode 100755
index 000000000..2059fe3a8
--- /dev/null
+++ b/lv/lv2200.cpp
@@ -0,0 +1,441 @@
+#include <applicat.h>
+#include <automask.h>
+#include <progind.h>
+#include <recarray.h>
+#include <recset.h>
+#include <relation.h>
+
+#include "lvlib.h"
+
+#include "lvrconsplan.h"
+#include "lvpasplan.h"
+
+#include "lv2.h"
+#include "lv2200a.h"
+
+///////////////////////////////////////////////////////////
+// TGestione_planning maschera
+///////////////////////////////////////////////////////////
+
+class TGestione_planning_mask : public TAutomask
+{
+  TToken_string   _rigaoriginale;
+
+private:
+  void fill_sheet();
+  bool changed(TToken_string& oldrow, TToken_string& newrow, short id); 
+  int codice_riga(const TDate& data);  
+  void aggiorna_plan();
+  bool cancella_riga();
+  void nuova_riga();
+  
+
+public:
+  virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
+  TGestione_planning_mask (const char* name) : TAutomask(name) {}
+};
+
+//questa funzione si occupa di riempire lo sheet dinamicamente in base ai parametri che l'utente decide
+void TGestione_planning_mask::fill_sheet()
+{
+  if (field(F_DADATA).empty() || field(F_ADATA).empty())
+    return;
+
+  TString query = "USE LVRCONSPLAN KEY 2";
+  const long coditi = get_long(F_CODITI);
+  const long codcli = get_long(F_CODCF);
+  if (coditi || codcli)
+  {
+    query << " SELECT ";
+    if (codcli > 0)
+      query << "(CODCF=" << codcli << ')';
+    if (coditi > 0)    
+    {
+      if (codcli > 0)
+        query << "&&";
+      query << "(CODITI=" << coditi << ')';
+    }
+  }
+  query << "\n";
+  query << "FROM DTCONS=" << get(F_DADATA) << "\n";
+  query << "TO DTCONS=" << get(F_ADATA) << "\n";
+
+  TISAM_recordset plan(query);
+
+  TProgind pi(plan.items(), TR("Elaborazione dati planning in corso..."), true, true);
+
+  TSheet_field& sheet = sfield(F_PLAN);
+  TMask& sheetmask = sheet.sheet_mask();
+  TRelation& rel = *plan.cursor()->relation(); //accesso al file delle righe
+
+  sheet.destroy();
+
+  for (bool ok = plan.move_first(); ok; ok = plan.move_next())
+	{
+	  if (!pi.addstatus(1))
+		  break;
+    
+    TToken_string& row = sheet.row(-1); //crea una nuova riga dello sheet
+
+    //scandisco nella maschera tutti i campi che hanno un field
+    FOR_EACH_MASK_FIELD(sheetmask,i,f)
+    {
+      const TFieldref* fr = f->field(); //leggo il valore dalla relation
+      if (fr != NULL)
+        row.add(fr->read(rel),sheet.cid2index(f->dlg())); //metto il valore letto nella posizione corretta nella TToken_string
+    }
+    sheet.check_row(sheet.items()-1); //fa fare alla maschera la decodifica dei codici e aggiorna la TToken_string
+  }
+  sheet.force_update();
+}
+
+//funzione che confronta due due campi di una TToken_string e restitusce true se sono diversi
+bool TGestione_planning_mask::changed(TToken_string& oldrow, TToken_string& newrow, short id)
+{
+  const TSheet_field& sheet = sfield(F_PLAN);
+  const int i = sheet.cid2index(id);
+  const TFixed_string oldval(oldrow.get(i));
+  const TFixed_string newval(newrow.get(i));
+  return oldval != newval;
+}
+
+//questa funzione trova il primo codiceriga libero per un certo codplan
+int TGestione_planning_mask::codice_riga(const TDate& data)
+{
+  const long codplan = data.date2ansi();
+  
+  //per ora memorizzo zero
+  int ptriga = 0;
+
+  //se esiste almeno una riga, memorizzo il codriga dell'ultima
+  TISAM_recordset rplan("USE LVRCONSPLAN KEY 1\nFROM CODPLAN=#CODPLAN\nTO CODPLAN=#CODPLAN");
+  rplan.set_var("#CODPLAN",TVariant(codplan));
+  if (rplan.move_last())
+    ptriga = rplan.get(LVRCONSPLAN_CODRIGA).as_int();      
+  
+  ptriga++; //incremento il codriga interessato
+  
+  return ptriga;
+}
+
+//questa funzione gestisce l'aggiornamanto dinamico dello sheet
+void TGestione_planning_mask::aggiorna_plan()
+{
+  //bool che indicano se effettivamente devo fare una rewrite dei dati...
+  //...se ho modificato un autista e/o un mezzo, questo va modificato su tutte...
+  //...le righe di quel planning
+  bool dorewrite = false;
+  bool updatecar = false;
+  
+  //variabili che mi premettono di lavorare sullo sheet
+  TSheet_field& sheet = sfield(F_PLAN);
+  TToken_string rigamodificata = sheet.row(sheet.selected()); //metto in una stringa la riga che sto analizzando
+
+  //instanzio un isam file sulla tabella dei planning
+  TLocalisamfile rplan(LF_LVRCONSPLAN);
+  
+  //creo il codplan
+  const int posdata = sheet.cid2index(F_S_DATA);
+  TDate data = _rigaoriginale.get(posdata);
+  long codplan = data.date2ansi();
+  const long codplanor = codplan ;
+
+  //creo il codriga
+  const int posriga = sheet.cid2index(F_S_RIGA);
+  int codriga = _rigaoriginale.get_int(posriga);
+
+  //se esiste almeno una riga per quel planning, leggo il record corrispondente
+  if (codriga > 0)
+  {
+    rplan.zero();
+    rplan.put(LVRCONSPLAN_CODPLAN,codplanor);
+    rplan.put(LVRCONSPLAN_CODRIGA,codriga);
+    rplan.read();
+  }
+
+  //se ho modificato la data di una riga esistente, o se se ho creata una nuova, allora
+  if (changed(_rigaoriginale,rigamodificata,F_S_DATA) || codriga <= 0)
+  {
+    //se esiste almeno una riga, elimino quella che voglio modifcare
+    if (codriga > 0)
+      rplan.remove();
+
+    //creo i nuovi codplan e codriga
+    data = rigamodificata.get(posdata);
+    codplan = data.date2ansi();
+    codriga = codice_riga(data);    
+
+    //creo la nuova riga
+    rplan.zero();
+    rplan.put(LVRCONSPLAN_CODPLAN,codplan);
+    rplan.put(LVRCONSPLAN_CODRIGA,codriga);
+    rplan.put(LVRCONSPLAN_CODPLANOR,codplanor);
+
+    //scrivo la nuova riga
+    rplan.write();
+
+    //modifico anche la TToken_string cos� da evitare errori al momento della rewrite
+    rigamodificata.add(data,posdata);
+    rigamodificata.add(codriga,posriga);
+
+    dorewrite = true;
+  }
+  
+  //se viene modificato un periodo di sospensione e/o una modalit� di passaggio...
+  //...e/o un codice itinerario su una riga, devo fare la rewrite di quella riga
+  //ATTENZIONE: la modifica di un itinerario implica anche la modifica di autista e mezzo...
+  //...mettendo quelli previsti per il nuovo itinerario
+  if (changed(_rigaoriginale,rigamodificata,F_S_PERSOSPVAR) || changed(_rigaoriginale,rigamodificata,F_S_MODPASS) || changed(_rigaoriginale,rigamodificata,F_S_ITI))
+    dorewrite  = true;
+
+  //se viene modificato un autista e/o un mezzo devo fare la rewrite di quella riga...
+  //... e riaggiornare anche tutte le righe di quell'itinerario in quella data con i nuovi parametri
+  if (changed(_rigaoriginale,rigamodificata,F_S_CODAUT) || changed(_rigaoriginale,rigamodificata,F_S_CODMEZ))
+    dorewrite  = updatecar = true;
+
+  //se devo fare una rewrite:
+  if (dorewrite)
+  {
+    TMask& m = sheet.sheet_mask();
+    //per ogni campo della maschera che ha un field, ci scrivo dentro il nuovo valore
+    FOR_EACH_MASK_FIELD(m,i,f)
+    {
+      const TFieldref* rf = f->field();
+      if (rf != NULL)
+      {
+        const char* val = rigamodificata.get(sheet.cid2index(f->dlg()));
+        rf->write(val,rplan.curr());
+      }
+    }
+    rplan.curr().zero(LVRCONSPLAN_CONSSTD);
+    lv_set_update_info(rplan.curr());
+    rplan.rewrite();
+  }
+
+  //se ho modificato autista e/o mezzo, allora:
+  if (updatecar)
+  {
+    //recupero dai dati modificati i nuovi valori di autista e mezzo
+    const int codaut = rigamodificata.get_int(sheet.cid2index(F_S_CODAUT)); 
+    const TString8 codmez= rigamodificata.get(sheet.cid2index(F_S_CODMEZ));
+    //recupero il codice itinerario su cui sto facendo la modifica
+    const long coditi = rigamodificata.get_long(sheet.cid2index(F_S_ITI));
+
+    //instanzio un recordset sui planning, filtrando sui coditi
+    TISAM_recordset recrplan("USE LVRCONSPLAN SELECT CODITI=#CODITI\nFROM CODPLAN=#CODPLAN\nTO CODPLAN=#CODPLAN");
+    recrplan.set_var("#CODPLAN",codplan);
+    recrplan.set_var("#CODITI",coditi);
+
+    TRectype& rec = recrplan.cursor()->curr();
+
+    for (bool ok = recrplan.move_first(); ok; ok = recrplan.move_next())
+    {
+      //cambio autisyta e mezzo
+      rec.put(LVRCONSPLAN_CODAUT,codaut);
+      rec.put(LVRCONSPLAN_CODMEZ,codmez);
+      rec.zero(LVRCONSPLAN_CONSSTD);
+      lv_set_update_info(rec);
+      //faccio l'effettiva rewrite
+      rec.rewrite(rplan);
+    }
+  }
+}
+
+//questa funzione elimina una riga dal planning
+bool TGestione_planning_mask::cancella_riga()
+{
+  int err=NOERR;
+  //variabile che mi permette di lavorare sullo sheet
+  TSheet_field& sheet = sfield(F_PLAN);
+  
+  //instanzio un isam file sulla tabella dei planning
+  TLocalisamfile rplan(LF_LVRCONSPLAN);
+  
+  //creo il codplan
+  const int posdata = sheet.cid2index(F_S_DATA);
+  TDate data = _rigaoriginale.get(posdata);
+  long codplan = data.date2ansi();
+
+  //creo il codriga
+  const int posriga = sheet.cid2index(F_S_RIGA);
+  int codriga = _rigaoriginale.get_int(posriga);
+
+  //se esiste almeno una riga per quel planning, leggo il record corrispondente
+  if (codriga > 0)
+  {
+    rplan.zero();
+    rplan.put(LVRCONSPLAN_CODPLAN,codplan);
+    rplan.put(LVRCONSPLAN_CODRIGA,codriga);
+    err = rplan.remove();
+  }
+  return err == NOERR;
+}
+
+//questa funzione genera una nuova riga di planning e propone sullo sheet i campi che pu� riempire
+void TGestione_planning_mask::nuova_riga()
+{
+  TSheet_field& sheet = sfield(F_PLAN);
+  TToken_string& rigamodificata = sheet.row(sheet.selected());
+    
+  rigamodificata.add(get_date(F_DADATA),sheet.cid2index(F_S_DATA));
+
+  if (!field(F_CODCF).empty())
+  {
+    rigamodificata.add(get_long(F_CODCF),sheet.cid2index(F_S_CODCF));
+    rigamodificata.add(get(F_RAGSOCCLI),sheet.cid2index(F_S_RAGSOCCLI));
+  }
+
+  if (!field(F_CODITI).empty())
+    rigamodificata.add(get_long(F_CODITI),sheet.cid2index(F_S_ITI));
+
+  sheet.check_row(sheet.selected()); //fa fare alla maschera la decodifica dei codici e aggiorna la TToken_string
+
+  return;
+}
+
+//questa funzione gestisce i vari eenti che si verificano sui campi della maschera
+bool TGestione_planning_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
+{
+  switch (o.dlg())
+  {
+  //se quiesti campi vengono riempiti, allora riempi lo sheet opportunamante
+  case F_DADATA:
+  case F_ADATA:
+  case F_CODITI:
+  case F_CODCF:
+    if (e == fe_modify)
+    {
+      fill_sheet();
+    }
+    break;
+  //analisi delle operazioni sullo sheet
+  case F_PLAN:
+    switch (e)
+    {
+    case se_query_modify: //se viene selezionata una riga, la salvo in una variabile globale
+      {
+        TSheet_field& sheet = (TSheet_field&)o;
+        _rigaoriginale = sheet.row(sheet.selected());
+      }
+      break;
+    case se_notify_modify: //se avviene una modifica, aggiorna il planning e lo sheet
+      aggiorna_plan();
+      fill_sheet();
+      break;
+    case se_notify_del: //se viene eliminata una riga dallo sheet, cancellala anche dal file
+      cancella_riga();
+      break;
+    case se_query_add: //se si decide di fare una modifica sullo sheet, ma i campi data della testata sono vuoti, rifiutati
+      if (field(F_DADATA).empty())
+        return false;
+      break;
+    case se_notify_add: //se si aggiunge una riga nuova allo sheet, svuota la var globale e aggiungi la riga anche al file
+      _rigaoriginale = "";
+      nuova_riga();
+      break;
+    default: break;
+    }
+    break;
+  //quando riempio il campo data dello sheet, decodifica il giorno di consegna
+  case F_S_DATA:
+    if (e == fe_modify || e == fe_init)
+    {
+      const TDate dtcons = o.get();
+      const TString16 ggcons = itow(dtcons.wday());
+      o.mask().set(F_S_GIORNO,ggcons);
+    }
+    break;
+  //quando riempio il campo itinerario dell sheet, recupero i dati di autista e mezzo da &ITI
+  case F_S_ITI:
+    if (e == fe_modify && !o.empty())
+    {
+      TMask& msk = o.mask();
+            
+      const TRectype& iti = cache().get("&ITI",o.get());
+      if (!iti.empty())
+      {
+        
+        const bool riganuova = msk.get_int(F_S_RIGA) <= 0;
+        if (riganuova || msk.field(F_S_CODAUT).empty())
+          msk.set(F_S_CODAUT,iti.get("S1"));
+        if (riganuova || msk.field(F_S_CODMEZ).empty())
+          msk.set(F_S_CODMEZ,iti.get("S2"));
+      }
+    }
+    break;
+  //quando riempio il campo cliente sullo sheet controllo se posso proporre dei dati di default sul planning
+  case F_S_CODCF:
+    if (e == fe_modify && !o.empty())
+    {
+      TMask& msk = o.mask(); //maschera di sheet
+      
+      TLocalisamfile pplan(LF_LVPASPLAN);
+        
+      pplan.put(LVPASPLAN_CODCF,msk.get(F_S_CODCF));
+      pplan.put(LVPASPLAN_CODCONT,msk.get(F_S_CODCONT));
+      pplan.put(LVPASPLAN_GGCONS,msk.get_date(F_S_DATA).wday());
+
+      int err = pplan.read(_isgteq);
+      
+      //se trovo dei dati validi sulla tabella LF_LVPASPLAN, riempio tutti i campi che riesco,...
+      //...utilizzando anche la tabella &ITI
+      if (err == NOERR)
+      {        
+        msk.set(F_S_ITI,pplan.get_int(LVPASPLAN_CODITI),true);        
+        msk.set(F_S_ORDFER,pplan.get_int(LVPASPLAN_ORDFERM));
+        msk.set(F_S_MODPASS,pplan.get_char(LVPASPLAN_MODPASS));        
+      }
+    }    
+    break;
+  default: break;
+  }
+  return true;
+}
+
+///////////////////////////////////////////////////////////
+// TGestione_planning applicazione
+///////////////////////////////////////////////////////////
+
+class TGestione_planning_app : public TSkeleton_application
+{
+
+  TGestione_planning_mask*		_msk;
+
+protected:
+  virtual bool create();
+  virtual bool destroy();
+  
+public:
+  bool transfer();
+  virtual void main_loop();  
+};
+
+bool TGestione_planning_app::create()
+{
+  _msk = new TGestione_planning_mask("lv2200a");
+         
+  return TSkeleton_application::create();
+}
+
+bool TGestione_planning_app::destroy()
+{
+	delete _msk;
+  return TApplication::destroy();
+}
+
+bool TGestione_planning_app::transfer()
+{
+    return true;
+}
+void TGestione_planning_app::main_loop()
+{
+  while (_msk->run() == K_ENTER)
+		transfer();
+}
+
+int lv2200(int argc, char* argv[])
+{
+  TGestione_planning_app app;
+  app.run(argc, argv, TR("Gestione planning"));
+  return 0;
+}
diff --git a/lv/lv2200a.h b/lv/lv2200a.h
new file mode 100755
index 000000000..421bb51d6
--- /dev/null
+++ b/lv/lv2200a.h
@@ -0,0 +1,31 @@
+// modifica manuale planning
+// definizione campi per maschera lv2200a
+
+#define F_DADATA          201
+#define F_ADATA           202
+#define F_CODITI          203
+#define F_DESCRITI        204
+#define F_CODCF           205
+#define F_RAGSOCCLI       206
+#define F_PLAN            207
+//campi dello sheet
+#define F_S_BOLLA         100
+#define F_S_DATA          101
+#define F_S_GIORNO        102
+#define F_S_ITI           103
+#define F_S_ORDFER        104
+#define F_S_MODPASS       105
+#define F_S_CODCONT       106
+#define F_S_CODCF         107
+#define F_S_RAGSOCCLI     108
+#define F_S_CODAUT        109
+#define F_S_DESAUT        998
+#define F_S_CODMEZ        110
+#define F_S_DESMEZ        999
+#define F_S_ANNO          111
+#define F_S_CODNUM        112
+#define F_S_NDOC          113
+#define F_S_PASSTD        114
+#define F_S_PERSOSP       115
+#define F_S_PERSOSPVAR    116
+#define F_S_RIGA          117
\ No newline at end of file
diff --git a/lv/lv2200a.uml b/lv/lv2200a.uml
new file mode 100755
index 000000000..5c237f4de
--- /dev/null
+++ b/lv/lv2200a.uml
@@ -0,0 +1,350 @@
+#include "lv2200a.h"
+
+TOOLBAR "" 0 0 0 2
+#include <elabar.h>
+ENDPAGE
+
+PAGE "Visualizzazione e modifica planning" -1 -1 76 20
+
+GROUPBOX DLG_NULL 76 5
+BEGIN
+  PROMPT 1 1 "@bDati del planning"
+END
+
+DATE F_DADATA
+BEGIN
+  PROMPT 2 2 "Visualizza il planning dal "
+  FIELD DADATA
+  CHECKTYPE REQUIRED
+END
+
+DATE F_ADATA
+BEGIN
+  PROMPT 45 2 "al "
+  FIELD ADATA
+  CHECKTYPE REQUIRED
+END
+
+STRING F_CODITI 3
+BEGIN
+  PROMPT 2 3 "Itinerario "
+  FLAGS "UZ"
+  USE &ITI
+  INPUT CODTAB F_CODITI
+  DISPLAY "Codice " CODTAB
+  DISPLAY "Descrizione@50" S0
+  OUTPUT F_CODITI CODTAB
+  OUTPUT F_DESCRITI S0
+END
+
+STRING F_DESCRITI 50
+BEGIN
+  PROMPT 23 3 ""
+  USE &ITI KEY 2
+  INPUT S0 F_DESCRITI
+  DISPLAY "Descrizione@50" S0
+  DISPLAY "Codice " CODTAB
+  COPY OUTPUT F_CODITI
+END
+
+NUMBER F_CODCF 6
+BEGIN
+  PROMPT 2 4 "Cliente    "
+  FLAGS "U"
+  USE LF_CLIFO KEY 1
+  INPUT TIPOCF "C"
+  INPUT CODCF F_CODCF
+  DISPLAY "Codice " CODCF
+  DISPLAY "Ragione sociale@50" RAGSOC
+  OUTPUT F_CODCF CODCF
+  OUTPUT F_RAGSOCCLI RAGSOC
+  CHECKTYPE NORMAL
+END
+
+STRING F_RAGSOCCLI 50
+BEGIN
+  PROMPT 23 4 ""
+  USE LF_CLIFO KEY 2
+  INPUT TIPOCF "C"
+  INPUT RAGSOC F_RAGSOCCLI
+  DISPLAY "Ragione sociale@50" RAGSOC
+  DISPLAY "Codice " CODCF  
+  COPY OUTPUT F_CODCF
+  CHECKTYPE NORMAL
+END
+
+SPREADSHEET F_PLAN
+BEGIN
+   PROMPT 0 6 "Planning"
+   ITEM "Data"
+   ITEM "Giorno"
+   ITEM "Itinerario"
+   ITEM "Or. fermata"
+   ITEM "Mod. pass."
+   ITEM "Contratto"
+   ITEM "Codice\nCliente@6"
+   ITEM "Ragione sociale@50"
+   ITEM "Autista"
+   ITEM "Mezzo"
+   ITEM "Tipo\ndoc."
+   ITEM "Numero\ndoc."
+   ITEM "Consegna\nstandard"
+   ITEM "Per.\nsosp."
+   ITEM "Per.\nsosp. var."
+   ITEM "Num.\nriga@5"
+END
+
+ENDPAGE
+ENDMASK
+
+PAGE "Planning" -1 -1 78 20
+
+GROUPBOX DLG_NULL 76 4
+BEGIN
+  PROMPT 1 1 "@bDati planning"
+END
+
+DATE F_S_DATA
+BEGIN
+  PROMPT 2 2 "Data "
+  FIELD DTCONS
+  CHECKTYPE REQUIRED
+END
+
+STRING F_S_GIORNO 10
+BEGIN
+  PROMPT 20 2 "Giorno "
+  FLAG "D"
+END
+
+NUMBER F_S_ITI 3
+BEGIN
+  PROMPT 40 2 "Itinerario "
+  FLAGS "Z"
+  FIELD CODITI
+  USE &ITI
+  INPUT CODTAB F_S_ITI
+  DISPLAY "Codice " CODTAB
+  DISPLAY "Descrizione@50" S0
+  OUTPUT F_S_ITI CODTAB
+  CHECKTYPE REQUIRED 
+END
+
+NUMBER F_S_RIGA 5
+BEGIN
+  PROMPT 60 2 "Riga "
+  FLAGS "DG"
+  MESSAGE EMPTY ENABLE,F_S_CODCONT
+  MESSAGE DISABLE,F_S_CODCONT
+  FIELD CODRIGA
+END
+
+NUMBER F_S_ORDFER 3
+BEGIN
+  FLAGS "DU"
+  PROMPT 2 3 "Ordine di fermata "
+  FIELD ORDFER
+  CHECKTYPE REQUIRED 
+END
+
+LIST F_S_MODPASS 10
+BEGIN
+  PROMPT 25 3 "Modalit� di passaggio "
+  ITEM "C|Consegna"
+  ITEM "R|Ritiro"
+  ITEM "E|Entrambi"
+  FIELD MODPASS
+END
+
+
+GROUPBOX DLG_NULL 76 4
+BEGIN
+  PROMPT 1 5 "@bDati cliente"
+END
+
+NUMBER F_S_CODCONT 6
+BEGIN
+  PROMPT 2 6 "Contratto "
+  FLAGS "DU"
+  USE LF_LVCONDV
+  JOIN LF_CLIFO INTO TIPOCF="C" CODCF=CODCF
+  INPUT CODCONT F_S_CODCONT
+  INPUT CODCF F_S_CODCF
+  DISPLAY "Codice@6" CODCONT
+  DISPLAY "Cliente@50" LF_CLIFO->RAGSOC
+  DISPLAY "Codice Cliente" CODCF
+  OUTPUT F_S_CODCONT CODCONT
+  OUTPUT F_S_CODCF CODCF
+  OUTPUT F_S_RAGSOCCLI LF_CLIFO->RAGSOC
+  FIELD CODCONT
+END
+
+NUMBER F_S_CODCF 6
+BEGIN
+  PROMPT 2 7 "Cliente   "
+  FLAGS "DUG"
+  FIELD CODCF
+  USE LF_CLIFO KEY 1
+  INPUT TIPOCF "C"
+  INPUT CODCF F_S_CODCF
+  DISPLAY "Codice " F_S_SCODCF
+  DISPLAY "Ragione sociale@50" F_S_RAGSOC
+  OUTPUT F_S_CODCF CODCF
+  OUTPUT F_S_RAGSOCCLI RAGSOC
+  CHECKTYPE REQUIRED
+END
+
+STRING F_S_RAGSOCCLI 50
+BEGIN
+  PROMPT 22 7 ""
+  FLAGS "D"  
+END
+
+GROUPBOX DLG_NULL 76 4
+BEGIN
+  PROMPT 1 9 "@bDettagli trasporto"
+END
+
+STRING F_S_CODAUT 6
+BEGIN
+  PROMPT 2 10 "Autista " 
+  FLAGS "UZ"  
+  USE &AUT  
+  INPUT CODTAB F_S_CODAUT
+  DISPLAY "Codice" CODTAB
+  DISPLAY "Descrizione@50" S0
+  OUTPUT F_S_CODAUT CODTAB
+  OUTPUT F_S_DESAUT S0
+  CHECKTYPE REQUIRED
+  FIELD CODAUT
+END
+
+STRING F_S_DESAUT 50
+BEGIN
+  PROMPT 22 10 ""
+  USE &AUT KEY 2
+  INPUT S0 F_S_DESAUT  
+  DISPLAY "Descrizione@50" S0
+  DISPLAY "Codice" CODTAB
+  COPY OUTPUT F_S_CODAUT
+  CHECKTYPE REQUIRED
+END
+
+STRING F_S_CODMEZ 8
+BEGIN
+  PROMPT 2 11 "Targa   "
+  FLAGS "U"
+  USE &MEZ
+  INPUT CODTAB F_S_CODMEZ
+  DISPLAY "Codice@8" CODTAB
+  DISPLAY "Descrizione@50" S0
+  OUTPUT F_S_CODMEZ CODTAB
+  OUTPUT F_S_DESMEZ S0
+  FIELD CODMEZ
+  CHECKTYPE REQUIRED 
+END
+
+STRING F_S_DESMEZ 50
+BEGIN
+  PROMPT 22 11 ""
+  USE &MEZ KEY 2
+  INPUT S0 F_S_DESMEZ
+  DISPLAY "Descrizione@50" S0
+  DISPLAY "Codice@8" CODTAB  
+  COPY OUTPUT F_S_CODMEZ
+  CHECKTYPE REQUIRED
+END
+
+GROUPBOX DLG_NULL 20 5
+BEGIN
+  PROMPT 56 13 "@bDati bolla associata"
+END
+
+NUMBER F_S_ANNO 4
+BEGIN
+  PROMPT 57 14 "Anno doc. "
+  FIELD ANNO
+  FLAG "D"
+END
+
+STRING F_S_CODNUM 4
+BEGIN
+  PROMPT 57 15 "Documento "
+  FIELD CODNUM
+  FLAG "D"
+END
+
+NUMBER F_S_NDOC 7
+BEGIN
+  PROMPT 57  16 "Numero    "    
+  FIELD NDOC
+  FLAG "DG"
+  MESSAGE EMPTY DISABLE,F_S_BOLLA
+  MESSAGE ENABLE,F_S_BOLLA
+END
+
+GROUPBOX DLG_NULL 53 5
+BEGIN
+  PROMPT 1 13 "@bDettagli planning"
+END
+
+BOOLEAN F_S_PASSTD
+BEGIN
+  PROMPT 2 14 "Consegna standard "
+  FIELD CONSSTD
+  FLAG "D"
+END
+
+NUMBER F_S_PERSOSP 2
+BEGIN
+  PROMPT 2 15 "Periodo di sospensione         "
+  FIELD PERSOSP
+  FLAG "D"
+END
+
+NUMBER F_S_PERSOSPVAR 2
+BEGIN
+  PROMPT 2 16 "Periodo di sospensione variato "
+  FIELD PERSOSPVAR
+  USE LF_LVPERISOSP
+  INPUT CODCF F_S_CODCF SELECT
+  INPUT CODCONT F_S_CODCONT SELECT
+  INPUT CODPER F_S_PERSOSPVAR
+  DISPLAY "Codice @6" CODPER
+  DISPLAY "Da @10" DATAINI
+  DISPLAY "a @10" DATAFIN 
+  OUTPUT F_S_PERSOSPVAR CODPER
+  CHECKTYPE NORMAL
+END
+
+ENDPAGE
+
+TOOLBAR "" 0 0 0 2
+
+BUTTON DLG_OK 2 2
+BEGIN
+  PROMPT 1 1 ""
+END
+
+BUTTON DLG_DELREC 2 2
+BEGIN
+  PROMPT 2 1 "Elimina"
+  MESSAGE EXIT,K_DEL
+  PICTURE BMP_DELREC
+END
+
+BUTTON DLG_USER 2 2
+BEGIN
+  PROMPT 3 1 "Bolla"
+  PICTURE BMP_LINK
+END
+
+BUTTON DLG_CANCEL 2 2
+BEGIN
+  PROMPT 4 1 ""
+END
+
+
+
+ENDPAGE
+ENDMASK
\ No newline at end of file
diff --git a/lv/lvconsplan.h b/lv/lvconsplan.h
deleted file mode 100755
index 162c8e108..000000000
--- a/lv/lvconsplan.h
+++ /dev/null
@@ -1,14 +0,0 @@
-#ifndef __LVCONSPLAN_H
-#define __LVCONSPLAN_H
-
-#define LVCONSPLAN_CODPLAN		"CODPLAN"
-#define LVCONSPLAN_DTCONS			"DTCONS"
-#define LVCONSPLAN_GGCONS		  "GGCONS"
-#define LVCONSPLAN_CODAUT			"CODAUT"
-#define LVCONSPLAN_CODMEZ			"CODMEZ"
-#define LVCONSPLAN_CODITI			"CODITI"
-#define LVCONSPLAN_UTCREAZ		"UTULAGG"
-#define LVCONSPLAN_DTULAGG		"DTULAGG"
-#define LVCONSPLAN_ORULAGG		"ORULAGG"
-
-#endif
\ No newline at end of file
diff --git a/lv/lvtbiti.uml b/lv/lvtbiti.uml
index 2a74c1d6b..dc14135f9 100755
--- a/lv/lvtbiti.uml
+++ b/lv/lvtbiti.uml
@@ -14,7 +14,7 @@ END
 STRING F_COD_ITINERARIO 3
 BEGIN
   PROMPT 2 2 "Itinerario "
-  FLAGS "U"  
+  FLAGS "ZU"  
   USE &ITI
   INPUT CODTAB F_COD_ITINERARIO
   DISPLAY "Codice" CODTAB