Advertisement
aadddrr

upload_sell_price_product_for_so

Sep 18th, 2017
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. --Adrian, Jan 11, 2017
  2.  
  3. CREATE OR REPLACE FUNCTION upload_sell_price_product_for_so(bigint)
  4.   RETURNS integer AS
  5. $BODY$
  6.  
  7. DECLARE
  8.     pUlHeaderId             ALIAS FOR $1;
  9.    
  10.     vCount                  bigint;
  11.     vStatusOk               character varying;
  12.     vStatusFail             character varying;
  13.     vStatusX                character varying;
  14.     vEmpty                  character varying;
  15.     vCurrentDateTime        character varying;
  16.     vCurrComboId            character varying;
  17.     vYesNoComboId           character varying;
  18.     vPriceLevelComboId      character varying;
  19.     vYes                    character varying;
  20.     vRounding               integer;
  21.     vRoundingMode           character varying;
  22.     vSpaceValue             character varying;
  23.     vNullValueLong          bigint;
  24.     vTenantId               bigint;
  25.     vVersion                bigint;
  26.    
  27. BEGIN
  28.     vStatusOk := 'OK';
  29.     vStatusFail := 'FAIL';
  30.     vStatusX := 'X'; -- untuk yang fail karena validasi difungsi ini, akan ditandai X dulu untuk membedakan dengan yang validasi dari Spring batch untuk domain data
  31.     vEmpty := '';
  32.     vCurrComboId := 'CURRENCY';
  33.     vYesNoComboId := 'YESNO';
  34.     vPriceLevelComboId := 'PRICELEVEL';
  35.     vYes := 'Y';
  36.     vSpaceValue := ' ';
  37.     vTenantId := 10;
  38.     vNullValueLong := -99;
  39.     vVersion := 1;
  40.    -- This function returns integer  how many item fails
  41.  
  42.    -- Untuk yang tidak lolos domain data validation, field status sudah berisi FAIL
  43.    -- Di sini melanjutkan business validation, hanya yang status belum diset sebagai 'FAIL'
  44.    
  45.    
  46.     IF EXISTS(SELECT 1 FROM ul_skip_detail WHERE ul_header_id = pUlHeaderId) THEN
  47.         RAISE EXCEPTION 'ADA ITEM YANG DI SKIP';
  48.     END IF;
  49.    
  50.     SELECT f_datetime((extract(epoch from now())*1000)::bigint) INTO vCurrentDateTime;
  51.     SELECT f_get_value_system_config_by_param_code(vTenantId, 'rounding.mode.non.tax') INTO vRoundingMode;
  52.     SELECT f_get_value_system_config_by_param_code(vTenantId, 'rounding.scale.non.tax') INTO vRounding;
  53.    
  54.     --Validation currency code must be suitable with combo CURRENCY
  55.     UPDATE ul_sell_price_product_for_so Z  SET status= vStatusX , message = Z.message||'currency not exists; '
  56.     FROM    
  57.         ul_sell_price_product_for_so A
  58.     INNER JOIN ul_header C ON C.ul_header_id=A.ul_header_id
  59.     WHERE A.ul_header_id = pUlHeaderId
  60.     AND A.status <> vStatusFail
  61.     AND NOT EXISTS (
  62.         SELECT TRUE
  63.         FROM t_combo_value
  64.         WHERE combo_id = vCurrComboId AND code = A.curr_code
  65.     )
  66.     AND Z.ul_sell_price_product_for_so_id = A.ul_sell_price_product_for_so_id;
  67.    
  68.     --Validation active must be suitable with combo YES NO
  69.     UPDATE ul_sell_price_product_for_so Z  SET status= vStatusX , message = Z.message||'active type not exists; '
  70.     FROM    
  71.         ul_sell_price_product_for_so A
  72.     INNER JOIN ul_header C ON C.ul_header_id=A.ul_header_id
  73.     WHERE A.ul_header_id = pUlHeaderId
  74.     AND A.status <> vStatusFail
  75.     AND NOT EXISTS (
  76.         SELECT TRUE
  77.         FROM t_combo_value
  78.         WHERE combo_id = vYesNoComboId AND code = A.active
  79.     )
  80.     AND Z.ul_sell_price_product_for_so_id = A.ul_sell_price_product_for_so_id;
  81.    
  82.     --Validation flag vat amount
  83.     UPDATE ul_sell_price_product_for_so Z  SET status= vStatusX , message = Z.message||'inc tax type not exists; '
  84.     FROM    
  85.         ul_sell_price_product_for_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 = vYesNoComboId AND code = A.flg_tax_amount
  93.     )
  94.     AND Z.ul_sell_price_product_for_so_id = A.ul_sell_price_product_for_so_id;
  95.    
  96.     --Validation priceLevel must be suitable with combo PRICE LEVEL
  97.     UPDATE ul_sell_price_product_for_so Z  SET status= vStatusX , message = Z.message||'price level not exists; '
  98.     FROM    
  99.         ul_sell_price_product_for_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 TRUE
  105.         FROM t_combo_value
  106.         WHERE combo_id = vPriceLevelComboId AND code = A.price_level
  107.     )
  108.     AND Z.ul_sell_price_product_for_so_id = A.ul_sell_price_product_for_so_id;
  109.    
  110.     --validasi ou_code harus ada
  111.     UPDATE ul_sell_price_product_for_so Z  SET status= vStatusX , message = Z.message||'Org Unit not exists; '
  112.     FROM    
  113.     ul_sell_price_product_for_so A
  114.     INNER JOIN ul_header C ON C.ul_header_id=A.ul_header_id
  115.     WHERE A.ul_header_id = pUlHeaderId
  116.     AND A.status <> vStatusFail
  117.     AND NOT EXISTS (
  118.         SELECT (1) FROM t_ou B
  119.         WHERE A.ou_code=B.ou_code AND C.tenant_id=B.tenant_id AND B.active=vYes)
  120.     AND Z.ul_sell_price_product_for_so_id = A.ul_sell_price_product_for_so_id;
  121.    
  122.     --validasi product_code harus ada
  123.     UPDATE ul_sell_price_product_for_so Z  SET status= vStatusX , message = Z.message||'Product Code not exists; '
  124.     FROM    
  125.     ul_sell_price_product_for_so A
  126.     INNER JOIN ul_header C ON C.ul_header_id=A.ul_header_id
  127.     WHERE A.ul_header_id = pUlHeaderId
  128.     AND A.status <> vStatusFail
  129.     AND NOT EXISTS (
  130.         SELECT (1) FROM m_product B
  131.         WHERE A.product_code=B.product_code AND C.tenant_id=B.tenant_id AND B.active=vYes AND B.flg_sell=vYes)
  132.     AND Z.ul_sell_price_product_for_so_id = A.ul_sell_price_product_for_so_id;
  133.    
  134.     -- Validasi date from harus format yyyymmdd    
  135.     UPDATE ul_sell_price_product_for_so Z
  136.     SET status = vStatusX, message = Z.message || 'Period Start not in YYYYMMDD format; '
  137.     FROM ul_sell_price_product_for_so A
  138.     WHERE A.ul_header_id = pUlHeaderId
  139.         AND A.ul_sell_price_product_for_so_id = Z.ul_sell_price_product_for_so_id
  140.         AND A.status <> vStatusFail
  141.         AND isValidDate(A.date_from) IS FALSE;
  142.        
  143.     -- Validasi date to harus format yyyymmdd    
  144.     UPDATE ul_sell_price_product_for_so Z
  145.     SET status = vStatusX, message = Z.message || 'Period End not in YYYYMMDD format; '
  146.     FROM ul_sell_price_product_for_so A
  147.     WHERE A.ul_header_id = pUlHeaderId
  148.         AND A.ul_sell_price_product_for_so_id = Z.ul_sell_price_product_for_so_id
  149.         AND A.status <> vStatusFail
  150.         AND isValidDate(A.date_to) IS FALSE;
  151.        
  152.     -- Validasi sell price harus angka
  153.     UPDATE ul_sell_price_product_for_so Z
  154.     SET status = vStatusX, message = Z.message||'Sell Price must be numeric; '
  155.     FROM ul_sell_price_product_for_so A
  156.     WHERE A.ul_header_id = pUlHeaderId
  157.     AND A.ul_sell_price_product_for_so_id = Z.ul_sell_price_product_for_so_id
  158.     AND A.status <> vStatusFail
  159.     AND isnumeric(A.sell_price) IS FALSE;
  160.    
  161.     -- Validasi min sell price harus angka
  162.     UPDATE ul_sell_price_product_for_so Z
  163.     SET status = vStatusX, message = Z.message||'Min Sell Price must be numeric; '
  164.     FROM ul_sell_price_product_for_so A
  165.     WHERE A.ul_header_id = pUlHeaderId
  166.     AND A.ul_sell_price_product_for_so_id = Z.ul_sell_price_product_for_so_id
  167.     AND A.status <> vStatusFail
  168.     AND isnumeric(A.min_sell_price) IS FALSE;
  169.    
  170.     -- Validasi tidak boleh duplikat
  171.     WITH duplicateCode AS (
  172.     SELECT D.tenant_id, E.ou_code, E.product_code, E.date_from, E.price_level, COUNT(E.product_code)
  173.     FROM ul_sell_price_product_for_so E
  174.     INNER JOIN ul_header D ON D.ul_header_id=E.ul_header_id
  175.     WHERE E.ul_header_id = pUlHeaderId
  176.     GROUP BY D.tenant_id, E.ou_code, E.product_code, E.date_from, E.price_level
  177.     HAVING COUNT(E.product_code) > 1
  178.     )
  179.     UPDATE ul_sell_price_product_for_so Z
  180.     SET status = vStatusX, message = Z.message||'Sell Price Product For SO is a duplicate; '
  181.     FROM ul_sell_price_product_for_so A
  182.     INNER JOIN ul_header B ON B.ul_header_id=A.ul_header_id
  183.     INNER JOIN duplicateCode C
  184.         ON B.tenant_id = C.tenant_id
  185.         AND A.ou_code = C.ou_code
  186.         AND A.product_code = C.product_code
  187.         AND A.date_from = C.date_from
  188.         AND A.price_level = C.price_level
  189.     WHERE A.ul_header_id = pUlHeaderId
  190.         AND A.status <> vStatusFail
  191.         AND A.ul_sell_price_product_for_so_id = Z.ul_sell_price_product_for_so_id;
  192.        
  193.        
  194.     --validasi overlap
  195.     UPDATE ul_sell_price_product_for_so Z  SET status= vStatusX , message = Z.message||'Period Overlap; '
  196.     FROM    
  197.     ul_sell_price_product_for_so A
  198.     INNER JOIN ul_header C ON C.ul_header_id=A.ul_header_id
  199.     WHERE A.ul_header_id = pUlHeaderId
  200.     AND A.status <> vStatusFail
  201.     AND EXISTS (
  202.         SELECT (1)
  203.         FROM ul_sell_price_product_for_so B
  204.         INNER JOIN ul_header D ON D.ul_header_id=B.ul_header_id
  205.         WHERE C.tenant_id = D.tenant_id
  206.             AND A.ou_code = B.ou_code
  207.             AND A.product_code = B.product_code
  208.             AND A.date_from <= B.date_to
  209.             AND A.date_to >= B.date_from
  210.             AND A.ul_sell_price_product_for_so_id <> B.ul_sell_price_product_for_so_id
  211.             AND A.price_level = B.price_level
  212.             AND B.ul_header_id = pUlHeaderId
  213.             )
  214.     AND Z.ul_sell_price_product_for_so_id = A.ul_sell_price_product_for_so_id;
  215.    
  216.        
  217.     -- Update semua yang vStatusX jadi xStatusFail
  218.     UPDATE ul_sell_price_product_for_so SET status = vStatusFail
  219.     WHERE status = vStatusX
  220.     AND ul_header_id = pUlHeaderId;
  221.    
  222.     -- Update semua yang vEmpty jadi vStatusOk
  223.     UPDATE ul_sell_price_product_for_so SET status = vStatusOk
  224.     WHERE status = vEmpty
  225.     AND ul_header_id = pUlHeaderId;
  226.    
  227.     --Hapus data lama
  228.     DELETE FROM m_sell_price_product_for_so Z
  229.     WHERE EXISTS (
  230.         SELECT TRUE
  231.             FROM ul_sell_price_product_for_so A
  232.             INNER JOIN ul_header B
  233.                 ON B.ul_header_id=A.ul_header_id
  234.             INNER JOIN t_ou C
  235.                 ON A.ou_code = C.ou_code AND B.tenant_id = C.tenant_id
  236.             INNER JOIN m_product D
  237.                 ON A.product_code = D.product_code AND B.tenant_id = D.tenant_id
  238.             WHERE A.ul_header_id=pUlHeaderId AND
  239.                 A.status=vStatusOk AND
  240.                 Z.tenant_id = B.tenant_id AND
  241.                 Z.ou_id = C.ou_id AND
  242.                 Z.product_id = D.product_id AND
  243.                 Z.date_from = A.date_from
  244.         );
  245.        
  246.     --Insert semua data
  247.     INSERT INTO m_sell_price_product_for_so
  248.         (tenant_id, ou_id, product_id,
  249.         date_from, date_to,
  250.         curr_code,
  251.         flg_tax_amount,
  252.         price_level,
  253.         min_sell_price,
  254.         active,
  255.         create_datetime, create_user_id, update_datetime, update_user_id, version)
  256.     SELECT B.tenant_id, C.ou_id, D.product_id,
  257.         A.date_from, A.date_to,
  258.         A.curr_code,
  259.         A.flg_tax_amount,
  260.         A.price_level,
  261.         CAST (A.min_sell_price AS numeric(15,2)),
  262.         A.active,
  263.         vCurrentDateTime, B.user_id, vCurrentDateTime, B.user_id, vVersion
  264.     FROM ul_sell_price_product_for_so A
  265.     INNER JOIN ul_header B
  266.         ON B.ul_header_id=A.ul_header_id
  267.     INNER JOIN t_ou C
  268.         ON A.ou_code = C.ou_code AND B.tenant_id = C.tenant_id
  269.     INNER JOIN m_product D
  270.         ON A.product_code = D.product_code AND B.tenant_id = D.tenant_id
  271.     WHERE A.ul_header_id=pUlHeaderId AND
  272.          A.status=vStatusOk;
  273.          
  274.     --Update price dan tax untuk flg_tax_amount = 'Y' dan flg_tax = 'Y'
  275.     UPDATE m_sell_price_product_for_so Z
  276.     SET gross_sell_price = CAST(A.sell_price AS numeric(15,2)),
  277.         tax_id = F.tax_id,
  278.         tax_amount = ROUND(f_get_amount_before_tax(CAST(A.sell_price AS numeric(15,2)), 'Y', F.percentage, vRounding, vRoundingMode) * F.percentage/100 ,2),
  279.         sell_price = ROUND(f_get_amount_before_tax(CAST(A.sell_price AS numeric(15,2)), 'Y', F.percentage, vRounding, vRoundingMode) ,2)
  280.     FROM ul_sell_price_product_for_so A
  281.     INNER JOIN ul_header B
  282.         ON B.ul_header_id=A.ul_header_id
  283.     INNER JOIN t_ou C
  284.         ON A.ou_code = C.ou_code AND B.tenant_id = C.tenant_id
  285.     INNER JOIN m_product D
  286.         ON A.product_code = D.product_code AND B.tenant_id = D.tenant_id
  287.     --INNER JOIN t_ou_legal E ON E.ou_id = C.ou_id
  288.     INNER JOIN m_tax F ON F.tenant_id = B.tenant_id
  289.     WHERE
  290.         Z.tenant_id = B.tenant_id AND
  291.         Z.ou_id = C.ou_id AND
  292.         Z.product_id = D.product_id AND
  293.         Z.date_from = A.date_from AND
  294.         --E.flg_pkp = vYes AND
  295.         Z.flg_tax_amount = vYes AND
  296.         A.flg_tax = vYes AND
  297.         A.ul_header_id = pUlHeaderId;
  298.          
  299.     --Update price dan tax untuk flg_tax_amount <> 'Y' dan flg_tax = 'Y'
  300.     UPDATE m_sell_price_product_for_so Z
  301.     SET gross_sell_price = CAST(A.sell_price AS numeric(15,2)),
  302.         tax_id = F.tax_id,
  303.         tax_amount = ROUND((CAST(A.sell_price AS numeric(15,2))) * F.percentage/100 ,2),
  304.         sell_price = CAST(A.sell_price AS numeric(15,2)) + ROUND((CAST(A.sell_price AS numeric(15,2))) * F.percentage/100 ,2)
  305.     FROM ul_sell_price_product_for_so A
  306.     INNER JOIN ul_header B
  307.         ON B.ul_header_id=A.ul_header_id
  308.     INNER JOIN t_ou C
  309.         ON A.ou_code = C.ou_code AND B.tenant_id = C.tenant_id
  310.     INNER JOIN m_product D
  311.         ON A.product_code = D.product_code AND B.tenant_id = D.tenant_id
  312.     INNER JOIN m_tax F ON F.tenant_id = B.tenant_id
  313.     WHERE
  314.         Z.tenant_id = B.tenant_id AND
  315.         Z.ou_id = C.ou_id AND
  316.         Z.product_id = D.product_id AND
  317.         Z.date_from = A.date_from AND
  318.         Z.flg_tax_amount <> vYes AND
  319.         A.flg_tax = vYes AND
  320.         A.ul_header_id = pUlHeaderId;
  321.    
  322.     --Update price dan tax untuk flg_tax_amount <> 'Y' dan flg_tax <> 'Y'
  323.     UPDATE m_sell_price_product_for_so Z
  324.     SET gross_sell_price = CAST(A.sell_price AS numeric(15,2)),
  325.         tax_id = vNullValueLong,
  326.         tax_amount = 0,
  327.         sell_price = CAST(A.sell_price AS numeric(15,2))
  328.     FROM ul_sell_price_product_for_so A
  329.     INNER JOIN ul_header B
  330.         ON B.ul_header_id=A.ul_header_id
  331.     INNER JOIN t_ou C
  332.         ON A.ou_code = C.ou_code AND B.tenant_id = C.tenant_id
  333.     INNER JOIN m_product D
  334.         ON A.product_code = D.product_code AND B.tenant_id = D.tenant_id
  335.     WHERE
  336.         Z.tenant_id = B.tenant_id AND
  337.         Z.ou_id = C.ou_id AND
  338.         Z.product_id = D.product_id AND
  339.         Z.date_from = A.date_from AND
  340.         Z.flg_tax_amount <> vYes AND
  341.         A.flg_tax <> vYes AND
  342.         A.ul_header_id = pUlHeaderId;
  343.        
  344.     --Update activeDateTime dan nonActiveDateTime untuk active = 'Y'
  345.     UPDATE m_sell_price_product_for_so Z
  346.     SET active_datetime = vCurrentDateTime,
  347.         non_active_datetime = vSpaceValue
  348.     FROM ul_sell_price_product_for_so A
  349.     INNER JOIN ul_header B
  350.         ON B.ul_header_id=A.ul_header_id
  351.     INNER JOIN t_ou C
  352.         ON A.ou_code = C.ou_code AND B.tenant_id = C.tenant_id
  353.     INNER JOIN m_product D
  354.         ON A.product_code = D.product_code AND B.tenant_id = D.tenant_id
  355.     WHERE
  356.         Z.tenant_id = B.tenant_id AND
  357.         Z.ou_id = C.ou_id AND
  358.         Z.product_id = D.product_id AND
  359.         Z.date_from = A.date_from AND
  360.         Z.price_level = A.price_level AND
  361.         Z.active = vYes AND
  362.         A.ul_header_id = pUlHeaderId;
  363.        
  364.     --Update activeDateTime dan nonActiveDateTime untuk active <> 'Y'
  365.     UPDATE m_sell_price_product_for_so Z
  366.     SET active_datetime = vSpaceValue,
  367.         non_active_datetime = vSpaceValue
  368.     FROM ul_sell_price_product_for_so A
  369.     INNER JOIN ul_header B
  370.         ON B.ul_header_id=A.ul_header_id
  371.     INNER JOIN t_ou C
  372.         ON A.ou_code = C.ou_code AND B.tenant_id = C.tenant_id
  373.     INNER JOIN m_product D
  374.         ON A.product_code = D.product_code AND B.tenant_id = D.tenant_id
  375.     WHERE
  376.         Z.tenant_id = B.tenant_id AND
  377.         Z.ou_id = C.ou_id AND
  378.         Z.product_id = D.product_id AND
  379.         Z.date_from = A.date_from AND
  380.         Z.price_level = A.price_level AND
  381.         Z.active <> vYes AND
  382.         A.ul_header_id = pUlHeaderId;
  383.    
  384.     -- Hitung jumlah yang fail, dan kembalikan nilanya
  385.    SELECT COUNT(ul_sell_price_product_for_so_id) INTO vCount
  386.    FROM ul_sell_price_product_for_so
  387.    WHERE
  388.      ul_header_id = pUlHeaderId
  389.      AND status = vStatusFail;
  390.  
  391.    RETURN vCount;  
  392.        
  393. END;
  394. $BODY$
  395.   LANGUAGE plpgsql VOLATILE
  396.   COST 100;
  397.   /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement