Advertisement
aadddrr

r_analysis_sales_gross_profit_with_monthly_average_ctgr_prod

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