diff --git a/src/food-market.infrastructure/Integrations/MoySklad/MoySkladDocumentImportService.cs b/src/food-market.infrastructure/Integrations/MoySklad/MoySkladDocumentImportService.cs index b4f6614..393b0d1 100644 --- a/src/food-market.infrastructure/Integrations/MoySklad/MoySkladDocumentImportService.cs +++ b/src/food-market.infrastructure/Integrations/MoySklad/MoySkladDocumentImportService.cs @@ -70,6 +70,16 @@ private static DateTime MomentToUtc(string? moment) .Select(p => new { p.Id, p.MoySkladExternalId }).ToDictionaryAsync(x => x.MoySkladExternalId!, x => x.Id, ct); var done = (await _db.Supplies.Where(s => s.MoySkladExternalId != null) .Select(s => s.MoySkladExternalId!).ToListAsync(ct)).ToHashSet(); + // Номера приёмок МойСклада ПОВТОРЯЮТСЯ по годам, а у нас (OrganizationId, Number) + // уникален. Сохраняем оригинальный номер где можно, при коллизии добавляем год/счётчик. + var usedNumbers = (await _db.Supplies.Select(s => s.Number).ToListAsync(ct)).ToHashSet(StringComparer.OrdinalIgnoreCase); + string UniqueNumber(string baseName, int year) + { + if (usedNumbers.Add(baseName)) return baseName; + var withYear = $"{baseName}-{year}"; + if (usedNumbers.Add(withYear)) return withYear; + for (var n = 2; ; n++) { var cand = $"{baseName}-{year}-{n}"; if (usedNumbers.Add(cand)) return cand; } + } // expand=positions (НЕ positions.assortment — это раскрывает весь товар и делает // страницу гигантской/зависающей). assortment.meta.href в позиции есть и так — из него @@ -86,10 +96,11 @@ private static DateTime MomentToUtc(string? moment) : fallbackSupplier ?? throw new InvalidOperationException("Нет контрагента-поставщика"); var momentUtc = MomentToUtc(d.Moment); var posted = d.Applicable; + var baseNumber = string.IsNullOrWhiteSpace(d.Name) ? $"МС-{d.Id[..8]}" : d.Name!; var supply = new foodmarket.Domain.Purchases.Supply { OrganizationId = orgId, - Number = string.IsNullOrWhiteSpace(d.Name) ? $"МС-{d.Id[..8]}" : d.Name!, + Number = UniqueNumber(baseNumber, momentUtc.Year), Date = momentUtc, Status = posted ? foodmarket.Domain.Purchases.SupplyStatus.Posted : foodmarket.Domain.Purchases.SupplyStatus.Draft, SupplierId = supplierId,