Files
SteamWare/SteamWareLib/ApplicationUserControl.cs
T
2018-03-17 09:47:02 +01:00

1464 lines
52 KiB
C#

using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
namespace SteamWare
{
/// <summary>
/// Base class for every user control in the application, containing some common
/// behaviour and utility methods.
/// It is not meant to be be used directly.
/// </summary>
public class ApplicationUserControl : System.Web.UI.UserControl
{
/// <summary>
/// tipo id controllo con classi di base comune da cui derivare gli *.asmx
/// </summary>
public ApplicationUserControl()
{ }
/*
* Definizioni generali:
* SteamWare: codice scritto manualmente da SteamWare
* webForm: codice autogenerato da VisualStudio
* =c= : codice costante (non serve modifica)
* <c> : codice variabile (va modificato x ogni controllo / pagina)
*
* Notazione
* _ : se posto all'inizio del nome indica una variabile/oggetto caricato in memoria da input pagina e/o session
* MAIUS : le procedure / metodi con prima lettera in MAIUSCOLO indicano codice COSTANTE
* minus : le procedure / metodi con prima lettera in minuscolo indicano codice variabile da verificare/modificare
*/
/// <summary>
/// imposto il tipo di anagrafica del controlloS
/// </summary>
public tipoAnagrafica TipoAnagControllo
{
get
{
return _tipoAnagrafica;
}
set
{
_tipoAnagrafica = value;
}
}
#region dati utente e sessione =c=
/// <summary>
/// nome della pagina correntemente caricata
/// </summary>
public string _paginaCorrente;
/// <summary>
/// memorizza la pagina precedente (ovvero la corrente ma non da page-object ma in session...
/// </summary>
public string _paginaPrecedente;
/// <summary>
/// stringa con CDC in (...) dei cdc abilitati (da permesso gerarchicamente a discendere...)
/// </summary>
protected string _AuthCdC;
/// <summary>
/// stringa con elenco CDC abilitati (da permesso gerarchicamente a discendere...)
/// </summary>
protected string _CdCUser;
#endregion
#region tabelle dati
/// <summary>
/// tabella diritti
/// </summary>
protected DataLayer_AnagGen.DIRITTIDataTable _Diritti;
/// <summary>
/// tabella di tutti i cdc
/// </summary>
protected DataLayer_AnagGen.CDCDataTable _allCdC;
#endregion
#region altri dati
/// <summary>
/// tipo di anagrafica usata
/// </summary>
protected tipoAnagrafica _tipoAnagrafica = tipoAnagrafica.Standard;
/// <summary>
/// importo il tipo di vista del modulo
/// </summary>
protected tipoVistaMod _vistaModulo = tipoVistaMod.editing;
/// <summary>
/// elenco testuale csv dei cdc accessibili all'utente (x filtri tipo IN(...))
/// </summary>
protected string _elencoCdC;
/// <summary>
/// numero di righe standard x i datagrid
/// </summary>
protected int _righeDataGrid;
/// <summary>
/// numero di righe standard x i datagrid di anagrafica
/// </summary>
protected int _righeDataGridAnagr;
/// <summary>
/// numero di righe standard x i datagrid lunghi
/// </summary>
protected int _righeDataGridLong;
/// <summary>
/// numero di righe standard x i datagrid medi
/// </summary>
protected int _righeDataGridMed;
/// <summary>
/// numero di righe standard x i datagrid su mezza pagina
/// </summary>
protected int _righeDataGridShort;
/// <summary>
/// numero di righe standard x i selettori popup
/// </summary>
protected int _righeSelettore;
/// <summary>
/// indirizzo email dell'admin applicativo cui vanno le email in caso di anomalie...
/// </summary>
protected string _adminEmail;
/// <summary>
/// indirizzo email dell'applicativo da cui partono le email in caso di anomalie...
/// </summary>
protected string _fromEmail;
/// <summary>
/// indirizzo server SMTP
/// </summary>
protected string _smtpCli;
/// <summary>
/// elenco delle pagine "safe" ovvero da non autorizzare - da web.config
/// </summary>
protected string _safePages;
/// <summary>
/// elenco delle pagine "common" ovvero da autorizzare ma senza bisogno diritti in anagrafica - da web.config
/// </summary>
protected string _commonPages;
/// <summary>
/// valore che determina se è possibile forzare impersonificazioen utente...
/// </summary>
protected bool _allowForceUser;
/// <summary>
/// livello di log (1-->5)
/// </summary>
protected int _logLevel;
/// <summary>
/// dir di logging
/// </summary>
protected string _logBaseDir;
#endregion
#region flusso creazione pagina =c=
/// <summary>
/// MAIN: esecuzione al caricamento del modulo delle routines di controllo utente e creazione pagina
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected virtual void Page_Load(object sender, System.EventArgs e)
{
// carico i dati...
LoadUserData();
SetUpByUserRight();
loadSessionData();
PredisponiDati();
bindControlli();
}
/// <summary>
/// predisposizione dati x pagina da cache/database a seconda della disponibilità in cache o refresh (B.1.4)
/// </summary>
protected void PredisponiDati()
{
if (!datiDisponibili())
{
resetUpdate();
forza_Update();
}
else
{
caricaDati();
}
}
/// <summary>
/// popola gli oggetti e le labels... (B.1.6)
/// </summary>
protected virtual void bindControlli()
{
// IsPostBack è TRUE se utilizzo javascript ovvero confermo cancellazioni o modifico i controlli...
if (!IsPostBack)
{
DisegnaPagina();
}
}
/// <summary>
/// disegna la pagina: prima i controlli poi il datagrid
/// </summary>
protected void DisegnaPagina()
{
sistemaControlli();
aggiungiLink();
aggiornaControlliDataGL();
traduciObj();
}
/// <summary>
/// aggiunge i link x i selettori
/// </summary>
protected virtual void aggiungiLink()
{
}
/// <summary>
/// sistema i vari controlli della pagina
/// </summary>
protected virtual void sistemaControlli()
{ }
/// <summary>
/// aggiorna eventuali datalist e datagrid
/// </summary>
protected virtual void aggiornaControlliDataGL()
{
}
/// <summary>
/// sistema tutte le labels traducendo i lemmi nella lingua utente ed in inglese
/// </summary>
protected virtual void traduciObj()
{ }
#endregion
#region utility =c=
/// <summary>
/// calcola come percentuale la radio dividendo/divisore
/// </summary>
/// <param name="dividendo"></param>
/// <param name="divisore"></param>
/// <returns></returns>
public string percentuale(object dividendo, object divisore)
{
string answ = "";
double _dividendo = Convert.ToDouble(dividendo);
double _divisore = Convert.ToDouble(divisore);
try
{
answ = string.Format("{0:p}", _dividendo / _divisore);
}
catch
{ }
return answ;
}
/// <summary>
/// limita una stringa al numero max di caratteri imposto
/// </summary>
/// <param name="original"></param>
/// <param name="maxChar"></param>
/// <returns></returns>
public string limitString(string original, int maxChar)
{
string outString = original;
if (outString.Length > maxChar)
{
outString = string.Format("{0}...", original.Substring(0, maxChar - 3));
}
return outString;
}
/// <summary>
/// Reads data from a stream until the end is reached. The
/// data is returned as a byte array. An IOException is
/// thrown if any of the underlying IO calls fail.
/// </summary>
/// <param name="stream">The stream to read data from</param>
/// <param name="initialLength">The initial buffer length</param>
public static byte[] ReadFully(Stream stream, int initialLength)
{
// If we've been passed an unhelpful initial length, just
// use 32K.
if (initialLength < 1)
{
initialLength = 32768;
}
byte[] buffer = new byte[initialLength];
int read = 0;
int chunk;
while ((chunk = stream.Read(buffer, read, buffer.Length - read)) > 0)
{
read += chunk;
// If we've reached the end of our buffer, check to see if there's
// any more information
if (read == buffer.Length)
{
int nextByte = stream.ReadByte();
// End of stream? If so, we're done
if (nextByte == -1)
{
return buffer;
}
// Nope. Resize the buffer, put in the byte we've just
// read, and continue
byte[] newBuffer = new byte[buffer.Length * 2];
Array.Copy(buffer, newBuffer, buffer.Length);
newBuffer[read] = (byte)nextByte;
buffer = newBuffer;
read++;
}
}
// Buffer is now too big. Shrink it.
byte[] ret = new byte[read];
Array.Copy(buffer, ret, read);
return ret;
}
/// <summary>
/// converte una data in formato aaaammgg in stringa gg/mm/aaaa
/// </summary>
/// <param name="val"></param>
/// <returns></returns>
public string data2string(object val)
{
string dataFormattata = "";
try
{
string data = val.ToString();
dataFormattata = data.Substring(6, 2) + "/" + data.Substring(4, 2) + "/" + data.Substring(0, 4);
}
catch
{
}
return dataFormattata;
}
/// <summary>
/// converte una data in formato aaaammgg in stringa aaaa-mm-gg
/// </summary>
/// <param name="val"></param>
/// <returns></returns>
public string data2IsoString(object val)
{
string dataFormattata = "";
try
{
string data = val.ToString();
dataFormattata = data.Substring(0, 4) + "-" + data.Substring(4, 2) + "-" + data.Substring(6, 2);
}
catch
{
}
return dataFormattata;
}/// <summary>
/// converte una stringa in formato gg/mm/aaaa in stringa(intero data) in formato aaaammgg
/// </summary>
/// <param name="val"></param>
/// <returns></returns>
public string string2data(object val)
{
DateTime data = Convert.ToDateTime(val);
return (data.Year).ToString() + (data.Month).ToString().PadLeft(2, '0') + (data.Day).ToString().PadLeft(2, '0');
}
/// <summary>
/// converte una datetime in un intero tipo yyyymmddhhmmss
/// </summary>
/// <param name="_data"></param>
/// <returns></returns>
public long datetime2int(DateTime _data)
{
long valore_data = 0;
long valore_time = 0;
long valore = 0;
valore_data = (_data).Year * 10000 + (_data).Month * 100 + (_data).Day;
valore_time = (_data).Hour * 10000 + (_data).Minute * 100 + (_data).Second;
valore = valore_data * 1000000 + valore_time;
return valore;
}
/// <summary>
/// formatta la data in formato dateTime in una data formato italiano come stringa gg/mm/aaaa
/// </summary>
/// <param name="dataRichiesta"></param>
/// <returns></returns>
public string dataItaliana(DateTime dataRichiesta)
{
string dataFormattata;
dataFormattata = dataRichiesta.Day.ToString().PadLeft(2, '0') + "/" + dataRichiesta.Month.ToString().PadLeft(2, '0') + "/" + dataRichiesta.Year.ToString();
return dataFormattata;
}
/// <summary>
/// invia un alert jscript con messaggio indicato...
/// </summary>
/// <param name="_messaggio">messaggio dell'alert da mandare</param>
public void mandaAlert(string _messaggio)
{
string comando = "<script language='JavaScript'>";
comando += "alert('" + _messaggio + "')";
comando += "</script>";
Response.Write(comando);
}
/// <summary>
/// scrive immediatamente sulla pagina web il messaggio di avanzamento...
/// </summary>
/// <param name="_messaggio"></param>
public void scriviAvanzamento(string _messaggio)
{
Response.Write(_messaggio);
Response.Flush();
}
/// <summary>
/// restituisce una scringa formattata in testa e coda x essere un corretto comando javascript
/// </summary>
/// <param name="comando"></param>
/// <returns></returns>
public string jscriptFormat(string comando)
{
return "<script language='JavaScript'>" + comando + "</script>";
}
#endregion
#region gestione email & log...
/// <summary>
/// invio email senza log
/// </summary>
/// <param name="_mailFrom"></param>
/// <param name="_mailTo"></param>
/// <param name="_oggetto"></param>
/// <param name="_corpo"></param>
/// <returns></returns>
protected bool mandaEmailNoLog(string _mailFrom, string _mailTo, string _oggetto, string _corpo)
{
bool answ = false;
try
{
answ = SteamWare.gestEmail.ge.mandaEmailNoLog(_mailFrom, _mailTo, _oggetto, _corpo);
}
catch { }
return answ;
}
/// <summary>
/// invio email con log
/// </summary>
/// <param name="_mailFrom"></param>
/// <param name="_mailTo"></param>
/// <param name="_oggetto"></param>
/// <param name="_corpo"></param>
/// <returns></returns>
protected bool mandaEmail(string _mailFrom, string _mailTo, string _oggetto, string _corpo)
{
return SteamWare.gestEmail.ge.mandaEmailNoLog(_mailFrom, _mailTo, _oggetto, _corpo);
}
#endregion
#region gestione dati
/// <summary>
/// caricamento dati applicazione da sessione (B.1.3)
/// </summary>
protected virtual void loadSessionData()
{
}
/// <summary>
/// setup datamanagers...
/// </summary>
protected virtual void setupUserDataMan()
{
}
/// <summary>
/// reset update del modulo corrente
/// </summary>
protected virtual void resetUpdate()
{ }
/// <summary>
/// (ri)carica i dataset del modulo
/// </summary>
protected virtual void forza_Update()
{ }
/// <summary>
/// verifica se tutti i dataset richiesti sono disponibili i cache
/// </summary>
/// <returns></returns>
protected virtual bool datiDisponibili()
{
return true;
}
/// <summary>
/// salva nella cache i dataset caricati
/// </summary>
protected virtual void salvaDati()
{ }
/// <summary>
/// carica dalla cache i dataset necessari
/// </summary>
protected virtual void caricaDati()
{ }
#endregion
#region lettura dataset standard
/// <summary>
/// legge i valori standard x dataset e parametri
/// </summary>
protected void StandardDataLoad()
{
try
{
loadAuthCdC();
}
catch
{ }
}
/// <summary>
/// leggi i parametri di configurazione standard dell'applicativo
/// </summary>
protected void loadDefaultsWebConfig()
{
_righeDataGrid = memLayer.ML.CRI("_righeDataGrid");
_righeDataGridAnagr = memLayer.ML.CRI("_righeDataGridAnagr");
_righeDataGridLong = memLayer.ML.CRI("_righeDataGridLong");
_righeDataGridMed = memLayer.ML.CRI("_righeDataGridMed");
_righeDataGridShort = memLayer.ML.CRI("_righeDataGridShort");
//_righeSelettore = (int)confRead.GetValue("_righeSelettore", typeof(int));
//_ewServer = (string)confRead.GetValue("_ewServer", typeof(string));
//_ewMap = (string)confRead.GetValue("_ewMap", typeof(string));
_adminEmail = memLayer.ML.confReadString("_adminEmail");
_fromEmail = memLayer.ML.confReadString("_fromEmail");
_smtpCli = memLayer.ML.confReadString("_smtpCli");
_logLevel = memLayer.ML.confReadInt("_logLevel");
_safePages = memLayer.ML.confReadString("_safePages");
_commonPages = memLayer.ML.confReadString("_commonPages");
}
/// <summary>
/// genera la stringa dei cdc autorizzati dell'utente
/// </summary>
protected void loadAuthCdC()
{
if (!memLayer.ML.isInSessionObject("_AuthCdC"))
{
_CdCUser = elencoCdC;
memLayer.ML.setSessionVal("_CdCUser", _CdCUser);
_AuthCdC = string.Format(" COD_CDC IN ({0})", _CdCUser);
memLayer.ML.setSessionVal("_AuthCdC", _AuthCdC);
}
else
{
_AuthCdC = memLayer.ML.StringSessionObj("_AuthCdC");
}
}
/// <summary>
/// legge il dataset dei CdC
/// </summary>
protected void loadAllCdC()
{
if (!memLayer.ML.isInCacheObject("_allCdC"))
{
_allCdC = DataWrap.DW.taCdc.GetData();
//Cache["_allCdC"] = _allCdC;
memLayer.ML.setCacheVal("_allCdC", _allCdC, true);
}
else
{
_allCdC = (DataLayer_AnagGen.CDCDataTable)Cache["_allCdC"];
}
}
#endregion
#region autenticazione / autorizzazione =c=
/// <summary>
/// caricamento dati user da sessione (B.1.1)
/// </summary>
protected void LoadUserData()
{
_paginaPrecedente = memLayer.ML.StringSessionObj("_paginaPrecedente");
setupUserDataMan();
loadDefaultsWebConfig();
if (user_std.UtSn.utente != "")
{
StandardDataLoad();
}
}
/// <summary>
/// verifica che l'utente abbia almeno un permesso per la pagina corrente altrimenti redirect ad unauthorized
/// </summary>
protected virtual void SetUpByUserRight()
{
PagCorrente();
// verifica la pagina NON sia di quelle "libere"
if (_safePages.IndexOf(_paginaCorrente) == -1)
{
// verifica l'utente sia autorizzato (in session...)
if (!user_std.UtSn.isAuth)
{
if (_paginaCorrente != "" && _paginaCorrente != "login.aspx")
{
Session["nextPage"] = _paginaCorrente;
}
Response.Redirect("login.aspx");
}
// verifica i permessi dell'utente per almeno vedere la pagina corrente SSE non è una common page...
if (!user_std.UtSn.isPageEnabled(_paginaCorrente) && _commonPages.IndexOf(_paginaCorrente) == -1)
{
logger.lg.scriviLog(string.Format("Errore in SetUpByUserRight: utente {0} non autorizzato per la pagina {1}", user_std.UtSn.utente, _paginaCorrente), tipoLog.STARTUP);
Response.Redirect("~/unauthorized.aspx");
}
}
}
/// <summary>
/// salva in variabile pagina il nome della pagina corrente
/// </summary>
protected virtual void PagCorrente()
{
Uri MyUrl = Request.Url;
string delimStr = "/";
char[] delimiter = delimStr.ToCharArray();
string[] finalUrl = MyUrl.LocalPath.ToString().Split(delimiter);
int n = finalUrl.Length;
_paginaCorrente = finalUrl[n - 1].ToString();
// tolgo .aspx!
_paginaCorrente = _paginaCorrente.Replace(".aspx", "");
if (_paginaPrecedente == "" || _paginaPrecedente == null)
{
_paginaPrecedente = _paginaCorrente;
memLayer.ML.setSessionVal("_paginaPrecedente", _paginaPrecedente);
}
if (_paginaCorrente != _paginaPrecedente)
{
// in questo caso tolgo i vari filtering e gli indici...
memLayer.ML.emptySessionVal("_indexFilt");
memLayer.ML.emptySessionVal("valoreCercato");
_paginaPrecedente = _paginaCorrente;
memLayer.ML.setSessionVal("_paginaPrecedente", _paginaPrecedente);
}
}
/// <summary>
/// selezione delle posizioni cdc autorizzate come stringa di filtraggio su POSIZIONE LIKE, se non ce ne fossero redirige su unauthorized.aspx
/// </summary>
/// <returns></returns>
protected string filtroPosizioneCdC()
{
string Filtraggio;
Filtraggio = " (";
DataLayer_AnagGen.CDCDataTable tblCdc = DataWrap.DW.taCdc.GetTopCdC(user_std.UtSn.utente, user_std.UtSn.dominio, user_std.UtSn.modulo);
if (tblCdc.Rows.Count == 0 && _safePages.IndexOf(_paginaCorrente) == -1)
{
logger.lg.scriviLog(string.Format("Errore in filtroPosizioneCdC: utente {0} non autorizzato per la pagina {1}", user_std.UtSn.utente, _paginaCorrente), tipoLog.STARTUP);
Response.Redirect("~/unauthorized.aspx");
}
foreach (DataLayer_AnagGen.CDCRow riga in tblCdc)
{
// aggiongo solo se non è contenuta la posizione...
if (Filtraggio.IndexOf(riga.POSIZIONE) == -1)
{
// controllo se posizione termina col punto...
if (riga.POSIZIONE.EndsWith("."))
{
Filtraggio += String.Format("(POSIZIONE LIKE '{0}%') OR ", riga.POSIZIONE);
}
else
{
Filtraggio += String.Format("(POSIZIONE LIKE '{0}.%') OR ", riga.POSIZIONE);
}
}
}
int lungFiltr = Filtraggio.Length;
Filtraggio = Filtraggio.Remove(lungFiltr - 3, 3);
Filtraggio += ") ";
return Filtraggio;
}
/// <summary>
/// risponde alla domanda se l'utente abbia permesso tipo writable (S) nel permessi2funzione
/// </summary>
/// <returns></returns>
public bool isWritable()
{
bool answ = false;
if (_paginaCorrente == null)
{
PagCorrente();
}
answ = user_std.UtSn.isPageWriteEnabled(_paginaCorrente);
return answ;
}
#endregion
#region funzioni x sorting & filtering =c=
/// <summary>
/// verifica la condizione booleana e formatta di conseguenza la stringa di filtraggio da accodare al filtro x CdC autorizzati
/// </summary>
/// <param name="_condizione">condizione</param>
/// <param name="_tipoEqual">tipo di eguaglianza</param>
/// <param name="_nomeParam">nome parametro</param>
/// <param name="_valParam">valore parametro</param>
/// <returns></returns>
protected string condFilter(bool _condizione, string _tipoEqual, string _nomeParam, string _valParam)
{
string outFilter = "";
if (_condizione && _valParam != "")
{
if (_tipoEqual == "=")
{
outFilter = " AND (" + _nomeParam.Replace("'", "''") + " = '" + _valParam.Replace("'", "''") + "')";
}
else if (_tipoEqual == "IN")
{
outFilter = String.Format(" AND ({0} IN ({1}))", _nomeParam.Replace("'", "''"), _valParam.Replace("'", "''"));
}
else
{
outFilter = " AND (" + _nomeParam.Replace("'", "''") + " LIKE '%" + _valParam.Replace("'", "''") + "%')";
}
}
return outFilter;
}
/// <summary>
/// crea la stringa di filtraggio x data secondo modalità tipo inizio/fine/durante...
/// </summary>
/// <returns></returns>
protected string dataFilter(bool _condizione, string _tipoPeriodo, string _nomeFrom, string _dataFrom, string _nomeTo, string _dataTo)
{
string outFilter = "";
if (_condizione)
{
// carica i valori dalle textbox... se non ci sono li imposta a:
// start = 01/01/1900
// end = 01/01/2200
try
{
_dataFrom = _dataFrom.Replace(".", "/");
if (_dataFrom == "")
{
_dataFrom = "01/01/1900";
}
}
catch
{
_dataFrom = "01/01/1900";
}
try
{
_dataTo = _dataTo.Replace(".", "/");
if (_dataTo == "")
{
_dataTo = "01/01/2200";
}
}
catch
{
_dataTo = "01/01/2200";
}
switch (_tipoPeriodo)
{
case "1":
// filtro su inizio
outFilter += " AND (" + _nomeFrom + " >= '" + _dataFrom + "' AND " + _nomeFrom + " <= '" + _dataTo + "') ";
break;
case "2":
// filtro su scadenza
outFilter += " AND (" + _nomeTo + " >= '" + _dataFrom + "' AND " + _nomeTo + " <= '" + _dataTo + "') ";
break;
case "3":
// filtro su "in corso"
outFilter += " AND NOT (" + _nomeFrom + " > '" + _dataTo + "' OR " + _nomeTo + " < '" + _dataFrom + "') ";
break;
}
}
return outFilter;
}
/// <summary>
/// crea la stringa di filtraggio x data secondo modalità tipo minoreUguale / uguale / maggioreUguale...
/// </summary>
/// <returns></returns>
protected string dataFilter(bool _condizione, string _tipoPeriodo, string _nome, string _data)
{
string outFilter = "";
if (_condizione)
{
// carica i valori dalle textbox... se non ci sono li imposta a:
// start = 01/01/1900
// end = 01/01/2200
try
{
_data = _data.Replace(".", "/");
if (_data == "")
{
_data = "01/01/1900";
}
}
catch
{
_data = "01/01/1900";
}
switch (_tipoPeriodo)
{
case "<=":
// filtro su inizio
outFilter += " AND (" + _nome + " <= '" + _data + "') ";
break;
case "=":
// filtro su scadenza
outFilter += " AND (" + _nome + " = '" + _data + "') ";
break;
case ">=":
// filtro su "in corso"
outFilter += " AND (" + _nome + " >= '" + _data + "') ";
break;
}
}
return outFilter;
}
/// <summary>
/// verifica la condizione booleana e formatta di conseguenza la stringa di filtraggio tipo LIKE x i campi inseriti separati da # SE valParam !=""
/// </summary>
/// <param name="_elencoCampi"></param>
/// <param name="_valParam"></param>
/// <returns></returns>
protected string likeFilter(string _elencoCampi, string _valParam)
{
string outFilter = "";
if (_valParam != "")
{
outFilter = " AND ( ";
string comandoCompleto = _elencoCampi;
string[] comando = comandoCompleto.Split('#');
int numCampi = comando.GetLength(0);
for (int i = 1; i <= numCampi; i++)
{
outFilter += "(" + comando[i - 1] + " LIKE '%" + _valParam + "%')";
outFilter += " OR ";
}
outFilter = outFilter.Remove(outFilter.Length - 3, 3);
outFilter += " ) ";
}
return outFilter;
}
/// <summary>
/// variabile salvata in view state x la stringa di sorting - dg 2
/// </summary>
protected string SortField2
{
//registra nella viewState la stringa di sorting
//(nome campo + scritta desc o nulla che equivale ad ascending...)
//si può impropriamente usare x + controlli... al max serve 1 click in +...
get
{
object o = ViewState["SortField2"];
if (o == null)
{
return String.Empty;
}
return (string)o;
}
set
{
if (value == SortField2)
{
// same as current sort file, toggle sort direction
SortAscending = !SortAscending;
}
ViewState["SortField2"] = value;
}
}
/// <summary>
/// variabile salvata in view state x la stringa di sorting - dg 2
/// </summary>
protected string SortField
{
//registra nella viewState la stringa di sorting
//(nome campo + scritta desc o nulla che equivale ad ascending...)
//si può impropriamente usare x + controlli... al max serve 1 click in +...
get
{
object o = ViewState["SortField"];
if (o == null)
{
return String.Empty;
}
return (string)o;
}
set
{
if (value == SortField)
{
// same as current sort file, toggle sort direction
SortAscending = !SortAscending;
}
ViewState["SortField"] = value;
}
}
/// <summary>
/// legge e scrive in viewState la stringa di filtraggio...
/// </summary>
protected string FiltString
{
get
{
object o = ViewState["FiltString"];
if (o == null)
{
return String.Empty;
}
return (string)o;
}
set
{
ViewState["FiltString"] = value;
}
}
/// <summary>
/// variabile salvata in viewstate x la direzione del sorting
/// </summary>
protected bool SortAscending
{
//memorizza l'ultima direzione di sort x poterla invertire
get
{
object o = ViewState["SortAscending"];
if (o == null)
{
return true;
}
return (bool)o;
}
set
{
ViewState["SortAscending"] = value;
}
}
/// <summary>
/// genera la stringa filtro x i cdc autorizzati x l'user
/// </summary>
/// <returns></returns>
protected string elencoCdC
{
get
{
// messo qui caricamento dei cdc...
loadAllCdC();
//filtro sui CdC -- ATTENZIONE!!! possibile stack overflow se si supera un filtro con oltre 5000 char di posizioni... loop! vedi 647 mantis
string filtroCompleto = filtroPosizioneCdC();
string filtroCorrente = "";
string Filtraggio;
//dall'elenco dei CdC compone filtro x tabella corrente...
Filtraggio = "";
// setta a 0 il cdc precedente... poi inserisce il cdc SE E SOLO SE è diverso dal precedente: è distinct!!!
string _cdcPrec = "000";
string _cdcCurr = "";
int currPos = 0;
int filtLenght = filtroCompleto.Length;
int currLenght = 0;
// workaround: separo la ricerca in + tranches, andando a prendere solo (circa) 2000 char alla volta...
if (filtroCompleto.Length < 2000)
{
// uso il filtro completo...
Filtraggio = recuperaCdC_daFiltro(filtroCompleto, ref Filtraggio, ref _cdcPrec, ref _cdcCurr);
}
else
{
while (currPos < filtLenght)
{
// se non trova significa che siamo all'ultimo "tratto" da meno di 1900 char...
if (filtLenght - currPos < 2100)
{
currLenght = filtLenght - currPos;
}
else
{
// cerco l'i-esima occorrenza di "(POSIZIONE LIKE" dopo circa 2000 dalla currPos...
currLenght = filtroCompleto.IndexOf("(POSIZIONE", currPos + 1900) - currPos;
}
filtroCorrente = filtroCompleto.Substring(currPos, currLenght);
// se termina con "OR " tolgo...
if (filtroCorrente.EndsWith("OR "))
{
filtroCorrente = filtroCorrente.Remove(currLenght - 3, 3);
}
Filtraggio = recuperaCdC_daFiltro(filtroCorrente, ref Filtraggio, ref _cdcPrec, ref _cdcCurr);
// sposto la posizione corrente...
currPos = currPos + currLenght;
}
}
return Filtraggio;
}
}
/// <summary>
/// esegue la ricerca dei cdc nelle posizioni indicate dal filtro e restituisce elenco distinct degli stessi
/// </summary>
/// <param name="filtroCorrente">filtro con cui cercare i cdc (del tipo " (POSIZIONE LIKE 'T.1.2.3%') OR ... " </param>
/// <param name="Filtraggio">stringa di filtraggio ricostruita per l'elenco dei cdc fino a quel momento trovati</param>
/// <param name="_cdcPrec">ultimo cdc trovato</param>
/// <param name="_cdcCurr">cdc corrente</param>
/// <returns></returns>
private string recuperaCdC_daFiltro(string filtroCorrente, ref string Filtraggio, ref string _cdcPrec, ref string _cdcCurr)
{
// esegue ciclo ricerca
DataView dv = new DataView(_allCdC, filtroCorrente, "COD_CDC", DataViewRowState.CurrentRows);
foreach (DataRowView rowView in dv)
{
_cdcCurr = rowView.Row[0].ToString();
if (_cdcCurr != _cdcPrec && (Filtraggio.IndexOf(_cdcCurr) < 0)) // aggiunta verifica non ci siano duplicati visto che si fa in + tranches la ricerca cdc...
{
Filtraggio += "'" + _cdcCurr + "' , ";
}
_cdcPrec = _cdcCurr;
}
int lungFiltr = Filtraggio.Length;
if (Filtraggio.EndsWith("' , "))
{
Filtraggio = Filtraggio.Remove(lungFiltr - 3, 3);
}
return Filtraggio;
}
#endregion
#region funzioni di conversione da Id dati anagrafici
/// <summary>
/// restituisce il cdc dell'utente data la sua matricola
/// </summary>
/// <param name="val"></param>
/// <returns></returns>
public string cdcUtente(object val)
{
DataLayer_AnagGen.UTENTERow riga = (DataLayer_AnagGen.UTENTERow)DataWrap.DW.taUtente.getByMatricola(val.ToString())[0];
return riga.COD_CDC;
}
/// <summary>
/// restituisce l'utente AS dall'utente win
/// </summary>
/// <param name="utenteWin"></param>
/// <returns></returns>
public string siglaDaUserWin(string utenteWin)
{
string sigla = "__";
try
{
DataLayer_AnagGen.UTENTERow riga = (DataLayer_AnagGen.UTENTERow)DataWrap.DW.taUtente.getByUserName(utenteWin)[0];
sigla = riga.SIGLA;
}
catch
{ }
return sigla;
}
/// <summary>
/// restituisce la descr del CdC
/// </summary>
/// <param name="val"></param>
/// <returns></returns>
public string descrCdcDaId(object val)
{
// cambio sena obj completo in cache
string label = "-";
try
{
label = (DataWrap.DW.taCdc.getByCdc(val.ToString())[0]).DESCRIZIONE;
}
catch
{ }
return label;
}
#endregion
#region funzioni di concatenamento stringhe x comandi hyperlink & help
/// <summary>
/// invia la stringa jscript di conferma pre-cancellazione
/// </summary>
/// <returns></returns>
public string confermaCancellazione()
{
return string.Format("return confirm(\"{0}\");", user_std.UtSn.Traduci("confermaDel"));
}
/// <summary>
/// restituisce la stringa del path corretto per l'immagine richiesta nel formato "~/images/{0}{1}"
/// </summary>
/// <param name="_tipo">verrà usato x posizione {0}, tipo "view"</param>
/// <param name="_dimensione">verrà usato x posizione {1}, tipo "_s.png"</param>
/// <returns></returns>
public string imgPath(tipoImg _tipo, dimImg _dimensione)
{
return imgPath(_tipo, _dimensione, tipoFileImg.png);
}
/// <summary>
/// restituisce la stringa del path corretto per l'immagine richiesta nel formato "~/images/{0}{1}"
/// </summary>
/// <param name="_tipo">verrà usato x posizione {0}, tipo "view"</param>
/// <param name="_dimensione">verrà usato x posizione {1}, tipo "_s.png"</param>
/// <param name="_tipoFile">tipo del file richiesto..."</param>
/// <returns></returns>
public string imgPath(tipoImg _tipo, dimImg _dimensione, tipoFileImg _tipoFile)
{
string _imgName = "unknown";
string _imgDim = "_s";
string _imgType = "png";
switch (_tipo)
{
case tipoImg.annulla:
_imgName = "cancel";
break;
case tipoImg.approva:
_imgName = "approva";
break;
case tipoImg.barcode:
_imgName = "barcode_white";
break;
case tipoImg.barcodeArancio:
_imgName = "barcode_orange";
break;
case tipoImg.clona:
_imgName = "clonaObj";
break;
case tipoImg.conferma:
_imgName = "apply";
break;
case tipoImg.elimina:
_imgName = "elimina";
break;
case tipoImg.modifica:
_imgName = "edit";
break;
case tipoImg.notepad:
_imgName = "notepad";
break;
case tipoImg.notepadPdf:
_imgName = "notepadPdf";
break;
case tipoImg.nuovo:
_imgName = "new";
break;
case tipoImg.seleziona:
_imgName = "view";
break;
case tipoImg.semaforoGiallo:
_imgName = "semaGiallo";
break;
case tipoImg.semaforoRosso:
_imgName = "semaRosso";
break;
case tipoImg.semaforoVerde:
_imgName = "semaVerde";
break;
case tipoImg.stampa:
_imgName = "print";
break;
default:
break;
}
switch (_dimensione)
{
case dimImg.small:
_imgDim = "_s";
break;
case dimImg.medium:
_imgDim = "_m";
break;
case dimImg.large:
_imgDim = "_l";
break;
default:
break;
}
switch (_tipoFile)
{
case tipoFileImg.gif:
_imgType = "gif";
break;
case tipoFileImg.jpg:
_imgType = "jpg";
break;
case tipoFileImg.png:
_imgType = "png";
break;
default:
break;
}
return string.Format("~/images/{0}{1}.{2}", _imgName, _imgDim, _imgType);
}
#endregion
#region funzioni dummy x traduzione
/// <summary>
/// effettua traduzione del lemma
/// </summary>
/// <param name="lemma"></param>
/// <returns></returns>
public string traduci(string lemma)
{
return user_std.UtSn.Traduci(lemma);
}
/// <summary>
/// effettua traduzione in inglese del lemma
/// </summary>
/// <param name="lemma"></param>
/// <returns></returns>
public string traduciEn(string lemma)
{
return user_std.UtSn.TraduciEn(lemma);
}
#endregion
# region gestione visibilità da tipo modulo
/// <summary>
/// definisce visibilità
/// </summary>
/// <param name="cosa"></param>
/// <returns></returns>
public bool isVisible(object cosa)
{
bool visibile;
switch (cosa.ToString())
{
case "Select":
visibile = (_vistaModulo == tipoVistaMod.selezione);
break;
case "Edit":
visibile = (_vistaModulo == tipoVistaMod.editing);
break;
case "Delete":
visibile = (_vistaModulo == tipoVistaMod.editing);
break;
default:
visibile = false;
break;
}
return visibile;
}
/// <summary>
/// tipo di vista del modulo
/// </summary>
public tipoVistaMod vistaModulo
{
get
{
return _vistaModulo;
}
set
{
_vistaModulo = value;
}
}
#endregion
#region gestione eventi e logging
/// <summary>
/// effettua la registrazione degli eventi
/// </summary>
public void registraEventi()
{
// controllo: loggin SOLO se la scheda ha logging abilitato nella riga del db...
bool logEn = memLayer.ML.BoolSessionObj("logEn");
memLayer.ML.emptySessionVal("logEn");
if (logEn)
{
// leggo e svuoto info x logging
string ev2log = memLayer.ML.StringSessionObj("ev2log");
memLayer.ML.emptySessionVal("ev2log");
string valOrig = memLayer.ML.StringSessionObj("valOrig");
memLayer.ML.emptySessionVal("valOrig");
string valNew = memLayer.ML.StringSessionObj("valNew");
memLayer.ML.emptySessionVal("valNew");
string filtEv = memLayer.ML.StringSessionObj("filtEv");
memLayer.ML.emptySessionVal("filtEv");
// solo se almeno uno dei due valori orig e new sono diversi da zero...)
if (valNew != "" || valOrig != "")
{
insEvento(ev2log, valOrig, valNew, filtEv);
}
}
}
/// <summary>
/// effettua l'inserimento vero e proprio dell'evento letto dai valori in session x l'utente corrente...
/// </summary>
/// <param name="ev2log">evento da loggare</param>
/// <param name="valOrig">valori originali</param>
/// <param name="valNew">nuovi valori</param>
/// <param name="filtEv">filtro associato</param>
public virtual void insEvento(string ev2log, string valOrig, string valNew, string filtEv)
{
// effettuo logging evento
log2note.l2n.insEvento(user_std.UtSn.utente, _paginaCorrente, valOrig, valNew, ev2log, filtEv);
}
/// <summary>
/// salva in sessione i valori indicati
/// </summary>
/// <param name="oldVal">dictionary dei valori vecchi</param>
/// <param name="newVal">dictionary dei valori nuovi</param>
/// <param name="logEnabled">bool su abilitazione al log dell'oggetto</param>
/// <param name="ev2log">descrizione evento da loggare</param>
/// <param name="filtroEv">filtro associato all'evento</param>
/// <returns>restituisce il numero di elementi contenuti, -1 significa nessuna differenza...</returns>
public static int setLogValueToSession(Dictionary<string, string> oldVal, Dictionary<string, string> newVal, bool logEnabled, string ev2log, string filtroEv)
{
int answ = -1;
// salvo i valori x logging
confrontoValori.obj.paramOld = oldVal;
confrontoValori.obj.paramNew = newVal;
// faccio generare il diff...
confrontoValori.obj.doDiff();
// logging modifica
memLayer.ML.setSessionVal("ev2log", ev2log);
memLayer.ML.setSessionVal("logEn", logEnabled);
memLayer.ML.setSessionVal("filtEv", filtroEv);
memLayer.ML.setSessionVal("valOrig", confrontoValori.obj.valOld);
memLayer.ML.setSessionVal("valNew", confrontoValori.obj.valNew);
// se ci sono differenze allora restituisco posizione della prima differenza, cercando <BR> nella stringa...
try
{
if (confrontoValori.obj.valNew != "")
{
string[] righe = confrontoValori.obj.valNew.Split('<');
answ = righe.Length;
}
}
catch
{ }
return answ;
}
/// <summary>
/// salva in sessione i valori per un oggetto che sta x essere eliminato
/// </summary>
/// <param name="oldVal">dictionary dei valori vecchi</param>
/// <param name="logEnabled">bool su abilitazione al log dell'oggetto</param>
/// <param name="ev2log">descrizione evento da loggare</param>
/// <param name="filtroEv">filtro associato all'evento</param>
/// <returns>restituisce il numero di elementi contenuti, -1 significa nessuna differenza...</returns>
public static int setLogValueToSession4del(Dictionary<string, string> oldVal, bool logEnabled, string ev2log, string filtroEv)
{
int answ = -1;
// salvo i valori x logging
confrontoValori.obj.paramOld = oldVal;
// faccio generare il diff...
confrontoValori.obj.calcOldVal();
// logging modifica
memLayer.ML.setSessionVal("ev2log", ev2log);
memLayer.ML.setSessionVal("logEn", logEnabled);
memLayer.ML.setSessionVal("filtEv", filtroEv);
memLayer.ML.setSessionVal("valOrig", confrontoValori.obj.valOld);
memLayer.ML.setSessionVal("valNew", "-");
// se ci sono differenze allora restituisco posizione della prima differenza, cercando <BR> nella stringa...
try
{
string[] righe = confrontoValori.obj.valNew.Split('<');
answ = righe.Length;
}
catch
{ }
return answ;
}
/// <summary>
/// wrapper per log con salvataggio dell'IP del chiamante
/// </summary>
/// <param name="_testoPre"></param>
/// <returns></returns>
public bool httpLog(string _testoPre)
{
bool answ = false;
string postazione_IP = "";
try
{
postazione_IP = string.Format(" | {0} | ", Request.UserHostName);
}
catch
{ }
logger.lg.scriviLog(postazione_IP + _testoPre);
return answ;
}
/// <summary>
/// wrapper per log con salvataggio dell'IP del chiamante
/// </summary>
/// <param name="testoLog">The testo log.</param>
/// <param name="tipo">The tipo.</param>
/// <returns></returns>
public bool httpLog(string testoLog, tipoLog tipo)
{
bool answ = false;
string postazione_IP = "";
try
{
postazione_IP = string.Format(" | {0} | ", Request.UserHostName);
}
catch
{ }
logger.lg.scriviLog(postazione_IP + testoLog, tipo);
return answ;
}
/// <summary>
/// event handler generico
/// </summary>
public event EventHandler eh_ucev;
/// <summary>
/// sollevo evento selezione
/// </summary>
protected void raiseEvent(ucEvType evType)
{
// sollevo evento nuovo valore...
if (eh_ucev != null)
{
ucEvent evento = new ucEvent(evType);
eh_ucev(this, evento);
}
}
#endregion
}
}