다크모드
BE 핸드오프 — Company 관리자 회원가입
데이터 계약
정본 migration:
supabase/migrations/20260713170000_company_owner_signup.sqlsupabase/migrations/20260713173000_company_owner_confirmed_bootstrap.sql
auth.signUp()은 미확인 Auth 사용자와 확인 메일만 만든다. raw_user_meta_data.signup_kind가 company_owner이고 email_confirmed_at이 채워진 뒤에만 auth.users insert/update trigger가 아래를 한 transaction에서 생성한다.
public.user_profilespublic.companiespublic.company_memberships(role=owner, status=active)public.product_workspaces(slug=goldnus)— 기존 상품 checkout 호환 seam
확인 전에는 public row와 사업자등록번호 선점이 없다. 확인 transaction의 어느 insert라도 실패하면 Company bootstrap 전체가 rollback되고 Auth 사용자는 미확인 상태로 남는다.
입력 메타데이터
| 키 | 규칙 | 저장 위치 |
|---|---|---|
full_name | 공백 제외 필수 | user_profiles.full_name |
phone | 숫자 10~11자리, 0 시작 | user_profiles.phone |
company_name | 필수 | companies.display_name |
representative_name | 필수 | companies.representative_name |
business_number | 숫자 10자리, 활성 Company 전체 unique | companies.business_number |
terms_accepted | true 필수 | user_profiles.terms_accepted_at |
패스워드는 Supabase Auth만 소유한다. public schema, metadata, 로그에 복제하지 않는다.
RLS
user_profiles: 본인만 조회·수정.companies와 관련 테이블: 활성company_memberships를 가진 사용자만 조회.- Company bootstrap trigger는
security definer이며search_path=public,pg_temp로 고정한다. - 일반
auth.users생성은signup_kind가 다르면 trigger가 아무 작업도 하지 않으므로 직원 초대 흐름과 분리된다. - 로그인 복원은 prototype checkout 호환 seam인
product_workspaces의 activeproduct_subscriptions·product_entitlements를 읽는다. subscription이 없으면 상품 미계약으로 판정한다.
미구현 경계
- 사업자등록번호 국세청 진위확인
- 동일 Company에 대한 관리자 가입 대신 초대 전환
- Company 탈퇴·폐쇄와 법적 보존기간 처리
- 공공데이터 건축물 식별자와 Office 프로퍼티 연결 — 프로퍼티 설정 슬라이스에서 연결