< Summary

Information
Class: Services.ParserServices.FielParsers.ExcelExporterBuilder
Assembly: Services
File(s): /home/runner/work/Studio2Prod/Studio2Prod/AppRepository/ParserServices/FielParsers/ExcelExporterBuilder.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 127
Coverable lines: 127
Total lines: 207
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 56
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor()0%342180%
WithOrders(...)100%210%
WithColumnsToExport(...)100%210%
WithColumnSums(...)100%210%
Build()100%210%
BuildTable(...)0%930300%
ApplyColumnFormats(...)0%2040%
AddColumnSums(...)0%2040%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/AppRepository/ParserServices/FielParsers/ExcelExporterBuilder.cs

#LineLine coverage
 1using OfficeOpenXml;
 2using OzonDomains.Models;
 3
 4namespace Services.ParserServices.FielParsers
 5{
 6    public class ExcelExporterBuilder
 7    {
 8        private List<Order> _orders = null!;
 9        private List<string> _columnsToExport = null!;
 10        private Dictionary<string, Func<Order, object?>> _columnMappings;
 11        private List<string> _columnsToSum = null!;
 12
 013        public Dictionary<string, string> ColumnFormats = new Dictionary<string, string>
 014        {
 015            { "Номер заказа", "@" },
 016            { "Клиент", "@" },
 017            { "Принят в обработку", "dd.MM.yyyy HH:mm" },
 018            { "Дата отгрузки", "dd.MM.yyyy HH:mm" },
 019            { "Срок доставки", @"d' д. 'hh' ч.'mm' мин.'" },
 020            { "Статус клиента", "@" },
 021            { "Статус", "@" },
 022            { "Наименование товара", "@" },
 023            { "Артикул", "@" },
 024            { "ЧистыйАртикул", "@" },
 025            { "Производитель", "@" },
 026            { "Склад отгрузки", "@" },
 027            { "Поставщик", "@" },
 028            { "Номер заказа поставщику", "@" },
 029            { "Цена сайта", "#,##0.00" },
 030            { "Цена", "#,##0.00" },
 031            { "Количество", "#,##0.00" },
 032            { "Сумма отправления", "#,##0.00" },
 033            { "Категория", "@" },
 034            { "Объемный вес", "#,##0.00" },
 035            { "Цена закупки", "#,##0.00" },
 036            { "Себестоимость", "#,##0.00" },
 037            { "Комиссия ОЗОН (мин.)", "#,##0.00" },
 038            { "Комиссия ОЗОН (макс.)", "#,##0.00" },
 039            { "Прибыль (мин.)", "#,##0.00" },
 040            { "Прибыль (макс.)", "#,##0.00" },
 041            { "Наценка % (мин.)", "#,##0.00" },
 042            { "Наценка % (макс.)", "#,##0.00" },
 043            { "Город доставки", "@" },
 044            { "Цена закупки до перевода", "#,##0.00" },
 045            { "Сумма закупки (вал)", "#,##0.00" },
 046            { "Валюта", "@" }
 047        };
 48
 49
 050        public ExcelExporterBuilder()
 51        {
 052            _columnMappings = new Dictionary<string, Func<Order, object?>>
 053            {
 054                { "Номер заказа", order => order.ShipmentNumber },
 055                { "Клиент", order => order.OzonClient?.Name },
 056                { "Принят в обработку", order => order.FullFormattedProcessingDate },
 057                { "Дата отгрузки", order => order.FullFormattedShippingDate },
 058                { "Срок доставки", order => order.FormattedDeliveryPeriod },
 059                { "Статус клиента", order => order.Status },
 060                { "Статус", order => order.AppStatus?.Name },
 061                { "Наименование товара", order => order.ProductName },
 062                { "Артикул", order => order.Article },
 063                { "ЧистыйАртикул", order => order.CleanedArticle },
 064                { "Производитель", order => order.Manufacturer?.Name },
 065                { "Склад отгрузки", order => order.ShipmentWarehouse?.Name },
 066                { "Поставщик", order => order.Supplier?.Name },
 067                { "Номер заказа поставщику", order => order.OrderNumberToSupplier },
 068                { "Цена сайта", order => order.ProductInfo?.CurrentPriceWithDiscount },
 069                { "Цена", order => order.Price },
 070                { "Количество", order => order.Quantity },
 071                { "Сумма отправления", order => order.ShipmentAmount },
 072                { "Категория", order => order.ProductInfo?.CommercialCategory },
 073                { "Объемный вес", order => order.ProductInfo?.VolumetricWeight },
 074                { "Цена закупки", order => order.PurchasePrice },
 075                { "Себестоимость", order => order.CostPrice },
 076                { "Комиссия ОЗОН (мин.)", order => order.MinOzonCommission },
 077                { "Комиссия ОЗОН (макс.)", order => order.MaxOzonCommission },
 078                { "Прибыль (мин.)", order => order.MinProfit },
 079                { "Прибыль (макс.)", order => order.MaxProfit },
 080                { "Наценка % (мин.)", order => order.MinDiscount },
 081                { "Наценка % (макс.)", order => order.MaxDiscount },
 082                { "Город доставки", order => order.DeliveryCity },
 083                { "Цена закупки до перевода", order => order.OriginalPurchasePrice },
 084                { "Сумма закупки (вал)", order => (order.OriginalPurchasePrice ?? 0) * (order.Quantity ?? 0) },
 085                { "Валюта", order => order.Сurrency?.Name }
 086            };
 087            _columnsToExport = _columnMappings.Keys.ToList();
 088            _columnsToSum = new List<string>();
 089        }
 90
 91        public ExcelExporterBuilder WithOrders(List<Order> orders)
 92        {
 093            _orders = orders;
 094            return this;
 95        }
 96
 97        public ExcelExporterBuilder WithColumnsToExport(List<string> columns)
 98        {
 099            _columnsToExport = columns;
 0100            return this;
 101        }
 102
 103        public ExcelExporterBuilder WithColumnSums(List<string> columnsToSum)
 104        {
 0105            _columnsToSum = columnsToSum;
 0106            return this;
 107        }
 108
 109        public byte[] Build()
 110        {
 0111            using (var package = new ExcelPackage())
 112            {
 0113                var worksheet = package.Workbook.Worksheets.Add("Orders");
 114
 0115                BuildTable(worksheet);
 0116                AddColumnSums(worksheet);
 117
 0118                worksheet.Cells.AutoFitColumns();
 119
 0120                return package.GetAsByteArray();
 121            }
 0122        }
 123
 124        private void BuildTable(ExcelWorksheet worksheet)
 125        {
 0126            int colIndex = 1;
 127
 0128            for (int i = 0; i < _columnsToExport.Count; i++)
 129            {
 0130                var columnName = _columnsToExport[i];
 131
 0132                if (columnName == "Комиссия ОЗОН" || columnName == "Прибыль" || columnName == "Наценка %")
 133                {
 0134                    worksheet.Cells[1, colIndex].Value = columnName + " (мин.)";
 0135                    colIndex++;
 0136                    worksheet.Cells[1, colIndex].Value = columnName + " (макс.)";
 0137                    colIndex++;
 138                }
 139                else
 140                {
 0141                    worksheet.Cells[1, colIndex].Value = columnName;
 0142                    colIndex++;
 143                }
 144            }
 145
 0146            int row = 2;
 0147            foreach (var order in _orders)
 148            {
 0149                colIndex = 1;
 0150                foreach (var columnName in _columnsToExport)
 151                {
 0152                    if (columnName == "Комиссия ОЗОН" || columnName == "Прибыль" || columnName == "Наценка %")
 153                    {
 0154                        if (_columnMappings.TryGetValue(columnName + " (мин.)", out var getMinValue) && getMinValue != n
 155                        {
 0156                            worksheet.Cells[row, colIndex].Value = getMinValue(order);
 0157                            colIndex++;
 158                        }
 159
 0160                        if (_columnMappings.TryGetValue(columnName + " (макс.)", out var getMaxValue) && getMaxValue != 
 161                        {
 0162                            worksheet.Cells[row, colIndex].Value = getMaxValue(order);
 0163                            colIndex++;
 164                        }
 165                    }
 0166                    else if (_columnMappings.TryGetValue(columnName, out var getValue) && getValue != null)
 167                    {
 0168                        worksheet.Cells[row, colIndex].Value = getValue(order);
 0169                        colIndex++;
 170                    }
 171                }
 172
 0173                row++;
 174            }
 175
 0176            ApplyColumnFormats(worksheet, row);
 0177        }
 178
 179        private void ApplyColumnFormats(ExcelWorksheet worksheet, int totalRows)
 180        {
 0181            for (int colIndex = 1; colIndex <= _columnsToExport.Count; colIndex++)
 182            {
 0183                var columnName = _columnsToExport[colIndex - 1];
 0184                if (ColumnFormats.TryGetValue(columnName, out var format))
 185                {
 0186                    worksheet.Cells[2, colIndex, totalRows, colIndex].Style.Numberformat.Format = format;
 187                }
 188            }
 0189        }
 190
 191        private void AddColumnSums(ExcelWorksheet worksheet)
 192        {
 0193            int row = _orders.Count + 2;
 194
 0195            foreach (var columnName in _columnsToSum)
 196            {
 0197                int sumColumnIndex = _columnsToExport.IndexOf(columnName) + 1;
 0198                if (sumColumnIndex > 0)
 199                {
 0200                    worksheet.Cells[row, sumColumnIndex].Formula =
 0201                        $"SUM({worksheet.Cells[2, sumColumnIndex].Address}:{worksheet.Cells[row - 1, sumColumnIndex].Add
 0202                    worksheet.Cells[row, sumColumnIndex].Style.Font.Bold = true;
 203                }
 204            }
 0205        }
 206    }
 207}