Advertisement
aadddrr

pu_get_latest_purchasing_price_by_date_20170809_3

Aug 8th, 2017
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. --Modified by Adrian, Jul 31, 2017
  2. --meng-comment kondisi AND A.item_amount > 0 pada tt_purch_by_period
  3. --mengubah ambil harga beli dari PO terakhir
  4. --po_balance_invoice_id diambil dari produk paling awal dalam PO terakhir per tanggal
  5.  
  6. CREATE OR REPLACE FUNCTION pu_get_latest_purchasing_price_by_date(character varying, bigint, character varying, bigint, character varying, bigint)
  7.   RETURNS void AS
  8. $BODY$
  9. DECLARE
  10.     pSessionId      ALIAS FOR $1;
  11.     pTenantId       ALIAS FOR $2;
  12.     pYearMonth      ALIAS FOR $3;
  13.     pOuId           ALIAS FOR $4;
  14.     pDatetime       ALIAS FOR $5;
  15.     pUserId         ALIAS FOR $6;
  16.  
  17.     vEmptyString    character varying := '';
  18.     vNo             character varying := 'N';
  19.     vYes            character varying := 'Y';
  20.     vZero           numeric := 0;
  21.     vStartDate              character varying(8);
  22.     vStartDateFromStartMonth character varying(8);
  23.     vEndDate                character varying(8);
  24.     vLastSummaryPeriod      character varying(8);
  25.     vDefaultGlCurrCode      character varying(100);
  26.     vRoundingMode           character varying(10);
  27.     vOneMonthBeforeStartDate character varying(6);
  28.     vOneMonthAfterLastSummary character varying(6);
  29.     vReceiveGoodsDocTypeId  bigint := 111;     
  30. BEGIN
  31.    
  32.     vDefaultGlCurrCode := f_get_value_system_config_by_param_code(pTenantId,'ValutaBuku');
  33.     vRoundingMode := f_get_value_system_config_by_param_code(pTenantId, 'rounding.mode.non.tax');
  34.    
  35.     DELETE FROM pu_temp_summary_monthly_latest_purchasing WHERE session_id = pSessionId;
  36.     DELETE FROM tt_purch_by_period WHERE session_id = pSessionId;
  37.    
  38.     ANALYZE tt_in_latest_purchasing_price_by_date;
  39.    
  40.     -- 1. pindahkan semua yg di input ke output nya terlebih dahulu
  41.     -- (contoh: doc date ada bulan Desember 2014 - Maret 2015)
  42.     INSERT INTO tt_out_latest_purchasing_price_by_date (
  43.         session_id, tenant_id, ou_bu_id, doc_date, product_id, 
  44.         purch_curr_code, purch_nett_price, purch_gross_price,
  45.         gl_purch_curr_code, gl_purch_nett_price, gl_purch_gross_price,
  46.         flg_cogs
  47.     )
  48.     SELECT pSessionId, tenant_id, ou_bu_id, doc_date, product_id,
  49.            vEmptyString, vZero, vZero,
  50.            vEmptyString, vZero, vZero,
  51.            vNo
  52.     FROM tt_in_latest_purchasing_price_by_date
  53.     WHERE session_id = pSessionId
  54.     AND tenant_id = pTenantId;
  55.    
  56.     ANALYZE tt_out_latest_purchasing_price_by_date;
  57.    
  58.     -- 2. cari periode penjualan yang harus dicari nilai pembeliannya
  59.     SELECT MIN(doc_date), MAX(doc_date) INTO vStartDate, vEndDate
  60.     FROM tt_out_latest_purchasing_price_by_date
  61.     WHERE session_id = pSessionId;
  62.    
  63.     ANALYZE pu_summary_monthly_latest_purchasing;
  64.    
  65.     -- 3. cari rekap purchasing terakhir bulan apa (contoh: Januari 2015) sebelum start date
  66.     SELECT MAX(year_month_date) INTO vLastSummaryPeriod
  67.     FROM pu_summary_monthly_latest_purchasing
  68.     WHERE ou_id = pOuId
  69.     AND tenant_id = pTenantId
  70.     AND year_month_date < vStartDate;
  71.    
  72.     -- 4. lakukan proses rekap temporary dari periode terakhir rekap + 1 bulan sampai periode penjualan awal - 1 bulan
  73.    
  74.     SELECT TO_CHAR(TO_DATE(vStartDate,'YYYYMMDD') - interval '1 Month','YYYYMM') INTO vOneMonthBeforeStartDate;
  75.     SELECT TO_CHAR(TO_DATE(vLastSummaryPeriod,'YYYYMM') + interval '1 Month','YYYYMM') INTO vOneMonthAfterLastSummary;
  76.    
  77.     SELECT SUBSTRING(vStartDate, 1, 6) || '01' INTO vStartDateFromStartMonth;
  78.    
  79.     IF SUBSTRING(vStartDate, 1, 6) <= vLastSummaryPeriod THEN
  80.         INSERT INTO pu_temp_summary_monthly_latest_purchasing
  81.         (session_id, tenant_id, ou_id, year_month_date,
  82.          product_id, curr_code, nett_price, gross_price,
  83.          gl_curr_code, gl_nett_price, gl_gross_price,
  84.          ref_doc_type_id, ref_id, ref_doc_no, ref_doc_date,
  85.          version, create_datetime, create_user_id, update_datetime, update_user_id)
  86.         SELECT pSessionId, tenant_id, ou_id, year_month_date,
  87.                product_id, curr_code, nett_price, gross_price,
  88.                gl_curr_code, gl_nett_price, gl_gross_price,
  89.                ref_doc_type_id, ref_id, ref_doc_no, ref_doc_date,
  90.                0, pDatetime, pUserId, pDatetime, pUserId
  91.         FROM pu_summary_monthly_latest_purchasing
  92.         WHERE ou_id = pOuId
  93.         AND tenant_id = pTenantId
  94.         AND year_month_date = vOneMonthBeforeStartDate;
  95.     ELSE
  96.         INSERT INTO pu_temp_summary_monthly_latest_purchasing
  97.         (session_id, tenant_id, ou_id, year_month_date,
  98.          product_id, curr_code, nett_price, gross_price,
  99.          gl_curr_code, gl_nett_price, gl_gross_price,
  100.          ref_doc_type_id, ref_id, ref_doc_no, ref_doc_date,
  101.          version, create_datetime, create_user_id, update_datetime, update_user_id)
  102.         SELECT pSessionId, tenant_id, ou_id, year_month_date,
  103.                product_id, curr_code, nett_price, gross_price,
  104.                gl_curr_code, gl_nett_price, gl_gross_price,
  105.                ref_doc_type_id, ref_id, ref_doc_no, ref_doc_date,
  106.                0, pDatetime, pUserId, pDatetime, pUserId
  107.         FROM pu_summary_monthly_latest_purchasing
  108.         WHERE ou_id = pOuId
  109.         AND tenant_id = pTenantId
  110.         AND year_month_date = vLastSummaryPeriod;
  111.    
  112.         WHILE vOneMonthAfterLastSummary <= vOneMonthBeforeStartDate LOOP
  113.             PERFORM pu_temp_summary_purch(pTenantId,pSessionId,pOuId,vOneMonthAfterLastSummary,pDatetime,pUserId);
  114.             SELECT TO_CHAR(TO_DATE(vOneMonthAfterLastSummary,'YYYYMM') + interval '1 Month','YYYYMM') INTO vOneMonthAfterLastSummary;
  115.         END LOOP;
  116.     END IF;
  117.    
  118.     ANALYZE tt_out_latest_purchasing_price_by_date;
  119.    
  120.     -- 5. ambil transaksi pembelian dari bulan transaksi yg di cari di nomor 1 (contoh: Desember 2014 - Maret 2015)
  121.     INSERT INTO tt_purch_by_period (
  122.         session_id, tenant_id, ou_id, doc_date, product_id, curr_code,
  123.         nett_price, gross_price, gl_curr_code, gl_nett_price, gl_gross_price
  124.     )
  125.     SELECT pSessionId, A.tenant_id, A.ou_id, A.ref_doc_date,
  126.        B.product_id, A.curr_code,
  127.        CASE WHEN vRoundingMode = 'RD'
  128.         THEN TRUNC(SUM(A.item_amount) / SUM(A.qty_rcv_po), f_get_digit_decimal_doc_curr(-99, A.curr_code))
  129.         ELSE ROUND(SUM(A.item_amount) / SUM(A.qty_rcv_po), f_get_digit_decimal_doc_curr(-99, A.curr_code))
  130.        END,
  131.        CASE WHEN vRoundingMode = 'RD'
  132.         THEN TRUNC(SUM(A.item_amount + COALESCE(G.tax_amount, 0)) / SUM(A.qty_rcv_po), f_get_digit_decimal_doc_curr(-99, A.curr_code))
  133.         ELSE ROUND(SUM(A.item_amount + COALESCE(G.tax_amount, 0)) / SUM(A.qty_rcv_po), f_get_digit_decimal_doc_curr(-99, A.curr_code))
  134.        END,
  135.        vDefaultGlCurrCode,
  136.        CASE WHEN vRoundingMode = 'RD'
  137.         THEN TRUNC(SUM(A.item_amount) / SUM(A.qty_rcv_po), f_get_digit_decimal_doc_curr(-99, vDefaultGlCurrCode)) * f_commercial_rate(pTenantId, A.ref_doc_date, A.curr_code, vDefaultGlCurrCode)
  138.         ELSE ROUND(SUM(A.item_amount) / SUM(A.qty_rcv_po), f_get_digit_decimal_doc_curr(-99, vDefaultGlCurrCode)) * f_commercial_rate(pTenantId, A.ref_doc_date, A.curr_code, vDefaultGlCurrCode)
  139.        END,
  140.        CASE WHEN vRoundingMode = 'RD'
  141.         THEN TRUNC(SUM(A.item_amount + COALESCE(G.tax_amount, 0)) / SUM(A.qty_rcv_po), f_get_digit_decimal_doc_curr(-99, vDefaultGlCurrCode)) * f_commercial_rate(pTenantId, A.ref_doc_date, A.curr_code, vDefaultGlCurrCode)
  142.         ELSE ROUND(SUM(A.item_amount + COALESCE(G.tax_amount, 0)) / SUM(A.qty_rcv_po), f_get_digit_decimal_doc_curr(-99, vDefaultGlCurrCode)) * f_commercial_rate(pTenantId, A.ref_doc_date, A.curr_code, vDefaultGlCurrCode)
  143.         END
  144.     FROM pu_po_balance_invoice A
  145.     INNER JOIN pu_receive_goods_item B ON A.ref_item_id = B.receive_goods_item_id
  146.     LEFT OUTER JOIN pu_po_balance_invoice_tax G
  147.         ON A.tenant_id = G.tenant_id
  148.         AND A.ou_id = G.ou_id
  149.         AND A.partner_id = G.partner_id
  150.         AND A.ref_doc_type_id = G.ref_doc_type_id
  151.         AND A.ref_id = G.ref_id
  152.         AND A.ref_item_id = G.ref_item_id
  153.     WHERE A.ref_doc_type_id = vReceiveGoodsDocTypeId
  154.     --AND A.item_amount > 0
  155.     AND A.ref_doc_date BETWEEN vStartDateFromStartMonth AND vEndDate
  156.     AND A.ou_id = pOuId
  157.     AND A.tenant_id = pTenantId
  158.     AND EXISTS (
  159.         SELECT 1
  160.         FROM tt_out_latest_purchasing_price_by_date C
  161.         WHERE C.session_id = pSessionId
  162.         AND C.product_id = B.product_id
  163.         AND A.ou_id = C.ou_bu_id
  164.     )
  165.     AND A.po_balance_invoice_id = (
  166.         SELECT C.po_balance_invoice_id
  167.         FROM pu_po_balance_invoice C
  168.         INNER JOIN pu_receive_goods_item D ON C.ref_item_id = D.receive_goods_item_id
  169.         INNER JOIN dt_date E ON C.ref_doc_date = E.string_date
  170.         INNER JOIN pu_po_item F ON D.ref_id = F.po_item_id
  171.         WHERE D.product_id = B.product_id
  172.         --AND E.year_month_date = SUBSTR(A.ref_doc_date, 1, 6)
  173.         AND C.ref_doc_date <= A.ref_doc_date
  174.         AND C.ou_id = A.ou_id
  175.         AND C.ref_doc_type_id = vReceiveGoodsDocTypeId
  176.         AND C.tenant_id = pTenantId
  177.         ORDER BY C.ref_doc_date DESC, C.create_datetime DESC, F.line_no ASC
  178.         LIMIT 1
  179.     )
  180.     GROUP BY A.tenant_id, A.ou_id, A.ref_doc_date, B.product_id, A.curr_code
  181.     ORDER BY A.ref_doc_date DESC;
  182.    
  183.     ANALYZE tt_out_latest_purchasing_price_by_date;
  184.     ANALYZE tt_purch_by_period;
  185.    
  186.     -- 6. update nilai pembelian terakhir dari step nomor 5
  187.     WITH tt_purch_by_period_by_date AS (
  188.         SELECT A.session_id, B.ou_id, A.product_id, A.doc_date, MAX(B.doc_date) AS max_doc_date
  189.         FROM tt_purch_by_period B
  190.         INNER JOIN tt_out_latest_purchasing_price_by_date A
  191.         ON B.session_id = A.session_id
  192.         AND A.product_id = B.product_id
  193.         AND A.ou_bu_id = B.ou_id
  194.         AND B.doc_date <= A.doc_date
  195.         WHERE A.session_id = pSessionId
  196.         GROUP BY A.session_id, B.ou_id, A.product_id, A.doc_date
  197.     )
  198.     UPDATE tt_out_latest_purchasing_price_by_date A
  199.     SET purch_curr_code = B.curr_code,
  200.         purch_nett_price = B.nett_price,
  201.         purch_gross_price = B.gross_price,
  202.         gl_purch_curr_code = B.gl_curr_code,
  203.         gl_purch_nett_price = B.gl_nett_price,
  204.         gl_purch_gross_price = B.gl_gross_price,
  205.         flg_cogs = vYes
  206.     FROM tt_purch_by_period B
  207.     INNER JOIN tt_purch_by_period_by_date C
  208.         ON B.session_id = C.session_id
  209.         AND C.product_id = B.product_id
  210.         AND C.ou_id = B.ou_id
  211.         AND B.doc_date = C.max_doc_date
  212.     WHERE B.session_id = A.session_id
  213.     AND A.session_id = pSessionId
  214.     AND A.product_id = B.product_id
  215.     AND A.ou_bu_id = B.ou_id
  216.     AND A.doc_date = C.doc_date
  217.     AND A.flg_cogs = vNo;
  218.    
  219.     ANALYZE pu_temp_summary_monthly_latest_purchasing;
  220.    
  221.     -- 7. update nilai pembelian terakhir bagi yang belum dapat nilai di nomor 6 dengan nilai rekap terakhir dari rekap pembelian (temp)
  222.     UPDATE tt_out_latest_purchasing_price_by_date A
  223.     SET purch_curr_code = B.curr_code,
  224.         purch_nett_price = B.nett_price,
  225.         purch_gross_price = B.gross_price,
  226.         gl_purch_curr_code = B.gl_curr_code,
  227.         gl_purch_nett_price = B.gl_nett_price,
  228.         gl_purch_gross_price = B.gl_gross_price,
  229.         flg_cogs = vYes
  230.     FROM pu_temp_summary_monthly_latest_purchasing B
  231.     WHERE A.flg_cogs = vNo
  232.     AND A.session_id = pSessionId
  233.     AND A.product_id = B.product_id
  234.     AND A.ou_bu_id = B.ou_id
  235.     AND B.year_month_date = vOneMonthBeforeStartDate
  236.     AND B.session_id = pSessionId;
  237.    
  238.     DELETE FROM pu_temp_summary_monthly_latest_purchasing WHERE session_id = pSessionId;
  239.     DELETE FROM tt_purch_by_period WHERE session_id = pSessionId;
  240.    
  241. END;   
  242. $BODY$
  243.   LANGUAGE plpgsql VOLATILE
  244.   COST 100;
  245.   /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement