private IEnumerable <Risk> CalcRisks(RiskChartViewModel vm)
        {
            /*var risks = db.Risks.Where(p => p.ProbLevelId != null && p.ImpactLevelId != null);
             * if (vm.PosId == 1)
             *  risks = risks.Where(p => p.DeptId != null);
             * else if (vm.PosId == 2)
             * {
             *  risks = risks.Where(p => p.BranchId != null);
             *  if (vm.BranchId != null)
             *      risks = risks.Where(p => p.BranchId == vm.BranchId);
             * }*/

            var risks = db.Risks.Where(p => p.ProbLevelId != null && p.ImpactLevelId != null);

            if (vm.PosId == 1)
            {
                risks = risks.Where(p => p.DeptId != null || p.BranchId != null);
            }
            else if (vm.PosId == 2)
            {
                risks = risks.Where(p => p.DeptId != null && p.SubDivId == vm.BranchId);
            }
            else if (vm.PosId == 3)
            {
                risks = risks.Where(p => p.BranchId != null);
                if (vm.BranchId != null)
                {
                    risks = risks.Where(p => p.BranchId == vm.BranchId);
                }
            }
            else if (vm.PosId == 4)
            {
                risks = risks.Where(p => p.BranchId != null);
                if (vm.BranchId != null)
                {
                    risks = risks.Where(p => p.Branch.KorwilId == vm.BranchId);
                }
            }
            else if (vm.PosId == 5)
            {
                risks = risks.Where(p => p.BranchId != null);
                if (vm.BranchId != null)
                {
                    risks = risks.Where(p => p.Branch.ClassId == vm.BranchId);
                }
            }

            if (vm.IsApproved)
            {
                risks = risks.Where(p => p.CloseDate == null || p.CloseDate >= vm.ReportDate && p.CloseDate <= vm.ReportDate2);
                risks = risks.Where(p => p.ApprovalDate != null && p.ApprovalDate <= vm.ReportDate2 && p.ApprovalDate >= vm.ReportDate);
            }
            else
            {
                risks = risks.Where(p => p.ApprovalDate == null && p.RiskDate <= vm.ReportDate2 && p.RiskDate >= vm.ReportDate);
            }

            return(risks);
        }
        public ActionResult Index(RiskChartViewModel vm)
        {
            UpdateParam(vm);
            var risks    = CalcRisks(vm);
            var listData = CalcChartData(risks, vm);

            Session["ListData"]           = listData;
            Session["RiskChartViewModel"] = vm;
            ViewBag.DataTypeText          = GetDataTypeText(vm.YValueId);
            return(View(vm));
        }
        public ActionResult Index()
        {
            RiskChartViewModel vm = new RiskChartViewModel();

            vm.PosId       = 1;
            vm.IsApproved  = true;
            vm.ReportDate  = DateTime.Now;
            vm.ReportDate2 = DateTime.Now;
            vm.ChartTypeId = 1;
            vm.XValueId    = 1;
            vm.YValueId    = 1;

            UpdateParam(vm);
            var risks    = CalcRisks(vm);
            var listData = CalcChartData(risks, vm);

            Session["ListData"]           = listData;
            Session["RiskChartViewModel"] = vm;
            ViewBag.DataTypeText          = GetDataTypeText(vm.YValueId);
            return(View(vm));
        }
        public ActionResult ChartGenerator()
        {
            List <ChartData>   listData = Session["ListData"] as List <ChartData>;
            RiskChartViewModel vm       = Session["RiskChartViewModel"] as RiskChartViewModel;

            List <string>  xValues  = new List <string>();
            List <decimal> yValues  = new List <decimal>();
            List <decimal> yValues2 = new List <decimal>();

            foreach (var data in listData)
            {
                xValues.Add(data.Name);
                yValues.Add(data.Value);
                yValues2.Add(data.Value2);
            }

            string seriesName  = string.Empty;
            string seriesName2 = string.Empty;

            if (vm.YValueId == DATA_COUNT)
            {
                seriesName = "Banyak Data";
            }
            else if (vm.YValueId == DATA_PROBLEVEL)
            {
                seriesName = "Tingkat Probabilitas";
            }
            else if (vm.YValueId == DATA_IMPACTLEVEL)
            {
                seriesName = "Tingkat Dampak";
            }
            else if (vm.YValueId == DATA_PROBIMPACTLEVEL)
            {
                seriesName  = "Tingkat Probabilitas";
                seriesName2 = "Tingkat Dampak";
            }
            else
            {
                seriesName = "Tingkat Risiko";
            }

            string chartType   = "column";
            int    chartTypeId = vm.ChartTypeId;

            if (chartTypeId == 2)
            {
                chartType = "bar";
            }
            else if (chartTypeId == 3)
            {
                chartType = "pie";
            }

            string xAxisTitle = GetXAxisTitle(vm.XValueId);
            string yAxisTitle = GetYAxisTitle(vm.YValueId);

            var cht = new Chart(width: 600, height: 400, theme: ChartTheme.Blue)
                      .SetXAxis(xAxisTitle)
                      .SetYAxis(yAxisTitle)
                      .AddSeries(name: seriesName,
                                 chartType: chartType,
                                 xValue: xValues,
                                 yValues: yValues, markerStep: 1, axisLabel: "aaaa");

            if (!string.IsNullOrEmpty(seriesName2))
            {
                cht = cht
                      .AddSeries(name: seriesName2,
                                 chartType: chartType,
                                 xValue: xValues,
                                 yValues: yValues2, axisLabel: "aaaa")
                      .AddLegend();
            }

            var bytes = cht.GetBytes("jpg");

            return(File(bytes, "image/jdpg"));
        }
        private List <ChartData> CalcChartData(IEnumerable <Risk> risks, RiskChartViewModel vm)
        {
            List <ChartData> listData = new List <ChartData>();

            InitializeListData(listData, vm.XValueId);

            switch (vm.XValueId)
            {
            case GROUP_NONE:
                CalcChartData_NoGroup(listData, risks, vm.YValueId);
                break;

            case GROUP_CAUSE:
                CalcChartData_Cause(listData, risks, vm.YValueId);
                break;

            case GROUP_EFFECT:
                CalcChartData_Effect(listData, risks, vm.YValueId);
                break;

            case GROUP_RISKCLASS:
                CalcChartData_RiskClass(listData, risks, vm.YValueId);
                break;

            case GROUP_HQ_BRANCH:
                CalcChartData_HQBranch(listData, risks, vm.YValueId);
                break;

            case GROUP_CLASSBRANCH:
                CalcChartData_ClassBranch(listData, risks, vm.YValueId);
                break;

            case GROUP_BRANCH_CLASS1:
                CalcChartData_Branch1(listData, risks, vm.YValueId);
                break;

            case GROUP_BRANCH_CLASS2:
                CalcChartData_Branch2(listData, risks, vm.YValueId);
                break;

            case GROUP_BRANCH_CLASS3:
                CalcChartData_Branch3(listData, risks, vm.YValueId);
                break;

            case GROUP_PROBLEVEL:
                CalcChartData_ProbLevel(listData, risks, vm.YValueId);
                break;

            case GROUP_IMPACTLEVEL:
                CalcChartData_ImpactLevel(listData, risks, vm.YValueId);
                break;

            case GROUP_RISKLEVEL:
                CalcChartData_RiskLevel(listData, risks, vm.YValueId);
                break;
            }

            foreach (var data in listData)
            {
                if (data.Count > 0)
                {
                    switch (vm.YValueId)
                    {
                    case DATA_COUNT:
                        //data.Value++;
                        break;

                    case DATA_PROBLEVEL:
                        data.Value = data.Value / data.Count;
                        break;

                    case DATA_IMPACTLEVEL:
                        data.Value = data.Value / data.Count;
                        //data.Value += (int)r.ImpactLevelId;
                        break;

                    case DATA_PROBIMPACTLEVEL:
                        data.Value  = data.Value / data.Count;
                        data.Value2 = data.Value2 / data.Count;
                        break;

                    case DATA_RISKLEVEL:
                        data.Value = data.Value / data.Count;
                        break;
                    }
                }
            }

            return(listData);
        }
        private void UpdateParam(RiskChartViewModel vm)
        {
            Dictionary <int, string> posList = new Dictionary <int, string>();

            posList.Add(1, "Nasional");
            posList.Add(2, "Kantor Pusat");
            posList.Add(3, "Kantor Cabang");
            posList.Add(4, "Korwil");
            posList.Add(5, "Kelas KC");
            vm.PosList = new SelectList(posList, "Key", "Value", vm.PosId);

            /*Dictionary<int, string> branchList = new Dictionary<int, string>();
             * foreach (var branch in db.Branches.OrderBy(m => m.ClassId).ThenBy(m => m.BranchName))
             *  branchList.Add(branch.BranchId, branch.BranchName + " (Kelas " + branch.BranchClass.ClassName + ")");
             * vm.Branches = new SelectList(branchList, "Key", "Value", vm.BranchId);
             */

            if (vm.PosId == 2)
            {
                Dictionary <int, string> divList = new Dictionary <int, string>();
                foreach (var div in db.SubDivs.OrderBy(m => m.SubDivId).ThenBy(m => m.SubDivId))
                {
                    divList.Add(div.SubDivId, div.SubDivName);
                }
                vm.Unit = new SelectList(divList, "Key", "Value", vm.SubDivId);
            }
            else if (vm.PosId == 3)
            {
                Dictionary <int, string> branchList2 = new Dictionary <int, string>();
                foreach (var branch in db.Branches.OrderBy(m => m.ClassId).ThenBy(m => m.BranchName))
                {
                    branchList2.Add(branch.BranchId, branch.BranchName + " (Kelas " + branch.BranchClass.ClassName + ")");
                }
                vm.Unit = new SelectList(branchList2, "Key", "Value", vm.BranchId);
            }
            else if (vm.PosId == 4)
            {
                Dictionary <int, string> korwilList = new Dictionary <int, string>();
                foreach (var korwil in db.Korwils.OrderBy(m => m.KorwilId).ThenBy(m => m.Korwil1))
                {
                    korwilList.Add(korwil.KorwilId, korwil.Korwil1);
                }
                vm.Unit = new SelectList(korwilList, "Key", "Value", vm.BranchId);
            }
            else if (vm.PosId == 5)
            {
                Dictionary <int, string> kelasList = new Dictionary <int, string>();
                foreach (var kelas in db.BranchClasses.OrderBy(m => m.ClassId).ThenBy(m => m.ClassName))
                {
                    kelasList.Add(kelas.ClassId, kelas.ClassName);
                }
                vm.Unit = new SelectList(kelasList, "Key", "Value", vm.BranchId);
            }
            else
            {
                vm.Unit = new SelectList(Enumerable.Empty <SelectListItem>());
            }

            Dictionary <int, string> chartTypes = new Dictionary <int, string>();

            chartTypes.Add(1, "Kolom");
            chartTypes.Add(2, "Bar");
            chartTypes.Add(3, "Pie");
            vm.ChartTypes = new SelectList(chartTypes, "Key", "Value", vm.ChartTypeId);

            Dictionary <int, string> xValues = new Dictionary <int, string>();

            xValues.Add(1, "(Tanpa pengelompokan)");
            xValues.Add(2, "Sebab Risiko");
            xValues.Add(3, "Akibat Risiko");
            xValues.Add(4, "Klasifikasi Risiko");
            xValues.Add(5, "Pusat/Cabang");
            xValues.Add(6, "Kelas Cabang");
            xValues.Add(7, "Cabang Kelas I");
            xValues.Add(8, "Cabang Kelas II");
            xValues.Add(9, "Cabang Kelas III");
            xValues.Add(10, "Tingkat Probabilitas");
            xValues.Add(11, "Tingkat Dampak");
            xValues.Add(12, "Tingkat Risiko");
            vm.XValues = new SelectList(xValues, "Key", "Value", vm.XValueId);

            Dictionary <int, string> yValues = new Dictionary <int, string>();

            yValues.Add(1, "Jumlah Data");
            yValues.Add(2, "Tingkat Probabilitas");
            yValues.Add(3, "Tingkat Dampak");
            yValues.Add(4, "Tingkat Probabilitas dan Tingkat Dampak");
            yValues.Add(5, "Tingkat Risiko");
            vm.YValues = new SelectList(yValues, "Key", "Value", vm.YValueId);
        }