# -*- coding: utf-8 -*-
"""
利息计算脚本（交接最终版）

设计原则：
  1. 参数读取实际文书：本金、起息日等自同目录《起诉状-交接终稿.txt》匹配并回显。
  2. 每个参数的核定状态与来源均可核对（见报告"参数核定状态与来源一览"表）。
  3. 遇未核参数先停。停算条件包括：计息方案、起诉日、利率口径、抵充口径、3,000元
     性质、本金基数、展期效力、LPR数值任一未核；方案二不因任何默认而代推105,000元
     或其他基数。
  4. 日期顺序违例（截止日早于起息日/起算日）一律停算，绝不出负数。
  5. 演示算例按显式假设计算：月1%、年10%仅系候选理解示例（非穷尽、非唯一口径）；
     抵息/抵本并列；分配口径未定的组合不出数；组合六的105,000元基数仅系演示假设。
  6. 运行结果按序另存，不覆盖。
用法：python3 利息计算-交接终稿.py
依赖：仅Python标准库。
"""
import os
import re
import sys
from datetime import date
from decimal import Decimal, ROUND_HALF_UP

# ───────── 参数区（默认全部未核；承办律师核定后逐项填定，方可进入正式计算） ─────────
计息方案 = None   # 待核定："方案一"（主张约定利息）或 "方案二"（LPR备选）——起诉状诉请二
起诉日 = None     # 待核定：填 date(2026, 11, 2) 这类
利率口径 = None   # 方案一待核定："月1%" 或 "年10%"——清单第4项（两读法仅为候选示例，非穷尽）
抵充口径 = None   # 待核定："抵息" 或 "抵本"——清单第3项
                  # （方案一"抵本"还须核定5,000元在三笔本金间的分配，未定则利息仍中止；
                  #   方案二下本金基数受其影响，未核则停算）
三千元性质 = None # 待核定："茶叶货款" 或 "还款"——清单第8项
                  # （任一方案下"还款"还须核定抵减口径，未定则中止）
本金基数 = None   # 待核定：诉请一本金，如 Decimal("110000") 或 Decimal("105000")
                  # ——取决于抵充口径、3,000元性质等；本脚本不代推，未核定则两方案均停算
展期效力已核 = False  # 方案二待核定：2025-01-03往来是否构成展期——清单第17项
LPR起算日 = date(2025, 7, 1)  # 展期届满次日（以展期效力核定为前提）——清单第5项、第17项
LPR年利率 = None  # 方案二待核定：起诉日适用的一年期LPR数值（本脚本不联网代查）
测算截止日 = None # 演示算例截止日；None=取运行日（仅演示用，不是起诉日）
# ──────────────────────────────────────────────────────────────

BASE = os.path.dirname(os.path.abspath(__file__))
诉状名 = "起诉状-交接终稿.txt"
证据名 = "证据目录-交接终稿.txt"
清单名 = "待核清单-交接终稿.txt"

序号 = 1
while os.path.exists(os.path.join(BASE, f"利息计算结果-交接终稿_运行{序号}.txt")):
    序号 += 1
结果名 = f"利息计算结果-交接终稿_运行{序号}.txt"

行 = []


def 输出(s=""):
    行.append(s)
    print(s)


def 读文本(p):
    with open(p, "r", encoding="utf-8") as f:
        return f.read()


def 紧(t):
    return re.sub(r"\s+", "", t)


D2 = Decimal("0.01")


def 舍(x):
    return x.quantize(D2, rounding=ROUND_HALF_UP)


def 天数(起, 止):
    d = (止 - 起).days
    if d < 0:
        raise ValueError(f"日期顺序错误：截止 {止.isoformat()} 早于起算 {起.isoformat()}（停算，不出负数）")
    return d


def 计息(本金, 起, 止, 日利率):
    d = 天数(起, 止)
    return d, 舍(本金 * 日利率 * d)


def 中(日):
    return f"{日.isoformat()}（{日.year}年{日.month}月{日.day}日）"


def 打明细(截止, 名义利率, 式样, 缩进="      "):
    日利率 = 名义利率 / 30 if 式样 == "月" else 名义利率 / 365
    除数 = "30" if 式样 == "月" else "365"
    总 = Decimal("0")
    for 序, (本金, 起, 说明) in enumerate(借款, 1):
        d, i = 计息(本金, 起, 截止, 日利率)
        总 += i
        输出(f"{缩进}第{序}笔　本金{本金:,.0f}元（{说明}）")
        输出(f"{缩进}  起止：{中(起)} 至 {中(截止)}，算头不算尾共 {d} 天")
        输出(f"{缩进}  算式：{本金:,.0f} × {名义利率:%} ÷ {除数} × {d} = {i:,.2f} 元")
    return 总


def 截至已生息(止, 日利率):
    return sum(计息(p, d, 止, 日利率)[1] for p, d, _ in 借款)


# ════════════════════════ 主流程 ════════════════════════
缺失 = [n for n in (诉状名, 证据名, 清单名) if not os.path.exists(os.path.join(BASE, n))]
if 缺失:
    输出("【错误】以下输入文件缺失，拒绝在无依据下计算：")
    for n in 缺失:
        输出(f"  - {n}")
    with open(os.path.join(BASE, 结果名), "w", encoding="utf-8") as f:
        f.write("\n".join(行) + "\n")
    sys.exit(1)

诉状原文 = 读文本(os.path.join(BASE, 诉状名))
证据原文 = 读文本(os.path.join(BASE, 证据名))
清单原文 = 读文本(os.path.join(BASE, 清单名))
诉紧, 证紧, 清紧 = 紧(诉状原文), 紧(证据原文), 紧(清单原文)
截止 = 测算截止日 if 测算截止日 is not None else date.today()

输出("利息计算报告（交接最终版脚本自动生成）")
输出(f"运行日期：{date.today().isoformat()}")
输出("参数来源：本目录《起诉状-交接终稿.txt》（计算参数）；《证据目录-交接终稿.txt》"
     "《待核清单-交接终稿.txt》（全量核对）。")
输出("原则：遇未核参数先停；日期顺序违例停算；每个参数的核定状态与来源可核对；"
     "演示算例按显式假设、不设唯一口径；结果按序另存、不覆盖。")
输出()

# ── 一、文书参数读取、回显与核定状态 ──
输出("一、从《起诉状-交接终稿.txt》读取的参数（自动匹配）")
本金项 = re.findall(r"以([\d,]+)元为基数自(\d{4})年(\d{1,2})月(\d{1,2})日起", 诉紧)
解析通过 = True
if len(本金项) != 3:
    输出(f"  ✗ 方案一本金项匹配到 {len(本金项)} 笔（应为3笔），中止。")
    解析通过 = False
else:
    借款 = []
    期望 = [("80,000", 2024, 3, 8), ("10,000", 2024, 3, 10), ("20,000", 2024, 3, 12)]
    说明表 = {
        "80,000": "银行转账2024-03-08，证据二",
        "10,000": "现金交付2024-03-10（当事人陈述，证据七补强），证据一",
        "20,000": "茶行账户转公司账户2024-03-12，证据五",
    }
    for 金额串, y, m, d in 本金项:
        借款.append((Decimal(金额串.replace(",", "")), date(int(y), int(m), int(d)),
                     说明表.get(金额串, 金额串)))
    for (金额串, y, m, d), (e金额, ey, em, ed) in zip(本金项, 期望):
        ok = (金额串 == e金额 and (int(y), int(m), int(d)) == (ey, em, ed))
        输出(f"  {'✓' if ok else '✗'} 以{金额串}元为基数自{y}年{m}月{d}日起"
             + ("" if ok else f"（与预期 {e金额}元/{ey}-{em}-{ed} 不符）"))
        if not ok:
            解析通过 = False

输出("  参数核定状态与来源一览（状态未核者不得进入正式计算）：")
def 状态(已核):
    return "已核定" if 已核 else "未核"
参数表 = [
    ("本金三笔及起息日", "80,000/10,000/20,000元；2024-03-08/10/12", "已读取（计息口径仍待定）",
     "《起诉状-交接终稿.txt》诉请二（自动匹配）"),
    ("计息方案", str(计息方案), 状态(计息方案 in ("方案一", "方案二")), "参数区（承办律师核定）"),
    ("起诉日", 起诉日.isoformat() if 起诉日 else "未填", 状态(起诉日 is not None), "参数区（承办律师核定）"),
    ("利率口径", str(利率口径), 状态(利率口径 in ("月1%", "年10%")), "参数区（清单第4项待定）"),
    ("抵充口径", str(抵充口径), 状态(抵充口径 in ("抵息", "抵本")), "参数区（清单第3项待定）"),
    ("3,000元性质", str(三千元性质), 状态(三千元性质 in ("茶叶货款", "还款")), "参数区（清单第8项待定）"),
    ("本金基数", (f"{本金基数:,.0f}元" if 本金基数 is not None else "未填"),
     状态(本金基数 is not None), "参数区（清单第3项两口径，不代推）"),
    ("展期效力", "已核" if 展期效力已核 else "未核", 状态(展期效力已核), "参数区（清单第17项待定）"),
    ("LPR起算日", LPR起算日.isoformat() + "（暂按）", "待核（前提：展期效力）", "参数区（清单第5项、第17项）"),
    ("LPR年利率", str(LPR年利率), 状态(LPR年利率 is not None), "参数区（不联网代查）"),
    ("测算截止日", 截止.isoformat(), "演示用（非起诉日）", "运行日或参数区"),
    ("LPR演示值", f"{Decimal('0.030'):%}", "未核·仅演示", "沿用原第5轮脚本3.0%"),
]
for 名称, 值, 态, 源 in 参数表:
    输出(f"    {名称}｜值：{值}｜状态：{态}｜来源：{源}")
输出()

# ── 二、互引检查（按实际文件名） ──
输出("二、互引检查（按实际文件名）")
定义项 = set(int(m) for m in re.findall(r"(?m)^(\d{1,2})\.", 清单原文))
互引全过 = True
引用集 = set()
for 来源, 紧t in (("起诉状", 诉紧), ("证据目录", 证紧), ("待核清单", 清紧)):
    for name in re.findall(r"《([^》]+)》", 紧t):
        引用集.add((来源, name))
for 来源, name in sorted(引用集):
    if not re.search(r"\.(txt|py)$", name):
        输出(f"  · {来源}引用《{name}》——非文件引用（法律或文书名），不作文件核对")
        continue
    存在 = os.path.exists(os.path.join(BASE, name))
    互引全过 = 互引全过 and 存在
    输出(f"  {'✓' if 存在 else '✗'} {来源}引用《{name}》" + ("" if 存在 else "——本目录无此文件"))
for 来源, 紧t in (("起诉状", 诉紧), ("证据目录", 证紧), ("待核清单", 清紧)):
    for n in sorted(set(int(x) for x in re.findall(r"第(\d{1,2})项", 紧t))):
        ok = n in 定义项
        互引全过 = 互引全过 and ok
        输出(f"  {'✓' if ok else '✗'} {来源}引用清单第{n}项" + ("" if ok else "——清单中无此编号"))
输出()

# ── 三、证据状态、转写来源与文稿口径核对 ──
输出("三、证据状态、转写来源与文稿口径核对")
已收数 = len(re.findall(r"【已收", 证紧))
待补数 = len(re.findall(r"【待补", 证紧))
输出(f"  {'✓' if 已收数 >= 5 else '✗'} 证据目录'已收'标注 {已收数} 处（应≥5）")
输出(f"  {'✓' if 待补数 >= 6 else '✗'} 证据目录'待补'标注 {待补数} 处（应≥6）")
在卷图 = ["IMG_20261012_借条.jpg", "IMG_20240308_142240.jpg", "微信聊天长截图_栋哥.png",
        "Screenshot_20251011_204501.jpg", "Screenshot_20251011_204530.jpg",
        "IMG_20251011_203312.jpg"]
for f in 在卷图:
    ok = f in 证紧
    输出(f"  {'✓' if ok else '✗'} 在卷图片名已载入证据目录：{f}")
