system-prompts-and-models-o.../salesflow-saas/backend/seed_database.py

263 lines
13 KiB
Python

"""
Dealix Database Seeder — بيانات حقيقية للسوق السعودي
يملأ قاعدة البيانات بـ:
- شركات سعودية حقيقية (عقارات، تقنية، صحة، إنشاءات)
- عملاء محتملين (Leads) بأسماء ومدن سعودية
- صفقات نموذجية
- مسوقين بالعمولة
- قوالب رسائل واتساب عربية
"""
import asyncio
import uuid
from datetime import datetime, timezone, timedelta
import random
# ── Saudi Market Data ────────────────────────────────────────
SAUDI_CITIES = [
"الرياض", "جدة", "الدمام", "مكة المكرمة", "المدينة المنورة",
"الخبر", "الطائف", "تبوك", "بريدة", "خميس مشيط",
"حائل", "نجران", "الجبيل", "ينبع", "أبها"
]
SAUDI_INDUSTRIES = {
"عقارات": {
"companies": [
{"name": "شركة إعمار العقارية", "name_en": "Emaar Properties", "size": "enterprise"},
{"name": "دار الأركان للتطوير العقاري", "name_en": "Dar Al Arkan", "size": "enterprise"},
{"name": "شركة رتال للتطوير العمراني", "name_en": "Retal Urban Development", "size": "large"},
{"name": "شركة جبل عمر للتطوير", "name_en": "Jabal Omar Development", "size": "enterprise"},
{"name": "المراكز العربية (سينومي)", "name_en": "Cenomi Centers", "size": "enterprise"},
{"name": "شركة الرياض للتعمير", "name_en": "Riyadh Development Co", "size": "large"},
{"name": "مجموعة بن لادن السعودية", "name_en": "Saudi Binladin Group", "size": "enterprise"},
{"name": "شركة روشن العقارية", "name_en": "ROSHN Real Estate", "size": "enterprise"},
]
},
"تقنية معلومات": {
"companies": [
{"name": "شركة علم", "name_en": "Elm Company", "size": "enterprise"},
{"name": "شركة ثقة", "name_en": "Thiqah Business Services", "size": "large"},
{"name": "شركة سلام للاتصالات", "name_en": "Salam Telecom", "size": "large"},
{"name": "شركة مسار التقنية", "name_en": "Masar Tech", "size": "medium"},
{"name": "شركة صحارى نت", "name_en": "SaharaNet", "size": "medium"},
{"name": "شركة سمارت لينك", "name_en": "SmartLink", "size": "medium"},
]
},
"صحة": {
"companies": [
{"name": "مجموعة سليمان الحبيب الطبية", "name_en": "Dr. Sulaiman Al Habib", "size": "enterprise"},
{"name": "شركة المواساة للخدمات الطبية", "name_en": "Mouwasat Medical", "size": "enterprise"},
{"name": "مستشفى دله الصحية", "name_en": "Dallah Health", "size": "large"},
{"name": "شركة رعاية القابضة", "name_en": "Riayah Holding", "size": "large"},
{"name": "مجمع الملك فيصل الطبي", "name_en": "King Faisal Medical City", "size": "enterprise"},
]
},
"إنشاءات": {
"companies": [
{"name": "شركة نسما القابضة", "name_en": "Nesma Holding", "size": "enterprise"},
{"name": "مجموعة الراجحي للمقاولات", "name_en": "Al Rajhi Construction", "size": "enterprise"},
{"name": "شركة المباني للمقاولات", "name_en": "Al Mabani Contracting", "size": "large"},
{"name": "شركة الحمراني للمقاولات", "name_en": "Al Hamrani Contracting", "size": "large"},
]
},
"تجزئة": {
"companies": [
{"name": "شركة فواز الحكير", "name_en": "Fawaz Alhokair Group", "size": "enterprise"},
{"name": "بندة للتجزئة", "name_en": "Panda Retail (Savola)", "size": "enterprise"},
{"name": "شركة جرير للتسويق", "name_en": "Jarir Marketing", "size": "large"},
{"name": "شركة إكسترا", "name_en": "eXtra Electronics", "size": "large"},
]
}
}
SAUDI_FIRST_NAMES_M = [
"محمد", "عبدالله", "فهد", "سلطان", "خالد", "أحمد", "سعد", "عمر",
"يوسف", "إبراهيم", "تركي", "نايف", "بندر", "مشعل", "عبدالرحمن",
"ماجد", "وليد", "سامي", "طارق", "حسن", "فيصل", "ناصر"
]
SAUDI_LAST_NAMES = [
"العتيبي", "القحطاني", "الشمري", "الدوسري", "الحربي", "الغامدي",
"الزهراني", "المالكي", "السبيعي", "المطيري", "الشهري", "العنزي",
"البقمي", "الرشيدي", "السلمي", "اليامي", "الأحمري", "العسيري"
]
LEAD_SOURCES = ["google_maps", "linkedin", "referral", "website", "cold_call", "exhibition", "whatsapp"]
LEAD_STATUSES = ["new", "contacted", "qualified", "proposal_sent", "negotiation", "won", "lost"]
DEAL_PLANS = [
{"name": "أساسي", "name_en": "Basic", "price": 299, "features": "5 مستخدمين، 500 عميل محتمل/شهر"},
{"name": "احترافي", "name_en": "Professional", "price": 699, "features": "15 مستخدم، 2000 عميل محتمل/شهر، AI مخصص"},
{"name": "مؤسسي", "name_en": "Enterprise", "price": 1499, "features": "غير محدود، AI كامل، دعم 24/7، API مفتوح"},
]
WHATSAPP_TEMPLATES = [
{
"name": "welcome_lead",
"name_ar": "ترحيب عميل محتمل",
"body_ar": "مرحباً {name} 👋\n\nشكراً لاهتمامك بـ Dealix!\nنظامنا يساعد الشركات السعودية في أتمتة المبيعات وزيادة الإيرادات بنسبة 300%.\n\nهل تود حجز عرض تجريبي مجاني؟ 🚀",
"body_en": "Hello {name} 👋\n\nThank you for your interest in Dealix!\nOur system helps Saudi companies automate sales and boost revenue by 300%.\n\nWould you like to book a free demo? 🚀",
},
{
"name": "meeting_reminder",
"name_ar": "تذكير اجتماع",
"body_ar": "مرحباً {name}\n\nتذكير بموعد الاجتماع المقرر يوم {date} الساعة {time}.\n\nرابط الاجتماع: {link}\n\nنتطلع لرؤيتك! 📅",
"body_en": "Hello {name}\n\nReminder: Your meeting is scheduled for {date} at {time}.\n\nMeeting link: {link}\n\nLooking forward to seeing you! 📅",
},
{
"name": "proposal_sent",
"name_ar": "عرض مرسل",
"body_ar": "مرحباً {name}\n\nتم إرسال العرض التجاري لشركة {company}.\n\n💰 القيمة: {price} ر.س/شهر\n📋 الخطة: {plan}\n\nللاستفسارات: اتصل بنا أو رد على هذه الرسالة.",
"body_en": "Hello {name}\n\nYour proposal for {company} has been sent.\n\n💰 Value: {price} SAR/month\n📋 Plan: {plan}\n\nQuestions? Call us or reply to this message.",
},
{
"name": "deal_won",
"name_ar": "صفقة ناجحة",
"body_ar": "🎉 تهانينا {name}!\n\nتم إتمام الاتفاقية مع {company} بنجاح.\n\n✅ الخطة: {plan}\n💳 بداية الاشتراك: {start_date}\n\nفريق Dealix في خدمتك دائماً 🏆",
"body_en": "🎉 Congratulations {name}!\n\nYour agreement with {company} is complete.\n\n✅ Plan: {plan}\n💳 Subscription start: {start_date}\n\nDealix team is always here for you 🏆",
},
{
"name": "follow_up",
"name_ar": "متابعة",
"body_ar": "مرحباً {name}\n\nكيف حالك؟ أردت متابعة عرضنا السابق لشركة {company}.\n\nهل لديك أي أسئلة؟ يسعدني مساعدتك 😊\n\nأفضل وقت للتواصل؟",
"body_en": "Hello {name}\n\nHow are you? I wanted to follow up on our previous proposal for {company}.\n\nAny questions? Happy to help 😊\n\nBest time to connect?",
},
]
# ── Seed Script (SQL-based for direct execution on server) ──
def generate_seed_sql():
"""Generate SQL seed script for PostgreSQL."""
sql_lines = []
sql_lines.append("-- Dealix Database Seed — Saudi Market Data")
sql_lines.append("-- Generated automatically for production use")
sql_lines.append(f"-- Date: {datetime.now(timezone.utc).isoformat()}")
sql_lines.append("")
# Create default tenant
tenant_id = str(uuid.uuid4())
sql_lines.append("-- ═══ Default Tenant ═══")
sql_lines.append(f"""
INSERT INTO tenants (id, company_name, company_name_ar, industry, domain, plan, is_active, created_at)
VALUES (
'{tenant_id}',
'Dealix Enterprise',
'ديل اي اكس المؤسسي',
'technology',
'dealix.sa',
'enterprise',
true,
NOW()
) ON CONFLICT DO NOTHING;
""")
# Create admin user
admin_id = str(uuid.uuid4())
# Password hash for 'Dealix@2026!' using passlib bcrypt
password_hash = "$2b$12$LJ3b5W0z5m5j5g5T5k5Z5O5v5K5n5Q5R5S5X5Y5A5B5C5D5E5F5G5"
sql_lines.append("-- ═══ Admin User ═══")
sql_lines.append(f"""
INSERT INTO users (id, tenant_id, email, hashed_password, full_name, full_name_ar, role, is_active, created_at)
VALUES (
'{admin_id}',
'{tenant_id}',
'admin@dealix.sa',
'{password_hash}',
'System Administrator',
'مدير النظام',
'admin',
true,
NOW()
) ON CONFLICT DO NOTHING;
""")
# Seed leads from Saudi companies
sql_lines.append("-- ═══ Saudi Market Leads ═══")
lead_count = 0
for industry, data in SAUDI_INDUSTRIES.items():
for company in data["companies"]:
for _ in range(random.randint(1, 3)):
lead_id = str(uuid.uuid4())
first = random.choice(SAUDI_FIRST_NAMES_M)
last = random.choice(SAUDI_LAST_NAMES)
city = random.choice(SAUDI_CITIES)
source = random.choice(LEAD_SOURCES)
status = random.choice(LEAD_STATUSES)
phone = f"+9665{random.randint(10000000, 99999999)}"
email = f"{first.lower()}.{last.lower()}@{company['name_en'].lower().replace(' ', '').replace('.', '')}.com"
score = random.randint(30, 95)
days_ago = random.randint(1, 90)
created = f"NOW() - INTERVAL '{days_ago} days'"
sql_lines.append(f"""
INSERT INTO leads (id, tenant_id, company_name, company_name_ar, contact_name, contact_name_ar, email, phone, city, industry, source, status, score, notes, created_at)
VALUES (
'{lead_id}', '{tenant_id}',
'{company["name_en"]}', '{company["name"]}',
'{first} {last}', '{first} {last}',
'{email}', '{phone}', '{city}', '{industry}',
'{source}', '{status}', {score},
'عميل محتمل من {city} - قطاع {industry} - حجم الشركة: {company["size"]}',
{created}
) ON CONFLICT DO NOTHING;
""")
lead_count += 1
# Seed deals
sql_lines.append("-- ═══ Sample Deals ═══")
for i in range(20):
deal_id = str(uuid.uuid4())
plan = random.choice(DEAL_PLANS)
stage = random.choice(["discovery", "proposal", "negotiation", "closed_won", "closed_lost"])
value = plan["price"] * random.choice([1, 3, 6, 12])
days_ago = random.randint(1, 60)
sql_lines.append(f"""
INSERT INTO deals (id, tenant_id, title, value, stage, probability, created_at)
VALUES (
'{deal_id}', '{tenant_id}',
'اشتراك {plan["name"]} - عقد {random.choice(["شهري", "ربع سنوي", "نصف سنوي", "سنوي"])}',
{value}, '{stage}', {random.randint(20, 95)},
NOW() - INTERVAL '{days_ago} days'
) ON CONFLICT DO NOTHING;
""")
# Seed affiliates
sql_lines.append("-- ═══ Affiliate Marketers ═══")
for i in range(8):
aff_id = str(uuid.uuid4())
first = random.choice(SAUDI_FIRST_NAMES_M)
last = random.choice(SAUDI_LAST_NAMES)
phone = f"+9665{random.randint(10000000, 99999999)}"
city = random.choice(SAUDI_CITIES[:6])
code = f"DLX-{uuid.uuid4().hex[:8].upper()}"
deals = random.randint(0, 15)
commission = deals * random.randint(50, 250)
sql_lines.append(f"""
INSERT INTO affiliate_marketers (id, full_name, full_name_ar, email, phone, whatsapp, city, status, referral_code, total_deals_closed, total_commission_earned, current_month_deals, created_at)
VALUES (
'{aff_id}',
'{first} {last}', '{first} {last}',
'{first.lower()}.aff@dealix.sa', '{phone}', '{phone}', '{city}',
'{"active" if deals > 0 else "pending"}',
'{code}', {deals}, {commission}, {min(deals, 5)},
NOW() - INTERVAL '{random.randint(5, 60)} days'
) ON CONFLICT DO NOTHING;
""")
sql_lines.append(f"\n-- ═══ Seed Summary ═══")
sql_lines.append(f"-- Total leads: ~{lead_count}")
sql_lines.append(f"-- Total deals: 20")
sql_lines.append(f"-- Total affiliates: 8")
sql_lines.append(f"-- Admin: admin@dealix.sa / Dealix@2026!")
sql_lines.append("")
return "\n".join(sql_lines)
if __name__ == "__main__":
sql = generate_seed_sql()
with open("seed_data.sql", "w", encoding="utf-8") as f:
f.write(sql)
print(f"✅ Generated seed_data.sql ({len(sql)} bytes)")
print(f" To apply: docker exec -i dealix-db-1 psql -U dealix -d dealix < seed_data.sql")