#!/usr/bin/env python3
from pathlib import Path

from PIL import Image, ImageDraw
from docx import Document

from build_august_monthly_report import (
    BLACK,
    CYAN,
    MID_GREY,
    NAVY,
    ORANGE,
    PALE_BLUE,
    PALE_ORANGE,
    PALE_TEAL,
    TEAL,
    WD_ALIGN_PARAGRAPH,
    add_callout,
    add_heading,
    add_image,
    add_page_break,
    add_part,
    add_table,
    add_text,
    clear_body,
    configure_document,
    draw_centered,
    font,
    rounded_rect,
)


REPORT_DIR = Path(
    "/Users/jack/同步空间/cpt/05_经营管理与会议/005_日常管理/"
    "周例会（事业部层面）/2026年"
)
BASE_DOCX = REPORT_DIR / "数字技术中心&交付实施部8月月报.docx"
OUTPUT_DOCX = REPORT_DIR / "数字技术中心&交付实施部8月月报-正式产品线版.docx"
SOURCE_ASSETS = REPORT_DIR / "数字技术中心&交付实施部8月月报（截至8月22日·对外版）-assets"
ASSET_DIR = Path("/tmp/august-monthly-report-data-enhanced-assets")


def project_portfolio_chart(path: Path):
    canvas = Image.new("RGB", (2400, 1350), "#F8FAFC")
    draw = ImageDraw.Draw(canvas)
    draw.text((110, 70), "智慧食堂：五条可组合产品线", font=font(62, True), fill="#12344D")
    draw.text((110, 155), "产品线按软件能力定义；410、450、460是称重设备型号，项目可同时应用多条产品线", font=font(29), fill="#5E6B78")
    items = [
        ("基础营养结算与账户", "机场、赛迪、金斯瑞", "账户、补贴、策略、订单、支付退款；消费机、卡/码、人脸", "#008C82"),
        ("称重营养结算", "国康、江西206、滨州、重庆环卫、城市副中心", "410、450、460称重设备；绑盘、托盘、余量、营养结算", "#2C7BE5"),
        ("AI 菜品识别与视觉结算", "金斯瑞、江西206、四方达", "视觉结算台/AI识别台；菜品识别、定价、结算", "#7C4DCA"),
        ("自助取餐与信息发布", "金斯瑞、城市副中心", "自助终端、取餐柜、叫号盒、电子菜谱、看板与大屏", "#F28C45"),
        ("智慧食安与企业协同", "金斯瑞、国信", "晨检、留样、视频、报警、OA和运营报表", "#28A745"),
    ]
    for i, (label, count, detail, color) in enumerate(items):
        y = 250 + i * 166
        rounded_rect(draw, (110, y, 2290, y + 132), 20, "#FFFFFF", "#D8E0E7", 2)
        rounded_rect(draw, (110, y, 635, y + 132), 20, color)
        draw.text((150, y + 20), label, font=font(31, True), fill="white")
        draw.text((685, y + 17), count, font=font(34, True), fill="#12344D")
        draw.text((685, y + 73), detail, font=font(26), fill="#5E6B78")
    rounded_rect(draw, (110, 1110, 2290, 1260), 22, "#12344D")
    draw.multiline_text((165, 1142), "金斯瑞同时应用基础结算、AI识别、自助取餐/信息发布、食安与企业协同四条产品线；\n大兴、张家港等售前项目不纳入本轮产品线验证。", font=font(29, True), fill="white", spacing=10)
    canvas.save(path, quality=95)


def government_nutrition_chart(path: Path):
    canvas = Image.new("RGB", (2400, 1420), "#FFFFFF")
    draw = ImageDraw.Draw(canvas)
    draw.text((110, 70), "金斯瑞：四条产品线在一个项目内组合", font=font(62, True), fill="#12344D")
    draw.text((110, 155), "南京、镇江两地食堂｜基础结算 + AI识别 + 自助取餐/信息发布 + 食安与企业协同", font=font(27), fill="#5E6B78")
    cards = [
        ("30", "消费/收银终端", "两地设备清单合计", "#E8F5F2", "#008C82"),
        ("2", "视觉结算台", "菜品学习与视觉结算", "#EEF4FA", "#2C7BE5"),
        ("7", "自选称重设备", "南京 5 台、镇江 2 台", "#FFF1E7", "#F28C45"),
        ("2", "自助交互终端", "两地各 1 台", "#F1ECFB", "#7C4DCA"),
    ]
    for i, (num, label, note, bg, accent) in enumerate(cards):
        x = 110 + i * 555
        rounded_rect(draw, (x, 270, x + 515, 670), 28, bg, "#D8E0E7", 2)
        draw.text((x + 52, 325), num, font=font(82, True), fill=accent)
        draw.text((x + 52, 465), label, font=font(29, True), fill="#17212B")
        draw.text((x + 52, 555), note, font=font(25), fill="#5E6B78")

    draw.text((110, 770), "软件模块与前厅设备如何组合", font=font(34, True), fill="#12344D")
    modules = [
        ("账户、补贴、支付、退款、人员/人脸/IC 卡", "营养结算平台 + 手机端", "#008C82"),
        ("视觉结算、消费收银、自选称重、自助交互", "视觉结算台、消费机、秤、自助终端", "#2C7BE5"),
        ("取餐、叫号、信息发布", "取餐柜、15 个叫号盒、信息发布盒/广告机", "#F28C45"),
        ("晨检、留样、视频、燃气/烟雾/水浸", "留样柜、AI 分析盒、摄像机、报警器", "#7C4DCA"),
        ("组织、补贴、数据协同", "OA 对接、报表与运营后台", "#28A745"),
    ]
    for i, (label, device, color) in enumerate(modules):
        y = 835 + i * 72
        draw.ellipse((115, y + 10, 139, y + 34), fill=color)
        draw.text((160, y), label, font=font(27, True), fill="#17212B")
        draw.text((160, y + 38), device, font=font(24), fill="#5E6B78")
    rounded_rect(draw, (110, 1240, 2290, 1360), 22, "#12344D")
    draw.text((165, 1273), "结论：金斯瑞的基础结算进入第一条产品线，其余能力分别进入AI识别、自助取餐/信息发布和食安协同。", font=font(29, True), fill="white")
    canvas.save(path, quality=95)


def school_project_chart(path: Path):
    canvas = Image.new("RGB", (2400, 1260), "#F8FAFC")
    draw = ImageDraw.Draw(canvas)
    draw.text((110, 70), "学校类项目：收费与智慧食堂分开", font=font(62, True), fill="#12344D")
    draw.text((110, 155), "来源：学校/教委食安营养监管项目看板", font=font(29), fill="#5E6B78")
    items = [
        ("阳光校园收费", "1个项目｜覆盖3所学校", "首通智城：多校组织、膳食经费、月度账单和缴费入口", "#E8F5F2", "#008C82"),
        ("校园智慧食堂", "3个项目", "滨州健康科技职业学院、人大附中、保康三中", "#EEF4FA", "#2C7BE5"),
    ]
    for i, (title, count, detail, bg, accent) in enumerate(items):
        x = 110 + i * 1110
        rounded_rect(draw, (x, 290, x + 1040, 770), 32, bg, "#D8E0E7", 2)
        draw.text((x + 62, 355), title, font=font(50, True), fill=accent)
        draw.text((x + 62, 470), count, font=font(34, True), fill="#17212B")
        draw.multiline_text((x + 62, 575), detail, font=font(27), fill="#5E6B78", spacing=14)
    draw.text((110, 880), "已形成的项目验证", font=font(34, True), fill="#12344D")
    validations = [
        "滨州：一卡通、称重、绑盘、离线消费和食安设备",
        "人大附中：电子菜牌、菜品发布、分页轮播和语音叫号",
        "保康三中：AI明厨亮灶、晨检、留样、采购库存和公示",
    ]
    for i, text in enumerate(validations):
        x = 110 + (i % 2) * 1110
        y = 960 + (i // 2) * 105
        draw.ellipse((x, y + 8, x + 24, y + 32), fill="#008C82")
        draw.text((x + 45, y), text, font=font(27), fill="#17212B")
    canvas.save(path, quality=95)


def build_docx(assets: dict[str, Path]):
    doc = Document(str(BASE_DOCX))
    clear_body(doc)
    configure_document(doc)
    doc.core_properties.title = "数字技术中心与交付实施部2026年8月月报数据增强版"
    doc.core_properties.subject = "项目组合与产品模块覆盖分析"

    add_part(doc, "PART 01", "8月份完成的工作")
    add_heading(doc, "1. 运营基础：项目已经进入多场景运行")
    add_image(doc, assets["dashboard"], 6.55, "图 1｜运营指标概览（截至8月16日）。累计交易额不等于公司收入或回款。")
    add_table(doc, ["可查询项目", "总用户", "累计订单", "累计交易额", "累计活跃用户"], [["13个", "28,476人", "1,828,358单", "3,118.14万元", "5,337人"]], widths=[3.2, 3.2, 3.7, 4.1, 3.8], font_size=10.0)
    add_callout(doc, "结论", "运营数据证明系统已经进入真实用餐场景；项目分析还要继续回答产品覆盖、模块复用和交付阶段。")

    add_page_break(doc)
    add_part(doc, "PART 01 / PRODUCT LINES", "产品线：软件能力、设备与项目应用一一对应")
    add_image(doc, assets["portfolio"], 6.45, "图 2｜五条可组合的智慧食堂产品线。")
    add_callout(doc, "产品判断", "产品线先按软件能力定义，再配置硬件设备并映射项目。410、450、460是称重设备型号；金斯瑞的能力拆入四条产品线，不再单列为一行。", fill=PALE_BLUE, accent=CYAN)

    add_page_break(doc)
    add_part(doc, "PART 01 / JINSIRUI", "金斯瑞：四条产品线在一个项目内组合")
    add_image(doc, assets["government"], 6.45, "图 3｜金斯瑞两地食堂的四条产品线与前厅软硬件组合。设备数量来自项目清单，最终验收以现场为准。")
    add_table(doc, ["组合层", "软件能力", "硬件设备与项目配置"], [["结算与账户", "人员、账户、补贴、支付、退款、消费记录、手机端", "消费/收银终端 30 台、视觉结算台 2 台、自选称重设备 7 台、自助交互终端 2 台"], ["取餐与运营", "订单、取餐、叫号、信息发布、电子菜谱", "取餐柜 2 台、叫号盒 15 个、信息发布盒/广告机、打印机 15 台"], ["食安与协同", "晨检、留样、视频监控、报警、OA 对接、报表", "留样柜、AI 分析盒、摄像机、录像机、燃气/烟雾/水浸报警器"]], widths=[3.0, 6.8, 8.2], font_size=8.0)

    add_page_break(doc)
    add_part(doc, "PART 01 / APPLICATION MATRIX", "产品线应用矩阵：先模块和设备，再看项目")
    add_table(doc, ["产品线 / 软件模块", "设备类型", "部署方式", "应用项目", "已验证结果"], [["基础营养结算与账户：组织、账户、补贴、策略、订单、支付退款、报表", "消费终端、实体卡/消费码、人脸、闸机", "线上运行（部署方式按项目清单复核）", "首都机场、赛迪、金斯瑞", "机场单项目活跃交易用户 8,039 人；机场和赛迪累计有效订单 1,041,863 笔、活跃交易用户 11,716 人；金斯瑞基础结算纳入本线"], ["称重营养结算：称重、绑盘、餐盘、余量、排菜与营养结算", "410、450、460 称重设备；绑盘终端、托盘、平板、看板、大屏", "本地化 / 校内部署 / 政务云", "国康医院、江西206、滨州健康科技职业学院、重庆环卫、城市副中心", "410：国康；450：江西206、滨州、重庆环卫；460：城市副中心"], ["AI 菜品识别与视觉结算：菜品识别、定价、结算、菜品学习", "视觉结算台、AI 菜品识别台、450 AI 设备", "公有云 / 本地化", "金斯瑞、江西206、四方达", "金斯瑞视觉结算；江西206与四方达验证 AI 菜品识别"], ["自助取餐与信息发布：自助交互、取餐、叫号、菜品发布、运营展示", "自助终端、取餐柜、叫号盒、信息发布盒、广告机、看板和大屏", "公有云 / 政务云", "金斯瑞、城市副中心", "金斯瑞覆盖自助、取餐、叫号和信息发布；城市副中心覆盖余量看板、数据大屏和平板排菜"], ["智慧食安与企业协同：晨检、留样、视频、报警、OA、运营报表", "留样柜、AI 分析盒、摄像机、录像机、报警器", "公有云 / 本地化", "金斯瑞、国信", "金斯瑞覆盖晨检、留样、视频和 OA；国信覆盖采购验收、库存、食安、视频和信息发布"]], widths=[4.0, 3.8, 2.6, 3.5, 4.1], font_size=7.0)
    add_callout(doc, "产品结论", "基础结算、称重结算、AI菜品识别、自助取餐/信息发布、食安协同是五条产品线；410、450、460只作为称重线的设备型号管理。每条产品线必须形成对应版本、硬件清单、部署包、测试用例和验收标准。", fill=PALE_ORANGE, accent=ORANGE)

    add_page_break(doc)
    add_part(doc, "PART 01 / SCHOOL", "学校项目：收费与智慧食堂分开")
    add_image(doc, assets["school"], 6.45, "图 4｜阳光校园收费和三所校园智慧食堂项目。")
    add_table(doc, ["产品方向", "数量", "主要项目与验证"], [["阳光校园收费", "1个项目/3所学校", "首通智城：多校组织、膳食经费、月度账单和缴费入口"], ["校园智慧食堂", "3个项目", "滨州健康科技职业学院、人大附中、保康三中"]], widths=[4.5, 3.5, 10.0], font_size=9.0)
    add_table(doc, ["验证方向", "项目事实"], [["一卡通与称重", "滨州验证一卡通、访客混合、离线消费、双钱包、餐盘绑定和称重餐线"], ["信息发布", "人大附中验证电子菜牌、菜品发布、分页轮播和语音叫号"], ["食安与后厨", "保康三中验证AI明厨亮灶、晨检、留样、收货秤、采购库存和公示"]], widths=[4.5, 13.5], font_size=8.7)

    add_page_break(doc)
    add_part(doc, "PART 01 / PRODUCT", "产品策略：5+2 是产品总图，不是口号页")
    add_image(doc, assets["five_plus_two"], 6.4, "图 5｜AI 营养智慧食堂 5+2 产品总图。")
    add_table(doc, ["能力层", "内容", "产品化要求"], [["5 项产品能力", "高峰与弱网、信创适配、消费规则、系统连接、硬件生态", "形成标准版本、配置清单、部署包、测试用例和验收标准"], ["2 项差异能力", "AI 营养能力、数字技术能力", "形成政企版和学校版的营养功能，并进入对外介绍资料"], ["项目应用", "产品线在运行、交付和售后项目中验证", "案例只讲已核实的软件、硬件与运行结果，型号以标准清单为准"],], widths=[3.5, 7.0, 7.5], font_size=8.5)

    add_page_break(doc)
    add_part(doc, "PART 01 / HARDWARE & SECURITY", "硬件和三级等保")
    add_image(doc, assets["hardware_market"], 6.4, "图 6｜北京三区公开项目清单与硬件应标差距。")
    add_table(doc, ["硬件结论", "数据"], [["公开项目范围", "191所/校区"], ["共性硬件", "26类中25类共同出现，共性96.2%"], ["应标准备", "15项重点设备中13项具备应标基础"], ["当前缺口", "20层万能蒸烤箱及配套推车"],], widths=[6.0, 12.0], font_size=9.2)
    add_image(doc, assets["mlps"], 6.25, "图 7｜三级等保备案进度。最终结果以主管机关和测评机构为准。")

    add_page_break(doc)
    add_part(doc, "PART 02", "本月需要解决的两个问题")
    add_callout(doc, "结论", "9月必须把交付方式从依靠个人推进改成标准产品包批量交付。5名交付人员每人负责2个项目，部门月度完成10个第一阶段标准产品交付。", fill=PALE_ORANGE, accent=ORANGE)
    add_heading(doc, "问题一：没有形成每月10个项目的稳定交付产能")
    add_text(doc, "项目启动后仍要临时确认服务器、网络、支付、接口、硬件和定制需求。标准与定制混在一起，一个项目长期占用一名交付人员，产品和开发也被反复拉入部署和问题处理。")
    add_table(doc, ["第一阶段完成定义", "必须具备的证据"], [["启动条件齐全", "服务器、网络、支付、接口、硬件、客户负责人和验收标准确认"], ["标准产品完成", "部署、配置、初始化和核心流程测试通过"], ["运行观察完成", "1周跟餐或运行观察，无影响营业的严重问题"], ["客户确认完成", "标准产品确认单、遗留问题负责人和完成时间"],], widths=[6.0, 12.0], font_size=9.0)
    add_text(doc, "只完成安装、上线或设备到场，不能计入月度10个项目。第二阶段定制和最终合同验收单独统计。", size=9.4, bold=True, color=ORANGE)

    add_page_break(doc)
    add_part(doc, "PART 02 / PRODUCT PACKAGE", "问题二：产品与开发没有一一对应的标准产品包")
    add_text(doc, "产品侧管理方案和功能，开发侧管理代码和版本，交付侧拿到后还要重新确认模块、配置、接口、硬件和测试方法。没有标准产品包，第一阶段就没有可以直接交付的对象。", size=10.0, bold=True, color=NAVY)
    add_table(doc, ["责任角色", "必须交付", "通过标准"], [["产品", "适用客户、场景、标准功能、配置功能、第三方接口、定制边界、硬件组合和验收范围", "销售、开发和交付对范围理解一致"], ["开发", "正式版本、安装包、初始化数据、配置、数据库升级、接口说明、环境要求和回退方案", "交付人员可按文档独立安装"], ["测试", "核心流程、异常流程、设备和接口测试报告", "正式版本通过后才允许交付"], ["交付", "环境检查、部署清单、培训、手册、确认单和验收清单", "不再重新编写项目资料"], ["销售/项目负责人", "客户范围、合同范围、标准与定制边界、客户配合事项和验收人", "信息不完整不得进入排期"],], widths=[3.0, 9.2, 5.8], font_size=8.4)
    add_callout(doc, "一一对应规则", "一个产品名称和版本，只对应一套软件版本、一套硬件清单、一套部署资料、一套测试用例、一套操作手册和一套验收标准。", fill=PALE_BLUE, accent=CYAN)

    add_page_break(doc)
    add_part(doc, "PART 03 / PRODUCT", "9 月产品：政企版、学校版上线，并形成对外介绍资料")
    add_callout(doc, "结论", "9 月产品不再只写“形成产品包”。必须发布政企版和学校版营养功能，并交付可直接发送给客户的两套 PPT 介绍资料。", fill=PALE_ORANGE, accent=ORANGE)
    add_table(doc, ["产品工作", "本月必须完成", "通过标准"], [["政企版营养功能上线", "前厅营养结算、账户与补贴、消费策略、个人/群体营养反馈，明确与食安、进销存和第三方接口的配置边界", "正式版本、发布说明、核心流程测试和演示环境齐备"], ["学校版营养功能上线", "学生营养目标、带量食谱/营养分析、校园餐营养展示，明确与阳光收费、食安、采购库存的配置边界", "正式版本、测试报告、学校样例数据和演示路径齐备"], ["政企版对外 PPT", "客户问题、5+2 总图、政企产品组合、典型场景、部署方式、案例和下一步", "可编辑 PPT + 可发送 PDF；不含未授权案例和未冻结型号"], ["学校版对外 PPT", "校园食安、营养健康、采购经费、家校公示、设备与监管场景、案例和下一步", "可编辑 PPT + 可发送 PDF；与学校版产品范围一致"],], widths=[3.4, 9.0, 5.6], font_size=8.1)

    add_page_break(doc)
    add_part(doc, "PART 03 / PROJECTS", "9 月项目：按标准项目清单推进 10 个项目")
    add_text(doc, "项目只按清单推进，不把售前项目混进交付指标。大兴、张家港等售前项目不计入本月 10 个项目。", size=9.7, bold=True, color=NAVY)
    add_table(doc, ["项目组", "标准项目清单", "9 月动作", "通过标准"], [["运行/售后（4）", "首都机场、赛迪、国信、金斯瑞", "按产品线核对运行数据、问题清单、版本和硬件台账；形成可复用案例资料", "运行问题有责任人和日期；产品/硬件/版本资料可回读"], ["交付（6）", "江西206、四方达、国康医院、城市副中心（C08）、滨州健康科技职业学院、重庆环卫", "按标准 SKU、软件版本、硬件 BOM、部署资料和验收清单执行第一阶段交付", "启动条件通过；15 天内完成部署测试，随后完成 1 周运行观察"], ["不计入本月交付", "大兴、张家港及其他售前项目", "完成项目输入、选型和范围确认，不占用交付 10 项目指标", "未冻结产品、型号、接口和验收条件，不进入交付排期"],], widths=[3.1, 6.2, 5.0, 3.7], font_size=8.1)
    add_heading(doc, "两阶段交付")
    add_table(doc, ["阶段", "范围", "完成标准"], [["第一阶段：标准产品", "15 天内完成部署、配置和测试，再完成 1 周运行观察", "标准产品确认，遗留问题有负责人和日期"], ["第二阶段：合同定制", "标准产品确认后，远程交付合同范围内的定制功能", "每项定制有范围、时间、费用和验收标准"],], widths=[4.0, 8.0, 6.0], font_size=8.8)
    add_heading(doc, "全项目规范升级与等保")
    add_table(doc, ["范围", "9 月统一规范", "通过标准"], [["10 个项目", "每个项目统一产品 SKU/版本、硬件 BOM、部署与接口清单、测试验收、售后移交和问题台账", "项目资料按同一目录可回读；产品、硬件、部署和验收不再各自维护"], ["纳入等保范围的项目", "明确系统定级范围、资产与账号、网络与安全基线、扫描问题、整改责任和复测计划", "完成等保基线与整改计划；最终是否通过以主管机关和测评机构结论为准"]], widths=[3.3, 9.0, 5.7], font_size=8.1)

    add_page_break(doc)
    add_part(doc, "PART 03 / METRICS", "9 月怎么验收：产品与项目分别算完成")
    add_table(doc, ["指标", "计算方式", "9月目标", "责任角色"], [["政企版上线", "政企版发布物齐备", "1 套", "产品/开发/测试"], ["学校版上线", "学校版发布物齐备", "1 套", "产品/开发/测试"], ["对外 PPT", "政企版、学校版均可发送", "2 套", "产品/市场"], ["月度项目清单", "列入本月并完成第一阶段的项目数", "10 个", "交付负责人"], ["人均交付项目数", "个人完成项目数", "每人 2 个", "每名交付人员"], ["产品包匹配率", "使用正式产品包项目÷标准交付项目", "100%", "产品/开发"], ["项目规范资料完整率", "标准项目资料齐全项目÷10 个项目", "100%", "交付/项目负责人"], ["等保基线覆盖率", "完成等保基线项目÷纳入等保范围项目", "100%", "安全/项目负责人"], ["标准部署周期", "启动通过至部署测试完成", "不超过 15 天", "交付负责人"], ["运行观察", "部署后的跟餐或运行观察", "1 周", "交付负责人"]], widths=[4.0, 6.4, 3.4, 4.2], font_size=7.7)
    add_table(doc, ["角色", "9 月动作"], [["产品", "发布政企版、学校版营养功能和产品配置边界"], ["开发", "输出可安装、可测试、可回退的两个正式版本"], ["测试", "完成政企版、学校版核心流程测试，并按产品线覆盖项目设备"], ["交付", "按 10 项目清单执行部署、运行观察、规范资料和售后移交"], ["销售/项目负责人", "按 G0-G2 完成项目信息、SKU 选型和型号冻结；确定等保范围和客户配合事项"], ["安全/项目负责人", "完成等保资产、账号、网络安全基线，锁定扫描、整改和复测计划"], ["部门负责人", "每周分别检查产品发布物、10 个项目门槛和等保整改计划"],], widths=[4.0, 14.0], font_size=8.1)
    add_callout(doc, "最终判断", "9 月看六个结果：政企版上线、学校版上线、两套对外 PPT、10 个项目完成第一阶段交付、全项目规范资料统一、纳入等保范围项目完成基线与整改计划。", fill=PALE_ORANGE, accent=ORANGE)

    OUTPUT_DOCX.parent.mkdir(parents=True, exist_ok=True)
    doc.save(str(OUTPUT_DOCX))


def main():
    ASSET_DIR.mkdir(parents=True, exist_ok=True)
    assets = {
        "portfolio": ASSET_DIR / "project-portfolio-distribution.png",
        "government": ASSET_DIR / "government-nutrition-coverage.png",
        "school": ASSET_DIR / "school-project-analysis.png",
        "dashboard": SOURCE_ASSETS / "project-operation-dashboard.png",
        "five_plus_two": Path("work/2026-08-06-smart-canteen-marketing-infographics/outputs/v2/00-overview-5-plus-2.png"),
        "hardware_market": SOURCE_ASSETS / "beijing-hardware-market-overview.png",
        "mlps": SOURCE_ASSETS / "mlps-progress.png",
    }
    project_portfolio_chart(assets["portfolio"])
    government_nutrition_chart(assets["government"])
    school_project_chart(assets["school"])
    build_docx(assets)
    print(OUTPUT_DOCX)


if __name__ == "__main__":
    main()
