diff --git a/README.md b/README.md index ffc11ec..d67dc54 100644 --- a/README.md +++ b/README.md @@ -70,11 +70,14 @@ steps are open planning items. - The plant now launches with everything in one capital round (October 2026): one Newbilt Duplex system and one Classic, a Pheenix galvanics line, the Sibert stamper-prep line, a Sillitoe cutting room and the - modular boiler and chiller plant. The investor asked whether it can be - built for 180M THB, possibly 20 % more: on current estimates it costs - ~161M to 292M THB (midpoint ~227M), so 216M is a realistic target with - four levers and 180M a low-quote case + modular boiler and chiller plant: ~161M to 285M THB with contingency + (midpoint ~223M), the Pheenix line priced at OMS's reference plus 20 % ([total investment](docs/finance/total-investment.md#launch-plant-october-2026)). + For the investor the business plan comes in two versions, priced + without contingency and with the ramp-up reserve + ([two plans](docs/finance/total-investment.md#two-plans-a-at-180m-thb-and-b-at-225m-thb-october-2026)): + **Plan A, ~177M THB**, the launch plant with six cost levers, and + **Plan B, ~224M THB**, five presses with the second Duplex at launch. Chinese boilers, compressor and hydraulics save about 2M THB of that ([Chinese suppliers](docs/suppliers/china-utilities.md)). The business plan is re-based on it (draft 0.2). @@ -277,9 +280,10 @@ The detail lives in dedicated documents: output capacity, building area, land, electrical demand, solar and storage, steam and fuel, headcount, and money cross-references - [Total investment](docs/finance/total-investment.md): the launch plant - decided in October 2026 (~161M to 292M THB, ~4.9M to 8.9M USD, midpoint - ~227M THB) with the basis of every block, and the answer to the - investor's 180M / 216M THB question; the earlier full vision and phased + decided in October 2026 (~161M to 285M THB, ~4.9M to 8.6M USD, midpoint + ~223M THB) with the basis of every block, the two plans for the investor + (Plan A ~180M, Plan B ~225M THB, without contingency), and the earlier + answer to the 180M / 216M question; the earlier full vision and phased entry are kept as superseded - [Phase 1 construction RFQ](docs/finance/phase1-construction-rfq.md): the spec sheet for asking a contractor to price the phase 1 buildings @@ -287,8 +291,10 @@ The detail lives in dedicated documents: - [Revenue model](docs/finance/revenue-model.md): pricing, direct cost and margin per record, the launch plant's operating picture at the planned 60 % specials (central revenue ~3.65M USD a year on ~0.74M - records, EBITDA ~1.7M, payback ~3.8 years on 216M THB; the adverse case - loses money), the five-press table, and the levers and + records, EBITDA ~1.7M; the adverse case loses money), the operating + pictures of Plan A (payback ~3.1 years on ~177M THB) and Plan B + (1.25M records, EBITDA ~3.1M USD, payback ~2.2 years on ~224M THB, if + the records sell), the five-press table, and the levers and caveats behind the numbers - [Business plan](docs/business-plan/CNX-Vinyl-Business-Plan.docx): the investor-facing roll-up of everything above, built from diff --git a/docs/equipment/galvanics.md b/docs/equipment/galvanics.md index 83b5c8d..6d10f2e 100644 --- a/docs/equipment/galvanics.md +++ b/docs/equipment/galvanics.md @@ -241,8 +241,10 @@ What it changes in the plan: on the configuration and the know-how item, is at or below the low end of the USD 320k to 650k galvanics block in [total investment](../finance/total-investment.md). Neither includes - water treatment (its own block) or installation days. Reference prices, - so the block stays until quotes exist. + water treatment (its own block) or installation days. Since October + 2026 the plan prices the Pheenix line at **OMS's reference plus 20 %** + (user decision): EUR 280.8k to 385.2k, ~USD 324k to 445k, replacing the + 320k to 650k estimate until Pheenix quotes. - **Capacity.** 6 to 8 runs in a 7.5-hour working day is roughly an hour a run, which matches the 1 to 1.5 hours per part the cell count below assumes. Full capacity needs 8 to 20 parts a working day, so either diff --git a/docs/finance/revenue-model.md b/docs/finance/revenue-model.md index 1ca40be..b02954e 100644 --- a/docs/finance/revenue-model.md +++ b/docs/finance/revenue-model.md @@ -666,6 +666,78 @@ What it says: investment would add its power price to the energy line instead of capital. +## Operating pictures of Plan A and Plan B (October 2026) + +The business plan comes in two versions +([total investment](total-investment.md#two-plans-a-at-180m-thb-and-b-at-225m-thb-october-2026)): +**Plan A** (~177M THB, the launch plant with six cost levers, three +presses) and **Plan B** (~224M THB, the second Duplex at launch, five +presses), both priced without contingency and with the ramp-up reserve. +Same method and cases as above, at the planned 60 % specials (estimates): + +- **Plan A** runs the launch plant, so volume, price, direct cost, title + services and overheads are those of the table above; only the + depreciation follows its lower capital: the high end of Plan A's blocks + (6.25M USD) over 10 years, the midpoint (4.90M USD) over 12.5, the low + end (3.56M USD) over 15. The solar PPA adds its power price to the + energy line (~0.03M USD a year in the calculator), not shown here. +- **Plan B**'s five presses are not Duplex-limited at 60 % specials: the + four semi-automatic presses (240 to 320 records an hour) carry the + specials and the Classic the rest, so volume is the five-press band, + **1.0 / 1.25 / 1.5M** records. Direct cost per record is the five-press + table's 2.58 / 1.94 / 1.30 USD (the same payroll over more records); + title services 300 / 375 / 400 titles at 580 / 1,155 / 1,730 USD and 60 + / 65 / 70 % contribution (the five-press table's 0.10 / 0.28 / 0.48M); + depreciation on Plan B's blocks: 8.07M USD over 10 years, 6.34M over + 12.5, 4.61M over 15. +- **Payback** is counted on the whole plan price including the ramp-up + reserve (Plan A 3.86M / 5.35M / 6.85M USD, Plan B 4.92M / 6.79M / + 8.67M USD from the low to the high end). + +| USD/yr | A adverse | A central | A favourable | B adverse | B central | B favourable | +|---|---|---|---|---|---|---| +| Records | 0.58M | 0.74M | 0.90M | 1.0M | 1.25M | 1.5M | +| Blended price (60 % specials) | 3.76 | 4.49 | 5.27 | 3.76 | 4.49 | 5.27 | +| Direct cost | 2.70 | 2.00 | 1.35 | 2.58 | 1.94 | 1.30 | +| Pressing contribution | 0.61M | 1.83M | 3.51M | 1.18M | 3.19M | 5.96M | +| Title-services contribution | 0.07M | 0.23M | 0.48M | 0.10M | 0.28M | 0.48M | +| Cash overheads | 0.45M | 0.33M | 0.20M | 0.45M | 0.33M | 0.20M | +| **EBITDA** | **0.23M** | **1.73M** | **3.79M** | **0.83M** | **3.14M** | **6.24M** | +| Depreciation | 0.62M | 0.39M | 0.24M | 0.81M | 0.51M | 0.31M | +| **Operating profit** | **-0.39M** | **1.34M** | **3.55M** | **0.02M** | **2.63M** | **5.93M** | +| Revenue | 2.28M (~75M THB) | 3.65M (~120M THB) | 5.41M (~179M THB) | 3.93M (~130M THB) | 6.05M (~200M THB) | 8.60M (~284M THB) | +| Payback on the plan price (EBITDA, mature year) | ~30 yr | ~3.1 yr (2.2 to 4.0) | ~1.0 yr | ~10.5 yr | ~2.2 yr (1.6 to 2.8) | ~0.8 yr | + +What it says: + +- **Plan A** breaks even on operating profit at **~0.2 million records a + year**; its adverse corner still loses money, because it would need + ~0.9 million records to cover depreciation and the three presses make + 0.58 million at that rate. +- **Plan B** breaks even at ~0.22 million records and its adverse corner + just covers depreciation (~1.0 million records needed, 1.0 million + made): more presses spread the same crews, overheads and title services + over more records. Its central EBITDA is ~1.8 times Plan A's for ~27 % + more money. +- **But Plan B only earns this if the records sell.** Its central case + needs ~1.25 million records a year, ~0.75 million of them special + editions, against 0.74 million for Plan A; nothing in the market data + so far shows that demand (roadmap item 1). The ramp to that volume is + longer, and the ramp-up reserve (10M to 20M THB) is the same estimate + as for Plan A. +- **The caveats above hold for both:** central EBITDA margins of ~47 % + (A) and ~52 % (B) are far above the 15 to 25 % pressing plants earn, + the cost of specials is not in the direct cost yet, and neither plan + carries a contingency. Treat the adverse columns as the honest ones. + +The [calculator](../fleet-calculator.html) presets, at the team's +planning rates (3 records a minute per Duplex system) and its own cost +build-up, give: **Plan A** at 850k records EBITDA 2.04M USD, payback 2.4 +years on the investment, cash payback in year ~3.9 and ~25 % IRR over ten +years with the reserve in year 0; **Plan B** at 1.25M records EBITDA +3.25M USD, payback 2.0 years, cash payback in year ~3.3 and ~32 % IRR +(pre-tax, pre-financing, estimates). + ## Operating picture at full capacity (five-press fleet) The fleet this table describes (two Duplex systems and a Classic) is now diff --git a/docs/finance/total-investment.md b/docs/finance/total-investment.md index 785c96a..a739f57 100644 --- a/docs/finance/total-investment.md +++ b/docs/finance/total-investment.md @@ -44,7 +44,7 @@ on two shifts (estimate: the [scale](../scale.md) basis gives ~0.71 to | Phase 0: BOI consultant, legal and lease work, soil test, re-quotes | 40k – 80k | 1.3M – 2.6M | estimate | | Newbilt Duplex system (two HRP 12, EX 50 + EX 35, trimmer, label oven, shrink wrapper, grinder, label punch) | 350k – 370k | 11.6M – 12.2M | 2024 quote EUR 200,500 for the Single 2.1 plus the quoted second press and extruder ~USD 115k; expired, re-quote | | Newbilt Classic | 290k – 460k | 9.6M – 15.2M | placeholder (the old AD12 band per press); **no Newbilt price on file** | -| Pheenix galvanics line (PASU, PPPU, PDPU, PMPB) | 320k – 650k | 10.6M – 21.4M | estimate; **no Pheenix price on file**; OMS's reference prices for a 4-cell wet room (EUR 224k to 311k, ~USD 259k to 359k) sit at the low end | +| Pheenix galvanics line (PASU, PPPU, PDPU, PMPB) | 324k – 445k | 10.7M – 14.7M | **OMS's reference plus 20 %** (user, October 2026): OMS's 4-cell wet room with the know-how transfer, EUR 234k to 321k (~USD 270k to 371k, [galvanics](../equipment/galvanics.md#oms-introduction-letter-9-october-2026)), as the price basis for the Pheenix line; **no Pheenix price on file** (was 320k to 650k, estimate) | | Galvanics water: ZLD evaporator and DI water | 97k – 258k | 3.2M – 8.5M | [utilities CSV](utilities-investment.csv) rows, now launch scope | | Water-treatment building next to galvanics (~12 × 10 m, proposed) | 52k – 87k | 1.7M – 2.9M | estimate at the building rate below | | Sibert VSF, VSP, VSC | 250k | 8.3M | Sibert's budget confirmation, 5 October 2026; its time, spares, shipping and travel in the freight and working-capital lines | @@ -61,9 +61,9 @@ on two shifts (estimate: the [scale](../scale.md) basis gives ~0.71 to | Cassette duplication and CD-R duplication | 55k – 190k | 1.8M – 6.3M | estimate, business plan sections 4.8 and 4.9 | | Freight, installation, commissioning, training (Pheenix, Sibert, Sillitoe, Newbilt beyond its quoted 5 days) | 150k – 300k | 5.0M – 9.9M | estimate | | Working capital, PVC stock, spares, lease deposit, first-year rent | 135k – 290k | 4.5M – 9.6M | estimate; land is leased, so no land purchase | -| Subtotal | ~4.24M – 7.71M | ~140M – 254M | | -| Contingency 15 % | ~0.64M – 1.16M | ~21M – 38M | | -| **Total, launch plant** | **~4.9M – 8.9M USD** | **~161M – 292M THB** | midpoint ~6.9M USD, ~227M THB | +| Subtotal | ~4.24M – 7.50M | ~140M – 248M | midpoint ~5.87M USD, ~194M THB | +| Contingency 15 % | ~0.64M – 1.13M | ~21M – 37M | | +| **Total, launch plant** | **~4.9M – 8.6M USD** | **~161M – 285M THB** | midpoint ~6.76M USD, ~223M THB | Not in the total: a **reserve for the ramp-up** (staff hired before first revenue, overheads until volume covers them; ~10M to 20M THB, estimate), @@ -78,6 +78,11 @@ import VAT paid at the border and reclaimed later (estimates). ### The investor's question: 180M THB, maybe 20 % more (October 2026) +*Superseded by [Two plans](#two-plans-a-at-180m-thb-and-b-at-225m-thb-october-2026) +below. Written against the earlier Pheenix estimate (USD 320k to 650k, +total ~227M THB at the midpoint); its galvanics lever is now the base +price.* + The project's investor asked whether the plant can be built for **180M THB (~5.45M USD), possibly up to 20 % more (216M THB, ~6.55M USD)**. @@ -126,6 +131,72 @@ building RFQ with a soil test, and distributor quotes for the metrology stack. Until they are in, quote **~216M THB** to the investor as the target with the levers above, and 180M as the low-quote case. +## Two plans: A at ~180M THB and B at ~225M THB (October 2026) + +Decided (user, October 2026): the business plan comes in **two +versions** for the investor, built from the same documents: + +- **Plan A, ~180M THB**: the launch plant with every machine decided + above (one Duplex system, one Classic, galvanics, Sibert, the cutting + room), brought down with six cost levers. +- **Plan B, ~225M THB (Plan A plus 25 %)**: the second Duplex system at + launch, so five presses, with everything in. + +Both are priced **without contingency** (user decision) and **with the +ramp-up reserve**, because the reserve is cash the investor puts in +before volume carries the plant. Pheenix galvanics is priced at OMS's +reference plus 20 % in both. Midpoints, estimates: + +| Plan A: launch plant with six levers | Saves | Subtotal after it | +|---|---|---| +| Launch plant, every block, no contingency | | ~193.8M THB (~5.87M USD) | +| Rooftop solar and battery through a solar PPA (the installer owns and finances the array, the plant buys the power) | ~10.7M | ~183.1M | +| Metrology launch tier: XRF, inline vision and audio station at launch; laser confocal and wide-area profiler (USD 180k to 350k) bought from revenue | ~8.8M | ~174.4M | +| Visitor corridor built later; no public tours at first | ~3.6M | ~170.8M | +| Cassette and CD-R duplication later | ~4.0M | ~166.8M | +| Crane rented for the installations; frame, runway and machine door stay crane-ready | ~3.2M | ~163.6M | +| Boilers and compressor through the Chinese route ([Chinese suppliers](../suppliers/china-utilities.md)) | ~1.9M | **~161.7M (~4.90M USD)** | +| Ramp-up reserve | | +10M to 20M | +| **Plan A** | | **~177M THB (~5.35M USD)**, ~127M to 226M from the low to the high end of every block | + +| Plan B: five presses, everything in | USD | THB, midpoint | +|---|---|---| +| Launch plant, every block, no contingency | 4.24M – 7.50M | ~193.8M | +| Second Duplex system: two HRP 12, EX 50 and EX 35 (calculator basis: two presses at the quoted ~115k per press and extruder set, plus hydraulic unit and EX 35; no EX 35 price on file) | 230k – 300k | +8.7M | +| Third chiller module, CH-3 (250 kW; the two boiler modules carry 750 to 900 kg/h) | 48k – 78k | +2.1M | +| Freight and installation for the extra machinery | 24k – 48k | +1.2M | +| Working capital for ~1.25M records a year instead of 0.85M | 64k – 139k | +3.4M | +| Subtotal | **4.61M – 8.07M** | **~209.2M (~6.34M USD)** | +| Ramp-up reserve | | +10M to 20M | +| **Plan B** | | **~224M THB (~6.79M USD)**, ~162M to 286M from the low to the high end of every block | + +Plan B keeps what Plan A gives up: owned solar and battery (and with +them the BOI solar measure), the full metrology stack, the visitor +corridor, the bought crane, cassette and CD-R, Thai-supplied utilities. +Its five presses make ~1.0 to 1.5 million records a year at the planned +60 % specials (the [scale](../scale.md#production-capacity) basis; not +Duplex-limited), against ~0.58 to 0.90 million for Plan A's three; the +operating pictures of both are in the +[revenue model](revenue-model.md#operating-pictures-of-plan-a-and-plan-b-october-2026). +The [plant and business plan calculator](../fleet-calculator.html) has +both as presets. + +**Not in either plan price:** +- **Contingency.** The blocks are budgetary (plus or minus 30 to 50 % on + the estimates, top of this page), so the plans carry no buffer for + quotes landing high. At this page's 15 % that would be ~24M THB on + Plan A and ~31M on Plan B at the midpoint. +- The central hydraulic plant (not costed yet), the archive's mobile + shelving (to quote), CD replication, financing costs, currency moves, + and Thai duty and import VAT (the blocks assume BOI promotion). + +**What decides between them:** demand. Plan B needs ~1.25 million records +sold a year in its central case, about 70 % more than Plan A's 0.74 +million, three fifths of them special editions; market validation +(roadmap item 1) is the evidence for that. Plan A keeps the second Duplex +as a growth step from revenue, with its floor, utility positions and +ring-main tees reserved. + ## Full vision, all blocks (July 2026, superseded) The five-press full vision below is superseded by the launch plant above. diff --git a/docs/fleet-calculator.html b/docs/fleet-calculator.html index c91b343..2933f0b 100644 --- a/docs/fleet-calculator.html +++ b/docs/fleet-calculator.html @@ -599,7 +599,7 @@ html[data-theme=light] .iso-svg .iso-glint { display: inline; } presses, an EX 50 and an EX 35 colour extruder each) and Newbilt Classic automatic presses, starting from the launch plant: one Duplex system and one Classic. It builds the investment from the blocks in total-investment.md, - checks it against the investor's 180M and 216M THB, runs the P&L and a + checks it against Plan A's 180M and Plan B's 225M THB, runs the P&L and a ten-year cash sketch, and lists what the plant needs: people, power, central hydraulics, steam, cooling, compressed air, floor, compound and stampers. Vendor figures are marked as such; the rest are planning figures and @@ -609,9 +609,9 @@ html[data-theme=light] .iso-svg .iso-glint { display: inline; }
Presets: - + + -
@@ -730,10 +730,12 @@ html[data-theme=light] .iso-svg .iso-glint { display: inline; }
-

Budget: the investor's question

-

The investor asked whether the plant can be built for 180M THB, possibly - 20 % more (216M THB). Bars: the investment at the low end, the midpoint and the high end of every block - (contingency included), plus the ramp-up reserve when it is in the budget (hatched).

+

Budget: Plan A and Plan B

+

Two plans for the investor (October 2026): Plan A at ~180M THB keeps every + machine of the launch plant with six cost levers, Plan B at ~225M THB (+25 %) launches with the second Duplex + system and everything in; both priced without contingency and with the ramp-up reserve. Bars: the investment + at the low end, the midpoint and the high end of every block (contingency as set under Plant configuration), + plus the ramp-up reserve when it is in the budget (hatched).

@@ -2842,7 +2844,7 @@ const S0 = { priceStd: 3.8, premSpec: 1.15, titleFee: 1155, cur: "USD", boi: "on", exportShare: 70, capexEnd: "mid", // plant configuration (defaults = the launch plant, total-investment.md October 2026) galv: "in", galvPrice: "pheenix", cut: "in", metro: "full", cass: "on", cdr: "on", countCD: "off", - solar: "buy", steamFuel: "electric", sourcing: "thai", crane: "buy", corridor: "now", reserve: "in", stSupply: 0, + solar: "buy", steamFuel: "electric", sourcing: "thai", crane: "buy", corridor: "now", reserve: "in", cont: "in", stSupply: 0, }; // allowed values of every switch, default first where it matters for readHash const ENUM = { @@ -2850,9 +2852,9 @@ const ENUM = { capexEnd: ["low", "mid", "high"], galv: ["in", "bought"], galvPrice: ["pheenix", "oms"], cut: ["in", "out"], metro: ["full", "launch"], cass: ["on", "off"], cdr: ["on", "off"], countCD: ["off", "on"], solar: ["buy", "ppa", "none"], steamFuel: ["electric", "biomass"], sourcing: ["thai", "china"], - crane: ["buy", "rent"], corridor: ["now", "later"], reserve: ["in", "sep"], + crane: ["buy", "rent"], corridor: ["now", "later"], reserve: ["in", "sep"], cont: ["in", "sep"], }; -const CFGK = ["galv", "galvPrice", "cut", "metro", "cass", "cdr", "countCD", "solar", "steamFuel", "sourcing", "crane", "corridor", "reserve", "stSupply"]; +const CFGK = ["galv", "galvPrice", "cut", "metro", "cass", "cdr", "countCD", "solar", "steamFuel", "sourcing", "crane", "corridor", "reserve", "cont", "stSupply"]; // [group, id, label, value, unit, kind, source] const AS = []; function grp(g, rows) { rows.forEach(r => AS.push([g].concat(r))); } @@ -3008,8 +3010,8 @@ rng("Investment blocks (USD unless THB)", [ ["dup1", "Newbilt Duplex system, the first", 350000, 370000, "USD", "doc", "total-investment.md: 2024 quote EUR 200,500 for the Single 2.1 plus the quoted second press and extruder ~USD 115k; expired, re-quote"], ["dupN", "Each further Duplex system", 230000, 300000, "USD", "est", "total-investment.md added scope: two presses at the quoted ~115k per press and extruder set, plus hydraulic unit and EX 35; no EX 35 price on file"], ["cla", "Each Newbilt Classic", 290000, 460000, "USD", "est", "total-investment.md: placeholder (the old AD12 band per press); no Newbilt price on file"], - ["gPh", "Pheenix galvanics line (PASU, PPPU, PDPU, PMPB), Pheenix estimate", 320000, 650000, "USD", "est", "total-investment.md: no Pheenix price on file"], - ["gOms", "Galvanics line priced near OMS's reference", 259000, 359000, "USD", "vendor", "OMS letter, 9 October 2026: 4-cell wet room EUR 224k basic to 311k advanced, at 1.155 USD; used as a price basis for the Pheenix line (investor lever)"], + ["gPh", "Pheenix galvanics line (PASU, PPPU, PDPU, PMPB), OMS reference plus 20 %", 324000, 445000, "USD", "est", "total-investment.md (user, October 2026): OMS's 4-cell wet room with the know-how transfer, EUR 234k to 321k (letter, 9 October 2026), plus 20 %; no Pheenix price on file"], + ["gOms", "Galvanics wet room bought from OMS directly", 270000, 371000, "USD", "vendor", "OMS letter, 9 October 2026: EUR 224k basic to 311k advanced plus the EUR 10k know-how transfer, at 1.155 USD; reference prices, not a quote"], ["gWat", "Galvanics water: ZLD evaporator and DI water", 3200000, 8500000, "THB", "est", "Utilities CSV rows ZLD 3.0 to 8.0M and RO/DI 0.2 to 0.5M THB, market estimates"], ["wtb", "Water-treatment building next to galvanics, ~12 × 10 m", 1700000, 2900000, "THB", "est", "total-investment.md: estimate at the building rate"], ["sib", "Sibert VSF, VSP, VSC", 250000, 250000, "USD", "vendor", "Sibert's budget confirmation, 5 October 2026; its time, spares, shipping and travel in the freight and working-capital lines"], @@ -3048,8 +3050,8 @@ grp("Investment rules", [ ["craneRent", "Crane rented for the installations, share of the crane block", 40, "%", "est", "Frame stays crane-ready; total-investment.md: saves ~3.7M THB at the midpoint"], ["wcRef", "Records a year the working capital is sized for", 840000, "", "doc", "revenue-model.md launch plant, central volume"], ["wcMin", "Working capital never below", 60, "%", "est", "Estimate"], - ["budgetLo", "Investor's budget", 180000000, "THB", "doc", "total-investment.md: the investor's question, 180M THB"], - ["budgetHi", "Investor's budget plus 20 %", 216000000, "THB", "doc", "total-investment.md: 216M THB"], + ["budgetLo", "Plan A budget", 180000000, "THB", "doc", "total-investment.md: Plan A, ~180M THB without contingency, ramp-up reserve included"], + ["budgetHi", "Plan B budget, Plan A plus 25 %", 225000000, "THB", "doc", "total-investment.md: Plan B, ~225M THB (user, October 2026)"], ]); grp("Ten years of cash", [ ["ramp1", "Sold output in year 1", 35, "% of the mature year", "est", "Estimate"], @@ -3089,9 +3091,10 @@ const CFG0 = Object.fromEntries(CFGK.map(k => [k, S0[k]])); const LAUNCH = { mode: "target", target: 850000, grow: "classic", dMin: 1, cMin: 1, dFleet: 1, cFleet: 1, ...CFG0 }; const PRESETS = { launch: LAUNCH, - levers: { ...LAUNCH, solar: "ppa", metro: "launch", galvPrice: "oms", corridor: "later" }, + // Plan A (~180M THB) and Plan B (~225M THB): total-investment.md "Two plans", priced without contingency + planA: { ...LAUNCH, solar: "ppa", metro: "launch", corridor: "later", cass: "off", cdr: "off", crane: "rent", sourcing: "china", cont: "sep" }, + planB: { mode: "target", target: 1250000, grow: "classic", dMin: 2, cMin: 1, dFleet: 2, cFleet: 1, ...CFG0, cont: "sep" }, lean: { ...LAUNCH, galv: "bought", cut: "out" }, - five: { mode: "fleet", dFleet: 2, cFleet: 1, ...CFG0 }, full: { mode: "fleet", dFleet: 5, cFleet: 4, ...CFG0 }, }; @@ -3215,7 +3218,7 @@ function capexOf(r, c = S, boiOn = c.boi !== "off") { if (r.C > 0) blk("Presses", "cla", r.C === 1 ? "Newbilt Classic" : `Newbilt Classic: ${r.C} ×`, r.C, false, { imp: 1, frt: 1 }); if (galvIn) { const oms = c.galvPrice === "oms"; - blk("Galvanics and stamper prep", oms ? "gOms" : "gPh", `Pheenix galvanics line (PASU, PPPU, PDPU, PMPB), ${oms ? "priced near OMS's reference" : "Pheenix estimate"}`, + blk("Galvanics and stamper prep", oms ? "gOms" : "gPh", oms ? "Galvanics wet room bought from OMS directly (4 cells)" : "Pheenix galvanics line (PASU, PPPU, PDPU, PMPB), OMS reference plus 20 %", 1, false, { imp: 1, frt: 1, frtMid: (A.gPhLo + A.gPhHi) / 2 }); blk("Galvanics and stamper prep", "gWat", "Galvanics water: ZLD evaporator and DI water", 1, true, { imp: 1 }); blk("Galvanics and stamper prep", "wtb", "Water-treatment building next to galvanics, ~12 × 10 m", 1, true); @@ -3263,15 +3266,16 @@ function capexOf(r, c = S, boiOn = c.boi !== "off") { const sumOf = (f, k) => rows.filter(f).reduce((a, x) => a + x[k], 0), all = () => true; const cont = Math.max(0, A.contPct) / 100; const sub = tri(sumOf(all, "lo"), sumOf(all, "hi")); - const ctg = tri(sub.lo * cont, sub.hi * cont); - const tot = tri(sub.lo + ctg.lo, sub.hi + ctg.hi); + const ctg = tri(sub.lo * cont, sub.hi * cont), ctgIn = c.cont !== "sep"; + // Plan A and Plan B are priced without contingency (user, October 2026): then it is shown, not added + const tot = ctgIn ? tri(sub.lo + ctg.lo, sub.hi + ctg.hi) : tri(sub.lo, sub.hi); const imp = tri(sumOf(x => x.imp, "lo"), sumOf(x => x.imp, "hi")); const dr = boiOn ? 0 : Math.max(0, A.dutyMach) / 100; const duty = tri(imp.lo * dr, imp.hi * dr); const vat = tri(boiOn ? 0 : (imp.lo + duty.lo) * A.vatRate / 100, boiOn ? 0 : (imp.hi + duty.hi) * A.vatRate / 100); const res = tri(T(A.resLo), T(A.resHi)); const withDuty = tri(tot.lo + duty.lo, tot.hi + duty.hi); - return { rows, sub, ctg, cont, tot, imp, duty, vat, res, all: withDuty, fr, wf, boiOn }; + return { rows, sub, ctg, ctgIn, cont, tot, imp, duty, vat, res, all: withDuty, fr, wf, boiOn }; } // Money a year in USD. Lines: [group, label, USD, basis]. function econ(r, b, boiOn = S.boi !== "off") { @@ -3607,9 +3611,9 @@ const CFG = [ h: { in: "Fathers, mothers and stampers made here; the plating share of the title fee earns its contribution.", bought: "Stampers bought in and passed through at cost: no galvanics line, operators, ZLD or water-treatment building." } }, { k: "galvPrice", t: "Galvanics price basis", sub: "only with galvanics in-house", - o: [["pheenix", "Pheenix estimate"], ["oms", "Near OMS reference"]], - h: { pheenix: () => `${kU("gPh")} USD; no Pheenix price on file.`, - oms: () => `${kU("gOms")} USD: OMS's reference for a 4-cell wet room, EUR 224k to 311k (letter, 9 October 2026).` }, + o: [["pheenix", "Pheenix (OMS +20 %)"], ["oms", "OMS directly"]], + h: { pheenix: () => `${kU("gPh")} USD: OMS's reference for a 4-cell wet room plus 20 % (user, October 2026); no Pheenix price on file.`, + oms: () => `${kU("gOms")} USD: OMS's 4-cell wet room, EUR 234k to 321k with the know-how transfer (letter, 9 October 2026).` }, dis: () => S.galv === "bought" ? "Not applicable: the stampers are bought in." : "", extra: `` }, { k: "cut", t: "Mastering and cutting room", sub: "Sillitoe SDMS lathe, console and chain, room", @@ -3654,6 +3658,10 @@ const CFG = [ o: [["in", "In the budget"], ["sep", "Shown separately"]], h: { in: "Added to the budget bars and to year 0 of the cash view; never to the investment total.", sep: "Left out of the budget bars and year 0; shown as a line under the investment." } }, + { k: "cont", t: "Contingency", sub: "15 % of the subtotal (Assumptions)", + o: [["in", "In the total"], ["sep", "Shown separately"]], + h: { in: "Added to the investment total, as in the launch plant roll-up of total-investment.md.", + sep: "Left out of the total, as Plan A and Plan B are priced (user, October 2026); shown as a line under the subtotal." } }, ]; function buildCfg() { $("cfg").innerHTML = CFG.map(c => `
${c.t}${c.sub}
` + @@ -3700,8 +3708,8 @@ function renderInvest(e, r) { const TR = (l, o, s, tot) => H.push(`${l}${money(o.lo)}${money(o.mid)}${money(o.hi)}${s || ""}`); H.push(`Totals`); TR("Subtotal", cx.sub, "", true); - TR(`Contingency ${f1(A.contPct)} %`, cx.ctg, "total-investment.md"); - TR("Total investment", cx.tot, "for reference, the launch plant in total-investment.md: ~161M to 292M THB, midpoint ~227M", true); + TR(cx.ctgIn ? `Contingency ${f1(A.contPct)} %` : `Contingency ${f1(A.contPct)} % (not in the total)`, cx.ctg, cx.ctgIn ? "total-investment.md" : "shown separately, as in Plan A and Plan B"); + TR("Total investment", cx.tot, "for reference, total-investment.md: the launch plant ~161M to 285M THB with contingency (midpoint ~223M); Plan A ~162M and Plan B ~209M at the midpoint without it, plus the ramp-up reserve", true); if (!cx.boiOn) { TR(`Import duty without BOI, ${f1(A.dutyMach)} %`, cx.duty, `on ${money(cx.imp.lo)} to ${money(cx.imp.hi)} of imported machinery; import VAT ${money(cx.vat.mid)} at the midpoint, reclaimable`); TR("Total with import duty", cx.all, "", true); @@ -3709,7 +3717,7 @@ function renderInvest(e, r) { TR("Ramp-up reserve (not in the total)", cx.res, S.reserve === "in" ? "in the budget bars and year 0 of the cash view" : "shown separately"); if (S.reserve === "in") TR("Total with the reserve", { lo: cx.all.lo + cx.res.lo, mid: cx.all.mid + cx.res.mid, hi: cx.all.hi + cx.res.hi }, "what the budget card compares", true); $("ivT").innerHTML = `BlockLowMidHighBasis${H.join("")}`; - $("ivK").innerHTML = kpi(money(cx.all.lo), "low end, contingency included") + kpi(money(cx.all.mid), "midpoint") + + $("ivK").innerHTML = kpi(money(cx.all.lo), cx.ctgIn ? "low end, contingency included" : "low end, without contingency") + kpi(money(cx.all.mid), "midpoint") + kpi(money(cx.all.hi), "high end") + kpi(thbM(cx.all.mid), `midpoint in THB (${thbM(cx.all.lo)} to ${thbM(cx.all.hi)})`); const fl = []; if (r.nb > A.modRooms) fl.push(["warn", `${r.nb} boiler modules: beyond the boiler hall built for ${f0(A.modRooms)}; a second hall is not in the investment.`]); @@ -3735,7 +3743,7 @@ function renderBudget(e) { `
against ${M(B1)}: ${gap(tot, B1)} · against ${M(B2)}: ${gap(tot, B2)}
`; }).join(""); const mid = V[1], mt = mid.cap + mid.res, rLo = cx.res.lo * fx, rHi = cx.res.hi * fx; - $("budK").innerHTML = kpi(M(mid.cap) + " THB", "investment at the midpoint, contingency included") + + $("budK").innerHTML = kpi(M(mid.cap) + " THB", `investment at the midpoint, ${cx.ctgIn ? "contingency included" : "without contingency"}`) + kpi(`${M(mid.cap + rLo)} to ${M(mid.cap + rHi)}`, `THB with the ramp-up reserve (${M(rLo)} to ${M(rHi)})`) + kpi(mt <= B2 ? M(B2 - mt) : "+" + M(mt - B2), `${mt <= B2 ? "to spare under" : "over"} ${M(B2)} THB at the midpoint${inB ? ", reserve included" : ""}`); const verdict = mt <= B2 ? `Mid fits ${M(B2)} with ${M(B2 - mt)} to spare` : `Mid is ${M(mt - B2)} over ${M(B2)}`; diff --git a/docs/roadmap.md b/docs/roadmap.md index 103ebb9..0035083 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -170,8 +170,9 @@ Nothing in Phases 2 to 5 starts before its gate clears: no machinery order before the BOI certificate, no big-block spending before the market validates the price, no coppice fuel planning before the land title check. Since October 2026 the plant launches with everything in one capital -round (~161M to 292M THB, target ~216M with the levers in -[total investment](finance/total-investment.md#launch-plant-october-2026)); +round (~161M to 285M THB with contingency; for the investor Plan A at +~180M and Plan B at ~225M THB without it, in +[total investment](finance/total-investment.md#two-plans-a-at-180m-thb-and-b-at-225m-thb-october-2026)); the gates still come before the round is spent, and the growth options (more Duplex systems first, then Classics, in a press hall laid out for five Duplex systems and four Classics) are funded from revenue.