Advertisement
widana

Report Kartu Stock

Jul 24th, 2018
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. CREATE OR REPLACE FUNCTION rpt.r_report_kartu_stock(character varying, bigint, bigint, character varying, character varying)
  2.   RETURNS SETOF refcursor AS
  3. $BODY$
  4. DECLARE
  5.     pRefHeader                  REFCURSOR := 'refHeader';
  6.     pRefDetail                  REFCURSOR := 'refDetail';
  7.     pRefSummary                 REFCURSOR := 'refSummary';
  8.    
  9.     pSessionId                  ALIAS FOR $1;
  10.     pRecordOwnerId              ALIAS FOR $2;
  11.     pProductId                  ALIAS FOR $3;
  12.     pDateFrom                   ALIAS FOR $4;
  13.     pDateTo                     ALIAS FOR $5;
  14.    
  15.     vEmptyId                    bigint := -99;
  16.     vBeginningQty               bigint := 0;
  17.     vEndQty                     bigint := 0;
  18.     vCalculateQty               bigint := 0;
  19.  
  20.     vEmpty                      character varying := '';
  21.     vNo                         character varying := 'N';
  22.     vYes                        character varying := 'Y';
  23.    
  24.     vYearMonth                  character varying := '';
  25.     vFilerProduct               character varying := '';
  26.     vLastYearMonth              character varying := '';
  27.     vNextYearMonth              character varying := '';
  28.     vSaldoDateFrom              character varying := '';
  29.  
  30.     vCursorRow                  tt_summary_trx_document%ROWTYPE;
  31.    
  32. BEGIN
  33.    
  34.     DELETE FROM tt_summary_qty WHERE session_id = pSessionId;
  35.     DELETE FROM tt_summary_trx_document WHERE session_id = pSessionId;
  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.                 f_get_product_code(pProductId) AS product_code, f_get_product_name(pProductId) AS product_name;
  40.     RETURN NEXT pRefHeader;
  41.    
  42.     /**
  43.      * cari terakhir bulan tahun terakhir tutup bulan
  44.      */
  45.     SELECT COALESCE(MAX(year_month), ' ') INTO vLastYearMonth
  46.     FROM m_admin_process_ledger
  47.     WHERE record_owner_id = pRecordOwnerId AND
  48.         flag_process = vYes AND
  49.         ledger_code = 'INV' AND
  50.         year_month < substring(pDateFrom,1,6);
  51.    
  52.     SELECT TO_CHAR(TO_DATE(vLastYearMonth,'YYYYMM') + interval '1 Month','YYYYMM') INTO vNextYearMonth;
  53.     vSaldoDateFrom := vNextYearMonth||'01';
  54.    
  55.     /**
  56.      * 1. Ambil qty dari in_summary_monthly_qty berdasrkan (vNextYearMonth)
  57.      * 2. Init Saldo awal dari log product balance stock berdasrkan awal tahun bulan dari terakhir tutup bulan
  58.      */
  59.     EXECUTE '
  60.         WITH TEMP AS (
  61.             SELECT $1 AS session_id, A.record_owner_id, COALESCE(SUM(A.qty), 0) AS qty
  62.             FROM in_summary_monthly_qty A
  63.             WHERE A.year_month = $6
  64.                 AND A.record_owner_id = $2
  65.                 AND A.product_id = $5
  66.             GROUP BY A.record_owner_id, A.product_id
  67.  
  68.             UNION
  69.  
  70.             SELECT $1 AS session_id, record_owner_id, COALESCE(SUM(qty), 0) AS qty
  71.             FROM in_log_product_balance_stock
  72.             WHERE record_owner_id = $2
  73.                 AND ref_doc_date >= $3
  74.                 AND ref_doc_date < $4
  75.                 AND product_id = $5
  76.             GROUP BY record_owner_id, product_id
  77.         )
  78.         INSERT INTO tt_summary_qty(
  79.             session_id, record_owner_id, beginning_qty, end_qty
  80.         )
  81.         SELECT session_id, record_owner_id, SUM(qty), SUM(qty)
  82.         FROM TEMP
  83.         WHERE session_id = $1
  84.         GROUP BY session_id, record_owner_id'
  85.     USING pSessionId, pRecordOwnerId, vSaldoDateFrom, pDateFrom, pProductId, vNextYearMonth;
  86.    
  87.     -- Ambil Semua dokumen transaksi yang ada dalam jangka periode
  88.     EXECUTE '
  89.         INSERT INTO tt_summary_trx_document (
  90.             session_id, record_owner_id, doc_no, doc_date, doc_desc, qty
  91.         )
  92.         SELECT $4, A.record_owner_id, A.ref_doc_no, A.ref_doc_date, f_get_doc_desc(A.ref_doc_type_id), COALESCE(SUM(A.qty), 0)
  93.         FROM in_log_product_balance_stock A
  94.         WHERE A.record_owner_id = $1
  95.             AND A.ref_doc_date BETWEEN $2 AND $3
  96.             AND A.product_id = $5
  97.         GROUP BY A.record_owner_id, A.ref_doc_no, A.ref_doc_date, A.ref_doc_type_id
  98.         ORDER BY A.ref_doc_date ASC'
  99.     USING pRecordOwnerId, pDateFrom, pDateTo, pSessionId, pProductId;
  100.    
  101.     FOR vCursorRow IN
  102.         SELECT *
  103.         FROM tt_summary_trx_document
  104.         WHERE session_id = pSessionId
  105.     LOOP    
  106.  
  107.         /*
  108.          * Melakukan pengecekan apakah ada saldo awal jika tidak ada lakukan insert saldo awal
  109.          * dari hasil stock akhir
  110.          */
  111.         IF(SELECT 1 FROM tt_summary_qty WHERE session_id = pSessionId AND record_owner_id = pRecordOwnerId) THEN
  112.                 SELECT COALESCE(SUM(end_qty), 0) INTO vBeginningQty FROM tt_summary_qty WHERE session_id = pSessionId AND record_owner_id = pRecordOwnerId;
  113.         ELSE
  114.             vBeginningQty := 0;
  115.             INSERT INTO tt_summary_qty(
  116.                 session_id, record_owner_id, beginning_qty, end_qty
  117.             ) VALUES
  118.             (pSessionId, pRecordOwnerId, 0, 0);
  119.        
  120.         END IF;
  121.        
  122.         vCalculateQty := vBeginningQty+vCursorRow.qty;
  123.        
  124.         INSERT INTO tt_sumary_trx_log_product_balance(
  125.             session_id, doc_no, doc_date, doc_desc, beginning_qty,
  126.             trx_qty, end_qty
  127.         ) VALUES (pSessionId, vCursorRow.doc_no, vCursorRow.doc_date, vCursorRow.doc_desc, vBeginningQty,
  128.             vCursorRow.qty, vCalculateQty);
  129.        
  130.         UPDATE tt_summary_qty SET end_qty = vCalculateQty WHERE session_id = pSessionId AND record_owner_id = pRecordOwnerId;
  131.     END LOOP;
  132.  
  133.     OPEN pRefDetail FOR
  134.         SELECT *
  135.         FROM tt_sumary_trx_log_product_balance
  136.         WHERE session_id = pSessionId;
  137.     RETURN NEXT pRefDetail;
  138.  
  139.     OPEN pRefSummary FOR
  140.         SELECT COALESCE(SUM(beginning_qty), 0) AS beginning_qty, COALESCE(SUM(end_qty), 0) AS end_qty
  141.         FROM tt_summary_qty
  142.         WHERE session_id = pSessionId;
  143.     RETURN NEXT pRefSummary;
  144.    
  145.     DELETE FROM tt_summary_qty WHERE session_id = pSessionId;
  146.     DELETE FROM tt_summary_trx_document WHERE session_id = pSessionId;
  147.    
  148. END;
  149. $BODY$
  150.   LANGUAGE plpgsql VOLATILE
  151.   SET search_path = public, mstr, ptg, htg, pb, pj, batch
  152.   COST 100;
  153.   /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement