059895d1c3
- Чтение СПРАВКИ из Excel (ClosedXML), поддержка нескольких файлов - Группировка по ТН ВЭД: схлопывание строк с суммированием кол-ва/веса/суммы - Автоназначение кодов деклараций по справочнику ТН ВЭД (87 пар) - Цветовая маркировка: зелёный/жёлтый/красный по уровню уверенности - Самообучение: ручной выбор кода сохраняется в tnved_codes.json - Формирование Лист3 с разворачиванием строк по рег. номерам (ключевая функция) - Экспорт Лист2 + Лист3 в Excel
41 lines
1.5 KiB
C#
41 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<SpravkaItem> allItems)
|
|
{
|
|
int sequentialNumber = 1;
|
|
|
|
return allItems
|
|
.GroupBy(s => s.TnVed)
|
|
.Select(g =>
|
|
{
|
|
var first = g.First();
|
|
var regEntry = g.FirstOrDefault(s => !string.IsNullOrWhiteSpace(s.RegNumber));
|
|
|
|
return new DeclarationItem
|
|
{
|
|
SequentialNumber = sequentialNumber++,
|
|
Description = first.Description,
|
|
TnVed = first.TnVed,
|
|
CountryId = first.CountryId,
|
|
Quantity = g.Sum(s => s.Quantity),
|
|
AmountWithVat = g.Sum(s => s.AmountWithVat),
|
|
GrossWeight = g.Sum(s => s.GrossWeight),
|
|
NetWeight = g.Sum(s => s.NetWeight),
|
|
RegNumber = regEntry?.RegNumber ?? "",
|
|
RegDate = regEntry?.RegDate ?? "",
|
|
};
|
|
})
|
|
.ToList();
|
|
}
|
|
}
|