Get a quote

بناء نظام موارد بشرية وكشوف رواتب بـ Go للشركات في لبنان والمنطقة

معظم الشركات الصغيرة والمتوسطة في لبنان تدير كشوف الرواتب على Excel. عندما يصل عدد الموظفين إلى 15 شخصًا، تصبح هذه العملية عبئًا شهريًا يستهلك يومين. هذا المقال يشرح كيف نبني نظام HR وكشوف رواتب بـ Go يتعامل مع NSSF وضريبة الدخل اللبنانية.

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

ما هي متطلبات كشوف الرواتب اللبنانية التي يجب على النظام تغطيتها؟

لبنان لديه هيكل رواتب محدد يجب على أي نظام HR أن يتعامل معه بدقة:

NSSF (الصندوق الوطني للضمان الاجتماعي): يقتطع 3 بالمئة من راتب الموظف كحصة صحية، والصاحب يدفع 6 بالمئة. مكافأة نهاية الخدمة عادةً 8.5 بالمئة من الراتب الأساسي.

ضريبة الدخل: تطبق شرائح تصاعدية على الراتب السنوي الصافي بعد الخصومات.

العملات: مع الأوضاع الاقتصادية في لبنان، كثير من الشركات تدفع جزءًا بالدولار وجزءًا بالليرة. النظام يجب أن يتعامل مع عملات متعددة في نفس السجل.

كيف تصمم قاعدة البيانات؟

CREATE TABLE employees (
    id              UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    tenant_id       UUID NOT NULL,
    full_name       TEXT NOT NULL,
    base_salary_usd NUMERIC(12,2) NOT NULL,
    base_salary_lbp NUMERIC(18,0) NOT NULL DEFAULT 0,
    status          TEXT NOT NULL DEFAULT 'active',
    hire_date       DATE NOT NULL
);

CREATE TABLE payslips (
    id               UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    pay_run_id       UUID NOT NULL,
    employee_id      UUID NOT NULL,
    gross_salary     NUMERIC(12,2) NOT NULL,
    nssf_employee    NUMERIC(12,2) NOT NULL DEFAULT 0,
    nssf_employer    NUMERIC(12,2) NOT NULL DEFAULT 0,
    income_tax       NUMERIC(12,2) NOT NULL DEFAULT 0,
    net_salary       NUMERIC(12,2) NOT NULL
);

كيف يعمل حساب الراتب في Go؟

محرك الحساب هو منطق خالص، بدون اعتمادات على قاعدة البيانات مباشرةً:

func CalculatePayslip(emp Employee, allowances []Allowance, cfg PayrollConfig) PayslipCalculation {
    gross := emp.BaseSalaryUSD

    nssfEmployee := gross.Mul(decimal.NewFromFloat(cfg.NSSFEmployeeRate))
    nssfEmployer := gross.Mul(decimal.NewFromFloat(cfg.NSSFEmployerRate))

    taxableIncome := gross.Sub(nssfEmployee)
    incomeTax := calculateProgressiveTax(taxableIncome, cfg.TaxBrackets)

    net := gross.Sub(nssfEmployee).Sub(incomeTax)

    return PayslipCalculation{
        GrossSalary:  gross,
        NSSFEmployee: nssfEmployee,
        NSSFEmployer: nssfEmployer,
        IncomeTax:    incomeTax,
        NetSalary:    net,
    }
}

aستخدام decimal.Decimal بدلًا من float64 ضروري للحسابات المالية. أخطاء التقريب في float64 تتراكم عبر 40 موظفًا وتنتج كشوف رواتب غير متطابقة.

الدروس الرئيسية من الإنتاج

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

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

فوكسير تبني أنظمة إدارة الأعمال المخصصة للشركات في لبنان ومنطقة الشرق الأوسط وشمال إفريقيا. إذا كنت تشغّل فريقًا متناميًا وتحتاج إلى نظام HR يتعامل مع واقع الأعمال في المنطقة، تواصل معنا.

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

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