Advertisement
Guest User

r_purch_invoice_list

a guest
Nov 21st, 2017
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. CREATE OR REPLACE FUNCTION r_purch_invoice_list(character varying, bigint, bigint, bigint, character varying, bigint, bigint, bigint, bigint, bigint, bigint, character varying, character varying)
  2.   RETURNS SETOF refcursor AS
  3. $BODY$
  4. DECLARE
  5.     pRefHeader          REFCURSOR := 'refHeader';
  6.     pRefDetail          REFCURSOR := 'refDetail';
  7.     pSessionId          ALIAS FOR $1;
  8.     pTenantId           ALIAS FOR $2;
  9.     pUserId             ALIAS FOR $3;
  10.     pRoleId             ALIAS FOR $4;
  11.     pDatetime           ALIAS FOR $5;
  12.     pOuId               ALIAS FOR $6;  
  13.     pPartnerId          ALIAS FOR $7;  
  14.     pCtgrPartnerId      ALIAS FOR $8;  
  15.     pCtgrProductId      ALIAS FOR $9;  
  16.     pSubCtgrProductId   ALIAS FOR $10; 
  17.     pBrandId            ALIAS FOR $11; 
  18.     pDateFrom           ALIAS FOR $12;
  19.     pDateTo             ALIAS FOR $13;
  20.    
  21.  
  22.     vEmptyId                bigint := -99;
  23.     vReceiveGoodsDocTypeId  bigint := -99;
  24.     vFilterPartner          text := '';
  25.     vFilterCtgrPartner      text := '';
  26.     vFilterCtgrProduct      text := '';
  27.     vFilterSubCtgrProduct   text := '';
  28.     vFilterBrand            text := '';
  29.     vEmptyValue             character varying(1) := '';
  30.     vRoundingModeNonTax     character varying(5) := '';
  31.     vStatusDocRelease       character varying := 'R';
  32.     vYes                    character varying := 'Y';
  33.     vNo                     character varying := 'N';
  34.     vAlocTypeAmount         character varying := 'AMOUNT';
  35.     vActivityCodeAddAmount  character varying := 'PURCHASING_DISC';
  36.     vZeroValue              numeric := 0;
  37.     vRoundingDigit          integer;
  38. BEGIN
  39.    
  40.     DELETE FROM tt_purchasing_invoice_list WHERE session_id = pSessionId;
  41.  
  42.     vReceiveGoodsDocTypeId := 111;
  43.     SELECT f_get_value_system_config_by_param_code(pTenantId, 'rounding.mode.non.tax') INTO vRoundingModeNonTax;
  44.    
  45.     IF (pPartnerId <> vEmptyId) THEN
  46.         vFilterPartner := ' AND B.partner_id = ' || pPartnerId;
  47.     END IF;
  48.    
  49.     IF (pCtgrPartnerId <> vEmptyId) THEN
  50.         vFilterCtgrPartner := ' AND M.ctgr_partner_id = ' || pCtgrPartnerId;
  51.     END IF;
  52.    
  53.     IF (pCtgrProductId <> vEmptyId) THEN
  54.         vFilterCtgrProduct := ' AND I.ctgr_product_id = ' || pCtgrProductId;
  55.     END IF;
  56.    
  57.     IF (pSubCtgrProductId <> vEmptyId) THEN
  58.         vFilterSubCtgrProduct := ' AND J.sub_ctgr_product_id = ' || pSubCtgrProductId;
  59.     END IF;
  60.    
  61.     IF (pBrandId <> vEmptyId) THEN
  62.         vFilterBrand := ' AND O.brand_id = ' || pBrandId;
  63.     END IF;
  64.    
  65.     vRoundingDigit := CAST(f_get_value_system_config_by_param_code(pTenantId,'rounding.gl.amount') AS integer);
  66.    
  67.     Open pRefHeader FOR
  68.         SELECT pPartnerId AS partner_id, CASE WHEN pPartnerId = vEmptyId THEN '(All)' ELSE f_get_partner_name(pPartnerId) END AS partner_name,
  69.             pCtgrPartnerId AS ctgr_partner_id, pCtgrProductId AS ctgr_product_id, pSubCtgrProductId AS sub_ctgr_product_id,
  70.             CASE WHEN pCtgrPartnerId = vEmptyId THEN '(All)' ELSE f_get_ctgr_partner_name(pCtgrPartnerId) END AS ctgr_partner_name,  
  71.             CASE WHEN pCtgrProductId = vEmptyId THEN '(All)' ELSE f_get_ctgr_product_name(pCtgrProductId) END AS ctgr_product_name,
  72.             CASE WHEN pSubCtgrProductId = vEmptyId THEN '(All)' ELSE f_get_sub_ctgr_product_name(pSubCtgrProductId) END AS sub_ctgr_product_name,
  73.             pBrandId AS brand_id, CASE WHEN pBrandId = vEmptyId THEN '(All)' ELSE f_get_brand_name(pBrandId) END AS brand_name,
  74.             pDateFrom AS date_from, pDateTo AS date_to, pDatetime AS print_datetime, pOuId AS ou_id, f_get_ou_name(pOuId) AS ou_name;
  75.     RETURN NEXT pRefHeader;
  76.    
  77.     -- Masukan data yang diperlukan ke temporer
  78.     EXECUTE '
  79.     INSERT INTO tt_purchasing_invoice_list (
  80.         session_id, ou_id, partner_id, invoice_item_id, ctgr_product_id,
  81.         sub_ctgr_product_id, curr_code, partner_name, doc_no, doc_date,
  82.         ref_no, ref_date, po_no, po_date, product_code, product_name,
  83.         qty_po, uom_po, price, item_amount,
  84.         tax_amount, invoice_id,
  85.         flg_discount, gross_price_before_disc, discount_amount, discount_percentage,
  86.         no_faktur, tgl_faktur,
  87.         add_amount, alloc_type, flg_tax_amount, tax_percentage,
  88.         flg_update
  89.     )
  90.     SELECT $9 AS session_id, A.ou_id, B.partner_id, D.invoice_item_id, I.ctgr_product_id,
  91.         J.sub_ctgr_product_id, A.curr_code, B.partner_name, A.doc_no, A.doc_date,
  92.         A.ext_doc_no AS ref_no, A.ext_doc_date AS ref_date, C.doc_no AS po_no, C.doc_date AS po_date, G.product_code, G.product_name,
  93.         SUM(E.qty_rcv_po) AS qty_po, H.uom_code AS uom_po, F.nett_price_po AS price, SUM(Q.item_amount) AS item_amount,
  94.         SUM(COALESCE(R.tax_amount, 0)) AS tax_amount, A.invoice_id,
  95.         P.flg_discount, P.gross_price_before_disc, F.discount_amount, F.discount_percentage,
  96.         COALESCE(S.tax_no, $7) AS no_faktur, COALESCE(S.tax_date, $7) AS tgl_faktur,
  97.         AY.add_amount, AX.alloc_type, F.flg_tax_amount, F.tax_percentage,
  98.         CASE WHEN AY.add_amount = 0 OR SUM(Q.item_amount) = 0
  99.             THEN $11
  100.             ELSE $10
  101.         END AS flg_update
  102.     FROM pu_invoice A
  103.       INNER JOIN pu_invoice_additional_for_dlg AX ON A.invoice_id = AX.invoice_id
  104.       INNER JOIN pu_invoice_cost AY ON A.invoice_id = AY.invoice_id
  105.       INNER JOIN m_partner B ON A.partner_id = B.partner_id
  106.       INNER JOIN pu_po C ON A.ref_id = C.po_id
  107.       INNER JOIN pu_invoice_item D ON A.invoice_id = D.invoice_id  
  108.       INNER JOIN pu_receive_goods_item E ON D.ref_item_id = E.receive_goods_item_id
  109.       INNER JOIN pu_po_item F ON E.ref_id = F.po_item_id
  110.       INNER JOIN pu_po_item_additional_for_dlg P ON P.po_item_id = F.po_item_id
  111.       INNER JOIN m_product G ON F.product_id = G.product_id
  112.       INNER JOIN m_uom H ON F.po_uom_id = H.uom_id
  113.       INNER JOIN m_ctgr_product I ON G.ctgr_product_id = I.ctgr_product_id
  114.       INNER JOIN m_sub_ctgr_product J ON G.sub_ctgr_product_id = J.sub_ctgr_product_id
  115.       INNER JOIN t_user_role K ON K.user_id = $1 AND K.role_id = $2
  116.       INNER JOIN m_policy_product L ON J.sub_ctgr_product_id = L.sub_ctgr_product_id AND K.user_role_id = L.user_role_id
  117.       INNER JOIN m_ctgr_partner M ON B.ctgr_partner_id = M.ctgr_partner_id
  118.       INNER JOIN m_policy_partner N ON M.ctgr_partner_id = N.ctgr_partner_id AND K.user_role_id = N.user_role_id
  119.       INNER JOIN m_brand O ON G.brand_id = O.brand_id
  120.       INNER JOIN pu_po_balance_invoice Q
  121.             ON A.tenant_id = Q.tenant_id AND A.ou_id = Q.ou_id
  122.                 AND C.po_id = Q.po_id AND D.ref_doc_type_id = Q.ref_doc_type_id
  123.                 AND E.receive_goods_id = Q.ref_id AND E.receive_goods_item_id = Q.ref_item_id
  124.       LEFT JOIN pu_po_balance_invoice_tax R
  125.             ON Q.tenant_id = R.tenant_id AND Q.ou_id = R.ou_id
  126.                 AND Q.po_id = R.po_id AND Q.ref_doc_type_id = R.ref_doc_type_id
  127.                 AND Q.ref_id = R.ref_id AND Q.ref_item_id = R.ref_item_id AND F.tax_id = R.tax_id
  128.       LEFT JOIN pu_invoice_tax S ON A.invoice_id = S.invoice_id
  129.       WHERE A.tenant_id = $3
  130.         AND A.ou_id = $4
  131.         AND A.doc_date BETWEEN $5 AND $6
  132.         AND A.status_doc = $8 ' ||
  133.         vFilterPartner  ||
  134.         vFilterCtgrPartner  ||
  135.         vFilterCtgrProduct  ||
  136.         vFilterSubCtgrProduct   ||
  137.         vFilterBrand ||'
  138.     GROUP BY A.ou_id, B.partner_id, D.invoice_item_id, I.ctgr_product_id,
  139.         J.sub_ctgr_product_id, A.curr_code, B.partner_name, A.doc_no, A.doc_date,
  140.         A.ext_doc_no, A.ext_doc_date, C.doc_no, C.doc_date, G.product_code, G.product_name,
  141.         H.uom_code, F.nett_price_po, A.invoice_id, F.line_no,
  142.         P.flg_discount, P.gross_price_before_disc, F.discount_amount, F.discount_percentage,
  143.         S.tax_no, S.tax_date, AY.add_amount, AX.alloc_type, F.flg_tax_amount, F.tax_percentage
  144.     ORDER BY F.line_no, A.curr_code, B.partner_name, A.invoice_id, A.doc_no'
  145.     USING pUserId, pRoleId, pTenantId, pOuId, pDateFrom, pDateTo, vEmptyValue, vStatusDocRelease, pSessionId, vYes, vNo;
  146.    
  147.     -- Hitung prorate amount
  148.     WITH data_for_calc_prorate_amount AS (
  149.         SELECT session_id, invoice_id, invoice_item_id,
  150.                 CASE WHEN alloc_type = vAlocTypeAmount
  151.                     THEN ROUND((item_amount * add_amount ) / SUM(item_amount) OVER (PARTITION BY invoice_id), vRoundingDigit)
  152.                     ELSE ROUND((qty_po * add_amount ) / SUM(qty_po) OVER (PARTITION BY invoice_id), vRoundingDigit)
  153.                 END prorate_amount
  154.         FROM tt_purchasing_invoice_list
  155.         WHERE session_id = pSessionId
  156.         AND flg_update = vYes
  157.     )
  158.     UPDATE tt_purchasing_invoice_list A SET
  159.         prorate_amount = B.prorate_amount
  160.     FROM data_for_calc_prorate_amount B
  161.     WHERE A.session_id = B.session_id
  162.     AND A.invoice_id = B.invoice_id
  163.     AND A.invoice_item_id = B.invoice_item_id;
  164.    
  165.     -- Hitung prorate amount dengan seslisih dari total prorate dan additional discount
  166.     WITH data_invoice_item_dan_selisih_prorate AS (
  167.         SELECT session_id, invoice_id, invoice_item_id, prorate_amount,
  168.         row_number() OVER(PARTITION BY invoice_id ORDER BY invoice_id, prorate_amount DESC) AS line_no,
  169.         SUM(prorate_amount) OVER (PARTITION BY invoice_id) - add_amount AS selisih
  170.         FROM tt_purchasing_invoice_list
  171.         WHERE session_id = pSessionId
  172.         AND flg_update = vYes
  173.         ORDER BY invoice_id, prorate_amount DESC
  174.     ), perhitungan_selisih_prorate AS (
  175.         SELECT session_id, invoice_id, invoice_item_id,
  176.         CASE WHEN line_no = 1
  177.             THEN prorate_amount - selisih
  178.             ELSE prorate_amount
  179.         END prorate_amount
  180.         FROM data_invoice_item_dan_selisih_prorate
  181.     )
  182.    
  183.     -- Update nilai prorate_amount, tax_amount, item_amount, dan discount amount
  184.     UPDATE tt_purchasing_invoice_list A SET
  185.         prorate_amount = B.prorate_amount,
  186.         tax_amount = f_tax_rounding(
  187.                     pTenantId,
  188.                     f_get_amount_before_tax(
  189.                             A.item_amount+B.prorate_amount,
  190.                             A.flg_tax_amount,
  191.                             A.tax_percentage,
  192.                             f_get_digit_decimal_doc_curr(vReceiveGoodsDocTypeId, A.curr_code),
  193.                             vRoundingModeNonTax),
  194.                     A.tax_percentage),
  195.         item_amount = A.item_amount+B.prorate_amount,
  196.         discount_amount = A.discount_amount-B.prorate_amount
  197.     FROM perhitungan_selisih_prorate B
  198.     WHERE A.session_id = B.session_id
  199.     AND A.invoice_id = B.invoice_id
  200.     AND A.invoice_item_id = B.invoice_item_id;
  201.    
  202.     Open pRefDetail FOR
  203.         SELECT A.ou_id, A.partner_id, A.invoice_item_id, A.ctgr_product_id,
  204.             A.sub_ctgr_product_id, A.curr_code, A.partner_name, A.doc_no, A.doc_date,
  205.             A.ref_no, A.ref_date, A.po_no, A.po_date, A.product_code, A.product_name,
  206.             A.qty_po, A.uom_po, A.price, A.item_amount, A.tax_amount, A.invoice_id,
  207.             ROUND((CASE WHEN (A.flg_discount = 'A') THEN
  208.                 (CASE WHEN (A.gross_price_before_disc = 0)
  209.                     THEN 0
  210.                     ELSE (A.discount_amount*100/A.gross_price_before_disc)
  211.                 END)
  212.             ELSE A.discount_percentage END), 2) AS disc_percentage,
  213.             A.no_faktur, A.tgl_faktur
  214.         FROM tt_purchasing_invoice_list A
  215.         WHERE A.session_id = pSessionId;
  216.     RETURN NEXT pRefDetail ;
  217.    
  218.     DELETE FROM tt_purchasing_invoice_list WHERE session_id = pSessionId;
  219.    
  220. END;
  221. $BODY$
  222.   LANGUAGE plpgsql VOLATILE
  223.   COST 100
  224.   ROWS 1000;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement