7dd51a1169
TaxBaik CI/CD / build-and-deploy (push) Successful in 48s
Architecture: - Create companies table with company_code as unique identifier - Add company_id foreign key to admin_users for multi-tenant support - Implement backward compatibility with DEFAULT company for existing users Core Components: - Company entity with full CRUD operations - ICompanyRepository interface following Repository pattern - CompanyRepository with Dapper implementation - CompanyService with business logic and validation - CompanyController with REST API endpoints Admin UI: - CompanyForm reusable component (Create/Edit pattern) - CompanyList.razor with pagination and company overview - CompanyCreate.razor for registering new companies - CompanyEdit.razor for managing existing companies with delete - All pages follow admin-page-hero pattern for consistency SOLID Principles: - Single Responsibility: Each component has one reason to change - Open/Closed: Extensible without modifying existing code - Interface Segregation: Clean repository and service contracts - Dependency Inversion: All layers depend on abstractions Database Migration (V014): - Creates companies table with active/inactive status - Assigns existing admin users to DEFAULT company - Provides foundation for role-based access control Future Enhancement: - Admin users can belong to specific companies - Data filtering based on company_id (multi-tenant isolation) - Company-based permission model
89 lines
2.7 KiB
Plaintext
89 lines
2.7 KiB
Plaintext
@using TaxBaik.Application.Services
|
|
|
|
<MudForm @ref="form">
|
|
<MudTextField @bind-Value="model.CompanyCode" Label="회사 코드"
|
|
Variant="Variant.Outlined" Class="mb-4" Required="true"
|
|
HelperText="영문/숫자, 최대 50자" />
|
|
|
|
<MudTextField @bind-Value="model.CompanyName" Label="회사명"
|
|
Variant="Variant.Outlined" Class="mb-4" Required="true" />
|
|
|
|
<MudTextField @bind-Value="model.ContactPerson" Label="담당자명"
|
|
Variant="Variant.Outlined" Class="mb-4" />
|
|
|
|
<MudTextField @bind-Value="model.Phone" Label="전화번호"
|
|
Variant="Variant.Outlined" Class="mb-4" />
|
|
|
|
<MudTextField @bind-Value="model.Email" Label="이메일"
|
|
Variant="Variant.Outlined" Class="mb-4" InputType="InputType.Email" />
|
|
|
|
<MudTextField @bind-Value="model.Memo" Label="메모"
|
|
Variant="Variant.Outlined" Lines="3" Class="mb-4" />
|
|
|
|
<MudCheckBox @bind-Checked="model.IsActive" Label="활성" Class="mb-4" />
|
|
|
|
<div class="d-flex gap-2">
|
|
<MudButton Variant="Variant.Filled" Color="Color.Primary" @onclick="HandleSubmit">
|
|
@ButtonText
|
|
</MudButton>
|
|
<MudButton Variant="Variant.Outlined" @onclick="OnCancel">취소</MudButton>
|
|
</div>
|
|
</MudForm>
|
|
|
|
@code {
|
|
[Parameter, EditorRequired]
|
|
public string ButtonText { get; set; } = "저장";
|
|
|
|
[Parameter]
|
|
public EventCallback<CompanyFormModel> OnSubmit { get; set; }
|
|
|
|
[Parameter]
|
|
public EventCallback OnCancel { get; set; }
|
|
|
|
[Parameter]
|
|
public CompanyFormModel? InitialData { get; set; }
|
|
|
|
private MudForm? form;
|
|
private CompanyFormModel model = new();
|
|
|
|
protected override void OnInitialized()
|
|
{
|
|
if (InitialData != null)
|
|
{
|
|
model = new CompanyFormModel
|
|
{
|
|
CompanyCode = InitialData.CompanyCode,
|
|
CompanyName = InitialData.CompanyName,
|
|
ContactPerson = InitialData.ContactPerson,
|
|
Phone = InitialData.Phone,
|
|
Email = InitialData.Email,
|
|
Memo = InitialData.Memo,
|
|
IsActive = InitialData.IsActive
|
|
};
|
|
}
|
|
}
|
|
|
|
private async Task HandleSubmit()
|
|
{
|
|
if (form == null)
|
|
return;
|
|
|
|
await form.Validate();
|
|
if (!form.IsValid)
|
|
return;
|
|
|
|
await OnSubmit.InvokeAsync(model);
|
|
}
|
|
|
|
public class CompanyFormModel
|
|
{
|
|
public string CompanyCode { get; set; } = "";
|
|
public string CompanyName { get; set; } = "";
|
|
public string? ContactPerson { get; set; }
|
|
public string? Phone { get; set; }
|
|
public string? Email { get; set; }
|
|
public string? Memo { get; set; }
|
|
public bool IsActive { get; set; } = true;
|
|
}
|
|
}
|