#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""科研货号 BR1D303 / BR1E102 系列 —— 指定月份区间的成交价格明细（精确到每个 test）。

用法: python3 统计_货号成交价明细.py BR1D303 BR1E102 --ym 2026-08 2026-09
输出: 控制台明细 + 销售分析/<货号>_<区间>_成交价明细.xlsx
口径: 标准销售订单 + 已审核 + 非赠品 + 排除关联方(宝锐|宝泰|横琴) + 排除作废/业务终止
    每 test 单价 = 价税合计 / 销售数量（销售单位为 test 时即为每个 test 的含税成交价）
"""
import os
import sys
import glob
import pandas as pd

ROOT = '/Users/liuxinyuan/Desktop/Hermes输出-工作类'
ERP_DIR = os.path.expanduser('~/Desktop/hermas输入-工作台数据库/月度销售额数据')
ASSOC = '宝锐|宝泰|横琴'


def pick_erp(end_ym='2026-09'):
    want = int(end_ym.replace('-', ''))
    best = None
    for f in glob.glob(os.path.join(ERP_DIR, '销售订单_*.xlsx')):
        import re
        m = re.search(r'_(\d{8})-(\d{8})', os.path.basename(f))
        if not m:
            continue
        end = int(m.group(2))
        if end // 100 >= want and (best is None or end > best[0]):
            best = (end, f)
    return best[1]


def main():
    args = sys.argv[1:]
    ym_start, ym_end = '2026-08', '2026-09'
    if '--ym' in args:
        i = args.index('--ym')
        ym_start, ym_end = args[i + 1], args[i + 2]
        args = args[:i]
    prefixes = args or ['BR1D303', 'BR1E102']

    path = pick_erp(ym_end)
    print('数据源: %s' % os.path.basename(path))
    df = pd.read_excel(path, sheet_name='Sheet1', header=0)
    df['_d'] = pd.to_datetime(df['合同日期'], errors='coerce')
    df['_ym'] = df['_d'].dt.strftime('%Y-%m')

    sel = df[df['货号#'].astype(str).str.startswith(tuple(prefixes))].copy()
    print('命中 %s 系列: %d 行（全期）' % (prefixes, len(sel)))
    if sel.empty:
        print('  可用货号示例:', [x for x in df['货号#'].dropna().astype(str).unique() if str(x).startswith('BR1D') or str(x).startswith('BR1E')][:20])
        return

    keep = (sel['单据类型'].astype(str).str.contains('标准销售订单', na=False)
            & sel['单据状态'].astype(str).str.contains('已审核', na=False)
            & (~sel['是否赠品'].astype(str).str.strip().isin(['是', 'Y', 'True', 'true']))
            & (~sel['客户'].astype(str).str.contains(ASSOC, na=False, regex=True))
            & (~sel['业务关闭'].astype(str).str.contains('作废|业务终止', na=False, regex=True)))
    dd = sel[keep].copy()
    inrange = dd[dd['_ym'].between(ym_start, ym_end)].copy()

    print('\n① %s~%s 过口径明细: %d 行 ｜ 金额 %.2f ｜ 数量 %.2f'
          % (ym_start, ym_end, len(inrange), inrange['价税合计'].sum(), inrange['销售数量'].sum()))
    gift = sel[~sel['是否赠品'].astype(str).str.strip().isin(['是', 'Y', 'True', 'true'])]
    print('   同期赠品/试用行: %d 行（金额 %.2f，已剔出主表）'
          % (len(sel[sel['_ym'].between(ym_start, ym_end)]) - len(inrange),
             sel[sel['_ym'].between(ym_start, ym_end)]['价税合计'].sum() - inrange['价税合计'].sum()))

    dt = pd.read_excel(path, sheet_name='Sheet1', header=0)
    inrange = inrange.sort_values(['货号#', '_d'])
    inrange['每test单价'] = (inrange['价税合计'] / inrange['销售数量']).round(4)

    print('\n② 明细（按货号 → 日期）')
    cur = None
    for _, r in inrange.iterrows():
        if r['货号#'] != cur:
            cur = r['货号#']
            print('\n  ── %s ｜ %s' % (cur, str(r['物料名称'])[:44]))
            print('     %-11s %-22s %10s %9s %10s %5s' % ('日期', '客户', '数量', '单位', '每test价', '单号'))
        print('     %-11s %-22s %10.2f %9s %10.4f %5s'
              % (str(r['_d'])[:10], str(r['客户'])[:20], r['销售数量'],
                 str(r['销售单位'])[:8], r['每test单价'], str(r['单据编号'])[-6:]))

    print('\n③ 每 test 价格统计')
    for h, g in inrange.groupby('货号#'):
        print('   %-16s 行数 %2d ｜ 最低 %9.4f ｜ 中位 %9.4f ｜ 最高 %9.4f ｜ 单位: %s'
              % (h, len(g), g['每test单价'].min(), g['每test单价'].median(),
                 g['每test单价'].max(), '/'.join(g['销售单位'].astype(str).unique())))

    out = os.path.join(ROOT, '销售分析', '%s_%s至%s_成交价明细.xlsx' % ('_'.join(prefixes), ym_start, ym_end))
    os.makedirs(os.path.dirname(out), exist_ok=True)
    with pd.ExcelWriter(out) as w:
        inrange[['_d', '合同日期', '单据编号', '客户', '销售员', '货号#', '物料名称', '销售单位',
                 '销售数量', '含税单价', '每test单价', '价税合计', '税率%', '出货批号#', '备注(内部)#']] \
            .rename(columns={'_d': '日期'}).to_excel(w, sheet_name='明细', index=False)
        inrange.groupby(['货号#', '物料名称'], dropna=False).agg(
            行数=('价税合计', 'size'), 数量合计=('销售数量', 'sum'), 金额合计=('价税合计', 'sum'),
            每test最低=('每test单价', 'min'), 每test中位=('每test单价', 'median'),
            每test最高=('每test单价', 'max')).to_excel(w, sheet_name='统计')
    print('\n→ %s' % out)


if __name__ == '__main__':
    main()
