WAHBi-AI-V2 / utils /api_integrations.py
EGYADMIN's picture
Create utils/api_integrations.py
1cb1f72 verified
raw
history blame
24.4 kB
import os
import json
import requests
from typing import Dict, List, Any, Union, Tuple, Optional
from datetime import datetime
class MunafasatAPI:
"""
فئة للاتصال بمنصة المنافسات والمشتريات الحكومية
"""
def __init__(self, api_key: str = None):
"""
تهيئة الاتصال بمنصة المنافسات
المعاملات:
----------
api_key : str, optional
مفتاح API (يمكن تعيينه لاحقاً أو استخدام المفتاح من متغيرات البيئة)
"""
self.api_key = api_key or os.getenv("MUNAFASAT_API_KEY")
self.base_url = "https://api.etimad.sa/munafasat/v1" # عنوان API افتراضي
# التحقق من توفر مفتاح API
if not self.api_key:
print("Warning: MUNAFASAT_API_KEY not provided. Some functions might not work.")
def get_tenders(self, params: Dict[str, Any] = None) -> Dict[str, Any]:
"""
الحصول على قائمة المناقصات
المعاملات:
----------
params : Dict[str, Any], optional
معاملات البحث والتصفية
المخرجات:
--------
Dict[str, Any]
نتائج البحث
"""
# في التطبيق الفعلي، سيتم استدعاء API
# هنا نستخدم بيانات افتراضية للتوضيح
# إعداد رأس الطلب
headers = {
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json"
}
try:
# إرسال طلب GET للحصول على المناقصات
# response = requests.get(f"{self.base_url}/tenders", headers=headers, params=params)
# return response.json()
# استخدام بيانات افتراضية للتوضيح
return {
"success": True,
"data": [
{
"id": "T001",
"title": "إنشاء مبنى إداري لوزارة الصحة",
"tender_type": "مناقصة عامة",
"sector": "الإنشاءات",
"agency": "وزارة الصحة",
"publication_date": "2023-09-01",
"submission_deadline": "2023-10-01",
"estimated_value": 15000000,
"status": "نشطة"
},
{
"id": "T002",
"title": "تطوير نظام إدارة المستشفيات المركزي",
"tender_type": "مناقصة عامة",
"sector": "تقنية المعلومات",
"agency": "وزارة الصحة",
"publication_date": "2023-08-15",
"submission_deadline": "2023-09-15",
"estimated_value": 8000000,
"status": "مغلقة"
},
{
"id": "T003",
"title": "توريد وتركيب أجهزة طبية لمستشفيات المنطقة الشرقية",
"tender_type": "مناقصة محدودة",
"sector": "الصحة",
"agency": "وزارة الصحة",
"publication_date": "2023-09-10",
"submission_deadline": "2023-10-10",
"estimated_value": 12000000,
"status": "نشطة"
}
],
"meta": {
"total": 3,
"page": 1,
"per_page": 10
}
}
except Exception as e:
print(f"Error fetching tenders: {str(e)}")
return {
"success": False,
"error": str(e)
}
def get_tender_details(self, tender_id: str) -> Dict[str, Any]:
"""
الحصول على تفاصيل مناقصة محددة
المعاملات:
----------
tender_id : str
معرف المناقصة
المخرجات:
--------
Dict[str, Any]
تفاصيل المناقصة
"""
# في التطبيق الفعلي، سيتم استدعاء API
# هنا نستخدم بيانات افتراضية للتوضيح
# إعداد رأس الطلب
headers = {
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json"
}
try:
# إرسال طلب GET للحصول على تفاصيل المناقصة
# response = requests.get(f"{self.base_url}/tenders/{tender_id}", headers=headers)
# return response.json()
# استخدام بيانات افتراضية للتوضيح
if tender_id == "T001":
return {
"success": True,
"data": {
"id": "T001",
"title": "إنشاء مبنى إداري لوزارة الصحة",
"description": "إنشاء مبنى إداري من 5 طوابق بمساحة إجمالية 10000 متر مربع في مدينة الرياض",
"tender_type": "مناقصة عامة",
"sector": "الإنشاءات",
"agency": "وزارة الصحة",
"publication_date": "2023-09-01",
"submission_deadline": "2023-10-01",
"implementation_duration": "24 شهر",
"estimated_value": 15000000,
"required_classification": "مباني - الدرجة الثانية",
"local_content_requirements": "40% كحد أدنى",
"status": "نشطة",
"documents": [
{"name": "كراسة الشروط والمواصفات", "type": "pdf"},
{"name": "المخططات", "type": "dwg"},
{"name": "جدول الكميات", "type": "xlsx"}
],
"milestones": [
{"name": "الاجتماع التمهيدي", "date": "2023-09-15"},
{"name": "آخر موعد للاستفسارات", "date": "2023-09-20"},
{"name": "فتح المظاريف", "date": "2023-10-05"}
]
}
}
else:
return {
"success": False,
"error": "Tender not found"
}
except Exception as e:
print(f"Error fetching tender details: {str(e)}")
return {
"success": False,
"error": str(e)
}
def submit_bid(self, tender_id: str, bid_data: Dict[str, Any]) -> Dict[str, Any]:
"""
تقديم عرض لمناقصة
المعاملات:
----------
tender_id : str
معرف المناقصة
bid_data : Dict[str, Any]
بيانات العرض
المخرجات:
--------
Dict[str, Any]
نتيجة تقديم العرض
"""
# في التطبيق الفعلي، سيتم استدعاء API
# هنا نستخدم بيانات افتراضية للتوضيح
# إعداد رأس الطلب
headers = {
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json"
}
try:
# إرسال طلب POST لتقديم العرض
# response = requests.post(f"{self.base_url}/tenders/{tender_id}/bids", headers=headers, json=bid_data)
# return response.json()
# استخدام بيانات افتراضية للتوضيح
return {
"success": True,
"data": {
"bid_id": "B001",
"tender_id": tender_id,
"submission_date": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
"status": "تم التقديم بنجاح"
}
}
except Exception as e:
print(f"Error submitting bid: {str(e)}")
return {
"success": False,
"error": str(e)
}
class EtimadAPI:
"""
فئة للاتصال بمنصة اعتماد
"""
def __init__(self, api_key: str = None):
"""
تهيئة الاتصال بمنصة اعتماد
المعاملات:
----------
api_key : str, optional
مفتاح API (يمكن تعيينه لاحقاً أو استخدام المفتاح من متغيرات البيئة)
"""
self.api_key = api_key or os.getenv("ETIMAD_API_KEY")
self.base_url = "https://api.etimad.sa/v1" # عنوان API افتراضي
# التحقق من توفر مفتاح API
if not self.api_key:
print("Warning: ETIMAD_API_KEY not provided. Some functions might not work.")
def verify_supplier(self, cr_number: str) -> Dict[str, Any]:
"""
التحقق من بيانات مورد
المعاملات:
----------
cr_number : str
رقم السجل التجاري
المخرجات:
--------
Dict[str, Any]
بيانات المورد
"""
# في التطبيق الفعلي، سيتم استدعاء API
# هنا نستخدم بيانات افتراضية للتوضيح
# إعداد رأس الطلب
headers = {
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json"
}
try:
# إرسال طلب GET للتحقق من بيانات المورد
# response = requests.get(f"{self.base_url}/suppliers/{cr_number}", headers=headers)
# return response.json()
# استخدام بيانات افتراضية للتوضيح
if cr_number == "1010000000":
return {
"success": True,
"data": {
"cr_number": "1010000000",
"company_name": "شركة الإنشاءات السعودية",
"establishment_date": "2010-01-01",
"company_type": "ذات مسؤولية محدودة",
"owner_name": "محمد عبدالله",
"sector": "الإنشاءات",
"status": "نشط",
"classification": {
"category": "مباني",
"level": "الدرجة الأولى"
},
"local_content_certificate": {
"status": "معتمد",
"percentage": 65,
"expiry_date": "2024-12-31"
},
"financial_status": {
"credit_rating": "A",
"liquid_assets": 5000000
}
}
}
else:
return {
"success": False,
"error": "Supplier not found"
}
except Exception as e:
print(f"Error verifying supplier: {str(e)}")
return {
"success": False,
"error": str(e)
}
def get_local_content_certificate(self, cr_number: str) -> Dict[str, Any]:
"""
الحصول على شهادة المحتوى المحلي
المعاملات:
----------
cr_number : str
رقم السجل التجاري
المخرجات:
--------
Dict[str, Any]
بيانات شهادة المحتوى المحلي
"""
# في التطبيق الفعلي، سيتم استدعاء API
# هنا نستخدم بيانات افتراضية للتوضيح
# إعداد رأس الطلب
headers = {
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json"
}
try:
# إرسال طلب GET للحصول على شهادة المحتوى المحلي
# response = requests.get(f"{self.base_url}/local-content/{cr_number}", headers=headers)
# return response.json()
# استخدام بيانات افتراضية للتوضيح
if cr_number == "1010000000":
return {
"success": True,
"data": {
"cr_number": "1010000000",
"company_name": "شركة الإنشاءات السعودية",
"certificate_number": "LC-2023-1234",
"issue_date": "2023-01-01",
"expiry_date": "2024-12-31",
"percentage": 65,
"status": "معتمد",
"details": {
"manpower": {
"saudi_percentage": 55,
"score": 16.5
},
"local_materials": {
"percentage": 70,
"score": 35.0
},
"local_services": {
"percentage": 45,
"score": 13.5
}
}
}
}
else:
return {
"success": False,
"error": "Local content certificate not found"
}
except Exception as e:
print(f"Error fetching local content certificate: {str(e)}")
return {
"success": False,
"error": str(e)
}
class BaladyAPI:
"""
فئة للاتصال بمنصة بلدي
"""
def __init__(self, api_key: str = None):
"""
تهيئة الاتصال بمنصة بلدي
المعاملات:
----------
api_key : str, optional
مفتاح API (يمكن تعيينه لاحقاً أو استخدام المفتاح من متغيرات البيئة)
"""
self.api_key = api_key or os.getenv("BALADY_API_KEY")
self.base_url = "https://api.balady.gov.sa/v1" # عنوان API افتراضي
# التحقق من توفر مفتاح API
if not self.api_key:
print("Warning: BALADY_API_KEY not provided. Some functions might not work.")
def get_location_info(self, location_id: str) -> Dict[str, Any]:
"""
الحصول على معلومات موقع
المعاملات:
----------
location_id : str
معرف الموقع
المخرجات:
--------
Dict[str, Any]
معلومات الموقع
"""
# في التطبيق الفعلي، سيتم استدعاء API
# هنا نستخدم بيانات افتراضية للتوضيح
# إعداد رأس الطلب
headers = {
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json"
}
try:
# إرسال طلب GET للحصول على معلومات الموقع
# response = requests.get(f"{self.base_url}/locations/{location_id}", headers=headers)
# return response.json()
# استخدام بيانات افتراضية للتوضيح
if location_id == "L001":
return {
"success": True,
"data": {
"location_id": "L001",
"name": "حي الملك فهد",
"municipality": "أمانة الرياض",
"city": "الرياض",
"coordinates": {
"latitude": 24.7136,
"longitude": 46.6753
},
"land_use": "تجاري وسكني",
"zoning": {
"type": "تجاري",
"max_height": "15 طابق",
"max_build_ratio": 60
},
"services": {
"water": True,
"electricity": True,
"sewage": True,
"internet": True
}
}
}
else:
return {
"success": False,
"error": "Location not found"
}
except Exception as e:
print(f"Error fetching location info: {str(e)}")
return {
"success": False,
"error": str(e)
}
def get_permit_requirements(self, project_type: str, location_id: str) -> Dict[str, Any]:
"""
الحصول على متطلبات التصاريح
المعاملات:
----------
project_type : str
نوع المشروع
location_id : str
معرف الموقع
المخرجات:
--------
Dict[str, Any]
متطلبات التصاريح
"""
# في التطبيق الفعلي، سيتم استدعاء API
# هنا نستخدم بيانات افتراضية للتوضيح
# إعداد رأس الطلب
headers = {
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json"
}
# إعداد معاملات الطلب
params = {
"project_type": project_type,
"location_id": location_id
}
try:
# إرسال طلب GET للحصول على متطلبات التصاريح
# response = requests.get(f"{self.base_url}/permits/requirements", headers=headers, params=params)
# return response.json()
# استخدام بيانات افتراضية للتوضيح
if project_type == "مبنى تجاري" and location_id == "L001":
return {
"success": True,
"data": {
"project_type": "مبنى تجاري",
"location_id": "L001",
"required_documents": [
{"name": "صك الأرض", "mandatory": True},
{"name": "رخصة البناء", "mandatory": True},
{"name": "المخططات المعتمدة", "mandatory": True},
{"name": "تقرير التربة", "mandatory": True},
{"name": "موافقة الدفاع المدني", "mandatory": True},
{"name": "موافقة شركة الكهرباء", "mandatory": True},
{"name": "موافقة شركة المياه", "mandatory": True}
],
"regulations": [
"الارتداد الأمامي لا يقل عن 5 متر",
"الارتداد الجانبي لا يقل عن 2 متر",
"الارتداد الخلفي لا يقل عن 3 متر",
"نسبة البناء لا تتجاوز 60% من مساحة الأرض",
"ارتفاع المبنى لا يتجاوز 15 طابق"
],
"fees": [
{"name": "رسوم إصدار رخصة البناء", "amount": 5000},
{"name": "تأمين نظافة الموقع", "amount": 10000, "refundable": True}
],
"processing_time": "30 يوم عمل"
}
}
else:
return {
"success": False,
"error": "Requirements not found for the specified project type and location"
}
except Exception as e:
print(f"Error fetching permit requirements: {str(e)}")
return {
"success": False,
"error": str(e)
}
def check_permit_status(self, permit_id: str) -> Dict[str, Any]:
"""
التحقق من حالة تصريح
المعاملات:
----------
permit_id : str
معرف التصريح
المخرجات:
--------
Dict[str, Any]
حالة التصريح
"""
# في التطبيق الفعلي، سيتم استدعاء API
# هنا نستخدم بيانات افتراضية للتوضيح
# إعداد رأس الطلب
headers = {
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json"
}
try:
# إرسال طلب GET للتحقق من حالة التصريح
# response = requests.get(f"{self.base_url}/permits/{permit_id}/status", headers=headers)
# return response.json()
# استخدام بيانات افتراضية للتوضيح
if permit_id == "P001":
return {
"success": True,
"data": {
"permit_id": "P001",
"type": "رخصة بناء",
"status": "موافقة",
"issue_date": "2023-05-15",
"expiry_date": "2024-05-15",
"notes": "تم إصدار الرخصة بنجاح"
}
}
elif permit_id == "P002":
return {
"success": True,
"data": {
"permit_id": "P002",
"type": "رخصة بناء",
"status": "قيد المراجعة",
"submission_date": "2023-09-10",
"expected_completion_date": "2023-10-10",
"progress": 60,
"pending_approvals": [
"موافقة الدفاع المدني",
"موافقة شركة الكهرباء"
]
}
}
else:
return {
"success": False,
"error": "Permit not found"
}
except Exception as e:
print(f"Error checking permit status: {str(e)}")
return {
"success": False,
"error": str(e)
}