# -*- coding: utf-8 -*-
"""以四川省官方《农村住房建设施工合同（示范文本）》CH-2025-01 为骨架，填入本案数据并附加补充约定"""
import copy, docx
from docx import Document
from docx.shared import Pt, Cm
from docx.oxml.ns import qn
from docx.oxml import OxmlElement
from docx.enum.text import WD_ALIGN_PARAGRAPH

SRC = '/home/zyw/Downloads/dl-hub/26-合同审查/官方文件/四川示范文本.docx'
DST = '/home/zyw/Downloads/dl-hub/26-合同审查/四川省农村住房建设施工合同（示范文本·本案填写版）.docx'
doc = Document(SRC)

def setp(p, text, keep_fmt=True):
    """把段落文本整体替换为 text（保留首个 run 的格式）"""
    runs = p.runs
    if not runs:
        p.add_run(text); return
    runs[0].text = text
    for r in runs[1:]:
        r.text = ''

def rep(needle, text, nth=0):
    """找到 text 含 needle 的段落并整体替换"""
    cnt = 0
    for p in doc.paragraphs:
        if needle in p.text:
            if cnt == nth:
                setp(p, text); return True
            cnt += 1
    print('  [未找到]', needle[:40]); return False

def repn(needle, idx_map, nth=0):
    """把段落中 needle 后的空格串替换（保留其余文字）"""
    cnt = 0
    for p in doc.paragraphs:
        if needle in p.text:
            if cnt == nth:
                t = p.text
                import re
                new = re.sub(r'(?<=' + re.escape(needle) + r')[ 　]*', idx_map, t, count=1)
                setp(p, new); return True
            cnt += 1
    print('  [未找到]', needle[:40]); return False

def add_after(p, text, bold=False, size=None):
    newp = copy.deepcopy(p._p)
    for r in newp.findall(qn('w:r')): newp.remove(r)
    p._p.addnext(newp)
    from docx.text.paragraph import Paragraph
    np = Paragraph(newp, p._parent)
    run = np.add_run(text); run.bold = bold
    if size: run.font.size = Pt(size)
    return np

FILL = '【待填】'
Y = '☑'; N = '□'

# ---------- 双方主体 ----------
rep('甲 方（建房人）：', '甲 方（建房人）：文泽志')
rep('身份证号码：', '身份证号码：51012319681216253X', 0)
rep('住      址：', '住      址：' + FILL + '（甲方住址）')
rep('联系方式：', '联系方式：13551110207', 0)
rep('乙 方（承揽人）：', '乙 方（承揽人）：江剑凯（`签约时须核对下列三类承揽人资格之一，并据实勾选`）')
rep('身份证号码：', '身份证号码：' + FILL, 1)
rep('合格证书：', '合格证书：' + FILL + '（乡村建设工匠培训合格证书编号）')
rep('联系方式：', '联系方式：13258212263', 1)
rep('通讯地址：', '通讯地址：' + FILL, 0)

# ---------- 乙方资质口径说明（插在"建筑施工企业"块之后）----------
import copy as _copy
from docx.text.paragraph import Paragraph as _Para
_last=None
for _p in doc.paragraphs:
    if _p.text.strip().startswith('通讯地址：'):
        _last=_p
if _last is not None:
    _np=_copy.deepcopy(_last._p)
    for _r in _np.findall(qn('w:r')): _np.remove(_r)
    _last._p.addnext(_np)
    _para=_Para(_np,_last._parent)
    _run=_para.add_run('（资质口径说明：本条所称"建筑施工企业资质"，指**建筑业企业资质**——施工总承包／专业承包／'
                       '施工劳务；**工程设计资质不属于本条所指的施工资质**。乙方为设计企业的，不得作为本工程的施工承揽人。）')
    _run.font.size=Pt(9)

# ---------- 一、工程概况 ----------
rep('1.工程名称：', '1.工程名称：成都市温江区和盛镇' + FILL + '村 文泽志农村自住住房（原址翻建）')
rep('2.工程地点：', '2.工程地点：四川省成都市温江区和盛镇' + FILL + '村' + FILL + '号')
rep('乙方按照甲方提供的设计图纸',
    '乙方按照甲方提供的设计图纸，承担以下内容的施工（在□中以划√方式选定，可以选择多项）：'
    + Y + '地基与基础；' + Y + '主体结构；' + Y + '建筑电气；' + Y + '建筑给排水；'
    + Y + '建筑装饰装修；' + Y + '室外设施；其他：' + FILL + '。')
rep('（1）乡村建设规划许可证', '（1）乡村建设规划许可证（建设工程规划许可证）证号：' + FILL + '。')
rep('（2）宅基地批准书编号：', '（2）宅基地批准书编号：' + FILL + '。')
rep('（3）其他许可证：', '（3）其他许可证：' + FILL + '。')
rep('工程以□包工包料',
    '工程以' + Y + '包工包料；' + N + '包工不包料；' + N + '部分承包；' + N + '其他' + FILL
    + '（在□中以划√方式选定，只能选择一项）的形式承包给乙方。其中，承包形式为包工不包料的，甲方提供建房所需的材料包括：不适用。')
rep('结构形式采取',
    '结构形式采取（在□中以划√方式选定，只能选择一项）：' + Y + '砖混结构；' + N + '框架结构；' + N + '木结构；'
    + N + '混合结构；' + N + '装配式结构；' + N + '土（石）木结构；' + N + '其他' + FILL + '。')

# ---------- 二、工期 ----------
rep('1.计划开工日期：', '1.计划开工日期：' + FILL + '年' + FILL + '月' + FILL + '日。')
rep('2.计划竣工日期：', '2.计划竣工日期：' + FILL + '年' + FILL + '月' + FILL + '日。')
rep('3.工期总日历天数：', '3.工期总日历天数：' + FILL + '天（建议 120～150 天）。工期总日历天数与根据前述计划开竣工日期计算的工期天数不一致的，以工期总日历天数为准。')

# ---------- 三、合同价款 ----------
rep('□按包工包料方式，工程费用按竣工房屋建筑面积',
    Y + '按包工包料方式，工程费用按竣工房屋建筑面积以 1523 元/平方米（大写：壹仟伍佰贰拾叁元/平方米）包干计算。'
    '（单价可协商调整，填写后本行即生效）')
rep('工程总价为 ',
    '工程总价为约 422176 元（大写：约肆拾贰万贰仟壹佰柒拾陆元），价款构成详见附件预算清单。'
    '经双方协商一致变更施工内容的，变更部分的费用按实增减。'
    '竣工房屋建筑面积按《建筑工程建筑面积计算规范》（GB/T50353）计算规则计算，'
    '与本合同签订时暂估面积 277.2 平方米相差在 ±3% 以内的，按 277.2 平方米结算；超出 ±3% 的，按实测面积结算。')

# ---------- 四、付款方式及时间 ----------
rep('1.预付款在合同签订后', '1.预付款在合同签订后 7 日内支付合同价款的 30 %（约 126653 元）；')
rep('2.地基完工验收合格后', '2.地基完工验收合格后 7 日内支付合同价款的 20 %（约 84435 元）；')
rep('3.主体完工验收合格后', '3.主体完工验收合格后 7 日内支付合同价款的 25 %（约 105544 元）；')
rep('4.竣工验收合格后', '4.竣工验收合格后 7 日内支付合同价款的 20 %（约 84435 元）；')
rep('5.双方办理结算完毕后', '5.双方办理结算完毕后 7 日内支付合同价款的 2 %（约 8444 元），'
    '剩余金额（不高于合同总价款的3%）作为工程质量保修金，甲方为质量保修金的支付方及管理方。'
    '参照工程质量保修金相关要求，甲方在缺陷责任期满后一次性无息付清。')

# ---------- 六、施工安全 ----------
rep('由（甲方/乙方） 购买建筑意外伤害保险',
    '由（乙方）购买建筑意外伤害保险，保险期间应覆盖全部施工期间，'
    '每人保额不低于人民币 ' + FILL + ' 万元，乙方应在开工前将保单复印件交甲方备存。')

# ---------- 七、双方权利和义务 ----------
rep('8.甲方应当自收到乙方竣工验收通知之日起',
    '8.甲方应当自收到乙方竣工验收通知之日起 7 日内组织乙方及相关单位和人员进行竣工验收。'
    '验收合格的，甲方应当在 3 日内向乙方签发接受交付的凭证。'
    '验收不合格的，乙方应当返工、修复或采取其他补救措施，由此增加的费用和（或）延误的工期由乙方承担。'
    '乙方在完成返工、修复或采取其他补救措施后，应当通知甲方，按本项约定的程序重新进行竣工验收。'
    '农村住房未经验收或验收不合格的，甲方不得使用。')
rep('9.按时完工并配合竣工验收',
    '9.按时完工并配合竣工验收。除不可抗力、非甲方原因外，逾期则按 200 元/天（大写：贰佰元每天）在本合同款中扣除。'
    '（若乙方逾期超过 30 日，甲方另有权依本合同第十条第2项解除合同）')

# ---------- 八、工程保修 ----------
rep('若在规定时间（', '若在规定时间（ 7 天）内乙方未到场维修，甲方有权另请第三方维修整改，'
    '所发生费用在工程质量保修金中扣除，不足部分由乙方另行支付。')

# ---------- 九、违约责任 ----------
rep('（1）甲方未按合同约定期限和数额支付合同价款的',
    '（1）甲方未按合同约定期限和数额支付合同价款的，按日向乙方支付逾期应付款万分之 五 的违约金，'
    '逾期超过 30 日的，乙方可以解除合同；')
rep('（3）因甲方原因造成停工的', '（3）因甲方原因造成停工的，按每日 200 元的标准向乙方支付违约金；')
rep('（3）乙方未按合同约定期限完成施工',
    '（3）乙方未按合同约定期限完成施工，造成工期延误的，按每日 200 元的标准向甲方支付违约金，'
    '工期延误超过 30 日的，甲方有权解除本施工合同（不可抗力因素除外）；')

# ---------- 十、争议解决办法 ----------
rep('□向                   人民法院提起诉讼。',
    Y + '向 成都市温江区人民法院 提起诉讼。')

# ---------- 十一、附则 ----------
rep('4.本合同一式   份',
    '4.本合同一式 叁 份，具有同等法律效力。甲方执 壹 份，乙方执 壹 份，'
    '报当地乡镇人民政府农房管理相关部门存档或留存 壹 份。')

# ---------- 十二、约定的其他内容 ----------
target = None
for p in doc.paragraphs:
    if p.text.strip().startswith('十二、约定的其他内容'):
        target = p; break
if target is None:
    print('!! 未找到第十二条')
