Advertisement
aadddrr

in_upload_put_away_item_20170928

Sep 28th, 2017
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /**
  2.  * Adrian, Sep 27, 2017
  3.  * Function upload item Put Away
  4.  */
  5.  
  6. CREATE OR REPLACE FUNCTION in_upload_put_away_item(bigint)
  7.   RETURNS bigint AS
  8. $BODY$
  9. DECLARE
  10.     pUploadHeaderId         ALIAS FOR $1;
  11.      
  12.     vKeyTenantId            character varying := 'tenantId';
  13.     vKeyUserId              character varying := 'userId';
  14.     vKeyDatetime            character varying := 'datetime';
  15.     vKeyInventoryId         character varying := 'inventoryId';
  16.      
  17.     vFail                   character varying := 'FAIL';
  18.     vOk                     character varying := 'OK';
  19.     vYes                    character varying := 'Y';
  20.     vNo                     character varying := 'N';
  21.     vEmpty                  character varying := '';
  22.     vSpaceValue             character varying := ' ';
  23.     vNullValueLong          bigint := -99;
  24.     vZero                   numeric := 0;
  25.      
  26.     vTenantId               bigint;
  27.     vUserId                 bigint;
  28.     vDatetime               character varying;
  29.     vinventoryId            bigint;
  30.      
  31.     vCountFail              bigint;
  32.    
  33. BEGIN
  34.     -- siapkan parameter
  35.     vTenantId = CAST( f_get_upload_parameter(pUploadHeaderId, vKeyTenantId) AS bigint );
  36.     vUserId = CAST( f_get_upload_parameter(pUploadHeaderId, vKeyUserId) AS bigint );
  37.     vDatetime = CAST( f_get_upload_parameter(pUploadHeaderId, vKeyDatetime) AS character varying );
  38.     vinventoryId = CAST( f_get_upload_parameter(pUploadHeaderId, vKeyInventoryId) AS bigint );
  39.    
  40.     PERFORM SETVAL('up_put_away_item_line_no_seq', (SELECT MAX(line_no) FROM in_inventory_item WHERE inventory_id = vInventoryId));
  41.    
  42.     -- Validasi
  43.     -- 1. product harus ada
  44.     -- 2. tenant product harus sesuai
  45.     -- 3. product harus active
  46.     -- 4. product balance harus ada
  47.     -- 5. tenant product balance harus sama
  48.     -- 6. product balance stock harus ada
  49.     -- 7. tenant product balance stock harus sesuai
  50.     -- 8. tidak boleh ada product balance stock yang sama
  51.     -- 9. stok product balance stock setelah put away harus >= 0
  52.     -- 10. sub category product harus terdapat dalam item warehouse
  53.      
  54.     --Update serial_number, year_made, expired_date empty menjadi space
  55.     UPDATE up_put_away_item A
  56.     SET serial_number = vSpaceValue,
  57.         year_made = vSpaceValue,
  58.         expired_date = vSpaceValue
  59.     WHERE A.upload_header_id = pUploadHeaderId
  60.         AND A.serial_number = vEmpty
  61.         AND A.year_made = vEmpty
  62.         AND A.expired_date = vEmpty;
  63.    
  64.     -- 1. product harus ada
  65.     UPDATE up_put_away_item A
  66.     SET status = vFail,
  67.         message = message || 'Product not found, '
  68.     WHERE A.upload_header_id = pUploadHeaderId
  69.         AND NOT EXISTS (
  70.             SELECT 1
  71.             FROM  m_product B
  72.             WHERE A.product_code = B.product_code
  73.         );
  74.          
  75.     -- 2. tenant product harus sesuai
  76.     UPDATE up_put_away_item A
  77.     SET status = vFail,
  78.         message = message || 'Product tenant is different, '
  79.     WHERE A.upload_header_id = pUploadHeaderId
  80.         AND EXISTS (
  81.             SELECT 1
  82.             FROM  m_product B
  83.             WHERE A.product_code = B.product_code
  84.                 AND vTenantId <> B.tenant_id
  85.         );  
  86.        
  87.     -- 3. product harus active
  88.     UPDATE up_put_away_item A
  89.     SET status = vFail,
  90.         message = message || 'Product not active, '
  91.     WHERE A.upload_header_id = pUploadHeaderId
  92.         AND EXISTS (
  93.             SELECT 1
  94.             FROM  m_product B
  95.             WHERE A.product_code = B.product_code
  96.                 AND vTenantId = B.tenant_id
  97.                 AND B.active <> vYes
  98.         );  
  99.        
  100.     -- 4. product balance harus ada
  101.     UPDATE up_put_away_item A
  102.     SET status = vFail,
  103.         message = message || 'Product balance not found, '
  104.     WHERE A.upload_header_id = pUploadHeaderId
  105.         AND NOT EXISTS (
  106.             SELECT 1
  107.             FROM  m_product B
  108.             INNER JOIN in_product_balance C
  109.                 ON B.product_id = C.product_id
  110.                     AND A.serial_number = C.serial_number
  111.                     AND A.year_made = C.product_year_made
  112.                     AND A.expired_date = C.product_expired_date
  113.             WHERE vTenantId = B.tenant_id
  114.                 AND A.product_code = B.product_code
  115.         );  
  116.        
  117.     -- 5. tenant product balance harus sama
  118.     UPDATE up_put_away_item A
  119.     SET status = vFail,
  120.         message = message || 'Product balance tenant is different, '
  121.     WHERE A.upload_header_id = pUploadHeaderId
  122.         AND EXISTS (
  123.             SELECT 1
  124.             FROM  m_product B
  125.             INNER JOIN in_product_balance C
  126.                 ON B.product_id = C.product_id
  127.                     AND A.serial_number = C.serial_number
  128.                     AND A.year_made = C.product_year_made
  129.                     AND A.expired_date = C.product_expired_date
  130.             WHERE vTenantId = B.tenant_id
  131.                 AND A.product_code = B.product_code
  132.                 AND C.tenant_id <> vTenantId
  133.         );  
  134.        
  135.     -- 6. product balance stock harus ada
  136.     UPDATE up_put_away_item A
  137.     SET status = vFail,
  138.         message = message || 'Product balance stock not found, '
  139.     WHERE A.upload_header_id = pUploadHeaderId
  140.         AND NOT EXISTS (
  141.             SELECT 1
  142.             FROM  m_product B
  143.             INNER JOIN in_product_balance C
  144.                 ON B.product_id = C.product_id
  145.                     AND A.serial_number = C.serial_number
  146.                     AND A.year_made = C.product_year_made
  147.                     AND A.expired_date = C.product_expired_date
  148.                     AND C.tenant_id = vTenantId
  149.             INNER JOIN in_inventory D ON D.inventory_id = vInventoryId
  150.             INNER JOIN in_product_balance_stock E
  151.                 ON C.product_balance_id = E.product_balance_id
  152.                     AND E.warehouse_id = D.warehouse_from_id
  153.                     AND E.product_id = B.product_id
  154.                     AND E.product_status = A.product_status
  155.             WHERE vTenantId = B.tenant_id
  156.                 AND A.product_code = B.product_code
  157.         );  
  158.        
  159.     -- 7. tenant product balance stock harus sesuai
  160.     UPDATE up_put_away_item A
  161.     SET status = vFail,
  162.         message = message || 'Product balance stock not found, '
  163.     WHERE A.upload_header_id = pUploadHeaderId
  164.         AND EXISTS (
  165.             SELECT 1
  166.             FROM  m_product B
  167.             INNER JOIN in_product_balance C
  168.                 ON B.product_id = C.product_id
  169.                     AND A.serial_number = C.serial_number
  170.                     AND A.year_made = C.product_year_made
  171.                     AND A.expired_date = C.product_expired_date
  172.                     AND C.tenant_id = vTenantId
  173.             INNER JOIN in_inventory D ON D.inventory_id = vInventoryId
  174.             INNER JOIN in_product_balance_stock E
  175.                 ON C.product_balance_id = E.product_balance_id
  176.                     AND E.warehouse_id = D.warehouse_from_id
  177.                     AND E.product_id = B.product_id
  178.                     AND E.product_status = A.product_status
  179.             WHERE vTenantId = B.tenant_id
  180.                 AND A.product_code = B.product_code
  181.                 AND E.tenant_id <> vTenantId
  182.         );  
  183.        
  184.     -- 9. stok product balance stock setelah put away harus >= 0
  185.      WITH grouped_put_away_item AS(
  186.         SELECT E.product_balance_stock_id, SUM (A.qty_transfer::numeric) AS summed_qty_transfer
  187.         FROM up_put_away_item A  
  188.         INNER JOIN m_product B
  189.             ON vTenantId = B.tenant_id
  190.                 AND A.product_code = B.product_code
  191.         INNER JOIN in_product_balance C
  192.             ON B.product_id = C.product_id
  193.                 AND A.serial_number = C.serial_number
  194.                 AND A.year_made = C.product_year_made
  195.                 AND A.expired_date = C.product_expired_date
  196.                 AND C.tenant_id = vTenantId
  197.         INNER JOIN in_inventory D ON D.inventory_id = vInventoryId
  198.         INNER JOIN in_product_balance_stock E
  199.             ON C.product_balance_id = E.product_balance_id
  200.                 AND E.warehouse_id = D.warehouse_from_id
  201.                 AND E.product_id = B.product_id
  202.                 AND E.product_status = A.product_status
  203.                 AND E.tenant_id = vTenantId
  204.         AND A.upload_header_id = pUploadHeaderId
  205.         GROUP BY E.product_balance_stock_id
  206.     )
  207.     UPDATE up_put_away_item A
  208.     SET status = vFail,
  209.         message = message || 'Product balance stock not sufficient, '
  210.     WHERE A.upload_header_id = pUploadHeaderId
  211.         AND EXISTS (
  212.             SELECT 1
  213.             FROM  m_product B
  214.             INNER JOIN in_product_balance C
  215.                 ON B.product_id = C.product_id
  216.                     AND A.serial_number = C.serial_number
  217.                     AND A.year_made = C.product_year_made
  218.                     AND A.expired_date = C.product_expired_date
  219.                     AND C.tenant_id = vTenantId
  220.             INNER JOIN in_inventory D ON D.inventory_id = vInventoryId
  221.             INNER JOIN in_product_balance_stock E
  222.                 ON C.product_balance_id = E.product_balance_id
  223.                     AND E.warehouse_id = D.warehouse_from_id
  224.                     AND E.product_id = B.product_id
  225.                     AND E.product_status = A.product_status
  226.                     AND E.tenant_id = vTenantId
  227.             INNER JOIN grouped_put_away_item F ON E.product_balance_stock_id = F.product_balance_stock_id
  228.             WHERE vTenantId = B.tenant_id
  229.                 AND A.product_code = B.product_code
  230.                 AND E.qty - F.summed_qty_transfer < 0
  231.         );  
  232.    
  233.     -- 10. sub category product harus terdapat dalam item warehouse
  234.     UPDATE up_put_away_item A
  235.     SET status = vFail,
  236.         message = message || 'Product not authorized on destination warehouse, '
  237.     WHERE A.upload_header_id = pUploadHeaderId
  238.         AND NOT EXISTS (
  239.             SELECT 1
  240.             FROM  m_product B
  241.             INNER JOIN in_product_balance C ON B.product_id = C.product_id
  242.             INNER JOIN in_inventory D ON D.inventory_id = vInventoryId
  243.             INNER JOIN m_item_warehouse E ON B.sub_ctgr_product_id = E.sub_ctgr_product_id AND D.warehouse_to_id = E.warehouse_id AND vTenantId = E.tenant_id
  244.         );
  245.        
  246.     -- Update status non FAIL to OK
  247.     UPDATE up_put_away_item
  248.     SET status = vOk
  249.     WHERE upload_header_id = pUploadHeaderId
  250.         AND status = vEmpty;
  251.        
  252.     SELECT COALESCE( COUNT(1) , 0) INTO vCountFail
  253.     FROM up_put_away_item
  254.     WHERE upload_header_id = pUploadHeaderId
  255.         AND status = vFail;
  256.      
  257.     IF (vCountFail = 0 ) THEN
  258.    
  259.         RAISE NOTICE 'INSERT';
  260.        
  261.         -- UPDATE OK data to inventory item
  262.         -- if product exists
  263.         WITH grouped_put_away_item AS(
  264.             SELECT B.product_id, C.product_balance_id, A.product_status,
  265.             A.serial_number, A.expired_date, A.year_made, E.product_balance_stock_id,
  266.             SUM (A.qty_transfer::numeric) AS summed_qty_transfer
  267.             FROM up_put_away_item A  
  268.             INNER JOIN m_product B
  269.                 ON vTenantId = B.tenant_id
  270.                     AND A.product_code = B.product_code
  271.             INNER JOIN in_product_balance C
  272.                 ON B.product_id = C.product_id
  273.                     AND A.serial_number = C.serial_number
  274.                     AND A.year_made = C.product_year_made
  275.                     AND A.expired_date = C.product_expired_date
  276.                     AND C.tenant_id = vTenantId
  277.             INNER JOIN in_inventory D ON D.inventory_id = vInventoryId
  278.             INNER JOIN in_product_balance_stock E
  279.                 ON C.product_balance_id = E.product_balance_id
  280.                     AND E.warehouse_id = D.warehouse_from_id
  281.                     AND E.product_id = B.product_id
  282.                     AND E.product_status = A.product_status
  283.                     AND E.tenant_id = vTenantId
  284.             AND A.upload_header_id = pUploadHeaderId
  285.             AND A.status = vOk
  286.             GROUP BY B.product_id, C.product_balance_id, A.product_status,
  287.             A.serial_number, A.expired_date, A.year_made, E.product_balance_stock_id
  288.         )
  289.         UPDATE in_inventory_item F
  290.         SET qty_request = F.qty_request + A.summed_qty_transfer,
  291.             qty_realization = F.qty_realization + A.summed_qty_transfer,
  292.             update_user_id = vUserId,
  293.             update_datetime = vDatetime,
  294.             version = F.version + 1
  295.         FROM grouped_put_away_item A
  296.         WHERE F.inventory_id = vInventoryId
  297.             AND F.product_id = A.product_id
  298.             AND F.product_balance_id = A.product_balance_id
  299.             AND F.product_status = A.product_status
  300.             AND F.serial_number = A.serial_number
  301.             AND F.product_expired_date = A.expired_date
  302.             AND F.product_year_made = A.year_made
  303.             AND F.lot_number = vSpaceValue
  304.             AND F.ref_doc_type_id = vNullValueLong
  305.             AND F.ref_id = vNullValueLong
  306.             AND F.ref_item_id = A.product_balance_stock_id;
  307.        
  308.         -- INSERT OK data to inventory item
  309.         -- if product not exists
  310.         INSERT INTO in_inventory_item(
  311.             tenant_id, inventory_id, line_no,
  312.             product_id, product_balance_id, product_status,
  313.             serial_number, product_expired_date, product_year_made, lot_number,
  314.             ref_doc_type_id, ref_id, ref_item_id,
  315.             curr_code, amount,
  316.             base_uom_id, qty_request, qty_realization,
  317.             remark,
  318.             create_datetime, create_user_id, update_datetime, update_user_id, version)
  319.         SELECT vTenantId, vInventoryId, NEXTVAL('up_put_away_item_line_no_seq'),
  320.             B.product_id, C.product_balance_id, A.product_status,
  321.             A.serial_number, A.expired_date, A.year_made, vSpaceValue,
  322.             vNullValueLong, vNullValueLong, E.product_balance_stock_id,
  323.             vNullValueLong::character varying, vZero,
  324.             B.base_uom_id, A.qty_transfer::numeric, A.qty_transfer::numeric,
  325.             A.remark,
  326.             vDatetime, vUserId, vDatetime, vUserId, 0
  327.         FROM up_put_away_item A  
  328.         INNER JOIN m_product B
  329.             ON vTenantId = B.tenant_id
  330.                 AND A.product_code = B.product_code
  331.         INNER JOIN in_product_balance C
  332.             ON B.product_id = C.product_id
  333.                 AND A.serial_number = C.serial_number
  334.                 AND A.year_made = C.product_year_made
  335.                 AND A.expired_date = C.product_expired_date
  336.                 AND C.tenant_id = vTenantId
  337.         INNER JOIN in_inventory D ON D.inventory_id = vInventoryId
  338.         INNER JOIN in_product_balance_stock E
  339.             ON C.product_balance_id = E.product_balance_id
  340.                 AND E.warehouse_id = D.warehouse_from_id
  341.                 AND E.product_id = B.product_id
  342.                 AND E.product_status = A.product_status
  343.                 AND E.tenant_id = vTenantId
  344.         WHERE NOT EXISTS(
  345.             SELECT 1
  346.             FROM in_inventory_item F
  347.             WHERE F.inventory_id = vInventoryId
  348.                 AND F.product_id = B.product_id
  349.                 AND F.product_balance_id = C.product_balance_id
  350.                 AND F.product_status = A.product_status
  351.                 AND F.serial_number = A.serial_number
  352.                 AND F.product_expired_date = A.expired_date
  353.                 AND F.product_year_made = A.year_made
  354.                 AND F.lot_number = vSpaceValue
  355.                 AND F.ref_doc_type_id = vNullValueLong
  356.                 AND F.ref_id = vNullValueLong
  357.                 AND F.ref_item_id = E.product_balance_stock_id
  358.         )
  359.         AND A.upload_header_id = pUploadHeaderId
  360.         AND A.status = vOk;
  361.        
  362.         -- UPDATE OK data to in_product_balance_stock
  363.         WITH grouped_put_away_item AS(
  364.             SELECT E.product_balance_stock_id, SUM (A.qty_transfer::numeric) AS summed_qty_transfer
  365.             FROM up_put_away_item A  
  366.             INNER JOIN m_product B
  367.                 ON vTenantId = B.tenant_id
  368.                     AND A.product_code = B.product_code
  369.             INNER JOIN in_product_balance C
  370.                 ON B.product_id = C.product_id
  371.                     AND A.serial_number = C.serial_number
  372.                     AND A.year_made = C.product_year_made
  373.                     AND A.expired_date = C.product_expired_date
  374.                     AND C.tenant_id = vTenantId
  375.             INNER JOIN in_inventory D ON D.inventory_id = vInventoryId
  376.             INNER JOIN in_product_balance_stock E
  377.                 ON C.product_balance_id = E.product_balance_id
  378.                     AND E.warehouse_id = D.warehouse_from_id
  379.                     AND E.product_id = B.product_id
  380.                     AND E.product_status = A.product_status
  381.                     AND E.tenant_id = vTenantId
  382.             AND A.upload_header_id = pUploadHeaderId
  383.             AND A.status = vOk
  384.             GROUP BY E.product_balance_stock_id
  385.         )
  386.         UPDATE in_product_balance_stock Z
  387.         SET qty = Z.qty - A.summed_qty_transfer,
  388.             update_user_id = vUserId,
  389.             update_datetime = vDatetime,
  390.             version = Z.version + 1
  391.         FROM grouped_put_away_item A
  392.         WHERE Z.product_balance_stock_id = A.product_balance_stock_id;
  393.        
  394.         -- UPDATE in_inventory
  395.         UPDATE in_inventory Z
  396.         SET update_user_id = vUserId,
  397.             update_datetime = vDatetime,
  398.             version = Z.version + 1;
  399.        
  400.     END IF;
  401.      
  402.     RETURN vCountFail;
  403.      
  404. END;  
  405. $BODY$
  406.   LANGUAGE plpgsql VOLATILE
  407.   COST 100;
  408.   /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement