public FinalReport AssemblePersonnelsAndProjects(ReportParametersJson parametres)
        {
            var result = new FinalReport();

            UnitOfWork       uow              = new UnitOfWork();
            var              currentUser      = new UserHelper().GetCurrent();
            TimeSheetManager TimeSheetManager = new TimeSheetManager(uow);
            UserManager      userManager      = new UserManager(uow);
            DateTime         from             = DateUtility.GetMiladiDate(parametres.FromDate);
            DateTime         to = DateUtility.GetMiladiDate(parametres.ToDate);

            var workHours = TimeSheetManager.GetByUserIdsAndProjectIds(parametres.UserIds, parametres.ProjetIds, from, to);



            //سطر ها


            foreach (var group in workHours.GroupBy(x => x.EmployeeID))
            {
                var row = new ReportRow();
                row.ID    = group.First().EmployeeID;
                row.Title = group.First().Employee.UserTitle;
                result.Rowes.Add(row);
            }

            var SumTotal = new ReportRow();

            SumTotal.ID    = Guid.NewGuid();
            SumTotal.Title = "جمع کل";
            result.Rowes.Add(SumTotal);


            //ستون ها

            foreach (var wh in workHours.GroupBy(x => x.ProjectId).Select(y => y.FirstOrDefault()).ToList())
            {
                var field = new Field();
                field.ID    = wh.ProjectId;
                field.Title = wh.Project.Title;
                result.Fields.Add(field);

                foreach (var row in result.Rowes)
                {
                    if (row.Title == "جمع کل")
                    {
                        var sumWorkHour           = workHours.Where(x => x.ProjectId == wh.ProjectId).Sum(x => x.Hours);
                        var fieldValuesumWorkHour = new FieldValue();
                        fieldValuesumWorkHour.CalculativeValue = sumWorkHour;
                        fieldValuesumWorkHour.FieldId          = field.ID;
                        fieldValuesumWorkHour.RowId            = row.ID;
                        fieldValuesumWorkHour.Value            = DateUtility.ConvertToTimeSpan(sumWorkHour);
                        row.Values.Add(fieldValuesumWorkHour);
                    }
                    else
                    {
                        var sumWorkHour           = workHours.Where(x => x.EmployeeID == row.ID && x.ProjectId == wh.ProjectId).Sum(x => x.Hours);
                        var fieldValuesumWorkHour = new FieldValue();
                        fieldValuesumWorkHour.CalculativeValue = sumWorkHour;
                        fieldValuesumWorkHour.FieldId          = field.ID;
                        fieldValuesumWorkHour.RowId            = row.ID;
                        fieldValuesumWorkHour.Value            = DateUtility.ConvertToTimeSpan(sumWorkHour);
                        row.Values.Add(fieldValuesumWorkHour);
                    }
                }
            }

            var Aggregation = new Field();

            Aggregation.Title = "جمع کل";
            Aggregation.ID    = Guid.NewGuid();
            result.Fields.Add(Aggregation);

            var PresenceTotal = new Field();

            PresenceTotal.Title = "جمع حضور";
            PresenceTotal.ID    = Guid.NewGuid();
            result.Fields.Add(PresenceTotal);

            var DifferenceTotal = new Field();

            DifferenceTotal.Title = "جمع اختلاف";
            DifferenceTotal.ID    = Guid.NewGuid();
            result.Fields.Add(DifferenceTotal);

            foreach (var row in result.Rowes)
            {
                //توسعه
                var sumworkHour   = row.Values.Sum(y => y.CalculativeValue);
                var fildvalueWork = new FieldValue();
                fildvalueWork.FieldId = Guid.NewGuid();
                fildvalueWork.RowId   = row.ID;
                fildvalueWork.Value   = DateUtility.ConvertToTimeSpan(sumworkHour);
                row.Values.Add(fildvalueWork);

                if (userManager.GetByID(row.ID) != null)
                {
                    var user              = userManager.GetByID(row.ID);
                    var sumPresenceHour   = TimeSheetManager.GetPresHoursByUser(user, from, to).ToList().Sum(x => x.Hours);
                    var fildvaluePresence = new FieldValue();
                    fildvaluePresence.FieldId = Guid.NewGuid();
                    fildvaluePresence.RowId   = row.ID;
                    fildvaluePresence.Value   = DateUtility.ConvertToTimeSpan(sumPresenceHour);
                    row.Values.Add(fildvaluePresence);
                    var fildvalueDifference = new FieldValue();
                    fildvalueDifference.FieldId = Guid.NewGuid();
                    fildvalueDifference.RowId   = row.ID;
                    fildvalueDifference.Value   = DateUtility.ConvertToTimeSpan(sumPresenceHour - sumworkHour);
                    row.Values.Add(fildvalueDifference);
                }
                else
                {
                    double sumPresenceHourTotal = 0;
                    foreach (var userIds in parametres.UserIds)
                    {
                        var user = userManager.GetByID(userIds);
                        sumPresenceHourTotal += TimeSheetManager.GetPresHoursByUser(user, from, to).ToList().Sum(x => x.Hours);
                    }

                    var fildvaluePresenceTotal = new FieldValue();
                    fildvaluePresenceTotal.FieldId = Guid.NewGuid();
                    fildvaluePresenceTotal.RowId   = row.ID;
                    fildvaluePresenceTotal.Value   = DateUtility.ConvertToTimeSpan(sumPresenceHourTotal);
                    row.Values.Add(fildvaluePresenceTotal);

                    var fildvalueDifferencTotale = new FieldValue();
                    fildvalueDifferencTotale.FieldId = Guid.NewGuid();
                    fildvalueDifferencTotale.RowId   = row.ID;
                    fildvalueDifferencTotale.Value   = DateUtility.ConvertToTimeSpan(sumPresenceHourTotal - sumworkHour);
                    row.Values.Add(fildvalueDifferencTotale);
                }
            }



            result.HeaderTitle      = "گزارش پروژه ها به تفکیک ماه";
            result.FirstColumnTitle = "نام شخص";
            return(result);
        }