Skip to content

crm_quote.crm_contact 要不要自 presented 起 requiredWhen——缺 contact 的报价永远起草不出合同,失败只出现在服务器日志里(源自 #714) #1017

Description

@yinlianghui

源自 #714 / PR #1013 的验收遗留(机械缺陷已修完:false 不再进 lookup、失败已变诚实、close-won 不再被连累)。悬而未决的是一个产品语义分叉,按纪律交维护者拍板。

事实(已实测,证据在 PR #1013 正文末节)

  • crm_quote.crm_contact 有意可选;crm_contract.crm_contact 必填(required + notNull,缺键与 null 均报 Primary Contact is required,warn-first / strict 两种 posture 一致);
  • 因此缺 contact 的报价被接受后,合同永远起草不出——修复后失败诚实(报 required 而非 received boolean,且不吞 close-won),但仍然只出现在服务器日志里,rep 在界面上没有当场可见的信号;
  • quote schema 自己的注释写着 "Recipient is nailed down by the time a quote is presented"——这个意图没有任何机制在执行:没有规则拦住一张没有 contact 的报价走到 presented/accepted;
  • content/docs/sales/quotes.mdx 已写给销售的口径是 "what the quote does not carry, acceptance cannot pass on",与现状一致。

选项

  • A. 维持现状:靠文档提醒。最省,但缺 contact 时用户仍无当场信号,失败继续留在日志里。
  • B. 给 crm_quote.crm_contact 加自 presented 起的 requiredWhen:把失败前移到同步、可修复、有人在场的时刻;契合「declared = enforced」与 schema 注释里已写死的意图。代价:改变报价何时可被呈现,并触及存量数据(已 presented 而无 contact 的报价)。
  • C. 放松 crm_contract.crm_contact 为可选:CPQ 链恒成立,但削弱合同数据模型(法律文件不指名对手方),与 Contracts/Quotes 两页文档冲突,属典型 consumer-side 宽容。

推荐

B(#714 的 dev 推荐,PM 同意):意图已在 schema 注释里写死、只是从未被执行;B 把错误搬到有人在场的时刻。但 B 改变呈现门槛并触及存量数据,需维护者拍板。拍板后一单可派。

Refs #714 · PR #1013(正文末节含三选项完整论证)

Metadata

Metadata

Assignees

Labels

metadataDeclarative metadata — schema, security posture, UI surfacespm:dispatchedDispatched to a dev agent by /pm-dispatch

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions