widana

Function Report Penjualan

Jul 29th, 2018
57
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.     vEmptyId                    BIGINT := -99;
  24.  
  25. BEGIN
  26.        
  27.     DELETE FROM tt_summary_trx_pos WHERE session_id = pSessionId;
  28.    
  29.     IF pSalesman <> vEmpty THEN
  30.         vFilterSalesman := ' AND UPPER(Z.salesman_name) LIKE UPPER(''%'|| pSalesman ||'%'')';
  31.     END IF;
  32.  
  33.     IF pCustomer <> vEmpty THEN
  34.         vFilterCustomer := ' AND ( UPPER(Z.customer_code) LIKE UPPER(''%'|| pCustomer ||'%'') OR UPPER(Z.customer_name) LIKE UPPER(''%'|| pCustomer ||'%'') )';
  35.     END IF;
  36.  
  37.     Open pRefHeader FOR
  38.         SELECT f_get_record_owner_name(pRecordOwnerId) AS record_owner_name, pDateFrom AS date_from, pDateTo AS date_to;
  39.     RETURN NEXT pRefHeader;
  40.    
  41.     /**
  42.      * Ambil data penjualan yang type dokumen nya
  43.      * 1. POS,Koreksi POS (390)
  44.      */
  45.     INSERT INTO tt_summary_trx_pos (
  46.         session_id, doc_id, doc_type_id, record_owner_id, doc_no, doc_date, year_month,
  47.         customer_id, salesman_id, product_id, total_trx_qty
  48.     )
  49.     SELECT pSessionId, C.pos_id, C.doc_type_id, A.record_owner_id, A.ref_doc_no, A.ref_doc_date, substring(A.ref_doc_date, 1, 6),
  50.         C.customer_id, C.salesman_id, A.product_id, A.qty
  51.     FROM in_log_product_balance_stock A
  52.     INNER JOIN trx_pos C ON A.ref_id = C.pos_id
  53.         AND A.ref_doc_type_id = C.doc_type_id
  54.     WHERE A.record_owner_id = pRecordOwnerId
  55.         AND A.ref_doc_type_id IN (vPosDocTypeId)
  56.         AND A.ref_doc_date BETWEEN pDateFrom AND pDateTo;
  57.  
  58.     /**
  59.      * Ambil Summary produk yg jumlah trx qty <> 0
  60.      */
  61.     INSERT INTO tt_rekap_summary_trx_pos_item (
  62.         session_id, doc_id, doc_type_id, record_owner_id, doc_no, doc_date, year_month,
  63.         customer_id, salesman_id, product_id, total_trx_qty
  64.     )
  65.     SELECT session_id, doc_id, doc_type_id, record_owner_id, doc_no, doc_date, year_month,
  66.         customer_id, salesman_id, product_id, ABS(SUM(total_trx_qty)) AS total_qty
  67.     FROM tt_summary_trx_pos
  68.     WHERE session_id = pSessionId
  69.     GROUP BY session_id, doc_id, doc_type_id, record_owner_id, doc_no, doc_date, year_month,
  70.         customer_id, salesman_id, product_id
  71.     HAVING SUM(total_trx_qty) <> 0;
  72.    
  73.     /**
  74.      * Hapus Dokumen POS yang dilakukan void
  75.      */
  76.     DELETE FROM tt_rekap_summary_trx_pos_item Z WHERE EXISTS (SELECT 1 FROM trx_pos A WHERE A.doc_type_id = vVoidPosDocTypeId AND A.ref_id = Z.doc_id);
  77.    
  78.     OPEN pRefDetail FOR
  79.         EXECUTE '
  80.             WITH TEMP AS (
  81.                 SELECT A.doc_no, A.doc_date, f_get_customer_code(A.customer_id) AS customer_code, f_get_customer_name(A.customer_id) AS customer_name,
  82.                 f_get_salesman_name(A.salesman_id) AS salesman_name, SUM((B.unit_sell_price-B.item_discount_amount)*A.total_trx_qty) AS total_trx_amount,
  83.                 COALESCE(C.due_date, $2) AS due_date, A.record_owner_id, COALESCE(SUM((D.amount_total/D.qty_total)*A.total_trx_qty), 0) AS hpp_avg
  84.                 FROM tt_rekap_summary_trx_pos_item A
  85.                 INNER JOIN trx_pos_item B ON A.doc_id = B.pos_id
  86.                     AND A.product_id = B.product_id
  87.                 LEFT JOIN fi_invoice_ar C ON A.doc_id = C.ref_id
  88.                         AND A.doc_type_id = C.ref_doc_type_id
  89.                 LEFT JOIN in_summary_cogs D ON  A.record_owner_id = D.record_owner_id
  90.                     AND A.product_id = D.product_id
  91.                     AND A.year_month = D.year_month
  92.                 WHERE session_id = $1
  93.                 GROUP BY A.doc_no, A.doc_date, C.due_date, A.customer_id, A.salesman_id, A.record_owner_id
  94.             )
  95.             SELECT *, total_trx_amount-hpp_avg AS total_laba_rugi
  96.             FROM TEMP Z
  97.             WHERE true
  98.             '|| vFilterSalesman || vFilterCustomer ||''
  99.         USING pSessionId, vEmpty;
  100.     RETURN NEXT pRefDetail;
  101.  
  102.     DELETE FROM tt_summary_trx_pos WHERE session_id = pSessionId;
  103.     DELETE FROM tt_rekap_summary_trx_pos_item WHERE session_id = pSessionId;
  104.    
  105. END;
  106. $BODY$
  107.   LANGUAGE plpgsql VOLATILE
  108.   SET search_path = public, mstr, ptg, htg, pb, pj, batch
  109.   COST 100;
  110.   /
Add Comment
Please, Sign In to add comment