add budgets

This commit is contained in:
Jagad R R
2025-01-07 17:23:42 +07:00
parent 8c62fb6a19
commit 1027b0dfb4
24 changed files with 868 additions and 36 deletions
@@ -0,0 +1,153 @@
<?php
declare(strict_types=1);
namespace App\Http\Controllers\Backend;
use App\Http\Controllers\Controller;
use App\Models\BudgetControl;
use App\Models\BudgetControlLog;
use App\Models\Admin;
use Illuminate\Http\Request;
use App\Models\FormUpCountry;
use App\Models\FormMeetingSeminar;
use App\Models\FormOthers;
use App\Models\FormEntertaimentPresentation;
use App\Models\FormVehicleRunningCost;
class BudgetControlController extends Controller
{
public function index()
{
$this->checkAuthorization(auth()->user(), ['budget_control.view']);
session()->put('redirect_url', route('budget_control'));
// Get the budget control data
$budget = BudgetControl::orderBy('created_at', 'desc')->with(['user', 'cabang'])->get();
// Initialize an empty array to hold the used budget sums
$usedBudget = [];
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
$usedBudget[] = [
'FormUpCountry' => FormUpCountry::whereIn('status', ['Approved', 'Closed'])
->whereMonth('tanggal', '=', date('m', strtotime($month)))
->whereYear('tanggal', '=', $year)
->sum('approved_total'),
'FormMeetingSeminar' => FormMeetingSeminar::whereIn('status', ['Approved', 'Closed'])
->whereMonth('created_at', '=', date('m', strtotime($month)))
->whereYear('created_at', '=', $year)
->sum('approved_total'),
'FormOthers' => FormOthers::whereIn('status', ['Approved', 'Closed'])
->whereMonth('tanggal', '=', date('m', strtotime($month)))
->whereYear('tanggal', '=', $year)
->sum('approved_total'),
'FormEntertaimentPresentation' => FormEntertaimentPresentation::whereIn('status', ['Approved', 'Closed'])
->whereMonth('tanggal', '=', date('m', strtotime($month)))
->whereYear('tanggal', '=', $year)
->sum('approved_total'),
'FormVehicleRunningCost' => FormVehicleRunningCost::whereIn('status', ['Approved', 'Closed'])
->whereMonth('tanggal', '=', date('m', strtotime($month)))
->whereYear('tanggal', '=', $year)
->sum('approved_total')
];
}
$usedBudget = array_sum(array_map(function ($b) {
return array_sum($b);
}, $usedBudget));
return view(
'backend.pages.budget_control.index',
[
'data' => $budget,
'usedBudget' => $usedBudget,
'availableBudget' => $budget->sum('amount') - $usedBudget,
]
);
}
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(['user', 'cabang'])->get(),
]
);
}
public function create()
{
$this->checkAuthorization(auth()->user(), ['budget_control.create']);
$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',
'closing_at' => 'required|date',
]);
$cabang_id = Admin::find($validated['receiver_id'])->getMyCabangAndRegionId()['cabang'];
BudgetControl::updateOrCreate(['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' => $validated['closing_at'],
'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' => $validated['closing_at'],
'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');
}
}
@@ -159,10 +159,11 @@ class FormEntertainmentPresentationController extends Controller
public function edit($id)
{
$this->checkAuthorization(auth()->user(), ['forms.entertainment.edit']);
$role = auth()->user()->getRoleNames()[0];
$form = FormEntertaimentPresentation::findOrfail($id);
if($form->status == 'Closed') {
session()->flash('error', 'Form has been closed, you cannot edit it.');
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();
}
@@ -174,6 +175,7 @@ class FormEntertainmentPresentationController extends Controller
public function update(Request $request, $id)
{
$this->checkAuthorization(auth()->user(), ['forms.entertainment.edit']);
$role = auth()->user()->getRoleNames()[0];
$request->validate([
'tanggal' => 'required',
@@ -187,8 +189,8 @@ class FormEntertainmentPresentationController extends Controller
]);
$form = FormEntertaimentPresentation::findOrfail($id);
if($form->status == 'Closed') {
session()->flash('error', 'Form has been closed, you cannot edit it.');
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();
}
@@ -414,8 +416,14 @@ class FormEntertainmentPresentationController extends Controller
public function destroy($id)
{
$this->checkAuthorization(auth()->user(), ['forms.entertainment.delete']);
$role = auth()->user()->getRoleNames()[0];
$form = FormEntertaimentPresentation::findOrfail($id);
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();
}
AuditTrailHelper::AddAuditTrail('Delete', 'Delete Record at Form Entertainment Presentation (' . $form->expense_number . ')');
$form->delete();
@@ -190,10 +190,11 @@ class FormMeetingSeminarController extends Controller
public function edit($id)
{
$this->checkAuthorization(auth()->user(), ['forms.meeting.edit']);
$role = auth()->user()->getRoleNames()[0];
$form = FormMeetingSeminar::findOrfail($id);
if($form->status == 'Closed') {
session()->flash('error', 'Form has been closed, you cannot edit it.');
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();
}
@@ -205,6 +206,7 @@ class FormMeetingSeminarController extends Controller
public function update(Request $request, $id)
{
$this->checkAuthorization(auth()->user(), ['forms.meeting.edit']);
$role = auth()->user()->getRoleNames()[0];
$request->validate([
'allowance' => 'nullable|numeric',
@@ -216,8 +218,8 @@ class FormMeetingSeminarController extends Controller
]);
$form = FormMeetingSeminar::findOrfail($id);
if($form->status == 'Closed') {
session()->flash('error', 'Form has been closed, you cannot edit it.');
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();
}
@@ -477,8 +479,14 @@ class FormMeetingSeminarController extends Controller
public function destroy($id)
{
$this->checkAuthorization(auth()->user(), ['forms.meeting.delete']);
$role = auth()->user()->getRoleNames()[0];
$form = FormMeetingSeminar::findOrfail($id);
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();
}
AuditTrailHelper::AddAuditTrail('Delete', 'Delete Record at Form Meeting Seminar (' . $form->expense_number . ')');
$form->delete();
@@ -127,7 +127,6 @@ class FormOtherController extends Controller
$bukti_total->getContent(),
$filename
);
}
// Generate sequence number and expense number
@@ -156,10 +155,11 @@ class FormOtherController extends Controller
public function edit($id)
{
$this->checkAuthorization(auth()->user(), ['forms.other.edit']);
$role = auth()->user()->getRoleNames()[0];
$form = FormOthers::findOrfail($id);
if($form->status == 'Closed') {
session()->flash('error', 'Form has been closed, you cannot edit it.');
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();
}
@@ -172,6 +172,7 @@ class FormOtherController extends Controller
public function update(Request $request, $id)
{
$this->checkAuthorization(auth()->user(), ['forms.other.edit']);
$role = auth()->user()->getRoleNames()[0];
$request->validate([
'kategori_id' => 'required',
@@ -182,8 +183,8 @@ class FormOtherController extends Controller
]);
$form = FormOthers::findOrfail($id);
if($form->status == 'Closed') {
session()->flash('error', 'Form has been closed, you cannot edit it.');
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();
}
@@ -205,7 +206,6 @@ class FormOtherController extends Controller
$bukti_total->getContent(),
$filename
);
}
// Save the form data
@@ -407,8 +407,14 @@ class FormOtherController extends Controller
public function destroy($id)
{
$this->checkAuthorization(auth()->user(), ['forms.other.delete']);
$role = auth()->user()->getRoleNames()[0];
$form = FormOthers::findOrfail($id);
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();
}
AuditTrailHelper::AddAuditTrail('Delete', 'Delete Record at Form Entertainment Presentation (' . $form->expense_number . ')');
$form->delete();
@@ -220,10 +220,11 @@ class FormUpCountryController extends Controller
public function edit($id)
{
$this->checkAuthorization(auth()->user(), ['forms.country.edit']);
$role = auth()->user()->getRoleNames()[0];
$form = FormUpCountry::with('rayon')->findOrfail($id);
if($form->status == 'Closed') {
session()->flash('error', 'Form has been closed, you cannot edit it.');
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();
}
@@ -236,6 +237,7 @@ class FormUpCountryController extends Controller
public function update(Request $request, $id)
{
$this->checkAuthorization(auth()->user(), ['forms.country.edit']);
$role = auth()->user()->getRoleNames()[0];
$request->validate([
'rayon_id' => 'required|exists:rayon,id',
@@ -253,8 +255,8 @@ class FormUpCountryController extends Controller
]);
$form = FormUpCountry::findOrfail($id);
if($form->status == 'Closed') {
session()->flash('error', 'Form has been closed, you cannot edit it.');
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();
}
@@ -537,6 +539,11 @@ class FormUpCountryController extends Controller
$this->checkAuthorization(auth()->user(), ['forms.country.delete']);
$form = FormUpCountry::findOrfail($id);
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();
}
AuditTrailHelper::AddAuditTrail('Delete', 'Delete Record at Form Entertainment Presentation (' . $form->expense_number . ')');
$form->delete();
@@ -159,10 +159,11 @@ class FormVehicleController extends Controller
public function edit($id)
{
$this->checkAuthorization(auth()->user(), ['forms.vehicle.edit']);
$role = auth()->user()->getRoleNames()[0];
$form = FormVehicleRunningCost::findOrfail($id);
if($form->status == 'Closed') {
session()->flash('error', 'Form has been closed, you cannot edit it.');
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();
}
@@ -174,6 +175,7 @@ class FormVehicleController extends Controller
public function update(Request $request, $id)
{
$this->checkAuthorization(auth()->user(), ['forms.vehicle.edit']);
$role = auth()->user()->getRoleNames()[0];
$request->validate([
'tanggal' => 'required',
@@ -187,8 +189,8 @@ class FormVehicleController extends Controller
]);
$form = FormVehicleRunningCost::findOrfail($id);
if($form->status == 'Closed') {
session()->flash('error', 'Form has been closed, you cannot edit it.');
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();
}
@@ -210,7 +212,6 @@ class FormVehicleController extends Controller
$bukti_total->getContent(),
$filename
);
}
// Save the form data
@@ -415,8 +416,14 @@ class FormVehicleController extends Controller
public function destroy($id)
{
$this->checkAuthorization(auth()->user(), ['forms.vehicle.delete']);
$role = auth()->user()->getRoleNames()[0];
$form = FormVehicleRunningCost::findOrfail($id);
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();
}
AuditTrailHelper::AddAuditTrail('Delete', 'Delete Record at Form Entertainment Presentation (' . $form->expense_number . ')');
$form->delete();
+12
View File
@@ -8,6 +8,7 @@ use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Support\Facades\DB;
use Spatie\Permission\Traits\HasRoles;
use Spatie\Permission\Models\Role;
class Admin extends Authenticatable
{
@@ -155,4 +156,15 @@ class Admin extends Authenticatable
{
return $this->hasOne(UserHasCabang::class, 'user_id')->with('cabang');
}
public static function getUserByRoleName($roleName)
{
$role = Role::where('name', $roleName)->first();
if ($role) {
return $role->users()->with('cabang')->get();
}
return [];
}
}
+45
View File
@@ -0,0 +1,45 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class BudgetControl extends Model
{
use SoftDeletes;
protected $table = 'budget_control';
protected $fillable = [
'cabang_id',
'sender_id',
'receiver_id',
'amount',
'remarks',
'periode_month',
'periode_year',
'transferred_at',
'closing_at',
'status',
];
public function user()
{
return $this->belongsTo(Admin::class, 'user_id');
}
public function cabang()
{
return $this->belongsTo(Cabang::class, 'cabang_id');
}
public function sender()
{
return $this->belongsTo(Admin::class, 'sender_id');
}
public function receiver()
{
return $this->belongsTo(Admin::class, 'receiver_id');
}
}
+45
View File
@@ -0,0 +1,45 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class BudgetControlLog extends Model
{
use SoftDeletes;
protected $table = 'budget_control_log';
protected $fillable = [
'cabang_id',
'sender_id',
'receiver_id',
'amount',
'remarks',
'periode_month',
'periode_year',
'transferred_at',
'closing_at',
'status',
];
public function user()
{
return $this->belongsTo(Admin::class, 'user_id');
}
public function cabang()
{
return $this->belongsTo(Cabang::class, 'cabang_id');
}
public function sender()
{
return $this->belongsTo(Admin::class, 'sender_id');
}
public function receiver()
{
return $this->belongsTo(Admin::class, 'receiver_id');
}
}