public FormPrescriptionDetails(Patient patient)
        {
            InitializeComponent();
            _patient = patient;

            RefreshForm();
        }
        // Create a new patient and pass it to the meta layer for insertion into the database.
        public bool AddPatient(String firstName,
            String lastName,
            String addressLine1,
            String addressLine2,
            String city,
            String county,
            String postCode,
            DateTime dateOfBirth,
            String emailAddress,
            PersonGender gender,
            String maritalStatus,
            String telephoneNumber)
        {
            // Create a new member of staff with all of their details
            Patient newPatient = new Patient();
            newPatient.FirstName = EncodeMySql(firstName);
            newPatient.LastName = EncodeMySql(lastName);
            newPatient.AddressLine1 = EncodeMySql(addressLine1);
            newPatient.AddressLine2 = EncodeMySql(addressLine2);
            newPatient.City = EncodeMySql(city);
            newPatient.County = EncodeMySql(county);
            newPatient.PostCode = EncodeMySql(postCode);
            newPatient.DateOfBirth = dateOfBirth;
            newPatient.EmailAddress = EncodeMySql(emailAddress);
            newPatient.TelephoneNumber = EncodeMySql(telephoneNumber);
            newPatient.MaritalStatus = EncodeMySql(maritalStatus);
            newPatient.Gender = gender;

            return BusinessMetaLayer.AddPatientDetails(newPatient);
        }
        public void TestFindPatientOnID()
        {
            // Arrange
            AdminController adminController = new AdminController();
            Patient expectedPatient = new Patient();
            expectedPatient.PatientID = 1;
            expectedPatient.FirstName = "test";
            expectedPatient.LastName = "test";
            expectedPatient.DateOfBirth = new DateTime(1991, 2, 5);
            expectedPatient.Gender = PersonGender.Male;
            expectedPatient.TelephoneNumber = "00000000000";
            expectedPatient.EmailAddress = "test";
            expectedPatient.AddressLine1 = "test";
            expectedPatient.AddressLine2 = "test";
            expectedPatient.City = "test";
            expectedPatient.County = "test";
            expectedPatient.PostCode = "test";
            expectedPatient.MaritalStatus = "married";

            // Act
            Patient actualPatient = adminController.GetPatientDetails(1);

            // Assert
            Assert.AreEqual(expectedPatient, actualPatient);
        }
        public void TestModifyPatientSuccess()
        {
            // Arrange
            AdminController adminController = new AdminController();
            bool expected = true;

            Patient expectedPatient = new Patient();
            expectedPatient.PatientID = 1;
            expectedPatient.FirstName = "test";
            expectedPatient.LastName = "test";
            expectedPatient.DateOfBirth = new DateTime(1991, 2, 5);
            expectedPatient.Gender = PersonGender.Male;
            expectedPatient.TelephoneNumber = "00000000000";
            expectedPatient.EmailAddress = "test";
            expectedPatient.AddressLine1 = "test";
            expectedPatient.AddressLine2 = "test";
            expectedPatient.City = "test";
            expectedPatient.County = "test";
            expectedPatient.PostCode = "test";
            expectedPatient.MaritalStatus = "married";

            // Act
            bool actual = adminController.ModifyPatient(expectedPatient, 1, "test", "test", 0, "05/02/1991", "married", "00000000000", "test", "test", "test", "test", "test", "test");

            // Assert
            Assert.AreEqual(expected, actual);
        }
        // Create a new appointment and pass it to the meta layer for insertion into the database
        public bool AddAppointment(DateTime startDate, DateTime endDate, Staff staff, Patient patient)
        {
            Appointment newAppointment = new Appointment();
            newAppointment.PatientID = patient.PatientID;
            newAppointment.StaffID = staff.StaffID;
            newAppointment.StartDate = startDate;
            newAppointment.EndDate = endDate;

            return BusinessMetaLayer.AddAppointment(newAppointment);
        }
        public FormTestDetails(Patient patient)
        {
            InitializeComponent();
            _patient = patient;
            _patient.Tests = _adminController.GetPatientTests(_patient.PatientID);

            _staff = UserSession.Instance().CurrentUser;

            testTypeCmb.DataSource = Enum.GetValues(typeof(TestType));

            RefreshForm();
        }
        public void TestAddAppointmentExists()
        {
            // Arrange
            AdminController adminController = new AdminController();
            bool expected = false;

            Staff staff = new Staff();
            staff.StaffID = 1;

            Patient patient = new Patient();
            patient.PatientID = 1;

            // Act
            bool actual = adminController.AddAppointment(new DateTime(2000, 1, 1, 9, 0, 0), new DateTime(2000, 1, 1, 9, 15, 0), staff, patient);

            // Assert
            Assert.AreEqual(expected, actual);
        }
        // Modify the details of a patient
        public bool ModifyPatient(Patient oldPatient,
            int ID,
            string firstName,
            string lastName,
            int genderInt,
            string dob,
            string status,
            string telNo,
            string address1,
            string address2,
            string city,
            string county,
            string postCode,
            string email)
        {
            Patient patient = new Patient();

            // set all attris
            PersonGender gender;
            Enum.TryParse<PersonGender>(genderInt.ToString(), out gender);
            DateTime dateOfBirth = Convert.ToDateTime(dob);

            patient.PatientID = ID;
            patient.FirstName = EncodeMySql(firstName);
            patient.LastName = EncodeMySql(lastName);
            patient.Gender = gender;
            patient.DateOfBirth = dateOfBirth;
            patient.MaritalStatus = EncodeMySql(status);
            patient.TelephoneNumber = EncodeMySql(telNo);
            patient.AddressLine1 = EncodeMySql(address1);
            patient.AddressLine2 = EncodeMySql(address2);
            patient.City = EncodeMySql(city);
            patient.County = EncodeMySql(county);
            patient.PostCode = EncodeMySql(postCode);
            patient.EmailAddress = EncodeMySql(email);

            return BusinessMetaLayer.ModifyPatientDetails(oldPatient, patient);
        }
        public void AppointmentClicked(AppointmentLabel sender, EventArgs e)
        {
            AppointmentLabel ap = sender;
            _appointment = ap.Appointment;

            if (ap.Appointment != null)
            {
                _patient = ap.Appointment.Patient;

                // Fill in form details
                patientNameTxt.Text = _patient.ToString();
                dateOfBirthTxt.Text = _patient.DateOfBirth.ToShortDateString();
                startTxt.Text = _appointment.StartDate.ToShortTimeString();
                endTxt.Text = _appointment.EndDate.ToShortTimeString();
                appNotesTxt.Text = _appointment.AppointmentNotes;
                appNotesTxt.ReadOnly = true;

                // Change form fields
                addTestBtn.Enabled = true;

                if (_appointment.StartDate >= DateTime.Now)
                {
                    addPrescriptionBtn.Enabled = true;
                    appNotesTxt.ReadOnly = false;
                    saveAppointmentBtn.Enabled = true;
                }

                FormRefresh();
            }
            else
            {
                patientNameTxt.Text = "";
                startTxt.Text = "";
                endTxt.Text = "";
            }
        }
        public void TestAddAppointmentDoesntExist()
        {
            // Arrange
            AdminController adminController = new AdminController();

            // Create basic a staff
            Staff staff = new Staff();
            staff.StaffID = 1;

            // Create a basic patient
            Patient patient = new Patient();
            patient.PatientID = 1;

            // Expected result
            bool expected = true;

            // Need to clear the appointments table

            // Act
            bool actual = adminController.AddAppointment(new DateTime(2002, 1, 1, 9, 0, 0), new DateTime(2002, 1, 1, 9, 15, 0), staff, patient);

            // Assert
            Assert.AreEqual(expected, actual);
        }
        // Get all of the details of a patient based on search criteria
        public static List<Patient> GetPatientDetails(List<String> queryStrings)
        {
            Database db = Database.Instance();

            List<Patient> patientList = new List<Patient>();

            // Open the connection
            if (db.OpenConnection())
            {
                if (queryStrings.Count > 0)
                {
                    String query = "";

                    for (int i = 0; i < queryStrings.Count; ++i)
                    {
                        query += queryStrings[i];

                        if (i != queryStrings.Count - 1) query += " AND ";
                    }

                    // Access the patient table and get all matching rows (should only be one).
                    DbDataReader dr = db.Select("SELECT patients.* FROM patients WHERE " + query + ";");

                    //Read the data and store it in the new patient instance
                    while (dr.Read())
                    {
                        Patient patientDetails = new Patient();
                        patientDetails.PatientID = dr.GetInt32(0);
                        patientDetails.FirstName = dr.GetString(1);
                        patientDetails.LastName = dr.GetString(2);
                        patientDetails.DateOfBirth = dr.GetDateTime(3);
                        patientDetails.Gender = (PersonGender)dr.GetInt32(4);
                        patientDetails.TelephoneNumber = dr.GetString(5);
                        patientDetails.EmailAddress = dr.GetString(6);
                        patientDetails.AddressLine1 = dr.GetString(7);
                        patientDetails.AddressLine2 = dr.GetString(8);
                        patientDetails.City = dr.GetString(9);
                        patientDetails.County = dr.GetString(10);
                        patientDetails.PostCode = dr.GetString(11);
                        patientDetails.MaritalStatus = dr.GetString(12);

                        patientList.Add(patientDetails);
                    }

                    //close Data Reader
                    dr.Close();
                }
                db.CloseConnection();
            }

            // Return the newly created patient instance
            return patientList;
        }
        public void TestGetPatientTests()
        {
            // Arrange
            MedicalController controller = new MedicalController();
            Patient patient = new Patient();
            patient.Tests = new List<Test>();
            patient.Tests.Add(new Test());
            patient.Tests[0].StaffID = 1;
            patient.Tests[0].PatientID = 1;
            patient.Tests[0].TestDate = new DateTime(2013,12,12);
            patient.Tests[0].TestType = TestType.BloodTest;
            patient.Tests[0].TestResult = "test";

            // Act
            Patient actualPatient = new Patient();
            actualPatient.Tests = controller.GetPatientTests(1);

            // Assert
            CollectionAssert.AreEqual(patient.Prescriptions, actualPatient.Prescriptions);
        }
        public void TestGetPatientAppointments()
        {
            // Arrange
            AdminController adminController = new AdminController();
            Patient patient = new Patient();
            patient.Appointments = new List<Appointment>();
            patient.Appointments.Add(new Appointment());
            patient.Appointments[0].AppointmentID = 1;
            patient.Appointments[0].PatientID = 1;
            patient.Appointments[0].StaffID = 1;
            patient.Appointments[0].StartDate = new DateTime(2000, 01, 01, 9, 0, 0);
            patient.Appointments[0].EndDate = new DateTime(2000, 01, 01, 9, 15, 0);

            Patient expectedPatient = new Patient();

            // Act
            expectedPatient.Appointments = adminController.GetPatientAppointments(1);

            // Assert
            CollectionAssert.AreEqual(patient.Appointments, expectedPatient.Appointments);
        }
        // Store the new patient in the database
        public static bool AddPatientDetails(Patient newPatient)
        {
            Database db = Database.Instance();

            if (db.OpenConnection())
            {
                if (!PatientExists(newPatient))
                {
                    // Build the query string
                    String newPatientQuery;
                    String sqlFormattedDate = newPatient.DateOfBirth.Date.ToString("yyyy-MM-dd HH:mm:ss");

                    // Create the query string to be inserted
                    newPatientQuery = "INSERT INTO patients VALUES(NULL, '" + newPatient.FirstName + "'," +
                        "'" + newPatient.LastName + "'," +
                        "'" + sqlFormattedDate + "'," +
                        "'" + (int)newPatient.Gender + "'," +
                        "'" + newPatient.TelephoneNumber + "'," +
                        "'" + newPatient.EmailAddress + "'," +
                        "'" + newPatient.AddressLine1 + "'," +
                        "'" + newPatient.AddressLine2 + "'," +
                        "'" + newPatient.City + "'," +
                        "'" + newPatient.County + "'," +
                        "'" + newPatient.PostCode + "'," +
                        "'" + newPatient.MaritalStatus + "');";

                    // Insert the entry into the database
                    db.Insert(newPatientQuery);

                    // Close the connection
                    db.CloseConnection();
                    return true;
                }
                db.CloseConnection();
            }

            return false;
        }
        private void SelectPatient(object sender, DataGridViewCellEventArgs e)
        {
            // Make sure it's a row and not a column header
            if (e.RowIndex > -1)
            {
                // Set the patient to the select one
                _selectedIndex = e.RowIndex;
                _foundPatient = patientSearch.Patients[_selectedIndex];
                _foundPatient.Appointments = _adminController.GetPatientAppointments(_foundPatient.PatientID);

                // Load all of the patient's appointments
                foreach (Appointment a in _foundPatient.Appointments)
                {
                    a.Staff = BusinessMetaLayer.GetStaffDetails(a.StaffID);
                    a.Patient = _foundPatient;
                }

                // Add the list to the data source
                BindingSource test = appointmentBindingSource;
                test.DataSource = _foundPatient.Appointments;

                //bind datagridview to binding source
                dataGridView1.DataSource = test;
                dataGridView1.Refresh();

                saveBtn.Enabled = false;
                viewPrescriptionsBtn.Enabled = true;
                viewResultsBtn.Enabled = true;

                firstNameTxt.ReadOnly = true;
                lastNameTxt.ReadOnly = true;
                genderCmb.Enabled = false;
                dobTxt.ReadOnly = true;
                statusTxt.ReadOnly = true;
                telTxt.ReadOnly = true;
                address1Txt.ReadOnly = true;
                address2Txt.ReadOnly = true;
                cityTxt.ReadOnly = true;
                countyTxt.ReadOnly = true;
                postCodeTxt.ReadOnly = true;
                emailTxt.ReadOnly = true;

                modifyBtn.Enabled = true;
            }

            RefreshForm();
        }
        public void TestGetPatientPrescriptions()
        {
            // Arrange
            MedicalController controller = new MedicalController();
            Patient patient = new Patient();
            patient.Prescriptions = new List<Prescription>();
            patient.Prescriptions.Add(new Prescription());
            patient.Prescriptions[0].PrescriptionID = 1;
            patient.Prescriptions[0].PatientID = 1;
            patient.Prescriptions[0].StaffID = 1;
            patient.Prescriptions[0].StartDate = new DateTime(2013, 10, 12);
            patient.Prescriptions[0].EndDate = new DateTime(2014, 1, 1);
            patient.Prescriptions[0].Extended = false;
            patient.Prescriptions[0].Medicines.Add(new Medicine());
            patient.Prescriptions[0].Medicines[0].MedicineID = 1;
            patient.Prescriptions[0].Medicines[0].MedicineName = "Thyroxine";
            patient.Prescriptions[0].Medicines[0].Dosage = "125mg";
            patient.Prescriptions[0].Medicines[0].Extendable = false;

            patient.Prescriptions.Add(new Prescription());
            patient.Prescriptions[1].PrescriptionID = 2;
            patient.Prescriptions[1].PatientID = 1;
            patient.Prescriptions[1].StaffID = 1;
            patient.Prescriptions[1].StartDate = new DateTime(2013, 01, 01);
            patient.Prescriptions[1].EndDate = new DateTime(2013, 02, 01);
            patient.Prescriptions[1].Extended = false;
            patient.Prescriptions[1].Medicines.Add(new Medicine());
            patient.Prescriptions[1].Medicines[0].MedicineID = 2;
            patient.Prescriptions[1].Medicines[0].MedicineName = "Thyroxine";
            patient.Prescriptions[1].Medicines[0].Dosage = "50mg";
            patient.Prescriptions[1].Medicines[0].Extendable = true;

            // Act
            Patient expectedPatient = new Patient();
            expectedPatient.Prescriptions = controller.GetPatientPrescriptions(1);

            // Assert
            CollectionAssert.AreEqual(patient.Prescriptions, expectedPatient.Prescriptions);
        }
        // Get all of the details about a certain patient (used within appointments etc so far)
        public static Patient GetPatientDetails(int patientID)
        {
            Database db = Database.Instance();

            Patient patientDetails = new Patient();

            // Open the connection
            if (db.OpenConnection())
            {
                // Access the patient table and get all matching rows (should only be one).
                DbDataReader dr = db.Select("SELECT patients.* FROM patients WHERE patientID='" + patientID.ToString() + "';");

                //Read the data and store it in the new patient instance
                while (dr.Read())
                {
                    patientDetails.PatientID = dr.GetInt32(0);
                    patientDetails.FirstName = dr.GetString(1);
                    patientDetails.LastName = dr.GetString(2);
                    patientDetails.DateOfBirth = dr.GetDateTime(3);
                    patientDetails.Gender = (PersonGender)dr.GetInt32(4);
                    patientDetails.TelephoneNumber = dr.GetString(5);
                    patientDetails.EmailAddress = dr.GetString(6);
                    patientDetails.AddressLine1 = dr.GetString(7);
                    patientDetails.AddressLine2 = dr.GetString(8);
                    patientDetails.City = dr.GetString(9);
                    patientDetails.County = dr.GetString(10);
                    patientDetails.PostCode = dr.GetString(11);
                    patientDetails.MaritalStatus = dr.GetString(12);
                }

                //close Data Reader
                dr.Close();

                db.CloseConnection();
            }

            // Return the newly created patient instance
            return patientDetails;
        }
        // Checks if a patient details are already stored
        public static bool PatientExists(Patient patient)
        {
            Database db = Database.Instance();

            String sqlFormattedDate = patient.DateOfBirth.Date.ToString("yyyy-MM-dd HH:mm:ss");

            // Check the number of rows that are returned
            int numRows = db.Count("SELECT COUNT(*) FROM patients WHERE firstName='" + patient.FirstName +
                "'and lastName='" + patient.LastName +
                "'and DoB='" + sqlFormattedDate +
                "'and gender='" + (int)patient.Gender +
                "'and telNo='" + patient.TelephoneNumber +
                "'and email='" + patient.EmailAddress +
                "'and addressLine1='" + patient.AddressLine1 +
                "'and addressLine2='" + patient.AddressLine2 +
                "'and city='" + patient.City +
                "'and county='" + patient.County +
                "'and postCode='" + patient.PostCode +
                "'and maritalStatus='" + patient.MaritalStatus + "';");

            // If a user exists and there's one row
            if (numRows > 0)
            {
                // The person exists already
                return true;
            }

            return false;
        }
        // Update a patients details
        public static bool ModifyPatientDetails(Patient oldPatientDetails, Patient patient)
        {
            Database db = Database.Instance();

            if (db.OpenConnection())
            {
                if (PatientExists(oldPatientDetails))
                {
                    // Build the query string
                    String newPatientQuery;
                    String sqlFormattedDate = patient.DateOfBirth.Date.ToString("yyyy-MM-dd HH:mm:ss");

                    // Create the query string to be inserted
                    newPatientQuery = "UPDATE patients SET firstName='" + patient.FirstName +
                    "', lastName='" + patient.LastName +
                    "', DoB='" + sqlFormattedDate +
                    "', gender='" + (int)patient.Gender +
                    "', telNo='" + patient.TelephoneNumber +
                    "', email='" + patient.EmailAddress +
                    "', addressLine1='" + patient.AddressLine1 +
                    "', addressLine2='" + patient.AddressLine2 +
                    "', city='" + patient.City +
                    "', county='" + patient.County +
                    "', postCode='" + patient.PostCode +
                    "', maritalStatus='" + patient.MaritalStatus + "' WHERE patientID=" + patient.PatientID + ";";

                    // Insert the entry into the database
                    db.Update(newPatientQuery);

                    // Close the connection
                    db.CloseConnection();
                    return true;
                }
                db.CloseConnection();
            }

            return false;
        }
        // Set the patients details from the patientSearch Control
        private void SelectPatient(object sender, DataGridViewCellEventArgs e)
        {
            // Check the selected row isn't a column header
            if (e.RowIndex > -1)
            {
                // Set the patient to the selected option
                _patient = patientSearch.Patients[e.RowIndex];
                addBtn.Enabled = true;
            }

            RefreshForm();
        }