fix load data dealer base on user with pivot or not
This commit is contained in:
@@ -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
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user