Advertisement
aadddrr

r_analysis_sales_gross_profit_with_monthly_average

Aug 22nd, 2017
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /**
  2.  * Adrian, Aug 18, 2017
  3.  * Report Analysis Sales Gross Profit with Monthly Average
  4.  * Dibuat berdasarkan Report Analysis Sales Gross Profit,
  5.  * tetapi harga beli diambil dari in_summary_monthly_cogs
  6.  */
  7.  
  8. CREATE OR REPLACE FUNCTION r_analysis_sales_gross_profit_with_monthly_average(character varying, bigint, character varying, bigint, character varying, character varying, character varying, bigint, character varying)
  9.   RETURNS SETOF refcursor AS
  10. $BODY$
  11. DECLARE
  12.     pRefHeader              REFCURSOR := 'refHeader';
  13.     pRefDetail              REFCURSOR := 'refDetail';
  14.     pSessionId              ALIAS FOR $1;
  15.     pTenantId               ALIAS FOR $2;
  16.     pYearMonthDate              ALIAS FOR $3;
  17.     pUserId                 ALIAS FOR $4;
  18.     pPartnerName                ALIAS FOR $5;
  19.     pTglAwal                ALIAS FOR $6;
  20.     pTglAkhir               ALIAS FOR $7;
  21.     pOuId                   ALIAS FOR $8;
  22.     pDatetime               ALIAS FOR $9;
  23.        
  24.     vEmptyValue             character varying(1);
  25.     vAwalTahun              character varying(6);
  26.     vAkhirRekap             character varying(6);
  27.     vAllId                  bigint;
  28.     vEmptyId                bigint;
  29.     vRoundingMode           character varying(5);
  30.     vValutaBuku             character varying(5);
  31.    
  32.     vCurrentYearMonth       character varying(6);
  33.     vDocTypeIdSaldoAwal     bigint;
  34.    
  35. BEGIN
  36.    
  37.     vEmptyValue := '';
  38.     vAllId := -99;
  39.     vEmptyId := -99;
  40.     vAwalTahun := SUBSTRING(pYearMonthDate, 1, 4) || '01';
  41.     vValutaBuku := 'IDR';
  42.    
  43.     vDocTypeIdSaldoAwal = -99;
  44.    
  45.     SELECT f_get_value_system_config_by_param_code(pTenantId, 'rounding.mode.non.tax') INTO vRoundingMode;
  46.    
  47.     SELECT f_get_value_system_config_by_param_code(pTenantId, 'ValutaBuku') INTO vValutaBuku;
  48.    
  49.     IF SUBSTRING(pYearMonthDate, 5, 2) = '01' THEN
  50.         vAkhirRekap := pYearMonthDate;
  51.     ELSE
  52.         vAkhirRekap := TO_CHAR(to_date(pYearMonthDate, 'YYYYMM') - interval '1 month', 'YYYYMM');
  53.     END IF;
  54.    
  55.     DELETE FROM tr_sales_gross_profit WHERE session_id = pSessionId;
  56.     DELETE FROM tr_current_sales_gross_profit WHERE session_id = pSessionId;
  57.     DELETE FROM tr_rekap_sales_gross_profit WHERE session_id = pSessionId;
  58.     DELETE FROM tr_sales_gross_profit_for_output WHERE session_id = pSessionId;
  59.    
  60.     /*
  61.      * ambil semua so balance invoice di main business unit yang tidak di do receipt
  62.      * jika transaksi itu ada item assembly ambil berdasarkan core product id nya
  63.      * ambil juga harga beli terakhir dari item itu sesuai dengan tahun bulan
  64.      * v341, kolom nett_amount_item dan nett_sell_price sudah tidak nett lagi karena sudah ditambahkan tax   
  65.      */
  66.     INSERT INTO tr_sales_gross_profit(
  67.            session_id, tenant_id, ou_id, year_month_date, partner_id, partner_code, partner_name,
  68.            doc_type_id, doc_no, doc_date,
  69.            product_id, curr_code, qty, nett_sell_price,
  70.            nett_amount_item,
  71.            monthly_price_curr_code, monthly_price_amount
  72.     )
  73.     SELECT pSessionId, A.tenant_id, E.ou_bu_id, SUBSTRING(A.ref_doc_date, 1, 6), A.partner_id, f_get_partner_code(A.partner_id), f_get_partner_name(A.partner_id),
  74.            A.ref_doc_type_id, A.ref_doc_no, A.ref_doc_date,
  75.            B.product_id, A.curr_code, A.qty_dlv_so, (A.price_so + COALESCE(D.tax_price, 0)),
  76.            SUM(A.item_amount + f_get_so_balance_invoice_tax_amount_by_unique(A.tenant_id, A.ou_id, A.partner_id, A.ref_doc_type_id, A.ref_id, A.ref_item_id, A.do_receipt_item_id)),
  77.            '', 0
  78.     FROM sl_so_balance_invoice A
  79.     INNER JOIN sl_do_item B ON A.ref_item_id = B.do_item_id
  80.     INNER JOIN sl_do C ON A.ref_doc_type_id = C.doc_type_id AND C.do_id = A.ref_id AND C.do_id = B.do_id
  81.     INNER JOIN sl_so_item D ON B.ref_id = D.so_item_id
  82.     INNER JOIN m_ou_structure E ON A.ou_id = E.ou_id
  83.     WHERE A.tenant_id = pTenantId
  84.     AND SUBSTRING(A.ref_doc_date, 1, 6) BETWEEN vAwalTahun AND pYearMonthDate
  85.     AND E.ou_bu_id = pOuId
  86.     GROUP BY A.tenant_id, E.ou_bu_id, A.ref_doc_date, A.partner_id, A.ref_doc_type_id, A.ref_doc_no, B.product_id,
  87.     A.curr_code, A.qty_dlv_so, A.price_so, D.tax_price;
  88.    
  89.     ANALYZE tr_sales_gross_profit;
  90.    
  91.     vCurrentYearMonth := vAwalTahun;
  92.    
  93.        
  94.     UPDATE tr_sales_gross_profit B
  95.     SET monthly_price_curr_code = COALESCE(A.curr_code, B.curr_code),
  96.         monthly_price_amount = (CASE WHEN COALESCE(qty_total, 0) = 0 OR COALESCE(amount_total, 0) = 0 THEN
  97.             0
  98.         ELSE
  99.             COALESCE(A.amount_total/A.qty_total, 0)
  100.         END)
  101.     FROM in_summary_monthly_cogs A
  102.     INNER JOIN m_ou_structure C ON C.ou_bu_id = A.ou_id
  103.     WHERE B.tenant_id = A.tenant_id
  104.         AND B.product_id = A.product_id
  105.         AND B.year_month_date = A.date_year_month
  106.         AND C.ou_id = B.ou_id;
  107.        
  108.     ANALYZE tr_sales_gross_profit;
  109.    
  110.     /*
  111.      * update nilai harga beli terakhir menggunakan valuta penjualan (gunakan kurs komersial)
  112.  
  113.     UPDATE tr_sales_gross_profit SET monthly_price_amount = monthly_price_amount * f_commercial_rate(tenant_id, doc_date, monthly_price_curr_code, vValutaBuku), monthly_price_curr_code = vValutaBuku
  114.     WHERE monthly_price_curr_code <> vValutaBuku
  115.     AND session_id = pSessionId AND monthly_price_curr_code <> '';   */
  116.    
  117.     UPDATE tr_sales_gross_profit SET nett_amount_item = nett_amount_item * f_commercial_rate(tenant_id, doc_date, curr_code, vValutaBuku), curr_code = vValutaBuku
  118.     WHERE curr_code <> vValutaBuku
  119.     AND session_id = pSessionId AND curr_code <> '';
  120.    
  121.     /*
  122.      * pindahkan data tahun bulan yang diminta (sudah direkap per partner)
  123.      */
  124.     INSERT INTO tr_current_sales_gross_profit (
  125.         session_id, tenant_id, ou_id, partner_id, partner_code, partner_name, curr_code,
  126.         current_sales_amount, current_monthly_price_amount, current_gross_profit
  127.     )
  128.     SELECT pSessionId, tenant_id, ou_id, partner_id, partner_code, partner_name, curr_code,
  129.            SUM(nett_amount_item) AS current_sales_amount, SUM(monthly_price_amount * qty) AS current_monthly_price_amount, 0
  130.     FROM tr_sales_gross_profit
  131.     WHERE session_id = pSessionId
  132.     AND year_month_date = pYearMonthDate
  133.     AND doc_date BETWEEN pTglAwal AND pTglAkhir
  134.     GROUP BY tenant_id, ou_id, partner_id, partner_code, partner_name, curr_code;
  135.    
  136.     ANALYZE tr_current_sales_gross_profit;
  137.    
  138.     /*
  139.      * pindahkan data sebelum tahun bulan yang diminta (sudah direkap per partner)
  140.      */
  141.     INSERT INTO tr_rekap_sales_gross_profit (
  142.         session_id, tenant_id, ou_id, partner_id, partner_code, partner_name, curr_code,
  143.         rekap_sales_amount, rekap_monthly_price_amount, rekap_gross_profit
  144.     )
  145.     SELECT pSessionId, tenant_id, ou_id, partner_id, partner_code, partner_name, curr_code,
  146.            SUM(nett_amount_item) AS rekap_sales_amount, SUM(monthly_price_amount * qty) AS rekap_monthly_price_amount, 0
  147.     FROM tr_sales_gross_profit
  148.     WHERE session_id = pSessionId
  149.     AND year_month_date <> pYearMonthDate
  150.     GROUP BY tenant_id, ou_id, partner_id, partner_code, partner_name, curr_code;
  151.    
  152.     ANALYZE tr_current_sales_gross_profit;
  153.    
  154.     /*
  155.      * update data gross profit untuk bulan yang diminta
  156.      */
  157.     UPDATE tr_current_sales_gross_profit SET current_gross_profit = current_sales_amount - current_monthly_price_amount  
  158.     WHERE session_id = pSessionId;
  159.    
  160.     ANALYZE tr_rekap_sales_gross_profit;
  161.    
  162.     /*
  163.      * update data gross profit untuk sebelum bulan yang diminta
  164.      */
  165.     UPDATE tr_rekap_sales_gross_profit SET rekap_gross_profit = rekap_sales_amount - rekap_monthly_price_amount  
  166.     WHERE session_id = pSessionId;
  167.    
  168.     ANALYZE tr_current_sales_gross_profit;
  169.    
  170.     INSERT INTO tr_sales_gross_profit_for_output
  171.         (session_id, tenant_id, ou_id, partner_id, partner_code, partner_name,
  172.          curr_code,
  173.          current_sales_amount, current_gross_profit,
  174.          rekap_sales_amount, rekap_gross_profit)
  175.     SELECT pSessionId, A.tenant_id, ou_id, A.partner_id, f_get_partner_code(A.partner_id), f_get_partner_name(A.partner_id),
  176.            A.curr_code,
  177.            A.current_sales_amount, A.current_gross_profit,
  178.            0, 0
  179.     FROM tr_current_sales_gross_profit A
  180.     WHERE A.session_id = pSessionId;
  181.    
  182.     ANALYZE tr_rekap_sales_gross_profit;
  183.    
  184.     UPDATE tr_sales_gross_profit_for_output
  185.     SET rekap_sales_amount = A.rekap_sales_amount, rekap_gross_profit = A.rekap_gross_profit
  186.     FROM tr_rekap_sales_gross_profit A
  187.     WHERE A.session_id = pSessionId AND tr_sales_gross_profit_for_output.partner_id = A.partner_id;
  188.    
  189.     ANALYZE tr_rekap_sales_gross_profit;
  190.    
  191.     INSERT INTO tr_sales_gross_profit_for_output
  192.         (session_id, tenant_id, ou_id, partner_id, partner_code, partner_name,
  193.          curr_code,
  194.          current_sales_amount, current_gross_profit,
  195.          rekap_sales_amount, rekap_gross_profit)
  196.     SELECT pSessionId, A.tenant_id, A.ou_id, A.partner_id, f_get_partner_code(A.partner_id), f_get_partner_name(A.partner_id),
  197.            A.curr_code,
  198.            0, 0,
  199.            A.rekap_sales_amount, A.rekap_gross_profit
  200.     FROM tr_rekap_sales_gross_profit A
  201.     WHERE A.session_id = pSessionId
  202.     AND A.partner_id NOT IN ( SELECT B.partner_id FROM tr_sales_gross_profit_for_output B WHERE B.session_id = pSessionId );
  203.    
  204.     ANALYZE tr_sales_gross_profit_for_output;
  205.    
  206.     /*
  207.      * return header
  208.      */
  209.     Open pRefHeader FOR
  210.     SELECT A.fullname AS username, B.ou_name AS ou_name, pYearMonthDate AS current_month_year, vAwalTahun AS start_month_year, vAkhirRekap AS end_month_year,
  211.     vValutaBuku AS valuta_buku, pDatetime AS datetime
  212.     FROM t_user A
  213.     INNER JOIN t_ou B ON A.tenant_id = B.tenant_id
  214.     WHERE user_id = pUserId
  215.     AND ou_id = pOuId;
  216.    
  217.     RETURN NEXT pRefHeader;
  218.  
  219.     IF TRIM(pPartnerName) <> vEmptyValue THEN
  220.         Open pRefDetail FOR
  221.         SELECT A.partner_id AS partner_id, A.partner_code AS partner_code, A.partner_name AS partner_name,
  222.                A.curr_code AS curr_code,
  223.                A.current_sales_amount AS current_sales, A.current_gross_profit AS current_gross_profit,
  224.                A.rekap_sales_amount AS before_sales, A.rekap_gross_profit AS before_gross_profit
  225.         FROM tr_sales_gross_profit_for_output A
  226.         WHERE A.session_id = pSessionId
  227.         AND UPPER(A.partner_name) LIKE '%' || UPPER(pPartnerName) || '%'
  228.         ORDER BY curr_code, partner_name;
  229.     ELSE
  230.         Open pRefDetail FOR
  231.         SELECT A.partner_id AS partner_id, A.partner_code AS partner_code, A.partner_name AS partner_name,
  232.                A.curr_code AS curr_code,
  233.                A.current_sales_amount AS current_sales, A.current_gross_profit AS current_gross_profit,
  234.                A.rekap_sales_amount AS before_sales, A.rekap_gross_profit AS before_gross_profit
  235.         FROM tr_sales_gross_profit_for_output A
  236.         WHERE A.session_id = pSessionId
  237.         ORDER BY curr_code, partner_name;
  238.     END IF;
  239.    
  240.     RETURN NEXT pRefDetail;
  241.  
  242.     DELETE FROM tr_sales_gross_profit WHERE session_id = pSessionId;
  243.     DELETE FROM tr_current_sales_gross_profit WHERE session_id = pSessionId;
  244.     DELETE FROM tr_rekap_sales_gross_profit WHERE session_id = pSessionId;
  245.     DELETE FROM tr_sales_gross_profit_for_output WHERE session_id = pSessionId;
  246.     DELETE FROM tt_in_latest_purchasing_price_by_date WHERE session_id = pSessionId;
  247.     DELETE FROM tt_out_latest_purchasing_price_by_date WHERE session_id = pSessionId;
  248.    
  249. END;
  250. $BODY$
  251.   LANGUAGE plpgsql VOLATILE
  252.   COST 100
  253.   ROWS 1000;
  254.   /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement