/*
  準備要重構 Wizard 程式
  基本上每一支程式都不應該超過 150 行(最多不應超過 200 行), 否則日後的維護會非常麻煩, 會改不動
  所有程式都要加上 xxxx_v2
  想法是把原程式中一堆的變數, 仍沿用原邏輯, 但是都寫入 zen_wizard_tmp, 最後再開始 replace 變數內容
  處理變數的過程會變成 update 暫存變數欄位內容的過程
  
  一邊搬 code 一邊讚嘆我自己, 怎麼寫得出這麼複雜的 Wizard, 重構起來真要人命啊
  
  Michael 2023/12/19
  
  除了 zen_create_json_v2, 繼續往下重構, 看起來還有
  dbo.zen_get_detail_data
  zen_create_query_json_v2
  
  2024/01/03 我真是自找麻煩阿
*/

1.因為邏輯很複雜, 變數一大堆, 我想要設定一個暫存表紀錄, 方便再細分的 proc 或 func 中直接取用, 否則傳參會傳到瘋掉, 也方便 debug
CREATE TABLE zen_wizard_tmp (
  uuid VARCHAR(100),
  zen_key VARCHAR(100),
  zen_value LONGTEXT,  -- Using LONGTEXT instead of NVARCHAR(MAX) for large content
  create_date DATETIME DEFAULT CURRENT_TIMESTAMP,
  rowid INT AUTO_INCREMENT PRIMARY KEY,
  INDEX IDX_zen_wizard_tmp (uuid)
);

/*
  set @temp_code = replace(@temp_code,'@Fields_by_add@',@ret1);
  set @temp_code = replace(@temp_code,'@Fields_By_GridView@',@ret2+',');
  set @temp_code = replace(@temp_code,'@Fields_By_View@',@ret3);
  set @temp_code = replace(@temp_code,'@Fields_By_Edit@',@ret7);  -- 原先是 @ret1(Add/Update 不分)
  set @temp_code = replace(@temp_code,'@Fields_By_GridView_Edit@',@ret4);
*/
-- 用以替代程式中的 @jsondata
CREATE TABLE zen_wizard_jsondata (
  uuid VARCHAR(100),
  FieldName VARCHAR(100),
  FieldCN VARCHAR(100),
  FieldWidth INT,
  FieldObject VARCHAR(100),
  FieldCheckNull VARCHAR(10),
  picker_tag VARCHAR(100),
  fielddefault VARCHAR(200),
  fieldro VARCHAR(1),
  fieldfm VARCHAR(20),
  FieldBlock SMALLINT,
  FieldDS VARCHAR(10),
  FieldSH VARCHAR(10),
  CELLNO SMALLINT,
  CELLX SMALLINT,
  CELLY SMALLINT,
  CELLLINE SMALLINT,
  iscolumnmatch CHAR(1),
  visibleOn VARCHAR(100),
  _group VARCHAR(10),
  _block VARCHAR(10),
  rowid INT,
  -- JSON data fields
  json_bh LONGTEXT,        -- block header
  json_gh LONGTEXT,        -- group header
  json_insert LONGTEXT,    -- 將這個元件要組出來的新增設定暫存起來
  json_update LONGTEXT,    -- 將這個元件要組出來的修改設定暫存起來
  json_quickedit LONGTEXT, -- 將這個元件要組出來的 Quick Edit 設定暫存起來
  json_gridview LONGTEXT,  -- 將這個元件要組出來的 GridView 設定暫存起來
  json_view LONGTEXT,      -- 將這個元件要組出來的 grid 查詢設定暫存起來
  json_gf LONGTEXT,        -- group footer
  json_bf LONGTEXT,        -- block footer
  --
  create_date DATE DEFAULT CURRENT_DATE,
  INDEX IDX_zen_zen_wizard_jsondata (uuid)
);


/*
  zen_fields 新增欄位(Server 已更新)
  visibleOn 給 picker 設定一某欄某值是否顯示用
*/
alter table zen_fields add visibleOn varchar(100);

update zen_fields set visibleOn = 'cal_level,Personal' where functiontag='eipm02' and fieldname = 'personid';
update zen_fields set visibleOn = 'cal_level,Department' where functiontag='eipm02' and fieldname = 'departmentid';
update zen_fields set visibleOn = 'cal_level,Project' where functiontag='eipm02' and fieldname = 'projectid';
--
update zen_fields set visibleOn = 'cal_repeated_flag,none' where functiontag='eipm02' and fieldname = 'cal_repeated_sdate';
update zen_fields set visibleOn = 'cal_repeated_flag,none' where functiontag='eipm02' and fieldname = 'cal_repeated_edate';

alter table zen_jsoncode add jsonCode4 varchar(max);
alter table zen_jsoncode add jsonCode5 varchar(max);


/*
  重構後的程式架構如下
*/

zen_create_json_v2
  + zen_create_json_reset_codeid
  + zen_create_json_prepare_ds
  + zen_create_json_prepare
    + zen_get_ext_button (new add)
  + zen_create_json_prepare_aside
  + zen_create_json_prepare_detaildata
    + 原本會呼叫 dbo.zen_get_detail_data, 重構後不再呼叫
  + zen_create_json_prepare_gridquery
  
  *** main loop ***
  + zen_create_json_kernel
    + zen_create_json_comps_block
	+ zen_create_json_comps_others
	  + udf_create_json_comps_blob
	    + zen_get_keyvalue (new add)
	  + zen_create_json_comps_others_gridview
	  + zen_create_json_comps_others_quickedit
	  + zen_create_json_comps_others_view
	+ zen_create_json_comps_picker
	  + zen_picker (new add)
    + zen_create_json_comps_formula
	+ zen_create_json_comps_cycles
	+ zen_create_json_comps_transfer

  *** final ***
  + zen_create_json_final
    + zen_bpm_define ** 應該是專門處理 bpm code
  
  
/*
  test sql
  select * from zen_jsoncode where functiontag = 'crmm02'
*/

delete from zen_wizard_tmp;
delete from zen_wizard_jsondata;

-- 如果是 MySQL/Maiadb 要改為  call zen_xxx
-- exec zen_create_json_v2 'basm63','SingleGrid';
-- exec zen_create_json_v2 'basm67','SinglePanels';
-- exec zen_create_json_v2 'basm51','SingleTabs';
-- exec zen_create_json_v2 'pmsm11','MasterDetail-New';
-- exec zen_create_json_v2 'crmm02','MasterDetail-New';  -- 會報錯
-- exec zen_create_json_v2 'crmm09','MasterDetail-New';  -- 會報錯
-- exec zen_create_json_v2 'eipm11','MasterDetail-Log';  -- 會報錯
exec zen_create_json_v2 'eipm02','SingleEntry';  -- 會報錯

select * from zen_wizard_tmp;
select * from zen_wizard_jsondata;


/*
*/
zen_create_query_json_v2
  + step 1: prepare
  + step 2: sp_para_filter
  + step 3: query_fields
  + step 4: button
  + step 5: query UX
  + step 6: final


/*
  更版注意事項
*/
1.更新本文檔紀錄的新增 Tables 及 sp
2.更新 Template (MasterDetail-New)
3.更新 Wizard 中的 genCode 改呼叫 orm_api_v2 及 zen_create_json_v2
  query 暫時先不更新 
  

/*
eipm02, eipm19 的 zen_fields 的資料內容修改如下
也有修改 zen_picker, 主要是要配合顯示 picker

下列欄位不用
cal_holiday
cal_holiday_country
cal_repeated_time

新增下面4個欄位
s_date
s_time
e_date
e_time

並將 start_time 及  end_time 設為 formula
查詢欄位(公式)設為 
start_time = s_date + CHAR(32) + s_time
end_time = e_date + CHAR(32) + e_time

*/
