private bool RecordExistsCheck(
            SqlCommand cmd,
            IPayrollModel model,
            TypeOfExistenceCheck typeOfExistenceCheck,
            RequestType requestType
            )
        {
            Int32 count0fRecordsFound     = 0;
            bool  recordExistsCheckPassed = true;

            DataAccessStatus dataAccessStatus = new DataAccessStatus();
            SqlCommand       cmdCheck         = new SqlCommand(null, cmd.Connection);

            cmdCheck.Prepare();

            if ((requestType == RequestType.Add) || (requestType == RequestType.ConfirmAdd))
            {
                cmdCheck.CommandText = "SELECT count(*) FROM Payrolls where EmployeeID = @EmployeeID";
                cmdCheck.Parameters.AddWithValue("@EmployeeID", model.EmployeeID);
            }
            else if ((requestType == RequestType.Update) || (requestType == RequestType.Delete) || (requestType == RequestType.ConfirmDelete))
            {
                cmdCheck.CommandText = "SELECT count(*) FROM Payrolls WHERE ID = @ID";
                cmdCheck.Parameters.AddWithValue("@ID", model.ID);
            }

            try
            {
                count0fRecordsFound = Convert.ToInt32(cmdCheck.ExecuteScalar());
            }
            catch (SqlException e)
            {
                string msg = e.Message;
                throw e;
            }

            if ((typeOfExistenceCheck == TypeOfExistenceCheck.DoesNotExistInDB) && (count0fRecordsFound > 0))
            {
                dataAccessStatus.Status = "Error";
                recordExistsCheckPassed = false;

                throw new DataAccessException(dataAccessStatus);
            }
            else if ((typeOfExistenceCheck == TypeOfExistenceCheck.DoesExistInDB) && (count0fRecordsFound == 0))
            {
                dataAccessStatus.Status = "Error";
                recordExistsCheckPassed = false;

                throw new DataAccessException(dataAccessStatus);
            }

            return(recordExistsCheckPassed);
        }
 public void ValidateModelDataAnnotations(IPayrollModel model)
 {
     modelCheck.ValidateModelDataAnnotations(model);
 }
 public void Update(IPayrollModel model)
 {
     ValidateModelDataAnnotations(model);
     repository.Update(model);
 }
 public void Remove(IPayrollModel model)
 {
     repository.Remove(model);
 }
 public void Add(IPayrollModel model)
 {
     ValidateModelDataAnnotations(model);
     repository.Add(model);
 }
        public void Add(IPayrollModel model)
        {
            DataAccessStatus dataAccessStatus = new DataAccessStatus();

            using (SqlConnection sqlConnection = new SqlConnection(connectionString))
            {
                try
                {
                    sqlConnection.Open();
                }
                catch (SqlException e)
                {
                    dataAccessStatus.setValues(status: "Error", operationSucceeded: false, exceptionMessage: e.Message,
                                               customMessage: "Unable to add Payroll. Could not open a database connection", helpLink: e.HelpLink, errorCode: e.ErrorCode,
                                               stackTrace: e.StackTrace);

                    throw new DataAccessException(e.Message, e.InnerException, dataAccessStatus);
                }

                string addQuery =
                    "INSERT INTO Payrolls (GrossPay, NetPay, EmployeeID) " +
                    "VALUES (@GrossPay, @NetPay, @EmployeeID)";

                using (SqlCommand cmd = new SqlCommand(null, sqlConnection))
                {
                    try
                    {
                        RecordExistsCheck(cmd, model, TypeOfExistenceCheck.DoesNotExistInDB, RequestType.Add);
                    }
                    catch (DataAccessException e)
                    {
                        e.DataAccessStatusInfo.CustomMessage    = "Payroll could not be added because the employee has already payroll.";
                        e.DataAccessStatusInfo.ExceptionMessage = string.Copy(e.Message);
                        e.DataAccessStatusInfo.StackTrace       = string.Copy(e.StackTrace);

                        throw e;
                    }

                    cmd.CommandText = addQuery;

                    cmd.Parameters.AddWithValue("@GrossPay", model.GrossPay).SqlDbType     = SqlDbType.Int;
                    cmd.Parameters.AddWithValue("@NetPay", model.NetPay).SqlDbType         = SqlDbType.Int;
                    cmd.Parameters.AddWithValue("@EmployeeID", model.EmployeeID).SqlDbType = SqlDbType.Int;

                    try
                    {
                        cmd.ExecuteNonQuery();
                    }
                    catch (SqlException e)
                    {
                        dataAccessStatus.setValues(status: "Error", operationSucceeded: false, exceptionMessage: e.Message,
                                                   customMessage: "Unable to add the payroll.", helpLink: e.HelpLink, errorCode: e.ErrorCode,
                                                   stackTrace: e.StackTrace);

                        throw new DataAccessException(e.Message, e.InnerException, dataAccessStatus);
                    }

                    //Confirm the Payroll Model was Added to the database
                    try
                    {
                        RecordExistsCheck(cmd, model, TypeOfExistenceCheck.DoesExistInDB, RequestType.ConfirmAdd);
                    }
                    catch (DataAccessException e)
                    {
                        e.DataAccessStatusInfo.Status             = "Error";
                        e.DataAccessStatusInfo.OperationSucceeded = false;
                        e.DataAccessStatusInfo.CustomMessage      = "Failed to find the payroll in database after add operation completed.";
                        e.DataAccessStatusInfo.ExceptionMessage   = string.Copy(e.Message);
                        e.DataAccessStatusInfo.StackTrace         = string.Copy(e.StackTrace);

                        throw new DataAccessException(dataAccessStatus);
                    }

                    sqlConnection.Close();
                }
            }
        }
        public void Update(IPayrollModel model)
        {
            int result = -1;
            DataAccessStatus dataAccessStatus = new DataAccessStatus();

            using (SqlConnection sqlConnection = new SqlConnection(connectionString))
            {
                try
                {
                    sqlConnection.Open();
                }
                catch (SqlException e)
                {
                    dataAccessStatus.setValues(status: "Error", operationSucceeded: false, exceptionMessage: e.Message,
                                               customMessage: "Unable to Update Payroll. Could not open database connection.",
                                               helpLink: e.HelpLink, errorCode: e.ErrorCode, stackTrace: e.StackTrace);

                    throw new DataAccessException(e.Message, e.InnerException, dataAccessStatus);
                }

                string updateDepQuery =
                    "UPDATE Payrolls " +
                    "SET GrossPay = @GrossPay, " +
                    "NetPay = @NetPay, " +
                    "EmployeeID = @EmployeeID " +
                    "WHERE ID =  @ID";

                using (SqlCommand cmd = new SqlCommand(updateDepQuery, sqlConnection))
                {
                    try
                    {
                        RecordExistsCheck(cmd, model, TypeOfExistenceCheck.DoesExistInDB, RequestType.Update);
                    }
                    catch (DataAccessException e)
                    {
                        e.DataAccessStatusInfo.CustomMessage    = "Payroll could not be updated because it could not be found in the database";
                        e.DataAccessStatusInfo.ExceptionMessage = string.Copy(e.Message);
                        e.DataAccessStatusInfo.StackTrace       = string.Copy(e.StackTrace);

                        throw e;
                    }

                    cmd.CommandText = updateDepQuery;

                    cmd.Parameters.AddWithValue("@GrossPay", model.GrossPay).SqlDbType     = SqlDbType.Int;
                    cmd.Parameters.AddWithValue("@NetPay", model.NetPay).SqlDbType         = SqlDbType.Int;
                    cmd.Parameters.AddWithValue("@EmployeeID", model.EmployeeID).SqlDbType = SqlDbType.Int;
                    cmd.Parameters.AddWithValue("@ID", model.ID).SqlDbType = SqlDbType.Int;

                    cmd.Prepare();
                    try
                    {
                        result = cmd.ExecuteNonQuery();
                    }
                    catch (SqlException e)
                    {
                        dataAccessStatus.setValues(status: "Error", operationSucceeded: false, exceptionMessage: e.Message,
                                                   customMessage: "Unable to Update The Payroll",
                                                   helpLink: e.HelpLink, errorCode: e.ErrorCode, stackTrace: e.StackTrace);

                        throw new DataAccessException(e.Message, e.InnerException, dataAccessStatus);
                    }
                }
                sqlConnection.Close();
            }
        }
        public void Remove(IPayrollModel model)
        {
            DataAccessStatus dataAccessStatus = new DataAccessStatus();

            using (SqlConnection sqlConnection = new SqlConnection(connectionString))
            {
                try
                {
                    sqlConnection.Open();
                }
                catch (SqlException e)
                {
                    dataAccessStatus.setValues(status: "Error", operationSucceeded: false, exceptionMessage: e.Message,
                                               customMessage: "Unable to Delete The Payroll. Could not open database connection.",
                                               helpLink: e.HelpLink, errorCode: e.ErrorCode, stackTrace: e.StackTrace);

                    throw new DataAccessException(e.Message, e.InnerException, dataAccessStatus);
                }

                string deleteQuery = "DELETE FROM Payrolls WHERE ID = @ID";

                using (SqlCommand cmd = new SqlCommand(deleteQuery, sqlConnection))
                {
                    try
                    {
                        RecordExistsCheck(cmd, model, TypeOfExistenceCheck.DoesExistInDB, RequestType.Delete);
                    }
                    catch (DataAccessException e)
                    {
                        e.DataAccessStatusInfo.CustomMessage    = "Payroll could not be deleted because it could not be found in the database";
                        e.DataAccessStatusInfo.ExceptionMessage = string.Copy(e.Message);
                        e.DataAccessStatusInfo.StackTrace       = string.Copy(e.StackTrace);

                        throw e;
                    }

                    cmd.CommandText = deleteQuery;

                    cmd.Prepare();
                    cmd.Parameters.AddWithValue("@ID", model.ID);

                    try
                    {
                        cmd.ExecuteNonQuery();
                    }
                    catch (SqlException e)
                    {
                        dataAccessStatus.setValues(status: "Error", operationSucceeded: false, exceptionMessage: e.Message,
                                                   customMessage: "Unable to Delete The Payroll.",
                                                   helpLink: e.HelpLink, errorCode: e.ErrorCode, stackTrace: e.StackTrace);

                        throw new DataAccessException(e.Message, e.InnerException, dataAccessStatus);
                    }

                    //Confirm that the Payroll model has been deleted

                    try
                    {
                        RecordExistsCheck(cmd, model, TypeOfExistenceCheck.DoesNotExistInDB, RequestType.ConfirmDelete);
                    }
                    catch (DataAccessException e)
                    {
                        e.DataAccessStatusInfo.Status             = "Error";
                        e.DataAccessStatusInfo.OperationSucceeded = false;
                        e.DataAccessStatusInfo.CustomMessage      = "Failed to Delete The Payroll in Database";
                        e.DataAccessStatusInfo.ExceptionMessage   = string.Copy(e.Message);
                        e.DataAccessStatusInfo.StackTrace         = string.Copy(e.StackTrace);

                        throw e;
                    }
                }
                sqlConnection.Close();
            }
        }