Solar on every roof, BOI solar correction, open source section
Deploy test site / deploy (push) Successful in 54s
Solar (user, 17 Oct 2026: "use as much roof space as possible") - PV on every roof and canopy: ~640 kWp on the Payap scenario plot (factory roof ~523, canopies ~54, flat office roof ~65 kWp around the AC units); ~300 kWp on the Mueang Chi hall. Calculator: pvKWp 640, new pvSelf 85 % (zero export, hourly sketch), PV cost per kWp times the array, office-roof PV in the iso view, roofs drawn full. - 12.8M to 16.6M THB at 20 to 26 THB/W; CSV baseline 34.37M to 56.34M; launch plant ~168M / 231M / 294M THB with contingency; Plan B ~216M (label ~215M), ~39M above Plan A; Plan A unchanged (it leases the array), its solar lever ~17.5M. PV payback ~4.2 to 5.9 years. - Permits (rooftop solar no factory licence since 28 Dec 2024, ERC exemption under 1,000 kVA, PEA zero export) and PPA discounts sourced in sustainability.md. BOI correction - Announcement 3/2568 (in force 1 July 2025) ended BOI promotion for solar installations; only the battery may qualify (12M THB per MW cap). Removed the "BOI solar measure" from boi.md, total-investment, revenue-model, sustainability, site-candidates and both plan versions; Plan B's case for owning the array is the PPA bill it avoids (~0.07M USD a year). Open source (user, 17 Oct 2026) - digital-factory.md "Open source throughout, and working with other plants": everything we run and build is open source on NixOS, our code published (licence to decide), vendor firmware the stated exception; later the stack and factory-automation services for other pressing plants, not in the revenue. - Business plan section 5.6 plus an executive-summary bullet, reading guide and not-modelled mentions; draft 0.3 rebuilt (A 60, B 61 pages), renders re-made with the roofs full.
No files matched your search
@@ -70,14 +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: ~160M to 283M THB with contingency
|
||||
(midpoint ~222M), the Pheenix line priced at OMS's reference plus 20 %
|
||||
modular boiler and chiller plant: ~168M to 294M THB with contingency
|
||||
(midpoint ~231M, PV on every roof and canopy), 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-210m-thb-october-2026)):
|
||||
([two plans](docs/finance/total-investment.md#two-plans-a-at-180m-thb-and-b-at-215m-thb-october-2026)):
|
||||
**Plan A, ~177M THB**, the launch plant with six cost levers, and
|
||||
**Plan B, ~208M THB**, the same launch plant with everything in.
|
||||
**Plan B, ~216M THB**, the same launch plant with everything in.
|
||||
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).
|
||||
@@ -171,7 +171,9 @@ The detail lives in dedicated documents:
|
||||
that has to exist for environment, machine, QC and genealogy data to land
|
||||
in one place keyed to one record identity, with ERPNext as the plant's
|
||||
only system of record (every tool we build reads and writes it; only
|
||||
machine data stays outside): the plant as one more site in B4L's
|
||||
machine data stays outside), everything open source with our own code
|
||||
published and, later, the stack and automation services offered to
|
||||
other pressing plants: the plant as one more site in B4L's
|
||||
existing NixOS fleet (the cnx-network clan: mesh, DNS, fleet
|
||||
monitoring, site gateway module, public proxy), what changes in that
|
||||
repo, VLAN zoning, Telegraf/MQTT acquisition source by source, QC
|
||||
@@ -280,9 +282,9 @@ 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 (~160M to 283M THB, ~4.85M to 8.6M USD, midpoint
|
||||
~222M THB) with the basis of every block, the two plans for the investor
|
||||
(Plan A ~180M, Plan B ~210M THB, without contingency), and the earlier
|
||||
decided in October 2026 (~168M to 294M THB, ~5.1M to 8.9M USD, midpoint
|
||||
~231M THB) with the basis of every block, the two plans for the investor
|
||||
(Plan A ~180M, Plan B ~215M 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):
|
||||
@@ -293,13 +295,13 @@ The detail lives in dedicated documents:
|
||||
planned 60 % specials (central revenue ~3.65M USD a year on ~0.74M
|
||||
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 (the
|
||||
same output, payback ~3.6 years on ~208M THB: its extra pays back
|
||||
same output, payback ~3.8 years on ~216M THB: its extra pays back
|
||||
through what the table leaves out), the five-press table, and the levers and
|
||||
caveats behind the numbers
|
||||
- Business plan, draft 0.3 (October 2026), in two versions:
|
||||
[Plan A, ~180M THB](docs/business-plan/CNX-Vinyl-Business-Plan-A.pdf)
|
||||
([docx](docs/business-plan/CNX-Vinyl-Business-Plan-A.docx)) and
|
||||
[Plan B, ~210M THB](docs/business-plan/CNX-Vinyl-Business-Plan-B.pdf)
|
||||
[Plan B, ~215M THB](docs/business-plan/CNX-Vinyl-Business-Plan-B.pdf)
|
||||
([docx](docs/business-plan/CNX-Vinyl-Business-Plan-B.docx)): the
|
||||
investor-facing roll-up of everything above, each a complete plan with
|
||||
one table comparing it with the other, both priced without contingency
|
||||
|
||||
@@ -15,13 +15,25 @@ no corporate income tax holiday on the core pressing activity, but the full
|
||||
non-tax package and machinery duty exemption. The tax value is engineered on
|
||||
top through the upgrade measures, where this project happens to be strong:
|
||||
|
||||
- **Solar and battery**: the alternative-energy measure (Announcement
|
||||
2/2568, April 2025, under the Smart and Sustainable Industry framework)
|
||||
grants CIT exemption based on the solar investment. Eligible spend
|
||||
explicitly includes PV modules, inverters, BESS and BESS inverters, and
|
||||
mounting structures, capped at THB 12M/30M/40M of investment value per MW
|
||||
depending on investment type. The planned Deye + Gobel installation
|
||||
converts directly into CIT-exemption headroom.
|
||||
- **Solar: no longer promoted; the battery may be.** The alternative-energy
|
||||
measure (Announcement 2/2568, April 2025, under the Smart and Sustainable
|
||||
Industry framework) granted a CIT exemption on the solar investment,
|
||||
capped at THB 12M/30M/40M per MW. **Announcement 3/2568** (5 June 2025,
|
||||
in force 1 July 2025) ended promotion for installing solar power
|
||||
generation under that measure for applications from 1 July 2025; what
|
||||
remains is machinery modified to use other renewable energy, and battery
|
||||
storage (BESS) with its inverters, the eligible investment capped at
|
||||
THB 12M per MW
|
||||
([B Global Law](https://bgloballaw.com/2026/01/18/boi-announcement-no-3-2568-amendment-to-renewable-energy-efficiency-enhancement-measures),
|
||||
[Smarter Energy Solution](https://smarterenergysolution.com/blog/boi-solar-thailand-2026),
|
||||
checked October 2026). So owning the ~640 kWp array earns no BOI
|
||||
benefit; its case is the bill (see [sustainability](sustainability.md)).
|
||||
Whether the 271 kWh battery qualifies is for the BOI consultant. A PPA
|
||||
developer selling solar power (200 kW or more per distribution point)
|
||||
can still be promoted under activity 7.1.2 (8-year CIT exemption); that
|
||||
benefit is the developer's, and how much of it reaches the PPA price is
|
||||
a negotiation
|
||||
([CapSolar](https://capsolar.co.th/en/knowledge/boi-solar-incentives-2026)).
|
||||
- **Automation and metrology**: the Smart and Sustainable Industry upgrade
|
||||
measure (Announcement 15/2565, refreshed July 2025) rewards automation,
|
||||
smart machinery, and energy efficiency, typically 3 years of CIT
|
||||
@@ -33,8 +45,8 @@ top through the upgrade measures, where this project happens to be strong:
|
||||
galvanics process development, and recycled-PVC work could be framed as
|
||||
qualifying development.
|
||||
|
||||
So the application is pitched on solar, automation, and technology content,
|
||||
not on "we press plastic discs."
|
||||
So the application is pitched on automation and technology content (and
|
||||
the battery, if it qualifies), not on "we press plastic discs."
|
||||
|
||||
## What Group B still delivers (the core value)
|
||||
|
||||
@@ -119,11 +131,13 @@ project timeline, ahead of equipment contracts.
|
||||
|
||||
- Confirm the exact activity sub-code and tier for vinyl/PVC consumer-goods
|
||||
pressing (Group B assumption is well supported but not code-verified)
|
||||
- Confirm the live versions and per-MW caps of the solar and
|
||||
smart-and-sustainable measures at filing time
|
||||
- Confirm the live version of the smart-and-sustainable measures at
|
||||
filing time, and whether the battery qualifies under the BESS part of
|
||||
the alternative-energy measure (THB 12M per MW cap); solar itself is out
|
||||
since 1 July 2025 (Announcement 3/2568)
|
||||
- Confirm current NEC/Lamphun area add-ons
|
||||
- Engage a BOI-registered consultant to structure the application so the
|
||||
solar, automation, and R&D measures stack on the base promotion
|
||||
automation and R&D measures (and the battery) stack on the base promotion
|
||||
- Check whether R&D contracted with Payap University and the joint student
|
||||
programmes ([Payap partnership](payap-partnership.md)) count toward the
|
||||
R&D merit or a skills-development measure
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
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
|
||||
Plan A (~180M THB) and Plan B (~215M 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/).
|
||||
"""
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
"""Part A: cover, reading guide, executive summary, opportunity, anatomy of the plant.
|
||||
|
||||
Builds Plan A (~180M THB) or Plan B (~210M THB): plan-specific text is switched with
|
||||
Builds Plan A (~180M THB) or Plan B (~215M THB): plan-specific text is switched with
|
||||
plan_variant.pick() inside blocks(), never at import time.
|
||||
"""
|
||||
from plan_lib import H1, H2, H3, P, B, N, T, KV, IMG, CALL, PB, TOC, COVER
|
||||
@@ -23,17 +23,17 @@ def blocks():
|
||||
"**Prepared by:** Simona Meesaiyati (Project Lead) and Alexander Grabowski (Technical Consultant), "
|
||||
"supported by buildfor.life, with Ploy Printing (Chiang Mai) as packaging partner and "
|
||||
"strategic co-investor",
|
||||
f"**Version:** Draft 0.3, October 2026: **{name()}, {pick('~180M THB', '~210M THB')}**",
|
||||
f"**Version:** Draft 0.3, October 2026: **{name()}, {pick('~180M THB', '~215M THB')}**",
|
||||
],
|
||||
note="Confidential. All figures in USD and THB at 1 USD = 33 THB (August 2026). Vendor quotes are "
|
||||
"snapshots at their file dates, not commitments. Every number in this plan is labelled as quoted, "
|
||||
"researched, or estimated; see section 2. " + pick(
|
||||
"This version is Plan A: the launch plant with the whole chain, cutting and galvanics "
|
||||
"included, three presses, brought to ~180M THB (~177M) with six cost levers. A second "
|
||||
"version, Plan B (~210M THB), builds the same plant and takes none of the levers. ",
|
||||
"version, Plan B (~215M THB), builds the same plant and takes none of the levers. ",
|
||||
"This version is Plan B: the launch plant with the whole chain, cutting and galvanics "
|
||||
"included, three presses, with everything in and none of the cost levers taken, at ~210M "
|
||||
"THB (~208M). A second version, Plan A (~180M THB), builds the same plant with six cost "
|
||||
"included, three presses, with everything in and none of the cost levers taken, at ~215M "
|
||||
"THB (~216M). A second version, Plan A (~180M THB), builds the same plant with six cost "
|
||||
"levers. ")
|
||||
+ "The plan price includes the ramp-up reserve and carries no contingency. Cover picture: the "
|
||||
"plant as the plant and business plan calculator draws this plan (schematic, Payap scenario "
|
||||
@@ -63,7 +63,7 @@ def blocks():
|
||||
"sequence. There are no bridge stampers and no outsourced cutting in the plan any more. Draft 0.3 "
|
||||
"prices that plant in **two versions**, both including the ramp-up reserve and neither carrying a "
|
||||
"contingency: **Plan A (~180M THB)**, the launch plant's three presses with six cost levers, and "
|
||||
"**Plan B (~210M THB)**, the same three presses with everything in. " + pick(
|
||||
"**Plan B (~215M THB)**, the same three presses with everything in. " + pick(
|
||||
"**This document is Plan A**, and every section below is written for it; a short table after "
|
||||
"the numbers compares the two versions.",
|
||||
"**This document is Plan B**, and every section below is written for it; a short table after "
|
||||
@@ -98,9 +98,18 @@ def blocks():
|
||||
"(injection-moulded discs) is a separate, much larger decision, outside the totals; both CD "
|
||||
"routes are set out in section 4.10 for the investor to decide.",
|
||||
"**A purpose-built ~1,500 m² plant on long-term leased land**, with a detached utility yard, "
|
||||
+ pick("rooftop solar through a solar power purchase agreement (PPA)",
|
||||
"owned rooftop solar with a battery")
|
||||
+ pick("solar on every roof and canopy (~640 kWp, estimate) through a solar power purchase "
|
||||
"agreement (PPA)",
|
||||
"owned solar on every roof and canopy (~640 kWp, estimate) with a battery")
|
||||
+ " and room for a second building.",
|
||||
"**Open source throughout:** every plant server runs NixOS, declared in one repository in the "
|
||||
"fleet B4L already operates, so any machine is rebuilt from it; ERPNext (no licence fee) is the "
|
||||
"only system of record; and our own code (the factory console, the plant overview, the artist "
|
||||
"platform, the calculator) is published as open source, licence to be chosen. The exception is "
|
||||
"the vendors' own firmware and control software in the machines, instruments and inverters, "
|
||||
"kept as appliances that export data into our systems and run none of our services. Once the "
|
||||
"plant has run this stack in production for at least a year, it and our factory-automation "
|
||||
"services can be offered to other pressing plants; that is not in the revenue (section 5.6).",
|
||||
"**Commissioned in sequence:** the cutting room and galvanics first (the presses need their "
|
||||
"stampers), then " + pick("the Duplex system, then the Classic",
|
||||
"the Duplex system, then the Classic, with cassette and CD-R "
|
||||
@@ -111,18 +120,20 @@ def blocks():
|
||||
"right first; " + pick("the launch plant", "the whole chain at launch")
|
||||
+ " was decided anyway, and that advice is carried as a risk (sections 11.2 and 13).",
|
||||
pick(
|
||||
"**Six cost levers bring the plant to ~180M THB**, from ~193M to ~162M THB at the midpoint "
|
||||
"before the ramp-up reserve (estimates, section 8): rooftop solar and battery through a solar "
|
||||
"PPA (the installer owns and finances the array, the plant buys the power); metrology in two "
|
||||
"**Six cost levers bring the plant to ~180M THB**, from ~201M to ~162M THB at the midpoint "
|
||||
"before the ramp-up reserve (estimates, section 8): solar on every roof and canopy (~640 kWp) "
|
||||
"and the battery through a solar PPA (the installer owns and finances the array, the plant "
|
||||
"buys the power); metrology in two "
|
||||
"steps (XRF, inline vision and the audio station at launch, the laser confocal and the "
|
||||
"wide-area profiler bought from revenue); the visitor corridor built later, so no public tours "
|
||||
"at first; cassette and CD-R duplication later; a mobile crane rented for the installations, "
|
||||
"with frame, runway and machine door kept crane-ready; boilers and compressor through the "
|
||||
"Chinese route. Every press, the cutting room, the galvanics line and the stamper-prep line "
|
||||
"stay in.",
|
||||
"**Everything in, none of the cost levers: ~210M THB**, ~193M THB at the midpoint before the "
|
||||
"ramp-up reserve and ~31M THB more than Plan A (estimates, section 8): owned rooftop solar and "
|
||||
"battery (and with them the BOI solar measure); the full metrology stack from launch (XRF, "
|
||||
"**Everything in, none of the cost levers: ~215M THB**, ~201M THB at the midpoint before the "
|
||||
"ramp-up reserve and ~39M THB more than Plan A (estimates, section 8): owned solar on every "
|
||||
"roof and canopy (~640 kWp) and the battery, so no PPA power bill (~2.3M THB a year in Plan "
|
||||
"A, estimate); the full metrology stack from launch (XRF, "
|
||||
"laser confocal, wide-area profiler, inline vision, audio station); the visitor corridor and "
|
||||
"accessible entrance, so public tours and the Payap student programmes are possible from the "
|
||||
"start; cassette and CD-R duplication; a bought 5 t overhead crane; boilers and compressor "
|
||||
@@ -154,13 +165,17 @@ def blocks():
|
||||
"master.",
|
||||
"**Efficiency designed in.** Heat is recovered before energy is generated: in order, a flue-gas "
|
||||
"economiser if the boiler is fired, as much condensate back to the feed tank as possible, then a "
|
||||
"heat pump that lifts the presses' ~60 °C cooling return into boiler feedwater. The main roof "
|
||||
"carries **~247 kWp** of solar (about 335 to 360 MWh a year, a quarter to a third of mature "
|
||||
"two-shift use; a second building's roof would take the total to ~498 kWp), with a 271 kWh "
|
||||
"battery for ride-through" + pick(
|
||||
", both through the solar PPA: the installer owns and finances them, the plant buys the "
|
||||
"power. ",
|
||||
", both owned by the plant. ")
|
||||
"heat pump that lifts the presses' ~60 °C cooling return into boiler feedwater. Every roof and "
|
||||
"canopy carries solar: **~640 kWp** on the Payap scenario layout (factory roof ~523 kWp, "
|
||||
"parking canopies ~54 kWp, office roof ~65 kWp), about 900 MWh a year, of which ~85 % is used "
|
||||
"on site (~760 MWh, ~38 % of the launch plant's electricity with electric steam); the rest is "
|
||||
"curtailed, because a factory on PEA's grid runs zero export and is not paid for surplus "
|
||||
"(estimates). On the Mueang Chi hall the roof and canopies hold ~300 kWp, so the rest would be "
|
||||
"ground-mounted or wait for the second building's roof. A 271 kWh battery gives ride-through"
|
||||
+ pick(
|
||||
"; array and battery come through the solar PPA: the installer owns and finances them, the "
|
||||
"plant buys the power. ",
|
||||
"; array and battery are owned by the plant. ")
|
||||
+ "Cooling runs as a closed loop, no process water is discharged, "
|
||||
"galvanics rinse water goes through a zero-discharge evaporator, and 20% of the feedstock is "
|
||||
"in-house regrind. Boilers and chillers come in identical modules, so spares and service are one "
|
||||
@@ -190,14 +205,15 @@ def blocks():
|
||||
"(staff and overheads before volume covers them). From the low to the high end of every "
|
||||
"block: ~THB 127M to 226M. Estimates: no quote yet for the Classic, the galvanics line "
|
||||
"(priced at OMS's reference plus 20 %) or the building",
|
||||
"**~THB 208M (~USD 6.30M), rounded to ~210M THB**: the plan investment, ~THB 192.8M (~USD "
|
||||
"5.84M) at the midpoint with everything in, plus a ramp-up reserve of ~THB 10M to 20M (staff "
|
||||
"and overheads before volume covers them); at the midpoint within the investor's 180M THB "
|
||||
"plus 20 %. From the low to the high end of every block: ~THB 149M to 266M. Estimates: no "
|
||||
"**~THB 216M (~USD 6.53M), rounded to ~215M THB**: the plan investment, ~THB 200.6M (~USD "
|
||||
"6.08M) at the midpoint with everything in, plus a ramp-up reserve of ~THB 10M to 20M (staff "
|
||||
"and overheads before volume covers them); at the midpoint just within the investor's 180M "
|
||||
"THB plus 20 % (216M). From the low to the high end of every block: ~THB 156M to 275M. "
|
||||
"Estimates: no "
|
||||
"quote yet for the Classic, the galvanics line (priced at OMS's reference plus 20 %) or the "
|
||||
"building")],
|
||||
["Not in the plan price", "**No contingency** (at the 15 % used in the cost documents, ~THB "
|
||||
+ pick("24M", "29M") + " at the midpoint): quotes that land high are "
|
||||
+ pick("24M", "30M") + " at the midpoint): quotes that land high are "
|
||||
"funded outside the plan or by scope steps (section 8). Also not in "
|
||||
"it: the central hydraulic plant (not yet costed), the archive's mobile "
|
||||
"shelving (to quote), CD replication, financing costs, currency moves, "
|
||||
@@ -209,21 +225,21 @@ def blocks():
|
||||
"57M), operating profit ~USD 1.34M (~THB 44M); break-even on operating profit at ~0.2M "
|
||||
"records a year. **The adverse case loses money:** EBITDA ~USD 0.23M, operating loss ~USD "
|
||||
"0.39M (~THB 13M); it would need ~0.9M records a year to cover depreciation and the three "
|
||||
"presses make 0.58M at that rate. The solar PPA's power price (~USD 0.03M a year in the "
|
||||
"presses make 0.58M at that rate. The solar PPA's power price (~USD 0.07M a year in the "
|
||||
"calculator) is not in these figures. Utilisation and price decide the outcome, not upside "
|
||||
"(section 9)",
|
||||
"Central case at 60 % specials: revenue ~USD 3.65M (~THB 120M), EBITDA ~USD 1.73M (~THB "
|
||||
"57M), operating profit ~USD 1.26M (~THB 42M); break-even on operating profit at ~0.23M "
|
||||
"57M), operating profit ~USD 1.24M (~THB 41M); break-even on operating profit at ~0.24M "
|
||||
"records a year. **The adverse case loses money:** EBITDA ~USD 0.23M, operating loss ~USD "
|
||||
"0.52M (~THB 17M); it would need ~1.1M records a year to cover depreciation and the three "
|
||||
"0.54M (~THB 18M); it would need ~1.1M records a year to cover depreciation and the three "
|
||||
"presses make 0.58M at that rate. Cassette, CD-R and tour revenue are not in these figures. "
|
||||
"Utilisation and price decide the outcome, not upside (section 9)")],
|
||||
["Payback", pick(
|
||||
"~3.1 years on the plan price in the central case (2.2 to 4.0 from the low to the high end of "
|
||||
"the price); ~1.0 year in the favourable case, ~30 years in the adverse case (EBITDA, mature "
|
||||
"year, ramp-up reserve included; estimates)",
|
||||
"~3.6 years on the plan price in the central case (2.6 to 4.7 from the low to the high end of "
|
||||
"the price); ~1.2 years in the favourable case, ~35 years in the adverse case (EBITDA, mature "
|
||||
"~3.8 years on the plan price in the central case (2.7 to 4.8 from the low to the high end of "
|
||||
"the price); ~1.2 years in the favourable case, ~36 years in the adverse case (EBITDA, mature "
|
||||
"year, ramp-up reserve included; estimates)")],
|
||||
["First paying release", "**Open.** The August 2026 calendar gives Q4 2028 to mid-2029 (27 to 33 "
|
||||
"months from the start of phase 0), but it was drawn for a one-press "
|
||||
@@ -239,42 +255,46 @@ def blocks():
|
||||
"~THB 177M (~USD 5.35M), the ~180M THB plan, released in tranches against milestones "
|
||||
"(section 8), starting with phase 0 (~THB 1.3M to 2.6M). BOI caps debt-to-equity at 3:1, so "
|
||||
"at least a quarter is equity: ~THB 44M (arithmetic, before financing costs)",
|
||||
"~THB 208M (~USD 6.30M), the ~210M THB plan, released in tranches against milestones "
|
||||
"~THB 216M (~USD 6.53M), the ~215M THB plan, released in tranches against milestones "
|
||||
"(section 8), starting with phase 0 (~THB 1.3M to 2.6M). BOI caps debt-to-equity at 3:1, so "
|
||||
"at least a quarter is equity: ~THB 52M (arithmetic, before financing costs)")],
|
||||
"at least a quarter is equity: ~THB 54M (arithmetic, before financing costs)")],
|
||||
]),
|
||||
H2("Two versions of this plan"),
|
||||
P("This plan comes in two versions, built from the same documents and the same machine choices. " + pick(
|
||||
"This document is **Plan A**. The other version, **Plan B (~210M THB)**, builds the same three "
|
||||
"This document is **Plan A**. The other version, **Plan B (~215M THB)**, builds the same three "
|
||||
"presses and takes none of the six levers. ",
|
||||
"This document is **Plan B**. The other version, **Plan A (~180M THB)**, builds the same three "
|
||||
"presses (one Duplex system and the Classic) and takes six cost levers. ")
|
||||
+ "Both carry the ramp-up reserve and neither carries a contingency, and in both the second Duplex "
|
||||
"system is a growth step from revenue. What decides between them is no longer demand, because both "
|
||||
"make the same records: it is whether the investor funds ~THB 31M (~18 %) more at launch for what "
|
||||
"Plan A leases or buys from revenue. Plan B keeps the BOI solar measure (only an owned array "
|
||||
"qualifies), measures every stamper fully from the first release, makes tours and the Payap "
|
||||
"make the same records: it is whether the investor funds ~THB 39M (~22 %) more at launch for what "
|
||||
"Plan A leases or buys from revenue. Plan B owns its solar array (no PPA power bill), measures "
|
||||
"every stamper fully from the first release, makes tours and the Payap "
|
||||
"programmes possible from the start, sells cassette and CD-R from launch, owns its crane and buys "
|
||||
"its utilities with local service. On the modelled numbers that extra earns nothing (the same "
|
||||
"EBITDA, more depreciation, a longer payback, a deeper adverse case), so Plan A has the better "
|
||||
"modelled return and Plan B the more complete plant. Most of Plan B's items can be added to Plan A "
|
||||
"later from revenue; the BOI solar measure and the corridor are cheaper to have from the start. "
|
||||
"its utilities with local service. On the modelled numbers that extra earns little (the same "
|
||||
"EBITDA in the revenue model, ~USD 0.07M a year more in the calculator for the PPA power bill the "
|
||||
"owned array avoids; more depreciation, a longer payback, a deeper adverse case), so Plan A has "
|
||||
"the better modelled return and Plan B the more complete plant. Most of Plan B's items can be added to Plan A "
|
||||
"later from revenue; the corridor is cheaper to build in from the start, and owning the array "
|
||||
"saves the PPA bill from the first year. BOI no longer promotes solar installations (since 1 July "
|
||||
"2025, section 7.1), so neither plan earns a tax benefit on the array. "
|
||||
"Section 8 sets the two side by side."),
|
||||
T(["", "Plan A", "Plan B"], [
|
||||
["Plan price (ramp-up reserve in, no contingency)", "~THB 177M (~USD 5.35M); ~127M to 226M from "
|
||||
"the low to the high end", "~THB 208M (~USD 6.30M); ~149M to 266M from the low to the high end"],
|
||||
"the low to the high end", "~THB 216M (~USD 6.53M); ~156M to 275M from the low to the high end"],
|
||||
["Presses", "3: one Duplex system (2 semi-automatic) and one Classic", "The same 3"],
|
||||
["Records a year at 60 % specials", "~0.58M to 0.90M (central 0.74M)", "The same"],
|
||||
["EBITDA, central case", "~USD 1.73M (~THB 57M)", "~USD 1.73M (~THB 57M); cassette and CD-R "
|
||||
"not modelled"],
|
||||
["Operating profit, central case", "~USD 1.34M (~THB 44M)", "~USD 1.26M (~THB 42M)"],
|
||||
["Payback on the plan price, central case", "~3.1 years (2.2 to 4.0)", "~3.6 years (2.6 to 4.7)"],
|
||||
["Operating profit, central case", "~USD 1.34M (~THB 44M)", "~USD 1.24M (~THB 41M)"],
|
||||
["Payback on the plan price, central case", "~3.1 years (2.2 to 4.0)", "~3.8 years (2.7 to 4.8)"],
|
||||
["Adverse case", "Loses money: EBITDA ~USD 0.23M, operating loss ~USD 0.39M",
|
||||
"Loses money: EBITDA ~USD 0.23M, operating loss ~USD 0.52M"],
|
||||
["What Plan A gives up, what Plan B buys", "At launch: solar through a PPA (very likely without "
|
||||
"the BOI solar measure), no confocal or profiler, no visitor corridor or tours, no cassette or "
|
||||
"CD-R, a rented crane; Chinese-made boilers and compressor",
|
||||
"~THB 31M more at launch: owned solar and battery with the BOI solar measure, the full "
|
||||
"Loses money: EBITDA ~USD 0.23M, operating loss ~USD 0.54M"],
|
||||
["What Plan A gives up, what Plan B buys", "At launch: solar through a PPA (a power bill of "
|
||||
"~USD 0.07M a year instead of owning the array), no confocal or profiler, no visitor corridor "
|
||||
"or tours, no cassette or CD-R, a rented crane; Chinese-made boilers and compressor",
|
||||
"~THB 39M more at launch: owned solar (~640 kWp, every roof and canopy covered) and battery, "
|
||||
"so no PPA bill, the full "
|
||||
"metrology stack, the visitor corridor and tours, cassette and CD-R, a bought crane; "
|
||||
"Thai-supplied boilers and compressor"],
|
||||
], widths_mm=[42, 64, 64], font_pt=8.5,
|
||||
@@ -317,18 +337,18 @@ def blocks():
|
||||
"boiler and chiller modules), building contract, fit-out, commissioning in sequence "
|
||||
"(section 8). From the low to the high end of every block the plan runs from ~THB 127M to "
|
||||
"226M; quotes that land high are funded outside the plan or by scope steps.",
|
||||
"**Then the Plan B round, ~THB 208M (~USD 6.30M), rounded to ~210M THB**, including the "
|
||||
"ramp-up reserve and without contingency, within the investor's 180M THB plus 20 % at the "
|
||||
"midpoint, released in tranches against milestones: BOI certificate and lease signed, "
|
||||
"**Then the Plan B round, ~THB 216M (~USD 6.53M), rounded to ~215M THB**, including the "
|
||||
"ramp-up reserve and without contingency, just within the investor's 180M THB plus 20 % "
|
||||
"(216M) at the midpoint, released in tranches against milestones: BOI certificate and lease signed, "
|
||||
"long-lead orders (lathe, galvanics, stamper prep, presses, boiler and chiller modules), "
|
||||
"building contract, fit-out, commissioning in sequence (section 8). From the low to the high "
|
||||
"end of every block the plan runs from ~THB 149M to 266M; quotes that land high are funded "
|
||||
"end of every block the plan runs from ~THB 156M to 275M; quotes that land high are funded "
|
||||
"outside the plan or by scope steps."),
|
||||
"**Decisions needed from the investor:** which version to fund, Plan A or Plan B (both make the "
|
||||
"same records, so the choice is ~THB 31M more at launch for what Plan A leases or defers; the "
|
||||
"same records, so the choice is ~THB 39M more at launch for what Plan A leases or defers; the "
|
||||
"Classic, Pheenix and EX 35 quotes, the solar PPA offer and the building quote settle the "
|
||||
"numbers); the equity/debt mix (BOI requires debt-to-equity of at most 3:1, so at "
|
||||
"least ~THB " + pick("44M of Plan A's ~177M", "52M of Plan B's ~208M") + " is equity); CD "
|
||||
"least ~THB " + pick("44M of Plan A's ~177M", "54M of Plan B's ~216M") + " is equity); CD "
|
||||
"replication, yes or no (it must be in the BOI application from the start); and the steam fuel, "
|
||||
"electric or biomass.",
|
||||
"**Co-investment:** Ploy Printing, the Chiang Mai print and packaging house that will produce "
|
||||
@@ -340,7 +360,7 @@ def blocks():
|
||||
H1("2. How to read the numbers"),
|
||||
P("**Two versions.** This business plan comes in two versions, built from the same documents: "
|
||||
"**Plan A (~180M THB)**, the launch plant's three presses with six cost levers, and **Plan B "
|
||||
"(~210M THB)**, the same three presses with everything in. Both plan prices include the ramp-up "
|
||||
"(~215M THB)**, the same three presses with everything in. Both plan prices include the ramp-up "
|
||||
"reserve and neither carries a contingency. This document is **" + label() + "**. Chapters that "
|
||||
"do not depend on the choice read the same in both; where the plans differ, this version gives "
|
||||
"its own figures, and sections 1 and 8 compare the two."),
|
||||
@@ -361,7 +381,8 @@ def blocks():
|
||||
"Pheenix price on file; priced at OMS's reference plus "
|
||||
"20 %) and the Newbilt Classic (no price on file); the "
|
||||
"cutting room beyond the lathe; metrology stack; land "
|
||||
"lease; " + pick("the solar PPA power price; ", "")
|
||||
"lease; the solar yield and the share used on "
|
||||
"site; " + pick("the solar PPA power price; ", "")
|
||||
+ "all cassette and CD figures"],
|
||||
], widths_mm=[22, 70, 78]),
|
||||
P("Currency: USD and THB at 1 USD = 33 THB (5 August 2026). Vendor quotes issued in EUR or GBP are "
|
||||
@@ -371,7 +392,10 @@ def blocks():
|
||||
"structure or terms (to be agreed with the investor); "
|
||||
"a signed customer; a signed lease; firm quotes for the Classic, the galvanics line, the metrology "
|
||||
"stack or the building; a price for the central hydraulic plant; and a year-by-year cash model. "
|
||||
"Each of these is a named next step in section 14."),
|
||||
"Each of these is a named next step in section 14. The revenue also leaves out two upsides that "
|
||||
"have no price or volume yet: supplying stampers to other plants (section 3.3), and services to "
|
||||
"other pressing plants built on the plant's open-source software and factory automation "
|
||||
"(section 5.6)."),
|
||||
|
||||
# ------------------------------------------------- 3 opportunity
|
||||
H1("3. The opportunity"),
|
||||
@@ -540,10 +564,12 @@ def blocks():
|
||||
["An archive for fathers and mothers", "Irreplaceable metal; repress economics",
|
||||
"Father and mother of every side; fire-rated, climate-controlled room, clean-agent suppression, "
|
||||
"mobile shelving (to quote)", LP],
|
||||
["Renewable energy and closed-loop water", "Cost, resilience, brand, BOI tax value",
|
||||
pick("~247 kWp roof PV and 271 kWh battery through a solar PPA (installer-owned), closed cooling "
|
||||
"loop, zero process discharge",
|
||||
"~247 kWp roof PV and 271 kWh battery (owned), closed cooling loop, zero process discharge"),
|
||||
["Renewable energy and closed-loop water", "Cost, resilience, brand" + pick(
|
||||
"", "; the owned battery may qualify for BOI as storage"),
|
||||
pick("PV on every roof and canopy (~640 kWp) and a 271 kWh battery through a solar PPA "
|
||||
"(installer-owned), closed cooling loop, zero process discharge",
|
||||
"PV on every roof and canopy (~640 kWp) and a 271 kWh battery (owned), closed cooling "
|
||||
"loop, zero process discharge"),
|
||||
pick("Launch plant (PV and battery through a solar PPA)", "At launch")],
|
||||
["Trained people and a safety program", "Steam at 10 bar, hydraulics at 180 bar, plating "
|
||||
"chemistry", "Vendor commissioning training, in-house program, PPE, clean rooms",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
"""Part B: what makes it top-notch (traceability, metrology, QC, efficiency); site and building;
|
||||
regulatory (BOI and licences). Draft 0.3, October 2026: one text for both versions, Plan A (~180M
|
||||
THB, the launch plant with six cost levers) and Plan B (~210M THB, the same launch plant with
|
||||
THB, the launch plant with six cost levers) and Plan B (~215M THB, the same launch plant with
|
||||
everything in, none of the levers); the plan-specific passages switch with plan_variant.pick(),
|
||||
called inside blocks()."""
|
||||
from plan_lib import H1, H2, H3, P, B, N, T, KV, IMG, CALL, PB
|
||||
@@ -351,56 +351,91 @@ def blocks():
|
||||
B([
|
||||
"**Biomass heat is far cheaper than electric steam** (below): the demand charge follows the "
|
||||
"boiler's full-power draw, and the peak window covers 13 of the 16 production hours.",
|
||||
"**The roof gets PV, not solar thermal.** Self-consumed PV is worth ~3.7 THB/kWh" + pick(
|
||||
"**Every roof gets PV, not solar thermal.** Self-consumed PV is worth ~3.7 THB/kWh" + pick(
|
||||
" of grid power displaced, less the PPA price the plant pays for it (below)", "") +
|
||||
"; it cannot lower the demand charge, because the peak window runs to 22:00, long after "
|
||||
"sunset.",
|
||||
"; surplus earns nothing, because a factory on PEA's grid runs zero export (below); and PV "
|
||||
"cannot lower the demand charge, because the peak window runs to 22:00, long after sunset.",
|
||||
"**The battery is for ride-through, not peak shaving.** Charging off-peak and discharging at "
|
||||
"peak earns ~70k THB a year for the 271 kWh stack, and it can hold demand down by only ~20 kW "
|
||||
"(~30k THB a year; estimates). Its case is riding through grid dips and outages.",
|
||||
]),
|
||||
H3("Renewable energy"),
|
||||
KV([
|
||||
["Rooftop PV", "~247 kWp on the 1,523 m² monopitch roof (425 modules of a generic 580 W "
|
||||
"placeholder; no module chosen yet), ~335 to 360 MWh a year, ~25 to 35% of mature "
|
||||
"two-shift use (1,000 to 1,500 MWh). " + pick(
|
||||
"Taken through a solar PPA (below): the plant pays the PPA price for this "
|
||||
"power instead of buying the array, so its saving is the gap between that "
|
||||
"price and the ~3.7 THB/kWh of grid power it displaces",
|
||||
"Saves ~1.2M to 1.3M THB a year and pays back in ~3.8 to 5.4 years at 20,000 "
|
||||
"to 26,000 THB/kWp installed (estimates)")],
|
||||
["Canopies and the second building", "~40 kWp on the parking canopies (construction RFQ; ~54 "
|
||||
"kWp if fully covered). A phase 2 building's roof adds "
|
||||
"~251 kWp, ~498 kWp across both roofs"],
|
||||
["PV on every roof and canopy", "~640 kWp (decided October 2026: as much roof as possible). In "
|
||||
"the Payap scenario model the calculator draws the factory roof "
|
||||
"at ~523 kWp (901 modules of a generic 580 W placeholder; no "
|
||||
"module chosen yet), the car and scooter canopies at ~54 kWp and "
|
||||
"the office roof at ~65 kWp; the covered link and the utility "
|
||||
"yard are left out. ~900 MWh a year at 1,400 to 1,500 kWh/kWp, "
|
||||
"~85% of it used on site (~760 MWh: two shifts on 300 days, a "
|
||||
"~60 kW base load off-shift and the battery), about 38% of the "
|
||||
"launch plant's ~2,000 MWh a year with electric steam "
|
||||
"(estimates). " + pick(
|
||||
"Taken through a solar PPA (below): the plant pays the PPA price for this power instead of "
|
||||
"buying the array, so its saving is the gap between that price and the ~3.7 THB/kWh of "
|
||||
"grid power it displaces",
|
||||
"Saves ~2.8M to 3.0M THB a year at ~3.7 THB/kWh self-consumed and pays back in ~4.2 to 5.9 "
|
||||
"years at 20 to 26 THB/W installed; the last ~340 kWp beyond the first ~300 pay back in "
|
||||
"~4.9 to 6.3 years, because more of their yield is curtailed on Sundays (estimates)")],
|
||||
["Zero export", "The ~15% the plant cannot use, mostly on Sundays and holidays, is curtailed, not "
|
||||
"sold: a factory on PEA's grid runs zero export, with no payment for surplus and "
|
||||
"a zero-export controller (reverse-power relay) as part of the interconnection "
|
||||
"(CapSolar and Sahawatthanakit, 2026)"],
|
||||
["On the Mueang Chi hall", "The 60 × 25 m hall of section 6.2 takes only ~300 kWp: ~247 kWp on "
|
||||
"the 1,523 m² monopitch roof (425 modules) and ~40 to 54 kWp on the "
|
||||
"parking canopies. The rest would need ground mount on the ~70 m of "
|
||||
"plot behind the building (not covered by the rooftop exemption, so "
|
||||
"it may still need a factory permit) or the phase 2 roof (~251 "
|
||||
"kWp)"],
|
||||
["Battery", "271 kWh Gobel Power LiFePO4 rack (15 stacked 18 kWh packs, 8,000+ cycles), USD "
|
||||
"39,900 to 58,000 listed (battery only; ~2.0M to 3.5M THB installed with enclosure, fire protection and "
|
||||
"controls, estimate), 50 to 60 day lead. Roughly an hour of the chiller bank's "
|
||||
"peak draw: ride-through, not off-grid autonomy"],
|
||||
["Inverters", "Deye three-phase hybrid units (30 to 80 kW class), Thai distribution via Solar "
|
||||
"Nicolo; Deye is a supported protocol on the Gobel battery management"],
|
||||
["Inverters", "Deye three-phase hybrid units (30 to 80 kW class), ~500 kVA in all (estimate); "
|
||||
"Thai distribution via Solar Nicolo; Deye is a supported protocol on the Gobel "
|
||||
"battery management"],
|
||||
["Roof design", "Monopitch at 10° falling toward ESE puts the whole roof on one plane at ~98% "
|
||||
"of ideal yield; at this latitude orientation barely matters (under 2% across a "
|
||||
"wide azimuth swing). 10° rather than shallower so the rains self-clean "
|
||||
"burning-season dust"],
|
||||
["Permits", "Since Ministerial Regulation No. 3 B.E. 2567 (in force 28 December 2024) rooftop "
|
||||
"solar outside industrial estates is not a factory, so it needs no Ror.Ngor. 4 "
|
||||
"licence at any size. At ~500 kVA of inverters, under the 1,000 kVA line of the "
|
||||
"Energy Regulatory Commission (ERC), an ERC exemption notification replaces a "
|
||||
"generation licence. PEA approves the interconnection with zero-export control in 3 "
|
||||
"to 6 months, filed in parallel with procurement (CapSolar, 2026); the roof load is "
|
||||
"in the building permit. Inside an industrial estate IEAT rules apply on top"],
|
||||
["Open checks", "Battery rack voltage against the chosen Deye model's window; Gobel safety "
|
||||
"certifications (not published); EPC warranty on a mixed-vendor DC bus; yield "
|
||||
"against PVGIS before committing" + pick("; the PPA offer itself, price and "
|
||||
"terms", "")],
|
||||
pick(["Solar PPA (this plan)", "An installer owns and finances the PV and the battery, and the "
|
||||
"plant buys the power at a price still to quote (the calculator carries 3.0 THB/kWh, an "
|
||||
"estimate, ~0.03M USD a year on the energy line). That keeps the PV EPC (USD 182k to "
|
||||
"236k) and the battery (USD 61k to 106k) out of the capital round: ~9.7M THB less at the "
|
||||
"midpoint, one of the six levers in section 8. The BOI solar measure (section 7) rewards "
|
||||
"the plant's own solar investment, so its tax value very likely goes with the array (to "
|
||||
"confirm with the BOI consultant). The PPA offer is asked against the specification "
|
||||
"above"],
|
||||
["Owned (this plan)", "The plant buys the array and the battery: rooftop PV EPC USD 182k "
|
||||
"to 236k (6.0M to 7.8M THB, 20 to 26 THB/W at Thai 2026 market prices) and the battery, installed, "
|
||||
"USD 61k to 106k (2.0M to 3.5M THB), "
|
||||
"estimates, section 8. Owning them is what the BOI solar measure rewards (section 7). A "
|
||||
"solar PPA (an installer owns and finances them, the plant buys the power at a price "
|
||||
"still to quote) would take ~9.7M THB out of the capital round at the midpoint, but "
|
||||
"very likely gives up that measure"]),
|
||||
"plant buys the power at a price still to quote. The PPA covers the full ~640 kWp; the "
|
||||
"calculator carries 3.0 THB/kWh (estimate) for the ~760 MWh used on site, ~2.3M THB or "
|
||||
"~0.07M USD a year on the energy line. That keeps the PV EPC (USD 388k to 504k, 12.8M to "
|
||||
"16.6M THB at 20 to 26 THB/W) and the battery (USD 61k to 106k) out of the capital round: "
|
||||
"~17.5M THB less at the midpoint, one of the six levers in section 8. The launch plant's "
|
||||
"power bill (~0.75M THB a month before solar, estimate) is well above the 100,000 THB a "
|
||||
"month CapSolar asks of a PPA site; PPA discounts run 10 to 15 % off the tariff at MEAei "
|
||||
"and 10 to 30 % at CapSolar, so the calculator's ~21 % is to be quoted. Leasing gives up no BOI benefit on the array: BOI stopped promoting solar "
|
||||
"installations on 1 July 2025 (Announcement 3/2568, section 7.1). A PPA developer selling "
|
||||
"the power can still be promoted (activity 7.1.2); whether that shows in the price is for "
|
||||
"the negotiation (CapSolar, 2026). What the PPA costs against owning is the power bill "
|
||||
"above and, if the PPA includes the battery, the battery's possible BOI eligibility as "
|
||||
"storage (to confirm with the BOI consultant). The PPA offer is asked against the "
|
||||
"specification above"],
|
||||
["Owned (this plan)", "The plant buys the array and the battery: PV EPC USD 388k to 504k "
|
||||
"(12.8M to 16.6M THB for ~640 kWp, 20 to 26 THB/W installed with inverters at Thai 2026 "
|
||||
"market prices; the canopy steel is in the building and site works) and the battery, "
|
||||
"installed, USD 61k to 106k (2.0M to 3.5M THB): ~17.5M THB together at the midpoint, "
|
||||
"estimates, section 8. Owning them saves the power bill a PPA would carry: at the "
|
||||
"calculator's 3.0 THB/kWh (estimate, to quote) for the ~760 MWh used on site, ~2.3M THB "
|
||||
"or ~0.07M USD a year. A solar PPA (an installer owns and finances them, the plant buys "
|
||||
"the power at a price still to quote) would take ~17.5M THB out of the capital round at "
|
||||
"the midpoint at the cost of that bill. The array itself carries no BOI benefit: BOI "
|
||||
"stopped promoting solar installations on 1 July 2025 (Announcement 3/2568, section "
|
||||
"7.1); the owned battery may still qualify as storage (to confirm with the BOI "
|
||||
"consultant)"]),
|
||||
]),
|
||||
H3("Steam: the open engineering choice"),
|
||||
P("The boilers' fuel is still open; the modular bank works with either. There is no natural gas "
|
||||
@@ -487,13 +522,16 @@ def blocks():
|
||||
"acceptable the cost drops materially, and that question is on the RFQ list."),
|
||||
CALL("Efficiency in one paragraph, for the investor", "Steam and cooling are built once as a "
|
||||
"backbone and filled with identical modules as presses arrive; heat is recovered from the "
|
||||
"flue gas, the condensate and the press returns before more is generated; the roof carries PV "
|
||||
"worth a quarter to a third of mature electricity use" + pick(" (through a solar PPA)", "") +
|
||||
", with a battery for ride-through; no "
|
||||
"flue gas, the condensate and the press returns before more is generated; every roof and "
|
||||
"canopy carries PV" + pick(" through a solar PPA", "") + " (~640 kWp, over a third of the "
|
||||
"launch plant's electricity even with electric steam, estimate), with a battery for "
|
||||
"ride-through; no "
|
||||
"process water is discharged; a fifth of the plastic is reclaimed; and biomass steam, if "
|
||||
"chosen, costs a quarter to a tenth of electric steam. The same choices push the energy line "
|
||||
"toward its low end, hedge Thai tariff rises, and convert into BOI tax value" + pick(
|
||||
" through the Smart and Sustainable Industry measure", "") + " (section 7). They "
|
||||
"toward its low end and hedge Thai tariff rises; the heat recovery and automation can count "
|
||||
"toward BOI's Smart and Sustainable Industry measure" + pick(
|
||||
"", " and the owned battery may qualify as storage") + " (section 7.1; BOI no longer "
|
||||
"promotes solar installations). They "
|
||||
"also make the plant's sustainability story true rather than claimed, which matters to the "
|
||||
"labels it sells to."),
|
||||
|
||||
@@ -570,6 +608,59 @@ def blocks():
|
||||
"chain from master to shipment, with the repress path from the archived father and mother. IDs "
|
||||
"and times are simulated."),
|
||||
|
||||
H2("5.6 Open source throughout, and a service for other plants"),
|
||||
P("**Everything the plant runs and everything the project builds is open source,** with a short "
|
||||
"list of exceptions named below. Every server is a NixOS machine declared in one repository, "
|
||||
"B4L's fleet repository built on clan-core; the fleet it declares already runs B4L's DNS, mail, "
|
||||
"monitoring, backups, a public reverse proxy and the first site gateway. The plant adds a gateway, a core "
|
||||
"server, a backup server, edge collectors and station kiosks to the same inventory. Any machine "
|
||||
"is rebuilt from the repository, and a second plant is one more inventory entry. ERPNext is the "
|
||||
"only system of record (section 5.1), self-hosted on NixOS through the community packaging "
|
||||
"frappe-nix."),
|
||||
T(["Component", "What it does", "Licence"], [
|
||||
["NixOS (nixpkgs), clan-core", "Every server, declared and deployed from one repository",
|
||||
"MIT"],
|
||||
["ERPNext on the Frappe framework", "The only system of record: orders, gates, stock, job "
|
||||
"cards, metal genealogy, inspections, accounts", "GPLv3 (ERPNext), MIT (Frappe); no licence "
|
||||
"or per-seat fee"],
|
||||
["PostgreSQL, VictoriaMetrics, Telegraf, Mosquitto (MQTT)", "Machine-data store, time series, "
|
||||
"collection and messaging from presses, utilities and instruments", "PostgreSQL licence, "
|
||||
"Apache-2.0, MIT, EPL-2.0"],
|
||||
["Grafana, Caddy, BorgBackup", "Dashboards and alerts, the web proxy, encrypted backups",
|
||||
"AGPLv3, Apache-2.0, BSD"],
|
||||
["cnx-factory (ours)", "Kiosks, press floor, QC, genealogy, customer portal; Rust (axum, SQLx, "
|
||||
"minijinja, HTMX), packaged as a Nix flake", "To be published"],
|
||||
["Plant overview, artist platform (name undecided), plant and business plan calculator (ours)",
|
||||
"The software of section 5.5", "To be published"],
|
||||
["FreeCAD, LibreOffice", "The plant model; this business plan's build", "LGPL, MPL-2.0"],
|
||||
], widths_mm=[52, 82, 36], font_pt=8.5,
|
||||
caption="Licences as published by each project, checked October 2026. Firmware inside the "
|
||||
"machines is not in the table (below)."),
|
||||
B([
|
||||
"**Our own code is published as open source.** The licence is still to decide: AGPL-3.0 keeps "
|
||||
"hosted copies open as well; Apache-2.0 or MIT is the easiest for other plants to adopt.",
|
||||
"**What is not open, said plainly:** the firmware and HMIs inside the machines and instruments "
|
||||
"(Newbilt's Siemens PLC, Pheenix's Beckhoff PLC, Keyence and the vision controllers), the "
|
||||
"inverter and battery firmware, the vendors' OPC UA licences, and the access-point controller "
|
||||
"in the fleet's router module. They are treated as appliances: they export data into the NixOS "
|
||||
"estate under the data clause of every equipment RFQ (section 5.1) and host none of our "
|
||||
"services.",
|
||||
"**What it gives the business:** no licence fees (ERPNext charges no fee per seat, so a new "
|
||||
"kiosk or office user costs nothing in licences); no lock-in to a software vendor; every "
|
||||
"machine reproducible from the repository; and a record customers can audit, because the "
|
||||
"hash-chained event log and the code that writes it can both be inspected.",
|
||||
]),
|
||||
P("**Later: a service for other pressing plants.** Once the plant has run the stack in production "
|
||||
"for at least a year, the project can work with other pressing plants worldwide in three ways: "
|
||||
"an open vinyl plant stack (the NixOS modules, an ERPNext app for pressing with stampers, test "
|
||||
"pressings and genealogy, and press adapters for Newbilt and Pheenix machines over OPC UA, S7 "
|
||||
"and ADS); services (factory automation and data acquisition integration and commissioning at "
|
||||
"other plants, remote monitoring and support, hosting of ERPNext and the factory application, "
|
||||
"training); and shared development, with each plant contributing the adapters for its own "
|
||||
"machines. **None of this is in the plan's revenue:** like stamper supply to other plants, it is "
|
||||
"an upside with no price or volume yet, and it starts only after the plant has proved the stack "
|
||||
"on its own floor."),
|
||||
|
||||
# -------------------------------------------- 6 site and building
|
||||
H1("6. Site and building"),
|
||||
H2("6.1 Land: a long lease, three candidates"),
|
||||
@@ -700,12 +791,11 @@ def blocks():
|
||||
"figures and their source."),
|
||||
IMG(pick("renders/calculator/plan-a-iso-roof.png", "renders/calculator/plan-b-iso-roof.png"), 170,
|
||||
"Figure 8. The site from above, " + label() + " preset of the plant and business plan calculator: "
|
||||
"the factory with roof PV" + pick(" supplied through the solar PPA (the battery is drawn too; "
|
||||
"whether a PPA offer includes it is open)",
|
||||
" and battery, owned") +
|
||||
", the office, the utility yard (boiler hall and chiller compound built for four modules each, "
|
||||
"pump and heat-exchanger room, transformer, water treatment, PVC silos), parking with PV canopies "
|
||||
"and the phase 2 reserve. Schematic render of the Payap scenario model (docs/fleet-calculator.html); "
|
||||
"every roof and canopy carries PV, ~640 kWp on the factory, the office and the car and scooter "
|
||||
"parking" + pick(", supplied through the solar PPA (the battery is drawn too; whether a PPA offer "
|
||||
"includes it is open)", ", owned with the battery") +
|
||||
"; the utility yard (boiler hall and chiller compound built for four modules each, pump and "
|
||||
"heat-exchanger room, transformer, water treatment, PVC silos) and the phase 2 reserve. Schematic render of the Payap scenario model (docs/fleet-calculator.html); "
|
||||
"positions and envelopes are estimates."),
|
||||
IMG(pick("renders/calculator/plan-a-iso-gf.png", "renders/calculator/plan-b-iso-gf.png"), 170,
|
||||
"Figure 9. Ground floor with the roofs cut away, " + label() + " preset: from the west end the "
|
||||
@@ -814,7 +904,8 @@ def blocks():
|
||||
H3("Site works and the second building"),
|
||||
P("On the Mueang Chi parcel the site works are a ~444 m perimeter wall, one 10 m sliding gate with "
|
||||
"a guard house, 4,387 m² of paving in two classes (1,608 m² heavy-duty for trucks, 2,779 m² "
|
||||
"general), roofed parking for 10 cars and 30 scooters carrying ~40 kWp of PV, a ring foundation "
|
||||
"general), roofed parking for 10 cars and 30 scooters with its canopies fully covered in PV (~54 "
|
||||
"kWp; ~40 kWp in the construction RFQ), a ring foundation "
|
||||
"for a 9 m fire-water tank with its pump house and one for a 5 m raw-water tank, a fire ring main "
|
||||
"and hydrants, stormwater drainage and domestic sanitation. With the buildings, ~6,549 m² or 68% "
|
||||
"of the modelled plot is sealed, so stormwater attenuation, quite possibly a detention pond, may "
|
||||
@@ -923,9 +1014,10 @@ def blocks():
|
||||
"tax holiday on the core activity, but the full non-tax package and machinery duty exemption. "
|
||||
"The tax value is engineered on top through measures where this project happens to be strong, so "
|
||||
"the application is pitched on " + pick("automation, technology content and energy efficiency",
|
||||
"solar, automation and technology content") +
|
||||
"automation, full metrology and energy efficiency") +
|
||||
", not on pressing plastic "
|
||||
"discs. The research behind this dates from July 2026, BOI revises its measures roughly every "
|
||||
"discs. The research behind this dates from July 2026 (the solar rules rechecked in October "
|
||||
"2026); BOI revises its measures roughly every "
|
||||
"year, and the exact activity sub-code needs confirmation by a BOI-registered consultant before "
|
||||
"filing."),
|
||||
T(["What BOI gives", "Why it matters here"], [
|
||||
@@ -942,15 +1034,17 @@ def blocks():
|
||||
"technical consultant, without the four-Thai-employees-per-permit rule."],
|
||||
["Raw material duty relief", "Exemption for export production; up to 90% reduction for "
|
||||
"domestic sales. Relevant for imported PVC compound until a Thai source is qualified."],
|
||||
["Solar and battery measure (Announcement 2/2568, April 2025)", "CIT exemption based on the "
|
||||
"solar investment; PV modules, inverters, battery and battery inverters, and mounting are "
|
||||
"eligible, capped at THB 12M, 30M or 40M of investment per MW depending on investment type. "
|
||||
"It rewards a plant-owned array. " + pick(
|
||||
"This plan takes the PV and the battery through a solar PPA, so the installer owns them "
|
||||
"and the plant very likely gives up this measure (to confirm with the BOI consultant; "
|
||||
"section 5.4).",
|
||||
"This plan buys the ~247 kWp array and the 271 kWh battery, so their cost is the base of "
|
||||
"the exemption (section 5.4).")],
|
||||
["Battery storage, alternative-energy measure (Announcement 3/2568, in force 1 July 2025)",
|
||||
"BOI no longer promotes solar installations, rooftop or farm, for applications from 1 July "
|
||||
"2025: Announcement 3/2568 took them out of the measure and ended the per-MW solar caps set in "
|
||||
"April 2025, so the array earns no CIT exemption whoever owns it. What remains is battery "
|
||||
"energy storage and its inverters, with the investment eligible for the CIT exemption capped "
|
||||
"at THB 12M per MW (B Global Law, January 2026; to confirm with the BOI consultant). " + pick(
|
||||
"In this plan the battery comes through the solar PPA if the offer includes it, and then "
|
||||
"the plant owns nothing that qualifies; bought by the plant, the 271 kWh battery (2.0M to "
|
||||
"3.5M THB installed, estimate) may qualify (section 5.4).",
|
||||
"This plan owns the 271 kWh battery (2.0M to 3.5M THB installed, estimate), which may "
|
||||
"qualify; its eligible value under the cap is for the BOI consultant (section 5.4).")],
|
||||
["Smart and Sustainable Industry measure (Announcement 15/2565, refreshed July 2025)",
|
||||
"Rewards automation, smart machinery and energy efficiency, typically 3 years of CIT exemption "
|
||||
"capped around 50% of the qualifying upgrade spend. The automatic Classic, inline inspection, "
|
||||
@@ -967,7 +1061,7 @@ def blocks():
|
||||
P("**Process:** file via the e-Investment system and present at an analyst meeting. BOI quotes "
|
||||
"about 40 working days to a decision for projects under THB 200M and 60 to 90 working days for "
|
||||
"larger tiers; at " + pick("~127M to 226M THB with the ramp-up reserve (~177M at the midpoint)",
|
||||
"~149M to 266M THB with the ramp-up reserve (~208M at the midpoint)") +
|
||||
"~156M to 275M THB with the ramp-up reserve (~216M at the midpoint)") +
|
||||
" the plan sits around that line, so the consultant "
|
||||
"confirms which applies. In practice it is roughly 4 to 6 months end to end to the certificate; "
|
||||
"the company is incorporated under it; machinery is imported within a window commonly 30 months "
|
||||
@@ -1022,8 +1116,10 @@ def blocks():
|
||||
"confirm against the text before the capacity is chosen); hazardous-substance registration and "
|
||||
"locked, inventoried storage for silver nitrate and nickel salts; the occupational health "
|
||||
"check-ups (section 6.3); PDPA for CCTV, personnel and operator-linked production data; local "
|
||||
"fire codes and the building permit during construction; and DIW manifests for used oil and "
|
||||
"other controlled waste."),
|
||||
"fire codes and the building permit during construction; the solar papers (no factory licence "
|
||||
"for rooftop PV since 28 December 2024, an ERC exemption notification under 1,000 kVA, and PEA "
|
||||
"interconnection approval with zero-export control in 3 to 6 months; section 5.4); and DIW "
|
||||
"manifests for used oil and other controlled waste."),
|
||||
CALL("Three things to settle before filing", [
|
||||
"**Zoning before filing.** The BOI clocks (the import window and the deadline for full "
|
||||
"operation) start at the certificate, and the margin on them is consumed by one scenario: "
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
"""Part C: investment, revenue and operating model, timeline, phasing, team and ownership, risks, next steps.
|
||||
|
||||
Draft 0.3, October 2026: two versions built from this one file, Plan A (~180M THB, the launch plant with
|
||||
six cost levers, three presses) and Plan B (~210M THB, the same launch plant and three presses with
|
||||
six cost levers, three presses) and Plan B (~215M THB, the same launch plant and three presses with
|
||||
everything in, none of the levers taken; re-defined by the user on 17 October 2026). In both the second
|
||||
Duplex system is a growth step from revenue. Both are priced without contingency and with the ramp-up
|
||||
reserve: docs/finance/total-investment.md "Two plans: A at ~180M THB and B at ~210M THB (October 2026)"
|
||||
reserve: docs/finance/total-investment.md "Two plans: A at ~180M THB and B at ~215M THB (October 2026)"
|
||||
and docs/finance/revenue-model.md "Operating pictures of Plan A and Plan B (October 2026)".
|
||||
plan_variant.pick() switches the text; it is called inside blocks() only (build_plan.py sets the plan
|
||||
before it calls blocks()).
|
||||
@@ -62,8 +62,12 @@ def _block_rows():
|
||||
"racking", "297k to 627k", "9.8M to 20.7M", "Researched: utilities rows"],
|
||||
]
|
||||
if not a:
|
||||
rows.append(["Rooftop PV (EPC) and the 271 kWh Gobel battery, owned", "243k to 342k", "8.0M to 11.3M",
|
||||
"Researched: utilities rows; owned, so the BOI solar measure applies"])
|
||||
rows.append(["Solar PV (EPC) on every roof and canopy, ~640 kWp, and the 271 kWh Gobel battery, owned",
|
||||
"449k to 610k", "14.8M to 20.1M",
|
||||
"Researched: utilities rows; PV at 20 to 26 THB/W installed, inverters included (12.8M to "
|
||||
"16.6M), battery 2.0M to 3.5M; ~85 % of the yield used on site under zero export (estimate); "
|
||||
"owned, so the plant keeps the whole bill saving (no BOI promotion for solar installations "
|
||||
"since 1 July 2025, section 8.4)"])
|
||||
rows += [
|
||||
["Building ~1,500 m² plus civil and site works", "650k to 1,100k", "21.4M to 36.3M", "Estimate at "
|
||||
"12,000 to 20,000 THB/m² plus ~20 % site works; soil is the main variable"],
|
||||
@@ -91,23 +95,23 @@ def _block_rows():
|
||||
"4.5M to 9.7M", "Estimate; land is leased, so no land purchase"],
|
||||
]
|
||||
if a:
|
||||
rows.append(["Not bought at launch (levers, section 8.2): rooftop PV and battery (solar PPA), visitor "
|
||||
"corridor, cassette and CD-R duplication", "none", "none", "The PPA installer owns and "
|
||||
rows.append(["Not bought at launch (levers, section 8.2): solar PV on every roof and canopy (~640 kWp) "
|
||||
"and the battery (solar PPA), visitor corridor, cassette and CD-R duplication", "none", "none", "The PPA installer owns and "
|
||||
"finances the array; the rest are growth steps from revenue"])
|
||||
rows += [
|
||||
pick(["**Subtotal, plan investment**", "**~3.56M to 6.25M**", "**~117.4M to 206.1M**",
|
||||
"**Midpoint ~161.7M THB (~4.90M USD)**"],
|
||||
["**Subtotal, plan investment**", "**~4.22M to 7.47M**", "**~139.1M to 246.4M**",
|
||||
"**Midpoint ~192.8M THB (~5.84M USD)**"]),
|
||||
["**Subtotal, plan investment**", "**~4.42M to 7.73M**", "**~145.9M to 255.2M**",
|
||||
"**Midpoint ~200.6M THB (~6.08M USD)**"]),
|
||||
["Ramp-up reserve: staff hired before first revenue, overheads until volume covers them",
|
||||
"~0.30M to 0.61M", "10M to 20M", "Estimate; cash the investor puts in, so it is in the plan price"],
|
||||
pick(["**Plan A price**", "**~3.86M to 6.85M**", "**~127M to 226M**",
|
||||
"**Midpoint ~177M THB (~5.35M USD): ~180M THB**"],
|
||||
["**Plan B price**", "**~4.52M to 8.07M**", "**~149M to 266M**",
|
||||
"**Midpoint ~208M THB (~6.30M USD): ~210M THB**"]),
|
||||
["**Plan B price**", "**~4.72M to 8.34M**", "**~156M to 275M**",
|
||||
"**Midpoint ~216M THB (~6.53M USD): ~215M THB**"]),
|
||||
["Contingency: not in the plan price", "", "", pick(
|
||||
"For information: at 15 %, ~24M THB at the midpoint",
|
||||
"For information: at 15 %, ~29M THB at the midpoint")],
|
||||
"For information: at 15 %, ~30M THB at the midpoint")],
|
||||
]
|
||||
return rows
|
||||
|
||||
@@ -115,13 +119,11 @@ def _block_rows():
|
||||
def _levers_table():
|
||||
"""Plan A: the six levers from the launch plant with every block, midpoints, no contingency."""
|
||||
return T(["Step", "Saves", "Subtotal after it", "What it gives up"], [
|
||||
["Launch plant, every block, no contingency", "", "~192.8M THB (~5.84M USD)", ""],
|
||||
["1. Rooftop solar and battery through a solar PPA (the installer owns and finances the array; the "
|
||||
"plant buys the power)", "~9.7M", "~183.1M", "Owned solar and very likely the BOI solar measure with "
|
||||
"its tax benefit (our reading, for the BOI consultant); "
|
||||
"adds the PPA power price to the energy bill, ~0.03M USD a "
|
||||
"year in the calculator at 3.0 THB/kWh (estimate, to "
|
||||
"quote)"],
|
||||
["Launch plant, every block, no contingency", "", "~200.6M THB (~6.08M USD)", ""],
|
||||
["1. Solar on every roof and canopy (~640 kWp) and the battery through a solar PPA (the installer owns "
|
||||
"and finances the array; the plant buys the power)", "~17.5M", "~183.1M", "Owned solar and its whole "
|
||||
"bill saving: adds the PPA power price to the energy bill, ~0.07M USD (~2.3M THB) a year in the "
|
||||
"calculator for ~760 MWh used on site at 3.0 THB/kWh (estimate, to quote)"],
|
||||
["2. 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", "Every stamper and "
|
||||
"record is still measured (XRF, inline vision on the presses, audio station); the confocal and the "
|
||||
@@ -147,8 +149,10 @@ def _levers_table():
|
||||
def _keeps_table():
|
||||
"""Plan B: what it keeps that Plan A's six levers move off the launch budget, midpoints, no contingency."""
|
||||
return T(["In at launch in Plan B", "What it gives the plant", "THB, midpoint (Plan A's lever)"], [
|
||||
["Rooftop PV and the 271 kWh battery, owned (EPC and Gobel battery)", "The BOI solar measure (only an "
|
||||
"owned array qualifies; our reading, for the BOI consultant) and no PPA power bill", "~9.7M"],
|
||||
["Solar PV on every roof and canopy (~640 kWp) and the 271 kWh battery, owned (EPC and Gobel battery)",
|
||||
"No PPA power bill: the whole saving on the ~760 MWh used on site (~2.8M to 3.0M THB a year) stays "
|
||||
"with the plant instead of ~2.3M THB (~0.07M USD) a year going to a PPA installer; payback ~4.2 to "
|
||||
"5.9 years (estimates)", "~17.5M"],
|
||||
["Metrology, full stack: XRF, laser confocal, wide-area profiler, inline vision, audio station",
|
||||
"Every stamper measured fully from the first release, the core of the traceability pitch", "~8.8M"],
|
||||
["Visitor corridor and accessible entrance", "Public tours and the Payap programmes possible from the "
|
||||
@@ -159,14 +163,14 @@ def _keeps_table():
|
||||
"the installations", "~3.2M"],
|
||||
["Boilers and compressor from Thai suppliers", "Local service; no import route for the boilers",
|
||||
"~1.9M"],
|
||||
["**Together**", "", "**~31M (192.8M minus Plan A's 161.7M)**"],
|
||||
["Launch plant, every block, no contingency: Plan B's subtotal", "", "~192.8M (~5.84M USD)"],
|
||||
["**Together**", "", "**~39M (200.6M minus Plan A's 161.7M)**"],
|
||||
["Launch plant, every block, no contingency: Plan B's subtotal", "", "~200.6M (~6.08M USD)"],
|
||||
["Ramp-up reserve", "", "+10M to 20M"],
|
||||
["**Plan B**", "", "**~208M THB (~6.30M USD)**; ~149M to 266M from the low to the high end"],
|
||||
["**Plan B**", "", "**~216M THB (~6.53M USD)**; ~156M to 275M from the low to the high end"],
|
||||
], widths_mm=[62, 70, 38], font_pt=8.5,
|
||||
caption="Midpoint values without contingency, estimates; docs/finance/total-investment.md 'Two plans'. "
|
||||
"Each figure is what the matching Plan A lever saves; rounded, the six add to ~31.2M, and the "
|
||||
"two subtotals differ by ~31.1M.")
|
||||
"Each figure is what the matching Plan A lever saves; rounded, the six add to ~39.0M, and the "
|
||||
"two subtotals differ by ~38.9M.")
|
||||
|
||||
|
||||
def _tranches():
|
||||
@@ -179,25 +183,25 @@ def _tranches():
|
||||
"Deposits on every long-lead order: Pheenix galvanics line, Sillitoe lathe, Sibert line, Newbilt "
|
||||
"Duplex system and Classic; building design and permit; first boiler and chiller modules "
|
||||
"(boilers and compressor from Thai suppliers)"),
|
||||
pick("20 to 30 % (~32M to 49M)", "20 to 30 % (~39M to 58M)")],
|
||||
pick("20 to 30 % (~32M to 49M)", "20 to 30 % (~40M to 60M)")],
|
||||
["2", "Building permit; vendor build dates confirmed in writing",
|
||||
"Construction, water-treatment building, utility yard, utilities, balance payments as machines are "
|
||||
"built",
|
||||
pick("35 to 45 % (~57M to 73M)", "35 to 45 % (~67M to 87M)")],
|
||||
pick("35 to 45 % (~57M to 73M)", "35 to 45 % (~70M to 90M)")],
|
||||
["3", "Building watertight; first machinery shipped",
|
||||
pick("Fit-out, HVAC and clean zones, ZLD and DI water, the rented crane for the installations, the "
|
||||
"metrology launch tier, factory software and ERPNext, the launch team",
|
||||
"Fit-out, HVAC and clean zones, ZLD and DI water, rooftop PV and battery, crane, visitor "
|
||||
"corridor, the full metrology stack, factory software and ERPNext, cassette and CD-R lines, the "
|
||||
"Fit-out, HVAC and clean zones, ZLD and DI water, solar PV on every roof and canopy and the "
|
||||
"battery, crane, visitor corridor, the full metrology stack, factory software and ERPNext, cassette and CD-R lines, the "
|
||||
"launch team"),
|
||||
pick("15 to 20 % (~24M to 32M)", "15 to 20 % (~29M to 39M)")],
|
||||
pick("15 to 20 % (~24M to 32M)", "15 to 20 % (~30M to 40M)")],
|
||||
["4", "Cutting room and galvanics commissioned; first stampers made", "Working capital, PVC stock, "
|
||||
"spares, first-year rent; the ramp-up reserve (10M to 20M THB, in the plan price) is drawn from here "
|
||||
"on", pick("8 to 12 % (~13M to 19M), plus the reserve", "8 to 12 % (~15M to 23M), plus the reserve")],
|
||||
"on", pick("8 to 12 % (~13M to 19M), plus the reserve", "8 to 12 % (~16M to 24M), plus the reserve")],
|
||||
], widths_mm=[14, 46, 78, 32], font_pt=8.5,
|
||||
caption=pick("Shares of Plan A's investment before the reserve (~161.7M THB at the midpoint); the THB "
|
||||
"figures are the shares applied to it (arithmetic, estimates).",
|
||||
"Shares of Plan B's investment before the reserve (~192.8M THB at the midpoint); the THB "
|
||||
"Shares of Plan B's investment before the reserve (~200.6M THB at the midpoint); the THB "
|
||||
"figures are the shares applied to it (arithmetic, estimates)."))
|
||||
|
||||
|
||||
@@ -231,11 +235,11 @@ def _operating_table():
|
||||
["**Total contribution**", "**0.68M**", "**2.06M**", "**3.99M**"],
|
||||
["Cash overheads", "0.45M", "0.33M", "0.20M"],
|
||||
["**EBITDA**", "**0.23M**", "**1.73M**", "**3.79M**"],
|
||||
["Depreciation", "0.75M", "0.47M", "0.28M"],
|
||||
["**Operating profit**", "**-0.52M**", "**1.26M**", "**3.51M**"],
|
||||
["Depreciation", "0.77M", "0.49M", "0.29M"],
|
||||
["**Operating profit**", "**-0.54M**", "**1.24M**", "**3.50M**"],
|
||||
["Revenue", "2.28M (~75M THB)", "3.65M (~120M THB)", "5.41M (~179M THB)"],
|
||||
["Payback on the plan price (EBITDA, mature year)", "~35 yr", "~3.6 yr (2.6 to 4.7 on 4.52M to "
|
||||
"8.07M)", "~1.2 yr"],
|
||||
["Payback on the plan price (EBITDA, mature year)", "~36 yr", "~3.8 yr (2.7 to 4.8 on 4.72M to "
|
||||
"8.34M)", "~1.2 yr"],
|
||||
]
|
||||
return T(["USD per year, mature", "Adverse", "Central", "Favourable"], rows, widths_mm=[50, 36, 48, 36],
|
||||
caption="Estimates, docs/finance/revenue-model.md 'Operating pictures of Plan A and Plan B (October "
|
||||
@@ -255,8 +259,8 @@ def _risk_rows():
|
||||
["High", "No contingency in the plan price", pick(
|
||||
"Quotes landing high are not covered: at 15 % a contingency would be ~24M THB at the midpoint, "
|
||||
"and the high end of every block comes to ~226M with the reserve",
|
||||
"Quotes landing high are not covered: at 15 % a contingency would be ~29M THB at the midpoint, "
|
||||
"and the high end of every block comes to ~266M with the reserve"),
|
||||
"Quotes landing high are not covered: at 15 % a contingency would be ~30M THB at the midpoint, "
|
||||
"and the high end of every block comes to ~275M with the reserve"),
|
||||
"The requests that settle most of the band come before commitment (section 8.4); tranche release; "
|
||||
"how overruns are funded (outside the plan price or by scope steps) agreed with the investor up "
|
||||
"front"],
|
||||
@@ -269,7 +273,7 @@ def _risk_rows():
|
||||
"the extra cost of specials decide volume and margin"),
|
||||
pick("Central breaks even at ~0.2M records; commission in sequence; the second Duplex waits for "
|
||||
"demand; treat the adverse column as the honest one",
|
||||
"Central breaks even at ~0.23M records; commission in sequence; the second Duplex waits for "
|
||||
"Central breaks even at ~0.24M records; commission in sequence; the second Duplex waits for "
|
||||
"demand; treat the adverse column as the honest one")],
|
||||
]
|
||||
rows += [
|
||||
@@ -293,21 +297,23 @@ def _risk_rows():
|
||||
"fallback"],
|
||||
]
|
||||
if a:
|
||||
rows.append(["Medium", "Solar PPA and the BOI solar measure", "The PPA very likely gives up the BOI "
|
||||
"solar measure (owned solar and its tax benefit) and adds a power price, ~0.03M USD a year "
|
||||
"in the calculator at 3.0 THB/kWh, an estimate to quote", "The BOI consultant's reading "
|
||||
"and PPA offers next to the purchase quote in phase 0; buying the array, as Plan B does, "
|
||||
"stays the alternative"])
|
||||
rows.append(["Medium", "Solar PPA price", "The PPA gives up owning the bill saving and adds a power "
|
||||
"price, ~0.07M USD (~2.3M THB) a year in the calculator at 3.0 THB/kWh, an estimate to "
|
||||
"quote. No BOI benefit is lost: the BOI dropped solar installations from its promotion on "
|
||||
"1 July 2025 (Announcement 3/2568); a PPA developer may itself be promoted (activity 7.1.2, "
|
||||
"an 8-year corporate income tax exemption), which may or may not show in its price",
|
||||
"PPA offers next to the purchase quote in phase 0, the developer's BOI promotion raised in "
|
||||
"the price negotiation; buying the array, as Plan B does, stays the alternative"])
|
||||
else:
|
||||
rows.append(["Medium", "The extra ~31M THB earns nothing in the model", "Plan B's operating picture is "
|
||||
"Plan A's (same presses, records, revenue and EBITDA): the ~31M THB more at launch adds "
|
||||
"depreciation, so central operating profit is 1.26M against 1.34M USD, payback ~3.6 against "
|
||||
"~3.1 years and the adverse corner deeper; its case rests on what the table leaves out (the "
|
||||
"BOI solar measure, cassette and CD-R sales, tours and the Payap programmes, full stamper "
|
||||
rows.append(["Medium", "The extra ~39M THB earns little in the model", "Plan B's operating picture is "
|
||||
"Plan A's (same presses, records, revenue and EBITDA; the calculator puts it ~0.07M USD a "
|
||||
"year ahead, the PPA bill its owned array avoids): the ~39M THB more at launch adds "
|
||||
"depreciation, so central operating profit is 1.24M against 1.34M USD, payback ~3.8 against "
|
||||
"~3.1 years and the adverse corner deeper; its case rests on that bill and on what the "
|
||||
"table leaves out (cassette and CD-R sales, tours and the Payap programmes, full stamper "
|
||||
"metrology for the traceability pitch)", "Phase 0 prices each item against its lever (PPA "
|
||||
"offer next to the purchase quote, the BOI consultant's reading of the solar measure, "
|
||||
"cassette and CD-R quotes); most items can also come later from revenue, as in Plan A, while "
|
||||
"the solar measure and the corridor are cheaper to have from the start"])
|
||||
"offer next to the purchase quote, cassette and CD-R quotes); most items can also come "
|
||||
"later from revenue, as in Plan A, while the corridor is cheaper to have from the start"])
|
||||
rows += [
|
||||
["Medium", "Lease terms and building ownership", "A weak lease makes the building hard to finance "
|
||||
"and exposes it at expiry", "Registered 30 to 50 year lease with renewal, explicit building "
|
||||
@@ -362,8 +368,9 @@ def _risk_rows():
|
||||
"warranty move to the installer, but the plant still depends on the array", "Engineering checks "
|
||||
"of the installer's design in phase 0; large float"],
|
||||
["Low", "Solar and battery integration", "Rack voltage vs inverter window; unpublished "
|
||||
"certifications; mixed-vendor warranty", "Engineering checks and certificate requests in phase "
|
||||
"0; large float"]),
|
||||
"certifications; mixed-vendor warranty; under PEA's zero export ~15 % of the ~640 kWp array's "
|
||||
"yield is curtailed (estimate)", "Engineering checks and certificate requests in phase 0; PEA "
|
||||
"interconnection approval (3 to 6 months) filed alongside procurement; large float"]),
|
||||
["Low", "Cassette supply chain", pick("Blank tape and shells come from few suppliers, once the lines "
|
||||
"are added", "Blank tape and shells come from few suppliers"),
|
||||
"Hold stock; qualify two sources"],
|
||||
@@ -383,7 +390,7 @@ def blocks():
|
||||
"Duplex system and one Classic with the whole chain from the cutting room to the shrink wrapper, "
|
||||
"in one capital round and commissioned in sequence, brought down with six cost levers that keep "
|
||||
"every machine. ",
|
||||
"This chapter prices **Plan B (~210M THB)**: the launch plant decided in October 2026, one Newbilt "
|
||||
"This chapter prices **Plan B (~215M THB)**: the launch plant decided in October 2026, one Newbilt "
|
||||
"Duplex system and one Classic with the whole chain from the cutting room to the shrink wrapper, "
|
||||
"in one capital round and commissioned in sequence, with everything in: none of Plan A's six cost "
|
||||
"levers taken. ") +
|
||||
@@ -409,7 +416,7 @@ def blocks():
|
||||
"The second Duplex system and further Classics are growth options with room reserved (hall "
|
||||
"floor, utility module positions, ring-main tees), not part of this plan.")),
|
||||
P("**Not in the plan price:** a contingency (the blocks are budgetary, so the plan carries no buffer "
|
||||
"for quotes landing high; at 15 % it would be " + pick("~24M", "~29M") + " THB at the midpoint); CD "
|
||||
"for quotes landing high; at 15 % it would be " + pick("~24M", "~30M") + " THB at the midpoint); CD "
|
||||
"replication (section 4.10); financing costs; currency moves; the mobile shelving for the father and "
|
||||
"mother archive (to quote); and the central hydraulic plant around the Newbilt aggregates (standby "
|
||||
"pump set, accumulator station, ring main), not costed yet, for a Thai hydraulic power unit builder "
|
||||
@@ -426,27 +433,28 @@ def blocks():
|
||||
"possibly up to 20 % more**. The answer is two versions of this plan, built from the same documents, "
|
||||
"both priced without contingency and with the ramp-up reserve: **Plan A** keeps every machine of "
|
||||
"the launch plant and brings it to ~180M THB with six cost levers; **Plan B** builds the same "
|
||||
"launch plant with everything in, none of the levers taken, at ~210M THB, within 180M plus 20 %. "
|
||||
"launch plant with everything in, none of the levers taken, at ~215M THB, just within 180M plus "
|
||||
"20 % (216M). "
|
||||
"This document is " + label() + ". How the two differ (estimates):"),
|
||||
T(["Midpoints, estimates", "Plan A" + pick(" (this plan)", ""), "Plan B" + pick("", " (this plan)")], [
|
||||
["Plan price: ramp-up reserve in, no contingency", "~177M THB (~5.35M USD): ~180M",
|
||||
"~208M THB (~6.30M USD): ~210M"],
|
||||
["Low to high end of every block", "~127M to 226M THB", "~149M to 266M THB"],
|
||||
"~216M THB (~6.53M USD): ~215M"],
|
||||
["Low to high end of every block", "~127M to 226M THB", "~156M to 275M THB"],
|
||||
["Presses", "3: Duplex system 1 (two HRP 12) and one Classic", "The same 3"],
|
||||
["Records a year at 60 % specials", "~0.58 to 0.90M, central 0.74M (Duplex-limited)", "The same"],
|
||||
["Revenue, central", "3.65M USD (~120M THB)", "The same (cassette and CD-R not modelled)"],
|
||||
["EBITDA, central", "1.73M USD", "1.73M USD (calculator: 2.07M against Plan A's 2.04M, no PPA "
|
||||
["EBITDA, central", "1.73M USD", "1.73M USD (calculator: 2.12M against Plan A's 2.05M, no PPA "
|
||||
"power bill)"],
|
||||
["Operating profit, adverse case", "-0.39M USD: loses money", "-0.52M USD: loses more (more "
|
||||
["Operating profit, adverse case", "-0.39M USD: loses money", "-0.54M USD: loses more (more "
|
||||
"depreciation on the same EBITDA)"],
|
||||
["Payback on the plan price, central (EBITDA, mature year)", "~3.1 yr (2.2 to 4.0)",
|
||||
"~3.6 yr (2.6 to 4.7; calculator: 2.8 yr against Plan A's 2.4)"],
|
||||
["What it gives up or takes on", "Six levers: solar through a PPA (very likely without the BOI "
|
||||
"solar measure), confocal and profiler from revenue, no tours at first, cassette and CD-R later, a "
|
||||
"~3.8 yr (2.7 to 4.8; calculator: 2.9 yr against Plan A's 2.4)"],
|
||||
["What it gives up or takes on", "Six levers: solar through a PPA (a power bill of ~0.07M USD a "
|
||||
"year), confocal and profiler from revenue, no tours at first, cassette and CD-R later, a "
|
||||
"rented crane, Chinese boilers and compressor; the second Duplex waits for revenue", "No levers: "
|
||||
"buys at launch what Plan A leases or defers, ~31M THB more (owned solar and battery with the BOI "
|
||||
"solar measure, the full metrology stack, the visitor corridor, cassette and CD-R, a bought crane, "
|
||||
"Thai boilers and compressor); the second Duplex waits for revenue"],
|
||||
"buys at launch what Plan A leases or defers, ~39M THB more (owned solar and battery, ~640 kWp on "
|
||||
"every roof and canopy with no PPA bill, the full metrology stack, the visitor corridor, cassette "
|
||||
"and CD-R, a bought crane, Thai boilers and compressor); the second Duplex waits for revenue"],
|
||||
], widths_mm=[46, 62, 62], font_pt=8.5,
|
||||
caption="Estimates: docs/finance/total-investment.md 'Two plans' and docs/finance/revenue-model.md "
|
||||
"'Operating pictures of Plan A and Plan B'. Section 9 has this plan's operating picture."),
|
||||
@@ -454,8 +462,8 @@ def blocks():
|
||||
[P("**Plan A: six levers, every machine kept.** From the launch plant with every block, no "
|
||||
"contingency, midpoint values:"),
|
||||
_levers_table(),
|
||||
P("Plan B takes none of these levers: it buys at launch what they lease or defer, ~31M THB more "
|
||||
"at the midpoint, so ~192.8M THB before the reserve and ~208M (~210M THB) with it.")]
|
||||
P("Plan B takes none of these levers: it buys at launch what they lease or defer, ~39M THB more "
|
||||
"at the midpoint, so ~200.6M THB before the reserve and ~216M (~215M THB) with it.")]
|
||||
if a else
|
||||
[P("**Plan B: the launch plant with everything in, no levers.** What Plan B keeps that Plan A's six "
|
||||
"cost levers lease, defer or source abroad, midpoint values:"),
|
||||
@@ -467,14 +475,16 @@ def blocks():
|
||||
CALL("What decides between Plan A and Plan B", [
|
||||
"**No longer demand.** Both plans are the same three presses making the same ~0.58 to 0.90 million "
|
||||
"records a year (central 0.74 million); market validation (section 14.1, item 1) gates both alike.",
|
||||
"**~31M THB more at launch, for what Plan A leases or buys from revenue.** Plan B keeps the BOI "
|
||||
"solar measure (only an owned array qualifies), measures every stamper fully from the first release "
|
||||
"**~39M THB more at launch, for what Plan A leases or buys from revenue.** Plan B owns its array "
|
||||
"and keeps the whole bill saving (no PPA bill), measures every stamper fully from the first release "
|
||||
"(the traceability pitch), opens tours and the Payap programmes from day one, sells cassette and "
|
||||
"CD-R from the start, owns its crane and buys utilities with local service.",
|
||||
"**On the modelled numbers the extra earns nothing.** The same EBITDA, more depreciation, a longer "
|
||||
"payback (~3.6 against ~3.1 years) and a deeper adverse corner: Plan A has the better modelled "
|
||||
"**On the modelled numbers the extra earns little.** The same EBITDA in the revenue model (the "
|
||||
"calculator puts Plan B ~0.07M USD a year ahead, the PPA bill its owned array avoids), more "
|
||||
"depreciation, a longer payback (~3.8 against ~3.1 years) and a deeper adverse corner: Plan A has the better modelled "
|
||||
"return, Plan B the more complete plant. Most of Plan B's items can be added to Plan A later from "
|
||||
"revenue; the BOI solar measure and the corridor are cheaper to have from the start.",
|
||||
"revenue; the corridor is cheaper to have from the start, and every year the array is leased "
|
||||
"costs the PPA bill.",
|
||||
"**The quotes.** The Newbilt re-quote for the Classic and the EX 35, the Pheenix quote against the "
|
||||
"OMS reference, the building quote with the soil test, and, for Plan A, the solar PPA offer.",
|
||||
"**Neither price carries a contingency.** Quotes landing high are funded outside the plan price or "
|
||||
@@ -488,8 +498,8 @@ def blocks():
|
||||
"Figure 11. Budget card of the plant and business plan calculator, " + pick(
|
||||
"Plan A preset: 161.7M THB at the midpoint without contingency, 171.7M to 181.7M with the "
|
||||
"ramp-up reserve of 10M to 20M, inside 180M at the midpoint",
|
||||
"Plan B preset: 192.8M THB at the midpoint without contingency, 202.8M to 212.8M with the "
|
||||
"ramp-up reserve of 10M to 20M, 17.2M to spare under the 225M mark (180M plus 25 %)") +
|
||||
"Plan B preset: 200.6M THB at the midpoint without contingency, 210.6M to 220.6M with the "
|
||||
"ramp-up reserve of 10M to 20M, 9.4M to spare under the 225M mark (180M plus 25 %)") +
|
||||
". Bars: the investment at the low end, the midpoint and the high end of every block, the reserve "
|
||||
"hatched, against 180M and 225M THB. Calculator figures (docs/fleet-calculator.html), estimates."),
|
||||
|
||||
@@ -506,8 +516,8 @@ def blocks():
|
||||
"**No contingency in the price.** " + pick(
|
||||
"Plan A's ~177M THB is the midpoint of every block with the ramp-up reserve and no buffer: at "
|
||||
"15 % a contingency would add ~24M THB, and the high end of every block comes to ~226M. ",
|
||||
"Plan B's ~208M THB is the midpoint of every block with the ramp-up reserve and no buffer: at "
|
||||
"15 % a contingency would add ~29M THB, and the high end of every block comes to ~266M. ") +
|
||||
"Plan B's ~216M THB is the midpoint of every block with the ramp-up reserve and no buffer: at "
|
||||
"15 % a contingency would add ~30M THB, and the high end of every block comes to ~275M. ") +
|
||||
"Quotes landing above the midpoint are funded outside the plan price or by scope steps; how they are "
|
||||
"funded is a decision for the investor before commitment (section 14.2).",
|
||||
"**The quotes that decide it.** The Classic has no Newbilt price (its band is a placeholder "
|
||||
@@ -523,11 +533,19 @@ def blocks():
|
||||
"the band."),
|
||||
"**BOI promotion.** The machinery duty and import VAT exemption applies across most of the "
|
||||
"equipment blocks (~0.11M USD of duty and ~0.17M USD of import VAT cash flow on the launch plant, "
|
||||
"estimates), and the automation and solar spend converts into corporate income tax exemption "
|
||||
"headroom. The application precedes every purchase order. " + pick(
|
||||
"The solar measure is based on the plant's own solar investment, so Plan A's solar PPA would "
|
||||
"likely give that headroom up (our reading, a question for the BOI consultant).",
|
||||
"Plan B owns its solar array, so it keeps the solar measure."),
|
||||
"estimates), and the automation and metrology spend converts into corporate income tax exemption "
|
||||
"headroom (the Smart and Sustainable Industry upgrade measure). The application precedes every "
|
||||
"purchase order. Solar is not part of it in either plan: since 1 July 2025 the BOI no longer "
|
||||
"promotes solar installations, rooftop or farm (Announcement 3/2568, amending the alternative-energy "
|
||||
"measure of Announcement 15/2565). What that measure keeps for energy is battery storage with its "
|
||||
"inverters, the eligible investment for the corporate income tax exemption capped at 12M THB per MW "
|
||||
"(our reading, to confirm with the BOI consultant). " + pick(
|
||||
"In Plan A the battery comes with the PPA and belongs to the installer, so the plant claims "
|
||||
"nothing for it; the installer may itself be promoted as a power producer (activity 7.1.2, an "
|
||||
"8-year corporate income tax exemption), and whether that shows in the PPA price is for the "
|
||||
"negotiation.",
|
||||
"Plan B owns the 271 kWh battery (2.0M to 3.5M THB installed), so it may qualify; the case for "
|
||||
"owning the array itself is the power bill (below)."),
|
||||
"**The ground.** Soft paddy soil under the building, paving and fill platform is the single largest "
|
||||
"cost variable in the building package, and the cheapest to resolve: a soil boring test costs "
|
||||
"THB 30k to 50k.",
|
||||
@@ -538,12 +556,25 @@ def blocks():
|
||||
"**Chinese suppliers: ~1 %.** Plan B prices Thai-supplied utilities. The Chinese route for the "
|
||||
"boiler modules and the compressor would take ~1.9M THB off at the midpoint (Plan A takes "
|
||||
"it); chillers and HVAC, the larger blocks, are not checked yet."),
|
||||
pick("**Solar PPA.** The largest single lever (~9.7M THB at the midpoint) moves the array off the "
|
||||
"capital budget and adds a power price to the energy line instead (~0.03M USD a year in the "
|
||||
"calculator at 3.0 THB/kWh, an estimate to quote).",
|
||||
"**Solar bought, not leased.** Plan B owns the array and the battery (8.0M to 11.3M THB). A "
|
||||
"solar PPA would take ~9.7M THB off the price at the midpoint and add a power price to the "
|
||||
"energy line instead, very likely without the BOI solar measure."),
|
||||
pick("**Solar PPA.** The largest single lever (~17.5M THB at the midpoint) moves the array, ~640 kWp "
|
||||
"on every roof and canopy, and the battery off the capital budget and adds a power price to the "
|
||||
"energy line instead: ~760 MWh a year used on site at 3.0 THB/kWh, ~2.3M THB or ~0.07M USD a "
|
||||
"year in the calculator, an estimate to quote (~21 % off the tariff; MEAei names 10 to 15 % as "
|
||||
"usual, CapSolar 10 to 30 %). The plant's bill (~0.75M THB a month before solar, estimate) "
|
||||
"is well above the 100,000 THB a month CapSolar asks of a PPA site.",
|
||||
"**Solar bought, not leased.** Plan B owns the array, ~640 kWp on every roof and canopy, and "
|
||||
"the 271 kWh battery: 14.8M to 20.1M THB (PV at 20 to 26 THB/W installed, inverters included; "
|
||||
"battery 2.0M to 3.5M). Factories on PEA's grid run zero export, so ~85 % of the ~900 MWh a "
|
||||
"year is used on site and the rest curtailed; the array saves ~2.8M to 3.0M THB a year and "
|
||||
"pays back in ~4.2 to 5.9 years (estimates). A solar PPA would take ~17.5M THB off the price "
|
||||
"at the midpoint and add a power price to the energy line instead: owned, the ~760 MWh used on "
|
||||
"site save the full ~3.8 THB/kWh; through a PPA at ~3.0 THB/kWh (estimate, to quote) only ~0.8 "
|
||||
"THB/kWh, so the PPA bill is ~2.3M THB (~0.07M USD) a year."),
|
||||
"**The array follows the site.** ~640 kWp is what every roof and canopy carries on the Payap "
|
||||
"scenario plot the calculator draws (factory roof ~523 kWp, office roof ~65 kWp, car and scooter "
|
||||
"canopies ~54 kWp); on the Mueang Chi hall of section 6.2 the roof and canopies take ~300 kWp, and "
|
||||
"the rest would need ground mount behind the building (which the rooftop permit exemption does not "
|
||||
"cover) or the phase 2 roof (estimates).",
|
||||
"**Every band narrows only with quotes.** The supplier map in the planning repository lists who to "
|
||||
"ask, and the re-quotes are phase 0 work (section 14).",
|
||||
]),
|
||||
@@ -610,8 +641,8 @@ def blocks():
|
||||
"picture. The September draft illustrated them at 20k to 60k cassettes a year at USD 2.50 to "
|
||||
"4.00 and 10k to 40k CD-Rs at USD 1.50 to 3.00; estimates with no market data behind them "
|
||||
"yet."),
|
||||
"**Dropshipping fees** per parcel and **stamper supply to other plants** are on top and not "
|
||||
"modelled.",
|
||||
"**Dropshipping fees** per parcel, **stamper supply to other plants**, and **automation services "
|
||||
"and the open plant stack for other pressing plants** (section 5.6) are on top and not modelled.",
|
||||
]),
|
||||
|
||||
H2(pick("9.2 Capacity and revenue of Plan A", "9.2 Capacity and revenue of Plan B")),
|
||||
@@ -696,9 +727,9 @@ def blocks():
|
||||
"(central) and the low end (3.56M USD) over 15 years (favourable). Payback is counted on the "
|
||||
"whole plan price including the ramp-up reserve (3.86M / 5.35M / 6.85M USD from the low to the "
|
||||
"high end).",
|
||||
"the high end (7.47M USD) over 10 years (adverse), the midpoint (5.84M USD) over 12.5 years "
|
||||
"(central) and the low end (4.22M USD) over 15 years (favourable). Payback is counted on the "
|
||||
"whole plan price including the ramp-up reserve (4.52M / 6.30M / 8.07M USD from the low to the "
|
||||
"the high end (7.73M USD) over 10 years (adverse), the midpoint (6.08M USD) over 12.5 years "
|
||||
"(central) and the low end (4.42M USD) over 15 years (favourable). Payback is counted on the "
|
||||
"whole plan price including the ramp-up reserve (4.72M / 6.53M / 8.34M USD from the low to the "
|
||||
"high end).")),
|
||||
_operating_table(),
|
||||
CALL("Reading this table honestly", pick([
|
||||
@@ -718,30 +749,32 @@ def blocks():
|
||||
"column as the honest one until those lines exist.** The plan price carries no contingency either.",
|
||||
"**This is a sensitivity, not a forecast.** The plant and business plan calculator's Plan A preset, "
|
||||
"with its own cost build-up (it adds electric steam heat, the cutting engineer and the PPA power "
|
||||
"price, ~0.03M USD a year, which this table leaves out) and the team's faster Duplex planning rate, "
|
||||
"price, ~0.07M USD a year, which this table leaves out) and the team's faster Duplex planning rate, "
|
||||
"at which the three presses are not Duplex-limited, gives at 850k records and 60 % specials: "
|
||||
"revenue ~4.14M, EBITDA 2.04M USD, payback 2.4 years on the 161.7M THB investment in a mature "
|
||||
"revenue ~4.14M, EBITDA 2.05M USD, payback 2.4 years on the 161.7M THB investment in a mature "
|
||||
"year; with a ramp of 35, 70 and 90 % in the first three years and the reserve in year 0, cash "
|
||||
"payback in year ~3.9, ~25 % IRR and an NPV of ~4.9M USD over ten years, pre-tax and "
|
||||
"pre-financing (estimates). Not modelled here: cassette and CD-R lines (later in Plan A), stamper "
|
||||
"supply to other plants, dropshipping fees, and the ramp year. BOI tax exemptions shield part of "
|
||||
"supply to other plants, automation services and the open plant stack for other pressing plants "
|
||||
"(section 5.6), dropshipping fees, and the ramp year. BOI tax exemptions shield part of "
|
||||
"early-year profits where there are any.",
|
||||
], [
|
||||
"**The central case works on ~208M THB.** EBITDA ~1.73M USD (~57M THB) and operating profit ~1.26M "
|
||||
"USD (~42M THB) a year once the plant runs at volume. It breaks even on operating profit at about "
|
||||
"**0.23 million records a year, about a third of its central output**. Against the earlier ~20 % "
|
||||
"**The central case works on ~216M THB.** EBITDA ~1.73M USD (~57M THB) and operating profit ~1.24M "
|
||||
"USD (~41M THB) a year once the plant runs at volume. It breaks even on operating profit at about "
|
||||
"**0.24 million records a year, about a third of its central output**. Against the earlier ~20 % "
|
||||
"specials share (0.84M records, EBITDA 1.63M) more specials earn a higher price on fewer records.",
|
||||
"**The adverse case loses money.** It would need ~1.1 million records to cover depreciation, and "
|
||||
"the three presses make 0.58 million at that rate; the operating loss is ~17M THB a year. It stacks "
|
||||
"the three presses make 0.58 million at that rate; the operating loss is ~18M THB a year. It stacks "
|
||||
"the low price, the high cost, the high capital and the high overheads at once. At the central "
|
||||
"cost and volume the price that covers depreciation is ~2.8 USD (~91 THB) a record (arithmetic on "
|
||||
"cost and volume the price that covers depreciation is ~2.8 USD (~92 THB) a record (arithmetic on "
|
||||
"the table), below the low price assumed: price realisation and utilisation decide solvency, not "
|
||||
"upside.",
|
||||
"**What the extra ~31M THB buys is not in this table.** Plan B is Plan A's plant with the six levers "
|
||||
"not taken, so revenue, direct cost and EBITDA are Plan A's; only the depreciation (0.47M against "
|
||||
"Plan A's 0.39M USD at the centre) and the payback (~3.6 against ~3.1 years) move. Not modelled: "
|
||||
"cassette and CD-R revenue, tour and Payap revenue, stamper supply to other plants, and the tax "
|
||||
"benefit of the BOI solar measure.",
|
||||
"**What the extra ~39M THB buys is not in this table.** Plan B is Plan A's plant with the six levers "
|
||||
"not taken, so revenue, direct cost and EBITDA are Plan A's; only the depreciation (0.49M against "
|
||||
"Plan A's 0.39M USD at the centre) and the payback (~3.8 against ~3.1 years) move. Not modelled: "
|
||||
"cassette and CD-R revenue, tour and Payap revenue, stamper supply to other plants, automation "
|
||||
"services and the open plant stack for other pressing plants (section 5.6), and the PPA power bill "
|
||||
"the owned array avoids (~0.07M USD a year in the calculator).",
|
||||
"**The central margin is too good to trust yet.** A central EBITDA margin of ~47 % is far above "
|
||||
"the 15 to 25 % pressing plants earn. The direct cost table counts only per-record consumables and "
|
||||
"direct payroll and leaves out indirect labour (supervision, planning, warehouse), freight, scrap "
|
||||
@@ -750,18 +783,19 @@ def blocks():
|
||||
"**This is a sensitivity, not a forecast.** The plant and business plan calculator's Plan B preset, "
|
||||
"with its own cost build-up (it adds electric steam heat and the cutting engineer, which this "
|
||||
"table leaves out) and the team's faster Duplex planning rate, at which the three presses are not "
|
||||
"Duplex-limited, gives at 850k records and 60 % specials: revenue ~4.14M, EBITDA 2.07M USD, "
|
||||
"payback 2.8 years on the 192.8M THB investment in a mature year; with a ramp of 35, 70 and 90 % in "
|
||||
"the first three years and the reserve in year 0, cash payback in year ~4.3, ~21 % IRR and an NPV "
|
||||
"of ~4.1M USD over ten years, pre-tax and pre-financing (estimates). Its EBITDA is 0.03M above "
|
||||
"Plan A's 2.04M because the owned array carries no PPA power price. Not modelled here: cassette "
|
||||
"and CD-R lines, stamper supply to other plants, dropshipping fees, and the ramp year. BOI tax "
|
||||
"Duplex-limited, gives at 850k records and 60 % specials: revenue ~4.14M, EBITDA 2.12M USD, "
|
||||
"payback 2.9 years on the 200.6M THB investment in a mature year; with a ramp of 35, 70 and 90 % in "
|
||||
"the first three years and the reserve in year 0, cash payback in year ~4.4, ~21 % IRR and an NPV "
|
||||
"of ~4.1M USD over ten years, pre-tax and pre-financing (estimates). Its EBITDA is 0.07M above "
|
||||
"Plan A's 2.05M because the owned array carries no PPA power price. Not modelled here: cassette "
|
||||
"and CD-R lines, stamper supply to other plants, automation services and the open plant stack for "
|
||||
"other pressing plants (section 5.6), dropshipping fees, and the ramp year. BOI tax "
|
||||
"exemptions shield part of early-year profits where there are any.",
|
||||
])),
|
||||
IMG(pick("renders/calculator/plan-a-cash.png", "renders/calculator/plan-b-cash.png"), 160,
|
||||
"Figure 12. Ten years of cash in the plant and business plan calculator, " + pick(
|
||||
"Plan A preset: cash payback in year ~3.9, IRR ~25 %, NPV ~4.9M USD at 10 %",
|
||||
"Plan B preset: cash payback in year ~4.3, IRR ~21 %, NPV ~4.1M USD at 10 %") +
|
||||
"Plan B preset: cash payback in year ~4.4, IRR ~21 %, NPV ~4.1M USD at 10 %") +
|
||||
". Year 0 is the midpoint investment plus the ramp-up reserve; years 1 to 3 sell 35, 70 and 90 % of "
|
||||
"the mature year's output. Pre-tax, pre-financing, no BOI tax holiday, no terminal value. The "
|
||||
"calculator's own cost build-up and faster Duplex planning rate, not the table above "
|
||||
@@ -860,9 +894,12 @@ def blocks():
|
||||
"licence scope: the most likely regulatory friction point; ZLD design in the application from "
|
||||
"the start"],
|
||||
pick(["Solar through the PPA (the installer builds and owns the array)", "Fit-out, ~Q2 2028",
|
||||
"Large", "Not a risk; the PPA offer is phase 0 work; battery lead time is 50 to 60 days"],
|
||||
["Solar and battery (purchase)", "Fit-out, ~Q2 2028", "Large", "Not a risk; battery lead time "
|
||||
"is 50 to 60 days"]),
|
||||
"Large", "Not a risk; the PPA offer is phase 0 work; PEA interconnection approval takes 3 to "
|
||||
"6 months, filed alongside procurement; battery lead time is 50 to 60 days"],
|
||||
["Solar and battery (purchase)", "Fit-out, ~Q2 2028", "Large", "Not a risk; rooftop solar "
|
||||
"outside industrial estates needs no factory licence since 28 December 2024; PEA "
|
||||
"interconnection approval takes 3 to 6 months, filed alongside procurement; battery lead time "
|
||||
"is 50 to 60 days"]),
|
||||
pick(["Cassette and CD-R lines", "Later (growth step)", "Not on the launch calendar", "Not a risk; "
|
||||
"short lead "
|
||||
"times"],
|
||||
@@ -983,20 +1020,21 @@ def blocks():
|
||||
"room.", pick("**More capital up front.** ~127M to 226M THB in one round (~177M at the "
|
||||
"midpoint), against ~57M to 95M THB for the superseded phased entry; more of it is "
|
||||
"committed before the market has validated the price.",
|
||||
"**More capital up front.** ~149M to 266M THB in one round (~208M at the midpoint), "
|
||||
"**More capital up front.** ~156M to 275M THB in one round (~216M at the midpoint), "
|
||||
"against ~57M to 95M THB for the superseded phased entry; more of it is committed "
|
||||
"before the market has validated the price.")],
|
||||
pick(["**Six levers, no machine dropped.** The levers bring the whole chain to ~180M THB, and the "
|
||||
"second Duplex waits for demand and revenue on a reserved floor.",
|
||||
"**What the levers give up.** Owned solar and very likely the BOI solar measure, public tours "
|
||||
"**What the levers give up.** Owned solar (a PPA bill of ~0.07M USD a year instead), public tours "
|
||||
"at first, cassette and CD-R at launch, a bought crane; the boilers are imported from China "
|
||||
"under the Thai boiler rules. The adverse case still loses money."],
|
||||
["**Everything in at launch.** Owned solar with the BOI solar measure, the full metrology stack "
|
||||
["**Everything in at launch.** Owned solar on every roof and canopy (~640 kWp) with no PPA "
|
||||
"bill, the full metrology stack "
|
||||
"from the first release, tours and the Payap programmes from day one, cassette and CD-R, its "
|
||||
"own crane and locally serviced utilities; the second Duplex waits for demand and revenue on a "
|
||||
"reserved floor.",
|
||||
"**~31M THB more that the model does not repay.** The same EBITDA as Plan A with more "
|
||||
"depreciation and a longer payback (~3.6 against ~3.1 years); the adverse case still loses "
|
||||
"**~39M THB more that the model does not repay.** The same EBITDA as Plan A with more "
|
||||
"depreciation and a longer payback (~3.8 against ~3.1 years); the adverse case still loses "
|
||||
"money."]),
|
||||
], widths_mm=[85, 85], font_pt=8.5),
|
||||
P("**How the plan answers the risks:** commission the metal path first and measure it before the "
|
||||
@@ -1049,7 +1087,7 @@ def blocks():
|
||||
"whose incentives are aligned with the plant's schedule and quality, within the same province.",
|
||||
"**Debt-to-equity no higher than 3:1**, maintained for the life of the BOI privileges, which sets "
|
||||
"the floor on equity in the financing mix: at least a quarter of the funding, " + pick(
|
||||
"~44M THB of Plan A's ~177M", "~52M THB of Plan B's ~208M") +
|
||||
"~44M THB of Plan A's ~177M", "~54M THB of Plan B's ~216M") +
|
||||
" (arithmetic, before financing costs).",
|
||||
"**A shareholders' agreement** covering board composition, reserved matters (capital calls and "
|
||||
"tranche releases, the growth options such as a second Duplex, CD replication), pre-emption and transfer, information rights, and the founders' roles and "
|
||||
@@ -1088,7 +1126,11 @@ def blocks():
|
||||
"Alexander", "Travel", "Pricing risk"],
|
||||
["2", "Engage a BOI-registered consultant: activity sub-code; the order-before-certificate question "
|
||||
"first; galvanics, cassette and CD-R in the application; CD replication decision; " + pick(
|
||||
"how the solar PPA affects the solar measure; ", "") + "Payap R&D", "Simona", "USD 5k to 15k",
|
||||
"whether the battery would qualify for BOI as battery storage (12M THB per MW cap, Announcement "
|
||||
"3/2568) if bought instead of leased with the PPA; ",
|
||||
"whether the battery qualifies for BOI as battery storage (12M THB per MW cap, Announcement "
|
||||
"3/2568); ") +
|
||||
"Payap R&D", "Simona", "USD 5k to 15k",
|
||||
"Sequencing, scope"],
|
||||
["3", "Thai counsel: lease heads of terms (term, renewal, building ownership, assignment) and zoning "
|
||||
"of the chosen plot for pressing, a steam boiler and electroplating; company and shareholder "
|
||||
@@ -1148,21 +1190,23 @@ def blocks():
|
||||
"the midpoint), and from the low to the high end of every block the plan comes to ~127M to "
|
||||
"226M THB. The Newbilt re-quote, the Pheenix quote, the building quote with the soil test, "
|
||||
"the metrology quotes and the solar PPA offer decide where in that range it lands.",
|
||||
"A commitment in principle to **Plan B at ~210M THB** (~208M at the midpoint, the ramp-up "
|
||||
"A commitment in principle to **Plan B at ~215M THB** (~216M at the midpoint, the ramp-up "
|
||||
"reserve of 10M to 20M included, no contingency), released in the tranches of section 8.3, "
|
||||
"with the financing mix set to hold debt-to-equity at or below 3:1 (equity of at least ~52M "
|
||||
"THB). Told plainly: the price carries no contingency (at 15 % it would be ~29M THB more at "
|
||||
"the midpoint), and from the low to the high end of every block the plan comes to ~149M to "
|
||||
"266M THB. The Newbilt re-quote, the Pheenix quote, the building quote with the soil test, "
|
||||
"with the financing mix set to hold debt-to-equity at or below 3:1 (equity of at least ~54M "
|
||||
"THB). Told plainly: the price carries no contingency (at 15 % it would be ~30M THB more at "
|
||||
"the midpoint), and from the low to the high end of every block the plan comes to ~156M to "
|
||||
"275M THB. The Newbilt re-quote, the Pheenix quote, the building quote with the soil test, "
|
||||
"the metrology quotes and the solar and battery purchase quotes decide where in that range it "
|
||||
"lands.")],
|
||||
["Decisions", pick(
|
||||
"The equity and debt mix, and how quotes landing above the plan price are funded; the six "
|
||||
"levers, the solar PPA first (it very likely gives up the BOI solar measure); CD replication, "
|
||||
"levers, the solar PPA first (~17.5M THB off the price for a power bill of ~0.07M USD a year); "
|
||||
"CD replication, "
|
||||
"yes or no, before the BOI application is finalised; the steam fuel (electric or biomass); "
|
||||
"the shareholder structure with Ploy Printing and the founders; hedging of the EUR orders.",
|
||||
"The equity and debt mix, and how quotes landing above the plan price are funded; the ~31M "
|
||||
"THB of items Plan A leases or defers (owned solar with the BOI solar measure, the full "
|
||||
"The equity and debt mix, and how quotes landing above the plan price are funded; the ~39M "
|
||||
"THB of items Plan A leases or defers (owned solar on every roof and canopy with no PPA bill, "
|
||||
"the full "
|
||||
"metrology stack, the visitor corridor, cassette and CD-R, the bought crane, Thai boilers and "
|
||||
"compressor), each weighed against its lever; CD replication, yes or no, before the BOI "
|
||||
"application is finalised; the steam fuel (electric or biomass); the shareholder structure "
|
||||
@@ -1180,8 +1224,10 @@ def blocks():
|
||||
], widths_mm=[38, 132]),
|
||||
P("The next version of this plan should carry: the Newbilt, Pheenix, Sillitoe and Sibert quotes with "
|
||||
"their build times in place of the placeholder and estimated blocks; the building quote with the "
|
||||
"soil result; " + pick("the solar PPA offer and the BOI consultant's reading of the solar measure; ",
|
||||
"the BOI consultant's reading of the solar measure on the owned array; ") +
|
||||
"soil result; " + pick("the solar PPA offer, with whether the installer's own BOI promotion shows in "
|
||||
"its price; ",
|
||||
"the BOI consultant's reading on the battery (battery storage, capped at 12M THB "
|
||||
"per MW); ") +
|
||||
"the negotiated lease; a buyer-side price data point; the investor's CD and fuel decisions; how "
|
||||
"overruns are funded, since the price carries no contingency; a calendar re-drawn for the launch "
|
||||
"plant with the metal-path commissioning in it; a year-by-year cash model for the ramp; and the "
|
||||
@@ -1200,7 +1246,7 @@ def blocks():
|
||||
["scale.md", "Project sizing on one page: capacity per fleet, building zones, electrical, solar, "
|
||||
"steam and cooling, utility phasing, people"],
|
||||
["finance/total-investment.md", "The launch-plant roll-up (October 2026) with the basis of every "
|
||||
"block; 'Two plans': Plan A at ~180M and Plan B at ~210M THB, "
|
||||
"block; 'Two plans': Plan A at ~180M and Plan B at ~215M THB, "
|
||||
"the six levers and what is not in either price; the superseded "
|
||||
"investor answer, full vision and phased entry"],
|
||||
["finance/revenue-model.md", "Pricing, the Thai market data and factory tour, the Record Industry "
|
||||
@@ -1231,6 +1277,12 @@ def blocks():
|
||||
["digital-factory.md (demos plant-operation.html, factory-console.html)", "Data platform: ERPNext "
|
||||
"as the only system of record, machine data, the factory application, the "
|
||||
"NixOS fleet; the plant overview and factory console demos (Figures 2 to 4)"],
|
||||
["digital-factory.md, 'Open source throughout, and working with other plants'", "Open source and "
|
||||
"services to other plants: every server on NixOS, declared in one clan repository; ERPNext on "
|
||||
"Frappe and the open machine-data stack; our own code published as open source; the closed "
|
||||
"exceptions (firmware and HMIs inside the machines and instruments); and, later, automation "
|
||||
"services and an open plant stack for other pressing plants (section 5.6; not in this plan's "
|
||||
"revenue)"],
|
||||
["artist-platform.md (demos artist-order.html, make-a-record.html)", "Upload and itemised price "
|
||||
"calculator, fan-funded "
|
||||
"campaigns, the record "
|
||||
@@ -1242,6 +1294,15 @@ def blocks():
|
||||
["sustainability.md, biomass.md, steam-cooling.html", "Solar, heat recovery, water, zero discharge, "
|
||||
"the grid tariff; the biomass fuel strategy; "
|
||||
"the steam and cooling plant"],
|
||||
["sustainability.md ('What ~640 kWp means on the grid'), finance/utilities-investment.csv (solar "
|
||||
"rows), boi.md", "Solar on every roof and canopy (~640 kWp) and its sources: the installed price of "
|
||||
"20 to 26 THB/W (DEDE's Thailand PV Status survey, CapSolar 2026, Saimai Solar's 2026 list); zero "
|
||||
"export for factories on PEA's grid (CapSolar, rooftop solar regulations, 2026; Sahawatthanakit, "
|
||||
"2026); the permits (Ministerial Regulation No. 3 B.E. 2567, in force 28 December 2024; ERC's "
|
||||
"1,000 kVA line; PEA interconnection; CapSolar, factory solar and the RG.4 permit, 2026); the BOI: "
|
||||
"no promotion for solar installations since 1 July 2025, battery storage kept at a 12M THB per MW "
|
||||
"cap (Announcement 3/2568; B Global Law, 18 January 2026; Smarter Energy Solution, 2026), and a PPA "
|
||||
"developer's own promotion under activity 7.1.2 (CapSolar, BOI solar incentives, 2026)"],
|
||||
["facility-security.md, worker-safety.md", "Climate control, security, fire and life safety, the "
|
||||
"archive room; training, clean rooms, PPE"],
|
||||
["crane-workshop-tours.md", "Overhead crane, maintenance workshop, visitor corridor"],
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
"""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).
|
||||
Plan B, ~215M 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").
|
||||
|
||||
@@ -11,7 +11,7 @@ helpers inside blocks(), never at import time.
|
||||
PLAN = "A"
|
||||
|
||||
NAME = {"A": "Plan A", "B": "Plan B"}
|
||||
PRICE = {"A": "~180M THB", "B": "~210M THB"}
|
||||
PRICE = {"A": "~180M THB", "B": "~215M THB"}
|
||||
|
||||
|
||||
def is_a() -> bool:
|
||||
|
||||
@@ -35,6 +35,50 @@ rows, instrument raw files and images, audio captures. That stays in the
|
||||
machine-data store on the plant core, keyed to ERPNext's document names
|
||||
([ERPNext](#erpnext-the-plants-erp)).
|
||||
|
||||
## Open source throughout, and working with other plants
|
||||
|
||||
Decided (user, 17 October 2026): **everything the plant runs and
|
||||
everything we build is open source**, and our own code is published.
|
||||
|
||||
| Layer | What runs | Licence |
|
||||
|---|---|---|
|
||||
| Operating system and deployment | NixOS on every server, gateway, collector and kiosk, declared in the cnx-network clan (clan-core) | nixpkgs: MIT |
|
||||
| System of record | ERPNext on the Frappe framework, self-hosted ([ERPNext](#erpnext-the-plants-erp)) | ERPNext: GPLv3; Frappe: MIT |
|
||||
| Machine data | PostgreSQL, VictoriaMetrics, Grafana, Mosquitto (MQTT), Telegraf | PostgreSQL licence, Apache-2.0, AGPLv3, EPL-2.0, MIT |
|
||||
| Edge and backup | Caddy, BorgBackup, ZFS | Apache-2.0, BSD, CDDL |
|
||||
| Our applications | the factory application (`cnx-factory`, Rust: axum, SQLx, minijinja, HTMX), the plant overview, the artist platform (name undecided), the plant and business plan calculator, instrument adapters, NixOS modules | ours, to be published |
|
||||
| Design and documents | FreeCAD for the plant model, python-docx and LibreOffice for the business plan | LGPL, MIT, MPL-2.0 |
|
||||
|
||||
- **Our licence is a decision point.** AGPL-3.0 keeps hosted copies of the
|
||||
factory application open; Apache-2.0 or MIT is the easiest for another
|
||||
plant to adopt. Decide before the first public release.
|
||||
- **The exceptions are inside the machines.** The presses' PLCs and HMIs
|
||||
(Newbilt's Siemens, Pheenix's Beckhoff), the instruments (Keyence, the
|
||||
vision controllers), inverter and battery firmware and the vendors'
|
||||
OPC UA licences are closed. They are appliances: they export data into
|
||||
the NixOS estate and host none of our services. The fleet's access-point
|
||||
controller in the router module is closed too.
|
||||
- **What it gives the plant:** no licence fees (ERPNext has no per-seat
|
||||
fee), no vendor lock-in, every machine rebuilt from the repository, and
|
||||
a record a customer can audit (the hash-chained event log).
|
||||
|
||||
**Later: a service for other pressing plants.** Once the plant has run
|
||||
the stack in production (at least a year), it can be offered to other
|
||||
plants around the world:
|
||||
|
||||
1. **An open vinyl plant stack**: the NixOS modules, an ERPNext app for
|
||||
pressing (stampers and their genealogy, test pressings, the three
|
||||
gates), the press adapters for Newbilt and Pheenix over OPC UA, S7 or
|
||||
ADS, the kiosk and QC tools.
|
||||
2. **Services**: factory automation and data acquisition for another
|
||||
plant (integration and commissioning), remote monitoring and support,
|
||||
hosting of ERPNext and the factory application, training.
|
||||
3. **Shared development**: each plant that joins contributes the adapters
|
||||
for its own machines, so the stack covers more presses over time.
|
||||
|
||||
None of this is in the business plan's revenue: no price or volume is
|
||||
set, and it is an upside like stamper supply to other plants.
|
||||
|
||||
## What the fleet already provides
|
||||
|
||||
Read the clan's own runbook (`docs/` in the repo, served on `control`) for
|
||||
|
||||
@@ -669,9 +669,9 @@ What it says:
|
||||
## 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-210m-thb-october-2026)):
|
||||
([total investment](total-investment.md#two-plans-a-at-180m-thb-and-b-at-215m-thb-october-2026)):
|
||||
**Plan A** (~177M THB, the launch plant with six cost levers) and
|
||||
**Plan B** (~208M THB, the same launch plant with everything in), both
|
||||
**Plan B** (~216M THB, the same launch plant with everything in), both
|
||||
priced without contingency and with the ramp-up reserve. Both run the
|
||||
same three presses, so volume, price, direct cost, title services and
|
||||
overheads are those of the launch-plant table above; only the
|
||||
@@ -679,14 +679,14 @@ depreciation follows each plan's capital (estimates):
|
||||
|
||||
- **Plan A**: the high end of its 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**: 7.47M USD over 10 years, 5.84M over 12.5, 4.22M over 15.
|
||||
Its owned solar saves the PPA power bill; cassette and CD-R sales, tours
|
||||
solar PPA adds its power price to the energy line (~0.07M USD a year in
|
||||
the calculator for the ~640 kWp array), not shown here.
|
||||
- **Plan B**: 7.73M USD over 10 years, 6.08M over 12.5, 4.42M over 15.
|
||||
Its owned solar (~640 kWp, every roof and canopy) saves the PPA power bill; cassette and CD-R sales, tours
|
||||
and the Payap programmes it opens from the start are not modelled.
|
||||
- **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.52M / 6.30M /
|
||||
8.07M USD from the low to the high end).
|
||||
reserve (Plan A 3.86M / 5.35M / 6.85M USD, Plan B 4.72M / 6.53M /
|
||||
8.34M USD from the low to the high end).
|
||||
|
||||
| USD/yr | A adverse | A central | A favourable | B adverse | B central | B favourable |
|
||||
|---|---|---|---|---|---|---|
|
||||
@@ -697,10 +697,10 @@ depreciation follows each plan's capital (estimates):
|
||||
| Title-services contribution | 0.07M | 0.23M | 0.48M | 0.07M | 0.23M | 0.48M |
|
||||
| Cash overheads | 0.45M | 0.33M | 0.20M | 0.45M | 0.33M | 0.20M |
|
||||
| **EBITDA** | **0.23M** | **1.73M** | **3.79M** | **0.23M** | **1.73M** | **3.79M** |
|
||||
| Depreciation | 0.62M | 0.39M | 0.24M | 0.75M | 0.47M | 0.28M |
|
||||
| **Operating profit** | **-0.39M** | **1.34M** | **3.55M** | **-0.52M** | **1.26M** | **3.51M** |
|
||||
| Depreciation | 0.62M | 0.39M | 0.24M | 0.77M | 0.49M | 0.29M |
|
||||
| **Operating profit** | **-0.39M** | **1.34M** | **3.55M** | **-0.54M** | **1.24M** | **3.50M** |
|
||||
| Revenue | 2.28M (~75M THB) | 3.65M (~120M THB) | 5.41M (~179M THB) | 2.28M (~75M THB) | 3.65M (~120M THB) | 5.41M (~179M THB) |
|
||||
| Payback on the plan price (EBITDA, mature year) | ~30 yr | ~3.1 yr (2.2 to 4.0) | ~1.0 yr | ~35 yr | ~3.6 yr (2.6 to 4.7) | ~1.2 yr |
|
||||
| Payback on the plan price (EBITDA, mature year) | ~30 yr | ~3.1 yr (2.2 to 4.0) | ~1.0 yr | ~36 yr | ~3.8 yr (2.7 to 4.8) | ~1.2 yr |
|
||||
|
||||
What it says:
|
||||
|
||||
@@ -708,14 +708,16 @@ What it says:
|
||||
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.23 million records**, and its adverse
|
||||
- **Plan B** breaks even at **~0.24 million records**, and its adverse
|
||||
corner loses more (~1.1 million records needed to cover depreciation).
|
||||
At the central cost and volume the price that covers its depreciation
|
||||
is ~2.8 USD (~91 THB) a record.
|
||||
- **On these numbers Plan B's extra ~31M THB earns nothing**: the same
|
||||
EBITDA, more depreciation and a longer payback. Its case rests on what
|
||||
the table leaves out: the BOI solar measure on the owned array, the
|
||||
PPA power bill it avoids, full stamper metrology from the first
|
||||
is ~2.8 USD (~92 THB) a record.
|
||||
- **On these numbers Plan B's extra ~39M THB earns little**: the same
|
||||
EBITDA here (the calculator, which splits energy by plan, puts it ~0.07M
|
||||
USD a year ahead for the PPA bill the owned array avoids), more
|
||||
depreciation and a longer payback. Its case rests on what
|
||||
the table leaves out: the PPA power bill it avoids (the BOI no longer
|
||||
promotes solar installations since July 2025), full stamper metrology from the first
|
||||
release, tours, the Payap programmes, and cassette and CD-R sales.
|
||||
- **The caveats above hold for both:** a central EBITDA margin of ~47 %
|
||||
is far above the 15 to 25 % pressing plants earn, the cost of specials
|
||||
@@ -724,10 +726,10 @@ What it says:
|
||||
|
||||
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 at 850k records: **Plan A** EBITDA 2.04M USD, payback 2.4
|
||||
build-up, give at 850k records: **Plan A** EBITDA 2.05M 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** EBITDA 2.07M USD, payback 2.8
|
||||
years, cash payback in year ~4.3 and ~21 % IRR (pre-tax, pre-financing,
|
||||
years with the reserve in year 0; **Plan B** EBITDA 2.12M USD, payback 2.9
|
||||
years, cash payback in year ~4.4 and ~21 % IRR (pre-tax, pre-financing,
|
||||
estimates).
|
||||
|
||||
## Operating picture at full capacity (five-press fleet)
|
||||
|
||||
@@ -51,7 +51,7 @@ on two shifts (estimate: the [scale](../scale.md) basis gives ~0.71 to
|
||||
| Cutting room: Sillitoe SDMS, spare cutterhead and support, mastering console and chain, monitoring, room build-out | 200k – 350k | 6.6M – 11.6M | SDMS list price USD 125k (ex tax and shipping); the rest estimate |
|
||||
| Metrology and QC stack (XRF, laser confocal, wide-area profiler, inline vision on three presses, audio station) | 350k – 810k | 11.6M – 26.7M | estimate, phaseable ([quality automation](../quality-automation.md)) |
|
||||
| PVC lab, day-one tier | 55k – 150k | 1.8M – 5.0M | estimate, [quality automation](../quality-automation.md) |
|
||||
| Utilities, solar, battery, HVAC, clean zones, racking | 835k – 1,439k | 27.6M – 47.5M | [utilities CSV](utilities-investment.csv) baseline re-sized for three presses: chiller bank two modules instead of three; solar at 20 to 26 THB/W installed and the battery installed (Thai market prices checked October 2026, sources in the CSV) |
|
||||
| Utilities, solar, battery, HVAC, clean zones, racking | 1,042k – 1,707k | 34.4M – 56.3M | [utilities CSV](utilities-investment.csv) baseline re-sized for three presses: chiller bank two modules instead of three; PV on every roof and canopy (~640 kWp, user decision 17 October 2026) at 20 to 26 THB/W installed and the battery installed (Thai market prices checked October 2026, sources in the CSV) |
|
||||
| Building ~1,500 m² plus civil and site works | 650k – 1,100k | 21.4M – 36.3M | estimate at 12,000 – 20,000 THB/m² plus ~20 % site works; soil is the main variable |
|
||||
| Overhead crane, runway, frame premium, machine door | 97k – 227k | 3.2M – 7.5M | estimate, [crane, workshop and tours](../crane-workshop-tours.md) |
|
||||
| Maintenance workshop and machine bay fit-out | 30k – 76k | 1.0M – 2.5M | estimate, same |
|
||||
@@ -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.22M – 7.47M | ~139M – 246M | midpoint ~5.84M USD, ~193M THB |
|
||||
| Contingency 15 % | ~0.63M – 1.12M | ~21M – 37M | |
|
||||
| **Total, launch plant** | **~4.85M – 8.6M USD** | **~160M – 283M THB** | midpoint ~6.72M USD, ~222M THB |
|
||||
| Subtotal | ~4.42M – 7.73M | ~146M – 255M | midpoint ~6.08M USD, ~201M THB |
|
||||
| Contingency 15 % | ~0.66M – 1.16M | ~22M – 38M | |
|
||||
| **Total, launch plant** | **~5.1M – 8.9M USD** | **~168M – 294M THB** | midpoint ~6.99M USD, ~231M 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,7 +78,7 @@ 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-210m-thb-october-2026)
|
||||
*Superseded by [Two plans](#two-plans-a-at-180m-thb-and-b-at-215m-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.*
|
||||
@@ -131,7 +131,7 @@ 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 ~210M THB (October 2026)
|
||||
## Two plans: A at ~180M THB and B at ~215M THB (October 2026)
|
||||
|
||||
Decided (user, October 2026): the business plan comes in **two
|
||||
versions** for the investor, built from the same documents:
|
||||
@@ -139,12 +139,16 @@ 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, ~210M THB**: the same launch plant, one Duplex system and
|
||||
- **Plan B, ~215M THB**: the same launch plant, one Duplex system and
|
||||
one Classic, with everything in: none of Plan A's six levers taken.
|
||||
First drawn as five presses at ~225M THB (Plan A plus 25 %); re-defined
|
||||
by the user on 17 October 2026 ("plan b should also only start with 1
|
||||
duplex and 1 classic, but with all levers"). In both plans the second
|
||||
Duplex system is a growth step from revenue.
|
||||
Duplex system is a growth step from revenue. On 17 October 2026 the
|
||||
solar array was sized to every roof and canopy (~640 kWp, "use as much
|
||||
roof space as possible"); that raised Plan B from ~208M to ~216M and
|
||||
Plan A's solar lever from ~9.7M to ~17.5M, and left Plan A's price as
|
||||
it was, because Plan A leases the array.
|
||||
|
||||
Both are priced **without contingency** (user decision) and **with the
|
||||
ramp-up reserve**, because the reserve is cash the investor puts in
|
||||
@@ -153,8 +157,8 @@ reference plus 20 % in both. Midpoints, estimates:
|
||||
|
||||
| Plan A: launch plant with six levers | Saves | Subtotal after it |
|
||||
|---|---|---|
|
||||
| Launch plant, every block, no contingency | | ~192.8M THB (~5.84M USD) |
|
||||
| Rooftop solar and battery through a solar PPA (the installer owns and finances the array, the plant buys the power) | ~9.7M | ~183.1M |
|
||||
| Launch plant, every block, no contingency | | ~200.6M THB (~6.08M USD) |
|
||||
| Solar (~640 kWp on every roof and canopy) and battery through a solar PPA (the installer owns and finances the array, the plant buys the power) | ~17.5M | ~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 |
|
||||
@@ -165,14 +169,14 @@ reference plus 20 % in both. Midpoints, estimates:
|
||||
|
||||
| Plan B: the launch plant, everything in | USD | THB |
|
||||
|---|---|---|
|
||||
| Launch plant, every block, no contingency (the six lever items included: owned solar and battery ~9.7M, full metrology ~8.8M, visitor corridor ~3.6M, cassette and CD-R ~4.0M, bought crane ~3.2M, Thai boilers and compressor ~1.9M, together ~31M THB at the midpoint) | 4.22M – 7.47M | ~139M – 246M, **~192.8M (~5.84M USD)** at the midpoint |
|
||||
| Launch plant, every block, no contingency (the six lever items included: owned solar (~640 kWp) and battery ~17.5M, full metrology ~8.8M, visitor corridor ~3.6M, cassette and CD-R ~4.0M, bought crane ~3.2M, Thai boilers and compressor ~1.9M, together ~39M THB at the midpoint) | 4.42M – 7.73M | ~146M – 255M, **~200.6M (~6.08M USD)** at the midpoint |
|
||||
| Ramp-up reserve | | +10M to 20M |
|
||||
| **Plan B** | | **~208M THB (~6.30M USD): ~210M**, ~149M to 266M from the low to the high end of every block |
|
||||
| **Plan B** | | **~216M THB (~6.53M USD): ~215M**, ~156M to 275M from the low to the high end of every block |
|
||||
|
||||
Plan B costs ~31M THB (~18 %) more than Plan A and, at the midpoint,
|
||||
stays within the investor's 180M THB plus 20 % (its high end, ~266M, does
|
||||
not). It keeps what Plan A leases or defers:
|
||||
owned solar and battery (and with them the BOI solar measure), the full
|
||||
Plan B costs ~39M THB (~22 %) more than Plan A and, at the midpoint,
|
||||
stays just within the investor's 180M THB plus 20 % (216M; its high end,
|
||||
~275M, does not). It keeps what Plan A leases or defers:
|
||||
owned solar on every roof and canopy and the battery, the full
|
||||
metrology stack from the first release, the visitor corridor and tours
|
||||
from the start, cassette and CD-R, the bought crane, Thai-supplied
|
||||
utilities with local service. Both plans have the same three presses and
|
||||
@@ -186,22 +190,26 @@ both as presets.
|
||||
- **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 ~29M on Plan B at the midpoint.
|
||||
Plan A and ~30M 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:** not demand, since both make the same
|
||||
records, but whether the investor funds ~31M THB more at launch for what
|
||||
records, but whether the investor funds ~39M THB more at launch for what
|
||||
Plan A leases or buys from revenue. On the modelled numbers Plan B's
|
||||
extra earns nothing (same EBITDA, more depreciation, a longer payback);
|
||||
its case rests on what the operating table leaves out: the BOI solar
|
||||
measure (only an owned array qualifies), full stamper metrology for the
|
||||
traceability pitch from the first release, tours and the Payap
|
||||
programmes from day one, cassette and CD-R sales, and utilities with
|
||||
local service. Most of Plan B's items can be added to Plan A later from
|
||||
revenue; the solar measure and the corridor are cheaper to have from
|
||||
the start. Both plans keep the second Duplex as a growth step, with its
|
||||
extra earns little: the same EBITDA in the revenue model (the calculator
|
||||
puts Plan B ~0.07M USD a year ahead, the PPA power bill its owned array
|
||||
avoids), more depreciation and a longer payback;
|
||||
its case rests on that bill and on what the operating table leaves out:
|
||||
full stamper metrology for the traceability pitch from the first release,
|
||||
tours and the Payap programmes from day one, cassette and CD-R sales, and
|
||||
utilities with local service. The BOI no longer promotes solar
|
||||
installations (Announcement 3/2568, in force 1 July 2025; only the
|
||||
battery may still qualify, see [BOI](../boi.md)), so owning the array
|
||||
earns no tax benefit, only the bill. Most of Plan B's items can be added
|
||||
to Plan A later from revenue; the corridor is cheaper to have from the
|
||||
start. Both plans keep the second Duplex as a growth step, with its
|
||||
floor, utility positions and ring-main tees reserved: ~15.4M THB at the
|
||||
midpoint for the system (~8.7M), a third chiller module CH-3 (~2.1M),
|
||||
their freight and installation (~1.2M) and the working capital for the
|
||||
|
||||
@@ -13,6 +13,6 @@ water,Galvanics ZLD evaporator,"Small MVR or low-temp vacuum evaporator for plat
|
||||
storage,Pallet racking and shelving,"100-200 pallet positions selective/heavy-duty (beams sized 1000-1500 kg/pallet, records are dense) + archive and finished-goods shelving, installed","Jenbunjerd; LPI Rack Range (Thailand), Bangkok/Samut Prakan, racking and office mobile shelving; local fabricators (Sahawatthanakit, UPR, SD Shelf); SSI Schaefer (premium)",800000,1500000,published list prices + engineering estimate,SSI Schaefer premium tier ~1.5-3M for same scope; ~1000-2000 THB per pallet position at local tier
|
||||
hvac,Whole-factory HVAC,"~1500 m2 at 20-26 C, 35-60% RH, ePM1/F7-F9 filtration sized for burning-season PM2.5, ducting and controls","Daikin Thailand; Trane; Mitsubishi Electric; Carrier; filtration: Camfil Thailand, AAF",7500000,15000000,engineering estimate at 5000-10000 THB/m2,"RH low end of 35% is aggressive for tropics and drives desiccant cost; if 45-60% RH acceptable, cost drops materially"
|
||||
hvac,Clean-room-grade zone adder,"Cutting room + galvanics clean room, ~2 x 60 m2, ISO 7/8 with HEPA terminals, positive pressure, airlocks",Same HVAC vendors + clean-room contractors; Camfil HEPA,1200000,3400000,engineering estimate at 10000-28000 THB/m2 adder,Applied only to the two tight zones
|
||||
solar,PV rooftop EPC (illustrative 300 kWp),"Turnkey C&I rooftop EPC incl. Deye hybrid inverters, at 20000-26000 THB/kWp",Solar Nicolo (Deye tier-1 distributor); Banpu NEXT; SCG Cleanergy; Sermsang; CapSolar; local Chiang Mai installers,6000000,7800000,"market rate per kWp (October 2026 check): DEDE Thailand PV Status (Mahidol survey) 22-25 THB/W for 10 kW-1 MW C&I systems in 2023; CapSolar 2026 20-25 THB/W under 1 MWp (20-23 at 500 kWp); Saimai Solar 2026 list 5.4M THB for 300 kW (18 THB/W); top of range covers Deye SUN-50K-SG01HP3 hybrid inverters (160,500 THB each at Supsaringkan, six units); size illustrative","Final kWp open until site selection; canopy PV over parking needs its own steel structure (not priced); PEA TOU 3.2.2 plus Ft (Sep-Dec 2026): self-consumed PV worth ~3.7 THB/kWh, ~3.8-5.4 yr payback (sustainability.md, grid tariff)"
|
||||
solar,"PV EPC, every roof and canopy covered (~640 kWp on the Payap scenario plot)","Turnkey C&I EPC on the factory roof (~523 kWp), the office roof (~65 kWp) and the car and scooter canopies (~54 kWp), incl. inverters (Deye hybrids where the battery connects), at 20000-26000 THB/kWp",Solar Nicolo (Deye tier-1 distributor); Banpu NEXT; SCG Cleanergy; Sermsang; CapSolar; local Chiang Mai installers,12800000,16640000,"market rate per kWp (October 2026 check): DEDE Thailand PV Status (Mahidol survey) 22-25 THB/W for 10 kW-1 MW C&I systems in 2023; CapSolar 2026 20-25 THB/W under 1 MWp (20-23 at 500 kWp); Saimai Solar 2026 list 5.4M THB for 300 kW (18 THB/W); top of range covers Deye SUN-50K-SG01HP3 hybrid inverters (160,500 THB each at Supsaringkan, about ten 50 kW units for ~500 kVA); size: the roofs full, user decision 17 Oct 2026 (was an illustrative 300 kWp)","Size follows the site: on the Mueang Chi hall the roof and canopies take ~300 kWp (scale.md), the rest would be ground mount; canopy steel is in the construction RFQ site works; ~85% of the yield used on site under PEA zero export (hourly sketch, estimate); self-consumed PV worth ~3.7 THB/kWh, ~4.2-5.9 yr payback (sustainability.md, grid tariff)"
|
||||
solar,Battery stack 271 kWh (Gobel) installed,"GP-SRA-HV314 HV LiFePO4 rack, 15 x 18 kWh packs, direct from Shenzhen, 50-60 day lead; plus enclosure, fire detection and suppression, controls and installation",Gobel Power (no Thai distributor; integration by solar EPC),2000000,3500000,"battery: vendor listed price USD 39900-58000 at ~35 THB/USD = 1.40-2.03M THB, in line with DEDE's 5000-7000 THB/kWh for LiFePO4 (Mahidol survey); installed: estimate below CapSolar's 12000-15000 THB/kWh for a fully installed factory BESS (2026), because the Deye hybrid inverters in the PV row do the power conversion",Confirm Deye BMS protocol compatibility and that the EPC warrants a mixed-vendor DC bus; certs (UN38.3/IEC 62619/CE) to be requested
|
||||
total,BASELINE TOTAL,Electric steam bank (2 modules) + oil-injected air + chiller bank (2 modules) + softener + loop treatment + local racking + HVAC + clean zones + 300 kWp solar + 271 kWh BESS,,27570000,47500000,sum of baseline rows,"Launch plant, one Duplex system and one Classic (October 2026; solar and battery re-priced from Thai market data 17 Oct 2026, was 28.47M-48.73M; was 30.07M-51.33M THB for five presses, 23.98M-41.63M for one Duplex); ~750k-1280k EUR at 38 THB/EUR; excludes options rows and the galvanics water rows (ZLD, DI), which total-investment.md carries with galvanics; all figures budgetary +/- 30%, get RFQs before BOI"
|
||||
total,BASELINE TOTAL,Electric steam bank (2 modules) + oil-injected air + chiller bank (2 modules) + softener + loop treatment + local racking + HVAC + clean zones + ~640 kWp solar + 271 kWh BESS,,34370000,56340000,sum of baseline rows,"Launch plant, one Duplex system and one Classic (October 2026; solar and battery re-priced from Thai market data and the array sized to every roof and canopy 17 Oct 2026, was 27.57M-47.50M at 300 kWp and 28.47M-48.73M before the re-price; was 30.07M-51.33M THB for five presses, 23.98M-41.63M for one Duplex); ~750k-1280k EUR at 38 THB/EUR; excludes options rows and the galvanics water rows (ZLD, DI), which total-investment.md carries with galvanics; all figures budgetary +/- 30%, get RFQs before BOI"
|
||||
|
@@ -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 180M THB and 180M plus 25 % (Plan A ~180M, Plan B ~210M), runs the P&L and a
|
||||
checks it against 180M THB and 180M plus 25 % (Plan A ~180M, Plan B ~215M), 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
|
||||
@@ -610,7 +610,7 @@ html[data-theme=light] .iso-svg .iso-glint { display: inline; }
|
||||
<span>Presets:</span>
|
||||
<button type="button" data-p="launch">Launch plant (decided)</button>
|
||||
<button type="button" data-p="planA">Plan A (~180M)</button>
|
||||
<button type="button" data-p="planB">Plan B (~210M, all in)</button>
|
||||
<button type="button" data-p="planB">Plan B (~215M, all in)</button>
|
||||
<button type="button" data-p="lean">Lean: bought stampers, outsourced cutting</button>
|
||||
<button type="button" data-p="full">Full hall (5 D + 4 C)</button>
|
||||
</div>
|
||||
@@ -732,7 +732,7 @@ html[data-theme=light] .iso-svg .iso-glint { display: inline; }
|
||||
<section class="card">
|
||||
<h2>Budget: Plan A and Plan B</h2>
|
||||
<p class="note" style="margin-top:0">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 ~210M THB keeps the same launch plant (one Duplex system
|
||||
machine of the launch plant with six cost levers, Plan B at ~215M THB keeps the same launch plant (one Duplex system
|
||||
and one Classic) with everything the levers cut; both priced without contingency and with the ramp-up reserve,
|
||||
the second Duplex a growth step in both. Marks at 180M and 180M plus 25 % (225M). Bars: the investment
|
||||
at the low end, the midpoint and the high end of every block (contingency as set under Plant configuration),
|
||||
@@ -884,8 +884,8 @@ html[data-theme=light] .iso-svg .iso-glint { display: inline; }
|
||||
line, Sibert, cutting room, metrology, ZLD and DI water) to the capex and shows the import VAT as cash
|
||||
paid at the border, reclaimable as input tax. Raw material: no duty on compound for exported
|
||||
records, 90 % off for domestic sales. Revenue is net of VAT (exports zero-rated, 7 % on domestic
|
||||
sales passed on). Corporate income tax and BOI's CIT exemptions (solar, automation, R&D) are not
|
||||
modelled.</p>
|
||||
sales passed on). Corporate income tax and BOI's CIT exemptions (automation, R&D, possibly the battery; solar
|
||||
installations are no longer promoted since July 2025) are not modelled.</p>
|
||||
<p><b>Labour.</b> Base salaries per role (revenue-model.md, its loaded rates divided by 1.3; the cutting
|
||||
engineer a team figure), plus the employer's 5 % social security up to the 17,500 THB ceiling, 25 %
|
||||
for overtime, bonus and PPE, and the company's health care for every member of staff, office
|
||||
@@ -931,7 +931,7 @@ html[data-theme=light] .iso-svg .iso-glint { display: inline; }
|
||||
var VERSION = "1.1";
|
||||
var DEF = {
|
||||
duplex: 1, classic: 1, galvanics: true, cutting: true, metrology: "full",
|
||||
cassette: true, cdr: true, solar: "buy", pvKwp: 300, batteryKwh: 271,
|
||||
cassette: true, cdr: true, solar: "buy", pvKwp: 640, batteryKwh: 271,
|
||||
fuel: "electric", boilerModules: 2, chillerModules: 2, crane: "buy",
|
||||
corridor: true, phase2: false, running: true, labels: true
|
||||
};
|
||||
@@ -1314,6 +1314,9 @@ html[data-theme=light] .iso-svg .iso-glint { display: inline; }
|
||||
|
||||
// ------------------------------------------------------------ PV placement
|
||||
var PV_ROWS = [1, 3, 5, 7, 10, 12, 14, 16, 19, 21];
|
||||
// kWp per drawn module place (~2 m2): every place on the factory roof, the office roof and the two canopies
|
||||
// together (1,467) is the ~640 kWp design (site-candidates.md parts model plus the office roof)
|
||||
var PV_MOD = 0.4363;
|
||||
function pvFields(cfg, al) {
|
||||
var f = [];
|
||||
// the parking canopies carry PV first (construction RFQ: canopy PV), the factory roof takes the rest
|
||||
@@ -1321,12 +1324,17 @@ html[data-theme=light] .iso-svg .iso-glint { display: inline; }
|
||||
f.push({ key: "scoot", x0: 20.35, cols: 13, y0: 26, rows: [0.4, 2.85], z: function (y) { return 2.45 + (y - 26) / 5.5 * 1.05 + 0.08; } });
|
||||
f.push({ key: "roofW", x0: X(1), cols: 103, y0: FY, rows: PV_ROWS, z: function (y) { return roofZ(y - FY) + 0.12; } });
|
||||
f.push({ key: "roofE", x0: X(107.25), cols: 19, y0: FY, rows: PV_ROWS, z: function (y) { return roofZ(y - FY) + 0.12; } });
|
||||
// office roof: flat, the three AC units in the middle keep a clear strip around them
|
||||
var oz = function () { return OFC.z1 + 0.14; };
|
||||
f.push({ key: "offW", x0: OFC.x0 + 1, cols: 18, y0: OFC.y0, rows: [0.8, 3.1, 5.4, 7.7, 10.0, 12.3], z: oz });
|
||||
f.push({ key: "offM", x0: OFC.x0 + 20, cols: 7, y0: OFC.y0, rows: [0.8, 12.3], z: oz });
|
||||
f.push({ key: "offE", x0: OFC.x0 + 28, cols: 3, y0: OFC.y0, rows: [0.8, 3.1, 5.4, 7.7, 10.0, 12.3], z: oz });
|
||||
if (al.p2show) f.push({ key: "p2", x0: P2.x0 + 1, cols: 40, y0: P2.y0, rows: [1, 3, 5, 7, 10, 12, 14, 16, 19, 21, 23],
|
||||
z: function (y) { return FFL + P2.eave + (P2.high - P2.eave) * (y - P2.y0) / (P2.y1 - P2.y0) + 0.12; } });
|
||||
return f;
|
||||
}
|
||||
function pvPlace(cfg, al) {
|
||||
var want = cfg.solar === "none" ? 0 : Math.round(cfg.pvKwp / 0.45), left = want, out = {}, fields = pvFields(cfg, al), i, k, r, c;
|
||||
var want = cfg.solar === "none" ? 0 : Math.round(cfg.pvKwp / PV_MOD), left = want, out = {}, fields = pvFields(cfg, al), i, k, r, c;
|
||||
for (i = 0; i < fields.length; i++) {
|
||||
var F = fields[i], list = [];
|
||||
for (r = 0; r < F.rows.length && left > 0; r++) {
|
||||
@@ -1535,8 +1543,8 @@ html[data-theme=light] .iso-svg .iso-glint { display: inline; }
|
||||
sp.prism(rect(20, 26, 33.7, 31.5), [2.3, 2.3, 3.35, 3.35], [2.45, 2.45, 3.5, 3.5], "iso-canopy");
|
||||
pvDraw(sp, pv.by.scoot.F, pv.by.scoot.panels);
|
||||
var nc = pv.by.cars.panels.length, ns = pv.by.scoot.panels.length;
|
||||
sc.inf("canopy-cars", "Car canopy, 10 bays", "27.7 x 7.0 m at 4.1 m (construction RFQ)" + (nc ? "; " + nc + " PV modules (~" + fmt(nc * 0.45) + " kWp)" : ""));
|
||||
sc.inf("canopy-scooters", "Scooter canopy, ~30 spaces", "13.7 x 5.5 m at 3.5 m (construction RFQ)" + (ns ? "; " + ns + " PV modules (~" + fmt(ns * 0.45) + " kWp)" : ""));
|
||||
sc.inf("canopy-cars", "Car canopy, 10 bays", "27.7 x 7.0 m at 4.1 m (construction RFQ)" + (nc ? "; " + nc + " PV modules (~" + fmt(nc * PV_MOD) + " kWp)" : ""));
|
||||
sc.inf("canopy-scooters", "Scooter canopy, ~30 spaces", "13.7 x 5.5 m at 3.5 m (construction RFQ)" + (ns ? "; " + ns + " PV modules (~" + fmt(ns * PV_MOD) + " kWp)" : ""));
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------ factory
|
||||
@@ -2253,7 +2261,7 @@ html[data-theme=light] .iso-svg .iso-glint { display: inline; }
|
||||
});
|
||||
s.open(S.N[0], S.N[1], [[o.x1 - LINK.x1 + 0.7, o.x1 - LINK.x0 - 0.7, o.z0, o.z0 + 2.5]], "iso-door", "link");
|
||||
}
|
||||
function office(sc, cfg, level) {
|
||||
function office(sc, cfg, level, pv) {
|
||||
var o = OFC, x0 = o.x0, y0 = o.y0, x1 = o.x1, y1 = o.y1, S = sides(x0, y0, x1, y1);
|
||||
officeInfo(sc, cfg);
|
||||
// covered link (all levels)
|
||||
@@ -2267,6 +2275,7 @@ html[data-theme=light] .iso-svg .iso-glint { display: inline; }
|
||||
s.box(x0, y0, x1, y1, o.z0, o.z1, "iso-office", { top: "iso-roof3" });
|
||||
officeWindows(s, S, o, true);
|
||||
s.flat(rect(x0 + 0.4, y0 + 0.4, x1 - 0.4, y1 - 0.4), o.z1 + 0.01, "iso-roofin");
|
||||
if (pv) ["offW", "offM", "offE"].forEach(function (k) { if (pv.by[k]) pvDraw(s, pv.by[k].F, pv.by[k].panels); });
|
||||
s.seq([[x0 + 20.8, y0 + 5.6], [x0 + 23.4, y0 + 5.6], [x0 + 26, y0 + 9.4]].map(function (p) {
|
||||
return [p[0], p[1], function (q) { q.box(p[0] - 0.8, p[1] - 0.6, p[0] + 0.8, p[1] + 0.6, o.z1, o.z1 + 1.0, "iso-ac"); q.disc(p[0], p[1], o.z1 + 1.01, 0.42, "iso-fanring"); }];
|
||||
}));
|
||||
@@ -2486,7 +2495,7 @@ html[data-theme=light] .iso-svg .iso-glint { display: inline; }
|
||||
factoryInfo(sc, cfg, al);
|
||||
if (inside) { sc.dim = up; factoryInside(sc, ctx, al, pv, up); sc.dim = false; if (up) blockUpper(sc, cfg); }
|
||||
else factoryRoof(sc, cfg, pv);
|
||||
office(sc, cfg, level);
|
||||
office(sc, cfg, level, pv);
|
||||
var y = yard(sc, cfg, inside, pv);
|
||||
if (al.p2show) { sc.dim = up; phase2(sc, ctx, inside, al, pv); sc.dim = false; }
|
||||
else {
|
||||
@@ -2496,14 +2505,16 @@ html[data-theme=light] .iso-svg .iso-glint { display: inline; }
|
||||
vehicles(sc, cfg);
|
||||
// PV info and roof tags
|
||||
var ppa = cfg.solar === "ppa", onRoof = pv.by.roofW.panels.length + pv.by.roofE.panels.length,
|
||||
onCp = pv.by.cars.panels.length + pv.by.scoot.panels.length, onP2 = pv.by.p2 ? pv.by.p2.panels.length : 0;
|
||||
onCp = pv.by.cars.panels.length + pv.by.scoot.panels.length, onP2 = pv.by.p2 ? pv.by.p2.panels.length : 0,
|
||||
onOf = pv.by.offW.panels.length + pv.by.offM.panels.length + pv.by.offE.panels.length;
|
||||
if (cfg.solar !== "none" && pv.want > 0) {
|
||||
var kwp = cfg.pvKwp, parts = [onRoof + " on the factory roof"];
|
||||
if (onOf) parts.push(onOf + " on the office roof");
|
||||
if (onCp) parts.push(onCp + " on the parking canopies");
|
||||
if (onP2) parts.push(onP2 + " on the phase 2 roof");
|
||||
sc.inf("pv", "PV " + fmt(kwp) + " kWp, " + fmt(cfg.batteryKwh) + " kWh battery" + (ppa ? " (PPA)" : ""),
|
||||
fmt(pv.want) + " modules of ~0.45 kWp (~2 m2 each): " + parts.join(", ") + (pv.left ? "; " + fmt(pv.left) + " do not fit the roofs (ground mount)" : "") +
|
||||
". About " + fmt(kwp * 1.4) + " to " + fmt(kwp * 1.5) + " MWh a year at 1,400 to 1,500 kWh/kWp (scale.md)" + (ppa ? ". PPA: the EPC owns the panels, the plant buys the power." : "."));
|
||||
fmt(pv.want) + " modules of ~" + PV_MOD.toFixed(2) + " kWp (~2 m2 each): " + parts.join(", ") + (pv.left ? "; " + fmt(pv.left) + " do not fit the roofs (ground mount)" : "") +
|
||||
". About " + fmt(kwp * 1.4) + " to " + fmt(kwp * 1.5) + " MWh a year at 1,400 to 1,500 kWh/kWp (scale.md), ~85 % of it used on site (zero export)" + (ppa ? ". PPA: the EPC owns the panels, the plant buys the power." : "."));
|
||||
if (!inside && onRoof) {
|
||||
sc.tag(X(52), Y(10), roofZ(10) + 1.5, "PV " + fmt(kwp) + " kWp", 10, "pv");
|
||||
if (ppa) sc.tag(X(80), Y(6), roofZ(6) + 1.0, "PPA panels", 100, "pv", "iso-signtag");
|
||||
@@ -2955,8 +2966,9 @@ grp("Energy", [
|
||||
["kwhPrice", "Electricity, blended", 3.81, "THB/kWh", "doc", "scale.md: PEA TOU 3.2.2 at two shifts, before the demand charge (Ft September to December 2026)"],
|
||||
["demandPrice", "Demand charge", 132.93, "THB/kW a month", "doc", "PEA 3.2.2 (scale.md)"],
|
||||
["restKW", "Rest of the plant while running", 120, "kW", "est", "Estimate: HVAC, lighting, galvanics, finishing, offices; puts the start fleet in scale.md's 4.5 to 6.8M THB a year before PV"],
|
||||
["pvKWp", "Roof PV", 247, "kWp", "doc", "scale.md"],
|
||||
["pvYield", "PV yield, all self-consumed", 1400, "kWh/kWp", "doc", "scale.md: 1,400 to 1,500 kWh/kWp a year in northern Thailand"],
|
||||
["pvKWp", "PV array: factory roof, office roof and parking canopies, all full", 640, "kWp", "est", "Payap scenario: factory roof ~523 kWp and canopies ~54 kWp (site-candidates.md parts model, 580 W placeholder module) plus the office roof ~65 kWp (estimate from this drawing); on the Mueang Chi hall the roof and canopies take ~300 kWp (scale.md)"],
|
||||
["pvYield", "PV yield", 1400, "kWh/kWp", "doc", "scale.md: 1,400 to 1,500 kWh/kWp a year in northern Thailand"],
|
||||
["pvSelf", "Share of the PV yield used on site", 85, "%", "est", "Hourly sketch (October 2026): two shifts on 300 days, ~60 kW off-shift base load, the 271 kWh battery; the rest is curtailed, because a factory on PEA's grid runs zero export (sustainability.md)"],
|
||||
["heatPrice", "Steam heat from biomass", 0.7, "THB/kWh", "doc", "biomass.md: 0.5 to 0.9 at 1.35 to 2 THB/kg delivered"],
|
||||
["steamKWh", "Heat per kg of steam", 0.68, "kWh/kg", "est", "Estimate: 10 bar saturated steam from ~80 °C feed water"],
|
||||
["eBoilEff", "Electric boiler efficiency", 98, "%", "est", "Estimate for an electric steam boiler (~98 %)"],
|
||||
@@ -3028,8 +3040,8 @@ rng("Investment blocks (USD unless THB)", [
|
||||
["airT", "Compressed air, Thai supplier", 350000, 600000, "THB", "est", "Utilities CSV: screw compressor skid, dryer, receiver"],
|
||||
["airC", "Compressed air, Chinese brand through its Thai office", 150000, 300000, "THB", "est", "china-utilities.md: PM VSD screw set 0.15 to 0.3M THB installed"],
|
||||
["clR", "Clean-room adder (galvanics and cutting room)", 1200000, 3400000, "THB", "est", "Utilities CSV, ~2 × 60 m² ISO 7/8; half with only one of the two rooms (estimate)"],
|
||||
["uRest", "Rest of the utilities baseline: softener, loop treatment, racking, whole-factory HVAC", 8620000, 17300000, "THB", "est", "Utilities CSV baseline 27.57 to 47.50M THB less boilers, chillers, air, clean room, PV and battery"],
|
||||
["pv", "Rooftop PV EPC", 6000000, 7800000, "THB", "est", "Utilities CSV: illustrative 300 kWp at 20 to 26 THB/W installed (DEDE Thailand PV status: factories 10 kW to 1 MW 22 to 25 THB/W, 2023; installers 18 to 25 in 2026) incl. Deye hybrid inverters; final kWp open (scale.md 247 kWp for the yield)"],
|
||||
["uRest", "Rest of the utilities baseline: softener, loop treatment, racking, whole-factory HVAC", 8620000, 17300000, "THB", "est", "Utilities CSV baseline 34.37 to 56.34M THB less boilers, chillers, air, clean room, PV and battery"],
|
||||
["pv", "PV EPC per kWp, roofs and canopies", 20000, 26000, "THB", "est", "Utilities CSV: 20 to 26 THB/W installed (DEDE Thailand PV status: factories 10 kW to 1 MW 22 to 25 THB/W, 2023; installers 18 to 25 in 2026) incl. the inverters; times the array size above; canopy steel is in the building and site works (construction RFQ)"],
|
||||
["bat", "Battery 271 kWh (Gobel), installed", 2000000, 3500000, "THB", "est", "Utilities CSV: Gobel list price USD 39,900 to 58,000 (battery only, matches DEDE's 5,000 to 7,000 THB/kWh for LiFePO4) plus enclosure, fire protection, controls and installation, below the 12,000 to 15,000 THB/kWh of a fully installed factory BESS because the hybrid inverters do the power conversion (estimate)"],
|
||||
["bld", "Building ~1,500 m² plus civil and site works", 650000, 1100000, "USD", "est", "total-investment.md: 12,000 to 20,000 THB/m² plus ~20 % site works; soil is the main variable"],
|
||||
["ph2", "Phase 2 building, when the press floor outgrows the press hall", 750000, 1250000, "USD", "est", "Business plan draft 0.1: ~750k to 1,250k on 1,710 m², estimate"],
|
||||
@@ -3052,7 +3064,7 @@ grp("Investment rules", [
|
||||
["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", "Plan A budget", 180000000, "THB", "doc", "total-investment.md: Plan A, ~180M THB without contingency, ramp-up reserve included"],
|
||||
["budgetHi", "Upper budget mark, 180M plus 25 %", 225000000, "THB", "doc", "total-investment.md: the +25 % envelope set for Plan B (user, October 2026); Plan B is ~210M"],
|
||||
["budgetHi", "Upper budget mark, 180M plus 25 %", 225000000, "THB", "doc", "total-investment.md: the +25 % envelope set for Plan B (user, October 2026); Plan B is ~215M"],
|
||||
]);
|
||||
grp("Ten years of cash", [
|
||||
["ramp1", "Sold output in year 1", 35, "% of the mature year", "est", "Estimate"],
|
||||
@@ -3092,7 +3104,7 @@ 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,
|
||||
// Plan A (~180M THB, six levers) and Plan B (~210M THB, the launch plant all in): total-investment.md "Two plans", priced without contingency
|
||||
// Plan A (~180M THB, six levers) and Plan B (~215M THB, the launch plant all in): 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: { ...LAUNCH, cont: "sep" },
|
||||
lean: { ...LAUNCH, galv: "bought", cut: "out" },
|
||||
@@ -3239,7 +3251,7 @@ function capexOf(r, c = S, boiOn = c.boi !== "off") {
|
||||
if (cr > 0) blk("Utilities", "clR", cr === 1 ? "Clean-room adder: galvanics and cutting room" : `Clean-room adder, half: ${galvIn ? "galvanics" : "cutting room"} only`, cr, true);
|
||||
blk("Utilities", "uRest", "Rest of the utilities baseline: softener, loop treatment, racking, whole-factory HVAC", 1, true);
|
||||
if (c.solar === "buy") {
|
||||
blk("Utilities", "pv", "Rooftop PV, EPC", 1, true);
|
||||
blk("Utilities", "pv", `PV on the roofs and canopies, ${f0(A.pvKWp)} kWp, EPC`, A.pvKWp, true);
|
||||
blk("Utilities", "bat", "Battery 271 kWh (Gobel)", 1, true);
|
||||
}
|
||||
blk("Building and site", "bld", "Building ~1,500 m² plus civil and site works");
|
||||
@@ -3319,10 +3331,10 @@ function econ(r, b, boiOn = S.boi !== "off") {
|
||||
const steamT = r.P * (A.steamLo + A.steamHi) / 2 * runH / 1000;
|
||||
const heatMWh = steamT * A.steamKWh;
|
||||
const elecMWh = X > 0 ? r.mwh + heatMWh / Math.max(0.5, A.cop) + (r.compKW + A.restKW) * b.hoursYr / 1000 : 0;
|
||||
const pvMWh = S.solar === "none" ? 0 : Math.min(elecMWh, A.pvKWp * A.pvYield / 1000);
|
||||
const pvMWh = S.solar === "none" ? 0 : Math.min(elecMWh, A.pvKWp * A.pvYield / 1000 * Math.min(100, Math.max(0, A.pvSelf)) / 100);
|
||||
const demandKW = X > 0 ? r.kw + r.chillerKW + r.compKW + A.restKW : 0;
|
||||
add("energy", "Electricity", t2u((elecMWh - pvMWh) * 1000 * A.kwhPrice + demandKW * A.demandPrice * 12),
|
||||
`${f0(elecMWh - pvMWh)} MWh from the grid after ${f0(pvMWh)} MWh roof PV${S.solar === "none" ? " (no PV)" : S.solar === "ppa" ? " (PPA)" : ""}; ~${f0(demandKW)} kW demand`);
|
||||
`${f0(elecMWh - pvMWh)} MWh from the grid after ${f0(pvMWh)} MWh of PV used on site${S.solar === "none" ? " (no PV)" : S.solar === "ppa" ? " (PPA)" : ""}; ~${f0(demandKW)} kW demand`);
|
||||
if (S.solar === "ppa") add("energy", "Solar PPA power", t2u(pvMWh * 1000 * A.ppaPrice), `${f0(pvMWh)} MWh at ${f2(A.ppaPrice)} THB/kWh (estimate, to quote)`);
|
||||
if (S.steamFuel === "biomass")
|
||||
add("energy", "Steam heat (biomass)", t2u(heatMWh * 1000 * A.heatPrice), `${f0(steamT)} t of steam, ${f0(heatMWh)} MWh of heat at ${f2(A.heatPrice)} THB/kWh`);
|
||||
@@ -3634,9 +3646,9 @@ const CFG = [
|
||||
h: { off: "Illustrative volumes and prices with no market data; left out of the money.",
|
||||
on: "Counted at the illustrative volumes and prices, with no running costs on file: it flatters the result." },
|
||||
dis: () => S.cass === "off" && S.cdr === "off" ? "Not applicable: neither line is in the plant." : "" },
|
||||
{ k: "solar", t: "Solar PV and 271 kWh battery", sub: "utilities CSV: illustrative 300 kWp EPC plus the Gobel battery",
|
||||
{ k: "solar", t: "Solar PV and 271 kWh battery", sub: "every roof and canopy covered (~640 kWp) plus the Gobel battery",
|
||||
o: [["buy", "Buy"], ["ppa", "Solar PPA"], ["none", "None"]],
|
||||
h: { buy: () => `${mT("pv")} THB PV plus ${mT("bat")} battery; the yield offsets the bill.`,
|
||||
h: { buy: () => `${nf(1).format(A.pvLo * A.pvKWp / 1e6)}M to ${nf(1).format(A.pvHi * A.pvKWp / 1e6)}M THB for ${f0(A.pvKWp)} kWp plus ${mT("bat")} battery; the yield offsets the bill.`,
|
||||
ppa: "No capex: the EPC owns the array, the plant pays the PPA price on the yield.",
|
||||
none: "No PV: the whole bill comes from the grid." },
|
||||
extra: `<label class="row" id="row_ppa"><span>PPA power price, THB/kWh<br><small>estimate, to quote</small></span><input type="number" id="ppaIn" data-a="ppaPrice" min="0" step="0.05"></label>` },
|
||||
@@ -3710,7 +3722,7 @@ function renderInvest(e, r) {
|
||||
H.push(`<tr class="grp"><td colspan="5">Totals</td></tr>`);
|
||||
TR("Subtotal", cx.sub, "", 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 ~160M to 283M THB with contingency (midpoint ~222M); Plan A ~162M and Plan B ~193M at the midpoint without it, plus the ramp-up reserve", true);
|
||||
TR("Total investment", cx.tot, "for reference, total-investment.md: the launch plant ~168M to 294M THB with contingency (midpoint ~231M); Plan A ~162M and Plan B ~201M 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);
|
||||
@@ -3790,7 +3802,7 @@ function renderCash(e, r) {
|
||||
let ISO = null, ISOK = "";
|
||||
function isoCfg(r) {
|
||||
return { duplex: r.D, classic: r.C, galvanics: S.galv, cutting: S.cut, metrology: S.metro,
|
||||
cassette: S.cass, cdr: S.cdr, solar: S.solar, pvKwp: 300, batteryKwh: 271, fuel: S.steamFuel,
|
||||
cassette: S.cass, cdr: S.cdr, solar: S.solar, pvKwp: A.pvKWp, batteryKwh: 271, fuel: S.steamFuel,
|
||||
boilerModules: r.nb, chillerModules: r.nc, crane: S.crane, corridor: S.corridor, phase2: r.floor > A.hall };
|
||||
}
|
||||
function isoUpdate(r) {
|
||||
|
||||
|
Before Width: | Height: | Size: 190 KiB After Width: | Height: | Size: 190 KiB |
|
Before Width: | Height: | Size: 149 KiB After Width: | Height: | Size: 147 KiB |
|
Before Width: | Height: | Size: 491 KiB After Width: | Height: | Size: 654 KiB |
|
Before Width: | Height: | Size: 866 KiB After Width: | Height: | Size: 866 KiB |
|
Before Width: | Height: | Size: 542 KiB After Width: | Height: | Size: 697 KiB |
|
Before Width: | Height: | Size: 192 KiB After Width: | Height: | Size: 192 KiB |
|
Before Width: | Height: | Size: 147 KiB After Width: | Height: | Size: 148 KiB |
|
Before Width: | Height: | Size: 487 KiB After Width: | Height: | Size: 648 KiB |
|
Before Width: | Height: | Size: 884 KiB After Width: | Height: | Size: 884 KiB |
|
Before Width: | Height: | Size: 541 KiB After Width: | Height: | Size: 699 KiB |
|
Before Width: | Height: | Size: 335 KiB After Width: | Height: | Size: 335 KiB |
|
Before Width: | Height: | Size: 294 KiB After Width: | Height: | Size: 293 KiB |
@@ -11,7 +11,7 @@ These three run in parallel and gate everything downstream:
|
||||
1. **Market validation**: test the blended pressing price (3.76 to 5.27
|
||||
USD at the planned 60 % specials; 3.50 to 4.60 at a standard-heavy mix)
|
||||
and regional demand (~0.74M records a year in both Plan A and Plan B, and
|
||||
when the second Duplex follows from revenue) in [total investment](finance/total-investment.md#two-plans-a-at-180m-thb-and-b-at-210m-thb-october-2026),
|
||||
when the second Duplex follows from revenue) in [total investment](finance/total-investment.md#two-plans-a-at-180m-thb-and-b-at-215m-thb-october-2026),
|
||||
with Asian labels and distributors, starting at
|
||||
Making Vinyl in Haarlem (Alexander and Simona). This is the biggest
|
||||
assumption in the [revenue model](finance/revenue-model.md); the
|
||||
@@ -173,9 +173,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 (~160M to 283M THB with contingency; for the investor Plan A at
|
||||
~180M and Plan B at ~210M THB without it, in
|
||||
[total investment](finance/total-investment.md#two-plans-a-at-180m-thb-and-b-at-210m-thb-october-2026));
|
||||
round (~168M to 294M THB with contingency; for the investor Plan A at
|
||||
~180M and Plan B at ~215M THB without it, in
|
||||
[total investment](finance/total-investment.md#two-plans-a-at-180m-thb-and-b-at-215m-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.
|
||||
@@ -298,13 +298,19 @@ small against the connection, but its own feeder and meter.
|
||||
roof plane, per the [construction RFQ](finance/phase1-construction-rfq.md)).
|
||||
This supersedes the older rule of thumb of 150 to 200 kWp on a
|
||||
~1,500 m² building, which the massing model has overtaken
|
||||
- **Decided 17 October 2026: every roof and canopy carries PV.** On this
|
||||
hall that is the 247 kWp roof plus the canopies' ~40 to 54 kWp, ~300
|
||||
kWp; on the Payap scenario plot ~640 kWp, the size the investment and
|
||||
the business plan carry
|
||||
([sustainability](sustainability.md#roof-design-for-pv-candidate-mueang-chi-site))
|
||||
- Northern Thailand yield ~1,400 to 1,500 kWh/kWp/yr, so 300 kWp produces
|
||||
roughly **420 to 450 MWh/yr**
|
||||
roughly **420 to 450 MWh/yr** and ~640 kWp ~900 to 960 MWh/yr
|
||||
- Plant consumption at mature two-shift operation: roughly **1,000 to
|
||||
1,500 MWh/yr** without electric steam, up to **~2,500 MWh/yr** with it
|
||||
(estimate), so 300 kWp covers roughly **28 to 45%** of consumption
|
||||
without electric steam, falling to **~17%** with it; a bigger array
|
||||
shifts that up
|
||||
without electric steam, falling to **~17%** with it; ~640 kWp, at
|
||||
~85 % used on site under zero export, covers ~38 % of the launch
|
||||
plant's ~2,000 MWh with electric steam (calculator, estimate)
|
||||
- Battery: **271 kWh** Gobel stack (ride-through, roughly
|
||||
an hour of the chiller bank's peak electrical draw; peak shaving earns
|
||||
little under PEA's time-of-use tariff, see
|
||||
|
||||
@@ -349,7 +349,16 @@ parameter does.
|
||||
shift), so PEA's export terms decide whether the surplus is sold or
|
||||
curtailed;
|
||||
- the 271 kWh battery is sized for ride-through, not to absorb it;
|
||||
- the BOI solar measure caps eligible spend per MW ([BOI](boi.md)).
|
||||
- the BOI no longer promotes solar installations (since 1 July 2025;
|
||||
only the battery may qualify, [BOI](boi.md)).
|
||||
|
||||
Decided 17 October 2026: every roof and canopy carries PV. With the
|
||||
flat office roof (~65 kWp around its AC units, estimate from the
|
||||
[calculator](fleet-calculator.html) drawing) that is **~640 kWp**, the
|
||||
size in the investment and the business plan. PEA's zero-export rule
|
||||
answers the first point (surplus curtailed, ~85 % used on site in an
|
||||
hourly sketch); the permits and the BOI position are in
|
||||
[sustainability](sustainability.md#roof-design-for-pv-candidate-mueang-chi-site).
|
||||
|
||||
FreeCAD 26.3.0 RC1 does not pass a cell edit on to the parts that read
|
||||
the cell (a normal recompute updates only the sheet). After editing
|
||||
|
||||
@@ -47,8 +47,10 @@ process cooling (up to ~650 kW), drawn in [steam and cooling](steam-cooling.html
|
||||
[facility systems](facility-security.md)) adds a major tropical-climate
|
||||
load on top of process cooling and must be part of the PV and battery
|
||||
sizing.
|
||||
- System sizing (kWp, storage, grid-connection model) is open until the site
|
||||
is chosen.
|
||||
- **Array size, decided 17 October 2026: every roof and canopy carries PV**
|
||||
("use as much roof space as possible"), so the kWp follows the site:
|
||||
~640 kWp on the Payap scenario plot, ~300 kWp on the Mueang Chi hall
|
||||
(below). Storage beyond the 271 kWh ride-through battery stays open.
|
||||
|
||||
### Roof design for PV (candidate Mueang Chi site)
|
||||
|
||||
@@ -108,8 +110,49 @@ the electric-boiler route is chosen.
|
||||
|
||||
On the Payap scenario plot the 128 m factory roof takes ~901 modules
|
||||
(~523 kWp) and the car and scooter canopies another ~54 kWp, ~577 kWp in
|
||||
all; what that size means for export, the battery and BOI is in
|
||||
[site candidates](site-candidates.md#roof-pv-and-parking-canopies-part-and-draft-model-october-2026).
|
||||
all ([site candidates](site-candidates.md#roof-pv-and-parking-canopies-part-and-draft-model-october-2026)).
|
||||
The flat office roof adds ~65 kWp around its three AC units (estimate
|
||||
from the [calculator](fleet-calculator.html) drawing), so covering every
|
||||
roof and canopy gives **~640 kWp**, the size the investment and both
|
||||
business plan versions carry since 17 October 2026. On the Mueang Chi
|
||||
hall the same rule gives only ~300 kWp (the 247 kWp roof above plus the
|
||||
canopies); more there means ground mount on the plot behind the building
|
||||
or the phase 2 roof.
|
||||
|
||||
**What ~640 kWp means on the grid** (October 2026):
|
||||
|
||||
- **Zero export.** A factory on PEA's grid cannot sell its surplus: the
|
||||
interconnection needs a zero-export controller or reverse-power relay,
|
||||
and net billing is limited to small users
|
||||
([CapSolar, rooftop solar regulations 2026](https://capsolar.co.th/en/knowledge/rooftop-solar-regulations-thailand)).
|
||||
An hourly sketch (two shifts on 300 days, ~60 kW off-shift base load,
|
||||
the 271 kWh battery; estimate) puts **~85 % of the ~900 MWh yield to
|
||||
use on site**; the rest, mostly on Sundays and holidays, is curtailed.
|
||||
With electric steam the launch plant draws ~2,000 MWh a year, so the
|
||||
array covers ~38 % of it.
|
||||
- **Permits.** Since Ministerial Regulation No. 3 B.E. 2567 (in force
|
||||
28 December 2024) rooftop solar outside industrial estates is not a
|
||||
factory at any size, so no Ror.Ngor.4 licence; at ~500 kVA of inverters
|
||||
the array stays under the ERC's 1,000 kVA line and needs an exemption
|
||||
notification, not a generation licence; PEA's interconnection review
|
||||
takes 3 to 6 months and is filed alongside procurement
|
||||
([CapSolar, factory solar and the RG.4 permit](https://capsolar.co.th/en/knowledge/factory-solar-rg4-permit-thailand)).
|
||||
Ground mount is not covered by the rooftop exemption and is checked
|
||||
case by case.
|
||||
- **No BOI benefit for the panels.** Since 1 July 2025 (Announcement
|
||||
3/2568) the BOI no longer promotes solar installations; the battery and
|
||||
its inverters may still qualify, capped at 12M THB per MW
|
||||
([BOI](boi.md)). The array is justified by the bill alone.
|
||||
- **Leasing instead (Plan A).** Under a solar PPA the developer funds,
|
||||
installs and maintains the array and sells its power at a discount to
|
||||
the PEA tariff: usually 10 to 15 % over 15 to 20 years at MEAei
|
||||
([MEAei](https://meaei.com/en/best-solar-rooftop-businesses-thailand)),
|
||||
10 to 30 % over 15 to 25 years for bills of 100,000 THB a month and up
|
||||
at CapSolar ([CapSolar PPA](https://capsolar.co.th/en/services/ppa)).
|
||||
The calculator's 3.0 THB/kWh is ~21 % below the ~3.8 THB/kWh blended
|
||||
rate, inside CapSolar's range but above MEAei's usual discount (estimate,
|
||||
to quote); the launch plant's bill (~0.75M THB a month before solar, calculator)
|
||||
clears the threshold.
|
||||
|
||||
### Energy efficiency architecture: recover before generating
|
||||
|
||||
@@ -252,7 +295,10 @@ not a cost one.
|
||||
(weekday daytime at the peak rate, weekends and early mornings at
|
||||
off-peak, Ft included), so the 247 kWp roof saves ~1.2M to 1.3M THB a year
|
||||
and pays back in **~3.8 to 5.4 years** at 20,000 to 26,000 THB/kWp
|
||||
installed (estimate; Thai market prices checked October 2026 in the
|
||||
installed. The full ~640 kWp array uses ~85 % of its yield on site, saves
|
||||
~2.8M to 3.0M THB a year and pays back in **~4.2 to 5.9 years**; the
|
||||
last ~340 kWp, more of whose yield is curtailed, take ~4.9 to 6.3 years
|
||||
(estimates; Thai market prices checked October 2026 in the
|
||||
[utilities CSV](finance/utilities-investment.csv): DEDE's PV status report
|
||||
gives 22 to 25 THB/W for factory systems of 10 kW to 1 MW in 2023,
|
||||
installers quote 18 to 25 THB/W in 2026). It does not lower the demand charge, because the peak window
|
||||
|
||||