697ae44519
- Загрузка одного .xlsx (СПРАВКА + Лист1 в одном файле) - Рег. номера берутся из СПРАВКА автоматически, группируются по (ТН ВЭД, Страна) - Отдельный опциональный справочник кодов (CodesImportService) - Фильтры: Все / Авто / Проверить / Нет кода / Без нетто - Таблица сразу отсортирована по ТН ВЭД с живым обновлением п/п - Начальный п/п: поле в UI, автоинкремент после экспорта - Лист2: рамки, жёлтая строка при >1 рег. номере, итого по кол-ву - Лист3: ТН ВЭД в колонке B вместо константы 09035 - Красный ErrorMessage под кнопкой загрузки, удалён SpravkaFileEntry
42 lines
1.5 KiB
C#
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();
|
|
}
|
|
}
|