Part 2 (документы) — проверенный шаблон на приёмках: - Phase41: MoySkladExternalId у counterparties/stores/units/retail_points/employees и документов (supplies/enters/losses/inventories/supplier_returns/retail_sales/ cash_shifts/money_transactions) + индексы. Свойства на доменных сущностях. - MoySkladClient.StreamDocumentsAsync: документы в хронологии (order=moment,asc), expand позиций/связей (limit=100), обработка 429/сбоев. - MoySkladDocumentImportService.ImportSuppliesAsync: идемпотентно по msId, резюмируемо (skip перенесённых), moment МСК→UTC, суммы из тиынов, поставщик по externalId контрагента, товары по externalId, проведение → движения остатков (StockService). Журнал ошибок. - Импорт контрагентов теперь пишет MoySkladExternalId (нужно для ссылок в документах). - Эндпоинт POST /api/admin/moysklad/import-supplies (фон, job). Остальные типы — по шаблону. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
44 lines
2 KiB
C#
44 lines
2 KiB
C#
using Microsoft.EntityFrameworkCore.Infrastructure;
|
||
using Microsoft.EntityFrameworkCore.Migrations;
|
||
using foodmarket.Infrastructure.Persistence;
|
||
|
||
#nullable disable
|
||
|
||
namespace foodmarket.Infrastructure.Persistence.Migrations
|
||
{
|
||
/// <summary>Phase41 — MoySkladExternalId у справочников (кроме уже имеющих у Product/
|
||
/// ProductGroup) и всех документов: нужно для идемпотентного переноса истории из
|
||
/// МойСклада (ключ — id МойСклада) и сопоставления ссылок (поставщик/склад/автор).
|
||
/// Текстовая колонка + индекс (OrganizationId, MoySkladExternalId). Идемпотентно.</summary>
|
||
[DbContext(typeof(AppDbContext))]
|
||
[Migration("20261009140000_Phase41_MoySkladExternalIdDocs")]
|
||
public partial class Phase41_MoySkladExternalIdDocs : Migration
|
||
{
|
||
private static readonly string[] Tables =
|
||
{
|
||
"counterparties", "stores", "units_of_measure", "retail_points", "employees",
|
||
"supplies", "enters", "losses", "inventories", "supplier_returns",
|
||
"retail_sales", "cash_shifts", "money_transactions",
|
||
};
|
||
|
||
protected override void Up(MigrationBuilder b)
|
||
{
|
||
foreach (var t in Tables)
|
||
{
|
||
b.Sql($@"ALTER TABLE public.""{t}"" ADD COLUMN IF NOT EXISTS ""MoySkladExternalId"" text;");
|
||
b.Sql($@"CREATE INDEX IF NOT EXISTS ""IX_{t}_MoySkladExternalId""
|
||
ON public.""{t}"" (""OrganizationId"", ""MoySkladExternalId"");");
|
||
}
|
||
}
|
||
|
||
protected override void Down(MigrationBuilder b)
|
||
{
|
||
foreach (var t in Tables)
|
||
{
|
||
b.Sql($@"DROP INDEX IF EXISTS ""IX_{t}_MoySkladExternalId"";");
|
||
b.Sql($@"ALTER TABLE public.""{t}"" DROP COLUMN IF EXISTS ""MoySkladExternalId"";");
|
||
}
|
||
}
|
||
}
|
||
}
|