/// <summary>
        /// A controller method to redirect to a page showing the details relating to
        /// a staging dataset. This takes the dataset database ID as a parameter and
        /// utilises the data access classes to get the data back
        ///
        /// This is accessed via /Staging/DatasetDetail
        /// </summary>
        /// <param name="datasetID"></param>
        /// <returns></returns>
        public ActionResult DatasetDetails(int datasetID)
        {
            StagingDataAccess dataAccess = new StagingDataAccess();

            StagingDetailModel model = dataAccess.getStagingDetails(datasetID);

            List <Breadcrumb> trail = new List <Breadcrumb>();

            trail.Add(new Breadcrumb()
            {
                LinkText = "Home", Action = "Index", Controller = "Home", isCurrent = false
            });
            trail.Add(new Breadcrumb()
            {
                LinkText = "Staging Index", Action = "Index", Controller = "Staging", isCurrent = false
            });
            trail.Add(new Breadcrumb()
            {
                LinkText = "Staging Dataset Details", isCurrent = true
            });

            model.Breadcrumbs = trail;

            return(View(model));
        }
        public ActionResult CreateStaging(GeneralStagingModel model)
        {
            StagingDataAccess dataAccess = new StagingDataAccess();

            if (!dataAccess.isCreateStagingModelValid(model))
            {
                ModelState.AddModelError("TableName", "The Staging Table Name must be unique");

                List <Breadcrumb> trail = new List <Breadcrumb>();

                trail.Add(new Breadcrumb()
                {
                    LinkText = "Home", Action = "Index", Controller = "Home", isCurrent = false
                });
                trail.Add(new Breadcrumb()
                {
                    LinkText = "Staging Index", Action = "Index", Controller = "Staging", isCurrent = false
                });
                trail.Add(new Breadcrumb()
                {
                    LinkText = "Create Staging", isCurrent = true
                });

                model.Breadcrumbs = trail;

                return(View(model));
            }

            try
            {
                dataAccess.createStagingTable(model);
            }
            catch (SqlException)
            {
                ModelState.AddModelError("", "An error occured when creating the Staging Table. Please ensure that the staging table name is unique and that all columns within it are uniquely named");

                List <Breadcrumb> trail = new List <Breadcrumb>();

                trail.Add(new Breadcrumb()
                {
                    LinkText = "Home", Action = "Index", Controller = "Home", isCurrent = false
                });
                trail.Add(new Breadcrumb()
                {
                    LinkText = "Staging Index", Action = "Index", Controller = "Staging", isCurrent = false
                });
                trail.Add(new Breadcrumb()
                {
                    LinkText = "Create Staging", isCurrent = true
                });

                model.Breadcrumbs = trail;

                return(View(model));
            }

            TempData["SuccessMessage"] = String.Format("The Staging Table - {0}, was successfully created", model.TableName);
            return(RedirectToAction("Index"));
        }
        public ActionResult UploadToStaging(UploadStagingModel model)
        {
            if (ModelState.IsValid)
            {
                if (model.attachment.ContentLength > 0)
                {
                    string fileName = Path.GetFileName(model.attachment.FileName);
                    string path     = Path.Combine(Server.MapPath("~/App_Data/CSVUploads"), fileName);

                    Data_Loading_Tool.Database.FileAccess fileAccess = new Data_Loading_Tool.Database.FileAccess();

                    fileAccess.writeCSVtoDisk(model, path);

                    StagingDataAccess dataAccess = new StagingDataAccess();

                    dataAccess.updateTableFromCSV(path, model.StagingTableID, model.UniqueUploadRef, model.UnpivotData, model.FirstUpload, model.GeographyColumn);

                    TempData["SuccessMessage"] = "The Data was uploaded successfully";
                    return(RedirectToAction("Index"));
                }
            }

            List <Breadcrumb> trail = new List <Breadcrumb>();

            trail.Add(new Breadcrumb()
            {
                LinkText = "Home", Action = "Index", Controller = "Home", isCurrent = false
            });
            trail.Add(new Breadcrumb()
            {
                LinkText = "Staging Index", Action = "Index", Controller = "Staging", isCurrent = false
            });
            trail.Add(new Breadcrumb()
            {
                LinkText = "Upload to Staging", isCurrent = true
            });

            model.Breadcrumbs = trail;

            return(View(model));
        }
        public ActionResult CreateStaging(GeneralStagingModel model)
        {
            StagingDataAccess dataAccess = new StagingDataAccess();

            if (!dataAccess.isCreateStagingModelValid(model))
            {
                ModelState.AddModelError("TableName", "The Staging Table Name must be unique");

                List<Breadcrumb> trail = new List<Breadcrumb>();

                trail.Add(new Breadcrumb() { LinkText = "Home", Action = "Index", Controller = "Home", isCurrent = false });
                trail.Add(new Breadcrumb() { LinkText = "Staging Index", Action = "Index", Controller = "Staging", isCurrent = false });
                trail.Add(new Breadcrumb() { LinkText = "Create Staging", isCurrent = true });

                model.Breadcrumbs = trail;

                return View(model);
            }

            try
            {
                dataAccess.createStagingTable(model);
            }
            catch (SqlException)
            {
                ModelState.AddModelError("", "An error occured when creating the Staging Table. Please ensure that the staging table name is unique and that all columns within it are uniquely named");

                List<Breadcrumb> trail = new List<Breadcrumb>();

                trail.Add(new Breadcrumb() { LinkText = "Home", Action = "Index", Controller = "Home", isCurrent = false });
                trail.Add(new Breadcrumb() { LinkText = "Staging Index", Action = "Index", Controller = "Staging", isCurrent = false });
                trail.Add(new Breadcrumb() { LinkText = "Create Staging", isCurrent = true });

                model.Breadcrumbs = trail;

                return View(model);
            }

            TempData["SuccessMessage"] = String.Format("The Staging Table - {0}, was successfully created", model.TableName);
            return RedirectToAction("Index");
        }
        /// <summary>
        /// Main index showing the list of staging tables
        /// in the system and providing links to the various
        /// actions available. No parameter is needed
        ///
        /// Accessed via /Staging/index
        /// </summary>
        /// <returns></returns>
        public ActionResult Index()
        {
            StagingDataAccess dataAccess = new StagingDataAccess();

            StagingIndexModel model = new StagingIndexModel();

            model.StagingModels = dataAccess.getStagingTables();

            List <Breadcrumb> trail = new List <Breadcrumb>();

            trail.Add(new Breadcrumb()
            {
                LinkText = "Home", Action = "Index", Controller = "Home", isCurrent = false
            });
            trail.Add(new Breadcrumb()
            {
                LinkText = "Staging Index", isCurrent = true
            });

            model.Breadcrumbs = trail;

            return(View(model));
        }
        public ActionResult UploadToStaging(UploadStagingModel model)
        {
            if (ModelState.IsValid)
            {
                if (model.attachment.ContentLength > 0)
                {
                    string fileName = Path.GetFileName(model.attachment.FileName);
                    string path = Path.Combine(Server.MapPath("~/App_Data/CSVUploads"), fileName);

                    Data_Loading_Tool.Database.FileAccess fileAccess = new Data_Loading_Tool.Database.FileAccess();

                    fileAccess.writeCSVtoDisk(model, path);

                    StagingDataAccess dataAccess = new StagingDataAccess();

                    dataAccess.updateTableFromCSV(path, model.StagingTableID, model.UniqueUploadRef, model.UnpivotData, model.FirstUpload, model.GeographyColumn);

                    TempData["SuccessMessage"] = "The Data was uploaded successfully";
                    return RedirectToAction("Index");
                }
            }

            List<Breadcrumb> trail = new List<Breadcrumb>();

            trail.Add(new Breadcrumb() { LinkText = "Home", Action = "Index", Controller = "Home", isCurrent = false });
            trail.Add(new Breadcrumb() { LinkText = "Staging Index", Action = "Index", Controller = "Staging", isCurrent = false });
            trail.Add(new Breadcrumb() { LinkText = "Upload to Staging", isCurrent = true });

            model.Breadcrumbs = trail;

            return View(model);
        }
        /// <summary>
        /// Main index showing the list of staging tables
        /// in the system and providing links to the various 
        /// actions available. No parameter is needed
        /// 
        /// Accessed via /Staging/index
        /// </summary>
        /// <returns></returns>
        public ActionResult Index()
        {
            StagingDataAccess dataAccess = new StagingDataAccess();

            StagingIndexModel model = new StagingIndexModel();

            model.StagingModels = dataAccess.getStagingTables();

            List<Breadcrumb> trail = new List<Breadcrumb>();

            trail.Add(new Breadcrumb() { LinkText = "Home", Action = "Index", Controller = "Home", isCurrent = false });
            trail.Add(new Breadcrumb() { LinkText = "Staging Index", isCurrent = true });

            model.Breadcrumbs = trail;

            return View(model);
        }
        /// <summary>
        /// A controller method to redirect to a page showing the details relating to 
        /// a staging dataset. This takes the dataset database ID as a parameter and
        /// utilises the data access classes to get the data back
        /// 
        /// This is accessed via /Staging/DatasetDetail
        /// </summary>
        /// <param name="datasetID"></param>
        /// <returns></returns>
        public ActionResult DatasetDetails(int datasetID)
        {
            StagingDataAccess dataAccess = new StagingDataAccess();

            StagingDetailModel model = dataAccess.getStagingDetails(datasetID);

            List<Breadcrumb> trail = new List<Breadcrumb>();

            trail.Add(new Breadcrumb() { LinkText = "Home", Action = "Index", Controller = "Home", isCurrent = false });
            trail.Add(new Breadcrumb() { LinkText = "Staging Index", Action = "Index", Controller = "Staging", isCurrent = false });
            trail.Add(new Breadcrumb() { LinkText = "Staging Dataset Details", isCurrent = true });

            model.Breadcrumbs = trail;

            return View(model);
        }