示例#1
0
 private void GenerateFooters(StringBuilder text, ReportGrouping grouping, List <ReportColumn> columns, Separators separators)
 {
     GenerateFooterSum(text, grouping, columns, separators);
     GenerateFooterAverage(text, grouping, columns, separators);
     GenerateFooterNpv(text, grouping, columns, separators);
     GenerateFooterIrr(text, grouping, columns, separators);
 }
示例#2
0
        public string Generate(ReportGrouping grouping, ReportFormat format)
        {
            var columns = GenerateColumns().ToList();

            if (columns.Count == 0)
            {
                return(string.Empty);
            }

            switch (format)
            {
            case ReportFormat.Markdown:
                return(GenerateNotes(format, Separators.None) + GenerateMarkdown(grouping, columns));

            case ReportFormat.Csv:
                return(GenerateNotes(format, Separators.Csv) + GenerateCsv(grouping, columns));

            case ReportFormat.ParametersCsv:
                return(GenerateNotes(format, Separators.None) + GenerateParameters(columns, Separators.Csv));

            case ReportFormat.ParametersMarkdown:
                return(GenerateNotes(format, Separators.None) + GenerateParameters(columns, Separators.Markdown));

            default:
                throw new ArgumentOutOfRangeException(nameof(format), format, null);
            }
        }
示例#3
0
 private void GenerateCalculated(ReportGrouping grouping, List <ReportColumn> columns)
 {
     foreach (var column in columns)
     {
         column.Calculate(grouping, (double)DiscountRatePerYear);
     }
 }
示例#4
0
        private string GenerateCsv(ReportGrouping grouping, List <ReportColumn> columns)
        {
            var text = new StringBuilder();

            GenerateHeaders(text, grouping, columns, Separators.Csv);
            GenerateData(text, grouping, columns, Separators.Csv);
            GenerateCalculated(grouping, columns);
            GenerateFooters(text, grouping, columns, Separators.Csv);
            return(text.ToString());
        }
示例#5
0
        private void GenerateMarkdownAlignment(StringBuilder text, ReportGrouping grouping, List <ReportColumn> columns)
        {
            text.Append(Separators.Markdown.First);

            var first = true;

            switch (grouping)
            {
            case ReportGrouping.Monthly:
            case ReportGrouping.Yearly:
                text.Append(" ---: ");
                first = false;
                break;

            case ReportGrouping.NotGrouped:
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(grouping), grouping.ToString());
            }

            foreach (var column in columns)
            {
                if (first)
                {
                    first = false;
                }
                else
                {
                    text.Append(Separators.Markdown.Middle);
                }
                switch (column.Alignment)
                {
                case ReportColumnAlignment.Left:
                    text.Append(" :--- ");
                    break;

                case ReportColumnAlignment.Right:
                    text.Append(" ---: ");
                    break;

                case ReportColumnAlignment.Center:
                    text.Append(" :---: ");
                    break;

                default:
                    throw new ArgumentOutOfRangeException(nameof(column.Alignment), column.Alignment.ToString());
                }
            }

            text.AppendLine(Separators.Markdown.Last);
        }
示例#6
0
        private void GenerateData(StringBuilder text, ReportGrouping grouping, List <ReportColumn> columns, Separators separators)
        {
            var groups = GetGroups(grouping).ToList();

            foreach (var group in groups)
            {
                var first = true;
                text.Append(separators.First);
                switch (grouping)
                {
                case ReportGrouping.Monthly:
                    text.Append($"{group.Period}");
                    first = false;
                    break;

                case ReportGrouping.Yearly:
                    text.Append($"{group.Period}");
                    first = false;
                    break;

                case ReportGrouping.NotGrouped:
                    break;

                default:
                    throw new ArgumentOutOfRangeException(nameof(grouping), grouping.ToString());
                }

                foreach (var column in columns)
                {
                    if (first)
                    {
                        first = false;
                    }
                    else
                    {
                        text.Append(separators.Middle);
                    }
                    text.Append($"{column.FormatValue(group.GetValue(column))}");
                    column.Accumulate(group);
                }

                text.AppendLine(separators.Last);
            }
        }
