Labour from base salaries; health care with check-ups for all staff
Deploy test site / deploy (push) Successful in 34s
Deploy test site / deploy (push) Successful in 34s
User, October 2026: option to enter base salaries; the company should provide proper extra health care with check-ups for all staff. - worker-safety.md: new "Health care for all staff" policy (decided October 2026): group health insurance (inpatient and outpatient) and a yearly check-up for everyone, office included, on top of social security; the occupational checks Thai law requires for risk-factor work (Ministerial Regulation B.E. 2547: within 30 days, then yearly, by an occupational physician, records kept 2 years after the job ends) for the press floor, galvanics and maintenance; planning costs with sources checked October 2026 (group insurance ~8,000 to 18,006 THB a head a year, plan ~15,000; Rajavej Chiang Mai check-ups 1,290 to 5,990 THB, plan ~2,500 plus ~1,500 risk-factor tests, estimates); social security 5 % up to the 17,500 THB ceiling since 1 January 2026. - revenue-model.md: cutting engineer 50,000 THB is base salary; health care on top of the x1.3 (~0.35M THB a year at the start fleet); what the x1.3 is made of. - Fleet calculator: base salaries per role (the revenue model loaded rates / 1.3; cutting engineer 50,000), employer social security 5 % capped at 17,500, 25 % overtime, bonus and PPE, health insurance and check-ups for all staff incl. 4 office staff (scale.md 3 to 5), risk- factor tests for the press floor, galvanics and maintenance; all as editable assumptions; people table gains office and all-staff rows. Defaults: labour 5.25M THB (was 4.67M loaded), direct cost 1.90 USD a record, EBITDA 2.19M USD.
This commit is contained in:
1 parent
eac45eb234
commit
1a368287f8
4 files changed
+89
-19
No files matched your search
@@ -184,7 +184,8 @@ The detail lives in dedicated documents:
|
|||||||
feeding it, each station counted from the galvanics cycle times;
|
feeding it, each station counted from the galvanics cycle times;
|
||||||
plus the money a year: revenue (standard, specials, title services),
|
plus the money a year: revenue (standard, specials, title services),
|
||||||
PVC, labels, sleeves, jackets, cartons, lacquers, plating chemistry,
|
PVC, labels, sleeves, jackets, cartons, lacquers, plating chemistry,
|
||||||
electricity and steam, loaded labour, overheads, EBITDA, depreciation
|
electricity and steam, labour from base salaries with social security,
|
||||||
|
on-costs and health care for all staff, overheads, EBITDA, depreciation
|
||||||
and payback, with the revenue model's adverse, central and favourable
|
and payback, with the revenue model's adverse, central and favourable
|
||||||
cases and USD, THB or EUR; every assumption is editable, with its
|
cases and USD, THB or EUR; every assumption is editable, with its
|
||||||
source, and a scenario can be shared by link
|
source, and a scenario can be shared by link
|
||||||
|
|||||||
@@ -509,8 +509,18 @@ security, overtime, bonus and PPE:
|
|||||||
That is 3.7M–5.4M THB/yr (113k–163k USD), or **0.08–0.16 USD per record**
|
That is 3.7M–5.4M THB/yr (113k–163k USD), or **0.08–0.16 USD per record**
|
||||||
over 1.0–1.5M records. Mastering and cutting engineers are excluded —
|
over 1.0–1.5M records. Mastering and cutting engineers are excluded —
|
||||||
they are title-services labour, not per-record, and admin, sales and
|
they are title-services labour, not per-record, and admin, sales and
|
||||||
logistics sit in overheads below. A cutting engineer costs about
|
logistics sit in overheads below. A cutting engineer earns about
|
||||||
**50,000 THB a month** (team figure, October 2026).
|
**50,000 THB a month** base salary (team figure, October 2026).
|
||||||
|
|
||||||
|
**On top of the ×1.3 (October 2026):** the company gives every member of
|
||||||
|
staff, office included, group health insurance and a yearly check-up,
|
||||||
|
plus the occupational checks the law requires for risk-factor work (see
|
||||||
|
[worker safety](../worker-safety.md)): about 17,500 THB a head a year at
|
||||||
|
planning prices, ~20 people at the start fleet, so ~0.35M THB a year. The
|
||||||
|
×1.3 itself is roughly the employer's social security (5 % up to a 17,500
|
||||||
|
THB ceiling since January 2026) plus ~25 % for overtime, bonus and PPE.
|
||||||
|
The [press fleet calculator](../fleet-calculator.html) costs labour from
|
||||||
|
base salaries in that way.
|
||||||
|
|
||||||
## Margin per record
|
## Margin per record
|
||||||
|
|
||||||
|
|||||||
+40
-16
@@ -334,8 +334,13 @@ document.documentElement.setAttribute("data-theme",t);})();
|
|||||||
the plant. Lacquer blanks (70 EUR each) and the cutting engineer (50,000 THB a month) are team
|
the plant. Lacquer blanks (70 EUR each) and the cutting engineer (50,000 THB a month) are team
|
||||||
figures; shipping cartons have no figure on file and are an estimate. Missing as the revenue model
|
figures; shipping cartons have no figure on file and are an estimate. Missing as the revenue model
|
||||||
lists: indirect labour, freight, inventory, effluent, commission, styli, extra galvanics units' capex.</p>
|
lists: indirect labour, freight, inventory, effluent, commission, styli, extra galvanics units' capex.</p>
|
||||||
<p><b>Not scaled here:</b> admin, sales and logistics (in the overheads line); cover for leave
|
<p><b>Labour.</b> Base salaries per role (revenue-model.md, its loaded rates divided by 1.3; the cutting
|
||||||
and sickness.</p>
|
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
|
||||||
|
included: group health insurance, a yearly check-up, and the risk-factor tests Thai law requires
|
||||||
|
for the press floor, galvanics and maintenance (worker-safety.md).</p>
|
||||||
|
<p><b>Not scaled here:</b> admin, sales and logistics wages (in the overheads line); cover for
|
||||||
|
leave and sickness.</p>
|
||||||
<p>Sources in the CNX Vinyl planning repository: equipment/pressing-line.md,
|
<p>Sources in the CNX Vinyl planning repository: equipment/pressing-line.md,
|
||||||
equipment/newbilt/ (Duplex site requirements V14, offer 240620-04, 2026 flyers),
|
equipment/newbilt/ (Duplex site requirements V14, offer 240620-04, 2026 flyers),
|
||||||
equipment/galvanics.md (cycle times per step; the stamper line counts each station from them,
|
equipment/galvanics.md (cycle times per step; the stamper line counts each station from them,
|
||||||
@@ -450,15 +455,24 @@ grp("Energy", [
|
|||||||
["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"],
|
["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"],
|
["steamKWh", "Heat per kg of steam", 0.68, "kWh/kg", "est", "Estimate: 10 bar saturated steam from ~80 °C feed water"],
|
||||||
]);
|
]);
|
||||||
grp("Labour (THB a month a head, loaded ×1.3)", [
|
grp("Labour: base salaries, THB a month", [
|
||||||
["wageOp", "Press and finishing operator", 19500, "THB", "doc", "revenue-model.md labour build-up"],
|
["salOp", "Press and finishing operator", 15000, "THB", "doc", "revenue-model.md: ~19,500 loaded at ×1.3"],
|
||||||
["wageQC", "QC", 26000, "THB", "doc", "revenue-model.md"],
|
["salQC", "QC", 20000, "THB", "doc", "revenue-model.md: ~26,000 loaded"],
|
||||||
["wageMaint", "Maintenance", 32500, "THB", "doc", "revenue-model.md"],
|
["salMaint", "Maintenance", 25000, "THB", "doc", "revenue-model.md: ~32,500 loaded"],
|
||||||
["wageGalv", "Galvanics", 32500, "THB", "doc", "revenue-model.md"],
|
["salGalv", "Galvanics", 25000, "THB", "doc", "revenue-model.md: ~32,500 loaded"],
|
||||||
["wageCut", "Cutting engineer", 50000, "THB", "user", "Team figure, October 2026 (revenue-model.md), taken as the full monthly cost"],
|
["salCut", "Cutting engineer", 50000, "THB", "user", "Team figure, October 2026 (revenue-model.md)"],
|
||||||
|
["officeHeads", "Admin, sales and logistics staff", 4, "people", "doc", "scale.md: 3 to 5; their wages sit in the overheads, they count here for health care"],
|
||||||
["qcPerShift", "QC inspectors per shift", 1, "", "est", "Estimate; scale.md: 1 to 2 QC"],
|
["qcPerShift", "QC inspectors per shift", 1, "", "est", "Estimate; scale.md: 1 to 2 QC"],
|
||||||
["pressPerTech", "Presses per maintenance technician (at least 2)", 8, "", "est", "Estimate; scale.md: 2 in maintenance for the start fleet"],
|
["pressPerTech", "Presses per maintenance technician (at least 2)", 8, "", "est", "Estimate; scale.md: 2 in maintenance for the start fleet"],
|
||||||
]);
|
]);
|
||||||
|
grp("Labour: on-costs and health care", [
|
||||||
|
["ssRate", "Employer social security", 5, "% of salary", "doc", "Social Security Act, section 33: 5 % up to the wage ceiling (worker-safety.md)"],
|
||||||
|
["ssCap", "Social security wage ceiling", 17500, "THB a month", "doc", "Raised from 15,000 on 1 January 2026, so at most 875 THB a month (worker-safety.md)"],
|
||||||
|
["otherOn", "Overtime, bonus, PPE and other on-costs", 25, "% of salary", "doc", "With social security this is the revenue model's ×1.3 at 15,000 THB"],
|
||||||
|
["healthIns", "Group health insurance (inpatient and outpatient)", 15000, "THB a head a year", "doc", "worker-safety.md: AXA SME plans 9,394 to 18,006 THB at 25 staff (CheckDi, October 2026); local plans 8,000 to 12,000"],
|
||||||
|
["checkup", "Annual health check-up", 2500, "THB a head a year", "est", "Estimate for an age mix; Rajavej Chiang Mai 2026 programmes 1,290 to 5,990 THB by age (worker-safety.md)"],
|
||||||
|
["occCheck", "Risk-factor tests (hearing, lungs, metals)", 1500, "THB a head a year", "est", "Estimate; required yearly for press floor, galvanics and maintenance (Ministerial Regulation B.E. 2547, worker-safety.md)"],
|
||||||
|
]);
|
||||||
grp("Planned plant, for the checks", [
|
grp("Planned plant, for the checks", [
|
||||||
["boiler", "Steam boiler", 400, "kg/h", "doc", "scale.md: sized for one Duplex system"],
|
["boiler", "Steam boiler", 400, "kg/h", "doc", "scale.md: sized for one Duplex system"],
|
||||||
["chiller", "Chiller", 250, "kW", "doc", "scale.md: sized for one Duplex system"],
|
["chiller", "Chiller", 250, "kW", "doc", "scale.md: sized for one Duplex system"],
|
||||||
@@ -608,12 +622,20 @@ function econ(r, b) {
|
|||||||
add("energy", "Electricity", t2u((elecMWh - pvMWh) * 1000 * A.kwhPrice + demandKW * A.demandPrice * 12),
|
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; ~${f0(demandKW)} kW demand`);
|
`${f0(elecMWh - pvMWh)} MWh from the grid after ${f0(pvMWh)} MWh roof PV; ~${f0(demandKW)} kW demand`);
|
||||||
add("energy", "Steam heat (biomass)", t2u(heatMWh * 1000 * A.heatPrice), `${f0(steamT)} t of steam, ${f0(heatMWh)} MWh of heat`);
|
add("energy", "Steam heat (biomass)", t2u(heatMWh * 1000 * A.heatPrice), `${f0(steamT)} t of steam, ${f0(heatMWh)} MWh of heat`);
|
||||||
const h = headsOf(r), wage = (n, w) => t2u(n * w * 12), ppl = n => n + (n === 1 ? " person" : " people");
|
const h = headsOf(r), ppl = n => n + (n === 1 ? " person" : " people");
|
||||||
add("lab", "Press operators and finishing", wage(h.ops, A.wageOp), ppl(h.ops));
|
let base = 0, ss = 0;
|
||||||
add("lab", "QC", wage(h.qc, A.wageQC), ppl(h.qc));
|
for (const [l, n, sal] of [["Press operators and finishing", h.ops, A.salOp], ["QC", h.qc, A.salQC],
|
||||||
add("lab", "Maintenance", wage(h.maint, A.wageMaint), ppl(h.maint));
|
["Maintenance", h.maint, A.salMaint], ["Galvanics", h.galv, A.salGalv], ["Cutting engineers", h.cut, A.salCut]]) {
|
||||||
add("lab", "Galvanics", wage(h.galv, A.wageGalv), ppl(h.galv));
|
add("lab", l, t2u(n * sal * 12), `${ppl(n)} at ${f0(sal)} THB a month`);
|
||||||
add("lab", "Cutting engineers", wage(h.cut, A.wageCut), ppl(h.cut));
|
base += n * sal * 12; ss += n * Math.min(sal, A.ssCap) * A.ssRate / 100 * 12;
|
||||||
|
}
|
||||||
|
add("lab", "Employer social security", t2u(ss), `${f1(A.ssRate)} % of salary up to ${f0(A.ssCap)} THB a month`);
|
||||||
|
add("lab", "Overtime, bonus, PPE", t2u(base * A.otherOn / 100), `${f1(A.otherOn)} % of base salaries`);
|
||||||
|
h.prod = h.ops + h.qc + h.maint + h.galv + h.cut; h.office = Math.max(0, Math.round(A.officeHeads));
|
||||||
|
h.all = h.prod + h.office; h.exposed = h.ops + h.galv + h.maint;
|
||||||
|
add("lab", "Health insurance, all staff", t2u(h.all * A.healthIns), `${ppl(h.all)}, office included, at ${f0(A.healthIns)} THB a year`);
|
||||||
|
add("lab", "Health check-ups, all staff", t2u(h.all * A.checkup + h.exposed * A.occCheck),
|
||||||
|
`yearly for everyone, plus risk-factor tests for ${ppl(h.exposed)} on the press floor, in galvanics and maintenance`);
|
||||||
const sum = gs => L.filter(l => gs.includes(l[0])).reduce((a, l) => a + l[2], 0);
|
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 direct = L.reduce((a, l) => a + l[2], 0), contrib = rev - direct, ebitda = contrib - A.overheads;
|
||||||
const capex = A.capexBase + (r.D - 2) * A.capexD + (r.C - 1) * A.capexC, depr = capex / Math.max(1, A.deprYears);
|
const capex = A.capexBase + (r.D - 2) * A.capexD + (r.C - 1) * A.capexC, depr = capex / Math.max(1, A.deprYears);
|
||||||
@@ -735,7 +757,7 @@ function render() {
|
|||||||
PR("Splatter and specials", e.revSpec, `${big(r.sp)} at ${unit(S.priceStd + S.premSpec)}`);
|
PR("Splatter and specials", e.revSpec, `${big(r.sp)} at ${unit(S.priceStd + S.premSpec)}`);
|
||||||
PR("Title services", e.revTitle, `${f0(r.titles)} titles at ${money(S.titleFee)}`);
|
PR("Title services", e.revTitle, `${f0(r.titles)} titles at ${money(S.titleFee)}`);
|
||||||
PR("Revenue", e.rev, "", true);
|
PR("Revenue", e.rev, "", true);
|
||||||
const GRP = [["Materials, packaging, upkeep", ["mat", "pack", "maint"]], ["Stamper making", ["metal"]], ["Energy", ["energy"]], ["Labour, loaded wages", ["lab"]]];
|
const GRP = [["Materials, packaging, upkeep", ["mat", "pack", "maint"]], ["Stamper making", ["metal"]], ["Energy", ["energy"]], ["Labour and health care", ["lab"]]];
|
||||||
for (const [t, gs] of GRP) { PG(t); e.L.filter(l => gs.includes(l[0])).forEach(l => PR(l[1], l[2], l[3])); }
|
for (const [t, gs] of GRP) { PG(t); e.L.filter(l => gs.includes(l[0])).forEach(l => PR(l[1], l[2], l[3])); }
|
||||||
PG("Result");
|
PG("Result");
|
||||||
PR("Direct cost", e.direct, "everything above", true);
|
PR("Direct cost", e.direct, "everything above", true);
|
||||||
@@ -758,7 +780,9 @@ function render() {
|
|||||||
R("Maintenance technicians", e.heads.maint, `one per ${f0(A.pressPerTech)} presses, at least 2 (estimate)`);
|
R("Maintenance technicians", e.heads.maint, `one per ${f0(A.pressPerTech)} presses, at least 2 (estimate)`);
|
||||||
R("Galvanics operators (day work)", r.galv, `${f1(r.partsDay)} parts a day at about ${f0(A.galvRate)} per person (OMS)`);
|
R("Galvanics operators (day work)", r.galv, `${f1(r.partsDay)} parts a day at about ${f0(A.galvRate)} per person (OMS)`);
|
||||||
R("Cutting engineers (day work)", e.heads.cut, "one per lathe (estimate)");
|
R("Cutting engineers (day work)", e.heads.cut, "one per lathe (estimate)");
|
||||||
R("Production headcount", e.heads.ops + e.heads.qc + e.heads.maint + e.heads.galv + e.heads.cut, "admin, sales and logistics sit in overheads; add cover for leave");
|
R("Production headcount", e.heads.prod, "add cover for leave");
|
||||||
|
R("Admin, sales and logistics", e.heads.office, "wages in the overheads (scale.md 3 to 5)");
|
||||||
|
R("All staff, with health insurance and yearly check-ups", e.heads.all, `risk-factor tests for ${e.heads.exposed} (press floor, galvanics, maintenance)`);
|
||||||
G("Machines");
|
G("Machines");
|
||||||
R("HRP 12 presses (Duplex)", 2 * r.D, "");
|
R("HRP 12 presses (Duplex)", 2 * r.D, "");
|
||||||
R("Classic automatic presses", r.C, "extruder built in; trimming not stated by Newbilt");
|
R("Classic automatic presses", r.C, "extruder built in; trimming not stated by Newbilt");
|
||||||
|
|||||||
@@ -25,6 +25,41 @@ commitments:
|
|||||||
in [crane, workshop and tours](crane-workshop-tours.md).
|
in [crane, workshop and tours](crane-workshop-tours.md).
|
||||||
- **Visitors** never share the floor's hazards: tours run in a glazed
|
- **Visitors** never share the floor's hazards: tours run in a glazed
|
||||||
corridor with its own air and no PPE requirement.
|
corridor with its own air and no PPE requirement.
|
||||||
|
- **Health care for all staff (decided October 2026).** On top of the
|
||||||
|
statutory social security, the company provides every member of staff,
|
||||||
|
office included, with group health insurance (inpatient and outpatient)
|
||||||
|
and a yearly health check-up. Staff in risk-factor work also get the
|
||||||
|
occupational checks Thai law requires, which the general check-up does
|
||||||
|
not replace:
|
||||||
|
- **The legal minimum.** The Ministerial Regulation on health check-ups
|
||||||
|
of employees (B.E. 2547, 2004) covers work with hazardous chemicals,
|
||||||
|
heat, noise and similar risk factors: a check within 30 days of
|
||||||
|
starting such work, then at least once a year, by a physician trained
|
||||||
|
in occupational medicine, physical and mental, with the records kept
|
||||||
|
until two years after the job ends
|
||||||
|
([summary](https://www.thailandlawoffice.com/legal-articles/266),
|
||||||
|
[text](https://natlex.ilo.org/dyn/natlex2/natlex2/files/download/96400/THA96400%20Eng.pdf)).
|
||||||
|
Here that is the press floor (steam heat, noise), galvanics (nickel
|
||||||
|
salts, silver nitrate, acids) and maintenance; hearing, lung function
|
||||||
|
and metal tests are the likely panel, for the occupational physician
|
||||||
|
to set.
|
||||||
|
- **Planning costs** (checked October 2026, no quote yet): group health
|
||||||
|
insurance about 8,000 to 12,000 THB a head a year for local plans
|
||||||
|
([Thailand Starter Kit](https://thailandstarterkit.com/business/group-health-insurance)),
|
||||||
|
AXA's SME plans 9,394, 14,925 and 18,006 THB at 25 staff
|
||||||
|
([CheckDi](https://checkdi.com/th/business-insurance/group-health?lg=th));
|
||||||
|
the plan uses ~15,000. Check-ups at Rajavej Chiang Mai cost 1,290 THB
|
||||||
|
(age 18 to 30), 1,790 (31 to 40) and 3,290 to 5,990 (over 40) in 2026
|
||||||
|
([programmes](https://rajavejchiangmai.com/en/pagekage/health-checkup-program-2026));
|
||||||
|
the plan uses ~2,500 a head plus ~1,500 for the risk-factor tests
|
||||||
|
(estimates).
|
||||||
|
- **Social security**, for reference: the employer pays 5 % of salary
|
||||||
|
up to a ceiling raised from 15,000 to 17,500 THB a month on 1 January
|
||||||
|
2026, so at most 875 THB a month a head
|
||||||
|
([Sprout](https://sprout.co.th/en/blogs/thailand-social-security-contribution-2026-section-33)).
|
||||||
|
|
||||||
|
The [press fleet calculator](fleet-calculator.html) costs all of this per
|
||||||
|
head with the fleet's staffing.
|
||||||
|
|
||||||
Safety infrastructure (training program, clean-room specification,
|
Safety infrastructure (training program, clean-room specification,
|
||||||
decontamination workflow) will be planned alongside the equipment, not after
|
decontamination workflow) will be planned alongside the equipment, not after
|
||||||
|
|||||||
Reference in new issue
Block a user