Полное физическое удаление сотрудника невозможно — у него FK из
retail_sales и supplies. Поэтому теперь два шага:
IsActive=true → активный
IsActive=false + FiredAt → уволен (кнопка «Уволить»)
IsActive=false + IsDeleted=true + DeletedAt → удалён (кнопка «Удалить»)
— Domain: Employee получил поля IsDeleted/DeletedAt + миграция
Phase5a_EmployeeSoftDelete (drop column возможен через Down).
- API EmployeesController.Delete:
· если активен — переводит в Fired;
· если уже уволен — ставит IsDeleted=true + DeletedAt;
· если уже удалён — 409 Conflict;
· гарды Owner и self применяются на ОБОИХ шагах.
- API EmployeesController.List: новый query-param ?status=
active|fired|deleted|all (default: всё кроме deleted).
- DTO дополнен полями isDeleted, deletedAt, status (active/fired/deleted) —
фронтэнд использует для бейджа и логики кнопок.
- UI EmployeesPage:
· фильтр статуса в actions: «Активные и уволенные» (default),
«Только активные», «Только уволенные», «Только удалённые»,
«Все, включая удалённых».
· колонка «Статус» теперь с цветным бейджем (emerald/amber/rose).
· ФИО уволенного помечается «(уволен)», удалённого — line-through
+ «(удалён)».
· кнопка-действие в модалке: «Уволить» если active, «Удалить» если
fired, скрыта если уже deleted (заменена на pojaснение).
· confirm-текст обоих шагов разный — юзер понимает что произойдёт.
Существующие связанные документы (продажи, поставки) ссылаются на
employees по FK; имена для UI берутся из employee.LastName/FirstName +
status — отображение «Иванов И.И. (удалён)» работает автоматически.
47 lines
1.8 KiB
C#
47 lines
1.8 KiB
C#
using Microsoft.EntityFrameworkCore.Migrations;
|
|
|
|
#nullable disable
|
|
|
|
namespace foodmarket.Infrastructure.Persistence.Migrations
|
|
{
|
|
/// <summary>Двухступенчатое удаление сотрудника: добавлены IsDeleted и
|
|
/// DeletedAt. Ранее было только IsActive=false (увольнение); теперь:
|
|
/// IsActive=true — активный
|
|
/// IsActive=false + FiredAt — уволен
|
|
/// IsActive=false + IsDeleted=true + DeletedAt — soft-deleted
|
|
/// Физически Employee никогда не удаляем (FK из retail_sales, supplies).</summary>
|
|
public partial class Phase5a_EmployeeSoftDelete : Migration
|
|
{
|
|
protected override void Up(MigrationBuilder b)
|
|
{
|
|
b.AddColumn<bool>(
|
|
name: "IsDeleted",
|
|
schema: "public",
|
|
table: "employees",
|
|
type: "boolean",
|
|
nullable: false,
|
|
defaultValue: false);
|
|
|
|
b.AddColumn<System.DateTime>(
|
|
name: "DeletedAt",
|
|
schema: "public",
|
|
table: "employees",
|
|
type: "timestamp with time zone",
|
|
nullable: true);
|
|
|
|
b.CreateIndex(
|
|
name: "IX_employees_OrganizationId_IsDeleted",
|
|
schema: "public",
|
|
table: "employees",
|
|
columns: new[] { "OrganizationId", "IsDeleted" });
|
|
}
|
|
|
|
protected override void Down(MigrationBuilder b)
|
|
{
|
|
b.DropIndex(name: "IX_employees_OrganizationId_IsDeleted", schema: "public", table: "employees");
|
|
b.DropColumn(name: "IsDeleted", schema: "public", table: "employees");
|
|
b.DropColumn(name: "DeletedAt", schema: "public", table: "employees");
|
|
}
|
|
}
|
|
}
|