diff --git a/MP-Admin/WebUserControls/mod_newOdl.ascx.cs b/MP-Admin/WebUserControls/mod_newOdl.ascx.cs index 47293a8f..329ce6e4 100644 --- a/MP-Admin/WebUserControls/mod_newOdl.ascx.cs +++ b/MP-Admin/WebUserControls/mod_newOdl.ascx.cs @@ -3,156 +3,156 @@ using System; namespace MoonPro_site.WebUserControls { - public partial class mod_newOdl : System.Web.UI.UserControl + public partial class mod_newOdl : System.Web.UI.UserControl + { + protected void Page_Load(object sender, EventArgs e) { - protected void Page_Load(object sender, EventArgs e) - { - } - - #region gestione eventi - - public event EventHandler eh_nuovoValore; - - #endregion - - /// - /// conferma inserimento TC - /// - /// - /// - protected void btnOk_Click(object sender, EventArgs e) - { - // controllo se ho tutti i valori ok... - string CodArticolo = ""; - string IdxMacchina = ""; - int numPezzi = 0; - int pzPallet = 1; - decimal TCiclo = 0; - - try - { - CodArticolo = ddlArticolo.SelectedValue; - IdxMacchina = ddlMacchine.SelectedValue; - //IdxMacchina = txtMacchina.Text.Trim(); - // se IdxMacchina è vuoto metto null... - if (IdxMacchina == "") - { - IdxMacchina = "0"; - } - numPezzi = Convert.ToInt32(txtPezzi.Text.Trim()); - TCiclo = Convert.ToDecimal(txtTempoCiclo.Text.Trim().Replace(".", ",")); - pzPallet = Convert.ToInt32(txtPzPallet.Text.Trim()); - MapoDb.DataLayer.obj.taODL.InsertQuery(CodArticolo, IdxMacchina, numPezzi, TCiclo, pzPallet, chkToAs400.Checked, txtCommessa.Text.Trim()); - } - catch - { - logger.lg.scriviLog(string.Format("Non sono riuscito ad inserire l'ODL con i seguenti parametri: {0} | {1} | {2} | {3} | {4}", CodArticolo, IdxMacchina, numPezzi, TCiclo, pzPallet), tipoLog.ERROR); - } - // segnalo update - if (eh_nuovoValore != null) - { - eh_nuovoValore(this, new EventArgs()); - } - } - /// - /// annullamento inserimento - /// - /// - /// - protected void btnCancel_Click(object sender, EventArgs e) - { - if (eh_nuovoValore != null) - { - eh_nuovoValore(this, new EventArgs()); - } - } - /// - /// aggiorno label min e centesimi - /// - /// - /// - protected void txtTempoCiclo_TextChanged(object sender, EventArgs e) - { - string text = ""; - string txtMinCent = txtTempoCiclo.Text.Trim().Replace(".", ","); - int min = 0; - int sec = 0; - try - { - // cerco di convertire in min/sec - min = Convert.ToInt32(Math.Floor(Convert.ToDouble(txtMinCent))); - sec = Convert.ToInt32((Convert.ToDouble(txtMinCent) - min) * 60); - text = string.Format("{0}:{1:00}", min, sec); - } - catch - { } - lblMinSec.Text = text; - } - /// - /// selezione articolo - /// - /// - /// - protected void ddlArticolo_SelectedIndexChanged(object sender, EventArgs e) - { - showLastTimeAndNote(); - } - /// - /// mostro elenco ultimi 5 tempi e note... - /// - private void showLastTimeAndNote() - { - // update tempi ciclo! - grViewTempi.DataBind(); - } - /// - /// selezione impianto - /// - /// - /// - protected void ddlMacchine_SelectedIndexChanged(object sender, EventArgs e) - { - showLastTimeAndNote(); - } - - /// - /// reset della selezione - /// - /// - /// - protected void btnReset_Click(object sender, EventArgs e) - { - resetSelezione(); - } - /// - /// resetta la selezione dei valori in caso di modifiche su altri controlli - /// - public void resetSelezione() - { - grViewTempi.SelectedIndex = -1; - grViewTempi.DataBind(); - } - /// - /// evento selezione riga: salvo tempo e qta nei campi input... - /// - /// - /// - protected void grViewTempi_SelectedIndexChanged(object sender, EventArgs e) - { - // ricavo i dati selezionati - int idxOdl = 0; - try - { - idxOdl = Convert.ToInt32(grViewTempi.SelectedValue); - } - catch - { } - MapoDb.DS_ProdTempi.ODLRow rigaOdl = MapoDb.DataLayer.obj.taODL.getByIdx(idxOdl, false)[0]; - // precompilo dati pezzi/tempi - txtPezzi.Text = rigaOdl.NumPezzi.ToString(); - txtTempoCiclo.Text = rigaOdl.TCAssegnato.ToString("0.00"); - txtPzPallet.Text = rigaOdl.PzPallet.ToString(); - } } + + #region gestione eventi + + public event EventHandler eh_nuovoValore; + + #endregion + + /// + /// conferma inserimento TC + /// + /// + /// + protected void btnOk_Click(object sender, EventArgs e) + { + // controllo se ho tutti i valori ok... + string CodArticolo = ""; + string IdxMacchina = ""; + int numPezzi = 0; + int pzPallet = 1; + decimal TCiclo = 0; + + try + { + CodArticolo = ddlArticolo.SelectedValue; + IdxMacchina = ddlMacchine.SelectedValue; + //IdxMacchina = txtMacchina.Text.Trim(); + // se IdxMacchina è vuoto metto null... + if (IdxMacchina == "") + { + IdxMacchina = "0"; + } + numPezzi = Convert.ToInt32(txtPezzi.Text.Trim()); + TCiclo = Convert.ToDecimal(txtTempoCiclo.Text.Trim().Replace(".", ",")); + pzPallet = Convert.ToInt32(txtPzPallet.Text.Trim()); + MapoDb.DataLayer.obj.taODL.InsertQuery(CodArticolo, MapoDb.DataLayer.MatrOpr, IdxMacchina, numPezzi, TCiclo, pzPallet, chkToAs400.Checked, txtCommessa.Text.Trim()); + } + catch + { + logger.lg.scriviLog(string.Format("Non sono riuscito ad inserire l'ODL con i seguenti parametri: {0} | {1} | {2} | {3} | {4}", CodArticolo, IdxMacchina, numPezzi, TCiclo, pzPallet), tipoLog.ERROR); + } + // segnalo update + if (eh_nuovoValore != null) + { + eh_nuovoValore(this, new EventArgs()); + } + } + /// + /// annullamento inserimento + /// + /// + /// + protected void btnCancel_Click(object sender, EventArgs e) + { + if (eh_nuovoValore != null) + { + eh_nuovoValore(this, new EventArgs()); + } + } + /// + /// aggiorno label min e centesimi + /// + /// + /// + protected void txtTempoCiclo_TextChanged(object sender, EventArgs e) + { + string text = ""; + string txtMinCent = txtTempoCiclo.Text.Trim().Replace(".", ","); + int min = 0; + int sec = 0; + try + { + // cerco di convertire in min/sec + min = Convert.ToInt32(Math.Floor(Convert.ToDouble(txtMinCent))); + sec = Convert.ToInt32((Convert.ToDouble(txtMinCent) - min) * 60); + text = string.Format("{0}:{1:00}", min, sec); + } + catch + { } + lblMinSec.Text = text; + } + /// + /// selezione articolo + /// + /// + /// + protected void ddlArticolo_SelectedIndexChanged(object sender, EventArgs e) + { + showLastTimeAndNote(); + } + /// + /// mostro elenco ultimi 5 tempi e note... + /// + private void showLastTimeAndNote() + { + // update tempi ciclo! + grViewTempi.DataBind(); + } + /// + /// selezione impianto + /// + /// + /// + protected void ddlMacchine_SelectedIndexChanged(object sender, EventArgs e) + { + showLastTimeAndNote(); + } + + /// + /// reset della selezione + /// + /// + /// + protected void btnReset_Click(object sender, EventArgs e) + { + resetSelezione(); + } + /// + /// resetta la selezione dei valori in caso di modifiche su altri controlli + /// + public void resetSelezione() + { + grViewTempi.SelectedIndex = -1; + grViewTempi.DataBind(); + } + /// + /// evento selezione riga: salvo tempo e qta nei campi input... + /// + /// + /// + protected void grViewTempi_SelectedIndexChanged(object sender, EventArgs e) + { + // ricavo i dati selezionati + int idxOdl = 0; + try + { + idxOdl = Convert.ToInt32(grViewTempi.SelectedValue); + } + catch + { } + MapoDb.DS_ProdTempi.ODLRow rigaOdl = MapoDb.DataLayer.obj.taODL.getByIdx(idxOdl, false)[0]; + // precompilo dati pezzi/tempi + txtPezzi.Text = rigaOdl.NumPezzi.ToString(); + txtTempoCiclo.Text = rigaOdl.TCAssegnato.ToString("0.00"); + txtPzPallet.Text = rigaOdl.PzPallet.ToString(); + } + } } \ No newline at end of file diff --git a/MP-Site/WebUserControls/mod_UI.ascx.cs b/MP-Site/WebUserControls/mod_UI.ascx.cs index 6e0857d0..f358f66d 100644 --- a/MP-Site/WebUserControls/mod_UI.ascx.cs +++ b/MP-Site/WebUserControls/mod_UI.ascx.cs @@ -4,843 +4,847 @@ using System; namespace MoonPro.WebUserControls { - public partial class mod_UI : System.Web.UI.UserControl + public partial class mod_UI : System.Web.UI.UserControl + { + protected string _bCode = ""; + protected MapoDb.MapoDb controllerMapo = new MapoDb.MapoDb(); + /// + /// definisce se edit abilitato x utenti "admin" + /// + protected bool adminInput { - protected string _bCode = ""; - protected MapoDb.MapoDb controllerMapo = new MapoDb.MapoDb(); - /// - /// definisce se edit abilitato x utenti "admin" - /// - protected bool adminInput - { - get - { - return memLayer.ML.BoolSessionObj("adminInput"); - } - set - { - memLayer.ML.setSessionVal("adminInput", value); - } - } - /// - /// effettua traduzione del lemma - /// - /// - /// - public string traduci(string lemma) - { - return user_std.UtSn.Traduci(lemma); - } - /// - /// caricamento pagina - /// - /// - /// - protected void Page_Load(object sender, EventArgs e) - { - popolaLabels(); - checkScadenze(); - updateUI(); - updateTurni(); - } - /// - /// aggiorna classi grafiche turni - /// - protected void updateTurni() - { - } - /// - /// verifica che non siano scaduti i termini dell'input utente admine nel caso resetta titoli... - /// - private void checkScadenze() - { - DS_ProdTempi.PostazioniMapoRow rigaPost = DataLayer.obj.taPostazioni.getByIdxPostaz(idxPostazione)[0]; - if (rigaPost == null) - { - logger.lg.scriviLog(string.Format("Errore: manca record postazione per {0}", idxPostazione), tipoLog.ERROR); - } - DateTime scadenza = rigaPost.InputUntil; - if (scadenza < DateTime.Now) - { - if (adminInput) - { - adminInput = false; - memLayer.ML.emptySessionVal("lblTitoloUI"); - memLayer.ML.emptySessionVal("lblMessUI"); - } - } - } - /// - /// controllo se ci sia qualcosa da mostrare... - /// - private void updateUI() - { - bool hasTitolo = memLayer.ML.isInSessionObject("lblTitoloUI"); - bool hasMess = memLayer.ML.isInSessionObject("lblMessUI"); - if (hasTitolo && hasMess) - { - showMess(memLayer.ML.StringSessionObj("lblTitoloUI"), memLayer.ML.StringSessionObj("lblMessUI")); - } - } - /// - /// restituisce una riga operatore data al matricola - /// - /// - /// - protected DS_applicazione.AnagraficaOperatoriRow getRigaOperatore(int MatrOper) - { - try - { - return DataLayer.obj.taOp.getByMatrOpr(MatrOper)[0]; - } - catch - { - logger.lg.scriviLog(string.Format("Codice matricola operatore non trovato! {0}", BarCode)); - return null; - } - } - - /// - /// popola le labels - /// - private void popolaLabels() - { - int odl = 0; - DateTime dataFrom = DateTime.Now; - DateTime dataTo = DateTime.Now; - // label ODL - try - { - DS_ProdTempi.ODLRow rigaOdl = DataLayer.obj.taODL.getByMacchina(idxMacchina)[0]; - odl = rigaOdl.IdxODL; - dataFrom = rigaOdl.DataInizio; - lblOdl.Text = string.Format("ODL num: {0}, iniziato il {1:dd/MM/yy} alle {1:HH:mm}", odl, dataFrom); - } - catch - { - lblOdl.Text = "n/a"; - } - /************************************ - * data la postazione corrente decide cosa mostrare e come - ************************************/ - MapoDb.DS_ProdTempi.stp_repDonati_getDatiProdMacchinaRow rigaProd = DataLayer.obj.taDatiProdMacch.GetData(idxMacchina)[0]; - lblCodArticolo.Text = rigaProd.CodArticolo; - lblNumPzLanciati.Text = string.Format("{0} pz.", rigaProd.PezziLanciati); - lblNumPzConf.Text = string.Format("{0} pz.", rigaProd.PezziConf); - lblNumPzFatti.Text = string.Format("({0} pz.)", rigaProd.PezziProd); - - - /************************************ - * calcolo efficienza totale - * se il calcolo non è possibile mette n/a - ************************************/ - decimal tempoProd = rigaProd.TCAssegnato * rigaProd.PezziConf; - try - { - lblEfficienzaTot.Text = Convert.ToString(String.Format("{0:p2}", tempoProd / rigaProd.TempoOn / 100)); - } - catch - { - lblEfficienzaTot.Text = "n/a"; - } - // calcolo efficienza lavoro - se il calcolo non è possibile mette n/a - try - { - lblEfficienzaLavoro.Text = Convert.ToString(String.Format("{0:p2}", tempoProd / rigaProd.TempoAuto / 100)); - } - catch - { - lblEfficienzaLavoro.Text = "n/a"; - - } - // calcolo efficienza Teorica - se il calcolo non è possibile mette n/a - try - { - lblEfficienzaEff.Text = Convert.ToString(String.Format("{0:p2}", tempoProd / rigaProd.TempoRun / 100)); - } - catch - { - lblEfficienzaEff.Text = "n/a"; - } - - /************************************ - * imposto i TEMPI CICLO - ************************************/ - // riporto Tempo ciclo impostato - lblTcImpostato.Text = Convert.ToString(String.Format("{0:0.###}", rigaProd.TCAssegnato)); - // riporto Tempo ciclo medio - lblTcMedio.Text = Convert.ToString(String.Format("{0:0.###}", rigaProd.TCMedio)); - lblTcMedioRT.Text = Convert.ToString(String.Format("({0:0.###})", rigaProd.TCMedioRT)); - // riporto Tempo ciclo lavoro - lblTcLavoro.Text = Convert.ToString(String.Format("{0:0.###}", rigaProd.TCLav)); - lblTcLavoroRT.Text = Convert.ToString(String.Format("({0:0.###})", rigaProd.TCLavRT)); - // riporto Tempo ciclo effettivo/tecnico, come media dei 10 migliori delle ultime 8 ore - lblTcEffettivo.Text = Convert.ToString(String.Format("{0:0.###}", rigaProd.TCEff)); - lblTcEffettivoRT.Text = Convert.ToString(String.Format("({0:0.###})", rigaProd.TCEffRT)); - - /************************************ - * Sistemo efficienze RT da tempi ciclo - ************************************/ - try - { - lblEfficienzaTotRT.Text = Convert.ToString(String.Format("({0:p2})", rigaProd.TCAssegnato / rigaProd.TCMedioRT)); - } - catch - { - lblEfficienzaTotRT.Text = "n/a"; - } - // calcolo efficienza lavoro - se il calcolo non è possibile mette n/a - try - { - lblEfficienzaLavoroRT.Text = Convert.ToString(String.Format("({0:p2})", rigaProd.TCAssegnato / rigaProd.TCLavRT)); - } - catch - { - lblEfficienzaLavoroRT.Text = "n/a"; - - } - // calcolo efficienza Teorica - se il calcolo non è possibile mette n/a - try - { - lblEfficienzaEffRT.Text = Convert.ToString(String.Format("({0:p2})", rigaProd.TCAssegnato / rigaProd.TCEffRT)); - } - catch - { - lblEfficienzaEffRT.Text = "n/a"; - } - } - - /// - /// codice barcode - /// - public string BarCode - { - set - { - _bCode = value; - // eseguo codice... - decodeBCode(); - } - get - { - return _bCode; - } - } - /// - /// mostra il messaggio indicato - /// - /// - /// - protected void showMess(string titolo, string messaggio) - { - pnlMessaggi.Visible = true; - lblTitolo.Text = titolo; - lblMess.Text = messaggio; - } - /// - /// idxMacchina - /// - public string idxMacchina - { - get - { - return memLayer.ML.StringSessionObj("idxMacchinaUI"); - } - set - { - memLayer.ML.setSessionVal("idxMacchinaUI", value); - setMacchinaPostazione(); - } - } - /// - /// idxPostazione - /// - public string idxPostazione - { - get - { - return memLayer.ML.StringSessionObj("idxPostazioneUI"); - } - set - { - memLayer.ML.setSessionVal("idxPostazioneUI", value); - // calcolo la macchina... - setMacchinaPostazione(); - } - } - /// - /// aggiorna associazione codice macchina e postazione su DB - /// - private void setMacchinaPostazione() - { - // salvo associazione macchina / postazione se entrambe != "" - if (idxMacchina != "" && idxPostazione != "") - { - DataLayer.obj.taPostazioni.updateMacchina(idxPostazione, idxMacchina); - } - } - /// - /// assegna il tipo di barcode dalal stringa passata - /// - /// - private void assegnaTipoBarcode(out tipoBarcode _tipoBCode) - { - // leggo le conf di gestione del barcode - string prefDichProd = memLayer.ML.confReadString("prefDichProd"); - string prefDichFerm = memLayer.ML.confReadString("prefDichFerm"); - string prefDichOp = memLayer.ML.confReadString("prefDichOp"); - string prefDichCodArt = memLayer.ML.confReadString("prefDichCodArt"); - string prefDichAttrezzaggio = memLayer.ML.confReadString("prefDichAttrezzaggio"); - string prefModTurno = memLayer.ML.confReadString("prefModTurno"); - _tipoBCode = tipoBarcode.nd; - // prendo le prime 2 cifre del barcode x capirne la natura - string prefBarcode = BarCode.Substring(0, 2); - if (prefBarcode == prefDichProd) - { - _tipoBCode = tipoBarcode.confermaProduzione; - } - else if (prefBarcode == prefDichFerm) - { - _tipoBCode = tipoBarcode.dichiaraFermata; - } - else if (prefBarcode == prefDichOp) - { - _tipoBCode = tipoBarcode.matrOperatore; - } - else if (prefBarcode == prefDichCodArt) - { - _tipoBCode = tipoBarcode.codArticolo; - } - else if (prefBarcode == prefDichAttrezzaggio) - { - _tipoBCode = tipoBarcode.attrezzaggio; - } - else if (prefBarcode == prefModTurno) - { - _tipoBCode = tipoBarcode.modificaTurno; - } - } - - /// - /// esegue decodifica barcode - /// - private void decodeBCode() - { - // calcolo il tipo di barcode ricevuto - tipoBarcode _tipoBCode; - assegnaTipoBarcode(out _tipoBCode); - // in primis verifico se sia abilitato input alla postazione - if (adminInput) - { - // in base al tipo di barcode definisco il da farsi... - switch (_tipoBCode) - { - case tipoBarcode.nd: - // non faccio nulla - break; - case tipoBarcode.matrOperatore: - processaCartellinoOperatore(); - break; - case tipoBarcode.codArticolo: - // x ora non serve - break; - case tipoBarcode.attrezzaggio: - processaAttrezzaggio(); - break; - case tipoBarcode.confermaProduzione: - processaProduzione(); - break; - case tipoBarcode.dichiaraFermata: - processaDichiaraFermata(); - break; - case tipoBarcode.modificaTurno: - processaModificaTurno(); - break; - default: - break; - } - } - else // edit avanzato non permesso, possibile solo sparare barcode utente... - { - // controllo se sia un barcode utente... - if (_tipoBCode == tipoBarcode.matrOperatore) - { - processaCartellinoOperatore(); - } - else - { - // mostra warning xché interazione non permessa - salvaRicarica("Abilitazione richiesta!", "Codice non accettato: prima registrare barcode utente abilitato"); - } - } - - } - /// - /// chiama modifica stato turno - /// - private void processaModificaTurno() - { - string prefModTurno = memLayer.ML.confReadString("prefModTurno"); - // recupero dati evento... - int numTurno = 0; - try - { - numTurno = Convert.ToInt32(BarCode.Replace(prefModTurno, "")); - } - catch - { - logger.lg.scriviLog(string.Format("Barcode modifica turno non valido! {0}", BarCode)); - } - if (numTurno > 0) - { - DataLayer.obj.taTurniMacc.stp_turniMacchineUpdateTurno(idxMacchina, numTurno); - // ricarico! - salvaRicarica("Dichiarazione fermata", "Registrata modifica turno"); - } - else - { - salvaRicarica("Errore", string.Format("Codice modifica turno non valido! {0}", BarCode)); - } - } - /// - /// contiene in sessione i pezzi da confermare - /// - protected int prod2confirm - { - get - { - int answ = 0; - try - { - answ = memLayer.ML.IntSessionObj("prod2confirm"); - } - catch - { - answ = -1; - } - return answ; - } - set - { - memLayer.ML.setSessionVal("prod2confirm", value); - } - } - /// - /// processa barcode di dichiarazione e conferma produzione - /// - private void processaProduzione() - { - string prefDichProd = memLayer.ML.confReadString("prefDichProd"); - string MostraProd = memLayer.ML.confReadString("MostraProd"); - string ConfermaProd = memLayer.ML.confReadString("ConfermaProd"); - string AnnullaProd = memLayer.ML.confReadString("AnnullaProd"); - string AumentaProd = memLayer.ML.confReadString("AumentaProd"); - string DiminuisciProd = memLayer.ML.confReadString("DiminuisciProd"); - /* *********************************************** - * Processing Produzione - * *********************************************** - * - * regole: - * - serve x iniziare un mostra prod, che salva in sessione la produzione rilevata - * - è accettato, se in sessione c'è un dato di prod, la conferma - * - è accettato la cancellazione (svuota da sessione..) - * - è accettato, se in sessione c'è un dato di prod, aumentare o diminuire la produzione - */ - bool produzioneCaricata = memLayer.ML.isInSessionObject("prod2confirm"); - int variazione = 0; - if (!produzioneCaricata) // se non ho caricato produzione è ammesso solo il comando di caricamento produzione da sistema... - { - if (BarCode == MostraProd) - { - caricaProduzioneMacchina(); - } - else - { - // mostro warning - salvaRicarica("Errore codice produzione", "Deve prima essere richiesta la conferma di produzione per mostrare i dati di produzione e solo successivmaente si può confermare/annullare/modificare"); - } - } - else - { - if (BarCode == MostraProd) - { - caricaProduzioneMacchina(); - } - else if (BarCode == AnnullaProd) - { - memLayer.ML.emptySessionVal("prod2confirm"); - salvaRicarica("Annullata conferma produzione", "annullata operazione conferma di produzioone, prego ricominciare"); - } - else if (BarCode.Substring(0, 3) == AumentaProd) - { - variazione = Convert.ToInt32(BarCode.Replace(AumentaProd, "")); - prod2confirm += variazione; - salvaRicarica("Conferma produzione", string.Format("Pezzi prodotti da confermare: {0}, per il periodo {1:dd/MM/yy HH:mm:ss} --> {2:dd/MM/yy HH:mm:ss}", prod2confirm, DateTime.Now.AddDays(-1), DateTime.Now)); - } - else if (BarCode.Substring(0, 3) == DiminuisciProd) - { - variazione = Convert.ToInt32(BarCode.Replace(DiminuisciProd, "")); - prod2confirm -= variazione; - salvaRicarica("Conferma produzione", string.Format("Pezzi prodotti da confermare: {0}, per il periodo {1:dd/MM/yy HH:mm:ss} --> {2:dd/MM/yy HH:mm:ss}", prod2confirm, DateTime.Now.AddDays(-1), DateTime.Now)); - } - else if (BarCode == ConfermaProd) - { - confermaProduzioneSuDb(); - } - else - { - salvaRicarica("Errore!", string.Format("Codice produzione non riconosciuto: {0}", BarCode)); - } - } - } - /// - /// conferma al produzione sul db - /// - private void confermaProduzioneSuDb() - { - // carico i dati da confermare... - DS_ProdTempi.stp_PzProd_getByMacchinaRow rigaProd; - rigaProd = DataLayer.obj.taPzProd2conf.GetData(idxMacchina)[0]; - // carico i dati necessari x approvatgore ed ODL - int idxOdl = 0; // userò ODL del turno - DS_ProdTempi.ODLDataTable elencoOdlTurno; - int MatrAppr = 0; // leggo da postazioniMapo - try - { - idxOdl = DataLayer.obj.taODL.getByMacchina(idxMacchina)[0].IdxODL; - } - catch - { - logger.lg.scriviLog(string.Format("Errore a recuperare ODL per la macchina {0}", idxMacchina), tipoLog.ERROR); - } - try - { - MatrAppr = DataLayer.obj.taPostazioni.getByIdxPostaz(idxPostazione)[0].MatrOperatore; - } - catch - { - logger.lg.scriviLog(string.Format("Errore a recuperare MatrApp per la postazione {0}", idxPostazione), tipoLog.ERROR); - } - // chiamo la stored - try - { - // ricavo i turni della macchina da anagrafica - // !!!FARE!!! da db incrociando dati da anagrafica... x ora calcolo con turno 8 h x 7 gg/week - int shiftTurno = 6; - int durataTurno = 8; - // calcolo quanti turni da approvare ci siano - int numTurni2appr = (int)Math.Floor(rigaProd.DataTo.Subtract(rigaProd.DataFrom).TotalHours / durataTurno); - // questa dataora rappresenta l'inizio del turno che man mano vado ad approvare - DateTime dataCurr = rigaProd.DataFrom; - turnoLavoro turnoCurr; - int pzProd = 0; - int idxStatoProd = 13; // hard coded!!! - // definisco intervallo date x fare query (inizialmente è turno - intervalloDate periodoOdl = new intervalloDate(); - intervalloDate periodoProd = new intervalloDate(); - // vado a ciclare da dataFrom a dataTo per ogni turno compreso fino all'ultimo turno intero - for (int i = 0; i < numTurni2appr; i++) - { - // calcolo il turno che comprende la data da approvare - turnoCurr = datario.mngr.getTurnoByDateTime(dataCurr, shiftTurno, durataTurno); - // recupero elenco ODL del turno (in modo che se ne ho + di 1 faccio + inserimenti produzione) - elencoOdlTurno = DataLayer.obj.taODL.getByMacchinaPeriodo(idxMacchina, turnoCurr.inizio, turnoCurr.fine); - // se ho almeno 1 ODL approvo... - foreach (DS_ProdTempi.ODLRow odl in elencoOdlTurno) - { - idxOdl = odl.IdxODL; - // calcolo periodo ODL - periodoOdl = datario.mngr.setIntervallo(odl.DataInizio, odl.DataFine); - // calcolo intersezione periodi: tra turno e validità ODL - periodoProd = datario.mngr.intersecaIntervalli(periodoOdl, turnoCurr.periodo); - // calcolo i pezzi da confermare x l'ODL in esame... ovvero imposto inizio/fine periodo da intersezione periodo ODL + turno - try - { - // approvando tanto la produzione - pzProd = DataLayer.obj.taPzProd2conf.getByMacchinaPeriodo(idxMacchina, periodoProd.inizio, periodoProd.fine)[0].pezziNonConfermati; - } - catch - { - pzProd = 0; - } - // carico i dati x Turno ed ODL - try - { - DataLayer.obj.taPzProd2conf.stp_DatiConf_conferma(idxOdl, idxMacchina, MatrAppr, turnoCurr.inizio, turnoCurr.fine, turnoCurr.TNum, idxStatoProd, pzProd); - } - catch - { - logger.lg.scriviLog(string.Format("Errore in INSERT dati x tab DatiConfermati: odl: {0}, idxMacchina: {1}, turno da {2} a {3}", idxOdl, idxMacchina, turnoCurr.inizio, turnoCurr.fine), tipoLog.ERROR); - } - } - // qui non ho + cambiato nulla per multi/ODL - try - { - // chiamo stored inserimento dati produzione per il turno - DataLayer.obj.taDatiProd.stp_DatiProd_insAllPeriodo(idxMacchina, turnoCurr.inizio, turnoCurr.fine, turnoCurr.inizio.Date, turnoCurr.TNum, MatrAppr); - } - catch - { - logger.lg.scriviLog(string.Format("Errore in insert x tab DatiProduzione per il turno: odl: {0}, idxMacchina: {1}, turno da {2} a {3}", idxOdl, idxMacchina, turnoCurr.inizio, turnoCurr.fine), tipoLog.ERROR); - } - dataCurr = dataCurr.AddHours(durataTurno); - } - // IN FINE confermo la produzione della DIFFERENZA tra quanto rilevato a sistema dai tempi ciclo rilevati e quanto dichiarato all'istante della dichiarazione - try - { - pzProd = DataLayer.obj.taPzProd2conf.getByMacchinaPeriodo(idxMacchina, rigaProd.DataFrom, rigaProd.DataTo)[0].pezziNonConfermati; - } - catch - { - pzProd = 0; - } - // confermo DELTA tab DatiConfermati - DataLayer.obj.taPzProd2conf.stp_DatiConf_conferma(idxOdl, idxMacchina, MatrAppr, DateTime.Now, DateTime.Now, 1, idxStatoProd, prod2confirm - pzProd); - // confermo DELTA tab DatiProduzione - ATTENZIONE NON METTO TEMPO NEGATIVO!!! - DataLayer.obj.taDatiProd.stp_DatiProd_insert(idxOdl, idxMacchina, MatrAppr, DateTime.Now, DateTime.Now, 1, prod2confirm - pzProd, 0, "T_CorrProd"); - } - catch - { - logger.lg.scriviLog("Errore nella chiamata a stored di conferma dati!", tipoLog.ERROR); - } - string messConferma = string.Format("Confermata la produzione per {0} pezzi!", prod2confirm); - memLayer.ML.emptySessionVal("prod2confirm"); - salvaRicarica("Confermata produzione", messConferma); - } - /// - /// carica da db la produzione x la macchina in oggetto - /// - private void caricaProduzioneMacchina() - { - DS_ProdTempi.stp_PzProd_getByMacchinaRow rigaProd; - rigaProd = DataLayer.obj.taPzProd2conf.GetData(idxMacchina)[0]; - try - { - prod2confirm = rigaProd.pezziNonConfermati; - } - catch - { - prod2confirm = 0; - logger.lg.scriviLog(string.Format("Errore recupero pezzi da confermare per la macchina {0}", idxMacchina), tipoLog.ERROR); - } - salvaRicarica("Conferma produzione", string.Format("Pezzi prodotti da confermare: {0}, per il periodo {1:dd/MM/yy HH:mm:ss} --> {2:dd/MM/yy HH:mm:ss}", rigaProd.pezziNonConfermati, rigaProd.DataFrom, rigaProd.DataTo)); - } - /// - /// effettua processing delel chiamate di attrezzaggio macchina - /// - private void processaAttrezzaggio() - { - string prefDichAttrezzaggio = memLayer.ML.confReadString("prefDichAttrezzaggio"); - string StartSetup = memLayer.ML.confReadString("StartSetup"); - string EndSetup = memLayer.ML.confReadString("EndSetup"); - string EndProd = memLayer.ML.confReadString("EndProd"); - // recupero dati evento attrezzaggio... - int idxEvento = 0; - try - { - // leggo 3-4 char che rappresenta evento (ignoro il resto che è codice ODL...) - idxEvento = Convert.ToInt32(BarCode.Substring(2, 2)); - } - catch - { - logger.lg.scriviLog(string.Format("Barcode attrezzaggio non valido! {0}", BarCode)); - } - // verifico che l'ODL sia attrezzabile - int idxODL = 0; - DS_ProdTempi.ODLRow rigaOdl; - try - { - idxODL = Convert.ToInt32(BarCode.Substring(4, BarCode.Length - 4)); - rigaOdl = DataLayer.obj.taODL.getByIdx(idxODL, false)[0]; - } - catch - { - logger.lg.scriviLog(string.Format("impossibile ricavare codice ODL per attrezzaggio! {0}", BarCode)); - } - // processo l'evento - if (idxEvento > 0) - { - DS_applicazione.AnagraficaEventiRow rigaEvento = DataLayer.obj.taAnagEventi.GetByIdx(idxEvento)[0]; - if (rigaEvento != null) - { - /* *********************************************** - * Processing ODL - * *********************************************** - * - * regole evento inizio setup: - * - se idxODL già usato --> errore esco - * - se idxODL ok chiudo eventuali ODL precedenti su stessa macchina e segno macchina+ dataora inizio - * - * regole evento fine prod: - * - se idxODL ok lo chiudo (dataora fine) - */ - - // controllo evento inizio attrezzaggio - if (BarCode.StartsWith(StartSetup)) - { - // cerco di nuovo ODL tra i NON impiegati - int odlNonImpiegati = DataLayer.obj.taODL.getByIdx(idxODL, true).Rows.Count; - if (odlNonImpiegati > 0) // effettuo "consumo" ODL - { - DataLayer.obj.taODL.inizioSetup(idxODL, idxMacchina, DataLayer.obj.taODL.getByIdx(idxODL, true)[0].TCAssegnato, ""); - } - else // ODL già impiegato - { - salvaRicarica("Errore ODL", "l'ODL indicato è stato già lanciato, utilizzare un ODL nuovo"); - } - } - else if (BarCode.StartsWith(EndProd)) // evento fine prod - { - // controllo se verificare codice odl da barcode... o se c'è idxOdl zero = manca... - if (!memLayer.ML.confReadBool("chkIdxOdlEndProd") || idxODL == 0) - { - try - { - // leggo idxOdl da ultimo odl attivo x macchina - idxODL = DataLayer.obj.taODL.getByMacchina(idxMacchina)[0].IdxODL; - } - catch - { - logger.lg.scriviLog(string.Format("Errore recupero odl per la macchina {0}", idxMacchina), tipoLog.ERROR); - } - } - // chiudo ODL corrente - DataLayer.obj.taODL.fineProd(idxODL, idxMacchina); - } - DS_applicazione.StatoMacchineRow rigaStato = DataLayer.obj.taStatoMacchine.GetDataByIdxMacchina(idxMacchina)[0]; - // ricavo codice articolo... - string CodArticolo = DataLayer.obj.taODL.getByIdx(idxODL, false)[0].CodArticolo; - // processo evento... - controllerMapo.scriviRigaEventoBarcode(idxMacchina, idxEvento, CodArticolo, "", rigaStato.MatrOpr, rigaStato.pallet); - // ricarico a seconda del tipo di codice - if (BarCode.StartsWith(StartSetup)) - { - salvaRicarica("Dichiarazione fermata", String.Format("Registrata dichiarazione inizio attrezzaggio per ODL {0}", idxODL)); - } - else if (BarCode.StartsWith(EndSetup)) - { - salvaRicarica("Fine attrezzaggio", String.Format("Registrata fine attrezzaggio per ODL {0}", idxODL)); - } - else if (BarCode.StartsWith(EndProd)) - { - salvaRicarica("Fine produzione", String.Format("Registrata fine produzione per ODL {0}", idxODL)); - - } - - } - else - { - salvaRicarica("Errore", string.Format("Codice attrezzaggio non valido! {0}", BarCode)); - } - } - } - /// - /// effettua processing cartellino fermate - /// - private void processaDichiaraFermata() - { - string prefDichFerm = memLayer.ML.confReadString("prefDichFerm"); - // recupero dati evento... - int idxEvento = 0; - try - { - idxEvento = Convert.ToInt32(BarCode.Replace(prefDichFerm, "")); - } - catch - { - logger.lg.scriviLog(string.Format("Barcode fermata non valido! {0}", BarCode)); - } - if (idxEvento > 0) - { - DS_applicazione.AnagraficaEventiRow rigaEvento = DataLayer.obj.taAnagEventi.GetByIdx(idxEvento)[0]; - if (rigaEvento != null) - { - DS_applicazione.StatoMacchineRow rigaStato = DataLayer.obj.taStatoMacchine.GetDataByIdxMacchina(idxMacchina)[0]; - // processo evento... - controllerMapo.scriviRigaEventoBarcode(idxMacchina, idxEvento, rigaStato.CodArticolo, "", rigaStato.MatrOpr, rigaStato.pallet); - // ricarico! - salvaRicarica("Dichiarazione fermata", "Registrata dichiarazione fermata"); - } - else - { - salvaRicarica("Errore", string.Format("Codice evento non valido! {0}", BarCode)); - } - } - } - /// - /// effettua processing cartellino operatore - /// - /// - private void processaCartellinoOperatore() - { - string prefDichOp = memLayer.ML.confReadString("prefDichOp"); - // recupero dati operatore... - int matrOpr = 0; - try - { - matrOpr = Convert.ToInt32(BarCode.Replace(prefDichOp, "")); - } - catch - { - logger.lg.scriviLog(string.Format("Barcode operatore non valido! {0}", BarCode)); - } - if (matrOpr > 0) - { - DS_applicazione.AnagraficaOperatoriRow rigaOperatore = getRigaOperatore(matrOpr); - if (rigaOperatore != null) - { - if (rigaOperatore.isAdmin) - // se è admin apro finestra modifica - { - int minutiUpdateAdmin = memLayer.ML.confReadInt("minutiUpdateAdmin"); - DataLayer.obj.taPostazioni.updateOperatoreAdmin(idxPostazione, matrOpr, minutiUpdateAdmin); - // salvo che sono in stato edit admin - adminInput = true; - // aggiorno pagina - salvaRicarica(string.Format("Benvenuto {0} {1}!", rigaOperatore.Nome, rigaOperatore.Cognome), string.Format("potrai effettuare operazioni amministrative fino alle {0:HH:mm:ss}", DateTime.Now.AddMinutes(minutiUpdateAdmin))); - } - else - // se è user std sostituisco utente corrente su macchina... - { - DataLayer.obj.taStatoMacchine.updateOper(idxMacchina, matrOpr); - salvaRicarica("Cambio Operatore", "effettuato cambio operatore"); - } - } - else - { - salvaRicarica("Errore", string.Format("Matricola operatore non valida! {0}", BarCode)); - } - } - } - /// - /// salva in sessione cosa mostrare x messaggio operatore e ricarica - /// - /// - /// - protected void salvaRicarica(string titolo, string mess) - { - memLayer.ML.setSessionVal("lblTitoloUI", titolo); - memLayer.ML.setSessionVal("lblMessUI", mess); - // rimando a pagina attuale x evitare che "resti aperta " per troppo la finestra... - Response.Redirect(string.Format("~/UI.aspx?idxPostazione={0}&idxMacchina={1}", idxPostazione, idxMacchina)); - } - /// - /// fornisce classe CSS x colorare il turno secondo apertura o meno - /// - /// - /// - public string coloreDaTurno(object turno) - { - string answ = "sGr"; - bool aperto = false; - try - { - aperto = Convert.ToBoolean(turno); - } - catch - { } - if (aperto) answ = "sVe"; - return answ; - } + get + { + return memLayer.ML.BoolSessionObj("adminInput"); + } + set + { + memLayer.ML.setSessionVal("adminInput", value); + } } + /// + /// effettua traduzione del lemma + /// + /// + /// + public string traduci(string lemma) + { + return user_std.UtSn.Traduci(lemma); + } + /// + /// caricamento pagina + /// + /// + /// + protected void Page_Load(object sender, EventArgs e) + { + popolaLabels(); + checkScadenze(); + updateUI(); + updateTurni(); + } + /// + /// aggiorna classi grafiche turni + /// + protected void updateTurni() + { + } + /// + /// verifica che non siano scaduti i termini dell'input utente admine nel caso resetta titoli... + /// + private void checkScadenze() + { + DS_ProdTempi.PostazioniMapoRow rigaPost = DataLayer.obj.taPostazioni.getByIdxPostaz(idxPostazione)[0]; + if (rigaPost == null) + { + logger.lg.scriviLog(string.Format("Errore: manca record postazione per {0}", idxPostazione), tipoLog.ERROR); + } + DateTime scadenza = rigaPost.InputUntil; + if (scadenza < DateTime.Now) + { + if (adminInput) + { + adminInput = false; + memLayer.ML.emptySessionVal("lblTitoloUI"); + memLayer.ML.emptySessionVal("lblMessUI"); + } + } + } + /// + /// controllo se ci sia qualcosa da mostrare... + /// + private void updateUI() + { + bool hasTitolo = memLayer.ML.isInSessionObject("lblTitoloUI"); + bool hasMess = memLayer.ML.isInSessionObject("lblMessUI"); + if (hasTitolo && hasMess) + { + showMess(memLayer.ML.StringSessionObj("lblTitoloUI"), memLayer.ML.StringSessionObj("lblMessUI")); + } + } + /// + /// restituisce una riga operatore data al matricola + /// + /// + /// + protected DS_applicazione.AnagraficaOperatoriRow getRigaOperatore(int MatrOper) + { + try + { + return DataLayer.obj.taOp.getByMatrOpr(MatrOper)[0]; + } + catch + { + logger.lg.scriviLog(string.Format("Codice matricola operatore non trovato! {0}", BarCode)); + return null; + } + } + + /// + /// popola le labels + /// + private void popolaLabels() + { + int odl = 0; + DateTime dataFrom = DateTime.Now; + DateTime dataTo = DateTime.Now; + // label ODL + try + { + DS_ProdTempi.ODLRow rigaOdl = DataLayer.obj.taODL.getByMacchina(idxMacchina)[0]; + odl = rigaOdl.IdxODL; + dataFrom = rigaOdl.DataInizio; + lblOdl.Text = string.Format("ODL num: {0}, iniziato il {1:dd/MM/yy} alle {1:HH:mm}", odl, dataFrom); + } + catch + { + lblOdl.Text = "n/a"; + } + /************************************ + * data la postazione corrente decide cosa mostrare e come + ************************************/ + MapoDb.DS_ProdTempi.stp_repDonati_getDatiProdMacchinaRow rigaProd = DataLayer.obj.taDatiProdMacch.GetData(idxMacchina)[0]; + lblCodArticolo.Text = rigaProd.CodArticolo; + lblNumPzLanciati.Text = string.Format("{0} pz.", rigaProd.PezziLanciati); + lblNumPzConf.Text = string.Format("{0} pz.", rigaProd.PezziConf); + lblNumPzFatti.Text = string.Format("({0} pz.)", rigaProd.PezziProd); + + + /************************************ + * calcolo efficienza totale + * se il calcolo non è possibile mette n/a + ************************************/ + decimal tempoProd = rigaProd.TCAssegnato * rigaProd.PezziConf; + try + { + lblEfficienzaTot.Text = Convert.ToString(String.Format("{0:p2}", tempoProd / rigaProd.TempoOn / 100)); + } + catch + { + lblEfficienzaTot.Text = "n/a"; + } + // calcolo efficienza lavoro - se il calcolo non è possibile mette n/a + try + { + lblEfficienzaLavoro.Text = Convert.ToString(String.Format("{0:p2}", tempoProd / rigaProd.TempoAuto / 100)); + } + catch + { + lblEfficienzaLavoro.Text = "n/a"; + + } + // calcolo efficienza Teorica - se il calcolo non è possibile mette n/a + try + { + lblEfficienzaEff.Text = Convert.ToString(String.Format("{0:p2}", tempoProd / rigaProd.TempoRun / 100)); + } + catch + { + lblEfficienzaEff.Text = "n/a"; + } + + /************************************ + * imposto i TEMPI CICLO + ************************************/ + // riporto Tempo ciclo impostato + lblTcImpostato.Text = Convert.ToString(String.Format("{0:0.###}", rigaProd.TCAssegnato)); + // riporto Tempo ciclo medio + lblTcMedio.Text = Convert.ToString(String.Format("{0:0.###}", rigaProd.TCMedio)); + lblTcMedioRT.Text = Convert.ToString(String.Format("({0:0.###})", rigaProd.TCMedioRT)); + // riporto Tempo ciclo lavoro + lblTcLavoro.Text = Convert.ToString(String.Format("{0:0.###}", rigaProd.TCLav)); + lblTcLavoroRT.Text = Convert.ToString(String.Format("({0:0.###})", rigaProd.TCLavRT)); + // riporto Tempo ciclo effettivo/tecnico, come media dei 10 migliori delle ultime 8 ore + lblTcEffettivo.Text = Convert.ToString(String.Format("{0:0.###}", rigaProd.TCEff)); + lblTcEffettivoRT.Text = Convert.ToString(String.Format("({0:0.###})", rigaProd.TCEffRT)); + + /************************************ + * Sistemo efficienze RT da tempi ciclo + ************************************/ + try + { + lblEfficienzaTotRT.Text = Convert.ToString(String.Format("({0:p2})", rigaProd.TCAssegnato / rigaProd.TCMedioRT)); + } + catch + { + lblEfficienzaTotRT.Text = "n/a"; + } + // calcolo efficienza lavoro - se il calcolo non è possibile mette n/a + try + { + lblEfficienzaLavoroRT.Text = Convert.ToString(String.Format("({0:p2})", rigaProd.TCAssegnato / rigaProd.TCLavRT)); + } + catch + { + lblEfficienzaLavoroRT.Text = "n/a"; + + } + // calcolo efficienza Teorica - se il calcolo non è possibile mette n/a + try + { + lblEfficienzaEffRT.Text = Convert.ToString(String.Format("({0:p2})", rigaProd.TCAssegnato / rigaProd.TCEffRT)); + } + catch + { + lblEfficienzaEffRT.Text = "n/a"; + } + } + + /// + /// codice barcode + /// + public string BarCode + { + set + { + _bCode = value; + // eseguo codice... + decodeBCode(); + } + get + { + return _bCode; + } + } + /// + /// mostra il messaggio indicato + /// + /// + /// + protected void showMess(string titolo, string messaggio) + { + pnlMessaggi.Visible = true; + lblTitolo.Text = titolo; + lblMess.Text = messaggio; + } + /// + /// idxMacchina + /// + public string idxMacchina + { + get + { + return memLayer.ML.StringSessionObj("idxMacchinaUI"); + } + set + { + memLayer.ML.setSessionVal("idxMacchinaUI", value); + setMacchinaPostazione(); + } + } + /// + /// idxPostazione + /// + public string idxPostazione + { + get + { + return memLayer.ML.StringSessionObj("idxPostazioneUI"); + } + set + { + memLayer.ML.setSessionVal("idxPostazioneUI", value); + // calcolo la macchina... + setMacchinaPostazione(); + } + } + /// + /// aggiorna associazione codice macchina e postazione su DB + /// + private void setMacchinaPostazione() + { + // salvo associazione macchina / postazione se entrambe != "" + if (idxMacchina != "" && idxPostazione != "") + { + DataLayer.obj.taPostazioni.updateMacchina(idxPostazione, idxMacchina); + } + } + /// + /// assegna il tipo di barcode dalal stringa passata + /// + /// + private void assegnaTipoBarcode(out tipoBarcode _tipoBCode) + { + // leggo le conf di gestione del barcode + string prefDichProd = memLayer.ML.confReadString("prefDichProd"); + string prefDichFerm = memLayer.ML.confReadString("prefDichFerm"); + string prefDichOp = memLayer.ML.confReadString("prefDichOp"); + string prefDichCodArt = memLayer.ML.confReadString("prefDichCodArt"); + string prefDichAttrezzaggio = memLayer.ML.confReadString("prefDichAttrezzaggio"); + string prefModTurno = memLayer.ML.confReadString("prefModTurno"); + _tipoBCode = tipoBarcode.nd; + // prendo le prime 2 cifre del barcode x capirne la natura + string prefBarcode = BarCode.Substring(0, 2); + if (prefBarcode == prefDichProd) + { + _tipoBCode = tipoBarcode.confermaProduzione; + } + else if (prefBarcode == prefDichFerm) + { + _tipoBCode = tipoBarcode.dichiaraFermata; + } + else if (prefBarcode == prefDichOp) + { + _tipoBCode = tipoBarcode.matrOperatore; + } + else if (prefBarcode == prefDichCodArt) + { + _tipoBCode = tipoBarcode.codArticolo; + } + else if (prefBarcode == prefDichAttrezzaggio) + { + _tipoBCode = tipoBarcode.attrezzaggio; + } + else if (prefBarcode == prefModTurno) + { + _tipoBCode = tipoBarcode.modificaTurno; + } + } + + /// + /// esegue decodifica barcode + /// + private void decodeBCode() + { + // calcolo il tipo di barcode ricevuto + tipoBarcode _tipoBCode; + assegnaTipoBarcode(out _tipoBCode); + // in primis verifico se sia abilitato input alla postazione + if (adminInput) + { + // in base al tipo di barcode definisco il da farsi... + switch (_tipoBCode) + { + case tipoBarcode.nd: + // non faccio nulla + break; + case tipoBarcode.matrOperatore: + processaCartellinoOperatore(); + break; + case tipoBarcode.codArticolo: + // x ora non serve + break; + case tipoBarcode.attrezzaggio: + processaAttrezzaggio(); + break; + case tipoBarcode.confermaProduzione: + processaProduzione(); + break; + case tipoBarcode.dichiaraFermata: + processaDichiaraFermata(); + break; + case tipoBarcode.modificaTurno: + processaModificaTurno(); + break; + default: + break; + } + } + else // edit avanzato non permesso, possibile solo sparare barcode utente... + { + // controllo se sia un barcode utente... + if (_tipoBCode == tipoBarcode.matrOperatore) + { + processaCartellinoOperatore(); + } + else + { + // mostra warning xché interazione non permessa + salvaRicarica("Abilitazione richiesta!", "Codice non accettato: prima registrare barcode utente abilitato"); + } + } + + } + /// + /// chiama modifica stato turno + /// + private void processaModificaTurno() + { + string prefModTurno = memLayer.ML.confReadString("prefModTurno"); + // recupero dati evento... + int numTurno = 0; + try + { + numTurno = Convert.ToInt32(BarCode.Replace(prefModTurno, "")); + } + catch + { + logger.lg.scriviLog(string.Format("Barcode modifica turno non valido! {0}", BarCode)); + } + if (numTurno > 0) + { + DataLayer.obj.taTurniMacc.stp_turniMacchineUpdateTurno(idxMacchina, numTurno); + // ricarico! + salvaRicarica("Dichiarazione fermata", "Registrata modifica turno"); + } + else + { + salvaRicarica("Errore", string.Format("Codice modifica turno non valido! {0}", BarCode)); + } + } + /// + /// contiene in sessione i pezzi da confermare + /// + protected int prod2confirm + { + get + { + int answ = 0; + try + { + answ = memLayer.ML.IntSessionObj("prod2confirm"); + } + catch + { + answ = -1; + } + return answ; + } + set + { + memLayer.ML.setSessionVal("prod2confirm", value); + } + } + /// + /// processa barcode di dichiarazione e conferma produzione + /// + private void processaProduzione() + { + string prefDichProd = memLayer.ML.confReadString("prefDichProd"); + string MostraProd = memLayer.ML.confReadString("MostraProd"); + string ConfermaProd = memLayer.ML.confReadString("ConfermaProd"); + string AnnullaProd = memLayer.ML.confReadString("AnnullaProd"); + string AumentaProd = memLayer.ML.confReadString("AumentaProd"); + string DiminuisciProd = memLayer.ML.confReadString("DiminuisciProd"); + /* *********************************************** + * Processing Produzione + * *********************************************** + * + * regole: + * - serve x iniziare un mostra prod, che salva in sessione la produzione rilevata + * - è accettato, se in sessione c'è un dato di prod, la conferma + * - è accettato la cancellazione (svuota da sessione..) + * - è accettato, se in sessione c'è un dato di prod, aumentare o diminuire la produzione + */ + bool produzioneCaricata = memLayer.ML.isInSessionObject("prod2confirm"); + int variazione = 0; + if (!produzioneCaricata) // se non ho caricato produzione è ammesso solo il comando di caricamento produzione da sistema... + { + if (BarCode == MostraProd) + { + caricaProduzioneMacchina(); + } + else + { + // mostro warning + salvaRicarica("Errore codice produzione", "Deve prima essere richiesta la conferma di produzione per mostrare i dati di produzione e solo successivmaente si può confermare/annullare/modificare"); + } + } + else + { + if (BarCode == MostraProd) + { + caricaProduzioneMacchina(); + } + else if (BarCode == AnnullaProd) + { + memLayer.ML.emptySessionVal("prod2confirm"); + salvaRicarica("Annullata conferma produzione", "annullata operazione conferma di produzioone, prego ricominciare"); + } + else if (BarCode.Substring(0, 3) == AumentaProd) + { + variazione = Convert.ToInt32(BarCode.Replace(AumentaProd, "")); + prod2confirm += variazione; + salvaRicarica("Conferma produzione", string.Format("Pezzi prodotti da confermare: {0}, per il periodo {1:dd/MM/yy HH:mm:ss} --> {2:dd/MM/yy HH:mm:ss}", prod2confirm, DateTime.Now.AddDays(-1), DateTime.Now)); + } + else if (BarCode.Substring(0, 3) == DiminuisciProd) + { + variazione = Convert.ToInt32(BarCode.Replace(DiminuisciProd, "")); + prod2confirm -= variazione; + salvaRicarica("Conferma produzione", string.Format("Pezzi prodotti da confermare: {0}, per il periodo {1:dd/MM/yy HH:mm:ss} --> {2:dd/MM/yy HH:mm:ss}", prod2confirm, DateTime.Now.AddDays(-1), DateTime.Now)); + } + else if (BarCode == ConfermaProd) + { + confermaProduzioneSuDb(); + } + else + { + salvaRicarica("Errore!", string.Format("Codice produzione non riconosciuto: {0}", BarCode)); + } + } + } + /// + /// conferma al produzione sul db + /// + private void confermaProduzioneSuDb() + { + // carico i dati da confermare... + DS_ProdTempi.stp_PzProd_getByMacchinaRow rigaProd; + rigaProd = DataLayer.obj.taPzProd2conf.GetData(idxMacchina)[0]; + // carico i dati necessari x approvatgore ed ODL + int idxOdl = 0; // userò ODL del turno + DS_ProdTempi.ODLDataTable elencoOdlTurno; + int MatrAppr = 0; // leggo da postazioniMapo + try + { + idxOdl = DataLayer.obj.taODL.getByMacchina(idxMacchina)[0].IdxODL; + } + catch + { + logger.lg.scriviLog(string.Format("Errore a recuperare ODL per la macchina {0}", idxMacchina), tipoLog.ERROR); + } + try + { + MatrAppr = DataLayer.obj.taPostazioni.getByIdxPostaz(idxPostazione)[0].MatrOperatore; + } + catch + { + logger.lg.scriviLog(string.Format("Errore a recuperare MatrApp per la postazione {0}", idxPostazione), tipoLog.ERROR); + } + // chiamo la stored + try + { + // ricavo i turni della macchina da anagrafica + // !!!FARE!!! da db incrociando dati da anagrafica... x ora calcolo con turno 8 h x 7 gg/week + int shiftTurno = 6; + int durataTurno = 8; + // calcolo quanti turni da approvare ci siano + int numTurni2appr = (int)Math.Floor(rigaProd.DataTo.Subtract(rigaProd.DataFrom).TotalHours / durataTurno); + // questa dataora rappresenta l'inizio del turno che man mano vado ad approvare + DateTime dataCurr = rigaProd.DataFrom; + turnoLavoro turnoCurr; + int pzProd = 0; + int idxStatoProd = 13; // hard coded!!! + // definisco intervallo date x fare query (inizialmente è turno + intervalloDate periodoOdl = new intervalloDate(); + intervalloDate periodoProd = new intervalloDate(); + // vado a ciclare da dataFrom a dataTo per ogni turno compreso fino all'ultimo turno intero + for (int i = 0; i < numTurni2appr; i++) + { + // calcolo il turno che comprende la data da approvare + turnoCurr = datario.mngr.getTurnoByDateTime(dataCurr, shiftTurno, durataTurno); + // recupero elenco ODL del turno (in modo che se ne ho + di 1 faccio + inserimenti produzione) + elencoOdlTurno = DataLayer.obj.taODL.getByMacchinaPeriodo(idxMacchina, turnoCurr.inizio, turnoCurr.fine); + // se ho almeno 1 ODL approvo... + foreach (DS_ProdTempi.ODLRow odl in elencoOdlTurno) + { + idxOdl = odl.IdxODL; + // calcolo periodo ODL + periodoOdl = datario.mngr.setIntervallo(odl.DataInizio, odl.DataFine); + // calcolo intersezione periodi: tra turno e validità ODL + periodoProd = datario.mngr.intersecaIntervalli(periodoOdl, turnoCurr.periodo); + // calcolo i pezzi da confermare x l'ODL in esame... ovvero imposto inizio/fine periodo da intersezione periodo ODL + turno + try + { + // approvando tanto la produzione + pzProd = DataLayer.obj.taPzProd2conf.getByMacchinaPeriodo(idxMacchina, periodoProd.inizio, periodoProd.fine)[0].pezziNonConfermati; + } + catch + { + pzProd = 0; + } + // carico i dati x Turno ed ODL + try + { + DataLayer.obj.taPzProd2conf.stp_DatiConf_conferma(idxOdl, idxMacchina, MatrAppr, turnoCurr.inizio, turnoCurr.fine, turnoCurr.TNum, idxStatoProd, pzProd); + } + catch + { + logger.lg.scriviLog(string.Format("Errore in INSERT dati x tab DatiConfermati: odl: {0}, idxMacchina: {1}, turno da {2} a {3}", idxOdl, idxMacchina, turnoCurr.inizio, turnoCurr.fine), tipoLog.ERROR); + } + } + // qui non ho + cambiato nulla per multi/ODL + try + { + // chiamo stored inserimento dati produzione per il turno + DataLayer.obj.taDatiProd.stp_DatiProd_insAllPeriodo(idxMacchina, turnoCurr.inizio, turnoCurr.fine, turnoCurr.inizio.Date, turnoCurr.TNum, MatrAppr); + } + catch + { + logger.lg.scriviLog(string.Format("Errore in insert x tab DatiProduzione per il turno: odl: {0}, idxMacchina: {1}, turno da {2} a {3}", idxOdl, idxMacchina, turnoCurr.inizio, turnoCurr.fine), tipoLog.ERROR); + } + dataCurr = dataCurr.AddHours(durataTurno); + } + // IN FINE confermo la produzione della DIFFERENZA tra quanto rilevato a sistema dai tempi ciclo rilevati e quanto dichiarato all'istante della dichiarazione + try + { + pzProd = DataLayer.obj.taPzProd2conf.getByMacchinaPeriodo(idxMacchina, rigaProd.DataFrom, rigaProd.DataTo)[0].pezziNonConfermati; + } + catch + { + pzProd = 0; + } + // confermo DELTA tab DatiConfermati + DataLayer.obj.taPzProd2conf.stp_DatiConf_conferma(idxOdl, idxMacchina, MatrAppr, DateTime.Now, DateTime.Now, 1, idxStatoProd, prod2confirm - pzProd); + // confermo DELTA tab DatiProduzione - ATTENZIONE NON METTO TEMPO NEGATIVO!!! + DataLayer.obj.taDatiProd.stp_DatiProd_insert(idxOdl, idxMacchina, MatrAppr, DateTime.Now, DateTime.Now, 1, prod2confirm - pzProd, 0, "T_CorrProd"); + } + catch + { + logger.lg.scriviLog("Errore nella chiamata a stored di conferma dati!", tipoLog.ERROR); + } + string messConferma = string.Format("Confermata la produzione per {0} pezzi!", prod2confirm); + memLayer.ML.emptySessionVal("prod2confirm"); + salvaRicarica("Confermata produzione", messConferma); + } + /// + /// carica da db la produzione x la macchina in oggetto + /// + private void caricaProduzioneMacchina() + { + DS_ProdTempi.stp_PzProd_getByMacchinaRow rigaProd; + rigaProd = DataLayer.obj.taPzProd2conf.GetData(idxMacchina)[0]; + try + { + prod2confirm = rigaProd.pezziNonConfermati; + } + catch + { + prod2confirm = 0; + logger.lg.scriviLog(string.Format("Errore recupero pezzi da confermare per la macchina {0}", idxMacchina), tipoLog.ERROR); + } + salvaRicarica("Conferma produzione", string.Format("Pezzi prodotti da confermare: {0}, per il periodo {1:dd/MM/yy HH:mm:ss} --> {2:dd/MM/yy HH:mm:ss}", rigaProd.pezziNonConfermati, rigaProd.DataFrom, rigaProd.DataTo)); + } + /// + /// effettua processing delel chiamate di attrezzaggio macchina + /// + private void processaAttrezzaggio() + { + string prefDichAttrezzaggio = memLayer.ML.confReadString("prefDichAttrezzaggio"); + string StartSetup = memLayer.ML.confReadString("StartSetup"); + string EndSetup = memLayer.ML.confReadString("EndSetup"); + string EndProd = memLayer.ML.confReadString("EndProd"); + // recupero dati evento attrezzaggio... + int idxEvento = 0; + try + { + // leggo 3-4 char che rappresenta evento (ignoro il resto che è codice ODL...) + idxEvento = Convert.ToInt32(BarCode.Substring(2, 2)); + } + catch + { + logger.lg.scriviLog(string.Format("Barcode attrezzaggio non valido! {0}", BarCode)); + } + // verifico che l'ODL sia attrezzabile + int idxODL = 0; + DS_ProdTempi.ODLRow rigaOdl; + try + { + idxODL = Convert.ToInt32(BarCode.Substring(4, BarCode.Length - 4)); + rigaOdl = DataLayer.obj.taODL.getByIdx(idxODL, false)[0]; + } + catch + { + logger.lg.scriviLog(string.Format("impossibile ricavare codice ODL per attrezzaggio! {0}", BarCode)); + } + // processo l'evento + if (idxEvento > 0) + { + DS_applicazione.AnagraficaEventiRow rigaEvento = DataLayer.obj.taAnagEventi.GetByIdx(idxEvento)[0]; + if (rigaEvento != null) + { + /* *********************************************** + * Processing ODL + * *********************************************** + * + * regole evento inizio setup: + * - se idxODL già usato --> errore esco + * - se idxODL ok chiudo eventuali ODL precedenti su stessa macchina e segno macchina+ dataora inizio + * + * regole evento fine prod: + * - se idxODL ok lo chiudo (dataora fine) + */ + + // controllo evento inizio attrezzaggio + if (BarCode.StartsWith(StartSetup)) + { + // cerco di nuovo ODL tra i NON impiegati + int odlNonImpiegati = DataLayer.obj.taODL.getByIdx(idxODL, true).Rows.Count; + if (odlNonImpiegati > 0) // effettuo "consumo" ODL + { + DataLayer.obj.taODL.inizioSetup(idxODL, DataLayer.MatrOpr, idxMacchina, DataLayer.obj.taODL.getByIdx(idxODL, true)[0].TCAssegnato, ""); + } + else // ODL già impiegato + { + salvaRicarica("Errore ODL", "l'ODL indicato è stato già lanciato, utilizzare un ODL nuovo"); + } + } + else if (BarCode.StartsWith(EndProd)) // evento fine prod + { + // controllo se verificare codice odl da barcode... o se c'è idxOdl zero = manca... + if (!memLayer.ML.confReadBool("chkIdxOdlEndProd") || idxODL == 0) + { + try + { + // leggo idxOdl da ultimo odl attivo x macchina + idxODL = DataLayer.obj.taODL.getByMacchina(idxMacchina)[0].IdxODL; + } + catch + { + logger.lg.scriviLog(string.Format("Errore recupero odl per la macchina {0}", idxMacchina), tipoLog.ERROR); + } + } + // chiudo ODL corrente + DataLayer.obj.taODL.fineProd(idxODL, idxMacchina); + } + DS_applicazione.StatoMacchineRow rigaStato = DataLayer.obj.taStatoMacchine.GetDataByIdxMacchina(idxMacchina)[0]; + // ricavo codice articolo... + string CodArticolo = DataLayer.obj.taODL.getByIdx(idxODL, false)[0].CodArticolo; + // processo evento... + controllerMapo.scriviRigaEventoBarcode(idxMacchina, idxEvento, CodArticolo, "", rigaStato.MatrOpr, rigaStato.pallet); + // ricarico a seconda del tipo di codice + if (BarCode.StartsWith(StartSetup)) + { + salvaRicarica("Dichiarazione fermata", String.Format("Registrata dichiarazione inizio attrezzaggio per ODL {0}", idxODL)); + } + else if (BarCode.StartsWith(EndSetup)) + { + salvaRicarica("Fine attrezzaggio", String.Format("Registrata fine attrezzaggio per ODL {0}", idxODL)); + } + else if (BarCode.StartsWith(EndProd)) + { + salvaRicarica("Fine produzione", String.Format("Registrata fine produzione per ODL {0}", idxODL)); + + } + + } + else + { + salvaRicarica("Errore", string.Format("Codice attrezzaggio non valido! {0}", BarCode)); + } + } + } + /// + /// effettua processing cartellino fermate + /// + private void processaDichiaraFermata() + { + string prefDichFerm = memLayer.ML.confReadString("prefDichFerm"); + // recupero dati evento... + int idxEvento = 0; + try + { + idxEvento = Convert.ToInt32(BarCode.Replace(prefDichFerm, "")); + } + catch + { + logger.lg.scriviLog(string.Format("Barcode fermata non valido! {0}", BarCode)); + } + if (idxEvento > 0) + { + DS_applicazione.AnagraficaEventiRow rigaEvento = DataLayer.obj.taAnagEventi.GetByIdx(idxEvento)[0]; + if (rigaEvento != null) + { + DS_applicazione.StatoMacchineRow rigaStato = DataLayer.obj.taStatoMacchine.GetDataByIdxMacchina(idxMacchina)[0]; + // processo evento... + controllerMapo.scriviRigaEventoBarcode(idxMacchina, idxEvento, rigaStato.CodArticolo, "", rigaStato.MatrOpr, rigaStato.pallet); + // ricarico! + salvaRicarica("Dichiarazione fermata", "Registrata dichiarazione fermata"); + } + else + { + salvaRicarica("Errore", string.Format("Codice evento non valido! {0}", BarCode)); + } + } + } + /// + /// effettua processing cartellino operatore + /// + /// + private void processaCartellinoOperatore() + { + string prefDichOp = memLayer.ML.confReadString("prefDichOp"); + // recupero dati operatore... + int matrOpr = 0; + try + { + matrOpr = Convert.ToInt32(BarCode.Replace(prefDichOp, "")); + } + catch + { + logger.lg.scriviLog(string.Format("Barcode operatore non valido! {0}", BarCode)); + } + if (matrOpr > 0) + { + DS_applicazione.AnagraficaOperatoriRow rigaOperatore = getRigaOperatore(matrOpr); + if (rigaOperatore != null) + { + if (rigaOperatore.isAdmin) + // se è admin apro finestra modifica + { + int minutiUpdateAdmin = memLayer.ML.confReadInt("minutiUpdateAdmin"); + DataLayer.obj.taPostazioni.updateOperatoreAdmin(idxPostazione, matrOpr, minutiUpdateAdmin); + // salvo che sono in stato edit admin + adminInput = true; + // aggiorno pagina + salvaRicarica(string.Format("Benvenuto {0} {1}!", rigaOperatore.Nome, rigaOperatore.Cognome), string.Format("potrai effettuare operazioni amministrative fino alle {0:HH:mm:ss}", DateTime.Now.AddMinutes(minutiUpdateAdmin))); + } + else + // se è user std sostituisco utente corrente su macchina... + { + DataLayer.obj.taStatoMacchine.updateOper(idxMacchina, matrOpr); + salvaRicarica("Cambio Operatore", "effettuato cambio operatore"); + } + } + else + { + salvaRicarica("Errore", string.Format("Matricola operatore non valida! {0}", BarCode)); + } + } + } + /// + /// salva in sessione cosa mostrare x messaggio operatore e ricarica + /// + /// + /// + protected void salvaRicarica(string titolo, string mess) + { + memLayer.ML.setSessionVal("lblTitoloUI", titolo); + memLayer.ML.setSessionVal("lblMessUI", mess); + // rimando a pagina attuale x evitare che "resti aperta " per troppo la finestra... + Response.Redirect(string.Format("~/UI.aspx?idxPostazione={0}&idxMacchina={1}", idxPostazione, idxMacchina)); + } + /// + /// fornisce classe CSS x colorare il turno secondo apertura o meno + /// + /// + /// + public string coloreDaTurno(object turno) + { + string answ = "sGr"; + bool aperto = false; + try + { + aperto = Convert.ToBoolean(turno); + } + catch + { } + if (aperto) + { + answ = "sVe"; + } + + return answ; + } + } } \ No newline at end of file diff --git a/MP-TAB/WebUserControls/cmp_newODL.ascx.cs b/MP-TAB/WebUserControls/cmp_newODL.ascx.cs index 5e28d874..2fdbdfba 100644 --- a/MP-TAB/WebUserControls/cmp_newODL.ascx.cs +++ b/MP-TAB/WebUserControls/cmp_newODL.ascx.cs @@ -1,11 +1,7 @@ using MapoDb; using SteamWare; using System; -using System.Collections.Generic; -using System.Linq; -using System.Web; using System.Web.UI; -using System.Web.UI.WebControls; namespace MoonProTablet.WebUserControls { @@ -59,7 +55,7 @@ namespace MoonProTablet.WebUserControls decimal tCiclo = numMin + ((decimal)numSec) / 60; string note = txtNote.Text.Trim(); // insert su DB - DataLayer.obj.taODL.insertProvv(ddlArticolo.SelectedValue, idxMacchina, numPz, tCiclo, note); + DataLayer.obj.taODL.insertProvv(ddlArticolo.SelectedValue, MapoDb.DataLayer.MatrOpr, idxMacchina, numPz, tCiclo, note); // calcolo stringa macchina e articolo... var rMacchina = DataLayer.obj.taMacchine.GetByIdx(idxMacchina)[0]; var rArticolo = DataLayer.obj.taAnagArt.getByCod(ddlArticolo.SelectedValue)[0]; @@ -68,7 +64,7 @@ namespace MoonProTablet.WebUserControls // invio email notifica creazione ODL PROVVISORIO (da riconciliare...) string subject = "Effettuato attrezzaggio con ODL provvisorio"; string oggetto = string.Format("E' stato effettuato unattrezzaggio con ODL provvisorio.
Macchina: {0}
Articolo: {1}
Lanciati {2} pezzi con T.Ciclo {3:N3} (min.cent) / {4}:{5} (min:sec).

Note operatore: {6}", macchina, articolo, numPz, tCiclo, numMin, numSec, note); - gestEmail.geAuth.mandaEmail(memLayer.ML.confReadString("_fromEmail"), memLayer.ML.confReadString("_adminEmail"), subject, oggetto); + gestEmail.geAuth.mandaEmail(memLayer.ML.confReadString("_fromEmail"), memLayer.ML.confReadString("_adminEmail"), subject, oggetto); // sollevo evento! if (eh_newVal != null) { diff --git a/MP-TAB/WebUserControls/mod_ODL.ascx.cs b/MP-TAB/WebUserControls/mod_ODL.ascx.cs index af18a04c..b6885f54 100644 --- a/MP-TAB/WebUserControls/mod_ODL.ascx.cs +++ b/MP-TAB/WebUserControls/mod_ODL.ascx.cs @@ -346,7 +346,7 @@ namespace MoonProTablet.WebUserControls try { idxODL = DataLayer.obj.taODL.getByMacchina(idxMacchina)[0].IdxODL; - DataLayer.obj.taODL.splitODL(idxODL, idxMacchina, TCAssegnato(idxODL), string.Format("inizio attrezzaggio, Sospensione ODL {0}, generato residuo con pari TCiclo: {1}", idxODL, TCAssegnato(idxODL)), false); + DataLayer.obj.taODL.splitODL(idxODL, DataLayer.MatrOpr, idxMacchina, TCAssegnato(idxODL), string.Format("inizio attrezzaggio, Sospensione ODL {0}, generato residuo con pari TCiclo: {1}", idxODL, TCAssegnato(idxODL)), false); } catch { } @@ -354,7 +354,7 @@ namespace MoonProTablet.WebUserControls if (EnableRPO) { // creo nuovo ODL da promessa ed associo - DataLayer.obj.taODL.inizioSetupPromessa(idxODLSel, idxMacchina, TCRichAttr, txtNote.Text); + DataLayer.obj.taODL.inizioSetupPromessa(idxODLSel, DataLayer.MatrOpr, idxMacchina, TCRichAttr, txtNote.Text); // salvo ODL attrezzato idxODL_curr = DataLayer.obj.taODL.getByMacchina(idxMacchina)[0].IdxODL; } @@ -362,7 +362,7 @@ namespace MoonProTablet.WebUserControls else { // avvio NUOVO ODL - DataLayer.obj.taODL.inizioSetup(idxODLSel, idxMacchina, TCRichAttr, txtNote.Text); + DataLayer.obj.taODL.inizioSetup(idxODLSel, DataLayer.MatrOpr, idxMacchina, TCRichAttr, txtNote.Text); // salvo ODL Current idxODL_curr = idxODLSel; } @@ -398,7 +398,7 @@ namespace MoonProTablet.WebUserControls int idxODL = DataLayer.obj.taODL.getByMacchina(idxMacchina)[0].IdxODL; int idxEvento = 1; // !!!HARD CODED // aggiorno (se necessario) note e tempo setup - DataLayer.obj.taODL.updateSetup(idxODL, TCRichAttr, txtNote.Text); + DataLayer.obj.taODL.updateSetup(idxODL, DataLayer.MatrOpr, TCRichAttr, txtNote.Text); // controllo se TC Assegnato != TCRichiesto allora invio email x verifiche... DS_ProdTempi.ODLRow rigaOdl = DataLayer.obj.taODL.getByIdx(idxODL, false)[0]; if (rigaOdl.TCAssegnato != TCRichAttr) @@ -448,7 +448,7 @@ namespace MoonProTablet.WebUserControls try { // effettuo split su nuovo ODL - DataLayer.obj.taODL.splitODL(idxODL, idxMacchina, TCAssegnato(idxODL), string.Format("Fine Produzione, Sospensione ODL {0}, generato residuo con pari TCiclo: {1}", idxODL, TCAssegnato(idxODL)), false); + DataLayer.obj.taODL.splitODL(idxODL, DataLayer.MatrOpr, idxMacchina, TCAssegnato(idxODL), string.Format("Fine Produzione, Sospensione ODL {0}, generato residuo con pari TCiclo: {1}", idxODL, TCAssegnato(idxODL)), false); // processo chiusura setup processaEvento(idxEvento, String.Format("Registrata fine produzione per ODL {0}, nuovo ODL per quantità residua", idxODL), idxODL); @@ -538,7 +538,7 @@ namespace MoonProTablet.WebUserControls confermaProdOdl(false); // effettuo split su nuovo ODL - DataLayer.obj.taODL.splitODL(currODL, idxMacchina, TCRichAttr, txtNote.Text, true); + DataLayer.obj.taODL.splitODL(currODL, DataLayer.MatrOpr, idxMacchina, TCRichAttr, txtNote.Text, true); // resetto ODL su redis... DataLayer.emptyCurrODL(idxMacchina);