Your IP : 216.73.216.79


Current Path : /var/www/html/reddsis/app/Http/Controllers/Backend/
Upload File :
Current File : /var/www/html/reddsis/app/Http/Controllers/Backend/ContentDirectoryStaffController.php

<?php

namespace App\Http\Controllers\Backend;

use App\Http\Controllers\Controller;
use App\Http\Requests\Backend\ContentDirectoryStaffRequest;
use App\Models\Backend\ContentDirectoryDepartment;
use App\Models\Backend\ContentDirectoryStaff;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;

class ContentDirectoryStaffController extends Controller
{
    private function uploadPhoto($file): string
    {
        $name = pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME);
        $filename = $name . '_' . now()->format('Ymd') . '_' . substr(uniqid(), -5) . '.' . $file->getClientOriginalExtension();

        return $file->storeAs('directory-staff', $filename, 'public');
    }
    public function index(Request $request)
    {
        $search = $request->get('search');
        $departmentFilter = $request->get('department');
        $statusFilter = $request->get('status');

        $staff = ContentDirectoryStaff::query()
            ->with('department')
            ->when($search, function ($q) use ($search) {
                $q->where(function ($sub) use ($search) {
                    $sub->where('directory_staff_name', 'like', "%{$search}%")
                        ->orWhere('directory_staff_email', 'like', "%{$search}%")
                        ->orWhere('directory_staff_phone', 'like', "%{$search}%")
                        ->orWhere('directory_staff_position', 'like', "%{$search}%");
                });
            })
            ->when($departmentFilter, fn($q) => $q->where('directory_staff_department_id', $departmentFilter))
            ->when($statusFilter !== null && $statusFilter !== '', fn($q) => $q->where('directory_staff_status', $statusFilter))
            ->when($departmentFilter, function ($q) {
                $q->orderBy('directory_staff_sort')->orderBy('directory_staff_id');
            }, function ($q) {
                $q->orderBy('directory_staff_department_id')->orderBy('directory_staff_sort')->orderBy('directory_staff_id');
            })
            ->paginate(10)
            ->onEachSide(1)
            ->withQueryString();

        $departments = ContentDirectoryDepartment::orderBy('directory_department_name')
            ->pluck('directory_department_name', 'directory_department_id');

        return view('backend.module.contentDirectoryStaff.index', [
            'staff' => $staff,
            'departments' => $departments,
            'search' => $search,
            'departmentFilter' => $departmentFilter,
            'statusFilter' => $statusFilter,
        ]);
    }

    public function create()
    {
        $departments = ContentDirectoryDepartment::orderBy('directory_department_name')
            ->pluck('directory_department_name', 'directory_department_id');

        return view('backend.module.contentDirectoryStaff.create', [
            'departments' => $departments,
        ]);
    }

    public function store(ContentDirectoryStaffRequest $request)
    {
        $photoPath = null;
        if ($request->hasFile('directory_staff_photo')) {
            $photoPath = $this->uploadPhoto($request->file('directory_staff_photo'));
        }

        ContentDirectoryStaff::create([
            'directory_staff_department_id' => $request->directory_staff_department_id,
            'directory_staff_name' => $request->directory_staff_name,
            'directory_staff_email' => $request->directory_staff_email,
            'directory_staff_phone' => $request->directory_staff_phone,
            'directory_staff_position' => $request->directory_staff_position,
            'directory_staff_photo' => $photoPath,
            'directory_staff_sort' => $request->directory_staff_sort,
            'directory_staff_status' => $request->directory_staff_status ?? 1,
            'created_by' => auth()->id(),
            'updated_by' => auth()->id(),
        ]);

        flash()->success('Staff created successfully!');

        return redirect()->route('content-directory-staff.index');
    }

    public function edit($id)
    {
        $staff = ContentDirectoryStaff::findOrFail($id);

        $departments = ContentDirectoryDepartment::orderBy('directory_department_name')
            ->pluck('directory_department_name', 'directory_department_id');

        return view('backend.module.contentDirectoryStaff.edit', [
            'staff' => $staff,
            'departments' => $departments,
        ]);
    }

    public function update(ContentDirectoryStaffRequest $request, $id)
    {
        $staff = ContentDirectoryStaff::findOrFail($id);

        $photoPath = $staff->directory_staff_photo;
        if ($request->hasFile('directory_staff_photo')) {
            if ($photoPath && Storage::disk('public')->exists($photoPath)) {
                Storage::disk('public')->delete($photoPath);
            }
            $photoPath = $this->uploadPhoto($request->file('directory_staff_photo'));
        }

        $staff->update([
            'directory_staff_department_id' => $request->directory_staff_department_id,
            'directory_staff_name' => $request->directory_staff_name,
            'directory_staff_email' => $request->directory_staff_email,
            'directory_staff_phone' => $request->directory_staff_phone,
            'directory_staff_position' => $request->directory_staff_position,
            'directory_staff_photo' => $photoPath,
            'directory_staff_sort' => $request->directory_staff_sort,
            'directory_staff_status' => $request->directory_staff_status ?? 1,
            'updated_by' => auth()->id(),
        ]);

        flash()->success('Staff updated successfully!');

        return redirect()->route('content-directory-staff.index');
    }

    public function destroy($id)
    {
        $staff = ContentDirectoryStaff::findOrFail($id);

        if ($staff->directory_staff_photo && Storage::disk('public')->exists($staff->directory_staff_photo)) {
            Storage::disk('public')->delete($staff->directory_staff_photo);
        }

        $staff->delete();

        flash()->success('Staff deleted successfully.');

        return redirect()->route('content-directory-staff.index');
    }

    public function reorder(Request $request)
    {
        $ids = $request->input('ids', []);
        $departmentId = $request->input('department_id');
        $page = (int) $request->input('page', 1);
        $perPage = 10;
        $offset = ($page - 1) * $perPage;

        if (empty($ids) || !$departmentId) {
            return response()->json(['success' => false, 'message' => 'Department filter is required to reorder.'], 422);
        }

        foreach ($ids as $index => $id) {
            ContentDirectoryStaff::where('directory_staff_id', $id)
                ->where('directory_staff_department_id', $departmentId)
                ->update(['directory_staff_sort' => $offset + $index + 1]);
        }

        return response()->json(['success' => true]);
    }
}