/// <summary>
        /// Data the formatting and validations.
        /// </summary>
        /// <param name="uploadFile">The upload file.</param>
        /// <param name="presenter">The presenter.</param>
        /// <returns>
        /// Import Details for Data provided.
        /// </returns>
        private async Task<PortManningPresenter> DataFormattingAndValidations(HttpPostedFileBase uploadFile, PortManningPresenter presenter)
        {
            IExcelDataReader excelReader = null;
            var importedFileData = new ImportDetails();
            try
            {
                if (uploadFile.FileName.EndsWith(ExcelLatestExtension, StringComparison.OrdinalIgnoreCase))
                {
                    excelReader = ExcelReaderFactory.CreateOpenXmlReader(uploadFile.InputStream);
                }
                else if (uploadFile.FileName.EndsWith(ExcelNormalExtension, StringComparison.OrdinalIgnoreCase))
                {
                    excelReader = ExcelReaderFactory.CreateBinaryReader(uploadFile.InputStream);
                }

                if (excelReader != null)
                {
                    using (var result = excelReader.AsDataSet())
                    {
                        result.Locale = CultureInfo.CurrentCulture;
                        var importManningDetail = await this.manager.ImportPortManning(result, importedFileData, SessionData.Instance.MasterData.Ship.ShipId, SessionData.Instance.MasterData.CrewDepartments);

                        if (importManningDetail.Items.Count > 0)
                        {
                            presenter.AssignInPortManningList(importManningDetail);
                        }
                        else
                        {
                            presenter.IsImportFailed = true;
                            presenter.ImportException = string.Format(CultureInfo.CurrentCulture, "{0}{1}.", Resource.ShipNameNotCorrect, SessionData.Instance.MasterData.Ship.Name);
                        }

                        excelReader.Close();
                    }
                }
            }
            catch (Exception ex)
            {
                if (!string.IsNullOrEmpty(ex.Message))
                {
                    presenter.IsImportFailed = true;
                    presenter.ImportException = Resource.ImportSpreadsheetException;
                }
            }
            finally
            {
                if (excelReader != null)
                {
                    excelReader.Dispose();
                }
            }

            return presenter;
        }
 /// <summary>
 /// Indexes this instance.
 /// </summary>
 /// <returns>
 /// The View for Port Manning.
 /// </returns>
 public async Task<ActionResult> Index()
 {
     var portManningDetail = await this.manager.RetrievePortManningDetail(new SearchFilters { ShipId = SessionData.Instance.MasterData.Ship.ShipId, DepartmentIds = string.Empty, Parts = PartsConstant, MaxResult = ApplicationSettings.MaxPageSize, PageNumber = 1 });
     var presenter = new PortManningPresenter();
     SessionData.Instance.AssignInPortManningList(portManningDetail);
     presenter.AssignInPortManningList(portManningDetail);
     return this.View(presenter);
 }
 /// <summary>
 /// Assigning the selected port.
 /// </summary>
 /// <param name="presenter">The presenter.</param>
 private static void AssigningSelectedPort(PortManningPresenter presenter)
 {
     var voyages = SessionData.Instance.MasterData.Voyages.FirstOrDefault(c => c.VoyageId == presenter.VoyageId);
     presenter.SelectedPort = voyages != null ? voyages.Itineraries.FirstOrDefault(portItem => portItem.VoyageItineraryId == presenter.VoyageItineraryId) : new Itinerary();
 }
        public async Task<ActionResult> ImportPortManning(HttpPostedFileBase uploadFile)
        {
            var presenter = new PortManningPresenter();
            if (uploadFile != null && uploadFile.ContentLength > 0)
            {
                presenter = await this.DataFormattingAndValidations(uploadFile, presenter);
            }

            return this.View(presenter);
        }
        /// <summary>
        /// Un-assign crew.
        /// </summary>
        /// <param name="safetyPositionId">The safety position identifier.</param>
        /// <param name="pageNumber">The page number.</param>
        /// <param name="presenter">The presenter.</param>
        /// <returns>
        /// UN assigning Crew
        /// </returns>
        public async Task<ActionResult> UnAssignCrew(string safetyPositionId, string pageNumber, PortManningPresenter presenter)
        {
            AssigningSelectedPort(presenter);
            await this.manager.UnAssignCrew(SessionData.Instance.MasterData.Ship.ShipId, safetyPositionId, presenter.SelectedPort.PortId, presenter.SelectedPort.ArrivalTime.HasValue ? presenter.SelectedPort.ArrivalTime.Value.ToString(ArrivalTimeFormat, CultureInfo.InvariantCulture) : DateTime.Now.ToString(ArrivalTimeFormat, CultureInfo.InvariantCulture));
            if (!string.IsNullOrEmpty(pageNumber) && !pageNumber.Equals(UndefinedConstant))
            {
                var departments = !string.IsNullOrEmpty(presenter.DepartmentIds) ? presenter.DepartmentIds.Split(',').ToList() : new List<string>();
                var pagingPageNumber = Convert.ToInt32(pageNumber) > 0 ? Convert.ToInt32(pageNumber) / ApplicationSettings.MaxPageSize : 1;
                var portManningDetail = await this.manager.RetrievePortManningDetail(new SearchFilters { ShipId = SessionData.Instance.MasterData.Ship.ShipId, DepartmentIds = departments.Count < SessionData.Instance.MasterData.CrewDepartments.Count ? presenter.DepartmentIds : string.Empty, Parts = PartsConstant, MaxResult = ApplicationSettings.MaxPageSize, PageNumber = pagingPageNumber > 0 ? pagingPageNumber : 1, PortId = presenter.SelectedPort != null ? presenter.SelectedPort.PortId : string.Empty, PortArrivalDate = presenter.SelectedPort != null && presenter.SelectedPort.ArrivalTime.HasValue ? presenter.SelectedPort.ArrivalTime.Value.ToString(ArrivalTimeFormat, CultureInfo.InvariantCulture) : DateTime.Now.ToString(ArrivalTimeFormat, CultureInfo.InvariantCulture) });
                SessionData.Instance.AssignInPortManningList(portManningDetail);
                presenter.AssignInPortManningList(portManningDetail);
            }

            return this.PartialView(PortManningListPartialView, presenter);
        }
        /// <summary>
        /// Assigns the crew.
        /// </summary>
        /// <param name="crewId">The crew identifier.</param>
        /// <param name="positionNumber">The position number.</param>
        /// <param name="pageNumber">The page number.</param>
        /// <param name="presenter">The presenter.</param>
        /// <returns>
        /// The Action Result.
        /// </returns>
        public async Task<ActionResult> AssignCrew(string crewId, string positionNumber, string pageNumber, PortManningPresenter presenter)
        {
            var portManning = SessionData.Instance.PortManningDetails.Items.FirstOrDefault(pmItem => pmItem.PositionNumber == positionNumber);
            var portPosition = portManning != null ? portManning.PortManningPosition.FirstOrDefault(ppItem => ppItem.EmployeeNo == crewId) : new PortManningPosition();
            AssigningSelectedPort(presenter);
            await this.manager.AssignCrew(SessionData.Instance.MasterData.Ship.ShipId, presenter.SelectedPort != null ? presenter.SelectedPort.PortId : string.Empty, new PortManning { PortArrivalDate = presenter.SelectedPort != null && presenter.SelectedPort.ArrivalTime.HasValue ? presenter.SelectedPort.ArrivalTime.Value : DateTime.Now, SafetyRoleId = portPosition != null ? portPosition.SafetyRoleId : string.Empty, IPMPositionId = portManning != null ? portManning.IPMPositionId : string.Empty });
            if (!string.IsNullOrEmpty(pageNumber) && !pageNumber.Equals(UndefinedConstant))
            {
                var departments = !string.IsNullOrEmpty(presenter.DepartmentIds) ? presenter.DepartmentIds.Split(',').ToList() : null;
                var pagingPageNumber = Convert.ToInt32(pageNumber) > 0 ? Convert.ToInt32(pageNumber) / ApplicationSettings.MaxPageSize : 1;
                var portManningDetail = await this.manager.RetrievePortManningDetail(new SearchFilters { ShipId = SessionData.Instance.MasterData.Ship.ShipId, DepartmentIds = departments != null && departments.Count < SessionData.Instance.MasterData.CrewDepartments.Count ? presenter.DepartmentIds : string.Empty, Parts = PartsConstant, MaxResult = ApplicationSettings.MaxPageSize, PageNumber = pagingPageNumber > 0 ? pagingPageNumber : 1, PortId = presenter.SelectedPort != null ? presenter.SelectedPort.PortId : string.Empty, PortArrivalDate = presenter.SelectedPort != null && presenter.SelectedPort.ArrivalTime.HasValue ? presenter.SelectedPort.ArrivalTime.Value.ToString(ArrivalTimeFormat, CultureInfo.InvariantCulture) : DateTime.Now.ToString(ArrivalTimeFormat, CultureInfo.InvariantCulture) });
                SessionData.Instance.AssignInPortManningList(portManningDetail);
                presenter.AssignInPortManningList(portManningDetail);
            }

            return this.PartialView(PortManningListPartialView, presenter);
        }
        public async Task<ActionResult> Index(PortManningPresenter presenter)
        {
            if (presenter != null)
            {
                var departments = !string.IsNullOrEmpty(presenter.DepartmentIds) ? presenter.DepartmentIds.Split(',').ToList() : null;
                AssigningSelectedPort(presenter);
                var portManningDetail = await this.manager.RetrievePortManningDetail(new SearchFilters { ShipId = SessionData.Instance.MasterData.Ship.ShipId, DepartmentIds = departments != null && departments.Count < SessionData.Instance.MasterData.CrewDepartments.Count ? presenter.DepartmentIds : string.Empty, Parts = PartsConstant, MaxResult = ApplicationSettings.MaxPageSize, PageNumber = 1, PortId = presenter.SelectedPort != null ? presenter.SelectedPort.PortId : string.Empty, PortArrivalDate = presenter.SelectedPort != null && presenter.SelectedPort.ArrivalTime.HasValue ? presenter.SelectedPort.ArrivalTime.Value.ToString(ArrivalTimeFormat, CultureInfo.InvariantCulture) : DateTime.Now.ToString(ArrivalTimeFormat, CultureInfo.InvariantCulture) });
                SessionData.Instance.AssignInPortManningList(portManningDetail);
                presenter.AssignInPortManningList(portManningDetail);
            }

            return this.PartialView(PortManningListPartialView, presenter);
        }