Advertisement
aadddrr

r_analysis_sales_nett_profit_with_monthly_average_20170912_2

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