DELIMITER //

CREATE OR REPLACE PROCEDURE sys_d_update_m3(
  IN p_tablename VARCHAR(100)
)
/*
  function   : 配合 orm_api 的存檔後過帳, 當新增一筆 detail 後, update master 的合計欄位(目前先寫死 totalamount)
  description: 目前先配合 omi_api 的存檔後機制(sys_transaction) 執行, 希望能全部透過設定, 而不是每一個 table 都必須客製
  build date : 2023/10/14
  
  modify history
    item who        date       modify docs
    ==== ========== ========== ================================================
    1    michael    2023-10-14 Init
	2    Michael    2025/07/20 改寫為 MariaDB 並最佳化(ChatGPT+DeepSeek)
*/
BEGIN
  DECLARE v_relation_key VARCHAR(100);
  DECLARE v_middle_field VARCHAR(100);
  DECLARE v_dest_table VARCHAR(100);
  DECLARE v_dest_field VARCHAR(100);
  DECLARE v_dest_field2 VARCHAR(100);
  DECLARE v_sql TEXT;
  DECLARE v_para01 VARCHAR(100);
  DECLARE v_para02 VARCHAR(100);
  DECLARE v_pos INT;
  DECLARE v_source_field VARCHAR(100);
  DECLARE v_source_field2 VARCHAR(100);
  
  -- get data
  SELECT 
    IFNULL(RelationKey,''), IFNULL(MiddleField,''), 
    IFNULL(para01,''), IFNULL(para02,''),
    IFNULL(dest_table,''), IFNULL(dest_field,''), 
    IFNULL(dest_field2,'')
  INTO
    v_relation_key, v_middle_field, v_para01, v_para02,
    v_dest_table, v_dest_field, v_dest_field2
  FROM sys_transaction 
  WHERE tablename = p_tablename;
  
  -- prepare sql
  SET v_pos = LOCATE('=', v_dest_field);
  IF v_pos > 0 THEN
    SET v_source_field = SUBSTRING(v_dest_field, 1, v_pos-1);
    SET v_dest_field = SUBSTRING(v_dest_field, v_pos+1);
  END IF;
  
  SET v_pos = LOCATE('=', v_dest_field2);
  IF v_pos > 0 THEN
    SET v_source_field2 = SUBSTRING(v_dest_field2, 1, v_pos-1);
    SET v_dest_field2 = SUBSTRING(v_dest_field2, v_pos+1);
  END IF;
  
  -- build SQL
  IF v_dest_field2 IS NULL OR v_dest_field2 = '' THEN
    SET @sql = CONCAT(
      'UPDATE ', v_dest_table, ' d ',
      'JOIN (SELECT ', v_middle_field, ', ', v_source_field, 
      ' FROM ', p_tablename, 
      ' WHERE ', v_relation_key, ' = ''', v_para01, ''') s ',
      'ON d.', v_middle_field, ' = s.', v_middle_field, ' ',
      'SET d.', v_dest_field, ' = s.', v_source_field, ';'
    );
  ELSE
    SET @sql = CONCAT(
      'UPDATE ', v_dest_table, ' d ',
      'JOIN (SELECT ', v_middle_field, ', ', v_source_field, ', ', v_source_field2,
      ' FROM ', p_tablename, 
      ' WHERE ', v_relation_key, ' = ''', v_para01, ''') s ',
      'ON d.', v_middle_field, ' = s.', v_middle_field, ' ',
      'SET d.', v_dest_field, ' = s.', v_source_field, 
      ', d.', v_dest_field2, ' = s.', v_source_field2, ';'
    );
  END IF;
  
  -- exec SQL
  PREPARE stmt FROM @sql;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;
END //

DELIMITER ;