-
المساهمات
386 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
1
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو ايمن ميلاد
-
فهمت منك اذا هل في تطبيقات طقس يوميا في اشخاص يدخلون درجات حرارة ونحن عندما نطلب رابط تظهر لنا ما دخلو وكدلك في مواقع كورة يوميا يدخلون مواعيد مباريات ونحن نطلب رابط تظهر لنا
-
السلام عليكم ورحمة الله وبركاته شاهدت عديد من مواقع تشرح api فهمت منهم سؤال الذي أريد إجابة له هل هو طريقة للتواصل معا قاعدة بيانات بمعني مجرد نجهز روابط وهو يتواصل معا قاعدة بيانات مثلا انا ادخل بيانات او صفحة عرض يجلب عن طريق api ('Route.get('/users تجلب كل مستخدمين من قاعدة بيانات وطريقة رجوع بي بيانات عن طريق json هيا key او value ممكن توضيح اخواني كيف انشء api خاص بي
- 7 اجابة
-
- 2
-
-
يعني حقلين اثنين enbled في حالة ضغط ترقية استنائية يتفعل حقل درجة جديدة لكي يكتب به درجة ماذا ينقصه كود الان لكي يكون مثل السابق <?php include('header.php'); // Fetch existing course data from the database ?> <!--------------------------------------------------------------------------------> <!------------------------------------header--------------------------------------> <!--------------------------------------------------------------------------------> <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> <!-- مكتبة SweetAlert2 --> <script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></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="student.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="emp_id" class="form-control" onchange="updateDegree()"> <?php $sql = "SELECT e.person_id, p.name,e.degree 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']}' data-degree='{$row['degree']}'>{$row['name']}</option>"; } ?> </select> </div> </div> <div class="col-md-4"> <div class="form-group" style="margin-top:10px;"> <label> رقم القرار </label> <input name="num" type="text" class="form-control" placeholder="ادخل رقم القرار "> </div> </div> <div class="col-md-4"> <div class="form-group" style="margin-top:10px;"> <label> الدرجة السابقة </label> <input id='prev_degree' name='prev_degree' type='text' class='form-control' disabled > </div> </div> </div> <div class="row"> <div class="col-md-4"> <div class="form-group" style="margin-top:10px;"> <label> الدرجة الجديدة </label> <input name="new_degree" id="new_degree" type="text" class="form-control" disabled> </div> </div> <div class="col-md-4"> <div class="form-group" style="margin-top:10px;"> <label> ترقية استنائية </label> <input name="excep" type="checkbox" class="form-control" onclick="toggleInputs(this)"> </div> </div> <div class="col-md-4"> <div class="form-group" style="margin-top:10px;"> <label> تاريخ الاستحقاق </label> <input name="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="last_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;"> <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> </form> <?php if ($_SERVER["REQUEST_METHOD"] == "POST") { $emp_id = $_POST['emp_id']; $num = $_POST['num']; $prev_degree = $_POST['prev_degree']; $new_degree = $_POST['new_degree']; $date = $_POST['date']; $last_date = $_POST['last_date']; $excep = isset($_POST['excep']) ? 1 : 0; $created_at= date('Y-m-d H:i:s'); if ($new_degree != $prev_degree + 1) { echo "<script> Swal.fire({ title: 'تنبيه', text: 'يجب أن تكون الدرجة الجديدة درجة قديمة +1!', icon: 'warning', customClass: 'rak', }); </script>"; exit; } $check_sql = "SELECT COUNT(*) FROM promotions WHERE emp_id = ? AND new_degree = ?"; $stmt = $con->prepare($check_sql); $stmt->bind_param("is", $emp_id, $new_degree); $stmt->execute(); $stmt->bind_result($count); $stmt->fetch(); $stmt->close(); if ($count > 0) { echo "<script> Swal.fire({ title: 'تنبيه', text: 'هذا الموظف لديه درجة جديدة مسجلة بالفعل!', icon: 'warning', customClass: 'rak', }); </script>"; exit; } $sql = "INSERT INTO promotions (emp_id,num,prev_degree,new_degree,date,last_date,excep, created_at) VALUES (?,?,?,?,?,?,?, ?)"; $stmt = $con->prepare($sql); $stmt->bind_param("iiiissss", $emp_id,$num,$prev_degree,$new_degree,$date,$last_date,$excep, $created_at); if ($stmt->execute()) { $update_sql = "UPDATE employees SET degree = ? WHERE person_id = ?"; $update_stmt = $con->prepare($update_sql); $update_stmt->bind_param("si", $new_degree, $emp_id); $update_stmt->execute(); $update_stmt->close(); echo "<script> Swal.fire({ title: 'رسالة تأكيد', text: 'تم إضافة بيانات الترقية للموظف بنجاح!', icon: 'success', customClass: 'rak', }); </script>"; echo '<meta http-equiv="refresh" content="2;url=promotions.php" />'; } else { echo "خطأ في إدخال بيانات الترقية: " . $stmt->error; } } ?> </div> </div> </div> </div> <!--------------------------------------------------------------------------------> <!------------------------------------Footer--------------------------------------> <!--------------------------------------------------------------------------------> <script> function updateDegree() { var select = document.getElementById("emp_id"); var selectedOption = select.options[select.selectedIndex]; var degree = selectedOption.getAttribute('data-degree'); var prevDegreeInput = document.getElementById('prev_degree'); prevDegreeInput.value = degree ? degree : ''; var newDegreeValue = parseInt(prevDegreeInput.value) + 1; document.getElementsByName('new_degree')[0].value = newDegreeValue; } function toggleInputs(checkbox) { const new_degreeInput = document.getElementById('new_degree'); new_degreeInput.disabled = !checkbox.checked; } </script> <?php include('footer.php'); ?>
-
برمجة جزء من كود ممكن تكمل لي باقي جزئية ترقية استنائية if ($_SERVER["REQUEST_METHOD"] == "POST") { $emp_id = $_POST['emp_id']; $num = $_POST['num']; $prev_degree = $_POST['prev_degree']; $new_degree = $_POST['new_degree']; $date = $_POST['date']; $last_date = $_POST['last_date']; $excep = $_POST['excep']; $created_at= date('Y-m-d H:i:s'); $check_sql = "SELECT COUNT(*) FROM promotions WHERE emp_id = ? AND new_degree = ?"; $stmt = $con->prepare($check_sql); $stmt->bind_param("is", $emp_id, $new_degree); $stmt->execute(); $stmt->bind_result($count); $stmt->fetch(); $stmt->close(); if ($count > 0) { echo "<script> Swal.fire({ title: 'تنبيه', text: 'هذا الموظف لديه درجة جديدة مسجلة بالفعل!', icon: 'warning', customClass: 'rak', }); </script>"; exit; } $sql = "INSERT INTO promotions (emp_id,num,prev_degree,new_degree,date,last_date, created_at) VALUES (?,?,?,?,?,?, ?)"; $stmt = $con->prepare($sql); $stmt->bind_param("iiiisss", $emp_id,$num,$prev_degree,$new_degree,$date,$last_date, $created_at); if ($stmt->execute()) { $update_sql = "UPDATE employees SET degree = ? WHERE person_id = ?"; $update_stmt = $con->prepare($update_sql); $update_stmt->bind_param("si", $new_degree, $emp_id); $update_stmt->execute(); $update_stmt->close(); echo "<script> Swal.fire({ title: 'رسالة تأكيد', text: 'تم إضافة بيانات الترقية للموظف بنجاح!', icon: 'success', customClass: 'rak', }); </script>"; echo '<meta http-equiv="refresh" content="2;url=promotions.php" />'; } else { echo "خطأ في إدخال بيانات الترقية: " . $stmt->error; } }
-
ممكن برمجة كود لم اعرف كيف عند اختيار موظف يظهر درجته <?php include('header.php'); // Fetch existing course data from the database ?> <!--------------------------------------------------------------------------------> <!------------------------------------header--------------------------------------> <!--------------------------------------------------------------------------------> <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> <!-- مكتبة SweetAlert2 --> <script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></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="student.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="" class="form-control"> <?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> <input name="num" type="text" class="form-control" placeholder="ادخل رقم القرار "> </div> </div> <div class="col-md-4"> <div class="form-group" style="margin-top:10px;"> <label> الدرجة السابقة </label> <input id='prev_degree' name='prev_degree' type='text' class='form-control' disabled> </div> </div> </div> <div class="row"> <div class="col-md-4"> <div class="form-group" style="margin-top:10px;"> <label> الدرجة الجديدة </label> <input name="new_degree" type="text" class="form-control" disabled> </div> </div> <div class="col-md-4"> <div class="form-group" style="margin-top:10px;"> <label> ترقية استنائية </label> <input name="excep" type="checkbox" class="form-control" > </div> </div> <div class="col-md-4"> <div class="form-group" style="margin-top:10px;"> <label> تاريخ الاستحقاق </label> <input name="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="last_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;"> <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> </form> <?php if ($_SERVER["REQUEST_METHOD"] == "POST") { $emp_id = $_POST['emp_id']; $num = $_POST['num']; $prev_degree = $_POST['prev_degree']; $new_degree = $_POST['new_degree']; $date = $_POST['date']; $last_date = $_POST['last_date']; $excep = $_POST['excep']; $created_at= date('Y-m-d H:i:s'); if(empty($name)) { echo "<div class='alert alert-danger '> الرجاء ادخال كافة البيانات </div>"; exit() ; } $sql = "INSERT INTO promotions (name, created_at) VALUES (?, ?)"; $stmt = $con->prepare($sql); $stmt->bind_param("ss", $name, $created_at); if ($stmt->execute()) { echo "<script> Swal.fire({ title: 'رسالة تأكيد', text: 'تم إضافة بيانات المصرف بنجاح!', icon: 'success', customClass: 'rak', }); </script>"; echo '<meta http-equiv="refresh" content="2;url=banks.php" />'; } else { echo "خطأ في إدخال بيانات المصرف: " . $stmt->error; } } ?> </div> </div> </div> </div> <!--------------------------------------------------------------------------------> <!------------------------------------Footer--------------------------------------> <!--------------------------------------------------------------------------------> <?php include('footer.php'); ?>
-
بناء علي دالة حفظ اخي مصطفي ماهيا كل شروط قبل حفظ وماهي شروط ترقية استنائية ممكن توضح لي
-
الان كيف احول كود الذي في دالة store الي php pure
-
في صفحة العرض index ماهي حقول التي اعرضها
-
قبل تصميم صفحة إدخال بيانات ماذا اعرض في صفحة عرض بناء علي دالة index
-
السلام عليكم بناء علي كود تالي كيف يتم حساب ترقية موظف public function store(Request $request, $id = null) { $empId = $id ?: $request->input('emp_id'); request()->validate( [ 'prev_degree' => "required|numeric", 'date' => "required", 'new_degree' => [ 'required', 'numeric', 'integer', Rule::unique('promotions')->where(function ($query) use($empId) { return $query->where('emp_id', $empId); }) // Unique validation for year with emp_id ], ], [ 'prev_degree.required' => 'يجب إدخال الدرجة السابقة للموظف', 'prev_degree.numeric' => 'يجب إدخال ان تكون الدرجة السابقة للموظف رقم', 'date.required' => 'يجب إدخال تاريخ الاستحقاق ', 'new_degree.required' => 'يجب إدخال الدرجة الجديدة للموظف ', 'new_degree.integer' => 'يجب إدخال ان تكون الدرجة الجديدة رقم ', 'new_degree.numeric' => 'يجب إدخال ان تكون الدرجة الجديدة رقم ', 'new_degree.unique' => 'الترقية لهذا الموظف موجودة مسبقآ', ]); DB::beginTransaction(); try { if(Promotion::where([['emp_id', $empId],['new_degree', request('new_degree')]])->exists()){ DB::rollback(); return redirect()->back()->with('error', 'للآسـف لـقـد تـم إدخـال تـرقـيـة الـمـوظـف لـهـذة الـدرجـة'); } if((request('new_degree') != request('prev_degree')+1 && !request('excep')) || Employee::where([['id', $empId],['degree', request('new_degree')]])->exists()){ DB::rollback(); return redirect()->back()->with('error', 'للآسـف يجب ان تكون الدرجة الجديدة اعلي من الدرجة السابقة بدرجة واحدة'); } if($id == 0){ $emp = Employee::find(request('emp_id')); }else{ $emp = Employee::find($id); } $promotion = new Promotion; if(request('excep')){ $promotion->excep = true; } $promotion->num = request('num'); $promotion->emp_id = $emp->id; $promotion->created_id=Auth()->user()->id; $promotion->prev_degree=request('prev_degree'); $promotion->new_degree = request('new_degree'); $date = request('date'); $promotion->date = $date; $last_date = request('last_date'); $promotion->last_date = $last_date; $promotion->save(); $emp->degree = $promotion->new_degree; $emp->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('PROMOTION', $fileName, 'public'); // Store the file $filePath = 'PROMOTION/' . $fileName; // Generate the file path $finalArray[] = [ 'type' => 'promotion', 'procedure_id' => $promotion->id, 'path' => $filePath, ]; } if (!empty($finalArray)) { File::insert($finalArray); // Insert the file references } } $log = new Log; $log->user_id = auth()->user()->id; $log->type = 5; $log->emp_id = $emp->id; $log->title = " اضافة ترقية جديدة بالدرجة (".request('new_degree').")"; $log->log = " تمت إضافة ترقية جديدة بالدرجة (".request('new_degree').")"; $log->save(); DB::commit(); return redirect()->route('promotion.index')->with('success','تــمــت إضــافــة الـتـرقـيـة بــنــجــاح'); // all good } catch (\Exception $e) { DB::rollback(); return redirect()->back()->with('error', 'للاسف حدث خطأ ما الرجاء اعادة المحاولة'); } } ما هما حقول ادخال بناء علي صفحة create.blade.php هل هما رقم القرار درجة السابقة الدرجة الجديدة ترقية استنائية تاريخ اخر ترقية @extends('admin.layout.master') @section('title') <title>تقـيـيـم جـديـد</title> @endsection @section('content') <div class="pc-container"> <div class="pc-content"> <!-- [ breadcrumb ] start --> <div class="page-header"> <div class="page-block"> <div class="row align-items-center"> <div class="col-md-12"> <ul class="breadcrumb"> <li class="breadcrumb-item"><a href="{{ route('home') }}">لوحة التحكم</a></li> <li class="breadcrumb-item">اضـافـة الترقية للـمـوظـف <a href="{{ route('EmployeeDetails', [$emp->id]) }}"><span style="color: blue;">{{$emp->person->name}}</span></a> </li> </ul> </div> <div class="col-md-6"> <div class="page-header-title"> <h2 class="mb-0">اضـافـة الترقية للـمـوظـف <a href="{{ route('EmployeeDetails', [$emp->id]) }}"><span style="color: blue;">{{$emp->person->name}}</span></a> </h2> </div> </div> </div> </div> </div> <!-- [ breadcrumb ] end --> @include('admin.layout.validation-messages') <!-- [ Main Content ] start --> <div class="row"> <div class="col-12"> <div class="card"> <div class="card-body"> <h4 class="card-title">بـيـانـات الـمـوظـف</h4> <!-- <p class="card-title-desc">Fill all information below</p> --> <div class="row"> <div class="col-sm-4"> <div class="mb-3"> <label for="fullname">اســم الــموظــف</label> @if($emp->person->image) <h4> <img src="{{ asset(Storage::url($emp->person->image)) }}" class="me-1 rounded-circle avatar-sm" alt="user-pic"> {{$emp->person->name}}</h4> @else <h4> <img src="{{asset('assets/images/user.png')}}" class="me-1 rounded-circle avatar-sm" alt="user-pic"> {{ $emp->person->name }}</h4> @endif </div> </div> @if ($emp->person->N_id) <div class="col-sm-4"> <div class="mb-3"> <label for="email">الرقــم الوطــني</label> <h4>{{$emp->person->N_id}}</h4> </div> </div> @else <div class="col-sm-4"> <div class="mb-3"> <label for="email">رقم الإقامة او الجواز لغير الليبين</label> <h4>{{$emp->person->non_citizen_ref_no}}</h4> </div> </div> @endif <div class="col-sm-4"> <div class="mb-3"> <label for="email">المؤهــل في القرار</label> <h4>{{$emp->qualification}}</h4> </div> </div> <div class="col-sm-4"> <div class="mb-3"> <label for="email">التــخــصص</label> @if($emp->specialty) <h4>{{$emp->specialty->name}}</h4> @else <h4> - </h4> @endif </div> </div> <div class="col-sm-4"> <div class="mb-3"> <label for="email">تاريــخ الاستــحقاق</label> <h4>{{$emp->due}}</h4> </div> </div> <div class="col-sm-4"> <div class="mb-3"> <label for="email">الدرجــة الحــالية</label> <h4>{{$emp->degree}}</h4> </div> </div> <div class="col-sm-4"> <div class="mb-3"> <label for="email">تاريــخ المبــاشرة</label> <h4 id ="earnDate">{{$emp->start_date}}</h4> </div> </div> <div class="col-sm-4"> <div class="mb-3"> <label for="email">رقــم القــرار</label> <h4>{{$emp->res_num}}</h4> </div> </div> <div class="col-sm-4 mb-3"> <label class="control-label">الإدارة</label> @if($emp->subSection) <h4>{{$emp->section->name}} - {{ $emp->subSection->name }}</h4> @else <h4>{{$emp->section->name}}</h4> @endif </div> <div class="col-sm-4"> <div class="mb-3"> <label for="email">الـجـنـس </label> <h4>{{$emp->person->gender}}</h4> </div> </div> <div class="col-sm-4"> <div class="mb-3"> <label for="email">الحالة الاجتماعية </label> <h4>{{$emp->person->marital_status}}</h4> </div> </div> </div> </div> </div> <div class="card"> <div class="card-body"> <h4 class="card-title">تـقـديـم بـيـانـات الترقية</h4> <form action="{{route('storePromotion',[$emp->id])}}" method="post" enctype="multipart/form-data" id="form"> @csrf <div class="row mt-3"> <div class="col-sm-4"> <div class="mb-3"> <label for="email">رقـم الـقـرار</label> <input id="earnNum" name="num" type="text" class="form-control" placeholder="رقـم الـقـرار" required oninvalid="this.setCustomValidity('الرجاء ادخال رقـم الـقـرار')" oninput="this.setCustomValidity('')"> </div> </div> <div class="col-sm-4"> <div class="mb-3"> <label for="email">الـدرجـة الـسـابـقـة</label> <input id="earnDate" name="prev_degree" value="{{ $emp->degree }}" type="number" class="form-control" placeholder="الـدرجـة الـسـابـقـة" required oninvalid="this.setCustomValidity('الرجاء ادخال الدرجة السابقة')" oninput="this.setCustomValidity('')"> </div> </div> <div class="col-sm-4"> <div class="mb-3"> <label for="email">الـدرجـة الـجـديـدة</label> <input id="earnDate" name="new_degree" type="number" value="{{ $emp->degree+1 }}" class="form-control" placeholder="الـدرجـة الـجـديـدة" required oninvalid="this.setCustomValidity('الرجاء ادخال الدرجة الجديدة')" oninput="this.setCustomValidity('')"> </div> </div> <div class="col-md-12"> <div class="form-group"> <div class="form-check"> <input class="form-check-input" type="checkbox" name="excep" id="invalidCheck"> <label class="form-check-label" for="invalidCheck">تـرقـيـة اسـتـثـنـائـيـة</label> </div> </div> </div> <div class="col-sm-4"> <div class="mb-3"> <label for="email">تـاريـخ الاسـتـحـقـاق</label> <input id="earnDate" name="date" type="date" class="form-control" oninput="dateValidation(this)" placeholder="YYYY-MM-DD" required oninvalid="this.setCustomValidity('الرجاء ادخال تاريخ الاستحقاق')" oninput="this.setCustomValidity('')"> </div> </div> <div class="col-sm-4"> <div class="mb-3"> <label for="email">تـاريـخ اخـر تـرقـيـة</label> @if ($emp->promotions->last()) <input id="earnDate" name="last_date" value="{{ $emp->promotions->last()->last_date }}" type="date" class="form-control" oninput="dateValidation(this)" placeholder="YYYY-MM-DD"> @else <input id="earnDate" name="last_date" type="date" class="form-control" oninput="dateValidation(this)" placeholder="YYYY-MM-DD"> @endif </div> </div> <div class="col-sm-4"> <div class="mb-3 "> <label for="email">وثـيـقـة (إختياري) </label> <input name="files[]" type="file" class="form-control" multiple> </div> </div> </div> <br> <div class="d-flex flex-wrap gap-2"> <button type="submit" class="btn btn-success waves-effect waves-light">إضــافـة الـتـرقـيـة</button> </div> </form> </div> </div> </div> </div> <!-- end row --> </div> <!-- container-fluid --> </div> <!-- End Page-content --> @endSection @section('script') <script> function dateValidation(inputElement) { var dateRegex = /^\d{1,2}-\d{1,2}-\d{4}$/; // Regex for date format DD-MM-YYYY var dateRegex2 = /^\d{1,2}\/\d{1,2}\/\d{4}$/; // Regex for date format DD/MM/YYYY var dateRegex3 = /^\d{4}-\d{1,2}-\d{1,2}$/; // Regex for date format DD-MM-YYYY var dateRegex4 = /^\d{4}\/\d{1,2}\/\d{1,2}$/; // Regex for date format DD/MM/YYYY // Check if the input matches either of the date formats if (dateRegex.test(inputElement.value) || dateRegex2.test(inputElement.value) || dateRegex3.test(inputElement.value) || dateRegex4.test(inputElement.value)) { // If the date does not match the format, show a custom validity message inputElement.setCustomValidity(''); } else { inputElement.setCustomValidity('الرجاء إدخال التاريخ بالتنسيق DD-MM-YYYY أو DD/MM/YYYY'); // If the date matches one of the formats, clear any custom validity message } } </script> @endSection علما بأن جدول موظف يحتوي علي حقل درجة الوظيفية degree وتاريخ حصول علي درجة date_degree وجدول promotions ترقيات يحتوي علي رقم موظف مفتاح اجنبي ,رقم القرار, الدرجة السابقة, الدرجة الجديدة ,تاريخ الاستحقاق , تاريخ اخر ترقية, حالة القبول ,هل ترقية استنائية هدا كود صفحة index ماذا اعرض فيها @extends('admin.layout.master') @section('title') <title> الـتـرقـيـة الـمـوظــفــيــن </title> @endsection @section('css') <style> .onlyTable { counter-reset: rowNumber; } .onlyTable tr { counter-increment: rowNumber; } .onlyTable tr td:first-child::before { content: counter(rowNumber); min-width: 1em; margin-right: 0.5em; } </style> @endsection @section('content') <div class="pc-container"> <div class="pc-content"> <!-- [ breadcrumb ] start --> <div class="page-header"> <div class="page-block"> <div class="row align-items-center"> <div class="col-md-12"> <ul class="breadcrumb"> <li class="breadcrumb-item"><a href="{{ route('home') }}">لوحة التحكم</a></li> <li class="breadcrumb-item"><a href="#">الـتـرقـيـة الـمـوظــفــيــن </a></li> </ul> </div> <div class="col-md-12"> <div class="page-header-title"> <h2 class="mb-0">الـتـرقـيـة الـمـوظــفــيــن </h2> </div> </div> </div> </div> </div> <!-- [ breadcrumb ] end --> @include('admin.layout.validation-messages') <!-- [ Main Content ] start --> @if ($promotions->count() > 0) <div class="row"> <div class="col-lg-12"> <div class="card"> <div class="card-body"> <div class="card-body" id="print2"> <div class="table-responsive"> <table class="table align-middle table-nowrap table-hover" id="tab1"> <!-- <div class="row"> <div class="col-12"> <div class="page-title-box d-sm-flex align-items-center justify-content-between"> </div> </div> </div> --> <thead class="table-light"> <tr> <th class="text-center" scope="col" style="width: 70px;">#</th> <th class="text-center" scope="col">اســم الــموظــف</th> <th class="text-center" scope="col">رقـم الـقـرار</th> <th class="text-center" scope="col"> الـدرجـة الـسـابـقـة</th> <th class="text-center" scope="col">الـدرجـة الـجـديـدة</th> <th class="text-center" scope="col">تـاريـخ الاسـتـحـقـاق</th> <th scope="col" class="text-center">تـاريـخ آخـر تـرقـيـة</th> <th scope="col" class="text-center">الـوثـيـقـة</th> <th class="text-center" scope="col">مـنـشـئ الـتـقيـيم</th> <th scope="col"class="lastR text-center" id="ch">الاجراءات </th> </tr> </thead> <tbody class="onlyTable"> @foreach ($promotions as $index => $fe) <tr> <td class="text-center">{{ $index + 1 }} </td> <td class="text-center"> <!-- <a href="#"> --> <h5 class="font-size-14 mb-1">{{ $fe->emp->person->name }}</h5> </a> </td> <td class="text-center">{{ $fe->num }} <br> @if ($fe->excep) ترقية استثنائية @endif </td> <td class="text-center">{{ $fe->prev_degree }}</td> <td class="text-center">{{ $fe->new_degree }}</td> <td class="text-center">{{ $fe->date }}</td> <td class="text-center">{{ $fe->last_date }}</td> @if ($fe->files->count() > 0) <td class="text-center"> <a href=".showFile" data-bs-toggle="modal" onclick="showItem({{ $fe->files }})" class="text-success"><i class="bx bx-file" style="font-size:25px;margin-top:5px"></i></a> </td class="text-center"> @else <td class="text-center"> - </td> @endif <td class="text-center">{{ $fe->user->name }}</td> <td class="text-center col-lg-2"> <ul class="list-inline font-size-20 contact-links mb-0 text-center"> <li class="list-inline-item px-2 " id="edit"> <a href="{{ route('promotion.edit', [$fe->id]) }}" class="text-success mr-3"><i class="mdi mdi-pencil font-size-18 "></i></a> </li> <li class="list-inline-item px-2" id="delete"> <form method="POST" action="{{ route('promotion.destroy', [$fe->id]) }}"> {{ csrf_field() }} {{ method_field('DELETE') }} <button type="submit" class="text-danger" style="border: none; background: none;"><i class="mdi mdi-delete font-size-18"></i></button> </form> </li> </ul> </td> </tr> @endforeach </tbody> </table> </div> <ul class="pagination pagination-rounded justify-content-center mb-2"> @if (isset($query)) {{ $promotions->appends($query)->links('pagination::bootstrap-4') }} @else {{ $promotions->links('pagination::bootstrap-4') }} @endif </ul> </ul> </div> </div> </div> </div> @else <div class="row"> <div class="col-lg-12"> <h4 class="mb-sm-0 text-center font-size-18">لا يــوجــد تـرقـيـات</h4> </div> </div> @endif </div> <!-- container-fluid --> </div> <!-- End Page-content --> <div class="row" dir="rtl"> <div class="col-12"> <div class="modal fade showPromotion" tabindex="-1" role="dialog" aria-labelledby="orderdetailsModalLabel" aria-hidden="true"> <div class="modal-dialog modal-dialog-centered modal-lg" role="document"> <div class="modal-content"> <div class="modal-header"> <h5 style="color: black;" class="modal-title" id="orderdetailsModalLabel">الـتـقـيـيـمـات</h5> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> </div> <div class="modal-body"> <div class="row" dir="rtl" id="print22"> <div class="col-12"> <h5 style="color: black;" class="mb-2" dir="rtl">إسم الزبون : <span style="color: blue;" dir="rtl" id="orderName"></span></h5> </div> </div> <div dir="rtl"> <div class="table-responsive" dir="rtl"> <table class="table align-middle table-nowrap table-check"> <thead class="table-light"> <tr style="color: black;"> <th class="text-center">كفائة الاداء والصفات الشخصية</th> <th class="text-center">درجة النهاية العظمي </th> <th class="text-center">درجة كفاية الموظف</th> <th class="text-center">درجة الكفاية المعدلة</th> <th class="text-center">مبررات تعديل درجة كفاية الموظف</th> </tr> </thead> <tbody id="bodyrow23"> </tbody> </table> </div> <div class="row mt-2"> <div class="col-12 text-start"> <button type="button" class="btn btn-light me-1" data-bs-dismiss="modal">إغلاق</button> </div> </div> </div> </div> </div> </div> </div> </div> </div> <div class="row" dir="rtl"> <div class="col-12"> <div class="modal fade showFile" tabindex="-1" role="dialog" aria-labelledby="orderdetailsModalLabel" aria-hidden="true"> {{-- <div class="modal-dialog modal-dialog-centered modal-lg" role="document"> --}} <div class="modal-dialog modal-dialog-centered" role="document"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title" id="orderdetailsModalLabel" dir="rtl"> صورة من الوثيقة <span id="arrName"></span> </h5> <button type="button" class="btn-close" data-bs-dismiss="modal" dir="rtl" aria-label="Close"></button> </div> <div class="modal-body" id="print"> <div dir="rtl"> <div class="table-responsive" dir="rtl"> <table class="table table-hover table-center"> <thead class="table-light"> <tr> <th class="text-center">#</th> <th class="text-center"> عرض</th> <th class="text-center">تنزيل </th> </tr> </thead> <tbody> </tbody> <tbody id="bodyrow"> </tbody> </table> </div> </div> </div> </div> </div> </div> </div> </div> @endsection @section('script') <script> function printDiv() { $('#print2 tr').find('th:last-child, td:last-child').remove(); // $('#print2 tr').find('th:last-child, td:last-child').remove(); var printContent = document.getElementById("print2").innerHTML; var originalContent = document.body.innerHTML; document.body.innerHTML = printContent; window.print(); document.body.innerHTML = originalContent; window.location.reload(); } function showItem(images) { var table = document.getElementById("bodyrow"); console.log(images); table.innerHTML = ""; for (var i = 0; i < images.length; i++) { if (top) { var row = table.insertRow(-1); } else { var row = table.insertRow(); } // (B3) INSERT CELLS var cell = row.insertCell(); cell.innerHTML = " ملف " + (i + 1); cell.style.textAlign = "center"; cell = row.insertCell(); cell.innerHTML = "<a href='/storage/" + images[i]['path'] + "' target='_blank' class='text-success'><i class='bx bx-show' style='font-size:25px;margin-top:5px'></i></a>"; cell.style.textAlign = "center"; cell = row.insertCell(); var idd = images[i]['id']; cell.innerHTML = "<a href='/downloadFile/" + idd + "' class='text-success'><i class='bx bx-download' style='font-size:25px;margin-top:5px'></i></a>"; var idd = images[i]['id']; cell.style.color = "green"; cell.style.textAlign = "center"; } } $(document).on("click", "#showPromotion", function() { var result = $(this).data('result'); var name = $(this).data('name'); console.log(name); console.log(result); document.getElementById("orderName").innerHTML = name; var table = document.getElementById("bodyrow23"); table.innerHTML = ""; if (top) { var row = table.insertRow(-1); } else { var row = table.insertRow(); } cell = row.insertCell(); cell.innerHTML = "أداء الواجب"; cell.style.textAlign = "center"; cell = row.insertCell(); cell.innerHTML = "45"; cell.style.textAlign = "center"; cell.style.fontWeight = "bold"; cell = row.insertCell(); cell.innerHTML = result["grade11"]; cell.style.textAlign = "center"; cell = row.insertCell(); cell.innerHTML = result["grade12"]; cell.style.textAlign = "center"; cell = row.insertCell(); cell.innerHTML = result["textGrade1"]; cell.style.textAlign = "center"; if (top) { var row = table.insertRow(-1); } else { var row = table.insertRow(); } cell = row.insertCell(); cell.innerHTML = "المواظبة علي العمل"; cell.style.textAlign = "center"; cell = row.insertCell(); cell.innerHTML = "15"; cell.style.fontWeight = "bold"; cell.style.textAlign = "center"; cell = row.insertCell(); cell.innerHTML = result["grade21"]; cell.style.textAlign = "center"; cell = row.insertCell(); cell.innerHTML = result["grade22"]; cell.style.textAlign = "center"; cell = row.insertCell(); cell.innerHTML = result["textGrade2"]; cell.style.textAlign = "center"; if (top) { var row = table.insertRow(-1); } else { var row = table.insertRow(); } cell = row.insertCell(); cell.innerHTML = "القدرات والأستعداد الذاتي"; cell.style.textAlign = "center"; cell = row.insertCell(); cell.innerHTML = "20"; cell.style.fontWeight = "bold"; cell.style.textAlign = "center"; cell = row.insertCell(); cell.innerHTML = result["grade31"]; cell.style.textAlign = "center"; cell = row.insertCell(); cell.innerHTML = result["grade32"]; cell.style.textAlign = "center"; cell = row.insertCell(); cell.innerHTML = result["textGrade3"]; cell.style.textAlign = "center"; if (top) { var row = table.insertRow(-1); } else { var row = table.insertRow(); } cell = row.insertCell(); cell.innerHTML = "العلاقات الأنسانية"; cell.style.textAlign = "center"; cell = row.insertCell(); cell.innerHTML = "20"; cell.style.fontWeight = "bold"; cell.style.textAlign = "center"; cell = row.insertCell(); cell.innerHTML = result["grade41"]; cell.style.textAlign = "center"; cell = row.insertCell(); cell.innerHTML = result["grade42"]; cell.style.textAlign = "center"; cell = row.insertCell(); cell.innerHTML = result["textGrade4"]; cell.style.textAlign = "center"; }); </script> @endsection
- 13 اجابة
-
- 2
-
-
لماذا في تعديل البيانات لايعمل كود يقول لي تم اخد اجازة مسبقا انا اريده يعدل بيانات بنفس منطق ادخال يعني يعدل لكن بنفس شروط كل اجازة ممكن تعديل علي كود اخي مصطفي لكن يعدل بنفس شروط اجازة <?php include('header.php'); // Assuming you have the course ID passed via GET for the update $v_id = $_GET['id']; // Fetch existing course data from the database $sql = "SELECT * FROM vacations WHERE emp_id= ?"; $stmt = $con->prepare($sql); $stmt->bind_param("i", $v_id); $stmt->execute(); $result = $stmt->get_result(); $row = $result->fetch_assoc(); $sql2 = "SELECT * FROM people WHERE id= ?"; $stmt = $con->prepare($sql2); $stmt->bind_param("i", $v_id); $stmt->execute(); $result2 = $stmt->get_result(); $row2 = $result2->fetch_assoc(); ?> <!--------------------------------------------------------------------------------> <!------------------------------------header--------------------------------------> <!--------------------------------------------------------------------------------> <head> <!-- مكتبة SweetAlert2 --> <script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></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="student.php">الاجازات</a></li> <li class="active">تعديل بيانات الاجازة</li> </ol> </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: 25px 40px;"> <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="" class="form-control"> <option value="<?php echo $row2['id'] ?>"> <?php echo $row2['name'] ?> </option> </select> </div> </div> <div class="col-md-4"> <div class="form-group" style="margin-top: 10px;"> <label>نوع الاجازة</label> <select name="type" id="" class="form-control"> <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 type="date" class="form-control" name="start_date" id="" value="<?php echo $row['start_date']; ?>" > </div> </div> </div> <div class="row"> <div class="col-md-4"> <div class="form-group" style="margin-top: 10px;"> <label>تاريخ المباشرة</label> <input type="date" class="form-control" name="end_date" id="" value="<?php echo $row['end_date']; ?>" > </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" value="<?php echo $row['reason']; ?>"> </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 = (int)$_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; $updated_at = date('Y-m-d H:i:s'); $errors = []; if (!$type) $errors[] = 'يجب تحديد نوع الإجازة'; if (!$start_date) $errors[] = 'يجب إدخال تاريخ بداية الإجازة'; if (!$end_date) $errors[] = 'يجب إدخال تاريخ المباشرة'; if ($end_date <= $start_date) $errors[] = 'تاريخ المباشرة يجب أن يكون بعد بداية الإجازة'; if ($errors) { echo implode('<br>',$errors); exit; } $stmt = $con->prepare("SELECT e.start_date , p.birth_date , p.gender FROM employees e JOIN people p ON p.id = e.person_id WHERE e.person_id = ?"); $stmt->bind_param("i",$emp_id); $stmt->execute(); $stmt->bind_result($hire_date,$birth_date,$gender); if(!$stmt->fetch()){ echo 'لم يتم العثور على بيانات الموظف'; exit; } $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($pending); $stmt->fetch(); $stmt->close(); if($pending){ echo 'هناك إجازة قيد الإجراء لهذا الموظف.'; exit; } $start = new DateTime($start_date); $end = new DateTime($end_date); $requested_days = $start->diff($end)->days + 1; $current_year = (int)$start->format('Y'); switch ($type) { case 'اجازة سنوية': $to = new DateTime($end_date); $age = $to->diff( new DateTime($birth_date) )->y; $service_years = $to->diff( new DateTime($hire_date) )->y; $annual_quota = ($age >= 50 || $service_years >= 20) ? 45 : 30; $stmt = $con->prepare("SELECT COALESCE(SUM(DATEDIFF(end_date,start_date)+1),0) FROM vacations WHERE emp_id = ? AND type = 'اجازة سنوية' AND accept = 1 AND YEAR(start_date)=?"); $stmt->bind_param("ii",$emp_id,$current_year); $stmt->execute(); $stmt->bind_result($used); $stmt->fetch(); $stmt->close(); $remaining = $annual_quota - $used; if ($remaining <= 0){ echo 'استهلك الموظف كامل رصيده السنوى لهذا العام.'; exit; } if ($requested_days > $remaining){ echo "الرصيد المتبقى $remaining يوم ولا يمكنك طلب $requested_days يوم."; exit; } if ($requested_days < 15){ $stmt = $con->prepare("SELECT COUNT(*) FROM vacations WHERE emp_id = ? AND type='اجازة سنوية' AND accept = 1 AND YEAR(start_date)=? AND (DATEDIFF(end_date,start_date)+1) >= 15"); $stmt->bind_param("ii",$emp_id,$current_year); $stmt->execute(); $stmt->bind_result($have15); $stmt->fetch(); $stmt->close(); if(!$have15){ echo 'يجب أن يتمتع الموظف بحد أدنى 15 يوم متصلة فى السنة.'; exit; } } break; case 'اجازة مرضية': $stmt = $con->prepare("SELECT COALESCE(SUM(DATEDIFF(end_date,start_date)+1),0) FROM vacations WHERE emp_id = ? AND type = 'اجازة مرضية' AND accept = 1 AND YEAR(start_date)=?"); $stmt->bind_param("ii",$emp_id,$current_year); $stmt->execute(); $stmt->bind_result($used); $stmt->fetch(); $stmt->close(); if ($requested_days > 45){ echo 'الحد الأقصى المستمر للإجازة المرضية هو 45 يوم.'; exit; } if ( ($used + $requested_days) > 60 ){ $left = 60 - $used; echo "المتبقى من رصيد الإجازة المرضية هذا العام هو $left يوم."; exit; } break; case 'اجازة الحج': $stmt = $con->prepare("SELECT COUNT(*) FROM vacations WHERE emp_id=? AND type='اجازة الحج' AND accept=1"); $stmt->bind_param("i",$emp_id); $stmt->execute(); $stmt->bind_result($taken); $stmt->fetch(); $stmt->close(); if($taken){ echo 'تمّ الحصول على إجازة الحج من قبل، لا تُمنح إلا مرة واحدة.'; exit; } if ($requested_days > 20){ echo 'الحد الأقصى لإجازة الحج 20 يوم.'; exit; } break; case 'اجازة زواج': $stmt = $con->prepare("SELECT COUNT(*) FROM vacations WHERE emp_id=? AND type='اجازة زواج' AND accept=1"); $stmt->bind_param("i",$emp_id); $stmt->execute(); $stmt->bind_result($taken); $stmt->fetch(); $stmt->close(); if($taken){ echo 'تمّ الحصول على إجازة زواج سابقًا، لا تُمنح إلا مرة واحدة.'; exit; } if ($requested_days > 14){ echo 'الحد الأقصى لإجازة الزواج هو 14 يوم.'; exit; } break; case 'اجازة وفاة الزوج': if ($gender != 'أنثى'){ echo 'إجازة وفاة الزوج خاصة بالإناث فقط.'; exit; } $stmt = $con->prepare("SELECT COUNT(*) FROM vacations WHERE emp_id=? AND type='اجازة وفاة الزوج' AND accept=1"); $stmt->bind_param("i",$emp_id); $stmt->execute(); $stmt->bind_result($taken); $stmt->fetch(); $stmt->close(); if($taken){ echo 'تمّ الحصول على هذه الإجازة سابقًا، لا تُمنح إلا مرة واحدة.'; exit; } if ($requested_days != 130){ echo 'مدة الإجازة هى 4 أشهر و10 أيام (130 يوم) ويجب إدخال المدة كاملة.'; exit; } break; default: echo 'نوع الإجازة غير معروف'; exit; } $interval = $start->diff($end); $years = $interval->y; $months = $interval->m; $days_only = $requested_days; $sql="UPDATE vacations SET emp_id=?,years=?,months=?,days=?,reason=?,type=?,start_date=?,end_date=?,updated_at=? WHERE emp_id = ? "; $stmt = $con->prepare($sql); $stmt->bind_param("iiiisissssi", $emp_id,$years,$months,$days_only,$reason, $type,$start_date,$end_date,$updated_at,$emp_id); if ($stmt->execute()) { echo "<script> Swal.fire({ title: 'رسالة تأكيد', text: 'تم تحديث بيانات الاجازة بنجاح!', icon: 'success', customClass: 'rak', }); </script>"; echo '<meta http-equiv="refresh" content="2;url=vacations.php" />'; } else { echo "خطأ في تحديث بيانات الاجازة: " . $stmt->error; } } ?> </div> </div> </div> </div> <!--------------------------------------------------------------------------------> <!------------------------------------Footer--------------------------------------> <!--------------------------------------------------------------------------------> <?php include('footer.php'); ?>
-
بارك الله فيك اخي مصطفي قمت بتحميل مكتبة tcpdf لطباعة صفحة لماذا لاتظهر صفحة <?php include("config.php"); require_once('tcpdf/tcpdf.php'); function generateRow(){ $contents = ''; $sql = "SELECT p.id as id, p.name AS employee_name, p.N_id AS national_id, e.degree AS current_degree, e.start_date AS start_date, e.type AS employment_type, e.status AS current_status, d.name AS department_name FROM people p JOIN employees e ON p.id = e.person_id LEFT JOIN sub_sections d ON e.section_id = d.id"; //use for MySQLi OOP $query = $con->query($sql); while($row = $query->fetch_assoc()){ $contents .= " <tr> <td>".$row['id']."</td> <td>".$row['name']."</td> <td>".$row['N_id']."</td> <td>".$row['degree']."</td> <td>".$row['start_date']."</td> <td>".$row['type']."</td> </tr> "; } return $contents; } $pdf = new TCPDF('P', PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); $lg = Array(); $lg['a_meta_charset'] = 'UTF-8'; $lg['a_meta_dir'] = 'rtl'; $lg['a_meta_language'] = 'ar'; $pdf->setLanguageArray($lg); $pdf->setRTL(true); $pdf->SetFont('aealarabiya', '', 11); $pdf->SetCreator(PDF_CREATOR); $pdf->SetTitle("معلومات الموظفين"); $pdf->SetHeaderData('', '', PDF_HEADER_TITLE, PDF_HEADER_STRING); $pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN)); $pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA)); $pdf->SetDefaultMonospacedFont('aealarabiya'); $pdf->SetFooterMargin(PDF_MARGIN_FOOTER); $pdf->SetMargins(PDF_MARGIN_LEFT, '11', PDF_MARGIN_RIGHT); $pdf->setPrintHeader(false); $pdf->setPrintFooter(false); $pdf->SetAutoPageBreak(TRUE, 11); $pdf->AddPage(); $content = ''; $content .= ' <h2 align="center">معلومات الموظفين</h2> <table border="1" cellspacing="0" cellpadding="3"> <tr> <th width="5%">الرقم</th> <th width="20%">الاسم </th> <th width="20%"> الرقم الوطني</th> <th width="20%">الدرجة الحالية</th> <th width="20%">تاريخ المباشرة</th> <th width="20%">نوع التوظيف</th> </tr> '; $content .= generateRow(); $content .= '</table>'; $pdf->writeHTML($content); $pdf->Output('emps.pdf', 'I'); ?> يظهر The requested URL was not found on this server.
-
لماذا كود تعديل لايعمل <?php include('header.php'); error_reporting(0); ini_set('display_errors', 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 = (int)$_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'); $errors = []; if (!$type) $errors[] = 'يجب تحديد نوع الإجازة'; if (!$start_date) $errors[] = 'يجب إدخال تاريخ بداية الإجازة'; if (!$end_date) $errors[] = 'يجب إدخال تاريخ المباشرة'; if ($end_date <= $start_date) $errors[] = 'تاريخ المباشرة يجب أن يكون بعد بداية الإجازة'; if ($errors) { echo implode('<br>',$errors); exit; } $stmt = $con->prepare("SELECT e.start_date , p.birth_date , p.gender FROM employees e JOIN people p ON p.id = e.person_id WHERE e.person_id = ?"); $stmt->bind_param("i",$emp_id); $stmt->execute(); $stmt->bind_result($hire_date,$birth_date,$gender); if(!$stmt->fetch()){ echo 'لم يتم العثور على بيانات الموظف'; exit; } $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($pending); $stmt->fetch(); $stmt->close(); if($pending){ echo 'هناك إجازة قيد الإجراء لهذا الموظف.'; exit; } $start = new DateTime($start_date); $end = new DateTime($end_date); $requested_days = $start->diff($end)->days + 1; $current_year = (int)$start->format('Y'); switch ($type) { case 'اجازة سنوية': $to = new DateTime($end_date); $age = $to->diff( new DateTime($birth_date) )->y; $service_years = $to->diff( new DateTime($hire_date) )->y; $annual_quota = ($age >= 50 || $service_years >= 20) ? 45 : 30; $stmt = $con->prepare("SELECT COALESCE(SUM(DATEDIFF(end_date,start_date)+1),0) FROM vacations WHERE emp_id = ? AND type = 'اجازة سنوية' AND accept = 1 AND YEAR(start_date)=?"); $stmt->bind_param("ii",$emp_id,$current_year); $stmt->execute(); $stmt->bind_result($used); $stmt->fetch(); $stmt->close(); $remaining = $annual_quota - $used; if ($remaining <= 0){ echo 'استهلك الموظف كامل رصيده السنوى لهذا العام.'; exit; } if ($requested_days > $remaining){ echo "الرصيد المتبقى $remaining يوم ولا يمكنك طلب $requested_days يوم."; exit; } if ($requested_days < 15){ $stmt = $con->prepare("SELECT COUNT(*) FROM vacations WHERE emp_id = ? AND type='اجازة سنوية' AND accept = 1 AND YEAR(start_date)=? AND (DATEDIFF(end_date,start_date)+1) >= 15"); $stmt->bind_param("ii",$emp_id,$current_year); $stmt->execute(); $stmt->bind_result($have15); $stmt->fetch(); $stmt->close(); if(!$have15){ echo 'يجب أن يتمتع الموظف بحد أدنى 15 يوم متصلة فى السنة.'; exit; } } break; case 'اجازة مرضية': $stmt = $con->prepare("SELECT COALESCE(SUM(DATEDIFF(end_date,start_date)+1),0) FROM vacations WHERE emp_id = ? AND type = 'اجازة مرضية' AND accept = 1 AND YEAR(start_date)=?"); $stmt->bind_param("ii",$emp_id,$current_year); $stmt->execute(); $stmt->bind_result($used); $stmt->fetch(); $stmt->close(); if ($requested_days > 45){ echo 'الحد الأقصى المستمر للإجازة المرضية هو 45 يوم.'; exit; } if ( ($used + $requested_days) > 60 ){ $left = 60 - $used; echo "المتبقى من رصيد الإجازة المرضية هذا العام هو $left يوم."; exit; } break; case 'اجازة الحج': $stmt = $con->prepare("SELECT COUNT(*) FROM vacations WHERE emp_id=? AND type='اجازة الحج' AND accept=1"); $stmt->bind_param("i",$emp_id); $stmt->execute(); $stmt->bind_result($taken); $stmt->fetch(); $stmt->close(); if($taken){ echo 'تمّ الحصول على إجازة الحج من قبل، لا تُمنح إلا مرة واحدة.'; exit; } if ($requested_days > 20){ echo 'الحد الأقصى لإجازة الحج 20 يوم.'; exit; } break; case 'اجازة زواج': $stmt = $con->prepare("SELECT COUNT(*) FROM vacations WHERE emp_id=? AND type='اجازة زواج' AND accept=1"); $stmt->bind_param("i",$emp_id); $stmt->execute(); $stmt->bind_result($taken); $stmt->fetch(); $stmt->close(); if($taken){ echo 'تمّ الحصول على إجازة زواج سابقًا، لا تُمنح إلا مرة واحدة.'; exit; } if ($requested_days > 14){ echo 'الحد الأقصى لإجازة الزواج هو 14 يوم.'; exit; } break; case 'اجازة وفاة الزوج': if ($gender != 'أنثى'){ echo 'إجازة وفاة الزوج خاصة بالإناث فقط.'; exit; } $stmt = $con->prepare("SELECT COUNT(*) FROM vacations WHERE emp_id=? AND type='اجازة وفاة الزوج' AND accept=1"); $stmt->bind_param("i",$emp_id); $stmt->execute(); $stmt->bind_result($taken); $stmt->fetch(); $stmt->close(); if($taken){ echo 'تمّ الحصول على هذه الإجازة سابقًا، لا تُمنح إلا مرة واحدة.'; exit; } if ($requested_days != 130){ echo 'مدة الإجازة هى 4 أشهر و10 أيام (130 يوم) ويجب إدخال المدة كاملة.'; exit; } break; default: echo 'نوع الإجازة غير معروف'; exit; } $interval = $start->diff($end); $years = $interval->y; $months = $interval->m; $days_only = $requested_days; $stmt = $con->prepare("UPDATE vacations SET years = ?, months = ?, days = ?, reason = ?, companion = ?, type = ?, start_date = ?, end_date = ?, created_at = ? WHERE emp_id = ?"); // Assuming emp_id is the unique identifier $stmt->bind_param("iiissssssi", $years, $months, $days_only, $reason, $companion, $type, $start_date, $end_date, $created_at, $emp_id); if($stmt->execute()){ echo "<script> Swal.fire({title:'تم',text:'تم تحديث الإجازة بنجاح',icon:'success'}); </script>"; echo '<meta http-equiv="refresh" content="2;url=vacations.php">'; } else { echo 'حدث خطأ أثناء الحفظ: '.$stmt->error; } $stmt->close(); } ?> </div> </div> </div> </div> <?php include('footer.php'); ?>
-
اخي مصطفي هل كودك هذا استغنيت عن دالة ووضعت منطق داخل كود ادخال كيف اعرف رصيد كل اجازة متبقي للموظف
-
انا عند اضافة الاجازة لاخزن بيانات الي في جدول vacations اما اسماء اعمدة في جدول people الجنس gender تاريخ الميلاد birth_date في جدول employees تاريخ التعيين start_date دالة تستقبل متغيرات هما نص الاتصال معرف الموظف نوع الاجازة تاريخ التعيين تاريخ الميلاد والجنس وتاريخ نهاية اجازة الذي يدخله مستخدم في input ماذا اكتب في باقي 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 == "اجازة سنوية") { $hire= new DateTime($employee['start_date']); $birth_date=new DateTime($people['birth_date']); $gender=$people['gender']; $to=new DateTime($end_date); }
- 14 اجابة
-
- 1
-
-
بالنسبة لتاريخ ميلاد والجنس الموظف موجدان في جدول people اما بالنسبة تاريخ مباشرة موظف فهيا في جدول employees اما اين اريد تخزين اجازة موظف في جدول vacations
- 14 اجابة
-
- 1
-
-
السلام عليكم لدي منطق تالي لحساب اجازات بالنسبة للاجازة السنوية تكون 30 يوم في السنة و45 يوما في السنة لمن بلغ سن الخمسين او تجاوزت مدة خدمته عشرين عاما وفي جميع الاحوال يجب ان يتمتع الموظف بإجازة لاتقل عن 15 يوما متصلة في السنة بالنسبة لاجازة المرضية لمدة لاتزيد علي 45 يوم متصلة او 60 يوما متقطعة خلال السنة الواحدة اجازة الحج تكون لعشرين يوما ولاتمنح الي مرة خلال فترة الخدمة اجازة الزواج تكون اسبوعين ولاتمنح الي مرة واحدة خلال فترة الخدمة وفاة الزوج اجازة تكون 4 اشهر و10 ايام هدا كود ساعدني به اخي بلال لكن عندما اختار اجازة سنوية لموظف مثلا من تاريخ 1-1-2024 الي 1-1-2025 يقبله ونوعها اجازة سنوية اليس مفترض يحسب حسب العمر اذا كان 50 ياخد 45 يوم وتجاوز 20 عام في خدمة غير ذلك 30 يوم ممكن تعديل علي كود ليدخل بيانات ومعرفة رصيد موظف لكل اجازة حسب منطق وبارك الله فيكم <?php include('header.php'); error_reporting(0); ini_set('display_errors', 0); function calculateVacationBalance($con, $emp_id, $type, $hire_date, $birth_date, $gender, $to_date) { $to = new DateTime($to_date); $hire = new DateTime($hire_date); $birth = new DateTime($birth_date); $current_year = $to->format('Y'); // حساب سنوات الخدمة $service_years = $to->diff($hire)->y; // حساب العمر $age = $to->diff($birth)->y; // استعلام للحصول على الأيام المستخدمة $stmt = $con->prepare(" SELECT COALESCE(SUM(DATEDIFF(end_date, start_date) + 1), 0) AS used_days FROM vacations WHERE emp_id = ? AND type = ? AND accept = 1 AND YEAR(start_date) = ? "); $stmt->bind_param("iss", $emp_id, $type, $current_year); $stmt->execute(); $stmt->bind_result($used_days); $stmt->fetch(); $stmt->close(); $used_days = $used_days ?: 0; switch ($type) { case 'اجازة سنوية': // 30 يومًا سنويًا، 45 يومًا إذا كان العمر ≥ 50 أو الخدمة ≥ 20 سنة $annual_days = ($age >= 50 || $service_years >= 20) ? 45 : 30; $balance = $annual_days - $used_days; // التأكد من أن الرصيد لا يقل عن 15 يومًا متصلة إذا لم يتم استخدامها return max(0, $balance); case 'اجازة مرضية': // 45 يومًا متصلة أو 60 يومًا متقطعة سنويًا $sick_balance = 60 - $used_days; return max(0, $sick_balance); case 'اجازة الحج': // 20 يومًا مرة واحدة خلال الخدمة $stmt = $con->prepare(" SELECT COUNT(*) AS taken FROM vacations WHERE emp_id = ? AND type = 'اجازة الحج' AND accept = 1 "); $stmt->bind_param("i", $emp_id); $stmt->execute(); $stmt->bind_result($taken); $stmt->fetch(); $stmt->close(); return $taken > 0 ? 0 : 20; case 'اجازة زواج': // 14 يومًا مرة واحدة خلال الخدمة $stmt = $con->prepare(" SELECT COUNT(*) AS taken FROM vacations WHERE emp_id = ? AND type = 'اجازة زواج' AND accept = 1 "); $stmt->bind_param("i", $emp_id); $stmt->execute(); $stmt->bind_result($taken); $stmt->fetch(); $stmt->close(); return $taken > 0 ? 0 : 14; case 'اجازة وفاة الزوج': // 130 يومًا (4 أشهر و10 أيام) للإناث فقط، مرة واحدة if ($gender !== 'أنثى') { return 0; } $stmt = $con->prepare(" SELECT COUNT(*) AS taken FROM vacations WHERE emp_id = ? AND type = 'اجازة وفاة الزوج' AND accept = 1 "); $stmt->bind_param("i", $emp_id); $stmt->execute(); $stmt->bind_result($taken); $stmt->fetch(); $stmt->close(); return $taken > 0 ? 0 : 130; default: return 0; } } ?> <head> <script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script> <link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.13/css/select2.min.css" rel="stylesheet" /> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.13/js/select2.min.js"></script> <style> .rak { width: 400px; height: 300px; font-size: 14px !important;} </style> </head> <div class="col-md-9 pan1"> <ol class="breadcrumb" style="background-color: #fff;padding-top:8px;padding-bottom:8px;color:#000;font-size:16px;"> <li><a href="vacations.php">الاجازات</a></li> <li class="active">اضافة اجازة جديد</li> </ol> </div> </div> <div class="row"> <div class="col-md-9 pan1"> <div class="panel" style="color:#000;"> <div class="panel-body" style="font-size:14px; padding-left:40px;padding-right:40px;padding-bottom:25px;padding-top:25px;"> <form method="POST" enctype="multipart/form-data"> <div class="row"> <div class="col-md-4"> <div class="form-group" style="margin-top:10px;"> <label>الموظف</label> <select name="emp_id" id=""> <?php $sql = "SELECT e.person_id, p.name FROM employees e JOIN people p ON e.person_id = p.id;"; $result = $con->query($sql); while ($row = $result->fetch_assoc()) { echo "<option value='{$row['person_id']}'>{$row['name']}</option>"; } ?> </select> </div> </div> <div class="col-md-4"> <div class="form-group" style="margin-top:10px;"> <label>نوع الاجازة</label> <select name="type" id=""> <option value="اجازة سنوية">اجازة سنوية</option> <option value="اجازة مرضية">اجازة مرضية</option> <option value="اجازة الحج">اجازة الحج</option> <option value="اجازة زواج">اجازة زواج</option> <option value="اجازة وفاة الزوج">اجازة وفاة الزوج</option> </select> </div> </div> <div class="col-md-4"> <div class="form-group" style="margin-top:10px;"> <label>تاريخ البداية</label> <input name="start_date" type="date" class="form-control"> </div> </div> </div> <div class="row"> <div class="col-md-4"> <div class="form-group" style="margin-top:10px;"> <label>تاريخ المباشرة</label> <input name="end_date" type="date" class="form-control"> </div> </div> <div class="col-md-4"> <div class="form-group" style="margin-top:10px;"> <label>سبب الاجازة</label> <input name="reason" type="text" class="form-control" placeholder="ادخل سبب الاجازة"> </div> </div> <div class="col-md-4"> <div class="form-group" style="margin-top:10px;"> <label>الموافقة مسبقا</label> <input name="companion" type="checkbox" class="form-control"> </div> </div> </div> <div class="row"> <div class="col-md-4"> <div class="form-group" style="margin-top:10px;"> <button name="submit" type="submit" class="btn btn-primary">إضافة <span class="ion-android-add"></span></button> <button type="reset" class="btn btn-danger">إلغاء <span class="ion-android-delete"></span></button> </div> </div> </div> </form> <?php if ($_SERVER["REQUEST_METHOD"] == "POST") { $emp_id = $_POST['emp_id']; $type = $_POST['type']; $start_date = $_POST['start_date']; $end_date = $_POST['end_date']; $reason = $_POST['reason']; $companion = isset($_POST['companion']) ? 1 : 0; $created_at = date('Y-m-d H:i:s'); $start = new DateTime($start_date); $end = new DateTime($end_date); $interval = $start->diff($end); $years = $interval->y; $months = $interval->m; $days = $interval->d; $errors = []; if (empty($type)) { $errors[] = 'يجب تحديد نوع الإجازة'; } if (empty($start_date)) { $errors[] = 'يجب إدخال تاريخ بداية الإجازة'; } if (empty($end_date)) { $errors[] = 'يجب إدخال تاريخ المباشرة'; } if ($end <= $start) { $errors[] = 'تاريخ المباشرة يجب أن يكون بعد بداية الإجازة'; } if (!empty($errors)) { echo implode('<br>', $errors); exit; } mysqli_begin_transaction($con); try { $stmt = $con->prepare("SELECT * FROM employees WHERE person_id = ?"); $stmt->bind_param("i", $emp_id); $stmt->execute(); $employee = $stmt->get_result()->fetch_assoc(); $stmt->close(); if (!$employee) { echo "لم يتم العثور على بيانات الموظف"; exit; } // تحقق لا يوجد إجازة قيد الإجراء $stmt = $con->prepare("SELECT COUNT(*) FROM vacations WHERE emp_id = ? AND accept = 0"); $stmt->bind_param("i", $emp_id); $stmt->execute(); $stmt->bind_result($count); $stmt->fetch(); $stmt->close(); if ($count > 0) { echo "عذرًا، هنالك إجازة قيد الإجراء للموظف الحالي، الرجاء التحقق."; exit(); } $stmt = $con->prepare("SELECT * FROM people WHERE id = ?"); $stmt->bind_param("i", $emp_id); $stmt->execute(); $people = $stmt->get_result()->fetch_assoc(); $stmt->close(); if ($type == "اجازة سنوية") { $to = new DateTime($to_date); $hire = new DateTime($hire_date); $birth = new DateTime($birth_date); $service_years = $to->diff($hire)->y; $age = $to->diff($birth)->y; // تحديد الحد الأقصى للإجازة السنوية $max_annual_days = ($age >= 50 || $service_years >= 20) ? 45 : 30; // حساب عدد أيام الإجازة المطلوبة $start = new DateTime($start_date); $end = new DateTime($end_date); $interval = $start->diff($end); $requested_days = $interval->days + 1; // التحقق من أن عدد أيام الإجازة المطلوبة لا يتجاوز الحد الأقصى if ($requested_days > $max_annual_days) { echo "لا يمكنك طلب إجازة سنوية تتجاوز " . $max_annual_days . " يومًا. الحد الأقصى المسموح به هو: " . $max_annual_days . " يومًا."; exit; } } if ($type == "اجازة مرضية") { } 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'); ?>
- 14 اجابة
-
- 2
-
-
اخي بلال كيف يكون كود ادخال في حالة اختيار اي اجازة ماذا اضع داخل كل 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; } }
-
قمت بوضع دالة في كود ادخال الان عدل لي كود ليبدا يعمل صحيح <?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'); ?>
- 28 اجابة
-
- 1
-
-
اخي انا كود مرفق كود إدخال بيانات اجازة نفسه به كود دالة اعلي صفحة التي تحسب رصيد كيف يكون الان كود إدخال بعد أصبحت دالة تحسب كل أنواع اجازات علما بأن تاريخ ميلاد في جدول والجنس في جدول
- 28 اجابة
-
- 1
-
-
بالنسبة للاجازة السنوية تكون 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'); ?>
-
اخي انت الحل الذي قدمته منطقي لكن الذي عمره 50 سنة او اكثر يحق له 45 يوم اجازة سنوية انا عملت لشخص اجازة سنوية من 1-1- 2023 الي 31-12-2024 ثم عملت له اجازة سنوية من جديد من تاريخ 1-1-2025 الي 1-1-2026 ظهرت عذرًا، لا يمكن إنشاء الإجازة لعدم توفر الرصيد الكافي. رصيدك: -685 يوم، والطلب: 365 يوم كيف اعرف رصيد كل موظف مثلا قبل عمل اجازة جديدة له
- 28 اجابة
-
- 1
-