Files
expense/app/Http/Controllers/Backend/ReportController.php
T

817 lines
30 KiB
PHP
Raw Normal View History

2025-01-08 14:12:45 +07:00
<?php
declare(strict_types=1);
namespace App\Http\Controllers\Backend;
use App\Http\Controllers\Controller;
use App\Models\AuditTrail;
use App\Models\FormUpCountry;
use App\Models\FormEntertaimentPresentation;
use App\Models\FormMeetingSeminar;
use App\Models\FormVehicleRunningCost;
use App\Models\FormOthers;
2025-01-08 15:01:42 +07:00
use App\Models\UserHasCabang;
2025-01-11 13:31:44 +07:00
use Illuminate\Support\Facades\DB;
2025-01-08 15:01:42 +07:00
use App\Models\Cabang;
2025-01-10 13:38:11 +07:00
use App\Models\Region;
2025-01-11 13:31:44 +07:00
use App\Helpers\FormHelper;
use App\Helpers\BudgetHelper;
2025-10-12 18:29:07 +07:00
use App\Models\Admin;
2025-01-11 13:31:44 +07:00
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Schema;
2025-01-14 14:15:32 +07:00
use App\Models\Kategori;
use App\Models\BudgetControlLog;
2025-05-05 19:40:38 +07:00
use App\Helpers\PeriodeHelper;
2025-01-08 14:12:45 +07:00
class ReportController extends Controller
2025-01-11 13:31:44 +07:00
{
2025-01-08 15:36:08 +07:00
public function upcountry()
2025-01-08 14:12:45 +07:00
{
2025-01-08 15:01:42 +07:00
$role = auth()->user()->getRoleNames()[0];
2025-01-15 22:29:07 +07:00
$cabangs = collect(); // Default empty collection
$regions = collect(); // Default empty collection
$formsQuery = FormUpCountry::with([
'user.region',
'user.cabang',
'rayon'
]);
2025-01-08 15:01:42 +07:00
if ($role == 'Admin Region' || $role == 'Marketing Operational Manager Region') {
$region_id = auth()->user()->getMyCabangAndRegionId()['region'];
if ($region_id) {
$cabangs = Cabang::where('region_id', $region_id)->get();
2025-01-10 13:38:11 +07:00
$regions = Region::where('id', $region_id)->get();
2025-01-15 22:29:07 +07:00
$userIds = UserHasCabang::whereIn('cabang_id', $cabangs->pluck('id'))->pluck('user_id');
$formsQuery->whereIn('user_id', $userIds);
2025-01-08 15:01:42 +07:00
}
2025-01-15 22:29:07 +07:00
} elseif ($role == 'Area Manager Cabang') {
2025-01-08 15:01:42 +07:00
$cabang_id = auth()->user()->getMyCabangAndRegionId()['cabang'];
if ($cabang_id) {
$cabangs = Cabang::where('id', $cabang_id)->get();
2025-01-15 22:29:07 +07:00
$regions = Region::where('id', $cabangs->first()->region_id)->get();
$userIds = UserHasCabang::where('cabang_id', $cabang_id)->pluck('user_id');
$formsQuery->whereIn('user_id', $userIds);
2025-01-08 15:01:42 +07:00
}
} else {
$cabangs = Cabang::all();
2025-01-10 13:38:11 +07:00
$regions = Region::all();
2025-01-08 15:01:42 +07:00
}
2025-01-08 14:12:45 +07:00
2025-01-15 22:29:07 +07:00
// Apply filters from URL params
2025-01-08 15:01:42 +07:00
$params = request()->all();
2025-01-15 22:29:07 +07:00
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);
2025-01-10 13:38:11 +07:00
}
2025-01-15 22:29:07 +07:00
}
2025-01-10 13:38:11 +07:00
2025-01-15 22:29:07 +07:00
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);
2025-01-08 15:01:42 +07:00
}
2025-01-15 22:29:07 +07:00
}
2025-01-08 15:01:42 +07:00
2025-01-15 22:29:07 +07:00
if (isset($params['start_date']) || isset($params['end_date'])) {
$startDate = $params['start_date'] ?? null;
$endDate = $params['end_date'] ?? null;
2025-01-08 15:01:42 +07:00
2025-01-15 22:29:07 +07:00
if ($startDate && $endDate) {
$formsQuery->whereBetween('tanggal', [$startDate, $endDate]);
} elseif ($startDate) {
$formsQuery->where('tanggal', '>=', $startDate);
} elseif ($endDate) {
$formsQuery->where('tanggal', '<=', $endDate);
2025-01-08 15:01:42 +07:00
}
2025-01-15 22:29:07 +07:00
}
2025-01-08 15:01:42 +07:00
2025-01-15 22:29:07 +07:00
if (isset($params['status'])) {
$formsQuery->where('status', $params['status']);
2025-01-08 15:01:42 +07:00
}
2025-01-15 22:29:07 +07:00
// Fetch forms after applying all filters
$forms = $formsQuery->get();
2025-01-10 13:38:11 +07:00
2025-01-08 15:36:08 +07:00
return view('backend.pages.report.upcountry', [
2025-01-08 15:01:42 +07:00
'pageInfo' => [
2025-01-08 15:36:08 +07:00
'title' => 'Generate Reports For Form Up Country',
],
'forms' => $forms,
2025-01-10 13:38:11 +07:00
'cabang' => $cabangs,
'regions' => $regions
2025-01-08 15:36:08 +07:00
]);
}
2025-01-15 22:29:07 +07:00
2025-01-08 15:36:08 +07:00
public function vehicle()
{
$role = auth()->user()->getRoleNames()[0];
2025-01-15 22:29:07 +07:00
$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'
]);
2025-01-08 15:36:08 +07:00
2025-01-15 22:29:07 +07:00
// Apply role-based query logic
2025-01-08 15:36:08 +07:00
if ($role == 'Admin Region' || $role == 'Marketing Operational Manager Region') {
$region_id = auth()->user()->getMyCabangAndRegionId()['region'];
if ($region_id) {
$cabangs = Cabang::where('region_id', $region_id)->get();
2025-01-10 13:38:11 +07:00
$regions = Region::where('id', $region_id)->get();
2025-01-15 22:29:07 +07:00
$userIds = UserHasCabang::whereIn('cabang_id', $cabangs->pluck('id'))->pluck('user_id');
$formsQuery->whereIn('user_id', $userIds);
2025-01-08 15:36:08 +07:00
}
2025-01-15 22:29:07 +07:00
} elseif ($role == 'Area Manager Cabang') {
2025-01-08 15:36:08 +07:00
$cabang_id = auth()->user()->getMyCabangAndRegionId()['cabang'];
if ($cabang_id) {
$cabangs = Cabang::where('id', $cabang_id)->get();
2025-01-15 22:29:07 +07:00
$regions = Region::where('id', $cabangs->first()->region_id)->get();
$userIds = UserHasCabang::where('cabang_id', $cabang_id)->pluck('user_id');
$formsQuery->whereIn('user_id', $userIds);
2025-01-08 15:36:08 +07:00
}
} else {
2025-01-15 22:29:07 +07:00
// Default behavior for other roles (if no specific role is matched)
2025-01-08 15:36:08 +07:00
$cabangs = Cabang::all();
2025-01-10 13:38:11 +07:00
$regions = Region::all();
2025-01-08 15:36:08 +07:00
}
2025-01-15 22:29:07 +07:00
// Get all params in URL for filtering
2025-01-08 15:36:08 +07:00
$params = request()->all();
2025-01-10 13:38:11 +07:00
if ($params) {
// Filter by region
if (isset($params['region'])) {
$region = Region::where('code', $params['region'])->first();
if ($region) {
2025-01-15 22:29:07 +07:00
$userIds = UserHasCabang::whereIn('cabang_id', Cabang::where('region_id', $region->id)->pluck('id'))->pluck('user_id');
$formsQuery->whereIn('user_id', $userIds);
2025-01-10 13:38:11 +07:00
}
2025-01-08 15:36:08 +07:00
}
2025-01-10 13:38:11 +07:00
// Filter by cabang
if (isset($params['cabang'])) {
$cabang = Cabang::where('code', $params['cabang'])->first();
if ($cabang) {
2025-01-15 22:29:07 +07:00
$userIds = UserHasCabang::where('cabang_id', $cabang->id)->pluck('user_id');
$formsQuery->whereIn('user_id', $userIds);
2025-01-10 13:38:11 +07:00
}
2025-01-08 15:36:08 +07:00
}
2025-01-10 13:38:11 +07:00
// Filter by date range
if (isset($params['start_date']) || isset($params['end_date'])) {
$startDate = $params['start_date'] ?? null;
$endDate = $params['end_date'] ?? null;
2025-01-08 15:36:08 +07:00
2025-01-10 13:38:11 +07:00
if ($startDate && $endDate) {
2025-01-15 22:29:07 +07:00
$formsQuery->whereBetween('tanggal', [$startDate, $endDate]);
2025-01-10 13:38:11 +07:00
} elseif ($startDate) {
2025-01-15 22:29:07 +07:00
$formsQuery->where('tanggal', '>=', $startDate);
2025-01-10 13:38:11 +07:00
} elseif ($endDate) {
2025-01-15 22:29:07 +07:00
$formsQuery->where('tanggal', '<=', $endDate);
2025-01-10 13:38:11 +07:00
}
2025-01-08 15:36:08 +07:00
}
2025-01-10 13:38:11 +07:00
// Filter by status
if (isset($params['status'])) {
2025-01-15 22:29:07 +07:00
$formsQuery->where('status', $params['status']);
2025-01-08 15:36:08 +07:00
}
}
2025-01-15 22:29:07 +07:00
// Fetch forms after applying all filters
$forms = $formsQuery->get();
2025-01-08 15:36:08 +07:00
return view('backend.pages.report.vehicle', [
'pageInfo' => [
'title' => 'Generate Reports For Form Vehicle Running Cost',
],
'forms' => $forms,
2025-01-10 13:38:11 +07:00
'cabang' => $cabangs,
'regions' => $regions
2025-01-08 15:36:08 +07:00
]);
}
public function entertainment()
{
$role = auth()->user()->getRoleNames()[0];
2025-01-15 22:29:07 +07:00
$cabangs = Cabang::all();
$regions = Region::all();
$formsQuery = FormEntertaimentPresentation::with([
'user.region', // Eager load 'region' within 'user'
'user.cabang', // Eager load 'cabang' within 'user'
]);
2025-01-08 15:36:08 +07:00
2025-01-15 22:29:07 +07:00
// Apply role-based query logic
2025-01-08 15:36:08 +07:00
if ($role == 'Admin Region' || $role == 'Marketing Operational Manager Region') {
$region_id = auth()->user()->getMyCabangAndRegionId()['region'];
if ($region_id) {
$cabangs = Cabang::where('region_id', $region_id)->get();
2025-01-10 13:38:11 +07:00
$regions = Region::where('id', $region_id)->get();
2025-01-15 22:29:07 +07:00
$userIds = UserHasCabang::whereIn('cabang_id', $cabangs->pluck('id'))->pluck('user_id');
$formsQuery->whereIn('user_id', $userIds);
2025-01-08 15:36:08 +07:00
}
2025-01-15 22:29:07 +07:00
} elseif ($role == 'Area Manager Cabang') {
2025-01-08 15:36:08 +07:00
$cabang_id = auth()->user()->getMyCabangAndRegionId()['cabang'];
if ($cabang_id) {
$cabangs = Cabang::where('id', $cabang_id)->get();
2025-01-15 22:29:07 +07:00
$regions = Region::where('id', $cabangs->first()->region_id)->get();
$userIds = UserHasCabang::where('cabang_id', $cabang_id)->pluck('user_id');
$formsQuery->whereIn('user_id', $userIds);
2025-01-08 15:36:08 +07:00
}
}
2025-01-15 22:29:07 +07:00
// Get all params in URL for filtering
2025-01-08 15:36:08 +07:00
$params = request()->all();
2025-01-10 13:38:11 +07:00
if ($params) {
// Filter by region
if (isset($params['region'])) {
$region = Region::where('code', $params['region'])->first();
if ($region) {
2025-01-15 22:29:07 +07:00
$userIds = UserHasCabang::whereIn('cabang_id', Cabang::where('region_id', $region->id)->pluck('id'))->pluck('user_id');
$formsQuery->whereIn('user_id', $userIds);
2025-01-10 13:38:11 +07:00
}
2025-01-08 15:36:08 +07:00
}
2025-01-10 13:38:11 +07:00
// Filter by cabang
if (isset($params['cabang'])) {
$cabang = Cabang::where('code', $params['cabang'])->first();
if ($cabang) {
2025-01-15 22:29:07 +07:00
$userIds = UserHasCabang::where('cabang_id', $cabang->id)->pluck('user_id');
$formsQuery->whereIn('user_id', $userIds);
2025-01-10 13:38:11 +07:00
}
2025-01-08 15:36:08 +07:00
}
2025-01-10 13:38:11 +07:00
// Filter by date range
if (isset($params['start_date']) || isset($params['end_date'])) {
$startDate = $params['start_date'] ?? null;
$endDate = $params['end_date'] ?? null;
2025-01-08 15:36:08 +07:00
2025-01-10 13:38:11 +07:00
if ($startDate && $endDate) {
2025-01-15 22:29:07 +07:00
$formsQuery->whereBetween('tanggal', [$startDate, $endDate]);
2025-01-10 13:38:11 +07:00
} elseif ($startDate) {
2025-01-15 22:29:07 +07:00
$formsQuery->where('tanggal', '>=', $startDate);
2025-01-10 13:38:11 +07:00
} elseif ($endDate) {
2025-01-15 22:29:07 +07:00
$formsQuery->where('tanggal', '<=', $endDate);
2025-01-10 13:38:11 +07:00
}
2025-01-08 15:36:08 +07:00
}
2025-01-10 13:38:11 +07:00
// Filter by status
if (isset($params['status'])) {
2025-01-15 22:29:07 +07:00
$formsQuery->where('status', $params['status']);
2025-01-08 15:36:08 +07:00
}
}
2025-01-15 22:29:07 +07:00
// Fetch forms after applying all filters
$forms = $formsQuery->get();
2025-01-08 15:36:08 +07:00
return view('backend.pages.report.entertainment', [
'pageInfo' => [
'title' => 'Generate Reports For Form Entertainment & Presentation',
],
'forms' => $forms,
2025-01-10 13:38:11 +07:00
'cabang' => $cabangs,
'regions' => $regions
2025-01-08 15:36:08 +07:00
]);
}
public function meeting()
{
$role = auth()->user()->getRoleNames()[0];
2025-01-15 22:29:07 +07:00
$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'
]);
2025-01-08 15:36:08 +07:00
2025-01-15 22:29:07 +07:00
// Apply role-based query logic
2025-01-08 15:36:08 +07:00
if ($role == 'Admin Region' || $role == 'Marketing Operational Manager Region') {
$region_id = auth()->user()->getMyCabangAndRegionId()['region'];
if ($region_id) {
$cabangs = Cabang::where('region_id', $region_id)->get();
2025-01-10 13:38:11 +07:00
$regions = Region::where('id', $region_id)->get();
2025-01-15 22:29:07 +07:00
$userIds = UserHasCabang::whereIn('cabang_id', $cabangs->pluck('id'))->pluck('user_id');
$formsQuery->whereIn('user_id', $userIds);
2025-01-08 15:36:08 +07:00
}
2025-01-15 22:29:07 +07:00
} elseif ($role == 'Area Manager Cabang') {
2025-01-08 15:36:08 +07:00
$cabang_id = auth()->user()->getMyCabangAndRegionId()['cabang'];
if ($cabang_id) {
$cabangs = Cabang::where('id', $cabang_id)->get();
2025-01-15 22:29:07 +07:00
$regions = Region::where('id', $cabangs->first()->region_id)->get();
$userIds = UserHasCabang::where('cabang_id', $cabang_id)->pluck('user_id');
$formsQuery->whereIn('user_id', $userIds);
2025-01-08 15:36:08 +07:00
}
}
2025-01-15 22:29:07 +07:00
// Get all params in URL for filtering
2025-01-08 15:36:08 +07:00
$params = request()->all();
2025-01-10 13:38:11 +07:00
if ($params) {
// Filter by region
if (isset($params['region'])) {
$region = Region::where('code', $params['region'])->first();
if ($region) {
2025-01-15 22:29:07 +07:00
$userIds = UserHasCabang::whereIn('cabang_id', Cabang::where('region_id', $region->id)->pluck('id'))->pluck('user_id');
$formsQuery->whereIn('user_id', $userIds);
2025-01-10 13:38:11 +07:00
}
2025-01-08 15:36:08 +07:00
}
2025-01-10 13:38:11 +07:00
// Filter by cabang
if (isset($params['cabang'])) {
$cabang = Cabang::where('code', $params['cabang'])->first();
if ($cabang) {
2025-01-15 22:29:07 +07:00
$userIds = UserHasCabang::where('cabang_id', $cabang->id)->pluck('user_id');
$formsQuery->whereIn('user_id', $userIds);
2025-01-10 13:38:11 +07:00
}
2025-01-08 15:36:08 +07:00
}
2025-01-10 13:38:11 +07:00
// Filter by date range
if (isset($params['start_date']) || isset($params['end_date'])) {
$startDate = $params['start_date'] ?? null;
$endDate = $params['end_date'] ?? null;
2025-01-08 15:36:08 +07:00
2025-01-10 13:38:11 +07:00
if ($startDate && $endDate) {
2025-01-15 22:29:07 +07:00
$formsQuery->whereBetween('tanggal', [$startDate, $endDate]);
2025-01-10 13:38:11 +07:00
} elseif ($startDate) {
2025-01-15 22:29:07 +07:00
$formsQuery->where('tanggal', '>=', $startDate);
2025-01-10 13:38:11 +07:00
} elseif ($endDate) {
2025-01-15 22:29:07 +07:00
$formsQuery->where('tanggal', '<=', $endDate);
2025-01-10 13:38:11 +07:00
}
2025-01-08 15:36:08 +07:00
}
2025-01-10 13:38:11 +07:00
// Filter by status
if (isset($params['status'])) {
2025-01-15 22:29:07 +07:00
$formsQuery->where('status', $params['status']);
2025-01-08 15:36:08 +07:00
}
}
2025-01-15 22:29:07 +07:00
// Fetch forms after applying all filters
$forms = $formsQuery->get();
2025-01-08 15:36:08 +07:00
return view('backend.pages.report.meeting', [
'pageInfo' => [
'title' => 'Generate Reports For Form Meeting & Seminar',
],
'forms' => $forms,
2025-01-10 13:38:11 +07:00
'cabang' => $cabangs,
'regions' => $regions
2025-01-08 15:36:08 +07:00
]);
}
public function others()
{
$role = auth()->user()->getRoleNames()[0];
2025-01-15 22:29:07 +07:00
$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'
]);
2025-01-08 15:36:08 +07:00
2025-01-15 22:29:07 +07:00
// Apply role-based query logic
2025-01-08 15:36:08 +07:00
if ($role == 'Admin Region' || $role == 'Marketing Operational Manager Region') {
$region_id = auth()->user()->getMyCabangAndRegionId()['region'];
if ($region_id) {
$cabangs = Cabang::where('region_id', $region_id)->get();
2025-01-10 13:38:11 +07:00
$regions = Region::where('id', $region_id)->get();
2025-01-15 22:29:07 +07:00
$userIds = UserHasCabang::whereIn('cabang_id', $cabangs->pluck('id'))->pluck('user_id');
$formsQuery->whereIn('user_id', $userIds);
2025-01-08 15:36:08 +07:00
}
2025-01-15 22:29:07 +07:00
} elseif ($role == 'Area Manager Cabang') {
2025-01-08 15:36:08 +07:00
$cabang_id = auth()->user()->getMyCabangAndRegionId()['cabang'];
if ($cabang_id) {
$cabangs = Cabang::where('id', $cabang_id)->get();
2025-01-15 22:29:07 +07:00
$regions = Region::where('id', $cabangs->first()->region_id)->get();
$userIds = UserHasCabang::where('cabang_id', $cabang_id)->pluck('user_id');
$formsQuery->whereIn('user_id', $userIds);
2025-01-08 15:36:08 +07:00
}
}
2025-01-15 22:29:07 +07:00
// Get all params in URL for filtering
2025-01-08 15:36:08 +07:00
$params = request()->all();
2025-01-10 13:38:11 +07:00
if ($params) {
// Filter by region
if (isset($params['region'])) {
$region = Region::where('code', $params['region'])->first();
if ($region) {
2025-01-15 22:29:07 +07:00
$userIds = UserHasCabang::whereIn('cabang_id', Cabang::where('region_id', $region->id)->pluck('id'))->pluck('user_id');
$formsQuery->whereIn('user_id', $userIds);
2025-01-10 13:38:11 +07:00
}
2025-01-08 15:36:08 +07:00
}
2025-01-10 13:38:11 +07:00
// Filter by cabang
if (isset($params['cabang'])) {
$cabang = Cabang::where('code', $params['cabang'])->first();
if ($cabang) {
2025-01-15 22:29:07 +07:00
$userIds = UserHasCabang::where('cabang_id', $cabang->id)->pluck('user_id');
$formsQuery->whereIn('user_id', $userIds);
2025-01-10 13:38:11 +07:00
}
2025-01-08 15:36:08 +07:00
}
2025-01-10 13:38:11 +07:00
// Filter by date range
if (isset($params['start_date']) || isset($params['end_date'])) {
$startDate = $params['start_date'] ?? null;
$endDate = $params['end_date'] ?? null;
2025-01-08 15:36:08 +07:00
2025-01-10 13:38:11 +07:00
if ($startDate && $endDate) {
2025-01-15 22:29:07 +07:00
$formsQuery->whereBetween('tanggal', [$startDate, $endDate]);
2025-01-10 13:38:11 +07:00
} elseif ($startDate) {
2025-01-15 22:29:07 +07:00
$formsQuery->where('tanggal', '>=', $startDate);
2025-01-10 13:38:11 +07:00
} elseif ($endDate) {
2025-01-15 22:29:07 +07:00
$formsQuery->where('tanggal', '<=', $endDate);
2025-01-10 13:38:11 +07:00
}
2025-01-08 15:36:08 +07:00
}
2025-01-10 13:38:11 +07:00
// Filter by status
if (isset($params['status'])) {
2025-01-15 22:29:07 +07:00
$formsQuery->where('status', $params['status']);
2025-01-08 15:36:08 +07:00
}
}
2025-01-15 22:29:07 +07:00
// Fetch forms after applying all filters
$forms = $formsQuery->get();
2025-01-08 15:36:08 +07:00
return view('backend.pages.report.others', [
'pageInfo' => [
'title' => 'Generate Reports For Form Others',
2025-01-08 15:01:42 +07:00
],
'forms' => $forms,
2025-01-10 13:38:11 +07:00
'cabang' => $cabangs,
'regions' => $regions
2025-01-08 15:01:42 +07:00
]);
2025-01-08 14:12:45 +07:00
}
2025-01-11 13:31:44 +07:00
public function all()
{
2025-10-23 17:21:46 +07:00
$role = auth()->user()->getRoleNames()[0];
$cabangs = collect();
$regions = collect();
2025-01-11 13:31:44 +07:00
$availableBudget = 0;
2025-10-23 17:21:46 +07:00
$currentMonthKey = strtolower(date('F'));
$currentYear = (int) date('Y');
2025-01-11 13:31:44 +07:00
2025-10-23 17:21:46 +07:00
$userRegionData = auth()->user()->getMyCabangAndRegionId();
$region_id = isset($userRegionData['region']) && $userRegionData['region'] !== '-' ? (int) $userRegionData['region'] : null;
$cabang_id = isset($userRegionData['cabang']) && $userRegionData['cabang'] !== '-' ? (int) $userRegionData['cabang'] : null;
2025-01-11 13:31:44 +07:00
$userId = auth()->user()->id;
2025-10-23 17:21:46 +07:00
$userFilter = null;
$statusFilter = null;
$dateRange = null;
$selectedMonth = $currentMonthKey;
$selectedYear = $currentYear;
$monthLookup = [
'january' => 'January',
'february' => 'February',
'march' => 'March',
'april' => 'April',
'may' => 'May',
'june' => 'June',
'july' => 'July',
'august' => 'August',
'september' => 'September',
'october' => 'October',
'november' => 'November',
'december' => 'December',
];
$applyUserFilter = static function (array $ids) use (&$userFilter): void {
$ids = array_values(array_unique(array_filter($ids, static fn ($id) => !is_null($id))));
if (empty($ids)) {
$userFilter = [];
return;
}
if (is_null($userFilter)) {
$userFilter = $ids;
} else {
$userFilter = array_values(array_intersect($userFilter, $ids));
}
};
2025-07-21 19:47:08 +07:00
2025-01-11 13:31:44 +07:00
if ($role == 'Admin Region' || $role == 'Marketing Operational Manager Region') {
if ($region_id) {
$cabangs = Cabang::where('region_id', $region_id)->get();
$regions = Region::where('id', $region_id)->get();
2025-10-23 17:21:46 +07:00
$userIds = UserHasCabang::whereIn('cabang_id', $cabangs->pluck('id'))->pluck('user_id')->toArray();
$applyUserFilter($userIds);
2025-07-21 19:47:08 +07:00
} else {
2025-10-23 17:21:46 +07:00
$userFilter = [];
2025-01-11 13:31:44 +07:00
}
} elseif ($role == 'Area Manager Cabang') {
if ($cabang_id) {
$cabangs = Cabang::where('id', $cabang_id)->get();
2025-10-23 17:21:46 +07:00
$regions = $cabangs->isNotEmpty() ? Region::where('id', $cabangs->first()->region_id)->get() : collect();
$userIds = UserHasCabang::where('cabang_id', $cabang_id)->pluck('user_id')->toArray();
$applyUserFilter($userIds);
2025-07-21 19:47:08 +07:00
} else {
2025-10-23 17:21:46 +07:00
$userFilter = [];
2025-07-21 19:47:08 +07:00
}
} elseif ($role == 'Medical Representatif') {
2025-10-23 17:21:46 +07:00
$applyUserFilter([$userId]);
$cabangs = collect();
$regions = collect();
2025-01-11 13:31:44 +07:00
} else {
$cabangs = Cabang::all();
$regions = Region::all();
}
$params = request()->all();
2025-10-23 17:21:46 +07:00
if (!empty($params['region'])) {
$selectedRegion = Region::where('code', $params['region'])->first();
$regionUserIds = $selectedRegion
? UserHasCabang::whereIn('cabang_id', Cabang::where('region_id', $selectedRegion->id)->pluck('id'))->pluck('user_id')->toArray()
: [];
$applyUserFilter($regionUserIds);
if ($selectedRegion && ($regions->isEmpty() || in_array($role, ['Superadmin', 'Admin'], true))) {
$regions = Region::all();
2025-01-11 13:31:44 +07:00
}
2025-10-23 17:21:46 +07:00
}
2025-01-11 13:31:44 +07:00
2025-10-23 17:21:46 +07:00
if (!empty($params['month']) || !empty($params['year'])) {
$selectedMonth = strtolower($params['month'] ?? $selectedMonth);
$selectedYear = (int) ($params['year'] ?? $selectedYear);
2025-07-21 19:47:08 +07:00
2025-10-23 17:21:46 +07:00
if (!isset($monthLookup[$selectedMonth])) {
$selectedMonth = $currentMonthKey;
2025-01-11 13:31:44 +07:00
}
2025-10-23 17:21:46 +07:00
$monthName = $monthLookup[$selectedMonth];
$startOfMonth = Carbon::parse("first day of {$monthName} {$selectedYear}")->startOfDay();
$endOfMonth = Carbon::parse("last day of {$monthName} {$selectedYear}")->endOfDay();
$dateRange = [$startOfMonth, $endOfMonth];
}
2025-01-11 13:31:44 +07:00
2025-10-23 17:21:46 +07:00
if (!empty($params['cabang'])) {
$selectedCabang = Cabang::where('code', $params['cabang'])->first();
$cabangUserIds = $selectedCabang
? UserHasCabang::where('cabang_id', $selectedCabang->id)->pluck('user_id')->toArray()
: [];
$applyUserFilter($cabangUserIds);
if ($selectedCabang) {
$availableBudget = BudgetHelper::getAvailableBudget($selectedCabang->id, $selectedMonth, $selectedYear);
}
} elseif ($cabang_id && $dateRange) {
$cabang = Cabang::find($cabang_id);
if ($cabang) {
$availableBudget = BudgetHelper::getAvailableBudget($cabang->id, $selectedMonth, $selectedYear);
2025-01-11 13:31:44 +07:00
}
}
2025-10-23 17:21:46 +07:00
if (!empty($params['status'])) {
$statusFilter = $params['status'];
}
$tables = [
2025-10-12 18:29:07 +07:00
'form_others',
'form_up_country',
'form_vehicle_running_cost',
'form_meeting_seminar',
2025-10-23 17:21:46 +07:00
'form_entertainment_presentation',
2025-10-12 18:29:07 +07:00
];
$formsQuery = null;
foreach ($tables as $table) {
2025-10-23 17:21:46 +07:00
$dateColumn = Schema::hasColumn($table, 'tanggal') ? 'tanggal' : 'created_at';
2025-10-12 18:29:07 +07:00
$query = DB::table($table)
->selectRaw("
2025-10-23 17:21:46 +07:00
id,
2025-10-12 18:29:07 +07:00
expense_number,
'$table' as type,
user_id,
total,
approved_total,
account_number,
status,
2025-10-23 17:21:46 +07:00
$dateColumn as report_date,
2025-10-12 18:29:07 +07:00
created_at
");
2025-10-23 17:21:46 +07:00
if (!is_null($userFilter)) {
$query->whereIn('user_id', $userFilter);
}
2025-10-12 18:29:07 +07:00
2025-10-23 17:21:46 +07:00
if ($statusFilter !== null) {
$query->where('status', $statusFilter);
}
2025-10-12 18:29:07 +07:00
2025-10-23 17:21:46 +07:00
if ($dateRange) {
$query->whereBetween($dateColumn, $dateRange);
}
2025-10-12 18:29:07 +07:00
2025-10-23 17:21:46 +07:00
if (Schema::hasColumn($table, 'deleted_at')) {
$query->whereNull('deleted_at');
}
2025-10-12 18:29:07 +07:00
2025-10-23 17:21:46 +07:00
$formsQuery = $formsQuery
? $formsQuery->unionAll($query)
: $query;
}
2025-07-21 19:47:08 +07:00
2025-10-23 17:21:46 +07:00
if (!$formsQuery) {
$forms = collect();
} else {
$forms = DB::query()
->fromSub($formsQuery, 'forms')
->join('admins', 'admins.id', '=', 'forms.user_id')
->select('forms.*', 'admins.id as admin_id')
->orderByDesc('forms.report_date')
->paginate(100)
->appends($params);
$forms->getCollection()->transform(function ($item) {
$item->user = \App\Models\Admin::with([
'region.cabang.region',
'cabang.cabang.region',
'rayon.region',
])->find($item->admin_id);
$item->type = ucwords(str_replace('_', ' ', str_replace('form_', '', $item->type)));
return $item;
});
}
2025-07-21 19:47:08 +07:00
2025-01-11 13:31:44 +07:00
return view('backend.pages.report.all', [
'pageInfo' => [
'title' => 'Generate Reports For All Forms',
],
'forms' => $forms,
2025-10-23 17:21:46 +07:00
'cabangs' => $cabangs,
2025-01-11 13:31:44 +07:00
'regions' => $regions,
2025-10-23 17:21:46 +07:00
'availableBudget' => $availableBudget,
2025-01-11 13:31:44 +07:00
]);
}
2025-01-14 14:15:32 +07:00
public function jurnal()
{
$role = auth()->user()->getRoleNames()[0];
$cabangs = [];
2025-01-15 14:50:53 +07:00
$regions = [];
2025-01-14 14:15:32 +07:00
if ($role == 'Admin Region' || $role == 'Marketing Operational Manager Region') {
$region_id = auth()->user()->getMyCabangAndRegionId()['region'];
if ($region_id) {
$cabangs = Cabang::where('region_id', $region_id)->get();
2025-01-15 14:50:53 +07:00
$regions = Region::where('id', $region_id)->get();
2025-01-14 14:15:32 +07:00
}
} else if ($role == 'Area Manager Cabang') {
$cabang_id = auth()->user()->getMyCabangAndRegionId()['cabang'];
if ($cabang_id) {
$cabangs = Cabang::where('id', $cabang_id)->get();
2025-01-15 14:50:53 +07:00
$regions = Region::where('id', $cabangs[0]->region_id)->get();
2025-01-14 14:15:32 +07:00
}
2025-10-23 17:21:46 +07:00
} else if ($role == 'Superadmin') {
$regions = Region::all();
$cabangs = collect();
$selectedRegionCode = request()->get('region');
if ($selectedRegionCode) {
$selectedRegion = Region::where('code', $selectedRegionCode)->first();
if ($selectedRegion) {
$cabangs = Cabang::where('region_id', $selectedRegion->id)->get();
} else {
$cabangs = Cabang::all();
}
} else {
$cabangs = Cabang::all();
}
2025-01-14 14:15:32 +07:00
} else {
$cabangs = Cabang::all();
2025-01-15 14:50:53 +07:00
$regions = Region::all();
2025-01-14 14:15:32 +07:00
}
return view('backend.pages.report.jurnal', [
'pageInfo' => [
'title' => 'Generate Reports For Jurnal',
],
'cabang' => $cabangs,
2025-01-15 14:50:53 +07:00
'regions' => $regions
2025-01-14 14:15:32 +07:00
]);
}
2025-05-05 19:40:38 +07:00
public function generateJurnal()
{
2025-01-14 14:15:32 +07:00
$params = request()->all();
$kategori_bca = Kategori::where('name', 'Cash in Bank BCA')->first();
2025-10-23 17:21:46 +07:00
$excludedCategories = [
'Cash in Bank BCA',
'Donasi/Gift',
'PPn Masukan',
'Vehicle Maintenance',
'Bahan Promosi',
'Sponsorship',
'Presentation',
];
$kategoris = Kategori::whereNotIn('name', $excludedCategories)->get();
2025-05-05 19:40:38 +07:00
$cabang = Cabang::with('cost')->where('code', $params['cabang'])->firstOrFail();
2025-01-15 22:29:07 +07:00
2025-01-14 14:15:32 +07:00
$year = $params['year'];
2025-05-05 19:40:38 +07:00
$month = $params['month']; // format: angka atau teks bulan (pastikan valid)
// Hitung range periode (11 bulan_ini - 10 bulan_depan)
[$startDate, $endDate] = PeriodeHelper::getPeriodeRange($month, $year);
2025-01-14 14:15:32 +07:00
2025-05-05 19:40:38 +07:00
// Ambil data terakhir dari log budget
$budget = BudgetControlLog::where('cabang_id', $cabang->id)
->where('periode_year', $year)
->where('periode_month', $month)
->orderBy('created_at', 'desc')
->first();
2025-03-06 16:24:55 +07:00
2025-01-15 22:29:07 +07:00
$userIds = UserHasCabang::where('cabang_id', $cabang->id)->pluck('user_id');
2025-05-05 19:40:38 +07:00
// Fetch semua forms berdasarkan periode range
2025-01-15 22:29:07 +07:00
$forms = [
'Up Country' => FormUpCountry::whereIn('user_id', $userIds)
2025-06-27 16:19:28 +07:00
->whereBetween('final_approved_at', [$startDate, $endDate])
2025-05-05 23:19:22 +07:00
->whereIn('status', ['Approved', 'Closed'])
2025-01-15 22:29:07 +07:00
->get(),
2025-05-05 19:40:38 +07:00
2025-01-15 22:29:07 +07:00
'Vehicle Running Cost' => FormVehicleRunningCost::whereIn('user_id', $userIds)
2025-06-27 16:19:28 +07:00
->whereBetween('final_approved_at', [$startDate, $endDate])
2025-05-05 23:19:22 +07:00
->whereIn('status', ['Approved', 'Closed'])
2025-01-15 22:29:07 +07:00
->get(),
2025-05-05 19:40:38 +07:00
2025-01-15 22:29:07 +07:00
'Entertainment' => FormEntertaimentPresentation::whereIn('user_id', $userIds)
2025-06-27 16:19:28 +07:00
->whereBetween('final_approved_at', [$startDate, $endDate])
2025-05-05 23:19:22 +07:00
->whereIn('status', ['Approved', 'Closed'])
2025-01-15 22:29:07 +07:00
->get(),
2025-05-05 19:40:38 +07:00
2025-01-15 22:29:07 +07:00
'Meeting / Seminar' => FormMeetingSeminar::whereIn('user_id', $userIds)
2025-06-27 16:19:28 +07:00
->whereBetween('final_approved_at', [$startDate, $endDate])
2025-05-05 23:19:22 +07:00
->whereIn('status', ['Approved', 'Closed'])
2025-01-15 22:29:07 +07:00
->get(),
];
2025-05-05 19:40:38 +07:00
// Forms "Others" dikelompokkan berdasarkan kategori
2025-01-15 22:29:07 +07:00
$otherForms = FormOthers::whereIn('user_id', $userIds)
2025-06-27 16:19:28 +07:00
->whereBetween('final_approved_at', [$startDate, $endDate])
2025-05-05 23:19:22 +07:00
->whereIn('status', ['Approved', 'Closed'])
2025-01-15 22:29:07 +07:00
->get();
2025-05-05 19:40:38 +07:00
// Total nominal per kategori
2025-01-15 22:29:07 +07:00
$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');
}
}
2025-01-14 14:15:32 +07:00
2025-10-12 20:47:43 +07:00
$totalKategori = array_sum($nominals);
$pettyCashAmount = $budget && $budget->amount ? $budget->amount : 0;
2025-01-14 14:15:32 +07:00
return view('backend.pages.report.generate_jurnal', [
'pageInfo' => [
'title' => 'Generate Reports For Jurnal',
],
'kategori' => $kategoris,
'cabang' => $cabang,
'year' => $year,
'month' => $month,
2025-01-15 22:29:07 +07:00
'kategori_bca' => $kategori_bca,
'nominals' => $nominals,
2025-05-05 19:40:38 +07:00
'budget' => $budget,
2025-10-12 20:47:43 +07:00
'totalKategori' => $totalKategori,
'pettyCashAmount' => $pettyCashAmount,
2025-01-14 14:15:32 +07:00
]);
}
2025-01-08 14:12:45 +07:00
}