using SteamWare;
using System;
namespace GMW_data
{
///
/// classe gestione operazioni con terminalino
///
public class TermClass
{
#region area table adapters
///
/// init dei table adapters
///
protected void initTA()
{
// istanzio oggetto
}
///
/// effettua setup dei connection strings da web.config delal singola applicazione
///
protected virtual void setupConnectionStringBase()
{
// connections del db
}
#endregion
#region Inizializzazione
protected TermClass()
{
// init oggetto
initTA();
setupConnectionStringBase();
}
///
/// oggetto static per fare chiamate sul magazzino
///
public static TermClass Ter = new TermClass();
#endregion
#region metodi protected
#if false
///
/// aggiunge le righe liste di prelievo necessarie a soddisfare la richiesta in logica FIFO dato un elenco di cartellini, la qta totale da allocare e la lista attuale
///
///
///
///
private void allocaRigheListaPrelievo(decimal QtaTot, string codListaAttuale, DS_magazzino.ElencoCartelliniDataTable tabellaElencoCartellini)
{
//ricavo il valore UDC della riga del più vecchio
string udcAttuale;
bool qtaOk = false;
bool dataFinished = false;
int progrUdc = 0;
int numUdcDisponibili = tabellaElencoCartellini.Rows.Count;
// contiene la quantità della riga attuale
decimal qtaRiga;
// somma progressiva della qta allocata - calcolo da db!
decimal qtaAllocata = taElencoListePrelievo.getByCodLista(codListaAttuale)[0].Prelevato;
//ciclo WHILE per lo riempimento FIFO con UDC secondo richiesta a partire da elenco fornito
while (!qtaOk && !dataFinished)
{
/*
* crea una riga in righelistaprelievo passando come valori
* il codlista attuale ricavato da sopr
* l'UDC dal primo della tabella getOlderUDC
*
*
* recupero quantità dalla riga corrente;
*
* imposto proposto a 1;
* imposto prelevato 0;
* taRighelistePreliveo.Insert;
*
* qtaAllocata = qtaAllocata + Qta di questa riga (riuso il valore della colonna QTA
* tabella[contatore]; contatore++;
* qtaOk = (qtaAllocata >= qtaRichiesta)
* dataFinished = (contatore >= numRighe);
*
* */
// ricavo la riga più vecchia
qtaRiga = tabellaElencoCartellini[progrUdc].Qta;
udcAttuale = tabellaElencoCartellini[progrUdc].UDC;
// eseguo query di insert
taRigheListePrelievo.Insert(codListaAttuale, udcAttuale, qtaRiga, true, false);
//incremento qta allocata
qtaAllocata = (qtaAllocata + qtaRiga);
//incremento contatore
progrUdc++;
// verifico le condizioni, false se non cambia nulla true se cambia e si esce dal while
qtaOk = (qtaAllocata >= QtaTot);
dataFinished = (progrUdc >= numUdcDisponibili);
}
}
#endif
#endregion
#region Metodi esposti
///
/// Verifica il login utente andando a controllare il CodSoggetto da RilPro e salvando in sessione un oggetto user_std x l'utente corrispondente al cod soggetto secondo la tab soggetti2utente
///
///
/// tipo di errore codificato
public esitoLoginTerm doUserLogin(string CodSoggetto)
{
esitoLoginTerm answ = esitoLoginTerm.errore;
try
{
// verifico che il cod operatore passato sia valido per RilPro.AnagOperatori e Soggetti2Utente
int trovatiAnagOp = DataProxy.obj.taAnagOperatore.getByCodSoggetto(CodSoggetto).Rows.Count;
int trovatiS2U = DataProxy.obj.taSogg2Oper.getByCodSoggetto(CodSoggetto).Rows.Count;
if (trovatiAnagOp == 1)
{
if (trovatiS2U == 1)
{
// è ok, proseguo facendo avvio user
DS_Applicazione.Soggetti2UtenteRow rigaOp = DataProxy.obj.taSogg2Oper.getByCodSoggetto(CodSoggetto)[0];
// inizializzo utente con dati operatore
user_std _utente = new user_std();
user_std.UtSn.isForcedUser = true;
bool fatto = _utente.startUpUtente(rigaOp.DOMINIO, rigaOp.USER_NAME);
if (fatto)
{
answ = esitoLoginTerm.ok;
logger.lg.scriviLog(String.Format("Forced user identity ok: logged as \t {0}\\{1}", user_std.UtSn.dominio, user_std.UtSn.utente), tipoLog.STARTUP);
}
}
else
{
logger.lg.scriviLog(string.Format("Attenzione: trovati {0} utenti in RilPro AnagOperatori e {1} utenti in Soggetti2Utente per il CodSoggetto {2}: login impossibile!", trovatiAnagOp, trovatiS2U, CodSoggetto), tipoLog.ERROR);
answ = esitoLoginTerm.errore_noUser;
}
}
else
{
logger.lg.scriviLog(string.Format("Attenzione: trovati {0} utenti in RilPro AnagOperatori e {1} utenti in Soggetti2Utente per il CodSoggetto {2}: login impossibile!", trovatiAnagOp, trovatiS2U, CodSoggetto), tipoLog.ERROR);
answ = esitoLoginTerm.errore_noCodSogg;
}
}
catch (Exception e)
{
logger.lg.scriviLog(string.Format("Errore in TermClass.doUserLogin per il CodSoggetto {0}: eccezione {1}", CodSoggetto, e), tipoLog.FATAL);
}
return answ;
}
///
/// verifica se il codice barcode letto sia un particolare con codice tipo "P"
///
///
///
public bool isParticolare(string barcodeIN)
{
bool answ = false;
try
{
answ = utils.obj.taSelParticolari.getByConditioValue(barcodeIN, "P").Rows.Count == 1;
}
catch
{ }
return answ;
}
///
/// verifica se il codice barcode letto sia un anima
///
///
///
public bool isAnima(string valore)
{
bool answ = false;
try
{
answ = utils.obj.taSelParticolari.getByConditioValue(valore, "A").Rows.Count == 1;
}
catch
{ }
return answ;
}
///
/// verifica se il codice barcode letto sia
/// - FinitoLiquidi
/// - NON consumato ( maggiore di 0 )
/// - NON spedito ( minore di 200 )
///
/// UDC da verificare
///
public bool isFinitoLiquidiOK(string UDC)
{
bool answ = false;
try
{
answ = DataProxy.obj.taCartellini.getByUdcStatoPosiz(UDC, "FinLiq", 1, 199).Rows.Count == 1;
}
catch
{ }
return answ;
}
///
/// Hash Redis contenente i dati MP di una specifico TYPE (es StatusMacchina, StateMachineIngressi, ...)
///
///
///
public static string mHash(string dataType)
{
return memLayer.ML.redHash(dataType);
}
///
/// Hash dati DECODIFICA BCode
///
///
///
public static string BCDecodeHash(string idxMacchina)
{
return mHash(string.Format("BCDecode:{0}", idxMacchina));
}
///
/// verifica il codice barcode letto e restituisce il tipo di valore corrisponente
///
///
///
public tipoCodiceBarcode riconosciBarcode(string barcodeIN)
{
tipoCodiceBarcode answ = tipoCodiceBarcode.ND;
if (barcodeIN != "")
{
// cerco in sessione redis il valore con quella chiave...
string rCall = "";
bool dataFound = false;
try
{
rCall = memLayer.ML.getRSV(BCDecodeHash(barcodeIN));
if (rCall != "" && rCall != null)
{
dataFound = true;
}
}
catch
{ }
if (dataFound && memLayer.ML.CRB("EnableDecodeCache"))
{
tipoCodiceBarcode.TryParse(rCall, out answ);
}
else
{
// salvo richiesta barcode in cache..
memLayer.ML.setCacheVal("lastBarcodeIN", barcodeIN);
// cerco se sia un particolare...
if (utils.obj.taSelParticolari.getByConditioValue(barcodeIN, "*").Rows.Count == 1)
{
answ = tipoCodiceBarcode.Particolare;
}
// se non lo è continuo
if (answ == tipoCodiceBarcode.ND)
{
switch (barcodeIN.Substring(0, 1))
{
case "O":
answ = tipoCodiceBarcode.Operatore;
break;
case "K":
// se è "KITAN" allora è tipo KIT...
if (barcodeIN.Substring(0, 5) == "KITAN")
{
answ = tipoCodiceBarcode.KitAnime;
}
else
{
answ = tipoCodiceBarcode.ListaPrelievo;
}
break;
//case "P":
//case "A":
// answ = tipoCodiceBarcode.Particolare;
// break;
case "U":
answ = tipoCodiceBarcode.UDC;
break;
case "S":
answ = tipoCodiceBarcode.Cella;
break;
default:
// cerco se la stringa intera abbia un match con le celle...
if (MagClass.magazzino.taCelle.getByCodCella(barcodeIN).Rows.Count == 1)
{
answ = tipoCodiceBarcode.Cella;
}
// 2018.07.04 aggiunta decodifica magClass x AL...
else
{
answ = MagClass.tipoBCode_L4(barcodeIN);
}
break;
}
}
// salvo in cache decodifica
int BCDecodeDurationSec = memLayer.ML.CRI("BCDecodeDurationSec") > 0 ? memLayer.ML.CRI("BCDecodeDurationSec") : 30;
memLayer.ML.setRSV(BCDecodeHash(barcodeIN), answ.ToString(), BCDecodeDurationSec);
}
}
return answ;
}
///
/// effettua il reset di tutti i valori in sessione salvati a valle della scansione di un barcode
///
/// true/false se resettare UDC selezionato
/// true/false se resettare Cella selezionata
/// true/false se resettare Particolare selezionato
public void resetScanBarcode(bool resetUdc, bool resetCella, bool resetParticolare)
{
if (resetUdc)
{
memLayer.ML.emptySessionVal("UDC_sel");
}
if (resetCella)
{
memLayer.ML.emptySessionVal("IdxCella_sel");
memLayer.ML.emptySessionVal("codCella_sel");
}
if (resetParticolare)
{
memLayer.ML.emptySessionVal("Particolare_sel");
}
}
#endregion
}
}
///
/// Classe per decodifica barcode gestita tramite REDIS session values
///
public class BCDecode
{
///
/// init classe
///
protected BCDecode()
{
}
///
/// oggetto static per fare chiamate sul magazzino
///
public static BCDecode obj = new BCDecode();
///
/// Decodifica il barcode e ne determina il tipo, tramite lista decodifica REDIS oppure tramite controllo DB (e poi salva in redis x un tempo predefinito)
///
///
///
public tipoCodiceBarcode getType(string BCode)
{
tipoCodiceBarcode answ = tipoCodiceBarcode.ND;
// durata validità cache REDIS x decodifica
int BCDecodeDurationSec = memLayer.ML.CRI("BCDecodeDurationSec");
if (BCDecodeDurationSec <= 0)
{
BCDecodeDurationSec = 30;
}
// cerco nella cache REDIS
return answ;
}
}
///
/// definisce i tipi di codice che il barcode può leggere
///
public enum tipoCodiceBarcode
{
///
/// Tipo non riconosciuto
///
ND,
///
/// [O] - il barcode rappresenta un codice operatore
///
Operatore,
///
/// [K] - il barcode rappresenta una lista di prelievo
///
ListaPrelievo,
///
/// [U] - il barcode rappresenta un UDC
///
UDC,
///
/// il barcode rappresenta un particolare
///
Particolare,
///
/// Cella [S]
///
Cella,
///
/// codice gitterbox
///
Gitterbox,
///
/// Codice PartNumber come calcolato e valido sottoinsieme di codice datamatrix (BMW, Magneti Marelli, Porsche, ...)
///
DataMatrixDecodificato,
///
/// Codice datamatrix
///
DataMatrixTrovato,
///
/// codice che indica un comando (prefisso da web.config)
///
Comando,
///
/// Assieme Logico
///
AL,
///
/// Trattamento Termico
///
TT,
///
/// Codice di imballo
///
Imballo,
///
/// Marcatore DataOra
///
DateTime,
///
/// Marcatore BarCodeCMD
///
BarCodeCMD,
///
/// Marcatore DataOra e Linea
///
DateTimeLine,
///
/// Tipologia di KIT ANIME
///
KitAnime
}
///
/// elenco degli esiti per una sessione di login da terminalino
///
public enum esitoLoginTerm
{
///
/// tutto ok, come true
///
ok,
///
/// non è andata, errore generico
///
errore,
///
/// errore x mancanza record in tab operatori di RilPro x CodSoggetto
///
errore_noCodSogg,
///
/// errore mancanza username corrisponende all'operatore il cui cod soggetto è stato passato
///
errore_noUser
}