Advertisement
aadddrr

f_update_po_item_price

May 7th, 2018
131
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(CHARACTER VARYING, BIGINT, BIGINT, BIGINT, CHARACTER VARYING, NUMERIC, CHARACTER VARYING, BIGINT, NUMERIC)
  5.   RETURNS void AS
  6. $BODY$
  7. DECLARE
  8.     pSessionId                  ALIAS FOR $1;
  9.     pTenantId                   ALIAS FOR $2;
  10.     pPoItemId                   ALIAS FOR $3;
  11.     pUserId                     ALIAS FOR $4;
  12.     pDatetime                   ALIAS FOR $5;
  13.     pNewGrossPricePo            ALIAS FOR $6;
  14.     pNewFlgTaxAmount            ALIAS FOR $7;
  15.     pNewTaxId                   ALIAS FOR $8;
  16.     pNewDiscountPercentage      ALIAS FOR $9;
  17.    
  18.     vDecimalForRounding         integer;
  19.     vRoundingMode               character varying;
  20.     vUsedGrossPricePo           numeric;       
  21.     vCurrCode                   character varying;
  22.     vDigitDppRoundingTax        integer;
  23.    
  24.     vYes                            character varying;
  25.     vEmptyId                        bigint;
  26.     vSpaceValue                     character varying;
  27.     vRoundingModeDown               character varying;
  28.     vFlagNo                         character varying;
  29.     vComboIdYesNo                   character varying;
  30.     vPurchaseOrderDocTypeId         bigint;
  31.     vReceiveGoodsDocTypeId          bigint;
  32.     vParamCodeRoundingModeNonTax    character varying;
  33.     vParamCodeDppRoundingDecimalTax character varying;
  34.    
  35. BEGIN
  36.    
  37.     vYes := 'Y';
  38.     vSpaceValue := ' ';
  39.     vEmptyId := -99;
  40.     vRoundingModeDown := 'RD';
  41.     vFlagNo := 'N';
  42.     vComboIdYesNo := 'YESNO';
  43.     vPurchaseOrderDocTypeId := 101;
  44.     vReceiveGoodsDocTypeId := 111;
  45.     vParamCodeRoundingModeNonTax :='rounding.mode.non.tax';
  46.     vParamCodeDppRoundingDecimalTax := 'dpp.rounding.decimal.tax';
  47.    
  48.     SELECT curr_code FROM pu_po_item A WHERE A.po_item_id = pPoItemId INTO vCurrCode;
  49.    
  50.     IF NOT FOUND THEN
  51.         RAISE EXCEPTION 'Purchase Order Item Id % is not found', pPoItemId;
  52.     END IF;
  53.    
  54.     SELECT f_get_value_system_config_by_param_code(pTenantId, vParamCodeRoundingModeNonTax) INTO vRoundingMode;
  55.     SELECT f_get_digit_decimal_doc_curr(vPurchaseOrderDocTypeId, vCurrCode) INTO vDecimalForRounding;
  56.     SELECT f_get_value_system_config_by_param_code(pTenantId, vParamCodeDppRoundingDecimalTax)::integer INTO vDigitDppRoundingTax;
  57.    
  58.     --Validasi flg_tax_amount harus sesuai dengan combo YESNO
  59.     IF NOT EXISTS (
  60.         SELECT 1
  61.         FROM t_combo_value A
  62.         WHERE A.combo_id = vComboIdYesNo AND
  63.             A.code = pNewFlgTaxAmount
  64.     ) THEN
  65.         RAISE EXCEPTION 'Value Flag Tax Amount is not valid ,should not have values : %',
  66.             pNewFlgTaxAmount;
  67.     END IF;
  68.    
  69.     --Validasi jika flg_tax_amount = 'Y', maka tax_id tidak boleh -99
  70.     IF (pNewFlgTaxAmount = vYes AND pNewTaxId = vEmptyId) THEN
  71.         RAISE EXCEPTION 'Gross Price is including tax, so you must choose tax value';
  72.     END IF;
  73.    
  74.     --Validasi Gross Price harus >= 0
  75.     IF pNewGrossPricePo < 0 THEN
  76.         RAISE EXCEPTION '% must be >= 0 (zero)',
  77.             pNewGrossPricePo;
  78.     END IF;
  79.    
  80.     --Hitung Gross Price setelah discount
  81.     SELECT CASE WHEN (vRoundingMode = vRoundingModeDown) THEN
  82.             TRUNC(pNewGrossPricePo, vDecimalForRounding) - TRUNC(pNewGrossPricePo * pNewDiscountPercentage / 100, vDecimalForRounding)
  83.         ELSE
  84.             ROUND(pNewGrossPricePo, vDecimalForRounding) - ROUND(pNewGrossPricePo * pNewDiscountPercentage / 100, vDecimalForRounding)
  85.         END
  86.     INTO vUsedGrossPricePo;
  87.    
  88.     IF EXISTS (
  89.         SELECT 1
  90.         FROM pu_po_balance_invoice Z
  91.         WHERE EXISTS (
  92.             SELECT 1
  93.             FROM pu_po_item A
  94.             INNER JOIN pu_receive_goods_item B ON A.po_item_id = B.ref_id
  95.             INNER JOIN pu_receive_goods C ON B.receive_goods_id = C.receive_goods_id
  96.             WHERE A.po_item_id = pPoItemId AND
  97.                 Z.tenant_id = C.tenant_id AND
  98.                 Z.ou_id = C.ou_id AND
  99.                 Z.po_id = C.ref_id AND
  100.                 Z.ref_doc_type_id = C.doc_type_id AND
  101.                 Z.ref_id = C.receive_goods_id AND
  102.                 Z.ref_item_id = B.receive_goods_item_id
  103.         ) AND
  104.         flg_invoice <> vFlagNo
  105.     ) THEN
  106.         RAISE EXCEPTION 'Invoice for Purchase Order already exists';
  107.     END IF;
  108.    
  109.     IF EXISTS (
  110.         SELECT 1
  111.         FROM pu_po_balance_invoice_tax Z
  112.         WHERE EXISTS (
  113.             SELECT 1
  114.             FROM pu_po_item A
  115.             INNER JOIN pu_receive_goods_item B ON A.po_item_id = B.ref_id
  116.             INNER JOIN pu_receive_goods C ON B.receive_goods_id = C.receive_goods_id
  117.             WHERE A.po_item_id = pPoItemId AND
  118.                 Z.tenant_id = C.tenant_id AND
  119.                 Z.ou_id = C.ou_id AND
  120.                 Z.po_id = C.ref_id AND
  121.                 Z.ref_doc_type_id = C.doc_type_id AND
  122.                 Z.ref_id = C.receive_goods_id AND
  123.                 Z.ref_item_id = B.receive_goods_item_id AND
  124.                 Z.tax_id = A.tax_id
  125.         ) AND
  126.         flg_invoice <> vFlagNo
  127.     ) THEN
  128.         RAISE EXCEPTION 'Invoice for Purchase Order already exists';
  129.     END IF;
  130.    
  131.     --Update pajak lama di pu_po_tax
  132.     UPDATE pu_po_tax Z
  133.     SET base_amount = Z.base_amount - f_get_amount_before_tax(A.gross_item_amount, A.flg_tax_amount, A.tax_percentage, vDecimalForRounding, vRoundingMode),
  134.         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),
  135.         update_user_id = pUserId,
  136.         update_datetime = pDatetime,
  137.         version = Z.version + 1
  138.     FROM pu_po_item A
  139.     WHERE A.po_item_id = pPoItemId AND
  140.         A.tax_id <> vEmptyId AND
  141.         Z.tenant_id = A.tenant_id AND
  142.         Z.po_id = A.po_id AND
  143.         Z.tax_id = A.tax_id;
  144.        
  145.     --Hapus data balance invoice tax lama
  146.     DELETE FROM pu_po_balance_invoice_tax Z
  147.     WHERE Z.tenant_id = pTenantId
  148.     AND EXISTS (
  149.         SELECT 1
  150.         FROM pu_po_item A
  151.         INNER JOIN pu_receive_goods_item B ON A.po_item_id = B.ref_id
  152.         INNER JOIN pu_receive_goods C ON B.receive_goods_id = C.receive_goods_id
  153.         WHERE A.po_item_id = pPoItemId AND
  154.             Z.tenant_id = C.tenant_id AND
  155.             Z.ou_id = C.ou_id AND
  156.             Z.po_id = C.ref_id AND
  157.             Z.ref_doc_type_id = C.doc_type_id AND
  158.             Z.ref_id = C.receive_goods_id AND
  159.             Z.ref_item_id = B.receive_goods_item_id AND
  160.             Z.tax_id = A.tax_id
  161.     );
  162.        
  163.     --Update amount di journal trx mapping lama
  164.     WITH tt_grouped_receive_goods_item AS (
  165.         SELECT D.journal_trx_id, B.qty_rcv_po, A.gross_price_po, A.discount_amount, A.flg_tax_amount, A.tax_percentage, A.curr_code
  166.         FROM pu_po_item A
  167.         INNER JOIN pu_receive_goods_item B ON A.po_item_id = B.ref_id
  168.         INNER JOIN pu_receive_goods C ON B.receive_goods_id = C.receive_goods_id
  169.         INNER JOIN gl_journal_trx D ON C.tenant_id = D.tenant_id AND
  170.             (f_get_document_journal(C.doc_type_id)).journal_type = D.journal_type AND
  171.             C.doc_type_id = D.doc_type_id AND
  172.             C.receive_goods_id = D.doc_id AND
  173.             C.doc_no = D.doc_no AND
  174.             C. doc_date = D.doc_date AND
  175.             (f_get_ou_bu_structure(C.ou_id)).ou_bu_id = D.ou_bu_id AND
  176.             (f_get_ou_bu_structure(C.ou_id)).ou_branch_id = D.ou_branch_id AND
  177.             (f_get_ou_bu_structure(C.ou_id)).ou_sub_bu_id = D.ou_sub_bu_id
  178.         WHERE A.po_item_id = pPoItemId
  179.         GROUP BY D.journal_trx_id, B.qty_rcv_po, A.gross_price_po, A.discount_amount, A.flg_tax_amount, A.tax_percentage, A.curr_code
  180.     )
  181.     UPDATE gl_journal_trx_mapping Z
  182.     SET amount = Z.amount - f_get_amount_before_tax(A.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),
  183.         update_user_id = pUserId,
  184.         update_datetime = pDatetime,
  185.         version = Z.version + 1
  186.     FROM tt_grouped_receive_goods_item A
  187.     WHERE Z.journal_trx_id = A.journal_trx_id;
  188.        
  189.     --Update harga pada item PO
  190.     IF (pNewFlgTaxAmount = vYes) THEN
  191.         --harga include pajak
  192.         UPDATE pu_po_item Z
  193.         SET gross_price_po = vUsedGrossPricePo,
  194.             nett_price_po = vUsedGrossPricePo - CASE WHEN (vRoundingMode = vRoundingModeDown) THEN
  195.                     TRUNC(vUsedGrossPricePo * A.percentage / (100 + A.percentage), vDecimalForRounding)
  196.                 ELSE
  197.                     ROUND(vUsedGrossPricePo * A.percentage / (100 + A.percentage), vDecimalForRounding)
  198.                 END,
  199.             gross_item_amount = vUsedGrossPricePo * Z.qty_po,
  200.             nett_item_amount = (vUsedGrossPricePo - CASE WHEN (vRoundingMode = vRoundingModeDown) THEN
  201.                     TRUNC(vUsedGrossPricePo * A.percentage / (100 + A.percentage), vDecimalForRounding)
  202.                 ELSE
  203.                     ROUND(vUsedGrossPricePo * A.percentage / (100 + A.percentage), vDecimalForRounding)
  204.                 END) * Z.qty_po,
  205.             tax_price =
  206.                 CASE WHEN (vRoundingMode = vRoundingModeDown) THEN
  207.                     TRUNC(vUsedGrossPricePo * A.percentage / (100 + A.percentage), vDecimalForRounding)
  208.                 ELSE
  209.                     ROUND(vUsedGrossPricePo * A.percentage / (100 + A.percentage), vDecimalForRounding)
  210.                 END,
  211.             tax_amount =
  212.                 CASE WHEN (vRoundingMode = vRoundingModeDown) THEN
  213.                     TRUNC(vUsedGrossPricePo * A.percentage / (100 + A.percentage), vDecimalForRounding) * Z.qty_po
  214.                 ELSE
  215.                     ROUND(vUsedGrossPricePo * A.percentage / (100 + A.percentage), vDecimalForRounding) * Z.qty_po
  216.                 END,
  217.             tax_percentage = A.percentage,
  218.             flg_tax_amount = pNewFlgTaxAmount,
  219.             tax_id = pNewTaxId,
  220.             update_user_id = pUserId,
  221.             update_datetime = pDatetime,
  222.             version = Z.version + 1
  223.         FROM m_tax A
  224.         WHERE A.tax_id = pNewTaxId AND
  225.             Z.po_item_id = pPoItemId;
  226.     ELSE
  227.         IF (pNewTaxId <> vEmptyId) THEN
  228.             --harga exclude pajak,
  229.             --tetapi ada pajak
  230.             UPDATE pu_po_item Z
  231.             SET gross_price_po = vUsedGrossPricePo,
  232.                 nett_price_po = vUsedGrossPricePo,
  233.                 gross_item_amount = vUsedGrossPricePo * Z.qty_po,
  234.                 nett_item_amount = vUsedGrossPricePo * Z.qty_po,
  235.                 tax_price =
  236.                     CASE WHEN (vRoundingMode = vRoundingModeDown) THEN
  237.                         TRUNC(vUsedGrossPricePo * A.percentage / 100, vDecimalForRounding)
  238.                     ELSE
  239.                         ROUND(vUsedGrossPricePo * A.percentage / 100, vDecimalForRounding)
  240.                     END,
  241.                 tax_amount =
  242.                     CASE WHEN (vRoundingMode = vRoundingModeDown) THEN
  243.                         TRUNC(vUsedGrossPricePo * A.percentage / 100, vDecimalForRounding) * Z.qty_po
  244.                     ELSE
  245.                         ROUND(vUsedGrossPricePo * A.percentage / 100, vDecimalForRounding) * Z.qty_po
  246.                     END,
  247.                 tax_percentage = A.percentage,
  248.                 flg_tax_amount = pNewFlgTaxAmount,
  249.                 tax_id = pNewTaxId,
  250.                 update_user_id = pUserId,
  251.                 update_datetime = pDatetime,
  252.                 version = Z.version + 1
  253.             FROM m_tax A
  254.             WHERE A.tax_id = pNewTaxId AND
  255.                 Z.po_item_id = pPoItemId;
  256.         ELSE
  257.             --harga exclude pajak dan
  258.             --tanpa pajak
  259.             UPDATE pu_po_item Z
  260.             SET gross_price_po = vUsedGrossPricePo,
  261.                 nett_price_po = vUsedGrossPricePo,
  262.                 gross_item_amount = vUsedGrossPricePo * Z.qty_po,
  263.                 nett_item_amount = vUsedGrossPricePo * Z.qty_po,
  264.                 tax_price = 0,
  265.                 tax_amount = 0,
  266.                 tax_percentage = 0,
  267.                 flg_tax_amount = pNewFlgTaxAmount,
  268.                 tax_id = vEmptyId,
  269.                 update_user_id = pUserId,
  270.                 update_datetime = pDatetime,
  271.                 version = Z.version + 1
  272.             WHERE Z.po_item_id = pPoItemId;
  273.         END IF;
  274.     END IF;
  275.    
  276.     --Update pajak baru di pu_po_tax
  277.     UPDATE pu_po_tax Z
  278.     SET base_amount = Z.base_amount + f_get_amount_before_tax(A.gross_item_amount, A.flg_tax_amount, A.tax_percentage, vDecimalForRounding, vRoundingMode),
  279.         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),
  280.         update_user_id = pUserId,
  281.         update_datetime = pDatetime,
  282.         version = Z.version + 1
  283.     FROM pu_po_item A
  284.     WHERE A.po_item_id = pPoItemId AND
  285.         A.tax_id <> vEmptyId AND
  286.         Z.tenant_id = A.tenant_id AND
  287.         Z.po_id = A.po_id AND
  288.         Z.tax_id = A.tax_id;
  289.        
  290.     --Update balance invoice dengan harga baru
  291.     UPDATE pu_po_balance_invoice Z
  292.     SET price_po = A.nett_price_po,
  293.         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),
  294.         update_user_id = pUserId,
  295.         update_datetime = pDatetime,
  296.         version = Z.version + 1
  297.     FROM pu_po_item A
  298.     INNER JOIN pu_receive_goods_item B ON A.po_item_id = B.ref_id
  299.     INNER JOIN pu_receive_goods C ON B.receive_goods_id = C.receive_goods_id
  300.     WHERE A.po_item_id = pPoItemId AND
  301.         Z.tenant_id = C.tenant_id AND
  302.         Z.ou_id = C.ou_id AND
  303.         Z.po_id = C.ref_id AND
  304.         Z.ref_doc_type_id = C.doc_type_id AND
  305.         Z.ref_id = C.receive_goods_id AND
  306.         Z.ref_item_id = B.receive_goods_item_id;
  307.        
  308.     --Insert balance invoice tax dengan harga baru
  309.     INSERT INTO pu_po_balance_invoice_tax
  310.     (tenant_id, ou_id, partner_id, po_id,
  311.     ref_doc_type_id, ref_id, ref_item_id, tax_id, flg_amount,
  312.     tax_percentage, curr_code, base_amount, tax_amount, flg_invoice, invoice_id,
  313.     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  314.     SELECT A.tenant_id, E.ou_id, E.partner_id, A.po_id,
  315.         C.doc_type_id, C.receive_goods_id, B.receive_goods_item_id, A.tax_id, D.flg_amount,
  316.         A.tax_percentage, A.curr_code,
  317.         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),
  318.         f_tax_rounding(A.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, f_get_digit_decimal_doc_curr(vReceiveGoodsDocTypeId, A.curr_code), vRoundingMode), A.tax_percentage),
  319.         vFlagNo, vEmptyId,
  320.         0, pDatetime, pUserId, pDatetime, pUserId
  321.     FROM pu_po_item A
  322.     INNER JOIN pu_receive_goods_item B ON A.po_item_id = B.ref_id
  323.     INNER JOIN pu_receive_goods C ON B.receive_goods_id = C.receive_goods_id
  324.     INNER JOIN m_tax D ON A.tax_id = D.tax_id
  325.     INNER JOIN pu_po E ON A.po_id = E.po_id
  326.     WHERE A.po_item_id = pPoItemId;
  327.    
  328.     --Update balance invoice ext
  329.     UPDATE pu_po_balance_invoice_ext Z
  330.         SET discount_percentage = A.discount_percentage,
  331.             discount_amount = A.discount_amount,
  332.             total_discount_amount = B.qty_rcv_po * A.discount_amount,
  333.             update_user_id = pUserId,
  334.             update_datetime = pDatetime
  335.     FROM pu_po_item A
  336.     INNER JOIN pu_receive_goods_item B ON A.po_item_id = B.ref_id
  337.     INNER JOIN pu_receive_goods C ON B.receive_goods_id = C.receive_goods_id
  338.     WHERE A.po_item_id = pPoItemId AND
  339.         Z.po_item_id = pPoItemId;
  340.    
  341.    
  342.        
  343.     --Update product price balance (tidak ada data receive goods product)
  344.     UPDATE in_product_price_balance Z
  345.         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),
  346.             update_user_id = pUserId,
  347.             update_datetime = pDatetime,
  348.             version = Z.version + 1
  349.     FROM pu_po_item A
  350.     INNER JOIN pu_receive_goods_item B ON A.po_item_id = B.ref_id
  351.     INNER JOIN pu_receive_goods C ON B.receive_goods_id = C.receive_goods_id
  352.     INNER JOIN in_product_balance E ON C.tenant_id = E.tenant_id AND
  353.         B.product_id = E.product_id AND
  354.         vSpaceValue = E.serial_number AND
  355.         vSpaceValue = E.lot_number
  356.     WHERE A.po_item_id = pPoItemId AND
  357.         NOT EXISTS (SELECT 1 FROM pu_receive_goods_product D
  358.                     WHERE B.receive_goods_item_id = D.receive_goods_item_id) AND
  359.         NOT EXISTS (SELECT 1 FROM pu_receive_goods_product_auto_sn D
  360.                     WHERE B.receive_goods_item_id = D.receive_goods_item_id) AND
  361.         Z.tenant_id = C.tenant_id AND
  362.         Z.ou_id = C.ou_id AND
  363.         Z.product_balance_id = E.product_balance_id AND
  364.         Z.doc_type_id = C.doc_type_id AND
  365.         Z.ref_id = B.receive_goods_item_id;
  366.        
  367.      --Update product price balance (ada data receive goods product)
  368.     UPDATE in_product_price_balance Z
  369.         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),
  370.             update_user_id = pUserId,
  371.             update_datetime = pDatetime,
  372.             version = Z.version + 1
  373.     FROM pu_po_item A
  374.     INNER JOIN pu_receive_goods_item B ON A.po_item_id = B.ref_id
  375.     INNER JOIN pu_receive_goods C ON B.receive_goods_id = C.receive_goods_id
  376.     INNER JOIN pu_receive_goods_product D ON B.receive_goods_item_id = D.receive_goods_item_id
  377.     INNER JOIN in_product_balance E ON C.tenant_id = E.tenant_id AND
  378.         B.product_id = E.product_id AND
  379.         D.serial_number = E.serial_number AND
  380.         D.lot_number = E.lot_number
  381.     WHERE A.po_item_id = pPoItemId AND
  382.         Z.tenant_id = C.tenant_id AND
  383.         Z.ou_id = C.ou_id AND
  384.         Z.product_balance_id = E.product_balance_id AND
  385.         Z.doc_type_id = C.doc_type_id AND
  386.         Z.ref_id = B.receive_goods_item_id;
  387.        
  388.     --Update monthly price product
  389.     WITH tt_product_year_month AS(
  390.         SELECT C.receive_goods_id, C.tenant_id, C.ou_id, A.product_id, D.year_month_date
  391.         FROM pu_po_item A
  392.         INNER JOIN pu_receive_goods_item B ON A.po_item_id = B.ref_id
  393.         INNER JOIN pu_receive_goods C ON B.receive_goods_id = C.receive_goods_id
  394.         INNER JOIN dt_date D ON C.doc_date = D.string_date
  395.         WHERE A.po_item_id = pPoItemId
  396.     ), tt_monthly_price_product AS(
  397.         SELECT C.tenant_id, C.ou_id, D.year_month_date, B.product_id,
  398.             SUM(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)) AS amount,
  399.             A.flg_tax_amount, A.tax_id, A.tax_percentage,
  400.             SUM(B.qty_rcv_int) AS qty, B.base_uom_id,
  401.             C.doc_type_id AS ref_doc_type_id, C.receive_goods_id AS ref_id,
  402.             C.doc_no AS ref_doc_no, C.doc_date AS ref_doc_date,
  403.             'PURCHASING PO NO : '|| F.doc_no || ' DATE : '|| F.doc_date AS source_price
  404.         FROM pu_po_item A
  405.         INNER JOIN pu_receive_goods_item B ON A.po_item_id = B.ref_id
  406.         INNER JOIN pu_receive_goods C ON B.receive_goods_id = C.receive_goods_id
  407.         INNER JOIN dt_date D ON C.doc_date = D.string_date
  408.         INNER JOIN pu_po F ON A.po_id = F.po_id
  409.         WHERE EXISTS(
  410.             SELECT 1
  411.             FROM tt_product_year_month E
  412.             WHERE E.receive_goods_id = C.receive_goods_id AND
  413.                 E.tenant_id = C.tenant_id AND
  414.                 E.ou_id = C.ou_id AND
  415.                 E.product_id = A.product_id AND
  416.                 E.year_month_date = D.year_month_date
  417.         )
  418.         GROUP BY C.tenant_id, C.ou_id, D.year_month_date, B.product_id,
  419.             A.flg_tax_amount, A.tax_id, A.tax_percentage,
  420.             B.base_uom_id, C.doc_type_id, C.receive_goods_id, C.doc_no, C.doc_date,
  421.             F.doc_no, F.doc_date
  422.     )
  423.     UPDATE pu_monthly_price_product Z
  424.     SET amount = A.amount,
  425.         flg_tax_amount = A.flg_tax_amount,
  426.         tax_id = A.tax_id,
  427.         tax_percentage = A.tax_percentage,
  428.         qty = A.qty,
  429.         ref_doc_type_id = A.ref_doc_type_id,
  430.         ref_id = A.ref_id,
  431.         ref_doc_no = A.ref_doc_no,
  432.         ref_doc_date = A.ref_doc_date,
  433.         source_price = A.source_price,
  434.         update_user_id = pUserId,
  435.         update_datetime = pDatetime,
  436.         version = Z.version + 1
  437.     FROM tt_monthly_price_product A
  438.     WHERE Z.tenant_id = A.tenant_id AND
  439.         Z.ou_id = A.ou_id AND
  440.         Z.year_month_date = A.year_month_date AND
  441.         Z.product_id = A.product_id;
  442.        
  443.     UPDATE gl_journal_trx_item Z
  444.     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),
  445.         update_user_id = pUserId,
  446.         update_datetime = pDatetime,
  447.         version = Z.version + 1
  448.     FROM pu_po_item A
  449.     INNER JOIN pu_receive_goods_item B ON A.po_item_id = B.ref_id
  450.     INNER JOIN pu_receive_goods C ON B.receive_goods_id = C.receive_goods_id
  451.     INNER JOIN gl_journal_trx D ON C.tenant_id = D.tenant_id AND
  452.         (f_get_document_journal(C.doc_type_id)).journal_type = D.journal_type AND
  453.         C.doc_type_id = D.doc_type_id AND
  454.         C.receive_goods_id = D.doc_id AND
  455.         C.doc_no = D.doc_no AND
  456.         C. doc_date = D.doc_date AND
  457.         (f_get_ou_bu_structure(C.ou_id)).ou_bu_id = D.ou_bu_id AND
  458.         (f_get_ou_bu_structure(C.ou_id)).ou_branch_id = D.ou_branch_id AND
  459.         (f_get_ou_bu_structure(C.ou_id)).ou_sub_bu_id = D.ou_sub_bu_id
  460.     WHERE A.po_item_id = pPoItemId AND
  461.         Z.journal_trx_id = D.journal_trx_id AND
  462.         Z.ref_doc_type_id = C.doc_type_id AND
  463.         Z.ref_id = B.receive_goods_item_id;
  464.        
  465.     WITH tt_grouped_receive_goods_item AS (
  466.         SELECT D.journal_trx_id, B.qty_rcv_po, A.gross_price_po, A.discount_amount, A.flg_tax_amount, A.tax_percentage, A.curr_code
  467.         FROM pu_po_item A
  468.         INNER JOIN pu_receive_goods_item B ON A.po_item_id = B.ref_id
  469.         INNER JOIN pu_receive_goods C ON B.receive_goods_id = C.receive_goods_id
  470.         INNER JOIN gl_journal_trx D ON C.tenant_id = D.tenant_id AND
  471.             (f_get_document_journal(C.doc_type_id)).journal_type = D.journal_type AND
  472.             C.doc_type_id = D.doc_type_id AND
  473.             C.receive_goods_id = D.doc_id AND
  474.             C.doc_no = D.doc_no AND
  475.             C. doc_date = D.doc_date AND
  476.             (f_get_ou_bu_structure(C.ou_id)).ou_bu_id = D.ou_bu_id AND
  477.             (f_get_ou_bu_structure(C.ou_id)).ou_branch_id = D.ou_branch_id AND
  478.             (f_get_ou_bu_structure(C.ou_id)).ou_sub_bu_id = D.ou_sub_bu_id
  479.         WHERE A.po_item_id = pPoItemId
  480.         GROUP BY D.journal_trx_id, B.qty_rcv_po, A.gross_price_po, A.discount_amount, A.flg_tax_amount, A.tax_percentage, A.curr_code
  481.     )
  482.     UPDATE gl_journal_trx_mapping Z
  483.     SET amount = Z.amount + f_get_amount_before_tax(A.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),
  484.         update_user_id = pUserId,
  485.         update_datetime = pDatetime,
  486.         version = Z.version + 1
  487.     FROM tt_grouped_receive_goods_item A
  488.     WHERE Z.journal_trx_id = A.journal_trx_id;
  489.        
  490. END;
  491. $BODY$
  492.   LANGUAGE plpgsql VOLATILE
  493.   COST 100;
  494.  /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement