using System; using System.Collections.Generic; using System.Linq; using System.Text; using SteamWare; namespace GMW_data { /// /// classe gestione operazioni con terminalino /// public class TermClass { #region area table adapters // variabile di tipo table adapter #if false public DS_magazzinoTableAdapters.AnagMagTableAdapter taAnagMag; public DS_magazzinoTableAdapters.BlocchiTableAdapter taBlocchi; public DS_magazzinoTableAdapters.CelleTableAdapter taCelle; public DS_magazzinoTableAdapters.TipoCellaTableAdapter taTipoCella; public DS_magazzinoTableAdapters.ElencoCartelliniTableAdapter taCartellini; public DS_magazzinoTableAdapters.PosizioneUdcCorrenteTableAdapter taPosUdcCorr; public DS_magazzinoTableAdapters.PosizioneUdcStoricoTableAdapter taPosUdcStorico; public DS_magazzinoTableAdapters.V_MagazziniOverviewTableAdapter taMagOverw; public DS_magazzinoTableAdapters.V_DettMagPartTableAdapter taDettMagPart; public DS_magazzinoTableAdapters.v_UdcDetailTableAdapter taDettUDC; public DS_magazzinoTableAdapters.ElencoListePrelievoTableAdapter taElencoListePrelievo; public DS_magazzinoTableAdapters.ElencoCartelliniTableAdapter taElencoCartellini; public DS_magazzinoTableAdapters.RigheListePrelievoTableAdapter taRigheListePrelievo; public DS_magazzinoTableAdapters.TipoListaPrelievoTableAdapter taTipoListaPrelievo; public DS_magazzinoTableAdapters.V_ParticolariOverviewTableAdapter taVParticolariOverwiew; public DS_magazzinoTableAdapters.v_particolariEsponenteFiguraTableAdapter taPartExpFig; #endif /// /// init dei table adapters /// protected void initTA() { // istanzio oggetto #if false taAnagMag = new GMW_data.DS_magazzinoTableAdapters.AnagMagTableAdapter(); taBlocchi = new GMW_data.DS_magazzinoTableAdapters.BlocchiTableAdapter(); taCelle = new GMW_data.DS_magazzinoTableAdapters.CelleTableAdapter(); taTipoCella = new GMW_data.DS_magazzinoTableAdapters.TipoCellaTableAdapter(); taCartellini = new GMW_data.DS_magazzinoTableAdapters.ElencoCartelliniTableAdapter(); taPosUdcCorr = new GMW_data.DS_magazzinoTableAdapters.PosizioneUdcCorrenteTableAdapter(); taPosUdcStorico = new GMW_data.DS_magazzinoTableAdapters.PosizioneUdcStoricoTableAdapter(); taMagOverw = new GMW_data.DS_magazzinoTableAdapters.V_MagazziniOverviewTableAdapter(); taDettMagPart = new GMW_data.DS_magazzinoTableAdapters.V_DettMagPartTableAdapter(); taDettUDC = new GMW_data.DS_magazzinoTableAdapters.v_UdcDetailTableAdapter(); taElencoListePrelievo = new GMW_data.DS_magazzinoTableAdapters.ElencoListePrelievoTableAdapter(); taElencoCartellini = new GMW_data.DS_magazzinoTableAdapters.ElencoCartelliniTableAdapter(); taRigheListePrelievo = new GMW_data.DS_magazzinoTableAdapters.RigheListePrelievoTableAdapter(); taTipoListaPrelievo = new GMW_data.DS_magazzinoTableAdapters.TipoListaPrelievoTableAdapter(); taVParticolariOverwiew = new GMW_data.DS_magazzinoTableAdapters.V_ParticolariOverviewTableAdapter(); taPartExpFig = new GMW_data.DS_magazzinoTableAdapters.v_particolariEsponenteFiguraTableAdapter(); #endif } /// /// effettua setup dei connection strings da web.config delal singola applicazione /// protected virtual void setupConnectionStringBase() { // connections del db #if false taAnagMag.Connection.ConnectionString = memLayer.ML.confReadString("GMWConnectionString"); taBlocchi.Connection.ConnectionString = memLayer.ML.confReadString("GMWConnectionString"); taCelle.Connection.ConnectionString = memLayer.ML.confReadString("GMWConnectionString"); taTipoCella.Connection.ConnectionString = memLayer.ML.confReadString("GMWConnectionString"); taCartellini.Connection.ConnectionString = memLayer.ML.confReadString("GMWConnectionString"); taPosUdcCorr.Connection.ConnectionString = memLayer.ML.confReadString("GMWConnectionString"); taPosUdcStorico.Connection.ConnectionString = memLayer.ML.confReadString("GMWConnectionString"); taMagOverw.Connection.ConnectionString = memLayer.ML.confReadString("GMWConnectionString"); taDettMagPart.Connection.ConnectionString = memLayer.ML.confReadString("GMWConnectionString"); taDettUDC.Connection.ConnectionString = memLayer.ML.confReadString("GMWConnectionString"); taElencoListePrelievo.Connection.ConnectionString = memLayer.ML.confReadString("GMWConnectionString"); taElencoCartellini.Connection.ConnectionString = memLayer.ML.confReadString("GMWConnectionString"); taRigheListePrelievo.Connection.ConnectionString = memLayer.ML.confReadString("GMWConnectionString"); taTipoListaPrelievo.Connection.ConnectionString = memLayer.ML.confReadString("GMWConnectionString"); taVParticolariOverwiew.Connection.ConnectionString = memLayer.ML.confReadString("GMWConnectionString"); taPartExpFig.Connection.ConnectionString = memLayer.ML.confReadString("GMWConnectionString"); #endif } #endregion #region Inizializzazione protected TermClass() { 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 login per il CodSoggetto {0}: eccezione {1}", CodSoggetto, e), tipoLog.FATAL); } return answ; } /// /// verifica se il codice barcode letto sia un particoalre 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 barcodeIN) { bool answ = false; try { answ = utils.obj.taSelParticolari.getByConditioValue(barcodeIN, "A").Rows.Count == 1; } catch { } return answ; } /// /// verifica il codice barcode letto e restituisce il tipo di valore corrisponente /// /// /// public tipoCodiceBarcode riconosciBarcode(string barcodeIN) { tipoCodiceBarcode answ = tipoCodiceBarcode.ND; if (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": 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; } break; } } } return answ; } /// /// effettua il reset di tutti i valori in sesisone 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 (resetCella) { memLayer.ML.emptySessionVal("IdxCella_sel"); memLayer.ML.emptySessionVal("codCella_sel"); } if (resetParticolare) { memLayer.ML.emptySessionVal("Particolare_sel"); } if (resetUdc) { memLayer.ML.emptySessionVal("UDC_sel"); } } #endregion } } /// /// 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 sottoinsieme (iniziale ) di datamatrix BMW /// PartNumber, /// /// Codice datamatrix /// DataMatrix, /// /// codice che indica un comando (prefisso da web.config) /// Comando, /// /// Assieme Logico /// AL, /// /// Trattamento Termico /// TT } /// /// 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 }