Files
Dianaka123 697ae44519 feat: единый файл Лист1+СПРАВКА, фильтры, сортировка, живой п/п
- Загрузка одного .xlsx (СПРАВКА + Лист1 в одном файле)
- Рег. номера берутся из СПРАВКА автоматически, группируются по (ТН ВЭД, Страна)
- Отдельный опциональный справочник кодов (CodesImportService)
- Фильтры: Все / Авто / Проверить / Нет кода / Без нетто
- Таблица сразу отсортирована по ТН ВЭД с живым обновлением п/п
- Начальный п/п: поле в UI, автоинкремент после экспорта
- Лист2: рамки, жёлтая строка при >1 рег. номере, итого по кол-ву
- Лист3: ТН ВЭД в колонке B вместо константы 09035
- Красный ErrorMessage под кнопкой загрузки, удалён SpravkaFileEntry
2026-04-07 11:47:31 +03:00

42 lines
1.5 KiB
C#

using System.Collections.Generic;
using System.Linq;
using DeclarationAutomatization.Models;
namespace DeclarationAutomatization.Services;
public class TransformService
{
// Строит позиции Листа2 из ИТОГО-строк Листа1.
// Рег. номера берёт из СПРАВКИ по ТН ВЭД.
public List<DeclarationItem> BuildDeclarationItems(
IEnumerable<Sheet1Group> groups,
IEnumerable<SpravkaItem> spravkaItems)
{
// Индекс: (ТН ВЭД, Страна) → уникальные (рег. номер, дата) из СПРАВКИ
var regByKey = spravkaItems
.Where(s => !string.IsNullOrWhiteSpace(s.RegNumber))
.GroupBy(s => (s.TnVed, s.CountryId))
.ToDictionary(
g => g.Key,
g => g.Select(s => new RegEntry(s.RegNumber, s.RegDate))
.Distinct()
.ToList()
);
return groups.Select(group => new DeclarationItem
{
SequentialNumber = group.SequentialNumber,
Description = group.Description,
TnVed = group.TnVed,
CountryId = group.CountryId,
Quantity = group.Quantity,
AmountWithVat = group.AmountWithVat,
GrossWeight = group.GrossWeight,
NetWeight = group.NetWeight,
RegEntries = regByKey.TryGetValue((group.TnVed, group.CountryId), out var regs)
? regs
: new List<RegEntry>(),
}).ToList();
}
}