From 5aa8304a484ed47ea2722e5ae79c51538a13b39c Mon Sep 17 00:00:00 2001 From: Jagad R R Date: Wed, 15 Jan 2025 20:33:51 +0700 Subject: [PATCH 1/7] update --- .env | 1 + .../pages/report/generate_jurnal.blade.php | 43 +++++-------------- 2 files changed, 12 insertions(+), 32 deletions(-) diff --git a/.env b/.env index f8b9bea..d8b1fc5 100644 --- a/.env +++ b/.env @@ -76,4 +76,5 @@ NEXT_CLOUD_PATHPREFIX="" WABLAS_HOST=https://bdg.wablas.com WABLAS_TOKEN=5iCaiP0nEgfl3lzrdsZGb9TvNYuwFZF8s4rp8AYwCx5OrYeiKXgixFMo9nDWNrJN.IF98hujz +STARTING_DATE='12' CLOSING_DATE='20' diff --git a/resources/views/backend/pages/report/generate_jurnal.blade.php b/resources/views/backend/pages/report/generate_jurnal.blade.php index ccddb8a..3ca55a3 100644 --- a/resources/views/backend/pages/report/generate_jurnal.blade.php +++ b/resources/views/backend/pages/report/generate_jurnal.blade.php @@ -140,36 +140,15 @@ @section('scripts') + if ($('#dataTable-table').length) { + $('#dataTable-table').DataTable({ + responsive: false, + dom: 'Bfrtip', + buttons: ['excel', 'csv', 'pdf', 'print', 'colvis'], + paging: false, + info: false, + pageLength: -1 + }); + } + @endsection From 91e4a51f03b417c5968ff40b0a2e1815a0005b49 Mon Sep 17 00:00:00 2001 From: Jagad R R Date: Wed, 15 Jan 2025 22:29:07 +0700 Subject: [PATCH 2/7] improved some query --- app/Helpers/BudgetHelper.php | 45 +- app/Helpers/FormHelper.php | 238 ++++++----- .../Backend/BudgetControlController.php | 71 +--- .../Controllers/Backend/ReportController.php | 402 +++++++++--------- ...ormEntertainmentPresentationController.php | 1 + .../Forms/FormMeetingSeminarController.php | 1 + .../Controllers/Forms/FormOtherController.php | 1 + .../Forms/FormUpCountryController.php | 1 + .../Forms/FormVehicleController.php | 1 + composer.json | 1 + composer.lock | 154 ++++++- .../pages/budget_control/index.blade.php | 2 +- .../pages/report/generate_jurnal.blade.php | 3 +- storage/debugbar/.gitignore | 2 + 14 files changed, 551 insertions(+), 372 deletions(-) create mode 100644 storage/debugbar/.gitignore diff --git a/app/Helpers/BudgetHelper.php b/app/Helpers/BudgetHelper.php index 99f4ae8..1fded83 100644 --- a/app/Helpers/BudgetHelper.php +++ b/app/Helpers/BudgetHelper.php @@ -19,7 +19,7 @@ class BudgetHelper public static function getAvailableBudget($cabang_id) { // Get the budget control data - $budget = BudgetControl::where('cabang_id', $cabang_id)->orderBy('created_at', 'desc')->with(['user', 'cabang'])->get(); + $budget = BudgetControl::where('cabang_id', $cabang_id)->orderBy('created_at', 'desc')->with(['user.cabang'])->get(); // Initialize an empty array to hold the used budget sums $usedBudget = 0; @@ -41,6 +41,49 @@ class BudgetHelper return $availableBudget; } + public static function getNominalByFormType($userIds, $type, $type_id, $month, $year) + { + if ($type == 'Up Country') { + $form = FormUpCountry::select('approved_total') + ->whereIn('user_id', $userIds) + ->whereMonth('tanggal', '=', date('m', strtotime($month))) + ->whereYear('tanggal', '=', $year) + ->whereIn('status', ['Approved', 'Closed']) + ->get(); + } elseif ($type == 'Vehicle Running Cost') { + $form = FormVehicleRunningCost::select('approved_total') + ->whereIn('user_id', $userIds) + ->whereMonth('tanggal', '=', date('m', strtotime($month))) + ->whereYear('tanggal', '=', $year) + ->whereIn('status', ['Approved', 'Closed']) + ->get(); + } elseif ($type == 'Entertainment') { + $form = FormEntertaimentPresentation::select('approved_total') + ->whereIn('user_id', $userIds) + ->whereMonth('tanggal', '=', date('m', strtotime($month))) + ->whereYear('tanggal', '=', $year) + ->whereIn('status', ['Approved', 'Closed']) + ->get(); + } elseif ($type == 'Meeting / Seminar') { + $form = FormMeetingSeminar::select('approved_total') + ->whereIn('user_id', $userIds) + ->whereMonth('created_at', '=', date('m', strtotime($month))) + ->whereYear('created_at', '=', $year) + ->whereIn('status', ['Approved', 'Closed']) + ->get(); + } else { + $form = FormOthers::select('approved_total') + ->whereIn('user_id', $userIds) + ->whereMonth('tanggal', '=', date('m', strtotime($month))) + ->whereYear('tanggal', '=', $year) + ->where('kategori_id', $type_id) + ->whereIn('status', ['Approved', 'Closed']) + ->get(); + } + + return $form->sum('approved_total'); + } + public static function getClosingDate($cabang_id) { $budget = BudgetControl::where('cabang_id', $cabang_id)->orderBy('created_at', 'desc')->first(); diff --git a/app/Helpers/FormHelper.php b/app/Helpers/FormHelper.php index 3e59623..14f5961 100644 --- a/app/Helpers/FormHelper.php +++ b/app/Helpers/FormHelper.php @@ -2,6 +2,7 @@ namespace App\Helpers; +use App\Models\Admin; use App\Models\FormEntertaimentPresentation; use App\Models\FormMeetingSeminar; use App\Models\FormOthers; @@ -13,72 +14,77 @@ use App\Models\UserHasCabang; class FormHelper { public static function getFormsByUserIds($userIds, $month, $year) { + // Eager load 'user.region' and 'user.cabang' + $users = Admin::with(['region', 'cabang']) + ->whereIn('id', $userIds) + ->get(); + $formUpCountryQuery = FormUpCountry::select( - 'expense_number', - 'user_id', - 'total', - 'approved_total', - 'status', - 'account_number', - 'created_at', - DB::raw("'Up Country' as type") - )->whereIn('user_id', $userIds) - ->whereMonth('tanggal', '=', date('m', strtotime($month))) - ->whereYear('tanggal', '=', $year); + 'expense_number', + 'user_id', + 'total', + 'approved_total', + 'status', + 'account_number', + 'created_at', + DB::raw("'Up Country' as type") + )->whereIn('user_id', $userIds) + ->whereMonth('tanggal', '=', date('m', strtotime($month))) + ->whereYear('tanggal', '=', $year); $formVehicleRunningCostQuery = FormVehicleRunningCost::select( - 'expense_number', - 'user_id', - 'total', - 'approved_total', - 'status', - 'account_number', - 'created_at', - DB::raw("'Vehicle Running Cost' as type") - )->whereIn('user_id', $userIds) - ->whereMonth('tanggal', '=', date('m', strtotime($month))) - ->whereYear('tanggal', '=', $year); + 'expense_number', + 'user_id', + 'total', + 'approved_total', + 'status', + 'account_number', + 'created_at', + DB::raw("'Vehicle Running Cost' as type") + )->whereIn('user_id', $userIds) + ->whereMonth('tanggal', '=', date('m', strtotime($month))) + ->whereYear('tanggal', '=', $year); $formEntertaimentPresentationQuery = FormEntertaimentPresentation::select( - 'expense_number', - 'user_id', - 'total', - 'approved_total', - 'status', - 'account_number', - 'created_at', - DB::raw("'Entertainment Presentation' as type") - )->whereIn('user_id', $userIds) - ->whereMonth('tanggal', '=', date('m', strtotime($month))) - ->whereYear('tanggal', '=', $year); + 'expense_number', + 'user_id', + 'total', + 'approved_total', + 'status', + 'account_number', + 'created_at', + DB::raw("'Entertainment Presentation' as type") + )->whereIn('user_id', $userIds) + ->whereMonth('tanggal', '=', date('m', strtotime($month))) + ->whereYear('tanggal', '=', $year); $formMeetingSeminarQuery = FormMeetingSeminar::select( - 'expense_number', - 'user_id', - 'total', - 'approved_total', - 'status', - 'account_number', - 'created_at', - DB::raw("'Meeting Seminar' as type") - )->whereIn('user_id', $userIds) - ->whereMonth('created_at', '=', date('m', strtotime($month))) - ->whereYear('created_at', '=', $year); + 'expense_number', + 'user_id', + 'total', + 'approved_total', + 'status', + 'account_number', + 'created_at', + DB::raw("'Meeting Seminar' as type") + )->whereIn('user_id', $userIds) + ->whereMonth('created_at', '=', date('m', strtotime($month))) + ->whereYear('created_at', '=', $year); $formOthersQuery = FormOthers::select( - 'expense_number', - 'user_id', - 'total', - 'approved_total', - 'status', - 'account_number', - 'created_at', - DB::raw("'Others' as type") - )->whereIn('user_id', $userIds) - ->whereMonth('tanggal', '=', date('m', strtotime($month))) - ->whereYear('tanggal', '=', $year); + 'expense_number', + 'user_id', + 'total', + 'approved_total', + 'status', + 'account_number', + 'created_at', + DB::raw("'Others' as type") + )->whereIn('user_id', $userIds) + ->whereMonth('tanggal', '=', date('m', strtotime($month))) + ->whereYear('tanggal', '=', $year); - // Use union before fetching the data + // Use union to combine queries $forms = $formUpCountryQuery ->union($formVehicleRunningCostQuery) ->union($formEntertaimentPresentationQuery) @@ -86,71 +92,80 @@ class FormHelper ->union($formOthersQuery) ->get(); - return $forms; + // Return forms with eager loaded user details + return $forms->map(function ($form) use ($users) { + $user = $users->firstWhere('id', $form->user_id); + $form->user = $user; + return $form; + }); } public static function getAllForms($month, $year) { + // Get all users with eager loading for 'region' and 'cabang' + $users = Admin::with(['region', 'cabang']) + ->get(); + $formUpCountryQuery = FormUpCountry::select( - 'expense_number', - 'user_id', - 'total', - 'approved_total', - 'status', - 'account_number', - 'created_at', - DB::raw("'Up Country' as type") - )->whereMonth('tanggal', '=', date('m', strtotime($month))) - ->whereYear('tanggal', '=', $year); + 'expense_number', + 'user_id', + 'total', + 'approved_total', + 'status', + 'account_number', + 'created_at', + DB::raw("'Up Country' as type") + )->whereMonth('tanggal', '=', date('m', strtotime($month))) + ->whereYear('tanggal', '=', $year); $formVehicleRunningCostQuery = FormVehicleRunningCost::select( - 'expense_number', - 'user_id', - 'total', - 'approved_total', - 'status', - 'account_number', - 'created_at', - DB::raw("'Vehicle Running Cost' as type") - )->whereMonth('tanggal', '=', date('m', strtotime($month))) - ->whereYear('tanggal', '=', $year); + 'expense_number', + 'user_id', + 'total', + 'approved_total', + 'status', + 'account_number', + 'created_at', + DB::raw("'Vehicle Running Cost' as type") + )->whereMonth('tanggal', '=', date('m', strtotime($month))) + ->whereYear('tanggal', '=', $year); $formEntertaimentPresentationQuery = FormEntertaimentPresentation::select( - 'expense_number', - 'user_id', - 'total', - 'approved_total', - 'status', - 'account_number', - 'created_at', - DB::raw("'Entertainment Presentation' as type") - )->whereMonth('tanggal', '=', date('m', strtotime($month))) - ->whereYear('tanggal', '=', $year); + 'expense_number', + 'user_id', + 'total', + 'approved_total', + 'status', + 'account_number', + 'created_at', + DB::raw("'Entertainment Presentation' as type") + )->whereMonth('tanggal', '=', date('m', strtotime($month))) + ->whereYear('tanggal', '=', $year); $formMeetingSeminarQuery = FormMeetingSeminar::select( - 'expense_number', - 'user_id', - 'total', - 'approved_total', - 'status', - 'account_number', - 'created_at', - DB::raw("'Meeting Seminar' as type") - )->whereMonth('created_at', '=', date('m', strtotime($month))) - ->whereYear('created_at', '=', $year); + 'expense_number', + 'user_id', + 'total', + 'approved_total', + 'status', + 'account_number', + 'created_at', + DB::raw("'Meeting Seminar' as type") + )->whereMonth('created_at', '=', date('m', strtotime($month))) + ->whereYear('created_at', '=', $year); $formOthersQuery = FormOthers::select( - 'expense_number', - 'user_id', - 'total', - 'approved_total', - 'status', - 'account_number', - 'created_at', - DB::raw("'Others' as type") - )->whereMonth('tanggal', '=', date('m', strtotime($month))) - ->whereYear('tanggal', '=', $year); + 'expense_number', + 'user_id', + 'total', + 'approved_total', + 'status', + 'account_number', + 'created_at', + DB::raw("'Others' as type") + )->whereMonth('tanggal', '=', date('m', strtotime($month))) + ->whereYear('tanggal', '=', $year); - // Use union before fetching the data + // Combine queries using union $forms = $formUpCountryQuery ->union($formVehicleRunningCostQuery) ->union($formEntertaimentPresentationQuery) @@ -158,7 +173,12 @@ class FormHelper ->union($formOthersQuery) ->get(); - return $forms; + // Map users to the forms with eager loaded data + return $forms->map(function ($form) use ($users) { + $user = $users->firstWhere('id', $form->user_id); + $form->user = $user; + return $form; + }); } public static function getNominalByFormType($cabang_id, $type, $type_id, $month, $year) { diff --git a/app/Http/Controllers/Backend/BudgetControlController.php b/app/Http/Controllers/Backend/BudgetControlController.php index 187e18e..95d6581 100644 --- a/app/Http/Controllers/Backend/BudgetControlController.php +++ b/app/Http/Controllers/Backend/BudgetControlController.php @@ -4,6 +4,7 @@ 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; @@ -23,8 +24,6 @@ class BudgetControlController extends Controller $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(); $role = auth()->user()->getRoleNames()[0]; $budget = null; @@ -32,72 +31,32 @@ class BudgetControlController extends Controller $region_id = auth()->user()->getMyCabangAndRegionId()['region']; if ($region_id) { - // Get budget controls where the region matches $budget = BudgetControl::whereHas('cabang', function ($query) use ($region_id) { $query->where('region_id', $region_id); - })->get(); + })->with(['receiver', 'sender', 'cabang'])->get(); } } elseif ($role == 'Area Manager Cabang') { $cabang_id = auth()->user()->getMyCabangAndRegionId()['cabang']; if ($cabang_id) { - // Get budget controls where the cabang matches - $budget = BudgetControl::where('cabang_id', $cabang_id)->get(); + $budget = BudgetControl::where('cabang_id', $cabang_id) + ->with(['receiver', 'sender', 'cabang']) + ->get(); } } else { - // Get all budget controls for other roles - $budget = BudgetControl::all(); + $budget = BudgetControl::with(['receiver', 'sender', 'cabang'])->get(); } - // Initialize an empty array to hold the used budget sums - $usedBudget = []; + // Calculate usedBudget and availableBudget for each cabang + $budget->map(function ($b) { + $b->availableBudget = BudgetHelper::getAvailableBudget($b->cabang_id); - foreach ($budget as $b) { - // Get the month and year from the budget - $month = $b->periode_month; - $year = $b->periode_year; + return $b; + }); - // 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, - ] - ); + return view('backend.pages.budget_control.index', [ + 'data' => $budget, + ]); } public function log() @@ -108,7 +67,7 @@ class BudgetControlController extends Controller return view( 'backend.pages.budget_control.log', [ - 'data' => BudgetControlLog::orderBy('created_at', 'desc')->with(['user', 'cabang'])->get(), + 'data' => BudgetControlLog::orderBy('created_at', 'desc')->with(['receiver', 'sender', 'cabang'])->get(), ] ); } diff --git a/app/Http/Controllers/Backend/ReportController.php b/app/Http/Controllers/Backend/ReportController.php index 42040d3..b2e1742 100644 --- a/app/Http/Controllers/Backend/ReportController.php +++ b/app/Http/Controllers/Backend/ReportController.php @@ -27,88 +27,75 @@ class ReportController extends Controller public function upcountry() { $role = auth()->user()->getRoleNames()[0]; - $cabangs = []; - $regions = []; - $forms = null; + $cabangs = collect(); // Default empty collection + $regions = collect(); // Default empty collection + $formsQuery = FormUpCountry::with([ + 'user.region', + 'user.cabang', + 'rayon' + ]); if ($role == 'Admin Region' || $role == 'Marketing Operational Manager Region') { $region_id = auth()->user()->getMyCabangAndRegionId()['region']; if ($region_id) { - $users = UserHasCabang::whereHas('cabang', function ($query) use ($region_id) { - $query->where('region_id', $region_id); - })->get(); - - $userIds = $users->pluck('user_id')->toArray(); - $cabangs = Cabang::where('region_id', $region_id)->get(); $regions = Region::where('id', $region_id)->get(); - $forms = FormUpCountry::whereIn('user_id', $userIds)->get(); + $userIds = UserHasCabang::whereIn('cabang_id', $cabangs->pluck('id'))->pluck('user_id'); + $formsQuery->whereIn('user_id', $userIds); } - } else if ($role == 'Area Manager Cabang') { + } elseif ($role == 'Area Manager Cabang') { $cabang_id = auth()->user()->getMyCabangAndRegionId()['cabang']; if ($cabang_id) { - $users = UserHasCabang::where('cabang_id', $cabang_id)->get(); - $userIds = $users->pluck('user_id')->toArray(); - $cabangs = Cabang::where('id', $cabang_id)->get(); - $regions = Region::where('id', $cabangs[0]->region_id)->get(); - $forms = FormUpCountry::whereIn('user_id', $userIds)->get(); + $regions = Region::where('id', $cabangs->first()->region_id)->get(); + $userIds = UserHasCabang::where('cabang_id', $cabang_id)->pluck('user_id'); + $formsQuery->whereIn('user_id', $userIds); } - } else if ($role == 'Medical Representatif') { - $userId = auth()->user()->id; - - $cabangs = null; - $regions = null; - $forms = FormUpCountry::where('user_id', $userId)->get(); } else { $cabangs = Cabang::all(); $regions = Region::all(); - $forms = FormUpCountry::all(); } - // get all params in url + // Apply filters from URL params $params = request()->all(); - if ($params) { - // Filter by region - if (isset($params['region'])) { - $region = Region::where('code', $params['region'])->first(); - if ($region) { - $userIds = UserHasCabang::whereIn('cabang_id', Cabang::where('region_id', $region->id)->pluck('id'))->pluck('user_id')->toArray(); - $forms = $forms->whereIn('user_id', $userIds); - } - } - // Filter by cabang - if (isset($params['cabang'])) { - $cabang = Cabang::where('code', $params['cabang'])->first(); - if ($cabang) { - $userIds = UserHasCabang::where('cabang_id', $cabang->id)->pluck('user_id')->toArray(); - $forms = $forms->whereIn('user_id', $userIds); - } - } - - // Filter by date range - if (isset($params['start_date']) || isset($params['end_date'])) { - $startDate = $params['start_date'] ?? null; - $endDate = $params['end_date'] ?? null; - - if ($startDate && $endDate) { - $forms = $forms->whereBetween('tanggal', [$startDate, $endDate]); - } elseif ($startDate) { - $forms = $forms->where('tanggal', '>=', $startDate); - } elseif ($endDate) { - $forms = $forms->where('tanggal', '<=', $endDate); - } - } - - // Filter by status - if (isset($params['status'])) { - $forms = $forms->where('status', $params['status']); + if (isset($params['region'])) { + $region = Region::where('code', $params['region'])->first(); + if ($region) { + $userIds = UserHasCabang::whereIn('cabang_id', Cabang::where('region_id', $region->id)->pluck('id'))->pluck('user_id'); + $formsQuery->whereIn('user_id', $userIds); } } + if (isset($params['cabang'])) { + $cabang = Cabang::where('code', $params['cabang'])->first(); + if ($cabang) { + $userIds = UserHasCabang::where('cabang_id', $cabang->id)->pluck('user_id'); + $formsQuery->whereIn('user_id', $userIds); + } + } + + if (isset($params['start_date']) || isset($params['end_date'])) { + $startDate = $params['start_date'] ?? null; + $endDate = $params['end_date'] ?? null; + + if ($startDate && $endDate) { + $formsQuery->whereBetween('tanggal', [$startDate, $endDate]); + } elseif ($startDate) { + $formsQuery->where('tanggal', '>=', $startDate); + } elseif ($endDate) { + $formsQuery->where('tanggal', '<=', $endDate); + } + } + + if (isset($params['status'])) { + $formsQuery->where('status', $params['status']); + } + + // Fetch forms after applying all filters + $forms = $formsQuery->get(); return view('backend.pages.report.upcountry', [ 'pageInfo' => [ @@ -120,51 +107,43 @@ class ReportController extends Controller ]); } + public function vehicle() { $role = auth()->user()->getRoleNames()[0]; - $cabangs = []; - $regions = []; - $forms = null; + $cabangs = collect(); // Default empty collection + $regions = collect(); // Default empty collection + $formsQuery = FormVehicleRunningCost::with([ + 'user.region', // Eager load 'region' within 'user' + 'user.cabang', // Eager load 'cabang' within 'user' + ]); + // Apply role-based query logic if ($role == 'Admin Region' || $role == 'Marketing Operational Manager Region') { $region_id = auth()->user()->getMyCabangAndRegionId()['region']; if ($region_id) { - $users = UserHasCabang::whereHas('cabang', function ($query) use ($region_id) { - $query->where('region_id', $region_id); - })->get(); - - $userIds = $users->pluck('user_id')->toArray(); - $cabangs = Cabang::where('region_id', $region_id)->get(); $regions = Region::where('id', $region_id)->get(); - $forms = FormVehicleRunningCost::whereIn('user_id', $userIds)->get(); + $userIds = UserHasCabang::whereIn('cabang_id', $cabangs->pluck('id'))->pluck('user_id'); + $formsQuery->whereIn('user_id', $userIds); } - } else if ($role == 'Area Manager Cabang') { + } elseif ($role == 'Area Manager Cabang') { $cabang_id = auth()->user()->getMyCabangAndRegionId()['cabang']; if ($cabang_id) { - $users = UserHasCabang::where('cabang_id', $cabang_id)->get(); - $userIds = $users->pluck('user_id')->toArray(); - $cabangs = Cabang::where('id', $cabang_id)->get(); - $regions = Region::where('id', $cabangs[0]->region_id)->get(); - $forms = FormVehicleRunningCost::whereIn('user_id', $userIds)->get(); + $regions = Region::where('id', $cabangs->first()->region_id)->get(); + $userIds = UserHasCabang::where('cabang_id', $cabang_id)->pluck('user_id'); + $formsQuery->whereIn('user_id', $userIds); } - } else if ($role == 'Medical Representatif') { - $userId = auth()->user()->id; - - $cabangs = null; - $regions = null; - $forms = FormVehicleRunningCost::where('user_id', $userId)->get(); } else { + // Default behavior for other roles (if no specific role is matched) $cabangs = Cabang::all(); $regions = Region::all(); - $forms = FormVehicleRunningCost::all(); } - // get all params in url + // Get all params in URL for filtering $params = request()->all(); if ($params) { @@ -172,8 +151,8 @@ class ReportController extends Controller if (isset($params['region'])) { $region = Region::where('code', $params['region'])->first(); if ($region) { - $userIds = UserHasCabang::whereIn('cabang_id', Cabang::where('region_id', $region->id)->pluck('id'))->pluck('user_id')->toArray(); - $forms = $forms->whereIn('user_id', $userIds); + $userIds = UserHasCabang::whereIn('cabang_id', Cabang::where('region_id', $region->id)->pluck('id'))->pluck('user_id'); + $formsQuery->whereIn('user_id', $userIds); } } @@ -181,8 +160,8 @@ class ReportController extends Controller if (isset($params['cabang'])) { $cabang = Cabang::where('code', $params['cabang'])->first(); if ($cabang) { - $userIds = UserHasCabang::where('cabang_id', $cabang->id)->pluck('user_id')->toArray(); - $forms = $forms->whereIn('user_id', $userIds); + $userIds = UserHasCabang::where('cabang_id', $cabang->id)->pluck('user_id'); + $formsQuery->whereIn('user_id', $userIds); } } @@ -192,20 +171,23 @@ class ReportController extends Controller $endDate = $params['end_date'] ?? null; if ($startDate && $endDate) { - $forms = $forms->whereBetween('tanggal', [$startDate, $endDate]); + $formsQuery->whereBetween('tanggal', [$startDate, $endDate]); } elseif ($startDate) { - $forms = $forms->where('tanggal', '>=', $startDate); + $formsQuery->where('tanggal', '>=', $startDate); } elseif ($endDate) { - $forms = $forms->where('tanggal', '<=', $endDate); + $formsQuery->where('tanggal', '<=', $endDate); } } // Filter by status if (isset($params['status'])) { - $forms = $forms->where('status', $params['status']); + $formsQuery->where('status', $params['status']); } } + // Fetch forms after applying all filters + $forms = $formsQuery->get(); + return view('backend.pages.report.vehicle', [ 'pageInfo' => [ 'title' => 'Generate Reports For Form Vehicle Running Cost', @@ -219,48 +201,35 @@ class ReportController extends Controller public function entertainment() { $role = auth()->user()->getRoleNames()[0]; - $cabangs = []; - $regions = []; - $forms = null; + $cabangs = Cabang::all(); + $regions = Region::all(); + $formsQuery = FormEntertaimentPresentation::with([ + 'user.region', // Eager load 'region' within 'user' + 'user.cabang', // Eager load 'cabang' within 'user' + ]); + // Apply role-based query logic if ($role == 'Admin Region' || $role == 'Marketing Operational Manager Region') { $region_id = auth()->user()->getMyCabangAndRegionId()['region']; if ($region_id) { - $users = UserHasCabang::whereHas('cabang', function ($query) use ($region_id) { - $query->where('region_id', $region_id); - })->get(); - - $userIds = $users->pluck('user_id')->toArray(); - $cabangs = Cabang::where('region_id', $region_id)->get(); $regions = Region::where('id', $region_id)->get(); - $forms = FormEntertaimentPresentation::whereIn('user_id', $userIds)->get(); + $userIds = UserHasCabang::whereIn('cabang_id', $cabangs->pluck('id'))->pluck('user_id'); + $formsQuery->whereIn('user_id', $userIds); } - } else if ($role == 'Area Manager Cabang') { + } elseif ($role == 'Area Manager Cabang') { $cabang_id = auth()->user()->getMyCabangAndRegionId()['cabang']; if ($cabang_id) { - $users = UserHasCabang::where('cabang_id', $cabang_id)->get(); - $userIds = $users->pluck('user_id')->toArray(); - $cabangs = Cabang::where('id', $cabang_id)->get(); - $regions = Region::where('id', $cabangs[0]->region_id)->get(); - $forms = FormEntertaimentPresentation::whereIn('user_id', $userIds)->get(); + $regions = Region::where('id', $cabangs->first()->region_id)->get(); + $userIds = UserHasCabang::where('cabang_id', $cabang_id)->pluck('user_id'); + $formsQuery->whereIn('user_id', $userIds); } - } else if ($role == 'Medical Representatif') { - $userId = auth()->user()->id; - - $cabangs = null; - $regions = null; - $forms = FormEntertaimentPresentation::where('user_id', $userId)->get(); - } else { - $cabangs = Cabang::all(); - $regions = Region::all(); - $forms = FormEntertaimentPresentation::all(); } - // get all params in url + // Get all params in URL for filtering $params = request()->all(); if ($params) { @@ -268,8 +237,8 @@ class ReportController extends Controller if (isset($params['region'])) { $region = Region::where('code', $params['region'])->first(); if ($region) { - $userIds = UserHasCabang::whereIn('cabang_id', Cabang::where('region_id', $region->id)->pluck('id'))->pluck('user_id')->toArray(); - $forms = $forms->whereIn('user_id', $userIds); + $userIds = UserHasCabang::whereIn('cabang_id', Cabang::where('region_id', $region->id)->pluck('id'))->pluck('user_id'); + $formsQuery->whereIn('user_id', $userIds); } } @@ -277,8 +246,8 @@ class ReportController extends Controller if (isset($params['cabang'])) { $cabang = Cabang::where('code', $params['cabang'])->first(); if ($cabang) { - $userIds = UserHasCabang::where('cabang_id', $cabang->id)->pluck('user_id')->toArray(); - $forms = $forms->whereIn('user_id', $userIds); + $userIds = UserHasCabang::where('cabang_id', $cabang->id)->pluck('user_id'); + $formsQuery->whereIn('user_id', $userIds); } } @@ -288,20 +257,23 @@ class ReportController extends Controller $endDate = $params['end_date'] ?? null; if ($startDate && $endDate) { - $forms = $forms->whereBetween('tanggal', [$startDate, $endDate]); + $formsQuery->whereBetween('tanggal', [$startDate, $endDate]); } elseif ($startDate) { - $forms = $forms->where('tanggal', '>=', $startDate); + $formsQuery->where('tanggal', '>=', $startDate); } elseif ($endDate) { - $forms = $forms->where('tanggal', '<=', $endDate); + $formsQuery->where('tanggal', '<=', $endDate); } } // Filter by status if (isset($params['status'])) { - $forms = $forms->where('status', $params['status']); + $formsQuery->where('status', $params['status']); } } + // Fetch forms after applying all filters + $forms = $formsQuery->get(); + return view('backend.pages.report.entertainment', [ 'pageInfo' => [ 'title' => 'Generate Reports For Form Entertainment & Presentation', @@ -315,48 +287,37 @@ class ReportController extends Controller public function meeting() { $role = auth()->user()->getRoleNames()[0]; - $cabangs = []; - $regions = []; - $forms = null; + $cabangs = Cabang::all(); + $regions = Region::all(); + + // Initialize the query for FormMeetingSeminar with eager loading + $formsQuery = FormMeetingSeminar::with([ + 'user.region', // Eager load 'region' within 'user' + 'user.cabang', // Eager load 'cabang' within 'user' + ]); + // Apply role-based query logic if ($role == 'Admin Region' || $role == 'Marketing Operational Manager Region') { $region_id = auth()->user()->getMyCabangAndRegionId()['region']; if ($region_id) { - $users = UserHasCabang::whereHas('cabang', function ($query) use ($region_id) { - $query->where('region_id', $region_id); - })->get(); - - $userIds = $users->pluck('user_id')->toArray(); - $cabangs = Cabang::where('region_id', $region_id)->get(); $regions = Region::where('id', $region_id)->get(); - $forms = FormMeetingSeminar::whereIn('user_id', $userIds)->get(); + $userIds = UserHasCabang::whereIn('cabang_id', $cabangs->pluck('id'))->pluck('user_id'); + $formsQuery->whereIn('user_id', $userIds); } - } else if ($role == 'Area Manager Cabang') { + } elseif ($role == 'Area Manager Cabang') { $cabang_id = auth()->user()->getMyCabangAndRegionId()['cabang']; if ($cabang_id) { - $users = UserHasCabang::where('cabang_id', $cabang_id)->get(); - $userIds = $users->pluck('user_id')->toArray(); - $cabangs = Cabang::where('id', $cabang_id)->get(); - $regions = Region::where('id', $cabangs[0]->region_id)->get(); - $forms = FormMeetingSeminar::whereIn('user_id', $userIds)->get(); + $regions = Region::where('id', $cabangs->first()->region_id)->get(); + $userIds = UserHasCabang::where('cabang_id', $cabang_id)->pluck('user_id'); + $formsQuery->whereIn('user_id', $userIds); } - } else if ($role == 'Medical Representatif') { - $userId = auth()->user()->id; - - $cabangs = null; - $regions = null; - $forms = FormMeetingSeminar::where('user_id', $userId)->get(); - } else { - $cabangs = Cabang::all(); - $regions = Region::all(); - $forms = FormMeetingSeminar::all(); } - // get all params in url + // Get all params in URL for filtering $params = request()->all(); if ($params) { @@ -364,8 +325,8 @@ class ReportController extends Controller if (isset($params['region'])) { $region = Region::where('code', $params['region'])->first(); if ($region) { - $userIds = UserHasCabang::whereIn('cabang_id', Cabang::where('region_id', $region->id)->pluck('id'))->pluck('user_id')->toArray(); - $forms = $forms->whereIn('user_id', $userIds); + $userIds = UserHasCabang::whereIn('cabang_id', Cabang::where('region_id', $region->id)->pluck('id'))->pluck('user_id'); + $formsQuery->whereIn('user_id', $userIds); } } @@ -373,8 +334,8 @@ class ReportController extends Controller if (isset($params['cabang'])) { $cabang = Cabang::where('code', $params['cabang'])->first(); if ($cabang) { - $userIds = UserHasCabang::where('cabang_id', $cabang->id)->pluck('user_id')->toArray(); - $forms = $forms->whereIn('user_id', $userIds); + $userIds = UserHasCabang::where('cabang_id', $cabang->id)->pluck('user_id'); + $formsQuery->whereIn('user_id', $userIds); } } @@ -384,20 +345,23 @@ class ReportController extends Controller $endDate = $params['end_date'] ?? null; if ($startDate && $endDate) { - $forms = $forms->whereBetween('tanggal', [$startDate, $endDate]); + $formsQuery->whereBetween('tanggal', [$startDate, $endDate]); } elseif ($startDate) { - $forms = $forms->where('tanggal', '>=', $startDate); + $formsQuery->where('tanggal', '>=', $startDate); } elseif ($endDate) { - $forms = $forms->where('tanggal', '<=', $endDate); + $formsQuery->where('tanggal', '<=', $endDate); } } // Filter by status if (isset($params['status'])) { - $forms = $forms->where('status', $params['status']); + $formsQuery->where('status', $params['status']); } } + // Fetch forms after applying all filters + $forms = $formsQuery->get(); + return view('backend.pages.report.meeting', [ 'pageInfo' => [ 'title' => 'Generate Reports For Form Meeting & Seminar', @@ -411,48 +375,38 @@ class ReportController extends Controller public function others() { $role = auth()->user()->getRoleNames()[0]; - $cabangs = []; - $regions = []; - $forms = null; + $cabangs = Cabang::all(); + $regions = Region::all(); + + // Initialize the query for FormOthers with eager loading + $formsQuery = FormOthers::with([ + 'user.region', // Eager load 'region' within 'user' + 'user.cabang', // Eager load 'cabang' within 'user' + 'kategori' + ]); + // Apply role-based query logic if ($role == 'Admin Region' || $role == 'Marketing Operational Manager Region') { $region_id = auth()->user()->getMyCabangAndRegionId()['region']; if ($region_id) { - $users = UserHasCabang::whereHas('cabang', function ($query) use ($region_id) { - $query->where('region_id', $region_id); - })->get(); - - $userIds = $users->pluck('user_id')->toArray(); - $cabangs = Cabang::where('region_id', $region_id)->get(); $regions = Region::where('id', $region_id)->get(); - $forms = FormOthers::whereIn('user_id', $userIds)->get(); + $userIds = UserHasCabang::whereIn('cabang_id', $cabangs->pluck('id'))->pluck('user_id'); + $formsQuery->whereIn('user_id', $userIds); } - } else if ($role == 'Area Manager Cabang') { + } elseif ($role == 'Area Manager Cabang') { $cabang_id = auth()->user()->getMyCabangAndRegionId()['cabang']; if ($cabang_id) { - $users = UserHasCabang::where('cabang_id', $cabang_id)->get(); - $userIds = $users->pluck('user_id')->toArray(); - $cabangs = Cabang::where('id', $cabang_id)->get(); - $regions = Region::where('id', $cabangs[0]->region_id)->get(); - $forms = FormOthers::whereIn('user_id', $userIds)->get(); + $regions = Region::where('id', $cabangs->first()->region_id)->get(); + $userIds = UserHasCabang::where('cabang_id', $cabang_id)->pluck('user_id'); + $formsQuery->whereIn('user_id', $userIds); } - } else if ($role == 'Medical Representatif') { - $userId = auth()->user()->id; - - $cabangs = null; - $regions = null; - $forms = FormOthers::where('user_id', $userId)->get(); - } else { - $cabangs = Cabang::all(); - $regions = Region::all(); - $forms = FormOthers::all(); } - // get all params in url + // Get all params in URL for filtering $params = request()->all(); if ($params) { @@ -460,8 +414,8 @@ class ReportController extends Controller if (isset($params['region'])) { $region = Region::where('code', $params['region'])->first(); if ($region) { - $userIds = UserHasCabang::whereIn('cabang_id', Cabang::where('region_id', $region->id)->pluck('id'))->pluck('user_id')->toArray(); - $forms = $forms->whereIn('user_id', $userIds); + $userIds = UserHasCabang::whereIn('cabang_id', Cabang::where('region_id', $region->id)->pluck('id'))->pluck('user_id'); + $formsQuery->whereIn('user_id', $userIds); } } @@ -469,8 +423,8 @@ class ReportController extends Controller if (isset($params['cabang'])) { $cabang = Cabang::where('code', $params['cabang'])->first(); if ($cabang) { - $userIds = UserHasCabang::where('cabang_id', $cabang->id)->pluck('user_id')->toArray(); - $forms = $forms->whereIn('user_id', $userIds); + $userIds = UserHasCabang::where('cabang_id', $cabang->id)->pluck('user_id'); + $formsQuery->whereIn('user_id', $userIds); } } @@ -480,20 +434,23 @@ class ReportController extends Controller $endDate = $params['end_date'] ?? null; if ($startDate && $endDate) { - $forms = $forms->whereBetween('tanggal', [$startDate, $endDate]); + $formsQuery->whereBetween('tanggal', [$startDate, $endDate]); } elseif ($startDate) { - $forms = $forms->where('tanggal', '>=', $startDate); + $formsQuery->where('tanggal', '>=', $startDate); } elseif ($endDate) { - $forms = $forms->where('tanggal', '<=', $endDate); + $formsQuery->where('tanggal', '<=', $endDate); } } // Filter by status if (isset($params['status'])) { - $forms = $forms->where('status', $params['status']); + $formsQuery->where('status', $params['status']); } } + // Fetch forms after applying all filters + $forms = $formsQuery->get(); + return view('backend.pages.report.others', [ 'pageInfo' => [ 'title' => 'Generate Reports For Form Others', @@ -538,10 +495,6 @@ class ReportController extends Controller $regions = Region::where('id', $cabangs[0]->region_id)->get(); $forms = FormHelper::getFormsByUserIds($userIds, $month, $year)->sortByDesc('created_at'); } - } elseif ($role == 'Medical Representatif') { - $cabangs = null; - $regions = null; - $forms = FormHelper::getFormsByUserIds([$userId], $month, $year)->sortByDesc('created_at'); } else { $cabangs = Cabang::all(); $regions = Region::all(); @@ -674,11 +627,53 @@ class ReportController extends Controller $kategoris = Kategori::all(); $kategori_bca = Kategori::where('name', 'Cash in Bank BCA')->first(); $cabang = Cabang::with('cost')->where('code', $params['cabang'])->first(); - + $year = $params['year']; $month = $params['month']; $budget = BudgetControlLog::where('cabang_id', $cabang->id)->where('periode_year', $year)->where('periode_month', $month)->orderBy('created_at', 'desc')->first(); + $userIds = UserHasCabang::where('cabang_id', $cabang->id)->pluck('user_id'); + + // Fetch all relevant forms in one batch + $forms = [ + 'Up Country' => FormUpCountry::whereIn('user_id', $userIds) + ->whereMonth('tanggal', '=', date('m', strtotime($month))) + ->whereYear('tanggal', '=', $year) + ->whereIn('status', ['Approved', 'Closed']) + ->get(), + 'Vehicle Running Cost' => FormVehicleRunningCost::whereIn('user_id', $userIds) + ->whereMonth('tanggal', '=', date('m', strtotime($month))) + ->whereYear('tanggal', '=', $year) + ->whereIn('status', ['Approved', 'Closed']) + ->get(), + 'Entertainment' => FormEntertaimentPresentation::whereIn('user_id', $userIds) + ->whereMonth('tanggal', '=', date('m', strtotime($month))) + ->whereYear('tanggal', '=', $year) + ->whereIn('status', ['Approved', 'Closed']) + ->get(), + 'Meeting / Seminar' => FormMeetingSeminar::whereIn('user_id', $userIds) + ->whereMonth('created_at', '=', date('m', strtotime($month))) + ->whereYear('created_at', '=', $year) + ->whereIn('status', ['Approved', 'Closed']) + ->get(), + ]; + + // Fetch 'Others' forms by kategori + $otherForms = FormOthers::whereIn('user_id', $userIds) + ->whereMonth('tanggal', '=', date('m', strtotime($month))) + ->whereYear('tanggal', '=', $year) + ->whereIn('status', ['Approved', 'Closed']) + ->get(); + + // Precompute totals for each category + $nominals = []; + foreach ($kategoris as $item) { + if (isset($forms[$item->name])) { + $nominals[$item->id] = $forms[$item->name]->sum('approved_total'); + } else { + $nominals[$item->id] = $otherForms->where('kategori_id', $item->id)->sum('approved_total'); + } + } return view('backend.pages.report.generate_jurnal', [ 'pageInfo' => [ @@ -688,8 +683,9 @@ class ReportController extends Controller 'cabang' => $cabang, 'year' => $year, 'month' => $month, - 'budget' => $budget, - 'kategori_bca' => $kategori_bca + 'kategori_bca' => $kategori_bca, + 'nominals' => $nominals, + 'budget' => $budget ]); } } diff --git a/app/Http/Controllers/Forms/FormEntertainmentPresentationController.php b/app/Http/Controllers/Forms/FormEntertainmentPresentationController.php index 558183b..3ab5a75 100644 --- a/app/Http/Controllers/Forms/FormEntertainmentPresentationController.php +++ b/app/Http/Controllers/Forms/FormEntertainmentPresentationController.php @@ -37,6 +37,7 @@ class FormEntertainmentPresentationController extends Controller ->where('tanggal', '<=', date('Y-m-' . env('CLOSING_DATE'))) ->whereRaw('DAY(CURDATE()) <= ' . env('CLOSING_DATE')) ->orderBy('tanggal', 'desc') + ->with('user') ->get(); $availableBudget = null; diff --git a/app/Http/Controllers/Forms/FormMeetingSeminarController.php b/app/Http/Controllers/Forms/FormMeetingSeminarController.php index 363d86f..621f2f3 100644 --- a/app/Http/Controllers/Forms/FormMeetingSeminarController.php +++ b/app/Http/Controllers/Forms/FormMeetingSeminarController.php @@ -37,6 +37,7 @@ class FormMeetingSeminarController extends Controller ->where('created_at', '<=', date('Y-m-' . env('CLOSING_DATE'))) ->whereRaw('DAY(CURDATE()) <= ' . env('CLOSING_DATE')) ->orderBy('created_at', 'desc') + ->with('user') ->get(); $availableBudget = null; diff --git a/app/Http/Controllers/Forms/FormOtherController.php b/app/Http/Controllers/Forms/FormOtherController.php index 0660b71..638d208 100644 --- a/app/Http/Controllers/Forms/FormOtherController.php +++ b/app/Http/Controllers/Forms/FormOtherController.php @@ -37,6 +37,7 @@ class FormOtherController extends Controller ->where('tanggal', '<=', date('Y-m-' . env('CLOSING_DATE'))) ->whereRaw('DAY(CURDATE()) <= ' . env('CLOSING_DATE')) ->orderBy('tanggal', 'desc') + ->with(['user', 'kategori']) ->get(); $availableBudget = null; diff --git a/app/Http/Controllers/Forms/FormUpCountryController.php b/app/Http/Controllers/Forms/FormUpCountryController.php index 6e7caef..9097c2a 100644 --- a/app/Http/Controllers/Forms/FormUpCountryController.php +++ b/app/Http/Controllers/Forms/FormUpCountryController.php @@ -37,6 +37,7 @@ class FormUpCountryController extends Controller ->where('tanggal', '<=', date('Y-m-' . env('CLOSING_DATE'))) ->whereRaw('DAY(CURDATE()) <= ' . env('CLOSING_DATE')) ->orderBy('tanggal', 'desc') + ->with(['rayon', 'user']) ->get(); $availableBudget = null; diff --git a/app/Http/Controllers/Forms/FormVehicleController.php b/app/Http/Controllers/Forms/FormVehicleController.php index 69df316..d49bab1 100644 --- a/app/Http/Controllers/Forms/FormVehicleController.php +++ b/app/Http/Controllers/Forms/FormVehicleController.php @@ -37,6 +37,7 @@ class FormVehicleController extends Controller ->where('tanggal', '<=', date('Y-m-' . env('CLOSING_DATE'))) ->whereRaw('DAY(CURDATE()) <= ' . env('CLOSING_DATE')) ->orderBy('tanggal', 'desc') + ->with('user') ->get(); $availableBudget = null; diff --git a/composer.json b/composer.json index 7f35a49..22d26a8 100644 --- a/composer.json +++ b/composer.json @@ -25,6 +25,7 @@ "yajra/laravel-datatables-oracle": "11.0" }, "require-dev": { + "barryvdh/laravel-debugbar": "^3.14", "fakerphp/faker": "^1.23", "laravel/pail": "^1.1", "laravel/pint": "^1.13", diff --git a/composer.lock b/composer.lock index b58983c..64e194c 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "868009e8371e3394bb5e17f99038a6b8", + "content-hash": "5ba74d8866276fa9daa9d6c52fd9f690", "packages": [ { "name": "barryvdh/laravel-dompdf", @@ -8044,6 +8044,90 @@ } ], "packages-dev": [ + { + "name": "barryvdh/laravel-debugbar", + "version": "v3.14.10", + "source": { + "type": "git", + "url": "https://github.com/barryvdh/laravel-debugbar.git", + "reference": "56b9bd235e3fe62e250124804009ce5bab97cc63" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/56b9bd235e3fe62e250124804009ce5bab97cc63", + "reference": "56b9bd235e3fe62e250124804009ce5bab97cc63", + "shasum": "" + }, + "require": { + "illuminate/routing": "^9|^10|^11", + "illuminate/session": "^9|^10|^11", + "illuminate/support": "^9|^10|^11", + "maximebf/debugbar": "~1.23.0", + "php": "^8.0", + "symfony/finder": "^6|^7" + }, + "require-dev": { + "mockery/mockery": "^1.3.3", + "orchestra/testbench-dusk": "^5|^6|^7|^8|^9", + "phpunit/phpunit": "^9.6|^10.5", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "Debugbar": "Barryvdh\\Debugbar\\Facades\\Debugbar" + }, + "providers": [ + "Barryvdh\\Debugbar\\ServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "3.14-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Barryvdh\\Debugbar\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" + } + ], + "description": "PHP Debugbar integration for Laravel", + "keywords": [ + "debug", + "debugbar", + "laravel", + "profiler", + "webprofiler" + ], + "support": { + "issues": "https://github.com/barryvdh/laravel-debugbar/issues", + "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.14.10" + }, + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2024-12-23T10:10:42+00:00" + }, { "name": "fakerphp/faker", "version": "v1.24.1", @@ -8436,6 +8520,74 @@ }, "time": "2024-11-27T15:42:28+00:00" }, + { + "name": "maximebf/debugbar", + "version": "v1.23.5", + "source": { + "type": "git", + "url": "https://github.com/php-debugbar/php-debugbar.git", + "reference": "eeabd61a1f19ba5dcd5ac4585a477130ee03ce25" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-debugbar/php-debugbar/zipball/eeabd61a1f19ba5dcd5ac4585a477130ee03ce25", + "reference": "eeabd61a1f19ba5dcd5ac4585a477130ee03ce25", + "shasum": "" + }, + "require": { + "php": "^7.2|^8", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^4|^5|^6|^7" + }, + "require-dev": { + "dbrekelmans/bdi": "^1", + "phpunit/phpunit": "^8|^9", + "symfony/panther": "^1|^2.1", + "twig/twig": "^1.38|^2.7|^3.0" + }, + "suggest": { + "kriswallsmith/assetic": "The best way to manage assets", + "monolog/monolog": "Log using Monolog", + "predis/predis": "Redis storage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.23-dev" + } + }, + "autoload": { + "psr-4": { + "DebugBar\\": "src/DebugBar/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Maxime Bouroumeau-Fuseau", + "email": "maxime.bouroumeau@gmail.com", + "homepage": "http://maximebf.com" + }, + { + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" + } + ], + "description": "Debug bar in the browser for php application", + "homepage": "https://github.com/maximebf/php-debugbar", + "keywords": [ + "debug", + "debugbar" + ], + "support": { + "issues": "https://github.com/php-debugbar/php-debugbar/issues", + "source": "https://github.com/php-debugbar/php-debugbar/tree/v1.23.5" + }, + "time": "2024-12-15T19:20:42+00:00" + }, { "name": "mockery/mockery", "version": "1.6.12", diff --git a/resources/views/backend/pages/budget_control/index.blade.php b/resources/views/backend/pages/budget_control/index.blade.php index 051292c..b6ae48e 100644 --- a/resources/views/backend/pages/budget_control/index.blade.php +++ b/resources/views/backend/pages/budget_control/index.blade.php @@ -64,7 +64,7 @@ {{ $item->cabang->name }} {{ $item->sender->name }} {{ number_format($item->amount, 0, ',', '.') }} - {{ number_format(BudgetHelper::getAvailableBudget($item->cabang->id), 0, ',', '.') }} + {{ number_format($item->availableBudget, 0, ',', '.') }} {{ $item->remarks }} {{ strtoupper($item->periode_month) }} {{ $item->periode_year }} diff --git a/resources/views/backend/pages/report/generate_jurnal.blade.php b/resources/views/backend/pages/report/generate_jurnal.blade.php index 3ca55a3..79fbb9d 100644 --- a/resources/views/backend/pages/report/generate_jurnal.blade.php +++ b/resources/views/backend/pages/report/generate_jurnal.blade.php @@ -66,7 +66,7 @@ @endphp @foreach ($kategori as $item) @php - $drValue = FormHelper::getNominalByFormType($cabang->id, $item->name, $item->id, $month, $year); + $drValue = $nominals[$item->id] ?? 0; $drFormatted = $drValue == 0 ? '' : number_format($drValue, 0, ',', '.'); $totalDr += $drValue; @endphp @@ -79,6 +79,7 @@ @endforeach + {{ $kategori->count() + 1 }} Petty Cash diff --git a/storage/debugbar/.gitignore b/storage/debugbar/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/storage/debugbar/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore From f48b74589e3c0650d1e75c22578b43feabf67f1c Mon Sep 17 00:00:00 2001 From: Jagad R R Date: Wed, 15 Jan 2025 22:44:17 +0700 Subject: [PATCH 3/7] fix another more query --- app/Http/Controllers/Backend/AdminsController.php | 3 ++- app/Http/Controllers/Backend/AuditTrailController.php | 2 +- app/Http/Controllers/Master/CabangController.php | 2 +- app/Http/Controllers/Master/RegionController.php | 2 +- resources/views/backend/pages/admins/index.blade.php | 4 ++-- 5 files changed, 7 insertions(+), 6 deletions(-) diff --git a/app/Http/Controllers/Backend/AdminsController.php b/app/Http/Controllers/Backend/AdminsController.php index 2597580..f178c3d 100644 --- a/app/Http/Controllers/Backend/AdminsController.php +++ b/app/Http/Controllers/Backend/AdminsController.php @@ -35,8 +35,9 @@ class AdminsController extends Controller 'path' => url()->current() ]; + $admins = Admin::with(['region', 'cabang', 'roles'])->get(); return view('backend.pages.admins.index', [ - 'admins' => Admin::all(), + 'admins' => $admins, 'pageInfo' => $pageInfo, ]); } diff --git a/app/Http/Controllers/Backend/AuditTrailController.php b/app/Http/Controllers/Backend/AuditTrailController.php index 250ac5d..ad0b56f 100644 --- a/app/Http/Controllers/Backend/AuditTrailController.php +++ b/app/Http/Controllers/Backend/AuditTrailController.php @@ -23,7 +23,7 @@ class AuditTrailController extends Controller 'backend.pages.audit_trail.index', [ // sort by newest - 'data' => AuditTrail::orderBy('created_at', 'desc')->get(), + 'data' => AuditTrail::with('user')->orderBy('created_at', 'desc')->get(), 'pageInfo' => $pageInfo, ] ); diff --git a/app/Http/Controllers/Master/CabangController.php b/app/Http/Controllers/Master/CabangController.php index 0d60cb8..09b4fe7 100644 --- a/app/Http/Controllers/Master/CabangController.php +++ b/app/Http/Controllers/Master/CabangController.php @@ -18,7 +18,7 @@ class CabangController extends Controller session()->put('redirect_url', route('admin.cabang.index')); return view('backend.pages.master.cabang.index', [ - 'cabang' => Cabang::all() + 'cabang' => Cabang::with(['head', 'region', 'cost'])->get() ]); } diff --git a/app/Http/Controllers/Master/RegionController.php b/app/Http/Controllers/Master/RegionController.php index b1575c9..3e5b00e 100644 --- a/app/Http/Controllers/Master/RegionController.php +++ b/app/Http/Controllers/Master/RegionController.php @@ -16,7 +16,7 @@ class RegionController extends Controller session()->put('redirect_url', route('admin.region.index')); return view('backend.pages.master.region.index', [ - 'region' => Region::all() + 'region' => Region::with('head')->get() ]); } diff --git a/resources/views/backend/pages/admins/index.blade.php b/resources/views/backend/pages/admins/index.blade.php index 8856907..ed65bf2 100644 --- a/resources/views/backend/pages/admins/index.blade.php +++ b/resources/views/backend/pages/admins/index.blade.php @@ -66,8 +66,8 @@ @endforeach - {{ $admin->getMyCabangAndRegion()['region'] }} - {{ $admin->getMyCabangAndRegion()['cabang'] }} + {{ $admin->region->cabang->region->name ?? '' }} + {{ $admin->cabang->cabang->name ?? '' }} View Expense @if (auth()->user()->can('admin.edit')) From 45dd0a67b61e66de74e1d3f06af2ac7e0439cefb Mon Sep 17 00:00:00 2001 From: Jagad R R Date: Thu, 16 Jan 2025 15:56:22 +0700 Subject: [PATCH 4/7] revised approval system (all forms) --- .env | 2 +- app/Helpers/WhatsappHelper.php | 110 +++++- ...ormEntertainmentPresentationController.php | 155 +++++--- .../Forms/FormMeetingSeminarController.php | 228 ++++++----- .../Controllers/Forms/FormOtherController.php | 144 ++++--- .../Forms/FormUpCountryController.php | 206 ++++++---- .../Forms/FormVehicleController.php | 145 ++++--- app/Mail/ExpenseApproved.php | 2 +- app/Mail/ExpenseApproved2.php | 63 +++ app/Mail/FinalApprove.php | 2 +- app/Models/FormEntertaimentPresentation.php | 2 + app/Models/FormMeetingSeminar.php | 2 + app/Models/FormOthers.php | 2 + app/Models/FormUpCountry.php | 2 + app/Models/FormVehicleRunningCost.php | 2 + ...6_045615_add_approval2_form_up_country.php | 31 ++ ...dd_approval2_form_vehicle_running_cost.php | 31 ++ ...roval2_form_entertainment_presentation.php | 31 ++ ...210_add_approval2_form_meeting_seminar.php | 31 ++ ...01_16_050246_add_approval2_form_others.php | 31 ++ database/seeds/DatabaseSeeder.php | 6 +- database/seeds/RolePermissionSeeder8.php | 90 +++++ database/seeds/RolePermissionSeeder9.php | 88 +++++ .../pages/forms/entertainment/index.blade.php | 222 +++++++++-- .../pages/forms/meeting/index.blade.php | 210 ++++++++-- .../backend/pages/forms/other/index.blade.php | 205 ++++++++-- .../pages/forms/upcountry/index.blade.php | 226 +++++++++-- .../pages/forms/vehicle/index.blade.php | 218 +++++++++-- resources/views/mail/approved.blade.php | 4 +- resources/views/mail/approved2.blade.php | 361 ++++++++++++++++++ resources/views/mail/closed.blade.php | 4 +- routes/web.php | 5 + 32 files changed, 2360 insertions(+), 501 deletions(-) create mode 100644 app/Mail/ExpenseApproved2.php create mode 100644 database/migrations/2025_01_16_045615_add_approval2_form_up_country.php create mode 100644 database/migrations/2025_01_16_050053_add_approval2_form_vehicle_running_cost.php create mode 100644 database/migrations/2025_01_16_050129_add_approval2_form_entertainment_presentation.php create mode 100644 database/migrations/2025_01_16_050210_add_approval2_form_meeting_seminar.php create mode 100644 database/migrations/2025_01_16_050246_add_approval2_form_others.php create mode 100644 database/seeds/RolePermissionSeeder8.php create mode 100644 database/seeds/RolePermissionSeeder9.php create mode 100644 resources/views/mail/approved2.blade.php diff --git a/.env b/.env index d8b1fc5..53002f4 100644 --- a/.env +++ b/.env @@ -74,7 +74,7 @@ NEXT_CLOUD_PASSWORD=userdev12345 NEXT_CLOUD_PATHPREFIX="" WABLAS_HOST=https://bdg.wablas.com -WABLAS_TOKEN=5iCaiP0nEgfl3lzrdsZGb9TvNYuwFZF8s4rp8AYwCx5OrYeiKXgixFMo9nDWNrJN.IF98hujz +WABLAS_TOKEN=5iCaiP0nEgfl3lzrdsZGb9TvNYuwFZF8s4rp8AYwCx5OrYeiKXgixFMo9nDWNrJN.xvAwySaa STARTING_DATE='12' CLOSING_DATE='20' diff --git a/app/Helpers/WhatsappHelper.php b/app/Helpers/WhatsappHelper.php index 54239fa..9abe0a9 100644 --- a/app/Helpers/WhatsappHelper.php +++ b/app/Helpers/WhatsappHelper.php @@ -8,7 +8,7 @@ use Illuminate\Support\Str; class WhatsappHelper { - public static function approveExpense($phones, $expense_number, $url = null) + public static function approveExpense($phones, $expense_number, $url = null, $tanggal, $total, $name) { $client = new Client(); @@ -17,15 +17,27 @@ class WhatsappHelper $url = 'https://' . $url; } + // Format the message like the email example using Markdown for WhatsApp + $message = " + Halo *{$name}*, + Pengajuan Expense Anda telah di periksa & disetujui oleh *Admin Region Anda*: + *Expense Number:* {$expense_number} + *Expense Date:* " . \Carbon\Carbon::parse($tanggal)->locale('id')->isoFormat('D MMMM Y') . " + *Total:* Rp " . number_format($total, 0, ',', '.') . " + Silahkan buka link berikut untuk melihat detail expense Anda: {$url} + Terima kasih."; + + // Prepare the message for each phone number $data = []; foreach ($phones as $phone) { $data[] = [ 'phone' => $phone, - 'message' => 'Pengajuan pengeluaran anda dengan nomor *' . $expense_number . '* telah disetujui. Silahkan buka link berikut untuk melihat detailnya: ' . $url, + 'message' => $message, 'source' => 'web' ]; } + // Send the request to the WABLAS API $response = $client->post(env('WABLAS_HOST') . '/api/v2/send-message', [ 'headers' => [ 'Authorization' => env('WABLAS_TOKEN'), @@ -39,23 +51,36 @@ class WhatsappHelper return $response->getBody()->getContents(); } - public static function rejectExpense($phones, $expense_number, $url = null) + public static function approve2Expense($phones, $expense_number, $url = null, $tanggal, $total, $name) { $client = new Client(); + // Ensure the URL is formatted correctly if ($url && !preg_match('/^https?:\/\//', $url)) { $url = 'https://' . $url; } + // Format the message like the email example using Markdown for WhatsApp + $message = " + Halo *{$name}*, + Pengajuan Expense Anda telah di periksa & disetujui oleh *Area Manager Anda*: + *Expense Number:* {$expense_number} + *Expense Date:* " . \Carbon\Carbon::parse($tanggal)->locale('id')->isoFormat('D MMMM Y') . " + *Total:* Rp " . number_format($total, 0, ',', '.') . " + Silahkan buka link berikut untuk melihat detail expense Anda: {$url} + Terima kasih."; + + // Prepare the message for each phone number $data = []; foreach ($phones as $phone) { $data[] = [ 'phone' => $phone, - 'message' => 'Pengajuan pengeluaran anda dengan nomor *' . $expense_number . '* telah ditolak. Silahkan buka link berikut untuk melihat detailnya: ' . $url, + 'message' => $message, 'source' => 'web' ]; } + // Send the request to the WABLAS API $response = $client->post(env('WABLAS_HOST') . '/api/v2/send-message', [ 'headers' => [ 'Authorization' => env('WABLAS_TOKEN'), @@ -69,23 +94,36 @@ class WhatsappHelper return $response->getBody()->getContents(); } - public static function finalApprove($phones, $expense_number, $url = null) + public static function rejectExpense($phones, $expense_number, $url = null, $tanggal, $total, $name) { $client = new Client(); + // Ensure the URL is formatted correctly if ($url && !preg_match('/^https?:\/\//', $url)) { $url = 'https://' . $url; } + // Format the message like the email example using Markdown for WhatsApp + $message = " + Halo *{$name}*, + Pengajuan pengeluaran baru dengan detail berikut telah ditolak: + *Expense Number:* {$expense_number} + *Expense Date:* " . \Carbon\Carbon::parse($tanggal)->locale('id')->isoFormat('D MMMM Y') . " + *Total:* Rp " . number_format($total, 0, ',', '.') . " + Silahkan buka link berikut untuk melihat detail expense Anda: {$url} + Terima kasih."; + + // Prepare the message for each phone number $data = []; foreach ($phones as $phone) { $data[] = [ 'phone' => $phone, - 'message' => 'Pengajuan pengeluaran anda dengan nomor *' . $expense_number . '* telah ditutup karena telah selesai diproses. Silahkan buka link berikut untuk melihat detailnya: ' . $url, + 'message' => $message, 'source' => 'web' ]; } + // Send the request to the WABLAS API $response = $client->post(env('WABLAS_HOST') . '/api/v2/send-message', [ 'headers' => [ 'Authorization' => env('WABLAS_TOKEN'), @@ -99,23 +137,79 @@ class WhatsappHelper return $response->getBody()->getContents(); } - public static function newExpense($phones, $expense_number, $url = null) + public static function finalApprove($phones, $expense_number, $url = null, $tanggal, $total, $name) { $client = new Client(); + // Ensure the URL is formatted correctly if ($url && !preg_match('/^https?:\/\//', $url)) { $url = 'https://' . $url; } + // Format the message like the email example using Markdown for WhatsApp + $message = " + Halo *{$name}*, + Pengajuan Expense Anda telah di setujui *( FINAL APPROVE )* oleh *MOM Region / HOSM* anda: + *Expense Number:* {$expense_number} + *Expense Date:* " . \Carbon\Carbon::parse($tanggal)->locale('id')->isoFormat('D MMMM Y') . " + *Total:* Rp " . number_format($total, 0, ',', '.') . " + Silahkan buka link berikut untuk melihat detail expense Anda: {$url} + Terima kasih."; + + // Prepare the message for each phone number $data = []; foreach ($phones as $phone) { $data[] = [ 'phone' => $phone, - 'message' => 'Pengajuan pengeluaran baru dengan nomor *' . $expense_number . '* telah dibuat. Silahkan buka link berikut untuk melihat detailnya: ' . $url, + 'message' => $message, 'source' => 'web' ]; } + // Send the request to the WABLAS API + $response = $client->post(env('WABLAS_HOST') . '/api/v2/send-message', [ + 'headers' => [ + 'Authorization' => env('WABLAS_TOKEN'), + 'Content-Type' => 'application/json' + ], + 'json' => [ + 'data' => $data + ] + ]); + + return $response->getBody()->getContents(); + } + + public static function newExpense($phones, $expense_number, $url = null, $tanggal, $total, $name) + { + $client = new Client(); + + // Ensure the URL is formatted correctly + if ($url && !preg_match('/^https?:\/\//', $url)) { + $url = 'https://' . $url; + } + + // Format the message like the email example using Markdown for WhatsApp + $message = " + Halo *{$name}*, + Pengajuan pengeluaran baru dengan detail berikut telah dibuat: + *Expense Number:* {$expense_number} + *Expense Date:* " . \Carbon\Carbon::parse($tanggal)->locale('id')->isoFormat('D MMMM Y') . " + *Total:* Rp " . number_format($total, 0, ',', '.') . " + Silahkan buka link berikut untuk melihat detail expense Anda: {$url} + Terima kasih."; + + // Prepare the message for each phone number + $data = []; + foreach ($phones as $phone) { + $data[] = [ + 'phone' => $phone, + 'message' => $message, + 'source' => 'web' + ]; + } + + // Send the request to the WABLAS API $response = $client->post(env('WABLAS_HOST') . '/api/v2/send-message', [ 'headers' => [ 'Authorization' => env('WABLAS_TOKEN'), diff --git a/app/Http/Controllers/Forms/FormEntertainmentPresentationController.php b/app/Http/Controllers/Forms/FormEntertainmentPresentationController.php index 3ab5a75..47f6782 100644 --- a/app/Http/Controllers/Forms/FormEntertainmentPresentationController.php +++ b/app/Http/Controllers/Forms/FormEntertainmentPresentationController.php @@ -16,6 +16,7 @@ use App\Helpers\NextCloudHelper; use Illuminate\Support\Str; use Illuminate\Support\Facades\Mail; use App\Mail\ExpenseApproved; +use App\Mail\ExpenseApproved2; use App\Mail\ExpenseRejected; use App\Mail\FinalApprove; use App\Mail\ExpenseCreated; @@ -127,7 +128,7 @@ class FormEntertainmentPresentationController extends Controller $cabang = UserHasCabang::with('cabang')->where('user_id', auth()->user()->id)->first()->cabang; $region = Region::where('id', $cabang->region_id)->first(); - $kategori = Kategori::where('name', 'Entertainment & Presentation')->first(); + $kategori = Kategori::where('name', 'Entertainment')->first(); $filePaths = []; $folderPath = '/expense/' . $region->code . '/' . $cabang->code . '/entertainment'; @@ -189,7 +190,7 @@ class FormEntertainmentPresentationController extends Controller // Generate URL and send WhatsApp notification $url = route('forms.entertainment.view', $form->id); - WhatsappHelper::newExpense($phoneNumbers, $expense_number, $url); + WhatsappHelper::newExpense($phoneNumbers, $expense_number, $url, $tanggal, $total, $name); // Send bulk email Mail::to($recipients)->send(new ExpenseCreated( @@ -246,7 +247,7 @@ class FormEntertainmentPresentationController extends Controller $cabang = UserHasCabang::with('cabang')->where('user_id', $form->user_id)->first()->cabang; $region = Region::where('id', $cabang->region_id)->first(); - $kategori = Kategori::where('name', 'Entertainment & Presentation')->first(); + $kategori = Kategori::where('name', 'Entertainment')->first(); $filePaths = []; $folderPath = '/expense/' . $region->code . '/' . $cabang->code . '/entertainment'; @@ -282,33 +283,22 @@ class FormEntertainmentPresentationController extends Controller return redirect()->back(); } - public function approve(Request $request, $id) + public function approve($id) { $this->checkAuthorization(auth()->user(), ['approval.approve']); - $request->validate([ - 'total' => 'required', - ]); $form = FormEntertaimentPresentation::findOrfail($id); - $cabang_id = UserHasCabang::where('user_id', $form->user_id)->first()->cabang_id; - if($form->total > BudgetHelper::getAvailableBudget($cabang_id)) { - session()->flash('error', 'The total nominal exceeds the available budget.'); - return redirect()->back(); - } - $form->update([ 'approved_at' => now(), 'approved_by' => auth()->user()->id, - 'status' => 'Approved', - - 'approved_total' => $form->total, + 'status' => 'Approved 1', ]); $heads = $form->user->getCabangAndRegionHead(); $name = $form->user->name; $expense_number = $form->expense_number; - $tanggal = $form->tanggal; - $total = $form->approved_total; + $tanggal = $form->created_at; + $total = $form->total; // Collect all recipients $recipients = [$form->user->email, auth()->user()->email]; @@ -324,15 +314,15 @@ class FormEntertainmentPresentationController extends Controller $phoneNumbers[] = $heads['region_head']['phone']; } - // Remove duplicate email addresses, if any + // Remove duplicate data, if any $recipients = array_unique($recipients); $phoneNumbers = array_unique($phoneNumbers); - // Send bulk whatsapp - $url = route('forms.entertainment.view', $form->id); - WhatsappHelper::approveExpense($phoneNumbers, $expense_number, $url); + // send whatsapp message + $url = route('forms.entertainment.view', $form->id); + WhatsappHelper::approveExpense($phoneNumbers, $expense_number, $url, $tanggal, $total, $name); - // Send bulk email + // // Send bulk email Mail::to($recipients)->send(new ExpenseApproved( $name, $expense_number, @@ -341,31 +331,92 @@ class FormEntertainmentPresentationController extends Controller $url )); - AuditTrailHelper::AddAuditTrail('Approve', 'Approved Expense at Form Entertainment Presentation (' . $expense_number . ')'); + AuditTrailHelper::AddAuditTrail('Approve', 'Approve Expense at Form Entertainment (' . $form->expense_number . ')'); session()->flash('success', 'Form has been approved.'); return redirect()->back(); } - public function finalApprove($id) + public function approve2($id) + { + $this->checkAuthorization(auth()->user(), ['approval2.approve']); + + $form = FormEntertaimentPresentation::findOrfail($id); + $form->update([ + 'approved2_at' => now(), + 'approved2_by' => auth()->user()->id, + 'status' => 'Approved 2', + ]); + + $heads = $form->user->getCabangAndRegionHead(); + $name = $form->user->name; + $expense_number = $form->expense_number; + $tanggal = $form->created_at; + $total = $form->total; + + // Collect all recipients + $recipients = [$form->user->email, auth()->user()->email]; + $phoneNumbers = [$form->user->phone, auth()->user()->phone]; + + if ($heads['cabang_head']) { + $recipients[] = $heads['cabang_head']['email']; + $phoneNumbers[] = $heads['cabang_head']['phone']; + } + + if ($heads['region_head']) { + $recipients[] = $heads['region_head']['email']; + $phoneNumbers[] = $heads['region_head']['phone']; + } + + // Remove duplicate data, if any + $recipients = array_unique($recipients); + $phoneNumbers = array_unique($phoneNumbers); + + // send whatsapp message + $url = route('forms.entertainment.view', $form->id); + WhatsappHelper::approve2Expense($phoneNumbers, $expense_number, $url, $tanggal, $total, $name); + + // // Send bulk email + Mail::to($recipients)->send(new ExpenseApproved2( + $name, + $expense_number, + $tanggal, + $total, + $url + )); + + AuditTrailHelper::AddAuditTrail('Approve', 'Approve Expense at Form Entertainment (' . $form->expense_number . ')'); + session()->flash('success', 'Form has been approved.'); + return redirect()->back(); + } + + public function finalApprove(Request $request, $id) { $this->checkAuthorization(auth()->user(), ['final_approval.approve']); $form = FormEntertaimentPresentation::findOrfail($id); - if($form->approved_at == null) { - session()->flash('error', 'Form must be approved by MIS first.'); + if($form->approved_at == null || $form->approved2_at == null) { + session()->flash('error', 'Form must be approved by both approvers before final approval.'); + return redirect()->back(); + } + + // Check if the total nominal exceeds the available budget + $cabang_id = UserHasCabang::where('user_id', $form->user_id)->first()->cabang_id; + if($form->total > BudgetHelper::getAvailableBudget($cabang_id)) { + session()->flash('error', 'The total nominal exceeds the available budget.'); return redirect()->back(); } $form->update([ 'final_approved_at' => now(), 'final_approved_by' => auth()->user()->id, - 'status' => 'Closed' + 'status' => 'Closed', + 'approved_total' => $form->total, ]); $heads = $form->user->getCabangAndRegionHead(); $name = $form->user->name; $expense_number = $form->expense_number; - $tanggal = $form->tanggal; + $tanggal = $form->created_at; $total = $form->approved_total; // Collect all recipients @@ -388,7 +439,7 @@ class FormEntertainmentPresentationController extends Controller // send whatsapp message $url = route('forms.entertainment.view', $form->id); - WhatsappHelper::approveExpense($phoneNumbers, $expense_number, $url); + WhatsappHelper::finalApprove($phoneNumbers, $expense_number, $url, $tanggal, $total, $name); // Send bulk email Mail::to($recipients)->send(new FinalApprove( @@ -399,30 +450,14 @@ class FormEntertainmentPresentationController extends Controller $url )); - AuditTrailHelper::AddAuditTrail('Final Approve', 'Final Approved Expense at Form Entertainment Presentation (' . $expense_number . ')'); + AuditTrailHelper::AddAuditTrail('Final Approve', 'Final Approve Expense at Form Entertainment (' . $form->expense_number . ')'); session()->flash('success', 'Form has been final approved.'); return redirect()->back(); } - public function open($id) - { - $this->checkAuthorization(auth()->user(), ['final_approval.open']); - - $form = FormEntertaimentPresentation::findOrfail($id); - $form->update([ - 'final_approved_at' => null, - 'final_approved_by' => null, - 'status' => 'Approved' - ]); - - AuditTrailHelper::AddAuditTrail('Open', 'Open Expense at Form Entertainment Presentation (' . $form->expense_number . ')'); - session()->flash('success', 'Form has been opened.'); - return redirect()->back(); - } - public function reject($id) { - $this->checkAuthorization(auth()->user(), ['approval.approve']); + $this->checkAuthorization(auth()->user(), ['approval.reject']); $form = FormEntertaimentPresentation::findOrfail($id); $form->update([ @@ -432,7 +467,7 @@ class FormEntertainmentPresentationController extends Controller $heads = $form->user->getCabangAndRegionHead(); $name = $form->user->name; $expense_number = $form->expense_number; - $tanggal = $form->tanggal; + $tanggal = $form->created_at; $total = $form->total; // Collect all recipients @@ -453,9 +488,9 @@ class FormEntertainmentPresentationController extends Controller $recipients = array_unique($recipients); $phoneNumbers = array_unique($phoneNumbers); - // Send bulk whatsapp + // send whatsapp message $url = route('forms.entertainment.view', $form->id); - WhatsappHelper::approveExpense($phoneNumbers, $expense_number, $url); + WhatsappHelper::rejectExpense($phoneNumbers, $expense_number, $url, $tanggal, $total, $name); // Send bulk email Mail::to($recipients)->send(new ExpenseRejected( @@ -466,11 +501,27 @@ class FormEntertainmentPresentationController extends Controller $url )); - AuditTrailHelper::AddAuditTrail('Reject', 'Reject Expense at Form Entertainment Presentation (' . $expense_number . ')'); + AuditTrailHelper::AddAuditTrail('Reject', 'Reject Expense at Form Entertainment (' . $form->expense_number . ')'); session()->flash('success', 'Form has been rejected.'); return redirect()->back(); } + public function open($id) + { + $this->checkAuthorization(auth()->user(), ['final_approval.open']); + + $form = FormEntertaimentPresentation::findOrfail($id); + $form->update([ + 'final_approved_at' => null, + 'final_approved_by' => null, + 'status' => 'Approved' + ]); + + AuditTrailHelper::AddAuditTrail('Open', 'Open Expense at Form Entertainment Presentation (' . $form->expense_number . ')'); + session()->flash('success', 'Form has been opened.'); + return redirect()->back(); + } + public function destroy($id) { $this->checkAuthorization(auth()->user(), ['forms.entertainment.delete']); diff --git a/app/Http/Controllers/Forms/FormMeetingSeminarController.php b/app/Http/Controllers/Forms/FormMeetingSeminarController.php index 621f2f3..d364876 100644 --- a/app/Http/Controllers/Forms/FormMeetingSeminarController.php +++ b/app/Http/Controllers/Forms/FormMeetingSeminarController.php @@ -16,6 +16,7 @@ use App\Helpers\NextCloudHelper; use Illuminate\Support\Str; use Illuminate\Support\Facades\Mail; use App\Mail\ExpenseApproved; +use App\Mail\ExpenseApproved2; use App\Mail\ExpenseRejected; use App\Mail\ExpenseCreated; use App\Mail\FinalApprove; @@ -82,7 +83,7 @@ class FormMeetingSeminarController extends Controller public function detail($id) { - $this->checkAuthorization(auth()->user(), ['forms.country.view']); + $this->checkAuthorization(auth()->user(), ['forms.meeting.view']); $form = FormMeetingSeminar::with('user')->findOrFail($id); $form->bukti_allowance = $form->bukti_allowance ? NextCloudHelper::getFileUrl($form->bukti_allowance) : null; @@ -94,7 +95,7 @@ class FormMeetingSeminarController extends Controller public function view($id) { - $this->checkAuthorization(auth()->user(), ['forms.country.view']); + $this->checkAuthorization(auth()->user(), ['forms.meeting.view']); $form = FormMeetingSeminar::with('user')->findOrFail($id); $form->bukti_allowance = $form->bukti_allowance ? NextCloudHelper::getFileUrl($form->bukti_allowance) : null; @@ -128,7 +129,7 @@ class FormMeetingSeminarController extends Controller $cabang = UserHasCabang::with('cabang')->where('user_id', auth()->user()->id)->first()->cabang; $region = Region::where('id', $cabang->region_id)->first(); - $kategori = Kategori::where('name', 'Meeting & Seminar')->first(); + $kategori = Kategori::where('name', 'Meeting / Seminar')->first(); $filePaths = []; $folderPath = '/expense/' . $region->code . '/' . $cabang->code . '/meeting'; @@ -227,7 +228,7 @@ class FormMeetingSeminarController extends Controller // Generate URL and send WhatsApp notification $url = route('forms.meeting.view', $form->id); - WhatsappHelper::newExpense($phoneNumbers, $expense_number, $url); + WhatsappHelper::newExpense($phoneNumbers, $expense_number, $url, $tanggal, $total, $name); // Send bulk email Mail::to($recipients)->send(new ExpenseCreated( @@ -281,7 +282,7 @@ class FormMeetingSeminarController extends Controller $cabang = UserHasCabang::with('cabang')->where('user_id', $form->user_id)->first()->cabang; $region = Region::where('id', $cabang->region_id)->first(); - $kategori = Kategori::where('name', 'Meeting & Seminar')->first(); + $kategori = Kategori::where('name', 'Meeting / Seminar')->first(); $filePaths = []; $folderPath = '/expense/' . $region->code . '/' . $cabang->code . '/meeting'; @@ -354,11 +355,122 @@ class FormMeetingSeminarController extends Controller return redirect()->back(); } - public function approve(Request $request, $id) + public function approve($id) { $this->checkAuthorization(auth()->user(), ['approval.approve']); $form = FormMeetingSeminar::findOrfail($id); + $form->update([ + 'approved_at' => now(), + 'approved_by' => auth()->user()->id, + 'status' => 'Approved 1', + ]); + + $heads = $form->user->getCabangAndRegionHead(); + $name = $form->user->name; + $expense_number = $form->expense_number; + $tanggal = $form->created_at; + $total = $form->total; + + // Collect all recipients + $recipients = [$form->user->email, auth()->user()->email]; + $phoneNumbers = [$form->user->phone, auth()->user()->phone]; + + if ($heads['cabang_head']) { + $recipients[] = $heads['cabang_head']['email']; + $phoneNumbers[] = $heads['cabang_head']['phone']; + } + + if ($heads['region_head']) { + $recipients[] = $heads['region_head']['email']; + $phoneNumbers[] = $heads['region_head']['phone']; + } + + // Remove duplicate data, if any + $recipients = array_unique($recipients); + $phoneNumbers = array_unique($phoneNumbers); + + // send whatsapp message + $url = route('forms.meeting.view', $form->id); + WhatsappHelper::approveExpense($phoneNumbers, $expense_number, $url, $tanggal, $total, $name); + + // // Send bulk email + Mail::to($recipients)->send(new ExpenseApproved( + $name, + $expense_number, + $tanggal, + $total, + $url + )); + + AuditTrailHelper::AddAuditTrail('Approve', 'Approve Expense at Form Meeting Seminar (' . $form->expense_number . ')'); + session()->flash('success', 'Form has been approved.'); + return redirect()->back(); + } + + public function approve2($id) + { + $this->checkAuthorization(auth()->user(), ['approval2.approve']); + + $form = FormMeetingSeminar::findOrfail($id); + $form->update([ + 'approved2_at' => now(), + 'approved2_by' => auth()->user()->id, + 'status' => 'Approved 2', + ]); + + $heads = $form->user->getCabangAndRegionHead(); + $name = $form->user->name; + $expense_number = $form->expense_number; + $tanggal = $form->created_at; + $total = $form->total; + + // Collect all recipients + $recipients = [$form->user->email, auth()->user()->email]; + $phoneNumbers = [$form->user->phone, auth()->user()->phone]; + + if ($heads['cabang_head']) { + $recipients[] = $heads['cabang_head']['email']; + $phoneNumbers[] = $heads['cabang_head']['phone']; + } + + if ($heads['region_head']) { + $recipients[] = $heads['region_head']['email']; + $phoneNumbers[] = $heads['region_head']['phone']; + } + + // Remove duplicate data, if any + $recipients = array_unique($recipients); + $phoneNumbers = array_unique($phoneNumbers); + + // send whatsapp message + $url = route('forms.meeting.view', $form->id); + WhatsappHelper::approve2Expense($phoneNumbers, $expense_number, $url, $tanggal, $total, $name); + + // // Send bulk email + Mail::to($recipients)->send(new ExpenseApproved2( + $name, + $expense_number, + $tanggal, + $total, + $url + )); + + AuditTrailHelper::AddAuditTrail('Approve', 'Approve Expense at Form Meeting Seminar (' . $form->expense_number . ')'); + session()->flash('success', 'Form has been approved.'); + return redirect()->back(); + } + + public function finalApprove(Request $request, $id) + { + $this->checkAuthorization(auth()->user(), ['final_approval.approve']); + + $form = FormMeetingSeminar::findOrfail($id); + if($form->approved_at == null || $form->approved2_at == null) { + session()->flash('error', 'Form must be approved by both approvers before final approval.'); + return redirect()->back(); + } + $approved_data = [ 'allowance' => $request->allowance ? $form->allowance : 0, 'transport_ankot' => $request->transport_ankot ? $form->transport_ankot : 0, @@ -373,9 +485,9 @@ class FormMeetingSeminarController extends Controller } $form->update([ - 'approved_at' => now(), - 'approved_by' => auth()->user()->id, - 'status' => 'Approved', + 'final_approved_at' => now(), + 'final_approved_by' => auth()->user()->id, + 'status' => 'Closed', 'approved_allowance' => $approved_data['allowance'], 'approved_transport_ankot' => $approved_data['transport_ankot'], 'approved_hotel' => $approved_data['hotel'], @@ -406,67 +518,9 @@ class FormMeetingSeminarController extends Controller $recipients = array_unique($recipients); $phoneNumbers = array_unique($phoneNumbers); - // Send bulk WhatsApp message - $url = route('forms.meeting.view', $form->id); - WhatsappHelper::approveExpense($phoneNumbers, $expense_number, $url); - - // Send bulk email - Mail::to($recipients)->send(new ExpenseApproved( - $name, - $expense_number, - $tanggal, - $total, - $url - )); - - AuditTrailHelper::AddAuditTrail('Approve', 'Approve Expense at Form Meeting Seminar (' . $form->expense_number . ')'); - session()->flash('success', 'Form has been approved.'); - return redirect()->back(); - } - - public function finalApprove($id) - { - $this->checkAuthorization(auth()->user(), ['final_approval.approve']); - - $form = FormMeetingSeminar::findOrfail($id); - if($form->approved_at == null) { - session()->flash('error', 'Form must be approved by MIS first.'); - return redirect()->back(); - } - - $form->update([ - 'final_approved_at' => now(), - 'final_approved_by' => auth()->user()->id, - 'status' => 'Closed' - ]); - - $heads = $form->user->getCabangAndRegionHead(); - $name = $form->user->name; - $expense_number = $form->expense_number; - $tanggal = $form->created_at; - $total = $form->approved_total; - - // Collect all recipients - $recipients = [$form->user->email, auth()->user()->email]; - $phoneNumbers = [$form->user->phone, auth()->user()->phone]; - - if ($heads['cabang_head']) { - $recipients[] = $heads['cabang_head']['email']; - $phoneNumbers[] = $heads['cabang_head']['phone']; - } - - if ($heads['region_head']) { - $recipients[] = $heads['region_head']['email']; - $phoneNumbers[] = $heads['region_head']['phone']; - } - - // Remove duplicate email addresses, if any - $recipients = array_unique($recipients); - $phoneNumbers = array_unique($phoneNumbers); - // send whatsapp message $url = route('forms.meeting.view', $form->id); - WhatsappHelper::finalApprove($phoneNumbers, $expense_number, $url); + WhatsappHelper::finalApprove($phoneNumbers, $expense_number, $url, $tanggal, $total, $name); // Send bulk email Mail::to($recipients)->send(new FinalApprove( @@ -482,25 +536,9 @@ class FormMeetingSeminarController extends Controller return redirect()->back(); } - public function open($id) - { - $this->checkAuthorization(auth()->user(), ['final_approval.open']); - - $form = FormMeetingSeminar::findOrfail($id); - $form->update([ - 'final_approved_at' => null, - 'final_approved_by' => null, - 'status' => 'Approved' - ]); - - AuditTrailHelper::AddAuditTrail('Open', 'Open Expense at Form Meeting Seminar (' . $form->expense_number . ')'); - session()->flash('success', 'Form has been opened.'); - return redirect()->back(); - } - public function reject($id) { - $this->checkAuthorization(auth()->user(), ['approval.approve']); + $this->checkAuthorization(auth()->user(), ['approval.reject']); $form = FormMeetingSeminar::findOrfail($id); $form->update([ @@ -531,9 +569,9 @@ class FormMeetingSeminarController extends Controller $recipients = array_unique($recipients); $phoneNumbers = array_unique($phoneNumbers); - // Send bulk WhatsApp message + // send whatsapp message $url = route('forms.meeting.view', $form->id); - WhatsappHelper::rejectExpense($phoneNumbers, $expense_number, $url); + WhatsappHelper::rejectExpense($phoneNumbers, $expense_number, $url, $tanggal, $total, $name); // Send bulk email Mail::to($recipients)->send(new ExpenseRejected( @@ -549,6 +587,22 @@ class FormMeetingSeminarController extends Controller return redirect()->back(); } + public function open($id) + { + $this->checkAuthorization(auth()->user(), ['final_approval.open']); + + $form = FormMeetingSeminar::findOrfail($id); + $form->update([ + 'final_approved_at' => null, + 'final_approved_by' => null, + 'status' => 'Approved' + ]); + + AuditTrailHelper::AddAuditTrail('Open', 'Open Expense at Form Meeting Seminar (' . $form->expense_number . ')'); + session()->flash('success', 'Form has been opened.'); + return redirect()->back(); + } + public function destroy($id) { $this->checkAuthorization(auth()->user(), ['forms.meeting.delete']); diff --git a/app/Http/Controllers/Forms/FormOtherController.php b/app/Http/Controllers/Forms/FormOtherController.php index 638d208..6bdd4c9 100644 --- a/app/Http/Controllers/Forms/FormOtherController.php +++ b/app/Http/Controllers/Forms/FormOtherController.php @@ -16,6 +16,7 @@ use Illuminate\Support\Str; use App\Helpers\NextCloudHelper; use Illuminate\Support\Facades\Mail; use App\Mail\ExpenseApproved; +use App\Mail\ExpenseApproved2; use App\Mail\ExpenseRejected; use App\Mail\FinalApprove; use App\Mail\ExpenseCreated; @@ -187,7 +188,7 @@ class FormOtherController extends Controller // Generate URL and send WhatsApp notification $url = route('forms.other.view', $form->id); - WhatsappHelper::newExpense($phoneNumbers, $expense_number, $url); + WhatsappHelper::newExpense($phoneNumbers, $expense_number, $url, $tanggal, $total, $name); // Send bulk email Mail::to($recipients)->send(new ExpenseCreated( @@ -275,34 +276,22 @@ class FormOtherController extends Controller return redirect()->back(); } - public function approve(Request $request, $id) + public function approve($id) { $this->checkAuthorization(auth()->user(), ['approval.approve']); - $request->validate([ - 'total' => 'required', - ]); - $form = FormOthers::findOrfail($id); - $cabang_id = UserHasCabang::where('user_id', $form->user_id)->first()->cabang_id; - if($form->total > BudgetHelper::getAvailableBudget($cabang_id)) { - session()->flash('error', 'The total nominal exceeds the available budget.'); - return redirect()->back(); - } - $form->update([ 'approved_at' => now(), 'approved_by' => auth()->user()->id, - 'status' => 'Approved', - - 'approved_total' => $form->total, + 'status' => 'Approved 1', ]); $heads = $form->user->getCabangAndRegionHead(); $name = $form->user->name; $expense_number = $form->expense_number; - $tanggal = $form->tanggal; - $total = $form->approved_total; + $tanggal = $form->created_at; + $total = $form->total; // Collect all recipients $recipients = [$form->user->email, auth()->user()->email]; @@ -318,15 +307,15 @@ class FormOtherController extends Controller $phoneNumbers[] = $heads['region_head']['phone']; } - // Remove duplicate email addresses, if any + // Remove duplicate data, if any $recipients = array_unique($recipients); $phoneNumbers = array_unique($phoneNumbers); - // Send bulk WhatsApp message + // send whatsapp message $url = route('forms.other.view', $form->id); - WhatsappHelper::approveExpense($phoneNumbers, $expense_number, $url); + WhatsappHelper::approveExpense($phoneNumbers, $expense_number, $url, $tanggal, $total, $name); - // Send bulk email + // // Send bulk email Mail::to($recipients)->send(new ExpenseApproved( $name, $expense_number, @@ -340,26 +329,87 @@ class FormOtherController extends Controller return redirect()->back(); } - public function finalApprove($id) + public function approve2($id) + { + $this->checkAuthorization(auth()->user(), ['approval2.approve']); + + $form = FormOthers::findOrfail($id); + $form->update([ + 'approved2_at' => now(), + 'approved2_by' => auth()->user()->id, + 'status' => 'Approved 2', + ]); + + $heads = $form->user->getCabangAndRegionHead(); + $name = $form->user->name; + $expense_number = $form->expense_number; + $tanggal = $form->created_at; + $total = $form->total; + + // Collect all recipients + $recipients = [$form->user->email, auth()->user()->email]; + $phoneNumbers = [$form->user->phone, auth()->user()->phone]; + + if ($heads['cabang_head']) { + $recipients[] = $heads['cabang_head']['email']; + $phoneNumbers[] = $heads['cabang_head']['phone']; + } + + if ($heads['region_head']) { + $recipients[] = $heads['region_head']['email']; + $phoneNumbers[] = $heads['region_head']['phone']; + } + + // Remove duplicate data, if any + $recipients = array_unique($recipients); + $phoneNumbers = array_unique($phoneNumbers); + + // send whatsapp message + $url = route('forms.other.view', $form->id); + WhatsappHelper::approve2Expense($phoneNumbers, $expense_number, $url, $tanggal, $total, $name); + + // // Send bulk email + Mail::to($recipients)->send(new ExpenseApproved2( + $name, + $expense_number, + $tanggal, + $total, + $url + )); + + AuditTrailHelper::AddAuditTrail('Approve', 'Approve Expense at Form Other (' . $form->expense_number . ')'); + session()->flash('success', 'Form has been approved.'); + return redirect()->back(); + } + + public function finalApprove(Request $request, $id) { $this->checkAuthorization(auth()->user(), ['final_approval.approve']); $form = FormOthers::findOrfail($id); - if($form->approved_at == null) { - session()->flash('error', 'Form must be approved by MIS first.'); + if($form->approved_at == null || $form->approved2_at == null) { + session()->flash('error', 'Form must be approved by both approvers before final approval.'); + return redirect()->back(); + } + + // Check if the total nominal exceeds the available budget + $cabang_id = UserHasCabang::where('user_id', $form->user_id)->first()->cabang_id; + if($form->total > BudgetHelper::getAvailableBudget($cabang_id)) { + session()->flash('error', 'The total nominal exceeds the available budget.'); return redirect()->back(); } $form->update([ 'final_approved_at' => now(), 'final_approved_by' => auth()->user()->id, - 'status' => 'Closed' + 'status' => 'Closed', + 'approved_total' => $form->total, ]); $heads = $form->user->getCabangAndRegionHead(); $name = $form->user->name; $expense_number = $form->expense_number; - $tanggal = $form->tanggal; + $tanggal = $form->created_at; $total = $form->approved_total; // Collect all recipients @@ -382,7 +432,7 @@ class FormOtherController extends Controller // send whatsapp message $url = route('forms.other.view', $form->id); - WhatsappHelper::approveExpense($phoneNumbers, $expense_number, $url); + WhatsappHelper::finalApprove($phoneNumbers, $expense_number, $url, $tanggal, $total, $name); // Send bulk email Mail::to($recipients)->send(new FinalApprove( @@ -398,25 +448,9 @@ class FormOtherController extends Controller return redirect()->back(); } - public function open($id) - { - $this->checkAuthorization(auth()->user(), ['final_approval.open']); - - $form = FormOthers::findOrfail($id); - $form->update([ - 'final_approved_at' => null, - 'final_approved_by' => null, - 'status' => 'Approved' - ]); - - AuditTrailHelper::AddAuditTrail('Open', 'Open Expense at Form Other (' . $form->expense_number . ')'); - session()->flash('success', 'Form has been opened.'); - return redirect()->back(); - } - public function reject($id) { - $this->checkAuthorization(auth()->user(), ['approval.approve']); + $this->checkAuthorization(auth()->user(), ['approval.reject']); $form = FormOthers::findOrfail($id); $form->update([ @@ -426,7 +460,7 @@ class FormOtherController extends Controller $heads = $form->user->getCabangAndRegionHead(); $name = $form->user->name; $expense_number = $form->expense_number; - $tanggal = $form->tanggal; + $tanggal = $form->created_at; $total = $form->total; // Collect all recipients @@ -447,9 +481,9 @@ class FormOtherController extends Controller $recipients = array_unique($recipients); $phoneNumbers = array_unique($phoneNumbers); - // Send bulk WhatsApp message + // send whatsapp message $url = route('forms.other.view', $form->id); - WhatsappHelper::approveExpense($phoneNumbers, $expense_number, $url); + WhatsappHelper::rejectExpense($phoneNumbers, $expense_number, $url, $tanggal, $total, $name); // Send bulk email Mail::to($recipients)->send(new ExpenseRejected( @@ -465,6 +499,22 @@ class FormOtherController extends Controller return redirect()->back(); } + public function open($id) + { + $this->checkAuthorization(auth()->user(), ['final_approval.open']); + + $form = FormOthers::findOrfail($id); + $form->update([ + 'final_approved_at' => null, + 'final_approved_by' => null, + 'status' => 'Approved' + ]); + + AuditTrailHelper::AddAuditTrail('Open', 'Open Expense at Form Other (' . $form->expense_number . ')'); + session()->flash('success', 'Form has been opened.'); + return redirect()->back(); + } + public function destroy($id) { $this->checkAuthorization(auth()->user(), ['forms.other.delete']); diff --git a/app/Http/Controllers/Forms/FormUpCountryController.php b/app/Http/Controllers/Forms/FormUpCountryController.php index 9097c2a..f596273 100644 --- a/app/Http/Controllers/Forms/FormUpCountryController.php +++ b/app/Http/Controllers/Forms/FormUpCountryController.php @@ -15,6 +15,7 @@ use App\Models\Kategori; use Illuminate\Support\Str; use Illuminate\Support\Facades\Mail; use App\Mail\ExpenseApproved; +use App\Mail\ExpenseApproved2; use App\Mail\ExpenseRejected; use App\Mail\FinalApprove; use App\Mail\ExpenseCreated; @@ -258,7 +259,7 @@ class FormUpCountryController extends Controller // Generate URL and send WhatsApp notification $url = route('forms.up-country.view', $form->id); - WhatsappHelper::newExpense($phoneNumbers, $expense_number, $url); + WhatsappHelper::newExpense($phoneNumbers, $expense_number, $url, $tanggal, $total, $name); // Send bulk email Mail::to($recipients)->send(new ExpenseCreated( @@ -280,8 +281,8 @@ class FormUpCountryController extends Controller $role = auth()->user()->getRoleNames()[0]; $form = FormUpCountry::with('rayon')->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.'); + 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.'); return redirect()->back(); } @@ -312,8 +313,8 @@ class FormUpCountryController extends Controller ]); $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.'); + 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.'); return redirect()->back(); } @@ -411,11 +412,122 @@ class FormUpCountryController extends Controller return redirect()->back(); } - public function approve(Request $request, $id) + public function approve($id) { $this->checkAuthorization(auth()->user(), ['approval.approve']); $form = FormUpCountry::findOrfail($id); + $form->update([ + 'approved_at' => now(), + 'approved_by' => auth()->user()->id, + 'status' => 'Approved 1', + ]); + + $heads = $form->user->getCabangAndRegionHead(); + $name = $form->user->name; + $expense_number = $form->expense_number; + $tanggal = $form->tanggal; + $total = $form->total; + + // Collect all recipients + $recipients = [$form->user->email, auth()->user()->email]; + $phoneNumbers = [$form->user->phone, auth()->user()->phone]; + + if ($heads['cabang_head']) { + $recipients[] = $heads['cabang_head']['email']; + $phoneNumbers[] = $heads['cabang_head']['phone']; + } + + if ($heads['region_head']) { + $recipients[] = $heads['region_head']['email']; + $phoneNumbers[] = $heads['region_head']['phone']; + } + + // Remove duplicate data, if any + $recipients = array_unique($recipients); + $phoneNumbers = array_unique($phoneNumbers); + + // send whatsapp message + $url = route('forms.up-country.view', $form->id); + WhatsappHelper::approveExpense($phoneNumbers, $expense_number, $url, $tanggal, $total, $name); + + // // Send bulk email + Mail::to($recipients)->send(new ExpenseApproved( + $name, + $expense_number, + $tanggal, + $total, + $url + )); + + AuditTrailHelper::AddAuditTrail('Approve', 'Approve Expense at Form Up Country (' . $form->expense_number . ')'); + session()->flash('success', 'Form has been approved.'); + return redirect()->back(); + } + + public function approve2($id) + { + $this->checkAuthorization(auth()->user(), ['approval2.approve']); + + $form = FormUpCountry::findOrfail($id); + $form->update([ + 'approved2_at' => now(), + 'approved2_by' => auth()->user()->id, + 'status' => 'Approved 2', + ]); + + $heads = $form->user->getCabangAndRegionHead(); + $name = $form->user->name; + $expense_number = $form->expense_number; + $tanggal = $form->tanggal; + $total = $form->total; + + // Collect all recipients + $recipients = [$form->user->email, auth()->user()->email]; + $phoneNumbers = [$form->user->phone, auth()->user()->phone]; + + if ($heads['cabang_head']) { + $recipients[] = $heads['cabang_head']['email']; + $phoneNumbers[] = $heads['cabang_head']['phone']; + } + + if ($heads['region_head']) { + $recipients[] = $heads['region_head']['email']; + $phoneNumbers[] = $heads['region_head']['phone']; + } + + // Remove duplicate data, if any + $recipients = array_unique($recipients); + $phoneNumbers = array_unique($phoneNumbers); + + // send whatsapp message + $url = route('forms.up-country.view', $form->id); + WhatsappHelper::approve2Expense($phoneNumbers, $expense_number, $url, $tanggal, $total, $name); + + // // Send bulk email + Mail::to($recipients)->send(new ExpenseApproved2( + $name, + $expense_number, + $tanggal, + $total, + $url + )); + + AuditTrailHelper::AddAuditTrail('Approve', 'Approve Expense at Form Up Country (' . $form->expense_number . ')'); + session()->flash('success', 'Form has been approved.'); + return redirect()->back(); + } + + public function finalApprove(Request $request, $id) + { + $this->checkAuthorization(auth()->user(), ['final_approval.approve']); + + $form = FormUpCountry::findOrfail($id); + if($form->approved_at == null || $form->approved2_at == null) { + session()->flash('error', 'Form must be approved by both approvers before final approval.'); + return redirect()->back(); + } + $approved_data = [ 'allowance' => $request->allowance ? $form->allowance : 0, 'transport_dalkot' => $request->transport_dalkot ? $form->transport_dalkot : 0, @@ -431,9 +543,9 @@ class FormUpCountryController extends Controller } $form->update([ - 'approved_at' => now(), - 'approved_by' => auth()->user()->id, - 'status' => 'Approved', + 'final_approved_at' => now(), + 'final_approved_by' => auth()->user()->id, + 'status' => 'Closed', 'approved_allowance' => $approved_data['allowance'], 'approved_transport_dalkot' => $approved_data['transport_dalkot'], 'approved_transport_ankot' => $approved_data['transport_ankot'], @@ -461,16 +573,16 @@ class FormUpCountryController extends Controller $phoneNumbers[] = $heads['region_head']['phone']; } - // Remove duplicate data, if any + // Remove duplicate email addresses, if any $recipients = array_unique($recipients); $phoneNumbers = array_unique($phoneNumbers); // send whatsapp message $url = route('forms.up-country.view', $form->id); - WhatsappHelper::approveExpense($phoneNumbers, $expense_number, $url); + WhatsappHelper::finalApprove($phoneNumbers, $expense_number, $url, $tanggal, $total, $name); - // // Send bulk email - Mail::to($recipients)->send(new ExpenseApproved( + // Send bulk email + Mail::to($recipients)->send(new FinalApprove( $name, $expense_number, $tanggal, @@ -478,14 +590,14 @@ class FormUpCountryController extends Controller $url )); - AuditTrailHelper::AddAuditTrail('Approve', 'Approve Expense at Form Up Country (' . $form->expense_number . ')'); - session()->flash('success', 'Form has been approved.'); + AuditTrailHelper::AddAuditTrail('Final Approve', 'Final Approve Expense at Form Up Country (' . $form->expense_number . ')'); + session()->flash('success', 'Form has been final approved.'); return redirect()->back(); } public function reject($id) { - $this->checkAuthorization(auth()->user(), ['approval.approve']); + $this->checkAuthorization(auth()->user(), ['approval.reject']); $form = FormUpCountry::findOrfail($id); $form->update([ @@ -518,7 +630,7 @@ class FormUpCountryController extends Controller // send whatsapp message $url = route('forms.up-country.view', $form->id); - WhatsappHelper::rejectExpense($phoneNumbers, $expense_number, $url); + WhatsappHelper::rejectExpense($phoneNumbers, $expense_number, $url, $tanggal, $total, $name); // Send bulk email Mail::to($recipients)->send(new ExpenseRejected( @@ -534,64 +646,6 @@ class FormUpCountryController extends Controller return redirect()->back(); } - public function finalApprove($id) - { - $this->checkAuthorization(auth()->user(), ['final_approval.approve']); - - $form = FormUpCountry::findOrfail($id); - if($form->approved_at == null) { - session()->flash('error', 'Form must be approved by MIS first.'); - return redirect()->back(); - } - - $form->update([ - 'final_approved_at' => now(), - 'final_approved_by' => auth()->user()->id, - 'status' => 'Closed' - ]); - - $heads = $form->user->getCabangAndRegionHead(); - $name = $form->user->name; - $expense_number = $form->expense_number; - $tanggal = $form->tanggal; - $total = $form->approved_total; - - // Collect all recipients - $recipients = [$form->user->email, auth()->user()->email]; - $phoneNumbers = [$form->user->phone, auth()->user()->phone]; - - if ($heads['cabang_head']) { - $recipients[] = $heads['cabang_head']['email']; - $phoneNumbers[] = $heads['cabang_head']['phone']; - } - - if ($heads['region_head']) { - $recipients[] = $heads['region_head']['email']; - $phoneNumbers[] = $heads['region_head']['phone']; - } - - // Remove duplicate email addresses, if any - $recipients = array_unique($recipients); - $phoneNumbers = array_unique($phoneNumbers); - - // send whatsapp message - $url = route('forms.up-country.view', $form->id); - WhatsappHelper::finalApprove($phoneNumbers, $expense_number, $url); - - // Send bulk email - Mail::to($recipients)->send(new FinalApprove( - $name, - $expense_number, - $tanggal, - $total, - $url - )); - - AuditTrailHelper::AddAuditTrail('Final Approve', 'Final Approve Expense at Form Up Country (' . $form->expense_number . ')'); - session()->flash('success', 'Form has been final approved.'); - return redirect()->back(); - } - public function open($id) { $this->checkAuthorization(auth()->user(), ['final_approval.open']); @@ -600,7 +654,7 @@ class FormUpCountryController extends Controller $form->update([ 'final_approved_at' => null, 'final_approved_by' => null, - 'status' => 'Approved' + 'status' => 'Approved 2' ]); AuditTrailHelper::AddAuditTrail('Open', 'Open Expense at Form Up Country (' . $form->expense_number . ')'); diff --git a/app/Http/Controllers/Forms/FormVehicleController.php b/app/Http/Controllers/Forms/FormVehicleController.php index d49bab1..db98df1 100644 --- a/app/Http/Controllers/Forms/FormVehicleController.php +++ b/app/Http/Controllers/Forms/FormVehicleController.php @@ -16,6 +16,7 @@ use App\Helpers\NextCloudHelper; use Illuminate\Support\Str; use Illuminate\Support\Facades\Mail; use App\Mail\ExpenseApproved; +use App\Mail\ExpenseApproved2; use App\Mail\ExpenseRejected; use App\Mail\FinalApprove; use App\Mail\ExpenseCreated; @@ -191,7 +192,7 @@ class FormVehicleController extends Controller // Generate URL and send WhatsApp notification $url = route('forms.vehicle.view', $form->id); - WhatsappHelper::newExpense($phoneNumbers, $expense_number, $url); + WhatsappHelper::newExpense($phoneNumbers, $expense_number, $url, $tanggal, $total, $name); // Send bulk email Mail::to($recipients)->send(new ExpenseCreated( @@ -285,33 +286,22 @@ class FormVehicleController extends Controller return redirect()->back(); } - public function approve(Request $request, $id) + public function approve($id) { $this->checkAuthorization(auth()->user(), ['approval.approve']); - $request->validate([ - 'total' => 'required', - ]); $form = FormVehicleRunningCost::findOrfail($id); - $cabang_id = UserHasCabang::where('user_id', $form->user_id)->first()->cabang_id; - if($form->total > BudgetHelper::getAvailableBudget($cabang_id)) { - session()->flash('error', 'The total nominal exceeds the available budget.'); - return redirect()->back(); - } - $form->update([ 'approved_at' => now(), 'approved_by' => auth()->user()->id, - 'status' => 'Approved', - - 'approved_total' => $form->total, + 'status' => 'Approved 1', ]); $heads = $form->user->getCabangAndRegionHead(); $name = $form->user->name; $expense_number = $form->expense_number; - $tanggal = $form->tanggal; - $total = $form->approved_total; + $tanggal = $form->created_at; + $total = $form->total; // Collect all recipients $recipients = [$form->user->email, auth()->user()->email]; @@ -327,15 +317,15 @@ class FormVehicleController extends Controller $phoneNumbers[] = $heads['region_head']['phone']; } - // Remove duplicate email addresses, if any + // Remove duplicate data, if any $recipients = array_unique($recipients); $phoneNumbers = array_unique($phoneNumbers); - // Send bulk WhatsApp message + // send whatsapp message $url = route('forms.vehicle.view', $form->id); - WhatsappHelper::approveExpense($phoneNumbers, $expense_number, $url); + WhatsappHelper::approveExpense($phoneNumbers, $expense_number, $url, $tanggal, $total, $name); - // Send bulk email + // // Send bulk email Mail::to($recipients)->send(new ExpenseApproved( $name, $expense_number, @@ -349,26 +339,87 @@ class FormVehicleController extends Controller return redirect()->back(); } - public function finalApprove($id) + public function approve2($id) + { + $this->checkAuthorization(auth()->user(), ['approval2.approve']); + + $form = FormVehicleRunningCost::findOrfail($id); + $form->update([ + 'approved2_at' => now(), + 'approved2_by' => auth()->user()->id, + 'status' => 'Approved 2', + ]); + + $heads = $form->user->getCabangAndRegionHead(); + $name = $form->user->name; + $expense_number = $form->expense_number; + $tanggal = $form->created_at; + $total = $form->total; + + // Collect all recipients + $recipients = [$form->user->email, auth()->user()->email]; + $phoneNumbers = [$form->user->phone, auth()->user()->phone]; + + if ($heads['cabang_head']) { + $recipients[] = $heads['cabang_head']['email']; + $phoneNumbers[] = $heads['cabang_head']['phone']; + } + + if ($heads['region_head']) { + $recipients[] = $heads['region_head']['email']; + $phoneNumbers[] = $heads['region_head']['phone']; + } + + // Remove duplicate data, if any + $recipients = array_unique($recipients); + $phoneNumbers = array_unique($phoneNumbers); + + // send whatsapp message + $url = route('forms.vehicle.view', $form->id); + WhatsappHelper::approve2Expense($phoneNumbers, $expense_number, $url, $tanggal, $total, $name); + + // // Send bulk email + Mail::to($recipients)->send(new ExpenseApproved2( + $name, + $expense_number, + $tanggal, + $total, + $url + )); + + AuditTrailHelper::AddAuditTrail('Approve', 'Approve Expense at Form Vehicle Running Cost (' . $form->expense_number . ')'); + session()->flash('success', 'Form has been approved.'); + return redirect()->back(); + } + + public function finalApprove(Request $request, $id) { $this->checkAuthorization(auth()->user(), ['final_approval.approve']); $form = FormVehicleRunningCost::findOrfail($id); - if($form->approved_at == null) { - session()->flash('error', 'Form must be approved by MIS first.'); + if($form->approved_at == null || $form->approved2_at == null) { + session()->flash('error', 'Form must be approved by both approvers before final approval.'); + return redirect()->back(); + } + + // Check if the total nominal exceeds the available budget + $cabang_id = UserHasCabang::where('user_id', $form->user_id)->first()->cabang_id; + if($form->total > BudgetHelper::getAvailableBudget($cabang_id)) { + session()->flash('error', 'The total nominal exceeds the available budget.'); return redirect()->back(); } $form->update([ 'final_approved_at' => now(), 'final_approved_by' => auth()->user()->id, - 'status' => 'Closed' + 'status' => 'Closed', + 'approved_total' => $form->total, ]); $heads = $form->user->getCabangAndRegionHead(); $name = $form->user->name; $expense_number = $form->expense_number; - $tanggal = $form->tanggal; + $tanggal = $form->created_at; $total = $form->approved_total; // Collect all recipients @@ -391,7 +442,7 @@ class FormVehicleController extends Controller // send whatsapp message $url = route('forms.vehicle.view', $form->id); - WhatsappHelper::approveExpense($phoneNumbers, $expense_number, $url); + WhatsappHelper::finalApprove($phoneNumbers, $expense_number, $url, $tanggal, $total, $name); // Send bulk email Mail::to($recipients)->send(new FinalApprove( @@ -407,25 +458,9 @@ class FormVehicleController extends Controller return redirect()->back(); } - public function open($id) - { - $this->checkAuthorization(auth()->user(), ['final_approval.open']); - - $form = FormVehicleRunningCost::findOrfail($id); - $form->update([ - 'final_approved_at' => null, - 'final_approved_by' => null, - 'status' => 'Approved' - ]); - - AuditTrailHelper::AddAuditTrail('Open', 'Open Expense at Form Vehicle Running Cost (' . $form->expense_number . ')'); - session()->flash('success', 'Form has been opened.'); - return redirect()->back(); - } - public function reject($id) { - $this->checkAuthorization(auth()->user(), ['approval.approve']); + $this->checkAuthorization(auth()->user(), ['approval.reject']); $form = FormVehicleRunningCost::findOrfail($id); $form->update([ @@ -435,7 +470,7 @@ class FormVehicleController extends Controller $heads = $form->user->getCabangAndRegionHead(); $name = $form->user->name; $expense_number = $form->expense_number; - $tanggal = $form->tanggal; + $tanggal = $form->created_at; $total = $form->total; // Collect all recipients @@ -456,9 +491,9 @@ class FormVehicleController extends Controller $recipients = array_unique($recipients); $phoneNumbers = array_unique($phoneNumbers); - // Send bulk WhatsApp message + // send whatsapp message $url = route('forms.vehicle.view', $form->id); - WhatsappHelper::approveExpense($phoneNumbers, $expense_number, $url); + WhatsappHelper::rejectExpense($phoneNumbers, $expense_number, $url, $tanggal, $total, $name); // Send bulk email Mail::to($recipients)->send(new ExpenseRejected( @@ -468,12 +503,28 @@ class FormVehicleController extends Controller $total, $url )); - + AuditTrailHelper::AddAuditTrail('Reject', 'Reject Expense at Form Vehicle Running Cost (' . $form->expense_number . ')'); session()->flash('success', 'Form has been rejected.'); return redirect()->back(); } + public function open($id) + { + $this->checkAuthorization(auth()->user(), ['final_approval.open']); + + $form = FormVehicleRunningCost::findOrfail($id); + $form->update([ + 'final_approved_at' => null, + 'final_approved_by' => null, + 'status' => 'Approved' + ]); + + AuditTrailHelper::AddAuditTrail('Open', 'Open Expense at Form Vehicle Running Cost (' . $form->expense_number . ')'); + session()->flash('success', 'Form has been opened.'); + return redirect()->back(); + } + public function destroy($id) { $this->checkAuthorization(auth()->user(), ['forms.vehicle.delete']); diff --git a/app/Mail/ExpenseApproved.php b/app/Mail/ExpenseApproved.php index 7247c3c..a6f2d72 100644 --- a/app/Mail/ExpenseApproved.php +++ b/app/Mail/ExpenseApproved.php @@ -30,7 +30,7 @@ class ExpenseApproved extends Mailable public function envelope(): Envelope { return new Envelope( - subject: 'Expense Approved', + subject: 'Expense First Approval', ); } diff --git a/app/Mail/ExpenseApproved2.php b/app/Mail/ExpenseApproved2.php new file mode 100644 index 0000000..9ae246a --- /dev/null +++ b/app/Mail/ExpenseApproved2.php @@ -0,0 +1,63 @@ + $this->name, + 'expense_number' => $this->expense_number, + 'tanggal' => $this->tanggal, + 'total' => $this->total, + 'url' => $this->url, + ], + ); + } + + /** + * Get the attachments for the message. + * + * @return array + */ + public function attachments(): array + { + return []; + } +} diff --git a/app/Mail/FinalApprove.php b/app/Mail/FinalApprove.php index e7ec7de..6c3ee4c 100644 --- a/app/Mail/FinalApprove.php +++ b/app/Mail/FinalApprove.php @@ -30,7 +30,7 @@ class FinalApprove extends Mailable public function envelope(): Envelope { return new Envelope( - subject: 'Expense Closed', + subject: 'Expense Final Approval', ); } diff --git a/app/Models/FormEntertaimentPresentation.php b/app/Models/FormEntertaimentPresentation.php index 5c98480..f7aa8f9 100644 --- a/app/Models/FormEntertaimentPresentation.php +++ b/app/Models/FormEntertaimentPresentation.php @@ -25,7 +25,9 @@ class FormEntertaimentPresentation extends Model 'account_number', 'status', 'approved_at', + 'approved2_at', 'approved_by', + 'approved2_by', 'final_approved_at', 'final_approved_by', ]; diff --git a/app/Models/FormMeetingSeminar.php b/app/Models/FormMeetingSeminar.php index 8a77b73..a7a98cf 100644 --- a/app/Models/FormMeetingSeminar.php +++ b/app/Models/FormMeetingSeminar.php @@ -27,7 +27,9 @@ class FormMeetingSeminar extends Model 'account_number', 'status', 'approved_at', + 'approved2_at', 'approved_by', + 'approved2_by', 'final_approved_at', 'final_approved_by', ]; diff --git a/app/Models/FormOthers.php b/app/Models/FormOthers.php index b2a7d82..546264f 100644 --- a/app/Models/FormOthers.php +++ b/app/Models/FormOthers.php @@ -22,7 +22,9 @@ class FormOthers extends Model 'account_number', 'status', 'approved_at', + 'approved2_at', 'approved_by', + 'approved2_by', 'final_approved_at', 'final_approved_by', ]; diff --git a/app/Models/FormUpCountry.php b/app/Models/FormUpCountry.php index 2a024dc..f88a034 100644 --- a/app/Models/FormUpCountry.php +++ b/app/Models/FormUpCountry.php @@ -34,7 +34,9 @@ class FormUpCountry extends Model 'account_number', 'status', 'approved_at', + 'approved2_at', 'approved_by', + 'approved2_by', 'final_approved_at', 'final_approved_by', ]; diff --git a/app/Models/FormVehicleRunningCost.php b/app/Models/FormVehicleRunningCost.php index 8a67dd4..b86633d 100644 --- a/app/Models/FormVehicleRunningCost.php +++ b/app/Models/FormVehicleRunningCost.php @@ -25,7 +25,9 @@ class FormVehicleRunningCost extends Model 'account_number', 'status', 'approved_at', + 'approved2_at', 'approved_by', + 'approved2_by', 'final_approved_at', 'final_approved_by', ]; diff --git a/database/migrations/2025_01_16_045615_add_approval2_form_up_country.php b/database/migrations/2025_01_16_045615_add_approval2_form_up_country.php new file mode 100644 index 0000000..3eaa8cc --- /dev/null +++ b/database/migrations/2025_01_16_045615_add_approval2_form_up_country.php @@ -0,0 +1,31 @@ +timestamp('approved2_at')->nullable()->after('approved_at'); + $table->foreignId('approved2_by')->nullable()->constrained('admins')->cascadeOnDelete()->after('approved_by'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('form_up_country', function (Blueprint $table) { + $table->dropColumn('approved2_at'); + $table->dropForeign(['approved2_by']); + $table->dropColumn('approved2_by'); + }); + } +}; diff --git a/database/migrations/2025_01_16_050053_add_approval2_form_vehicle_running_cost.php b/database/migrations/2025_01_16_050053_add_approval2_form_vehicle_running_cost.php new file mode 100644 index 0000000..d843319 --- /dev/null +++ b/database/migrations/2025_01_16_050053_add_approval2_form_vehicle_running_cost.php @@ -0,0 +1,31 @@ +timestamp('approved2_at')->nullable()->after('approved_at'); + $table->foreignId('approved2_by')->nullable()->constrained('admins')->cascadeOnDelete()->after('approved_by'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('form_vehicle_running_cost', function (Blueprint $table) { + $table->dropColumn('approved2_at'); + $table->dropForeign(['approved2_by']); + $table->dropColumn('approved2_by'); + }); + } +}; diff --git a/database/migrations/2025_01_16_050129_add_approval2_form_entertainment_presentation.php b/database/migrations/2025_01_16_050129_add_approval2_form_entertainment_presentation.php new file mode 100644 index 0000000..0102cef --- /dev/null +++ b/database/migrations/2025_01_16_050129_add_approval2_form_entertainment_presentation.php @@ -0,0 +1,31 @@ +timestamp('approved2_at')->nullable()->after('approved_at'); + $table->foreignId('approved2_by')->nullable()->constrained('admins')->cascadeOnDelete()->after('approved_by'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('form_entertainment_presentation', function (Blueprint $table) { + $table->dropColumn('approved2_at'); + $table->dropForeign(['approved2_by']); + $table->dropColumn('approved2_by'); + }); + } +}; diff --git a/database/migrations/2025_01_16_050210_add_approval2_form_meeting_seminar.php b/database/migrations/2025_01_16_050210_add_approval2_form_meeting_seminar.php new file mode 100644 index 0000000..f4bdb07 --- /dev/null +++ b/database/migrations/2025_01_16_050210_add_approval2_form_meeting_seminar.php @@ -0,0 +1,31 @@ +timestamp('approved2_at')->nullable()->after('approved_at'); + $table->foreignId('approved2_by')->nullable()->constrained('admins')->cascadeOnDelete()->after('approved_by'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('form_meeting_seminar', function (Blueprint $table) { + $table->dropColumn('approved2_at'); + $table->dropForeign(['approved2_by']); + $table->dropColumn('approved2_by'); + }); + } +}; diff --git a/database/migrations/2025_01_16_050246_add_approval2_form_others.php b/database/migrations/2025_01_16_050246_add_approval2_form_others.php new file mode 100644 index 0000000..c2e0120 --- /dev/null +++ b/database/migrations/2025_01_16_050246_add_approval2_form_others.php @@ -0,0 +1,31 @@ +timestamp('approved2_at')->nullable()->after('approved_at'); + $table->foreignId('approved2_by')->nullable()->constrained('admins')->cascadeOnDelete()->after('approved_by'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('form_others', function (Blueprint $table) { + $table->dropColumn('approved2_at'); + $table->dropForeign(['approved2_by']); + $table->dropColumn('approved2_by'); + }); + } +}; diff --git a/database/seeds/DatabaseSeeder.php b/database/seeds/DatabaseSeeder.php index 878de7b..19a85ad 100644 --- a/database/seeds/DatabaseSeeder.php +++ b/database/seeds/DatabaseSeeder.php @@ -12,6 +12,8 @@ use Database\Seeds\RolePermissionSeeder4; use Database\Seeds\RolePermissionSeeder5; use Database\Seeds\RolePermissionSeeder6; use Database\Seeds\RolePermissionSeeder7; +use Database\Seeds\RolePermissionSeeder8; +use Database\Seeds\RolePermissionSeeder9; class DatabaseSeeder extends Seeder { @@ -32,6 +34,8 @@ class DatabaseSeeder extends Seeder // $this->call(RolePermissionSeeder4::class); // $this->call(RolePermissionSeeder5::class); // $this->call(RolePermissionSeeder6::class); - $this->call(RolePermissionSeeder7::class); + // $this->call(RolePermissionSeeder7::class); + // $this->call(RolePermissionSeeder8::class); + $this->call(RolePermissionSeeder9::class); } } diff --git a/database/seeds/RolePermissionSeeder8.php b/database/seeds/RolePermissionSeeder8.php new file mode 100644 index 0000000..05f54c7 --- /dev/null +++ b/database/seeds/RolePermissionSeeder8.php @@ -0,0 +1,90 @@ + 'approval2', + 'permissions' => [ + 'approval2.view', + 'approval2.approve', + ] + ], + [ + 'group_name' => 'notification', + 'permissions' => [ + 'notification.view', + 'notification.delete', + ] + ], + ]; + + // Do same for the admin guard for tutorial purposes. + $admin = Admin::where('username', 'superadmin')->first(); + $roleSuperAdmin = $this->maybeCreateSuperAdminRole($admin); + + // Create and Assign Permissions + for ($i = 0; $i < count($permissions); $i++) { + $permissionGroup = $permissions[$i]['group_name']; + for ($j = 0; $j < count($permissions[$i]['permissions']); $j++) { + $permissionExist = Permission::where('name', $permissions[$i]['permissions'][$j])->first(); + if (is_null($permissionExist)) { + $permission = Permission::create( + [ + 'name' => $permissions[$i]['permissions'][$j], + 'group_name' => $permissionGroup, + 'guard_name' => 'admin' + ] + ); + $roleSuperAdmin->givePermissionTo($permission); + $permission->assignRole($roleSuperAdmin); + } + } + } + + // Assign super admin role permission to superadmin user + if ($admin) { + $admin->assignRole($roleSuperAdmin); + } + } + + private function maybeCreateSuperAdminRole($admin): Role + { + if (is_null($admin)) { + $roleSuperAdmin = Role::create(['name' => 'superadmin', 'guard_name' => 'admin']); + } else { + $roleSuperAdmin = Role::where('name', 'superadmin')->where('guard_name', 'admin')->first(); + } + + if (is_null($roleSuperAdmin)) { + $roleSuperAdmin = Role::create(['name' => 'superadmin', 'guard_name' => 'admin']); + } + + return $roleSuperAdmin; + } +} diff --git a/database/seeds/RolePermissionSeeder9.php b/database/seeds/RolePermissionSeeder9.php new file mode 100644 index 0000000..533aa82 --- /dev/null +++ b/database/seeds/RolePermissionSeeder9.php @@ -0,0 +1,88 @@ + 'approval', + 'permissions' => [ + 'approval.reject', + ] + ], + [ + 'group_name' => 'approval2', + 'permissions' => [ + 'approval2.reject', + ] + ], + ]; + + // Do same for the admin guard for tutorial purposes. + $admin = Admin::where('username', 'superadmin')->first(); + $roleSuperAdmin = $this->maybeCreateSuperAdminRole($admin); + + // Create and Assign Permissions + for ($i = 0; $i < count($permissions); $i++) { + $permissionGroup = $permissions[$i]['group_name']; + for ($j = 0; $j < count($permissions[$i]['permissions']); $j++) { + $permissionExist = Permission::where('name', $permissions[$i]['permissions'][$j])->first(); + if (is_null($permissionExist)) { + $permission = Permission::create( + [ + 'name' => $permissions[$i]['permissions'][$j], + 'group_name' => $permissionGroup, + 'guard_name' => 'admin' + ] + ); + $roleSuperAdmin->givePermissionTo($permission); + $permission->assignRole($roleSuperAdmin); + } + } + } + + // Assign super admin role permission to superadmin user + if ($admin) { + $admin->assignRole($roleSuperAdmin); + } + } + + private function maybeCreateSuperAdminRole($admin): Role + { + if (is_null($admin)) { + $roleSuperAdmin = Role::create(['name' => 'superadmin', 'guard_name' => 'admin']); + } else { + $roleSuperAdmin = Role::where('name', 'superadmin')->where('guard_name', 'admin')->first(); + } + + if (is_null($roleSuperAdmin)) { + $roleSuperAdmin = Role::create(['name' => 'superadmin', 'guard_name' => 'admin']); + } + + return $roleSuperAdmin; + } +} diff --git a/resources/views/backend/pages/forms/entertainment/index.blade.php b/resources/views/backend/pages/forms/entertainment/index.blade.php index 7fd02d5..93bab54 100644 --- a/resources/views/backend/pages/forms/entertainment/index.blade.php +++ b/resources/views/backend/pages/forms/entertainment/index.blade.php @@ -110,7 +110,10 @@ Account Number Status @if (auth()->user()->can('approval.approve')) - Approval + Approval 1 + @endif + @if (auth()->user()->can('approval2.approve')) + Approval 2 @endif @if (auth()->user()->can('final_approval.approve')) Final Approval @@ -148,7 +151,7 @@ @if ($item->status == 'On Progress') {{ $item->status }} - @elseif ($item->status == 'Approved' || $item->status == 'Final Approved') + @elseif ($item->status == 'Approved 1' || $item->status == 'Approved 2' || $item->status == 'Final Approved') {{ $item->status }} @else {{ $item->status }} @@ -157,16 +160,16 @@ @if (auth()->user()->can('approval.approve')) {{-- approve / reject button --}} - @if ($item->status == 'On Progress') + @if ($item->status == 'On Progress' || $item->status == 'Rejected')
-
+ @csrf @method('PUT') +
+ +
+ @csrf + @method('PUT') + +
+ @else + @if ($item->approved2_at) + {{ \Carbon\Carbon::parse($item->approved_at)->locale('id')->isoFormat('D MMMM Y') }} + @elseif($item->rejected_at) + {{ \Carbon\Carbon::parse($item->rejected_at)->locale('id')->isoFormat('D MMMM Y') }} + @else + - + @endif + @endif + + @endif @if(auth()->user()->can('final_approval.approve')) {{-- approve / reject button --}} - @if ($item->status == 'Approved' && $item->approved_at && !$item->final_approved_at) -
- @csrf - @method('PUT') -
@@ -280,22 +313,84 @@ NIK/NPWP Penerima:
  • - Nama Penerima: + Tanggal:
  • - Alamat Penerima: + Nama Penerima:
  • Jenis:
  • -
  • - Tanggal: -
  • Keterangan:
  • - Bukti Total Pengeluaran: + Bukti Total: +
  • +
  • + Nominal Total: +
  • + + + + + + + + + + +
    +
    -
    +
    @@ -109,7 +109,10 @@ Account Number Status @if (auth()->user()->can('approval.approve')) - Approval + Approval 1 + @endif + @if (auth()->user()->can('approval2.approve')) + Approval 2 @endif @if (auth()->user()->can('final_approval.approve')) Final Approval @@ -138,7 +141,7 @@ @if ($item->status == 'On Progress') {{ $item->status }} - @elseif ($item->status == 'Approved' || $item->status == 'Final Approved') + @elseif ($item->status == 'Approved 1' || $item->status == 'Approved 2' || $item->status == 'Final Approved') {{ $item->status }} @else {{ $item->status }} @@ -147,16 +150,16 @@ @if (auth()->user()->can('approval.approve')) {{-- approve / reject button --}} - @if ($item->status == 'On Progress') + @if ($item->status == 'On Progress' || $item->status == 'Rejected') -
    + @csrf @method('PUT') +
    + +
    + @csrf + @method('PUT') + +
    + @else + @if ($item->approved2_at) + {{ \Carbon\Carbon::parse($item->approved_at)->locale('id')->isoFormat('D MMMM Y') }} + @elseif($item->rejected_at) + {{ \Carbon\Carbon::parse($item->rejected_at)->locale('id')->isoFormat('D MMMM Y') }} + @else + - + @endif + @endif + + @endif @if(auth()->user()->can('final_approval.approve')) {{-- approve / reject button --}} - @if ($item->status == 'Approved' && $item->approved_at && !$item->final_approved_at) -
    - @csrf - @method('PUT') -
    @@ -235,7 +268,7 @@
    -
    +
    + + +
    +
    + +
    +
    + + + +
    +
    + +
    +
    +
    +
    -
    + @csrf @method('PUT') @include('backend.layouts.partials.messages') @@ -64,6 +83,14 @@
    + +
    +
    +
    +
    +

    Submitting, please wait...

    +
    +
    @@ -93,5 +120,11 @@ decimalPlaces: 0, // Tidak ada angka desimal unformatOnSubmit: true // Nilai asli tanpa format saat dikirimkan }); + + document.getElementById('expense-form').addEventListener('submit', function (e) { + const spinnerOverlay = document.getElementById('loading-spinner-overlay'); + spinnerOverlay.classList.remove('d-none'); // Show overlay + spinnerOverlay.classList.add('d-flex'); // Use flexbox for centering + }); @endsection diff --git a/resources/views/backend/pages/forms/other/create.blade.php b/resources/views/backend/pages/forms/other/create.blade.php index 2141cab..9005f44 100644 --- a/resources/views/backend/pages/forms/other/create.blade.php +++ b/resources/views/backend/pages/forms/other/create.blade.php @@ -22,11 +22,30 @@
    +
    -
    + @csrf @include('backend.layouts.partials.messages')
    @@ -66,6 +85,14 @@
    + +
    +
    +
    +
    +

    Submitting, please wait...

    +
    +
    @@ -79,5 +106,11 @@ decimalPlaces: 0, // Tidak ada angka desimal unformatOnSubmit: true // Nilai asli tanpa format saat dikirimkan }); + + document.getElementById('expense-form').addEventListener('submit', function (e) { + const spinnerOverlay = document.getElementById('loading-spinner-overlay'); + spinnerOverlay.classList.remove('d-none'); // Show overlay + spinnerOverlay.classList.add('d-flex'); // Use flexbox for centering + }); @endsection diff --git a/resources/views/backend/pages/forms/other/edit.blade.php b/resources/views/backend/pages/forms/other/edit.blade.php index 30e3539..5d1fed8 100644 --- a/resources/views/backend/pages/forms/other/edit.blade.php +++ b/resources/views/backend/pages/forms/other/edit.blade.php @@ -22,11 +22,30 @@
    +
    -
    + @csrf @method('PUT') @include('backend.layouts.partials.messages') @@ -67,6 +86,14 @@
    + +
    +
    +
    +
    +

    Submitting, please wait...

    +
    +
    @@ -80,5 +107,11 @@ decimalPlaces: 0, // Tidak ada angka desimal unformatOnSubmit: true // Nilai asli tanpa format saat dikirimkan }); + + document.getElementById('expense-form').addEventListener('submit', function (e) { + const spinnerOverlay = document.getElementById('loading-spinner-overlay'); + spinnerOverlay.classList.remove('d-none'); // Show overlay + spinnerOverlay.classList.add('d-flex'); // Use flexbox for centering + }); @endsection diff --git a/resources/views/backend/pages/forms/upcountry/create.blade.php b/resources/views/backend/pages/forms/upcountry/create.blade.php index c60c63a..8c49223 100644 --- a/resources/views/backend/pages/forms/upcountry/create.blade.php +++ b/resources/views/backend/pages/forms/upcountry/create.blade.php @@ -21,11 +21,30 @@
    +
    -
    + @csrf @include('backend.layouts.partials.messages')
    @@ -91,6 +110,14 @@
    + +
    +
    +
    +
    +

    Submitting, please wait...

    +
    +
    @@ -128,5 +155,11 @@ decimalPlaces: 0, // Tidak ada angka desimal unformatOnSubmit: true // Nilai asli tanpa format saat dikirimkan }); + + document.getElementById('expense-form').addEventListener('submit', function (e) { + const spinnerOverlay = document.getElementById('loading-spinner-overlay'); + spinnerOverlay.classList.remove('d-none'); // Show overlay + spinnerOverlay.classList.add('d-flex'); // Use flexbox for centering + }); @endsection diff --git a/resources/views/backend/pages/forms/upcountry/edit.blade.php b/resources/views/backend/pages/forms/upcountry/edit.blade.php index 5386eca..7faa5ca 100644 --- a/resources/views/backend/pages/forms/upcountry/edit.blade.php +++ b/resources/views/backend/pages/forms/upcountry/edit.blade.php @@ -21,11 +21,30 @@
    +
    -
    + @csrf @method('PUT') @include('backend.layouts.partials.messages') @@ -92,6 +111,14 @@
    + +
    +
    +
    +
    +

    Submitting, please wait...

    +
    +
    @@ -129,5 +156,11 @@ decimalPlaces: 0, // Tidak ada angka desimal unformatOnSubmit: true // Nilai asli tanpa format saat dikirimkan }); + + document.getElementById('expense-form').addEventListener('submit', function (e) { + const spinnerOverlay = document.getElementById('loading-spinner-overlay'); + spinnerOverlay.classList.remove('d-none'); // Show overlay + spinnerOverlay.classList.add('d-flex'); // Use flexbox for centering + }); @endsection diff --git a/resources/views/backend/pages/forms/vehicle/create.blade.php b/resources/views/backend/pages/forms/vehicle/create.blade.php index 31e995f..842c242 100644 --- a/resources/views/backend/pages/forms/vehicle/create.blade.php +++ b/resources/views/backend/pages/forms/vehicle/create.blade.php @@ -22,11 +22,30 @@
    +
    -
    + @csrf @include('backend.layouts.partials.messages')
    @@ -76,6 +95,14 @@
    + +
    +
    +
    +
    +

    Submitting, please wait...

    +
    +
    @@ -89,5 +116,11 @@ decimalPlaces: 0, // Tidak ada angka desimal unformatOnSubmit: true // Nilai asli tanpa format saat dikirimkan }); + + document.getElementById('expense-form').addEventListener('submit', function (e) { + const spinnerOverlay = document.getElementById('loading-spinner-overlay'); + spinnerOverlay.classList.remove('d-none'); // Show overlay + spinnerOverlay.classList.add('d-flex'); // Use flexbox for centering + }); @endsection diff --git a/resources/views/backend/pages/forms/vehicle/edit.blade.php b/resources/views/backend/pages/forms/vehicle/edit.blade.php index 580bceb..99361d9 100644 --- a/resources/views/backend/pages/forms/vehicle/edit.blade.php +++ b/resources/views/backend/pages/forms/vehicle/edit.blade.php @@ -21,11 +21,30 @@
    +
    -
    + @csrf @method('PUT') @include('backend.layouts.partials.messages') @@ -75,6 +94,14 @@
    + +
    +
    +
    +
    +

    Submitting, please wait...

    +
    +
    @@ -88,5 +115,11 @@ decimalPlaces: 0, // Tidak ada angka desimal unformatOnSubmit: true // Nilai asli tanpa format saat dikirimkan }); + + document.getElementById('expense-form').addEventListener('submit', function (e) { + const spinnerOverlay = document.getElementById('loading-spinner-overlay'); + spinnerOverlay.classList.remove('d-none'); // Show overlay + spinnerOverlay.classList.add('d-flex'); // Use flexbox for centering + }); @endsection