/* ZY console — 财务 COO：利润明细 / 提成核发 / 人工调整 / 月度数据。双口径不可混算。 */
const DSFIN = window.ZYDesignSystem_d746df;

function KitFinance({ onNav, onAct }) {
  const { Card, SectionHead, Pill, Icon, Button } = DSFIN;
  const K = window.KIT, S = window.KitStrip;
  const D = K.financeDigest, A = D.areas;
  const ps = A.platform_settlement, cf = A.cash_flow, pc = A.profit_caliber_supervision, ap = A.approvals_pending, hl = A.hermes_learning;

  // 契约 v1.2 §1/§6：财务只监督 —— UI 不付款、不动钱、不发布利润。
  // 唯一可发起的写 = 审批证据受控动作；其余「按钮」皆为只读「前往证据」跳转 / 本地「知悉」暂挂。
  const [alertState, setAlertState] = React.useState({}); // { [category]: "知悉" }
  const [evidenceDone, setEvidenceDone] = React.useState(false);
  const go = (tab) => onNav && tab && onNav(tab);
  const ack = (cat) => setAlertState(s => ({ ...s, [cat]: "知悉" }));
  const unack = (cat) => setAlertState(s => { const n = { ...s }; delete n[cat]; return n; });
  const remainEsc = ap.alerts.filter(a => a.escalate_to_boss && !alertState[a.category]).length;
  const todayISO = (D.generated_at || "").slice(0, 10) || "2026-06-29"; // 付款排期逾期 = 待付 且 date < 今日（服务端不单独出逾期枚举，UI 自算）
  const cfOverdue = A.cash_flow.paySchedule.filter(r => r.status === "待付" && r.date < todayISO).length;
  // 告警 / 学习候选 → 证据所在工作台（只读跳转，不在财务面写）
  const NAV = {
    employee_cost_coverage_gap: { tab: "proc.cost", ev: "成本管理 · 补成本" },
    large_pending_settlement: { tab: "platcoo.tiktok", ev: "TikTok · 运营 COO" },
    cost_anomaly_boss_exceeds_employee: { tab: "proc.cost", ev: "成本管理 · 复核成本" },
    blocked_missing_finance_source: { tab: "fin.monthly", ev: "月度数据" },
    high_refund_ratio: { tab: "fin.monthly", ev: "月度数据" },
    refund_without_receivable: { tab: "fin.monthly", ev: "月度数据" },
    duplicate_input_row: { tab: "fin.monthly", ev: "月度数据" },
  };
  const LEARN_NAV = {
    missing_cost_coverage_pattern: { tab: "proc.cost", ev: "成本管理 · 补成本" },
    approval_evidence_delay_pattern: { tab: "fin.monthly", ev: "月度数据 · 证据包" },
    formula_or_allocation_bottleneck_pattern: { tab: "fin.monthly", ev: "月度数据" },
    blocked_month_repeat_pattern: { tab: "fin.monthly", ev: "月度数据" },
  };
  // 审批证据受控动作（finance_approval_evidence_append）—— 契约 §6：finance 在 UI 上唯一可发起的写。
  // dry-run → 老板批准 + decision_ref → 单次写 → 回执 → 回滚；永不付款、永不发布利润。
  const submitEvidence = () => onAct && onAct({
    title: "提交审批证据包 · 受控",
    subject: "finance_approval_evidence_append · 审批证据补录",
    source: "finance_approval_evidence_append",
    phrase: "确认提交",
    submitLabel: "老板批准并提交证据包",
    preview: [
      { k: "受控动作", v: "finance_approval_evidence_append" },
      { k: "写入边界", v: "仅追加待审批证据 · 单次写" },
      { k: "是否付款", v: "否 · finance 永不动钱" },
      { k: "是否发布利润", v: "否 · 利润仍不对外发布" },
      { k: "证据状态", from: "待补录", to: "待老板拍板" },
    ],
    wont: ["不付款 / 不动钱", "不发布利润数字", "不写 JST 业务库"],
    forbidden: ["POST /finance/payout", "publish_profit"],
    rollbackNote: "证据包提交后留痕，老板拍板前可撤回（老板审批引用作废）",
    onSubmit: () => setEvidenceDone(true),
  });

  const PLAT = { shopify: "Shopify", tiktok_shop: "TikTok Shop", "1688": "1688", shopee: "Shopee", ozon: "Ozon", aliexpress: "速卖通", jd: "京东", shein: "SHEIN" };
  // v1.2 徽标规则：只有 shopify_payments_payouts = 银行实到（绿），其余皆非银行实到（黄）。
  const BASIS = { shopify_payments_payouts: { t: "实到", tone: "ok" }, order_status_escrow_proxy: { t: "推导·非银行实到", tone: "amber" }, tiktok_settlement_statement: { t: "已结算·未打款", tone: "amber" } };
  const CAT = {
    large_pending_settlement: "待收超阈", blocked_missing_finance_source: "应收缺·阻塞", data_anomaly: "负值异常",
    high_refund_ratio: "退款率高", refund_without_receivable: "退款无应收", duplicate_input_row: "重复行",
    employee_cost_coverage_gap: "员工口径成本缺口", cost_anomaly_boss_exceeds_employee: "采购价>含运价",
    missing_source: "数据源缺失", missing_approved_formula: "公式未批", boss_purchase_price_gap: "采购价缺·已兜底",
  };
  const SEVT = { P0: "var(--negative)", P1: "var(--negative)", P2: "var(--warning)" };
  const SOURCE_STATUS = { available: { t: "通过", tone: "ok" }, blocked: { t: "阻塞", tone: "bad" }, missing_source: { t: "数据源缺失", tone: "bad" } };
  // 多币种安全格式化（CNY/USD/MYR），复用共享 fmtMoney，不再本地重造 —— 避免 MYR 落入 CNY ¥ 符号误标币种。
  const fmt = (v, cur) => window.fmtMoney(v, cur);
  const CAL = [["receivable", "应收"], ["settled", "到账"], ["pending_settlement", "待收"], ["refund", "退款"]];
  const tpl = "1.3fr 1fr 1.25fr 1fr 1fr 0.6fr";
  // 现金流 / 对账卡：应付账龄按 现结→月结→未设 排序；付款排期逾期 = 待付 且 date < 今日（服务端不单独出逾期枚举，UI 自算）。
  const SETTLE_ORDER = { "现结": 0, "月结": 1, "未设": 2 };
  const PAY_STATUS_TONE = { "待付": "warn", "排期中": "neutral", "已付": "good" };
  const AR_STATUS_TONE = { "在途": "warn", "已回款": "good", "—": "neutral" };
  const cfTpl = "1.1fr 1fr 1fr 0.9fr 0.9fr";

  return (
    <div className="view viewfade">
      <S icon="Wallet" title="财务监督 · 仪表盘" mode="只读监督 · 不动钱" judge="财务 COO 只读监督 · 不付款 / 不发布利润 · 四口径统一 · 缺失=未知不是 0" src="财务 COO 日报（只读监督）" />

      <div className="finhead"><Icon name="Sparkles" size={15} /><span>{D.headline}</span></div>

      {/* ① 多平台财务汇总 */}
      <Card>
        <SectionHead title="多平台财务汇总" icon="Wallet" sub="应收 / 到账 / 待收 / 退款 · 四口径统一"
          right={<span className="fincov"><Icon name="Plug" size={12} />已接 <b>{ps.coverage.connected.length}</b> · 待接 <b>{ps.coverage.pending.length}</b></span>} />
        {ps.mixed_currency && <div className="finmix"><Icon name="Info" size={13} /><span>多币种（{ps.currencies.join(" / ")}）· 不合并单一总计,按币种分列。{ps.settle_basis_mixed ? "到账含推导口径,非全部银行实到。" : ""}</span></div>}
        <div className="fincur">
          {ps.currencies.map(cur => (
            <div className="fincur__row" key={cur}>
              <span className="fincur__c">{cur}</span>
              {CAL.map(([k, lab]) => (
                <div className="fincur__cell" key={k}>
                  <span className="fincur__l">{lab}</span>
                  <span className="fincur__v num">{fmt(ps.subtotals_by_currency[cur][k], cur)}</span>
                </div>
              ))}
            </div>
          ))}
        </div>
        <div className="dtscroll" style={{ marginTop: 13 }}><div className="dt" style={{ minWidth: 760 }}>
          <div className="dt__head" style={{ gridTemplateColumns: tpl }}><span>平台</span><span>应收</span><span>到账</span><span>待收</span><span>退款</span><span>店铺</span></div>
          {ps.by_platform.map((p, i) => {
            const exc = ps.exception_rows.find(e => e.platform === p.platform);
            const basis = p.settle_basis ? BASIS[p.settle_basis] : null;
            return (
              <div className="dt__row" style={{ gridTemplateColumns: tpl }} key={i}>
                <span className="dt__name"><b>{PLAT[p.platform] || p.platform}</b><span className="dt__sub">{p.currency}{exc ? <span className="finexc" style={{ color: SEVT[exc.severity] }}> · {CAT[exc.category] || exc.category} {exc.severity}</span> : null}</span></span>
                <span className="num">{fmt(p.receivable, p.currency)}</span>
                <span className="num">{fmt(p.settled, p.currency)}{basis ? <span className={"finbasis finbasis--" + basis.tone}>{basis.t}</span> : null}</span>
                <span className="num">{fmt(p.pending_settlement, p.currency)}</span>
                <span className="num">{fmt(p.refund, p.currency)}</span>
                <span className="num">{p.shop_count}</span>
              </div>
            );
          })}
          {ps.coverage.pending.map(pl => (
            <div className="dt__row finrow--pending" style={{ gridTemplateColumns: tpl }} key={pl}>
              <span className="dt__name"><b>{PLAT[pl] || pl}</b></span>
              <span className="finpend" style={{ gridColumn: "2 / -1" }}><Icon name="PlugZap" size={12} />待接入 · 该平台 COO 未上线（不计 0）</span>
            </div>
          ))}
        </div></div>
      </Card>

      {/* ② 现金流 / 对账 — 应付账龄 · 付款排期 · 应收(平台回款) · 现金流向；100% 只读，无受控写按钮 */}
      <Card>
        <SectionHead title="现金流 / 对账" icon="ArrowLeftRight" sub="应付账龄 · 付款排期 · 应收(平台回款) · 现金流向"
          right={cfOverdue > 0 ? <Pill tone="danger" soft>{cfOverdue} 笔逾期付款</Pill> : <Pill tone="good" soft>无逾期</Pill>} />
        {cf.mixed_currency && <div className="finmix"><Icon name="Info" size={13} /><span>{(cf.notes && cf.notes[0]) || `平台回款多币种（${cf.currencies.join(" / ")}）· 不合并单一总计,按平台/币种分列。`}</span></div>}

        <div className="fincov2" style={{ marginBottom: 13 }}>
          {cf.apBuckets.slice().sort((a, b) => (SETTLE_ORDER[a.settle] ?? 9) - (SETTLE_ORDER[b.settle] ?? 9)).map(b => (
            <div className="fincovrow" key={b.settle}>
              <span className="fincovrow__l">应付账龄 · {b.settle}<span className="dt__sub" style={{ marginLeft: 8, fontWeight: 400 }}>{b.note}</span></span>
              <span className="fincovrow__b"><span className="num">{fmt(b.amount, "CNY")}</span><span style={{ marginLeft: 6, color: "var(--fg-3)" }}>· {b.count} 笔</span></span>
            </div>
          ))}
        </div>

        <SectionHead title="付款排期" icon="CalendarClock" sub="按到期日升序 · 逾期(待付且已过到期日)标红" />
        <div className="dtscroll"><div className="dt" style={{ minWidth: 640 }}>
          <div className="dt__head" style={{ gridTemplateColumns: cfTpl }}><span>到期日</span><span>供应商</span><span>金额</span><span>结算方式</span><span>状态</span></div>
          {cf.paySchedule.map((r, i) => {
            const isOverdue = r.status === "待付" && r.date < todayISO;
            return (
              <div className={"dt__row" + (isOverdue ? " finrow--overdue" : "")} style={{ gridTemplateColumns: cfTpl }} key={i}>
                <span className="dt__id num" style={isOverdue ? { color: "var(--negative)" } : undefined}>{r.date}</span>
                <span className="dt__item">{r.supplier}</span>
                <span className="num">{fmt(r.amount, "CNY")}</span>
                <span className="dt__sub2">{r.settle}</span>
                <span><Pill tone={isOverdue ? "danger" : (PAY_STATUS_TONE[r.status] || "neutral")} soft>{isOverdue ? "逾期·待付" : r.status}</Pill></span>
              </div>
            );
          })}
          {cf.paySchedule.length === 0 && <div className="emptyrow"><Icon name="Inbox" size={14} />暂无排期</div>}
        </div></div>
        {cf.unset_defaulted_count > 0 && <div className="dt__sub2" style={{ marginTop: 8 }}>历史「未设」结算方式已默认按现结处理 · {cf.unset_defaulted_count} 笔（7/1 后不再出现）</div>}

        <SectionHead title="应收 · 平台回款" icon="Landmark" sub="金额=待收(在途)，非已到账 · 各币种独立陈列，不折算合一" />
        <div className="dtscroll"><div className="dt" style={{ minWidth: 620, marginBottom: 13 }}>
          <div className="dt__head" style={{ gridTemplateColumns: "1.1fr 1fr 0.8fr 0.7fr 0.9fr" }}><span>平台</span><span>金额</span><span>账期</span><span>到账时间</span><span>状态</span></div>
          {cf.arList.map((r, i) => (
            <div className="dt__row" style={{ gridTemplateColumns: "1.1fr 1fr 0.8fr 0.7fr 0.9fr" }} key={i}>
              <span className="dt__name"><b>{PLAT[r.platform] || r.platform}</b></span>
              <span className="num">{fmt(r.amount, r.currency)}</span>
              <span className="dt__sub2">{r.period}</span>
              <span className="dt__sub2">{r.eta}</span>
              <span><Pill tone={AR_STATUS_TONE[r.status] || "neutral"} soft>{r.status}</Pill></span>
            </div>
          ))}
        </div></div>

        <div className="fincov2" style={{ marginBottom: 13 }}>
          <div className="fincovrow">
            <span className="fincovrow__l">应付（CNY 基准）</span>
            <span className="fincovrow__b num">{fmt(cf.payable, "CNY")}</span>
          </div>
          <div className="fincovrow">
            <span className="fincovrow__l">在途回款（仅 CNY 基准，非总应收）</span>
            <span className="fincovrow__b num">{fmt(cf.receivable, "CNY")}</span>
          </div>
        </div>

        <div className="finnote">
          {cf.breakdown.filter(b => b.value).map((b, i) => (
            <div className="finnote__i" key={i}>
              <Icon name={b.dir === "in" ? "ArrowDownToLine" : "ArrowUpFromLine"} size={13} style={{ color: b.dir === "in" ? "var(--positive)" : "var(--negative)" }} />
              {b.label}：<b className="num">{fmt(b.value, "CNY")}</b>
            </div>
          ))}
          <div className="finnote__i"><Icon name="TrendingUp" size={13} />本月净流（CNY 基准，到账 - 付款）：<b className="num">{fmt(cf.netFlow, "CNY")}</b></div>
          <div className="finnote__i"><Icon name="Info" size={13} />现金余额（银行真实余额）：<b>{fmt(cf.cash, "CNY")}</b><span className="dt__sub2" style={{ marginLeft: 6 }}>无银行真实余额 · 不臆造</span></div>
        </div>
      </Card>

      <div className="fingrid">
        {/* ③ 双轨利润口径监督 — 不出现利润金额 */}
        <Card>
          <SectionHead title="双轨利润口径监督" icon="GitBranch" sub="只讲口径 / 覆盖 / 证据 · 不发布利润金额"
            right={<Pill tone="neutral" soft>不发布利润数字</Pill>} />
          <div className={"fingate fingate--" + (pc.source_status === "available" ? "ok" : "bad")}>
            <span className="fingate__light" />
            <div className="fingate__b">
              <div className="fingate__t">证据门控 · {(SOURCE_STATUS[pc.source_status] || { t: pc.source_status }).t}</div>
              <div className="fingate__s">{pc.approved_formula ? "审批公式已批" : "审批公式未批"} · {pc.missing_fields.length > 0 ? "缺字段:" + pc.missing_fields.join(" / ") : "字段齐全"}</div>
            </div>
          </div>
          {pc.cost_coverage.source_unavailable ? (
            /* 双轨覆盖(dual_caliber)读模型未上线 → 诚实空态,不用假覆盖率/「缺 0」补位（同 Shopify 审计卡先例） */
            <div className="finnote">
              <div className="finnote__i"><Icon name="PlugZap" size={13} />双轨成本覆盖数据源待接（覆盖率读模型未上线）· 按系统规则显示空态,不用演示数据补位</div>
            </div>
          ) : (
            <React.Fragment>
              <div className="fincov2">
                {["employee", "boss"].map(role => {
                  const c = pc.cost_coverage.dual_caliber[role];
                  return (
                    <div className="fincovrow" key={role}>
                      <span className="fincovrow__l">{c.caliber}</span>
                      <span className={"fincovrow__b" + (c.covered ? " is-ok" : " is-gap")}>{c.covered ? <React.Fragment><Icon name="Check" size={12} />已覆盖</React.Fragment> : <React.Fragment><Icon name="TriangleAlert" size={12} />缺 {c.missing_count}</React.Fragment>}</span>
                    </div>
                  );
                })}
                <div className="fincovrow__ratio">成本覆盖率 <b className="num">{Math.round(pc.cost_coverage.coverage_ratio * 100)}%</b>{pc.cost_coverage.complete ? "" : " · 未完全"}</div>
              </div>
              {(pc.cost_coverage.cost_anomaly_count > 0 || pc.cost_coverage.purchase_price_fallback_active) && (
                <div className="finnote">
                  {pc.cost_coverage.cost_anomaly_count > 0 && <div className="finnote__i"><Icon name="TriangleAlert" size={13} />采购价 &gt; 含运价 的 SKU:<b>{pc.cost_coverage.cost_anomaly_count}</b></div>}
                  {pc.cost_coverage.purchase_price_fallback_active && <div className="finnote__i"><Icon name="Info" size={13} />采购价缺 → 老板利润暂兜底员工利润</div>}
                </div>
              )}
            </React.Fragment>
          )}
          <div className="finact">
            <span className="finact__l"><Icon name="ShieldCheck" size={13} /><span>财务在 UI 上<b>唯一可发起的写</b> · 提交待审批证据包 · 需老板拍板 · 不付款 / 不发布利润</span></span>
            {evidenceDone
              ? <span className="finact__done"><Icon name="CircleCheck" size={14} />已提交 · 待老板拍板<button className="finlink finlink--muted" onClick={() => setEvidenceDone(false)}>撤回</button></span>
              : <Button variant="solid" size="sm" icon="FilePlus2" onClick={submitEvidence}>补录审批证据 · 受控</Button>}
          </div>
        </Card>

        {/* ④ 待你拍板 / 异常升级 */}
        <Card>
          <SectionHead title="待你拍板 / 异常升级" icon="Inbox" sub="两条告警线合并 · 升级项置顶 · 只读监督，可前往证据 / 知悉暂挂"
            right={<Pill tone={remainEsc > 0 ? "warn" : "good"} soft>{remainEsc > 0 ? remainEsc + " 升级待拍板" : "升级已清"}</Pill>} />
          <div className="finalerts">
            {ap.alerts.slice().sort((a, b) => (b.escalate_to_boss - a.escalate_to_boss)).map((al) => {
              const nav = NAV[al.category];
              const done = alertState[al.category];
              return (
                <div className={"finalert finalert--" + (al.severity === "P2" ? "p2" : "p1") + (done ? " is-done" : "")} key={al.category}>
                  <span className="finalert__sev" style={{ background: done ? "var(--fg-4)" : SEVT[al.severity] }}>{al.severity}</span>
                  <div className="finalert__b">
                    <div className="finalert__t">{al.category_label}{al.escalate_to_boss && !done ? <span className="finalert__esc"><Icon name="ArrowUp" size={11} />升级老板</span> : null}</div>
                    <div className="finalert__d">{al.suggested_action}</div>
                    {done ? (
                      <div className="finalert__resolved"><Icon name="CircleCheck" size={13} />已知悉 · 暂挂<button className="finlink finlink--muted" onClick={() => unack(al.category)}>撤销</button></div>
                    ) : (
                      <div className="finalert__act">
                        {nav && <button className="finlink" onClick={() => go(nav.tab)}><Icon name="MapPin" size={12} />前往 {nav.ev}<Icon name="ArrowRight" size={12} stroke={2} /></button>}
                        <button className="finlink finlink--muted" onClick={() => ack(al.category)}><Icon name="Check" size={12} />知悉</button>
                      </div>
                    )}
                  </div>
                </div>
              );
            })}
          </div>
        </Card>
      </div>

      {/* ⑤ Hermes 学习候选 — advisory */}
      <Card>
        <SectionHead title="Hermes 学习候选" icon="Sparkles" sub="advisory · 需人工 review 才进记忆 · UI 不可触发写"
          right={<Pill tone="neutral" soft>{hl.candidate_count} 候选</Pill>} />
        <div className="finlearn">
          {hl.rows.map((r, i) => {
            const nav = LEARN_NAV[r.candidate_type];
            return (
              <div className="finlearn__row" key={i}>
                <span className="finlearn__sev" style={{ color: SEVT[r.severity] }}>{r.severity}</span>
                <div className="finlearn__b">
                  <div className="finlearn__t">{r.title}<span className="finlearn__mt">{r.memory_type}</span></div>
                  <div className="finlearn__s">{r.summary}</div>
                  <div className="finlearn__u"><Icon name="ArrowRight" size={12} />{r.suggested_coo_behavior_update}</div>
                  <div className="finlearn__act">
                    {nav && <button className="finlink" onClick={() => go(nav.tab)}><Icon name="MapPin" size={12} />前往 {nav.ev}<Icon name="ArrowRight" size={12} stroke={2} /></button>}
                    <span className="finlearn__adv"><Icon name="Info" size={11} />advisory · UI 不写记忆</span>
                  </div>
                </div>
              </div>
            );
          })}
        </div>
      </Card>
    </div>
  );
}

function KitCommission({ onAct }) {
  const { Card, SectionHead, Pill, Button, Icon } = DSFIN;
  const K = window.KIT, S = window.KitStrip, Kp = window.KitKpi;
  const STt = null;
  const [st, setSt] = React.useState(() => {
    const m = {}; K.orders.forEach(o => { m[o.id] = o.margin < 0 ? "需复核" : "待审核"; }); return m;
  });
  const FILTERS = ["全部", "待审核", "需复核", "已核发"];
  const [sf, setSf] = React.useState("全部");
  // 只对真实业务员做逐单提成核发；COO / 渠道单不进此审核口径
  const isHuman = (r) => !/COO|渠道/.test(r);
  const humanOrders = K.orders.filter(o => isHuman(o.rep));
  const reps = ["全部", ...Array.from(new Set(humanOrders.map(o => o.rep)))];
  const [rf, setRf] = React.useState("全部");
  const stores = ["全部", ...Array.from(new Set(humanOrders.map(o => o.store)))];
  const [stf, setStf] = React.useState("全部");
  const allReps = reps.filter(r => r !== "全部");
  const HUE = ["#B07B4F", "#6E8B82", "#5B8C7E", "#7E84A6", "#A98A5C", "#8A7A6B"];
  const hueOf = (r) => HUE[Math.max(0, allReps.indexOf(r)) % HUE.length];

  // 月份：本月（实时逐单）+ 历史归档月
  const curMonth = (K.months && K.months[0] && K.months[0].key) || "2026-06";
  const hist = K.commissionHistory || {};
  const months = [{ key: curMonth, label: curMonth + "（本月）" }, ...Object.keys(hist).map(k => ({ key: k, label: k }))];
  const [month, setMonth] = React.useState(curMonth);
  const isCurrent = month === curMonth;

  const PER = 6;
  const [page, setPage] = React.useState(1);
  const TONE = { "待审核": "warn", "需复核": "danger", "已核发": "good", "已拒绝": "neutral" };
  const tpl = "0.85fr 1.15fr 1fr 1fr 0.8fr 0.85fr 0.85fr 0.85fr 0.8fr 1.4fr 0.85fr 0.95fr";
  const htpl = "1.5fr 0.9fr 0.9fr 0.9fr 0.8fr 1.1fr";

  // 本月 · 按业务员归口的汇总与列表（仅真实业务员）
  const repScope = humanOrders.filter(o => (rf === "全部" || o.rep === rf) && (stf === "全部" || o.store === stf));
  const pendingN = repScope.filter(o => st[o.id] === "待审核" || st[o.id] === "需复核").length;
  const pendingSum = repScope.filter(o => st[o.id] === "待审核" || st[o.id] === "需复核").reduce((s, o) => s + o.commission, 0);
  const negN = repScope.filter(o => o.margin < 0).length;
  const filtered = repScope.filter(o => sf === "全部" || st[o.id] === sf);
  const totalPages = Math.max(1, Math.ceil(filtered.length / PER));
  const curPage = Math.min(page, totalPages);
  const list = filtered.slice((curPage - 1) * PER, curPage * PER);
  const rangeFrom = filtered.length === 0 ? 0 : (curPage - 1) * PER + 1;
  const rangeTo = Math.min(curPage * PER, filtered.length);

  // 历史月 · 按业务员归档快照（仅真实业务员）
  const histRows = (hist[month] || []).filter(r => isHuman(r.rep)).filter(r => rf === "全部" || r.rep === rf);
  const histPaidSum = histRows.reduce((s, r) => s + r.commission, 0);
  const histOrders = histRows.reduce((s, r) => s + r.orders, 0);
  const histNeg = histRows.reduce((s, r) => s + r.neg, 0);

  // 按业务员汇总（仅真实员工，COO 不算业务员；随月份切换：本月实时 / 历史归档）
  const repSummary = (() => {
    const humans = reps.filter(r => r !== "全部");
    if (isCurrent) {
      return humans.map(r => {
        const os = humanOrders.filter(o => o.rep === r);
        const pend = os.filter(o => st[o.id] === "待审核" || st[o.id] === "需复核");
        return { rep: r, orders: os.length, pending: pend.length, paid: os.filter(o => st[o.id] === "已核发").length, neg: os.filter(o => o.margin < 0).length, comm: pend.reduce((s, o) => s + o.commission, 0) };
      });
    }
    return (hist[month] || []).filter(r => !/COO|渠道/.test(r.rep)).map(r => ({ rep: r.rep, orders: r.orders, pending: r.pending, paid: r.paid, neg: r.neg, comm: r.commission }));
  })();
  const commLabel = isCurrent ? "待发提成" : "提成合计";
  const gtpl = "1.5fr 0.8fr 0.8fr 0.8fr 0.8fr 1fr";
  const payout = (o) => onAct({
    title: "核发该单提成", subject: o.id + " · " + o.rep + " · " + o.ino, phrase: "确认核发", submitLabel: "确认核发本单提成", source: "employee_commissions",
    preflight: "只验算本单提成金额与毛利率，不发放、不写财务事实。可在本预检内修正提成 / 运费 / 成本口径，系统即时重算毛利。",
    editFields: [
      { key: "commission", label: "提成", value: o.commission },
      { key: "platFee", label: "平台支出", value: o.platFee },
      { key: "freightOut", label: "运费支出", value: o.freightOut },
      { key: "freightIn", label: "运费收入", value: o.freightIn },
      { key: "cost", label: "成本", value: o.cost },
    ],
    derive: (e) => {
      const n = (x) => Number(x) || 0;
      const profit = o.amount + n(e.freightIn) - n(e.freightOut) - n(e.platFee) - n(e.cost) - n(e.commission);
      const margin = o.amount ? Math.round((profit / o.amount) * 1000) / 10 : 0;
      return [
        { k: "销售金额", v: window.yuan(o.amount) },
        { k: "重算毛利（老板口径）", v: window.yuan(profit), tone: profit < 0 ? "ovstat--danger" : "ovstat--good" },
        { k: "重算毛利率", v: margin + "%", tone: margin < 0 ? "ovstat--danger" : margin < 20 ? "ovstat--warn" : "ovstat--good" },
      ];
    },
    preview: [
      { k: "订单", v: o.ino },
      { k: "审核状态", from: st[o.id], to: "已核发" },
    ],
    wont: ["不会自动通过审核", "不会自动拒绝提成", "不会自动重算月度"], forbidden: ["未登录提交", "非白名单接口"], rollbackNote: "24h 内可撤销本单核发，修改字段随执行单一并留痕",
    onSubmit: (e) => setSt(s => ({ ...s, [o.id]: "已核发" })),
  });
  return (
    <div className="view viewfade">
      <S icon="BadgeDollarSign" title="提成核发" mode="财务监督" judge="逐单提成人工审核 · 每一笔订单单独核发 · 负毛利单需复核、超阈值需老板拍板" src="employee_commissions + sales_records" />
      <div className="kpigrid">
        {isCurrent ? (
          <React.Fragment>
            <Kp label={rf === "全部" ? "待审核订单" : rf + " · 待审核"} value={pendingN} hint="每单需人工核发" pill="需审核" pillTone="warn" feat valTone={pendingN ? "ovstat--warn" : ""} />
            <Kp label="待发提成合计" value={window.yuan(pendingSum)} hint={(rf === "全部" ? "全部业务员" : rf) + " · 按单累加"} icon="Wallet" />
            <Kp label="负毛利单" value={negN} hint="提成可能扣减 / 复核" pill="复核" pillTone="danger" valTone={negN ? "ovstat--danger" : ""} />
            <Kp label="核发方式" value="逐单受控" hint="预检 → 确认短语 → 留痕" icon="ShieldCheck" iconColor="var(--accent)" />
          </React.Fragment>
        ) : (
          <React.Fragment>
            <Kp label="当月订单" value={histOrders} hint={month + " · " + (rf === "全部" ? "全部业务员" : rf)} icon="CalendarRange" feat />
            <Kp label="已核发提成合计" value={window.yuan(histPaidSum)} hint="归档口径" icon="Wallet" />
            <Kp label="负毛利单" value={histNeg} hint="当月已复核" valTone={histNeg ? "ovstat--warn" : ""} />
            <Kp label="审核状态" value="已归档" hint="只读快照" icon="Archive" />
          </React.Fragment>
        )}
      </div>
      <Card>
        <SectionHead title={isCurrent ? "逐单提成核发 · 按业务员分列" : month + " · 提成归档"} icon="BadgeDollarSign"
          sub={isCurrent ? "审核队列按业务员动态分列，每人一栏、可增减 · 每笔订单单独受控核发，结论决定该单提成 · 拒绝则该单提成归 0" : "历史月份只读快照 · 按业务员汇总提成与审核情况"}
          right={<div style={{ display: "flex", alignItems: "center", gap: 12, flexWrap: "wrap" }}>
            <div className="rvsel" style={{ flexDirection: "row", alignItems: "center", gap: 7 }}>
              <span className="rvsel__l">月份</span>
              <select className="rvsel__s" style={{ minWidth: 140, padding: "6px 10px" }} value={month}
                onChange={e => { setMonth(e.target.value); setRf("全部"); setStf("全部"); }}>
                {months.map(m => <option key={m.key} value={m.key}>{m.label}</option>)}
              </select>
            </div>
            {isCurrent && <div className="rvsel" style={{ flexDirection: "row", alignItems: "center", gap: 7 }}>
              <span className="rvsel__l">业务员</span>
              <select className="rvsel__s" style={{ minWidth: 130, padding: "6px 10px" }} value={rf} onChange={e => setRf(e.target.value)}>
                {reps.map(r => <option key={r} value={r}>{r}</option>)}
              </select>
            </div>}
            {isCurrent && <div className="rvsel" style={{ flexDirection: "row", alignItems: "center", gap: 7 }}>
              <span className="rvsel__l">店铺</span>
              <select className="rvsel__s" style={{ minWidth: 130, padding: "6px 10px" }} value={stf} onChange={e => setStf(e.target.value)}>
                {stores.map(s => <option key={s} value={s}>{s}</option>)}
              </select>
            </div>}
            {isCurrent && <div className="fchips">{FILTERS.map(s => <button key={s} className={"fchip" + (sf === s ? " is-on" : "")} onClick={() => setSf(s)}>{s}</button>)}</div>}
          </div>} />
        {isCurrent ? (
          <div className="mzboard">
            {allReps.filter(r => (rf === "全部" || r === rf) && (stf === "全部" || humanOrders.some(o => o.rep === r && o.store === stf))).length === 0
              ? <div className="emptyrow" style={{ flex: 1 }}><Icon name="Inbox" size={14} />无匹配业务员</div>
              : allReps.filter(r => (rf === "全部" || r === rf) && (stf === "全部" || humanOrders.some(o => o.rep === r && o.store === stf))).map(rep => {
                const colAll = humanOrders.filter(o => o.rep === rep && (stf === "全部" || o.store === stf));
                const colOrders = colAll.filter(o => sf === "全部" || st[o.id] === sf);
                const pend = colAll.filter(o => st[o.id] === "待审核" || st[o.id] === "需复核");
                const sum = pend.reduce((s, o) => s + o.commission, 0);
                return (
                  <div className="mzcol" key={rep} style={{ "--col": hueOf(rep) }}>
                    <div className="mzcol__head">
                      <div className="mzcol__top">
                        <span className="mzcol__dot" />
                        <span className="mzcol__name">{rep}</span>
                        <span className={"mzcol__pending" + (pend.length ? "" : " is-zero")}>{pend.length || "✓"}</span>
                      </div>
                      <div className="mzcol__sum">
                        <span className="mzcol__sumlab">待发提成 · {colAll.length} 单</span>
                        <span className="mzcol__sumval">{window.yuan(sum)}</span>
                      </div>
                    </div>
                    <div className="mzcol__body">
                      {colOrders.length === 0
                        ? <div className="mzcol__empty"><Icon name="CircleCheck" size={18} /><span>本栏无{sf === "全部" ? "" : sf}订单</span></div>
                        : colOrders.map(o => {
                          const status = st[o.id];
                          const open = status === "待审核" || status === "需复核";
                          const gmColor = o.margin < 0 ? "var(--negative)" : o.margin < 20 ? "var(--warning)" : "var(--positive)";
                          return (
                            <div className={"mzcard" + (status === "已核发" ? " is-yes" : status === "已拒绝" ? " is-no" : "")} key={o.id}>
                              <div className="mzcard__top">
                                <div style={{ minWidth: 0 }}>
                                  <div className="mzcard__shop">{o.store}</div>
                                  <div className="mzcard__buyer">{o.plat}</div>
                                </div>
                                <Pill tone={TONE[status]} soft>{status}</Pill>
                              </div>
                              <div className="mzcard__nos"><span>内 <b>{o.ino}</b></span><span>线上 <b>{o.pno}</b></span></div>
                              <div className="mzcard__money">
                                <span className="mzcard__amt">{window.yuan(o.amount)}</span>
                                <span className="mzcard__gm" style={{ color: gmColor }}>毛利 {o.margin}%</span>
                              </div>
                              <div className="mzcard__metrics">
                                <span className="mzm">运费支 <b>{window.yuan(o.freightOut)}</b></span>
                                <span className="mzm">收 <b>{window.yuan(o.freightIn)}</b></span>
                                <span className="mzm">平台 <b>{window.yuan(o.platFee)}</b></span>
                                <span className="mzm"><Icon name="Coins" size={12} />提成 <b>{window.yuan(o.commission)}</b></span>
                              </div>
                              {o.note && o.note !== "—" && <div className="mzcard__note"><Icon name="MessageSquare" size={12} />{o.note}</div>}
                              {open ? (
                                <React.Fragment>
                                  <div className="mzact">
                                    <Button variant="ghost" size="sm" onClick={() => setSt(s => ({ ...s, [o.id]: "已拒绝" }))}>拒绝</Button>
                                    <Button variant="solid" size="sm" onClick={() => payout(o)}>核发</Button>
                                  </div>
                                </React.Fragment>
                              ) : (
                                <div className={"mzresolved mzresolved--" + (status === "已核发" ? "yes" : "no")}>
                                  <Icon name={status === "已核发" ? "CircleCheck" : "CircleX"} size={14} />
                                  {status === "已核发" ? "已核发 " + window.yuan(o.commission) : "已拒绝 · 提成归 0"}
                                  <button className="mzresolved__undo" onClick={() => setSt(s => ({ ...s, [o.id]: o.margin < 0 ? "需复核" : "待审核" }))}>撤销</button>
                                </div>
                              )}
                            </div>
                          );
                        })}
                    </div>
                  </div>
                );
              })}
          </div>
        ) : (
          <div className="dtscroll"><div className="dt" style={{ minWidth: 720 }}>
            <div className="dt__head" style={{ gridTemplateColumns: htpl }}><span>业务员</span><span>订单数</span><span>已核发</span><span>待审核</span><span>负毛利</span><span>提成合计</span></div>
            {histRows.map((r, i) => (
              <div className="dt__row" style={{ gridTemplateColumns: htpl }} key={i}>
                <span className="dt__item">{r.rep}</span>
                <span className="num">{r.orders}</span>
                <span className="num">{r.paid}</span>
                <span className="num">{r.pending}</span>
                <span className={"num" + (r.neg ? " ovstat--warn" : "")}>{r.neg}</span>
                <span className="num" style={{ color: "var(--accent-ink)" }}>{window.yuan(r.commission)}</span>
              </div>
            ))}
            {histRows.length === 0 && <div className="emptyrow"><Icon name="Inbox" size={14} />该月无记录</div>}
          </div></div>
        )}
      </Card>
    </div>
  );
}

function KitManual({ onAct }) {
  const { Card, SectionHead, Pill, Button } = DSFIN;
  const K = window.KIT, S = window.KitStrip, Kp = window.KitKpi;
  const TONE = { "待核验": "warn", "已核验": "good" };
  const pending = K.manualAdj.filter(m => m.status === "待核验").length;
  const tpl = "0.7fr 1.1fr 1.1fr 0.8fr 1.4fr 0.8fr 0.8fr";
  const verify = (m) => onAct({
    title: "核验人工调整", subject: m.id + " · " + m.type, phrase: "确认核验", submitLabel: "确认核验并入账", source: "finance_read_model",
    preflight: "只验算调整金额与口径，不入账、不付款。",
    preview: [{ k: "调整类型", v: m.type }, { k: "调整金额", v: window.yuan(m.amount) }, { k: "核验状态", from: m.status, to: "已核验" }],
    wont: ["不会自动入账", "不会自动付款", "不会发布利润"], forbidden: ["POST /api/manual_adjustment", "DELETE month_data"], rollbackNote: "核验留痕，可在月度重算前撤销",
  });
  return (
    <div className="view viewfade">
      <S icon="SlidersHorizontal" title="人工调整 / 核验" mode="财务监督" judge="人工覆盖与财务核验 · 调整金额影响口径重算 · 受控入账" src="manual_adjustments + verification_checks" />
      <div className="kpigrid">
        <Kp label="待核验" value={pending} hint="人工调整项" pill="需核验" pillTone="warn" feat valTone={pending ? "ovstat--warn" : ""} />
        <Kp label="本月调整项" value={K.manualAdj.length} hint="人工覆盖" icon="SlidersHorizontal" />
        <Kp label="核验检查" value="6 项" hint="自动核验通过 5" valTone="good" />
        <Kp label="入账方式" value="受控" hint="预检 → 核验 → 入账" icon="ShieldCheck" iconColor="var(--accent)" />
      </div>
      <Card>
        <SectionHead title="人工调整明细" icon="SlidersHorizontal" sub="核验后才进入账与口径重算" />
        <div className="dtscroll"><div className="dt" style={{ minWidth: 760 }}>
          <div className="dt__head" style={{ gridTemplateColumns: tpl }}><span>编号</span><span>类型</span><span>对象</span><span>金额</span><span>备注</span><span>状态</span><span></span></div>
          {K.manualAdj.map(m => (
            <div className="dt__row" style={{ gridTemplateColumns: tpl }} key={m.id}>
              <span className="dt__id num">{m.id}</span>
              <span className="dt__item">{m.type}</span>
              <span className="dt__sub2">{m.target}</span>
              <span className="num">{window.yuan(m.amount)}</span>
              <span className="dt__sub2">{m.note}</span>
              <span><Pill tone={TONE[m.status]} soft>{m.status}</Pill></span>
              <span style={{ textAlign: "right" }}>{m.status === "待核验" && <Button variant="solid" size="sm" onClick={() => verify(m)}>核验</Button>}</span>
            </div>
          ))}
        </div></div>
      </Card>
    </div>
  );
}

function KitMonthly() {
  const { Card, SectionHead, Pill } = DSFIN;
  const K = window.KIT, S = window.KitStrip, Kp = window.KitKpi;
  const tpl = "0.9fr 0.8fr 1fr 0.8fr 1fr 0.8fr";
  return (
    <div className="view viewfade">
      <S icon="CalendarRange" title="月度数据" mode="财务监督" judge="月份 / 归档 / 导入 / 重算 · 月口径用权威月度店铺汇总 · 高危操作默认受控" src="store_summaries（月口径）" />
      <div className="kpigrid">
        <Kp label="当前月" value="2026-06" hint="进行中" icon="CalendarRange" feat />
        <Kp label="已归档月" value={K.months.filter(m => m.archived).length} hint="只读快照" icon="Archive" />
        <Kp label="本月 GMV" value={window.yuan((K.months[0] || {}).gmv)} hint="权威月度汇总" />
        <Kp label="高危操作" value="受控" hint="删除整月需四闸门" pill="危险" pillTone="danger" />
      </div>
      <Card>
        <SectionHead title="月度数据管理" icon="CalendarRange" sub="导入 / 重算为写入，删除归档 / 整月为高危" />
        <div className="dtscroll"><div className="dt" style={{ minWidth: 640 }}>
          <div className="dt__head" style={{ gridTemplateColumns: tpl }}><span>月份</span><span>状态</span><span>GMV</span><span>订单</span><span>利润证据</span><span>归档</span></div>
          {K.months.map(m => (
            <div className="dt__row" style={{ gridTemplateColumns: tpl }} key={m.key}>
              <span className="dt__id num">{m.key}</span>
              <span><Pill tone={m.archived ? "neutral" : "accent"} soft>{m.status}</Pill></span>
              <span className="num">{window.yuan(m.gmv)}</span>
              <span className="num">{m.orders}</span>
              <span><Pill tone={m.profit_evidence_status === "证据齐" ? "good" : "warn"} soft>{m.profit_evidence_status || "—"}</Pill></span>
              <span className="dt__sub2">{m.archived ? "已归档" : "—"}</span>
            </div>
          ))}
        </div></div>
      </Card>
    </div>
  );
}

Object.assign(window, { KitFinance, KitCommission, KitManual, KitMonthly });