else:
    BLANK_LINE = ('                                                          ')
    # 找到第十二条后紧随的空白段，作为插入锚点
    anchor = target
    # 逐条插入（逆序插入以保持顺序）
    items = [
        ('1. 【原合同的处理】双方确认，就本工程此前签署的文件（含 2026 年 9 月 10 日《农村自建房施工合同》正文及附件、'
         '以及该合同第 4 页末尾的手写《补条》）均未成立生效。本合同签订生效后，前述文件全部终止，'
         '双方不得再依据其主张任何权利；前述文件与本合同不一致的，一律以本合同为准。', True),
        ('2. 【承揽人资格】乙方应向甲方出示并留存其符合《四川省农村住房建设管理办法》第十四条规定的证明文件'
         '（《农村建筑工匠培训合格证书》／建造师执业资格证书／建筑施工企业资质证书），作为本合同附件。'
         '乙方不具备前述资格之一的，甲方有权解除本合同。', False),
        ('3. 【禁止名称不符的印章】本合同乙方名称应与签字、盖章主体完全一致。'
         '出现与乙方名称不一致的任何印章的，该盖章行为对甲方不发生效力。', False),
        ('4. 【主体身份】乙方为建筑施工企业的，应由法定代表人签字并加盖单位公章，'
         '并由江剑凯（身份证号 ' + FILL + '）作为连带责任保证人在本合同上签字，'
         '就乙方在本合同项下的全部义务承担连带责任保证；保证期间为乙方全部义务履行完毕之日起二年。'
         '乙方为乡村建设工匠或建造师的，应由本人签字并按指印。', False),
        ('5. 【材料品牌与规格】乙方采购的材料应符合附件《预算清单》及双方确认的《材料清单》约定的品牌、规格、等级，'
         '并提供出厂合格证、检测报告；材料进场须经甲方书面（含微信）验收确认后方可使用，'
         '不合格材料乙方应无条件退场，费用由乙方承担。', False),
        ('6. 【工程变更与增项】任何增项、变更均须由双方共同签署书面《工程变更单》，'
         '写明项目、工程量、单价、金额及对工期的影响，双方签字后生效。'
         '未经双方书面签署的增项，甲方不予认可、不予结算，乙方不得以此停工或拒绝交付；'
         '严禁以手写方式在合同文本上追加条款，未经双方在该处共同签字的手写内容不发生效力。', False),
        ('7. 【隐蔽工程验收程序】本合同第五条第3项所列地基与基础、钢筋绑扎、圈梁构造柱、楼屋面混凝土现浇、'
         '防水层及闭水试验、管线预埋等关键工序，乙方应提前 24 小时书面通知甲方查验；'
         '查验合格并经双方签字、拍照留证后方可进行下一步工序。未经甲方查验即覆盖的，'
         '甲方有权要求剥离复验，费用及工期损失由乙方承担。', False),
        ('8. 【施工记录与影像资料】乙方应按《四川省农村住房建设管理办法》第十六条，'
         '对地基基础、构造柱、圈梁、主体封顶等施工关键部位和环节进行影像记录，'
         '并在竣工验收合格后 7 日内将全部施工记录、影像资料移交甲方。', False),
        ('9. 【验收与归档配合】甲方应按《四川省农村住房建设竣工验收管理指导意见》及'
         '《成都市温江区规范农村宅基地审批和住房建设管理实施细则》（温农规〔2024〕2号）'
         '第三十条，于竣工验收 7 个工作日前将验收时间、地点、验收组名单告知镇（街道）；'
         '竣工验收合格后，双方共同签署《农村住房质量保修书》并形成《农村住房竣工验收记录表》；'
         '甲方应在验收合格后 30 日内将竣工资料报镇（街道）存档，乙方应无偿配合。', False),
        ('10. 【禁止转包】乙方不得将本工程转包或分包；确需分包的，须经甲方书面同意，'
         '并由乙方对分包方及其人员的行为、安全承担连带责任。乙方及其人员的工资、劳保由乙方自行解决，'
         '因乙方拖欠工资导致其人员向甲方主张权利的，乙方应承担全部责任并赔偿甲方损失。', False),
        ('11. 【第三人损害】因乙方原因造成第三人（含相邻房屋、村道、公共管线等）人身及财产损害的，'
         '由乙方承担全部责任；甲方因此被追责、索赔或处罚的，乙方应赔偿甲方全部损失（含律师费、诉讼费、鉴定费）。', False),
        ('12. 【竣工资料移交】竣工验收合格后 7 日内，乙方应向甲方移交施工图纸、竣工图、材料合格证与检测报告、'
         '隐蔽工程验收记录、混凝土与防水验收记录、水电隐蔽管线走向图等资料；'
         '逾期未移交的，甲方有权暂缓支付工程质量保修金。', False),
        ('13. 【通知与送达】双方确认下列地址与电话为有效通知与送达地址，并适用于诉讼阶段法律文书送达；'
         '通过微信、短信发送至该号码或邮寄至该地址的，均视为有效送达。'
         '甲方：地址 ' + FILL + '，电话 13551110207；乙方：地址 ' + FILL + '，电话 13258212263。', False),
        ('14. 【争议解决费用】任何一方为实现本合同权利支出的律师费、诉讼费、保全费、鉴定费、公证费，由违约方承担。', False),
        ('15. 【温江区专项约定】本工程同时按《成都市温江区规范农村宅基地审批和住房建设管理实施细则》'
         '（温农规〔2024〕2号）执行，双方约定如下：'
         '（1）乙方应配合甲方将本工程纳入「成都市农房建设管理信息系统」实行全过程管理，'
         '并按镇（街道）要求注册、填报；'
         '（2）乙方应配合镇（街道）依该细则第二十七条在验槽、建筑基础施工、主体施工三个关键环节到场检查，'
         '对检查发现的问题整改合格后方可继续施工，由此产生的费用与工期损失由责任方承担；'
         '（3）乙方应在开工前向甲方提供其《农村建筑工匠培训合格证书》（或建造师执业资格证书、'
         '建筑施工企业资质证书）复印件，并配合签署《农村宅基地建房施工安全责任书》；'
         '（4）地基基槽开挖时，乙方应对基槽开挖区边线外开挖深度 2 倍范围内的毗邻建（构）筑物、'
         '地下管线及设施等状况进行调查并采取安全保护措施；因未调查或未采取保护措施造成损害的，'
         '由乙方承担全部责任；'
         '（5）乙方应严格按符合要求的施工图施工，不得擅自修改施工图、不得偷工减料，'
         '并做好开挖验槽、地基基础、主体结构等重点部位施工检查记录，于竣工验收合格后移交甲方；'
         '（6）甲方应保存主要建筑材料（钢筋、水泥、砌体）出厂合格证或购买凭证，乙方应协助提供；'
         '（7）脚手架及支模架应采用合格钢管和扣件搭设，不得使用严重锈蚀、弯曲、压扁及裂纹钢管和不合格安全网；'
         '搭设脚手架应设置连墙件，梁板支模架应设置扫地杆、水平杆及剪刀撑，立杆基础上应设置木垫板。', False),
        ('16. 【地质踏勘与地基选型】乙方应根据建房地块的地质条件，选用适合修建房屋的地基持力层，'
         '对地基地质进行必要的踏勘，按照技术规范要求选择地基基础形式和埋置深度，'
         '并在基槽开挖前将踏勘情况与地基选型依据书面告知甲方。'
         '《四川省农村住房建设管理办法》第十二条、《成都市自建房全生命周期管理办法》'
         '（成办规〔2026〕6 号）第八条均已将前述事项规定为施工方的义务。'
         '**因乙方未履行前述义务导致房屋不均匀沉降、墙体开裂、渗漏的，由乙方承担全部责任，'
         '乙方不得以"地质沉降""自然灾害"为由免责**；仅在乙方举证证明损害完全由不可抗力造成时方可免责。', False),
        ('17. 【重点部位施工检查记录】乙方应严格按照规范和设计图纸要求，做好'
         '**开挖验槽、地基基础、构造柱、圈梁、屋面、主体结构**等重点部位的施工检查记录，'
         '并于竣工验收合格后一并移交甲方。', False),
        ('18. 【质量异议处理】双方对施工质量存在异议，且涉及**主体结构安全和主要使用功能**的质量缺陷的，'
         '应共同委托具有相应资质的工程质量检测机构进行检测，并依据检测结论提出处理方案；'
         '检测费用由责任方承担，责任方不明确的由双方各半垫付、最终由责任方承担。'
         '双方可请求工程所在地镇（街道）出具《建筑工程质量异议处理意见书》并督促整改。'
         '存在严重质量缺陷、可能危及人身安全的，双方**必须采取避险措施**；'
         '乙方应采取措施保证甲方的住房及物品不因施工而遭到破坏。', False),
        ('19. 【保修期依据】依《成都市农村住房建设质量安全管理办法》第十一条，'
         '**乙方应当执行国家住宅建筑保修期限的相关规定**。'
         '本合同第八条约定的保修期限不得低于该办法及国家规定的标准。', False),
        ('20. 【承揽人资格核验】乙方不具备本合同第十二条第 2 项所列资格之一的，甲方有权解除本合同；'
         '因乙方不具备资格导致本工程被主管部门责令停工、整改或拆除的，乙方应赔偿甲方全部损失。', False),
        ('21. 【合同附件】本合同附件包括：附件一《预算清单》；附件二《材料清单（含品牌、规格、等级）》；'
         '附件三《施工图纸目录》（含结构施工图或通用图集编号）；附件四《工程变更单》（格式）；'
         '附件五《隐蔽工程验收记录》（格式）；附件六《四川省新建农村住房质量保修书》；'
         '附件七 乙方资格证明文件。上述附件与本合同具有同等法律效力。', False),
    ]
    cur = anchor
    for text, bold in items:
        cur = add_after(cur, text, bold=False, size=10.5)

# ---------- 十三、附件 ----------
rep('十三、附件：预算清单、设计图纸等',
    '十三、附件：预算清单、材料清单、施工图纸（或通用图集）目录、乙方资格证明文件等，作为本合同组成部分。')

doc.save(DST)
print('已生成：', DST)
