#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""ERP 2026 1-9 月逐人销售额（用于与 Q3 报告自报数对账）。

口径（沿用工作台既有口径）：
  · 标准销售订单 · 单据状态=已审核 · 非赠品 · 排除关联方（宝锐/宝泰/横琴）
  · 金额 = 价税合计（含税）· 期间 = 合同日期 2026-01-01 ~ 2026-09-30
  · 离职归并：大客户1岗（黄明月/张立娅/刘新元）→ 刘子研；浙→吴云 / 穗→韩远怀 / 闽→黄文才
"""
import json
import os

import pandas as pd

ERP = os.path.expanduser('~/Desktop/hermas输入-工作台数据库/月度销售额数据/销售订单_20260101-20260930.xlsx')
OUT = '/Users/liuxinyuan/Desktop/Hermes输出-工作类/数据/2026Q3_ERP逐人销售额.json'

MERGE = {'黄明月': '刘子研', '张立娅': '刘子研', '刘新元': '刘子研',
         '龙友波': '吴云', '赵以诺': '吴云', '梁莹莹': '吴云', '曾琦': '吴云', '李岚风': '吴云',
         '黄建佳': '黄文才', '黄自鑫': '黄文才', '段玉': '韩远怀'}
DEPT = {'刘子研': '大客户部', '赵云浩': '大客户部',
        '吴云': '生命科学部', '韩远怀': '生命科学部', '黄建华': '生命科学部', '王诗香': '生命科学部',
        '陈彩红': '生命科学部', '叶信福': '生命科学部', '侯海瑜': '生命科学部', '袁殿果': '生命科学部'}


def main():
    d = pd.read_excel(ERP, sheet_name='Sheet1')
    d.columns = [str(c).strip() for c in d.columns]
    print('ERP 行数 %d ｜ 列：%s' % (len(d), [c for c in d.columns][:16]))

    d['_d'] = pd.to_datetime(d['合同日期'], errors='coerce')
    d['_amt'] = pd.to_numeric(d['价税合计'], errors='coerce').fillna(0)
    d['_cust'] = d['客户'].astype(str).str.strip()
    d['_sp'] = d['销售员'].astype(str).str.strip()

    m = (d['单据类型'].astype(str).str.contains('标准销售订单', na=False)
         & d['单据状态'].astype(str).str.contains('已审核', na=False)
         & ~d['是否赠品'].astype(str).str.strip().isin(['是', 'Y', 'True', 'true'])
         & ~d['_cust'].str.contains('宝锐|宝泰|横琴', na=False, regex=True)
         & d['_d'].dt.year.eq(2026) & d['_d'].dt.month.le(9))
    s = d[m].copy()
    print('过口径行 %d ｜ 金额 %.2f 元（%.1f 万）' % (len(s), s['_amt'].sum(), s['_amt'].sum() / 10000.0))
    print()
    raw = s.groupby('_sp').agg(金额=('_amt', 'sum'), 行数=('_amt', 'size'), 客户数=('_cust', 'nunique'))
    raw = raw.sort_values('金额', ascending=False)
    print('── 原始（未归并）逐人 ──')
    print((raw / 1).assign(金额万=(raw['金额'] / 10000).round(2)).to_string())

    s['_sp2'] = s['_sp'].map(lambda x: MERGE.get(x, x))
    merged = s.groupby('_sp2').agg(金额=('_amt', 'sum'), 行数=('_amt', 'size'), 客户数=('_cust', 'nunique'))
    merged = merged.sort_values('金额', ascending=False)
    merged['部门'] = [DEPT.get(i, '销售拓展部') for i in merged.index]
    print()
    print('── 归并后逐人（工作台口径）──')
    for i, r in merged.iterrows():
        print('  %-8s %-8s %12.0f 元 = %8.2f 万 ｜ %3d 行 ｜ %2d 客户' % (i, r['部门'], r['金额'], r['金额'] / 10000.0, r['行数'], r['客户数']))
    dept = merged.groupby('部门')['金额'].sum()
    print()
    for k, v in dept.items():
        print('  【%s】%.2f 万元' % (k, v / 10000.0))
    print('  两部门合计 %.2f 万元 ｜ 全司合计 %.2f 万元' % (
        (dept.get('大客户部', 0) + dept.get('销售拓展部', 0)) / 10000.0, merged['金额'].sum() / 10000.0))

    res = {'meta': {'源': os.path.basename(ERP), '期间': '2026-01-01~09-30',
                    '口径': '标准销售订单·已审核·非赠品·排除关联方；金额=价税合计；离职业绩归并'},
           'total': round(s['_amt'].sum(), 2),
           'dept': {k: round(v, 2) for k, v in dept.items()},
           'by_person': [{'人': i, '部门': r['部门'], '金额': round(r['金额'], 2),
                          '万': round(r['金额'] / 10000.0, 2), '行数': int(r['行数']),
                          '客户数': int(r['客户数'])} for i, r in merged.iterrows()],
           'raw_by_person': [{'人': i, '金额': round(r['金额'], 2), '万': round(r['金额'] / 10000.0, 2)}
                             for i, r in raw.iterrows()]}
    os.makedirs(os.path.dirname(OUT), exist_ok=True)
    json.dump(res, open(OUT, 'w', encoding='utf-8'), ensure_ascii=False, indent=1)
    print('\n→ %s' % OUT)


if __name__ == '__main__':
    main()
