using CrystalDecisions.CrystalReports.Engine; using CrystalDecisions.Shared; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using System.Globalization; using System.IO; using System.IO.Ports; using System.Linq; using System.Net.Http; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using UWS; using static UWS.BusinessLayer; namespace WindowsFormsApp1 { public partial class WeighingForm : Form { DataAccessObject dataAccessObject = new DataAccessObject(); string portname = "COM1"; int baudRate = 9600; static string fms_no; ReportDocument rprt = new ReportDocument(); DataSet1 ds = new DataSet1(); VehicleRequestApiResponse apiResponse = new VehicleRequestApiResponse(); static Int32 _userId; string dateTime; string itemText; private HttpClient _httpClient; private Label siteTextBox; private BackgroundWorker bgWorker; private System.Windows.Forms.Timer scanTimer; public WeighingForm(Int32 userId) { InitializeComponent(); siteTextBox = txt_site; // Assign the existing TextBox control to the class-level variable checkSite(); // Call the method to read or create the file and update the TextBox _httpClient = new HttpClient(); this.MaximizeBox = false; _userId = userId; ReadConfigFile(); } public void checkSite() { // Define the root directory and the file name string rootPath = AppDomain.CurrentDomain.BaseDirectory; // Root path of the application string fileName = "site_id.txt"; // Text file to store the site ID string filePath = Path.Combine(rootPath, fileName); // Full file path // Check if the file exists if (File.Exists(filePath)) { // Read the content of the file (site ID) string siteId = File.ReadAllText(filePath); // Display the site ID in the TextBox siteTextBox.Text = siteId; } else { // Create the file and write "Site ID not available" if it doesn't exist string defaultText = "SITE ID NOT FOUND"; File.WriteAllText(filePath, defaultText); // Display the default message in the TextBox siteTextBox.Text = defaultText; } } public void ForSite05(string data) { // Split the data into segments based on the "=" delimiter string[] segments = data.Split('='); foreach (string segment in segments) { // Trim any trailing or leading '.' and whitespace string numericPart = segment.Trim('.').Trim(); // Check if the segment contains a valid numeric part if (!string.IsNullOrEmpty(numericPart) && long.TryParse(numericPart, out long numericValue)) { // Dynamically process the numeric value based on site or conditions double processedWeight = numericValue; // Default as raw numeric value // Example dynamic rule for SITE-05 (reverse the number) string reversedString = new string(numericPart.Reverse().ToArray()); if (long.TryParse(reversedString, out long reversedValue)) { processedWeight = reversedValue; // Use reversed value dynamically } // Display the dynamically processed weight Console.WriteLine($"Processed Weight: {processedWeight}"); // Debug output UpdateUI(Convert.ToInt32(processedWeight), "MACHINE CONNECTED", Color.Green); } else { // Handle invalid or non-numeric data UpdateUI(0, "INVALID DATA", Color.Red); } } } public void ForSite02(string data) { // Check if data length is sufficient if (data.Length >= 10) { string numericPart = data.Substring(1, 7); if (int.TryParse(numericPart, out int numericValue)) { UpdateUI(numericValue, "MACHINE CONNECTED", Color.Green); } else { UpdateUI(0, "MACHINE CONNECTED", Color.Green); // Show "0" for invalid data } } } public async Task GetPortDataAsync() { await Task.Run(() => { using (SerialPort serialPort = new SerialPort(portname, baudRate, Parity.None, 8, StopBits.One)) { serialPort.Handshake = Handshake.XOnXOff; serialPort.ReadTimeout = 5000; bool isConnected = false; // Track connection state try { serialPort.Open(); isConnected = true; // Assume connected after opening while (true) { try { // Check if data is available if (serialPort.BytesToRead > 0) { string data = serialPort.ReadExisting(); Console.WriteLine($"Data received: {data}"); // Debug output if (txt_site.Text == "SITE-05") { ForSite05(data); } else { ForSite02(data); //if (txt_site.Text.Contains("A")) //{ // ForSite05(data); //} //else //{ // ForSite02(data); //} } } else { // No data received; machine may not be connected UpdateUI(0, "MACHINE NOT CONNECTED", Color.Red); // Show not connected status isConnected = false; // Set to false if no data is received } Thread.Sleep(500); // Delay to avoid overwhelming the system } catch (TimeoutException) { // Ignore timeouts, but assume not connected UpdateUI(0, "MACHINE NOT CONNECTED", Color.Red); isConnected = false; // Update connection state } } } catch (Exception) { //// If an error occurs while trying to connect, we assume disconnection // UpdateUI(0, "MACHINE NOT CONNECTED", Color.Red); // Show not connected status serialPort.Close(); } finally { if (serialPort.IsOpen) { serialPort.Close(); // Ensure the port is closed } } } }); } private void UpdateUITest(string weightValue, string statusMessage, Color statusColor) { lbl_weight.BeginInvoke((MethodInvoker)delegate { lbl_weight.Text = weightValue.ToString(); lbl_weight.ForeColor = Color.White; lbl_status.Text = statusMessage; lbl_status.ForeColor = statusColor; lbl_status.Visible = true; }); } private void UpdateUI(int weightValue, string statusMessage, Color statusColor) { lbl_weight.BeginInvoke((MethodInvoker)delegate { lbl_weight.Text = weightValue.ToString(); lbl_weight.ForeColor = Color.White; lbl_status.Text = statusMessage; lbl_status.ForeColor = statusColor; lbl_status.Visible = true; }); } public void ReadConfigFile() { try { string rootPath = AppDomain.CurrentDomain.BaseDirectory; // Root path of the application string fileName = "config.txt"; // Text file to store the site ID string filePath = Path.Combine(rootPath, fileName); // Full file path // Check if the file exists if (File.Exists(filePath)) { // Read all lines from the file string[] lines = File.ReadAllLines(filePath); // Process each line foreach (string line in lines) { // Split the line into key and value string[] parts = line.Split('='); // Check if there are two parts if (parts.Length == 2) { // Trim spaces and assign values string key = parts[0].Trim(); string value = parts[1].Trim(); // Check key and assign values accordingly if (key.Equals("PortName", StringComparison.OrdinalIgnoreCase)) { portname = value; lbl_com.Text = portname; } else if (key.Equals("BaudRate", StringComparison.OrdinalIgnoreCase)) { // Try parsing the value as an integer if (int.TryParse(value, out int rate)) { baudRate = rate; } else { Console.WriteLine($"Invalid Baud Rate: {value}"); } } } } } else { MessageBox.Show("Config file does not exist."); } } catch (Exception ex) { MessageBox.Show($"Error reading config file: {ex.Message}"); } } private void WeighingForm_Load(object sender, EventArgs e) { // Start the timer timer1.Interval = 1000; timer1.Start(); // Initialize the BackgroundWorker bgWorker = new BackgroundWorker(); bgWorker.DoWork += BgWorker_DoWork; // Start the background work bgWorker.RunWorkerAsync(); } private async void getTrolleyAnddl() { try { // Call the GetTrolleyApi method and await the response string response = await dataAccessObject.GetTrolleyApi(); if (!string.IsNullOrEmpty(response) && !response.Contains("Error: NotFound")) { // Deserialize the response into a list of items var items = JsonConvert.DeserializeObject>(response); // Add "SELECT" as the first item in the list var selectItem = new { id = 0, code = "SELECT" }; items.Insert(0, selectItem); // Add at the 0th index of the existing items list // Invoke UI updates on the main thread Invoke((Action)(() => { // Bind the ComboBox to the 'code' (displayed) and 'id' (value) properties cb_trolley.DataSource = items .Select(item => new { id = (int)item.id, code = (string)item.code }) // Ensure the mapping to `id` and `code` .ToList(); cb_trolley.DisplayMember = "code"; // Display the 'code' value cb_trolley.ValueMember = "id"; // Use the 'id' as the value // Select the "SELECT" item (index 0) cb_trolley.SelectedIndex = 0; SetupSearchableComboBox(cb_trolley); })); } else { // Show message on the UI thread Invoke((Action)(() => { MessageBox.Show("Received empty trolley from the server."); })); } // Load data for other ComboBoxes DataTable productData = dataAccessObject.GetWeightScaleData("weight_scale_product"); DataTable transporterData = dataAccessObject.GetWeightScaleData("weight_scale_transporter"); DataTable partyData = dataAccessObject.GetWeightScaleData("weight_scale_party"); // Invoke UI updates for other ComboBoxes Invoke((Action)(() => { // Bind product data to comboBoxProduct cb_item.DataSource = productData; cb_item.DisplayMember = "product_name"; // Replace with actual column name for display cb_item.ValueMember = "product_code"; // Replace with actual column name for value SetupSearchableComboBox(cb_item); // Bind transporter data to comboBoxTransporter cb_transporter.DataSource = transporterData; cb_transporter.DisplayMember = "transporter_name"; // Replace with actual column name for display cb_transporter.ValueMember = "transporter_code"; // Replace with actual column name for value SetupSearchableComboBox(cb_transporter); // Bind party data to comboBoxParty cb_location.DataSource = partyData; cb_location.DisplayMember = "party_name"; // Replace with actual column name for display cb_location.ValueMember = "party_code"; // Replace with actual column name for value SetupSearchableComboBox(cb_location); txt_vehicle_no.Enabled = true; })); } catch (JsonReaderException jsonEx) { MessageBox.Show($"JSON Parsing Error: {jsonEx.Message}"); } catch (Exception ex) { MessageBox.Show($"Error: {ex.Message}"); } } private void BgWorker_DoWork(object sender, DoWorkEventArgs e) { // This is running on a background thread checkSite(); getTrolleyAnddl(); chk_box_CheckedChanged(null, null); } private void SetupSearchableComboBox(ComboBox comboBox) { // Enable auto-complete for the ComboBox comboBox.AutoCompleteMode = AutoCompleteMode.SuggestAppend; comboBox.AutoCompleteSource = AutoCompleteSource.ListItems; } private void cb_item_Leave(object sender, EventArgs e) { string enteredValue = cb_item.Text.ToUpper(); bool valueExists = false; // Check if the entered value exists in the ComboBox foreach (DataRowView item in cb_item.Items) { if (item["product_name"].ToString().ToUpper() == enteredValue) // Use the actual column for display { valueExists = true; break; } } // If the value does not exist, prompt to add it if (!valueExists) { var result = MessageBox.Show($"The value '{enteredValue}' is not in the list. Would you like to add it?", "Add New Value", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (result == DialogResult.Yes) { dataAccessObject.AddValueToDatabase(enteredValue, "weight_scale_product", "product_name"); DataTable productData = dataAccessObject.GetWeightScaleData("weight_scale_product"); // Invoke UI updates for other ComboBoxes Invoke((Action)(() => { // Bind party data to comboBoxParty cb_item.DataSource = productData; cb_item.DisplayMember = "product_name"; cb_item.ValueMember = "product_code"; SetupSearchableComboBox(cb_item); })); } } } private void timer1_Tick(object sender, EventArgs e) { lbl_date_time.Text = System.DateTime.Now.ToString(); _ = GetPortDataAsync(); } private void pb_get_Click(object sender, EventArgs e) { if (cb_1st_weight.Checked) { fillValues('1'); } else if (cb_2nd_weight.Checked) { fillValues('2'); } else { MessageBox.Show("Please select weight"); } } public void fillValues(char value) { if (value == '1') { txt_1st_weight.Text = lbl_weight.Text.ToString(); txt_1st_date.Text = DateTime.Now.ToShortDateString(); txt_1st_time.Text = DateTime.Now.ToShortTimeString(); dateTime = DateTime.Now.ToString(); txt_2nd_weight.Text = ""; txt_2nd_date.Text = ""; txt_2nd_time.Text = ""; } else { txt_2nd_weight.Text = lbl_weight.Text.ToString(); txt_2nd_date.Text = DateTime.Now.ToShortDateString(); txt_2nd_time.Text = DateTime.Now.ToShortTimeString(); dateTime = DateTime.Now.ToString(); txt_1st_weight.Text = ""; txt_1st_date.Text = ""; txt_1st_time.Text = ""; } } private void cb_1st_weight_CheckedChanged(object sender, EventArgs e) { cb_2nd_weight.Checked = false; } private void cb_2nd_weight_CheckedChanged(object sender, EventArgs e) { cb_1st_weight.Checked = false; } private async void btn_save_ClickAsync(object sender, EventArgs e) { this.Enabled = false; string weightText, type, fmsID, container_no; container_no = txt_container_no.Text; if (cb_1st_weight.Checked) { weightText = txt_1st_weight.Text; type = "1"; } else { weightText = txt_2nd_weight.Text; type = "2"; } if (string.IsNullOrEmpty(weightText)) { this.Enabled = true; CustomMessageBox.ShowError("Please provide the weight."); return; } // with FMS if (chk_box.Checked == true) { fmsID = txt_fms_no.Text.ToString(); if (string.IsNullOrEmpty(dateTime)) { this.Enabled = true; CustomMessageBox.ShowError("Please provide the date and time."); return; } if (string.IsNullOrEmpty(fms_no)) { this.Enabled = true; CustomMessageBox.ShowError("Please provide the FMS number."); return; } string result = await postData(fmsID, weightText, dateTime, type, "", _userId, container_no); MessageBox.Show(result); } // without FMS else { if (txt_vehicle_no.Text.Length == 0) { this.Enabled = true; CustomMessageBox.ShowError("Please provide vehicle no."); return; } if (cb_item.SelectedIndex == 0) { this.Enabled = true; CustomMessageBox.ShowError("Please provide item."); return; } if (cb_transporter.SelectedIndex == 0) { this.Enabled = true; CustomMessageBox.ShowError("Please provide transporter."); return; } if (cb_location.SelectedIndex == 0) { this.Enabled = true; CustomMessageBox.ShowError("Please provide location."); return; } //if ((txt_2nd_weight.Text != "0" || txt_2nd_weight.Text != "") && (txt_1st_weight.Text != "0" || txt_1st_weight.Text != "")) //{ // MessageBox.Show("Error,Contact to technology"); // return; //} string result = await postDataWithoutFMS(txt_vehicle_no.Text.ToUpper(), weightText, dateTime, type, "", _userId, cb_item.SelectedValue.ToString(), cb_transporter.SelectedValue.ToString(), cb_location.SelectedValue.ToString(), container_no); if (result.Contains("Error")) { this.Enabled = true; CustomMessageBox.ShowError(result); } else { this.Enabled = true; CustomMessageBox.ShowSuccess(result); } } resetFields(0); } public async Task postData(string fmsID, string weightText, string dateText, string type, string comment, Int32 userid, string container_no) { try { // Assuming dataAccessObject is an instance of your data access class string result = await dataAccessObject.postDataAsync(fmsID, Convert.ToInt32(weightText), dateText, type, comment, userid, siteTextBox.Text, container_no); this.Enabled = true; return result; } catch (Exception ex) { this.Enabled = true; // Log the exception or handle it as needed return "false"; } } public async Task postDataWithoutFMS(string vehicleNO, string weightText, string dateText, string type, string comment, Int32 userid, string item, string transporter, string location, string container_no) { try { // Assuming dataAccessObject is an instance of your data access class string result = await dataAccessObject.postDataAsyncWithoutFMS(vehicleNO, Convert.ToInt32(weightText), dateText, type, comment, userid, siteTextBox.Text, item, transporter, location, container_no); this.Enabled = true; return result; } catch (Exception ex) { this.Enabled = true; // Log the exception or handle it as needed return "Error"; } } public async Task getData(string fmsID) { try { apiResponse = await dataAccessObject.GetRegNo(fmsID); if (apiResponse.VehicleRequest != null) { // Access apiResponse properties here if (apiResponse.VehicleRequest.Id == 0) { CustomMessageBox.ShowError("Invalid response"); txt_vehicle_no.BackColor = Color.PaleVioletRed; } else { txt_vehicle_no.Text = apiResponse.VehicleRequest.FmsVehicle.RegistrationNumber.ToString(); txt_vehicle_no.BackColor = Color.LightGreen; } } else { CustomMessageBox.ShowError("Invalid data"); } } catch (Exception ex) { CustomMessageBox.ShowError("No response"); } } private void btn_print_Click(object sender, EventArgs e) { if (chk_box.Checked == false) { if (txt_vehicle_no.Text.Length > 0) { if (apiResponse.LoadingVehicleWeightInfo != null) { ShowWeightReport(); } else { CustomMessageBox.ShowError("Record not exists - " + txt_vehicle_no.Text); } } else { CustomMessageBox.ShowError("Please provide vehicle #"); } } else { if (txt_fms_no.Text.Length > 0) { if (txt_vehicle_no.Text.Length > 0) { if (apiResponse.LoadingVehicleWeightInfo != null) { ShowWeightReport(); } else { CustomMessageBox.ShowError("Record not exists - " + txt_fms_no.Text); } } else { CustomMessageBox.ShowError("Please provide vehicle #"); } } else { CustomMessageBox.ShowError("Please provide FMS #"); } } } public void ShowWeightReport() { DataSet1.DailyReportDataTable dt = new DataSet1.DailyReportDataTable(); ds.DailyReport.Clear(); dt = ds.DailyReport; // Add a new row to the DataTable DataRow dr = dt.NewRow(); if (apiResponse.LoadingVehicleWeightInfo?.DeadWeight != null) dr[0] = apiResponse.LoadingVehicleWeightInfo.DeadWeight; if (apiResponse.LoadingVehicleWeightInfo?.FinalWeight != null) dr[1] = apiResponse.LoadingVehicleWeightInfo.FinalWeight; if (!string.IsNullOrEmpty(apiResponse.VehicleRequest?.FmsVehicle?.RegistrationNumber)) dr[2] = apiResponse.VehicleRequest.FmsVehicle.RegistrationNumber; if (apiResponse.LoadingVehicleWeightInfo?.DeadWeightDateTime != null) dr[3] = apiResponse.LoadingVehicleWeightInfo.DeadWeightDateTime.Value.ToShortTimeString(); if (apiResponse.LoadingVehicleWeightInfo?.FinalWeightDateTime != null) dr[4] = apiResponse.LoadingVehicleWeightInfo.FinalWeightDateTime.Value.ToShortTimeString(); if (apiResponse.LoadingVehicleWeightInfo?.DeadWeightDateTime != null) dr[5] = apiResponse.LoadingVehicleWeightInfo.DeadWeightDateTime.Value.ToShortDateString(); if (apiResponse.LoadingVehicleWeightInfo?.FinalWeightDateTime != null) dr[6] = apiResponse.LoadingVehicleWeightInfo.FinalWeightDateTime.Value.ToShortDateString(); if (!string.IsNullOrEmpty(apiResponse.LoadingVehicleWeightInfo?.Comment)) dr[7] = apiResponse.LoadingVehicleWeightInfo.Comment; if (chk_box.Checked) { if (!string.IsNullOrEmpty(apiResponse.VehicleRequest?.FmsVehicle?.RegistrationNumber)) dr[8] = apiResponse.VehicleRequest.FmsVehicle.RegistrationNumber; } else { if (!string.IsNullOrEmpty(apiResponse.LoadingVehicleWeightInfo?.VehicleNo)) dr[8] = apiResponse.LoadingVehicleWeightInfo.VehicleNo.ToUpper(); dr["ProductName"] = cb_item.Text; dr["PartyName"] = cb_location.Text; dr["TransporterName"] = cb_transporter.Text; if (!string.IsNullOrEmpty(apiResponse.LoadingVehicleWeightInfo?.ContainerNo)) { dr["ContainerNo"] = apiResponse.LoadingVehicleWeightInfo?.ContainerNo; } } if (!string.IsNullOrEmpty(apiResponse.LoadingVehicleWeightInfo?.VehicleRequestCode)) dr[9] = apiResponse.LoadingVehicleWeightInfo.VehicleRequestCode; dt.Rows.Add(dr); // Add the DataRow to the DataTable // Set up the Crystal Report ReportDocument rprt = new ReportDocument(); string reportPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "DailyWeight.rpt"); rprt.Load(reportPath); rprt.SetDataSource(ds); DailyReport reportForm = new DailyReport(); reportForm.ShowReport(rprt); // Attach the Print event handler for Ctrl+P reportForm.KeyDown += (sender, e) => { if (e.Control && e.KeyCode == Keys.P) { PrintReport(rprt); } }; // Set form to capture key events reportForm.KeyPreview = true; } private void PrintReport(ReportDocument reportDocument) { try { // Set page orientation to landscape reportDocument.PrintOptions.PrinterDuplex = CrystalDecisions.Shared.PrinterDuplex.Horizontal; reportDocument.PrintOptions.PaperOrientation = CrystalDecisions.Shared.PaperOrientation.Landscape; // Set paper size if supported by printer // For custom paper size, ensure it's defined in the printer settings reportDocument.PrintOptions.PaperSize = CrystalDecisions.Shared.PaperSize.DefaultPaperSize; // Use custom size // Print 1 copy reportDocument.PrintToPrinter(1, false, 0, 0); } catch (Exception ex) { CustomMessageBox.ShowError("Error printing report: " + ex.Message); } } private void txt_fms_no_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == (char)13) { if (string.IsNullOrEmpty(txt_fms_no.Text)) { CustomMessageBox.ShowError("Please provide FMS #"); return; } fms_no = txt_fms_no.Text.ToString(); _ = getData(fms_no); } } private void btn_clear_Click(object sender, EventArgs e) { resetFields(1); } public void resetFields(int val) { if (val == 0) { txt_vehicle_no.Text = ""; // Vehicle no not empty } else { // Vehicle no empty // txt_vehicle_no.Text = ""; } cb_1st_weight.Checked = false; cb_2nd_weight.Checked = false; txt_fms_no.Text = ""; txt_container_no.Text = ""; txt_1st_weight.Text = ""; txt_1st_date.Text = ""; txt_1st_time.Text = ""; txt_2nd_weight.Text = ""; txt_2nd_date.Text = ""; txt_2nd_time.Text = ""; txt_container_no.Text = ""; if (cb_item.SelectedIndex != -1) { cb_item.SelectedIndex = 0; } if (cb_transporter.SelectedIndex != -1) { cb_transporter.SelectedIndex = 0; } if (cb_location.SelectedIndex != -1) { cb_location.SelectedIndex = 0; } //cb_comment.Text = ""; txt_vehicle_no.BackColor = Color.LightGray; } private void scanTrollyToolStripMenuItem_Click(object sender, EventArgs e) { disableControls(); } private void weightScaleToolStripMenuItem_Click(object sender, EventArgs e) { enableControls(); } public void enableControls() { pb1.Visible = true; cb_1st_weight.Visible = true; pb_get.Visible = true; pb2.Visible = true; cb_2nd_weight.Visible = true; panel2.Visible = true; txt_scan.Visible = false; lbl_scan.Visible = false; btn_clear.Visible = true; btn_print.Visible = true; btn_save.Visible = true; txt_dc.Visible = false; lbl_dc.Visible = false; cb_trolley.Visible = false; lbl_trolly.Visible = false; } public void disableControls() { pb1.Visible = false; cb_1st_weight.Visible = false; pb_get.Visible = false; pb2.Visible = false; cb_2nd_weight.Visible = false; panel2.Visible = false; txt_scan.Visible = true; lbl_scan.Visible = true; btn_clear.Visible = false; btn_print.Visible = false; btn_save.Visible = false; cb_trolley.Visible = true; lbl_trolly.Visible = true; } private void groupBox2_Paint(object sender, PaintEventArgs e) { // Set the desired border color and thickness int borderThickness = 3; // You can adjust the thickness Color borderColor = Color.Black; // Set the pen for drawing the border using (Pen borderPen = new Pen(borderColor, borderThickness)) { // Get the area where the border will be drawn Rectangle rect = groupBox2.ClientRectangle; rect.X += borderThickness / 2; rect.Y += (groupBox2.Font.Height / 2) - (borderThickness / 2); rect.Width -= borderThickness; rect.Height -= (groupBox2.Font.Height / 2) + borderThickness; // Draw the border e.Graphics.DrawRectangle(borderPen, rect); } using (SolidBrush brush = new SolidBrush(groupBox2.ForeColor)) { e.Graphics.DrawString(groupBox2.Text, groupBox2.Font, brush, new PointF(6, 0)); } } private DateTime lastKeystroke = DateTime.Now; private async void txt_scan_KeyPress(object sender, KeyPressEventArgs e) { ////TimeSpan timeSinceLastKeystroke = DateTime.Now - lastKeystroke; //////Clear input if keystroke is too slow (likely manual typing) ////if (timeSinceLastKeystroke.TotalMilliseconds > 100) ////{ //// txt_scan.Clear(); //// return; ////} ////lastKeystroke = DateTime.Now; // Update last keystroke time if (e.KeyChar == (char)13) // Enter key { if (cb_trolley.SelectedIndex == 0) { CustomMessageBox.ShowError("Please select trolley #"); return; } string qrCode = txt_scan.Text.Trim(); string weightText = lbl_weight.Text; if (string.IsNullOrEmpty(qrCode)) { CustomMessageBox.ShowError("Please scan QR code"); return; } if (string.IsNullOrEmpty(weightText) || weightText == "0") { //weightText = "2000"; CustomMessageBox.ShowError("Please provide a valid weight"); return; } try { decimal weight = Convert.ToDecimal(weightText); int trolleyId = Convert.ToInt32(cb_trolley.SelectedValue.ToString()); string result = await dataAccessObject.StoreWeightAgainstAPI(qrCode, weight, trolleyId); // Update UI and clear input txt_dc.Text = qrCode.ToUpper(); txt_scan.Clear(); txt_dc.Visible = true; lbl_dc.Visible = true; cb_trolley.SelectedIndex = 0; CustomMessageBox.ShowSuccess(result); txt_scan.Enabled = false; await Task.Delay(15000); // 15-second delay txt_scan.Enabled = true; } catch (Exception ex) { CustomMessageBox.ShowError("Data not saved."); } finally { // Ensure txt_scan is enabled after delay, even if an error occurs txt_scan.Enabled = true; } } } private void menuStrip_ItemClicked(object sender, ToolStripItemClickedEventArgs e) { itemText = e.ClickedItem.Text; } public void adjustForFMS() { if (chk_box.Checked == true) { } } private void chk_box_CheckedChanged(object sender, EventArgs e) { if (chk_box.Checked == true) { controlVisibleFalse(); lbl_fmsno.Visible = true; txt_fms_no.Visible = true; } else { controlVisibleTrue(); lbl_fmsno.Visible = false; txt_fms_no.Visible = false; } } public void controlVisibleTrue() { cb_item.Visible = true; cb_location.Visible = true; cb_transporter.Visible = true; lbl_party_name.Visible = true; lbl_product_name.Visible = true; lbl_trnsporter.Visible = true; txt_container_no.Visible = true; lbl_container.Visible = true; } public void controlVisibleFalse() { cb_item.Visible = false; cb_location.Visible = false; cb_transporter.Visible = false; lbl_party_name.Visible = false; lbl_product_name.Visible = false; lbl_trnsporter.Visible = false; txt_container_no.Visible = false; lbl_container.Visible = false; } private void txt_vehicle_no_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == (char)13) { // Call the async method and handle the response with ContinueWith var task = getVehicleDetails(); task.ContinueWith(responseTask => { // Check if the task is completed successfully if (responseTask.Status == TaskStatus.RanToCompletion) { // Get the result string result = responseTask.Result; // Ensure UI updates happen on the main thread this.Invoke(new Action(() => { fillFields(result); })); } else if (responseTask.Status == TaskStatus.Faulted) { // Handle any exceptions this.Invoke(new Action(() => { CustomMessageBox.ShowError($"Error"); })); } }); } } private async Task getVehicleDetails() { string response = await dataAccessObject.GetVehicleDetails(txt_vehicle_no.Text.ToUpper()); apiResponse = JsonConvert.DeserializeObject(response); return response; } public void fillFields(string result) { try { // Parse the JSON to extract loadingVehicleWeightInfo var jsonObject = JObject.Parse(result); var vehicleInfoJson = jsonObject["loadingVehicleWeightInfo"]?.ToString(); // Check if loadingVehicleWeightInfo exists and is not empty if (!string.IsNullOrEmpty(vehicleInfoJson)) { // Deserialize loadingVehicleWeightInfo into LoadingVehicleWeightInfo object var vehicleInfo = JsonConvert.DeserializeObject(vehicleInfoJson); if (vehicleInfo.Id == 0) { txt_vehicle_no.BackColor = Color.PaleVioletRed; return; } else { txt_vehicle_no.BackColor = Color.LightGreen; } // Populate ComboBoxes if values are not null or empty if (!string.IsNullOrEmpty(vehicleInfo?.productCode)) cb_item.SelectedValue = vehicleInfo.productCode; if (!string.IsNullOrEmpty(vehicleInfo?.transporterCode)) cb_transporter.SelectedValue = vehicleInfo.transporterCode; if (!string.IsNullOrEmpty(vehicleInfo?.partyCode)) cb_location.SelectedValue = vehicleInfo.partyCode; // Set weights if values are valid, and clear if both are zero if (vehicleInfo?.DeadWeight == 0 && vehicleInfo?.FinalWeight == 0) { txt_1st_weight.Clear(); txt_2nd_weight.Clear(); } else { txt_1st_weight.Text = vehicleInfo?.DeadWeight?.ToString() ?? string.Empty; txt_2nd_weight.Text = vehicleInfo?.FinalWeight?.ToString() ?? string.Empty; } // Separate date and time for the DeadWeightDateTime if not null if (vehicleInfo?.DeadWeightDateTime != null) { txt_1st_date.Text = vehicleInfo.DeadWeightDateTime.Value.ToShortDateString(); txt_1st_time.Text = vehicleInfo.DeadWeightDateTime.Value.ToShortTimeString(); } else { txt_1st_date.Clear(); txt_1st_time.Clear(); } // Separate date and time for the FinalWeightDateTime if not null if (vehicleInfo?.FinalWeightDateTime != null) { txt_2nd_date.Text = vehicleInfo.FinalWeightDateTime.Value.ToShortDateString(); txt_2nd_time.Text = vehicleInfo.FinalWeightDateTime.Value.ToShortTimeString(); } else { txt_2nd_date.Clear(); txt_2nd_time.Clear(); } // Set comment if not null or empty //cb_comment.Text = vehicleInfo?.Comment ?? string.Empty; } else { // Clear fields if no vehicle info is found resetFields(0); } } catch (Exception ex) { CustomMessageBox.ShowError($"Error parsing vehicle details: {ex.Message}"); } } private void cb_location_Leave(object sender, EventArgs e) { string enteredValue = cb_location.Text.ToUpper(); bool valueExists = false; // Check if the entered value exists in the ComboBox foreach (DataRowView item in cb_location.Items) { if (item["party_name"].ToString().ToUpper() == enteredValue) // Use the actual column for display { valueExists = true; break; } } // If the value does not exist, prompt to add it if (!valueExists) { var result = MessageBox.Show($"The value '{enteredValue}' is not in the list. Would you like to add it?", "Add New Value", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (result == DialogResult.Yes) { dataAccessObject.AddValueToDatabase(enteredValue, "weight_scale_party", "party_name"); DataTable partyData = dataAccessObject.GetWeightScaleData("weight_scale_party"); // Invoke UI updates for other ComboBoxes Invoke((Action)(() => { // Bind party data to comboBoxParty cb_location.DataSource = partyData; cb_location.DisplayMember = "party_name"; cb_location.ValueMember = "party_code"; SetupSearchableComboBox(cb_location); })); } } } private void cb_transporter_Leave(object sender, EventArgs e) { string enteredValue = cb_transporter.Text.ToUpper(); bool valueExists = false; // Check if the entered value exists in the ComboBox foreach (DataRowView item in cb_transporter.Items) { if (item["transporter_name"].ToString().ToUpper() == enteredValue) // Use the actual column for display { valueExists = true; break; } } // If the value does not exist, prompt to add it if (!valueExists) { var result = MessageBox.Show($"The value '{enteredValue}' is not in the list. Would you like to add it?", "Add New Value", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (result == DialogResult.Yes) { dataAccessObject.AddValueToDatabase(enteredValue, "weight_scale_transporter", "transporter_name"); DataTable transporterData = dataAccessObject.GetWeightScaleData("weight_scale_transporter"); // Invoke UI updates for other ComboBoxes Invoke((Action)(() => { // Bind party data to comboBoxParty cb_transporter.DataSource = transporterData; cb_transporter.DisplayMember = "transporter_name"; cb_transporter.ValueMember = "transporter_code"; SetupSearchableComboBox(cb_transporter); })); } } } } }