private CS_EmployeeOffCallHistory SetOffCallInfo()
        {
            CS_EmployeeOffCallHistory offCall = null;
            if (_view.EmployeeId.HasValue)
            {
                offCall = new CS_EmployeeOffCallHistory();

                offCall.EmployeeID = _view.EmployeeId.Value;
                if (_view.ProxyEmployeeId.HasValue)
                    offCall.ProxyEmployeeID = _view.ProxyEmployeeId.Value;
                if (_view.OffCallStartDate.HasValue)
                    offCall.OffCallStartDate = _view.OffCallStartDate.Value;
                if (_view.OffCallEndDate.HasValue)
                    offCall.OffCallEndDate = _view.OffCallEndDate.Value;
                if (_view.OffCallReturnTime.HasValue)
                    offCall.OffCallReturnTime = _view.OffCallReturnTime.Value;
            }
            return offCall;
        }
        public void TestIfEmployeeIsBeingUpdated()
        {
            // Arrange
            FakeObjectSet<CS_Employee> fakeEmployeeList = new FakeObjectSet<CS_Employee>();
            FakeObjectSet<CS_CallCriteria> fakeCallCriteriaList = new FakeObjectSet<CS_CallCriteria>();
            FakeObjectSet<CS_CallCriteriaValue> fakeCallCriteriaValueList = new FakeObjectSet<CS_CallCriteriaValue>();
            FakeObjectSet<CS_EmployeeCoverage> fakeEmployeeCoverageList = new FakeObjectSet<CS_EmployeeCoverage>();
            FakeObjectSet<CS_EmployeeOffCallHistory> fakeEmployeeOffCallList = new FakeObjectSet<CS_EmployeeOffCallHistory>();
            FakeObjectSet<CS_Settings> fakeSettingsList = new FakeObjectSet<CS_Settings>();
            FakeObjectSet<CS_CallLog> fakeCallLogList = new FakeObjectSet<CS_CallLog>();
            FakeObjectSet<CS_CallLogResource> fakeCallLogResourceList = new FakeObjectSet<CS_CallLogResource>();
            FakeObjectSet<CS_Resource> fakeResourceList = new FakeObjectSet<CS_Resource>();
            FakeObjectSet<CS_PhoneNumber> fakePhoneList = new FakeObjectSet<CS_PhoneNumber>();

            fakeEmployeeList.AddObject(
                new CS_Employee()
                {
                    ID = 1,
                    Active = true,
                    HasAddressChanges = false,
                    HasPhoneChanges = false,
                }
            );
            fakeEmployeeList.AddObject(
                new CS_Employee()
                {
                    ID = 2,
                    Active = true,
                    HasAddressChanges = false,
                    HasPhoneChanges = false,
                }
            );
            fakeSettingsList.AddObject(
                new CS_Settings()
                {
                    ID = (int)Globals.Configuration.Settings.AddressChangeNotification,
                    Description = "*****@*****.**"
                }
            );

            Mock<IUnitOfWork> mockUnitOfWork = new Mock<IUnitOfWork>();
            mockUnitOfWork.Setup(w => w.CreateObjectSet<CS_Employee>()).Returns(fakeEmployeeList);
            mockUnitOfWork.Setup(w => w.CreateObjectSet<CS_CallCriteria>()).Returns(fakeCallCriteriaList);
            mockUnitOfWork.Setup(w => w.CreateObjectSet<CS_CallCriteriaValue>()).Returns(fakeCallCriteriaValueList);
            mockUnitOfWork.Setup(w => w.CreateObjectSet<CS_EmployeeCoverage>()).Returns(fakeEmployeeCoverageList);
            mockUnitOfWork.Setup(w => w.CreateObjectSet<CS_EmployeeOffCallHistory>()).Returns(fakeEmployeeOffCallList);
            mockUnitOfWork.Setup(w => w.CreateObjectSet<CS_Settings>()).Returns(fakeSettingsList);
            mockUnitOfWork.Setup(w => w.CreateObjectSet<CS_CallLog>()).Returns(fakeCallLogList);
            mockUnitOfWork.Setup(w => w.CreateObjectSet<CS_CallLogResource>()).Returns(fakeCallLogResourceList);
            mockUnitOfWork.Setup(w => w.CreateObjectSet<CS_Resource>()).Returns(fakeResourceList);
            mockUnitOfWork.Setup(w => w.CreateObjectSet<CS_PhoneNumber>()).Returns(fakePhoneList);

            CS_Employee updateEmployee = new CS_Employee()
            {
                ID = 1,
                Address = "Testing Address"
            };

            CS_CallCriteria callCriteria = new CS_CallCriteria()
            {
                EmployeeID = 1,
                Active = true
            };

            IList<CS_CallCriteriaValue> callCriteriaValueList = new List<CS_CallCriteriaValue>();
            callCriteriaValueList.Add(new CS_CallCriteriaValue()
            {
                CallCriteriaTypeID = 1,
                Value = "testing",
                Active = true

            });

            CS_EmployeeCoverage coverage = new CS_EmployeeCoverage()
            {
                EmployeeID = 1,
                Active = true,
                CoverageStartDate = new DateTime(2011, 8, 29),
                Duration = 10,
                DivisionID = 1,
                CS_Employee = new CS_Employee() { ID = 1, Active = true, FullName = "Santos, Kleiton" },
                CS_Division = new CS_Division() { ID = 1, Active = true, Name = "001" }
            };

            CS_EmployeeOffCallHistory offCall = new CS_EmployeeOffCallHistory()
            {
                EmployeeID = 1,
                ProxyEmployeeID = 2,
                Active = true,
                OffCallStartDate = new DateTime(2011, 8, 29),
                OffCallEndDate = new DateTime(2011, 8, 31),
                OffCallReturnTime = new TimeSpan(10, 0, 0),
                CS_Employee = new CS_Employee() { ID = 1, Active = true, FullName = "Santos, Kleiton" },
                CS_Employee_Proxy = new CS_Employee() { ID = 2, Active = true, FullName = "Burton, Cynthia" }
            };

            // Act
            EmployeeModel model = new EmployeeModel(mockUnitOfWork.Object);
            model.SaveEmployee(updateEmployee, offCall, coverage, "system", true, true, new List<DataContext.VO.PhoneNumberVO>());

            // Assert
            Assert.AreEqual(1, fakeCallCriteriaList.Count());
            Assert.AreEqual(1, fakeCallCriteriaValueList.Count());
            Assert.AreEqual(1, fakeEmployeeOffCallList.Count());
            Assert.AreEqual(1, fakeEmployeeCoverageList.Count());
        }
        /// <summary>
        /// Saves the Employee Profile Maintenance
        /// </summary>
        /// <param name="employee">Employee Info</param>
        /// <param name="saveCriteria">Call Criteria Info</param>
        /// <param name="saveCriteriaValueList">New Call Criteria Value Info</param>
        /// <param name="offCall">Off Call Info</param>
        /// <param name="coverage">Coverage Info</param>
        /// <param name="username">Username</param>
        /// <param name="isCoverage">Indicates if the employee is in Coverage</param>
        /// <param name="isOffCall">Indicates if the employee is in Off Call</param>
        public void SaveEmployee(CS_Employee employee, CS_EmployeeOffCallHistory offCall, CS_EmployeeCoverage coverage, string username, bool isCoverage, bool isOffCall, List<PhoneNumberVO> additionalPhoneNumbersList)
        {
            using (TransactionScope scope = new TransactionScope())
            {
                DateTime saveDate = DateTime.Now;
                CS_Employee oldEmployee = _employeeRepository.Get(e => e.ID == employee.ID);

                try
                {
                    // Update Employee Table
                    bool hasAddressChanges = false;
                    bool hasPhoneChanges = false;
                    if (null != oldEmployee)
                    {
                        // Saving Employee Info
                        if (IsNull(oldEmployee.Address) != IsNull(employee.Address))
                        {
                            oldEmployee.Address = employee.Address;
                            hasAddressChanges = true;
                        }
                        if (IsNull(oldEmployee.City) != IsNull(employee.City))
                        {
                            oldEmployee.City = employee.City;
                            hasAddressChanges = true;
                        }
                        if (IsNull(oldEmployee.StateProvinceCode) != IsNull(employee.StateProvinceCode))
                        {
                            oldEmployee.StateProvinceCode = employee.StateProvinceCode;
                            hasAddressChanges = true;
                        }
                        if (IsNull(oldEmployee.CountryCode) != IsNull(employee.CountryCode))
                        {
                            oldEmployee.CountryCode = employee.CountryCode;
                            hasAddressChanges = true;
                        }
                        if (IsNull(oldEmployee.Address2) != IsNull(employee.Address2))
                        {
                            oldEmployee.Address2 = employee.Address2;
                            hasAddressChanges = true;
                        }
                        if (IsNull(oldEmployee.PostalCode) != IsNull(employee.PostalCode))
                        {
                            oldEmployee.PostalCode = employee.PostalCode;
                            hasAddressChanges = true;
                        }
                        if (IsNull(oldEmployee.DayAreaCode) != IsNull(employee.DayAreaCode))
                        {
                            oldEmployee.DayAreaCode = employee.DayAreaCode;
                            hasPhoneChanges = true;
                        }
                        if (IsNull(oldEmployee.DayPhone) != IsNull(employee.DayPhone))
                        {
                            oldEmployee.DayPhone = employee.DayPhone;
                            hasPhoneChanges = true;
                        }
                        if (IsNull(oldEmployee.HomeAreaCode) != IsNull(employee.HomeAreaCode))
                        {
                            oldEmployee.HomeAreaCode = employee.HomeAreaCode;
                            hasPhoneChanges = true;
                        }
                        if (IsNull(oldEmployee.HomePhone) != IsNull(employee.HomePhone))
                        {
                            oldEmployee.HomePhone = employee.HomePhone;
                            hasPhoneChanges = true;
                        }
                        if (IsNull(oldEmployee.FaxAreaCode) != IsNull(employee.FaxAreaCode))
                        {
                            oldEmployee.FaxAreaCode = employee.FaxAreaCode;
                            hasPhoneChanges = true;
                        }
                        if (IsNull(oldEmployee.FaxPhone) != IsNull(employee.FaxPhone))
                        {
                            oldEmployee.FaxPhone = employee.FaxPhone;
                            hasPhoneChanges = true;
                        }
                        if (IsNull(oldEmployee.MobileAreaCode) != IsNull(employee.MobileAreaCode))
                        {
                            oldEmployee.MobileAreaCode = employee.MobileAreaCode;
                            hasPhoneChanges = true;
                        }
                        if (IsNull(oldEmployee.MobilePhone) != IsNull(employee.MobilePhone))
                        {
                            oldEmployee.MobilePhone = employee.MobilePhone;
                            hasPhoneChanges = true;
                        }
                        if (IsNull(oldEmployee.OtherPhoneAreaCode) != IsNull(employee.OtherPhoneAreaCode))
                        {
                            oldEmployee.OtherPhoneAreaCode = employee.OtherPhoneAreaCode;
                            hasPhoneChanges = true;
                        }
                        if (IsNull(oldEmployee.OtherPhone) != IsNull(employee.OtherPhone))
                        {
                            oldEmployee.OtherPhone = employee.OtherPhone;
                            hasPhoneChanges = true;
                        }

                        if (hasAddressChanges)
                            oldEmployee.HasAddressChanges = hasAddressChanges;

                        if (hasPhoneChanges)
                            oldEmployee.HasPhoneChanges = hasPhoneChanges;

                        oldEmployee.ModifiedBy = username;
                        oldEmployee.ModificationDate = saveDate;
                        //employee.ModificationID = null;
                        oldEmployee.IsKeyPerson = employee.IsKeyPerson;
                        oldEmployee.IsDentonPersonal = employee.IsDentonPersonal;
                        CS_Employee employeeToUpdate = new CS_Employee();
                        employeeToUpdate = oldEmployee;

                        _employeeRepository.Update(employeeToUpdate);
                    }
                }
                catch (Exception ex)
                {
                    Logger.Write(string.Format("An error occured while trying to updating Employee information.\n{0}\n{1}", ex, ex.InnerException));
                    throw new Exception("Error while updating Employee information", ex);
                }

                try
                {
                    // Send Email to Pam And Curry
                    if (null != oldEmployee)
                        if (oldEmployee.HasAddressChanges)
                            SendNotificationForAddressChange(oldEmployee);
                }
                catch (Exception ex)
                {
                    Logger.Write(string.Format("An error occured while trying to Send the email update for Address Change.\n{0}\n{1}", ex, ex.InnerException));
                    throw new Exception("Error while notifying Address changes", ex);
                }

                try
                {
                    //Send Email to Pam
                    if (null != oldEmployee)
                        if (oldEmployee.HasPhoneChanges)
                            SendNotificationForContactPhoneChange(oldEmployee);
                }
                catch (Exception ex)
                {
                    Logger.Write(string.Format("An error occured while trying to Send the email update for Phone Change.\n{0}\n{1}", ex, ex.InnerException));
                    throw new Exception("Error while notifying Phone changes", ex);
                }

                try
                {
                    // Update Off Call
                    if (offCall != null)
                    {
                        CS_EmployeeOffCallHistory oldOffCall = _employeeOffCallRepository.Get(e => e.EmployeeID == offCall.EmployeeID && e.Active);
                        if (oldOffCall == null)
                        {
                            offCall.Active = true;
                            offCall.CreatedBy = username;
                            offCall.CreationDate = saveDate;
                            //offCall.CreationID = null;
                            offCall.ModifiedBy = username;
                            offCall.ModificationDate = saveDate;
                            //offCall.ModificationID = null;

                            if (isOffCall)
                            {
                                _employeeOffCallRepository.Add(offCall);
                                _callLogModel.GenerateOffCalCallLog(offCall);
                            }
                        }
                        else
                        {
                            oldOffCall.EmployeeID = offCall.EmployeeID;
                            oldOffCall.ProxyEmployeeID = offCall.ProxyEmployeeID;
                            oldOffCall.OffCallStartDate = offCall.OffCallStartDate;
                            oldOffCall.OffCallEndDate = offCall.OffCallEndDate;
                            oldOffCall.OffCallReturnTime = offCall.OffCallReturnTime;
                            oldOffCall.Active = isOffCall;
                            oldOffCall.ModifiedBy = username;
                            oldOffCall.ModificationDate = saveDate;
                            //oldOffCall.ModificationID = null;

                            _employeeOffCallRepository.Update(oldOffCall);
                        }
                    }
                }
                catch (Exception ex)
                {
                    Logger.Write(string.Format("An error occured while trying to Update Off Call Information.\n{0}\n{1}", ex, ex.InnerException));
                    throw new Exception("Error while updating Off Call information", ex);
                }

                try
                {
                    // Update Coverage
                    if (coverage != null)
                    {

                        CS_EmployeeCoverage oldCoverage = _employeeCoverageRepository.Get(e => e.EmployeeID == coverage.EmployeeID && e.Active);
                        if (oldCoverage == null)
                        {
                            coverage.Active = true;
                            coverage.CreatedBy = username;
                            coverage.CreationDate = saveDate;
                            //coverage.CreationID = null;
                            coverage.ModifiedBy = username;
                            coverage.ModificationDate = saveDate;
                            //coverage.ModificationID = null;

                            if (isCoverage)
                            {
                                int? jobId = this.GetJobIdFromResource(coverage.EmployeeID);

                                if (jobId.HasValue)
                                {
                                    JobModel jobModel = new JobModel(_unitOfWork);
                                    jobModel.AddDivisionToJob(coverage.DivisionID, jobId.Value, username);
                                }

                                _employeeCoverageRepository.Add(coverage);
                                _callLogModel.GenerateEmployeeCoverageCalCallLog(coverage);
                            }
                        }
                        else
                        {
                            oldCoverage.EmployeeID = coverage.EmployeeID;
                            oldCoverage.DivisionID = coverage.DivisionID;
                            oldCoverage.Duration = coverage.Duration;
                            oldCoverage.CoverageStartDate = coverage.CoverageStartDate;
                            oldCoverage.CoverageEndDate = coverage.CoverageEndDate;
                            oldCoverage.Active = isCoverage;
                            oldCoverage.ModifiedBy = username;
                            offCall.ModificationDate = saveDate;
                            //oldCoverage.ModificationID = null;

                            _employeeCoverageRepository.Update(oldCoverage);
                        }
                    }
                }
                catch (Exception ex)
                {
                    Logger.Write(string.Format("An error occured while trying to Update Off Call Information.\n{0}\n{1}", ex, ex.InnerException));
                    throw new Exception("Error while updating Off Call information", ex);
                }

                try
                {
                    if (null != oldEmployee)
                    {
                        List<CS_PhoneNumber> oldPhoneList = ListAllPhonesByEmployee(oldEmployee.ID);
                        List<CS_PhoneNumber> newPhoneList = GetListFromPhoneVO(additionalPhoneNumbersList);

                        List<CS_PhoneNumber> removedPhoneList = oldPhoneList.Where(e => !newPhoneList.Any(f => f.ID == e.ID)).ToList();
                        List<CS_PhoneNumber> addedPhoneList = newPhoneList.Where(e => e.ID == 0).ToList();

                        for (int i = 0; i < removedPhoneList.Count; i++)
                        {
                            removedPhoneList[i].ModifiedBy = username;
                            removedPhoneList[i].ModificationDate = saveDate;
                            removedPhoneList[i].Active = false;
                        }

                        for (int i = 0; i < addedPhoneList.Count; i++)
                        {
                            addedPhoneList[i].EmployeeID = oldEmployee.ID;
                            addedPhoneList[i].CreatedBy = username;
                            addedPhoneList[i].CreationDate = saveDate;
                            //addedPhoneList[i].CreationID =
                            addedPhoneList[i].ModifiedBy = username;
                            addedPhoneList[i].ModificationDate = saveDate;
                            //addedPhoneList[i].ModificationID =
                            addedPhoneList[i].Active = true;
                        }

                        _phoneNumberRepository.UpdateList(removedPhoneList);
                        _phoneNumberRepository.AddList(addedPhoneList);
                    }
                }
                catch (Exception ex)
                {
                    Logger.Write(string.Format("An error occured while trying to Update Additional Contact Information.\n{0}\n{1}", ex, ex.InnerException));
                    throw new Exception("Error while updating Additional Contact Information", ex);
                }

                scope.Complete();
            }
        }