Files
cnx_vinyl/docs/business-plan/build/build_plan.py
T
grabowski 3f33babdaa
Deploy test site / deploy (push) Successful in 52s
Plan B re-defined: the launch plant with everything in (~210M THB); front view on the cover
- Plan B now starts like Plan A with one Duplex system and one Classic,
  but takes none of the six levers: owned solar and battery (with the BOI
  solar measure), the full metrology stack, the visitor corridor, cassette
  and CD-R, the bought crane and Thai-supplied utilities (user, 17 October
  2026). ~193.8M THB before the reserve, ~209M with it (~150M to 268M),
  ~32M (~18 %) more than Plan A; the second Duplex is a growth step from
  revenue in both (~15.4M THB, estimate).
- total-investment.md "Two plans" re-based (heading and anchor now
  "B at ~210M THB", README and roadmap links updated); revenue-model.md
  operating pictures: same volume and EBITDA as Plan A, depreciation on
  Plan B's capital (operating profit 1.26M USD central, payback ~3.7 yr);
  the extra earns nothing in the modelled table, which the docs say.
- Calculator: Plan B preset = the launch plant with contingency kept out
  (EBITDA 2.07M USD, cash payback year ~4.3, IRR ~21 %); budget card marks
  180M and 180M plus 25 %; preset label "Plan B (~210M, all in)".
- Business plan draft 0.3, both versions rebuilt: every Plan B branch of
  the three content files rewritten; renders regenerated with the
  isometric view turned to the front of the site (road, car park, office,
  corridor facade) for the cover and Figures 8 to 10.
2026-10-17 16:33:18 +07:00

47 lines
1.6 KiB
Python

"""Build the CNX Vinyl business plan .docx, in its two versions (October 2026).
python build_plan.py -> ../CNX-Vinyl-Business-Plan-A.docx and -B.docx
python build_plan.py A -> ../CNX-Vinyl-Business-Plan-A.docx
python build_plan.py B out.docx -> Plan B to a custom path
Plan A (~180M THB) and Plan B (~210M THB) share every chapter; the content modules
switch the plan-specific text with plan_variant.pick(). 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 plan_variant # noqa: E402
import content_a, content_b, content_c # noqa: E402
DOCS = HERE.parent.parent # .../docs
VERSION = "draft 0.3, October 2026"
def out_path(plan: str) -> Path:
return HERE.parent / f"CNX-Vinyl-Business-Plan-{plan}.docx"
def main(plan: str = "A", out: Path | None = None) -> Path:
plan_variant.PLAN = plan
out = out or out_path(plan)
r = Renderer(DOCS, header_text=f"CNX Vinyl / Poy Records: Business plan, {plan_variant.label()}, {VERSION}",
footer_text="Confidential")
r.render(content_a.blocks() + content_b.blocks() + content_c.blocks())
r.save(out)
return out
if __name__ == "__main__":
args = sys.argv[1:]
plans = [args.pop(0).upper()] if args and args[0].upper() in ("A", "B") else ["A", "B"]
target = Path(args[0]) if args else None
for p in plans:
print(main(p, target if len(plans) == 1 else None))