simedkom/app/Http/Controllers/Dashboard/JournalistController.php
2025-10-13 08:35:36 +07:00

368 lines
13 KiB
PHP

<?php
namespace App\Http\Controllers\Dashboard;
use App\Exports\JournalistExport;
use App\Http\Controllers\Controller;
use App\Http\Requests\JournalistRequest;
use App\Models\Journalist;
use App\Models\Media;
use App\Models\User;
use Barryvdh\DomPDF\Facade\Pdf;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Maatwebsite\Excel\Facades\Excel;
class JournalistController extends Controller
{
public function index(Request $request)
{
if (is_role(['1', '5'])) {
if ($request->has('media_ids') && $request->input('media_ids') && count($request->input('media_ids')) > 10) {
return redirect()->back()->with('failed-status', 'Hanya bisa memfilter 10 media');
}
return view('dashboard.journalists.admin.index', [
'title' => 'Data Jurnalis',
'media' => Media::all(),
'media_ids' => $request->input('media_ids', null),
'status' => $request->input('status', null),
'edit_status' => $request->input('edit_status', null),
'register_year' => $request->input('register_year', null),
'register_month' => $request->input('register_month', null),
'register_date' => $request->input('register_date', null),
]);
} elseif (is_role(['3'])) {
$user = User::with(['role', 'company.media.journalists'])->findOrFail(Auth::id());
return view('dashboard.journalists.index', [
'title' => 'Data Jurnalis',
'user' => $user,
'journalists' => $user->company->media->journalists
->where('approved_status', '1')
->whereNull('deleted_at'),
]);
}
}
public function submission()
{
return view('dashboard.journalists.submission', [
'title' => 'Data Permohonan Penambahan Jurnalis',
]);
}
public function processSubmission($id)
{
$journalist = Journalist::with(['media.company'])->findOrFail(decrypt_id($id));
return view('dashboard.journalists.process-submission', [
'title' => 'Data Permohonan Penambahan Jurnalis',
'journalist' => $journalist,
]);
}
public function processSubmissionAction(Request $request, $id, $action)
{
$journalist = Journalist::with(['media.company'])->findOrFail(decrypt_id($id));
if ($action === 'accept') {
$acceptedJournalist = $journalist->update([
'approved_status' => '1',
'approved_at' => now(),
]);
if ($acceptedJournalist) {
return response()->json(['message' => 'Berhasil menyetujui jurnalis.']);
}
} elseif ($action === 'reject') {
$validatedData = $request->validate([
'rejection_reason' => ['required'],
], [
'rejection_reason.required' => 'Deskripsi wajib diisi.',
]);
$rejectedJournalist = $journalist->update([
'approved_status' => '2',
'rejection_reason' => $validatedData['rejection_reason'],
]);
return redirect()->route('dashboard.journalists.submissions')->with('success-status', 'Berhasil menolak jurnalis.');
}
}
public function create()
{
return view('dashboard.journalists.create', [
'title' => 'Tambah Data Jurnalis',
]);
}
public function store(JournalistRequest $request)
{
$validatedData = $request->validated();
$fileFieldMap = [
'journalist_ukw_sertificate_doc' => 'ukw_sertificate_doc',
'journalist_press_card_doc' => 'press_card_doc',
];
$journalistFileNames = [];
foreach ($fileFieldMap as $requestKey => $dbField) {
if ($request->hasFile($requestKey) && filled($validatedData[$requestKey])) {
$journalistFileNames[$requestKey] = store_file($validatedData[$requestKey], '/uploads/journalists')['randomFileName'];
} else {
$journalistFileNames[$requestKey] = null;
}
}
$createdJournalist = Journalist::create([
'name' => $validatedData['journalist_name'],
'email' => $validatedData['journalist_email'],
'phone_number' => $validatedData['journalist_phone_number'],
'press_card' => $validatedData['journalist_press_card'],
'press_card_doc' => $journalistFileNames['journalist_press_card_doc'],
'ukw_sertificate' => $validatedData['journalist_ukw_sertificate'],
'ukw_sertificate_doc' => $journalistFileNames['journalist_ukw_sertificate_doc'],
'approved_status' => '0',
'approved_at' => null,
'edit_description' => null,
'edit_status' => '0',
'media_id' => Auth::user()->company->media->id,
]);
if ($createdJournalist) {
return redirect()->route('dashboard.journalists.index')->with('success-status', 'Berhasil menambahkan jurnalis.')->with('created-journalist', true);
} else {
return redirect()->route('dashboard.journalists.index')->with('failed-status', 'Gagal menambahkan jurnalis.');
}
}
public function editRequest($id)
{
$journalist = Journalist::findOrFail(decrypt_id($id));
if (! in_array($journalist->edit_status, ['0', '3'])) {
abort(404);
}
return view('dashboard.journalists.edit-request', [
'title' => 'Permohonan Ubah Data Jurnalis',
'journalist' => $journalist,
]);
}
public function editRequestAction(Request $request, $id)
{
$journalist = Journalist::findOrFail(decrypt_id($id));
if (! in_array($journalist->edit_status, ['0', '3'])) {
abort(404);
}
$validatedData = $request->validate([
'edit_description' => ['required'],
], [
'edit_description.required' => 'Deskripsi wajib diisi.',
]);
if (! Auth::check()) {
abort(404);
}
$updatedJournalist = $journalist->update([
'edit_status' => '1',
'edit_description' => $validatedData['edit_description'],
]);
if ($updatedJournalist) {
return redirect()->route('dashboard.journalists.index')->with('success-status', 'Berhasil melakukan permohonan edit data jurnalis.');
} else {
return redirect()->route('dashboard.journalists.index')->with('failed-status', 'Gagal melakukan permohonan edit data jurnalis.');
}
}
public function processEdit($id)
{
$journalist = Journalist::findOrFail(decrypt_id($id));
if (! in_array($journalist->edit_status, ['1', '2']) || ! is_role(['1'])) {
abort(404);
}
return view('dashboard.journalists.show', [
'title' => 'Permohonan Ubah Data Jurnalis',
'journalist' => $journalist,
'purpose' => 'processEdit',
]);
}
public function processEditAction(Request $request, $id, $action)
{
$journalist = Journalist::findOrFail(decrypt_id($id));
if (! in_array($journalist->edit_status, ['1']) || ! is_role(['1'])) {
abort(404);
}
if (is_role(['1'])) {
if ($action === 'accept') {
$acceptedJournalist = $journalist->update([
'edit_status' => '2',
]);
if ($acceptedJournalist) {
return response()->json(['message' => 'Berhasil menyetujui permohonan edit jurnalis.']);
}
} elseif ($action === 'reject') {
$validatedData = $request->validate([
'edit_rejection_reason' => ['required'],
], [
'edit_rejection_reason.required' => 'Alasan penolakan wajib diisi.',
]);
$journalist->update([
'edit_status' => '3',
'edit_rejection_reason' => $validatedData['edit_rejection_reason'],
]);
return redirect()->route('dashboard.journalists.index')->with('success-status', 'Berhasil menolak permohonan edit jurnalis.');
}
}
}
public function edit($id)
{
$journalist = Journalist::findOrFail(decrypt_id($id));
return view('dashboard.journalists.edit', [
'title' => 'Ubah Data Jurnalis',
'journalist' => $journalist,
]);
}
public function update(JournalistRequest $request, $id)
{
$validatedData = $request->validated();
$journalist = Journalist::findOrFail(decrypt_id($id));
if (! in_array($journalist->edit_status, ['2'])) {
abort(404);
}
$fileFieldMap = [
'journalist_ukw_sertificate_doc' => 'ukw_sertificate_doc',
'journalist_press_card_doc' => 'press_card_doc',
];
$journalistFileNames = [];
foreach ($fileFieldMap as $requestKey => $dbField) {
if ($request->hasFile($requestKey) && filled($validatedData[$requestKey])) {
$journalistFileNames[$requestKey] = store_file($validatedData[$requestKey], '/uploads/journalists')['randomFileName'];
} else {
$journalistFileNames[$requestKey] = $journalist->{$dbField};
}
}
$createdJournalist = $journalist->update([
'name' => $validatedData['journalist_name'],
'email' => $validatedData['journalist_email'],
'phone_number' => $validatedData['journalist_phone_number'],
'press_card' => $validatedData['journalist_press_card'],
'press_card_doc' => $journalistFileNames['journalist_press_card_doc'],
'ukw_sertificate' => $validatedData['journalist_ukw_sertificate'],
'ukw_sertificate_doc' => $journalistFileNames['journalist_ukw_sertificate_doc'],
'approved_status' => $journalist->approved_status,
'approved_at' => $journalist->approved_at,
'edit_description' => null,
'edit_status' => '0',
'media_id' => Auth::user()->company->media->id,
]);
if ($createdJournalist) {
return redirect()->route('dashboard.journalists.index')->with('success-status', 'Berhasil mengubah jurnalis.');
} else {
return redirect()->route('dashboard.journalists.index')->with('failed-status', 'Gagal mengubah jurnalis.');
}
}
public function show($id)
{
$journalist = Journalist::findOrFail(decrypt_id($id));
return view('dashboard.journalists.show', [
'title' => 'Detail Jurnalis',
'journalist' => $journalist,
]);
}
public function destroy($id)
{
try {
$journalist = Journalist::findOrFail(decrypt_id($id));
$user = User::with(['company.media.journalists'])->findOrFail(Auth::id());
$journalists = optional($user->company?->media)->journalists?->whereNull('deleted_at')->where('approved_status', '1');
if ($journalists->count() <= 1) {
return response()->json([
'status' => 'failed',
'message' => 'Media harus punya minimal satu jurnalis.',
]);
}
$journalist->delete();
return response()->json(['message' => 'Berhasil menghapus jurnalis.']);
} catch (\Exception $e) {
return response()->json(['message' => 'Gagal menghapus jurnalis.'], 500);
}
}
public function export(Request $request)
{
$media_ids = $request->input('media_ids', null);
$status = $request->input('status', null);
$edit_status = $request->input('edit_status', 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 JournalistExport($media_ids, $status, $edit_status, $register_year, $register_month, $register_date), 'journalist-'.$formattedNow.'.xlsx');
}
public function filter(Request $request)
{
$filteredRequest = $request->except('_token');
// Kalau "all" dipilih di media_ids, set ulang jadi hanya ["all"]
if (isset($filteredRequest['media_ids']) && in_array('all', $filteredRequest['media_ids'])) {
$filteredRequest['media_ids'] = ['all'];
} else {
// Buang media kosong
$filteredRequest['media_ids'] = array_filter($filteredRequest['media_ids'] ?? []);
}
// Filter semua field yang terisi
$filterField = array_filter($filteredRequest, fn ($val) => filled($val));
return redirect()->route('dashboard.journalists.index', $filterField);
}
public function printData($id)
{
$journalist = Journalist::with(['media.company'])->findOrFail(decrypt_id($id));
$pdf = Pdf::loadView('dashboard.journalists.print', compact('journalist'));
return $pdf->stream('perusahaan-'.slugify($journalist->name).'.pdf');
}
}