From 63d01d90a23f2219d5a37ae572ca283ca488fdbb Mon Sep 17 00:00:00 2001 From: myuqinurrohman Date: Wed, 9 Apr 2025 15:15:02 +0700 Subject: [PATCH] feat: process edit and accept account company chore: show company --- app/Exports/CompanyExport.php | 133 ++++++++ app/Helpers/CustomHelper.php | 45 ++- .../Dashboard/CompanyController.php | 299 +++++++++++++++- .../Dashboard/DatatableController.php | 83 ++++- .../Controllers/Dashboard/UserController.php | 73 ++-- app/Http/Requests/CompanyRequest.php | 120 +++++++ app/Models/Company.php | 1 + ...25_02_25_024741_create_companies_table.php | 1 + database/seeders/CompanySeeder.php | 2 +- public/assets/dashboard/css/custom.css | 8 +- .../dashboard/companies/admin/index.blade.php | 210 ++++++++++++ .../companies/edit-request.blade.php | 65 ++++ .../views/dashboard/companies/edit.blade.php | 318 ++++++++++++++++++ .../views/dashboard/companies/index.blade.php | 268 ++++++++++++--- .../views/dashboard/companies/show.blade.php | 220 ------------ .../users/profiles/account.blade.php | 4 + .../dashboard/users/profiles/action.blade.php | 48 ++- .../users/profiles/company.blade.php | 5 + .../users/profiles/heading.blade.php | 13 + .../users/profiles/journalists.blade.php | 4 + .../users/profiles/login-activity.blade.php | 4 + .../dashboard/users/profiles/media.blade.php | 4 + .../request-edit-description.blade.php | 28 ++ .../dashboard/users/profiles/tabs.blade.php | 39 +++ .../views/partials/app/datatable.blade.php | 17 +- routes/web.php | 15 +- 26 files changed, 1682 insertions(+), 345 deletions(-) create mode 100644 app/Exports/CompanyExport.php create mode 100644 app/Http/Requests/CompanyRequest.php create mode 100644 resources/views/dashboard/companies/admin/index.blade.php create mode 100644 resources/views/dashboard/companies/edit-request.blade.php create mode 100644 resources/views/dashboard/companies/edit.blade.php delete mode 100644 resources/views/dashboard/companies/show.blade.php create mode 100644 resources/views/dashboard/users/profiles/request-edit-description.blade.php diff --git a/app/Exports/CompanyExport.php b/app/Exports/CompanyExport.php new file mode 100644 index 0000000..d6bc18a --- /dev/null +++ b/app/Exports/CompanyExport.php @@ -0,0 +1,133 @@ +status = $status; + $this->edit_status = $edit_status; + $this->address = $address; + $this->register_year = $register_year; + $this->register_month = $register_month; + $this->register_date = $register_date; + } + public function collection() + { + $query = Company::with(['user']); + + if($this->status !== 'all'){ + if($this->status === 'waiting'){ + $query->whereHas('user', function ($q){ + $q->where('status', '0'); + }); + }else if($this->status === 'accepted'){ + $query->whereHas('user', function ($q){ + $q->where('status', '1'); + }); + }else if($this->status === 'rejected'){ + $query->whereHas('user', function ($q){ + $q->where('status', '2'); + }); + } + } + + if($this->edit_status !== 'all'){ + if($this->edit_status === 'no-edit'){ + $query->where('edit_status', '0'); + }elseif($this->edit_status === 'waiting'){ + $query->where('edit_status', '1'); + }else if($this->edit_status === 'accepted'){ + $query->where('edit_status', '2'); + }else if($this->edit_status === 'rejected'){ + $query->where('edit_status', '3'); + } + } + + if ($this->address) { + $query->where('address', 'LIKE', '%'.$this->address.'%'); + } + + if ($this->register_year) { + $query->whereYear('created_at', $this->register_year); + } + + if ($this->register_month) { + $monthYear = Carbon::parse($this->register_month); + $query->whereYear('created_at', $monthYear->year) + ->whereMonth('created_at', $monthYear->month); + } + + if ($this->register_date) { + $query->whereDate('created_at', $this->register_date); + } + + return $query->get(); + } + + public function map($company): array + { + return [ + $this->no++, + $company->name, + $company->email, + $company->director_name, + get_user_status($company->user->status), + $company->address, + get_edit_status($company->edit_status), + Carbon::parse($company->created_at)->locale('id')->translatedFormat('l, d F Y'), + Carbon::parse($company->validated_at)->locale('id')->translatedFormat('l, d F Y') + ]; + } + + public function headings(): array + { + return [ + ['Data Perusahaan', '', '', '', '', '', '', '', '', ''], + ['NO', 'Nama Perusahaan', 'Email', 'Direktur', 'Status Akun', 'Alamat', 'Status Edit', 'Tanggal Daftar', 'Tanggal Validasi'] + ]; + } + + public function styles(Worksheet $sheet) + { + $sheet->mergeCells('A1:I1'); // A1 sampai D1 digabung + + // Set alignment untuk pusat horizontal dan vertikal + $sheet->getStyle('A1:I1')->getAlignment()->setHorizontal('center'); + $sheet->getStyle('A1:I1')->getAlignment()->setVertical('center'); + + $sheet->getColumnDimension('A')->setWidth(7); // Set column A width + $sheet->getColumnDimension('B')->setAutoSize(true); + $sheet->getColumnDimension('C')->setAutoSize(true); + $sheet->getColumnDimension('D')->setAutoSize(true); + $sheet->getColumnDimension('E')->setAutoSize(true); + $sheet->getColumnDimension('F')->setAutoSize(true); + $sheet->getColumnDimension('G')->setAutoSize(true); + $sheet->getColumnDimension('H')->setAutoSize(true); + $sheet->getColumnDimension('I')->setAutoSize(true); + + // Menambahkan gaya lain jika diperlukan + $sheet->getStyle('A1:I1')->getFont()->setBold(true); + $sheet->getStyle('A1:I1')->getFont()->setSize(14); + } +} diff --git a/app/Helpers/CustomHelper.php b/app/Helpers/CustomHelper.php index aaa11ae..c5d3ee8 100644 --- a/app/Helpers/CustomHelper.php +++ b/app/Helpers/CustomHelper.php @@ -19,7 +19,7 @@ if (! function_exists('store_file')) { function store_file($file = null, $path, $disk = 'public') { - if ($file && $file instanceof \Illuminate\Http\UploadedFile) { + if (filled($file) && $file && $file instanceof \Illuminate\Http\UploadedFile) { $randomFilename = Str::random(35).time().'.'.$file->getClientOriginalExtension(); $originalFileName = Str::slug(pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME)).'.'.$file->getClientOriginalExtension(); @@ -132,9 +132,29 @@ function get_user_status($status) case '0': return 'Menunggu'; case '1': - return 'Aktif'; + return 'Diterima'; case '2': - return 'Nonaktif'; + return 'Ditolak'; + default: + return "Tidak Diketahui"; + } + } +} + +if (!function_exists('get_edit_status')) { + function get_edit_status($status) + { + switch($status){ + case '0': + return 'Tidak Ada'; + case '1': + return 'Menunggu'; + case '2': + return 'Diterima'; + case '3': + return 'Ditolak'; + default: + return "Tidak Diketahui"; } } } @@ -263,7 +283,7 @@ function display_file($dir, $filename) } $mimeType = mime_content_type($path); - $fileUrl = asset("storage/{$filename}"); + $fileUrl = asset("storage/uploads/{$dir}/{$filename}"); if (str_contains($mimeType, 'image')) { return "File Image"; @@ -274,3 +294,20 @@ function display_file($dir, $filename) return '

Format file tidak didukung

'; } } + +if (! function_exists('change_status')) { + function change_status($status, $category) { + if($category === 'company_edit'){ + switch($status){ + case '0': + return '1'; + case '1': + return '2'; + case '2': + return '3'; + default: + return '0'; + } + } + } +} diff --git a/app/Http/Controllers/Dashboard/CompanyController.php b/app/Http/Controllers/Dashboard/CompanyController.php index b6f28c9..855a819 100644 --- a/app/Http/Controllers/Dashboard/CompanyController.php +++ b/app/Http/Controllers/Dashboard/CompanyController.php @@ -2,34 +2,301 @@ namespace App\Http\Controllers\Dashboard; +use App\Exports\CompanyExport; use App\Http\Controllers\Controller; +use App\Http\Requests\CompanyRequest; use App\Models\Company; +use App\Models\LoginHistory; +use App\Models\Role; +use App\Models\User; +use Carbon\Carbon; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Auth; +use Maatwebsite\Excel\Facades\Excel; class CompanyController extends Controller { - public function index(){ - return view('dashboard.companies.index',[ - 'title' => 'Perusahaan' + public function index(Request $request){ + if(is_role(['1'])){ + return view('dashboard.companies.admin.index',[ + 'title' => 'Perusahaan', + 'status' => $request->input('status', null), + 'edit_status' => $request->input('edit_status', null), + 'address' => $request->input('address', null), + 'register_year' => $request->input('register_year', null), + 'register_month' => $request->input('register_month', null), + 'register_date' => $request->input('register_date', null), + ]); + }else if(is_role(['3'])){ + $user = User::with(['role', 'company.media.journalists'])->findOrFail(Auth::id()); + + $data = [ + 'title' => 'Data Perusahaan', + 'user' => $user, + ]; + + return view('dashboard.companies.index', $data); + } + } + + public function editRequest(){ + if(!in_array(Auth::user()->company->edit_status, ['0', '2', '3'])){ + abort(404); + } + + return view('dashboard.companies.edit-request', [ + 'title' => 'Permohonan Ubah Data Perusahaan' ]); } - public function create(){} + public function editRequestAction(Request $request){ + if(!in_array(Auth::user()->company->edit_status, ['0', '2', '3'])){ + abort(404); + } - public function store(){} - - public function edit(){} - - public function update(){} - - public function show($id){ - $company = Company::findOrFail(decrypt_id($id)); - - return view('dashboard.companies.show', [ - 'title' => 'Detail Perusahaan', - 'company' => $company + $validatedData = $request->validate([ + 'edit_description' => ['required'], + ], [ + 'edit_description.required' => 'Deskripsi wajib diisi.', ]); + + if(!Auth::check()){ + abort(404); + } + + $user = User::with(['company'])->findOrFail(Auth::id()); + $updatedCompany = $user->company->update([ + 'edit_status' => '1', + 'edit_description' => $validatedData['edit_description'] + ]); + + if($updatedCompany){ + return redirect()->route('dashboard.companies.index')->with('success-status', 'Berhasil melakukan permohonan edit data perusahaan.'); + }else{ + return redirect()->route('dashboard.companies.index')->with('failed-status', 'Gagal melakukan permohonan edit data perusahaan.'); + } + } + + public function edit(){ + if(!in_array(Auth::user()->company->edit_status, ['2'])){ + abort(404); + } + + $user = User::with(['role', 'company.media.journalists'])->findOrFail(Auth::id()); + + return view('dashboard.companies.edit', [ + 'title' => 'Ubah Data Perusahaan', + 'user' => $user + ]); + } + + public function update(CompanyRequest $request){ + if(!in_array(Auth::user()->company->edit_status, ['2'])){ + abort(404); + } + + $validatedData = $request->validated(); + + $company = User::with(['company'])->findOrFail(Auth::id())->company; + + $fileFieldMap = [ + 'company_director_nik_doc' => 'director_nik_doc', + 'company_deed_incorporation_doc' => 'deed_incorporation_doc', + 'company_trade_license_doc' => 'trade_license_doc', + 'company_tax_id_number_doc' => 'tax_id_number_doc', + 'company_taxable_enterprise_doc' => 'taxable_enterprise_doc', + 'company_annual_tax_return_doc' => 'annual_tax_return_doc', + 'company_domicile_certificate_doc' => 'domicile_certificate_doc', + 'company_profile_doc' => 'profile_doc', + ]; + + $companyFileNames = []; + + foreach ($fileFieldMap as $requestKey => $dbField) { + if ($request->hasFile($requestKey) && filled($validatedData[$requestKey])) { + $companyFileNames[$requestKey] = store_file($validatedData[$requestKey], '/uploads/companies', 'public')['randomFileName']; + } else { + $companyFileNames[$requestKey] = $company->{$dbField}; + } + } + + $updatedCompany = $company->update([ + 'name' => $validatedData['company_name'], + 'email' => $validatedData['company_email'], + 'address' => $validatedData['company_address'], + 'director_name' => $validatedData['company_director_name'], + 'director_nik' => $validatedData['company_director_nik'], + 'director_nik_doc' => $companyFileNames['company_director_nik_doc'], + 'deed_incorporation' => $validatedData['company_deed_incorporation'], + 'deed_incorporation_doc' => $companyFileNames['company_deed_incorporation_doc'], + 'trade_license' => $validatedData['company_trade_license'], + 'trade_license_doc' => $companyFileNames['company_trade_license_doc'], + 'tax_id_number' => $validatedData['company_tax_id_number'], + 'tax_id_number_doc' => $companyFileNames['company_tax_id_number_doc'], + 'taxable_enterprise' => $validatedData['company_taxable_enterprise'], + 'taxable_enterprise_doc' => $companyFileNames['company_taxable_enterprise_doc'], + 'annual_tax_return' => $validatedData['company_annual_tax_return'], + 'annual_tax_return_doc' => $companyFileNames['company_annual_tax_return_doc'], + 'domicile_certificate' => $validatedData['company_domicile_certificate'], + 'domicile_certificate_doc' => $companyFileNames['company_domicile_certificate_doc'], + 'profile' => $validatedData['company_profile'], + 'profile_doc' => $companyFileNames['company_profile_doc'], + 'edit_description' => null, + 'edit_status' => '0', + ]); + + if($updatedCompany){ + return redirect()->route('dashboard.companies.index')->with('success-status', 'Berhasil mengubah data perusahaan.'); + }else{ + return redirect()->route('dashboard.companies.index')->with('failed-status', 'Gagal mengubah data perusahaan.'); + } + } + + public function show($id, $type){ + $user = User::with(['role', 'company.media.journalists'])->findOrFail(decrypt_id($id)); + + $data = [ + 'title' => 'Data Perusahaan', + 'user' => $user, + 'roles' => Role::all(), + 'page' => 'company', + 'purpose' => 'show', + 'idnPage' => 'perusahaan', + 'route' => 'companies', + 'type' => $type + ]; + + if($type === 'account'){ + return view('dashboard.users.profiles.account', $data); + }elseif($type === 'login-activities'){ + $data['loginActivities'] = LoginHistory::where('user_id', $user->id)->orderByDesc('id')->simplePaginate(20); + return view('dashboard.users.profiles.login-activity', $data); + }elseif($type === 'company'){ + return view('dashboard.users.profiles.company', $data); + }elseif($type === 'media'){ + return view('dashboard.users.profiles.media', $data); + }elseif($type === 'journalists'){ + return view('dashboard.users.profiles.journalists', $data); + } } public function destroy(){} + + public function process(Request $request, $id, $type){ + $user = User::with(['role', 'company.media.journalists'])->findOrFail(decrypt_id($id)); + + if($request->query('category') && !in_array($request->query('category'), ['account-status', 'edit-request'])){ + abort(404); + } + + $data = [ + 'title' => 'Data Perusahaan', + 'user' => $user, + 'roles' => Role::all(), + 'page' => 'company', + 'purpose' => 'process', + 'idnPage' => 'perusahaan', + 'route' => 'companies', + 'type' => $type, + 'category' => $request->query('category', null) + ]; + + if($type === 'account'){ + return view('dashboard.users.profiles.account', $data); + }elseif($type === 'login-activities'){ + $data['loginActivities'] = LoginHistory::where('user_id', $user->id)->orderByDesc('id')->simplePaginate(20); + return view('dashboard.users.profiles.login-activity', $data); + }elseif($type === 'company'){ + return view('dashboard.users.profiles.company', $data); + }elseif($type === 'media'){ + return view('dashboard.users.profiles.media', $data); + }elseif($type === 'journalists'){ + return view('dashboard.users.profiles.journalists', $data); + } + } + + public function processAcceptAction(Request $request, $id, $type, $category){ + $user = User::with(['company'])->findOrFail(decrypt_id($id)); + + if(!in_array($category, ['account-status', 'edit-request'])){ + abort(404); + } + + if(is_role(['1']) && in_array($category, ['account-status', 'edit-request'])){ + if($category === 'account-status' && $user->status === '0'){ + $user->update([ + 'status' => '1' + ]); + }else if($category === 'edit-request' && $user->company->edit_status === '1'){ + $user->company->update([ + 'edit_status' => '2' + ]); + } + } + + return response()->json([ + 'message' => 'Berhasil menyetujui'.($category === 'edit-request' ? ' permohonan edit' : '').' perusahaan.' + ]); + + // return redirect()->back()->with('success-status', 'Berhasil menyetujui'.($category === 'edit-request' ? 'permohonan edit' : '').'perusahaan.'); + } + + public function processRejectAction(Request $request, $id, $type, $category){ + $user = User::with(['company'])->findOrFail(decrypt_id($id)); + + if(!in_array($category, ['account-status', 'edit-request'])){ + abort(404); + } + + if(is_role(['1']) && in_array($category, ['account-status', 'edit-request'])){ + + $validatedData = $request->validate([ + 'rejection_reason' => ['required'], + ], [ + 'rejection_reason.required' => 'Alasan penolakan wajib diisi.', + ]); + + if($category === 'account-status' && $user->status === '0'){ + $user->update([ + 'status' => '2' + ]); + + $user->company->update([ + 'rejection_reason' => $validatedData['rejection_reason'] + ]); + }else if($category === 'edit-request' && $user->company->edit_status === '1'){ + $user->company->update([ + 'edit_status' => '3', + 'edit_rejection_reason' => $validatedData['rejection_reason'] + ]); + } + } + + return redirect()->route('dashboard.companies.index')->with('success-status', 'Berhasil menolak'.($category === 'edit-request' ? ' permohonan edit' : '').' perusahaan.'); + } + + public function export(Request $request) + { + $status = $request->input('status', null); + $edit_status = $request->input('edit_status', null); + $address = $request->input('address', null); + $register_year = $request->input('register_year', null); + $register_month = $request->input('register_month', null); + $register_date = $request->input('register_date', null); + + $formattedNow = Carbon::parse(now())->locale('id')->translatedFormat('d-m-Y'); + + return Excel::download(new CompanyExport($status, $edit_status, $address, $register_year, $register_month, $register_date), 'companies-'.$formattedNow.'.xlsx'); + } + + public function filter(Request $request){ + + $filteredRequest = $request->except('_token'); + + $filterField = array_filter($filteredRequest, function ($value) { + return filled($value); + }); + + return redirect()->route('dashboard.companies.index', $filterField); + } } diff --git a/app/Http/Controllers/Dashboard/DatatableController.php b/app/Http/Controllers/Dashboard/DatatableController.php index a93a65a..d3613b0 100644 --- a/app/Http/Controllers/Dashboard/DatatableController.php +++ b/app/Http/Controllers/Dashboard/DatatableController.php @@ -683,9 +683,62 @@ public function airingProofTheme(Request $request){ public function company(Request $request){ if ($request->ajax()) { + $status = $request->input('status', null); + $edit_status = $request->input('edit_status', null); + $address = $request->input('address', null); + $register_year = $request->input('register_year', null); + $register_month = $request->input('register_month', null); + $register_date = $request->input('register_date', null); + $query = Company::with(['user']); - $data = Company::with(['user'])->get(); + if($status !== 'all'){ + if($status === 'waiting'){ + $query->whereHas('user', function ($q){ + $q->where('status', '0'); + }); + }else if($status === 'accepted'){ + $query->whereHas('user', function ($q){ + $q->where('status', '1'); + }); + }else if($status === 'rejected'){ + $query->whereHas('user', function ($q){ + $q->where('status', '2'); + }); + } + } + + if($edit_status !== 'all'){ + if($edit_status === 'no-edit'){ + $query->where('edit_status', '0'); + }elseif($edit_status === 'waiting'){ + $query->where('edit_status', '1'); + }else if($edit_status === 'accepted'){ + $query->where('edit_status', '2'); + }else if($edit_status === 'rejected'){ + $query->where('edit_status', '3'); + } + } + + if ($address) { + $query->where('address', 'LIKE', '%'.$address.'%'); + } + + if ($register_year) { + $query->whereYear('created_at', $register_year); + } + + if ($register_month) { + $monthYear = Carbon::parse($register_month); + $query->whereYear('created_at', $monthYear->year) + ->whereMonth('created_at', $monthYear->month); + } + + if ($register_date) { + $query->whereDate('created_at', $register_date); + } + + $data = $query->get(); return DataTables::of($data) ->addIndexColumn() @@ -696,8 +749,8 @@ public function company(Request $request){ case 1: return 'Diterima'; case 2: - return 'Ditolak'; - case 3: + return 'Ditolak'; + default: return 'Tidak Diketahui'; } }) @@ -707,12 +760,14 @@ public function company(Request $request){ ->addColumn('status_edit', function ($data) { switch($data->edit_status){ case 0: - return 'Menunggu'; + return 'Tidak Ada'; case 1: - return 'Diterima'; + return 'Menunggu'; case 2: - return 'Ditolak'; + return 'Diterima'; case 3: + return 'Ditolak'; + default: return 'Tidak Diketahui'; } }) @@ -723,20 +778,26 @@ public function company(Request $request){ return idn_date($data->validated_at, 'd F Y'); }) ->addColumn('action', function ($data) { - $showUrl = route('dashboard.companies.show', ['id' => encrypt_id($data->id)]); - - $editUrl = route('dashboard.companies.edit', ['id' => encrypt_id($data->id)]); + $showUrl = route('dashboard.companies.show', ['id' => encrypt_id($data->user->id), 'type' => 'company']); $deleteUrl = route('dashboard.companies.destroy', ['id' => encrypt_id($data->id)]); + $processAccountCompanyUrl = route('dashboard.companies.process', ['id' => encrypt_id($data->user->id), 'type' => 'company', 'category' => 'account-status']); + + $processEditRequestCompanyUrl = route('dashboard.companies.process', ['id' => encrypt_id($data->user->id), 'type' => 'company', 'category' => 'edit-request']); + $dropdown = '