Политика удаления.
Restrict звено сделки: удалить нельзя, пока есть ссылки
Cascade сателлит: уходит вместе с владельцем
SetNull справочная ссылка: обнуляется
Ничего не нашлось. Попробуйте часть имени таблицы — например hold или dispute.
Пользователи и роли
19 таблиц3 × Restrict
Аккаунт, профиль и две клиентские ипостаси — фаундер (Customer) и исполнитель (Employee). Платформенные роли живут здесь же, в справочнике Role.
erDiagram
UserOnRole }|--|| User : "cascade"
UserOnRole }|--|| Role : "cascade"
Profile }|--|| User : "cascade"
Avatar }|--|| Profile : "cascade"
Customer }|--|| User : "restrict"
CustomerProfile }|--|| Customer : "cascade"
CustomerProfile }|--|| Profile : "cascade"
Employee }|--|| User : "restrict"
EmployeeProfile }|--|| Employee : "cascade"
EmployeeProfile }|--|| Profile : "cascade"
EmployeeProfileSkill }|--|| EmployeeProfile : "cascade"
EmployeeProfileSkill }|--|| Skill : "cascade"
EmployeeProfileSpecialization }|--|| EmployeeProfile : "cascade"
EmployeeProfileSpecialization }|--|| Specialization : "cascade"
Portfolio }|--|| EmployeeProfile : "cascade"
Portfolio }o--|| Specialization : "restrict"
PortfolioSkill }|--|| Portfolio : "cascade"
PortfolioSkill }|--|| Skill : "cascade"
PortfolioLink }|--|| Portfolio : "cascade"
PortfolioMedia }|--|| Portfolio : "cascade"
ProfileLanguageLink }|--|| Profile : "cascade"
ProfileLanguageLink }|--|| ProfileLanguage : "cascade"
| id | String | PK |
| email | String | уник |
| phone | String | уник? |
| passwordHash | String | ? |
| passwordSalt | String | ? |
| isEmailVerified | Boolean | |
| isBlocked | Boolean | |
| createdAt | DateTime | |
| updatedAt | DateTime | |
| deletedAt | DateTime | ? |
| id | String | PK |
| type | RoleType | уник |
| createdAt | DateTime | |
| updatedAt | DateTime | |
| id | String | PK |
| userId | String | |
| roleId | String | |
| createdAt | DateTime | |
| updatedAt | DateTime | |
- →
UserCascade - →
RoleCascade
| id | String | PK |
| userId | String | уник |
| firstName | String | ? |
| lastName | String | ? |
| timezoneId | String | ? |
| locationId | String | ? |
| createdAt | DateTime | |
| updatedAt | DateTime | |
- →
UserCascade - →
TimezoneSetNull - →
LocationSetNull
| id | String | PK |
| profileId | String | уник |
| url | String | |
| format | String | |
| createdAt | DateTime | |
| updatedAt | DateTime | |
| id | String | PK |
| userId | String | уник |
| createdAt | DateTime | |
| updatedAt | DateTime | |
CustomerProfile
customers_profiles| id | String | PK |
| customerId | String | уник |
| profileId | String | уник |
| createdAt | DateTime | |
| updatedAt | DateTime | |
- →
CustomerCascade - →
ProfileCascade
| id | String | PK |
| userId | String | уник |
| bio | String | ? |
| createdAt | DateTime | |
| updatedAt | DateTime | |
EmployeeProfile
employee_profiles| id | String | PK |
| employeeId | String | уник |
| profileId | String | уник |
| experienceMonths | Int | ? |
| workType | WorkType | |
| createdAt | DateTime | |
| updatedAt | DateTime | |
- →
EmployeeCascade - →
ProfileCascade
EmployeeProfileSkill
employees_profiles_skills| id | String | PK |
| employeeProfileId | String | |
| skillId | String | |
- →
EmployeeProfileCascade - →
SkillCascade
EmployeeProfileSpecialization
employees_profiles_specializations| id | String | PK |
| employeeProfileId | String | |
| specializationId | String | |
- →
EmployeeProfileCascade - →
SpecializationCascade
| id | String | PK |
| name | String | уник |
| description | String | ? |
| createdAt | DateTime | |
| updatedAt | DateTime | |
Specialization
specializations| id | String | PK |
| name | String | уник |
| description | String | ? |
| createdAt | DateTime | |
| updatedAt | DateTime | |
| id | String | PK |
| employeeProfileId | String | |
| specializationId | String | ? |
| title | String | |
| description | String | ? |
| createdAt | DateTime | |
| updatedAt | DateTime | |
- →
EmployeeProfileCascade - →
SpecializationRestrict
PortfolioSkill
portfolios_skills| id | String | PK |
| portfolioId | String | |
| skillId | String | |
- →
PortfolioCascade - →
SkillCascade
PortfolioLink
portfolios_links| id | String | PK |
| portfolioId | String | |
| type | PortfolioLinkType | |
| url | String | |
| createdAt | DateTime | |
| updatedAt | DateTime | |
PortfolioMedia
portfolios_media| id | String | PK |
| portfolioId | String | |
| url | String | |
| format | String | |
| createdAt | DateTime | |
| updatedAt | DateTime | |
ProfileLanguage
profile_languages| id | String | PK |
| code | String | уник |
| name | String | |
| createdAt | DateTime | |
| updatedAt | DateTime | |
ProfileLanguageLink
profiles_languages| id | String | PK |
| profileId | String | |
| languageId | String | |
| level | String | ? |
- →
ProfileCascade - →
ProfileLanguageCascade
Выданные пары и устройства. Каскад от пользователя: восстанавливается логином, доказательством не является.
erDiagram
Session }|--|| Token : "cascade"
| id | String | PK |
| userId | String | |
| accessTokenId | String | |
| accessTokenExpiredAt | Int | |
| refreshTokenId | String | |
| refreshTokenExpiredAt | Int | |
| createdAt | DateTime | |
| updatedAt | DateTime | |
| id | String | PK |
| userId | String | |
| tokenId | String | уник |
| fingerprint | String | |
| ip | String | |
| createdAt | DateTime | |
| updatedAt | DateTime | |
- →
UserCascade - →
TokenCascade
Страны, города, таймзоны. Наполняется сидом.
erDiagram
Location }o--|| Location : "setnull"
Location }o--|| Country : "setnull"
CountryTimezone }|--|| Country : "cascade"
CountryTimezone }|--|| Timezone : "cascade"
LocationTimezone }|--|| Location : "cascade"
LocationTimezone }|--|| Timezone : "cascade"
| id | String | PK |
| cca2 | String | уник |
| cca3 | String | уник |
| ccn3 | String | уник? |
| cioc | String | уник? |
| nameCommon | String | |
| nameOfficial | String | |
| region | String | ? |
| subregion | String | ? |
| landlocked | Boolean | ? |
| area | Float | ? |
| population | BigInt | ?минор |
| independent | Boolean | ? |
| unMember | Boolean | ? |
| status | String | ? |
| fifa | String | ? |
| lat | Float | ? |
| lng | Float | ? |
| capital | Json | ? |
| capitalLat | Float | ? |
| capitalLng | Float | ? |
| iddRoot | String | ? |
| iddSuffixes | Json | ? |
| tld | Json | ? |
| borders | Json | ? |
| carSide | String | ? |
| carSigns | Json | ? |
| altSpellings | Json | ? |
| languages | Json | ? |
| currencies | Json | ? |
| translations | Json | ? |
| demonyms | Json | ? |
| gini | Json | ? |
| maps | Json | ? |
| flags | Json | ? |
| coatOfArms | Json | ? |
| continents | Json | ? |
| startOfWeek | String | ? |
| createdAt | DateTime | |
| updatedAt | DateTime | |
| id | String | PK |
| type | LocationType | |
| name | String | |
| parentId | String | ? |
| countryId | String | ? |
| lat | Float | ? |
| lng | Float | ? |
| meta | Json | ? |
| createdAt | DateTime | |
| updatedAt | DateTime | |
- →
LocationSetNull - →
CountrySetNull
| id | String | PK |
| name | String | уник |
| createdAt | DateTime | |
| updatedAt | DateTime | |
CountryTimezone
countries_timezones| id | String | PK |
| countryId | String | |
| timezoneId | String | |
- →
CountryCascade - →
TimezoneCascade
LocationTimezone
locations_timezones| id | String | PK |
| locationId | String | |
| timezoneId | String | |
- →
LocationCascade - →
TimezoneCascade
Команда
3 таблиц2 × Restrict
Состав и полномочия. Оси независимы: role даёт доступ, canSign и canSubmit — право подписать договор и сдать этап.
erDiagram
TeamMember }|--|| Team : "restrict"
TeamInvitation }|--|| Team : "cascade"
| id | String | PK |
| name | String | |
| slug | String | уник |
| bio | String | ? |
| status | TeamStatus | |
| externalExperience | Json | ? |
| verifiedAt | DateTime | ? |
| createdAt | DateTime | |
| updatedAt | DateTime | |
| id | String | PK |
| teamId | String | |
| employeeId | String | |
| role | TeamMemberRole | |
| canSign | Boolean | |
| canSubmit | Boolean | |
| status | TeamMemberStatus | |
| removedAt | DateTime | ? |
| createdAt | DateTime | |
| updatedAt | DateTime | |
- →
TeamRestrict - →
EmployeeRestrict
TeamInvitation
team_invitations| id | String | PK |
| teamId | String | |
| email | String | |
| role | TeamMemberRole | |
| token | String | уник |
| status | InvitationStatus | |
| expiresAt | DateTime | |
| createdAt | DateTime | |
| updatedAt | DateTime | |
Проект
1 таблиц2 × Restrict
Корень сделочной цепочки. Статус — машина состояний, contractingStage — суб-машина контрактинга.
erDiagram
Project {
uuid id PK
}
| id | String | PK |
| title | String | |
| description | String | |
| category | ProjectCategoryType | ? |
| status | ProjectStatus | |
| contractingStage | ContractingStage | ? |
| customerId | String | |
| teamId | String | ? |
| currency | String | |
| budgetMinMinor | BigInt | ?минор |
| budgetMaxMinor | BigInt | ?минор |
| belowBudgetGate | Boolean | |
| commissionRateBps | Int | ? |
| createdAt | DateTime | |
| updatedAt | DateTime | |
| deletedAt | DateTime | ? |
- →
CustomerRestrict - →
TeamRestrict
Спецификация и план
2 таблиц2 × Restrict
Спека версионируется, план живёт снапшотом: до подписания он предмет торга и приложение к договору, а не набор рабочих сущностей.
erDiagram
Specification {
uuid id PK
}
PlanVersion {
uuid id PK
}
Specification
specifications| id | String | PK |
| projectId | String | |
| version | Int | |
| content | Json | |
| authorType | AuthorType | |
| authorUserId | String | ? |
| status | SpecificationStatus | |
| sourceThreadId | String | ? |
| createdAt | DateTime | |
| id | String | PK |
| projectId | String | |
| version | Int | |
| items | Json | |
| totalAmountMinor | BigInt | минор |
| status | PlanVersionStatus | |
| internalNotes | String | ? |
| authorMemberId | String | ? |
| sentAt | DateTime | ? |
| respondedAt | DateTime | ? |
| rejectReason | String | ? |
| createdAt | DateTime | |
| updatedAt | DateTime | |
Этапы и приёмка
6 таблиц6 × Restrict
Этапы материализуются из принятого плана. Критерий — проверяемое утверждение; отказ обязан ссылаться на критерий.
erDiagram
AcceptanceCriterion }|--|| Milestone : "restrict"
Artifact }|--|| Milestone : "restrict"
MilestoneSubmission }|--|| Milestone : "restrict"
AcceptanceReview }|--|| Milestone : "restrict"
ReviewRejectionItem }|--|| AcceptanceReview : "restrict"
| id | String | PK |
| projectId | String | |
| planVersionId | String | ? |
| orderIndex | Int | |
| title | String | |
| description | String | |
| amountMinor | BigInt | минор |
| status | MilestoneStatus | |
| dueAt | DateTime | ? |
| deadlinePausedAt | DateTime | ? |
| createdAt | DateTime | |
| updatedAt | DateTime | |
AcceptanceCriterion
acceptance_criteria| id | String | PK |
| milestoneId | String | |
| orderIndex | Int | |
| text | String | |
| state | CriterionState | |
| createdAt | DateTime | |
| updatedAt | DateTime | |
| id | String | PK |
| milestoneId | String | |
| type | ArtifactType | |
| title | String | |
| url | String | ? |
| fileKey | String | ? |
| uploaderMemberId | String | ? |
| source | ArtifactSource | |
| createdAt | DateTime | |
MilestoneSubmission
milestone_submissions| id | String | PK |
| milestoneId | String | |
| attempt | Int | |
| submittedByMemberId | String | |
| coverNote | String | ? |
| createdAt | DateTime | |
AcceptanceReview
acceptance_reviews| id | String | PK |
| milestoneId | String | |
| submissionId | String | |
| openedByUserId | String | |
| verdict | ReviewVerdict | ? |
| reasoning | String | ? |
| decidedByUserId | String | ? |
| newMilestoneId | String | ? |
| decidedAt | DateTime | ? |
| createdAt | DateTime | |
| updatedAt | DateTime | |
ReviewRejectionItem
review_rejection_items| id | String | PK |
| reviewId | String | |
| criterionId | String | |
| comment | String | ? |
- →
AcceptanceReviewRestrict
Контрактинг
4 таблиц5 × Restrict
Party — снапшот юрлица под конкретный проект. Два договора с платформой; между собой стороны не подписывают ничего.
erDiagram
PartyDocument }|--|| Party : "restrict"
Contract {
uuid id PK
}
Offer {
uuid id PK
}
| id | String | PK |
| projectId | String | |
| side | DealSide | |
| legalName | String | |
| legalForm | String | ? |
| countryCode | String | |
| registrationNumber | String | ? |
| taxId | String | ? |
| address | Json | |
| kycState | KycState | |
| createdAt | DateTime | |
| updatedAt | DateTime | |
PartyDocument
party_documents| id | String | PK |
| partyId | String | |
| kind | String | |
| fileKey | String | |
| status | PartyDocumentStatus | |
| reviewedByUserId | String | ? |
| createdAt | DateTime | |
| updatedAt | DateTime | |
| id | String | PK |
| projectId | String | |
| side | DealSide | |
| planVersionId | String | |
| status | ContractStatus | |
| templateVersion | String | |
| documentHash | String | ? |
| envelopeExternalId | String | ? |
| signerUserId | String | ? |
| signerMemberId | String | ? |
| signedAt | DateTime | ? |
| signedFileKey | String | ? |
| terminatedAt | DateTime | ? |
| createdAt | DateTime | |
| updatedAt | DateTime | |
| id | String | PK |
| projectId | String | |
| teamId | String | |
| state | OfferState | |
| createdByUserId | String | |
| declineReason | String | ? |
| respondedAt | DateTime | ? |
| createdAt | DateTime | |
| updatedAt | DateTime | |
- →
ProjectRestrict - →
TeamRestrict
Деньги
4 таблиц3 × Restrict
Холд, расчёт, выплатной аккаунт, журнал вебхуков. Суммы — целые минорные единицы, дробных типов в схеме нет.
erDiagram
Settlement }|--|| Hold : "restrict"
PayoutAccount {
uuid id PK
}
WebhookEvent {
uuid id PK
}
PayoutAccount
payout_accounts| id | String | PK |
| teamId | String | уник |
| provider | String | |
| externalAccountId | String | ? |
| state | PayoutAccountState | |
| requirements | Json | ? |
| createdAt | DateTime | |
| updatedAt | DateTime | |
| id | String | PK |
| milestoneId | String | уник |
| amountMinor | BigInt | минор |
| state | HoldState | |
| paymentIntentExternalId | String | ? |
| chargeExternalId | String | ? |
| heldAt | DateTime | ? |
| closedAt | DateTime | ? |
| createdAt | DateTime | |
| updatedAt | DateTime | |
| id | String | PK |
| holdId | String | |
| teamAmountMinor | BigInt | минор |
| founderAmountMinor | BigInt | минор |
| platformFeeMinor | BigInt | минор |
| holdAmountMinor | BigInt | минор |
| basisType | SettlementBasis | |
| basisId | String | |
| executedByUserId | String | |
| status | SettlementStatus | |
| transferExternalId | String | ? |
| refundExternalId | String | ? |
| executedAt | DateTime | ? |
| createdAt | DateTime | |
| updatedAt | DateTime | |
WebhookEvent
webhook_events| id | String | PK |
| provider | WebhookProvider | |
| externalEventId | String | |
| payload | Json | |
| status | WebhookEventStatus | |
| processedAt | DateTime | ? |
| createdAt | DateTime | |
Спор и расторжение
4 таблиц4 × Restrict
Позиции сторон и доказательства. До решения стороны не видят доказательств друг друга.
erDiagram
DisputePosition }|--|| Dispute : "restrict"
DisputeEvidence }|--|| DisputePosition : "restrict"
Termination {
uuid id PK
}
| id | String | PK |
| milestoneId | String | |
| state | DisputeState | |
| initiatorSide | DealSide | |
| openedByUserId | String | |
| positionDeadlineAt | DateTime | ? |
| outcome | DisputeOutcome | ? |
| teamShareBps | Int | ? |
| reasoning | String | ? |
| arbiterUserId | String | ? |
| resolvedAt | DateTime | ? |
| lciaEscalatedAt | DateTime | ? |
| createdAt | DateTime | |
| updatedAt | DateTime | |
DisputePosition
dispute_positions| id | String | PK |
| disputeId | String | |
| side | DealSide | |
| statement | String | ? |
| submittedByUserId | String | ? |
| submittedAt | DateTime | ? |
| createdAt | DateTime | |
DisputeEvidence
dispute_evidences| id | String | PK |
| positionId | String | |
| title | String | |
| fileKey | String | ? |
| url | String | ? |
| createdAt | DateTime | |
- →
DisputePositionRestrict
| id | String | PK |
| projectId | String | |
| state | TerminationState | |
| initiatorSide | DealSide | |
| requestedByUserId | String | |
| basis | TerminationBasis | ? |
| objectionDeadlineAt | DateTime | |
| objectionByUserId | String | ? |
| objectionDisputeId | String | ? |
| completedCriteriaBps | Int | ? |
| assessedByUserId | String | ? |
| reasoning | String | ? |
| sourceDisputeId | String | ? |
| executedAt | DateTime | ? |
| createdAt | DateTime | |
| updatedAt | DateTime | |
Операционный контур
5 таблиц
Журнал переходов, исходящие события, очередь задач, таймеры, уведомления.
erDiagram
StateTransition {
uuid id PK
}
OutboxEvent {
uuid id PK
}
QueueItem {
uuid id PK
}
Timer {
uuid id PK
}
Notification {
uuid id PK
}
StateTransition
state_transitions| id | String | PK |
| subjectType | SubjectType | |
| subjectId | String | |
| fromState | String | ? |
| toState | String | |
| actorType | ActorType | |
| actorUserId | String | ? |
| actorRole | String | ? |
| basisType | String | ? |
| basisId | String | ? |
| reason | String | ? |
| metadata | Json | ? |
| createdAt | DateTime | |
| id | String | PK |
| eventType | String | |
| aggregateType | SubjectType | |
| aggregateId | String | |
| payload | Json | |
| publishedAt | DateTime | ? |
| attempts | Int | |
| createdAt | DateTime | |
| id | String | PK |
| type | QueueItemType | |
| targetRole | PlatformRole | |
| subjectType | SubjectType | |
| subjectId | String | |
| projectId | String | ? |
| status | QueueItemStatus | |
| dueAt | DateTime | |
| overdueMarkedAt | DateTime | ? |
| assigneeUserId | String | ? |
| closedByUserId | String | ? |
| resultTransitionId | String | ? |
| createdAt | DateTime | |
| updatedAt | DateTime | |
| id | String | PK |
| kind | TimerKind | |
| subjectType | SubjectType | |
| subjectId | String | |
| firesAt | DateTime | |
| firedAt | DateTime | ? |
| cancelledAt | DateTime | ? |
| createdAt | DateTime | |
Notification
notifications| id | String | PK |
| userId | String | |
| type | String | |
| subjectType | SubjectType | |
| subjectId | String | |
| requiresAction | Boolean | |
| payload | Json | ? |
| readAt | DateTime | ? |
| createdAt | DateTime | |
Консьерж
2 таблиц1 × Restrict
Тред обращений: первая линия — оператор, эскалация — задача администратору.
erDiagram
ConciergeMessage }|--|| ConciergeThread : "restrict"
ConciergeThread
concierge_threads| id | String | PK |
| openedByUserId | String | |
| side | DealSide | ? |
| projectId | String | ? |
| subject | String | |
| status | ConciergeStatus | |
| createdAt | DateTime | |
| updatedAt | DateTime | |
ConciergeMessage
concierge_messages| id | String | PK |
| threadId | String | |
| authorUserId | String | |
| authorRole | String | |
| body | String | |
| createdAt | DateTime | |
- →
ConciergeThreadRestrict
Связи с внешним трекером. Полиморфные, без внешних ключей: ни один инвариант платформы от трекера не зависит.
erDiagram
TrackerLink {
uuid id PK
}
| id | String | PK |
| subjectType | SubjectType | |
| subjectId | String | |
| externalType | String | |
| externalId | String | |
| createdAt | DateTime | |
| updatedAt | DateTime | |
Тред AI-консультанта. Субъектом прав не является: его выводы материализуются как спецификация с authorType = AI.
erDiagram
WalriderMessage }|--|| WalriderThread : "cascade"
WalriderThreadState }|--|| WalriderThread : "cascade"
WalriderThreadState }o--|| WalriderMessage : "cascade"
WalriderThread
walrider_threads| id | String | PK |
| customerId | String | |
| projectId | String | уник |
| externalThreadId | String | ? |
| createdAt | DateTime | |
| updatedAt | DateTime | |
- →
CustomerCascade - →
ProjectCascade
WalriderMessage
walrider_messages| id | String | PK |
| messageId | Int | |
| threadId | String | |
| role | WalriderMessageRole | |
| content | String | |
| externalMessageId | String | ? |
| metadata | Json | ? |
| createdAt | DateTime | |
| updatedAt | DateTime | |
WalriderThreadState
walrider_thread_states| id | String | PK |
| threadId | String | |
| messageId | String | ? |
| status | String | ? |
| data | Json | ? |
| createdAt | DateTime | |
- →
WalriderThreadCascade - →
WalriderMessageCascade
Инварианты на уровне базы
Prisma не выражает ни CHECK, ни частичных уникальных индексов, поэтому эти правила лежат в baseline-миграции сырым SQL. Держать их в приложении нельзя: нарушение обязано отвергаться базой даже при гонке двух транзакций и при прямом доступе к БД.
settlements_amounts_sum_to_holdРасчёт, компоненты которого не сходятся в сумму холда, не вставляется. Денормализованное hold_amount_minor лежит в самой строке ровно ради этой проверки: CHECK не умеет ходить в соседнюю таблицу.
queue_items_open_dedupДве незакрытые задачи по одному предмету. Повторная задача того же типа заводится свободно после того, как предыдущая ушла в DONE или CANCELLED.
users_on_roles_single_platform_roleСовмещение двух платформенных ролей одним человеком. Клиентские роли в предикат не входят — их сочетать можно.
roles_type_keyВторая строка справочника ролей того же типа. Без неё предыдущий индекс обходится: он перечисляет id платформенных ролей, и роль с другим uuid его предикат не видит.
Перечисления
Четыре из них — ActorType, SubjectType, TimerKind, WebhookProvider — обязаны совпадать значение в значение с union'ами шины доменных событий; расхождение хотя бы в одном значении роняет прогон.
ActorType3USERSYSTEMTIMER
ArtifactSource2PLATFORMTRACKER
ArtifactType3FILELINKDEMO
ConciergeStatus4OPENESCALATEDRESOLVEDCLOSED
ContractingStage5PLAN_DRAFTINGPLAN_INTERNAL_REVIEWKYC_PENDINGPLAN_SENTSIGNING
ContractStatus4DRAFTSENT_FOR_SIGNINGSIGNEDTERMINATED
CriterionState4UNCHECKEDMETDISPUTEDCONFIRMED
DisputeOutcome3TEAM_FAVORFOUNDER_FAVORPARTIAL
DisputeState5OPENEDPOSITIONS_GATHERINGUNDER_ARBITRATIONRESOLVEDESCALATED_LCIA
HoldState6PENDING_INHELDRELEASINGRELEASEDREFUNDEDSPLIT
InvitationStatus5PENDINGACCEPTEDDECLINEDEXPIREDREVOKED
KycState5NOT_REQUIREDPENDINGSUBMITTEDAPPROVEDREJECTED
LocationType4REGIONSUBREGIONCOUNTRYCITY
MilestoneStatus10PLANNEDPLAN_APPROVED // первичный план — автоматически при ACTIVE (M-4); добавленные этапы — операторомFUNDED // достижим только при hold.state = HELDIN_PROGRESSSUBMITTEDFOUNDER_APPROVEDVERIFIEDPAID // достижим только при hold.state = RELEASEDREJECTED // вход в разбор, не терминальный (M-5)DISPUTED
OfferState6SENT_TO_TEAMTEAM_ACCEPTED // теперь виден фаундеру (P-1)DECLINED_BY_TEAM // → проект обратно в TEAM_MATCHINGACCEPTED_BY_FOUNDERDECLINED_BY_FOUNDERWITHDRAWN
PartyDocumentStatus3UPLOADEDAPPROVEDREJECTED
PayoutAccountState4NOT_STARTEDPENDINGRESTRICTEDACTIVE
PlanVersionStatus6DRAFTINTERNAL_REVIEWSENTACCEPTEDREJECTEDSUPERSEDED
PlatformRole3OPERATORADMINISTRATORARBITER
PortfolioLinkType4GITHUBDEMOPRODOTHER
ProjectCategoryType9WEB_DEVELOPMENTMOBILE_DEVELOPMENTDESIGNMARKETINGCOPYWRITINGDATA_SCIENCEDEV_OPSQA_TESTINGOTHER
ProjectStatus10DRAFTAI_CONSULTATIONSPEC_READYTEAM_MATCHINGTEAM_PROPOSEDCONTRACTINGACTIVECOMPLETED // терминальный, read-only (P-5)DISPUTED // производный: есть открытый спор по этапу; переходы автоматическиеCANCELLED // терминальный (через Termination)
QueueItemStatus4OPENIN_PROGRESSDONECANCELLED
QueueItemType15PLAN_APPROVAL // operator: только этапы, добавленные после старта (M-4)SUBMISSION_VERIFICATION // operator, SLA 4 раб. часаCONCIERGE_FIRST_LINE // operatorACCEPTANCE_REVIEW // administrator: разбор непринятияPLAN_MEDIATION // administrator: фаундер отклонил план (C-4)TEAM_MATCHING // administratorPRICE_REVIEW // administrator: PLAN_INTERNAL_REVIEWKYC_DOCUMENTS // administratorTERMINATION_ASSESSMENT // administratorTEAM_ONBOARDING // administratorESCALATED_INQUIRY // administratorBUDGET_GATE_REVIEW // administrator: мягкий гейт бюджетаFOUNDER_SILENCE_DECISION // administrator: окно молчания истекло (8.3 — не автовыплата)SETTLEMENT_EXECUTION // administrator: основание готово, требуется исполнение денегDISPUTE_ARBITRATION // arbiter, SLA 5 дней
ReviewVerdict3CRITERIA_UNMET_RETURN // критерий не соблюдён → IN_PROGRESS, доработка бесплатноCRITERIA_MET_NEW_SCOPE // критерии соблюдены → этап принят, требование → новый платный этапESCALATED_TO_ARBITRATION
RoleType5CUSTOMEREMPLOYEEADMINOPERATORARBITER
SettlementBasis4DUAL_APPROVALREVIEW_VERDICTARBITER_DECISIONTERMINATION_ASSESSMENT
SettlementStatus3PENDINGEXECUTEDFAILED
SpecificationStatus4DRAFTPROPOSEDACCEPTEDSUPERSEDED
SubjectType11PROJECTMILESTONEHOLDCONTRACTDISPUTETERMINATIONOFFERTEAMPAYOUT_ACCOUNTPLAN_VERSIONCONCIERGE_THREAD
TeamMemberRole3ADMINEDITORVIEWER
TeamMemberStatus2ACTIVEREMOVED
TeamStatus4ONBOARDINGACTIVESUSPENDEDARCHIVED
TerminationBasis4TEAM_FAULTFOUNDER_INITIATIVETEAM_INITIATIVEDISPUTE_DECISION
TerminationState4REQUESTEDUNDER_REVIEWEXECUTEDWITHDRAWN
TimerKind7FOUNDER_SILENCEDISPUTE_POSITION_WINDOWTERMINATION_OBJECTION_WINDOWENVELOPE_EXPIRYMILESTONE_DEADLINESLA_TARGETREMINDER
WalriderMessageRole2USERASSISTANT
WebhookEventStatus4RECEIVEDPROCESSEDSKIPPED_DUPLICATEFAILED
WebhookProvider3STRIPESIGNINGTRACKER
WorkType4FULL_TIMEPART_TIMECONTRACTFREELANCE