Skip to main content
Version: Latest

Known Limitations and Phase History

Known limitations, by area

Live end-to-end verification. Across nearly every apply flow in this guide (accounting accounts, mappings, inventory account category, cost centers, product catalog prerequisites/categories/items), the actual internal-endpoint HTTP round trip through a genuinely running Shumoul.Api process was not exercised — verification instead relies on mocked-repository unit tests plus, in several phases, direct SQL inspection of a real dev database. The Tenant Starter Kit's own live verification (Phase 5F) is the one exception that did exercise a real TenantDbContext against the real dev database (see below) — but even that run had the actual internal-bridge HTTP hop mocked.

No downgrade cleanup. If a tenant loses a SubscriptionFeature (e.g. a plan downgrade), any settings values already patched by onboarding, or any starter data already applied, are never reverted or cleaned up. Entitlement checks only ever gate future applies.

Ambiguous multi-row cases are reported, never guessed. A tenant with more than one active InventoryAccountCategory row, more than one BusinessType/ProductDepartment sharing a name, or more than one AccountingChartTemplate marked default for the same activity all resolve to a blocked apply with a clear message — never a best-guess pick. A real "which one is the default" design for the genuine multi-category-tenant case is a deliberately unbuilt future need.

No JSON/Excel import for Cost Center or Product Catalog templates — only Accounting Chart Templates have both import paths today; the others are admin-CRUD-only. A bounded, precedented future addition following AccountingChartTemplatesController's existing import pattern if ever needed.

MenuClaimSeeder's AppController model has no nested sub-controller support — see SaaS Admin Authorization and MenuClaims.

The "non-root caller restricted to its own tenant" branch of TenantAccessGuardBehavior has no way to be exercised by a real caller today — the seeder never grants TenancyPermissions.* to any non-root tenant. Pure defense-in-depth, not a currently-reachable code path.

Shared-DB tenants processed back-to-back in one host process could transiently see stale settings (FIXED). A cross-tenant IAppSettingService/CashierAppsSettings caching artifact was found while live-verifying the Cash/Bank GL-currency linking step for a second shared-DB tenant processed in the same long-lived process. Never a Starter Kit orchestration defect — the root cause (a tenant-unaware cache key shared by a process-wide IEasyCachingProvider singleton) and its fix (every AppSettings cache key now embeds the resolved tenant id) are documented in Subscription Packages & Entitlements, Chapter 17.

First-login automatic trigger deliberately deferred. Neither tenant entitlement provisioning nor any starter-template apply is triggered automatically at first login — touching the login/auth path was judged high-risk before real production subscribers existed on the platform. A manual repair endpoint and the existing onboarding-apply trigger were judged sufficient in the interim. Whether/when to add a first-login hook remains an open, deliberately-deferred decision.

Product Catalog Product-matching is scoped to Category, unlike the real ERP's own duplicate check (which is effectively global) — see Product Catalog Items and Units, a documented, intentional deviation, not a bug.

Phase 5F — what was verified live

The Tenant Starter Kit's own live E2E pass ran a real TenantStarterKitService backed by a real SQL Server TenantDbContext against a designated, safe E2E test tenant (a dedicated, non-shared, explicitly labeled test database, active subscription, confirmed Features.AccountManagement/CostCenterSettings entitlement, known BusinessActivityCode = RestaurantCafe, needsCostCenters = Mandatory, zero pre-existing apply-log rows). Only the four per-step ITenant*ApplyService interfaces and the two entitlement services were mocked. Preview correctly resolved every default template (RestaurantCafe_Saudi_USStyle_COA_v1, its linked inventory-category template, and RestaurantCafe_Default_CostCenters_v1) and never wrote the apply log; Apply (with the bridge itself still mocked) wrote exactly one log row, self-cleaned afterward.

This pass also found the internal apply-bridge configuration surface was entirely missing from both Shumoul.Framework.MultiTenancy.Host's appsettings.json and Shumoul.Api's appsettings.Development.json — affecting all four accounting apply flows at once, since they share one bridge/key. Documented (but disabled, placeholder-valued) configuration sections were added as a fix.

Phase 5G — the corrected finding

Phase 5F had separately concluded that no host could ever produce a genuinely-authorized call to any SaaS admin controller. Phase 5G found this specific claim incorrect by direct code inspection — see SaaS Admin Authorization for the full correction. Phase 5F's document was updated with a corrective pointer note rather than rewritten, preserving the original as historical record.

Phase list

PhaseFocus
3SubscriptionFeature → SettingsGroups entitlement link
3.2Settings-group ownership gap closed (ProjectSettings/SalesmanSettings/MarketerSettings)
4Saas.BusinessActivities master data
5A / 5A.1Accounting chart template catalog + JSON/Excel import
5B.1 / 5B.1.1Apply chart accounts to tenant; real Features.AccountManagement
5B.2Chart-template mapping resolution into InventoryAccountCategory
5B.3Inventory account category templates + safe apply
5CCost center templates + safe apply
5DActivity-specific Saudi/US-style default chart templates
Schema Convention CleanupName/FName rename correction
5ETenant Starter Kit orchestration (accounting chain)
5FLive E2E verification + configuration hardening
5GSaaS admin authorization hardening (TenantAccessGuardBehavior, Swagger grouping)
6Product Catalog Templates (categories only)
6A.1Product Catalog Prerequisites (BusinessType/ProductDepartment/UnitOfMeasure)
6BProduct Catalog Items and Units
6CProduct Catalog composed into Tenant Starter Kit

This phase history runs in parallel with, and is entirely separate from, the Business Onboarding & Smart Configuration chapter's own phase history (Phase 1.1 through Phase 8, plus its own entitlement-adjacent work referenced above) — the two phase numbering schemes are unrelated to each other; "Phase 4" here has no relationship to "Phase 4" in any other chapter of this Developer Portal.