Advertisement
aadddrr

in_upload_put_away_item_20170928_2

Sep 28th, 2017
74
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. qty harus lebih besar dari 0
  44.     -- 2. product harus ada
  45.     -- 3. tenant product harus sesuai
  46.     -- 4. product harus active
  47.     -- 5. product balance harus ada
  48.     -- 6. tenant product balance harus sama
  49.     -- 7. product balance stock harus ada
  50.     -- 8. tenant product balance stock harus sesuai
  51.     -- 9. tidak boleh ada product balance stock yang sama
  52.     -- 10. stok product balance stock setelah put away harus >= 0
  53.     -- 11. sub category product harus terdapat dalam item warehouse
  54.      
  55.     --Update serial_number, year_made, expired_date empty menjadi space
  56.     UPDATE up_put_away_item A
  57.     SET serial_number = vSpaceValue,
  58.         year_made = vSpaceValue,
  59.         expired_date = vSpaceValue
  60.     WHERE A.upload_header_id = pUploadHeaderId
  61.         AND A.serial_number = vEmpty
  62.         AND A.year_made = vEmpty
  63.         AND A.expired_date = vEmpty;
  64.    
  65.     -- 1. qty harus lebih besar dari 0
  66.     UPDATE up_put_away_item A
  67.     SET status = vFail,
  68.         message = message || 'Qty must be greater than zero, '
  69.     WHERE A.upload_header_id = pUploadHeaderId
  70.         AND qty_transfer::numeric <= 0;
  71.        
  72.     -- 2. product harus ada
  73.     UPDATE up_put_away_item A
  74.     SET status = vFail,
  75.         message = message || 'Product not found, '
  76.     WHERE A.upload_header_id = pUploadHeaderId
  77.         AND NOT EXISTS (
  78.             SELECT 1
  79.             FROM  m_product B
  80.             WHERE A.product_code = B.product_code
  81.         );
  82.          
  83.     -- 3. tenant product harus sesuai
  84.     UPDATE up_put_away_item A
  85.     SET status = vFail,
  86.         message = message || 'Product tenant is different, '
  87.     WHERE A.upload_header_id = pUploadHeaderId
  88.         AND EXISTS (
  89.             SELECT 1
  90.             FROM  m_product B
  91.             WHERE A.product_code = B.product_code
  92.                 AND vTenantId <> B.tenant_id
  93.         );  
  94.        
  95.     -- 4. product harus active
  96.     UPDATE up_put_away_item A
  97.     SET status = vFail,
  98.         message = message || 'Product not active, '
  99.     WHERE A.upload_header_id = pUploadHeaderId
  100.         AND EXISTS (
  101.             SELECT 1
  102.             FROM  m_product B
  103.             WHERE A.product_code = B.product_code
  104.                 AND vTenantId = B.tenant_id
  105.                 AND B.active <> vYes
  106.         );  
  107.        
  108.     -- 5. product balance harus ada
  109.     UPDATE up_put_away_item A
  110.     SET status = vFail,
  111.         message = message || 'Product balance not found, '
  112.     WHERE A.upload_header_id = pUploadHeaderId
  113.         AND NOT EXISTS (
  114.             SELECT 1
  115.             FROM  m_product B
  116.             INNER JOIN in_product_balance C
  117.                 ON B.product_id = C.product_id
  118.                     AND A.serial_number = C.serial_number
  119.                     AND A.year_made = C.product_year_made
  120.                     AND A.expired_date = C.product_expired_date
  121.             WHERE vTenantId = B.tenant_id
  122.                 AND A.product_code = B.product_code
  123.         );  
  124.        
  125.     -- 6. tenant product balance harus sama
  126.     UPDATE up_put_away_item A
  127.     SET status = vFail,
  128.         message = message || 'Product balance tenant is different, '
  129.     WHERE A.upload_header_id = pUploadHeaderId
  130.         AND EXISTS (
  131.             SELECT 1
  132.             FROM  m_product B
  133.             INNER JOIN in_product_balance C
  134.                 ON B.product_id = C.product_id
  135.                     AND A.serial_number = C.serial_number
  136.                     AND A.year_made = C.product_year_made
  137.                     AND A.expired_date = C.product_expired_date
  138.             WHERE vTenantId = B.tenant_id
  139.                 AND A.product_code = B.product_code
  140.                 AND C.tenant_id <> vTenantId
  141.         );  
  142.        
  143.     -- 7. product balance stock harus ada
  144.     UPDATE up_put_away_item A
  145.     SET status = vFail,
  146.         message = message || 'Product balance stock not found, '
  147.     WHERE A.upload_header_id = pUploadHeaderId
  148.         AND NOT EXISTS (
  149.             SELECT 1
  150.             FROM  m_product B
  151.             INNER JOIN in_product_balance C
  152.                 ON B.product_id = C.product_id
  153.                     AND A.serial_number = C.serial_number
  154.                     AND A.year_made = C.product_year_made
  155.                     AND A.expired_date = C.product_expired_date
  156.                     AND C.tenant_id = vTenantId
  157.             INNER JOIN in_inventory D ON D.inventory_id = vInventoryId
  158.             INNER JOIN in_product_balance_stock E
  159.                 ON C.product_balance_id = E.product_balance_id
  160.                     AND E.warehouse_id = D.warehouse_from_id
  161.                     AND E.product_id = B.product_id
  162.                     AND E.product_status = A.product_status
  163.             WHERE vTenantId = B.tenant_id
  164.                 AND A.product_code = B.product_code
  165.         );  
  166.        
  167.     -- 8. tenant product balance stock harus sesuai
  168.     UPDATE up_put_away_item A
  169.     SET status = vFail,
  170.         message = message || 'Product balance stock not found, '
  171.     WHERE A.upload_header_id = pUploadHeaderId
  172.         AND EXISTS (
  173.             SELECT 1
  174.             FROM  m_product B
  175.             INNER JOIN in_product_balance C
  176.                 ON B.product_id = C.product_id
  177.                     AND A.serial_number = C.serial_number
  178.                     AND A.year_made = C.product_year_made
  179.                     AND A.expired_date = C.product_expired_date
  180.                     AND C.tenant_id = vTenantId
  181.             INNER JOIN in_inventory D ON D.inventory_id = vInventoryId
  182.             INNER JOIN in_product_balance_stock E
  183.                 ON C.product_balance_id = E.product_balance_id
  184.                     AND E.warehouse_id = D.warehouse_from_id
  185.                     AND E.product_id = B.product_id
  186.                     AND E.product_status = A.product_status
  187.             WHERE vTenantId = B.tenant_id
  188.                 AND A.product_code = B.product_code
  189.                 AND E.tenant_id <> vTenantId
  190.         );  
  191.    
  192.     -- 9. tidak boleh ada product balance stock yang sama
  193.     WITH grouped_put_away_item AS(
  194.         SELECT A.put_away_item_id, E.product_balance_stock_id
  195.         FROM up_put_away_item A  
  196.         INNER JOIN m_product B
  197.             ON vTenantId = B.tenant_id
  198.                 AND A.product_code = B.product_code
  199.         INNER JOIN in_product_balance C
  200.             ON B.product_id = C.product_id
  201.                 AND A.serial_number = C.serial_number
  202.                 AND A.year_made = C.product_year_made
  203.                 AND A.expired_date = C.product_expired_date
  204.                 AND C.tenant_id = vTenantId
  205.         INNER JOIN in_inventory D ON D.inventory_id = vInventoryId
  206.         INNER JOIN in_product_balance_stock E
  207.             ON C.product_balance_id = E.product_balance_id
  208.                 AND E.warehouse_id = D.warehouse_from_id
  209.                 AND E.product_id = B.product_id
  210.                 AND E.product_status = A.product_status
  211.                 AND E.tenant_id = vTenantId
  212.         AND A.upload_header_id = pUploadHeaderId
  213.         GROUP BY A.put_away_item_id, E.product_balance_stock_id
  214.     )
  215.     UPDATE up_put_away_item A
  216.     SET status = vFail,
  217.         message = message || 'Product balance stock is a duplicate, '
  218.     WHERE A.upload_header_id = pUploadHeaderId
  219.         AND EXISTS (
  220.             SELECT 1
  221.             FROM  m_product B
  222.             INNER JOIN in_product_balance C
  223.                 ON B.product_id = C.product_id
  224.                     AND A.serial_number = C.serial_number
  225.                     AND A.year_made = C.product_year_made
  226.                     AND A.expired_date = C.product_expired_date
  227.                     AND C.tenant_id = vTenantId
  228.             INNER JOIN in_inventory D ON D.inventory_id = vInventoryId
  229.             INNER JOIN in_product_balance_stock E
  230.                 ON C.product_balance_id = E.product_balance_id
  231.                     AND E.warehouse_id = D.warehouse_from_id
  232.                     AND E.product_id = B.product_id
  233.                     AND E.product_status = A.product_status
  234.                     AND E.tenant_id = vTenantId
  235.             INNER JOIN grouped_put_away_item F ON E.product_balance_stock_id = F.product_balance_stock_id
  236.             WHERE vTenantId = B.tenant_id
  237.                 AND A.product_code = B.product_code
  238.                 AND A.put_away_item_id <> F.put_away_item_id
  239.         );
  240.        
  241.     -- 10. stok product balance stock setelah put away harus >= 0
  242.     WITH grouped_put_away_item AS(
  243.         SELECT E.product_balance_stock_id, SUM (A.qty_transfer::numeric) AS summed_qty_transfer
  244.         FROM up_put_away_item A  
  245.         INNER JOIN m_product B
  246.             ON vTenantId = B.tenant_id
  247.                 AND A.product_code = B.product_code
  248.         INNER JOIN in_product_balance C
  249.             ON B.product_id = C.product_id
  250.                 AND A.serial_number = C.serial_number
  251.                 AND A.year_made = C.product_year_made
  252.                 AND A.expired_date = C.product_expired_date
  253.                 AND C.tenant_id = vTenantId
  254.         INNER JOIN in_inventory D ON D.inventory_id = vInventoryId
  255.         INNER JOIN in_product_balance_stock E
  256.             ON C.product_balance_id = E.product_balance_id
  257.                 AND E.warehouse_id = D.warehouse_from_id
  258.                 AND E.product_id = B.product_id
  259.                 AND E.product_status = A.product_status
  260.                 AND E.tenant_id = vTenantId
  261.         AND A.upload_header_id = pUploadHeaderId
  262.         GROUP BY E.product_balance_stock_id
  263.     )
  264.     UPDATE up_put_away_item A
  265.     SET status = vFail,
  266.         message = message || 'Product balance stock not sufficient, '
  267.     WHERE A.upload_header_id = pUploadHeaderId
  268.         AND EXISTS (
  269.             SELECT 1
  270.             FROM  m_product B
  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.             INNER JOIN grouped_put_away_item F ON E.product_balance_stock_id = F.product_balance_stock_id
  285.             WHERE vTenantId = B.tenant_id
  286.                 AND A.product_code = B.product_code
  287.                 AND E.qty - F.summed_qty_transfer < 0
  288.         );  
  289.    
  290.     -- 11. sub category product harus terdapat dalam item warehouse
  291.     UPDATE up_put_away_item A
  292.     SET status = vFail,
  293.         message = message || 'Product not authorized on destination warehouse, '
  294.     WHERE A.upload_header_id = pUploadHeaderId
  295.         AND NOT EXISTS (
  296.             SELECT 1
  297.             FROM  m_product B
  298.             INNER JOIN in_product_balance C ON B.product_id = C.product_id
  299.             INNER JOIN in_inventory D ON D.inventory_id = vInventoryId
  300.             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
  301.         );
  302.        
  303.     -- Update status non FAIL to OK
  304.     UPDATE up_put_away_item
  305.     SET status = vOk
  306.     WHERE upload_header_id = pUploadHeaderId
  307.         AND status = vEmpty;
  308.        
  309.     SELECT COALESCE( COUNT(1) , 0) INTO vCountFail
  310.     FROM up_put_away_item
  311.     WHERE upload_header_id = pUploadHeaderId
  312.         AND status = vFail;
  313.      
  314.     IF (vCountFail = 0 ) THEN
  315.    
  316.         RAISE NOTICE 'INSERT';
  317.        
  318.         -- UPDATE OK data to inventory item
  319.         -- if product exists
  320.         WITH grouped_put_away_item AS(
  321.             SELECT B.product_id, C.product_balance_id, A.product_status,
  322.             A.serial_number, A.expired_date, A.year_made, E.product_balance_stock_id,
  323.             SUM (A.qty_transfer::numeric) AS summed_qty_transfer
  324.             FROM up_put_away_item A  
  325.             INNER JOIN m_product B
  326.                 ON vTenantId = B.tenant_id
  327.                     AND A.product_code = B.product_code
  328.             INNER JOIN in_product_balance C
  329.                 ON B.product_id = C.product_id
  330.                     AND A.serial_number = C.serial_number
  331.                     AND A.year_made = C.product_year_made
  332.                     AND A.expired_date = C.product_expired_date
  333.                     AND C.tenant_id = vTenantId
  334.             INNER JOIN in_inventory D ON D.inventory_id = vInventoryId
  335.             INNER JOIN in_product_balance_stock E
  336.                 ON C.product_balance_id = E.product_balance_id
  337.                     AND E.warehouse_id = D.warehouse_from_id
  338.                     AND E.product_id = B.product_id
  339.                     AND E.product_status = A.product_status
  340.                     AND E.tenant_id = vTenantId
  341.             AND A.upload_header_id = pUploadHeaderId
  342.             AND A.status = vOk
  343.             GROUP BY B.product_id, C.product_balance_id, A.product_status,
  344.             A.serial_number, A.expired_date, A.year_made, E.product_balance_stock_id
  345.         )
  346.         UPDATE in_inventory_item F
  347.         SET qty_request = F.qty_request + A.summed_qty_transfer,
  348.             qty_realization = F.qty_realization + A.summed_qty_transfer,
  349.             update_user_id = vUserId,
  350.             update_datetime = vDatetime,
  351.             version = F.version + 1
  352.         FROM grouped_put_away_item A
  353.         WHERE F.inventory_id = vInventoryId
  354.             AND F.product_id = A.product_id
  355.             AND F.product_balance_id = A.product_balance_id
  356.             AND F.product_status = A.product_status
  357.             AND F.serial_number = A.serial_number
  358.             AND F.product_expired_date = A.expired_date
  359.             AND F.product_year_made = A.year_made
  360.             AND F.lot_number = vSpaceValue
  361.             AND F.ref_doc_type_id = vNullValueLong
  362.             AND F.ref_id = vNullValueLong
  363.             AND F.ref_item_id = A.product_balance_stock_id;
  364.        
  365.         -- INSERT OK data to inventory item
  366.         -- if product not exists
  367.         INSERT INTO in_inventory_item(
  368.             tenant_id, inventory_id, line_no,
  369.             product_id, product_balance_id, product_status,
  370.             serial_number, product_expired_date, product_year_made, lot_number,
  371.             ref_doc_type_id, ref_id, ref_item_id,
  372.             curr_code, amount,
  373.             base_uom_id, qty_request, qty_realization,
  374.             remark,
  375.             create_datetime, create_user_id, update_datetime, update_user_id, version)
  376.         SELECT vTenantId, vInventoryId, NEXTVAL('up_put_away_item_line_no_seq'),
  377.             B.product_id, C.product_balance_id, A.product_status,
  378.             A.serial_number, A.expired_date, A.year_made, vSpaceValue,
  379.             vNullValueLong, vNullValueLong, E.product_balance_stock_id,
  380.             vNullValueLong::character varying, vZero,
  381.             B.base_uom_id, A.qty_transfer::numeric, A.qty_transfer::numeric,
  382.             A.remark,
  383.             vDatetime, vUserId, vDatetime, vUserId, 0
  384.         FROM up_put_away_item A  
  385.         INNER JOIN m_product B
  386.             ON vTenantId = B.tenant_id
  387.                 AND A.product_code = B.product_code
  388.         INNER JOIN in_product_balance C
  389.             ON B.product_id = C.product_id
  390.                 AND A.serial_number = C.serial_number
  391.                 AND A.year_made = C.product_year_made
  392.                 AND A.expired_date = C.product_expired_date
  393.                 AND C.tenant_id = vTenantId
  394.         INNER JOIN in_inventory D ON D.inventory_id = vInventoryId
  395.         INNER JOIN in_product_balance_stock E
  396.             ON C.product_balance_id = E.product_balance_id
  397.                 AND E.warehouse_id = D.warehouse_from_id
  398.                 AND E.product_id = B.product_id
  399.                 AND E.product_status = A.product_status
  400.                 AND E.tenant_id = vTenantId
  401.         WHERE NOT EXISTS(
  402.             SELECT 1
  403.             FROM in_inventory_item F
  404.             WHERE F.inventory_id = vInventoryId
  405.                 AND F.product_id = B.product_id
  406.                 AND F.product_balance_id = C.product_balance_id
  407.                 AND F.product_status = A.product_status
  408.                 AND F.serial_number = A.serial_number
  409.                 AND F.product_expired_date = A.expired_date
  410.                 AND F.product_year_made = A.year_made
  411.                 AND F.lot_number = vSpaceValue
  412.                 AND F.ref_doc_type_id = vNullValueLong
  413.                 AND F.ref_id = vNullValueLong
  414.                 AND F.ref_item_id = E.product_balance_stock_id
  415.         )
  416.         AND A.upload_header_id = pUploadHeaderId
  417.         AND A.status = vOk;
  418.        
  419.         -- UPDATE OK data to in_product_balance_stock
  420.         WITH grouped_put_away_item AS(
  421.             SELECT E.product_balance_stock_id, SUM (A.qty_transfer::numeric) AS summed_qty_transfer
  422.             FROM up_put_away_item A  
  423.             INNER JOIN m_product B
  424.                 ON vTenantId = B.tenant_id
  425.                     AND A.product_code = B.product_code
  426.             INNER JOIN in_product_balance C
  427.                 ON B.product_id = C.product_id
  428.                     AND A.serial_number = C.serial_number
  429.                     AND A.year_made = C.product_year_made
  430.                     AND A.expired_date = C.product_expired_date
  431.                     AND C.tenant_id = vTenantId
  432.             INNER JOIN in_inventory D ON D.inventory_id = vInventoryId
  433.             INNER JOIN in_product_balance_stock E
  434.                 ON C.product_balance_id = E.product_balance_id
  435.                     AND E.warehouse_id = D.warehouse_from_id
  436.                     AND E.product_id = B.product_id
  437.                     AND E.product_status = A.product_status
  438.                     AND E.tenant_id = vTenantId
  439.             AND A.upload_header_id = pUploadHeaderId
  440.             AND A.status = vOk
  441.             GROUP BY E.product_balance_stock_id
  442.         )
  443.         UPDATE in_product_balance_stock Z
  444.         SET qty = Z.qty - A.summed_qty_transfer,
  445.             update_user_id = vUserId,
  446.             update_datetime = vDatetime,
  447.             version = Z.version + 1
  448.         FROM grouped_put_away_item A
  449.         WHERE Z.product_balance_stock_id = A.product_balance_stock_id;
  450.        
  451.         -- UPDATE in_inventory
  452.         UPDATE in_inventory Z
  453.         SET update_user_id = vUserId,
  454.             update_datetime = vDatetime,
  455.             version = Z.version + 1;
  456.        
  457.     END IF;
  458.      
  459.     RETURN vCountFail;
  460.      
  461. END;  
  462. $BODY$
  463.   LANGUAGE plpgsql VOLATILE
  464.   COST 100;
  465.   /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement