Skip to content

feat(mcp): 核销记录读面 list_attendances(谁来了 × 押金去向)(#508) - #665

Merged
sundevilyang merged 1 commit into
developfrom
feat/508-attendance-read
Sep 16, 2026
Merged

sundevilyang merged 1 commit into
developfrom
feat/508-attendance-read

Conversation

@sundevilyang

Copy link
Copy Markdown
Contributor

#508 残余:核销记录读面 list_attendances

issue 的验收第 6 条「核销记录可导出」此前无任何读面(Attendance 刻意不注册 GraphQL query/mutation)——本 PR 以 MCP 读面补齐,导出 = 运营 agent 拉数据落 CSV(repo 的 agent-first 数据回收文化),SDL 零扰动

落点 内容
域 policy admission/attendance.ex read 从仅 PlatformAdmin 拓宽为 Owner/Admin(本租户,multitenancy 过滤)+ PlatformAdmin 并联Rbac.manage?/2 不认 PA 的语义分层,沿用 check_in 同款注释);check_in policy 零改动
MCP mcp/tools/list_attendances.ex(新) event_id 必填(核销天然按场;全台汇总走 stats);member 门 + Rbac.manage?/2 工具层判定;行 = 核销事实checked_in_at / method / operator)+ 报名人摘要(id/email/display_name,沿用 list_enrollmentsauthorize?: false 批量投影纪律)+ 报名状态 + 押金单状态DISTINCT ON 活跃单优先、终态单回退——active_deposit_order/1 的批量版;免费场 nil,不编造)
注册/守卫 server.ex + 契约守卫 工具面 69 → 70;course_tools/wrapper_gate 计数 83→84;@member_onlylist_attendances(豁免面 39 不变——member-only 组)

一屏对账:「谁来了 × 押金去向」——Owner 可直接看到某场谁核销、怎么核销(扫码/手输)、由谁操作、以及对应押金单当前状态(含核销即退后的 refunding)。

验证

  • mix precommit2413/2413 passed
  • 变异验证:把 read policy 的 WorkspaceActorIsOwnerOrAdmin 子句收回 → 3 用例红(35/38)→ 恢复 38/38 绿;
  • 行为矩阵:Owner 读免费场两笔核销(双 method、报名人摘要、operator、deposit_order_status=nil);押金场核销即退 → 行带 refunding(对账闭环);非管理成员 → forbidden(owner or admin required);非成员调他台 → Wrapper member 门先拒(fail-closed);域 policy 直测 Owner 本租户 2 行、他租户 Owner → 空集(filter-based policy 的「读不到」与 Forbidden 同为不泄露语义,断言已按此钉住);
  • SDL 零扰动:无 schema.graphql 变更 → web/小程序 codegen 工件零影响。

check 自检

无 hard stop;advisory 0(两处测试断言形状在编写期已对齐真实语义并注释);既有 check_in 的 Forbidden 钉测零冲突(policy 只动 read)。

@sundevilyang
sundevilyang merged commit 1e8f8dd into develop Sep 16, 2026
7 checks passed
@sundevilyang
sundevilyang deleted the feat/508-attendance-read branch September 16, 2026 22:33
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.

1 participant