来源核对 = [
    ("00:28–00:36", 清紧, "清单第8项：3,000元'拿不准'转写时间点已载"),
    ("非第三人转述", 清紧, "清单第8项：已核实系原告当场自述、非转述"),
    ("应该是茶叶钱", 清紧, "清单第8项并记原告'应该是茶叶钱'的事后判断（两处并存）"),
    ("00:57–01:03", 清紧, "清单第12项：证人出庭意愿转述之转写时间点已载"),
    ("可以帮我说话，但是不想去法院", 清紧, "清单第12项引转写原话"),
    ("00:57–01:03", 证紧, "证据七备注③载转述时间点"),
    ("可以帮我说话，但是不想去法院", 证紧, "证据七备注③引转写原话"),
    ("原告转述", 证紧, "证据七载明该节系原告转述（来源已核实）"),
    ("通话转写-原第2轮.txt", 清紧, "清单第18项载转写原件文件名"),
    ("未播放音频", 清紧, "清单注明本轮未播放音频"),
    ("不等于所转述内容的确认", 清紧, "清单第12项：转写记载存在≠所转述内容确认"),
    ("不等于所转述内容的确认", 证紧, "证据七③：转写记载存在≠所转述内容确认"),
    ("未校音", 清紧, "清单载明本轮未播放音频、未校音"),
    ("历史记录", 清紧, "回听校对注明系转写自带的历史记录、非本轮"),
    ("均系原告主张", 清紧, "清单第3项：总额与现金交付标注为原告主张"),
    ("不预设其内容", 清紧, "清单第13项：语音内容不预设"),
    ("同样未经证实", 清紧, "清单第12项：'拍胸脯'句注明未经证实"),
    ("原告主张为110,000元", 证紧, "证据一：借款总额标注原告主张"),
    ("原告主张其已交付", 诉紧, "起诉状：总额交付写作原告主张"),
    ("截图所见：显示时长48秒", 诉紧, "起诉状：语音只写截图所见48秒"),
]
for 片, 文, 说明 in 来源核对:
    ok = 片 in 文
    输出(f"  {'✓' if ok else '✗'} {说明}")
撤回核对 = [
    ("证人现表示不愿出庭", 证紧, "证据目录不再写无出处的证人意愿定论"),
    ("来源不明", 清紧, "此前'来源不明'误判结论应已移除（转写原件已核实出处）"),
    ("转写文件未随卷", 清紧, "转写原件已提供，旧表述应已移除"),
    ("转述属实", 清紧, "'转述属实'不得用于确认所转述内容"),
    ("转述属实", 证紧, "'转述属实'不得用于确认所转述内容"),
    ("统一口径", 清紧, "'统一口径'已改为'核实事实并保留拿不准'"),
    ("按交易习惯有", 清紧, "'按交易习惯'的解释框架已交承办律师核定"),
    ("符合\u201c法定代表人", 清紧, "追加共同被告的法律构成认定已交承办律师"),
    ("内容未保存", 诉紧, "语音内容不作推测性表述"),
    ("被告仅回复一条48秒语音", 诉紧, "语音表述只写截图所见"),
]
撤回干净 = True
for 片, 文, 说明 in 撤回核对:
    ok = 片 not in 文
    撤回干净 = 撤回干净 and ok
    输出(f"  {'✓' if ok else '✗'} 已无'{片}'——{说明}")
输出()

# ── 四、正式计算：停算条件检查 ──
输出("四、正式计算")
未核 = []
if 计息方案 is None:
    未核.append("计息方案（方案一／方案二）——起诉状诉请二，待承办律师核定")
if 起诉日 is None:
    未核.append("起诉日——起诉状'暂计至起诉之日'，待核定")
if 计息方案 == "方案一":
    if 利率口径 not in ("月1%", "年10%"):
        未核.append("'一分'利率口径（月1%／年10%，仅为候选示例）——清单第4项，待定")
    if 抵充口径 not in ("抵息", "抵本"):
        未核.append("5,000元抵充口径（抵息／抵本）——清单第3项，待定")
    if 抵充口径 == "抵本":
        未核.append("5,000元抵本时在三笔本金间的分配口径——材料未指明，须另行核定")
    if 三千元性质 not in ("茶叶货款", "还款"):
        未核.append("3,000元（2024-12-31）性质——清单第8项，待定")
    if 三千元性质 == "还款":
        未核.append("3,000元认定还款后的抵减口径（抵息／抵本及分配）——须另行核定")
    if 本金基数 is None:
        未核.append("诉请一本金基数——起诉状留【待核定】，本脚本不代推110,000元")
if 计息方案 == "方案二":
    if not 展期效力已核:
        未核.append("展期效力——清单第17项，LPR起算日以其为前提")
    if LPR年利率 is None:
        未核.append("起诉日适用的一年期LPR数值——待核定（本脚本不联网代查）")
    if 抵充口径 not in ("抵息", "抵本"):
        未核.append("5,000元抵充口径——方案二本金基数受其影响（清单第3项），未核不得默认105,000元")
    if 三千元性质 not in ("茶叶货款", "还款"):
        未核.append("3,000元性质——影响方案二本金基数（清单第8项），未核不得默认")
    if 三千元性质 == "还款":
        未核.append("3,000元认定还款后的抵减口径——须另行核定")
    if 本金基数 is None:
        未核.append("方案二本金基数——起诉状诉请一留【待核定】，本脚本不代推105,000元或其他数值")

# 日期顺序检查（截止早于起算一律停算，绝不出负数）
日期违例 = []
if 起诉日 is not None:
    for _, 起, _ in 借款:
        if 起诉日 < 起:
            日期违例.append(f"起诉日 {起诉日.isoformat()} 早于起息日 {起.isoformat()}")
    if 计息方案 == "方案二" and 起诉日 < LPR起算日:
        日期违例.append(f"起诉日 {起诉日.isoformat()} 早于LPR备选起算日 {LPR起算日.isoformat()}")
for _, 起, _ in 借款:
    if 截止 < 起:
        日期违例.append(f"测算截止日 {截止.isoformat()} 早于起息日 {起.isoformat()}")
if 截止 < LPR起算日:
    日期违例.append(f"测算截止日 {截止.isoformat()} 早于LPR备选起算日 {LPR起算日.isoformat()}")
for v in 日期违例:
    未核.append("日期顺序错误（停算）：" + v)

if 未核:
    输出("  【中止】以下停算条件命中，正式计算不产出任何可填入诉请的金额：")
    for i, s in enumerate(未核, 1):
        输出(f"    {i}. {s}")
    输出("  承办律师在参数区逐项填定并消除日期违例后重跑（结果另存为新文件），"
         "本节给出正式结果。")
else:
    输出("  【执行】参数已核定且日期顺序无误，正式计算如下：")
    try:
        if 计息方案 == "方案一" and 抵充口径 == "抵息" and 三千元性质 == "茶叶货款":
            毛利 = 打明细(起诉日, Decimal("0.01") if 利率口径 == "月1%" else Decimal("0.10"),
                         "月" if 利率口径 == "月1%" else "年", 缩进="    ")
            净利 = 毛利 - Decimal("5000")
            输出(f"    利息合计：{毛利:,.2f} 元；抵5,000元后净利息：{净利:,.2f} 元")
            输出(f"    诉请填列：本金 {本金基数:,.0f} 元＋利息暂计 {净利:,.2f} 元"
                 f"＝{本金基数 + 净利:,.2f} 元（截至 {中(起诉日)}）")
        elif 计息方案 == "方案二":
            d = 天数(LPR起算日, 起诉日)
            i = 舍(本金基数 * LPR年利率 / 365 * d)
            输出(f"    诉请填列：本金 {本金基数:,.0f} 元＋逾期利息 {i:,.2f} 元"
                 f"（{中(LPR起算日)} 起按 LPR {LPR年利率:%}，共 {d} 天）")
        else:
            输出("    该核定组合的自动计算路径未实现（如抵本分配、3,000元抵减），"
                 "请按核定口径人工复算或扩展本脚本。")
    except ValueError as e:
        输出(f"    【停算】{e}")
