Advertisement
aadddrr

pu_get_latest_purchasing_price_by_date

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