-- Rewrite identifying values in fpsms_demo. Does not delete rows. -- Ids, foreign keys, statuses, quantities, and dates stay. -- -- Run only against a disposable full copy of production: -- mysql -h127.0.0.1 -P3306 -uroot -p fpsms_demo < scripts/anonymize_demo_copy.sql -- -- Refuses to run unless the current database is fpsms_demo. -- Refuses to run again once settings.name = DEMO.anonymized.v1 exists. -- Password for every user, including demo / demo.stock / demo.prod, is Demo2026!. -- -- MySQL Workbench stops a query after 30 seconds and reports error 2013. -- Before running: Preferences, SQL Editor, DBMS connection read timeout = 3600. -- Reconnect, select fpsms_demo, then run this whole file. SET NAMES utf8mb4; SET SESSION sql_safe_updates = 0; SET SESSION group_concat_max_len = 1000000; DROP PROCEDURE IF EXISTS demo_exec_if_table; DROP PROCEDURE IF EXISTS demo_apply_map; DROP PROCEDURE IF EXISTS demo_apply_pair; DROP PROCEDURE IF EXISTS demo_add_missing; DROP PROCEDURE IF EXISTS demo_blank_columns; DROP PROCEDURE IF EXISTS demo_replace_floors; DROP PROCEDURE IF EXISTS demo_remap_shop_csv; DROP PROCEDURE IF EXISTS demo_drop_maps; DROP PROCEDURE IF EXISTS anonymize_demo_copy; DELIMITER $$ CREATE PROCEDURE demo_drop_maps() BEGIN DROP TABLE IF EXISTS _demo_map_item; DROP TABLE IF EXISTS _demo_map_shop; DROP TABLE IF EXISTS _demo_map_lot; DROP TABLE IF EXISTS _demo_map_loc; DROP TABLE IF EXISTS _demo_map_truck; DROP TABLE IF EXISTS _demo_map_do; DROP TABLE IF EXISTS _demo_map_po; DROP TABLE IF EXISTS _demo_map_jo; DROP TABLE IF EXISTS _demo_map_pk; DROP TABLE IF EXISTS _demo_map_si; DROP TABLE IF EXISTS _demo_map_st; DROP TABLE IF EXISTS _demo_map_pp; DROP TABLE IF EXISTS _demo_map_user; DROP TABLE IF EXISTS _demo_map_username; DROP TABLE IF EXISTS _demo_map_person; DROP TABLE IF EXISTS _demo_map_equip; DROP TABLE IF EXISTS _demo_map_stage; END$$ CREATE PROCEDURE demo_exec_if_table(IN p_table VARCHAR(64), IN p_sql TEXT) BEGIN DECLARE n INT DEFAULT 0; SELECT COUNT(*) INTO n FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = p_table; IF n > 0 THEN SET @demo_sql = p_sql; PREPARE demo_stmt FROM @demo_sql; EXECUTE demo_stmt; DEALLOCATE PREPARE demo_stmt; END IF; END$$ CREATE PROCEDURE demo_apply_map(IN p_table VARCHAR(64), IN p_column VARCHAR(64), IN p_map VARCHAR(64)) BEGIN DECLARE n INT DEFAULT 0; SELECT COUNT(*) INTO n FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = p_table AND column_name = p_column; IF n > 0 THEN SET @demo_sql = CONCAT( 'UPDATE `', p_table, '` t INNER JOIN `', p_map, '` m ', 'ON t.`', p_column, '` COLLATE utf8mb4_unicode_ci = m.old_value ', 'SET t.`', p_column, '` = m.new_value' ); PREPARE demo_stmt FROM @demo_sql; EXECUTE demo_stmt; DEALLOCATE PREPARE demo_stmt; END IF; END$$ CREATE PROCEDURE demo_apply_pair( IN p_table VARCHAR(64), IN p_code VARCHAR(64), IN p_name VARCHAR(64), IN p_map VARCHAR(64) ) BEGIN DECLARE ncode INT DEFAULT 0; DECLARE nname INT DEFAULT 0; SELECT COUNT(*) INTO ncode FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = p_table AND column_name = p_code; SELECT COUNT(*) INTO nname FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = p_table AND column_name = p_name; IF ncode > 0 AND nname > 0 THEN SET @demo_sql = CONCAT( 'UPDATE `', p_table, '` t INNER JOIN `', p_map, '` m ', 'ON t.`', p_code, '` COLLATE utf8mb4_unicode_ci = m.old_value ', 'SET t.`', p_code, '` = m.new_value, t.`', p_name, '` = m.new_name' ); PREPARE demo_stmt FROM @demo_sql; EXECUTE demo_stmt; DEALLOCATE PREPARE demo_stmt; ELSEIF ncode > 0 THEN CALL demo_apply_map(p_table, p_code, p_map); END IF; END$$ CREATE PROCEDURE demo_add_missing( IN p_map VARCHAR(64), IN p_table VARCHAR(64), IN p_column VARCHAR(64), IN p_prefix VARCHAR(24) ) demo_add_missing_body: BEGIN DECLARE n INT DEFAULT 0; SELECT COUNT(*) INTO n FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = p_table AND column_name = p_column; IF n = 0 THEN LEAVE demo_add_missing_body; END IF; DELETE FROM _demo_map_stage; SET @demo_sql = CONCAT( 'INSERT IGNORE INTO _demo_map_stage (old_value) ', 'SELECT DISTINCT `', p_column, '` FROM `', p_table, '` ', 'WHERE `', p_column, '` IS NOT NULL AND `', p_column, '` <> ''''' ); PREPARE demo_stmt FROM @demo_sql; EXECUTE demo_stmt; DEALLOCATE PREPARE demo_stmt; SET @demo_sql = CONCAT( 'DELETE s FROM _demo_map_stage s INNER JOIN `', p_map, '` m ', 'ON m.old_value = s.old_value' ); PREPARE demo_stmt FROM @demo_sql; EXECUTE demo_stmt; DEALLOCATE PREPARE demo_stmt; SET @demo_sql = CONCAT( 'INSERT INTO `', p_map, '` (old_value, new_value) ', 'SELECT old_value, CONCAT(''', p_prefix, ''', rn) FROM (', ' SELECT old_value, ROW_NUMBER() OVER (ORDER BY old_value) AS rn FROM _demo_map_stage', ') numbered' ); PREPARE demo_stmt FROM @demo_sql; EXECUTE demo_stmt; DEALLOCATE PREPARE demo_stmt; END$$ CREATE PROCEDURE demo_blank_columns() BEGIN DECLARE done INT DEFAULT 0; DECLARE tname VARCHAR(64); DECLARE cname VARCHAR(64); DECLARE cur CURSOR FOR SELECT table_name, column_name FROM information_schema.columns WHERE table_schema = DATABASE() AND data_type IN ('varchar', 'char', 'text', 'tinytext', 'mediumtext', 'longtext') AND table_name NOT LIKE '\_demo\_map\_%' AND table_name NOT IN ('settings', 'DATABASECHANGELOG', 'DATABASECHANGELOGLOCK', 'authority', 'uom_conversion', 'currency') AND LOWER(column_name) IN ( 'remarks', 'remark', 'reason', 'issue_remark', 'errormessage', 'addr1', 'addr2', 'addr3', 'addr4', 'contactno', 'contactemail', 'contactname', 'brno', 'district', 'phone1', 'phone2', 'staffno', 'department', 'title', 'sendermail', 'tomail', 'subject', 'content', 'districtreference', 'countryoforigin', 'dnno', 'invoiceno', 'subjectcht', 'subjecteng', 'contentcht', 'contenteng' ); DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; OPEN cur; blank_loop: LOOP FETCH cur INTO tname, cname; IF done = 1 THEN LEAVE blank_loop; END IF; SET @demo_sql = CONCAT( 'UPDATE `', tname, '` SET `', cname, '` = '''' WHERE `', cname, '` IS NOT NULL AND `', cname, '` <> ''''' ); PREPARE demo_stmt FROM @demo_sql; EXECUTE demo_stmt; DEALLOCATE PREPARE demo_stmt; END LOOP; CLOSE cur; END$$ CREATE PROCEDURE demo_replace_floors() BEGIN DECLARE done INT DEFAULT 0; DECLARE tname VARCHAR(64); DECLARE cname VARCHAR(64); DECLARE cset VARCHAR(64); DECLARE bincol VARCHAR(64); DECLARE cur CURSOR FOR SELECT table_name, column_name, character_set_name FROM information_schema.columns WHERE table_schema = DATABASE() AND data_type IN ('varchar', 'char', 'text', 'tinytext', 'mediumtext', 'longtext') AND table_name NOT LIKE '\_demo\_map\_%' AND table_name NOT IN ('DATABASECHANGELOG', 'DATABASECHANGELOGLOCK', 'authority'); DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; OPEN cur; floor_loop: LOOP FETCH cur INTO tname, cname, cset; IF done = 1 THEN LEAVE floor_loop; END IF; SET bincol = IF(cset = 'utf8mb4', 'utf8mb4_bin', 'utf8mb3_bin'); SET @demo_sql = CONCAT( 'UPDATE `', tname, '` SET `', cname, '` = CASE ', 'WHEN UPPER(TRIM(`', cname, '`)) COLLATE ', bincol, ' = ''2/F'' THEN ''A/F'' ', 'WHEN UPPER(TRIM(`', cname, '`)) COLLATE ', bincol, ' = ''4/F'' THEN ''B/F'' ', 'WHEN UPPER(TRIM(`', cname, '`)) COLLATE ', bincol, ' = ''1/F'' THEN ''C/F'' ', 'WHEN UPPER(TRIM(`', cname, '`)) COLLATE ', bincol, ' = ''3/F'' THEN ''D/F'' ', 'WHEN UPPER(TRIM(`', cname, '`)) COLLATE ', bincol, ' = ''2F'' THEN ''AF'' ', 'WHEN UPPER(TRIM(`', cname, '`)) COLLATE ', bincol, ' = ''4F'' THEN ''BF'' ', 'WHEN UPPER(TRIM(`', cname, '`)) COLLATE ', bincol, ' = ''1F'' THEN ''CF'' ', 'WHEN UPPER(TRIM(`', cname, '`)) COLLATE ', bincol, ' = ''3F'' THEN ''DF'' ', 'ELSE `', cname, '` END ', 'WHERE UPPER(TRIM(`', cname, '`)) COLLATE ', bincol, ' IN (''2/F'',''4/F'',''1/F'',''3/F'',''2F'',''4F'',''1F'',''3F'')' ); PREPARE demo_stmt FROM @demo_sql; EXECUTE demo_stmt; DEALLOCATE PREPARE demo_stmt; SET @demo_sql = CONCAT( 'UPDATE `', tname, '` SET `', cname, '` = ', 'REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(`', cname, '`, ', '''-2F-'', ''-AF-''), ''-4F-'', ''-BF-''), ''-1F-'', ''-CF-''), ''-3F-'', ''-DF-''), ', '''-2/F-'', ''-A/F-''), ''-4/F-'', ''-B/F-''), ''-1/F-'', ''-C/F-''), ''-3/F-'', ''-D/F-'') ', 'WHERE `', cname, '` COLLATE ', bincol, ' LIKE ''%-2F-%'' OR `', cname, '` COLLATE ', bincol, ' LIKE ''%-4F-%'' ', 'OR `', cname, '` COLLATE ', bincol, ' LIKE ''%-1F-%'' OR `', cname, '` COLLATE ', bincol, ' LIKE ''%-3F-%'' ', 'OR `', cname, '` COLLATE ', bincol, ' LIKE ''%-2/F-%'' OR `', cname, '` COLLATE ', bincol, ' LIKE ''%-4/F-%'' ', 'OR `', cname, '` COLLATE ', bincol, ' LIKE ''%-1/F-%'' OR `', cname, '` COLLATE ', bincol, ' LIKE ''%-3/F-%''' ); PREPARE demo_stmt FROM @demo_sql; EXECUTE demo_stmt; DEALLOCATE PREPARE demo_stmt; END LOOP; CLOSE cur; END$$ CREATE PROCEDURE demo_remap_shop_csv(IN p_setting VARCHAR(255)) demo_remap_shop_csv_body: BEGIN DECLARE done INT DEFAULT 0; DECLARE v LONGTEXT; DECLARE oldv VARCHAR(255); DECLARE newv VARCHAR(255); DECLARE setting_rows INT DEFAULT 0; DECLARE cur CURSOR FOR SELECT old_value, new_value FROM _demo_map_shop ORDER BY CHAR_LENGTH(old_value) DESC, old_value; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; SELECT COUNT(*) INTO setting_rows FROM settings WHERE name = p_setting COLLATE utf8mb4_0900_ai_ci; IF setting_rows = 0 THEN LEAVE demo_remap_shop_csv_body; END IF; SELECT IFNULL(value, '') INTO v FROM settings WHERE name = p_setting COLLATE utf8mb4_0900_ai_ci LIMIT 1; IF v IS NULL OR v COLLATE utf8mb4_0900_ai_ci = '' THEN LEAVE demo_remap_shop_csv_body; END IF; SET v = CONCAT(',', REPLACE(v, ' ', ''), ','); OPEN cur; shop_csv_loop: LOOP FETCH cur INTO oldv, newv; IF done = 1 THEN LEAVE shop_csv_loop; END IF; SET v = REPLACE( v COLLATE utf8mb4_bin, CONCAT(',', oldv COLLATE utf8mb4_bin, ','), CONCAT(',', newv COLLATE utf8mb4_bin, ',') ); END LOOP; CLOSE cur; SET v = TRIM(BOTH ',' FROM v); UPDATE settings SET value = IFNULL(v, '') WHERE name = p_setting COLLATE utf8mb4_0900_ai_ci; END$$ CREATE PROCEDURE anonymize_demo_copy() BEGIN DECLARE marker_count INT DEFAULT 0; DECLARE demo_id BIGINT DEFAULT NULL; DECLARE stock_id BIGINT DEFAULT NULL; DECLARE prod_id BIGINT DEFAULT NULL; DECLARE pwd_hash VARCHAR(80) DEFAULT '$2a$10$9eqxnNGtxFADAW9AbbjRIevr8YWgBqkLr//23U6qYOWs5U9figE2u'; DECLARE CONTINUE HANDLER FOR NOT FOUND SET demo_id = demo_id; DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK; CALL demo_drop_maps(); RESIGNAL; END; IF DATABASE() IS NULL OR DATABASE() <> 'fpsms_demo' THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Refusing to anonymize: current database is not fpsms_demo'; END IF; SELECT COUNT(*) INTO marker_count FROM settings WHERE name = 'DEMO.anonymized.v1'; IF marker_count > 0 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Refusing to anonymize: DEMO.anonymized.v1 already exists'; END IF; CALL demo_drop_maps(); CREATE TABLE _demo_map_stage ( old_value VARCHAR(512) NOT NULL, PRIMARY KEY (old_value) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE _demo_map_item ( old_value VARCHAR(255) NOT NULL, new_value VARCHAR(255) NOT NULL, new_name VARCHAR(255) NOT NULL, PRIMARY KEY (old_value) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE _demo_map_shop ( old_value VARCHAR(255) NOT NULL, new_value VARCHAR(255) NOT NULL, new_name VARCHAR(255) NOT NULL, PRIMARY KEY (old_value) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE _demo_map_lot ( old_value VARCHAR(512) NOT NULL, new_value VARCHAR(64) NOT NULL, PRIMARY KEY (old_value) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE _demo_map_loc ( old_value VARCHAR(512) NOT NULL, new_value VARCHAR(64) NOT NULL, PRIMARY KEY (old_value) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE _demo_map_truck ( old_value VARCHAR(255) NOT NULL, new_value VARCHAR(64) NOT NULL, PRIMARY KEY (old_value) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE _demo_map_do ( old_value VARCHAR(255) NOT NULL, new_value VARCHAR(64) NOT NULL, PRIMARY KEY (old_value) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE _demo_map_po ( old_value VARCHAR(255) NOT NULL, new_value VARCHAR(64) NOT NULL, PRIMARY KEY (old_value) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE _demo_map_jo ( old_value VARCHAR(255) NOT NULL, new_value VARCHAR(64) NOT NULL, PRIMARY KEY (old_value) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE _demo_map_pk ( old_value VARCHAR(255) NOT NULL, new_value VARCHAR(64) NOT NULL, PRIMARY KEY (old_value) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE _demo_map_si ( old_value VARCHAR(255) NOT NULL, new_value VARCHAR(64) NOT NULL, PRIMARY KEY (old_value) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE _demo_map_st ( old_value VARCHAR(255) NOT NULL, new_value VARCHAR(64) NOT NULL, PRIMARY KEY (old_value) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE _demo_map_pp ( old_value VARCHAR(255) NOT NULL, new_value VARCHAR(64) NOT NULL, PRIMARY KEY (old_value) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE _demo_map_equip ( old_value VARCHAR(255) NOT NULL, new_value VARCHAR(64) NOT NULL, PRIMARY KEY (old_value) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE _demo_map_user ( user_id BIGINT NOT NULL, old_username VARCHAR(255) NULL, new_username VARCHAR(255) NOT NULL, old_name VARCHAR(255) NULL, new_name VARCHAR(255) NOT NULL, PRIMARY KEY (user_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE _demo_map_username ( old_value VARCHAR(255) NOT NULL, new_value VARCHAR(255) NOT NULL, PRIMARY KEY (old_value) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE _demo_map_person ( old_value VARCHAR(255) NOT NULL, new_value VARCHAR(255) NOT NULL, PRIMARY KEY (old_value) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; SELECT u.id INTO demo_id FROM `user` u JOIN user_authority ua ON ua.userId = u.id JOIN authority a ON a.id = ua.authId WHERE a.authority = 'ADMIN' ORDER BY u.deleted, u.id LIMIT 1; IF demo_id IS NULL THEN SELECT id INTO demo_id FROM `user` ORDER BY deleted, id LIMIT 1; END IF; SELECT u.id INTO stock_id FROM `user` u WHERE u.id <> IFNULL(demo_id, -1) AND EXISTS ( SELECT 1 FROM user_authority ua JOIN authority a ON a.id = ua.authId WHERE ua.userId = u.id AND a.authority = 'STOCK' ) AND NOT EXISTS ( SELECT 1 FROM user_authority ua JOIN authority a ON a.id = ua.authId WHERE ua.userId = u.id AND a.authority = 'ADMIN' ) ORDER BY u.deleted, u.id LIMIT 1; SELECT u.id INTO prod_id FROM `user` u WHERE u.id <> IFNULL(demo_id, -1) AND u.id <> IFNULL(stock_id, -1) AND EXISTS ( SELECT 1 FROM user_authority ua JOIN authority a ON a.id = ua.authId WHERE ua.userId = u.id AND a.authority = 'PROD' ) AND NOT EXISTS ( SELECT 1 FROM user_authority ua JOIN authority a ON a.id = ua.authId WHERE ua.userId = u.id AND a.authority = 'ADMIN' ) ORDER BY u.deleted, u.id LIMIT 1; INSERT INTO _demo_map_user (user_id, old_username, new_username, old_name, new_name) SELECT id, NULLIF(username, ''), CASE WHEN id = demo_id THEN 'demo' WHEN id = stock_id THEN 'demo.stock' WHEN id = prod_id THEN 'demo.prod' ELSE CONCAT('USER-', id) END, NULLIF(name, ''), CASE WHEN id = demo_id THEN 'Demo' WHEN id = stock_id THEN 'Demo Stock' WHEN id = prod_id THEN 'Demo Prod' ELSE CONCAT('User ', id) END FROM `user`; INSERT INTO _demo_map_username (old_value, new_value) SELECT old_username, MIN(new_username) FROM _demo_map_user WHERE old_username IS NOT NULL GROUP BY old_username; INSERT INTO _demo_map_person (old_value, new_value) SELECT old_name, MIN(new_name) FROM _demo_map_user WHERE old_name IS NOT NULL GROUP BY old_name; INSERT INTO _demo_map_item (old_value, new_value, new_name) SELECT code, CONCAT('ITEM-', MIN(id)), CONCAT('Item ', MIN(id)) FROM items WHERE code IS NOT NULL AND code <> '' GROUP BY code; INSERT INTO _demo_map_shop (old_value, new_value, new_name) SELECT code, CONCAT('SHOP-', MIN(id)), CONCAT('Shop ', MIN(id)) FROM shop WHERE code IS NOT NULL AND code <> '' GROUP BY code; INSERT INTO _demo_map_lot (old_value, new_value) SELECT lotNo, CONCAT('LOT-', MIN(id)) FROM inventory_lot WHERE lotNo IS NOT NULL AND lotNo <> '' GROUP BY lotNo; CALL demo_add_missing('_demo_map_lot', 'stock_in_line', 'lotNo', 'LOT-S'); CALL demo_add_missing('_demo_map_lot', 'stock_in_line', 'productLotNo', 'LOT-P'); CALL demo_add_missing('_demo_map_lot', 'delivery_order_line', 'm18Lot', 'LOT-M'); CALL demo_add_missing('_demo_map_lot', 'stocktakerecord', 'lotNo', 'LOT-T'); CALL demo_add_missing('_demo_map_lot', 'stock_adjustment_record', 'lotNo', 'LOT-A'); CALL demo_add_missing('_demo_map_lot', 'stock_transfer_record', 'lotNo', 'LOT-R'); CALL demo_add_missing('_demo_map_lot', 'item_lot_trace_log', 'lotNo', 'LOT-L'); CALL demo_add_missing('_demo_map_lot', 'bag_lot_line', 'lotNo', 'LOT-B'); CALL demo_add_missing('_demo_map_lot', 'pick_execution_issue', 'lot_no', 'LOT-I'); INSERT INTO _demo_map_loc (old_value, new_value) SELECT code, CASE code WHEN '2F-W202-01-00' THEN 'LOC-HOLD' WHEN '2F-W200-#A-00' THEN 'LOC-WIP' ELSE CONCAT('LOC-', MIN(id)) END FROM warehouse WHERE code IS NOT NULL AND code <> '' AND UPPER(REPLACE(code, ' ', '')) NOT IN ('2/F', '2F', '4/F', '4F', '1/F', '1F', '3/F', '3F') GROUP BY code; CALL demo_add_missing('_demo_map_loc', 'items', 'LocationCode', 'LOC-I'); CALL demo_add_missing('_demo_map_loc', 'stock_transfer_record', 'startLocation', 'LOC-S'); CALL demo_add_missing('_demo_map_loc', 'stock_transfer_record', 'targetLocation', 'LOC-T'); CALL demo_add_missing('_demo_map_loc', 'pick_execution_issue', 'store_location', 'LOC-P'); DELETE FROM _demo_map_loc WHERE UPPER(REPLACE(old_value, ' ', '')) IN ('2/F', '2F', '4/F', '4F', '1/F', '1F', '3/F', '3F'); INSERT INTO _demo_map_loc (old_value, new_value) VALUES ('2F-W202-01-00', 'LOC-HOLD'), ('2F-W200-#A-00', 'LOC-WIP'), ('4F-W402-01-00', 'LOC-X01'), ('4F-W402-02-00', 'LOC-X02'), ('4F-W402-03-00', 'LOC-X03'), ('4F-W402-04-00', 'LOC-X04'), ('4F-W402-05-00', 'LOC-X05'), ('4F-W402-#A-00', 'LOC-X06'), ('4F-W402-#B-00', 'LOC-X07'), ('4F-W402-#C-00', 'LOC-X08'), ('4F-W402-#D-00', 'LOC-X09'), ('4F-W402-#E-00', 'LOC-X10'), ('4F-W402-#F-00', 'LOC-X11'), ('4F-W402-#G-00', 'LOC-X12'), ('4F-W402-#H-00', 'LOC-X13'), ('4F-W402-#I-00', 'LOC-X14'), ('4F-W402-#J-00', 'LOC-X15'), ('4F-W402-#K-00', 'LOC-X16'), ('4F-W402-#L-00', 'LOC-X17'), ('4F-W402-#M-00', 'LOC-X18'), ('4F-W402-#N-00', 'LOC-X19'), ('4F-W402-#O-00', 'LOC-X20'), ('4F-W402-#P-00', 'LOC-X21'), ('4F-W402-#Q-00', 'LOC-X22'), ('4F-W402-#R-00', 'LOC-X23'), ('4F-W402-#S-00', 'LOC-X24') ON DUPLICATE KEY UPDATE new_value = VALUES(new_value); INSERT INTO _demo_map_truck (old_value, new_value) SELECT TruckLanceCode, CONCAT('TRUCK-', MIN(id)) FROM truck WHERE TruckLanceCode IS NOT NULL AND TruckLanceCode <> '' GROUP BY TruckLanceCode; CALL demo_add_missing('_demo_map_truck', 'truck_lane_version', 'truckLanceCode', 'TRUCK-V'); CALL demo_add_missing('_demo_map_truck', 'truck_lane_version_line', 'truckLanceCode', 'TRUCK-L'); CALL demo_add_missing('_demo_map_truck', 'truck_lane_schedule_line', 'fromTruckLanceCode', 'TRUCK-F'); CALL demo_add_missing('_demo_map_truck', 'truck_lane_schedule_line', 'toTruckLanceCode', 'TRUCK-T'); CALL demo_add_missing('_demo_map_truck', 'delivery_order_pick_order', 'truckLanceCode', 'TRUCK-D'); CALL demo_add_missing('_demo_map_truck', 'do_pick_order', 'TruckLanceCode', 'TRUCK-O'); CALL demo_add_missing('_demo_map_truck', 'do_pick_order_record', 'TruckLanceCode', 'TRUCK-R'); CALL demo_add_missing('_demo_map_truck', 'do_replenishment', 'truckLaneCode', 'TRUCK-P'); INSERT INTO _demo_map_do (old_value, new_value) SELECT code, CONCAT('DO-', MIN(id)) FROM delivery_order WHERE code IS NOT NULL AND code <> '' GROUP BY code; INSERT INTO _demo_map_po (old_value, new_value) SELECT code, CONCAT('PO-', MIN(id)) FROM purchase_order WHERE code IS NOT NULL AND code <> '' GROUP BY code; INSERT INTO _demo_map_jo (old_value, new_value) SELECT code, CONCAT('JO-', MIN(id)) FROM job_order WHERE code IS NOT NULL AND code <> '' GROUP BY code; INSERT INTO _demo_map_pk (old_value, new_value) SELECT code, CONCAT('PK-', MIN(id)) FROM pick_order WHERE code IS NOT NULL AND code <> '' GROUP BY code; INSERT INTO _demo_map_si (old_value, new_value) SELECT code, CONCAT('SI-', MIN(id)) FROM stock_in WHERE code IS NOT NULL AND code <> '' GROUP BY code; INSERT INTO _demo_map_st (old_value, new_value) SELECT code, CONCAT('ST-', MIN(id)) FROM stock_take WHERE code IS NOT NULL AND code <> '' GROUP BY code; INSERT INTO _demo_map_pp (old_value, new_value) SELECT productprocesscode, CONCAT('PP-', MIN(id)) FROM productprocess WHERE productprocesscode IS NOT NULL AND productprocesscode <> '' GROUP BY productprocesscode; INSERT INTO _demo_map_equip (old_value, new_value) SELECT code, CONCAT('EQ-', MIN(id)) FROM equipment WHERE code IS NOT NULL AND code <> '' GROUP BY code; START TRANSACTION; UPDATE items i LEFT JOIN _demo_map_item m ON i.code COLLATE utf8mb4_unicode_ci = m.old_value SET i.code = COALESCE(m.new_value, CONCAT('ITEM-', i.id)), i.name = COALESCE(m.new_name, CONCAT('Item ', i.id)), i.description = COALESCE(m.new_name, CONCAT('Item ', i.id)), i.remarks = '', i.countryOfOrigin = ''; UPDATE shop s JOIN _demo_map_shop m ON s.code COLLATE utf8mb4_unicode_ci = m.old_value SET s.code = m.new_value, s.name = m.new_name, s.brNo = '', s.contactNo = '', s.contactEmail = '', s.contactName = '', s.addr1 = '', s.addr2 = '', s.addr3 = '', s.addr4 = '', s.district = ''; UPDATE shop SET code = CONCAT('SHOP-', id), name = CONCAT('Shop ', id), brNo = '', contactNo = '', contactEmail = '', contactName = '', addr1 = '', addr2 = '', addr3 = '', addr4 = '', district = '' WHERE code IS NULL OR code = ''; CALL demo_apply_pair('truck', 'ShopCode', 'ShopName', '_demo_map_shop'); CALL demo_apply_pair('truck_lane_schedule_line', 'shopCode', 'shopName', '_demo_map_shop'); CALL demo_apply_pair('delivery_order_pick_order', 'shopCode', 'shopName', '_demo_map_shop'); CALL demo_apply_pair('do_pick_order', 'ShopCode', 'ShopName', '_demo_map_shop'); CALL demo_apply_pair('do_pick_order_record', 'ShopCode', 'ShopName', '_demo_map_shop'); CALL demo_apply_pair('do_replenishment', 'shopCode', 'shopName', '_demo_map_shop'); CALL demo_apply_pair('truck_lane_version_line', 'shopCode', 'branchName', '_demo_map_shop'); CALL demo_apply_map('truck', 'ShopCode', '_demo_map_shop'); CALL demo_apply_map('do_replenishment', 'shopCode', '_demo_map_shop'); CALL demo_apply_pair('do_replenishment', 'itemNo', 'itemName', '_demo_map_item'); CALL demo_apply_pair('stock_transfer_record', 'itemCode', 'itemName', '_demo_map_item'); CALL demo_apply_pair('stocktakerecord', 'itemCode', 'itemName', '_demo_map_item'); CALL demo_apply_pair('bag', 'itemCode', 'itemName', '_demo_map_item'); CALL demo_apply_map('purchase_order_line', 'itemNo', '_demo_map_item'); CALL demo_apply_map('delivery_order_line', 'itemNo', '_demo_map_item'); CALL demo_apply_map('stock_in_line', 'itemNo', '_demo_map_item'); CALL demo_apply_map('do_replenishment', 'itemNo', '_demo_map_item'); CALL demo_apply_map('stock_ledger', 'itemCode', '_demo_map_item'); CALL demo_apply_map('stocktakerecord', 'itemCode', '_demo_map_item'); CALL demo_apply_map('stock_adjustment_record', 'itemCode', '_demo_map_item'); CALL demo_apply_map('stock_transfer_record', 'itemCode', '_demo_map_item'); CALL demo_apply_map('item_lot_trace_log', 'itemCode', '_demo_map_item'); CALL demo_apply_map('item_default_shelf_life', 'itemCode', '_demo_map_item'); CALL demo_apply_map('coffee_or_tea', 'itemCode', '_demo_map_item'); CALL demo_apply_map('onpack_template_file', 'itemCode', '_demo_map_item'); CALL demo_apply_map('onpack_expiry_item_code', 'itemCode', '_demo_map_item'); CALL demo_apply_map('bag', 'itemCode', '_demo_map_item'); CALL demo_apply_map('jo_pick_order', 'itemCode', '_demo_map_item'); CALL demo_apply_map('jo_pick_order_record', 'itemCode', '_demo_map_item'); CALL demo_apply_map('pick_execution_issue', 'item_code', '_demo_map_item'); CALL demo_apply_map('m18_cunit', 'itemNo', '_demo_map_item'); CALL demo_apply_map('inventory_lot', 'lotNo', '_demo_map_lot'); CALL demo_apply_map('stock_in_line', 'lotNo', '_demo_map_lot'); CALL demo_apply_map('stock_in_line', 'productLotNo', '_demo_map_lot'); CALL demo_apply_map('delivery_order_line', 'm18Lot', '_demo_map_lot'); CALL demo_apply_map('stocktakerecord', 'lotNo', '_demo_map_lot'); CALL demo_apply_map('stock_adjustment_record', 'lotNo', '_demo_map_lot'); CALL demo_apply_map('stock_transfer_record', 'lotNo', '_demo_map_lot'); CALL demo_apply_map('item_lot_trace_log', 'lotNo', '_demo_map_lot'); CALL demo_apply_map('bag_lot_line', 'lotNo', '_demo_map_lot'); CALL demo_apply_map('pick_execution_issue', 'lot_no', '_demo_map_lot'); UPDATE warehouse w LEFT JOIN _demo_map_loc m ON w.code COLLATE utf8mb4_unicode_ci = m.old_value SET w.code = COALESCE(m.new_value, CONCAT('LOC-', w.id)), w.name = LEFT(COALESCE(m.new_value, CONCAT('LOC-', w.id)), 30), w.description = LEFT(COALESCE(m.new_value, CONCAT('LOC-', w.id)), 30), w.warehouse = NULL, w.area = NULL, w.slot = NULL, w.stockTakeSection = NULL, w.stockTakeSectionDescription = NULL; CALL demo_apply_map('items', 'LocationCode', '_demo_map_loc'); CALL demo_apply_map('stock_transfer_record', 'startLocation', '_demo_map_loc'); CALL demo_apply_map('stock_transfer_record', 'targetLocation', '_demo_map_loc'); CALL demo_apply_map('pick_execution_issue', 'store_location', '_demo_map_loc'); UPDATE items SET warehouse = NULL, area = NULL, slot = NULL; UPDATE warehouse SET `order` = CASE WHEN `order` REGEXP '^2F-[0-9]+$' THEN CONCAT('AF-', SUBSTRING(`order`, 4)) WHEN `order` REGEXP '^4F-[0-9]+$' THEN CONCAT('BF-', SUBSTRING(`order`, 4)) WHEN `order` REGEXP '^1F-[0-9]+$' THEN CONCAT('CF-', SUBSTRING(`order`, 4)) WHEN `order` REGEXP '^3F-[0-9]+$' THEN CONCAT('DF-', SUBSTRING(`order`, 4)) ELSE `order` END; CALL demo_apply_map('truck', 'TruckLanceCode', '_demo_map_truck'); CALL demo_apply_map('truck_lane_version', 'truckLanceCode', '_demo_map_truck'); CALL demo_apply_map('truck_lane_version_line', 'truckLanceCode', '_demo_map_truck'); CALL demo_apply_map('truck_lane_schedule_line', 'fromTruckLanceCode', '_demo_map_truck'); CALL demo_apply_map('truck_lane_schedule_line', 'toTruckLanceCode', '_demo_map_truck'); CALL demo_apply_map('delivery_order_pick_order', 'truckLanceCode', '_demo_map_truck'); CALL demo_apply_map('do_pick_order', 'TruckLanceCode', '_demo_map_truck'); CALL demo_apply_map('do_pick_order_record', 'TruckLanceCode', '_demo_map_truck'); CALL demo_apply_map('do_replenishment', 'truckLaneCode', '_demo_map_truck'); CALL demo_apply_map('delivery_order', 'code', '_demo_map_do'); CALL demo_apply_map('do_pick_order', 'delivery_order_code', '_demo_map_do'); CALL demo_apply_map('do_pick_order_record', 'delivery_order_code', '_demo_map_do'); CALL demo_apply_map('do_pick_order_line', 'delivery_order_code', '_demo_map_do'); CALL demo_apply_map('do_pick_order_line_record', 'delivery_order_code', '_demo_map_do'); CALL demo_apply_map('stock_out', 'deliveryOrderCode', '_demo_map_do'); CALL demo_apply_map('do_replenishment', 'sourceDoCode', '_demo_map_do'); CALL demo_apply_map('do_replenishment', 'targetDoCode', '_demo_map_do'); CALL demo_apply_map('purchase_order', 'code', '_demo_map_po'); CALL demo_apply_map('job_order', 'code', '_demo_map_jo'); CALL demo_apply_map('jo_pick_order', 'jobOrderCode', '_demo_map_jo'); CALL demo_apply_map('jo_pick_order_record', 'jobOrderCode', '_demo_map_jo'); CALL demo_apply_map('jo_bag_consumption', 'jobOrderCode', '_demo_map_jo'); CALL demo_apply_map('pick_order', 'code', '_demo_map_pk'); CALL demo_apply_map('do_pick_order', 'pick_order_code', '_demo_map_pk'); CALL demo_apply_map('do_pick_order_record', 'pick_order_code', '_demo_map_pk'); CALL demo_apply_map('do_pick_order_line', 'pick_order_code', '_demo_map_pk'); CALL demo_apply_map('do_pick_order_line_record', 'pick_order_code', '_demo_map_pk'); CALL demo_apply_map('jo_pick_order', 'pickOrderCode', '_demo_map_pk'); CALL demo_apply_map('jo_pick_order_record', 'pickOrderCode', '_demo_map_pk'); CALL demo_apply_map('pick_execution_issue', 'pick_order_code', '_demo_map_pk'); CALL demo_apply_map('stock_out', 'consoPickOrderCode', '_demo_map_pk'); CALL demo_apply_map('stock_in', 'code', '_demo_map_si'); CALL demo_apply_map('stock_take', 'code', '_demo_map_st'); CALL demo_apply_map('productprocess', 'productprocesscode', '_demo_map_pp'); UPDATE pick_order SET consoCode = CONCAT('CS-', id) WHERE consoCode IS NOT NULL AND consoCode <> ''; UPDATE do_replenishment SET code = CONCAT('DR-', id) WHERE code IS NOT NULL AND code <> ''; UPDATE do_pick_order_record SET deliveryNoteCode = CONCAT('DN-', id) WHERE deliveryNoteCode IS NOT NULL AND deliveryNoteCode <> ''; UPDATE delivery_order_pick_order SET deliveryNoteCode = CONCAT('DN-P', id) WHERE deliveryNoteCode IS NOT NULL AND deliveryNoteCode <> ''; CALL demo_exec_if_table('purchase_quotation', 'UPDATE purchase_quotation SET code = CONCAT(''PQ-'', id) WHERE code IS NOT NULL'); CALL demo_exec_if_table('purchase_quotation_line', 'UPDATE purchase_quotation_line SET code = CONCAT(''PQL-'', id) WHERE code IS NOT NULL'); UPDATE bom SET code = CONCAT('BOM-', id), name = CONCAT('Bom ', id), description = CONCAT('Bom ', id); CALL demo_exec_if_table('company', 'UPDATE company SET code = CONCAT(''CO-'', id), name = CONCAT(''Company '', id), brNo = '''', contactNo = '''', email = '''', addr1 = '''', addr2 = '''', addr3 = '''', addr4 = '''''); CALL demo_exec_if_table('process', 'UPDATE `process` SET code = CONCAT(''PROC-'', id), name = LEFT(CONCAT(''Process '', id), 30), description = LEFT(CONCAT(''Process '', id), 30), remarks = '''''); CALL demo_exec_if_table('equipment', 'UPDATE equipment SET code = CONCAT(''EQ-'', id), name = LEFT(CONCAT(''Equip '', id), 30), description = CONCAT(''Equip '', id)'); CALL demo_apply_map('equipment_detail', 'equipmentCode', '_demo_map_equip'); CALL demo_exec_if_table('equipment_detail', 'UPDATE equipment_detail SET code = CONCAT(''EQD-'', id), name = CONCAT(''Equip '', id), repairAndMaintenanceRemarks = '''''); CALL demo_exec_if_table('item_category', 'UPDATE item_category SET code = CONCAT(''CAT-'', id), parent = '''', sub = '''''); CALL demo_exec_if_table('qc_item', 'UPDATE qc_item SET code = CONCAT(''QC-'', id), name = CONCAT(''Qc '', id), description = '''''); CALL demo_exec_if_table('qc_category', 'UPDATE qc_category SET code = CONCAT(''QCC-'', id), name = CONCAT(''Qc '', id), description = CONCAT(''Qc '', id)'); CALL demo_exec_if_table('pick_order_group', 'UPDATE pick_order_group SET name = CONCAT(''POG-'', id)'); CALL demo_exec_if_table('printer', 'UPDATE printer SET code = CONCAT(''PRINTER-'', id), name = CASE name WHEN ''Label機 2F A+B'' THEN ''LABEL-A'' WHEN ''Label機 4F 乾貨 C, D'' THEN ''LABEL-B'' ELSE CONCAT(''Printer '', id) END, description = '''', brand = '''', ip = '''''); CALL demo_exec_if_table('logistic', 'UPDATE logistic SET logisticName = CONCAT(''Logistic '', id), carPlate = CONCAT(''PLATE-'', id), driverName = CONCAT(''Driver '', id), driverNumber = id'); CALL demo_exec_if_table('group', 'UPDATE `group` SET name = CONCAT(''~g'', id)'); CALL demo_exec_if_table('group', 'UPDATE `group` SET name = CONCAT(''GROUP-'', id), description = '''''); CALL demo_exec_if_table('onpack_template_file', 'UPDATE onpack_template_file SET fileName = CONCAT(''file-'', id)'); CALL demo_exec_if_table('onpack_expiry_item_code', 'UPDATE onpack_expiry_item_code SET printName = itemCode'); CALL demo_exec_if_table('m18_data_log', 'UPDATE m18_data_log SET dataLog = JSON_OBJECT()'); CALL demo_exec_if_table('grn_send_log', 'UPDATE grn_send_log SET data = JSON_OBJECT()'); CALL demo_exec_if_table('m18_goods_receipt_note_log', 'UPDATE m18_goods_receipt_note_log SET grn_code = CONCAT(''GRN-'', id)'); CALL demo_exec_if_table('mail_template', 'UPDATE mail_template SET `to` = '''', cc = '''', description = CONCAT(''Template '', id), subjectCht = '''', subjectEng = '''', contentCht = '''', contentEng = '''''); CALL demo_exec_if_table('mail_send_log', 'UPDATE mail_send_log SET senderMail = '''', subject = '''', content = '''', tempDesc = ''Mail'', errorMessage = '''''); CALL demo_exec_if_table('mail_send_log_line', 'UPDATE mail_send_log_line SET toMail = '''', errorMessage = '''''); CALL demo_apply_map('item_lot_trace_log', 'username', '_demo_map_username'); CALL demo_apply_map('stocktakerecord', 'createdBy', '_demo_map_username'); CALL demo_apply_map('pick_execution_issue', 'createdBy', '_demo_map_username'); CALL demo_apply_map('pick_execution_issue', 'modifiedBy', '_demo_map_username'); CALL demo_apply_map('pick_execution_issue', 'handled_by', '_demo_map_username'); CALL demo_apply_map('do_pick_order', 'createdBy', '_demo_map_username'); CALL demo_apply_map('do_pick_order', 'modifiedBy', '_demo_map_username'); CALL demo_apply_map('do_pick_order_record', 'createdBy', '_demo_map_username'); CALL demo_apply_map('do_pick_order_record', 'modifiedBy', '_demo_map_username'); CALL demo_apply_map('delivery_order_pick_order', 'createdBy', '_demo_map_username'); CALL demo_apply_map('delivery_order_pick_order', 'modifiedBy', '_demo_map_username'); CALL demo_apply_map('stocktakerecord', 'approverName', '_demo_map_person'); CALL demo_apply_map('stocktakerecord', 'stockTakerName', '_demo_map_person'); CALL demo_apply_map('do_pick_order', 'handler_name', '_demo_map_person'); CALL demo_apply_map('do_pick_order_record', 'handler_name', '_demo_map_person'); CALL demo_apply_map('delivery_order_pick_order', 'handlerName', '_demo_map_person'); CALL demo_apply_map('pick_execution_issue', 'picker_name', '_demo_map_person'); CALL demo_exec_if_table('pick_execution_issue', 'UPDATE pick_execution_issue SET item_description = '''''); UPDATE `user` u JOIN _demo_map_user m ON m.user_id = u.id SET u.username = CONCAT('~u', u.id); UPDATE `user` u JOIN _demo_map_user m ON m.user_id = u.id SET u.username = m.new_username, u.password = pwd_hash, u.name = m.new_name, u.fullname = m.new_name, u.firstname = 'User', u.lastname = CAST(u.id AS CHAR), u.email = CASE m.new_username WHEN 'demo' THEN 'demo@example.com' WHEN 'demo.stock' THEN 'demo.stock@example.com' WHEN 'demo.prod' THEN 'demo.prod@example.com' ELSE CONCAT('user', u.id, '@example.com') END, u.phone1 = '', u.phone2 = '', u.department = '', u.title = '', u.remarks = '', u.staffNo = ''; CALL demo_blank_columns(); UPDATE settings SET name = 'DO.floor.suppliers.AF' WHERE name = 'DO.floor.suppliers.2F'; UPDATE settings SET name = 'DO.floor.suppliers.BF' WHERE name = 'DO.floor.suppliers.4F'; CALL demo_remap_shop_csv('DO.floor.suppliers.AF'); CALL demo_remap_shop_csv('DO.floor.suppliers.BF'); UPDATE settings SET value = '' WHERE name IN ( 'LASER_PRINT.host', 'LASER_PRINT.itemCodes', 'LASER_PRINT.lastReceiveSuccess' ) OR name LIKE 'MAIL.smtp.%' OR name LIKE 'REPORT.dailyMaint.recipients%'; CALL demo_replace_floors(); INSERT INTO settings (name, value, category, type) VALUES ('DEMO.anonymized.v1', '1', 'DEMO', 'string'); COMMIT; CALL demo_drop_maps(); END$$ DELIMITER ; CALL anonymize_demo_copy(); DROP PROCEDURE IF EXISTS demo_exec_if_table; DROP PROCEDURE IF EXISTS demo_apply_map; DROP PROCEDURE IF EXISTS demo_apply_pair; DROP PROCEDURE IF EXISTS demo_add_missing; DROP PROCEDURE IF EXISTS demo_blank_columns; DROP PROCEDURE IF EXISTS demo_replace_floors; DROP PROCEDURE IF EXISTS demo_remap_shop_csv; DROP PROCEDURE IF EXISTS demo_drop_maps; DROP PROCEDURE IF EXISTS anonymize_demo_copy; SELECT name, value FROM settings WHERE name = 'DEMO.anonymized.v1';