175 lines
5.2 KiB
PHP
175 lines
5.2 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Http\Controllers\Backend;
|
|
|
|
use App\Helpers\BudgetHelper;
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\BudgetControl;
|
|
use App\Models\BudgetControlLog;
|
|
use App\Models\Admin;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Carbon;
|
|
|
|
class BudgetControlController extends Controller
|
|
{
|
|
public function index()
|
|
{
|
|
$this->checkAuthorization(auth()->user(), ['budget_control.view']);
|
|
session()->put('redirect_url', route('budget_control'));
|
|
|
|
$role = auth()->user()->getRoleNames()[0];
|
|
$budget = null;
|
|
|
|
if ($role == 'Admin Region' || $role == 'Marketing Operational Manager Region') {
|
|
$region_id = auth()->user()->getMyCabangAndRegionId()['region'];
|
|
|
|
if ($region_id) {
|
|
$budget = BudgetControl::whereHas('cabang', function ($query) use ($region_id) {
|
|
$query->where('region_id', $region_id);
|
|
})->with(['receiver', 'sender', 'cabang'])->get();
|
|
}
|
|
} elseif ($role == 'Area Manager Cabang') {
|
|
$cabang_id = auth()->user()->getMyCabangAndRegionId()['cabang'];
|
|
|
|
if ($cabang_id) {
|
|
$budget = BudgetControl::where('cabang_id', $cabang_id)
|
|
->with(['receiver', 'sender', 'cabang'])
|
|
->get();
|
|
}
|
|
} else {
|
|
$budget = BudgetControl::with(['receiver', 'sender', 'cabang'])->get();
|
|
}
|
|
|
|
// Tentukan periode berdasarkan start dan closing date
|
|
$startDay = (int) env('STARTING_DATE', 11);
|
|
$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();
|
|
}
|
|
|
|
// Hitung available budget berdasarkan periode
|
|
$budget->map(function ($b) {
|
|
$b->availableBudget = BudgetHelper::getAvailableBudget($b->cabang_id, $b->periode_month, $b->periode_year);
|
|
return $b;
|
|
});
|
|
|
|
return view('backend.pages.budget_control.index', [
|
|
'data' => $budget,
|
|
]);
|
|
}
|
|
|
|
public function log()
|
|
{
|
|
$this->checkAuthorization(auth()->user(), ['budget_control.view']);
|
|
session()->put('redirect_url', route('budget_control'));
|
|
|
|
return view(
|
|
'backend.pages.budget_control.log',
|
|
[
|
|
'data' => BudgetControlLog::orderBy('created_at', 'desc')->with(['receiver', 'sender', 'cabang'])->get(),
|
|
]
|
|
);
|
|
}
|
|
|
|
public function create()
|
|
{
|
|
$this->checkAuthorization(auth()->user(), ['budget_control.create']);
|
|
|
|
$role = auth()->user()->getRoleNames()[0];
|
|
|
|
if ($role == 'Admin Region' || $role == 'Marketing Operational Manager Region') {
|
|
$region_id = auth()->user()->getMyCabangAndRegionId()['region'];
|
|
|
|
if ($region_id) {
|
|
// only show users from the same region
|
|
$users = Admin::where('id', '!=', auth()->user()->id)
|
|
->whereHas('cabang', function ($query) use ($region_id) {
|
|
$query->where('region_id', $region_id);
|
|
})
|
|
->get();
|
|
} else {
|
|
$users = Admin::getUserByRoleName('Area Manager Cabang');
|
|
}
|
|
} elseif ($role == 'Area Manager Cabang') {
|
|
$cabang_id = auth()->user()->getMyCabangAndRegionId()['cabang'];
|
|
|
|
if ($cabang_id) {
|
|
// only show users from the same cabang
|
|
$users = Admin::where('id', '!=', auth()->user()->id)
|
|
->whereHas('cabang', function ($query) use ($cabang_id) {
|
|
$query->where('id', $cabang_id);
|
|
})
|
|
->get();
|
|
}
|
|
} else {
|
|
$users = Admin::getUserByRoleName('Area Manager Cabang');
|
|
}
|
|
|
|
return view('backend.pages.budget_control.create', [
|
|
'users' => $users,
|
|
]);
|
|
}
|
|
|
|
public function store(Request $request)
|
|
{
|
|
$this->checkAuthorization(auth()->user(), ['budget_control.create']);
|
|
|
|
$validated = $request->validate([
|
|
'receiver_id' => 'required|exists:admins,id',
|
|
'periode_month' => 'required|string|in:january,february,march,april,may,june,july,august,september,october,november,december',
|
|
'periode_year' => 'required|numeric',
|
|
'amount' => 'required|numeric',
|
|
'remarks' => 'nullable|string',
|
|
]);
|
|
|
|
$cabang_id = Admin::find($validated['receiver_id'])->getMyCabangAndRegionId()['cabang'];
|
|
$periode = [
|
|
'periode_month' => $validated['periode_month'],
|
|
'periode_year' => $validated['periode_year'],
|
|
];
|
|
|
|
BudgetControl::updateOrCreate(
|
|
array_merge(['cabang_id' => $cabang_id], $periode),
|
|
array_merge($periode, [
|
|
'sender_id' => auth()->user()->id,
|
|
'receiver_id' => $validated['receiver_id'],
|
|
'amount' => $validated['amount'],
|
|
'remarks' => $validated['remarks'],
|
|
'closing_at' => null,
|
|
'status' => 'Assigned',
|
|
])
|
|
);
|
|
|
|
BudgetControlLog::create([
|
|
'cabang_id' => $cabang_id,
|
|
'sender_id' => auth()->user()->id,
|
|
'receiver_id' => $validated['receiver_id'],
|
|
'periode_month' => $validated['periode_month'],
|
|
'periode_year' => $validated['periode_year'],
|
|
'amount' => $validated['amount'],
|
|
'remarks' => $validated['remarks'],
|
|
'closing_at' => null,
|
|
'status' => 'Assigned',
|
|
]);
|
|
|
|
session()->flash('success', 'Budget has been added or updated successfully');
|
|
return redirect()->route('budget_control');
|
|
}
|
|
|
|
public function destroy($id)
|
|
{
|
|
$this->checkAuthorization(auth()->user(), ['budget_control.delete']);
|
|
|
|
$budgetRequest = BudgetControl::findOrfail($id);
|
|
$budgetRequest->delete();
|
|
|
|
return redirect()->route('budget_control');
|
|
}
|
|
}
|