示例#7
0
        public ReducedEntryMeans(ReportGrouping reportGrouping, Dictionary <string, BaseBand> bands, string analysisType, List <string> observations)
        {
            this.reportGrouping = reportGrouping;
            AnalysisTypeDefinition atType = AnalysisTypeDefinition.Get(analysisType);

            if (atType != null)
            {
                foreach (string field in atType.Fields)
                {
                    analysisTypeFields.Add(field);
                }
            }
            this.bands = new Dictionary <string, BaseBand>(bands);
            if (observations.Count == 0)
            {
                throw new ArgumentOutOfRangeException("at least one observation needs to be supplied.");
            }
            this.observations = new HashSet <string>(observations);
        }
示例#8
0
        private void GenerateFooterSum(StringBuilder text, ReportGrouping grouping, List <ReportColumn> columns, Separators separators)
        {
            if (!columns.Any(c => c.CalculateSum))
            {
                return;
            }

            var first = true;

            text.Append(separators.First);
            switch (grouping)
            {
            case ReportGrouping.Monthly:
            case ReportGrouping.Yearly:
                text.Append("Sum");
                first = false;
                break;

            case ReportGrouping.NotGrouped:
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(grouping), grouping.ToString());
            }

            foreach (var column in columns)
            {
                if (first)
                {
                    first = false;
                }
                else
                {
                    text.Append(separators.Middle);
                }
                if (column.CalculateSum)
                {
                    text.Append($"{column.FormatValue(column.Sum)}");
                }
            }

            text.AppendLine(separators.Last);
        }
示例#9
0
        public void Calculate(ReportGrouping grouping, double discountRatePerYear)
        {
            // The underlying data is always monthly
            var discountRate = grouping == ReportGrouping.Yearly ? discountRatePerYear : Financial.ConvertDiscountRateYearToMonth(discountRatePerYear);

            if (CalculateNpv)
            {
                Npv = (decimal)Financials.Npv.Calculate(_cashFlows, discountRate);
            }
            if (CalculateIrr)
            {
                var irr = Financials.Irr.Calculate(_cashFlows, discountRate);
                Irr = double.IsNaN(irr) ? 0m : (decimal)irr;
            }

            // If we ask for yearly, convert the resulting IRR
            if (grouping == ReportGrouping.Monthly)
            {
                Irr = Financial.ConvertDiscountRateMonthToYear(Irr);
            }
        }
示例#10
0
        private IEnumerable <ReportGroup <T> > GetGroups(ReportGrouping grouping)
        {
            switch (grouping)
            {
            case ReportGrouping.Monthly:
                var month = 0;
                foreach (var group in _data.Select(c => new ReportGroup <T>(c, month++)))
                {
                    yield return(group);
                }

                break;

            case ReportGrouping.Yearly:
                if (_data.Count > 0)
                {
                    var year = 0;
                    yield return(new ReportGroup <T>(_data[0], year++));

                    const int size = 12;
                    for (var i = 1; i < _data.Count; i += size)
                    {
                        yield return(new ReportGroup <T>(_data.GetRange(i, Math.Min(size, _data.Count - i)), year++));
                    }
                }

                break;

            case ReportGrouping.NotGrouped:
                foreach (var group in _data.Select(c => new ReportGroup <T>(c)))
                {
                    yield return(group);
                }

                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(grouping), grouping.ToString());
            }
        }
示例#11
0
        private void GenerateHeaders(StringBuilder text, ReportGrouping grouping, List <ReportColumn> columns, Separators separators)
        {
            var first = true;

            text.Append(separators.First);
            switch (grouping)
            {
            case ReportGrouping.Monthly:
                text.Append("Month");
                first = false;
                break;

            case ReportGrouping.Yearly:
                text.Append("Year");
                first = false;
                break;

            case ReportGrouping.NotGrouped:
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(grouping), grouping.ToString());
            }

            foreach (var column in columns)
            {
                if (first)
                {
                    first = false;
                }
                else
                {
                    text.Append(separators.Middle);
                }
                text.Append($"{column.Name}");
            }

            text.AppendLine(separators.Last);
        }
示例#12
0
 /// <inheritdoc />
 public virtual string GenerateReport(ReportGrouping grouping, ReportFormat format)
 => Report.Generate(grouping, format);