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

السؤال

نشر

السلام عليكم اعمل علي نظام شؤون موظفين كيف يتم حساب اجازة موظف بناء علي كود تالي 

<?php

namespace App\Http\Controllers;

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

class VacationController extends Controller
{

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

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

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

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

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

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

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

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

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

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

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

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

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


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


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


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

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

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

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

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

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

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

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

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

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

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

            $vac->update();


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


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

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

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



}

 

Recommended Posts

  • 0
نشر

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

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

بداخل تلك الدالة المنطق يعمل كالتالي :

  • كل موظف له 15 يوما أجازة كل 6 أشهر .
  • ويتم طرح عدد أيام الأجازات التي أخذها من رصيده .

ولاحظ في الدالة show و create هذا السطر :

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

هنا في السطر الثاني يتم إحتساب بدأ الأجازات بدأ من السنة التالية للتعين . أى أن أول سنة تم تعين الموظف فيها لا يتم إحتساب أى رصيد أجازات بها.

فمثلا لو هناك موظف بدأ العمل في 10 مارس 2022 فإنه بعد سنة من 2022 يبدأ إضافة رصيد الإجازات له أي بدأ من 10 مارس 2023.

إذا أول فترة نصف سنوية يبدأ بأخذ أجازات منها هي 1 يونيو 2023.

و مثلا بما أن اليوم هو بتاريخ 10 أبريل 2025.

سيتم احتساب الفترات التالية:

  • 1 يونيو 2023  : 15 يوم
  • 1 يناير 2024 : 15 يوم
  • 1 يونيو 2024 15 يوم
  • 1 يناير 2025 : 15 يوم

إذا المجموع هو 60 يوما والرصيد المتبقي سيكون 60 - عدد الأيام التي قام بأخذها .

بتاريخ 15 دقائق مضت قال ايمن ميلاد:
elseif ($start->month < 6 || ($start->month == 6 && $start->day > 1)) {
            $start->month(6)->day(1); // الانتقال إلى 1 يونيو من نفس العام
        } else if ($start->month == 1 && $start->day > 1) {
            $start->month(6)->day(1); // إذا كان بعد 1 يناير، ننتقل إلى 1 يونيو
        }

ولكن أعتقد أنه توجد مشكلة لديك هنا . حيث الشرطين يقومان بتنفيذ نفس الكود أى بدأ الأجازات من بداية شهر 6 لنفس السنة . لذلك يجب عليك التأكد من المنطق الصحيح .

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

هل هذا ينطبق علي جميع انواع اجازات حسب كود 

يتم إحتساب الأجازات طبقا للأجازات السنوية فقط .

حيث أجازة الوضع أو أجازة الزواج يتم إستخدامهم مرة واحدة فقط للموظف ولا يتم إحتسابهم من رصيد الأجازات ويتم وضع عدد أيام الأجازة ي NULL.

وهذا أيضا بالنسبة إلى الأجازات بدون مرتب ولكن يتم وضع عدد أيام الأجازة ب 365 يوما.

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

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

نعم يتم تمرير الموظف الذي تريد إضافة الأجازة له .

وأيضا نوع الأجازة (سنوية-وضع-بدون مرتب-زواج) و تاريخ بداية ونهاية الأجازة . وأيضا سبب الأجازة وهو إختيارى .

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

  • 0
نشر
بتاريخ الآن قال ايمن ميلاد:

في صفحة اضافة اجازة اقصد هل افضل جلب جميع موظفين داخل تاق select  واختيار موظف منه عن طريق استعمال مكتبة select2 javascript

الحقل الموجود بتم وضع به ال id الخاص بالموظف كما يظهر في الكود يتم إستقبال id المستخدم .

نعم يمكنك وضع الموظفين داخل select إذا كان العدد ليس كبيرا . أو يمكنك إستخدام select2 مع ajax لإحضار الموظفين من خلال طلب ajax حتى لا يتم جعل الكود كبيرا ووضع جميع الموظفين مباشرة في select

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

هذا جدول 

هل افضل وضع جميع موظفين داخل select  واختيار موظف 

لا مشكلة، لكن ذلك مناسب لو عدد الموظفين قليل جداً أقل من 50 موظف مثلاً، بينما لو لديك مئات أو آلاف الموظفين، فإن جلبهم جميعاً من قاعدة البيانات ووضعهم في قائمة HTML منسدلة <select> سيؤدي إلى بطء شديد في تحميل الصفحة وسيتسبب في تجميد المتصفح ويصبح من الصعب جداً على المستخدم البحث عن موظف معين في قائمة طويلة جداً.

