congky

Untitled

Sep 25th, 2017
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. CREATE OR REPLACE FUNCTION r_sales_csv(BIGINT, BIGINT, CHARACTER VARYING, CHARACTER VARYING)
  2.   RETURNS SETOF refcursor AS
  3. $BODY$
  4. DECLARE
  5.    
  6.     pRefHeader                      REFCURSOR := 'refHeader';
  7.     pRefDetail                      REFCURSOR := 'refDetail';
  8.    
  9.     pTenantId                       ALIAS FOR $1;
  10.     pReportMessageId                ALIAS FOR $2;
  11.     pSessionId                      ALIAS FOR $3;
  12.     pProcessNo                      ALIAS FOR $4;
  13.    
  14.     vDocTypeIdDo                    BIGINT := 311;
  15.     vDocTypeIdRn                    BIGINT := 502;
  16.     vEmptyId                        BIGINT := -99;
  17.     vNo                             CHARACTER VARYING := 'N';
  18.     vYes                            CHARACTER VARYING := 'Y';
  19.     vPromoEvent                     CHARACTER VARYING := 'PROMOEVENT';
  20.     vEmptyString                    CHARACTER VARYING := '';
  21.    
  22.     vOuId                           BIGINT;
  23.     vFlgIncludeAllBranch            CHARACTER VARYING;
  24.     vYearMonth                      CHARACTER VARYING;
  25.     vSalesmanCodeName               CHARACTER VARYING;
  26.     vCustomerCodeName               CHARACTER VARYING;
  27.     vCtgrProduct                    CHARACTER VARYING;
  28.     vSubCtgrProduct                 CHARACTER VARYING;
  29.    
  30.     vFilterOU                       CHARACTER VARYING :='';
  31.     vFilterSalesmanCodeName         CHARACTER VARYING :='';
  32.     vFilterCustomerCodeName         CHARACTER VARYING :='';
  33.     vFilterCtgrProduct              CHARACTER VARYING :='';
  34.     vFilterSubCtgrProduct           CHARACTER VARYING :='';
  35.  
  36. BEGIN
  37.    
  38.     DELETE FROM tt_report_sales WHERE session_id = pSessionId;
  39.    
  40.     /**
  41.      * Mendapatkan parameter yang dikirim dari UI
  42.      */
  43.     vOuId := CAST(f_get_report_parameter_value_by_id(pReportMessageId, 'ouId') AS BIGINT);
  44.     vFlgIncludeAllBranch := f_get_report_parameter_value_by_id(pReportMessageId, 'flgIncludeAllBranch');
  45.     vYearMonth := f_get_report_parameter_value_by_id(pReportMessageId, 'yearMonth');
  46.     vSalesmanCodeName := f_get_report_parameter_value_by_id(pReportMessageId, 'salesmanCodeName');
  47.     vCustomerCodeName := f_get_report_parameter_value_by_id(pReportMessageId, 'customerCodeName');
  48.     vCtgrProduct := f_get_report_parameter_value_by_id(pReportMessageId, 'ctgrProduct');
  49.     vSubCtgrProduct := f_get_report_parameter_value_by_id(pReportMessageId, 'subCtgrProduct');
  50.    
  51.     /**
  52.      * Menbuat filter
  53.      */
  54.     IF (vFlgIncludeAllBranch!=vEmptyString AND vFlgIncludeAllBranch=vYes) THEN
  55.         vFilterOU := ' AND AY.ou_bu_id = '||vOuId;
  56.     ELSE
  57.         vFilterOU := ' AND A.ou_id = '||vOuId;
  58.     END IF;
  59.    
  60.     IF (vSalesmanCodeName!=vEmptyString) THEN
  61.         vFilterSalesmanCodeName := ' AND (UPPER(f_get_partner_code(A.salesman_id)) LIKE UPPER(''%'||vSalesmanCodeName||'%'') OR UPPER(f_get_partner_name(A.salesman_id)) LIKE UPPER(''%'||vSalesmanCodeName||'%'')) ';
  62.     END IF;
  63.     IF (vCustomerCodeName!=vEmptyString) THEN
  64.         vFilterCustomerCodeName := ' AND (UPPER(f_get_partner_code(A.partner_id)) LIKE UPPER(''%'||vCustomerCodeName||'%'') OR UPPER(f_get_partner_name(A.partner_id)) LIKE UPPER(''%'||vCustomerCodeName||'%'')) ';
  65.     END IF;
  66.     IF (vCtgrProduct!=vEmptyString) THEN
  67.         vFilterCtgrProduct := ' AND UPPER(f_get_ctgr_product_name(B.ctgr_product_id)) LIKE UPPER(''%'||vCtgrProduct||'%'') ';
  68.     END IF;
  69.     IF (vSubCtgrProduct!=vEmptyString) THEN
  70.         vSubCtgrProduct := ' AND UPPER(f_get_sub_ctgr_product_name(B.sub_ctgr_product_id)) LIKE UPPER(''%'||vSubCtgrProduct||'%'') ';
  71.     END IF;
  72.    
  73.     /**
  74.      * HEADER CSV
  75.      */
  76.     Open pRefHeader FOR
  77.         SELECT 15 AS _COUNT,'Year Month', 'OU', 'Customer code', 'Customer name', 'Salesman code', 'Salesman name', 'Promo code', 'Category product', 'Sub category product', 'Product code', 'Product name', 'Qty', 'Currency', 'Amount', 'Discount amount', 'Nett amount',1 AS ordinal
  78.         ORDER BY ordinal;
  79.     RETURN NEXT pRefHeader;
  80.    
  81.     /**
  82.      * PREPARE DATA
  83.      */
  84.    
  85.     -- DATA PENJUALAN YANG SUDAH DO/DOR/INVOICE
  86.     EXECUTE '
  87.        INSERT INTO tt_report_sales(
  88.             session_id, ou_id, partner_id, salesman_id, promo_code, product_id,
  89.             qty, curr_code, amount,
  90.             discount_amount,
  91.             nett_amount)
  92.                
  93.        SELECT $1, A.ou_id, A.partner_id, B.salesman_id, COALESCE(E.promo_code, $2) AS promo_code, D.product_id,
  94.            A.qty_dlv_so, A.curr_code, A.item_amount,
  95.            (A.regular_disc_amount + A.promo_disc_amount + A.adj_regular_disc_amount + A.adj_promo_disc_amount) AS discount_amount,
  96.            A.item_amount - (A.regular_disc_amount + A.promo_disc_amount + A.adj_regular_disc_amount + A.adj_promo_disc_amount) AS nett_amount
  97.        FROM sl_so_balance_invoice A
  98.        INNER JOIN dt_date AX ON A.ref_doc_date = AX.string_date
  99.        INNER JOIN m_ou_structure AY ON A.ou_id = AY.ou_id
  100.        INNER JOIN sl_so B ON A.so_id = B.so_id
  101.        INNER JOIN sl_so_additional_for_dlg C ON B.so_id = C.so_id
  102.        INNER JOIN sl_do_item D ON A.ref_item_id = D.do_item_id
  103.        LEFT JOIN m_promo_sales E ON C.promo_sales_id = E.promo_sales_id
  104.        WHERE A.ref_doc_type_id = $3 '||
  105.         vFilterOU || '
  106.        AND AX.year_month_date = $4 '
  107.     USING pSessionId, vEmptyString, vDocTypeIdDo, vYearMonth;
  108.    
  109.     -- DATA PENJUALAN DENGAN RETURN NOTE
  110.     EXECUTE '
  111.        INSERT INTO tt_report_sales(
  112.             session_id, ou_id, partner_id, salesman_id, promo_code, product_id,
  113.             qty, curr_code, amount,
  114.             discount_amount, nett_amount)
  115.      
  116.        SELECT $1, A.ou_id, A.partner_id, COALESCE(E.salesman_id, $2) AS salesman_id, COALESCE(G.promo_code, $3) AS promo_code, B.product_id,
  117.            (-1*A.qty_dlv_so) qty_dlv_so, A.curr_code, (-1*A.item_amount) item_amount,
  118.             0 discount_amount, (-1*A.item_amount) AS nett_amount
  119.        FROM sl_so_balance_invoice A
  120.        INNER JOIN dt_date AX ON A.ref_doc_date = AX.string_date
  121.        INNER JOIN m_ou_structure AY ON A.ou_id = AY.ou_id
  122.        INNER JOIN sl_request_return_sales_item B ON A.ref_item_id = B.request_return_sales_item_id
  123.        LEFT JOIN sl_do_item C ON B.ref_id = C.do_item_id
  124.        LEFT JOIN sl_do D ON C.do_id = D.do_id
  125.        LEFT JOIN sl_so E ON D.ref_id = E.so_id
  126.        LEFT JOIN sl_so_additional_for_dlg F ON E.so_id = F.so_id
  127.        LEFT JOIN m_promo_sales G ON F.promo_sales_id = G.promo_sales_id
  128.        WHERE A.ref_doc_type_id = $4 '||
  129.         vFilterOU || '
  130.        AND AX.year_month_date = $5 '
  131.     USING pSessionId, vEmptyId, vEmptyString, vDocTypeIdRn, vYearMonth;
  132.    
  133.     Open pRefDetail FOR
  134.    
  135.         EXECUTE '
  136.        SELECT $1 AS year_month, f_get_ou_name(A.ou_id) AS ou, f_get_partner_code(A.partner_id) AS customer_code,
  137.                f_get_partner_name(A.partner_id) AS customer_name, f_get_partner_code(A.salesman_id) AS salesman_code,
  138.                f_get_partner_name(A.salesman_id) AS salesman_name, A.promo_code, f_get_ctgr_product_name(B.ctgr_product_id) AS category_product,
  139.                f_get_sub_ctgr_product_name(B.sub_ctgr_product_id) AS sub_category_product, B.product_code, B.product_name,
  140.                 ROUND(SUM(A.qty), f_get_digit_decimal_doc_curr($2, A.curr_code)) AS qty, A.curr_code,
  141.                 ROUND(SUM(A.amount), f_get_digit_decimal_doc_curr($2, A.curr_code)) AS amount,
  142.                 ROUND(SUM(A.discount_amount), f_get_digit_decimal_doc_curr($2, A.curr_code)) AS discount_amount,
  143.                 ROUND(SUM(A.nett_amount), f_get_digit_decimal_doc_curr($2, A.curr_code)) AS nett_amount
  144.        FROM tt_report_sales A
  145.        INNER JOIN m_product B ON A.product_id = B.product_id
  146.        WHERE A.session_id = $3 '||
  147.         vFilterSalesmanCodeName ||
  148.         vFilterCustomerCodeName ||
  149.         vFilterCtgrProduct ||
  150.         vFilterSubCtgrProduct ||'
  151.        GROUP BY A.ou_id, A.partner_id, A.salesman_id, A.promo_code, A.curr_code, B.ctgr_product_id, B.sub_ctgr_product_id, B.product_code, B.product_name '
  152.         USING vYearMonth, vDocTypeIdDo, pSessionId;
  153.  
  154.     RETURN NEXT pRefDetail;
  155.    
  156.     DELETE FROM tt_report_sales WHERE session_id = pSessionId;
  157.    
  158. END;
  159. $BODY$
  160.   LANGUAGE plpgsql VOLATILE
  161.   COST 100;
Advertisement
Add Comment
Please, Sign In to add comment