Advertisement
aadddrr

pu_get_latest_purchasing_price_by_date

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