# -*- coding: utf-8 -*-
from pathlib import Path
import pandas as pd, json, datetime
from openpyxl import load_workbook
from openpyxl.styles import Alignment, Font, PatternFill
from openpyxl.utils import get_column_letter

project=Path('/Users/bot1/Volumes/root_for_ai/AI工作区/通用_法务合同台账_合同存档_20260607_1036')
deliv=project/'deliverables'
docs=project/'docs'
base_csv=deliv/'合同总表_20260607.csv'
base_xlsx=deliv/'合同总表_20260607.xlsx'
md_path=deliv/'合同总表_20260607.md'
analysis_path=deliv/'新增合同法务辅助分析_20260607.md'
explain_path=deliv/'合同梳理说明_20260607.md'
manifest_path=docs/'source_files_manifest.json'
ocr_summary_path=docs/'ocr_summary.json'

cols=['序号','归档编号','签约/生效时间（OCR）','合同名称','合同类型','项目/IP','甲方','乙方','其他方/合作方','合约有效期/授权期限','授权/合作范围','金额/费用/分成','争议解决','风险/待核对','原始文件','OCR文本','SHA256','页数','OCR字符数']

df=pd.read_csv(base_csv) if base_csv.exists() else pd.DataFrame(columns=cols)
for c in cols:
    if c not in df.columns:
        df[c]=''
df=df[cols]
for seq in [9,10,11]:
    df=df[df['序号'].astype(str)!=str(seq)]
manifest=json.loads(manifest_path.read_text(encoding='utf-8'))
manifest_by_seq={int(m['seq']):m for m in manifest}
ocr_list=json.loads(ocr_summary_path.read_text(encoding='utf-8')) if ocr_summary_path.exists() else []
ocr_by_pdf={o.get('pdf'):o for o in ocr_list}

def meta(seq):
    m=manifest_by_seq[seq]
    pdf=Path(m['stored_pdf']).name
    return m, ocr_by_pdf.get(pdf,{})

