Advertisement
aadddrr

r_outlet_analysis_commision_gross_profit_20170801_1

Jul 31st, 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 di-update per year-month
  4.  */
  5.  
  6. CREATE OR REPLACE FUNCTION r_outlet_analysis_commision_gross_profit(character varying, bigint, bigint,
  7. character varying, bigint, character varying, character varying, character varying)
  8.   RETURNS SETOF refcursor AS
  9. $BODY$
  10. DECLARE
  11.     pRefHeader              REFCURSOR := 'refHeader';
  12.     pRefDetail              REFCURSOR := 'refDetail';
  13.     pSessionId              ALIAS FOR $1;
  14.     pTenantId               ALIAS FOR $2;
  15.     pOuId                   ALIAS FOR $3;
  16.     pYearMonth              ALIAS FOR $4;
  17.     pUserId                 ALIAS FOR $5;
  18.     pOutletName             ALIAS FOR $6;
  19.     pTglAwal                ALIAS FOR $7;
  20.     pTglAkhir               ALIAS FOR $8;
  21.        
  22.     vEmptyValue             character varying(1);
  23.     vAwalTahun              character varying(6);
  24.     vAkhirRekap             character varying(6);
  25.     vAllId                  bigint;
  26.     vEmptyId                bigint;
  27.     vRoundingMode           character varying(5);
  28.     vDatetime               character varying(14);
  29.    
  30.     vCurrentYearMonth       character varying(6);
  31.    
  32. BEGIN
  33.    
  34.     vEmptyValue := '';
  35.     vAllId := -99;
  36.     vEmptyId := -99;
  37.     vAwalTahun := SUBSTRING(pYearMonth, 1, 4) || '01';
  38.    
  39.     SELECT f_get_value_system_config_by_param_code(pTenantId, 'rounding.mode.non.tax') INTO vRoundingMode;
  40.    
  41.     IF SUBSTRING(pYearMonth, 5, 2) = '01' THEN
  42.         vAkhirRekap := pYearMonth;
  43.     ELSE
  44.         vAkhirRekap := TO_CHAR(to_date(pYearMonth, 'YYYYMM') - interval '1 month', 'YYYYMM');
  45.     END IF;
  46.    
  47.     DELETE FROM tr_commision_gross_profit WHERE session_id = pSessionId;
  48.     DELETE FROM tr_current_commision_gross_profit WHERE session_id = pSessionId;
  49.     DELETE FROM tr_rekap_commision_gross_profit WHERE session_id = pSessionId;
  50.     DELETE FROM tr_commision_gross_profit_for_output WHERE session_id = pSessionId;
  51.     DELETE FROM tt_in_latest_purchasing_price_by_date WHERE session_id = pSessionId;
  52.     DELETE FROM tt_out_latest_purchasing_price_by_date WHERE session_id = pSessionId;
  53.  
  54.     /*
  55.      * ambil semua trx pos di main business unit yang tidak di void
  56.      * jika transaksi itu ada item assembly ambil berdasarkan core product id nya
  57.      * ambil juga harga beli terakhir dari item itu sesuai dengan tahun bulan    
  58.      */
  59.     INSERT INTO tr_commision_gross_profit(
  60.            session_id, tenant_id, year_month_date, ou_id, ou_code, ou_name, ou_parent_id,
  61.            doc_type_id, doc_no, doc_date, line_no,
  62.            product_id, curr_code, qty, nett_sell_price, nett_amount_item,
  63.            commision_ou_id, commision_type, commision_percentage, commision_curr_code, commision_amount,
  64.            monthly_price_curr_code, monthly_price_amount
  65.     )
  66.     SELECT pSessionId, A.tenant_id, SUBSTRING(A.doc_date, 1, 6), A.ou_id, B.ou_code, B.ou_name, B.ou_parent_id,
  67.            A.doc_type_id, A.doc_no, A.doc_date, C.line_no,
  68.            COALESCE(G.core_product_id, C.product_id), C.curr_code, C.qty, C.nett_sell_price, C.nett_amount_item,
  69.            D.commision_ou_id, D.commision_type, D.commision_percentage, D.curr_code, D.commision_amount,
  70.            '', 0
  71.     FROM i_trx_pos A
  72.     INNER JOIN t_ou B ON A.ou_id = B.ou_id
  73.     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
  74.     INNER JOIN m_commision_ou D ON C.group_product_ou_id = D.group_product_ou_id
  75.     LEFT OUTER JOIN m_ext_product G ON C.product_id = G.product_id
  76.     WHERE A.tenant_id = pTenantId
  77.     AND SUBSTRING(A.doc_date, 1, 6) BETWEEN vAwalTahun AND pYearMonth
  78.     AND B.ou_parent_id = pOuId
  79.     AND NOT EXISTS (
  80.         SELECT 1 FROM i_trx_log_voided_pos F
  81.         WHERE A.tenant_id = F.tenant_id
  82.         AND A.doc_no = F.doc_no
  83.         AND A.doc_date = F.doc_date
  84.         AND A.ou_id = F.ou_id
  85.     );
  86.    
  87.     ANALYZE tr_commision_gross_profit;
  88.  
  89.     /* v329 data yang diambil dari pu_monthly_price_product diubah
  90.      * menjadi ambil dari table  
  91.      * tt_out_latest_purchasing_price_by_date menggunakan
  92.      * pu_get_latest_purchasing_price_by_date yang sebelumnya datanya dimasukkan ke
  93.      * tt_in_latest_purchasing_price_by_date */
  94.    
  95.     --Modified by Adrian, Aug 1, 2017
  96.     --monthly_price_amount di-update per year-month
  97.    
  98.     vCurrentYearMonth := vAwalTahun;
  99.    
  100.     WHILE vCurrentYearMonth <= pYearMonth LOOP
  101.    
  102.         DELETE FROM tt_in_latest_purchasing_price_by_date WHERE session_id = pSessionId;
  103.         DELETE FROM tt_out_latest_purchasing_price_by_date WHERE session_id = pSessionId;
  104.    
  105.         INSERT INTO tt_in_latest_purchasing_price_by_date(session_id, tenant_id, ou_bu_id, doc_date, product_id)
  106.             SELECT pSessionId, pTenantId, B.ou_bu_id, A.doc_date, A.product_id  
  107.         FROM tr_commision_gross_profit A
  108.             INNER JOIN m_ou_structure B ON A.ou_id = B.ou_id
  109.         WHERE A.tenant_id = pTenantId
  110.             AND A.session_id = pSessionId
  111.             AND A.year_month_date = vCurrentYearMonth
  112.         GROUP BY B.ou_bu_id, A.doc_date, A.product_id;
  113.    
  114.         SELECT TO_CHAR(now(), 'YYYYMMDDHH24MISS') INTO vDatetime;
  115.            
  116.         PERFORM pu_get_latest_purchasing_price_by_date(pSessionId, pTenantId, vCurrentYearMonth, pOuId, vDatetime, pUserId);
  117.        
  118.         ANALYZE tr_commision_gross_profit;
  119.        
  120.         UPDATE tr_commision_gross_profit B
  121.         --SET monthly_price_curr_code = A.curr_code, monthly_price_amount = ROUND(A.amount / A.qty)
  122.         SET monthly_price_curr_code = COALESCE(A.gl_purch_curr_code, B.curr_code), monthly_price_amount = COALESCE(A.gl_purch_gross_price, 0)
  123.         FROM tt_out_latest_purchasing_price_by_date A
  124.         INNER JOIN m_ou_structure C ON C.ou_bu_id = A.ou_bu_id
  125.         WHERE B.session_id = A.session_id
  126.         AND B.product_id = A.product_id
  127.         AND B.doc_date = A.doc_date
  128.         AND B.tenant_id = A.tenant_id
  129.         AND B.year_month_date = vCurrentYearMonth
  130.         AND C.ou_id = B.ou_id;
  131.        
  132.         SELECT TO_CHAR(TO_DATE(vCurrentYearMonth,'YYYYMM') + interval '1 Month','YYYYMM') INTO vCurrentYearMonth;
  133.        
  134.         DELETE FROM tt_in_latest_purchasing_price_by_date WHERE session_id = pSessionId;
  135.         DELETE FROM tt_out_latest_purchasing_price_by_date WHERE session_id = pSessionId;
  136.        
  137.     END LOOP;
  138.  
  139.     ANALYZE tr_commision_gross_profit;
  140.    
  141.     /*
  142.      * update nilai komisi jika menggunakan tipe komisi persentase
  143.      */
  144.     UPDATE tr_commision_gross_profit SET commision_amount = ROUND(nett_sell_price * commision_percentage / 100,0), commision_curr_code = curr_code
  145.     WHERE commision_type = 'PCT'
  146.     AND session_id = pSessionId;
  147.  
  148.  
  149.     /*sebelum v329
  150.      * update nilai harga beli terakhir menggunakan valuta penjualan (gunakan kurs komersial)
  151.      
  152.     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
  153.     WHERE monthly_price_curr_code <> curr_code
  154.     AND session_id = pSessionId AND monthly_price_curr_code <> '';
  155.     */
  156.     /*
  157.      * pindahkan data tahun bulan yang diminta (sudah direkap per outlet)
  158.      */
  159.     ANALYZE tr_commision_gross_profit;
  160.    
  161.     INSERT INTO tr_current_commision_gross_profit (
  162.         session_id, tenant_id, ou_id, ou_code, ou_name, curr_code,
  163.         current_sales_amount, current_commision_amount, current_monthly_price_amount, current_gross_profit
  164.     )
  165.     SELECT pSessionId, tenant_id, ou_id, ou_code, ou_name, curr_code,
  166.            SUM(nett_amount_item) AS current_sales_amount, SUM(commision_amount * qty) AS current_commision_amount, SUM(monthly_price_amount * qty) AS current_monthly_price_amount, 0
  167.     FROM tr_commision_gross_profit
  168.     WHERE session_id = pSessionId
  169.     AND year_month_date = pYearMonth
  170.     AND doc_date BETWEEN pTglAwal AND pTglAkhir
  171.     GROUP BY tenant_id, ou_id, ou_code, ou_name, curr_code;
  172.  
  173.    
  174.     /*
  175.      * pindahkan data sebelum tahun bulan yang diminta (sudah direkap per outlet)
  176.      */
  177.     INSERT INTO tr_rekap_commision_gross_profit (
  178.         session_id, tenant_id, ou_id, ou_code, ou_name, curr_code,
  179.         rekap_sales_amount, rekap_commision_amount, rekap_monthly_price_amount, rekap_gross_profit
  180.     )
  181.     SELECT pSessionId, tenant_id, ou_id, ou_code, ou_name, curr_code,
  182.            SUM(nett_amount_item) AS rekap_sales_amount, SUM(commision_amount * qty) AS rekap_commision_amount, SUM(monthly_price_amount * qty) AS rekap_monthly_price_amount, 0
  183.     FROM tr_commision_gross_profit
  184.     WHERE session_id = pSessionId
  185.     AND year_month_date <> pYearMonth
  186.     GROUP BY tenant_id, ou_id, ou_code, ou_name, curr_code;
  187.  
  188.     ANALYZE tr_current_commision_gross_profit;
  189.     /*
  190.      * update data gross profit untuk bulan yang diminta
  191.      */
  192.     UPDATE tr_current_commision_gross_profit SET current_gross_profit = current_sales_amount - current_monthly_price_amount  
  193.     WHERE session_id = pSessionId;
  194.  
  195.     ANALYZE tr_rekap_commision_gross_profit;
  196.     /*
  197.      * update data gross profit untuk sebelum bulan yang diminta
  198.      */
  199.     UPDATE tr_rekap_commision_gross_profit SET rekap_gross_profit = rekap_sales_amount - rekap_monthly_price_amount  
  200.     WHERE session_id = pSessionId;
  201.    
  202.     ANALYZE tr_current_commision_gross_profit;
  203.    
  204.     INSERT INTO tr_commision_gross_profit_for_output
  205.         (session_id, tenant_id, ou_id, ou_code, ou_name,
  206.          curr_code,
  207.          current_sales_amount, current_commision_amount, current_gross_profit,
  208.          rekap_sales_amount, rekap_commision_amount, rekap_gross_profit)
  209.     SELECT pSessionId, A.tenant_id, A.ou_id, f_get_ou_code(A.ou_id), f_get_ou_name(A.ou_id),
  210.            A.curr_code,
  211.            A.current_sales_amount, A.current_commision_amount, A.current_gross_profit,
  212.            0, 0, 0
  213.     FROM tr_current_commision_gross_profit A
  214.     WHERE A.session_id = pSessionId;
  215.    
  216.     ANALYZE tr_rekap_commision_gross_profit;
  217.    
  218.     UPDATE tr_commision_gross_profit_for_output
  219.     SET rekap_sales_amount = A.rekap_sales_amount, rekap_commision_amount = A.rekap_commision_amount, rekap_gross_profit = A.rekap_gross_profit
  220.     FROM tr_rekap_commision_gross_profit A
  221.     WHERE A.session_id = pSessionId AND tr_commision_gross_profit_for_output.ou_id = A.ou_id;
  222.    
  223.     INSERT INTO tr_commision_gross_profit_for_output
  224.         (session_id, tenant_id, ou_id, ou_code, ou_name,
  225.          curr_code,
  226.          current_sales_amount, current_commision_amount, current_gross_profit,
  227.          rekap_sales_amount, rekap_commision_amount, rekap_gross_profit)
  228.     SELECT pSessionId, A.tenant_id, A.ou_id, f_get_ou_code(A.ou_id), f_get_ou_name(A.ou_id),
  229.            A.curr_code,
  230.            0, 0, 0,
  231.            A.rekap_sales_amount, A.rekap_commision_amount, A.rekap_gross_profit
  232.     FROM tr_rekap_commision_gross_profit A
  233.     WHERE A.session_id = pSessionId
  234.     AND A.ou_id NOT IN ( SELECT B.ou_id FROM tr_commision_gross_profit_for_output B );
  235.  
  236.    
  237.     /*
  238.      * return header
  239.      */
  240.     Open pRefHeader FOR
  241.     SELECT A.fullname AS username, B.ou_name AS ou_name, pYearMonth AS year_month_date_now, vAwalTahun AS year_month_date_from, vAkhirRekap AS year_month_date_to
  242.     FROM t_user A
  243.     INNER JOIN t_ou B ON A.tenant_id = B.tenant_id
  244.     WHERE user_id = pUserId
  245.     AND ou_id = pOuId;
  246.    
  247.     RETURN NEXT pRefHeader;
  248.  
  249.     IF TRIM(pOutletName) <> vEmptyValue THEN
  250.         Open pRefDetail FOR
  251.         SELECT A.ou_id AS outlet_id, A.ou_code AS outlet_code, A.ou_name AS outlet_name,
  252.                A.curr_code AS curr_code,
  253.                A.current_sales_amount AS sales_amount_start, A.current_commision_amount AS commission_start, A.current_gross_profit AS gross_profit_start,
  254.                A.rekap_sales_amount AS sales_amount_end, A.rekap_commision_amount AS commission_end, A.rekap_gross_profit AS gross_profit_end
  255.         FROM tr_commision_gross_profit_for_output A
  256.         WHERE A.session_id = pSessionId
  257.         AND UPPER(A.ou_name) LIKE '%' || UPPER(pOutletName) || '%'
  258.         ORDER BY curr_code, outlet_name;
  259.     ELSE
  260.         Open pRefDetail FOR
  261.         SELECT A.ou_id AS outlet_id, A.ou_code AS outlet_code, A.ou_name AS outlet_name,
  262.                A.curr_code AS curr_code,
  263.                A.current_sales_amount AS sales_amount_start, A.current_commision_amount AS commission_start, A.current_gross_profit AS gross_profit_start,
  264.                A.rekap_sales_amount AS sales_amount_end, A.rekap_commision_amount AS commission_end, A.rekap_gross_profit AS gross_profit_end
  265.         FROM tr_commision_gross_profit_for_output A
  266.         WHERE A.session_id = pSessionId
  267.         ORDER BY curr_code, outlet_name;
  268.     END IF;
  269.    
  270.     RETURN NEXT pRefDetail;
  271.  
  272.     DELETE FROM tr_commision_gross_profit WHERE session_id = pSessionId;
  273.     DELETE FROM tr_current_commision_gross_profit WHERE session_id = pSessionId;
  274.     DELETE FROM tr_rekap_commision_gross_profit WHERE session_id = pSessionId;
  275.     DELETE FROM tr_commision_gross_profit_for_output WHERE session_id = pSessionId;
  276.     DELETE FROM tt_in_latest_purchasing_price_by_date WHERE session_id = pSessionId;
  277.     DELETE FROM tt_out_latest_purchasing_price_by_date WHERE session_id = pSessionId;
  278.    
  279. END;
  280. $BODY$
  281.   LANGUAGE plpgsql VOLATILE
  282.   COST 100
  283.   ROWS 1000;
  284. /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement