Advertisement
aadddrr

r_outlet_top_selling_products_xlsx_no_group_by_periode_20170

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