diff --git a/frontend/src/lib/legal-entity.ts b/frontend/src/lib/legal-entity.ts new file mode 100644 index 00000000..2a2e37f6 --- /dev/null +++ b/frontend/src/lib/legal-entity.ts @@ -0,0 +1,34 @@ +/** + * Who runs Jyotisha and how users reach them (2026-09-30, compliance round). + * + * One place for the operator's legal name, address and contact channels, read + * by the user agreement, the privacy policy, the account-deletion notice and + * the feedback entry. The product owner will supply the real values; until + * then they are loud placeholders, and `legalEntityPlaceholders()` lets the + * production release checks refuse to ship them. + */ +export const LEGAL_ENTITY = { + /** 运营主体全称(公司或个体工商户),用于协议与隐私政策的「我们」。 */ + operatorName: "【待填写:运营主体全称】", + /** 注册地址或联系地址。 */ + address: "【待填写:联系地址】", + /** 用户与监管联系的邮箱(客服、投诉、个人信息请求)。 */ + contactEmail: "【待填写:客服邮箱】", + /** 可选:客服电话或微信;为空则不显示。 */ + contactPhone: "", + /** ICP 备案号;为空则页脚不显示。 */ + icpNumber: "", + /** 协议与隐私政策文本版本;律师审定后改为正式版本号。 */ + legalDocumentsVersion: "2026-09-30-draft", + /** 文本是否仍是草稿(未经律师审定)。页面顶部据此显示「草稿」标识。 */ + legalDocumentsDraft: true, +} as const; + +const PLACEHOLDER = /【待填写/; + +/** Field names still holding a placeholder; empty when every required value is real. */ +export function legalEntityPlaceholders(entity: Readonly> = LEGAL_ENTITY): string[] { + return Object.entries(entity) + .filter(([, value]) => typeof value === "string" && PLACEHOLDER.test(value)) + .map(([key]) => key); +}