Deploy test site / deploy (push) Successful in 52s
- 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.
37 lines
978 B
Python
37 lines
978 B
Python
"""Which version of the business plan is being built (October 2026).
|
|
|
|
Plan A, ~180M THB: the launch plant (1 Duplex system + 1 Classic, every machine) with six cost levers.
|
|
Plan B, ~210M THB: the same launch plant with everything in (none of the six levers).
|
|
Both are priced without contingency and with the ramp-up reserve
|
|
(docs/finance/total-investment.md, "Two plans").
|
|
|
|
build_plan.py sets PLAN before it calls the content modules' blocks(); call pick() and the
|
|
helpers inside blocks(), never at import time.
|
|
"""
|
|
PLAN = "A"
|
|
|
|
NAME = {"A": "Plan A", "B": "Plan B"}
|
|
PRICE = {"A": "~180M THB", "B": "~210M THB"}
|
|
|
|
|
|
def is_a() -> bool:
|
|
return PLAN == "A"
|
|
|
|
|
|
def is_b() -> bool:
|
|
return PLAN == "B"
|
|
|
|
|
|
def pick(a, b):
|
|
"""The Plan A or the Plan B variant of a value, text or list of blocks."""
|
|
return a if PLAN == "A" else b
|
|
|
|
|
|
def name() -> str:
|
|
return NAME[PLAN]
|
|
|
|
|
|
def label() -> str:
|
|
"""e.g. 'Plan A (~180M THB)'."""
|
|
return f"{NAME[PLAN]} ({PRICE[PLAN]})"
|