diff --git a/src/food-market.api/Controllers/SuperAdmin/SuperAdminOrganizationsController.cs b/src/food-market.api/Controllers/SuperAdmin/SuperAdminOrganizationsController.cs index 72d776d..1e34bc0 100644 --- a/src/food-market.api/Controllers/SuperAdmin/SuperAdminOrganizationsController.cs +++ b/src/food-market.api/Controllers/SuperAdmin/SuperAdminOrganizationsController.cs @@ -1,5 +1,5 @@ +using foodmarket.Api.Seed; using foodmarket.Application.Common; -using foodmarket.Domain.Catalog; using foodmarket.Domain.Organizations; using foodmarket.Infrastructure.Identity; using foodmarket.Infrastructure.Persistence; @@ -100,21 +100,16 @@ public async Task> Create([FromBody] CreateOrgRequ DefaultCurrencyId = input.Org.DefaultCurrencyId, }; _db.Organizations.Add(org); - // Системные референсы (Stores, Cashiers, Roles) подсеет DevDataSeeder при - // следующем рестарте; для немедленной готовности создаём минимум руками. - var mainStore = new Store - { - OrganizationId = org.Id, Name = "Основной склад", Code = "MAIN", IsMain = true, - }; - _db.Stores.Add(mainStore); + await _db.SaveChangesAsync(ct); - var adminRole = new EmployeeRole - { - OrganizationId = org.Id, - Name = "Администратор", Description = "Полный доступ ко всем разделам организации", - IsSystem = true, SortOrder = 0, Permissions = RolePermissions.All(), - }; - _db.EmployeeRoles.Add(adminRole); + // Полный bootstrap tenant-сущностей: единицы измерения, типы цен, + // «Основной склад», «Касса 1», 6 ролей (2 системные + 4 кастомные шаблона). + // Один helper и в DevDataSeeder, и здесь — гарантирует одинаковое + // состояние новой орги независимо от пути создания. + await DevDataSeeder.SeedTenantReferencesAsync(_db, org.Id, ct); + + var adminRole = await _db.EmployeeRoles.IgnoreQueryFilters() + .FirstAsync(r => r.OrganizationId == org.Id && r.IsSystem && r.Name == "Администратор", ct); // AppUser админа var existing = await _userMgr.FindByEmailAsync(input.AdminEmail); diff --git a/src/food-market.api/Seed/DevDataSeeder.cs b/src/food-market.api/Seed/DevDataSeeder.cs index bcaa4dc..517535e 100644 --- a/src/food-market.api/Seed/DevDataSeeder.cs +++ b/src/food-market.api/Seed/DevDataSeeder.cs @@ -117,7 +117,13 @@ private static async Task SeedAdminEmployeeAsync(AppDbContext db, Guid orgId, Gu await db.SaveChangesAsync(ct); } - private static async Task SeedTenantReferencesAsync(AppDbContext db, Guid orgId, CancellationToken ct) + /// Bootstrap минимально-достаточного набора tenant-сущностей для + /// новой организации: единицы измерения (ОКЕИ), типы цен (Розничная+Оптовая), + /// «Основной склад» MAIN, «Касса 1» POS-1, и системные роли через + /// SeedEmployeeRolesAsync. Идемпотентно: каждый блок проверяет существующие + /// записи. Используется и при первом старте Demo, и при создании org через + /// SuperAdmin UI. + public static async Task SeedTenantReferencesAsync(AppDbContext db, Guid orgId, CancellationToken ct) { var anyUnit = await db.UnitsOfMeasure.IgnoreQueryFilters().AnyAsync(u => u.OrganizationId == orgId, ct); if (!anyUnit)