Get a quote

بناء نظام حساب تكلفة الوصفات وتتبع تكاليف الطعام للمطاعم في الشرق الأوسط

تكلفة الطعام هي المقياس الأكثر أهمية تشغيلياً لأي مطعم. معظم منتجات SaaS للمطاعم تتعامل مع المخزون والمبيعات بشكل منفصل. بناء طبقة حساب تكلفة الوصفات التي تشتق تكلفة الطعام تلقائياً هو ما يناقشه هذا المقال.

تكلفة الطعام هي المقياس التشغيلي الأكثر أهمية لأي مطعم. معظم منتجات SaaS للمطاعم تتعامل مع المخزون والمبيعات بشكل منفصل لكنها تترك الربط بينهما للحساب اليدوي من قبل الشيف أو المدير. بناء طبقة حساب تكلفة الوصفات التي تشتق تلقائياً نسبة تكلفة الطعام من مشتريات المكونات عبر مبيعات أصناف القائمة هو من أكثر الميزات قيمة في SaaS المطاعم، وأحد أكثر المشاكل الهندسية تعقيداً للتنفيذ الصحيح.

نموذج البيانات: المكونات والوصفات وأصناف القائمة

قلب النظام هو تسلسل هرمي من ثلاثة مستويات:

مستوى المكون. المكون هو عنصر يمكن شراؤه مع وحدة قياس وتكلفة حالية لكل وحدة وفئة (لحوم، خضروات، ألبان، بضائع جافة). تُحدَّث التكلفة لكل وحدة عند تسجيل أوامر الشراء باستخدام حساب التكلفة المتوسطة المرجحة.

مستوى الوصفة. الوصفة هي تركيبة من المكونات بكميات ووحدات محددة. الوصفة لها تكلفة محسوبة بناءً على مجموع كميات مكوناتها مضروبة في تكاليف وحدتها الحالية.

مستوى صنف القائمة. صنف القائمة يُعيَّن لوصفة واحدة أو أكثر بعائد محدد. صنف القائمة له سعر بيع، ويحسب النظام نسبة تكلفة الطعام كـ (تكلفة الوصفة / سعر البيع) * 100.

حساب تكلفة الوصفة في Go

حساب تكلفة الوصفة هو عملية حسابية تعاودية عند تضمين وصفات فرعية. في Go، حساب التكلفة التعاودي مع ذاكرة تخزين مؤقت:

type CostCalculator struct {
    repo RecipeRepository
    memo map[uuid.UUID]decimal.Decimal
}

func (c *CostCalculator) RecipeCost(
    ctx context.Context,
    recipeID uuid.UUID,
) (decimal.Decimal, error) {
    if cost, ok := c.memo[recipeID]; ok {
        return cost, nil
    }
    components, err := c.repo.GetRecipeComponents(ctx, recipeID)
    // ...
    total := decimal.Zero
    for _, comp := range components {
        if comp.IsSubRecipe {
            subCost, _ := c.RecipeCost(ctx, comp.SubRecipeID)
            total = total.Add(subCost.Mul(comp.Quantity))
        } else {
            total = total.Add(comp.CostPerUnit.Mul(comp.Quantity))
        }
    }
    c.memo[recipeID] = total
    return total, nil
}

ذاكرة التخزين المؤقت مهمة عندما تظهر نفس الوصفة الفرعية في وصفات أصل متعددة. صلصة أو مرقة مشتركة عبر عشرات الأطباق بدون memoization تُعاد حسابها لكل طبق.

متوسط التكلفة المرجح لتسعير المكونات

تكاليف المكونات تتغير مع كل عملية شراء. معيار الصناعة لتتبع تكلفة المكونات عبر الزمن هو طريقة متوسط التكلفة المرجح:

WAC الجديد = (كمية المخزون الحالية * WAC الحالي + الكمية الجديدة * التكلفة الجديدة للوحدة)
               / (كمية المخزون الحالية + الكمية الجديدة)

للمطاعم اللبنانية التي تتعامل مع التسعير الثنائي LBP/USD، احفظ تكلفة الشراء بعملة الفاتورة ومعادلها بالدولار بسعر الصرف في وقت المعاملة.

التتبع التلقائي لنسبة تكلفة الطعام مقابل المبيعات

عند تسجيل طلب في نقطة البيع، يجب على النظام تلقائياً اشتقاق تكلفة البضائع المباعة (COGS) لذلك الطلب بضرب كمية كل صنف قائمة في تكلفة وصفته:

CREATE TABLE daily_food_cost (
    tenant_id UUID NOT NULL,
    cost_date DATE NOT NULL,
    total_revenue NUMERIC(12,2) DEFAULT 0,
    total_cogs NUMERIC(12,2) DEFAULT 0,
    food_cost_pct NUMERIC(5,2) GENERATED ALWAYS AS
        (CASE WHEN total_revenue > 0
              THEN (total_cogs / total_revenue * 100)
              ELSE 0 END) STORED,
    PRIMARY KEY (tenant_id, cost_date)
);

تتبع الهدر والتلف

الهدر هو الفجوة بين تكلفة الطعام النظرية والفعلية. تكلفة الطعام النظرية هي ما يحسبه النظام بناءً على الوصفات والمبيعات. تكلفة الطعام الفعلية هي ما تم شراؤه فعلاً ناقص ما تبقى في المخزون.

مقارنة تكلفة الطعام النظرية مقابل الفعلية تمنح مدير المطبخ رؤية على أين يحدث الهدر وبأي حجم. مطعم يعمل بتكلفة طعام نظرية 28% لكن فعلية 35% لديه 7 نقاط مئوية من الهدر غير المحسوب.

دروس من الإنتاج

استخدم shopspring/decimal لجميع حسابات التكلفة. الحساب بالأرقام العشرية العائمة يُنتج نتائج خاطئة لنسب تكلفة الطعام.

ابنِ ذاكرة التخزين المؤقت للحسابات التعاودية من البداية. قوائم المطاعم لديها وصفات فرعية مشتركة في كل مكان. بدون memoization، إعادة حساب تكلفة قائمة كاملة بـ 100 صنف مع صلصات وقواعد مشتركة تستغرق ثوانٍ بدلاً من ميلي ثانية.

احفظ تكاليف المكونات مع سجل تحديث WAC. القدرة على رؤية ما كلفه المكون في تاريخ محدد في الماضي ضرورية للتحقيق في نسب تكلفة طعام شاذة من فترات سابقة.

تتبع سعر الصرف في وقت الشراء للعمليات متعددة العملات. المطاعم اللبنانية بشكل خاص تحتاج تكاليف طعام تبقى ذات معنى مع تغير سعر صرف LBP/USD.

هل تحتاج مساعدة في بناء نظام إدارة مطعم؟

Voxire تبني أنظمة SaaS للمطاعم بما في ذلك نقاط البيع والمخزون وتتبع تكاليف الطعام للمشغلين في لبنان ومنطقة الشرق الأوسط. إذا كنت تبني أو تطور منصة إدارة مطاعم، يمكننا المساعدة في البنية الهندسية.

https://voxire.com/get-a-quote/

العودة إلى المدونة
Chat on WhatsApp