Advertisement
Evra70

upload

Apr 28th, 2021
643
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. CREATE OR REPLACE FUNCTION in_upload_adj_stock_qty_item(bigint)
  2.   RETURNS bigint AS
  3. $BODY$
  4. DECLARE
  5.     pUploadHeaderId         ALIAS FOR $1;
  6.      
  7.     vKeyTenantId            character varying := 'tenantId';
  8.     vKeyUserId              character varying := 'userId';
  9.     vKeyDatetime            character varying := 'datetime';
  10.     vKeyInventoryId         character varying := 'inventoryId';
  11.      
  12.     vFail                   character varying := 'FAIL';
  13.     vOk                     character varying := 'OK';
  14.     vYes                    character varying := 'Y';
  15.     vNo                     character varying := 'N';
  16.     vEmpty                  character varying := '';
  17.     vSpaceValue             character varying := ' ';
  18.     vNullValueLong          bigint := -99;
  19.     vZero                   numeric := 0;
  20.      
  21.     vTenantId               bigint;
  22.     vUserId                 bigint;
  23.     vDatetime               character varying;
  24.     vinventoryId            bigint;
  25.     vWarehouseId            bigint;
  26.      
  27.     vCountFail              bigint;
  28.     vHeaderGroupProductId   bigint;
  29.    
  30. BEGIN
  31.     -- siapkan parameter
  32.     vTenantId = CAST( f_get_upload_parameter(pUploadHeaderId, vKeyTenantId) AS bigint );
  33.     vUserId = CAST( f_get_upload_parameter(pUploadHeaderId, vKeyUserId) AS bigint );
  34.     vDatetime = CAST( f_get_upload_parameter(pUploadHeaderId, vKeyDatetime) AS character varying );
  35.     vinventoryId = CAST( f_get_upload_parameter(pUploadHeaderId, vKeyInventoryId) AS bigint );
  36.    
  37.     SELECT warehouse_from_id, group_product_id FROM in_inventory WHERE inventory_id = vinventoryId INTO vWarehouseId, vHeaderGroupProductId;
  38.    
  39.     PERFORM SETVAL('up_adj_stock_qty_item_line_no_seq', (SELECT MAX(line_no) FROM in_inventory_item WHERE inventory_id = vInventoryId));
  40.    
  41.     -- Validasi
  42.     -- 1. qty tidak boleh 0
  43.     -- 2. product harus ada
  44.     -- 3. tenant product harus sesuai
  45.     -- 4. product harus active
  46.     -- 5. product tidak boleh duplicate
  47.         -- A. update product_id
  48.     -- 6. group product id header in_inventory harus sama dgn group product id dari ctgr product
  49.     -- 7. product status exists
  50.         -- B. update product_balance_id -- bisa tidak ada
  51.    
  52.     -- validasi untuk product yg product_balance_id <> -99
  53.     -- 8. qty product balance stock - qty adj harus >= 0
  54.         -- C. update product_balance_stock_id
  55.    
  56.    
  57.     INSERT INTO up_adj_stock_qty_item_detail(adj_stock_qty_item_id, product_id, product_balance_id, product_balance_stock_id)
  58.     SELECT adj_stock_qty_item_id, vNullValueLong, vNullValueLong, vNullValueLong FROM up_adj_stock_qty_item WHERE upload_header_id = pUploadHeaderId;
  59.    
  60.     --Update serial_number, year_made, expired_date empty menjadi space
  61.     UPDATE up_adj_stock_qty_item A
  62.     SET serial_number = vSpaceValue,
  63.         year_made = vSpaceValue,
  64.         expired_date = vSpaceValue
  65.     WHERE A.upload_header_id = pUploadHeaderId
  66.         AND A.serial_number = vEmpty
  67.         AND A.year_made = vEmpty
  68.         AND A.expired_date = vEmpty;
  69.    
  70.     -- 1. qty tidak boleh 0
  71.     UPDATE up_adj_stock_qty_item A
  72.     SET status = vFail,
  73.         message = message || 'Qty must not zero, '
  74.     WHERE A.upload_header_id = pUploadHeaderId
  75.     AND qty_adj::numeric = 0;
  76.        
  77.     -- 2. product harus ada
  78.     UPDATE up_adj_stock_qty_item A
  79.     SET status = vFail,
  80.         message = message || 'Product not found, '
  81.     WHERE A.upload_header_id = pUploadHeaderId
  82.     AND NOT EXISTS (
  83.         SELECT 1
  84.         FROM  m_product B
  85.         WHERE A.product_code = B.product_code
  86.     );
  87.    
  88.     -- 3. tenant product harus sesuai
  89.     UPDATE up_adj_stock_qty_item A
  90.     SET status = vFail,
  91.         message = message || 'Product tenant is different, '
  92.     WHERE A.upload_header_id = pUploadHeaderId
  93.     AND EXISTS (
  94.         SELECT 1
  95.         FROM  m_product B
  96.         WHERE A.product_code = B.product_code
  97.             AND vTenantId <> B.tenant_id
  98.     );  
  99.        
  100.     -- 4. product harus active
  101.     UPDATE up_adj_stock_qty_item A
  102.     SET status = vFail,
  103.         message = message || 'Product not active, '
  104.     WHERE A.upload_header_id = pUploadHeaderId
  105.     AND EXISTS (
  106.         SELECT 1
  107.         FROM  m_product B
  108.         WHERE A.product_code = B.product_code
  109.             AND vTenantId = B.tenant_id
  110.             AND B.active <> vYes
  111.     );  
  112.    
  113.     -- 5. product must not duplicate
  114.     UPDATE up_adj_stock_qty_item A
  115.     SET status = vFail,
  116.         message = message || 'Product must not duplicate, '
  117.     WHERE A.upload_header_id = pUploadHeaderId
  118.     AND A.product_code IN (
  119.         SELECT product_code
  120.         FROM up_adj_stock_qty_item B
  121.         WHERE B.upload_header_id = pUploadHeaderId
  122.         GROUP BY B.product_code, serial_number, year_made, expired_date
  123.         HAVING count(1) > 1
  124.     );
  125.      
  126.     -- A. update product_id
  127.     UPDATE up_adj_stock_qty_item_detail A
  128.     SET product_id = C.product_id,
  129.         base_uom_id = C.base_uom_id
  130.     FROM up_adj_stock_qty_item B
  131.     JOIN m_product C ON B.product_code = C.product_code
  132.     WHERE B.upload_header_id = pUploadHeaderId
  133.     AND B.status <> vFail
  134.     AND A.adj_stock_qty_item_id = B.adj_stock_qty_item_id;
  135.        
  136.     -- 6. group product id header in_inventory harus sama dgn group product id dari ctgr product
  137.     UPDATE up_adj_stock_qty_item A
  138.     SET status = vFail,
  139.         message = message || 'Product must in one group, '
  140.     FROM up_adj_stock_qty_item_detail B
  141.     JOIN m_product C ON B.product_id = C.product_id
  142.     JOIN m_ctgr_product D ON C.ctgr_product_id = D.ctgr_product_id
  143.     WHERE A.upload_header_id = pUploadHeaderId
  144.     AND A.adj_stock_qty_item_id = B.adj_stock_qty_item_id
  145.     AND D.group_product_id <> vHeaderGroupProductId;
  146.    
  147.     -- 7. product status exists
  148.     UPDATE up_adj_stock_qty_item A
  149.     SET status = vFail,
  150.         message = message || 'Product Status Not Exists, '
  151.     WHERE A.upload_header_id = pUploadHeaderId
  152.     AND EXISTS (
  153.         SELECT 1
  154.         FROM  m_product_status B
  155.         WHERE A.product_status = B.product_status_code
  156.             AND vTenantId = B.tenant_id
  157.             AND B.active <> vYes
  158.     );  
  159.    
  160.     -- B. update product_balance_id -- bisa tidak ada
  161.     UPDATE up_adj_stock_qty_item_detail A
  162.     SET product_balance_id = C.product_balance_id
  163.     FROM up_adj_stock_qty_item B
  164.     JOIN in_product_balance C ON B.serial_number = C.serial_number
  165.                                 AND B.year_made = C.product_year_made
  166.                                 AND B.expired_date = C.product_expired_date
  167.                                 AND C.tenant_id = vTenantId
  168.     WHERE B.upload_header_id = pUploadHeaderId
  169.     AND B.status <> vFail
  170.     AND A.adj_stock_qty_item_id = B.adj_stock_qty_item_id
  171.     AND A.product_id = C.product_id;
  172.  
  173.     -- validasi untuk product yg product_balance_id = -99
  174.     UPDATE up_adj_stock_qty_item A
  175.     SET status = vFail,
  176.         message = message || 'Qty must > 0 for new product balance, '
  177.     FROM up_adj_stock_qty_item_detail B
  178.     WHERE A.upload_header_id = pUploadHeaderId
  179.     AND A.adj_stock_qty_item_id = B.adj_stock_qty_item_id
  180.     AND qty_adj::numeric <= 0
  181.     AND B.product_balance_id = -99;
  182.    
  183.     -- validasi untuk product yg product_balance_id <> -99
  184.     -- 8. qty product balance stock - qty adj harus >= 0
  185.     UPDATE up_adj_stock_qty_item A
  186.     SET status = vFail,
  187.         message = message || 'Insufficient product balance stock, '
  188.     FROM up_adj_stock_qty_item_detail B
  189.     JOIN in_product_balance_stock C ON B.product_id = C.product_id
  190.                                 AND C.tenant_id = vTenantId
  191.                                 AND C.warehouse_id = vWarehouseId
  192.                                 AND C.product_balance_id = B.product_balance_id
  193.     WHERE A.upload_header_id = pUploadHeaderId
  194.     AND A.status <> vFail
  195.     AND C.product_status = A.product_status
  196.     AND B.product_balance_id = -99
  197.     AND (A.qty_adj::numeric) < 0
  198.     AND (C.qty + A.qty_adj::numeric) < 0;
  199.    
  200.     -- C. update product_balance_stock_id
  201.     UPDATE up_adj_stock_qty_item_detail A
  202.     SET product_balance_stock_id = C.product_balance_stock_id
  203.     FROM up_adj_stock_qty_item B
  204.     JOIN in_product_balance_stock C ON C.tenant_id = vTenantId
  205.                                 AND C.warehouse_id = vWarehouseId
  206.                                 AND C.product_status = B.product_status
  207.     WHERE B.upload_header_id = pUploadHeaderId
  208.     AND B.status <> vFail
  209.     AND A.product_id = C.product_id
  210.     AND C.product_balance_id = A.product_balance_id
  211.     AND A.adj_stock_qty_item_id = B.adj_stock_qty_item_id;
  212.    
  213.     -- Update status non FAIL to OK
  214.     UPDATE up_adj_stock_qty_item
  215.     SET status = vOk
  216.     WHERE upload_header_id = pUploadHeaderId
  217.     AND status = vEmpty;
  218.        
  219.     SELECT COALESCE( COUNT(1) , 0) INTO vCountFail
  220.     FROM up_adj_stock_qty_item
  221.     WHERE upload_header_id = pUploadHeaderId
  222.     AND status = vFail;
  223.      
  224.      IF (vCountFail = 0 ) THEN
  225.      
  226.         RAISE NOTICE 'INSERT';
  227.        
  228. --      -- UPDATE OK data to inventory item
  229. --      -- if product exists
  230. --      UPDATE in_inventory_item F
  231. --      SET qty_request = F.qty_request + A.qty_adj::numeric,
  232. --          qty_realization = F.qty_realization + A.qty_adj::numeric,
  233. --          update_user_id = vUserId,
  234. --          update_datetime = vDatetime,
  235. --          version = F.version + 1
  236. --      FROM up_adj_stock_qty_item A
  237. --      INNER JOIN up_adj_stock_qty_item_detail B ON A.adj_stock_qty_item_id = B.adj_stock_qty_item_id
  238. --      WHERE A.upload_header_id = pUploadHeaderId
  239. --      AND A.status = vOk         
  240. --          AND F.inventory_id = vInventoryId
  241. --          AND F.product_id = B.product_id
  242. --          AND F.product_balance_id = B.product_balance_id
  243. --          AND F.product_status = A.product_status
  244. --          AND F.serial_number = A.serial_number
  245. --          AND F.product_expired_date = A.expired_date
  246. --          AND F.product_year_made = A.year_made
  247. --          AND F.lot_number = vSpaceValue
  248. --          AND F.ref_doc_type_id = vNullValueLong
  249. --          AND F.ref_id = vNullValueLong
  250. --          AND F.ref_item_id = vNullValueLong;
  251.        
  252.         -- INSERT OK data to inventory item
  253.         -- if product not exists
  254.         INSERT INTO in_inventory_item(
  255.             tenant_id, inventory_id, line_no,
  256.             product_id, product_balance_id, product_status,
  257.             serial_number, product_expired_date, product_year_made, lot_number,
  258.             ref_doc_type_id, ref_id, ref_item_id,
  259.             curr_code, amount,
  260.             base_uom_id, qty_request, qty_realization,
  261.             remark,
  262.             create_datetime, create_user_id, update_datetime, update_user_id, version)
  263.         SELECT vTenantId, vInventoryId, NEXTVAL('up_adj_stock_qty_item_line_no_seq'),
  264.             B.product_id, B.product_balance_id, A.product_status,
  265.             A.serial_number, A.expired_date, A.year_made, vSpaceValue,
  266.             vNullValueLong, vNullValueLong, vNullValueLong,
  267.             vNullValueLong::character varying, vZero,
  268.             B.base_uom_id, A.qty_adj::numeric, A.qty_adj::numeric,
  269.             A.remark,
  270.             vDatetime, vUserId, vDatetime, vUserId, 0
  271.         FROM up_adj_stock_qty_item A
  272.         INNER JOIN up_adj_stock_qty_item_detail B ON A.adj_stock_qty_item_id = B.adj_stock_qty_item_id
  273.         WHERE A.upload_header_id = pUploadHeaderId
  274.         AND A.status = vOk;
  275. --      AND NOT EXISTS(
  276. --          SELECT 1
  277. --          FROM in_inventory_item D
  278. --          WHERE D.inventory_id = vInventoryId
  279. --              AND D.product_id = B.product_id
  280. --              AND D.product_balance_id = B.product_balance_id
  281. --              AND D.product_status = C.product_status
  282. --              AND D.serial_number = C.serial_number
  283. --              AND D.product_expired_date = C.expired_date
  284. --              AND D.product_year_made = C.year_made
  285. --              AND D.lot_number = vSpaceValue
  286. --              AND D.ref_doc_type_id = vNullValueLong
  287. --              AND D.ref_id = vNullValueLong
  288. --              AND D.ref_item_id = B.product_balance_stock_id
  289. --         );
  290.        
  291.        
  292.         -- UPDATE OK data to in_product_balance_stock
  293.         UPDATE in_product_balance_stock Z
  294.         SET qty = Z.qty + A.qty_adj::numeric,
  295.             update_user_id = vUserId,
  296.             update_datetime = vDatetime,
  297.             version = Z.version + 1
  298.         FROM up_adj_stock_qty_item A
  299.         INNER JOIN up_adj_stock_qty_item_detail B ON A.adj_stock_qty_item_id = B.adj_stock_qty_item_id
  300.         WHERE A.upload_header_id = pUploadHeaderId
  301.         AND A.status = vOk
  302.         AND B.product_balance_stock_id <> vNullValueLong
  303.         AND Z.product_balance_stock_id = B.product_balance_stock_id
  304.         AND A.qty_adj::numeric < 0;
  305.        
  306.         -- UPDATE in_inventory
  307.         UPDATE in_inventory Z
  308.         SET update_user_id = vUserId,
  309.             update_datetime = vDatetime,
  310.             version = Z.version + 1;
  311.        
  312.     END IF;
  313.      
  314.     RETURN vCountFail;
  315.      
  316. END;  
  317. $BODY$
  318.   LANGUAGE plpgsql VOLATILE
  319.   COST 100;
  320.   /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement