update revisi

This commit is contained in:
Jagad R R
2025-05-25 15:14:23 +07:00
parent f0c7c3e3e4
commit f0546fa86f
12 changed files with 619 additions and 415 deletions
@@ -37,23 +37,21 @@ class FormOtherController extends Controller
$startDay = (int) env('STARTING_DATE', 11);
$closingDay = (int) env('CLOSING_DATE', 10);
// Referensi waktu sekarang
$now = Carbon::now();
// Tentukan periode
// Tentukan periode aktif
if ($now->day >= $startDay) {
// Mulai dari tanggal START bulan ini
$startDate = Carbon::create($now->year, $now->month, $startDay)->startOfDay();
// Sampai tanggal CLOSING bulan depan
$closingDate = Carbon::create($now->copy()->addMonth()->year, $now->copy()->addMonth()->month, $closingDay)->endOfDay();
} else {
// Mulai dari tanggal START bulan lalu
$startDate = Carbon::create($now->copy()->subMonth()->year, $now->copy()->subMonth()->month, $startDay)->startOfDay();
// Sampai tanggal CLOSING bulan ini
$closingDate = Carbon::create($now->year, $now->month, $closingDay)->endOfDay();
}
// Query data berdasarkan periode
// Periode untuk keperluan budget
$periodeMonth = strtolower($startDate->format('F'));
$periodeYear = (int) $startDate->format('Y');
$forms = FormOthers::whereBetween('tanggal', [$startDate, $closingDate])
->orderBy('tanggal', 'desc')
->with('user')
@@ -61,44 +59,43 @@ class FormOtherController extends Controller
$availableBudget = null;
if ($role == 'Admin Region' || $role == 'Marketing Operational Manager Region') {
$region_id = auth()->user()->getMyCabangAndRegionId()['region'];
if ($role == 'Admin Region' || $role == 'Marketing Operational Manager Region') {
$region_id = auth()->user()->getMyCabangAndRegionId()['region'];
if ($region_id) {
$users = UserHasCabang::whereHas('cabang', function ($query) use ($region_id) {
$query->where('region_id', $region_id);
})->get();
if ($region_id) {
$users = UserHasCabang::whereHas('cabang', function ($query) use ($region_id) {
$query->where('region_id', $region_id);
})->get();
$userIds = $users->pluck('user_id')->toArray();
$forms = $forms->whereIn('user_id', $userIds);
}
}
else if ($role == 'Area Manager Cabang') {
$userIds = $users->pluck('user_id')->toArray();
$forms = $forms->whereIn('user_id', $userIds);
}
} elseif ($role == 'Area Manager Cabang') {
$cabang_id = auth()->user()->getMyCabangAndRegionId()['cabang'];
if ($cabang_id) {
$users = UserHasCabang::where('cabang_id', $cabang_id)->get();
$userIds = $users->pluck('user_id')->toArray();
$forms = $forms->whereIn('user_id', $userIds);
$availableBudget = BudgetHelper::getAvailableBudget($cabang_id);
}
}
else if ($role == 'Medical Representatif') {
$forms = $forms->where('user_id', auth()->user()->id);
$cabang_id = UserHasCabang::where('user_id', auth()->user()->id)->first()->cabang_id;
$availableBudget = BudgetHelper::getAvailableBudget($cabang_id);
}
else {
$forms = $forms;
$availableBudget = BudgetHelper::getAvailableBudget($cabang_id, $periodeMonth, $periodeYear);
}
} elseif ($role == 'Medical Representatif') {
$forms = $forms->where('user_id', auth()->user()->id);
$cabang_id = UserHasCabang::where('user_id', auth()->user()->id)->first()?->cabang_id;
if ($cabang_id) {
$availableBudget = BudgetHelper::getAvailableBudget($cabang_id, $periodeMonth, $periodeYear);
}
}
session()->put('redirect_url', route('forms.other'));
return view('backend.pages.forms.other.index', [
'forms' => $forms,
return view('backend.pages.forms.other.index', [
'forms' => $forms,
'availableBudget' => $availableBudget
]);
}
]);
}
public function detail($id)
{
@@ -135,7 +132,6 @@ class FormOtherController extends Controller
public function store(Request $request)
{
$this->checkAuthorization(auth()->user(), ['forms.other.create']);
$request->validate([
'kategori_id' => 'required',
'tanggal' => 'required|date',
@@ -147,27 +143,44 @@ class FormOtherController extends Controller
$tanggal = Carbon::parse($request->tanggal);
$startDay = (int) env('STARTING_DATE', 11);
$closingDay = (int) env('CLOSING_DATE', 10);
// Ambil tanggal sekarang untuk tentukan periode berjalan
$now = Carbon::now();
// Tentukan periode input berdasarkan waktu saat ini
if ($now->day >= $startDay) {
// Periode berjalan dari bulan ini sampai bulan depan
$startDate = Carbon::create($now->year, $now->month, $startDay);
$closingDate = Carbon::create($now->copy()->addMonth()->year, $now->copy()->addMonth()->month, $closingDay);
} else {
// Periode berjalan dari bulan lalu sampai bulan ini
$startDate = Carbon::create($now->copy()->subMonth()->year, $now->copy()->subMonth()->month, $startDay);
$closingDate = Carbon::create($now->year, $now->month, $closingDay);
}
// Validasi apakah tanggal berada dalam periode aktif input
if ($tanggal->lt($startDate) || $tanggal->gt($closingDate)) {
session()->flash('error', "Gagal, tanggal tidak berada dalam periode input: {$startDate->format('d M')} - {$closingDate->format('d M')}");
return redirect()->back();
}
$cabang = UserHasCabang::with('cabang')->where('user_id', auth()->user()->id)->first()->cabang;
if($request->total > BudgetHelper::getAvailableBudget($cabang->id)) {
// Ambil cabang user
$cabang = UserHasCabang::with('cabang')->where('user_id', auth()->user()->id)->first()?->cabang;
if (!$cabang) {
session()->flash('error', 'Data cabang tidak ditemukan.');
return redirect()->back();
}
// Tentukan periode budget berdasarkan tanggal input (bukan now)
if ($tanggal->day >= $startDay) {
$periodeDate = Carbon::create($tanggal->year, $tanggal->month, $startDay);
} else {
$periodeDate = Carbon::create($tanggal->copy()->subMonth()->year, $tanggal->copy()->subMonth()->month, $startDay);
}
$periodeMonth = strtolower($periodeDate->format('F'));
$periodeYear = (int) $periodeDate->format('Y');
// Cek budget
$availableBudget = BudgetHelper::getAvailableBudget($cabang->id, $periodeMonth, $periodeYear);
if($request->total > $availableBudget) {
session()->flash('error', 'Alokasi budget bulanan cabang tidak mencukupi,silahkan ajukan pada periode expense berikutnya');
return redirect()->back();
}
@@ -307,46 +320,66 @@ class FormOtherController extends Controller
}
public function update(Request $request, $id)
{
{
$this->checkAuthorization(auth()->user(), ['forms.other.edit']);
$role = auth()->user()->getRoleNames()[0];
$form = FormOthers::findOrfail($id);
$cabang_id = UserHasCabang::where('user_id', $form->user_id)->first()->cabang_id;
$form = FormOthers::findOrFail($id);
$request->validate([
'kategori_id' => 'required',
'tanggal' => 'required|date',
'keterangan' => 'required',
'total' => 'required|numeric|min:1|max:' . BudgetHelper::getAvailableBudget($cabang_id),
'bukti_total' => ['nullable', 'file', 'max:51200'],
]);
if($form->status != 'On Progress' && $role == 'Medical Representatif') {
if ($form->status !== 'On Progress' && $role === 'Medical Representatif') {
session()->flash('error', 'You cannot edit this form because it has been approved or rejected.');
return redirect()->back();
}
$cabang = UserHasCabang::with('cabang')->where('user_id', $form->user_id)->first()->cabang;
$region = Region::where('id', $cabang->region_id)->first();
$kategori = Kategori::where('id', $request->kategori_id)->first();
$cabang = UserHasCabang::with('cabang')->where('user_id', $form->user_id)->first()?->cabang;
if (!$cabang) {
session()->flash('error', 'Cabang tidak ditemukan.');
return redirect()->back();
}
// Hitung periode dari tanggal input
$tanggal = Carbon::parse($request->tanggal);
$startDay = (int) env('STARTING_DATE', 11);
if ($tanggal->day >= $startDay) {
$periodeDate = Carbon::create($tanggal->year, $tanggal->month, $startDay);
} else {
$periodeDate = Carbon::create($tanggal->copy()->subMonth()->year, $tanggal->copy()->subMonth()->month, $startDay);
}
$periodeMonth = strtolower($periodeDate->format('F'));
$periodeYear = (int) $periodeDate->format('Y');
// Ambil available budget
$availableBudget = BudgetHelper::getAvailableBudget($cabang->id, $periodeMonth, $periodeYear);
// Validasi input
$request->validate([
'kategori_id' => 'required',
'tanggal' => 'required|date',
'keterangan' => 'required',
'total' => 'required|numeric|min:1|max:' . $availableBudget,
'bukti_total' => ['nullable', 'file', 'max:51200'],
]);
$region = Region::find($cabang->region_id);
$kategori = Kategori::find($request->kategori_id);
$filePaths = [];
$folderPath = '/expense/' . $region->code . '/' . $cabang->code . '/other';
if ($request->hasFile('bukti_total')) {
$bukti_total = $request->file('bukti_total');
$filename = Str::uuid() . '.' . $bukti_total->extension();
$filePaths['bukti_total'] = $folderPath . '/' . $filename;
$filename = Str::uuid() . '.' . $bukti_total->extension();
$filePaths['bukti_total'] = $folderPath . '/' . $filename;
NextCloudHelper::uploadFile(
$folderPath,
$bukti_total->getContent(),
$filename
$filename
);
}
// Save the form data
// Update form
$form->update([
'kategori_id' => $request->kategori_id,
'tanggal' => $request->tanggal,
@@ -359,7 +392,7 @@ class FormOtherController extends Controller
AuditTrailHelper::AddAuditTrail('Update', 'Update Record at Form Other (' . $form->expense_number . ')');
session()->flash('success', 'Form has been updated.');
return redirect()->back();
}
}
public function approve($id)
{
@@ -546,16 +579,35 @@ class FormOtherController extends Controller
public function finalApprove($id)
{
$this->checkAuthorization(auth()->user(), ['final_approval.approve']);
$form = FormOthers::findOrFail($id);
$form = FormOthers::findOrfail($id);
if($form->approved_at == null || $form->approved2_at == null) {
if ($form->approved_at === null || $form->approved2_at === null) {
session()->flash('error', 'Form must be approved by both approvers before final approval.');
return redirect()->back();
}
// Check if the total nominal exceeds the available budget
$cabang_id = UserHasCabang::where('user_id', $form->user_id)->first()->cabang_id;
if($form->approved_total > BudgetHelper::getAvailableBudget($cabang_id)) {
$cabang_id = UserHasCabang::where('user_id', $form->user_id)->first()?->cabang_id;
if (!$cabang_id) {
session()->flash('error', 'Data cabang tidak ditemukan.');
return redirect()->back();
}
// Hitung periode dari tanggal form
$tanggal = Carbon::parse($form->tanggal);
$startDay = (int) env('STARTING_DATE', 11);
if ($tanggal->day >= $startDay) {
$periodeDate = Carbon::create($tanggal->year, $tanggal->month, $startDay);
} else {
$periodeDate = Carbon::create($tanggal->copy()->subMonth()->year, $tanggal->copy()->subMonth()->month, $startDay);
}
$periodeMonth = strtolower($periodeDate->format('F'));
$periodeYear = (int) $periodeDate->format('Y');
// Ambil sisa budget
$availableBudget = BudgetHelper::getAvailableBudget($cabang_id, $periodeMonth, $periodeYear);
if($form->approved_total > $availableBudget) {
session()->flash('error', 'Budget cabang untuk periode ini tidak mencukupi, silahkan ajukan pada periode expense berikutnya');
return redirect()->back();
}