Re-base scale, pressing line, roadmap, revenue model and calculator on the launch plant
Deploy test site / deploy (push) Successful in 48s

Launch plant (user, October 2026): one Duplex system and one Classic,
with cutting and galvanics in-house, everything in one capital round.

- scale.md: capacity table now launch plant 0.71-0.97M records/yr, the
  second Duplex as a growth option; launch utilities (450-540 kg/h on
  B-1/B-2, ~390 kW on 2 x 250 kW); calculator figure ~0.94M.
- pressing-line.md: launch plant section on top; five-press fleet kept as
  the layout fleet the hall and backbone are built for.
- roadmap.md: long-lead orders for the launch plant, no bridge stampers
  or outsourced cutting, commissioning order, what stays revenue-gated.
- revenue-model.md: operating picture of the launch plant: central
  revenue ~3.75M USD, EBITDA ~1.6M, operating profit ~1.1M, payback ~4
  yr on 216M THB, break-even ~0.3M records; adverse corner cannot cover
  depreciation. Five-press table kept and labelled.
- fleet-calculator.html: start fleet 1 Duplex + 1 Classic, target 850k,
  capex base 6.55M (cases 8.9 / 6.55 / 4.9M), Duplex beyond one, chiller
  500 kW, imported machinery 2.3M, ladder from the launch plant.
- total-investment.md: superseded note updated.
This commit is contained in:
grabowski committed 2026-10-16 15:34:19 +07:00
1 parent 7344f12dc8
commit 794cde228c
6 files changed
+156 -45

No files matched your search

+14 -14
View File
@@ -165,8 +165,8 @@ document.documentElement.setAttribute("data-theme",t);})();
Set the records you want a year and the share of splatter and other
specials. The calculator sizes the press fleet from Newbilt Duplex systems
(two HRP 12 presses, an EX 50 and an EX 35 colour extruder each) and Newbilt
Classic automatic presses, starting from the planned two Duplex systems and
one Classic. It then lists what that fleet needs: people, power, central
Classic automatic presses, starting from the launch plant: one Duplex system
and one Classic. It then lists what that fleet needs: people, power, central
hydraulics, steam, cooling, compressed air, floor, compound and stampers.
Vendor figures are from Newbilt's Duplex site requirements and offer; the
rest are planning figures and estimates from the CNX Vinyl documents. Every
@@ -301,7 +301,7 @@ document.documentElement.setAttribute("data-theme",t);})();
<section class="card">
<h2>From small to fully equipped</h2>
<p class="note" style="margin-top:0">Fleets from the start fleet to a full Payap press hall (about 870 m²:
<p class="note" style="margin-top:0">Fleets from the launch plant to a full Payap press hall (about 870 m²:
the two Duplex bays plus the Classic and ten more Classic positions, or the same floor
with more Duplex systems), at the current settings. Click a row to load it.</p>
<div class="tscroll"><table id="ladT"></table></div>
@@ -334,7 +334,7 @@ document.documentElement.setAttribute("data-theme",t);})();
states them. A real plant staggers cycles, so the boiler and chiller can be sized lower once
a utility engineer has the cycle data.</p>
<p><b>Money.</b> Prices, per-record costs, wages, overheads and depreciation come from
finance/revenue-model.md, capex from finance/total-investment.md (the start fleet plan plus each
finance/revenue-model.md, capex from finance/total-investment.md (the launch plant plus each
Duplex system or Classic added or removed), the electricity tariff and PV from scale.md, the biomass
heat price from biomass.md. Electricity and steam follow the fleet: machines, chiller and compressors
at the hours run, steam from the presses' running time, plus an estimated base load for the rest of
@@ -369,8 +369,8 @@ document.documentElement.setAttribute("data-theme",t);})();
"use strict";
// ---------------------------------------------------------------- inputs
const S0 = {
mode: "target", target: 1000000, spec: 20, grow: "classic", dMin: 2, cMin: 1,
dFleet: 2, cFleet: 1, shifts: 2, hrs: 8, days: 300, eff: 65, rateD: 3, rateC: 2, specF: 100,
mode: "target", target: 850000, spec: 20, grow: "classic", dMin: 1, cMin: 1,
dFleet: 1, cFleet: 1, shifts: 2, hrs: 8, days: 300, eff: 65, rateD: 3, rateC: 2, specF: 100,
priceStd: 3.8, premSpec: 1.15, titleFee: 1155, cur: "USD", boi: "on", exportShare: 70,
};
// [group, id, label, value, unit, kind, source]
@@ -444,13 +444,13 @@ grp("Money", [
["thbUsd", "THB per USD", 33, "THB", "doc", "revenue-model.md and total-investment.md, FX of 5 August 2026"],
["usdEur", "USD per EUR", 1.155, "USD", "doc", "revenue-model.md"],
["overheads", "Cash overheads a year", 330000, "USD", "doc", "revenue-model.md: 200 to 450k (admin, sales, insurance, facility, IT, fees, marketing)"],
["capexBase", "Capex, start fleet plan", 6800000, "USD", "doc", "total-investment.md: 4.7 to 8.9M full vision; added scope not yet rolled up"],
["capexD", "Capex per Duplex system beyond two", 265000, "USD", "doc", "total-investment.md: system 2 ~230 to 300k, estimate"],
["capexBase", "Capex, launch plant", 6550000, "USD", "doc", "total-investment.md launch plant (October 2026): 4.9 to 8.9M USD, 161 to 292M THB; the investor target 216M THB"],
["capexD", "Capex per Duplex system beyond one", 265000, "USD", "doc", "total-investment.md: system 2 ~230 to 300k, estimate"],
["capexC", "Capex per Classic beyond one", 375000, "USD", "doc", "total-investment.md: ~290 to 460k, no Newbilt price on file"],
["deprYears", "Depreciation period", 12.5, "years", "doc", "revenue-model.md: 10 to 15 years"],
]);
grp("BOI and imports", [
["impMach", "Imported machinery in the start-fleet capex", 2750000, "USD", "doc", "total-investment.md block midpoints at vendor prices: presses 1.0M, galvanics 485k, Sibert 250k, lathe system 435k, metrology 580k; added presses count as imported"],
["impMach", "Imported machinery in the launch-plant capex", 2300000, "USD", "doc", "total-investment.md launch plant, block midpoints at vendor prices: Duplex 360k, Classic 375k, galvanics 485k, Sibert 250k, Sillitoe SDMS 125k, metrology 580k, ZLD ~120k; added presses count as imported"],
["dutyMach", "Import duty on that machinery without BOI", 5, "%", "est", "Estimate: Thai MFN averages 4.1 % on HS 8477 plastics machinery (customs-compliance.ai, March 2026), 0 to 10 % across HS 84; set per line once the HS codes are known"],
["vatRate", "VAT", 7, "%", "doc", "Thai VAT; with BOI duty exemption the import VAT is exempt too (Revenue Department, BOI OSOS FAQ; boi.md)"],
["pvcImp", "Share of PVC compound imported", 100, "%", "est", "Estimate: record-grade compound from the specialist suppliers"],
@@ -507,7 +507,7 @@ grp("Workwear: Engelbert Strauss for all staff", [
]);
grp("Planned plant, for the checks", [
["boiler", "Steam boiler bank", 1000, "kg/h", "doc", "steam-cooling.html and scale.md: 2 × 500 kg/h modules (proposal, estimate)"],
["chiller", "Chiller bank", 750, "kW", "doc", "steam-cooling.html and scale.md: 3 × 250 kW air-cooled modules (proposal, estimate)"],
["chiller", "Chiller bank", 500, "kW", "doc", "scale.md launch plant: 2 × 250 kW air-cooled modules (CH-1, CH-2; proposal, estimate); compound built for four"],
["hall", "Payap press hall", 870, "m²", "doc", "site-candidates.md, Payap scenario model"],
]);
const A0 = Object.fromEntries(AS.map(r => [r[1], r[3]]));
@@ -517,9 +517,9 @@ const CASES = {
adverse: { S: { priceStd: 3.4, premSpec: 0.6, titleFee: 580 },
A: { pvcPrice: 2.9, labelCost: 0.09, sleeveCost: 0.17, jacketCost: 0.92, shrinkCost: 0.03, maintCost: 0.23, overheads: 450000, capexBase: 8900000, heatPrice: 0.9, deprYears: 10 } },
central: { S: { priceStd: 3.8, premSpec: 1.15, titleFee: 1155 },
A: { pvcPrice: 2.3, labelCost: 0.06, sleeveCost: 0.13, jacketCost: 0.66, shrinkCost: 0.025, maintCost: 0.17, overheads: 330000, capexBase: 6800000, heatPrice: 0.7, deprYears: 12.5 } },
A: { pvcPrice: 2.3, labelCost: 0.06, sleeveCost: 0.13, jacketCost: 0.66, shrinkCost: 0.025, maintCost: 0.17, overheads: 330000, capexBase: 6550000, heatPrice: 0.7, deprYears: 12.5 } },
favourable: { S: { priceStd: 4.25, premSpec: 1.7, titleFee: 1730 },
A: { pvcPrice: 1.75, labelCost: 0.03, sleeveCost: 0.09, jacketCost: 0.4, shrinkCost: 0.02, maintCost: 0.12, overheads: 200000, capexBase: 4700000, heatPrice: 0.5, deprYears: 15 } },
A: { pvcPrice: 1.75, labelCost: 0.03, sleeveCost: 0.09, jacketCost: 0.4, shrinkCost: 0.02, maintCost: 0.12, overheads: 200000, capexBase: 4900000, heatPrice: 0.5, deprYears: 15 } },
};
function caseNow() {
for (const k in CASES) {
@@ -529,7 +529,7 @@ function caseNow() {
return "";
}
const LADDER = [
["Start fleet (current plan)", 2, 1], ["Step 1", 2, 3], ["Step 2", 2, 5], ["Step 3", 2, 8],
["Launch plant", 1, 1], ["Second Duplex", 2, 1], ["Step 1", 2, 3], ["Step 2", 2, 5], ["Step 3", 2, 8],
["Full hall, Classic-led", 2, 11], ["Full hall, mixed", 4, 7], ["Full hall, specials-led", 6, 3],
];
@@ -679,7 +679,7 @@ function econ(r, b, boiOn = S.boi !== "off") {
`${f1(h.prod * A.wwProdYr)} production and ${f1(h.office * A.wwOffYr)} office kits a year, shipping and Thai duty included`);
const sum = gs => L.filter(l => gs.includes(l[0])).reduce((a, l) => a + l[2], 0);
const direct = L.reduce((a, l) => a + l[2], 0), contrib = rev - direct, ebitda = contrib - A.overheads;
const fleetDelta = (r.D - 2) * A.capexD + (r.C - 1) * A.capexC;
const fleetDelta = (r.D - 1) * A.capexD + (r.C - 1) * A.capexC;
const imp = Math.max(0, A.impMach + fleetDelta);
const dutyM = boiOn ? 0 : imp * A.dutyMach / 100, vatM = boiOn ? 0 : (imp + dutyM) * A.vatRate / 100;
const capex = A.capexBase + fleetDelta + dutyM, depr = capex / Math.max(1, A.deprYears);