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

السؤال

نشر (معدل)

السلام عليكم انا اقوم بتحويل كود داخل دالة store  الي php pure  ممكن مساعدة في باقي 

 request()->validate(
        [
            'type'  => "required",
            'start_date'  => "required",
            'end_date' => 'required',
        ],
        [
            'type.required' => 'يجب تحديد نوع الاجازة',
            'start_date.required' => 'يجب إدخال تاريخ بداية الإجازة',
            'end_date.required' => 'يجب ادخال تاريخ المباشرة',
        ]);
        DB::beginTransaction();
        try {
            $vac = new Vacation;
            if($id == 0){
                $emp = Employee::find(request('emp_id'));
            }else{
                $emp = Employee::find($id);
            }
            if(Vacation::where([['emp_id', $emp->id],['accept', false]])->exists()){
                DB::rollback();
                return redirect()->back()->with('error','عذرآ ولكن هنالك أجازة قيد الاجراء للموظف الحالي الرجاء التحقق');
            }
            if(!request('years') && !request('months') && !request('days')){
                DB::rollback();
                return redirect()->back()->with('error','عذرآ ولكن يجب تعبئة إحدي الخانات علي الاقل (السنوات ,الاشهر ,الايام)');
            }
            if(request('type') == "إجازة وضع" && $emp->gender == 1 && $emp->status == 1){
                DB::rollback();
                return redirect()->back()->with('error','عذرآ ولكن لا يمكن أعطاء هذا النوع من الاجازة للموظف المختار');
            }
            if(request('type') == "إجازة زواج" && $emp->vacations()->where("type", "إجازة زواج")->count() != 0 && $emp->status == 0 ){
                DB::rollback();
                return redirect()->back()->with('error','عذرآ الموظف المختار قد تحصل علي أجاة زواج مسبقآ');
            }
            $vac->emp_id = $emp->id;
            $vac->type = request('type');
            if(request('type') == "إجازة سنوية"){
                $vac->days = request('days');

                $date = Carbon::createFromFormat('Y-m-d', $emp->start_date);
                $date = $date->addYear();
                $date =  $date->toDateString();

                if($emp->vacations){
                    $vacationBalance = $this->calculateVacationBalance($date, $emp->vacations->where('accept', true)->sum("days"));
                }else{
                    $vacationBalance = $this->calculateVacationBalance($date, 0);
                }
                if($vacationBalance < $vac->days){
                    DB::rollback();
                    return redirect()->back()->with('error','عذرآ لايمكن أنشاء إجازة وذلك لعدم توفر الرصيد الكافي...');
                }

هذا كودي انا 

 if ($_SERVER["REQUEST_METHOD"] == "POST")
                 {
                    $emp_id = $_POST['emp_id']; // يتم تخزين 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');
                 }
                    $stmt = $con->prepare("SELECT * FROM people WHERE id = ?");
                    $stmt->bind_param("i", $emp_id);
                    $stmt->execute();
                    $result = $stmt->get_result();
                
                    if ($result->num_rows > 0)
                     {
                        $row = $result->fetch_assoc();
                        $gender = $row['gender'];
                     }
                        if ($type == "اجازة وضع" && $gender == "ذكر") 
                        {
                            echo "عذرآ ولكن لا يمكن إعطاء هذا النوع من الإجازة للموظف المختار لأنه ذكر.";
                        }
                      
                        if ($type == "اجازة زواج")
                         {
                            $stmt = $con->prepare("SELECT COUNT(*) FROM vacations WHERE emp_id = ? AND type = ?");
                            $stmt->bind_param("is", $emp_id, $type);
                            $stmt->execute();
                            $stmt->bind_result($count);
                            $stmt->fetch();
                            $stmt->close(); 
                        
                            if ($count > 0) {
                                echo "لديك إجازة زواج مسبقًا، لا يمكنك أخذها مرة أخرى.";
                                exit();
                            }
                        }
                        if ($type == "اجازة سنوية")
                        {
                            $startDate = new DateTime($start_date);
                             $endDate = new DateTime($end_date);
                          $interval = $startDate->diff($endDate);
                           $daysDiff = $interval->days+1;  //عدد ايام بين تاريخ بداية اجازة وتاريخ نهاية اجازة
                           $stmt = $con->prepare("SELECT * FROM employees WHERE person_id= ?"); //جلب تاريخ مباشرة موظف
                           $stmt->bind_param("i", $emp_id);
                           $stmt->execute();
                           $result = $stmt->get_result();
                           
                           if ($result->num_rows > 0) {
                               $row = $result->fetch_assoc();
                               $s_date = new DateTime($row['start_date']); 
                               $s_date->modify('+1 year'); 
                                $s_date->format('Y-m-d');
                           }
                              
                        }

ممكن شرح جزئية باقية اخواني الكرام 

if($emp->vacations){
                    $vacationBalance = $this->calculateVacationBalance($date, $emp->vacations->where('accept', true)->sum("days"));
                }else{
                    $vacationBalance = $this->calculateVacationBalance($date, 0);
                }
                if($vacationBalance < $vac->days){
                    DB::rollback();
                    return redirect()->back()->with('error','عذرآ لايمكن أنشاء إجازة وذلك لعدم توفر الرصيد الكافي...');
                }

 

تم التعديل في بواسطة ايمن ميلاد

Recommended Posts

  • 0
نشر

أنه كود لارافل و الكود يتعامل مع رصيد الإجازة السنوية للموظف، ويتحقق مما إذا كان لديه رصيد كافٍ لأخذ الإجازة المطلوبة. يعتمد هذا على دالة

calculateVacationBalance 

التي تحتاج إلى معرفة كيفية عملها. بما أنك لم تقدم الكود الكامل للدالة، سأفترض أنها تحسب رصيد الإجازة بناءً على تاريخ معين (مثل السنة الأولى بعد بدء العمل) وعدد الأيام المستخدمة مسبقًا.

الكود المحول 

// استكمال الكود الخاص بك داخل شرط "اجازة سنوية"
if ($type == "اجازة سنوية") {
    $startDate = new DateTime($start_date);
    $endDate = new DateTime($end_date);
    $interval = $startDate->diff($endDate);
    $daysDiff = $interval->days + 1; // عدد أيام الإجازة المطلوبة

    // جلب تاريخ بدء العمل للموظف
    $stmt = $con->prepare("SELECT start_date FROM employees WHERE person_id = ?");
    $stmt->bind_param("i", $emp_id);
    $stmt->execute();
    $result = $stmt->get_result();

    if ($result->num_rows > 0) {
        $row = $result->fetch_assoc();
        $s_date = new DateTime($row['start_date']);
        $s_date->modify('+1 year'); // إضافة سنة إلى تاريخ بدء العمل
        $s_date = $s_date->format('Y-m-d');
    } else {
        echo "خطأ: لا يوجد موظف بهذا المعرف.";
        exit();
    }

    // التحقق من وجود إجازات سابقة
    $stmt = $con->prepare("SELECT SUM(days) as total_days FROM vacations WHERE emp_id = ? AND accept = 1");
    $stmt->bind_param("i", $emp_id);
    $stmt->execute();
    $result = $stmt->get_result();
    $row = $result->fetch_assoc();
    $used_days = $row['total_days'] ? $row['total_days'] : 0;

    // حساب رصيد الإجازة (بديل لـ calculateVacationBalance)
    $annual_vacation_days = 21; // افتراض: 21 يوم إجازة سنوية
    $vacation_balance = $annual_vacation_days - $used_days;

    // التحقق من كفاية الرصيد
    if ($vacation_balance < $daysDiff) {
        echo "عذرًا، لا يمكن إنشاء إجازة وذلك لعدم توفر الرصيد الكافي.";
        exit();
    }

    // إذا كان الرصيد كافيًا، يمكنك متابعة إدخال الإجازة في قاعدة البيانات
    $stmt = $con->prepare("INSERT INTO vacations (emp_id, type, days, start_date, end_date, reason, companion, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)");
    $stmt->bind_param("isisssis", $emp_id, $type, $daysDiff, $start_date, $end_date, $reason, $companion, $created_at);
    if ($stmt->execute()) {
        echo "تم إنشاء الإجازة بنجاح.";
    } else {
        echo "خطأ أثناء إنشاء الإجازة.";
    }
    $stmt->close();
}

والكود التالي 

if($emp->vacations)

يتحقق مما إذا كان للموظف إجازات مسجلة سابقًا و الكود التالي 

$vacationBalance = $this->calculateVacationBalance($date, $emp->vacations->where('accept', true)->sum("days"));

يقوم بحساب رصيد الأجازة و الكود التالي 

$vacationBalance = $this->calculateVacationBalance($date, 0);

إذا لم يكن هناك إجازات، يتم تمرير 0 كعدد الأيام المستخدمة، و الكود التالي 

if($vacationBalance < $vac->days)

إذا كان رصيد الإجازة أقل من عدد الأيام المطلوبة ($vac->days)، يتم إلغاء العملية (rollback) وإظهار رسالة خطأ.

  • 0
نشر

هادي دالة 

function calculateVacationBalance($startDate, $usedDays) {
    $start = new DateTime($startDate);
    $now = new DateTime(); 
    $totalAccruedDays = 0;

    if ($start->format('n') > 6) {
        $start->setDate($start->format('Y') + 1, 1, 1); 
    } elseif ($start->format('n') < 6 || ($start->format('n') == 6 && $start->format('j') > 1)) {
        $start->setDate($start->format('Y'), 6, 1); 
    } elseif ($start->format('n') == 1 && $start->format('j') > 1) {
        $start->setDate($start->format('Y'), 6, 1); 
    }

    while ($start <= $now) {
        $totalAccruedDays =$totalAccruedDays+ 15; 
        $start->modify('+6 months');
    }

    $totalAccruedDays =$totalAccruedDays- $usedDays; 
    return $totalAccruedDays;
}

 

  • 0
نشر

وعليكم السلام ورحمة الله وبركاته .

بتاريخ 13 دقائق مضت قال ايمن ميلاد:
if($emp->vacations){

في هذا الجزء نحن نتحقق من أن الموظف لديه أجازات سابقة أم لا . أى أننا نحضر جميع الأجازات الخاصة بالموظف ونتحقق هل توجد أجازات أم لا .

وإذا كان يوجد أجازات لديه ننفذ السطر التالي :

بتاريخ 13 دقائق مضت قال ايمن ميلاد:
                    $vacationBalance = $this->calculateVacationBalance($date, $emp->vacations->where('accept', true)->sum("days"));

وهذا السطر يقوم بإستدعاء الدالة calculateVacationBalance ويقوم بتمرير لها التاريخ و أيضا الأجازات التي تم الموافقه عليها لهذا الموظف .

ولكن لو لم يكن للموظف أجازات سابقة يتم تنفيذ جزء else :

بتاريخ 13 دقائق مضت قال ايمن ميلاد:
                    $vacationBalance = $this->calculateVacationBalance($date, 0);

وهنا هو نفس الكود السابق ولكن الإختلاف هو مررنا رقم 0 بدلا من اجازات الموظف .

ويمكننا تحويل الكود السابق إلى php مباشرة وأيضا دون الحاجة إلى شرط if هكذا :

// جلب جميع الإجازات المقبولة للموظف
$stmt = $con->prepare("SELECT SUM(days) AS total_days FROM vacations WHERE emp_id = ? AND accept = 1");
$stmt->bind_param("i", $emp_id);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc();
$totalAcceptedDays = $row['total_days'] ?? 0; // هنا لو لم يوجد أجازات إذا هذا جزء else في الكود السابق لذلك نضع 0

$vacationBalance = calculateVacationBalance($s_date->format('Y-m-d'), $totalAcceptedDays);

ولكن تأكد من وجود الدالة calculateVacationBalance لديك كما في لارافيل ليعمل الكود .

بتاريخ 13 دقائق مضت قال ايمن ميلاد:
                if($vacationBalance < $vac->days){
                    DB::rollback();
                    return redirect()->back()->with('error','عذرآ لايمكن أنشاء إجازة وذلك لعدم توفر الرصيد الكافي...');
                }
 

الآن هنا نحن نتحقق من رصيد الأجازات هل يسمح للأجازة الحالية التي يتم إضافتها أم لا . إذا لم يكن هناك رصيد نعيد رسالة خطأ ولا نقوم بتنفيذ شئ وهذا هو الكود البديل له :

if ($vacationBalance < $daysDiff) {
    echo "عذرآ لايمكن إنشاء إجازة وذلك لعدم توفر الرصيد الكافي...";
    exit();
}

 

  • 0
نشر
بتاريخ 2 دقائق مضت قال ايمن ميلاد:

هادي دالة 

function calculateVacationBalance($startDate, $usedDays) {
    $start = new DateTime($startDate);
    $now = new DateTime(); 
    $totalAccruedDays = 0;

    if ($start->format('n') > 6) {
        $start->setDate($start->format('Y') + 1, 1, 1); 
    } elseif ($start->format('n') < 6 || ($start->format('n') == 6 && $start->format('j') > 1)) {
        $start->setDate($start->format('Y'), 6, 1); 
    } elseif ($start->format('n') == 1 && $start->format('j') > 1) {
        $start->setDate($start->format('Y'), 6, 1); 
    }

    while ($start <= $now) {
        $totalAccruedDays =$totalAccruedDays+ 15; 
        $start->modify('+6 months');
    }

    $totalAccruedDays =$totalAccruedDays- $usedDays; 
    return $totalAccruedDays;
}

 

الدالة تأخذ تاريخ بدء

($startDate)

وعدد الأيام المستخدمة

($usedDays)

وتحسب رصيد الإجازة المتاح حيث تعديل تاريخ البداية، إذا كان الشهر أكبر من يونيو (> 6)، يتم تعيين تاريخ البداية إلى 1 يناير من السنة التالية و إذا كان الشهر أقل من يونيو أو يساوي يونيو ولكن اليوم أكبر من 1، يتم تعيين تاريخ البداية إلى 1 يونيو من نفس السنة و إذا كان الشهر يناير واليوم أكبر من 1، يتم تعيين تاريخ البداية إلى 1 يونيو من نفس السنة و يتم حساب الأيام المتراكمة، يتم إضافة 15 يوم إجازة كل 6 أشهر (نصف سنوية) طالما أن تاريخ البداية أقل من أو يساوي التاريخ الحالي و يتم تحديث تاريخ البداية بإضافة 6 أشهر في كل تكرار و من ثم يتم  طرح عدد الأيام المستخدمة

($usedDays)

من إجمالي الأيام المتراكمة

($totalAccruedDays)

ثم تقوم بإرجاع رصيد الإجازة النهائي.

الكود كامل محول مع الدالة 

<?php
// دالة calculateVacationBalance
function calculateVacationBalance($startDate, $usedDays) {
    $start = new DateTime($startDate);
    $now = new DateTime(); 
    $totalAccruedDays = 0;

    if ($start->format('n') > 6) {
        $start->setDate($start->format('Y') + 1, 1, 1); 
    } elseif ($start->format('n') < 6 || ($start->format('n') == 6 && $start->format('j') > 1)) {
        $start->setDate($start->format('Y'), 6, 1); 
    } elseif ($start->format('n') == 1 && $start->format('j') > 1) {
        $start->setDate($start->format('Y'), 6, 1); 
    }

    while ($start <= $now) {
        $totalAccruedDays += 15; 
        $start->modify('+6 months');
    }

    $totalAccruedDays -= $usedDays; 
    return $totalAccruedDays;
}

// الكود الرئيسي
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');

    // الاتصال بقاعدة البيانات (افترض أن $con معرف مسبقًا)
    // $con = mysqli_connect("localhost", "username", "password", "database");

    // بدء المعاملة
    mysqli_begin_transaction($con);

    try {
        // التحقق من وجود الموظف
        $stmt = $con->prepare("SELECT gender FROM people WHERE id = ?");
        $stmt->bind_param("i", $emp_id);
        $stmt->execute();
        $result = $stmt->get_result();

        if ($result->num_rows > 0) {
            $row = $result->fetch_assoc();
            $gender = $row['gender'];
        } else {
            throw new Exception("الموظف غير موجود.");
        }

        // التحقق من إجازة وضع
        if ($type == "إجازة وضع" && $gender == "ذكر") {
            throw new Exception("عذرًا، لا يمكن إعطاء هذا النوع من الإجازة للموظف المختار لأنه ذكر.");
        }

        // التحقق من إجازة زواج
        if ($type == "إجازة زواج") {
            $stmt = $con->prepare("SELECT COUNT(*) FROM vacations WHERE emp_id = ? AND type = ?");
            $stmt->bind_param("is", $emp_id, $type);
            $stmt->execute();
            $stmt->bind_result($count);
            $stmt->fetch();
            $stmt->close();

            if ($count > 0) {
                throw new Exception("لديك إجازة زواج مسبقًا، لا يمكنك أخذها مرة أخرى.");
            }
        }

        // التحقق من وجود إجازة قيد الإجراء
        $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) {
            throw new Exception("عذرًا، هنالك إجازة قيد الإجراء للموظف الحالي، الرجاء التحقق.");
        }

        // التحقق من تعبئة المدة
        if (empty($_POST['years']) && empty($_POST['months']) && empty($_POST['days'])) {
            throw new Exception("عذرًا، يجب تعبئة إحدى الخانات على الأقل (السنوات، الأشهر، الأيام).");
        }

        // معالجة إجازة سنوية
        if ($type == "إجازة سنوية") {
            $startDate = new DateTime($start_date);
            $endDate = new DateTime($end_date);
            $interval = $startDate->diff($endDate);
            $daysDiff = $interval->days + 1; // عدد أيام الإجازة المطلوبة

            // جلب تاريخ بدء العمل
            $stmt = $con->prepare("SELECT start_date FROM employees WHERE person_id = ?");
            $stmt->bind_param("i", $emp_id);
            $stmt->execute();
            $result = $stmt->get_result();

            if ($result->num_rows > 0) {
                $row = $result->fetch_assoc();
                $emp_start_date = $row['start_date'];
                $s_date = new DateTime($emp_start_date);
                $s_date->modify('+1 year');
                $s_date = $s_date->format('Y-m-d');
            } else {
                throw new Exception("خطأ: لا يوجد موظف بهذا المعرف.");
            }

            // جلب عدد الأيام المستخدمة من الإجازات المقبولة
            $stmt = $con->prepare("SELECT SUM(days) as total_days FROM vacations WHERE emp_id = ? AND accept = 1");
            $stmt->bind_param("i", $emp_id);
            $stmt->execute();
            $result = $stmt->get_result();
            $row = $result->fetch_assoc();
            $used_days = $row['total_days'] ? $row['total_days'] : 0;

            // حساب رصيد الإجازة باستخدام calculateVacationBalance
            $vacation_balance = calculateVacationBalance($s_date, $used_days);

            // التحقق من كفاية الرصيد
            if ($vacation_balance < $daysDiff) {
                throw new Exception("عذرًا، لا يمكن إنشاء إجازة وذلك لعدم توفر الرصيد الكافي.");
            }

            // إدخال الإجازة في قاعدة البيانات
            $stmt = $con->prepare("INSERT INTO vacations (emp_id, type, days, start_date, end_date, reason, companion, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)");
            $stmt->bind_param("isisssis", $emp_id, $type, $daysDiff, $start_date, $end_date, $reason, $companion, $created_at);
            if (!$stmt->execute()) {
                throw new Exception("خطأ أثناء إنشاء الإجازة.");
            }
        }

        // تأكيد المعاملة
        mysqli_commit($con);
        echo "تم إنشاء الإجازة بنجاح.";
    } catch (Exception $e) {
        // إلغاء المعاملة في حالة الخطأ
        mysqli_rollback($con);
        echo "خطأ: " . $e->getMessage();
    }

    // إغلاق الاتصال
    $stmt->close();
    // mysqli_close($con);
}
?>

 

  • 0
نشر
 public function store(Request $request,$id)
    {
        request()->validate(
        [
            'type'  => "required",
            'start_date'  => "required",
            'end_date' => 'required',
        ],
        [
            'type.required' => 'يجب تحديد نوع الاجازة',
            'start_date.required' => 'يجب إدخال تاريخ بداية الإجازة',
            'end_date.required' => 'يجب ادخال تاريخ المباشرة',
        ]);
        DB::beginTransaction();
        try {
            $vac = new Vacation;
            if($id == 0){
                $emp = Employee::find(request('emp_id'));
            }else{
                $emp = Employee::find($id);
            }
            if(Vacation::where([['emp_id', $emp->id],['accept', false]])->exists()){
                DB::rollback();
                return redirect()->back()->with('error','عذرآ ولكن هنالك أجازة قيد الاجراء للموظف الحالي الرجاء التحقق');
            }
            if(!request('years') && !request('months') && !request('days')){
                DB::rollback();
                return redirect()->back()->with('error','عذرآ ولكن يجب تعبئة إحدي الخانات علي الاقل (السنوات ,الاشهر ,الايام)');
            }
            if(request('type') == "إجازة وضع" && $emp->gender == 1 && $emp->status == 1){
                DB::rollback();
                return redirect()->back()->with('error','عذرآ ولكن لا يمكن أعطاء هذا النوع من الاجازة للموظف المختار');
            }
            if(request('type') == "إجازة زواج" && $emp->vacations()->where("type", "إجازة زواج")->count() != 0 && $emp->status == 0 ){
                DB::rollback();
                return redirect()->back()->with('error','عذرآ الموظف المختار قد تحصل علي أجاة زواج مسبقآ');
            }
            $vac->emp_id = $emp->id;
            $vac->type = request('type');
            if(request('type') == "إجازة سنوية"){
                $vac->days = request('days');

                $date = Carbon::createFromFormat('Y-m-d', $emp->start_date);
                $date = $date->addYear();
                $date =  $date->toDateString();

                if($emp->vacations){
                    $vacationBalance = $this->calculateVacationBalance($date, $emp->vacations->where('accept', true)->sum("days"));
                }else{
                    $vacationBalance = $this->calculateVacationBalance($date, 0);
                }
                if($vacationBalance < $vac->days){
                    DB::rollback();
                    return redirect()->back()->with('error','عذرآ لايمكن أنشاء إجازة وذلك لعدم توفر الرصيد الكافي...');
                }
            }elseif(request('type') == "إجازة بدون مرتب" && !$request->has('person')){
                $vac->days = 365;
            }else{
                $vac->days = NULL;
            }
            $vac->created_id = auth()->user()->id;


            $start_date = request('start_date');
            $vac->start_date = $start_date;


            $end_date = request('end_date');
            $vac->end_date = $end_date;


            if($request->has('person')){
                $vac->companion = true;
            }else{
                $vac->companion = false;
            }

            if($request->has('approve')){
                $vac->accept = true;
            }

            $vac->reason = request('reason');
            $vac->save();

            if (request()->hasFile('files')) {
                $files = request()->file('files'); // Get the files
                $finalArray = [];
                foreach ($files as $file) { // Use foreach for simpler syntax
                    $fileName = time() . '.' . $file->getClientOriginalExtension();
                    $file->storeAs('VACATION', $fileName, 'public'); // Store the file
                    $filePath = 'VACATION/' . $fileName; // Generate the file path
                    $finalArray[] = [
                        'type' => 'vacation',
                        'procedure_id' => $vac->id,
                        'path' => $filePath,
                    ];
                }
                if (!empty($finalArray)) {
                    File::insert($finalArray); // Insert the file references
                }
            }

            $log = new Log;
            $log->user_id = auth()->user()->id;
            $log->type = 7;
            $log->emp_id = $emp->id;
            $log->title = " اضافة إجازة جديدة (".request('type').")";
            $log->log = " تمت إضافة إجازة جديدة (".request('type').")";
            $log->save();

اخي هذا كود دالة قمت بتحويله لي php pure  بدون جزئية logs 

  • 0
نشر
بتاريخ 1 دقيقة مضت قال ايمن ميلاد:
 public function store(Request $request,$id)
    {
        request()->validate(
        [
            'type'  => "required",
            'start_date'  => "required",
            'end_date' => 'required',
        ],
        [
            'type.required' => 'يجب تحديد نوع الاجازة',
            'start_date.required' => 'يجب إدخال تاريخ بداية الإجازة',
            'end_date.required' => 'يجب ادخال تاريخ المباشرة',
        ]);
        DB::beginTransaction();
        try {
            $vac = new Vacation;
            if($id == 0){
                $emp = Employee::find(request('emp_id'));
            }else{
                $emp = Employee::find($id);
            }
            if(Vacation::where([['emp_id', $emp->id],['accept', false]])->exists()){
                DB::rollback();
                return redirect()->back()->with('error','عذرآ ولكن هنالك أجازة قيد الاجراء للموظف الحالي الرجاء التحقق');
            }
            if(!request('years') && !request('months') && !request('days')){
                DB::rollback();
                return redirect()->back()->with('error','عذرآ ولكن يجب تعبئة إحدي الخانات علي الاقل (السنوات ,الاشهر ,الايام)');
            }
            if(request('type') == "إجازة وضع" && $emp->gender == 1 && $emp->status == 1){
                DB::rollback();
                return redirect()->back()->with('error','عذرآ ولكن لا يمكن أعطاء هذا النوع من الاجازة للموظف المختار');
            }
            if(request('type') == "إجازة زواج" && $emp->vacations()->where("type", "إجازة زواج")->count() != 0 && $emp->status == 0 ){
                DB::rollback();
                return redirect()->back()->with('error','عذرآ الموظف المختار قد تحصل علي أجاة زواج مسبقآ');
            }
            $vac->emp_id = $emp->id;
            $vac->type = request('type');
            if(request('type') == "إجازة سنوية"){
                $vac->days = request('days');

                $date = Carbon::createFromFormat('Y-m-d', $emp->start_date);
                $date = $date->addYear();
                $date =  $date->toDateString();

                if($emp->vacations){
                    $vacationBalance = $this->calculateVacationBalance($date, $emp->vacations->where('accept', true)->sum("days"));
                }else{
                    $vacationBalance = $this->calculateVacationBalance($date, 0);
                }
                if($vacationBalance < $vac->days){
                    DB::rollback();
                    return redirect()->back()->with('error','عذرآ لايمكن أنشاء إجازة وذلك لعدم توفر الرصيد الكافي...');
                }
            }elseif(request('type') == "إجازة بدون مرتب" && !$request->has('person')){
                $vac->days = 365;
            }else{
                $vac->days = NULL;
            }
            $vac->created_id = auth()->user()->id;


            $start_date = request('start_date');
            $vac->start_date = $start_date;


            $end_date = request('end_date');
            $vac->end_date = $end_date;


            if($request->has('person')){
                $vac->companion = true;
            }else{
                $vac->companion = false;
            }

            if($request->has('approve')){
                $vac->accept = true;
            }

            $vac->reason = request('reason');
            $vac->save();

            if (request()->hasFile('files')) {
                $files = request()->file('files'); // Get the files
                $finalArray = [];
                foreach ($files as $file) { // Use foreach for simpler syntax
                    $fileName = time() . '.' . $file->getClientOriginalExtension();
                    $file->storeAs('VACATION', $fileName, 'public'); // Store the file
                    $filePath = 'VACATION/' . $fileName; // Generate the file path
                    $finalArray[] = [
                        'type' => 'vacation',
                        'procedure_id' => $vac->id,
                        'path' => $filePath,
                    ];
                }
                if (!empty($finalArray)) {
                    File::insert($finalArray); // Insert the file references
                }
            }

            $log = new Log;
            $log->user_id = auth()->user()->id;
            $log->type = 7;
            $log->emp_id = $emp->id;
            $log->title = " اضافة إجازة جديدة (".request('type').")";
            $log->log = " تمت إضافة إجازة جديدة (".request('type').")";
            $log->save();

اخي هذا كود دالة قمت بتحويله لي php pure  بدون جزئية logs 

هل يمكنك توضيح ما هي المشكلة ؟ لان هذا كود لارافل و ليس PHP Pure. 

  • 0
نشر
بتاريخ 2 دقائق مضت قال ايمن ميلاد:

اخي انا اعمل علي تحويل كود حفظ اجازة موظف من laravel  الي php  بعض جزئيات لم افهم في كود 

لقد تم شرح هذا الجزء في سؤال سابق هنا :

إذا كان هناك جزء معين لم تفهمه يرجى توضيحه هنا .

ولكن الكود كما طلبت تم تحويله إلى php native في الإجابات السابقة يمكنك إستخدامه.

  • 0
نشر
بتاريخ 2 دقائق مضت قال محمد عاطف17:

لقد تم شرح هذا الجزء في سؤال سابق هنا :

إذا كان هناك جزء معين لم تفهمه يرجى توضيحه هنا .

ولكن الكود كما طلبت تم تحويله إلى php native في الإجابات السابقة يمكنك إستخدامه.

اخي تبقي جزئية اجازة بدون مرتب 

elseif(request('type') == "إجازة بدون مرتب" && !$request->has('person')){
                $vac->days = 365;
            }else{
                $vac->days = NULL;
            }
            $vac->created_id = auth()->user()->id;


            $start_date = request('start_date');
            $vac->start_date = $start_date;


            $end_date = request('end_date');
            $vac->end_date = $end_date;


            if($request->has('person')){
                $vac->companion = true;
            }else{
                $vac->companion = false;
            }

            if($request->has('approve')){
                $vac->accept = true;
            }

            $vac->reason = request('reason');
            $vac->save();

 

  • 0
نشر
بتاريخ 10 دقائق مضت قال ايمن ميلاد:

اخي تبقي جزئية اجازة بدون مرتب 

elseif(request('type') == "إجازة بدون مرتب" && !$request->has('person')){
                $vac->days = 365;
            }else{
                $vac->days = NULL;
            }
            $vac->created_id = auth()->user()->id;


            $start_date = request('start_date');
            $vac->start_date = $start_date;


            $end_date = request('end_date');
            $vac->end_date = $end_date;


            if($request->has('person')){
                $vac->companion = true;
            }else{
                $vac->companion = false;
            }

            if($request->has('approve')){
                $vac->accept = true;
            }

            $vac->reason = request('reason');
            $vac->save();

 

مرحباً ، يجب إرفاق الكود كامل الذي تحاول ان تقوم بتحويله الى php pure حتى نقوم بشرحه كاملاً مرة واحدة. 

  • 0
نشر (معدل)
بتاريخ 1 دقيقة مضت قال بلال زيادة:

مرحباً ، يجب إرفاق الكود كامل الذي تحاول ان تقوم بتحويله الى php pure حتى نقوم بشرحه كاملاً مرة واحدة. 

<?php

namespace App\Http\Controllers;

use Carbon\Carbon;
use App\Models\Log;
use App\Models\File;
use App\Models\Employee;
use App\Models\Vacation;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Storage;

class VacationController extends Controller
{

    function __construct()
    {
         $this->middleware('permission:vacation-list', ['only' => ['index','show','search']]);
         $this->middleware('permission:vacation-create', ['only' => ['create','createAll','store']]);
         $this->middleware('permission:vacation-edit', ['only' => ['edit','update','endVecation']]);
         $this->middleware('permission:vacation-delete', ['only' => ['destroy']]);
    }

    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $vacations = Vacation::paginate(25);
        return view('admin.Vacation.index',compact('vacations'));
    }

    public function print(Request $request)
    {
        $vacations = Vacation::all();
        return view('admin.Vacation.print', compact('vacations'));
    }

    function calculateVacationBalance($startDate, $usedDays) {
        $start = Carbon::parse($startDate);
        $now = Carbon::now();
        $totalAccruedDays = 0;
        // ضبط تاريخ البداية ليتوافق مع أول فترة نصف سنوية بعد التاريخ المحدد
        if ($start->month > 6) {
            $start->month(1)->addYear()->day(1); // الانتقال إلى 1 يناير من العام التالي
        } elseif ($start->month < 6 || ($start->month == 6 && $start->day > 1)) {
            $start->month(6)->day(1); // الانتقال إلى 1 يونيو من نفس العام
        } else if ($start->month == 1 && $start->day > 1) {
            $start->month(6)->day(1); // إذا كان بعد 1 يناير، ننتقل إلى 1 يونيو
        }
        // حساب عدد الفترات نصف السنوية المؤهلة حتى الآن
        while ($start->lessThanOrEqualTo($now)) {
            $totalAccruedDays += 15; // إضافة 15 يوم لكل فترة نصف سنوية
            $start->addMonths(6); // الانتقال إلى الفترة نصف السنوية التالية
        }
        $totalAccruedDays -= $usedDays; // طرح الأيام المستخدمة
        return $totalAccruedDays;
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create($id)
    {
        $employee = Employee::find($id);

        $date = Carbon::createFromFormat('Y-m-d', $employee->start_date);
        $date = $date->addYear();
        $date =  $date->toDateString();

        if($employee->vacations){
            $vacationBalance = $this->calculateVacationBalance($date, $employee->vacations->where('accept', true)->sum("days"));
        }else{
            $vacationBalance = $this->calculateVacationBalance($date, 0);
        }

        return view('admin.Vacation.create',compact('employee','vacationBalance'));
    }

    public function createAll()
    {
        $employees = Employee::where('startout_data', NULL)->get();
        return view('admin.Vacation.createAll',compact('employees'));
    }

    public function endVecation($id)
    {
        $vac = Vacation::find($id);
        if($vac->start_date == $vac->end_date){
            $vac->end_date = now()->format('Y-m-d');
            $vac->days = now()->diffInDays($vac->start_date);
            $vac->update();
            return redirect()->back()->with('success','تم إنهاء الإجازة بنجاح');
        }else{
            return redirect()->back()->with('error','عذرآ هذا الإجراء غير مسموح به حاليآ');
        }
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request,$id)
    {
        request()->validate(
        [
            'type'  => "required",
            'start_date'  => "required",
            'end_date' => 'required',
        ],
        [
            'type.required' => 'يجب تحديد نوع الاجازة',
            'start_date.required' => 'يجب إدخال تاريخ بداية الإجازة',
            'end_date.required' => 'يجب ادخال تاريخ المباشرة',
        ]);
        DB::beginTransaction();
        try {
            $vac = new Vacation;
            if($id == 0){
                $emp = Employee::find(request('emp_id'));
            }else{
                $emp = Employee::find($id);
            }
            if(Vacation::where([['emp_id', $emp->id],['accept', false]])->exists()){
                DB::rollback();
                return redirect()->back()->with('error','عذرآ ولكن هنالك أجازة قيد الاجراء للموظف الحالي الرجاء التحقق');
            }
            if(!request('years') && !request('months') && !request('days')){
                DB::rollback();
                return redirect()->back()->with('error','عذرآ ولكن يجب تعبئة إحدي الخانات علي الاقل (السنوات ,الاشهر ,الايام)');
            }
            if(request('type') == "إجازة وضع" && $emp->gender == 1 && $emp->status == 1){
                DB::rollback();
                return redirect()->back()->with('error','عذرآ ولكن لا يمكن أعطاء هذا النوع من الاجازة للموظف المختار');
            }
            if(request('type') == "إجازة زواج" && $emp->vacations()->where("type", "إجازة زواج")->count() != 0 && $emp->status == 0 ){
                DB::rollback();
                return redirect()->back()->with('error','عذرآ الموظف المختار قد تحصل علي أجاة زواج مسبقآ');
            }
            $vac->emp_id = $emp->id;
            $vac->type = request('type');
            if(request('type') == "إجازة سنوية"){
                $vac->days = request('days');

                $date = Carbon::createFromFormat('Y-m-d', $emp->start_date);
                $date = $date->addYear();
                $date =  $date->toDateString();

                if($emp->vacations){
                    $vacationBalance = $this->calculateVacationBalance($date, $emp->vacations->where('accept', true)->sum("days"));
                }else{
                    $vacationBalance = $this->calculateVacationBalance($date, 0);
                }
                if($vacationBalance < $vac->days){
                    DB::rollback();
                    return redirect()->back()->with('error','عذرآ لايمكن أنشاء إجازة وذلك لعدم توفر الرصيد الكافي...');
                }
            }elseif(request('type') == "إجازة بدون مرتب" && !$request->has('person')){
                $vac->days = 365;
            }else{
                $vac->days = NULL;
            }
            $vac->created_id = auth()->user()->id;


            $start_date = request('start_date');
            $vac->start_date = $start_date;


            $end_date = request('end_date');
            $vac->end_date = $end_date;


            if($request->has('person')){
                $vac->companion = true;
            }else{
                $vac->companion = false;
            }

            if($request->has('approve')){
                $vac->accept = true;
            }

            $vac->reason = request('reason');
            $vac->save();

            if (request()->hasFile('files')) {
                $files = request()->file('files'); // Get the files
                $finalArray = [];
                foreach ($files as $file) { // Use foreach for simpler syntax
                    $fileName = time() . '.' . $file->getClientOriginalExtension();
                    $file->storeAs('VACATION', $fileName, 'public'); // Store the file
                    $filePath = 'VACATION/' . $fileName; // Generate the file path
                    $finalArray[] = [
                        'type' => 'vacation',
                        'procedure_id' => $vac->id,
                        'path' => $filePath,
                    ];
                }
                if (!empty($finalArray)) {
                    File::insert($finalArray); // Insert the file references
                }
            }

            $log = new Log;
            $log->user_id = auth()->user()->id;
            $log->type = 7;
            $log->emp_id = $emp->id;
            $log->title = " اضافة إجازة جديدة (".request('type').")";
            $log->log = " تمت إضافة إجازة جديدة (".request('type').")";
            $log->save();

            if(request('type') =="إجازة زواج")
            {
                $emp->status=1;
                $emp->save();
            }
              DB::commit();
              return redirect()->route('vacations.show',[$emp->id])->with('success','تــمــت إضــافــة إجــازة الــموظــف بــنــجــاح');
              // all good
          } catch (\Exception $e) {
              DB::rollback();
              return redirect()->back()->with('error', 'للاسف حدث خطأ ما الرجاء اعادة المحاولة');
          }
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        $employee = Employee::find($id);
        $vacations = Vacation::where('emp_id', $id)->paginate(20);

        $date = Carbon::createFromFormat('Y-m-d', $employee->start_date);
        $date = $date->addYear();
        $date =  $date->toDateString();

        if($employee->vacations){
            $vacationBalance = $this->calculateVacationBalance($date, $employee->vacations->where('accept', true)->sum("days"));
        }else{
            $vacationBalance = $this->calculateVacationBalance($date, 0);
        }
        return view('admin.Vacation.show',compact('employee','vacations','vacationBalance'));
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        $vac = Vacation::find($id);
        return view('admin.Vacation.edit',compact('vac'));
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request)
    {
        DB::beginTransaction();
        try {
            $vac = Vacation::find(request('id'));
            $vac->accept = true;

            $vac->update();


            if (request()->hasFile('files')) {
                $files = request()->file('files'); // Get the files
                $finalArray = [];
                foreach ($files as $file) { // Use foreach for simpler syntax
                    $fileName = time() . '.' . $file->getClientOriginalExtension();
                    $file->storeAs('VACATION', $fileName, 'public'); // Store the file
                    $filePath = 'VACATION/' . $fileName; // Generate the file path
                    $finalArray[] = [
                        'type' => 'vacation',
                        'procedure_id' => $vac->id,
                        'path' => $filePath,
                    ];
                }
                if (!empty($finalArray)) {
                    File::insert($finalArray); // Insert the file references
                }
            }


            $log = new Log;
            $log->user_id = auth()->user()->id;
            $log->type = 7;
            $log->emp_id = $vac->emp_id;
            $log->title = " الموافقة علي الإجازة (".request('type').")";
            $log->log = " تمت الموافقة علي الإجازة (".request('type').")";
            $log->save();

            DB::commit();
            return redirect()->back()->with('success','تــمــت الــمـوافــقـة عـلـي إجــازة الــموظــف بــنــجــاح');
            // all good
        } catch (\Exception $e) {
            DB::rollback();
            return redirect()->back()->with('error', 'للاسف حدث خطأ ما الرجاء اعادة المحاولة');
        }
    }

    public function destroy($id)
    {
        DB::beginTransaction();
        try {
            $files = File::where('procedure_id', $id)
            ->where('type', 'vacation')
            ->update(['delete_at'=> now()]);
            $abs = Vacation::find($id);
            $abs->delete_at = now();
            $abs->delete();
            $log = new Log;
            $log->user_id = auth()->user()->id;
            $log->type = 11;
            $log->emp_id = $abs->emp_id;
            $log->title = " حذف بيانات إجــازة (".$abs->type.")";
            $log->log = " تم حذف بيانات إجــازة (".$abs->type.")";
            $log->save();
            DB::commit();
            return redirect()->back()->with('success','تـم حـذفـ إجــازة الـمـوظـف بـنـجـاح');
            // all good
        } catch (\Exception $e) {
            DB::rollback();
            return redirect()->back()->with('error', 'للاسف حدث خطأ ما الرجاء اعادة المحاولة');
        }
    }



}

انا اريد عمل كود مثله لحفظ اجازة موظف 

انا حاولت فيه لكن هل هو صحيح لماذا لم يحفظ بيانات ممكن تعدل عليه ليصبح مثله 

if ($_SERVER["REQUEST_METHOD"] == "POST")
                 {
                    $emp_id = $_POST['emp_id']; // يتم تخزين 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');
                 }
                 if (empty($start_date) || empty($end_date)) {
                    echo "يرجى اختيار تاريخ بداية وتاريخ نهاية.";
                    exit();
                }
                    $stmt = $con->prepare("SELECT * FROM people WHERE id = ?");
                    $stmt->bind_param("i", $emp_id);
                    $stmt->execute();
                    $result = $stmt->get_result();
                
                    if ($result->num_rows > 0)
                     {
                        $row = $result->fetch_assoc();
                        $gender = $row['gender'];
                     }
                        if ($type == "اجازة وضع" && $gender == "ذكر") 
                        {
                            echo "عذرآ ولكن لا يمكن إعطاء هذا النوع من الإجازة للموظف المختار لأنه ذكر.";
                            exit();
                        }
                      
                        if ($type == "اجازة زواج")
                         {
                            $stmt = $con->prepare("SELECT COUNT(*) FROM vacations WHERE emp_id = ? AND type = ?");
                            $stmt->bind_param("is", $emp_id, $type);
                            $stmt->execute();
                            $stmt->bind_result($count);
                            $stmt->fetch();
                            $stmt->close(); 
                        
                            if ($count > 0) {
                                echo "لديك إجازة زواج مسبقًا، لا يمكنك أخذها مرة أخرى.";
                                exit();
                            }
                        }
                        if ($type == "اجازة سنوية")
                        {
                            $startDate = new DateTime($start_date);
                             $endDate = new DateTime($end_date);
                          $interval = $startDate->diff($endDate);
                           $daysDiff = $interval->days+1;  //عدد ايام بين تاريخ بداية اجازة وتاريخ نهاية اجازة
                           $stmt = $con->prepare("SELECT * FROM employees WHERE person_id= ?"); //جلب تاريخ مباشرة موظف
                           $stmt->bind_param("i", $emp_id);
                           $stmt->execute();
                           $result = $stmt->get_result();
                           
                           if ($result->num_rows > 0) {
                               $row = $result->fetch_assoc();
                               $s_date = new DateTime($row['start_date']); 
                               $s_date->modify('+1 year'); 
                                $s_date->format('Y-m-d');
                           }
                           $stmt = $con->prepare("SELECT SUM(days) as total_days FROM vacations WHERE emp_id = ? AND accept = 1");
                           $stmt->bind_param("i", $emp_id);
                           $stmt->execute();
                           $result = $stmt->get_result();
                           $row = $result->fetch_assoc();
                           $used_days = $row['total_days'] ? $row['total_days'] : 0;
                         $vacation_balance = calculateVacationBalance($s_date, $used_days);
               
                           if ($vacation_balance < $daysDiff)
                            {
                              echo "عذرًا، لا يمكن إنشاء إجازة وذلك لعدم توفر الرصيد الكافي.";
                              exit();
                           }
                              
                        }
                        elseif($type == "اجازة بدون راتب")
                        {
                            $days = 365;
                        } 
                       else {
                        $days = NULL;
                          }
                          $start_date = $_POST['start_date'];
                          $end_date = $_POST['end_date'];



                
                       
                        
                    
               

                        $stmt = $con->prepare("INSERT INTO vacations (emp_id, type, days, start_date, end_date, reason, companion, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)");
                        $stmt->bind_param("isisssis", $emp_id, $type, $daysDiff, $start_date, $end_date, $reason, $companion, $created_at);
                        if (!$stmt->execute()) {
                            echo "خطأ أثناء إنشاء الإجازة.";
                            exit();
                        }
                        else
                        {
                        echo "تم إنشاء الإجازة بنجاح.";
                        }

 

كودي لايخزن عدد ايام لماذا 

تم التعديل في بواسطة ايمن ميلاد
  • 0
نشر
بتاريخ 56 دقائق مضت قال ايمن ميلاد:
<?php

namespace App\Http\Controllers;

use Carbon\Carbon;
use App\Models\Log;
use App\Models\File;
use App\Models\Employee;
use App\Models\Vacation;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Storage;

class VacationController extends Controller
{

    function __construct()
    {
         $this->middleware('permission:vacation-list', ['only' => ['index','show','search']]);
         $this->middleware('permission:vacation-create', ['only' => ['create','createAll','store']]);
         $this->middleware('permission:vacation-edit', ['only' => ['edit','update','endVecation']]);
         $this->middleware('permission:vacation-delete', ['only' => ['destroy']]);
    }

    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $vacations = Vacation::paginate(25);
        return view('admin.Vacation.index',compact('vacations'));
    }

    public function print(Request $request)
    {
        $vacations = Vacation::all();
        return view('admin.Vacation.print', compact('vacations'));
    }

    function calculateVacationBalance($startDate, $usedDays) {
        $start = Carbon::parse($startDate);
        $now = Carbon::now();
        $totalAccruedDays = 0;
        // ضبط تاريخ البداية ليتوافق مع أول فترة نصف سنوية بعد التاريخ المحدد
        if ($start->month > 6) {
            $start->month(1)->addYear()->day(1); // الانتقال إلى 1 يناير من العام التالي
        } elseif ($start->month < 6 || ($start->month == 6 && $start->day > 1)) {
            $start->month(6)->day(1); // الانتقال إلى 1 يونيو من نفس العام
        } else if ($start->month == 1 && $start->day > 1) {
            $start->month(6)->day(1); // إذا كان بعد 1 يناير، ننتقل إلى 1 يونيو
        }
        // حساب عدد الفترات نصف السنوية المؤهلة حتى الآن
        while ($start->lessThanOrEqualTo($now)) {
            $totalAccruedDays += 15; // إضافة 15 يوم لكل فترة نصف سنوية
            $start->addMonths(6); // الانتقال إلى الفترة نصف السنوية التالية
        }
        $totalAccruedDays -= $usedDays; // طرح الأيام المستخدمة
        return $totalAccruedDays;
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create($id)
    {
        $employee = Employee::find($id);

        $date = Carbon::createFromFormat('Y-m-d', $employee->start_date);
        $date = $date->addYear();
        $date =  $date->toDateString();

        if($employee->vacations){
            $vacationBalance = $this->calculateVacationBalance($date, $employee->vacations->where('accept', true)->sum("days"));
        }else{
            $vacationBalance = $this->calculateVacationBalance($date, 0);
        }

        return view('admin.Vacation.create',compact('employee','vacationBalance'));
    }

    public function createAll()
    {
        $employees = Employee::where('startout_data', NULL)->get();
        return view('admin.Vacation.createAll',compact('employees'));
    }

    public function endVecation($id)
    {
        $vac = Vacation::find($id);
        if($vac->start_date == $vac->end_date){
            $vac->end_date = now()->format('Y-m-d');
            $vac->days = now()->diffInDays($vac->start_date);
            $vac->update();
            return redirect()->back()->with('success','تم إنهاء الإجازة بنجاح');
        }else{
            return redirect()->back()->with('error','عذرآ هذا الإجراء غير مسموح به حاليآ');
        }
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request,$id)
    {
        request()->validate(
        [
            'type'  => "required",
            'start_date'  => "required",
            'end_date' => 'required',
        ],
        [
            'type.required' => 'يجب تحديد نوع الاجازة',
            'start_date.required' => 'يجب إدخال تاريخ بداية الإجازة',
            'end_date.required' => 'يجب ادخال تاريخ المباشرة',
        ]);
        DB::beginTransaction();
        try {
            $vac = new Vacation;
            if($id == 0){
                $emp = Employee::find(request('emp_id'));
            }else{
                $emp = Employee::find($id);
            }
            if(Vacation::where([['emp_id', $emp->id],['accept', false]])->exists()){
                DB::rollback();
                return redirect()->back()->with('error','عذرآ ولكن هنالك أجازة قيد الاجراء للموظف الحالي الرجاء التحقق');
            }
            if(!request('years') && !request('months') && !request('days')){
                DB::rollback();
                return redirect()->back()->with('error','عذرآ ولكن يجب تعبئة إحدي الخانات علي الاقل (السنوات ,الاشهر ,الايام)');
            }
            if(request('type') == "إجازة وضع" && $emp->gender == 1 && $emp->status == 1){
                DB::rollback();
                return redirect()->back()->with('error','عذرآ ولكن لا يمكن أعطاء هذا النوع من الاجازة للموظف المختار');
            }
            if(request('type') == "إجازة زواج" && $emp->vacations()->where("type", "إجازة زواج")->count() != 0 && $emp->status == 0 ){
                DB::rollback();
                return redirect()->back()->with('error','عذرآ الموظف المختار قد تحصل علي أجاة زواج مسبقآ');
            }
            $vac->emp_id = $emp->id;
            $vac->type = request('type');
            if(request('type') == "إجازة سنوية"){
                $vac->days = request('days');

                $date = Carbon::createFromFormat('Y-m-d', $emp->start_date);
                $date = $date->addYear();
                $date =  $date->toDateString();

                if($emp->vacations){
                    $vacationBalance = $this->calculateVacationBalance($date, $emp->vacations->where('accept', true)->sum("days"));
                }else{
                    $vacationBalance = $this->calculateVacationBalance($date, 0);
                }
                if($vacationBalance < $vac->days){
                    DB::rollback();
                    return redirect()->back()->with('error','عذرآ لايمكن أنشاء إجازة وذلك لعدم توفر الرصيد الكافي...');
                }
            }elseif(request('type') == "إجازة بدون مرتب" && !$request->has('person')){
                $vac->days = 365;
            }else{
                $vac->days = NULL;
            }
            $vac->created_id = auth()->user()->id;


            $start_date = request('start_date');
            $vac->start_date = $start_date;


            $end_date = request('end_date');
            $vac->end_date = $end_date;


            if($request->has('person')){
                $vac->companion = true;
            }else{
                $vac->companion = false;
            }

            if($request->has('approve')){
                $vac->accept = true;
            }

            $vac->reason = request('reason');
            $vac->save();

            if (request()->hasFile('files')) {
                $files = request()->file('files'); // Get the files
                $finalArray = [];
                foreach ($files as $file) { // Use foreach for simpler syntax
                    $fileName = time() . '.' . $file->getClientOriginalExtension();
                    $file->storeAs('VACATION', $fileName, 'public'); // Store the file
                    $filePath = 'VACATION/' . $fileName; // Generate the file path
                    $finalArray[] = [
                        'type' => 'vacation',
                        'procedure_id' => $vac->id,
                        'path' => $filePath,
                    ];
                }
                if (!empty($finalArray)) {
                    File::insert($finalArray); // Insert the file references
                }
            }

            $log = new Log;
            $log->user_id = auth()->user()->id;
            $log->type = 7;
            $log->emp_id = $emp->id;
            $log->title = " اضافة إجازة جديدة (".request('type').")";
            $log->log = " تمت إضافة إجازة جديدة (".request('type').")";
            $log->save();

            if(request('type') =="إجازة زواج")
            {
                $emp->status=1;
                $emp->save();
            }
              DB::commit();
              return redirect()->route('vacations.show',[$emp->id])->with('success','تــمــت إضــافــة إجــازة الــموظــف بــنــجــاح');
              // all good
          } catch (\Exception $e) {
              DB::rollback();
              return redirect()->back()->with('error', 'للاسف حدث خطأ ما الرجاء اعادة المحاولة');
          }
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        $employee = Employee::find($id);
        $vacations = Vacation::where('emp_id', $id)->paginate(20);

        $date = Carbon::createFromFormat('Y-m-d', $employee->start_date);
        $date = $date->addYear();
        $date =  $date->toDateString();

        if($employee->vacations){
            $vacationBalance = $this->calculateVacationBalance($date, $employee->vacations->where('accept', true)->sum("days"));
        }else{
            $vacationBalance = $this->calculateVacationBalance($date, 0);
        }
        return view('admin.Vacation.show',compact('employee','vacations','vacationBalance'));
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        $vac = Vacation::find($id);
        return view('admin.Vacation.edit',compact('vac'));
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request)
    {
        DB::beginTransaction();
        try {
            $vac = Vacation::find(request('id'));
            $vac->accept = true;

            $vac->update();


            if (request()->hasFile('files')) {
                $files = request()->file('files'); // Get the files
                $finalArray = [];
                foreach ($files as $file) { // Use foreach for simpler syntax
                    $fileName = time() . '.' . $file->getClientOriginalExtension();
                    $file->storeAs('VACATION', $fileName, 'public'); // Store the file
                    $filePath = 'VACATION/' . $fileName; // Generate the file path
                    $finalArray[] = [
                        'type' => 'vacation',
                        'procedure_id' => $vac->id,
                        'path' => $filePath,
                    ];
                }
                if (!empty($finalArray)) {
                    File::insert($finalArray); // Insert the file references
                }
            }


            $log = new Log;
            $log->user_id = auth()->user()->id;
            $log->type = 7;
            $log->emp_id = $vac->emp_id;
            $log->title = " الموافقة علي الإجازة (".request('type').")";
            $log->log = " تمت الموافقة علي الإجازة (".request('type').")";
            $log->save();

            DB::commit();
            return redirect()->back()->with('success','تــمــت الــمـوافــقـة عـلـي إجــازة الــموظــف بــنــجــاح');
            // all good
        } catch (\Exception $e) {
            DB::rollback();
            return redirect()->back()->with('error', 'للاسف حدث خطأ ما الرجاء اعادة المحاولة');
        }
    }

    public function destroy($id)
    {
        DB::beginTransaction();
        try {
            $files = File::where('procedure_id', $id)
            ->where('type', 'vacation')
            ->update(['delete_at'=> now()]);
            $abs = Vacation::find($id);
            $abs->delete_at = now();
            $abs->delete();
            $log = new Log;
            $log->user_id = auth()->user()->id;
            $log->type = 11;
            $log->emp_id = $abs->emp_id;
            $log->title = " حذف بيانات إجــازة (".$abs->type.")";
            $log->log = " تم حذف بيانات إجــازة (".$abs->type.")";
            $log->save();
            DB::commit();
            return redirect()->back()->with('success','تـم حـذفـ إجــازة الـمـوظـف بـنـجـاح');
            // all good
        } catch (\Exception $e) {
            DB::rollback();
            return redirect()->back()->with('error', 'للاسف حدث خطأ ما الرجاء اعادة المحاولة');
        }
    }



}

انا اريد عمل كود مثله لحفظ اجازة موظف 

انا حاولت فيه لكن هل هو صحيح لماذا لم يحفظ بيانات ممكن تعدل عليه ليصبح مثله 

if ($_SERVER["REQUEST_METHOD"] == "POST")
                 {
                    $emp_id = $_POST['emp_id']; // يتم تخزين 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');
                 }
                 if (empty($start_date) || empty($end_date)) {
                    echo "يرجى اختيار تاريخ بداية وتاريخ نهاية.";
                    exit();
                }
                    $stmt = $con->prepare("SELECT * FROM people WHERE id = ?");
                    $stmt->bind_param("i", $emp_id);
                    $stmt->execute();
                    $result = $stmt->get_result();
                
                    if ($result->num_rows > 0)
                     {
                        $row = $result->fetch_assoc();
                        $gender = $row['gender'];
                     }
                        if ($type == "اجازة وضع" && $gender == "ذكر") 
                        {
                            echo "عذرآ ولكن لا يمكن إعطاء هذا النوع من الإجازة للموظف المختار لأنه ذكر.";
                            exit();
                        }
                      
                        if ($type == "اجازة زواج")
                         {
                            $stmt = $con->prepare("SELECT COUNT(*) FROM vacations WHERE emp_id = ? AND type = ?");
                            $stmt->bind_param("is", $emp_id, $type);
                            $stmt->execute();
                            $stmt->bind_result($count);
                            $stmt->fetch();
                            $stmt->close(); 
                        
                            if ($count > 0) {
                                echo "لديك إجازة زواج مسبقًا، لا يمكنك أخذها مرة أخرى.";
                                exit();
                            }
                        }
                        if ($type == "اجازة سنوية")
                        {
                            $startDate = new DateTime($start_date);
                             $endDate = new DateTime($end_date);
                          $interval = $startDate->diff($endDate);
                           $daysDiff = $interval->days+1;  //عدد ايام بين تاريخ بداية اجازة وتاريخ نهاية اجازة
                           $stmt = $con->prepare("SELECT * FROM employees WHERE person_id= ?"); //جلب تاريخ مباشرة موظف
                           $stmt->bind_param("i", $emp_id);
                           $stmt->execute();
                           $result = $stmt->get_result();
                           
                           if ($result->num_rows > 0) {
                               $row = $result->fetch_assoc();
                               $s_date = new DateTime($row['start_date']); 
                               $s_date->modify('+1 year'); 
                                $s_date->format('Y-m-d');
                           }
                           $stmt = $con->prepare("SELECT SUM(days) as total_days FROM vacations WHERE emp_id = ? AND accept = 1");
                           $stmt->bind_param("i", $emp_id);
                           $stmt->execute();
                           $result = $stmt->get_result();
                           $row = $result->fetch_assoc();
                           $used_days = $row['total_days'] ? $row['total_days'] : 0;
                         $vacation_balance = calculateVacationBalance($s_date, $used_days);
               
                           if ($vacation_balance < $daysDiff)
                            {
                              echo "عذرًا، لا يمكن إنشاء إجازة وذلك لعدم توفر الرصيد الكافي.";
                              exit();
                           }
                              
                        }
                        elseif($type == "اجازة بدون راتب")
                        {
                            $days = 365;
                        } 
                       else {
                        $days = NULL;
                          }
                          $start_date = $_POST['start_date'];
                          $end_date = $_POST['end_date'];



                
                       
                        
                    
               

                        $stmt = $con->prepare("INSERT INTO vacations (emp_id, type, days, start_date, end_date, reason, companion, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)");
                        $stmt->bind_param("isisssis", $emp_id, $type, $daysDiff, $start_date, $end_date, $reason, $companion, $created_at);
                        if (!$stmt->execute()) {
                            echo "خطأ أثناء إنشاء الإجازة.";
                            exit();
                        }
                        else
                        {
                        echo "تم إنشاء الإجازة بنجاح.";
                        }

 

كودي لايخزن عدد ايام لماذا 

حسنا هذا هو الكود المحول 

<?php

// دالة calculateVacationBalance
function calculateVacationBalance($startDate, $usedDays) {
    $start = new DateTime($startDate);
    $now = new DateTime();
    $totalAccruedDays = 0;

    if ($start->format('n') > 6) {
        $start->setDate($start->format('Y') + 1, 1, 1);
    } elseif ($start->format('n') < 6 || ($start->format('n') == 6 && $start->format('j') > 1)) {
        $start->setDate($start->format('Y'), 6, 1);
    } elseif ($start->format('n') == 1 && $start->format('j') > 1) {
        $start->setDate($start->format('Y'), 6, 1);
    }

    while ($start <= $now) {
        $totalAccruedDays += 15;
        $start->modify('+6 months');
    }

    $totalAccruedDays -= $usedDays;
    return $totalAccruedDays;
}

// الكود الرئيسي لحفظ الإجازة
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    // افترض أن $con هو اتصال قاعدة البيانات
    // $con = mysqli_connect("localhost", "username", "password", "database");
    // $user_id = 1; // معرف المستخدم الحالي (يجب جلبها من جلسة تسجيل الدخول)
    // $id = isset($_GET['id']) ? (int)$_GET['id'] : 0; // معرف الموظف من المعاملات أو النموذج

    // جلب البيانات من النموذج
    $emp_id = isset($_POST['emp_id']) ? (int)$_POST['emp_id'] : 0;
    $type = isset($_POST['type']) ? $_POST['type'] : '';
    $start_date = isset($_POST['start_date']) ? $_POST['start_date'] : '';
    $end_date = isset($_POST['end_date']) ? $_POST['end_date'] : '';
    $reason = isset($_POST['reason']) ? $_POST['reason'] : '';
    $companion = isset($_POST['person']) ? 1 : 0;
    $approve = isset($_POST['approve']) ? 1 : 0;
    $years = isset($_POST['years']) ? $_POST['years'] : '';
    $months = isset($_POST['months']) ? $_POST['months'] : '';
    $days = isset($_POST['days']) ? (int)$_POST['days'] : 0;
    $created_at = date('Y-m-d H:i:s');

    // التحقق من البيانات المطلوبة
    $errors = [];
    if (empty($type)) {
        $errors[] = 'يجب تحديد نوع الإجازة';
    }
    if (empty($start_date)) {
        $errors[] = 'يجب إدخال تاريخ بداية الإجازة';
    }
    if (empty($end_date)) {
        $errors[] = 'يجب إدخال تاريخ المباشرة';
    }

    if (!empty($errors)) {
        echo implode('<br>', $errors);
        exit;
    }

    // بدء المعاملة
    mysqli_begin_transaction($con);

    try {
        // جلب بيانات الموظف
        if ($id == 0) {
            $stmt = $con->prepare("SELECT id, gender, status, start_date FROM people p JOIN employees e ON p.id = e.person_id WHERE p.id = ?");
            $stmt->bind_param("i", $emp_id);
        } else {
            $stmt = $con->prepare("SELECT id, gender, status, start_date FROM people p JOIN employees e ON p.id = e.person_id WHERE p.id = ?");
            $stmt->bind_param("i", $id);
            $emp_id = $id;
        }
        $stmt->execute();
        $result = $stmt->get_result();

        if ($result->num_rows == 0) {
            throw new Exception("الموظف غير موجود.");
        }
        $employee = $result->fetch_assoc();
        $stmt->close();

        // التحقق من وجود إجازة قيد الإجراء
        $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) {
            throw new Exception("عذرًا، هنالك إجازة قيد الإجراء للموظف الحالي، الرجاء التحقق.");
        }

        // التحقق من تعبئة المدة
        if (empty($years) && empty($months) && empty($days)) {
            throw new Exception("عذرًا، يجب تعبئة إحدى الخانات على الأقل (السنوات، الأشهر، الأيام).");
        }

        // التحقق من إجازة وضع
        if ($type == "إجازة وضع" && $employee['gender'] == 1 && $employee['status'] == 1) {
            throw new Exception("عذرًا، لا يمكن إعطاء هذا النوع من الإجازة للموظف المختار.");
        }

        // التحقق من إجازة زواج
        if ($type == "إجازة زواج") {
            $stmt = $con->prepare("SELECT COUNT(*) FROM vacations WHERE emp_id = ? AND type = ?");
            $stmt->bind_param("is", $emp_id, $type);
            $stmt->execute();
            $stmt->bind_result($count);
            $stmt->fetch();
            $stmt->close();

            if ($count > 0 && $employee['status'] == 0) {
                throw new Exception("عذرًا، الموظف المختار قد حصل على إجازة زواج مسبقًا.");
            }
        }

        // معالجة عدد الأيام
        $vacation_days = null;
        if ($type == "إجازة سنوية") {
            $vacation_days = $days;

            // حساب رصيد الإجازة
            $start_date_calc = new DateTime($employee['start_date']);
            $start_date_calc->modify('+1 year');
            $start_date_calc = $start_date_calc->format('Y-m-d');

            $stmt = $con->prepare("SELECT SUM(days) as total_days FROM vacations WHERE emp_id = ? AND accept = 1");
            $stmt->bind_param("i", $emp_id);
            $stmt->execute();
            $result = $stmt->get_result();
            $row = $result->fetch_assoc();
            $used_days = $row['total_days'] ? $row['total_days'] : 0;
            $stmt->close();

            $vacation_balance = calculateVacationBalance($start_date_calc, $used_days);

            if ($vacation_balance < $vacation_days) {
                throw new Exception("عذرًا، لا يمكن إنشاء إجازة وذلك لعدم توفر الرصيد الكافي.");
            }
        } elseif ($type == "إجازة بدون مرتب" && !isset($_POST['person'])) {
            $vacation_days = 365;
        }

        // إدخال بيانات الإجازة
        $stmt = $con->prepare("INSERT INTO vacations (emp_id, type, days, start_date, end_date, reason, companion, accept, created_id, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
        $stmt->bind_param("isisssiiis", $emp_id, $type, $vacation_days, $start_date, $end_date, $reason, $companion, $approve, $user_id, $created_at);
        if (!$stmt->execute()) {
            throw new Exception("خطأ أثناء إنشاء الإجازة.");
        }
        $vacation_id = $con->insert_id;
        $stmt->close();

        // معالجة الملفات المرفقة
        if (!empty($_FILES['files']['name'][0])) {
            $upload_dir = 'public/VACATION/';
            if (!file_exists($upload_dir)) {
                mkdir($upload_dir, 0777, true);
            }

            $file_inserts = [];
            foreach ($_FILES['files']['name'] as $key => $file_name) {
                if ($_FILES['files']['error'][$key] == UPLOAD_ERR_OK) {
                    $file_ext = pathinfo($file_name, PATHINFO_EXTENSION);
                    $file_name_new = time() . '_' . $key . '.' . $file_ext;
                    $file_path = $upload_dir . $file_name_new;

                    if (move_uploaded_file($_FILES['files']['tmp_name'][$key], $file_path)) {
                        $file_inserts[] = " ('vacation', $vacation_id, '$file_path') ";
                    }
                }
            }

            if (!empty($file_inserts)) {
                $query = "INSERT INTO files (type, procedure_id, path) VALUES " . implode(',', $file_inserts);
                if (!$con->query($query)) {
                    throw new Exception("خطأ أثناء حفظ الملفات.");
                }
            }
        }

        // تسجيل السجل (Log)
        $log_title = "إضافة إجازة جديدة ($type)";
        $log_message = "تمت إضافة إجازة جديدة ($type)";
        $stmt = $con->prepare("INSERT INTO logs (user_id, type, emp_id, title, log, created_at) VALUES (?, ?, ?, ?, ?, ?)");
        $log_type = 7;
        $stmt->bind_param("iiisss", $user_id, $log_type, $emp_id, $log_title, $log_message, $created_at);
        if (!$stmt->execute()) {
            throw new Exception("خطأ أثناء تسجيل السجل.");
        }
        $stmt->close();

        // تحديث حالة الموظف إذا كانت إجازة زواج
        if ($type == "إجازة زواج") {
            $stmt = $con->prepare("UPDATE employees SET status = 1 WHERE person_id = ?");
            $stmt->bind_param("i", $emp_id);
            if (!$stmt->execute()) {
                throw new Exception("خطأ أثناء تحديث حالة الموظف.");
            }
            $stmt->close();
        }

        // تأكيد المعاملة
        mysqli_commit($con);
        // إعادة التوجيه (بديل لـ redirect)
        header("Location: show_vacation.php?id=$emp_id&success=" . urlencode("تمت إضافة إجازة الموظف بنجاح"));
        exit;
    } catch (Exception $e) {
        // إلغاء المعاملة
        mysqli_rollback($con);
        // إعادة التوجيه مع رسالة خطأ
        header("Location: create_vacation.php?error=" . urlencode($e->getMessage()));
        exit;
    }
}

?>

يمكنك مراجعة الاجابات السابقة لانه قمت بشرح الدوال كاملاً

  • 0
نشر

اخدت من الكود الذي اريده فقط لماذا لايتم تخزين بيانات 

<?php
              if ($_SERVER["REQUEST_METHOD"] == "POST")
               {
                $emp_id = isset($_POST['emp_id']) ? (int)$_POST['emp_id'] : 0;
                $type = isset($_POST['type']) ? $_POST['type'] : '';
                $start_date = isset($_POST['start_date']) ? $_POST['start_date'] : '';
                $end_date = isset($_POST['end_date']) ? $_POST['end_date'] : '';
                $reason = isset($_POST['reason']) ? $_POST['reason'] : '';
                $companion = isset($_POST['person']) ? 1 : 0;
                $years = isset($_POST['years']) ? $_POST['years'] : '';
                $months = isset($_POST['months']) ? $_POST['months'] : '';
                $days = isset($_POST['days']) ? (int)$_POST['days'] : 0;
                $created_at = date('Y-m-d H:i:s');
                $errors = [];
                if (empty($type)) {
                    $errors[] = 'يجب تحديد نوع الإجازة';
                }
                if (empty($start_date)) {
                    $errors[] = 'يجب إدخال تاريخ بداية الإجازة';
                }
                if (empty($end_date)) {
                    $errors[] = 'يجب إدخال تاريخ المباشرة';
                }
            
                if (!empty($errors)) {
                    echo implode('<br>', $errors);
                    exit;
                }
                mysqli_begin_transaction($con);
                try 
                {
                   
                 // التحقق من وجود إجازة قيد الإجراء
    $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)
     {
        throw new Exception("عذرًا، هنالك إجازة قيد الإجراء للموظف الحالي، الرجاء التحقق.");
    }
   

    // التحقق من إجازة وضع
    if ($type == "إجازة وضع" && $employee['gender'] == 1 && $employee['status'] == 1) {
        throw new Exception("عذرًا، لا يمكن إعطاء هذا النوع من الإجازة للموظف المختار.");
    }
    // التحقق من إجازة زواج
    if ($type == "إجازة زواج") {
        $stmt = $con->prepare("SELECT COUNT(*) FROM vacations WHERE emp_id = ? AND type = ?");
        $stmt->bind_param("is", $emp_id, $type);
        $stmt->execute();
        $stmt->bind_result($count);
        $stmt->fetch();
        $stmt->close();

        if ($count > 0 && $employee['status'] == 0) {
            throw new Exception("عذرًا، الموظف المختار قد حصل على إجازة زواج مسبقًا.");
        }
    }
    // معالجة عدد الأيام
    $vacation_days = null;
    if ($type == "إجازة سنوية") {
        $vacation_days = $days;

        // حساب رصيد الإجازة
        $start_date_calc = new DateTime($employee['start_date']);
        $start_date_calc->modify('+1 year');
        $start_date_calc = $start_date_calc->format('Y-m-d');

        $stmt = $con->prepare("SELECT SUM(days) as total_days FROM vacations WHERE emp_id = ? AND accept = 1");
        $stmt->bind_param("i", $emp_id);
        $stmt->execute();
        $result = $stmt->get_result();
        $row = $result->fetch_assoc();
        $used_days = $row['total_days'] ? $row['total_days'] : 0;
        $stmt->close();

        $vacation_balance = calculateVacationBalance($start_date_calc, $used_days);

        if ($vacation_balance < $vacation_days)
         {
            throw new Exception("عذرًا، لا يمكن إنشاء إجازة وذلك لعدم توفر الرصيد الكافي.");
        }
        elseif ($type == "إجازة بدون مرتب" && !isset($_POST['person']))
         {
            $vacation_days = 365;
        }
// إدخال بيانات الإجازة
$stmt = $con->prepare("INSERT INTO vacations (emp_id, type, days, start_date, end_date, reason, companion, accept, created_id, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
$stmt->bind_param("isisssiiis", $emp_id, $type, $vacation_days, $start_date, $end_date, $reason, $companion, $approve, $user_id, $created_at);
if (!$stmt->execute()) {
    throw new Exception("خطأ أثناء إنشاء الإجازة.");
}
$stmt->close();
   
   // تحديث حالة الموظف إذا كانت إجازة زواج
   if ($type == "إجازة زواج") {
    $stmt = $con->prepare("UPDATE employees SET status = 1 WHERE person_id = ?");
    $stmt->bind_param("i", $emp_id);
    if (!$stmt->execute()) {
        throw new Exception("خطأ أثناء تحديث حالة الموظف.");
    }
    $stmt->close();
}
mysqli_commit($con);              
echo "<script>
Swal.fire({
    title: 'رسالة تأكيد',
    text: 'تم إضافة بيانات الدورة بنجاح!',
    icon: 'success',
    customClass: 'rak',
});
</script>";
echo '<meta http-equiv="refresh" content="2;url=vacations.php" />';
exit() ;
               } }catch (Exception $e) {
                mysqli_rollback($con);
                 echo "خطأ: " . $e->getMessage();
                    exit;
} 
}
              

 

  • 0
نشر
بتاريخ 14 دقائق مضت قال ايمن ميلاد:

اخدت من الكود الذي اريده فقط لماذا لايتم تخزين بيانات 

<?php
              if ($_SERVER["REQUEST_METHOD"] == "POST")
               {
                $emp_id = isset($_POST['emp_id']) ? (int)$_POST['emp_id'] : 0;
                $type = isset($_POST['type']) ? $_POST['type'] : '';
                $start_date = isset($_POST['start_date']) ? $_POST['start_date'] : '';
                $end_date = isset($_POST['end_date']) ? $_POST['end_date'] : '';
                $reason = isset($_POST['reason']) ? $_POST['reason'] : '';
                $companion = isset($_POST['person']) ? 1 : 0;
                $years = isset($_POST['years']) ? $_POST['years'] : '';
                $months = isset($_POST['months']) ? $_POST['months'] : '';
                $days = isset($_POST['days']) ? (int)$_POST['days'] : 0;
                $created_at = date('Y-m-d H:i:s');
                $errors = [];
                if (empty($type)) {
                    $errors[] = 'يجب تحديد نوع الإجازة';
                }
                if (empty($start_date)) {
                    $errors[] = 'يجب إدخال تاريخ بداية الإجازة';
                }
                if (empty($end_date)) {
                    $errors[] = 'يجب إدخال تاريخ المباشرة';
                }
            
                if (!empty($errors)) {
                    echo implode('<br>', $errors);
                    exit;
                }
                mysqli_begin_transaction($con);
                try 
                {
                   
                 // التحقق من وجود إجازة قيد الإجراء
    $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)
     {
        throw new Exception("عذرًا، هنالك إجازة قيد الإجراء للموظف الحالي، الرجاء التحقق.");
    }
   

    // التحقق من إجازة وضع
    if ($type == "إجازة وضع" && $employee['gender'] == 1 && $employee['status'] == 1) {
        throw new Exception("عذرًا، لا يمكن إعطاء هذا النوع من الإجازة للموظف المختار.");
    }
    // التحقق من إجازة زواج
    if ($type == "إجازة زواج") {
        $stmt = $con->prepare("SELECT COUNT(*) FROM vacations WHERE emp_id = ? AND type = ?");
        $stmt->bind_param("is", $emp_id, $type);
        $stmt->execute();
        $stmt->bind_result($count);
        $stmt->fetch();
        $stmt->close();

        if ($count > 0 && $employee['status'] == 0) {
            throw new Exception("عذرًا، الموظف المختار قد حصل على إجازة زواج مسبقًا.");
        }
    }
    // معالجة عدد الأيام
    $vacation_days = null;
    if ($type == "إجازة سنوية") {
        $vacation_days = $days;

        // حساب رصيد الإجازة
        $start_date_calc = new DateTime($employee['start_date']);
        $start_date_calc->modify('+1 year');
        $start_date_calc = $start_date_calc->format('Y-m-d');

        $stmt = $con->prepare("SELECT SUM(days) as total_days FROM vacations WHERE emp_id = ? AND accept = 1");
        $stmt->bind_param("i", $emp_id);
        $stmt->execute();
        $result = $stmt->get_result();
        $row = $result->fetch_assoc();
        $used_days = $row['total_days'] ? $row['total_days'] : 0;
        $stmt->close();

        $vacation_balance = calculateVacationBalance($start_date_calc, $used_days);

        if ($vacation_balance < $vacation_days)
         {
            throw new Exception("عذرًا، لا يمكن إنشاء إجازة وذلك لعدم توفر الرصيد الكافي.");
        }
        elseif ($type == "إجازة بدون مرتب" && !isset($_POST['person']))
         {
            $vacation_days = 365;
        }
// إدخال بيانات الإجازة
$stmt = $con->prepare("INSERT INTO vacations (emp_id, type, days, start_date, end_date, reason, companion, accept, created_id, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
$stmt->bind_param("isisssiiis", $emp_id, $type, $vacation_days, $start_date, $end_date, $reason, $companion, $approve, $user_id, $created_at);
if (!$stmt->execute()) {
    throw new Exception("خطأ أثناء إنشاء الإجازة.");
}
$stmt->close();
   
   // تحديث حالة الموظف إذا كانت إجازة زواج
   if ($type == "إجازة زواج") {
    $stmt = $con->prepare("UPDATE employees SET status = 1 WHERE person_id = ?");
    $stmt->bind_param("i", $emp_id);
    if (!$stmt->execute()) {
        throw new Exception("خطأ أثناء تحديث حالة الموظف.");
    }
    $stmt->close();
}
mysqli_commit($con);              
echo "<script>
Swal.fire({
    title: 'رسالة تأكيد',
    text: 'تم إضافة بيانات الدورة بنجاح!',
    icon: 'success',
    customClass: 'rak',
});
</script>";
echo '<meta http-equiv="refresh" content="2;url=vacations.php" />';
exit() ;
               } }catch (Exception $e) {
                mysqli_rollback($con);
                 echo "خطأ: " . $e->getMessage();
                    exit;
} 
}
              

 

يجب التأكد من معلومات الاتصال بقاعدة البيانات في مشروعك بالكامل و أيضا يجب عليك مراجعة الأكواد بالكامل و تشغيل الملف و حل أي مشكلة تظهر لك بعد تشغيل الملف.

  • 0
نشر
بتاريخ 1 دقيقة مضت قال ايمن ميلاد:

اتصال صحيح عند عمل var_dump  تظهر بيانات 

ليس شرطاً أن تكون صحيحاً فيجب التأكد من حقول جدول قاعدة البيانات كاملاً وانك تضيف البيانات لها صحيحاً و أن اسماء حقول الجدول نفسها في عملية الإدخال. 

  • 0
نشر (معدل)

اخي الكود الان يدخل بيانات لكن لماذا في اجازة سنوية يقبله مرتين لنفس موظف بمعني دخلت موظف مرة اولي ثم اذا اردت ان ادخل له مرة تانيه يقبله 

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 = $_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 (!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 "لم يتم العثور على بيانات الموظف";
                    }
                 // التحقق من وجود إجازة قيد الإجراء
    $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 == "اجازة وضع" && $people['gender'] == "ذكر")
    {
       echo "عذرًا، لا يمكن إعطاء هذا النوع من الإجازة للموظف المختار.";
       exit();
   }
   

   
    
    // التحقق من إجازة زواج
    if ($type == "اجازة زواج")
     {
        $stmt = $con->prepare("SELECT COUNT(*) FROM vacations WHERE emp_id = ? AND type = ?");
        $stmt->bind_param("is", $emp_id, $type);
        $stmt->execute();
        $stmt->bind_result($count);
        $stmt->fetch();
        $stmt->close();

        if ($count > 0 && $people['accept'] == 0)
         {
            echo "عذرًا، الموظف المختار قد حصل على إجازة زواج مسبقًا.";
            exit();
        }
    }
    // معالجة عدد الأيام
    $vacation_days = null;
    if ($type == "اجازة سنوية")
     {
        $vacation_days = $days;

        // حساب رصيد الإجازة
        $start_date_calc = new DateTime($employee['start_date']);
        $start_date_calc->modify('+1 year');
        $start_date_calc = $start_date_calc->format('Y-m-d');

        $stmt = $con->prepare("SELECT SUM(days) as total_days FROM vacations WHERE emp_id = ? AND accept = 1");
        $stmt->bind_param("i", $emp_id);
        $stmt->execute();
        $result = $stmt->get_result();
        $row = $result->fetch_assoc();
        $used_days = $row['total_days'] ? $row['total_days'] : 0;
        $stmt->close();

        $vacation_balance = calculateVacationBalance($start_date_calc, $used_days);

        if ($vacation_balance < $vacation_days)
         {
            echo "عذرًا، لا يمكن إنشاء إجازة وذلك لعدم توفر الرصيد الكافي.";
            exit();
        }
    }
        elseif ($type == "اجازة بدون مرتب" )
         {
            $days = 365;
        }
    
$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,
    $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;
} 
               }
              

اخي مثلا موظف تاريخ تعينه 12-1-1999

اريد منحه اجازتين سنوية اوله من 1-1-2023 الي 1-1-2024 

وتانيه من 1-1-2024 الي 1-1-2025 

تاريخ بداية حساب الرصيد: سيكون بعد مرور سنة من تاريخ التعيين، أي في 12 يناير 2000.

كل 6 أشهر، يتم إضافة 15 يومًا. 

من 12 يناير 2000 إلى 1 يناير 2023: 

عدد السنوات = 22 سنة.

عدد فترات 6 أشهر = 22 × 2 = 44 فترة.

الإجمالي = 44 × 15 = 660 يومًا.

رصيد الاجازة الاولي 660-0=660 يوما 

 الإجازة الثانية: من 1 يناير 2024 إلى 1 يناير 2025 

تاريخ بداية حساب الرصيد: بعد 1 يناير 2024.

من 12 يناير 2000 إلى 1 يناير 2024:

عدد السنوات = 24 سنة.

عدد فترات 6 أشهر = 24 × 2 = 48 فترة.

الإجمالي = 48 × 15 = 720 يومًا.

كيف يتم قبول اجازة تانية ممكن توضح لي بناء علي الكود المذكور

 

 

تم التعديل في بواسطة ايمن ميلاد
  • 0
نشر
بتاريخ 23 ساعة قال ايمن ميلاد:

اخي الكود الان يدخل بيانات لكن لماذا في اجازة سنوية يقبله مرتين لنفس موظف بمعني دخلت موظف مرة اولي ثم اذا اردت ان ادخل له مرة تانيه يقبله 

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 = $_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 (!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 "لم يتم العثور على بيانات الموظف";
                    }
                 // التحقق من وجود إجازة قيد الإجراء
    $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 == "اجازة وضع" && $people['gender'] == "ذكر")
    {
       echo "عذرًا، لا يمكن إعطاء هذا النوع من الإجازة للموظف المختار.";
       exit();
   }
   

   
    
    // التحقق من إجازة زواج
    if ($type == "اجازة زواج")
     {
        $stmt = $con->prepare("SELECT COUNT(*) FROM vacations WHERE emp_id = ? AND type = ?");
        $stmt->bind_param("is", $emp_id, $type);
        $stmt->execute();
        $stmt->bind_result($count);
        $stmt->fetch();
        $stmt->close();

        if ($count > 0 && $people['accept'] == 0)
         {
            echo "عذرًا، الموظف المختار قد حصل على إجازة زواج مسبقًا.";
            exit();
        }
    }
    // معالجة عدد الأيام
    $vacation_days = null;
    if ($type == "اجازة سنوية")
     {
        $vacation_days = $days;

        // حساب رصيد الإجازة
        $start_date_calc = new DateTime($employee['start_date']);
        $start_date_calc->modify('+1 year');
        $start_date_calc = $start_date_calc->format('Y-m-d');

        $stmt = $con->prepare("SELECT SUM(days) as total_days FROM vacations WHERE emp_id = ? AND accept = 1");
        $stmt->bind_param("i", $emp_id);
        $stmt->execute();
        $result = $stmt->get_result();
        $row = $result->fetch_assoc();
        $used_days = $row['total_days'] ? $row['total_days'] : 0;
        $stmt->close();

        $vacation_balance = calculateVacationBalance($start_date_calc, $used_days);

        if ($vacation_balance < $vacation_days)
         {
            echo "عذرًا، لا يمكن إنشاء إجازة وذلك لعدم توفر الرصيد الكافي.";
            exit();
        }
    }
        elseif ($type == "اجازة بدون مرتب" )
         {
            $days = 365;
        }
    
