Advertisement
aadddrr

r_analysis_sales_gross_profit_20170801_1

Aug 1st, 2017
78
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_analysis_sales_gross_profit(character varying, bigint, character varying, bigint, character varying, character varying, character varying, bigint, character varying)
  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.     pYearMonthDate              ALIAS FOR $3;
  15.     pUserId                 ALIAS FOR $4;
  16.     pPartnerName                ALIAS FOR $5;
  17.     pTglAwal                ALIAS FOR $6;
  18.     pTglAkhir               ALIAS FOR $7;
  19.     pOuId                   ALIAS FOR $8;
  20.     pDatetime               ALIAS FOR $9;
  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.     vValutaBuku             character varying(5);
  29.    
  30.     vCurrentYearMonth       character varying(6);
  31.    
  32. BEGIN
  33.    
  34.     vEmptyValue := '';
  35.     vAllId := -99;
  36.     vEmptyId := -99;
  37.     vAwalTahun := SUBSTRING(pYearMonthDate, 1, 4) || '01';
  38.     vValutaBuku := 'IDR';
  39.    
  40.     SELECT f_get_value_system_config_by_param_code(pTenantId, 'rounding.mode.non.tax') INTO vRoundingMode;
  41.    
  42.     SELECT f_get_value_system_config_by_param_code(pTenantId, 'ValutaBuku') INTO vValutaBuku;
  43.    
  44.     IF SUBSTRING(pYearMonthDate, 5, 2) = '01' THEN
  45.         vAkhirRekap := pYearMonthDate;
  46.     ELSE
  47.         vAkhirRekap := TO_CHAR(to_date(pYearMonthDate, 'YYYYMM') - interval '1 month', 'YYYYMM');
  48.     END IF;
  49.    
  50.     DELETE FROM tr_sales_gross_profit WHERE session_id = pSessionId;
  51.     DELETE FROM tr_current_sales_gross_profit WHERE session_id = pSessionId;
  52.     DELETE FROM tr_rekap_sales_gross_profit WHERE session_id = pSessionId;
  53.     DELETE FROM tr_sales_gross_profit_for_output WHERE session_id = pSessionId;
  54.    
  55.     /*
  56.      * ambil semua so balance invoice di main business unit yang tidak di do receipt
  57.      * jika transaksi itu ada item assembly ambil berdasarkan core product id nya
  58.      * ambil juga harga beli terakhir dari item itu sesuai dengan tahun bulan
  59.      * v341, kolom nett_amount_item dan nett_sell_price sudah tidak nett lagi karena sudah ditambahkan tax   
  60.      */
  61.     INSERT INTO tr_sales_gross_profit(
  62.            session_id, tenant_id, ou_id, year_month_date, partner_id, partner_code, partner_name,
  63.            doc_type_id, doc_no, doc_date,
  64.            product_id, curr_code, qty, nett_sell_price,
  65.            nett_amount_item,
  66.            monthly_price_curr_code, monthly_price_amount
  67.     )
  68.     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),
  69.            A.ref_doc_type_id, A.ref_doc_no, A.ref_doc_date,
  70.            B.product_id, A.curr_code, A.qty_dlv_so, (A.price_so + COALESCE(D.tax_price, 0)),
  71.            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)),
  72.            '', 0
  73.     FROM sl_so_balance_invoice A
  74.     INNER JOIN sl_do_item B ON A.ref_item_id = B.do_item_id
  75.     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
  76.     INNER JOIN sl_so_item D ON B.ref_id = D.so_item_id
  77.     INNER JOIN m_ou_structure E ON A.ou_id = E.ou_id
  78.     WHERE A.tenant_id = pTenantId
  79.     AND SUBSTRING(A.ref_doc_date, 1, 6) BETWEEN vAwalTahun AND pYearMonthDate
  80.     AND E.ou_bu_id = pOuId
  81.     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,
  82.     A.curr_code, A.qty_dlv_so, A.price_so, D.tax_price;
  83.    
  84.     ANALYZE tr_sales_gross_profit;
  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.     vCurrentYearMonth := vAwalTahun;
  93.    
  94.     --Modified by Adrian, Aug 1, 2017
  95.     --monthly_price_amount di-update per year-month
  96.     WHILE vCurrentYearMonth <= pYearMonthDate LOOP
  97.    
  98.         DELETE FROM tt_in_latest_purchasing_price_by_date WHERE session_id = pSessionId;
  99.         DELETE FROM tt_out_latest_purchasing_price_by_date WHERE session_id = pSessionId;
  100.    
  101.         INSERT INTO tt_in_latest_purchasing_price_by_date(session_id, tenant_id, ou_bu_id, doc_date, product_id)
  102.             SELECT pSessionId, pTenantId, B.ou_bu_id, A.doc_date, A.product_id  
  103.         FROM tr_sales_gross_profit A
  104.             INNER JOIN m_ou_structure B ON A.ou_id = B.ou_id
  105.         WHERE A.tenant_id = pTenantId
  106.             AND A.session_id = pSessionId
  107.             AND A.year_month_date = vCurrentYearMonth
  108.         GROUP BY B.ou_bu_id, A.doc_date, A.product_id;
  109.            
  110.         PERFORM pu_get_latest_purchasing_price_by_date(pSessionId, pTenantId, pYearMonthDate, pOuId, pDatetime, pUserId);
  111.        
  112.         /*sebelum v329
  113.          UPDATE tr_sales_gross_profit
  114.         --SET monthly_price_curr_code = A.curr_code, monthly_price_amount = ROUND(A.amount / A.qty)
  115.         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)
  116.         FROM pu_monthly_price_product A
  117.         WHERE tr_sales_gross_profit.session_id = pSessionId
  118.         AND tr_sales_gross_profit.product_id = A.product_id
  119.         AND tr_sales_gross_profit.year_month_date = A.year_month_date  
  120.         AND tr_sales_gross_profit.ou_id = A.ou_id;*/
  121.        
  122.         ANALYZE tt_out_latest_purchasing_price_by_date;
  123.        
  124.         UPDATE tr_sales_gross_profit B
  125.         --SET monthly_price_curr_code = A.curr_code, monthly_price_amount = ROUND(A.amount / A.qty)
  126.         SET monthly_price_curr_code = COALESCE(A.gl_purch_curr_code, B.curr_code), monthly_price_amount = COALESCE(A.gl_purch_gross_price, 0)
  127.         FROM tt_out_latest_purchasing_price_by_date A
  128.         INNER JOIN m_ou_structure C ON C.ou_bu_id = A.ou_bu_id
  129.         WHERE B.session_id = A.session_id
  130.         AND B.tenant_id = A.tenant_id
  131.         AND B.product_id = A.product_id
  132.         AND B.doc_date = A.doc_date
  133.         AND B.year_month_date = vCurrentYearMonth
  134.         AND C.ou_id = B.ou_id;
  135.        
  136.         SELECT TO_CHAR(TO_DATE(vCurrentYearMonth,'YYYYMM') + interval '1 Month','YYYYMM') INTO vCurrentYearMonth;
  137.        
  138.         DELETE FROM tt_in_latest_purchasing_price_by_date WHERE session_id = pSessionId;
  139.         DELETE FROM tt_out_latest_purchasing_price_by_date WHERE session_id = pSessionId;
  140.        
  141.     END LOOP;
  142.    
  143.     ANALYZE tr_sales_gross_profit;
  144.    
  145.     /*
  146.      * update nilai harga beli terakhir menggunakan valuta penjualan (gunakan kurs komersial)
  147.  
  148.     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
  149.     WHERE monthly_price_curr_code <> vValutaBuku
  150.     AND session_id = pSessionId AND monthly_price_curr_code <> '';   */
  151.    
  152.     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
  153.     WHERE curr_code <> vValutaBuku
  154.     AND session_id = pSessionId AND curr_code <> '';
  155.    
  156.     /*
  157.      * pindahkan data tahun bulan yang diminta (sudah direkap per partner)
  158.      */
  159.     INSERT INTO tr_current_sales_gross_profit (
  160.         session_id, tenant_id, ou_id, partner_id, partner_code, partner_name, curr_code,
  161.         current_sales_amount, current_monthly_price_amount, current_gross_profit
  162.     )
  163.     SELECT pSessionId, tenant_id, ou_id, partner_id, partner_code, partner_name, curr_code,
  164.            SUM(nett_amount_item) AS current_sales_amount, SUM(monthly_price_amount * qty) AS current_monthly_price_amount, 0
  165.     FROM tr_sales_gross_profit
  166.     WHERE session_id = pSessionId
  167.     AND year_month_date = pYearMonthDate
  168.     AND doc_date BETWEEN pTglAwal AND pTglAkhir
  169.     GROUP BY tenant_id, ou_id, partner_id, partner_code, partner_name, curr_code;
  170.    
  171.     ANALYZE tr_current_sales_gross_profit;
  172.    
  173.     /*
  174.      * pindahkan data sebelum tahun bulan yang diminta (sudah direkap per partner)
  175.      */
  176.     INSERT INTO tr_rekap_sales_gross_profit (
  177.         session_id, tenant_id, ou_id, partner_id, partner_code, partner_name, curr_code,
  178.         rekap_sales_amount, rekap_monthly_price_amount, rekap_gross_profit
  179.     )
  180.     SELECT pSessionId, tenant_id, ou_id, partner_id, partner_code, partner_name, curr_code,
  181.            SUM(nett_amount_item) AS rekap_sales_amount, SUM(monthly_price_amount * qty) AS rekap_monthly_price_amount, 0
  182.     FROM tr_sales_gross_profit
  183.     WHERE session_id = pSessionId
  184.     AND year_month_date <> pYearMonthDate
  185.     GROUP BY tenant_id, ou_id, partner_id, partner_code, partner_name, curr_code;
  186.    
  187.     ANALYZE tr_current_sales_gross_profit;
  188.    
  189.     /*
  190.      * update data gross profit untuk bulan yang diminta
  191.      */
  192.     UPDATE tr_current_sales_gross_profit SET current_gross_profit = current_sales_amount - current_monthly_price_amount  
  193.     WHERE session_id = pSessionId;
  194.    
  195.     ANALYZE tr_rekap_sales_gross_profit;
  196.    
  197.     /*
  198.      * update data gross profit untuk sebelum bulan yang diminta
  199.      */
  200.     UPDATE tr_rekap_sales_gross_profit SET rekap_gross_profit = rekap_sales_amount - rekap_monthly_price_amount  
  201.     WHERE session_id = pSessionId;
  202.    
  203.     ANALYZE tr_current_sales_gross_profit;
  204.    
  205.     INSERT INTO tr_sales_gross_profit_for_output
  206.         (session_id, tenant_id, ou_id, partner_id, partner_code, partner_name,
  207.          curr_code,
  208.          current_sales_amount, current_gross_profit,
  209.          rekap_sales_amount, rekap_gross_profit)
  210.     SELECT pSessionId, A.tenant_id, ou_id, A.partner_id, f_get_partner_code(A.partner_id), f_get_partner_name(A.partner_id),
  211.            A.curr_code,
  212.            A.current_sales_amount, A.current_gross_profit,
  213.            0, 0
  214.     FROM tr_current_sales_gross_profit A
  215.     WHERE A.session_id = pSessionId;
  216.    
  217.     ANALYZE tr_rekap_sales_gross_profit;
  218.    
  219.     UPDATE tr_sales_gross_profit_for_output
  220.     SET rekap_sales_amount = A.rekap_sales_amount, rekap_gross_profit = A.rekap_gross_profit
  221.     FROM tr_rekap_sales_gross_profit A
  222.     WHERE A.session_id = pSessionId AND tr_sales_gross_profit_for_output.partner_id = A.partner_id;
  223.    
  224.     ANALYZE tr_rekap_sales_gross_profit;
  225.    
  226.     INSERT INTO tr_sales_gross_profit_for_output
  227.         (session_id, tenant_id, ou_id, partner_id, partner_code, partner_name,
  228.          curr_code,
  229.          current_sales_amount, current_gross_profit,
  230.          rekap_sales_amount, rekap_gross_profit)
  231.     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),
  232.            A.curr_code,
  233.            0, 0,
  234.            A.rekap_sales_amount, A.rekap_gross_profit
  235.     FROM tr_rekap_sales_gross_profit A
  236.     WHERE A.session_id = pSessionId
  237.     AND A.partner_id NOT IN ( SELECT B.partner_id FROM tr_sales_gross_profit_for_output B WHERE B.session_id = pSessionId );
  238.    
  239.     ANALYZE tr_sales_gross_profit_for_output;
  240.    
  241.     /*
  242.      * return header
  243.      */
  244.     Open pRefHeader FOR
  245.     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,
  246.     vValutaBuku AS valuta_buku, pDatetime AS datetime
  247.     FROM t_user A
  248.     INNER JOIN t_ou B ON A.tenant_id = B.tenant_id
  249.     WHERE user_id = pUserId
  250.     AND ou_id = pOuId;
  251.    
  252.     RETURN NEXT pRefHeader;
  253.  
  254.     IF TRIM(pPartnerName) <> vEmptyValue THEN
  255.         Open pRefDetail FOR
  256.         SELECT A.partner_id AS partner_id, A.partner_code AS partner_code, A.partner_name AS partner_name,
  257.                A.curr_code AS curr_code,
  258.                A.current_sales_amount AS current_sales, A.current_gross_profit AS current_gross_profit,
  259.                A.rekap_sales_amount AS before_sales, A.rekap_gross_profit AS before_gross_profit
  260.         FROM tr_sales_gross_profit_for_output A
  261.         WHERE A.session_id = pSessionId
  262.         AND UPPER(A.partner_name) LIKE '%' || UPPER(pPartnerName) || '%'
  263.         ORDER BY curr_code, partner_name;
  264.     ELSE
  265.         Open pRefDetail FOR
  266.         SELECT A.partner_id AS partner_id, A.partner_code AS partner_code, A.partner_name AS partner_name,
  267.                A.curr_code AS curr_code,
  268.                A.current_sales_amount AS current_sales, A.current_gross_profit AS current_gross_profit,
  269.                A.rekap_sales_amount AS before_sales, A.rekap_gross_profit AS before_gross_profit
  270.         FROM tr_sales_gross_profit_for_output A
  271.         WHERE A.session_id = pSessionId
  272.         ORDER BY curr_code, partner_name;
  273.     END IF;
  274.    
  275.     RETURN NEXT pRefDetail;
  276.  
  277.     DELETE FROM tr_sales_gross_profit WHERE session_id = pSessionId;
  278.     DELETE FROM tr_current_sales_gross_profit WHERE session_id = pSessionId;
  279.     DELETE FROM tr_rekap_sales_gross_profit WHERE session_id = pSessionId;
  280.     DELETE FROM tr_sales_gross_profit_for_output WHERE session_id = pSessionId;
  281.     DELETE FROM tt_in_latest_purchasing_price_by_date WHERE session_id = pSessionId;
  282.     DELETE FROM tt_out_latest_purchasing_price_by_date WHERE session_id = pSessionId;
  283.    
  284. END;
  285. $BODY$
  286.   LANGUAGE plpgsql VOLATILE
  287.   COST 100
  288.   ROWS 1000;
  289.   /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement