| No | +Nama Perusahaan | +Direktur | +Alamat | +Tanggal Daftar | +Tanggal Validasi | +Status | +Status Edit | ++ |
|---|
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 "";
@@ -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 = '