$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,
    $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;
} 
               }
              

اخي مثلا موظف تاريخ تعينه 12-1-1999

اريد منحه اجازتين سنوية اوله من 1-1-2023 الي 1-1-2024 

وتانيه من 1-1-2024 الي 1-1-2025 

تاريخ بداية حساب الرصيد: سيكون بعد مرور سنة من تاريخ التعيين، أي في 12 يناير 2000.

كل 6 أشهر، يتم إضافة 15 يومًا. 

من 12 يناير 2000 إلى 1 يناير 2023: 

عدد السنوات = 22 سنة.

عدد فترات 6 أشهر = 22 × 2 = 44 فترة.

الإجمالي = 44 × 15 = 660 يومًا.

رصيد الاجازة الاولي 660-0=660 يوما 

 الإجازة الثانية: من 1 يناير 2024 إلى 1 يناير 2025 

تاريخ بداية حساب الرصيد: بعد 1 يناير 2024.

من 12 يناير 2000 إلى 1 يناير 2024:

عدد السنوات = 24 سنة.

عدد فترات 6 أشهر = 24 × 2 = 48 فترة.

الإجمالي = 48 × 15 = 720 يومًا.

كيف يتم قبول اجازة تانية ممكن توضح لي بناء علي الكود المذكور

الكود لا يأخذ في الاعتبار الإجازات السنوية التي تم إدخالها ولكن لم تُوافق عليها بعد (accept = 0). هذا يعني أنه إذا أدخلت إجازة سنوية أولى (مثلًا من 1-1-2023 إلى 1-1-2024) ولم تُوافق عليها بعد، فإن الكود سيسمح بإدخال إجازة ثانية (مثلًا من 1-1-2024 إلى 1-1-2025) لأن:

