Utopia-Weight-Scale/WindowsFormsApp1/WeighingForm.cs

1374 lines
50 KiB
C#

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;
// Dictionary to store trolley weights
Dictionary<int, int> trolleyWeights = new Dictionary<int, int>();
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<List<dynamic>>(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((Action)(() =>
{
// Convert response into a list with 'id' and 'code' for binding, include "SELECT"
var trolleyList = items
.Select(item => new { id = (int)item.id, code = (string)item.code })
.ToList();
// Populate the dictionary with weights (including "SELECT" with ID 0)
foreach (var item in items)
{
// Ensure we do not add "SELECT" (id = 0) to trolleyWeights
if ((int)item.id != 0)
{
trolleyWeights[(int)item.id] = (int)item.weight;
}
}
// Bind ComboBox with all items
cb_trolley.DataSource = trolleyList;
cb_trolley.DisplayMember = "code"; // Display the trolley code
cb_trolley.ValueMember = "id"; // Use 'id' as the value
// Set default selection to "SELECT"
cb_trolley.SelectedIndex = 0;
// Attach event handler for selection change
cb_trolley.SelectedIndexChanged += cb_trolley_SelectedIndexChanged;
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<string> 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<string> 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<string> getVehicleDetails()
{
string response = await dataAccessObject.GetVehicleDetails(txt_vehicle_no.Text.ToUpper());
apiResponse = JsonConvert.DeserializeObject<VehicleRequestApiResponse>(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<LoadingVehicleWeightInfo>(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);
}));
}
}
}
private void cb_trolley_SelectedIndexChanged(object sender, EventArgs e)
{
if (cb_trolley.SelectedValue != null)
{
// Ensure the selected value is converted to an integer
if (int.TryParse(cb_trolley.SelectedValue.ToString(), out int selectedId))
{
if (selectedId != 0 && trolleyWeights.ContainsKey(selectedId))
{
txt_weight.Text = trolleyWeights[selectedId].ToString();
}
else
{
txt_weight.Text = ""; // Clear textbox for "SELECT"
}
}
else
{
txt_weight.Text = "";
}
}
}
}
}