/* 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 ? ( ) : (
{meta &&
{meta}
}
)}
{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 });