aadddrr

r_daily_sales

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