diff --git a/.github/instructions/lowcode-reference.instructions.md b/.github/instructions/lowcode-reference.instructions.md index da63ab91..cbcf3d4e 100644 --- a/.github/instructions/lowcode-reference.instructions.md +++ b/.github/instructions/lowcode-reference.instructions.md @@ -1314,7 +1314,7 @@ ekranları ABP tablolarıdır, Licence/Dev Request host tablolarını okur. | **Identity › Permission Groups / Permissions** | `Abp.Identity.PermissionGroups` · `Abp.Identity.Permissions` | `AbpPermissionGroups` · `AbpPermissions` | Yetki ağacı (tree düzeni). Yeni ekranın yetkileri burada görünür; `Modules` kolonu yetkiyi modüllere bağlar (pipe ile çoklu), `Order` kardeşler arası sıradır. Seed: `data/Abp.Identity.Permission{Groups,s}.json`. | | **Identity › Claim Type** | `App.IdentityManagement.ClaimType` | `AbpClaimTypes` | Kullanıcıya ek alan (claim) tanımı: `ValueType`, `Regex`, `Required`, `IsStatic`. | | **Identity › Roles** | `AbpIdentity.Roles` | `AbpRoles` | Rol yönetimi + `RolesPermission` diyaloğu; yeni ekranın yetkisi role buradan verilir. Yazma `list-form-dynamic-api/role-*`. | -| **Identity › Users** | `AbpIdentity.Users` · detay `/admin/users/detail/:userId` | `AbpUsers` | Kullanıcı yönetimi + `UsersPermission` diyaloğu, **KPI widget'ları** ve `list-form-dynamic-api/user-*` ile devredilen yazma. Kullanıcı `WorkHour`, `DepartmentId`, `JobPositionId` alanlarını taşır. | +| **Identity › Users** | `AbpIdentity.Users` · detay `/admin/users/detail/:userId` | `AbpUsers` | Kullanıcı yönetimi + `UsersPermission` diyaloğu, **KPI widget'ları** ve `list-form-dynamic-api/user-*` ile devredilen yazma. Kullanıcı `WorkHour`, `DepartmentId`, `JobPositionId`, `Gender` (`Male`/`Female`, `App.StaticLookup.*`) ve `HomeAddress` alanlarını liste ve formda taşır; kişisel ve kimlik bilgileri (`IdentityNumber`, `BirthDate`, `EducationLevel`, `BloodType`, `Nationality`, `SskNo`…) detay ekranındadır. Kullanıcı seçen her lookup bu bilgileri `AbpUsers`'tan okur ve kopya kolon aynı ad/tip/değer kümesiyle açılır (`lowcode.instructions.md` §0.12 madde 5). Yeni bir kullanıcı alanı = `PlatformConsts.AbpIdentity.User` + `AbpIdentityUserExtensions` + EF eşlemesi ve migration + `UserInfoViewModel` (detay/profil) + `CreateUpdateUserInput` ve `user-insert`/`user-update` (liste) + `ListFormSeeder_Administration` alanı. | | **Identity › Organization Units** | `Abp.Identity.OrganizationUnits` · `/admin/ous` | ABP OU tabloları | Birim ağacı. Ekranı `IsOrganizationUnit = true` yaparsan veri bu ağaca göre süzülür; bildirim alıcısı da OU olabilir. | | **Identity › Audit Logs** | `App.IdentityManagement.AuditLogs` | `AbpAuditLogs` | İstek denetim kaydı + `AuditLogDetail` diyaloğu. "Kim ne zaman ne yaptı" isteği yeni tablo gerektirmez. | | **Identity › Sessions** | `App.IdentityManagement.Sessions` | `AbpSessions` | Açık oturumlar; `UiEvalService.ApiKickUser` ile oturum düşürme (`lowcode` §9.13). | diff --git a/.github/instructions/lowcode.instructions.md b/.github/instructions/lowcode.instructions.md index e71d35b3..1d769258 100644 --- a/.github/instructions/lowcode.instructions.md +++ b/.github/instructions/lowcode.instructions.md @@ -735,6 +735,21 @@ Kısa ve karar odaklı yaz; talebi tekrar anlatma. kopyalanıyor olsa da. Görsel base64 metin olarak saklanır; `nvarchar(512)` gibi sınırlı boy yazılmaz, `dxImageViewer` kullanılmaz (§4.3 editör tablosu). Çok satırlı serbest metin (`dxTextArea`, `dxHtmlEditor`) de `nvarchar(MAX)`'tir. + **Kullanıcı (çalışan) bilgisi `AbpUsers`'tan okunur.** Kullanıcıya ait her bilgi kullanıcı + kaydında durur: `IdentityNumber` (TC), `BirthDate`, `BirthPlace`, `Gender` (`Male`/`Female`), + `HomeAddress`, `EducationLevel`, `GraduationSchool`, `BloodType`, `Nationality`, `MaritalStatus`, + `SskNo`, `HireDate`, `DepartmentId`, `JobPositionId`, `WorkHour`, kimlik kartı alanları + (`SerialNo`, `Province`, `District`, `FatherName`, `MotherName`…). Kullanıcı seçen bir lookup bu + kolonları doğrudan `u.` ile seçer; başka bir ekranın tablosundaki son kayıttan (`OUTER APPLY + (SELECT TOP 1 …)`, `COALESCE(önceki kayıt…)`) türetmez — o tablolar kullanıcıyı değil kendi + kaydını tutar. Ekranın tablosu bu bilginin kopyasını tutacaksa kolon **aynı ad, aynı tip/boy ve + aynı değer kümesiyle** açılır (`IdentityNumber nvarchar(15)`, `Gender nvarchar(16)` + `Male`/`Female` + ve `App.StaticLookup.Male`/`Female` anahtarları, `EducationLevel` değerleri); `IdentityNo`, + `E`/`K` gibi farklı ad ya da değer açılmaz, sorguda `AS` ile yeniden adlandırma ya da `CASE` + çevirisi gerekmez. Bu kolonların hepsi `AbpIdentity.Users` ekranında alan olarak tanımlıdır + (kişisel olanlar gizli alan) ve `describe_list AbpIdentity.Users` ile görünür. MCP şema sözlüğü + tablo kataloğunu değil ekranların alan listesini döker: bir kolon sözlükte yoksa bu, tabloda + olmadığı anlamına gelmez — kullanıcı bilgisi için başka tabloya gidilmez. **Query kaynağı** (ekran birden çok tabloyu tek sorguda birleştiriyorsa ve view tercih edilmediyse, §8.2): `SelectCommandType: 4`, `TableName: "Q"`, `KeyFieldName` + `KeyFieldDbSourceType` zorunlu (§3). Ana tablo (en dıştaki `FROM`'un ilk tablosu) `IsDeleted` diff --git a/api/src/Sozsoft.Platform.Application.Contracts/Identity/Dto/UserInfoViewModel.cs b/api/src/Sozsoft.Platform.Application.Contracts/Identity/Dto/UserInfoViewModel.cs index 7c30833f..ab00341d 100644 --- a/api/src/Sozsoft.Platform.Application.Contracts/Identity/Dto/UserInfoViewModel.cs +++ b/api/src/Sozsoft.Platform.Application.Contracts/Identity/Dto/UserInfoViewModel.cs @@ -45,6 +45,7 @@ public class UserInfoViewModel : ExtensibleObject public Guid DepartmentId { get; set; } public Guid JobPositionId { get; set; } public string Nationality { get; set; } + public string Gender { get; set; } public string SskNo { get; set; } public DateTime? HireDate { get; set; } public DateTime? TerminationDate { get; set; } diff --git a/api/src/Sozsoft.Platform.Application.Contracts/ListForms/DynamicApi/CreateUpdateUserInput.cs b/api/src/Sozsoft.Platform.Application.Contracts/ListForms/DynamicApi/CreateUpdateUserInput.cs index fe4259e5..28e1b1c7 100644 --- a/api/src/Sozsoft.Platform.Application.Contracts/ListForms/DynamicApi/CreateUpdateUserInput.cs +++ b/api/src/Sozsoft.Platform.Application.Contracts/ListForms/DynamicApi/CreateUpdateUserInput.cs @@ -14,6 +14,8 @@ public class CreateUpdateUserInput public string WorkHour { get; set; } public string DepartmentId { get; set; } public string JobPositionId { get; set; } + public string Gender { get; set; } + public string HomeAddress { get; set; } public bool? IsActive { get; set; } public bool? LockoutEnabled { get; set; } public string[] RoleNames { get; set; } diff --git a/api/src/Sozsoft.Platform.Application/Identity/PlatformIdentityAppService.cs b/api/src/Sozsoft.Platform.Application/Identity/PlatformIdentityAppService.cs index b271b96f..3ffb5be7 100644 --- a/api/src/Sozsoft.Platform.Application/Identity/PlatformIdentityAppService.cs +++ b/api/src/Sozsoft.Platform.Application/Identity/PlatformIdentityAppService.cs @@ -265,6 +265,7 @@ public class PlatformIdentityAppService : ApplicationService user.SetDepartmentId(UserInfo.DepartmentId); user.SetJobPositionId(UserInfo.JobPositionId); user.SetNationality(UserInfo.Nationality); + user.SetGender(UserInfo.Gender); user.SetSskNo(UserInfo.SskNo); user.SetHireDate(UserInfo.HireDate); user.SetTerminationDate(UserInfo.TerminationDate); diff --git a/api/src/Sozsoft.Platform.Application/Identity/UserInfoViewModelMappingExtensions.cs b/api/src/Sozsoft.Platform.Application/Identity/UserInfoViewModelMappingExtensions.cs index b22a78b5..5bc796cb 100644 --- a/api/src/Sozsoft.Platform.Application/Identity/UserInfoViewModelMappingExtensions.cs +++ b/api/src/Sozsoft.Platform.Application/Identity/UserInfoViewModelMappingExtensions.cs @@ -21,6 +21,7 @@ public static class UserInfoViewModelMappingExtensions userInfoViewModel.DepartmentId = user.GetDepartmentId(); userInfoViewModel.JobPositionId = user.GetJobPositionId(); userInfoViewModel.Nationality = user.GetNationality(); + userInfoViewModel.Gender = user.GetGender(); userInfoViewModel.SskNo = user.GetSskNo(); userInfoViewModel.HireDate = user.GetHireDate(); userInfoViewModel.TerminationDate = user.GetTerminationDate(); diff --git a/api/src/Sozsoft.Platform.Application/ListForms/ListFormDynamicApiAppService.cs b/api/src/Sozsoft.Platform.Application/ListForms/ListFormDynamicApiAppService.cs index b9a62794..f59b11cc 100644 --- a/api/src/Sozsoft.Platform.Application/ListForms/ListFormDynamicApiAppService.cs +++ b/api/src/Sozsoft.Platform.Application/ListForms/ListFormDynamicApiAppService.cs @@ -133,6 +133,8 @@ public class ListFormDynamicApiAppService : PlatformAppService, IListFormDynamic user.SetWorkHour(input.Data.WorkHour); user.SetDepartmentId(ParseGuid(input.Data.DepartmentId)); user.SetJobPositionId(ParseGuid(input.Data.JobPositionId)); + user.SetGender(input.Data.Gender); + user.SetHomeAddress(input.Data.HomeAddress); user.SetIsVerified(verify); user.SetUserType(input.Data.UserType); @@ -209,6 +211,16 @@ public class ListFormDynamicApiAppService : PlatformAppService, IListFormDynamic user.SetJobPositionId(ParseGuid(input.Data.JobPositionId)); } + if (input.Data.Gender != null) + { + user.SetGender(input.Data.Gender); + } + + if (input.Data.HomeAddress != null) + { + user.SetHomeAddress(input.Data.HomeAddress); + } + user.SetUserType(input.Data.UserType); await SaveAvatarAsync(user, input.Data.Avatar); diff --git a/api/src/Sozsoft.Platform.DbMigrator/Migrations/ListFormSeeder_Administration.cs b/api/src/Sozsoft.Platform.DbMigrator/Migrations/ListFormSeeder_Administration.cs index 93eff990..485983fc 100644 --- a/api/src/Sozsoft.Platform.DbMigrator/Migrations/ListFormSeeder_Administration.cs +++ b/api/src/Sozsoft.Platform.DbMigrator/Migrations/ListFormSeeder_Administration.cs @@ -1229,6 +1229,63 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep PermissionJson = DefaultFieldPermissionJson(PlatformConsts.IdentityPermissions.Users.Create, PlatformConsts.IdentityPermissions.Users.Default, PlatformConsts.IdentityPermissions.Users.Update, true, true, false), PivotSettingsJson = DefaultPivotSettingsJson }, + new ListFormField { + ListFormCode = listForm.ListFormCode, + RoleId = null, + UserId = null, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "Gender", + EditGroupOrderNo = 1, + EditOrderNo = 10, + EditorType2 = EditorTypes.dxSelectBox, + ColSpan = 1, + EditorOptions = EditorOptions.ShowClearButton(), + CaptionName = "App.Listform.ListformField.Gender", + Width = 0, + ListOrderNo = 10, + Visible = true, + IsActive = true, + LookupJson = JsonSerializer.Serialize(new LookupDto + { + DataSourceType = UiLookupDataSourceTypeEnum.StaticData, + DisplayExpr = "name", + ValueExpr = "key", + LookupQuery = JsonSerializer.Serialize(new LookupDataDto[] { + new () { Key=PlatformConsts.AbpIdentity.User.GenderMale, Name="App.StaticLookup.Male" }, + new () { Key=PlatformConsts.AbpIdentity.User.GenderFemale, Name="App.StaticLookup.Female" }, + }), + }), + + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(PlatformConsts.IdentityPermissions.Users.Create, PlatformConsts.IdentityPermissions.Users.Default, PlatformConsts.IdentityPermissions.Users.Update, true, true, false), + PivotSettingsJson = DefaultPivotSettingsJson + }, + + new ListFormField { + ListFormCode = listForm.ListFormCode, + RoleId = null, + UserId = null, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "HomeAddress", + EditGroupOrderNo = 1, + EditOrderNo = 11, + EditorType2 = EditorTypes.dxTextArea, + ColSpan = 2, + CaptionName = "Abp.Account.HomeAddress", + Width = 0, + ListOrderNo = 11, + Visible = true, + IsActive = true, + + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(PlatformConsts.IdentityPermissions.Users.Create, PlatformConsts.IdentityPermissions.Users.Default, PlatformConsts.IdentityPermissions.Users.Update, true, true, false), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new ListFormField { ListFormCode = listForm.ListFormCode, @@ -1238,12 +1295,12 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep SourceDbType = DbType.String, FieldName = "Password", EditGroupOrderNo = 1, - EditOrderNo = 10, + EditOrderNo = 12, EditorType2 = EditorTypes.dxTextBox, ColSpan = 1, CaptionName = "App.Listform.ListformField.Password", Width = 0, - ListOrderNo = 10, + ListOrderNo = 12, Visible = false, IsActive = false, @@ -1260,12 +1317,12 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep SourceDbType = DbType.Boolean, FieldName = "IsActive", EditGroupOrderNo = 1, - EditOrderNo = 11, + EditOrderNo = 13, EditorType2 = EditorTypes.dxCheckBox, ColSpan = 1, CaptionName = "App.Listform.ListformField.IsActive", Width = 0, - ListOrderNo = 11, + ListOrderNo = 13, Visible = true, IsActive = true, @@ -1282,7 +1339,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep FieldName = "IsVerified", CaptionName = "App.Listform.ListformField.IsVerified", Width = 0, - ListOrderNo = 12, + ListOrderNo = 14, Visible = true, IsActive = true, @@ -1299,7 +1356,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep FieldName = "EmailConfirmed", CaptionName = "App.Listform.ListformField.EmailConfirmed", Width = 0, - ListOrderNo = 13, + ListOrderNo = 15, Visible = true, IsActive = true, @@ -1316,7 +1373,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep FieldName = "TwoFactorEnabled", CaptionName = "App.Listform.ListformField.TwoFactorEnabled", Width = 0, - ListOrderNo = 14, + ListOrderNo = 16, Visible = true, IsActive = true, @@ -1324,6 +1381,242 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep PermissionJson = DefaultFieldPermissionJson(PlatformConsts.IdentityPermissions.Users.Create, PlatformConsts.IdentityPermissions.Users.Default, PlatformConsts.IdentityPermissions.Users.Update, true, true, false), PivotSettingsJson = DefaultPivotSettingsJson }, + // Kisisel bilgiler detay ekraninda duzenlenir, listede gizlidir; alan olarak tanimli + // olmalari MCP sema sozlugunun AbpUsers kolonlarini gormesini saglar. + new ListFormField { + ListFormCode = listForm.ListFormCode, + RoleId = null, + UserId = null, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "IdentityNumber", + CaptionName = "Abp.Identity.User.UserInformation.IdentityNumber", + Width = 0, + ListOrderNo = 17, + Visible = false, + IsActive = true, + + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(PlatformConsts.IdentityPermissions.Users.Create, PlatformConsts.IdentityPermissions.Users.Default, PlatformConsts.IdentityPermissions.Users.Update, true, true, false), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new ListFormField { + ListFormCode = listForm.ListFormCode, + RoleId = null, + UserId = null, + CultureName = LanguageCodes.En, + SourceDbType = DbType.DateTime, + FieldName = "BirthDate", + CaptionName = "App.Listform.ListformField.BirthDate", + Width = 0, + ListOrderNo = 18, + Visible = false, + IsActive = true, + + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(PlatformConsts.IdentityPermissions.Users.Create, PlatformConsts.IdentityPermissions.Users.Default, PlatformConsts.IdentityPermissions.Users.Update, true, true, false), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new ListFormField { + ListFormCode = listForm.ListFormCode, + RoleId = null, + UserId = null, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "BirthPlace", + CaptionName = "Abp.Identity.User.UserInformation.BirthPlace", + Width = 0, + ListOrderNo = 19, + Visible = false, + IsActive = true, + + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(PlatformConsts.IdentityPermissions.Users.Create, PlatformConsts.IdentityPermissions.Users.Default, PlatformConsts.IdentityPermissions.Users.Update, true, true, false), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new ListFormField { + ListFormCode = listForm.ListFormCode, + RoleId = null, + UserId = null, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "EducationLevel", + CaptionName = "Abp.Account.EducationLevel", + Width = 0, + ListOrderNo = 20, + Visible = false, + IsActive = true, + + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(PlatformConsts.IdentityPermissions.Users.Create, PlatformConsts.IdentityPermissions.Users.Default, PlatformConsts.IdentityPermissions.Users.Update, true, true, false), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new ListFormField { + ListFormCode = listForm.ListFormCode, + RoleId = null, + UserId = null, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "GraduationSchool", + CaptionName = "Abp.Account.GraduationSchool", + Width = 0, + ListOrderNo = 21, + Visible = false, + IsActive = true, + + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(PlatformConsts.IdentityPermissions.Users.Create, PlatformConsts.IdentityPermissions.Users.Default, PlatformConsts.IdentityPermissions.Users.Update, true, true, false), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new ListFormField { + ListFormCode = listForm.ListFormCode, + RoleId = null, + UserId = null, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "BloodType", + CaptionName = "Abp.Account.BloodType", + Width = 0, + ListOrderNo = 22, + Visible = false, + IsActive = true, + + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(PlatformConsts.IdentityPermissions.Users.Create, PlatformConsts.IdentityPermissions.Users.Default, PlatformConsts.IdentityPermissions.Users.Update, true, true, false), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new ListFormField { + ListFormCode = listForm.ListFormCode, + RoleId = null, + UserId = null, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "Nationality", + CaptionName = "Abp.Account.Nationality", + Width = 0, + ListOrderNo = 23, + Visible = false, + IsActive = true, + + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(PlatformConsts.IdentityPermissions.Users.Create, PlatformConsts.IdentityPermissions.Users.Default, PlatformConsts.IdentityPermissions.Users.Update, true, true, false), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new ListFormField { + ListFormCode = listForm.ListFormCode, + RoleId = null, + UserId = null, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "MaritalStatus", + CaptionName = "App.Listform.ListformField.MaritalStatus", + Width = 0, + ListOrderNo = 24, + Visible = false, + IsActive = true, + + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(PlatformConsts.IdentityPermissions.Users.Create, PlatformConsts.IdentityPermissions.Users.Default, PlatformConsts.IdentityPermissions.Users.Update, true, true, false), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new ListFormField { + ListFormCode = listForm.ListFormCode, + RoleId = null, + UserId = null, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "FatherName", + CaptionName = "Abp.Identity.User.UserInformation.FatherName", + Width = 0, + ListOrderNo = 25, + Visible = false, + IsActive = true, + + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(PlatformConsts.IdentityPermissions.Users.Create, PlatformConsts.IdentityPermissions.Users.Default, PlatformConsts.IdentityPermissions.Users.Update, true, true, false), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new ListFormField { + ListFormCode = listForm.ListFormCode, + RoleId = null, + UserId = null, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "MotherName", + CaptionName = "Abp.Identity.User.UserInformation.MotherName", + Width = 0, + ListOrderNo = 26, + Visible = false, + IsActive = true, + + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(PlatformConsts.IdentityPermissions.Users.Create, PlatformConsts.IdentityPermissions.Users.Default, PlatformConsts.IdentityPermissions.Users.Update, true, true, false), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new ListFormField { + ListFormCode = listForm.ListFormCode, + RoleId = null, + UserId = null, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "SskNo", + CaptionName = "Abp.Identity.User.UserInformation.SskNo", + Width = 0, + ListOrderNo = 27, + Visible = false, + IsActive = true, + + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(PlatformConsts.IdentityPermissions.Users.Create, PlatformConsts.IdentityPermissions.Users.Default, PlatformConsts.IdentityPermissions.Users.Update, true, true, false), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new ListFormField { + ListFormCode = listForm.ListFormCode, + RoleId = null, + UserId = null, + CultureName = LanguageCodes.En, + SourceDbType = DbType.DateTime, + FieldName = "HireDate", + CaptionName = "Abp.Identity.User.UserInformation.HireDate", + Width = 0, + ListOrderNo = 28, + Visible = false, + IsActive = true, + + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(PlatformConsts.IdentityPermissions.Users.Create, PlatformConsts.IdentityPermissions.Users.Default, PlatformConsts.IdentityPermissions.Users.Update, true, true, false), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new ListFormField { + ListFormCode = listForm.ListFormCode, + RoleId = null, + UserId = null, + CultureName = LanguageCodes.En, + SourceDbType = DbType.DateTime, + FieldName = "TerminationDate", + CaptionName = "App.Listform.ListformField.TerminationDate", + Width = 0, + ListOrderNo = 29, + Visible = false, + IsActive = true, + + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(PlatformConsts.IdentityPermissions.Users.Create, PlatformConsts.IdentityPermissions.Users.Default, PlatformConsts.IdentityPermissions.Users.Update, true, true, false), + PivotSettingsJson = DefaultPivotSettingsJson + }, ]); #endregion } diff --git a/api/src/Sozsoft.Platform.DbMigrator/Migrations/PlatformIdentityDataSeeder.cs b/api/src/Sozsoft.Platform.DbMigrator/Migrations/PlatformIdentityDataSeeder.cs index 2e8d659b..d0c00cd5 100644 --- a/api/src/Sozsoft.Platform.DbMigrator/Migrations/PlatformIdentityDataSeeder.cs +++ b/api/src/Sozsoft.Platform.DbMigrator/Migrations/PlatformIdentityDataSeeder.cs @@ -159,6 +159,7 @@ public class PlatformIdentityDataSeeder : IdentityDataSeeder adminUser.SetJobPositionId(PlatformConsts.AbpIdentity.User.AdminJobPositionIdDefaultValue); adminUser.SetAvatar(GetAvatar(tenantId?.ToString(), adminUser.Id.ToString())); adminUser.SetUserType(PlatformConsts.AbpIdentity.User.InternalUserTypeDefaultValue); + adminUser.SetGender(PlatformConsts.AbpIdentity.User.AdminGenderDefaultValue); (await UserManager.CreateAsync(adminUser, adminPassword, validatePassword: false)).CheckErrors(); result.CreatedAdminUser = true; diff --git a/api/src/Sozsoft.Platform.Domain.Shared/PlatformConsts.cs b/api/src/Sozsoft.Platform.Domain.Shared/PlatformConsts.cs index 3827df04..37ba0868 100644 --- a/api/src/Sozsoft.Platform.Domain.Shared/PlatformConsts.cs +++ b/api/src/Sozsoft.Platform.Domain.Shared/PlatformConsts.cs @@ -119,6 +119,7 @@ public static class PlatformConsts public const string GraduationSchool = "GraduationSchool"; public const string BloodType = "BloodType"; public const string Nationality = "Nationality"; + public const string Gender = "Gender"; public const string WorkHour = "WorkHour"; public const string DepartmentId = "DepartmentId"; @@ -180,6 +181,11 @@ public static class PlatformConsts public static readonly DateTime AdminBirthDateDefaultValue = new(1981, 8, 27); public const string AdminBirthPlaceDefaultValue = "Kadıköy, İstanbul"; public const string AdminMaritalStatusDefaultValue = "Evli"; + public const string AdminGenderDefaultValue = "Male"; + + // Cinsiyet dilden bagimsiz anahtarla saklanir; ekranda App.StaticLookup.* ile cevrilir. + public const string GenderMale = "Male"; + public const string GenderFemale = "Female"; public const UserType InternalUserTypeDefaultValue = PlatformConsts.UserType.Internal; public const UserType ExternalUserTypeDefaultValue = PlatformConsts.UserType.External; diff --git a/api/src/Sozsoft.Platform.Domain/Extensions/AbpIdentityUserExtensions.cs b/api/src/Sozsoft.Platform.Domain/Extensions/AbpIdentityUserExtensions.cs index 23ef4161..df1579f3 100644 --- a/api/src/Sozsoft.Platform.Domain/Extensions/AbpIdentityUserExtensions.cs +++ b/api/src/Sozsoft.Platform.Domain/Extensions/AbpIdentityUserExtensions.cs @@ -111,6 +111,16 @@ public static class AbpIdentityUserExtensions return user.GetProperty(PlatformConsts.AbpIdentity.User.Nationality); } + //Gender + public static void SetGender(this IdentityUser user, string value) + { + user.SetProperty(PlatformConsts.AbpIdentity.User.Gender, value); + } + public static string GetGender(this IdentityUser user) + { + return user.GetProperty(PlatformConsts.AbpIdentity.User.Gender); + } + //SskNo public static void SetSskNo(this IdentityUser user, string value) { diff --git a/api/src/Sozsoft.Platform.EntityFrameworkCore/EntityFrameworkCore/PlatformEfCoreEntityExtensionMappings.cs b/api/src/Sozsoft.Platform.EntityFrameworkCore/EntityFrameworkCore/PlatformEfCoreEntityExtensionMappings.cs index 7376f087..9f36fc1e 100644 --- a/api/src/Sozsoft.Platform.EntityFrameworkCore/EntityFrameworkCore/PlatformEfCoreEntityExtensionMappings.cs +++ b/api/src/Sozsoft.Platform.EntityFrameworkCore/EntityFrameworkCore/PlatformEfCoreEntityExtensionMappings.cs @@ -110,6 +110,15 @@ public static class PlatformEfCoreEntityExtensionMappings } ); + ObjectExtensionManager.Instance + .MapEfCoreProperty( + PlatformConsts.AbpIdentity.User.Gender, + (entityBuilder, propertyBuilder) => + { + propertyBuilder.HasMaxLength(16).HasDefaultValue(null); + } + ); + ObjectExtensionManager.Instance .MapEfCoreProperty( PlatformConsts.AbpIdentity.User.SskNo, diff --git a/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260922201238_Initial.Designer.cs b/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260930212718_Initial.Designer.cs similarity index 99% rename from api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260922201238_Initial.Designer.cs rename to api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260930212718_Initial.Designer.cs index 525802cc..bf1f434a 100644 --- a/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260922201238_Initial.Designer.cs +++ b/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260930212718_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace Sozsoft.Platform.Migrations { [DbContext(typeof(PlatformDbContext))] - [Migration("20260922201238_Initial")] + [Migration("20260930212718_Initial")] partial class Initial { /// @@ -6065,15 +6065,15 @@ namespace Sozsoft.Platform.Migrations .HasPrecision(18, 6) .HasColumnType("decimal(18,6)"); + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + b.Property("Type") .IsRequired() .HasMaxLength(32) .HasColumnType("nvarchar(32)"); - b.Property("TenantId") - .HasColumnType("uniqueidentifier") - .HasColumnName("TenantId"); - b.Property("UomCategoryId") .IsRequired() .HasMaxLength(128) @@ -7808,6 +7808,10 @@ namespace Sozsoft.Platform.Migrations .HasMaxLength(128) .HasColumnType("nvarchar(128)"); + b.Property("Gender") + .HasMaxLength(16) + .HasColumnType("nvarchar(16)"); + b.Property("GraduationSchool") .HasMaxLength(256) .HasColumnType("nvarchar(256)"); diff --git a/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260922201238_Initial.cs b/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260930212718_Initial.cs similarity index 99% rename from api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260922201238_Initial.cs rename to api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260930212718_Initial.cs index 5b3cd683..6ac1a9b7 100644 --- a/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260922201238_Initial.cs +++ b/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260930212718_Initial.cs @@ -445,6 +445,7 @@ namespace Sozsoft.Platform.Migrations EducationLevel = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), FamilySequenceNo = table.Column(type: "nvarchar(32)", maxLength: 32, nullable: true), FatherName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + Gender = table.Column(type: "nvarchar(16)", maxLength: 16, nullable: true), GraduationSchool = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), HireDate = table.Column(type: "datetime2", nullable: true), HomeAddress = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), @@ -542,28 +543,6 @@ namespace Sozsoft.Platform.Migrations table.PrimaryKey("PK_Adm_T_Announcement", x => x.Id); }); - migrationBuilder.CreateTable( - name: "Hr_T_Department", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - TenantId = table.Column(type: "uniqueidentifier", nullable: true), - BranchId = table.Column(type: "uniqueidentifier", nullable: false), - Name = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), - ParentId = table.Column(type: "uniqueidentifier", nullable: true), - CreationTime = table.Column(type: "datetime2", nullable: false), - CreatorId = table.Column(type: "uniqueidentifier", nullable: true), - LastModificationTime = table.Column(type: "datetime2", nullable: true), - LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), - IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), - DeleterId = table.Column(type: "uniqueidentifier", nullable: true), - DeletionTime = table.Column(type: "datetime2", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Hr_T_Department", x => x.Id); - }); - migrationBuilder.CreateTable( name: "Adm_T_EventCategory", columns: table => new @@ -845,6 +824,26 @@ namespace Sozsoft.Platform.Migrations table.PrimaryKey("PK_Adm_T_Survey", x => x.Id); }); + migrationBuilder.CreateTable( + name: "Adm_T_UomCategory", + columns: table => new + { + Id = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Adm_T_UomCategory", x => x.Id); + }); + migrationBuilder.CreateTable( name: "Adm_T_Videoroom", columns: table => new @@ -907,6 +906,48 @@ namespace Sozsoft.Platform.Migrations table.PrimaryKey("PK_Adm_T_WorkHour", x => x.Id); }); + migrationBuilder.CreateTable( + name: "Hr_T_Department", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + BranchId = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + ParentId = table.Column(type: "uniqueidentifier", nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Hr_T_Department", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Hr_T_SkillType", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Hr_T_SkillType", x => x.Id); + }); + migrationBuilder.CreateTable( name: "OpenIddictApplications", columns: table => new @@ -1756,46 +1797,6 @@ namespace Sozsoft.Platform.Migrations table.PrimaryKey("PK_Sas_H_SettingDefinition", x => x.Id); }); - migrationBuilder.CreateTable( - name: "Hr_T_SkillType", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - TenantId = table.Column(type: "uniqueidentifier", nullable: true), - Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), - CreationTime = table.Column(type: "datetime2", nullable: false), - CreatorId = table.Column(type: "uniqueidentifier", nullable: true), - LastModificationTime = table.Column(type: "datetime2", nullable: true), - LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), - IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), - DeleterId = table.Column(type: "uniqueidentifier", nullable: true), - DeletionTime = table.Column(type: "datetime2", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Hr_T_SkillType", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "Adm_T_UomCategory", - columns: table => new - { - Id = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), - TenantId = table.Column(type: "uniqueidentifier", nullable: true), - Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), - CreationTime = table.Column(type: "datetime2", nullable: false), - CreatorId = table.Column(type: "uniqueidentifier", nullable: true), - LastModificationTime = table.Column(type: "datetime2", nullable: true), - LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), - IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), - DeleterId = table.Column(type: "uniqueidentifier", nullable: true), - DeletionTime = table.Column(type: "datetime2", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Adm_T_UomCategory", x => x.Id); - }); - migrationBuilder.CreateTable( name: "Sas_T_Branch", columns: table => new @@ -2213,35 +2214,6 @@ namespace Sozsoft.Platform.Migrations onDelete: ReferentialAction.Cascade); }); - migrationBuilder.CreateTable( - name: "Hr_T_JobPosition", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - TenantId = table.Column(type: "uniqueidentifier", nullable: true), - BranchId = table.Column(type: "uniqueidentifier", nullable: false), - Name = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), - DepartmentId = table.Column(type: "uniqueidentifier", nullable: false), - ParentId = table.Column(type: "uniqueidentifier", nullable: true), - CreationTime = table.Column(type: "datetime2", nullable: false), - CreatorId = table.Column(type: "uniqueidentifier", nullable: true), - LastModificationTime = table.Column(type: "datetime2", nullable: true), - LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), - IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), - DeleterId = table.Column(type: "uniqueidentifier", nullable: true), - DeletionTime = table.Column(type: "datetime2", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Hr_T_JobPosition", x => x.Id); - table.ForeignKey( - name: "FK_Hr_T_JobPosition_Hr_T_Department_DepartmentId", - column: x => x.DepartmentId, - principalTable: "Hr_T_Department", - principalColumn: "Id", - onDelete: ReferentialAction.Restrict); - }); - migrationBuilder.CreateTable( name: "Adm_T_Event", columns: table => new @@ -2556,6 +2528,37 @@ namespace Sozsoft.Platform.Migrations onDelete: ReferentialAction.Cascade); }); + migrationBuilder.CreateTable( + name: "Adm_T_Uom", + columns: table => new + { + Id = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + UomCategoryId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + Name = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + Type = table.Column(type: "nvarchar(32)", maxLength: 32, nullable: false), + Ratio = table.Column(type: "decimal(18,6)", precision: 18, scale: 6, nullable: false), + IsActive = table.Column(type: "bit", nullable: false), + Rounding = table.Column(type: "decimal(18,6)", precision: 18, scale: 6, nullable: false), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Adm_T_Uom", x => x.Id); + table.ForeignKey( + name: "FK_Adm_T_Uom_Adm_T_UomCategory_UomCategoryId", + column: x => x.UomCategoryId, + principalTable: "Adm_T_UomCategory", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + }); + migrationBuilder.CreateTable( name: "Adm_T_VideoroomAttandance", columns: table => new @@ -2660,6 +2663,91 @@ namespace Sozsoft.Platform.Migrations onDelete: ReferentialAction.Cascade); }); + migrationBuilder.CreateTable( + name: "Hr_T_JobPosition", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + BranchId = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + DepartmentId = table.Column(type: "uniqueidentifier", nullable: false), + ParentId = table.Column(type: "uniqueidentifier", nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Hr_T_JobPosition", x => x.Id); + table.ForeignKey( + name: "FK_Hr_T_JobPosition_Hr_T_Department_DepartmentId", + column: x => x.DepartmentId, + principalTable: "Hr_T_Department", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + }); + + migrationBuilder.CreateTable( + name: "Hr_T_Skill", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + SkillTypeId = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Hr_T_Skill", x => x.Id); + table.ForeignKey( + name: "FK_Hr_T_Skill_Hr_T_SkillType_SkillTypeId", + column: x => x.SkillTypeId, + principalTable: "Hr_T_SkillType", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "Hr_T_SkillLevel", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + SkillTypeId = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + Progress = table.Column(type: "int", nullable: false, defaultValue: 0), + IsDefault = table.Column(type: "bit", nullable: false, defaultValue: false), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Hr_T_SkillLevel", x => x.Id); + table.ForeignKey( + name: "FK_Hr_T_SkillLevel_Hr_T_SkillType_SkillTypeId", + column: x => x.SkillTypeId, + principalTable: "Hr_T_SkillType", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + migrationBuilder.CreateTable( name: "OpenIddictAuthorizations", columns: table => new @@ -3034,93 +3122,6 @@ namespace Sozsoft.Platform.Migrations onDelete: ReferentialAction.Cascade); }); - migrationBuilder.CreateTable( - name: "Hr_T_Skill", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - TenantId = table.Column(type: "uniqueidentifier", nullable: true), - SkillTypeId = table.Column(type: "uniqueidentifier", nullable: false), - Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), - CreationTime = table.Column(type: "datetime2", nullable: false), - CreatorId = table.Column(type: "uniqueidentifier", nullable: true), - LastModificationTime = table.Column(type: "datetime2", nullable: true), - LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), - IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), - DeleterId = table.Column(type: "uniqueidentifier", nullable: true), - DeletionTime = table.Column(type: "datetime2", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Hr_T_Skill", x => x.Id); - table.ForeignKey( - name: "FK_Hr_T_Skill_Hr_T_SkillType_SkillTypeId", - column: x => x.SkillTypeId, - principalTable: "Hr_T_SkillType", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "Hr_T_SkillLevel", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - TenantId = table.Column(type: "uniqueidentifier", nullable: true), - SkillTypeId = table.Column(type: "uniqueidentifier", nullable: false), - Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), - Progress = table.Column(type: "int", nullable: false, defaultValue: 0), - IsDefault = table.Column(type: "bit", nullable: false, defaultValue: false), - CreationTime = table.Column(type: "datetime2", nullable: false), - CreatorId = table.Column(type: "uniqueidentifier", nullable: true), - LastModificationTime = table.Column(type: "datetime2", nullable: true), - LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), - IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), - DeleterId = table.Column(type: "uniqueidentifier", nullable: true), - DeletionTime = table.Column(type: "datetime2", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Hr_T_SkillLevel", x => x.Id); - table.ForeignKey( - name: "FK_Hr_T_SkillLevel_Hr_T_SkillType_SkillTypeId", - column: x => x.SkillTypeId, - principalTable: "Hr_T_SkillType", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "Adm_T_Uom", - columns: table => new - { - Id = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), - TenantId = table.Column(type: "uniqueidentifier", nullable: true), - UomCategoryId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), - Name = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), - Type = table.Column(type: "nvarchar(32)", maxLength: 32, nullable: false), - Ratio = table.Column(type: "decimal(18,6)", precision: 18, scale: 6, nullable: false), - IsActive = table.Column(type: "bit", nullable: false), - Rounding = table.Column(type: "decimal(18,6)", precision: 18, scale: 6, nullable: false), - CreationTime = table.Column(type: "datetime2", nullable: false), - CreatorId = table.Column(type: "uniqueidentifier", nullable: true), - LastModificationTime = table.Column(type: "datetime2", nullable: true), - LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), - IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), - DeleterId = table.Column(type: "uniqueidentifier", nullable: true), - DeletionTime = table.Column(type: "datetime2", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Adm_T_Uom", x => x.Id); - table.ForeignKey( - name: "FK_Adm_T_Uom_Adm_T_UomCategory_UomCategoryId", - column: x => x.UomCategoryId, - principalTable: "Adm_T_UomCategory", - principalColumn: "Id", - onDelete: ReferentialAction.Restrict); - }); - migrationBuilder.CreateTable( name: "Sas_T_ForumTopic", columns: table => new @@ -3807,13 +3808,6 @@ namespace Sozsoft.Platform.Migrations unique: true, filter: "[IsDeleted] = 0"); - migrationBuilder.CreateIndex( - name: "IX_Hr_T_Department_TenantId_BranchId_Name", - table: "Hr_T_Department", - columns: new[] { "TenantId", "BranchId", "Name" }, - unique: true, - filter: "[IsDeleted] = 0"); - migrationBuilder.CreateIndex( name: "IX_Adm_T_Event_CategoryId", table: "Adm_T_Event", @@ -3864,18 +3858,6 @@ namespace Sozsoft.Platform.Migrations unique: true, filter: "[IsDeleted] = 0"); - migrationBuilder.CreateIndex( - name: "IX_Hr_T_JobPosition_DepartmentId", - table: "Hr_T_JobPosition", - column: "DepartmentId"); - - migrationBuilder.CreateIndex( - name: "IX_Hr_T_JobPosition_TenantId_Name_DepartmentId", - table: "Hr_T_JobPosition", - columns: new[] { "TenantId", "Name", "DepartmentId" }, - unique: true, - filter: "[IsDeleted] = 0"); - migrationBuilder.CreateIndex( name: "IX_Adm_T_MessengerConversationMessage_ConversationId", table: "Adm_T_MessengerConversationMessage", @@ -4017,6 +3999,25 @@ namespace Sozsoft.Platform.Migrations table: "Adm_T_SurveyResponse", column: "SurveyId"); + migrationBuilder.CreateIndex( + name: "IX_Adm_T_Uom_TenantId_Name_UomCategoryId", + table: "Adm_T_Uom", + columns: new[] { "TenantId", "Name", "UomCategoryId" }, + unique: true, + filter: "[IsDeleted] = 0"); + + migrationBuilder.CreateIndex( + name: "IX_Adm_T_Uom_UomCategoryId", + table: "Adm_T_Uom", + column: "UomCategoryId"); + + migrationBuilder.CreateIndex( + name: "IX_Adm_T_UomCategory_TenantId_Name", + table: "Adm_T_UomCategory", + columns: new[] { "TenantId", "Name" }, + unique: true, + filter: "[IsDeleted] = 0"); + migrationBuilder.CreateIndex( name: "IX_Adm_T_Videoroom_TenantId_BranchId_Name", table: "Adm_T_Videoroom", @@ -4046,6 +4047,56 @@ namespace Sozsoft.Platform.Migrations unique: true, filter: "[IsDeleted] = 0"); + migrationBuilder.CreateIndex( + name: "IX_Hr_T_Department_TenantId_BranchId_Name", + table: "Hr_T_Department", + columns: new[] { "TenantId", "BranchId", "Name" }, + unique: true, + filter: "[IsDeleted] = 0"); + + migrationBuilder.CreateIndex( + name: "IX_Hr_T_JobPosition_DepartmentId", + table: "Hr_T_JobPosition", + column: "DepartmentId"); + + migrationBuilder.CreateIndex( + name: "IX_Hr_T_JobPosition_TenantId_Name_DepartmentId", + table: "Hr_T_JobPosition", + columns: new[] { "TenantId", "Name", "DepartmentId" }, + unique: true, + filter: "[IsDeleted] = 0"); + + migrationBuilder.CreateIndex( + name: "IX_Hr_T_Skill_SkillTypeId", + table: "Hr_T_Skill", + column: "SkillTypeId"); + + migrationBuilder.CreateIndex( + name: "IX_Hr_T_Skill_TenantId_SkillTypeId_Name", + table: "Hr_T_Skill", + columns: new[] { "TenantId", "SkillTypeId", "Name" }, + unique: true, + filter: "[IsDeleted] = 0"); + + migrationBuilder.CreateIndex( + name: "IX_Hr_T_SkillLevel_SkillTypeId", + table: "Hr_T_SkillLevel", + column: "SkillTypeId"); + + migrationBuilder.CreateIndex( + name: "IX_Hr_T_SkillLevel_TenantId_SkillTypeId_Name", + table: "Hr_T_SkillLevel", + columns: new[] { "TenantId", "SkillTypeId", "Name" }, + unique: true, + filter: "[IsDeleted] = 0"); + + migrationBuilder.CreateIndex( + name: "IX_Hr_T_SkillType_TenantId_Name", + table: "Hr_T_SkillType", + columns: new[] { "TenantId", "Name" }, + unique: true, + filter: "[IsDeleted] = 0"); + migrationBuilder.CreateIndex( name: "IX_OpenIddictApplications_ClientId", table: "OpenIddictApplications", @@ -4337,56 +4388,6 @@ namespace Sozsoft.Platform.Migrations unique: true, filter: "[IsDeleted] = 0"); - migrationBuilder.CreateIndex( - name: "IX_Hr_T_Skill_SkillTypeId", - table: "Hr_T_Skill", - column: "SkillTypeId"); - - migrationBuilder.CreateIndex( - name: "IX_Hr_T_Skill_TenantId_SkillTypeId_Name", - table: "Hr_T_Skill", - columns: new[] { "TenantId", "SkillTypeId", "Name" }, - unique: true, - filter: "[IsDeleted] = 0"); - - migrationBuilder.CreateIndex( - name: "IX_Hr_T_SkillLevel_SkillTypeId", - table: "Hr_T_SkillLevel", - column: "SkillTypeId"); - - migrationBuilder.CreateIndex( - name: "IX_Hr_T_SkillLevel_TenantId_SkillTypeId_Name", - table: "Hr_T_SkillLevel", - columns: new[] { "TenantId", "SkillTypeId", "Name" }, - unique: true, - filter: "[IsDeleted] = 0"); - - migrationBuilder.CreateIndex( - name: "IX_Hr_T_SkillType_TenantId_Name", - table: "Hr_T_SkillType", - columns: new[] { "TenantId", "Name" }, - unique: true, - filter: "[IsDeleted] = 0"); - - migrationBuilder.CreateIndex( - name: "IX_Adm_T_Uom_TenantId_Name_UomCategoryId", - table: "Adm_T_Uom", - columns: new[] { "TenantId", "Name", "UomCategoryId" }, - unique: true, - filter: "[IsDeleted] = 0"); - - migrationBuilder.CreateIndex( - name: "IX_Adm_T_Uom_UomCategoryId", - table: "Adm_T_Uom", - column: "UomCategoryId"); - - migrationBuilder.CreateIndex( - name: "IX_Adm_T_UomCategory_TenantId_Name", - table: "Adm_T_UomCategory", - columns: new[] { "TenantId", "Name" }, - unique: true, - filter: "[IsDeleted] = 0"); - migrationBuilder.CreateIndex( name: "IX_Sas_T_Branch_Code", table: "Sas_T_Branch", @@ -4526,9 +4527,6 @@ namespace Sozsoft.Platform.Migrations migrationBuilder.DropTable( name: "Adm_T_IpRestriction"); - migrationBuilder.DropTable( - name: "Hr_T_JobPosition"); - migrationBuilder.DropTable( name: "Adm_T_MessengerConversationMessage"); @@ -4568,6 +4566,9 @@ namespace Sozsoft.Platform.Migrations migrationBuilder.DropTable( name: "Adm_T_SurveyQuestionOption"); + migrationBuilder.DropTable( + name: "Adm_T_Uom"); + migrationBuilder.DropTable( name: "Adm_T_VideoroomAttandance"); @@ -4580,6 +4581,15 @@ namespace Sozsoft.Platform.Migrations migrationBuilder.DropTable( name: "Adm_T_WorkHour"); + migrationBuilder.DropTable( + name: "Hr_T_JobPosition"); + + migrationBuilder.DropTable( + name: "Hr_T_Skill"); + + migrationBuilder.DropTable( + name: "Hr_T_SkillLevel"); + migrationBuilder.DropTable( name: "OpenIddictScopes"); @@ -4676,15 +4686,6 @@ namespace Sozsoft.Platform.Migrations migrationBuilder.DropTable( name: "Sas_H_SettingDefinition"); - migrationBuilder.DropTable( - name: "Hr_T_Skill"); - - migrationBuilder.DropTable( - name: "Hr_T_SkillLevel"); - - migrationBuilder.DropTable( - name: "Adm_T_Uom"); - migrationBuilder.DropTable( name: "Sas_T_Branch"); @@ -4721,9 +4722,6 @@ namespace Sozsoft.Platform.Migrations migrationBuilder.DropTable( name: "Adm_T_Event"); - migrationBuilder.DropTable( - name: "Hr_T_Department"); - migrationBuilder.DropTable( name: "Adm_T_MessengerConversation"); @@ -4742,9 +4740,18 @@ namespace Sozsoft.Platform.Migrations migrationBuilder.DropTable( name: "Adm_T_SurveyQuestion"); + migrationBuilder.DropTable( + name: "Adm_T_UomCategory"); + migrationBuilder.DropTable( name: "Adm_T_Videoroom"); + migrationBuilder.DropTable( + name: "Hr_T_Department"); + + migrationBuilder.DropTable( + name: "Hr_T_SkillType"); + migrationBuilder.DropTable( name: "OpenIddictAuthorizations"); @@ -4772,12 +4779,6 @@ namespace Sozsoft.Platform.Migrations migrationBuilder.DropTable( name: "Sas_H_Order"); - migrationBuilder.DropTable( - name: "Hr_T_SkillType"); - - migrationBuilder.DropTable( - name: "Adm_T_UomCategory"); - migrationBuilder.DropTable( name: "Sas_T_ForumTopic"); diff --git a/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/PlatformDbContextModelSnapshot.cs b/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/PlatformDbContextModelSnapshot.cs index e66410a7..4d5fe7da 100644 --- a/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/PlatformDbContextModelSnapshot.cs +++ b/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/PlatformDbContextModelSnapshot.cs @@ -6062,15 +6062,15 @@ namespace Sozsoft.Platform.Migrations .HasPrecision(18, 6) .HasColumnType("decimal(18,6)"); + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + b.Property("Type") .IsRequired() .HasMaxLength(32) .HasColumnType("nvarchar(32)"); - b.Property("TenantId") - .HasColumnType("uniqueidentifier") - .HasColumnName("TenantId"); - b.Property("UomCategoryId") .IsRequired() .HasMaxLength(128) @@ -7805,6 +7805,10 @@ namespace Sozsoft.Platform.Migrations .HasMaxLength(128) .HasColumnType("nvarchar(128)"); + b.Property("Gender") + .HasMaxLength(16) + .HasColumnType("nvarchar(16)"); + b.Property("GraduationSchool") .HasMaxLength(256) .HasColumnType("nvarchar(256)"); diff --git a/api/src/Sozsoft.Platform.EntityFrameworkCore/Seeds/TenantIdentityDataSeeder.cs b/api/src/Sozsoft.Platform.EntityFrameworkCore/Seeds/TenantIdentityDataSeeder.cs index 4c8f7f3f..4ab57366 100644 --- a/api/src/Sozsoft.Platform.EntityFrameworkCore/Seeds/TenantIdentityDataSeeder.cs +++ b/api/src/Sozsoft.Platform.EntityFrameworkCore/Seeds/TenantIdentityDataSeeder.cs @@ -152,7 +152,8 @@ public class TenantIdentityDataSeeder : IdentityDataSeeder adminUser.SetJobPositionId(PlatformConsts.AbpIdentity.User.AdminJobPositionIdDefaultValue); adminUser.SetAvatar(GetAvatar(tenantId?.ToString(), adminUser.Id.ToString())); adminUser.SetUserType(PlatformConsts.AbpIdentity.User.InternalUserTypeDefaultValue); - + adminUser.SetGender(PlatformConsts.AbpIdentity.User.AdminGenderDefaultValue); + (await UserManager.CreateAsync(adminUser, adminPassword, validatePassword: false)).CheckErrors(); result.CreatedAdminUser = true; diff --git a/claude.md b/claude.md index 71697cd6..195eacea 100644 --- a/claude.md +++ b/claude.md @@ -293,7 +293,9 @@ Bir çelişki varsa sıra: `ai.instructions.md` → `dotnet.instructions.md` → - **MCP şema araçları** → tablo/sütun bilgisi canlı katalogdan değil `Sas_H_DbTableColumn` sözlüğünden okunur (`IMcpSchemaDictionary`). Sözlüğün alan adları `dbo.Sas_H_ListFormFieldsDictionaryJson` prosedürünün ürettiği JSON ile birebir aynıdır; - prosedür değişirse `McpDictionaryListForm`/`McpDictionaryField` de değişir. + prosedür değişirse `McpDictionaryListForm`/`McpDictionaryField` de değişir. Sözlük tablo kataloğunu + değil ekranların alanlarını döker: bir tablonun ekranda alan olarak tanımlanmamış kolonunu MCP göremez. + Modelin okuması gereken kolon (ör. `AbpUsers`'ın kişisel bilgileri) ilgili ekranda gizli alan olarak durur. - **MCP OAuth** → bilinen sağlayıcılar (Claude, ChatGPT) seed edilmiş `Platform_Mcp` istemcisini, diğer MCP istemcileri `/connect/register` ile üretilen `mcp_` önekli açık onaylı istemcileri kullanır (`McpOAuthClientManager`; seed `McpOAuthClientDataSeedContributor`). Bilinen sağlayıcı diff --git a/configs/seeds/host/data/App.DevRequests/ce4269ad-8d08-487a-9e36-c002dd482a3c.json b/configs/seeds/host/data/App.DevRequests/ce4269ad-8d08-487a-9e36-c002dd482a3c.json index c3874d5f..e0407c4b 100644 --- a/configs/seeds/host/data/App.DevRequests/ce4269ad-8d08-487a-9e36-c002dd482a3c.json +++ b/configs/seeds/host/data/App.DevRequests/ce4269ad-8d08-487a-9e36-c002dd482a3c.json @@ -9,18 +9,18 @@ "TenantId": null, "UserName": "system@sozsoft.com", "RequestDate": null, - "Status": "Testing", + "Status": "Backlog", "Title": "Human Resources -> Sağlık", - "Description": "

Bu eklenecekler Human Resources -> Sağlık alt menüsünün içerisine eklenecektir.


İstirahat Listesi : Çalışanların istirahat listesi ekranıdır. İstirahat Tipi: Hastalık, İş Kazası, Analık, Meslek Hastalığı gibi seçilebilmelidir.



Muayene Listesi : Çalışanların Muayene Listesidir. Her kullanıcının periyodik veya plansız şekilde yapılan muayene sonuçlarının listesidir.


Sağlık Kartları: Her çalışanın detaylı şekilde sağlık bilgilerinin yer aldığı ekrandır. bu liste Kullanıcı listesinin bir benzeri olabilir. Detay formuna geçince aşağıdaki resimlere ait detay formu açılmalı. Bu ekranın içerisinde 9 farklı tab içerisinde ayrı bilgiler içermektedir. Aşağıda bu tabların resimlerini gönderiyorum. Genel, Fiziki Muayeene, Anamnez1, Anamnez2,Anamnez3, Sonuç komponentlerine AllowAdding true olamayacağı için bu komponentlerdeki değerleri AbpUsers tablosuna extension olarak tanımlanabilir. Ayrıca Anamnez1, Anamnez2, Anamnez3 tek bir komponent olabilir


Hasta Kayıt Defteri: Kullanıcıların hasta olduklarında doldurdukları listedir. Tip sütununda Hastalık, İş Kazası Dönüş, İstirahat Dönüş, Sonuç kısmında Tedavi (Taburcu), Sevk ve İstirahat seçenekleri olmalı. Sevk olaunca Sevk Yeri açılıyor.

", + "Description": "

Bu eklenecekler Human Resources -> Sağlık alt menüsünün içerisine eklenecektir. Çalışan (Kullanıcı) ile ilgili tüm bilgileri AbpUsers tablosundan alınabilir. Örneğin Idendity Number, Gender, EducationStatus, BirthDate vs. tüm bilgiler bu tablodan alınabilir. Branch bilgisi eğer kullanıcı birden fazla Branch yetkisi varsa seçmeli, eğer bir branch yetkisi varsa o branch kullanıcı seçildikten sonra otomatik gelmeli.


İstirahat Listesi : Çalışanların istirahat listesi ekranıdır. İstirahat Tipi: Hastalık, İş Kazası, Analık, Meslek Hastalığı gibi seçilebilmelidir.


Muayene Listesi : Çalışanların Muayene Listesidir. Her kullanıcının periyodik veya plansız şekilde yapılan muayene sonuçlarının listesidir.Kullanıcı seçilince Eğitim Durumu, Tc Kimlik No, Doğum Tarihi, Departman gibi bilgiler otomatik gelir.



Hasta Kayıt Defteri: Kullanıcıların hasta olduklarında doldurdukları listedir. Tip sütununda Hastalık, İş Kazası Dönüş, İstirahat Dönüş, Sonuç kısmında Tedavi (Taburcu), Sevk ve İstirahat seçenekleri olmalı. Sevk olaunca Sevk Yeri açılıyor. Kullanıcı seçilince Adres, yaş, cinsiyet gibi bilgiler otomatik gelir. Sıra No sütunu eklenmeyecek.

", "DueDate": "2026-09-30T13:58:00", "Tags": "HR", "Assignees": "system@sozsoft.com", "Priority": "5", "Completed": false, "SortOrder": 0, - "Timesheets": "[{\"id\":\"a0f1c316-3b52-ac49-ca30-3a2405b7b8f3\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"Talep analiz edildi\",\"duration\":0.0333},{\"id\":\"d663f14d-57b6-d290-ce78-3a2405bb7226\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"Talep analiz edildi\",\"duration\":0.0667},{\"id\":\"685109c1-e679-2ca0-c21d-3a2405bd6448\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"Hr_T_HealthCard tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"3349a545-65e0-36f1-b443-3a2405bd87a6\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"Hr_T_HealthCardWorkHistory tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"3283ba27-2815-0a37-fa80-3a2405bda28a\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"Hr_T_HealthCardFile tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"572dca14-6b18-4b36-8ac7-3a2405bdb890\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"Hr_T_SickLeave tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"7ad38b49-606b-033b-c7d1-3a2405bdd3e0\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"Hr_T_Examination tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"3634fb91-dd88-4951-f3a7-3a2405bdec00\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"Hr_T_PatientRecord tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"5770d408-569c-0f71-7abe-3a2405be7cf9\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"SickLeave.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"2519bbc8-6be8-ef13-2997-3a2405bf22c2\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"Examination.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"691db3b2-f75f-c2ed-9648-3a2405bfbce6\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"PatientRecord.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"f7c9f315-9792-b344-15fc-3a2405bffd30\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"HealthCardWorkHistory.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"535798e6-3fbb-e458-0116-3a2405c0d1c9\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"HealthCardGeneral.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"a49d4cf7-99c5-c1d8-35a5-3a2405c17584\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"HealthCardLab.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"ed516c35-566b-82ea-1096-3a2405c1f744\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"HealthCardAnamnesis1.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"dad5e5b1-6f48-f242-1f0e-3a2405c25d1d\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"HealthCardAnamnesis2.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"abce155b-4f3d-6aa1-d414-3a2405c2adb3\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"HealthCardAnamnesis3.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"0be91fd3-2280-f0df-e54b-3a2405c31afb\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"HealthCardResult.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"2219a38c-8bab-c330-c3d4-3a2405c364ab\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"HealthCardFile.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"0de44dac-3f31-5f09-e3ad-3a2405c3ef87\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"HealthCard.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"a8b69fb8-04e0-42e4-142b-3a2405c4190f\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"18 tamamlanm\\u0131\\u015F alt g\\u00F6rev eklendi\",\"duration\":0.0167},{\"id\":\"8fd317f8-4bcb-08c9-e34d-3a2405c44b71\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"Analize \\u00FCretim notu eklendi\",\"duration\":0.0167},{\"id\":\"d8ad0c50-8496-9565-ef81-3a2405c45a28\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"App.DevRequests ekran\\u0131nda sat\\u0131r g\\u00FCncellendi (Status)\",\"duration\":0.0167},{\"id\":\"60efca67-11b3-78bf-34a0-3a24061f241b\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"Talep analiz edildi\",\"duration\":0.05},{\"id\":\"3dcb7d4d-1bdb-3c59-7dc8-3a2406238d53\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"Hr_T_HealthCard tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"d45e423e-35e6-bb6f-34de-3a240623a358\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"Hr_T_HealthCardWorkHistory tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"84f3b35f-92ab-18e3-13e6-3a240623b2ba\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"Hr_T_HealthCardFile tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"1962ea16-4d2d-a91d-4673-3a240623cf6a\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"Hr_T_SickLeave tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"2bf4eb00-b49a-7275-42db-3a240623f162\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"Hr_T_Examination tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"9138c393-bd6d-781b-5958-3a24062409a4\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"Hr_T_PatientRecord tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"dd8a7377-3aee-af5c-7aff-3a240624a081\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"SickLeave.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"0daeeb54-3fc0-0e88-0b9d-3a240625497a\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"Examination.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"d46ffaa7-220d-8b29-d473-3a240625f34d\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"PatientRecord.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"998865ba-ae46-00e1-5093-3a240626d986\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"HealthCardGeneral.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"76e098bc-c4f6-b3cc-7cda-3a240627197b\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"HealthCardWorkHistory.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"aefc6477-e471-6f99-500b-3a240627b7d2\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"HealthCardLab.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"0c958304-53bf-d0d0-d661-3a2406289476\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"HealthCardAnamnesis.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"320e67ad-77e6-06e8-9ad5-3a2406290827\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"HealthCardResult.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"b007d7d2-254d-0069-f81d-3a24062952bf\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"HealthCardFile.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"5dc4c721-ff5a-f9c9-f4c4-3a240629d9aa\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"HealthCard.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"56de254a-35c5-54eb-107e-3a240629ffd0\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"16 tamamlanm\\u0131\\u015F alt g\\u00F6rev eklendi\",\"duration\":0.0167},{\"id\":\"0965b809-3df6-b8a2-190c-3a24062a390a\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"Analize \\u00FCretim notu eklendi\",\"duration\":0.0167}]", - "SubTasks": "[{\"id\":\"6123e46d-7e8e-2869-0c0a-3a2405c418c2\",\"title\":\"create_table: Hr_T_HealthCard\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-09-30\",\"completed\":true},{\"id\":\"3a161677-a10d-6530-b6c5-3a2405c418c2\",\"title\":\"create_table: Hr_T_HealthCardWorkHistory\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-09-30\",\"completed\":true},{\"id\":\"156a5e00-fea2-49ed-0f32-3a2405c418c2\",\"title\":\"create_table: Hr_T_HealthCardFile\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-09-30\",\"completed\":true},{\"id\":\"9a0011a5-77b0-e335-5005-3a2405c418c2\",\"title\":\"create_table: Hr_T_SickLeave\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-09-30\",\"completed\":true},{\"id\":\"fdd4b23d-3f39-a2eb-8727-3a2405c418c2\",\"title\":\"create_table: Hr_T_Examination\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-09-30\",\"completed\":true},{\"id\":\"b80e1f42-1610-b6fd-e5ac-3a2405c418c2\",\"title\":\"create_table: Hr_T_PatientRecord\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-09-30\",\"completed\":true},{\"id\":\"90be2597-0894-ac9c-6fd9-3a2405c418c2\",\"title\":\"deploy_wizard: SickLeave.json\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-09-30\",\"completed\":true},{\"id\":\"c994a95e-56a7-9257-3166-3a2405c418c2\",\"title\":\"deploy_wizard: Examination.json\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-09-30\",\"completed\":true},{\"id\":\"2d5ae25a-a0f9-31cb-4cd4-3a2405c418c2\",\"title\":\"deploy_wizard: PatientRecord.json\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-09-30\",\"completed\":true},{\"id\":\"ff20b49b-1f58-b8d3-19f4-3a2405c418c2\",\"title\":\"deploy_wizard: HealthCardWorkHistory.json\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-09-30\",\"completed\":true},{\"id\":\"54180c26-839a-5d34-2b27-3a2405c418c2\",\"title\":\"deploy_wizard: HealthCardGeneral.json\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-09-30\",\"completed\":true},{\"id\":\"410fffd5-bbb7-c0ec-0385-3a2405c418c2\",\"title\":\"deploy_wizard: HealthCardLab.json\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-09-30\",\"completed\":true},{\"id\":\"0c82dcd4-14a9-cf98-f90f-3a2405c418c2\",\"title\":\"deploy_wizard: HealthCardAnamnesis1.json\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-09-30\",\"completed\":true},{\"id\":\"31117aaa-61c9-fba6-250d-3a2405c418c2\",\"title\":\"deploy_wizard: HealthCardAnamnesis2.json\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-09-30\",\"completed\":true},{\"id\":\"ef6c4412-3932-97cd-8f6f-3a2405c418c2\",\"title\":\"deploy_wizard: HealthCardAnamnesis3.json\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-09-30\",\"completed\":true},{\"id\":\"d061f282-642d-3118-c6cd-3a2405c418c2\",\"title\":\"deploy_wizard: HealthCardResult.json\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-09-30\",\"completed\":true},{\"id\":\"d4f81759-e8e0-d71e-830e-3a2405c418c2\",\"title\":\"deploy_wizard: HealthCardFile.json\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-09-30\",\"completed\":true},{\"id\":\"09776b00-042b-4480-39f3-3a2405c418c2\",\"title\":\"deploy_wizard: HealthCard.json\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-09-30\",\"completed\":true},{\"id\":\"5a6bb1d4-7a53-3017-ed4b-3a240629ff7c\",\"title\":\"create_table: Hr_T_HealthCard\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-09-30\",\"completed\":true},{\"id\":\"34925778-5cbc-4985-5e27-3a240629ff7c\",\"title\":\"create_table: Hr_T_HealthCardWorkHistory\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-09-30\",\"completed\":true},{\"id\":\"5bed6c36-7ed9-239f-f80f-3a240629ff7c\",\"title\":\"create_table: Hr_T_HealthCardFile\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-09-30\",\"completed\":true},{\"id\":\"bdb5b531-c138-f0cb-9651-3a240629ff7c\",\"title\":\"create_table: Hr_T_SickLeave\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-09-30\",\"completed\":true},{\"id\":\"1cd30c82-193c-d4c7-58ab-3a240629ff7c\",\"title\":\"create_table: Hr_T_Examination\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-09-30\",\"completed\":true},{\"id\":\"39c89298-4fdf-72b6-e18c-3a240629ff7c\",\"title\":\"create_table: Hr_T_PatientRecord\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-09-30\",\"completed\":true},{\"id\":\"2f24ba6e-4f9f-693f-3575-3a240629ff7c\",\"title\":\"deploy_wizard: SickLeave.json\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-09-30\",\"completed\":true},{\"id\":\"476e37df-76c1-d527-5f3c-3a240629ff7c\",\"title\":\"deploy_wizard: Examination.json\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-09-30\",\"completed\":true},{\"id\":\"49447c0a-286b-dd58-b212-3a240629ff7c\",\"title\":\"deploy_wizard: PatientRecord.json\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-09-30\",\"completed\":true},{\"id\":\"ce05b42f-606e-2e8e-b940-3a240629ff7c\",\"title\":\"deploy_wizard: HealthCardGeneral.json (List, kart olu\\u015Fturma)\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-09-30\",\"completed\":true},{\"id\":\"af296ed5-c6e7-8c38-53c5-3a240629ff7c\",\"title\":\"deploy_wizard: HealthCardWorkHistory.json\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-09-30\",\"completed\":true},{\"id\":\"6a842baa-76b1-674f-f8ab-3a240629ff7c\",\"title\":\"deploy_wizard: HealthCardLab.json\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-09-30\",\"completed\":true},{\"id\":\"ed5d8c8c-4560-6413-d887-3a240629ff7c\",\"title\":\"deploy_wizard: HealthCardAnamnesis.json (Anamnez 1-3 birle\\u015Fik)\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-09-30\",\"completed\":true},{\"id\":\"fc9b0b09-181e-e035-3747-3a240629ff7c\",\"title\":\"deploy_wizard: HealthCardResult.json\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-09-30\",\"completed\":true},{\"id\":\"8c7979ad-7851-4d36-de7e-3a240629ff7c\",\"title\":\"deploy_wizard: HealthCardFile.json\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-09-30\",\"completed\":true},{\"id\":\"1fbb291c-5ff0-9ce0-c896-3a240629ff7c\",\"title\":\"deploy_wizard: HealthCard.json\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-09-30\",\"completed\":true}]", - "Analysis": "

1. Amaç

\n

İş sağlığı biriminin (işyeri hekimi / İK) İK › Sağlık menüsünde şu kayıtları tutması:

\n
    \n
  • Çalışanların istirahat raporları
  • \n
  • Periyodik ve plansız muayeneler
  • \n
  • Revir hasta kayıtları
  • \n
  • Kişi bazlı sağlık kartı (işe giriş formu)
  • \n
\n

Sağlık Kartları ekranı, Kullanıcı listesine benzer biçimde aktif kullanıcıların tamamını listeler. Detaya geçilince sekmeli kart açılır ve sağlık bilgileri orada girilip düzenlenir. Kart kaydı silinmez.

\n\n

2. Görsel analizi

\n
    \n
  • [image-1] İstirahat Listesi — liste + popup form \"İstirahat Girişi\".\n
      \n
    • Grid: Sicil No, Adı Soyadı, Şube Adı, Departman, Başlangıç / Bitiş Tarihi, Gün, İstirahat Tipi, Kurum, Bölüm, İstirahat Sebebi.
    • \n
    • Form: Adı Soyadı (seçim), Şube Adı, TC Numarası, Departmanı, tarihler, Gün, İstirahat Tipi / Kurum Adı / Bölüm (seçim), İstirahat Sebebi.
    • \n
    • Görünen satır: Kişi ve kurum kayıtlarına bağlı; demo veri üretilmez.
    • \n
  • \n
  • [image-2] Periyodik Muayene Listesi — liste + popup form.\n
      \n
    • Grid: TC, Adı Soyadı, Görevi, Departman, Muayene, Sonuç, Muayene Tarihi, Doktor, Diploma No / Tarihi, İş Yeri Hekim Belge No / Tarihi, Şube Adı.
    • \n
    • Form: Fotoğraf, Adı, T.C Kimlik No, Doğum Tarihi, Tarih (bugün), Eğitim Durumu, Çalıştığı Bölüm, Muayene, Sonuç, Doktor, Diploma Tarihi / No.
    • \n
  • \n
  • [image-3…11] Personel Sağlık Kartı — başlıkta \"İş Yerinin\" ve \"Çalışanın\" alanları, altında şu sekmeler:\n
      \n
    • Genel: önceki iş yerleri, soy / öz geçmiş
    • \n
    • Laboratuvar – Fizik Muayene
    • \n
    • Tıbbi Anamnez 1–3
    • \n
    • Sonuç
    • \n
    • Periyodik Muayeneler
    • \n
    • Hasta Protokol Defteri
    • \n
    • Dosyalar
    • \n
  • \n
  • [image-12] Hasta Kayıt Defteri — liste + popup form.\n
      \n
    • Grid: Sıra No, Adı Soyadı, Adres, Yaş, Cinsiyet, Doktor, Protokol Tipi, İstirahat Günü, Sonuç, Sevk Yeri, Şube Adı, Açıklama.
    • \n
    • Form: Tip varsayılanı Hastalık, Sonuç varsayılanı Tedavi (Taburcu). İstirahat Gün ve Sevk Yeri pasif gelir.
    • \n
  • \n
  • Butonlar: Standart liste ve form butonlarıdır.
  • \n
\n\n

3. Çözüm yolu

\n

Wizard List — tüm ekranlar ListForm'dur; çerçeve dışı değişiklik yoktur.

\n
    \n
  • Sağlık Kartları ana ekranı: Sorgu kaynaklıdır (SelectCommandType: 4).\n
      \n
    • AbpUsers üzerinden aktif kullanıcıları listeler; karttan özet kolonlar LEFT JOIN ile gelir.
    • \n
    • Anahtar kullanıcı Id'sidir.
    • \n
    • Ekleme, güncelleme ve silme kapalı; yalnız detay açıktır.
    • \n
  • \n
  • Detay (/admin/form/App.Hr.HealthCard/{UserId}): 8 sekmeyi alt form olarak açar (Id → UserId).\n
      \n
    • Kart satırını oluşturan sekme: Genel. Bu sekme List tipidir; Yeni ile kart oluşturulur.
    • \n
    • Kartı yalnız güncelleyen sekmeler: Laboratuvar – Fizik, Tıbbi Anamnez, Sonuç. Bu sekmeler Form tipidir.
    • \n
  • \n
\n\n

4. Menü yeri

\n

İnsan Kaynakları › Sağlık › {İstirahat Listesi · Muayene Listesi · Hasta Kayıt Defteri · Sağlık Kartları}

\n\n\n\n\n\n\n\n\n
SeviyeKodAd (TR / EN)İkonDurum
KökApp.Hrİnsan Kaynakları / Human ResourcesFcConferenceCallVar
AraApp.Hr.HealthSağlık / HealthFcLikeYeni
EkranApp.Hr.SickLeaveİstirahat Listesi / Sick Leave ListFcOvertimeYeni
EkranApp.Hr.ExaminationMuayene Listesi / Examination ListFcInspectionYeni
EkranApp.Hr.PatientRecordHasta Kayıt Defteri / Patient RegisterFcViewDetailsYeni
EkranApp.Hr.HealthCardSağlık Kartları / Health CardsFcBusinessContactYeni
\n
    \n
  • Ortak ayarlar: ModuleId Hr · İzin grubu App.Hr (Var) · Route /admin/list/{ListFormCode} · MenuParentPath = [App.Hr], MenuParentCode = App.Hr.Health.
  • \n
  • Yetki: App.Hr › App.Hr.Health › {App.Hr.SickLeave | App.Hr.Examination | App.Hr.PatientRecord | App.Hr.HealthCard}. App.Hr.Health yeni.
  • \n
  • Menüsüz alt ekranlar (6) (CreateMenu: false, aynı dalda): App.Hr.HealthCardGeneral, .HealthCardWorkHistory, .HealthCardLab, .HealthCardAnamnesis, .HealthCardResult, .HealthCardFile.
  • \n
  • Sıra: Alt formu olan ekran, alt formlarından sonra kurulur. Bu yüzden Sağlık Kartları menünün sonundadır.
  • \n
\n\n

5. Veri modeli

\n
    \n
  • Ortak: Tüm tablolar yeni, tenant + tam audit alanlıdır. Ekranlar IsTenant = true, IsBranch = false.
  • \n
  • Tanım tablosu: Hayır (hepsi) — kayıtlar hareket ya da kişiye bağlı kart verisidir; IsActive yoktur.
  • \n
  • Lookup kaynakları: Hr_T_Hospital, Hr_T_HospitalDepartment, Hr_T_Doctor, Hr_T_DocumentType, Hr_T_Department, Hr_T_JobPosition, Sas_T_Branch, AbpUsers (salt okunur).
  • \n
\n

Sağlık Kartları liste sorgusu (SelectCommand, anahtar Id = kullanıcı Id'si):

\n

SELECT u.Id, u.TenantId, u.IsDeleted, u.Name + ' ' + u.Surname AS FullName, u.Email, u.PhoneNumber, d.Name AS DepartmentName, jp.Name AS JobPositionName, hc.IdentityNo, hc.BirthDate, hc.BloodType, ISNULL(hc.ShiftWorkFit, CAST(0 AS bit)) AS ShiftWorkFit, ISNULL(hc.NightWorkFit, CAST(0 AS bit)) AS NightWorkFit, CASE WHEN hc.Id IS NULL THEN CAST(0 AS bit) ELSE CAST(1 AS bit) END AS HasCard FROM AbpUsers u LEFT JOIN Hr_T_HealthCard hc ON hc.UserId = u.Id AND hc.IsDeleted = 'false' LEFT JOIN Hr_T_Department d ON d.Id = u.DepartmentId LEFT JOIN Hr_T_JobPosition jp ON jp.Id = u.JobPositionId WHERE u.IsActive = 'true'

\n

Q-User — ortak personel lookup'ı (İstirahat, Muayene, Hasta Kayıt):

\n

SELECT u.Id AS [Key], u.Name + ' ' + u.Surname AS [Name], hc.IdentityNo, hc.BirthDate, hc.Gender, hc.EducationStatus, hc.HomeAddress, DATEDIFF(YEAR, hc.BirthDate, GETDATE()) AS Age, d.Name AS DepartmentName, jp.Name AS JobPositionName FROM AbpUsers u LEFT JOIN Hr_T_HealthCard hc ON hc.UserId = u.Id AND hc.IsDeleted = 'false' LEFT JOIN Hr_T_Department d ON d.Id = u.DepartmentId LEFT JOIN Hr_T_JobPosition jp ON jp.Id = u.JobPositionId WHERE u.IsDeleted = 'false' AND u.IsActive = 'true' AND u.TenantId = '@TENANTID' ORDER BY u.Name, u.Surname

\n

Q-Doctor — doktor lookup'ı:

\n

SELECT Id AS [Key], FullName AS [Name], DiplomaNo, DiplomaDate, OhsCertificateNo, OhsCertificateDate, ISNULL(CONVERT(varchar(10), DiplomaDate, 104), '') + ' / ' + ISNULL(DiplomaNo, '') AS DiplomaInfo, ISNULL(CONVERT(varchar(10), OhsCertificateDate, 104), '') + ' / ' + ISNULL(OhsCertificateNo, '') AS OhsInfo FROM Hr_T_Doctor WHERE IsDeleted = 'false' AND IsActive = 'true' AND TenantId = '@TENANTID' ORDER BY FullName

\n\n

Hr_T_SickLeave (İstirahat)

\n
    \n
  • UserId (zorunlu — Q-User)
  • \n
  • BranchId (zorunlu — Sas_T_Branch)
  • \n
  • IdentityNo (nvarchar 11), DepartmentName (nvarchar 200) — kopyalanır, salt okunur
  • \n
  • StartDate, EndDate (date, zorunlu)
  • \n
  • DayCount (int, hesaplanır)
  • \n
  • LeaveType (nvarchar 50, zorunlu — Hastalık, İş Kazası, Analık, Meslek Hastalığı)
  • \n
  • HospitalId (Hr_T_Hospital), HospitalDepartmentId (Hr_T_HospitalDepartment)
  • \n
  • Reason (nvarchar MAX)
  • \n
\n\n

Hr_T_Examination (Muayene)

\n
    \n
  • UserId (zorunlu — Q-User), BranchId (zorunlu)
  • \n
  • ExamDate (date, zorunlu)
  • \n
  • ExamType (nvarchar 50, zorunlu, DB varsayılanı 'Periyodik' — Periyodik, Plansız, İşe Giriş)
  • \n
  • Kopyalanan, salt okunur: IdentityNo, BirthDate, EducationStatus, JobPositionName, DepartmentName
  • \n
  • ExamNote, ExamResult (nvarchar MAX)
  • \n
  • DoctorId (zorunlu — Q-Doctor)
  • \n
  • Doktordan kopyalanan, salt okunur: DoctorDiplomaNo, DoctorDiplomaDate, DoctorOhsCertificateNo, DoctorOhsCertificateDate
  • \n
\n\n

Hr_T_PatientRecord (Hasta Kayıt Defteri)

\n
    \n
  • SequenceNo (int)
  • \n
  • UserId (zorunlu — Q-User), BranchId (zorunlu)
  • \n
  • RecordDate (date, zorunlu)
  • \n
  • Kopyalananlar: Age (int), Gender (nvarchar 1), Address (nvarchar MAX)
  • \n
  • ProtocolType (nvarchar 50, zorunlu, DB varsayılanı 'Hastalık' — Hastalık, İş Kazası Dönüş, İstirahat Dönüş)
  • \n
  • DoctorId (Q-Doctor)
  • \n
  • Result (nvarchar 50, zorunlu, DB varsayılanı 'Tedavi (Taburcu)' — Tedavi (Taburcu), Sevk, İstirahat)
  • \n
  • RestDays (int), ReferralPlace (nvarchar 200), Description (nvarchar MAX)
  • \n
\n\n

Hr_T_HealthCard (Sağlık Kartı — kullanıcı başına bir satır)

\n\n\n\n\n\n\n\n
SekmeKolonlar (tip)
KimlikUserId (uniqueidentifier, NOT NULL — ilişkiden gelir)
Genel (List)\n
    \n
  • İş Yerinin: BranchId (formda zorunlu — Ünvanı), SgkWorkplaceNo (nvarchar 50); şubeden kopyalanan WorkplaceAddress, WorkplacePhone, WorkplaceFax, WorkplaceEmail.
  • \n
  • Çalışanın: IdentityNo, BirthPlace, BirthDate, HireDate, Gender, MaritalStatus, EducationStatus, ChildCount, HomeAddress, JobDescription.
  • \n
  • Soy Geçmişi: Mother / Father / Sibling / Child + Status (Sağ, Vefat) ve Note.
  • \n
  • Öz Geçmişi: BloodType, ChronicDisease, Vaccination, Tetanus, Hepatitis, OtherVaccine.
  • \n
Laboratuvar – Fizik (Form)9 laboratuvar alanı (Lab…), 12 fizik muayene alanı (Phys…), BloodPressure, Pulse, Height, Weight, Bmi (decimal; Bmi hesaplanır)
Tıbbi Anamnez (Form, 3 grup)\n
    \n
  • Anamnez 1: 17 bit (Complaint…, Dx…).
  • \n
  • Anamnez 2: Hospitalized, Surgery, WorkAccident, OccDiseaseExam, Disability (bit) + …Note.
  • \n
  • Anamnez 3: UnderTreatment (bit) + Note; Smoking, Alcohol + Note.
  • \n
  • Tüm bit alanları NOT NULL, varsayılan 0.
  • \n
Sonuç (Form)FitnessNote1, FitnessNote2; ResultDoctorId + ResultDoctorDiploma, ResultDoctorOhsCert; ShiftWorkFit, NightWorkFit (bit); ShiftDoctorId + ShiftDoctorDiploma, ShiftDoctorOhsCert
\n\n

Hr_T_HealthCardWorkHistory (Önceki İş Yerleri)

\n
    \n
  • UserId (zorunlu)
  • \n
  • BusinessLine (nvarchar 200, zorunlu)
  • \n
  • JobDone (nvarchar 200)
  • \n
  • StartDate, EndDate (date)
  • \n
\n\n

Hr_T_HealthCardFile (Dosyalar)

\n
    \n
  • UserId (zorunlu)
  • \n
  • FileDate (date, zorunlu)
  • \n
  • DocumentTypeId (Hr_T_DocumentType)
  • \n
  • Description (nvarchar 200)
  • \n
  • FileContent (nvarchar MAX, zorunlu, dxImageUpload)
  • \n
\n\n

6. Etkilenen kısımlar

\n
    \n
  • Ekranlar ve menü: 4 menü ekranı, 6 menüsüz alt ekran, ara menü App.Hr.Health ve ara yetkisi.
  • \n
  • Yetkiler: Her ekranda R + .Create, .Update, .Delete, .Export, .Import, .Note. Alt ekran yetkisi verilmeyen rolde ilgili sekme görünmez.
  • \n
  • Dil anahtarları: Ekran, alan ve widget anahtarları (App.Hr.Health.Widget.*). Var olan App.Listform.ListformField.* metinleri ezilmez.
  • \n
  • Alt form ilişkileri (ana ekrandan, Id → UserId, DbType 9), sırayla:\n
      \n
    • Genel (List)
    • \n
    • Önceki İş Yerleri (List)
    • \n
    • Laboratuvar – Fizik (Form)
    • \n
    • Tıbbi Anamnez (Form)
    • \n
    • Sonuç (Form)
    • \n
    • Periyodik Muayeneler (App.Hr.Examination)
    • \n
    • Hasta Protokol Defteri (App.Hr.PatientRecord)
    • \n
    • Dosyalar
    • \n
  • \n
  • Dokunulmayanlar: AbpUsers ve diğer platform tabloları (yalnız okunur), var olan ekranlar, React sayfaları, iş akışı, bildirim, public yol.
  • \n
\n\n

7. Görünümler ve davranış

\n
    \n
  • Sağlık Kartları listesi:\n
      \n
    • Tüm aktif kullanıcılar görünür.
    • \n
    • Kolonlar: Adı Soyadı, Departman, Görevi, Telefon, E-posta, TC, Doğum Tarihi, Kan Grubu, Vardiyaya Uygun, Geceye Uygun, Kart Var.
    • \n
    • Yeni / Düzenle / Sil yok; Detay var.
    • \n
    • Görünümler: Grid, Card, Pivot, Chart.
    • \n
    • Widget'lar: Aktif Personel, Kartı Olan, Kartı Olmayan.
    • \n
  • \n
  • Genel sekmesi (List):\n
      \n
    • Grid: Kullanıcının kart satırını gösterir (TC, Doğum Tarihi, Cinsiyet, Ünvanı, Kan Grubu).
    • \n
    • Kartı olmayan kullanıcı: Yeni butonu popup formu açar; kayıt kartı oluşturur, UserId ilişkiden dolar.
    • \n
    • Kartı olan kullanıcı: Satır düzenlenir.
    • \n
    • Silme: Kapalı.
    • \n
    • Popup form grupları: İş Yerinin, Çalışanın, Soy Geçmişi, Öz Geçmişi.
    • \n
  • \n
  • Laboratuvar – Fizik, Tıbbi Anamnez, Sonuç (Form):\n
      \n
    • Yalnız güncelleme yapar; ekleme ve silme kapalıdır.
    • \n
    • Kart Genel sekmesinde oluşturulduktan sonra dolu gelir.
    • \n
    • Tıbbi Anamnez tek sekmede üç grup halindedir.
    • \n
  • \n
  • Önceki İş Yerleri, Dosyalar: Satır ekleme ve silme açıktır. Periyodik Muayeneler, Hasta Protokol Defteri: İlgili menü ekranlarının kişiye süzülmüş hâlidir.
  • \n
  • Kopyalama (EditorScript copy, değişimde):\n
      \n
    • UserId seçilince:\n
        \n
      • İstirahat: IdentityNo, DepartmentName.
      • \n
      • Muayene: IdentityNo, BirthDate, EducationStatus, JobPositionName, DepartmentName.
      • \n
      • Hasta Kayıt: Age, Gender, Address.
      • \n
    • \n
    • Doktor seçilince: Belge bilgileri kopyalanır.
    • \n
    • Genel'de BranchId seçilince: Şube adresi ve iletişim bilgileri kopyalanır.
    • \n
  • \n
  • Hesaplar:\n
      \n
    • DayCount = days(StartDate, EndDate) − 1.
    • \n
    • Bmi = Kilo / (Boy/100)².
    • \n
  • \n
  • Koşullu alanlar (Hasta Kayıt): RestDays yalnız Sonuç = İstirahat, ReferralPlace yalnız Sonuç = Sevk iken açıktır; Sonuç değişince ikisi temizlenir.
  • \n
  • Açılış varsayılanları (alan boşsa): Tarihler bugün; ExamType = Periyodik; ProtocolType = Hastalık; Result = Tedavi (Taburcu).
  • \n
  • Editörler:\n
      \n
    • Evet/Hayır alanları dxSwitch, zorunlu işaretlenmez.
    • \n
    • Seçimler dxSelectBox.
    • \n
    • Uzun metinler dxTextArea.
    • \n
    • FileContent dxImageUpload (görsel + PDF).
    • \n
    • TC 11 haneli maskeli.
    • \n
    • Gizli UserId alanları zorunlu değildir.
    • \n
  • \n
  • Widget'lar:\n
      \n
    • İstirahat: Toplam, Bugün İstirahatte, İş Kazası.
    • \n
    • Muayene: Toplam, Bugün, Periyodik.
    • \n
    • Hasta Kayıt: Toplam, Bugün, Sevk.
    • \n
  • \n
\n\n

8. Kararlar

\n
    \n
  • AbpUsers extension önerisi uygulanmaz.\n
      \n
    • Açıklamada, Form sekmelerinde ekleme yapılamadığı için kart alanlarının AbpUsers'a extension olarak eklenmesi öneriliyor.
    • \n
    • Rehber, platformun hazır tablolarına (AbpUsers) doğrudan yazan ekran üretilmesini yasaklar (reference §12.8); platform tablosuna kolon eklemek de çerçeve dışıdır (§0.8).
    • \n
    • Ayrıca üretim araçları var olan tabloya kolon ekleyemez.
    • \n
    • Aynı ihtiyaç, kart satırının List tipi Genel sekmesinden oluşturulmasıyla karşılanır. Form sekmeleri (Laboratuvar, Anamnez, Sonuç) yalnız bu satırı günceller.
    • \n
  • \n
  • Anamnez: Talep sahibinin önerisiyle Tıbbi Anamnez 1, 2 ve 3 tek sekmede (App.Hr.HealthCardAnamnesis) üç grup olarak birleştirilir. Sekme sayısı 8 olur.
  • \n
  • Önceki İş Yerleri: Genel artık List tipi olduğu için ayrı sekmededir; kullanıcıya bağlıdır ve kart oluşmadan da girilebilir.
  • \n
  • Liste kaynağı: Sağlık Kartları listesi aktif kullanıcılardan beslenir. Kart satırı Genel sekmesinden açılır; otomatik kart açan iş yoktur.
  • \n
  • Silme:\n
      \n
    • Sağlık Kartları listesinde ve kart sekmelerinde (Genel, Laboratuvar, Anamnez, Sonuç) silme yoktur.
    • \n
    • Dosyalar ve Önceki İş Yerleri satırları silinebilir. Muayene ve Hasta Kayıt satırları kendi ekranlarındaki gibi silinebilir (onay).
    • \n
  • \n
  • Tek kart kuralı:\n
      \n
    • Genel sekmesinde kart varken Yeni ile ikinci kart açılmamalıdır. Wizard bunu engelleyecek bir kısıt üretemez.
    • \n
    • Kesin koruma için SQL Query Manager'dan elle eklenecek bir tekil indeks önerilir: CREATE UNIQUE INDEX UX_Hr_T_HealthCard_User ON Hr_T_HealthCard (TenantId, UserId) WHERE IsDeleted = 0 (onay).
    • \n
  • \n
  • Başlık bilgileri:\n
      \n
    • Kullanıcı kaynaklı olanlar (ad, departman, görev, telefon, e-posta) detayda salt okunur gösterilir.
    • \n
    • Karta ait olanlar (TC, doğum, cinsiyet, medeni durum, eğitim, çocuk sayısı, adres, yaptığı iş, iş yeri) Genel sekmesinde düzenlenir (onay).
    • \n
  • \n
  • Fotoğraf: Kullanıcının avatarıdır, Kullanıcılar ekranında yönetilir (onay).
  • \n
  • Kişisel veriler: TC, doğum tarihi, cinsiyet, eğitim ve adres kartta tutulur; diğer ekranlar bunları karttan kopyalar.
  • \n
  • Genel sekmesi alanları:\n
      \n
    • İş Yerinin Ünvanı şube seçimidir; SGK İşyeri Sicil No elle girilir (onay).
    • \n
    • Doğum tarihinin yanındaki ikinci tarih İşe Giriş Tarihi (HireDate) olarak tutulur (onay).
    • \n
  • \n
  • Seçenek listeleri:\n
      \n
    • Soy Geçmişi: Sağ / Vefat (onay).
    • \n
    • Kan Grubu: A, B, AB, 0 × Rh+ / Rh−.
    • \n
    • Sigara: Hayır / Evet / Bıraktı. Alkol: Hayır / Evet / Ara Sıra (onay).
    • \n
    • Eğitim: İlkokul … Doktora.
    • \n
    • Medeni Durum: Bekar, Evli, Dul, Boşanmış.
    • \n
    • Muayene Tipi: Periyodik, Plansız, İşe Giriş (onay).
    • \n
  • \n
  • Sıra No: Hasta Kayıt Defteri'nde elle girilir (onay).
  • \n
  • Kurulum: Ortamda bu talebe ait tablo ve ekran yoktur; plan sıfırdan kurulumdur. Talepteki eski alt görev satırları önceki üretimden kalmıştır.
  • \n
\n\n

9. Üretim planı

\n
    \n
  1. create_table: Hr_T_HealthCard
  2. \n
  3. create_table: Hr_T_HealthCardWorkHistory
  4. \n
  5. create_table: Hr_T_HealthCardFile
  6. \n
  7. create_table: Hr_T_SickLeave
  8. \n
  9. create_table: Hr_T_Examination
  10. \n
  11. create_table: Hr_T_PatientRecord
  12. \n
  13. deploy_wizard: SickLeave.json
  14. \n
  15. deploy_wizard: Examination.json
  16. \n
  17. deploy_wizard: PatientRecord.json
  18. \n
  19. deploy_wizard: HealthCardGeneral.json
  20. \n
  21. deploy_wizard: HealthCardWorkHistory.json
  22. \n
  23. deploy_wizard: HealthCardLab.json
  24. \n
  25. deploy_wizard: HealthCardAnamnesis.json
  26. \n
  27. deploy_wizard: HealthCardResult.json
  28. \n
  29. deploy_wizard: HealthCardFile.json
  30. \n
  31. deploy_wizard: HealthCard.json
  32. \n
\n\n

10. Üretime hazır

\n

Evet

MCP (üretim — List tipi Genel + birleşik Anamnez)

\n
    \n
  • Tablolar (6): Hr_T_HealthCard, Hr_T_HealthCardWorkHistory, Hr_T_HealthCardFile, Hr_T_SickLeave, Hr_T_Examination, Hr_T_PatientRecord. Hepsi tenant ve tam audit alanlı; seed dosyaları host/sql/object/ altında.
  • \n
  • Menü ekranları (İK › Sağlık):\n
      \n
    • App.Hr.SickLeave
    • \n
    • App.Hr.Examination
    • \n
    • App.Hr.PatientRecord
    • \n
    • App.Hr.HealthCard — sorgu kaynaklı, aktif kullanıcılar; Yeni/Düzenle/Sil kapalı, Detay açık.
    • \n
  • \n
  • Detay sekmeleri (8): Hepsi Id → UserId ilişkisiyle bağlı.\n
      \n
    • App.Hr.HealthCardGeneral — List; ekleme ve güncelleme açık, silme kapalı; kart satırı burada oluşur.
    • \n
    • .HealthCardWorkHistory — List.
    • \n
    • .HealthCardLab, .HealthCardAnamnesis (Anamnez 1–3 dört grupta), .HealthCardResult — Form; yalnız güncelleme.
    • \n
    • App.Hr.Examination, App.Hr.PatientRecord, .HealthCardFile — List.
    • \n
  • \n
  • AbpUsers: Değiştirilmedi. Açıklamadaki extension önerisi uygulanmadı; gerekçe analizde (reference §12.8).
  • \n
  • Bekleyen elle adım (öneri): Tek kart kuralı için SQL Query Manager'dan tekil indeks eklenebilir:\n
      \n
    • CREATE UNIQUE INDEX UX_Hr_T_HealthCard_User ON Hr_T_HealthCard (TenantId, UserId) WHERE IsDeleted = 0
    • \n
  • \n
  • Bilinen görünüm notları:\n
      \n
    • Alt ekran gridlerinde UserId kolonu görünür kalabilir; ListForm editöründen gizlenebilir.
    • \n
    • Var olan App.Listform.ListformField.* başlıkları ezilmez.
    • \n
  • \n
  • Demo veri: Yok.
  • \n
  • Alt görev listesi: Önceki üretimden kalan 18 satır da listede duruyor; bu üretimin satırları sona eklendi.
  • \n
  • DB Migrate bekleyen wizard'lar (10): SickLeave, Examination, PatientRecord, HealthCardGeneral, HealthCardWorkHistory, HealthCardLab, HealthCardAnamnesis, HealthCardResult, HealthCardFile, HealthCard.
  • \n
" + "Timesheets": null, + "SubTasks": null, + "Analysis": "" } ] } diff --git a/configs/seeds/host/data/App.Languages.LanguageText.json b/configs/seeds/host/data/App.Languages.LanguageText.json index 54d254c7..025c56b4 100644 --- a/configs/seeds/host/data/App.Languages.LanguageText.json +++ b/configs/seeds/host/data/App.Languages.LanguageText.json @@ -31770,6 +31770,34 @@ "Key": "App.Listform.ListformField.Gender", "Value": "Cinsiyet" }, + { + "Id": "8b2bfaa8-2e63-5476-acae-ea326f9758d1", + "CultureName": "en", + "ResourceName": "Platform", + "Key": "App.StaticLookup.Male", + "Value": "Male" + }, + { + "Id": "ce60852a-a9bb-5a91-b99d-7b4b2a35f174", + "CultureName": "tr", + "ResourceName": "Platform", + "Key": "App.StaticLookup.Male", + "Value": "Erkek" + }, + { + "Id": "c1265549-443f-5332-a060-6d67b23e5ac9", + "CultureName": "en", + "ResourceName": "Platform", + "Key": "App.StaticLookup.Female", + "Value": "Female" + }, + { + "Id": "b400d0ec-4139-51da-a9a8-2d78103b4b87", + "CultureName": "tr", + "ResourceName": "Platform", + "Key": "App.StaticLookup.Female", + "Value": "Kadın" + }, { "Id": "374919e4-2ca5-5089-8abf-c77ee44e528d", "CultureName": "en", diff --git a/ui/src/proxy/admin/models.ts b/ui/src/proxy/admin/models.ts index 250b0aef..4320c7c6 100644 --- a/ui/src/proxy/admin/models.ts +++ b/ui/src/proxy/admin/models.ts @@ -148,6 +148,7 @@ export interface UserInfoViewModel extends ExtensibleObject { department?: AssignedDepartmentViewModel jobPositionId?: string nationality?: string + gender?: string sskNo?: string hireDate?: Date | string terminationDate?: Date | string diff --git a/ui/src/views/admin/profile/components/General.tsx b/ui/src/views/admin/profile/components/General.tsx index cbfa67bc..a99c4773 100644 --- a/ui/src/views/admin/profile/components/General.tsx +++ b/ui/src/views/admin/profile/components/General.tsx @@ -207,6 +207,12 @@ const General = () => { }, ] + // Değer dilden bağımsız anahtardır (PlatformConsts.AbpIdentity.User.Gender*). + const genderOptions: SelectBoxOption[] = [ + { value: 'Male', label: translate('::App.StaticLookup.Male') }, + { value: 'Female', label: translate('::App.StaticLookup.Female') }, + ] + const bloodTypeOptions: SelectBoxOption[] = [ { value: 'A Rh+', label: 'A Rh+' }, { value: 'A Rh-', label: 'A Rh-' }, @@ -329,6 +335,13 @@ const General = () => { )} /> + + + isDisabled + options={genderOptions} + value={getSelectValue(genderOptions, getProfileExtraValue('Gender'))} + /> + isDisabled diff --git a/ui/src/views/admin/user-management/Details.tsx b/ui/src/views/admin/user-management/Details.tsx index 21778b15..7403c0d3 100644 --- a/ui/src/views/admin/user-management/Details.tsx +++ b/ui/src/views/admin/user-management/Details.tsx @@ -443,6 +443,31 @@ function UserDetails() { }} + + + {({ field, form }: FieldProps) => { + const genderOptions: SelectBoxOption[] = [ + { value: 'Male', label: translate('::App.StaticLookup.Male') }, + { + value: 'Female', + label: translate('::App.StaticLookup.Female'), + }, + ] + return ( +