Advertisement
aadddrr

f_sdp_intgr_process_product

Aug 23rd, 2018
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /**
  2.  * author fredi, 28 Feb 2018
  3.  */
  4. CREATE OR REPLACE FUNCTION f_sdp_intgr_process_product(bigint)
  5.     RETURNS bigint AS
  6. $BODY$
  7. DECLARE
  8.     pHeaderId           ALIAS FOR $1;
  9.    
  10.     vStatusOK           character varying := 'OK';
  11.     vStatusFail         character varying := 'FAIL';
  12.     vEmpty              character varying := '';
  13.     vProductStatusGood  character varying := 'GOOD';
  14.     vEmptyId            bigint := -99;
  15.     vInitial            character varying := 'INITIAL';
  16.    
  17.     vDatetime           character varying;
  18.     vUserId             bigint;
  19.     vTenantId           bigint;
  20.     vWarehouseId        bigint;
  21.     vUomId              bigint;
  22.     vDate               character varying;
  23. BEGIN
  24.     vDatetime   := f_get_intgr_parameter(pHeaderId, 'datetime');
  25.     vUserId     := CAST( f_get_intgr_parameter(pHeaderId, 'userId') AS bigint);
  26.     vTenantId   := CAST( f_get_intgr_parameter(pHeaderId, 'tenantId') AS bigint);
  27.     vWarehouseId    := CAST( f_get_intgr_parameter(pHeaderId, 'warehouseId') AS bigint);
  28.     vUomId  := CAST( f_get_intgr_parameter(pHeaderId, 'uomId') AS bigint);
  29.    
  30.     SELECT TO_CHAR(CURRENT_TIMESTAMP, 'YYYYMMDD')::CHARACTER VARYING INTO vDate;
  31.        
  32.     UPDATE ul_intgr_product
  33.     SET status = vStatusOK
  34.     WHERE header_id = pHeaderId;  
  35.  
  36.     /**
  37.      * 1. Cek product_code tidak boleh ada yg sama di CSV
  38.      * 2. Cek product code tidak boleh ada yg sama di database SDP
  39.      */
  40.    
  41.     UPDATE ul_intgr_product
  42.     SET status = vStatusFail,
  43.         message = 'Duplicate Entry For this Product Code '||product_code
  44.     WHERE header_id = pHeaderId
  45.         AND EXISTS (
  46.             SELECT 1
  47.             FROM ul_intgr_product B
  48.             WHERE ul_intgr_product.header_id = B.header_id
  49.                 AND ul_intgr_product.product_code = B.product_code
  50.                 AND ul_intgr_product.intgr_product_id <> B.intgr_product_id
  51.         );
  52.        
  53.     UPDATE ul_intgr_product
  54.     SET status = vStatusFail,
  55.         message = message || ( CASE WHEN message <> vEmpty THEN ', ' ELSE '' END ) || 'Product code/Merchant SKU '||product_code||' already exists in database'
  56.     WHERE header_id = pHeaderId
  57.         AND EXISTS (
  58.             SELECT 1
  59.             FROM m_product A
  60.             WHERE ul_intgr_product.product_code = A.merchant_sku
  61.         );
  62.        
  63.     UPDATE ul_intgr_product
  64.     SET status = vStatusFail,
  65.         message = 'Product Code '||product_code||' already found in the system, '
  66.     WHERE header_id = pHeaderId
  67.         AND EXISTS (
  68.             SELECT 1
  69.             FROM ul_intgr_product B
  70.             WHERE ul_intgr_product.header_id = B.header_id
  71.                 AND ul_intgr_product.product_code = B.product_code
  72.                 AND ul_intgr_product.intgr_product_id <> B.intgr_product_id
  73.         );
  74.        
  75.     WITH inserted_product AS (
  76.         INSERT INTO m_product(
  77.             merchant_sku, product_name,
  78.             product_url, product_description, upc_code,
  79.             length, width, height, weight,
  80.             specification_detail, unique_selling_point, product_story,
  81.      
  82.             create_datetime, create_user_id, update_datetime, update_user_id,  
  83.             version, active,  active_datetime, non_active_datetime )
  84.         SELECT A.product_code, A.product_name,
  85.             vEmpty, vEmpty, A.product_barcode,
  86.             CAST (A."length" AS numeric), CAST(A.width AS numeric), CAST(A.height AS numeric), CAST(A.weight AS numeric) AS weight,
  87.             vEmpty, vEmpty, vEmpty,
  88.            
  89.             vDatetime, vUserId, vDatetime, vUserId,
  90.             0, 'Y', vDatetime, vDatetime
  91.         FROM ul_intgr_product A
  92.         WHERE A.header_id = pHeaderId
  93.             AND A.status = vStatusOK
  94.         RETURNING *
  95.     ), inserted_product_balance AS (
  96.         INSERT INTO sdp_product_balance(
  97.                 tenant_id, product_id, serial_number, lot_number,
  98.                 product_expired_date, product_year_made, create_user_id, create_datetime,
  99.                 update_user_id, update_datetime, version)
  100.         SELECT vTenantId, A.product_id, vEmpty, vEmpty,
  101.                 vEmpty, vEmpty, vUserId, vDatetime,
  102.                 vUserId, vDatetime, 0
  103.         FROM inserted_product A
  104.         RETURNING *
  105.     ), inserted_product_balance_stock AS (
  106.         INSERT INTO sdp_product_balance_available_stock(
  107.                 tenant_id, warehouse_id,
  108.                 product_id, product_balance_id, product_status, base_uom_id,
  109.                 qty, create_user_id, create_datetime, update_user_id, update_datetime,
  110.                 version)
  111.         SELECT A.tenant_id, vWarehouseId,
  112.                 A.product_id, A.product_balance_id, vProductStatusGood, vUomId,
  113.                 C.available_stock::numeric, vUserId, vDatetime, vUserId, vDatetime,
  114.                 0
  115.         FROM inserted_product_balance A
  116.         INNER JOIN inserted_product B ON A.product_id = B.product_id
  117.         INNER JOIN ul_intgr_product C ON B.merchant_sku = C.product_code
  118.         WHERE C.header_id = pHeaderId
  119.             AND C.status = vStatusOK
  120.         RETURNING *
  121.     )
  122.     INSERT INTO sdp_log_product_balance_stock(
  123.             tenant_id, ref_id, ref_doc_no,
  124.             ref_doc_date, channel_id, product_id, product_balance_id, warehouse_id,
  125.             product_status, base_uom_id, qty, create_user_id, create_datetime,
  126.             update_user_id, update_datetime, version, ref_doc_type_id)
  127.     SELECT A.tenant_id, vEmptyId, vInitial,
  128.             vDate, vEmptyId, A.product_id, A.product_balance_id, A.warehouse_id,
  129.             A.product_status, A.base_uom_id, A.qty, vUserId, vDatetime,
  130.             vUserId, vDatetime, 0, vEmptyId
  131.     FROM inserted_product_balance_stock A;
  132.    
  133.     RETURN 0;  
  134. END;   
  135. $BODY$
  136.   LANGUAGE plpgsql VOLATILE
  137.   COST 100;
  138. /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement