DELIMITER //

CREATE OR REPLACE FUNCTION bpmm02_udf_spread_signer(
  p_uuid VARCHAR(100),
  p_personid VARCHAR(20),          -- 起單人
  p_source_pk_value VARCHAR(100),  -- 單號
  p_stepId VARCHAR(100),
  p_typeName VARCHAR(20),
  p_nodeName VARCHAR(20),
  p_filterSet TEXT,
  p_step INT
)
/*
  Function   : bpmm02_spread 產生簽核人 SQL script for insert bpm_flow_sign
  Description: 
  Build Date : 2022/11/04
  
  Modify History
    Item Who        Date       Modify Docs
    ==== ========== ========== =================================================
    1    Michael    2022/11/04 Init 
*/
RETURNS TEXT
BEGIN
  DECLARE v_sql TEXT;
  DECLARE v_tablename VARCHAR(100);
  DECLARE v_source_pk VARCHAR(100);
  DECLARE v_stepName VARCHAR(100);
  DECLARE v_roleName VARCHAR(100);
  DECLARE v_source_note VARCHAR(100);
  DECLARE v_userid VARCHAR(100);
  DECLARE v_role_users TEXT;
  DECLARE v_notes VARCHAR(600);
  DECLARE v_crlf VARCHAR(2);
  
  SET v_crlf = CHAR(10);
  
  IF p_nodeName = 'nodeNode' THEN
    -- 獲取基本資訊
    SELECT source_table, source_pk, source_note 
    INTO v_tablename, v_source_pk, v_source_note 
    FROM bpm_list WHERE flow_id = p_uuid;  
    
    SELECT roleName, stepName 
    INTO v_roleName, v_stepName 
    FROM bpm_setup WHERE flow_id = p_uuid AND stepId = p_stepId;
      
    -- 根據類型生成不同的SQL
    IF p_typeName = 'fields' THEN
      SET v_sql = CONCAT(
        'SELECT @userid:=', v_roleName, ', @notes:=', v_source_note, 
        ' FROM ', v_tablename, ' WHERE ', v_source_pk, ' = ''', p_source_pk_value, ''';', v_crlf,
        'INSERT INTO bpm_flow_sign (flow_id, sourceid, stepName, flow_level, signerid, sign_status, create_date, sign_note)', v_crlf,
        'VALUES (''', p_uuid, ''', ''', p_source_pk_value, ''', ''', v_stepName, ''', ', p_step, ', @userid, ''', 
        CASE WHEN p_step = 1 THEN 'P' ELSE 'N' END, ''', NOW(), @notes);'
      );
    ELSEIF p_typeName = 'roles' THEN
      -- 處理角色類型
      IF v_roleName = 'manager' THEN
        SELECT bossid INTO v_userid FROM sys_users WHERE userid = p_personid;
        SET v_role_users = CONCAT(
          'VALUES (''', p_uuid, ''', ''', p_source_pk_value, ''', ''', v_stepName, ''', ', p_step, ', ''', 
          IFNULL(v_userid, '4734'), ''', ''', 
          CASE WHEN p_step = 1 THEN 'P' ELSE 'N' END, ''', NOW(), @notes)'
        );
      ELSE
        SET v_role_users = CONCAT(
          'SELECT ''', p_uuid, ''', ''', p_source_pk_value, ''', ''', v_stepName, ''', ', p_step, 
          ', userid, ''', CASE WHEN p_step = 1 THEN 'P' ELSE 'N' END, ''', NOW(), @notes ', 
          'FROM sys_userroles WHERE roleid = ''', v_roleName, ''''
        );
      END IF;
      
      SET v_sql = CONCAT(
        'SELECT @notes:=', v_source_note, ' FROM ', v_tablename, 
        ' WHERE ', v_source_pk, ' = ''', p_source_pk_value, ''';', v_crlf,
        'INSERT INTO bpm_flow_sign (flow_id, sourceid, stepName, flow_level, signerid, sign_status, create_date, sign_note)', v_crlf,
        v_role_users, ';'
      );
    ELSEIF p_typeName = 'users' THEN
      -- 處理用戶類型
      SET v_sql = CONCAT(
        'SELECT @notes:=', v_source_note, ' FROM ', v_tablename, 
        ' WHERE ', v_source_pk, ' = ''', p_source_pk_value, ''';', v_crlf,
        'INSERT INTO bpm_flow_sign (flow_id, sourceid, stepName, flow_level, signerid, sign_status, create_date, sign_note)', v_crlf,
        'VALUES (''', p_uuid, ''', ''', p_source_pk_value, ''', ''', v_stepName, ''', ', p_step, 
        ', ''', v_roleName, ''', NOW(), @notes);'
      );
    END IF;
  END IF;
  
  RETURN v_sql;
END //

DELIMITER ;