fix load data dealer base on user with pivot or not

This commit is contained in:
2025-07-10 12:24:11 +07:00
parent e59841fd23
commit b632996052
5 changed files with 223 additions and 19 deletions

View File

@@ -6,9 +6,12 @@ use App\Models\Product;
use App\Models\Dealer;
use App\Models\Stock;
use App\Models\StockLog;
use App\Models\Role;
use App\Models\User;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Auth;
class StockReportService
{
@@ -19,8 +22,8 @@ class StockReportService
{
$targetDate = $targetDate ? Carbon::parse($targetDate) : now();
// Get all dealers
$dealers = Dealer::orderBy('name')->get();
// Get dealers based on user role
$dealers = $this->getDealersBasedOnUserRole();
// Get all active products
$products = Product::where('active', true)
@@ -98,8 +101,8 @@ class StockReportService
{
$targetDate = $targetDate ? Carbon::parse($targetDate) : now();
// Get all dealers
$dealers = Dealer::orderBy('name')->get();
// Get dealers based on user role
$dealers = $this->getDealersBasedOnUserRole();
// Get all active products with their stock data
$products = Product::where('active', true)
@@ -135,6 +138,117 @@ class StockReportService
];
}
/**
* Get dealers based on logged-in user's role
*/
public function getDealersBasedOnUserRole()
{
// Get current authenticated user
$user = Auth::user();
if (!$user) {
Log::warning('No authenticated user found, returning all dealers');
return Dealer::whereNull('deleted_at')->orderBy('name')->get();
}
Log::info('Getting dealers for user:', [
'user_id' => $user->id,
'user_role_id' => $user->role_id,
'user_dealer_id' => $user->dealer_id
]);
// If user has role, check role type and dealer access
if ($user->role_id) {
$role = Role::with(['dealers' => function($query) {
$query->whereNull('dealers.deleted_at'); // Only active dealers
}])->find($user->role_id);
if ($role) {
// Check if role is admin type
if ($this->isAdminRole($role)) {
// Admin role - check if has pivot dealers
if ($role->dealers->count() > 0) {
// Admin with pivot dealers - return pivot dealers only
Log::info('Admin role with pivot dealers, returning pivot dealers only');
$dealers = $role->dealers()->whereNull('dealers.deleted_at')->orderBy('name')->get();
Log::info('Returning pivot dealers for admin:', $dealers->pluck('name')->toArray());
return $dealers;
} else {
// Admin without pivot dealers - return all dealers
Log::info('Admin role without pivot dealers, returning all dealers');
$allDealers = Dealer::whereNull('deleted_at')->orderBy('name')->get();
Log::info('Returning all dealers for admin:', $allDealers->pluck('name')->toArray());
return $allDealers;
}
}
// Non-admin role - return dealers from role pivot
if ($role->dealers->count() > 0) {
Log::info('Non-admin role with dealers, returning role dealers');
$dealers = $role->dealers()->whereNull('dealers.deleted_at')->orderBy('name')->get();
Log::info('Returning dealers from role:', $dealers->pluck('name')->toArray());
return $dealers;
}
}
}
// If user has specific dealer_id but no role dealers, check if they can access their dealer_id
if ($user->dealer_id) {
Log::info('User has specific dealer_id:', ['dealer_id' => $user->dealer_id]);
if ($user->role_id) {
$role = Role::with(['dealers' => function($query) {
$query->whereNull('dealers.deleted_at'); // Only active dealers
}])->find($user->role_id);
if ($role && $role->hasDealer($user->dealer_id)) {
Log::info('User can access their dealer_id, returning single dealer');
$dealer = Dealer::where('id', $user->dealer_id)->whereNull('deleted_at')->orderBy('name')->get();
Log::info('Returning dealer:', $dealer->pluck('name')->toArray());
return $dealer;
} else {
Log::info('User cannot access their dealer_id');
}
}
Log::info('User has dealer_id but no role or no access, returning empty');
return collect();
}
// Fallback: return all dealers if no restrictions
Log::info('No restrictions found, returning all dealers');
$allDealers = Dealer::whereNull('deleted_at')->orderBy('name')->get();
Log::info('Returning all dealers:', $allDealers->pluck('name')->toArray());
return $allDealers;
}
/**
* Check if role is admin type (should show all dealers if no pivot)
*/
private function isAdminRole($role)
{
// Define admin role names that should have access to all dealers
$adminRoleNames = [
'admin'
];
// Check if role name contains admin keywords (but not "area")
$roleName = strtolower(trim($role->name));
foreach ($adminRoleNames as $adminName) {
if (strpos($roleName, $adminName) !== false && strpos($roleName, 'area') === false) {
Log::info('Role identified as admin type:', ['role_name' => $role->name]);
return true;
}
}
// Role with "area" in name should use pivot dealers, not all dealers
if (strpos($roleName, 'area') !== false) {
Log::info('Role contains "area", treating as area role (use pivot dealers):', ['role_name' => $role->name]);
return false;
}
Log::info('Role is not admin type:', ['role_name' => $role->name]);
return false;
}
/**
* Optimized method to get stock on date using subquery
*/

View File

@@ -450,11 +450,7 @@ class TechnicianReportService
{
// Define admin role names that should have access to all dealers
$adminRoleNames = [
'admin',
'super admin',
'administrator',
'sa',
'superadmin'
'admin'
];
// Check if role name contains admin keywords (but not "area")