Business plan draft 0.3 in two versions: Plan A ~180M and Plan B ~225M THB
Deploy test site / deploy (push) Successful in 52s
Deploy test site / deploy (push) Successful in 52s
- One build makes both documents: plan_variant.py switches the plan-specific text (pick / is_a / label); build_plan.py writes CNX-Vinyl-Business-Plan-A and -B (docx), export_pdf.py exports both PDFs with the table of contents filled in. Draft 0.2 (single launch-plant plan with contingency) is removed; it stays in the history. - Plan A: the launch plant with every machine and six cost levers, ~177M THB with the ramp-up reserve, no contingency. Plan B: the second Duplex at launch, five presses, ~224M THB on the same basis. Each version reads as a complete plan with one table comparing it with the other; the 216M investor-question text is gone, Pheenix is priced at OMS's reference plus 20 %. - Calculator renders in both documents, each from its own preset: the plant at a glance (Figure 4), the budget check (Figure 5) and ten years of cash (Figure 6), in docs/renders/calculator/. - Calculator budget card: the verdict and third KPI now name the tightest budget the midpoint fits (Plan A: 3.3M to spare under 180M; Plan B: 0.8M under 225M) instead of always 225M. - Fixes: CD replication cross-references point to section 4.10; the blended price in section 3.3 and roadmap item 1 is 3.76 to 5.27 USD at 60 % specials (3.50 to 4.60 at a standard-heavy mix).
This commit is contained in:
1 parent
f2ff1eac1f
commit
bd357ab03f
19 files changed
+1618
-685
No files matched your search
@@ -1,9 +1,12 @@
|
||||
"""Build the CNX Vinyl business plan .docx.
|
||||
"""Build the CNX Vinyl business plan .docx, in its two versions (October 2026).
|
||||
|
||||
python build_plan.py -> ../CNX-Vinyl-Business-Plan.docx
|
||||
python build_plan.py out.docx -> custom path
|
||||
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
|
||||
|
||||
Images are resolved relative to docs/ (the parent of business-plan/).
|
||||
Plan A (~180M THB) and Plan B (~225M 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
|
||||
|
||||
@@ -14,14 +17,21 @@ 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
|
||||
OUT = HERE.parent / "CNX-Vinyl-Business-Plan.docx"
|
||||
VERSION = "draft 0.3, October 2026"
|
||||
|
||||
|
||||
def main(out: Path = OUT) -> Path:
|
||||
r = Renderer(DOCS, header_text="CNX Vinyl / Poy Records: Business plan, draft 0.2, 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)
|
||||
@@ -29,5 +39,8 @@ def main(out: Path = OUT) -> Path:
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
target = Path(sys.argv[1]) if len(sys.argv) > 1 else OUT
|
||||
print(main(target))
|
||||
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))
|
||||
Reference in new issue
Block a user