Skip to content

Track A · crm_opportunity: the qualification group, milestone dates, subcontracting, narrative, and approval on STATUS CHANGE — REQ-0006 #1916

Description

@os-elon-musk

Part of #1904 — Track A 实现批,REQ-0002 前 14 步的销售侧增强。⛔ 不依赖上游发版,与 #1907 的拆包线并行。

权威规格

docs/requirements/0006-opportunity-qualification-and-status-approval.md(已在 origin/main,PR #1912 合入 6ff28e7)。

⚠️ 该记录是本卡的唯一规格来源。⛔ 本卡不重抄它的内容、⛔ 不重新裁定它的 B/C 划分。动手前把它整篇读完,包括 Standard product analysis、Disposition & rationale、Product response 与 Acceptance 四节。

其中 C(客户定制层) 项一律 ⛔ 不做 —— 它们不属于标准产品,记录里逐条写明了理由。

串行约束 ⚠️

Track A 的四张实现卡文件面相交:都要动 src/sales/objects/ 与四个语言包 src/sales/translations/{en,zh-CN,es-ES,ja-JP}/。

⇒ 硬串行,一次只有一张在飞。 本卡落地后 PM 才派下一张。⛔ 不要并行开工、⛔ 不要顺手改别的对象。

文件面

⚠️ 本节由 PM 在派发前照 origin/main(661d2fa)重量过一遍,原稿的语言包路径是错的、漏了视图。以本节为准。

  • src/sales/objects/opportunity.object.ts —— qualification 组、客户侧里程碑日期、分包、叙述组、业务线分类
  • src/sales/flows/opportunity-approval.flow.ts —— 两道闸都是 flow 里的 approval 节点。⚠️ 验收第 4 条点名了这个文件 docstring 里记录过的一次实测失败(无 session 的写入者开闸),动手前读它。
  • src/sales/views/opportunity.view.ts —— 验收第 2 条要求客户侧日期独立于 close_date 可报,「本季度预计招标的单子」要能在列表视图里拉出来。原稿漏了这一项。
  • src/sales/translations/{en,zh-CN,es-ES,ja-JP}/objects.pipeline.ts —— ⚠️ 不是 translations/<locale>.ts。语言包按「翻译命名空间 → CRM 域族」两级拆分(The 70% advisory band's first real output: es-ES.ts (75.3%) and ja-JP.ts (73.4%) are the only two files it names, and a third sits 224 bytes below it #1311),crm_opportunity 属 pipeline 族(与 crm_lead 同文件)。四个语言同笔。

⚠️ 本卡排在 #1915 之后,同一个文件上已有它的改动

#1915 会在 opportunity.object.ts 上落一个 validations[] 条目(客户类别的能力闸,REQ-0003 第 128 行钉死的落点)。

⇒ 开工前 merge-forward,⛔ 不要回退或重写那个条目。它不是本卡的,本卡只往这个文件里加自己的字段与分组。

⛔ 验收第 5 条是一条否定要求

「Signing entity and revenue-recognition type have no field in core at all」—— 签约主体与收入确认类型 ⛔ 一个字段都不许加,业务线分类只发通用值。客户自己的业务线清单、主体清单和铁三角角色全部来自 overlay。⛔ 不要"顺手帮忙"补上它们。

⚠️ 记录明写两条:每个字段以 group: '<key>' 入组,表单布局保持派生,⛔ 不手写布局;业务线分类另立 select,⛔ 不替换也不重载现有的 type。
⚠️ 今天只有金额分级审批(src/sales/flows/opportunity-approval.flow.ts);本卡要的是状态变更本身的审批。

⛔ 不碰其它销售对象、⛔ 不碰 src/service/、src/revenue/、src/marketing/、⛔ 不碰 content/docs/releases/。

验收

以 docs/requirements/0006-opportunity-qualification-and-status-approval.md 的 Acceptance 节为准,⛔ 本卡不另立标准。另加两条通用项:

  1. pnpm verify 绿(package.json 是权威,⛔ 不自行窄化)。退出码在任何管道之前写进文件再读。
    ⚠️ 记录的验收第 6 条点名 test/object-validation-predicates.test.ts —— 未加 has() 守卫的谓词直接判红。⛔ 不要动这道守卫。
    ⚠️ test/docs-declared-versions.test.ts 会因字段数变化转红。在源头修:重抄你自己分支的 validate 摘要进 docs/STATUS.md,⛔ 不要动那道守卫(feat(objects): a buying-centre map on crm_contact — buying function, attitude, relationship strength (REQ-0004) #1917 的先例)。
  2. changeset:记录的验收第 6 条写的是「a changeset per PR, each naming REQ-0006」。本卡若一个 PR 交付就是一条;若你判断必须拆成多个 PR,每个 PR 各带一条,且都点名 REQ-0006。级别自判并在 PR 正文说明理由。

⛔ 顺手陷阱

你会在语言包 docblock 与对象文件注释里看到 src/translations/…、src/flows/… 这类已经不存在的路径(ADR-0130 搬迁的欠账)。⛔ 不要在本卡里顺手改 —— 文档半边是 #1918,源码半边是 #1919(正因与 Track A 直撞而挂 pm:blocked)。改了就是扩面。


Generated by Claude Code

No activity

Activity on this issue will appear here.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestpm:epicParent delegated to a dedicated epic PM — other PMs never dispatch into its subtree

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions