DELIMITER //

CREATE OR REPLACE PROCEDURE sys_dashboard(
  IN p_token VARCHAR(100)
)
/*
  Description: 取得首頁的幾個統計用數字
			   今日行事曆:
			   待簽核表單:
			   待辦事項:     -- 協同工作單
			   執行中專案:   -- 本 Sprint 未完成的 PBI
			   未結案留言單:
  Build Date : 2023/02/14
  
  Modify History
    Item Who        Date       Modify Docs
    ==== ========== ========== ================================================
    1    Michael    2023/02/14 Init
	2    Michael    2025/07/20 改寫為 MariaDB 並最佳化(ChatGPT+DeepSeek)
*/
BEGIN
  DECLARE v_userid VARCHAR(100);
  DECLARE v_cnt1 INT DEFAULT 0;
  DECLARE v_cnt2 INT DEFAULT 0;
  DECLARE v_cnt3 INT DEFAULT 0;
  DECLARE v_cnt4 INT DEFAULT 0;
  DECLARE v_cnt5 INT DEFAULT 0;
  
  -- 將 token 換成 userid
  SELECT userid INTO v_userid FROM sys_users WHERE token = p_token LIMIT 1;
  
  -- 今日行事曆(參考 sp=eip_getCalendar)
  SELECT COUNT(*) INTO v_cnt1 
  FROM eip_core_calendar
  WHERE DATE(start_time) = CURDATE() AND personid = v_userid;
  
  -- 待簽核表單(參考 sp=bpm_sign_todo)
  SELECT COUNT(*) INTO v_cnt2
  FROM bpm_flow_sign a
  JOIN bpm_list b ON a.flow_id = b.flow_id 
  JOIN basperson p ON a.signerid = p.personid
  WHERE a.sign_status = 'P'
  AND IFNULL(a.assign_to,'') = 'Y'
  AND a.signerid = v_userid;
  
  -- 待辦事項(建議是前後3天)
  SELECT COUNT(*) INTO v_cnt3
  FROM crmassign_m m
  WHERE DATE(m.predictdate) BETWEEN DATE_SUB(CURDATE(), INTERVAL 3 DAY) AND DATE_ADD(CURDATE(), INTERVAL 3 DAY)
  AND (m.personid2 = v_userid OR m.personid3 = v_userid);
  
  -- 執行中 PBI(本 sprint 尚未完成, )
  SELECT COUNT(*) INTO v_cnt4
  FROM pms_pbi p
  JOIN pms_sprint s ON p.sprintid = s.sprintid
  WHERE DATE(p.startdate) BETWEEN DATE_SUB(CURDATE(), INTERVAL 3 DAY) AND DATE_ADD(CURDATE(), INTERVAL 3 DAY)
  AND CURDATE() BETWEEN DATE(s.sprint_startdate) AND DATE(s.sprint_enddate)
  AND (p.controller = v_userid OR p.tester = v_userid);
  
  -- 未結案留言單(規格要調整, 先暫緩)
  
  -- 回傳 dataset
  SELECT 0 AS code, 'ok' AS msg;
  SELECT v_cnt1 AS dashboard1, v_cnt2 AS dashboard2, 
         v_cnt3 AS dashboard3, v_cnt4 AS dashboard4, 
         v_cnt5 AS dashboard5;
END //

DELIMITER ;