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

298 lines
11 KiB
PHP

<?php
namespace App\Http\Controllers\Dashboard;
use App\Exports\CooperationCompletionExport;
use App\Http\Controllers\Controller;
use App\Http\Requests\CooperationCompletionRequest;
use App\Models\Announcement;
use App\Models\CooperationCompletion;
use App\Models\Media;
use Barryvdh\DomPDF\Facade\Pdf;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log;
use Maatwebsite\Excel\Facades\Excel;
class CooperationCompletionController extends Controller
{
// Main page: Penyelesaian Kerja Sama
public function index(Request $request)
{
return view('dashboard.cooperation-completions.index', [
'title' => 'Penyelesaian Kerja Sama',
'mediaCollection' => Media::all(),
'media' => $request->input('media', []),
'status' => $request->input('status', null),
'date' => $request->input('date', null),
'from_month' => $request->input('from_month', null),
'to_month' => $request->input('to_month', null),
'year' => $request->input('year', null),
]);
}
public function store(CooperationCompletionRequest $request, $id)
{
$validatedData = $request->validated();
try {
$validatedData['payment_request_letter'] = store_file($validatedData['payment_request_letter'], 'uploads/cooperation-completions')['randomFileName'];
$validatedData['invoice'] = store_file($validatedData['invoice'], 'uploads/cooperation-completions')['randomFileName'];
$validatedData['bank_reference'] = store_file($validatedData['bank_reference'], 'uploads/cooperation-completions')['randomFileName'];
$validatedData['electronic_tax_invoice'] = store_file($validatedData['electronic_tax_invoice'], 'uploads/cooperation-completions')['randomFileName'];
if (isset($validatedData['other_document'])) {
$validatedData['other_document'] = store_file($validatedData['other_document'], 'uploads/cooperation-completions')['randomFileName'];
} else {
$validatedData['other_document'] = null;
}
$validatedData['order_id'] = decrypt_id($id);
$validatedData['media_id'] = Auth::user()->company->media->id;
CooperationCompletion::create($validatedData);
} catch (\Exception $e) {
Log::error('CooperationCompletions (store): '.$e);
return redirect()->back()->with('failed-status', 'Gagal mengirim formulir.');
}
return redirect()->back()->with('success-status', 'Berhasil mengirim formulir.');
}
public function show($mediaOrderId, $id)
{
$cooperationCompletion = CooperationCompletion::findOrFail(decrypt_id($id));
return view('dashboard.cooperation-completions.show', [
'title' => 'Detail Penyelesaian Kerja Sama',
'cooperationCompletion' => $cooperationCompletion,
'mediaOrderId' => $mediaOrderId,
]);
}
public function showIndex($id)
{
$cooperationCompletion = CooperationCompletion::findOrFail(decrypt_id($id));
return view('dashboard.cooperation-completions.index.show', [
'title' => 'Detail Penyelesaian Kerja Sama',
'cooperationCompletion' => $cooperationCompletion,
]);
}
public function processIndex($id)
{
$cooperationCompletion = CooperationCompletion::findOrFail(decrypt_id($id));
return view('dashboard.cooperation-completions.index.process', [
'title' => 'Detail Penyelesaian Kerja Sama',
'cooperationCompletion' => $cooperationCompletion,
]);
}
public function accept($id)
{
try {
$completion = CooperationCompletion::with(['order', 'media'])->findOrFail(decrypt_id($id));
$completion->update([
'status' => '1',
]);
// Announcements
$announcementData = [
'headline' => 'Formulir penyelesaian kerja sama <u>'.$completion->order->cooperation->name.'</u> telah <span class="text-primary">disetujui</span>',
'content' => '<p>Admin telah menyetujui laporan formulir penyelesaian kerja sama Anda.</p>',
'enhancer_id' => Auth::id(),
];
$createdAnnouncement = Announcement::create($announcementData);
$createdAnnouncement->users()->attach($completion->media->company->user->id, ['category' => 'system']);
// End Announcements
} catch (\Exception $e) {
Log::error('CooperationCompletions (accept): '.$e);
return redirect()->back()->with('failed-status', 'Gagal menyetujui penyelesaian kerja sama');
}
return redirect()->back()->with('success-status', 'Berhasil menyetujui penyelesaian kerja sama.');
}
public function reject($mediaOrderId, $id)
{
$cooperationCompletion = CooperationCompletion::findOrFail(decrypt_id($id));
return view('dashboard.cooperation-completions.reject', [
'title' => 'Tolak Penyelesaian Kerja Sama',
'cooperationCompletion' => $cooperationCompletion,
'mediaOrderId' => $mediaOrderId,
]);
}
public function rejectAction(Request $request, $mediaOrderId, $id)
{
try {
$validatedData = $request->validate([
'rejection_reason' => ['required'],
], [
'rejection_reason.required' => 'Alasan penolakan wajib diisi.',
]);
$completion = CooperationCompletion::with(['order', 'media'])->findOrFail(decrypt_id($id));
$completion->update([
'status' => '2',
'rejection_reason' => $validatedData['rejection_reason'],
]);
// Announcements
$announcementData = [
'headline' => 'Formulir penyelesaian kerja sama <u>'.$completion->order->cooperation->name.'</u> telah <span class="text-danger">ditolak</span>',
'content' => '<p>Admin telah menolak laporan formulir penyelesaian kerja sama Anda.</p>',
'enhancer_id' => Auth::id(),
];
$createdAnnouncement = Announcement::create($announcementData);
$createdAnnouncement->users()->attach($completion->media->company->user->id, ['category' => 'system']);
// End Announcements
} catch (\Exception $e) {
Log::error('CooperationCompletions (rejectAction): '.$e);
return redirect()->back()->with('failed-status', 'Gagal menolak penyelesaian kerja sama');
}
return redirect()->back()->with('success-status', 'Berhasil menolak penyelesaian kerja sama.');
}
public function rejectActionIndex(Request $request, $id)
{
try {
$validatedData = $request->validate([
'rejection_reason' => ['required'],
], [
'rejection_reason.required' => 'Alasan penolakan wajib diisi.',
]);
$completion = CooperationCompletion::with(['order', 'media'])->findOrFail(decrypt_id($id));
$completion->update([
'status' => '2',
'rejection_reason' => $validatedData['rejection_reason'],
]);
// Announcements
$announcementData = [
'headline' => 'Formulir penyelesaian kerja sama <u>'.$completion->order->cooperation->name.'</u> telah <span class="text-danger">ditolak</span>',
'content' => '<p>Admin telah menolak laporan formulir penyelesaian kerja sama Anda.</p>',
'enhancer_id' => Auth::id(),
];
$createdAnnouncement = Announcement::create($announcementData);
$createdAnnouncement->users()->attach($completion->media->company->user->id, ['category' => 'system']);
// End Announcements
} catch (\Exception $e) {
Log::error('CooperationCompletions (rejectAction): '.$e);
return redirect()->back()->with('failed-status', 'Gagal menolak penyelesaian kerja sama');
}
return redirect()->back()->with('success-status', 'Berhasil menolak penyelesaian kerja sama.');
}
public function export(Request $request)
{
try {
$export_type = $request->input('export_type', 'excel');
$status = $request->input('status', null);
$media = $request->input('media', null);
$year = $request->input('year', null);
$from_month = $request->input('from_month', null);
$to_month = $request->input('to_month', null);
$date = $request->input('date', null);
if ($export_type === 'excel') {
$formattedNow = Carbon::parse(now())->locale('id')->translatedFormat('d-m-Y');
return Excel::download(new CooperationCompletionExport($media, $status, $year, $from_month, $to_month, $date), 'reports-'.$formattedNow.'.xlsx');
} elseif ($export_type === 'pdf') {
if (is_role(['1', '5'])) {
$query = CooperationCompletion::with(['media.company']);
} elseif (is_role(['3'])) {
$mediaId = Auth::user()->company->media->id;
$query = CooperationCompletion::with(['media.company', 'order.cooperation'])->where('media_id', '=', $mediaId);
}
if (! empty($media) && is_array($media)) {
$query->whereIn('media_id', $media);
}
if ($status) {
switch ($status) {
case 'waiting':
$query->where('status', '0');
break;
case 'accepted':
$query->where('status', '1');
break;
case 'rejected':
$query->where('status', '2');
break;
}
}
if ($year) {
$query->whereYear('created_at', $year);
}
if ($from_month && $to_month) {
$start = Carbon::parse($from_month)->startOfMonth();
$end = Carbon::parse($to_month)->endOfMonth();
$query->whereBetween('created_at', [$start, $end]);
}
if ($date) {
$query->whereDate('created_at', $date);
}
$cooperationCompletions = $query->get();
$pdf = Pdf::loadView('dashboard.cooperation-completions.prints.collection', compact('cooperationCompletions'));
return $pdf->stream(slugify('laporan bukti tayang ').'.pdf');
}
} catch (\Exception $e) {
return redirect()->back()->with('failed-status', 'Gagal melakukan proses export data.');
}
}
public function singlePrint()
{
try {
$cooperationCompletion = CooperationCompletion::with(['media.company'])->first();
// dd('hai');
$pdf = Pdf::loadView('dashboard.cooperation-completions.prints.single', compact('cooperationCompletion'));
return $pdf->stream(slugify('Penyelesaian kerja sama '.$cooperationCompletion->media->name).'.pdf');
} catch (\Exception $e) {
return redirect()->back()->with('failed-status', 'Gagal melakukan proses print data.');
}
}
}