private void ValidateDefinition(CustomiseReportModel model)
 {
     if (!String.IsNullOrWhiteSpace(model.ReportName))
     {
         if (Regex.Matches(model.ReportName, @"[a-zA-Z ']").Count < model.ReportName.Length)
         {
             ModelState.AddModelError("ReportName", "Report Name contains invalid characters(Enter A-Z, a-z, space).");
         }
     }
     if (!String.IsNullOrWhiteSpace(model.ReportDefinition))
     {
         if (Regex.Matches(model.ReportDefinition, @"[a-zA-Z'!,]").Count < model.ReportDefinition.Length)
         {
             ModelState.AddModelError("ReportName", "Definition contains invalid characters (Enter A-Z, a-z, '!,).");
         }
     }
     if (model.ReportType == 0)
     {
         ModelState.AddModelError("ReportType", "Please select a valid report type.");
     }
     if (model.CoreEntity == 0)
     {
         ModelState.AddModelError("CoreEntity", "Please select a valid core entity.");
     }
     if (model.ReportStatus == 0)
     {
         ModelState.AddModelError("ReportStatus", "Please select a valid report status.");
     }
 }
        private void SaveDefinition(CustomiseReportModel model, MetaReport metaReport)
        {
            try
            {
                // Prepare XML
                XmlDocument meta = new XmlDocument();

                var ns = ""; // urn:pvims-org:v3

                XmlNode      rootNode = null;
                XmlAttribute attrib;

                XmlDeclaration xmlDeclaration = meta.CreateXmlDeclaration("1.0", "UTF-8", null);
                meta.AppendChild(xmlDeclaration);

                rootNode = meta.CreateElement("MetaReport", ns);

                attrib           = meta.CreateAttribute("Type");
                attrib.InnerText = model.ReportType.ToString();
                rootNode.Attributes.Append(attrib);

                attrib           = meta.CreateAttribute("CoreEntity");
                attrib.InnerText = model.CoreEntity.ToString();
                rootNode.Attributes.Append(attrib);

                meta.AppendChild(rootNode);

                var encodedName       = System.Web.Security.AntiXss.AntiXssEncoder.HtmlEncode(model.ReportName, false);
                var encodedDefinition = System.Web.Security.AntiXss.AntiXssEncoder.HtmlEncode(model.ReportDefinition, false);

                metaReport.MetaDefinition   = meta.InnerXml;
                metaReport.ReportDefinition = encodedDefinition;
                metaReport.ReportName       = encodedName;
                metaReport.ReportStatus     = (MetaReportStatus)model.ReportStatus;

                if (model.MetaReportId == 0)
                {
                    _unitOfWork.Repository <MetaReport>().Save(metaReport);
                }
                else
                {
                    _unitOfWork.Repository <MetaReport>().Update(metaReport);
                }
                _unitOfWork.Complete();
            }
            catch (Exception ex)
            {
                ModelState.AddModelError("ReportName", String.Format("<li>ERROR: {0}...</li>", ex.Message));
            }
        }
        private void ExtractMetaDataForCustom(MetaReport metaReport, CustomiseReportModel model)
        {
            int tempi;

            XmlDocument meta = new XmlDocument();

            meta.LoadXml(metaReport.MetaDefinition);

            // Unpack structures
            XmlNode      rootNode   = meta.SelectSingleNode("//MetaReport");
            XmlAttribute typeAttr   = rootNode.Attributes["Type"];
            XmlAttribute entityAttr = rootNode.Attributes["CoreEntity"];

            model.CoreEntity = entityAttr != null?int.TryParse(entityAttr.Value, out tempi) ? Convert.ToInt32(entityAttr.Value) : 0 : 0;

            model.ReportType = typeAttr != null?int.TryParse(typeAttr.Value, out tempi) ? Convert.ToInt32(typeAttr.Value) : 0 : 0;

            model.ViewType = model.ReportType == 1 ? Models.ViewType.List : Models.ViewType.Summary;
        }
        public ActionResult CustomiseReport(int metaReportId)
        {
            ViewBag.MenuItem = CurrentMenuItem;

            var metaReport = _unitOfWork.Repository <MetaReport>()
                             .Queryable()
                             .SingleOrDefault(r => r.Id == metaReportId);

            // Prepare model
            var model = new CustomiseReportModel
            {
                MetaReportId     = metaReportId,
                ReportName       = metaReport != null ? metaReport.ReportName : string.Empty,
                ReportDefinition = metaReport != null ? metaReport.ReportDefinition : string.Empty,
                ReportStatus     = metaReport != null?Convert.ToInt32(metaReport.ReportStatus) : 2,
                                       AllowDeletion = System.Web.HttpContext.Current.User.IsInRole(Constants.Role.ReporterAdministrator)
            };

            if (metaReport != null)
            {
                ExtractMetaDataForCustom(metaReport, model);
            }

            ViewBag.CoreEntities = new List <SelectListItem> {
                new SelectListItem {
                    Value = "0", Text = "", Selected = true
                }
            };
            ViewBag.CoreEntities.AddRange(_unitOfWork.Repository <MetaTable>().Queryable()
                                          .OrderBy(mt => mt.FriendlyName).Select(mt => new SelectListItem {
                Value = mt.Id.ToString(), Text = mt.FriendlyName
            }).ToList());

            ViewBag.ReportTypes = new[]
            {
                new SelectListItem {
                    Value = "0", Text = ""
                },
                new SelectListItem {
                    Value = "1", Text = "List", Selected = true
                },
                new SelectListItem {
                    Value = "2", Text = "Summary"
                }
            };

            ViewBag.ReportStatuses = new[]
            {
                new SelectListItem {
                    Value = "0", Text = ""
                },
                new SelectListItem {
                    Value = "2", Text = "Unpublished", Selected = true
                },
                new SelectListItem {
                    Value = "1", Text = "Published"
                }
            };

            return(View(model));
        }
        public ActionResult CustomiseReport(CustomiseReportModel model)
        {
            ViewBag.MenuItem = CurrentMenuItem;

            var metaReport = _unitOfWork.Repository <MetaReport>()
                             .Queryable()
                             .SingleOrDefault(r => r.Id == model.MetaReportId);

            if (metaReport == null)
            {
                metaReport = new MetaReport();
            }

            ValidateDefinition(model);

            if (ModelState.IsValid)
            {
                SaveDefinition(model, metaReport);

                HttpCookie cookie = new HttpCookie("PopUpMessage");
                cookie.Value = "Report saved successfully";
                Response.Cookies.Add(cookie);

                return(Redirect("/Reports/Index"));
            }

            ViewBag.CoreEntities = new List <SelectListItem> {
                new SelectListItem {
                    Value = "0", Text = "", Selected = true
                }
            };
            ViewBag.CoreEntities.AddRange(_unitOfWork.Repository <MetaTable>().Queryable()
                                          .OrderBy(mt => mt.FriendlyName).Select(mt => new SelectListItem {
                Value = mt.Id.ToString(), Text = mt.FriendlyName
            }).ToList());

            ViewBag.ReportTypes = new[]
            {
                new SelectListItem {
                    Value = "0", Text = ""
                },
                new SelectListItem {
                    Value = "1", Text = "List", Selected = true
                },
                new SelectListItem {
                    Value = "2", Text = "Summary"
                }
            };

            ViewBag.ReportStatuses = new[]
            {
                new SelectListItem {
                    Value = "0", Text = ""
                },
                new SelectListItem {
                    Value = "2", Text = "Unpublished", Selected = true
                },
                new SelectListItem {
                    Value = "1", Text = "Published"
                }
            };

            return(View(model));
        }