Advertisement
aadddrr

r_outlet_top_selling_products_xlsx_no_group_by_periode_XCOM

Aug 1st, 2017
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -- Function: r_outlet_top_selling_products_xlsx_no_group_by_periode(character varying, bigint, bigint, character varying, character varying, bigint, bigint, bigint, bigint, character varying)
  2.  
  3. -- DROP FUNCTION r_outlet_top_selling_products_xlsx_no_group_by_periode(character varying, bigint, bigint, character varying, character varying, bigint, bigint, bigint, bigint, character varying);
  4.  
  5. CREATE OR REPLACE FUNCTION r_outlet_top_selling_products_xlsx_no_group_by_periode(character varying, bigint, bigint, character varying, character varying, bigint, bigint, bigint, bigint, 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.     pDateFrom               ALIAS FOR $4;
  15.     pDateTo                 ALIAS FOR $5;
  16.     pGroupProductOuId       ALIAS FOR $6;
  17.     pLimit                  ALIAS FOR $7;
  18.     pUserId                 ALIAS FOR $8;
  19.     pWarehouseId            ALIAS FOR $9;
  20.     pProductCodeName        ALIAS FOR $10;
  21.    
  22.     vEmptyValue             character varying(1);
  23.     vFlgBu                  character varying(1);
  24.     vFlgSubBu               character varying(1);
  25.     vFlgBranch              character varying(1);
  26.     vProductStatus          character varying(10);
  27.     vDatetime               character varying(14);
  28.     vGroupProductOuCode     character varying(50) := 'All';
  29.     vGroupProductOuName     character varying(100) := 'All';
  30.     vOuBuId                 bigint;
  31.     vAllId                  bigint;
  32.     vEmptyId                bigint;
  33.    
  34. BEGIN
  35.    
  36.     vEmptyValue := ' ';
  37.     vProductStatus := 'GOOD';
  38.     vAllId := -99;
  39.     vEmptyId := -99;
  40.    
  41.     DELETE FROM tr_top_selling_products WHERE session_id = pSessionId;
  42.     DELETE FROM tr_pos_by_periode WHERE session_id = pSessionId;
  43.     DELETE FROM tt_in_latest_purchasing_price_by_date WHERE session_id = pSessionId;
  44.     DELETE FROM tt_out_latest_purchasing_price_by_date WHERE session_id = pSessionId;
  45.    
  46.     SELECT A.flg_bu, A.flg_sub_bu, flg_branch INTO vFlgBu, vFlgSubBu, vFlgBranch
  47.     FROM t_ou_type A
  48.     INNER JOIN t_ou B ON A.ou_type_id = B.ou_type_id
  49.     WHERE B.ou_id = pOuId;
  50.    
  51.     SELECT ou_bu_id INTO vOuBuId
  52.     FROM m_ou_structure
  53.     WHERE ou_id = pOuId;
  54.    
  55.     /*
  56.      * ambil data yang tidak pakai promo
  57.      */
  58.     INSERT INTO tr_pos_by_periode
  59.     (session_id, tenant_id, ou_id, doc_type_id, doc_no, doc_date,
  60.     curr_code, line_no, ctgr_product_id, sub_ctgr_product_id, product_id,
  61.     product_code, product_name, uom_id, uom_code, promo_code,
  62.     qty, flg_tax_amount, tax_amount, nett_sell_price, nett_amount_item, gross_sell_price, discount_amount,
  63.     group_product_ou_id, group_product_ou_code, group_product_ou_name,
  64.     commision_ou_id, commision_type, commision_percentage, commision_curr_code, commision_amount)
  65.     SELECT pSessionId, A.tenant_id, A.ou_id, A.doc_type_id, A.doc_no, A.doc_date,
  66.         B.curr_code, B.line_no, C.ctgr_product_id, C.sub_ctgr_product_id, COALESCE(G.core_product_id, B.product_id),
  67.         C.product_code, C.product_Name, B.base_uom_id, D.uom_code, B.promo_code,
  68.         B.qty, B.flg_tax_amount, B.tax_amount, B.nett_sell_price, B.nett_amount_item, B.gross_sell_price, B.discount_amount,
  69.         B.group_product_ou_id, E.group_product_ou_code, E.group_product_ou_name,
  70.         F.commision_ou_id, F.commision_type, F.commision_percentage, F.curr_code, F.commision_amount
  71.     FROM i_trx_pos A
  72.     INNER JOIN i_trx_pos_item B ON A.trx_pos_id = B.trx_pos_id AND A.tenant_id = B.tenant_id AND A.process_no = B.process_no
  73.     INNER JOIN m_product C ON B.product_id = C.product_id
  74.     INNER JOIN m_uom D ON B.base_uom_id = D.uom_id
  75.     INNER JOIN m_group_product_ou E ON B.group_product_ou_id = E.group_product_ou_id
  76.     INNER JOIN m_commision_ou F ON B.tenant_id = F.tenant_id AND B.group_product_ou_id = F.group_product_ou_id
  77.     LEFT OUTER JOIN m_ext_product G ON B.product_id = G.product_id
  78.     WHERE A.tenant_id = pTenantId AND
  79.         --A.ou_id = pOuId AND
  80.         A.doc_date BETWEEN pDateFrom AND pDateTo AND
  81.         A.doc_date BETWEEN F.date_from AND F.date_to AND
  82.         F.flg_promo = 'N';
  83.        
  84.     UPDATE tr_pos_by_periode SET product_code = A.product_code, product_name = A.product_name
  85.     FROM m_product A
  86.     WHERE A.product_id = tr_pos_by_periode.product_id
  87.     AND tr_pos_by_periode.session_id = pSessionId;
  88.        
  89.     UPDATE tr_pos_by_periode SET commision_amount = ROUND(nett_sell_price * commision_percentage / 100,0), commision_curr_code = curr_code
  90.     WHERE commision_type = 'PCT' AND
  91.         session_id = pSessionId;
  92.    
  93.     /*
  94.      * transaksi POS yang di void, tidak akan dimunculkan
  95.      * NK, 22 Mei 2013
  96.      */
  97.     DELETE FROM tr_pos_by_periode
  98.     WHERE session_id = pSessionId AND
  99.         EXISTS (SELECT 1 FROM i_trx_log_voided_pos A
  100.                     WHERE tr_pos_by_periode.tenant_id = A.tenant_id AND
  101.                     --tr_pos_by_periode.doc_type_id = A.doc_type_id AND
  102.                     tr_pos_by_periode.doc_no = A.doc_no AND
  103.                     tr_pos_by_periode.doc_date = A.doc_date AND
  104.                     tr_pos_by_periode.ou_id = A.ou_id);
  105.        
  106.     IF pOuId <> vAllId THEN
  107.    
  108.         -- OU BU
  109.         IF vFlgBu = 'Y' AND vFlgSubBu = 'N' AND vFlgBranch = 'N' THEN
  110.        
  111.             DELETE FROM tr_pos_by_periode A
  112.             WHERE A.session_id = pSessionId
  113.                 AND NOT EXISTS (
  114.                     SELECT 1 FROM m_ou_structure B
  115.                     WHERE A.ou_id = B.ou_id
  116.                         AND B.ou_bu_id = pOuId
  117.                 );
  118.        
  119.         ELSEIF vFlgBu = 'Y' AND vFlgSubBu = 'N' AND vFlgBranch = 'Y' THEN -- OU Branch
  120.    
  121.             DELETE FROM tr_pos_by_periode A
  122.             WHERE A.session_id = pSessionId
  123.                 AND NOT EXISTS (
  124.                     SELECT 1 FROM m_ou_structure B
  125.                     WHERE A.ou_id = B.ou_id
  126.                         AND B.ou_branch_id = pOuId
  127.                 );
  128.        
  129.         ELSE
  130.    
  131.             DELETE FROM tr_pos_by_periode WHERE session_id = pSessionId AND ou_id <> pOuId;
  132.        
  133.         END IF;
  134.    
  135.     END IF;
  136.                    
  137.     IF pGroupProductOuId <> vAllId THEN
  138.    
  139.         SELECT group_product_ou_code, group_product_ou_name INTO vGroupProductOuCode, vGroupProductOuName
  140.         FROM m_group_product_ou
  141.         WHERE group_product_ou_id = pGroupProductOuId;
  142.    
  143.         DELETE FROM tr_pos_by_periode WHERE session_id = pSessionId AND group_product_ou_id <> pGroupProductOuId;
  144.    
  145.     END IF;
  146.    
  147.     INSERT INTO tt_in_latest_purchasing_price_by_date(session_id, tenant_id, ou_bu_id, doc_date, product_id)
  148.         SELECT pSessionId, pTenantId, B.ou_bu_id, A.doc_date, A.product_id  
  149.     FROM tr_pos_by_periode A
  150.         INNER JOIN m_ou_structure B ON A.ou_id = B.ou_id
  151.     WHERE A.tenant_id = pTenantId
  152.         AND A.session_id = pSessionId
  153.     GROUP BY B.ou_bu_id, A.doc_date, A.product_id;
  154.    
  155.     SELECT TO_CHAR(now(), 'YYYYMMDDHH24MISS') INTO vDatetime;
  156.        
  157.     --PERFORM pu_get_latest_purchasing_price_by_date(pSessionId, pTenantId, SUBSTRING(vDatetime, 1, 6), vOuBuId, vDatetime, pUserId);
  158.     IF pOuId <> vAllId THEN
  159.         PERFORM pu_get_latest_purchasing_price_by_date(pSessionId, pTenantId, SUBSTRING(vDatetime, 1, 6), vOuBuId, vDatetime, pUserId);
  160.     ELSE
  161.         PERFORM pu_get_latest_purchasing_price_by_date(pSessionId, pTenantId, SUBSTRING(vDatetime, 1, 6), B.ou_bu_id, vDatetime, pUserId)
  162.         FROM t_ou A JOIN m_ou_structure B ON A.ou_id=B.ou_id where A.tenant_id=pTenantId;
  163.     END IF;
  164.    
  165.     INSERT INTO tr_top_selling_products(
  166.             session_id, tenant_id, ou_id,
  167.             curr_code, group_product_ou_id, group_product_ou_code, group_product_ou_name,
  168.             product_id, product_code, product_name,
  169.             qty, uom_id, uom_code, uom_name,
  170.             nett_amount, remaining_stock, profit
  171.     )
  172.     SELECT  pSessionId, pTenantId, pOuId,
  173.             A.curr_code, -99, ' ', ' ',
  174.             A.product_id, A.product_code, A.product_name,
  175.             SUM(A.qty) AS qty, A.uom_id, A.uom_code, C.uom_name,
  176.             SUM(A.nett_amount_item) AS nett_amount, 0 AS remaining_stock, SUM(A.nett_amount_item - (A.qty * E.gl_purch_gross_price)) AS profit
  177.     FROM tr_pos_by_periode A
  178.     INNER JOIN m_uom C ON A.uom_id = C.uom_id
  179.     INNER JOIN m_ou_structure D ON A.ou_id = D.ou_id
  180.     INNER JOIN tt_out_latest_purchasing_price_by_date E ON E.session_id = A.session_id AND A.product_id = E.product_id AND A.doc_date = E.doc_date AND A.tenant_id = E.tenant_id AND D.ou_bu_id = E.ou_bu_id
  181.     --LEFT OUTER JOIN in_product_balance_stock B ON A.tenant_id = B.tenant_id AND A.product_id = B.product_id AND B.warehouse_id = pWarehouseId AND B.product_status = vProductStatus
  182.     WHERE A.session_id = pSessionId
  183.     AND UPPER(A.product_code) LIKE '%' || UPPER(pProductCodeName) || '%' OR UPPER(A.product_name) LIKE '%' || UPPER(pProductCodeName) || '%'
  184.     GROUP BY A.curr_code, A.product_id, A.product_code, A.product_name, A.uom_id, A.uom_code, C.uom_name
  185.     ORDER BY qty DESC, nett_amount DESC;
  186.    
  187.     IF pOuId <> vAllId THEN
  188.        
  189.         IF vFlgBu = 'Y' AND vFlgSubBu = 'N' AND vFlgBranch = 'N' THEN
  190.        
  191.             UPDATE tr_top_selling_products
  192.             SET remaining_stock = A.qty
  193.             FROM (
  194.                 SELECT B.product_id, SUM(B.qty) AS qty
  195.                 FROM in_product_balance_stock B
  196.                 INNER JOIN m_warehouse C ON B.warehouse_id = C.warehouse_id
  197.                 INNER JOIN m_warehouse_ou D ON C.warehouse_id = D.warehouse_id
  198.                 INNER JOIN t_ou E ON D.ou_id = E.ou_id
  199.                 INNER JOIN t_ou_type F ON E.ou_type_id = F.ou_type_id
  200.                 INNER JOIN m_ou_structure G ON G.ou_id = E.ou_id
  201.                 WHERE B.tenant_id = pTenantId
  202.                     AND G.ou_bu_id = pOuId
  203.                 GROUP BY B.product_id
  204.             ) A
  205.             WHERE tr_top_selling_products.session_id = pSessionId
  206.             AND tr_top_selling_products.product_id = A.product_id;
  207.            
  208.         ELSEIF vFlgBu = 'Y' AND vFlgSubBu = 'N' AND vFlgBranch = 'Y' THEN
  209.            
  210.             UPDATE tr_top_selling_products
  211.             SET remaining_stock = A.qty
  212.             FROM (
  213.                 SELECT B.product_id, SUM(B.qty) AS qty
  214.                 FROM in_product_balance_stock B
  215.                 INNER JOIN m_warehouse C ON B.warehouse_id = C.warehouse_id
  216.                 INNER JOIN m_warehouse_ou D ON C.warehouse_id = D.warehouse_id
  217.                 INNER JOIN t_ou E ON D.ou_id = E.ou_id
  218.                 INNER JOIN t_ou_type F ON E.ou_type_id = F.ou_type_id
  219.                 INNER JOIN m_ou_structure G ON G.ou_id = E.ou_id
  220.                 WHERE B.tenant_id = pTenantId
  221.                     AND G.ou_branch_id = pOuId
  222.                 GROUP BY B.product_id
  223.             ) A
  224.             WHERE tr_top_selling_products.session_id = pSessionId
  225.             AND tr_top_selling_products.product_id = A.product_id;
  226.            
  227.         ELSE
  228.        
  229.             UPDATE tr_top_selling_products
  230.             SET remaining_stock = A.qty
  231.             FROM (
  232.                 SELECT B.product_id, SUM(B.qty) AS qty
  233.                 FROM in_product_balance_stock B
  234.                 WHERE B.tenant_id = pTenantId
  235.                 AND B.warehouse_id = pWarehouseId
  236.                 GROUP BY B.product_id
  237.             ) A
  238.             WHERE tr_top_selling_products.session_id = pSessionId
  239.             AND tr_top_selling_products.product_id = A.product_id;
  240.        
  241.         END IF;
  242.     ELSE
  243.         UPDATE tr_top_selling_products
  244.         SET remaining_stock = A.qty
  245.         FROM (
  246.             SELECT B.product_id, SUM(B.qty) AS qty
  247.             FROM in_product_balance_stock B
  248.             INNER JOIN m_warehouse C ON B.warehouse_id = C.warehouse_id
  249.             INNER JOIN m_warehouse_ou D ON C.warehouse_id = D.warehouse_id
  250.             INNER JOIN t_ou E ON D.ou_id = E.ou_id
  251.             INNER JOIN t_ou_type F ON E.ou_type_id = F.ou_type_id
  252.             WHERE B.tenant_id = pTenantId
  253.             AND F.flg_bu = 'Y' AND F.flg_sub_bu = 'Y'
  254.             GROUP BY B.product_id
  255.         ) A
  256.         WHERE tr_top_selling_products.session_id = pSessionId
  257.         AND tr_top_selling_products.product_id = A.product_id;
  258.     END IF;
  259.    
  260.     Open pRefHeader FOR
  261.     SELECT fullName AS full_name, pDateFrom AS date_from, pDateTo AS date_to
  262.     FROM t_user
  263.     WHERE user_id = pUserId;
  264.    
  265.     RETURN NEXT pRefHeader;
  266.  
  267.     IF pLimit <> vAllId THEN
  268.         Open pRefDetail FOR
  269.         SELECT  A.curr_code AS curr_code, vGroupProductOuCode AS dept_code,
  270.                 vGroupProductOuName AS dept_name,
  271.                 A.product_code AS product_code, A.product_name AS product_name,
  272.                 SUM(A.qty) AS qty, A.uom_name AS uom_code,
  273.                 SUM(A.nett_amount) AS nett_amount, SUM(A.remaining_stock) AS remaining_stock,
  274.                 SUM(A.profit) AS profit
  275.         FROM tr_top_selling_products A
  276.         WHERE A.session_id = pSessionId
  277.         GROUP BY A.curr_code,
  278.                 A.product_code, A.product_name, A.uom_name
  279.         ORDER BY qty DESC, nett_amount DESC
  280.         LIMIT pLimit;
  281.     ELSE
  282.         Open pRefDetail FOR
  283.         SELECT  A.curr_code AS curr_code, vGroupProductOuCode AS dept_code,
  284.                 vGroupProductOuName AS dept_name,
  285.                 A.product_code AS product_code, A.product_name AS product_name,
  286.                 SUM(A.qty) AS qty, A.uom_name AS uom_code,
  287.                 SUM(A.nett_amount) AS nett_amount, SUM(A.remaining_stock) AS remaining_stock,
  288.                 SUM(A.profit) AS profit
  289.         FROM tr_top_selling_products A
  290.         WHERE A.session_id = pSessionId
  291.         GROUP BY A.curr_code,
  292.                 A.product_code, A.product_name, A.uom_name
  293.         ORDER BY qty DESC, nett_amount DESC;
  294.     END IF;
  295.        
  296.     RETURN NEXT pRefDetail;
  297.  
  298.     DELETE FROM tr_pos_by_periode WHERE session_id = pSessionId;
  299.     DELETE FROM tr_top_selling_products WHERE session_id = pSessionId;
  300.     DELETE FROM tt_in_latest_purchasing_price_by_date WHERE session_id = pSessionId;
  301.     DELETE FROM tt_out_latest_purchasing_price_by_date WHERE session_id = pSessionId;
  302.    
  303. END;
  304. $BODY$
  305.   LANGUAGE plpgsql VOLATILE
  306.   COST 100
  307.   ROWS 1000;
  308. ALTER FUNCTION r_outlet_top_selling_products_xlsx_no_group_by_periode(character varying, bigint, bigint, character varying, character varying, bigint, bigint, bigint, bigint, character varying)
  309.   OWNER TO sts;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement