---
title: "SAIF.Business.Menu operations and processes"
summary: "Business and technical operations supported by this library."
status: draft
owner: SAIF documentation team
last_reviewed: 2026-08-17
library: SAIF.Business.Menu
reference_type: package
---

# SAIF.Business.Menu operations and processes

This page is the operation catalog and cross-operation hub for `SAIF.Business.Menu`. Each operation's detailed logic lives on its own page under `operations/`.

## Operation catalog
| Operation | Intent | Trigger | Inputs | Outputs | Rules | Tables | SQL |
| --- | --- | --- | --- | --- | --- | --- | --- |
| [Build a user's authorized menu](operations/build-authorized-menu.md) | Loads the authorized menu for one user or the all-users snapshot. | Caller requests authorized navigation. | `IDataPortalInfo`, optional `MenuUser` | Typed `clsMenuAuthorizedItemCollection` | [BR-MENU-002](business-rules.md#br-menu-002-unsecured-menu-items-are-visible-by-default)<br>[BR-MENU-003](business-rules.md#br-menu-003-security-group-matching-is-case-insensitive)<br>[BR-MENU-004](business-rules.md#br-menu-004-favorites-are-always-included-and-ordered)<br>[BR-MENU-006](business-rules.md#br-menu-006-retrieve-all-uses-the-unsecured-wildcard-sentinel) | [MENU_ITEM](database-tables.md#menuitem)<br>[MENU_SECURITY](database-tables.md#menusecurity)<br>[MENU_SECURITY_USER](database-tables.md#menusecurityuser)<br>[MENU_PAGE](database-tables.md#menupage)<br>[BUSONLINE_APPS_CODE](database-tables.md#busonlineappscode)<br>[MENU_CATEGORY_CODE](database-tables.md#menucategorycode)<br>[MENU_FAVORITE](database-tables.md#menufavorite) | [SQL-MENU-043](sql/SQL-MENU-043-retrieve-authorized-menu-items-for-user.md)<br>[SQL-MENU-044](sql/SQL-MENU-044-retrieve-all-authorized-menu-items.md) |
| [Manage a user's menu favorites](operations/manage-menu-favorites.md) | Creates, updates, removes, and retrieves favorite menu rows. | Caller maintains or loads favorites. | `IDataPortalInfo`, user and favorite keys | Persisted favorite rows and collections | [BR-MENU-001](business-rules.md#br-menu-001-optimistic-contention-on-write)<br>[BR-MENU-004](business-rules.md#br-menu-004-favorites-are-always-included-and-ordered) | [MENU_FAVORITE](database-tables.md#menufavorite)<br>[MENU_ITEM](database-tables.md#menuitem) | [SQL-MENU-036](sql/SQL-MENU-036-next-menu-favorite-sequence.md)<br>[SQL-MENU-037](sql/SQL-MENU-037-delete-menu-favorite.md)<br>[SQL-MENU-038](sql/SQL-MENU-038-insert-menu-favorite.md)<br>[SQL-MENU-039](sql/SQL-MENU-039-retrieve-menu-favorite.md)<br>[SQL-MENU-040](sql/SQL-MENU-040-update-menu-favorite.md)<br>[SQL-MENU-041](sql/SQL-MENU-041-retrieve-all-menu-favorites.md)<br>[SQL-MENU-042](sql/SQL-MENU-042-retrieve-menu-favorites-for-user.md) |
| [Maintain a menu item together with its security-group assignments](operations/maintain-menu-item-security.md) | Saves a menu item and its child security-group rows as one logical change. | Caller edits a menu item and its security groups. | `IDataPortalInfo`, menu-item fields, security groups | Persisted item and security rows | [BR-MENU-001](business-rules.md#br-menu-001-optimistic-contention-on-write)<br>[BR-MENU-003](business-rules.md#br-menu-003-security-group-matching-is-case-insensitive)<br>[BR-MENU-005](business-rules.md#br-menu-005-menu-item-validity-and-dirtiness-cascade-to-security-groups) | [MENU_ITEM](database-tables.md#menuitem)<br>[MENU_SECURITY](database-tables.md#menusecurity)<br>[MENU_PAGE](database-tables.md#menupage)<br>[MENU_CATEGORY_CODE](database-tables.md#menucategorycode) | [SQL-MENU-012](sql/SQL-MENU-012-next-menu-item-sequence.md)<br>[SQL-MENU-013](sql/SQL-MENU-013-delete-menu-item.md)<br>[SQL-MENU-014](sql/SQL-MENU-014-insert-menu-item.md)<br>[SQL-MENU-015](sql/SQL-MENU-015-retrieve-menu-item.md)<br>[SQL-MENU-016](sql/SQL-MENU-016-update-menu-item.md)<br>[SQL-MENU-017](sql/SQL-MENU-017-retrieve-all-menu-items.md)<br>[SQL-MENU-024](sql/SQL-MENU-024-next-menu-security-sequence.md)<br>[SQL-MENU-025](sql/SQL-MENU-025-delete-menu-security-row.md)<br>[SQL-MENU-026](sql/SQL-MENU-026-insert-menu-security-row.md)<br>[SQL-MENU-027](sql/SQL-MENU-027-retrieve-menu-security-row.md)<br>[SQL-MENU-028](sql/SQL-MENU-028-update-menu-security-row.md)<br>[SQL-MENU-029](sql/SQL-MENU-029-retrieve-all-menu-security-rows.md)<br>[SQL-MENU-030](sql/SQL-MENU-030-retrieve-menu-security-for-item.md) |
| [Maintain reference data](operations/maintain-reference-data.md) | Maintains lookup, page, and user-to-group reference rows. | Caller maintains lookup or membership data. | `IDataPortalInfo` plus natural or surrogate keys | Persisted lookup and membership rows | [BR-MENU-001](business-rules.md#br-menu-001-optimistic-contention-on-write) | [BUSONLINE_APPS_CODE](database-tables.md#busonlineappscode)<br>[MENU_CATEGORY_CODE](database-tables.md#menucategorycode)<br>[MENU_PAGE](database-tables.md#menupage)<br>[MENU_SECURITY_USER](database-tables.md#menusecurityuser) | [SQL-MENU-001](sql/SQL-MENU-001-delete-application-code.md)<br>[SQL-MENU-002](sql/SQL-MENU-002-insert-application-code.md)<br>[SQL-MENU-003](sql/SQL-MENU-003-retrieve-application-code.md)<br>[SQL-MENU-004](sql/SQL-MENU-004-update-application-code.md)<br>[SQL-MENU-005](sql/SQL-MENU-005-retrieve-all-application-codes.md)<br>[SQL-MENU-006](sql/SQL-MENU-006-retrieve-active-application-codes.md)<br>[SQL-MENU-007](sql/SQL-MENU-007-delete-menu-category-code.md)<br>[SQL-MENU-008](sql/SQL-MENU-008-insert-menu-category-code.md)<br>[SQL-MENU-009](sql/SQL-MENU-009-retrieve-menu-category-code.md)<br>[SQL-MENU-010](sql/SQL-MENU-010-update-menu-category-code.md)<br>[SQL-MENU-011](sql/SQL-MENU-011-retrieve-all-menu-category-codes.md)<br>[SQL-MENU-018](sql/SQL-MENU-018-next-menu-page-sequence.md)<br>[SQL-MENU-019](sql/SQL-MENU-019-delete-menu-page.md)<br>[SQL-MENU-020](sql/SQL-MENU-020-insert-menu-page.md)<br>[SQL-MENU-021](sql/SQL-MENU-021-retrieve-menu-page.md)<br>[SQL-MENU-022](sql/SQL-MENU-022-update-menu-page.md)<br>[SQL-MENU-023](sql/SQL-MENU-023-retrieve-all-menu-pages.md)<br>[SQL-MENU-031](sql/SQL-MENU-031-delete-menu-security-user-row.md)<br>[SQL-MENU-032](sql/SQL-MENU-032-insert-menu-security-user-row.md)<br>[SQL-MENU-033](sql/SQL-MENU-033-update-menu-security-user-row.md)<br>[SQL-MENU-034](sql/SQL-MENU-034-retrieve-all-menu-security-user-rows.md)<br>[SQL-MENU-035](sql/SQL-MENU-035-retrieve-menu-security-users-for-user.md) |

## Process flow diagram
The following diagram visualizes the primary operational flow across the documented operations.

```mermaid
flowchart TD
    Ref[Maintain reference data] --> Item[Maintain menu item and security groups]
    Item --> Fav[Manage menu favorites]
    Fav --> Build[Build authorized menu]
    Build --> Render[Caller renders navigation]
```

## Database interactions

The following table summarizes which operations read from or write to the database. Per-step SQL and table citations live in each operation's detail page.

| Operation | SQL | Tables | Type |
| --- | --- | --- | --- |
| [Build a user's authorized menu](operations/build-authorized-menu.md) | [SQL-MENU-043](sql/SQL-MENU-043-retrieve-authorized-menu-items-for-user.md)<br>[SQL-MENU-044](sql/SQL-MENU-044-retrieve-all-authorized-menu-items.md) | [MENU_ITEM](database-tables.md#menuitem)<br>[MENU_SECURITY](database-tables.md#menusecurity)<br>[MENU_SECURITY_USER](database-tables.md#menusecurityuser)<br>[MENU_PAGE](database-tables.md#menupage)<br>[BUSONLINE_APPS_CODE](database-tables.md#busonlineappscode)<br>[MENU_CATEGORY_CODE](database-tables.md#menucategorycode)<br>[MENU_FAVORITE](database-tables.md#menufavorite) | Read |
| [Manage a user's menu favorites](operations/manage-menu-favorites.md) | [SQL-MENU-036](sql/SQL-MENU-036-next-menu-favorite-sequence.md)<br>[SQL-MENU-037](sql/SQL-MENU-037-delete-menu-favorite.md)<br>[SQL-MENU-038](sql/SQL-MENU-038-insert-menu-favorite.md)<br>[SQL-MENU-039](sql/SQL-MENU-039-retrieve-menu-favorite.md)<br>[SQL-MENU-040](sql/SQL-MENU-040-update-menu-favorite.md)<br>[SQL-MENU-041](sql/SQL-MENU-041-retrieve-all-menu-favorites.md)<br>[SQL-MENU-042](sql/SQL-MENU-042-retrieve-menu-favorites-for-user.md) | [MENU_FAVORITE](database-tables.md#menufavorite)<br>[MENU_ITEM](database-tables.md#menuitem) | Read/Write |
| [Maintain a menu item together with its security-group assignments](operations/maintain-menu-item-security.md) | [SQL-MENU-012](sql/SQL-MENU-012-next-menu-item-sequence.md)<br>[SQL-MENU-013](sql/SQL-MENU-013-delete-menu-item.md)<br>[SQL-MENU-014](sql/SQL-MENU-014-insert-menu-item.md)<br>[SQL-MENU-015](sql/SQL-MENU-015-retrieve-menu-item.md)<br>[SQL-MENU-016](sql/SQL-MENU-016-update-menu-item.md)<br>[SQL-MENU-017](sql/SQL-MENU-017-retrieve-all-menu-items.md)<br>[SQL-MENU-024](sql/SQL-MENU-024-next-menu-security-sequence.md)<br>[SQL-MENU-025](sql/SQL-MENU-025-delete-menu-security-row.md)<br>[SQL-MENU-026](sql/SQL-MENU-026-insert-menu-security-row.md)<br>[SQL-MENU-027](sql/SQL-MENU-027-retrieve-menu-security-row.md)<br>[SQL-MENU-028](sql/SQL-MENU-028-update-menu-security-row.md)<br>[SQL-MENU-029](sql/SQL-MENU-029-retrieve-all-menu-security-rows.md)<br>[SQL-MENU-030](sql/SQL-MENU-030-retrieve-menu-security-for-item.md) | [MENU_ITEM](database-tables.md#menuitem)<br>[MENU_SECURITY](database-tables.md#menusecurity)<br>[MENU_PAGE](database-tables.md#menupage)<br>[MENU_CATEGORY_CODE](database-tables.md#menucategorycode) | Read/Write |
| [Maintain reference data](operations/maintain-reference-data.md) | [SQL-MENU-001](sql/SQL-MENU-001-delete-application-code.md)<br>[SQL-MENU-002](sql/SQL-MENU-002-insert-application-code.md)<br>[SQL-MENU-003](sql/SQL-MENU-003-retrieve-application-code.md)<br>[SQL-MENU-004](sql/SQL-MENU-004-update-application-code.md)<br>[SQL-MENU-005](sql/SQL-MENU-005-retrieve-all-application-codes.md)<br>[SQL-MENU-006](sql/SQL-MENU-006-retrieve-active-application-codes.md)<br>[SQL-MENU-007](sql/SQL-MENU-007-delete-menu-category-code.md)<br>[SQL-MENU-008](sql/SQL-MENU-008-insert-menu-category-code.md)<br>[SQL-MENU-009](sql/SQL-MENU-009-retrieve-menu-category-code.md)<br>[SQL-MENU-010](sql/SQL-MENU-010-update-menu-category-code.md)<br>[SQL-MENU-011](sql/SQL-MENU-011-retrieve-all-menu-category-codes.md)<br>[SQL-MENU-018](sql/SQL-MENU-018-next-menu-page-sequence.md)<br>[SQL-MENU-019](sql/SQL-MENU-019-delete-menu-page.md)<br>[SQL-MENU-020](sql/SQL-MENU-020-insert-menu-page.md)<br>[SQL-MENU-021](sql/SQL-MENU-021-retrieve-menu-page.md)<br>[SQL-MENU-022](sql/SQL-MENU-022-update-menu-page.md)<br>[SQL-MENU-023](sql/SQL-MENU-023-retrieve-all-menu-pages.md)<br>[SQL-MENU-031](sql/SQL-MENU-031-delete-menu-security-user-row.md)<br>[SQL-MENU-032](sql/SQL-MENU-032-insert-menu-security-user-row.md)<br>[SQL-MENU-033](sql/SQL-MENU-033-update-menu-security-user-row.md)<br>[SQL-MENU-034](sql/SQL-MENU-034-retrieve-all-menu-security-user-rows.md)<br>[SQL-MENU-035](sql/SQL-MENU-035-retrieve-menu-security-users-for-user.md) | [BUSONLINE_APPS_CODE](database-tables.md#busonlineappscode)<br>[MENU_CATEGORY_CODE](database-tables.md#menucategorycode)<br>[MENU_PAGE](database-tables.md#menupage)<br>[MENU_SECURITY_USER](database-tables.md#menusecurityuser) | Read/Write |

## Failure and edge-case behavior
- Authorized-menu retrieval returns an empty collection when no rows match the user's groups, favorites, or public-item branch.
- Write operations surface optimistic-contention errors when the database does not report exactly one affected row.
- Favorites stop participating in menu composition when `ITEM_INACTIVE_DATE` is populated.
- Public rows appear in all-users snapshots through the `UNSECURED` sentinel path used by [BR-MENU-006](business-rules.md#br-menu-006-retrieve-all-uses-the-unsecured-wildcard-sentinel).

## Inherited operations and processes

No `dependency-resolution.json` was produced for this run, so the operations below are a best-effort inference from typical SAIF BOF framework (`clsBusinessBase` / `clsBusinessCollection`) lifecycle patterns observed elsewhere in this codebase, not a Legends CLI-sourced dependency lookup.**

### From clsBusinessBase (SAIF.BOF.Framework)**
- **Data-portal lifecycle dispatch** — `Save()`, `Delete()`, and the shared/static retrieve helpers route through the inherited data-portal (`IDataPortalInfo`/`IPortalRequest`) lifecycle, which invokes each entity's overridden `BeforeInsert`/`AfterInsert`, `BeforeUpdate`/`AfterUpdate`, `BeforeDelete`/`AfterDelete`, and `BeforeRetrieve`/`AfterRetrieve` hooks in this library.** This base lifecycle is what every insert/update/retrieve operation catalogued above ultimately runs through.**
- **Error/message aggregation** — `AddErrorMessage` and related validation-message plumbing used by local `AfterInsert`/`AfterUpdate`/`AfterDelete` overrides (e.g., the `RowsAffected <> 1` checks behind [BR-MENU-001](business-rules.md#br-menu-001-optimistic-contention-on-write)) are inherited members, not locally defined behavior.**

### From clsBusinessCollection(Of T) (SAIF.BOF.Framework)**
- **Retrieve-all/shared-retrieve dispatch** — collection-level static factory methods (for example `GetAllMenuItems`, `GetMenuAuthorizedItems`) build on inherited collection retrieve plumbing that populates the typed collection from a data reader via the overridden `AfterRetrieve`.**
- **Deleted-item tracking** — `Remove` moves an item to an inherited deleted-items list so that a later `Save()` on the collection still issues the corresponding delete statement for rows removed from memory (see [BR-INH-002](business-rules.md#br-inh-002-collection-membership-tracks-deleted-rows-separately)).**

## Related documentation
- [Index](index.md)
- [Overview](overview.md)
- [Architecture](architecture.md)
- [Dependencies](dependencies.md)
- [Business rules](business-rules.md)
- [Security and authorization](security-authorization.md)
- [Database tables](database-tables.md)
- [SQL catalog](sql/index.md)
- [API reference](api/index.md)

> **Note:** Statements marked with `**` could not be confirmed; treat
> as unknown until verified.

## Sources
- `SAIF.Business.Menu\clsApplicationCode.vb`
- `SAIF.Business.Menu\clsApplicationCodeCollection.vb`
- `SAIF.Business.Menu\clsMenuAuthorizedItemCollection.vb`
- `SAIF.Business.Menu\clsMenuFavorite.vb`
- `SAIF.Business.Menu\clsMenuFavoriteCollection.vb`
- `SAIF.Business.Menu\clsMenuItem.vb`
- `SAIF.Business.Menu\clsMenuPage.vb`
- `SAIF.Business.Menu\clsMenuSecurity.vb`
- `SAIF.Business.Menu\clsMenuSecurityCollection.vb`
- `SAIF.Business.Menu\clsMenuSecurityUser.vb`
- `SAIF.Business.Menu\clsMenuSecurityUserCollection.vb`
