Advertisement
aadddrr

pu_get_latest_purchasing_price_by_date

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