m9,o9=meta(9); m10,o10=meta(10); m11,o11=meta(11)
new_records=[
    {'序号':9,'归档编号':'LC-20260607-009','签约/生效时间（OCR）':'封面/订单日期OCR识别为2026-04-28；自双方签字或盖章后生效；签署页日期和甲方盖章文字需人工复核','合同名称':'采购订单（钱袋子杜邦纸斜挎包）','合同类型':'采购订单/主合同附件','项目/IP':'钱袋子杜邦纸斜挎包；关联2026-01-15《文化产品合作协议》','甲方':'杭州万物有灵文化科技有限公司','乙方':'四川极深奇乐文化传播有限公司','其他方/合作方':'中国国家博物馆/国博方（收货及回款相关，OCR识别）','合约有效期/授权期限':'未约定固定截止日；订单自双方签字或盖章后生效；大货发货日期栏为“2026年_月日前”，需补齐','授权/合作范围':'甲方基于主合同向乙方采购文创产品；产品为钱袋子杜邦纸斜挎包，数量OCR识别为430个，乙方送货至甲方指定地点，质检/违约等适用主合同','金额/费用/分成':'采购单价29元/个，数量430个，小计/合计OCR识别为12,470元（含13%增值税专票、包装、运费等）；结算依据主合同，甲方收到乙方发票及国博方款项后30日内付款','争议解决':'依据双方主合同《文化产品合作协议》执行','风险/待核对':'中等风险：交货日期空缺；大量条款引用主合同，需与主合同一并保存/核对；付款以国博方回款为前提，乙方回款周期不确定；签署页日期、甲方盖章文字OCR不清；收货地址/联系人等敏感信息未纳入台账，需看原件复核','原始文件':m9['stored_pdf'],'OCR文本':o9.get('ocr_text','work/extracted_text_ocr/09_钱袋子采购订单_1_.txt'),'SHA256':m9['sha256'],'页数':m9['pages'],'OCR字符数':o9.get('chars','')},
    {'序号':10,'归档编号':'LC-20260607-010','签约/生效时间（OCR）':'协议期限自2026-05-09至2029-12-31；签署页日期OCR不清，乙方签署日期疑似2026年4月某日，需人工复核；自双方签字并盖章后生效','合同名称':'品牌授权代理协议（良渚文化/良渚博物院IP）','合同类型':'IP品牌授权代理协议/廉政责任书/附件授权文件','项目/IP':'“良渚文化 LIANGZHU CULTURE”及“良渚博物院”系列商标、品牌及馆藏资源','甲方':'杭州良渚玉文化创意产业有限公司（OCR识别，需核对公司全称）','乙方':'杭州云汉寻真文化创意有限公司','其他方/合作方':'良渚博物院；具体合作商按项目报备/合作协议确定','合约有效期/授权期限':'2026-05-09至2029-12-31；协议期满前30日可申请续约；注册商标IP代理区域为中国大陆不含港澳台，著作权IP为全球范围；普通许可，不含转授权','授权/合作范围':'乙方在约定期限、区域及品类内为合作IP提供品牌授权代理、招商洽谈、签约报备、衍生产品代理、项目履约监督等服务；具体项目需报备并取得甲方书面/邮件确认','金额/费用/分成':'按具体项目收益结算单约定比例分配；甲方保底收益不低于15万元（含税）/四个月，且不低于30万元（含税）/年；收款/开票后约定工作日内对账付款（银行账号未写入台账）','争议解决':'中华人民共和国法律；协商不成，任一方可向原告所在地有管辖权人民法院提起诉讼','风险/待核对':'中高风险：公司名称/签署日期OCR需核对；“原告所在地管辖”不确定性较高；保底收益与单项目/年度口径需进一步明确；二次创作成果存在多情形共有，实际项目必须逐项确认权属；具体项目授权书有效期模板留空；乙方不得转授权但又承担代理签约，需确保合作商授权链路文本闭合','原始文件':m10['stored_pdf'],'OCR文本':o10.get('ocr_text','work/extracted_text_ocr/10_良渚文化_云汉寻真 IP授权合同.txt'),'SHA256':m10['sha256'],'页数':m10['pages'],'OCR字符数':o10.get('chars','')},
    {'序号':11,'归档编号':'LC-20260607-011','签约/生效时间（OCR）':'签署页日期OCR未清晰识别；协议自双方签字或盖章之日起生效；协议期限为自签订之日至2027-12-31（OCR需人工复核）','合同名称':'文化产品合作协议（元浪/万物有灵）','合同类型':'文创产品合作/供货结算协议','项目/IP':'中国国家博物馆馆藏图片/文创衍生品；合作产品以采购订单及发货单为准','甲方':'杭州元浪文化科技有限公司','乙方':'杭州万物有灵文化科技有限公司','其他方/合作方':'中国国家博物馆/国博方；国博（北京）文化产业发展有限公司（相关品牌表述限制）','合约有效期/授权期限':'合作期限2年，自签订之日至2027-12-31；签订日需人工核对；到期/解除后剩余未售产品10日内收回','授权/合作范围':'甲方提供国博馆藏图片素材和设计需求，乙方负责文创产品开发、设计、宣传、生产制作、运输、售后等；产品名称、数量、价格以采购订单/发货单为准；未经甲方书面同意乙方不得向第三方销售或赠送合作产品','金额/费用/分成':'未列固定总价；按送货验收清单、销售清单、退换货明细等不定期对账；甲方收到国博方对应批次结算款及乙方合格发票后30日内支付货款；具体产品价格见附件采购订单','争议解决':'协商不成，向甲方所在地有管辖权人民法院提起诉讼','风险/待核对':'高风险（偏乙方不利）：乙方承担设计、生产、运输、售后、产品质量和侵权等广泛责任；新产生设计/产品等知识产权归甲方或国博，乙方成果保护不足；多处约定100万元名誉损失费且无责任上限；付款依赖国博方回款，现金流不确定；合同总价/产品清单另见订单，签订日OCR不清','原始文件':m11['stored_pdf'],'OCR文本':o11.get('ocr_text','work/extracted_text_ocr/11_元浪_万物有灵产品协议.txt'),'SHA256':m11['sha256'],'页数':m11['pages'],'OCR字符数':o11.get('chars','')},
]
new_df=pd.DataFrame(new_records, columns=cols)
df=pd.concat([df,new_df],ignore_index=True)
df['序号']=df['序号'].astype(int)
df=df.sort_values('序号')
base_csv.write_text(df.to_csv(index=False),encoding='utf-8-sig')

src_rows=[]
for m in sorted(manifest, key=lambda x:int(x.get('seq',0))):
    pdf=Path(m.get('stored_pdf','')).name
    o=ocr_by_pdf.get(pdf,{})
    src_rows.append({'序号':m.get('seq'),'展示文件名':m.get('display_name'),'原始缓存文件名':m.get('original'),'存档PDF':m.get('stored_pdf'),'原生文本':m.get('stored_text'),'OCR文本':o.get('ocr_text',''),'SHA256':m.get('sha256'),'页数':m.get('pages'),'原生文本字符数':m.get('chars'),'OCR字符数':o.get('chars',''),'添加时间':m.get('added_at')})
src_df=pd.DataFrame(src_rows)
field_desc=pd.DataFrame([
    {'字段':'签约/生效时间（OCR）','说明':'根据PDF文本层/OCR识别；签署页、盖章页、手写日期一律需人工复核。'},
    {'字段':'合约有效期/授权期限','说明':'记录合同期限、代理/授权期限、续约或终止规则；如合同仅约定生效条件则说明。'},
    {'字段':'金额/费用/分成','说明':'仅摘录主交易口径；银行账号、税号等敏感信息不进入总表。'},
    {'字段':'风险/待核对','说明':'法务辅助风险提示，不替代执业律师意见；高风险合同建议律师最终确认。'},
    {'字段':'SHA256','说明':'用于校验原始PDF未被篡改或重复上传。'},
])
now=datetime.datetime.now().isoformat(timespec='seconds')
process_df=pd.DataFrame([
    {'时间':now,'事项':'追加处理第9-11份合同','说明':'三份PDF均为扫描/弱文本层文件，使用PyMuPDF渲染页面并用macOS Vision OCR识别；已同步更新Excel/CSV/Markdown。'},
    {'时间':now,'事项':'可靠性提示','说明':'OCR可能误识别手写日期、印章、公司名、表格金额；台账中已标注需人工复核项。'},
    {'时间':now,'事项':'敏感信息处理','说明':'台账和分析摘要不列银行账号、联系人电话等敏感信息；原始PDF/OCR文本按合同原件保存以便内部复核。'},
])
with pd.ExcelWriter(base_xlsx, engine='openpyxl') as writer:
    df.to_excel(writer, index=False, sheet_name='合同总表')
    src_df.to_excel(writer, index=False, sheet_name='源文件清单')
    field_desc.to_excel(writer, index=False, sheet_name='字段说明')
    process_df.to_excel(writer, index=False, sheet_name='处理说明')

wb=load_workbook(base_xlsx)
for ws in wb.worksheets:
    ws.freeze_panes='A2'
    for cell in ws[1]:
        cell.font=Font(bold=True, color='FFFFFF')
        cell.fill=PatternFill('solid', fgColor='4F81BD')
        cell.alignment=Alignment(horizontal='center', vertical='center', wrap_text=True)
    for row in ws.iter_rows(min_row=2):
        for cell in row:
            cell.alignment=Alignment(vertical='top', wrap_text=True)
    for col in range(1, ws.max_column+1):
        letter=get_column_letter(col)
        max_len=0
        for cell in ws[letter]:
            val='' if cell.value is None else str(cell.value)
            max_len=max(max_len, min(len(val), 60))
        ws.column_dimensions[letter].width=max(10, min(max_len+2, 45))
    ws.auto_filter.ref=ws.dimensions
wb.save(base_xlsx)

show_cols=cols
md=['# 合同总表（截至2026-06-07）\n','> 说明：本表根据PDF文本层及OCR整理；扫描件中的签署日期、印章、手写内容、金额表格均需以原件人工复核为准。银行账号、电话等敏感信息不在本表列示。\n']
md.append('| ' + ' | '.join(show_cols) + ' |')
md.append('| ' + ' | '.join(['---']*len(show_cols)) + ' |')
def esc(x):
    s='' if pd.isna(x) else str(x)
    return s.replace('|','｜').replace('\n','<br>')
for _,r in df.iterrows():
    md.append('| ' + ' | '.join(esc(r[c]) for c in show_cols) + ' |')
md_path.write_text('\n'.join(md)+'\n', encoding='utf-8')

analysis=f'''# 新增合同法务辅助分析（第9-11份）

处理时间：{now}

> 说明：以下为基于扫描件/OCR文本的法务辅助分析，不替代执业律师意见。签署日期、印章、手写内容、附件空格、公司名称及金额表格需以PDF原件人工复核为准。本文不列示银行账号、电话等敏感信息。

## 1. LC-20260607-009｜采购订单（钱袋子杜邦纸斜挎包）

**结论/风险等级：中等风险。** 该文件是主合同《文化产品合作协议》的附件型采购订单，核心质检、违约、争议等大量引用主合同；单独看订单无法完整判断双方责任。

**核心信息**
- 甲方：杭州万物有灵文化科技有限公司
- 乙方：四川极深奇乐文化传播有限公司
- 日期：封面/订单日期OCR识别为2026-04-28；签署页日期需复核
- 金额：OCR识别合计12,470元，产品为钱袋子杜邦纸斜挎包，数量430个
- 付款：甲方收到乙方发票及国博方款项后30日内结算

**主要风险/待处理**
1. 交货日期为“2026年_月日前”，空缺会影响逾期责任认定，建议补齐具体日期。
2. 付款以国博方回款为前提，乙方回款周期存在不确定性；如我方为乙方，应争取最长付款期限或逾期协调机制。
3. 订单多处“依据主合同执行”，需将主合同与本订单作为同一组文件归档并核对冲突条款。
4. 签署页OCR对甲方名称/日期识别异常，正式使用前需人工核对盖章页。

## 2. LC-20260607-010｜品牌授权代理协议（良渚文化/良渚博物院IP）

**结论/风险等级：中高风险。** 该协议涉及IP授权代理、项目报备、保底收益、二次创作成果权属和廉政责任，属于较高关注度合同；具体项目签署前建议逐项做授权链路和收益口径复核。

**核心信息**
- 甲方：杭州良渚玉文化创意产业有限公司（OCR识别，需核对）
- 乙方：杭州云汉寻真文化创意有限公司
- IP：良渚文化/良渚博物院系列商标、品牌及馆藏资源
- 期限：2026-05-09至2029-12-31
- 区域/品类：注册商标IP为中国大陆不含港澳台，著作权IP为全球范围；著作权IP全品类；不可转授权
- 收益：按具体项目收益结算单比例分配；甲方保底不低于15万元/四个月且不低于30万元/年（含税）

**主要风险/待处理**
1. “不可转授权”与乙方代理签约/合作商使用IP之间需要合同文本闭合：每个具体项目应有甲方授权书、合作协议、素材清单和使用范围。
2. 保底收益的“每个具体项目”“每四个月/每年度”口径需明确，否则容易产生补差争议。
3. 二次创作成果权属被拆成多种情形，具体项目报备时必须明确选择，避免后续共同共有导致使用/转让受限。
4. 争议管辖为“原告所在地”，诉讼地点不确定，建议视我方立场改为固定法院。
5. 签署日期和甲方公司全称OCR存在不确定，需核对原件。

## 3. LC-20260607-011｜文化产品合作协议（元浪/万物有灵）

**结论/风险等级：高风险（偏乙方不利）。** 协议将设计、生产、运输、售后、质量、侵权、舆情等主要责任压在乙方，同时新产生成果知识产权归甲方或国博，且付款依赖国博方回款；如我方为乙方，建议重点谈判责任上限、付款保障和成果使用权。

**核心信息**
- 甲方：杭州元浪文化科技有限公司
- 乙方：杭州万物有灵文化科技有限公司
- 合作内容：甲方提供中国国家博物馆馆藏图片素材/设计需求；乙方负责文创产品开发、设计、宣传、生产、运输、售后等
- 期限：自签订之日至2027-12-31；签订日OCR未清晰识别
- 结算：按验收/销售/退换货等不定期对账；甲方收到国博方对应款项及乙方发票后30日内支付

**主要风险/待处理**
1. 乙方责任范围很宽且多处无责任上限，包含产品质量、知识产权侵权、舆情、消费者投诉等，建议设置责任上限和例外。
2. 多处约定100万元名誉损失费，金额较高且触发条件较宽，建议限定为实际损失、法院/仲裁支持范围或设置合理上限。
3. 新产生设计、图形、产品等知识产权归甲方或国博，乙方缺少设计过程稿、通用方法、供应链方案等自有成果保护。
4. 付款依赖国博方回款，建议增加最迟付款期限、甲方催收义务和逾期责任。
5. 产品清单/价格另见采购订单和发货单，主协议本身无法确认具体交易金额，需与订单一起归档。

## 后续建议

- 如果这些合同已经签署：建议补一份内部复核清单，重点核对签署日期、盖章主体、附件空格、产品数量/金额、付款条件。
- 如果仍可修改：优先补齐交货日期、收益/保底口径、具体项目授权链路、责任上限、逾期付款机制和固定管辖法院。
- 涉及IP授权、保底收益或较大金额项目时，建议交由执业律师最终确认。
'''
analysis_path.write_text(analysis, encoding='utf-8')

marker='## 2026-06-07 追加处理：第9-11份合同'
old=explain_path.read_text(encoding='utf-8') if explain_path.exists() else '# 合同梳理说明\n'
append=f'''\n\n{marker}\n\n- 新增并处理3份合同：`09_钱袋子采购订单_1_.pdf`、`10_良渚文化_云汉寻真 IP授权合同.pdf`、`11_元浪_万物有灵产品协议.pdf`。\n- 三份PDF均为扫描/弱文本层文件，已使用macOS Vision OCR生成可检索文本。\n- 合同总表已更新至11条记录，新增法务辅助分析见：`deliverables/新增合同法务辅助分析_20260607.md`。\n- 注意：OCR可能误识别手写签署日期、盖章页、公司名、表格金额；相关字段均需以PDF原件人工复核。\n'''
if marker in old:
    old=old[:old.index(marker)].rstrip()+append
else:
    old=old.rstrip()+append
explain_path.write_text(old+'\n',encoding='utf-8')

print('UPDATED')
print('rows', len(df))
print('xlsx', base_xlsx, base_xlsx.stat().st_size)
print('csv', base_csv, base_csv.stat().st_size)
print('md', md_path, md_path.stat().st_size)
print('analysis', analysis_path, analysis_path.stat().st_size)
print(df.tail(3)[['序号','归档编号','合同名称','甲方','乙方','合约有效期/授权期限']].to_string(index=False))
