Advertisement
widana

Function Report Penjualan

Jul 25th, 2018
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. CREATE OR REPLACE FUNCTION rpt.r_report_sales(character varying, bigint, character varying, character varying, character varying, character varying)
  2.   RETURNS SETOF refcursor AS
  3. $BODY$
  4. DECLARE
  5.     pRefHeader                  REFCURSOR := 'refHeader';
  6.     pRefDetail                  REFCURSOR := 'refDetail';
  7.    
  8.     pSessionId                  ALIAS FOR $1;
  9.     pRecordOwnerId              ALIAS FOR $2;
  10.     pSalesman                   ALIAS FOR $3;
  11.     pDateFrom                   ALIAS FOR $4;
  12.     pDateTo                     ALIAS FOR $5;
  13.     pCustomer                   ALIAS FOR $6;
  14.    
  15.     vEmpty                      CHARACTER VARYING := '';
  16.     vNo                         CHARACTER VARYING := 'N';
  17.     vYes                        CHARACTER VARYING := 'Y';
  18.     vFilterSalesman             character varying := '';
  19.     vFilterCustomer             character varying := '';
  20.    
  21.     vPosDocTypeId               BIGINT := 390;
  22.     vVoidPosDocTypeId           BIGINT := 391;
  23.     vPengurangHutangDocTypeId   bigint := 251;
  24.     vEmptyId                    BIGINT := -99;
  25.  
  26. BEGIN
  27.        
  28.     DELETE FROM tt_summary_trx_pos WHERE session_id = pSessionId;
  29.    
  30.     IF pSalesman <> vEmpty THEN
  31.         vFilterSalesman := ' AND UPPER(Z.salesman_name) LIKE UPPER(''%'|| pSalesman ||'%'')';
  32.     END IF;
  33.  
  34.     IF pCustomer <> vEmpty THEN
  35.         vFilterCustomer := ' AND ( UPPER(Z.customer_code) LIKE UPPER(''%'|| pCustomer ||'%'') OR UPPER(Z.customer_name) LIKE UPPER(''%'|| pCustomer ||'%'') )';
  36.     END IF;
  37.  
  38.     Open pRefHeader FOR
  39.         SELECT f_get_record_owner_name(pRecordOwnerId) AS record_owner_name, pDateFrom AS date_from, pDateTo AS date_to;
  40.     RETURN NEXT pRefHeader;
  41.    
  42.     /**
  43.      * Ambil data penjualan yang type dokumen nya
  44.      * 1. POS,Koreksi POS (390)
  45.      */
  46.     INSERT INTO tt_summary_trx_pos (
  47.         session_id, record_owner_id, doc_no, doc_date, year_month,
  48.         customer_id, salesman_id, due_date, product_id, total_trx_amount
  49.     )
  50.     SELECT pSessionId, A.record_owner_id, A.ref_doc_no, A.ref_doc_date, substring(A.ref_doc_date, 1, 6),
  51.         C.customer_id, C.salesman_id, D.due_date, A.product_id, B.item_amount_after_discount
  52.     FROM in_log_product_balance_stock A
  53.     INNER JOIN trx_pos_item B ON A.ref_id = B.pos_id
  54.     INNER JOIN trx_pos C ON A.ref_id = C.pos_id
  55.         AND A.ref_doc_type_id = C.doc_type_id
  56.     INNER JOIN fi_invoice_ar D ON C.pos_id = D.ref_id
  57.         AND C.doc_type_id = D.ref_doc_type_id
  58.     WHERE A.record_owner_id = pRecordOwnerId
  59.         AND A.ref_doc_type_id IN (vPosDocTypeId)
  60.         AND A.ref_doc_date BETWEEN pDateFrom AND pDateTo
  61.         AND A.qty <> 0
  62.     GROUP BY A.record_owner_id, A.ref_doc_no, A.ref_doc_date,
  63.         C.customer_id, C.salesman_id, D.due_date, A.product_id, B.item_amount_after_discount;
  64.    
  65.     /**
  66.      * Ambil data penjualan yang type dokumen nya
  67.      * 2. Void POS (391)
  68.      */
  69.     WITH TEMP AS (
  70.         SELECT A.ref_doc_no, A.ref_doc_date, C.customer_id, C.salesman_id, E.product_id, E.item_amount_after_discount AS total_trx_amount,
  71.             C.doc_type_id AS void_doc_type_id, C.pos_id AS void_pos_id, A.record_owner_id
  72.         FROM in_log_product_balance_stock A
  73.         INNER JOIN trx_pos C ON A.ref_id = C.pos_id
  74.             AND A.ref_doc_type_id = C.doc_type_id
  75.         INNER JOIN trx_pos D ON C.ref_doc_type_id = D.doc_type_id
  76.             AND C.ref_id = D.pos_id
  77.         INNER JOIN trx_pos_item E ON D.pos_id = E.pos_id
  78.         WHERE A.record_owner_id = pRecordOwnerId
  79.             AND A.ref_doc_type_id IN (vVoidPosDocTypeId)
  80.             AND A.ref_doc_date BETWEEN pDateFrom AND pDateTo
  81.             AND A.qty <> 0
  82.         GROUP BY A.ref_doc_no, A.ref_doc_date, C.customer_id, C.salesman_id, E.product_id, E.item_amount_after_discount,
  83.             C.doc_type_id, C.pos_id, A.record_owner_id
  84.     )
  85.     INSERT INTO tt_summary_trx_pos (
  86.         session_id, record_owner_id, doc_no, doc_date, year_month,
  87.         customer_id, salesman_id, due_date, product_id, total_trx_amount
  88.     )
  89.     SELECT pSessionId, A.record_owner_id, A.ref_doc_no, A.ref_doc_date, substring(A.ref_doc_date, 1, 6),
  90.         A.customer_id, A.salesman_id, B.due_date, A.product_id, A.total_trx_amount
  91.     FROM TEMP A
  92.     INNER JOIN fi_invoice_ar B ON A.void_doc_type_id = B.ref_doc_type_id
  93.         AND A.void_pos_id = B.ref_id;
  94.        
  95.     OPEN pRefDetail FOR
  96.         EXECUTE '
  97.         SELECT *, total_trx_amount-hpp_avg AS total_laba_rugi
  98.         FROM (
  99.             SELECT  A.doc_no, A.doc_date,
  100.                     f_get_customer_code(A.customer_id) AS customer_code, f_get_customer_name(A.customer_id) AS customer_name,
  101.                     f_get_salesman_name(A.salesman_id) AS salesman_name,
  102.                     A.due_date, COALESCE(SUM(A.total_trx_amount), 0) AS total_trx_amount,
  103.                     CASE WHEN SUM(B.qty_total) = 0
  104.                     THEN
  105.                         0
  106.                     ELSE
  107.                         COALESCE(SUM(B.amount_total)/SUM(B.qty_total), 0)
  108.                     END AS hpp_avg
  109.             FROM tt_summary_trx_pos A
  110.             LEFT JOIN in_summary_cogs B ON A.record_owner_id = B.record_owner_id
  111.                 AND A.year_month = B.year_month
  112.                 AND A.product_id = B.product_id
  113.             WHERE A.session_id = $1
  114.             GROUP BY A.doc_no, A.doc_date, A.customer_id, A.salesman_id, A.due_date
  115.         ) Z
  116.         WHERE true
  117.         ' || vFilterSalesman || vFilterCustomer ||''
  118.         USING pSessionId;
  119.     RETURN NEXT pRefDetail;
  120.  
  121.     DELETE FROM tt_summary_trx_pos WHERE session_id = pSessionId;
  122.    
  123. END;
  124. $BODY$
  125.   LANGUAGE plpgsql VOLATILE
  126.   SET search_path = public, mstr, ptg, htg, pb, pj, batch
  127.   COST 100;
  128.   /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement