---
title: SAIF.Business.Utilities business rules
summary: Enumerated business rules with per-rule trigger, enforcement, and outcomes.
status: draft
owner: <owner>
last_reviewed: 2026-07-30
library: SAIF.Business.Utilities
reference_type: package
---

# SAIF.Business.Utilities business rules

This library encodes text-formatting conventions rather than insurance/claims-domain business logic. No formal business rules (in the domain-decision sense of trigger/condition/enforcement/outcome tied to insurance/claims processing) were identified. The two formatting/validation conventions below are documented for completeness per the analysis contract.

## BR-001: Fixed-case rendering of configured abbreviations

| Field | Value |
| --- | --- |
| **Statement** | Certain abbreviations (e.g., "SAIF", "LLC", "MD", "PhD", state codes) must render in a specific fixed case regardless of input casing. |
| **Trigger** | Any string passed to `TitleCase.ToTitleCase`. |
| **Enforcement** | `TitleCaseSingleWord` word-list lookup against `UpperCaseWordList`, `MixedCaseWordList`, and `LowerCaseWordList`. |
| **Outcome** | The word is rendered per the configured casing table instead of the default proper-case algorithm. |
| **Source** | `Business\SAIF.Business.Utilities\TitleCase.vb` |

---

## BR-002: Numeric conversion upper bound

| Field | Value |
| --- | --- |
| **Statement** | Numeric amounts above 999,999,999,999,999 cannot be converted to text. |
| **Trigger** | Call to `mdlTextConversion.NumberToText` with `n > 999999999999999`. |
| **Enforcement** | Explicit guard clause at the top of `NumberToText`. |
| **Outcome** | `ApplicationException("Number too large to convert to text. Limit is 999,999,999,999,999.")` is thrown. |
| **Source** | `Business\SAIF.Business.Utilities\mdlTextConversion.vb` |

---

## BR-003: Already-mixed-case words bypass title-casing

| Field | Value |
| --- | --- |
| **Statement** | A word that already contains at least one uppercase and one lowercase character is returned unchanged, bypassing all word-list, numeric-suffix, and proper-case rendering. |
| **Trigger** | `TitleCaseSingleWord` evaluates a word that already has mixed case (e.g., "McMahon", "eBay"). |
| **Enforcement** | Guard clause at the top of `TitleCaseSingleWord`: `If word.ToCharArray.Any(Function(c) Char.IsUpper(c)) And word.ToCharArray.Any(Function(c) Char.IsLower(c)) Then Return word`. |
| **Outcome** | The word is emitted exactly as supplied by the caller, with no case transformation applied. |
| **Confidence** | Source-backed |
| **Source** | `Business\SAIF.Business.Utilities\TitleCase.vb` |

---

## BR-004: Numeric-ordinal words bypass word-list casing

| Field | Value |
| --- | --- |
| **Statement** | A word consisting of a number followed by a recognized ordinal suffix (`st`, `nd`, `rd`, `th`) is rendered as the numeral plus the lowercase suffix, bypassing the uppercase/lowercase/mixed-case word-list checks and the default proper-case rendering. |
| **Trigger** | `TitleCaseSingleWord` evaluates a word for which `HasNumberSuffix` returns `True` (e.g., "1st", "22nd"). |
| **Enforcement** | `GetNumberSuffixParts` splits the word into its numeric and suffix components using the configured `NumberSuffixes` list (`"st", "nd", "rd", "th"`, all lowercase) and reassembles them without applying casing rules to the numeral. |
| **Outcome** | The rendered word always carries a lowercase ordinal suffix regardless of the input's original casing. |
| **Confidence** | Source-backed |
| **Source** | `Business\SAIF.Business.Utilities\TitleCase.vb` |

---

## BR-005: Configured possessive suffixes are forced to fixed casing

| Field | Value |
| --- | --- |
| **Statement** | A word ending in a configured exact suffix (currently only the possessive `'s`) has that suffix forced to lowercase as a final pass over the already title-cased output, regardless of the suffix's casing in the original input. |
| **Trigger** | `ApplyExactSuffixList` is run over each word of the reassembled title-cased string as the final formatting pass in `ToTitleCase`. |
| **Enforcement** | `ApplyExactSuffixList` matches the longest applicable suffix from `MixedCaseSuffixList` (`"'s"`, lowercase) case-insensitively, then rebuilds the word as `<word-without-suffix><configured-suffix>`. |
| **Outcome** | Possessive suffixes always render lowercase (e.g., "MIKE'S" becomes "Mike's"), even though the rest of the word may be uppercase per [BR-001](#br-001-fixed-case-rendering-of-configured-abbreviations). |
| **Confidence** | Source-backed |
| **Source** | `Business\SAIF.Business.Utilities\TitleCase.vb` |

---

## BR-006: Capital-letter padding is skipped when input already contains a space

| Field | Value |
| --- | --- |
| **Statement** | `ToPadCapitalLetters` returns the input string unchanged, without inserting any spaces, when the input already contains a space character. |
| **Trigger** | Caller invokes the `ToPadCapitalLetters` string extension. |
| **Enforcement** | Guard clause: `If Target.Contains(" ") Then Return Target Else Return (New PadCapitalLettersFormat).ApplyFormat(Target)`. |
| **Outcome** | Padding logic (delegated to the external `PadCapitalLettersFormat` type) only runs against strings with no existing spaces. |
| **Confidence** | Source-backed |
| **Source** | `Business\SAIF.Business.Utilities\TitleCase.vb` |

## Notes
- These rules are formatting/validation conventions rather than insurance-domain business rules.

## Related documentation
- [Index](index.md)
- [Overview](overview.md)
- [Architecture](architecture.md)
- [Dependencies](dependencies.md)
- [Operations and processes](operations-processes.md)
- [API reference](api/index.md)

## Sources
- `Business\SAIF.Business.Utilities\TitleCase.vb`
- `Business\SAIF.Business.Utilities\mdlTextConversion.vb`
