Skip to content

feat(core): notify supplier portal users directly (v0.6 U6) - #93

Merged
marchtian merged 1 commit into
mainfrom
claude/project-thread-bqkroi
Nov 2, 2026
Merged

marchtian merged 1 commit into
mainfrom
claude/project-thread-bqkroi

Conversation

@marchtian

Copy link
Copy Markdown
Collaborator

Requested by 田騏 · project thread

Closes #82 (v0.6 U6, overview #75). Builds on U3 #92, U4 #90, U5 #91 and GL-10 #89, all merged.

改了什么

收件人规则(ADR-0010 红线 2):供应商侧通知一律从「触发记录所属供应商」的名册取人:在职、portal_user 有值的联系人,与成员键 portal_supplier_ids 同一条件;供应商取触发记录自己的 supplier,不接受外部传入。公共节点在 src/core/flows/portal/supplier-notice.ts:

  • quality 职能的事件发质量联系人,没有时发主账号(admin)联系人;
  • 银行账户、变更单发名册上任命了 srm_portal_admin 的门户账号;
  • 准入申请发申请联系人(新字段 srm_supplier_application.contact,门户提交时由 srm_application_submit 写入)。
  • 没开通门户的供应商名册为空,什么都不发;内部经办人的通知不变(v0.5 行为)。notify 包在 try_catch 里,空名册或投递失败不影响业务写入。

模板:src/core/notifications/,21 个平台 emailTemplates,每个 zh-CN / en-US 两份,按收件人 sys_user.locale 渲染(未设取部署默认 zh-CN,en 落到 en-US)。同一份内容发邮件和站内信,站内信经 sourceObject / sourceId 跳到单据。正文只写单号、供应商名称、事件和期限,不写金额、账号、分数、等级、处置原因(R5)。

新 flow(全部 record_change / schedule,系统身份;门户用户启动不了,不需要 PF18 的自查)

flow 事件 收件人
srm_scar_supplier_notice 新整改单(任何来源)、退回、重开、逾期 quality 联系人
srm_certificate_expiry_notice 证书到期前 30 / 15 / 7 天(time-relative) admin + quality;内部 SQE(品类无 SQE 时质量经理)
srm_certificate_expired_notice 证书已过期 同上
srm_application_supplier_notice 申请已受理、退回补充、已通过 申请联系人
srm_review_supplier_notice 绩效发布、申诉处理结果 admin 联系人
srm_bank_supplier_notice 银行账户核验生效 门户管理员
srm_change_supplier_notice 变更单已生效 / 已驳回 / 退回修改 门户管理员
srm_disposition_supplier_notice 冻结、解冻 admin 联系人
srm_portal_opened_notice 门户邀请已开通 受邀联系人

改动的既有 flow

  • srm_admission_rejection:清名册之前先发「未通过」给申请联系人(回收后名册上就没人了)。
  • srm_disposition_apply:淘汰 / 拉入黑名单同理,回收前通知 admin 联系人。
  • srm_change_approval、srm_appeal_resolve:发起人 / 申诉人本人是门户用户时跳过内部措辞的通知,由供应商侧通知代替,不重复。
  • srm_scar_create、srm_scar_overdue_sweep:只改注释。

文档:02(申请 contact)、03(§3 第 4/7/8 步、§5、整改单、§10、§11 证书提醒、flow 表)、04 §3.3(开通通知、回收前通知)、05 §5(收件人规则、通知表、模板)、07(notify 能力行、PF3、新 PF20 = objectstack#29095:邮件模板上下文没有部署地址,邮件拼不出完整链接,暂写「登录门户查看」+ 单号,模板数据给相对路径 path)。

怎么验证的

  • 新增 test/portal-notifications.test.ts,13 个用例:
    • 元数据:每个模板中英文占位符一致、没有金额 / 账号 / 分数 / 等级 / 价格占位;每个占位符都有数据;所有供应商通知的收件人只来自名册,名册过滤固定为触发记录的 supplier + active + portal_user != null;这些 flow 都不是门户可启动的类型。
    • 运行时,每类通知一个:新整改单(含别家供应商的门户用户收不到、没有质量联系人时发 admin)、没开通门户什么都不发、退回 / 重开 / 逾期(重开后期限是重算后的)、证书到期(触发 time-relative 任务)与过期、申请受理 / 退回 / 重新提交不再发 / 未通过先于回收 / 内部登记的申请不发、通过、绩效发布与申诉结果(英文收件人、不重复)、银行账户 + 变更单退回 / 生效(无内部重复)+ 内部发起的驳回、冻结 / 解冻 / 淘汰、门户开通。
  • 隔离测试 test/portal-isolation.test.ts 未改动,全部通过。
  • 本地 pnpm verify 通过:validate、lint(16 条既有 warning,无新增)、typecheck、i18n:check、test(354 通过,1 跳过)、build;governance/scripts/build.py --check(含 --packs bulk,hazmat,soe)通过。

留给后续

  • PF20 修复后模板改成完整链接。
  • v0.6 出口测试(托管环境 V6 复核 + 浏览器验收)。

Generated by Claude Code

Supplier-side notices now go to the supplier's own portal users instead of
only to the internal handler. Recipients are read from the roster of the
triggering record's supplier (active contacts with portal_user, the same
condition as the membership key), so a notice can never reach another
supplier (ADR-0010, red line 2). Suppliers without a portal get nothing new;
the internal handler path is unchanged.

- 21 email templates (zh-CN / en-US) rendered per recipient locale; bodies
  carry the record number and event only, no amounts, accounts or scores.
- New record-change / schedule flows: SCAR new / returned / reopened /
  overdue, certificate expiring (30/15/7 days) and expired, application
  accepted / returned / approved, performance published and appeal result,
  bank account verified, change request applied / rejected / returned,
  freeze / unfreeze, portal opened.
- Rejection, elimination and blacklisting notify before the roster is
  cleared. Internal notices that used to reach the portal user themselves
  (portal-submitted change requests and appeals) are skipped.
- srm_supplier_application.contact records the applicant contact.
- Docs 02/03/04/05/07; PF20 = objectstack#29095 (no base URL in the email
  template context).

Closes #82

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017ihL2fexWhTMqS1KFBnTPG
@marchtian marchtian self-assigned this Nov 2, 2026
@marchtian
marchtian merged commit fd2e7e7 into main Nov 2, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

v0.6 U6:供应商侧通知

2 participants