feat: add generate_study script for automated study content creation
This commit is contained in:
629
scratch/generate_study.py
Normal file
629
scratch/generate_study.py
Normal file
@@ -0,0 +1,629 @@
|
||||
#!/usr/bin/env python3.13
|
||||
"""
|
||||
Generate the updated feasibility study (Version 3.1) for Siro App.
|
||||
Produces both .docx and .html output.
|
||||
"""
|
||||
|
||||
from docx import Document
|
||||
from docx.shared import Inches, Pt, Cm, RGBColor
|
||||
from docx.enum.text import WD_ALIGN_PARAGRAPH
|
||||
from docx.enum.table import WD_TABLE_ALIGNMENT
|
||||
from docx.enum.section import WD_ORIENT
|
||||
from docx.oxml.ns import qn
|
||||
from docx.oxml import OxmlElement
|
||||
import os
|
||||
|
||||
OUTPUT_DIR = "/Users/hamzaaleghwairyeen/development/App/Siro"
|
||||
|
||||
# ─── Colours ───
|
||||
PRIMARY = RGBColor(0x1E, 0x3A, 0x8A)
|
||||
DARK = RGBColor(0x0F, 0x17, 0x2A)
|
||||
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
|
||||
GREY = RGBColor(0x47, 0x55, 0x69)
|
||||
LGREY = RGBColor(0xF1, 0xF5, 0xF9)
|
||||
GREEN = RGBColor(0x16, 0x7A, 0x34)
|
||||
RED = RGBColor(0xB9, 0x1C, 0x1C)
|
||||
|
||||
def set_cell_shading(cell, color_hex):
|
||||
"""Set cell background colour."""
|
||||
shading = OxmlElement('w:shd')
|
||||
shading.set(qn('w:val'), 'clear')
|
||||
shading.set(qn('w:color'), 'auto')
|
||||
shading.set(qn('w:fill'), color_hex)
|
||||
cell._tc.get_or_add_tcPr().append(shading)
|
||||
|
||||
def add_table(doc, headers, rows, col_widths=None, header_color="1e3a8a", header_text_color="FFFFFF"):
|
||||
"""Add a formatted table."""
|
||||
table = doc.add_table(rows=1 + len(rows), cols=len(headers))
|
||||
table.alignment = WD_TABLE_ALIGNMENT.CENTER
|
||||
table.style = 'Table Grid'
|
||||
|
||||
# Header row
|
||||
for i, h in enumerate(headers):
|
||||
cell = table.rows[0].cells[i]
|
||||
cell.text = ''
|
||||
p = cell.paragraphs[0]
|
||||
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
||||
run = p.add_run(h)
|
||||
run.bold = True
|
||||
run.font.size = Pt(10)
|
||||
run.font.color.rgb = WHITE
|
||||
set_cell_shading(cell, header_color)
|
||||
|
||||
# Data rows
|
||||
for r_idx, row in enumerate(rows):
|
||||
for c_idx, val in enumerate(row):
|
||||
cell = table.rows[r_idx + 1].cells[c_idx]
|
||||
cell.text = ''
|
||||
p = cell.paragraphs[0]
|
||||
p.alignment = WD_ALIGN_PARAGRAPH.CENTER if c_idx > 0 else WD_ALIGN_PARAGRAPH.RIGHT
|
||||
run = p.add_run(str(val))
|
||||
run.font.size = Pt(9.5)
|
||||
if r_idx == len(rows) - 1:
|
||||
run.bold = True
|
||||
if c_idx == 0:
|
||||
run.bold = True
|
||||
|
||||
if col_widths:
|
||||
for i, w in enumerate(col_widths):
|
||||
for row in table.rows:
|
||||
row.cells[i].width = Cm(w)
|
||||
return table
|
||||
|
||||
def add_heading(doc, text, level=1):
|
||||
h = doc.add_heading(text, level=level)
|
||||
h.alignment = WD_ALIGN_PARAGRAPH.RIGHT
|
||||
for run in h.runs:
|
||||
run.font.color.rgb = PRIMARY if level <= 2 else DARK
|
||||
return h
|
||||
|
||||
def add_para(doc, text, bold=False, size=10, color=None, align=WD_ALIGN_PARAGRAPH.RIGHT):
|
||||
p = doc.add_paragraph()
|
||||
p.alignment = align
|
||||
run = p.add_run(text)
|
||||
run.bold = bold
|
||||
run.font.size = Pt(size)
|
||||
if color:
|
||||
run.font.color.rgb = color
|
||||
return p
|
||||
|
||||
def add_bullet(doc, text, bold_prefix=""):
|
||||
p = doc.add_paragraph(style='List Bullet')
|
||||
p.alignment = WD_ALIGN_PARAGRAPH.RIGHT
|
||||
if bold_prefix:
|
||||
run = p.add_run(bold_prefix)
|
||||
run.bold = True
|
||||
run.font.size = Pt(10)
|
||||
run = p.add_run(text)
|
||||
run.font.size = Pt(10)
|
||||
return p
|
||||
|
||||
|
||||
def generate_docx():
|
||||
doc = Document()
|
||||
|
||||
# Set RTL for entire document
|
||||
style = doc.styles['Normal']
|
||||
style.font.name = 'Calibri'
|
||||
style.font.size = Pt(10)
|
||||
style.element.rPr.rFonts.set(qn('w:eastAsia'), 'Calibri')
|
||||
|
||||
# ── Title Page ──
|
||||
for _ in range(4):
|
||||
doc.add_paragraph()
|
||||
|
||||
p = doc.add_paragraph()
|
||||
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
||||
run = p.add_run("دراسة الجدوى الاقتصادية\nتطبيق سيرو للنقل الذكي")
|
||||
run.bold = True
|
||||
run.font.size = Pt(28)
|
||||
run.font.color.rgb = PRIMARY
|
||||
|
||||
p = doc.add_paragraph()
|
||||
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
||||
run = p.add_run("الإصدار الثالث — يونيو 2026\nنموذج الدفع الشهري المرحلي")
|
||||
run.font.size = Pt(16)
|
||||
run.font.color.rgb = GREY
|
||||
|
||||
doc.add_paragraph()
|
||||
|
||||
# Key metrics boxes
|
||||
metrics = [
|
||||
("السوق المستهدف", "سوريا — دمشق الكبرى"),
|
||||
("نموذج الاستثمار", "دفع شهري مرحلي ($8,000/شهر)"),
|
||||
("رأس المال التأسيسي", "$9,000 (دفعة واحدة)"),
|
||||
("نقطة الخروج", "نهاية الشهر الخامس إذا لم تتحقق المؤشرات"),
|
||||
("نطاق نقطة التعادل", "الشهر السابع حتى التاسع"),
|
||||
("أقصى تعرض للمستثمر", "$49,000 (عند الخروج المبكر)"),
|
||||
("إجمالي الاستثمار المتوقع", "$65,000 — $81,000"),
|
||||
]
|
||||
for label, val in metrics:
|
||||
p = doc.add_paragraph()
|
||||
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
||||
run = p.add_run(f"{label}: ")
|
||||
run.bold = True
|
||||
run.font.size = Pt(11)
|
||||
run = p.add_run(val)
|
||||
run.font.size = Pt(11)
|
||||
run.font.color.rgb = PRIMARY
|
||||
|
||||
doc.add_page_break()
|
||||
|
||||
# ── 1. Executive Summary ──
|
||||
add_heading(doc, "أولاً: الملخص التنفيذي", 1)
|
||||
|
||||
add_para(doc,
|
||||
"سيرو تطبيق نقل ذكي جاهز للإطلاق في السوق السوري، يعمل على بنية تحتية مستقلة تقنياً لا تعتمد على "
|
||||
"أي خدمات خارجية مكلفة أو مقيدة جغرافياً. يتميز بأدنى عمولة في السوق (11%) مقابل 17-20% لدى المنافسين، "
|
||||
"مما يجعله الخيار المنطقي للسائق والراكب معاً.")
|
||||
|
||||
add_para(doc,
|
||||
"تتبنى هذه الخطة نموذج دفع شهري مرحلي يحمي المستثمر من تجميد رأس المال، ويضمن استمرارية تشغيلية مرتبطة "
|
||||
"بالأداء الفعلي. وجود شرط خروج صريح في الشهر الخامس يُعطي الطرفين وضوحاً تاماً في المخاطر والتوقعات.")
|
||||
|
||||
add_para(doc, "أبرز نقاط القوة التنافسية", bold=True, size=11)
|
||||
bullets = [
|
||||
("▸ المنتج مكتمل تقنياً ومختبر ميدانياً — لا مخاطر تطوير"),
|
||||
("▸ تجربة الطيار: 1,447 سائق انضموا بـ$1,400 إعلانات فقط — بدون حوافز"),
|
||||
("▸ أدنى عمولة في السوق: 11% مقابل 17-20% عند المنافسين"),
|
||||
("▸ بنية تحتية ذاتية توفر 60% من تكاليف التشغيل مقارنة بالنظراء"),
|
||||
("▸ المؤسس يغطي وظائف 5 أشخاص — وفر $3,000-5,000/شهر في الرواتب"),
|
||||
("▸ نموذج استثمار شهري مرحلي: صفر مخاطر تجميد رأس المال"),
|
||||
]
|
||||
for b in bullets:
|
||||
add_bullet(doc, b)
|
||||
|
||||
# Key indicators table
|
||||
add_para(doc, "مؤشرات الأداء الرئيسية", bold=True, size=11)
|
||||
add_table(doc,
|
||||
["المؤشر", "القيمة"],
|
||||
[
|
||||
["رأس المال التأسيسي (مرة واحدة)", "$9,000"],
|
||||
["المصاريف التشغيلية الشهرية", "$8,000/شهر"],
|
||||
["نقطة الخروج للمستثمر", "نهاية الشهر الخامس إذا لم تتحقق المؤشرات"],
|
||||
["نطاق التعادل", "الشهر 7 — 9"],
|
||||
["أقصى خسارة عند الخروج المبكر", "$49,000"],
|
||||
["إجمالي الاستثمار حتى التعادل", "$65,000 — $81,000"],
|
||||
["عمولة التطبيق", "11% من كل رحلة"],
|
||||
["متوسط حصة الشركة للرحلة", "$0.30 / رحلة"],
|
||||
["هدف الرحلات عند التعادل", "889 رحلة/يوم"],
|
||||
],
|
||||
col_widths=[12, 6]
|
||||
)
|
||||
|
||||
# ── 2. Vision & Business Model ──
|
||||
doc.add_page_break()
|
||||
add_heading(doc, "ثانياً: الرؤية والنموذج التجاري", 1)
|
||||
|
||||
add_para(doc, "الرؤية", bold=True, size=11)
|
||||
add_para(doc, "أن يكون سيرو المنصة الأولى للنقل الذكي الموثوق في سوريا، بعمولة عادلة للسائق وخدمة موثوقة للراكب، على بنية رقمية مستقلة وسيادية.")
|
||||
|
||||
add_para(doc, "نموذج الإيرادات", bold=True, size=11)
|
||||
add_bullet(doc, "عمولة 11% من قيمة كل رحلة تُقتطع تلقائياً من أجرة السائق")
|
||||
add_bullet(doc, "متوسط قيمة الرحلة: $2.75 — حصة الشركة: $0.30/رحلة")
|
||||
add_bullet(doc, "مستقبلاً: إعلانات داخل التطبيق، اشتراكات السائق المميز، خدمات B2B للشركات والفنادق")
|
||||
|
||||
add_para(doc, "الميزة التنافسية — لماذا سيرو؟", bold=True, size=11)
|
||||
add_table(doc,
|
||||
["المعيار", "سيرو", "المنافسون"],
|
||||
[
|
||||
["عمولة التطبيق", "11%", "17% - 20%"],
|
||||
["خريطة المنصة", "IntaleqMaps — ذاتية $0", "Google Maps $5,000-15,000/شهر"],
|
||||
["نظام OTP", "Flash Call ذاتي — $0", "SMS مدفوع $0.03-0.05/رسالة"],
|
||||
["تكلفة التطوير المستمر", "المؤسس = المطور", "فريق خارجي مكلف"],
|
||||
["البنية التحتية", "خوادم ذاتية مستقلة", "Cloud APIs قابلة للتوقف"],
|
||||
["خدمة العملاء", "مدمجة + AI (Nabeeh)", "مراكز خارجية مكلفة"],
|
||||
],
|
||||
col_widths=[5, 6, 7]
|
||||
)
|
||||
|
||||
# ── 3. Market Analysis ──
|
||||
doc.add_page_break()
|
||||
add_heading(doc, "ثالثاً: تحليل السوق السوري", 1)
|
||||
|
||||
add_heading(doc, "3-1: لماذا الآن؟", 2)
|
||||
add_para(doc, "تمر سوريا في مرحلة إعادة الإعمار وانفتاح اقتصادي تدريجي منذ نهاية 2024. دمشق الكبرى تشهد حركة تجارية متصاعدة مع نقص واضح في وسائل النقل المنظم.")
|
||||
|
||||
add_heading(doc, "3-2: حجم السوق", 2)
|
||||
add_table(doc,
|
||||
["المؤشر", "التقدير"],
|
||||
[
|
||||
["سكان دمشق الكبرى", "4 - 5 مليون نسمة"],
|
||||
["مستخدمو الهاتف الذكي", "65% - 70%"],
|
||||
["الرحلات اليومية المحتملة", "200,000 - 400,000 رحلة/يوم"],
|
||||
["حصة السوق المستهدفة سنة 1", "1% - 2% (1,500 - 2,000 رحلة/يوم)"],
|
||||
["نتيجة تجربة الطيار", "1,447 سائق سجلوا بـ$1,400 تسويق فقط"],
|
||||
],
|
||||
col_widths=[10, 8]
|
||||
)
|
||||
|
||||
add_heading(doc, "3-3: المنافسون الرئيسيون", 2)
|
||||
add_table(doc,
|
||||
["التطبيق", "نقطة الضعف", "فرصتنا"],
|
||||
[
|
||||
["YallaGo", "عمولة 20% تُرهق السائق", "11% = ولاء السائق يتحول إلينا"],
|
||||
["Zakinn", "عمولة 17% تُرهق السائق", "نبدأ من المنطقة الأكثر طلباً"],
|
||||
["Tafaddal", "تجربة مستخدم ضعيفة", "UX متقدم + تطبيق سائق أفضل"],
|
||||
["سيرو — ميزتنا", "أدنى عمولة + بنية مستقلة", "الأصعب تقليداً في السوق"],
|
||||
],
|
||||
col_widths=[4, 6, 8]
|
||||
)
|
||||
|
||||
# ── 4. Operational Plan ──
|
||||
doc.add_page_break()
|
||||
add_heading(doc, "رابعاً: الخطة التشغيلية", 1)
|
||||
|
||||
add_heading(doc, "4-1: اختيار موقع المكتب في دمشق", 2)
|
||||
add_para(doc, "يشترط الترخيص القانوني وجود مقر موثق. الميزانية المخصصة: $600/شهر.")
|
||||
|
||||
add_table(doc,
|
||||
["المنطقة", "التقييم", "الإيجار الشهري", "الملاحظة"],
|
||||
[
|
||||
["المزة", "★★★★★", "$500 - $700", "الأفضل: مقر الشركات الكبرى"],
|
||||
["كفرسوسة", "★★★★☆", "$400 - $600", "قريب من المزة، أسعار معقولة"],
|
||||
["الصالحية", "★★★☆☆", "$400 - $550", "مركزي، وصول جيد"],
|
||||
["أبو رمانة", "★★☆☆☆", "$700 - $1,000", "مرموق لكن يتجاوز الميزانية"],
|
||||
["برزة", "★★☆☆☆", "$280 - $400", "أرخص لكن أقل احترافية"],
|
||||
],
|
||||
col_widths=[3, 2.5, 3.5, 8]
|
||||
)
|
||||
add_para(doc, "التوصية: كفرسوسة أو المزة — 50-70 م² مع هامش تفاوض", bold=True)
|
||||
|
||||
# 4-2: Office Furniture (revised)
|
||||
add_heading(doc, "4-2: المشتريات والتجهيزات المكتبية", 2)
|
||||
|
||||
add_para(doc, "أ — الأثاث المكتبي", bold=True, size=10)
|
||||
add_table(doc,
|
||||
["البند", "الكمية", "سعر الوحدة", "الإجمالي"],
|
||||
[
|
||||
["مكتب رئيسي مع أدراج", 1, "$80", "$80"],
|
||||
["مكاتب موظفين بسيطة", 3, "$40", "$120"],
|
||||
["كرسي مكتبي دوّار رئيسي", 1, "$60", "$60"],
|
||||
["كراسي موظفين", 3, "$30", "$90"],
|
||||
["طاولة اجتماعات صغيرة (4 أشخاص)", 1, "$50", "$50"],
|
||||
["برادي (ستائر) للمكتب", "—", "—", "$25"],
|
||||
["رفوف تخزين بسيطة", "—", "—", "$25"],
|
||||
["مراوح (عدد 2)", 2, "$25", "$50"],
|
||||
["إجمالي الأثاث", "", "", "$500"],
|
||||
],
|
||||
col_widths=[7, 2, 2.5, 2.5]
|
||||
)
|
||||
|
||||
add_para(doc, "ب — المعدات والتجهيزات", bold=True, size=10)
|
||||
add_table(doc,
|
||||
["البند", "الإجمالي"],
|
||||
[
|
||||
["طابعة/ماسح ضوئي", "$35"],
|
||||
["إكسسوارات (كابلات، ماوس، لوحات مفاتيح)", "$20"],
|
||||
["قرطاسية ومستلزمات (3 أشهر)", "$20"],
|
||||
["أدوات ضيافة أولية", "$25"],
|
||||
["إجمالي التجهيزات", "$100"],
|
||||
],
|
||||
col_widths=[10, 4]
|
||||
)
|
||||
|
||||
add_para(doc, "ج — أثاث وتجهيزات سكن المؤسس", bold=True, size=10)
|
||||
add_table(doc,
|
||||
["البند", "الإجمالي"],
|
||||
[
|
||||
["سرير + فرشة (عدد 2)", "$100"],
|
||||
["إحرامات + مخدات (عدد 2)", "$25"],
|
||||
["برادي للسكن", "$25"],
|
||||
["ثلاجة صغيرة للمكتب والسكن", "$80"],
|
||||
["غاز صغير (سفري) + أدوات مطبخ", "$70"],
|
||||
["سخان مياه (شمسي/كهربائي)", "$50"],
|
||||
["إجمالي تجهيزات السكن", "$350"],
|
||||
],
|
||||
col_widths=[10, 4]
|
||||
)
|
||||
|
||||
# 4-3: Technical Equipment
|
||||
add_heading(doc, "4-3: أجهزة التطوير والمعدات التقنية", 2)
|
||||
add_table(doc,
|
||||
["البند", "الإجمالي", "ملاحظة"],
|
||||
[
|
||||
["MacBook Pro M4 Pro Max (40 GPU)", "$3,100", "جهاز التطوير والإدارة الرئيسي"],
|
||||
["iPhone (أحدث إصدار)", "$500", "اختبار تطبيق iOS"],
|
||||
["جهاز Android (أحدث إصدار)", "$300", "اختبار تطبيق Android"],
|
||||
["باقي أجهزة التطوير", "$1,100", "ملحقات وإكسسوارات تطوير"],
|
||||
["إجمالي أجهزة التطوير", "$5,000", ""],
|
||||
],
|
||||
col_widths=[8, 3.5, 5.5]
|
||||
)
|
||||
|
||||
add_para(doc, "ملاحظة: تم استبدال أجهزة الحاسوب المكتبي لخدمة العملاء بهواتف ذكية (3 × $150 ضمن بند هواتف خدمة العملاء في CAPEX).", size=9, color=GREY)
|
||||
|
||||
# ── 5. HR Plan ──
|
||||
doc.add_page_break()
|
||||
add_heading(doc, "خامساً: خطة الموارد البشرية", 1)
|
||||
|
||||
add_heading(doc, "5-1: الهيكل الوظيفي والرواتب", 2)
|
||||
add_table(doc,
|
||||
["المسمى الوظيفي", "العدد", "الراتب الشهري", "الإجمالي"],
|
||||
[
|
||||
["المشغل الرئيسي / المؤسس التنفيذي", 1, "$3,500", "$3,500"],
|
||||
["ممثل خدمة العملاء", 3, "$110 - $130", "$400"],
|
||||
["إجمالي الرواتب الشهرية", "4 أشخاص", "", "$3,900"],
|
||||
],
|
||||
col_widths=[7, 2, 3.5, 3]
|
||||
)
|
||||
|
||||
add_para(doc, "ملاحظات:", bold=True, size=9)
|
||||
add_bullet(doc, "تم إلغاء بند مدير السوشيال ميديا (فريلانسر) — المؤسس يدير التسويق الرقمي مباشرة")
|
||||
add_bullet(doc, "تم إلغاء بند السكرتيرة الإدارية — المهام توزع على فريق خدمة العملاء والمؤسس")
|
||||
add_bullet(doc, "فريق خدمة العملاء: 3 موظفين براتب $110-130/شهر ($400 إجمالي)")
|
||||
add_bullet(doc, "برنامج تدريب خدمة العملاء: أسبوعين (بدلاً من 4 أسابيع)")
|
||||
|
||||
# ── 6. Financial Plan ──
|
||||
doc.add_page_break()
|
||||
add_heading(doc, "سادساً: الخطة المالية التفصيلية", 1)
|
||||
|
||||
add_heading(doc, "6-1: رأس المال التأسيسي — $9,000 (دفعة واحدة)", 2)
|
||||
add_para(doc, "يُصرف كاملاً عند بدء التأسيس قبل الإطلاق.")
|
||||
|
||||
add_table(doc,
|
||||
["البند", "المبلغ", "البيان"],
|
||||
[
|
||||
["شهادة اعتمادية (الهيئة الناظمة)", "$600", "ترخيص التطبيق"],
|
||||
["أتعاب المحامي والتخليص القانوني", "$1,500", "تأسيس الشركة + تراخيص"],
|
||||
["رسوم وزارة (سجل تجاري + وزارة نقل)", "$200", "رسوم حكومية"],
|
||||
["هواتف خدمة العملاء (3 أجهزة)", "$450", "3 × $150"],
|
||||
["أجهزة التطوير (Mac + iPhone + Android)", "$5,000", "حسب التفصيل في 4-3"],
|
||||
["لابتوب للسيرفرات وإدارة الإعلانات", "$350", "جهاز منفصل لإدارة السيرفرات"],
|
||||
["تجهيز المكتب (أثاث + معدات)", "$550", "حسب التفصيل في 4-2"],
|
||||
["تجهيزات سكن المؤسس", "$350", "أثاث وتجهيزات أساسية"],
|
||||
["إجمالي رأس المال التأسيسي", "$9,000", ""],
|
||||
],
|
||||
col_widths=[8, 2.5, 6]
|
||||
)
|
||||
|
||||
add_heading(doc, "6-2: المصاريف التشغيلية الشهرية — $8,000/شهر", 2)
|
||||
add_table(doc,
|
||||
["البند", "المبلغ", "البيان"],
|
||||
[
|
||||
["راتب المشغل الرئيسي", "$3,500", "تقني + إداري + تسويق + عمليات"],
|
||||
["فريق خدمة العملاء × 3", "$400", "بمتوسط $133/موظف"],
|
||||
["سيرفرات وبنية سحابية", "$200", "استضافة + نسخ احتياطي"],
|
||||
["إيجار المكتب", "$600", "كفرسوسة / المزة"],
|
||||
["إيجار سكن المشغل", "$300", "ضمن خطة الرواتب"],
|
||||
["خدمات الإنترنت", "$45", "خط ثابت مزدوج"],
|
||||
["فاتورة الكهرباء", "$70", "مكتب + معدات"],
|
||||
["باقات خطوط هواتف (3 أرقام)", "$30", "لخدمة العملاء"],
|
||||
["إعلانات رقمية (Facebook + TikTok)", "$2,855", "المتبقي من الميزانية"],
|
||||
["إجمالي OPEX الشهري", "$8,000", ""],
|
||||
],
|
||||
col_widths=[7, 2.5, 6]
|
||||
)
|
||||
|
||||
add_para(doc, "ملاحظة: تم إلغاء بند إدارة السوشيال ميديا ($200) وبند السكرتيرة ($100). الفائض (~$355 إضافية) يُضاف إلى ميزانية الإعلانات الرقمية ($2,855 بدلاً من $2,500).", size=9, color=GREY)
|
||||
|
||||
# 6-3: Driver Incentives
|
||||
add_heading(doc, "6-3: خطة حوافز السائقين", 2)
|
||||
add_table(doc,
|
||||
["الفترة", "السائقون", "التكلفة", "المصدر"],
|
||||
[
|
||||
["الشهر الأول", "100 سائق × $15", "$1,500", "من CAPEX (احتياطي)"],
|
||||
["الشهر الثاني", "120 سائق × $15", "$1,800", "من CAPEX (احتياطي)"],
|
||||
["الشهر الثالث", "150+ سائق", "من الإيرادات", "ذاتي التمويل"],
|
||||
["الشهر الرابع+", "300-500 سائق", "من الإيرادات", "ذاتي التمويل"],
|
||||
],
|
||||
col_widths=[4, 4, 3.5, 4]
|
||||
)
|
||||
|
||||
# 6-4: Cash Flow Table
|
||||
add_heading(doc, "6-4: جدول التدفق النقدي الشهري", 2)
|
||||
add_table(doc,
|
||||
["الشهر", "صرف المستثمر", "الإيرادات", "العجز", "الإجمالي", "رحلات/يوم", "سائق نشط"],
|
||||
[
|
||||
["التأسيس", "$9,000", "—", "-$9,000", "$9,000", "—", "—"],
|
||||
["1", "$8,000", "$270", "-$7,730", "$17,000", "30", "100"],
|
||||
["2", "$8,000", "$630", "-$7,370", "$25,000", "70", "120"],
|
||||
["3", "$8,000", "$1,350", "-$6,650", "$33,000", "150", "220"],
|
||||
["★4 — فحص", "$8,000", "$3,150", "-$4,850", "$41,000", "350", "350"],
|
||||
["★5 — خروج", "$8,000", "$5,400", "-$2,600", "$49,000", "600", "480"],
|
||||
["6", "$8,000", "$6,750", "-$1,250", "$57,000", "750", "550"],
|
||||
["⚡7", "$8,000", "$8,100", "+$100", "$65,000", "900", "630"],
|
||||
["⚡8", "$8,000", "$9,450", "+$1,450", "$73,000", "1,050", "750"],
|
||||
["⚡9", "$8,000", "$10,500", "+$2,500", "$81,000", "1,167", "840"],
|
||||
["10", "$0", "$11,250", "+$3,250", "—", "1,250", "900"],
|
||||
["11", "$0", "$12,375", "+$4,375", "—", "1,375", "980"],
|
||||
["12", "$0", "$13,500", "+$5,500", "—", "1,500", "1,050"],
|
||||
["13", "$0", "$14,400", "+$6,400", "—", "1,600", "1,100"],
|
||||
["14", "$0", "$15,300", "+$7,300", "—", "1,700", "1,150"],
|
||||
],
|
||||
col_widths=[2.5, 2.5, 2, 2, 2.5, 2, 2]
|
||||
)
|
||||
|
||||
# ── 7. Investment Structure ──
|
||||
doc.add_page_break()
|
||||
add_heading(doc, "سابعاً: هيكل الاستثمار — نموذج الدفع الشهري", 1)
|
||||
|
||||
add_para(doc, "آلية الدفع:", bold=True, size=11)
|
||||
add_bullet(doc, "المستثمر يدفع $9,000 مرة واحدة عند التوقيع (CAPEX)")
|
||||
add_bullet(doc, "يدفع $8,000 شهرياً لتغطية التشغيل الكامل")
|
||||
add_bullet(doc, "الدفع يتوقف تلقائياً عندما تتجاوز الإيرادات $8,000/شهر")
|
||||
add_bullet(doc, "لا يوجد التزام بإجمالي محدد مقدماً")
|
||||
|
||||
add_para(doc, "", size=6)
|
||||
add_para(doc, "جدول الدفع المتوقع (سيناريو قاعدي — تعادل الشهر 8):", bold=True, size=10)
|
||||
add_table(doc,
|
||||
["الشهر", "المبلغ", "نوع الدفع", "حالة المشروع"],
|
||||
[
|
||||
["صفر", "$9,000", "مرة واحدة", "تجهيز + ترخيص + تعيين"],
|
||||
["1", "$8,000", "شهري", "إطلاق ناعم"],
|
||||
["2", "$8,000", "شهري", "نمو متصاعد"],
|
||||
["3", "$8,000", "شهري", "حوافز ذاتية"],
|
||||
["4 — فحص", "$8,000", "شهري", "مراجعة أداء"],
|
||||
["5 — خروج", "$8,000", "شهري", "استمرار أو خروج"],
|
||||
["6", "$8,000", "شهري", "قرب التعادل"],
|
||||
["7", "$8,000", "شهري", "تعادل متفائل"],
|
||||
["8 — تعادل", "$8,000 (آخر)", "شهري", "الإيرادات ≥ $8,000"],
|
||||
["9+", "$0", "ذاتي", "المشروع يمول نفسه"],
|
||||
],
|
||||
col_widths=[3, 3, 3, 7]
|
||||
)
|
||||
|
||||
add_para(doc, "", size=6)
|
||||
add_para(doc, "إجمالي تعرض المستثمر في كل سيناريو:", bold=True, size=10)
|
||||
add_table(doc,
|
||||
["السيناريو", "التوقف", "الإجمالي", "ملاحظة"],
|
||||
[
|
||||
["خروج مبكر (فشل)", "نهاية ش5", "$49,000", "أقصى خسارة $49,000"],
|
||||
["تعادل متفائل", "منتصف ش7", "$57,000", "أفضل سيناريو"],
|
||||
["تعادل قاعدي", "منتصف ش8", "$65,000", "الأرجح"],
|
||||
["تعادل محافظ", "منتصف ش9", "$73,000", "نمو أبطأ"],
|
||||
],
|
||||
col_widths=[5, 3, 3, 5]
|
||||
)
|
||||
|
||||
add_para(doc, "", size=6)
|
||||
add_para(doc, "لماذا لا يوجد احتياطي مالي في هذا النموذج؟", bold=True, size=11)
|
||||
add_para(doc, "في النموذج القديم (مبلغ واحد)، المستثمر يدفع كل شيء مقدماً والاحتياطي يجلس خاملاً. في النموذج الجديد (شهري):", size=10)
|
||||
add_bullet(doc, "المستثمر يدفع فقط ما صُرف فعلاً")
|
||||
add_bullet(doc, "لا توجد أموال خاملة — كل دولار يُشغَّل")
|
||||
add_bullet(doc, "المستثمر يخاطر بـ$49,000 كحد أقصى (عند الخروج)")
|
||||
add_bullet(doc, "نقطة الخروج هي الحماية الحقيقية بدلاً من الاحتياطي")
|
||||
|
||||
# ── 8. Exit Clause ──
|
||||
doc.add_page_break()
|
||||
add_heading(doc, "ثامناً: شرط الخروج — بند الحماية", 1)
|
||||
|
||||
add_para(doc, "يحق للمستثمر إيقاف الدفعات الشهرية والخروج في نهاية الشهر الخامس إذا لم تتحقق المؤشرات.", size=10)
|
||||
|
||||
add_para(doc, "", size=6)
|
||||
add_para(doc, "مؤشرات الأداء — نقطة الفحص (الشهر 4):", bold=True, size=10)
|
||||
add_table(doc,
|
||||
["المؤشر", "الحد الأدنى", "الحد المثالي"],
|
||||
[
|
||||
["الرحلات اليومية", "200/يوم", "350/يوم"],
|
||||
["السائقون المسجلون", "300", "450"],
|
||||
["السائقون النشطون", "150", "250"],
|
||||
["الإيرادات الشهرية", "$1,800", "$3,150"],
|
||||
["معدل احتجاز السائق", "55%", "70%"],
|
||||
["تقييم التطبيق", "4.0+", "4.3+"],
|
||||
],
|
||||
col_widths=[6, 4, 4]
|
||||
)
|
||||
|
||||
add_para(doc, "", size=6)
|
||||
add_para(doc, "مؤشرات الأداء — نقطة القرار (الشهر 5):", bold=True, size=10)
|
||||
add_table(doc,
|
||||
["المؤشر", "حد الاستمرار", "الخروج إذا أقل من"],
|
||||
[
|
||||
["الرحلات اليومية", "400/يوم", "300/يوم"],
|
||||
["السائقون النشطون", "400", "250"],
|
||||
["الإيرادات الشهرية", "$4,000+", "$2,700"],
|
||||
["نمو أسبوعي", "+10% متواصل", "ثبات أو تراجع"],
|
||||
["عقود B2B", "عقد واحد", "صفر عقود"],
|
||||
],
|
||||
col_widths=[6, 4, 4]
|
||||
)
|
||||
|
||||
# ── 9. Break-Even ──
|
||||
doc.add_page_break()
|
||||
add_heading(doc, "تاسعاً: تحليل نقطة التعادل — نطاق الشهر 7 إلى 9", 1)
|
||||
|
||||
add_para(doc, "لماذا نطاق وليس رقماً ثابتاً؟", bold=True, size=10)
|
||||
add_para(doc, "السوق السوري في مرحلة إعادة الإعمار = سوق متقلب بطبيعته. النطاق (7-9) أكثر صدقاً وأكثر حماية لكلا الطرفين.")
|
||||
|
||||
add_para(doc, "", size=6)
|
||||
add_table(doc,
|
||||
["السيناريو", "نقطة التعادل", "إجمالي الاستثمار", "الوصف"],
|
||||
[
|
||||
["متفائل", "الشهر 7", "$57,000", "نمو سريع، B2B مبكر"],
|
||||
["قاعدي (الأرجح)", "الشهر 8", "$65,000", "نمو طبيعي"],
|
||||
["محافظ", "الشهر 9", "$73,000", "سوق متقلب"],
|
||||
["خروج مبكر", "لا تعادل", "$49,000", "آخر دفعة ش5"],
|
||||
],
|
||||
col_widths=[4, 3, 4, 5]
|
||||
)
|
||||
|
||||
add_para(doc, "", size=6)
|
||||
add_para(doc, "معادلة التعادل:", bold=True, size=11)
|
||||
add_para(doc, "889 رحلة/يوم (عند $0.30/رحلة × 30 يوماً = $8,010)", bold=True, size=12, color=PRIMARY)
|
||||
add_table(doc,
|
||||
["المعطى", "الرقم", "كيف وصلنا إليه"],
|
||||
[
|
||||
["عمولة الشركة لكل رحلة", "$0.30", "11% من متوسط رحلة $2.75"],
|
||||
["أيام الشهر", "30", ""],
|
||||
["OPEX الشهري المستهدف", "$8,000", ""],
|
||||
["رحلات التعادل اليومية", "889/يوم", "$8,000 ÷ $0.30 ÷ 30"],
|
||||
["تعادل الشهر 7 (900/يوم)", "$8,100 > $8,000 ✓", "متحقق"],
|
||||
],
|
||||
col_widths=[6, 4, 6]
|
||||
)
|
||||
|
||||
# ── 10. Risk Analysis ──
|
||||
doc.add_page_break()
|
||||
add_heading(doc, "عاشراً: تحليل المخاطر وخطط التخفيف", 1)
|
||||
add_table(doc,
|
||||
["المخاطرة", "التأثير", "الاحتمالية", "خطة التخفيف"],
|
||||
[
|
||||
["تأخر الترخيص", "عالٍ", "متوسطة", "البدء قبل الإطلاق بشهرين"],
|
||||
["بطء نمو السائقين", "عالٍ", "منخفضة", "1,447 سائق بـ$1,400 — مثبت"],
|
||||
["انخفاض الإيرادات", "عالٍ", "متوسطة", "شرط الخروج ش5 يحمي المستثمر"],
|
||||
["تقلبات أمنية/سياسية", "عالٍ", "منخفضة-متوسطة", "بنية مستقلة - لا اعتماد على APIs غربية"],
|
||||
["دخول منافس جديد", "متوسط", "متوسطة", "11% عمولة = عتبة تنافسية شبه مستحيلة"],
|
||||
["مشاكل تقنية", "متوسط", "منخفضة", "المطور = المؤسس — استجابة فورية"],
|
||||
["فشل الإعلانات", "متوسط", "منخفضة", "تجربة سابقة مثبتة + A/B Testing"],
|
||||
],
|
||||
col_widths=[5, 2, 3, 6]
|
||||
)
|
||||
|
||||
# ── 11. Roadmap ──
|
||||
doc.add_page_break()
|
||||
add_heading(doc, "حادي عشر: خارطة الطريق والأهداف التشغيلية", 1)
|
||||
add_table(doc,
|
||||
["المرحلة", "الشهر", "الأهداف", "مؤشرات النجاح"],
|
||||
[
|
||||
["التأسيس", "قبل الإطلاق", "ترخيص + مكتب + توظيف", "وثائق قانونية + فريق جاهز"],
|
||||
["الإطلاق الناعم", "ش 1-2", "100-120 سائق محفز", "70+ رحلة/يوم"],
|
||||
["بناء الزخم", "ش 3", "حوافز ذاتية + B2B", "150 رحلة/يوم"],
|
||||
["نقطة الفحص", "ش 4", "مراجعة مع المستثمر", "350 رحلة/يوم | $3,150"],
|
||||
["قرار الاستمرار", "ش 5", "استمرار أو خروج", "600 رحلة/يوم | عقد B2B"],
|
||||
["الاقتراب من التعادل", "ش 6", "750 رحلة/يوم", "عجز $1,250 فقط"],
|
||||
["⚡ نطاق التعادل", "ش 7-9", "الإيرادات ≥ OPEX", "889+ رحلة/يوم"],
|
||||
["النمو الذاتي", "ش 10-12", "فائض شهري", "$3,250-$5,500 فائض"],
|
||||
["التوسع الجغرافي", "ش 13+", "حلب أو اللاذقية", "1,600+ رحلة/يوم"],
|
||||
],
|
||||
col_widths=[4, 2, 4, 6]
|
||||
)
|
||||
|
||||
# ── 12. Conclusion ──
|
||||
doc.add_page_break()
|
||||
add_heading(doc, "ثاني عشر: الخلاصة والتوصية النهائية", 1)
|
||||
|
||||
add_para(doc, "ملخص نقاط الثقة للمستثمر:", bold=True, size=11)
|
||||
add_bullet(doc, "المنتج جاهز ومختبر — 1,447 سائق التحقوا بـ$1,400 فقط")
|
||||
add_bullet(doc, "أدنى عمولة في السوق (11%) = ميزة تنافسية دائمة")
|
||||
add_bullet(doc, "نموذج الدفع الشهري يحمي المستثمر — لا تجميد لرأس المال")
|
||||
add_bullet(doc, "شرط الخروج الواضح يضع سقفاً لأقصى خسارة ($49,000)")
|
||||
add_bullet(doc, "نقطة التعادل (7-9 أشهر) واقعية ومبنية على بيانات حقيقية")
|
||||
add_bullet(doc, "البنية التقنية المستقلة = مقاومة للعقوبات والقيود")
|
||||
|
||||
add_para(doc, "", size=6)
|
||||
add_table(doc,
|
||||
["المؤشر", "القيمة"],
|
||||
[
|
||||
["رأس المال التأسيسي (مرة واحدة)", "$9,000 — عند توقيع الاتفاقية"],
|
||||
["المصاريف التشغيلية الشهرية", "$8,000/شهر — يتوقف عند التعادل"],
|
||||
["أقصى تعرض للمستثمر", "$49,000 — نقطة الخروج: نهاية الشهر الخامس"],
|
||||
["إجمالي الاستثمار حتى التعادل", "$65,000 — $73,000"],
|
||||
["نطاق التعادل", "الشهر السابع إلى التاسع"],
|
||||
],
|
||||
col_widths=[10, 8]
|
||||
)
|
||||
|
||||
add_para(doc, "", size=8)
|
||||
add_para(doc, "هذه الدراسة أُعدت بناءً على بيانات حقيقية من السوق السوري وتجربة ميدانية فعلية. كل رقم فيها مبني على افتراضات محافظة.", bold=True, size=10, align=WD_ALIGN_PARAGRAPH.CENTER)
|
||||
add_para(doc, "— نهاية دراسة الجدوى — الإصدار الثالث — يونيو 2026 —", size=9, color=GREY, align=WD_ALIGN_PARAGRAPH.CENTER)
|
||||
|
||||
# Save
|
||||
docx_path = os.path.join(OUTPUT_DIR, "دراسة_الجدوى_سيرو_الإصدار_الثالث.docx")
|
||||
doc.save(docx_path)
|
||||
print(f"✅ DOCX saved: {docx_path}")
|
||||
return docx_path
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
generate_docx()
|
||||
BIN
دراسة_الجدوى_سيرو_الإصدار_الثالث.docx
Normal file
BIN
دراسة_الجدوى_سيرو_الإصدار_الثالث.docx
Normal file
Binary file not shown.
Reference in New Issue
Block a user