digraph automats {
graph [rankdir=TB, splines=spline, overlap=false, bgcolor="#1e2430",
nodesep=0.95, ranksep=1.0, pad=0.5, fontname="Helvetica",
compound=true, mclimit=1.0];
node [shape=plaintext, fontname="Helvetica"];
edge [fontname="Helvetica", fontsize=9, penwidth=1.4, arrowsize=0.7];
subgraph cluster_session_realtime {
label="Session & Real-Time Hub"; labeljust="l"; fontsize=15;
style="rounded,filled"; fillcolor="#202a3a"; color="#3f4c5f";
fontcolor="#e2e8f0"; margin=14;
authAutomat [label=<
authAutomat Session & Multi-Tenant Gateway |
| STATE | user: AuthUser | Current user & company |
|
| STATE | status | 'anon' | 'authed' | 'loading' |
|
| ACTION | bootstrapSession() | Restore or fetch session |
|
| ACTION | switchCompany(id) | Multi-tenant switch |
|
| ACTION | logout() | Clear session cookie |
|
| SELECT | selectSelectedCompanyId() | Tenant selector |
|
| HOOK | auth/sessionEstablished | Session ready lifecycle |
|
| HOOK | auth/companyChanged | Company change signal |
|
| API | GET /api/auth/session | Cookie session check |
|
>];
sseAutomat [label=< | | sseAutomat Single Persistent SSE Connection |
|
| STATE | status | 'connected' | 'error' |
|
| STATE | clientId (cid) | Tab-scoped UUID in session |
|
| ACTION | reconnect() | Cycle on company switch |
|
| ACTION | on(event, handler) | Register signal listener |
|
| ACTION | watchArticle(sku) | Attach article-<sku> |
|
| SELECT | invalidateArticle(sku) | Silent cache refresh |
|
| SSE | category / articles | Catalog mutation events |
|
| SSE | order / shipment | Fulfillment events |
|
| API | GET /api/events | Persistent stream |
|
>];
}
subgraph cluster_catalog_products {
label="Catalog & Products"; labeljust="l"; fontsize=15;
style="rounded,filled"; fillcolor="#202a3a"; color="#3f4c5f";
fontcolor="#e2e8f0"; margin=14;
categoryAutomat [label=< | | | | | | | categoryAutomat Hierarchical Category Tree |
|
| STATE | categories: Map | ID -> Category Node Map |
|
| STATE | rootCategoryId | Company root node ID |
|
| STATE | articleCount | Total parent items |
|
| ACTION | loadTree() | Fetch tree & warm views |
|
| ACTION | createCategory() | Insert child node |
|
| ACTION | moveCategory() | Parent reparenting |
|
| ACTION | deleteCategory() | Prune subtree |
|
| SELECT | getCategoryBreadcrumbs() | Hierarchical path trace |
|
| API | GET /api/category | Recursive tree load |
|
>];
categoryViewAutomat [label=< | | categoryViewAutomat KeyedAutomat (Slug Path) |
|
| STATE | views: Map<slug, Data> | Articles & direct children |
|
| ACTION | loadAllCategoryViews() | Prewarm all tree slugs |
|
| ACTION | reloadLoadedCategoryViews() | Refresh cached views |
|
| ACTION | invalidateAllCategoryViews() | Clear on SSE signal |
|
| SELECT | collectLoadedCategoryViewData() | Extract union data |
|
| SELECT | getOrCreateCategoryAutomat() | Per-slug reactive store |
|
| API | GET /api/category/:id/articles | Category article batch |
|
>];
artikelAutomat [label=< | | | | | artikelAutomat In-Memory Article Record Cache |
|
| STATE | articles: Map<sku, Object> | Deduplicated SKU cache |
|
| ACTION | loadArticle(sku) | Fetch or cached promise |
|
| ACTION | reloadArticle(sku) | Silent background sync |
|
| ACTION | setArticleName(sku, name) | Optimistic rename |
|
| ACTION | clearArticle(sku) | Evict SKU from cache |
|
| SELECT | getArticle(sku) | Sync constructor read |
|
| SELECT | createArticleSelector(sku) | Fine-grained selector |
|
| API | GET /api/article/:sku | Full article document |
|
>];
articleDetailAutomat [label=< | articleDetailAutomat KeyedAutomat (SKU) |
|
| STATE | articleHistory: Map<sku> | Change history log |
|
| STATE | articleSupplier: Map<sku> | Assigned supplier list |
|
| ACTION | articleHistoryAutomat.load() | Fetch SKU audit trail |
|
| ACTION | articleSupplierAutomat.load() | Fetch supplier catalog |
|
| API | GET /api/article/:sku/history | Audit change entries |
|
| API | GET /api/article/:sku/supplier | Vendor links & prices |
|
>];
brandAutomat [label=< | | brandAutomat Catalog Brands & Makers |
|
| STATE | brands: Brand[] | Decoupled brand catalog |
|
| STATE | filteredBrands: Brand[] | Filtered search slice |
|
| ACTION | load(silent) | Deduplicated list fetch |
|
| ACTION | create() / rename() | Brand mutations |
|
| ACTION | addImage() / deleteImage() | Brand logo AVIF image |
|
| API | GET /api/brand | Paginated brand records |
|
| SSE | brand | SSE signal with sender tab |
|
>];
unitAutomat [label=< | unitAutomat Units of Measure (UoM) |
|
| STATE | units: Unit[] | Allowed SI & sales units |
|
| STATE | status: 'idle'|'ready' | Load lifecycle state |
|
| ACTION | load() | Fetch localized units |
|
| ACTION | upsert(body) | Create or update unit |
|
| ACTION | delete(id) | Remove unused unit |
|
| API | GET /api/unit | Company unit directory |
|
>];
}
subgraph cluster_search_indexing {
label="Search & Indexing"; labeljust="l"; fontsize=15;
style="rounded,filled"; fillcolor="#202a3a"; color="#3f4c5f";
fontcolor="#e2e8f0"; margin=14;
articleIndexAutomat [label=< | | | articleIndexAutomat Derived Client Search Index |
|
| STATE | items: ArticleIndexRecord[] | De-duplicated article union |
|
| STATE | status: 'ready' | Index lifecycle flag |
|
| ACTION | buildArticleIndex() | Derive from category views |
|
| ACTION | setArticleIndexName() | Patch on rename |
|
| ACTION | reload() | Re-derive from views |
|
| SELECT | selectArticleIndexItems() | Fast record projection |
|
| SELECT | ensureLoaded() | Await warm views |
|
>];
articleSearchAutomat [label=< | | articleSearchAutomat In-Memory FlexSearch Engine |
|
| STATE | target: string | Active search query |
|
| STATE | filter: string | Active category filter |
|
| STATE | result: ArticleSearchResult | Facets, recordset, count |
|
| ACTION | search(target, filter) | Synchronous indexed query |
|
| SELECT | selectSearchResult() | Reactive search outcome |
|
>];
}
subgraph cluster_properties_attributes {
label="Properties & Attributes"; labeljust="l"; fontsize=15;
style="rounded,filled"; fillcolor="#202a3a"; color="#3f4c5f";
fontcolor="#e2e8f0"; margin=14;
propertyAutomat [label=< | | propertyAutomat Custom Metadata Properties |
|
| STATE | properties: PropertyName[] | Sorted company properties |
|
| ACTION | load() | Fetch property definitions |
|
| ACTION | createProperty() | Add new property definition |
|
| ACTION | updateProperty() | Edit title & sort |
|
| API | GET /api/propertyname | Company properties |
|
| SSE | propertyname | Real-time property signal |
|
>];
attributeAutomat [label=< | | attributeAutomat Product Attributes & Discrete Values |
|
| STATE | attributes: AttributeName[] | Attributes with sorted values |
|
| ACTION | load() | Fetch attribute definitions |
|
| ACTION | createAttribute() | Create attribute group |
|
| ACTION | addValue() / deleteValue() | Discrete value options |
|
| API | GET /api/attributename | Attributes & values |
|
| SSE | attributename | Real-time attribute signal |
|
>];
}
subgraph cluster_purchasing_logistics {
label="Suppliers & Deliveries"; labeljust="l"; fontsize=15;
style="rounded,filled"; fillcolor="#202a3a"; color="#3f4c5f";
fontcolor="#e2e8f0"; margin=14;
supplierAutomat [label=< | | | supplierAutomat Supplier Directory & Catalogs |
|
| STATE | suppliers: Supplier[] | Active vendor list |
|
| STATE | status: 'ready' | Load lifecycle state |
|
| ACTION | load() | Deduplicated fetch |
|
| ACTION | reload() | Silent background sync |
|
| API | GET /api/supplier | Vendor records |
|
| SSE | supplier | Real-time supplier signal |
|
>];
deliveryAutomat [label=< | | deliveryAutomat createListAutomat (Deliveries) |
|
| STATE | items: Delivery[] | Company delivery receipts |
|
| STATE | status: 'ready' | List lifecycle state |
|
| ACTION | load() / reload() | Deduplicated fetch & sync |
|
| ACTION | reset() | Clear on session switch |
|
| API | GET /api/delivery | Inbound delivery log |
|
>];
deliveryEditorAutomat [label=< | deliveryEditorAutomat Inbound Receipt & OCR Machine |
|
| STATE | lines: DeliveryLine[] | Uncommitted draft lines |
|
| STATE | deliveryEntity | Selected supplier ID |
|
| STATE | attachments: File[] | Invoice PDFs & OCR results |
|
| STATE | draftCount: number | Uncommitted lines for badge |
|
| ACTION | addLine() / updateLine() | Interactive item editing |
|
| ACTION | commitDelivery() | Persist goods receipt |
|
| SELECT | buildSupplierArticlesMap() | Auto-match SKU/EAN |
|
| API | POST /api/delivery | Create goods receipt |
|
>];
}
subgraph cluster_sales_crm {
label="Sales & CRM"; labeljust="l"; fontsize=15;
style="rounded,filled"; fillcolor="#202a3a"; color="#3f4c5f";
fontcolor="#e2e8f0"; margin=14;
quoteAutomat [label=< | quoteAutomat createListAutomat (Quotes) |
|
| STATE | items: Quote[] | Sales quotes / Angebote |
|
| ACTION | load() / reload() | Deduplicated fetch |
|
| ACTION | reset() | Reset on logout |
|
| API | GET /api/quote | Company quote list |
|
>];
orderAutomat [label=< | | | orderAutomat Chunk-Paginated Order Engine |
|
| STATE | items: Order[] | Sales orders & lines |
|
| STATE | total: number | Unfiltered order count |
|
| STATE | onlyUnpaid / onlyUndelivered | Fulfillment filters |
|
| ACTION | loadChunk(index) | Chunk size 50 prefetch |
|
| ACTION | reload() | Silent orders re-fetch |
|
| SELECT | selectOrders() / selectTotal() | Filter-applied slice |
|
| API | GET /api/order | Paged order stream |
|
| SSE | order / shipment | Fulfillment mutations |
|
>];
entityAutomat [label=< | | entityAutomat createListAutomat (Entities) |
|
| STATE | items: Entity[] | Customers & partners |
|
| ACTION | load() / reload() | Customer directory load |
|
| ACTION | reset() | Reset on session switch |
|
| API | GET /api/entity | Directory records |
|
>];
customergroupAutomat [label=< | | customergroupAutomat createListAutomat (Groups) |
|
| STATE | items: Customergroup[] | Pricing discount tiers |
|
| ACTION | load() / reload() | Discount group load |
|
| API | GET /api/customergroup | Pricing tiers |
|
>];
}
subgraph cluster_inventory_storage {
label="Inventory & Warehousing"; labeljust="l"; fontsize=15;
style="rounded,filled"; fillcolor="#202a3a"; color="#3f4c5f";
fontcolor="#e2e8f0"; margin=14;
warehouseAutomat [label=< | | warehouseAutomat Warehouse Locations & Stock |
|
| STATE | warehouses: Warehouse[] | Storage areas & bins |
|
| STATE | filteredWarehouses | Filter search slice |
|
| ACTION | load() / reload() | Deduplicated sync |
|
| ACTION | setFilter(query) | Local filter query |
|
| API | GET /api/warehouse | Warehouse listings |
|
| SSE | warehouse | Real-time stock movement |
|
>];
}
subgraph cluster_finance_config {
label="Company & Finance"; labeljust="l"; fontsize=15;
style="rounded,filled"; fillcolor="#202a3a"; color="#3f4c5f";
fontcolor="#e2e8f0"; margin=14;
companyAutomat [label=< | companyAutomat Active Company Configuration |
|
| STATE | current: Company | Tax rates & ISO language |
|
| ACTION | load() / reload() | Fetch tenant settings |
|
| SELECT | selectCompanyTaxrate() | Standard tax rate |
|
| SELECT | selectCompanyRootCategoryId() | Root category pointer |
|
| SELECT | selectCompanyName() | Company legal name |
|
| API | GET /api/company/:id | Legal & tax profile |
|
>];
accountAutomat [label=< | accountAutomat createListAutomat (Accounts) |
|
| STATE | items: Account[] | Bank & payment ledgers |
|
| ACTION | load() / reload() | Payment accounts load |
|
| API | GET /api/account | Chart of accounts |
|
>];
numberAutomat [label=< | numberAutomat createListAutomat (Sequences) |
|
| STATE | items: NumberSeq[] | Invoice/receipt counters |
|
| ACTION | load() / reload() | Number series sync |
|
| API | GET /api/number | Document counters |
|
>];
}
subgraph cluster_hardware_pos {
label="POS & Hardware"; labeljust="l"; fontsize=15;
style="rounded,filled"; fillcolor="#202a3a"; color="#3f4c5f";
fontcolor="#e2e8f0"; margin=14;
posterminalAutomat [label=< | | posterminalAutomat POS Terminals & Gating |
|
| STATE | terminals: Posterminal[] | Hardware terminals |
|
| ACTION | load() | Fetch POS registers |
|
| ACTION | create() / delete() | Terminal registrations |
|
| ACTION | toggleCategory() | Gated category filters |
|
| SELECT | selectPosterminals() | Active registers |
|
| API | GET /api/posterminal | Terminal device configs |
|
>];
}
subgraph cluster_ai_workspace {
label="AI Assistant & Workspace"; labeljust="l"; fontsize=15;
style="rounded,filled"; fillcolor="#202a3a"; color="#3f4c5f";
fontcolor="#e2e8f0"; margin=14;
chatAutomat [label=< | | | chatAutomat AI Assistant Drawer & SSE |
|
| STATE | isOpen: boolean | Docked chat drawer toggle |
|
| STATE | conversations: [] | Conversation sessions |
|
| STATE | messages: ModelMessage[] | Live message transcript |
|
| STATE | sseStatus: 'connected' | Token streaming stream |
|
| ACTION | sendMessage(text) | Prompt model with tools |
|
| ACTION | answerAskUser() | Interactive tool modal |
|
| SELECT | userEnv / routeTools | Client navigation tool |
|
| API | POST /api/modelconversation | AI conversation session |
|
| SSE | modelconversation/events | Live token stream |
|
>];
vfsAutomat [label=< | | | vfsAutomat Virtual Filesystem Explorer |
|
| STATE | files: VfsFile[] | Company VFS workspace |
|
| STATE | selectedFileName | Current active file |
|
| STATE | fileContent / isDirty | Editor buffer & diff |
|
| ACTION | selectFile() / saveFile() | Applet editor buffer |
|
| ACTION | uploadFiles() / deleteFile() | File manipulations |
|
| API | GET /api/vfs | VFS directory index |
|
| SSE | vfs | VFS mutation signal |
|
>];
}
subgraph cluster_audit_grids {
label="Audit & Virtual Grids"; labeljust="l"; fontsize=15;
style="rounded,filled"; fillcolor="#202a3a"; color="#3f4c5f";
fontcolor="#e2e8f0"; margin=14;
articleHistoryGridAutomat [label=< | articleHistoryGridAutomat createGridAutomat (Article) |
|
| STATE | rows: [] / totalRows | Block size 50 virtual rows |
|
| ACTION | fetchRows(viewport) | Infinite scroll query |
|
| ACTION | reload() | Reload on company switch |
|
| API | GET /api/article/history | Infinite audit window |
|
>];
globalHistoryGridAutomat [label=< | globalHistoryGridAutomat createGridAutomat (Global) |
|
| STATE | rows: [] / totalRows | Block size 50 virtual rows |
|
| ACTION | fetchRows(viewport) | Infinite scroll query |
|
| ACTION | reload() | Reload on company switch |
|
| API | GET /api/globalhistory | Company global audit |
|
>];
ledgerHistoryGridAutomat [label=< | ledgerHistoryGridAutomat createGridAutomat (Ledger) |
|
| STATE | rows: [] / totalRows | Block size 50 virtual rows |
|
| ACTION | fetchRows(viewport) | Infinite scroll query |
|
| ACTION | reload() | Reload on company switch |
|
| API | GET /api/ledger/history | Append-only ledger audit |
|
>];
}
subgraph cluster_system_ui {
label="UI, Settings & System"; labeljust="l"; fontsize=15;
style="rounded,filled"; fillcolor="#202a3a"; color="#3f4c5f";
fontcolor="#e2e8f0"; margin=14;
navigationAutomat [label=< | | navigationAutomat Cross-Section Navigation Memory |
|
| STATE | lastDeliveryPath | Active receipt subpath |
|
| STATE | lastArticleSku | Active SKU selection |
|
| STATE | lastCategorySlug / Path | Active category tree node |
|
| STATE | lastSearchTerm / Path | Preserved search query |
|
| ACTION | setLastDeliveryPath() | Restore on sidebar click |
|
| ACTION | setLastArticleSku() | Restore SKU on section click |
|
| ACTION | clearNavigation() | Reset on company switch |
|
>];
userSettingsAutomat [label=<userSettingsAutomat IndexedDB User Preferences |
| STATE | viewerPosition: 'top'|'right' | Editor docking location |
|
| STATE | chatDrawerWidth: 460 | AI drawer pixel width |
|
| ACTION | setViewerPosition() | Persist docking |
|
| ACTION | setChatDrawerWidth() | Persist drawer width |
|
| HOOK | persist: true | Survives page reloads |
|
>];
helpAutomat [label=<helpAutomat IndexedDB Contextual Help |
| STATE | enabled: boolean | Interactive help badges |
|
| STATE | activeHelpId: string|null | Active popper ID |
|
| ACTION | toggle() / setEnabled() | Toggle badge mode |
|
| ACTION | openPopper() / closePopper() | Single active popper |
|
| HOOK | persist: true | Survives page reloads |
|
>];
pwaAutomat [label=<pwaAutomat Service Worker & Offline Lifecycle |
| STATE | needRefresh: boolean | New SW release pending |
|
| STATE | offlineReady: boolean | Offline assets cached |
|
| STATE | dialogOpen / updating | Prompt modal state |
|
| ACTION | applyUpdate() | Skip waiting & reload |
|
| ACTION | openDialog() / closeDialog() | Modal controls |
|
>];
Legend [label=<| Automat Graph Legend |
| STATE | Reactive store state property |
| ACTION | State mutation action |
| SELECT | Reactive PureComponent selector |
| API | Backend REST/Fetch endpoint |
| SSE | Inbound Server-Sent Event trigger |
| HOOK | Auth / persistence lifecycle hook |
| in# | Inbound arrival port on Automat header |
| ▪—▶ | Reactive dataflow / upstream trigger |
>];
}
authAutomat:p_auth_user:e -> sseAutomat:in0:n [color="#5aa7ff", fontcolor="#5aa7ff", tooltip="authAutomat → sseAutomat (bind session & cid)", label=" bind session & cid ", constraint=false, weight=1];
authAutomat:p_auth_switchCompany:w -> companyAutomat:in0:n [color="#6bdf9a", fontcolor="#6bdf9a", tooltip="authAutomat → companyAutomat (load company profile)", label=" load company profile ", constraint=false, weight=1];
authAutomat:p_auth_status:w -> categoryAutomat:in5:n [color="#f5c15c", fontcolor="#f5c15c", tooltip="authAutomat → categoryAutomat (sync tree on authed)", label=" sync tree on authed ", constraint=false, weight=1];
authAutomat:p_auth_status:w -> brandAutomat:in0:n [color="#ff7fc2", fontcolor="#ff7fc2", tooltip="authAutomat → brandAutomat (sync brands on authed)", label=" sync brands on authed ", constraint=false, weight=1];
authAutomat:p_auth_status:w -> unitAutomat:in0:n [color="#c79bff", fontcolor="#c79bff", tooltip="authAutomat → unitAutomat (sync units on authed)", label=" sync units on authed ", constraint=false, weight=1];
authAutomat:p_auth_status:e -> attributeAutomat:in0:n [color="#5cd6d6", fontcolor="#5cd6d6", tooltip="authAutomat → attributeAutomat (sync attributes on authed)", label=" sync attributes on authed ", constraint=false, weight=1];
authAutomat:p_auth_status:e -> propertyAutomat:in0:n [color="#ff9f5a", fontcolor="#ff9f5a", tooltip="authAutomat → propertyAutomat (sync properties on authed)", label=" sync properties on authed ", constraint=false, weight=1];
authAutomat:p_auth_status:w -> supplierAutomat:in1:n [color="#8f95ff", fontcolor="#8f95ff", tooltip="authAutomat → supplierAutomat (sync suppliers on authed)", label=" sync suppliers on authed ", constraint=false, weight=1];
authAutomat:p_auth_status:e -> warehouseAutomat:in0:n [color="#ff6b6b", fontcolor="#ff6b6b", tooltip="authAutomat → warehouseAutomat (sync warehouses on authed)", label=" sync warehouses on authed ", constraint=false, weight=1];
authAutomat:p_auth_status:w -> posterminalAutomat:in1:n [color="#58d18a", fontcolor="#58d18a", tooltip="authAutomat → posterminalAutomat (sync terminals on authed)", label=" sync terminals on authed ", constraint=false, weight=1];
authAutomat:p_auth_status:w -> deliveryAutomat:in1:n [color="#4fc4e8", fontcolor="#4fc4e8", tooltip="authAutomat → deliveryAutomat (sync deliveries on authed)", label=" sync deliveries on authed ", constraint=false, weight=1];
authAutomat:p_auth_status:e -> quoteAutomat:in0:n [color="#a98cff", fontcolor="#a98cff", tooltip="authAutomat → quoteAutomat (sync quotes on authed)", label=" sync quotes on authed ", constraint=false, weight=1];
authAutomat:p_auth_status:e -> orderAutomat:in0:n [color="#ff8f66", fontcolor="#ff8f66", tooltip="authAutomat → orderAutomat (sync orders on authed)", label=" sync orders on authed ", constraint=false, weight=1];
authAutomat:p_auth_status:e -> entityAutomat:in0:n [color="#4ecb8f", fontcolor="#4ecb8f", tooltip="authAutomat → entityAutomat (sync entities on authed)", label=" sync entities on authed ", constraint=false, weight=1];
authAutomat:p_auth_status:e -> customergroupAutomat:in1:n [color="#ff7aa8", fontcolor="#ff7aa8", tooltip="authAutomat → customergroupAutomat (sync customer groups)", label=" sync customer groups ", constraint=false, weight=1];
authAutomat:p_auth_status:w -> numberAutomat:in0:n [color="#e0b25a", fontcolor="#e0b25a", tooltip="authAutomat → numberAutomat (sync number series)", label=" sync number series ", constraint=false, weight=1];
authAutomat:p_auth_status:w -> accountAutomat:in0:n [color="#56c8c8", fontcolor="#56c8c8", tooltip="authAutomat → accountAutomat (sync payment accounts)", label=" sync payment accounts ", constraint=false, weight=1];
authAutomat:p_auth_status:e -> chatAutomat:in1:n [color="#ff5f9e", fontcolor="#ff5f9e", tooltip="authAutomat → chatAutomat (auth chat & reload)", label=" auth chat & reload ", weight=3];
authAutomat:p_auth_status:e -> vfsAutomat:in0:n [color="#ffb25a", fontcolor="#ffb25a", tooltip="authAutomat → vfsAutomat (load company vfs)", label=" load company vfs ", constraint=false, weight=1];
authAutomat:p_auth_status:e -> articleHistoryGridAutomat:in0:n [color="#66b3ff", fontcolor="#66b3ff", tooltip="authAutomat → articleHistoryGridAutomat (reload history on authed)", label=" reload history on authed ", constraint=false, weight=1];
authAutomat:p_auth_status:e -> globalHistoryGridAutomat:in0:n [color="#5aa7ff", fontcolor="#5aa7ff", tooltip="authAutomat → globalHistoryGridAutomat (reload audit on authed)", label=" reload audit on authed ", constraint=false, weight=1];
authAutomat:p_auth_status:e -> ledgerHistoryGridAutomat:in0:n [color="#6bdf9a", fontcolor="#6bdf9a", tooltip="authAutomat → ledgerHistoryGridAutomat (reload ledger on authed)", label=" reload ledger on authed ", constraint=false, weight=1];
sseAutomat:p_sse_events:w -> categoryAutomat:in6:n [color="#f5c15c", fontcolor="#f5c15c", tooltip="sseAutomat → categoryAutomat ('category' sse trigger)", label=" 'category' sse trigger ", constraint=false, weight=1];
sseAutomat:p_sse_events:w -> categoryViewAutomat:in1:n [color="#ff7fc2", fontcolor="#ff7fc2", tooltip="sseAutomat → categoryViewAutomat (invalidate views on sse)", label=" invalidate views on sse ", constraint=false, weight=1];
sseAutomat:p_sse_events:w -> articleIndexAutomat:in2:n [color="#c79bff", fontcolor="#c79bff", tooltip="sseAutomat → articleIndexAutomat ('articles' sse trigger)", label=" 'articles' sse trigger ", constraint=false, weight=1];
sseAutomat:p_sse_events:w -> artikelAutomat:in4:n [color="#5cd6d6", fontcolor="#5cd6d6", tooltip="sseAutomat → artikelAutomat ('article-<sku>' sse reload)", label=" 'article-<sku>' sse reload ", weight=3];
sseAutomat:p_sse_events:w -> articleDetailAutomat:in0:n [color="#ff9f5a", fontcolor="#ff9f5a", tooltip="sseAutomat → articleDetailAutomat (invalidateArticle(sku))", label=" invalidateArticle(sku) ", constraint=false, weight=1];
sseAutomat:p_sse_events:e -> warehouseAutomat:in1:n [color="#8f95ff", fontcolor="#8f95ff", tooltip="sseAutomat → warehouseAutomat ('warehouse' sse trigger)", label=" 'warehouse' sse trigger ", constraint=false, weight=1];
sseAutomat:p_sse_events:w -> supplierAutomat:in2:n [color="#ff6b6b", fontcolor="#ff6b6b", tooltip="sseAutomat → supplierAutomat ('supplier' sse trigger)", label=" 'supplier' sse trigger ", constraint=false, weight=1];
sseAutomat:p_sse_events:w -> brandAutomat:in1:n [color="#58d18a", fontcolor="#58d18a", tooltip="sseAutomat → brandAutomat ('brand' sse trigger)", label=" 'brand' sse trigger ", constraint=false, weight=1];
sseAutomat:p_sse_events:e -> attributeAutomat:in1:n [color="#4fc4e8", fontcolor="#4fc4e8", tooltip="sseAutomat → attributeAutomat ('attributename' sse)", label=" 'attributename' sse ", constraint=false, weight=1];
sseAutomat:p_sse_events:e -> propertyAutomat:in1:n [color="#a98cff", fontcolor="#a98cff", tooltip="sseAutomat → propertyAutomat ('propertyname' sse)", label=" 'propertyname' sse ", constraint=false, weight=1];
sseAutomat:p_sse_events:e -> orderAutomat:in1:n [color="#ff8f66", fontcolor="#ff8f66", tooltip="sseAutomat → orderAutomat ('order'/'shipment' sse)", label=" 'order'/'shipment' sse ", constraint=false, weight=1];
sseAutomat:p_sse_events:e -> vfsAutomat:in2:n [color="#4ecb8f", fontcolor="#4ecb8f", tooltip="sseAutomat → vfsAutomat ('vfs' sse mutation)", label=" 'vfs' sse mutation ", constraint=false, weight=1];
companyAutomat:p_comp_root:e -> categoryAutomat:in1:n [color="#ff7aa8", fontcolor="#ff7aa8", tooltip="companyAutomat → categoryAutomat (rootCategoryId)", label=" rootCategoryId ", constraint=false, weight=1];
categoryAutomat:p_cat_loadTree:e -> categoryViewAutomat:in0:n [color="#e0b25a", fontcolor="#e0b25a", tooltip="categoryAutomat → categoryViewAutomat (attachTree & warm slugs)", label=" attachTree & warm slugs ", weight=3];
categoryViewAutomat:p_catview_collect:e -> articleIndexAutomat:in1:n [color="#56c8c8", fontcolor="#56c8c8", tooltip="categoryViewAutomat → articleIndexAutomat (derived union index)", label=" derived union index ", weight=3];
articleIndexAutomat:p_idx_items:e -> articleSearchAutomat:in1:n [color="#ff5f9e", fontcolor="#ff5f9e", tooltip="articleIndexAutomat → articleSearchAutomat (query index items)", label=" query index items ", weight=3];
categoryAutomat:p_cat_categories:e -> articleSearchAutomat:in0:n [color="#ffb25a", fontcolor="#ffb25a", tooltip="categoryAutomat → articleSearchAutomat (categoryFacets)", label=" categoryFacets ", constraint=false, weight=1];
artikelAutomat:p_art_setName:e -> articleIndexAutomat:in0:n [color="#66b3ff", fontcolor="#66b3ff", tooltip="artikelAutomat → articleIndexAutomat (setArticleIndexName (optimistic))", label=" setArticleIndexName (optimistic) ", constraint=false, weight=1];
artikelAutomat:p_art_set:e -> categoryAutomat:in3:n [color="#5aa7ff", fontcolor="#5aa7ff", tooltip="artikelAutomat → categoryAutomat (articleCount updates)", label=" articleCount updates ", weight=3];
articleDetailAutomat:p_artdet_hist:e -> artikelAutomat:in2:n [color="#6bdf9a", fontcolor="#6bdf9a", tooltip="articleDetailAutomat → artikelAutomat (watch SKU details)", label=" watch SKU details ", weight=3];
deliveryEditorAutomat:p_deled_supplier:w -> supplierAutomat:in0:n [color="#f5c15c", fontcolor="#f5c15c", tooltip="deliveryEditorAutomat → supplierAutomat (match vendor catalog)", label=" match vendor catalog ", constraint=false, weight=1];
deliveryEditorAutomat:p_deled_lines:e -> artikelAutomat:in1:n [color="#ff7fc2", fontcolor="#ff7fc2", tooltip="deliveryEditorAutomat → artikelAutomat (lookup SKU & pack units)", label=" lookup SKU & pack units ", constraint=false, weight=1];
deliveryEditorAutomat:p_deled_commit:e -> deliveryAutomat:in0:n [color="#c79bff", fontcolor="#c79bff", tooltip="deliveryEditorAutomat → deliveryAutomat (commit delivery receipt)", label=" commit delivery receipt ", weight=3];
quoteAutomat:p_quote_items:w -> orderAutomat:in2:n [color="#5cd6d6", fontcolor="#5cd6d6", tooltip="quoteAutomat → orderAutomat (convert quote to order)", label=" convert quote to order ", weight=3];
orderAutomat:p_order_items:e -> entityAutomat:in1:n [color="#ff9f5a", fontcolor="#ff9f5a", tooltip="orderAutomat → entityAutomat (customer lookup)", label=" customer lookup ", weight=3];
companyAutomat:p_comp_curr:e -> customergroupAutomat:in0:n [color="#8f95ff", fontcolor="#8f95ff", tooltip="companyAutomat → customergroupAutomat (poscustomergroup)", label=" poscustomergroup ", constraint=false, weight=1];
posterminalAutomat:p_pos_term:e -> categoryAutomat:in2:n [color="#ff6b6b", fontcolor="#ff6b6b", tooltip="posterminalAutomat → categoryAutomat (filter enabled roots)", label=" filter enabled roots ", weight=3];
companyAutomat:p_comp_curr:e -> posterminalAutomat:in0:n [color="#58d18a", fontcolor="#58d18a", tooltip="companyAutomat → posterminalAutomat (company context)", label=" company context ", weight=3];
chatAutomat:p_chat_msg:e -> vfsAutomat:in1:n [color="#4fc4e8", fontcolor="#4fc4e8", tooltip="chatAutomat → vfsAutomat (inspect / edit applets)", label=" inspect / edit applets ", constraint=false, weight=1];
chatAutomat:p_chat_tools:w -> navigationAutomat:in1:n [color="#a98cff", fontcolor="#a98cff", tooltip="chatAutomat → navigationAutomat (set_user_route tool)", label=" set_user_route tool ", constraint=false, weight=1];
chatAutomat:p_chat_sse:e -> sseAutomat:in1:n [color="#ff8f66", fontcolor="#ff8f66", tooltip="chatAutomat → sseAutomat (getSseClientId())", label=" getSseClientId() ", weight=3];
navigationAutomat:p_nav_sku:e -> artikelAutomat:in0:n [color="#4ecb8f", fontcolor="#4ecb8f", tooltip="navigationAutomat → artikelAutomat (restore last SKU)", label=" restore last SKU ", constraint=false, weight=1];
navigationAutomat:p_nav_catslug:e -> categoryAutomat:in0:n [color="#ff7aa8", fontcolor="#ff7aa8", tooltip="navigationAutomat → categoryAutomat (restore last category)", label=" restore last category ", constraint=false, weight=1];
navigationAutomat:p_nav_delpath:e -> deliveryEditorAutomat:in0:n [color="#e0b25a", fontcolor="#e0b25a", tooltip="navigationAutomat → deliveryEditorAutomat (restore draft path)", label=" restore draft path ", weight=3];
userSettingsAutomat:p_usr_drawer:e -> chatAutomat:in0:n [color="#56c8c8", fontcolor="#56c8c8", tooltip="userSettingsAutomat → chatAutomat (chatDrawerWidth)", label=" chatDrawerWidth ", weight=3];
helpAutomat:p_help_active:e -> navigationAutomat:in0:n [color="#ff5f9e", fontcolor="#ff5f9e", tooltip="helpAutomat → navigationAutomat (route-contextual help)", label=" route-contextual help ", weight=3];
categoryAutomat:p_cat_categories:ne -> categoryAutomat:in4:n [color="#ffb25a", fontcolor="#ffb25a", tooltip="categoryAutomat → categoryAutomat (nested tree hierarchy)", label=" nested tree hierarchy ", weight=3];
artikelAutomat:p_art_set:ne -> artikelAutomat:in3:n [color="#66b3ff", fontcolor="#66b3ff", tooltip="artikelAutomat → artikelAutomat (variants & parent SKU)", label=" variants & parent SKU ", weight=3];
chatAutomat:p_chat_msg:nw -> chatAutomat:in2:n [color="#5aa7ff", fontcolor="#5aa7ff", tooltip="chatAutomat → chatAutomat (stream delta appends)", label=" stream delta appends ", weight=3];
}