diff --git a/.gitignore b/.gitignore
index 3e6385a91..652d398f5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -32,6 +32,8 @@ MergeResultsDBs/bin/
MergeResultsDBs/obj/
OrderManagement/bin/
OrderManagement/obj/
+ProductionTracing/bin/
+ProductionTracing/obj/
RecordProcessing/bin/
RecordProcessing/obj/
ResetBatchNr/bin/
diff --git a/Common/Forms/ListViewEx.cs b/Common/Forms/ListViewEx.cs
index acc5894d3..8fd75da2c 100644
--- a/Common/Forms/ListViewEx.cs
+++ b/Common/Forms/ListViewEx.cs
@@ -61,6 +61,9 @@ namespace Common.Forms
private const int HDN_ITEMCHANGINGW = (HDN_FIRST-20);
#endregion
+ public MySortOrder SortOrder = MySortOrder.None;
+ public int SortColumn = -1;
+
///
/// Required designer variable.
///
diff --git a/OrderManagement/SettingsDlg.cs b/OrderManagement/SettingsDlg.cs
index 4fcfc028d..d9816036e 100644
--- a/OrderManagement/SettingsDlg.cs
+++ b/OrderManagement/SettingsDlg.cs
@@ -38,14 +38,14 @@ namespace OrderManagement
{
Localize();
+ if (ls == null) return;
+
languageComboBox.Items.Add("EN");
languageComboBox.Items.Add("ZH_CN");
languageComboBox.Items.Add("DE");
languageComboBox.Items.Add("SK");
languageComboBox.Text = ls.Language;
- if (ls == null) return;
-
loginRequiredCheckBox.Checked = ls.IsUserLoginRequired;
showPredefinedOrdersCheckBox.Checked = ls.IsShowPredefinedOrders;
diff --git a/ProductionTracing/FiltersConfig.cs b/ProductionTracing/FiltersConfig.cs
new file mode 100644
index 000000000..4f829290f
--- /dev/null
+++ b/ProductionTracing/FiltersConfig.cs
@@ -0,0 +1,89 @@
+///
+/// Copyright (c) 2016-2018 Sensus Slovensko a.s.
+///
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Text;
+using System.Xml.Serialization;
+using System.Windows.Forms;
+using ProductionTracing.Resources;
+
+namespace ProductionTracing
+{
+ ///
+ /// Class to be serialized to an XML file...
+ /// Public members are filters / parts of a query.
+ ///
+ [XmlRootAttribute("Query")]
+ public class FiltersConfig
+ {
+ public bool[] FilterEnabled;
+
+ [XmlIgnore]
+ public int FiterEnabledCount { get { return (FilterEnabled != null) ? FilterEnabled.Length : 0; } }
+
+ public string[] ResultItems;
+
+ [XmlArrayAttribute("ResultsClmnWidths")]
+ public int[] ResultsClmnWidths;
+ [XmlIgnore]
+ public int ResultsClmnCount { get { return (ResultsClmnWidths != null) ? ResultsClmnWidths.Length : 0; } }
+
+
+ public FiltersConfig()
+ {
+ ResultItems = new string[]
+ {
+ "Code1~Housing s/n~{0}~~0",
+ "Code2~eRegister nr.~{0}~~0",
+ "Code3~S/N~{0}~~0",
+ "Code4~Radio address~{0}~~0",
+ "POrder~Order~{0}~~0",
+ "Workflow~Workflow~{0}~~0",
+ "Timestamp~Time stamp~{0:dd.MM.yyyy HH:mm:ss}~~0"
+ };
+ }
+
+ ///
+ /// Load public fields of this class from the XML file.
+ ///
+ public static FiltersConfig Load(string fileName)
+ {
+ try
+ {
+ using (TextReader reader = new StreamReader(fileName))
+ {
+ FiltersConfig ls = (new XmlSerializer(typeof(FiltersConfig))).Deserialize(reader) as FiltersConfig;
+ // Copy the settings just in case De-serialize() completes OK
+ return ls;
+ }
+ }
+ catch (Exception exc)
+ {
+ string msg = exc.Message;
+ return null;
+ }
+ }
+
+ ///
+ /// Save public fields of this class to the XML file.
+ ///
+ public bool Save(string fileName)
+ {
+ try
+ {
+ using (TextWriter writer = new StreamWriter(fileName))
+ {
+ (new XmlSerializer(typeof(FiltersConfig))).Serialize(writer, this);
+ }
+ return true;
+ }
+ catch (Exception exc)
+ {
+ MessageBox.Show(exc.Message, Strings.Error_saving_file, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
+ return false;
+ }
+ }
+ }
+}
diff --git a/ProductionTracing/Forms/MoreInfoDlg.Designer.cs b/ProductionTracing/Forms/MoreInfoDlg.Designer.cs
new file mode 100644
index 000000000..8dbe2fa74
--- /dev/null
+++ b/ProductionTracing/Forms/MoreInfoDlg.Designer.cs
@@ -0,0 +1,65 @@
+namespace ProductionTracing.Forms
+{
+ partial class MoreInfoDlg
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.listViewEx = new Common.Forms.ListViewEx();
+ this.SuspendLayout();
+ //
+ // listViewEx
+ //
+ this.listViewEx.AllowColumnReorder = true;
+ this.listViewEx.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.listViewEx.DoubleClickActivation = false;
+ this.listViewEx.FullRowSelect = true;
+ this.listViewEx.Location = new System.Drawing.Point(0, 0);
+ this.listViewEx.Name = "listViewEx";
+ this.listViewEx.Size = new System.Drawing.Size(1434, 461);
+ this.listViewEx.TabIndex = 0;
+ this.listViewEx.UseCompatibleStateImageBehavior = false;
+ this.listViewEx.View = System.Windows.Forms.View.Details;
+ //
+ // MoreInfoDlg
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(1434, 461);
+ this.Controls.Add(this.listViewEx);
+ this.Name = "MoreInfoDlg";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+ this.Text = "More informations";
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private Common.Forms.ListViewEx listViewEx;
+
+ }
+}
\ No newline at end of file
diff --git a/ProductionTracing/Forms/MoreInfoDlg.cs b/ProductionTracing/Forms/MoreInfoDlg.cs
new file mode 100644
index 000000000..e507ded97
--- /dev/null
+++ b/ProductionTracing/Forms/MoreInfoDlg.cs
@@ -0,0 +1,59 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using NHibernate;
+using SharedDatabase.Entities;
+using ProductionTracing.Resources;
+
+namespace ProductionTracing.Forms
+{
+ public partial class MoreInfoDlg : Form
+ {
+ public MoreInfoDlg(int refRecordId, ISession session)
+ {
+ InitializeComponent();
+ Text = Strings.More_informations;
+
+ listViewEx.Columns.Add("Date/time", 150);
+ listViewEx.Columns.Add("Workstep", 100);
+ listViewEx.Columns.Add("Workplace", 100);
+ listViewEx.Columns.Add("User", 70);
+ listViewEx.Columns.Add("Result", 70);
+ listViewEx.Columns.Add("Parts and serial numbers", 1000);
+
+ var refRecords = session.QueryOver()
+ .Where(x => (x.Id == refRecordId))
+ .OrderBy(x => x.Timestamp).Asc
+ .List();
+
+ foreach (var rr in refRecords)
+ {
+ foreach (var step in rr.StepRecords)
+ {
+ ListViewItem lvi = new ListViewItem(step.Timestamp.ToString());
+ lvi.SubItems.Add(step.Workstep != null ? step.Workstep : string.Empty);
+ lvi.SubItems.Add(step.Workplace != null ? step.Workplace : string.Empty);
+ lvi.SubItems.Add(step.User != null ? step.User : string.Empty);
+ lvi.SubItems.Add(step.Result == 0 ? "OK" : string.Format("Err{0}", step.Result));
+
+ StringBuilder sb = new StringBuilder();
+ if (!string.IsNullOrEmpty(rr.Name1)) sb.Append(string.Format(" {0}={1}", rr.Name1, rr.Code1 != null ? rr.Code1 : string.Empty));
+ if (!string.IsNullOrEmpty(rr.Name2)) sb.Append(string.Format(" {0}={1}", rr.Name2, rr.Code1 != null ? rr.Code2 : string.Empty));
+ if (!string.IsNullOrEmpty(rr.Code3)) sb.Append(string.Format(" S/N={0}", rr.Code3));
+ if (!string.IsNullOrEmpty(rr.Code4)) sb.Append(string.Format(" radio addres={0}", rr.Code4));
+ foreach (var rec in step.Records)
+ {
+ sb.Append(string.Format(" {0}={1}", rec.Name, rec.Code != null ? rec.Code : string.Empty));
+ }
+ lvi.SubItems.Add(sb.ToString());
+ listViewEx.Items.Add(lvi);
+ }
+ }
+ }
+ }
+}
diff --git a/ProductionTracing/Forms/MoreInfoDlg.resx b/ProductionTracing/Forms/MoreInfoDlg.resx
new file mode 100644
index 000000000..1af7de150
--- /dev/null
+++ b/ProductionTracing/Forms/MoreInfoDlg.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/ProductionTracing/Forms/NoBenchOrDatabaseDlg.Designer.cs b/ProductionTracing/Forms/NoBenchOrDatabaseDlg.Designer.cs
new file mode 100644
index 000000000..763f5dd07
--- /dev/null
+++ b/ProductionTracing/Forms/NoBenchOrDatabaseDlg.Designer.cs
@@ -0,0 +1,120 @@
+namespace ProductionTracing.Forms
+{
+ partial class NoBenchOrDatabaseDlg
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(NoBenchOrDatabaseDlg));
+ this.exitButton = new System.Windows.Forms.Button();
+ this.retryButton = new System.Windows.Forms.Button();
+ this.configureButton = new System.Windows.Forms.Button();
+ this.pictureBox1 = new System.Windows.Forms.PictureBox();
+ this.errorMessageLabel = new System.Windows.Forms.Label();
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
+ this.SuspendLayout();
+ //
+ // exitButton
+ //
+ this.exitButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+ this.exitButton.Location = new System.Drawing.Point(42, 68);
+ this.exitButton.Name = "exitButton";
+ this.exitButton.Size = new System.Drawing.Size(246, 33);
+ this.exitButton.TabIndex = 0;
+ this.exitButton.Text = "Exit";
+ this.exitButton.UseVisualStyleBackColor = true;
+ this.exitButton.Click += new System.EventHandler(this.exitButton_Click);
+ //
+ // retryButton
+ //
+ this.retryButton.Location = new System.Drawing.Point(42, 146);
+ this.retryButton.Name = "retryButton";
+ this.retryButton.Size = new System.Drawing.Size(246, 33);
+ this.retryButton.TabIndex = 1;
+ this.retryButton.Text = "Retry database connection";
+ this.retryButton.UseVisualStyleBackColor = true;
+ this.retryButton.Click += new System.EventHandler(this.retryButton_Click);
+ //
+ // configureButton
+ //
+ this.configureButton.Location = new System.Drawing.Point(42, 107);
+ this.configureButton.Name = "configureButton";
+ this.configureButton.Size = new System.Drawing.Size(246, 33);
+ this.configureButton.TabIndex = 2;
+ this.configureButton.Text = "Configure test benches (password required)";
+ this.configureButton.UseVisualStyleBackColor = true;
+ this.configureButton.Click += new System.EventHandler(this.configureButton_Click);
+ //
+ // pictureBox1
+ //
+ this.pictureBox1.ErrorImage = ((System.Drawing.Image)(resources.GetObject("pictureBox1.ErrorImage")));
+ this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image")));
+ this.pictureBox1.InitialImage = null;
+ this.pictureBox1.Location = new System.Drawing.Point(42, 21);
+ this.pictureBox1.Name = "pictureBox1";
+ this.pictureBox1.Size = new System.Drawing.Size(32, 32);
+ this.pictureBox1.TabIndex = 3;
+ this.pictureBox1.TabStop = false;
+ //
+ // errorMessageLabel
+ //
+ this.errorMessageLabel.AutoSize = true;
+ this.errorMessageLabel.Location = new System.Drawing.Point(80, 31);
+ this.errorMessageLabel.Name = "errorMessageLabel";
+ this.errorMessageLabel.Size = new System.Drawing.Size(160, 13);
+ this.errorMessageLabel.TabIndex = 4;
+ this.errorMessageLabel.Text = "Cannot connect to the database";
+ //
+ // NoBenchOrDatabaseDlg
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.CancelButton = this.exitButton;
+ this.ClientSize = new System.Drawing.Size(328, 194);
+ this.Controls.Add(this.errorMessageLabel);
+ this.Controls.Add(this.pictureBox1);
+ this.Controls.Add(this.configureButton);
+ this.Controls.Add(this.retryButton);
+ this.Controls.Add(this.exitButton);
+ this.Name = "NoBenchOrDatabaseDlg";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "Error";
+ this.Load += new System.EventHandler(this.NoDatabaseMsgDlg_Load);
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Button exitButton;
+ private System.Windows.Forms.Button retryButton;
+ private System.Windows.Forms.Button configureButton;
+ private System.Windows.Forms.PictureBox pictureBox1;
+ private System.Windows.Forms.Label errorMessageLabel;
+ }
+}
\ No newline at end of file
diff --git a/ProductionTracing/Forms/NoBenchOrDatabaseDlg.cs b/ProductionTracing/Forms/NoBenchOrDatabaseDlg.cs
new file mode 100644
index 000000000..c26167cca
--- /dev/null
+++ b/ProductionTracing/Forms/NoBenchOrDatabaseDlg.cs
@@ -0,0 +1,48 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using ProductionTracing.Resources;
+
+namespace ProductionTracing.Forms
+{
+ public partial class NoBenchOrDatabaseDlg : Form
+ {
+ public string Message;
+ public bool ShowRetry;
+
+ public NoBenchOrDatabaseDlg()
+ {
+ InitializeComponent();
+ }
+
+ private void NoDatabaseMsgDlg_Load(object sender, EventArgs e)
+ {
+ Text = Strings.Error;
+ errorMessageLabel.Text = (Message != null) ? Message : Strings.Error;
+ exitButton.Text = Strings.ExitBtnText;
+ retryButton.Text = Strings.RetryDatabaseText;
+ configureButton.Text = Strings.ConfigureDatabaseText;
+ if (!ShowRetry) retryButton.Enabled = false;
+ }
+
+ private void exitButton_Click(object sender, EventArgs e)
+ {
+ DialogResult = DialogResult.Abort;
+ }
+
+ private void retryButton_Click(object sender, EventArgs e)
+ {
+ DialogResult = DialogResult.Retry;
+ }
+
+ private void configureButton_Click(object sender, EventArgs e)
+ {
+ DialogResult = DialogResult.OK;
+ }
+ }
+}
diff --git a/ProductionTracing/Forms/NoBenchOrDatabaseDlg.resx b/ProductionTracing/Forms/NoBenchOrDatabaseDlg.resx
new file mode 100644
index 000000000..e42c6fc53
--- /dev/null
+++ b/ProductionTracing/Forms/NoBenchOrDatabaseDlg.resx
@@ -0,0 +1,272 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+
+ 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
+ QBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqF
+ BwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQ
+ RuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEB
+ AKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRR
+ eAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAA
+ aRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQe
+ AEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAa
+ hQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcA
+ kEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbh
+ AQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCk
+ UXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgA
+ AGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkU
+ HgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBA
+ GoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUH
+ AJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG
+ 4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEA
+ pFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4
+ AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABp
+ FB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4A
+ QBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqF
+ BwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQ
+ RuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEB
+ AKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRR
+ eAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAA
+ aRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQe
+ AEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAa
+ hQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcA
+ kEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbh
+ AQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCk
+ UXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgA
+ AGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkU
+ HgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBA
+ GoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUH
+ AJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG
+ 4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEA
+ pFF4AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4
+ AABpFB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABp
+ FB4AQBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4A
+ QBqFBwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqF
+ BwCQRuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQ
+ RuEBAKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEB
+ AKRReAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRR
+ eAAAaRQeAEAahQcAkEbhAQCkUXgAAGkUHgBAGoUHAJBG4QEApFF4AABpFB4AQBqFBwCQRuEBAKRReAAA
+ Wc6d+2/gNp2ukwoN8QAAAABJRU5ErkJggg==
+
+
+
+
+ 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
+ YUP1lbK+/k8KJ49ubHudCAAAAABJRU5ErkJggg==
+
+
+
\ No newline at end of file
diff --git a/ProductionTracing/Forms/SettingsDlg.Designer.cs b/ProductionTracing/Forms/SettingsDlg.Designer.cs
new file mode 100644
index 000000000..b5071e4a7
--- /dev/null
+++ b/ProductionTracing/Forms/SettingsDlg.Designer.cs
@@ -0,0 +1,179 @@
+namespace ProductionTracing.Forms
+{
+ partial class SettingsDlg
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.commonGroupBox = new System.Windows.Forms.GroupBox();
+ this.loginRequiredCheckBox = new System.Windows.Forms.CheckBox();
+ this.languageComboBox = new System.Windows.Forms.ComboBox();
+ this.languageLabel = new System.Windows.Forms.Label();
+ this.connStrForTracingGroupBox = new System.Windows.Forms.GroupBox();
+ this.tracingDBConnStringTextBox = new System.Windows.Forms.TextBox();
+ this.connStrForUsersGroupBox = new System.Windows.Forms.GroupBox();
+ this.usersDBConnStringTextBox = new System.Windows.Forms.TextBox();
+ this.saveButton = new System.Windows.Forms.Button();
+ this.cancelButton = new System.Windows.Forms.Button();
+ this.commonGroupBox.SuspendLayout();
+ this.connStrForTracingGroupBox.SuspendLayout();
+ this.connStrForUsersGroupBox.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // commonGroupBox
+ //
+ this.commonGroupBox.Controls.Add(this.languageComboBox);
+ this.commonGroupBox.Controls.Add(this.languageLabel);
+ this.commonGroupBox.Location = new System.Drawing.Point(12, 161);
+ this.commonGroupBox.Name = "commonGroupBox";
+ this.commonGroupBox.Size = new System.Drawing.Size(418, 53);
+ this.commonGroupBox.TabIndex = 16;
+ this.commonGroupBox.TabStop = false;
+ //
+ // loginRequiredCheckBox
+ //
+ this.loginRequiredCheckBox.AutoSize = true;
+ this.loginRequiredCheckBox.Location = new System.Drawing.Point(19, 46);
+ this.loginRequiredCheckBox.Name = "loginRequiredCheckBox";
+ this.loginRequiredCheckBox.Size = new System.Drawing.Size(114, 17);
+ this.loginRequiredCheckBox.TabIndex = 2;
+ this.loginRequiredCheckBox.Text = "User login required";
+ this.loginRequiredCheckBox.UseVisualStyleBackColor = true;
+ //
+ // languageComboBox
+ //
+ this.languageComboBox.FormattingEnabled = true;
+ this.languageComboBox.Location = new System.Drawing.Point(292, 19);
+ this.languageComboBox.Name = "languageComboBox";
+ this.languageComboBox.Size = new System.Drawing.Size(80, 21);
+ this.languageComboBox.TabIndex = 1;
+ //
+ // languageLabel
+ //
+ this.languageLabel.AutoSize = true;
+ this.languageLabel.Location = new System.Drawing.Point(19, 23);
+ this.languageLabel.Name = "languageLabel";
+ this.languageLabel.Size = new System.Drawing.Size(134, 13);
+ this.languageLabel.TabIndex = 0;
+ this.languageLabel.Text = "Language, Sprache, Jazyk";
+ //
+ // connStrForTracingGroupBox
+ //
+ this.connStrForTracingGroupBox.Controls.Add(this.tracingDBConnStringTextBox);
+ this.connStrForTracingGroupBox.Location = new System.Drawing.Point(12, 14);
+ this.connStrForTracingGroupBox.Name = "connStrForTracingGroupBox";
+ this.connStrForTracingGroupBox.Size = new System.Drawing.Size(660, 50);
+ this.connStrForTracingGroupBox.TabIndex = 17;
+ this.connStrForTracingGroupBox.TabStop = false;
+ this.connStrForTracingGroupBox.Text = "Connection string for production tracing records";
+ //
+ // tracingDBConnStringTextBox
+ //
+ this.tracingDBConnStringTextBox.Location = new System.Drawing.Point(19, 18);
+ this.tracingDBConnStringTextBox.Name = "tracingDBConnStringTextBox";
+ this.tracingDBConnStringTextBox.Size = new System.Drawing.Size(617, 20);
+ this.tracingDBConnStringTextBox.TabIndex = 0;
+ //
+ // connStrForUsersGroupBox
+ //
+ this.connStrForUsersGroupBox.Controls.Add(this.loginRequiredCheckBox);
+ this.connStrForUsersGroupBox.Controls.Add(this.usersDBConnStringTextBox);
+ this.connStrForUsersGroupBox.Location = new System.Drawing.Point(12, 73);
+ this.connStrForUsersGroupBox.Name = "connStrForUsersGroupBox";
+ this.connStrForUsersGroupBox.Size = new System.Drawing.Size(660, 70);
+ this.connStrForUsersGroupBox.TabIndex = 18;
+ this.connStrForUsersGroupBox.TabStop = false;
+ this.connStrForUsersGroupBox.Text = "Connection string for central DB of users";
+ //
+ // usersDBConnStringTextBox
+ //
+ this.usersDBConnStringTextBox.Location = new System.Drawing.Point(19, 18);
+ this.usersDBConnStringTextBox.Name = "usersDBConnStringTextBox";
+ this.usersDBConnStringTextBox.Size = new System.Drawing.Size(617, 20);
+ this.usersDBConnStringTextBox.TabIndex = 0;
+ //
+ // saveButton
+ //
+ this.saveButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.saveButton.Location = new System.Drawing.Point(475, 166);
+ this.saveButton.Name = "saveButton";
+ this.saveButton.Size = new System.Drawing.Size(74, 47);
+ this.saveButton.TabIndex = 19;
+ this.saveButton.Text = "Save";
+ this.saveButton.UseVisualStyleBackColor = true;
+ this.saveButton.Click += new System.EventHandler(this.saveButton_Click);
+ //
+ // cancelButton
+ //
+ this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.cancelButton.Location = new System.Drawing.Point(577, 166);
+ this.cancelButton.Name = "cancelButton";
+ this.cancelButton.Size = new System.Drawing.Size(71, 47);
+ this.cancelButton.TabIndex = 20;
+ this.cancelButton.Text = "Cancel";
+ this.cancelButton.UseVisualStyleBackColor = true;
+ this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click);
+ //
+ // SettingsDlg
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(688, 237);
+ this.ControlBox = false;
+ this.Controls.Add(this.cancelButton);
+ this.Controls.Add(this.saveButton);
+ this.Controls.Add(this.connStrForUsersGroupBox);
+ this.Controls.Add(this.connStrForTracingGroupBox);
+ this.Controls.Add(this.commonGroupBox);
+ this.Name = "SettingsDlg";
+ this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+ this.Text = "Settings";
+ this.Load += new System.EventHandler(this.SettingsDlg_Load);
+ this.commonGroupBox.ResumeLayout(false);
+ this.commonGroupBox.PerformLayout();
+ this.connStrForTracingGroupBox.ResumeLayout(false);
+ this.connStrForTracingGroupBox.PerformLayout();
+ this.connStrForUsersGroupBox.ResumeLayout(false);
+ this.connStrForUsersGroupBox.PerformLayout();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.GroupBox commonGroupBox;
+ private System.Windows.Forms.ComboBox languageComboBox;
+ private System.Windows.Forms.Label languageLabel;
+ private System.Windows.Forms.CheckBox loginRequiredCheckBox;
+ private System.Windows.Forms.GroupBox connStrForTracingGroupBox;
+ private System.Windows.Forms.TextBox tracingDBConnStringTextBox;
+ private System.Windows.Forms.GroupBox connStrForUsersGroupBox;
+ private System.Windows.Forms.TextBox usersDBConnStringTextBox;
+ private System.Windows.Forms.Button saveButton;
+ private System.Windows.Forms.Button cancelButton;
+ }
+}
\ No newline at end of file
diff --git a/ProductionTracing/Forms/SettingsDlg.cs b/ProductionTracing/Forms/SettingsDlg.cs
new file mode 100644
index 000000000..8fbc61541
--- /dev/null
+++ b/ProductionTracing/Forms/SettingsDlg.cs
@@ -0,0 +1,126 @@
+///
+/// Copyright (c) 2021 Sensus Slovensko a.s.
+///
+using System;
+using System.Windows.Forms;
+using ProductionTracing.Resources;
+
+namespace ProductionTracing.Forms
+{
+ public partial class SettingsDlg : Form
+ {
+ private LocalSettings ls;
+
+ public SettingsDlg()
+ {
+ InitializeComponent();
+ }
+
+ public SettingsDlg(LocalSettings localSettings)
+ {
+ InitializeComponent();
+ this.ls = localSettings;
+ }
+
+ void Localize()
+ {
+ Text = Strings.Settings;
+ languageLabel.Text = Strings.Language;
+ loginRequiredCheckBox.Text = Strings.User_login_is_required;
+ saveButton.Text = Strings.Save;
+ cancelButton.Text = Strings.Cancel;
+ connStrForTracingGroupBox.Text = Strings.Connection_string_tracing_DB;
+ connStrForUsersGroupBox.Text = Strings.Connection_string_users_DB;
+ }
+
+ private void SettingsDlg_Load(object sender, EventArgs e)
+ {
+ Localize();
+
+ if (ls == null) return;
+
+ languageComboBox.Items.Add("EN");
+ languageComboBox.Items.Add("ZH_CN");
+ languageComboBox.Items.Add("DE");
+ languageComboBox.Items.Add("SK");
+ languageComboBox.Text = ls.Language;
+
+ loginRequiredCheckBox.Checked = ls.IsUserLoginRequired;
+
+ tracingDBConnStringTextBox.Text = ls.ConnectionString;
+ usersDBConnStringTextBox.Text = ls.UsersDBConnString;
+ }
+
+ ///
+ /// Verifies UI content
+ ///
+ /// None-empty string (message) when invalid
+ string IsUIContentValid()
+ {
+ if (!languageComboBox.Items.Contains(languageComboBox.Text))
+ {
+ return "Invalid language";
+ }
+
+ return null;
+ }
+
+ ///
+ /// Updates settings, checks for differences compared to previous setrtings
+ ///
+ /// true when settings are different
+ bool UpdateSettings()
+ {
+ if (ls == null) return false;
+
+ bool isDifferent = false;
+
+ if (ls.Language != languageComboBox.Text)
+ {
+ ls.Language = languageComboBox.Text;
+ isDifferent = true;
+ }
+
+ if (ls.IsUserLoginRequired != loginRequiredCheckBox.Checked)
+ {
+ ls.IsUserLoginRequired = loginRequiredCheckBox.Checked;
+ isDifferent = true;
+ }
+
+ if (ls.ConnectionString != tracingDBConnStringTextBox.Text)
+ {
+ ls.ConnectionString = tracingDBConnStringTextBox.Text;
+ isDifferent = true;
+ }
+
+ if (ls.UsersDBConnString != usersDBConnStringTextBox.Text)
+ {
+ ls.UsersDBConnString = usersDBConnStringTextBox.Text;
+ isDifferent = true;
+ }
+
+ return isDifferent;
+ }
+
+ private void saveButton_Click(object sender, EventArgs e)
+ {
+ string message = IsUIContentValid();
+ if (string.IsNullOrEmpty(message))
+ {
+ UpdateSettings();
+ DialogResult = DialogResult.OK;
+ Close();
+ }
+ else
+ {
+ MessageBox.Show(message);
+ }
+ }
+
+ private void cancelButton_Click(object sender, EventArgs e)
+ {
+ DialogResult = DialogResult.Cancel;
+ Close();
+ }
+ }
+}
diff --git a/ProductionTracing/Forms/SettingsDlg.resx b/ProductionTracing/Forms/SettingsDlg.resx
new file mode 100644
index 000000000..1af7de150
--- /dev/null
+++ b/ProductionTracing/Forms/SettingsDlg.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/ProductionTracing/Forms/StatisticsDlg.Designer.cs b/ProductionTracing/Forms/StatisticsDlg.Designer.cs
new file mode 100644
index 000000000..e3069d432
--- /dev/null
+++ b/ProductionTracing/Forms/StatisticsDlg.Designer.cs
@@ -0,0 +1,139 @@
+namespace ProductionTracing.Forms
+{
+ partial class StatisticsDlg
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.splitContainer1 = new System.Windows.Forms.SplitContainer();
+ this.statisticsListView = new System.Windows.Forms.ListView();
+ this.splitContainer2 = new System.Windows.Forms.SplitContainer();
+ this.okButton = new System.Windows.Forms.Button();
+ this.exportButton = new System.Windows.Forms.Button();
+ ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
+ this.splitContainer1.Panel1.SuspendLayout();
+ this.splitContainer1.Panel2.SuspendLayout();
+ this.splitContainer1.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).BeginInit();
+ this.splitContainer2.Panel2.SuspendLayout();
+ this.splitContainer2.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // splitContainer1
+ //
+ this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;
+ this.splitContainer1.Location = new System.Drawing.Point(0, 0);
+ this.splitContainer1.Name = "splitContainer1";
+ this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal;
+ //
+ // splitContainer1.Panel1
+ //
+ this.splitContainer1.Panel1.Controls.Add(this.statisticsListView);
+ //
+ // splitContainer1.Panel2
+ //
+ this.splitContainer1.Panel2.Controls.Add(this.splitContainer2);
+ this.splitContainer1.Size = new System.Drawing.Size(572, 409);
+ this.splitContainer1.SplitterDistance = 320;
+ this.splitContainer1.TabIndex = 0;
+ //
+ // statisticsListView
+ //
+ this.statisticsListView.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.statisticsListView.GridLines = true;
+ this.statisticsListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
+ this.statisticsListView.Location = new System.Drawing.Point(0, 0);
+ this.statisticsListView.Name = "statisticsListView";
+ this.statisticsListView.Size = new System.Drawing.Size(572, 320);
+ this.statisticsListView.TabIndex = 0;
+ this.statisticsListView.UseCompatibleStateImageBehavior = false;
+ //
+ // splitContainer2
+ //
+ this.splitContainer2.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.splitContainer2.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;
+ this.splitContainer2.Location = new System.Drawing.Point(0, 0);
+ this.splitContainer2.Name = "splitContainer2";
+ //
+ // splitContainer2.Panel2
+ //
+ this.splitContainer2.Panel2.Controls.Add(this.exportButton);
+ this.splitContainer2.Panel2.Controls.Add(this.okButton);
+ this.splitContainer2.Size = new System.Drawing.Size(572, 85);
+ this.splitContainer2.SplitterDistance = 250;
+ this.splitContainer2.TabIndex = 0;
+ //
+ // okButton
+ //
+ this.okButton.Location = new System.Drawing.Point(195, 22);
+ this.okButton.Name = "okButton";
+ this.okButton.Size = new System.Drawing.Size(102, 41);
+ this.okButton.TabIndex = 0;
+ this.okButton.Text = "OK";
+ this.okButton.UseVisualStyleBackColor = true;
+ this.okButton.Click += new System.EventHandler(this.okButton_Click);
+ //
+ // exportButton
+ //
+ this.exportButton.Location = new System.Drawing.Point(74, 22);
+ this.exportButton.Name = "exportButton";
+ this.exportButton.Size = new System.Drawing.Size(102, 41);
+ this.exportButton.TabIndex = 1;
+ this.exportButton.Text = "Export";
+ this.exportButton.UseVisualStyleBackColor = true;
+ this.exportButton.Click += new System.EventHandler(this.exportButton_Click);
+ //
+ // StatisticsDlg
+ //
+ this.AcceptButton = this.okButton;
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(572, 409);
+ this.Controls.Add(this.splitContainer1);
+ this.Name = "StatisticsDlg";
+ this.Text = "StatisticsDlg";
+ this.Load += new System.EventHandler(this.StatisticsDlg_Load);
+ this.splitContainer1.Panel1.ResumeLayout(false);
+ this.splitContainer1.Panel2.ResumeLayout(false);
+ ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
+ this.splitContainer1.ResumeLayout(false);
+ this.splitContainer2.Panel2.ResumeLayout(false);
+ ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).EndInit();
+ this.splitContainer2.ResumeLayout(false);
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.SplitContainer splitContainer1;
+ private System.Windows.Forms.ListView statisticsListView;
+ private System.Windows.Forms.SplitContainer splitContainer2;
+ private System.Windows.Forms.Button okButton;
+ private System.Windows.Forms.Button exportButton;
+ }
+}
\ No newline at end of file
diff --git a/ProductionTracing/Forms/StatisticsDlg.cs b/ProductionTracing/Forms/StatisticsDlg.cs
new file mode 100644
index 000000000..4ddb45050
--- /dev/null
+++ b/ProductionTracing/Forms/StatisticsDlg.cs
@@ -0,0 +1,232 @@
+///
+/// Copyright (c) 2016-2022 Sensus Slovensko a.s.
+///
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using ProductionTracing.Resources;
+
+namespace ProductionTracing.Forms
+{
+ public partial class StatisticsDlg : Form
+ {
+ IList