Advertisement
aadddrr

r_outlet_detail_analysis_gross_profit_20170801

Aug 1st, 2017
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /**
  2.  * Modified by Adrian, Aug 1, 2017
  3.  * monthly_price_amount diambil per year-month
  4.  */
  5.  
  6. CREATE OR REPLACE FUNCTION r_outlet_detail_analysis_gross_profit(character varying, bigint, bigint, character varying, character varying, character varying, bigint)
  7.   RETURNS SETOF refcursor AS
  8. $BODY$
  9. DECLARE
  10.     pRefHeader              REFCURSOR := 'refHeader';
  11.     pRefDetail              REFCURSOR := 'refDetail';
  12.     pSessionId              ALIAS FOR $1;
  13.     pTenantId               ALIAS FOR $2;
  14.     pOuId                   ALIAS FOR $3;
  15.     pDateFrom               ALIAS FOR $4;
  16.     pDateTo                 ALIAS FOR $5;
  17.     pProductCodeName        ALIAS FOR $6;
  18.     pUserId                 ALIAS FOR $7;
  19.        
  20.     vEmptyValue             character varying(1);
  21.     vAllId                  bigint;
  22.     vEmptyId                bigint;
  23.     vParentOuId             bigint;
  24.     vCount                  bigint;
  25.     vRoundingMode           character varying(5);
  26.     vYearMonth              character varying(6);
  27.     vDatetime               character varying(14);
  28.    
  29.     vCurrentYearMonth       character varying(6);
  30.     vEndYearMonth           character varying(6);
  31.    
  32. BEGIN
  33.    
  34.     vEmptyValue := '';
  35.     vAllId := -99;
  36.     vEmptyId := -99;
  37.     vParentOuId := f_get_parent_ou_bu(pTenantId, pOuId);
  38.    
  39.     SELECT f_get_value_system_config_by_param_code(pTenantId, 'rounding.mode.non.tax') INTO vRoundingMode;
  40.    
  41.     SELECT TO_CHAR(now(), 'YYYYMM') INTO vYearMonth;
  42.    
  43.     SELECT TO_CHAR(now(), 'YYYYMMDDHH24MISS') INTO vDatetime;
  44.    
  45.     DELETE FROM tr_commision_gross_profit WHERE session_id = pSessionId;
  46.     DELETE FROM tr_detail_gross_profit WHERE session_id = pSessionId;
  47.     DELETE FROM tt_input_data WHERE session_id = pSessionId;
  48.     DELETE FROM tt_output_data WHERE session_id = pSessionId;
  49.     DELETE FROM tt_out_latest_purchasing_price_by_date WHERE session_id = pSessionId;
  50.     DELETE FROM tt_in_latest_purchasing_price_by_date WHERE session_id = pSessionId;
  51.    
  52.     /*
  53.      * ambil semua trx pos di main business unit yang tidak di void
  54.      * jika transaksi itu ada item assembly ambil berdasarkan core product id nya
  55.      * ambil juga harga beli terakhir dari item itu sesuai dengan tahun bulan    
  56.      */
  57.     INSERT INTO tr_commision_gross_profit(
  58.            session_id, tenant_id, year_month_date, ou_id, ou_code, ou_name, ou_parent_id,
  59.            doc_type_id, doc_no, doc_date, line_no,
  60.            product_id, curr_code, qty, nett_sell_price, nett_amount_item,
  61.            commision_ou_id, commision_type, commision_percentage, commision_curr_code, commision_amount,
  62.            monthly_price_curr_code, monthly_price_amount
  63.     )
  64.     SELECT pSessionId, A.tenant_id, SUBSTRING(A.doc_date, 1, 6), A.ou_id, B.ou_code, B.ou_name, B.ou_parent_id,
  65.            A.doc_type_id, A.doc_no, A.doc_date, C.line_no,
  66.            COALESCE(G.core_product_id, C.product_id), C.curr_code, C.qty, C.nett_sell_price, C.nett_amount_item,
  67.            D.commision_ou_id, D.commision_type, D.commision_percentage, D.curr_code, D.commision_amount,
  68.            '', 0
  69.     FROM i_trx_pos A
  70.     INNER JOIN t_ou B ON A.ou_id = B.ou_id
  71.     INNER JOIN i_trx_pos_item C ON A.tenant_id = C.tenant_id AND A.trx_pos_id = C.trx_pos_id AND A.process_no = C.process_no
  72.     INNER JOIN m_commision_ou D ON C.group_product_ou_id = D.group_product_ou_id
  73.     LEFT OUTER JOIN m_ext_product G ON C.product_id = G.product_id
  74.     WHERE A.tenant_id = pTenantId
  75.     AND A.doc_date BETWEEN pDateFrom AND pDateTo
  76.     AND A.ou_id = pOuId
  77.     AND B.ou_parent_id = vParentOuId
  78.     AND NOT EXISTS (
  79.         SELECT 1 FROM i_trx_log_voided_pos F
  80.         WHERE A.tenant_id = F.tenant_id
  81.         AND A.doc_no = F.doc_no
  82.         AND A.doc_date = F.doc_date
  83.         AND A.ou_id = F.ou_id
  84.     );
  85.    
  86.     /* v329 data yang diambil dari pu_monthly_price_product diubah
  87.      * menjadi ambil dari table  
  88.      * tt_out_latest_purchasing_price_by_date menggunakan
  89.      * pu_get_latest_purchasing_price_by_date yang sebelumnya datanya dimasukkan ke
  90.      * tt_in_latest_purchasing_price_by_date */
  91.    
  92.     ANALYZE tr_commision_gross_profit;
  93.  
  94.     SELECT MIN(year_month_date), MAX(year_month_date) FROM tr_commision_gross_profit INTO vCurrentYearMonth, vEndYearMonth;
  95.    
  96.     --Modified by Adrian, Aug 1, 2017
  97.     --monthly_price_amount di-update per year-month
  98.     WHILE vCurrentYearMonth <= vEndYearMonth LOOP
  99.    
  100.         DELETE FROM tt_in_latest_purchasing_price_by_date WHERE session_id = pSessionId;
  101.         DELETE FROM tt_out_latest_purchasing_price_by_date WHERE session_id = pSessionId;
  102.    
  103.         INSERT INTO tt_in_latest_purchasing_price_by_date(session_id, tenant_id, ou_bu_id, doc_date, product_id)
  104.             SELECT pSessionId, pTenantId, B.ou_bu_id, A.doc_date, A.product_id  
  105.         FROM tr_commision_gross_profit A
  106.             INNER JOIN m_ou_structure B ON A.ou_id = B.ou_id
  107.         WHERE A.tenant_id = pTenantId
  108.             AND A.session_id = pSessionId
  109.             AND A.year_month_date = vCurrentYearMonth
  110.         GROUP BY B.ou_bu_id, A.doc_date, A.product_id;
  111.            
  112.         PERFORM pu_get_latest_purchasing_price_by_date(pSessionId, pTenantId, vYearMonth, vParentOuId, vDatetime, pUserId);
  113.        
  114.         /*sebelum v329
  115.         UPDATE tr_commision_gross_profit
  116.         SET monthly_price_curr_code = COALESCE(A.curr_code, tr_commision_gross_profit.curr_code), monthly_price_amount = COALESCE(f_get_gross_price_from_nett_amount(A.amount, A.qty, A.flg_tax_amount, A.tax_percentage, vRoundingMode, f_get_digit_decimal_doc_curr(-99, A.curr_code)), 0)
  117.         FROM pu_monthly_price_product A
  118.         WHERE tr_commision_gross_profit.session_id = pSessionId
  119.         AND tr_commision_gross_profit.product_id = A.product_id
  120.         AND tr_commision_gross_profit.year_month_date = A.year_month_date  
  121.         AND tr_commision_gross_profit.ou_parent_id = A.ou_id;
  122.         */
  123.    
  124.         ANALYZE tt_out_latest_purchasing_price_by_date;
  125.    
  126.         UPDATE tr_commision_gross_profit B
  127.         --SET monthly_price_curr_code = A.curr_code, monthly_price_amount = ROUND(A.amount / A.qty)
  128.         SET monthly_price_curr_code = COALESCE(A.gl_purch_curr_code, B.curr_code), monthly_price_amount = COALESCE(A.gl_purch_gross_price, 0)
  129.         FROM tt_out_latest_purchasing_price_by_date A
  130.         INNER JOIN m_ou_structure C ON C.ou_bu_id = A.ou_bu_id
  131.         WHERE A.session_id = B.session_id
  132.         AND B.product_id = A.product_id
  133.         AND B.tenant_id = A.tenant_id
  134.         AND B.doc_date = A.doc_date
  135.         AND B.year_month_date = vCurrentYearMonth
  136.         AND C.ou_id = B.ou_id;
  137.        
  138.         SELECT TO_CHAR(TO_DATE(vCurrentYearMonth,'YYYYMM') + interval '1 Month','YYYYMM') INTO vCurrentYearMonth;
  139.        
  140.         DELETE FROM tt_in_latest_purchasing_price_by_date WHERE session_id = pSessionId;
  141.         DELETE FROM tt_out_latest_purchasing_price_by_date WHERE session_id = pSessionId;
  142.        
  143.     END LOOP;
  144.    
  145.     ANALYZE tr_commision_gross_profit;
  146.  
  147.     /*
  148.      * update nilai komisi jika menggunakan tipe komisi persentase
  149.      */
  150.     UPDATE tr_commision_gross_profit SET commision_amount = ROUND(nett_sell_price * commision_percentage / 100,0), commision_curr_code = curr_code
  151.     WHERE commision_type = 'PCT'
  152.     AND session_id = pSessionId;
  153.    
  154.     /*sebelum v329
  155.      * update nilai harga beli terakhir menggunakan valuta penjualan
  156.      
  157.     UPDATE tr_commision_gross_profit SET monthly_price_amount = monthly_price_amount * f_commercial_rate(tenant_id, doc_date, monthly_price_curr_code, curr_code), monthly_price_curr_code = curr_code
  158.     WHERE monthly_price_curr_code <> curr_code
  159.     AND session_id = pSessionId AND monthly_price_curr_code <> '';
  160.     */
  161.     /*
  162.      * pindahkan data tahun bulan yang diminta (sudah direkap per outlet)
  163.      */
  164.    
  165.     ANALYZE tr_commision_gross_profit;
  166.    
  167.     INSERT INTO tr_detail_gross_profit (
  168.         session_id, tenant_id, ou_id, product_id, curr_code,
  169.         sales_amount, commision_amount, monthly_price_amount, gross_profit,
  170.         qty
  171.     )
  172.     SELECT pSessionId, tenant_id, ou_id, product_id, curr_code,
  173.            SUM(nett_amount_item) AS sales_amount, SUM(commision_amount * qty) AS commision_amount, SUM(monthly_price_amount * qty) AS monthly_price_amount, 0,
  174.            SUM(qty)
  175.     FROM tr_commision_gross_profit
  176.     WHERE session_id = pSessionId
  177.     GROUP BY tenant_id, ou_id, product_id, curr_code;
  178.    
  179.     /*
  180.      * update data gross profit
  181.      */
  182.     ANALYZE tr_detail_gross_profit;
  183.    
  184.     UPDATE tr_detail_gross_profit SET gross_profit = sales_amount - monthly_price_amount  
  185.     WHERE session_id = pSessionId;
  186.    
  187.     /*
  188.      * return header
  189.      */
  190.     Open pRefHeader FOR
  191.     SELECT A.fullname AS full_name, B.ou_name AS ou_name, pDateFrom AS date_from, pDateTo AS date_to, vDatetime AS datetime
  192.     FROM t_user A
  193.     INNER JOIN t_ou B ON A.tenant_id = B.tenant_id
  194.     WHERE user_id = pUserId
  195.     AND ou_id = pOuId;
  196.    
  197.     RETURN NEXT pRefHeader;
  198.    
  199.     INSERT INTO tt_input_data
  200.     (session_id, id_data, data_group_1,
  201.     data_group_2, data_group_3, data_group_4, data_group_5, data_measure)
  202.     SELECT pSessionId, 'SALDO', A.curr_code,
  203.         A.qty::text, B.product_id::text, A.sales_amount::text, A.gross_profit::text, A.gross_profit::numeric
  204.     FROM tr_detail_gross_profit A
  205.     INNER JOIN m_product B ON A.product_id = B.product_id
  206.     WHERE A.session_id = pSessionId;
  207.    
  208.     PERFORM f_agregate_percentage(pSessionId, 'SALDO', ';', 3, 1, 2);
  209.    
  210.     IF TRIM(pProductCodeName) <> vEmptyValue THEN
  211.         Open pRefDetail FOR
  212.         SELECT A.data_group_1 AS curr_code,
  213.         A.data_group_2::bigint AS qty,  
  214.         f_get_product_code(A.data_group_3::bigint) AS product_code,
  215.         f_get_product_name(A.data_group_3::bigint) AS product_name,
  216.         A.data_group_4::numeric AS nilai_penjualan,
  217.         A.data_group_5::numeric AS margin,
  218.         A.data_group_6::numeric AS qty,
  219.         f_get_ctgr_product_code(B.ctgr_product_id) AS ctgr_product_code,
  220.         f_get_ctgr_product_name(B.ctgr_product_id) AS ctgr_product_name,
  221.         f_get_sub_ctgr_product_code(B.sub_ctgr_product_id) AS sub_ctgr_product_code,
  222.         f_get_sub_ctgr_product_name(B.sub_ctgr_product_id) AS sub_ctgr_product_name,
  223.         f_get_uom_name(B.base_uom_id) AS uom_name,
  224.         round(A.percentage_measure, 2) AS percent  
  225.         FROM tt_output_data A
  226.         INNER JOIN m_product B ON A.data_group_3::bigint = B.product_id
  227.         WHERE A.session_id = pSessionId
  228.         AND UPPER(A.data_group_2) LIKE '%' || UPPER(pProductCodeName) || '%' OR UPPER(A.data_group_3) LIKE '%' || UPPER(pProductCodeName) || '%'
  229.         ORDER BY curr_code ASC, percent DESC, nilai_penjualan DESC, margin DESC, product_code ASC;
  230.     ELSE
  231.         Open pRefDetail FOR
  232.         SELECT A.data_group_1 AS curr_code, A.data_group_2::bigint AS qty, f_get_product_code(A.data_group_3::bigint) AS product_code, f_get_product_name(A.data_group_3::bigint) AS product_name,
  233.                A.data_group_4::numeric AS nilai_penjualan, A.data_group_5::numeric AS margin, round(A.percentage_measure, 2) AS percent,
  234.                f_get_ctgr_product_code(B.ctgr_product_id) AS ctgr_product_code,
  235.                f_get_ctgr_product_name(B.ctgr_product_id) AS ctgr_product_name,
  236.                f_get_sub_ctgr_product_code(B.sub_ctgr_product_id) AS sub_ctgr_product_code,
  237.                f_get_sub_ctgr_product_name(B.sub_ctgr_product_id) AS sub_ctgr_product_name,
  238.                f_get_uom_name(B.base_uom_id) AS uom_name
  239.         FROM tt_output_data A
  240.         INNER JOIN m_product B ON A.data_group_3::bigint = B.product_id
  241.         WHERE A.session_id = pSessionId
  242.         ORDER BY curr_code ASC, percent DESC, nilai_penjualan DESC, margin DESC, product_code ASC;
  243.     END IF;
  244.    
  245.     RETURN NEXT pRefDetail;
  246.  
  247.     DELETE FROM tr_commision_gross_profit WHERE session_id = pSessionId;
  248.     DELETE FROM tr_detail_gross_profit WHERE session_id = pSessionId;
  249.     DELETE FROM tt_input_data WHERE session_id = pSessionId;
  250.     DELETE FROM tt_output_data WHERE session_id = pSessionId;
  251.     DELETE FROM tt_out_latest_purchasing_price_by_date WHERE session_id = pSessionId;
  252.     DELETE FROM tt_in_latest_purchasing_price_by_date WHERE session_id = pSessionId;
  253.  
  254.    
  255. END;
  256. $BODY$
  257.   LANGUAGE plpgsql VOLATILE
  258.   COST 100
  259.   ROWS 1000;
  260.   /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement