Advertisement
aadddrr

f_update_po_item_price_20180507

May 6th, 2018
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. --Adrian, May 4, 2018
  2. --Untuk update data harga PO yang dibuat sampai dengan RG
  3.  
  4. CREATE OR REPLACE FUNCTION f_update_po_item_price(BIGINT, BIGINT, BIGINT, CHARACTER VARYING, NUMERIC, CHARACTER VARYING, BIGINT, NUMERIC)
  5.   RETURNS void AS
  6. $BODY$
  7. DECLARE
  8.     pTenantId                   ALIAS FOR $1;
  9.     pPoItemId                   ALIAS FOR $2;
  10.     pUserId                     ALIAS FOR $3;
  11.     pDatetime                   ALIAS FOR $4;
  12.     pNewGrossPricePo            ALIAS FOR $5;
  13.     pNewFlgTaxAmount            ALIAS FOR $6;
  14.     pNewTaxId                   ALIAS FOR $7;
  15.     pNewDiscountPercentage      ALIAS FOR $8;
  16.    
  17.     vDecimalForRounding         integer;
  18.     vRoundingMode               character varying;
  19.     vUsedGrossPricePo           numeric;       
  20.     vCurrCode                   character varying;
  21.     vDigitDppRoundingTax        integer;
  22.    
  23.     vYes                            character varying;
  24.     vEmptyId                        bigint;
  25.     vRoundingModeDown               character varying;
  26.     vPurchaseOrderDocTypeId         bigint;
  27.     vParamCodeRoundingModeNonTax    character varying;
  28.     vParamCodeDppRoundingDecimalTax character varying;
  29.    
  30. BEGIN
  31.    
  32.     vYes := 'Y';
  33.     vEmptyId := -99;
  34.     vRoundingModeDown := 'RD';
  35.     vPurchaseOrderDocTypeId := 101;
  36.     vParamCodeRoundingModeNonTax :='rounding.mode.non.tax';
  37.     vParamCodeDppRoundingDecimalTax := 'dpp.rounding.decimal.tax';
  38.    
  39.     SELECT curr_code FROM pu_po_item A WHERE A.po_item_id = pPoItemId INTO vCurrCode;
  40.    
  41.     IF NOT FOUND THEN
  42.         RAISE EXCEPTION 'Purchase Order Item Id % is not found', pPoItemId;
  43.    
  44.     SELECT f_get_value_system_config_by_param_code(pTenantId, vParamCodeRoundingModeNonTax) INTO vRoundingMode;
  45.     SELECT f_get_digit_decimal_doc_curr(vPurchaseOrderDocTypeId, curr_code) INTO vDecimalForRounding;
  46.     SELECT f_get_value_system_config_by_param_code(pTenantId, vParamCodeDppRoundingDecimalTax)::integer INTO vDigitDppRoundingTax;
  47.    
  48.     --Validasi flg_tax_amount harus sesuai dengan combo YESNO
  49.     IF NOT EXISTS (
  50.         SELECT 1
  51.         FROM t_combo_value A
  52.         WHERE A.combo_id = vComboIdYesNo AND
  53.             A.code = pNewFlgTaxAmount
  54.     ) THEN
  55.         RAISE EXCEPTION 'Value Flag Tax Amount is not valid ,should not have values : %',
  56.             pNewFlgTaxAmount;
  57.     END IF;
  58.    
  59.     --Validasi jika flg_tax_amount = 'Y', maka tax_id tidak boleh -99
  60.     IF (pNewFlgTaxAmount = vYes AND pNewTaxId = vEmptyId) THEN
  61.         RAISE EXCEPTION 'Gross Price is including tax, so you must choose tax value';
  62.     END IF;
  63.    
  64.     --Validasi Gross Price harus >= 0
  65.     IF pNewGrossPricePo < 0 THEN
  66.         RAISE EXCEPTION '% must be >= 0 (zero)',
  67.             pNewGrossPricePo;
  68.     END IF;
  69.    
  70.     --Hitung Gross Price setelah discount
  71.     SELECT CASE WHEN (vRoundingMode = vRoundingModeDown) THEN
  72.             TRUNC(pNewGrossPricePo, vDecimalForRounding) - TRUNC(pNewGrossPricePo * pNewDiscountPercentage / 100, vDecimalForRounding)
  73.         ELSE
  74.             ROUND(pNewGrossPricePo, vDecimalForRounding) - ROUND(pNewGrossPricePo * pNewDiscountPercentage / 100, vDecimalForRounding)
  75.         END
  76.     INTO vUsedGrossPricePo;
  77.    
  78.    
  79.     --Update pajak lama di pu_po_tax
  80.     UPDATE pu_po_tax Z
  81.     SET base_amount = Z.base_amount - f_get_amount_before_tax(A.gross_item_amount, A.flg_tax_amount, A.tax_percentage, vDecimalForRounding, vRoundingMode),
  82.         tax_amount = Z.tax_amount - f_tax_rounding(A.tenant_id, f_get_amount_before_tax(A.gross_item_amount, A.flg_tax_amount, A.tax_percentage, vDecimalForRounding, vRoundingMode), A.tax_percentage),
  83.         update_user_id = pUserId,
  84.         update_datetime = pDatetime
  85.     FROM pu_po_item A
  86.     WHERE A.po_item_id = pPoItemId AND
  87.         A.tax_id <> vEmptyId AND
  88.         Z.tenant_id = A.tenant_id AND
  89.         Z.po_id = A.po_id AND
  90.         Z.tax_id = A.tax_id;
  91.        
  92.     --Update balance invoice dengan harga lama
  93.      UPDATE pu_po_balance_invoice Z
  94.      SET price_po = Z.price_po - A.nett_price_po,
  95.         item_amount = Z.item_amount - f_get_amount_before_tax(B.qty_rcv_po * (A.gross_price_po - A.discount_amount),A.flg_tax_amount,A.tax_percentage,vDigitDppRoundingTax, vRoundingMode),
  96.         update_user_id = pUserId,
  97.         update_datetime = pDatetime
  98.      FROM pu_po_item A
  99.      INNER JOIN pu_receive_goods_item B ON A.po_item_id = B.ref_id
  100.      INNER JOIN pu_receive_goods C ON B.receive_goods_id = C.receive_goods_id
  101.      WHERE A.po_item_id = pPoItemId AND
  102.         Z.tenant_id = C.tenant_id AND
  103.         Z.ou_id = C.ou_id AND
  104.         Z.po_id = C.ref_id AND
  105.         Z.ref_doc_type_id = C.doc_type_id AND
  106.         Z.ref_id = C.receive_goods_id AND
  107.         Z.ref_item_id = B.receive_goods_item_id;
  108.        
  109.     --Update balance invoice tax dengan harga lama
  110.      UPDATE pu_po_balance_invoice_tax Z
  111.      SET base_amount = Z.base_amount - A.nett_price_po,
  112.         tax_amount = Z.tax_amount - f_get_amount_before_tax(B.qty_rcv_po * (A.gross_price_po - A.discount_amount),A.flg_tax_amount,A.tax_percentage,vDigitDppRoundingTax, vRoundingMode),
  113.         update_user_id = pUserId,
  114.         update_datetime = pDatetime
  115.      FROM pu_po_item A
  116.      INNER JOIN pu_receive_goods_item B ON A.po_item_id = B.ref_id
  117.      INNER JOIN pu_receive_goods C ON B.receive_goods_id = C.receive_goods_id
  118.      WHERE A.po_item_id = pPoItemId AND
  119.         Z.tenant_id = C.tenant_id AND
  120.         Z.ou_id = C.ou_id AND
  121.         Z.po_id = C.ref_id AND
  122.         Z.ref_doc_type_id = C.doc_type_id AND
  123.         Z.ref_id = C.receive_goods_id AND
  124.         Z.ref_item_id = B.receive_goods_item_id AND
  125.         Z.tax_id = A.tax_id;
  126.    
  127.     --Update harga pada item PO
  128.     IF (pNewFlgTaxAmount = vYes) THEN
  129.         --harga include pajak
  130.         UPDATE pu_po_item Z
  131.         SET gross_price_po = vUsedGrossPricePo,
  132.             nett_price_po = vUsedGrossPricePo - CASE WHEN (vRoundingMode = vRoundingModeDown) THEN
  133.                     TRUNC(vUsedGrossPricePo * A.percentage / (100 + A.percentage), vDecimalForRounding)
  134.                 ELSE
  135.                     ROUND(vUsedGrossPricePo * A.percentage / (100 + A.percentage), vDecimalForRounding)
  136.                 END,
  137.             gross_item_amount = vUsedGrossPricePo * Z.qty,
  138.             nett_item_amount = (vUsedGrossPricePo - CASE WHEN (vRoundingMode = vRoundingModeDown) THEN
  139.                     TRUNC(vUsedGrossPricePo * A.percentage / (100 + A.percentage), vDecimalForRounding)
  140.                 ELSE
  141.                     ROUND(vUsedGrossPricePo * A.percentage / (100 + A.percentage), vDecimalForRounding)
  142.                 END) * Z.qty,
  143.             tax_price =
  144.                 CASE WHEN (vRoundingMode = vRoundingModeDown) THEN
  145.                     TRUNC(vUsedGrossPricePo * A.percentage / (100 + A.percentage), vDecimalForRounding)
  146.                 ELSE
  147.                     ROUND(vUsedGrossPricePo * A.percentage / (100 + A.percentage), vDecimalForRounding)
  148.                 END
  149.             tax_amount =
  150.                 CASE WHEN (vRoundingMode = vRoundingModeDown) THEN
  151.                     TRUNC(vUsedGrossPricePo * A.percentage / (100 + A.percentage), vDecimalForRounding) * Z.qty
  152.                 ELSE
  153.                     ROUND(vUsedGrossPricePo * A.percentage / (100 + A.percentage), vDecimalForRounding) * Z.qty
  154.                 END
  155.             tax_percentage = A.percentage,
  156.             flg_tax_amount = pNewFlgTaxAmount,
  157.             tax_id = pNewTaxId,
  158.             update_user_id = pUserId,
  159.             update_datetime = pDatetime
  160.         FROM m_tax A
  161.         WHERE A.tax_id = pNewTaxId AND
  162.             Z.po_item_id = pPoItemId;
  163.     ELSE
  164.         IF (pNewTaxId <> vEmptyId) THEN
  165.             --harga exclude pajak,
  166.             --tetapi ada pajak
  167.             UPDATE pu_po_item Z
  168.             SET gross_price_po = vUsedGrossPricePo,
  169.                 nett_price_po = vUsedGrossPricePo,
  170.                 gross_item_amount = vUsedGrossPricePo * Z.qty,
  171.                 nett_item_amount = vUsedGrossPricePo * Z.qty,
  172.                 tax_price =
  173.                     CASE WHEN (vRoundingMode = vRoundingModeDown) THEN
  174.                         TRUNC(vUsedGrossPricePo * A.percentage / 100, vDecimalForRounding)
  175.                     ELSE
  176.                         ROUND(vUsedGrossPricePo * A.percentage / 100, vDecimalForRounding)
  177.                     END
  178.                 tax_amount =
  179.                     CASE WHEN (vRoundingMode = vRoundingModeDown) THEN
  180.                         TRUNC(vUsedGrossPricePo * A.percentage / 100, vDecimalForRounding) * Z.qty
  181.                     ELSE
  182.                         ROUND(vUsedGrossPricePo * A.percentage / 100, vDecimalForRounding) * Z.qty
  183.                     END
  184.                 tax_percentage = A.percentage,
  185.                 flg_tax_amount = pNewFlgTaxAmount,
  186.                 tax_id = pNewTaxId,
  187.                 update_user_id = pUserId,
  188.                 update_datetime = pDatetime
  189.             FROM m_tax A
  190.             WHERE A.tax_id = pNewTaxId AND
  191.                 Z.po_item_id = pPoItemId;
  192.         ELSE
  193.             --harga exclude pajak dan
  194.             --tanpa pajak
  195.             UPDATE pu_po_item Z
  196.             SET gross_price_po = vUsedGrossPricePo,
  197.                 nett_price_po = vUsedGrossPricePo,
  198.                 gross_item_amount = vUsedGrossPricePo * Z.qty,
  199.                 nett_item_amount = vUsedGrossPricePo * Z.qty,
  200.                 tax_price = 0,
  201.                 tax_amount = 0,
  202.                 tax_percentage = 0,
  203.                 flg_tax_amount = pNewFlgTaxAmount,
  204.                 tax_id = vEmptyId,
  205.                 update_user_id = pUserId,
  206.                 update_datetime = pDatetime
  207.             WHERE Z.po_item_id = pPoItemId;
  208.         END IF;
  209.     END IF;
  210.    
  211.     --Update pajak baru di pu_po_tax
  212.     UPDATE pu_po_tax Z
  213.     SET base_amount = Z.base_amount + f_get_amount_before_tax(A.gross_item_amount, A.flg_tax_amount, A.tax_percentage, vDecimalForRounding, vRoundingMode),
  214.         tax_amount = Z.tax_amount + f_tax_rounding(A.tenant_id, f_get_amount_before_tax(A.gross_item_amount, A.flg_tax_amount, A.tax_percentage, vDecimalForRounding, vRoundingMode), A.tax_percentage),
  215.         update_user_id = pUserId,
  216.         update_datetime = pDatetime
  217.     FROM pu_po_item A
  218.     WHERE A.po_item_id = pPoItemId AND
  219.         A.tax_id <> vEmptyId AND
  220.         Z.tenant_id = A.tenant_id AND
  221.         Z.po_id = A.po_id AND
  222.         Z.tax_id = A.tax_id;
  223.        
  224.      --Update balance invoice dengan harga baru
  225.      UPDATE pu_po_balance_invoice Z
  226.      SET price_po = Z.price_po - A.nett_price_po,
  227.         item_amount = Z.item_amount - f_get_amount_before_tax(B.qty_rcv_po * (A.gross_price_po - A.discount_amount),A.flg_tax_amount,A.tax_percentage,vDigitDppRoundingTax, vRoundingMode),
  228.         update_user_id = pUserId,
  229.         update_datetime = pDatetime
  230.      FROM pu_po_item A
  231.      INNER JOIN pu_receive_goods_item B ON A.po_item_id = B.ref_id
  232.      INNER JOIN pu_receive_goods C ON B.receive_goods_id = C.receive_goods_id
  233.      WHERE A.po_item_id = pPoItemId AND
  234.         Z.tenant_id = C.tenant_id AND
  235.         Z.ou_id = C.ou_id AND
  236.         Z.po_id = C.ref_id AND
  237.         Z.ref_doc_type_id = C.doc_type_id AND
  238.         Z.ref_id = C.receive_goods_id AND
  239.         Z.ref_item_id = B.receive_goods_item_id;
  240.        
  241.        
  242.    
  243. END;
  244. $BODY$
  245.   LANGUAGE plpgsql VOLATILE
  246.   COST 100;
  247.  /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement