public IActionResult CollectionToExcel(CollectionRptQuery model)
        {
            if (ModelState.IsValid)
            {
                var currentRoleId = partnerManager.GetCurrentUserRole(this.HttpContext);
                var permission    = partnerActivity.GetPartAct("Report.Collection.StatReport.ExportToExcel", currentRoleId);
                if (permission == null)
                {
                    toastNotification.AddErrorToastMessage("ليس لديك الصلاحية الكافية", new ToastrOptions
                    {
                        Title = ""
                    });
                    return(Redirect(Request.Headers["Referer"].ToString()));
                }
                var param = new CollectionRptQueryParam
                {
                    ChannelId = model.Param.ChannelId,
                    PosId     = model.Param.PosId,
                    StatusId  = model.Param.StatusId,
                    LevelId   = model.Param.LevelId,
                    StartDate = model.Param.StartDate,
                    EndDate   = model.Param.EndDate
                };
                var result = new CollectionRepo(db).GetStatReport(param);
                model.Results = result;
                if (result != null)
                {
                    using (var workbook = new XLWorkbook())
                    {
                        var worksheet = workbook.AddWorksheet("Collections");
                        worksheet.SetRightToLeft();
                        worksheet.ColumnWidth = 15;
                        var currRow = 1;
                        worksheet.Range(1, 1, 1, 7).Merge().Value = param.Title;
                        worksheet.Range(1, 1, 1, 7).Style.Fill.BackgroundColor = XLColor.LightYellow;
                        worksheet.Cell(currRow, 1).Style.Alignment.SetVertical(XLAlignmentVerticalValues.Center);
                        worksheet.Cell(currRow, 1).Style.Alignment.SetHorizontal(XLAlignmentHorizontalValues.Center);
                        worksheet.Row(1).Height              = 100;
                        worksheet.Row(1).Style.Font.Bold     = true;
                        worksheet.Row(1).Style.Font.FontSize = 16;
                        ++currRow;
                        worksheet.Cell(currRow, 1).Value           = "القناة";
                        worksheet.Cell(currRow, 2).Value           = model.Param.LevelId == "pos" ? "رقم النقطة" : "اليوم";
                        worksheet.Cell(currRow, 3).Value           = model.Param.LevelId == "pos" ? "رقم النقطة" : "";
                        worksheet.Cell(currRow, 4).Value           = "الحالة";
                        worksheet.Cell(currRow, 5).Value           = "عدد العمليات";
                        worksheet.Cell(currRow, 6).Value           = "اجمالي المبلغ";
                        worksheet.Cell(currRow, 7).Value           = "عدد النقاط";
                        worksheet.Row(currRow).Style.Font.Bold     = true;
                        worksheet.Row(currRow).Style.Font.FontSize = 14;
                        worksheet.Row(currRow).Style.Alignment.SetHorizontal(XLAlignmentHorizontalValues.Center);
                        worksheet.Row(currRow).Style.Alignment.SetVertical(XLAlignmentVerticalValues.Center);
                        worksheet.Row(currRow).Height = 25;
                        worksheet.Range(currRow, 1, currRow, 7).Style.Fill.BackgroundColor = XLColor.LightPastelPurple;

                        foreach (var item in result)
                        {
                            ++currRow;
                            worksheet.Columns(6, 6).Style.NumberFormat.SetFormat("#,##0.00");
                            worksheet.Columns(5, 5).Style.NumberFormat.SetFormat("#,##0");
                            worksheet.Columns(7, 7).Style.NumberFormat.SetFormat("#,##0");
                            worksheet.Row(currRow).Style.Alignment.SetHorizontal(XLAlignmentHorizontalValues.Center);
                            worksheet.Row(currRow).Style.Alignment.SetVertical(XLAlignmentVerticalValues.Center);
                            worksheet.Cell(currRow, 1).Value = item.Channel;
                            worksheet.Cell(currRow, 2).Value = model.Param.LevelId == "pos" ? item.Partner.Id : item.CollDay;
                            worksheet.Cell(currRow, 3).Value = model.Param.LevelId == "pos" ? item.Partner.Name : "";
                            worksheet.Cell(currRow, 4).Value = item.Status.Name;
                            worksheet.Cell(currRow, 5).Value = item.Count;
                            worksheet.Cell(currRow, 6).Value = item.Amount;
                            worksheet.Cell(currRow, 7).Value = item.DistinctCount;
                            worksheet.Row(currRow).Height    = 20;
                        }
                        ++currRow;
                        worksheet.Row(currRow).Style.Alignment.SetHorizontal(XLAlignmentHorizontalValues.Center);
                        worksheet.Row(currRow).Style.Alignment.SetVertical(XLAlignmentVerticalValues.Center);
                        worksheet.Row(currRow).Height              = 25;
                        worksheet.Row(currRow).Style.Font.Bold     = true;
                        worksheet.Row(currRow).Style.Font.FontSize = 12;
                        worksheet.Cell(currRow, "E").SetFormulaA1("=SUM(E3:E" + (currRow - 1) + ")");
                        worksheet.Cell(currRow, "F").SetFormulaA1("=SUM(F3:F" + (currRow - 1) + ")");
                        worksheet.Cell(currRow, "G").SetFormulaA1("=SUM(G3:G" + (currRow - 1) + ")");
                        worksheet.Range(currRow, 1, currRow, 4).Merge().Value = "الاجــمـــالــي";
                        worksheet.Range(currRow, 1, currRow, 7).Style.Fill.BackgroundColor = XLColor.LightPastelPurple;
                        worksheet.Range(1, 1, currRow, 7).Style.Border.BottomBorder        = XLBorderStyleValues.Thick;
                        worksheet.Range(1, 1, currRow, 7).Style.Border.BottomBorderColor   = XLColor.Black;
                        worksheet.Range(1, 1, currRow, 7).Style.Border.LeftBorder          = XLBorderStyleValues.Thick;
                        worksheet.Range(1, 1, currRow, 7).Style.Border.LeftBorderColor     = XLColor.Black;
                        worksheet.Range(1, 1, currRow, 7).Style.Border.RightBorder         = XLBorderStyleValues.Thick;
                        worksheet.Range(1, 1, currRow, 7).Style.Border.RightBorderColor    = XLColor.Black;
                        worksheet.Range(1, 1, currRow, 7).Style.Border.TopBorder           = XLBorderStyleValues.Thick;
                        worksheet.Range(1, 1, currRow, 7).Style.Border.TopBorderColor      = XLColor.Black;
                        worksheet.Range(1, 1, currRow, 7).Style.Border.InsideBorder        = XLBorderStyleValues.Thin;
                        worksheet.Range(1, 1, currRow, 7).Style.Border.InsideBorderColor   = XLColor.LightGray;
                        using (var stream = new MemoryStream())
                        {
                            workbook.SaveAs(stream);
                            var content = stream.ToArray();
                            return(File(
                                       content,
                                       "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
                                       "Collection" + DateTime.Today.ToString("yyyyMMdd") + ".xlsx"
                                       ));
                        }
                    }
                }
            }
            var channels = new CommonCodeRepo(db).GetCodesByType("access.channel");
            var statuses = new CommonCodeRepo(db).GetCodesByType("Collection.Status");

            model.Channels = channels;
            model.Statuses = statuses;
            return(View("Collection", model));
        }
        public List <CollectionRpt> GetStatReport(CollectionRptQueryParam param)
        {
            #region Parameters
            param.Title = "تقرير احصائي يوضح اجمالي التحصيلات";
            var parameters  = new List <OracleParameter>();
            var whereCluase = new StringBuilder();
            if (param != null)
            {
                if (!string.IsNullOrEmpty(param.PosId))
                {
                    whereCluase.Append(" WHERE pos_id = :PosId");
                    var p = new OracleParameter {
                        ParameterName = "PosId", OracleDbType = OracleDbType.Varchar2, Value = param.PosId
                    };
                    parameters.Add(p);
                    param.Title += $"{Environment.NewLine} للرقم {param.PosId} ";
                }
                if (!string.IsNullOrEmpty(param.SubsNo))
                {
                    whereCluase.Append(whereCluase.Length > 0 ? " AND subs_no = :SubsNo" : " WHERE subs_no = :SubsNo");
                    var p = new OracleParameter {
                        ParameterName = "SubsNo", OracleDbType = OracleDbType.Varchar2, Value = param.SubsNo
                    };
                    parameters.Add(p);
                    param.Title += $"{Environment.NewLine} للمشترك {param.SubsNo} ";
                }
                if (!string.IsNullOrEmpty(param.ChannelId) && param.ChannelId != "-1")
                {
                    whereCluase.Append(whereCluase.Length > 0 ? " AND access_channel = :ChannelId" : " WHERE access_channel = :ChannelId");
                    var p = new OracleParameter {
                        ParameterName = "ChannelId", OracleDbType = OracleDbType.Varchar2, Value = param.ChannelId
                    };
                    parameters.Add(p);
                }
                if (!string.IsNullOrEmpty(param.StatusId) && param.StatusId != "-1")
                {
                    whereCluase.Append(whereCluase.Length > 0 ? " AND status = :StatusId" : " WHERE status = :StatusId");
                    var p = new OracleParameter {
                        ParameterName = "StatusId", OracleDbType = OracleDbType.Varchar2, Value = param.StatusId
                    };
                    parameters.Add(p);
                }
                if (param.StartDate > DateTime.MinValue && param.StartDate != null)
                {
                    whereCluase.Append(whereCluase.Length > 0 ? " AND createdon >= :StartDate" : " WHERE createdon >= :StartDate");
                    var p = new OracleParameter {
                        ParameterName = "StartDate", OracleDbType = OracleDbType.Date, Value = param.StartDate
                    };
                    parameters.Add(p);
                }
                if (param.EndDate > DateTime.MinValue && param.EndDate != null)
                {
                    whereCluase.Append(whereCluase.Length > 0 ? " AND createdon <= :EndDate" : " WHERE createdon <= :EndDate");
                    var p = new OracleParameter {
                        ParameterName = "EndDate", OracleDbType = OracleDbType.Date, Value = param.EndDate.AddDays(1)
                    };
                    parameters.Add(p);
                }
            }

            #endregion

            string strSql = string.Empty;
            if (param.LevelId == "pos")
            {
                param.Title += $"{Environment.NewLine}  للفترة من {param.StartDate.ToShortDateString()} الى {param.EndDate.ToShortDateString()}  " + "على مستوى نقطة البيع";
                strSql       = $"select  t.access_channel,t.access_channel_name, t.pos_id, t.pos_name,status, count(*) cnt, " +
                               $"sum(t.amount) amt,count(distinct t.pos_id) dist_cnt   from V_COLLECTION t {whereCluase}" +
                               $" group by t.access_channel, t.pos_id, t.pos_name,t.access_channel_name,status ";
            }
            else
            {
                param.Title += $"{Environment.NewLine}  للفترة من {param.StartDate.ToShortDateString()} الى {param.EndDate.ToShortDateString()}  " + "على مستوى اليوم";
                strSql       = $"select  t.access_channel,t.access_channel_name, to_char(createdon,'yyyy/mm/dd') d, count(*) cnt, sum(t.amount) amt,count(distinct t.pos_id) dist_cnt " +
                               $" ,status from V_COLLECTION t {whereCluase}" +
                               $" group by t.access_channel,to_char(createdon,'yyyy/mm/dd'),t.access_channel_name,status ";
            }

            DataTable masterDataTable;
            masterDataTable = db.GetData(strSql, parameters);

            if (masterDataTable == null)
            {
                return(null);
            }
            if (masterDataTable.Rows.Count == 0)
            {
                return(null);
            }

            var results = new List <CollectionRpt>();
            foreach (DataRow row in masterDataTable.Rows)
            {
                var obj = new CollectionRpt();
                obj.Amount        = row["amt"] == DBNull.Value ? 0 : double.Parse(row["amt"].ToString());
                obj.Count         = row["cnt"] == DBNull.Value ? 0 : int.Parse(row["cnt"].ToString());
                obj.DistinctCount = row["dist_cnt"] == DBNull.Value ? 0 : int.Parse(row["dist_cnt"].ToString());
                obj.Channel       = row["access_channel_name"] == DBNull.Value ? string.Empty : row["access_channel_name"].ToString();
                var statusId = row["status"] == DBNull.Value ? string.Empty : row["status"].ToString();
                obj.Status = new CommonCodeRepo(db).GetCodesById(statusId, "Collection.Status");
                if (param.LevelId == "pos")
                {
                    obj.Partner.Id   = row["pos_id"] == DBNull.Value ? string.Empty : row["pos_id"].ToString();
                    obj.Partner.Name = row["pos_name"] == DBNull.Value ? string.Empty : row["pos_name"].ToString();
                }
                else if (param.LevelId == "day")
                {
                    obj.CollDay = row["d"] == DBNull.Value ? string.Empty : row["d"].ToString();
                }
                results.Add(obj);
            }
            return(results);
        }