using SteamWare;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;

namespace GMW_data
{
  public class UserControlBCodeMan : GMW_data.UserControl
  {
    /// <summary>
    /// Oggetto locale gestione classe datamatrix...
    /// </summary>
    protected DataMatrix DataMatrix_mgr = new DataMatrix();
    #region Conf stili css

    /// <summary>
    /// stile css comando OK
    /// </summary>
    public string cssOk = "stileComandoOk";
    /// <summary>
    /// stile css comando KO
    /// </summary>
    public string cssErr = "stileComandoKo";
    /// <summary>
    /// stile css comando ND
    /// </summary>
    public string cssWait = "stileComandoND";
    /// <summary>
    /// stile css comando ATTESA
    /// </summary>
    public string cssAtt = "stileAttesa";
    /// <summary>
    /// stile css comando warning
    /// </summary>
    public string cssWarn = "stileComandoWarn";
    /// <summary>
    /// stile css comando ADD
    /// </summary>
    public string cssAdd = "stileComandoAdd";

    #endregion


    #region area base comune (variabili, valori eventi - stati - tipi - posizioni)

    /// <summary>
    /// Abilitato/disabilitato BCode particolare
    /// </summary>
    public bool enableBCodeParticolare = true;
    /// <summary>
    /// flusso associato al controllo
    /// </summary>
    public string flusso = "";
    /// <summary>
    /// flusso PRECEDENTE (ancestor) associato al controllo
    /// </summary>
    public string flussoAnc = "";
    /// <summary>
    /// flusso associato (hard coded) a temporaneo
    /// </summary>
    public string flussoTemp = "";
    /// <summary>
    /// stato associato all'UDC da CREARE
    /// </summary>
    public string statoUDC = "";
    /// <summary>
    /// stato associato all'UDC da accettare
    /// </summary>
    public string statoUDC_pre = "";
    /// <summary>
    /// tipo di evento associato alla creazione dell'UDC
    /// </summary>
    public string eventoUDC = "";
    /// <summary>
    /// tipo di evento associato alla modifica qta dell'UDC
    /// </summary>
    public string eventoUDC_qta = "";
    /// <summary>
    /// codice evento dell'UDC temporaneo (IN) che si crea
    /// </summary>
    public string eventoUDC_temp = "";
    /// <summary>
    /// attributo per TRATTAMENTO termico
    /// </summary>
    public string attrNumTra = "";
    /// <summary>
    /// flusso associato al TRATTAMENTO termico
    /// </summary>
    public string flusso_TR = "";
    /// <summary>
    /// nome var in sessione x IdxCella
    /// </summary>
    public string sVarIdxCella = "";
    /// <summary>
    /// dati x verifica CodSoggetto / matricola
    /// </summary>
    public string preCodSogg = memLayer.ML.cdv("prefCodSogg");
    /// <summary>
    /// Qta Imballo standard
    /// </summary>
    public int QtaImballoStd = memLayer.ML.cdvi("QtaImballoFiniti");
    /// <summary>
    /// codImballo standard
    /// </summary>
    public string CodImballoStd = memLayer.ML.cdv("CodImballoFiniti");
    /// <summary>
    /// Codice linea non utilizzabile ("00" finale = Select...)
    /// </summary>
    public string codLineaKo = "";
    /// <summary>
    /// Tipo UDC della linea x gestione messaggio (es log, ristampa, ...)
    /// </summary>
    public string tipoUdcLinea = "";
    /// <summary>
    /// IdxPosizione x UDC in ingresso
    /// </summary>
    public int IdxPosizioneIn = 0;
    /// <summary>
    /// IdxPosizione x UDC in uscita
    /// </summary>
    public int IdxPosizioneOut = 0;
    /// <summary>
    /// NOME IdxPosizione x UDC in uscita al momento della creazione
    /// </summary>
    public string IdxPosizioneOutTempName = "";
    /// <summary>
    /// IdxPosizione x UDC in uscita al momento della creazione
    /// </summary>
    public int IdxPosizioneOutTemp = 0;
    /// <summary>
    /// Cartellino da stampare/ristampare
    /// </summary>
    public tipoCartellino tipoCartCurr = tipoCartellino.cartND;

    #endregion


    #region area base comune (metodi generali)

    /// <summary>
    /// livello di log richiesto (web.config)
    /// </summary>
    public int logLevel
    {
      get
      {
        int answ = 0;
        try
        {
          answ = memLayer.ML.CRI("_logLevel");
        }
        catch
        { }
        return answ;
      }
    }

    /// <summary>
    /// Impostazione variabili specifiche
    /// </summary>
    public virtual void setupVariabili()
    {
    }
    /// <summary>
    /// caricamento pagina
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    public virtual void Page_Load(object sender, EventArgs e)
    {
      setupVariabili();
      if (!Page.IsPostBack)
      {
        Postazione.messaggiText = "";
        Postazione.warningText = "";
        qta = 0;
        // imposto destAL
        destAL = AlByCella;
        traduciObj();
        idxCella = Postazione.currIdxCella;
        checkNumKeyIn();
        setVisibility();
      }
      doChecks();
    }
    /// <summary>
    /// sistema modalità input
    /// </summary>
    public virtual void setVisibility()
    { }
    /// <summary>
    /// IDX cella associata alla linea corrente
    /// </summary>
    public virtual int idxCella
    {
      get
      {
        int answ = 0;
        if (memLayer.ML.isInSessionObject(sVarIdxCella))
        {
          answ = memLayer.ML.IntSessionObj(sVarIdxCella);
        }
        return answ;
      }
      set
      {
        memLayer.ML.setSessionVal(sVarIdxCella, value);
      }
    }
    /// <summary>
    /// Codice AL associato alla cella corrente...
    /// </summary>
    public virtual string AlByCella
    {
      get
      {
        string answ = "";
        try
        {
          answ = string.Format("ALF00{0}", Postazione.currCodCella);
          // controllo se esista AL sennò lo creo...
          if (MagClass.magazzino.taEA.getByAL(answ).Rows.Count == 0)
          {
            MagClass.magazzino.taEA.Insert(answ, true, DateTime.Now, MagClass.magazzino.CodSoggCurrUser, "", "", "", 0);
          }
        }
        catch
        { }
        return answ;
      }
    }
    /// <summary>
    /// Codice AL sulla linea...
    /// </summary>
    public string currAL
    {
      get
      {
        string answ = "";
        try
        {
          answ = MagClass.magazzino.taAL.getByKey(Postazione.currCodLinea)[0].CurrVal;
        }
        catch
        { }
        return answ;
      }
      set
      {
        MagClass.magazzino.taAL.updateCurrVal(Postazione.currCodLinea, value);
      }
    }
    /// <summary>
    /// Formato Datamatrix della linea selezionata
    /// </summary>
    public string FormatoDtmxLinea
    {
      get
      {
        string answ = "";
        try
        {
          answ = MagClass.magazzino.taAL.getByKey(Postazione.currCodLinea)[0].FormatoDtmx;
        }
        catch
        { }
        return answ;
      }
    }
    /// <summary>
    /// Formato Datamatrix dell'ultimo Datamatrix letto (come barcode)
    /// </summary>
    public string FormatoDtmxBarcode
    {
      get
      {
        return FormatoDtmxDecod(barcodeIn);
      }
    }
    /// <summary>
    /// decodifica formato Datamatrix
    /// </summary>
    public string FormatoDtmxDecod(string datamatrix)
    {
      string answ = "";
      try
      {
        answ = DataMatrix_mgr.taVerifica.GetData(datamatrix)[0].FormatoDtmx;
      }
      catch
      { }
      return answ;
    }
    /// <summary>
    /// Formato Datamatrix da particolare (tab TrascDatamatrix)
    /// </summary>
    public string FormatoDtmxPartic(string Particolare)
    {
      string answ = "";
      try
      {
        answ = DataMatrix_mgr.taTDtmx.getByParticolare(Particolare)[0].FormatoDtmx;
      }
      catch
      { }
      return answ;
    }
    /// <summary>
    /// codice particolare da datamatrix
    /// </summary>
    /// <param name="byTable">boolean:
    /// true = utilizza lookUp su tabella dati acquisiti
    /// false = prova a decodificare (da formato Dtmx linea)</param>
    /// <returns></returns>
    protected string partByDtmx(bool byTable)
    {
      string answ = "";
      if (byTable)
      {
        answ = DataMatrix_mgr.taDtxAcquisiti.getByKey(barcodeIn)[0].Particolare;
      }
      else
      {
        answ = DataMatrix_mgr.taDecode.GetData(barcodeIn, FormatoDtmxLinea)[0].Particolare;
      }
      return answ;
    }

    /// richiesta (ri)stampa UDC
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    public virtual void ristampa()
    {
      ristampaUdc(tipoUdcLinea, udcReq);
    }
    /// <summary>
    /// Richiesta (ri)stampa UDC
    /// </summary>
    /// <param name="tipoUdc">Tipo Udc (x messaggio log/SAO)</param>
    /// <param name="udcReq">Codice UDC</param>
    public virtual void ristampaUdc(string tipoUdc, string udcReq)
    {
      bool fatto = false;
      // registro ri-stampa UDC
      DateTime adesso = DateTime.Now;
      // calcolo particolare...
      DS_magazzino.ElencoCartelliniRow rigaUDC;
      string particolare = "";
      try
      {
        rigaUDC = MagClass.magazzino.taCartellini.getByUdc(udcReq)[0];
        particolare = rigaUDC.Particolare;
        fatto = MagClass.magazzino.ristampaUdc(udcReq, Postazione.printer, Request.UserHostName);
      }
      catch
      {
        logger.lg.scriviLog(string.Format("Errore recupero particolare UDC {0} ({1})", udcReq, tipoUdc), tipoLog.EXCEPTION);
      }
      if (fatto) MagClass.magazzino.taSAO.insertQuery(adesso, MagClass.magazzino.CodSoggCurrUser, Postazione.name, Postazione.IP, udcReq, particolare, "stampaUDC", string.Format("Ri-Stampato UDC {0} ({1}) su linea {2}", udcReq, tipoUdc, Postazione.currCodLinea));
      raiseEvent(ucEvType.ReqUpdateParent);
    }
    /// <summary>
    /// udc da stampare
    /// </summary>
    public virtual string udcReq
    {
      get
      {
        return memLayer.ML.StringSessionObj("udcSelSAO");
      }
    }
    /// <summary>
    /// indica il codice articolo correntemente selezionato
    /// </summary>
    public virtual string currParticolare
    {
      get
      {
        return memLayer.ML.StringSessionObj(string.Format("currParticolare_{0}", uid));
      }
      set
      {
        memLayer.ML.setSessionVal(string.Format("currParticolare_{0}", uid), value, memLayer.ML.confReadBool("keepParticolareSel"));
      }
    }
    /// <summary>
    /// Codice AL in carico
    /// </summary>
    public virtual string sourceAL
    {
      get
      {
        return "";
      }
      set
      { }
    }
    /// <summary>
    /// Codice AL target
    /// </summary>
    public virtual string destAL
    {
      get
      {
        return "";
      }
      set
      { }
    }
    /// <summary>
    /// indica il codice articolo "originale" in caso di trascodifica GRZ/GRZ o GRZ/LVT o LVT/LVT
    /// </summary>
    public virtual string origParticolare
    {
      get
      {
        return memLayer.ML.StringSessionObj(string.Format("origParticolare_{0}", uid));
      }
      set
      {
        memLayer.ML.setSessionVal(string.Format("origParticolare_{0}", uid), value, memLayer.ML.confReadBool("keepParticolareSel"));
      }
    }
    /// <summary>
    /// indica UDC correntemente selezionato
    /// </summary>
    public virtual string currUDC
    {
      get
      {
        return memLayer.ML.StringSessionObj(string.Format("UDC_{0}", uid));
      }
      set
      {
        memLayer.ML.setSessionVal(string.Format("UDC_{0}", uid), value, memLayer.ML.confReadBool("keepParticolareSel"));
      }
    }
    /// <summary>
    /// Recupera descrizione e disegno dato un particolare
    /// </summary>
    /// <param name="CodParticolare"></param>
    /// <param name="descr"></param>
    /// <param name="disegno"></param>
    public virtual void getDescrDisegnoParticolare(string CodParticolare, ref string descr, ref string disegno)
    {
      try
      {
        DS_magazzino.AnagParticolariRow riga = MagClass.magazzino.taAnagPart.likeSearch(CodParticolare, CodCs)[0];
        descr = riga.DescParticolare;
        disegno = string.Format("( {0} )", riga.DisegnoGrezzo);
      }
      catch
      { }
    }
    /// <summary>
    /// effettua controlli visibilità
    /// </summary>
    public virtual void doChecks()
    {
      checkBarcode();
      checkStampa();
      checkParticolare();
    }
    /// <summary>
    /// controllo l'abilitazione alla stampa UDC:
    /// - particolare ok
    /// - qta > 0
    /// - udc da consumo totale/parziale
    /// altrimenti disabilito btn stampa
    /// </summary>
    public virtual void checkStampa()
    { }
    /// <summary>
    /// controlla particolare selezionato
    /// </summary>
    public virtual void checkParticolare()
    { }
    /// <summary>
    /// valore barcode
    /// </summary>
    public virtual string barcodeIn
    {
      get
      {
        return "";
      }
      set
      { }
    }
    /// <summary>
    /// valore barcode
    /// </summary>
    public virtual DateTime lastCall
    {
      get
      {
        DateTime answ = DateTime.Now.AddHours(-1);
        try
        {
          if (memLayer.ML.isInSessionObject(string.Format("lastCall_", uid)))
          {
            answ = memLayer.ML.DateTimeSessionObj(string.Format("lastCall_", uid));
          }
        }
        catch
        { }
        return answ;
      }
      set
      {
        memLayer.ML.setSessionVal(string.Format("lastCall_", uid), value);
      }
    }
    /// <summary>
    /// valore barcode
    /// </summary>
    public virtual string lastBarcodeIn
    {

      get
      {
        return memLayer.ML.StringSessionObj(string.Format("lastBarcode_{0}", uid));
      }
      set
      {
        memLayer.ML.setSessionVal(string.Format("lastBarcode_{0}", uid), value, false);
      }
    }
    /// <summary>
    /// verifico se ci sia in sessione un input da NumKeyb e nel caso lo metto in barcodeIn e processo...
    /// </summary>
    public virtual void checkNumKeyIn()
    {
      if (memLayer.ML.isInSessionObject("numKeyIn"))
      {
        barcodeIn = memLayer.ML.StringSessionObj("numKeyIn");
        // svuoto valore in sessione...
        memLayer.ML.emptySessionVal("numKeyIn");
        // controllo barcode...
        checkBarcode();
      }
    }
    /// <summary>
    /// cod imballo dell'ultimo UDC del particolare generato
    /// </summary>
    public virtual string lastCodImb
    {
      get
      {
        string answ = "";
        try
        {
          answ = MagClass.magazzino.taCartellini.getLastByParticolareStato(CodCs, currParticolare, statoUDC, false)[0].CodImballo;
        }
        catch
        {
          answ = CodImballoStd;
        }
        return answ;
      }
    }
    /// <summary>
    ///  num pezzi dell'ultimo UDC del particolare generato
    /// </summary>
    public virtual int pezziUdc
    {
      get
      {
        int answ = 0;
        try
        {
          answ = (int)MagClass.magazzino.taCartellini.getLastByParticolareStato(CodCs, currParticolare, statoUDC, false)[0].Qta;
        }
        catch
        {
          answ = QtaImballoStd;
        }
        return answ;
      }
    }
    /// <summary>
    /// qta pezzi TOTALE
    /// </summary>
    public virtual int qta
    {
      get
      {
        return 0;
      }
      set
      { }
    }
    /// <summary>
    /// Note Utente
    /// </summary>
    public virtual string campoNote
    {
      get
      {
        return "";
      }
      set
      { }
    }
    /// <summary>
    /// Imballo selezionato
    /// </summary>
    public virtual string imballoSel
    {
      get
      {
        return "";
      }
      set
      { }
    }
    /// <summary>
    /// Metodo aggiornamento qta    
    /// </summary>
    public virtual void aggiornaQta()
    {
      MagClass.magazzino.taCartellini.updateQty(currUDC, MagClass.magazzino.CodSoggCurrUser, "U", eventoUDC_qta, qta);
      currUDC = "";
      currParticolare = "";
    }
    /// <summary>
    /// effettua reset dati
    /// </summary>
    public virtual void doResetData()
    {
      // resetto i dati QtaTot e particolare...
      qta = 0;
      currParticolare = "";
      doChecks();
    }
    /// <summary>
    /// verifica se attivo filtro company e imposta ods di conseguenza...
    /// </summary>
    public virtual void checkFixOds()
    {
    }
    /// <summary>
    /// aggiorna tabella + focus a barcode
    /// </summary>
    public virtual void doUpdate()
    {
      idxCella = Postazione.currIdxCella;
      destAL = AlByCella;
      setVisibility();
      checkStampa();
      // altri step in versione specifica
    }
    /// <summary>
    /// imposto i dati dal particolare corrente
    /// </summary>
    public virtual void impostaParticolare()
    {
      // controllo esista il particolare scansionato
      if (DataProxy.obj.taAnagParticolari.getByParticolare(currParticolare).Rows.Count == 0)
      {
        currParticolare = "";
        Postazione.messaggiText += " - codice particolare non valido / non trovato in RILPRO.";
        Postazione.CssClass = cssErr;
      }
      else
      {
        Postazione.messaggiText += " - impostato particolare!";
        Postazione.CssClass = cssOk;
      }
      // leggo la qta dell'ultimo UDC del particolare, SE C'E', e la imposto...
      if (pezziUdc > 0)
      {
        qta = pezziUdc;
      }
      else // rimette default
      {
        qta = memLayer.ML.cdvi("QtaImballoFiniti");
      }
      selezionaImballo();
    }
    /// <summary>
    /// metodo stub selezione imballo
    /// </summary>
    public virtual void selezionaImballo()
    {
      try
      {
        if (lastCodImb != "")
        {
          if (!trySetImballo(lastCodImb))
          {
            // preseleziono
            imballoSel = CodImballoStd;
          }
        }
        else
        {
          // preseleziono
          imballoSel = CodImballoStd;
        }
      }
      catch
      { }
    }
    /// <summary>
    /// determina se sia possibile cancellare un record, se qta > 0
    /// </summary>
    /// <param name="_qta"></param>
    /// <returns></returns>
    public virtual bool canDelete(object _qta)
    {
      bool answ = false;
      try
      {
        answ = Convert.ToInt32(_qta) == 0;
      }
      catch
      { }
      return answ;
    }
    /// <summary>
    /// fornisce in output la corretta classe css x icona
    /// </summary>
    /// <param name="qta"></param>
    /// <returns></returns>
    public virtual string cssGlyphByQty(object _qta)
    {
      string answ = "fa fa-pencil";
      int qtaUDC = 0;
      try
      {
        qtaUDC = Convert.ToInt32(_qta);
      }
      catch { }
      if (qtaUDC > 0)
      {
        answ = "fa fa-print";
      }
      return answ;
    }
    /// <summary>
    /// calcola il codice imballo da ultimo oppure da DB/webconfig
    /// </summary>
    /// <param name="confBaseVal"></param>
    /// <returns></returns>
    public virtual string codImballo(string confBaseVal)
    {
      string answ = "";
      // cerco se c'è un imballo x particolare corrente...
      if (currParticolare != "")
      {
        answ = lastCodImb;
      }
      else
      {
        answ = memLayer.ML.cdv(confBaseVal);
      }
      return answ;
    }
    /// <summary>
    /// effettua consumo UDC
    /// </summary>
    /// <param name="oldUdc"></param>
    public virtual void consumaUdc(string oldUdc)
    {
      // se UDC è NON vuoto ed esiste
      if (oldUdc != "" && MagClass.magazzino.checkUDC(oldUdc))
      {
        // se è consumabile (IdxPosizione > 0)...
        if (MagClass.magazzino.udcMpIsConsumabile(oldUdc))
        {
          // consumo UDC
          MagClass.magazzino.scaricaUdcMpWip(oldUdc, Request.UserHostName);
        }
      }
    }
    /// <summary>
    /// effettua refresh (su db) del blocco postazione
    /// </summary>
    /// <param name="codLinea"></param>
    public virtual void refreshBloccoPost(string codLinea)
    {
      // resetto usi linee precedenti..
      MagClass.magazzino.taAL.resetPost(Postazione.name);
      // se la linea non è "base" = "Sel linea", finisce x "0"
      if (codLinea.Substring(codLinea.Length - 1) != "0")
      {
        // salvo su DB che sto occupando linea...
        MagClass.magazzino.taAL.updatePost(codLinea, Postazione.name);
      }
    }

    #endregion


    #region area metodi interazione controlli

    /// <summary>
    /// update Qty x UDC selezionato...
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    public virtual void lbtUpdQty_Click(object sender, EventArgs e)
    {
      aggiornaQta();
    }
    /// <summary>
    /// Imposta ultima quantità rilevata
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    public virtual void lbtSetLastQty_Click(object sender, EventArgs e)
    {
      // indico ultima qta
      qta = pezziUdc;
      // salvo!!!
      aggiornaQta();
    }
    /// <summary>
    /// reset della selezione
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    public virtual void btnReset_Click(object sender, EventArgs e)
    {
      qta = 0;
      currUDC = "";
      currParticolare = "";
      setVisibility();
      doUpdate();
    }
    /// <summary>
    /// evento cambio qta
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    public virtual void txtQta_TextChanged(object sender, EventArgs e)
    {
      aggiornaQta();
    }

    public virtual void grView_PageIndexChanged(object sender, EventArgs e)
    {
      // fix dell'ODS
      checkFixOds();
    }
    public virtual void grViewSource_PageIndexChanged(object sender, EventArgs e)
    {
      // fix dell'ODS
      checkFixOds();
    }

    public virtual void grView_Sorted(object sender, EventArgs e)
    {
      // fix dell'ODS
      checkFixOds();
    }
    /// <summary>
    /// aggiorno ods al binding..
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    public virtual void ods_DataBinding(object sender, EventArgs e)
    {
      // fix dell'ODS
      checkFixOds();
    }
    /// <summary>
    /// svuoto le note
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    public virtual void btnEmptyNote_Click(object sender, EventArgs e)
    {
      campoNote = "";
      Postazione.messaggiText = traduci("AttesaBCode");
      Postazione.warningText = "";
      Postazione.CssClass = cssAtt;
      // raise dell'evento
      raiseEvent(ucEvType.ReqUpdateParent);
    }
    /// <summary>
    /// preseleziono (se possibile) imballo...
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    public virtual void ddlImballi_DataBound(object sender, EventArgs e)
    {
      if (!Page.IsPostBack)
      {
        selezionaImballo();
      }
    }
    /// <summary>
    /// sistemazione labels, traduzioni e valori default oggetti
    /// </summary>
    public virtual void traduciObj()
    {
      // txtBox
      qta = memLayer.ML.cdvi("QtaImballoFiniti");
    }

    /// <summary>
    /// controlla se ci sia un barcode
    /// </summary>
    public virtual void checkBarcode()
    {
      if (barcodeIn != "")
      {
        Postazione.messaggiText = string.Format("Barcode digitato: {0}", barcodeIn);
        Postazione.warningText = "";
        switch (MagClass.tipoBCode_L3(barcodeIn))
        {
          case tipoCodiceBarcode.Comando:
            if (barcodeIn == memLayer.ML.cdv("cmdReset"))
            {
              currParticolare = "";
              Response.Redirect(PagCorrente);
            }
            break;
          case tipoCodiceBarcode.Imballo:
            trySetImballo(barcodeIn);
            break;
          case tipoCodiceBarcode.Particolare:
            if (enableBCodeParticolare)
            {
              // imposto il particolare corrente
              currParticolare = barcodeIn;
              origParticolare = barcodeIn;
              impostaParticolare();
            }
            else
            {
              Postazione.messaggiText += traduci("ErrBcd_PartDisabled");
              Postazione.CssClass = cssWait;
            }
            break;
          case tipoCodiceBarcode.UDC:
            processBCodeUdc();
            // update 
            doUpdate();
            break;
          case tipoCodiceBarcode.Operatore:
            // calcolo matricola utente
            int MatrUtente = -1;
            string preCodSogg = memLayer.ML.cdv("prefCodSogg");
            if (barcodeIn.StartsWith(preCodSogg))
            {
              MatrUtente = DataProxy.obj.taTrascSogg.getByKey(barcodeIn, 0)[0].CodMatricola;
            }
            else
            {
              MatrUtente = Convert.ToInt32(barcodeIn);
            }
            if (MatrUtente >= 0)
            {
              // salvo in sessione operatore con AUTH
              OpAuth.startOpAuth(MatrUtente);
              // mostro che ho autorizzato...
              Postazione.messaggiText += traduci("userAuthRec");
              Postazione.CssClass = cssOk;
              Response.Redirect(user_std.pagCorrente);
            }
            else
            {
              Postazione.messaggiText += " - codice <b>non riconosciuto</b>!";
              Postazione.CssClass = cssWait;
            }
            break;
          default:
            // cerco se sia "0" = reset utente...
            if (barcodeIn == memLayer.ML.CRS("resetCodSogg"))
            {
              // salvo in sessione operatore con AUTH
              OpAuth.stopAuth();
              // mostro che ho autorizzato...
              Postazione.messaggiText += traduci("userAuthRem");
              Postazione.CssClass = cssOk;
              Response.Redirect(user_std.pagCorrente);
            }
            Postazione.messaggiText += " - codice <b>non riconosciuto</b>!";
            Postazione.CssClass = cssWait;
            break;
        }
        barcodeIn = "";
        lastBarcodeIn = "-";
      }
      else
      {
        if (string.IsNullOrEmpty(lastBarcodeIn))
        {
          Postazione.messaggiText = traduci("AttesaBCode");
          Postazione.warningText = "";
          Postazione.CssClass = cssAtt;
        }
        lastBarcodeIn = "";
      }
      doUpdate();
    }
    /// <summary>
    /// Pre-processing di un barcode tipo UDC
    /// </summary>
    public virtual void processBCodeUdc()
    {
      // se linea non selezionata ERRORE!!!
      if (Postazione.currCodLinea == codLineaKo)
      {
        Postazione.messaggiText += " - Attenzione, IMPOSTARE LINEA!";
        Postazione.CssClass = cssErr;
      }
      else
      {
        // procedo solo se UDC esistente
        if (MagClass.magazzino.checkUDC(barcodeIn))
        {
          // controllo se NON ci siano NC "pending"
          if (MagClass.magazzino.checkUDC_NC(barcodeIn) != checkUdcNc.HasNc)
          {
            string tipoLinea = "";
            if (Postazione.currNomeLinea.IndexOf("GRZ") >= 0)
            {
              tipoLinea = "GRZ";
            }
            else if (Postazione.currNomeLinea.IndexOf("LVT") >= 0)
            {
              tipoLinea = "LVT";
            }
            else if (Postazione.currNomeLinea.IndexOf("FSC") >= 0)
            {
              tipoLinea = "FSC";
            }
            else if (Postazione.currNomeLinea.IndexOf("LM - ") >= 0)
            {
              tipoLinea = "LM";
            }
            else if (Postazione.currNomeLinea.IndexOf("LS - ") >= 0)
            {
              tipoLinea = "LS";
            }
            else
            {
              tipoLinea = "ND";
            }
            /********************************************************************
            * procedo per UDC in ingresso:
            * - deve essere di tipo IN
            * - se NON c'è UDC in AL dest a pari particolare LO CREO
            * - se c'era già UDC per lo stesso particolare --> consumo (il vecchio)
            * - associo UDC letto ad UDC in AL dest a pari particolare
            * 
            ********************************************************************/

            // controllo IdxPosizione dell'UDC e confronto con posizione in webconfig x trattati (pre lavorazioni meccaniche)
            int IdxPosizione = DataProxy.obj.taCartellini.stp_getByUdc(barcodeIn)[0].IdxPosizione;
            if (IdxPosizione == IdxPosizioneIn)
            {
              // calcolo nuovo particolare
              origParticolare = DataProxy.obj.taCartellini.stp_getByUdc(barcodeIn)[0].Particolare;

              // verifico che il particolare NON SIA in veto...
              if (checkPartVetoByLinea(origParticolare))
              {
                Postazione.messaggiText += $" - Attenzione, PARTICOLARE {origParticolare} NON ATTIVATO / NON PERMESSO sulla LINEA!";
                Postazione.CssClass = "stileComandoKo";
              }
              else
              {
                // chiamo sempre stored x recuperare GRZ da GRZ (solo alcuni) o LVT da GRZ o LVT da LVT (supercubati)
                // calcolo particolare OUT da Distinta Base
                string partOut = "";
                MagClass.magazzino.taPartIO.particolareLVTFromGRZ(tipoLinea, origParticolare, CodCs, ref partOut);
                currParticolare = partOut;
                // continuo controlli
                if (currParticolare != "")
                {

                  int idxCellaCurr = 0;
                  try
                  {
                    idxCellaCurr = MagClass.magazzino.taPosUdcCorr.getByUDC(barcodeIn)[0].IdxCella;
                  }
                  catch
                  { }
                  string codBloccoCurr = "";
                  int idxBlocco = 0;
                  try
                  {
                    idxBlocco = MagClass.magazzino.taCelle.getByIdxCella(idxCellaCurr)[0].IdxBlocco;
                    codBloccoCurr = MagClass.magazzino.taBlocchi.getByIdx(idxBlocco)[0].CodBlocco;
                  }
                  catch
                  { }
                  // 2015.01.12 controllo UDC non già su altre postazioni...
                  if (codBloccoCurr == Postazione.currCodBlocco && idxCellaCurr != Postazione.currIdxCella)
                  {
                    Postazione.messaggiText += " - Attenzione, UDC già caricato su ALTRA LINEA!";
                    Postazione.CssClass = cssErr;
                  }
                  else
                  {
                    processUdcInOut(idxCellaCurr, false, true);
                  }
                }
                else // non trovo part LVT
                {
                  Postazione.messaggiText += traduci("ERR-LVT-001");
                  Postazione.CssClass = cssErr;
                }
              }
            }
            // controllo SE PER CASO ci fosse NC e ci sia stata deroga, cambio MSG...
            if (MagClass.magazzino.checkUDC_NC(barcodeIn) == checkUdcNc.ChkDis_HasNc)
            {
              Postazione.CssClass = cssErr;
              Postazione.messaggiText += string.Format("<br />{0}", traduci("ERR-NC-001"));
              // recupero l'NC associata...
              Postazione.warningText += string.Format("<br />{0}", MagClass.magazzino.getDescrNc2Udc(barcodeIn));
            }
          }
          else
          {
            Postazione.CssClass = cssErr;
            Postazione.messaggiText += string.Format("<br />{0}", traduci("ERR-NC-001"));
            // recupero l'NC associata...
            Postazione.warningText += string.Format("<br />{0}", MagClass.magazzino.getDescrNc2Udc(barcodeIn));
          }
        }
      }
    }
    /// <summary>
    /// Processa UDC nuovo (eventualmente creando) e vecchio (eventualmente consumando)
    /// </summary>
    /// <param name="idxCellaCurr"></param>
    /// <param name="forceMove">Forza lo spostamento a idxCella corrente...</param>
    /// <param name="createUdcOut">indica se si debba creare UDC in uscita se mancasse...</param>
    /// <returns></returns>
    public virtual void processUdcInOut(int idxCellaCurr, bool forceMove, bool createUdcOut)
    {
      verificaAssociaUdcParentChild(barcodeIn, forceMove, createUdcOut);
      // controllo se UDC non sia già stato spostato in posizione... dsMagazzino, posizUdcCorrente, getByUdc
      if (idxCellaCurr == Postazione.currIdxCella)
      {
        Postazione.messaggiText += " - Attenzione, UDC già caricato!";
        Postazione.CssClass = cssErr;
      }
      else
      {
        // verifico per eventuale consumo vecchio UDC... cerco nella posizione
        DS_magazzino.v_UdcDetailDataTable tabUdcDet = null;
        try
        {
          // cerco nella posizione
          tabUdcDet = MagClass.magazzino.taDettUDC.getUdcDetailByIdxCella(idxCella);
        }
        catch
        { }
        // carico UDC letto in cella...
        DateTime adesso = DateTime.Now;
        string noteTrim = Postazione.currNomeLinea;
        // cerco se NON ci sia l'UDC letto...
        if (tabUdcDet.Select(string.Format("UDC = '{0}'", barcodeIn)).Length == 0)
        {
          processUdcOut(tabUdcDet, adesso, noteTrim);
        }
        Postazione.CssClass = cssOk;
      }
    }
    /// <summary>
    /// verifica se ci sia udcDest, se necessario crea ed associa a parent, e restituisce udcDest
    /// </summary>
    /// <param name="udcParent">UDC Parent</param>
    /// <param name="forceMove">Forza lo spostamento a idxCella corrente...</param>
    /// <param name="createUdcOut">indica se si debba creare UDC in uscita se mancasse...</param>
    /// <returns></returns>
    public string verificaAssociaUdcParentChild(string udcParent, bool forceMove, bool createUdcOut)
    {
      // controllo SE esista già UDC in AL dest... altrimenti CREO!!!
      string udcDest = checkCreaUDC(forceMove, createUdcOut);
      if (udcDest != "")
      {
        // verifico che NON SIA GIA' associato...
        bool udcGiaAssociato = false;
        try
        {
          udcGiaAssociato = MagClass.magazzino.checkAssociazioneUdcParent(udcDest, udcParent);
        }
        catch
        { }
        if (!udcGiaAssociato)
        {
          // associo UDC con quello di destinazione SE NECESSARIO
          MagClass.magazzino.associaUdcParent(udcDest, udcParent, true);
        }
      }
      return udcDest;
    }

    /// <summary>
    /// Processing del vecchio UDC (eventualmente consumando)
    /// </summary>
    /// <param name="tabUdcDet"></param>
    /// <param name="adesso"></param>
    /// <param name="noteTrim"></param>
    public virtual void processUdcOut(DS_magazzino.v_UdcDetailDataTable tabUdcDet, DateTime adesso, string noteTrim)
    {
      string oldUdc = "";
      try
      {
        oldUdc = ((DS_magazzino.v_UdcDetailRow)tabUdcDet.Select(string.Format("Particolare = '{0}' AND IdxPosizione = {1}", origParticolare, IdxPosizioneIn))[0]).UDC;
      }
      catch
      { }
      // se trovo un altro UDC dello stesso particolare...
      if (oldUdc != "")
      {
        // consumo UDC
        consumaUdc(oldUdc);
      }
      // se ho cod cella sposto UDC in nuova posizione!
      MagClass.magazzino.spostaUDC(CodCs, barcodeIn, Postazione.currIdxCella, memLayer.ML.CRB("spostaUdcResettaLdp"), Request.UserHostName);
      // registro spostamento UDC
      MagClass.magazzino.taSAO.insertQuery(adesso, MagClass.magazzino.CodSoggCurrUser, Postazione.name, Postazione.IP, barcodeIn, currParticolare, "spostaUDC", string.Format("Caricato UDC {3} su linea {2}, qta: {0} {1} ", qta, noteTrim, Postazione.currCodLinea, tipoUdcLinea));
    }

