#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""销售员归并映射 —— 唯一权威源（三部门逐月看板）。

用户 2026-10-06 口径（权威，不得扩大/缩小）：
  看板的销售员归属问题**只存在于「大客户1岗」一条线** —— 刘子研 / 黄明月 / 张立娅 / 刘新元。
    · 这四个人的所有销售额**全部算在「刘子研」一人名下**
    · 该岗位全年目标 = 1300 万
    · 其他人一律不受影响

必须在下列三处一致生效（由本模块统一提供映射，杜绝各处各写一份）：
  · salespersons[].sp                              （脚本/gen_dept_monthly_json.py）
  · customers[].sales                              （脚本/apply_sales_owner.py）
  · customers_grp[].sales_list / mixed             （脚本/apply_sales_owner.py 重建）
  partial / other_owner_count 由后端按合并后的 customers[].sales 现算，自动一致
                                                   （脚本/销售工作台服务.py，无需改动）
"""

# 归并：key 的销售额并入 value 名下
SP_MERGE = {"黄明月": "刘子研", "张立娅": "刘子研", "刘新元": "刘子研"}

# 归并后的归属人（大客户1岗）
MERGE_TARGET = "刘子研"

# ── 离职人员业绩划入区域经理（用户 2026-10-06 拍板，与 SP_MERGE 同级，权威不得扩大）──
#   浙江科研 → 吴云；广州科研 → 韩远怀；拓展部·福建 龙友波 → 黄文才。
#   就地生效于 salespersons[].sp（gen_dept_monthly_json.py 的 eff_sp）
#   与 customers[].sales（apply_sales_owner.py），两处一致。
#   注：王昕伟（去年离职、无 2026 订单）仅记录说明，不做金额动作。
#   2026-10-06 追加（本轮）：王慧洁 / 刘静文 → 吴云；刘斌 → 韩远怀（三人均已离职）。
#   至此归入区域经理者 = 11 人（吴云 5 + 韩远怀 6），另 龙友波 → 黄文才（拓展部，单列）。
MGR_MERGE = {
    "赵以诺": "吴云", "李岚风": "吴云", "曾琪": "吴云",                       # 浙江科研经理
    "王慧洁": "吴云", "刘静文": "吴云",                                       # 浙江科研（2026-10-06 追加：已离职）
    "黄建佳": "韩远怀", "黄自鑫": "韩远怀", "段玉": "韩远怀",
    "梁莹莹": "韩远怀", "肖立": "韩远怀",                                    # 广州科研经理（肖立本人已离职）
    "刘斌": "韩远怀",                                                        # 广州科研（2026-10-06 追加：已离职，释放 30 万目标）
    "龙友波": "黄文才",                                                      # 拓展部·福建 = 黄文才
}

# 全部归并映射（SP_MERGE + MGR_MERGE 合并视图；键不重叠）
ALL_MERGE = {}
ALL_MERGE.update(SP_MERGE)
ALL_MERGE.update(MGR_MERGE)

# ── 生命科学部 · 逐人年度目标（唯一权威源，用户 2026-10-06 拍板；12 人闭合 600 万）──
#   广东 3 人 = 165 + 100 + 35 = 300.0（刘斌 2026-10-06 离职并归韩远怀 → 其 30 万缺口重摊，
#              韩远怀 135 → 165）
#   浙江 5 人 = 190 + 35 + 30 + 30 + 15 = 300.0（张晋菲为新增人员，2026 年度 KPI 15 万）
LS_PERSON_TARGETS = {
    "广东": {"韩远怀": 165.0, "黄建华": 100.0, "王诗香": 35.0},
    "浙江": {"吴云": 190.0, "袁殿果": 35.0, "叶信福": 30.0, "侯海瑜": 30.0, "张晋菲": 15.0},
}
# 新增人员（页面标注「新增」；无 2026 订单 → 实际 0，但 15 万目标必须存在）
LS_NEW_HIRES = ("张晋菲",)

# ── 年度目标覆盖（缺口按区域摊到区域经理 + 新增人员，用户 2026-10-06 拍板）──
#   生命科学部 600 万：广东 3 个有目标的人原占 235 万（韩远怀 100 + 黄建华 100 + 王诗香 35），
#     缺口 65 万摊给韩远怀 → 165.0（刘斌 30 万离职释放，缺口 35 → 65）。
#     浙江缺口 110 万 → 吴云 80 → 190.0；张晋菲 15.0（新增）。
MGR_TARGET_OVERRIDE = {"吴云": 190.0, "韩远怀": 165.0, "张晋菲": 15.0}
# 承担缺口的区域经理（写入 meta）
MGR_SHORTFALL = {"吴云": {"region": "浙江", "shortfall": 110.0, "from": 80.0, "to": 190.0},
                 "韩远怀": {"region": "广东", "shortfall": 65.0, "from": 100.0, "to": 165.0}}

# 归并后该岗位的全年目标（万元）—— 用户 2026-10-06 指定，覆盖 kpi_scheme 里的 751.05
TARGET_ANNUAL_WAN = 1300.0

# 归并规则来源说明（写入 meta）
SOURCE_NOTE = "用户 2026-10-06 指定"


def merge_sp(name):
    """把一个销售员名归并到其归属名下；None/'' 原样返回（无归属保持无归属）。

    先应用 SP_MERGE（大客户1岗），再应用 MGR_MERGE（离职人员 → 区域经理）。
    两映射键不重叠，顺序无歧义。
    """
    if not name:
        return name
    s = str(name).strip()
    return ALL_MERGE.get(s, name)


def group_members(name):
    """返回「合并到 name 名下」的全部成员名单（含 name 本人，去重、稳定排序）。"""
    if not name:
        return []
    out = sorted(k for k, v in ALL_MERGE.items() if v == name)
    if name not in out:
        out.append(name)
    return out


def meta_block():
    """写入三部门逐月_2026.json 的 meta.person_merge。"""
    return {
        "rule": "人员归并：黄明月 / 张立娅 / 刘新元 的销售额全部并入「刘子研」"
                "（大客户1岗）；仅该四人受影响，其他销售员一律不变。",
        "merge_map": dict(SP_MERGE),
        "members": [MERGE_TARGET] + sorted(SP_MERGE.keys()),
        "source": SOURCE_NOTE,
        "applied_in": [
            "salespersons[].sp（同 月×部门 下的目标/实际/客户数相加）",
            "customers[].sales（决定权限过滤与「按客户」下钻）",
            "customers_grp[].sales_list / mixed（基于合并后归属集重建；"
            "后端 partial / other_owner_count 亦随之重算）",
        ],
        "target_annual_override": {MERGE_TARGET: TARGET_ANNUAL_WAN},
        "target_annual_source": f"{SOURCE_NOTE}：大客户1岗全年目标 {TARGET_ANNUAL_WAN} 万",
        "others_unchanged": "除上述四人外，其余销售员的归属与金额零变化（已用改前备份逐人逐月 diff 验证）。",
    }


def mgr_merge_meta_block():
    """写入三部门逐月_2026.json 的 meta.mgr_merge（离职人员业绩划入区域经理）。"""
    return {
        "rule": "离职/管培生人员的销售额并入其区域经理名下 —— 浙江科研（赵以诺/李岚风/曾琪/"
                "王慧洁/刘静文）→吴云、广州科研（黄建佳/黄自鑫/段玉/梁莹莹/肖立/刘斌）→韩远怀、"
                "拓展部·福建 龙友波→黄文才（用户 2026-10-06 拍板，不得扩大）。",
        "merge_map": dict(MGR_MERGE),
        "members": ["吴云", "韩远怀", "黄文才"] + sorted(MGR_MERGE.keys()),
        "applied_in": [
            "salespersons[].sp（同 月×部门 下合并人 + 被并人的实际/客户数相加）",
            "customers[].sales（决定权限过滤与「按客户」下钻）",
            "customers_grp[].sales_list / mixed（基于合并后归属集重建）",
        ],
        "amount_conservation": "逐分母总额守恒：合并前后 Σsalespersons.amt、Σcustomers.amt、"
                               "Σcustomers_grp.amt、Σamt_2025 均不变；customers 与 customers_grp 仍相等。",
        "no_action": {"王昕伟": "去年离职、无 2026 订单 → 仅记录说明，不做任何金额动作。"},
        "target_annual_override": dict(MGR_TARGET_OVERRIDE),
        "ls_person_targets": {rg: dict(m) for rg, m in LS_PERSON_TARGETS.items()},
        "ls_new_hires": list(LS_NEW_HIRES),
        "target_annual_source": "用户 2026-10-06 拍板：生命科学部 600 万 = 广东 300 + 浙江 300；"
                                "广东 3 个有目标的人原占 235 万、浙江 5 人原占 190 万，缺口按区域摊给区域经理"
                                "（浙江缺 110→吴云 190.0；广东缺 65→韩远怀 165.0，含刘斌离职释放的 30 万）；"
                                "新增人员 张晋菲 15.0（无 2026 订单 → 实际 0，目标 15 万存在，页面标「新增」）。",
        "shortfall_alloc": MGR_SHORTFALL,
        "others_unchanged": "刘子研线（大客户1岗）及其它任何销售员的归属与金额零变化。",
        "round_note": "2026-10-06 追加：王慧洁/刘静文→吴云、刘斌→韩远怀（三人均已离职）。"
                      "归入区域经理者共 11 人（吴云 5 + 韩远怀 6）；另 龙友波→黄文才（拓展部，单列）。"
                      "王慧洁/刘静文本无个人年度目标，不影响目标体系；"
                      "刘斌原广东 30 万目标随其离职重摊给韩远怀（135→165），广东区域仍为 300 万，两区与部门不变。",
    }
