public async Task <IActionResult> UpdateEmployee(EmployeeViewModel evm)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest("Not a valid model"));
            }

            if (evm == null)
            {
                return(BadRequest("Object cannot be null"));
            }

            if (empContext.EmployeeExists(evm.EmployeeId) == false)
            {
                return(NotFound("Employee Not Found"));
            }

            // CONVERT CustomerModel TO Customer
            Employee emp = evm.ConvertToEmployee();

            if (await empContext.UpdateEmployeeAsync(emp) == true)
            {
                return(Ok("Employee Updated"));
            }
            else
            {
                return(StatusCode(StatusCodes.Status500InternalServerError, "Failed due to some problem at backend."));
            }
        }
        public async Task <IActionResult> PostNewEmployee(EmployeeViewModel evm)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest("Not a valid model"));
            }

            // CONVERT EmployeeViewModel TO Employee
            Employee emp = evm.ConvertToEmployee();

            if (await empContext.AddEmployeeAsync(emp) == true)
            {
                return(CreatedAtAction("PostNewCustomer", "Created"));
            }
            else
            {
                return(StatusCode(StatusCodes.Status500InternalServerError, "Failed due to some problem at backend."));
            }
        }
        public EmployeeResponse Create(EmployeeViewModel Employee)
        {
            EmployeeResponse response = new EmployeeResponse();

            try
            {
                //Backup items
                List <EmployeeCardViewModel> employeeCards = Employee
                                                             .EmployeeCards?.ToList() ?? new List <EmployeeCardViewModel>();
                Employee.EmployeeCards = null;

                List <EmployeeDocumentViewModel> employeeDocuments = Employee
                                                                     .EmployeeDocuments?.ToList() ?? new List <EmployeeDocumentViewModel>();
                Employee.EmployeeDocuments = null;

                List <EmployeeItemViewModel> employeeItems = Employee
                                                             .EmployeeItems?.ToList() ?? new List <EmployeeItemViewModel>();
                Employee.EmployeeItems = null;

                List <EmployeeLicenceItemViewModel> employeeLicences = Employee
                                                                       .EmployeeLicences?.ToList() ?? new List <EmployeeLicenceItemViewModel>();
                Employee.EmployeeLicences = null;

                List <EmployeeNoteViewModel> employeeNotes = Employee
                                                             .EmployeeNotes?.ToList() ?? new List <EmployeeNoteViewModel>();
                Employee.EmployeeNotes = null;

                List <EmployeeProfessionItemViewModel> employeeProfessions = Employee
                                                                             .EmployeeProfessions?.ToList() ?? new List <EmployeeProfessionItemViewModel>();
                Employee.EmployeeProfessions = null;

                Employee createdEmployee = unitOfWork.GetEmployeeRepository()
                                           .Create(Employee.ConvertToEmployee());

                // Update items
                if (employeeCards != null && employeeCards.Count > 0)
                {
                    foreach (EmployeeCardViewModel item in employeeCards
                             .Where(x => x.ItemStatus == ItemStatus.Added || x.ItemStatus == ItemStatus.Edited)?.ToList() ?? new List <EmployeeCardViewModel>())
                    {
                        item.Employee = new EmployeeViewModel()
                        {
                            Id = createdEmployee.Id
                        };
                        item.ItemStatus = ItemStatus.Submited;
                        var createdItem = unitOfWork.GetEmployeeCardRepository().Create(item.ConvertToEmployeeCard());
                    }

                    foreach (EmployeeCardViewModel item in employeeCards
                             .Where(x => x.ItemStatus == ItemStatus.Deleted)?.ToList() ?? new List <EmployeeCardViewModel>())
                    {
                        item.Employee = new EmployeeViewModel()
                        {
                            Id = createdEmployee.Id
                        };
                        unitOfWork.GetEmployeeCardRepository().Create(item.ConvertToEmployeeCard());

                        unitOfWork.GetEmployeeCardRepository().Delete(item.Identifier);
                    }
                }

                // Update items
                if (employeeDocuments != null && employeeDocuments.Count > 0)
                {
                    foreach (EmployeeDocumentViewModel item in employeeDocuments
                             .Where(x => x.ItemStatus == ItemStatus.Added || x.ItemStatus == ItemStatus.Edited)?.ToList() ?? new List <EmployeeDocumentViewModel>())
                    {
                        item.Employee = new EmployeeViewModel()
                        {
                            Id = createdEmployee.Id
                        };
                        item.ItemStatus = ItemStatus.Submited;
                        var createdItem = unitOfWork.GetEmployeeDocumentRepository().Create(item.ConvertToEmployeeDocument());
                    }

                    foreach (EmployeeDocumentViewModel item in employeeDocuments
                             .Where(x => x.ItemStatus == ItemStatus.Deleted)?.ToList() ?? new List <EmployeeDocumentViewModel>())
                    {
                        item.Employee = new EmployeeViewModel()
                        {
                            Id = createdEmployee.Id
                        };
                        unitOfWork.GetEmployeeDocumentRepository().Create(item.ConvertToEmployeeDocument());

                        unitOfWork.GetEmployeeDocumentRepository().Delete(item.Identifier);
                    }
                }

                // Update items
                if (employeeItems != null && employeeItems.Count > 0)
                {
                    foreach (EmployeeItemViewModel item in employeeItems
                             .Where(x => x.ItemStatus == ItemStatus.Added || x.ItemStatus == ItemStatus.Edited)?.ToList() ?? new List <EmployeeItemViewModel>())
                    {
                        item.Employee = new EmployeeViewModel()
                        {
                            Id = createdEmployee.Id
                        };
                        item.ItemStatus = ItemStatus.Submited;
                        var createdItem = unitOfWork.GetEmployeeItemRepository().Create(item.ConvertToEmployeeItem());
                    }

                    foreach (EmployeeItemViewModel item in employeeItems
                             .Where(x => x.ItemStatus == ItemStatus.Deleted)?.ToList() ?? new List <EmployeeItemViewModel>())
                    {
                        item.Employee = new EmployeeViewModel()
                        {
                            Id = createdEmployee.Id
                        };
                        unitOfWork.GetEmployeeItemRepository().Create(item.ConvertToEmployeeItem());

                        unitOfWork.GetEmployeeItemRepository().Delete(item.Identifier);
                    }
                }

                // Update items
                if (employeeLicences != null && employeeLicences.Count > 0)
                {
                    foreach (EmployeeLicenceItemViewModel item in employeeLicences
                             .Where(x => x.ItemStatus == ItemStatus.Added || x.ItemStatus == ItemStatus.Edited)?.ToList() ?? new List <EmployeeLicenceItemViewModel>())
                    {
                        item.Employee = new EmployeeViewModel()
                        {
                            Id = createdEmployee.Id
                        };
                        item.ItemStatus = ItemStatus.Submited;
                        var createdItem = unitOfWork.GetEmployeeLicenceRepository().Create(item.ConvertToEmployeeLicence());
                    }

                    foreach (EmployeeLicenceItemViewModel item in employeeLicences
                             .Where(x => x.ItemStatus == ItemStatus.Deleted)?.ToList() ?? new List <EmployeeLicenceItemViewModel>())
                    {
                        item.Employee = new EmployeeViewModel()
                        {
                            Id = createdEmployee.Id
                        };
                        unitOfWork.GetEmployeeLicenceRepository().Create(item.ConvertToEmployeeLicence());

                        unitOfWork.GetEmployeeLicenceRepository().Delete(item.Identifier);
                    }
                }

                // Update items
                if (employeeNotes != null && employeeNotes.Count > 0)
                {
                    foreach (EmployeeNoteViewModel item in employeeNotes
                             .Where(x => x.ItemStatus == ItemStatus.Added || x.ItemStatus == ItemStatus.Edited)?.ToList() ?? new List <EmployeeNoteViewModel>())
                    {
                        item.Employee = new EmployeeViewModel()
                        {
                            Id = createdEmployee.Id
                        };
                        item.ItemStatus = ItemStatus.Submited;
                        var createdItem = unitOfWork.GetEmployeeNoteRepository().Create(item.ConvertToEmployeeNote());
                    }

                    foreach (EmployeeNoteViewModel item in employeeNotes
                             .Where(x => x.ItemStatus == ItemStatus.Deleted)?.ToList() ?? new List <EmployeeNoteViewModel>())
                    {
                        item.Employee = new EmployeeViewModel()
                        {
                            Id = createdEmployee.Id
                        };
                        unitOfWork.GetEmployeeNoteRepository().Create(item.ConvertToEmployeeNote());

                        unitOfWork.GetEmployeeNoteRepository().Delete(item.Identifier);
                    }
                }

                // Update items
                if (employeeProfessions != null && employeeProfessions.Count > 0)
                {
                    foreach (EmployeeProfessionItemViewModel item in employeeProfessions
                             .Where(x => x.ItemStatus == ItemStatus.Added || x.ItemStatus == ItemStatus.Edited)?.ToList() ?? new List <EmployeeProfessionItemViewModel>())
                    {
                        item.Employee = new EmployeeViewModel()
                        {
                            Id = createdEmployee.Id
                        };
                        item.ItemStatus = ItemStatus.Submited;
                        var createdItem = unitOfWork.GetEmployeeProfessionRepository().Create(item.ConvertToEmployeeProfession());
                    }

                    foreach (EmployeeProfessionItemViewModel item in employeeProfessions
                             .Where(x => x.ItemStatus == ItemStatus.Deleted)?.ToList() ?? new List <EmployeeProfessionItemViewModel>())
                    {
                        item.Employee = new EmployeeViewModel()
                        {
                            Id = createdEmployee.Id
                        };
                        unitOfWork.GetEmployeeProfessionRepository().Create(item.ConvertToEmployeeProfession());

                        unitOfWork.GetEmployeeProfessionRepository().Delete(item.Identifier);
                    }
                }

                unitOfWork.Save();

                response.Employee = createdEmployee.ConvertToEmployeeViewModel();
                response.Success  = true;
            }
            catch (Exception ex)
            {
                response.Employee = new EmployeeViewModel();
                response.Success  = false;
                response.Message  = ex.Message;
            }

            return(response);
        }