mirror of
https://github.com/x1xhlol/system-prompts-and-models-of-ai-tools.git
synced 2026-06-17 23:09:35 +00:00
263 lines
13 KiB
Python
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")
|