> ## Content Index
> Fetch the complete content index at: https://arabroot.io/llms.txt
> Use this file to discover other available public pages before exploring further.

# حساب العائد ROI والقيمة الحالية NPV لمشروعك التقني
- URL: https://arabroot.io/articles/حسابات-دراسة-الجدوى-roi-و-npv/
- Published: 2026-10-13T13:45:00.000Z
- Updated: 2026-10-14T07:40:10.000Z
- Description: كيف تحسب العائد وفترة الاسترداد والقيمة الحالية لمشروع تقني، وتختبر افتراضاته، وتعرضه على قسم المالية في صفحة واحدة.
- Author: فريق عرب رووت
- Tags: الأدلة التقنية, الفرق والمنتج, المالية لغير الماليين, استراتيجية تقنية

⚠️

الأرقام في هذا المقال مصطنعة للتمرين، ومعدل الخصم الذي تستخدمه في دراستك يحدده القسم المالي في مؤسستك.

تعرض على الإدارة مشروعاً لأتمتة مكتب الدعم الفني، فتقول إنه «سيوفر آلاف الساعات»، فيسألك المدير المالي ثلاثة أسئلة: كم صافي القيمة الحالية؟ ومتى نسترد المبلغ؟ وماذا لو تبنى الموظفون الأداة بنصف السرعة التي تتوقعها؟ فإذا لم تكن الإجابات جاهزة انتهى الاجتماع بعبارة «أرسل لنا دراسة جدوى»، وعاد المشروع إلى آخر القائمة. والمشكلة هنا ليست أن المشروع ضعيف، وإنما أن المهندس يعرض الفائدة بلغة التقنية، والمالية تقرر بلغة التدفقات النقدية والوقت والمخاطرة، وهذا المقال يشرح هذه اللغة بأرقام يمكنك أن تعيد حسابها بنفسك.

وهذا هو المقال الأخير في السلسلة، ويعتمد على ما سبق: [الفرق بين الربح والنقد](https://arabroot.io/articles/%D8%A7%D9%84%D9%85%D8%A7%D9%84%D9%8A%D8%A9-%D9%84%D9%84%D8%AA%D9%82%D9%86%D9%8A%D9%8A%D9%86-%D9%84%D8%BA%D8%A9-%D9%82%D8%B3%D9%85-%D8%A7%D9%84%D9%85%D8%A7%D9%84%D9%8A%D8%A9/)، و[CapEx وOpEx والإهلاك](https://arabroot.io/articles/%D8%A7%D9%84%D9%85%D9%8A%D8%B2%D8%A7%D9%86%D9%8A%D8%A9-%D9%88-capex-%D9%88-opex-%D8%AA%D9%83%D9%84%D9%81%D8%A9-%D8%A7%D9%84%D8%AA%D9%82%D9%86%D9%8A%D8%A9/). أما حساب التكلفة الكاملة للقرار فقد شرحناه في [تشتري أم تبني؟](https://arabroot.io/articles/%D8%AA%D8%B4%D8%AA%D8%B1%D9%8A-%D8%A7%D9%85-%D8%AA%D8%A8%D9%86%D9%8A-%D8%A7%D9%84%D9%82%D8%B1%D8%A7%D8%B1-%D8%A8%D9%85%D8%B9%D9%84%D9%88%D9%85%D8%A7%D8%AA-%D9%86%D8%A7%D9%82%D8%B5%D8%A9/#tco)، فلن نكرره هنا، وإنما نبدأ من حيث انتهى: ماذا تفعل بأرقام التكلفة والفائدة عبر السنوات.

المواضيع في السلسلة:

- [المالية للتقنيين: اللغة التي يتحدث بها قسم المالية](https://arabroot.io/articles/%D8%A7%D9%84%D9%85%D8%A7%D9%84%D9%8A%D8%A9-%D9%84%D9%84%D8%AA%D9%82%D9%86%D9%8A%D9%8A%D9%86-%D9%84%D8%BA%D8%A9-%D9%82%D8%B3%D9%85-%D8%A7%D9%84%D9%85%D8%A7%D9%84%D9%8A%D8%A9/)
- [كيف تبني ميزانية التقنية بين CapEx وOpEx؟](https://arabroot.io/articles/%D8%A7%D9%84%D9%85%D9%8A%D8%B2%D8%A7%D9%86%D9%8A%D8%A9-%D9%88-capex-%D9%88-opex-%D8%AA%D9%83%D9%84%D9%81%D8%A9-%D8%A7%D9%84%D8%AA%D9%82%D9%86%D9%8A%D8%A9/)
- [دورة الشراء Procure-to-Pay من الطلب إلى الدفع](https://arabroot.io/articles/%D9%85%D9%86-%D8%B7%D9%84%D8%A8-%D8%A7%D9%84%D8%B4%D8%B1%D8%A7%D8%A1-%D8%A7%D9%84%D9%89-%D8%A7%D9%84%D8%AF%D9%81%D8%B9-procure-to-pay/)
- حساب العائد ROI والقيمة الحالية NPV لمشروعك التقني (الموضوع الحالي)

وسوف نناقش في هذا المقال ما يلي:

- العائد على الاستثمار ROI وفترة الاسترداد Payback، وحدود كل منهما.
- القيمة الزمنية للنقود ومعدل الخصم.
- صافي القيمة الحالية NPV ومعدل العائد الداخلي IRR.
- اختبار الحساسية والسيناريوهات وتكلفة الفرصة البديلة.
- التوفير الحقيقي والتوفير غير النقدي، ولماذا تشك المالية في «الساعات الموفرة».
- دراسة جدوى في صفحة واحدة تعرضها على المالية.
- مختبر: حاسبة بلغة Python لمشروع أتمتة ولمقارنة السيرفرات الخاصة بالسحابة، ثم نكسرها مرتين.

## العائد على الاستثمار وفترة الاسترداد

أبسط مقياسين في أي دراسة جدوى هما العائد على الاستثمار وفترة الاسترداد، وتجدهما في كل عرض لأنهما سهلان، والجدول التالي يعرف كل منهما بمثال من مختبرنا، وهو مشروع أتمتة يكلف 250,000 ريال في البداية و60,000 ريال كل سنة، ويعطي منفعة تصل إلى 200,000 ريال في السنة عندما يستخدمه الجميع:

| المقياس                                    | كيف يحسب                                                       | في مثالنا                                             |
| ------------------------------------------ | -------------------------------------------------------------- | ----------------------------------------------------- |
| العائد على الاستثمار Return on Investment  | (مجموع المنافع ناقص مجموع التكاليف) مقسوماً على مجموع التكاليف | (860,000 ناقص 550,000) ÷ 550,000 = 56.4% في خمس سنوات |
| فترة الاسترداد Payback Period              | عدد السنوات حتى يصبح مجموع التدفقات موجباً                     | 2.79 سنة                                              |
| فترة الاسترداد المخصومة Discounted Payback | الشيء نفسه بعد خصم كل تدفق بمعدل الخصم                         | 3.27 سنة عند 10%                                      |

والمقياسان مفيدان للتواصل، ولكن لكل منهما حد يجب أن تعرفه:

- **العائد على الاستثمار لا يعرف الوقت:** مشروع يعيد 56% في سنة ومشروع يعيدها في عشر سنوات لهما الرقم نفسه، ولهذا اذكر دائماً المدة معه.
- **فترة الاسترداد تتجاهل ما بعدها:** مشروع يسترد في سنتين ثم يتوقف عن العطاء يبدو أفضل من مشروع يسترد في ثلاث ويعطي عشر سنوات بعدها.
- **الاثنان يعاملان الريال بعد خمس سنوات كريال اليوم:** وهذا ما يصلحه الخصم في الأقسام التالية.

## القيمة الزمنية للنقود ومعدل الخصم

الفكرة كلها في جملة واحدة: ريال تحصل عليه اليوم أثمن من ريال تحصل عليه بعد سنة، والسبب أنك تستطيع أن تستثمر ريال اليوم أو تسدد به ديناً، وأن ريال المستقبل غير مؤكد. ولهذا تحول المالية كل مبلغ مستقبلي إلى قيمته اليوم، وتسمى القيمة الحالية Present Value، والصورة التالية تبين قيمة مئة ألف ريال تصلك بعد سنة إلى خمس سنوات:

![خمسة أزواج من الأعمدة: عمود رمادي ثابت بقيمة 100 ألف وبجانبه عمود أزرق بقيمته اليوم عند معدل خصم 10%: بعد سنة 90,909، وبعد سنتين 82,645، وبعد 3 سنوات 75,131، وبعد 4 سنوات 68,301، وبعد 5 سنوات 62,092، وبجانبها المعادلة PV = 100,000 / 1.10^t وسبب نقص القيمة](https://arabroot.io/content/images/2026/10/business-case-01-time-value.webp)

كلما ابتعد المبلغ في المستقبل قلت قيمته اليوم

ومعدل الخصم Discount Rate هو العائد الذي تطلبه الشركة مقابل أن تضع مالها في مشروعك بدلاً من استخدام آخر، وتحدده المالية عادة من تكلفة رأس المال Cost of Capital، أي ما تدفعه الشركة للمقرضين والملاك مقابل أموالهم، وقد تضيف إليه هامشاً للمخاطرة فتسميه معدل العائد المطلوب Hurdle Rate. ولا تقم باختيار المعدل بنفسك، والسبب أن معدلاً أقل يجعل كل مشروع يبدو أفضل، فاطلب من المالية المعدل الذي تستخدمه، واكتبه في دراستك صراحة. وفي هذا المقال نستخدم 10% للتمرين فقط.

## صافي القيمة الحالية ومعدل العائد الداخلي

صافي القيمة الحالية Net Present Value، واختصاراً NPV، هو مجموع القيم الحالية لكل تدفقات المشروع، الداخلة موجبة والخارجة سالبة، بعد خصمها بمعدل الشركة، وقاعدته بسيطة:

- **NPV موجب:** المشروع يعطي أكثر من العائد الذي تطلبه الشركة، فهو مقبول مالياً.
- **NPV سالب:** المال يعطي عائداً أعلى في استخدام آخر.
- **بين مشروعين:** الأعلى في NPV يضيف قيمة أكبر، إذا كانت المدة والمخاطرة متقاربة.

ومعدل العائد الداخلي Internal Rate of Return، واختصاراً IRR، هو معدل الخصم الذي يجعل NPV صفراً تماماً، أي العائد السنوي الذي يحققه المشروع نفسه، فإذا كان أعلى من معدل الشركة فالمشروع مقبول. والصورة التالية تبين العلاقة بينهما على مشروع الأتمتة في المختبر:

![منحنى أزرق لصافي القيمة الحالية لمشروع الأتمتة حسب معدل الخصم من 0% إلى 40%: يبدأ عند 310,000 عند 0%، ويمر بنقطة 156,743 عند 10% وهو معدل الشركة، ويعبر الصفر عند 28.3% وهي معدل العائد الداخلي IRR، ثم يصبح سالباً، وبجانبه شرح لقراءة المنحنى](https://arabroot.io/content/images/2026/10/business-case-02-npv-curve.webp)

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

وقد يتساءل البعض: إذا كان IRR رقماً واحداً سهل الفهم، فلماذا تفضل المالية NPV؟ والإجابة أن IRR نسبة لا تخبرك بحجم القيمة، فمشروع صغير بعائد 50% قد يضيف أقل من مشروع كبير بعائد 20%، وأن IRR قد يعطي أكثر من إجابة عندما تتغير إشارة التدفقات أكثر من مرة، كما سنرى في المختبر. ولهذا اعرض الاثنين، واجعل القرار على NPV.

## الحساسية والسيناريوهات

كل رقم في دراسة الجدوى افتراض، وأكثر سؤال يطرحه المدير المالي هو «ماذا لو كان افتراضك خاطئاً؟»، وله أداتان مختلفتان:

- **اختبار الحساسية Sensitivity Analysis:** تغير افتراضاً واحداً في كل مرة وتبقي الباقي، فتعرف أي افتراض يحرك النتيجة أكثر، وقد استخدمناه في [تشتري أم تبني؟](https://arabroot.io/articles/%D8%AA%D8%B4%D8%AA%D8%B1%D9%8A-%D8%A7%D9%85-%D8%AA%D8%A8%D9%86%D9%8A-%D8%A7%D9%84%D9%82%D8%B1%D8%A7%D8%B1-%D8%A8%D9%85%D8%B9%D9%84%D9%88%D9%85%D8%A7%D8%AA-%D9%86%D8%A7%D9%82%D8%B5%D8%A9/#sensitivity) لاختيار الخيار الأرخص، وهنا نطبقه على NPV.
- **السيناريوهات Scenarios:** تغير عدة افتراضات معاً لأنها تتحرك معاً في الواقع، فالحالة السيئة Worst Case فيها منفعة أقل وتبني أبطأ وتكلفة أعلى في الوقت نفسه.

وتعرض نتيجة اختبار الحساسية عادة في مخطط الإعصار Tornado Chart، حيث يرتب كل افتراض حسب مقدار تحريكه للنتيجة، والصورة التالية من مخرج المختبر:

![مخطط إعصار بخمسة أشرطة أفقية حول خط NPV الأساسي 156,743: قيمة المنفعة السنوية ±20% من 29,905 إلى 283,581، وسرعة تبني الموظفين للأداة من 46,217 إلى 244,347، وتكلفة التشغيل السنوية ±25% من 99,881 إلى 213,605، وتكلفة الاستثمار +30% أو -10% من 81,743 إلى 181,743، ومعدل الخصم 14% أو 6% من 112,133 إلى 209,791، والجانب الأحمر للحالة السيئة والأخضر للحالة الجيدة](https://arabroot.io/content/images/2026/10/business-case-03-tornado.webp)

الافتراضان الأعلى هما ما يجب أن تقيسه قبل القرار، وليس سعر الترخيص

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

## تكلفة الفرصة البديلة والتوفير الحقيقي

هناك مفهومان يفصلان دراسة الجدوى المقنعة عن الدراسة التي ترفض:

- **تكلفة الفرصة البديلة Opportunity Cost:** ما تتخلى عنه عندما تختار هذا المشروع، فالمهندسون الثلاثة الذين يبنون الأتمتة ستة أشهر لن يبنوا ميزة يطلبها العملاء، والميزانية التي تذهب إليها لن تذهب إلى مشروع آخر، ولهذا يقارن NPV مشروعك بمعدل الشركة وليس بالصفر.
- **التوفير الحقيقي Hard Savings والتوفير غير النقدي Soft Savings:** التوفير الحقيقي يخرج من مصروف فعلي، مثل إلغاء ترخيص أو عقد أو تقليل فاتورة، أما الساعات الموفرة فلا تنقص الرواتب إلا إذا تغير عدد الموظفين أو لم تحتج الشركة إلى تعيين جديد كانت ستحتاجه.

وهذا هو سبب أن المالية تشك في «الساعات الموفرة»، فالمشروع في مختبرنا يحسب المنفعة من 4,000 ساعة في السنة بخمسين ريالاً للساعة، ولكن الشركة لن تدفع أقل لموظفي الدعم إذا وفروا هذه الساعات، فالمنفعة الحقيقية هي ما تفعله الشركة بها: تعيين لن تحتاجه مع نمو الطلبات، أو وقت استجابة أقصر يخفض خسارة العملاء. فاكتب في دراستك أي نوع من التوفير هو كل بند، واعرض الحالة بالتوفير الحقيقي وحده أيضاً، والسبب أن المدير المالي سيحسبها بنفسه إن لم تفعل.

## مختبر: حاسبة دراسة الجدوى

نكتب الحاسبة بلغة Python دون أي مكتبة حتى ترى كل معادلة، ونشغلها في ال Image نفسها من [مختبر المقال الأول](https://arabroot.io/articles/%D8%A7%D9%84%D9%85%D8%A7%D9%84%D9%8A%D8%A9-%D9%84%D9%84%D8%AA%D9%82%D9%86%D9%8A%D9%8A%D9%86-%D9%84%D8%BA%D8%A9-%D9%82%D8%B3%D9%85-%D8%A7%D9%84%D9%85%D8%A7%D9%84%D9%8A%D8%A9/#lab-setup). وفي السكربت حالتان مصطنعتان: مشروع أتمتة لمكتب الدعم بمنافع وتكاليف، ومقارنة بين تجديد سيرفرات خاصة On-premises ونقل الحمل نفسه إلى السحابة لخمس سنوات، وهي مقارنة تكاليف فقط، فالخيار الأفضل فيها هو الأقل في القيمة الحالية للتكلفة:

```python
"""Business-case maths for two tech decisions (illustrative SAR amounts, invented for the exercise).
    python business_case.py            ROI, payback, NPV and IRR of an automation project; on-prem vs cloud; sensitivity
    python business_case.py nopeople   break it: the same comparison without the staff time
    python business_case.py irr        break it: cash flows that change sign twice, where IRR has two answers
Plain Python, no libraries: every formula is visible.
"""
import sys

MODE = sys.argv[1] if len(sys.argv) > 1 else ""
RATE = 0.10                       # discount rate: in a real case, finance gives you theirs (cost of capital or hurdle rate)

def npv(rate, flows):             # flows[0] happens today (year 0), flows[t] at the end of year t
    return sum(cf / (1 + rate) ** t for t, cf in enumerate(flows))

def irr(flows, lo=-0.99, hi=10.0):
    """Bisection: the rate where NPV = 0. Assumes NPV changes sign exactly once between lo and hi."""
    f_lo, f_hi = npv(lo, flows), npv(hi, flows)
    if f_lo * f_hi > 0:
        return None
    for _ in range(200):
        mid = (lo + hi) / 2
        if npv(mid, flows) * f_lo > 0: lo, f_lo = mid, npv(mid, flows)
        else: hi = mid
    return (lo + hi) / 2

def payback(flows, rate=0.0):     # years until the cumulative (discounted) cash flow turns positive, interpolated
    cum = 0.0
    for t, cf in enumerate(flows):
        d = cf / (1 + rate) ** t
        if cum < 0 and cum + d >= 0:
            return t - 1 + (-cum / d)
        cum += d
    return None

def money(x): return f"{x:>12,.0f}"
def row(*cols): print("  ".join(str(c) for c in cols))

# ---------------------------------------------------------------- 1. a project with benefits
def automation(benefit_per_year=200_000, adoption=(0.5, 0.8, 1.0, 1.0, 1.0), invest=250_000, running=60_000):
    """Service-desk automation: 4,000 agent hours a year x 50 SAR fully loaded = 200,000 at full adoption."""
    return [-invest] + [benefit_per_year * a - running for a in adoption]

if MODE == "":
    base = automation()
    print("== 1. Service-desk automation, 5 years, discount rate 10%")
    row("year     ", *[f"{t:>12}" for t in range(6)])
    row("net flow ", *[money(x) for x in base])
    cum, c = [], 0
    for x in base: c += x; cum.append(c)
    row("cumulative", *[money(x) for x in cum])
    benefits = sum(200_000 * a for a in (0.5, 0.8, 1.0, 1.0, 1.0)); costs = 250_000 + 5 * 60_000
    print(f"\nROI (undiscounted)       = (benefits {benefits:,.0f} - costs {costs:,.0f}) / costs = {100 * (benefits - costs) / costs:.1f}%")
    print(f"Payback                  = {payback(base):.2f} years")
    print(f"Discounted payback (10%) = {payback(base, RATE):.2f} years")
    print(f"NPV at 10%               = {npv(RATE, base):,.0f} SAR")
    print(f"IRR                      = {100 * irr(base):.1f}%")

    print("\n== 2. Sensitivity of the automation NPV: one assumption at a time (tornado)")
    cases = [
        ("Benefit per year -20% / +20%", automation(benefit_per_year=160_000), automation(benefit_per_year=240_000)),
        ("Adoption slow / fast", automation(adoption=(0.3, 0.6, 0.9, 0.9, 0.9)), automation(adoption=(0.8, 1, 1, 1, 1))),
        ("Investment +30% / -10%", automation(invest=325_000), automation(invest=225_000)),
        ("Running cost +25% / -25%", automation(running=75_000), automation(running=45_000)),
    ]
    rows = [(name, npv(RATE, lo), npv(RATE, hi)) for name, lo, hi in cases]
    rows.append(("Discount rate 14% / 6%", npv(0.14, base), npv(0.06, base)))
    rows.sort(key=lambda r: abs(r[2] - r[1]), reverse=True)
    row(f"{'assumption':30}", f"{'NPV low case':>14}", f"{'NPV high case':>14}", f"{'swing':>12}")
    for name, lo, hi in rows:
        row(f"{name:30}", f"{lo:>14,.0f}", f"{hi:>14,.0f}", f"{abs(hi - lo):>12,.0f}")

    print("\n== 3. Scenarios: several assumptions move together")
    scen = {"worst": automation(160_000, (0.3, 0.6, 0.9, 0.9, 0.9), 325_000, 75_000),
            "base": base,
            "best": automation(240_000, (0.8, 1, 1, 1, 1), 225_000, 45_000)}
    row(f"{'scenario':10}", f"{'NPV at 10%':>12}", f"{'IRR':>8}", f"{'payback':>9}")
    for k, f in scen.items():
        p, r = payback(f), irr(f)
        row(f"{k:10}", f"{npv(RATE, f):>12,.0f}", f"{(f'{100*r:.1f}%' if r is not None else 'n/a'):>8}",
            f"{(f'{p:.2f} y' if p is not None else 'never'):>9}")

# ---------------------------------------------------------------- 2. on-prem refresh vs cloud (costs only)
def onprem(staff_fte=0.75, people=True):
    """Buy servers now (600,000 + 40,000 setup); colocation and power 60,000/yr; support 36,000/yr; staff time."""
    yearly = 60_000 + 36_000 + (staff_fte * 320_000 if people else 0)
    return [640_000] + [yearly] * 5

def cloud(growth=0.08, staff_fte=0.25, people=True):
    """Migration 80,000 now; cloud bill 300,000 in year 1 growing every year; less staff time."""
    return [80_000] + [300_000 * (1 + growth) ** (t - 1) + (staff_fte * 320_000 if people else 0) for t in range(1, 6)]

if MODE in ("", "nopeople"):
    people = MODE != "nopeople"
    a, b = onprem(people=people), cloud(people=people)
    print(f"\n== 4. On-prem refresh vs cloud, 5 years of costs{' (staff time LEFT OUT)' if not people else ''}")
    row(f"{'year':10}", *[f"{t:>10}" for t in range(6)], f"{'total':>12}", f"{'PV at 10%':>12}")
    for name, f in (("on-prem", a), ("cloud", b)):
        row(f"{name:10}", *[f"{x:>10,.0f}" for x in f], f"{sum(f):>12,.0f}", f"{npv(RATE, f):>12,.0f}")
    d = npv(RATE, a) - npv(RATE, b)
    print(f"Cheaper in present value: {'cloud' if d > 0 else 'on-prem'} by {abs(d):,.0f} SAR")

if MODE == "":
    print("\n== 5. Which option is cheaper (PV of costs) when two assumptions change")
    row(f"{'cloud growth / on-prem staff':30}", *[f"{s:>12}" for s in ("0.25 FTE", "0.50 FTE", "0.75 FTE")])
    for g in (0.0, 0.08, 0.15):
        cells = []
        for s in (0.25, 0.5, 0.75):
            d = npv(RATE, onprem(staff_fte=s)) - npv(RATE, cloud(growth=g))
            cells.append(f"{('cloud ' if d > 0 else 'onprem ') + f'{abs(d)/1000:,.0f}k':>12}")
        row(f"{f'growth {g:.0%} a year':30}", *cells)

if MODE == "irr":
    flows = [-100_000, 230_000, -132_000]   # invest, one big year, then a large exit cost (e.g. decommission and data migration)
    print("== IRR with two sign changes: invest, earn, then pay a large exit cost")
    row("flows:", flows)
    for r in (0.0, 0.05, 0.10, 0.15, 0.20, 0.25, 0.30):
        row(f"  NPV at {r:>4.0%} = {npv(r, flows):>10,.0f}")
    print(f"IRR found by bisection on [-99%, 1000%]: {irr(flows)}")
    print(f"IRR found by bisection on [0%, 15%]:     {100 * irr(flows, 0.0, 0.15):.1f}%")
    print(f"IRR found by bisection on [15%, 100%]:   {100 * irr(flows, 0.15, 1.0):.1f}%")
```

في السكربت أعلاه لاحظ التالي:

- الدالة `npv` سطر واحد: كل تدفق مقسوم على (1 + المعدل) أس رقم سنته، والسنة صفر لا تخصم لأنها اليوم.
- الدالة `irr` تبحث بالتنصيف Bisection عن المعدل الذي يجعل NPV صفراً، وتفترض أن الإشارة تتغير مرة واحدة في النطاق، وهذا الافتراض هو ما سنكسره.
- التبني في مشروع الأتمتة 50% في السنة الأولى ثم 80% ثم 100%، لأن الموظفين لا يغيرون طريقة عملهم في يوم واحد.
- وقت الموظفين في المقارنة الثانية بتكلفة 320,000 ريال للوظيفة الكاملة في السنة، 0.75 وظيفة للسيرفرات الخاصة و0.25 للسحابة، وهذه أرقام من اختيارنا، والصحيح أن تقيسها في شركتك.

```bash
docker run --name lab-fin2-bc -v "$PWD:/w" lab-fin2-duckdb:1 python business_case.py
```

والمخرج سوف يكون كما يلي:

```text
== 1. Service-desk automation, 5 years, discount rate 10%
year                  0             1             2             3             4             5
net flow       -250,000        40,000       100,000       140,000       140,000       140,000
cumulative      -250,000      -210,000      -110,000        30,000       170,000       310,000

ROI (undiscounted)       = (benefits 860,000 - costs 550,000) / costs = 56.4%
Payback                  = 2.79 years
Discounted payback (10%) = 3.27 years
NPV at 10%               = 156,743 SAR
IRR                      = 28.3%

== 2. Sensitivity of the automation NPV: one assumption at a time (tornado)
assumption                        NPV low case   NPV high case         swing
Benefit per year -20% / +20%            29,905         283,581       253,676
Adoption slow / fast                    46,217         244,347       198,130
Running cost +25% / -25%                99,881         213,605       113,724
Investment +30% / -10%                  81,743         181,743       100,000
Discount rate 14% / 6%                 112,133         209,791        97,658

== 3. Scenarios: several assumptions move together
scenario      NPV at 10%       IRR    payback
worst           -190,378    -10.8%      never
base             156,743     28.3%     2.79 y
best             470,567     72.0%     1.40 y

== 4. On-prem refresh vs cloud, 5 years of costs
year                 0           1           2           3           4           5         total     PV at 10%
on-prem        640,000     336,000     336,000     336,000     336,000     336,000     2,320,000     1,913,704
cloud           80,000     380,000     404,000     429,920     457,914     488,147     2,239,980     1,698,206
Cheaper in present value: cloud by 215,498 SAR

== 5. Which option is cheaper (PV of costs) when two assumptions change
cloud growth / on-prem staff        0.25 FTE      0.50 FTE      0.75 FTE
growth 0% a year                 onprem 213k     cloud 90k    cloud 393k
growth 8% a year                 onprem 391k    onprem 88k    cloud 215k
growth 15% a year                onprem 569k   onprem 266k     cloud 37k
```

في المخرج أعلاه لاحظ التالي:

- مشروع الأتمتة مقبول في الحالة الأساسية: NPV موجب 156,743 ريالاً، وIRR يساوي 28.3% وهو أعلى بكثير من 10%، والاسترداد في أقل من ثلاث سنوات.
- ولكن السيناريو السيئ، وفيه منفعة أقل 20% وتبني أبطأ وتكلفة أعلى معاً، يجعل NPV سالباً 190,378 ريالاً، ولا يسترد المشروع أبداً في خمس سنوات. وهذا ما يجب أن تعرضه بصراحة، مع ما ستفعله لتجنبه، مثل البدء بفريق واحد وقياس الساعات قبل التوسع.
- في المقارنة الثانية مجموع تكاليف السحابة في خمس سنوات أقل بفارق صغير، وفي القيمة الحالية أقل بـ 215,498 ريالاً، والسبب أن السيرفرات الخاصة تحتاج 640,000 ريال اليوم، بينما تتوزع تكاليف السحابة على السنوات، والمال الذي يدفع لاحقاً قيمته الحالية أقل.
- الجدول الأخير يبين أن القرار ليس ثابتاً: إذا كانت السيرفرات الخاصة تحتاج ربع وظيفة فقط فهي الأرخص في كل الحالات، وإذا كانت تحتاج ثلاثة أرباع وظيفة فالسحابة هي الأرخص حتى مع نمو 15% سنوياً. أي أن أهم رقم في هذه المقارنة هو وقت فريقك، وهو ما رأيناه في [مقارنة السحابة بال VPS](https://arabroot.io/articles/%D8%A7%D9%84%D8%B3%D8%AD%D8%A7%D8%A8%D8%A9-%D9%84%D9%8A%D8%B3%D8%AA-%D8%AF%D8%A7%D8%A6%D9%85%D8%A7-%D8%A7%D9%84%D8%A7%D8%B1%D8%AE%D8%B5-%D9%85%D8%AA%D9%89-%D8%AA%D9%83%D9%84%D9%81%D9%83-%D8%A7%D9%83%D8%AB%D8%B1-%D9%85%D9%86-vps/) من زاوية أخرى.

### نكسر المقارنة: ننسى وقت الموظفين

أكثر خطأ في مقارنات السيرفرات الخاصة بالسحابة أن تحسب الفواتير وحدها، لأن وقت الفريق لا يصل في فاتورة:

```bash
docker run --name lab-fin2-bc-nopeople -v "$PWD:/w" lab-fin2-duckdb:1 python business_case.py nopeople
```

والمخرج سوف يكون كما يلي:

```text

== 4. On-prem refresh vs cloud, 5 years of costs (staff time LEFT OUT)
year                 0           1           2           3           4           5         total     PV at 10%
on-prem        640,000      96,000      96,000      96,000      96,000      96,000     1,120,000     1,003,916
cloud           80,000     300,000     324,000     349,920     377,914     408,147     1,839,980     1,394,943
Cheaper in present value: on-prem by 391,027 SAR
```

القرار انقلب: كانت السحابة أرخص بـ 215,498 ريالاً، وأصبحت السيرفرات الخاصة أرخص بـ 391,027 ريالاً، أي فرق يزيد على 600 ألف ريال بسبب سطر واحد محذوف. ولاحظ أن هذا ليس خطأ لصالح طرف دائماً، فلو كانت السحابة تحتاج وقتاً أكبر من فريقك لانقلب الاتجاه، والقاعدة واحدة: وقت الناس جزء من التكلفة في الخيارين، كما شرحنا في [تكلفة الملكية الكاملة](https://arabroot.io/articles/%D8%AA%D8%B4%D8%AA%D8%B1%D9%8A-%D8%A7%D9%85-%D8%AA%D8%A8%D9%86%D9%8A-%D8%A7%D9%84%D9%82%D8%B1%D8%A7%D8%B1-%D8%A8%D9%85%D8%B9%D9%84%D9%88%D9%85%D8%A7%D8%AA-%D9%86%D8%A7%D9%82%D8%B5%D8%A9/#tco).

### نكسر IRR: تدفقات تغير إشارتها مرتين

بعض المشاريع التقنية تنتهي بتكلفة كبيرة، مثل إيقاف نظام قديم ونقل بياناته، أو غرامة إنهاء عقد، فتصبح التدفقات سالبة ثم موجبة ثم سالبة:

```bash
docker run --name lab-fin2-bc-irr -v "$PWD:/w" lab-fin2-duckdb:1 python business_case.py irr
```

والمخرج سوف يكون كما يلي:

```text
== IRR with two sign changes: invest, earn, then pay a large exit cost
flows:  [-100000, 230000, -132000]
  NPV at   0% =     -2,000
  NPV at   5% =       -680
  NPV at  10% =          0
  NPV at  15% =        189
  NPV at  20% =          0
  NPV at  25% =       -480
  NPV at  30% =     -1,183
IRR found by bisection on [-99%, 1000%]: None
IRR found by bisection on [0%, 15%]:     10.0%
IRR found by bisection on [15%, 100%]:   20.0%
```

NPV يساوي صفراً عند 10% وعند 20% معاً، فللمشروع معدلا عائد داخلي، وعلى النطاق الواسع لم تجد الدالة أي إجابة لأن NPV سالب في طرفي النطاق، وعلى النطاقين الضيقين وجدت إجابتين مختلفتين. فإذا قال لك جدول البيانات Spreadsheet إن IRR يساوي 10% أو 20% فهو اختار إحداهما حسب نقطة البداية، دون أن يخبرك. ولاحظ أيضاً أن المشروع لا يربح شيئاً تقريباً عند أي معدل، فأعلى NPV فيه 189 ريالاً، وهذا ما يخبرك به NPV مباشرة. والقاعدة هنا: إذا تغيرت إشارة التدفقات أكثر من مرة فلا تقم بعرض IRR، واعرض NPV عند معدل الشركة.

### حذف المختبر

```bash
docker rm lab-fin2-bc lab-fin2-bc-nopeople lab-fin2-bc-irr
docker rmi lab-fin2-duckdb:1
```

## دراسة الجدوى في صفحة واحدة

المدير المالي لا يقرأ عشرين صفحة، وإنما يريد القرار والأرقام والمخاطر في صفحة واحدة، تبدأ بالطلب كما في طريقة [BLUF](https://arabroot.io/articles/%D9%85%D9%88%D8%A7%D8%A1%D9%85%D8%A9-%D8%A7%D8%B5%D8%AD%D8%A7%D8%A8-%D8%A7%D9%84%D9%85%D8%B5%D9%84%D8%AD%D8%A9-%D9%88%D8%B3%D9%8A%D8%A7%D8%B3%D8%A9-%D8%A7%D9%84%D9%85%D8%A4%D8%B3%D8%B3%D8%A9/#bluf) التي شرحناها في مقال أصحاب المصلحة، ثم الأرقام، ثم التفاصيل في ملحق. والجدول التالي قالب لهذه الصفحة مملوء بمثال الأتمتة:

| القسم               | ماذا تكتب فيه                                           | في مثالنا                                                          |
| ------------------- | ------------------------------------------------------- | ------------------------------------------------------------------ |
| الطلب               | ماذا تريد، وكم، ومتى تحتاج القرار                       | موافقة على 250,000 ريال لأتمتة مكتب الدعم، والقرار قبل نهاية الربع |
| المشكلة             | بالأرقام وليس بالوصف                                    | 4,000 ساعة سنوياً في مهام متكررة، ووقت استجابة يزيد مع نمو الطلبات |
| الخيارات            | بما فيها عدم فعل شيء                                    | عدم الفعل، أو تعيين موظفين، أو الأتمتة                             |
| الأرقام             | NPV عند معدل الشركة، وIRR، والاسترداد، والتكلفة السنوية | NPV 156,743، وIRR 28.3%، واسترداد 2.8 سنة                          |
| نوع التوفير         | الحقيقي وغير النقدي منفصلان                             | التوفير كله ساعات، والحقيقي منه تعيين لن نحتاجه في 2027            |
| المخاطر والحساسية   | أكبر افتراضين وما يحدث إذا أخطأت فيهما                  | المنفعة وسرعة التبني، والسيناريو السيئ NPV سالب 190,378            |
| الخطة وشروط الإيقاف | كيف تقلل المخاطرة، ومتى تتوقف                           | فريق واحد ثلاثة أشهر، ونتوقف إذا قلت الساعات الموفرة عن النصف      |
| الأثر المحاسبي      | CapEx أم OpEx، والأثر على ميزانية هذه السنة             | نسأل المراقب المالي، وإعداد خدمة SaaS غالباً مصروف تشغيلي          |

## أخطاء شائعة في دراسات الجدوى التقنية

وفيما يلي أخطاء نراها كثيراً، ومع كل خطأ سببه:

- **نسيان وقت الناس:** كما رأينا، سطر واحد يقلب القرار.
- **التبني المتفائل:** افتراض أن كل الموظفين يستخدمون الأداة من الشهر الأول يرفع NPV كثيراً، والواقع أبطأ دائماً.
- **اختيار معدل خصم بنفسك:** معدل منخفض يجعل كل شيء مربحاً، فاطلب معدل المالية.
- **عرض الساعات الموفرة كنقد:** المالية تفصلها عن التوفير الحقيقي، فافصلها أنت قبلها.
- **تجاهل خيار عدم الفعل:** كل دراسة تقارن بالبديل، وعدم الفعل له تكلفة أيضاً يجب أن تحسب.
- **رقم واحد دون حساسية:** أول سؤال سيكون «ماذا لو؟»، فاجعل الإجابة في الصفحة.
- **IRR مع تدفقات تغير إشارتها:** رقم قد لا يكون له معنى، فاعتمد على NPV.
- **نسيان تكلفة الخروج:** نهاية العقد أو إيقاف النظام القديم تكلفة حقيقية في آخر سنة.

## تدريب عملي

1. غير مشروع الأتمتة ليكون التوفير الحقيقي وحده 80,000 ريال سنوياً، واحسب NPV والاسترداد، وقرر هل ما زال المشروع مقبولاً.
2. أضف إلى مقارنة السيرفرات والسحابة سنة سادسة تحتاج فيها السيرفرات الخاصة إلى تجديد جديد، وغير الأفق إلى سبع سنوات.
3. اكتب دالة تعد مرات تغير إشارة التدفقات، واجعل السكربت يرفض طباعة IRR إذا كانت أكثر من مرة.

## الخلاصة

وصلنا لنهاية الموضوع ونهاية السلسلة، وأهم ما فيه:

- ROI وفترة الاسترداد سهلان للعرض، ولكنهما يتجاهلان الوقت وما بعد الاسترداد.
- ريال اليوم أثمن من ريال المستقبل، ومعدل الخصم تحدده المالية وليس أنت.
- NPV الموجب عند معدل الشركة يعني أن المشروع يضيف قيمة، وIRR هو المعدل الذي يجعل NPV صفراً، والقرار على NPV.
- اختبار الحساسية يخبرك أي افتراض تقيسه قبل القرار، والسيناريوهات تخبر الإدارة بأسوأ ما قد يحدث.
- افصل التوفير الحقيقي عن غير النقدي، واحسب وقت الناس في كل الخيارات.
- اعرض كل ذلك في صفحة واحدة تبدأ بالطلب وتنتهي بشروط الإيقاف.

وبهذا نكون قد أكملنا سلسلة «المالية لغير الماليين»: من لغة القوائم المالية، إلى الميزانية والإهلاك، إلى دورة الشراء، وأخيراً دراسة الجدوى، ونرجو أن تجعل اجتماعك القادم مع قسم المالية أقصر وأوضح.

## سجل التحديثات

- أكتوبر 2026: كتابة المقال، وتشغيل المختبر على Python 3.13.16 ببيانات مصطنعة ودون مكتبات إضافية.