Advertisement
aadddrr

f_update_po_item_price_20180507_1

May 6th, 2018
75
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.     vSpaceValue                     character varying;
  26.     vRoundingModeDown               character varying;
  27.     vPurchaseOrderDocTypeId         bigint;
  28.     vReceiveGoodsDocTypeId          bigint;
  29.     vParamCodeRoundingModeNonTax    character varying;
  30.     vParamCodeDppRoundingDecimalTax character varying;
  31.    
  32. BEGIN
  33.    
  34.     vYes := 'Y';
  35.     vSpaceValue := ' ';
  36.     vEmptyId := -99;
  37.     vRoundingModeDown := 'RD';
  38.     vPurchaseOrderDocTypeId := 101;
  39.     vReceiveGoodsDocTypeId := 111;
  40.     vParamCodeRoundingModeNonTax :='rounding.mode.non.tax';
  41.     vParamCodeDppRoundingDecimalTax := 'dpp.rounding.decimal.tax';
  42.    
  43.     SELECT curr_code FROM pu_po_item A WHERE A.po_item_id = pPoItemId INTO vCurrCode;
  44.    
  45.     IF NOT FOUND THEN
  46.         RAISE EXCEPTION 'Purchase Order Item Id % is not found', pPoItemId;
  47.    
  48.     SELECT f_get_value_system_config_by_param_code(pTenantId, vParamCodeRoundingModeNonTax) INTO vRoundingMode;
  49.     SELECT f_get_digit_decimal_doc_curr(vPurchaseOrderDocTypeId, curr_code) INTO vDecimalForRounding;
  50.     SELECT f_get_value_system_config_by_param_code(pTenantId, vParamCodeDppRoundingDecimalTax)::integer INTO vDigitDppRoundingTax;
  51.    
  52.     --Validasi flg_tax_amount harus sesuai dengan combo YESNO
  53.     IF NOT EXISTS (
  54.         SELECT 1
  55.         FROM t_combo_value A
  56.         WHERE A.combo_id = vComboIdYesNo AND
  57.             A.code = pNewFlgTaxAmount
  58.     ) THEN
  59.         RAISE EXCEPTION 'Value Flag Tax Amount is not valid ,should not have values : %',
  60.             pNewFlgTaxAmount;
  61.     END IF;
  62.    
  63.     --Validasi jika flg_tax_amount = 'Y', maka tax_id tidak boleh -99
  64.     IF (pNewFlgTaxAmount = vYes AND pNewTaxId = vEmptyId) THEN
  65.         RAISE EXCEPTION 'Gross Price is including tax, so you must choose tax value';
  66.     END IF;
  67.    
  68.     --Validasi Gross Price harus >= 0
  69.     IF pNewGrossPricePo < 0 THEN
  70.         RAISE EXCEPTION '% must be >= 0 (zero)',
  71.             pNewGrossPricePo;
  72.     END IF;
  73.    
  74.     --Hitung Gross Price setelah discount
  75.     SELECT CASE WHEN (vRoundingMode = vRoundingModeDown) THEN
  76.             TRUNC(pNewGrossPricePo, vDecimalForRounding) - TRUNC(pNewGrossPricePo * pNewDiscountPercentage / 100, vDecimalForRounding)
  77.         ELSE
  78.             ROUND(pNewGrossPricePo, vDecimalForRounding) - ROUND(pNewGrossPricePo * pNewDiscountPercentage / 100, vDecimalForRounding)
  79.         END
  80.     INTO vUsedGrossPricePo;
  81.    
  82.    
  83.     --Update pajak lama di pu_po_tax
  84.     UPDATE pu_po_tax Z
  85.     SET base_amount = Z.base_amount - f_get_amount_before_tax(A.gross_item_amount, A.flg_tax_amount, A.tax_percentage, vDecimalForRounding, vRoundingMode),
  86.         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),
  87.         update_user_id = pUserId,
  88.         update_datetime = pDatetime
  89.     FROM pu_po_item A
  90.     WHERE A.po_item_id = pPoItemId AND
  91.         A.tax_id <> vEmptyId AND
  92.         Z.tenant_id = A.tenant_id AND
  93.         Z.po_id = A.po_id AND
  94.         Z.tax_id = A.tax_id;
  95.    
  96.     --Update harga pada item PO
  97.     IF (pNewFlgTaxAmount = vYes) THEN
  98.         --harga include pajak
  99.         UPDATE pu_po_item Z
  100.         SET gross_price_po = vUsedGrossPricePo,
  101.             nett_price_po = vUsedGrossPricePo - CASE WHEN (vRoundingMode = vRoundingModeDown) THEN
  102.                     TRUNC(vUsedGrossPricePo * A.percentage / (100 + A.percentage), vDecimalForRounding)
  103.                 ELSE
  104.                     ROUND(vUsedGrossPricePo * A.percentage / (100 + A.percentage), vDecimalForRounding)
  105.                 END,
  106.             gross_item_amount = vUsedGrossPricePo * Z.qty,
  107.             nett_item_amount = (vUsedGrossPricePo - CASE WHEN (vRoundingMode = vRoundingModeDown) THEN
  108.                     TRUNC(vUsedGrossPricePo * A.percentage / (100 + A.percentage), vDecimalForRounding)
  109.                 ELSE
  110.                     ROUND(vUsedGrossPricePo * A.percentage / (100 + A.percentage), vDecimalForRounding)
  111.                 END) * Z.qty,
  112.             tax_price =
  113.                 CASE WHEN (vRoundingMode = vRoundingModeDown) THEN
  114.                     TRUNC(vUsedGrossPricePo * A.percentage / (100 + A.percentage), vDecimalForRounding)
  115.                 ELSE
  116.                     ROUND(vUsedGrossPricePo * A.percentage / (100 + A.percentage), vDecimalForRounding)
  117.                 END
  118.             tax_amount =
  119.                 CASE WHEN (vRoundingMode = vRoundingModeDown) THEN
  120.                     TRUNC(vUsedGrossPricePo * A.percentage / (100 + A.percentage), vDecimalForRounding) * Z.qty
  121.                 ELSE
  122.                     ROUND(vUsedGrossPricePo * A.percentage / (100 + A.percentage), vDecimalForRounding) * Z.qty
  123.                 END
  124.             tax_percentage = A.percentage,
  125.             flg_tax_amount = pNewFlgTaxAmount,
  126.             tax_id = pNewTaxId,
  127.             update_user_id = pUserId,
  128.             update_datetime = pDatetime
  129.         FROM m_tax A
  130.         WHERE A.tax_id = pNewTaxId AND
  131.             Z.po_item_id = pPoItemId;
  132.     ELSE
  133.         IF (pNewTaxId <> vEmptyId) THEN
  134.             --harga exclude pajak,
  135.             --tetapi ada pajak
  136.             UPDATE pu_po_item Z
  137.             SET gross_price_po = vUsedGrossPricePo,
  138.                 nett_price_po = vUsedGrossPricePo,
  139.                 gross_item_amount = vUsedGrossPricePo * Z.qty,
  140.                 nett_item_amount = vUsedGrossPricePo * Z.qty,
  141.                 tax_price =
  142.                     CASE WHEN (vRoundingMode = vRoundingModeDown) THEN
  143.                         TRUNC(vUsedGrossPricePo * A.percentage / 100, vDecimalForRounding)
  144.                     ELSE
  145.                         ROUND(vUsedGrossPricePo * A.percentage / 100, vDecimalForRounding)
  146.                     END
  147.                 tax_amount =
  148.                     CASE WHEN (vRoundingMode = vRoundingModeDown) THEN
  149.                         TRUNC(vUsedGrossPricePo * A.percentage / 100, vDecimalForRounding) * Z.qty
  150.                     ELSE
  151.                         ROUND(vUsedGrossPricePo * A.percentage / 100, vDecimalForRounding) * Z.qty
  152.                     END
  153.                 tax_percentage = A.percentage,
  154.                 flg_tax_amount = pNewFlgTaxAmount,
  155.                 tax_id = pNewTaxId,
  156.                 update_user_id = pUserId,
  157.                 update_datetime = pDatetime
  158.             FROM m_tax A
  159.             WHERE A.tax_id = pNewTaxId AND
  160.                 Z.po_item_id = pPoItemId;
  161.         ELSE
  162.             --harga exclude pajak dan
  163.             --tanpa pajak
  164.             UPDATE pu_po_item Z
  165.             SET gross_price_po = vUsedGrossPricePo,
  166.                 nett_price_po = vUsedGrossPricePo,
  167.                 gross_item_amount = vUsedGrossPricePo * Z.qty,
  168.                 nett_item_amount = vUsedGrossPricePo * Z.qty,
  169.                 tax_price = 0,
  170.                 tax_amount = 0,
  171.                 tax_percentage = 0,
  172.                 flg_tax_amount = pNewFlgTaxAmount,
  173.                 tax_id = vEmptyId,
  174.                 update_user_id = pUserId,
  175.                 update_datetime = pDatetime
  176.             WHERE Z.po_item_id = pPoItemId;
  177.         END IF;
  178.     END IF;
  179.    
  180.     --Update pajak baru di pu_po_tax
  181.     UPDATE pu_po_tax Z
  182.     SET base_amount = Z.base_amount + f_get_amount_before_tax(A.gross_item_amount, A.flg_tax_amount, A.tax_percentage, vDecimalForRounding, vRoundingMode),
  183.         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),
  184.         update_user_id = pUserId,
  185.         update_datetime = pDatetime
  186.     FROM pu_po_item A
  187.     WHERE A.po_item_id = pPoItemId AND
  188.         A.tax_id <> vEmptyId AND
  189.         Z.tenant_id = A.tenant_id AND
  190.         Z.po_id = A.po_id AND
  191.         Z.tax_id = A.tax_id;
  192.        
  193.      --Update balance invoice dengan harga baru
  194.      UPDATE pu_po_balance_invoice Z
  195.      SET price_po = A.nett_price_po,
  196.         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),
  197.         update_user_id = pUserId,
  198.         update_datetime = pDatetime
  199.      FROM pu_po_item A
  200.      INNER JOIN pu_receive_goods_item B ON A.po_item_id = B.ref_id
  201.      INNER JOIN pu_receive_goods C ON B.receive_goods_id = C.receive_goods_id
  202.      WHERE A.po_item_id = pPoItemId AND
  203.         Z.tenant_id = C.tenant_id AND
  204.         Z.ou_id = C.ou_id AND
  205.         Z.po_id = C.ref_id AND
  206.         Z.ref_doc_type_id = C.doc_type_id AND
  207.         Z.ref_id = C.receive_goods_id AND
  208.         Z.ref_item_id = B.receive_goods_item_id;
  209.    
  210.     --Update balance invoice tax dengan harga baru
  211.      UPDATE pu_po_balance_invoice_tax Z
  212.      SET base_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),
  213.         tax_amount = f_tax_rounding(C.tenant_id,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), A.tax_percentage),
  214.         update_user_id = pUserId,
  215.         update_datetime = pDatetime
  216.      FROM pu_po_item A
  217.      INNER JOIN pu_receive_goods_item B ON A.po_item_id = B.ref_id
  218.      INNER JOIN pu_receive_goods C ON B.receive_goods_id = C.receive_goods_id
  219.      WHERE A.po_item_id = pPoItemId AND
  220.         Z.tenant_id = C.tenant_id AND
  221.         Z.ou_id = C.ou_id AND
  222.         Z.po_id = C.ref_id AND
  223.         Z.ref_doc_type_id = C.doc_type_id AND
  224.         Z.ref_id = C.receive_goods_id AND
  225.         Z.ref_item_id = B.receive_goods_item_id AND
  226.         Z.tax_id = A.tax_id;
  227.    
  228.     --Update balance invoice ext
  229.     UPDATE pu_po_balance_invoice_ext Z
  230.         SET discount_percentage = A.discount_percentage,
  231.             discount_amount = A.discount_amount,
  232.             total_discount_amount = B.qty_rcv_po * A.discount_amount,
  233.             update_user_id = pUserId,
  234.             update_datetime = pDatetime
  235.     FROM pu_po_item A
  236.     INNER JOIN pu_receive_goods_item B ON A.po_item_id = B.ref_id
  237.     INNER JOIN pu_receive_goods C ON B.receive_goods_id = C.receive_goods_id
  238.     WHERE A.po_item_id = pPoItemId AND
  239.         Z.po_item_id = pPoItemId;
  240.    
  241.     --Update product price balance (tidak ada data receive goods product)
  242.     UPDATE in_product_price_balance Z
  243.         SET amount = f_get_amount_before_tax(B.qty_rcv_po * (A.gross_price_po - A.discount_amount), A.flg_tax_amount, A.tax_percentage, f_get_digit_decimal_doc_curr(vReceiveGoodsDocTypeId, A.curr_code), vRoundingMode),
  244.             update_user_id = pUserId,
  245.             update_datetime = pDatetime
  246.     FROM pu_po_item A
  247.     INNER JOIN pu_receive_goods_item B ON A.po_item_id = B.ref_id
  248.     INNER JOIN pu_receive_goods C ON B.receive_goods_id = C.receive_goods_id
  249.     INNER JOIN in_product_balance E ON C.tenant_id = E.tenant_id AND
  250.         B.product_id = E.product_id AND
  251.         vSpaceValue = E.serial_number AND
  252.         vSpaceValue = E.lot_number
  253.     WHERE A.po_item_id = pPoItemId AND
  254.         NOT EXISTS (SELECT 1 FROM pu_receive_goods_product D
  255.                     WHERE B.receive_goods_item_id = D.receive_goods_item_id) AND
  256.         NOT EXISTS (SELECT 1 FROM pu_receive_goods_product_auto_sn D
  257.                     WHERE B.receive_goods_item_id = D.receive_goods_item_id) AND
  258.         Z.tenant_id = C.tenant_id AND
  259.         Z.ou_id = C.ou_id AND
  260.         Z.product_balance_id = A.product_balance_id AND
  261.         Z.doc_type_id = C.doc_type_id AND
  262.         Z.ref_id = B.receive_goods_item_id;
  263.        
  264.      --Update product price balance (ada data receive goods product)
  265.     UPDATE in_product_price_balance Z
  266.         SET amount = f_get_amount_before_tax(B.qty_rcv_po * (A.gross_price_po - A.discount_amount), A.flg_tax_amount, A.tax_percentage, f_get_digit_decimal_doc_curr(vReceiveGoodsDocTypeId, A.curr_code), vRoundingMode),
  267.             update_user_id = pUserId,
  268.             update_datetime = pDatetime
  269.     FROM pu_po_item A
  270.     INNER JOIN pu_receive_goods_item B ON A.po_item_id = B.ref_id
  271.     INNER JOIN pu_receive_goods C ON B.receive_goods_id = C.receive_goods_id
  272.     INNER JOIN pu_receive_goods_product D ON B.receive_goods_item_id = C.receive_goods_item_id
  273.     INNER JOIN in_product_balance E ON C.tenant_id = E.tenant_id AND
  274.         B.product_id = E.product_id AND
  275.         D.serial_number = E.serial_number AND
  276.         D.lot_number = E.lot_number
  277.     WHERE A.po_item_id = pPoItemId AND
  278.         Z.tenant_id = C.tenant_id AND
  279.         Z.ou_id = C.ou_id AND
  280.         Z.product_balance_id = A.product_balance_id AND
  281.         Z.doc_type_id = C.doc_type_id AND
  282.         Z.ref_id = B.receive_goods_item_id;
  283.        
  284.     --Update monthly price product
  285.     UPDATE pu_monthly_price_product
  286.     SET amount = A.amount,
  287.         source_price = A.source_price,
  288.         flg_tax_amount = A.flg_tax_amount,
  289.         tax_id = A.tax_id,
  290.         tax_percentage = A.tax_percentage
  291.     FROM tt_pu_monthly_price_product A
  292.     WHERE A.session_id = pSessionId AND
  293.         pu_monthly_price_product.tenant_id = A.tenant_id AND
  294.         pu_monthly_price_product.ou_id = A.ou_id AND
  295.         pu_monthly_price_product.year_month_date = A.year_month_date AND
  296.         pu_monthly_price_product.product_id = A.product_id;
  297.        
  298. END;
  299. $BODY$
  300.   LANGUAGE plpgsql VOLATILE
  301.   COST 100;
  302.  /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement