#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""统计某月「某备货部门」制备并发货的货号与金额（ERP 口径）。

用法: python3 统计_备货部门发货货号金额.py 2026 9 分子试剂产品部

口径（与宝锐工作台一致）：
  备货部门 = <部门>  且  发货日期 落在指定月份
  单据类型 含「标准销售订单」；单据状态 含「已审核」
  排除赠品；排除关联方客户（宝锐|宝泰|横琴）；排除作废/业务终止
输出：控制台明细 + 销售分析/<部门>_<年>年<月>月_发货货号金额.xlsx
"""
import os
import sys
import pandas as pd

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


def pick_erp(year, month):
    """挑覆盖目标月份的 ERP 导出（文件名含起止日期，取覆盖的最新一份）。"""
    import glob
    import re
    want = year * 100 + month
    best = None
    for f in glob.glob(os.path.join(ERP_DIR, '销售订单_*.xlsx')):
        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] if best else sorted(glob.glob(os.path.join(ERP_DIR, '销售订单_*.xlsx')))[-1]


def main():
    if len(sys.argv) < 4:
        print(__doc__)
        return
    year, month, dept = int(sys.argv[1]), int(sys.argv[2]), sys.argv[3]
    ym = '%d-%02d' % (year, month)
    path = pick_erp(year, month)
    print('数据源: %s' % os.path.basename(path))

    df = pd.read_excel(path, sheet_name='Sheet1', header=0)
    df['发货日期'] = pd.to_datetime(df['发货日期'], errors='coerce')
    d = df[(df['备货部门'].astype(str).str.strip() == dept)
           & (df['发货日期'].dt.strftime('%Y-%m') == ym)].copy()
    print('\n① 过滤前: %d 行 ｜ 价税合计 %.2f' % (len(d), d['价税合计'].sum()))
    for c in ('单据类型', '单据状态', '是否赠品', '业务关闭', '关闭状态'):
        vc = d[c].value_counts(dropna=False).head(6)
        print('   %-6s: %s' % (c, ' ｜ '.join('%s×%d' % (k, v) for k, v in vc.items())))
    if d.empty:
        print('   （无数据）')
        return

    keep = (d['单据类型'].astype(str).str.contains('标准销售订单', na=False)
            & d['单据状态'].astype(str).str.contains('已审核', na=False)
            & ~d['是否赠品'].astype(str).str.strip().isin(['是', 'Y', 'True', 'true'])
            & ~d['客户'].astype(str).str.contains(ASSOC, na=False, regex=True)
            & ~d['业务关闭'].astype(str).str.contains('作废|业务终止', na=False, regex=True))
    dd = d[keep]
    dropped = len(d) - len(dd)
    print('\n② 过口径: %d 行（剔除 %d 行）｜ 价税合计 %.2f ｜ 不含税 %.2f'
          % (len(dd), dropped, dd['价税合计'].sum(),
             (dd['价税合计'] / (1 + pd.to_numeric(dd['税率%'], errors='coerce').fillna(0) / 100)).sum()))

    by = (dd.groupby(['货号#', '物料名称'], dropna=False)
            .agg(金额=('价税合计', 'sum'), 数量=('销售数量', 'sum'), 单数=('单据编号', 'nunique'))
            .sort_values('金额', ascending=False))
    print('\n③ 按货号汇总（共 %d 个货号，合计 %.2f）' % (len(by), by['金额'].sum()))
    print('   %-15s %-30s %11s %9s %5s' % ('货号', '物料名称', '金额', '数量', '单数'))
    for (h, n), r in by.head(25).iterrows():
        print('   %-15s %-30s %11.2f %9.2f %5d'
              % (str(h)[:15], str(n)[:28], r['金额'], r['数量'], r['单数']))
    if len(by) > 25:
        print('   …（完整 %d 个货号见导出的 Excel）' % len(by))

    out = os.path.join(ROOT, '销售分析', '%s_%d年%d月_发货货号金额.xlsx' % (dept, year, month))
    os.makedirs(os.path.dirname(out), exist_ok=True)
    with pd.ExcelWriter(out) as w:
        by.reset_index().to_excel(w, sheet_name='按货号汇总', index=False)
        dd[['发货日期', '单据编号', '客户', '销售员', '货号#', '物料名称', '销售数量',
            '含税单价', '价税合计', '出货批号#', '产品类型#', '产品大类#']] \
            .sort_values('价税合计', ascending=False).to_excel(w, sheet_name='明细', index=False)
    print('\n→ %s' % out)


if __name__ == '__main__':
    main()
