368 lines
13 KiB
PHP
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');
|
|
}
|
|
}
|