Advertisement
aadddrr

r_monthly_omzet_by_customer

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