given that I have completed task 1 from this assingment, please complete task 2 for me and also find the code for my task 1 below. please make sure you fulfill task 2 professionally and do not miss any details in task 2 while staying in limits



Assignment:
Scenario
You are contracted to develop a home appliance rental application for a local startup
company. The renting business company provides affordable rental services for people
looking to hire home electrical appliances from small to large for a minimum period of time
starting from ONE (1) month. Examples of types of appliances are TV, fridge, freezer,
washing machine, dryer, dishwasher, microwave, etc.
The application should have TWO (2) types of users which are administrator and
customer. An administrator can view, add, edit, and delete an item. A customer can create
an account with a username and password. The usernames can only contain letters and
numbers. The password must be of length between EIGHT (8) and SIXTEEN (16)
characters, and contain at least ONE (1) lowercase and ONE (1) uppercase letter. A
customer can search, view, and order an item after they successfully log in the application.
Your program should include the following requirements.
Functional Requirements:
● Customers can register.
● Customers can search appliances by type and view sorted appliances by energy
consumption (see the table below for some common appliances, or research for
your chosen appliances) or weekly cost. They can also add appliance items to a
shopping cart.
● Calculation of the total price.
● Administrators can add, edit and delete appliance items.
● Log in page for customers and administrators. Appropriately handle the situation
when a reasonable number of failed login attempts occur.
(Hutson, S. (2022). Which appliances use the most energy? Compare The
Market. https://www.comparethemarket.com/energy/content/which-appliances-use-themost-energy/)
Appliance Power usage Typical usage Estimated annual
running costs
LCD TV 0.21kWh per hour 6 hours a day
(power on)
£130
Fridge Freezer (A
spec)
408kWh per year 24 hours a day £115
Tumble Dryer 2.50kWh per cycle 148 uses a year £105
Electric hob 0.71kWh per use 424 uses a year £85
Electric oven 1.56kWh per use 135 uses per year £60
Dishwasher 1.44kWh per use (at
65⁰C)
135 uses per year £55
Kettle 0.11kWh per use
based on heating 1
litre of water
1,542 uses per year £48
 Page 3 of 4
Designing and Developing Object-Oriented Computer Programs © NCC Education Limited 2023
Non-functional Requirements:
● Set up the GUI
● Provide FIVE (5) types of appliances of your choice.
● Each type has TEN (10) appliances.
● Each appliance is rented for a monthly fee.
● Each appliance should have an appropriate description, such as brand, model,
dimensions, colour, energy consumption, monthly fee etc.
● All FIVE (5) types of appliances should have different minimum rental contract
periods starting from ONE (1) month.
● The application users are customers and administrators.
● Provide appropriate errors and help messages, and guidance for customer
Task 1 (60 Marks)
a) You need to design and implement a program (written in C#) which fulfils all the
requirements as outlined above.
(50 marks)
b) The quality of your program will be assessed in terms of program structure, OOP
principles including encapsulation, algorithms using appropriate control structures
(loops and selections), and readability including appropriate comments.
(10 marks)
Task 2 (20 Marks)
You will need to develop a test plan and implement it. You should write a FIVE HUNDRED
(500) word report about the plan, which should include the test plan, purpose of each test,
together with test scripts*, and the testing results* with full details.
An additional FIVE HUNDRED (500) word discussion should be included to justify how the
data was selected and executed.
*There is no word limit for the test scripts and testing results.
The minimum requirements for a pass mark include developing and implementing a test
plan including test cases with some possible/invalid inputs for any TWO (2) functions
mentioned above to ensure the functions handle the inputs as they should.
Possible exceptions should be considered and tested to make sure they are properly
handled.




---------------------------------------------------------------------------------------------
Task 1:
Form1.cs:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.Remoting.Lifetime;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.OleDb;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.Button;

namespace ApplianceRental
{
    public partial class Form1 : Form
    {
        

        public Form1()
        {
            InitializeComponent();
            OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db_users.mdb");
            OleDbCommand cmd = new OleDbCommand();
            OleDbDataAdapter da = new OleDbDataAdapter();
            
        }
        //connects to database
        OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db_users.mdb");
        OleDbCommand cmd = new OleDbCommand();
        OleDbDataAdapter da = new OleDbDataAdapter();
        private void Form1_Load(object sender, EventArgs e)
        {
            
        }
        // Add a counter variable or class level property
        private int failedAttempts = 0;
        private void button1_Click(object sender, EventArgs e)
        {
           
            string username = textBox1.Text;
            string password = textBox2.Text;

            // Max login attempts
            if (failedAttempts >= 3)
            {
                MessageBox.Show("Maximum login attempts reached.Contact the admin");
                this.Close();
            }

            // Checks if user is admin if not then automatically user is assumed to be customer hence database of customer is checked
            if (username == "Admin123" && password == "stcmalta")
            {
                // Open the Admin Dashboard form
                AdminDashboardForm adminDashboardForm = new AdminDashboardForm();
                adminDashboardForm.Show();
                this.Hide();
            }
            else
            {
                con.Open();
                string login = "SELECT * FROM tbl_users WHERE username = '" + textBox1.Text + "' and password= '" + textBox2.Text + "'";
                cmd = new OleDbCommand(login, con);
                OleDbDataReader dr = cmd.ExecuteReader();
                if (dr.Read() == true)
                {
                    new CustomerDashboardForm().Show();
                    this.Hide();
                }
                
                else
                {
                  
                    MessageBox.Show("Invalid username or password! Please try again.");
                    failedAttempts++;
                }
                con.Close();
            }
        }





            private void button2_Click(object sender, EventArgs e)
            {
            new RegistrationForm().Show();
                this.Hide();
        }

        private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            //snippet to unhide password if ticked
            if (checkBox1.Checked)
            {
                textBox2.PasswordChar = '\0';
            }
            else
            {
                textBox2.PasswordChar = '*';
            }
        }

        private void Form1_Load_1(object sender, EventArgs e)
        {

        }

        private void pictureBox1_Click(object sender, EventArgs e)
        {

        }
        private void pictureBox1_Enter(object sender, EventArgs e)
        {
            pictureBox1.TabStop = false;
        }

    }
}

CustomerDashboardForm.cs:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.Remoting.Lifetime;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Net.Mime.MediaTypeNames;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
using System.Text.RegularExpressions;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.TextBox;

namespace ApplianceRental
{
    public partial class CustomerDashboardForm : Form
    {
        private DataTable cartItems = new DataTable();
        public CustomerDashboardForm()
        {
            InitializeComponent();
            cartItems.Columns.Add("Appliance");
            cartItems.Columns.Add("PowerUsage");
            cartItems.Columns.Add("TypicalUsage");
            cartItems.Columns.Add("AnnualCost");
            // Set dataGridViewCart DataSource
            dataGridViewCart.DataSource = cartItems;
        }

        private void CustomerDashboardForm_Load(object sender, EventArgs e)
        {
            // TODO: This line of code loads data into the 'db_usersDataSet.ApplianceDBLIST' table. You can move, or remove it, as needed.
            this.applianceDBLISTTableAdapter.Fill(this.db_usersDataSet.ApplianceDBLIST);
            BindingSource bindingSource = new BindingSource();
            bindingSource.DataSource = this.db_usersDataSet.ApplianceDBLIST;
            comboBox1.DataSource = bindingSource;
            comboBox1.DisplayMember = "Appliance";  // replace “Appliance” with your actual appliance column name
            dataGridView1.DataSource = bindingSource;
        }

        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            for (int i = 0; i < dataGridView1.Rows.Count; i++)
            {
                if (dataGridView1.Rows[i].Cells[0].Value != null)  // Add this line to check for null values
                {
                    string applianceInGrid = dataGridView1.Rows[i].Cells[0].Value.ToString(); // Assuming Appliance is the first column
                    string applianceInComboBox = comboBox1.SelectedItem.ToString();

                    if (applianceInGrid == applianceInComboBox)
                    {
                        dataGridView1.ClearSelection();
                        dataGridView1.Rows[i].Selected = true;
                        dataGridView1.CurrentCell = dataGridView1.Rows[i].Cells[0];
                        break;
                    }
                }
                }
            }
        private void CalculateTotal()
        {
            decimal totalAmount = 0;

            foreach (DataRow row in cartItems.Rows)
            {
                totalAmount += Convert.ToDecimal(row["AnnualCost"]);
            }

            labelTotalAmount.Text = totalAmount.ToString("C", new System.Globalization.CultureInfo("en-GB"));
        }
        private void button1_Click(object sender, EventArgs e)
        {
            if (comboBox1.SelectedIndex < 0)
            {
                MessageBox.Show("Please select an appliance to add to the cart.");
            }
            else
            {
                // Get the selected row in dataGridView1
                DataGridViewRow selectedRow = dataGridView1.Rows[comboBox1.SelectedIndex];

                // Create a new row for cartItems
                DataRow newRow = cartItems.NewRow();

                newRow["Appliance"] = selectedRow.Cells[0].Value; // Use the column index instead of name
                newRow["PowerUsage"] = selectedRow.Cells[1].Value; // Assuming Power Usage is the second column
                newRow["TypicalUsage"] = selectedRow.Cells[2].Value; // Assuming Typical Usage is the third column
                newRow["AnnualCost"] = selectedRow.Cells[3].Value; // Assuming Estimated Annual Costs is the fourth column

                // Add newRow to the cartItems
                cartItems.Rows.Add(newRow);

                // Calculate and display the total amount
                CalculateTotal();
            }
        }

        private void searchBox_TextChanged(object sender, EventArgs e)
        {
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(searchBox.Text))
            {
                MessageBox.Show("Please enter something to search");
            }
            else
            {
                DataView dataView = db_usersDataSet.ApplianceDBLIST.DefaultView;
                string searchExpression = Regex.Escape(searchBox.Text.Trim()).Replace("'", "''");
                dataView.RowFilter = string.Format("Appliance LIKE '%{0}%'", searchExpression);
                dataGridView1.DataSource = dataView;
            }
        }

        private void flowLayoutPanel1_Paint(object sender, PaintEventArgs e)
        {

        }

        private void labelTotalAmount_TextChanged(object sender, EventArgs e)
        {

        }
    }
}
AdminDashboardForm:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace ApplianceRental
{
    public partial class AdminDashboardForm : Form
    {
        OleDbDataAdapter sda;
        OleDbCommandBuilder scb;
        DataTable dt;
        OleDbConnection con;
        string connectionString = $@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source = { Path.Combine(Application.StartupPath, "db_users.mdb") }";

        public AdminDashboardForm()
        {
            InitializeComponent();
            con = new OleDbConnection(connectionString);
        }
        private void AdminDashboardForm_Load(object sender, EventArgs e)
        {
        }
        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            // Code logic for the event handler
        }

        private void saveButton_Click(object sender, EventArgs e)
        {
            using (OleDbCommand insertCommand = new OleDbCommand("INSERT INTO ApplianceDBLIST ([Appliance], [Power Usage], [Typical Usage], [Estimated Annual Costs]) VALUES (?, ?, ?, ?)", con),
                              updateCommand = new OleDbCommand("UPDATE ApplianceDBLIST SET [Appliance]=?, [Power Usage]=?, [Typical Usage]=?, [Estimated Annual Costs]=? WHERE ID=?", con),
                              deleteCommand = new OleDbCommand("DELETE FROM ApplianceDBLIST WHERE ID=?", con))
            {
                sda.InsertCommand = insertCommand;
                insertCommand.Parameters.Add("@Appliance", OleDbType.VarWChar, 0, "Appliance");
                insertCommand.Parameters.Add("@Power_Usage", OleDbType.VarWChar, 0, "Power Usage");
                insertCommand.Parameters.Add("@Typical_Usage", OleDbType.VarWChar, 0, "Typical Usage");
                insertCommand.Parameters.Add("@Estimated_annual_costs", OleDbType.VarWChar, 0, "Estimated Annual Costs");

                sda.UpdateCommand = updateCommand;
                updateCommand.Parameters.Add("@Appliance", OleDbType.VarWChar, 0, "Appliance");
                updateCommand.Parameters.Add("@Power_Usage", OleDbType.VarWChar, 0, "Power Usage");
                updateCommand.Parameters.Add("@Typical_Usage", OleDbType.VarWChar, 0, "Typical Usage");
                updateCommand.Parameters.Add("@Estimated_annual_costs", OleDbType.VarWChar, 0, "Estimated Annual Costs");
                updateCommand.Parameters.Add("@ID", OleDbType.Integer, 0, "ID");
                updateCommand.UpdatedRowSource = UpdateRowSource.None;

                sda.DeleteCommand = deleteCommand;
                deleteCommand.Parameters.Add("@ID", OleDbType.Integer, 0, "ID");
                deleteCommand.UpdatedRowSource = UpdateRowSource.None;

                con.Open();
                sda.Update(dt);
                con.Close();

                // Refresh the data after updating, to display updated data in DataGridView
                dt.Clear();
                sda.Fill(dt);
            }
        }


        private void button1_Click(object sender, EventArgs e)
        {
            string query = "SELECT * FROM ApplianceDBLIST";
            sda = new OleDbDataAdapter(query, con);
            OleDbCommandBuilder cmdBuilder = new OleDbCommandBuilder(sda);

            dt = new DataTable();
            sda.Fill(dt);
            dataGridView1.DataSource = dt;
        }

        private void label7_Click(object sender, EventArgs e)
        {

        }

        private void label1_Click(object sender, EventArgs e)
        {

        }
    }
}
RegistrationForm.cs:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.ListView;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.StartPanel;
using System.Xml.Linq;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;

namespace ApplianceRental
{
    public partial class RegistrationForm : Form
    {
        

        public RegistrationForm() // Add Form1 loginForm as a parameter
        {
            InitializeComponent();


        }
        OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db_users.mdb");
        OleDbCommand cmd = new OleDbCommand();
        OleDbDataAdapter da = new OleDbDataAdapter();
        private void Register_Click(object sender, EventArgs e)
        {
            
            // Validate input fields
           

            if (string.IsNullOrEmpty(textBox2.Text))
            {
                MessageBox.Show("Please enter a password.");
                return;
            }

            if (textBox2.Text != textBox3.Text)
            {
                MessageBox.Show("Passwords do not match.");
                return;
            }

            if (string.IsNullOrEmpty(textBox4.Text))
            {
                MessageBox.Show("Please enter your full name.");
                return;
            }

            if (string.IsNullOrEmpty(textBox5.Text))
            {
                MessageBox.Show("Please enter your email address.");
                return;
            }

            if (string.IsNullOrEmpty(textBox6.Text))
            {
                MessageBox.Show("Please enter your address.");
                return;
            }
           

     
            
             if (textBox2.Text.Length < 8 &&  textBox2.Text.Length > 16)
                {
                MessageBox.Show("Password must be between 8 and 16 characters.");
                return;
            }
                else if (!textBox2.Text.Any(char.IsLower) || !textBox2.Text.Any(char.IsUpper))
            {
                MessageBox.Show("Password must contain at least one lowercase and one uppercase letter.");
                return;
            }

            con.Open();
            string register = "INSERT INTO tbl_users VALUES ('" + textBox1.Text + "','" + textBox2.Text + "', '" + textBox4.Text + "', '" + textBox5.Text + "', '" + textBox6.Text + "')";
            cmd = new OleDbCommand(register, con);
            cmd.ExecuteNonQuery();
            con.Close();
            // Successful registration, do something here
            MessageBox.Show("Registration successful!");

            //emptying the fields
            textBox1.Text = "";
            textBox2.Text = "";
            textBox4.Text = "";
            textBox5.Text = "";
            textBox6.Text = "";
            textBox3.Text = "";
            
            this.Hide();
            new Form1().Show();






        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void textBox3_TextChanged(object sender, EventArgs e)
        {

        }

        private void textBox2_TextChanged(object sender, EventArgs e)
        {

        }

        private void textBox4_TextChanged(object sender, EventArgs e)
        {

        }

        private void textBox5_TextChanged(object sender, EventArgs e)
        {

        }

        private void textBox6_TextChanged(object sender, EventArgs e)
        {

        }
    }
}