Advertisement
aadddrr

r_daily_sales Spoor Setiawan

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