الطريقة الأفضل (القائمة المنسدلة القابلة للبحث والإكمال التلقائي تستطيع البحث عن Searchable Dropdown / Autocomplete بحيث تعرض حقل إدخال يبدو كقائمة منسدلة، ولكن عندما يبدأ المستخدم بالكتابة، تُرسل طلب إلى الخادم للبحث عن الموظفين الذين يتطابقون مع ما كتبه المستخدم، ثم تُعرض النتائج فقط.

وبذلك لا يتم تحميل القائمة الكاملة للموظفين، فقط النتائج المطابقة للبحث ويسهل على المستخدم العثور على الموظف المطلوب بسرعة وتعمل بشكل جيد حتى مع عدد كبير جداً من الموظفين.

ويتوفر مكتبات جافاسكريبت للقيام بذلك:

  • Select2
  • Choices.js
  • Tom Select
  • 0
نشر
بتاريخ الآن قال ايمن ميلاد:

لدي موظفين كثر ايهم افضل استخدام برايك 

select2 مع إستخدام ال ajax كما وضحت لك . حيث تمكنك select2 من إستخدام ajax وجعل المستخدم يقوم بكتابة إسم الموظف ويتم إرسال الطلب من خلال ajax وإحضار أسماء الموظفين في الجدول والذي يتم البحث فيهم من خلالهم.

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

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

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

بداخل تلك الدالة المنطق يعمل كالتالي :

  • كل موظف له 15 يوما أجازة كل 6 أشهر .
  • ويتم طرح عدد أيام الأجازات التي أخذها من رصيده .

ولاحظ في الدالة show و create هذا السطر :

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

هنا في السطر الثاني يتم إحتساب بدأ الأجازات بدأ من السنة التالية للتعين . أى أن أول سنة تم تعين الموظف فيها لا يتم إحتساب أى رصيد أجازات بها.

فمثلا لو هناك موظف بدأ العمل في 10 مارس 2022 فإنه بعد سنة من 2022 يبدأ إضافة رصيد الإجازات له أي بدأ من 10 مارس 2023.

إذا أول فترة نصف سنوية يبدأ بأخذ أجازات منها هي 1 يونيو 2023.

و مثلا بما أن اليوم هو بتاريخ 10 أبريل 2025.

سيتم احتساب الفترات التالية:

  • 1 يونيو 2023  : 15 يوم
  • 1 يناير 2024 : 15 يوم
  • 1 يونيو 2024 15 يوم
  • 1 يناير 2025 : 15 يوم

إذا المجموع هو 60 يوما والرصيد المتبقي سيكون 60 - عدد الأيام التي قام بأخذها .

ولكن أعتقد أنه توجد مشكلة لديك هنا . حيث الشرطين يقومان بتنفيذ نفس الكود أى بدأ الأجازات من بداية شهر 6 لنفس السنة . لذلك يجب عليك التأكد من المنطق الصحيح .

كيف استغل منطق سابق في كودي 

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

    // ضبط تاريخ البداية ليتوافق مع أول فترة نصف سنوية بعد التاريخ المحدد
    if ($start->format('n') > 6) {
        $start->setDate($start->format('Y') + 1, 1, 1); // الانتقال إلى 1 يناير من العام التالي
    } elseif ($start->format('n') < 6 || ($start->format('n') == 6 && $start->format('j') > 1)) {
        $start->setDate($start->format('Y'), 6, 1); // الانتقال إلى 1 يونيو من نفس العام
    } elseif ($start->format('n') == 1 && $start->format('j') > 1) {
        $start->setDate($start->format('Y'), 6, 1); // إذا كان بعد 1 يناير، ننتقل إلى 1 يونيو
    }

    // حساب عدد الفترات نصف السنوية المؤهلة حتى الآن
    while ($start <= $now) {
        $totalAccruedDays += 15; // إضافة 15 يوم لكل فترة نصف سنوية
        $start->modify('+6 months'); // الانتقال إلى الفترة نصف السنوية التالية
    }

    $totalAccruedDays -= $usedDays; // طرح الأيام المستخدمة
    return $totalAccruedDays;
}
?>
<!-------------------------------------------------------------------------------->
<!------------------------------------header-------------------------------------->
<!-------------------------------------------------------------------------------->

<head>
    <!-- مكتبة SweetAlert2 -->
    <script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
    <!-- مكتبة Select2 -->
    <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 id, name FROM people";
                                    $result = $con->query($sql);
                                    while ($row = $result->fetch_assoc()) {
                                        echo "<option value='{$row['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>
   
   </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);
    $days = $interval->days; 
    $months = $interval->m + ($interval->y * 12); // حساب عدد الأشهر
    $years = $interval->y; // عدد السنوات
    
    $sql = "INSERT INTO vacations (emp_id, type, start_date, end_date,years,months, days, reason, companion, created_at) VALUES (?, ?,?,?, ?, ?, ?, ?, ?, ?)";
    $stmt = $con->prepare($sql);
    $stmt->bind_param("isssiiisss", $emp_id, $type, $start_date, $end_date,$years,$months, $days, $reason, $companion, $created_at);
            
                if ($stmt->execute()) {
                    echo "<script>
                            Swal.fire({
                                title: 'رسالة تأكيد',
                                text: 'تم إضافة الإجازة بنجاح!',
                                icon: 'success'
                            });
                          </script>";
                } else {
                    echo "خطأ في إدخال البيانات: " . $stmt->error;
                }
                    } 
                
                ?>
            </div>
        </div>
    </div>
</div>

<!-------------------------------------------------------------------------------->
<!------------------------------------Footer-------------------------------------->
<!-------------------------------------------------------------------------------->

<?php
include('footer.php');
?>

 

  • 0
نشر

لماذا لم يتم تخزين بيانات 

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


                
                       
                        
                    
               

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

 

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

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

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

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

  Only 75 emoji are allowed.

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...