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
+17 -12
View File
@@ -13,28 +13,33 @@ use App\Models\FormEntertaimentPresentation;
use App\Models\FormVehicleRunningCost; use App\Models\FormVehicleRunningCost;
use App\Helpers\FormHelper; use App\Helpers\FormHelper;
use App\Models\UserHasCabang; use App\Models\UserHasCabang;
use Illuminate\Support\Carbon;
class BudgetHelper class BudgetHelper
{ {
public static function getAvailableBudget($cabang_id) public static function getAvailableBudget($cabang_id, $periode_month, $periode_year)
{ {
// Get the budget control data // Validasi & normalisasi
$budget = BudgetControl::where('cabang_id', $cabang_id)->orderBy('created_at', 'desc')->with(['user.cabang'])->get(); $periode_month = strtolower($periode_month);
$periode_year = (int) $periode_year;
// Ambil budget sesuai cabang dan periode
$budget = BudgetControl::where('cabang_id', $cabang_id)
->where('periode_month', $periode_month)
->where('periode_year', $periode_year)
->with(['user.cabang'])
->get();
// Initialize an empty array to hold the used budget sums
$usedBudget = 0; $usedBudget = 0;
foreach ($budget as $b) {
// Get the month and year from the budget
$month = $b->periode_month;
$year = $b->periode_year;
// Add the used budget per model for the specified month and year to the usedBudget array
$users = UserHasCabang::where('cabang_id', $cabang_id)->get(); $users = UserHasCabang::where('cabang_id', $cabang_id)->get();
$userIds = $users->pluck('user_id')->toArray(); $userIds = $users->pluck('user_id')->toArray();
$forms = FormHelper::getFormsByUserIds($userIds, $month, $year)->sortByDesc('tanggal')->sortByDesc('created_at');
$forms = FormHelper::getFormsByUserIds($userIds, $periode_month, $periode_year)
->sortByDesc('tanggal')
->sortByDesc('created_at');
$usedBudget += $forms->sum('approved_total'); $usedBudget += $forms->sum('approved_total');
}
$availableBudget = $budget->sum('amount') - $usedBudget; $availableBudget = $budget->sum('amount') - $usedBudget;
@@ -10,12 +10,7 @@ use App\Models\BudgetControl;
use App\Models\BudgetControlLog; use App\Models\BudgetControlLog;
use App\Models\Admin; use App\Models\Admin;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Models\FormUpCountry; use Illuminate\Support\Carbon;
use App\Models\FormMeetingSeminar;
use App\Models\FormOthers;
use App\Models\FormEntertaimentPresentation;
use App\Models\FormVehicleRunningCost;
use App\Models\UserHasCabang;
class BudgetControlController extends Controller class BudgetControlController extends Controller
{ {
@@ -47,10 +42,23 @@ class BudgetControlController extends Controller
$budget = BudgetControl::with(['receiver', 'sender', 'cabang'])->get(); $budget = BudgetControl::with(['receiver', 'sender', 'cabang'])->get();
} }
// Calculate usedBudget and availableBudget for each cabang // Tentukan periode berdasarkan start dan closing date
$budget->map(function ($b) { $startDay = (int) env('STARTING_DATE', 11);
$b->availableBudget = BudgetHelper::getAvailableBudget($b->cabang_id); $closingDay = (int) env('CLOSING_DATE', 10);
$now = Carbon::now();
if ($now->day >= $startDay) {
$startDate = Carbon::create($now->year, $now->month, $startDay)->startOfDay();
} else {
$startDate = Carbon::create($now->copy()->subMonth()->year, $now->copy()->subMonth()->month, $startDay)->startOfDay();
}
$periodeMonth = $startDate->month;
$periodeYear = $startDate->year;
// Hitung available budget berdasarkan periode
$budget->map(function ($b) use ($periodeMonth, $periodeYear) {
$b->availableBudget = BudgetHelper::getAvailableBudget($b->cabang_id, $periodeMonth, $periodeYear);
return $b; return $b;
}); });
@@ -471,8 +471,8 @@ class ReportController extends Controller
$availableBudget = 0; $availableBudget = 0;
$month = date('F'); $month = strtolower(date('F')); // convert to lowercase for DB compatibility
$year = date('Y'); $year = (int) date('Y');
$region_id = auth()->user()->getMyCabangAndRegionId()['region'] ?? null; $region_id = auth()->user()->getMyCabangAndRegionId()['region'] ?? null;
$cabang_id = auth()->user()->getMyCabangAndRegionId()['cabang'] ?? null; $cabang_id = auth()->user()->getMyCabangAndRegionId()['cabang'] ?? null;
@@ -520,27 +520,27 @@ class ReportController extends Controller
$cabang = Cabang::where('code', $params['cabang'])->first(); $cabang = Cabang::where('code', $params['cabang'])->first();
if ($cabang) { if ($cabang) {
$userIds = UserHasCabang::where('cabang_id', $cabang->id)->pluck('user_id')->toArray(); $userIds = UserHasCabang::where('cabang_id', $cabang->id)->pluck('user_id')->toArray();
$forms = isset($forms) ? $forms->whereIn('user_id', $userIds) : FormHelper::getFormsByUserIds($userIds); // Ensure $forms is updated $forms = isset($forms)
$availableBudget = BudgetHelper::getAvailableBudget($cabang->id); ? $forms->whereIn('user_id', $userIds)
: FormHelper::getFormsByUserIds($userIds, $month, $year);
// Ensure lowercase month
$availableBudget = BudgetHelper::getAvailableBudget($cabang->id, strtolower($month), (int) $year);
} }
} }
// Filter by date range // Filter by date range
if (isset($params['month']) || isset($params['year'])) { if (isset($params['month']) || isset($params['year'])) {
$month = $params['month'] ?? date('F'); $month = strtolower($params['month'] ?? date('F'));
$year = $params['year'] ?? date('Y'); $year = (int) ($params['year'] ?? date('Y'));
$startOfMonth = Carbon::parse("first day of $month $year")->startOfDay(); $startOfMonth = Carbon::parse("first day of $month $year")->startOfDay();
$endOfMonth = Carbon::parse("last day of $month $year")->endOfDay(); $endOfMonth = Carbon::parse("last day of $month $year")->endOfDay();
if (isset($forms)) { if (isset($forms)) {
// Determine the date column to filter by
$dateColumn = Schema::hasColumn('forms', 'tanggal') ? 'tanggal' : 'created_at'; $dateColumn = Schema::hasColumn('forms', 'tanggal') ? 'tanggal' : 'created_at';
// Further filter existing forms by the determined date column
$forms = $forms->whereBetween($dateColumn, [$startOfMonth, $endOfMonth]); $forms = $forms->whereBetween($dateColumn, [$startOfMonth, $endOfMonth]);
} else { } else {
// Rebuild $forms using FormHelper and filter by role
if ($role == 'Admin Region' || $role == 'Marketing Operational Manager Region') { if ($role == 'Admin Region' || $role == 'Marketing Operational Manager Region') {
if ($region_id) { if ($region_id) {
$users = UserHasCabang::whereHas('cabang', function ($query) use ($region_id) { $users = UserHasCabang::whereHas('cabang', function ($query) use ($region_id) {
@@ -40,22 +40,21 @@ class FormEntertainmentPresentationController extends Controller
$startDay = (int) env('STARTING_DATE', 11); $startDay = (int) env('STARTING_DATE', 11);
$closingDay = (int) env('CLOSING_DATE', 10); $closingDay = (int) env('CLOSING_DATE', 10);
// Referensi waktu sekarang
$now = Carbon::now(); $now = Carbon::now();
// Tentukan periode // Tentukan periode aktif (mulai dan tutup)
if ($now->day >= $startDay) { if ($now->day >= $startDay) {
// Mulai dari tanggal START bulan ini
$startDate = Carbon::create($now->year, $now->month, $startDay)->startOfDay(); $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(); $closingDate = Carbon::create($now->copy()->addMonth()->year, $now->copy()->addMonth()->month, $closingDay)->endOfDay();
} else { } else {
// Mulai dari tanggal START bulan lalu
$startDate = Carbon::create($now->copy()->subMonth()->year, $now->copy()->subMonth()->month, $startDay)->startOfDay(); $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(); $closingDate = Carbon::create($now->year, $now->month, $closingDay)->endOfDay();
} }
// Ambil nama bulan dan tahun dari $startDate untuk keperluan BudgetHelper
$periodeMonth = strtolower($startDate->format('F')); // ex: 'august'
$periodeYear = (int) $startDate->format('Y'); // ex: 2025
$forms = FormEntertaimentPresentation::whereBetween('tanggal', [$startDate, $closingDate]) $forms = FormEntertaimentPresentation::whereBetween('tanggal', [$startDate, $closingDate])
->orderBy('tanggal', 'desc') ->orderBy('tanggal', 'desc')
->with('user') ->with('user')
@@ -74,24 +73,23 @@ class FormEntertainmentPresentationController extends Controller
$userIds = $users->pluck('user_id')->toArray(); $userIds = $users->pluck('user_id')->toArray();
$forms = $forms->whereIn('user_id', $userIds); $forms = $forms->whereIn('user_id', $userIds);
} }
} } elseif ($role == 'Area Manager Cabang') {
else if ($role == 'Area Manager Cabang') {
$cabang_id = auth()->user()->getMyCabangAndRegionId()['cabang']; $cabang_id = auth()->user()->getMyCabangAndRegionId()['cabang'];
if ($cabang_id) { if ($cabang_id) {
$users = UserHasCabang::where('cabang_id', $cabang_id)->get(); $users = UserHasCabang::where('cabang_id', $cabang_id)->get();
$userIds = $users->pluck('user_id')->toArray(); $userIds = $users->pluck('user_id')->toArray();
$forms = $forms->whereIn('user_id', $userIds); $forms = $forms->whereIn('user_id', $userIds);
$availableBudget = BudgetHelper::getAvailableBudget($cabang_id);
$availableBudget = BudgetHelper::getAvailableBudget($cabang_id, $periodeMonth, $periodeYear);
} }
} } elseif ($role == 'Medical Representatif') {
else if ($role == 'Medical Representatif') {
$forms = $forms->where('user_id', auth()->user()->id); $forms = $forms->where('user_id', auth()->user()->id);
$cabang_id = UserHasCabang::where('user_id', auth()->user()->id)->first()->cabang_id; $cabang_id = UserHasCabang::where('user_id', auth()->user()->id)->first()?->cabang_id;
$availableBudget = BudgetHelper::getAvailableBudget($cabang_id);
if ($cabang_id) {
$availableBudget = BudgetHelper::getAvailableBudget($cabang_id, $periodeMonth, $periodeYear);
} }
else {
$forms = $forms;
} }
session()->put('redirect_url', route('forms.entertainment')); session()->put('redirect_url', route('forms.entertainment'));
@@ -167,8 +165,14 @@ class FormEntertainmentPresentationController extends Controller
return redirect()->back(); return redirect()->back();
} }
// Hitung periode budget dari tanggal form
$periodeMonth = strtolower($startDate->format('F'));
$periodeYear = (int) $startDate->format('Y');
$cabang = UserHasCabang::with('cabang')->where('user_id', auth()->user()->id)->first()->cabang; $cabang = UserHasCabang::with('cabang')->where('user_id', auth()->user()->id)->first()->cabang;
if($request->total > BudgetHelper::getAvailableBudget($cabang->id)) { $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'); session()->flash('error', 'Alokasi budget bulanan cabang tidak mencukupi,silahkan ajukan pada periode expense berikutnya');
return redirect()->back(); return redirect()->back();
} }
@@ -313,14 +317,35 @@ class FormEntertainmentPresentationController extends Controller
{ {
$this->checkAuthorization(auth()->user(), ['forms.entertainment.edit']); $this->checkAuthorization(auth()->user(), ['forms.entertainment.edit']);
$role = auth()->user()->getRoleNames()[0]; $role = auth()->user()->getRoleNames()[0];
$form = FormEntertaimentPresentation::findOrfail($id); $form = FormEntertaimentPresentation::findOrFail($id);
$cabang_id = UserHasCabang::where('user_id', $form->user_id)->first()->cabang_id; $cabang_id = UserHasCabang::where('user_id', $form->user_id)->first()?->cabang_id;
if (!$cabang_id) {
return redirect()->back()->with('error', 'Cabang tidak ditemukan.');
}
// Hitung periode berdasarkan tanggal form
$tanggal = Carbon::parse($request->tanggal);
$startDay = (int) env('STARTING_DATE', 11);
$closingDay = (int) env('CLOSING_DATE', 10);
// Periode aktif berdasarkan tanggal input
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');
$availableBudget = BudgetHelper::getAvailableBudget($cabang_id, $periodeMonth, $periodeYear);
$request->validate([ $request->validate([
'tanggal' => 'required', 'tanggal' => 'required',
'jenis' => 'required|in:entertainment,presentation,sponsorship', 'jenis' => 'required|in:entertainment,presentation,sponsorship',
'keterangan' => 'required', 'keterangan' => 'required',
'total' => 'required|numeric|min:1|max:' . BudgetHelper::getAvailableBudget($cabang_id), 'total' => 'required|numeric|min:1|max:' . $availableBudget,
'name' => 'required', 'name' => 'required',
'alamat' => 'required', 'alamat' => 'required',
'nik_or_npwp' => 'required', 'nik_or_npwp' => 'required',
@@ -557,16 +582,36 @@ class FormEntertainmentPresentationController extends Controller
public function finalApprove($id) public function finalApprove($id)
{ {
$this->checkAuthorization(auth()->user(), ['final_approval.approve']); $this->checkAuthorization(auth()->user(), ['final_approval.approve']);
$form = FormEntertaimentPresentation::findOrFail($id);
$form = FormEntertaimentPresentation::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.'); session()->flash('error', 'Form must be approved by both approvers before final approval.');
return redirect()->back(); return redirect()->back();
} }
// Check if the total nominal exceeds the available budget $cabang_id = UserHasCabang::where('user_id', $form->user_id)->first()?->cabang_id;
$cabang_id = UserHasCabang::where('user_id', $form->user_id)->first()->cabang_id;
if($form->approved_total > BudgetHelper::getAvailableBudget($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);
$closingDay = (int) env('CLOSING_DATE', 10);
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');
$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'); session()->flash('error', 'Budget cabang untuk periode ini tidak mencukupi, silahkan ajukan pada periode expense berikutnya');
return redirect()->back(); return redirect()->back();
} }
@@ -45,17 +45,17 @@ class FormMeetingSeminarController extends Controller
// Tentukan periode // Tentukan periode
if ($now->day >= $startDay) { if ($now->day >= $startDay) {
// Mulai dari tanggal START bulan ini
$startDate = Carbon::create($now->year, $now->month, $startDay)->startOfDay(); $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(); $closingDate = Carbon::create($now->copy()->addMonth()->year, $now->copy()->addMonth()->month, $closingDay)->endOfDay();
} else { } else {
// Mulai dari tanggal START bulan lalu
$startDate = Carbon::create($now->copy()->subMonth()->year, $now->copy()->subMonth()->month, $startDay)->startOfDay(); $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(); $closingDate = Carbon::create($now->year, $now->month, $closingDay)->endOfDay();
} }
// Ambil bulan dan tahun dari $startDate untuk keperluan budget
$periodeMonth = strtolower($startDate->format('F')); // contoh: 'august'
$periodeYear = (int) $startDate->format('Y');
$forms = FormMeetingSeminar::whereBetween('tanggal', [$startDate, $closingDate]) $forms = FormMeetingSeminar::whereBetween('tanggal', [$startDate, $closingDate])
->orderBy('tanggal', 'desc') ->orderBy('tanggal', 'desc')
->with('user') ->with('user')
@@ -74,27 +74,27 @@ class FormMeetingSeminarController extends Controller
$userIds = $users->pluck('user_id')->toArray(); $userIds = $users->pluck('user_id')->toArray();
$forms = $forms->whereIn('user_id', $userIds); $forms = $forms->whereIn('user_id', $userIds);
} }
} } elseif ($role == 'Area Manager Cabang') {
else if ($role == 'Area Manager Cabang') {
$cabang_id = auth()->user()->getMyCabangAndRegionId()['cabang']; $cabang_id = auth()->user()->getMyCabangAndRegionId()['cabang'];
if ($cabang_id) { if ($cabang_id) {
$users = UserHasCabang::where('cabang_id', $cabang_id)->get(); $users = UserHasCabang::where('cabang_id', $cabang_id)->get();
$userIds = $users->pluck('user_id')->toArray(); $userIds = $users->pluck('user_id')->toArray();
$forms = $forms->whereIn('user_id', $userIds); $forms = $forms->whereIn('user_id', $userIds);
$availableBudget = BudgetHelper::getAvailableBudget($cabang_id);
$availableBudget = BudgetHelper::getAvailableBudget($cabang_id, $periodeMonth, $periodeYear);
} }
} } elseif ($role == 'Medical Representatif') {
else if ($role == 'Medical Representatif') {
$forms = $forms->where('user_id', auth()->user()->id); $forms = $forms->where('user_id', auth()->user()->id);
$cabang_id = UserHasCabang::where('user_id', auth()->user()->id)->first()->cabang_id; $cabang_id = UserHasCabang::where('user_id', auth()->user()->id)->first()?->cabang_id;
$availableBudget = BudgetHelper::getAvailableBudget($cabang_id);
if ($cabang_id) {
$availableBudget = BudgetHelper::getAvailableBudget($cabang_id, $periodeMonth, $periodeYear);
} }
else {
$forms = $forms;
} }
session()->put('redirect_url', route('forms.meeting')); session()->put('redirect_url', route('forms.meeting'));
return view('backend.pages.forms.meeting.index', [ return view('backend.pages.forms.meeting.index', [
'forms' => $forms, 'forms' => $forms,
'availableBudget' => $availableBudget 'availableBudget' => $availableBudget
@@ -151,83 +151,87 @@ class FormMeetingSeminarController extends Controller
$tanggal = Carbon::parse($request->tanggal); $tanggal = Carbon::parse($request->tanggal);
$startDay = (int) env('STARTING_DATE', 11); $startDay = (int) env('STARTING_DATE', 11);
$closingDay = (int) env('CLOSING_DATE', 10); $closingDay = (int) env('CLOSING_DATE', 10);
// Ambil tanggal sekarang untuk tentukan periode berjalan
$now = Carbon::now(); $now = Carbon::now();
// Tentukan periode aktif berdasarkan tanggal saat ini
if ($now->day >= $startDay) { if ($now->day >= $startDay) {
// Periode berjalan dari bulan ini sampai bulan depan
$startDate = Carbon::create($now->year, $now->month, $startDay); $startDate = Carbon::create($now->year, $now->month, $startDay);
$closingDate = Carbon::create($now->copy()->addMonth()->year, $now->copy()->addMonth()->month, $closingDay); $closingDate = Carbon::create($now->copy()->addMonth()->year, $now->copy()->addMonth()->month, $closingDay);
} else { } else {
// Periode berjalan dari bulan lalu sampai bulan ini
$startDate = Carbon::create($now->copy()->subMonth()->year, $now->copy()->subMonth()->month, $startDay); $startDate = Carbon::create($now->copy()->subMonth()->year, $now->copy()->subMonth()->month, $startDay);
$closingDate = Carbon::create($now->year, $now->month, $closingDay); $closingDate = Carbon::create($now->year, $now->month, $closingDay);
} }
// Validasi apakah tanggal pengajuan masuk ke periode saat ini
if ($tanggal->lt($startDate) || $tanggal->gt($closingDate)) { 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')}"); session()->flash('error', "Gagal, tanggal tidak berada dalam periode input: {$startDate->format('d M')} - {$closingDate->format('d M')}");
return redirect()->back(); return redirect()->back();
} }
$cabang = UserHasCabang::with('cabang')->where('user_id', auth()->user()->id)->first()->cabang; $cabang = UserHasCabang::with('cabang')->where('user_id', auth()->user()->id)->first()?->cabang;
$region = Region::where('id', $cabang->region_id)->first(); if (!$cabang) {
session()->flash('error', 'Data cabang tidak ditemukan.');
return redirect()->back();
}
$region = Region::find($cabang->region_id);
$kategori = Kategori::where('name', 'Meeting / Seminar')->first(); $kategori = Kategori::where('name', 'Meeting / Seminar')->first();
// Hitung periode dari tanggal input (bukan dari today)
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');
// Upload bukti file ke Nextcloud
$filePaths = []; $filePaths = [];
$folderPath = '/expense/' . $region->code . '/' . $cabang->code . '/meeting'; $folderPath = '/expense/' . $region->code . '/' . $cabang->code . '/meeting';
if ($request->hasFile('bukti_allowance')) { if ($request->hasFile('bukti_allowance')) {
$bukti_allowance = $request->file('bukti_allowance'); $bukti_allowance = $request->file('bukti_allowance');
$filename = Str::uuid() . '.' . $bukti_allowance->extension(); $filename = Str::uuid() . '.' . $bukti_allowance->extension();
$filePaths['bukti_allowance'] = $folderPath . '/' . $filename; $filePaths['bukti_allowance'] = $folderPath . '/' . $filename;
NextCloudHelper::uploadFile($folderPath, $bukti_allowance->getContent(), $filename);
NextCloudHelper::uploadFile(
$folderPath,
$bukti_allowance->getContent(),
$filename
);
} }
if ($request->hasFile('bukti_transport_ankot')) { if ($request->hasFile('bukti_transport_ankot')) {
$bukti_transport_ankot = $request->file('bukti_transport_ankot'); $bukti_transport_ankot = $request->file('bukti_transport_ankot');
$filename = Str::uuid() . '.' . $bukti_transport_ankot->extension(); $filename = Str::uuid() . '.' . $bukti_transport_ankot->extension();
$filePaths['bukti_transport_ankot'] = $folderPath . '/' . $filename; $filePaths['bukti_transport_ankot'] = $folderPath . '/' . $filename;
NextCloudHelper::uploadFile($folderPath, $bukti_transport_ankot->getContent(), $filename);
NextCloudHelper::uploadFile(
$folderPath,
$bukti_transport_ankot->getContent(),
$filename
);
} }
if ($request->hasFile('bukti_hotel')) { if ($request->hasFile('bukti_hotel')) {
$bukti_hotel = $request->file('bukti_hotel'); $bukti_hotel = $request->file('bukti_hotel');
$filename = Str::uuid() . '.' . $bukti_hotel->extension(); $filename = Str::uuid() . '.' . $bukti_hotel->extension();
$filePaths['bukti_hotel'] = $folderPath . '/' . $filename; $filePaths['bukti_hotel'] = $folderPath . '/' . $filename;
NextCloudHelper::uploadFile($folderPath, $bukti_hotel->getContent(), $filename);
NextCloudHelper::uploadFile(
$folderPath,
$bukti_hotel->getContent(),
$filename
);
} }
// Generate sequence number and expense number // Generate nomor expense
$sequence_number = FormMeetingSeminar::withTrashed()->where('expense_number', 'like', $region->code . '-' . $cabang->code . '-MTG-' . date('ym') . '%')->count() + 1; $sequence_number = FormMeetingSeminar::withTrashed()
->where('expense_number', 'like', $region->code . '-' . $cabang->code . '-MTG-' . date('ym') . '%')
->count() + 1;
$formatted_sequence_number = str_pad($sequence_number, 4, '0', STR_PAD_LEFT); $formatted_sequence_number = str_pad($sequence_number, 4, '0', STR_PAD_LEFT);
$expense_number = $region->code . '-' . $cabang->code . '-MTG-' . date('ym') . $formatted_sequence_number; $expense_number = $region->code . '-' . $cabang->code . '-MTG-' . date('ym') . $formatted_sequence_number;
// Hitung nominal
$data_nominal = [ $data_nominal = [
'allowance' => $request->allowance ?? 0, 'allowance' => $request->allowance ?? 0,
'transport_ankot' => $request->transport_ankot ?? 0, 'transport_ankot' => $request->transport_ankot ?? 0,
'hotel' => $request->hotel ?? 0, 'hotel' => $request->hotel ?? 0,
]; ];
// Validasi budget
$availableBudget = BudgetHelper::getAvailableBudget($cabang->id, $periodeMonth, $periodeYear);
// Check if the total nominal exceeds the available budget // Check if the total nominal exceeds the available budget
if(array_sum($data_nominal) > BudgetHelper::getAvailableBudget($cabang->id)) { if(array_sum($data_nominal) > $availableBudget) {
session()->flash('error', 'Alokasi budget bulanan cabang tidak mencukupi,silahkan ajukan pada periode expense berikutnya'); session()->flash('error', 'Alokasi budget bulanan cabang tidak mencukupi,silahkan ajukan pada periode expense berikutnya');
return redirect()->back(); return redirect()->back();
} }
@@ -348,7 +352,7 @@ class FormMeetingSeminarController extends Controller
{ {
$this->checkAuthorization(auth()->user(), ['forms.meeting.edit']); $this->checkAuthorization(auth()->user(), ['forms.meeting.edit']);
$role = auth()->user()->getRoleNames()[0]; $role = auth()->user()->getRoleNames()[0];
$form = FormMeetingSeminar::findOrfail($id); $form = FormMeetingSeminar::findOrFail($id);
$request->validate([ $request->validate([
'tanggal' => 'required|date', 'tanggal' => 'required|date',
@@ -360,13 +364,18 @@ class FormMeetingSeminarController extends Controller
'bukti_hotel' => ['nullable', 'file', 'max:51200'], 'bukti_hotel' => ['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.'); session()->flash('error', 'You cannot edit this form because it has been approved or rejected.');
return redirect()->back(); return redirect()->back();
} }
$cabang = UserHasCabang::with('cabang')->where('user_id', $form->user_id)->first()->cabang; $cabang = UserHasCabang::with('cabang')->where('user_id', $form->user_id)->first()?->cabang;
$region = Region::where('id', $cabang->region_id)->first(); if (!$cabang) {
session()->flash('error', 'Cabang tidak ditemukan.');
return redirect()->back();
}
$region = Region::find($cabang->region_id);
$kategori = Kategori::where('name', 'Meeting / Seminar')->first(); $kategori = Kategori::where('name', 'Meeting / Seminar')->first();
$filePaths = []; $filePaths = [];
@@ -375,50 +384,48 @@ class FormMeetingSeminarController extends Controller
if ($request->hasFile('bukti_allowance')) { if ($request->hasFile('bukti_allowance')) {
$bukti_allowance = $request->file('bukti_allowance'); $bukti_allowance = $request->file('bukti_allowance');
$filename = Str::uuid() . '.' . $bukti_allowance->extension(); $filename = Str::uuid() . '.' . $bukti_allowance->extension();
$filePaths['bukti_allowance'] = $folderPath . '/' . $filename; $filePaths['bukti_allowance'] = $folderPath . '/' . $filename;
NextCloudHelper::uploadFile($folderPath, $bukti_allowance->getContent(), $filename);
NextCloudHelper::uploadFile(
$folderPath,
$bukti_allowance->getContent(),
$filename
);
} }
if ($request->hasFile('bukti_transport_ankot')) { if ($request->hasFile('bukti_transport_ankot')) {
$bukti_transport_ankot = $request->file('bukti_transport_ankot'); $bukti_transport_ankot = $request->file('bukti_transport_ankot');
$filename = Str::uuid() . '.' . $bukti_transport_ankot->extension(); $filename = Str::uuid() . '.' . $bukti_transport_ankot->extension();
$filePaths['bukti_transport_ankot'] = $folderPath . '/' . $filename; $filePaths['bukti_transport_ankot'] = $folderPath . '/' . $filename;
NextCloudHelper::uploadFile($folderPath, $bukti_transport_ankot->getContent(), $filename);
NextCloudHelper::uploadFile(
$folderPath,
$bukti_transport_ankot->getContent(),
$filename
);
} }
if ($request->hasFile('bukti_hotel')) { if ($request->hasFile('bukti_hotel')) {
$bukti_hotel = $request->file('bukti_hotel'); $bukti_hotel = $request->file('bukti_hotel');
$filename = Str::uuid() . '.' . $bukti_hotel->extension(); $filename = Str::uuid() . '.' . $bukti_hotel->extension();
$filePaths['bukti_hotel'] = $folderPath . '/' . $filename; $filePaths['bukti_hotel'] = $folderPath . '/' . $filename;
NextCloudHelper::uploadFile($folderPath, $bukti_hotel->getContent(), $filename);
NextCloudHelper::uploadFile(
$folderPath,
$bukti_hotel->getContent(),
$filename
);
} }
// Hitung nominal total
$data_nominal = [ $data_nominal = [
'allowance' => $request->allowance ?? 0, 'allowance' => $request->allowance ?? 0,
'transport_ankot' => $request->transport_ankot ?? 0, 'transport_ankot' => $request->transport_ankot ?? 0,
'hotel' => $request->hotel ?? 0, 'hotel' => $request->hotel ?? 0,
]; ];
// Check if the total nominal exceeds the available budget $totalNominal = array_sum($data_nominal);
$cabang_id = UserHasCabang::where('user_id', $form->user_id)->first()->cabang_id;
if(array_sum($data_nominal) > BudgetHelper::getAvailableBudget($cabang_id)) { // Hitung periode dari tanggal form yang diinput
$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 budget tersedia
$availableBudget = BudgetHelper::getAvailableBudget($cabang->id, $periodeMonth, $periodeYear);
if(array_sum($data_nominal) > $availableBudget) {
session()->flash('error', 'The total nominal exceeds the available budget.'); session()->flash('error', 'The total nominal exceeds the available budget.');
return redirect()->back(); return redirect()->back();
} }
@@ -638,16 +645,34 @@ class FormMeetingSeminarController extends Controller
public function finalApprove($id) public function finalApprove($id)
{ {
$this->checkAuthorization(auth()->user(), ['final_approval.approve']); $this->checkAuthorization(auth()->user(), ['final_approval.approve']);
$form = FormMeetingSeminar::findOrFail($id);
$form = FormMeetingSeminar::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.'); session()->flash('error', 'Form must be approved by both approvers before final approval.');
return redirect()->back(); return redirect()->back();
} }
// Check if the total nominal exceeds the available budget $cabang_id = UserHasCabang::where('user_id', $form->user_id)->first()?->cabang_id;
$cabang_id = UserHasCabang::where('user_id', $form->user_id)->first()->cabang_id; if (!$cabang_id) {
if($form->approved_total > BudgetHelper::getAvailableBudget($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');
$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'); session()->flash('error', 'Budget cabang untuk periode ini tidak mencukupi, silahkan ajukan pada periode expense berikutnya');
return redirect()->back(); return redirect()->back();
} }
@@ -37,23 +37,21 @@ class FormOtherController extends Controller
$startDay = (int) env('STARTING_DATE', 11); $startDay = (int) env('STARTING_DATE', 11);
$closingDay = (int) env('CLOSING_DATE', 10); $closingDay = (int) env('CLOSING_DATE', 10);
// Referensi waktu sekarang
$now = Carbon::now(); $now = Carbon::now();
// Tentukan periode // Tentukan periode aktif
if ($now->day >= $startDay) { if ($now->day >= $startDay) {
// Mulai dari tanggal START bulan ini
$startDate = Carbon::create($now->year, $now->month, $startDay)->startOfDay(); $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(); $closingDate = Carbon::create($now->copy()->addMonth()->year, $now->copy()->addMonth()->month, $closingDay)->endOfDay();
} else { } else {
// Mulai dari tanggal START bulan lalu
$startDate = Carbon::create($now->copy()->subMonth()->year, $now->copy()->subMonth()->month, $startDay)->startOfDay(); $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(); $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]) $forms = FormOthers::whereBetween('tanggal', [$startDate, $closingDate])
->orderBy('tanggal', 'desc') ->orderBy('tanggal', 'desc')
->with('user') ->with('user')
@@ -72,28 +70,27 @@ class FormOtherController extends Controller
$userIds = $users->pluck('user_id')->toArray(); $userIds = $users->pluck('user_id')->toArray();
$forms = $forms->whereIn('user_id', $userIds); $forms = $forms->whereIn('user_id', $userIds);
} }
} } elseif ($role == 'Area Manager Cabang') {
else if ($role == 'Area Manager Cabang') {
$cabang_id = auth()->user()->getMyCabangAndRegionId()['cabang']; $cabang_id = auth()->user()->getMyCabangAndRegionId()['cabang'];
if ($cabang_id) { if ($cabang_id) {
$users = UserHasCabang::where('cabang_id', $cabang_id)->get(); $users = UserHasCabang::where('cabang_id', $cabang_id)->get();
$userIds = $users->pluck('user_id')->toArray(); $userIds = $users->pluck('user_id')->toArray();
$forms = $forms->whereIn('user_id', $userIds); $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); $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);
} }
else {
$forms = $forms;
} }
session()->put('redirect_url', route('forms.other')); session()->put('redirect_url', route('forms.other'));
return view('backend.pages.forms.other.index', [ return view('backend.pages.forms.other.index', [
'forms' => $forms, 'forms' => $forms,
'availableBudget' => $availableBudget 'availableBudget' => $availableBudget
@@ -135,7 +132,6 @@ class FormOtherController extends Controller
public function store(Request $request) public function store(Request $request)
{ {
$this->checkAuthorization(auth()->user(), ['forms.other.create']); $this->checkAuthorization(auth()->user(), ['forms.other.create']);
$request->validate([ $request->validate([
'kategori_id' => 'required', 'kategori_id' => 'required',
'tanggal' => 'required|date', 'tanggal' => 'required|date',
@@ -147,27 +143,44 @@ class FormOtherController extends Controller
$tanggal = Carbon::parse($request->tanggal); $tanggal = Carbon::parse($request->tanggal);
$startDay = (int) env('STARTING_DATE', 11); $startDay = (int) env('STARTING_DATE', 11);
$closingDay = (int) env('CLOSING_DATE', 10); $closingDay = (int) env('CLOSING_DATE', 10);
// Ambil tanggal sekarang untuk tentukan periode berjalan
$now = Carbon::now(); $now = Carbon::now();
// Tentukan periode input berdasarkan waktu saat ini
if ($now->day >= $startDay) { if ($now->day >= $startDay) {
// Periode berjalan dari bulan ini sampai bulan depan
$startDate = Carbon::create($now->year, $now->month, $startDay); $startDate = Carbon::create($now->year, $now->month, $startDay);
$closingDate = Carbon::create($now->copy()->addMonth()->year, $now->copy()->addMonth()->month, $closingDay); $closingDate = Carbon::create($now->copy()->addMonth()->year, $now->copy()->addMonth()->month, $closingDay);
} else { } else {
// Periode berjalan dari bulan lalu sampai bulan ini
$startDate = Carbon::create($now->copy()->subMonth()->year, $now->copy()->subMonth()->month, $startDay); $startDate = Carbon::create($now->copy()->subMonth()->year, $now->copy()->subMonth()->month, $startDay);
$closingDate = Carbon::create($now->year, $now->month, $closingDay); $closingDate = Carbon::create($now->year, $now->month, $closingDay);
} }
// Validasi apakah tanggal berada dalam periode aktif input
if ($tanggal->lt($startDate) || $tanggal->gt($closingDate)) { 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')}"); session()->flash('error', "Gagal, tanggal tidak berada dalam periode input: {$startDate->format('d M')} - {$closingDate->format('d M')}");
return redirect()->back(); return redirect()->back();
} }
$cabang = UserHasCabang::with('cabang')->where('user_id', auth()->user()->id)->first()->cabang; // Ambil cabang user
if($request->total > BudgetHelper::getAvailableBudget($cabang->id)) { $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'); session()->flash('error', 'Alokasi budget bulanan cabang tidak mencukupi,silahkan ajukan pada periode expense berikutnya');
return redirect()->back(); return redirect()->back();
} }
@@ -310,25 +323,46 @@ class FormOtherController extends Controller
{ {
$this->checkAuthorization(auth()->user(), ['forms.other.edit']); $this->checkAuthorization(auth()->user(), ['forms.other.edit']);
$role = auth()->user()->getRoleNames()[0]; $role = auth()->user()->getRoleNames()[0];
$form = FormOthers::findOrfail($id); $form = FormOthers::findOrFail($id);
$cabang_id = UserHasCabang::where('user_id', $form->user_id)->first()->cabang_id;
$request->validate([ if ($form->status !== 'On Progress' && $role === 'Medical Representatif') {
'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') {
session()->flash('error', 'You cannot edit this form because it has been approved or rejected.'); session()->flash('error', 'You cannot edit this form because it has been approved or rejected.');
return redirect()->back(); return redirect()->back();
} }
$cabang = UserHasCabang::with('cabang')->where('user_id', $form->user_id)->first()->cabang; $cabang = UserHasCabang::with('cabang')->where('user_id', $form->user_id)->first()?->cabang;
$region = Region::where('id', $cabang->region_id)->first(); if (!$cabang) {
$kategori = Kategori::where('id', $request->kategori_id)->first(); 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 = []; $filePaths = [];
$folderPath = '/expense/' . $region->code . '/' . $cabang->code . '/other'; $folderPath = '/expense/' . $region->code . '/' . $cabang->code . '/other';
@@ -336,7 +370,6 @@ class FormOtherController extends Controller
if ($request->hasFile('bukti_total')) { if ($request->hasFile('bukti_total')) {
$bukti_total = $request->file('bukti_total'); $bukti_total = $request->file('bukti_total');
$filename = Str::uuid() . '.' . $bukti_total->extension(); $filename = Str::uuid() . '.' . $bukti_total->extension();
$filePaths['bukti_total'] = $folderPath . '/' . $filename; $filePaths['bukti_total'] = $folderPath . '/' . $filename;
NextCloudHelper::uploadFile( NextCloudHelper::uploadFile(
@@ -346,7 +379,7 @@ class FormOtherController extends Controller
); );
} }
// Save the form data // Update form
$form->update([ $form->update([
'kategori_id' => $request->kategori_id, 'kategori_id' => $request->kategori_id,
'tanggal' => $request->tanggal, 'tanggal' => $request->tanggal,
@@ -546,16 +579,35 @@ class FormOtherController extends Controller
public function finalApprove($id) public function finalApprove($id)
{ {
$this->checkAuthorization(auth()->user(), ['final_approval.approve']); $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.'); session()->flash('error', 'Form must be approved by both approvers before final approval.');
return redirect()->back(); return redirect()->back();
} }
// Check if the total nominal exceeds the available budget $cabang_id = UserHasCabang::where('user_id', $form->user_id)->first()?->cabang_id;
$cabang_id = UserHasCabang::where('user_id', $form->user_id)->first()->cabang_id; if (!$cabang_id) {
if($form->approved_total > BudgetHelper::getAvailableBudget($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'); session()->flash('error', 'Budget cabang untuk periode ini tidak mencukupi, silahkan ajukan pada periode expense berikutnya');
return redirect()->back(); return redirect()->back();
} }
@@ -45,14 +45,10 @@ class FormUpCountryController extends Controller
// Tentukan periode // Tentukan periode
if ($now->day >= $startDay) { if ($now->day >= $startDay) {
// Mulai dari tanggal START bulan ini
$startDate = Carbon::create($now->year, $now->month, $startDay)->startOfDay(); $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(); $closingDate = Carbon::create($now->copy()->addMonth()->year, $now->copy()->addMonth()->month, $closingDay)->endOfDay();
} else { } else {
// Mulai dari tanggal START bulan lalu
$startDate = Carbon::create($now->copy()->subMonth()->year, $now->copy()->subMonth()->month, $startDay)->startOfDay(); $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(); $closingDate = Carbon::create($now->year, $now->month, $closingDay)->endOfDay();
} }
@@ -82,14 +78,19 @@ class FormUpCountryController extends Controller
$users = UserHasCabang::where('cabang_id', $cabang_id)->get(); $users = UserHasCabang::where('cabang_id', $cabang_id)->get();
$userIds = $users->pluck('user_id')->toArray(); $userIds = $users->pluck('user_id')->toArray();
$forms = $forms->whereIn('user_id', $userIds); $forms = $forms->whereIn('user_id', $userIds);
$availableBudget = BudgetHelper::getAvailableBudget($cabang_id);
$periodeMonth = $startDate->month;
$periodeYear = $startDate->year;
$availableBudget = BudgetHelper::getAvailableBudget($cabang_id, $periodeMonth, $periodeYear);
} }
} }
else if ($role == 'Medical Representatif') { else if ($role == 'Medical Representatif') {
$forms = $forms->where('user_id', auth()->user()->id); $forms = $forms->where('user_id', auth()->user()->id);
$cabang_id = UserHasCabang::where('user_id', auth()->user()->id)->first()->cabang_id; $cabang_id = UserHasCabang::where('user_id', auth()->user()->id)->first()->cabang_id;
$availableBudget = BudgetHelper::getAvailableBudget($cabang_id); $periodeMonth = $startDate->month;
$periodeYear = $startDate->year;
$availableBudget = BudgetHelper::getAvailableBudget($cabang_id, $periodeMonth, $periodeYear);
} }
else { else {
$forms = $forms; $forms = $forms;
@@ -144,7 +145,6 @@ class FormUpCountryController extends Controller
public function store(Request $request) public function store(Request $request)
{ {
$this->checkAuthorization(auth()->user(), ['forms.country.create']); $this->checkAuthorization(auth()->user(), ['forms.country.create']);
$request->validate([ $request->validate([
'rayon_id' => 'required|exists:rayon,id', 'rayon_id' => 'required|exists:rayon,id',
'tanggal' => 'required', 'tanggal' => 'required',
@@ -163,87 +163,83 @@ class FormUpCountryController extends Controller
$tanggal = Carbon::parse($request->tanggal); $tanggal = Carbon::parse($request->tanggal);
$startDay = (int) env('STARTING_DATE', 11); $startDay = (int) env('STARTING_DATE', 11);
$closingDay = (int) env('CLOSING_DATE', 10); $closingDay = (int) env('CLOSING_DATE', 10);
// Ambil tanggal sekarang untuk tentukan periode berjalan
$now = Carbon::now(); $now = Carbon::now();
// Tentukan periode aktif saat ini
if ($now->day >= $startDay) { if ($now->day >= $startDay) {
// Periode berjalan dari bulan ini sampai bulan depan
$startDate = Carbon::create($now->year, $now->month, $startDay); $startDate = Carbon::create($now->year, $now->month, $startDay);
$closingDate = Carbon::create($now->copy()->addMonth()->year, $now->copy()->addMonth()->month, $closingDay); $closingDate = Carbon::create($now->copy()->addMonth()->year, $now->copy()->addMonth()->month, $closingDay);
} else { } else {
// Periode berjalan dari bulan lalu sampai bulan ini
$startDate = Carbon::create($now->copy()->subMonth()->year, $now->copy()->subMonth()->month, $startDay); $startDate = Carbon::create($now->copy()->subMonth()->year, $now->copy()->subMonth()->month, $startDay);
$closingDate = Carbon::create($now->year, $now->month, $closingDay); $closingDate = Carbon::create($now->year, $now->month, $closingDay);
} }
// Validasi apakah tanggal input berada di periode aktif
if ($tanggal->lt($startDate) || $tanggal->gt($closingDate)) { 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')}"); session()->flash('error', "Gagal, tanggal tidak berada dalam periode input: {$startDate->format('d M')} - {$closingDate->format('d M')}");
return redirect()->back(); return redirect()->back();
} }
$cabang = UserHasCabang::with('cabang')->where('user_id', auth()->user()->id)->first()->cabang; $cabang = UserHasCabang::with('cabang')->where('user_id', auth()->user()->id)->first()?->cabang;
$region = Region::where('id', $cabang->region_id)->first(); if (!$cabang) {
session()->flash('error', 'Cabang tidak ditemukan.');
return redirect()->back();
}
$region = Region::find($cabang->region_id);
$kategori = Kategori::where('name', 'Up Country')->first(); $kategori = Kategori::where('name', 'Up Country')->first();
// Hitung periode budget dari tanggal input
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');
// Upload file
$filePaths = []; $filePaths = [];
$folderPath = '/expense/' . $region->code . '/' . $cabang->code . '/upcountry'; $folderPath = '/expense/' . $region->code . '/' . $cabang->code . '/upcountry';
if ($request->hasFile('bukti_allowance')) { if ($request->hasFile('bukti_allowance')) {
$bukti_allowance = $request->file('bukti_allowance'); $bukti = $request->file('bukti_allowance');
$filename = Str::uuid() . '.' . $bukti_allowance->extension(); $filename = Str::uuid() . '.' . $bukti->extension();
$filePaths['bukti_allowance'] = $folderPath . '/' . $filename; $filePaths['bukti_allowance'] = $folderPath . '/' . $filename;
NextCloudHelper::uploadFile($folderPath, $bukti->getContent(), $filename);
NextCloudHelper::uploadFile(
$folderPath,
$bukti_allowance->getContent(),
$filename
);
} }
if ($request->hasFile('bukti_transport_dalkot')) { if ($request->hasFile('bukti_transport_dalkot')) {
$bukti_transport_dalkot = $request->file('bukti_transport_dalkot'); $bukti = $request->file('bukti_transport_dalkot');
$filename = Str::uuid() . '.' . $bukti_transport_dalkot->extension(); $filename = Str::uuid() . '.' . $bukti->extension();
$filePaths['bukti_transport_dalkot'] = $folderPath . '/' . $filename; $filePaths['bukti_transport_dalkot'] = $folderPath . '/' . $filename;
NextCloudHelper::uploadFile($folderPath, $bukti->getContent(), $filename);
NextCloudHelper::uploadFile(
$folderPath,
$bukti_transport_dalkot->getContent(),
$filename
);
} }
if ($request->hasFile('bukti_transport_ankot')) { if ($request->hasFile('bukti_transport_ankot')) {
$bukti_transport_ankot = $request->file('bukti_transport_ankot'); $bukti = $request->file('bukti_transport_ankot');
$filename = Str::uuid() . '.' . $bukti_transport_ankot->extension(); $filename = Str::uuid() . '.' . $bukti->extension();
$filePaths['bukti_transport_ankot'] = $folderPath . '/' . $filename; $filePaths['bukti_transport_ankot'] = $folderPath . '/' . $filename;
NextCloudHelper::uploadFile($folderPath, $bukti->getContent(), $filename);
NextCloudHelper::uploadFile(
$folderPath,
$bukti_transport_ankot->getContent(),
$filename
);
} }
if ($request->hasFile('bukti_hotel')) { if ($request->hasFile('bukti_hotel')) {
$bukti_hotel = $request->file('bukti_hotel'); $bukti = $request->file('bukti_hotel');
$filename = Str::uuid() . '.' . $bukti_hotel->extension(); $filename = Str::uuid() . '.' . $bukti->extension();
$filePaths['bukti_hotel'] = $folderPath . '/' . $filename; $filePaths['bukti_hotel'] = $folderPath . '/' . $filename;
NextCloudHelper::uploadFile($folderPath, $bukti->getContent(), $filename);
NextCloudHelper::uploadFile(
$folderPath,
$bukti_hotel->getContent(),
$filename
);
} }
// Generate sequence number and expense number // Generate expense number
$sequence_number = FormUpCountry::withTrashed()->where('expense_number', 'like', $region->code . '-' . $cabang->code . '-UPC-' . date('ym') . '%')->count() + 1; $sequence_number = FormUpCountry::withTrashed()
->where('expense_number', 'like', $region->code . '-' . $cabang->code . '-UPC-' . date('ym') . '%')
->count() + 1;
$formatted_sequence_number = str_pad($sequence_number, 4, '0', STR_PAD_LEFT); $formatted_sequence_number = str_pad($sequence_number, 4, '0', STR_PAD_LEFT);
$expense_number = $region->code . '-' . $cabang->code . '-UPC-' . date('ym') . $formatted_sequence_number; $expense_number = $region->code . '-' . $cabang->code . '-UPC-' . date('ym') . $formatted_sequence_number;
// Hitung total nominal
$data_nominal = [ $data_nominal = [
'allowance' => $request->allowance ?? 0, 'allowance' => $request->allowance ?? 0,
'transport_dalkot' => $request->transport_dalkot ?? 0, 'transport_dalkot' => $request->transport_dalkot ?? 0,
@@ -251,8 +247,11 @@ class FormUpCountryController extends Controller
'hotel' => $request->hotel ?? 0, 'hotel' => $request->hotel ?? 0,
]; ];
// Check if the total nominal exceeds the available budget $totalNominal = array_sum($data_nominal);
if(array_sum($data_nominal) > BudgetHelper::getAvailableBudget($cabang->id)) {
// Validasi budget berdasarkan periode
$availableBudget = BudgetHelper::getAvailableBudget($cabang->id, $periodeMonth, $periodeYear);
if(array_sum($data_nominal) > $availableBudget) {
session()->flash('error', 'Alokasi budget bulanan cabang tidak mencukupi,silahkan ajukan pada periode expense berikutnya'); session()->flash('error', 'Alokasi budget bulanan cabang tidak mencukupi,silahkan ajukan pada periode expense berikutnya');
return redirect()->back(); return redirect()->back();
} }
@@ -397,79 +396,77 @@ class FormUpCountryController extends Controller
'bukti_hotel' => ['nullable', 'file', 'max:51200'], 'bukti_hotel' => ['nullable', 'file', 'max:51200'],
]); ]);
$form = FormUpCountry::findOrfail($id); $form = FormUpCountry::findOrFail($id);
if (($form->status != 'On Progress' && $form->status != 'Rejected') && $role == 'Medical Representatif') { if (($form->status !== 'On Progress' && $form->status !== 'Rejected') && $role === 'Medical Representatif') {
session()->flash('error', 'You cannot edit this form because it has been approved or closed.'); session()->flash('error', 'You cannot edit this form because it has been approved or closed.');
return redirect()->back(); return redirect()->back();
} }
$cabang = UserHasCabang::with('cabang')->where('user_id', $form->user_id)->first()->cabang; $cabang = UserHasCabang::with('cabang')->where('user_id', $form->user_id)->first()?->cabang;
$region = Region::where('id', $cabang->region_id)->first(); if (!$cabang) {
session()->flash('error', 'Cabang tidak ditemukan.');
return redirect()->back();
}
$region = Region::find($cabang->region_id);
$kategori = Kategori::where('name', 'Up Country')->first(); $kategori = Kategori::where('name', 'Up Country')->first();
// 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');
// Upload bukti file
$filePaths = []; $filePaths = [];
$folderPath = '/expense/' . $region->code . '/' . $cabang->code . '/upcountry'; $folderPath = '/expense/' . $region->code . '/' . $cabang->code . '/upcountry';
if ($request->hasFile('bukti_allowance')) { if ($request->hasFile('bukti_allowance')) {
$bukti_allowance = $request->file('bukti_allowance'); $file = $request->file('bukti_allowance');
$filename = Str::uuid() . '.' . $bukti_allowance->extension(); $filename = Str::uuid() . '.' . $file->extension();
$filePaths['bukti_allowance'] = $folderPath . '/' . $filename; $filePaths['bukti_allowance'] = $folderPath . '/' . $filename;
NextCloudHelper::uploadFile($folderPath, $file->getContent(), $filename);
NextCloudHelper::uploadFile(
$folderPath,
$bukti_allowance->getContent(),
$filename
);
} }
if ($request->hasFile('bukti_transport_dalkot')) { if ($request->hasFile('bukti_transport_dalkot')) {
$bukti_transport_dalkot = $request->file('bukti_transport_dalkot'); $file = $request->file('bukti_transport_dalkot');
$filename = Str::uuid() . '.' . $bukti_transport_dalkot->extension(); $filename = Str::uuid() . '.' . $file->extension();
$filePaths['bukti_transport_dalkot'] = $folderPath . '/' . $filename; $filePaths['bukti_transport_dalkot'] = $folderPath . '/' . $filename;
NextCloudHelper::uploadFile($folderPath, $file->getContent(), $filename);
NextCloudHelper::uploadFile(
$folderPath,
$bukti_transport_dalkot->getContent(),
$filename
);
} }
if ($request->hasFile('bukti_transport_ankot')) { if ($request->hasFile('bukti_transport_ankot')) {
$bukti_transport_ankot = $request->file('bukti_transport_ankot'); $file = $request->file('bukti_transport_ankot');
$filename = Str::uuid() . '.' . $bukti_transport_ankot->extension(); $filename = Str::uuid() . '.' . $file->extension();
$filePaths['bukti_transport_ankot'] = $folderPath . '/' . $filename; $filePaths['bukti_transport_ankot'] = $folderPath . '/' . $filename;
NextCloudHelper::uploadFile($folderPath, $file->getContent(), $filename);
NextCloudHelper::uploadFile(
$folderPath,
$bukti_transport_ankot->getContent(),
$filename
);
} }
if ($request->hasFile('bukti_hotel')) { if ($request->hasFile('bukti_hotel')) {
$bukti_hotel = $request->file('bukti_hotel'); $file = $request->file('bukti_hotel');
$filename = Str::uuid() . '.' . $bukti_hotel->extension(); $filename = Str::uuid() . '.' . $file->extension();
$filePaths['bukti_hotel'] = $folderPath . '/' . $filename; $filePaths['bukti_hotel'] = $folderPath . '/' . $filename;
NextCloudHelper::uploadFile($folderPath, $file->getContent(), $filename);
NextCloudHelper::uploadFile(
$folderPath,
$bukti_hotel->getContent(),
$filename
);
} }
// Hitung total nominal
$data_nominal = [ $data_nominal = [
'allowance' => $request->allowance ?? 0, 'allowance' => $request->allowance ?? 0,
'transport_dalkot' => $request->transport_dalkot ?? 0, 'transport_dalkot' => $request->transport_dalkot ?? 0,
'transport_ankot' => $request->transport_ankot ?? 0, 'transport_ankot' => $request->transport_ankot ?? 0,
'hotel' => $request->hotel ?? 0, 'hotel' => $request->hotel ?? 0,
]; ];
$totalNominal = array_sum($data_nominal);
// Check if the total nominal exceeds the available budget // Validasi budget dengan periode
$cabang_id = UserHasCabang::where('user_id', $form->user_id)->first()->cabang_id; $availableBudget = BudgetHelper::getAvailableBudget($cabang->id, $periodeMonth, $periodeYear);
if(array_sum($data_nominal) > BudgetHelper::getAvailableBudget($cabang_id)) { if(array_sum($data_nominal) > $availableBudget) {
session()->flash('error', 'The total nominal exceeds the available budget.'); session()->flash('error', 'The total nominal exceeds the available budget.');
return redirect()->back(); return redirect()->back();
} }
@@ -696,16 +693,35 @@ class FormUpCountryController extends Controller
public function finalApprove($id) public function finalApprove($id)
{ {
$this->checkAuthorization(auth()->user(), ['final_approval.approve']); $this->checkAuthorization(auth()->user(), ['final_approval.approve']);
$form = FormUpCountry::findOrFail($id);
$form = FormUpCountry::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.'); session()->flash('error', 'Form must be approved by both approvers before final approval.');
return redirect()->back(); return redirect()->back();
} }
// Check if the total nominal exceeds the available budget // Ambil cabang_id dari user yang mengisi form
$cabang_id = UserHasCabang::where('user_id', $form->user_id)->first()->cabang_id; $cabang_id = UserHasCabang::where('user_id', $form->user_id)->first()?->cabang_id;
if($form->approved_total > BudgetHelper::getAvailableBudget($cabang_id)) { if (!$cabang_id) {
session()->flash('error', 'Data cabang tidak ditemukan.');
return redirect()->back();
}
// Hitung periode berdasarkan 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 sesuai periode
$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'); session()->flash('error', 'Budget cabang untuk periode ini tidak mencukupi, silahkan ajukan pada periode expense berikutnya');
return redirect()->back(); return redirect()->back();
} }
@@ -39,23 +39,21 @@ class FormVehicleController extends Controller
$role = auth()->user()->getRoleNames()[0]; $role = auth()->user()->getRoleNames()[0];
$startDay = (int) env('STARTING_DATE', 11); $startDay = (int) env('STARTING_DATE', 11);
$closingDay = (int) env('CLOSING_DATE', 10); $closingDay = (int) env('CLOSING_DATE', 10);
// Referensi waktu sekarang
$now = Carbon::now(); $now = Carbon::now();
// Tentukan periode // Tentukan periode aktif
if ($now->day >= $startDay) { if ($now->day >= $startDay) {
// Mulai dari tanggal START bulan ini
$startDate = Carbon::create($now->year, $now->month, $startDay)->startOfDay(); $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(); $closingDate = Carbon::create($now->copy()->addMonth()->year, $now->copy()->addMonth()->month, $closingDay)->endOfDay();
} else { } else {
// Mulai dari tanggal START bulan lalu
$startDate = Carbon::create($now->copy()->subMonth()->year, $now->copy()->subMonth()->month, $startDay)->startOfDay(); $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(); $closingDate = Carbon::create($now->year, $now->month, $closingDay)->endOfDay();
} }
// Hitung periode untuk keperluan budget
$periodeMonth = strtolower($startDate->format('F'));
$periodeYear = (int) $startDate->format('Y');
$forms = FormVehicleRunningCost::whereBetween('tanggal', [$startDate, $closingDate]) $forms = FormVehicleRunningCost::whereBetween('tanggal', [$startDate, $closingDate])
->orderBy('tanggal', 'desc') ->orderBy('tanggal', 'desc')
->with('user') ->with('user')
@@ -63,7 +61,7 @@ class FormVehicleController extends Controller
$availableBudget = null; $availableBudget = null;
if ($role == 'Admin Region' || $role == 'Marketing Operational Manager Region') { if ($role === 'Admin Region' || $role === 'Marketing Operational Manager Region') {
$region_id = auth()->user()->getMyCabangAndRegionId()['region']; $region_id = auth()->user()->getMyCabangAndRegionId()['region'];
if ($region_id) { if ($region_id) {
@@ -74,28 +72,27 @@ class FormVehicleController extends Controller
$userIds = $users->pluck('user_id')->toArray(); $userIds = $users->pluck('user_id')->toArray();
$forms = $forms->whereIn('user_id', $userIds); $forms = $forms->whereIn('user_id', $userIds);
} }
} } elseif ($role === 'Area Manager Cabang') {
else if ($role == 'Area Manager Cabang') {
$cabang_id = auth()->user()->getMyCabangAndRegionId()['cabang']; $cabang_id = auth()->user()->getMyCabangAndRegionId()['cabang'];
if ($cabang_id) { if ($cabang_id) {
$users = UserHasCabang::where('cabang_id', $cabang_id)->get(); $users = UserHasCabang::where('cabang_id', $cabang_id)->get();
$userIds = $users->pluck('user_id')->toArray(); $userIds = $users->pluck('user_id')->toArray();
$forms = $forms->whereIn('user_id', $userIds); $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); $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);
} }
else {
$forms = $forms;
} }
session()->put('redirect_url', route('forms.vehicle')); session()->put('redirect_url', route('forms.vehicle'));
return view('backend.pages.forms.vehicle.index', [ return view('backend.pages.forms.vehicle.index', [
'forms' => $forms, 'forms' => $forms,
'availableBudget' => $availableBudget 'availableBudget' => $availableBudget
@@ -134,7 +131,6 @@ class FormVehicleController extends Controller
public function store(Request $request) public function store(Request $request)
{ {
$this->checkAuthorization(auth()->user(), ['forms.vehicle.create']); $this->checkAuthorization(auth()->user(), ['forms.vehicle.create']);
$request->validate([ $request->validate([
'tanggal' => 'required', 'tanggal' => 'required',
'liter' => 'required', 'liter' => 'required',
@@ -149,27 +145,43 @@ class FormVehicleController extends Controller
$tanggal = Carbon::parse($request->tanggal); $tanggal = Carbon::parse($request->tanggal);
$startDay = (int) env('STARTING_DATE', 11); $startDay = (int) env('STARTING_DATE', 11);
$closingDay = (int) env('CLOSING_DATE', 10); $closingDay = (int) env('CLOSING_DATE', 10);
// Ambil tanggal sekarang untuk tentukan periode berjalan
$now = Carbon::now(); $now = Carbon::now();
// Tentukan periode input berdasarkan waktu saat ini
if ($now->day >= $startDay) { if ($now->day >= $startDay) {
// Periode berjalan dari bulan ini sampai bulan depan
$startDate = Carbon::create($now->year, $now->month, $startDay); $startDate = Carbon::create($now->year, $now->month, $startDay);
$closingDate = Carbon::create($now->copy()->addMonth()->year, $now->copy()->addMonth()->month, $closingDay); $closingDate = Carbon::create($now->copy()->addMonth()->year, $now->copy()->addMonth()->month, $closingDay);
} else { } else {
// Periode berjalan dari bulan lalu sampai bulan ini
$startDate = Carbon::create($now->copy()->subMonth()->year, $now->copy()->subMonth()->month, $startDay); $startDate = Carbon::create($now->copy()->subMonth()->year, $now->copy()->subMonth()->month, $startDay);
$closingDate = Carbon::create($now->year, $now->month, $closingDay); $closingDate = Carbon::create($now->year, $now->month, $closingDay);
} }
// Validasi apakah tanggal form berada dalam periode input
if ($tanggal->lt($startDate) || $tanggal->gt($closingDate)) { 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')}"); session()->flash('error', "Gagal, tanggal tidak berada dalam periode input: {$startDate->format('d M')} - {$closingDate->format('d M')}");
return redirect()->back(); return redirect()->back();
} }
$cabang = UserHasCabang::with('cabang')->where('user_id', auth()->user()->id)->first()->cabang; // Ambil cabang user
if($request->total > BudgetHelper::getAvailableBudget($cabang->id)) { $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');
// Validasi apakah total nominal melebihi sisa 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'); session()->flash('error', 'Alokasi budget bulanan cabang tidak mencukupi,silahkan ajukan pada periode expense berikutnya');
return redirect()->back(); return redirect()->back();
} }
@@ -314,13 +326,36 @@ class FormVehicleController extends Controller
{ {
$this->checkAuthorization(auth()->user(), ['forms.vehicle.edit']); $this->checkAuthorization(auth()->user(), ['forms.vehicle.edit']);
$role = auth()->user()->getRoleNames()[0]; $role = auth()->user()->getRoleNames()[0];
$form = FormVehicleRunningCost::findOrfail($id); $form = FormVehicleRunningCost::findOrFail($id);
$cabang_id = UserHasCabang::where('user_id', $form->user_id)->first()->cabang_id;
// Ambil cabang ID dari user yang mengisi form
$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 berdasarkan 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');
// Hitung sisa budget
$availableBudget = BudgetHelper::getAvailableBudget($cabang_id, $periodeMonth, $periodeYear);
// Validasi input
$request->validate([ $request->validate([
'tanggal' => 'required', 'tanggal' => 'required',
'liter' => 'required', 'liter' => 'required',
'total' => 'required|numeric|min:1|max:' . BudgetHelper::getAvailableBudget($cabang_id), 'total' => 'required|numeric|min:1|max:' . $availableBudget,
'jarak' => 'required', 'jarak' => 'required',
'tipe_bensin' => 'required|in:pertalite,pertamax', 'tipe_bensin' => 'required|in:pertalite,pertamax',
'nopol' => 'required', 'nopol' => 'required',
@@ -559,16 +594,36 @@ class FormVehicleController extends Controller
public function finalApprove($id) public function finalApprove($id)
{ {
$this->checkAuthorization(auth()->user(), ['final_approval.approve']); $this->checkAuthorization(auth()->user(), ['final_approval.approve']);
$form = FormVehicleRunningCost::findOrFail($id);
$form = FormVehicleRunningCost::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.'); session()->flash('error', 'Form must be approved by both approvers before final approval.');
return redirect()->back(); return redirect()->back();
} }
// Check if the total nominal exceeds the available budget // Ambil cabang_id dari user yang mengisi form
$cabang_id = UserHasCabang::where('user_id', $form->user_id)->first()->cabang_id; $cabang_id = UserHasCabang::where('user_id', $form->user_id)->first()?->cabang_id;
if($form->approved_total > BudgetHelper::getAvailableBudget($cabang_id)) { if (!$cabang_id) {
session()->flash('error', 'Data cabang tidak ditemukan.');
return redirect()->back();
}
// Hitung periode berdasarkan 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');
// Hitung sisa budget cabang di periode tersebut
$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'); session()->flash('error', 'Budget cabang untuk periode ini tidak mencukupi, silahkan ajukan pada periode expense berikutnya');
return redirect()->back(); return redirect()->back();
} }
@@ -70,7 +70,7 @@
<div class="col-lg-6"> <div class="col-lg-6">
<div class="mb-3"> <div class="mb-3">
<label class="form-label">Jarak (km) <span class="font-italic font-weight-normal">(required)</span></label> <label class="form-label">Km (Odometer) <span class="font-italic font-weight-normal">(required)</span></label>
<input type="number" class="form-control" name="jarak" id="jarak" required value="{{ old('jarak') }}"> <input type="number" class="form-control" name="jarak" id="jarak" required value="{{ old('jarak') }}">
</div> </div>
<div class="mb-3"> <div class="mb-3">
@@ -86,9 +86,7 @@
</div> </div>
<div class="mb-3"> <div class="mb-3">
<label class="form-label">Keterangan <span class="font-italic font-weight-normal">(required)</span></label> <label class="form-label">Keterangan <span class="font-italic font-weight-normal">(required)</span></label>
<textarea class="form-control" name="keterangan" id="keterangan" required> <textarea class="form-control" name="keterangan" id="keterangan" required>{{ old('keterangan') }}</textarea>
{{ old('keterangan') }}
</textarea>
</div> </div>
</div> </div>
@@ -71,7 +71,7 @@
<div class="col-lg-6"> <div class="col-lg-6">
<div class="mb-3"> <div class="mb-3">
<label class="form-label">Jarak (km) <span class="font-italic font-weight-normal">(required)</span></label> <label class="form-label">Km (Odometer) <span class="font-italic font-weight-normal">(required)</span></label>
<input type="number" class="form-control" name="jarak" id="jarak" required value="{{ $form->jarak }}"> <input type="number" class="form-control" name="jarak" id="jarak" required value="{{ $form->jarak }}">
</div> </div>
<div class="mb-3"> <div class="mb-3">
@@ -105,7 +105,7 @@
<th>Keterangan</th> <th>Keterangan</th>
<th>Total</th> <th>Total</th>
<th>Total Approved</th> <th>Total Approved</th>
<th>Jarak</th> <th>Km (Odometer)</th>
<th>Tipe Bensin</th> <th>Tipe Bensin</th>
<th>Nomor Polisi</th> <th>Nomor Polisi</th>
<th>Bukti</th> <th>Bukti</th>
@@ -53,7 +53,7 @@
<div class="col-lg-6"> <div class="col-lg-6">
<div class="mb-3"> <div class="mb-3">
<label class="form-label">Jarak (km)</label> <label class="form-label">Km (Odometer)</label>
<input type="number" class="form-control" name="jarak" id="jarak" readonly value="{{ $form->jarak }}"> <input type="number" class="form-control" name="jarak" id="jarak" readonly value="{{ $form->jarak }}">
</div> </div>
<div class="mb-3"> <div class="mb-3">