diff --git a/haikalbot/services/analysis_service.py b/haikalbot/services/analysis_service.py index 8e0d3e8b..10081ef5 100644 --- a/haikalbot/services/analysis_service.py +++ b/haikalbot/services/analysis_service.py @@ -1,49 +1,31 @@ -from django.db.models import Avg, Sum, Max, Min, ForeignKey, OneToOneField import inspect +import hashlib from django.db import models +from django.db.models import Avg, Sum, Max, Min, ForeignKey, OneToOneField, Count from django.utils.translation import gettext_lazy as _ +from django.utils import timezone def _localized_keys(language): - """ - Get localized key names based on language. - - :param language: Language code ('en' or 'ar') - :type language: str - :return: Dictionary of localized keys - :rtype: dict - """ - if language == 'ar': - return { - 'type': 'نوع', 'model': 'النموذج', 'count': 'العدد', 'filters': 'الفلاتر_المطبقة', - 'error': 'خطأ', 'chart_type': 'نوع_الرسم_البياني', 'labels': 'التسميات', 'data': 'البيانات', - 'visualization_data': 'بيانات_الرسم_البياني', 'field': 'الحقل', 'value': 'القيمة', - 'statistic_type': 'نوع_الإحصاء', 'results': 'النتائج', 'title': 'العنوان' - } - else: - return { - 'type': 'type', 'model': 'model', 'count': 'count', 'filters': 'filters_applied', - 'error': 'error', 'chart_type': 'chart_type', 'labels': 'labels', 'data': 'data', - 'visualization_data': 'visualization_data', 'field': 'field', 'value': 'value', - 'statistic_type': 'statistic_type', 'results': 'results', 'title': 'title' - } + return { + 'type': 'نوع' if language == 'ar' else 'type', + 'model': 'النموذج' if language == 'ar' else 'model', + 'count': 'العدد' if language == 'ar' else 'count', + 'filters': 'الفلاتر_المطبقة' if language == 'ar' else 'filters_applied', + 'error': 'خطأ' if language == 'ar' else 'error', + 'chart_type': 'نوع_الرسم_البياني' if language == 'ar' else 'chart_type', + 'labels': 'التسميات' if language == 'ar' else 'labels', + 'data': 'البيانات' if language == 'ar' else 'data', + 'visualization_data': 'بيانات_الرسم_البياني' if language == 'ar' else 'visualization_data', + 'field': 'الحقل' if language == 'ar' else 'field', + 'value': 'القيمة' if language == 'ar' else 'value', + 'statistic_type': 'نوع_الإحصاء' if language == 'ar' else 'statistic_type', + 'results': 'النتائج' if language == 'ar' else 'results', + 'title': 'العنوان' if language == 'ar' else 'title', + } def generate_count_insight(models, query_params, dealer_id=None, language='en'): - """ - Generate count insights for the specified models. - - :param models: List of models to analyze - :type models: list - :param query_params: Query parameters for filtering - :type query_params: dict - :param dealer_id: Dealer ID for filtering - :type dealer_id: int - :param language: Language code ('en' or 'ar') - :type language: str - :return: Count insights - :rtype: dict - """ keys = _localized_keys(language) results = [] @@ -59,7 +41,9 @@ def generate_count_insight(models, query_params, dealer_id=None, language='en'): filters = {} for key, value in query_params.items(): - if key not in ['field', 'operation'] and hasattr(model, key): + if key in ['field', 'operation']: + continue + if hasattr(model, key): try: field = model._meta.get_field(key) if isinstance(field, models.IntegerField): @@ -76,13 +60,12 @@ def generate_count_insight(models, query_params, dealer_id=None, language='en'): results.append({ keys['model']: model.__name__, keys['count']: queryset.count(), - keys['filters']: filters + keys['filters']: filters, }) - except Exception as e: results.append({ keys['model']: model.__name__, - keys['error']: str(e) + keys['error']: str(e), }) return { @@ -91,30 +74,17 @@ def generate_count_insight(models, query_params, dealer_id=None, language='en'): keys['visualization_data']: { keys['chart_type']: 'bar', keys['labels']: [r[keys['model']] for r in results if keys['count'] in r], - keys['data']: [r[keys['count']] for r in results if keys['count'] in r] + keys['data']: [r[keys['count']] for r in results if keys['count'] in r], } } def generate_statistics_insight(models, query_params, dealer_id=None, language='en'): - """ - Generate statistical insights for the specified models. - - :param models: List of models to analyze - :type models: list - :param query_params: Query parameters for filtering - :type query_params: dict - :param dealer_id: Dealer ID for filtering - :type dealer_id: int - :param language: Language code ('en' or 'ar') - :type language: str - :return: Statistical insights - :rtype: dict - """ keys = _localized_keys(language) results = [] field = query_params.get('field') operation = query_params.get('operation', 'average') + stat_map = {'average': Avg, 'sum': Sum, 'max': Max, 'min': Min} for model in models: try: @@ -128,37 +98,28 @@ def generate_statistics_insight(models, query_params, dealer_id=None, language=' elif hasattr(model, 'dealer'): queryset = queryset.filter(dealer=dealer_id) - filters = {} - for k, v in query_params.items(): - if k not in ['field', 'operation'] and hasattr(model, k): - filters[k] = v + filters = { + k: v for k, v in query_params.items() + if k not in ['field', 'operation'] and hasattr(model, k) + } if filters: queryset = queryset.filter(**filters) - stat_map = { - 'average': Avg, - 'sum': Sum, - 'max': Max, - 'min': Min - } - - if operation in stat_map: - agg = queryset.aggregate(val=stat_map[operation](field))['val'] - value = agg - else: - value = queryset.count() + value = queryset.aggregate(val=stat_map.get(operation, Count)(field))['val'] results.append({ keys['model']: model.__name__, keys['field']: field, keys['statistic_type']: operation, keys['value']: value, - keys['filters']: filters + keys['filters']: filters, }) - except Exception as e: - results.append({keys['model']: model.__name__, keys['error']: str(e)}) + results.append({ + keys['model']: model.__name__, + keys['error']: str(e), + }) return { keys['type']: keys['type'] + '_analysis', @@ -173,18 +134,6 @@ def generate_statistics_insight(models, query_params, dealer_id=None, language=' def generate_recommendations(model_classes, analysis_type, language='en'): - """ - Generate recommendations based on model analysis. - - :param model_classes: List of models to analyze - :type model_classes: list - :param analysis_type: Type of analysis - :type analysis_type: str - :param language: Language code ('en' or 'ar') - :type language: str - :return: List of recommendations - :rtype: list - """ recs = [] for model in model_classes: for field in model._meta.fields: @@ -198,34 +147,20 @@ def generate_recommendations(model_classes, analysis_type, language='en'): def generate_model_insight(model, dealer_id=None, language='en'): - """ - Generate insights for a specific model. - - :param model: Model to analyze - :type model: Model class - :param dealer_id: Dealer ID for filtering - :type dealer_id: int - :param language: Language code ('en' or 'ar') - :type language: str - :return: Model insights - :rtype: dict - """ keys = _localized_keys(language) - fields_info = [ - { - 'name': f.name, - 'type': f.__class__.__name__, - 'null': f.null, - 'blank': f.blank, - 'unique': f.unique, - 'pk': f.primary_key - } for f in model._meta.fields - ] + fields_info = [{ + 'name': f.name, + 'type': f.__class__.__name__, + 'null': f.null, + 'blank': f.blank, + 'unique': f.unique, + 'pk': f.primary_key + } for f in model._meta.fields] try: qs = model.objects.all() if dealer_id: - if hasattr(model, 'dealer_id'): + if hasattr(model, 'dealer'): qs = qs.filter(dealer_id=dealer_id) elif hasattr(model, 'dealer'): qs = qs.filter(dealer=dealer_id) @@ -242,20 +177,6 @@ def generate_model_insight(model, dealer_id=None, language='en'): def generate_relationship_insight(models, query_params=None, dealer_id=None, language='en'): - """ - Generate relationship insights between models. - - :param models: List of models to analyze - :type models: list - :param query_params: Query parameters (unused) - :type query_params: dict - :param dealer_id: Dealer ID (unused) - :type dealer_id: int - :param language: Language code ('en' or 'ar') - :type language: str - :return: Relationship insights - :rtype: dict - """ from_ = "من" if language == 'ar' else "from" to_ = "إلى" if language == 'ar' else "to" rel_type = "نوع" if language == 'ar' else "type" @@ -267,7 +188,7 @@ def generate_relationship_insight(models, query_params=None, dealer_id=None, lan relationships.append({ from_: model.__name__, to_: field.related_model.__name__, - rel_type: field.__class__.__name__ + rel_type: field.__class__.__name__, }) for field in model._meta.many_to_many: relationships.append({ @@ -283,37 +204,24 @@ def generate_relationship_insight(models, query_params=None, dealer_id=None, lan def generate_performance_insight(models, query_params=None, dealer_id=None, language='en'): - """ - Generate performance insights for models. - - :param models: List of models to analyze - :type models: list - :param query_params: Query parameters (unused) - :type query_params: dict - :param dealer_id: Dealer ID (unused) - :type dealer_id: int - :param language: Language code ('en' or 'ar') - :type language: str - :return: Performance insights - :rtype: dict - """ issues = [] + for model in models: for field in model._meta.fields: if isinstance(field, ForeignKey) and not field.db_index: issues.append({ - 'model': model.__name__, + # 'model': model.__name__, 'field': field.name, 'issue': 'Missing index on ForeignKey' }) - if isinstance(field, models.CharField) and not field.db_index and field.name in ['name', 'title']: - issues.append({ - 'model': model.__name__, - 'field': field.name, - 'issue': 'Unindexed CharField used in filtering' - }) + # if isinstance(field, models.CharField) and not field.db_index and field.name in ['name', 'title']: + # issues.append({ + # 'model': model.__name__, + # 'field': field.name, + # 'issue': 'Unindexed CharField used in filtering' + # }) return { 'type': 'تحليل_الأداء' if language == 'ar' else 'performance_analysis', 'issues': issues - } + } \ No newline at end of file diff --git a/haikalbot/services/cache_service.py b/haikalbot/services/cache_service.py index ba1a63ba..6c80f725 100644 --- a/haikalbot/services/cache_service.py +++ b/haikalbot/services/cache_service.py @@ -1,93 +1,53 @@ +import hashlib +import logging from django.utils import timezone from django.db import models from ..models import AnalysisCache -import hashlib -import logging logger = logging.getLogger(__name__) + class CacheService: - """ - Service for handling analysis result caching operations. - - This service provides methods for generating cache keys, retrieving - cached results, and storing new results in the cache. - """ - def generate_hash(self, prompt, dealer_id, language): """ - Generate a unique hash for the prompt, dealer, and language combination. - - :param prompt: The user's prompt text - :type prompt: str - :param dealer_id: The dealer's ID - :type dealer_id: int - :param language: The language code - :type language: str - :return: MD5 hash string - :rtype: str + Generate a unique MD5 hash based on the prompt, dealer ID, and language. """ - cache_key = f"{prompt}:{dealer_id or 'all'}:{language}" - return hashlib.md5(cache_key.encode()).hexdigest() - + key = f"{prompt}:{dealer_id or 'all'}:{language}" + return hashlib.md5(key.encode()).hexdigest() + def get_cached_result(self, prompt_hash, user, dealer_id): """ - Retrieve a cached result if available and not expired. - - :param prompt_hash: The hash key for the cache entry - :type prompt_hash: str - :param user: The user making the request - :type user: User - :param dealer_id: The dealer's ID - :type dealer_id: int - :return: Cached result or None if not found - :rtype: dict or None + Retrieve a cached analysis result based on hash, dealer, and optionally user. """ try: - cache_entry = AnalysisCache.objects.filter( - prompt_hash=prompt_hash, - dealer_id=dealer_id, - expires_at__gt=timezone.now() - ).first() - - # If user is authenticated, also check user-specific cache + # Check for user-specific cache if authenticated if user and user.is_authenticated: user_cache = AnalysisCache.objects.filter( prompt_hash=prompt_hash, user=user, expires_at__gt=timezone.now() ).first() - - # User-specific cache takes precedence if user_cache: return user_cache.result - - return cache_entry.result if cache_entry else None + + # Otherwise check for dealer-wide cache + dealer_cache = AnalysisCache.objects.filter( + prompt_hash=prompt_hash, + dealer_id=dealer_id, + expires_at__gt=timezone.now() + ).first() + + return dealer_cache.result if dealer_cache else None except Exception as e: - logger.warning(f"Error retrieving cache: {str(e)}") + logger.warning(f"Cache retrieval failed: {str(e)}") return None - + def cache_result(self, prompt_hash, result, user, dealer_id, duration=3600): """ - Store a result in the cache. - - :param prompt_hash: The hash key for the cache entry - :type prompt_hash: str - :param result: The result to cache - :type result: dict - :param user: The user making the request - :type user: User - :param dealer_id: The dealer's ID - :type dealer_id: int - :param duration: Cache duration in seconds - :type duration: int - :return: None + Save or update a cached result with an expiration timestamp. """ try: - # Calculate expiration time expires_at = timezone.now() + timezone.timedelta(seconds=duration) - - # Create or update cache entry AnalysisCache.objects.update_or_create( prompt_hash=prompt_hash, user=user if user and user.is_authenticated else None, @@ -98,4 +58,4 @@ class CacheService: } ) except Exception as e: - logger.warning(f"Error caching result: {str(e)}") + logger.warning(f"Cache saving failed: {str(e)}") \ No newline at end of file diff --git a/haikalbot/services/llm_service.py b/haikalbot/services/llm_service.py index 9eb511b7..3d3363c3 100644 --- a/haikalbot/services/llm_service.py +++ b/haikalbot/services/llm_service.py @@ -1,25 +1,18 @@ +import json +import logging +from django.apps import apps +from django.http import JsonResponse +from django.db.models import Count, Avg, Max, Min from langchain_ollama import OllamaLLM from langchain.chains import LLMChain from langchain.prompts import PromptTemplate from django.conf import settings -import logging logger = logging.getLogger(__name__) def get_llm_instance(): - """ - Initialize and return an Ollama LLM instance configured for Arabic support. - - This function creates a new LLM instance with optimized parameters for - both Arabic and English language processing. It reads configuration from - Django settings or uses sensible defaults. - - :return: Configured OllamaLLM instance or None if initialization fails - :rtype: OllamaLLM or None - """ try: - # Get settings from Django settings or use defaults base_url = getattr(settings, 'OLLAMA_BASE_URL', 'http://localhost:11434') model = getattr(settings, 'OLLAMA_MODEL', 'qwen3:8b') temperature = getattr(settings, 'OLLAMA_TEMPERATURE', 0.2) @@ -27,7 +20,7 @@ def get_llm_instance(): top_k = getattr(settings, 'OLLAMA_TOP_K', 40) num_ctx = getattr(settings, 'OLLAMA_NUM_CTX', 4096) num_predict = getattr(settings, 'OLLAMA_NUM_PREDICT', 2048) - + return OllamaLLM( base_url=base_url, model=model, @@ -45,23 +38,10 @@ def get_llm_instance(): def get_llm_chain(language='en'): - """ - Create a LangChain for analyzing prompts in Arabic or English. - - This function creates a chain that processes user prompts and extracts - structured information about the analysis request. It supports both - Arabic and English languages. - - :param language: Language code ('en' or 'ar') - :type language: str - :return: LangChain for prompt analysis or None if initialization fails - :rtype: LLMChain or None - """ llm = get_llm_instance() if not llm: return None - # Define the prompt template based on language if language == 'ar': template = """ قم بتحليل الاستعلام التالي وتحديد نوع التحليل المطلوب ونماذج البيانات المستهدفة وأي معلمات استعلام. @@ -89,11 +69,82 @@ def get_llm_chain(language='en'): } """ - # Create the prompt template prompt_template = PromptTemplate( input_variables=["prompt"], template=template ) - # Create and return the LLM chain return prompt_template | llm + + +def analyze_models_with_orm(analysis_type, target_models, query_params): + results = {} + + for model_name in target_models: + try: + model = apps.get_model('your_app_name', model_name) + except LookupError: + results[model_name] = {"error": f"Model '{model_name}' not found"} + continue + + try: + queryset = model.objects.filter(**query_params) + + if analysis_type == 'count': + results[model_name] = {'count': queryset.count()} + + elif analysis_type == 'statistics': + numeric_fields = [f.name for f in model._meta.fields if f.get_internal_type() in ['IntegerField', 'FloatField', 'DecimalField']] + stats = {} + for field in numeric_fields: + stats[field] = { + 'avg': queryset.aggregate(avg=Avg(field))['avg'], + 'max': queryset.aggregate(max=Max(field))['max'], + 'min': queryset.aggregate(min=Min(field))['min'] + } + results[model_name] = stats + + elif analysis_type == 'relationship': + related = {} + for field in model._meta.get_fields(): + if field.is_relation and field.many_to_one: + related[field.name] = queryset.values(field.name).annotate(count=Count(field.name)).count() + results[model_name] = related + + elif analysis_type == 'performance': + results[model_name] = {'note': 'Performance analysis logic not implemented.'} + + else: + results[model_name] = list(queryset.values()) + + except Exception as e: + results[model_name] = {'error': str(e)} + + return results + + +def analyze_prompt_and_return_json(request): + try: + prompt = request.POST.get('prompt') + language = request.POST.get('language', 'en') + + chain = get_llm_chain(language) + if not chain: + return JsonResponse({'success': False, 'error': 'LLM not initialized'}) + + result = chain.invoke({'prompt': prompt}) + parsed = json.loads(result) + + analysis_type = parsed.get('analysis_type') + target_models = parsed.get('target_models', []) + query_params = parsed.get('query_params', {}) + + if not analysis_type or not target_models: + return JsonResponse({'success': False, 'error': 'Incomplete analysis instruction returned by LLM'}) + + orm_results = analyze_models_with_orm(analysis_type, target_models, query_params) + + return JsonResponse({'success': True, 'data': orm_results}) + + except Exception as e: + return JsonResponse({'success': False, 'error': str(e)}) \ No newline at end of file diff --git a/locale/ar/LC_MESSAGES/django.mo b/locale/ar/LC_MESSAGES/django.mo index 94e5f24d..902a838e 100644 Binary files a/locale/ar/LC_MESSAGES/django.mo and b/locale/ar/LC_MESSAGES/django.mo differ diff --git a/locale/ar/LC_MESSAGES/django.po b/locale/ar/LC_MESSAGES/django.po index 831427ef..210f2d5f 100644 --- a/locale/ar/LC_MESSAGES/django.po +++ b/locale/ar/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-05-26 14:44+0300\n" +"POT-Creation-Date: 2025-05-26 15:53+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -61,9 +61,9 @@ msgstr "العربية" msgid "Haikal" msgstr "هيكل" -#: inventory/forms.py:105 inventory/forms.py:1631 inventory/models.py:1099 -#: inventory/models.py:1128 inventory/models.py:1189 inventory/models.py:1315 -#: inventory/models.py:1444 inventory/models.py:1637 inventory/models.py:1800 +#: inventory/forms.py:105 inventory/forms.py:1631 inventory/models.py:1108 +#: inventory/models.py:1137 inventory/models.py:1198 inventory/models.py:1324 +#: inventory/models.py:1453 inventory/models.py:1646 inventory/models.py:1809 #: templates/account/login.html:29 templates/account/login.html:31 #: templates/admin_management/user_management.html:21 #: templates/admin_management/user_management.html:85 @@ -101,9 +101,9 @@ msgstr "الخدمات المقدمة" #: inventory/forms.py:118 inventory/forms.py:121 inventory/forms.py:153 #: inventory/forms.py:168 inventory/forms.py:267 inventory/forms.py:515 #: inventory/forms.py:602 inventory/forms.py:822 inventory/forms.py:1019 -#: inventory/forms.py:1637 inventory/models.py:919 inventory/models.py:1006 -#: inventory/models.py:1194 inventory/models.py:1316 inventory/models.py:1425 -#: inventory/models.py:1445 inventory/models.py:1869 +#: inventory/forms.py:1637 inventory/models.py:928 inventory/models.py:1015 +#: inventory/models.py:1203 inventory/models.py:1325 inventory/models.py:1434 +#: inventory/models.py:1454 inventory/models.py:1878 #: templates/administration/staff_index.html:123 #: templates/crm/leads/lead_list.html:103 #: templates/crm/opportunities/opportunity_detail.html:192 @@ -116,12 +116,12 @@ msgstr "الخدمات المقدمة" msgid "Phone Number" msgstr "رقم الهاتف" -#: inventory/forms.py:466 inventory/models.py:825 +#: inventory/forms.py:466 inventory/models.py:834 #: templates/inventory/car_detail.html:143 msgid "Custom Date" msgstr "تاريخ البطاقة الجمركية" -#: inventory/forms.py:516 inventory/models.py:1868 +#: inventory/forms.py:516 inventory/models.py:1877 #: templates/vendors/view_vendor.html:17 msgid "Contact Person" msgstr "الشخص المسؤول" @@ -130,8 +130,8 @@ msgstr "الشخص المسؤول" msgid "Both exterior and interior colors must be selected." msgstr "يجب اختيار اللونين الخارجي والداخلي." -#: inventory/forms.py:677 inventory/forms.py:1634 inventory/models.py:1426 -#: inventory/models.py:1870 templates/account/email_change.html:5 +#: inventory/forms.py:677 inventory/forms.py:1634 inventory/models.py:1435 +#: inventory/models.py:1879 templates/account/email_change.html:5 #: templates/account/email_change.html:9 templates/pricing_page.html:106 msgid "Email Address" msgstr "عنوان البريد الإلكتروني" @@ -184,9 +184,9 @@ msgstr "يوجد بالفعل حساب بهذا البريد الإلكترون msgid "Passwords do not match." msgstr "كلمات المرور غير متطابقة." -#: inventory/forms.py:781 inventory/models.py:416 inventory/models.py:774 -#: inventory/models.py:787 inventory/models.py:1004 inventory/models.py:1309 -#: inventory/models.py:1420 templates/admin_management/user_management.html:83 +#: inventory/forms.py:781 inventory/models.py:416 inventory/models.py:783 +#: inventory/models.py:796 inventory/models.py:1013 inventory/models.py:1318 +#: inventory/models.py:1429 templates/admin_management/user_management.html:83 #: templates/admin_management/user_management.html:147 #: templates/admin_management/user_management.html:211 #: templates/administration/manage_service.html:22 @@ -212,7 +212,7 @@ msgstr "كلمات المرور غير متطابقة." msgid "Name" msgstr "الاسم" -#: inventory/forms.py:785 inventory/models.py:918 inventory/models.py:1867 +#: inventory/forms.py:785 inventory/models.py:927 inventory/models.py:1876 msgid "English Name" msgstr "الاسم بالإنجليزية" @@ -221,9 +221,9 @@ msgid "Please enter an English Name." msgstr "يرجى إدخال اسم باللغة الإنجليزية." #: inventory/forms.py:795 inventory/forms.py:799 inventory/models.py:417 -#: inventory/models.py:775 inventory/models.py:788 inventory/models.py:917 -#: inventory/models.py:1005 inventory/models.py:1310 inventory/models.py:1421 -#: inventory/models.py:1866 templates/admin_management/user_management.html:84 +#: inventory/models.py:784 inventory/models.py:797 inventory/models.py:926 +#: inventory/models.py:1014 inventory/models.py:1319 inventory/models.py:1430 +#: inventory/models.py:1875 templates/admin_management/user_management.html:84 #: templates/admin_management/user_management.html:148 #: templates/admin_management/user_management.html:212 #: templates/users/user_detail.html:17 @@ -239,8 +239,8 @@ msgstr "يرجى إدخال اسم باللغة العربية." msgid "CRN" msgstr "رقم السجل التجاري" -#: inventory/forms.py:850 inventory/models.py:910 inventory/models.py:1312 -#: inventory/models.py:1481 inventory/models.py:1858 +#: inventory/forms.py:850 inventory/models.py:919 inventory/models.py:1321 +#: inventory/models.py:1490 inventory/models.py:1867 msgid "Commercial Registration Number" msgstr "رقم السجل التجاري" @@ -253,8 +253,8 @@ msgstr "رقم السجل التجاري يجب أن يتكون من 10 أرقا msgid "VRN" msgstr "الرقم الضريبي" -#: inventory/forms.py:868 inventory/models.py:915 inventory/models.py:1314 -#: inventory/models.py:1484 inventory/models.py:1861 +#: inventory/forms.py:868 inventory/models.py:924 inventory/models.py:1323 +#: inventory/models.py:1493 inventory/models.py:1870 msgid "VAT Registration Number" msgstr "رقم التسجيل في ضريبة القيمة المضافة" @@ -262,8 +262,8 @@ msgstr "رقم التسجيل في ضريبة القيمة المضافة" msgid "VAT Registration Number must be 15 characters." msgstr "يجب أن يكون رقم التسجيل الضريبي مكونًا من 15 حرفًا." -#: inventory/forms.py:881 inventory/models.py:921 inventory/models.py:1197 -#: inventory/models.py:1318 inventory/models.py:1428 inventory/models.py:1872 +#: inventory/forms.py:881 inventory/models.py:930 inventory/models.py:1206 +#: inventory/models.py:1327 inventory/models.py:1437 inventory/models.py:1881 #: templates/crm/leads/lead_detail.html:199 #: templates/customers/customer_list.html:51 #: templates/customers/view_customer.html:75 @@ -298,7 +298,7 @@ msgstr "العنوان" msgid "Item" msgstr "العنصر" -#: inventory/forms.py:915 inventory/models.py:637 +#: inventory/forms.py:915 inventory/models.py:644 #: templates/inventory/transfer_preview.html:286 #: templates/ledger/bills/bill_detail.html:214 #: templates/ledger/ledger/ledger_detail.html:83 @@ -318,7 +318,7 @@ msgstr "العنصر" msgid "Quantity" msgstr "الكمية" -#: inventory/forms.py:940 inventory/models.py:2026 +#: inventory/forms.py:940 inventory/models.py:2035 #: templates/customers/view_customer.html:154 #: templates/ledger/journal_entry/includes/card_invoice.html:10 #: templates/plans/create_order.html:29 templates/plans/invoices/layout.html:11 @@ -350,25 +350,25 @@ msgstr "الفاتورة" msgid "Amount" msgstr "المبلغ" -#: inventory/forms.py:949 inventory/models.py:1957 +#: inventory/forms.py:949 inventory/models.py:1966 msgid "cash" msgstr "نقداً" -#: inventory/forms.py:950 inventory/models.py:1958 +#: inventory/forms.py:950 inventory/models.py:1967 msgid "credit" msgstr "دائن" -#: inventory/forms.py:951 inventory/models.py:1959 +#: inventory/forms.py:951 inventory/models.py:1968 #: templates/inventory/car_detail.html:191 #: templates/inventory/transfer_car.html:18 msgid "transfer" msgstr "نقل" -#: inventory/forms.py:952 inventory/models.py:1960 +#: inventory/forms.py:952 inventory/models.py:1969 msgid "debit" msgstr "مدين" -#: inventory/forms.py:953 inventory/models.py:1961 inventory/models.py:2036 +#: inventory/forms.py:953 inventory/models.py:1970 inventory/models.py:2045 msgid "SADAD" msgstr "سداد" @@ -398,7 +398,7 @@ msgid "To" msgstr "إلى" #: inventory/forms.py:1022 inventory/models.py:203 inventory/models.py:485 -#: inventory/models.py:1462 inventory/tables.py:52 +#: inventory/models.py:1471 inventory/tables.py:52 #: templates/inventory/car_list_view.html:103 #: templates/inventory/car_list_view.html:163 #: templates/inventory/cars_list_api.html:33 @@ -411,7 +411,7 @@ msgid "Make" msgstr "الصانع" #: inventory/forms.py:1039 inventory/models.py:226 inventory/models.py:493 -#: inventory/models.py:1469 inventory/tables.py:53 +#: inventory/models.py:1478 inventory/tables.py:53 #: templates/inventory/car_list_view.html:117 #: templates/inventory/car_list_view.html:164 #: templates/inventory/cars_list_api.html:34 @@ -431,8 +431,8 @@ msgstr "تاريخ الإغلاق المتوقع" msgid "Probability (%)" msgstr "الاحتمالية (%)" -#: inventory/forms.py:1347 inventory/models.py:516 inventory/models.py:1504 -#: inventory/models.py:1792 inventory/tables.py:62 +#: inventory/forms.py:1347 inventory/models.py:516 inventory/models.py:1513 +#: inventory/models.py:1801 inventory/tables.py:62 #: templates/admin_management/user_management.html:22 #: templates/admin_management/user_management.html:86 #: templates/admin_management/user_management.html:150 @@ -458,7 +458,7 @@ msgstr "الاحتمالية (%)" msgid "Status" msgstr "الحالة" -#: inventory/forms.py:1363 inventory/models.py:1708 +#: inventory/forms.py:1363 inventory/models.py:1717 msgid "Stage" msgstr "المرحلة" @@ -490,15 +490,15 @@ msgstr "يجب أن يحتوي رمز التحقق (CVV) على أرقام فق msgid "CVV must be 3 or 4 digits" msgstr "يجب أن يكون رمز التحقق (CVV) مكونًا من 3 أو 4 أرقام" -#: inventory/forms.py:1612 inventory/forms.py:1615 inventory/models.py:1178 -#: inventory/models.py:1442 templates/admin_management/user_management.html:19 +#: inventory/forms.py:1612 inventory/forms.py:1615 inventory/models.py:1187 +#: inventory/models.py:1451 templates/admin_management/user_management.html:19 #: templates/administration/manage_staff_personal_info.html:18 #: templates/pricing_page.html:92 templates/pricing_page.html:95 msgid "First Name" msgstr "الاسم الأول" -#: inventory/forms.py:1622 inventory/forms.py:1625 inventory/models.py:1182 -#: inventory/models.py:1443 templates/admin_management/user_management.html:20 +#: inventory/forms.py:1622 inventory/forms.py:1625 inventory/models.py:1191 +#: inventory/models.py:1452 templates/admin_management/user_management.html:20 #: templates/administration/manage_staff_personal_info.html:24 #: templates/pricing_page.html:99 templates/pricing_page.html:102 msgid "Last Name" @@ -533,7 +533,7 @@ msgstr "يجب أن تقبل الشروط وسياسة الخصوصية." msgid "Primary Key" msgstr "المفتاح الأساسي" -#: inventory/models.py:37 inventory/models.py:1726 inventory/models.py:1879 +#: inventory/models.py:37 inventory/models.py:1735 inventory/models.py:1888 msgid "Slug" msgstr "المُعرّف الفريد (Slug)" @@ -542,18 +542,18 @@ msgid "" "Slug for the object. If not provided, it will be generated automatically." msgstr "المُعرّف الفريد للكائن. إذا لم يتم توفيره، فسيتم إنشاؤه تلقائيًا." -#: inventory/models.py:39 inventory/models.py:646 inventory/models.py:859 -#: inventory/models.py:1878 +#: inventory/models.py:39 inventory/models.py:653 inventory/models.py:868 +#: inventory/models.py:1887 msgid "Created At" msgstr "تاريخ الإنشاء" -#: inventory/models.py:40 inventory/models.py:647 inventory/models.py:930 +#: inventory/models.py:40 inventory/models.py:654 inventory/models.py:939 msgid "Updated At" msgstr "تم التحديث" -#: inventory/models.py:165 inventory/models.py:536 inventory/models.py:620 -#: inventory/models.py:665 inventory/models.py:822 inventory/models.py:837 -#: inventory/models.py:881 inventory/models.py:1705 +#: inventory/models.py:165 inventory/models.py:536 inventory/models.py:627 +#: inventory/models.py:672 inventory/models.py:831 inventory/models.py:846 +#: inventory/models.py:890 inventory/models.py:1714 #: templates/crm/leads/lead_list.html:91 templates/dashboards/manager.html:52 #: templates/inventory/transfer_details.html:88 msgid "Car" @@ -745,7 +745,7 @@ msgstr "تالف" msgid "Reserved" msgstr "محجوزة" -#: inventory/models.py:408 inventory/models.py:1138 +#: inventory/models.py:408 inventory/models.py:1147 #: templates/dashboards/manager.html:121 templates/dashboards/manager.html:238 #: templates/dashboards/sales.html:38 templates/dashboards/sales.html:335 #: templates/inventory/car_list_view.html:53 @@ -756,7 +756,7 @@ msgstr "محجوزة" msgid "Transfer" msgstr "نقل" -#: inventory/models.py:411 inventory/models.py:1104 +#: inventory/models.py:411 inventory/models.py:1113 #: templates/crm/leads/lead_detail.html:132 #: templates/crm/leads/lead_list.html:165 #: templates/inventory/car_inventory.html:90 test.txt:33 @@ -767,7 +767,7 @@ msgstr "جديد" msgid "Used" msgstr "مستعمل" -#: inventory/models.py:418 inventory/models.py:856 inventory/models.py:1765 +#: inventory/models.py:418 inventory/models.py:865 inventory/models.py:1774 #: templates/administration/manage_day_off.html:63 #: templates/administration/manage_service.html:33 #: templates/administration/user_profile.html:93 @@ -815,7 +815,7 @@ msgstr "خاضع للضريبة" msgid "Unit of Measurement" msgstr "وحدة القياس" -#: inventory/models.py:429 inventory/models.py:470 inventory/models.py:981 +#: inventory/models.py:429 inventory/models.py:470 inventory/models.py:990 msgid "Dealer" msgstr "المعرض" @@ -831,7 +831,7 @@ msgstr "الخدمات الإضافية" msgid "Item Model" msgstr "نموذج العنصر" -#: inventory/models.py:477 inventory/models.py:1892 +#: inventory/models.py:477 inventory/models.py:1901 #: templates/inventory/car_detail.html:117 #: templates/inventory/car_form.html:147 #: ⁨templates/inventory/car_form_qabl alfalsafa.html⁩:136 @@ -843,7 +843,7 @@ msgstr "نموذج العنصر" msgid "Vendor" msgstr "المورد" -#: inventory/models.py:495 inventory/models.py:1472 inventory/tables.py:54 +#: inventory/models.py:495 inventory/models.py:1481 inventory/tables.py:54 #: templates/inventory/car_form.html:72 #: ⁨templates/inventory/car_form_qabl alfalsafa.html⁩:55 #: templates/inventory/car_inventory.html:67 @@ -865,7 +865,7 @@ msgstr "السنة" msgid "Stock Type" msgstr "نوع المخزون" -#: inventory/models.py:524 inventory/models.py:638 +#: inventory/models.py:524 inventory/models.py:645 #: templates/inventory/car_detail.html:122 #: templates/inventory/car_form.html:191 #: ⁨templates/inventory/car_form_qabl alfalsafa.html⁩:181 @@ -896,165 +896,165 @@ msgstr "رمز" msgid "Cars" msgstr "السيارات" -#: inventory/models.py:626 +#: inventory/models.py:633 msgid "From Dealer" msgstr "من معرض" -#: inventory/models.py:632 +#: inventory/models.py:639 msgid "To Dealer" msgstr "الى معرض" -#: inventory/models.py:635 +#: inventory/models.py:642 msgid "Transfer Date" msgstr "تاريخ النقل" -#: inventory/models.py:653 +#: inventory/models.py:660 msgid "Car Transfer Log" msgstr "سجل نقل السيارة" -#: inventory/models.py:654 +#: inventory/models.py:661 msgid "Car Transfer Logs" msgstr "سجلات نقل السيارات" -#: inventory/models.py:671 templates/inventory/car_detail.html:334 +#: inventory/models.py:678 templates/inventory/car_detail.html:334 msgid "Reserved By" msgstr "محجوز بواسطة" -#: inventory/models.py:679 +#: inventory/models.py:686 msgid "Reserved At" msgstr "تاريخ الحجز" -#: inventory/models.py:680 +#: inventory/models.py:687 msgid "Reserved Until" msgstr "محجوز حتى" -#: inventory/models.py:690 templates/inventory/car_detail.html:499 +#: inventory/models.py:697 templates/inventory/car_detail.html:499 msgid "Car Reservation" msgstr "حجز السيارة" -#: inventory/models.py:691 +#: inventory/models.py:698 msgid "Car Reservations" msgstr "حجوزات السيارات" -#: inventory/models.py:701 templates/inventory/car_detail.html:229 +#: inventory/models.py:708 templates/inventory/car_detail.html:229 msgid "Cost Price" msgstr "سعر التكلفة" -#: inventory/models.py:704 templates/inventory/car_detail.html:234 +#: inventory/models.py:711 templates/inventory/car_detail.html:234 msgid "Selling Price" msgstr "سعر البيع" -#: inventory/models.py:709 templates/inventory/car_detail.html:238 +#: inventory/models.py:716 templates/inventory/car_detail.html:238 #: templates/sales/estimates/estimate_detail.html:221 #: templates/sales/invoices/invoice_detail.html:261 msgid "Discount Amount" msgstr "مبلغ الخصم" -#: inventory/models.py:769 inventory/models.py:770 +#: inventory/models.py:778 inventory/models.py:779 msgid "Car Financial Details" msgstr "تفاصيل المالية للسيارة" -#: inventory/models.py:776 inventory/models.py:789 +#: inventory/models.py:785 inventory/models.py:798 msgid "RGB" msgstr "آر جي بي" -#: inventory/models.py:779 inventory/models.py:780 +#: inventory/models.py:788 inventory/models.py:789 #: templates/inventory/add_colors.html:13 msgid "Exterior Colors" msgstr "الألوان الخارجية" -#: inventory/models.py:792 inventory/models.py:793 +#: inventory/models.py:801 inventory/models.py:802 #: templates/inventory/add_colors.html:33 msgid "Interior Colors" msgstr "الألوان الداخلية" -#: inventory/models.py:809 templates/inventory/car_list_view.html:167 +#: inventory/models.py:818 templates/inventory/car_list_view.html:167 msgid "Color" msgstr "اللون" -#: inventory/models.py:810 +#: inventory/models.py:819 msgid "Colors" msgstr "الألوان" -#: inventory/models.py:824 templates/inventory/car_detail.html:139 +#: inventory/models.py:833 templates/inventory/car_detail.html:139 msgid "Custom Number" msgstr "رقم البطاقة الجمركية" -#: inventory/models.py:828 templates/inventory/car_detail.html:148 +#: inventory/models.py:837 templates/inventory/car_detail.html:148 #: templates/inventory/car_detail.html:457 msgid "Custom Card" msgstr "البطاقة الجمركية" -#: inventory/models.py:829 +#: inventory/models.py:838 msgid "Custom Cards" msgstr "البطاقات الجمركية" -#: inventory/models.py:843 inventory/models.py:1715 +#: inventory/models.py:852 inventory/models.py:1724 msgid "Owner" msgstr "المالك" -#: inventory/models.py:844 +#: inventory/models.py:853 msgid "Dealer who owns the car." msgstr "التاجر الذي يمتلك السيارة." -#: inventory/models.py:850 inventory/models.py:1084 +#: inventory/models.py:859 inventory/models.py:1093 msgid "Showroom" msgstr "صالة العرض" -#: inventory/models.py:851 +#: inventory/models.py:860 msgid "Dealer where the car is displayed (can be the owner)." msgstr "التاجر الذي تُعرض السيارة في صالته (يمكن أن يكون المالك)." -#: inventory/models.py:857 +#: inventory/models.py:866 msgid "Optional description about the showroom placement." msgstr "وصف اختياري حول وضع السيارة في صالة العرض." -#: inventory/models.py:860 +#: inventory/models.py:869 msgid "Last Updated" msgstr "آخر تحديث" -#: inventory/models.py:863 +#: inventory/models.py:872 msgid "Car Location" msgstr "موقع السيارة" -#: inventory/models.py:864 +#: inventory/models.py:873 msgid "Car Locations" msgstr "مواقف السيارات" -#: inventory/models.py:883 +#: inventory/models.py:892 msgid "Plate Number" msgstr "رقم اللوحة" -#: inventory/models.py:884 +#: inventory/models.py:893 msgid "Text 1" msgstr "النص 1" -#: inventory/models.py:885 +#: inventory/models.py:894 msgid "Text 2" msgstr "النص 2" -#: inventory/models.py:886 +#: inventory/models.py:895 msgid "Text 3" msgstr "النص 3" -#: inventory/models.py:887 templates/inventory/car_detail.html:165 +#: inventory/models.py:896 templates/inventory/car_detail.html:165 msgid "Registration Date" msgstr "تاريخ التسجيل" -#: inventory/models.py:890 templates/inventory/car_detail.html:159 +#: inventory/models.py:899 templates/inventory/car_detail.html:159 #: templates/inventory/car_detail.html:170 #: templates/inventory/car_detail.html:478 msgid "Registration" msgstr "التسجيل" -#: inventory/models.py:891 +#: inventory/models.py:900 msgid "Registrations" msgstr "تسجيل السيارات" -#: inventory/models.py:899 inventory/models.py:1009 inventory/models.py:1203 -#: inventory/models.py:1324 inventory/models.py:1523 inventory/models.py:1723 -#: inventory/models.py:1749 inventory/models.py:1774 inventory/models.py:1796 -#: inventory/models.py:1819 inventory/models.py:1836 +#: inventory/models.py:908 inventory/models.py:1018 inventory/models.py:1212 +#: inventory/models.py:1333 inventory/models.py:1532 inventory/models.py:1732 +#: inventory/models.py:1758 inventory/models.py:1783 inventory/models.py:1805 +#: inventory/models.py:1828 inventory/models.py:1845 #: templates/crm/leads/lead_detail.html:181 #: templates/sales/estimates/estimate_list.html:18 #: templates/sales/invoices/invoice_list.html:19 @@ -1065,27 +1065,27 @@ msgstr "تسجيل السيارات" msgid "Created" msgstr "تاريخ الإنشاء" -#: inventory/models.py:900 inventory/models.py:1010 inventory/models.py:1204 -#: inventory/models.py:1325 inventory/models.py:1525 inventory/models.py:1724 -#: inventory/models.py:1750 inventory/models.py:1775 inventory/models.py:1797 -#: inventory/models.py:1820 +#: inventory/models.py:909 inventory/models.py:1019 inventory/models.py:1213 +#: inventory/models.py:1334 inventory/models.py:1534 inventory/models.py:1733 +#: inventory/models.py:1759 inventory/models.py:1784 inventory/models.py:1806 +#: inventory/models.py:1829 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/chart_of_accounts/includes/coa_card.html:41 msgid "Updated" msgstr "تم التحديث" -#: inventory/models.py:924 inventory/models.py:1321 inventory/models.py:1875 +#: inventory/models.py:933 inventory/models.py:1330 inventory/models.py:1884 msgid "Logo" msgstr "الشعار" -#: inventory/models.py:929 +#: inventory/models.py:938 msgid "Joined At" msgstr "انضم في" -#: inventory/models.py:982 +#: inventory/models.py:991 msgid "Dealers" msgstr "المعارض" -#: inventory/models.py:993 inventory/tasks.py:62 templates/header.html:17 +#: inventory/models.py:1002 inventory/tasks.py:62 templates/header.html:17 #: templates/header.html:22 templates/welcome.html:27 #: venv/lib/python3.11/site-packages/django_ledger/io/roles.py:440 #: venv/lib/python3.11/site-packages/django_ledger/io/roles.py:526 @@ -1094,20 +1094,20 @@ msgstr "المعارض" msgid "Inventory" msgstr "المخزن" -#: inventory/models.py:994 +#: inventory/models.py:1003 msgid "Accountant" msgstr "محاسب" -#: inventory/models.py:995 templates/header.html:110 +#: inventory/models.py:1004 templates/header.html:110 msgid "Sales" msgstr "المبيعات" -#: inventory/models.py:1007 +#: inventory/models.py:1016 msgid "Staff Type" msgstr "نوع الموظف" -#: inventory/models.py:1008 inventory/models.py:1199 inventory/models.py:1323 -#: inventory/models.py:1877 templates/admin_management/user_management.html:35 +#: inventory/models.py:1017 inventory/models.py:1208 inventory/models.py:1332 +#: inventory/models.py:1886 templates/admin_management/user_management.html:35 #: templates/admin_management/user_management.html:99 #: templates/admin_management/user_management.html:163 #: templates/admin_management/user_management.html:227 @@ -1124,7 +1124,7 @@ msgstr "نوع الموظف" msgid "Active" msgstr "نشط" -#: inventory/models.py:1073 inventory/models.py:1074 +#: inventory/models.py:1082 inventory/models.py:1083 #: templates/admin_management/user_management.html:206 #: templates/crm/opportunities/opportunity_detail.html:233 #: templates/dashboards/manager.html:16 templates/users/user_form.html:4 @@ -1132,68 +1132,68 @@ msgstr "نشط" msgid "Staff" msgstr "الموظفون" -#: inventory/models.py:1082 +#: inventory/models.py:1091 msgid "Referrals" msgstr "إحالات" -#: inventory/models.py:1083 inventory/models.py:1130 +#: inventory/models.py:1092 inventory/models.py:1139 msgid "WhatsApp" msgstr "واتساب" -#: inventory/models.py:1085 +#: inventory/models.py:1094 msgid "TikTok" msgstr "تيك توك" -#: inventory/models.py:1086 +#: inventory/models.py:1095 msgid "Instagram" msgstr "إنستغرام" -#: inventory/models.py:1087 +#: inventory/models.py:1096 msgid "X" msgstr "إكس" -#: inventory/models.py:1088 +#: inventory/models.py:1097 msgid "Facebook" msgstr "فيسبوك" -#: inventory/models.py:1089 +#: inventory/models.py:1098 msgid "Motory" msgstr "موتري" -#: inventory/models.py:1090 +#: inventory/models.py:1099 msgid "Influencers" msgstr "المؤثرون" -#: inventory/models.py:1091 +#: inventory/models.py:1100 msgid "Youtube" msgstr "يوتيوب" -#: inventory/models.py:1092 +#: inventory/models.py:1101 msgid "Campaign" msgstr "حملة" -#: inventory/models.py:1096 +#: inventory/models.py:1105 msgid "Walk In" msgstr "زيارة مباشرة" -#: inventory/models.py:1097 +#: inventory/models.py:1106 msgid "Toll Free" msgstr "رقم مجاني" -#: inventory/models.py:1098 +#: inventory/models.py:1107 #: venv/lib/python3.11/site-packages/django_ledger/models/mixins.py:113 msgid "Website" msgstr "الموقع الإلكتروني" -#: inventory/models.py:1100 +#: inventory/models.py:1109 msgid "Form" msgstr "نموذج" -#: inventory/models.py:1105 +#: inventory/models.py:1114 msgid "Follow-up" msgstr "متابعة" -#: inventory/models.py:1106 inventory/models.py:1132 inventory/models.py:1155 +#: inventory/models.py:1115 inventory/models.py:1141 inventory/models.py:1164 #: templates/crm/leads/lead_detail.html:58 #: templates/crm/leads/lead_detail.html:136 #: templates/crm/leads/lead_list.html:28 @@ -1201,206 +1201,210 @@ msgstr "متابعة" msgid "Negotiation" msgstr "مفاوضات" -#: inventory/models.py:1107 inventory/models.py:1134 +#: inventory/models.py:1116 inventory/models.py:1143 #: templates/crm/leads/lead_detail.html:59 #: templates/crm/leads/lead_detail.html:138 #: templates/crm/leads/lead_tracking.html:120 msgid "Won" msgstr "تم الفوز" +#: inventory/models.py:1117 inventory/models.py:1144 +#: templates/crm/leads/lead_detail.html:60 +#: templates/crm/leads/lead_detail.html:140 +#: templates/crm/leads/lead_tracking.html:136 msgid "Lost" msgstr "تم الفقد" -#: inventory/models.py:1109 inventory/models.py:1136 +#: inventory/models.py:1118 inventory/models.py:1145 #: templates/crm/leads/lead_detail.html:61 #: templates/crm/leads/lead_detail.html:142 #: templates/crm/leads/lead_list.html:29 msgid "Closed" msgstr "مغلقة" -#: inventory/models.py:1113 +#: inventory/models.py:1122 msgid "Mr" msgstr "السيد" -#: inventory/models.py:1114 +#: inventory/models.py:1123 msgid "Mrs" msgstr "السيدة" -#: inventory/models.py:1115 +#: inventory/models.py:1124 msgid "Ms" msgstr "الآنسة" -#: inventory/models.py:1116 +#: inventory/models.py:1125 msgid "Miss" msgstr "الآنسة" -#: inventory/models.py:1117 +#: inventory/models.py:1126 msgid "Dr" msgstr "الدكتور" -#: inventory/models.py:1118 +#: inventory/models.py:1127 msgid "Prof" msgstr "الأستاذ" -#: inventory/models.py:1119 +#: inventory/models.py:1128 msgid "Prince" msgstr "الأمير" -#: inventory/models.py:1120 +#: inventory/models.py:1129 msgid "Princess" msgstr "الأميرة" -#: inventory/models.py:1121 templates/pricing_page.html:120 +#: inventory/models.py:1130 templates/pricing_page.html:120 #: templates/pricing_page.html:123 templates/pricing_page.html:187 msgid "Company" msgstr "الشركة" -#: inventory/models.py:1122 +#: inventory/models.py:1131 msgid "N/A" msgstr "غير متوفر" -#: inventory/models.py:1126 inventory/models.py:1635 +#: inventory/models.py:1135 inventory/models.py:1644 #: templates/components/activity_modal.html:17 #: templates/crm/leads/lead_detail.html:70 #: templates/crm/leads/lead_list.html:37 msgid "Call" msgstr "مكالمة" -#: inventory/models.py:1127 +#: inventory/models.py:1136 msgid "SMS" msgstr "رسالة نصية" -#: inventory/models.py:1129 inventory/models.py:1636 +#: inventory/models.py:1138 inventory/models.py:1645 #: templates/components/activity_modal.html:19 #: templates/crm/leads/lead_detail.html:71 #: templates/crm/leads/lead_list.html:38 msgid "Meeting" msgstr "اجتماع" -#: inventory/models.py:1131 +#: inventory/models.py:1140 msgid "Visit" msgstr "زيارة" -#: inventory/models.py:1133 templates/crm/leads/lead_detail.html:57 +#: inventory/models.py:1142 templates/crm/leads/lead_detail.html:57 #: templates/crm/leads/lead_detail.html:134 #: templates/crm/leads/lead_list.html:26 templates/crm/leads/lead_list.html:41 msgid "Follow Up" msgstr "متابعة" -#: inventory/models.py:1137 +#: inventory/models.py:1146 msgid "Converted" msgstr "تم التحويل" -#: inventory/models.py:1139 templates/inventory/car_form.html:37 +#: inventory/models.py:1148 templates/inventory/car_form.html:37 #: templates/sales/estimates/estimate_form.html:20 msgid "Add Car" msgstr "إضافة سيارة" -#: inventory/models.py:1140 +#: inventory/models.py:1149 msgid "Sale Car" msgstr "بيع سيارة" -#: inventory/models.py:1141 templates/inventory/reserve_car.html:5 +#: inventory/models.py:1150 templates/inventory/reserve_car.html:5 #: templates/inventory/reserve_car.html:8 msgid "Reserve Car" msgstr "حجز السيارة" -#: inventory/models.py:1142 templates/inventory/transfer_car.html:4 +#: inventory/models.py:1151 templates/inventory/transfer_car.html:4 msgid "Transfer Car" msgstr "نقل السيارة" -#: inventory/models.py:1143 +#: inventory/models.py:1152 msgid "Remove Car" msgstr "إزالة السيارة" -#: inventory/models.py:1144 +#: inventory/models.py:1153 #: templates/crm/opportunities/opportunity_detail.html:18 #: templates/sales/estimates/estimate_form.html:5 #: templates/sales/estimates/estimate_form.html:32 msgid "Create Quotation" msgstr "إنشاء عرض" -#: inventory/models.py:1145 +#: inventory/models.py:1154 msgid "Cancel Quotation" msgstr "إلغاء العرض" -#: inventory/models.py:1146 +#: inventory/models.py:1155 msgid "Create Order" msgstr "إنشاء طلب" -#: inventory/models.py:1147 +#: inventory/models.py:1156 msgid "Cancel Order" msgstr "إلغاء الطلب" -#: inventory/models.py:1148 templates/sales/estimates/estimate_detail.html:108 +#: inventory/models.py:1157 templates/sales/estimates/estimate_detail.html:108 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/invoice/invoice_create.html:24 #: venv/lib/python3.11/site-packages/django_ledger/views/invoice.py:68 msgid "Create Invoice" msgstr "إنشاء فاتورة" -#: inventory/models.py:1149 +#: inventory/models.py:1158 msgid "Cancel Invoice" msgstr "إلغاء الفاتورة" -#: inventory/models.py:1153 +#: inventory/models.py:1162 msgid "Discovery" msgstr "الاكتشاف" -#: inventory/models.py:1154 +#: inventory/models.py:1163 msgid "Proposal" msgstr "عرض" -#: inventory/models.py:1156 +#: inventory/models.py:1165 msgid "Closed Won" msgstr "مغلقة - ناجحة" -#: inventory/models.py:1157 +#: inventory/models.py:1166 msgid "Closed Lost" msgstr "مغلقة - خسارة" -#: inventory/models.py:1161 +#: inventory/models.py:1170 msgid "Low" msgstr "منخفض" -#: inventory/models.py:1162 +#: inventory/models.py:1171 msgid "Medium" msgstr "متوسط" -#: inventory/models.py:1163 +#: inventory/models.py:1172 msgid "High" msgstr "مرتفع" -#: inventory/models.py:1176 inventory/models.py:1764 +#: inventory/models.py:1185 inventory/models.py:1773 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/estimate/includes/estimate_table.html:11 msgid "Title" msgstr "العنوان" -#: inventory/models.py:1184 +#: inventory/models.py:1193 msgid "Male" msgstr "ذكر" -#: inventory/models.py:1184 +#: inventory/models.py:1193 msgid "Female" msgstr "أنثى" -#: inventory/models.py:1186 +#: inventory/models.py:1195 msgid "Gender" msgstr "الجنس" -#: inventory/models.py:1188 +#: inventory/models.py:1197 msgid "Date of Birth" msgstr "تاريخ الميلاد" -#: inventory/models.py:1191 templates/customers/customer_list.html:46 +#: inventory/models.py:1200 templates/customers/customer_list.html:46 msgid "National ID" msgstr "رقم الهوية الوطنية" -#: inventory/models.py:1201 templates/administration/manage_service.html:76 +#: inventory/models.py:1210 templates/administration/manage_service.html:76 #: venv/lib/python3.11/site-packages/django/db/models/fields/files.py:420 msgid "Image" msgstr "الصورة" -#: inventory/models.py:1219 inventory/models.py:1447 +#: inventory/models.py:1228 inventory/models.py:1456 #: templates/sales/estimates/estimate_detail.html:154 #: templates/sales/estimates/estimate_list.html:15 #: templates/sales/estimates/sale_order_preview.html:167 @@ -1415,7 +1419,7 @@ msgstr "الصورة" msgid "Customer" msgstr "العميل" -#: inventory/models.py:1220 templates/admin_management/user_management.html:14 +#: inventory/models.py:1229 templates/admin_management/user_management.html:14 #: templates/customers/customer_form.html:4 #: templates/customers/customer_list.html:4 #: templates/customers/customer_list.html:5 @@ -1424,112 +1428,114 @@ msgstr "العميل" msgid "Customers" msgstr "العملاء" -#: inventory/models.py:1340 inventory/models.py:1447 +#: inventory/models.py:1349 inventory/models.py:1456 msgid "Organization" msgstr "شركة" -#: inventory/models.py:1341 templates/admin_management/user_management.html:78 +#: inventory/models.py:1350 templates/admin_management/user_management.html:78 #: templates/header.html:165 templates/organizations/organization_list.html:5 #: templates/organizations/organization_list.html:8 #: templates/organizations/organization_list.html:14 msgid "Organizations" msgstr "الشركات" -#: inventory/models.py:1423 +#: inventory/models.py:1432 #: templates/representatives/representative_detail.html:8 #: templates/representatives/representative_list.html:18 msgid "ID Number" msgstr "رقم الهوية" -#: inventory/models.py:1433 +#: inventory/models.py:1442 msgid "Representative" msgstr "ممثل شركة" -#: inventory/models.py:1434 +#: inventory/models.py:1443 #: templates/representatives/representative_list.html:3 #: templates/representatives/representative_list.html:6 msgid "Representatives" msgstr "ممثلي الشركات" -#: inventory/models.py:1447 +#: inventory/models.py:1456 msgid "Lead Type" msgstr "نوع العميل المتوقع" -#: inventory/models.py:1475 +#: inventory/models.py:1484 msgid "Source" msgstr "المصدر" -#: inventory/models.py:1478 +#: inventory/models.py:1487 msgid "Channel" msgstr "القناة" -#: inventory/models.py:1486 +#: inventory/models.py:1495 msgid "address" msgstr "العنوان" -#: inventory/models.py:1493 +#: inventory/models.py:1502 msgid "Assigned" msgstr "مُعين" -#: inventory/models.py:1499 +#: inventory/models.py:1508 msgid "Priority" msgstr "الأولوية" -#: inventory/models.py:1510 templates/crm/leads/lead_detail.html:66 +#: inventory/models.py:1519 templates/crm/leads/lead_detail.html:66 #: templates/crm/leads/lead_detail.html:218 #: templates/crm/leads/lead_list.html:34 msgid "Next Action" msgstr "الإجراء التالي" +#: inventory/models.py:1524 templates/crm/leads/lead_detail.html:77 +#: templates/crm/leads/lead_list.html:46 msgid "Next Action Date" msgstr "تاريخ الإجراء التالي" -#: inventory/models.py:1521 templates/crm/leads/lead_detail.html:175 +#: inventory/models.py:1530 templates/crm/leads/lead_detail.html:175 msgid "Salary" msgstr "الراتب" -#: inventory/models.py:1529 +#: inventory/models.py:1538 msgid "Lead" msgstr "فرصة" -#: inventory/models.py:1530 templates/crm/leads/lead_list.html:3 +#: inventory/models.py:1539 templates/crm/leads/lead_list.html:3 #: templates/crm/leads/lead_list.html:7 templates/crm/leads/lead_send.html:5 #: templates/crm/leads/lead_tracking.html:3 #: templates/dashboards/manager.html:21 test.txt:21 msgid "Leads" msgstr "الفرص" -#: inventory/models.py:1627 +#: inventory/models.py:1636 msgid "Product Demo" msgstr "عرض توضيحي للمنتج" -#: inventory/models.py:1628 +#: inventory/models.py:1637 msgid "Follow-Up Call" msgstr "مكالمة متابعة" -#: inventory/models.py:1629 +#: inventory/models.py:1638 msgid "Contract Discussion" msgstr "مناقشة العقد" -#: inventory/models.py:1630 +#: inventory/models.py:1639 msgid "Sales Meeting" msgstr "اجتماع مبيعات" -#: inventory/models.py:1631 +#: inventory/models.py:1640 msgid "Support Call" msgstr "مكالمة دعم" -#: inventory/models.py:1632 +#: inventory/models.py:1641 #: venv/lib/python3.11/site-packages/django_ledger/models/estimate.py:240 #: venv/lib/python3.11/site-packages/django_ledger/models/items.py:511 msgid "Other" msgstr "أخرى" -#: inventory/models.py:1640 +#: inventory/models.py:1649 msgid "Scheduled" msgstr "مجدول" -#: inventory/models.py:1641 inventory/models.py:1767 +#: inventory/models.py:1650 inventory/models.py:1776 #: templates/sales/estimates/estimate_detail.html:88 #: templates/sales/estimates/estimate_detail.html:175 #: templates/sales/estimates/estimate_list.html:39 @@ -1537,7 +1543,7 @@ msgstr "مجدول" msgid "Completed" msgstr "مكتمل" -#: inventory/models.py:1642 templates/crm/leads/lead_list.html:175 +#: inventory/models.py:1651 templates/crm/leads/lead_list.html:175 #: templates/sales/estimates/estimate_detail.html:90 #: templates/sales/estimates/estimate_detail.html:177 #: templates/sales/estimates/estimate_list.html:37 @@ -1550,37 +1556,37 @@ msgstr "مكتمل" msgid "Canceled" msgstr "ملغى" -#: inventory/models.py:1674 +#: inventory/models.py:1683 msgid "Old Status" msgstr "الحالة القديمة" -#: inventory/models.py:1677 +#: inventory/models.py:1686 msgid "New Status" msgstr "الحالة الجديدة" -#: inventory/models.py:1682 +#: inventory/models.py:1691 msgid "Changed At" msgstr "تم التغيير في" -#: inventory/models.py:1685 +#: inventory/models.py:1694 msgid "Lead Status History" msgstr "تاريخ حالة العميل المحتمل" -#: inventory/models.py:1686 +#: inventory/models.py:1695 msgid "Lead Status Histories" msgstr "تواريخ حالات العملاء المحتملين" -#: inventory/models.py:1694 +#: inventory/models.py:1703 msgid "Probability must be between 0 and 100." msgstr "يجب أن تكون الاحتمالية بين 0 و 100." -#: inventory/models.py:1720 +#: inventory/models.py:1729 #: ⁨templates/crm/opportunities/opportunity_list copy.html⁩:78 #: templates/crm/opportunities/partials/opportunity_grid.html:60 msgid "Expected Revenue" msgstr "الإيرادات المتوقعة" -#: inventory/models.py:1722 +#: inventory/models.py:1731 #: templates/crm/opportunities/opportunity_detail.html:266 #: ⁨templates/crm/opportunities/opportunity_list copy.html⁩:100 #: templates/crm/opportunities/partials/opportunity_grid.html:72 @@ -1588,22 +1594,22 @@ msgstr "الإيرادات المتوقعة" msgid "Closing Date" msgstr "تاريخ الإغلاق" -#: inventory/models.py:1727 +#: inventory/models.py:1736 msgid "Unique slug for the opportunity." msgstr "المُعرّف الفريد للفرصة (slug)." -#: inventory/models.py:1733 templates/crm/leads/lead_list.html:128 +#: inventory/models.py:1742 templates/crm/leads/lead_list.html:128 #: templates/header.html:148 msgid "Opportunity" msgstr "فرصة" -#: inventory/models.py:1734 +#: inventory/models.py:1743 #: ⁨templates/crm/opportunities/opportunity_list copy.html⁩:8 #: templates/crm/opportunities/opportunity_list.html:8 msgid "Opportunities" msgstr "الفرص" -#: inventory/models.py:1745 inventory/models.py:1753 +#: inventory/models.py:1754 inventory/models.py:1762 #: templates/account/snippets/already_logged_in.html:8 #: templates/crm/leads/lead_detail.html:314 #: templates/crm/leads/lead_detail.html:592 @@ -1611,7 +1617,7 @@ msgstr "الفرص" msgid "Note" msgstr "ملاحظة" -#: inventory/models.py:1754 inventory/models.py:1815 +#: inventory/models.py:1763 inventory/models.py:1824 #: templates/crm/leads/lead_detail.html:82 #: templates/crm/leads/lead_detail.html:222 #: templates/crm/leads/lead_detail.html:305 @@ -1623,7 +1629,7 @@ msgstr "ملاحظة" msgid "Notes" msgstr "ملاحظات" -#: inventory/models.py:1766 +#: inventory/models.py:1775 #: templates/ledger/journal_entry/includes/card_invoice.html:52 #: templates/ledger/journal_entry/includes/card_invoice.html:63 #: templates/ledger/journal_entry/includes/card_invoice.html:77 @@ -1638,39 +1644,41 @@ msgstr "ملاحظات" msgid "Due Date" msgstr "تاريخ الاستحقاق" -#: inventory/models.py:1778 templates/crm/leads/lead_detail.html:572 +#: inventory/models.py:1787 templates/crm/leads/lead_detail.html:572 msgid "Task" msgstr "مهمة" +#: inventory/models.py:1788 templates/crm/leads/lead_detail.html:224 +#: templates/crm/leads/lead_detail.html:485 msgid "Tasks" msgstr "مهام" -#: inventory/models.py:1788 +#: inventory/models.py:1797 msgid "From Email" msgstr "من البريد الإلكتروني" -#: inventory/models.py:1789 +#: inventory/models.py:1798 msgid "To Email" msgstr "إلى البريد الإلكتروني" -#: inventory/models.py:1790 +#: inventory/models.py:1799 msgid "Subject" msgstr "الموضوع" -#: inventory/models.py:1791 inventory/models.py:1834 +#: inventory/models.py:1800 inventory/models.py:1843 msgid "Message" msgstr "رسالة" -#: inventory/models.py:1801 templates/crm/leads/lead_detail.html:223 +#: inventory/models.py:1810 templates/crm/leads/lead_detail.html:223 #: templates/crm/leads/lead_detail.html:362 msgid "Emails" msgstr "رسائل البريد الإلكتروني" -#: inventory/models.py:1813 +#: inventory/models.py:1822 msgid "Activity Type" msgstr "نوع النشاط" -#: inventory/models.py:1823 templates/components/activity_modal.html:7 +#: inventory/models.py:1832 templates/components/activity_modal.html:7 #: templates/crm/leads/lead_detail.html:221 #: templates/dealers/activity_log.html:11 #: templates/ledger/journal_entry/includes/card_journal_entry.html:32 @@ -1683,122 +1691,122 @@ msgstr "نوع النشاط" msgid "Activity" msgstr "النشاط" -#: inventory/models.py:1824 templates/crm/leads/lead_detail.html:257 +#: inventory/models.py:1833 templates/crm/leads/lead_detail.html:257 #: templates/header.html:434 msgid "Activities" msgstr "الأنشطة" -#: inventory/models.py:1835 +#: inventory/models.py:1844 msgid "Is Read" msgstr "تمت قراءته" -#: inventory/models.py:1839 +#: inventory/models.py:1848 msgid "Notification" msgstr "إشعار" -#: inventory/models.py:1840 templates/crm/notifications_history.html:6 +#: inventory/models.py:1849 templates/crm/notifications_history.html:6 #: templates/notifications-copy.html:13 templates/notifications.html:23 msgid "Notifications" msgstr "الإشعارات" -#: inventory/models.py:1864 +#: inventory/models.py:1873 msgid "Vendor Model" msgstr "نموذج المورد" -#: inventory/models.py:1893 templates/admin_management/user_management.html:142 +#: inventory/models.py:1902 templates/admin_management/user_management.html:142 #: templates/vendors/vendor_form.html:4 templates/vendors/vendors_list.html:5 #: templates/vendors/vendors_list.html:7 templates/vendors/vendors_list.html:12 msgid "Vendors" msgstr "الموردين" -#: inventory/models.py:1965 inventory/models.py:1989 +#: inventory/models.py:1974 inventory/models.py:1998 msgid "amount" msgstr "المبلغ" -#: inventory/models.py:1968 +#: inventory/models.py:1977 msgid "method" msgstr "طريقة" -#: inventory/models.py:1971 +#: inventory/models.py:1980 msgid "reference number" msgstr "رقم المرجع" -#: inventory/models.py:1973 +#: inventory/models.py:1982 msgid "date" msgstr "التاريخ" -#: inventory/models.py:1977 +#: inventory/models.py:1986 msgid "payment" msgstr "الدفعة" -#: inventory/models.py:1978 templates/header.html:102 +#: inventory/models.py:1987 templates/header.html:102 msgid "payments" msgstr "المدفوعات" -#: inventory/models.py:1991 +#: inventory/models.py:2000 msgid "reason" msgstr "السبب" -#: inventory/models.py:1992 +#: inventory/models.py:2001 msgid "refund date" msgstr "تاريخ الاسترداد" -#: inventory/models.py:1995 +#: inventory/models.py:2004 msgid "refund" msgstr "استرداد" -#: inventory/models.py:1996 +#: inventory/models.py:2005 msgid "refunds" msgstr "استردادات" -#: inventory/models.py:2008 +#: inventory/models.py:2017 msgid "User Activity Log" msgstr "سجل نشاط المستخدم" -#: inventory/models.py:2009 +#: inventory/models.py:2018 msgid "User Activity Logs" msgstr "سجلات نشاط المستخدم" -#: inventory/models.py:2020 +#: inventory/models.py:2029 #: venv/lib/python3.11/site-packages/django_ledger/models/entity.py:3173 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/estimate/includes/card_estimate.html:9 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/estimate/includes/estimate_table.html:9 msgid "Estimate" msgstr "تقدير" -#: inventory/models.py:2031 inventory/tasks.py:38 +#: inventory/models.py:2040 inventory/tasks.py:38 #: templates/ledger/reports/dashboard.html:32 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/includes/widget_bs.html:14 msgid "Cash" msgstr "نقداً" -#: inventory/models.py:2032 +#: inventory/models.py:2041 msgid "Finance" msgstr "تمويل" -#: inventory/models.py:2033 +#: inventory/models.py:2042 msgid "Lease" msgstr "تأجير" -#: inventory/models.py:2034 +#: inventory/models.py:2043 #: venv/lib/python3.11/site-packages/django_ledger/models/mixins.py:1139 msgid "Credit Card" msgstr "بطاقة ائتمان" -#: inventory/models.py:2035 +#: inventory/models.py:2044 msgid "Bank Transfer" msgstr "تحويل بنكي" -#: inventory/models.py:2079 templates/groups/group_form.html:4 +#: inventory/models.py:2088 templates/groups/group_form.html:4 #: templates/groups/group_list.html:5 templates/users/user_group_form.html:4 msgid "Group" msgstr "مجموعة" -#: inventory/models.py:2246 +#: inventory/models.py:2255 msgid "Payment History" msgstr "سجل الدفع" -#: inventory/models.py:2247 +#: inventory/models.py:2256 msgid "Payment Histories" msgstr "سجلات الدفع" @@ -2195,21 +2203,29 @@ msgstr "تم تحديث المعرض بنجاح." msgid "customers" msgstr "العملاء" +#: inventory/views.py:2052 msgid "Customer Account with this email is Deactivated,Please Contact Admin" -msgstr "تم تعطيل حساب العميل المرتبط بهذا البريد الإلكتروني، يرجى التواصل مع المسؤول" +msgstr "" +"تم تعطيل حساب العميل المرتبط بهذا البريد الإلكتروني، يرجى التواصل مع المسؤول" +#: inventory/views.py:2057 msgid "Customer with this email already exists" msgstr "يوجد عميل مسجل مسبقًا بهذا البريد الإلكتروني" +#: inventory/views.py:2127 msgid "Customer deactivated successfully" msgstr "تم تعطيل حساب العميل بنجاح" +#: inventory/views.py:2222 msgid "Vendor created successfully" msgstr "تم إنشاء المورد بنجاح" +#: inventory/views.py:2230 msgid "Vendor Account with this email is Deactivated,Please Contact Admin" -msgstr "تم تعطيل حساب المورد المرتبط بهذا البريد الإلكتروني، يرجى التواصل مع المسؤول" +msgstr "" +"تم تعطيل حساب المورد المرتبط بهذا البريد الإلكتروني، يرجى التواصل مع المسؤول" +#: inventory/views.py:2234 msgid "Vendor with this email already exists" msgstr "يوجد مورد مسجل مسبقًا بهذا البريد الإلكتروني" @@ -2255,9 +2271,12 @@ msgid "User deleted successfully" msgstr "تم حذف المستخدم بنجاح." #: inventory/views.py:2856 -msgid "Organization Account with this email is Deactivated,Please Contact Admin" -msgstr "تم تعطيل حساب المؤسسة المرتبط بهذا البريد الإلكتروني، يرجى التواصل مع المسؤول" +msgid "" +"Organization Account with this email is Deactivated,Please Contact Admin" +msgstr "" +"تم تعطيل حساب المؤسسة المرتبط بهذا البريد الإلكتروني، يرجى التواصل مع المسؤول" +#: inventory/views.py:2861 msgid "Organization with this email already exists" msgstr "يوجد مؤسسة مسجلة مسبقًا بهذا البريد الإلكتروني" @@ -2301,12 +2320,12 @@ msgstr "تم تحديث المجموعة بنجاح." msgid "Account deleted successfully" msgstr "تم حذف الملاحظة بنجاح." -#: inventory/views.py:3601 inventory/views.py:6148 +#: inventory/views.py:3601 inventory/views.py:6168 msgid "Items and Quantities are required" msgstr "المنتجات والكميات مطلوبة" -#: inventory/views.py:3610 inventory/views.py:3618 inventory/views.py:6156 -#: inventory/views.py:6164 +#: inventory/views.py:3610 inventory/views.py:3618 inventory/views.py:6176 +#: inventory/views.py:6184 msgid "Quantity must be greater than zero" msgstr "يجب أن تكون مدة الفاصل الزمني أكبر من 0." @@ -2314,220 +2333,229 @@ msgstr "يجب أن تكون مدة الفاصل الزمني أكبر من 0." msgid "Quantity must be less than or equal to the number of cars in stock" msgstr "يجب أن تكون الكمية أقل من أو تساوي عدد السيارات المتوفرة في المخزون" -#: inventory/views.py:3740 +#: inventory/views.py:3760 msgid "Quotation created successfully" msgstr "تم إنشاء عرض السعر بنجاح" -#: inventory/views.py:4017 +#: inventory/views.py:4037 msgid "Quotation is not ready for review" msgstr "العرض غير جاهز للمراجعة." -#: inventory/views.py:4023 +#: inventory/views.py:4043 msgid "Quotation is not ready for approval" msgstr "العرض غير جاهز للموافقة." -#: inventory/views.py:4026 +#: inventory/views.py:4046 msgid "Quotation approved successfully" msgstr "تمت الموافقة على العرض بنجاح." -#: inventory/views.py:4029 +#: inventory/views.py:4049 msgid "Quotation is not ready for rejection" msgstr "العرض غير جاهز للرفض." -#: inventory/views.py:4032 inventory/views.py:4050 +#: inventory/views.py:4052 inventory/views.py:4070 msgid "Quotation canceled successfully" msgstr "تم إلغاء الحجز بنجاح." -#: inventory/views.py:4035 +#: inventory/views.py:4055 msgid "Quotation is not ready for completion" msgstr "العرض غير جاهز للإكمال." -#: inventory/views.py:4039 +#: inventory/views.py:4059 msgid "Quotation is not ready for cancellation" msgstr "العرض غير جاهز للإلغاء." -#: inventory/views.py:4052 +#: inventory/views.py:4072 msgid "Quotation marked as " msgstr "تم وضع علامة على عرض السعر كـ" -#: inventory/views.py:4472 +#: inventory/views.py:4492 msgid "fully paid" msgstr "مدفوع بالكامل" -#: inventory/views.py:4475 +#: inventory/views.py:4495 msgid "Amount exceeds due amount" msgstr "المبلغ يتجاوز المبلغ المستحق" -#: inventory/views.py:4483 inventory/views.py:4601 +#: inventory/views.py:4503 inventory/views.py:4621 msgid "Payment created successfully" msgstr "تم إنشاء الدفعة بنجاح" -#: inventory/views.py:4605 +#: inventory/views.py:4625 msgid "Invoice is not fully paid, Payment cannot be marked as paid" msgstr "لم يتم دفع الفاتورة بالكامل، لا يمكن وضع علامة مدفوعة على الدفعة" -#: inventory/views.py:4810 +#: inventory/views.py:4830 msgid "Lead created successfully" msgstr "تم إنشاء العميل المتوقع بنجاح" -#: inventory/views.py:4965 +#: inventory/views.py:4985 msgid "Lead deleted successfully" msgstr "تم حذف العميل المتوقع بنجاح" -#: inventory/views.py:4994 inventory/views.py:5025 inventory/views.py:8056 +#: inventory/views.py:5014 inventory/views.py:5045 inventory/views.py:8076 msgid "Note added successfully" msgstr "تمت إضافة الملاحظة بنجاح" -#: inventory/views.py:5020 +#: inventory/views.py:5040 msgid "Notes field is required" msgstr "حقل الملاحظات مطلوب" -#: inventory/views.py:5048 +#: inventory/views.py:5068 msgid "Note deleted successfully." msgstr "تم حذف الملاحظة بنجاح." -#: inventory/views.py:5074 +#: inventory/views.py:5094 msgid "Lead is already converted to customer" msgstr "تم تحويل العميل المتوقع بالفعل إلى عميل" -#: inventory/views.py:5085 +#: inventory/views.py:5105 msgid "Lead converted to customer successfully" msgstr "تم تحويل العميل المتوقع إلى عميل بنجاح" -#: inventory/views.py:5111 +#: inventory/views.py:5131 msgid "You do not have permission to schedule lead" msgstr "ليست لديك صلاحية جدولة هذا العميل المتوقع" -#: inventory/views.py:5155 +#: inventory/views.py:5175 msgid "Lead scheduled and appointment created successfully" msgstr "تمت جدولة العميل المتوقع وإنشاء الموعد بنجاح" -#: inventory/views.py:5186 +#: inventory/views.py:5206 msgid "Lead transferred successfully" msgstr "تم نقل العميل المتوقع بنجاح" -#: inventory/views.py:5233 +#: inventory/views.py:5253 msgid "Email Draft successfully" msgstr "تم إنشاء مسودة البريد الإلكتروني بنجاح" -#: inventory/views.py:5268 inventory/views.py:6368 +#: inventory/views.py:5288 inventory/views.py:6388 msgid "Email sent successfully" msgstr "تم إرسال البريد الإلكتروني بنجاح!" -#: inventory/views.py:5517 +#: inventory/views.py:5537 msgid "Opportunity deleted successfully" msgstr "تم حذف الفرصة بنجاح." -#: inventory/views.py:5555 +#: inventory/views.py:5575 msgid "Opportunity status updated successfully" msgstr "تم تحديث حالة الفرصة بنجاح" -#: inventory/views.py:5671 +#: inventory/views.py:5691 msgid "Service created successfully" msgstr "تم إنشاء الخدمة بنجاح" -#: inventory/views.py:5716 +#: inventory/views.py:5736 msgid "Service updated successfully" msgstr "تم تحديث الخدمة بنجاح" -#: inventory/views.py:5979 inventory/views.py:6032 +#: inventory/views.py:5999 inventory/views.py:6052 msgid "Bill updated successfully" msgstr "تم تحديث الفاتورة بنجاح." -#: inventory/views.py:6073 +#: inventory/views.py:6093 msgid "Bill is already approved" msgstr "تمت الموافقة على الفاتورة مسبقًا." -#: inventory/views.py:6077 +#: inventory/views.py:6097 msgid "Bill marked as approved successfully" msgstr "تم تحديد الفاتورة كموافقة بنجاح." -#: inventory/views.py:6104 +#: inventory/views.py:6124 msgid "Bill is already paid" msgstr "تم دفع الفاتورة مسبقًا." -#: inventory/views.py:6113 +#: inventory/views.py:6133 msgid "Bill marked as paid successfully" msgstr "تم تحديد الفاتورة كمدفوعة بنجاح." -#: inventory/views.py:6115 +#: inventory/views.py:6135 msgid "Amount paid is not equal to amount due" msgstr "المبلغ المدفوع لا يساوي المبلغ المستحق." -#: inventory/views.py:6226 +#: inventory/views.py:6246 msgid "Bill created successfully" msgstr "تم تحديث الفاتورة بنجاح." -#: inventory/views.py:6329 +#: inventory/views.py:6349 msgid "Quotation has no items" msgstr "عرض السعر لا يحتوي على أي عناصر" -#: inventory/views.py:6885 +#: inventory/views.py:6905 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/unit/unit_detail.html:23 #: venv/lib/python3.11/site-packages/django_ledger/views/entity.py:210 msgid "Dashboard" msgstr "لوحة القيادة" -#: inventory/views.py:7040 inventory/views.py:7073 inventory/views.py:7132 +#: inventory/views.py:7060 inventory/views.py:7093 inventory/views.py:7152 msgid "Unauthorized" msgstr "غير مصرح" -#: inventory/views.py:7258 +#: inventory/views.py:7278 msgid "Settings updated" msgstr "تم تحديث الإعدادات" -#: inventory/views.py:7598 +#: inventory/views.py:7618 msgid "Journal Entry created" msgstr "تم إنشاء قيد اليومية" -#: inventory/views.py:7639 +#: inventory/views.py:7659 msgid "Journal Entry cannot be deleted" msgstr "لا يمكن حذف قيد اليومية" -#: inventory/views.py:7713 +#: inventory/views.py:7733 msgid "Ledger is already locked" msgstr "دفتر الأستاذ مقفل بالفعل" -#: inventory/views.py:7740 +#: inventory/views.py:7760 msgid "Ledger is already Unlocked" msgstr "دفتر الأستاذ غير مقفل بالفعل" -#: inventory/views.py:7769 +#: inventory/views.py:7789 msgid "Ledger is already posted" msgstr "دفتر الأستاذ تم ترحيله بالفعل" -#: inventory/views.py:7799 +#: inventory/views.py:7819 msgid "Ledger is already Unposted" msgstr "دفتر الأستاذ لم يتم ترحيله بعد" -#: inventory/views.py:7991 +#: inventory/views.py:8011 msgid "Activity added successfully" msgstr "تمت إضافة النشاط بنجاح" +#: inventory/views.py:8013 msgid "Activity form is not valid" msgstr "نموذج النشاط غير صالح" +#: inventory/views.py:8035 msgid "Task added successfully" msgstr "تمت إضافة المهمة بنجاح" +#: inventory/views.py:8038 inventory/views.py:8051 msgid "Task form is not valid" msgstr "نموذج المهمة غير صالح" +#: inventory/views.py:8049 msgid "Task updated successfully" msgstr "تم تحديث المهمة بنجاح" +#: inventory/views.py:8079 inventory/views.py:8093 msgid "Note form is not valid" msgstr "نموذج الملاحظة غير صالح" +#: inventory/views.py:8090 msgid "Note updated successfully" msgstr "تم تحديث الملاحظة بنجاح" +#: inventory/views.py:8126 msgid "Account activated successfully" msgstr "تم تفعيل الحساب بنجاح" +#: inventory/views.py:8143 msgid "Account Deleted successfully" msgstr "تم حذف الحساب بنجاح" +#: inventory/views.py:8147 msgid "You cannot delete this account,it is related to another account" msgstr "لا يمكنك حذف هذا الحساب، لأنه مرتبط بحساب آخر" @@ -2658,7 +2686,7 @@ msgstr "تسجيل الدخول" #: templates/account/verification_sent.html:14 #: templates/account/verified_email_required.html:13 #: templates/account/verified_email_required.html:14 -#: templates/haikalbot/chatbot.html:58 templates/haikalbot/chatbot.html:59 +#: templates/haikalbot/chatbot.html:62 templates/haikalbot/chatbot.html:63 #: templates/otp/verify_otp.html:11 templates/otp/verify_otp.html:12 msgid "home" msgstr "الرئيسية" @@ -3306,16 +3334,28 @@ msgstr "" "خلال بضع دقائق." #: templates/account/verified_email_required.html:23 +#, fuzzy +#| msgid "" +#| "This part of the site requires us to verify that\n" +#| "you are who you claim to be. For this purpose, we require that you\n" +#| "verify ownership of your email address. " msgid "" "This part of the site requires us to verify that\n" " you are who you claim to be. For this purpose, we " "require that you\n" " verify ownership of your email address. " msgstr "" -"يتطلب هذا الجزء من الموقع التحقق من أنك الشخص الذي تدّعي أنك هو. ولهذا الغرض، نطلب منك التحقق من ملكيتك لعنوان بريدك الإلكتروني." - +"يتطلب هذا الجزء من الموقع التحقق من أنك الشخص الذي تدّعي أنه أنت. لهذا السبب، " +"نطلب منك تأكيد ملكية عنوان بريدك الإلكتروني." #: templates/account/verified_email_required.html:28 +#, fuzzy +#| msgid "" +#| "We have sent an email to you for\n" +#| "verification. Please click on the link inside that email. If you do not " +#| "see the verification email in your main inbox, check your spam folder. " +#| "Otherwise\n" +#| "contact us if you do not receive it within a few minutes." msgid "" "We have sent an email to you for\n" " verification. Please click on the link inside that " @@ -3324,8 +3364,10 @@ msgid "" " contact us if you do not receive it within a few " "minutes." msgstr "" -"لقد أرسلنا إليك رسالة بريد إلكتروني للتحقق. يرجى النقر على الرابط الموجود داخل الرسالة. إذا لم تجد رسالة التحقق في صندوق الوارد الرئيسي، يرجى التحقق من مجلد الرسائل غير المرغوب فيها. وإذا لم تستلمها خلال بضع دقائق، يرجى التواصل معنا." - +"لقد أرسلنا لك بريدًا إلكترونيًا للتحقق. يرجى النقر على الرابط الموجود داخل " +"البريد الإلكتروني. إذا لم تجد البريد الإلكتروني للتحقق في صندوق الوارد " +"الرئيسي، تحقق من مجلد البريد العشوائي. بخلاف ذلك، اتصل بنا إذا لم تستلمه " +"خلال بضع دقائق." #: templates/account/verified_email_required.html:33 #, python-format @@ -3395,12 +3437,26 @@ msgstr "الإجراءات" msgid "Inactive" msgstr "غير نشط" +#: templates/admin_management/user_management.html:54 +#: templates/admin_management/user_management.html:118 +#: templates/admin_management/user_management.html:182 +#: templates/admin_management/user_management.html:246 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/account/tags/accounts_table.html:101 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/bank_account/tags/bank_accounts_table.html:52 msgid "Activate" msgstr "تفعيل" +#: templates/admin_management/user_management.html:56 +#: templates/admin_management/user_management.html:120 +#: templates/admin_management/user_management.html:184 +#: templates/admin_management/user_management.html:248 msgid "Permenantly Delete" msgstr "حذف نهائي" +#: templates/admin_management/user_management.html:62 +#: templates/admin_management/user_management.html:126 +#: templates/admin_management/user_management.html:190 +#: templates/admin_management/user_management.html:254 msgid "No data available in table" msgstr "لا توجد بيانات في الجدول" @@ -4365,21 +4421,47 @@ msgstr "اختر التاريخ" msgid "Update Lead Actions" msgstr "تحديث إجراءات العميل المحتمل" +#: templates/crm/leads/lead_detail.html:54 +#: templates/crm/leads/lead_list.html:22 msgid "Current Action" msgstr "الإجراء الحالي" +#: templates/crm/leads/lead_detail.html:56 +#: templates/crm/leads/lead_list.html:24 msgid "Select Action" msgstr "اختر إجراء" +#: templates/crm/leads/lead_detail.html:68 +#: templates/crm/leads/lead_list.html:36 msgid "Select Next Action" msgstr "اختر الإجراء التالي" +#: templates/crm/leads/lead_detail.html:69 msgid "No Action" msgstr "لا يوجد إجراء" +#: templates/crm/leads/lead_detail.html:87 +#: templates/crm/leads/lead_list.html:56 templates/inventory/car_form.html:239 +#: templates/inventory/car_form.html:258 templates/inventory/car_form.html:276 +#: templates/inventory/car_form.html:293 +#: ⁨templates/inventory/car_form_qabl alfalsafa.html⁩:229 +#: ⁨templates/inventory/car_form_qabl alfalsafa.html⁩:235 +#: ⁨templates/inventory/car_form_qabl alfalsafa.html⁩:252 +#: ⁨templates/inventory/car_form_qabl alfalsafa.html⁩:270 +#: ⁨templates/inventory/car_form_qabl alfalsafa.html⁩:287 +#: templates/modal/confirm_modal.html:11 templates/modal/confirm_modal.html:20 +#: templates/modal/error_modal.html:17 +#: templates/modal/event_details_modal.html:21 +#: templates/partials/scanner_modal.html:6 +#: templates/partials/specifications_modal.html:8 +#: venv/lib/python3.11/site-packages/appointment/templates/modal/confirm_modal.html:18 +#: venv/lib/python3.11/site-packages/appointment/templates/modal/error_modal.html:17 +#: venv/lib/python3.11/site-packages/appointment/templates/modal/event_details_modal.html:19 msgid "Close" msgstr "إغلاق" +#: templates/crm/leads/lead_detail.html:88 +#: templates/crm/leads/lead_list.html:57 msgid "Save Changes" msgstr "حفظ التغييرات" @@ -4415,15 +4497,21 @@ msgstr "قناة العميل المحتمل" msgid "City" msgstr "المدينة" +#: templates/crm/leads/lead_detail.html:217 msgid "Current Stage" msgstr "المرحلة الحالية" +#: templates/crm/leads/lead_detail.html:230 +#: templates/crm/leads/lead_list.html:270 msgid "Update Actions" msgstr "تحديث الإجراءات" +#: templates/crm/leads/lead_detail.html:258 +#: templates/crm/opportunities/opportunity_detail.html:303 msgid "Add Activity" msgstr "إضافة نشاط" +#: templates/crm/leads/lead_detail.html:293 msgid "created by" msgstr "تم الإنشاء بواسطة" @@ -4526,6 +4614,7 @@ msgstr "تم الاتصال" msgid "Proposal Sent" msgstr "تم إرسال العرض" +#: templates/crm/leads/lead_list.html:40 msgid "Send Proposal" msgstr "إرسال العرض" @@ -4606,15 +4695,19 @@ msgstr "تحديث" msgid "Schedule Event" msgstr "جدولة الحدث" +#: templates/crm/leads/lead_list.html:275 msgid "Convert to Opportunity" msgstr "تحويل إلى فرصة" +#: templates/crm/leads/lead_tracking.html:65 msgid "Lead Tracking" msgstr "تتبع العملاء المحتملين" +#: templates/crm/leads/lead_tracking.html:72 templates/dashboards/sales.html:91 msgid "New Leads" msgstr "عملاء محتملون جدد" +#: templates/crm/leads/lead_tracking.html:88 msgid "Follow Ups" msgstr "متابعات" @@ -4657,24 +4750,31 @@ msgstr "تاريخ الإنشاء" msgid "Edit Opportunity" msgstr "تعديل الفرصة" +#: templates/crm/opportunities/opportunity_form.html:12 msgid "Create New Opportunity" msgstr "إنشاء فرصة جديدة" +#: templates/crm/opportunities/opportunity_form.html:18 msgid "Back to list" msgstr "العودة إلى القائمة" +#: templates/crm/opportunities/opportunity_form.html:138 msgid "Reset" msgstr "إعادة تعيين" +#: templates/crm/opportunities/opportunity_form.html:155 msgid "Opportunity Guidelines" msgstr "إرشادات الفرص" +#: templates/crm/opportunities/opportunity_form.html:160 msgid "Probability indicates conversion chance" msgstr "تشير النسبة المئوية إلى فرصة التحويل" +#: templates/crm/opportunities/opportunity_form.html:166 msgid "Update stage as deal progresses" msgstr "تحديث المرحلة مع تقدم الصفقة" +#: templates/crm/opportunities/opportunity_form.html:172 msgid "Set realistic closing dates" msgstr "تحديد تواريخ إغلاق واقعية" @@ -4744,18 +4844,23 @@ msgstr "لا" msgid "Search opportunities..." msgstr "ابحث في الفرص..." +#: templates/crm/opportunities/opportunity_list.html:46 msgid "All Stages" msgstr "جميع المراحل" +#: templates/crm/opportunities/opportunity_list.html:68 msgid "Newest First" msgstr "الأحدث أولاً" +#: templates/crm/opportunities/opportunity_list.html:71 msgid "Highest Value" msgstr "أعلى قيمة" +#: templates/crm/opportunities/opportunity_list.html:74 msgid "Earliest Close Date" msgstr "أقرب تاريخ إغلاق" +#: templates/crm/opportunities/partials/opportunity_grid.html:100 msgid "View Details" msgstr "عرض التفاصيل" @@ -5191,7 +5296,17 @@ msgstr "شكرًا لاختيارك لنا." msgid "Account Activation" msgstr "تفعيل الحساب" -#: templates/email_sender/thank_you_email.html:185 " +#: templates/email_sender/thank_you_email.html:185 +#, fuzzy, python-format +#| msgid "" +#| "\n" +#| " To activate your account and set " +#| "your password, please use the following secure\n" +#| " link: Set Your Password. Please\n" +#| " note that this link will expire " +#| "in 2 days for your security.\n" +#| " " msgid "" "\n" " To activate your account and " @@ -5203,11 +5318,12 @@ msgid "" " " msgstr "" "\n" -" لتفعيل حسابك وتعيين كلمة المرور، يرجى استخدام الرابط الآمن التالي:\n" -" تعيين كلمة المرور.\n" -" يرجى ملاحظة أن هذا الرابط سينتهي خلال يومين لأغراض الأمان.\n" -" " - +" لتفعيل حسابك وتعيين كلمة المرور، " +"يرجى استخدام الرابط الآمن التالي: تعيين كلمة المرور. يرجى\n" +" ملاحظة أن هذا الرابط سينتهي صلاحيته " +"خلال يومين لضمان الأمان.\n" +" " #: templates/email_sender/thank_you_email.html:198 #: venv/lib/python3.11/site-packages/appointment/templates/email_sender/thank_you_email.html:198 @@ -5404,18 +5520,23 @@ msgstr "إضافة إذن" msgid "Haikalbot" msgstr "هيكل بوت" +#: templates/haikalbot/chatbot.html:78 msgid "How many cars are in inventory" msgstr "كم عدد السيارات في المخزون" +#: templates/haikalbot/chatbot.html:79 msgid "Show me sales analysis" msgstr "اعرض لي تحليل المبيعات" +#: templates/haikalbot/chatbot.html:80 msgid "What are the best-selling cars" msgstr "ما هي السيارات الأكثر مبيعًا" +#: templates/haikalbot/chatbot.html:85 msgid "Type your message here" msgstr "اكتب رسالتك هنا" +#: templates/haikalbot/chatbot.html:346 msgid "Copy" msgstr "نسخ" @@ -5767,6 +5888,11 @@ msgstr "التفاصيل المالية لـ" msgid "Please Add A Vendor, Before Adding A Car ." msgstr "يرجى إضافة مورد قبل إضافة السيارة." +#: templates/inventory/car_form.html:23 templates/vendors/vendor_form.html:20 +#: templates/vendors/vendors_list.html:15 +msgid "Add Vendor" +msgstr "إضافة مورد" + #: templates/inventory/car_form.html:80 templates/inventory/car_form.html:99 #: templates/inventory/car_form.html:112 templates/inventory/car_form.html:268 #: templates/inventory/car_form.html:457 templates/inventory/car_form.html:474 @@ -8527,10 +8653,6 @@ msgstr "الدور" msgid "Edit Vendor" msgstr "تعديل مورد" -#: templates/vendors/vendor_form.html:20 templates/vendors/vendors_list.html:15 -msgid "Add Vendor" -msgstr "إضافة مورد" - #: templates/vendors/vendors_list.html:58 msgid "Contact name" msgstr "اسم جهة الاتصال" @@ -9526,39 +9648,57 @@ msgstr "المستخدم هو مشرف عام." msgid "French" msgstr "الفرنسية" +#: venv/lib/python3.11/site-packages/ckeditor_uploader/forms.py:6 msgid "Search files" msgstr "البحث في الملفات" +#: venv/lib/python3.11/site-packages/ckeditor_uploader/templates/ckeditor/browse.html:5 msgid "Select an image to embed" msgstr "اختر صورة لإدراجها" +#: venv/lib/python3.11/site-packages/ckeditor_uploader/templates/ckeditor/browse.html:27 msgid "Browse for the image you want, then click 'Embed Image' to continue..." -msgstr "تصفح للعثور على الصورة المطلوبة، ثم انقر على 'إدراج الصورة' للمتابعة..." +msgstr "" +"تصفح للعثور على الصورة المطلوبة، ثم انقر على 'إدراج الصورة' للمتابعة..." -msgid "No images found. Upload images using the 'Image Button' dialog's 'Upload' tab." -msgstr "لم يتم العثور على صور. قم بتحميل الصور باستخدام تبويب 'تحميل' في مربع حوار 'زر الصورة'." +#: venv/lib/python3.11/site-packages/ckeditor_uploader/templates/ckeditor/browse.html:29 +msgid "" +"No images found. Upload images using the 'Image Button' dialog's 'Upload' " +"tab." +msgstr "" +"لم يتم العثور على صور. قم بتحميل الصور باستخدام تبويب 'تحميل' في مربع حوار " +"'زر الصورة'." +#: venv/lib/python3.11/site-packages/ckeditor_uploader/templates/ckeditor/browse.html:50 msgid "Images in: " msgstr "الصور في: " +#: venv/lib/python3.11/site-packages/ckeditor_uploader/templates/ckeditor/browse.html:62 +#: venv/lib/python3.11/site-packages/ckeditor_uploader/templates/ckeditor/browse.html:80 msgid "Embed Image" msgstr "إدراج الصورة" +#: venv/lib/python3.11/site-packages/ckeditor_uploader/templates/ckeditor/browse.html:146 msgid "Play Slideshow" msgstr "تشغيل عرض الشرائح" +#: venv/lib/python3.11/site-packages/ckeditor_uploader/templates/ckeditor/browse.html:147 msgid "Pause Slideshow" msgstr "إيقاف عرض الشرائح مؤقتاً" +#: venv/lib/python3.11/site-packages/ckeditor_uploader/templates/ckeditor/browse.html:148 msgid "‹ Previous Photo" msgstr "‹ الصورة السابقة" +#: venv/lib/python3.11/site-packages/ckeditor_uploader/templates/ckeditor/browse.html:149 msgid "Next Photo ›" msgstr "الصورة التالية ›" +#: venv/lib/python3.11/site-packages/ckeditor_uploader/templates/ckeditor/browse.html:150 msgid "Next ›" msgstr "التالي ›" +#: venv/lib/python3.11/site-packages/ckeditor_uploader/templates/ckeditor/browse.html:151 msgid "‹ Prev" msgstr "‹ السابق" @@ -12662,8 +12802,11 @@ msgstr "هل تريد إبطال أمر الشراء %s؟" #: venv/lib/python3.11/site-packages/django_ledger/models/transactions.py:88 #: venv/lib/python3.11/site-packages/django_ledger/models/transactions.py:97 -msgid "Account list must be a list of AccountModel, UUID or str objects (codes)." -msgstr "يجب أن تكون قائمة الحسابات عبارة عن قائمة من كائنات AccountModel أو UUID أو كائنات نصية (رموز)." +msgid "" +"Account list must be a list of AccountModel, UUID or str objects (codes)." +msgstr "" +"يجب أن تكون قائمة الحسابات عبارة عن قائمة من كائنات AccountModel أو UUID أو " +"كائنات نصية (رموز)." #: venv/lib/python3.11/site-packages/django_ledger/models/transactions.py:458 msgid "Journal Entry to be associated with this transaction." @@ -13847,15 +13990,21 @@ msgid "Display page numbers" msgstr "عرض أرقام الصفحات" #: venv/lib/python3.11/site-packages/django_pdf_actions/models.py:156 -msgid "Enable right-to-left (RTL) text support for Arabic and other RTL languages" -msgstr "تمكين دعم النص من اليمين إلى اليسار (RTL) للغة العربية واللغات الأخرى التي تُكتب من اليمين إلى اليسار" +msgid "" +"Enable right-to-left (RTL) text support for Arabic and other RTL languages" +msgstr "" +"تمكين دعم النص من اليمين إلى اليسار (RTL) للغة العربية واللغات الأخرى التي " +"تُكتب من اليمين إلى اليسار" +#: venv/lib/python3.11/site-packages/django_pdf_actions/models.py:162 msgid "Text alignment for table content" msgstr "محاذاة النص لمحتوى الجدول" +#: venv/lib/python3.11/site-packages/django_pdf_actions/models.py:168 msgid "Text alignment for table headers" msgstr "محاذاة النص لعناوين الجدول" +#: venv/lib/python3.11/site-packages/django_pdf_actions/models.py:174 msgid "Text alignment for the title" msgstr "محاذاة النص لعنوان التقرير" diff --git a/templates/haikalbot/chatbot.html b/templates/haikalbot/chatbot.html index 57fca86f..e6f2b228 100644 --- a/templates/haikalbot/chatbot.html +++ b/templates/haikalbot/chatbot.html @@ -3,455 +3,521 @@ {% block title %} {{ _("Haikalbot") }} -{% endblock %} +{% endblock title %} {% block description %} AI assistant -{% endblock %} +{% endblock description %} {% block customCSS %} - -{% endblock %} + +{% endblock customCSS %} {% block content %} - + +
-
- {% trans 'home' %} - {% trans 'home' %} -
- - -
- - - - - - -
+ {% trans 'home' %} + {% trans 'home' %} +
+
+ + + + + + +
-
-
- -
- +
- - - + + +
-
- - -
- - - -
+
+
+ + + +
+
- - - -{% endblock %} - -{% block customJS %} - -{% endblock %} - - - - - - - - - - - - - +{% endblock content %} \ No newline at end of file