The company record and the four configuration sections that make up a plan.
message Company {
enum HrisProviderType {
UNKNOWN_HRIS_PROVIDER_TYPE = 0;
DEEL = 1;
DEEL_PRISM = 2;
PRISM = 3;
}
string uuid = 1;
string business_name = 2;
optional string business_phone = 3;
string email = 4;
com.basiccapital.common.external.Address company_address = 5;
EntityType entity_type = 6;
string ein = 7;
optional string state_of_organization = 8;
Status status = 9;
}References: EntityType, Status
enum EntityType {
UNKNOWN_COMPANY_ENTITY_TYPE = 0;
C_CORP = 1;
S_CORP = 2;
LLC = 3;
SOLE_PROPRIETORSHIP = 4;
LLP = 5;
NON_PROFIT = 6;
PARTNERSHIP = 7;
ELECTING_CHURCH = 9;
OTHER = 10;
}enum Status {
UNKNOWN_STATUS = 0;
ACTIVE = 1;
ONBOARDING = 2;
CREATED = 3;
INACTIVE = 4;
LAPSED = 5;
}message PlanConfiguration {
enum Status {
UNKNOWN_STATUS = 0;
DRAFT = 1;
IN_REVIEW = 2;
READY_FOR_SUBMISSION = 3;
SUBMITTED = 4;
}
ManagementOption management_option = 1;
InvestmentConfig investment_config = 2;
CoreConfig core_config = 3;
optional MigrationConfig plan_migration_info = 4;
Status status = 5;
}References: CoreConfig, InvestmentConfig, ManagementOption, MigrationConfig
enum ConfigurationSectionStatus {
UNKNOWN_CONFIGURATION_SECTION_STATUS = 0;
INCOMPLETE = 1;
COMPLETE = 2;
LOCKED_INCOMPLETE = 3;
LOCKED_COMPLETE = 4;
}message ManagementOption {
repeated ManagementOptionOffering management_option_offerings = 1;
ManagementOptionType type = 2;
string summary = 3;
ConfigurationSectionStatus status = 4;
}References: ConfigurationSectionStatus, ManagementOptionOffering, ManagementOptionType
message ManagementOptionOffering {
enum ManagementOptionOfferingType {
UNKNOWN = 0;
FIDUCIARY_316 = 1;
FIDUCIARY_338 = 2;
FORM_5500_FILING = 3;
CURATED_INVESTMENT_OPTION_SELECTION = 4;
ROTH_401K = 5;
TRADITIONAL_401K = 6;
EMPLOYER_MATCH = 7;
SAFE_HARBOR = 8;
COMPLIANCE_TESTING = 9;
MEGA_BACKDOOR_ROTH = 10;
BROKERAGE_WINDOW = 11;
}
ManagementOptionOfferingType type = 1;
bool isSupported = 2;
}enum ManagementOptionType {
UNKNOWN_MANAGEMENT_TYPE = 0;
PARTNER_USP_FULLY_MANAGED = 1;
PARTNER_USP_EMPLOYER_MANAGED = 2;
PARTNER_PEO = 3;
PARTNER_IC = 4;
}message InvestmentConfig {
QdiaType qdia = 1;
repeated AssetMetadata investment_options = 2;
optional ConfigurationSectionStatus status = 3;
}References: AssetMetadata, ConfigurationSectionStatus, QdiaType
enum QdiaType {
UNKNOWN_QDIA_TYPE = 0;
FIDELITY = 1;
VANGUARD = 2;
OTHER_QDIA_TYPE = 3;
}message CoreConfig {
repeated EmployerMatchTier employer_match_tiers = 1;
optional bool enable_roth = 2;
optional bool enable_plan401K_loans = 3;
optional bool enable_mega_backdoor_roth = 4;
optional int32 employee_auto_enrollment_bps = 5;
optional int32 employee_auto_enrollment_increase_bps = 6;
optional Date ideal_start_date = 7;
optional EligibilityConfig eligibility_config = 8;
ConfigurationSectionStatus status = 9;
}References: ConfigurationSectionStatus, Date, EligibilityConfig, EmployerMatchTier
message EligibilityConfig {
message HoursConfig {
int32 hours_required = 1;
int32 rolling_period = 2;
}
oneof period {
int32 days_since_start = 1;
HoursConfig hours_config = 2;
}
}Notes:
- There cannot ever be a cap that is a partial percent.
- To set up an actual employer match of 3.5% you would need to set up multiple match tiers such as this:
- match_bps: 10000, match_cap_bps: 300, that is a 100% match up to 3%
- match_bps: 5000, match_cap_bps: 100, that is 50% match up to the next 1%
message EmployerMatchTier {
int32 match_bps = 1;
int32 match_cap_bps = 2;
}message MigrationConfig {
string migration_record_keeper = 1;
}message KnownRecordKeeper {
string name = 1;
optional string logo_url = 2;
}message BankAccount {
string bank_account_uuid = 1;
string institution_name = 2;
string last_4 = 3;
bool is_verified = 4;
}message TrusteeInfo {
string external_id = 1;
string email = 2;
string given_name = 3;
string surname = 4;
}