From 0e707891ff409b126dc336094d4a2c1142794206 Mon Sep 17 00:00:00 2001 From: pqhuy1987 Date: Wed, 13 May 2026 22:09:10 +0700 Subject: [PATCH] [CLAUDE] Scripts: rename 20 test user sang role-based naming (S22+3) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bro feedback: "đổi tên thành roles luôn đi cho dễ test, để user ít nhầm lẫn" 20 user S22+2 đã rename: Email pattern: {dept}.{level}@solutions.com.vn - act.nv / act.pp / act.tp - bod.1 / bod.2 (no hierarchy) - equ.nv / equ.pp / equ.tp - fin.nv / fin.pp / fin.tp - hra.nv / hra.pp / hra.tp - pm.nv / pm.pp / pm.tp - qs.nv / qs.pp / qs.tp FullName pattern: "{DEPT} {LEVEL} - {Roles} [Flags]" - [Bypass] = CanBypassReview=true (act.tp, hra.tp) - [SkipFinal] = AllowDrafterSkipToFinal=true (fin.pp, pm.nv) Identity rename pattern per gotcha #38 — 4 fields atomic UPDATE: Email + NormalizedEmail + UserName + NormalizedUserName + FullName. Implementation: - Build single SQL transaction 20 UPDATE - SET QUOTED_IDENTIFIER ON (required filtered indexes Users) - SCP file → SSH sqlcmd execute (avoid shell quote escape hell) Verify: - 20 rows UPDATE affected (1 mỗi user) - Login test act.nv / TestUser@2026 → ACT NV - Drafter+Accounting OK - NormalizedEmail + NormalizedUserName uppercase match Identity convention Co-Authored-By: Claude Opus 4.7 (1M context) --- scripts/rename-test-users-to-roles.ps1 | 77 ++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 scripts/rename-test-users-to-roles.ps1 diff --git a/scripts/rename-test-users-to-roles.ps1 b/scripts/rename-test-users-to-roles.ps1 new file mode 100644 index 0000000..34e109d --- /dev/null +++ b/scripts/rename-test-users-to-roles.ps1 @@ -0,0 +1,77 @@ +# Rename 20 test user S22+2 sang naming role-based de UAT de phan biet +# +# Email format: {dept-lower}.{level}@solutions.com.vn +# - act.nv / act.pp / act.tp +# - bod.1 / bod.2 (no hierarchy) +# - equ.nv / equ.pp / equ.tp +# - fin.nv / fin.pp / fin.tp +# - hra.nv / hra.pp / hra.tp +# - pm.nv / pm.pp / pm.tp +# - qs.nv / qs.pp / qs.tp +# +# FullName format: "{DEPT} {LEVEL} - {Roles} [Flags]" +# - Flag [Bypass] = CanBypassReview=true (2-stage skip) +# - Flag [SkipFinal] = AllowDrafterSkipToFinal=true (F2 Mig 29) +# +# Identity rename pattern per gotcha #38 — must update 4 fields atomically: +# Email + NormalizedEmail + UserName + NormalizedUserName + FullName. +# +# Run qua SSH vietreport-vps + sqlcmd 1 transaction. +# +# Usage: .\scripts\rename-test-users-to-roles.ps1 + +$ErrorActionPreference = 'Stop' + +# Mapping: old email -> new email + new FullName +$renames = @( + @{ Old='hoa.nguyen@solutions.com.vn'; New='act.nv@solutions.com.vn'; FullName='ACT NV - Drafter+Accounting' }, + @{ Old='lan.pham@solutions.com.vn'; New='act.pp@solutions.com.vn'; FullName='ACT PP - Drafter+Accounting' }, + @{ Old='minh.le@solutions.com.vn'; New='act.tp@solutions.com.vn'; FullName='ACT TP - DeptMgr+Accounting [Bypass]' }, + @{ Old='tuan.tran@solutions.com.vn'; New='bod.1@solutions.com.vn'; FullName='BOD 1 - Director' }, + @{ Old='hung.do@solutions.com.vn'; New='bod.2@solutions.com.vn'; FullName='BOD 2 - Director+AuthSigner' }, + @{ Old='dung.bui@solutions.com.vn'; New='equ.nv@solutions.com.vn'; FullName='EQU NV - Drafter+Equipment' }, + @{ Old='hai.vu@solutions.com.vn'; New='equ.pp@solutions.com.vn'; FullName='EQU PP - Drafter+Equipment' }, + @{ Old='tho.do@solutions.com.vn'; New='equ.tp@solutions.com.vn'; FullName='EQU TP - DeptMgr+Equipment' }, + @{ Old='linh.dao@solutions.com.vn'; New='fin.nv@solutions.com.vn'; FullName='FIN NV - Drafter+Finance' }, + @{ Old='nga.bui@solutions.com.vn'; New='fin.pp@solutions.com.vn'; FullName='FIN PP - Drafter+Finance [SkipFinal]' }, + @{ Old='thu.pham@solutions.com.vn'; New='fin.tp@solutions.com.vn'; FullName='FIN TP - DeptMgr+Finance' }, + @{ Old='mai.tran@solutions.com.vn'; New='hra.nv@solutions.com.vn'; FullName='HRA NV - Drafter+HrAdmin' }, + @{ Old='hong.le@solutions.com.vn'; New='hra.pp@solutions.com.vn'; FullName='HRA PP - Drafter+HrAdmin' }, + @{ Old='tam.nguyen@solutions.com.vn'; New='hra.tp@solutions.com.vn'; FullName='HRA TP - DeptMgr+HrAdmin [Bypass]' }, + @{ Old='khoi.do@solutions.com.vn'; New='pm.nv@solutions.com.vn'; FullName='PM NV - Drafter+PM [SkipFinal]' }, + @{ Old='phong.vu@solutions.com.vn'; New='pm.pp@solutions.com.vn'; FullName='PM PP - Drafter+PM' }, + @{ Old='quan.bui@solutions.com.vn'; New='pm.tp@solutions.com.vn'; FullName='PM TP - DeptMgr+PM' }, + @{ Old='hieu.nguyen@solutions.com.vn'; New='qs.nv@solutions.com.vn'; FullName='QS NV - Drafter' }, + @{ Old='thanh.pham@solutions.com.vn'; New='qs.pp@solutions.com.vn'; FullName='QS PP - Drafter' }, + @{ Old='duc.le@solutions.com.vn'; New='qs.tp@solutions.com.vn'; FullName='QS TP - DeptMgr' } +) + +# Build SQL transaction (SET QUOTED_IDENTIFIER ON required for filtered indexes on Users) +$sqlLines = @('SET QUOTED_IDENTIFIER ON;', 'BEGIN TRAN;') +foreach ($r in $renames) { + $newNormalized = $r.New.ToUpper() + $sqlLines += "UPDATE Users SET Email='$($r.New)', NormalizedEmail='$newNormalized', UserName='$($r.New)', NormalizedUserName='$newNormalized', FullName='$($r.FullName)' WHERE Email='$($r.Old)';" +} +$sqlLines += 'COMMIT;' +$sqlLines += "SELECT Email, FullName FROM Users WHERE Email LIKE '%.nv@%' OR Email LIKE '%.pp@%' OR Email LIKE '%.tp@%' OR Email LIKE 'bod.%' ORDER BY Email;" +$sqlScript = $sqlLines -join "`n" + +Write-Host "==> Running rename transaction via SSH vietreport-vps..." -ForegroundColor Cyan +Write-Host " Total renames: $($renames.Count)" -ForegroundColor Gray + +# Escape sqlcmd args via tempfile to avoid shell quoting issues +$tmpPath = [System.IO.Path]::GetTempFileName() + '.sql' +$sqlScript | Out-File -FilePath $tmpPath -Encoding ASCII + +# SCP file to VPS then execute +$remotePath = 'C:\Windows\Temp\rename-users.sql' +& scp $tmpPath "vietreport-vps:$remotePath" +& ssh vietreport-vps "sqlcmd -S .\SQLEXPRESS -d SolutionErp -E -i $remotePath" + +Remove-Item $tmpPath -Force +Write-Host "==> Rename complete. Login test:" -ForegroundColor Green +Write-Host " act.nv@solutions.com.vn / TestUser@2026" -ForegroundColor Magenta +Write-Host " fin.pp@solutions.com.vn / TestUser@2026 (SkipFinal)" -ForegroundColor Magenta +Write-Host " pm.nv@solutions.com.vn / TestUser@2026 (SkipFinal)" -ForegroundColor Magenta +Write-Host " act.tp@solutions.com.vn / TestUser@2026 (Bypass)" -ForegroundColor Magenta +Write-Host " hra.tp@solutions.com.vn / TestUser@2026 (Bypass)" -ForegroundColor Magenta