اذهب إلى المحتوى

محمد عاطف17

الأعضاء
  • المساهمات

    3124
  • تاريخ الانضمام

  • تاريخ آخر زيارة

  • عدد الأيام التي تصدر بها

    29

كل منشورات العضو محمد عاطف17

  1. هذا ما أخبرتك به أنه سيحدث خطأ لانه لن يجد timeout لذلك يجب إستخدام useState ل useState حتي يتم حفظه في المكون لديك . و يفضل إرسال كود المكون كاملا .
  2. أولا المشكلة تحدث لأنك تحاول إيقاف ال setTimeout بعد إنشاءه . وهذا خطأ . فالذى يحدث فعليا أن تنشأ دالة setTimeout وترجع id مثلا ب 1 وإذا قيمة timeout تصبح 1 . وحين الضغط على الزر الإلغاء سيدخل للدالة confirmAction ويقوم بإنشاء setTimeout جديد ب id جديد ولنقل مثلا 2 وإذا ستصبح قيمة timeout ب 2 و سيقوم بإلغاء ال setTimeout التي لها id يساوي 2 و لكن ال id الذي يساوي 1 لم يتم إيقافه لذلك سوف ينفذ . والحل هو التالي : const confirmAction = () => { // هذه الدالة تبدأ العمل عندما يتم الضغط على زر محدد setShowActionMessage(true); if (stopAction) { // عند الضغط على زر الإيقاف true هذه الحالة تصبح clearTimeout(timeout); }else { const timeout = setTimeout(() => { if (!stopAction) { setAction(true); doTheAction(); // هذه الدالة المستهدفة من هذه العملية } }, 5000); } }; ولكن سيحدث خطأ وهو بسبب عدم تعريف ال timeout لذلك يجب وضعها في useState حتي يكون ال id معك في جميع الأحوال وإيقافه من أي مكان . والأفضل جعلهما دالتين حيث الدالة confirmAction مسؤولة فقط عن إنشاء setTimeout ودالة أخري مثلا cancelAction وهي مسؤولة عن الإلغاء
  3. الأمر بسيط أولا قمنا بإستخدام حلقة تكرار for حيث تقوم هذه الحلقة بتكرار الكود الذى بداخلها بعدد معين من التكرارات بناء على الشرط. في حلقة For قمنا بتعريف متغير i وهو المتغير الإبتدائي في الحلقة وأعطيناه رقم 8 . في الجزء الثاني من حلقة for هو جزء الشرط والذى ستم التكرار ما دام الشرط صحيحا وهنا كتبنا شرط أن الرقم i لا يكون أقل من 0 . وفي الجزء الثالث من الحلقة فهو الجزء الذى سيتم تنفيذه مباشرة عن إنتهاء دورة من دورات for وهنا قمان بإنقاص 1 من قيمة i. وبداخل for نقوم بجملة الطباعة console.log و نقوم بطباعة '#'.repeat(i) والدالة repeat تقوم بتكرار السلسلة بعدد من المرات التي يتم تمريرها له . لذلك في الدورة الأولي سيكون i ب 8 لذلك سيتم طباعة 8 علامات # وبعد ذلك سيتم إنقاص i ب 1 لتصبح الآن 7 . والشرط صحيح حيث 7 أكبر من 0 . لذلك سندخل في الدورة الثانية وسيتم طباعة # 7 مرات وهكذا إلى أ، تصبح i ب 1 وسيتم طباعة # فقط وبعد ذلك ستكون i ب 0 ولن يتحقق الشرط وسيخرج من ال for . وإذا أردت عكس المثلث فكل ما عليك تغيره هو الرقم الإبتدائي في for و الشرط و أيضا الجزء الذى سيتم تنفيذه بعد إنتهاء أى دورة. ويمكنك المحاولة بنفسك وإذا لم تستطع يمكنك إخبارى لتوضيح الحل لك
  4. إذا كان الحظر يتم تفعيله من السيرفر فإنه لا يمكن إلغاء حظره إلا عن طريق الوصول إلى السيرفر أو لوحة التحكم . حيث أن أي كود ستنفذه سيكون في الواجهة الأمامية أي في المتصفح فإذا كان الحظر في المتصفح يمكنك البحث عن الكود في ملفات ال js . ويمكنك تغير ال IP الخاص بك عن طريق تحميل برامج vpn لإخفاء ال ip الأصلى الخاص بك . وأيضا إذا لم تكن مشترك في خدمة ال ip الثابت (static) مع مزود خدمة الإنترنت لديك . فإن ال ip الخاص بك يتغير كلما تم إيقاف وتشغيل ال router . لذلك إذا أردت تغير ال ip كل ما عليك إعادة تشغيل ال router وستحصل علي ip جديد.
  5. نعتذر لك عن أى تأخير ولكن هناك ضغط حاليا على مركز الدعم وسيتواصلوا معك في أسرع وقت إن شاء الله .
  6. مرحبا يوسف إذا كان سؤالك بخصوص الإختبار فمن فضلك يمكنك مراسلة مركز الدعم حيث أن أي سؤال أو إستفسار بخصوص الإختبارات فهم من سيساعدونك
  7. يمكنك الضغط على CTRL + ALT + P وكتابة open User Settings وقم بإختيار الخيار الذى يوجد به كلمة JSON . بعد ذلك قم بكتابة السطر التالي : "emmet.showExpandedAbbreviation": "always", ولكن أولا قم بالبحث في الملف عن emmet.showExpandedAbbreviation إذا وجدتها قم بحذف السطر وإضافة السطر السابق. بعد ذلك يمكنك إستخدام إختصار html عن طريق الضغط على SHIFT + 1 وستظهر لك علامة التعجب
  8. توجد عدة فروق في ذلك ولنشرح معا الفرق . Regression (الانحدار): الانحدار يُستخدم عادة لتحديد العلاقة الرياضية بين متغير تابع (المرض) ومتغيرات مستقلة (العوامل الأخرى المتعلقة بالمريض مثل العمر، الوزن، التاريخ العائلي، ومستويات السكر في الدم السابقة). و يمكن استخدام الانحدار لإنشاء نموذج يقوم بتوقع إحتمالية إصابة الشخص بمرض السكر بناءً على البيانات المتاحة. النتائج تكون سهلة التفسير والتحليل، حيث يمكن فهم كيفية تأثير كل متغير على النتيجة فمثلا كلما كبر السن زادت إحتمالية الإصابة والوزن وهكذا. Neural Networks (الشبكات العصبية): الشبكات العصبية تعد أداة قوية في التعلم العميق وتحليل البيانات المعقدة.تحتاج الشبكات العصبية عادة إلى كميات كبيرة من البيانات للتدريب والتي يمكن أن تكون ضرورية لتحليل العلاقات الغير خطية بين المتغيرات. وقد تكون قادرة على استخدام معلومات معقدة أو غير خطية بطرق تحليلية تفصيلية ولكن في بعض الأحيان صعبة التفسير.
  9. بخصوص المشاريع الكبيرة والعملية حيث ستجدين أن الدروس متصلة ببعضها البعض فهذا يجب إنشاء مجلد منفصل لهذه المشاريع الكبيرة . أما بالنسبة للمسارات الأخري فيجب عمل مجلد منفصل لكل مسار . إذا كنتي قمتي بكتابة المسار كاملا في ملف واحد فلابئس ولكن يجب أن يكون في هذا الملف جميع الأكواد التي تم شرحها في الدروس لتدل على تطبيقك لها . ويجب وضع الملف في المجلد الخاص بالمسار به . ولكن يفضل حاليا حين دراسة الدورس الجديدة فصل كل كود في ملف منفصل ووضعه في مجلد المسار الخاص به
  10. جميعنا في بداية تعلم أى شئ جديد نصاب بالتشتت والإحباط خاصة لو واجهنا صعوبة في بداية الأمر و الإستسلام لهذا الشعور يعنى الفشل لذلك لا تقلقي فالأمر بسيط وستجدين بعد ذلك أن الأمر لا يستدعي كل هذا القلق والتشتت . بالنسبة لدراسة الدورة يفضل مذاكرة الدروس و الأقسام بالترتيب وعدم تجاهل أو تفويت أى درس لأن كل درس ومسار يعتمد على الدروس التي قبله وحتي لا تتراكم عليكي الأمور . إن الإستيعاب يختلف من شخص إلى شخص حيث هناك من يستطيع أن يفهم الدرس من أول مرة و هناك من يقوم بتكراره حتي يفهم الدرس وهذا ليس شيئا سيئا بل هو جيد ما دام هناك إصرار و إستمرار على الفهم . لذلك أولا يجب عليكى مشاهدة الدرس وبالأخص الأساسيات و إذا ما واجهتك أى مشكلة يمكنكي السؤال أسفل الدرس في التعليقات والتأكد من فهم كل شئ وبعد ذلك يجب عليكي التطبيق العملي مع المدرب و أيضا ستجدين في نهاية الدرس تدريبات يجب عملها حتي تتأكدي من فهمك للدرس ويمكنك وضع حلك في التعليقات حتي يعطيكي المدربون النصائح و إصلاح الأخطاء التي تواجهك . وكما وضحت لكي فإن الأهم من مشاهدة الدرس هو التطبيق لان التطبيق العملي هو من سيعطيكي الخبرة أكثر وهو ما سيوضح لكي إذا كنتي قد فهمتي الدرس تمام أم توجد بعض الأشياء الغير واضحه وأخيرا يجب عليكي عمل مجلد خاص بكل مسار وبكل مسار تقومين بعمل مجلد خاص بكل درس وحفظ الأكواد والتدريبات بهم حيث سيتطلب منكي في نهاية الدورة تسليم تلك الملفات حتي تحصلين على الشهادة .
  11. الخطأ الذى يظهر هو خطأ 503 وهذا الخطأ يخبرك أن السيرفر لا يستطيع تنفيذ طلبك الآن لانه لا يستطيع استقبال المزيد من الطلبات في الوقت الحالي . وهذا بسبب أنك قد قمت بإرسال العديد من الطلبات في نفس الوقت أو انك قد أنهيت ال bandwidth الخاص بك لهذا الشهر أو اليوم حيث أن الإستضافات المجانية تعطيك bandwidth محدد لا يمكن تخطيه . أو ممكن بسبب أن 000webhost لديه مشكلة حاليا . وقد حدثت معي عدة مرات على 000webhost . قم بمحاولة إنشاء حساب جديد وإنشاء قاعدة بيانات جديد إذا ظهر لك نفس الخطأ إذا المشكلة لدى 000webhost و يمكنك التجربة مرة أخري لاحقا بعد إصلاح الخطأ لديهم . إذا تم إنشاء قاعدة بيانات إذا المشكلة في الحساب لديك وقد أنهيت ال bandwidth الخاص بك أو تخطيت عدد قواعد البيانات المسموحة لك
  12. لا مشكلة يمكنك وضعه بداخل عنصر script هكذا : <script> let button = document.querySelector("#button-id"); if (button) { button.click(); } </script>
  13. وعليكم السلام ورحمة الله وبركاته . يفضل جعل الزر هو من يقوم بفتحه حتي لا يظهر ال form دائما و يعيق المستخدم . ولكن إذا أردت فتحه في صفحة معينة دون باقي الصفحات فهذا ممكن . والحل الأفضل لذلك هو إستخدام كود جافاسكريبت يقوم بالضغط علي الزر كما لو أن المستخدم هو من قام بالضغط : let button = document.querySelector("#button-id"); if (button) { button.click(); } في الكود السابق إفترضت أن الزر لديه id يسمي button-id ويمكنك تغيره إلى ال id الذى لديك . وعند تشغيل هذا الكود سيعمل بالضغط على الزر ويقوم بفتح ال form تلقائيا. ويمكنك إخفاء الزر عن طريق وضع خاصية display:none; #button-id{ display:none; }
  14. إذا كنت تقصد أن المؤشر لا يخرج خارج إطار ال machine وتريد الخروج من ال machine . فإن هذه الخاصية في vmware والبرامج الأخرى حيث تقوم بإمساك المؤشر داخل الشاشة الخاصة بال machine فقط وهذا حتي تستطيع التعامل بحرية داخل ال machine وتعتبرها كانها شاشة منفصلة فمن الممكن حينما تقوم بتحريك المؤشر لطرف الشاشة تراه خرج لشاشة الجهاز لديك وهذه مشكلة لذلك تقوم ال vmwares بإمساك المؤشر . ولجعل المؤشر يخرج من ال machine يمكنك الضغط على Ctrl+Alt وهكذا ستقوم vmware بترك المؤشر .
  15. يجب عليك الضغط على زر yes حتي يقوم بفتح النظام لديك . بعد ذلك قم بالضغط على القائمة vm في الأعلى وبعد ذلك Settings . بعد ذلك قم بإختيار CD/DVD (SATA) ومن ثم قم بإلغاء تفعيل connected power on هكذا .
  16. الأمر بسيط فبدلا من وضع جميع العناصر th وهي رأس الجدول في عنصر tr وهو الصف . نقوم بوضع ال th مع ال td في نفس الصف tr هكذا : <!DOCTYPE html> <html> <head> <style> table, th, td { border: 1px solid black; border-collapse: collapse; } th, td { padding: 5px; text-align: center; } </style> </head> <body> <table style="width:100%"> <tr> <td>محمود أمين</td> <th>:الإسم </th> </tr> <tr> <td>111 111 111</td> <th>رقم الهاتف:</th> </tr> <tr> <td>عدن</td> <th>السكن:</th> </tr> </table> </body> </html>
  17. لاحظ يوجد قرص بين ال c والمسحاة التي تريد تزويدها ولذلك لن يمكنك إضافتها فكما أخبرتك يجب أن يكونو بجوار بعضهم البعض . يمكنك تقعيل ال d ونقل الملفات إليه وحذف القرص الأخر وبعد ذلك إضافته إلى ال c لكن بهذا الوضع لن يمكنك . ويمكنك تنزيل برنامج partition wizard حيث هو من أفضل البرامج التي تقوم حذف و تقسيم الأقراص يمكنك البحث عن فيديو له عن اليوتيوب وسيساعدك في ذلك دون الحاجة لنقل أى ملفات
  18. يجب على القرص D أن يكون ال unallocated أي يكون لونه أسود وليس أزرق وأيضا يكون بجوار ال c مباشرة . بعد ذلك يجب الضغط على ال c وإختيار extend volume وبعد ذلك تحدد المساحة الذى تريد زيادتها . ويمكنك إرسال صورة لما يظهر لك
  19. وعليكم السلام ورحمة الله وبركاته . أولا لا أنصحك بذلك فلا يجب أن تضع partiotion واحد فقط لديك وتجعله يحوي جميع الملفات بما في ذلك نظام التشغيل . ثانيا يبدو من الصورة أنه يوجد لديك هاردين فإذا كان ال c و d فوق بعضهم وليس بجوار بعضهما البعض فلن ينفع ذلك فهذا هارد وهذا هارد أخر . أما بالنسبة للمشكلة الأساسية لديك وهي عدم ظهور خيار الحذف فهذا بسبب أن ال d لديك هو primary partitions وايضا ستجد مكتوب بجواره ملف الصفحة (page file) وهي خاصية تجعل النظام يستخدم ال partition لتوسيع الذاكرة الفعلية (RAM) عندما تكون الذاكرة المتاحة غير كافية لتشغيل التطبيقات والعمليات بشكل فعال وتسمى الذاكرة الإفتراضية (Virtual Memory) ولذلك يجب إيقاف هذه الخاصية أو نقلها ل partioion أخر حتي تستطيع حذف هذا ال partiotion ولكن لا أنصحك بفعل هذا . لذلك إذا أردت الحذف في أي حال يمكنك البحث عن كيفية إيقاف ال page file أو Virtual Memory على اليوتيوب واتبع الخطوات .
  20. وعليكم السلام ورحمة الله وبركاته . إن مجال هذه الدورة متقدم ويحتاج إلى معرفة سابقة أو أساسيات برمجية أي شخص لديه إلمام بأساسيات البرمجة وعلوم الحاسوب ، ولذلك فإن دورة علوم الحاسوب هنا في الأكاديمية هى الدورة المناسبة كبداية ، فهي ليست خاصة بمجال معين بل للتأهيل للدخول إلى مجال البرمجة عموما. ولكن أيضا في دورة الذكاء الاصطناعي تم مراعاة عدم وجود أى خبره ، حيث يتم الإفتراض أنه لا يوجد أي خبرة برمجية مسبقًا ويتم البدء من الصفر. وستجد في صفحة الدورة تلك التفاصيل أنه لا يحتاج إلى سابق معرفة : ولا مشكلة في الإشتراك بدورة الذكاء الاصطناعي مباشرة دون الإحتياج إلى دورة علوم الحاسوب ، لكنك ستأخذ وقت كثير نسبيا لكي تستوعب بعض الأمور بها ، و يجب عليك في البداية عدم تخطي شرح أى أساسيات حيث يتم البدأ بشرح الأساسيات مثل لغة بايثون و قواعد البيانات ، لذا هي بها شرح جيد للأساسيات، لكن ستحتاج إلى البحث ودراسة بعض الأمور الأخرى خارج الدورة لكي تستوعب ما يتم شرحه. وأيضا أى مجال خاص بالذكاء الإصطناعي وتعلم الآله وتحليل البيانات فهو يحتاج إلى أساسيات في الرياضيات مثل أساسيات الجبر الخطي وخلاف ذلك لذلك يفضل معرفة الأساسيات الخاصة بها ولكن كما أخبرتك أثناء الشرح في الدورة تم مراعاة ذلك . ويمكنك قراءة الإجابات التالية لمزيد من التفاصيل :
  21. وعليكم السلام ورحمة الله وبركاته . نعم بالفعل قديما يتم تخزين بيانات المستخدم في ال session كما كان يحدث في php ولكن لنشرح معا الفرق بين session وبين ال token . تعتمد فكرة الـ Sessions على تخزين حالة المستخدم (User State) على السيرفر. عندما يقوم المستخدم بتسجيل الدخول أو زيارة الموقع لأول مرة يتم إنشاء Session له تلقائيا في السيرفر، ويتم تعيين مُعرف (ID) فريد لهذه الـ Session في الخادم ويتم حفظ ال id في المتصفح في ال session ويتم إرسال ال id مع كل طلب . هذا المُعرف يتم استخدامه للتعرف على المستخدم في كل طلب يرسله إلى السيرفر، وبذلك يكون السيرفر قادراً على معرفة هوية المستخدم والتأكد من صلاحيته. على العكس تماما الـ Tokens هي عبارة عن عناصر صغيرة من المعلومات (مثل سلسلة نصية) يتم توليدها وتشفيرها من خلال السيرفر بعد عملية تسجيل الدخول بنجاح. يتم تضمين هذا الـ Token في كل طلب يقدمه المستخدم إلى السيرفر. السيرفر يقوم بفحص الـ Token للتحقق من هوية المستخدم وصلاحيته ويتأكد هل ال Token تم التلاعب به أم لا. الـ Token يحمل معلومات مثل هوية المستخدم وأي صلاحيات أو صلاحيات الوصول (Access Permissions) التي لديه. المزايا الرئيسية للاستخدام الـ Token-based: أمان : الـ Tokens يكون مشفرا لهذا من الصعب التلاعب به أو تزويره. قابلية التوزيع: يمكن توزيع الـ Tokens عبر عدة سيرفرات أو خدمات بسهولة دون الحاجة إلى مشاركة حالة الجلسة بينهم فمن الممكن أن يكون المشروع لديك على عدة سيرفرات أو خدمات لهذا ال Sessions لن تنفع. عديم الحالة (Stateless): الـ Tokens تسمح بإنشاء تطبيقات عديمة الحالة (Stateless Applications)، حيث لا يتم تخزين حالة المستخدم على السيرفر فمن الممكن أن يكون الطلب يتم إرساله من تطبيق هاتف أو حتي تطبيق سطح مكتب أو ويب. لذلك ال Token-based أفضل حاليا من حيث القدرة على توزيع المشروع على عدة سيرفرات و عدم الإعتماد على حالة سيرفر واحد وال session الخاص به.
  22. ماذا تقصد بالجدول الأول فيه جميع البيانات المستلمة ؟ هل تقصد أنه يقوم بإرجاع جميع البيانات الموجودة في قاعدة البيانات وإظهارها في هذا الجدول ؟ إذا كان كذلك فهذا ليس جيدا يجب عمل (pagination) أى صفحات للجدول حيث يتم إظهار 20 صف بحد أقصي في الجدول ويمكنه إختيار التالي أو السابق أو الذهاب لصفحة معينة وذلك أفضل شئ من حيث الأداء كما فعلت في الجدول الثاني . أما موضوع كثرة البيانات أقصد عدد الصفوف في قاعدة البيانات وهذا أيضا يعتمد على حالة الإستضافة و المواد المستخدمة . حيث سابقا كنت أعمل على مشروع وكان هناك جدول يحتوي على 400 الف صف وكان يتم عرضه بالكامل في الصفحة . كان الإسكريبت بطئ جدا وكانت الصفحة من الممكن أن تأخذ 20 إلى 30 ثانية للتحميل وبعد التحميل تجد المتصفح أصبح بطيئا جدا من كثرة البيانات فيه . ولهذا يفضل عدم إرجاع أكثر من 10-15 ألف صف مرة واحدة
  23. بالنسبة للسؤال الأول فالكود المرسل هو كود الإرسال لقاعدة البيانات . أما السؤال الثاني فأقصد كود الإستيراد من قاعدة البيانات
  24. بالنسبة للسؤال الأول فإذا أردت التحقق من الملف قبل إرسال ال form إلى الواجهة الخلفية فالأمر بسيط يمكنك إستخدام الكود التالي : <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <script> function checkFileSize(event) { const file = event.target.files[0]; const fileSize = file.size; if(fileSize >= 500000) { alert('من فضلك إختر حجم ملف أقل من 500KB ') event.target.value="" } } </script> </head> <body> <form action="upload.php" method="post" enctype="multipart/form-data"> <input type="file" onchange="checkFileSize(event)" required> <input type="submit" value="أضف"> </form> </body> </html> هنا أنشئنا الدالة checkFileSize والتي تقوم بالتحقق من حجم الملف وإذا كان حجم الملف أكبر من 500KB سيقوم بإظهار رساله للمستخدم بأنه لا يمكن رفع ملف أكثر من 500KB و سيقوم بحذف إختيار الملف الذى إختاره المستخدم وسيتوجب عليه إختيار ملف أخر . ولكن يجب عليك أيضا التحقق في الواجهة الخلفية حيث من الممكن أن يقوم المستخدم بإبطال عمل كود ال java script . أما بالنسبة إلى سؤال الثاني نعم فبالطبع تلك مشكلة ومن الممكن بشكل كبير أن يتوقف البرنامج عن العمل وحدوث مشاكل أو يؤدي إلى بطئ في السكريبت . ولكن هذا يعتمد علي طريقة كتابتك للكود حيث إذا قمت بإنشاء ملف في متغير وتقوم بكتابة البيانات فيه فهذا من الممكن بشكل كبير أن يؤدي لمشكلة إستهلاك جميع الموارد أو ان أقصي إستخدام للذاكرة في php يتم تخطيه وبذلك ستحصل مشاكل . وأيضا قاعدة البيانات ستكون بطيئة في إسترجاع تلك الكمية الكبيرة من البيانات .
  25. إن الأمر كله يتمحور حول ال API حيث يجب عليك : أولا تطوير API على موقعك الإلكتروني الحالي للتعامل مع عمليات إضافة المنتجات إلى السلة وإدارة السلة نفسها على الموقع الأول والذى يوجد فيه المستخدم. و يجب أن يكون لديك API تسمح بإضافة منتجات، حذف منتجات والحصول على محتويات السلة الحالية. ثانيا إنشاء API للنقل إلى الموقع الثاني: على موقعك الثاني الذي سترسل إليه البيانات قم بتطوير API لاستقبال طلبات السلة من الموقع الأول وايضا إستقبال الكود أو barcode من المستخدم والذى سيرسله لك الموقع الأول يجب أن تكون لديك API لاستقبال بيانات السلة مثل الحذف والإضافة أو التعديل وأيضا التحقق من ال code للتاكد من الأمان. و يجب أن تكون هناك عملية لنقل البيانات بشكل آمن وموثوق بين النظامين بما في ذلك استخدام البرمجيات المشفرة والاتصال عبر بروتوكول HTTPS للأمان ويفضل في الموقع الثاني الذى يستقبل الطلبات إغلاق إستقبال جميع الطلبات عدي من الدومين الخاص بالموقع الأول أو عن طريق ال IP فقط وهذا في حالة إذا كان الموقع الثاني لا يدخل عليه المستخدمين حيث هو فقط لحفظ و قراءة البيانات منه. تتبع الطلبات والتعديلات: يجب عليك تطوير واجهة المستخدم على الموقع الثاني لمتابعة حالة الطلب وتعديله حسب الحاجة بما في ذلك تحديثات الحالة وتوفير معلومات التوصيل والفاتورة.
×
×
  • أضف...