The investor business plan (docx + pdf) rebuilt for the launch plant decided in October 2026: one Duplex system and one Classic, Pheenix galvanics with zero discharge, the Sibert line, a Sillitoe cutting room, modular steam and cooling (rooms for four), cassette and CD-R; no bridge stampers, no outsourced cutting; second Duplex as a growth option. - Part A: executive summary (what changed since 0.1, the numbers, the 180M / 216M answer, first release marked open), reading guide, two price points (ResurRec and Record Industry), anatomy rewritten for Sillitoe, Pheenix, Sibert, Duplex + Classic, lead times without bridge stampers, new 4.8 artist platform, cassette 4.9, CD 4.10. - Part B: traceability with ERPNext as system of record, metrology launch tier as the investor's choice, QC, efficiency (PEA tariff, utility modules, fuel open, Chinese boilers and DIW rules), site (Mueang Chi, Payap zoning result), building blocks, safety, BOI and licences with galvanics in the first factory licence. - Part C: launch-plant investment table, the investor's question and levers, tranches, currency, operating picture of the launch plant, timeline with the metal path on the critical path, commissioning sequence and why the whole chain at launch, team, 22 risks, 17 phase 0 actions, the ask. - plan_lib: grid column widths so LibreOffice keeps table widths. - export_pdf.py: LibreOffice UNO export that fills the table of contents (47 pages). - README: total investment, revenue model and business plan bullets.
34 lines
984 B
Python
34 lines
984 B
Python
"""Build the CNX Vinyl business plan .docx.
|
|
|
|
python build_plan.py -> ../CNX-Vinyl-Business-Plan.docx
|
|
python build_plan.py out.docx -> custom path
|
|
|
|
Images are resolved relative to docs/ (the parent of business-plan/).
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
HERE = Path(__file__).resolve().parent
|
|
sys.path.insert(0, str(HERE))
|
|
|
|
from plan_lib import Renderer # noqa: E402
|
|
import content_a, content_b, content_c # noqa: E402
|
|
|
|
DOCS = HERE.parent.parent # .../docs
|
|
OUT = HERE.parent / "CNX-Vinyl-Business-Plan.docx"
|
|
|
|
|
|
def main(out: Path = OUT) -> Path:
|
|
r = Renderer(DOCS, header_text="CNX Vinyl / Poy Records: Business plan, draft 0.2, October 2026",
|
|
footer_text="Confidential")
|
|
r.render(content_a.blocks() + content_b.blocks() + content_c.blocks())
|
|
r.save(out)
|
|
return out
|
|
|
|
|
|
if __name__ == "__main__":
|
|
target = Path(sys.argv[1]) if len(sys.argv) > 1 else OUT
|
|
print(main(target))
|