aadddrr

upload_warranty_type_for_sell_price_so

Dec 26th, 2017
41
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. --Adrian, Jan 12, 2017
  2. /**
  3.  * Modified by Adrian, Sep 18, 2017
  4.  * Hapus data yang sell_price_product_for_so_id-nya tidak ditemukan pada m_sell_price_product_for_so
  5.  * sell_price_date diubah menjadi harus di antara date_to dan date_from dari m_sell_price_product_for_so
  6.  */
  7.  
  8. CREATE OR REPLACE FUNCTION upload_warranty_type_for_sell_price_so(bigint)
  9.   RETURNS integer AS
  10. $BODY$
  11.  
  12. DECLARE
  13.     pUlHeaderId             ALIAS FOR $1;
  14.    
  15.     vCount                  bigint;
  16.     vStatusOk               character varying;
  17.     vStatusFail             character varying;
  18.     vStatusX                character varying;
  19.     vEmpty                  character varying;
  20.     vCurrentDateTime        character varying;
  21.     vCurrCode               character varying;
  22.     vPriceLevelComboId      character varying;
  23.     vYes                    character varying;
  24.     vSpaceValue             character varying;
  25.     vAmount                 character varying;
  26.     vPercentage             character varying;
  27.     vAmt                    character varying;
  28.     vPct                    character varying;
  29.     vVersion                bigint;
  30.    
  31. BEGIN
  32.     vStatusOk := 'OK';
  33.     vStatusFail := 'FAIL';
  34.     vStatusX := 'X'; -- untuk yang fail karena validasi difungsi ini, akan ditandai X dulu untuk membedakan dengan yang validasi dari Spring batch untuk domain data
  35.     vEmpty := '';
  36.     vCurrCode := 'IDR';
  37.     vPriceLevelComboId := 'PRICELEVEL';
  38.     vYes := 'Y';
  39.     vSpaceValue := ' ';
  40.     vAmount := 'Amount';
  41.     vPercentage := 'Percentage';
  42.     vAmt := 'AMT';
  43.     vPct := 'PCT';
  44.     vVersion := 1;
  45.    -- This function returns integer  how many item fails
  46.  
  47.    -- Untuk yang tidak lolos domain data validation, field status sudah berisi FAIL
  48.    -- Di sini melanjutkan business validation, hanya yang status belum diset sebagai 'FAIL'
  49.    
  50.        
  51.    
  52.     IF EXISTS(SELECT 1 FROM ul_skip_detail WHERE ul_header_id = pUlHeaderId) THEN
  53.         RAISE EXCEPTION 'ADA ITEM YANG DI SKIP';
  54.     END IF;
  55.    
  56.     SELECT f_datetime((extract(epoch from now())*1000)::bigint) INTO vCurrentDateTime;
  57.    
  58.     --validasi ou_code harus ada
  59.     UPDATE ul_warranty_type_for_sell_price_so Z  SET status= vStatusX , message = Z.message||'OU BU or Branch not exists; '
  60.     FROM    
  61.     ul_warranty_type_for_sell_price_so A
  62.     INNER JOIN ul_header C ON C.ul_header_id=A.ul_header_id
  63.     WHERE A.ul_header_id = pUlHeaderId
  64.     AND A.status <> vStatusFail
  65.     AND NOT EXISTS (
  66.         SELECT (1) FROM t_ou B
  67.         WHERE A.ou_code=B.ou_code AND C.tenant_id=B.tenant_id)
  68.     AND Z.ul_warranty_type_for_sell_price_so_id = A.ul_warranty_type_for_sell_price_so_id;
  69.    
  70.     --validasi product_code harus ada
  71.     UPDATE ul_warranty_type_for_sell_price_so Z  SET status= vStatusX , message = Z.message||'Product Code not exists; '
  72.     FROM    
  73.     ul_warranty_type_for_sell_price_so A
  74.     INNER JOIN ul_header C ON C.ul_header_id=A.ul_header_id
  75.     WHERE A.ul_header_id = pUlHeaderId
  76.     AND A.status <> vStatusFail
  77.     AND NOT EXISTS (
  78.         SELECT (1) FROM m_product B
  79.         WHERE A.product_code=B.product_code AND C.tenant_id=B.tenant_id)
  80.     AND Z.ul_warranty_type_for_sell_price_so_id = A.ul_warranty_type_for_sell_price_so_id;
  81.          
  82.     --Validation priceLevel must be suitable with combo PRICE LEVEL
  83.     UPDATE ul_warranty_type_for_sell_price_so Z  SET status= vStatusX , message = Z.message||'Price Level not exists; '
  84.     FROM    
  85.         ul_warranty_type_for_sell_price_so A
  86.     INNER JOIN ul_header C ON C.ul_header_id=A.ul_header_id
  87.     WHERE A.ul_header_id = pUlHeaderId
  88.     AND A.status <> vStatusFail
  89.     AND NOT EXISTS (
  90.         SELECT TRUE
  91.         FROM t_combo_value
  92.         WHERE combo_id = vPriceLevelComboId AND prop_key = A.price_level
  93.     )
  94.     AND Z.ul_warranty_type_for_sell_price_so_id = A.ul_warranty_type_for_sell_price_so_id;
  95.    
  96.     --validasi warranty_type_code harus ada
  97.     UPDATE ul_warranty_type_for_sell_price_so Z  SET status= vStatusX , message = Z.message||'Warranty Type Code not exists; '
  98.     FROM    
  99.     ul_warranty_type_for_sell_price_so A
  100.     INNER JOIN ul_header C ON C.ul_header_id=A.ul_header_id
  101.     WHERE A.ul_header_id = pUlHeaderId
  102.     AND A.status <> vStatusFail
  103.     AND NOT EXISTS (
  104.         SELECT (1) FROM m_warranty_type B
  105.         WHERE A.warranty_type_code=B.warranty_type_code AND C.tenant_id=B.tenant_id)
  106.     AND Z.ul_warranty_type_for_sell_price_so_id = A.ul_warranty_type_for_sell_price_so_id;
  107.    
  108.     --validasi warranty_sell_price_type harus 'Amount' atau 'Percentage'
  109.     UPDATE ul_warranty_type_for_sell_price_so Z  SET status= vStatusX , message = Z.message||'Warranty Sell Price Type must be either Amount or Percentage; '
  110.     FROM    
  111.     ul_warranty_type_for_sell_price_so A
  112.     INNER JOIN ul_header C ON C.ul_header_id=A.ul_header_id
  113.     WHERE A.ul_header_id = pUlHeaderId
  114.     AND A.status <> vStatusFail
  115.     AND ((A.warranty_sell_price_type <> vAmount) AND (A.warranty_sell_price_type <> vPercentage))
  116.     AND Z.ul_warranty_type_for_sell_price_so_id = A.ul_warranty_type_for_sell_price_so_id;
  117.    
  118.     -- Validasi warranty_sell_price harus angka
  119.     UPDATE ul_warranty_type_for_sell_price_so Z
  120.     SET status = vStatusX, message = Z.message||'Warranty Sell Price must be numeric; '
  121.     FROM ul_warranty_type_for_sell_price_so A
  122.     WHERE A.ul_header_id = pUlHeaderId
  123.     AND A.ul_warranty_type_for_sell_price_so_id = Z.ul_warranty_type_for_sell_price_so_id
  124.     AND A.status <> vStatusFail
  125.     AND isnumeric(A.warranty_sell_price) IS FALSE;
  126.    
  127.     --validasi warranty_sell_price harus >= 0
  128.     UPDATE ul_warranty_type_for_sell_price_so Z  SET status= vStatusX , message = Z.message||'Minimum Warranty Sell Price is 0; '
  129.     FROM    
  130.     ul_warranty_type_for_sell_price_so A
  131.     INNER JOIN ul_header C ON C.ul_header_id=A.ul_header_id
  132.     WHERE A.ul_header_id = pUlHeaderId
  133.     AND A.status <> vStatusFail
  134.     AND (CAST(A.warranty_sell_price AS numeric(15,2)) < 0)
  135.     AND Z.ul_warranty_type_for_sell_price_so_id = A.ul_warranty_type_for_sell_price_so_id;
  136.    
  137.     --validasi sell_price_product_for_so harus ada
  138.     UPDATE ul_warranty_type_for_sell_price_so Z  SET status= vStatusX , message = Z.message||'Sell Price Product For SO not exists; '
  139.     FROM    
  140.     ul_warranty_type_for_sell_price_so A
  141.     INNER JOIN ul_header C ON C.ul_header_id=A.ul_header_id
  142.     INNER JOIN t_ou D
  143.         ON A.ou_code = D.ou_code AND C.tenant_id = C.tenant_id
  144.     INNER JOIN m_product E
  145.         ON A.product_code = E.product_code AND C.tenant_id = E.tenant_id
  146.     INNER JOIN t_combo_value F
  147.         ON F.combo_id = vPriceLevelComboId AND F.prop_key = A.price_level
  148.     WHERE A.ul_header_id = pUlHeaderId
  149.     AND A.status <> vStatusFail
  150.     AND NOT EXISTS (
  151.         SELECT (1) FROM m_sell_price_product_for_so B
  152.         WHERE C.tenant_id=B.tenant_id
  153.             AND D.ou_id=B.ou_id
  154.             AND E.product_id=B.product_id
  155.             AND A.sell_price_date > B.date_from
  156.             AND A.sell_price_date < B.date_to
  157.             AND F.code = B.price_level
  158.         )
  159.     AND Z.ul_warranty_type_for_sell_price_so_id = A.ul_warranty_type_for_sell_price_so_id;
  160.    
  161.     -- Validasi tidak boleh duplikat
  162.     WITH duplicateCode AS (
  163.         SELECT D.tenant_id, E.ou_code, E.product_code, E.sell_price_date, E.price_level, E.warranty_type_code, COUNT(E.product_code)
  164.         FROM ul_warranty_type_for_sell_price_so E
  165.         INNER JOIN ul_header D ON D.ul_header_id=E.ul_header_id
  166.         WHERE E.ul_header_id = pUlHeaderId
  167.         GROUP BY D.tenant_id, E.ou_code, E.product_code, E.sell_price_date, E.price_level, E.warranty_type_code
  168.         HAVING COUNT(E.product_code) > 1
  169.     )
  170.     UPDATE ul_warranty_type_for_sell_price_so Z
  171.     SET status = vStatusX, message = Z.message||'Warranty Type For Sell Price SO is a duplicate; '
  172.     FROM ul_warranty_type_for_sell_price_so A
  173.     INNER JOIN ul_header B ON B.ul_header_id=A.ul_header_id
  174.     INNER JOIN duplicateCode C
  175.         ON B.tenant_id = C.tenant_id
  176.         AND A.ou_code = C.ou_code
  177.         AND A.product_code = C.product_code
  178.         AND A.sell_price_date = C.sell_price_date
  179.         AND A.price_level = C.price_level
  180.         AND A.warranty_type_code = C.warranty_type_code
  181.     WHERE A.ul_header_id = pUlHeaderId
  182.         AND A.status <> vStatusFail
  183.         AND A.ul_warranty_type_for_sell_price_so_id = Z.ul_warranty_type_for_sell_price_so_id;
  184.        
  185.        
  186.     -- Update semua yang vStatusX jadi xStatusFail
  187.     UPDATE ul_warranty_type_for_sell_price_so SET status = vStatusFail
  188.     WHERE status = vStatusX
  189.     AND ul_header_id = pUlHeaderId;
  190.    
  191.     -- Update semua yang vEmpty jadi vStatusOk
  192.     UPDATE ul_warranty_type_for_sell_price_so SET status = vStatusOk
  193.     WHERE status = vEmpty
  194.     AND ul_header_id = pUlHeaderId;
  195.    
  196.     --Hapus data yang sell_price_product_for_so_id-nya tidak ditemukan pada m_sell_price_product_for_so
  197.     DELETE FROM m_warranty_type_for_sell_price_so Z
  198.     WHERE Z.sell_price_product_for_so_id NOT IN (
  199.         SELECT sell_price_product_for_so_id
  200.             FROM m_sell_price_product_for_so
  201.         );
  202.    
  203.     --Hapus data lama
  204.     DELETE FROM m_warranty_type_for_sell_price_so Z
  205.     WHERE EXISTS (
  206.         SELECT TRUE
  207.             FROM ul_warranty_type_for_sell_price_so A
  208.             INNER JOIN ul_header B
  209.                 ON B.ul_header_id=A.ul_header_id
  210.             INNER JOIN t_ou D
  211.                 ON A.ou_code = D.ou_code AND B.tenant_id = D.tenant_id
  212.             INNER JOIN m_product E
  213.                 ON A.product_code = E.product_code AND B.tenant_id = E.tenant_id
  214.             INNER JOIN t_combo_value F
  215.                 ON F.combo_id = vPriceLevelComboId AND F.prop_key = A.price_level
  216.             INNER JOIN m_sell_price_product_for_so G
  217.                 ON B.tenant_id=G.tenant_id
  218.                 AND D.ou_id=G.ou_id
  219.                 AND E.product_id=G.product_id
  220.                 AND A.sell_price_date > G.date_from
  221.                 AND A.sell_price_date < G.date_to
  222.                 AND F.code = G.price_level
  223.             INNER JOIN m_warranty_type H
  224.                 ON A.warranty_type_code=H.warranty_type_code AND H.tenant_id=B.tenant_id
  225.             WHERE A.ul_header_id=pUlHeaderId AND
  226.                 A.status=vStatusOk AND
  227.                 Z.tenant_id = B.tenant_id AND
  228.                 Z.sell_price_product_for_so_id = G.sell_price_product_for_so_id AND
  229.                 Z.warranty_type_id = H.warranty_type_id
  230.         );
  231.    
  232.     --Insert semua data
  233.     INSERT INTO m_warranty_type_for_sell_price_so
  234.         (tenant_id,
  235.         sell_price_product_for_so_id,
  236.         warranty_type_id,
  237.         warranty_sell_price_type,
  238.         warranty_sell_price,
  239.         active, active_datetime, non_active_datetime,
  240.         create_datetime, create_user_id, update_datetime, update_user_id, version)
  241.     SELECT B.tenant_id,
  242.         G.sell_price_product_for_so_id,
  243.         H.warranty_type_id,
  244.         CASE
  245.             WHEN (A.warranty_sell_price_type = vAmount) THEN vAmt
  246.             WHEN (A.warranty_sell_price_type = vPercentage) THEN vPct
  247.         END,
  248.         CAST(A.warranty_sell_price AS numeric(15,2)),
  249.         vYes, vCurrentDateTime, vSpaceValue,
  250.         vCurrentDateTime, B.user_id, vCurrentDateTime, B.user_id, vVersion
  251.     FROM ul_warranty_type_for_sell_price_so A
  252.     INNER JOIN ul_header B
  253.         ON B.ul_header_id=A.ul_header_id
  254.     INNER JOIN t_ou D
  255.         ON A.ou_code = D.ou_code AND B.tenant_id = D.tenant_id
  256.     INNER JOIN m_product E
  257.         ON A.product_code = E.product_code AND B.tenant_id = E.tenant_id
  258.     INNER JOIN t_combo_value F
  259.         ON F.combo_id = vPriceLevelComboId AND F.prop_key = A.price_level
  260.     INNER JOIN m_sell_price_product_for_so G
  261.         ON B.tenant_id=G.tenant_id
  262.         AND D.ou_id=G.ou_id
  263.         AND E.product_id=G.product_id
  264.         AND A.sell_price_date > G.date_from
  265.         AND A.sell_price_date < G.date_to
  266.         AND F.code = G.price_level
  267.     INNER JOIN m_warranty_type H
  268.         ON A.warranty_type_code=H.warranty_type_code AND H.tenant_id=B.tenant_id
  269.     WHERE A.ul_header_id=pUlHeaderId AND
  270.          A.status=vStatusOk;   
  271.    
  272.     -- Hitung jumlah yang fail, dan kembalikan nilanya
  273.    SELECT COUNT(ul_warranty_type_for_sell_price_so_id) INTO vCount
  274.    FROM ul_warranty_type_for_sell_price_so
  275.    WHERE
  276.      ul_header_id = pUlHeaderId
  277.      AND status = vStatusFail;
  278.  
  279.    RETURN vCount;      
  280.        
  281. END;
  282. $BODY$
  283.   LANGUAGE plpgsql VOLATILE
  284.   COST 100;
  285.   /
Add Comment
Please, Sign In to add comment