Advertisement
aadddrr

ul_upload_ou

Dec 5th, 2018
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. CREATE OR REPLACE FUNCTION ul_upload_ou(bigint)
  2.   RETURNS bigint AS
  3. $BODY$
  4. DECLARE
  5.     pUploadHeaderId         ALIAS FOR $1;
  6.    
  7.     vFail                   character varying(4) := 'FAIL';
  8.     vOk                     character varying(2) := 'OK';
  9.     vYes                    character varying(1) := 'Y';
  10.     vNo                     character varying(1) := 'N';
  11.     vActionInsert           character varying(1) := 'I';
  12.     vActionUpdate           character varying(1) := 'U';
  13.     vActionError            character varying(1) := 'E';
  14.     vEmpty                  character varying(1) := '';
  15.     vSpaceValue             character varying(1) := ' ';
  16.      
  17.     vTenantId               bigint;
  18.     vUserId                 bigint;
  19.     vDatetime               character varying(14);
  20.      
  21.     vCountFail              bigint:=0;
  22.    
  23.     vEmptyId                bigint := -99;
  24.     vTempId                 bigint := -999;
  25.    
  26. BEGIN
  27.     -- siapkan parameter
  28.     vTenantId = CAST( f_get_upload_parameter(pUploadHeaderId, 'tenantId') AS bigint );
  29.     vUserId = CAST( f_get_upload_parameter(pUploadHeaderId, 'userId') AS bigint );
  30.     vDatetime = CAST( f_get_upload_parameter(pUploadHeaderId, 'datetime') AS character varying );
  31.    
  32.     -- Validasi
  33.     -- # Kode OU harus diisi
  34.     -- # Max character dari Kode OU adalah 50
  35.     -- # Kode OU harus belum ada dalam sistem
  36.     -- # Kode Tipe OU harus diisi
  37.     -- # Kode Tipe OU harus ada dalam sistem
  38.     -- # Jika Kode OU Parent diisi, Kode OU Parent tersebut harus memiliki tenant yang sama
  39.     -- # Nama OU harus diisi
  40.     -- # Max character dari Nama OU adalah 255
  41.     -- # Jika Kode OU Parent diisi, Kode OU Parent tersebut harus ada dalam sistem
  42.     -- # List pada CSV yang diupload, tidak boleh duplikat berdasarkan Kode OU
  43.    
  44.     -- # Kode OU harus diisi
  45.     UPDATE ul_import_data_ou A
  46.     SET status = vFail,
  47.         message = message || 'Kode OU harus diisi, '
  48.     WHERE A.upload_header_id = pUploadHeaderId
  49.         AND TRIM(A.kode_ou) = vEmpty;
  50.        
  51.     -- # Max character dari Kode OU adalah 50
  52.     UPDATE ul_import_data_ou A
  53.     SET status = vFail,
  54.         message = message || 'Panjang Kode OU maksimal 50 karakter, '
  55.     WHERE A.upload_header_id = pUploadHeaderId
  56.         AND length(A.kode_ou) > 50;
  57.        
  58.     -- # Kode OU harus belum ada dalam sistem
  59.     UPDATE ul_import_data_ou A
  60.     SET status = vFail,
  61.         message = message || 'Kode OU sudah ada dalam sistem, '
  62.     WHERE A.upload_header_id = pUploadHeaderId
  63.         AND EXISTS (
  64.             SELECT 1
  65.             FROM t_ou B
  66.             WHERE B.ou_code = A.kode_ou
  67.         );
  68.        
  69.     -- # Kode Tipe OU harus diisi
  70.     UPDATE ul_import_data_ou A
  71.     SET status = vFail,
  72.         message = message || 'Kode Tipe OU harus diisi, '
  73.     WHERE A.upload_header_id = pUploadHeaderId
  74.         AND TRIM(A.kode_tipe_ou) = vEmpty;
  75.        
  76.     -- # Kode Tipe OU harus ada dalam sistem
  77.     UPDATE ul_import_data_ou A
  78.     SET status = vFail,
  79.         message = message || 'Kode Tipe OU tidak ada dalam sistem, '
  80.     WHERE A.upload_header_id = pUploadHeaderId
  81.         AND TRIM(A.kode_tipe_ou) <> vEmpty
  82.         AND NOT EXISTS (
  83.             SELECT 1
  84.             FROM t_ou_type B
  85.             WHERE B.ou_type_code = A.kode_tipe_ou
  86.             AND B.tenant_id = vTenantId
  87.         );
  88.        
  89.     -- # Nama OU harus diisi
  90.     UPDATE ul_import_data_ou A
  91.     SET status = vFail,
  92.         message = message || 'Nama OU harus diisi, '
  93.     WHERE A.upload_header_id = pUploadHeaderId
  94.         AND TRIM(A.nama_ou) = vEmpty;
  95.        
  96.     -- # Max character dari Nama OU adalah 255
  97.     UPDATE ul_import_data_ou A
  98.     SET status = vFail,
  99.         message = message || 'Panjang Nama OU maksimal 255 karakter, '
  100.     WHERE A.upload_header_id = pUploadHeaderId
  101.         AND length(A.nama_ou) > 255;
  102.        
  103.     -- # Jika Kode OU Parent diisi, Kode OU Parent tersebut harus ada dalam sistem
  104.     UPDATE ul_import_data_ou A
  105.     SET status = vFail,
  106.         message = message || 'Kode OU Parent tidak ada dalam sistem, '
  107.     WHERE A.upload_header_id = pUploadHeaderId
  108.         AND TRIM(A.kode_ou_parent) <> vEmpty
  109.         AND NOT EXISTS (
  110.             SELECT 1
  111.             FROM t_ou B
  112.             WHERE B.ou_code = A.kode_ou_parent
  113.             AND B.tenant_id = vTenantId
  114.         );      
  115.        
  116.     -- # List pada CSV yang diupload, tidak boleh duplikat berdasarkan Kode OU
  117.     WITH duplicate_data_ou AS (
  118.         SELECT A.kode_ou
  119.         FROM ul_import_data_ou A
  120.         WHERE A.upload_header_id = pUploadHeaderId
  121.         AND TRIM(A.kode_ou) <> vEmpty
  122.         GROUP BY A.kode_ou
  123.         HAVING COUNT(1) > 1
  124.     )
  125.     UPDATE ul_import_data_ou A
  126.     SET status = vFail,
  127.         message = message || 'Kode OU duplikat, '
  128.     WHERE A.upload_header_id = pUploadHeaderId
  129.         AND EXISTS (
  130.             SELECT 1 FROM duplicate_data_ou B WHERE A.kode_ou = B.kode_ou
  131.         );
  132.        
  133.     -- # Cari data Tipe OU
  134.     UPDATE ul_import_data_ou A
  135.     SET flg_bu = B.flg_bu,
  136.         flg_accounting = B.flg_accounting,
  137.         flg_sub_bu = B.flg_sub_bu,
  138.         flg_branch = B.flg_branch
  139.     FROM t_ou_type B
  140.     WHERE A.upload_header_id = pUploadHeaderId
  141.         AND A.status <> vFail
  142.         AND B.ou_type_code = A.kode_tipe_ou;  
  143.        
  144.     -- # Cari data OU Parent
  145.     UPDATE ul_import_data_ou A
  146.     SET ou_parent_id = B.ou_id,
  147.         parent_flg_bu = C.flg_bu,
  148.         parent_flg_accounting = C.flg_accounting,
  149.         parent_flg_sub_bu = C.flg_sub_bu,
  150.         parent_flg_branch = C.flg_branch
  151.     FROM t_ou B
  152.     INNER JOIN t_ou_type C ON B.ou_type_id = C.ou_type_id
  153.     WHERE A.upload_header_id = pUploadHeaderId
  154.         AND A.status <> vFail
  155.         AND B.ou_code = A.kode_ou_parent;  
  156.        
  157.     -- # Untuk OU yang merupakan Business Unit, parent OU harus -99
  158.     UPDATE ul_import_data_ou A
  159.     SET status = vFail,
  160.         message = message || 'OU business unit tidak boleh memiliki parent, '
  161.     WHERE A.upload_header_id = pUploadHeaderId
  162.         AND A.status <> vFail
  163.         AND A.flg_bu = vYes
  164.         AND A.flg_accounting = vNo
  165.         AND A.flg_sub_bu = vNo
  166.         AND A.flg_branch = vNo
  167.         AND A.ou_parent_id <> vEmptyId;
  168.        
  169.     -- # Selain Business Unit, harus memiliki parent Id
  170.     UPDATE ul_import_data_ou A
  171.     SET status = vFail,
  172.         message = message || 'OU selain business unit harus memiliki parent, '
  173.     WHERE A.upload_header_id = pUploadHeaderId
  174.         AND A.status <> vFail
  175.         AND NOT (A.flg_bu = vYes
  176.             AND A.flg_accounting = vNo
  177.             AND A.flg_sub_bu = vNo
  178.             AND A.flg_branch = vNo)
  179.         AND A.ou_parent_id = vEmptyId;
  180.        
  181.     -- # Untuk OU yang merupakan Sub Business Unit, parent OU nya harus merupakan Business Unit atau Branch
  182.     UPDATE ul_import_data_ou A
  183.     SET status = vFail,
  184.         message = message || 'OU sub business unit harus memiliki parent business unit atau branch, '
  185.     WHERE A.upload_header_id = pUploadHeaderId
  186.         AND A.status <> vFail
  187.         AND A.flg_bu = vYes
  188.         AND A.flg_accounting = vNo
  189.         AND A.flg_sub_bu = vYes
  190.         AND A.flg_branch = vNo
  191.         AND NOT (A.parent_flg_bu = vYes
  192.             AND A.parent_flg_accounting = vNo
  193.             AND A.parent_flg_sub_bu = vNo);
  194.        
  195.     -- # Untuk OU yang merupakan Branch, parent OU nya harus merupakan Business Unit
  196.     UPDATE ul_import_data_ou A
  197.     SET status = vFail,
  198.         message = message || 'OU branch harus memiliki parent business unit, '
  199.     WHERE A.upload_header_id = pUploadHeaderId
  200.         AND A.status <> vFail
  201.         AND A.flg_bu = vYes
  202.         AND A.flg_accounting = vNo
  203.         AND A.flg_sub_bu = vNo
  204.         AND A.flg_branch = vYes
  205.         AND NOT (A.parent_flg_bu = vYes
  206.             AND A.parent_flg_accounting = vNo
  207.             AND A.parent_flg_sub_bu = vNo
  208.             AND A.parent_flg_branch = vNo);
  209.        
  210.     -- Cek apakah ada item CSV yang statusnya fail
  211.     IF EXISTS ( SELECT 1 FROM ul_import_data_ou B
  212.                 WHERE B.upload_header_id = pUploadHeaderId
  213.                 AND B.status = vFail ) THEN
  214.                
  215.                 -- Sesuaikan message, agar message paling belakang tidak ada koma
  216.                 UPDATE ul_import_data_ou A
  217.                 SET message = substr(A.message, 1, length(A.message)-2)
  218.                 WHERE A.upload_header_id = pUploadHeaderId
  219.                     AND A.status = vFail
  220.                     AND TRIM(A.message) != vEmpty;
  221.                    
  222.                 -- Update semua status menjadi FAIL jika ada salah satu item yang terkena validasi
  223.                 -- Karena jika ada salah 1 item yang fail, maka 1 csv dianggap tidak valid
  224.                 -- ubah update_status menjadi E untuk menandakan bahwa data error / tidak digunakan untuk membuat data
  225.                 UPDATE ul_import_data_ou A
  226.                 SET status = vFail,
  227.                     update_status = vActionError
  228.                 WHERE upload_header_id = pUploadHeaderId;
  229.                
  230.                 -- Hitung jumlah data yang FAIL
  231.                 SELECT COUNT(1) INTO vCountFail
  232.                 FROM ul_import_data_ou
  233.                 WHERE upload_header_id = pUploadHeaderId
  234.                     AND status = vFail;
  235.     ELSE
  236.                 -- Update status non FAIL to OK
  237.                 UPDATE ul_import_data_ou
  238.                 SET status = vOk
  239.                 WHERE upload_header_id = pUploadHeaderId;
  240.                
  241.                 -- UPDATE OK data untuk ou code terdaftar
  242.                 /*WITH update_data_ou AS (
  243.                     UPDATE t_ou A SET
  244.                         ou_name=B.nama_ou,
  245.                         --ou_parent_id=B.ou_parent_id,
  246.                         ou_type_id=C.ou_type_id,
  247.                         update_datetime=vDatetime,
  248.                         update_user_id=vUserId,
  249.                         version=A.version+1
  250.                     FROM ul_import_data_ou B
  251.                     INNER JOIN t_ou_type C ON B.kode_tipe_ou = C.ou_type_code
  252.                     WHERE B.upload_header_id = pUploadHeaderId
  253.                     AND B.status = vOk
  254.                     AND A.ou_code = B.kode_ou
  255.                     AND A.tenant_id = vTenantId
  256.                     AND C.tenant_id = vTenantId
  257.                     RETURNING A.*
  258.                 )
  259.                 -- Ubah update_status menjadi U jika data digunakan untuk Update
  260.                 UPDATE ul_import_data_ou A SET
  261.                     update_status = vActionUpdate
  262.                 WHERE A.upload_header_id = pUploadHeaderId
  263.                     AND A.status = vOk
  264.                     AND EXISTS (
  265.                         SELECT 1 FROM update_data_ou B WHERE A.kode_ou = B.ou_code AND B.tenant_id = vTenantId
  266.                     );*/
  267.                
  268.                 -- INSERT OK data untuk ou code baru
  269.                 WITH insert_data_ou AS (
  270.                     INSERT INTO t_ou(
  271.                         tenant_id, ou_code, ou_name, ou_parent_id, ou_type_id,
  272.                         create_datetime, create_user_id, update_datetime, update_user_id,
  273.                         version, active, active_datetime, non_active_datetime)
  274.                     SELECT vTenantId, kode_ou, nama_ou, ou_parent_id, B.ou_type_id, vDatetime,
  275.                             vUserId, vDatetime, vUserId, 0, vYes,
  276.                             vDatetime, vSpaceValue
  277.                     FROM ul_import_data_ou A
  278.                     INNER JOIN t_ou_type B ON A.kode_tipe_ou = B.ou_type_code
  279.                     WHERE A.upload_header_id = pUploadHeaderId
  280.                     AND A.status = vOk
  281.                     AND B.tenant_id = vTenantId
  282.                     AND NOT EXISTS (
  283.                         SELECT 1 FROM t_ou Z
  284.                         WHERE A.kode_ou = Z.ou_code
  285.                         AND B.tenant_id = vTenantId
  286.                     )
  287.                     RETURNING *
  288.                 )
  289.                 -- Ubah update_status menjadi I jika data digunakan untuk Insert
  290.                 UPDATE ul_import_data_ou A SET
  291.                     update_status = vActionInsert
  292.                 WHERE A.upload_header_id = pUploadHeaderId
  293.                     AND A.status = vOk
  294.                     AND EXISTS (
  295.                         SELECT 1 FROM insert_data_ou B WHERE A.kode_ou = B.ou_code AND B.tenant_id = vTenantId
  296.                     );
  297.     END IF;
  298.        
  299.     RETURN vCountFail;
  300.      
  301. END;  
  302. $BODY$
  303.   LANGUAGE plpgsql VOLATILE
  304.   COST 100;
  305.   /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement