Skip to content

Core Domain Packages

Core domain packages define the foundational data structures and business rules for RightCapital’s financial planning platform.

The central data modeling layer providing 225+ Eloquent models and 105+ enum directories.

  • Unified Model base class with common functionality
  • Comprehensive morph map for polymorphic relationships
  • Auto-synced schema definitions
  • Submodel/JSON field casting with validation
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 dump
CategoryExamples
User & OrganizationUser, Advisor, Client, Organization, Team
Financial AccountsAccount, Investment, BankAccount, LoanAccount
PlanningHousehold, Goal, Scenario, Tweak, TaxReturnTweak
InsuranceLifeInsurance, DisabilityInsurance, LtcInsurance
AllocationAllocationByAssetType, GlidePath, TargetCategoryMix
BillingBillingAccount, BillingSubscription, RightpayAccount
AuthenticationDevice, WebauthnCredential, OauthAccessToken, SsoBinding
WorkflowTask, Tasklet, Rightflow, Activity
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
];
}
  • illuminate/database, illuminate/cache, illuminate/redis
  • rightcapital/illuminate-database, rightcapital/illuminate-validation
  • rightcapital/array-helpers, rightcapital/billing-helpers
  • rightcapital/business-validation-rules, rightcapital/financial-networks

YAML-based database seeding utilities for test environment initialization.

src/base.yml
use RightCapital\Core\Seeds\BaseYamlSeeder;
use RightCapital\Core\Seeds\CollegeYamlSeeder;
class BaseYamlSeeder extends YamlSeeder { }
// Loads from: src/college.yml
class CollegeYamlSeeder extends YamlSeeder { }
<!-- In phpunit.xml -->
<env name="TEST_SEEDERS" value="\RightCapital\Core\Seeds\BaseYamlSeeder"/>

Pre-built YAML fixture datasets for automated testing.

FixtureDescriptionUse Case
simpleMinimal household + advisorBasic unit tests
simple-minimal-singleSingle person, minimal dataFast tests
realworldMulti-household, complex assetsIntegration tests
realworld-singleSingle household, full featuresFeature tests
realworld-minimalMulti-household, optimizedCI pipeline
realworld-minimal-singleSingle household, minimalQuick validation
database.yml
_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 class
protected function setUp(): void
{
parent::setUp();
$this->seed('realworld');
}

Domain-specific validation rules for financial planning logic.

RuleRangeDescription
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
RuleRangeDescription
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
RuleRangeDescription
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
RuleFormatDescription
us_phone_number10-digit integerUS phone number
us_zip_codeZIP or ZIP+4US postal code
precisionN decimal placesDecimal precision
$validator = Validator::make($data, [
'balance' => 'required|balance',
'birth_year' => 'required|client_birth_year',
'percentage' => 'required|percentage',
'phone' => 'required|us_phone_number',
]);

Auto-registers via Laravel’s service provider discovery:

// BusinessValidationRulesServiceProvider
Validator::extend('balance', 'BusinessValidationRules@validateBalance');

Advisor network abstractions for XYPN, AssetMark, and other partnerships.

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;
}
NetworkIdentifierFeatures
XYPNxypnNo termination fee, self-upgrade, keeps pricing tier
AssetMarkasset_markConflicts 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();
// XypnNetwork
public const array COUPON_CODES = ['XYPN2025', 'GrNWeycP'];
public const array SUBSCRIBABLE_PLANS = [
'standard_basic_monthly',
'standard_premium_monthly',
'standard_platinum_monthly',
];

business-validation-rules
core-models ←── financial-networks
core-seeds
core-test-fixtures
PackageTypePurposeKey Exports
core-modelsData layerEloquent models + enums225 models, 105+ enums
core-seedsTest infraYAML database seeders2 seeder classes
core-test-fixturesTest dataFixture datasets6 fixture sets
business-validation-rulesValidationDomain rules40+ validation rules
financial-networksBusiness logicNetwork abstractions2 network classes