public static ReportTotalView GetView <TGroupBy>(this ReportTotalView reportTotalView, Dictionary <TGroupBy, List <TimeEntry> > dictionaryOfGroupsTimeEntries)
        {
            var groupByTypeId = reportTotalView.GroupByTypeId;
            var showColumnIds = reportTotalView.ShowColumnIds;

            var dateFormatId = reportTotalView.DateFormatId;
            var dateFrom     = reportTotalView.PeriodCell.DateFrom;
            var dateTo       = reportTotalView.PeriodCell.DateTo;

            reportTotalView.PeriodCell.DisplayNamePeriodValue = GetPeriodCellvalue(dateFrom, dateTo, dateFormatId);

            HideDisplayNamesByGroupingAndShowColumnsIds(reportTotalView);

            reportTotalView.GroupedItems = new List <ReportTotalForGroupTypeView>();

            foreach (var dictionaryOfGroupTimeEntries in dictionaryOfGroupsTimeEntries)
            {
                var reportItemsGroupByTypeView = new ReportTotalForGroupTypeView(groupByTypeId, showColumnIds, dateFormatId).GetView(dictionaryOfGroupTimeEntries);

                reportTotalView.TimeTotal.TimeActualTotal    += reportItemsGroupByTypeView.TimeTotalFor.TimeActualTotalFor;
                reportTotalView.TimeTotal.TimeEstimatedTotal += reportItemsGroupByTypeView.TimeTotalFor.TimeEstimatedTotalFor;
                reportTotalView.GroupedItems.Add(reportItemsGroupByTypeView);

                reportItemsGroupByTypeView.DisplayNames = reportTotalView.DisplayNames;
            }

            reportTotalView.TimeTotal.TimeEstimatedTotal = showColumnIds.Contains((int)ShowColumnModelIds.ShowEstimatedTime)
                ? reportTotalView.TimeTotal.TimeEstimatedTotal
                : null;

            return(reportTotalView);
        }
        private void CreateRowsOfListOfHeaders(ReportTotalForGroupTypeView groupedItems, ISheet sheet, XSSFWorkbook workbook)
        {
            var listOfHeaders = new List <string>();

            if (groupedItems.DisplayNames.DisplayNameDate != null)
            {
                listOfHeaders.Add(groupedItems.DisplayNames.DisplayNameDate);
            }

            if (groupedItems.DisplayNames.DisplayNameClient != null)
            {
                listOfHeaders.Add(groupedItems.DisplayNames.DisplayNameClient);
            }

            if (groupedItems.DisplayNames.DisplayNameProject != null)
            {
                listOfHeaders.Add(groupedItems.DisplayNames.DisplayNameProject);
            }

            if (groupedItems.DisplayNames.DisplayNameMember != null)
            {
                listOfHeaders.Add(groupedItems.DisplayNames.DisplayNameMember);
            }

            listOfHeaders.Add(groupedItems.DisplayNames.DisplayNameTask);
            if (groupedItems.DisplayNames.DisplayNameTimeFrom != null)
            {
                listOfHeaders.Add(groupedItems.DisplayNames.DisplayNameTimeFrom);
            }

            if (groupedItems.DisplayNames.DisplayNameTimeTo != null)
            {
                listOfHeaders.Add(groupedItems.DisplayNames.DisplayNameTimeTo);
            }

            listOfHeaders.Add(groupedItems.DisplayNames.DisplayNameTimeActual);
            if (groupedItems.DisplayNames.DisplayNameTimeEstimated != null)
            {
                listOfHeaders.Add(groupedItems.DisplayNames.DisplayNameTimeEstimated);
            }

            if (groupedItems.DisplayNames.DisplayNameNotes != null)
            {
                listOfHeaders.Add(groupedItems.DisplayNames.DisplayNameNotes);
            }

            var rowListOfHeaders = sheet.CreateRow(RowIndex);

            for (var i = 0; i < listOfHeaders.Count; i++)
            {
                var cellHeader = rowListOfHeaders.CreateCell(i);
                cellHeader.SetCellValue(listOfHeaders[i]);
                cellHeader.CellStyle = CreateHeadersStyle(workbook);
            }
        }
        private void CreateRowOfGroupByType(ISheet sheet, ReportTotalForGroupTypeView groupedItems, XSSFWorkbook workbook)
        {
            sheet.AddMergedRegion(new CellRangeAddress(RowIndex, RowIndex, 0, 1));

            var rowGroupByType   = sheet.CreateRow(RowIndex);
            var valueGroupByType = groupedItems.GroupByType.GroupByTypeDisplayName?.ToUpper() + groupedItems.GroupByType.GroupByTypeDisplayNameValue?.ToUpper();

            var cellGroupByType = rowGroupByType.CreateCell(0);

            cellGroupByType.SetCellValue(valueGroupByType);
            cellGroupByType.CellStyle = CreateGroupByTotalStyle(workbook);
        }
        private void SetWidthForEachTypeOfColumn(ReportTotalForGroupTypeView groupedItems, ISheet sheet)
        {
            var сountColumnsOfFirstSize  = 0; // Date, Client, Project, Member.
            var сountColumnsOfSecondSize = 0; // Start, Finish, Act, Est
            var сountColumnsOfThirdSize  = 0; // Notes

            //var listOfHeaders = new List<string>();
            if (groupedItems.DisplayNames.DisplayNameDate != null)
            {
                ++сountColumnsOfFirstSize;
            }

            if (groupedItems.DisplayNames.DisplayNameClient != null)
            {
                ++сountColumnsOfFirstSize;
            }

            if (groupedItems.DisplayNames.DisplayNameProject != null)
            {
                ++сountColumnsOfFirstSize;
            }

            if (groupedItems.DisplayNames.DisplayNameMember != null)
            {
                ++сountColumnsOfFirstSize;
            }

            //listOfHeaders.Add(groupedItems.DisplayNames.DisplayNameTask);
            if (groupedItems.DisplayNames.DisplayNameTimeFrom != null)
            {
                ++сountColumnsOfSecondSize;
            }

            if (groupedItems.DisplayNames.DisplayNameTimeTo != null)
            {
                ++сountColumnsOfSecondSize;
            }

            //listOfHeaders.Add(groupedItems.DisplayNames.DisplayNameTimeActual);
            if (groupedItems.DisplayNames.DisplayNameTimeEstimated != null)
            {
                ++сountColumnsOfSecondSize;
            }

            if (groupedItems.DisplayNames.DisplayNameNotes != null)
            {
                ++сountColumnsOfThirdSize;
            }

            SetWidthForEachTypeOfColumn(sheet, сountColumnsOfFirstSize, сountColumnsOfSecondSize, сountColumnsOfThirdSize);
        }
        private void CreateRowOfTotalFor(ISheet sheet, ReportTotalForGroupTypeView groupedItems, XSSFWorkbook workbook)
        {
            sheet.AddMergedRegion(new CellRangeAddress(RowIndex, RowIndex, 0, 1));

            var rowTotalFor = sheet.CreateRow(RowIndex);
            var cellIndex   = 0;

            var cellValueTotalFor = groupedItems.TimeTotalFor.DisplayNameTimeActualTotalFor.ToUpper() + groupedItems.GroupByType.GroupByTypeDisplayNameValue?.ToUpper();

            CreateCellItem(workbook, rowTotalFor, ref cellIndex, cellValueTotalFor, CreateFontColorAqua(workbook));

            if (groupedItems.DisplayNames.DisplayNameDate != null || groupedItems.GroupByTypeId == (int)Constants.ReportsGroupByIds.Date)
            {
                rowTotalFor.CreateCell(++cellIndex).SetCellValue(string.Empty);
            }

            rowTotalFor.CreateCell(++cellIndex).SetCellValue(string.Empty);
            rowTotalFor.CreateCell(++cellIndex).SetCellValue(string.Empty);
            if (groupedItems.DisplayNames.DisplayNameTimeFrom != null)
            {
                rowTotalFor.CreateCell(++cellIndex).SetCellValue(string.Empty);
            }

            if (groupedItems.DisplayNames.DisplayNameTimeTo != null)
            {
                rowTotalFor.CreateCell(++cellIndex).SetCellValue(string.Empty);
            }

            // 1
            var cellValueActTotal = ConvertModelToView.UpdateTimeFormatForValue(groupedItems.TimeTotalFor.TimeActualTotalFor.ToString());

            CreateCellItem(workbook, rowTotalFor, ref cellIndex, cellValueActTotal, CreateFontBold(workbook));

            // 2
            if (groupedItems.DisplayNames.DisplayNameTimeEstimated != null)
            {
                var cellValueEstTotal = groupedItems.TimeTotalFor.TimeEstimatedTotalFor == 0
                    ? null
                    : ConvertModelToView.UpdateTimeFormatForValue(groupedItems.TimeTotalFor.TimeEstimatedTotalFor.ToString());

                CreateCellItem(workbook, rowTotalFor, ref cellIndex, cellValueEstTotal, CreateFontBold(workbook));
            }

            if (groupedItems.DisplayNames.DisplayNameNotes != null)
            {
                rowTotalFor.CreateCell(++cellIndex).SetCellValue(string.Empty);
            }
        }
        private void CreateRowOfItems(ReportTotalView reportTotalView, ReportTotalForGroupTypeView groupedItems, ReportItemsView groupedItem, ISheet sheet, XSSFWorkbook workbook)
        {
            var rowListOfValues = sheet.CreateRow(RowIndex);
            var cellIndex       = 0;

            if (groupedItems.DisplayNames.DisplayNameDate != null)
            {
                var cellValue = ConvertModelToView.UpdateDateFormat(groupedItem.Date, reportTotalView.DateFormatId);

                CreateCellItem(workbook, rowListOfValues, ref cellIndex, cellValue, CreateDefaultFont(workbook));
            }

            if (groupedItems.DisplayNames.DisplayNameClient != null)
            {
                CreateCellItem(workbook, rowListOfValues, ref cellIndex, groupedItem.ClientName, CreateDefaultFont(workbook));
            }

            if (groupedItems.DisplayNames.DisplayNameProject != null)
            {
                CreateCellItem(workbook, rowListOfValues, ref cellIndex, groupedItem.ProjectName, CreateDefaultFont(workbook));
            }

            if (groupedItems.DisplayNames.DisplayNameMember != null)
            {
                CreateCellItem(workbook, rowListOfValues, ref cellIndex, groupedItem.MemberName, CreateDefaultFont(workbook));
            }

            CreateCellItem(workbook, rowListOfValues, ref cellIndex, groupedItem.TaskName, CreateDefaultFont(workbook));

            // 1
            if (groupedItems.DisplayNames.DisplayNameTimeFrom != null)
            {
                var cellValue = groupedItem.TimeValues.TimeFrom == 0
                    ? null
                    : ConvertModelToView.UpdateTimeFormatForValue(groupedItem.TimeValues.TimeFrom.ToString());

                CreateCellItem(workbook, rowListOfValues, ref cellIndex, cellValue, CreateDefaultFont(workbook));
            }
            // 2
            if (groupedItems.DisplayNames.DisplayNameTimeTo != null)
            {
                var cellValue = groupedItem.TimeValues.TimeTo == 0
                    ? null
                    : ConvertModelToView.UpdateTimeFormatForValue(groupedItem.TimeValues.TimeTo.ToString());

                CreateCellItem(workbook, rowListOfValues, ref cellIndex, cellValue, CreateDefaultFont(workbook));
            }

            // 3
            var cellActValue = ConvertModelToView.UpdateTimeFormatForValue(groupedItem.TimeValues.TimeActual.ToString());

            CreateCellItem(workbook, rowListOfValues, ref cellIndex, cellActValue, CreateDefaultFont(workbook));

            // 4
            if (groupedItems.DisplayNames.DisplayNameTimeEstimated != null)
            {
                var cellValue = groupedItem.TimeValues.TimeEstimated == 0
                    ? null
                    : ConvertModelToView.UpdateTimeFormatForValue(groupedItem.TimeValues.TimeEstimated.ToString());

                CreateCellItem(workbook, rowListOfValues, ref cellIndex, cellValue, CreateDefaultFont(workbook));
            }

            if (groupedItems.DisplayNames.DisplayNameNotes != null)
            {
                CreateCellItem(workbook, rowListOfValues, ref cellIndex, groupedItem.Notes, CreateDefaultFont(workbook));
            }
        }
        private static ReportTotalForGroupTypeView GetView <TGroupBy>(this ReportTotalForGroupTypeView reportTotalForGroupTypeView, KeyValuePair <TGroupBy, List <TimeEntry> > dictionaryOfGroupTimeEntries)
        {
            var groupByTypeId = reportTotalForGroupTypeView.GroupByTypeId;
            var showColumnIds = reportTotalForGroupTypeView.ShowColumnIds;

            var reportTimeTotalForItemsView = new ReportTotalForView(groupByTypeId, showColumnIds).GetView(dictionaryOfGroupTimeEntries.Value);

            switch (dictionaryOfGroupTimeEntries.Key)
            {
            case Project project:
            {
                reportTotalForGroupTypeView.GroupByType.ProjectId   = project.Id;
                reportTotalForGroupTypeView.GroupByType.ProjectName = project.Name;

                reportTotalForGroupTypeView.GroupByType.GroupByTypeDisplayName      = reportTotalForGroupTypeView.DisplayNames.DisplayNameProject + ": ";
                reportTotalForGroupTypeView.GroupByType.GroupByTypeDisplayNameValue = project.Name;
                //reportTimeTotalForItemsView.DisplayNames.DisplayNameProject = reportTimeTotalForItemsView.GroupByTypeId == (int)ReportsGroupBy.Project ? null : reportTimeTotalForItemsView.DisplayNames.DisplayNameProject;

                break;
            }

            case Member member:
            {
                reportTotalForGroupTypeView.GroupByType.MemberId   = member.Id;
                reportTotalForGroupTypeView.GroupByType.MemberName = member.FullName;

                reportTotalForGroupTypeView.GroupByType.GroupByTypeDisplayName      = reportTotalForGroupTypeView.DisplayNames.DisplayNameMember + ": ";
                reportTotalForGroupTypeView.GroupByType.GroupByTypeDisplayNameValue = member.FullName;
                //reportTimeTotalForItemsView.DisplayNames.DisplayNameMember = reportTimeTotalForItemsView.GroupByTypeId == (int)ReportsGroupBy.Member ? null : reportTimeTotalForItemsView.DisplayNames.DisplayNameMember;

                break;
            }

            case DateTime dateTime:
            {
                reportTotalForGroupTypeView.GroupByType.Date = dateTime;

                reportTotalForGroupTypeView.GroupByType.GroupByTypeDisplayName      = reportTotalForGroupTypeView.DisplayNames.DisplayNameDate + ": ";
                reportTotalForGroupTypeView.GroupByType.GroupByTypeDisplayNameValue = UpdateDateFormat(dateTime, reportTotalForGroupTypeView.DateFormatId);
                //reportTimeTotalForItemsView.DisplayNames.DisplayNameDate = reportTimeTotalForItemsView.GroupByTypeId == (int)ReportsGroupBy.Date ? null : reportTimeTotalForItemsView.DisplayNames.DisplayNameDate;

                break;
            }

            case Client client:
            {
                reportTotalForGroupTypeView.GroupByType.ClientId   = client.Id;
                reportTotalForGroupTypeView.GroupByType.ClientName = client.Name;

                reportTotalForGroupTypeView.GroupByType.GroupByTypeDisplayName      = client.Id == WithoutClient.Id ? null : reportTotalForGroupTypeView.DisplayNames.DisplayNameClient + ": ";
                reportTotalForGroupTypeView.GroupByType.GroupByTypeDisplayNameValue = client.Name;
                //reportTimeTotalForItemsView.DisplayNames.DisplayNameClient = reportTimeTotalForItemsView.GroupByTypeId == (int)ReportsGroupBy.Client ? null : reportTimeTotalForItemsView.DisplayNames.DisplayNameClient;

                break;
            }
            }

            //reportTotalForGroupTypeView.DisplayNames = reportTimeTotalForItemsView.DisplayNames;
            reportTotalForGroupTypeView.TimeTotalFor = reportTimeTotalForItemsView.TimeTotalFor;
            reportTotalForGroupTypeView.Items        = reportTimeTotalForItemsView.Items;

            return(reportTotalForGroupTypeView);
        }