/* Itemised investment categories — expandable detail rows + checklist dropdown */
const { useState: useStateID } = React;
const INV_SUGGEST = {
renovation: {
en: ["Construction & structural work", "Electrical & plumbing", "Flooring & painting", "Air conditioning", "Signage", "Design & architect fees"],
th: ["งานก่อสร้างและโครงสร้าง", "งานไฟฟ้าและประปา", "พื้นและสี", "เครื่องปรับอากาศ", "ป้าย", "ค่าออกแบบและสถาปนิก"],
},
equipment: {
en: ["Refrigerator", "Freezer", "Stove / burner range", "Oven", "Ventilation hood", "Prep tables & sinks", "Dishwasher", "Cookware & small wares", "Coffee machine"],
th: ["ตู้เย็น", "ตู้แช่แข็ง", "เตา/เตาแก๊ส", "เตาอบ", "เครื่องดูดควัน", "โต๊ะเตรียมอาหารและอ่างล้าง", "เครื่องล้างจาน", "เครื่องครัวและอุปกรณ์เล็ก", "เครื่องชงกาแฟ"],
},
furniture: {
en: ["Dining tables", "Chairs", "Bar stools", "Lighting", "Décor & plants", "Tableware & glassware"],
th: ["โต๊ะรับประทานอาหาร", "เก้าอี้", "เก้าอี้บาร์", "ไฟส่องสว่าง", "ของตกแต่งและต้นไม้", "ภาชนะและแก้ว"],
},
deposit: {
en: ["Security deposit", "Advance rent", "Key money"],
th: ["เงินมัดจำ", "ค่าเช่าล่วงหน้า", "ค่าแป๊ะเจี๊ยะ"],
},
licenses: {
en: ["Business registration", "Food licence", "Alcohol licence", "Signage permit"],
th: ["จดทะเบียนธุรกิจ", "ใบอนุญาตอาหาร", "ใบอนุญาตแอลกอฮอล์", "ใบอนุญาตป้าย"],
},
management: {
en: ["POS system", "Accounting software", "Website & online presence", "Delivery platform setup", "Workspace / software subscriptions", "Insurance (first year)"],
th: ["ระบบ POS", "โปรแกรมบัญชี", "เว็บไซต์และช่องทางออนไลน์", "การตั้งค่าแพลตฟอร์มเดลิเวอรี่", "ค่าสมัครสมาชิกซอฟต์แวร์", "ประกัน (ปีแรก)"],
},
inventory: {
en: ["Food stock", "Beverage stock", "Dry goods", "Packaging & takeaway"],
th: ["สต๊อกวัตถุดิบ", "สต๊อกเครื่องดื่ม", "ของแห้ง", "บรรจุภัณฑ์และกล่องซื้อกลับ"],
},
reserve: {
en: ["Rent buffer", "Wage buffer", "Emergency fund"],
th: ["เงินสำรองค่าเช่า", "เงินสำรองค่าแรง", "กองทุนฉุกเฉิน"],
},
};
const COST_SUGGEST = {
staff: {
en: ["Chef", "Cook", "Kitchen assistant", "Server / waiter", "Cashier", "Manager", "Cleaner", "Your own salary"],
th: ["เชฟ", "พ่อครัว/แม่ครัว", "ผู้ช่วยครัว", "พนักงานเสิร์ฟ", "แคชเชียร์", "ผู้จัดการ", "แม่บ้าน", "เงินเดือนของคุณเอง"],
},
rent: {
en: ["Base rent", "Common area fees", "Storage rental"],
th: ["ค่าเช่าหลัก", "ค่าส่วนกลาง", "ค่าเช่าที่เก็บของ"],
},
utilities: {
en: ["Electricity", "Water", "Gas", "Internet & phone", "Waste collection"],
th: ["ค่าไฟ", "ค่าน้ำ", "ค่าแก๊ส", "อินเทอร์เน็ตและโทรศัพท์", "ค่าเก็บขยะ"],
},
marketing: {
en: ["Online ads", "Promotions & discounts", "Content & photography", "Loyalty program"],
th: ["โฆษณาออนไลน์", "โปรโมชั่นและส่วนลด", "คอนเทนต์และถ่ายภาพ", "โปรแกรมสะสมแต้ม"],
},
management: {
en: ["Insurance", "Accounting service", "POS subscription", "Printer / equipment rental", "Software subscriptions", "Bank & card fees"],
th: ["ประกัน", "บริการบัญชี", "ค่าสมัคร POS", "ค่าเช่าเครื่องพิมพ์/อุปกรณ์", "ค่าสมัครสมาชิกซอฟต์แวร์", "ค่าธรรมเนียมธนาคารและบัตร"],
},
other: {
en: ["Delivery platform fees", "Cleaning supplies", "Repairs & maintenance", "Uniforms", "Miscellaneous"],
th: ["ค่าธรรมเนียมแพลตฟอร์มเดลิเวอรี่", "อุปกรณ์ทำความสะอาด", "ซ่อมแซมและบำรุงรักษา", "เครื่องแบบพนักงาน", "เบ็ดเตล็ด"],
},
taxes: {
en: ["VAT set-aside", "Corporate income tax", "Social security (employer)", "Withholding tax", "Accounting & filing"],
th: ["เงินกัน VAT", "ภาษีนิติบุคคล", "ประกันสังคม (นายจ้าง)", "ภาษีหัก ณ ที่จ่าย", "ค่าบัญชีและยื่นภาษี"],
},
};
function MiniNum({ value, onChange, width = 92, prefix, suffix, placeholder = "0" }) {
const [focus, setFocus] = useStateID(false);
const [draft, setDraft] = useStateID("");
const display = focus ? draft : value ? fmt(value) : "";
return (
);
}
function InvItemRow({ item, onChange, onRemove }) {
const { t } = useLang();
const lineTotal = (item.qty || 0) * (item.price || 0);
return (
onChange({ name: e.target.value })}
style={{ minWidth: 0, border: "none", outline: "none", background: "transparent", borderBottom: "1px dashed var(--border-strong)", fontFamily: "inherit", fontSize: 14, fontWeight: 500, color: "var(--ink)", padding: "6px 0" }} />
onChange({ qty: v })} placeholder="1" />
onChange({ price: v })} />
{lineTotal ? fmtBaht(lineTotal) : "—"}
);
}
function AddItemPicker({ suggestions, used, onAdd }) {
const { t } = useLang();
return (
);
}
function InvCategory({ label, hint, value, items, onValue, onItems, last, suggestions, meta }) {
const { t } = useLang();
const [open, setOpen] = useStateID(false);
const itemized = items.length > 0;
const total = itemized ? items.reduce((a, it) => a + (it.qty || 0) * (it.price || 0), 0) : value;
const upd = (id, patch) => onItems(items.map((it) => (it.id === id ? { ...it, ...patch } : it)));
const remove = (id) => onItems(items.filter((it) => it.id !== id));
const add = (name) => onItems([...items, { id: Date.now() + Math.random(), name, qty: 1, price: 0 }]);
const used = new Set(items.map((i) => i.name));
return (
setOpen(!open)}>
{label}
{itemized ? {items.length}{t("inv.itemized")} : hint}
{itemized ? (
) : (
)}
{open && (
{!itemized && (
{t("inv.notSureTotal")}
)}
{itemized && (
{[t("inv.itemHeader"), t("inv.qtyHeader"), t("inv.priceHeader"), t("inv.totalHeader"), ""].map((h, i) => (
= 1 && i <= 3 ? "right" : "left" }}>{h}
))}
)}
{items.map((it) => (
upd(it.id, p)} onRemove={() => remove(it.id)} />
))}
{itemized && (
{t("inv.subtotal")}{fmtBaht(total)}
)}
)}
);
}
function SpaceCard({ space, onChange }) {
const { t } = useLang();
const cap = (txt) => {txt}
;
return (
{t("fin.yourSpace")}{t("fin.optional")}
{t("fin.spaceDesc")}
{cap(t("fin.shopArea"))} onChange({ shopSqm: v })} suffix="m²" />
{cap(t("fin.kitchenArea"))} onChange({ kitchenSqm: v })} suffix="m²" />
);
}
Object.assign(window, { INV_SUGGEST, COST_SUGGEST, MiniNum, InvCategory, SpaceCard });