using System; using System.Collections.Generic; using System.Linq; using System.Text; using SteamWare; namespace GMW_data { /// /// fa da proxy singleton x gli oggetti legati ai cartellini ODETTE /// public class Odette { #region area table adapters public DS_OdetteTableAdapters.OdetteTableAdapter taOdette; public DS_OdetteTableAdapters.BORI202JTableAdapter taBORI; public DS_OdetteTableAdapters.stp_OdetteStatoCreateTableAdapter taOdCreate; /// /// init dei table adapters /// protected void initTA() { taOdette = new GMW_data.DS_OdetteTableAdapters.OdetteTableAdapter(); taBORI = new GMW_data.DS_OdetteTableAdapters.BORI202JTableAdapter(); taOdCreate = new GMW_data.DS_OdetteTableAdapters.stp_OdetteStatoCreateTableAdapter(); } /// /// effettua setup dei connection strings da web.config delal singola applicazione /// protected virtual void setupConnectionStringBase() { string connString = memLayer.ML.confReadString("GMWConnectionString"); // connections strings del db taOdette.Connection.ConnectionString = connString; taBORI.Connection.ConnectionString = connString; taOdCreate.Connection.ConnectionString = connString; } #endregion protected Odette() { initTA(); setupConnectionStringBase(); } #region area protected /// /// carica le label di lingua su un etichetta odette (che deve già esistere) /// /// /// /// protected bool caricaEtichetteLinguaPerOdette(string UDC, string lingua) { bool answ = false; // controllo se etichetta odette esiste... if (taOdette.getByUdc(UDC).Rows.Count > 0) { // carico le mie labels tradotte... string Campo1_1 = traduci("Campo1_1", lingua); string Campo2_1 = traduci("Campo2_1", lingua); string Campo3_1 = traduci("Campo3_1", lingua); string Campo4_1 = traduci("Campo4_1", lingua); string Campo5_1 = traduci("Campo5_1", lingua); string Campo6_1 = traduci("Campo6_1", lingua); string Campo7_1 = traduci("Campo7_1", lingua); string Campo8_1 = traduci("Campo8_1", lingua); string Campo9_1 = traduci("Campo9_1", lingua); string Campo10_1 = traduci("Campo10_1", lingua); string Campo11_1_1 = traduci("Campo11_1_1", lingua); string Campo11_2_1 = traduci("Campo11_2_1", lingua); string Campo12_1 = traduci("Campo12_1", lingua); string Campo13_1 = traduci("Campo13_1", lingua); string Campo14_1 = traduci("Campo14_1", lingua); string Campo15_1 = traduci("Campo15_1", lingua); string Campo16_1 = traduci("Campo16_1", lingua); // effettuo update! taOdette.updateLingua(UDC, Campo1_1, Campo2_1, Campo3_1, Campo4_1, Campo5_1, Campo6_1, Campo7_1, Campo8_1, Campo9_1, Campo10_1, Campo11_1_1, Campo11_2_1, Campo12_1, Campo13_1, Campo14_1, Campo15_1, Campo16_1); } else { logger.lg.scriviLog(string.Format("Attenzione! etichetta odette non trovata per l'UDC {0}", UDC), tipoLog.ERROR); } return answ; } /// /// verifica una etichetta odette e salva in db il valore di check x consistenza dei dati /// /// /// protected bool updateStatoOdette(string UDC) { bool answ = false; try { // effettuo verifiche sulla riga odette... // !!!FARE!!! answ = true; taOdette.setStato(UDC, answ); } catch { } return answ; } /// /// carica i dati per l'etichetta Odette provenienti dalla bolla indicata /// /// /// /// /// codice bolla /// data bolla formato YYYYMMDD /// /// protected bool caricaDatiBollaEtichettaOdette(string UDC, string RaggMag, string GrpBolla, decimal numBolla, decimal dataBolla, string particolare) { // versione vecchia: ora faccio tutto con stored! #if false bool answ = false; string ragSocCli = ""; string indirCli = ""; string capCittCli = ""; string destP1 = ""; string destP2 = ""; string destP3 = ""; string destinatario = ""; decimal peso = 0; string pesoNetto = ""; string pesoLordo = ""; string numColli = ""; string disPart = ""; string descPart = ""; string codPart = ""; string codImb = ""; string codMaz = ""; string codNael = ""; string codNaelP1 = ""; string codNaelP2 = ""; string codNaelP3 = ""; string codAQP = ""; // in primis recupero la riga di dati da AS400... int trovati = 0; DS_Odette.BORI202JDataTable tabAs400 = new DS_Odette.BORI202JDataTable(); DS_magazzino.ElencoCartelliniRow rigaUdc = null; decimal qtaUdc = 1; try { tabAs400 = taBORI.getByKeyFull(RaggMag, GrpBolla, numBolla, dataBolla, particolare); trovati = tabAs400.Rows.Count; } catch { logger.lg.scriviLog(string.Format("Non trovati dati per {0}-{1}-{2}-{3}-{4}", RaggMag, GrpBolla, numBolla, dataBolla, particolare), tipoLog.EXCEPTION); } // carico dati udc try { rigaUdc = MagClass.magazzino.taCartellini.getByUdc(UDC)[0]; qtaUdc = rigaUdc.Qta; } catch { qtaUdc = 1; logger.lg.scriviLog(string.Format("Non trovati dati per UDC {0} (qta)", UDC), tipoLog.EXCEPTION); } if (trovati >= 1) { DS_Odette.BORI202JRow rigaAs = tabAs400[0]; // in base al valore di CDINB definisco i campi... if (rigaAs.CDINB.Trim() != "") { // campo1 try { ragSocCli = rigaAs.RA1ND.Trim(); indirCli = rigaAs.RA2ND.Trim(); capCittCli = string.Format("{0} {1}", rigaAs.CAPND.Trim(), rigaAs.CITND.Trim()); } catch { logger.lg.scriviLog("Errore campo1 (101)", tipoLog.ERROR); } // campo2 try { destP2 = rigaAs.INEND.Substring(0, 15).Trim(); destP1 = rigaAs.INEND.Substring(15, 15).Trim(); if (rigaAs.CRAGCL.Trim() == "13" || rigaAs.TELND.Substring(18, 2) == "13") { destP3 = "/S"; } destinatario = string.Format("{0}/{1}{2}", destP1, destP2, destP3); } catch { logger.lg.scriviLog("Errore campo2 (102)", tipoLog.ERROR); } // campo12 try { if (rigaAs.CRAGCL.Trim() == "13" || rigaAs.TELND.Substring(18, 2) == "13") { codMaz = rigaAs.PERND.Trim(); } } catch { logger.lg.scriviLog("Errore campo12 (112)", tipoLog.ERROR); } } else { // campo1 try { ragSocCli = rigaAs.RASCL.Trim(); indirCli = rigaAs.INDCL.Trim(); capCittCli = string.Format("{0} {1} {2}", rigaAs.CAPCL.Trim(), rigaAs.LOCCL.Trim(), rigaAs.PROCL.Trim()); } catch { logger.lg.scriviLog("Errore campo1 (201)", tipoLog.ERROR); } // campo2 try { destP1 = rigaAs.CCDMOL.Trim(); destP2 = rigaAs.CCDPTR.Trim(); if (rigaAs.CRAGCL.Trim() == "13") { destP3 = "/S"; } destinatario = string.Format("{0}/{1}{2}", destP1, destP2, destP3); } catch { logger.lg.scriviLog("Errore campo2 (202)", tipoLog.ERROR); } // campo12 try { if (rigaAs.CRAGCL.Trim() == "13" || rigaAs.TELND.Substring(18, 2) == "13") { codMaz = rigaAs.CCDET1.Trim(); } } catch { logger.lg.scriviLog("Errore campo12 (212)", tipoLog.ERROR); } } // campo5 try { // se EPLAVO = 0 --> si mette EPLNETT if (rigaAs.EPLAVO <= 0) { peso = rigaAs.EPNETT; } else { // modifica 2013.05.03 //peso = Math.Round(rigaAs.EPLAVO * memLayer.ML.confReadInt("qtaOdette"), 2); peso = rigaAs.EPLAVO; } pesoNetto = Math.Round(peso * qtaUdc, 2).ToString(); } catch { logger.lg.scriviLog("Errore campo5 (005)", tipoLog.ERROR); } // campo6 try { pesoLordo = Math.Round(rigaAs.PELDB / rigaAs.NRC1B, 2).ToString(); } catch { logger.lg.scriviLog("Errore campo6 (006)", tipoLog.ERROR); } // campo7 try { numColli = rigaAs.NRC1B.ToString(); } catch { logger.lg.scriviLog("Errore campo7 (007)", tipoLog.ERROR); } // campo8 try { disPart = rigaAs.ECMM01.Trim(); } catch { logger.lg.scriviLog("Errore campo8 (008)", tipoLog.ERROR); } // campo10 try { descPart = rigaAs.DEPAR.Trim(); } catch { logger.lg.scriviLog("Errore campo10 (010)", tipoLog.ERROR); } // campo 11_1 try { codPart = rigaAs.CDARS.Trim(); } catch { logger.lg.scriviLog("Errore campo11_1 (011_1)", tipoLog.ERROR); } // campo 11_2 try { // modifica 2013.05.02 codImb = rigaAs.FCDI01.Trim(); //codImb = rigaAs.RCARTC.Trim(); } catch { logger.lg.scriviLog("Errore campo11_2 (011_2)", tipoLog.ERROR); } // campo14 try { // controlla se debba configurare come BMW da accodamento dati o leggendo in nuova tabella... if (rigaAs.CRAGCL.Trim() == "13" || rigaAs.TELND.Substring(18, 2) == "13") { codNaelP1 = rigaAs.ECDNAE.Trim(); codNaelP2 = rigaAs.ECDNA1.Trim(); codNaelP3 = rigaAs.EESPMD.Trim(); codNael = string.Format("ZI:{0} {1} AI:{2}", codNaelP1, codNaelP2, codNaelP3); } else { // leggo record... codNael = rigaAs.OCDODM; } } catch { logger.lg.scriviLog("Errore campo14 (014)", tipoLog.ERROR); } // campo16_5 try { // sistema codAQP codAQP = rigaAs.ECLAQP; } catch { logger.lg.scriviLog("Errore campo16 (016)", tipoLog.ERROR); } } if (trovati >= 1) { try { taOdette.updateValAs400(UDC, ragSocCli, indirCli, capCittCli, destinatario, "", "", pesoNetto, pesoLordo, numColli, disPart, descPart, codPart, codImb, codMaz, codNael, codAQP); answ = true; } catch { answ = false; } } #endif bool answ = false; try { taOdette.caricaDatiBollaEtichettaOdette(memLayer.ML.confReadString("CodCS"), UDC, numBolla.ToString(), dataBolla.ToString(), RaggMag, GrpBolla, particolare); answ = true; } catch { answ = false; } return answ; } #endregion #region area public /// /// singleton /// public static Odette mgr = new Odette(); /// /// wrapper traduzione /// /// /// /// public string traduci(string lemma, string lingua) { return user_std.UtSn.Traduci(lemma, lingua); } /// /// verifica l'esistenza di una bolla dato il suo codice + data /// /// cod raggr magazzino /// gruppo bolla /// codice bolla NUMERICO /// data bolla formato numerico YYYYMMDD /// codice particolare /// public bool checkCodBolla(string RaggMag, string GrpBolla, decimal numBolla, decimal dataBolla, string particolare) { bool answ = false; int righeBolla = 0; // controllo che la bolla esista... try { // provo a caricarle con stored... taBORI.caricaDatiBolla(RaggMag, GrpBolla, numBolla.ToString(), dataBolla.ToString(), particolare); // rileggo se presenti... righeBolla = taBORI.getByKeyFull(RaggMag, GrpBolla, Convert.ToDecimal(numBolla), Convert.ToDecimal(dataBolla), particolare).Rows.Count; answ = (righeBolla >= 1); } catch(Exception exc) { logger.lg.scriviLog(string.Format("Errore in checkCodBolla:{0}{1}", Environment.NewLine, exc), tipoLog.EXCEPTION); } // controllo che la bolla non sia già associata... ovvero SENZA NESSUNA etichetta odette associata x quel particolare... if (answ) { // controllo se trovo odette associate a tale bolla... answ = (taOdette.getByBolla(RaggMag, GrpBolla, numBolla, dataBolla, particolare).Rows.Count == 0); } return answ; } /// /// conteggia il num di colli x una data bolla /// /// cod raggr magazzino /// gruppo bolla /// codice bolla NUMERICO /// data bolla formato numerico YYYYMMDD /// codice particolare /// public int totColliBolla(string RaggMag, string GrpBolla, decimal numBolla, decimal dataBolla, string particolare) { int answ = 0; try { // calcolo il totale dei pezzi: ogni riga contiene il totale colli della bolla... //answ = (int)taBORI.getByKeyFull(RaggMag, GrpBolla, Convert.ToDecimal(numBolla), Convert.ToDecimal(dataBolla), particolare)[0].NRC1B; answ = Convert.ToInt32(taBORI.getByKeyFull(RaggMag, GrpBolla, Convert.ToDecimal(numBolla), Convert.ToDecimal(dataBolla), particolare).Compute("SUM(NRC1B)", "")); } catch { } return answ; } /// /// conteggia il num di pezzi x una data bolla /// /// cod raggr magazzino /// gruppo bolla /// codice bolla NUMERICO /// data bolla formato numerico YYYYMMDD /// codice particolare /// public int totPezziBolla(string RaggMag, string GrpBolla, decimal numBolla, decimal dataBolla, string particolare) { int answ = 0; try { // rileggo se presenti... answ = Convert.ToInt32(taBORI.getByKeyFull(RaggMag, GrpBolla, Convert.ToDecimal(numBolla), Convert.ToDecimal(dataBolla), particolare).Compute("SUM(QTCNS)", "")); //answ = (int)taBORI.getByKeyFull(RaggMag, GrpBolla, Convert.ToDecimal(numBolla), Convert.ToDecimal(dataBolla), particolare)[0].QTCNS; } catch { } return answ; } /// /// crea tutte le righe encessarie alal stampa dei cartellini Odette dati lista di prelievo, bolla da associare /// /// codice lista di prelievo /// cod raggr magazzino /// gruppo bolla /// codice bolla NUMERICO /// data bolla formato numerico YYYYMMDD /// codice particolare /// IT/EN/... /// in caso di errore e ritorno false, salva in sessione il messaggio di errore relativo in errCreazOdette public bool creaOdetteByBollaPackList(string CodLista, string RaggMag, string GrpBolla, decimal numBolla, decimal dataBolla, string particolare, string lingua) { bool answ = false; string errCreazOdette = ""; int totUdc = 0; int totPz = 0; int udcOk = 0; DS_magazzino.RigheListePrelievoDataTable ElencoUdc = new DS_magazzino.RigheListePrelievoDataTable(); // conto totale etichette da creare try { ElencoUdc = MagClass.magazzino.taRigheListePrelievo.getByCodLista(CodLista); totUdc = ElencoUdc.Rows.Count; totPz = (int)MagClass.magazzino.taElencoListePrelievo.getByCodLista(CodLista)[0].Prelevato; } catch { errCreazOdette = string.Format("Errore: non ci sono UDC da creare per la PackList {0}", CodLista); logger.lg.scriviLog(errCreazOdette, tipoLog.ERROR); } // in primis comunque verifico che la bolla ci sia altrimenti non procedo (anche se avrebbe già dovuto controllare...) if (checkCodBolla(RaggMag, GrpBolla, numBolla, dataBolla, particolare) && totUdc > 0) { // controllo se il totale colli corrisponde al totale UDC.. if (totColliBolla(RaggMag, GrpBolla, numBolla, dataBolla, particolare) == totUdc || true) // controllo disattivato 2013.03.22 perché i colli riga sono i colli totali bolla { // controllo se il totale pezzi corrisponde al totale qta... if (totPezziBolla(RaggMag, GrpBolla, numBolla, dataBolla, particolare) == totPz) { // leggo elenco UDC da packing list foreach (DS_magazzino.RigheListePrelievoRow rigaUdc in ElencoUdc) { // per ogni UDC creo una riga taOdette.upsertUdc(rigaUdc.UDC, memLayer.ML.confReadString("CodCS"), numBolla.ToString(), dataBolla.ToString(), RaggMag, GrpBolla, particolare, CodLista, memLayer.ML.confReadString("indStabFrom"), rigaUdc.Qta.ToString()); udcOk++; // per ogni riga inserisco traduzione nella lingua richiesta caricaEtichetteLinguaPerOdette(rigaUdc.UDC, lingua); // vado a caricare i dati dalla tab dei dati bolle caricaDatiBollaEtichettaOdette(rigaUdc.UDC, RaggMag, GrpBolla, numBolla, dataBolla, particolare); // effettuo check della riga odette e determino se sia conforme updateStatoOdette(rigaUdc.UDC); } } else { errCreazOdette = string.Format("Errore assegnazione bolle/odette, il num di pezzi non corrisponde: num bolla {0} del {1}, lista prelievo {2}", numBolla, dataBolla, CodLista); logger.lg.scriviLog(errCreazOdette, tipoLog.ERROR); } } else { errCreazOdette = string.Format("Errore assegnazione bolle/odette, il num di colli non corrisponde: num bolla {0} del {1}, lista prelievo {2}", numBolla, dataBolla, CodLista); logger.lg.scriviLog(errCreazOdette, tipoLog.ERROR); } } else { errCreazOdette = string.Format("Tentativo di generazione etichette odette da bolla inesistente/già impiegata: codice {0} del {1}", numBolla, dataBolla); logger.lg.scriviLog(errCreazOdette, tipoLog.ERROR); } // controllo se tutte le etichette sono sstate create if (totUdc == udcOk) { answ = true; } memLayer.ML.setSessionVal("errCreazOdette", errCreazOdette); return answ; } /// /// Stampa tutte le etichette odette di una lista di prelievo /// /// /// /// public bool stampaOdettePackingList(string CodLista, string printerName) { bool answ = false; int totOdette = 0; DS_Odette.OdetteDataTable ElencoOdette = new DS_Odette.OdetteDataTable(); // conto totale etichette Odette con StatusOK=1 corrispondenti a lista prelievo try { ElencoOdette = taOdette.getByCodLista(CodLista); totOdette = ElencoOdette.Rows.Count; } catch { logger.lg.scriviLog(string.Format("Errore: non ci sono UDC da creare per la PackList {0}", CodLista), tipoLog.ERROR); } // in primis comunque verifico che la bolla ci sia altrimenti non procedo (anche se avrebbe già dovuto controllare...) if (totOdette > 0) { // processo elenco Odette foreach (DS_Odette.OdetteRow rigaOdette in ElencoOdette) { stampaEtichettaOdette(rigaOdette.CampoUDC, printerName); } } else { logger.lg.scriviLog(string.Format("Attenzione: non ho trovaot etichette odette valide per la lista di prelievo {0}", CodLista), tipoLog.ERROR); } return answ; } /// /// stampa una singola etichetta odette /// /// /// /// public bool stampaEtichettaOdette(string UDC, string printerName) { bool answ = false; // chiamo il report... try { answ = reportPrinter.obj.stampaCartellino(tipoCartellino.cartOdette, UDC, printerName); } catch { logger.lg.scriviLog(String.Format("Errore nella stmapa del cartellino per l'UDC {0}", UDC), tipoLog.ERROR); } return answ; } /// /// determina se ci siano odette x la lista di prelievo /// /// /// public bool listaHasOdette(string codLista) { bool answ = false; try { DS_Odette.stp_OdetteStatoCreateRow rigaCreate = taOdCreate.GetData(codLista)[0]; answ = rigaCreate.OdetteCreate > 0; } catch { } return answ; } /// /// restituisce info se un gitterbox abbia una etichetta odette associata /// /// public bool gitterboxInOdette(string codGitterbox) { bool answ = false; try { answ = taOdette.getByUdc(codGitterbox).Rows.Count > 0; } catch { } return answ; } /// /// restituisce info se un datamatrix faccia parte di un gitterbox con una etichetta odette associata /// public bool datamatrixInOdette(decimal codDataMatrix) { bool answ = false; string codGitterbox = DataMatrix.mgr.gitterboxFromDataMatrix(codDataMatrix); answ = gitterboxInOdette(codGitterbox); return answ; } /// /// Restituisce info se un datamatrix possa essere spostato tra 2 gitterbox (il suo d'origine e quello indicato), /// mantenendo l'omogeneità dei prodotti nel gitterbox. /// Verifiche: /// - se il datamatrix ha un gitterbox associato --> le prime 2 cifre dei gitterbox devono coincidere /// - se il datamatrix non ha un gitterbox associato --> rileggo gitterbox originale pre importazione e faccio verifica dei primi 2 char /// /// /// public bool dtMtxGtboxCompatibili(decimal codDataMatrix, string codGitterboxTo) { bool answ = false; string codGitterboxFrom = ""; try { codGitterboxFrom = DataMatrix.mgr.gitterboxFromDataMatrix(codDataMatrix); if (codGitterboxFrom != "EmptyGBox") { answ = (codGitterboxFrom.Substring(0, 2) == codGitterboxTo.Substring(0, 2)); } else { // cerco gitterbox originale... codGitterboxFrom = DataMatrix.mgr.gitterboxOrigFromDataMatrix(codDataMatrix); answ = (codGitterboxFrom.Substring(0, 2) == codGitterboxTo.Substring(0, 2)); } } catch { } return answ; } /// /// restituisce info se un datamatrix esista /// /// public bool datamatrixEsiste(decimal codDataMatrix) { bool answ = false; try { answ = DataMatrix.mgr.taElencoDM.getByCode(codDataMatrix).Rows.Count > 0; } catch { } return answ; } #endregion } }