From 99f725b10287406b77cd1d61ff339f4610a462a7 Mon Sep 17 00:00:00 2001 From: myqnrrhmn Date: Wed, 28 May 2025 11:09:44 +0700 Subject: [PATCH] chore: add filter and export cooperation data --- app/Exports/CooperationArchiveExport.php | 4 +- app/Exports/CooperationExport.php | 106 ++++++++++++++++++ .../CooperationArchiveController.php | 2 +- .../Dashboard/DatatableController.php | 45 ++++++-- .../Dashboard/MediaCooperationController.php | 43 ++++++- .../cooperation-archives/index.blade.php | 2 +- .../media-cooperations/index.blade.php | 97 ++++++++++++++++ .../views/partials/app/datatable.blade.php | 12 +- routes/web.php | 5 + 9 files changed, 301 insertions(+), 15 deletions(-) create mode 100644 app/Exports/CooperationExport.php diff --git a/app/Exports/CooperationArchiveExport.php b/app/Exports/CooperationArchiveExport.php index 4d9565b..cc9376e 100644 --- a/app/Exports/CooperationArchiveExport.php +++ b/app/Exports/CooperationArchiveExport.php @@ -17,7 +17,7 @@ class CooperationArchiveExport implements FromCollection, WithHeadings, WithStyl * @return \Illuminate\Support\Collection */ - protected $no = 1; + protected $no = 1; protected $year; protected $month; protected $date; @@ -74,7 +74,7 @@ public function map($cooperationArchive): array $cooperationArchive->name, Carbon::parse($cooperationArchive->start_date)->locale('id')->translatedFormat('l, d F Y'), Carbon::parse($cooperationArchive->end_date)->locale('id')->translatedFormat('l, d F Y'), - $cooperationArchive->description, + strip_tags($cooperationArchive->description), Carbon::parse($cooperationArchive->created_at)->locale('id')->translatedFormat('l, d F Y'), ]; } diff --git a/app/Exports/CooperationExport.php b/app/Exports/CooperationExport.php new file mode 100644 index 0000000..7f1c9ed --- /dev/null +++ b/app/Exports/CooperationExport.php @@ -0,0 +1,106 @@ +year = $year; + $this->month = $month; + $this->date = $date; + } + + public function collection() + { + $query = Cooperation::with(['media', 'mediaOrder']); + + if (is_role(['3'])) { + $mediaId = Auth::user()->company->media->id; + + $query->whereHas('proposals', function ($q) use ($mediaId) { + $q->where('status', 1) + ->where('media_id', $mediaId); + }); + } + + if ($this->year) { + $query->whereYear('created_at', $this->year); + } + + if ($this->month) { + $monthYear = Carbon::parse($this->month); + $query->whereYear('created_at', $monthYear->year) + ->whereMonth('created_at', $monthYear->month); + } + + if ($this->date) { + $query->whereDate('created_at', $this->date); + } + + return $query->get(); + } + + public function map($cooperation): array + { + return [ + $this->no++, + $cooperation->name, + Carbon::parse($cooperation->start_date)->locale('id')->translatedFormat('l, d F Y'), + Carbon::parse($cooperation->end_date)->locale('id')->translatedFormat('l, d F Y'), + strip_tags($cooperation->description), + $cooperation->media->pluck('name')->implode(', '), + Carbon::parse($cooperation->created_at)->locale('id')->translatedFormat('l, d F Y'), + ]; + } + + public function headings(): array + { + return [ + ['Data Rekap Konten', '', '', '', '', '', ''], + ['NO', 'Nama Kerjasama', 'Taanggal Mulai', 'Tanggal Selesai', 'Deskripsi', 'Media', 'Dibuat Pada'] + ]; + } + + public function styles(Worksheet $sheet) + { + $sheet->mergeCells('A1:G1'); // A1 sampai G1 digabung + + // Set alignment untuk pusat horizontal dan vertikal + $sheet->getStyle('A1:G1')->getAlignment()->setHorizontal('center'); + $sheet->getStyle('A1:G1')->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->getStyle('F:F')->getAlignment()->setWrapText(true); + + $sheet->getColumnDimension('G')->setAutoSize(true); + + // Menambahkan gaya lain jika diperlukan + $sheet->getStyle('A1:G1')->getFont()->setBold(true); + $sheet->getStyle('A1:G1')->getFont()->setSize(14); + } +} diff --git a/app/Http/Controllers/Dashboard/CooperationArchiveController.php b/app/Http/Controllers/Dashboard/CooperationArchiveController.php index d23b9dc..e9da3bb 100644 --- a/app/Http/Controllers/Dashboard/CooperationArchiveController.php +++ b/app/Http/Controllers/Dashboard/CooperationArchiveController.php @@ -26,7 +26,7 @@ public function export(Request $request) $month = $request->input('month', null); $date = $request->input('date', null); - return Excel::download(new CooperationArchiveExport($year, $month, $date), 'cooperation-archive.xlsx'); + return Excel::download(new CooperationArchiveExport($year, $month, $date), 'cooperation-archives.xlsx'); }catch(\Exception $e){ return redirect()->back()->with('failed-status', 'Gagal melakukan proses export data.'); } diff --git a/app/Http/Controllers/Dashboard/DatatableController.php b/app/Http/Controllers/Dashboard/DatatableController.php index a3b8c42..a673c84 100644 --- a/app/Http/Controllers/Dashboard/DatatableController.php +++ b/app/Http/Controllers/Dashboard/DatatableController.php @@ -1405,17 +1405,48 @@ public function journalistSubmission(Request $request, $role){ public function cooperation(Request $request){ if ($request->ajax()) { - if(is_role(['1'])){ - $data = Cooperation::with(['media', 'mediaOrder'])->get(); - }else if(is_role(['3'])){ + $year = $request->input('year', null); + $month = $request->input('month', null); + $date = $request->input('date', null); + + // if(is_role(['1'])){ + // $data = Cooperation::with(['media', 'mediaOrder'])->get(); + // }else if(is_role(['3'])){ + // $mediaId = Auth::user()->company->media->id; + // $media = Media::findOrFail($mediaId); + // $data = $media->cooperations->filter(function ($cooperation) use ($mediaId){ + // // Filter cooperation berdasarkan status proposal yang 1 + // return $cooperation->proposals->where('status', 1)->where('media_id', $mediaId)->isNotEmpty(); + // }); + // } + + $query = Cooperation::with(['media', 'mediaOrder']); + + if (is_role(['3'])) { $mediaId = Auth::user()->company->media->id; - $media = Media::findOrFail($mediaId); - $data = $media->cooperations->filter(function ($cooperation) use ($mediaId){ - // Filter cooperation berdasarkan status proposal yang 1 - return $cooperation->proposals->where('status', 1)->where('media_id', $mediaId)->isNotEmpty(); + + $query->whereHas('proposals', function ($q) use ($mediaId) { + $q->where('status', 1) + ->where('media_id', $mediaId); }); } + if ($year) { + $query->whereYear('created_at', $year); + } + + if ($month) { + $monthYear = Carbon::parse($month); + $query->whereYear('created_at', $monthYear->year) + ->whereMonth('created_at', $monthYear->month); + } + + if ($date) { + $query->whereDate('created_at', $date); + } + + $data = $query->get(); + return DataTables::of($data) ->addIndexColumn() diff --git a/app/Http/Controllers/Dashboard/MediaCooperationController.php b/app/Http/Controllers/Dashboard/MediaCooperationController.php index 82524e6..db10ab9 100644 --- a/app/Http/Controllers/Dashboard/MediaCooperationController.php +++ b/app/Http/Controllers/Dashboard/MediaCooperationController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers\Dashboard; +use App\Exports\CooperationExport; use App\Http\Controllers\Controller; use App\Http\Requests\CooperationRequest; use App\Models\Announcement; @@ -9,16 +10,21 @@ use App\Models\CooperationProposal; use App\Models\Media; use App\Models\MediaOrder; +use Carbon\Carbon; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Log; +use Maatwebsite\Excel\Facades\Excel; class MediaCooperationController extends Controller { - public function index(){ + public function index(Request $request){ return view('dashboard.media-cooperations.index', [ - 'title' => 'Kerjasama' + 'title' => 'Kerjasama', + 'date' => $request->input('date', null), + 'month' => $request->input('month', null), + 'year' => $request->input('year', null), ]); } @@ -162,6 +168,39 @@ public function show($id){ ]); } + public function export(Request $request) + { + + try{ + $year = $request->input('year', null); + $month = $request->input('month', null); + $date = $request->input('date', null); + + $formattedNow = Carbon::parse(now())->locale('id')->translatedFormat('d-m-Y'); + return Excel::download(new CooperationExport($year, $month, $date), 'cooperations-'.$formattedNow.'.xlsx'); + }catch(\Exception $e){ + return redirect()->back()->with('failed-status', 'Gagal melakukan proses export data.'); + } + + } + + public function filter(Request $request){ + + try{ + $filteredRequest = $request->except('_token'); + + $filterField = array_filter($filteredRequest, function ($value) { + return filled($value); + }); + + return redirect()->route('dashboard.cooperations.index', $filterField); + }catch(\Exception $e){ + return redirect()->back()->with('status-failed', 'Gagal melakukan proses filtering data.'); + } + + + } + public function mediaProposal($id){ $mediaCooperation = Cooperation::with(['media'])->findOrFail(decrypt_id($id)); diff --git a/resources/views/dashboard/cooperation-archives/index.blade.php b/resources/views/dashboard/cooperation-archives/index.blade.php index a0ee844..274c95c 100644 --- a/resources/views/dashboard/cooperation-archives/index.blade.php +++ b/resources/views/dashboard/cooperation-archives/index.blade.php @@ -31,7 +31,7 @@ --}} {{--
  • Tambah
  • --}}
  • - @if (filled(value: $year)) + @if (filled(value: $date) || filled(value: $month) ||filled(value: $year)) diff --git a/resources/views/dashboard/media-cooperations/index.blade.php b/resources/views/dashboard/media-cooperations/index.blade.php index 3483883..50c18d8 100644 --- a/resources/views/dashboard/media-cooperations/index.blade.php +++ b/resources/views/dashboard/media-cooperations/index.blade.php @@ -29,6 +29,23 @@
  • --}} +
  • + @if (filled(value: $date) || filled(value: $month) ||filled(value: $year)) + + + + + + @endif +
    + Filter +
    +
  • +
  • +
    + Export +
    +
  • Tambah
  • @@ -58,6 +75,86 @@ + + diff --git a/resources/views/partials/app/datatable.blade.php b/resources/views/partials/app/datatable.blade.php index 767b1e0..02cb276 100644 --- a/resources/views/partials/app/datatable.blade.php +++ b/resources/views/partials/app/datatable.blade.php @@ -709,7 +709,15 @@ $('#cooperationsTable').DataTable({ processing: true, serverSide: true, - ajax: '{{ route('dashboard.cooperations.data') }}', + ajax: { + url: '{{ route('dashboard.cooperations.data') }}', + type: 'GET', + data: function(d) { + d.year = '{{ $year }}'; + d.month = '{{ $month }}'; + d.date = '{{ $date }}'; + } + }, columns: [ { data: 'DT_RowIndex', name: 'DT_RowIndex', orderable: false, searchable: false }, { data: 'name', name: 'name' }, @@ -753,7 +761,7 @@ { data: 'id', name: 'id', orderable: true, searchable: false, visible: false }, ], language: datatableLanguage, - responsive: true, + // responsive: true, autoWidth: false, order: [[7, 'desc']], pagingType: "simple", diff --git a/routes/web.php b/routes/web.php index 101667a..7701a1f 100644 --- a/routes/web.php +++ b/routes/web.php @@ -369,8 +369,13 @@ Route::get('/{id}/media-proposals/{proposal_id}/reject', 'mediaProposalReject')->name('media.proposal.reject'); Route::post('/{id}/media-proposals/{proposal_id}/reject', 'mediaProposalRejectAction')->name('media.proposal.reject.action'); + Route::post('/export', 'export')->name('export'); + Route::post('/filter', 'filter')->name('filter'); + Route::get('/create', 'create')->name('create'); Route::post('/', 'store')->name('store'); + + Route::get('/{id}/edit', 'edit')->name('edit'); Route::put('/{id}', 'update')->name('update'); Route::delete('/{id}', 'destroy')->name('destroy');