输出()

# ── 五、演示算例（非诉请金额） ──
输出(f"五、演示算例（非诉请金额，不得填入文书；截止日 {中(截止)}，仅为运行日）")
输出("  前置声明：")
输出("  · '一分'的月1%、年10%两种读法仅系候选理解示例（清单第4项待定），非穷尽、")
输出("    非唯一口径；脚本不视其为唯一选项。")
输出("  · 抵息／抵本两口径并列，无默认（清单第3项）；3,000元茶叶款／还款并列（第8项）。")
输出("  · 分配口径未定的组合一律不出数；抵本组合仅给'界限值'参考并标注非结果。")
输出("  · 通用假设④：截止日非起诉日；⑦：算头不算尾，各笔四舍五入至分后加总；")
输出("    月1%按÷30、年10%按÷365折算（折算口径未统一，均为假设）；")
输出(f"    LPR演示值沿用原第5轮脚本所列 {Decimal('0.030'):%}（未经核定，不联网更新）。")
输出("  · 组合六的基数105,000元仅系沿用原第5轮脚本的演示假设——该基数取决于抵充等")
输出("    未核口径，正式计算不采用、不代推。")
if 日期违例:
    输出("  【停算】存在日期顺序错误（见第四节末尾各项），演示算例不出任何数字。")
else:
    输出()
    输出("  组合一（月1%×抵息×3,000按茶叶款）——假设①②③④⑦齐备，可算：")
    毛利A = 打明细(截止, Decimal("0.01"), "月")
    净利A = 毛利A - Decimal("5000")
    输出(f"      利息合计：{毛利A:,.2f} 元；抵息后净利息：{净利A:,.2f} 元；"
         f"本金＋净利息＝{Decimal('110000') + 净利A:,.2f} 元（演示合计，本金110,000元"
         "亦系演示假设）")
    截至抵充日 = 截至已生息(date(2024, 9, 2), Decimal("0.01") / 30)
    输出(f"      （算术注：截至{中(date(2024, 9, 2))}已生息 {截至抵充日:,.2f} 元 ≥ 5,000 元，"
         "抵充时点不影响本组合合计。）")
    输出()
    输出("  组合二（月1%×抵息×3,000按还款）——【不出数】：3,000元抵减口径（抵息/抵本及分配）")
    输出("      未核定；核定后重算。")
    输出()
    输出("  组合三（月1%×抵本）——【不出利息数】：5,000元在三笔本金间的扣减分配未核定。")
    输出(f"      界限值参考（非结果）：抵充前利息合计 {毛利A:,.2f} 元，任何抵本结果应低于此值。")
    输出()
    输出("  组合四（年10%×抵息×3,000按茶叶款）——假设④⑤⑦，可算：")
    毛利C = 打明细(截止, Decimal("0.10"), "年")
    输出(f"      利息合计：{毛利C:,.2f} 元；抵息后净利息：{毛利C - Decimal('5000'):,.2f} 元")
    输出()
    输出("  组合五（年10%×抵本）——【不出利息数】：分配口径未核定；"
         f"界限值参考（非结果）：{毛利C:,.2f} 元。")
    输出()
    输出("  组合六（LPR备选，以展期效力核定为前提）——假设④⑥⑦＋基数演示假设，演示值可算：")
    dD = 天数(date(2025, 7, 1), 截止)
    iD = 舍(Decimal("105000") * Decimal("0.030") / 365 * dD)
    输出(f"      算式：105,000 × {Decimal('0.030'):%} ÷ 365 × {dD} = {iD:,.2f} 元"
         f"（{中(date(2025, 7, 1))} 起算；基数105,000元系演示假设，见前置声明）")
    输出()
    截至年末 = 截至已生息(date(2024, 12, 31), Decimal("0.01") / 30)
    输出("  附注：以上任一组合若另涉3,000元被认定为还款，均需另行抵减重算；"
         f"参考数据：截至{中(date(2024, 12, 31))}已生息 {截至年末:,.2f} 元（月利率1%口径）。")
输出()

