diff --git a/apps/web-client-tpos-net/src/WebClientTpos.Client/Pages/Admin/AdminSettings.razor b/apps/web-client-tpos-net/src/WebClientTpos.Client/Pages/Admin/AdminSettings.razor index 3f17b941..5d4ff2f1 100644 --- a/apps/web-client-tpos-net/src/WebClientTpos.Client/Pages/Admin/AdminSettings.razor +++ b/apps/web-client-tpos-net/src/WebClientTpos.Client/Pages/Admin/AdminSettings.razor @@ -764,10 +764,33 @@ _saving = true; _merchantMsg = null; try { + // EN: Try to update existing merchant first + // VI: Thử cập nhật merchant hiện tại trước var ok = await DataService.PutAsync("api/bff/account/merchant", new { businessName = _businessName, taxId = _taxId }); - _merchantMsg = ok ? "Cập nhật doanh nghiệp thành công!" : "Không thể cập nhật"; - _merchantMsgOk = ok; - if (ok) _editingMerchant = false; + if (ok) + { + _merchantMsg = "Cập nhật doanh nghiệp thành công!"; + _merchantMsgOk = true; + _editingMerchant = false; + } + else + { + // EN: Merchant might not exist yet — try to register first, then update + // VI: Merchant có thể chưa tồn tại — thử đăng ký trước, rồi cập nhật + var registerOk = await DataService.PostAsync("api/bff/account/register-merchant", + new { businessName = _businessName, type = "Individual", taxId = _taxId }); + if (registerOk) + { + _merchantMsg = "Đăng ký doanh nghiệp thành công!"; + _merchantMsgOk = true; + _editingMerchant = false; + } + else + { + _merchantMsg = "Không thể cập nhật hoặc đăng ký doanh nghiệp"; + _merchantMsgOk = false; + } + } } catch (Exception ex) { _merchantMsg = ex.Message; _merchantMsgOk = false; } finally { _saving = false; } diff --git a/apps/web-client-tpos-net/src/WebClientTpos.Client/Pages/Admin/Onboarding/OnboardingBusiness.razor b/apps/web-client-tpos-net/src/WebClientTpos.Client/Pages/Admin/Onboarding/OnboardingBusiness.razor index d39b258f..c51550f4 100644 --- a/apps/web-client-tpos-net/src/WebClientTpos.Client/Pages/Admin/Onboarding/OnboardingBusiness.razor +++ b/apps/web-client-tpos-net/src/WebClientTpos.Client/Pages/Admin/Onboarding/OnboardingBusiness.razor @@ -1,6 +1,7 @@ @page "/admin/onboarding/business" @layout AdminLayout @inherits AdminBase +@inject WebClientTpos.Client.Services.MerchantApiService MerchantApi @* EN: Onboarding Step 1 — Business info (name, type, tax ID, address, logo upload) @@ -109,10 +110,25 @@ + @if (!string.IsNullOrEmpty(_errorMsg)) + { +
+ @_errorMsg +
+ } +
-
@@ -121,13 +137,15 @@ @code { private int currentStep = 1; - private string _businessName = "aPOS Bistro"; - private string _taxId = "0312345678"; - private string _address = "123 Nguyễn Huệ, Quận 1, TP.HCM"; - private string _phone = "028 7300 1234"; - private string _email = "contact@goodgo.vn"; + private string _businessName = ""; + private string _taxId = ""; + private string _address = ""; + private string _phone = ""; + private string _email = ""; private string _businessType = "fnb"; private string _logoPlaceholder = "Chưa chọn tệp"; + private bool _saving; + private string? _errorMsg; private record StepInfo(int Index, string Label); private readonly StepInfo[] _steps = @@ -150,4 +168,62 @@ private string GetBusinessTypeLabel() => Array.Find(_businessTypes, t => t.Key == _businessType)?.Label ?? "F&B"; + + /// + /// EN: Register merchant via API, then navigate to next step. + /// VI: Đăng ký merchant qua API, sau đó chuyển sang bước tiếp theo. + /// + private async Task SaveAndContinue() + { + _errorMsg = null; + + // EN: Validate required fields + // VI: Kiểm tra trường bắt buộc + if (string.IsNullOrWhiteSpace(_businessName)) + { + _errorMsg = "Vui lòng nhập tên doanh nghiệp"; + return; + } + + _saving = true; + StateHasChanged(); + + try + { + var dto = new WebClientTpos.Shared.DTOs.MerchantRegisterDto + { + BusinessName = _businessName.Trim(), + Type = "Individual", + TaxId = string.IsNullOrWhiteSpace(_taxId) ? null : _taxId.Trim() + }; + + var (result, error) = await MerchantApi.RegisterMerchantAsync(dto); + + if (result != null) + { + // EN: Registration successful, proceed to next step + // VI: Đăng ký thành công, chuyển sang bước tiếp theo + NavigateTo("onboarding/store"); + } + else if (error != null && error.Contains("already has", StringComparison.OrdinalIgnoreCase)) + { + // EN: User already has a merchant account, just continue to next step + // VI: User đã có tài khoản merchant, tiếp tục bước tiếp theo + NavigateTo("onboarding/store"); + } + else + { + _errorMsg = error ?? "Không thể đăng ký doanh nghiệp. Vui lòng thử lại."; + } + } + catch (Exception ex) + { + _errorMsg = $"Lỗi: {ex.Message}"; + } + finally + { + _saving = false; + StateHasChanged(); + } + } } diff --git a/apps/web-client-tpos-net/src/WebClientTpos.Server/Controllers/AccountController.cs b/apps/web-client-tpos-net/src/WebClientTpos.Server/Controllers/AccountController.cs index 413056b8..6c4a861f 100644 --- a/apps/web-client-tpos-net/src/WebClientTpos.Server/Controllers/AccountController.cs +++ b/apps/web-client-tpos-net/src/WebClientTpos.Server/Controllers/AccountController.cs @@ -89,6 +89,14 @@ public class AccountController : ControllerBase public Task UpdateMerchant([FromBody] JsonElement body) => _merchant.PutAsJsonAsync("/api/v1/merchants/me", body).ProxyAsync(); + /// + /// EN: Register current user as a new merchant. + /// VI: Đăng ký user hiện tại làm merchant mới. + /// + [HttpPost("register-merchant")] + public Task RegisterMerchant([FromBody] JsonElement body) => + _merchant.PostAsJsonAsync("/api/v1/merchants/register", body).ProxyAsync(); + // ═══ SECURITY ═══ ///