مخزون المطاعم مجال خادع في تعقيده. المكونات تفسد، الوصفات تتغير، الكميات تتفاوت، والموظفون يرتكبون أخطاء. كيف نصمم نظام مخزون للمطاعم في لبنان والشرق الأوسط يعمل دون مشرف كامل الوقت.
مخزون المطاعم مجال خادع في تعقيده. المكونات تفسد، الوصفات تتغير، الكميات تتفاوت حسب طريقة التحضير، والموظفون يرتكبون أخطاء في كل خطوة. نظام مخزون مُصمَّم جيداً لمجموعة مطاعم في لبنان أو عموم منطقة الشرق الأوسط يحتاج إلى التعامل مع كل هذا دون مشغّل كامل الوقت لمراقبته.
النطاق أصعب مما يبدو
نظام مخزون السوبرماركت يتتبع الوحدات. زجاجة زيت زيتون تدخل، وزجاجة تخرج. نظام مخزون المطاعم يتتبع الاستهلاك على مستوى الوصفة. حصة دجاج مشوي قد تستهلك 180 جراماً من صدر الدجاج، 12 جراماً من زيت الزيتون، 3 جرامات من خليط البهارات. الخصم من المخزون لا يحدث عند تقديم الطبق، بل عند إعداده في المطبخ.
هذا يخلق تعقيداً فورياً:
- المكونات تُشترى بوحدات المورد لكنها تُستهلك بوحدات الوصفة.
- كيلوغرام من صدر الدجاج المُشترى ينتج تقريباً 850 جراماً بعد التقطيع. نسبة المردود ليست ثابتة.
- الوصفات لها وصفات فرعية. خليط البهارات هو نفسه وصفة.
- الهدر يحدث في نقاط متعددة: الاستلام، التحضير، الطهي، والتقديم.
نظام لا يُنمذج هذه النقاط الأربع للهدر يُعطي أرقام مخزون تنجرف عن الواقع الفيزيائي خلال أيام.
نموذج البيانات لمخزون مستوى الوصفة
الكيانات الأساسية في نظام مخزون المطاعم:
-- المكونات هي الوحدة الذرية
CREATE TABLE ingredients (
id bigserial PRIMARY KEY,
tenant_id bigint NOT NULL,
name text NOT NULL,
purchase_unit text NOT NULL,
cost_per_purchase_unit numeric(10,4) NOT NULL DEFAULT 0,
yield_pct numeric(5,2) NOT NULL DEFAULT 100.00
);
-- سجل المخزون: كل حدث مخزوني كقيد محاسبي
CREATE TABLE stock_ledger (
id bigserial PRIMARY KEY,
ingredient_id bigint NOT NULL,
event_type text NOT NULL CHECK (event_type IN
('purchase','deduction','waste','adjustment','count')),
quantity numeric(12,4) NOT NULL,
created_at timestamptz NOT NULL DEFAULT now()
);
سجل المخزون إضافي فقط. المخزون الحالي لأي مكوّن هو مجموع كل قيود السجل. هذا يحفظ مسار التدقيق الكامل ويجعل من الممكن إعادة بناء المخزون في أي نقطة تاريخية.
حساب تكلفة الوصفة مع تتالي الوصفات الفرعية
حساب تكلفة وصفة يتطلب التنقل تكرارياً في شجرة الوصفة وتحويل جميع الوحدات إلى وحدات الشراء:
func (s *Service) CalculateRecipeCost(ctx context.Context, recipeID int64) (RecipeCost, error) {
items, _ := s.repo.GetRecipeItems(ctx, recipeID)
totalCost := decimal.Zero
for _, item := range items {
if item.IngredientID != nil {
converted, _ := convertUnit(item.Quantity, item.Unit,
item.Ingredient.PurchaseUnit)
// تطبيق نسبة المردود: إذا احتجت 100 جرام ومردودها 85%
// فأنت تحتاج لشراء 117.6 جرام
effectiveQty := converted.Div(
decimal.NewFromFloat(item.Ingredient.YieldPct).Div(decimal.NewFromInt(100)))
totalCost = totalCost.Add(effectiveQty.Mul(item.Ingredient.CostPerPurchaseUnit))
} else {
subCost, _ := s.CalculateRecipeCost(ctx, *item.SubRecipeID)
totalCost = totalCost.Add(subCost.CostPerUnit.Mul(item.Quantity))
}
}
return RecipeCost{TotalCost: totalCost}, nil
}
معالجة نسبة المردود هي حيث تفشل معظم أنظمة المخزون. شراء 100 جرام من الدجاج بسعر 15 دولاراً/كجم يكلف 1.50 دولار، لكن إذا كان المردود 85%، التكلفة الفعلية لكل جرام قابل للاستخدام هي 1.50/85 = 0.0176 دولار بدلاً من 0.015 دولار.
الخصم التلقائي من مبيعات نظام نقطة البيع
التكامل بين نظام نقطة البيع ونظام المخزون هو الحلقة الأكثر أهمية تشغيلياً. عند إغلاق طلب في نقطة البيع، يجب على نظام المخزون خصم كميات الوصفة لكل عنصر مُباع.
هذا يجب أن يحدث بشكل غير متزامن. تدفق إغلاق نقطة البيع لا ينبغي أن ينتظر اكتمال خصومات المخزون:
func (w *Worker) ProcessSaleEvent(ctx context.Context, event SaleEvent) error {
for _, item := range event.LineItems {
bom, _ := w.repo.GetBillOfMaterials(ctx, item.MenuItemID)
for _, comp := range bom {
entry := StockLedgerEntry{
IngredientID: comp.IngredientID,
EventType: "deduction",
Quantity: comp.Quantity.Neg().Mul(
decimal.NewFromInt(item.Quantity)),
}
w.repo.InsertLedgerEntry(ctx, entry)
}
}
return nil
}
قائمة المواد الخام (BOM) لعنصر قائمة الطعام هي القائمة المسطّحة للمكونات مع الكميات، محسوبة مسبقاً من شجرة الوصفة.
الجرد المادي وكشف التباين
الخصومات التلقائية تنجرف عن الواقع الفيزيائي بمرور الوقت. مطعم يعمل بشكل جيد يجب أن يجري جرداً مادياً أسبوعياً للمكونات عالية القيمة وشهرياً للمواد الأساسية.
عملية الجرد في النظام:
- توليد ورقة جرد بالكميات المتوقعة (مجموع قيود السجل منذ آخر جرد).
- يُجري الموظفون الجرد الفيزيائي ويدخلون الكميات الفعلية.
- يكتب النظام قيد
count: الفعلي ناقص المتوقع = التباين. - تقرير التباين يُظهر المكونات ذات الفجوات الكبيرة.
بالنسبة للمطاعم في لبنان والشرق الأوسط حيث تكاليف المكونات كبيرة نسبياً مقارنة بالهوامش، رصد تباين 3% متسق على البروتينات باهظة الثمن يمكن أن يوفر 800 إلى 1,500 دولار شهرياً في عملية متوسطة الحجم.
دروس من الإنتاج
بناء أنظمة مخزون لمجموعات مطاعم في منطقة الشرق الأوسط يتلخص في بعض الحقائق المعمارية:
- نمذج الهدر في كل مرحلة: الاستلام، التحضير، الطهي، التقديم.
- نسب المردود ليست اختيارية. كل بروتين وأغلب الخضروات لها فارق مهم بين الوزن المُشترى والمردود الفعلي.
- سجل المخزون يجب أن يكون إضافياً فقط. حذف أو تحديث قيود السجل يُدمر مسار التدقيق.
- تكامل نقطة البيع يجب أن يكون غير متزامن.
- حسّ المواد الخام مسبقاً عند حفظ الوصفة.
- تنبّه على التباين، ليس فقط على انخفاض المخزون.
هل تحتاج نظام مخزون مخصصاً؟
Voxire تبني أنظمة نقاط البيع والمخزون لمجموعات المطاعم وعمليات التجزئة في لبنان ومنطقة الشرق الأوسط. إذا كنت بحاجة إلى حل مخزون مخصص أو تريد تقييم RTYLR لعمليتك، تواصل معنا.
https://voxire.com/get-a-quote/



