diff --git a/app/Config/Acl.php b/app/Config/Acl.php index 86760bb0..2960595f 100644 --- a/app/Config/Acl.php +++ b/app/Config/Acl.php @@ -30,6 +30,10 @@ class Acl '#^/util/download_log#' => ['roles' => [ADMIN_ROLE_ID]], '#^/metaDashboardDemo#' => ['roles' => [ADMIN_ROLE_ID, HEAD_ROLE_ID]], '#^/metaTpaDashboardDemo#' => ['roles' => [ADMIN_ROLE_ID, HEAD_ROLE_ID]], + '#^/sales/dashboard#' => ['roles' => [ADMIN_ROLE_ID, HEAD_ROLE_ID, STAFF_ROLE_ID]], + '#^/sales#' => ['roles' => [ADMIN_ROLE_ID, HEAD_ROLE_ID, STAFF_ROLE_ID]], + + // ===================== PUBLIC DOWNLOADS / FORMS ===================== '#^/download-#' => ['public' => true], diff --git a/app/Config/Routes.php b/app/Config/Routes.php index d7353cb7..403ab622 100755 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -912,7 +912,7 @@ $routes->group('sales', function($routes) { $routes->get('/', 'SalesController::index'); - $routes->get('activities', 'SalesController::activities'); + $routes->get('loadactivities', 'SalesController::loadactivities'); $routes->get('page/(:segment)', 'SalesController::noPage/$1'); @@ -996,6 +996,7 @@ $routes->group('sales', function($routes) { //Dashboard + $routes->get('dashboard', 'SalesController::dashboard'); $routes->get('branchLevelDashboard', 'SalesController::branchLevelDashboard'); $routes->get('salesManagerLevelDashboard', 'SalesController::salesManagerLevelDashboard'); }); diff --git a/app/Controllers/SalesController.php b/app/Controllers/SalesController.php index 459b919b..3de595f8 100644 --- a/app/Controllers/SalesController.php +++ b/app/Controllers/SalesController.php @@ -35,12 +35,11 @@ class SalesController extends BaseController $data = $this->getSalesStaffData(); $data['tab_name'] = 'Leads'; - $data['page_name'] = 'Leads'; - + $data['page_name'] = 'Leads'; return $this->loadLayout('sales/tracker_view', $data); } - public function activities(){ + public function loadactivities(){ $data = $this->getSalesStaffData(); $data['tab_name'] = 'Activities'; @@ -49,6 +48,7 @@ class SalesController extends BaseController $data['leads'] = $this->leadModel->select('lead_id, company_name') ->orderBy('lead_id', 'DESC') ->findAll(); + return $this->loadLayout('sales/activity_view', $data); } @@ -59,42 +59,36 @@ class SalesController extends BaseController private function getSalesStaffData(): array { $db = \Config\Database::connect(); - $logged_user_id = get_session_userid(); + $logged_user_id = get_session_userid(); + $role = get_role_id(); + $team_id = user_team(); $data = [ 'users' => [], 'sales_manager_ids' => [] ]; - // Get the Branch ID, Role, Team, and Name of the logged-in user - $row = $db->table('user_profiles up') - ->select('up.id, up.first_name, up.last_name, up.nhance_branch_id, up.role, ut.team_id') - ->join('user_teams ut', 'ut.user_id = up.id', 'left') - ->where('up.is_active', 1) - ->where('up.id', $logged_user_id) - ->get() - ->getRow(); - + $row = $db->table('user_profiles')->select('*') + ->where('is_active', 1)->where('id', $logged_user_id) + ->get()->getRow(); + $nhance_branch_id = $row ? $row->nhance_branch_id : null; - $role = $row ? $row->role : null; - $team_id = $row ? $row->team_id : null; - + // Is the logged-in user a Sales Manager? (Role 4, Team 5) - if ($role == 4 && $team_id == 5) { - + if ($role == 4 && in_array(5, $team_id)) { $data['sales_manager_ids'] = [$logged_user_id]; $data['users'] = [ [ 'id' => $row->id, - 'sales_manager' => trim($row->first_name . ' ' . $row->last_name), + 'first_name' => $row->first_name, 'nhance_branch_id' => $nhance_branch_id ] ]; } // Otherwise fetch ALL sales managers in this branch - elseif ($nhance_branch_id) { + elseif (in_array($role,[1,2,3,4,5])) { $data['users'] = $db->table('user_profiles up') ->select('up.id, up.first_name, up.last_name, up.nhance_branch_id') @@ -779,11 +773,59 @@ class SalesController extends BaseController // ==================== Dashboard ==================== + public function dashboard(){ - public function branchLevelDashboard() + $logged_user_id = get_session_userid(); + $role = get_role_id(); + $team_id = user_team(); + $payload = $this->request->getGet(); + + $db = \Config\Database::connect(); + + $row = $db->table('user_profiles') + ->select('*') + ->where('is_active', 1) + ->where('id', $logged_user_id) + ->get() + ->getRowArray(); + + $nhance_branch_id = $row ? $row['nhance_branch_id'] : null; + + // dd($logged_user_id, $nhance_branch_id, $role, $team_id ); + + if (in_array($role,[5])) { + + $sales_manager_ids = array_column( + $db->table('user_profiles up') + ->select('up.id') + ->join('user_teams ut', 'ut.user_id = up.id') + ->where([ + 'up.is_active' => 1, + 'ut.is_active' => 1, + 'up.role' => 4, + 'ut.team_id' => 5, + 'up.nhance_branch_id' => $nhance_branch_id + ]) + ->get() + ->getResultArray(), + 'id' + ); + $this->branchLevelDashboard($nhance_branch_id,$sales_manager_ids); + + } + elseif ($role == 4 && in_array(5, $team_id)) { + $sales_manager_ids = [$logged_user_id]; + $this->salesManagerLevelDashboard($logged_user_id,$sales_manager_ids, $payload); + } + + } + + public function branchLevelDashboard($branchId,$sales_manager_ids) { + $data['tab_name'] = 'Dashboard'; + $data['page_name'] = 'Dashboard'; // Hardcoded branch ID as requested - $branchId = 1; + // $branchId = 1; try { // 1. Lead Statistics @@ -798,11 +840,24 @@ class SalesController extends BaseController // 3. Team Performance (Aggregating activity counts per user) $db = \Config\Database::connect(); + // Final safe check + if (empty($sales_manager_ids)) { + // No valid IDs — skip queries or return empty + $teamPerformance = []; + $recentActivities = []; + $leadsOverview = []; + } else { + + if (empty($sales_manager_ids) || !is_array($sales_manager_ids)) { + $sales_manager_ids = array_filter((array) $sales_manager_ids); // removes null, "", 0 + } + $teamPerformance = $db->table('user_profiles as u') ->select('u.first_name, u.last_name, u.profile as role, (SELECT COUNT(*) FROM sales_activities WHERE assigned_to = u.id) as total_acts, (SELECT COUNT(*) FROM sales_activities WHERE assigned_to = u.id AND status = "completed") as done_acts') ->where('u.nhance_branch_id', $branchId) + ->whereIn('u.id', $sales_manager_ids) ->where('u.is_active', 1) ->get()->getResultArray(); @@ -812,11 +867,48 @@ class SalesController extends BaseController ->orderBy('sales_activities.scheduled_date', 'DESC') ->limit(6) ->findAll(); + + $sales_manager_ids = array_values(array_map('intval', $sales_manager_ids)); + $recentActivities = $db->table('sales_activities sa') + ->select('sa.activity_id,sa.lead_id,sa.activity_type,sa.scheduled_date,sa.status,sa.assigned_to,sal.company_name,up.first_name AS assigned_to_name') + ->join('(SELECT lead_id, MAX(company_name) AS company_name FROM sales_actual_leads GROUP BY lead_id) sal','sal.lead_id = sa.lead_id','left') + ->join('user_profiles up', 'up.id = sa.assigned_to', 'left') + ->orderBy('sa.scheduled_date', 'DESC') + ->limit(6) + ->whereIn('sa.assigned_to', $sales_manager_ids) + ->get()->getResultArray(); + + // 5. All Leads Overview + $leadsOverview = $db->table('sales_actual_leads sal') + ->select('sal.lead_id,sal.company_name,sal.status,up.first_name AS assigned_to, + COUNT(DISTINCT sa.activity_id) AS activities, + COUNT(DISTINCT l.id) AS opportunities + ') + ->join('user_profiles up', 'up.id = sal.assigned_to', 'left') + ->join('sales_activities sa', 'sa.lead_id = sal.lead_id', 'left') + ->join('leads l', 'l.actual_lead_id = sal.lead_id', 'left') + ->groupBy('sal.lead_id, sal.company_name, sal.status, up.first_name') + ->having('COUNT(DISTINCT sa.activity_id) + COUNT(DISTINCT l.id) >', 0) // ← this line + ->orderBy('sal.created_at', 'DESC') + ->whereIn('sal.assigned_to', $sales_manager_ids) + ->get() + ->getResultArray(); + } + + // 6. activityBreakdown + $total = $db->table('sales_activities')->countAll(); + + $activityBreakdown = $db->table('sales_activities') + ->select("activity_type, COUNT(*) AS total, ROUND(COUNT(*) * 100.0 / {$total}, 0) AS percentage", false) + ->groupBy('activity_type') + ->orderBy('total', 'DESC') + ->get() + ->getResultArray(); + + $teamPerformance = array_filter($teamPerformance, function($row) { + return ($row['total_acts'] + $row['done_acts']) > 0; + }); - // 5. All Leads Overview - $leadsOverview = $this->leadModel->select('sales_actual_leads.*, user_profiles.first_name, user_profiles.last_name') - ->join('user_profiles', 'user_profiles.id = sales_actual_leads.assigned_to', 'left') - ->findAll(); $data = [ 'total_leads' => $stats['total'], @@ -825,7 +917,10 @@ class SalesController extends BaseController 'pipeline_value' => '15.0L', // Hardcoded placeholder from PDF [cite: 14] 'team' => $teamPerformance, 'recent_acts' => $recentActivities, - 'leads_overview' => $leadsOverview + 'leads_overview' => $leadsOverview, + 'activity_breakdown'=> $activityBreakdown, + 'tab_name' => "Sales Dashboard", + 'page_name' => "Sales Dashboard" ]; // dd($data); @@ -839,16 +934,15 @@ class SalesController extends BaseController } } - - public function salesManagerLevelDashboard() + public function salesManagerLevelDashboard($userId,$sales_manager_ids, $payload = []) { - $userId = get_session_userid(); + // $userId = get_session_userid(); // $userId = 1; $db = \Config\Database::connect(); try { - $payload = $this->request->getGet(); + // $payload = $this->request->getGet(); $current_fin_year = $payload['fy'] ?? getCurrentFinancialYear(); @@ -858,8 +952,12 @@ class SalesController extends BaseController ->orderBy('fy_year', 'desc') ->get() ->getResultArray(); + $fin_years = array_column($fin_years, 'fy_year'); - $fin_years[] = '2024-2025'; + + if(empty($fin_years)){ + $fin_years[] = $current_fin_year; + } $target = $db->table('sales_target') ->where('user_id', $userId) @@ -907,7 +1005,9 @@ class SalesController extends BaseController 'recent_leads' => $recentLeads, 'fin_years' => $fin_years, 'display_fin_years' => format_financial_year($current_fin_year), - 'user_name' => get_session_userdata()->first_namee ?? '' + 'user_name' => get_session_userdata()->first_namee ?? '', + 'tab_name' => "Sales Dashboard", + 'page_name' => "Sales Dashboard" ]; // dd($data); diff --git a/app/Views/layout/header.php b/app/Views/layout/header.php index 61e63b23..67198829 100755 --- a/app/Views/layout/header.php +++ b/app/Views/layout/header.php @@ -2077,7 +2077,7 @@ - +