استعلام SUM(days) يحسب فقط الإجازات التي تمت الموافقة عليها (accept = 1) و لا يتم أخذ الإجازات قيد الإجراء (accept = 0) في حساب الرصيد.

لمنع قبول إجازة سنوية ثانية إذا كانت هناك إجازة سنوية قيد الإجراء أو إذا كان الرصيد غير كافٍ، يجب تعديل الكود ليشمل الإجازات قيد الإجراء (accept = 0) في حساب الرصيد. يمكن تحقيق ذلك عن طريق تعديل استعلام SUM(days) ليشمل جميع الإجازات (سواء تمت الموافقة عليها أو قيد الإجراء).

if ($type == "اجازة سنوية") {
    $vacation_days = $days;

    // حساب رصيد الإجازة
    $start_date_calc = new DateTime($employee['start_date']);
    $start_date_calc->modify('+1 year');
    $start_date_calc = $start_date_calc->format('Y-m-d');

    // استرجاع إجمالي الأيام المستخدمة (بما في ذلك الإجازات قيد الإجراء)
    $stmt = $con->prepare("SELECT SUM(days) as total_days FROM vacations WHERE emp_id = ? AND type = 'اجازة سنوية'");
    $stmt->bind_param("i", $emp_id);
    $stmt->execute();
    $result = $stmt->get_result();
    $row = $result->fetch_assoc();
    $used_days = $row['total_days'] ? $row['total_days'] : 0;
    $stmt->close();

    $vacation_balance = calculateVacationBalance($start_date_calc, $used_days);

    if ($vacation_balance < $vacation_days) {
        echo "عذرًا، لا يمكن إنشاء إجازة وذلك لعدم توفر الرصيد الكافي.";
        exit();
    }
}

 

  • 0
نشر

هل كود صحيح الان بالنسبة للاجازة السنوية الذي عمره فوق 50 ياخد 45 يوم والذي اقل 30 يوم في السنة 

<?php
include('header.php');
error_reporting(0);
ini_set('display_errors', 0);
function calculateVacationBalance($startDate, $usedDays) {
    $start = new DateTime($startDate);
    $now = new DateTime(); 
    $totalAccruedDays = 0;

    if ($start->format('n') > 6) {
        $start->setDate($start->format('Y') + 1, 1, 1); 
    } elseif ($start->format('n') < 6 || ($start->format('n') == 6 && $start->format('j') > 1)) {
        $start->setDate($start->format('Y'), 6, 1); 
    } elseif ($start->format('n') == 1 && $start->format('j') > 1) {
        $start->setDate($start->format('Y'), 6, 1); 
    }

    while ($start <= $now) {
        $totalAccruedDays =$totalAccruedDays+ 15; 
        $start->modify('+6 months');
    }

    $totalAccruedDays =$totalAccruedDays- $usedDays; 
    return $totalAccruedDays;
}

?>

<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 = $_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 (!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 "لم يتم العثور على بيانات الموظف";
                    }
                 // التحقق من وجود إجازة قيد الإجراء
    $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 == "اجازة وضع" && $people['gender'] == "ذكر")
    {
       echo "عذرًا، لا يمكن إعطاء هذا النوع من الإجازة للموظف المختار.";
       exit();
   }
   

   
    
    // التحقق من إجازة زواج
if ($type == "اجازة زواج") {
    $stmt = $con->prepare("SELECT COUNT(*) FROM vacations WHERE emp_id = ? AND type = ? ");
    $stmt->bind_param("is", $emp_id, $type);
    $stmt->execute();
    $stmt->bind_result($count);
    $stmt->fetch();
    $stmt->close();

    if ($count > 0) {
        echo "عذرًا، الموظف المختار قد حصل على إجازة زواج مسبقًا.";
        exit();
    }
    $stmt = $con->prepare("SELECT start_date, end_date FROM vacations WHERE emp_id = ? AND type = ?");
    $stmt->bind_param("is", $emp_id, $type);
    $stmt->execute();
    $stmt->bind_result($start_date, $end_date);
    $stmt->fetch();
    $stmt->close();

    if ($start_date && $end_date) {
        // حساب المدة بالأيام باستخدام الفرق بين التواريخ
        $days = (new DateTime($end_date))->diff(new DateTime($start_date))->days;

        if ($days > 14) {
            echo "عذرًا، إجازة الزواج لا يمكن أن تتجاوز أسبوعين.";
            exit();
        }
    }

   
}
    // معالجة عدد الأيام
    $vacation_days = null;
    if ($type == "اجازة سنوية")
     {
        $stmt = $con->prepare("SELECT birth_date FROM people WHERE id = ?");
        $stmt->bind_param("i", $emp_id);
        $stmt->execute();
        $stmt->bind_result($birth_date);
        $stmt->fetch();
        $stmt->close();
    
        $birth_date = new DateTime($birth_date);      
        $current_date = new DateTime();
        $age = $current_date->diff($birth_date)->y;
        
        if ($age >= 50) {
            $vacation_days = 45; 
        } else {
            $vacation_days = 30; 
        }

        // حساب رصيد الإجازة
        $start_date_calc = new DateTime($employee['start_date']);
        $start_date_calc->modify('+1 year');
        $start_date_calc = $start_date_calc->format('Y-m-d');

        $stmt = $con->prepare("SELECT SUM(days) as total_days FROM vacations WHERE emp_id = ? AND accept = 1");
        $stmt->bind_param("i", $emp_id);
        $stmt->execute();
        $result = $stmt->get_result();
        $row = $result->fetch_assoc();
        $used_days = $row['total_days'] ? $row['total_days'] : 0;
        $stmt->close();

        $vacation_balance = calculateVacationBalance($start_date_calc, $used_days);

        if ($vacation_balance < $vacation_days)
         {
            echo "عذرًا، لا يمكن إنشاء إجازة وذلك لعدم توفر الرصيد الكافي.";
            exit();
        }
    }
        elseif ($type == "اجازة بدون مرتب" )
         {
            $days = 365;
        }
    
$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,
    $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');
?>

 

  • 0
نشر
بتاريخ 14 دقائق مضت قال ايمن ميلاد:

هل كود صحيح الان بالنسبة للاجازة السنوية الذي عمره فوق 50 ياخد 45 يوم والذي اقل 30 يوم في السنة 

<?php
include('header.php');
error_reporting(0);
ini_set('display_errors', 0);
function calculateVacationBalance($startDate, $usedDays) {
    $start = new DateTime($startDate);
    $now = new DateTime(); 
    $totalAccruedDays = 0;

    if ($start->format('n') > 6) {
        $start->setDate($start->format('Y') + 1, 1, 1); 
    } elseif ($start->format('n') < 6 || ($start->format('n') == 6 && $start->format('j') > 1)) {
        $start->setDate($start->format('Y'), 6, 1); 
    } elseif ($start->format('n') == 1 && $start->format('j') > 1) {
        $start->setDate($start->format('Y'), 6, 1); 
    }

    while ($start <= $now) {
        $totalAccruedDays =$totalAccruedDays+ 15; 
        $start->modify('+6 months');
    }

    $totalAccruedDays =$totalAccruedDays- $usedDays; 
    return $totalAccruedDays;
}

?>

<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 = $_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 (!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 "لم يتم العثور على بيانات الموظف";
                    }
                 // التحقق من وجود إجازة قيد الإجراء
    $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 == "اجازة وضع" && $people['gender'] == "ذكر")
    {
       echo "عذرًا، لا يمكن إعطاء هذا النوع من الإجازة للموظف المختار.";
       exit();
   }
   

   
    
    // التحقق من إجازة زواج
if ($type == "اجازة زواج") {
    $stmt = $con->prepare("SELECT COUNT(*) FROM vacations WHERE emp_id = ? AND type = ? ");
    $stmt->bind_param("is", $emp_id, $type);
    $stmt->execute();
    $stmt->bind_result($count);
    $stmt->fetch();
    $stmt->close();

    if ($count > 0) {
        echo "عذرًا، الموظف المختار قد حصل على إجازة زواج مسبقًا.";
        exit();
    }
    $stmt = $con->prepare("SELECT start_date, end_date FROM vacations WHERE emp_id = ? AND type = ?");
    $stmt->bind_param("is", $emp_id, $type);
    $stmt->execute();
    $stmt->bind_result($start_date, $end_date);
    $stmt->fetch();
    $stmt->close();

    if ($start_date && $end_date) {
        // حساب المدة بالأيام باستخدام الفرق بين التواريخ
        $days = (new DateTime($end_date))->diff(new DateTime($start_date))->days;

        if ($days > 14) {
            echo "عذرًا، إجازة الزواج لا يمكن أن تتجاوز أسبوعين.";
            exit();
        }
    }

   
}
    // معالجة عدد الأيام
    $vacation_days = null;
    if ($type == "اجازة سنوية")
     {
        $stmt = $con->prepare("SELECT birth_date FROM people WHERE id = ?");
        $stmt->bind_param("i", $emp_id);
        $stmt->execute();
        $stmt->bind_result($birth_date);
        $stmt->fetch();
        $stmt->close();
    
        $birth_date = new DateTime($birth_date);      
        $current_date = new DateTime();
        $age = $current_date->diff($birth_date)->y;
        
        if ($age >= 50) {
            $vacation_days = 45; 
        } else {
            $vacation_days = 30; 
        }

        // حساب رصيد الإجازة
        $start_date_calc = new DateTime($employee['start_date']);
        $start_date_calc->modify('+1 year');
        $start_date_calc = $start_date_calc->format('Y-m-d');

        $stmt = $con->prepare("SELECT SUM(days) as total_days FROM vacations WHERE emp_id = ? AND accept = 1");
        $stmt->bind_param("i", $emp_id);
        $stmt->execute();
        $result = $stmt->get_result();
        $row = $result->fetch_assoc();
        $used_days = $row['total_days'] ? $row['total_days'] : 0;
        $stmt->close();

        $vacation_balance = calculateVacationBalance($start_date_calc, $used_days);

        if ($vacation_balance < $vacation_days)
         {
            echo "عذرًا، لا يمكن إنشاء إجازة وذلك لعدم توفر الرصيد الكافي.";
            exit();
        }
    }
        elseif ($type == "اجازة بدون مرتب" )
         {
            $days = 365;
        }
    
$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,
    $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');
?>

 

حسب ما ذكرت أنت تريد المنطق التالي:

  • كل 6 شهور للموظف = 15 يوم رصيد إجازة سنوية
  • يبدأ التراكم بعد سنة من التعيين، لو تاريخ التعيين 12-01-1999، يبدأ التراكم من 12-01-2000.
  • كل إجازة تخصم من الرصيد المتراكم وليس السنوي فقط.
  • يجوز للموظف أن يأخذ أي عدد من الإجازات السنوية متى ما توفر له رصيد.
  • لا يوجد سقف سنوي للإجازة، متاح أن يحصل الموظف على إجازتين طويلتين في سنتين متتاليتين لو له رصيد.

والكود لديك يتبع المنطق السابق لا مشكلة، لكن المنطق به بعض التعقيد في التواريخ غير ضروري، ويكفي أن تبدأ من تاريخ التعيين + سنة واحدة، وتكرر كل 6 شهور حتى اليوم، أو تستطيع التمرير حتى تاريخ نهاية الإجازة المطلوبة لو أردت مزيد من الدقة.

وعند تمرير المتغيرات للدالة هنا:

$start_date_calc = new DateTime($employee['start_date']);
$start_date_calc->modify('+1 year');
$start_date_calc = $start_date_calc->format('Y-m-d');

$stmt = $con->prepare("SELECT SUM(days) as total_days FROM vacations WHERE emp_id = ? AND accept = 1");

$used_days = $row['total_days'] ? $row['total_days'] : 0;

$vacation_balance = calculateVacationBalance($start_date_calc, $used_days);

الكود يعمل لكن الأفضل، تنفيذ المنطق بحيث لو الموظف متقدم بطلب إجازة تبدأ في تاريخ مستقبلي 1-1-2026، إذًا يجب جمع الأيام كلها حتى تلك اللحظة أي الإجازات المنتهية قبل 1-1-2026، وتراكم الرصيد أيضاً حتى نفس التاريخ، وهكذا تجعل التحقق دقيق، حتى لو سجل الموظف أكثر من إجازة في نفس الوقت لا يحدث تجاوز للرصيد، كالتالي:

<?php
include('header.php');
error_reporting(0);
ini_set('display_errors', 0);

function calculateVacationBalance($hireDate, $toDate, $usedDays) {
    $start = new DateTime($hireDate);
    $start->modify('+1 year');
    $to = new DateTime($toDate);
    $totalAccruedDays = 0;
    while ($start <= $to) {
        $totalAccruedDays += 15;
        $start->modify('+6 months');
    }
    $totalAccruedDays -= $usedDays;
    return $totalAccruedDays;
}
?>

<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;

                    $requested_days = $end->diff($start)->days;

                    $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 == "اجازة وضع" && $people['gender'] == "ذكر")
                        {
                            echo "عذرًا، لا يمكن إعطاء هذا النوع من الإجازة للموظف المختار.";
                            exit();
                        }

                        if ($type == "اجازة زواج") {
                            $stmt = $con->prepare("SELECT COUNT(*) FROM vacations WHERE emp_id = ? AND type = ? ");
                            $stmt->bind_param("is", $emp_id, $type);
                            $stmt->execute();
                            $stmt->bind_result($count);
                            $stmt->fetch();
                            $stmt->close();
                            if ($count > 0) {
                                echo "عذرًا، الموظف المختار قد حصل على إجازة زواج مسبقًا.";
                                exit();
                            }
                            $stmt = $con->prepare("SELECT start_date, end_date FROM vacations WHERE emp_id = ? AND type = ?");
                            $stmt->bind_param("is", $emp_id, $type);
                            $stmt->execute();
                            $stmt->bind_result($s, $e);
                            $stmt->fetch();
                            $stmt->close();
                            if ($s && $e) {
                                $days = (new DateTime($e))->diff(new DateTime($s))->days;
                                if ($days > 14) {
                                    echo "عذرًا، إجازة الزواج لا يمكن أن تتجاوز أسبوعين.";
                                    exit();
                                }
                            }
                        }

                        if ($type == "اجازة سنوية") {
                            $hire_date = $employee['start_date'];
                            $requested_start_str = $start->format('Y-m-d');

                            $stmt = $con->prepare("
                                SELECT COALESCE(SUM(DATEDIFF(end_date, start_date)),0) AS used
                                FROM vacations
                                WHERE emp_id = ?
                                AND type = 'اجازة سنوية'
                                AND accept = 1
                                AND end_date <= ?
                            ");
                            $stmt->bind_param("is", $emp_id, $requested_start_str);
                            $stmt->execute();
                            $stmt->bind_result($used_days);
                            $stmt->fetch();
                            $stmt->close();

                            $vacation_balance = calculateVacationBalance($hire_date, $requested_start_str, $used_days);

                            if ($vacation_balance < $requested_days) {
                                echo "عذرًا، لا يمكن إنشاء الإجازة لعدم توفر الرصيد الكافي. رصيدك: $vacation_balance يوم، والطلب: $requested_days يوم";
                                exit();
                            }
                        }

                        if ($type == "اجازة بدون مرتب" ) {
                            $days = 365;
                        }

                        $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');
?>

 

  • 0
نشر (معدل)

اخي انت الحل الذي قدمته منطقي لكن الذي عمره 50 سنة او اكثر يحق له 45 يوم اجازة سنوية

انا عملت لشخص اجازة سنوية من 1-1- 2023 الي 31-12-2024 

ثم عملت له اجازة سنوية من جديد من تاريخ 1-1-2025 الي 1-1-2026  ظهرت 

عذرًا، لا يمكن إنشاء الإجازة لعدم توفر الرصيد الكافي. رصيدك: -685 يوم، والطلب: 365 يوم

كيف اعرف رصيد كل موظف مثلا قبل عمل اجازة جديدة له 

تم التعديل في بواسطة ايمن ميلاد
  • 0
نشر
بتاريخ 14 ساعة قال ايمن ميلاد:

اخي انت الحل الذي قدمته منطقي لكن الذي عمره 50 سنة او اكثر يحق له 45 يوم اجازة سنوية

انا عملت لشخص اجازة سنوية من 1-1- 2023 الي 31-12-2024 

ثم عملت له اجازة سنوية من جديد من تاريخ 1-1-2025 الي 1-1-2026  ظهرت 

عذرًا، لا يمكن إنشاء الإجازة لعدم توفر الرصيد الكافي. رصيدك: -685 يوم، والطلب: 365 يوم

كيف اعرف رصيد كل موظف مثلا قبل عمل اجازة جديدة له 

رجاء ارفق اخر كود وصلت له ؟ لاستطيع حل المشكلة 

  • 0
نشر

بالنسبة للاجازة السنوية تكون 30 يوم في السنة و45 يوما في السنة لمن بلغ سن الخمسين او تجاوزت مدة خدمته عشرين عاما 

وفي جميع الاحوال يجب ان يتمتع الموظف بإجازة لاتقل عن 15 يوما متصلة في السنة

بالنسبة لاجازة المرضية لمدة لاتزيد علي 45 يوم متصلة او 60 يوما متقطعة خلال السنة الواحدة

اجازة الحج تكون لعشرين يوما ولاتمنح الي مرة خلال فترة الخدمة 

اجازة الزواج تكون اسبوعين ولاتمنح الي مرة واحدة خلال فترة الخدمة 

وفاة الزوج اجازة تكون 4 اشهر و10 ايام 

هذا اخر كود وصلت اليه اريد كيف معرفة رصيد موظف في كل اجازة 

<?php
include('header.php');
error_reporting(0);
ini_set('display_errors', 0);

function calculateVacationBalance($hireDate, $toDate, $usedDays) {
    $start = new DateTime($hireDate);
    $start->modify('+1 year');
    $to = new DateTime($toDate);
    $totalAccruedDays = 0;
    while ($start <= $to) {
        $totalAccruedDays += 15;
        $start->modify('+6 months');
    }
    $totalAccruedDays -= $usedDays;
    return $totalAccruedDays;
}
?>

<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;

                    $requested_days = $end->diff($start)->days;

                    $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 == "اجازة وضع" && $people['gender'] == "ذكر")
                        {
                            echo "عذرًا، لا يمكن إعطاء هذا النوع من الإجازة للموظف المختار.";
                            exit();
                        }

                        if ($type == "اجازة زواج") {
                            $stmt = $con->prepare("SELECT COUNT(*) FROM vacations WHERE emp_id = ? AND type = ? ");
                            $stmt->bind_param("is", $emp_id, $type);
                            $stmt->execute();
                            $stmt->bind_result($count);
                            $stmt->fetch();
                            $stmt->close();
                            if ($count > 0) {
                                echo "عذرًا، الموظف المختار قد حصل على إجازة زواج مسبقًا.";
                                exit();
                            }
                            $stmt = $con->prepare("SELECT start_date, end_date FROM vacations WHERE emp_id = ? AND type = ?");
                            $stmt->bind_param("is", $emp_id, $type);
                            $stmt->execute();
                            $stmt->bind_result($s, $e);
                            $stmt->fetch();
                            $stmt->close();
                            if ($s && $e) {
                                $days = (new DateTime($e))->diff(new DateTime($s))->days;
                                if ($days > 14) {
                                    echo "عذرًا، إجازة الزواج لا يمكن أن تتجاوز أسبوعين.";
                                    exit();
                                }
                            }
                        }

                        if ($type == "اجازة سنوية") {
                            $hire_date = $employee['start_date'];
                            $requested_start_str = $start->format('Y-m-d');

                            $stmt = $con->prepare("
                                SELECT COALESCE(SUM(DATEDIFF(end_date, start_date)),0) AS used
                                FROM vacations
                                WHERE emp_id = ?
                                AND type = 'اجازة سنوية'
                                AND accept = 1
                                AND end_date <= ?
                            ");
                            $stmt->bind_param("is", $emp_id, $requested_start_str);
                            $stmt->execute();
                            $stmt->bind_result($used_days);
                            $stmt->fetch();
                            $stmt->close();

                            $vacation_balance = calculateVacationBalance($hire_date, $requested_start_str, $used_days);

                            if ($vacation_balance < $requested_days) {
                                echo "عذرًا، لا يمكن إنشاء الإجازة لعدم توفر الرصيد الكافي. رصيدك: $vacation_balance يوم، والطلب: $requested_days يوم";
                                exit();
                            }
                        }

                        if ($type == "اجازة بدون مرتب" ) {
                            $days = 365;
                        }

                        $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');
?>

 

 

 

  • 0
نشر
بتاريخ 13 ساعة قال ايمن ميلاد:

بالنسبة للاجازة السنوية تكون 30 يوم في السنة و45 يوما في السنة لمن بلغ سن الخمسين او تجاوزت مدة خدمته عشرين عاما 

وفي جميع الاحوال يجب ان يتمتع الموظف بإجازة لاتقل عن 15 يوما متصلة في السنة

بالنسبة لاجازة المرضية لمدة لاتزيد علي 45 يوم متصلة او 60 يوما متقطعة خلال السنة الواحدة

اجازة الحج تكون لعشرين يوما ولاتمنح الي مرة خلال فترة الخدمة 

اجازة الزواج تكون اسبوعين ولاتمنح الي مرة واحدة خلال فترة الخدمة 

وفاة الزوج اجازة تكون 4 اشهر و10 ايام 

هذا اخر كود وصلت اليه اريد كيف معرفة رصيد موظف في كل اجازة 

<?php
include('header.php');
error_reporting(0);
ini_set('display_errors', 0);

function calculateVacationBalance($hireDate, $toDate, $usedDays) {
    $start = new DateTime($hireDate);
    $start->modify('+1 year');
    $to = new DateTime($toDate);
    $totalAccruedDays = 0;
    while ($start <= $to) {
        $totalAccruedDays += 15;
        $start->modify('+6 months');
    }
    $totalAccruedDays -= $usedDays;
    return $totalAccruedDays;
}
?>

<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;

                    $requested_days = $end->diff($start)->days;

                    $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 == "اجازة وضع" && $people['gender'] == "ذكر")
                        {
                            echo "عذرًا، لا يمكن إعطاء هذا النوع من الإجازة للموظف المختار.";
                            exit();
                        }

                        if ($type == "اجازة زواج") {
                            $stmt = $con->prepare("SELECT COUNT(*) FROM vacations WHERE emp_id = ? AND type = ? ");
                            $stmt->bind_param("is", $emp_id, $type);
                            $stmt->execute();
                            $stmt->bind_result($count);
                            $stmt->fetch();
                            $stmt->close();
                            if ($count > 0) {
                                echo "عذرًا، الموظف المختار قد حصل على إجازة زواج مسبقًا.";
                                exit();
                            }
                            $stmt = $con->prepare("SELECT start_date, end_date FROM vacations WHERE emp_id = ? AND type = ?");
                            $stmt->bind_param("is", $emp_id, $type);
                            $stmt->execute();
                            $stmt->bind_result($s, $e);
                            $stmt->fetch();
                            $stmt->close();
                            if ($s && $e) {
                                $days = (new DateTime($e))->diff(new DateTime($s))->days;
                                if ($days > 14) {
                                    echo "عذرًا، إجازة الزواج لا يمكن أن تتجاوز أسبوعين.";
                                    exit();
                                }
                            }
                        }

                        if ($type == "اجازة سنوية") {
                            $hire_date = $employee['start_date'];
                            $requested_start_str = $start->format('Y-m-d');

                            $stmt = $con->prepare("
                                SELECT COALESCE(SUM(DATEDIFF(end_date, start_date)),0) AS used
                                FROM vacations
                                WHERE emp_id = ?
                                AND type = 'اجازة سنوية'
                                AND accept = 1
                                AND end_date <= ?
                            ");
                            $stmt->bind_param("is", $emp_id, $requested_start_str);
                            $stmt->execute();
                            $stmt->bind_result($used_days);
                            $stmt->fetch();
                            $stmt->close();

                            $vacation_balance = calculateVacationBalance($hire_date, $requested_start_str, $used_days);

                            if ($vacation_balance < $requested_days) {
                                echo "عذرًا، لا يمكن إنشاء الإجازة لعدم توفر الرصيد الكافي. رصيدك: $vacation_balance يوم، والطلب: $requested_days يوم";
                                exit();
                            }
                        }

                        if ($type == "اجازة بدون مرتب" ) {
                            $days = 365;
                        }

                        $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');
?>

لحساب رصيد الموظف لكل نوع من الإجازات بناء على القواعد المذكورة يجب إنشاء دالة مخصصة لكل نوع إجازة تأخذ بعين الاعتبار القواعد المحددة (مثل الإجازة السنوية، المرضية، الحج، الزواج، وفاة الزوج). سنقوم بتحديث دالة calculateVacationBalance مع دوال إضافية لحساب رصيد كل نوع إجازة، مع افتراض أن لديك جدول vacations يحتوي على سجلات الإجازات المستخدمة تحديث الدالة 

<?php
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;
    }
}
?>

و لعرض رصيد الاجازات 

<!-- أضف هذا داخل النموذج بعد حقل اختيار الموظف -->
<div class="col-md-12">
    <div class="form-group" style="margin-top:10px;">
        <label>رصيد الإجازات</label>
        <div id="vacation_balance" style="border:1px solid #ccc; padding:10px;">
            <!-- سيتم ملء هذا الحقل ديناميكيًا -->
        </div>
    </div>
</div>

<!-- أضف السكربت التالي في نهاية الصفحة -->
<script>
$(document).ready(function() {
    $('select[name="emp_id"]').change(function() {
        var emp_id = $(this).val();
        if (emp_id) {
            $.ajax({
                url: 'get_vacation_balance.php',
                type: 'POST',
                data: { emp_id: emp_id },
                success: function(response) {
                    $('#vacation_balance').html(response);
                },
                error: function() {
                    $('#vacation_balance').html('<p>حدث خطأ أثناء جلب الرصيد.</p>');
                }
            });
        } else {
            $('#vacation_balance').html('');
        }
    });
});
</script>

و يجب

<?php
include('config.php'); // تأكد من تضمين ملف الاتصال بقاعدة البيانات
include('functions.php'); // افترض أن هذا الملف يحتوي على دالة calculateVacationBalance

if (isset($_POST['emp_id'])) {
    $emp_id = intval($_POST['emp_id']);
    
    // جلب بيانات الموظف
    $stmt = $con->prepare("SELECT e.start_date, p.birth_date, p.gender FROM employees e JOIN people p ON e.person_id = p.id WHERE e.person_id = ?");
    $stmt->bind_param("i", $emp_id);
    $stmt->execute();
    $employee = $stmt->get_result()->fetch_assoc();
    $stmt->close();

    if ($employee) {
        $hire_date = $employee['start_date'];
        $birth_date = $employee['birth_date'];
        $gender = $employee['gender'];
        $to_date = date('Y-m-d');

        // أنواع الإجازات
        $vacation_types = [
            'اجازة سنوية',
            'اجازة مرضية',
            'اجازة الحج',
            'اجازة زواج',
            'اجازة وفاة الزوج'
        ];

        $output = '<ul>';
        foreach ($vacation_types as $type) {
            $balance = calculateVacationBalance($con, $emp_id, $type, $hire_date, $birth_date, $gender, $to_date);
            $output .= "<li>$type: $balance يوم</li>";
        }
        $output .= '</ul>';

        echo $output;
    } else {
        echo '<p>لم يتم العثور على بيانات الموظف.</p>';
    }
} else {
    echo '<p>يرجى اختيار موظف.</p>';
}
?>

إنشاء ملف get_vacation_balance.php و هذا الملف سيحسب رصيد الإجازات للموظف المحدد ويعيده كـ HTML.

  • 0
نشر (معدل)

اخي انا كود مرفق كود إدخال بيانات اجازة نفسه به كود دالة اعلي صفحة التي تحسب رصيد 

كيف يكون الان كود إدخال بعد أصبحت دالة تحسب كل أنواع اجازات

علما بأن تاريخ ميلاد في جدول والجنس في جدول

تم التعديل في بواسطة ايمن ميلاد
  • 0
نشر
بتاريخ 29 دقائق مضت قال ايمن ميلاد:

اخي انا كود مرفق كود إدخال بيانات اجازة نفسه به كود دالة اعلي صفحة التي تحسب رصيد 

كيف يكون الان كود إدخال بعد أصبحت دالة تحسب كل أنواع اجازات

هل ممكن توضح المشكلة بشكل كامل مع ارفاق الاكواد الذي تواجه فيها مشكلة ؟ 

 

  • 0
نشر
بتاريخ 6 ساعة قال بلال زيادة:

هل ممكن توضح المشكلة بشكل كامل مع ارفاق الاكواد الذي تواجه فيها مشكلة ؟ 

 

قمت بوضع دالة في كود ادخال الان عدل لي كود ليبدا يعمل صحيح 

<?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 == "اجازة وضع" && $people['gender'] == "ذكر")
                        {
                            echo "عذرًا، لا يمكن إعطاء هذا النوع من الإجازة للموظف المختار.";
                            exit();
                        }

                        if ($type == "اجازة زواج") {
                            $stmt = $con->prepare("SELECT COUNT(*) FROM vacations WHERE emp_id = ? AND type = ? ");
                            $stmt->bind_param("is", $emp_id, $type);
                            $stmt->execute();
                            $stmt->bind_result($count);
                            $stmt->fetch();
                            $stmt->close();
                            if ($count > 0) {
                                echo "عذرًا، الموظف المختار قد حصل على إجازة زواج مسبقًا.";
                                exit();
                            }
                            $stmt = $con->prepare("SELECT start_date, end_date FROM vacations WHERE emp_id = ? AND type = ?");
                            $stmt->bind_param("is", $emp_id, $type);
                            $stmt->execute();
                            $stmt->bind_result($s, $e);
                            $stmt->fetch();
                            $stmt->close();
                            if ($s && $e) {
                                $days = (new DateTime($e))->diff(new DateTime($s))->days;
                                if ($days > 14) {
                                    echo "عذرًا، إجازة الزواج لا يمكن أن تتجاوز أسبوعين.";
                                    exit();
                                }
                            }
                        }

                        if ($type == "اجازة سنوية") {
                            $hire_date = $employee['start_date'];
                            $requested_start_str = $start->format('Y-m-d');

                            $stmt = $con->prepare("
                                SELECT COALESCE(SUM(DATEDIFF(end_date, start_date)),0) AS used
                                FROM vacations
                                WHERE emp_id = ?
                                AND type = 'اجازة سنوية'
                                AND accept = 1
                                AND end_date <= ?
                            ");
                            $stmt->bind_param("is", $emp_id, $requested_start_str);
                            $stmt->execute();
                            $stmt->bind_result($used_days);
                            $stmt->fetch();
                            $stmt->close();

                            $vacation_balance = calculateVacationBalance($hire_date, $requested_start_str, $used_days);

                            if ($vacation_balance < $requested_days) {
                                echo "عذرًا، لا يمكن إنشاء الإجازة لعدم توفر الرصيد الكافي. رصيدك: $vacation_balance يوم، والطلب: $requested_days يوم";
                                exit();
                            }
                        }

                        if ($type == "اجازة بدون مرتب" ) {
                            $days = 365;
                        }

                        $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');
?>

 

  • 0
نشر

اخي بلال كيف يكون كود ادخال في حالة اختيار اي اجازة 

ماذا اضع داخل كل if 

<?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 == "اجازة سنوية")
                         {
                            
                        }
                        

                        if ($type == "اجازة مرضية") 
                        {
                            
                        }
                        if ($type == "اجازة الحج") 
                        {
                            
                        }
                        if ($type == "اجازة زواج") 
                        {
                            
                        }
                        if ($type == "اجازة وفاة الزوج") 
                        {
                            
                        }



                        

                        

                        $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');
?>

 

لماذا في اجازة سنوية مرة اوله يعمل تمام مره تانيه عند اختياره لنفس موظف لايظهر ليس لديك رصيد كافي 

مثلا اخترت اجازة سنوية من1-1-2024 الي 1-1-2025 ثم اجازة تانية من 1-1-2025 الي 1-1-2026 

لايظهر ليس لديك رصيد 

هدا كود ادخال 

  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();
                        //////////////////
                        $hire_date = $employee['start_date'];
                        $birth_date = $people['birth_date'];
                        $gender = $people['gender'];
                        $to_date = date('Y-m-d'); 
                        if ($type == "اجازة سنوية")
                         {
                            $balance = calculateVacationBalance($con, $emp_id, $type, $hire_date, $birth_date, $gender, $to_date);
                            if ($balance < $requested_days) {
                                echo "ليس لديك رصيد كافٍ من الإجازة السنوية. الرصيد المتاح: " . $balance . " يومًا.";
                                exit;
                            } 
                        }
                        

                        if ($type == "اجازة مرضية") 
                        {
                            
                        }
                        if ($type == "اجازة الحج") 
                        {
                            
                        }
                        if ($type == "اجازة زواج") 
                        {
                            
                        }
                        if ($type == "اجازة وفاة الزوج") 
                        {
                            
                        }



                        

                        

                        $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;
                    }
                }

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...