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

محمد_عاطف

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

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

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

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

    133

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

  1. ستجد أسفل فيديو الدرس في نهاية الصفحة صندوق تعليقات كما هنا، أرجو طرح الأسئلة أسفل الدرس وليس هنا في قسم أسئلة البرمجة حيث نطرح الأسئلة العامة الغير متعلقة بمحتوى الدورة أو الدرس، وذلك لمساعدتك بشكل أفضل.
  2. نعم هذا صحيح . هناك الأشخاص تقوم بوضع البيانات في قاعدة البيانات وإنشاء API لك وتوضيح الرابط والبيانات المطلوبة . بعد ذلك عندما ترسل طلب لهذا ال API يقومون بإحضار تلك البيانات وإعادتها لك سواء كان نتيجة مباريات أو بيانات طقس أو غيره.
  3. وعليكم السلام ورحمة الله وبركاته. نعم ما تقوله صحيح إلى حد ما . إن ال API (واجهة برمجة التطبيقات) هو ببساطة وسيلة للتواصل بين عدة أنظمة معا أو بين الواجهة الأمامية (Frontend) والخلفية (Backend). والهدف منه هو الوصول إلى البيانات من قاعدة بيانات مثلا سواء لجلبها أو إضافتها أو تعديلها أو حتى حذفها. لاحظ أنك حينما تستعمل أو تنشأ صفحة php في الموقع لديك حتى تعمل تلك الصفحة يجب عليك زيارة تلك الصفحة في المتصفح . ماذا لو أردنا مثلا عرض البيانات التي في تلك الصفحة في تطبيق للهاتف ماذا نفعل ؟ ماذا لو أردنا توفير تلك البيانات لمواقع أخرى ؟ حيث يرسل شخص ما طلب من موقع أخر لجلب بيانات لدينا ؟ هنا لا يمكن فعل ذلك من خلال صفحة php العادية . ولكننا نستعمل هنا ال API حيث ننشأ ال API وهذا ال API يستقبل الطلبات من أى مكان سواء كان تطبيق ويب أو تطبيق هاتف محمول أو شخص أخر يريد جلب بيانات (مثلا جلب بيانات الطقس لعرضها في أى موقع ) . وهنا بعد إنشاء هذا ال API نوفر الرابط الخاص به والبيانات التي يحتاجها وما هو شكل البيانات التي يتم إعادتها . وهكذا يمكن لأى شخص إرسال الطلب إلى ال API وإستقبال البيانات والمعلومات منه . ولتبسيط الفكرة تخيل أن ال API هو نادل (الشخص الذي يستقبل الطلبات) في مطعم . وهنا المستخدم يطلب طلب طعام من هذا النادل (مثل إرسال طلب HTTP مثل Route.get('/users')) هنا النادل (API) يستقبل هذا الطلب. ثم يذهب إلى المطعم (الخادم الذي يتصل بقاعدة البيانات). يقوم الطاهي (وهو الخادم) بتنفيذ الطلب (هنا يتم تنفيذ الطلب وإعاداة البيانات من قاعدة البيانات التي طلبها المستخدم) وعند إنتهاء الطلب يرسل الرد مع النادل (API). هنا النادل (API) بعد أن إستقبل الطلب (الرد) من الطاهي (الخادم) يقوم بإعادة الرد إلى المستخدم الذي طلبه (وغالبا ما يكون الرد من نوع JSON) . وهكذا ال API ما هو إلى مجرد وسيط يستقبل الطلبات ويرسلها إلى الخادم و يستقبل الرد من الخادم ويعيده للمستخدم . وإليك شرح مفصل له : ولإنشاء Api هو فقط إنشاء ملف php يستقبل الطلبات ويعيد البيانات على هيئة JSON هكذا : <?php // إعداد رؤوس الاستجابة header("Access-Control-Allow-Origin: *"); header("Content-Type: application/json; charset=UTF-8"); // بيانات الاتصال بقاعدة البيانات $host = 'localhost'; $db = 'my_api_db'; $user = 'root'; $pass = ''; // الاتصال بقاعدة البيانات $dsn = "mysql:host=$host;dbname=$db;charset=$charset"; try { $pdo = new PDO($dsn, $user, $pass); } catch (PDOException $e) { http_response_code(500); echo json_encode(['error' => 'فشل الاتصال بقاعدة البيانات']); exit; } // تنفيذ استعلام $stmt = $pdo->query("SELECT * FROM users"); $users = $stmt->fetchAll(PDO::FETCH_ASSOC); // إرجاع النتيجة على شكل JSON echo json_encode($users); وهكذا عندما يتم طلب الصفحة السابقة ولتكن مثلا بإسن api.php : http://localhost/api.php سيتم إعادة الرد هكذا : [ { "id": 1, "name": "Mohamed", "email": "mohamed@example.com" }, { "id": 2, "name": "Ayman", "email": "ayman@example.com" } ] وهكذا أنت أنشأت أول api لك.
  4. بالتأكيد إن الذكاء الاصطناعي يمكنه أتمتة المهام البرمجية المتكررة والبسيطة حاليا، مثل كتابة الأكواد النمطية أو تصحيح الأخطاء الشائعة. وهذا يعني أن المبرمجين قد يركزون أكثر على المهام الإبداعية والمعقدة بدلًا من القيام بأعمال روتينية. ونتيجة لذلك يمكن القول أن الذكاء الاصطناعي سيغير بشكل كبير مجال البرمجة لكنه لن يلغي الحاجة إلى المبرمجين. ولكن لا يمكن التنبؤ بهذا فمع تطور الذكاء الإصطناعي بشكل كبير وسريع وأصبح هناك بعض النماذج التي تقوم ببناء مشاريع كاملة فمن اللمكن ان يقلل هذا الوظائف المتاحة مستقبلا وسيتوجب على المبرمجين معرفة كيفية التعامل وإستخدام الذكاء الإصطناعي ليزيد من إنتاجيتهم . يفضل الإطلاع على الإجابات التالية أيضاً:
  5. وعليكم السلام ورحمة الله وبركاته. إن Mercuna هو برنامج متقدم يتم إستخدامه في تطوير الألعاب لتوفير حلول الذكاء الاصطناعي لحركة الشخصيات والمركبات والحيوانات والكائنا بداخل العوالم الافتراضية و يوفر Mercuna نوعين رئيسيين من أنظمة الملاحة: Mercuna Ground Navigation: وهو نظام ملاحة ثنائي الأبعاد (2D) خاص بالحركة على الأرض ويتيح للشخصيات أو المركبات أو الحيوانات التنقل بسلاسة وواقعية داخل بيئات الألعاب مهما كان نوع التضاريس. يدعم هذا النظام توليد مسارات طبيعية وتفادي العقبات، ويأخذ في الحسبان خصائص الحركة الخاصة مثل سرعة الدوران المحدودة للسيارات أو الحيوانات، حتى لا تظهر الحركات بشكل غير واقعي أو تتعطل الشخصيات. Mercuna 3D Navigation: وهو نظام ملاحة ثلاثي الأبعاد (3D) مخصص للكائنات أو المركبات الطائرة مثل الطائرات و التنانين أو الغواصات بحيث يمكنها التنقل بذكاء بين العقبات أو عبر بيئات معقدة (ويدعم هذا النظام البحث عن المسار و التوجيه وتفادي العقبات بشكل ديناميكي وواقعي. تلخيصا لما سبق إن Mercuna يستخدم بشكل أساسي في تطوير الألعاب مثل Unreal Engine وذلك لجعل الشخصيات والكائنات والمركبات تتحرك بطريقة واقعية وذكية دون الحاجة لبرمجة كل التفاصيل يدويا مما يوفر الوقت ويزيد من جودة التجربة البصرية والذكاء الاصطناعي في الألعاب. أما Speech Graphics هو برنامج يستخدم في صناعة الرسوم المتحركة والألعاب ويركز على تحريك الوجوه (Facial Animation) بشكل واقعي بناء على الصوت فقط من دون الحاجة لتقنيات التقاط الحركة (Motion Capture). ويقوم البرنامج بتحليل الصوت -الكلام- بدقة عالية ويولد تلقائيا حركة الشفاه والوجه بالكامل بحيث تتطابق مع ما يتم قوله ومع المشاعر المنقولة في الصوت.ويدعم تحريك تفاصيل دقيقة مثل التنفس والضحك ويستطيع تمييز شدة المشاعر ونقلها للوجه.ويستخدم في إنتاج الألعاب الضخمة و الأفلام والتطبيقات التي تتطلب تفاعل واقعي مع شخصيات افتراضية .
  6. ستجد أسفل فيديو الدرس في نهاية الصفحة صندوق تعليقات كما هنا، أرجو طرح الأسئلة أسفل الدرس وليس هنا في قسم أسئلة البرمجة حيث نطرح الأسئلة العامة الغير متعلقة بمحتوى الدورة أو الدرس، وذلك لمساعدتك بشكل أفضل.
  7. كما تم التوضيح في الإجابات السابقة لا يوجد سوى شرطين وهما هذان الشرطان. أما الترقية الإستثنائية فقط يوجد حقل checkbox . يمكنك تحديده لتفعيل الترقية الإستثنائية وكتابة أى درجة جديدة . أى أنه يمكن فقط ترفية الموظف درجة واحدة فقط بدون ترقية إستثنائية . أما لو تم تحديد ترقية إستثنائية يمكنك كتابة أى درجة.
  8. هذا الأمر يعتمد على ما تريد عرضه . فهل تقوم بعرض الترقيات أم الموظفين ؟ الأفضل بالطبع عرض الموظفين أو بناء على ما تريده. إذا كان الموظفين يمكنك عرض الموظف مع الدرجة الحالية والدرجة السابقة مع تاريخ بداية الترقية . أما لو أردت الترقيات فيمكنك عرض جميع الترقيات الحالية مع التاريخ مع إسم الموظف . ودائما في دالة العرض هذا يعتمد على ما يتم طلبه منك أو يريده المستخدم.
  9. وعليكم السلام ورحمة الله وبركاته. أولا إن الحقول التي يتم إدخالها هي : رقم القرار (num). الـدرجة السابقة (prev_degree) وهي درجة الموظف الحالية ويتم تعبئتها تلقائيا من درجة الموظف الحالية {{ $emp->degree }} الـدرجة الجديدة (new_degree): وهي الدرجة بعد الترقية ويتم تعبئتها تلقائيا بـ الدرجة الحالية + 1 {{ $emp->degree + 1 }} ترقية استثنائية (excep) وهو مدخل اختياري تاريخ الاستحقاق (date) تاريخ آخر ترقية (last_date) وهو اختياري الوثائق (files) وهو إختياري وفي المتحكم عند الحفظ يتم التأكد أولا من أن الدرجة الجديدة new_degree ليست موجودة مسبقا في جدول الترقيات promotions لنفس الموظف .وأيضا يجب أن تكون الدرجة الجديدة مساوية للدرجة السابقة + 1 إذا لم تكن الترقية استثنائية. بعد ذلك يتم حفظ الترقية من خلال إنشاء سجل جديد في جدول promotions . وبعد ذلك يتم تحديث درجة الموظف في حقل degree في جدول employees . وأخيرا يتم حفظ الملفات التي تم رفعها
  10. وعليكم السلام ورحمة الله وبركاته. يجب عليك تحديد التقنية واللغة التي تريد العمل بها . حيث يوجد هنا العديد من الدورات التي تساعدك لتصبح full stack ولكن تختلف بإختلاف اللغة والتقنيات المستخدمة . حيث : اولا دورة تطوير التطبيقات باستخدام لغة Python بعد الانتهاء من هذه الدورة يمكنك ان تصبح مطور برمجيات بلغة بايثون و backend devolper باطار عمل django وايضا تهيئك لمجال تحليل البيانات والذكاء الاصطناعى وتعلم الالة . وهذه الدورة اذا اردت ان تصبح مطور واجهات خلفية . ثانيا دورة تطوير التطبيقات باستخدام JavaScript بعد الانتهاء من هذه الدورة يمكنك ان تصبح مطور برمجيات بلغة جافاسكريبت وتمكنك من ان تصبح مطور واجهات خلفية MERN stack وايضا تمكنك من تطوير تطبيقات الهاتف ومن الممكن ان تستعملها لتصبح FULL STACK Developer ثالثا دورة تطوير تطبيقات الويب باستخدام لغة PHP بعد الانتهاء من هذه الدورة يمكنك ان تصبح مطور برمجيات بلغة php باطار عمل لارافيل و ووردبريس وهذه الدورة تؤهلك لتصبح مطور واجهات خلفية بواسطة php. رابعا دورة تطوير تطبيقات الويب باستخدام لغة Ruby عد الانتهاء من هذه الدورة يمكنك ان تصبح مطور برمجيات بلغة ruby وهذه الدورة تؤهلك لتصبح مطور واجهات خلفية. وبما أنك أنهيت دورة تطوير واجهات المستخدم . ولو رأيت أنك جيد في جافاسكريبت فأنصحك بدورة تطوير التطبيقات باستخدام JavaScript حيث ستتعلم فيها أطر عمل للواجهات الخلفية مثل express و أطر العمل للواجهات الأمامية مثل react و next . ولكن لو أردت تعلم لغة بايثون فدورة تطوير التطبيقات باستخدام لغة Python ستؤهلك لتصبح مطور واجهة خلفية من خلال بايثون . أو يمكنك الدخول في دورة PHP حيث أغلب الوظائف المتاحة في العمل الحر حاليا هي PHP وإطار عمل لارافيل.
  11. العرض قد تم الاعلان عنه بالأمس وتم تطبيقه بالفعل للأشخاص الذي قاموا بالإشتراك منذ الأمس . وبما أنك قمت بالإشتراك منذ إسبوع فحينها العرض لم يكن قد تم تطبيقه . لذلك يرجى محادثة مركز مساعدة أكاديمية حسوب من خلال الرابط التالي . حيث جميع الأمور المالية تتم من خلالهم وبإذن الله سيقومون بمساعدتك. أعانكم الله فيما أنتم فيه ورفع عنكم كل سوء إن شاء الله.
  12. إن دورة تطوير واجهات المستخدم تؤهلك لأن تصبح مطور واجهة أمامية ولكن للمواقع الثابتة . وهي تركز على التصميم بشكل كبير حيث يتم شرح CSS و HTML و JS بشكل مفصل مع جميع المكتبات اللازمة لذلك مثل bootstrap و jquery وغيرها . أما دورة تطوير التطبيقات باستخدام JavaScript بعد الانتهاء منها يمكنك ان تصبح مطور برمجيات بلغة جافاسكريبت وتمكنك من ان تصبح مطور واجهات خلفية MERN stack وايضا تمكنك من تطوير تطبيقات الهاتف ومن الممكن ان تستعملها لتصبح FULL STACK Developer وبالطبع يمكنك أن تكون front end . أما دورة إدارة تطوير المنتجات فلا علاقة لها بالتطوير بل هي لمديرى المنتجات والمشاريع . لهذا أنصحك بدورة تطوير التطبيقات باستخدام JavaScript ولو أردت الخوض في التصميم فيمكنك أخذ دورة تطوير واجهات المستخدم أيضا.
  13. هل يمكنك توضيح سؤالك أكثر ؟ هل تقصد وجود خبرة قبل الإشتراك في دورة "تطوير التطبيقات باستخدام لغة Python" ؟ إذا كان كذلك فلا يجب وجود أى خبرة . حيث يتم البدأ في الدورة من الصفر . وستجد في وصف الدورة التالي : لمن لا يمتلك خبرة مسبقة في مجال البرمجة ويريد الدخول في هذا المجال الشيق ويمكنك معرفة أكثر عن الدورة من خلال الرابط التالي : https://academy.hsoub.com/learn/python-application-development/
  14. ستجد أسفل فيديو الدرس صندوق للتعليقات كما هنا يرجى طرح سؤالك أسفل الدرس وليس هنا حيث هنا قسم الأسئلة العامة ولا نقوم بإجابة الأسئلة الخاصة بمحتوى الدورة أو الدرس، وذلك لمعرفة الدرس الذي توجد به مشكلتك و لمساعدتك بشكل أفضل.
  15. وعليكم السلام ورحمة الله وبركاته. الأمرين كل منهما يقوم بتنزيل مكتبة مختلفة حيث هاتان هما مكتبتان مختلفتان python-nmap و python3-nmap . ولكن المكتبة الشائعة والمستخدمو بكثرة والتي تدعم بايثون 3 هي python-nmap . ويمكنك تنزيلها من الأمر : pip install python-nmap
  16. بالرغم من التطور الكبير في أدوات الذكاء الاصطناعي التي تساعد على كتابة الأكواد فإن كتابة الأكواد لم تصبح من الماضي وأعتقد أن هذا صعب بعض الشئ . ولكن من الممكن أن يتغير دور المبرمج. حيث في الوقت الحالي لم يعد من الضروري كتابة كل سطر بنفسك يدويا حيث من الممكن توليد ذلك بسهولة من خلال أدوات الذكاء الإصطناعي وتوفير الكثير من الوقت في الكتابة . و لكن بالطبع القدرة على قراءة وفهم الكود بعمق أصبحت أكثر أهمية من أي وقت مضى. حيث كما وضحت الذكاء الاصطناعي مثل ChatGPT وCopilot وغيرها يمكنه توليد كود بسرعة لك و لكن أن تقوم بتوجيهه بشكل صحيح يتطلب معرفة جيدة وعميقة بأساسيات البرمجة والمنطق الخاص بها وفهم واضح لما تريد تنفيذه. حيث المبتدأ الذي لا يفهم الكود الذي يولده الذكاء الاصطناعي من الممكن بالطبع أن توجد مشاكل في الكود متعلقة بأخطاء أو منطق خاطئ أو حتى ثغرات وذلك بسبب عدم توضيح كل شئ أو نقص المعلومات التي وضحها للذكاء الإصطناعي أو من الممكن أن يكون أداء الكود سيء. ولهذا بالطبع يجب على المبرمج أو الشخص أن يكون لديه مهارات فهم الأكواد والبنية الخاصة به والمنطق البرمجي وأيضا تحليل الكود المكتوب وتعديله حسب الحاجة. و القدرة هلى صياغة تعليمات واضحة للذكاء الاصطناعي للحصول على ما تريده . وفي النهاية إن إستخدام الذكاء الاصطناعي يجب أن يكون كأداة مساعدة لك وليس بديلا عنك أو عن المبرمج لهذا ينبغي على المبرمج بالطبع أن يتعلم كتابة الكود لكنه لم يعد الهدف الرئيسي حيث الهدف الآن هو القدرة على التفكير البرمجي وتحليل الكود والتفاعل مع الذكاء الإصطناعي.
  17. وعليكم السلام روحمة الله وبركاته. هذا المصطلح جديد.وهو أسلوب برمجة جديد ظهر هذا االعام حيث يشير إلى نظام جديد في تطوير البرمجيات يعتمد بشكل كبير على أدوات الذكاء الاصطناعي والنماذج اللغوية الكبيرة (LLMs) مثل ChatGpt وغيرها. حيث يعتمد هذا النطام على إستخدام اللغة العادية بدلا من كتابة الكود يدويا. أى أنه يمكنك وصف ما تريد أن يفعله البرنامج بالكلمات للذكاء الإصطناعي ويتولى هو توليد الكود اللازم لتحقيق ما تريده.و هذا الأمر يجعل حتى الأشخاص غير المبرمجين من إنشاء تطبيقات أو مواقع أو حتى ألعاب دون الحاجة لفهم عميق للبرمجة. حيث يسرع عملية تطوير البرمجيات بشكل كبير فإنه يمكنك الآن بناء تطبيقات أو أدوات في ساعات بدلا من أسابيع أو حتى شهور. وكل ما عليك فعله هو وصف ما تريد تحقيقه باستخدام اللغة العادية لأدوات الذكاء الإصطناعي ويستخدم الذكاء الاصطناعي هذا الوصف لتوليد الكود المناسب لك وبعدها تقوم بتجربة الكود الناتج وتطلب من الذكاء الاصطناعي إجراء التعديلات اللازمة لك إذا أردت وأخيرا يمكنك نشر وإستخدام هذا الكود كما تريد.
  18. أولا يجب عليك معرفة أن الوقت المستغرق في الدراسة يختلف من شخص إلى أخر . حيث كل مدى وسرعة إستيعابه مختلفة عن الأخر . فمن الممكن الدرس الواحد يأخذ مع شخص ما 30 دقيقة ولكن مع شخص أخر يأخذ أكثر من 60 دقيقة لهذا لا يجب عيلك التركيز على الوقت الذي تستغرقة في الدرس . الأهم بالنسبة لك هو التأكد من فهمك التام للدرس وعدم تخطيه. أما بخصوص سؤالك عن وضت التطبيق على الدروس لكل ساعة . فهذا الأمر أيضا لا يعتمد على الوقت . يبنغي عليك عند الإنتهاء من أى درس خصوصا دروس الأساسيات أن تقوم بالتمرين على هذا الدرس مباشرة وحل تمارين إلى أن تتأكد من فهمك التام له وأنك تستطيع التطبيق عليه دون مشكلة. ومن الممكن أن مشكلة عدم فهم المكتبات أو الأكواد هو بسبب عدم فهم الأساسيات بشكل عام أو عدم التطبيق عليها . وإذا ما واجهتك أى مشكلة يمكنك دوما السؤال أسفل الدرس . ويمكنك قراءة النصائح التالية لكيفية وضع خطة لك وأفضل طريقة لمذاكرة الدورة :
  19. هذا هو الكود كان يوجد مشكلة في إضافة البيانات . إليك الكود بعد التعديل : <?php include('header.php'); error_reporting(0); ini_set('display_errors', 0); function calculateVacationBalance($con, $emp_id, $type, $hire_date, $birth_date, $gender, $to_date) { $to = new DateTime($to_date); $hire = new DateTime($hire_date); $birth = new DateTime($birth_date); $current_year = $to->format('Y'); // حساب سنوات الخدمة $service_years = $to->diff($hire)->y; // حساب العمر $age = $to->diff($birth)->y; // استعلام للحصول على الأيام المستخدمة $stmt = $con->prepare(" SELECT COALESCE(SUM(DATEDIFF(end_date, start_date) + 1), 0) AS used_days FROM vacations WHERE emp_id = ? AND type = ? AND accept = 1 AND YEAR(start_date) = ? "); $stmt->bind_param("iss", $emp_id, $type, $current_year); $stmt->execute(); $stmt->bind_result($used_days); $stmt->fetch(); $stmt->close(); $used_days = $used_days ?: 0; switch ($type) { case 'اجازة سنوية': // 30 يومًا سنويًا، 45 يومًا إذا كان العمر ≥ 50 أو الخدمة ≥ 20 سنة $annual_days = ($age >= 50 || $service_years >= 20) ? 45 : 30; $balance = $annual_days - $used_days; // التأكد من أن الرصيد لا يقل عن 15 يومًا متصلة إذا لم يتم استخدامها return max(0, $balance); case 'اجازة مرضية': // 45 يومًا متصلة أو 60 يومًا متقطعة سنويًا $sick_balance = 60 - $used_days; return max(0, $sick_balance); case 'اجازة الحج': // 20 يومًا مرة واحدة خلال الخدمة $stmt = $con->prepare(" SELECT COUNT(*) AS taken FROM vacations WHERE emp_id = ? AND type = 'اجازة الحج' AND accept = 1 "); $stmt->bind_param("i", $emp_id); $stmt->execute(); $stmt->bind_result($taken); $stmt->fetch(); $stmt->close(); return $taken > 0 ? 0 : 20; case 'اجازة زواج': // 14 يومًا مرة واحدة خلال الخدمة $stmt = $con->prepare(" SELECT COUNT(*) AS taken FROM vacations WHERE emp_id = ? AND type = 'اجازة زواج' AND accept = 1 "); $stmt->bind_param("i", $emp_id); $stmt->execute(); $stmt->bind_result($taken); $stmt->fetch(); $stmt->close(); return $taken > 0 ? 0 : 14; case 'اجازة وفاة الزوج': // 130 يومًا (4 أشهر و10 أيام) للإناث فقط، مرة واحدة if ($gender !== 'أنثى') { return 0; } $stmt = $con->prepare(" SELECT COUNT(*) AS taken FROM vacations WHERE emp_id = ? AND type = 'اجازة وفاة الزوج' AND accept = 1 "); $stmt->bind_param("i", $emp_id); $stmt->execute(); $stmt->bind_result($taken); $stmt->fetch(); $stmt->close(); return $taken > 0 ? 0 : 130; default: return 0; } } ?> <head> <script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script> <link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.13/css/select2.min.css" rel="stylesheet" /> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.13/js/select2.min.js"></script> <style> .rak { width: 400px; height: 300px; font-size: 14px !important; } </style> </head> <div class="col-md-9 pan1"> <ol class="breadcrumb" style="background-color: #fff;padding-top:8px;padding-bottom:8px;color:#000;font-size:16px;"> <li><a href="vacations.php">الاجازات</a></li> <li class="active">اضافة اجازة جديد</li> </ol> </div> </div> <div class="row"> <div class="col-md-9 pan1"> <div class="panel" style="color:#000;"> <div class="panel-body" style="font-size:14px; padding-left:40px;padding-right:40px;padding-bottom:25px;padding-top:25px;"> <form method="POST" enctype="multipart/form-data"> <div class="row"> <div class="col-md-4"> <div class="form-group" style="margin-top:10px;"> <label>الموظف</label> <select name="emp_id" id=""> <?php $sql = "SELECT e.person_id, p.name FROM employees e JOIN people p ON e.person_id = p.id;"; $result = $con->query($sql); while ($row = $result->fetch_assoc()) { echo "<option value='{$row['person_id']}'>{$row['name']}</option>"; } ?> </select> </div> </div> <div class="col-md-4"> <div class="form-group" style="margin-top:10px;"> <label>نوع الاجازة</label> <select name="type" id=""> <option value="اجازة سنوية">اجازة سنوية</option> <option value="اجازة مرضية">اجازة مرضية</option> <option value="اجازة الحج">اجازة الحج</option> <option value="اجازة زواج">اجازة زواج</option> <option value="اجازة وفاة الزوج">اجازة وفاة الزوج</option> </select> </div> </div> <div class="col-md-4"> <div class="form-group" style="margin-top:10px;"> <label>تاريخ البداية</label> <input name="start_date" type="date" class="form-control"> </div> </div> </div> <div class="row"> <div class="col-md-4"> <div class="form-group" style="margin-top:10px;"> <label>تاريخ المباشرة</label> <input name="end_date" type="date" class="form-control"> </div> </div> <div class="col-md-4"> <div class="form-group" style="margin-top:10px;"> <label>سبب الاجازة</label> <input name="reason" type="text" class="form-control" placeholder="ادخل سبب الاجازة"> </div> </div> <div class="col-md-4"> <div class="form-group" style="margin-top:10px;"> <label>الموافقة مسبقا</label> <input name="companion" type="checkbox" class="form-control"> </div> </div> </div> <div class="row"> <div class="col-md-4"> <div class="form-group" style="margin-top:10px;"> <button name="submit" type="submit" class="btn btn-primary">إضافة <span class="ion-android-add"></span></button> <button type="reset" class="btn btn-danger">إلغاء <span class="ion-android-delete"></span></button> </div> </div> </div> </form> <?php if ($_SERVER["REQUEST_METHOD"] == "POST") { $emp_id = $_POST['emp_id']; $type = $_POST['type']; $start_date = $_POST['start_date']; $end_date = $_POST['end_date']; $reason = $_POST['reason']; $companion = isset($_POST['companion']) ? 1 : 0; $created_at = date('Y-m-d H:i:s'); $start = new DateTime($start_date); $end = new DateTime($end_date); $interval = $start->diff($end); $years = $interval->y; $months = $interval->m; $days = $interval->d; $errors = []; if (empty($type)) { $errors[] = 'يجب تحديد نوع الإجازة'; } if (empty($start_date)) { $errors[] = 'يجب إدخال تاريخ بداية الإجازة'; } if (empty($end_date)) { $errors[] = 'يجب إدخال تاريخ المباشرة'; } if ($end <= $start) { $errors[] = 'تاريخ المباشرة يجب أن يكون بعد بداية الإجازة'; } if (!empty($errors)) { echo implode('<br>', $errors); exit; } mysqli_begin_transaction($con); try { $stmt = $con->prepare("SELECT * FROM employees WHERE person_id = ?"); $stmt->bind_param("i", $emp_id); $stmt->execute(); $employee = $stmt->get_result()->fetch_assoc(); $stmt->close(); if (!$employee) { echo "لم يتم العثور على بيانات الموظف"; exit; } // تحقق لا يوجد إجازة قيد الإجراء $stmt = $con->prepare("SELECT COUNT(*) FROM vacations WHERE emp_id = ? AND accept = 0"); $stmt->bind_param("i", $emp_id); $stmt->execute(); $stmt->bind_result($count); $stmt->fetch(); $stmt->close(); if ($count > 0) { echo "عذرًا، هنالك إجازة قيد الإجراء للموظف الحالي، الرجاء التحقق."; exit(); } $stmt = $con->prepare("SELECT * FROM people WHERE id = ?"); $stmt->bind_param("i", $emp_id); $stmt->execute(); $people = $stmt->get_result()->fetch_assoc(); $stmt->close(); if ($type == "اجازة سنوية") { $to_date = $start_date; $hire_date = $employee->start_date; $birth_date = $people->birth_date; $to = new DateTime($to_date); $hire = new DateTime($hire_date); $birth = new DateTime($birth_date); $service_years = $to->diff($hire)->y; $age = $to->diff($birth)->y; // تحديد الحد الأقصى للإجازة السنوية $max_annual_days = ($age >= 50 || $service_years >= 20) ? 45 : 30; // حساب عدد أيام الإجازة المطلوبة $start = new DateTime($start_date); $end = new DateTime($end_date); $interval = $start->diff($end); $requested_days = $interval->days + 1; // التحقق من أن عدد أيام الإجازة المطلوبة لا يتجاوز الحد الأقصى if ($requested_days > $max_annual_days) { echo "لا يمكنك طلب إجازة سنوية تتجاوز " . $max_annual_days . " يومًا. الحد الأقصى المسموح به هو: " . $max_annual_days . " يومًا."; exit; } } if ($type == "اجازة مرضية") { $stmt = $con->prepare("SELECT COALESCE(SUM(DATEDIFF(end_date,start_date)+1),0) FROM vacations WHERE emp_id = ? AND type = 'اجازة مرضية' AND accept = 1 AND YEAR(start_date)=?"); $stmt->bind_param("ii", $emp_id, $current_year); $stmt->execute(); $stmt->bind_result($used); $stmt->fetch(); $stmt->close(); if ($requested_days > 45) { echo 'الحد الأقصى المستمر للإجازة المرضية هو 45 يوم.'; exit; } if (($used + $requested_days) > 60) { $left = 60 - $used; echo "المتبقى من رصيد الإجازة المرضية هذا العام هو $left يوم."; exit; } } if ($type == "اجازة الحج") { $stmt = $con->prepare("SELECT COUNT(*) FROM vacations WHERE emp_id=? AND type='اجازة الحج' AND accept=1"); $stmt->bind_param("i", $emp_id); $stmt->execute(); $stmt->bind_result($taken); $stmt->fetch(); $stmt->close(); if ($taken) { echo 'تمّ الحصول على إجازة الحج من قبل، لا تُمنح إلا مرة واحدة.'; exit; } if ($requested_days > 20) { echo 'الحد الأقصى لإجازة الحج 20 يوم.'; exit; } } if ($type == "اجازة زواج") { $stmt = $con->prepare("SELECT COUNT(*) FROM vacations WHERE emp_id=? AND type='اجازة زواج' AND accept=1"); $stmt->bind_param("i", $emp_id); $stmt->execute(); $stmt->bind_result($taken); $stmt->fetch(); $stmt->close(); if ($taken) { echo 'تمّ الحصول على إجازة زواج سابقًا، لا تُمنح إلا مرة واحدة.'; exit; } if ($requested_days > 14) { echo 'الحد الأقصى لإجازة الزواج هو 14 يوم.'; exit; } } if ($type == "اجازة وفاة الزوج") { if ($gender != 'أنثى') { echo 'إجازة وفاة الزوج خاصة بالإناث فقط.'; exit; } $stmt = $con->prepare("SELECT COUNT(*) FROM vacations WHERE emp_id=? AND type='اجازة وفاة الزوج' AND accept=1"); $stmt->bind_param("i", $emp_id); $stmt->execute(); $stmt->bind_result($taken); $stmt->fetch(); $stmt->close(); if ($taken) { echo 'تمّ الحصول على هذه الإجازة سابقًا، لا تُمنح إلا مرة واحدة.'; exit; } if ($requested_days != 130) { echo 'مدة الإجازة هى 4 أشهر و10 أيام (130 يوم) ويجب إدخال المدة كاملة.'; exit; } } $stmt = $con->prepare("INSERT INTO vacations (emp_id, years, months, days, reason, companion, type, start_date, end_date, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); $start_date_formatted = $start->format('Y-m-d'); $end_date_formatted = $end->format('Y-m-d'); $stmt->bind_param( 'iiiisissss', $emp_id, $years, $months, $requested_days, // الآن أصبحت days هي فارق الأيام $reason, $companion, $type, $start_date_formatted, $end_date_formatted, $created_at ); if ($stmt->execute()) { echo "<script> Swal.fire({ title: 'رسالة تأكيد', text: 'تم إضافة بيانات اجازة موظف بنجاح!', icon: 'success', customClass: 'rak', }); </script>"; echo '<meta http-equiv="refresh" content="2;url=vacations.php" />'; } $stmt->close(); mysqli_commit($con); } catch (Exception $e) { mysqli_rollback($con); echo "خطأ: " . $e->getMessage(); exit; } } ?> </div> </div> </div> </div> <?php include('footer.php'); ?> إذا حدثت مشكلة يرجى إرفاق المشكلة هنا.
  20. لم تقل إسم العمود الذي يتم تخزين البيانات فيها في جدول people و employees . عموما يرجى إضافة الكود التالي قبل سطر 244 مباشرة : $to_date = $start_date; $hire_date = $employee->hire_date; $birth_date = $people->birth_date; وتأكد من إستبدال hire_date و birth_date بأسماء الأعمدة لديك . وهنا لا أقصد المتغيرات بل أقصد في employee و people . ويجب ان يعمل معك .
  21. وعليكم السلام ورحمة الله وبركاته. المنطق في الكود صحيح ولكن الخطأ في المتغيرات والبيانات التي تستخدمها. أولا يجب الإنتباه إلى أن الدالة calculateVacationBalance لديك لا يتم إستخدامها فقط تم تعريفها. أما المشكلة الرئيسية لديك هنا في هذا الجزء . لاحظ في هذا الجزء أنت تستخدم المتغيرات to_date و hire_date و birth_date وتلك المتغيرات لم يتم تعريفهم وإحضارهم من قاعدة البيانات. لهذا يتم حساب جميع تلك التواريخ من التاريخ الحالي . أى أن تاريخ to و تاريخ hire و تاريخ birth يصبحان التاريخ الحالي عند تنفيذ الكود . ولهذا عندما يتم إحتساب الفرق يظهر الفرق دائما ب 0 . أى أنه يحسب عمر الشخص ب 0 و مدة التعيين ب 0 أيضا لهذا لا يعمل المنطق لديك. لذلك يجب عليك إحضار بيانات تاريخ الميلاد و بيانات موعد التعين ووضعها في المتغيرات hire_date و birth_date وسيعمل معك . يرجى توضيح أين يتم تخزين تلك البيانات في قاعدة البيانات لمساعدتك في هذا الأمر.
  22. وعليكم السلام ورحمة الله وبركاته. أولا يجب عليك إنشاء جدول في قاعدة البيانات ليحوي رمز إعادة تعين كلمة المرور . ولنقوم بتسمية الجدول بإسم password_resets وهذا هو إستعلام إنشاء الجدول : CREATE TABLE password_resets ( email VARCHAR(255) NOT NULL, token VARCHAR(255) NOT NULL, expires_at DATETIME NOT NULL ); هنا في جدول نقوم بحفظ البريد الإلكتروني و ال token الخاص بإعادة التعين . وتاريخ الإنتهاء الخاص بالرمز token. ولنقوم بإنشاء صفحة لطلب إعادة تعين كلمة المرور وليكن إسم الملف هو request_reset.php: <?php use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; require 'vendor/autoload.php'; if ($_SERVER["REQUEST_METHOD"] == "POST") { $email = $_POST['email']; $pdo = new PDO("mysql:host=localhost;dbname=databasename", "username", "password"); $stmt = $pdo->prepare("SELECT * FROM users WHERE email = ?"); $stmt->execute([$email]); if ($stmt->rowCount() > 0) { $token = bin2hex(random_bytes(32)); $expires = date("Y-m-d H:i:s", time() + 3600); // تاريخ الصلاحية هو ساعة واحدة // حذف أي رمز سابق موجود $pdo->prepare("DELETE FROM password_resets WHERE email = ?")->execute([$email]); $stmt = $pdo->prepare("INSERT INTO password_resets (email, token, expires_at) VALUES (?, ?, ?)"); $stmt->execute([$email, $token, $expires]); // أرسل البريد الإلكتروني $resetLink = "https://yourdomain.com/reset_password.php?token=$token"; $mail = new PHPMailer(true); try { // إعدادات SMTP $mail->isSMTP(); $mail->Host = 'smtp.gmail.com'; $mail->SMTPAuth = true; $mail->Username = 'your_email@gmail.com'; $mail->Password = 'your_app_password'; // كلمة مرور التطبيق $mail->SMTPSecure = 'tls'; $mail->Port = 587; // تفاصيل الرسالة $mail->setFrom('your_email@gmail.com', 'اسم الموقع'); $mail->addAddress($email); $mail->Subject = 'إعادة تعيين كلمة المرور'; $mail->Body = "انقر على الرابط التالي لإعادة تعيين كلمة المرور:\n\n$resetLink\n\nالرابط صالح لمدة ساعة."; $mail->send(); echo "تم إرسال رابط إعادة تعيين كلمة المرور إلى بريدك الإلكتروني."; } catch (Exception $e) { echo "حدث خطأ أثناء إرسال البريد: {$mail->ErrorInfo}"; } } else { echo "البريد الإلكتروني غير مسجل."; } } ?> <form method="POST"> البريد الإلكتروني: <input type="email" name="email" required> <button type="submit">إرسال الرابط</button> </form> ولكن يجب أولا مكتبة PHPMailer من خلال الأمر : composer require phpmailer/phpmailer وأيضا تأكد من وضع إعدادات ال smtp الخاصة بالبريد الذي ستقوم بإرسال الرسائل منه. وأخيرا صفحة إعادة تعيين كلمة المرور reset_password.php : <?php if ($_SERVER["REQUEST_METHOD"] == "POST") { $token = $_POST['token']; $newPassword = $_POST['password']; $pdo = new PDO("mysql:host=localhost;dbname=yourdb", "username", "password"); $stmt = $pdo->prepare("SELECT * FROM password_resets WHERE token = ? AND expires_at > NOW()"); $stmt->execute([$token]); $reset = $stmt->fetch(); if ($reset) { $hashedPassword = password_hash($newPassword, PASSWORD_DEFAULT); $stmt = $pdo->prepare("UPDATE users SET password = ? WHERE email = ?"); $stmt->execute([$hashedPassword, $reset['email']]); $pdo->prepare("DELETE FROM password_resets WHERE email = ?")->execute([$reset['email']]); echo "تم تغيير كلمة المرور بنجاح."; } else { echo "الرابط غير صحيح أو إنتهت صلاحيته."; } } elseif (isset($_GET['token'])) { $token = $_GET['token']; ?> <form method="POST"> <input type="hidden" name="token" value="<?= htmlspecialchars($token) ?>"> كلمة المرور الجديدة: <input type="password" name="password" required> <button type="submit">إعادة التعيين</button> </form> <?php } else { echo "الرابط غير صحيح."; } ?>
  23. يجب الذهاب إلى الإعدادات settings . ثم الذهاب إلى Apps ثم Default Apps : ثم في ال Web browser يرجى إختيار chrome او المتصفح الذي تريده.
  24. وعليكم السلام ورحمة الله وبركاته. إن الدورات هنا في الأكاديمية تم تصميمها بعناية وترتيب مناسب للمبتدئين . حيث تم تقسم الدورة إلى عدة مسارات وكل مسار تم تقسيمه إلى عدة أقسام والأقسام تحتوي على الدروس . لهذا يجب عليك دراسة الدورة كما هي بالترتيب حيث تبدأ بالمسارات الأولى وهي الخاصة بدراسة الأساسيات و التطبيق مع المدرب وحل التمارين المطلوبة . وتأكد من عدم تخطي أى درس دون فهمه تماما والتطبيق عليه مع المدرب . وإذا واجهتك أى مشكلة أو صعوبة في جزء ما يمكنك السؤال دائما أسفل الدرس الذي توجد به مشكلتك وسيتم المتابعة معك من خلال المدربين الموجودين في الأكاديمية. وبالنسبة للطريقة الصحيحة للتعلم تختلف من شخص لآخر، ولكن بشكل عام ينصح بتسجيل المعلومات التي تستوعبها من خلال كتابة ملاحظات أو إجراء ملخصات أو حل تمارين. كما يمكنك مشاهدة الفيديو أكثر من مرة إذا شعرت بأنك بحاجة إلى توضيح أو تعميق أكثر وعدم تخطيه دون فهمه تماما كما وضحت لك سابقا. ، ثم بعد ذلك يمكنك التدرب عن طريق التطبيق عمليا على ماتعلمته من خلال القيام بتمارين عملية وتطبيق الأفكار التي تم تعلمها. و يفضل متابعة الفيديوهات أكثر من مرة لضمان فهمك للدرس جيدًا، ويفضل أيضًا أن تقوم بالتطبيق العملي لما تعلمته فور انتهاء كل درس وذلك لتثبيت المفاهيم وتطوير مهاراتك العملية. ويمكنك قراءة المزيد من التفاصيل والنصائح من خلال الإجابات التالية :
  25. وعليكم السلام ورحمة الله وبركاته. إن تعلم Odoo ليس أمر ضروري لمطورين ال back end والمتخصصين في Laravel و Node.js . حيث إن odoo هو نظام مفتوح المصدر لإدارة الأعمال (ERP) يهدف إلى دمج مختلف الوظائف التجارية والإدارية في منصة واحدة. ويستخدم بشكل واسع من قبل الشركات الصغيرة والمتوسطة والكبيرة لتسهيل إدارة العمليات اليومية مثل المحاسبة و المخزون و المبيعات و إدارة العملاء والموارد البشرية والعديد من الوظائف الأخرى. وهو قائم على لغة بايثون . وإن مطورين odoo مختلفين تماما عن مطورين laravel و Node.js ولهم مسمى وظيفي منفصل. لهذا إذا لم تكن تريد أن تعمل على مشروع odoo او تعمل في تطوير تطبيقات odoo وإضافة أنظمة بها أو لا تريد التقديم على شركات تعمل بشكل أساسي على odoo فإذا لا داعي لتعلمه وهذا ليس إختصاصك . ويجب عليك التركيز على جزء واحد معين إما php مع laravel أو java script مع Node.js أو odoo .
×
×
  • أضف...