public IActionResult Generate(int id)
        {
            var report = _context.Reports
                         .Where(r => r.ID == id)
                         .Include(r => r.ReportType)
                         .FirstOrDefault();

            if (report.ReportType.Discriminator == "SGRQReportType")
            {
                var reportBuilder = new SGRQReportBuilder(_context, report);
                return(GetFileContentResult(reportBuilder.Build(), ".xlsx", EXCEL_2007_CONTENT_TYPE));
            }
            else if (report.ReportType.Discriminator == "CPAMortalityAudit")
            {
                var stream = System.IO.File.Open(report.InputFilePath, FileMode.Open);
                var cPAMortalityAuditReportBuilder = new CPAMortalityAuditReportBuilder(_context, _logger, stream);
                return(GetFileContentResult(cPAMortalityAuditReportBuilder.Build(), ".xlsx", EXCEL_2007_CONTENT_TYPE));
            }
            return(null);
        }
        public IActionResult Create([Bind("ID, StartDate, EndDate, PatientIds")] Report report)
        {
            if (Request.Form.Files.Count > 0)
            {
                IFormFile file = Request.Form.Files[0];

                string webRootPath = _hostingEnvironment.WebRootPath;
                Action <FileStream, IFormFile, string> readFileAction = (stream, formFile, extension) => {
                    var    reportBuilder = new CPAMortalityAuditReportBuilder(_context, stream, _logger, formFile);
                    string newPath       = Path.Combine(webRootPath, "Upload");
                    string fileExtension = Path.GetExtension(file.FileName).ToLower();
                    string fullPath      = Path.Combine(newPath, file.FileName);
                    report.InputFilePath = fullPath;
                    reportBuilder.Build();
                };
                FileImporter.Import(file, webRootPath, readFileAction);
                var reportType = _context.ReportTypes
                                 .FirstOrDefault(rt => rt.Discriminator == "CPAMortalityAudit");
                report.ReportTypeId = reportType.ID;

                _context.Reports.Update(report);
                _context.SaveChanges();
                return(Json(new { success = true, id = report.ID }));
            }
            else
            {
                var reportType = _context.ReportTypes
                                 .FirstOrDefault(rt => rt.Discriminator == Request.Form["ReportTypeID"]);
                StringValues patientIds;
                if (reportType == null)
                {
                    return(Json(new { success = false }));
                }
                var reportItems = new List <PatientReportItem>();
                if (!string.IsNullOrEmpty(Request.Form["PatientIds"]))
                {
                    patientIds = Request.Form["PatientIds"];
                }
                if (patientIds.ToList()[0] == "null")
                {
                    ModelState.AddModelError("Base", "You need to add at least one patient to this report");
                }
                if (patientIds.ToList()[0] != "null" && !string.IsNullOrEmpty(patientIds))
                {
                    var idsToFind = patientIds.ToString()
                                    .Split(",")
                                    .Select(id => Int32.Parse(id))
                                    .ToList();

                    var patients = _context.Patients.Where(p => idsToFind.Contains(p.ID));
                    foreach (var patient in patients)
                    {
                        var patientReportItem = new PatientReportItem()
                        {
                            PatientId = patient.ID
                        };
                        reportItems.Add(patientReportItem);
                    }
                }
                report.ReportTypeId       = reportType.ID;
                report.PatientReportItems = reportItems;

                if (ModelState.IsValid)
                {
                    _context.Reports.Update(report);
                    _context.SaveChanges();
                    return(Json(new { success = true, id = report.ID }));
                }
                else
                {
                    Hashtable errors = ModelStateHelper.Errors(ModelState);
                    return(Json(new { success = false, errors }));
                }
            }
        }