Kullanıcı tanımlamaları genişletildi ayrıca Intranet Hr taşındı

This commit is contained in:
Sedat ÖZTÜRK 2026-10-03 02:11:39 +03:00
parent fbaedd08df
commit b6797950b2
80 changed files with 13752 additions and 6457 deletions

View file

@ -1168,7 +1168,7 @@ bir kez çalışır; açılış verisi çekme ve `refs` üzerinden ilk durumu ku
`BackgroundWorker` kaydı (`Sas_H_BackgroundWorker`, ekran Saas › Background Workers ›
Recurring Jobs) `WorkerType: 1` (MailQueueWorker) ise gövde bu modüldür
(`api/modules/Sozsoft.MailQueue`). Diğer tipler: `2` SqlWorker (`BeforeSp`/`AfterSp`) · `3`
NotificationWorker · `4` SessionCleanupWorker · `5` BackupWorker. `Scope`: `1` Host · `2` Tenant ·
NotificationWorker · `4` SessionCleanupWorker · `5` BackupWorker · `6` ProbationReminderWorker. `Scope`: `1` Host · `2` Tenant ·
`3` All (host + her kiracı) — kiracı tablosuna dokunan iş `Host` olamaz (`README.md` §14). Hazır
işler `data/App.BackgroundWorkers.RecurringJobs.json` ile gelir.
@ -1256,6 +1256,7 @@ soneklerini alır.
| **Definitions › AiBot** | `App.Definitions.AiBot` | `Sas_H_AiBot` | host | Yapay zekâ asistanı tanımı (`Name`, `ApiUrl`, `Tenants`); `/admin/ai` bu kayıtları kullanır. |
| **Definitions › Global Search** | `App.Definitions.GlobalSearch` | `Sas_T_GlobalSearch` | tenant | Üretilen ekranın üst aramada çıkması için kayıt: `System`, `Group`, `Term`, `Weight`, `Url`. |
| **Definitions › Contact Title** | `App.Definitions.ContactTitle` | `Sas_H_ContactTitle` | host | Ünvan/hitap lookup'ı (`Title`, `Abbreviation`). |
| **Definitions › Termination Reasons** | `App.Definitions.TerminationReason` | `Sas_H_TerminationReason` | host | SGK işten çıkış kodları (`Code`, `Name`, `IsActive`); mevzuat kodu olduğu için bütün kiracılarda ortaktır. Seed `data/App.Definitions.TerminationReason.json` (06/07 mülga). Kullanıcının `TerminationReasonId` alanı `LookupQueryValues.TerminationReasonValues` ile buraya bağlanır. |
| **Definitions › Currency** | `App.Definitions.Currency` | `Sas_H_Currency` | host | Para birimi + `Rate`. Tutar alanı olan ekranın kur lookup'ı ve `DbQuery` varsayılanı buradan beslenir. |
| **Definitions › Country Group / Country / City / District** | `App.Definitions.CountryGroup` · `.Country` · `.City` · `.District` | `Sas_H_CountryGroup` · `Sas_H_Country` · `Sas_H_City` · `Sas_H_District` | host | Adres alanlarının hazır cascade zinciri (dört ayrı menü ve seed dosyası; `Order` sırası grup → ülke → il → ilçe). `Country` ayrıca `PhoneCode`, `PhoneNumberFormat`, `ZipRequired`, `StateRequired`, `TaxLabel` taşır — adres doğrulaması için kullan. |
| **Public › Products / Payment Methods / Installment Options** | `App.Orders.Products` · `.PaymentMethods` · `.InstallmentOptions` | `Sas_H_Product` · `Sas_H_PaymentMethod` · `Sas_H_InstallmentOption` | host | Ürün, ödeme yöntemi (`Commission`), taksit — satış/abonelik ekranlarının ve public `/products` sayfasının kaynağı. |
@ -1304,19 +1305,17 @@ ekranları ABP tablolarıdır, Licence/Dev Request host tablolarını okur.
| **Bildirimler › Bildirimler** | `App.Notifications.Notification` | `Adm_T_Notification` | Hem kuyruk günlüğü hem elle gönderim ekranı: liste kural motorunun ürettiklerini de gösterir, ekleme formu alıcı × kanal açılımını kuyruğa yazar (`InsertServiceAddress = list-form-dynamic-api/notification-insert`; `dxTagBox` çoklu alıcı/kanal). Tip her zaman `Manuel`, güncelleme kapalı. Ayrı bir manuel gönderim tablosu yoktur. Ayrıntı: `README.md` §13.5.1. |
| **Agenda** | `App.Agenda` | `Adm_T_Agenda` | **Takvim (Scheduler) düzeninin** referansı (`DefaultLayout: scheduler`): `StartDate`, `EndDate`, `AllDay`, `RecurrenceRule`, `RecurrenceException`. Tekrarlayan randevu isteği kod gerektirmez. |
| **Settings** | `App.Setting` · `/admin/settings` | — | `SettingDefinition` kayıtlarından üretilen ayar ekranı; değerler burada girilir. |
| **Intranet › Announcement** | `App.Intranet.Announcement` (alt formlar Like/Comment) | `Adm_T_Announcement` · `Adm_T_AnnouncementLike` · `Adm_T_AnnouncementComment` | Duyuru + beğeni + yorum: **ana kayıt / alt etkileşim** kalıbının hazır örneği. |
| **Intranet › Survey** | `App.Intranet.Survey` (alt form Question → Option; Response → Answer) | `Adm_T_Survey` · `Adm_T_SurveyQuestion` · `Adm_T_SurveyQuestionOption` · `Adm_T_SurveyResponse` · `Adm_T_SurveyAnswer` | Anket motoru; soru–seçenek–yanıt zinciri **iki seviyeli alt form** ihtiyacının referansıdır. |
| **Intranet › Social Post** | `App.Intranet.SocialPost` | `Adm_T_SocialPost` · `Adm_T_SocialComment` · `Adm_T_SocialLike` (+ `SocialPollOption`, `SocialMedia`, `SocialLocation`) | Kurum içi akış; `IsLiked`, `IsOwnPost` gibi hesaplanmış kolonların view içinde üretilmesine örnek. Alt formlar: `App.Intranet.SocialMedia`, `SocialComment`, `SocialLike` (`Id` → `SocialPostId`); anket seçenekleri (`App.Intranet.SocialPollOption`) medyaya bağlı olduğu için `SocialMedia` ekranının alt formudur (`Id` → `SocialMediaId`). |
| **Intranet › Event Type / Category / Event** | `App.Intranet.Events.EventType` · `.EventCategory` · `.Event` | `Adm_T_EventType` · `Adm_T_EventCategory` · `Adm_T_Event` · `Adm_T_EventPhoto` · `Adm_T_EventLike` · `Adm_T_EventComment` | Etkinlik yönetimi; foto ve katılımcı sayacı olan kayıt kalıbı. `EventLike`/`EventComment` alt formdur, `EventPhoto` menüde yer almaz; yetkileri `App.Intranet.Events.Event` altındadır. `Adm_T_EventPhoto` tablosu `sql/object/Adm_T_EventPhoto.sql` ile oluşturulur. |
| **Intranet › Documents** | `App.Intranet.Document` · `/admin/intranet-documents` | Dosya yöneticisi (`intranet` / `intranet\|_passive` klasörleri) | Kurum içi doküman paylaşımı — aktif/pasif klasör, yükleme, taşıma, toplu silme. Doküman listesi isteği yeni tablo gerektirmez. |
| **Restrictions › Work Hour** | `App.Restrictions.WorkHour` | `Adm_T_WorkHour` | Gün bazlı çalışma saati (`Monday`…`Sunday`, `StartTime`, `EndTime`); kullanıcıya `AbpUsers.WorkHour` ile bağlanır. "Sadece mesai saatinde girilebilsin" burada çözülür. |
| **Restrictions › IP Restrictions** | `App.Restrictions.IpRestrictions` | `Adm_T_IpRestriction` | `ResourceType` + `ResourceId` + `IP` — kullanıcı/rol bazlı IP kısıtı. |
| **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`, `Gender` (`Male`/`Female`, `App.StaticLookup.*`) ve `HomeAddress` alanlarını liste ve formda taşır; kişisel ve kimlik bilgileri (`IdentityNumber`, `BirthDate`, `EducationLevel`, `Nationality`, `SskNo`…) detay ekranındadır. Detaydaki **Sağlık Kartı** sekmesi `BloodType` ile soy geçmişini (`{Mother,Father,Sibling,Child}HealthStatus` — `Alive`/`Deceased`, `App.StaticLookup.*` — ve `…HealthNote`) ve öz geçmişini (`ChronicDisease`, `TetanusVaccination`, `HepatitisVaccination`, `OtherVaccination`) taşır; sekme dört gruptur (Soy/Öz Geçmişi, Laboratuvar - Fizik Muayene `Lab*`/`Exam*`, Anamnez `Complaint*`/`Diagnosis*` + 3-10. sorular, Sonuç `FitForWork*`/`ShiftWorkFit`/`NightWorkFit`). Sonuçtaki hekim (`FitnessDoctorId`, `ShiftNightDoctorId`) wizard tablosu `Hr_T_Doctor`'dan `LookupQueryValues.TenantDoctorValues` ile seçilir; diploma ve işyeri hekimliği belgesi hekimden gösterilir, kullanıcıya yazılmaz. Bu alanların hepsi listede gizli alandır; arayüz `user-management/HealthCardTab.tsx`. 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 › 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`, `Nationality`, `SskNo`…) detay ekranındadır. Detay sekmeleri karışmasın diye gruplanmıştır: **General** (iletişim + ikinci e-posta/telefon, ek bilgi, avatar, askerlik `MilitaryStatus`/`MilitaryPostponeEndDate`, engellilik `IsDisabled`/`DisabilityRate`/`DisabilityReport` — rapor base64, 5 MB), **Identity** (nüfus cüzdanı, doğum ve aile, uyruk Türkiye değilse yabancı uyruk `Passport*`/`WorkPermit*`), **Work** (organizasyon `RegistrationNo`/`SskNo`/`ShiftId`/`PdksCardNo`, sözleşme `EmploymentType`/`ContractType`/`ContractEndDate`/`ProbationEndDate`/`SeniorityStartDate`, çıkış `TerminationDate`/`TerminationReasonId`/`TerminationNote`, sürücü belgesi `DrivingLicense*` — sınıflar `|` ile, iletişim kanalları; altında iş deneyimi), **Education & Skills** (en yüksek `EducationLevel` + eğitim/dil/yetenek/belge alt listeleri), **Family / Emergency**, **Financial** (`BankName`, `Iban`, `SalaryType`, `GrossSalary`, `SalaryCurrency` + yan haklar), Health, Permissions, Lockout, Claims. Deneme süresi işe girişten en fazla dört ay sonra biter (`UpdateUserAsync` ve ekran doğrular). Ücret alanları `UserInfoViewModel`'de taşınmaz — o model intranet doğum günü listesine de akar; `GET {id}/financial` / `PUT financial` uçlarından okunur, yetki detayınkiyle aynıdır (`AbpIdentity.Users.Update`). Aynı sebeple `DisabilityReport` yalnızca `GetByIdAsync`'te doldurulur. `ShiftId`, `TerminationReasonId`, `SalaryCurrency` seçenekleri ekranda `list-form-select/lookup` ile bu ListForm'un alan lookup'larından okunur (`useUserFieldLookup`). Detaydaki **Sağlık Kartı** sekmesi `BloodType` ile soy geçmişini (`{Mother,Father,Sibling,Child}HealthStatus` — `Alive`/`Deceased`, `App.StaticLookup.*` — ve `…HealthNote`) ve öz geçmişini (`ChronicDisease`, `TetanusVaccination`, `HepatitisVaccination`, `OtherVaccination`) taşır; sekme dört gruptur (Soy/Öz Geçmişi, Laboratuvar - Fizik Muayene `Lab*`/`Exam*`, Anamnez `Complaint*`/`Diagnosis*` + 3-10. sorular, Sonuç `FitForWork*`/`ShiftWorkFit`/`NightWorkFit`). Sonuçtaki hekim (`FitnessDoctorId`, `ShiftNightDoctorId`) wizard tablosu `Hr_T_Doctor`'dan `LookupQueryValues.TenantDoctorValues` ile seçilir; diploma ve işyeri hekimliği belgesi hekimden gösterilir, kullanıcıya yazılmaz. Bu alanların hepsi listede gizli alandır; arayüz `user-management/HealthCardTab.tsx`. 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 › Users › Work Experience** | `App.IdentityManagement.UserWorkExperience` (menüsüz alt liste) | `Adm_T_UserWorkExperience` | Kullanıcının daha önce çalıştığı yerler: `CompanyName`, `SectorId` (Sektörler lookup'ı, `LookupQueryValues.TenantSectorValues`), `StartDate`, `EndDate`, `JobDescription` (HtmlEditor). Entity `IMultiTenant`; kullanıcı detayının Work sekmesinde `PlatformViewHost` ile `UserId` filtresiyle gömülüdür, yeni satır `UserId`'yi filtreden alır. Kendi yetkisi yoktur: okuma `AbpIdentity.Users`, ekleme/güncelleme/silme detay sayfasının yetkisi `AbpIdentity.Users.Update`. |
| **Identity › Users › Health Card lists** | `App.IdentityManagement.UserPeriodicExamination` · `.UserPatientProtocol` · `.UserSickLeave` (menüsüz alt listeler) | `Adm_T_UserPeriodicExamination` · `Adm_T_UserPatientProtocol` · `Adm_T_UserSickLeave` | Periyodik muayene (hekim `Hr_T_Doctor`'dan, diploma no seçimde `EditorScript.Copy` ile kopyalanır), hasta protokol defteri (`ProtocolType`/`ProtocolResult` statik lookup) ve istirahat listesi (`Days` tarihlerden `EditorScript.Days` ile hesaplanır). Entity'ler `IMultiTenant`; Sağlık Kartı sekmesinde (`HealthCardTab.tsx`) `UserId` filtresiyle gömülüdür. Yetki Work Experience ile aynıdır: okuma `AbpIdentity.Users`, ekleme/güncelleme/silme `AbpIdentity.Users.Update`. |
| **Identity › Users › Education & Skills lists** | `App.IdentityManagement.UserEducation` · `.UserLanguage` · `.UserSkill` · `.UserCertificate` (menüsüz alt listeler) | `Adm_T_UserEducation` · `Adm_T_UserLanguage` · `Adm_T_UserSkill` · `Adm_T_UserCertificate` | Eğitim geçmişi (`EducationLevel` kullanıcınınkiyle aynı değerler, `SchoolName`, `Department`, `StartDate`, `EndDate`, `IsGraduated`), yabancı dil (`SkillId` → `Languages` tipindeki `Hr_T_Skill`, `SkillLevelId` dilin tipine ait `Hr_T_SkillLevel`, cascade), yetenek (`SkillId` → `Languages` dışındaki tipler, `Level` 1-5 statik lookup, check constraint) ve yeterlilik belgesi (`CertificateId` → wizard tablosu `Hr_T_Certificate`, EF ilişkisi yok; `CertificateNo`, `IssuedBy`, `IssueDate`, `ExpiryDate`). Lookup'lar `LookupQueryValues.Tenant{LanguageSkill,SkillLevelBySkill,NonLanguageSkill,Certificate}Values`. `EducationSkillsTab.tsx`; yetki Work Experience ile aynıdır. |
| **Identity › Users › Family / Emergency lists** | `App.IdentityManagement.UserFamilyMember` · `.UserEmergencyContact` | `Adm_T_UserFamilyMember` · `Adm_T_UserEmergencyContact` | Eş ve çocuklar (`Relationship` `Spouse`/`Child`, ad, TC, doğum tarihi, `EmploymentStatus`, `IsInsuranceCovered`, `IsBenefitCovered`) ve acil durum kişileri (ad, `Relationship`, telefon). `FamilyEmergencyTab.tsx`; yetki Work Experience ile aynıdır. |
| **Identity › Users › Benefits** | `App.IdentityManagement.UserBenefit` | `Adm_T_UserBenefit` | Yan haklar (`BenefitType` statik lookup `App.StaticLookup.Benefit*`, `Amount`, `StartDate`, `EndDate`, `Note`); Financial sekmesinde (`FinancialTab.tsx`). Yetki Work Experience ile aynıdır. |
| **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). |
@ -1353,6 +1352,10 @@ ListForm kodu / menü kodu / yetki adı / dil anahtarı `App.Hr.*`, seed dosyas
seeder `ListFormSeeder_Hr.cs` (`SeedConsts.AppCodes.Hr`, `PlatformConsts.AppCodes.Hr`), entity
klasörü `Entities/Tenant/Hr/Definitions`. Tanımlar alt menüsü `App.Hr.Definitions`'tır
(`App.Platform.Definitions` başlığı); Organizasyon Şeması doğrudan `App.Hr` altındadır.
Intranet de bu moduldedir: menü `App.Hr.Intranet`, ekran/yetki kodları `App.Hr.Intranet.*`
(`SeedConsts.AppCodes.Intranet`), tablolar `Hr_T_{Announcement,Survey*,Social*,Event*}` ve mesajlaşma
`Hr_T_MessengerConversation*`, entity klasörü `Entities/Tenant/Hr/Intranet`. `Sas_T_IntranetWidget`
(Developer Kit › Intranet Widgets) Saas'ta kalır; kayıtlarının `PermissionName` değerleri `App.Hr.Intranet.*.Widget`'tır.
İK yetkilerinin `Modules` değeri `Sas|Hr`'dir: host (`Sas`) her zaman görür, kiracı yalnızca modül
listesinde `Hr` varsa görür (modül listesi boş kiracıda süzme yoktur — `MenuAppService`,
@ -1367,6 +1370,11 @@ listesinde `Hr` varsa görür (modül listesi boş kiracıda süzme yoktur — `
| **Definitions › Department** | `App.Hr.Department` | `Hr_T_Department` | tenant | **Şube bazlı** departman ağacı: ilk sütun `BranchId` (Şube Adı; `LookupQueryValues.TenantBranchValues`, zorunlu), `ParentId` lookup'ı seçili şubenin departmanlarına süzülür (`BranchDepartmentValues`, cascade `BranchId`). `ParentId` ile **ağaç (TreeList) düzeninin** referansı; personel/onay ekranlarının departman lookup'ı. Tekil indeks `TenantId + BranchId + Name`. Seed `data/App.Hr.Department.json`. |
| **Definitions › Job Position** | `App.Hr.JobPosition` | `Hr_T_JobPosition` | tenant | Ünvan ağacı. Form sırası `BranchId` → `DepartmentId` (şubeye göre süzülür) → `Name` → `ParentId` (departmana göre süzülür); şube değişince departman ve üst görev temizlenir (`CascadeEmptyFields`). **İki kademeli cascade** örneği. Seed `data/App.Hr.JobPosition.json`. |
| **Org Chart** | `App.Hr.OrgChart` · `/admin/organization` | `Hr_T_Department` · `Hr_T_JobPosition` | tenant | Departman/ünvan verisinin organizasyon şeması görünümü (özel React sayfası `hr/OrgChart`, veri `api/app/org-chart`). Menü ve route aynı yetkiyi ister. |
| **Intranet › Announcement** | `App.Hr.Intranet.Announcement` (alt formlar Like/Comment) | `Hr_T_Announcement` · `Hr_T_AnnouncementLike` · `Hr_T_AnnouncementComment` | tenant | Duyuru + beğeni + yorum: **ana kayıt / alt etkileşim** kalıbının hazır örneği. |
| **Intranet › Survey** | `App.Hr.Intranet.Survey` (alt form Question → Option; Response → Answer) | `Hr_T_Survey` · `Hr_T_SurveyQuestion` · `Hr_T_SurveyQuestionOption` · `Hr_T_SurveyResponse` · `Hr_T_SurveyAnswer` | tenant | Anket motoru; soru–seçenek–yanıt zinciri **iki seviyeli alt form** ihtiyacının referansıdır. |
| **Intranet › Social Post** | `App.Hr.Intranet.SocialPost` | `Hr_T_SocialPost` · `Hr_T_SocialComment` · `Hr_T_SocialLike` (+ `SocialPollOption`, `SocialMedia`, `SocialLocation`) | tenant | Kurum içi akış; `IsLiked`, `IsOwnPost` gibi hesaplanmış kolonların view içinde üretilmesine örnek. Alt formlar: `App.Hr.Intranet.SocialMedia`, `SocialComment`, `SocialLike` (`Id` → `SocialPostId`); anket seçenekleri (`App.Hr.Intranet.SocialPollOption`) medyaya bağlı olduğu için `SocialMedia` ekranının alt formudur (`Id` → `SocialMediaId`). |
| **Intranet › Event Type / Category / Event** | `App.Hr.Intranet.Events.EventType` · `.EventCategory` · `.Event` | `Hr_T_EventType` · `Hr_T_EventCategory` · `Hr_T_Event` · `Hr_T_EventPhoto` · `Hr_T_EventLike` · `Hr_T_EventComment` | tenant | Etkinlik yönetimi; foto ve katılımcı sayacı olan kayıt kalıbı. `EventLike`/`EventComment` alt formdur, `EventPhoto` menüde yer almaz; yetkileri `App.Hr.Intranet.Events.Event` altındadır. `Hr_T_EventPhoto` tablosu `sql/object/Hr_T_EventPhoto.sql` ile oluşturulur. |
| **Intranet › Documents** | `App.Hr.Intranet.Document` · `/admin/intranet-documents` | Dosya yöneticisi (`intranet` / `intranet\|_passive` klasörleri) | tenant | Kurum içi doküman paylaşımı — aktif/pasif klasör, yükleme, taşıma, toplu silme. Doküman listesi isteği yeni tablo gerektirmez. |
**Şube bilgisi:** `Department.BranchId` ve `JobPosition.BranchId` (`Guid`, **zorunlu** — kolon `NOT NULL`, formda
zorunlu alan; değer `Sas_T_Branch.Id`) şubeyi taşır; ekranlar `IsBranch = false`'tur (satırlar kullanıcının şube atamasına göre süzülmez, şube
@ -1410,7 +1418,7 @@ görünürlük `checkPermission` ile bileşen içinde kurulur (`lowcode` §7.5).
| `/admin/reports/:report/{view,design}/:id?/:listFormCode?` | `DevexpressReportViewer` · `DevexpressReportDesigner` | — |
| `/admin/settings` | `settings/Settings` | `App.Setting` |
| `/admin/files` | `admin/files/FileManager` | `App.Files` |
| `/admin/intranet-documents` | `intranet/documents/IntranetDocuments` | `App.Intranet.Document` |
| `/admin/intranet-documents` | `intranet/documents/IntranetDocuments` | `App.Hr.Intranet.Document` |
| `/admin/ous` · `/admin/organization` | `organization-unit/OrganizationUnits` · `hr/OrgChart` | `Abp.Identity.OrganizationUnits` · `App.Hr.OrgChart` (menü ile aynı — §12.4) |
| `/admin/forum` | `forum/Forum` | `App.ForumManagement.Publish` |
| `/admin/videoroom/{dashboard,list,room/:id}` | `admin/videoroom/{Dashboard,RoomList,RoomDetail}` | `App.Videoroom{,.List,.Detail}` |

View file

@ -746,11 +746,20 @@ Kısa ve karar odaklı yaz; talebi tekrar anlatma.
(`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`, sağlık kartı alanları
`HomeAddress`, `EducationLevel`, `BloodType`, sağlık kartı alanları
(`{Mother,Father,Sibling,Child}HealthStatus`/`…HealthNote`, `ChronicDisease`, `…Vaccination`, `Lab*`, `Exam*`,
`Complaint*`, `Diagnosis*`, anamnez soruları, `FitForWork*`, `ShiftWorkFit`, `NightWorkFit`, `*DoctorId`), `Nationality`, `MaritalStatus`,
`SskNo`, `HireDate`, `DepartmentId`, `JobPositionId`, `WorkHour`, kimlik kartı alanları
(`SerialNo`, `Province`, `District`, `FatherName`, `MotherName`…). Kullanıcı seçen bir lookup bu
(`SerialNo`, `Province`, `District`, `FatherName`, `MotherName`…), yabancı uyruk alanları
(`PassportNo`, `PassportExpiryDate`, `WorkPermitNo`, `WorkPermitEndDate`), askerlik ve engellilik
(`MilitaryStatus` — `Done`/`Exempt`/`Postponed`/`NotDone`, `MilitaryPostponeEndDate`, `IsDisabled`,
`DisabilityRate`), çalışma bilgisi (`RegistrationNo` sicil no, `EmploymentType` — `FullTime`/`PartTime`,
`ContractType` — `Indefinite`/`Definite`, `ContractEndDate`, `ProbationEndDate`, `SeniorityStartDate`,
`TerminationDate`, `TerminationReasonId` → `Sas_H_TerminationReason`, `ShiftId` → `Hr_T_Shift`,
`PdksCardNo`, `DrivingLicense*`). Birden çok satırlı bilgiler kullanıcının alt tablolarındadır:
eğitim geçmişi `Adm_T_UserEducation` (tek `GraduationSchool` alanı kaldırıldı), yabancı dil
`Adm_T_UserLanguage`, yetenek `Adm_T_UserSkill`, yeterlilik belgesi `Adm_T_UserCertificate`, eş/çocuk
`Adm_T_UserFamilyMember`, acil durum kişisi `Adm_T_UserEmergencyContact`, yan hak `Adm_T_UserBenefit`. 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
@ -885,7 +894,7 @@ Query'de üretilmez (kaynak tablo adı değildir), gerekiyorsa elle yazılır.
`required` `numeric` `range` `stringLength` `custom` `compare` `pattern` `email` `async` (§4.3.6)
**`WorkerType`** (`WorkerTypeEnum`) — `1` MailQueueWorker · `2` SqlWorker ·
`3` NotificationWorker · `4` SessionCleanupWorker · `5` BackupWorker (§9.10)
`3` NotificationWorker · `4` SessionCleanupWorker · `5` BackupWorker · `6` ProbationReminderWorker (§9.10)
**`Scope`** (`WorkerScopeEnum`) — `1` Host · `2` Tenant · `3` All (önce host, sonra her kiracı) (§9.10)
@ -4159,7 +4168,7 @@ Ekranlar: `App.BackgroundWorkers.RecurringJobs` (tanımlar) ve `App.BackgroundWo
| --- | --- |
| `Name` | Benzersiz ad; dağıtık kilit (`DistributedLock`) bu adla alınır — aynı iş iki sunucuda aynı anda çalışmaz |
| `Cron` | Cron ifadesi (`*/5 * * * *`, `0 3 * * *`) |
| `WorkerType` | `1` MailQueueWorker · `2` SqlWorker · `3` NotificationWorker · `4` SessionCleanupWorker · `5` BackupWorker |
| `WorkerType` | `1` MailQueueWorker · `2` SqlWorker · `3` NotificationWorker · `4` SessionCleanupWorker · `5` BackupWorker · `6` ProbationReminderWorker |
| `Scope` | `1` Host (varsayılan) · `2` Tenant · `3` All — aşağıda **Kapsam** |
| `DataSourceCode` | `BeforeSp` / `AfterSp` hangi bağlantıda çalışacak |
| `BeforeSp` / `AfterSp` | İş gövdesinden **önce ve sonra** çağrılan stored procedure adları |
@ -4218,6 +4227,7 @@ kurulur, kod yazılmaz:
| Zamanlanmış e-posta (rapor maili, hatırlatma) | `WorkerType: 1` + `Options` (Mail şablonu + `TableName`) + kuyruğa satır yazan `BeforeSp` |
| Olay bazlı bildirimlerin dağıtımı | `WorkerType: 3` + `Scope: 3` (kuyruğu host ve her kiracı için boşaltır) + Notification Type/Rule kayıtları (§9.11) |
| Oturum temizliği / yedekleme | `WorkerType: 4` / `5` (+ `App:BackupPath`) |
| Deneme süresi bitiş hatırlatması | `WorkerType: 6` + `Scope: 3`; bildirim tipi `DenemeSuresiBitiyor`, alıcı/kanal tipin kurallarından |
**Zamanlanmış e-posta (`MailQueueWorker`)** — "her sabah geciken siparişler listesi şu kişilere
mail atılsın" isteğinin yolu budur. Worker'ın `Options` alanı bir `MailQueueWorkerOptions`
@ -4355,7 +4365,7 @@ kullanılacağı** `lowcode-reference.instructions.md` §12'dedir.
| "Belirli saatlerde/IP'lerden girilsin" | Work Hours · IP Restrictions | `/admin/list/App.Restrictions.WorkHour` |
| "Dosya yükleme/yönetme" | File Manager | `/admin/files` |
| "Global aramada çıksın" | Global Search kayıtları (`System`, `Group`, `Term`, `Weight`, `Url`) | `/admin/list/App.Definitions.GlobalSearch` |
| "Duyuru, anket, sosyal akış, etkinlik" | Intranet ekranları | `/admin/list/App.Intranet.*` |
| "Duyuru, anket, sosyal akış, etkinlik" | İK › Intranet ekranları | `/admin/list/App.Hr.Intranet.*` |
| "Para birimi, ülke/il/ilçe, birim, sektör…" | Definitions ekranları | `/admin/list/App.Definitions.*` |
| "Departman, pozisyon/ünvan, yetkinlik, organizasyon şeması" | İK › Definitions · Org Chart (şube bazlı departman/pozisyon) | `/admin/list/App.Hr.*` · `/admin/organization` |
| "Menü düzeni" | Menu Manager (§9.7) | `/admin/menuManager` |

View file

@ -933,8 +933,8 @@ kimlikle kurulur (`PlatformConsts.Branches.BranchIdDefaultValue`) ve
**Yetki kodları** `PlatformConsts.AppCodes` içinde merkezî olarak tanımlıdır ve
`configs/seeds/host/data/Abp.Identity.Permissions.json` ile seed edilir (gruplar:
`Abp.Identity.PermissionGroups.json` — `App.Saas` (1), `App.Administration` (2), `App.Hr` (3)).
Ana yetki kökleri: `App.Saas`, `App.Branches`, `App.Intranet.*`,
`App.Definitions.*`, `App.Hr.*`, `App.Restrictions.*`, `App.Languages.*`, `App.Listforms.*`,
Ana yetki kökleri: `App.Saas`, `App.Branches`,
`App.Definitions.*`, `App.Hr.*` (Intranet dahil, `App.Hr.Intranet.*`), `App.Restrictions.*`, `App.Languages.*`, `App.Listforms.*`,
`App.Notifications.*`, `App.BackgroundWorkers.*`, `App.Menus.*`, `App.DeveloperKit.*`,
`App.SqlQueryManager.*`,
`App.Orders.*`, `App.BlogManagement.*`, `App.IdentityManagement.*`, `App.Reports.*`,
@ -1699,6 +1699,7 @@ ekranlarından yapılır; yetkiler `App.BackgroundWorkers.RecurringJobs` ve `.Jo
| `NotificationWorker` | Bildirim kurallarını değerlendirir ve gönderir. |
| `SessionCleanupWorker` | Süresi dolmuş oturumları temizler. |
| `BackupWorker` | Veritabanı yedeği alır ve eski yedekleri temizler. |
| `ProbationReminderWorker` | Deneme süresinin bitmesine 15 gün kalan çalışanlar için `DenemeSuresiBitiyor` bildirim tipinin kurallarını işletir (`Scope: All`, her gün 08:00). |
**Kapsam (`Scope`).** İş kaydı her zaman host tablosundadır (`Sas_H_BackgroundWorker`); işin
**gövdesinin** hangi kiracı bağlamında kaç kez çalışacağını `Scope` belirler
@ -2031,7 +2032,7 @@ configs/seeds/
│ │ # App.Menus.{Routes,Module,Menu}.json — route/modül/menü ağacı
│ │ # Abp.Identity.Permission{Groups,s}.json — yetki tanımları
│ │ # App.Definitions.{CountryGroup,Country,City,District}.json — adres zinciri
│ │ # App.Definitions.{Currency,ContactTitle,AiBot}.json — para birimi, hitap, AI bot
│ │ # App.Definitions.{Currency,ContactTitle,AiBot,TerminationReason}.json — para birimi, hitap, AI bot, SGK çıkış kodu
│ │ # App.Hr.{SkillType,SkillLevel,Skill}.json — İK yetkinlik tanımları
│ │ # App.Hr.{Department,JobPosition}.json — İK departman → pozisyon (BranchId ile şubeye bağlı)
│ │ # App.Notifications.Notification{Templates,Types,Rules}.json — bildirim şablonu, tipi → kuralı

View file

@ -0,0 +1,17 @@
using System;
namespace Sozsoft.Platform.Identity.Dto;
/// <summary>
/// Kullanicinin banka ve ucret bilgisi. <see cref="UserInfoViewModel"/> intranet listelerine de
/// aktigi icin bu alanlar orada tasinmaz; kullanici detayinin ayri ucundan okunup yazilir.
/// </summary>
public class UserFinancialDto
{
public Guid Id { get; set; }
public string BankName { get; set; }
public string Iban { get; set; }
public string SalaryType { get; set; }
public decimal? GrossSalary { get; set; }
public string SalaryCurrency { get; set; }
}

View file

@ -67,7 +67,6 @@ public class UserInfoViewModel : ExtensibleObject
public DateTime? MarriageDate { get; set; }
public string HomeAddress { get; set; }
public string EducationLevel { get; set; }
public string GraduationSchool { get; set; }
public string BloodType { get; set; }
public string MotherHealthStatus { get; set; }
public string MotherHealthNote { get; set; }
@ -145,4 +144,30 @@ public class UserInfoViewModel : ExtensibleObject
public bool? ShiftWorkFit { get; set; }
public bool? NightWorkFit { get; set; }
public Guid? ShiftNightDoctorId { get; set; }
public string SecondaryEmail { get; set; }
public string SecondaryPhoneNumber { get; set; }
public string MilitaryStatus { get; set; }
public DateTime? MilitaryPostponeEndDate { get; set; }
public bool IsDisabled { get; set; }
public int? DisabilityRate { get; set; }
public string DisabilityReport { get; set; }
public string DisabilityReportFileName { get; set; }
public string PassportNo { get; set; }
public DateTime? PassportExpiryDate { get; set; }
public string WorkPermitNo { get; set; }
public DateTime? WorkPermitEndDate { get; set; }
public string RegistrationNo { get; set; }
public string EmploymentType { get; set; }
public string ContractType { get; set; }
public DateTime? ContractEndDate { get; set; }
public DateTime? ProbationEndDate { get; set; }
public DateTime? SeniorityStartDate { get; set; }
public Guid? TerminationReasonId { get; set; }
public string TerminationNote { get; set; }
public Guid? ShiftId { get; set; }
public string PdksCardNo { get; set; }
public string DrivingLicenseClass { get; set; }
public string DrivingLicenseNo { get; set; }
public DateTime? DrivingLicenseIssueDate { get; set; }
public DateTime? DrivingLicenseExpiryDate { get; set; }
}

View file

@ -368,6 +368,81 @@ public static class LookupQueryValues
$"WHERE \"IsDeleted\" = 'false' " +
$"ORDER BY \"QuestionText\";";
/// <summary>Hr_T_Shift wizard ile uretilen bir tablodur (entity'si yoktur); kullanici bir vardiyaya baglanir.</summary>
public static string TenantShiftValues =
$"SELECT " +
$"\"Id\" AS \"Key\", " +
$"\"Name\" + ' (' + \"StartTime\" + '-' + \"EndTime\" + ')' AS \"Name\" " +
$"FROM \"Hr_T_Shift\" " +
$"WHERE " +
$"\"IsDeleted\" = 'false' " +
$"AND \"IsActive\" = 'true' " +
$"AND \"TenantId\" = '@TENANTID' " +
$"ORDER BY \"StartTime\";";
/// <summary>SGK cikis kodlari host tanimidir; kiraci filtresi yoktur, kod adla birlikte gosterilir.</summary>
public static string TerminationReasonValues =
$"SELECT " +
$"\"Id\" AS \"Key\", " +
$"\"Code\" + ' - ' + \"Name\" AS \"Name\" " +
$"FROM \"{FullNameTable(TableNameEnum.TerminationReason)}\" " +
$"WHERE " +
$"\"IsDeleted\" = 'false' " +
$"AND \"IsActive\" = 'true' " +
$"ORDER BY \"Code\";";
/// <summary>Hr_T_Certificate wizard ile uretilen bir tablodur; kullanicinin belgesi buradaki tanima baglanir.</summary>
public static string TenantCertificateValues =
$"SELECT " +
$"\"Id\" AS \"Key\", " +
$"\"Name\" AS \"Name\" " +
$"FROM \"Hr_T_Certificate\" " +
$"WHERE " +
$"\"IsDeleted\" = 'false' " +
$"AND \"IsActive\" = 'true' " +
$"AND \"TenantId\" = '@TENANTID' " +
$"ORDER BY \"Name\";";
// Diller de bir yetenek tipidir (Languages); dil listesi o tipe, yetenek listesi diger tiplere suzulur.
private const string LanguageSkillTypeName = "Languages";
public static string TenantLanguageSkillValues =
$"SELECT " +
$"s.\"Id\" AS \"Key\", " +
$"s.\"Name\" AS \"Name\" " +
$"FROM \"{FullNameTable(TableNameEnum.Skill)}\" s " +
$"INNER JOIN \"{FullNameTable(TableNameEnum.SkillType)}\" t ON t.\"Id\" = s.\"SkillTypeId\" " +
$"WHERE " +
$"s.\"IsDeleted\" = 'false' " +
$"AND t.\"Name\" = '{LanguageSkillTypeName}' " +
$"AND s.\"TenantId\" = '@TENANTID' " +
$"ORDER BY s.\"Name\";";
/// <summary>Secilen dilin tipine ait seviyeler (A1-C2); <c>@param0</c> dilin <c>SkillId</c>'sidir.</summary>
public static string TenantSkillLevelBySkillValues =
$"SELECT " +
$"l.\"Id\" AS \"Key\", " +
$"l.\"Name\" AS \"Name\" " +
$"FROM \"{FullNameTable(TableNameEnum.SkillLevel)}\" l " +
$"INNER JOIN \"{FullNameTable(TableNameEnum.Skill)}\" s ON s.\"SkillTypeId\" = l.\"SkillTypeId\" " +
$"WHERE " +
$"(s.\"Id\" = @param0 OR @param0 IS NULL) " +
$"AND l.\"IsDeleted\" = 'false' " +
$"AND l.\"TenantId\" = '@TENANTID' " +
$"ORDER BY l.\"Progress\";";
public static string TenantNonLanguageSkillValues =
$"SELECT " +
$"s.\"Id\" AS \"Key\", " +
$"t.\"Name\" + ' - ' + s.\"Name\" AS \"Name\" " +
$"FROM \"{FullNameTable(TableNameEnum.Skill)}\" s " +
$"INNER JOIN \"{FullNameTable(TableNameEnum.SkillType)}\" t ON t.\"Id\" = s.\"SkillTypeId\" " +
$"WHERE " +
$"s.\"IsDeleted\" = 'false' " +
$"AND t.\"Name\" <> '{LanguageSkillTypeName}' " +
$"AND s.\"TenantId\" = '@TENANTID' " +
$"ORDER BY t.\"Name\", s.\"Name\";";
public static string TechnicalSkillsValues =
$"SELECT " +
$"\"Name\" AS \"Key\", " +

View file

@ -66,7 +66,6 @@ public partial class IdentityUserToUserInfoViewModelMapper : MapperBase<Identity
[MapperIgnoreTarget(nameof(UserInfoViewModel.FitForWorkJob))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.FitnessDoctorId))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.Gender))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.GraduationSchool))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.HadSurgery))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.HadSurgeryNote))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.HadWorkAccident))]
@ -119,6 +118,32 @@ public partial class IdentityUserToUserInfoViewModelMapper : MapperBase<Identity
[MapperIgnoreTarget(nameof(UserInfoViewModel.UnderTreatment))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.UnderTreatmentNote))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.UserType))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.SecondaryEmail))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.SecondaryPhoneNumber))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.MilitaryStatus))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.MilitaryPostponeEndDate))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.IsDisabled))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.DisabilityRate))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.DisabilityReport))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.DisabilityReportFileName))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.PassportNo))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.PassportExpiryDate))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.WorkPermitNo))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.WorkPermitEndDate))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.RegistrationNo))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.EmploymentType))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.ContractType))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.ContractEndDate))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.ProbationEndDate))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.SeniorityStartDate))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.TerminationReasonId))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.TerminationNote))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.ShiftId))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.PdksCardNo))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.DrivingLicenseClass))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.DrivingLicenseNo))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.DrivingLicenseIssueDate))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.DrivingLicenseExpiryDate))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.Village))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.VolumeNo))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.WorkHour))]
@ -186,7 +211,6 @@ public partial class IdentityUserToUserInfoViewModelMapper : MapperBase<Identity
[MapperIgnoreTarget(nameof(UserInfoViewModel.FitForWorkJob))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.FitnessDoctorId))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.Gender))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.GraduationSchool))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.HadSurgery))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.HadSurgeryNote))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.HadWorkAccident))]
@ -239,6 +263,32 @@ public partial class IdentityUserToUserInfoViewModelMapper : MapperBase<Identity
[MapperIgnoreTarget(nameof(UserInfoViewModel.UnderTreatment))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.UnderTreatmentNote))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.UserType))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.SecondaryEmail))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.SecondaryPhoneNumber))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.MilitaryStatus))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.MilitaryPostponeEndDate))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.IsDisabled))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.DisabilityRate))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.DisabilityReport))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.DisabilityReportFileName))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.PassportNo))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.PassportExpiryDate))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.WorkPermitNo))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.WorkPermitEndDate))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.RegistrationNo))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.EmploymentType))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.ContractType))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.ContractEndDate))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.ProbationEndDate))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.SeniorityStartDate))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.TerminationReasonId))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.TerminationNote))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.ShiftId))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.PdksCardNo))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.DrivingLicenseClass))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.DrivingLicenseNo))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.DrivingLicenseIssueDate))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.DrivingLicenseExpiryDate))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.Village))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.VolumeNo))]
[MapperIgnoreTarget(nameof(UserInfoViewModel.WorkHour))]

View file

@ -12,6 +12,7 @@ using Sozsoft.Platform.BlobStoring;
using Sozsoft.Platform.Entities;
using Sozsoft.Platform.Extensions;
using Sozsoft.Platform.Identity.Dto;
using Volo.Abp;
using Volo.Abp.Application.Services;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.Guids;
@ -173,6 +174,8 @@ public class PlatformIdentityAppService : ApplicationService
ConcurrencyStamp = user.ConcurrencyStamp,
LastPasswordChangeTime = user.LastPasswordChangeTime,
Avatar = user.GetAvatar(),
// Rapor dosyasi ortak esleme yerine yalnizca detayda doldurulur; ortak esleme intranet listelerine de akar.
DisabilityReport = user.GetDisabilityReport(),
EmailConfirmed = user.EmailConfirmed,
PhoneNumberConfirmed = user.PhoneNumberConfirmed,
@ -254,6 +257,14 @@ public class PlatformIdentityAppService : ApplicationService
public async Task UpdateUserAsync(UserInfoViewModel UserInfo)
{
// 4857 s. Is Kanunu md. 15: deneme suresi en fazla iki ay, toplu sozlesmeyle dort ay.
// Hangi sinirin gecerli oldugu sozlesmeye bagli oldugu icin ust sinir dort aydir.
if (UserInfo.HireDate.HasValue && UserInfo.ProbationEndDate.HasValue
&& (UserInfo.ProbationEndDate < UserInfo.HireDate || UserInfo.ProbationEndDate > UserInfo.HireDate.Value.AddMonths(4)))
{
throw new UserFriendlyException(L["Abp.Identity.User.ProbationPeriodInvalid"]);
}
var user = await UserManager.GetByIdAsync(UserInfo.Id);
user.Name = UserInfo.Name;
@ -287,7 +298,6 @@ public class PlatformIdentityAppService : ApplicationService
user.SetMarriageDate(UserInfo.MarriageDate);
user.SetHomeAddress(UserInfo.HomeAddress);
user.SetEducationLevel(UserInfo.EducationLevel);
user.SetGraduationSchool(UserInfo.GraduationSchool);
user.SetBloodType(UserInfo.BloodType);
user.SetMotherHealthStatus(UserInfo.MotherHealthStatus);
user.SetMotherHealthNote(UserInfo.MotherHealthNote);
@ -365,12 +375,68 @@ public class PlatformIdentityAppService : ApplicationService
user.SetShiftWorkFit(UserInfo.ShiftWorkFit);
user.SetNightWorkFit(UserInfo.NightWorkFit);
user.SetShiftNightDoctorId(UserInfo.ShiftNightDoctorId);
user.SetSecondaryEmail(UserInfo.SecondaryEmail);
user.SetSecondaryPhoneNumber(UserInfo.SecondaryPhoneNumber);
user.SetMilitaryStatus(UserInfo.MilitaryStatus);
user.SetMilitaryPostponeEndDate(UserInfo.MilitaryPostponeEndDate);
user.SetIsDisabled(UserInfo.IsDisabled);
user.SetDisabilityRate(UserInfo.DisabilityRate);
user.SetDisabilityReport(UserInfo.DisabilityReport);
user.SetDisabilityReportFileName(UserInfo.DisabilityReportFileName);
user.SetPassportNo(UserInfo.PassportNo);
user.SetPassportExpiryDate(UserInfo.PassportExpiryDate);
user.SetWorkPermitNo(UserInfo.WorkPermitNo);
user.SetWorkPermitEndDate(UserInfo.WorkPermitEndDate);
user.SetRegistrationNo(UserInfo.RegistrationNo);
user.SetEmploymentType(UserInfo.EmploymentType);
user.SetContractType(UserInfo.ContractType);
user.SetContractEndDate(UserInfo.ContractEndDate);
user.SetProbationEndDate(UserInfo.ProbationEndDate);
user.SetSeniorityStartDate(UserInfo.SeniorityStartDate);
user.SetTerminationReasonId(UserInfo.TerminationReasonId);
user.SetTerminationNote(UserInfo.TerminationNote);
user.SetShiftId(UserInfo.ShiftId);
user.SetPdksCardNo(UserInfo.PdksCardNo);
user.SetDrivingLicenseClass(UserInfo.DrivingLicenseClass);
user.SetDrivingLicenseNo(UserInfo.DrivingLicenseNo);
user.SetDrivingLicenseIssueDate(UserInfo.DrivingLicenseIssueDate);
user.SetDrivingLicenseExpiryDate(UserInfo.DrivingLicenseExpiryDate);
user.SetAvatar(UserInfo.Avatar);
user.SetUserType(UserInfo.UserType);
(await UserManager.UpdateAsync(user)).CheckErrors();
}
[Authorize(IdentityPermissions.Users.Update)]
public async Task<UserFinancialDto> GetFinancialAsync(Guid id)
{
var user = await UserManager.GetByIdAsync(id);
return new UserFinancialDto
{
Id = user.Id,
BankName = user.GetBankName(),
Iban = user.GetIban(),
SalaryType = user.GetSalaryType(),
GrossSalary = user.GetGrossSalary(),
SalaryCurrency = user.GetSalaryCurrency(),
};
}
[Authorize(IdentityPermissions.Users.Update)]
public async Task UpdateFinancialAsync(UserFinancialDto input)
{
var user = await UserManager.GetByIdAsync(input.Id);
user.SetBankName(input.BankName);
user.SetIban(input.Iban?.Replace(" ", string.Empty).ToUpperInvariant());
user.SetSalaryType(input.SalaryType);
user.SetGrossSalary(input.GrossSalary);
user.SetSalaryCurrency(input.SalaryCurrency);
(await UserManager.UpdateAsync(user)).CheckErrors();
}
[Authorize(IdentityPermissions.Users.Update)]
public async Task UpdateAvatarAsync([FromForm] UserAvatarUpdateInput input)
{

View file

@ -43,7 +43,6 @@ public static class UserInfoViewModelMappingExtensions
userInfoViewModel.MarriageDate = user.GetMarriageDate();
userInfoViewModel.HomeAddress = user.GetHomeAddress();
userInfoViewModel.EducationLevel = user.GetEducationLevel();
userInfoViewModel.GraduationSchool = user.GetGraduationSchool();
userInfoViewModel.BloodType = user.GetBloodType();
userInfoViewModel.MotherHealthStatus = user.GetMotherHealthStatus();
userInfoViewModel.MotherHealthNote = user.GetMotherHealthNote();
@ -121,6 +120,31 @@ public static class UserInfoViewModelMappingExtensions
userInfoViewModel.ShiftWorkFit = user.GetShiftWorkFit();
userInfoViewModel.NightWorkFit = user.GetNightWorkFit();
userInfoViewModel.ShiftNightDoctorId = user.GetShiftNightDoctorId();
userInfoViewModel.SecondaryEmail = user.GetSecondaryEmail();
userInfoViewModel.SecondaryPhoneNumber = user.GetSecondaryPhoneNumber();
userInfoViewModel.MilitaryStatus = user.GetMilitaryStatus();
userInfoViewModel.MilitaryPostponeEndDate = user.GetMilitaryPostponeEndDate();
userInfoViewModel.IsDisabled = user.GetIsDisabled();
userInfoViewModel.DisabilityRate = user.GetDisabilityRate();
userInfoViewModel.DisabilityReportFileName = user.GetDisabilityReportFileName();
userInfoViewModel.PassportNo = user.GetPassportNo();
userInfoViewModel.PassportExpiryDate = user.GetPassportExpiryDate();
userInfoViewModel.WorkPermitNo = user.GetWorkPermitNo();
userInfoViewModel.WorkPermitEndDate = user.GetWorkPermitEndDate();
userInfoViewModel.RegistrationNo = user.GetRegistrationNo();
userInfoViewModel.EmploymentType = user.GetEmploymentType();
userInfoViewModel.ContractType = user.GetContractType();
userInfoViewModel.ContractEndDate = user.GetContractEndDate();
userInfoViewModel.ProbationEndDate = user.GetProbationEndDate();
userInfoViewModel.SeniorityStartDate = user.GetSeniorityStartDate();
userInfoViewModel.TerminationReasonId = user.GetTerminationReasonId();
userInfoViewModel.TerminationNote = user.GetTerminationNote();
userInfoViewModel.ShiftId = user.GetShiftId();
userInfoViewModel.PdksCardNo = user.GetPdksCardNo();
userInfoViewModel.DrivingLicenseClass = user.GetDrivingLicenseClass();
userInfoViewModel.DrivingLicenseNo = user.GetDrivingLicenseNo();
userInfoViewModel.DrivingLicenseIssueDate = user.GetDrivingLicenseIssueDate();
userInfoViewModel.DrivingLicenseExpiryDate = user.GetDrivingLicenseExpiryDate();
return userInfoViewModel;
}

View file

@ -1622,6 +1622,145 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
}
#endregion
#region TerminationReason
listFormName = AppCodes.Definitions.TerminationReason;
if (!await _listFormRepository.AnyAsync(a => a.ListFormCode == listFormName))
{
var listForm = await _listFormRepository.InsertAsync(
new ListForm()
{
ListFormType = ListFormTypeEnum.List,
PageSize = 10,
ExportJson = DefaultExportJson,
IsSubForm = false,
ShowNote = false,
LayoutJson = DefaultLayoutJson(),
CultureName = LanguageCodes.En,
ListFormCode = listFormName,
Name = listFormName,
Title = listFormName,
DataSourceCode = SeedConsts.DataSources.DefaultCode,
IsTenant = false,
IsBranch = false,
IsOrganizationUnit = false,
Description = $"{listFormName}.Description",
SelectCommandType = SelectCommandTypeEnum.Table,
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.TerminationReason)),
KeyFieldName = "Id",
KeyFieldDbSourceType = DbType.Guid,
SeedFilePath = SeedPathResolver.GetDataFilePath(listFormName),
SeedSyncInsert = false,
SeedSyncUpdate = false,
SeedSyncDelete = false,
DefaultFilter = DefaultFilterJson,
SortMode = GridOptions.SortModeSingle,
FilterRowJson = DefaultFilterRowJson(),
HeaderFilterJson = DefaultHeaderFilterJson(),
SearchPanelJson = DefaultSearchPanelJson(),
GroupPanelJson = DefaultGroupPanelJson(),
SelectionJson = DefaultSelectionSingleJson,
ColumnOptionJson = DefaultColumnOptionJson(),
PermissionJson = DefaultPermissionJson(listFormName),
DeleteCommand = DefaultDeleteCommand(nameof(TableNameEnum.TerminationReason)),
DeleteFieldsDefaultValueJson = DefaultDeleteFieldsDefaultValueJson(),
PagerOptionJson = DefaultPagerOptionJson,
EditingOptionJson = DefaultEditingOptionJson(listFormName, 500, 350, true, true, true, true, false),
EditingFormJson = JsonSerializer.Serialize(new List<EditingFormDto>
{
new() {
Order = 1, ColCount = 1, ColSpan = 1, ItemType = "group" },
}),
InsertFieldsDefaultValueJson = DefaultInsertFieldsDefaultValueJson(),
FormFieldsDefaultValueJson = JsonSerializer.Serialize(new FieldsDefaultValue[] {
new() { FieldName = "IsActive", FieldDbType = DbType.Boolean, Value = "true", CustomValueType = FieldCustomValueTypeEnum.Value },
}),
});
#region TerminationReason Fields
await _listFormFieldRepository.InsertManyAsync([
new() {
ListFormCode = listForm.ListFormCode,
CultureName = LanguageCodes.En,
SourceDbType = DbType.Guid,
FieldName = "Id",
CaptionName = "App.Listform.ListformField.Id",
Width = 0,
ListOrderNo = 1,
Visible = false,
IsActive = true,
ColumnCustomizationJson = DefaultColumnCustomizationJson,
PermissionJson = DefaultFieldPermissionJson(listForm.Name),
PivotSettingsJson = DefaultPivotSettingsJson
},
new() {
ListFormCode = listForm.ListFormCode,
CultureName = LanguageCodes.En,
SourceDbType = DbType.String,
FieldName = "Code",
EditGroupOrderNo = 1,
EditOrderNo = 1,
EditorType2 = EditorTypes.dxTextBox,
ColSpan = 1,
CaptionName = "App.Listform.ListformField.Code",
Width = 0,
ListOrderNo = 2,
Visible = true,
IsActive = true,
AllowSearch = true,
SortIndex = 1,
SortDirection = GridColumnOptions.SortOrderAsc,
ValidationRuleJson = DefaultValidationRuleRequiredJson,
ColumnCustomizationJson = DefaultColumnCustomizationJson,
PermissionJson = DefaultFieldPermissionJson(listForm.Name),
PivotSettingsJson = DefaultPivotSettingsJson
},
new() {
ListFormCode = listForm.ListFormCode,
CultureName = LanguageCodes.En,
SourceDbType = DbType.String,
FieldName = "Name",
EditGroupOrderNo = 1,
EditOrderNo = 2,
EditorType2 = EditorTypes.dxTextBox,
ColSpan = 1,
CaptionName = "App.Listform.ListformField.Name",
Width = 0,
ListOrderNo = 3,
Visible = true,
IsActive = true,
AllowSearch = true,
ValidationRuleJson = DefaultValidationRuleRequiredJson,
ColumnCustomizationJson = DefaultColumnCustomizationJson,
PermissionJson = DefaultFieldPermissionJson(listForm.Name),
PivotSettingsJson = DefaultPivotSettingsJson
},
new() {
ListFormCode = listForm.ListFormCode,
CultureName = LanguageCodes.En,
SourceDbType = DbType.Boolean,
FieldName = "IsActive",
EditGroupOrderNo = 1,
EditOrderNo = 3,
EditorType2 = EditorTypes.dxCheckBox,
ColSpan = 1,
CaptionName = "App.Listform.ListformField.IsActive",
Width = 0,
ListOrderNo = 4,
Visible = true,
IsActive = true,
ColumnCustomizationJson = DefaultColumnCustomizationJson,
PermissionJson = DefaultFieldPermissionJson(listForm.Name),
PivotSettingsJson = DefaultPivotSettingsJson
},
]);
#endregion
}
#endregion
#region Currency
listFormName = AppCodes.Definitions.Currency;
if (!await _listFormRepository.AnyAsync(a => a.ListFormCode == listFormName))
@ -4377,6 +4516,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
new() { Key=3, Name="App.StaticLookup.NotificationWorker" },
new() { Key=4, Name="App.StaticLookup.SessionCleanupWorker" },
new() { Key=5, Name="App.StaticLookup.BackupWorker" },
new() { Key=6, Name="App.StaticLookup.ProbationReminderWorker" },
}),
}),
ValidationRuleJson = DefaultValidationRuleRequiredJson,

View file

@ -150,7 +150,6 @@ public class PlatformIdentityDataSeeder : IdentityDataSeeder
adminUser.SetNationality(PlatformConsts.AbpIdentity.User.AdminNationalityDefaultValue);
adminUser.SetBloodType(PlatformConsts.AbpIdentity.User.AdminBloodTypeDefaultValue);
adminUser.SetEducationLevel(PlatformConsts.AbpIdentity.User.AdminEducationLevelDefaultValue);
adminUser.SetGraduationSchool(PlatformConsts.AbpIdentity.User.AdminGraduationSchoolDefaultValue);
adminUser.SetHomeAddress(PlatformConsts.AbpIdentity.User.AdminHomeAddressDefaultValue);
adminUser.SetBirthDate(PlatformConsts.AbpIdentity.User.AdminBirthDateDefaultValue);
adminUser.SetBirthPlace(PlatformConsts.AbpIdentity.User.AdminBirthPlaceDefaultValue);

View file

@ -101,5 +101,13 @@ public enum TableNameEnum
UserWorkExperience,
UserPeriodicExamination,
UserPatientProtocol,
UserSickLeave
UserSickLeave,
UserEducation,
UserLanguage,
UserSkill,
UserCertificate,
UserFamilyMember,
UserEmergencyContact,
UserBenefit,
TerminationReason
}

View file

@ -7,5 +7,6 @@ public enum WorkerTypeEnum
NotificationWorker = 3,
SessionCleanupWorker = 4,
BackupWorker = 5,
ProbationReminderWorker = 6,
}

View file

@ -116,7 +116,6 @@ public static class PlatformConsts
public const string TelegramChatId = "TelegramChatId";
public const string HomeAddress = "HomeAddress";
public const string EducationLevel = "EducationLevel";
public const string GraduationSchool = "GraduationSchool";
public const string BloodType = "BloodType";
public const string MotherHealthStatus = "MotherHealthStatus";
public const string MotherHealthNote = "MotherHealthNote";
@ -221,6 +220,40 @@ public static class PlatformConsts
public const string MaritalStatus = "MaritalStatus";
public const string MarriageDate = "MarriageDate";
public const string SecondaryEmail = "SecondaryEmail";
public const string SecondaryPhoneNumber = "SecondaryPhoneNumber";
public const string MilitaryStatus = "MilitaryStatus";
public const string MilitaryPostponeEndDate = "MilitaryPostponeEndDate";
public const string IsDisabled = "IsDisabled";
public const string DisabilityRate = "DisabilityRate";
public const string DisabilityReport = "DisabilityReport";
public const string DisabilityReportFileName = "DisabilityReportFileName";
public const string PassportNo = "PassportNo";
public const string PassportExpiryDate = "PassportExpiryDate";
public const string WorkPermitNo = "WorkPermitNo";
public const string WorkPermitEndDate = "WorkPermitEndDate";
public const string RegistrationNo = "RegistrationNo";
public const string EmploymentType = "EmploymentType";
public const string ContractType = "ContractType";
public const string ContractEndDate = "ContractEndDate";
public const string ProbationEndDate = "ProbationEndDate";
public const string SeniorityStartDate = "SeniorityStartDate";
public const string TerminationReasonId = "TerminationReasonId";
public const string TerminationNote = "TerminationNote";
public const string ShiftId = "ShiftId";
public const string PdksCardNo = "PdksCardNo";
public const string DrivingLicenseClass = "DrivingLicenseClass";
public const string DrivingLicenseNo = "DrivingLicenseNo";
public const string DrivingLicenseIssueDate = "DrivingLicenseIssueDate";
public const string DrivingLicenseExpiryDate = "DrivingLicenseExpiryDate";
public const string BankName = "BankName";
public const string Iban = "Iban";
public const string SalaryType = "SalaryType";
public const string GrossSalary = "GrossSalary";
public const string SalaryCurrency = "SalaryCurrency";
public const string UserLockedOutMessage = GroupName + ".UserLockedOutMessage";
public const string InvalidUserNameOrPassword = GroupName + ".InvalidUserNameOrPassword";
public const string ResendEmailConfirmedError = GroupName + ".ResendEmailConfirmedError";
@ -252,7 +285,6 @@ public static class PlatformConsts
public const string AdminNationalityDefaultValue = "Türkiye";
public const string AdminBloodTypeDefaultValue = "B Rh+";
public const string AdminEducationLevelDefaultValue = "Yüksek Lisans";
public const string AdminGraduationSchoolDefaultValue = "Boğaziçi Üniversitesi";
public const string AdminHomeAddressDefaultValue = "İstanbul, Türkiye";
public static readonly DateTime AdminBirthDateDefaultValue = new(1981, 8, 27);
public const string AdminBirthPlaceDefaultValue = "Kadıköy, İstanbul";
@ -473,7 +505,8 @@ public static class PlatformConsts
public static class Intranet
{
public const string Default = Prefix.App + ".Intranet";
// Intranet Hr modulundedir; kod modul kokunu tasir (tablo Hr_T_*, yetki App.Hr grubu).
public const string Default = Prefix.App + ".Hr.Intranet";
public const string Announcement = Default + ".Announcement";
@ -503,6 +536,7 @@ public static class PlatformConsts
public const string Country = Default + ".Country";
public const string City = Default + ".City";
public const string District = Default + ".District";
public const string TerminationReason = Default + ".TerminationReason";
public const string Sector = Default + ".Sector";
public const string UomCategory = Default + ".UomCategory";
@ -704,6 +738,13 @@ public static class PlatformConsts
public const string UserPeriodicExamination = Default + ".UserPeriodicExamination";
public const string UserPatientProtocol = Default + ".UserPatientProtocol";
public const string UserSickLeave = Default + ".UserSickLeave";
public const string UserEducation = Default + ".UserEducation";
public const string UserLanguage = Default + ".UserLanguage";
public const string UserSkill = Default + ".UserSkill";
public const string UserCertificate = Default + ".UserCertificate";
public const string UserFamilyMember = Default + ".UserFamilyMember";
public const string UserEmergencyContact = Default + ".UserEmergencyContact";
public const string UserBenefit = Default + ".UserBenefit";
}
public static class Reports

View file

@ -23,6 +23,7 @@ public static class TableNameResolver
{ nameof(TableNameEnum.Country), (TablePrefix.PlatformByName, MenuPrefix.Sas) },
{ nameof(TableNameEnum.City), (TablePrefix.PlatformByName, MenuPrefix.Sas) },
{ nameof(TableNameEnum.District), (TablePrefix.PlatformByName, MenuPrefix.Sas) },
{ nameof(TableNameEnum.TerminationReason), (TablePrefix.PlatformByName, MenuPrefix.Sas) },
{ nameof(TableNameEnum.Branch), (TablePrefix.TenantByName, MenuPrefix.Sas) },
{ nameof(TableNameEnum.BranchUsers), (TablePrefix.TenantByName, MenuPrefix.Sas) },
{ nameof(TableNameEnum.SettingDefinition), (TablePrefix.PlatformByName, MenuPrefix.Sas) },
@ -87,6 +88,13 @@ public static class TableNameResolver
{ nameof(TableNameEnum.UserPeriodicExamination), (TablePrefix.TenantByName, MenuPrefix.Administration) },
{ nameof(TableNameEnum.UserPatientProtocol), (TablePrefix.TenantByName, MenuPrefix.Administration) },
{ nameof(TableNameEnum.UserSickLeave), (TablePrefix.TenantByName, MenuPrefix.Administration) },
{ nameof(TableNameEnum.UserEducation), (TablePrefix.TenantByName, MenuPrefix.Administration) },
{ nameof(TableNameEnum.UserLanguage), (TablePrefix.TenantByName, MenuPrefix.Administration) },
{ nameof(TableNameEnum.UserSkill), (TablePrefix.TenantByName, MenuPrefix.Administration) },
{ nameof(TableNameEnum.UserCertificate), (TablePrefix.TenantByName, MenuPrefix.Administration) },
{ nameof(TableNameEnum.UserFamilyMember), (TablePrefix.TenantByName, MenuPrefix.Administration) },
{ nameof(TableNameEnum.UserEmergencyContact), (TablePrefix.TenantByName, MenuPrefix.Administration) },
{ nameof(TableNameEnum.UserBenefit), (TablePrefix.TenantByName, MenuPrefix.Administration) },
{ nameof(TableNameEnum.NotificationTemplate), (TablePrefix.TenantByName, MenuPrefix.Administration) },
{ nameof(TableNameEnum.NotificationType), (TablePrefix.TenantByName, MenuPrefix.Administration) },
{ nameof(TableNameEnum.NotificationRule), (TablePrefix.TenantByName, MenuPrefix.Administration) },
@ -94,28 +102,28 @@ public static class TableNameResolver
// 🔹 INTRANET TABLOLARI
{ nameof(TableNameEnum.IntranetWidget), (TablePrefix.TenantByName, MenuPrefix.Sas) },
{ nameof(TableNameEnum.Announcement), (TablePrefix.TenantByName, MenuPrefix.Administration) },
{ nameof(TableNameEnum.AnnouncementComment), (TablePrefix.TenantByName, MenuPrefix.Administration) },
{ nameof(TableNameEnum.AnnouncementLike), (TablePrefix.TenantByName, MenuPrefix.Administration) },
{ nameof(TableNameEnum.Survey), (TablePrefix.TenantByName, MenuPrefix.Administration) },
{ nameof(TableNameEnum.SurveyQuestion), (TablePrefix.TenantByName, MenuPrefix.Administration) },
{ nameof(TableNameEnum.SurveyQuestionOption), (TablePrefix.TenantByName, MenuPrefix.Administration) },
{ nameof(TableNameEnum.SurveyResponse), (TablePrefix.TenantByName, MenuPrefix.Administration) },
{ nameof(TableNameEnum.SurveyAnswer), (TablePrefix.TenantByName, MenuPrefix.Administration) },
{ nameof(TableNameEnum.SocialPost), (TablePrefix.TenantByName, MenuPrefix.Administration) },
{ nameof(TableNameEnum.SocialLocation), (TablePrefix.TenantByName, MenuPrefix.Administration) },
{ nameof(TableNameEnum.SocialMedia), (TablePrefix.TenantByName, MenuPrefix.Administration) },
{ nameof(TableNameEnum.SocialPollOption), (TablePrefix.TenantByName, MenuPrefix.Administration) },
{ nameof(TableNameEnum.SocialComment), (TablePrefix.TenantByName, MenuPrefix.Administration) },
{ nameof(TableNameEnum.SocialLike), (TablePrefix.TenantByName, MenuPrefix.Administration) },
{ nameof(TableNameEnum.EventLike), (TablePrefix.TenantByName, MenuPrefix.Administration) },
{ nameof(TableNameEnum.EventCategory), (TablePrefix.TenantByName, MenuPrefix.Administration) },
{ nameof(TableNameEnum.EventType), (TablePrefix.TenantByName, MenuPrefix.Administration) },
{ nameof(TableNameEnum.Event), (TablePrefix.TenantByName, MenuPrefix.Administration) },
{ nameof(TableNameEnum.EventPhoto), (TablePrefix.TenantByName, MenuPrefix.Administration) },
{ nameof(TableNameEnum.EventComment), (TablePrefix.TenantByName, MenuPrefix.Administration) },
{ nameof(TableNameEnum.MessengerConversation), (TablePrefix.TenantByName, MenuPrefix.Administration) },
{ nameof(TableNameEnum.MessengerConversationMessage), (TablePrefix.TenantByName, MenuPrefix.Administration) },
{ nameof(TableNameEnum.Announcement), (TablePrefix.TenantByName, MenuPrefix.Hr) },
{ nameof(TableNameEnum.AnnouncementComment), (TablePrefix.TenantByName, MenuPrefix.Hr) },
{ nameof(TableNameEnum.AnnouncementLike), (TablePrefix.TenantByName, MenuPrefix.Hr) },
{ nameof(TableNameEnum.Survey), (TablePrefix.TenantByName, MenuPrefix.Hr) },
{ nameof(TableNameEnum.SurveyQuestion), (TablePrefix.TenantByName, MenuPrefix.Hr) },
{ nameof(TableNameEnum.SurveyQuestionOption), (TablePrefix.TenantByName, MenuPrefix.Hr) },
{ nameof(TableNameEnum.SurveyResponse), (TablePrefix.TenantByName, MenuPrefix.Hr) },
{ nameof(TableNameEnum.SurveyAnswer), (TablePrefix.TenantByName, MenuPrefix.Hr) },
{ nameof(TableNameEnum.SocialPost), (TablePrefix.TenantByName, MenuPrefix.Hr) },
{ nameof(TableNameEnum.SocialLocation), (TablePrefix.TenantByName, MenuPrefix.Hr) },
{ nameof(TableNameEnum.SocialMedia), (TablePrefix.TenantByName, MenuPrefix.Hr) },
{ nameof(TableNameEnum.SocialPollOption), (TablePrefix.TenantByName, MenuPrefix.Hr) },
{ nameof(TableNameEnum.SocialComment), (TablePrefix.TenantByName, MenuPrefix.Hr) },
{ nameof(TableNameEnum.SocialLike), (TablePrefix.TenantByName, MenuPrefix.Hr) },
{ nameof(TableNameEnum.EventLike), (TablePrefix.TenantByName, MenuPrefix.Hr) },
{ nameof(TableNameEnum.EventCategory), (TablePrefix.TenantByName, MenuPrefix.Hr) },
{ nameof(TableNameEnum.EventType), (TablePrefix.TenantByName, MenuPrefix.Hr) },
{ nameof(TableNameEnum.Event), (TablePrefix.TenantByName, MenuPrefix.Hr) },
{ nameof(TableNameEnum.EventPhoto), (TablePrefix.TenantByName, MenuPrefix.Hr) },
{ nameof(TableNameEnum.EventComment), (TablePrefix.TenantByName, MenuPrefix.Hr) },
{ nameof(TableNameEnum.MessengerConversation), (TablePrefix.TenantByName, MenuPrefix.Hr) },
{ nameof(TableNameEnum.MessengerConversationMessage), (TablePrefix.TenantByName, MenuPrefix.Hr) },
};

View file

@ -133,6 +133,10 @@ public class PlatformBackgroundWorker : PlatformDomainService, IPlatformBackgrou
{
await LazyServiceProvider.GetRequiredService<ISessionCleanupWorker>().StartAsync(cancellationToken);
}
else if (Worker.WorkerType == WorkerTypeEnum.ProbationReminderWorker)
{
await LazyServiceProvider.GetRequiredService<ProbationReminderWorker>().StartAsync(cancellationToken);
}
// Call AfterSp
if (!Worker.AfterSp.IsNullOrWhiteSpace())

View file

@ -0,0 +1,57 @@
using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Logging;
using Sozsoft.Notifications.Domain;
using Sozsoft.Notifications.Entities;
using Sozsoft.Platform.Extensions;
using Sozsoft.Platform.Localization;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.Identity;
using Volo.Abp.Timing;
namespace Sozsoft.Platform.BackgroundWorkers;
/// <summary>
/// Deneme suresi biten calisanlar icin hatirlatma. Gunluk calisir ve bitisine tam
/// <see cref="ReminderDays"/> gun kalan her calisan icin bildirim tipinin kurallarini isletir;
/// alici ve kanal kuraldan gelir, boylece kimin haberdar olacagi ekrandan degistirilir.
/// Gun esitligi aranir, aralik degil: is gunde bir kez calistigi icin ayni calisan icin tek
/// bildirim uretilir.
/// </summary>
public class ProbationReminderWorker(
IReadOnlyRepository<IdentityUser, Guid> userRepository,
IReadOnlyRepository<NotificationType, Guid> notificationTypeRepository,
INotificationManager notificationManager,
IStringLocalizer<PlatformResource> localizer,
IClock clock,
ILogger<ProbationReminderWorker> logger) : ITransientDependency
{
public const string NotificationTypeName = "DenemeSuresiBitiyor";
public const int ReminderDays = 15;
public async Task StartAsync(CancellationToken cancellationToken = default)
{
var notificationType = await notificationTypeRepository.FirstOrDefaultAsync(
a => a.Name == NotificationTypeName, cancellationToken);
// Tip kiraciya aittir; silinmis ya da hic kopyalanmamissa hatirlatma kapatilmis sayilir.
if (notificationType is null)
{
logger.LogInformation("Notification type {Name} not found, probation reminder skipped.", NotificationTypeName);
return;
}
var targetDate = clock.Now.Date.AddDays(ReminderDays);
var users = await userRepository.GetListAsync(a => a.IsActive, cancellationToken: cancellationToken);
foreach (var user in users.Where(u => u.GetProbationEndDate()?.Date == targetDate && u.GetTerminationDate() is null))
{
var message = localizer["App.Notifications.ProbationEnding", $"{user.Name} {user.Surname}".Trim(), targetDate.ToString("dd.MM.yyyy")];
await notificationManager.SendNotificationAsync(notificationType.Id, message);
}
}
}

View file

@ -325,7 +325,8 @@ public static class SeedConsts
public static class Intranet
{
public const string Default = Prefix.App + ".Intranet";
// Intranet Hr modulundedir; kod modul kokunu tasir (tablo Hr_T_*, yetki App.Hr grubu).
public const string Default = Prefix.App + ".Hr.Intranet";
public const string Announcement = Default + ".Announcement";
public const string AnnouncementLike = Announcement + ".AnnouncementLike";
@ -364,6 +365,7 @@ public static class SeedConsts
public const string Country = Default + ".Country";
public const string City = Default + ".City";
public const string District = Default + ".District";
public const string TerminationReason = Default + ".TerminationReason";
public const string Sector = Default + ".Sector";
public const string UomCategory = Default + ".UomCategory";
@ -498,6 +500,13 @@ public static class SeedConsts
public const string UserPeriodicExamination = Default + ".UserPeriodicExamination";
public const string UserPatientProtocol = Default + ".UserPatientProtocol";
public const string UserSickLeave = Default + ".UserSickLeave";
public const string UserEducation = Default + ".UserEducation";
public const string UserLanguage = Default + ".UserLanguage";
public const string UserSkill = Default + ".UserSkill";
public const string UserCertificate = Default + ".UserCertificate";
public const string UserFamilyMember = Default + ".UserFamilyMember";
public const string UserEmergencyContact = Default + ".UserEmergencyContact";
public const string UserBenefit = Default + ".UserBenefit";
}

View file

@ -0,0 +1,15 @@
using System;
using Volo.Abp.Domain.Entities.Auditing;
namespace Sozsoft.Platform.Entities;
/// <summary>
/// SGK isten cikis kodlari. Kodlar mevzuatla belirlendigi ve butun kiracilarda ayni oldugu icin
/// tanim host tablosundadir; kullanicinin <c>TerminationReasonId</c> alani buraya baglanir.
/// </summary>
public class TerminationReason : FullAuditedEntity<Guid>
{
public string Code { get; set; }
public string Name { get; set; }
public bool IsActive { get; set; }
}

View file

@ -0,0 +1,23 @@
using System;
using Volo.Abp.Domain.Entities.Auditing;
using Volo.Abp.MultiTenancy;
namespace Sozsoft.Platform.Entities;
/// <summary>
/// Kullaniciya taninan yan haklar (yemek, yol, ozel saglik sigortasi...). Financial sekmesinde
/// ucret bilgisinin altinda listelenir.
/// </summary>
public class UserBenefit : FullAuditedEntity<Guid>, IMultiTenant
{
public Guid? TenantId { get; set; }
public Guid UserId { get; set; }
public string BenefitType { get; set; }
public decimal? Amount { get; set; }
public DateTime? StartDate { get; set; }
public DateTime? EndDate { get; set; }
public string Note { get; set; }
Guid? IMultiTenant.TenantId => TenantId;
}

View file

@ -0,0 +1,24 @@
using System;
using Volo.Abp.Domain.Entities.Auditing;
using Volo.Abp.MultiTenancy;
namespace Sozsoft.Platform.Entities;
/// <summary>
/// Kullanicinin mesleki yeterlilik belgeleri. Belge adi Hr_T_Certificate tanimindan gelir; o tablo
/// low-code oldugu icin EF iliskisi kurulmaz, baglanti ekran lookup'iyla saglanir.
/// </summary>
public class UserCertificate : FullAuditedEntity<Guid>, IMultiTenant
{
public Guid? TenantId { get; set; }
public Guid UserId { get; set; }
public Guid CertificateId { get; set; }
public string CertificateNo { get; set; }
public string IssuedBy { get; set; }
public DateTime? IssueDate { get; set; }
public DateTime? ExpiryDate { get; set; }
public string Note { get; set; }
Guid? IMultiTenant.TenantId => TenantId;
}

View file

@ -0,0 +1,24 @@
using System;
using Volo.Abp.Domain.Entities.Auditing;
using Volo.Abp.MultiTenancy;
namespace Sozsoft.Platform.Entities;
/// <summary>
/// Kullanicinin okudugu okullar. Tek bir mezuniyet alani birden cok okulu tasiyamadigi icin
/// egitim gecmisi ayri tabloda tutulur; kullanici detayindaki Education &amp; Skills sekmesinde listelenir.
/// </summary>
public class UserEducation : FullAuditedEntity<Guid>, IMultiTenant
{
public Guid? TenantId { get; set; }
public Guid UserId { get; set; }
public string EducationLevel { get; set; }
public string SchoolName { get; set; }
public string Department { get; set; }
public DateTime? StartDate { get; set; }
public DateTime? EndDate { get; set; }
public bool IsGraduated { get; set; }
Guid? IMultiTenant.TenantId => TenantId;
}

View file

@ -0,0 +1,20 @@
using System;
using Volo.Abp.Domain.Entities.Auditing;
using Volo.Abp.MultiTenancy;
namespace Sozsoft.Platform.Entities;
/// <summary>
/// Acil durumda aranacak kisiler. Aile uyesi olmak zorunda olmadigi icin aile tablosundan ayridir.
/// </summary>
public class UserEmergencyContact : FullAuditedEntity<Guid>, IMultiTenant
{
public Guid? TenantId { get; set; }
public Guid UserId { get; set; }
public string Name { get; set; }
public string Relationship { get; set; }
public string PhoneNumber { get; set; }
Guid? IMultiTenant.TenantId => TenantId;
}

View file

@ -0,0 +1,26 @@
using System;
using Volo.Abp.Domain.Entities.Auditing;
using Volo.Abp.MultiTenancy;
namespace Sozsoft.Platform.Entities;
/// <summary>
/// Kullanicinin esi ve cocuklari. Sigorta ve yan hak kapsami kisi bazinda isaretlenir; bordro ve
/// ozel saglik sigortasi listeleri bu bayraklardan uretilir.
/// </summary>
public class UserFamilyMember : FullAuditedEntity<Guid>, IMultiTenant
{
public Guid? TenantId { get; set; }
public Guid UserId { get; set; }
public string Relationship { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
public string IdentityNumber { get; set; }
public DateTime? BirthDate { get; set; }
public string EmploymentStatus { get; set; }
public bool IsInsuranceCovered { get; set; }
public bool IsBenefitCovered { get; set; }
Guid? IMultiTenant.TenantId => TenantId;
}

View file

@ -0,0 +1,21 @@
using System;
using Volo.Abp.Domain.Entities.Auditing;
using Volo.Abp.MultiTenancy;
namespace Sozsoft.Platform.Entities;
/// <summary>
/// Kullanicinin bildigi yabanci diller. Dil <see cref="Skill"/> tanimindan, seviye o dilin yetenek
/// tipine ait <see cref="SkillLevel"/> kayitlarindan (A1-C2) secilir.
/// </summary>
public class UserLanguage : FullAuditedEntity<Guid>, IMultiTenant
{
public Guid? TenantId { get; set; }
public Guid UserId { get; set; }
public Guid SkillId { get; set; }
public Guid? SkillLevelId { get; set; }
public string Note { get; set; }
Guid? IMultiTenant.TenantId => TenantId;
}

View file

@ -0,0 +1,21 @@
using System;
using Volo.Abp.Domain.Entities.Auditing;
using Volo.Abp.MultiTenancy;
namespace Sozsoft.Platform.Entities;
/// <summary>
/// Kullanicinin yetenekleri. Yetenek <see cref="Skill"/> tanimindan secilir; seviye tipten bagimsiz
/// 1-5 olcegindedir, boylece farkli tipteki yetenekler ayni olcekte karsilastirilir.
/// </summary>
public class UserSkill : FullAuditedEntity<Guid>, IMultiTenant
{
public Guid? TenantId { get; set; }
public Guid UserId { get; set; }
public Guid SkillId { get; set; }
public int Level { get; set; }
public string Note { get; set; }
Guid? IMultiTenant.TenantId => TenantId;
}

View file

@ -331,16 +331,6 @@ public static class AbpIdentityUserExtensions
return user.GetProperty<string>(PlatformConsts.AbpIdentity.User.EducationLevel);
}
//GraduationSchool
public static void SetGraduationSchool(this IdentityUser user, string value)
{
user.SetProperty(PlatformConsts.AbpIdentity.User.GraduationSchool, value);
}
public static string GetGraduationSchool(this IdentityUser user)
{
return user.GetProperty<string>(PlatformConsts.AbpIdentity.User.GraduationSchool);
}
//BloodType
public static void SetBloodType(this IdentityUser user, string value)
{
@ -1110,5 +1100,314 @@ public static class AbpIdentityUserExtensions
{
return user.GetProperty<Guid?>(PlatformConsts.AbpIdentity.User.ShiftNightDoctorId);
}
//SecondaryEmail
public static void SetSecondaryEmail(this IdentityUser user, string value)
{
user.SetProperty(PlatformConsts.AbpIdentity.User.SecondaryEmail, value);
}
public static string GetSecondaryEmail(this IdentityUser user)
{
return user.GetProperty<string>(PlatformConsts.AbpIdentity.User.SecondaryEmail);
}
//SecondaryPhoneNumber
public static void SetSecondaryPhoneNumber(this IdentityUser user, string value)
{
user.SetProperty(PlatformConsts.AbpIdentity.User.SecondaryPhoneNumber, value);
}
public static string GetSecondaryPhoneNumber(this IdentityUser user)
{
return user.GetProperty<string>(PlatformConsts.AbpIdentity.User.SecondaryPhoneNumber);
}
//MilitaryStatus
public static void SetMilitaryStatus(this IdentityUser user, string value)
{
user.SetProperty(PlatformConsts.AbpIdentity.User.MilitaryStatus, value);
}
public static string GetMilitaryStatus(this IdentityUser user)
{
return user.GetProperty<string>(PlatformConsts.AbpIdentity.User.MilitaryStatus);
}
//MilitaryPostponeEndDate
public static void SetMilitaryPostponeEndDate(this IdentityUser user, DateTime? value)
{
user.SetProperty(PlatformConsts.AbpIdentity.User.MilitaryPostponeEndDate, value);
}
public static DateTime? GetMilitaryPostponeEndDate(this IdentityUser user)
{
return user.GetProperty<DateTime?>(PlatformConsts.AbpIdentity.User.MilitaryPostponeEndDate);
}
//IsDisabled
public static void SetIsDisabled(this IdentityUser user, bool value)
{
user.SetProperty(PlatformConsts.AbpIdentity.User.IsDisabled, value);
}
public static bool GetIsDisabled(this IdentityUser user)
{
return user.GetProperty<bool>(PlatformConsts.AbpIdentity.User.IsDisabled);
}
//DisabilityRate
public static void SetDisabilityRate(this IdentityUser user, int? value)
{
user.SetProperty(PlatformConsts.AbpIdentity.User.DisabilityRate, value);
}
public static int? GetDisabilityRate(this IdentityUser user)
{
return user.GetProperty<int?>(PlatformConsts.AbpIdentity.User.DisabilityRate);
}
//DisabilityReport
public static void SetDisabilityReport(this IdentityUser user, string value)
{
user.SetProperty(PlatformConsts.AbpIdentity.User.DisabilityReport, value);
}
public static string GetDisabilityReport(this IdentityUser user)
{
return user.GetProperty<string>(PlatformConsts.AbpIdentity.User.DisabilityReport);
}
//DisabilityReportFileName
public static void SetDisabilityReportFileName(this IdentityUser user, string value)
{
user.SetProperty(PlatformConsts.AbpIdentity.User.DisabilityReportFileName, value);
}
public static string GetDisabilityReportFileName(this IdentityUser user)
{
return user.GetProperty<string>(PlatformConsts.AbpIdentity.User.DisabilityReportFileName);
}
//PassportNo
public static void SetPassportNo(this IdentityUser user, string value)
{
user.SetProperty(PlatformConsts.AbpIdentity.User.PassportNo, value);
}
public static string GetPassportNo(this IdentityUser user)
{
return user.GetProperty<string>(PlatformConsts.AbpIdentity.User.PassportNo);
}
//PassportExpiryDate
public static void SetPassportExpiryDate(this IdentityUser user, DateTime? value)
{
user.SetProperty(PlatformConsts.AbpIdentity.User.PassportExpiryDate, value);
}
public static DateTime? GetPassportExpiryDate(this IdentityUser user)
{
return user.GetProperty<DateTime?>(PlatformConsts.AbpIdentity.User.PassportExpiryDate);
}
//WorkPermitNo
public static void SetWorkPermitNo(this IdentityUser user, string value)
{
user.SetProperty(PlatformConsts.AbpIdentity.User.WorkPermitNo, value);
}
public static string GetWorkPermitNo(this IdentityUser user)
{
return user.GetProperty<string>(PlatformConsts.AbpIdentity.User.WorkPermitNo);
}
//WorkPermitEndDate
public static void SetWorkPermitEndDate(this IdentityUser user, DateTime? value)
{
user.SetProperty(PlatformConsts.AbpIdentity.User.WorkPermitEndDate, value);
}
public static DateTime? GetWorkPermitEndDate(this IdentityUser user)
{
return user.GetProperty<DateTime?>(PlatformConsts.AbpIdentity.User.WorkPermitEndDate);
}
//RegistrationNo
public static void SetRegistrationNo(this IdentityUser user, string value)
{
user.SetProperty(PlatformConsts.AbpIdentity.User.RegistrationNo, value);
}
public static string GetRegistrationNo(this IdentityUser user)
{
return user.GetProperty<string>(PlatformConsts.AbpIdentity.User.RegistrationNo);
}
//EmploymentType
public static void SetEmploymentType(this IdentityUser user, string value)
{
user.SetProperty(PlatformConsts.AbpIdentity.User.EmploymentType, value);
}
public static string GetEmploymentType(this IdentityUser user)
{
return user.GetProperty<string>(PlatformConsts.AbpIdentity.User.EmploymentType);
}
//ContractType
public static void SetContractType(this IdentityUser user, string value)
{
user.SetProperty(PlatformConsts.AbpIdentity.User.ContractType, value);
}
public static string GetContractType(this IdentityUser user)
{
return user.GetProperty<string>(PlatformConsts.AbpIdentity.User.ContractType);
}
//ContractEndDate
public static void SetContractEndDate(this IdentityUser user, DateTime? value)
{
user.SetProperty(PlatformConsts.AbpIdentity.User.ContractEndDate, value);
}
public static DateTime? GetContractEndDate(this IdentityUser user)
{
return user.GetProperty<DateTime?>(PlatformConsts.AbpIdentity.User.ContractEndDate);
}
//ProbationEndDate
public static void SetProbationEndDate(this IdentityUser user, DateTime? value)
{
user.SetProperty(PlatformConsts.AbpIdentity.User.ProbationEndDate, value);
}
public static DateTime? GetProbationEndDate(this IdentityUser user)
{
return user.GetProperty<DateTime?>(PlatformConsts.AbpIdentity.User.ProbationEndDate);
}
//SeniorityStartDate
public static void SetSeniorityStartDate(this IdentityUser user, DateTime? value)
{
user.SetProperty(PlatformConsts.AbpIdentity.User.SeniorityStartDate, value);
}
public static DateTime? GetSeniorityStartDate(this IdentityUser user)
{
return user.GetProperty<DateTime?>(PlatformConsts.AbpIdentity.User.SeniorityStartDate);
}
//TerminationReasonId
public static void SetTerminationReasonId(this IdentityUser user, Guid? value)
{
user.SetProperty(PlatformConsts.AbpIdentity.User.TerminationReasonId, value);
}
public static Guid? GetTerminationReasonId(this IdentityUser user)
{
return user.GetProperty<Guid?>(PlatformConsts.AbpIdentity.User.TerminationReasonId);
}
//TerminationNote
public static void SetTerminationNote(this IdentityUser user, string value)
{
user.SetProperty(PlatformConsts.AbpIdentity.User.TerminationNote, value);
}
public static string GetTerminationNote(this IdentityUser user)
{
return user.GetProperty<string>(PlatformConsts.AbpIdentity.User.TerminationNote);
}
//ShiftId
public static void SetShiftId(this IdentityUser user, Guid? value)
{
user.SetProperty(PlatformConsts.AbpIdentity.User.ShiftId, value);
}
public static Guid? GetShiftId(this IdentityUser user)
{
return user.GetProperty<Guid?>(PlatformConsts.AbpIdentity.User.ShiftId);
}
//PdksCardNo
public static void SetPdksCardNo(this IdentityUser user, string value)
{
user.SetProperty(PlatformConsts.AbpIdentity.User.PdksCardNo, value);
}
public static string GetPdksCardNo(this IdentityUser user)
{
return user.GetProperty<string>(PlatformConsts.AbpIdentity.User.PdksCardNo);
}
//DrivingLicenseClass
public static void SetDrivingLicenseClass(this IdentityUser user, string value)
{
user.SetProperty(PlatformConsts.AbpIdentity.User.DrivingLicenseClass, value);
}
public static string GetDrivingLicenseClass(this IdentityUser user)
{
return user.GetProperty<string>(PlatformConsts.AbpIdentity.User.DrivingLicenseClass);
}
//DrivingLicenseNo
public static void SetDrivingLicenseNo(this IdentityUser user, string value)
{
user.SetProperty(PlatformConsts.AbpIdentity.User.DrivingLicenseNo, value);
}
public static string GetDrivingLicenseNo(this IdentityUser user)
{
return user.GetProperty<string>(PlatformConsts.AbpIdentity.User.DrivingLicenseNo);
}
//DrivingLicenseIssueDate
public static void SetDrivingLicenseIssueDate(this IdentityUser user, DateTime? value)
{
user.SetProperty(PlatformConsts.AbpIdentity.User.DrivingLicenseIssueDate, value);
}
public static DateTime? GetDrivingLicenseIssueDate(this IdentityUser user)
{
return user.GetProperty<DateTime?>(PlatformConsts.AbpIdentity.User.DrivingLicenseIssueDate);
}
//DrivingLicenseExpiryDate
public static void SetDrivingLicenseExpiryDate(this IdentityUser user, DateTime? value)
{
user.SetProperty(PlatformConsts.AbpIdentity.User.DrivingLicenseExpiryDate, value);
}
public static DateTime? GetDrivingLicenseExpiryDate(this IdentityUser user)
{
return user.GetProperty<DateTime?>(PlatformConsts.AbpIdentity.User.DrivingLicenseExpiryDate);
}
//BankName
public static void SetBankName(this IdentityUser user, string value)
{
user.SetProperty(PlatformConsts.AbpIdentity.User.BankName, value);
}
public static string GetBankName(this IdentityUser user)
{
return user.GetProperty<string>(PlatformConsts.AbpIdentity.User.BankName);
}
//Iban
public static void SetIban(this IdentityUser user, string value)
{
user.SetProperty(PlatformConsts.AbpIdentity.User.Iban, value);
}
public static string GetIban(this IdentityUser user)
{
return user.GetProperty<string>(PlatformConsts.AbpIdentity.User.Iban);
}
//SalaryType
public static void SetSalaryType(this IdentityUser user, string value)
{
user.SetProperty(PlatformConsts.AbpIdentity.User.SalaryType, value);
}
public static string GetSalaryType(this IdentityUser user)
{
return user.GetProperty<string>(PlatformConsts.AbpIdentity.User.SalaryType);
}
//GrossSalary
public static void SetGrossSalary(this IdentityUser user, decimal? value)
{
user.SetProperty(PlatformConsts.AbpIdentity.User.GrossSalary, value);
}
public static decimal? GetGrossSalary(this IdentityUser user)
{
return user.GetProperty<decimal?>(PlatformConsts.AbpIdentity.User.GrossSalary);
}
//SalaryCurrency
public static void SetSalaryCurrency(this IdentityUser user, string value)
{
user.SetProperty(PlatformConsts.AbpIdentity.User.SalaryCurrency, value);
}
public static string GetSalaryCurrency(this IdentityUser user)
{
return user.GetProperty<string>(PlatformConsts.AbpIdentity.User.SalaryCurrency);
}
}

View file

@ -73,6 +73,7 @@ public class PlatformDbContext :
public DbSet<Note> Activities { get; set; }
public DbSet<IpRestriction> IpRestrictions { get; set; }
public DbSet<ContactTitle> ContactTitles { get; set; }
public DbSet<TerminationReason> TerminationReasons { get; set; }
public DbSet<Currency> Currencies { get; set; }
public DbSet<CountryGroup> CountryGroups { get; set; }
public DbSet<Country> Countries { get; set; }
@ -103,6 +104,13 @@ public class PlatformDbContext :
public DbSet<UserPeriodicExamination> UserPeriodicExaminations { get; set; }
public DbSet<UserPatientProtocol> UserPatientProtocols { get; set; }
public DbSet<UserSickLeave> UserSickLeaves { get; set; }
public DbSet<UserEducation> UserEducations { get; set; }
public DbSet<UserLanguage> UserLanguages { get; set; }
public DbSet<UserSkill> UserSkills { get; set; }
public DbSet<UserCertificate> UserCertificates { get; set; }
public DbSet<UserFamilyMember> UserFamilyMembers { get; set; }
public DbSet<UserEmergencyContact> UserEmergencyContacts { get; set; }
public DbSet<UserBenefit> UserBenefits { get; set; }
public DbSet<SkillType> SkillTypes { get; set; }
public DbSet<DevRequest> DevRequests { get; set; }
public DbSet<Agenda> Agendas { get; set; }
@ -833,6 +841,116 @@ public class PlatformDbContext :
b.HasIndex(x => new { x.TenantId, x.UserId });
});
builder.Entity<UserEducation>(b =>
{
b.ToTable(TableNameResolver.GetFullTableName(nameof(TableNameEnum.UserEducation)), Prefix.DbSchema);
b.ConfigureByConvention();
b.Property(x => x.UserId).IsRequired();
b.Property(x => x.EducationLevel).IsRequired().HasMaxLength(32);
b.Property(x => x.SchoolName).IsRequired().HasMaxLength(256);
b.Property(x => x.Department).IsRequired(false).HasMaxLength(256);
b.Property(x => x.IsGraduated).HasDefaultValue(true);
b.HasIndex(x => new { x.TenantId, x.UserId });
});
builder.Entity<UserLanguage>(b =>
{
b.ToTable(TableNameResolver.GetFullTableName(nameof(TableNameEnum.UserLanguage)), Prefix.DbSchema);
b.ConfigureByConvention();
b.Property(x => x.UserId).IsRequired();
b.Property(x => x.SkillId).IsRequired();
b.Property(x => x.Note).IsRequired(false).HasMaxLength(512);
b.HasIndex(x => new { x.TenantId, x.UserId, x.SkillId }).IsUnique().HasFilter("[IsDeleted] = 0");
b.HasOne<Skill>()
.WithMany()
.HasForeignKey(x => x.SkillId)
.OnDelete(DeleteBehavior.Restrict);
b.HasOne<SkillLevel>()
.WithMany()
.HasForeignKey(x => x.SkillLevelId)
.OnDelete(DeleteBehavior.Restrict);
});
builder.Entity<UserSkill>(b =>
{
b.ToTable(TableNameResolver.GetFullTableName(nameof(TableNameEnum.UserSkill)), Prefix.DbSchema);
b.ConfigureByConvention();
b.Property(x => x.UserId).IsRequired();
b.Property(x => x.SkillId).IsRequired();
b.Property(x => x.Level).IsRequired();
b.Property(x => x.Note).IsRequired(false).HasMaxLength(512);
b.HasIndex(x => new { x.TenantId, x.UserId, x.SkillId }).IsUnique().HasFilter("[IsDeleted] = 0");
b.ToTable(t => t.HasCheckConstraint("CK_UserSkill_Level", "[Level] BETWEEN 1 AND 5"));
b.HasOne<Skill>()
.WithMany()
.HasForeignKey(x => x.SkillId)
.OnDelete(DeleteBehavior.Restrict);
});
builder.Entity<UserCertificate>(b =>
{
b.ToTable(TableNameResolver.GetFullTableName(nameof(TableNameEnum.UserCertificate)), Prefix.DbSchema);
b.ConfigureByConvention();
b.Property(x => x.UserId).IsRequired();
b.Property(x => x.CertificateId).IsRequired();
b.Property(x => x.CertificateNo).IsRequired(false).HasMaxLength(64);
b.Property(x => x.IssuedBy).IsRequired(false).HasMaxLength(256);
b.Property(x => x.Note).IsRequired(false).HasMaxLength(512);
b.HasIndex(x => new { x.TenantId, x.UserId });
});
builder.Entity<UserFamilyMember>(b =>
{
b.ToTable(TableNameResolver.GetFullTableName(nameof(TableNameEnum.UserFamilyMember)), Prefix.DbSchema);
b.ConfigureByConvention();
b.Property(x => x.UserId).IsRequired();
b.Property(x => x.Relationship).IsRequired().HasMaxLength(16);
b.Property(x => x.Name).IsRequired().HasMaxLength(128);
b.Property(x => x.Surname).IsRequired(false).HasMaxLength(128);
b.Property(x => x.IdentityNumber).IsRequired(false).HasMaxLength(15);
b.Property(x => x.EmploymentStatus).IsRequired(false).HasMaxLength(16);
b.HasIndex(x => new { x.TenantId, x.UserId });
});
builder.Entity<UserEmergencyContact>(b =>
{
b.ToTable(TableNameResolver.GetFullTableName(nameof(TableNameEnum.UserEmergencyContact)), Prefix.DbSchema);
b.ConfigureByConvention();
b.Property(x => x.UserId).IsRequired();
b.Property(x => x.Name).IsRequired().HasMaxLength(256);
b.Property(x => x.Relationship).IsRequired().HasMaxLength(16);
b.Property(x => x.PhoneNumber).IsRequired().HasMaxLength(32);
b.HasIndex(x => new { x.TenantId, x.UserId });
});
builder.Entity<UserBenefit>(b =>
{
b.ToTable(TableNameResolver.GetFullTableName(nameof(TableNameEnum.UserBenefit)), Prefix.DbSchema);
b.ConfigureByConvention();
b.Property(x => x.UserId).IsRequired();
b.Property(x => x.BenefitType).IsRequired().HasMaxLength(32);
b.Property(x => x.Amount).HasPrecision(18, 2);
b.Property(x => x.Note).IsRequired(false).HasMaxLength(512);
b.HasIndex(x => new { x.TenantId, x.UserId });
});
// Definitions
builder.Entity<Sector>(b =>
{
@ -855,6 +973,18 @@ public class PlatformDbContext :
b.HasIndex(x => new { x.Title }).IsUnique().HasFilter("[IsDeleted] = 0");
});
builder.Entity<TerminationReason>(b =>
{
b.ToTable(TableNameResolver.GetFullTableName(nameof(TableNameEnum.TerminationReason)), Prefix.DbSchema);
b.ConfigureByConvention();
b.Property(x => x.Code).IsRequired().HasMaxLength(8);
b.Property(x => x.Name).IsRequired().HasMaxLength(256);
b.Property(x => x.IsActive).HasDefaultValue(true);
b.HasIndex(x => new { x.Code }).IsUnique().HasFilter("[IsDeleted] = 0");
});
builder.Entity<Currency>(b =>
{
b.ToTable(TableNameResolver.GetFullTableName(nameof(TableNameEnum.Currency)), Prefix.DbSchema);

View file

@ -310,13 +310,283 @@ public static class PlatformEfCoreEntityExtensionMappings
ObjectExtensionManager.Instance
.MapEfCoreProperty<IdentityUser, string>(
PlatformConsts.AbpIdentity.User.GraduationSchool,
PlatformConsts.AbpIdentity.User.SecondaryEmail,
(entityBuilder, propertyBuilder) =>
{
propertyBuilder.HasMaxLength(256).HasDefaultValue(null);
}
);
ObjectExtensionManager.Instance
.MapEfCoreProperty<IdentityUser, string>(
PlatformConsts.AbpIdentity.User.SecondaryPhoneNumber,
(entityBuilder, propertyBuilder) =>
{
propertyBuilder.HasMaxLength(32).HasDefaultValue(null);
}
);
ObjectExtensionManager.Instance
.MapEfCoreProperty<IdentityUser, string>(
PlatformConsts.AbpIdentity.User.MilitaryStatus,
(entityBuilder, propertyBuilder) =>
{
propertyBuilder.HasMaxLength(16).HasDefaultValue(null);
}
);
ObjectExtensionManager.Instance
.MapEfCoreProperty<IdentityUser, DateTime?>(
PlatformConsts.AbpIdentity.User.MilitaryPostponeEndDate,
(entityBuilder, propertyBuilder) =>
{
propertyBuilder.HasDefaultValue(null);
}
);
ObjectExtensionManager.Instance
.MapEfCoreProperty<IdentityUser, bool>(
PlatformConsts.AbpIdentity.User.IsDisabled,
(entityBuilder, propertyBuilder) =>
{
propertyBuilder.IsRequired().HasDefaultValue(false);
}
);
ObjectExtensionManager.Instance
.MapEfCoreProperty<IdentityUser, int?>(
PlatformConsts.AbpIdentity.User.DisabilityRate,
(entityBuilder, propertyBuilder) =>
{
propertyBuilder.HasDefaultValue(null);
}
);
ObjectExtensionManager.Instance
.MapEfCoreProperty<IdentityUser, string>(
PlatformConsts.AbpIdentity.User.DisabilityReport,
(entityBuilder, propertyBuilder) =>
{
propertyBuilder.HasDefaultValue(null);
}
);
ObjectExtensionManager.Instance
.MapEfCoreProperty<IdentityUser, string>(
PlatformConsts.AbpIdentity.User.DisabilityReportFileName,
(entityBuilder, propertyBuilder) =>
{
propertyBuilder.HasMaxLength(256).HasDefaultValue(null);
}
);
ObjectExtensionManager.Instance
.MapEfCoreProperty<IdentityUser, string>(
PlatformConsts.AbpIdentity.User.PassportNo,
(entityBuilder, propertyBuilder) =>
{
propertyBuilder.HasMaxLength(32).HasDefaultValue(null);
}
);
ObjectExtensionManager.Instance
.MapEfCoreProperty<IdentityUser, DateTime?>(
PlatformConsts.AbpIdentity.User.PassportExpiryDate,
(entityBuilder, propertyBuilder) =>
{
propertyBuilder.HasDefaultValue(null);
}
);
ObjectExtensionManager.Instance
.MapEfCoreProperty<IdentityUser, string>(
PlatformConsts.AbpIdentity.User.WorkPermitNo,
(entityBuilder, propertyBuilder) =>
{
propertyBuilder.HasMaxLength(64).HasDefaultValue(null);
}
);
ObjectExtensionManager.Instance
.MapEfCoreProperty<IdentityUser, DateTime?>(
PlatformConsts.AbpIdentity.User.WorkPermitEndDate,
(entityBuilder, propertyBuilder) =>
{
propertyBuilder.HasDefaultValue(null);
}
);
ObjectExtensionManager.Instance
.MapEfCoreProperty<IdentityUser, string>(
PlatformConsts.AbpIdentity.User.RegistrationNo,
(entityBuilder, propertyBuilder) =>
{
propertyBuilder.HasMaxLength(32).HasDefaultValue(null);
}
);
ObjectExtensionManager.Instance
.MapEfCoreProperty<IdentityUser, string>(
PlatformConsts.AbpIdentity.User.EmploymentType,
(entityBuilder, propertyBuilder) =>
{
propertyBuilder.HasMaxLength(16).HasDefaultValue(null);
}
);
ObjectExtensionManager.Instance
.MapEfCoreProperty<IdentityUser, string>(
PlatformConsts.AbpIdentity.User.ContractType,
(entityBuilder, propertyBuilder) =>
{
propertyBuilder.HasMaxLength(16).HasDefaultValue(null);
}
);
ObjectExtensionManager.Instance
.MapEfCoreProperty<IdentityUser, DateTime?>(
PlatformConsts.AbpIdentity.User.ContractEndDate,
(entityBuilder, propertyBuilder) =>
{
propertyBuilder.HasDefaultValue(null);
}
);
ObjectExtensionManager.Instance
.MapEfCoreProperty<IdentityUser, DateTime?>(
PlatformConsts.AbpIdentity.User.ProbationEndDate,
(entityBuilder, propertyBuilder) =>
{
propertyBuilder.HasDefaultValue(null);
}
);
ObjectExtensionManager.Instance
.MapEfCoreProperty<IdentityUser, DateTime?>(
PlatformConsts.AbpIdentity.User.SeniorityStartDate,
(entityBuilder, propertyBuilder) =>
{
propertyBuilder.HasDefaultValue(null);
}
);
ObjectExtensionManager.Instance
.MapEfCoreProperty<IdentityUser, Guid?>(
PlatformConsts.AbpIdentity.User.TerminationReasonId,
(entityBuilder, propertyBuilder) =>
{
propertyBuilder.HasDefaultValue(null);
}
);
ObjectExtensionManager.Instance
.MapEfCoreProperty<IdentityUser, string>(
PlatformConsts.AbpIdentity.User.TerminationNote,
(entityBuilder, propertyBuilder) =>
{
propertyBuilder.HasMaxLength(512).HasDefaultValue(null);
}
);
ObjectExtensionManager.Instance
.MapEfCoreProperty<IdentityUser, Guid?>(
PlatformConsts.AbpIdentity.User.ShiftId,
(entityBuilder, propertyBuilder) =>
{
propertyBuilder.HasDefaultValue(null);
}
);
ObjectExtensionManager.Instance
.MapEfCoreProperty<IdentityUser, string>(
PlatformConsts.AbpIdentity.User.PdksCardNo,
(entityBuilder, propertyBuilder) =>
{
propertyBuilder.HasMaxLength(64).HasDefaultValue(null);
}
);
ObjectExtensionManager.Instance
.MapEfCoreProperty<IdentityUser, string>(
PlatformConsts.AbpIdentity.User.DrivingLicenseClass,
(entityBuilder, propertyBuilder) =>
{
propertyBuilder.HasMaxLength(64).HasDefaultValue(null);
}
);
ObjectExtensionManager.Instance
.MapEfCoreProperty<IdentityUser, string>(
PlatformConsts.AbpIdentity.User.DrivingLicenseNo,
(entityBuilder, propertyBuilder) =>
{
propertyBuilder.HasMaxLength(32).HasDefaultValue(null);
}
);
ObjectExtensionManager.Instance
.MapEfCoreProperty<IdentityUser, DateTime?>(
PlatformConsts.AbpIdentity.User.DrivingLicenseIssueDate,
(entityBuilder, propertyBuilder) =>
{
propertyBuilder.HasDefaultValue(null);
}
);
ObjectExtensionManager.Instance
.MapEfCoreProperty<IdentityUser, DateTime?>(
PlatformConsts.AbpIdentity.User.DrivingLicenseExpiryDate,
(entityBuilder, propertyBuilder) =>
{
propertyBuilder.HasDefaultValue(null);
}
);
ObjectExtensionManager.Instance
.MapEfCoreProperty<IdentityUser, string>(
PlatformConsts.AbpIdentity.User.BankName,
(entityBuilder, propertyBuilder) =>
{
propertyBuilder.HasMaxLength(128).HasDefaultValue(null);
}
);
ObjectExtensionManager.Instance
.MapEfCoreProperty<IdentityUser, string>(
PlatformConsts.AbpIdentity.User.Iban,
(entityBuilder, propertyBuilder) =>
{
propertyBuilder.HasMaxLength(34).HasDefaultValue(null);
}
);
ObjectExtensionManager.Instance
.MapEfCoreProperty<IdentityUser, string>(
PlatformConsts.AbpIdentity.User.SalaryType,
(entityBuilder, propertyBuilder) =>
{
propertyBuilder.HasMaxLength(16).HasDefaultValue(null);
}
);
ObjectExtensionManager.Instance
.MapEfCoreProperty<IdentityUser, decimal?>(
PlatformConsts.AbpIdentity.User.GrossSalary,
(entityBuilder, propertyBuilder) =>
{
propertyBuilder.HasPrecision(18, 2).HasDefaultValue(null);
}
);
ObjectExtensionManager.Instance
.MapEfCoreProperty<IdentityUser, string>(
PlatformConsts.AbpIdentity.User.SalaryCurrency,
(entityBuilder, propertyBuilder) =>
{
propertyBuilder.HasMaxLength(8).HasDefaultValue(null);
}
);
ObjectExtensionManager.Instance
.MapEfCoreProperty<IdentityUser, string>(
PlatformConsts.AbpIdentity.User.BloodType,

View file

@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore;
namespace Sozsoft.Platform.Migrations
{
[DbContext(typeof(PlatformDbContext))]
[Migration("20261001063425_Initial")]
[Migration("20261002230416_Initial")]
partial class Initial
{
/// <inheritdoc />
@ -930,7 +930,7 @@ namespace Sozsoft.Platform.Migrations
.IsUnique()
.HasFilter("[IsDeleted] = 0");
b.ToTable("Adm_T_Announcement", (string)null);
b.ToTable("Hr_T_Announcement", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.AnnouncementComment", b =>
@ -992,7 +992,7 @@ namespace Sozsoft.Platform.Migrations
b.HasIndex("AnnouncementId");
b.ToTable("Adm_T_AnnouncementComment", (string)null);
b.ToTable("Hr_T_AnnouncementComment", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.AnnouncementLike", b =>
@ -1046,7 +1046,7 @@ namespace Sozsoft.Platform.Migrations
.IsUnique()
.HasFilter("[IsDeleted] = 0");
b.ToTable("Adm_T_AnnouncementLike", (string)null);
b.ToTable("Hr_T_AnnouncementLike", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.BackgroundWorker", b =>
@ -2727,7 +2727,7 @@ namespace Sozsoft.Platform.Migrations
.IsUnique()
.HasFilter("[IsDeleted] = 0");
b.ToTable("Adm_T_Event", (string)null);
b.ToTable("Hr_T_Event", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.EventCategory", b =>
@ -2780,7 +2780,7 @@ namespace Sozsoft.Platform.Migrations
.IsUnique()
.HasFilter("[IsDeleted] = 0");
b.ToTable("Adm_T_EventCategory", (string)null);
b.ToTable("Hr_T_EventCategory", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.EventComment", b =>
@ -2841,7 +2841,7 @@ namespace Sozsoft.Platform.Migrations
b.HasIndex("EventId");
b.ToTable("Adm_T_EventComment", (string)null);
b.ToTable("Hr_T_EventComment", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.EventLike", b =>
@ -2895,7 +2895,7 @@ namespace Sozsoft.Platform.Migrations
.IsUnique()
.HasFilter("[IsDeleted] = 0");
b.ToTable("Adm_T_EventLike", (string)null);
b.ToTable("Hr_T_EventLike", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.EventType", b =>
@ -2948,7 +2948,7 @@ namespace Sozsoft.Platform.Migrations
.IsUnique()
.HasFilter("[IsDeleted] = 0");
b.ToTable("Adm_T_EventType", (string)null);
b.ToTable("Hr_T_EventType", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.GlobalSearch", b =>
@ -4205,7 +4205,7 @@ namespace Sozsoft.Platform.Migrations
b.HasKey("Id");
b.ToTable("Adm_T_MessengerConversation", (string)null);
b.ToTable("Hr_T_MessengerConversation", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.MessengerConversationMessage", b =>
@ -4284,7 +4284,7 @@ namespace Sozsoft.Platform.Migrations
b.HasIndex("TenantId", "ConversationId", "SentAt");
b.ToTable("Adm_T_MessengerConversationMessage", (string)null);
b.ToTable("Hr_T_MessengerConversationMessage", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.Module", b =>
@ -5378,7 +5378,7 @@ namespace Sozsoft.Platform.Migrations
b.HasIndex("SocialPostId");
b.ToTable("Adm_T_SocialComment", (string)null);
b.ToTable("Hr_T_SocialComment", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.SocialLike", b =>
@ -5432,7 +5432,7 @@ namespace Sozsoft.Platform.Migrations
.IsUnique()
.HasFilter("[IsDeleted] = 0");
b.ToTable("Adm_T_SocialLike", (string)null);
b.ToTable("Hr_T_SocialLike", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.SocialLocation", b =>
@ -5501,7 +5501,7 @@ namespace Sozsoft.Platform.Migrations
b.HasIndex("SocialPostId")
.IsUnique();
b.ToTable("Adm_T_SocialLocation", (string)null);
b.ToTable("Hr_T_SocialLocation", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.SocialMedia", b =>
@ -5573,7 +5573,7 @@ namespace Sozsoft.Platform.Migrations
b.HasIndex("SocialPostId")
.IsUnique();
b.ToTable("Adm_T_SocialMedia", (string)null);
b.ToTable("Hr_T_SocialMedia", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.SocialPollOption", b =>
@ -5630,7 +5630,7 @@ namespace Sozsoft.Platform.Migrations
b.HasIndex("SocialMediaId");
b.ToTable("Adm_T_SocialPollOption", (string)null);
b.ToTable("Hr_T_SocialPollOption", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.SocialPost", b =>
@ -5696,7 +5696,7 @@ namespace Sozsoft.Platform.Migrations
b.HasKey("Id");
b.ToTable("Adm_T_SocialPost", (string)null);
b.ToTable("Hr_T_SocialPost", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.Survey", b =>
@ -5769,7 +5769,7 @@ namespace Sozsoft.Platform.Migrations
.IsUnique()
.HasFilter("[IsDeleted] = 0");
b.ToTable("Adm_T_Survey", (string)null);
b.ToTable("Hr_T_Survey", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.SurveyAnswer", b =>
@ -5833,7 +5833,7 @@ namespace Sozsoft.Platform.Migrations
b.HasIndex("ResponseId");
b.ToTable("Adm_T_SurveyAnswer", (string)null);
b.ToTable("Hr_T_SurveyAnswer", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.SurveyQuestion", b =>
@ -5898,7 +5898,7 @@ namespace Sozsoft.Platform.Migrations
b.HasIndex("SurveyId");
b.ToTable("Adm_T_SurveyQuestion", (string)null);
b.ToTable("Hr_T_SurveyQuestion", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.SurveyQuestionOption", b =>
@ -5955,7 +5955,7 @@ namespace Sozsoft.Platform.Migrations
b.HasIndex("QuestionId");
b.ToTable("Adm_T_SurveyQuestionOption", (string)null);
b.ToTable("Hr_T_SurveyQuestionOption", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.SurveyResponse", b =>
@ -6010,7 +6010,66 @@ namespace Sozsoft.Platform.Migrations
b.HasIndex("SurveyId");
b.ToTable("Adm_T_SurveyResponse", (string)null);
b.ToTable("Hr_T_SurveyResponse", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.TerminationReason", b =>
{
b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier");
b.Property<string>("Code")
.IsRequired()
.HasMaxLength(8)
.HasColumnType("nvarchar(8)");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId");
b.Property<Guid?>("DeleterId")
.HasColumnType("uniqueidentifier")
.HasColumnName("DeleterId");
b.Property<DateTime?>("DeletionTime")
.HasColumnType("datetime2")
.HasColumnName("DeletionTime");
b.Property<bool>("IsActive")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
.HasDefaultValue(true);
b.Property<bool>("IsDeleted")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
.HasDefaultValue(false)
.HasColumnName("IsDeleted");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.HasKey("Id");
b.HasIndex("Code")
.IsUnique()
.HasFilter("[IsDeleted] = 0");
b.ToTable("Sas_H_TerminationReason", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.Uom", b =>
@ -6144,6 +6203,427 @@ namespace Sozsoft.Platform.Migrations
b.ToTable("Adm_T_UomCategory", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.UserBenefit", b =>
{
b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier");
b.Property<decimal?>("Amount")
.HasPrecision(18, 2)
.HasColumnType("decimal(18,2)");
b.Property<string>("BenefitType")
.IsRequired()
.HasMaxLength(32)
.HasColumnType("nvarchar(32)");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId");
b.Property<Guid?>("DeleterId")
.HasColumnType("uniqueidentifier")
.HasColumnName("DeleterId");
b.Property<DateTime?>("DeletionTime")
.HasColumnType("datetime2")
.HasColumnName("DeletionTime");
b.Property<DateTime?>("EndDate")
.HasColumnType("datetime2");
b.Property<bool>("IsDeleted")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
.HasDefaultValue(false)
.HasColumnName("IsDeleted");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<string>("Note")
.HasMaxLength(512)
.HasColumnType("nvarchar(512)");
b.Property<DateTime?>("StartDate")
.HasColumnType("datetime2");
b.Property<Guid?>("TenantId")
.HasColumnType("uniqueidentifier")
.HasColumnName("TenantId");
b.Property<Guid>("UserId")
.HasColumnType("uniqueidentifier");
b.HasKey("Id");
b.HasIndex("TenantId", "UserId");
b.ToTable("Adm_T_UserBenefit", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.UserCertificate", b =>
{
b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier");
b.Property<Guid>("CertificateId")
.HasColumnType("uniqueidentifier");
b.Property<string>("CertificateNo")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId");
b.Property<Guid?>("DeleterId")
.HasColumnType("uniqueidentifier")
.HasColumnName("DeleterId");
b.Property<DateTime?>("DeletionTime")
.HasColumnType("datetime2")
.HasColumnName("DeletionTime");
b.Property<DateTime?>("ExpiryDate")
.HasColumnType("datetime2");
b.Property<bool>("IsDeleted")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
.HasDefaultValue(false)
.HasColumnName("IsDeleted");
b.Property<DateTime?>("IssueDate")
.HasColumnType("datetime2");
b.Property<string>("IssuedBy")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<string>("Note")
.HasMaxLength(512)
.HasColumnType("nvarchar(512)");
b.Property<Guid?>("TenantId")
.HasColumnType("uniqueidentifier")
.HasColumnName("TenantId");
b.Property<Guid>("UserId")
.HasColumnType("uniqueidentifier");
b.HasKey("Id");
b.HasIndex("TenantId", "UserId");
b.ToTable("Adm_T_UserCertificate", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.UserEducation", b =>
{
b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId");
b.Property<Guid?>("DeleterId")
.HasColumnType("uniqueidentifier")
.HasColumnName("DeleterId");
b.Property<DateTime?>("DeletionTime")
.HasColumnType("datetime2")
.HasColumnName("DeletionTime");
b.Property<string>("Department")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.Property<string>("EducationLevel")
.IsRequired()
.HasMaxLength(32)
.HasColumnType("nvarchar(32)");
b.Property<DateTime?>("EndDate")
.HasColumnType("datetime2");
b.Property<bool>("IsDeleted")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
.HasDefaultValue(false)
.HasColumnName("IsDeleted");
b.Property<bool>("IsGraduated")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
.HasDefaultValue(true);
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<string>("SchoolName")
.IsRequired()
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.Property<DateTime?>("StartDate")
.HasColumnType("datetime2");
b.Property<Guid?>("TenantId")
.HasColumnType("uniqueidentifier")
.HasColumnName("TenantId");
b.Property<Guid>("UserId")
.HasColumnType("uniqueidentifier");
b.HasKey("Id");
b.HasIndex("TenantId", "UserId");
b.ToTable("Adm_T_UserEducation", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.UserEmergencyContact", b =>
{
b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId");
b.Property<Guid?>("DeleterId")
.HasColumnType("uniqueidentifier")
.HasColumnName("DeleterId");
b.Property<DateTime?>("DeletionTime")
.HasColumnType("datetime2")
.HasColumnName("DeletionTime");
b.Property<bool>("IsDeleted")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
.HasDefaultValue(false)
.HasColumnName("IsDeleted");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.Property<string>("PhoneNumber")
.IsRequired()
.HasMaxLength(32)
.HasColumnType("nvarchar(32)");
b.Property<string>("Relationship")
.IsRequired()
.HasMaxLength(16)
.HasColumnType("nvarchar(16)");
b.Property<Guid?>("TenantId")
.HasColumnType("uniqueidentifier")
.HasColumnName("TenantId");
b.Property<Guid>("UserId")
.HasColumnType("uniqueidentifier");
b.HasKey("Id");
b.HasIndex("TenantId", "UserId");
b.ToTable("Adm_T_UserEmergencyContact", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.UserFamilyMember", b =>
{
b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier");
b.Property<DateTime?>("BirthDate")
.HasColumnType("datetime2");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId");
b.Property<Guid?>("DeleterId")
.HasColumnType("uniqueidentifier")
.HasColumnName("DeleterId");
b.Property<DateTime?>("DeletionTime")
.HasColumnType("datetime2")
.HasColumnName("DeletionTime");
b.Property<string>("EmploymentStatus")
.HasMaxLength(16)
.HasColumnType("nvarchar(16)");
b.Property<string>("IdentityNumber")
.HasMaxLength(15)
.HasColumnType("nvarchar(15)");
b.Property<bool>("IsBenefitCovered")
.HasColumnType("bit");
b.Property<bool>("IsDeleted")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
.HasDefaultValue(false)
.HasColumnName("IsDeleted");
b.Property<bool>("IsInsuranceCovered")
.HasColumnType("bit");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(128)
.HasColumnType("nvarchar(128)");
b.Property<string>("Relationship")
.IsRequired()
.HasMaxLength(16)
.HasColumnType("nvarchar(16)");
b.Property<string>("Surname")
.HasMaxLength(128)
.HasColumnType("nvarchar(128)");
b.Property<Guid?>("TenantId")
.HasColumnType("uniqueidentifier")
.HasColumnName("TenantId");
b.Property<Guid>("UserId")
.HasColumnType("uniqueidentifier");
b.HasKey("Id");
b.HasIndex("TenantId", "UserId");
b.ToTable("Adm_T_UserFamilyMember", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.UserLanguage", b =>
{
b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId");
b.Property<Guid?>("DeleterId")
.HasColumnType("uniqueidentifier")
.HasColumnName("DeleterId");
b.Property<DateTime?>("DeletionTime")
.HasColumnType("datetime2")
.HasColumnName("DeletionTime");
b.Property<bool>("IsDeleted")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
.HasDefaultValue(false)
.HasColumnName("IsDeleted");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<string>("Note")
.HasMaxLength(512)
.HasColumnType("nvarchar(512)");
b.Property<Guid>("SkillId")
.HasColumnType("uniqueidentifier");
b.Property<Guid?>("SkillLevelId")
.HasColumnType("uniqueidentifier");
b.Property<Guid?>("TenantId")
.HasColumnType("uniqueidentifier")
.HasColumnName("TenantId");
b.Property<Guid>("UserId")
.HasColumnType("uniqueidentifier");
b.HasKey("Id");
b.HasIndex("SkillId");
b.HasIndex("SkillLevelId");
b.HasIndex("TenantId", "UserId", "SkillId")
.IsUnique()
.HasFilter("[IsDeleted] = 0");
b.ToTable("Adm_T_UserLanguage", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.UserPatientProtocol", b =>
{
b.Property<Guid>("Id")
@ -6361,6 +6841,72 @@ namespace Sozsoft.Platform.Migrations
b.ToTable("Adm_T_UserSickLeave", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.UserSkill", b =>
{
b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId");
b.Property<Guid?>("DeleterId")
.HasColumnType("uniqueidentifier")
.HasColumnName("DeleterId");
b.Property<DateTime?>("DeletionTime")
.HasColumnType("datetime2")
.HasColumnName("DeletionTime");
b.Property<bool>("IsDeleted")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
.HasDefaultValue(false)
.HasColumnName("IsDeleted");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<int>("Level")
.HasColumnType("int");
b.Property<string>("Note")
.HasMaxLength(512)
.HasColumnType("nvarchar(512)");
b.Property<Guid>("SkillId")
.HasColumnType("uniqueidentifier");
b.Property<Guid?>("TenantId")
.HasColumnType("uniqueidentifier")
.HasColumnName("TenantId");
b.Property<Guid>("UserId")
.HasColumnType("uniqueidentifier");
b.HasKey("Id");
b.HasIndex("SkillId");
b.HasIndex("TenantId", "UserId", "SkillId")
.IsUnique()
.HasFilter("[IsDeleted] = 0");
b.ToTable("Adm_T_UserSkill", null, t =>
{
t.HasCheckConstraint("CK_UserSkill_Level", "[Level] BETWEEN 1 AND 5");
});
});
modelBuilder.Entity("Sozsoft.Platform.Entities.UserWorkExperience", b =>
{
b.Property<Guid>("Id")
@ -8028,6 +8574,10 @@ namespace Sozsoft.Platform.Migrations
.HasMaxLength(512)
.HasColumnType("nvarchar(512)");
b.Property<string>("BankName")
.HasMaxLength(128)
.HasColumnType("nvarchar(128)");
b.Property<DateTime?>("BirthDate")
.HasColumnType("datetime2");
@ -8079,6 +8629,13 @@ namespace Sozsoft.Platform.Migrations
.HasColumnType("nvarchar(40)")
.HasColumnName("ConcurrencyStamp");
b.Property<DateTime?>("ContractEndDate")
.HasColumnType("datetime2");
b.Property<string>("ContractType")
.HasMaxLength(16)
.HasColumnType("nvarchar(16)");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
@ -8135,10 +8692,34 @@ namespace Sozsoft.Platform.Migrations
.HasMaxLength(512)
.HasColumnType("nvarchar(512)");
b.Property<int?>("DisabilityRate")
.HasColumnType("int");
b.Property<string>("DisabilityReport")
.HasColumnType("nvarchar(max)");
b.Property<string>("DisabilityReportFileName")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.Property<string>("District")
.HasMaxLength(128)
.HasColumnType("nvarchar(128)");
b.Property<string>("DrivingLicenseClass")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<DateTime?>("DrivingLicenseExpiryDate")
.HasColumnType("datetime2");
b.Property<DateTime?>("DrivingLicenseIssueDate")
.HasColumnType("datetime2");
b.Property<string>("DrivingLicenseNo")
.HasMaxLength(32)
.HasColumnType("nvarchar(32)");
b.Property<string>("EducationLevel")
.HasMaxLength(128)
.HasColumnType("nvarchar(128)");
@ -8155,6 +8736,10 @@ namespace Sozsoft.Platform.Migrations
.HasDefaultValue(false)
.HasColumnName("EmailConfirmed");
b.Property<string>("EmploymentType")
.HasMaxLength(16)
.HasColumnType("nvarchar(16)");
b.Property<int>("EntityVersion")
.HasColumnType("int");
@ -8258,9 +8843,9 @@ namespace Sozsoft.Platform.Migrations
.HasMaxLength(16)
.HasColumnType("nvarchar(16)");
b.Property<string>("GraduationSchool")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.Property<decimal?>("GrossSalary")
.HasPrecision(18, 2)
.HasColumnType("decimal(18,2)");
b.Property<bool?>("HadSurgery")
.HasColumnType("bit");
@ -8294,6 +8879,10 @@ namespace Sozsoft.Platform.Migrations
.HasMaxLength(512)
.HasColumnType("nvarchar(512)");
b.Property<string>("Iban")
.HasMaxLength(34)
.HasColumnType("nvarchar(34)");
b.Property<string>("IdentityNumber")
.HasMaxLength(15)
.HasColumnType("nvarchar(15)");
@ -8308,6 +8897,11 @@ namespace Sozsoft.Platform.Migrations
.HasDefaultValue(false)
.HasColumnName("IsDeleted");
b.Property<bool>("IsDisabled")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
.HasDefaultValue(false);
b.Property<bool>("IsExternal")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
@ -8395,6 +8989,13 @@ namespace Sozsoft.Platform.Migrations
b.Property<DateTime?>("MarriageDate")
.HasColumnType("datetime2");
b.Property<DateTime?>("MilitaryPostponeEndDate")
.HasColumnType("datetime2");
b.Property<string>("MilitaryStatus")
.HasMaxLength(16)
.HasColumnType("nvarchar(16)");
b.Property<string>("MotherHealthNote")
.HasMaxLength(512)
.HasColumnType("nvarchar(512)");
@ -8442,11 +9043,22 @@ namespace Sozsoft.Platform.Migrations
.HasMaxLength(512)
.HasColumnType("nvarchar(512)");
b.Property<DateTime?>("PassportExpiryDate")
.HasColumnType("datetime2");
b.Property<string>("PassportNo")
.HasMaxLength(32)
.HasColumnType("nvarchar(32)");
b.Property<string>("PasswordHash")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)")
.HasColumnName("PasswordHash");
b.Property<string>("PdksCardNo")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<string>("PhoneNumber")
.HasMaxLength(16)
.HasColumnType("nvarchar(16)")
@ -8458,19 +9070,45 @@ namespace Sozsoft.Platform.Migrations
.HasDefaultValue(false)
.HasColumnName("PhoneNumberConfirmed");
b.Property<DateTime?>("ProbationEndDate")
.HasColumnType("datetime2");
b.Property<string>("Province")
.HasMaxLength(128)
.HasColumnType("nvarchar(128)");
b.Property<string>("RegistrationNo")
.HasMaxLength(32)
.HasColumnType("nvarchar(32)");
b.Property<string>("RocketUsername")
.HasColumnType("nvarchar(max)");
b.Property<string>("SalaryCurrency")
.HasMaxLength(8)
.HasColumnType("nvarchar(8)");
b.Property<string>("SalaryType")
.HasMaxLength(16)
.HasColumnType("nvarchar(16)");
b.Property<string>("SecondaryEmail")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.Property<string>("SecondaryPhoneNumber")
.HasMaxLength(32)
.HasColumnType("nvarchar(32)");
b.Property<string>("SecurityStamp")
.IsRequired()
.HasMaxLength(256)
.HasColumnType("nvarchar(256)")
.HasColumnName("SecurityStamp");
b.Property<DateTime?>("SeniorityStartDate")
.HasColumnType("datetime2");
b.Property<string>("SequenceNo")
.HasMaxLength(32)
.HasColumnType("nvarchar(32)");
@ -8479,6 +9117,9 @@ namespace Sozsoft.Platform.Migrations
.HasMaxLength(32)
.HasColumnType("nvarchar(32)");
b.Property<Guid?>("ShiftId")
.HasColumnType("uniqueidentifier");
b.Property<Guid?>("ShiftNightDoctorId")
.HasColumnType("uniqueidentifier");
@ -8524,6 +9165,13 @@ namespace Sozsoft.Platform.Migrations
b.Property<DateTime?>("TerminationDate")
.HasColumnType("datetime2");
b.Property<string>("TerminationNote")
.HasMaxLength(512)
.HasColumnType("nvarchar(512)");
b.Property<Guid?>("TerminationReasonId")
.HasColumnType("uniqueidentifier");
b.Property<string>("TetanusVaccination")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
@ -8563,6 +9211,13 @@ namespace Sozsoft.Platform.Migrations
b.Property<string>("WorkHour")
.HasColumnType("nvarchar(max)");
b.Property<DateTime?>("WorkPermitEndDate")
.HasColumnType("datetime2");
b.Property<string>("WorkPermitNo")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.HasKey("Id");
b.HasIndex("Email");
@ -9916,6 +10571,29 @@ namespace Sozsoft.Platform.Migrations
b.Navigation("UomCategory");
});
modelBuilder.Entity("Sozsoft.Platform.Entities.UserLanguage", b =>
{
b.HasOne("Sozsoft.Platform.Entities.Skill", null)
.WithMany()
.HasForeignKey("SkillId")
.OnDelete(DeleteBehavior.Restrict)
.IsRequired();
b.HasOne("Sozsoft.Platform.Entities.SkillLevel", null)
.WithMany()
.HasForeignKey("SkillLevelId")
.OnDelete(DeleteBehavior.Restrict);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.UserSkill", b =>
{
b.HasOne("Sozsoft.Platform.Entities.Skill", null)
.WithMany()
.HasForeignKey("SkillId")
.OnDelete(DeleteBehavior.Restrict)
.IsRequired();
});
modelBuilder.Entity("Sozsoft.Platform.Entities.UserWorkExperience", b =>
{
b.HasOne("Sozsoft.Platform.Entities.Sector", null)

View file

@ -927,7 +927,7 @@ namespace Sozsoft.Platform.Migrations
.IsUnique()
.HasFilter("[IsDeleted] = 0");
b.ToTable("Adm_T_Announcement", (string)null);
b.ToTable("Hr_T_Announcement", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.AnnouncementComment", b =>
@ -989,7 +989,7 @@ namespace Sozsoft.Platform.Migrations
b.HasIndex("AnnouncementId");
b.ToTable("Adm_T_AnnouncementComment", (string)null);
b.ToTable("Hr_T_AnnouncementComment", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.AnnouncementLike", b =>
@ -1043,7 +1043,7 @@ namespace Sozsoft.Platform.Migrations
.IsUnique()
.HasFilter("[IsDeleted] = 0");
b.ToTable("Adm_T_AnnouncementLike", (string)null);
b.ToTable("Hr_T_AnnouncementLike", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.BackgroundWorker", b =>
@ -2724,7 +2724,7 @@ namespace Sozsoft.Platform.Migrations
.IsUnique()
.HasFilter("[IsDeleted] = 0");
b.ToTable("Adm_T_Event", (string)null);
b.ToTable("Hr_T_Event", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.EventCategory", b =>
@ -2777,7 +2777,7 @@ namespace Sozsoft.Platform.Migrations
.IsUnique()
.HasFilter("[IsDeleted] = 0");
b.ToTable("Adm_T_EventCategory", (string)null);
b.ToTable("Hr_T_EventCategory", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.EventComment", b =>
@ -2838,7 +2838,7 @@ namespace Sozsoft.Platform.Migrations
b.HasIndex("EventId");
b.ToTable("Adm_T_EventComment", (string)null);
b.ToTable("Hr_T_EventComment", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.EventLike", b =>
@ -2892,7 +2892,7 @@ namespace Sozsoft.Platform.Migrations
.IsUnique()
.HasFilter("[IsDeleted] = 0");
b.ToTable("Adm_T_EventLike", (string)null);
b.ToTable("Hr_T_EventLike", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.EventType", b =>
@ -2945,7 +2945,7 @@ namespace Sozsoft.Platform.Migrations
.IsUnique()
.HasFilter("[IsDeleted] = 0");
b.ToTable("Adm_T_EventType", (string)null);
b.ToTable("Hr_T_EventType", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.GlobalSearch", b =>
@ -4202,7 +4202,7 @@ namespace Sozsoft.Platform.Migrations
b.HasKey("Id");
b.ToTable("Adm_T_MessengerConversation", (string)null);
b.ToTable("Hr_T_MessengerConversation", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.MessengerConversationMessage", b =>
@ -4281,7 +4281,7 @@ namespace Sozsoft.Platform.Migrations
b.HasIndex("TenantId", "ConversationId", "SentAt");
b.ToTable("Adm_T_MessengerConversationMessage", (string)null);
b.ToTable("Hr_T_MessengerConversationMessage", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.Module", b =>
@ -5375,7 +5375,7 @@ namespace Sozsoft.Platform.Migrations
b.HasIndex("SocialPostId");
b.ToTable("Adm_T_SocialComment", (string)null);
b.ToTable("Hr_T_SocialComment", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.SocialLike", b =>
@ -5429,7 +5429,7 @@ namespace Sozsoft.Platform.Migrations
.IsUnique()
.HasFilter("[IsDeleted] = 0");
b.ToTable("Adm_T_SocialLike", (string)null);
b.ToTable("Hr_T_SocialLike", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.SocialLocation", b =>
@ -5498,7 +5498,7 @@ namespace Sozsoft.Platform.Migrations
b.HasIndex("SocialPostId")
.IsUnique();
b.ToTable("Adm_T_SocialLocation", (string)null);
b.ToTable("Hr_T_SocialLocation", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.SocialMedia", b =>
@ -5570,7 +5570,7 @@ namespace Sozsoft.Platform.Migrations
b.HasIndex("SocialPostId")
.IsUnique();
b.ToTable("Adm_T_SocialMedia", (string)null);
b.ToTable("Hr_T_SocialMedia", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.SocialPollOption", b =>
@ -5627,7 +5627,7 @@ namespace Sozsoft.Platform.Migrations
b.HasIndex("SocialMediaId");
b.ToTable("Adm_T_SocialPollOption", (string)null);
b.ToTable("Hr_T_SocialPollOption", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.SocialPost", b =>
@ -5693,7 +5693,7 @@ namespace Sozsoft.Platform.Migrations
b.HasKey("Id");
b.ToTable("Adm_T_SocialPost", (string)null);
b.ToTable("Hr_T_SocialPost", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.Survey", b =>
@ -5766,7 +5766,7 @@ namespace Sozsoft.Platform.Migrations
.IsUnique()
.HasFilter("[IsDeleted] = 0");
b.ToTable("Adm_T_Survey", (string)null);
b.ToTable("Hr_T_Survey", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.SurveyAnswer", b =>
@ -5830,7 +5830,7 @@ namespace Sozsoft.Platform.Migrations
b.HasIndex("ResponseId");
b.ToTable("Adm_T_SurveyAnswer", (string)null);
b.ToTable("Hr_T_SurveyAnswer", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.SurveyQuestion", b =>
@ -5895,7 +5895,7 @@ namespace Sozsoft.Platform.Migrations
b.HasIndex("SurveyId");
b.ToTable("Adm_T_SurveyQuestion", (string)null);
b.ToTable("Hr_T_SurveyQuestion", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.SurveyQuestionOption", b =>
@ -5952,7 +5952,7 @@ namespace Sozsoft.Platform.Migrations
b.HasIndex("QuestionId");
b.ToTable("Adm_T_SurveyQuestionOption", (string)null);
b.ToTable("Hr_T_SurveyQuestionOption", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.SurveyResponse", b =>
@ -6007,7 +6007,66 @@ namespace Sozsoft.Platform.Migrations
b.HasIndex("SurveyId");
b.ToTable("Adm_T_SurveyResponse", (string)null);
b.ToTable("Hr_T_SurveyResponse", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.TerminationReason", b =>
{
b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier");
b.Property<string>("Code")
.IsRequired()
.HasMaxLength(8)
.HasColumnType("nvarchar(8)");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId");
b.Property<Guid?>("DeleterId")
.HasColumnType("uniqueidentifier")
.HasColumnName("DeleterId");
b.Property<DateTime?>("DeletionTime")
.HasColumnType("datetime2")
.HasColumnName("DeletionTime");
b.Property<bool>("IsActive")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
.HasDefaultValue(true);
b.Property<bool>("IsDeleted")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
.HasDefaultValue(false)
.HasColumnName("IsDeleted");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.HasKey("Id");
b.HasIndex("Code")
.IsUnique()
.HasFilter("[IsDeleted] = 0");
b.ToTable("Sas_H_TerminationReason", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.Uom", b =>
@ -6141,6 +6200,427 @@ namespace Sozsoft.Platform.Migrations
b.ToTable("Adm_T_UomCategory", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.UserBenefit", b =>
{
b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier");
b.Property<decimal?>("Amount")
.HasPrecision(18, 2)
.HasColumnType("decimal(18,2)");
b.Property<string>("BenefitType")
.IsRequired()
.HasMaxLength(32)
.HasColumnType("nvarchar(32)");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId");
b.Property<Guid?>("DeleterId")
.HasColumnType("uniqueidentifier")
.HasColumnName("DeleterId");
b.Property<DateTime?>("DeletionTime")
.HasColumnType("datetime2")
.HasColumnName("DeletionTime");
b.Property<DateTime?>("EndDate")
.HasColumnType("datetime2");
b.Property<bool>("IsDeleted")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
.HasDefaultValue(false)
.HasColumnName("IsDeleted");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<string>("Note")
.HasMaxLength(512)
.HasColumnType("nvarchar(512)");
b.Property<DateTime?>("StartDate")
.HasColumnType("datetime2");
b.Property<Guid?>("TenantId")
.HasColumnType("uniqueidentifier")
.HasColumnName("TenantId");
b.Property<Guid>("UserId")
.HasColumnType("uniqueidentifier");
b.HasKey("Id");
b.HasIndex("TenantId", "UserId");
b.ToTable("Adm_T_UserBenefit", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.UserCertificate", b =>
{
b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier");
b.Property<Guid>("CertificateId")
.HasColumnType("uniqueidentifier");
b.Property<string>("CertificateNo")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId");
b.Property<Guid?>("DeleterId")
.HasColumnType("uniqueidentifier")
.HasColumnName("DeleterId");
b.Property<DateTime?>("DeletionTime")
.HasColumnType("datetime2")
.HasColumnName("DeletionTime");
b.Property<DateTime?>("ExpiryDate")
.HasColumnType("datetime2");
b.Property<bool>("IsDeleted")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
.HasDefaultValue(false)
.HasColumnName("IsDeleted");
b.Property<DateTime?>("IssueDate")
.HasColumnType("datetime2");
b.Property<string>("IssuedBy")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<string>("Note")
.HasMaxLength(512)
.HasColumnType("nvarchar(512)");
b.Property<Guid?>("TenantId")
.HasColumnType("uniqueidentifier")
.HasColumnName("TenantId");
b.Property<Guid>("UserId")
.HasColumnType("uniqueidentifier");
b.HasKey("Id");
b.HasIndex("TenantId", "UserId");
b.ToTable("Adm_T_UserCertificate", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.UserEducation", b =>
{
b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId");
b.Property<Guid?>("DeleterId")
.HasColumnType("uniqueidentifier")
.HasColumnName("DeleterId");
b.Property<DateTime?>("DeletionTime")
.HasColumnType("datetime2")
.HasColumnName("DeletionTime");
b.Property<string>("Department")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.Property<string>("EducationLevel")
.IsRequired()
.HasMaxLength(32)
.HasColumnType("nvarchar(32)");
b.Property<DateTime?>("EndDate")
.HasColumnType("datetime2");
b.Property<bool>("IsDeleted")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
.HasDefaultValue(false)
.HasColumnName("IsDeleted");
b.Property<bool>("IsGraduated")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
.HasDefaultValue(true);
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<string>("SchoolName")
.IsRequired()
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.Property<DateTime?>("StartDate")
.HasColumnType("datetime2");
b.Property<Guid?>("TenantId")
.HasColumnType("uniqueidentifier")
.HasColumnName("TenantId");
b.Property<Guid>("UserId")
.HasColumnType("uniqueidentifier");
b.HasKey("Id");
b.HasIndex("TenantId", "UserId");
b.ToTable("Adm_T_UserEducation", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.UserEmergencyContact", b =>
{
b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId");
b.Property<Guid?>("DeleterId")
.HasColumnType("uniqueidentifier")
.HasColumnName("DeleterId");
b.Property<DateTime?>("DeletionTime")
.HasColumnType("datetime2")
.HasColumnName("DeletionTime");
b.Property<bool>("IsDeleted")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
.HasDefaultValue(false)
.HasColumnName("IsDeleted");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.Property<string>("PhoneNumber")
.IsRequired()
.HasMaxLength(32)
.HasColumnType("nvarchar(32)");
b.Property<string>("Relationship")
.IsRequired()
.HasMaxLength(16)
.HasColumnType("nvarchar(16)");
b.Property<Guid?>("TenantId")
.HasColumnType("uniqueidentifier")
.HasColumnName("TenantId");
b.Property<Guid>("UserId")
.HasColumnType("uniqueidentifier");
b.HasKey("Id");
b.HasIndex("TenantId", "UserId");
b.ToTable("Adm_T_UserEmergencyContact", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.UserFamilyMember", b =>
{
b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier");
b.Property<DateTime?>("BirthDate")
.HasColumnType("datetime2");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId");
b.Property<Guid?>("DeleterId")
.HasColumnType("uniqueidentifier")
.HasColumnName("DeleterId");
b.Property<DateTime?>("DeletionTime")
.HasColumnType("datetime2")
.HasColumnName("DeletionTime");
b.Property<string>("EmploymentStatus")
.HasMaxLength(16)
.HasColumnType("nvarchar(16)");
b.Property<string>("IdentityNumber")
.HasMaxLength(15)
.HasColumnType("nvarchar(15)");
b.Property<bool>("IsBenefitCovered")
.HasColumnType("bit");
b.Property<bool>("IsDeleted")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
.HasDefaultValue(false)
.HasColumnName("IsDeleted");
b.Property<bool>("IsInsuranceCovered")
.HasColumnType("bit");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(128)
.HasColumnType("nvarchar(128)");
b.Property<string>("Relationship")
.IsRequired()
.HasMaxLength(16)
.HasColumnType("nvarchar(16)");
b.Property<string>("Surname")
.HasMaxLength(128)
.HasColumnType("nvarchar(128)");
b.Property<Guid?>("TenantId")
.HasColumnType("uniqueidentifier")
.HasColumnName("TenantId");
b.Property<Guid>("UserId")
.HasColumnType("uniqueidentifier");
b.HasKey("Id");
b.HasIndex("TenantId", "UserId");
b.ToTable("Adm_T_UserFamilyMember", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.UserLanguage", b =>
{
b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId");
b.Property<Guid?>("DeleterId")
.HasColumnType("uniqueidentifier")
.HasColumnName("DeleterId");
b.Property<DateTime?>("DeletionTime")
.HasColumnType("datetime2")
.HasColumnName("DeletionTime");
b.Property<bool>("IsDeleted")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
.HasDefaultValue(false)
.HasColumnName("IsDeleted");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<string>("Note")
.HasMaxLength(512)
.HasColumnType("nvarchar(512)");
b.Property<Guid>("SkillId")
.HasColumnType("uniqueidentifier");
b.Property<Guid?>("SkillLevelId")
.HasColumnType("uniqueidentifier");
b.Property<Guid?>("TenantId")
.HasColumnType("uniqueidentifier")
.HasColumnName("TenantId");
b.Property<Guid>("UserId")
.HasColumnType("uniqueidentifier");
b.HasKey("Id");
b.HasIndex("SkillId");
b.HasIndex("SkillLevelId");
b.HasIndex("TenantId", "UserId", "SkillId")
.IsUnique()
.HasFilter("[IsDeleted] = 0");
b.ToTable("Adm_T_UserLanguage", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.UserPatientProtocol", b =>
{
b.Property<Guid>("Id")
@ -6358,6 +6838,72 @@ namespace Sozsoft.Platform.Migrations
b.ToTable("Adm_T_UserSickLeave", (string)null);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.UserSkill", b =>
{
b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId");
b.Property<Guid?>("DeleterId")
.HasColumnType("uniqueidentifier")
.HasColumnName("DeleterId");
b.Property<DateTime?>("DeletionTime")
.HasColumnType("datetime2")
.HasColumnName("DeletionTime");
b.Property<bool>("IsDeleted")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
.HasDefaultValue(false)
.HasColumnName("IsDeleted");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<int>("Level")
.HasColumnType("int");
b.Property<string>("Note")
.HasMaxLength(512)
.HasColumnType("nvarchar(512)");
b.Property<Guid>("SkillId")
.HasColumnType("uniqueidentifier");
b.Property<Guid?>("TenantId")
.HasColumnType("uniqueidentifier")
.HasColumnName("TenantId");
b.Property<Guid>("UserId")
.HasColumnType("uniqueidentifier");
b.HasKey("Id");
b.HasIndex("SkillId");
b.HasIndex("TenantId", "UserId", "SkillId")
.IsUnique()
.HasFilter("[IsDeleted] = 0");
b.ToTable("Adm_T_UserSkill", null, t =>
{
t.HasCheckConstraint("CK_UserSkill_Level", "[Level] BETWEEN 1 AND 5");
});
});
modelBuilder.Entity("Sozsoft.Platform.Entities.UserWorkExperience", b =>
{
b.Property<Guid>("Id")
@ -8025,6 +8571,10 @@ namespace Sozsoft.Platform.Migrations
.HasMaxLength(512)
.HasColumnType("nvarchar(512)");
b.Property<string>("BankName")
.HasMaxLength(128)
.HasColumnType("nvarchar(128)");
b.Property<DateTime?>("BirthDate")
.HasColumnType("datetime2");
@ -8076,6 +8626,13 @@ namespace Sozsoft.Platform.Migrations
.HasColumnType("nvarchar(40)")
.HasColumnName("ConcurrencyStamp");
b.Property<DateTime?>("ContractEndDate")
.HasColumnType("datetime2");
b.Property<string>("ContractType")
.HasMaxLength(16)
.HasColumnType("nvarchar(16)");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
@ -8132,10 +8689,34 @@ namespace Sozsoft.Platform.Migrations
.HasMaxLength(512)
.HasColumnType("nvarchar(512)");
b.Property<int?>("DisabilityRate")
.HasColumnType("int");
b.Property<string>("DisabilityReport")
.HasColumnType("nvarchar(max)");
b.Property<string>("DisabilityReportFileName")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.Property<string>("District")
.HasMaxLength(128)
.HasColumnType("nvarchar(128)");
b.Property<string>("DrivingLicenseClass")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<DateTime?>("DrivingLicenseExpiryDate")
.HasColumnType("datetime2");
b.Property<DateTime?>("DrivingLicenseIssueDate")
.HasColumnType("datetime2");
b.Property<string>("DrivingLicenseNo")
.HasMaxLength(32)
.HasColumnType("nvarchar(32)");
b.Property<string>("EducationLevel")
.HasMaxLength(128)
.HasColumnType("nvarchar(128)");
@ -8152,6 +8733,10 @@ namespace Sozsoft.Platform.Migrations
.HasDefaultValue(false)
.HasColumnName("EmailConfirmed");
b.Property<string>("EmploymentType")
.HasMaxLength(16)
.HasColumnType("nvarchar(16)");
b.Property<int>("EntityVersion")
.HasColumnType("int");
@ -8255,9 +8840,9 @@ namespace Sozsoft.Platform.Migrations
.HasMaxLength(16)
.HasColumnType("nvarchar(16)");
b.Property<string>("GraduationSchool")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.Property<decimal?>("GrossSalary")
.HasPrecision(18, 2)
.HasColumnType("decimal(18,2)");
b.Property<bool?>("HadSurgery")
.HasColumnType("bit");
@ -8291,6 +8876,10 @@ namespace Sozsoft.Platform.Migrations
.HasMaxLength(512)
.HasColumnType("nvarchar(512)");
b.Property<string>("Iban")
.HasMaxLength(34)
.HasColumnType("nvarchar(34)");
b.Property<string>("IdentityNumber")
.HasMaxLength(15)
.HasColumnType("nvarchar(15)");
@ -8305,6 +8894,11 @@ namespace Sozsoft.Platform.Migrations
.HasDefaultValue(false)
.HasColumnName("IsDeleted");
b.Property<bool>("IsDisabled")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
.HasDefaultValue(false);
b.Property<bool>("IsExternal")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
@ -8392,6 +8986,13 @@ namespace Sozsoft.Platform.Migrations
b.Property<DateTime?>("MarriageDate")
.HasColumnType("datetime2");
b.Property<DateTime?>("MilitaryPostponeEndDate")
.HasColumnType("datetime2");
b.Property<string>("MilitaryStatus")
.HasMaxLength(16)
.HasColumnType("nvarchar(16)");
b.Property<string>("MotherHealthNote")
.HasMaxLength(512)
.HasColumnType("nvarchar(512)");
@ -8439,11 +9040,22 @@ namespace Sozsoft.Platform.Migrations
.HasMaxLength(512)
.HasColumnType("nvarchar(512)");
b.Property<DateTime?>("PassportExpiryDate")
.HasColumnType("datetime2");
b.Property<string>("PassportNo")
.HasMaxLength(32)
.HasColumnType("nvarchar(32)");
b.Property<string>("PasswordHash")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)")
.HasColumnName("PasswordHash");
b.Property<string>("PdksCardNo")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<string>("PhoneNumber")
.HasMaxLength(16)
.HasColumnType("nvarchar(16)")
@ -8455,19 +9067,45 @@ namespace Sozsoft.Platform.Migrations
.HasDefaultValue(false)
.HasColumnName("PhoneNumberConfirmed");
b.Property<DateTime?>("ProbationEndDate")
.HasColumnType("datetime2");
b.Property<string>("Province")
.HasMaxLength(128)
.HasColumnType("nvarchar(128)");
b.Property<string>("RegistrationNo")
.HasMaxLength(32)
.HasColumnType("nvarchar(32)");
b.Property<string>("RocketUsername")
.HasColumnType("nvarchar(max)");
b.Property<string>("SalaryCurrency")
.HasMaxLength(8)
.HasColumnType("nvarchar(8)");
b.Property<string>("SalaryType")
.HasMaxLength(16)
.HasColumnType("nvarchar(16)");
b.Property<string>("SecondaryEmail")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.Property<string>("SecondaryPhoneNumber")
.HasMaxLength(32)
.HasColumnType("nvarchar(32)");
b.Property<string>("SecurityStamp")
.IsRequired()
.HasMaxLength(256)
.HasColumnType("nvarchar(256)")
.HasColumnName("SecurityStamp");
b.Property<DateTime?>("SeniorityStartDate")
.HasColumnType("datetime2");
b.Property<string>("SequenceNo")
.HasMaxLength(32)
.HasColumnType("nvarchar(32)");
@ -8476,6 +9114,9 @@ namespace Sozsoft.Platform.Migrations
.HasMaxLength(32)
.HasColumnType("nvarchar(32)");
b.Property<Guid?>("ShiftId")
.HasColumnType("uniqueidentifier");
b.Property<Guid?>("ShiftNightDoctorId")
.HasColumnType("uniqueidentifier");
@ -8521,6 +9162,13 @@ namespace Sozsoft.Platform.Migrations
b.Property<DateTime?>("TerminationDate")
.HasColumnType("datetime2");
b.Property<string>("TerminationNote")
.HasMaxLength(512)
.HasColumnType("nvarchar(512)");
b.Property<Guid?>("TerminationReasonId")
.HasColumnType("uniqueidentifier");
b.Property<string>("TetanusVaccination")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
@ -8560,6 +9208,13 @@ namespace Sozsoft.Platform.Migrations
b.Property<string>("WorkHour")
.HasColumnType("nvarchar(max)");
b.Property<DateTime?>("WorkPermitEndDate")
.HasColumnType("datetime2");
b.Property<string>("WorkPermitNo")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.HasKey("Id");
b.HasIndex("Email");
@ -9913,6 +10568,29 @@ namespace Sozsoft.Platform.Migrations
b.Navigation("UomCategory");
});
modelBuilder.Entity("Sozsoft.Platform.Entities.UserLanguage", b =>
{
b.HasOne("Sozsoft.Platform.Entities.Skill", null)
.WithMany()
.HasForeignKey("SkillId")
.OnDelete(DeleteBehavior.Restrict)
.IsRequired();
b.HasOne("Sozsoft.Platform.Entities.SkillLevel", null)
.WithMany()
.HasForeignKey("SkillLevelId")
.OnDelete(DeleteBehavior.Restrict);
});
modelBuilder.Entity("Sozsoft.Platform.Entities.UserSkill", b =>
{
b.HasOne("Sozsoft.Platform.Entities.Skill", null)
.WithMany()
.HasForeignKey("SkillId")
.OnDelete(DeleteBehavior.Restrict)
.IsRequired();
});
modelBuilder.Entity("Sozsoft.Platform.Entities.UserWorkExperience", b =>
{
b.HasOne("Sozsoft.Platform.Entities.Sector", null)

View file

@ -143,7 +143,6 @@ public class TenantIdentityDataSeeder : IdentityDataSeeder
adminUser.SetNationality(PlatformConsts.AbpIdentity.User.AdminNationalityDefaultValue);
adminUser.SetBloodType(PlatformConsts.AbpIdentity.User.AdminBloodTypeDefaultValue);
adminUser.SetEducationLevel(PlatformConsts.AbpIdentity.User.AdminEducationLevelDefaultValue);
adminUser.SetGraduationSchool(PlatformConsts.AbpIdentity.User.AdminGraduationSchoolDefaultValue);
adminUser.SetHomeAddress(PlatformConsts.AbpIdentity.User.AdminHomeAddressDefaultValue);
adminUser.SetBirthDate(PlatformConsts.AbpIdentity.User.AdminBirthDateDefaultValue);
adminUser.SetBirthPlace(PlatformConsts.AbpIdentity.User.AdminBirthPlaceDefaultValue);

File diff suppressed because it is too large Load diff

View file

@ -42,6 +42,16 @@
"BeforeSp": "Sas_H_ListFormFieldsDictionaryJson_SaveDbTableColumns",
"AfterSp": null,
"IsActive": true
},
{
"Id": "cfb3c495-75b3-57cf-8b77-1ef74be1767e",
"Name": "Probation Reminder Worker",
"Cron": "0 8 * * *",
"WorkerType": 6,
"Scope": 3,
"BeforeSp": null,
"AfterSp": null,
"IsActive": true
}
]
}

View file

@ -0,0 +1,295 @@
{
"ListFormCode": "App.Definitions.TerminationReason",
"KeyFieldName": "Id",
"GeneratedAt": "2026-10-03T00:00:00Z",
"Rows": [
{
"Id": "94addf13-e695-587d-a25d-02381e6851d5",
"Code": "01",
"Name": "Deneme süreli iş sözleşmesinin işverence feshi",
"IsActive": true
},
{
"Id": "c0af30f8-98bf-5453-8866-693b657fac35",
"Code": "02",
"Name": "Deneme süreli iş sözleşmesinin işçi tarafından feshi",
"IsActive": true
},
{
"Id": "1ceac52c-1276-520f-a3cd-60f40df601a3",
"Code": "03",
"Name": "Belirsiz süreli iş sözleşmesinin işçi tarafından feshi (istifa)",
"IsActive": true
},
{
"Id": "9a9859c7-ff8f-52a2-8d3d-377f006a8b70",
"Code": "04",
"Name": "Belirsiz süreli iş sözleşmesinin işveren tarafından haklı sebep bildirilmeden feshi",
"IsActive": true
},
{
"Id": "76d5dead-60de-5620-a75d-9a64f11e0804",
"Code": "05",
"Name": "Belirli süreli iş sözleşmesinin sona ermesi",
"IsActive": true
},
{
"Id": "25dea72b-9b19-59b9-948e-ebb970dfbcd5",
"Code": "08",
"Name": "Emeklilik (yaşlılık) veya toptan ödeme nedeniyle",
"IsActive": true
},
{
"Id": "76bf0e54-5aed-566c-9422-25bb00f9f545",
"Code": "09",
"Name": "Malulen emeklilik nedeniyle",
"IsActive": true
},
{
"Id": "8b8f2134-99ce-5754-b73f-b642f2d299bc",
"Code": "10",
"Name": "Ölüm",
"IsActive": true
},
{
"Id": "3cbf570d-cdbb-5090-8020-3abbb20b957c",
"Code": "11",
"Name": "İş kazası sonucu ölüm",
"IsActive": true
},
{
"Id": "a7857aa4-3ec4-5147-b862-3b2294214910",
"Code": "12",
"Name": "Askerlik",
"IsActive": true
},
{
"Id": "89a00623-4c85-5c9c-9988-6ae1d6ef26e4",
"Code": "13",
"Name": "Kadın işçinin evlenmesi",
"IsActive": true
},
{
"Id": "859f6c31-a1a0-50cd-8362-7ee0f6a70f09",
"Code": "14",
"Name": "Emeklilik için yaş dışında diğer şartların tamamlanması",
"IsActive": true
},
{
"Id": "92658903-ce30-50eb-ad94-b7e57c872720",
"Code": "15",
"Name": "Toplu işçi çıkarma",
"IsActive": true
},
{
"Id": "50dae346-0f4a-54e6-b713-5ec201568454",
"Code": "16",
"Name": "Sözleşme sona ermeden sigortalının aynı işverene ait diğer işyerine nakli",
"IsActive": true
},
{
"Id": "5a97685a-942c-5717-8b40-f032a15d2764",
"Code": "17",
"Name": "İşyerinin kapanması",
"IsActive": true
},
{
"Id": "4246212d-3a10-5a0b-97ac-91891de13212",
"Code": "18",
"Name": "İşin sona ermesi",
"IsActive": true
},
{
"Id": "dc375100-d81d-549f-8db7-6cfbf00a589a",
"Code": "19",
"Name": "Mevsim bitimi (iş akdi askıya alınan)",
"IsActive": true
},
{
"Id": "1a574af7-d557-513d-90a7-4aca193bd338",
"Code": "20",
"Name": "Kampanya bitimi (iş akdi askıya alınan)",
"IsActive": true
},
{
"Id": "a7e4cdd4-4bac-5890-b2a2-c9a211404a3d",
"Code": "21",
"Name": "Statü değişikliği",
"IsActive": true
},
{
"Id": "799ad77d-2297-56e6-8e51-9d7c14af2d6f",
"Code": "22",
"Name": "Diğer nedenler",
"IsActive": true
},
{
"Id": "01b97a86-0d5f-5b3b-8f05-a7c482894958",
"Code": "23",
"Name": "İşçi tarafından zorunlu nedenle fesih",
"IsActive": true
},
{
"Id": "6f9c70f6-f46f-5b27-9938-a6bcb5d79b6e",
"Code": "24",
"Name": "İşçi tarafından sağlık nedeniyle fesih",
"IsActive": true
},
{
"Id": "d539b2a8-9107-5e72-abd3-3fa7222f4a0a",
"Code": "25",
"Name": "İşçi tarafından işverenin ahlak ve iyi niyet kurallarına aykırı davranışı nedeniyle fesih",
"IsActive": true
},
{
"Id": "e097ba43-d4ef-548d-8e39-9bd38d4ad567",
"Code": "26",
"Name": "Disiplin kurulu kararı ile fesih",
"IsActive": true
},
{
"Id": "80ef6852-a852-556e-ad21-cf2b82f50835",
"Code": "27",
"Name": "İşveren tarafından zorunlu nedenlerle ve tutukluluk nedeniyle fesih",
"IsActive": true
},
{
"Id": "6adacf93-45da-5879-a128-bad75e43eae3",
"Code": "28",
"Name": "İşveren tarafından sağlık nedeniyle fesih",
"IsActive": true
},
{
"Id": "9e9ebc6e-ec77-5740-9d11-367165c5c09f",
"Code": "29",
"Name": "İşveren tarafından işçinin ahlak ve iyi niyet kurallarına aykırı davranışı nedeniyle fesih",
"IsActive": true
},
{
"Id": "e8e8f5ae-1a94-5d90-9d7b-ccb0e97ae32c",
"Code": "30",
"Name": "Vize süresinin bitimi",
"IsActive": true
},
{
"Id": "92f268a8-e4ea-5157-8071-986211594651",
"Code": "31",
"Name": "Borçlar Kanunu, Sendikalar Kanunu, Grev ve Lokavt Kanunu kapsamında kendi istek ve kusuru dışında fesih",
"IsActive": true
},
{
"Id": "dd6e61c6-6d81-5b37-bc39-8a6c37ecd107",
"Code": "32",
"Name": "4046 sayılı Kanunun 21. maddesine göre özelleştirme nedeniyle fesih",
"IsActive": true
},
{
"Id": "03eb27f5-0551-599e-9d59-cdb7c45a65cc",
"Code": "33",
"Name": "Gazeteci tarafından sözleşmenin feshi",
"IsActive": true
},
{
"Id": "9fdf06ae-743d-5c8c-818e-f7a1fe04db6a",
"Code": "34",
"Name": "İşyerinin devri, işin veya işyerinin niteliğinin değişmesi nedeniyle fesih",
"IsActive": true
},
{
"Id": "fefaa557-64ec-5ef6-a726-ab45fa1e7d86",
"Code": "35",
"Name": "6495 S.K. nedeniyle Devlet Memurluğuna geçiş",
"IsActive": true
},
{
"Id": "f1e81dec-cd1d-5d0d-882e-06bf0af78d91",
"Code": "36",
"Name": "KHK ile işyerinin kapatılması",
"IsActive": true
},
{
"Id": "b77e868b-e6a1-5ca9-a355-4403b0c150fb",
"Code": "37",
"Name": "KHK ile kamu görevinden çıkarma",
"IsActive": true
},
{
"Id": "68b11493-da9e-560f-b26c-24d09d219c00",
"Code": "38",
"Name": "Doğum nedeniyle işten ayrılma",
"IsActive": true
},
{
"Id": "03349245-0b7b-5ecc-8dfa-47d1829cc1af",
"Code": "39",
"Name": "696 KHK ile kamu işçiliğine geçiş",
"IsActive": true
},
{
"Id": "998d2f21-5167-58fe-a79e-f5b204d5a777",
"Code": "40",
"Name": "696 KHK ile kamu işçiliğine geçilmemesi sebebiyle çıkış",
"IsActive": true
},
{
"Id": "e8a0b3fc-f0aa-5fc8-9ab8-c2bebcd3734d",
"Code": "41",
"Name": "Resmi ilan ve reklamların yayınlanmasına ilişkin yönetmeliğin 9. maddesi kapsamında çıkış",
"IsActive": true
},
{
"Id": "55fdcfd6-cdb5-5cd2-9cc5-31369ef0dd0c",
"Code": "42",
"Name": "4857 S.K. 25-II-a: Sözleşme yapıldığı sırada gerekli niteliklerin bulunmadığı konusunda işvereni yanıltma",
"IsActive": true
},
{
"Id": "9dcacb0c-88e4-5e35-88f9-7f7ae39d4db0",
"Code": "43",
"Name": "4857 S.K. 25-II-b: İşveren veya aile üyelerinin şeref ve namusuna dokunacak söz ve davranış",
"IsActive": true
},
{
"Id": "2e3bbf98-9cb0-5e3c-b528-a718bf3b16ec",
"Code": "44",
"Name": "4857 S.K. 25-II-c: İşverenin başka bir işçisine cinsel tacizde bulunma",
"IsActive": true
},
{
"Id": "ec2c4201-fa8d-52c1-a5b1-168c3caccc54",
"Code": "45",
"Name": "4857 S.K. 25-II-d: İşverene, aile üyelerine veya başka bir işçiye sataşma, işyerine sarhoş ya da uyuşturucu kullanarak gelme",
"IsActive": true
},
{
"Id": "2ec0ea60-9bdf-53c9-b099-4521825cf38d",
"Code": "46",
"Name": "4857 S.K. 25-II-e: Doğruluk ve bağlılığa uymayan davranışlar (hırsızlık, sır verme vb.)",
"IsActive": true
},
{
"Id": "74a53d9d-4584-593b-941e-3f97fbc3e11f",
"Code": "47",
"Name": "4857 S.K. 25-II-f: İşyerinde yedi günden fazla hapisle cezalandırılan ve ertelenmeyen suç işleme",
"IsActive": true
},
{
"Id": "38f45641-e62a-5c42-a9f2-f137c58ea41f",
"Code": "48",
"Name": "4857 S.K. 25-II-g: İzinsiz veya haklı bir nedene dayanmaksızın devamsızlık",
"IsActive": true
},
{
"Id": "ab33c7d3-9dcc-524c-b018-591df27a81ae",
"Code": "49",
"Name": "4857 S.K. 25-II-h: Yapmakla ödevli olduğu görevleri hatırlatıldığı hâlde yapmamakta ısrar",
"IsActive": true
},
{
"Id": "5d95eebf-9951-5046-9771-38a5da5c6dff",
"Code": "50",
"Name": "4857 S.K. 25-II-ı: İş güvenliğini tehlikeye düşürme veya işyerine zarar verme",
"IsActive": true
}
]
}

View file

@ -20,7 +20,7 @@
"Id": "f0c19fb9-6817-5401-99db-64f77e970b1e",
"Code": "documents",
"Name": "Documents",
"LabelKey": "App.Intranet.Documents",
"LabelKey": "App.Hr.Intranet.Documents",
"SourceType": 0,
"ComponentName": "",
"PermissionName": "App.Files.Widget",
@ -36,7 +36,7 @@
"LabelKey": "App.DashboardWidget.Surveys",
"SourceType": 0,
"ComponentName": "",
"PermissionName": "App.Intranet.Survey.Widget",
"PermissionName": "App.Hr.Intranet.Survey.Widget",
"Column": 0,
"Order": 30,
"Props": "",
@ -49,7 +49,7 @@
"LabelKey": "App.DashboardWidget.SocialWall",
"SourceType": 0,
"ComponentName": "",
"PermissionName": "App.Intranet.SocialPost.Widget",
"PermissionName": "App.Hr.Intranet.SocialPost.Widget",
"Column": 1,
"Order": 40,
"Props": "",
@ -59,10 +59,10 @@
"Id": "6ea6a7ca-a4ec-58c9-b049-dc9fccca9256",
"Code": "announcements",
"Name": "Announcements",
"LabelKey": "App.Intranet.Announcement",
"LabelKey": "App.Hr.Intranet.Announcement",
"SourceType": 0,
"ComponentName": "",
"PermissionName": "App.Intranet.Announcement.Widget",
"PermissionName": "App.Hr.Intranet.Announcement.Widget",
"Column": 2,
"Order": 50,
"Props": "",
@ -75,7 +75,7 @@
"LabelKey": "App.DashboardWidget.Events",
"SourceType": 0,
"ComponentName": "",
"PermissionName": "App.Intranet.Events.Event.Widget",
"PermissionName": "App.Hr.Intranet.Events.Event.Widget",
"Column": 2,
"Order": 60,
"Props": "",

View file

@ -1,5 +1,5 @@
{
"ListFormCode": "App.Intranet.Announcement",
"ListFormCode": "App.Hr.Intranet.Announcement",
"KeyFieldName": "Id",
"GeneratedAt": "2026-09-04T00:00:00Z",
"Order": 0,

View file

@ -1,5 +1,5 @@
{
"ListFormCode": "App.Intranet.Events.Event",
"ListFormCode": "App.Hr.Intranet.Events.Event",
"KeyFieldName": "Id",
"GeneratedAt": "2026-09-04T00:00:00Z",
"Order": 20,

View file

@ -1,5 +1,5 @@
{
"ListFormCode": "App.Intranet.Events.EventCategory",
"ListFormCode": "App.Hr.Intranet.Events.EventCategory",
"KeyFieldName": "Id",
"GeneratedAt": "2026-09-04T00:00:00Z",
"Order": 10,

View file

@ -1,5 +1,5 @@
{
"ListFormCode": "App.Intranet.Events.EventComment",
"ListFormCode": "App.Hr.Intranet.Events.EventComment",
"KeyFieldName": "Id",
"GeneratedAt": "2026-09-04T00:00:00Z",
"Order": 30,

View file

@ -1,5 +1,5 @@
{
"ListFormCode": "App.Intranet.Events.EventType",
"ListFormCode": "App.Hr.Intranet.Events.EventType",
"KeyFieldName": "Id",
"GeneratedAt": "2026-09-04T00:00:00Z",
"Order": 10,

View file

@ -1,5 +1,5 @@
{
"ListFormCode": "App.Intranet.SocialComment",
"ListFormCode": "App.Hr.Intranet.SocialComment",
"KeyFieldName": "Id",
"GeneratedAt": "2026-09-04T00:00:00Z",
"Order": 20,

View file

@ -1,5 +1,5 @@
{
"ListFormCode": "App.Intranet.SocialLike",
"ListFormCode": "App.Hr.Intranet.SocialLike",
"KeyFieldName": "Id",
"GeneratedAt": "2026-09-04T00:00:00Z",
"Order": 20,

View file

@ -1,5 +1,5 @@
{
"ListFormCode": "App.Intranet.SocialMedia",
"ListFormCode": "App.Hr.Intranet.SocialMedia",
"KeyFieldName": "Id",
"GeneratedAt": "2026-09-04T00:00:00Z",
"Order": 20,

View file

@ -1,5 +1,5 @@
{
"ListFormCode": "App.Intranet.SocialPollOption",
"ListFormCode": "App.Hr.Intranet.SocialPollOption",
"KeyFieldName": "Id",
"GeneratedAt": "2026-09-04T00:00:00Z",
"Order": 30,

View file

@ -1,5 +1,5 @@
{
"ListFormCode": "App.Intranet.SocialPost",
"ListFormCode": "App.Hr.Intranet.SocialPost",
"KeyFieldName": "Id",
"GeneratedAt": "2026-09-04T00:00:00Z",
"Order": 10,

View file

@ -1,5 +1,5 @@
{
"ListFormCode": "App.Intranet.Survey",
"ListFormCode": "App.Hr.Intranet.Survey",
"KeyFieldName": "Id",
"GeneratedAt": "2026-09-04T00:00:00Z",
"Order": 10,

View file

@ -1,5 +1,5 @@
{
"ListFormCode": "App.Intranet.SurveyQuestion",
"ListFormCode": "App.Hr.Intranet.SurveyQuestion",
"KeyFieldName": "Id",
"GeneratedAt": "2026-09-04T00:00:00Z",
"Order": 20,

View file

@ -1,5 +1,5 @@
{
"ListFormCode": "App.Intranet.SurveyQuestionOption",
"ListFormCode": "App.Hr.Intranet.SurveyQuestionOption",
"KeyFieldName": "Id",
"GeneratedAt": "2026-09-04T00:00:00Z",
"Order": 30,

File diff suppressed because it is too large Load diff

View file

@ -259,6 +259,21 @@
"ElementId": null,
"ModuleId": "Sas"
},
{
"Id": "f1effbfd-7fec-5056-845c-6223010eb2d6",
"Code": "App.Definitions.TerminationReason",
"DisplayName": "App.Definitions.TerminationReason",
"Order": 9,
"Url": "/admin/list/App.Definitions.TerminationReason",
"Icon": "FcExport",
"ParentCode": "App.Saas.Definitions",
"RequiredPermissionName": "App.Definitions.TerminationReason",
"CssClass": null,
"Target": null,
"IsDisabled": false,
"ElementId": null,
"ModuleId": "Sas"
},
{
"Id": "b7c6c711-5b7d-413d-8ae8-530b18a22c2a",
"Code": "App.Public",
@ -1039,131 +1054,11 @@
"ElementId": null,
"ModuleId": "Adm"
},
{
"Id": "aaef98c6-ab15-4097-9d32-d611db7de57d",
"Code": "App.Administration.Intranet",
"DisplayName": "App.Intranet",
"Order": 7,
"Url": null,
"Icon": "FcConferenceCall",
"ParentCode": "App.Administration",
"RequiredPermissionName": null,
"CssClass": null,
"Target": null,
"IsDisabled": false,
"ElementId": null,
"ModuleId": "Adm"
},
{
"Id": "5cef6234-ae2d-4963-b7aa-84f58c5d1e8a",
"Code": "App.Intranet.Announcement",
"DisplayName": "App.Intranet.Announcement",
"Order": 1,
"Url": "/admin/list/App.Intranet.Announcement",
"Icon": "FcAdvertising",
"ParentCode": "App.Administration.Intranet",
"RequiredPermissionName": "App.Intranet.Announcement",
"CssClass": null,
"Target": null,
"IsDisabled": false,
"ElementId": null,
"ModuleId": "Adm"
},
{
"Id": "8eea0d26-4da7-4def-8228-bd340b518b29",
"Code": "App.Intranet.Survey",
"DisplayName": "App.Intranet.Survey",
"Order": 2,
"Url": "/admin/list/App.Intranet.Survey",
"Icon": "FcTodoList",
"ParentCode": "App.Administration.Intranet",
"RequiredPermissionName": "App.Intranet.Survey",
"CssClass": null,
"Target": null,
"IsDisabled": false,
"ElementId": null,
"ModuleId": "Adm"
},
{
"Id": "216da72b-e243-4f07-afaa-04a7b79dc977",
"Code": "App.Intranet.SocialPost",
"DisplayName": "App.Intranet.SocialPost",
"Order": 3,
"Url": "/admin/list/App.Intranet.SocialPost",
"Icon": "FcComments",
"ParentCode": "App.Administration.Intranet",
"RequiredPermissionName": "App.Intranet.SocialPost",
"CssClass": null,
"Target": null,
"IsDisabled": false,
"ElementId": null,
"ModuleId": "Adm"
},
{
"Id": "01246207-7a2e-43cc-82b1-3a475b242926",
"Code": "App.Intranet.Events.EventType",
"DisplayName": "App.Intranet.Events.EventType",
"Order": 4,
"Url": "/admin/list/App.Intranet.Events.EventType",
"Icon": "FcPlanner",
"ParentCode": "App.Administration.Intranet",
"RequiredPermissionName": "App.Intranet.Events.EventType",
"CssClass": null,
"Target": null,
"IsDisabled": false,
"ElementId": null,
"ModuleId": "Adm"
},
{
"Id": "319118e2-1a91-44e2-8f4d-45b7327d4975",
"Code": "App.Intranet.Events.EventCategory",
"DisplayName": "App.Intranet.Events.EventCategory",
"Order": 5,
"Url": "/admin/list/App.Intranet.Events.EventCategory",
"Icon": "FcTreeStructure",
"ParentCode": "App.Administration.Intranet",
"RequiredPermissionName": "App.Intranet.Events.EventCategory",
"CssClass": null,
"Target": null,
"IsDisabled": false,
"ElementId": null,
"ModuleId": "Adm"
},
{
"Id": "7efe2b4b-407d-4bb8-9350-fa89b759111b",
"Code": "App.Intranet.Events.Event",
"DisplayName": "App.Intranet.Events.Event",
"Order": 6,
"Url": "/admin/list/App.Intranet.Events.Event",
"Icon": "FcCalendar",
"ParentCode": "App.Administration.Intranet",
"RequiredPermissionName": "App.Intranet.Events.Event",
"CssClass": null,
"Target": null,
"IsDisabled": false,
"ElementId": null,
"ModuleId": "Adm"
},
{
"Id": "9ef2a858-1465-407c-9636-c8802a5119d4",
"Code": "App.Intranet.Document",
"DisplayName": "App.Intranet.Document",
"Order": 7,
"Url": "/admin/intranet-documents",
"Icon": "FcOpenedFolder",
"ParentCode": "App.Administration.Intranet",
"RequiredPermissionName": "App.Intranet.Document",
"CssClass": null,
"Target": null,
"IsDisabled": false,
"ElementId": null,
"ModuleId": "Adm"
},
{
"Id": "e599782a-f3bd-4f9e-9750-d23c55460876",
"Code": "App.Administration.Restrictions",
"DisplayName": "App.Platform.Restrictions",
"Order": 8,
"Order": 7,
"Url": null,
"Icon": "FaLock",
"ParentCode": "App.Administration",
@ -1208,7 +1103,7 @@
"Id": "92c4e9c7-7272-4cf5-934f-9b6c37172942",
"Code": "Abp.Identity",
"DisplayName": "Abp.Identity",
"Order": 9,
"Order": 8,
"Url": null,
"Icon": "FcConferenceCall",
"ParentCode": "App.Administration",
@ -1343,7 +1238,7 @@
"Id": "d4e11975-a4d9-4444-b742-e7eb651386fb",
"Code": "App.Reports.Management",
"DisplayName": "App.Reports.Management",
"Order": 10,
"Order": 9,
"Url": null,
"Icon": "FcDocument",
"ParentCode": "App.Administration",
@ -1388,7 +1283,7 @@
"Id": "2df27f03-9f1e-455c-9c0d-05ffccfe9312",
"Code": "App.Videoroom",
"DisplayName": "App.Videoroom",
"Order": 11,
"Order": 10,
"Url": "/admin/videoroom/dashboard",
"Icon": "FcVideoCall",
"ParentCode": "App.Administration",
@ -1403,7 +1298,7 @@
"Id": "5e5180bf-5b4d-4f3d-9a42-795942600bbf",
"Code": "App.Forum",
"DisplayName": "App.Forum",
"Order": 12,
"Order": 11,
"Url": "/admin/forum",
"Icon": "FcLink",
"ParentCode": "App.Administration",
@ -1818,6 +1713,126 @@
"IsDisabled": false,
"ElementId": null,
"ModuleId": "Hr"
},
{
"Id": "aaef98c6-ab15-4097-9d32-d611db7de57d",
"Code": "App.Hr.Intranet",
"DisplayName": "App.Hr.Intranet",
"Order": 9,
"Url": null,
"Icon": "FcConferenceCall",
"ParentCode": "App.Hr",
"RequiredPermissionName": null,
"CssClass": null,
"Target": null,
"IsDisabled": false,
"ElementId": null,
"ModuleId": "Hr"
},
{
"Id": "5cef6234-ae2d-4963-b7aa-84f58c5d1e8a",
"Code": "App.Hr.Intranet.Announcement",
"DisplayName": "App.Hr.Intranet.Announcement",
"Order": 1,
"Url": "/admin/list/App.Hr.Intranet.Announcement",
"Icon": "FcAdvertising",
"ParentCode": "App.Hr.Intranet",
"RequiredPermissionName": "App.Hr.Intranet.Announcement",
"CssClass": null,
"Target": null,
"IsDisabled": false,
"ElementId": null,
"ModuleId": "Hr"
},
{
"Id": "8eea0d26-4da7-4def-8228-bd340b518b29",
"Code": "App.Hr.Intranet.Survey",
"DisplayName": "App.Hr.Intranet.Survey",
"Order": 2,
"Url": "/admin/list/App.Hr.Intranet.Survey",
"Icon": "FcTodoList",
"ParentCode": "App.Hr.Intranet",
"RequiredPermissionName": "App.Hr.Intranet.Survey",
"CssClass": null,
"Target": null,
"IsDisabled": false,
"ElementId": null,
"ModuleId": "Hr"
},
{
"Id": "216da72b-e243-4f07-afaa-04a7b79dc977",
"Code": "App.Hr.Intranet.SocialPost",
"DisplayName": "App.Hr.Intranet.SocialPost",
"Order": 3,
"Url": "/admin/list/App.Hr.Intranet.SocialPost",
"Icon": "FcComments",
"ParentCode": "App.Hr.Intranet",
"RequiredPermissionName": "App.Hr.Intranet.SocialPost",
"CssClass": null,
"Target": null,
"IsDisabled": false,
"ElementId": null,
"ModuleId": "Hr"
},
{
"Id": "01246207-7a2e-43cc-82b1-3a475b242926",
"Code": "App.Hr.Intranet.Events.EventType",
"DisplayName": "App.Hr.Intranet.Events.EventType",
"Order": 4,
"Url": "/admin/list/App.Hr.Intranet.Events.EventType",
"Icon": "FcPlanner",
"ParentCode": "App.Hr.Intranet",
"RequiredPermissionName": "App.Hr.Intranet.Events.EventType",
"CssClass": null,
"Target": null,
"IsDisabled": false,
"ElementId": null,
"ModuleId": "Hr"
},
{
"Id": "319118e2-1a91-44e2-8f4d-45b7327d4975",
"Code": "App.Hr.Intranet.Events.EventCategory",
"DisplayName": "App.Hr.Intranet.Events.EventCategory",
"Order": 5,
"Url": "/admin/list/App.Hr.Intranet.Events.EventCategory",
"Icon": "FcTreeStructure",
"ParentCode": "App.Hr.Intranet",
"RequiredPermissionName": "App.Hr.Intranet.Events.EventCategory",
"CssClass": null,
"Target": null,
"IsDisabled": false,
"ElementId": null,
"ModuleId": "Hr"
},
{
"Id": "7efe2b4b-407d-4bb8-9350-fa89b759111b",
"Code": "App.Hr.Intranet.Events.Event",
"DisplayName": "App.Hr.Intranet.Events.Event",
"Order": 6,
"Url": "/admin/list/App.Hr.Intranet.Events.Event",
"Icon": "FcCalendar",
"ParentCode": "App.Hr.Intranet",
"RequiredPermissionName": "App.Hr.Intranet.Events.Event",
"CssClass": null,
"Target": null,
"IsDisabled": false,
"ElementId": null,
"ModuleId": "Hr"
},
{
"Id": "9ef2a858-1465-407c-9636-c8802a5119d4",
"Code": "App.Hr.Intranet.Document",
"DisplayName": "App.Hr.Intranet.Document",
"Order": 7,
"Url": "/admin/intranet-documents",
"Icon": "FcOpenedFolder",
"ParentCode": "App.Hr.Intranet",
"RequiredPermissionName": "App.Hr.Intranet.Document",
"CssClass": null,
"Target": null,
"IsDisabled": false,
"ElementId": null,
"ModuleId": "Hr"
}
]
}

View file

@ -733,7 +733,7 @@
"ComponentType": "normal",
"ComponentPath": "@/views/intranet/documents/IntranetDocuments",
"RouteType": "protected",
"Authority": "App.Intranet.Document",
"Authority": "App.Hr.Intranet.Document",
"SeoTitle": null,
"SeoDescription": null,
"SeoKeywords": null,

View file

@ -34,6 +34,16 @@
"IsFixed": false,
"IsCustomized": false
},
{
"Id": "940fb243-3d79-59cd-8cda-26c59a143306",
"NotificationTypeId": "8eaa322e-76bb-592a-8200-666442c03e23",
"RecipientType": "Role",
"RecipientId": "admin",
"Channel": "UiActivity",
"IsActive": true,
"IsFixed": false,
"IsCustomized": false
},
{
"Id": "7d2e5a90-1c84-5b37-9e62-8a4f0d3b6c22",
"NotificationTypeId": "3f6c8b41-9d27-5a63-8f1e-4b0a9c6d2e11",

View file

@ -19,6 +19,11 @@
"Name": "YeniKullanici",
"Description": "Sisteme yeni bir kullanıcı eklendiğinde tetiklenir. Yönetici ekibin yetki ve rol atamasını yapması için haberdar olmasını sağlar."
},
{
"Id": "8eaa322e-76bb-592a-8200-666442c03e23",
"Name": "DenemeSuresiBitiyor",
"Description": "Bir çalışanın deneme süresinin bitmesine 15 gün kaldığında tetiklenir. İK ve yöneticinin sözleşmeyi sürdürme ya da deneme süresi içinde fesih kararını zamanında vermesi içindir; mesajda çalışanın adı ve bitiş tarihi geçer. Tetikleyici her gün çalışan Probation Reminder Worker işidir (kullanıcının ProbationEndDate alanı)."
},
{
"Id": "3f6c8b41-9d27-5a63-8f1e-4b0a9c6d2e11",
"Name": "Manuel",

View file

@ -21,7 +21,7 @@ const intranetDashboardNavItem: NavigationTree = {
key: ROUTES_ENUM.protected.dashboard,
path: ROUTES_ENUM.protected.dashboard,
title: 'Intranet',
translateKey: 'App.Intranet',
translateKey: 'App.Hr.Intranet',
icon: 'FaHome',
type: 'item',
authority: [],

View file

@ -170,7 +170,6 @@ export interface UserInfoViewModel extends ExtensibleObject {
marriageDate?: Date | string
homeAddress?: string
educationLevel?: string
graduationSchool?: string
bloodType?: string
motherHealthStatus?: string
motherHealthNote?: string
@ -248,6 +247,32 @@ export interface UserInfoViewModel extends ExtensibleObject {
shiftWorkFit?: boolean
nightWorkFit?: boolean
shiftNightDoctorId?: string
secondaryEmail?: string
secondaryPhoneNumber?: string
militaryStatus?: string
militaryPostponeEndDate?: Date | string
isDisabled: boolean
disabilityRate?: number
disabilityReport?: string
disabilityReportFileName?: string
passportNo?: string
passportExpiryDate?: Date | string
workPermitNo?: string
workPermitEndDate?: Date | string
registrationNo?: string
employmentType?: string
contractType?: string
contractEndDate?: Date | string
probationEndDate?: Date | string
seniorityStartDate?: Date | string
terminationReasonId?: string
terminationNote?: string
shiftId?: string
pdksCardNo?: string
drivingLicenseClass?: string
drivingLicenseNo?: string
drivingLicenseIssueDate?: Date | string
drivingLicenseExpiryDate?: Date | string
}
export interface AssignedRoleViewModel {
@ -292,3 +317,13 @@ export interface UserClaimModel {
claimType: string
claimValue: string
}
/** Banka ve ücret bilgisi; `UserInfoViewModel` içinde taşınmaz, ayrı yetkiyle okunur. */
export interface UserFinancialDto {
id: string
bankName?: string
iban?: string
salaryType?: string
grossSalary?: number
salaryCurrency?: string
}

View file

@ -5,6 +5,7 @@ import {
PermissionDefinitionRecord,
UpdatePermissionsDto,
UserClaimModel,
UserFinancialDto,
UserInfoViewModel,
} from '@/proxy/admin/models'
import { ListResultDto, PagedAndSortedResultRequestDto, PagedResultDto } from '../proxy'
@ -63,6 +64,19 @@ export const putUserDetail = (input: UserInfoViewModel) =>
data: input,
})
export const getUserFinancial = (userId: string) =>
apiService.fetchData<UserFinancialDto>({
method: 'GET',
url: `/api/app/platform-identity/${userId}/financial`,
})
export const putUserFinancial = (input: UserFinancialDto) =>
apiService.fetchData({
method: 'PUT',
url: `/api/app/platform-identity/financial`,
data: input,
})
export const putUserAvatar = (input: UserAvatarUpdateInput) => {
const formData = new FormData()
formData.append('userId', input.userId)

View file

@ -27,7 +27,6 @@ import {
FaPhone,
FaPlus,
FaHome,
FaUniversity,
} from 'react-icons/fa'
import * as Yup from 'yup'
import { ProfileDto, UpdateProfileDto } from '@/proxy/account/models'
@ -352,14 +351,6 @@ const General = () => {
)}
/>
</FormItem>
<FormItem label={translate('::Abp.Account.GraduationSchool')}>
<Input
disabled
type="text"
prefix={<FaUniversity className="text-xl" />}
value={getProfileExtraValue('GraduationSchool')}
></Input>
</FormItem>
<FormItem label={translate('::Abp.Account.BloodType')}>
<Select<SelectBoxOption>
isDisabled

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,110 @@
import { Button, FormContainer, Notification, Tabs, toast } from '@/components/ui'
import TabContent from '@/components/ui/Tabs/TabContent'
import TabList from '@/components/ui/Tabs/TabList'
import TabNav from '@/components/ui/Tabs/TabNav'
import PlatformViewHost from '@/components/componentEditor/PlatformViewHost'
import { UserInfoViewModel } from '@/proxy/admin/models'
import { putUserDetail } from '@/services/identity.service'
import { useLocalization } from '@/utils/hooks/useLocalization'
import { Form, Formik } from 'formik'
import { useMemo } from 'react'
import { SelectField } from './userFormFields'
/** Kullanıcıya göre süzülen alt listeler; sekme adı = ListForm kodunun son parçası. */
const educationLists = ['UserEducation', 'UserLanguage', 'UserSkill', 'UserCertificate']
/** Değerler eğitim geçmişi listesiyle aynıdır; en yüksek düzey bordro ve raporlar için ayrıca tutulur. */
const educationLevels = [
['İlkokul', 'Primary'],
['Ortaokul', 'MiddleSchool'],
['Lise', 'HighSchool'],
['Ön Lisans', 'Associate'],
['Lisans', 'Bachelor'],
['Yüksek Lisans', 'Master'],
['Doktora', 'PhD'],
] as const
interface EducationSkillsTabProps {
userDetails: UserInfoViewModel
onSaved: () => void
}
function EducationSkillsTab({ userDetails, onSaved }: EducationSkillsTabProps) {
const { translate } = useLocalization()
// Yeni satırın UserId değeri de bu filtreden dolar (applyNewRowDefaults).
const userSearchParams = useMemo(
() => new URLSearchParams({ filter: JSON.stringify(['UserId', '=', userDetails.id]) }),
[userDetails.id],
)
return (
<>
<Formik
enableReinitialize
initialValues={userDetails}
onSubmit={async (values, { setSubmitting }) => {
setSubmitting(true)
await putUserDetail({ ...values })
toast.push(
<Notification type="success" duration={2000}>
{translate('::App.Platform.Save')}
</Notification>,
{ placement: 'bottom-end' },
)
onSaved()
setSubmitting(false)
}}
>
{({ isSubmitting }) => (
<Form>
<FormContainer size="md">
<div className="flex flex-col md:flex-row md:items-end gap-4">
<div className="md:w-72">
<SelectField
name="educationLevel"
label={translate('::Abp.Account.EducationLevel')}
options={educationLevels.map(([value, key]) => ({
value,
label: translate(`::App.EducationLevel.${key}`),
}))}
/>
</div>
<div className="mb-7">
<Button variant="solid" loading={isSubmitting} type="submit">
{isSubmitting
? translate('::App.Platform.Saving')
: translate('::App.Platform.Save')}
</Button>
</div>
</div>
</FormContainer>
</Form>
)}
</Formik>
<Tabs defaultValue={educationLists[0]}>
<TabList>
{educationLists.map((code) => (
<TabNav key={code} value={code}>
{translate(`::App.IdentityManagement.${code}`)}
</TabNav>
))}
</TabList>
{educationLists.map((code) => (
<TabContent key={code} value={code}>
<div className="pt-4">
<PlatformViewHost
view="List"
listFormCode={`App.IdentityManagement.${code}`}
height="320px"
searchParams={userSearchParams}
/>
</div>
</TabContent>
))}
</Tabs>
</>
)
}
export default EducationSkillsTab

View file

@ -0,0 +1,33 @@
import PlatformViewHost from '@/components/componentEditor/PlatformViewHost'
import { useLocalization } from '@/utils/hooks/useLocalization'
import { useMemo } from 'react'
/** Aile ve acil durum kişileri yalnızca alt listedir; kullanıcı kaydında alan taşımaz. */
const familyLists = ['UserFamilyMember', 'UserEmergencyContact']
function FamilyEmergencyTab({ userId }: { userId: string }) {
const { translate } = useLocalization()
// Yeni satırın UserId değeri de bu filtreden dolar (applyNewRowDefaults).
const userSearchParams = useMemo(
() => new URLSearchParams({ filter: JSON.stringify(['UserId', '=', userId]) }),
[userId],
)
return (
<div className="flex flex-col gap-6">
{familyLists.map((code) => (
<div key={code}>
<h6 className="mb-2">{translate(`::App.IdentityManagement.${code}`)}</h6>
<PlatformViewHost
view="List"
listFormCode={`App.IdentityManagement.${code}`}
height="320px"
searchParams={userSearchParams}
/>
</div>
))}
</div>
)
}
export default FamilyEmergencyTab

View file

@ -0,0 +1,124 @@
import { Button, FormContainer, Notification, toast } from '@/components/ui'
import PlatformViewHost from '@/components/componentEditor/PlatformViewHost'
import { UserFinancialDto } from '@/proxy/admin/models'
import { getUserFinancial, putUserFinancial } from '@/services/identity.service'
import { useLocalization } from '@/utils/hooks/useLocalization'
import { Form, Formik } from 'formik'
import { useCallback, useEffect, useMemo, useState } from 'react'
import { FaMoneyBillWave, FaUniversity } from 'react-icons/fa'
import { Section, SelectField, TextField } from './userFormFields'
import { useUserFieldLookup } from './useUserFieldLookup'
const salaryTypes = ['Monthly', 'Daily', 'Hourly']
// Ülke kodu + kontrol hanesi + 11-30 karakter (ISO 13616); TR IBAN'ı 26 karakterdir.
const IBAN_PATTERN = /^[A-Z]{2}\d{2}[A-Z0-9]{11,30}$/
function FinancialTab({ userId }: { userId: string }) {
const { translate } = useLocalization()
const [financial, setFinancial] = useState<UserFinancialDto>()
const currencyOptions = useUserFieldLookup('SalaryCurrency')
const userSearchParams = useMemo(
() => new URLSearchParams({ filter: JSON.stringify(['UserId', '=', userId]) }),
[userId],
)
const load = useCallback(async () => {
const { data } = await getUserFinancial(userId)
setFinancial(data)
}, [userId])
useEffect(() => {
setFinancial(undefined)
load()
}, [load])
if (!financial) {
return null
}
return (
<>
<Formik
enableReinitialize
initialValues={financial}
validate={(values) => {
const iban = values.iban?.replace(/\s/g, '').toUpperCase()
return iban && !IBAN_PATTERN.test(iban)
? { iban: translate('::Abp.Identity.User.Financial.InvalidIban') }
: {}
}}
onSubmit={async (values, { setSubmitting }) => {
setSubmitting(true)
await putUserFinancial({ ...values })
toast.push(
<Notification type="success" duration={2000}>
{translate('::App.Platform.Save')}
</Notification>,
{ placement: 'bottom-end' },
)
await load()
setSubmitting(false)
}}
>
{({ isSubmitting, errors }) => (
<Form>
<FormContainer size="md">
<div className="grid grid-cols-1 lg:grid-cols-2 gap-5">
<Section title={translate('::Abp.Identity.User.Financial.Bank')}>
<TextField
name="bankName"
label={translate('::App.Listform.ListformField.BankName')}
icon={<FaUniversity className="text-xl" />}
/>
<TextField name="iban" label={translate('::App.Listform.ListformField.Iban')} />
{errors.iban && <div className="text-red-500 text-sm -mt-5 mb-4">{errors.iban}</div>}
</Section>
<Section title={translate('::Abp.Identity.User.Financial.Salary')}>
<div className="grid grid-cols-1 md:grid-cols-3 gap-x-4">
<SelectField
name="salaryType"
label={translate('::Abp.Identity.User.UserInformation.SalaryType')}
options={salaryTypes.map((value) => ({
value,
label: translate(`::App.StaticLookup.${value}`),
}))}
/>
<TextField
type="number"
name="grossSalary"
label={translate('::Abp.Identity.User.UserInformation.GrossSalary')}
icon={<FaMoneyBillWave className="text-xl" />}
/>
<SelectField
name="salaryCurrency"
label={translate('::App.Listform.ListformField.Currency')}
options={currencyOptions}
/>
</div>
</Section>
</div>
</FormContainer>
<div className="mt-4 ltr:text-right">
<Button variant="solid" loading={isSubmitting} type="submit">
{isSubmitting ? translate('::App.Platform.Saving') : translate('::App.Platform.Save')}
</Button>
</div>
</Form>
)}
</Formik>
<div className="mt-6">
<h6 className="mb-2">{translate('::App.IdentityManagement.UserBenefit')}</h6>
<PlatformViewHost
view="List"
listFormCode="App.IdentityManagement.UserBenefit"
height="320px"
searchParams={userSearchParams}
/>
</div>
</>
)
}
export default FinancialTab

View file

@ -0,0 +1,39 @@
import { dynamicFetch } from '@/services/form.service'
import { SelectBoxOption } from '@/types/shared'
import { useEffect, useState } from 'react'
/**
* Seçenekleri kullanıcı ekranının (AbpIdentity.Users) alan lookup'ından okur. Sorgu ve kiracı
* süzmesi ListForm alanında tanımlıdır; ekran ikinci bir sorgu kopyası taşımaz.
*/
export const useUserFieldLookup = (fieldName: string) => {
const [options, setOptions] = useState<SelectBoxOption[]>([])
useEffect(() => {
let active = true
const load = async () => {
try {
const response = await dynamicFetch('list-form-select/lookup', 'POST', null, {
listFormCode: 'AbpIdentity.Users',
listFormFieldName: fieldName,
})
const rows = Array.isArray(response?.data) ? response.data : []
if (active) {
setOptions(
rows.map((row: Record<string, string>) => ({ value: row.Key, label: row.Name })),
)
}
} catch {
if (active) {
setOptions([])
}
}
}
load()
return () => {
active = false
}
}, [fieldName])
return options
}

View file

@ -0,0 +1,85 @@
import { Checkbox, DatePicker, FormItem, Input, Select } from '@/components/ui'
import { SelectBoxOption } from '@/types/shared'
import dayjs from 'dayjs'
import { Field, FieldProps } from 'formik'
import { ReactNode } from 'react'
/** Kullanıcı detayındaki bir bilgi grubu; sekme içinde başlıklı çerçeve olarak çizilir. */
export const Section = ({ title, children }: { title: string; children: ReactNode }) => (
<div className="border rounded-lg p-4">
<h6 className="mb-4">{title}</h6>
{children}
</div>
)
interface FieldBaseProps {
name: string
label: string
icon?: ReactNode
disabled?: boolean
}
export const TextField = ({ name, label, icon, disabled, type = 'text' }: FieldBaseProps & { type?: string }) => (
<FormItem label={label}>
<Field type={type} name={name} placeholder={label} component={Input} prefix={icon} disabled={disabled} />
</FormItem>
)
export const DateField = ({ name, label, icon, disabled, error }: FieldBaseProps & { error?: string }) => (
<FormItem label={label} invalid={!!error} errorMessage={error}>
<Field name={name}>
{({ field, form }: FieldProps) => (
<DatePicker
field={field}
form={form}
value={field.value ? dayjs(field.value).toDate() : null}
placeholder={label}
inputPrefix={icon}
disabled={disabled}
onChange={(date) =>
form.setFieldValue(field.name, date ? dayjs(date).format('YYYY-MM-DDTHH:mm:ss') : null)
}
/>
)}
</Field>
</FormItem>
)
export const CheckboxField = ({ name, label }: FieldBaseProps) => (
<FormItem layout="horizontal" labelClass="!justify-start" labelWidth="50%" label={label}>
<Field name={name} component={Checkbox} />
</FormItem>
)
interface SelectFieldProps extends FieldBaseProps {
options: SelectBoxOption[]
/** Çok değerli alanlar tek metin kolonunda `|` ile saklanır (platform sözleşmesi). */
isMulti?: boolean
}
export const SelectField = ({ name, label, options, isMulti, disabled }: SelectFieldProps) => (
<FormItem label={label}>
<Field name={name}>
{({ field, form }: FieldProps<string | null>) => {
const selected = isMulti ? (field.value ?? '').split('|').filter(Boolean) : [field.value]
return (
<Select
isClearable
field={field}
form={form}
options={options}
isMulti={isMulti}
isDisabled={disabled}
value={options.filter((o) => selected.includes(o.value ?? ''))}
onChange={(option) => {
const value = isMulti
? ((option as SelectBoxOption[] | null) ?? []).map((o) => o.value).join('|') || null
: ((option as SelectBoxOption | null)?.value ?? null)
form.setFieldValue(field.name, value)
}}
/>
)
}}
</Field>
</FormItem>
)

View file

@ -34,9 +34,9 @@ import {
const TOAST_PLACEMENT = { placement: 'bottom-end' } as const
const PERMISSION = {
UPLOAD: 'App.Intranet.Document.Create',
UPDATE: 'App.Intranet.Document.Update',
DELETE: 'App.Intranet.Document.Delete',
UPLOAD: 'App.Hr.Intranet.Document.Create',
UPDATE: 'App.Hr.Intranet.Document.Update',
DELETE: 'App.Hr.Intranet.Document.Delete',
} as const
type ViewMode = 'kanban' | 'list'
@ -91,7 +91,7 @@ const IntranetDocuments = () => {
setSelectedIds([])
} catch (error) {
console.error('Failed to load intranet documents:', error)
notify('danger', translate('::App.Intranet.Document.LoadFailed'))
notify('danger', translate('::App.Hr.Intranet.Document.LoadFailed'))
setDocuments([])
} finally {
setLoading(false)
@ -124,7 +124,7 @@ const IntranetDocuments = () => {
} else {
grouped.set(key, {
key,
label: key ? key.toUpperCase() : translate('::App.Intranet.Document.Unknown'),
label: key ? key.toUpperCase() : translate('::App.Hr.Intranet.Document.Unknown'),
items: [item],
})
}
@ -177,7 +177,7 @@ const IntranetDocuments = () => {
const uploadPendingFiles = async () => {
if (pendingUploads.some((item) => !item.name.trim())) {
notify('warning', translate('::App.Intranet.Document.DisplayNameHint'))
notify('warning', translate('::App.Hr.Intranet.Document.DisplayNameHint'))
return
}
@ -195,7 +195,7 @@ const IntranetDocuments = () => {
setUploadOpen(false)
setPendingUploads([])
await load()
notify('success', translate('::App.Intranet.Document.Uploaded'))
notify('success', translate('::App.Hr.Intranet.Document.Uploaded'))
} catch (error) {
console.error('Intranet document upload failed:', error)
notify('danger', translate('::App.Platform.Error'))
@ -215,7 +215,7 @@ const IntranetDocuments = () => {
tenantId,
)
await load()
notify('success', translate('::App.Intranet.Document.StatusChanged'))
notify('success', translate('::App.Hr.Intranet.Document.StatusChanged'))
} catch (error) {
console.error('Failed to change publication state:', error)
notify('danger', translate('::App.Platform.Error'))
@ -230,7 +230,7 @@ const IntranetDocuments = () => {
await fileManagementService.bulkDeleteItems(selectedIds, tenantId)
setDeleteOpen(false)
await load()
notify('success', translate('::App.Intranet.Document.Deleted'))
notify('success', translate('::App.Hr.Intranet.Document.Deleted'))
} catch (error) {
console.error('Failed to delete intranet documents:', error)
notify('danger', translate('::App.Platform.Error'))
@ -259,7 +259,7 @@ const IntranetDocuments = () => {
: 'bg-gray-100 text-gray-600 dark:bg-gray-700 dark:text-gray-300'
}
>
{translate(isActive ? '::App.Intranet.Document.Active' : '::App.Intranet.Document.Passive')}
{translate(isActive ? '::App.Hr.Intranet.Document.Active' : '::App.Hr.Intranet.Document.Passive')}
</Tag>
)
@ -272,8 +272,8 @@ const IntranetDocuments = () => {
size="xs"
title={translate(
document.isActive
? '::App.Intranet.Document.Unpublish'
: '::App.Intranet.Document.Publish',
? '::App.Hr.Intranet.Document.Unpublish'
: '::App.Hr.Intranet.Document.Publish',
)}
variant="plain"
onClick={() => changePublication([document], !document.isActive)}
@ -318,7 +318,7 @@ const IntranetDocuments = () => {
const renderKanban = () =>
columns.length === 0 ? (
<div className="py-20 text-center text-sm text-gray-500 dark:text-gray-400">
{translate('::App.Intranet.Document.Empty')}
{translate('::App.Hr.Intranet.Document.Empty')}
</div>
) : (
<div className="grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4">
@ -347,7 +347,7 @@ const IntranetDocuments = () => {
<th className="px-3 py-2">{translate('::App.Listform.ListformField.Name')}</th>
<th className="px-3 py-2">{translate('::App.Listform.ListformField.Type')}</th>
<th className="px-3 py-2">{translate('::App.Listform.ListformField.Size')}</th>
<th className="px-3 py-2">{translate('::App.Intranet.Document.Active')}</th>
<th className="px-3 py-2">{translate('::App.Hr.Intranet.Document.Active')}</th>
<th className="px-3 py-2" />
</tr>
</thead>
@ -381,7 +381,7 @@ const IntranetDocuments = () => {
{visibleDocuments.length === 0 && (
<tr>
<td className="px-3 py-8 text-center text-gray-400" colSpan={6}>
{translate('::App.Intranet.Document.Empty')}
{translate('::App.Hr.Intranet.Document.Empty')}
</td>
</tr>
)}
@ -392,7 +392,7 @@ const IntranetDocuments = () => {
return (
<Container className="px-1">
<PageTitle title={translate('::App.Intranet.Document')} />
<PageTitle title={translate('::App.Hr.Intranet.Document')} />
<div className="mb-4 mt-2 flex flex-col gap-3 rounded-lg border border-gray-200 p-3 dark:border-gray-700 lg:flex-row lg:items-center lg:justify-between">
<div className="flex flex-wrap items-center gap-2">
@ -415,7 +415,7 @@ const IntranetDocuments = () => {
size="sm"
onClick={() => changePublication(publishable, true)}
>
{translate('::App.Intranet.Document.Publish')}
{translate('::App.Hr.Intranet.Document.Publish')}
</Button>
<Button
disabled={busy || unpublishable.length === 0}
@ -423,7 +423,7 @@ const IntranetDocuments = () => {
size="sm"
onClick={() => changePublication(unpublishable, false)}
>
{translate('::App.Intranet.Document.Unpublish')}
{translate('::App.Hr.Intranet.Document.Unpublish')}
</Button>
</>
)}
@ -444,7 +444,7 @@ const IntranetDocuments = () => {
<div className="flex flex-wrap items-center gap-3">
<Checkbox checked={showUnpublished} onChange={setShowUnpublished}>
{translate('::App.Intranet.Document.ShowUnpublished')}
{translate('::App.Hr.Intranet.Document.ShowUnpublished')}
</Checkbox>
<Input
className="w-full sm:w-56"
@ -458,14 +458,14 @@ const IntranetDocuments = () => {
<Button
icon={<FaTh />}
size="sm"
title={translate('::App.Intranet.Document.KanbanView')}
title={translate('::App.Hr.Intranet.Document.KanbanView')}
variant={viewMode === 'kanban' ? 'solid' : 'default'}
onClick={() => setViewMode('kanban')}
/>
<Button
icon={<FaList />}
size="sm"
title={translate('::App.Intranet.Document.ListView')}
title={translate('::App.Hr.Intranet.Document.ListView')}
variant={viewMode === 'list' ? 'solid' : 'default'}
onClick={() => setViewMode('list')}
/>
@ -502,7 +502,7 @@ const IntranetDocuments = () => {
<Dialog isOpen={uploadOpen} onClose={closeUpload} onRequestClose={closeUpload}>
<h5 className="mb-1">{translate('::App.Platform.Upload')}</h5>
<p className="mb-4 text-xs text-gray-500 dark:text-gray-400">
{translate('::App.Intranet.Document.DisplayNameHint')}
{translate('::App.Hr.Intranet.Document.DisplayNameHint')}
</p>
<div className="max-h-80 space-y-3 overflow-y-auto pr-1">
{pendingUploads.map((item, index) => (
@ -517,7 +517,7 @@ const IntranetDocuments = () => {
{item.file.name} · {formatFileSize(item.file.size)}
</div>
<Input
placeholder={translate('::App.Intranet.Document.DisplayName')}
placeholder={translate('::App.Hr.Intranet.Document.DisplayName')}
size="sm"
suffix={<span className="text-xs text-gray-400">{item.extension}</span>}
value={item.name}
@ -555,7 +555,7 @@ const IntranetDocuments = () => {
onRequestClose={() => !busy && setDeleteOpen(false)}
>
<h5 className="mb-4">{translate('::App.Platform.Delete')}</h5>
<p className="mb-2 text-sm">{translate('::App.Intranet.Document.DeleteConfirm')}</p>
<p className="mb-2 text-sm">{translate('::App.Hr.Intranet.Document.DeleteConfirm')}</p>
<ul className="mb-4 max-h-48 list-disc overflow-y-auto pl-5 text-sm text-gray-600 dark:text-gray-300">
{selectedDocuments.map((item) => (
<li key={item.id}>{item.name}</li>

View file

@ -17,7 +17,7 @@ const Documents: React.FC<{ documents: DocumentDto[] }> = ({ documents }) => {
<div className="flex items-center justify-between">
<h2 className="text-base font-semibold text-gray-900 dark:text-white flex items-center gap-2">
<FaFileAlt className="w-5 h-5" />
{translate('::App.Intranet.Document')}
{translate('::App.Hr.Intranet.Document')}
</h2>
</div>
</div>