Advertisement
aadddrr

pu_get_latest_purchasing_price_by_date_20170808_2

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