354 lines
13 KiB
PHP
354 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),
|
|
]);
|
|
}else if(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.']);
|
|
}
|
|
|
|
}else if($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.']);
|
|
}
|
|
}else if($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');
|
|
}
|
|
|
|
}
|