# ── 六、三份文稿一致性抽查 ──
输出("六、三份文稿一致性抽查")
一致性 = [
    ("6214****3317", 诉紧, "起诉状载8万元收款账号尾号"),
    ("6214****3317", 证紧, "证据目录证据二载同一账号尾号"),
    ("2024年9月2日", 诉紧, "起诉状载5,000元还款日"),
    ("2024年9月2日", 证紧, "证据目录证据四载同一还款日"),
    ("19时32分", 证紧, "证据四载5,000元收款时刻"),
    ("22时47分", 诉紧, "起诉状载3,000元发起时刻"),
    ("22时47分", 证紧, "证据目录载同一发起时刻"),
    ("22时50分", 诉紧, "起诉状载3,000元收款时刻"),
    ("22时50分", 证紧, "证据目录载同一收款时刻"),
    ("2024年3月12日", 诉紧, "起诉状载2万元交付日"),
    ("2024年3月12日9时47分", 证紧, "证据五载同一日及时刻"),
    ("110,000元／105,000元", 清紧, "清单第3项列明两口径本金"),
    ("能否认定为自认", 证紧, "证据三第5项保留自认待定"),
    ("能否认定为自认", 清紧, "清单第12项与两稿口径一致"),
    ("的自认，待定", 诉紧, "起诉状对账段保留自认待定"),
    ("个体工商户", 诉紧, "起诉状主体类型待核"),
    ("个体工商户", 清紧, "清单第1项主体类型待核"),
    ("手指遮挡", 清紧, "清单第2项手指遮挡表述"),
    ("原告转述", 清紧, "清单第2项文三路系原告转述"),
    ("拿不准他啥意思", 清紧, "清单第8项保留原告原话"),
    ("好像有一笔，又好像没有", 清紧, "清单第11项保留原告原话"),
    ("好像有一笔，又好像没有", 诉紧, "起诉状保留原告原话"),
    ("拍胸脯说出了事他兜着", 清紧, "清单第12项保留咨询记录原话（原告陈述）"),
]
一致全过 = True
for 片, 文, 说明 in 一致性:
    ok = 片 in 文
    一致全过 = 一致全过 and ok
    输出(f"  {'✓' if ok else '✗'} {说明}")
输出()

# ── 七、口径与结果保存说明 ──
输出("七、口径与结果保存说明")
输出("  1. 正式计算仅在参数区全部核定且无日期违例后执行；本轮运行参数均未核定，")
输出("     正式计算中止。停算条件清单见第四节。")
输出("  2. 演示算例的假设见第五节前置声明与各组合标注；月1%/年10%非唯一口径；")
输出("     组合六基数105,000元仅系演示假设。")
输出("  3. 天数＝两日期之差（算头不算尾）；月÷30、年÷365两套折算并存，均为假设；")
输出("     截止早于起算一律停算（天数函数含负值硬拦）。")
输出("  4. 本脚本只做算术与核对，不构成法律判断；待定事项以《待核清单-交接终稿.txt》")
输出("     及承办律师决定为准。")
输出(f"  5. 本报告按序另存为《{结果名}》，未覆盖任何既有文件。")
输出()
状态 = "正式计算：中止（存在未核参数/日期违例）" if 未核 else "正式计算：已执行"
互引状态 = "互引检查：全部通过" if 互引全过 else "互引检查：存在未通过项"
一致状态 = "一致性抽查：全部通过" if 一致全过 else "一致性抽查：存在未通过项"
撤回状态 = "撤回检查：干净" if 撤回干净 else "撤回检查：存在残留"
输出(f"—— 报告完（生成：{date.today().isoformat()}；{状态}；{互引状态}；{一致状态}；"
     f"{撤回状态}）——")

with open(os.path.join(BASE, 结果名), "w", encoding="utf-8") as f:
    f.write("\n".join(行) + "\n")

if not (解析通过 and 互引全过 and 一致全过 and 撤回干净):
    print("\n[存在未通过项，请核对上方 ✗ 行后修正文稿或脚本，再重跑]")
    sys.exit(1)
print(f"\n[已按序另存 {os.path.join(BASE, 结果名)}，未覆盖任何既有文件]")
