diff --git a/src/core/modules/registry.ts b/src/core/modules/registry.ts index 6f94449..4142155 100644 --- a/src/core/modules/registry.ts +++ b/src/core/modules/registry.ts @@ -124,7 +124,7 @@ export const SYSTEM_MODULES: ModuleDefinition[] = [ }, { id: 'helpdesk', - label: 'HelpDesk', + label: 'Поддержка', iconName: 'Headset', route: '/helpdesk', requiredCapability: 'helpdesk', @@ -200,7 +200,7 @@ export const SYSTEM_MODULES: ModuleDefinition[] = [ route: '/automation', requiredCapability: 'automation', sections: [ - { id: 'scenarios', label: 'Сценарии & Workflows', route: '/automation' }, + { id: 'scenarios', label: 'Сценарии автоматизации', route: '/automation' }, { id: 'builder', label: 'Конструктор цепочек', route: '/automation/builder' }, { id: 'triggers', label: 'Триггеры событий', route: '/automation/triggers' }, { id: 'history', label: 'Лог выполнения', route: '/automation/history' }, diff --git a/src/core/permissions/types.ts b/src/core/permissions/types.ts index 854cd39..30fe6a9 100644 --- a/src/core/permissions/types.ts +++ b/src/core/permissions/types.ts @@ -23,15 +23,15 @@ export const SYSTEM_ROLES: Record = { owner: { id: 'owner', label: 'Владелец бизнеса', - badge: 'Owner', - description: 'Полный доступ ко всем модулям, финансовой аналитике, настройкам и AI-центру', + badge: 'Владелец', + description: 'Полный доступ ко всем модулям, финансовой аналитике, настройкам и ИИ-центру', allowedModules: ['*'], defaultRoute: '/', }, administrator: { id: 'administrator', label: 'Администратор', - badge: 'Admin', + badge: 'Администратор', description: 'Управление процессами, персоналом, точками, правами и операционной деятельностью', allowedModules: ['*'], defaultRoute: '/', @@ -39,7 +39,7 @@ export const SYSTEM_ROLES: Record = { manager: { id: 'manager', label: 'Управляющий', - badge: 'Manager', + badge: 'Управляющий', description: 'Операции, смены, заказы, доставка, склад, контроль персонала и операционная аналитика', allowedModules: ['dashboard', 'operations', 'crm', 'sales', 'inventory', 'employees', 'tasks', 'communications', 'analytics'], defaultRoute: '/operations', @@ -47,7 +47,7 @@ export const SYSTEM_ROLES: Record = { cashier: { id: 'cashier', label: 'Кассир / Оператор', - badge: 'POS', + badge: 'Кассир', description: 'Кассовый терминал, оформление заказов, прием оплаты, клиентская база', allowedModules: ['operations', 'sales', 'crm'], defaultRoute: '/operations/pos', @@ -55,7 +55,7 @@ export const SYSTEM_ROLES: Record = { cook: { id: 'cook', label: 'Повар / Шеф-повар', - badge: 'KDS', + badge: 'Кухня', description: 'Кухонный дисплей (KDS), отметка готовности блюд, стоп-лист', allowedModules: ['operations'], defaultRoute: '/operations/kds', @@ -63,7 +63,7 @@ export const SYSTEM_ROLES: Record = { courier: { id: 'courier', label: 'Курьер / Доставка', - badge: 'Courier', + badge: 'Курьер', description: 'Мобильный экран доставки: маршруты, заказы, адрес клиента, отметка вручения', allowedModules: ['operations'], defaultRoute: '/operations/courier', @@ -71,7 +71,7 @@ export const SYSTEM_ROLES: Record = { specialist: { id: 'specialist', label: 'Специалист / Мастер', - badge: 'Service', + badge: 'Мастер', description: 'Журнал записи, заказ-наряды постов, расписание смен, услуги', allowedModules: ['operations', 'crm', 'tasks'], defaultRoute: '/operations/work-orders', @@ -79,15 +79,15 @@ export const SYSTEM_ROLES: Record = { marketer: { id: 'marketer', label: 'Маркетолог', - badge: 'Marketing', - description: 'Маркетинговые кампании, CRM сегменты, сайты/CMS, рассылки, сквозная аналитика, AI', + badge: 'Маркетолог', + description: 'Маркетинговые кампании, CRM сегменты, сайты/CMS, рассылки, сквозная аналитика, ИИ', allowedModules: ['dashboard', 'crm', 'marketing', 'cms', 'communications', 'analytics', 'ai'], defaultRoute: '/marketing', }, warehouse: { id: 'warehouse', label: 'Складской оператор', - badge: 'Warehouse', + badge: 'Склад', description: 'Приходные накладные, списания, партии, инвентаризация и поставщики', allowedModules: ['operations', 'inventory', 'tasks'], defaultRoute: '/operations/inventory', @@ -95,7 +95,7 @@ export const SYSTEM_ROLES: Record = { support: { id: 'support', label: 'Специалист поддержки', - badge: 'Support', + badge: 'Поддержка', description: 'Очередь тикетов, омниканальные чаты, база знаний и SLA', allowedModules: ['helpdesk', 'communications', 'crm'], defaultRoute: '/helpdesk', diff --git a/src/core/profiles/profiles.ts b/src/core/profiles/profiles.ts index a58c74a..03245a9 100644 --- a/src/core/profiles/profiles.ts +++ b/src/core/profiles/profiles.ts @@ -59,9 +59,9 @@ export const BUSINESS_PROFILES: Record = { restaurant_delivery_only: { id: 'restaurant_delivery_only', - name: 'Ресторан: Только Доставка / Dark Kitchen', - label: 'Суши & Гёдза Express (Dark Kitchen)', - category: 'Общепит / Dark Kitchen', + name: 'Ресторан: Только Доставка / Кухня доставки', + label: 'Суши & Гёдза Express (Кухня доставки)', + category: 'Общепит / Кухня доставки', companyName: 'Суши & Гёдза Express', locations: ['Красный пр-т 186а (Кухня 1)'], capabilities: { @@ -100,7 +100,7 @@ export const BUSINESS_PROFILES: Record = { ], terminology: { itemLabel: 'Позиция доставки', - itemsLabel: 'Ассортимент Dark Kitchen', + itemsLabel: 'Ассортимент кухни доставки', bookingResourceLabel: 'Линия сборки', orderSourceLabel: 'Доставка / Агрегаторы', clientIdentifierLabel: 'Получатель заказа', @@ -113,8 +113,8 @@ export const BUSINESS_PROFILES: Record = { retail: { id: 'retail', - name: 'Розничная торговля / Retail', - label: 'Krona Retail & Store', + name: 'Розничная торговля', + label: 'Krona Розничная торговля & Store', category: 'Торговля', companyName: 'Krona Concept Store', locations: ['Флагманский магазин — Ленина 12', 'Островок в ТЦ'], @@ -579,8 +579,8 @@ export const BUSINESS_PROFILES: Record = { custom_meta: { id: 'custom_meta', - name: 'Кастомный профиль / Meta-profile', - label: 'Универсальный Business OS (Все модули)', + name: 'Кастомный профиль / Настраиваемый профиль', + label: 'Универсальная Бизнес-платформа (Все модули)', category: 'Конфигурируемый', companyName: 'Бизнес-экосистема Крона', locations: ['Главный офис', 'Локация 2'], diff --git a/src/features/__tests__/localizationCleanliness.test.ts b/src/features/__tests__/localizationCleanliness.test.ts new file mode 100644 index 0000000..cefa5c1 --- /dev/null +++ b/src/features/__tests__/localizationCleanliness.test.ts @@ -0,0 +1,91 @@ +import { describe, it, expect } from 'vitest'; +import { SYSTEM_ROLES } from '../../core/permissions/types'; +import { BUSINESS_PROFILES } from '../../core/profiles/profiles'; +import { SYSTEM_MODULES } from '../../core/modules/registry'; +import { LOCALIZATION_DICTIONARY } from '../../shared/lib/localizationDictionary'; + +describe('Localization Cleanliness Test Suite', () => { + it('verifies all SYSTEM_ROLES badges and labels are strictly localized in Russian', () => { + const englishBadges = [ + 'Owner', + 'Admin', + 'Manager', + 'POS', + 'KDS', + 'Courier', + 'Service', + 'Marketing', + 'Warehouse', + 'Support', + ]; + + Object.values(SYSTEM_ROLES).forEach((role) => { + // Must not use any legacy English badge + expect(englishBadges).not.toContain(role.badge); + + // Badge and label must contain Cyrillic characters + expect(role.badge).toMatch(/[а-яА-ЯёЁ]/); + expect(role.label).toMatch(/[а-яА-ЯёЁ]/); + expect(role.description).toMatch(/[а-яА-ЯёЁ]/); + }); + + // Verify expected Russian badges exist + expect(SYSTEM_ROLES.owner.badge).toBe('Владелец'); + expect(SYSTEM_ROLES.administrator.badge).toBe('Администратор'); + expect(SYSTEM_ROLES.manager.badge).toBe('Управляющий'); + expect(SYSTEM_ROLES.cashier.badge).toBe('Кассир'); + expect(SYSTEM_ROLES.cook.badge).toBe('Кухня'); + expect(SYSTEM_ROLES.courier.badge).toBe('Курьер'); + expect(SYSTEM_ROLES.specialist.badge).toBe('Мастер'); + expect(SYSTEM_ROLES.marketer.badge).toBe('Маркетолог'); + expect(SYSTEM_ROLES.warehouse.badge).toBe('Склад'); + expect(SYSTEM_ROLES.support.badge).toBe('Поддержка'); + }); + + it('verifies BUSINESS_PROFILES contains zero legacy untranslated markers', () => { + const forbiddenSubstrings = ['Dark Kitchen', 'Meta-profile', 'Business OS']; + + Object.values(BUSINESS_PROFILES).forEach((profile) => { + forbiddenSubstrings.forEach((forbidden) => { + expect(profile.name).not.toContain(forbidden); + expect(profile.label).not.toContain(forbidden); + }); + }); + + expect(BUSINESS_PROFILES.restaurant_delivery_only.name).toContain('Кухня доставки'); + expect(BUSINESS_PROFILES.retail.name).toContain('Розничная торговля'); + expect(BUSINESS_PROFILES.custom_meta.name).toContain('Настраиваемый профиль'); + expect(BUSINESS_PROFILES.custom_meta.label).toContain('Бизнес-платформа'); + }); + + it('verifies SYSTEM_MODULES labels and sections have clean Russian localization', () => { + const allowedAcronyms = ['CRM', 'CMS']; + + SYSTEM_MODULES.forEach((module) => { + if (!allowedAcronyms.includes(module.label)) { + expect(module.label).toMatch(/[а-яА-ЯёЁ]/); + } + module.sections.forEach((section) => { + expect(section.label).not.toContain('& Workflows'); + }); + }); + + const aiModule = SYSTEM_MODULES.find((m) => m.id === 'ai'); + expect(aiModule?.label).toBe('ИИ-центр'); + + const autoModule = SYSTEM_MODULES.find((m) => m.id === 'automation'); + const scenariosSection = autoModule?.sections.find((s) => s.id === 'scenarios'); + expect(scenariosSection?.label).toBe('Сценарии автоматизации'); + }); + + it('verifies LOCALIZATION_DICTIONARY contains standard Russian keys and values', () => { + expect(LOCALIZATION_DICTIONARY.maturityLevels.pilot1.label).toBe('Пилотный режим'); + expect(LOCALIZATION_DICTIONARY.maturityLevels.target.label).toBe('Интерфейс подготовлен'); + expect(LOCALIZATION_DICTIONARY.maturityLevels.demo.label).toBe('Только демонстрация'); + expect(LOCALIZATION_DICTIONARY.maturityLevels.planned.label).toBe('Запланирован'); + + expect(LOCALIZATION_DICTIONARY.roles.owner.badge).toBe('Владелец'); + expect(LOCALIZATION_DICTIONARY.roles.cashier.badge).toBe('Кассир'); + expect(LOCALIZATION_DICTIONARY.modules.ai).toBe('ИИ-центр'); + }); +}); diff --git a/src/features/__tests__/targetPrototypeFlows.test.tsx b/src/features/__tests__/targetPrototypeFlows.test.tsx index 5f61b88..7761ce6 100644 --- a/src/features/__tests__/targetPrototypeFlows.test.tsx +++ b/src/features/__tests__/targetPrototypeFlows.test.tsx @@ -13,7 +13,7 @@ describe('Phase E: Target Prototype & Maturity Badges Tests', () => { render(); const badge = screen.getByTestId('maturity-badge-pilot1'); expect(badge).toBeInTheDocument(); - expect(badge).toHaveTextContent('Pilot 1'); + expect(badge).toHaveTextContent('Пилотный режим'); expect(badge.className).toContain('text-emerald-800'); }); @@ -21,7 +21,7 @@ describe('Phase E: Target Prototype & Maturity Badges Tests', () => { render(); const badge = screen.getByTestId('maturity-badge-target'); expect(badge).toBeInTheDocument(); - expect(badge).toHaveTextContent('Target prototype'); + expect(badge).toHaveTextContent('Интерфейс подготовлен'); expect(badge.className).toContain('text-sky-800'); }); @@ -29,7 +29,7 @@ describe('Phase E: Target Prototype & Maturity Badges Tests', () => { render(); const badge = screen.getByTestId('maturity-badge-demo'); expect(badge).toBeInTheDocument(); - expect(badge).toHaveTextContent('Demo only'); + expect(badge).toHaveTextContent('Только демонстрация'); expect(badge.className).toContain('text-purple-800'); }); diff --git a/src/shared/lib/localizationDictionary.ts b/src/shared/lib/localizationDictionary.ts new file mode 100644 index 0000000..2678180 --- /dev/null +++ b/src/shared/lib/localizationDictionary.ts @@ -0,0 +1,126 @@ +/** + * Centralized Russian localization dictionary for Krona Universal Business OS. + * Contains standard localized names, badges, roles, and status mappings. + */ + +export const LOCALIZATION_DICTIONARY = { + roles: { + owner: { + label: 'Владелец бизнеса', + badge: 'Владелец', + description: 'Полный доступ ко всем модулям, финансовой аналитике, настройкам и ИИ-центру', + }, + administrator: { + label: 'Администратор', + badge: 'Администратор', + description: 'Управление процессами, персоналом, точками, правами и операционной деятельностью', + }, + manager: { + label: 'Управляющий', + badge: 'Управляющий', + description: 'Операции, смены, заказы, доставка, склад, контроль персонала и операционная аналитика', + }, + cashier: { + label: 'Кассир / Оператор', + badge: 'Кассир', + description: 'Кассовый терминал, оформление заказов, прием оплаты, клиентская база', + }, + cook: { + label: 'Повар / Шеф-повар', + badge: 'Кухня', + description: 'Кухонный дисплей (KDS), отметка готовности блюд, стоп-лист', + }, + courier: { + label: 'Курьер / Доставка', + badge: 'Курьер', + description: 'Мобильный экран доставки: маршруты, заказы, адрес клиента, отметка вручения', + }, + specialist: { + label: 'Специалист / Мастер', + badge: 'Мастер', + description: 'Журнал записи, заказ-наряды постов, расписание смен, услуги', + }, + marketer: { + label: 'Маркетолог', + badge: 'Маркетолог', + description: 'Маркетинговые кампании, CRM сегменты, сайты/CMS, рассылки, сквозная аналитика, ИИ', + }, + warehouse: { + label: 'Складской оператор', + badge: 'Склад', + description: 'Приходные накладные, списания, партии, инвентаризация и поставщики', + }, + support: { + label: 'Специалист поддержки', + badge: 'Поддержка', + description: 'Очередь тикетов, омниканальные чаты, база знаний и SLA', + }, + }, + + maturityLevels: { + pilot1: { + label: 'Пилотный режим', + description: 'Готово к пилоту (IndexedDB, транзакционный контур)', + }, + target: { + label: 'Интерфейс подготовлен', + description: 'Целевой прототип (интерактивный макет с бизнес-логикой)', + }, + demo: { + label: 'Только демонстрация', + description: 'Демонстрационный режим (симуляция)', + }, + planned: { + label: 'Запланирован', + description: 'В разработке (дорожная карта Q4)', + }, + }, + + profiles: { + restaurant_hall_delivery: 'Ресторан: Зал + Доставка', + restaurant_delivery_only: 'Ресторан: Только Доставка / Кухня доставки', + retail: 'Розничная торговля', + services_booking: 'Услуги и запись', + dark_kitchen: 'Кухня доставки', + custom_meta: 'Настраиваемый профиль', + }, + + modules: { + dashboard: 'Главная', + operations: 'Операции', + crm: 'CRM', + sales: 'Продажи', + inventory: 'Склад', + procurement: 'Закупки', + finance: 'Финансы', + employees: 'Сотрудники', + communications: 'Коммуникации', + helpdesk: 'Поддержка клиентов', + tasks: 'Задачи & Проекты', + cms: 'Сайты', + marketing: 'Маркетинг', + analytics: 'Аналитика', + automation: 'Автоматизация', + ai: 'ИИ-центр', + apps: 'Приложения', + settings: 'Настройки', + }, + + common: { + create: 'Создать', + edit: 'Редактировать', + delete: 'Удалить', + save: 'Сохранить', + cancel: 'Отмена', + reset: 'Сбросить', + apply: 'Применить', + filter: 'Фильтры', + search: 'Поиск', + close: 'Закрыть', + export: 'Экспорт', + import: 'Импорт', + all: 'Все', + details: 'О модуле', + open: 'Перейти', + }, +} as const; diff --git a/src/shared/ui/MaturityBadge.tsx b/src/shared/ui/MaturityBadge.tsx index b0d4013..ce15eef 100644 --- a/src/shared/ui/MaturityBadge.tsx +++ b/src/shared/ui/MaturityBadge.tsx @@ -20,21 +20,21 @@ export const MaturityBadge: React.FC = ({ }) => { const config = { pilot1: { - label: 'Pilot 1', + label: 'Пилотный режим', description: 'Готово к пилоту (IndexedDB, транзакционный контур)', badgeClass: 'bg-emerald-50 text-emerald-800 border-emerald-300 dark:bg-emerald-950/40 dark:text-emerald-300 dark:border-emerald-700', icon: CheckCircle2, iconClass: 'text-emerald-600 dark:text-emerald-400', }, target: { - label: 'Target prototype', + label: 'Интерфейс подготовлен', description: 'Целевой прототип (интерактивный макет с бизнес-логикой)', badgeClass: 'bg-sky-50 text-sky-800 border-sky-300 dark:bg-sky-950/40 dark:text-sky-300 dark:border-sky-700', icon: Layers, iconClass: 'text-sky-600 dark:text-sky-400', }, demo: { - label: 'Demo only', + label: 'Только демонстрация', description: 'Демонстрационный режим (симуляция)', badgeClass: 'bg-purple-50 text-purple-800 border-purple-300 dark:bg-purple-950/40 dark:text-purple-300 dark:border-purple-700', icon: FlaskConical, diff --git a/tsconfig.app.tsbuildinfo b/tsconfig.app.tsbuildinfo index 2369f15..b06e848 100644 --- a/tsconfig.app.tsbuildinfo +++ b/tsconfig.app.tsbuildinfo @@ -1 +1 @@ -{"root":["./src/app.tsx","./src/main.tsx","./src/app/guards/routeguard.tsx","./src/app/layouts/appshell.tsx","./src/app/providers/appproviders.tsx","./src/app/providers/tenantprovider.tsx","./src/app/providers/tenantcontext.ts","./src/app/router/index.tsx","./src/app/shell/bottomnav.tsx","./src/app/shell/commandpalette.tsx","./src/app/shell/mobilemenudrawer.tsx","./src/app/shell/notificationsdrawer.tsx","./src/app/shell/quickactionsmodal.tsx","./src/app/shell/rightcommandpanel.tsx","./src/app/shell/sidebar.tsx","./src/app/shell/topbar.tsx","./src/core/capabilities/types.ts","./src/core/modules/registry.ts","./src/core/modules/types.ts","./src/core/permissions/types.ts","./src/core/profiles/profiles.ts","./src/core/profiles/types.ts","./src/demo/democlock.ts","./src/demo/index.ts","./src/demo/scenarios.ts","./src/demo/seedstate.ts","./src/entities/index.ts","./src/entities/types.ts","./src/entities/commerce/order.ts","./src/entities/commerce/product.ts","./src/entities/crm/company.ts","./src/entities/crm/contact.ts","./src/entities/crm/deal.ts","./src/entities/crm/lead.ts","./src/entities/inventory/warehouse.ts","./src/entities/metadata/registry.ts","./src/features/__tests__/accessibilityandnavigation.test.tsx","./src/features/__tests__/configurationandcrminteractions.test.tsx","./src/features/__tests__/fieldtypescontract.test.ts","./src/features/__tests__/fieldtypesintegration.test.tsx","./src/features/__tests__/phasefhardening.test.tsx","./src/features/__tests__/pilot1flows.test.ts","./src/features/__tests__/targetprototypeflows.test.tsx","./src/features/ai/aicentermodule.tsx","./src/features/analytics/analyticsmodule.tsx","./src/features/apps/appscatalogmodule.tsx","./src/features/automation/automationmodule.tsx","./src/features/catalog/modulecard.tsx","./src/features/catalog/moduleinfomodal.tsx","./src/features/catalog/modulescatalog.tsx","./src/features/catalog/catalogdata.ts","./src/features/cms/cmsmodule.tsx","./src/features/communications/communicationsmodule.tsx","./src/features/crm/crmmodule.tsx","./src/features/crm/csvimportwizard.tsx","./src/features/crm/constants.ts","./src/features/crm/components/crmentitymodals.tsx","./src/features/crm/components/crmkanbanview.tsx","./src/features/crm/components/crmtableview.tsx","./src/features/crm/components/customer360drawer.tsx","./src/features/crm/components/dealwonordermodal.tsx","./src/features/crm/components/leadconversionmodal.tsx","./src/features/crm/components/index.ts","./src/features/dashboard/dynamicdashboard.tsx","./src/features/employees/employeesmodule.tsx","./src/features/finance/financemodule.tsx","./src/features/helpdesk/helpdeskmodule.tsx","./src/features/inventory/inventorymodule.tsx","./src/features/marketing/marketingmodule.tsx","./src/features/metadata/customentitypage.tsx","./src/features/metadata/dynamiccardrenderer.tsx","./src/features/metadata/dynamicformrenderer.tsx","./src/features/metadata/dynamictable.tsx","./src/features/metadata/__tests__/dynamicrenderer.test.tsx","./src/features/operations/baysview.tsx","./src/features/operations/bookingcalendarview.tsx","./src/features/operations/deliveryview.tsx","./src/features/operations/diningview.tsx","./src/features/operations/kdsview.tsx","./src/features/operations/operationsmodule.tsx","./src/features/operations/posview.tsx","./src/features/operations/purchasingview.tsx","./src/features/operations/recipesview.tsx","./src/features/operations/workordersview.tsx","./src/features/sales/salesmodule.tsx","./src/features/settings/settingsmodule.tsx","./src/features/settings/entities/cardlayoutbuilder.tsx","./src/features/settings/entities/entitycatalog.tsx","./src/features/settings/entities/fieldbuilder.tsx","./src/features/settings/entities/formbuilder.tsx","./src/features/settings/entities/viewbuilder.tsx","./src/features/settings/entities/fieldtypesmeta.ts","./src/features/settings/entities/useformbuilderhistory.ts","./src/features/settings/entities/useviewbuildercolumns.ts","./src/features/settings/entities/__tests__/configurationengine.test.tsx","./src/features/tasks/tasksmodule.tsx","./src/mock/mockapi.ts","./src/mock/mockdata.ts","./src/mock/store.ts","./src/pages/aipage.tsx","./src/pages/analyticspage.tsx","./src/pages/appspage.tsx","./src/pages/automationpage.tsx","./src/pages/cardlayoutbuilderpage.tsx","./src/pages/cmspage.tsx","./src/pages/communicationspage.tsx","./src/pages/crmpage.tsx","./src/pages/customentityroutepage.tsx","./src/pages/dashboardpage.tsx","./src/pages/employeespage.tsx","./src/pages/entitycatalogpage.tsx","./src/pages/fieldbuilderpage.tsx","./src/pages/financepage.tsx","./src/pages/formbuilderpage.tsx","./src/pages/helpdeskpage.tsx","./src/pages/inventorypage.tsx","./src/pages/marketingpage.tsx","./src/pages/operationspage.tsx","./src/pages/procurementpage.tsx","./src/pages/salespage.tsx","./src/pages/settingspage.tsx","./src/pages/taskspage.tsx","./src/pages/viewbuilderpage.tsx","./src/pages/index.ts","./src/pages/error/forbiddenpage.tsx","./src/pages/error/notfoundpage.tsx","./src/services/__tests__/tenantisolation.test.ts","./src/services/contracts/audit.ts","./src/services/contracts/commerce.ts","./src/services/contracts/context.ts","./src/services/contracts/crm.ts","./src/services/contracts/finance.ts","./src/services/contracts/index.ts","./src/services/contracts/inventory.ts","./src/services/contracts/metadata.ts","./src/services/contracts/repository.ts","./src/services/hooks/index.ts","./src/services/hooks/useauditlog.ts","./src/services/hooks/usecrm.ts","./src/services/hooks/usefinance.ts","./src/services/hooks/useinventory.ts","./src/services/hooks/usemetadata.ts","./src/services/hooks/useorders.ts","./src/services/hooks/usestoragelistener.ts","./src/services/mock/auditservice.ts","./src/services/mock/baserepository.ts","./src/services/mock/commerceservice.ts","./src/services/mock/crmservice.ts","./src/services/mock/financeservice.ts","./src/services/mock/index.ts","./src/services/mock/inventoryservice.ts","./src/services/mock/metadataservice.ts","./src/services/mock/__tests__/services.test.ts","./src/services/storage/eventbus.ts","./src/services/storage/index.ts","./src/services/storage/indexeddb.ts","./src/services/storage/__tests__/indexeddb.test.ts","./src/shared/lib/currency.ts","./src/shared/lib/date.ts","./src/shared/lib/dnd.ts","./src/shared/lib/fieldengine.ts","./src/shared/lib/index.ts","./src/shared/lib/ulid.ts","./src/shared/lib/useresponsive.ts","./src/shared/lib/__tests__/ulid.test.ts","./src/shared/ui/badge.tsx","./src/shared/ui/button.tsx","./src/shared/ui/checkbox.tsx","./src/shared/ui/drawer.tsx","./src/shared/ui/emptystate.tsx","./src/shared/ui/errorboundary.tsx","./src/shared/ui/iconbutton.tsx","./src/shared/ui/input.tsx","./src/shared/ui/maturitybadge.tsx","./src/shared/ui/modal.tsx","./src/shared/ui/select.tsx","./src/shared/ui/skeleton.tsx","./src/shared/ui/statcard.tsx","./src/shared/ui/toast.tsx","./src/shared/ui/toastcontext.ts","./src/shared/ui/index.ts","./src/shared/ui/usetoast.ts","./src/shared/utils/formatters.ts","./src/stores/demo.ts","./src/stores/index.ts","./src/stores/navigation.ts","./src/stores/theme.ts","./src/test/setup.ts"],"version":"6.0.3"} \ No newline at end of file +{"root":["./src/app.tsx","./src/main.tsx","./src/app/guards/routeguard.tsx","./src/app/layouts/appshell.tsx","./src/app/providers/appproviders.tsx","./src/app/providers/tenantprovider.tsx","./src/app/providers/tenantcontext.ts","./src/app/router/index.tsx","./src/app/shell/bottomnav.tsx","./src/app/shell/commandpalette.tsx","./src/app/shell/mobilemenudrawer.tsx","./src/app/shell/notificationsdrawer.tsx","./src/app/shell/quickactionsmodal.tsx","./src/app/shell/rightcommandpanel.tsx","./src/app/shell/sidebar.tsx","./src/app/shell/topbar.tsx","./src/core/capabilities/types.ts","./src/core/modules/registry.ts","./src/core/modules/types.ts","./src/core/permissions/types.ts","./src/core/profiles/profiles.ts","./src/core/profiles/types.ts","./src/demo/democlock.ts","./src/demo/index.ts","./src/demo/scenarios.ts","./src/demo/seedstate.ts","./src/entities/index.ts","./src/entities/types.ts","./src/entities/commerce/order.ts","./src/entities/commerce/product.ts","./src/entities/crm/company.ts","./src/entities/crm/contact.ts","./src/entities/crm/deal.ts","./src/entities/crm/lead.ts","./src/entities/inventory/warehouse.ts","./src/entities/metadata/registry.ts","./src/features/__tests__/accessibilityandnavigation.test.tsx","./src/features/__tests__/configurationandcrminteractions.test.tsx","./src/features/__tests__/fieldtypescontract.test.ts","./src/features/__tests__/fieldtypesintegration.test.tsx","./src/features/__tests__/localizationcleanliness.test.ts","./src/features/__tests__/phasefhardening.test.tsx","./src/features/__tests__/pilot1flows.test.ts","./src/features/__tests__/targetprototypeflows.test.tsx","./src/features/ai/aicentermodule.tsx","./src/features/analytics/analyticsmodule.tsx","./src/features/apps/appscatalogmodule.tsx","./src/features/automation/automationmodule.tsx","./src/features/catalog/modulecard.tsx","./src/features/catalog/moduleinfomodal.tsx","./src/features/catalog/modulescatalog.tsx","./src/features/catalog/catalogdata.ts","./src/features/cms/cmsmodule.tsx","./src/features/communications/communicationsmodule.tsx","./src/features/crm/crmmodule.tsx","./src/features/crm/csvimportwizard.tsx","./src/features/crm/constants.ts","./src/features/crm/components/crmentitymodals.tsx","./src/features/crm/components/crmkanbanview.tsx","./src/features/crm/components/crmtableview.tsx","./src/features/crm/components/customer360drawer.tsx","./src/features/crm/components/dealwonordermodal.tsx","./src/features/crm/components/leadconversionmodal.tsx","./src/features/crm/components/index.ts","./src/features/dashboard/dynamicdashboard.tsx","./src/features/employees/employeesmodule.tsx","./src/features/finance/financemodule.tsx","./src/features/helpdesk/helpdeskmodule.tsx","./src/features/inventory/inventorymodule.tsx","./src/features/marketing/marketingmodule.tsx","./src/features/metadata/customentitypage.tsx","./src/features/metadata/dynamiccardrenderer.tsx","./src/features/metadata/dynamicformrenderer.tsx","./src/features/metadata/dynamictable.tsx","./src/features/metadata/__tests__/dynamicrenderer.test.tsx","./src/features/operations/baysview.tsx","./src/features/operations/bookingcalendarview.tsx","./src/features/operations/deliveryview.tsx","./src/features/operations/diningview.tsx","./src/features/operations/kdsview.tsx","./src/features/operations/operationsmodule.tsx","./src/features/operations/posview.tsx","./src/features/operations/purchasingview.tsx","./src/features/operations/recipesview.tsx","./src/features/operations/workordersview.tsx","./src/features/sales/salesmodule.tsx","./src/features/settings/settingsmodule.tsx","./src/features/settings/entities/cardlayoutbuilder.tsx","./src/features/settings/entities/entitycatalog.tsx","./src/features/settings/entities/fieldbuilder.tsx","./src/features/settings/entities/formbuilder.tsx","./src/features/settings/entities/viewbuilder.tsx","./src/features/settings/entities/fieldtypesmeta.ts","./src/features/settings/entities/useformbuilderhistory.ts","./src/features/settings/entities/useviewbuildercolumns.ts","./src/features/settings/entities/__tests__/configurationengine.test.tsx","./src/features/tasks/tasksmodule.tsx","./src/mock/mockapi.ts","./src/mock/mockdata.ts","./src/mock/store.ts","./src/pages/aipage.tsx","./src/pages/analyticspage.tsx","./src/pages/appspage.tsx","./src/pages/automationpage.tsx","./src/pages/cardlayoutbuilderpage.tsx","./src/pages/cmspage.tsx","./src/pages/communicationspage.tsx","./src/pages/crmpage.tsx","./src/pages/customentityroutepage.tsx","./src/pages/dashboardpage.tsx","./src/pages/employeespage.tsx","./src/pages/entitycatalogpage.tsx","./src/pages/fieldbuilderpage.tsx","./src/pages/financepage.tsx","./src/pages/formbuilderpage.tsx","./src/pages/helpdeskpage.tsx","./src/pages/inventorypage.tsx","./src/pages/marketingpage.tsx","./src/pages/operationspage.tsx","./src/pages/procurementpage.tsx","./src/pages/salespage.tsx","./src/pages/settingspage.tsx","./src/pages/taskspage.tsx","./src/pages/viewbuilderpage.tsx","./src/pages/index.ts","./src/pages/error/forbiddenpage.tsx","./src/pages/error/notfoundpage.tsx","./src/services/__tests__/tenantisolation.test.ts","./src/services/contracts/audit.ts","./src/services/contracts/commerce.ts","./src/services/contracts/context.ts","./src/services/contracts/crm.ts","./src/services/contracts/finance.ts","./src/services/contracts/index.ts","./src/services/contracts/inventory.ts","./src/services/contracts/metadata.ts","./src/services/contracts/repository.ts","./src/services/hooks/index.ts","./src/services/hooks/useauditlog.ts","./src/services/hooks/usecrm.ts","./src/services/hooks/usefinance.ts","./src/services/hooks/useinventory.ts","./src/services/hooks/usemetadata.ts","./src/services/hooks/useorders.ts","./src/services/hooks/usestoragelistener.ts","./src/services/mock/auditservice.ts","./src/services/mock/baserepository.ts","./src/services/mock/commerceservice.ts","./src/services/mock/crmservice.ts","./src/services/mock/financeservice.ts","./src/services/mock/index.ts","./src/services/mock/inventoryservice.ts","./src/services/mock/metadataservice.ts","./src/services/mock/__tests__/services.test.ts","./src/services/storage/eventbus.ts","./src/services/storage/index.ts","./src/services/storage/indexeddb.ts","./src/services/storage/__tests__/indexeddb.test.ts","./src/shared/lib/currency.ts","./src/shared/lib/date.ts","./src/shared/lib/dnd.ts","./src/shared/lib/fieldengine.ts","./src/shared/lib/index.ts","./src/shared/lib/localizationdictionary.ts","./src/shared/lib/ulid.ts","./src/shared/lib/useresponsive.ts","./src/shared/lib/__tests__/ulid.test.ts","./src/shared/ui/badge.tsx","./src/shared/ui/button.tsx","./src/shared/ui/checkbox.tsx","./src/shared/ui/drawer.tsx","./src/shared/ui/emptystate.tsx","./src/shared/ui/errorboundary.tsx","./src/shared/ui/iconbutton.tsx","./src/shared/ui/input.tsx","./src/shared/ui/maturitybadge.tsx","./src/shared/ui/modal.tsx","./src/shared/ui/select.tsx","./src/shared/ui/skeleton.tsx","./src/shared/ui/statcard.tsx","./src/shared/ui/toast.tsx","./src/shared/ui/toastcontext.ts","./src/shared/ui/index.ts","./src/shared/ui/usetoast.ts","./src/shared/utils/formatters.ts","./src/stores/demo.ts","./src/stores/index.ts","./src/stores/navigation.ts","./src/stores/theme.ts","./src/test/setup.ts"],"version":"6.0.3"} \ No newline at end of file