/* Bonyan ERP — تخصيص الفاتورة وهوية المحل (اسم، هاتف، عنوان، شعار) + معاينة */ function SettingsScreen({ user }) { const D = window.BnyData; const I = window.BnyIcon; const { Card, Button, Input } = window.BonyanDesignSystem_ad3ca0; const isMobile = window.useBnyMobile(); const [shop, setShop] = React.useState(() => ({ ...D.shop })); const [numbering, setNumbering] = React.useState(() => ({ sale: { ...(D.numbering && D.numbering.sale) }, purchase: { ...(D.numbering && D.numbering.purchase) }, })); React.useEffect(() => { window.BnyData.shop = { ...shop }; }, [shop]); React.useEffect(() => { window.BnyData.numbering = { sale: { ...numbering.sale }, purchase: { ...numbering.purchase } }; }, [numbering]); // الوضع المباشر: احفظ هوية المحل في Supabase بعد توقف التعديل (debounce). const shopSaved = React.useRef(false); React.useEffect(() => { if (!window.BnyConfigured || !window.BnyDB || !window.BnyDB.saveShop) return; if (!shopSaved.current) { shopSaved.current = true; return; } // تجاهل أول تشغيل (قيمة محمّلة) const t = setTimeout(() => { window.BnyDB.saveShop(shop).catch((e) => console.warn("بُنيان: فشل حفظ هوية المحل", e)); }, 800); return () => clearTimeout(t); }, [shop]); // الوضع المباشر: احفظ تسلسل الترقيم في Supabase بعد توقف التعديل. const numSaved = React.useRef(false); React.useEffect(() => { if (!window.BnyConfigured || !window.BnyDB || !window.BnyDB.saveNumbering) return; if (!numSaved.current) { numSaved.current = true; return; } const t = setTimeout(() => { window.BnyDB.saveNumbering(numbering).catch((e) => console.warn("بُنيان: فشل حفظ الترقيم", e)); }, 800); return () => clearTimeout(t); }, [numbering]); if (!window.BnyCan(user, "invoice_settings")) { return (

لا تملك صلاحية الوصول

تخصيص الفاتورة متاح لمن يملك صلاحية «تخصيص الفاتورة وهوية المحل».

); } const set = (k, v) => setShop((s) => ({ ...s, [k]: v })); const onLogo = (e) => { const f = e.target.files && e.target.files[0]; if (!f) return; const r = new FileReader(); r.onload = () => set("logo", r.result); r.readAsDataURL(f); }; const lbl = { fontSize: 12, fontWeight: 500, color: "var(--text-strong)", display: "block", marginBottom: 5 }; const setN = (type, k, v) => setNumbering((n) => ({ ...n, [type]: { ...n[type], [k]: v } })); // كتلة تسلسل لنوع (بيع/شراء) — دالة تُرجع JSX (ليست مكوّنًا) حتى لا تفقد الحقول تركيزها const seqBlock = (type, title) => { const cfg = numbering[type] || {}; const reached = window.BnySeqReached(type); const nextVal = Number(cfg.next) || 0; return (
{title}
وصل التسلسل إلى {reached != null ? `${cfg.prefix || ""}${reached}` : "—"}
الرقم التالي الذي سيستخدمه النظام {`${cfg.prefix || ""}${nextVal}`}
setN(type, "prefix", e.target.value)} placeholder="بدون" style={{ fontFamily: "var(--font-mono)" }} />
setN(type, "next", e.target.value)} />
الفاتورة القادمة ستحمل الرقم: {`${cfg.prefix || ""}${nextVal}`}
); }; return (
{/* form */}

تظهر هذه البيانات في رأس وأسفل الفاتورة المطبوعة (A4 والحراري). أضف شعار المحل واسمه ورقم الهاتف والعنوان لتبدو فواتيرك احترافية.

{shop.logo ? الشعار : }
{shop.logo && }
set("name", e.target.value)} placeholder="اسم المحل" />
set("phone", e.target.value)} placeholder="07XXXXXXXXX" icon={} />
set("address", e.target.value)} placeholder="المدينة — الشارع / المنطقة" />
set("footer", e.target.value)} placeholder="مثال: شكراً لتعاملكم معنا" />
{/* live preview */} {/* معاينة ورقية: ألوان ثابتة (لا تتبع السمة) لتبقى مقروءة في الوضعين الفاتح والداكن */}
{shop.logo ? : }
{shop.name || "اسم المحل"}
{shop.address &&
{shop.address}
} {shop.phone &&
هاتف: {shop.phone}
}
فاتورة بيع #10429
التاريخ: ٢٢/٠٦/٢٠٢٥
العميل: أحمد المقاول
المادة الكمية المجموع
حديد تسليح ١٢ ملم11,250,000 د.ع
إسمنت مقاوم للأملاح40340,000 د.ع
الإجمالي1,590,000 د.ع
{shop.footer || ""}
هكذا ستظهر الفاتورة عند الطباعة (نسخة البيع).
{/* تسلسل أرقام الفواتير — للمبيعات والمشتريات */}

راقب إلى أين وصل ترقيم الفواتير، وحدّد الرقم الذي يبدأ منه النظام. لكل من المبيعات والمشتريات تسلسل مستقل.

{seqBlock("sale", "فواتير البيع (المبيعات)")} {seqBlock("purchase", "فواتير الشراء (الموردون)")}
); } window.SettingsScreen = SettingsScreen;