Advertisement
aadddrr

r_history_master_product

Nov 1st, 2018
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. --Adrian, Oct 30
  2. --History Master Product
  3.  
  4. CREATE OR REPLACE FUNCTION r_history_master_product(CHARACTER VARYING, BIGINT, BIGINT, BIGINT, CHARACTER VARYING, CHARACTER VARYING, CHARACTER VARYING, BIGINT, CHARACTER VARYING, BIGINT, CHARACTER VARYING, CHARACTER VARYING, CHARACTER VARYING)
  5.   RETURNS SETOF refcursor AS
  6. $BODY$
  7. DECLARE
  8.     pRefHeader              REFCURSOR := 'refHeader';
  9.     pRefDetail              REFCURSOR := 'refDetail';
  10.    
  11.     pSessionId              ALIAS FOR $1;
  12.     pTenantId               ALIAS FOR $2;
  13.     pUserId                 ALIAS FOR $3;
  14.     pRoleId                 ALIAS FOR $4;
  15.     pDatetime               ALIAS FOR $5;
  16.    
  17.     pProductCode            ALIAS FOR $6;
  18.     pProductName            ALIAS FOR $7;
  19.     pSubCtgrProductId       ALIAS FOR $8;
  20.     pGroupBrand             ALIAS FOR $9;
  21.     pBrandId                ALIAS FOR $10;
  22.     pSerialNumber           ALIAS FOR $11;
  23.     pLotNumber              ALIAS FOR $12;
  24.     pExpiredDate            ALIAS FOR $13;
  25.    
  26.     vYes                    character varying(1) := 'Y';
  27.     vNo                     character varying(1) := 'N';
  28.     vEmptyString            character varying(1) := '';
  29.     vRawProductDataType     character varying(4) := 'RAW1';
  30.     vRawBalanceDataType     character varying(4) := 'RAW2';
  31.     vRawReceiveDataType         character varying(4) := 'RAW3';
  32.     vGoodDataType           character varying(4) := 'GOOD';
  33.     vFilterProductCode      character varying := '';
  34.     vFilterProductName      character varying := '';
  35.     vFilterSubCtgrProduct   character varying := '';
  36.     vFilterGroupBrand       character varying := '';
  37.     vFilterBrand            character varying := '';
  38.     vFilterSerialNumber     character varying := '';
  39.     vFilterLotNumber        character varying := '';
  40.     vFilterExpiredDate      character varying := '';
  41.     vEmptyId                bigint := -99;
  42.     vDocTypeRG              bigint := 111;
  43.     vAll                    character varying := 'ALL';
  44.    
  45. BEGIN
  46.    
  47.     -- RESET TABLE TEMP
  48.     DELETE FROM tt_product WHERE session_id = pSessionId;
  49.     DELETE FROM tt_r_product_list WHERE session_id = pSessionId;
  50.    
  51.     -- CREATE FILTER PRODUCT CODE
  52.     IF (pProductCode<>vEmptyString) THEN
  53.         vFilterProductCode := ' AND UPPER(A.product_code) LIKE UPPER(''%'||pProductCode||'%'') ';
  54.     END IF;
  55.    
  56.     -- CREATE FILTER PRODUCT NAME
  57.     IF (pProductName<>vEmptyString) THEN
  58.         vFilterProductName := ' AND UPPER(A.product_name) LIKE UPPER(''%'||pProductName||'%'') ';
  59.     END IF;
  60.    
  61.     -- CREATE FILTER SUB CTGR PRODUCT
  62.     IF (pSubCtgrProductId<>vEmptyId) THEN
  63.         vFilterSubCtgrProduct := ' AND A.sub_ctgr_product_id = '||pSubCtgrProductId||' ';
  64.     END IF;
  65.    
  66.     -- CREATE FILTER GROUP BRAND
  67.     IF (pGroupBrand<>vEmptyString) THEN
  68.         vFilterGroupBrand := ' AND COALESCE(B.group_brand, '''||vEmptyString||''') = '''||pGroupBrand||''' ';
  69.     END IF;
  70.    
  71.     -- CREATE FILTER BRAND
  72.     IF (pBrandId<>vEmptyId) THEN
  73.         vFilterBrand := ' AND A.brand_id = '||pBrandId||' ';
  74.     END IF;
  75.    
  76.     -- CREATE FILTER SERIAL NUMBER
  77.     IF (pSerialNumber<>vEmptyString) THEN
  78.         vFilterSerialNumber := ' AND UPPER(Y.serial_number) LIKE UPPER(''%'||pSerialNumber||'%'') ';
  79.     END IF;
  80.    
  81.     -- CREATE FILTER LOT NUMBER
  82.     IF (pLotNumber<>vEmptyString) THEN
  83.         vFilterLotNumber := ' AND Y.lot_number = '''||pLotNumber||''' AND (TRIM(Z.serial_number) <> '||vEmptyString||' AND TRIM(Z.lot_number) <> '||vEmptyString||') ';
  84.     END IF;
  85.    
  86.     -- CREATE FILTER EXPIRED DATE
  87.     IF (pExpiredDate<>vEmptyString) THEN
  88.         vFilterExpiredDate := ' AND Y.product_expired_date <= '''||pExpiredDate||''' ';
  89.     END IF;
  90.    
  91.     -- SIAPKAN DATA PRODUCT SESUAI FILTER --
  92.     EXECUTE '
  93.         INSERT INTO tt_product(
  94.            session_id, product_id, tenant_id, product_code, product_name,
  95.            sub_ctgr_product_id, brand_id)
  96.         SELECT $1, A.product_id, A.tenant_id, A.product_code, A.product_name,
  97.            A.sub_ctgr_product_id, A.brand_id
  98.         FROM m_product A
  99.         WHERE A.tenant_id = $2
  100.         AND EXISTS (
  101.             SELECT 1 FROM m_brand_ext B
  102.             WHERE A.brand_id = B.brand_id '
  103.             || vFilterGroupBrand || '
  104.         ) AND EXISTS (
  105.             SELECT 1 FROM in_product_balance Y
  106.             WHERE A.product_id = Y.product_id '
  107.             || vFilterSerialNumber
  108.             || vFilterLotNumber
  109.             || vFilterExpiredDate || '
  110.         ) '
  111.         || vFilterProductCode
  112.         || vFilterProductName
  113.         || vFilterSubCtgrProduct
  114.         || vFilterBrand
  115.     USING pSessionId, pTenantId, vEmptyString;
  116.    
  117.     -- INIT RAW DATA PRODUCT
  118.     EXECUTE '
  119.         INSERT INTO tt_r_product_list(
  120.                 session_id, type_data, num_row,
  121.                 product_id, product_code, product_name,
  122.                 sub_ctgr_product_id, sub_ctgr_product_code,
  123.                 sub_ctgr_product_name,
  124.                 group_brand,
  125.                 group_brand_parent,
  126.                 brand_id, brand_code, brand_name,
  127.                 color, size,
  128.                 product_balance_id,
  129.                 serial_number, lot_number, product_expired_date,
  130.                 rcv_date)
  131.         SELECT $1, $3, ROW_NUMBER () OVER (PARTITION BY A.product_id) AS num_row,
  132.                 A.product_id, A.product_code, A.product_name,
  133.                 A.sub_ctgr_product_id, f_get_sub_ctgr_product_code(A.sub_ctgr_product_id) AS sub_ctgr_product_code,
  134.                 f_get_sub_ctgr_product_name(A.sub_ctgr_product_id) AS sub_ctgr_product_name,
  135.                 COALESCE(B.group_brand, $4),
  136.                 COALESCE(f_get_group_brand_parent_by_group_brand(B.group_brand), $4) AS group_brand_parent,
  137.                 A.brand_id, f_get_brand_code(A.brand_id) AS brand_code,
  138.                 f_get_brand_name(A.brand_id) AS brand_name,
  139.                 COALESCE(C.color, $4) AS color, COALESCE(C.size, $4) AS size,
  140.                 $5,
  141.                 $4, $4, $4,
  142.                 $4
  143.         FROM tt_product A
  144.         LEFT JOIN m_brand_ext B ON A.brand_id = B.brand_id
  145.         LEFT JOIN m_product_custom C ON A.product_id = C.product_id
  146.         WHERE A.session_id = $1'
  147.         || vFilterGroupBrand
  148.     USING pSessionId, pTenantId, vRawProductDataType, vEmptyString, vEmptyId;
  149.            
  150.     -- INIT RAW DATA BALANCE
  151.     EXECUTE '
  152.         INSERT INTO tt_r_product_list(
  153.                 session_id, type_data, num_row,
  154.                 product_id, product_code, product_name,
  155.                 sub_ctgr_product_id, sub_ctgr_product_code,
  156.                 sub_ctgr_product_name,
  157.                 group_brand,
  158.                 group_brand_parent,
  159.                 brand_id, brand_code, brand_name,
  160.                 color, size,
  161.                 product_balance_id,
  162.                 serial_number, lot_number, product_expired_date,
  163.                 rcv_date)
  164.         SELECT $1, $3, ROW_NUMBER () OVER (PARTITION BY Y.product_id ORDER BY Y.product_expired_date) AS num_row,
  165.                 Y.product_id, $4, $4,
  166.                 $5, $4,
  167.                 $4,
  168.                 $4,
  169.                 $4,
  170.                 $5, $4, $4,
  171.                 $4, $4,
  172.                 Y.product_balance_id,
  173.                 Y.serial_number, Y.lot_number, Y.product_expired_date,
  174.                 $4
  175.         FROM in_product_balance Y
  176.         INNER JOIN tt_product B ON Y.product_id = B.product_id
  177.         WHERE B.session_id = $1 '
  178.         || vFilterSerialNumber
  179.         || vFilterLotNumber
  180.         || vFilterExpiredDate
  181.     USING pSessionId, pTenantId, vRawBalanceDataType, vEmptyString, vEmptyId;
  182.            
  183.     -- INIT RAW DATA RECEIVE
  184.     INSERT INTO tt_r_product_list(
  185.             session_id, type_data, num_row,
  186.             product_id, product_code, product_name,
  187.             sub_ctgr_product_id, sub_ctgr_product_code,
  188.             sub_ctgr_product_name,
  189.             group_brand,
  190.             group_brand_parent,
  191.             brand_id, brand_code, brand_name,
  192.             color, size,
  193.             product_balance_id,
  194.             serial_number, lot_number, product_expired_date,
  195.             rcv_date)
  196.     SELECT pSessionId, vRawReceiveDataType, ROW_NUMBER () OVER (PARTITION BY A.product_id) AS num_row,  
  197.             A.product_id, vEmptyString, vEmptyString,
  198.             vEmptyId, vEmptyString,
  199.             vEmptyString,
  200.             vEmptyString,
  201.             vEmptyString,
  202.             vEmptyId, vEmptyString, vEmptyString,
  203.             vEmptyString, vEmptyString,
  204.             A.product_balance_id,
  205.             vEmptyString, vEmptyString, vEmptyString,
  206.             SUBSTR(MIN(A.create_datetime), 1, 8)
  207.     FROM in_log_product_balance_stock A
  208.     INNER JOIN tt_product B ON A.product_id = B.product_id
  209.     WHERE B.session_id = pSessionId
  210.     AND A.doc_type_id = vDocTypeRG
  211.     GROUP BY A.product_id, A.product_balance_id;  
  212.    
  213.     -- INSERT GOOD DATA
  214.     WITH product AS (
  215.         SELECT * FROM tt_r_product_list WHERE session_id = pSessionId AND type_data = vRawProductDataType -- RAW PRODUCT
  216.     ), product_balance AS (
  217.         SELECT * FROM tt_r_product_list WHERE session_id = pSessionId AND type_data = vRawBalanceDataType -- RAW BALANCE
  218.     ), product_receive AS (
  219.         SELECT * FROM tt_r_product_list WHERE session_id = pSessionId AND type_data = vRawReceiveDataType -- RAW RECEIVE
  220.     ), product_and_balance AS (
  221.         SELECT COALESCE(A.session_id, B.session_id) AS session_id,
  222.         row_number() over(PARTITION BY COALESCE(A.product_id, B.product_id) ORDER BY COALESCE(A.num_row, B.num_row)) AS num_row,
  223.         COALESCE(A.product_id, B.product_id) AS product_id, A.product_code, A.product_name,
  224.         A.sub_ctgr_product_id, A.sub_ctgr_product_code,
  225.         A.sub_ctgr_product_name,
  226.         A.group_brand,
  227.         A.group_brand_parent,
  228.         A.brand_id, A.brand_code, A.brand_name,
  229.         A.color, A.size,
  230.         COALESCE(B.product_balance_id, vEmptyId) AS product_balance_id,
  231.         COALESCE(B.serial_number, vEmptyString) AS serial_number, COALESCE(B.lot_number, vEmptyString) AS lot_number,
  232.         COALESCE(B.product_expired_date, vEmptyString) AS product_expired_date
  233.         FROM product A
  234.         FULL OUTER JOIN product_balance B ON A.product_id = B.product_id AND A.num_row = B.num_row
  235.     ), product_balance_receive AS (
  236.         SELECT COALESCE(A.session_id, B.session_id) AS session_id,
  237.         row_number() over(PARTITION BY COALESCE(A.product_id, B.product_id) ORDER BY COALESCE(A.num_row, B.num_row)) AS num_row,
  238.         COALESCE(A.product_id, B.product_id) AS product_id, A.product_code, A.product_name,
  239.         A.sub_ctgr_product_id, A.sub_ctgr_product_code,
  240.         A.sub_ctgr_product_name,
  241.         A.group_brand,
  242.         A.group_brand_parent,
  243.         A.brand_id, A.brand_code, A.brand_name,
  244.         A.color, A.size,
  245.         A.product_balance_id,
  246.         A.serial_number, A.lot_number,
  247.         A.product_expired_date,
  248.         COALESCE(B.rcv_date, vEmptyString) AS rcv_date
  249.         FROM product_and_balance A
  250.         LEFT JOIN product_receive B ON A.product_id = B.product_id AND A.product_balance_id = B.product_balance_id
  251.     )
  252.     INSERT INTO tt_r_product_list(
  253.             session_id, type_data, num_row,
  254.             product_id, product_code, product_name,
  255.             sub_ctgr_product_id, sub_ctgr_product_code,
  256.             sub_ctgr_product_name,
  257.             group_brand,
  258.             group_brand_parent,
  259.             brand_id, brand_code, brand_name,
  260.             color, size,
  261.             product_balance_id,
  262.             serial_number, lot_number, product_expired_date,
  263.             rcv_date)
  264.     SELECT pSessionId, vGoodDataType, ROW_NUMBER () OVER (PARTITION BY A.product_id ORDER BY num_row),
  265.             A.product_id, A.product_code, A.product_name,
  266.             A.sub_ctgr_product_id, A.sub_ctgr_product_code,
  267.             A.sub_ctgr_product_name,
  268.             A.group_brand,
  269.             A.group_brand_parent,
  270.             A.brand_id, A.brand_code, A.brand_name,
  271.             A.color, A.size,
  272.             A.product_balance_id,
  273.             A.serial_number, A.lot_number, A.product_expired_date,
  274.             A.rcv_date
  275.     FROM product_balance_receive A;
  276.    
  277.     -- HAPUS DATA RAW
  278.     DELETE FROM tt_r_product_list WHERE session_id = pSessionId AND type_data = vRawBalanceDataType;
  279.     DELETE FROM tt_r_product_list WHERE session_id = pSessionId AND type_data = vRawReceiveDataType;
  280.    
  281.     Open pRefHeader FOR
  282.         SELECT CASE WHEN (pProductCode <> vEmptyString) THEN
  283.                     pProductCode
  284.                 ELSE
  285.                     vAll
  286.                 END AS product_code,
  287.                 CASE WHEN (pProductName <> vEmptyString) THEN
  288.                     pProductName
  289.                 ELSE
  290.                     vAll
  291.                 END AS product_name,
  292.                 CASE WHEN (pSubCtgrProductId <> vEmptyId) THEN
  293.                     f_get_sub_ctgr_product_name(pSubCtgrProductId)
  294.                 ELSE
  295.                     vAll
  296.                 END AS sub_ctgr_product_name,
  297.                 CASE WHEN (pGroupBrand <> vEmptyString) THEN
  298.                     pGroupBrand
  299.                 ELSE
  300.                     vAll
  301.                 END AS group_brand,
  302.                 CASE WHEN (pBrandId <> vEmptyId) THEN
  303.                     f_get_brand_code(pBrandId) || ' - ' || f_get_brand_name(pBrandId)
  304.                 ELSE
  305.                     vAll
  306.                 END AS brand,
  307.                 CASE WHEN (pSerialNumber <> vEmptyString) THEN
  308.                     pSerialNumber
  309.                 ELSE
  310.                     vAll
  311.                 END AS serial_number,
  312.                 CASE WHEN (pLotNumber <> vEmptyString) THEN
  313.                     pLotNumber
  314.                 ELSE
  315.                     vAll
  316.                 END AS lot_number,
  317.                 CASE WHEN (pExpiredDate <> vEmptyString) THEN
  318.                     pExpiredDate
  319.                 ELSE
  320.                     vEmptyString
  321.                 END AS expired_date,
  322.                 f_get_username(pUserId) AS username,
  323.                 SUBSTR(pDatetime, 1, 8) AS print_date;
  324.     RETURN NEXT pRefHeader;
  325.    
  326.     Open pRefDetail FOR
  327.    
  328.         SELECT A.product_id, A.product_code, A.product_name,
  329.             A.sub_ctgr_product_id, A.sub_ctgr_product_code,
  330.             A.sub_ctgr_product_name,
  331.             A.group_brand,
  332.             A.group_brand_parent,
  333.             A.brand_id, A.brand_code, A.brand_name,
  334.             A.color, A.size AS product_size,
  335.             A.product_balance_id,
  336.             A.serial_number, A.lot_number, A.product_expired_date,
  337.             A.rcv_date
  338.         FROM tt_r_product_list A
  339.         INNER JOIN tt_product C ON C.product_id = A.product_id
  340.         WHERE A.session_id = pSessionId
  341.         AND A.session_id = C.session_id
  342.         AND A.type_data = vGoodDataType
  343.         ORDER BY C.product_code, C.product_name, A.product_expired_date, A.num_row;
  344.    
  345.     RETURN NEXT pRefDetail;
  346.    
  347.     -- RESET TABLE TEMP
  348.     DELETE FROM tt_product WHERE session_id = pSessionId;
  349.     DELETE FROM tt_r_product_list WHERE session_id = pSessionId;
  350.  
  351. END;
  352. $BODY$
  353.   LANGUAGE plpgsql VOLATILE
  354.   COST 100
  355.   /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement