/// /// Copyright (c) 2021-2023 Sensus Slovensko a.s. /// using System; using System.Collections.Generic; using System.Windows.Forms; using log4net; using NHibernate; using Common; using SharedDatabase.Entities; using OrderManagement.Resources; using Common.Forms; using SharedDatabase; namespace OrderManagement { public partial class OrderManagementDlg : Form { private static readonly ILog log = LogManager.GetLogger(typeof(OrderManagementDlg)); public const long MaxPredefinedOrderNr = 1000; ISessionFactory sessionFactory; IList listOfOrders; IList listOfWorkflows; MySortOrder sortOrder = MySortOrder.Ascending; int sortColumn = -1; /// 0-based index of column to be used for sorting public OrderManagementDlg() { 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"); } InitializeComponent(); Text = string.Format("{0} v.{1}", Program.ProgramName, Program.Version); ; } public OrderManagementDlg(ISessionFactory sessionFactory, IList listOfOrders, IList listOfWorkflows) : this() { this.sessionFactory = sessionFactory; this.listOfOrders = listOfOrders; this.listOfWorkflows = listOfWorkflows; } private void OrderManagementDlg_Load(object sender, EventArgs e) { Localize(); InitializeColumns(listViewEx1); if (Program.LocalSettings.IsShowPredefinedOrders) { foreach (var oi in listOfOrders) AddRow(listViewEx1, oi); } else { int orderNr; foreach (var oi in listOfOrders) { if (int.TryParse(oi.POName, out orderNr) && orderNr > MaxPredefinedOrderNr) { AddRow(listViewEx1, oi); } } } } void Localize() { Text = string.Format("{0} ver.{1}", Strings.Order_Management, Program.Version); settingsToolStripMenuItem.Text = Strings.Settings; closeButton.Text = Strings.Close; addButton.Text = Strings.Add; editButton.Text = Strings.Edit; copyButton.Text = Strings.Copy; deleteButton.Text = Strings.Delete; printButton.Text = Strings.Print; } enum Clmn { Order, State, Pieces, CurrentPcs, Workflow, Procedure, Variant, VacoDescr, MadeInText, Year, ModuleParam, LaserMarking, Packing, SNPrefix, SNFirst, SNDigitsCount, SNSuffix, RAPrefix, RAFirst, RASuffix, Remark, Count } void InitializeColumns(ListView lv) { lv.Columns.Add(new ColumnHeader { Text = Strings.Order, Width = 70 }); lv.Columns.Add(new ColumnHeader { Text = Strings.State, Width = 60 }); lv.Columns.Add(new ColumnHeader { Text = "Target", Width = 50 }); lv.Columns.Add(new ColumnHeader { Text = "Produced", Width = 60 }); lv.Columns.Add(new ColumnHeader { Text = Strings.Workflow, Width = 100 }); lv.Columns.Add(new ColumnHeader { Text = Strings.Test_procedure, Width = 200 }); lv.Columns.Add(new ColumnHeader { Text = Strings.Variant_code, Width = 150 }); lv.Columns.Add(new ColumnHeader { Text = Strings.Variant_description, Width = 100 }); lv.Columns.Add(new ColumnHeader { Text = Strings.Made_in_text, Width = 100 }); lv.Columns.Add(new ColumnHeader { Text = Strings.Year_of_calibration, Width = 50 }); lv.Columns.Add(new ColumnHeader { Text = Strings.Module_parameter, Width = 100 }); lv.Columns.Add(new ColumnHeader { Text = Strings.Laser_marking, Width = 100 }); lv.Columns.Add(new ColumnHeader { Text = Strings.Packing, Width = 100 }); lv.Columns.Add(new ColumnHeader { Text = Strings.SN + " " + Strings.prefix, Width = 80 }); lv.Columns.Add(new ColumnHeader { Text = Strings.SN + " " + Strings.first, Width = 80 }); lv.Columns.Add(new ColumnHeader { Text = Strings.SN + " " + Strings.digits_count, Width = 80 }); lv.Columns.Add(new ColumnHeader { Text = Strings.SN + " " + Strings.suffix, Width = 80 }); lv.Columns.Add(new ColumnHeader { Text = Strings.RA + " " + Strings.prefix, Width = 80 }); lv.Columns.Add(new ColumnHeader { Text = Strings.RA + " " + Strings.first, Width = 80 }); lv.Columns.Add(new ColumnHeader { Text = Strings.RA + " " + Strings.suffix, Width = 80 }); lv.Columns.Add(new ColumnHeader { Text = Strings.Remark, Width = 200 }); } void AddRow(ListView lv, OrderInfo o) { ListViewItem lvi = new ListViewItem(o.POName); lvi.SubItems.Add(((OrderState)o.POState).ToString()); lvi.SubItems.Add(o.PiecesCount.ToString()); lvi.SubItems.Add(o.CurrentPcsCount.ToString()); lvi.SubItems.Add(o.Workflow); lvi.SubItems.Add(o.TestProcedure); lvi.SubItems.Add(o.VariantCode); lvi.SubItems.Add(o.VacoDescription); lvi.SubItems.Add(o.MadeInText); lvi.SubItems.Add(o.Year.ToString()); lvi.SubItems.Add(o.ModuleParam); lvi.SubItems.Add(o.LaserMarking); lvi.SubItems.Add(o.Packing); lvi.SubItems.Add(o.SNPrefix); lvi.SubItems.Add(o.SNFirst.ToString(string.Format("D{0}", o.SNDigitsCount))); lvi.SubItems.Add(o.SNDigitsCount.ToString()); lvi.SubItems.Add(o.SNSuffix); lvi.SubItems.Add(o.RAPrefix); lvi.SubItems.Add(o.RAFirst.ToString(SharedDatabase.Const.RAFormat)); lvi.SubItems.Add(o.RASuffix); lvi.SubItems.Add(o.Remark); lvi.Tag = o; lv.Items.Add(lvi); } void UpdateRow(ListViewItem lvi, OrderInfo o) { int i = 0; lvi.SubItems[i++].Text = o.POName; lvi.SubItems[i++].Text = ((OrderState)o.POState).ToString(); lvi.SubItems[i++].Text = o.PiecesCount.ToString(); lvi.SubItems[i++].Text = o.CurrentPcsCount.ToString(); lvi.SubItems[i++].Text = o.Workflow; lvi.SubItems[i++].Text = o.TestProcedure; lvi.SubItems[i++].Text = o.VariantCode; lvi.SubItems[i++].Text = o.VacoDescription; lvi.SubItems[i++].Text = o.MadeInText; lvi.SubItems[i++].Text = o.Year.ToString(); lvi.SubItems[i++].Text = o.ModuleParam; lvi.SubItems[i++].Text = o.LaserMarking; lvi.SubItems[i++].Text = o.Packing; lvi.SubItems[i++].Text = o.SNPrefix; lvi.SubItems[i++].Text = o.SNFirst.ToString(string.Format("D{0}", o.SNDigitsCount)); lvi.SubItems[i++].Text = o.SNDigitsCount.ToString(); lvi.SubItems[i++].Text = o.SNSuffix; lvi.SubItems[i++].Text = o.RAPrefix; lvi.SubItems[i++].Text = o.RAFirst.ToString(SharedDatabase.Const.RAFormat); lvi.SubItems[i++].Text = o.RASuffix; lvi.SubItems[i++].Text = o.Remark; } private void settingsToolStripMenuItem_Click(object sender, EventArgs e) { try { Common.CurrentUser.RemoteUsersDB = new Common.DBSettings(Common.DBType.MySql, Program.LocalSettings.UsersDBConnString); DialogResult dr = new SharedDatabase.Forms.LoginDlg().ShowDialog(); if (dr != DialogResult.OK) return; dr = new SettingsDlg(Program.LocalSettings).ShowDialog(); if (dr == DialogResult.OK) { Program.LocalSettings.Save(); MessageBox.Show(Strings.Program_restart_is_required); Close(); } } catch (Exception exc) { log.ErrorFormat("Failed to connect to the database of users: {0}", exc.Message); } } private void closeButton_Click(object sender, EventArgs e) { DialogResult = DialogResult.OK; Close(); } private void addButton_Click(object sender, EventArgs e) { /// /// Determine the next production order name /// string candidatePOName = string.Empty; int candidatePONr; foreach (var o in listOfOrders) { if (string.Compare(candidatePOName, o.POName, StringComparison.InvariantCulture) < 0) candidatePOName = o.POName; } if (int.TryParse(candidatePOName, out candidatePONr)) { candidatePONr++; candidatePOName = candidatePONr.ToString(string.Format("D{0}", candidatePOName.Length)); } /// /// Create and edit the order /// var order = new OrderInfo(candidatePOName); if (new EditOrderDlg(sessionFactory, order, listOfOrders, Program.LocalSettings.IsShowPredefinedOrders).ShowDialog() == DialogResult.OK) { listOfOrders.Add(order); AddRow(listViewEx1, order); } } private void listViewEx1_DoubleClick(object sender, EventArgs e) { if (listViewEx1.SelectedItems.Count != 1 || !(listViewEx1.SelectedItems[0].Tag is OrderInfo)) return; OrderInfo order = listViewEx1.SelectedItems[0].Tag as OrderInfo; if (order.POState == (sbyte)OrderState.New) { editButton_Click(sender, e); } else { try { new OrderStateDlg(order, sessionFactory).ShowDialog(); } catch (Exception exc) { log.ErrorFormat("Failed to read order {0} when creating OrderStateDlg: {1)", order.POName, exc.Message); } } } private void editButton_Click(object sender, EventArgs e) { if (listViewEx1.SelectedItems.Count != 1 || !(listViewEx1.SelectedItems[0].Tag is OrderInfo)) return; OrderInfo order = listViewEx1.SelectedItems[0].Tag as OrderInfo; if (order.POState == (sbyte)OrderState.New) { if (new EditOrderDlg(sessionFactory, order, listOfOrders, Program.LocalSettings.IsShowPredefinedOrders, true).ShowDialog() == DialogResult.OK) { UpdateRow(listViewEx1.SelectedItems[0], order); } } else { MessageBox.Show(Strings.You_can_only_edit_New_porduction_orders); } } private void finishButton_Click(object sender, EventArgs e) { if (listViewEx1.SelectedItems.Count != 1 || !(listViewEx1.SelectedItems[0].Tag is OrderInfo)) return; OrderInfo order = listViewEx1.SelectedItems[0].Tag as OrderInfo; if (order.POState == (sbyte)OrderState.Active && order.CurrentPcsCount >= order.PiecesCount) { ISession session = null; try { session = sessionFactory.OpenSession(); var selectedOrders = session.QueryOver() .Where(x => x.Id == order.Id) .List(); if (selectedOrders.Count == 1) { selectedOrders[0].POState = (sbyte)OrderState.Finished; session.SaveOrUpdate(selectedOrders[0]); session.Flush(); order.POState = (sbyte)OrderState.Finished; UpdateRow(listViewEx1.SelectedItems[0], order); } } catch (Exception ex) { MessageBox.Show("Changing production order state failed: {0}", ex.Message); } finally { if (session != null && session.IsOpen) session.Close(); } } else { MessageBox.Show(Strings.You_can_only_finish_completed_production_orders); } } private void copyButton_Click(object sender, EventArgs e) { if (listViewEx1.SelectedItems.Count != 1 || !(listViewEx1.SelectedItems[0].Tag is OrderInfo)) return; OrderInfo oriOrder = listViewEx1.SelectedItems[0].Tag as OrderInfo; /// /// Determine the next production order name /// string candidatePOName = string.Empty; int candidatePONr; foreach (var o in listOfOrders) { if (string.Compare(candidatePOName, o.POName, StringComparison.InvariantCulture) < 0) candidatePOName = o.POName; } if (int.TryParse(candidatePOName, out candidatePONr)) { candidatePONr++; candidatePOName = candidatePONr.ToString(string.Format("D{0}", candidatePOName.Length)); } /// /// Create and edit the order /// OrderInfo copiedOrder = oriOrder.Clone() as OrderInfo; copiedOrder.POName = candidatePOName; copiedOrder.POState = (sbyte)OrderState.New; copiedOrder.SNFirst = oriOrder.SNFirst + oriOrder.PiecesCount; /// TODO copiedOrder.RAFirst = oriOrder.RAFirst + oriOrder.PiecesCount; /// TODO copiedOrder.BaseNr1 = 0; copiedOrder.BaseNr2 = 0; copiedOrder.BaseNr3 = 0; copiedOrder.BaseNr4 = 0; copiedOrder.BaseNr5 = 0; copiedOrder.CurrentPcsCount = 0; copiedOrder.CurrentSN = 0; copiedOrder.CurrentRA = 0; copiedOrder.CurrentNr1 = 0; copiedOrder.CurrentNr2 = 0; copiedOrder.CurrentNr3 = 0; copiedOrder.CurrentNr4 = 0; copiedOrder.CurrentNr5 = 0; copiedOrder.Remark = string.Format("Copy of order {0}", oriOrder.POName); if (new EditOrderDlg(sessionFactory, copiedOrder, listOfOrders, Program.LocalSettings.IsShowPredefinedOrders).ShowDialog() == DialogResult.OK) { listOfOrders.Add(copiedOrder); AddRow(listViewEx1, copiedOrder); } } private void deleteButton_Click(object sender, EventArgs e) { if (listViewEx1.SelectedItems.Count != 1 || !(listViewEx1.SelectedItems[0].Tag is OrderInfo)) return; OrderInfo order = listViewEx1.SelectedItems[0].Tag as OrderInfo; if (order.POState == (sbyte)OrderState.New) { if (MessageBox.Show(Strings.Are_you_sure, Strings.Warning, MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.Yes) { try { ISession session = sessionFactory.OpenSession(); var list = session.QueryOver().Where(x => x.Id == order.Id).List(); if (list.Count == 1) { if (list[0].POState == (sbyte)OrderState.New) { session.Delete(list[0]); session.Flush(); listOfOrders.Remove(order); listViewEx1.Items.Remove(listViewEx1.SelectedItems[0]); } else { MessageBox.Show(Strings.You_can_only_delete_New_porduction_orders); } } else { listOfOrders.Remove(order); listViewEx1.Items.Remove(listViewEx1.SelectedItems[0]); MessageBox.Show(Strings.Order_was_already_deleted); } session.Close(); } catch (Exception exc) { MessageBox.Show(string.Format("Deleting an order failed\r\n{0}", exc.Message)); } } } else { MessageBox.Show(Strings.You_can_only_delete_New_porduction_orders); } } private void listViewEx1_ColumnClick(object sender, ColumnClickEventArgs e) { if (e.Column == sortColumn) { /// Clicked on the same column header => increment to the next applicable MySortOrder sortOrder = (sortOrder == MySortOrder.Ascending) ? MySortOrder.Descending : MySortOrder.Ascending; } else { /// Clicked on another column header => set sortOrder to MySortOrder.Ascending sortColumn = e.Column; sortOrder = MySortOrder.Ascending; } if (sortColumn == (int)Clmn.Pieces || sortColumn == (int)Clmn.SNFirst || sortColumn == (int)Clmn.SNDigitsCount || sortColumn == (int)Clmn.RAFirst) { listViewEx1.ListViewItemSorter = new LviIntColumnComparer(sortColumn, sortOrder); } else { listViewEx1.ListViewItemSorter = new LviTextColumnComparer(sortColumn, sortOrder); } listViewEx1.SetSortIcon(sortColumn, sortOrder); listViewEx1.Sort(); } private void printButton_Click(object sender, EventArgs e) { if (listViewEx1.SelectedItems.Count != 1 || !(listViewEx1.SelectedItems[0].Tag is OrderInfo)) return; OrderInfo order = listViewEx1.SelectedItems[0].Tag as OrderInfo; new OrderPrintDocument(order).Print(); } } }