Advertisement
aadddrr

r_daily_sales

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