Advertisement
aadddrr

r_analysis_sales_gross_profit

Apr 24th, 2017
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. CREATE OR REPLACE FUNCTION r_analysis_sales_gross_profit(character varying, bigint, character varying, bigint, character varying, character varying, character varying, bigint, character varying)
  2.   RETURNS SETOF refcursor AS
  3. $BODY$
  4. DECLARE
  5.     pRefHeader              REFCURSOR := 'refHeader';
  6.     pRefDetail              REFCURSOR := 'refDetail';
  7.     pSessionId              ALIAS FOR $1;
  8.     pTenantId               ALIAS FOR $2;
  9.     pYearMonthDate              ALIAS FOR $3;
  10.     pUserId                 ALIAS FOR $4;
  11.     pPartnerName                ALIAS FOR $5;
  12.     pTglAwal                ALIAS FOR $6;
  13.     pTglAkhir               ALIAS FOR $7;
  14.     pOuId                   ALIAS FOR $8;
  15.     pDatetime               ALIAS FOR $9;
  16.        
  17.     vEmptyValue             character varying(1);
  18.     vAwalTahun              character varying(6);
  19.     vAkhirRekap             character varying(6);
  20.     vAllId                  bigint;
  21.     vEmptyId                bigint;
  22.     vRoundingMode           character varying(5);
  23.     vValutaBuku             character varying(5);
  24.    
  25.     vCurrentTotalSalesAmount        numeric;
  26.     vRekapTotalSalesAmount          numeric;
  27.     vCurrentTotalProfit             numeric;
  28.     vRekapTotalProfit               numeric;
  29.    
  30. BEGIN
  31.    
  32.     vEmptyValue := '';
  33.     vAllId := -99;
  34.     vEmptyId := -99;
  35.     vAwalTahun := SUBSTRING(pYearMonthDate, 1, 4) || '01';
  36.     vValutaBuku := 'IDR';
  37.    
  38.     SELECT f_get_value_system_config_by_param_code(pTenantId, 'rounding.mode.non.tax') INTO vRoundingMode;
  39.    
  40.     SELECT f_get_value_system_config_by_param_code(pTenantId, 'ValutaBuku') INTO vValutaBuku;
  41.    
  42.     --IF SUBSTRING(pYearMonthDate, 5, 2) = '01' THEN
  43.         vAkhirRekap := pYearMonthDate;
  44.     /*ELSE
  45.         vAkhirRekap := TO_CHAR(to_date(pYearMonthDate, 'YYYYMM') - interval '1 month', 'YYYYMM');
  46.     END IF;*/
  47.    
  48.     DELETE FROM tr_sales_gross_profit WHERE session_id = pSessionId;
  49.     DELETE FROM tr_current_sales_gross_profit WHERE session_id = pSessionId;
  50.     DELETE FROM tr_rekap_sales_gross_profit WHERE session_id = pSessionId;
  51.     DELETE FROM tr_sales_gross_profit_for_output WHERE session_id = pSessionId;
  52.    
  53.     /*
  54.      * ambil semua so balance invoice di main business unit yang tidak di do receipt
  55.      * jika transaksi itu ada item assembly ambil berdasarkan core product id nya
  56.      * ambil juga harga beli terakhir dari item itu sesuai dengan tahun bulan
  57.      * v341, kolom nett_amount_item dan nett_sell_price sudah tidak nett lagi karena sudah ditambahkan tax   
  58.      */
  59.     INSERT INTO tr_sales_gross_profit(
  60.            session_id, tenant_id, ou_id, year_month_date, partner_id, partner_code, partner_name,
  61.            doc_type_id, doc_no, doc_date,
  62.            product_id, curr_code, qty, nett_sell_price,
  63.            nett_amount_item,
  64.            monthly_price_curr_code, monthly_price_amount
  65.     )
  66.     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),
  67.            A.ref_doc_type_id, A.ref_doc_no, A.ref_doc_date,
  68.            B.product_id, A.curr_code, A.qty_dlv_so, (A.price_so + COALESCE(D.tax_price, 0)),
  69.            SUM(A.item_amount),
  70.            '', 0
  71.     FROM sl_so_balance_invoice A
  72.     INNER JOIN sl_do_item B ON A.ref_item_id = B.do_item_id
  73.     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
  74.     INNER JOIN sl_so_item D ON B.ref_id = D.so_item_id
  75.     INNER JOIN m_ou_structure E ON A.ou_id = E.ou_id
  76.     WHERE A.tenant_id = pTenantId
  77.     AND SUBSTRING(A.ref_doc_date, 1, 6) BETWEEN vAwalTahun AND pYearMonthDate
  78.     AND E.ou_bu_id = pOuId
  79.     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,
  80.     A.curr_code, A.qty_dlv_so, A.price_so, D.tax_price;
  81.    
  82.     ANALYZE tr_sales_gross_profit;
  83.    
  84.     /* v329 data yang diambil dari pu_monthly_price_product diubah
  85.      * menjadi ambil dari table  
  86.      * tt_out_latest_purchasing_price_by_date menggunakan
  87.      * pu_get_latest_purchasing_price_by_date yang sebelumnya datanya dimasukkan ke
  88.      * tt_in_latest_purchasing_price_by_date */
  89.    
  90.     INSERT INTO tt_in_latest_purchasing_price_by_date(session_id, tenant_id, ou_bu_id, doc_date, product_id)
  91.         SELECT pSessionId, pTenantId, B.ou_bu_id, A.doc_date, A.product_id  
  92.     FROM tr_sales_gross_profit A
  93.         INNER JOIN m_ou_structure B ON A.ou_id = B.ou_id
  94.     WHERE A.tenant_id = pTenantId
  95.         AND A.session_id = pSessionId
  96.     GROUP BY B.ou_bu_id, A.doc_date, A.product_id;
  97.        
  98.     --PERFORM pu_get_latest_purchasing_price_by_date(pSessionId, pTenantId, pYearMonthDate, pOuId, pDatetime, pUserId);
  99.    
  100.     /*sebelum v329
  101.      UPDATE tr_sales_gross_profit
  102.     --SET monthly_price_curr_code = A.curr_code, monthly_price_amount = ROUND(A.amount / A.qty)
  103.     SET monthly_price_curr_code = COALESCE(A.curr_code, tr_sales_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)
  104.     FROM pu_monthly_price_product A
  105.     WHERE tr_sales_gross_profit.session_id = pSessionId
  106.     AND tr_sales_gross_profit.product_id = A.product_id
  107.     AND tr_sales_gross_profit.year_month_date = A.year_month_date  
  108.     AND tr_sales_gross_profit.ou_id = A.ou_id;*/
  109.    
  110.     ANALYZE tt_out_latest_purchasing_price_by_date;
  111.    
  112.     UPDATE tr_sales_gross_profit B
  113.     --SET monthly_price_curr_code = A.curr_code, monthly_price_amount = ROUND(A.amount / A.qty)
  114.     SET monthly_price_curr_code = COALESCE(A.gl_curr_code, B.curr_code), monthly_price_amount = COALESCE(A.gl_amount / A.qty, 0)
  115.     FROM in_summary_monthly_amount A
  116.     INNER JOIN m_ou_structure C ON C.ou_bu_id = A.ou_bu_id
  117.     WHERE B.tenant_id = A.tenant_id
  118.     AND B.product_id = A.product_id
  119.     AND SUBSTRING(B.doc_date,1,6) = A.date_year_month
  120.     AND C.ou_id = B.ou_id
  121.     AND A.doc_type_id = B.doc_type_id;
  122.    
  123.     ANALYZE tr_sales_gross_profit;
  124.    
  125.     /*
  126.      * update nilai harga beli terakhir menggunakan valuta penjualan (gunakan kurs komersial)
  127.  
  128.     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
  129.     WHERE monthly_price_curr_code <> vValutaBuku
  130.     AND session_id = pSessionId AND monthly_price_curr_code <> '';   */
  131.    
  132.     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
  133.     WHERE curr_code <> vValutaBuku
  134.     AND session_id = pSessionId AND curr_code <> '';
  135.    
  136.     /*
  137.      * pindahkan data tahun bulan yang diminta (sudah direkap per partner)
  138.      */
  139.     INSERT INTO tr_current_sales_gross_profit (
  140.         session_id, tenant_id, ou_id, partner_id, partner_code, partner_name, curr_code,
  141.         current_sales_amount, current_monthly_price_amount, current_gross_profit
  142.     )
  143.     SELECT pSessionId, tenant_id, ou_id, partner_id, partner_code, partner_name, curr_code,
  144.            SUM(nett_amount_item) AS current_sales_amount, SUM(monthly_price_amount * qty) AS current_monthly_price_amount, 0
  145.     FROM tr_sales_gross_profit
  146.     WHERE session_id = pSessionId
  147.     AND year_month_date = pYearMonthDate
  148.     AND doc_date BETWEEN pTglAwal AND pTglAkhir
  149.     GROUP BY tenant_id, ou_id, partner_id, partner_code, partner_name, curr_code;
  150.    
  151.     ANALYZE tr_current_sales_gross_profit;
  152.    
  153.     /*
  154.      * pindahkan data sebelum tahun bulan yang diminta (sudah direkap per partner)
  155.      */
  156.     INSERT INTO tr_rekap_sales_gross_profit (
  157.         session_id, tenant_id, ou_id, partner_id, partner_code, partner_name, curr_code,
  158.         rekap_sales_amount, rekap_monthly_price_amount, rekap_gross_profit
  159.     )
  160.     SELECT pSessionId, tenant_id, ou_id, partner_id, partner_code, partner_name, curr_code,
  161.            SUM(nett_amount_item) AS rekap_sales_amount, SUM(monthly_price_amount * qty) AS rekap_monthly_price_amount, 0
  162.     FROM tr_sales_gross_profit
  163.     WHERE session_id = pSessionId
  164.     --AND year_month_date <> pYearMonthDate
  165.     AND doc_date <= pTglAkhir
  166.     GROUP BY tenant_id, ou_id, partner_id, partner_code, partner_name, curr_code;
  167.    
  168.     ANALYZE tr_current_sales_gross_profit;
  169.    
  170.     /*
  171.      * update data gross profit untuk bulan yang diminta
  172.      */
  173.     UPDATE tr_current_sales_gross_profit SET current_gross_profit = current_sales_amount - current_monthly_price_amount  
  174.     WHERE session_id = pSessionId;
  175.    
  176.     ANALYZE tr_rekap_sales_gross_profit;
  177.    
  178.     /*
  179.      * update data gross profit untuk sebelum bulan yang diminta
  180.      */
  181.     UPDATE tr_rekap_sales_gross_profit SET rekap_gross_profit = rekap_sales_amount - rekap_monthly_price_amount  
  182.     WHERE session_id = pSessionId;
  183.    
  184.     ANALYZE tr_current_sales_gross_profit;
  185.    
  186.     INSERT INTO tr_sales_gross_profit_for_output
  187.         (session_id, tenant_id, ou_id, partner_id, partner_code, partner_name,
  188.          curr_code,
  189.          current_sales_amount, current_gross_profit,
  190.          rekap_sales_amount, rekap_gross_profit)
  191.     SELECT pSessionId, A.tenant_id, ou_id, A.partner_id, f_get_partner_code(A.partner_id), f_get_partner_name(A.partner_id),
  192.            A.curr_code,
  193.            A.current_sales_amount, A.current_gross_profit,
  194.            0, 0
  195.     FROM tr_current_sales_gross_profit A
  196.     WHERE A.session_id = pSessionId;
  197.    
  198.     ANALYZE tr_rekap_sales_gross_profit;
  199.    
  200.     UPDATE tr_sales_gross_profit_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 A
  203.     WHERE A.session_id = pSessionId AND tr_sales_gross_profit_for_output.partner_id = A.partner_id;
  204.    
  205.     ANALYZE tr_rekap_sales_gross_profit;
  206.    
  207.     INSERT INTO tr_sales_gross_profit_for_output
  208.         (session_id, tenant_id, ou_id, partner_id, partner_code, partner_name,
  209.          curr_code,
  210.          current_sales_amount, current_gross_profit,
  211.          rekap_sales_amount, rekap_gross_profit)
  212.     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),
  213.            A.curr_code,
  214.            0, 0,
  215.            A.rekap_sales_amount, A.rekap_gross_profit
  216.     FROM tr_rekap_sales_gross_profit A
  217.     WHERE A.session_id = pSessionId
  218.     AND A.partner_id NOT IN ( SELECT B.partner_id FROM tr_sales_gross_profit_for_output B WHERE B.session_id = pSessionId );
  219.    
  220.     ANALYZE tr_sales_gross_profit_for_output;
  221.  
  222.     IF TRIM(pPartnerName) <> vEmptyValue THEN
  223.    
  224.         SELECT SUM(A.current_sales_amount), SUM(A.rekap_sales_amount), SUM(A.current_gross_profit), SUM(A.rekap_gross_profit)
  225.         INTO vCurrentTotalSalesAmount, vRekapTotalSalesAmount, vCurrentTotalProfit, vRekapTotalProfit
  226.         FROM tr_sales_gross_profit_for_output A
  227.         WHERE A.session_id = pSessionId
  228.             AND UPPER(A.partner_name) LIKE '%' || UPPER(pPartnerName) || '%';
  229.            
  230.     ELSE
  231.    
  232.         SELECT SUM(A.current_sales_amount), SUM(A.rekap_sales_amount), SUM(A.current_gross_profit), SUM(A.rekap_gross_profit)
  233.         INTO vCurrentTotalSalesAmount, vRekapTotalSalesAmount, vCurrentTotalProfit, vRekapTotalProfit
  234.         FROM tr_sales_gross_profit_for_output A
  235.         WHERE A.session_id = pSessionId;
  236.    
  237.     END IF;
  238.    
  239.        
  240.     /*
  241.      * return header
  242.      */
  243.     Open pRefHeader FOR
  244.     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,
  245.     vValutaBuku AS valuta_buku, pDatetime AS datetime,
  246.     vCurrentTotalSalesAmount AS current_total_sales_amount, vRekapTotalSalesAmount AS rekap_total_sales_amount,
  247.     vCurrentTotalProfit AS current_total_profit, vRekapTotalProfit AS rekap_total_profit
  248.     FROM t_user A
  249.     INNER JOIN t_ou B ON A.tenant_id = B.tenant_id
  250.     WHERE user_id = pUserId
  251.     AND ou_id = pOuId;
  252.    
  253.     RETURN NEXT pRefHeader;
  254.    
  255.    
  256.    
  257.     IF TRIM(pPartnerName) <> vEmptyValue THEN
  258.    
  259.         Open pRefDetail FOR
  260.         SELECT A.partner_id AS partner_id, A.partner_code AS partner_code, A.partner_name AS partner_name,
  261.                A.curr_code AS curr_code,
  262.                A.current_sales_amount AS current_sales, A.current_gross_profit AS current_gross_profit,
  263.                A.rekap_sales_amount AS before_sales, A.rekap_gross_profit AS before_gross_profit,
  264.                CASE WHEN A.current_sales_amount = 0
  265.                 THEN 0
  266.                 ELSE (A.current_gross_profit / A.current_sales_amount)
  267.                END AS current_profit_percentage,
  268.                CASE WHEN vCurrentTotalSalesAmount = 0
  269.                 THEN 0
  270.                 ELSE (A.current_sales_amount / vCurrentTotalSalesAmount)
  271.                END AS current_sales_contribution_percentage,
  272.                CASE WHEN vCurrentTotalProfit = 0
  273.                 THEN 0
  274.                 ELSE (A.current_gross_profit / vCurrentTotalProfit)
  275.                END AS current_profit_contribution_percentage,
  276.                CASE WHEN A.rekap_sales_amount = 0
  277.                 THEN 0
  278.                 ELSE (A.rekap_gross_profit / A.rekap_sales_amount)
  279.                END AS before_profit_percentage,
  280.                CASE WHEN vRekapTotalSalesAmount = 0
  281.                 THEN 0
  282.                 ELSE (A.rekap_sales_amount / vRekapTotalSalesAmount)
  283.                END AS before_sales_contribution_percentage,
  284.                CASE WHEN vRekapTotalProfit = 0
  285.                 THEN 0
  286.                 ELSE (A.rekap_gross_profit / vRekapTotalProfit)
  287.                END AS before_profit_contribution_percentage
  288.         FROM tr_sales_gross_profit_for_output A
  289.         WHERE A.session_id = pSessionId
  290.         AND UPPER(A.partner_name) LIKE '%' || UPPER(pPartnerName) || '%'
  291.         ORDER BY curr_code, partner_name;
  292.     ELSE
  293.    
  294.         Open pRefDetail FOR
  295.         SELECT A.partner_id AS partner_id, A.partner_code AS partner_code, A.partner_name AS partner_name,
  296.                A.curr_code AS curr_code,
  297.                A.current_sales_amount AS current_sales, A.current_gross_profit AS current_gross_profit,
  298.                A.rekap_sales_amount AS before_sales, A.rekap_gross_profit AS before_gross_profit,
  299.                CASE WHEN A.current_sales_amount = 0
  300.                 THEN 0
  301.                 ELSE (A.current_gross_profit / A.current_sales_amount)
  302.                END AS current_profit_percentage,
  303.                CASE WHEN vCurrentTotalSalesAmount = 0
  304.                 THEN 0
  305.                 ELSE (A.current_sales_amount / vCurrentTotalSalesAmount)
  306.                END AS current_sales_contribution_percentage,
  307.                CASE WHEN vCurrentTotalProfit = 0
  308.                 THEN 0
  309.                 ELSE (A.current_gross_profit / vCurrentTotalProfit)
  310.                END AS current_profit_contribution_percentage,
  311.                CASE WHEN A.rekap_sales_amount = 0
  312.                 THEN 0
  313.                 ELSE (A.rekap_gross_profit / A.rekap_sales_amount)
  314.                END AS before_profit_percentage,
  315.                CASE WHEN vRekapTotalSalesAmount = 0
  316.                 THEN 0
  317.                 ELSE (A.rekap_sales_amount / vRekapTotalSalesAmount)
  318.                END AS before_sales_contribution_percentage,
  319.                CASE WHEN vRekapTotalProfit = 0
  320.                 THEN 0
  321.                 ELSE (A.rekap_gross_profit / vRekapTotalProfit)
  322.                END AS before_profit_contribution_percentage
  323.         FROM tr_sales_gross_profit_for_output A
  324.         WHERE A.session_id = pSessionId
  325.         ORDER BY curr_code, partner_name;
  326.     END IF;
  327.    
  328.     RETURN NEXT pRefDetail;
  329.    
  330.    
  331.  
  332.     DELETE FROM tr_sales_gross_profit WHERE session_id = pSessionId;
  333.     DELETE FROM tr_current_sales_gross_profit WHERE session_id = pSessionId;
  334.     DELETE FROM tr_rekap_sales_gross_profit WHERE session_id = pSessionId;
  335.     DELETE FROM tr_sales_gross_profit_for_output WHERE session_id = pSessionId;
  336.     DELETE FROM tt_in_latest_purchasing_price_by_date WHERE session_id = pSessionId;
  337.     DELETE FROM tt_out_latest_purchasing_price_by_date WHERE session_id = pSessionId;
  338.    
  339. END;
  340. $BODY$
  341.   LANGUAGE plpgsql VOLATILE
  342.   COST 100
  343.   ROWS 1000;
  344.   /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement