using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using SteamWare; using MapoDb; namespace MoonProTablet.WebUserControls { public partial class mod_confProd : System.Web.UI.UserControl { /// /// registrato nuovo valore /// public event EventHandler eh_inserting; /// /// registrato nuovo valore /// public event EventHandler eh_newVal; /// /// registrato nuovo valore /// public event EventHandler eh_reset; /// /// caricamento pagina /// /// /// protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { lblOut.Text = ""; } } /// /// idx macchina selezionata /// public int idxMacchina { get { return memLayer.ML.IntSessionObj("IdxMacchina"); } set { memLayer.ML.setSessionVal("IdxMacchina", value); } } /// /// cambio stato visibilità pannello e testo button /// /// /// protected void btnShowConfProd_Click(object sender, EventArgs e) { switchBtnConferma(); } /// /// determina comportamento btn conferma /// private void switchBtnConferma() { txtNumPezzi.Visible = !txtNumPezzi.Visible; btnSalva.Visible = txtNumPezzi.Visible; if (txtNumPezzi.Visible) { btnShowConfProd.Text = "Nascondi Conferma"; DS_ProdTempi.stp_PzProd_getByMacchinaRow rigaProd; rigaProd = DataLayer.obj.taPzProd2conf.GetData(idxMacchina.ToString())[0]; try { txtNumPezzi.Text = rigaProd.pezziNonConfermati.ToString(); // sollevo evento! if (eh_inserting != null) { eh_inserting(this, new EventArgs()); } } catch { txtNumPezzi.Text = "0"; logger.lg.scriviLog(string.Format("Errore recupero pezzi da confermare per la macchina {0}", idxMacchina), tipoLog.ERROR); } } else { btnShowConfProd.Text = "Mostra Conferma"; // sollevo evento! if (eh_reset != null) { eh_reset(this, new EventArgs()); } } } /// /// Numero pezzi confermati /// protected int numPzConfermati { get { int answ = 0; try { answ = Convert.ToInt32(txtNumPezzi.Text); } catch { } return answ; } } /// /// salvo produzione /// /// /// protected void btnSalva_Click(object sender, EventArgs e) { if (memLayer.ML.confReadInt("modoConfProd") == 2) { confermaPerTurni(); } else { confermaPerGiorni(); } // refresh tabella dati tablet... DataLayer.obj.taMSE.getByRefreshData(memLayer.ML.confReadInt("refrMSE_0")); // mostro output lblOut.Text = string.Format("Confermata la produzione per {0} pezzi!", numPzConfermati); // cambio button conferma... switchBtnConferma(); // sollevo evento! if (eh_newVal != null) { eh_newVal(this, new EventArgs()); } } /// /// effettua conferma per giorni della produzione /// private void confermaPerGiorni() { // vecchia chiamata esplicita, uso metodo datalayer (singleton) nuovo... #if false DS_ProdTempi.stp_PzProd_getByMacchinaRow rigaProd = DataLayer.obj.taPzProd2conf.GetData(idxMacchina.ToString())[0]; // chiamo stored stp_ConfermaProduzCompleta(idxMacchina,MatrApp,dataFrom,dataTo,pezziConf) DataLayer.obj.taPzProd2conf.stp_ConfermaProduzCompleta(idxMacchina.ToString(), DataLayer.MatrOpr, rigaProd.DataFrom, rigaProd.DataTo, numPzConfermati, memLayer.ML.confReadInt("modoConfProd")); #endif DataLayer.obj.confermaProdMacchina(idxMacchina.ToString(), memLayer.ML.confReadInt("modoConfProd"), numPzConfermati); } /// /// effettua conferma per turni della produzione /// private void confermaPerTurni() { // vecchia chiamata esplicita, uso metodo datalayer (singleton) nuovo... #if false // carico i dati preliminari: ODL int idxOdl = 0; // userò ODL del turno try { idxOdl = DataLayer.obj.taODL.getByMacchina(idxMacchina.ToString())[0].IdxODL; } catch { logger.lg.scriviLog(string.Format("Errore a recuperare ODL per la macchina {0}", idxMacchina), tipoLog.ERROR); } // carico i dati preliminari: operatore int MatrAppr = DataLayer.MatrOpr; // variabile per ODL del turno DS_ProdTempi.ODLDataTable elencoOdlTurno; // carico i dati da confermare... DS_ProdTempi.stp_PzProd_getByMacchinaRow rigaProd = DataLayer.obj.taPzProd2conf.GetData(idxMacchina.ToString())[0]; // 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.Ceiling(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.getByMacchinaPeriodoNoNull(idxMacchina.ToString(), 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.ToString(), 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.ToString(), MatrAppr, turnoCurr.inizio, turnoCurr.fine, turnoCurr.TNum, idxStatoProd, pzProd); } catch (Exception exc) { logger.lg.scriviLog(string.Format("Errore in INSERT dati x tab DatiConfermati: odl: {0}, idxMacchina: {1}, turno da {2} a {3}, errore{4}{5}", idxOdl, idxMacchina, turnoCurr.inizio, turnoCurr.fine, Environment.NewLine, exc), 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.ToString(), turnoCurr.inizio, turnoCurr.fine, turnoCurr.inizio.Date, turnoCurr.TNum, MatrAppr); } catch (Exception exc) { logger.lg.scriviLog(string.Format("Errore in insert x tab DatiProduzione per il turno: odl: {0}, idxMacchina: {1}, turno da {2} a {3}, errore{4}{5}", idxOdl, idxMacchina, turnoCurr.inizio, turnoCurr.fine, Environment.NewLine, exc), 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.ToString(), rigaProd.DataFrom, rigaProd.DataTo)[0].pezziNonConfermati; } catch { pzProd = 0; } // confermo DELTA tab DatiConfermati DataLayer.obj.taPzProd2conf.stp_DatiConf_conferma(idxOdl, idxMacchina.ToString(), MatrAppr, DateTime.Now, DateTime.Now, 1, idxStatoProd, numPzConfermati - pzProd); // confermo DELTA tab DatiProduzione - ATTENZIONE NON METTO TEMPO NEGATIVO!!! DataLayer.obj.taDatiProd.stp_DatiProd_insert(idxOdl, idxMacchina.ToString(), MatrAppr, DateTime.Now, DateTime.Now, 1, numPzConfermati - pzProd, 0, "T_CorrProd"); // mostro output lblOut.Text = string.Format("Confermata la produzione per {0} pezzi!", numPzConfermati); } catch (Exception exc) { logger.lg.scriviLog(string.Format("Errore nella chiamata a stored di conferma dati!{0}{1}", Environment.NewLine, exc), tipoLog.ERROR); } #endif DataLayer.obj.confermaProdMacchina(idxMacchina.ToString(), memLayer.ML.confReadInt("modoConfProd"), numPzConfermati); } } }