    /// <summary>
    /// segnaposto gestione creazione opzionale UDC
    /// </summary>
    /// <param name="forceMove">Forza lo spostamento a idxCella corrente...</param>
    /// <param name="createUdcOut">indica se si debba creare UDC in uscita se mancasse...</param>
    public virtual string checkCreaUDC(bool forceMove, bool createUdcOut)
    {
      string udcDest = "";
      bool checkDone = true;
      DateTime adesso = DateTime.Now;
      MagClass geMag = new MagClass();
      // verifico se ho già quel particolare tra quelli dell'AL...
      try
      {
        DS_magazzino.ElencoCartelliniDataTable tabCart;
        if (memLayer.ML.CRB("disable_singleton"))
        {
          tabCart = geMag.taCartellini.getByParticolareAL(currParticolare, destAL);
        }
        else
        {
          tabCart = MagClass.magazzino.taCartellini.getByParticolareAL(currParticolare, destAL);
        }
        if (tabCart.Rows.Count > 0)
        {
          udcDest = tabCart[0].UDC;
        }
      }
      catch (Exception exc)
      {
        checkDone = false;
        logger.lg.scriviLog(string.Format("Errore in ricerca UDC DEST x UDC temp {2}: {0}{1}", Environment.NewLine, exc, tipoUdcLinea));
        udcDest = "";
      }
      if (createUdcOut && checkDone)
      {
        if (string.IsNullOrEmpty(udcDest))
        {
          try
          {
            // creo nuovo UDC FI... in posizione TEMP e con un evento differente...
            if (memLayer.ML.CRB("disable_singleton"))
            {
              udcDest = geMag.creaUdc(flusso, "", currParticolare, "", "", "", "", "", 0, lastCodImb, "U", MagClass.magazzino.CodSoggCurrUser, qta, 0, 0, adesso, 0, statoUDC, IdxPosizioneOutTemp, IdxPosizioneOutTempName, eventoUDC, "", "", adesso.Year, Request.UserHostName);
              // associo UDC a AL...
              geMag.taAL2UDC.Insert(destAL, udcDest, adesso, MagClass.magazzino.CodSoggCurrUser);
            }
            else
            {
              udcDest = MagClass.magazzino.creaUdc(flusso, "", currParticolare, "", "", "", "", "", 0, lastCodImb, "U", MagClass.magazzino.CodSoggCurrUser, qta, 0, 0, adesso, 0, statoUDC, IdxPosizioneOutTemp, IdxPosizioneOutTempName, eventoUDC, "", "", adesso.Year, Request.UserHostName);
              // associo UDC a AL...
              MagClass.magazzino.taAL2UDC.Insert(destAL, udcDest, adesso, MagClass.magazzino.CodSoggCurrUser);
            }
            if (forceMove)
            {
              if (memLayer.ML.CRB("disable_singleton"))
              {
                // se UDC NON in cella corrente lo sposto in nuova posizione!
                geMag.spostaUDC(CodCs, udcDest, Postazione.currIdxCella, memLayer.ML.CRB("spostaUdcResettaLdp"), Request.UserHostName);
              }
              else
              {
                // se UDC NON in cella corrente lo sposto in nuova posizione!
                MagClass.magazzino.spostaUDC(CodCs, udcDest, Postazione.currIdxCella, memLayer.ML.CRB("spostaUdcResettaLdp"), Request.UserHostName);
              }
            }
          }
          catch (Exception exc)
          {
            logger.lg.scriviLog(string.Format("Errore in creazione UDC temp {2}: {0}{1}", Environment.NewLine, exc, tipoUdcLinea));
          }
        }
        if (udcDest != "")
        {
          Postazione.CssClass = cssAtt;
          Postazione.warningText = "";
          Postazione.messaggiText = traduci("partAdded");
        }
        else
        {
          Postazione.CssClass = cssErr;
          Postazione.warningText = traduci("ErroreUdcDest");
        }
      }
      return udcDest;
    }
    /// <summary>
    /// tenta di impostare l'imballo al valore indicato altrimenti mostra errore
    /// </summary>
    /// <param name="valore"></param>
    public virtual bool trySetImballo(string valore)
    {
      bool fatto = false;
      // cerco di selezionare!
      try
      {
        imballoSel = valore;
        fatto = true;
      }
      catch
      {
        Postazione.warningText = traduci("ERR-IMB-001");
        Postazione.CssClass = cssErr;
      }
      return fatto;
    }
    /// <summary>
    /// segnaposto gestione button stampa
    /// <param name="sender"></param>
    /// <param name="e"></param>
    public virtual void btnStampa_Click(object sender, EventArgs e)
    {
      bool needsRedirect = false;
      string[] stringSeparators = new string[] { "#" };
      // verifico postazione x procedere...
      if (Postazione.printer != "n.d.")
      {
        // verifico auth utente OPPURE se NON sia richiesta...
        if (OpAuth.isAuth || !OpAuth.opAuthReq)
        {
          DateTime adesso = DateTime.Now;
          // effettuo controlli che cod_soggetto, cod particolare e destAL siano disponibili...
          if (MagClass.magazzino.CodSoggCurrUser != "" && currParticolare != "" && destAL != "ALF00")
          {
            string codImballo = "";
            try
            {
              codImballo = imballoSel;
            }
            catch
            {
              codImballo = CodImballoStd;
            }
            // se NON HA selezionato prendo default...
            if (string.IsNullOrEmpty(codImballo) || codImballo == "-")
            {
              codImballo = CodImballoStd;
            }
            string noteCompl = string.Format("{0}{1}{2}", Postazione.currNomeLinea, Environment.NewLine, campoNote);
            try
            {
              // aggiorno note e  posizione da temp a definitivo x UDC...
              MagClass.magazzino.updateNotePosizioneDataImballoUDC(currUDC, noteCompl, IdxPosizioneOut, DateTime.Now, codImballo);
              if (OpAuth.isAuth)
              {
                // salvo attributo dell'OpAuth...
                MagClass.magazzino.taAtt2UDC.Insert(currUDC, memLayer.ML.CRS("attrOpAuth"), OpAuth.currAuth.CodSoggetto, DateTime.Now, MagClass.magazzino.CodSoggCurrUser);
                // consumo una auth...
                OpAuth.currAuth.remAuth--;
                if (OpAuth.currAuth.remAuth == 0)
                {
                  OpAuth.stopAuth();
                  needsRedirect = true;
                }
              }
            }
            catch (Exception exc)
            {
              httpLog(string.Format("Errore creazione UDC {0}:{1}{2}", tipoUdcLinea, Environment.NewLine, exc), tipoLog.EXCEPTION);
            }

            // tolgo UDC da AL corrente...
            MagClass.magazzino.taAL2UDC.deleteQuery(destAL, currUDC);

            // ora stampo il nuovo cartellino nel formato impostato
            MagClass.magazzino.stampaUdc(currUDC, Postazione.printer, tipoCartCurr, Request.UserHostName);
            // incremento timing...
            adesso = adesso.AddSeconds(2);
            // registro stampa nuovo UDC
            MagClass.magazzino.taSAO.insertQuery(adesso, MagClass.magazzino.CodSoggCurrUser, Postazione.name, Postazione.IP, currUDC, currParticolare, "stampaUDC", "Stampato UDC FINITO");

            // 2016.06.15 modifica per creare subito un NUOVO UDC connesso a quello in origine... QTA 0 !!!
            string udcParent = "";
            // recupero parent... ULTIMO (descending)
            try
            {
              udcParent = MagClass.magazzino.getUdcParentDesc(currUDC);
            }
            catch
            { }
            // controllo che sia DAVVERO caricato UDC parent...
            string oldUdc = "";
            // verifico per eventuale consumo vecchio UDC... cerco nella posizione
            DS_magazzino.v_UdcDetailDataTable tabUdcDet = null;
            try
            {
              // cerco nella posizione
              tabUdcDet = MagClass.magazzino.taDettUDC.getUdcDetailByIdxCella(idxCella);
            }
            catch
            { }
            try
            {
              oldUdc = ((DS_magazzino.v_UdcDetailRow)tabUdcDet.Select(string.Format("UDC = '{0}'", udcParent))[0]).UDC;
            }
            catch
            { }
            // PROCEDO SOLO SE HO UN UDC IN INGRESSO!!!
            if (udcParent != "" && oldUdc != "")
            {
              // CREO NUOVO UDC!!!
              string udcDest = "";
              udcDest = checkCreaUDC(false, true);
              // associo UDC con quello di destinazione
              MagClass.magazzino.associaUdcParent(udcDest, udcParent, true);
              // registro creazione nuovo UDC
              MagClass.magazzino.taSAO.insertQuery(adesso, MagClass.magazzino.CodSoggCurrUser, Postazione.name, Postazione.IP, currUDC, currParticolare, "creaUDC", string.Format("Creato ed associato nuovo UDC {3} con codice {2}, qta: {0}, UDC Parent: {1}", qta, udcParent, udcDest, tipoUdcLinea));
            }
            // resetto
            doResetData();
          }
          else
          {
            httpLog(string.Format("FINITI, Errore persi utente/particolare, ricarico!"), tipoLog.ERROR);
            Response.Redirect("~/login.aspx");
          }
        }
        else
        {
          Postazione.messaggiText = traduci("noOpAuth");
          Postazione.warningText = "";
          Postazione.CssClass = cssErr;
          httpLog(string.Format("Errore manca OpAuth x UDC {0}", tipoUdcLinea), tipoLog.ERROR);
        }
      }
      else
      {
        Response.Redirect("~/menu.aspx");
      }
      doUpdate();
      // raise dell'evento
      raiseEvent(ucEvType.ReqUpdateParent);
      if (needsRedirect)
      {
        Response.Redirect(user_std.pagCorrente);
      }
    }

    #endregion
  }
}
