/// <summary>
        /// Export summary evaluation excel report.
        /// </summary>
        /// <param name="model">The filter criteria value.</param>
        public ResponseFileModel ExportSummaryReport(InvestigateEvaluationReportRequestModel model)
        {
            var dataList    = this.GetDataCollection(model);
            var summaryList = this.GetSummarys(dataList);

            return(this.ExportExcel(dataList, summaryList, model));
        }
        public IActionResult ExportSummaryReport([FromBody] InvestigateEvaluationReportRequestModel model)
        {
            var result = _evaluationSummaryReport.ExportSummaryReport(model);

            Response.Headers.Add("Content-Disposition", "attachment; filename=" + result.FileName);
            return(File(result.FileContent, "application/octet-stream"));
        }
        /// <summary>
        /// Generate criteria selected information in report.
        /// </summary>
        /// <param name="model">The filter criteria value.</param>
        /// <returns></returns>
        private string GenerateCriteria(InvestigateEvaluationReportRequestModel model)
        {
            StringBuilder stringBuilder = new StringBuilder();
            string        year          = string.Empty;

            if (model.Year != null)
            {
                year = string.Join(",", model.Year);
            }
            stringBuilder.AppendLine($"   Criteria ที่เลือก");
            stringBuilder.AppendLine($"ปี : {year}");
            stringBuilder.AppendLine($"รอบ : {this.GetPeriodItemName(model.PeriodItemId)}");
            stringBuilder.AppendLine($"บริษัท : {this.GetCompanyName(model.ComCode)}");
            stringBuilder.AppendLine($"กลุ่มจัดซื้อ : {this.GetPurchaseName(model.PurchaseOrg)}");
            stringBuilder.AppendLine($"ประเภทผู้ขาย : {this.GetWeightingKey(model.WeightingKey)}");
            return(stringBuilder.ToString());
        }
        /// <summary>
        /// Export evaluation summary stat to excel report.
        /// </summary>
        /// <param name="evaluationList">The evaluation collection.</param>
        /// <param name="summaryList">The summary evaluation collection.</param>
        /// <param name="model">The filter criteria value.</param>
        private ResponseFileModel ExportExcel(IEnumerable <Data.Pocos.Evaluation> evaluationList,
                                              IEnumerable <SummaryEvaluationViewModel> summaryList,
                                              InvestigateEvaluationReportRequestModel model)
        {
            var    result       = new ResponseFileModel();
            int    maxCountUser = summaryList.Select(x => x.UserLists.Count).Max();
            string sheetName    = "รายงานตรวจสอบสถานะการประเมิน";

            using (var memoryStream = new MemoryStream())
            {
                IWorkbook workbook = new XSSFWorkbook();

                ISheet sheet1 = workbook.CreateSheet(sheetName);

                sheet1.AddMergedRegion(new CellRangeAddress(2, 2, 0, 7));
                sheet1.AddMergedRegion(new CellRangeAddress(3, 3, 0, 3));
                sheet1.AddMergedRegion(new CellRangeAddress(5, 6, 0, 0));
                sheet1.AddMergedRegion(new CellRangeAddress(5, 6, 1, 1));
                sheet1.AddMergedRegion(new CellRangeAddress(5, 6, 2, 3));
                sheet1.AddMergedRegion(new CellRangeAddress(5, 6, 4, 4));
                sheet1.AddMergedRegion(new CellRangeAddress(5, 6, 5, 5));
                sheet1.AddMergedRegion(new CellRangeAddress(5, 6, 6, 6));
                sheet1.AddMergedRegion(new CellRangeAddress(5, 6, 7, 7));
                sheet1.AddMergedRegion(new CellRangeAddress(5, 6, 8, 8));
                sheet1.AddMergedRegion(new CellRangeAddress(5, 6, 9, 9));

                int rowIndex        = 2;
                int cellHeaderIndex = this.GenerateHeaderTable(workbook, sheet1, ref rowIndex, maxCountUser, model);
                this.GenerateContentTable(workbook, sheet1, summaryList, evaluationList, rowIndex, cellHeaderIndex);

                workbook.Write(memoryStream);

                result.FileContent = memoryStream.ToArray();
                result.FileName    = $"InvestigateEvaluation_{DateTime.Now.ToString("yyyyMMddHHmmss")}.xlsx";
            }
            return(result);
        }
        /// <summary>
        /// Get evaluation data.
        /// </summary>
        /// <param name="model">The filter criteria value.</param>
        /// <returns></returns>
        private IEnumerable <Data.Pocos.Evaluation> GetDataCollection(InvestigateEvaluationReportRequestModel model)
        {
            var whereClause = this.BuildDynamicWhereClause(model);

            return(_unitOfWork.GetRepository <Data.Pocos.Evaluation>().Get(whereClause));
        }
        /// <summary>
        /// Build dynamic where clause with criteria value.
        /// </summary>
        /// <param name="model">The criteria value.</param>
        /// <returns></returns>
        private Expression <Func <Data.Pocos.Evaluation, bool> > BuildDynamicWhereClause(InvestigateEvaluationReportRequestModel model)
        {
            // simple method to dynamically plugin a where clause
            var predicate = PredicateBuilder.True <Data.Pocos.Evaluation>(); // true -where(true) return all

            if (model.Status != null)
            {
                predicate = predicate.And(s => model.Status.Contains(s.Status));
            }
            if (!string.IsNullOrEmpty(model.ComCode))
            {
                predicate = predicate.And(s => s.ComCode == model.ComCode);
            }
            if (!string.IsNullOrEmpty(model.PurchaseOrg))
            {
                predicate = predicate.And(s => s.PurchasingOrg == model.PurchaseOrg);
            }
            if (!string.IsNullOrEmpty(model.WeightingKey))
            {
                predicate = predicate.And(s => s.WeightingKey == model.WeightingKey);
            }

            if (model.Year != null)
            {
                var periodAll     = _unitOfWork.GetRepository <Period>().GetCache(x => model.Year.Contains(x.Year)).Select(x => x.Id);
                var periodItemIds = _unitOfWork.GetRepository <PeriodItem>().GetCache(x => periodAll.Contains(x.PeriodId.Value)).Select(x => x.Id);
                if (model.PeriodItemId != null)
                {
                    periodItemIds = periodItemIds.Where(x => model.PeriodItemId.Contains(x));
                }
                predicate = predicate.And(s => periodItemIds.Contains(s.PeriodItemId.Value));
            }

            return(predicate);
        }
        /// <summary>
        /// Generate header table.
        /// </summary>
        /// <param name="workbook">The npoi workbook interface.</param>
        /// <param name="sheet1">The npoi sheet interface.</param>
        /// <param name="rowIndex">The row target index.</param>
        /// <param name="maxCountUser">The max count user for generate dynamic header column.</param>
        /// <param name="model">The filter criteria value.</param>
        /// <returns></returns>
        private int GenerateHeaderTable(IWorkbook workbook, ISheet sheet1,
                                        ref int rowIndex, int maxCountUser,
                                        InvestigateEvaluationReportRequestModel model)
        {
            IRow topicRow = sheet1.CreateRow(rowIndex);

            ExcelService.CreateTopicCell(workbook, sheet1, topicRow, 0, $"รายงานตรวจสอบสถานะการประเมิน - วันที่พิมพ์ {UtilityService.DateTimeToStringTH(DateTime.Now, "dd MMM yyyy")}");
            rowIndex = rowIndex + 1;
            IRow criteriaRow = sheet1.CreateRow(rowIndex);

            criteriaRow.Height = 3000;
            ExcelService.CreateCriteriaCell(workbook, sheet1, criteriaRow, 0, $"{this.GenerateCriteria(model)}");
            ExcelService.SetCellCriteriaStyle(workbook, criteriaRow, 1, 3);
            rowIndex = rowIndex + 2;
            string[] mainHeaders = new string[]
            {
                "เลขที่ใบประเมิน",
                "บริษัท",
                "รอบการประเมิน",
                "รอบการประเมิน",
                "รหัสผู้ขาย",
                "ชื่อผู้ขาย",
                "ชื่อประเภทผู้ขาย",
                "ชื่อกลุ่มจัดซื้อ",
                "จำนวนผู้ประเมิน",
                "ประเมินแล้วเสร็จ",
            };
            IRow headerRow = sheet1.CreateRow(rowIndex);

            headerRow.Height = 500;
            int cellHeaderIndex = 0;

            foreach (var item in mainHeaders)
            {
                ExcelService.SetCellHeaderStyle(workbook, headerRow, cellHeaderIndex);
                ExcelService.CreateHeaderCell(workbook, sheet1, headerRow, cellHeaderIndex, item);
                cellHeaderIndex++;
            }

            string[] userHeaders = new string[]
            {
                "ผู้ประเมิน",
                "สถานะ",
                "เหตุผล"
            };

            for (int i = 0; i < maxCountUser; i++)
            {
                foreach (var item in userHeaders)
                {
                    ExcelService.SetCellHeaderStyle(workbook, headerRow, cellHeaderIndex);
                    ExcelService.CreateHeaderCell(workbook, sheet1, headerRow, cellHeaderIndex, item);
                    sheet1.AddMergedRegion(new CellRangeAddress(5, 6, cellHeaderIndex, cellHeaderIndex));
                    cellHeaderIndex++;
                }
            }
            rowIndex++;
            IRow headerRow2 = sheet1.CreateRow(rowIndex);

            ExcelService.SetCellContentStyle(workbook, headerRow2, 0, cellHeaderIndex - 1);
            return(cellHeaderIndex);
        }