Advertisement
aadddrr

r_analysis_sales_nett_profit_with_monthly_average_20170912

Sep 11th, 2017
121
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.  * harga jual yang diambil adalah harga nett,
  7.  * akhir rekap adalah bulan yang dipilih,
  8.  * semua transaksi diambil dari sl_so_balance_invoice,
  9.  * dan hanya bisa memilih periode tanpa tanggal awal dan akhir
  10.  */
  11.  
  12. CREATE OR REPLACE FUNCTION r_analysis_sales_nett_profit_with_monthly_average(character varying, bigint, character varying, bigint, character varying, bigint, character varying)
  13.   RETURNS SETOF refcursor AS
  14. $BODY$
  15. DECLARE
  16.     pRefHeader              REFCURSOR := 'refHeader';
  17.     pRefDetail              REFCURSOR := 'refDetail';
  18.     pSessionId              ALIAS FOR $1;
  19.     pTenantId               ALIAS FOR $2;
  20.     pYearMonthDate          ALIAS FOR $3;
  21.     pUserId                 ALIAS FOR $4;
  22.     pPartnerName            ALIAS FOR $5;
  23.     pOuId                   ALIAS FOR $6;
  24.     pDatetime               ALIAS FOR $7;
  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.     vTotalCurrentProfitPercentage   numeric;
  35.     vTotalBeforeProfitPercentage    numeric;
  36.    
  37.     vPartnerIdMagento       bigint;
  38.     vFlagYes                character varying(1);
  39.    
  40. BEGIN
  41.    
  42.     vEmptyValue := '';
  43.     vAllId := -99;
  44.     vEmptyId := -99;
  45.     vAwalTahun := SUBSTRING(pYearMonthDate, 1, 4) || '01';
  46.     vValutaBuku := 'IDR';
  47.    
  48.     vPartnerIdMagento := 33586;
  49.     vFlagYes := 'Y';
  50.    
  51.     SELECT f_get_value_system_config_by_param_code(pTenantId, 'rounding.mode.non.tax') INTO vRoundingMode;
  52.    
  53.     SELECT f_get_value_system_config_by_param_code(pTenantId, 'ValutaBuku') INTO vValutaBuku;
  54.    
  55.     vAkhirRekap := pYearMonthDate;
  56.    
  57.     DELETE FROM tr_sales_gross_profit WHERE session_id = pSessionId;
  58.     DELETE FROM tr_current_sales_gross_profit WHERE session_id = pSessionId;
  59.     DELETE FROM tr_rekap_sales_gross_profit WHERE session_id = pSessionId;
  60.     DELETE FROM tr_sales_gross_profit_for_output WHERE session_id = pSessionId;
  61.    
  62.     /*
  63.      * ambil semua so balance invoice di main business unit
  64.      * jika transaksi itu ada item assembly ambil berdasarkan core product id nya
  65.      * ambil juga harga beli terakhir dari item itu sesuai dengan tahun bulan    
  66.      */
  67.    
  68.     --DELIVERY ORDER dan DO RECEIPT
  69.     INSERT INTO tr_sales_gross_profit(
  70.            session_id, tenant_id, ou_id, year_month_date, partner_id, partner_code, partner_name,
  71.            doc_type_id, doc_no, doc_date,
  72.            product_id, curr_code, qty, nett_sell_price,
  73.            nett_amount_item,
  74.            monthly_price_curr_code, monthly_price_amount
  75.     )
  76.     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),
  77.            A.ref_doc_type_id, A.ref_doc_no, A.ref_doc_date,
  78.            B.product_id, A.curr_code, A.qty_dlv_so, A.price_so,
  79.             SUM(
  80.                 CASE WHEN A.partner_id = vPartnerIdMagento THEN
  81.                     COALESCE (
  82.                         f_get_amount_before_tax(A.item_amount, vFlagYes, H.tax_percentage, f_get_digit_decimal_doc_curr(A.ref_doc_type_id, A.curr_code), vRoundingMode),
  83.                         A.item_amount
  84.                     )
  85.                 ELSE
  86.                     A.item_amount
  87.                 END
  88.             ),
  89.            A.curr_code, 0
  90.     FROM sl_so_balance_invoice A
  91.     INNER JOIN sl_do_item B ON A.ref_item_id = B.do_item_id
  92.     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
  93.     INNER JOIN sl_so_item D ON B.ref_id = D.so_item_id
  94.     INNER JOIN m_ou_structure E ON A.ou_id = E.ou_id
  95.     INNER JOIN sl_invoice G ON G.ref_id = A.so_id
  96.     LEFT JOIN sl_invoice_tax H ON H.invoice_id = G.invoice_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.    
  103.     ANALYZE tr_sales_gross_profit; 
  104.    
  105.     --RETURN NOTE
  106.     INSERT INTO tr_sales_gross_profit(
  107.            session_id, tenant_id, ou_id, year_month_date, partner_id, partner_code, partner_name,
  108.            doc_type_id, doc_no, doc_date,
  109.            product_id, curr_code, qty, nett_sell_price,
  110.            nett_amount_item,
  111.            monthly_price_curr_code, monthly_price_amount
  112.     )
  113.     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),
  114.            A.ref_doc_type_id, A.ref_doc_no, A.ref_doc_date,
  115.            B.product_id, A.curr_code, A.qty_dlv_so * -1, A.price_so,
  116.            SUM(A.item_amount) * -1,
  117.            A.curr_code, 0
  118.     FROM sl_so_balance_invoice A
  119.     INNER JOIN in_inventory_item B ON A.ref_item_id = B.ref_item_id
  120.     INNER JOIN in_inventory C ON A.ref_doc_type_id = C.doc_type_id AND C.inventory_id = A.ref_id AND C.inventory_id = B.inventory_id
  121.     INNER JOIN in_balance_do_item F ON B.ref_item_id = F.do_item_id
  122.     INNER JOIN sl_so_item D ON F.so_item_id = D.so_item_id
  123.     INNER JOIN m_ou_structure E ON A.ou_id = E.ou_id
  124.     WHERE A.tenant_id = pTenantId
  125.     AND SUBSTRING(A.ref_doc_date, 1, 6) BETWEEN vAwalTahun AND pYearMonthDate
  126.     AND E.ou_bu_id = pOuId
  127.     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,
  128.     A.curr_code, A.qty_dlv_so, A.price_so, D.tax_price;
  129.    
  130.     ANALYZE tr_sales_gross_profit;
  131.        
  132.     --Update harga beli dari in_summary_monthly_cogs
  133.     UPDATE tr_sales_gross_profit B
  134.     SET monthly_price_curr_code = COALESCE(A.curr_code, B.curr_code),
  135.         monthly_price_amount = (CASE WHEN COALESCE(qty_total, 0) = 0 OR COALESCE(amount_total, 0) = 0 THEN
  136.             0
  137.         ELSE
  138.             COALESCE(A.amount_total/A.qty_total, 0)
  139.         END)
  140.     FROM in_summary_monthly_cogs A
  141.     INNER JOIN m_ou_structure C ON C.ou_bu_id = A.ou_id
  142.     WHERE B.tenant_id = A.tenant_id
  143.         AND B.product_id = A.product_id
  144.         AND B.year_month_date = A.date_year_month
  145.         AND C.ou_id = B.ou_id;
  146.        
  147.     ANALYZE tr_sales_gross_profit;
  148.    
  149.     /*
  150.      * update nilai harga beli terakhir menggunakan valuta penjualan (gunakan kurs komersial)
  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.     SELECT CASE
  242.                 WHEN SUM(A.current_sales_amount) = 0 THEN 0
  243.                 ELSE COALESCE (SUM(A.current_gross_profit)/SUM(A.current_sales_amount), 0)
  244.            END,
  245.            CASE
  246.                 WHEN SUM(A.rekap_sales_amount) = 0 THEN 0
  247.                 ELSE COALESCE (SUM(A.rekap_gross_profit)/SUM(A.rekap_sales_amount), 0)
  248.            END
  249.     FROM tr_sales_gross_profit_for_output A
  250.     INTO vTotalCurrentProfitPercentage, vTotalBeforeProfitPercentage;
  251.    
  252.     ANALYZE tr_sales_gross_profit_for_output;
  253.    
  254.     /*
  255.      * return header
  256.      */
  257.     Open pRefHeader FOR
  258.     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,
  259.     vValutaBuku AS valuta_buku, pDatetime AS datetime,
  260.     vTotalCurrentProfitPercentage AS total_current_profit_percentage, vTotalBeforeProfitPercentage AS total_before_profit_percentage
  261.     FROM t_user A
  262.     INNER JOIN t_ou B ON A.tenant_id = B.tenant_id
  263.     WHERE user_id = pUserId
  264.     AND ou_id = pOuId;
  265.    
  266.     RETURN NEXT pRefHeader;
  267.  
  268.     IF TRIM(pPartnerName) <> vEmptyValue THEN
  269.         Open pRefDetail FOR
  270.         SELECT A.partner_id AS partner_id, A.partner_code AS partner_code, A.partner_name AS partner_name,
  271.                A.curr_code AS curr_code,
  272.                A.current_sales_amount AS current_sales, A.current_gross_profit AS current_gross_profit,
  273.                CASE
  274.                     WHEN A.current_sales_amount = 0 THEN 0
  275.                     ELSE COALESCE (A.current_gross_profit/A.current_sales_amount, 0)
  276.                END AS current_profit_percentage,
  277.                A.rekap_sales_amount AS before_sales, A.rekap_gross_profit AS before_gross_profit,
  278.                CASE
  279.                     WHEN A.rekap_sales_amount = 0 THEN 0
  280.                     ELSE COALESCE (A.rekap_gross_profit/A.rekap_sales_amount, 0)
  281.                END AS before_profit_percentage
  282.         FROM tr_sales_gross_profit_for_output A
  283.         WHERE A.session_id = pSessionId
  284.         AND UPPER(A.partner_name) LIKE '%' || UPPER(pPartnerName) || '%'
  285.         ORDER BY curr_code, partner_name;
  286.     ELSE
  287.         Open pRefDetail FOR
  288.         SELECT A.partner_id AS partner_id, A.partner_code AS partner_code, A.partner_name AS partner_name,
  289.                A.curr_code AS curr_code,
  290.                A.current_sales_amount AS current_sales, A.current_gross_profit AS current_gross_profit,
  291.                CASE
  292.                     WHEN A.current_sales_amount = 0 THEN 0
  293.                     ELSE COALESCE (A.current_gross_profit/A.current_sales_amount, 0)
  294.                END AS current_profit_percentage,
  295.                A.rekap_sales_amount AS before_sales, A.rekap_gross_profit AS before_gross_profit,
  296.                CASE
  297.                     WHEN A.rekap_sales_amount = 0 THEN 0
  298.                     ELSE COALESCE (A.rekap_gross_profit/A.rekap_sales_amount, 0)
  299.                END AS before_profit_percentage
  300.         FROM tr_sales_gross_profit_for_output A
  301.         WHERE A.session_id = pSessionId
  302.         ORDER BY curr_code, partner_name;
  303.     END IF;
  304.    
  305.     RETURN NEXT pRefDetail;
  306.  
  307.     DELETE FROM tr_sales_gross_profit WHERE session_id = pSessionId;
  308.     DELETE FROM tr_current_sales_gross_profit WHERE session_id = pSessionId;
  309.     DELETE FROM tr_rekap_sales_gross_profit WHERE session_id = pSessionId;
  310.     DELETE FROM tr_sales_gross_profit_for_output WHERE session_id = pSessionId;
  311.    
  312. END;
  313. $BODY$
  314.   LANGUAGE plpgsql VOLATILE
  315.   COST 100
  316.   ROWS 1000;
  317.   /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement