Disiplin Dosyaları, Çalışma Takvimi

This commit is contained in:
Sedat ÖZTÜRK 2026-10-04 00:04:29 +03:00
parent b6797950b2
commit 130e23bc67
37 changed files with 19847 additions and 173 deletions

View file

@ -123,8 +123,14 @@ Ek kurallar:
implementasyon. AppService içinde `DbContext` doğrudan kullanılmaz. implementasyon. AppService içinde `DbContext` doğrudan kullanılmaz.
- **Dinamik SQL**: parametreli çalıştırılır; string birleştirme ile sorgu kurulmaz. - **Dinamik SQL**: parametreli çalıştırılır; string birleştirme ile sorgu kurulmaz.
- **Mapping**: Mapperly (`[Mapper]` partial class) kullanılır; AutoMapper eklenmez. - **Mapping**: Mapperly (`[Mapper]` partial class) kullanılır; AutoMapper eklenmez.
Mapper'lar servis klasöründeki `{Alan}Mappers.cs` dosyasındadır (modülde
`{Modül}ApplicationMappers.cs`), ABP'nin `MapperBase<TSource, TDest>` /
`TwoWayMapperBase`'inden türer ve `RequiredMappingStrategy.Target` ile işaretlenir.
RMG012 uyarısı "hedefte karşılığı olmayan alan" demektir; yeni mapper eklerken bu RMG012 uyarısı "hedefte karşılığı olmayan alan" demektir; yeni mapper eklerken bu
uyarı bırakılmaz. uyarı bırakılmaz: kaynakta karşılığı olmayan, servisin sonradan doldurduğu hedef alan
(`User`, `IsLiked`, `*Dto` alt nesneleri, audit alanları) her `Map` overload'unda
`[MapperIgnoreTarget(nameof(...))]` ile açıkça yazılır; iç içe koleksiyon için ayrı
`private partial` eşleme metodu tanımlanır.
- **Localization**: kullanıcıya görünen metin koda gömülmez, `PlatformResource` - **Localization**: kullanıcıya görünen metin koda gömülmez, `PlatformResource`
anahtarı üzerinden verilir. anahtarı üzerinden verilir.
- **Çok değerli alan taşıyan girdi DTO'su**: ekranda `dxTagBox` (ya da çoklu seçimli - **Çok değerli alan taşıyan girdi DTO'su**: ekranda `dxTagBox` (ya da çoklu seçimli

View file

@ -1304,7 +1304,7 @@ ekranları ABP tablolarıdır, Licence/Dev Request host tablolarını okur.
| **Bildirimler › Bildirim Türleri / Kuralları** | `App.Notifications.NotificationTypes` · `.NotificationRules` | `Adm_T_NotificationType` · `Adm_T_NotificationRule` | Olay bazlı bildirim: tür + kanal + alıcı (`All`/`User`/`Role`/`OrganizationUnit`/`Custom`), `IsFixed` zorunlu kural. 8 kanal (`Sms`, `Mail`, `Rocket`, `Desktop`, `UiActivity`, `UiToast`, `WhatsApp`, `Telegram`); etiketleri `App.NotificationChannel.{Kanal}` dil anahtarlarıdır. Tür ve kural kiracıya aittir, yeni kiracıya varsayılan küme kopyalanır (`NotificationTenantDefaultsSeedContributor`). Kurallar ekranında `CreateNotification` diyaloğu da vardır. Ayrıntı: `lowcode` §9.11, `README.md` §13. | | **Bildirimler › Bildirim Türleri / Kuralları** | `App.Notifications.NotificationTypes` · `.NotificationRules` | `Adm_T_NotificationType` · `Adm_T_NotificationRule` | Olay bazlı bildirim: tür + kanal + alıcı (`All`/`User`/`Role`/`OrganizationUnit`/`Custom`), `IsFixed` zorunlu kural. 8 kanal (`Sms`, `Mail`, `Rocket`, `Desktop`, `UiActivity`, `UiToast`, `WhatsApp`, `Telegram`); etiketleri `App.NotificationChannel.{Kanal}` dil anahtarlarıdır. Tür ve kural kiracıya aittir, yeni kiracıya varsayılan küme kopyalanır (`NotificationTenantDefaultsSeedContributor`). Kurallar ekranında `CreateNotification` diyaloğu da vardır. Ayrıntı: `lowcode` §9.11, `README.md` §13. |
| **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. | | **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. | | **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. | | **Settings** | `App.Setting` · `/admin/settings` | — | `SettingDefinition` kayıtlarından üretilen ayar ekranı; değerler burada girilir. `List` seçeneklerinin etiketi dil anahtarıdır. |
| **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 › 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ı. | | **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 › 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`. |
@ -1315,7 +1315,7 @@ ekranları ABP tablolarıdır, Licence/Dev Request host tablolarını okur.
| **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 › 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 › 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 › 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 › Users › Benefits** | `App.IdentityManagement.UserBenefit` | `Adm_T_UserBenefit` | Yan haklar (`BenefitType` — İK › Definitions › Benefit Type'tan `Code` değeri, `LookupQueryValues.BenefitTypeValues`, `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 › 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 › 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). | | **Identity › Sessions** | `App.IdentityManagement.Sessions` | `AbpSessions` | Açık oturumlar; `UiEvalService.ApiKickUser` ile oturum düşürme (`lowcode` §9.13). |
@ -1352,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 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 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. (`App.Platform.Definitions` başlığı); Organizasyon Şeması doğrudan `App.Hr` altındadır.
Aşağıdaki tabloda `Wizard` notu taşıyan ekranlar wizard ile üretilmiştir: entity'leri yoktur, tablo
`sql/object/Hr_T_*.sql`, ekran `wizard/{Ad}.json` dosyasındadır (`ListFormSeeder_Hr.cs`'te yer almazlar).
Eğitimler (`App.Hr.Trainings`) ve Araçlar (`App.Hr.Vehicles`) `App.Hr` altında ara menüdür; ara yetki
aynı kodu taşır.
Intranet de bu moduldedir: menü `App.Hr.Intranet`, ekran/yetki kodları `App.Hr.Intranet.*` 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 (`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` `Hr_T_MessengerConversation*`, entity klasörü `Entities/Tenant/Hr/Intranet`. `Sas_T_IntranetWidget`
@ -1369,6 +1373,21 @@ listesinde `Hr` varsa görür (modül listesi boş kiracıda süzme yoktur — `
| **Definitions › Skill Type** | `App.Hr.SkillType` (alt formlar `App.Hr.SkillLevel`, `App.Hr.Skill`) | `Hr_T_SkillType` · `Hr_T_SkillLevel` · `Hr_T_Skill` | tenant | Yetkinlik tanımı; bir ana ekrandan iki alt forma açılan **çoklu alt form** örneği. Seed `data/App.Hr.{SkillType,SkillLevel,Skill}.json`. | | **Definitions › Skill Type** | `App.Hr.SkillType` (alt formlar `App.Hr.SkillLevel`, `App.Hr.Skill`) | `Hr_T_SkillType` · `Hr_T_SkillLevel` · `Hr_T_Skill` | tenant | Yetkinlik tanımı; bir ana ekrandan iki alt forma açılan **çoklu alt form** örneği. Seed `data/App.Hr.{SkillType,SkillLevel,Skill}.json`. |
| **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 › 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`. | | **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`. |
| **Work Calendar** | `App.Hr.WorkCalendar` | `Hr_T_WorkCalendar` | tenant | Resmi tatil ve çalışılmayan günler: `Name`, `StartDate`, `EndDate`, `DayType` (`Holiday`/`HalfDay`), `RecurrenceRule` (boş = tek sefer, `FREQ=YEARLY` = her yıl), `AllDay` (gizli, `true`), `IsActive`. Grid'e ek olarak **Takvim (Scheduler)** görünümü açıktır (`TextExpr = Name`). İzin ve puantaj hesabının tatil kaynağıdır. Wizard `wizard/WorkCalendar.json`, tablo `sql/object/Hr_T_WorkCalendar.sql`, seed `data/App.Hr.WorkCalendar.json` (sabit tarihli resmi tatiller her yıl tekrar eder; Ramazan ve Kurban bayramları hicri takvime göre kaydığı için 2026–2027 tarihleriyle tek seferlik girilir, sonraki yıllar ekrandan eklenir). |
| **Definitions › Leave Type** | `App.Hr.LeaveType` | `Hr_T_LeaveType` | tenant | İzin türü: `Code`, `Name`, `Gender` (`All`/`Male`/`Female`), `MaxDaysPerYear`, `IsPaid`, `DeductsFromAnnualLeave`, `RequiresDocument`, `AllowHalfDay`, `IsActive`. İzin talebi/bakiye ekranlarının izin türü lookup'ı. Wizard `wizard/LeaveType.json`, tablo `sql/object/Hr_T_LeaveType.sql`, seed `data/App.Hr.LeaveType.json` (Türkiye standart izin türleri). |
| **Definitions › Expense Type** | `App.Hr.ExpenseType` | `Hr_T_ExpenseType` | tenant | Masraf türü: `Code`, `Name`, `DefaultAmount`, `CurrencyId` (`Sas_H_Currency` lookup'ı), `IsTaxable`, `IsSgkSubject`, `RequiresReceipt`, `IsActive`. Masraf beyanı ekranlarının lookup'ı. Wizard `wizard/ExpenseType.json`, tablo `sql/object/Hr_T_ExpenseType.sql`, seed `data/App.Hr.ExpenseType.json`. |
| **Definitions › Benefit Type** | `App.Hr.BenefitType` | `Hr_T_BenefitType` | tenant | Yan hak türü: `Code`, `Name`, `DefaultAmount`, `CurrencyId`, `IsTaxable`, `IsSgkSubject`, `IsActive`. Kodu kullanıcının yan hak kaydında (`Adm_T_UserBenefit.BenefitType`, Identity › Users › Benefits) değer olarak saklanır; kod değiştirilirse eski kayıtlar eşleşmez. Wizard `wizard/BenefitType.json`, tablo `sql/object/Hr_T_BenefitType.sql`, seed `data/App.Hr.BenefitType.json`. |
| **Shift** | `App.Hr.Shift` | `Hr_T_Shift` | tenant | Vardiya: `Name`, `StartTime`/`EndTime` (`HH:mm`), `BreakMinutes`, `WorkingHours`, `IsNightShift`, `IsActive`. Seed `data/App.Hr.Shift.json`. |
| **Event Log** | `App.Hr.EventLog` | `Hr_T_EventLog` | tenant | Olay günlüğü: vardiya amiri / güvenlik odası / gözlem odası gibi kaynakların (`LogSource` statik lookup) gün içi kayıtları — `BranchId`, `UserId` (olayı yaşayan), `EventDate`/`EventTime`, `Importance`, `ShiftId` (`Hr_T_Shift`), `Description`. Wizard `wizard/EventLog.json`, tablo `sql/object/Hr_T_EventLog.sql`. |
| **Trainings › Training Type / Subject** | `App.Hr.TrainingType` · `App.Hr.TrainingSubject` | `Hr_T_TrainingType` · `Hr_T_TrainingSubject` | tenant | Eğitim türü (`Name`, `IsActive`) ve konusu (`TrainingTypeId`, `Name`, `IsEvaluated`, `IsActive`). Wizard; seed `data/App.Hr.{TrainingType,TrainingSubject}.json`. |
| **Trainings › Training** | `App.Hr.Training` (alt formlar `App.Hr.TrainingParticipant`, `App.Hr.TrainingFile`) | `Hr_T_Training` · `Hr_T_TrainingParticipant` · `Hr_T_TrainingFile` | tenant | Eğitim kaydı: tür → konu cascade (`TrainingSubjectId` ← `TrainingTypeId`), şube, tarih/saat + `TotalHours`, `Status` (`Open`/`Closed`), eğitmen/yer/kurum, kazandırdığı yetkinlikler (`SkillIds` — `dxTagBox`, `Hr_T_Skill`), maliyet kalemleri + `CostTotal`. Katılımcı alt formu kullanıcıyı `AbpUsers`'tan seçer, `HireDate`/`DepartmentId`/`JobPositionId` kopyalanır; `AttendanceStatus`, değerlendirme/sınav puanı. Dosya alt formu `DocumentTypeId` (`Hr_T_DocumentType`) taşır. Katılım belgesi `Raporlar` kategorisindeki "Katılım Belgesi" şablonudur (`App.Hr.TrainingParticipant`). Wizard. |
| **Vehicles › Vehicle Document / Expense Definition / Destination** | `App.Hr.VehicleDocument` · `App.Hr.VehicleExpenseDefinition` · `App.Hr.VehicleDestination` | `Hr_T_VehicleDocument` · `Hr_T_VehicleExpenseDefinition` · `Hr_T_VehicleDestination` | tenant | Araç modülünün tanımları: belge türü (`DocumentGroup`, `DocumentType`, `Name`), masraf kalemi (`ExpenseType`, `Name`), gidilecek yer (`Name`, `Distance`); hepsinde `IsActive`. Wizard; belge ve masraf tanımları seed'lidir (`data/App.Hr.{VehicleDocument,VehicleExpenseDefinition}.json`). |
| **Vehicles › Vehicle** | `App.Hr.Vehicle` (alt form `App.Hr.VehicleFile`) | `Hr_T_Vehicle` · `Hr_T_VehicleFile` | tenant | Araç kartı: şube, marka/model/kasa, `PlateNumber`, `CurrentKm`, `Status`, muayene/sigorta/egzoz/takograf başlangıç–bitiş tarihleri. Dosya alt formu belge türünü `Hr_T_VehicleDocument`'tan seçer. Wizard. |
| **Vehicles › Driver** | `App.Hr.Driver` (alt formlar `App.Hr.DriverDocument`, `.DriverPenalty`, `.DriverAccident`) | `Hr_T_Driver` · `Hr_T_DriverDocument` · `Hr_T_DriverPenalty` · `Hr_T_DriverAccident` | tenant | Şoför = kullanıcı (`UserId` → `AbpUsers`) + en çok beş araç (`Vehicle1Id`…`Vehicle5Id`) + `TotalKm`; belge, ceza (`Amount`) ve kaza kayıtları alt formdur, ekli dosyayla. Wizard. |
| **Vehicles › Vehicle Expense** | `App.Hr.VehicleExpense` (alt form `App.Hr.VehicleExpenseLine`) | `Hr_T_VehicleExpense` · `Hr_T_VehicleExpenseLine` | tenant | Araç masraf faturası (`VehicleId`, `InvoiceNo`, `InvoiceDate`, `DestinationId`, belge görseli `dxImageUpload`) ve satırları (`ExpenseDefinitionId`, `Quantity`, `Amount`, `DiscountRate`, `NetAmount`). **Fiş + satır** kalıbı. Wizard. |
| **Vehicles › Vehicle Movement** | `App.Hr.VehicleMovement` | `Hr_T_VehicleMovement` | tenant | Araç çıkış/giriş kaydı: çıkışta şube, tarih/saat, km, gönderen/güvenlik/şoför kullanıcıları, araç, gidilecek yer, sebep; girişte güvenlik, şube, tarih/saat, km; `TravelledKm`, `DurationMinutes`, `ExpectedKm` hesaplanır, `Status` (`Arrived`/`Left`). Wizard. |
| **Definitions › Penalty Type** | `App.Hr.DisciplinaryPenaltyType` | `Hr_T_DisciplinaryPenaltyType` | tenant | Disiplin cezası türü: `Name`, `Severity` (1–5), `Description`, `IsActive`. Karar alt formunun lookup'ı (aktifler, ağırlık sırasıyla). Wizard; seed `data/App.Hr.DisciplinaryPenaltyType.json` (sözlü/yazılı uyarı, ihtar, kınama, ücret kesintisi, fesih). |
| **Disciplinary Case** | `App.Hr.DisciplinaryCase` (alt formlar `App.Hr.DisciplinaryDefense`, `.DisciplinaryDecision`, `.DisciplinaryFile`) | `Hr_T_DisciplinaryCase` · `Hr_T_DisciplinaryDefense` · `Hr_T_DisciplinaryDecision` · `Hr_T_DisciplinaryFile` | tenant | Olay tutanağı: personel (`UserId` → `AbpUsers`, `DepartmentId`/`JobPositionId` kopyalanır), olay tarihi/saati/yeri, `Subject`, `IncidentDescription` (`dxHtmlEditor`), tanıklar (`WitnessUserIds` — `dxTagBox`), `ReportedById`, `Status` (`Open`/`AwaitingDefense`/`Decided`/`Closed`; Todo panosu bu kolonla). `CaseNo` (`DSP-{yyyy}-{00001}`, kiracı ve yıl bazında) `InsertAfterCommand` ile SQL'de üretilir — `Sequence` kiracıya kopyalanmadığı için numaratör kullanılmaz. Alt formlar: savunma (`RequestDate`, `DueDate` = talep + 2 gün, `ResponseDate`, `DefenseText`, `Status`), karar (`PenaltyTypeId`, karar/yürürlük/tebliğ tarihi, `DeductionAmount`, `Status` `Draft`/`Final`, onay süreci yok), belge (`DocumentTypeId` → `Hr_T_DocumentType`, dosya). Alt form yetkileri `App.Hr.DisciplinaryCase` altındadır. Wizard. |
| **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. | | **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 › 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 › 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. |
@ -1483,6 +1502,8 @@ alanları da doldurur (`lowcode` §0.9).
| "yapay zekâ ajanı ekran/bileşen geliştirsin" | Saas › DeveloperKit › MCP Servers | Yalnızca host kullanıcısı: `App.DeveloperKit.McpServers.Invoke` + `.Write` + Wizard / Custom Components yetkilerini ver; geliştirme araçları `AllowedTools` ile açılıp kapatılır. Kiracı MCP'de veri okur ve yazar, geliştirme yapamaz | | "yapay zekâ ajanı ekran/bileşen geliştirsin" | Saas › DeveloperKit › MCP Servers | Yalnızca host kullanıcısı: `App.DeveloperKit.McpServers.Invoke` + `.Write` + Wizard / Custom Components yetkilerini ver; geliştirme araçları `AllowedTools` ile açılıp kapatılır. Kiracı MCP'de veri okur ve yazar, geliştirme yapamaz |
| "ülke/il/ilçe, para birimi, birim, sektör" | Saas / Administration › Definitions | Var olan tabloya lookup bağla, yenisini üretme | | "ülke/il/ilçe, para birimi, birim, sektör" | Saas / Administration › Definitions | Var olan tabloya lookup bağla, yenisini üretme |
| "departman, pozisyon/ünvan, yetkinlik, organizasyon şeması" | İK › Definitions · İK › Org Chart | Var olan `Hr_*` tablosuna lookup bağla (departman lookup'ı şubeye göre süzülebilir — `BranchDepartmentValues`); yenisini üretme | | "departman, pozisyon/ünvan, yetkinlik, organizasyon şeması" | İK › Definitions · İK › Org Chart | Var olan `Hr_*` tablosuna lookup bağla (departman lookup'ı şubeye göre süzülebilir — `BranchDepartmentValues`); yenisini üretme |
| "izin türü, masraf türü, yan hak türü, vardiya, resmi tatil / çalışma takvimi" | İK › Definitions · İK › Work Calendar · İK › Shift | Var olan `Hr_T_WorkCalendar` / `Hr_T_LeaveType` / `Hr_T_ExpenseType` / `Hr_T_BenefitType` / `Hr_T_Shift` tablosuna lookup bağla; yenisini üretme |
| "eğitim / katılımcı, araç / şoför / araç masrafı / araç çıkış-giriş, olay günlüğü, disiplin / tutanak / savunma / ihtar" | İK › Trainings · İK › Vehicles · İK › Event Log · İK › Disciplinary Case | Var olan `Hr_T_Training*` / `Hr_T_Vehicle*` / `Hr_T_Driver*` / `Hr_T_EventLog` / `Hr_T_Disciplinary*` ekranını genişlet ya da lookup bağla; paralel tablo üretme |
| "yapay zekâ cevaplasın" | Saas › Definitions › AiBot | Bot tanımı; `/admin/ai` bu tanımı kullanır | | "yapay zekâ cevaplasın" | Saas › Definitions › AiBot | Bot tanımı; `/admin/ai` bu tanımı kullanır |
### 12.7 Canlı referans uygulamalar ### 12.7 Canlı referans uygulamalar

View file

@ -504,7 +504,7 @@ ister ve kiracı kullanıcısına hiçbiri açılmaz.
| Araç | Ne yapar | Not | | Araç | Ne yapar | Not |
| --- | --- | --- | | --- | --- | --- |
| `get_dev_guide` | Bu dosyanın (`lowcode`) ya da `reference`'ın başlık listesini / bir bölümünü döner | Bölüm numarayla istenir (`4.3`); aynı numarayı iki başlık taşımamalıdır | | `get_dev_guide` | Bu dosyanın (`lowcode`) ya da `reference`'ın başlık listesini / bir bölümünü döner | Bölüm numarayla (`4.3`) ya da başlık metniyle istenir; aynı numarayı iki başlık taşımamalıdır. Bölüm önce istenen belgede, sonra diğerinde aranır; başlık olmayan bir terim (`dxImageUpload`) terimin geçtiği bölümlerin listesini döndürür |
| `create_table` | Yeni SQL Server tablosu kurar, `sql/object/{Tablo}.sql` dosyasını yazar | Ek olarak `App.SqlQueryManager` ister; `Id`/`TenantId`/audit kolonlarını kendi ekler (`fullAudited`, `multiTenant` varsayılan açık); var olan tabloyu reddeder. View/SP/fonksiyon kurulamaz | | `create_table` | Yeni SQL Server tablosu kurar, `sql/object/{Tablo}.sql` dosyasını yazar | Ek olarak `App.SqlQueryManager` ister; `Id`/`TenantId`/audit kolonlarını kendi ekler (`fullAudited`, `multiTenant` varsayılan açık); var olan tabloyu reddeder. View/SP/fonksiyon kurulamaz |
| `list_wizards` · `get_wizard` | Wizard dosyalarını listeler (menü yolu, bağımlılar) · dosyayı diskteki hâliyle döner | Var olan menü kökünü/izin grubunu bulmak için önce `list_wizards` | | `list_wizards` · `get_wizard` | Wizard dosyalarını listeler (menü yolu, bağımlılar) · dosyayı diskteki hâliyle döner | Var olan menü kökünü/izin grubunu bulmak için önce `list_wizards` |
| `deploy_wizard` | Wizard cevabından ekranın wizard dosyasını ve menü/yetki/dil seed satırlarını yazar; veritabanına yazmaz (§4.0) | Girdi §4.4'teki düz cevap ya da `get_wizard` çıktısıyla aynı dosya biçimi; enum'lar sayı. `replaceFileName` = `EditFileName` (§4.5). List ekranında `Widgets` dolu gelir — alt form olarak üretilen ekran hariç (`Widgets: []`) — en az 3 kart, kiracı tablosunda `"TenantId" = '@TENANTID'` (§4.6.1); kartlardaki her dil anahtarı var olmalı ya da `Language.Texts`'te EN + TR verilmeli, yoksa deploy reddeder. `MenuOrder` yazılmaz — sunucu yeni ekranı kardeşlerinin sonuna koyar, güncellemede yerini korur. Talep bağı (`DevRequest`) da yazılmaz — sunucu etkin talepten doldurur (§4.0). İstek demo veri taşıyorsa `SeedData: true` + `seedRows` (§0.10.1). Satır/toolbar butonları `CommandColumns` (§4.9). Bağımlı lookup öğedeki `Cascade*` alanları (§4.3.4). Çıkıştaki `isPending: true` ekranın henüz kurulmadığını söyler — kullanıcı Wizard Manager'da DB Migrate çalıştırır; model migrate'i beklemez | | `deploy_wizard` | Wizard cevabından ekranın wizard dosyasını ve menü/yetki/dil seed satırlarını yazar; veritabanına yazmaz (§4.0) | Girdi §4.4'teki düz cevap ya da `get_wizard` çıktısıyla aynı dosya biçimi; enum'lar sayı. `replaceFileName` = `EditFileName` (§4.5). List ekranında `Widgets` dolu gelir — alt form olarak üretilen ekran hariç (`Widgets: []`) — en az 3 kart, kiracı tablosunda `"TenantId" = '@TENANTID'` (§4.6.1); kartlardaki her dil anahtarı var olmalı ya da `Language.Texts`'te EN + TR verilmeli, yoksa deploy reddeder. `MenuOrder` yazılmaz — sunucu yeni ekranı kardeşlerinin sonuna koyar, güncellemede yerini korur. Talep bağı (`DevRequest`) da yazılmaz — sunucu etkin talepten doldurur (§4.0). İstek demo veri taşıyorsa `SeedData: true` + `seedRows` (§0.10.1). Satır/toolbar butonları `CommandColumns` (§4.9). Bağımlı lookup öğedeki `Cascade*` alanları (§4.3.4). Çıkıştaki `isPending: true` ekranın henüz kurulmadığını söyler — kullanıcı Wizard Manager'da DB Migrate çalıştırır; model migrate'i beklemez |
@ -1158,7 +1158,7 @@ atanmaz (admin dahil); ekranı görecek roller yetkiyi rol ekranından alır.
| `IsTenant` / `IsBranch` / `IsOrganizationUnit` | `[ListForm]` Otomatik kırılım filtresi. Tabloda `TenantId` varsa `IsTenant: true` **olmalı**. | | `IsTenant` / `IsBranch` / `IsOrganizationUnit` | `[ListForm]` Otomatik kırılım filtresi. Tabloda `TenantId` varsa `IsTenant: true` **olmalı**. |
| `AllowAdding` / `AllowUpdating` / `AllowDeleting` / `ConfirmDelete` | `[ListForm]` Toolbar ve satır aksiyonları (`EditingOptionDto`). | | `AllowAdding` / `AllowUpdating` / `AllowDeleting` / `ConfirmDelete` | `[ListForm]` Toolbar ve satır aksiyonları (`EditingOptionDto`). |
| `SeedData` | `[ListForm]` `true` ise `SeedFilePath = data/{ListFormCode}.json` ve `SeedSyncInsert/Update/Delete` açık üretilir; ekrandan girilen satır dosyaya yazılır, migrate geri yükler. Wizard ekranında sorulmaz; demo veri taşıyan MCP üretimi için (§0.10.1). Varsayılan `false`. | | `SeedData` | `[ListForm]` `true` ise `SeedFilePath = data/{ListFormCode}.json` ve `SeedSyncInsert/Update/Delete` açık üretilir; ekrandan girilen satır dosyaya yazılır, migrate geri yükler. Wizard ekranında sorulmaz; demo veri taşıyan MCP üretimi için (§0.10.1). Varsayılan `false`. |
| `AllowDetail` | `[ListForm]` Satırda **Detay** düğmesi çıkar; `/admin/form/{ListFormCode}/{anahtar}` adresini yeni sekmede açar — aynı ekranın tek kayıtlık form görünümüdür. `KeyFieldName` boşsa çalışmaz. | | `AllowDetail` | `[ListForm]` Satırda **Detay** düğmesi çıkar; `/admin/form/{ListFormCode}/{anahtar}` adresini yeni sekmede açar — aynı ekranın tek kayıtlık form görünümüdür. `KeyFieldName` boşsa çalışmaz. **`SubForms` doluysa cevaptan bağımsız `true` üretilir** (`ListFormWizardDto.BuildListForm`): wizard alt formları `Form` tipinde kurar ve sekmeler yalnızca Detay görünümünde açılır. Elle yazılan wizard dosyasında da alt formu olan ekranın `EditingOptionDto.AllowDetail` değeri `true` yazılır. |
| `DefaultLayout` | `[ListForm]` `"grid"`, `"card"`, `"pivot"`, `"chart"`, `"tree"`, `"gantt"`, `"scheduler"`, `"todo"`. | | `DefaultLayout` | `[ListForm]` `"grid"`, `"card"`, `"pivot"`, `"chart"`, `"tree"`, `"gantt"`, `"scheduler"`, `"todo"`. |
| `Grid` `Card` `Pivot` `Chart` `Tree` `Gantt` `Scheduler` `Todo` | `[ListForm]` Hangi görünümlerin açık olduğu (`LayoutDto`). **Liste ekranında `Grid`/`Card`/`Pivot`/`Chart` varsayılan `true`**, diğer dördü `false` (§9.8). Açtığın her görünümün option bloğunu da doldur. | | `Grid` `Card` `Pivot` `Chart` `Tree` `Gantt` `Scheduler` `Todo` | `[ListForm]` Hangi görünümlerin açık olduğu (`LayoutDto`). **Liste ekranında `Grid`/`Card`/`Pivot`/`Chart` varsayılan `true`**, diğer dördü `false` (§9.8). Açtığın her görünümün option bloğunu da doldur. |
@ -3960,7 +3960,7 @@ Her sekmenin düzenlediği kolonlar — alan alan sözleşmeleri `lowcode-refere
| **Durum** | `StateStoringJson` | ref §2.5 | | **Durum** | `StateStoringJson` | ref §2.5 |
| **Ek Filtre** | `ExtraFilterJson` satır diyaloğu | §4.3.8 | | **Ek Filtre** | `ExtraFilterJson` satır diyaloğu | §4.3.8 |
| **Form** | `EditingFormJson` — düzenleme formunun grup satırları | ref §3.2 | | **Form** | `EditingFormJson` — düzenleme formunun grup satırları | ref §3.2 |
| **Alanlar** | `ListFormField` kayıtları — alan başına 15 alt sekme, aşağıda | ref §9 | | **Alanlar** | `ListFormField` kayıtları — alan başına 15 alt sekme, aşağıda. Satırlar sürüklenerek sıralanır (`form-fields/fieldOrder.ts`, `SortableFieldRow.tsx`): **Liste sırası** modu `ListOrderNo`'yu bütün alanlar üzerinde, **Form sırası** modu `EditOrderNo`'yu yalnızca aynı `EditGroupOrderNo` grubundaki forma giren alanlar arasında 1'den yeniden dağıtır; gruplar arası taşıma Seçenekler alt sekmesindendir. Sıra kültür/rol/kullanıcı kaydı başına ayrıdır, yalnızca değişen alanlar kaydedilir; `Update` yetkisi ister | ref §9 |
| **Kişiselleştirme** | `ListFormCustomization` kayıtları: tür (`UserUiFilter`/`GridState`/`ServerJoin`/`ServerWhere`), ad, rol/kullanıcı, veri | ref §2.5 | | **Kişiselleştirme** | `ListFormCustomization` kayıtları: tür (`UserUiFilter`/`GridState`/`ServerJoin`/`ServerWhere`), ad, rol/kullanıcı, veri | ref §2.5 |
| **Pivot / Tree / Gantt / Scheduler / Todo** | `PivotOptionJson` / `TreeOptionJson` / `GanttOptionJson` / `SchedulerOptionJson` / `TodoOptionJson` | ref §6–§7 | | **Pivot / Tree / Gantt / Scheduler / Todo** | `PivotOptionJson` / `TreeOptionJson` / `GanttOptionJson` / `SchedulerOptionJson` / `TodoOptionJson` | ref §6–§7 |
| **Alt Form** | `SubFormsJson` | ref §5.2 | | **Alt Form** | `SubFormsJson` | ref §5.2 |
@ -3976,6 +3976,11 @@ Her sekmenin düzenlediği kolonlar — alan alan sözleşmeleri `lowcode-refere
| Select | `DefaultFilter`, `SelectFieldsDefaultValueJson` satır diyaloğu | | Select | `DefaultFilter`, `SelectFieldsDefaultValueJson` satır diyaloğu |
| Insert / Update / Delete | ilgili `*ServiceAddress`, `*Command`, `*BeforeCommand`, `*AfterCommand`, `*FieldsDefaultValueJson` | | Insert / Update / Delete | ilgili `*ServiceAddress`, `*Command`, `*BeforeCommand`, `*AfterCommand`, `*FieldsDefaultValueJson` |
`*FieldsDefaultValueJson` satır diyaloğunda `FieldName`, `SelectCommand`'in kolon listesinden seçilir ve
seçilen kolonun tipi `FieldDbType`'a yazılır (`sqlDataTypeToDbType`); liste kısıtlamaz — `Query` tipli
kaynakta kolonlar katalogdan okunamadığı ve tabloda olmayan bir parametre adı da gerekebildiği için
serbest değer de yazılabilir (`JsonRowOpDialogDatabase.tsx`).
**Alan editörü** (Alanlar sekmesinde bir satır açılınca; `form-fields/FormFieldEdit.tsx`) — **Alan editörü** (Alanlar sekmesinde bir satır açılınca; `form-fields/FormFieldEdit.tsx`) —
15 alt sekme; her biri `ListFormField`'ın bir kolonunu düzenler: 15 alt sekme; her biri `ListFormField`'ın bir kolonunu düzenler:
@ -4368,6 +4373,7 @@ kullanılacağı** `lowcode-reference.instructions.md` §12'dedir.
| "Duyuru, anket, sosyal akış, etkinlik" | İK › Intranet ekranları | `/admin/list/App.Hr.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.*` | | "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` | | "Departman, pozisyon/ünvan, yetkinlik, organizasyon şeması" | İK › Definitions · Org Chart (şube bazlı departman/pozisyon) | `/admin/list/App.Hr.*` · `/admin/organization` |
| "Eğitim, araç/şoför/araç masrafı, vardiya, olay günlüğü, disiplin dosyası" | İK › Trainings · Vehicles · Shift · Event Log · Disciplinary Case | `/admin/list/App.Hr.{Training,Vehicle,Driver,VehicleExpense,VehicleMovement,Shift,EventLog,DisciplinaryCase}` |
| "Menü düzeni" | Menu Manager (§9.7) | `/admin/menuManager` | | "Menü düzeni" | Menu Manager (§9.7) | `/admin/menuManager` |
| "Genel siteye sayfa" | Custom Component (`Pub` modülü) — Visual Designer'dan yeni component + `Pub` menü kaydı | `/admin/developerkit/components/design/:id` (README.md §10.4) | | "Genel siteye sayfa" | Custom Component (`Pub` modülü) — Visual Designer'dan yeni component + `Pub` menü kaydı | `/admin/developerkit/components/design/:id` (README.md §10.4) |
| "Yapay zekâ asistanı" | AI Bot tanımları | `/admin/list/App.Definitions.AiBot` | | "Yapay zekâ asistanı" | AI Bot tanımları | `/admin/list/App.Definitions.AiBot` |

View file

@ -927,7 +927,12 @@ Yetki grubu `App.Hr`; ListForm kodu = menü kodu = yetki adı = dil anahtarı. T
departman lookup'ı şubeye göre süzülür (`BranchDepartmentValues`). Host varsayılan şubesi sabit departman lookup'ı şubeye göre süzülür (`BranchDepartmentValues`). Host varsayılan şubesi sabit
kimlikle kurulur (`PlatformConsts.Branches.BranchIdDefaultValue`) ve kimlikle kurulur (`PlatformConsts.Branches.BranchIdDefaultValue`) ve
`data/App.Hr.{Department,JobPosition}.json` satırları bu kimliğe bağlıdır. Numaratör `data/App.Hr.{Department,JobPosition}.json` satırları bu kimliğe bağlıdır. Numaratör
(`App.Definitions.Sequence`) Administration › Definitions altındadır. Ayrıntı: (`App.Definitions.Sequence`) Administration › Definitions altındadır. Intranet de İK'dadır: menü
`App.Hr.Intranet`, ekran/yetki kodları `App.Hr.Intranet.*`, tablolar `Hr_T_*` (mesajlaşma dahil),
entity'ler `Entities/Tenant/Hr/Intranet`, seed `data/App.Hr.Intranet.*.json`; pano widget kaydı
(`Sas_T_IntranetWidget`) Saas'ta kalır. Vardiya, çalışma takvimi, olay günlüğü, Eğitimler
(`App.Hr.Trainings`), Araçlar (`App.Hr.Vehicles`), disiplin dosyaları ile izin/masraf/yan hak/disiplin cezası türleri wizard ile
üretilmiştir — entity yoktur, ekran `wizard/{Ad}.json`, tablo `sql/object/Hr_T_*.sql`. Ayrıntı:
`lowcode-reference.instructions.md` §12.4. `lowcode-reference.instructions.md` §12.4.
**Yetki kodları** `PlatformConsts.AppCodes` içinde merkezî olarak tanımlıdır ve **Yetki kodları** `PlatformConsts.AppCodes` içinde merkezî olarak tanımlıdır ve
@ -1452,11 +1457,11 @@ liste süzgeci ve çağrı kapısı aynı kuralı kullanır.
| `describe_list` | Bir listenin sütunları: alan adı, görünen başlık, SQL tipi, lookup ilişkisi, `isSensitive`. | | `describe_list` | Bir listenin sütunları: alan adı, görünen başlık, SQL tipi, lookup ilişkisi, `isSensitive`. |
| `search_schema` | Liste ve sütun adları/başlıkları üzerinde aksan ve büyük/küçük harf duyarsız arama. | | `search_schema` | Liste ve sütun adları/başlıkları üzerinde aksan ve büyük/küçük harf duyarsız arama. |
| `query_list` | Listenin verisini ekranın kendi sorgusuyla (`GetSelectAsync`) okur: filtre, sıralama, gruplama, özet (DevExtreme biçimi). Sıralama/gruplama/özet JSON'u, arayüzün `Utils.ts`'te yaptığı gibi select ucunun metin biçimine (`Alan desc|Alan2 asc`) `McpLoadOptions` ile çevrilir; select ucu JSON'u tanımaz. Normal kullanıcının veri okuma yolu. | | `query_list` | Listenin verisini ekranın kendi sorgusuyla (`GetSelectAsync`) okur: filtre, sıralama, gruplama, özet (DevExtreme biçimi). Sıralama/gruplama/özet JSON'u, arayüzün `Utils.ts`'te yaptığı gibi select ucunun metin biçimine (`Alan desc|Alan2 asc`) `McpLoadOptions` ile çevrilir; select ucu JSON'u tanımaz. Normal kullanıcının veri okuma yolu. |
| `run_select` | Parametreli tek SELECT; çoklu ifade, DDL ve DML reddedilir, satır tavanı sorguya yazılır. Yalnızca SQL Query Manager yetkisiyle. | | `run_select` | Parametreli tek SELECT; çoklu ifade, DDL ve DML reddedilir, satır tavanı sorguya yazılır. Yalnızca SQL Query Manager yetkisiyle. Sağlayıcı hatası mesajıyla döner (`SelectFailed`); araç açıklaması kolonu varsaymamayı, gerekirse önce `INFORMATION_SCHEMA.COLUMNS`'ı okumayı söyler. |
| `list_queries` | View/procedure/function nesneleri (SQL Query Manager yetkisiyle) + çağrılabilir Custom Endpoint'ler (`App.DeveloperKit.CustomEndpoints.Get` ile). | | `list_queries` | View/procedure/function nesneleri (SQL Query Manager yetkisiyle) + çağrılabilir Custom Endpoint'ler (`App.DeveloperKit.CustomEndpoints.Get` ile). |
| `run_query` | Kayıtlı bir nesneyi ya da Custom Endpoint'i parametreleriyle çağırır; yetkiler `list_queries` ile aynı. | | `run_query` | Kayıtlı bir nesneyi ya da Custom Endpoint'i parametreleriyle çağırır; yetkiler `list_queries` ile aynı. |
| `insert_row` / `update_row` / `delete_row` | ListForm ekranının insert/update/delete sözleşmesinden geçer. | | `insert_row` / `update_row` / `delete_row` | ListForm ekranının insert/update/delete sözleşmesinden geçer. |
| `get_dev_guide` | Üretim sözleşmesi: `lowcode` / `reference` belgelerinin başlık listesi ya da istenen bölümü (numarayla, örn. `4.2`). Çok büyük bir üst bölüm yalnızca giriş metni + alt başlıklarıyla döner. | | `get_dev_guide` | Üretim sözleşmesi: `lowcode` / `reference` belgelerinin başlık listesi ya da istenen bölümü (numarayla, örn. `4.2`, ya da başlık metniyle). Bölüm önce istenen, sonra diğer belgede aranır; başlıkla eşleşmeyen terimde (örn. `dxImageUpload`) terimin geçtiği bölümler (en çok 15, `DevGuideSearchMatches`), hiç geçmiyorsa başlık listesi döner — hata atılmaz. Çok büyük bir üst bölüm yalnızca giriş metni + alt başlıklarıyla döner. |
| `create_table` | Yeni tabloyu SQL Query Manager tablo tasarımcısıyla aynı script biçimiyle kurar (`McpTableCreator`): `Id` + `TenantId` + tam audit kolonları şablondan gelir, istemci yalnızca iş kolonlarını verir; tip ve varsayılan değer beyaz listeden geçer, istemci SQL yazamaz. Script `{kapsam}/sql/object/{Tablo}.sql` dosyasına yazılır. Yalnızca oluşturur — tablo varsa reddeder; yalnızca SQL Server. `.Write` + `App.SqlQueryManager` ister. | | `create_table` | Yeni tabloyu SQL Query Manager tablo tasarımcısıyla aynı script biçimiyle kurar (`McpTableCreator`): `Id` + `TenantId` + tam audit kolonları şablondan gelir, istemci yalnızca iş kolonlarını verir; tip ve varsayılan değer beyaz listeden geçer, istemci SQL yazamaz. Script `{kapsam}/sql/object/{Tablo}.sql` dosyasına yazılır. Yalnızca oluşturur — tablo varsa reddeder; yalnızca SQL Server. `.Write` + `App.SqlQueryManager` ister. |
| `list_wizards` / `get_wizard` | Wizard File Manager dosyaları; `get_wizard` seed dosyasını diskteki biçimiyle döndürür. | | `list_wizards` / `get_wizard` | Wizard File Manager dosyaları; `get_wizard` seed dosyasını diskteki biçimiyle döndürür. |
| `deploy_wizard` | Wizard'ı Wizard ekranıyla aynı yoldan (`IListFormWizardAppService.Create`) deploy eder. Girdi seed dosyası biçimi (`{"Wizard": …}`) ya da düz cevaplardır; ikisi de `WizardSeedFileDto.FromSeedJson`'dan geçer. Dosyaya kullanıcının etkin talebi `DevRequest` olarak yazılır (sunucu doldurur). Wizard ekranı gibi yalnızca seed dosyalarını yazar; ekran DB Migrate ile kurulur ve çıkıştaki `isPending` o zamana kadar `true` kalır (model migrate'i beklemez; `verify_wizard` bekleyen dosyada `install` kontrolünde durur). `replaceFileName` doluysa güncellemedir (dosyalar yeniden yazılır, önceki kayıtları migrate kaldırır). İstek demo veri taşıyorsa (prompt'taki satırlar, ekran görüntüsü) wizard `SeedData: true` ile deploy edilir — ekranın `SeedFilePath`'i `data/{ListFormCode}.json` olur ve `SeedSync*` bayrakları açılır — satırlar aynı çağrıda `seedRows` ile bu dosyaya yazılır (alan adları doğrulanır, `Guid` anahtarı sunucu üretir); migrate ekranı kurduktan sonra satırları ekler (`lowcode.instructions.md` §0.10.1). Widget sorgularındaki her dil anahtarı tanımlı olmalı ya da wizard'ın `Language.Texts` alanında EN + TR verilmeli, yoksa deploy adlarıyla reddeder (`ValidateWidgetLanguageKeysAsync`). `uploadUrl`'süz `dxImageUpload` alanı base64 sakladığı için kolonu sınırlı boyluysa (katalogdaki karakter sınırı) deploy reddedilir; tablo kolonuna bağlı `dxImageViewer` alanı da reddedilir — görsel kolonunun editörü her zaman `dxImageUpload`'dır (`ValidateImageColumnLengths`). `MenuOrder` yok sayılır: yeni ekran kardeşlerinin sonuna, güncelleme mevcut yerine yazılır — lookup kaynağı ekran önce deploy edildiği için onu kullanan ekranın üstünde kalır. | | `deploy_wizard` | Wizard'ı Wizard ekranıyla aynı yoldan (`IListFormWizardAppService.Create`) deploy eder. Girdi seed dosyası biçimi (`{"Wizard": …}`) ya da düz cevaplardır; ikisi de `WizardSeedFileDto.FromSeedJson`'dan geçer. Dosyaya kullanıcının etkin talebi `DevRequest` olarak yazılır (sunucu doldurur). Wizard ekranı gibi yalnızca seed dosyalarını yazar; ekran DB Migrate ile kurulur ve çıkıştaki `isPending` o zamana kadar `true` kalır (model migrate'i beklemez; `verify_wizard` bekleyen dosyada `install` kontrolünde durur). `replaceFileName` doluysa güncellemedir (dosyalar yeniden yazılır, önceki kayıtları migrate kaldırır). İstek demo veri taşıyorsa (prompt'taki satırlar, ekran görüntüsü) wizard `SeedData: true` ile deploy edilir — ekranın `SeedFilePath`'i `data/{ListFormCode}.json` olur ve `SeedSync*` bayrakları açılır — satırlar aynı çağrıda `seedRows` ile bu dosyaya yazılır (alan adları doğrulanır, `Guid` anahtarı sunucu üretir); migrate ekranı kurduktan sonra satırları ekler (`lowcode.instructions.md` §0.10.1). Widget sorgularındaki her dil anahtarı tanımlı olmalı ya da wizard'ın `Language.Texts` alanında EN + TR verilmeli, yoksa deploy adlarıyla reddeder (`ValidateWidgetLanguageKeysAsync`). `uploadUrl`'süz `dxImageUpload` alanı base64 sakladığı için kolonu sınırlı boyluysa (katalogdaki karakter sınırı) deploy reddedilir; tablo kolonuna bağlı `dxImageViewer` alanı da reddedilir — görsel kolonunun editörü her zaman `dxImageUpload`'dır (`ValidateImageColumnLengths`). `MenuOrder` yok sayılır: yeni ekran kardeşlerinin sonuna, güncelleme mevcut yerine yazılır — lookup kaynağı ekran önce deploy edildiği için onu kullanan ekranın üstünde kalır. |
@ -1580,7 +1585,10 @@ iletir; diğer her istisna "An error occurred invoking '…'" olarak gider. `Mcp
- **İş kuralı hatası** (`UserFriendlyException`: kiracıya kapalı araç, `AllowedTools` dışı araç, - **İş kuralı hatası** (`UserFriendlyException`: kiracıya kapalı araç, `AllowedTools` dışı araç,
`start_dev_request` durum reddi…) → yerelleştirilmiş mesajı olduğu gibi. `start_dev_request` durum reddi…) → yerelleştirilmiş mesajı olduğu gibi.
Başka istisnalar çevrilmez; SQL ve yığın ayrıntısı istemciye sızmaz. Başka istisnalar çevrilmez; SQL ve yığın ayrıntısı istemciye sızmaz. Tek istisna `run_select`'tir:
sağlayıcı hatası (`DbException`, örn. tabloda olmayan kolon) `App.Mcp.Error.SelectFailed` ile
mesajıyla döner ki model sorguyu düzeltebilsin — araç zaten `App.SqlQueryManager` ister, hata metni
yeni bilgi sızdırmaz (`McpQueryAppService`).
**Geliştirme rehberi nereden okur.** `get_dev_guide` depodaki **Geliştirme rehberi nereden okur.** `get_dev_guide` depodaki
`.github/instructions/lowcode*.instructions.md` dosyalarını runtime'da okur; Claude Code ile MCP `.github/instructions/lowcode*.instructions.md` dosyalarını runtime'da okur; Claude Code ile MCP
@ -2035,6 +2043,7 @@ configs/seeds/
│ │ # App.Definitions.{Currency,ContactTitle,AiBot,TerminationReason}.json — para birimi, hitap, AI bot, SGK çıkış kodu │ │ # 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.{SkillType,SkillLevel,Skill}.json — İK yetkinlik tanımları
│ │ # App.Hr.{Department,JobPosition}.json — İK departman → pozisyon (BranchId ile şubeye bağlı) │ │ # App.Hr.{Department,JobPosition}.json — İK departman → pozisyon (BranchId ile şubeye bağlı)
│ │ # App.Hr.Intranet.*.json — İK › Intranet (duyuru, anket, sosyal akış, etkinlik)
│ │ # App.Notifications.Notification{Templates,Types,Rules}.json — bildirim şablonu, tipi → kuralı │ │ # App.Notifications.Notification{Templates,Types,Rules}.json — bildirim şablonu, tipi → kuralı
│ │ # App.Languages.{Language,LanguageText}.json — dil → metin (eksik LanguageKey metinle üretilir) │ │ # App.Languages.{Language,LanguageText}.json — dil → metin (eksik LanguageKey metinle üretilir)
│ │ # App.SettingDefinitions.json, App.BackgroundWorkers.RecurringJobs.json — ayar tanımları, zamanlanmış işler │ │ # App.SettingDefinitions.json, App.BackgroundWorkers.RecurringJobs.json — ayar tanımları, zamanlanmış işler

View file

@ -293,10 +293,12 @@ public class ListFormWizardDto
dto.ColumnOptionJson = WizardConsts.DefaultColumnOptionJson(); dto.ColumnOptionJson = WizardConsts.DefaultColumnOptionJson();
dto.PermissionJson = WizardConsts.DefaultPermissionJson(code); dto.PermissionJson = WizardConsts.DefaultPermissionJson(code);
dto.PagerOptionJson = WizardConsts.DefaultPagerOptionJson; dto.PagerOptionJson = WizardConsts.DefaultPagerOptionJson;
// Wizard alt formlari Form tipinde (SubFormsListFormType) uretir; sekmeler yalnizca Detay
// (tek kayit) gorunumunde acilir, Detay kapali uretilirse sekmelere ulasilamaz.
dto.EditingOptionJson = WizardConsts.DefaultEditingOptionJson( dto.EditingOptionJson = WizardConsts.DefaultEditingOptionJson(
titleLangKey, formWidth, formHeight, titleLangKey, formWidth, formHeight,
AllowDeleting, AllowAdding, AllowUpdating, AllowDeleting, AllowAdding, AllowUpdating,
ConfirmDelete, false, AllowDetail); ConfirmDelete, false, AllowDetail || subForms.Count > 0);
dto.DeleteFieldsDefaultValueJson = isDeletedField dto.DeleteFieldsDefaultValueJson = isDeletedField
? WizardConsts.DefaultDeleteFieldsDefaultValueJson(KeyFieldDbSourceType) ? WizardConsts.DefaultDeleteFieldsDefaultValueJson(KeyFieldDbSourceType)
: WizardConsts.DefaultDeleteFieldsJsonOnlyId(KeyFieldDbSourceType); : WizardConsts.DefaultDeleteFieldsJsonOnlyId(KeyFieldDbSourceType);

View file

@ -312,6 +312,19 @@ public static class LookupQueryValues
$"AND \"IsDeleted\" = 'false' " + $"AND \"IsDeleted\" = 'false' " +
$"ORDER BY \"Name\";"; $"ORDER BY \"Name\";";
// Hr_T_BenefitType wizard ile seed scriptinden kurulur, entity'si yoktur; ad bu yuzden sabit yazilir.
// Deger Code'dur: UserBenefit.BenefitType metin kolonudur ve kod kiracinin tanimladigi turle eslesir.
public static string BenefitTypeValues =
$"SELECT " +
$"\"Code\" AS \"Key\", " +
$"\"Name\" AS \"Name\" " +
$"FROM \"Hr_T_BenefitType\" " +
$"WHERE " +
$"\"TenantId\" = '{DefaultValues.TenantId}' " +
$"AND \"IsActive\" = 'true' " +
$"AND \"IsDeleted\" = 'false' " +
$"ORDER BY \"Name\";";
public static string BranchDepartmentValues = public static string BranchDepartmentValues =
$"SELECT " + $"SELECT " +
$"\"Id\" AS \"Key\", " + $"\"Id\" AS \"Key\", " +

View file

@ -9754,19 +9754,10 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
AllowSearch = true, AllowSearch = true,
LookupJson = JsonSerializer.Serialize(new LookupDto { LookupJson = JsonSerializer.Serialize(new LookupDto {
DataSourceType = UiLookupDataSourceTypeEnum.StaticData, DataSourceType = UiLookupDataSourceTypeEnum.Query,
DisplayExpr = "name", DisplayExpr = "Name",
ValueExpr = "key", ValueExpr = "Key",
LookupQuery = JsonSerializer.Serialize(new LookupDataDto[] { LookupQuery = LookupQueryValues.BenefitTypeValues
new() { Key="Meal", Name="App.StaticLookup.BenefitMeal" },
new() { Key="Transportation", Name="App.StaticLookup.BenefitTransportation" },
new() { Key="PrivateHealthInsurance", Name="App.StaticLookup.BenefitPrivateHealthInsurance" },
new() { Key="PrivatePension", Name="App.StaticLookup.BenefitPrivatePension" },
new() { Key="Housing", Name="App.StaticLookup.BenefitHousing" },
new() { Key="Vehicle", Name="App.StaticLookup.BenefitVehicle" },
new() { Key="Phone", Name="App.StaticLookup.BenefitPhone" },
new() { Key="Other", Name="App.StaticLookup.BenefitOther" },
}),
}), }),
ValidationRuleJson = DefaultValidationRuleRequiredJson, ValidationRuleJson = DefaultValidationRuleRequiredJson,
ColumnCustomizationJson = DefaultColumnCustomizationJson, ColumnCustomizationJson = DefaultColumnCustomizationJson,

View file

@ -4819,7 +4819,7 @@
"Name": "App.Hr.OrgChart", "Name": "App.Hr.OrgChart",
"ParentName": null, "ParentName": null,
"DisplayName": "App.Hr.OrgChart", "DisplayName": "App.Hr.OrgChart",
"Order": 2, "Order": 3,
"IsEnabled": true, "IsEnabled": true,
"MultiTenancySide": 3, "MultiTenancySide": 3,
"Modules": "Sas|Hr" "Modules": "Sas|Hr"
@ -5179,7 +5179,7 @@
"Name": "App.Hr.Visitor", "Name": "App.Hr.Visitor",
"ParentName": null, "ParentName": null,
"DisplayName": "App.Hr.Visitor", "DisplayName": "App.Hr.Visitor",
"Order": 3, "Order": 4,
"IsEnabled": true, "IsEnabled": true,
"MultiTenancySide": 3, "MultiTenancySide": 3,
"Modules": "Hr" "Modules": "Hr"
@ -5739,7 +5739,7 @@
"Name": "App.Hr.HealthCard", "Name": "App.Hr.HealthCard",
"ParentName": null, "ParentName": null,
"DisplayName": "App.Hr.HealthCard", "DisplayName": "App.Hr.HealthCard",
"Order": 11, "Order": 12,
"IsEnabled": true, "IsEnabled": true,
"MultiTenancySide": 3, "MultiTenancySide": 3,
"Modules": "Hr" "Modules": "Hr"
@ -5809,7 +5809,7 @@
"Name": "App.Hr.Trainings", "Name": "App.Hr.Trainings",
"ParentName": null, "ParentName": null,
"DisplayName": "App.Hr.Trainings", "DisplayName": "App.Hr.Trainings",
"Order": 12, "Order": 13,
"IsEnabled": true, "IsEnabled": true,
"MultiTenancySide": 3, "MultiTenancySide": 3,
"Modules": "Hr" "Modules": "Hr"
@ -6169,7 +6169,7 @@
"Name": "App.Hr.Vehicles", "Name": "App.Hr.Vehicles",
"ParentName": null, "ParentName": null,
"DisplayName": "App.Hr.Vehicles", "DisplayName": "App.Hr.Vehicles",
"Order": 13, "Order": 14,
"IsEnabled": true, "IsEnabled": true,
"MultiTenancySide": 3, "MultiTenancySide": 3,
"Modules": "Hr" "Modules": "Hr"
@ -7089,7 +7089,7 @@
"Name": "App.Hr.EventLog", "Name": "App.Hr.EventLog",
"ParentName": null, "ParentName": null,
"DisplayName": "App.Hr.EventLog", "DisplayName": "App.Hr.EventLog",
"Order": 14, "Order": 15,
"IsEnabled": true, "IsEnabled": true,
"MultiTenancySide": 3, "MultiTenancySide": 3,
"Modules": "Hr" "Modules": "Hr"
@ -7159,7 +7159,7 @@
"Name": "App.Hr.Intranet", "Name": "App.Hr.Intranet",
"ParentName": null, "ParentName": null,
"DisplayName": "App.Hr.Intranet", "DisplayName": "App.Hr.Intranet",
"Order": 15, "Order": 16,
"IsEnabled": true, "IsEnabled": true,
"MultiTenancySide": 3, "MultiTenancySide": 3,
"Modules": "Sas|Hr" "Modules": "Sas|Hr"
@ -8383,6 +8383,636 @@
"IsEnabled": true, "IsEnabled": true,
"MultiTenancySide": 3, "MultiTenancySide": 3,
"Modules": "Sas|Hr" "Modules": "Sas|Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.LeaveType",
"ParentName": "App.Hr.Definitions",
"DisplayName": "App.Hr.LeaveType",
"Order": 12,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.LeaveType.Create",
"ParentName": "App.Hr.LeaveType",
"DisplayName": "App.Platform.Create",
"Order": 1,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.LeaveType.Update",
"ParentName": "App.Hr.LeaveType",
"DisplayName": "App.Platform.Update",
"Order": 2,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.LeaveType.Delete",
"ParentName": "App.Hr.LeaveType",
"DisplayName": "App.Platform.Delete",
"Order": 3,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.LeaveType.Export",
"ParentName": "App.Hr.LeaveType",
"DisplayName": "App.Platform.Export",
"Order": 4,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.LeaveType.Import",
"ParentName": "App.Hr.LeaveType",
"DisplayName": "App.Platform.Import",
"Order": 5,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.LeaveType.Note",
"ParentName": "App.Hr.LeaveType",
"DisplayName": "App.Platform.Note",
"Order": 6,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.ExpenseType",
"ParentName": "App.Hr.Definitions",
"DisplayName": "App.Hr.ExpenseType",
"Order": 13,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.ExpenseType.Create",
"ParentName": "App.Hr.ExpenseType",
"DisplayName": "App.Platform.Create",
"Order": 1,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.ExpenseType.Update",
"ParentName": "App.Hr.ExpenseType",
"DisplayName": "App.Platform.Update",
"Order": 2,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.ExpenseType.Delete",
"ParentName": "App.Hr.ExpenseType",
"DisplayName": "App.Platform.Delete",
"Order": 3,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.ExpenseType.Export",
"ParentName": "App.Hr.ExpenseType",
"DisplayName": "App.Platform.Export",
"Order": 4,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.ExpenseType.Import",
"ParentName": "App.Hr.ExpenseType",
"DisplayName": "App.Platform.Import",
"Order": 5,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.ExpenseType.Note",
"ParentName": "App.Hr.ExpenseType",
"DisplayName": "App.Platform.Note",
"Order": 6,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.BenefitType",
"ParentName": "App.Hr.Definitions",
"DisplayName": "App.Hr.BenefitType",
"Order": 14,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.BenefitType.Create",
"ParentName": "App.Hr.BenefitType",
"DisplayName": "App.Platform.Create",
"Order": 1,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.BenefitType.Update",
"ParentName": "App.Hr.BenefitType",
"DisplayName": "App.Platform.Update",
"Order": 2,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.BenefitType.Delete",
"ParentName": "App.Hr.BenefitType",
"DisplayName": "App.Platform.Delete",
"Order": 3,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.BenefitType.Export",
"ParentName": "App.Hr.BenefitType",
"DisplayName": "App.Platform.Export",
"Order": 4,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.BenefitType.Import",
"ParentName": "App.Hr.BenefitType",
"DisplayName": "App.Platform.Import",
"Order": 5,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.BenefitType.Note",
"ParentName": "App.Hr.BenefitType",
"DisplayName": "App.Platform.Note",
"Order": 6,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.WorkCalendar",
"ParentName": null,
"DisplayName": "App.Hr.WorkCalendar",
"Order": 2,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.WorkCalendar.Create",
"ParentName": "App.Hr.WorkCalendar",
"DisplayName": "App.Platform.Create",
"Order": 1,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.WorkCalendar.Update",
"ParentName": "App.Hr.WorkCalendar",
"DisplayName": "App.Platform.Update",
"Order": 2,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.WorkCalendar.Delete",
"ParentName": "App.Hr.WorkCalendar",
"DisplayName": "App.Platform.Delete",
"Order": 3,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.WorkCalendar.Export",
"ParentName": "App.Hr.WorkCalendar",
"DisplayName": "App.Platform.Export",
"Order": 4,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.WorkCalendar.Import",
"ParentName": "App.Hr.WorkCalendar",
"DisplayName": "App.Platform.Import",
"Order": 5,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.WorkCalendar.Note",
"ParentName": "App.Hr.WorkCalendar",
"DisplayName": "App.Platform.Note",
"Order": 6,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.DisciplinaryPenaltyType",
"ParentName": "App.Hr.Definitions",
"DisplayName": "App.Hr.DisciplinaryPenaltyType",
"Order": 15,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.DisciplinaryPenaltyType.Create",
"ParentName": "App.Hr.DisciplinaryPenaltyType",
"DisplayName": "App.Platform.Create",
"Order": 1,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.DisciplinaryPenaltyType.Update",
"ParentName": "App.Hr.DisciplinaryPenaltyType",
"DisplayName": "App.Platform.Update",
"Order": 2,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.DisciplinaryPenaltyType.Delete",
"ParentName": "App.Hr.DisciplinaryPenaltyType",
"DisplayName": "App.Platform.Delete",
"Order": 3,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.DisciplinaryPenaltyType.Export",
"ParentName": "App.Hr.DisciplinaryPenaltyType",
"DisplayName": "App.Platform.Export",
"Order": 4,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.DisciplinaryPenaltyType.Import",
"ParentName": "App.Hr.DisciplinaryPenaltyType",
"DisplayName": "App.Platform.Import",
"Order": 5,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.DisciplinaryPenaltyType.Note",
"ParentName": "App.Hr.DisciplinaryPenaltyType",
"DisplayName": "App.Platform.Note",
"Order": 6,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.DisciplinaryDefense",
"ParentName": "App.Hr.DisciplinaryCase",
"DisplayName": "App.Hr.DisciplinaryDefense",
"Order": 7,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.DisciplinaryDefense.Create",
"ParentName": "App.Hr.DisciplinaryDefense",
"DisplayName": "App.Platform.Create",
"Order": 1,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.DisciplinaryDefense.Update",
"ParentName": "App.Hr.DisciplinaryDefense",
"DisplayName": "App.Platform.Update",
"Order": 2,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.DisciplinaryDefense.Delete",
"ParentName": "App.Hr.DisciplinaryDefense",
"DisplayName": "App.Platform.Delete",
"Order": 3,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.DisciplinaryDefense.Export",
"ParentName": "App.Hr.DisciplinaryDefense",
"DisplayName": "App.Platform.Export",
"Order": 4,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.DisciplinaryDefense.Import",
"ParentName": "App.Hr.DisciplinaryDefense",
"DisplayName": "App.Platform.Import",
"Order": 5,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.DisciplinaryDefense.Note",
"ParentName": "App.Hr.DisciplinaryDefense",
"DisplayName": "App.Platform.Note",
"Order": 6,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.DisciplinaryDecision",
"ParentName": "App.Hr.DisciplinaryCase",
"DisplayName": "App.Hr.DisciplinaryDecision",
"Order": 8,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.DisciplinaryDecision.Create",
"ParentName": "App.Hr.DisciplinaryDecision",
"DisplayName": "App.Platform.Create",
"Order": 1,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.DisciplinaryDecision.Update",
"ParentName": "App.Hr.DisciplinaryDecision",
"DisplayName": "App.Platform.Update",
"Order": 2,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.DisciplinaryDecision.Delete",
"ParentName": "App.Hr.DisciplinaryDecision",
"DisplayName": "App.Platform.Delete",
"Order": 3,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.DisciplinaryDecision.Export",
"ParentName": "App.Hr.DisciplinaryDecision",
"DisplayName": "App.Platform.Export",
"Order": 4,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.DisciplinaryDecision.Import",
"ParentName": "App.Hr.DisciplinaryDecision",
"DisplayName": "App.Platform.Import",
"Order": 5,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.DisciplinaryDecision.Note",
"ParentName": "App.Hr.DisciplinaryDecision",
"DisplayName": "App.Platform.Note",
"Order": 6,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.DisciplinaryFile",
"ParentName": "App.Hr.DisciplinaryCase",
"DisplayName": "App.Hr.DisciplinaryFile",
"Order": 9,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.DisciplinaryFile.Create",
"ParentName": "App.Hr.DisciplinaryFile",
"DisplayName": "App.Platform.Create",
"Order": 1,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.DisciplinaryFile.Update",
"ParentName": "App.Hr.DisciplinaryFile",
"DisplayName": "App.Platform.Update",
"Order": 2,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.DisciplinaryFile.Delete",
"ParentName": "App.Hr.DisciplinaryFile",
"DisplayName": "App.Platform.Delete",
"Order": 3,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.DisciplinaryFile.Export",
"ParentName": "App.Hr.DisciplinaryFile",
"DisplayName": "App.Platform.Export",
"Order": 4,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.DisciplinaryFile.Import",
"ParentName": "App.Hr.DisciplinaryFile",
"DisplayName": "App.Platform.Import",
"Order": 5,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.DisciplinaryFile.Note",
"ParentName": "App.Hr.DisciplinaryFile",
"DisplayName": "App.Platform.Note",
"Order": 6,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.DisciplinaryCase",
"ParentName": null,
"DisplayName": "App.Hr.DisciplinaryCase",
"Order": 17,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.DisciplinaryCase.Create",
"ParentName": "App.Hr.DisciplinaryCase",
"DisplayName": "App.Platform.Create",
"Order": 1,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.DisciplinaryCase.Update",
"ParentName": "App.Hr.DisciplinaryCase",
"DisplayName": "App.Platform.Update",
"Order": 2,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.DisciplinaryCase.Delete",
"ParentName": "App.Hr.DisciplinaryCase",
"DisplayName": "App.Platform.Delete",
"Order": 3,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.DisciplinaryCase.Export",
"ParentName": "App.Hr.DisciplinaryCase",
"DisplayName": "App.Platform.Export",
"Order": 4,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.DisciplinaryCase.Import",
"ParentName": "App.Hr.DisciplinaryCase",
"DisplayName": "App.Platform.Import",
"Order": 5,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
},
{
"GroupName": "App.Hr",
"Name": "App.Hr.DisciplinaryCase.Note",
"ParentName": "App.Hr.DisciplinaryCase",
"DisplayName": "App.Platform.Note",
"Order": 6,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Hr"
} }
] ]
} }

View file

@ -0,0 +1,108 @@
{
"ListFormCode": "App.Hr.BenefitType",
"KeyFieldName": "Id",
"GeneratedAt": "2026-10-03T19:44:21.829907Z",
"Order": 0,
"Rows": [
{
"Code": "Meal",
"Name": "Yemek Kartı",
"DefaultAmount": null,
"CurrencyId": "TRY",
"IsTaxable": false,
"IsSgkSubject": false,
"IsActive": true,
"Id": "589ba403-72aa-58ff-a484-048d400e5bc1"
},
{
"Code": "Transportation",
"Name": "Ulaşım Yardımı",
"DefaultAmount": null,
"CurrencyId": "TRY",
"IsTaxable": false,
"IsSgkSubject": false,
"IsActive": true,
"Id": "2a349aab-44da-50c4-9dd4-c0b32ec195f6"
},
{
"Code": "PrivateHealthInsurance",
"Name": "Özel Sağlık Sigortası",
"DefaultAmount": null,
"CurrencyId": "TRY",
"IsTaxable": false,
"IsSgkSubject": false,
"IsActive": true,
"Id": "d9d316a1-f4fe-595c-b19d-dc71ce0de52a"
},
{
"Code": "PrivatePension",
"Name": "BES Katkısı",
"DefaultAmount": null,
"CurrencyId": "TRY",
"IsTaxable": false,
"IsSgkSubject": false,
"IsActive": true,
"Id": "1c9ad2c0-c01d-5738-8f45-f22db605a382"
},
{
"Code": "Housing",
"Name": "Konut / Lojman Yardımı",
"DefaultAmount": null,
"CurrencyId": "TRY",
"IsTaxable": false,
"IsSgkSubject": false,
"IsActive": true,
"Id": "058f86f7-7fd4-5923-8226-c52c091102e2"
},
{
"Code": "Vehicle",
"Name": "Şirket Aracı",
"DefaultAmount": null,
"CurrencyId": "TRY",
"IsTaxable": false,
"IsSgkSubject": false,
"IsActive": true,
"Id": "c90a9125-eac2-5605-8b0b-c22a21fb73a9"
},
{
"Code": "Phone",
"Name": "Telefon / İnternet Desteği",
"DefaultAmount": null,
"CurrencyId": "TRY",
"IsTaxable": false,
"IsSgkSubject": false,
"IsActive": true,
"Id": "2906a47c-7552-501d-bebd-82cf9b6ce734"
},
{
"Code": "ChildAllowance",
"Name": "Çocuk Yardımı",
"DefaultAmount": null,
"CurrencyId": "TRY",
"IsTaxable": false,
"IsSgkSubject": false,
"IsActive": true,
"Id": "26669126-b85a-5054-b725-5712e0cbe021"
},
{
"Code": "HeatingAllowance",
"Name": "Yakacak Yardımı",
"DefaultAmount": null,
"CurrencyId": "TRY",
"IsTaxable": false,
"IsSgkSubject": false,
"IsActive": true,
"Id": "012ddf45-57a3-5853-8a47-e7e731b60e89"
},
{
"Code": "Other",
"Name": "Diğer",
"DefaultAmount": null,
"CurrencyId": "TRY",
"IsTaxable": false,
"IsSgkSubject": false,
"IsActive": true,
"Id": "5355aa59-3f40-545d-8a94-2fd86843bbb1"
}
]
}

View file

@ -0,0 +1,50 @@
{
"ListFormCode": "App.Hr.DisciplinaryPenaltyType",
"KeyFieldName": "Id",
"GeneratedAt": "2026-10-03T07:00:00Z",
"Order": 0,
"Rows": [
{
"Id": "d15c0001-0000-4000-8000-000000000001",
"Name": "Sözlü Uyarı",
"Severity": 1,
"Description": "Kayda geçirilen sözlü uyarı",
"IsActive": true
},
{
"Id": "d15c0001-0000-4000-8000-000000000002",
"Name": "Yazılı Uyarı",
"Severity": 2,
"Description": "Personele tebliğ edilen yazılı uyarı",
"IsActive": true
},
{
"Id": "d15c0001-0000-4000-8000-000000000003",
"Name": "İhtar",
"Severity": 3,
"Description": "Tekrarı hâlinde ağır yaptırım öngören ihtarname",
"IsActive": true
},
{
"Id": "d15c0001-0000-4000-8000-000000000004",
"Name": "Kınama",
"Severity": 3,
"Description": "Davranışın kusurlu olduğunun yazılı bildirimi",
"IsActive": true
},
{
"Id": "d15c0001-0000-4000-8000-000000000005",
"Name": "Ücret Kesintisi",
"Severity": 4,
"Description": "İş Kanunu md. 38 kapsamında ücret kesme cezası",
"IsActive": true
},
{
"Id": "d15c0001-0000-4000-8000-000000000006",
"Name": "Fesih",
"Severity": 5,
"Description": "İş sözleşmesinin feshi",
"IsActive": true
}
]
}

View file

@ -0,0 +1,85 @@
{
"ListFormCode": "App.Hr.ExpenseType",
"KeyFieldName": "Id",
"GeneratedAt": "2026-10-03T19:44:21.821095Z",
"Order": 0,
"Rows": [
{
"Code": "Meal",
"Name": "Yemek",
"DefaultAmount": null,
"CurrencyId": "TRY",
"IsTaxable": false,
"IsSgkSubject": false,
"RequiresReceipt": true,
"IsActive": true,
"Id": "a4ad0e7b-254b-5de0-b8fe-4af9c94f967e"
},
{
"Code": "Travel",
"Name": "Yol / Ulaşım",
"DefaultAmount": null,
"CurrencyId": "TRY",
"IsTaxable": false,
"IsSgkSubject": false,
"RequiresReceipt": true,
"IsActive": true,
"Id": "2ab990cb-0de4-5ce6-b226-38c3b17af848"
},
{
"Code": "Accommodation",
"Name": "Konaklama",
"DefaultAmount": null,
"CurrencyId": "TRY",
"IsTaxable": false,
"IsSgkSubject": false,
"RequiresReceipt": true,
"IsActive": true,
"Id": "52e29637-a3af-5396-b388-f3a0bd4818a1"
},
{
"Code": "Fuel",
"Name": "Akaryakıt",
"DefaultAmount": null,
"CurrencyId": "TRY",
"IsTaxable": false,
"IsSgkSubject": false,
"RequiresReceipt": true,
"IsActive": true,
"Id": "901455e5-4b18-51b3-9b52-50cd208d7958"
},
{
"Code": "Phone",
"Name": "Telefon",
"DefaultAmount": null,
"CurrencyId": "TRY",
"IsTaxable": false,
"IsSgkSubject": false,
"RequiresReceipt": true,
"IsActive": true,
"Id": "b393fe25-2065-5043-bc59-40d11be8ba85"
},
{
"Code": "Hospitality",
"Name": "Temsil / Ağırlama",
"DefaultAmount": null,
"CurrencyId": "TRY",
"IsTaxable": false,
"IsSgkSubject": false,
"RequiresReceipt": true,
"IsActive": true,
"Id": "eebe1915-715b-53bd-b5f3-340d3e413c1c"
},
{
"Code": "Office",
"Name": "Kırtasiye / Ofis",
"DefaultAmount": null,
"CurrencyId": "TRY",
"IsTaxable": false,
"IsSgkSubject": false,
"RequiresReceipt": true,
"IsActive": true,
"Id": "902475f9-32bc-52bb-a15e-8a177e1925f6"
}
]
}

View file

@ -0,0 +1,116 @@
{
"ListFormCode": "App.Hr.LeaveType",
"KeyFieldName": "Id",
"GeneratedAt": "2026-10-03T19:28:39.127058Z",
"Order": 0,
"Rows": [
{
"Code": "Annual",
"Name": "Yıllık İzin",
"Gender": "All",
"MaxDaysPerYear": null,
"IsPaid": true,
"DeductsFromAnnualLeave": true,
"RequiresDocument": false,
"AllowHalfDay": true,
"IsActive": true,
"Id": "08615087-48ee-5cc2-b32b-1178fff77593"
},
{
"Code": "Excuse",
"Name": "Mazeret İzni",
"Gender": "All",
"MaxDaysPerYear": null,
"IsPaid": true,
"DeductsFromAnnualLeave": false,
"RequiresDocument": false,
"AllowHalfDay": true,
"IsActive": true,
"Id": "986f9678-1b46-5197-844d-16bf772a343a"
},
{
"Code": "Unpaid",
"Name": "Ücretsiz İzin",
"Gender": "All",
"MaxDaysPerYear": null,
"IsPaid": false,
"DeductsFromAnnualLeave": false,
"RequiresDocument": false,
"AllowHalfDay": true,
"IsActive": true,
"Id": "030adbff-8bff-51ac-8cc0-07496a616c91"
},
{
"Code": "Sick",
"Name": "Hastalık İzni (Rapor)",
"Gender": "All",
"MaxDaysPerYear": null,
"IsPaid": false,
"DeductsFromAnnualLeave": false,
"RequiresDocument": true,
"AllowHalfDay": false,
"IsActive": true,
"Id": "3b82ab6e-d846-583d-afc6-59cc97ba4a21"
},
{
"Code": "Maternity",
"Name": "Doğum İzni",
"Gender": "Female",
"MaxDaysPerYear": 112,
"IsPaid": false,
"DeductsFromAnnualLeave": false,
"RequiresDocument": true,
"AllowHalfDay": false,
"IsActive": true,
"Id": "7e391128-01b3-58a3-911a-fc300960ae2b"
},
{
"Code": "Paternity",
"Name": "Babalık İzni",
"Gender": "Male",
"MaxDaysPerYear": 5,
"IsPaid": true,
"DeductsFromAnnualLeave": false,
"RequiresDocument": true,
"AllowHalfDay": false,
"IsActive": true,
"Id": "2caac0cf-91b9-5693-bb30-dcfca42e33c9"
},
{
"Code": "Marriage",
"Name": "Evlilik İzni",
"Gender": "All",
"MaxDaysPerYear": 3,
"IsPaid": true,
"DeductsFromAnnualLeave": false,
"RequiresDocument": true,
"AllowHalfDay": false,
"IsActive": true,
"Id": "b744305a-d519-5b6a-8bfe-f7dae3d7c76f"
},
{
"Code": "Bereavement",
"Name": "Ölüm İzni",
"Gender": "All",
"MaxDaysPerYear": 3,
"IsPaid": true,
"DeductsFromAnnualLeave": false,
"RequiresDocument": true,
"AllowHalfDay": false,
"IsActive": true,
"Id": "5f61e945-848b-57ab-a266-9b3ef76b58b5"
},
{
"Code": "Nursing",
"Name": "Süt İzni",
"Gender": "Female",
"MaxDaysPerYear": null,
"IsPaid": true,
"DeductsFromAnnualLeave": false,
"RequiresDocument": false,
"AllowHalfDay": true,
"IsActive": true,
"Id": "77df8125-8af7-5d2e-89b3-084e23d5a4e8"
}
]
}

View file

@ -8,6 +8,9 @@
"Name": "Sabah", "Name": "Sabah",
"StartTime": "08:00", "StartTime": "08:00",
"EndTime": "16:00", "EndTime": "16:00",
"BreakMinutes": 30,
"WorkingHours": 7.5,
"IsNightShift": false,
"IsActive": true, "IsActive": true,
"Id": "df1b7d79-07a5-4afd-5c2c-3a240eae2c48" "Id": "df1b7d79-07a5-4afd-5c2c-3a240eae2c48"
}, },
@ -15,6 +18,9 @@
"Name": "Akşam", "Name": "Akşam",
"StartTime": "16:00", "StartTime": "16:00",
"EndTime": "00:00", "EndTime": "00:00",
"BreakMinutes": 30,
"WorkingHours": 7.5,
"IsNightShift": false,
"IsActive": true, "IsActive": true,
"Id": "72968eb6-c7b5-1ab2-942b-3a240eae2c49" "Id": "72968eb6-c7b5-1ab2-942b-3a240eae2c49"
}, },
@ -22,6 +28,9 @@
"Name": "Gece", "Name": "Gece",
"StartTime": "00:00", "StartTime": "00:00",
"EndTime": "08:00", "EndTime": "08:00",
"BreakMinutes": 30,
"WorkingHours": 7.5,
"IsNightShift": true,
"IsActive": true, "IsActive": true,
"Id": "6d625cbb-aec9-4edf-86d2-3a240eae2c49" "Id": "6d625cbb-aec9-4edf-86d2-3a240eae2c49"
} }

View file

@ -0,0 +1,168 @@
{
"ListFormCode": "App.Hr.WorkCalendar",
"KeyFieldName": "Id",
"GeneratedAt": "2026-10-03T19:54:48.143680Z",
"Order": 0,
"Rows": [
{
"Name": "Yılbaşı",
"StartDate": "2026-01-01",
"EndDate": "2026-01-01",
"AllDay": true,
"DayType": "Holiday",
"RecurrenceRule": "FREQ=YEARLY",
"IsActive": true,
"Id": "11cd25b7-b1e2-5888-9965-a007c301dfc5"
},
{
"Name": "Ulusal Egemenlik ve Çocuk Bayramı",
"StartDate": "2026-04-23",
"EndDate": "2026-04-23",
"AllDay": true,
"DayType": "Holiday",
"RecurrenceRule": "FREQ=YEARLY",
"IsActive": true,
"Id": "3fb2e8bf-673d-56ce-ba50-758ccce5d530"
},
{
"Name": "Emek ve Dayanışma Günü",
"StartDate": "2026-05-01",
"EndDate": "2026-05-01",
"AllDay": true,
"DayType": "Holiday",
"RecurrenceRule": "FREQ=YEARLY",
"IsActive": true,
"Id": "017e6ebb-c07c-5d8f-ac83-c5e9b32ec1e4"
},
{
"Name": "Atatürk'ü Anma, Gençlik ve Spor Bayramı",
"StartDate": "2026-05-19",
"EndDate": "2026-05-19",
"AllDay": true,
"DayType": "Holiday",
"RecurrenceRule": "FREQ=YEARLY",
"IsActive": true,
"Id": "71ed5d86-0885-55c8-9298-2896f637c37b"
},
{
"Name": "Demokrasi ve Milli Birlik Günü",
"StartDate": "2026-07-15",
"EndDate": "2026-07-15",
"AllDay": true,
"DayType": "Holiday",
"RecurrenceRule": "FREQ=YEARLY",
"IsActive": true,
"Id": "d95f41cf-247e-5c43-98c7-a9db842ced44"
},
{
"Name": "Zafer Bayramı",
"StartDate": "2026-08-30",
"EndDate": "2026-08-30",
"AllDay": true,
"DayType": "Holiday",
"RecurrenceRule": "FREQ=YEARLY",
"IsActive": true,
"Id": "c4c0290c-d8dd-5b8b-a6ec-f2954d3a4964"
},
{
"Name": "Cumhuriyet Bayramı Arifesi",
"StartDate": "2026-10-28",
"EndDate": "2026-10-28",
"AllDay": true,
"DayType": "HalfDay",
"RecurrenceRule": "FREQ=YEARLY",
"IsActive": true,
"Id": "3cbfe8b4-ee8a-5220-8c91-b4be7286e2f7"
},
{
"Name": "Cumhuriyet Bayramı",
"StartDate": "2026-10-29",
"EndDate": "2026-10-29",
"AllDay": true,
"DayType": "Holiday",
"RecurrenceRule": "FREQ=YEARLY",
"IsActive": true,
"Id": "e128e4cc-657f-57d2-94a8-675772104dcc"
},
{
"Name": "Ramazan Bayramı Arifesi",
"StartDate": "2026-03-19",
"EndDate": "2026-03-19",
"AllDay": true,
"DayType": "HalfDay",
"RecurrenceRule": "",
"IsActive": true,
"Id": "1ac9a647-3fbb-514b-951c-5fa4cbe13893"
},
{
"Name": "Ramazan Bayramı",
"StartDate": "2026-03-20",
"EndDate": "2026-03-22",
"AllDay": true,
"DayType": "Holiday",
"RecurrenceRule": "",
"IsActive": true,
"Id": "0a53e9e2-10a2-5a75-9fbb-71705795d049"
},
{
"Name": "Kurban Bayramı Arifesi",
"StartDate": "2026-05-26",
"EndDate": "2026-05-26",
"AllDay": true,
"DayType": "HalfDay",
"RecurrenceRule": "",
"IsActive": true,
"Id": "e2d70ebd-6bdd-57b7-ab9f-8d280882ec71"
},
{
"Name": "Kurban Bayramı",
"StartDate": "2026-05-27",
"EndDate": "2026-05-30",
"AllDay": true,
"DayType": "Holiday",
"RecurrenceRule": "",
"IsActive": true,
"Id": "d720ee58-f8c2-51e4-8fa8-454337df6f20"
},
{
"Name": "Ramazan Bayramı Arifesi",
"StartDate": "2027-03-08",
"EndDate": "2027-03-08",
"AllDay": true,
"DayType": "HalfDay",
"RecurrenceRule": "",
"IsActive": true,
"Id": "819f41b0-a41a-5c22-a959-83a407da2da5"
},
{
"Name": "Ramazan Bayramı",
"StartDate": "2027-03-09",
"EndDate": "2027-03-11",
"AllDay": true,
"DayType": "Holiday",
"RecurrenceRule": "",
"IsActive": true,
"Id": "8933fa1a-75e4-5b0e-bc00-2e18668bc395"
},
{
"Name": "Kurban Bayramı Arifesi",
"StartDate": "2027-05-15",
"EndDate": "2027-05-15",
"AllDay": true,
"DayType": "HalfDay",
"RecurrenceRule": "",
"IsActive": true,
"Id": "83a1d3f5-9046-5e73-9f1d-fa92740ce377"
},
{
"Name": "Kurban Bayramı",
"StartDate": "2027-05-16",
"EndDate": "2027-05-19",
"AllDay": true,
"DayType": "Holiday",
"RecurrenceRule": "",
"IsActive": true,
"Id": "3667a85c-8165-5a9e-a73c-527dc0db49e2"
}
]
}

File diff suppressed because it is too large Load diff

View file

@ -1388,7 +1388,7 @@
"Id": "9b1449bd-d898-43fb-96e0-50ab865b7072", "Id": "9b1449bd-d898-43fb-96e0-50ab865b7072",
"Code": "App.Hr.OrgChart", "Code": "App.Hr.OrgChart",
"DisplayName": "App.Hr.OrgChart", "DisplayName": "App.Hr.OrgChart",
"Order": 3, "Order": 4,
"Url": "/admin/organization", "Url": "/admin/organization",
"Icon": "FaSitemap", "Icon": "FaSitemap",
"ParentCode": "App.Hr", "ParentCode": "App.Hr",
@ -1478,7 +1478,7 @@
"Id": "ae8c7c61-8b57-4335-bacb-d54bcce3d661", "Id": "ae8c7c61-8b57-4335-bacb-d54bcce3d661",
"Code": "App.Hr.Visitor", "Code": "App.Hr.Visitor",
"DisplayName": "App.Hr.Visitor", "DisplayName": "App.Hr.Visitor",
"Order": 7, "Order": 8,
"Url": "/admin/list/App.Hr.Visitor", "Url": "/admin/list/App.Hr.Visitor",
"Icon": "FcBusinessman", "Icon": "FcBusinessman",
"ParentCode": "App.Hr", "ParentCode": "App.Hr",
@ -1493,7 +1493,7 @@
"Id": "8803f8c5-e85b-491d-9330-a9dd5a95f1a1", "Id": "8803f8c5-e85b-491d-9330-a9dd5a95f1a1",
"Code": "App.Hr.HealthCard", "Code": "App.Hr.HealthCard",
"DisplayName": "App.Hr.HealthCard", "DisplayName": "App.Hr.HealthCard",
"Order": 4, "Order": 5,
"Url": "/admin/list/App.Hr.HealthCard", "Url": "/admin/list/App.Hr.HealthCard",
"Icon": "FcInspection", "Icon": "FcInspection",
"ParentCode": "App.Hr", "ParentCode": "App.Hr",
@ -1508,7 +1508,7 @@
"Id": "aa47dc14-483f-41ad-83f5-f304050db135", "Id": "aa47dc14-483f-41ad-83f5-f304050db135",
"Code": "App.Hr.Trainings", "Code": "App.Hr.Trainings",
"DisplayName": "App.Hr.Trainings", "DisplayName": "App.Hr.Trainings",
"Order": 5, "Order": 6,
"Url": null, "Url": null,
"Icon": "FcGraduationCap", "Icon": "FcGraduationCap",
"ParentCode": "App.Hr", "ParentCode": "App.Hr",
@ -1568,7 +1568,7 @@
"Id": "18146db0-b2aa-49d8-b39c-0165a1d85e53", "Id": "18146db0-b2aa-49d8-b39c-0165a1d85e53",
"Code": "App.Hr.Vehicles", "Code": "App.Hr.Vehicles",
"DisplayName": "App.Hr.Vehicles", "DisplayName": "App.Hr.Vehicles",
"Order": 6, "Order": 7,
"Url": null, "Url": null,
"Icon": "FcAutomotive", "Icon": "FcAutomotive",
"ParentCode": "App.Hr", "ParentCode": "App.Hr",
@ -1688,7 +1688,7 @@
"Id": "0f1b3f0c-f9d8-4f09-9506-59fb19272176", "Id": "0f1b3f0c-f9d8-4f09-9506-59fb19272176",
"Code": "App.Hr.Shift", "Code": "App.Hr.Shift",
"DisplayName": "App.Hr.Shift", "DisplayName": "App.Hr.Shift",
"Order": 2, "Order": 3,
"Url": "/admin/list/App.Hr.Shift", "Url": "/admin/list/App.Hr.Shift",
"Icon": "FcClock", "Icon": "FcClock",
"ParentCode": "App.Hr", "ParentCode": "App.Hr",
@ -1703,7 +1703,7 @@
"Id": "5786d92e-0501-4775-bf1b-697a41a90f40", "Id": "5786d92e-0501-4775-bf1b-697a41a90f40",
"Code": "App.Hr.EventLog", "Code": "App.Hr.EventLog",
"DisplayName": "App.Hr.EventLog", "DisplayName": "App.Hr.EventLog",
"Order": 8, "Order": 9,
"Url": "/admin/list/App.Hr.EventLog", "Url": "/admin/list/App.Hr.EventLog",
"Icon": "FcViewDetails", "Icon": "FcViewDetails",
"ParentCode": "App.Hr", "ParentCode": "App.Hr",
@ -1718,7 +1718,7 @@
"Id": "aaef98c6-ab15-4097-9d32-d611db7de57d", "Id": "aaef98c6-ab15-4097-9d32-d611db7de57d",
"Code": "App.Hr.Intranet", "Code": "App.Hr.Intranet",
"DisplayName": "App.Hr.Intranet", "DisplayName": "App.Hr.Intranet",
"Order": 9, "Order": 10,
"Url": null, "Url": null,
"Icon": "FcConferenceCall", "Icon": "FcConferenceCall",
"ParentCode": "App.Hr", "ParentCode": "App.Hr",
@ -1833,6 +1833,96 @@
"IsDisabled": false, "IsDisabled": false,
"ElementId": null, "ElementId": null,
"ModuleId": "Hr" "ModuleId": "Hr"
},
{
"Id": "ee299353-fc0d-5a4b-b766-fd3729feb196",
"Code": "App.Hr.LeaveType",
"DisplayName": "App.Hr.LeaveType",
"Order": 9,
"Url": "/admin/list/App.Hr.LeaveType",
"Icon": "FcPlanner",
"ParentCode": "App.Hr.Definitions",
"RequiredPermissionName": "App.Hr.LeaveType",
"CssClass": null,
"Target": null,
"IsDisabled": false,
"ElementId": null,
"ModuleId": "Hr"
},
{
"Id": "ef40a47d-2d4a-5f21-b6a2-c70c078a7b0d",
"Code": "App.Hr.ExpenseType",
"DisplayName": "App.Hr.ExpenseType",
"Order": 10,
"Url": "/admin/list/App.Hr.ExpenseType",
"Icon": "FcMoneyTransfer",
"ParentCode": "App.Hr.Definitions",
"RequiredPermissionName": "App.Hr.ExpenseType",
"CssClass": null,
"Target": null,
"IsDisabled": false,
"ElementId": null,
"ModuleId": "Hr"
},
{
"Id": "479a8e6f-ffca-56aa-af6d-584b231459ca",
"Code": "App.Hr.BenefitType",
"DisplayName": "App.Hr.BenefitType",
"Order": 11,
"Url": "/admin/list/App.Hr.BenefitType",
"Icon": "FcDonate",
"ParentCode": "App.Hr.Definitions",
"RequiredPermissionName": "App.Hr.BenefitType",
"CssClass": null,
"Target": null,
"IsDisabled": false,
"ElementId": null,
"ModuleId": "Hr"
},
{
"Id": "f35eff0e-a0d8-5f4c-8b34-4bd3e6ffb9c5",
"Code": "App.Hr.WorkCalendar",
"DisplayName": "App.Hr.WorkCalendar",
"Order": 2,
"Url": "/admin/list/App.Hr.WorkCalendar",
"Icon": "FcCalendar",
"ParentCode": "App.Hr",
"RequiredPermissionName": "App.Hr.WorkCalendar",
"CssClass": null,
"Target": null,
"IsDisabled": false,
"ElementId": null,
"ModuleId": "Hr"
},
{
"Id": "76a5d279-bbc1-564d-9430-fe068da2a396",
"Code": "App.Hr.DisciplinaryPenaltyType",
"DisplayName": "App.Hr.DisciplinaryPenaltyType",
"Order": 12,
"Url": "/admin/list/App.Hr.DisciplinaryPenaltyType",
"Icon": "FcList",
"ParentCode": "App.Hr.Definitions",
"RequiredPermissionName": "App.Hr.DisciplinaryPenaltyType",
"CssClass": null,
"Target": null,
"IsDisabled": false,
"ElementId": null,
"ModuleId": "Hr"
},
{
"Id": "1a81c7be-ef52-5332-8118-0e83b9bb49e1",
"Code": "App.Hr.DisciplinaryCase",
"DisplayName": "App.Hr.DisciplinaryCase",
"Order": 11,
"Url": "/admin/list/App.Hr.DisciplinaryCase",
"Icon": "FcHighPriority",
"ParentCode": "App.Hr",
"RequiredPermissionName": "App.Hr.DisciplinaryCase",
"CssClass": null,
"Target": null,
"IsDisabled": false,
"ElementId": null,
"ModuleId": "Hr"
} }
] ]
} }

View file

@ -0,0 +1,27 @@
IF OBJECT_ID(N'[dbo].[Hr_T_BenefitType]', 'U') IS NULL
BEGIN
CREATE TABLE [dbo].[Hr_T_BenefitType]
(
[Id] uniqueidentifier NOT NULL DEFAULT NEWID(),
[TenantId] uniqueidentifier NULL,
[Code] nvarchar(32) NOT NULL,
[Name] nvarchar(128) NOT NULL,
[DefaultAmount] decimal(18,2) NULL,
[CurrencyId] nvarchar(64) NULL,
[IsTaxable] bit NOT NULL DEFAULT 0,
[IsSgkSubject] bit NOT NULL DEFAULT 0,
[IsActive] bit NOT NULL DEFAULT 1,
[CreationTime] datetime2 NOT NULL DEFAULT GETUTCDATE(),
[CreatorId] uniqueidentifier NULL,
[LastModificationTime] datetime2 NULL,
[LastModifierId] uniqueidentifier NULL,
[IsDeleted] bit NOT NULL DEFAULT 0,
[DeletionTime] datetime2 NULL,
[DeleterId] uniqueidentifier NULL,
CONSTRAINT [PK_Hr_T_BenefitType] PRIMARY KEY NONCLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
END
GO

View file

@ -0,0 +1,32 @@
IF OBJECT_ID(N'[dbo].[Hr_T_DisciplinaryCase]', 'U') IS NULL
BEGIN
CREATE TABLE [dbo].[Hr_T_DisciplinaryCase]
(
[Id] uniqueidentifier NOT NULL DEFAULT NEWID(),
[TenantId] uniqueidentifier NULL,
[CaseNo] nvarchar(32) NULL,
[UserId] uniqueidentifier NOT NULL,
[DepartmentId] uniqueidentifier NULL,
[JobPositionId] uniqueidentifier NULL,
[IncidentDate] date NOT NULL,
[IncidentTime] datetime NULL,
[IncidentPlace] nvarchar(256) NULL,
[Subject] nvarchar(256) NOT NULL,
[IncidentDescription] nvarchar(MAX) NOT NULL,
[WitnessUserIds] nvarchar(MAX) NULL,
[ReportedById] uniqueidentifier NULL,
[Status] nvarchar(32) NOT NULL DEFAULT 'Open',
[CreationTime] datetime2 NOT NULL DEFAULT GETUTCDATE(),
[CreatorId] uniqueidentifier NULL,
[LastModificationTime] datetime2 NULL,
[LastModifierId] uniqueidentifier NULL,
[IsDeleted] bit NOT NULL DEFAULT 0,
[DeletionTime] datetime2 NULL,
[DeleterId] uniqueidentifier NULL,
CONSTRAINT [PK_Hr_T_DisciplinaryCase] PRIMARY KEY NONCLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
END
GO

View file

@ -0,0 +1,28 @@
IF OBJECT_ID(N'[dbo].[Hr_T_DisciplinaryDecision]', 'U') IS NULL
BEGIN
CREATE TABLE [dbo].[Hr_T_DisciplinaryDecision]
(
[Id] uniqueidentifier NOT NULL DEFAULT NEWID(),
[TenantId] uniqueidentifier NULL,
[CaseId] uniqueidentifier NOT NULL,
[DecisionDate] date NOT NULL,
[PenaltyTypeId] uniqueidentifier NOT NULL,
[EffectiveDate] date NULL,
[NotificationDate] date NULL,
[DeductionAmount] decimal(18, 4) NULL,
[DecisionText] nvarchar(MAX) NULL,
[Status] nvarchar(32) NOT NULL DEFAULT 'Draft',
[CreationTime] datetime2 NOT NULL DEFAULT GETUTCDATE(),
[CreatorId] uniqueidentifier NULL,
[LastModificationTime] datetime2 NULL,
[LastModifierId] uniqueidentifier NULL,
[IsDeleted] bit NOT NULL DEFAULT 0,
[DeletionTime] datetime2 NULL,
[DeleterId] uniqueidentifier NULL,
CONSTRAINT [PK_Hr_T_DisciplinaryDecision] PRIMARY KEY NONCLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
END
GO

View file

@ -0,0 +1,26 @@
IF OBJECT_ID(N'[dbo].[Hr_T_DisciplinaryDefense]', 'U') IS NULL
BEGIN
CREATE TABLE [dbo].[Hr_T_DisciplinaryDefense]
(
[Id] uniqueidentifier NOT NULL DEFAULT NEWID(),
[TenantId] uniqueidentifier NULL,
[CaseId] uniqueidentifier NOT NULL,
[RequestDate] date NOT NULL,
[DueDate] date NOT NULL,
[ResponseDate] date NULL,
[DefenseText] nvarchar(MAX) NULL,
[Status] nvarchar(32) NOT NULL DEFAULT 'Requested',
[CreationTime] datetime2 NOT NULL DEFAULT GETUTCDATE(),
[CreatorId] uniqueidentifier NULL,
[LastModificationTime] datetime2 NULL,
[LastModifierId] uniqueidentifier NULL,
[IsDeleted] bit NOT NULL DEFAULT 0,
[DeletionTime] datetime2 NULL,
[DeleterId] uniqueidentifier NULL,
CONSTRAINT [PK_Hr_T_DisciplinaryDefense] PRIMARY KEY NONCLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
END
GO

View file

@ -0,0 +1,25 @@
IF OBJECT_ID(N'[dbo].[Hr_T_DisciplinaryFile]', 'U') IS NULL
BEGIN
CREATE TABLE [dbo].[Hr_T_DisciplinaryFile]
(
[Id] uniqueidentifier NOT NULL DEFAULT NEWID(),
[TenantId] uniqueidentifier NULL,
[CaseId] uniqueidentifier NOT NULL,
[DocumentTypeId] uniqueidentifier NULL,
[FileDate] date NOT NULL,
[FileName] nvarchar(256) NOT NULL,
[FileContent] nvarchar(MAX) NOT NULL,
[CreationTime] datetime2 NOT NULL DEFAULT GETUTCDATE(),
[CreatorId] uniqueidentifier NULL,
[LastModificationTime] datetime2 NULL,
[LastModifierId] uniqueidentifier NULL,
[IsDeleted] bit NOT NULL DEFAULT 0,
[DeletionTime] datetime2 NULL,
[DeleterId] uniqueidentifier NULL,
CONSTRAINT [PK_Hr_T_DisciplinaryFile] PRIMARY KEY NONCLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
END
GO

View file

@ -0,0 +1,24 @@
IF OBJECT_ID(N'[dbo].[Hr_T_DisciplinaryPenaltyType]', 'U') IS NULL
BEGIN
CREATE TABLE [dbo].[Hr_T_DisciplinaryPenaltyType]
(
[Id] uniqueidentifier NOT NULL DEFAULT NEWID(),
[TenantId] uniqueidentifier NULL,
[Name] nvarchar(128) NOT NULL,
[Severity] int NOT NULL DEFAULT 1,
[Description] nvarchar(512) NULL,
[IsActive] bit NOT NULL DEFAULT 1,
[CreationTime] datetime2 NOT NULL DEFAULT GETUTCDATE(),
[CreatorId] uniqueidentifier NULL,
[LastModificationTime] datetime2 NULL,
[LastModifierId] uniqueidentifier NULL,
[IsDeleted] bit NOT NULL DEFAULT 0,
[DeletionTime] datetime2 NULL,
[DeleterId] uniqueidentifier NULL,
CONSTRAINT [PK_Hr_T_DisciplinaryPenaltyType] PRIMARY KEY NONCLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
END
GO

View file

@ -0,0 +1,28 @@
IF OBJECT_ID(N'[dbo].[Hr_T_ExpenseType]', 'U') IS NULL
BEGIN
CREATE TABLE [dbo].[Hr_T_ExpenseType]
(
[Id] uniqueidentifier NOT NULL DEFAULT NEWID(),
[TenantId] uniqueidentifier NULL,
[Code] nvarchar(32) NOT NULL,
[Name] nvarchar(128) NOT NULL,
[DefaultAmount] decimal(18,2) NULL,
[CurrencyId] nvarchar(64) NULL,
[IsTaxable] bit NOT NULL DEFAULT 0,
[IsSgkSubject] bit NOT NULL DEFAULT 0,
[RequiresReceipt] bit NOT NULL DEFAULT 0,
[IsActive] bit NOT NULL DEFAULT 1,
[CreationTime] datetime2 NOT NULL DEFAULT GETUTCDATE(),
[CreatorId] uniqueidentifier NULL,
[LastModificationTime] datetime2 NULL,
[LastModifierId] uniqueidentifier NULL,
[IsDeleted] bit NOT NULL DEFAULT 0,
[DeletionTime] datetime2 NULL,
[DeleterId] uniqueidentifier NULL,
CONSTRAINT [PK_Hr_T_ExpenseType] PRIMARY KEY NONCLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
END
GO

View file

@ -0,0 +1,29 @@
IF OBJECT_ID(N'[dbo].[Hr_T_LeaveType]', 'U') IS NULL
BEGIN
CREATE TABLE [dbo].[Hr_T_LeaveType]
(
[Id] uniqueidentifier NOT NULL DEFAULT NEWID(),
[TenantId] uniqueidentifier NULL,
[Code] nvarchar(32) NOT NULL,
[Name] nvarchar(128) NOT NULL,
[Gender] nvarchar(16) NOT NULL DEFAULT 'All',
[MaxDaysPerYear] int NULL,
[IsPaid] bit NOT NULL DEFAULT 1,
[DeductsFromAnnualLeave] bit NOT NULL DEFAULT 0,
[RequiresDocument] bit NOT NULL DEFAULT 0,
[AllowHalfDay] bit NOT NULL DEFAULT 0,
[IsActive] bit NOT NULL DEFAULT 1,
[CreationTime] datetime2 NOT NULL DEFAULT GETUTCDATE(),
[CreatorId] uniqueidentifier NULL,
[LastModificationTime] datetime2 NULL,
[LastModifierId] uniqueidentifier NULL,
[IsDeleted] bit NOT NULL DEFAULT 0,
[DeletionTime] datetime2 NULL,
[DeleterId] uniqueidentifier NULL,
CONSTRAINT [PK_Hr_T_LeaveType] PRIMARY KEY NONCLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
END
GO

View file

@ -7,6 +7,9 @@ BEGIN
[Name] nvarchar(64) NOT NULL, [Name] nvarchar(64) NOT NULL,
[StartTime] nvarchar(5) NULL, [StartTime] nvarchar(5) NULL,
[EndTime] nvarchar(5) NULL, [EndTime] nvarchar(5) NULL,
[BreakMinutes] int NULL,
[WorkingHours] decimal(5,2) NULL,
[IsNightShift] bit NOT NULL DEFAULT 0,
[IsActive] bit NOT NULL DEFAULT 1, [IsActive] bit NOT NULL DEFAULT 1,
[CreationTime] datetime2 NOT NULL DEFAULT GETUTCDATE(), [CreationTime] datetime2 NOT NULL DEFAULT GETUTCDATE(),
[CreatorId] uniqueidentifier NULL, [CreatorId] uniqueidentifier NULL,

View file

@ -0,0 +1,27 @@
IF OBJECT_ID(N'[dbo].[Hr_T_WorkCalendar]', 'U') IS NULL
BEGIN
CREATE TABLE [dbo].[Hr_T_WorkCalendar]
(
[Id] uniqueidentifier NOT NULL DEFAULT NEWID(),
[TenantId] uniqueidentifier NULL,
[Name] nvarchar(128) NOT NULL,
[StartDate] date NOT NULL,
[EndDate] date NOT NULL,
[AllDay] bit NOT NULL DEFAULT 1,
[DayType] nvarchar(16) NOT NULL DEFAULT 'Holiday',
[RecurrenceRule] nvarchar(256) NULL,
[IsActive] bit NOT NULL DEFAULT 1,
[CreationTime] datetime2 NOT NULL DEFAULT GETUTCDATE(),
[CreatorId] uniqueidentifier NULL,
[LastModificationTime] datetime2 NULL,
[LastModifierId] uniqueidentifier NULL,
[IsDeleted] bit NOT NULL DEFAULT 0,
[DeletionTime] datetime2 NULL,
[DeleterId] uniqueidentifier NULL,
CONSTRAINT [PK_Hr_T_WorkCalendar] PRIMARY KEY NONCLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
END
GO

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -62,6 +62,24 @@
"En": "End Time", "En": "End Time",
"Tr": "Bitiş Saati" "Tr": "Bitiş Saati"
}, },
{
"FieldName": "BreakMinutes",
"CaptionName": "App.Listform.ListformField.BreakMinutes",
"En": "Break (min)",
"Tr": "Mola (dk)"
},
{
"FieldName": "WorkingHours",
"CaptionName": "App.Listform.ListformField.WorkingHours",
"En": "Working Hours",
"Tr": "Çalışma Süresi (Saat)"
},
{
"FieldName": "IsNightShift",
"CaptionName": "App.Listform.ListformField.IsNightShift",
"En": "Night Shift",
"Tr": "Gece Vardiyası"
},
{ {
"FieldName": "IsActive", "FieldName": "IsActive",
"CaptionName": "App.Listform.ListformField.IsActive", "CaptionName": "App.Listform.ListformField.IsActive",
@ -141,7 +159,22 @@
"UpdateBeforeCommand": null, "UpdateBeforeCommand": null,
"UpdateAfterCommand": null, "UpdateAfterCommand": null,
"UpdateFieldsDefaultValueDto": [], "UpdateFieldsDefaultValueDto": [],
"FormFieldsDefaultValueDto": [], "FormFieldsDefaultValueDto": [
{
"FieldName": "IsNightShift",
"FieldDbType": 3,
"Value": "false",
"CustomValueType": 1,
"SqlQuery": ""
},
{
"FieldName": "IsActive",
"FieldDbType": 3,
"Value": "true",
"CustomValueType": 1,
"SqlQuery": ""
}
],
"WidgetsDto": [ "WidgetsDto": [
{ {
"ColGap": 3, "ColGap": 3,
@ -343,7 +376,7 @@
"Title": "App.Hr.Shift.Title", "Title": "App.Hr.Shift.Title",
"ShowTitle": true, "ShowTitle": true,
"Width": 800, "Width": 800,
"Height": 275, "Height": 400,
"FullScreen": false, "FullScreen": false,
"HideOnOutsideClick": true, "HideOnOutsideClick": true,
"ResizeEnabled": true, "ResizeEnabled": true,
@ -1206,14 +1239,266 @@
"JoinFieldName2": null, "JoinFieldName2": null,
"BaseTableJoinFieldName2_OrValue": null "BaseTableJoinFieldName2_OrValue": null
}, },
"FieldName": "IsActive", "FieldName": "BreakMinutes",
"CaptionName": "App.Listform.ListformField.IsActive", "CaptionName": "App.Listform.ListformField.BreakMinutes",
"PlaceHolder": null, "PlaceHolder": null,
"ReadOnly": false, "ReadOnly": false,
"Visible": true, "Visible": true,
"IsActive": true, "IsActive": true,
"Width": 0, "Width": 0,
"ListOrderNo": 5, "ListOrderNo": 5,
"SourceDbType": 11,
"CultureName": "en",
"DataType": "number",
"SortIndex": 0,
"SortDirection": null,
"AllowSearch": true,
"AllowEditing": true,
"AllowAdding": true,
"ColumnCssClass": null,
"ColumnCssValue": null,
"BandName": null,
"ColumnFilterDto": {
"AllowFiltering": true,
"FilterOperations": null,
"SelectedFilterOperation": null,
"FilterValue": null
},
"ColumnHeaderDto": {
"AllowHeaderFiltering": true,
"AllowSearch": false,
"DataSource": null,
"DataSourceString": ""
},
"ColumnGroupingDto": {
"AllowGrouping": true,
"GroupIndex": null,
"AutoExpandGroup": false
},
"ColumnCustomizationDto": {
"Fixed": false,
"FixedPosition": "left",
"AllowReordering": true
},
"ColumnTotalSummaryDto": {
"SummaryType": null,
"ValueFormat": null,
"ShowInGroupFooter": false,
"AlignByColumn": false,
"DisplayFormat": null,
"ShowInColumn": null
},
"ColumnGroupSummaryDto": {
"SummaryType": null,
"ValueFormat": null,
"ShowInGroupFooter": false,
"AlignByColumn": false,
"DisplayFormat": null,
"ShowInColumn": null
},
"LookupDto": {
"DataSourceType": 0,
"ValueExpr": "Key",
"DisplayExpr": "Name",
"CascadeRelationField": null,
"CascadeFilterOperator": "=",
"CascadeParentFields": null,
"CascadeEmptyFields": null,
"LookupQuery": null
},
"ValidationRuleDto": [],
"ColumnStylingDto": [],
"PermissionDto": {
"Deny": false,
"C": "App.Hr.Shift.Create",
"R": "App.Hr.Shift",
"U": "App.Hr.Shift.Update",
"E": true,
"I": true
},
"CanRead": false,
"CanCreate": false,
"CanUpdate": false,
"CanExport": false,
"DefaultValue": null,
"DefaultValueType": 0,
"PivotSettingsDto": {
"IsPivot": true,
"Expanded": false,
"SortOrder": "asc",
"Area": "filter",
"Format": null,
"SummaryType": null,
"GroupInterval": "",
"WordWrapEnabled": false
},
"Alignment": "right",
"Format": null,
"EditOrderNo": 4,
"EditGroupOrderNo": 1,
"EditorType2": "dxNumberBox",
"ColSpan": 1,
"EditorOptions": "{\"min\":0,\"showSpinButtons\":true,\"showClearButton\":true}",
"GridBoxOptions": null,
"TagBoxOptions": null,
"ImageUploadOptions": null,
"EditorScript": null,
"LastModificationTime": null,
"LastModifierId": null,
"CreationTime": "0001-01-01T00:00:00",
"CreatorId": null,
"Id": "00000000-0000-0000-0000-000000000000"
},
{
"EditType": null,
"ListFormCode": "App.Hr.Shift",
"RoleId": null,
"UserId": null,
"ColumnJoinTableDto": {
"JoinType": null,
"TableName": null,
"JoinFieldName": null,
"BaseTableJoinFieldName": null,
"SelectFieldName": null,
"FieldNameAlias": null,
"JoinCondition2": "AND",
"JoinFieldName2": null,
"BaseTableJoinFieldName2_OrValue": null
},
"FieldName": "WorkingHours",
"CaptionName": "App.Listform.ListformField.WorkingHours",
"PlaceHolder": null,
"ReadOnly": false,
"Visible": true,
"IsActive": true,
"Width": 0,
"ListOrderNo": 6,
"SourceDbType": 7,
"CultureName": "en",
"DataType": "number",
"SortIndex": 0,
"SortDirection": null,
"AllowSearch": true,
"AllowEditing": true,
"AllowAdding": true,
"ColumnCssClass": null,
"ColumnCssValue": null,
"BandName": null,
"ColumnFilterDto": {
"AllowFiltering": true,
"FilterOperations": null,
"SelectedFilterOperation": null,
"FilterValue": null
},
"ColumnHeaderDto": {
"AllowHeaderFiltering": true,
"AllowSearch": false,
"DataSource": null,
"DataSourceString": ""
},
"ColumnGroupingDto": {
"AllowGrouping": true,
"GroupIndex": null,
"AutoExpandGroup": false
},
"ColumnCustomizationDto": {
"Fixed": false,
"FixedPosition": "left",
"AllowReordering": true
},
"ColumnTotalSummaryDto": {
"SummaryType": null,
"ValueFormat": null,
"ShowInGroupFooter": false,
"AlignByColumn": false,
"DisplayFormat": null,
"ShowInColumn": null
},
"ColumnGroupSummaryDto": {
"SummaryType": null,
"ValueFormat": null,
"ShowInGroupFooter": false,
"AlignByColumn": false,
"DisplayFormat": null,
"ShowInColumn": null
},
"LookupDto": {
"DataSourceType": 0,
"ValueExpr": "Key",
"DisplayExpr": "Name",
"CascadeRelationField": null,
"CascadeFilterOperator": "=",
"CascadeParentFields": null,
"CascadeEmptyFields": null,
"LookupQuery": null
},
"ValidationRuleDto": [],
"ColumnStylingDto": [],
"PermissionDto": {
"Deny": false,
"C": "App.Hr.Shift.Create",
"R": "App.Hr.Shift",
"U": "App.Hr.Shift.Update",
"E": true,
"I": true
},
"CanRead": false,
"CanCreate": false,
"CanUpdate": false,
"CanExport": false,
"DefaultValue": null,
"DefaultValueType": 0,
"PivotSettingsDto": {
"IsPivot": true,
"Expanded": false,
"SortOrder": "asc",
"Area": "filter",
"Format": null,
"SummaryType": null,
"GroupInterval": "",
"WordWrapEnabled": false
},
"Alignment": "right",
"Format": null,
"EditOrderNo": 5,
"EditGroupOrderNo": 1,
"EditorType2": "dxNumberBox",
"ColSpan": 1,
"EditorOptions": "{\"min\":0,\"max\":24,\"showClearButton\":true,\"format\":{\"type\":\"fixedPoint\",\"precision\":2}}",
"GridBoxOptions": null,
"TagBoxOptions": null,
"ImageUploadOptions": null,
"EditorScript": null,
"LastModificationTime": null,
"LastModifierId": null,
"CreationTime": "0001-01-01T00:00:00",
"CreatorId": null,
"Id": "00000000-0000-0000-0000-000000000000"
},
{
"EditType": null,
"ListFormCode": "App.Hr.Shift",
"RoleId": null,
"UserId": null,
"ColumnJoinTableDto": {
"JoinType": null,
"TableName": null,
"JoinFieldName": null,
"BaseTableJoinFieldName": null,
"SelectFieldName": null,
"FieldNameAlias": null,
"JoinCondition2": "AND",
"JoinFieldName2": null,
"BaseTableJoinFieldName2_OrValue": null
},
"FieldName": "IsNightShift",
"CaptionName": "App.Listform.ListformField.IsNightShift",
"PlaceHolder": null,
"ReadOnly": false,
"Visible": true,
"IsActive": true,
"Width": 0,
"ListOrderNo": 7,
"SourceDbType": 3, "SourceDbType": 3,
"CultureName": "en", "CultureName": "en",
"DataType": "boolean", "DataType": "boolean",
@ -1313,7 +1598,145 @@
}, },
"Alignment": null, "Alignment": null,
"Format": null, "Format": null,
"EditOrderNo": 4, "EditOrderNo": 6,
"EditGroupOrderNo": 1,
"EditorType2": "dxCheckBox",
"ColSpan": 1,
"EditorOptions": null,
"GridBoxOptions": null,
"TagBoxOptions": null,
"ImageUploadOptions": null,
"EditorScript": null,
"LastModificationTime": null,
"LastModifierId": null,
"CreationTime": "0001-01-01T00:00:00",
"CreatorId": null,
"Id": "00000000-0000-0000-0000-000000000000"
},
{
"EditType": null,
"ListFormCode": "App.Hr.Shift",
"RoleId": null,
"UserId": null,
"ColumnJoinTableDto": {
"JoinType": null,
"TableName": null,
"JoinFieldName": null,
"BaseTableJoinFieldName": null,
"SelectFieldName": null,
"FieldNameAlias": null,
"JoinCondition2": "AND",
"JoinFieldName2": null,
"BaseTableJoinFieldName2_OrValue": null
},
"FieldName": "IsActive",
"CaptionName": "App.Listform.ListformField.IsActive",
"PlaceHolder": null,
"ReadOnly": false,
"Visible": true,
"IsActive": true,
"Width": 0,
"ListOrderNo": 8,
"SourceDbType": 3,
"CultureName": "en",
"DataType": "boolean",
"SortIndex": 0,
"SortDirection": null,
"AllowSearch": true,
"AllowEditing": true,
"AllowAdding": true,
"ColumnCssClass": null,
"ColumnCssValue": null,
"BandName": null,
"ColumnFilterDto": {
"AllowFiltering": true,
"FilterOperations": null,
"SelectedFilterOperation": null,
"FilterValue": null
},
"ColumnHeaderDto": {
"AllowHeaderFiltering": true,
"AllowSearch": false,
"DataSource": null,
"DataSourceString": ""
},
"ColumnGroupingDto": {
"AllowGrouping": true,
"GroupIndex": null,
"AutoExpandGroup": false
},
"ColumnCustomizationDto": {
"Fixed": false,
"FixedPosition": "left",
"AllowReordering": true
},
"ColumnTotalSummaryDto": {
"SummaryType": null,
"ValueFormat": null,
"ShowInGroupFooter": false,
"AlignByColumn": false,
"DisplayFormat": null,
"ShowInColumn": null
},
"ColumnGroupSummaryDto": {
"SummaryType": null,
"ValueFormat": null,
"ShowInGroupFooter": false,
"AlignByColumn": false,
"DisplayFormat": null,
"ShowInColumn": null
},
"LookupDto": {
"DataSourceType": 0,
"ValueExpr": "Key",
"DisplayExpr": "Name",
"CascadeRelationField": null,
"CascadeFilterOperator": "=",
"CascadeParentFields": null,
"CascadeEmptyFields": null,
"LookupQuery": null
},
"ValidationRuleDto": [
{
"Type": "required",
"Message": null,
"IgnoreEmptyValue": false,
"Reevaluate": true,
"ComparisonType": "",
"Pattern": "",
"Max": null,
"Min": null,
"Trim": true
}
],
"ColumnStylingDto": [],
"PermissionDto": {
"Deny": false,
"C": "App.Hr.Shift.Create",
"R": "App.Hr.Shift",
"U": "App.Hr.Shift.Update",
"E": true,
"I": true
},
"CanRead": false,
"CanCreate": false,
"CanUpdate": false,
"CanExport": false,
"DefaultValue": null,
"DefaultValueType": 0,
"PivotSettingsDto": {
"IsPivot": true,
"Expanded": false,
"SortOrder": "asc",
"Area": "filter",
"Format": null,
"SummaryType": null,
"GroupInterval": "",
"WordWrapEnabled": false
},
"Alignment": null,
"Format": null,
"EditOrderNo": 7,
"EditGroupOrderNo": 1, "EditGroupOrderNo": 1,
"EditorType2": "dxCheckBox", "EditorType2": "dxCheckBox",
"ColSpan": 1, "ColSpan": 1,
@ -1336,7 +1759,10 @@
"App.Hr.Shift", "App.Hr.Shift",
"App.Hr.Shift.Title", "App.Hr.Shift.Title",
"App.Hr.Shift.Desc", "App.Hr.Shift.Desc",
"App.Listform.ListformField.ShiftName" "App.Listform.ListformField.ShiftName",
"App.Listform.ListformField.BreakMinutes",
"App.Listform.ListformField.WorkingHours",
"App.Listform.ListformField.IsNightShift"
], ],
"PermissionGroupNames": [], "PermissionGroupNames": [],
"PermissionNames": [ "PermissionNames": [

File diff suppressed because it is too large Load diff

View file

@ -25,7 +25,8 @@ import { useEffect, useMemo, useState } from 'react'
import PageTitle from '@/components/shared/PageTitle' import PageTitle from '@/components/shared/PageTitle'
import { FaQuestionCircle } from 'react-icons/fa' import { FaQuestionCircle } from 'react-icons/fa'
function getOptions(selectOptions?: Record<string, string>) { // Option labels are stored as language keys; plain-text labels fall back to themselves.
function getOptions(translate: (key: string) => string, selectOptions?: Record<string, string>) {
const options: SelectBoxOption[] = [] const options: SelectBoxOption[] = []
if (!selectOptions) { if (!selectOptions) {
@ -35,7 +36,7 @@ function getOptions(selectOptions?: Record<string, string>) {
Object.entries(selectOptions).forEach(([key, value]) => Object.entries(selectOptions).forEach(([key, value]) =>
options.push({ options.push({
value: key, value: key,
label: value, label: translate('::' + value),
}), }),
) )
@ -182,26 +183,29 @@ const Settings = () => {
<Field type="number" name={setting.code} component={Input} /> <Field type="number" name={setting.code} component={Input} />
)} )}
{setting.dataType === 'Memo' && ( {setting.dataType === 'Memo' && (
<Field type="text" name={setting.code} textArea component={Input} /> <Field textArea type="text" name={setting.code} component={Input} />
)} )}
{setting.dataType === 'Bool' && ( {setting.dataType === 'Bool' && (
<Field name={setting.code} component={Checkbox}></Field> <Field name={setting.code} component={Checkbox}></Field>
)} )}
{setting.dataType === 'List' && ( {setting.dataType === 'List' && (
<Field name={setting.code}> <Field name={setting.code}>
{({ field, form }: FieldProps<any>) => ( {({ field, form }: FieldProps<any>) => {
const options = getOptions(translate, setting.selectOptions)
return (
<Select <Select
field={field} field={field}
form={form} form={form}
options={getOptions(setting.selectOptions)} options={options}
value={getOptions(setting.selectOptions).filter( value={options.filter(
(option) => option.value === values[setting.code], (option) => option.value === values[setting.code],
)} )}
onChange={(option) => onChange={(option) =>
form.setFieldValue(field.name, option?.value) form.setFieldValue(field.name, option?.value)
} }
/> />
)} )
}}
</Field> </Field>
)} )}
</> </>