public ActionResult View(SqlReportViewModel model)
        {
            if (!IsModelValid(model) )
            {
                ViewBag.HideClass = string.Empty; 
          
                var initModel = GetReportsViewModel();
                initModel.SiteId = model.SiteId;
                initModel.DateStart = model.DateStart;
                initModel.DateEnd = model.DateEnd;
                initModel.ReportId = model.ReportId;
                
                if (model.DateEnd.HasValue && model.DateStart.HasValue && model.DateStart.Value > model.DateEnd.Value)
                {             
                    ViewBag.ErrorString = "Start Date must be before End Date.";
                }

                if (!model.DateEnd.HasValue)
                {
                   ViewBag.ErrorString = "Please Select an End Date.";
                }

                if (!model.DateStart.HasValue)
                {
                    ViewBag.ErrorString = "Please Select a Start Date.";
                }

                if (!model.ReportId.HasValue)
                {
                    ViewBag.ErrorString = "Please Select a Report.";
                }

                return View("Index", initModel);
            }

            model.CompanyId = CurrentUser.CompanyId;

            DocumentViewModel document = null;

            var reportType = (SqlReportHelper.ReportType) model.ReportId;

            object[] parameters;

            if (model.DateEnd == null)
                model.DateEnd = DateTime.Now;

            if (model.DateStart == null)
                model.DateStart = DateTime.MinValue;

            Log4NetHelper.Logger.Debug(String.Format("Calling Report type {0}", reportType));
            switch (reportType)
            {
                case (SqlReportHelper.ReportType.TaskStatus): 
                case (SqlReportHelper.ReportType.TaskStatus_Completed): 
                case (SqlReportHelper.ReportType.TaskStatus_Outstanding):                     
                    parameters = new object[] { GetSiteOrSiteGroupId(model), model.DateStart, model.DateEnd }; 
                    break;
                
                case (SqlReportHelper.ReportType.AccidentRecords):
                    long[] accidentRecords = _accidentRecordsFactory
                                        .WithCompanyId(CurrentUser.CompanyId)
                                        .WithShowDeleted(false)                                        
                                        .WithStartDate(model.DateStart)
                                        .WithEndDate(model.DateEnd)
                                        .WithAllowedSiteIds(CurrentUser.GetSitesFilter().ToList())                                        
                                        .GetAccidentRecords();

                    string csvAccidentRecords = String.Join(",", accidentRecords);
                
                    parameters = new object[] { csvAccidentRecords, model.DateStart, model.DateEnd, GetSiteOrSiteGroupId(model) };                 
                    break;

                case (SqlReportHelper.ReportType.AccidentRecords_AnalysisReport): 
                    parameters = new object[] { model.DateStart, model.DateEnd, GetSiteOrSiteGroupId(model) }; 
                    break;

                case (SqlReportHelper.ReportType.HazardousSubstancesInventory):
                    parameters = new object[] { GetSiteOrSiteGroupId(model) }; 
                    break;

                default: throw new Exception(String.Format("Unsupported or unknown Report Type {0}", model.ReportId)); break;
            }

            

            document = _sqlReportExecutionServiceFacade.GetReport(reportType,
                                                                  parameters,
                                                                  SqlReportHelper.ReportFormatType.Excel);


            return File(document.FileStream, document.MimeType, document.FileName);
        }
 private bool IsModelValid(SqlReportViewModel model)
 {
     return model.ReportId.HasValue && model.DateStart.HasValue && model.DateEnd.HasValue &&  model.DateStart.Value < model.DateEnd.Value;
 }
        private string GetSiteOrSiteGroupId(SqlReportViewModel model)
        {
            string siteID = null;

            if (model.SiteGroupId == null && model.SiteId == null)
            {
                // return all sites user is allowed to see as CSV string                           
                siteID = String.Join(",", CurrentUser.GetSitesFilter());
            }
            else
            {
                siteID = model.SiteGroupId == null ? model.SiteId.ToString() : model.SiteGroupId.ToString();
            }

            return siteID;
        }
        public SqlReportViewModel GetViewModel()
        {         
            var sites = GetSites();
            var siteGroups = GetSiteGroups();
            var reports = GetSupportedReportType();

            var viewModel = new SqlReportViewModel
            {
                CompanyId = _companyId,
               
                Sites = sites,
                SiteGroups = siteGroups,

                SiteId = _siteId,
                SiteGroupId = _siteGroupId,  

                ReportTypes = reports,
                ReportId = (long)_reportId
            };

            return viewModel;

        }