/// /// Copyright (c) 2021-2023 Sensus Slovensko a.s. /// using System; using System.Collections.Generic; using System.Windows.Forms; using log4net; using DataMatrix4Net; using SharedDatabase.Entities; using LabelPrinting.Resources; using TBF.Rig.Output.Printers.Label; using NHibernate; using Common; using Results.Entities; namespace LabelPrinting { public partial class MainWnd : Form { private static readonly ILog log = LogManager.GetLogger(typeof(MainWnd)); private readonly Factory factory; private readonly Printer printer; string programNameAndVer; string prefix; /// S/N prefix after parsing/verification by the UI string separator; /// Separator after parsing/verification by the UI int currentSNTrail; /// Current S/N trai (1st S/N trail after parsing/verification by the UI) int totalCount; /// Total S/N count after parsing/verification by the UI int remainingCount; /// Remaining S/N-s count IList orderInfos; /// null in Standalone mode Timer timer; bool interrupt; public MainWnd() { InitializeComponent(); Text = programNameAndVer = string.Format("{0} v.{1}", Program.ProgramName, Program.Version); ; factory = new Factory(); } public MainWnd(IList orderInfos) : this() { this.orderInfos = orderInfos; if (Program.LocalSettings.Mode == Mode.TbfLabelPrinter) { try { var cmpntEntity = Config.Entities.Component.CreateFromCfg("Printer", factory.ClassName, string.Empty, 1, DebugMode.Normal, LogLevel.Off, Program.LocalSettings.LabelPrinterCfg); printer = factory.GetComponent(factory.CmpntCfgFromCmpntEntity(cmpntEntity), null) as Printer; printer.Initialize(); } catch (Exception) { MessageBox.Show("Cannot create or initialize a printer", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); } } try { string culture = Program.LocalSettings.Language.Replace('_', '-'); System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(culture); } catch (Exception) { MessageBox.Show("Selected language is not supported.\nUsing English.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en"); } timer = new Timer(); timer.Interval = Program.LocalSettings.DelayBetweenLabels; /// [ms] default = 1000 timer.Tick += new EventHandler(timer_Tick); } void Localize() { startButton.Text = Strings.Start_printing; interruptButton.Text = Strings.Interrupt; settingsToolStripMenuItem.Text = Strings.Settings; if (Program.LocalSettings.Mode == Mode.TbfLabelPrinter) { sapNumberLabel.Text = Strings.Order; separatorLabel.Text = string.Empty; separatorComboBox.Visible = false; snTrailLabel.Text = Strings.Serial_number; } else { sapNumberLabel.Text = Strings.SAP_number_8_digits; separatorLabel.Text = Strings.Separator_3_characters; snTrailLabel.Text = Strings.First_SN_trail_9_digits; } countLabel.Text = Strings.Labels_count; } private void MainWnd_Load(object sender, EventArgs e) { Localize(); LocalSettings.PrepareCombo(Program.LocalSettings.SapNumberHistory, sapNumberComboBox); LocalSettings.PrepareCombo(Program.LocalSettings.SeparatorHistory, separatorComboBox); if (Program.LocalSettings.Mode == Mode.TbfLabelPrinter) { snTrailTextBox.Text = string.Empty; countTextBox.Text = Math.Max(Program.LocalSettings.RemainingSNsCount, 1).ToString(); snTrailLabel.Top -= 26; snTrailTextBox.Top -= 26; countLabel.Top -= 26; countTextBox.Top -= 26; this.ActiveControl = snTrailTextBox; } else if (Program.LocalSettings.Mode == Mode.Standalone) { snTrailTextBox.Text = Program.LocalSettings.CurrentSNTrail.ToString("D9"); countTextBox.Text = Math.Max(Program.LocalSettings.RemainingSNsCount, 1).ToString(); } else { if (orderInfos == null) throw new Exception("Missing OrderInfo-s from production tracing database"); currentSNTrail = 0; foreach (var oi in orderInfos) { if (oi.BaseNr1 + oi.PiecesCount + Cnst.ExtraPieces > currentSNTrail) { currentSNTrail = oi.BaseNr1 + oi.PiecesCount + Cnst.ExtraPieces; } } snTrailTextBox.Text = currentSNTrail.ToString("D9"); snTrailTextBox.Enabled = false; } } /// /// Start printing labels /// private void startButton_Click(object sender, EventArgs e) { if (!int.TryParse(countTextBox.Text, out totalCount) || totalCount <= 0) { MessageBox.Show(Strings.Invalid_SNs_count); return; } remainingCount = totalCount; if (Program.LocalSettings.Mode == Mode.TbfLabelPrinter) { var wm = new Results.Entities.WaterMeter(); wm.PurchaseOrder = string.IsNullOrEmpty(sapNumberComboBox.Text) ? string.Empty : sapNumberComboBox.Text; wm.SerialNr = string.IsNullOrEmpty(snTrailTextBox.Text) ? string.Empty : snTrailTextBox.Text; LocalSettings.UpdateHistory(sapNumberComboBox.Text, ref Program.LocalSettings.SapNumberHistory); //Program.LocalSettings.CurrentSNTrail = snTrailTextBox.Text; Program.LocalSettings.RemainingSNsCount = remainingCount; Program.LocalSettings.Save(); startButton.Enabled = false; interruptButton.Enabled = true; interrupt = false; printer.PrintResults(wm, "document name"); remainingCount--; IncrementSN(snTrailTextBox); } else { /// Program.LocalSettings.Mode == Mode.Standalone || Program.LocalSettings.Mode == Mode.WithDatabase int sapNumber; if (sapNumberComboBox.Text.Length != 8 || !int.TryParse(sapNumberComboBox.Text, out sapNumber) || sapNumber <= 0 || sapNumber > 99999999) { MessageBox.Show(Strings.Invalid_SAP_number); return; } if (separatorComboBox.Text.Length != 3) { MessageBox.Show(Strings.Invalid_separator); return; } if (snTrailTextBox.Text.Length != 9 || !int.TryParse(snTrailTextBox.Text, out currentSNTrail)) { MessageBox.Show(Strings.Invalid_first_SN_trail); return; } else if (Program.LocalSettings.Mode == Mode.Standalone && currentSNTrail < Program.LocalSettings.CurrentSNTrail) { MessageBox.Show(string.Format("{0}, {1} {2:D9}", Strings.Invalid_first_SN_trail, Strings.min, Program.LocalSettings.CurrentSNTrail)); return; } if (Program.LocalSettings.Mode == Mode.Standalone && currentSNTrail > Program.LocalSettings.CurrentSNTrail) { if (MessageBox.Show(string.Format("{0} {1:D9}{2}{3}{4}", Strings.You_are_skipping, Program.LocalSettings.CurrentSNTrail, (currentSNTrail == Program.LocalSettings.CurrentSNTrail + 1) ? "" : string.Format(" ... {0:D9}", currentSNTrail - 1), Environment.NewLine, Strings.Are_you_sure), string.Empty, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) { return; } } if (Program.LocalSettings.Mode == Mode.WithDatabase) { SaveNewOrderInfo(ref currentSNTrail, totalCount); } prefix = sapNumberComboBox.Text; separator = separatorComboBox.Text; sapNumberComboBox.Enabled = false; separatorComboBox.Enabled = false; snTrailTextBox.Enabled = false; countTextBox.Enabled = false; LocalSettings.UpdateHistory(sapNumberComboBox.Text, ref Program.LocalSettings.SapNumberHistory); LocalSettings.UpdateHistory(separatorComboBox.Text, ref Program.LocalSettings.SeparatorHistory); Program.LocalSettings.CurrentSNTrail = currentSNTrail; Program.LocalSettings.RemainingSNsCount = remainingCount; Program.LocalSettings.Save(); startButton.Enabled = false; interruptButton.Enabled = true; interrupt = false; PrintOneLabel(); } if (remainingCount > 0) { timer.Start(); } else { Text = string.Format("{0} ... {1}", programNameAndVer, Strings.completed); MessageBox.Show(string.Format(Strings.x_labels_printed, totalCount)); SaveSettingsUpdateAndEnableUI(); } } /// /// Save a record tp OrderInfo table that coresponds to printed labels /// /// Start S/N trail number /// Printed labels count /// true when successful bool SaveNewOrderInfo(ref int currentSNTrail, int totalCount) { ISession session = SharedDatabase.TracingDB.CreateSession(Program.LocalSettings.TracingDBConnString); ITransaction transaction = session.BeginTransaction(); OrderInfo oi = new OrderInfo(); bool successfullySaved = false; try { var orders = session.QueryOver().List(); /// Determine current S/N trail once again int snTrail = 0; foreach (var o in orders) { if (o.BaseNr1 + o.PiecesCount + Cnst.ExtraPieces > snTrail) { snTrail = o.BaseNr1 + o.PiecesCount + Cnst.ExtraPieces; } } /// Compare current S/N trail with the newly obtained one, update if necessary if (snTrail > currentSNTrail) currentSNTrail = snTrail; oi.POName = "0000000"; oi.PiecesCount = totalCount; oi.TestProcedure = string.Empty; oi.BaseNr1 = currentSNTrail; oi.BaseNr2 = 0; oi.BaseNr3 = 0; oi.BaseNr4 = 0; oi.BaseNr5 = 0; oi.Remark = "Manual S/N printing"; oi.Workflow = null; orders.Add(oi); session.SaveOrUpdate(oi); transaction.Commit(); successfullySaved = true; } catch (Exception exc) { log.ErrorFormat("MySQL database transaction rolled back, data not comitted: {0}", exc.Message); transaction.Rollback(); } return successfullySaved; } void timer_Tick(object sender, EventArgs args) { timer.Stop(); if (interrupt) { Text = string.Format("{0} ... {1}", programNameAndVer, Strings.interrupted); MessageBox.Show(string.Format(Strings.x_labels_printed, totalCount - remainingCount)); SaveSettingsUpdateAndEnableUI(); } else if (Program.LocalSettings.Mode == Mode.TbfLabelPrinter) { var wm = new Results.Entities.WaterMeter(); wm.PurchaseOrder = string.IsNullOrEmpty(sapNumberComboBox.Text) ? string.Empty : sapNumberComboBox.Text; wm.SerialNr = string.IsNullOrEmpty(snTrailTextBox.Text) ? string.Empty : snTrailTextBox.Text; printer.PrintResults(wm, "document name"); remainingCount--; IncrementSN(snTrailTextBox); if (remainingCount > 0) { timer.Enabled = true; } else { Text = string.Format("{0} ... {1}", programNameAndVer, Strings.completed); MessageBox.Show(string.Format(Strings.x_labels_printed, totalCount)); SaveSettingsUpdateAndEnableUI(); } } else { /// Program.LocalSettings.Mode == Mode.Standalone || Program.LocalSettings.Mode == Mode.WithDatabase PrintOneLabel(); if (remainingCount > 0) { timer.Enabled = true; } else { Text = string.Format("{0} ... {1}", programNameAndVer, Strings.completed); MessageBox.Show(string.Format(Strings.x_labels_printed, totalCount)); SaveSettingsUpdateAndEnableUI(); } } } char[] digits = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; /// void IncrementSN(TextBox tb) { if (tb != null) { string currentSN = tb.Text; int currentSnNr; int startIx = currentSN.IndexOfAny(digits); if (startIx >= 0) { int lastDigitPosPlus1 = startIx + 1; var listOfDigits = new List(digits); while (lastDigitPosPlus1 < currentSN.Length && listOfDigits.Contains(currentSN[lastDigitPosPlus1])) { lastDigitPosPlus1++; } int digitsCount = lastDigitPosPlus1 - startIx; if (int.TryParse(currentSN.Substring(startIx, digitsCount), out currentSnNr) && currentSnNr >= 0) { currentSnNr++; string newSN = currentSnNr.ToString(); int len = newSN.Length; if (len <= digitsCount) { tb.Text = currentSN.Substring(0, startIx + digitsCount - len) + newSN + currentSN.Substring(startIx + digitsCount); } else { tb.Text = currentSN.Substring(0, startIx) + newSN + currentSN.Substring(startIx + digitsCount); ; } } } } } void PrintOneLabel() { if (remainingCount > 0) { string code = string.Format("{0}{1}{2:D9}", prefix, separator, currentSNTrail); Text = string.Format("{0} ... {1} ... {2} / {3}", programNameAndVer, code, totalCount - remainingCount + 1, totalCount); DataMatrix matrix = new DataMatrix(code, SymbolSize.SquareAuto); new Printers.DataMatrixAndTextPrintDoc(matrix.Matrix, code.Replace(separator.Substring(0, 2), "\n")).Print(); currentSNTrail++; remainingCount--; } } void SaveSettingsUpdateAndEnableUI() { if (Program.LocalSettings.Mode != Mode.TbfLabelPrinter) snTrailTextBox.Text = currentSNTrail.ToString("D9"); countTextBox.Text = remainingCount.ToString(); Program.LocalSettings.CurrentSNTrail = currentSNTrail; Program.LocalSettings.RemainingSNsCount = remainingCount; Program.LocalSettings.Save(); sapNumberComboBox.Enabled = true; separatorComboBox.Enabled = true; snTrailTextBox.Enabled = (Program.LocalSettings.Mode == Mode.TbfLabelPrinter || Program.LocalSettings.Mode == Mode.Standalone); countTextBox.Enabled = true; startButton.Enabled = true; interruptButton.Enabled = false; } private void interruptButton_Click(object sender, EventArgs e) { interrupt = true; } private void settingsToolStripMenuItem_Click(object sender, EventArgs e) { /// Connect to the database of users and log in a user try { SharedDatabase.UsersDB.ConnectionString = Program.LocalSettings.UsersDBConnString; SharedDatabase.UsersDB.DbType = Common.DBType.MySql; DialogResult dr = new SharedDatabase.Forms.LoginDlg().ShowDialog(); if (dr != DialogResult.OK) return; } catch (Exception exc) { string msg = string.Format("Failed to connect to the database of users:{0}{1}", Environment.NewLine, exc.Message); log.Error(msg); MessageBox.Show(msg); return; } /// Modify program settings try { DialogResult dr = new SettingsDlg(Program.LocalSettings).ShowDialog(); if (dr == DialogResult.OK) { Program.LocalSettings.Save(); MessageBox.Show(Strings.Program_restart_is_required); Close(); } } catch (Exception exc) { string msg = string.Format("Error occurred, settings were not modified:{0}{1}", Environment.NewLine, exc.Message); log.Error(msg); MessageBox.Show(msg); } } } }