Advertisement
aadddrr

r_outlet_top_selling_products_xlsx_no_group_by_periode

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