Advertisement
aadddrr

REPORT DAILY SALES

Mar 13th, 2017
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. CREATE OR REPLACE FUNCTION r_daily_sales(character varying, bigint, bigint, character varying, 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.     pSessionId              ALIAS FOR $1;
  8.     pTenantId               ALIAS FOR $2;
  9.     pOuId                   ALIAS FOR $3;
  10.     pVehicleBrand           ALIAS FOR $4;
  11.     pVehicleType            ALIAS FOR $5;
  12.     pYearMade               ALIAS FOR $6;
  13.     pDateFrom               ALIAS FOR $7;
  14.     pDateTo                 ALIAS FOR $8;
  15.    
  16.     vEmptyValue             character varying(1);
  17.     vEmptyId                bigint;
  18.     vAllId                  bigint;
  19.    
  20.     vFilterOuId             text := '';
  21.     vFilterVehicleBrand     text := '';
  22.     vFilterVehicleType      text := '';
  23.     vFilterYearMade         text := '';
  24.    
  25.     vParentOuId             bigint;
  26.     vYearMonth              character varying(6);
  27.     vDatetime               character varying(14);
  28.     vMaxYearMonth           character varying(6);
  29.    
  30. BEGIN
  31.    
  32.     vEmptyValue := '';
  33.     vEmptyId := -99;
  34.     vAllId := -99;
  35.    
  36.     DELETE FROM tr_daily_sales_report WHERE session_id = pSessionId;
  37.     DELETE FROM tt_in_latest_purchasing_price_by_date WHERE session_id = pSessionId;
  38.     DELETE FROM tt_out_latest_purchasing_price_by_date WHERE session_id = pSessionId;
  39.    
  40.     vParentOuId := f_get_parent_ou_bu(pTenantId, pOuId);
  41.     SELECT TO_CHAR(now(), 'YYYYMM') INTO vYearMonth;
  42.     SELECT TO_CHAR(now(), 'YYYYMMDDHH24MISS') INTO vDatetime;
  43.     SELECT MAX(year_month_date) INTO vMaxYearMonth FROM in_product_standard_cogs;
  44.    
  45.     IF pOuId <> vAllId THEN
  46.         vFilterOuId := ' AND A.ou_id = ' || pOuId;
  47.     END IF;
  48.    
  49.     IF pVehicleBrand <> vEmptyValue THEN
  50.         vFilterVehicleBrand := ' AND D.vehicle_brand = ''' || pVehicleBrand || '''';
  51.     END IF;
  52.    
  53.     IF pVehicleType <> vEmptyValue THEN
  54.         vFilterVehicleType := ' AND D.vehicle_type = ''' || pVehicleType || '''';
  55.     END IF;
  56.    
  57.     IF pYearMade <> vEmptyValue THEN
  58.         vFilterYearMade := ' AND D.year_made = ''' || pYearMade '''';
  59.     END IF;
  60.    
  61.     -- produk non nempil
  62.     EXECUTE '
  63.     WITH summed_i_trx_pos_non_cash_payment AS (
  64.         SELECT process_no, tenant_id, trx_pos_id, SUM(COALESCE(payment_amount, 0)) AS payment_amount, COALESCE(curr_payment_code, '') AS curr_payment_code
  65.         FROM i_trx_pos_non_cash_payment
  66.         GROUP BY process_no, tenant_id, trx_pos_id, curr_payment_code      
  67.     )
  68.     INSERT INTO tr_daily_sales_report (
  69.         session_id, ou_name, year,
  70.         month, date, doc_no, vehicle_brand,
  71.         vehicle_type, year_made, customer_name, product_name,
  72.         ctgr_product_name, qty, curr_code,
  73.         modal_price, gross_sell_price, discount_amount,
  74.         nett_sell_price, curr_payment_code_cash, payment_amount_cash,
  75.         curr_payment_code_non_cash, payment_amount_non_cash,
  76.         curr_under_payment, under_payment_amount,
  77.         tenant_id, ou_id, doc_date, product_id, line_no)
  78.     SELECT  $1, B.ou_name, SUBSTRING(A.doc_date, 1, 4) AS year,  
  79.             SUBSTRING(A.doc_date, 5, 2) AS month, SUBSTRING(A.doc_date, 7, 2) AS date, A.doc_no, D.vehicle_brand,  
  80.             D.vehicle_type, D.year_made, COALESCE(E.partner_name, ''UMUM'') AS customer_name, f_get_product_name(G.product_id) AS product_name,
  81.             f_get_ctgr_product_name(G.ctgr_product_id) AS ctgr_product_name, F.qty, F.curr_code,
  82.             0, F.gross_sell_price, COALESCE(F.discount_amount, 0) * -1 AS discount_amount,
  83.             F.nett_sell_price, COALESCE(H.curr_payment_code, $2) AS curr_payment_code_cash, CASE WHEN F.line_no = 1 THEN COALESCE(H.payment_amount, 0) ELSE 0 END AS payment_amount_cash,
  84.             I.curr_payment_code AS curr_payment_code_non_cash, CASE WHEN F.line_no = 1 THEN I.payment_amount ELSE 0 END AS payment_amount_non_cash,
  85.             COALESCE(J.curr_payment_code, $2) AS curr_under_payment, CASE WHEN F.line_no = 1 THEN COALESCE(j.under_payment_amount, 0) ELSE 0 END AS under_payment_amount,
  86.             A.tenant_id, B.ou_id, A.doc_date, G.product_id, F.line_no
  87.     FROM i_trx_pos A                                                                                                                                                                                                                                                                       
  88.     INNER JOIN t_ou B on A.ou_id = B.ou_id
  89.     INNER JOIN i_trx_pos_ext C on C.process_no  = A.process_no and C.tenant_id = A.tenant_id and C.trx_pos_id = A.trx_pos_id
  90.     INNER JOIN m_vehicle_customer_own D on C.vehicle_code = D.vehicle_code
  91.     LEFT OUTER JOIN m_partner E on C.partner_id = E.partner_id
  92.     INNER JOIN i_trx_pos_item F on A.process_no = F.process_no and A.tenant_id = F.tenant_id and A.trx_pos_id = F.trx_pos_id
  93.     INNER JOIN m_product G on F.product_id = G.product_id
  94.     LEFT OUTER JOIN i_trx_pos_cash_payment H on A.process_no = H.process_no and B.tenant_id = H.tenant_id and A.trx_pos_id = H.trx_pos_id
  95.     LEFT OUTER JOIN i_trx_pos_non_cash_payment I on A.process_no = I.process_no and A.tenant_id = I.tenant_id and A.trx_pos_id = I.trx_pos_id
  96.     LEFT OUTER JOIN i_trx_pos_termin_payment J on A.process_no = J.process_no and A.tenant_id = J.tenant_id and A.trx_pos_id = J.trx_pos_id
  97.     LEFT JOIN t_combo_value K ON D.vehicle_brand = K.code AND K.combo_id = ''VEHICLEBRAND''
  98.     LEFT JOIN t_combo_value L ON D.vehicle_type = L.code AND L.combo_id = ''VEHICLETYPE''
  99.     WHERE A.status <> ''V''
  100.         AND A.tenant_id = $3
  101.         AND A.doc_date BETWEEN $4 AND $5 ' ||
  102.         vFilterOuId ||
  103.         vFilterVehicleBrand ||
  104.         vFilterVehicleType ||
  105.         vFilterYearMade
  106.     USING pSessionId, vEmptyValue, pTenantId, pDateFrom, pDateTo;
  107.    
  108.     ANALYZE tr_daily_sales_report;
  109.    
  110.     INSERT INTO tt_in_latest_purchasing_price_by_date(session_id, tenant_id, ou_bu_id, doc_date, product_id)
  111.         SELECT pSessionId, pTenantId, B.ou_bu_id, A.doc_date, A.product_id  
  112.     FROM tr_daily_sales_report A
  113.         INNER JOIN m_ou_structure B ON B.ou_id = A.ou_id
  114.     WHERE A.tenant_id = pTenantId
  115.         AND A.session_id = pSessionId
  116.     GROUP BY B.ou_bu_id, A.doc_date, A.product_id;
  117.        
  118.     PERFORM pu_get_latest_purchasing_price_by_date(pSessionId, pTenantId, vYearMonth, B.ou_bu_id, vDatetime, -1)
  119.     FROM tr_daily_sales_report A
  120.     INNER JOIN m_ou_structure B ON B.ou_id = A.ou_id
  121.     GROUP BY B.ou_bu_id;
  122.    
  123.     ANALYZE tt_out_latest_purchasing_price_by_date;
  124.  
  125.     UPDATE tr_daily_sales_report B
  126.     SET modal_price = COALESCE(A.gl_purch_gross_price, 0)
  127.     FROM tt_out_latest_purchasing_price_by_date A
  128.     INNER JOIN m_ou_structure C ON C.ou_bu_id = A.ou_bu_id
  129.     WHERE A.session_id = B.session_id
  130.         AND B.product_id = A.product_id
  131.         AND B.tenant_id = A.tenant_id
  132.         AND B.doc_date = A.doc_date  
  133.         AND C.ou_id = B.ou_id;
  134.    
  135.     WITH in_product_standard_cogs_temp AS (
  136.         SELECT D.tenant_id, D.ou_id, MAX(D.year_month_date) AS year_month_date, D.product_id, D.amount
  137.         FROM in_product_standard_cogs D
  138.         INNER JOIN m_ou_structure E ON E.ou_bu_id = D.ou_id
  139.         GROUP BY D.tenant_id, D.ou_id, D.product_id, D.amount
  140.     )
  141.     UPDATE tr_daily_sales_report B
  142.     SET modal_price = COALESCE(A.amount, 0)
  143.     FROM in_product_standard_cogs_temp A
  144.     INNER JOIN m_ou_structure C ON C.ou_bu_id = A.ou_id
  145.     WHERE B.session_id = pSessionId
  146.         AND B.product_id = A.product_id
  147.         AND B.tenant_id = A.tenant_id
  148.         AND A.year_month_date <= SUBSTRING(B.doc_date, 1, 6)  
  149.         AND C.ou_id = B.ou_id
  150.         AND B.modal_price = 0;
  151.    
  152.     -- produk nempil
  153.     /**
  154.      * mod by Didit, 2 des 2016
  155.      * gunakan distinct on, karena ada produk nempil yg kode produk nya sama tp beda di trx_nempil_barang_item_id sehingga
  156.      * produk nempil akan muncul lebih dari satu kali dan menyebabkan perhitungan nett amount akan salah
  157.      */
  158.     EXECUTE 'INSERT INTO tr_daily_sales_report (
  159.         session_id, ou_name, year,
  160.         month, date, doc_no, vehicle_brand,
  161.         vehicle_type, year_made, customer_name, product_name,
  162.         ctgr_product_name, qty, curr_code,
  163.         modal_price, gross_sell_price, discount_amount,
  164.         nett_sell_price, curr_payment_code_cash, payment_amount_cash,
  165.         curr_payment_code_non_cash, payment_amount_non_cash,
  166.         curr_under_payment, under_payment_amount,
  167.         tenant_id, ou_id, doc_date, product_id, line_no)
  168.     SELECT $1, B.ou_name, SUBSTRING(A.doc_date, 1, 4) AS year,
  169.             SUBSTRING(A.doc_date, 5, 2) AS month, SUBSTRING(A.doc_date, 7, 2) AS date, A.doc_no, D.vehicle_brand,    
  170.             D.vehicle_type, D.year_made, COALESCE(E.partner_name, ''UMUM'') AS customer_name, G.product_name,
  171.             $2 AS ctgr_product_name, F.qty, F.curr_code,
  172.             0 AS modal_price, F.gross_sell_price, 0 AS discount_amount,
  173.             F.gross_sell_price, COALESCE(H.curr_payment_code, $2) AS curr_payment_code_cash, CASE WHEN F.line_no = 1 THEN COALESCE(H.payment_amount, 0) ELSE 0 END AS payment_amount_cash,  
  174.             COALESCE(I.curr_payment_code, $2) AS curr_payment_code_non_cash, CASE WHEN F.line_no = 1 THEN COALESCE(I.payment_amount, 0) ELSE 0 END AS payment_amount_non_cash,
  175.             COALESCE(J.curr_payment_code, $2) AS curr_under_payment, CASE WHEN F.line_no = 1 THEN COALESCE(J.under_payment_amount, 0) ELSE 0 END AS under_payment_amount,
  176.             A.tenant_id, B.ou_id, A.doc_date, -99, F.line_no  
  177.     FROM i_trx_pos A
  178.     INNER JOIN t_ou B on A.ou_id = B.ou_id
  179.     INNER JOIN i_trx_pos_ext C on C.process_no = A.process_no and C.tenant_id = A.tenant_id and C.trx_pos_id = A.trx_pos_id
  180.     INNER JOIN m_vehicle_customer_own D on C.vehicle_code = D.vehicle_code  
  181.     LEFT OUTER JOIN m_partner E on C.partner_id = E.partner_id
  182.     INNER JOIN i_trx_pos_item_nempil_barang F on A.process_no = F.process_no and A.tenant_id = F.tenant_id and A.trx_pos_id = F.trx_pos_id
  183.     INNER JOIN in_nempil_barang_balance_stock G on F.product_code = G.product_code AND A.ou_id = G.ou_id
  184.     LEFT OUTER JOIN i_trx_pos_cash_payment H on A.process_no = H.process_no and A.tenant_id = H.tenant_id and A.trx_pos_id = H.trx_pos_id
  185.     LEFT OUTER JOIN i_trx_pos_non_cash_payment I on A.process_no = I.process_no and A.tenant_id = I.tenant_id and A.trx_pos_id = I.trx_pos_id
  186.     LEFT OUTER JOIN i_trx_pos_termin_payment J on A.process_no = J.process_no and A.tenant_id = J.tenant_id and A.trx_pos_id = J.trx_pos_id
  187.     LEFT JOIN t_combo_value K ON D.vehicle_brand = K.code AND K.combo_id = ''VEHICLEBRAND''
  188.     LEFT JOIN t_combo_value L ON D.vehicle_type = L.code AND L.combo_id = ''VEHICLETYPE''
  189.     WHERE A.status <> ''V''
  190.         AND A.tenant_id = $3
  191.         AND A.doc_date BETWEEN $4 AND $5 ' ||
  192.         vFilterOuId ||
  193.         vFilterVehicleBrand ||
  194.         vFilterVehicleType ||
  195.         vFilterYearMade
  196.     USING pSessionId, vEmptyValue, pTenantId, pDateFrom, pDateTo;
  197.    
  198.     /**
  199.      * mod by Didit, 2 Des 2016
  200.      * cash, non cash, dan piutang hanya terisi untuk baris yg pertama
  201.      * selain baris pertama di isi 0
  202.      */
  203.     UPDATE tr_daily_sales_report A
  204.     SET payment_amount_cash = 0,
  205.         payment_amount_non_cash = 0,
  206.         under_payment_amount = 0
  207.     WHERE A.product_id = -99
  208.         AND A.line_no = 1
  209.         AND EXISTS(
  210.             SELECT 1 FROM tr_daily_sales_report B WHERE A.doc_no = B.doc_no AND B.product_id <> -99 AND B.line_no = 1  
  211.         );
  212.    
  213.     -- nilai rounding
  214.     EXECUTE 'INSERT INTO tr_daily_sales_report (
  215.         session_id, ou_name, year,
  216.         month, date, doc_no, vehicle_brand,
  217.         vehicle_type, year_made, customer_name, product_name,
  218.         ctgr_product_name, qty, curr_code,
  219.         modal_price, gross_sell_price, discount_amount,
  220.         nett_sell_price, curr_payment_code_cash, payment_amount_cash,
  221.         curr_payment_code_non_cash, payment_amount_non_cash,
  222.         curr_under_payment, under_payment_amount,
  223.         tenant_id, ou_id, doc_date, product_id, line_no)
  224.     SELECT  $1, B.ou_name, SUBSTRING(A.doc_date, 1, 4) AS year,  
  225.             SUBSTRING(A.doc_date, 5, 2) AS month, SUBSTRING(A.doc_date, 7, 2) AS date, A.doc_no, D.vehicle_brand,  
  226.             D.vehicle_type, D.year_made, COALESCE(E.partner_name, ''UMUM'') AS customer_name, ''ROUNDING'' AS product_name,
  227.             ''ROUNDING'' AS ctgr_product_name, 1, 0,
  228.             0, 0, 0,
  229.             A.rounding_amount, COALESCE(A.curr_code, $2) AS curr_payment_code_cash, CASE WHEN A.rounding_amount < 0 THEN A.rounding_amount ELSE 0 END AS payment_amount_cash,
  230.             COALESCE(A.curr_code, $2) AS curr_payment_code_non_cash, 0 AS payment_amount_non_cash,
  231.             COALESCE(A.curr_code, $2) AS curr_under_payment, 0 AS under_payment_amount,
  232.             A.tenant_id, B.ou_id, A.doc_date, -99, -1
  233.     FROM i_trx_pos A                                                                                                                                                                                                                                                                       
  234.     INNER JOIN t_ou B on A.ou_id = B.ou_id
  235.     INNER JOIN i_trx_pos_ext C on C.process_no  = A.process_no and C.tenant_id = A.tenant_id and C.trx_pos_id = A.trx_pos_id
  236.     INNER JOIN m_vehicle_customer_own D on C.vehicle_code = D.vehicle_code  
  237.     LEFT OUTER JOIN m_partner E on C.partner_id = E.partner_id
  238.     WHERE A.status <> ''V''
  239.         AND A.tenant_id = $3
  240.         AND A.doc_date BETWEEN $4 AND $5
  241.         AND A.rounding_amount <> 0 ' ||
  242.         vFilterOuId ||
  243.         vFilterVehicleBrand ||
  244.         vFilterVehicleType ||
  245.         vFilterYearMade
  246.     USING pSessionId, vEmptyValue, pTenantId, pDateFrom, pDateTo;
  247.    
  248.     Open pRefHeader FOR
  249.     SELECT pTenantId;
  250.     RETURN NEXT pRefHeader;
  251.    
  252.     Open pRefDetail FOR
  253.     SELECT ou_name, year, month, date, doc_no, vehicle_brand, vehicle_type, year_made, customer_name, product_name, ctgr_product_name, qty,
  254.             curr_code, modal_price, gross_sell_price, discount_amount, nett_sell_price, curr_payment_code_cash, payment_amount_cash,
  255.             curr_payment_code_non_cash, payment_amount_non_cash, curr_under_payment, under_payment_amount
  256.     FROM tr_daily_sales_report
  257.     WHERE session_id = pSessionId
  258.     ORDER BY ou_name, year, month, date, doc_no, line_no;
  259.     RETURN NEXT pRefDetail;
  260.    
  261.     DELETE FROM tr_daily_sales_report WHERE session_id = pSessionId;   
  262.     DELETE FROM tt_in_latest_purchasing_price_by_date WHERE session_id = pSessionId;
  263.     DELETE FROM tt_out_latest_purchasing_price_by_date WHERE session_id = pSessionId;
  264.  
  265. END;
  266. $BODY$
  267.   LANGUAGE plpgsql VOLATILE
  268.   COST 100
  269.   ROWS 1000;
  270. /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement