Player Report · 周报与月报 ·
PRD
作者 Luke 版本
v1.16 日期 2026-09-17 状态
待开发评审 平台 BRAND_A & BRAND_B 类
R
目标:协助菲籍同事按月制作监管 Player
Report。读者:菲籍报表人员、后台前端、报表后端与测试;开发与测试以本中文稿为准。
版本记录
| 版本 |
日期 |
变更摘要 |
| v1.16 |
2026-09-17 |
依开发回馈在 §3 改为直接按 Player Report 画面表头说明字段,不要求开发另找监管月报或理解另一套栏号。明确 Partially / Initially Verified 与 Verified Player Counts 共同拆分本期 Registered Player Counts cohort;Total Registered Players 为累计值且不参与拆分。同步重申 Active、Suspended、Attendance、Line、player、测试账号与 fake=true 口径;业务公式不变。 |
| v1.15 |
2026-09-15 |
依 Luke 确认在 §3 调整字段定义,并把
PAGCOR 月报—栏位校验 SOP 适配后写入附录 D:只统计
player,Line
依查询条件生效且不排除测试账号;03 + 04 = 01 为当期新注册
cohort 在注册后 3 日内的 KYC 二分;07
为当期发生冻结且截止仍冻结;Attendance 以实际成功金流/账变计算,不以
KYC 为前提;需求 20 的全程免 KYC/提款前 KYC 玩家在真实 KYC 前按
Filipino、Partially / Initially Verified、Active
与 Attendance 的实际事件归类,系统默认 fake=true
资料不得当真实 KYC 或年龄依据;跨月 Σ07
以账号并集去重。同版修正附录 C 的网页折叠边界、附录 D
代码块可读样式与双语 HTML 图片路径,并附上 PAGCOR OGP 月报 Excel
表。 |
| v1.14 |
2026-09-14 |
依 Luke 最新确认在 §3 重定义
Attendance Player Counts:有效统计区间内完成任一成功交易的玩家都计入,包含仅充值、仅投注、仅提款、仅领取奖金及其他金流/账变操作;非成功终态不计,以完成时间归期并按账号去重。附录 A
同步补确定性案例,并明确不修改
PlatformReport · Bet Player Counts。 |
| v1.13 |
2026-09-14 |
依 Luke 验收反馈修正 §3 与 §4 的
GamingVenue = All:不按实体站拆行,而是把全部实体站纳入同一统计范围后按账号去重;选择单一实体站时才只统计该站。同步修正第
16 栏、原型与验收案例。 |
| v1.12 |
2026-09-11 |
§3 依监管月报补齐
Total Registered Players、Partially / Initially Verified、Suspended Player Accounts,报表由
13 栏改为 16 栏;明确未提交 KYC 的注册账号归 Filipino。L0 补写本需求用于协助菲籍同事制作月报。 |
| v1.11 |
2026-09-11 |
Sonnet 首轮在 L0 ④ 写明
CMED-EG-1680 新定义覆盖原需求的旧口径;§2.3 补跨三个月的残月拆行算例;§3.6 补三个年龄跨档点及验收。 |
| v1.10 |
2026-09-11 |
§3 明确一行粒度为「实体站 × 国籍 ×
周期段」;状态型指标一律读取本行截止时点,并补齐
KYC、冻结及跨月宽限期的边界规则与算例;压缩重复描述并重绘资讯图表;本版正式进入评审。 |
| v1.9 |
2026-09-10 |
§3 删除无法由正常 KYC
流程产生的「已提交但国籍为空/无效」与未知 KYC 状态分支;KYC
送出前由前台必填校验,送出后依申报国籍分为
Filipino/Non-Filipino。不改变 13
栏或其他统计口径;资讯图表同步删除不存在的异常分支。 |
| v1.8 |
2026-09-10 |
§3 改为完整 13 栏字段表;注册账号尚未提交
KYC 时归
Filipino,已提交时依申报国籍分组;Suspended
定为全部冻结账号,不分原因;监管 Excel 没有
Dormant,本期移除并关闭原
OP1/OP2。同步更新验收与资讯图表。 |
| v1.7 |
2026-09-10 |
§3 依 CMED-EG-1680
重写字段定义:注册改按完成注册时间,Active 改为「已通过
KYC、期间内登入且未冻结」,Inactive 改为「注册满 3 天仍未通过 KYC
且未冻结」,Verified 改为结算时点的 Verified 状态;新增 KYC
对账式、账号状态互斥顺序,以及“无 KYC 资料的注册账号归
Filipino”。保留现行 13 栏,列出 4 个尚未显示的 CMED 指标及 2 项 Open
Points;同步更新附录 A、B。 |
| v1.6 |
2026-09-10 |
两项查询日期行为结案:切换 ReportType
时重设为该类型第一颗快捷按钮,Time Period
保留原日期;周/月快捷范围都取完整自然周期,Last N
包含当前周期,未来日期照常查询。新增 AC34。 |
| v1.5 |
2026-09-10 |
补齐导出档名、资料范围与查询基准;明确档名时间与搜索区间无关,0
笔也须导出只有表头的 CSV;补写查询条件须按 Search
才生效,并消除 Time Period「一行」的维度歧义。新增
AC29~AC33,尚有 2 项查询日期行为待确认。 |
| v1.4 |
2026-09-10 |
Codex 精简比较稿:保留 L0 核心规则、§1~§5 完整业务口径与附录 A 的 28
条验收,将重复说明合并;版本记录、目录与各附录默认折叠;重做资讯图表,突出四档周期、账号去重及三个例外。原
v1.3 与通过 marker 不变。 |
| v1.3 |
2026-09-09 |
既有需求重检:补 BO/Client 空视觉清单,建立可机判的视觉数量契约;为
L0「明确不做」逐项补正文锚点;把二至三级规格的续行并回所属编号段落;不改任何业务口径。 |
| v1.2 |
2026-09-05 |
§4.6 与 §4.7
各把一处歧义写死。 ① 排序方向:原写「沿用现行按
Date 的方向」没写方向,改成明写「新的在上」。 ②
导出范围:原写「导出的就是画面上那几行」,在原型把分页做成真的会换页之后,这句话可以读成「只导当前页」。改成明写「整个查询范围,与分页无关」,并新增
§4.7.1:单次导出上限平台没有统一,本需求不自订。 两处都是既有行为,本需求不改行为,只把话写清楚。触发源:原型送外审,两处各被判过一次不一致。 |
| v1.1 |
2026-09-05 |
L0
④「明确不做」表新增一列「不改取数节奏」——需求原文 第 17
点逐字「更新周期沿用既有节奏,非实时。本需求不改取数节奏。」,v1.0
没落;L0 资讯图表下补本地图 md5 指纹。图没重出,指纹对应
infographic/prd_v1.0_infographic.png(图跟内容走,不跟版本号走)。触发源:补跑
Codex 外审前的自查。 |
| v1.0 |
2026-08-28 |
初版。ReportType 由 1 档扩为 4 档(§1);人数类栏位改为按所选周期对「人」去重(§3);残段的取数与显示分开处理(§2);年龄分档按活跃当天的年龄归档,Total
与四档之和不再恒等(§3);Inactive Player Counts
取「期间内任一天曾触发」(§3);Attendance Player Counts 的
on the day 随 ReportType 走(§3)。附录给三组完整算例。 |
目录
[TOC]
L0 · 先看结论

⓪ 换版差异(开发手上 v1.15 → v1.16)
| # | 改了什么 | v1.15 | v1.16 | 查 |
|---|
| 1 | 字段定义说明 | 用监管月报栏号转述规则,开发必须先理解另一张表 | 直接按画面表头写定义、范围与等式;不要求另找监管月报或建立栏号映射 | §3.2~§3.3、附录 D |
没有改的:本期注册 cohort、三日 KYC 判定期限、Active、Suspended、Line、测试账号、fake=true 与 Attendance 的业务公式均不变。
只改说明方式的:删除跨报表栏号映射,改由字段名称直接说明计算口径,并在原型说明栏同步显示。
① 一句话需求
Player Report 新增
Weekly、Monthly、Time Period,各人数栏在每个报表周期内按用户账号去重;注册、KYC
与账号状态改按 CMED-EG-1680 定义计算。
② 术语写死表
| 词 |
唯一含义 |
| 周 |
周一到周日的完整一周,不是滚动 7 天 |
| 月 |
自然月 |
| 残段 |
查询只覆盖某周/月的一部分;数字算查询天,标签写完整周/月 |
| 有效统计区间 |
本行周期与查询日期的交集,采用左闭右开 |
| 本行截止时点 |
有效统计区间结束时刻;状态型指标只读取该时点的历史状态 |
③ 全局红线表
| # |
必须成立 |
最常见错误 |
验证 |
| G1 |
13 个人数栏分别 COUNT(DISTINCT 用户账号) |
把日报相加,导致同一人重复计数 |
AC1 AC2 AC3 |
| G2 |
周一至周日;月为自然月 |
做成滚动 7 天或周日起算 |
AC4 AC5 |
| G3 |
残段只算查询到的天;Date 仍写完整周/月 |
擅自补齐数字或把标签改成残段 |
AC6 AC7 AC8 |
| G4 |
当期发生冻结且本行截止仍冻结才计
Suspended;累计冻结状态仍用于排除 Active/Inactive |
把往期冻结存量重算进当期 07,或让同一人重复进入多类 |
AC12 AC13 AC37
AC50 |
| G5 |
当期新注册 cohort 必须满足
Partial / Initial + Fully Verified = Registered |
拿累计 Total Registered 与当期 03/04 对账 |
AC35 AC36 AC49 |
| G6 |
年龄只用真实 KYC 生日、按登入当天分档;无真实生日的 Active 只进
Total,故 Total 可大于四档之和 |
拿 fake=true 的默认生日做监管年龄,或强制加总相等 |
AC9 AC10 AC11
AC20 AC53 |
| G7 |
新字段定义同时适用于四种 ReportType |
只改周报/月报,留下另一套日报口径 |
AC16 AC28 |
| G8 |
GamingVenue = All
时跨全部实体站合并统计,不按站拆行 |
把 All 展开成每站一行 |
AC44 |
④ 适用范围与「不做」边界
本期做:ReportType
四档、快捷按钮随档切换、周期切分、13 个人数栏按周期去重、对应的
Date 显示,以及 §3 的 16
栏字段定义。
定义优先级:Luke 已确认本版依
CMED-EG-1680
新定义执行。因此,原需求中「既有取数口径不改」「不重定义栏位」「日报数字不变」只保留为历史记录,并由本版覆盖。覆盖范围限于
Registered、Total Registered、Partial / Initial、Active
与年龄档、Inactive、Suspended、Verified;四种
ReportType(含 Daily)统一使用新定义。
明确不做:增加
Quarter、Year、Bi-weekly、Dormant、合计行、筛选项、权限点、提示语、残段标记、导出上限及“Active Total
必须等于年龄分档和”的校验;不改
Tax Report、PlatformReport、代理盈亏、其他报表的
ReportType、二级子表 Forfeited Players
与非实时取数节奏。
1. ReportType 与快捷按钮
适用页面:ReportManagement ▸ Player Report。本文将查询日期栏统一称为
DateRange。
1.1 ReportType 沿用横排
radio,四档同时显示,顺序固定:
Daily → Weekly → Monthly →
Time Period
默认选中 Daily,日期默认
Today。Time Period 不切周期;每个
Nationality 在整个查询区间聚合为一行。
1.2 切换 ReportType
时,快捷按钮整组替换:
| ReportType |
快捷按钮 |
数量 |
Daily |
Today / Yesterday /
Last 7 Days / Last 14 Days /
Last 30 Days / Last Month /
This Month |
7 |
Weekly |
This Week / Last Week /
Last 3 Weeks / Last 6 Weeks |
4 |
Monthly |
This Month / Last Month /
Last 3 Months / Last 6 Months |
4 |
Time Period |
无 |
0 |
Time Period
的按钮整组消失,不显示置灰按钮。快捷按钮只填写查询日期,不改变 §2 的周期规则。
切换 ReportType 时,日期重设为该类型第一颗快捷按钮;切到
Time Period
时保留原日期。周/月快捷按钮都填写完整自然周期:This
填当前完整周/月,Last N 填当前周期及前 N-1
个完整周期。区间可含未来日期;未来日期没有资料时计 0。
1.3 变更
ReportType、日期、快捷按钮或其他筛选项,只更新尚未送出的查询条件;表格维持上一次成功查询。按
Search 后才同时套用全部条件并回到第 1
页。Export
一律依据上一次成功查询,不读取尚未送出的修改。
1.4 Date 显示格式:
| ReportType |
格式 |
示例 |
Daily |
YYYY/MM/DD |
2026/08/25 |
Weekly |
完整周的 YYYY/MM/DD ~ YYYY/MM/DD |
2026/08/17 ~ 2026/08/23 |
Monthly |
YYYY/MM |
2026/06 |
Time Period |
查询区间 YYYY/MM/DD ~ YYYY/MM/DD |
2026/08/28 ~ 2026/08/28 |
Time Period
查询单日也保留相同的起止日期,不缩成单一日期。
2. 周期与残段
2.1 周:周一 00:00:00.000 至周日
23:59:59.999,两端都含;不是滚动 7 天,也不是周日起算。
2.2 月:自然月 1 日 00:00:00.000
至最后一日 23:59:59.999;2 月按当年实际天数。
2.3
残段:查询只覆盖某周或某月的一部分时,必须同时满足:
| 项目 |
规则 |
| 数字 |
只统计查询区间内的天,不补入区间外资料 |
Date |
仍显示该行所属的完整周或 YYYY/MM |
| 画面 |
不增加“本行是残段”的标记或提示 |
例:Weekly 查询
2026/08/20 ~ 2026/08/23,Date 显示
2026/08/17 ~ 2026/08/23,数字只包含 4 天。
Monthly 查询 2026/06/30 ~ 2026/08/31
时,依新到旧输出三行:
Date |
实际统计区间 |
2026/08 |
08/01 ~ 08/31 |
2026/07 |
07/01 ~ 07/31 |
2026/06 |
仅 06/30 |
3. 取数口径
3.1 共通基准
- 定义来源:
CMED-EG-1680。原型搜索区必须显示
Def by CMED-EG-1680。
- 去重键为用户账号。每一行、每一个人数栏分别去重;不用姓名、手机号或
KYC 资料去重。
- 只统计
player(
usertype=0),代理不计。Line
是现行查询条件:选 All 纳入全部
userline,选特定值则只统计该
userline;不得在取数层额外写死
userline=1。正式与测试账号都计入,不以
istester 排除。
- 需求 20 的节点
1(全程免 KYC)与节点
2(提款前才校验
KYC)是现行正常业务分支,不是异常账号排除条件。fake=true
的系统默认 KYC 资料视为尚未提交真实 KYC。
Nationality:结算时点尚未提交 KYC 的注册账号归
Filipino;已提交 KYC 的账号依申报国籍归
Filipino 或 Non-Filipino。KYC
国籍为前台必填项,未填写不能提交。
- 区间采用左闭右开:
开始时间 <= event_time < 结束时间的下一毫秒;沿用平台既有时区。
- 事件型指标读取“有效统计区间”;状态型指标读取“结算时点”。历史报表不得用查询当下的状态代替历史状态。
3.2 现行 16 栏字段表
开发与测试只需按画面表头辨识字段;下表的定义、计算条件与时间口径就是唯一实现依据。本需求不要求另找监管月报截图,也不要求建立另一套栏号与 BO 栏位的映射。
一行=Nationality × 周期段。GamingVenue
是查询筛选,不是拆行维度;每个指标按用户账号去重。本页没有合计行,因此“合计”均为
—。
| # |
表头 |
定义 |
计算/取值 |
时间口径 |
合计 |
备注 |
| 1 |
Nationality |
本行国籍分组 |
未提交 KYC=Filipino;已提交 KYC=依申报国籍分为
Filipino/Non-Filipino |
本行截止时点 |
— |
KYC 国籍未填写时不能提交 |
| 2 |
Date |
本行对应的报表周期 |
依 §1.4
显示日、完整周、自然月或查询区间 |
本行周期 |
— |
残段仍显示完整周/月标签 |
| 3 |
Registered Player Counts |
本期新增注册人数 |
COUNT(DISTINCT 用户账号);完成注册时间落在有效统计区间 |
完成注册时间 |
— |
不以 KYC 提交时间计算 |
| 4 |
Total Registered Players |
截止时点前已完成注册的总人数 |
COUNT(DISTINCT 用户账号);完成注册时间早于本行截止时点 |
本行截止时点 |
— |
包含尚未提交 KYC 的账号 |
| 5 |
Partially / Initially Verified |
当期新注册中,KYC 判定期限内未完成验证的账号数 |
只取本行 Registered Player Counts 所包含的新增注册账号;在
min(registration_time + 3 days, 本行截止时点) 仍为
Not Set / Under Review / Rejected;按账号去重 |
每个账号的 KYC 判定期限 |
— |
Not Set 归
Filipino;后续通过不得回写历史 |
| 6 |
Verified Player Counts |
当期新注册中,KYC 判定期限内完成验证的账号数 |
只取本行 Registered Player Counts 所包含的新增注册账号;review_time <= min(registration_time + 3 days, 本行截止时点)
且结果为 Verified;按账号去重 |
每个账号的 KYC 判定期限 |
— |
与 Partially / Initially Verified 相加必须等于 Registered Player Counts;后续通过不得回写历史 |
| 7 |
Active Player Counts · Total |
本期活跃账号数 |
未冻结、有效统计区间内至少登入 1 次,且符合下列任一身份:真实
KYC = Verified;或需求 20 当前节点仍有效且
fake=true 的免 KYC/提款前 KYC player |
登入事件+本行截止时点 |
— |
充值或投注不能单独触发 Active;特殊 KYC 分支是合法 Active 身份 |
| 8 |
Active Player Counts · Age: 21 to 30 |
Active 中登入当天为 21~30 岁的账号数 |
先符合 Active,再按每次登入当天的真实 KYC 生日分档并去重 |
登入当天 |
— |
fake=true 默认生日不可使用;无真实生日时只计 Active
Total |
| 9 |
Active Player Counts · Age: 31 to 40 |
Active 中登入当天为 31~40 岁的账号数 |
先符合 Active,再按每次登入当天的 KYC 生日分档并去重 |
登入当天 |
— |
同账号跨年龄档时可进入多个年龄栏 |
| 10 |
Active Player Counts · Age: 41 to 50 |
Active 中登入当天为 41~50 岁的账号数 |
先符合 Active,再按每次登入当天的 KYC 生日分档并去重 |
登入当天 |
— |
同账号跨年龄档时可进入多个年龄栏 |
| 11 |
Active Player Counts · Age: 51 and above |
Active 中登入当天为 51 岁以上的账号数 |
先符合 Active,再按每次登入当天的 KYC 生日分档并去重 |
登入当天 |
— |
同账号跨年龄档时可进入多个年龄栏 |
| 12 |
Inactive Player Counts |
注册满 3 天仍未通过 KYC 的账号数 |
KYC != Verified、registration_time + 3 days < 本行截止时点,且未冻结;按账号去重 |
本行截止时点 |
— |
等于 3 天时仍在宽限期 |
| 13 |
Suspended Player Accounts |
当期曾被冻结且截止仍冻结的账号数 |
有效统计区间内至少一笔冻结事件,且本行截止时点最终状态仍为冻结;按账号去重 |
冻结事件+本行截止时点 |
— |
不分冻结原因;往期已冻结但本期没有冻结事件的账号不重复计入 |
| 14 |
Forfeited Player Counts |
本期发生有效没收的账号数 |
[409] forfeiture 且理由不为
Violation of TOU;按账号去重 |
没收事件时间 |
— |
只取有效统计区间内事件 |
| 15 |
Attendance Player Counts |
本期完成任一成功金流/账变的账号数 |
有效统计区间内至少 1
笔金流或账变最终状态为成功/完成;类型包含但不限于充值、投注、提款、领取奖金及其他金流/账变操作;按账号去重 |
交易完成时间 |
— |
依已成功事件如实计算,不以 KYC 状态或 fake
为统计前提;非成功终态不计 |
| 16 |
Gaming Venue |
本次查询套用的实体站范围 |
筛选为 All 时显示 All,13
个人数栏合并统计全部实体站;选择单一实体站时显示该站并只统计该站 |
查询条件 |
— |
不把 All 展开成多个实体站列或多行 |
3.3 KYC 状态与对账
KYC
只允许四个值:Not Set、Under Review、Rejected、Verified。尚未提交
KYC 的注册账号按 Not Set 计算,并归入
Filipino。
| CMED 指标 |
定义 |
现行 Player Report |
Newly Registered Players |
完成注册时间落在有效统计区间 |
对应 Registered Player Counts |
Total Registered Players |
完成注册时间早于结算时点的全部账号 |
对应同名栏位 |
Partially / Initially Verified |
当期新注册账号在个别 KYC 判定期限仍未通过 |
对应同名栏位 |
Fully Verified |
当期新注册账号在个别 KYC 判定期限内完成验证 |
对应 Verified Player Counts |
Active Player Accounts |
规则见 §3.2 |
对应 Active Total 与年龄档 |
Inactive / Deactivated Player Accounts |
规则见 §3.2 |
对应 Inactive Player Counts |
Suspended Player Accounts |
当期曾冻结且结算时点仍冻结的账号,不分冻结原因 |
对应同名栏位 |
同一当期新注册 cohort、筛选条件与 KYC 判定期限下,必须满足:
Partially / Initially Verified + Fully Verified = Registered Player Counts
Total Registered Players
是截至本行截止时点的累计注册数,不参与当期 03/04
二分。跨月对账时,必须以每个月的注册 cohort 累加 03/04,不能拿单月
03/04 与累计 02 相加或比较。
3.4 账号状态互斥
每个账号依下列顺序判断,命中后停止:
- 结算时点已冻结:先排除于
Active/Inactive;若冻结事件发生在有效统计区间内,计入当期
Suspended,否则归为「往期冻结存量 C」。
- 否则,真实 KYC 已通过,或需求 20 当前节点仍有效且
fake=true;有效统计区间内登入过时计
Active。
- 否则,真实 KYC 未通过且注册满 3
天:
Inactive / Deactivated。
- 其余不进入画面上的三类。
因此同一人不得同时进入
Active、Inactive、当期 Suspended
或「往期冻结存量 C」;画面上的三类相加不一定等于
Total Registered Players。以下两类也会落在“其余”:
- 注册未满 3 天、KYC 尚未通过、未冻结。
- KYC 已通过、期间内未登入、未冻结。
3.5 截止时点与三天宽限期
状态型指标只看本行截止时点,不以查询执行时间或截止后的状态回写历史。Inactive
在 registration_time + 3 days < 本行截止时点
时才算逾期;两者相等时仍在宽限期。Rejected 不提前计入
Inactive。
本段的 03/04 是监管月报编号,不是 Player Report 画面的第 3/4 栏。03/04 只二分本行新增注册 cohort。每个账号的 KYC 判定期限为
min(registration_time + 3 days, 本行截止时点);在期限内完成并通过
KYC 计 04,否则计
03。月报因此同时具有「当月新注册」范围与「月底截止」限制;月底之后才完成的
KYC 不得回写该月。若账号注册满 3 天的时点早于月底,则以满 3 天时点冻结
03/04 归类。
| 查询 8 月资料的情形 |
8 月结果 |
| 7/30 注册,8/1 KYC 通过 |
Registered=0;截止时点为 Verified。是否 Active 另看 8
月内登入与冻结状态。 |
| 7/30 注册,8 月截止时仍未通过 KYC |
Registered=0;宽限期已过且未冻结时 Inactive=1。 |
| 8/31 注册,截止时仍未通过 KYC |
Registered=1;仍在宽限期,Inactive=0。 |
KYC
在截止边界当刻完成、或冻结状态在边界当刻改变,均归入下一段;同一区间内多次变更只取截止时点最后状态。历史重跑必须读取当时快照。部分周/月也以该残段结束时刻为截止,不等待完整周期结束。
需求 20 已定义两种现行流程:节点 1 全程免 KYC,节点
2 在提交提款前才校验 KYC。这些 player 在
fake=true 期间视为没有真实 KYC:国籍归
Filipino,当期注册 cohort 归
Partially / Initially Verified而非
Fully Verified;只要符合登入/成功金流事件,仍可分别进入
Active Total 与 Attendance。提交真实 KYC 后
fake=false,国籍、KYC 状态与后续 Active
身份就按一般流程判定;03/04 历史 cohort 仍守原判定期限,不因晚到的 KYC
回写。
3.6 年龄分档
只使用玩家提交的真实 KYC
生日,以登入当天的年龄归档。fake=true
的系统默认生日不是真实身份资料,不得用于监管年龄栏;这类玩家可计 Active
Total,但在真实 KYC
提交前不进四个年龄档。会员在同一周期跨年龄档且两边都有登入时,可同时进入两个年龄档;Total
仍只计一个账号。因此 Total 与四档之和不必相等。
跨档点只有
30 → 31、40 → 41、50 → 51。Daily
不会跨档;Weekly、Monthly 可能跨档,且
Monthly 较常发生。三个跨档点都使用相同规则。
3.7 数据时间
报表沿用非实时更新节奏。所有状态型字段必须能还原结算时点的 KYC
与冻结状态;若现有资料只能取得当前状态,开发须在开工前提出,不得静默改成当前快照。
本需求的最低取数来源为:会员注册与账号属性、KYC
历程、登录日志、冻结/解冻日志、成功金流/账变明细,以及没收资料。月报人工执行可继续以「会员注册档、登录日志、冻结日志」三份基础档为起点,但涉及
03/04、08 与 Forfeited
的检核,必须再回查对应历程或明细,不得把三份基础档齐全误判成所有指标来源齐全。
4. 页面、排序与导出
4.1 表格为 §3.2 的 16
栏。人数显示整数与千分位;零显示 0,不显示
--。Nationality 维持
Filipino/Non-Filipino 两组,并依 §3.2 分组。
4.2 按周期起始日由新到旧排序;分页沿用现行。
4.3 导出契约:
| 项目 |
规则 |
| 查询条件 |
取按下 Export 时「上一次成功查询」的
ReportType、日期、筛选与排序;尚未按 Search
的修改不生效 |
| 资料范围 |
导出该查询的全部结果,与当前分页无关;Weekly
导周粒度、Monthly 导月粒度,不导底层日报 |
| 栏位 |
与列表 16 栏一致;不含评审标记,也不展开
Forfeited Players 二级明细 |
| 档案 |
CSV、UTF-8 with BOM;档名为
PlayerReport_yyyymmdd_hhmmss.csv。日期与时间取按下
Export 的当下,不取搜索区间 |
| 0 笔结果 |
Export 仍可点击;CSV 只写 16 栏表头,数据列为空 |
其余导出行为沿用现行;本需求不新增统一笔数上限。
4.4 GamingVenue、Line、Platform
三个筛选项及 Forfeited Players
二级明细沿用现行;不增加合计行。GamingVenue = All
的语义为“不按实体站过滤”:全部实体站合并统计,每个
Nationality × 周期段 只出一行,第 16 栏显示
All;不得把各实体站逐一列出。选择特定实体站时,第 16
栏显示该站且只统计该站。
5. 权限与提示语
5.1 不新增权限点。四档随 Player Report
查看权限出现,导出沿用既有权限。
5.2 本需求不新增提示语。查询失败、无数据与导出沿用页面既有处理;残段不提示。
原型若呈现查无资料,必须逐字使用:
| 场景 |
英文文案(上线基准) |
呈现 |
| 查无资料 |
No More Data |
页内空态 |
该文案来自后台通用空态;若线上 Player Report
实测不同,以线上为准并同步修改 PRD 与 HTML。
附录 A:验收标准(默认折叠)
| # |
P |
验收点 |
| AC1 |
P0 |
已通过 KYC、未冻结的同一会员周一与周三各登入一次:该周
Active Total 计 1(G1) |
| AC2 |
P0 |
AC1 的两天日报各计 1;周报计 1,不得把日报相加成
2(G1) |
| AC3 |
P0 |
同一会员期间内被没收两次:Forfeited 计
1(G1) |
| AC4 |
P0 |
周一开始、周日结束;不得按滚动 7 天切分(G2) |
| AC5 |
P0 |
月按自然月切分;2 月为 28 或 29 天(G2) |
| AC6 |
P0 |
残周查询 08/20 ~ 08/23,Date 显示完整周
08/17 ~ 08/23(G3) |
| AC7 |
P0 |
承 AC6,数字只含 4 天,不等于整周数字(G3) |
| AC8 |
P0 |
残月 2026/06 行只统计 06/30,标签仍为
2026/06(G3) |
| AC9 |
P0 |
会员跨年龄档前后各登入一天:两个年龄档各计 1(G6) |
| AC10 |
P0 |
承 AC9,Total=1、四档之和 =2
为正确结果(G6) |
| AC11 |
P0 |
只在跨档前登入:只进入旧年龄档(G6) |
| AC12 |
P0 |
账号在有效统计区间内发生冻结且结算时点仍冻结时,不论原因,也不论 KYC
或登入状态,都只计当期 Suspended(G4) |
| AC13 |
P0 |
已通过 KYC但期间未登入、未冻结时,不计入
Active/Inactive/Suspended(G4) |
| AC14 |
P0 |
Weekly Attendance
为有效统计区间内任一成功金流/账变的去重人数;不以 KYC
为前提,交易类型不限于投注 |
| AC15 |
P0 |
Daily Attendance
按当日完成任一成功金流/账变的账号去重;只改变统计区间,不改变交易类型范围 |
| AC16 |
P0 |
Registered、Active、Inactive、Verified
的新定义同时适用于四种 ReportType(G7) |
| AC17 |
P0 |
PlatformReport · Bet Player Counts 上线前后不变 |
| AC18 |
P1 |
去重键必须为用户账号,不得改用姓名或手机号 |
| AC19 |
P1 |
残段不显示额外标记或提示语 |
| AC20 |
P0 |
Daily 下,具真实 KYC 生日的 Active
必须恰好进入一个年龄档;若存在 fake=true 且无真实生日的
Active,Active Total 可大于四档之和(G6) |
| AC21 |
P0 |
已注册但在 KYC 判定期限仍未提交的账号按 KYC = Not Set
并归入 Filipino;仍计入
Registered、Total Registered 与当期
Partial / Initial |
| AC22 |
P1 |
KYC 国籍未填写时不能提交;提交后依申报国籍归 Filipino
或 Non-Filipino |
| AC23 |
P1 |
Weekly 与 Monthly 各显示正确的 4
颗快捷按钮 |
| AC24 |
P1 |
Time Period 的快捷按钮整组消失 |
| AC25 |
P1 |
Time Period 查单日仍显示完整起止区间 |
| AC26 |
P1 |
Forfeited Players 二级明细不受 ReportType
影响 |
| AC27 |
P1 |
表格依 §3.2 显示完整 16 栏,不增不减 |
| AC28 |
P0 |
同一查询条件重复执行,四种 ReportType 都使用 §3
的同一组字段定义(G7) |
| AC29 |
P0 |
修改条件但未按 Search
时,表格与导出都维持上一次成功查询;按下后套用全部条件并回第 1 页 |
| AC30 |
P1 |
导出档名符合
PlayerReport_yyyymmdd_hhmmss.csv;日期与时间取按下
Export 的当下,不取搜索区间;档案为 UTF-8 with BOM |
| AC31 |
P0 |
导出包含上一次成功查询的全部 16 栏结果,与分页无关 |
| AC32 |
P0 |
Time Period 跨多周/月时,每个 Nationality
只出一行;13 个人数栏在整个查询区间按账号去重 |
| AC33 |
P0 |
查询结果为 0 笔时 Export 仍可点击;下载的 CSV 只有 16
栏表头,没有数据列 |
| AC34 |
P1 |
切换 ReportType 后日期按规则重设;周/月
Last N 含当前完整自然周期,未来日期没有资料时计 0 |
| AC35 |
P0 |
同一当期注册 cohort
与判定期限下,Partial / Initial + Fully Verified = Registered;不得改与累计
Total Registered 对账(G5) |
| AC36 |
P0 |
registration_time + 3 days = 结算时点 时不计
Inactive;结算时点再往后才计 Inactive |
| AC37 |
P0 |
未通过 KYC 且已逾 3 天的账号若本期冻结并在截止仍冻结,只计当期
Suspended,不计 Inactive;若冻结发生在往期,则归往期冻结存量 C,也不计
Inactive |
| AC38 |
P0 |
查询历史周期时,KYC
与冻结状态取该行结算时点,不取查询当下的当前状态 |
| AC39 |
P0 |
未冻结且期间有登入时,真实 KYC = Verified 或需求 20
当前节点仍有效且 fake=true 的 player 计
Active;充值或投注不能单独触发 Active |
| AC40 |
P1 |
原型搜索区逐字显示 Def by CMED-EG-1680 |
| AC41 |
P0 |
Monthly 查询 2026/06/30 ~ 2026/08/31
时,依序输出
2026/08、2026/07、2026/06 三行;6
月行只统计 06/30。 |
| AC42 |
P0 |
在 30 → 31、40 → 41、50 → 51
任一跨档点前后各登入时,两个年龄档各计 1,Active Total
仍只计 1。 |
| AC43 |
P0 |
同一行必须同时显示
Registered Player Counts、Total Registered Players、Partially / Initially Verified、Verified Player Counts
与
Suspended Player Accounts;Registered、Partial/Initial、Verified
满足 G5,Total Registered 保持累计。 |
| AC44 |
P0 |
GamingVenue = All 时,每个
Nationality × 周期段 只出一行,第 16 栏显示
All,13 个人数栏以全部实体站账号合并去重;选择
Gaming Venue 2 后仍每组一行,第 16
栏只显示该站且只统计该站(G8)。 |
| AC45 |
P0 |
5
个不同账号在期间内分别只完成充值、投注、提款、领取奖金、另一种金流/账变交易;其中可同时包含已验证与需求
20 fake=true 合法免 KYC
账号:Attendance Player Counts = 5。 |
| AC46 |
P0 |
同一账号在期间内完成充值、投注与提款各 1 笔:Attendance 仍只计
1。 |
| AC47 |
P0 |
账号期间内只有处理中、失败、拒绝、取消或已撤销交易:Attendance 计
0。 |
| AC48 |
P0 |
交易建立时间在区间内但完成时间在区间外时不计;完成时间落在左闭右开有效统计区间内时才计。 |
| AC49 |
P0 |
当月 01 为 10,其中 6 个账号在各自注册后 3 日与月底较早者前完成
KYC、4 个未完成:04=6、03=4、03 + 04 = 01 = 10;02
仍为含往月账号的累计值。 |
| AC50 |
P0 |
账号上月冻结且本月无冻结事件、月底仍冻结:本月
07=0,账号归往期冻结存量 C,且不得回流 Active/Inactive;跨月累计 07
使用 username 并集去重。 |
| AC51 |
P0 |
Line=All、Line=1、Line=2
各查一次:只统计 usertype=0 的 player,特定 Line 只取该
userline,All 取全部
userline;代理排除,正式与测试账号均纳入。 |
| AC52 |
P0 |
需求 20 节点 1 与节点 2 各一个
fake=true player:未冻结且期间登入时计 Active
Total;期间有成功金流时计 Attendance;两者均归
Filipino,不因未 KYC 报错或排除。 |
| AC53 |
P0 |
fake=true player 的系统默认 KYC 记录不得计
Fully Verified,默认 nationality 与 birthday
不得用于国籍或年龄分档;当期注册时计
Partially / Initially Verified,Active 只进 Total
不进年龄档。 |
| AC54 |
P0 |
同一节点 2 player 在提款前提交真实
KYC:fake=false
后依真实审核状态、申报国籍与真实生日走一般归类;已冻结的 03/04 历史
cohort 不回写。 |
附录 B:四组基准算例(默认折叠)
B.1 年龄跨档
查 2026/08/24 ~ 2026/08/30 周报。会员甲已通过 KYC
且未冻结,08/27 满 31 岁,并在 08/25 与
08/28 登入。
| 结果 |
值 |
Active Total |
1 |
21 to 30 |
1 |
31 to 40 |
1 |
| 四档之和 |
2 |
Total=1、分档和 =2 是正确结果。
B.2 三天宽限期
会员乙在 09/01 10:00 完成注册,KYC 为
Under Review,账号未冻结。结算时点为
09/04 10:00 时仍不计 Inactive;结算时点晚于该时间后才计
1。
B.3 状态优先级
会员丙已冻结、KYC 为 Rejected、注册超过 3
天,且期间内曾登入。只计 Suspended;Inactive
与 Active 都不计。
B.4 残段
Weekly 查询
2026/08/20 ~ 2026/08/23。Date 显示完整周
2026/08/17 ~ 2026/08/23,数字只来自查询覆盖的 4 天。
附录 C:原型视觉清单(默认折叠)
原型视觉清单
| 视觉 ID |
载体 |
用途 |
证据 |
VIS-BO-NONE |
BO |
后台页面没有图片或图片占位 |
BO 原型 |
VIS-CLIENT-NONE |
Client |
本需求不产出客户端页面 |
L0 ④ |
报表表格、载入骨架与标注符号不属于视觉素材槽位。
附录 D:PAGCOR 月报栏位校验 SOP(默认折叠)
附件:PAGCOR
OGP 月报 Excel 表
阅读方式:本附录也以字段名称为准。来源附件中的栏号只是原表顺序,不是开发实现条件;开发与测试无需另建 BO 栏位映射,直接依 §3.2 的同名字段定义验收。
D.1 适用范围与判定等级
- 适用:
Player Monthly Operational Summary 的 01~08
栏;只统计 usertype=0 的 player,Line
范围必须与该次查询条件一致(All 或特定
Line),不排除测试账号。
- 硬性校验:资料缺漏、数学恒等式、Line/player 范围不一致、需求 20 的
fake=true 默认资料被误认为真实
KYC,或无法回源时,必须阻止送出,修复或取得具名业务确认后才可继续。“KYC
前已发生合法金流”本身不是异常。
- 预警校验:历史比率、单日低点、月增减幅仅用于提示人工复核;偏离阈值本身不直接阻止送出,但必须留下原因与证据。
- 月报完成顺序固定为
L0 资料源完整性 → L1 单栏自检 → L2 跨栏交叉检核 → L3 回源对账 → 六桶对账。
D.2 L0 — 资料源完整性
| # |
检核 |
通过标准 |
等级 |
| L0-1 |
登录日志时间范围 |
MIN(时间) <= 月初 且
MAX(时间) >= 月底;以实际资料时间为准,不信档名 |
硬性 |
| L0-2 |
登录日志逐日笔数 |
无缺日;任一天低于当月中位数 30% 时复核日志与事件 |
缺日为硬性;30% 为预警 |
| L0-3 |
注册即登录命中率 |
当月注册账号与登录日志回查;低于 99% 复核,低于 95% 优先查漏 |
预警;已提交 KYC 却无登录为硬性异常 |
| L0-4 |
冻结日志结构 |
每列数量、CSV 引号与逗号跳脱正确,零笔解析异常 |
硬性 |
| L0-5 |
指标明细可用 |
KYC 历程、成功金流/账变明细、没收资料均可按账号及时间回查 |
硬性 |
三份基础档为会员注册档、登录日志、冻结日志;但三份齐全不等于所有栏位来源齐全。03/04
必须有 KYC 历程,08 必须有成功金流/账变明细,Forfeited
必须有没收资料。
D.3 L1 — 单栏自检
| 栏 |
栏位 |
自检规则 |
| 01 |
Newly Registered |
registertime 落在当月;范围为该次 Line
查询值下的 usertype=0, isdeleted=0,不加
istester=0;Line=All 不得暗中改为
userline=1。与会员档逐笔对账且 username
不重复。单日注册量低于前 7 日中位数 10% 只触发预警与说明。 |
| 02 |
Total Registered |
算法 A:前月 02+本月 01;算法 B:月底前累计完成注册数。A 必须等于
B;不等时追查软删除或历史回补,不可直接用 B 覆盖。 |
| 03/04 |
Partially / Fully Verified |
只取本月 01 cohort;每个账号以
min(registertime + 3 days, 月底) 为判定期限。期限内真实 KYC
通过计 04,其余计 03;需求 20 fake=true
的系统默认记录一律计未 KYC,不得计 04。必须满足
03 + 04 = 01,且历史重跑不得漂移。 |
| 05 |
Active Player |
本月曾登录 ∩ 月底未冻结 ∩(真实 KYC 已通过,或需求 20 当前节点有效且
fake=true);按账号去重。不再检查
05 <= 已完成 KYC;检查 05 >= 08
及月变动,超过 50% 为预警。无真实生日者只计 Active
Total,不使用默认生日进年龄档。 |
| 06 |
Inactive / Deleted |
未命中 05 ∩ 注册满 3 日 ∩ 月底仍未通过真实 KYC ∩
月底未冻结;冻结排除使用累计最终状态,不只看本月新增冻结。需求 20
fake=true 玩家若本月已登入则已进 05,不可重复进 06。 |
| 07 |
Suspended Player |
本月至少一笔冻结事件 ∩ 月底最终状态仍冻结;同月解冻后再冻结仍计
1,按账号去重,不以「冻结笔数−解冻笔数」计算。往月冻结、本月无冻结事件的存量归六桶
C,不重复计入 07。 |
| 08 |
Attendance Player |
本月任何一笔最终成功/完成的金流或账变账号,类型含充值、投注、提款、领取奖金及其他账变;以完成时间归期并按账号去重。不以
KYC 或 fake 为统计前提;需求 20 允许的 KYC
前成功金流正常计入。非成功终态不计。检查
08 <= 05、08 <= 当月不重复登录人数、08 <= 02;08/05
落在 0.2~0.7 之外只触发预警。 |
03/04 不采用查询当下的 KYC 快照。若真实 KYC
在个别判定期限之后才通过,该历史 cohort 仍保持 03,不得回写为 04。需求
20 的 fake=true 默认记录不是真实 KYC;节点 1
全程免 KYC,节点 2 提款前才校验,故 KYC
前金流必须依实际成功事件计 08,不得当异常排除。
D.4 L2 — 跨栏交叉检核
| # |
检核式 |
判定 |
| 1 |
02(M) = 02(M−1) + 01(M) |
硬性;软删除或历史回补须逐笔解释并形成调整记录 |
| 2 |
03(M) + 04(M) = 01(M) |
硬性;三者必须是同一当月注册 cohort |
| 3 |
Σ03 + Σ04 = 02(期末) |
硬性;从报表起始 cohort 连续累加,期初存量须单列带入 |
| 4 |
05 = 已验证且本月登录未冻结 ∪ 需求 20 有效节点下 fake=true 且本月登录未冻结 |
硬性;两集按 username 并集去重 |
| 5 |
06 <= 截止时累计未完成 KYC |
硬性 |
| 6 |
05 + 06 + 07 <= 02 |
硬性;另以六桶式确认未显示的往月冻结存量、宽限与休眠 |
| 7 |
COUNT(DISTINCT UNION(月份 07 的 username)) <= 02(期末) |
硬性;禁止直接算术相加各月 07,避免同账号跨月重复 |
| 8 |
08 <= 05 |
硬性;失败时先查 Line/player 范围、登录、冻结时点与需求 20
节点判定,不得直接排除 KYC 前交易 |
六桶对账必须以互斥账号集合计算,差额为 0:
02 期末在册 = 05 活跃
+ 06 非活跃
+ 07 本月冻结且月底仍冻结
+ A 休眠(已验证、本月未登录、月底未冻结)
+ B 宽限(未验证、注册未满 3 日、月底未冻结)
+ C 往月冻结存量(本月无冻结事件、月底仍冻结)
D.5 L3 — 回源对账与出表
| # |
对账项 |
通过标准 |
| 1 |
冻结/解冻日志账号对会员档 |
100% 可回查,且 07 与 C 的分流可逐账号复现 |
| 2 |
08 账号对金流、需求 20 节点与登录 |
每个账号都有区间内成功终态并可在登录日志回查;未完成真实 KYC
者必须可还原当时有效的需求 20 节点,不得以 KYC 缺失直接剔除 |
| 3 |
登录日志账号对会员档 |
交集比例与该次 Line 查询值及 usertype=0
player 范围一致 |
| 4 |
国籍分类 |
nation_type 与 kyc_info.nationality
的映射一致;差异逐笔列出 |
| 5 |
03/04 历史重跑 |
用 KYC 历程依个别判定期限重算,与已出月份完全一致 |
最终执行顺序:先跑 L0;再依 01 → 02 → 03/04 → 05 → 06 → 07 → 08 完成
L1;接着跑 L2、L3
与六桶对账。所有硬性校验通过且预警均有说明后才可出表;输出须附当月已知差异、责任人与处理状态。
文档版本:v1.16 | 日期: 2026-09-17 | 作者: Luke |
文档状态:待开发评审
Player Report
· Weekly and Monthly Reports · PRD
Author Luke Version
v1.16 Date 2026-09-17 Status Pending
Development Review Platform BRAND_A &
BRAND_B Class R
Goal: Help the Filipino reporting colleague prepare
the monthly regulatory Player Report. Audience:
Filipino reporting staff, BO frontend, reporting backend, and QA.
Development and QA follow the Chinese source PRD.
Version History
| Version |
Date |
Change Summary |
| v1.16 |
2026-09-17 |
Updates §3 to explain every field directly by its Player Report screen header after development feedback, without requiring another monthly report or a second numbering system. Partially / Initially Verified and Verified Player Counts partition the current-period Registered Player Counts cohort; cumulative Total Registered Players does not participate. Active, Suspended, Attendance, Line, player-only, test-account, and fake=true rules are reiterated; business formulas are unchanged. |
| v1.15 |
2026-09-15 |
Updates §3 and Appendix D: count players
only, apply the selected Line filter, and include test
accounts; 03 + 04 = 01 partitions the current registration
cohort by real-KYC outcome within three days; 07 requires an in-period
freeze and frozen status at cutoff; Attendance follows actual successful
money movement without requiring KYC. Requirement 20 node-1/node-2
players with fake=true are Filipino and Partially/Initially
Verified before real KYC, but may still count in Active and Attendance
from actual events. System-default KYC data is never real KYC or an age
source. Cross-month Σ07 uses a distinct account-set union. The same
version fixes Appendix C's generated collapse boundary, Appendix D's
code-block readability, and the bilingual HTML image path, and attaches
the PAGCOR OGP monthly-report workbook. |
| v1.14 |
2026-09-14 |
Redefines Attendance Player Counts in §3 per Luke's latest confirmation: count a player
who completes any successful transaction in the effective interval,
including deposit only, bet only, withdrawal only, bonus claim only, or
another money-movement/ledger transaction. Excludes non-success final
states, uses completion time, deduplicates by account, and leaves
PlatformReport · Bet Player Counts unchanged. Appendix
A adds deterministic cases. |
| v1.13 |
2026-09-14 |
Corrects GamingVenue = All in §3 and §4 per Luke's
acceptance feedback: aggregate all Gaming Venues into one account scope
instead of splitting rows by venue; selecting one venue limits the query
to that venue. Updates column 16, the prototype, and acceptance
coverage. |
| v1.12 |
2026-09-11 |
§3 adds the three regulatory monthly-report
fields Total Registered Players,
Partially / Initially Verified, and
Suspended Player Accounts, changing the report from 13 to
16 columns, and restates that registered accounts without submitted KYC
are Filipino. L0 records the monthly-report
goal. |
| v1.11 |
2026-09-11 |
Sonnet round 1 states in L0 ④ that the new
CMED-EG-1680 definitions override the original
requirement's legacy definitions; §2.3 adds a
three-month partial-period example; §3.6 adds
all three age-band transitions and acceptance coverage. |
| v1.10 |
2026-09-11 |
§3 defines one row as
Gaming Venue × Nationality × period segment; all status
metrics use the row cutoff time. Added KYC, freeze, cross-month
grace-period boundaries and examples; removed repetition and redrew the
infographic; entered review. |
| v1.9 |
2026-09-10 |
§3 removes impossible submitted-KYC
nationality branches. Nationality is mandatory before KYC submission;
submitted records are grouped as Filipino or
Non-Filipino. The 13 columns and other metrics are
unchanged; infographic updated. |
| v1.8 |
2026-09-10 |
§3 becomes a complete 13-column definition
table. Accounts without submitted KYC are Filipino;
submitted records use declared nationality. Suspended means
every frozen account regardless of reason. Dormant is
absent from the regulatory Excel and removed; former OP1/OP2 closed.
Acceptance criteria and infographic updated. |
| v1.7 |
2026-09-10 |
Rewrites field definitions from CMED-EG-1680:
Registered uses registration completion time; Active means KYC verified,
logged in during the period, and not frozen; Inactive means registered
over three days, KYC not verified, and not frozen; Verified uses status
at cutoff. Adds the KYC reconciliation equation, mutually exclusive
status order, and the Filipino fallback before KYC submission. Keeps 13
columns and identifies four undisplayed CMED metrics and two open
points. |
| v1.6 |
2026-09-10 |
Closes date behavior: switching ReportType resets to
that type's first shortcut; Time Period keeps the current
dates. Weekly/monthly shortcuts use complete calendar periods;
Last N includes the current period; future dates may be
queried. Adds AC34. |
| v1.5 |
2026-09-10 |
Adds export filename, data scope, and query basis. Filename time is
unrelated to the search range; zero rows still export a header-only CSV.
Filter changes require Search, and Time Period
row granularity is clarified. Adds AC29–AC33. |
| v1.4 |
2026-09-10 |
Codex concise candidate: retains L0, complete business rules in
§1–§5, and 28 acceptance criteria while merging duplicate text. Version
history, TOC, and appendices default to collapsed. Infographic
highlights four report types, account deduplication, and three
exceptions. Original v1.3 and its pass marker remain unchanged. |
| v1.3 |
2026-09-09 |
Adds empty BO/Client visual inventories and machine-checkable
visual-count contracts; anchors every explicit out-of-scope item; merges
continuation lines into their numbered clauses without changing business
rules. |
| v1.2 |
2026-09-05 |
Clarifies two ambiguities: sorting is newest first; export covers
the entire query result, not only the current page. Adds that this
requirement does not define a unified per-export limit. Both preserve
existing behavior and address prototype review findings. |
| v1.1 |
2026-09-05 |
Adds “do not change refresh cadence” to the L0 out-of-scope table,
matching source requirement item 17. Adds the local infographic MD5; the
image itself is unchanged. |
| v1.0 |
2026-08-28 |
Initial version. Expands ReportType from one to four
options; deduplicates people within the selected report period;
separates partial-period calculation from labels; assigns age by login
day; allows Total to differ from age-band sum; defines period-based
Inactive and Attendance behavior; adds three complete examples. |
Table of Contents
[TOC]
L0 · Executive Summary

⓪ Version difference (development copy v1.15 → v1.16)
| # | Change | v1.15 | v1.16 | Reference |
|---|
| 1 | Field definitions | Described rules through regulatory monthly column numbers, requiring readers to understand another report first | Defines scope, calculation, and reconciliation directly by the visible Player Report field names; no external report or number mapping is required | §3.2–§3.3, Appendix D |
Unchanged: the current registration cohort, three-day KYC deadline, Active, Suspended, Line, test-account, fake=true, and Attendance formulas.
Explanation-only change: removes the cross-report number mapping and explains calculations directly through field names, mirrored in the prototype notes.
① One-sentence requirement
Add Weekly, Monthly, and
Time Period to Player Report. Deduplicate
every people-count field by user account within each
report period, and calculate registration, KYC, and account status using
CMED-EG-1680.
② Fixed terminology
| Term |
Sole meaning |
| Week |
A complete Monday–Sunday week, not a rolling seven-day window. |
| Month |
Calendar month. |
| Partial period |
The query covers only part of a week/month. Values use only queried
days; the label still shows the complete week/month. |
| Effective statistical interval |
Intersection of the row period and query range, using a left-closed,
right-open interval. |
| Row cutoff time |
End of the effective statistical interval; status metrics use the
historical status at this time only. |
③ Global invariants
| # |
Must hold |
Common mistake |
Verification |
| G1 |
Each of the 13 count fields uses
COUNT(DISTINCT user account) independently. |
Summing daily reports and double-counting a person. |
AC1 AC2 AC3 |
| G2 |
Weeks are Monday–Sunday; months are calendar months. |
Rolling seven days or Sunday-start weeks. |
AC4 AC5 |
| G3 |
A partial period counts queried days only; Date still
shows the full week/month. |
Filling missing days or changing the label to a partial range. |
AC6 AC7 AC8 |
| G4 |
Count Suspended only when a freeze occurs in the period
and the account is still frozen at cutoff; cumulative frozen state still
excludes Active/Inactive. |
Recounting prior-period frozen inventory in current 07 or counting
one person in multiple classes. |
AC12 AC13 AC37
AC50 |
| G5 |
The current registration cohort must satisfy
Partial / Initial + Fully Verified = Registered. |
Reconciling current-period 03/04 against cumulative Total
Registered. |
AC35 AC36 AC49 |
| G6 |
Age bands use only a real-KYC birth date and the age on each login
day. An Active account without a real birth date enters Total only, so
Total may exceed the four-band sum. |
Using a fake=true default birth date for regulatory age
or forcing equality. |
AC9 AC10 AC11
AC20 AC53 |
| G7 |
The new field definitions apply to all four ReportType
values. |
Updating only weekly/monthly while daily keeps legacy
definitions. |
AC16 AC28 |
| G8 |
With GamingVenue = All, aggregate all venues and do not
split rows by venue. |
Expanding All into one row per venue. |
AC44 |
④ Scope and exclusions
Included: four ReportType values,
type-specific shortcuts, period segmentation, period-level deduplication
for 13 count fields, matching Date display, and the 16
field definitions in §3.
Definition priority: Luke confirmed this version
follows CMED-EG-1680. The original statements “keep
existing data definitions,” “do not redefine fields,” and “daily numbers
remain unchanged” are historical only and are overridden here for
Registered, Total Registered,
Partial / Initial, Active and its age bands,
Inactive, Suspended, and
Verified. All four report types, including
Daily, use these definitions.
Excluded: Quarter, Year,
Bi-weekly, Dormant, total rows, filters,
permissions, copy, partial-period badges, export limits, or a rule
forcing Active Total to equal the age-band sum. Do not change
Tax Report, PlatformReport, Agent P&L,
other reports' ReportType, the
Forfeited Players child table, or the non-real-time refresh
cadence.
1. ReportType and shortcuts
Page: ReportManagement ▸ Player Report. This document
calls the query date field DateRange.
1.1 Keep the horizontal radio layout and display all
four options in this fixed order:
Daily → Weekly → Monthly →
Time Period
Default to Daily and Today.
Time Period does not split periods; each
Nationality is aggregated into one row across the entire
query range.
1.2 Replace the complete shortcut set when
ReportType changes:
| ReportType |
Shortcuts |
Count |
Daily |
Today / Yesterday /
Last 7 Days / Last 14 Days /
Last 30 Days / Last Month /
This Month |
7 |
Weekly |
This Week / Last Week /
Last 3 Weeks / Last 6 Weeks |
4 |
Monthly |
This Month / Last Month /
Last 3 Months / Last 6 Months |
4 |
Time Period |
None |
0 |
For Time Period, remove the entire shortcut set; do not
show disabled buttons. Shortcuts only populate dates and do not alter §2.
When switching type, reset dates to that type's first shortcut. When
switching to Time Period, retain the existing dates.
Weekly/monthly shortcuts use complete calendar periods:
This selects the current complete week/month, and
Last N selects the current period plus the previous
N-1 complete periods. Future dates are allowed; missing
future data counts as 0.
1.3 Changing type, dates, shortcuts, or filters only
changes pending query criteria. Keep the last successful table until
Search is pressed. Search applies all criteria
and returns to page 1. Export always uses the last
successful query and ignores unsent changes.
1.4 Date formats:
| ReportType |
Format |
Example |
Daily |
YYYY/MM/DD |
2026/08/25 |
Weekly |
Complete-week YYYY/MM/DD ~ YYYY/MM/DD |
2026/08/17 ~ 2026/08/23 |
Monthly |
YYYY/MM |
2026/06 |
Time Period |
Query-range YYYY/MM/DD ~ YYYY/MM/DD |
2026/08/28 ~ 2026/08/28 |
A one-day Time Period query still displays both
identical endpoints.
2. Periods and partial
periods
2.1 Week: Monday 00:00:00.000 through
Sunday 23:59:59.999, inclusive. It is neither a rolling
seven-day window nor Sunday-start.
2.2 Month: Calendar day 1 00:00:00.000
through the last day 23:59:59.999; February follows the
actual year.
2.3 Partial period: when a query covers only part of
a week/month, all rules below apply:
| Item |
Rule |
| Values |
Count queried days only; never add out-of-range data. |
Date |
Still display the row's complete week or YYYY/MM. |
| UI |
Add no partial-period marker or notice. |
Example: a Weekly query for
2026/08/20 ~ 2026/08/23 displays
2026/08/17 ~ 2026/08/23 and counts four days only.
A Monthly query for 2026/06/30 ~ 2026/08/31
returns three rows, newest first:
Date |
Actual statistical interval |
2026/08 |
08/01 ~ 08/31 |
2026/07 |
07/01 ~ 07/31 |
2026/06 |
06/30 only |
3. Data definitions
3.1 Common basis
- Source:
CMED-EG-1680. The prototype search area must
show Def by CMED-EG-1680 exactly.
- Deduplication key is user account. Deduplicate independently for
each row and each count field; never use name, phone, or KYC data.
- Count players only (
usertype=0); exclude agents.
Line is an existing query filter: All includes
every userline, while a selected value includes only that
userline. The data layer must not add a hidden
userline=1 restriction. Include production and test
accounts; do not filter on istester.
- Requirement 20 node
1 (no KYC throughout) and node
2 (KYC checked only before withdrawal) are current valid
business branches, not account exclusions. System-default KYC with
fake=true means no real KYC has been submitted.
Nationality: registered accounts without submitted KYC
are Filipino; submitted KYC uses declared
Filipino or Non-Filipino. Nationality is
mandatory before KYC submission.
- Intervals are left-closed and right-open:
start_time <= event_time < the millisecond after end_time;
use the platform's existing timezone.
- Event metrics use the effective statistical interval. Status metrics
use the cutoff time. Historical reports must not replace historical
status with current query-time status.
3.2 Current 16-column field table
Development and QA identify fields only by the visible Player Report headers. The definitions, calculations, and time bases below are the sole implementation source. This requirement does not require a separate regulatory-report screenshot or a mapping from another numbering system to BO columns.
One row = Nationality × period segment.
GamingVenue is a query filter, not a row-splitting
dimension. Deduplicate every metric by user account. This page has no
total row, so every Total column below is —.
| # |
Header |
Definition |
Calculation / value |
Time basis |
Total |
Notes |
| 1 |
Nationality |
Row nationality group |
KYC not submitted = Filipino; submitted = declared
Filipino/Non-Filipino |
Row cutoff |
— |
KYC cannot be submitted without nationality |
| 2 |
Date |
Row report period |
Display day, full week, calendar month, or query range per §1.4 |
Row period |
— |
Partial periods still show full week/month labels |
| 3 |
Registered Player Counts |
New registrations in the interval |
COUNT(DISTINCT user account) where registration
completion falls in the effective interval |
Registration completion |
— |
Not KYC submission time |
| 4 |
Total Registered Players |
All accounts registered by cutoff |
COUNT(DISTINCT user account) where registration
completion is before the row cutoff |
Row cutoff |
— |
Includes accounts with no submitted KYC |
| 5 |
Partially / Initially Verified |
Current-period registrations not verified within their KYC decision
deadline |
Use only new registrations included in the row's Registered Player Counts; status remains
Not Set / Under Review / Rejected at
min(registration_time + 3 days, row cutoff);
deduplicate |
Per-account KYC decision deadline |
— |
Not Set is Filipino; later verification never rewrites
history |
| 6 |
Verified Player Counts |
Current-period registrations verified within their KYC decision
deadline |
Use only new registrations included in the row's Registered Player Counts;
review_time <= min(registration_time + 3 days, row cutoff)
with result Verified; deduplicate |
Per-account KYC decision deadline |
— |
Must add with Partially / Initially Verified to equal
Registered Player Counts; later verification never rewrites history |
| 7 |
Active Player Counts · Total |
Active accounts in the interval |
Not frozen, at least one login in the effective interval, and either
real KYC = Verified or a currently effective Requirement 20
node with fake=true |
Login event + row cutoff |
— |
Deposit or bet alone cannot make an account Active; a valid special
KYC branch is an eligible Active identity |
| 8 |
Active Player Counts · Age: 21 to 30 |
Active accounts aged 21–30 on a login day |
First meet Active, then use the real-KYC birth date on each login
day and deduplicate |
Login day |
— |
Never use a fake=true default birth date; without a
real birth date count Active Total only |
| 9 |
Active Player Counts · Age: 31 to 40 |
Active accounts aged 31–40 on a login day |
Same rule as row 8 |
Login day |
— |
Same account may enter multiple bands |
| 10 |
Active Player Counts · Age: 41 to 50 |
Active accounts aged 41–50 on a login day |
Same rule as row 8 |
Login day |
— |
Same account may enter multiple bands |
| 11 |
Active Player Counts · Age: 51 and above |
Active accounts aged 51+ on a login day |
Same rule as row 8 |
Login day |
— |
Same account may enter multiple bands |
| 12 |
Inactive Player Counts |
Accounts registered over three days without verified KYC |
KYC != Verified,
registration_time + 3 days < row cutoff, and not frozen;
deduplicate by account |
Row cutoff |
— |
Exactly three days remains inside the grace period |
| 13 |
Suspended Player Accounts |
Accounts frozen during the period and still frozen at cutoff |
At least one freeze event in the effective interval and final state
remains frozen at row cutoff; deduplicate |
Freeze event + row cutoff |
— |
Any reason; accounts frozen in a prior period with no current-period
freeze event are not recounted |
| 14 |
Forfeited Player Counts |
Accounts with a valid forfeiture in the interval |
[409] forfeiture with reason other than
Violation of TOU; deduplicate |
Forfeiture event time |
— |
Effective interval only |
| 15 |
Attendance Player Counts |
Accounts completing any successful money-movement/ledger operation
in the interval |
At least one money-movement or ledger operation reaches a
successful/completed final state in the effective interval. Types
include, but are not limited to, deposit, bet, withdrawal, bonus claim,
and other account-value changes; deduplicate |
Transaction completion time |
— |
Count actual successful events without requiring KYC or
fake; pending, processing, failed, rejected, cancelled, or
reversed states do not count |
| 16 |
Gaming Venue |
Venue scope applied to this query |
Show All and aggregate all venues for the 13 count
fields when the filter is All; show and count only the
selected venue otherwise |
Query criteria |
— |
Never expand All into separate venue columns or
rows |
3.3 KYC statuses and reconciliation
Allowed KYC values: Not Set, Under Review,
Rejected, Verified. A registered account
without submitted KYC is Not Set and grouped as
Filipino.
| CMED metric |
Definition |
Current Player Report |
Newly Registered Players |
Registration completion falls in the effective interval |
Registered Player Counts |
Total Registered Players |
All accounts registered before cutoff |
Same-named column |
Partially / Initially Verified |
Current-period registrations not verified by each account's KYC
decision deadline |
Same-named column |
Fully Verified |
Current-period registrations verified by each account's KYC decision
deadline |
Verified Player Counts |
Active Player Accounts |
See §3.2 |
Active Total and age bands |
Inactive / Deactivated Player Accounts |
See §3.2 |
Inactive Player Counts |
Suspended Player Accounts |
Accounts frozen in the period and still frozen at cutoff, regardless
of reason |
Same-named column |
For the same current-period registration cohort, filters, and KYC
decision deadlines:
Partially / Initially Verified + Fully Verified = Registered Player Counts
Total Registered Players is cumulative through row
cutoff and is not part of the current-period 03/04 split. Cross-month
reconciliation must accumulate monthly 03/04 cohorts; never add or
compare one month's 03/04 directly against cumulative 02.
3.4 Mutually exclusive account status
Evaluate each account in order and stop at the first match:
- Frozen at cutoff → exclude from Active/Inactive first. If a freeze
event occurred in the effective interval, count current-period
Suspended; otherwise classify as prior-period frozen
inventory C.
- Otherwise, if real KYC is verified, or a Requirement 20 node is
currently effective with
fake=true, count
Active when the account logged in during the effective
interval.
- Otherwise, if real KYC is unverified and registration is over three
days old, count
Inactive / Deactivated.
- Otherwise, the account enters none of the three displayed
classes.
An account cannot be Active, Inactive, current-period Suspended, and
prior-period frozen inventory C at the same time. The three displayed
classes need not sum to Total Registered. The remainder also includes
accounts under the three-day grace period and verified accounts with no
login during the interval, provided they are not frozen.
3.5 Cutoff and three-day grace period
Status metrics use row cutoff only; never rewrite history using
query-time or post-cutoff status. An account is overdue for Inactive
only when registration_time + 3 days < row cutoff;
equality remains inside the grace period. Rejected does not
make the account Inactive early.
The 03/04 in this paragraph are regulatory monthly numbers, not BO screen columns 3/4. They partition the current row's registration cohort only. Each
account's KYC decision deadline is
min(registration_time + 3 days, row cutoff): verification
completed and approved by that deadline counts in 04; every other cohort
account counts in 03. A monthly report therefore applies both the
current-month registration scope and month-end cutoff. KYC completed
after month-end never rewrites that month. If the three-day point occurs
before month-end, freeze the 03/04 classification at that three-day
point.
| August query scenario |
August result |
| Registered 7/30, KYC verified 8/1 |
Registered = 0; status is Verified at cutoff. Active depends
separately on August login and freeze status. |
| Registered 7/30, KYC still unverified at August cutoff |
Registered = 0; if not frozen, Inactive = 1 because grace period has
ended. |
| Registered 8/31, KYC still unverified at cutoff |
Registered = 1; still inside grace period, so Inactive = 0. |
KYC completion or freeze changes exactly on the cutoff boundary
belong to the next segment. Multiple changes inside one interval use the
final status at cutoff. Historical reruns must read the historical
snapshot. A partial week/month uses the partial segment's end as its
cutoff and does not wait for the full period to end.
Requirement 20 defines two current flows: node 1 never
requires KYC, and node 2 checks KYC only before withdrawal
submission. While fake=true, these players have no real
KYC: classify Nationality as Filipino and a current registration cohort
account as Partially/Initially Verified rather than Fully Verified.
Actual login and successful money-movement events may still place them
in Active Total and Attendance. After real KYC is submitted and
fake=false, use the normal declared nationality, review
state, and Active eligibility. The historical 03/04 cohort remains
frozen at its original decision deadline and is not rewritten by late
KYC.
3.6 Age bands
Use only the birth date submitted in real KYC and assign age on each
login day. A system-default birth date under fake=true is
not real identity data and must never feed a regulatory age band; such a
player may count in Active Total but enters no age band before real KYC
submission. If a member crosses an age band within a period and logs in
on both sides, the member enters both bands while Total counts the
account once; therefore Total need not equal the four-band sum.
The only transitions are 30 → 31, 40 → 41,
and 50 → 51. Daily cannot cross a band;
Weekly and Monthly can, with Monthly more
common. All three transitions use the same rule.
3.7 Data timing
Keep the report's non-real-time refresh cadence. All status fields
must reconstruct KYC and freeze state at cutoff. If the current data
model only exposes current status, development must raise this before
implementation and must not silently substitute the current
snapshot.
Minimum data sources are member registration/account attributes, KYC
history, login logs, freeze/unfreeze logs, successful
money-movement/ledger details, and forfeiture data. Monthly manual
processing may begin with the three base files—member registration,
login log, and freeze log—but 03/04, 08, and Forfeited must additionally
query their corresponding histories/details. Completeness of the three
base files alone must not be treated as completeness for every
metric.
4. Page, sorting, and export
4.1 Use the complete 16-column structure in §3.2. Counts are integers with thousands
separators; show zero as 0, never --. Keep
Filipino and Non-Filipino, grouped per §3.2.
4.2 Sort by period start, newest first. Keep
existing pagination.
4.3 Export contract:
| Item |
Rule |
| Query criteria |
Use the last successful ReportType, dates, filters, and
sort when Export is pressed. Unsent changes do not
apply. |
| Data scope |
Export the full query result regardless of pagination. Weekly
exports weekly rows; Monthly exports monthly rows, not underlying daily
rows. |
| Columns |
Same 16 columns as the list; exclude review markers and do not
expand the Forfeited Players child table. |
| File |
CSV, UTF-8 with BOM; filename
PlayerReport_yyyymmdd_hhmmss.csv. Timestamp is the moment
Export is pressed, not the query range. |
| Zero rows |
Export remains enabled; output the 16 headers and no
data rows. |
All other export behavior remains unchanged. This requirement defines
no unified row limit.
4.4 Keep GamingVenue,
Line, Platform, and the
Forfeited Players child table unchanged. Add no total row.
GamingVenue = All means no venue filter: aggregate all
venues, return one row per Nationality × period segment,
and show All in column 16; never list venues separately.
When one venue is selected, show that venue in column 16 and count only
that venue.
5. Permissions and copy
5.1 Add no permission. All four types follow
existing Player Report view permission; export follows
existing permission.
5.2 Add no new copy. Query failure, no data, and
export retain existing behavior; partial periods show no notice.
If the prototype shows an empty result, use exactly:
| Scenario |
Production English copy |
Presentation |
| No data |
No More Data |
Inline empty state |
This is the BO-wide empty-state copy. If production
Player Report differs, production wins and both PRD and
HTML must be updated together.
Appendix A: Acceptance Criteria (collapsed by default)
| # |
P |
Acceptance criterion |
| AC1 |
P0 |
One verified, unfrozen member logs in Monday and Wednesday: weekly
Active Total = 1 (G1). |
| AC2 |
P0 |
The two daily rows in AC1 each equal 1; weekly equals 1, not 2
(G1). |
| AC3 |
P0 |
One member has two forfeitures in the interval:
Forfeited = 1 (G1). |
| AC4 |
P0 |
Week starts Monday and ends Sunday; never use rolling seven days
(G2). |
| AC5 |
P0 |
Month is a calendar month; February has 28 or 29 days
(G2). |
| AC6 |
P0 |
Partial-week query 08/20 ~ 08/23 displays full week
08/17 ~ 08/23 (G3). |
| AC7 |
P0 |
AC6 counts only four days, not the full week (G3). |
| AC8 |
P0 |
Partial-month row 2026/06 counts only
06/30 while label remains 2026/06
(G3). |
| AC9 |
P0 |
A member logs in on both sides of an age transition: each band
counts 1 (G6). |
| AC10 |
P0 |
In AC9, Total=1 and band sum =2 is correct
(G6). |
| AC11 |
P0 |
Login only before transition: old age band only
(G6). |
| AC12 |
P0 |
An account with a freeze event in the effective interval and still
frozen at cutoff counts only as current-period Suspended,
regardless of reason, KYC, or login (G4). |
| AC13 |
P0 |
Verified, unfrozen, no login: enters none of
Active/Inactive/Suspended (G4). |
| AC14 |
P0 |
Weekly Attendance is distinct accounts completing any
successful money-movement/ledger operation in the effective interval;
KYC is not a prerequisite and types are not limited to bets. |
| AC15 |
P0 |
Daily Attendance deduplicates accounts completing any
successful money-movement/ledger operation that day; only the interval
changes, not the transaction-type scope. |
| AC16 |
P0 |
New Registered/Active/Inactive/Verified definitions apply to all
four types (G7). |
| AC17 |
P0 |
PlatformReport · Bet Player Counts is unchanged. |
| AC18 |
P1 |
Deduplication uses user account, never name or phone. |
| AC19 |
P1 |
Partial periods show no extra marker or copy. |
| AC20 |
P0 |
Under Daily, every Active account with a real-KYC birth
date enters exactly one age band. If an Active fake=true
account has no real birth date, Active Total may exceed the four-band
sum (G6). |
| AC21 |
P0 |
A registered account still lacking submitted KYC at its decision
deadline is Not Set and Filipino; it enters
Registered, Total Registered, and current-period Partial/Initial. |
| AC22 |
P1 |
KYC cannot be submitted without nationality; after submission, use
declared Filipino/Non-Filipino. |
| AC23 |
P1 |
Weekly and Monthly each show their correct four shortcuts. |
| AC24 |
P1 |
Time Period shows no shortcut buttons. |
| AC25 |
P1 |
A one-day Time Period still shows both endpoints. |
| AC26 |
P1 |
Forfeited Players detail is unaffected by report
type. |
| AC27 |
P1 |
Table shows the complete 16 columns defined in §3.2. |
| AC28 |
P0 |
Repeating the same criteria across all four types uses the same §3
definitions (G7). |
| AC29 |
P0 |
Unsearched changes do not alter table or export; Search applies all
conditions and resets to page 1. |
| AC30 |
P1 |
Filename matches PlayerReport_yyyymmdd_hhmmss.csv;
timestamp is export time; encoding is UTF-8 with BOM. |
| AC31 |
P0 |
Export includes all 16-column results from the last successful
query, independent of pagination. |
| AC32 |
P0 |
Time Period across weeks/months returns one row per
Nationality; all 13 counts deduplicate across the whole range. |
| AC33 |
P0 |
Zero rows: Export remains enabled and outputs only 16 headers. |
| AC34 |
P1 |
Switching type resets dates as specified; weekly/monthly
Last N includes the current full period, with future
missing data counted as 0. |
| AC35 |
P0 |
The same current registration cohort and decision deadlines satisfy
Partial / Initial + Fully Verified = Registered; never
reconcile them against cumulative Total Registered
(G5). |
| AC36 |
P0 |
At registration_time + 3 days = cutoff, not Inactive;
only later cutoffs count it. |
| AC37 |
P0 |
An overdue unverified account frozen this period and still frozen at
cutoff counts only as current Suspended, not Inactive. If frozen in a
prior period, it enters prior-period frozen inventory C and still not
Inactive. |
| AC38 |
P0 |
Historical queries use KYC/freeze state at row cutoff, not current
query-time state. |
| AC39 |
P0 |
Active requires interval login, unfrozen status, and either real KYC
Verified or a currently effective Requirement 20 node with
fake=true; deposit or bet alone cannot make Active. |
| AC40 |
P1 |
Prototype search area shows Def by CMED-EG-1680
exactly. |
| AC41 |
P0 |
Monthly query 2026/06/30 ~ 2026/08/31 returns
2026/08, 2026/07, 2026/06; June
counts only 06/30. |
| AC42 |
P0 |
For any of 30 → 31, 40 → 41,
50 → 51, logins on both sides count both bands while Active
Total remains 1. |
| AC43 |
P0 |
Each row shows Registered, Total Registered, Partially / Initially
Verified, Verified Player Counts, and Suspended Player Accounts.
Registered, Partial/Initial, and Verified satisfy G5; Total Registered
remains cumulative. |
| AC44 |
P0 |
With GamingVenue = All, each
Nationality × period segment returns one row, column 16
shows All, and all 13 count fields deduplicate across every
venue. Selecting Gaming Venue 2 still returns one row per
group, shows only that venue in column 16, and counts only that venue
(G8). |
| AC45 |
P0 |
Five distinct accounts each complete only a deposit, bet,
withdrawal, bonus claim, or another money-movement/ledger transaction in
the interval. They may include both verified and valid Requirement 20
fake=true accounts:
Attendance Player Counts = 5. |
| AC46 |
P0 |
One account completes a deposit, bet, and withdrawal in the
interval: Attendance still counts 1. |
| AC47 |
P0 |
An account has only pending, processing, failed, rejected,
cancelled, or reversed transactions in the interval: Attendance counts
0. |
| AC48 |
P0 |
A transaction created inside the interval but completed outside does
not count; it counts only when completion time is inside the
left-closed, right-open effective interval. |
| AC49 |
P0 |
Monthly 01 is 10; six accounts complete KYC by the earlier of their
three-day point and month-end, while four do not: 04=6, 03=4, and
03 + 04 = 01 = 10; 02 remains cumulative and includes prior
months. |
| AC50 |
P0 |
An account frozen last month, with no current-month freeze event and
still frozen at month-end, gives current 07=0, enters prior-period
frozen inventory C, and cannot re-enter Active/Inactive. Cross-month 07
uses a distinct username-set union. |
| AC51 |
P0 |
Query Line=All, Line=1, and
Line=2: count only usertype=0 players; a
selected Line includes only that userline, and All includes
every userline. Exclude agents and include both production
and test accounts. |
| AC52 |
P0 |
For one Requirement 20 node 1 player and one node
2 player, both with fake=true: when unfrozen
and logged in they count in Active Total; a successful money movement
counts in Attendance. Both are Filipino and neither is rejected merely
for lacking KYC. |
| AC53 |
P0 |
A fake=true system-default KYC record never counts as
Fully Verified, and its default nationality/birth date never drives
nationality or age. A current registration counts as Partially/Initially
Verified; an Active account enters Total but no age band. |
| AC54 |
P0 |
When the same node 2 player submits real KYC before
withdrawal, fake=false returns the account to normal
classification using real review state, declared nationality, and real
birth date. A frozen historical 03/04 cohort is not rewritten. |
Appendix B: Four reference examples (collapsed by default)
B.1 Age-band transition
Weekly query 2026/08/24 ~ 2026/08/30. Member A is
verified and unfrozen, turns 31 on 08/27, and logs in on
08/25 and 08/28.
| Result |
Value |
Active Total |
1 |
21 to 30 |
1 |
31 to 40 |
1 |
| Four-band sum |
2 |
Total=1 and band sum =2 is correct.
B.2 Three-day grace period
Member B completes registration at 09/01 10:00, KYC is
Under Review, and the account is not frozen. At cutoff
09/04 10:00, Inactive remains 0; it becomes 1 only after
that time.
B.3 Status priority
Member C is frozen, has Rejected KYC, was registered
over three days ago, and logged in during the interval. Count only
Suspended; both Inactive and Active are 0.
B.4 Partial period
For a Weekly query 2026/08/20 ~ 2026/08/23,
Date displays 2026/08/17 ~ 2026/08/23; values
use the four queried days only.
Appendix C: Prototype visual inventory (collapsed by default)
| Visual ID |
Surface |
Purpose |
Evidence |
VIS-BO-NONE |
BO |
No content image or image placeholder on the BO page. |
BO prototype |
VIS-CLIENT-NONE |
Client |
No client page for this requirement. |
L0 ④ |
Report tables, loading skeletons, and annotation symbols are not
visual-asset slots.
Appendix D: PAGCOR Monthly Report Field Validation SOP (collapsed by default)
Attachment: PAGCOR OGP
monthly-report workbook
How to read this appendix: field names control. Numbers in the source workbook are only its original column order, not implementation conditions. Development and QA do not need a BO mapping; validate the same-named fields directly against §3.2.
D.1 Scope and severity
- Applies to columns 01–08 of the
Player Monthly Operational Summary. Count
usertype=0 players only; the Line scope must match the
submitted query (All or one selected Line). Do not exclude
test accounts.
- Hard check: missing data, broken equations, mismatched Line/player
scope, treating a Requirement 20
fake=true default record
as real KYC, or non-reconcilable records blocks delivery until fixed or
explicitly approved by a named business owner. Valid pre-KYC money
movement is not inherently anomalous.
- Advisory check: historical ratios, daily low points, and
month-over-month changes trigger manual review only. Threshold deviation
alone does not block delivery, but its cause and evidence must be
recorded.
- Monthly order is fixed:
L0 source completeness → L1 per-field checks → L2 cross-field checks → L3 source reconciliation → six-bucket reconciliation.
D.2 L0 — Source completeness
| # |
Check |
Pass condition |
Severity |
| L0-1 |
Login-log time range |
MIN(time) <= month start and
MAX(time) >= month end; inspect data, never trust the
filename |
Hard |
| L0-2 |
Daily login volume |
No missing day; review any day below 30% of the monthly median |
Missing day: hard; 30%: advisory |
| L0-3 |
Registration-to-login hit rate |
Reconcile current-month registrations to login logs; review below
99%, prioritize suspected gaps below 95% |
Advisory; submitted KYC without any
login is a hard anomaly |
| L0-4 |
Freeze-log structure |
Column counts and CSV quoting/escaping are valid, with zero parse
anomalies |
Hard |
| L0-5 |
Metric details available |
KYC history, successful money-movement/ledger details, and
forfeiture data are queryable by account and time |
Hard |
The three base files are member registration, login log, and freeze
log. Their completeness alone does not prove every metric source is
complete. 03/04 require KYC history, 08 requires successful
money-movement/ledger details, and Forfeited requires forfeiture
data.
D.3 L1 — Per-field checks
| Column |
Field |
Validation rule |
| 01 |
Newly Registered |
registertime falls in the month; scope is
usertype=0, isdeleted=0 under the submitted Line filter,
with no istester=0. Line=All must not silently
become userline=1. Reconcile row by row and reject
duplicate usernames. Daily volume below 10% of the previous seven-day
median is advisory only. |
| 02 |
Total Registered |
Algorithm A: prior-month 02 + current-month 01. Algorithm B:
cumulative completed registrations through month-end. A must equal B;
investigate soft deletion or historical backfill and never silently
overwrite A with B. |
| 03/04 |
Partially / Fully Verified |
Current-month 01 cohort only. Per account, use
min(registertime + 3 days, month-end) as the decision
deadline. Real KYC approved by the deadline counts in 04; every other
account counts in 03. A Requirement 20 fake=true default
record is always no real KYC and never counts in 04. Require
03 + 04 = 01 and stable historical reruns. |
| 05 |
Active Player |
Logged in during month ∩ not frozen at month-end ∩ (real KYC
Verified, or a currently effective Requirement 20 node with
fake=true); distinct accounts. Do not check
05 <= KYC completed; check 05 >= 08 and
month movement. More than 50% is advisory. Without a real birth date,
count Active Total only and never use the default birth date for age
bands. |
| 06 |
Inactive / Deleted |
Not in 05 ∩ registered for more than three days ∩ real KYC
unverified at month-end ∩ not frozen. Use cumulative final frozen state,
not only current freezes. A Requirement 20 fake=true player
who logged in already enters 05 and must not also enter 06. |
| 07 |
Suspended Player |
At least one freeze event this month ∩ final state still frozen at
month-end; distinct accounts. A same-month unfreeze then refreeze still
counts 1. Never calculate as freeze rows minus unfreeze rows.
Prior-month frozen inventory with no current-month freeze event goes to
bucket C, not current 07. |
| 08 |
Attendance Player |
Distinct accounts with any money-movement/ledger operation reaching
a successful/completed final state in the month, including deposit, bet,
withdrawal, bonus claim, and other account-value changes. Assign by
completion time. KYC and fake are not count prerequisites;
valid Requirement 20 pre-KYC money movement counts normally. Exclude
non-success states. Check 08 <= 05,
08 <= distinct monthly logins, and
08 <= 02. An 08/05 ratio outside 0.2–0.7 is
advisory. |
03/04 never use the current KYC snapshot. If real KYC is approved
only after the per-account deadline, the historical cohort remains in 03
and must not be rewritten to 04. Requirement 20 fake=true
is not real KYC: node 1 requires none and node
2 checks only before withdrawal, so successful pre-KYC
money movement must count in 08 rather than being discarded as
anomalous.
D.4 L2 — Cross-field checks
| # |
Check |
Decision |
| 1 |
02(M) = 02(M−1) + 01(M) |
Hard; explain soft deletion or historical backfill row by row and
record any adjustment |
| 2 |
03(M) + 04(M) = 01(M) |
Hard; all three use the same monthly registration cohort |
| 3 |
Σ03 + Σ04 = 02(period end) |
Hard; accumulate continuous monthly cohorts and carry opening
inventory separately |
| 4 |
05 = (verified + logged in + unfrozen) ∪ (effective Requirement 20 node + fake=true + logged in + unfrozen) |
Hard; union distinct usernames |
| 5 |
06 <= cumulative KYC incomplete at cutoff |
Hard |
| 6 |
05 + 06 + 07 <= 02 |
Hard; separately reconcile prior-period frozen inventory, grace, and
dormant accounts through six buckets |
| 7 |
COUNT(DISTINCT UNION(monthly 07 usernames)) <= 02(period end) |
Hard; arithmetic summation of monthly 07 is prohibited because an
account may recur across months |
| 8 |
08 <= 05 |
Hard; inspect Line/player scope, login, freeze timing, and
Requirement 20 node evaluation; never discard pre-KYC transactions
directly |
The six-bucket reconciliation uses mutually exclusive account sets
and must have zero difference:
02 registered at period end = 05 active
+ 06 inactive
+ 07 frozen this month and still frozen at month-end
+ A dormant (verified, no monthly login, not frozen)
+ B grace (unverified, registered under three days, not frozen)
+ C prior-period frozen inventory (no current freeze event, still frozen)
D.5 L3 — Source
reconciliation and delivery
| # |
Reconciliation |
Pass condition |
| 1 |
Freeze/unfreeze logs to member file |
100% traceable; each account's split between 07 and C is
reproducible |
| 2 |
08 accounts to money movement, Requirement 20 node, and login |
Every account has an in-period successful final state and matching
login. An account without real KYC must have its then-effective
Requirement 20 node reproducible; never discard it solely for missing
KYC. |
| 3 |
Login accounts to member file |
Intersection matches the submitted Line filter and
usertype=0 player scope |
| 4 |
Nationality classification |
nation_type and kyc_info.nationality map
consistently; list discrepancies individually |
| 5 |
Historical 03/04 rerun |
Recalculation from KYC history and per-account deadlines exactly
matches the issued month |
Final execution order: run L0, then L1 in 01 → 02 → 03/04 → 05 → 06 →
07 → 08 order, followed by L2, L3, and six-bucket reconciliation.
Deliver only after all hard checks pass and every advisory warning has
an explanation. Attach all known monthly differences, owners, and
resolution status.
Document version: v1.16 | Date: 2026-09-17 | Author: Luke | Status:
Pending Development Review
Translation: EN-1.5 | Source: PRD v1.16 | Date: 2026-09-17