Core Domain Packages
Core domain packages define the foundational data structures and business rules for RightCapital’s financial planning platform.
core-models
Section titled “core-models”The central data modeling layer providing 225+ Eloquent models and 105+ enum directories.
Key Features
Section titled “Key Features”- Unified
Modelbase class with common functionality - Comprehensive morph map for polymorphic relationships
- Auto-synced schema definitions
- Submodel/JSON field casting with validation
Directory Structure
Section titled “Directory Structure”core-models/├── src/│ ├── Enums/ # 105+ enum directories│ │ ├── Common/ # Shared enums│ │ └── {Model}/ # Model-specific enums│ ├── Models/ # 225 model classes│ │ └── Model.php # Base abstract class│ └── Schemas/ # Auto-generated schemas├── phpstan_mock/ # PHPStan mock stubs└── mysql.sql # Database schema dumpModel Categories
Section titled “Model Categories”| Category | Examples |
|---|---|
| User & Organization | User, Advisor, Client, Organization, Team |
| Financial Accounts | Account, Investment, BankAccount, LoanAccount |
| Planning | Household, Goal, Scenario, Tweak, TaxReturnTweak |
| Insurance | LifeInsurance, DisabilityInsurance, LtcInsurance |
| Allocation | AllocationByAssetType, GlidePath, TargetCategoryMix |
| Billing | BillingAccount, BillingSubscription, RightpayAccount |
| Authentication | Device, WebauthnCredential, OauthAccessToken, SsoBinding |
| Workflow | Task, Tasklet, Rightflow, Activity |
Base Model Features
Section titled “Base Model Features”namespace RightCapital\Core\Models;
abstract class Model extends Illuminate\Database\Eloquent\Model { // Age/year boundaries public const int AGE_YEAR_BOUNDARY = 150; public const int FUTURE_YEAR_MIN = 200; public const int FUTURE_YEAR_MAX = 300;
// Polymorphic relationship mapping public const array MORPH_MAP = [ 'household' => Household::class, 'account' => Account::class, // ... 200+ mappings ];}Dependencies
Section titled “Dependencies”illuminate/database,illuminate/cache,illuminate/redisrightcapital/illuminate-database,rightcapital/illuminate-validationrightcapital/array-helpers,rightcapital/billing-helpersrightcapital/business-validation-rules,rightcapital/financial-networks
core-seeds
Section titled “core-seeds”YAML-based database seeding utilities for test environment initialization.
Seeder Classes
Section titled “Seeder Classes”use RightCapital\Core\Seeds\BaseYamlSeeder;use RightCapital\Core\Seeds\CollegeYamlSeeder;
class BaseYamlSeeder extends YamlSeeder { }
// Loads from: src/college.ymlclass CollegeYamlSeeder extends YamlSeeder { }Configuration
Section titled “Configuration”<!-- In phpunit.xml --><env name="TEST_SEEDERS" value="\RightCapital\Core\Seeds\BaseYamlSeeder"/>core-test-fixtures
Section titled “core-test-fixtures”Pre-built YAML fixture datasets for automated testing.
Available Fixtures
Section titled “Available Fixtures”| Fixture | Description | Use Case |
|---|---|---|
simple | Minimal household + advisor | Basic unit tests |
simple-minimal-single | Single person, minimal data | Fast tests |
realworld | Multi-household, complex assets | Integration tests |
realworld-single | Single household, full features | Feature tests |
realworld-minimal | Multi-household, optimized | CI pipeline |
realworld-minimal-single | Single household, minimal | Quick validation |
Fixture Structure
Section titled “Fixture Structure”_meta: auto_increment: accounts: 1001 users: 1
users: - id: &STANDARD_ADVISOR 1 email: advisor@example.com type: advisor
households: - id: 1 advisor_id: *STANDARD_ADVISOR last_name: "Doe"Fixtures are loaded by laravel-test-support during test setup:
// In test classprotected function setUp(): void{ parent::setUp(); $this->seed('realworld');}business-validation-rules
Section titled “business-validation-rules”Domain-specific validation rules for financial planning logic.
Validation Categories
Section titled “Validation Categories”Age & Calendar
Section titled “Age & Calendar”| Rule | Range | Description |
|---|---|---|
client_birth_year | [1900, today) | Client birth year |
child_birth_year | [1900, 2150] | Child birth year |
general_age | (0, 150] | Any age value |
retirement_age | [0, 100] | Retirement age |
calendar_year | [1900, 2199] | Any calendar year |
Percentages & Rates
Section titled “Percentages & Rates”| Rule | Range | Description |
|---|---|---|
percentage | [0, 100] | Standard percentage |
high_percentage | [0, 200] | Extended percentage |
annual_increase | [0, 100] | Annual increase rate |
interest_rate | [0, 100] | Interest rate |
investment_cost | [0, 100] | Investment cost ratio |
Dollar Amounts
Section titled “Dollar Amounts”| Rule | Range | Description |
|---|---|---|
balance | [-100M, 100M] | Account balance |
large_dollar_amount | [0, 100M] | Large amounts |
medium_dollar_amount | [0, 15M] | Medium amounts |
extra_large_dollar_amount | [0, 1B] | Extra large amounts |
insurance_benefit | [0, 15M] | Insurance benefits |
Data Formats
Section titled “Data Formats”| Rule | Format | Description |
|---|---|---|
us_phone_number | 10-digit integer | US phone number |
us_zip_code | ZIP or ZIP+4 | US postal code |
precision | N decimal places | Decimal precision |
$validator = Validator::make($data, [ 'balance' => 'required|balance', 'birth_year' => 'required|client_birth_year', 'percentage' => 'required|percentage', 'phone' => 'required|us_phone_number',]);Service Provider
Section titled “Service Provider”Auto-registers via Laravel’s service provider discovery:
// BusinessValidationRulesServiceProviderValidator::extend('balance', 'BusinessValidationRules@validateBalance');financial-networks
Section titled “financial-networks”Advisor network abstractions for XYPN, AssetMark, and other partnerships.
Architecture
Section titled “Architecture”abstract class BaseNetwork { abstract static function getNetworkName(): string; abstract static function getNetworkIdentifierValue(): string; abstract static function getConflictNetworkIdentifierValues(): array; abstract static function getAllCouponCodes(): array; abstract function shouldChargeTerminationFee(): bool; abstract function canCancelSubscription(): bool; abstract function getAvailableCouponCode(): string|null;}Network Implementations
Section titled “Network Implementations”| Network | Identifier | Features |
|---|---|---|
| XYPN | xypn | No termination fee, self-upgrade, keeps pricing tier |
| AssetMark | asset_mark | Conflicts with XYPN |
$network = match($advisor->network_identifier) { 'xypn' => new XypnNetwork($settings), 'asset_mark' => new AssetMarkNetwork($settings),};
if ($network->canCancelSubscription()) { // Allow cancellation UI}
$plans = $network->getSubscribableStripePriceLookupKeys();$coupon = $network->getAvailableCouponCode();Configuration
Section titled “Configuration”// XypnNetworkpublic const array COUPON_CODES = ['XYPN2025', 'GrNWeycP'];public const array SUBSCRIBABLE_PLANS = [ 'standard_basic_monthly', 'standard_premium_monthly', 'standard_platinum_monthly',];Dependency Graph
Section titled “Dependency Graph”business-validation-rules ↓ core-models ←── financial-networks ↓ core-seeds ↓ core-test-fixturesSummary
Section titled “Summary”| Package | Type | Purpose | Key Exports |
|---|---|---|---|
| core-models | Data layer | Eloquent models + enums | 225 models, 105+ enums |
| core-seeds | Test infra | YAML database seeders | 2 seeder classes |
| core-test-fixtures | Test data | Fixture datasets | 6 fixture sets |
| business-validation-rules | Validation | Domain rules | 40+ validation rules |
| financial-networks | Business logic | Network abstractions | 2 network classes |