diff --git a/.github/instructions/ai.instructions.md b/.github/instructions/ai.instructions.md index 331dd63e..759c3795 100644 --- a/.github/instructions/ai.instructions.md +++ b/.github/instructions/ai.instructions.md @@ -19,7 +19,7 @@ Companion documents (this file wins on conflict): | Document | Scope | | --- | --- | | `lowcode.instructions.md` | **Authoring reference**: exact schemas, enum values and worked examples for producing wizard screens, editor scripts, custom components, SQL objects and endpoints. Read it before writing any artifact. | -| `lowcode-reference.instructions.md` | **Capability inventory**: field-by-field contract of every ListForm/ListFormField JSON column, chart and pivot options, SQL command hooks, Visual Designer toolbox, the scheduled-mail module and (§12) every ready-made screen under the Saas and Administration menus. Sweep its §0 checklist before producing a screen or component; a request whose answer already exists as a platform screen (§12.5) is configured there, not rebuilt. | +| `lowcode-reference.instructions.md` | **Capability inventory**: field-by-field contract of every ListForm/ListFormField JSON column, chart and pivot options, SQL command hooks, Visual Designer toolbox, the scheduled-mail module and (§12) every ready-made screen under the Saas, Administration and HR (`App.Hr`) menus. Sweep its §0 checklist before producing a screen or component; a request whose answer already exists as a platform screen (§12.6) is configured there, not rebuilt. | | `dotnet.instructions.md` | Binding code standard for everything under `api/` | | `list.instructions.md` | Step-by-step procedure for adding a module / list through seeders | | `../../README.md` | Technical map: what exists, where it lives, how it is wired | @@ -661,7 +661,7 @@ There are **two seed surfaces**. AI must not mix them. Platform-owned screens, menus, permissions and language texts. Changing them requires a build and a deploy. AI must learn and teach implementation flow primarily from these assets: -- ListFormSeeder_Saas.cs / ListFormSeeder_Administration.cs / ListFormSeeder_{Modul}.cs +- ListFormSeeder_Saas.cs / ListFormSeeder_Administration.cs / ListFormSeeder_Hr.cs / ListFormSeeder_{Modul}.cs - configs/seeds/host/data/App.Languages.{Language,LanguageText}.json — languages and texts (ListForm seed data) - WizardDataSeeder.cs / CrudDataSeeder.cs — the seeders that read surface B below diff --git a/.github/instructions/lowcode-reference.instructions.md b/.github/instructions/lowcode-reference.instructions.md index 81a9b81a..4bbacd9f 100644 --- a/.github/instructions/lowcode-reference.instructions.md +++ b/.github/instructions/lowcode-reference.instructions.md @@ -3,7 +3,7 @@ `lowcode.instructions.md` **nasıl üretileceğini** anlatır; bu dosya **neyin ayarlanabildiğini** tek tek listeler. Orada "bunun bir JSON kolonu var" denen her şeyin alan alan karşılığı burada durur: ListForm/ListFormField'ın tüm JSON kolonları, grafik sözleşmesi, Visual Designer envanteri -ve zamanlanmış e-posta modülü. Son bölüm (§12) Saas ve Administration menülerindeki **hazır +ve zamanlanmış e-posta modülü. Son bölüm (§12) Saas, Administration ve İK (Hr) menülerindeki **hazır gelen bütün ekranları** ve bunların yeni bir komponentte nasıl kullanılacağını listeler. **Kullanım sırası:** `ai.instructions.md` → `lowcode.instructions.md` → **bu dosya** → `README.md`. @@ -51,7 +51,7 @@ ama hiçbirini görmeden bırakma; kullanıcı "şunu da yapabilir miydik?" dedi | # | Katman | Sorulacak soru | Nerede | | --- | --- | --- | --- | -| 0 | **Hazır yetenek** | Bu talebin karşılığı Saas/Administration menüsünde zaten var mı? | §12.5 | +| 0 | **Hazır yetenek** | Bu talebin karşılığı Saas/Administration/İK menüsünde zaten var mı? | §12.6 | | 1 | **Veri** | Tablo/view var mı, join gerekiyor mu, anahtar ve tipi ne? | `lowcode` §8 · §9.6 | | 2 | **Ekran türü** | Liste mi, tek kayıt formu mu, serbest yerleşim mi? Kaç görünüm açılacak? | `lowcode` §0.6.1 · §9.8 · §5.4 | | 3 | **Sütunlar** | Editör tipi, biçim, hizalama, genişlik, band, gizli/aktif | `lowcode` §4.3 · §9.7 | @@ -85,7 +85,7 @@ iki yerdedir: düğüm başına `designerPermission` ve `Form`'un dört komut ye Katmanların çoğunda cevap yeni bir artefakt değil, platformun **hazır bir ekranıdır**: numaratör, bildirim, zamanlanmış iş, rapor, ayar, dil, yetki, şube, kısıt, dosya. Hepsinin envanteri §12'de — -"kod yazmamız gerekir" demeden önce §12.5'e bak. +"kod yazmamız gerekir" demeden önce §12.6'ya bak. --- @@ -468,7 +468,7 @@ denenir. Buraya yazılan kod ekran her açıldığında çalışır ve hiçbir y | `ShowNote` | `true` | Not paneli (alt form ya da iş akışı varsa wizard açar) | `ListFormType = "Form"` listesiz, tek kayıtlık kart ekrandır; canlı örneği Administration › -Licence'tır (§12.6). `Pivot` bir `ListFormType` **değildir** — pivot, `LayoutJson.Pivot` +Licence'tır (§12.7). `Pivot` bir `ListFormType` **değildir** — pivot, `LayoutJson.Pivot` bayrağıyla açılan bir görünümdür ve `/admin/pivot/...` diye bir route yoktur. ### 5.7 Varyantlar @@ -1202,9 +1202,9 @@ gerektirmez. --- -## 12. Saas ve Administration menüleri — platform yetenek kataloğu +## 12. Saas, Administration ve İK menüleri — platform yetenek kataloğu -Bu iki menü, platformun **hazır gelen tüm yeteneklerinin** girişidir. Bir komponent üretirken +Bu üç menü, platformun **hazır gelen tüm yeteneklerinin** girişidir. Bir komponent üretirken buradaki her ekran üç rolden birindedir: - **Yeniden kullanılacak yetenek** — numaratör, bildirim, zamanlanmış iş, rapor, dosya, yetki, @@ -1212,7 +1212,7 @@ buradaki her ekran üç rolden birindedir: - **Veri kaynağı** — ülke/il/ilçe, para birimi, ölçü birimi, departman, ünvan, şube, kullanıcı, rol. Yeni ekranın lookup'ı bu tablolara bağlanır; aynı listeyi tekrar tanımlama. - **Referans uygulama** — istenen davranışın bu uygulamada zaten çalışan bir örneği. Aynı JSON'u - oradan alıp uyarlamak, sıfırdan yazmaktan hem hızlı hem güvenlidir (§12.6). + oradan alıp uyarlamak, sıfırdan yazmaktan hem hızlı hem güvenlidir (§12.7). ### 12.1 Tablo adlandırma sözleşmesi @@ -1224,14 +1224,13 @@ Platform tablolarının adı `TableNameResolver` tarafından üretilir: | Parça | Değerler | | --- | --- | -| Modül ön eki (`MenuPrefix`) | Yalnızca `Sas` (Saas) · `Adm` (Administration). Modüller (`api/modules/*`) kendi `*DbProperties.MenuPrefix` değerini taşır (MailQueue/Settings/Languages `Sas`, Notifications `Adm`) | +| Modül ön eki (`MenuPrefix`) | Yalnızca `Sas` (Saas) · `Adm` (Administration) · `Hr` (İK — `ListFormSeeder_Hr`, menü/yetki grubu `App.Hr`, modül `Hr`). Modüller (`api/modules/*`) kendi `*DbProperties.MenuPrefix` değerini taşır (MailQueue/Settings/Languages `Sas`, Notifications `Adm`) | | Kapsam | `H` host (tüm tenant'lar için ortak) · `T` tenant · `B` şube (`TablePrefix.BranchByName`; şu an eşlemesi olan tablo yok) | | Ad | `TableNameEnum` üyesi | -Örnek: `Sas_H_Currency` (host — tüm kiracılar aynı para birimlerini görür), `Adm_T_Department` -(kiracı başına), `V_Sas_H_Order` (view). Menü ile tablo öneki her zaman örtüşmez: -`Sas_T_GlobalSearch`, `Sas_T_Branch`, `Sas_T_Forum*`, `Sas_T_IntranetWidget` kiracı tablosudur; -`Adm_T_Sequence` Saas menüsündedir. Özel view'ler +Örnek: `Sas_H_Currency` (host — tüm kiracılar aynı para birimlerini görür), `Hr_T_Department` +(kiracı başına), `Hr_H_SkillType` (İK'nın host tablosu), `V_Sas_H_Order` (view). Menü ile tablo öneki her zaman örtüşmez: +`Sas_T_GlobalSearch`, `Sas_T_Branch`, `Sas_T_Forum*`, `Sas_T_IntranetWidget` kiracı tablosudur. Özel view'ler `TableNameResolver.GetFullSpecialViewName` ile `V_{Önek}_{Prefix}_{Ad}` biçiminde üretilir. > Yeni bir platform tablosu eklenecekse `TableNameEnum` + `TableNameResolver._map` birlikte @@ -1251,11 +1250,9 @@ soneklerini alır. | **Definitions › Contact Title** | `App.Definitions.ContactTitle` | `Sas_H_ContactTitle` | host | Ünvan/hitap lookup'ı (`Title`, `Abbreviation`). | | **Definitions › Currency** | `App.Definitions.Currency` | `Sas_H_Currency` | host | Para birimi + `Rate`. Tutar alanı olan ekranın kur lookup'ı ve `DbQuery` varsayılanı buradan beslenir. | | **Definitions › Country Group / Country / City / District** | `App.Definitions.CountryGroup` · `.Country` · `.City` · `.District` | `Sas_H_CountryGroup` · `Sas_H_Country` · `Sas_H_City` · `Sas_H_District` | host | Adres alanlarının hazır cascade zinciri (dört ayrı menü ve seed dosyası; `Order` sırası grup → ülke → il → ilçe). `Country` ayrıca `PhoneCode`, `PhoneNumberFormat`, `ZipRequired`, `StateRequired`, `TaxLabel` taşır — adres doğrulaması için kullan. | -| **Definitions › Skill Type** | `App.Definitions.SkillType` (alt formlar `.Skill`, `.SkillLevel`) | `Sas_H_SkillType` · `Sas_H_Skill` · `Sas_H_SkillLevel` | host | Yetkinlik tanımı; bir ana ekrandan iki alt forma açılan **çoklu alt form** örneği. | | **Definitions › UoM Category** | `App.Definitions.UomCategory` (alt form `.Uom`) | `Sas_H_UomCategory` · `Sas_H_Uom` | host | Ölçü birimi, `Ratio`/`Rounding` — miktar alanı olan ekranlarda birim lookup'ı ve çevrim. | -| **Definitions › Sequence** | `App.Definitions.Sequence` | `Adm_T_Sequence` | tenant | Belge numarası üretimi (`lowcode` §9.9); alan varsayılanında `CustomValueType: 5` ile bağlanır. | | **Public › Products / Payment Methods / Installment Options** | `App.Orders.Products` · `.PaymentMethods` · `.InstallmentOptions` | `Sas_H_Product` · `Sas_H_PaymentMethod` · `Sas_H_InstallmentOption` | host | Ürün, ödeme yöntemi (`Commission`), taksit — satış/abonelik ekranlarının ve public `/products` sayfasının kaynağı. | -| **Public › Sales Orders** | `App.Orders.SalesOrders` (alt form Sales Order Item) | `Sas_H_Order` + `Sas_H_OrderItem` | host | **Onay akışı + alt kalem + toplam + diyalog** birlikte kullanılan tam örnek (§12.6). | +| **Public › Sales Orders** | `App.Orders.SalesOrders` (alt form Sales Order Item) | `Sas_H_Order` + `Sas_H_OrderItem` | host | **Onay akışı + alt kalem + toplam + diyalog** birlikte kullanılan tam örnek (§12.7). | | **Public › Blog Category / Posts** | `App.BlogManagement.Category` · `.Posts` | `Sas_H_BlogCategory` · `Sas_H_BlogPost` | host | Çok dilli içerik (`ContentTr`/`ContentEn`), slug, yayın durumu, sayaç alanları; public `/blog` bu tablolardan okur, yayınlanmış yazılar sitemap'e girer. | | **Public › Demos** | `App.Demos` | `Sas_H_Demo` | host | Public `/demo` formundan gelen talepler — public form → tablo akışının örneği. | | **Dev Requests** | `App.DevRequests` | `Sas_H_DevRequest` | host | **Kanban/Todo düzeninin** referansı (`DefaultLayout: todo`): `Status`, `Priority`, `SortOrder`, `Tags`, `Assignees`, `SubTasks`, `Timesheets`; detayda `Description` yanında `Analysis` sekmesi (`AnalysisExpr`). MCP geliştirme döngüsünün kuyruğudur (`Backlog` → `Analysis` MCP analiz eder, `Ready to Start`'a kullanıcı alır; `Ready to Start` → `Testing`, `Staging`'e kullanıcı alır; araç çubuğunda DB Migrate butonu vardır — `UiEvalService.ApiDbMigrate()`, `App.Setup.Migrate`; yalnızca `start_dev_request` başlatır; açıklamadaki base64 görseller MCP'ye resim içeriği olarak gider, analiz `save_dev_request_analysis` ile yazılır, üretim notu `append_dev_request_note` ile `Analysis`'e eklenir — `Description` talebin yazıldığı hâliyle kalır; `lowcode.instructions.md` §0.11–§0.12). | @@ -1279,9 +1276,8 @@ soneklerini alır. > Menü kodu ile yetki adı **her zaman aynı değildir**: Wizard Manager'da kod > `App.Listforms.WizardManager`, yetki `App.Listforms.Wizard`'dır; Administration'daki Forum -> ekranında kod `App.Forum`, yetki `App.ForumManagement.Publish`'tir; Org Chart menüsü -> `App.Definitions.OrgChart` ister ama `/admin/organization` rotası `App.Definitions.Department` -> ister (menüyü gören ama sayfayı açamayan kullanıcı olabilir). Yeni ürettiğin ekranlarda +> ekranında kod `App.Forum`, yetki `App.ForumManagement.Publish`'tir. Org Chart'ta menü ve +> `/admin/organization` rotası aynı yetkiyi (`App.Hr.OrgChart`) ister. Yeni ürettiğin ekranlarda > ikisini ayırma — wizard zaten aynı kökü kullanır (`lowcode` §2). ### 12.3 Administration menüsü @@ -1292,9 +1288,7 @@ ekranları ABP tablolarıdır, Licence/Dev Request host tablolarını okur. | Ekran | Kod / route | Tablo | Komponent üretirken ne işe yarar | | --- | --- | --- | --- | | **Definitions › Sector** | `App.Definitions.Sector` | `Adm_T_Sector` | Sektör lookup’ı. Veri `data/App.Definitions.Sector.json`'dan seed edilir. | -| **Definitions › Department** | `App.Definitions.Department` | `Adm_T_Department` | `ParentId` ile **ağaç (TreeList) düzeninin** referansı; personel/onay ekranlarının departman lookup'ı. | -| **Definitions › Job Position** | `App.Definitions.JobPosition` | `Adm_T_JobPosition` | Ünvan ağacı (`ParentId` + `DepartmentId`) — departmana bağlı cascade örneği. | -| **Definitions › Org Chart** | menü yetkisi `App.Definitions.OrgChart` · `/admin/organization` | `Adm_T_Department` · `Adm_T_JobPosition` | Departman/ünvan verisinin organizasyon şeması görünümü (özel React sayfası). | +| **Definitions › Sequence** | `App.Definitions.Sequence` | `Adm_T_Sequence` | Belge numarası üretimi (`lowcode` §9.9); alan varsayılanında `CustomValueType: 5` ile bağlanır. Entity `IMultiTenant`'tır; ekran `IsTenant = true`, yetkiler `MultiTenancySide = Both` — her kiracı kendi numaratörlerini tutar. Seed `data/App.Definitions.Sequence.json`. | | **Licence** | `App.Licence` · `/admin/form/App.Licence` | `AbpTenants` + `V_Sas_H_OrderItem_ByTenantId` | **`ListFormType = Form`** (listesiz, tek kayıtlık ekran) + alt kalem listesi. "Tek kayıtlık kart ekran" isteğinin karşılığı budur. | | **Dev Request** | `App.DevRequest` | `Sas_H_DevRequest` | Kiracı tarafındaki talep ekranı (Saas'taki listenin kullanıcı yüzü; `UserName` varsayılanı `@USERNAME`). | | **Bildirimler › Bildirim Şablonları** | `App.Notifications.NotificationTemplates` | `Adm_T_NotificationTemplate` | Elle gönderimde seçilen mesaj metinleri: `Code`, `Name`, `Channel` (boş = tüm kanallar), `Subject`, `Body` (`{AdSoyad}`, `{KullaniciAdi}`, `{Eposta}`, `{Tarih}`, `{Saat}`, `{Kiraci}` yer tutucuları), `IsActive`. Boş bırakılan konu/gövde şablondan tamamlanır. Seed: `data/App.Notifications.NotificationTemplates.json`. | @@ -1341,7 +1335,38 @@ açılmaz: `/admin/pivot/...` diye bir route **yoktur**; pivot, liste ekranındaki bir görünümdür. -### 12.4 ListForm olmayan (özel React) ekranlar +### 12.4 İK (Hr) menüsü + +Kök menü `App.Hr` (`ModuleId = Hr`, `Order = 0`; Saas `-2` ve Administration `-1`'in yanında), +yetki grubu `App.Hr`. İK'ya ait her şey `Hr` ile başlar: tablo `Hr_{H|T}_*` (`MenuPrefix.Hr`), +ListForm kodu / menü kodu / yetki adı / dil anahtarı `App.Hr.*`, seed dosyası `data/App.Hr.*.json`, +seeder `ListFormSeeder_Hr.cs` (`SeedConsts.AppCodes.Hr`, `PlatformConsts.AppCodes.Hr`), entity +klasörü `Entities/{Host,Tenant}/Hr`. Tanımlar alt menüsü `App.Hr.Definitions`'tır +(`App.Platform.Definitions` başlığı); Organizasyon Şeması doğrudan `App.Hr` altındadır. + +İK yetkilerinin `Modules` değeri `Sas|Hr`'dir: host (`Sas`) her zaman görür, kiracı yalnızca modül +listesinde `Hr` varsa görür (modül listesi boş kiracıda süzme yoktur — `MenuAppService`, +`RolesPermission.tsx`). Yetki ağacı: `App.Hr.Definitions` → `App.Hr.SkillType` (1), +`App.Hr.SkillLevel` (2), `App.Hr.Skill` (3), `App.Hr.Department` (4), `App.Hr.JobPosition` (5); +`App.Hr.OrgChart` grubun kökünde (2). ListForm ekranlarının alt yetkileri `.Create`, `.Update`, +`.Delete`, `.Export`, `.Import` (Skill Type'ta ayrıca `.Note`). + +| Ekran | Kod / route | Tablo | Kapsam | Komponent üretirken ne işe yarar | +| --- | --- | --- | --- | --- | +| **Definitions › Skill Type** | `App.Hr.SkillType` (alt formlar `App.Hr.SkillLevel`, `App.Hr.Skill`) | `Hr_H_SkillType` · `Hr_H_SkillLevel` · `Hr_H_Skill` | host | 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 › Job Position** | `App.Hr.JobPosition` | `Hr_T_JobPosition` | tenant | Ünvan ağacı. Form sırası `BranchId` → `DepartmentId` (şubeye göre süzülür) → `Name` → `ParentId` (departmana göre süzülür); şube değişince departman ve üst görev temizlenir (`CascadeEmptyFields`). **İki kademeli cascade** örneği. Seed `data/App.Hr.JobPosition.json`. | +| **Org Chart** | `App.Hr.OrgChart` · `/admin/organization` | `Hr_T_Department` · `Hr_T_JobPosition` | tenant | Departman/ünvan verisinin organizasyon şeması görünümü (özel React sayfası `hr/OrgChart`, veri `api/app/org-chart`). Menü ve route aynı yetkiyi ister. | + +**Şube bilgisi:** `Department.BranchId` ve `JobPosition.BranchId` (`Guid`, **zorunlu** — kolon `NOT NULL`, formda +zorunlu alan; değer `Sas_T_Branch.Id`) şubeyi taşır; ekranlar `IsBranch = false`'tur (satırlar kullanıcının şube atamasına göre süzülmez, şube +sütunu veridir). Host varsayılan şubesinin kimliği sabittir +(`PlatformConsts.Branches.BranchIdDefaultValue`; `PlatformIdentityDataSeeder` / +`TenantIdentityDataSeeder` host şubesi için bu kimliği kullanır, kiracı şubeleri yeni GUID alır); +seed edilen departman ve pozisyon satırları `BranchId` ile bu şubeye bağlanır. Yeni seed satırı +eklerken `BranchId` de yazılır. + +### 12.5 ListForm olmayan (özel React) ekranlar Bu ekranlar `Sas_H_Route` kayıtlarıyla yönetilir (seed: `configs/seeds/host/data/App.Menus.Routes.json`). Yenisini eklemek **kod yazmak demektir** — karar @@ -1376,7 +1401,7 @@ görünürlük `checkPermission` ile bileşen içinde kurulur (`lowcode` §7.5). | `/admin/settings` | `settings/Settings` | `App.Setting` | | `/admin/files` | `admin/files/FileManager` | `App.Files` | | `/admin/intranet-documents` | `intranet/documents/IntranetDocuments` | `App.Intranet.Document` | -| `/admin/ous` · `/admin/organization` | `organization-unit/OrganizationUnits` · `hr/OrgChart` | `Abp.Identity.OrganizationUnits` · `App.Definitions.Department` (menü `App.Definitions.OrgChart` ister — §12.2 notu) | +| `/admin/ous` · `/admin/organization` | `organization-unit/OrganizationUnits` · `hr/OrgChart` | `Abp.Identity.OrganizationUnits` · `App.Hr.OrgChart` (menü ile aynı — §12.4) | | `/admin/forum` | `forum/Forum` | `App.ForumManagement.Publish` | | `/admin/videoroom/{dashboard,list,room/:id}` | `admin/videoroom/{Dashboard,RoomList,RoomDetail}` | `App.Videoroom{,.List,.Detail}` | | `/admin/ai` | `ai/Assistant` | `App.Definitions.AiBot.Asistant` | @@ -1409,13 +1434,13 @@ alanları da doldurur (`lowcode` §0.9). `/reset-password`, `/confirm`, `/confirm/:userId/:token`, `/extend-login` → `views/auth/*`. Bunlara dokunma; parola ve doğrulama akışları ABP tarafındadır. -### 12.5 Talep → hangi menü +### 12.6 Talep → hangi menü §0'daki katman taraması bu tabloyla eşleşir; "kod yazmamız gerekir" demeden önce buraya bak. | Talepte geçen | Menü / ekran | Ne yapılır | | --- | --- | --- | -| "numara otomatik gelsin" | Saas › Definitions › Sequence | Kayıt aç, alan varsayılanına `CustomValueType: 5` | +| "numara otomatik gelsin" | Administration › Definitions › Sequence | Kayıt aç, alan varsayılanına `CustomValueType: 5` | | "her gece / saat başı çalışsın" | Saas › Background Workers | `WorkerType: 2` + `BeforeSp`; prosedür `sql/object/` altına | | "bilgilendirme gitsin" | Administration › Bildirimler (+ MailQueue §11) | Tür + kural (8 kanal); tablolu/ekli e-posta ise MailQueue | | "elden bildirim/duyuru gönderelim" | Administration › Bildirimler › Bildirimler (+ Şablonlar) | Ekleme formu = elle gönderim; hazır metin için şablon kaydı | @@ -1438,13 +1463,14 @@ alanları da doldurur (`lowcode` §0.9). | "menüye eklensin" | Saas › Menus › Manager | Menü kaydı + yetki + route eşlemesi | | "yapay zekâ ajanı sorgulasın / veri çeksin" | Saas › DeveloperKit › MCP Servers | Kayıt aç, `AllowedTools`/tenant kapsamını ayarla; yeni endpoint/kod yok | | "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, departman, ünvan" | 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 | | "yapay zekâ cevaplasın" | Saas › Definitions › AiBot | Bot tanımı; `/admin/ai` bu tanımı kullanır | -### 12.6 Canlı referans uygulamalar +### 12.7 Canlı referans uygulamalar İstenen davranışın bu uygulamada çalışan örneği. Tanımlar -`api/src/Sozsoft.Platform.DbMigrator/Migrations/ListFormSeeder_{Saas,Administration}.cs` +`api/src/Sozsoft.Platform.DbMigrator/Migrations/ListFormSeeder_{Saas,Administration,Hr}.cs` içinde ilgili `#region` altındadır. | İhtiyaç | Bak | @@ -1455,17 +1481,17 @@ içinde ilgili `#region` altındadır. | Tek kayıtlık form ekranı | `Licence` (`ListFormType = Form` + alt kalem listesi) | | Onay akışı | `Sales Orders` — `WorkflowJson` (`ApprovalUserFieldName`, `ApprovalStatusFieldName`, `ApprovalDateFieldName`, `ApprovalDescriptionFieldName`) + `ListFormWorkflow` düğümleri (Start → Approval → End/End) | | Alt form (master-detail) | `Tenant → Branches`, `Sales Orders → Sales Order Item`, `Survey → Question → Option` | -| KPI widget | Saas ve Administration'daki yönetim ekranlarının çoğu (Users, Tenants, Dynamic Services, Custom Components, Audit Logs, Bildirimler, Duyuru/Anket/Etkinlik, Forum…; basit tanım listeleri hariç) — `WidgetsJson`; tek sorgu `UNION ALL` ile birden çok kart döndürür (`Title`, `Value`, `Color`, `SubTitle`, `Icon`) | +| KPI widget | Saas, Administration ve İK'daki yönetim ekranlarının çoğu (Users, Tenants, Dynamic Services, Custom Components, Audit Logs, Bildirimler, Duyuru/Anket/Etkinlik, Forum…; basit tanım listeleri hariç) — `WidgetsJson`; tek sorgu `UNION ALL` ile birden çok kart döndürür (`Title`, `Value`, `Color`, `SubTitle`, `Icon`) | | Toolbar'dan diyalog açma | `Tenant` (`TenantsConnectionString`), `Role` (`RolesPermission`), `User` (`UsersPermission`), `Audit Logs` (`AuditLogDetail`), `Notification Rule` (`CreateNotification`), `Branches` (`BranchSeed`), `Sales Orders` (`CreateTenantFromOrderDialog`), `Dynamic Services` (`DynamicServiceEditor` — hem toolbar hem satır) | | Yazmayı servise devretme | `Tenant`, `Role`, `User` — `*ServiceAddress = "list-form-dynamic-api/{tenant\|role\|user}-{insert\|update}"`; `Notification` — `notification-insert` (çoklu değer `MultiValueStringJsonConverter`) | | Ekle düğmesini diyaloğa bağlama | `Dynamic Services` — `EditingOptionJson.AddDialogName = "DynamicServiceEditor"` | | Satır butonundan servis silme | `Dynamic Services` — `UiEvalService.ApiDeleteDynamicService` | | Toplam satırı | `Sales Order Item`, `Licence Item` (`TotalSummaryJson`) | | View üzerinden okuma | `Background Worker Jobs`, `Licence Item` (`SelectCommandType = View`) | -| Cascade lookup | `City` → `District` (ülke/il/ilçe zinciri) | +| Cascade lookup | `City` → `District` (ülke/il/ilçe zinciri); `Job Position` (şube → departman → üst görev) | | Alan varsayılanı ve soft delete | `Tenant` (`FormFieldsDefaultValueJson`, `DeleteFieldsDefaultValueJson`) | -### 12.7 Uyarılar +### 12.8 Uyarılar - **Bu ekranların seeder'ı idempotenttir:** `ListFormCode` zaten varsa kayıt **güncellenmez**. Hazır bir ekranın davranışını değiştirmek gerekiyorsa seeder'ı düzenlemek yetmez; değişikliği diff --git a/.github/instructions/lowcode.instructions.md b/.github/instructions/lowcode.instructions.md index 4f720448..1f20cf4f 100644 --- a/.github/instructions/lowcode.instructions.md +++ b/.github/instructions/lowcode.instructions.md @@ -12,7 +12,7 @@ bileşen üretebilmesi için gereken somut şemaları, alan anlamlarını, enum Bu dosya **nasıl üretileceğini** anlatır; `lowcode-reference.instructions.md` **neyin ayarlanabildiğini** alan alan listeler (grid/pivot/chart JSON'ları, alan seviyesi JSON'lar, SQL -kancaları, tasarımcı envanteri, mail modülü) ve **§12'de Saas + Administration menülerindeki +kancaları, tasarımcı envanteri, mail modülü) ve **§12'de Saas + Administration + İK menülerindeki hazır gelen bütün ekranları** — hangisi yeniden kullanılacak yetenek, hangisi lookup kaynağı, hangisi taklit edilecek canlı örnek. Bir komponent üretmeden önce oradaki **§0 yetenek envanterini** tara: platformun sunduğu bir katmanı atlamadığından böyle emin olursun. @@ -258,7 +258,7 @@ bildirilir: | Route kaydı açılıp açılmayacağı | List statik route kullanır, Custom `RoutePath`'ten türer (§9.7) | | Parametreli SQL kullanımı, yetki kontrolü, tenant izolasyonu | Tartışmaya açık değil | | Depoda okunabilen tablo/kolon/menü/yetki adları | Önce ara, bulduğunu **doğrulat**, sıfırdan sorma | -| Var olan bir tanım tablosunun (ülke, para birimi, departman, ünvan, birim) yeniden üretilip üretilmeyeceği | Üretilmez; mevcut tabloya lookup bağlanır (reference §12.5) | +| Var olan bir tanım tablosunun (ülke, para birimi, departman, ünvan, birim) yeniden üretilip üretilmeyeceği | Üretilmez; mevcut tabloya lookup bağlanır (reference §12.6) | | Liste ekranının üstündeki KPI kartları (`Widgets`) | List ekranı en az 3 kartla gelir, kartlar tablonun durum/bayrak/tarih/tutar kolonlarından seçilir (§4.6.1) | Buna karşılık **her zaman sorulacak** üç şey vardır, çünkü yanlış varsayım geri dönülmez sonuç @@ -3818,7 +3818,7 @@ elle düzeltme ve wizard'ın kapsamadığı düzenlemeler içindir. | Ekran | Route | Yetki | Ne yapar | | --- | --- | --- | --- | | **Routes** | `/admin/list/App.Menus.Routes` | `App.Menus.Routes` | Fiziksel React sayfalarının route kayıtları (`Key`, `Path`, `ComponentType`, `ComponentPath`, `RouteType`, `Authority[]`) | -| **Modules** | `/admin/list/App.Menus.Module` | `App.Menus.Module` | Modül adları (`Sas`, `Adm` gibi üst kümeler); kök menü `ModuleId` ile buraya bağlanır | +| **Modules** | `/admin/list/App.Menus.Module` | `App.Menus.Module` | Modül adları (`Sas`, `Adm`, `Hr`, `Pub`); kök menü `ModuleId` ile buraya bağlanır. Yetkilerin `Modules` değeri kiracıdaki görünürlüğü belirler (`Sas` host, `Adm`/`Hr` kiracı) | | **Menu List** | `/admin/list/App.Menus.Menu` | `App.Menus.Menu` | Menü kayıtlarının ham listesi | | **Menu Manager** | `/admin/menuManager` | `App.Menus.Manager` | Sürükle-bırak menü ağacı; sıra ve hiyerarşi düzenleme | @@ -4129,7 +4129,8 @@ kullanılacağı** `lowcode-reference.instructions.md` §12'dedir. | "Dosya yükleme/yönetme" | File Manager | `/admin/files` | | "Global aramada çıksın" | Global Search kayıtları (`System`, `Group`, `Term`, `Weight`, `Url`) | `/admin/list/App.Definitions.GlobalSearch` | | "Duyuru, anket, sosyal akış, etkinlik" | Intranet ekranları | `/admin/list/App.Intranet.*` | -| "Para birimi, ülke/il/ilçe, departman, ünvan, birim…" | 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` | | "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) | | "Yapay zekâ asistanı" | AI Bot tanımları | `/admin/list/App.Definitions.AiBot` | @@ -4141,10 +4142,10 @@ kullanılacağı** `lowcode-reference.instructions.md` §12'dedir. > | Durum | Ekranlar (örnek) | Prompt ile kayıt eklerken | > | --- | --- | --- | > | Seed bayrakları açık — ekrandan yapılan kayıt dosyaya yansır | RecurringJobs, NotificationTemplates/Types/Rules, SettingDefinitions, AiBot, CustomEndpoints, DynamicServices, CustomComponents, McpServers, IntranetWidgets, `App.Menus.*`, `Abp.Identity.Permission*` | Satırı `data/{ListFormCode}.json`'a yaz | -> | `SeedFilePath` dolu, bayraklar kapalı — dosya migrate'te uygulanır, ekrandan yapılan değişiklik dosyaya **yansımaz** | Sequence, GlobalSearch, Currency, ContactTitle, Country/City/District, Uom, Department, JobPosition, ReportTemplates/Categories, WorkHour, Intranet, Blog, Forum, Orders tanımları | Satırı dosyaya yaz; ekrandan eklenen kayıt teslim sayılmaz | +> | `SeedFilePath` dolu, bayraklar kapalı — dosya migrate'te uygulanır, ekrandan yapılan değişiklik dosyaya **yansımaz** | Sequence, GlobalSearch, Currency, ContactTitle, Country/City/District, Uom, Hr Department/JobPosition/SkillType, ReportTemplates/Categories, WorkHour, Intranet, Blog, Forum, Orders tanımları | Satırı dosyaya yaz; ekrandan eklenen kayıt teslim sayılmaz | > | `SeedFilePath` boş — yalnızca veritabanı | DataSource, Languages, Branches, Roles/Users/Tenants, AuditLogs, IpRestrictions, Notification (geçmiş), BackgroundWorkers.Jobs | `sql/execute/{Ad}.sql` altında **varsa güncelleyen/yoksa ekleyen** bir prosedür (§8.4) | > -> Tam liste `ListFormSeeder_Saas.cs` / `ListFormSeeder_Administration.cs` içindeki `SeedFilePath` +> Tam liste `ListFormSeeder_Saas.cs` / `ListFormSeeder_Administration.cs` / `ListFormSeeder_Hr.cs` içindeki `SeedFilePath` > ve `SeedSync*` atamalarıdır. "Ekranı ürettim ama numaratörü/zamanlanmış işi de kurdum" diyorsan, > o kayıtların seed karşılığını da yazmadıysan teslim eksiktir. diff --git a/README.md b/README.md index 010c7756..fd46c014 100644 --- a/README.md +++ b/README.md @@ -903,10 +903,34 @@ Route.Authority ──┘ └► Permission karşılığı olan dosyası bulunmayan rota kaydı hiç yüklenmez. Public site menüsü bu modelin dışındadır: `Pub` modülü altında tutulur ve uygulama konfigürasyonuyla taşınır (bkz. §10.4). +**Modüller ve kök menüler.** Kök menüler bir modüle bağlıdır (`Menu.ModuleId` → +`data/App.Menus.Module.json`): `Sas` → `App.Saas` (Saas), `Adm` → `App.Administration`, +`Hr` → `App.Hr` (İK), `Pub` → `App.Public.Header` (public site). Tablo ön eki aynı modülden gelir +(`MenuPrefix`: `Sas_`, `Adm_`, `Hr_`; `TableNameResolver`). Her yetki satırı `Modules` +(pipe ile ayrılmış) değeri taşır; kiracının modül listesi doluysa menü (`MenuAppService`) ve rol +yetki ekranı (`RolesPermission.tsx`) yalnızca kesişen modüllerin yetkilerini gösterir. Sözleşme: +`Sas` host'ta görünürlüğü, `Adm` ve `Hr` kiracıdaki görünürlüğü belirler — Saas/Administration +yetkileri `Sas|Adm`, İK yetkileri `Sas|Hr` taşır. + +**İK (Hr) modülü.** Menü `App.Hr` → `App.Hr.Definitions` (Yetenek Tipleri `App.Hr.SkillType`, +Departmanlar `App.Hr.Department`, Pozisyonlar `App.Hr.JobPosition`) ve doğrudan +Organizasyon Şeması `App.Hr.OrgChart` (`/admin/organization`; menü ve route aynı yetkiyi ister). +Yetki grubu `App.Hr`; ListForm kodu = menü kodu = yetki adı = dil anahtarı. Tablolar +`Hr_H_SkillType` / `Hr_H_SkillLevel` / `Hr_H_Skill` (host) ve `Hr_T_Department` / +`Hr_T_JobPosition` (kiracı); ekranlar `ListFormSeeder_Hr.cs`'tedir, entity'ler +`Entities/{Host,Tenant}/Hr`. Departman ve pozisyon **şube bazlıdır**: `BranchId` zorunlu kolondur +(`Guid`, `NOT NULL`), listenin ilk sütunu Şube Adı'dır (`LookupQueryValues.TenantBranchValues`); +departman lookup'ı şubeye göre süzülür (`BranchDepartmentValues`). Host varsayılan şubesi sabit +kimlikle kurulur (`PlatformConsts.Branches.BranchIdDefaultValue`) ve +`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ı: +`lowcode-reference.instructions.md` §12.4. + **Yetki kodları** `PlatformConsts.AppCodes` içinde merkezî olarak tanımlıdır ve `configs/seeds/host/data/Abp.Identity.Permissions.json` ile seed edilir (gruplar: -`Abp.Identity.PermissionGroups.json`). Ana gruplar: `App.Saas`, `App.Branches`, `App.Intranet.*`, -`App.Definitions.*`, `App.Restrictions.*`, `App.Languages.*`, `App.Listforms.*`, +`Abp.Identity.PermissionGroups.json` — `App.Saas` (1), `App.Administration` (2), `App.Hr` (3)). +Ana yetki kökleri: `App.Saas`, `App.Branches`, `App.Intranet.*`, +`App.Definitions.*`, `App.Hr.*`, `App.Restrictions.*`, `App.Languages.*`, `App.Listforms.*`, `App.Notifications.*`, `App.BackgroundWorkers.*`, `App.Menus.*`, `App.DeveloperKit.*`, `App.SqlQueryManager.*`, `App.Orders.*`, `App.BlogManagement.*`, `App.IdentityManagement.*`, `App.Reports.*`, @@ -1950,7 +1974,8 @@ Yeni ABP modülü eklemek için: Platformun kendi ekranları buradadır (dil metinleri `configs/seeds/host/data/App.Languages.*.json`); değişiklikleri derlenip yayınlanır. Yeni bir modülün nasıl kurulacağını öğrenmek için başvurulacak dosyalar: -- `ListFormSeeder_Saas.cs`, `ListFormSeeder_Administration.cs` — ListForm + alan tanımları +- `ListFormSeeder_Saas.cs`, `ListFormSeeder_Administration.cs`, `ListFormSeeder_Hr.cs` — menü + modülüne göre ayrılmış ListForm + alan tanımları (İK ekranları `ListFormSeeder_Hr.cs`'te) - `WizardDataSeeder.cs`, `CrudDataSeeder.cs` — aşağıdaki runtime seed dosyalarını okuyup uygulayan seeder'lar - `ListFormSeedDataApplier`, `CrudEndpointSeedApplier` (`Domain/Data/`) — uygulama kuralının tek @@ -1971,6 +1996,8 @@ configs/seeds/ │ │ # Abp.Identity.Permission{Groups,s}.json — yetki tanımları │ │ # App.Definitions.{CountryGroup,Country,City,District}.json — adres zinciri │ │ # App.Definitions.{Currency,ContactTitle,AiBot}.json — para birimi, hitap, AI bot +│ │ # App.Hr.{SkillType,SkillLevel,Skill}.json — İK yetkinlik tanımları +│ │ # App.Hr.{Department,JobPosition}.json — İK departman → pozisyon (BranchId ile şubeye bağlı) │ │ # App.Notifications.Notification{Templates,Types,Rules}.json — bildirim şablonu, tipi → kuralı │ │ # App.Languages.{Language,LanguageText}.json — dil → metin (eksik LanguageKey metinle üretilir) │ │ # App.SettingDefinitions.json, App.BackgroundWorkers.RecurringJobs.json — ayar tanımları, zamanlanmış işler @@ -2009,7 +2036,7 @@ configs/seeds/ - `route.constant.ts` içindeki `supplychain`, `maintenance`, `warehouse`, `projects`, `crm`, `mrp`, `accounting` ve `hr` yol sabitleri **yol sözleşmesidir**; bu alanların ekranları fiziksel React sayfaları olarak değil, ListForm konfigürasyonu ile üretilir. `hr` altında yalnızca - organizasyon şeması (`OrgChart.tsx`) fiziksel bir view'dır. + organizasyon şeması (`OrgChart.tsx`, İK menüsü `App.Hr.OrgChart`) fiziksel bir view'dır. - Depodaki `appsettings*.json` ve deployment dokümanları geliştirme değerleri/örnek kimlik bilgileri içerir; üretim öncesi tümü değiştirilmelidir. - SQL View Designer tek yönlüdür (model → T-SQL). Elle yazılmış ya da tasarımcının kanonik diff --git a/api/src/Sozsoft.Platform.Application.Contracts/LookUpQueryValues.cs b/api/src/Sozsoft.Platform.Application.Contracts/LookUpQueryValues.cs index 7eacceaf..88c60e45 100644 --- a/api/src/Sozsoft.Platform.Application.Contracts/LookUpQueryValues.cs +++ b/api/src/Sozsoft.Platform.Application.Contracts/LookUpQueryValues.cs @@ -267,6 +267,27 @@ public static class LookupQueryValues $"WHERE \"IsDeleted\" = 'false' " + $"ORDER BY \"Name\";"; + // Lookup sorgusu ekranın tenant filtresinden geçmez; kiracı kırılımı token ile sorguda yazılır. + public static string TenantBranchValues = + $"SELECT " + + $"\"Id\" AS \"Key\", " + + $"\"Name\" AS \"Name\" " + + $"FROM \"{TableNameResolver.GetFullTableName(nameof(TableNameEnum.Branch))}\" " + + $"WHERE " + + $"\"TenantId\" = '{DefaultValues.TenantId}' " + + $"AND \"IsDeleted\" = 'false' " + + $"ORDER BY \"Name\";"; + + public static string BranchDepartmentValues = + $"SELECT " + + $"\"Id\" AS \"Key\", " + + $"\"Name\" AS \"Name\" " + + $"FROM \"{TableNameResolver.GetFullTableName(nameof(TableNameEnum.Department))}\" " + + $"WHERE " + + $"(\"BranchId\" = @param0 OR @param0 IS NULL) " + + $"AND \"IsDeleted\" = 'false' " + + $"ORDER BY \"Name\";"; + public static string JobPositionValues = $"SELECT " + $"\"Id\" AS \"Key\", " + diff --git a/api/src/Sozsoft.Platform.DbMigrator/Migrations/ListFormSeeder_Administration.cs b/api/src/Sozsoft.Platform.DbMigrator/Migrations/ListFormSeeder_Administration.cs index a283b38d..e1b435ca 100644 --- a/api/src/Sozsoft.Platform.DbMigrator/Migrations/ListFormSeeder_Administration.cs +++ b/api/src/Sozsoft.Platform.DbMigrator/Migrations/ListFormSeeder_Administration.cs @@ -2003,6 +2003,332 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep } #endregion + #region Sequence + listFormName = AppCodes.Definitions.Sequence; + if (!await _listFormRepository.AnyAsync(a => a.ListFormCode == listFormName)) + { + var listForm = await _listFormRepository.InsertAsync( + new ListForm() + { + ListFormType = ListFormTypeEnum.List, + PageSize = 10, + ExportJson = DefaultExportJson, + IsSubForm = false, + ShowNote = false, + LayoutJson = DefaultLayoutJson(), + CultureName = LanguageCodes.En, + ListFormCode = listFormName, + Name = listFormName, + Title = listFormName, + DataSourceCode = SeedConsts.DataSources.DefaultCode, + IsTenant = true, + IsBranch = false, + IsOrganizationUnit = false, + Description = $"{listFormName}.Description", + SelectCommandType = SelectCommandTypeEnum.Table, + SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.Sequence)), + SeedFilePath = SeedPathResolver.GetDataFilePath(listFormName), + SeedSyncInsert = false, + SeedSyncUpdate = false, + SeedSyncDelete = false, + KeyFieldName = "Id", + KeyFieldDbSourceType = DbType.Guid, + DefaultFilter = DefaultFilterJson, + SortMode = GridOptions.SortModeSingle, + FilterRowJson = DefaultFilterRowJson(), + HeaderFilterJson = DefaultHeaderFilterJson(), + SearchPanelJson = DefaultSearchPanelJson(), + GroupPanelJson = DefaultGroupPanelJson(), + SelectionJson = DefaultSelectionSingleJson, + ColumnOptionJson = DefaultColumnOptionJson(), + PermissionJson = DefaultPermissionJson(listFormName), + DeleteCommand = DefaultDeleteCommand(nameof(TableNameEnum.Sequence)), + DeleteFieldsDefaultValueJson = DefaultDeleteFieldsDefaultValueJson(), + PagerOptionJson = DefaultPagerOptionJson, + EditingOptionJson = DefaultEditingOptionJson(listFormName, 700, 500, true, true, true, true, false), + EditingFormJson = JsonSerializer.Serialize(new List + { + new() { + Order = 1, ColCount = 2, ColSpan = 1, ItemType = "group" }, + }), + InsertFieldsDefaultValueJson = DefaultInsertFieldsDefaultValueJson(), + FormFieldsDefaultValueJson = JsonSerializer.Serialize(new FieldsDefaultValue[] { + new() { FieldName = "IsActive", FieldDbType = DbType.Boolean, Value = "true", CustomValueType = FieldCustomValueTypeEnum.Value }, + new() { FieldName = "PaddingSize", FieldDbType = DbType.Int16, Value = "5", CustomValueType = FieldCustomValueTypeEnum.Value }, + new() { FieldName = "IncrementStep", FieldDbType = DbType.Int16, Value = "1", CustomValueType = FieldCustomValueTypeEnum.Value }, + new() { FieldName = "StartNumber", FieldDbType = DbType.Int16, Value = "1", CustomValueType = FieldCustomValueTypeEnum.Value }, + new() { FieldName = "FormatTemplate", FieldDbType = DbType.String, Value = "{Prefix}{Number}{Suffix}", CustomValueType = FieldCustomValueTypeEnum.Value }, + new() { FieldName = "ResetPeriod", FieldDbType = DbType.Int16, Value = "0", CustomValueType = FieldCustomValueTypeEnum.Value }, + }), + }); + + #region Sequence Fields + await _listFormFieldRepository.InsertManyAsync([ + new() + { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.Guid, + FieldName = "Id", + CaptionName = "App.Listform.ListformField.Id", + Width = 0, + ListOrderNo = 1, + Visible = false, + IsActive = true, + + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new() + { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "Name", + EditGroupOrderNo = 1, + EditOrderNo = 1, + EditorType2 = EditorTypes.dxTextBox, + ColSpan = 1, + CaptionName = "App.Listform.ListformField.Name", + Width = 0, + ListOrderNo = 2, + Visible = true, + IsActive = true, + + SortIndex = 1, + SortDirection = GridColumnOptions.SortOrderAsc, + AllowSearch = true, + ValidationRuleJson = DefaultValidationRuleRequiredJson, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new() + { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "Prefix", + EditGroupOrderNo = 1, + EditOrderNo = 3, + EditorType2 = EditorTypes.dxTextBox, + ColSpan = 1, + CaptionName = "App.Listform.ListformField.Prefix", + Width = 0, + ListOrderNo = 3, + Visible = true, + IsActive = true, + + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new() + { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "Suffix", + EditGroupOrderNo = 1, + EditOrderNo = 4, + EditorType2 = EditorTypes.dxTextBox, + ColSpan = 1, + CaptionName = "App.Listform.ListformField.Suffix", + Width = 0, + ListOrderNo = 4, + Visible = true, + IsActive = true, + + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new() + { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.Boolean, + FieldName = "IsActive", + EditGroupOrderNo = 1, + EditOrderNo = 2, + EditorType2 = EditorTypes.dxCheckBox, + ColSpan = 1, + CaptionName = "App.Listform.ListformField.IsActive", + Width = 0, + ListOrderNo = 5, + Visible = true, + IsActive = true, + Alignment = "center", + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new() + { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.Int32, + FieldName = "PaddingSize", + EditGroupOrderNo = 1, + EditOrderNo = 5, + EditorType2 = EditorTypes.dxNumberBox, + ColSpan = 1, + CaptionName = "App.Listform.ListformField.PaddingSize", + Width = 0, + ListOrderNo = 6, + Visible = true, + IsActive = true, + + AllowSearch = true, + ValidationRuleJson = DefaultValidationRuleRequiredJson, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new() + { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.Int32, + FieldName = "IncrementStep", + EditGroupOrderNo = 1, + EditOrderNo = 6, + EditorType2 = EditorTypes.dxNumberBox, + ColSpan = 1, + CaptionName = "App.Listform.ListformField.IncrementStep", + Width = 0, + ListOrderNo = 7, + Visible = true, + IsActive = true, + + AllowSearch = true, + ValidationRuleJson = DefaultValidationRuleRequiredJson, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new() + { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.Int32, + FieldName = "NextNumber", + CaptionName = "App.Listform.ListformField.NextNumber", + Width = 0, + ListOrderNo = 8, + Visible = true, + IsActive = true, + + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new() + { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.Int32, + FieldName = "ResetPeriod", + EditGroupOrderNo = 1, + EditOrderNo = 7, + EditorType2 = EditorTypes.dxSelectBox, + ColSpan = 1, + EditorOptions = EditorOptions.ShowClearButton(), + CaptionName = "App.Listform.ListformField.ResetPeriod", + Width = 0, + ListOrderNo = 9, + Visible = true, + IsActive = true, + LookupJson = JsonSerializer.Serialize(new LookupDto + { + DataSourceType = UiLookupDataSourceTypeEnum.StaticData, + DisplayExpr = "name", + ValueExpr = "key", + LookupQuery = JsonSerializer.Serialize(new LookupDataDto[] { + new() { Key=0, Name="App.StaticLookup.None" }, + new() { Key=1, Name="App.StaticLookup.Yearly"}, + new() { Key=2, Name="App.StaticLookup.Monthly"}, + new() { Key=3, Name="App.StaticLookup.Daily"}, + new() { Key=4, Name="App.StaticLookup.Hourly"}, + new() { Key=5, Name="App.StaticLookup.Minutely"}, + }), + }), + AllowSearch = true, + ValidationRuleJson = DefaultValidationRuleRequiredJson, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new() + { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.Int32, + FieldName = "StartNumber", + EditGroupOrderNo = 1, + EditOrderNo = 8, + EditorType2 = EditorTypes.dxNumberBox, + ColSpan = 1, + CaptionName = "App.Listform.ListformField.StartNumber", + Width = 0, + ListOrderNo = 10, + Visible = true, + IsActive = true, + + AllowSearch = true, + ValidationRuleJson = DefaultValidationRuleRequiredJson, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new() + { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "LastPeriodKey", + CaptionName = "App.Listform.ListformField.LastPeriodKey", + Width = 0, + ListOrderNo = 11, + Visible = true, + IsActive = true, + + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new() + { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "FormatTemplate", + EditGroupOrderNo = 1, + EditOrderNo = 9, + EditorType2 = EditorTypes.dxTextBox, + ColSpan = 2, + CaptionName = "App.Listform.ListformField.FormatTemplate", + Width = 0, + ListOrderNo = 12, + Visible = true, + IsActive = true, + PlaceHolder="{Prefix}-{yyyy}{MM}{dd}-{Number}-{Suffix}", + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + ]); + #endregion + } + #endregion + #region WorkHour listFormName = AppCodes.Restrictions.WorkHour; if (!await _listFormRepository.AnyAsync(a => a.ListFormCode == listFormName)) @@ -2644,284 +2970,6 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep } #endregion - #region Department - listFormName = AppCodes.Definitions.Department; - if (!await _listFormRepository.AnyAsync(a => a.ListFormCode == listFormName)) - { - var listForm = await _listFormRepository.InsertAsync( - new ListForm() - { - ListFormType = ListFormTypeEnum.List, - PageSize = 10, - ExportJson = DefaultExportJson, - IsSubForm = false, - ShowNote = false, - LayoutJson = DefaultLayoutJson("tree"), - CultureName = LanguageCodes.En, - ListFormCode = listFormName, - Name = listFormName, - Title = listFormName, - DataSourceCode = SeedConsts.DataSources.DefaultCode, - IsTenant = true, - IsBranch = false, - IsOrganizationUnit = false, - Description = $"{listFormName}.Description", - SelectCommandType = SelectCommandTypeEnum.Table, - SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.Department)), - SeedFilePath = SeedPathResolver.GetDataFilePath(listFormName), - SeedSyncInsert = false, - SeedSyncUpdate = false, - SeedSyncDelete = false, - KeyFieldName = "Id", - KeyFieldDbSourceType = DbType.Guid, - DefaultFilter = DefaultFilterJson, - SortMode = GridOptions.SortModeSingle, - FilterRowJson = DefaultFilterRowJson(), - HeaderFilterJson = DefaultHeaderFilterJson(), - SearchPanelJson = DefaultSearchPanelJson(), - GroupPanelJson = DefaultGroupPanelJson(), - SelectionJson = DefaultSelectionSingleJson, - ColumnOptionJson = DefaultColumnOptionJson(), - PermissionJson = DefaultPermissionJson(listFormName), - DeleteCommand = DefaultDeleteCommand(nameof(TableNameEnum.Department)), - DeleteFieldsDefaultValueJson = DefaultDeleteFieldsDefaultValueJson(), - PagerOptionJson = DefaultPagerOptionJson, - TreeOptionJson = DefaultTreeOptionJson("Id", "ParentId", true), - InsertFieldsDefaultValueJson = DefaultInsertFieldsDefaultValueJson(), - EditingOptionJson = DefaultEditingOptionJson(listFormName, 400, 500, true, true, true, true, false), - EditingFormJson = JsonSerializer.Serialize(new List - { - new() { - Order = 1, ColCount = 1, ColSpan = 1, ItemType = "group" }, - }), - }); - - #region Department Fields - await _listFormFieldRepository.InsertManyAsync([ - new() { - ListFormCode = listForm.ListFormCode, - CultureName = LanguageCodes.En, - SourceDbType = DbType.Guid, - FieldName = "Id", - CaptionName = "App.Listform.ListformField.Id", - Width = 0, - ListOrderNo = 1, - Visible = false, - IsActive = true, - ColumnCustomizationJson = DefaultColumnCustomizationJson, - PermissionJson = DefaultFieldPermissionJson(listForm.Name), - PivotSettingsJson = DefaultPivotSettingsJson - }, - new() - { - ListFormCode = listForm.ListFormCode, - CultureName = LanguageCodes.En, - SourceDbType = DbType.String, - FieldName = "Name", - EditGroupOrderNo = 1, - EditOrderNo = 1, - EditorType2 = EditorTypes.dxTextBox, - ColSpan = 1, - CaptionName = "App.Listform.ListformField.Name", - Width = 0, - ListOrderNo = 2, - Visible = true, - IsActive = true, - SortIndex = 1, - SortDirection = GridColumnOptions.SortOrderAsc, - AllowSearch = true, - ValidationRuleJson = DefaultValidationRuleRequiredJson, - ColumnCustomizationJson = DefaultColumnCustomizationJson, - PermissionJson = DefaultFieldPermissionJson(listForm.Name), - PivotSettingsJson = DefaultPivotSettingsJson - }, - new() - { - ListFormCode = listForm.ListFormCode, - CultureName = LanguageCodes.En, - SourceDbType = DbType.Guid, - FieldName = "ParentId", - EditGroupOrderNo = 1, - EditOrderNo = 2, - EditorType2 = EditorTypes.dxSelectBox, - ColSpan = 1, - EditorOptions = EditorOptions.ShowClearButton(), - CaptionName = "App.Listform.ListformField.ParentId", - Width = 0, - ListOrderNo = 3, - Visible = true, - IsActive = true, - AllowSearch = true, - LookupJson = JsonSerializer.Serialize(new LookupDto { - DataSourceType = UiLookupDataSourceTypeEnum.Query, - DisplayExpr = "Name", - ValueExpr = "Key", - LookupQuery = LookupQueryValues.DepartmentValues, - }), - ColumnCustomizationJson = DefaultColumnCustomizationJson, - PermissionJson = DefaultFieldPermissionJson(listForm.Name), - PivotSettingsJson = DefaultPivotSettingsJson - }, - ]); - #endregion - } - #endregion - - #region JobPosition - listFormName = AppCodes.Definitions.JobPosition; - if (!await _listFormRepository.AnyAsync(a => a.ListFormCode == listFormName)) - { - var listForm = await _listFormRepository.InsertAsync( - new ListForm() - { - ListFormType = ListFormTypeEnum.List, - PageSize = 10, - ExportJson = DefaultExportJson, - IsSubForm = false, - ShowNote = false, - LayoutJson = DefaultLayoutJson("tree"), - CultureName = LanguageCodes.En, - ListFormCode = listFormName, - Name = listFormName, - Title = listFormName, - DataSourceCode = SeedConsts.DataSources.DefaultCode, - IsTenant = true, - IsBranch = false, - IsOrganizationUnit = false, - Description = $"{listFormName}.Description", - SelectCommandType = SelectCommandTypeEnum.Table, - SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.JobPosition)), - SeedFilePath = SeedPathResolver.GetDataFilePath(listFormName), - SeedSyncInsert = false, - SeedSyncUpdate = false, - SeedSyncDelete = false, - KeyFieldName = "Id", - KeyFieldDbSourceType = DbType.Guid, - DefaultFilter = DefaultFilterJson, - SortMode = GridOptions.SortModeSingle, - FilterRowJson = DefaultFilterRowJson(), - HeaderFilterJson = DefaultHeaderFilterJson(), - SearchPanelJson = DefaultSearchPanelJson(), - GroupPanelJson = DefaultGroupPanelJson(), - SelectionJson = DefaultSelectionSingleJson, - ColumnOptionJson = DefaultColumnOptionJson(), - PermissionJson = DefaultPermissionJson(listFormName), - DeleteCommand = DefaultDeleteCommand(nameof(TableNameEnum.JobPosition)), - DeleteFieldsDefaultValueJson = DefaultDeleteFieldsDefaultValueJson(), - PagerOptionJson = DefaultPagerOptionJson, - TreeOptionJson = DefaultTreeOptionJson("Id", "ParentId", true), - InsertFieldsDefaultValueJson = DefaultInsertFieldsDefaultValueJson(), - EditingOptionJson = DefaultEditingOptionJson(listFormName, 400, 350, true, true, true, true, false), - EditingFormJson = JsonSerializer.Serialize(new List - { - new() { - Order = 1, ColCount = 1, ColSpan = 1, ItemType = "group" }, - }), - }); - - #region JobPosition Fields - await _listFormFieldRepository.InsertManyAsync([ - new() { - ListFormCode = listForm.ListFormCode, - CultureName = LanguageCodes.En, - SourceDbType = DbType.Guid, - FieldName = "Id", - CaptionName = "App.Listform.ListformField.Id", - Width = 0, - ListOrderNo = 1, - Visible = false, - IsActive = true, - ColumnCustomizationJson = DefaultColumnCustomizationJson, - PermissionJson = DefaultFieldPermissionJson(listForm.Name), - PivotSettingsJson = DefaultPivotSettingsJson - }, - new() - { - ListFormCode = listForm.ListFormCode, - CultureName = LanguageCodes.En, - SourceDbType = DbType.String, - FieldName = "Name", - EditGroupOrderNo = 1, - EditOrderNo = 2, - EditorType2 = EditorTypes.dxTextBox, - ColSpan = 1, - CaptionName = "App.Listform.ListformField.Name", - Width = 0, - ListOrderNo = 2, - Visible = true, - IsActive = true, - SortIndex = 1, - SortDirection = GridColumnOptions.SortOrderAsc, - AllowSearch = true, - ValidationRuleJson = DefaultValidationRuleRequiredJson, - ColumnCustomizationJson = DefaultColumnCustomizationJson, - PermissionJson = DefaultFieldPermissionJson(listForm.Name), - PivotSettingsJson = DefaultPivotSettingsJson - }, - new() - { - ListFormCode = listForm.ListFormCode, - CultureName = LanguageCodes.En, - SourceDbType = DbType.Guid, - FieldName = "ParentId", - EditGroupOrderNo = 1, - EditOrderNo = 3, - EditorType2 = EditorTypes.dxSelectBox, - ColSpan = 1, - EditorOptions = EditorOptions.ShowClearButton(), - CaptionName = "App.Listform.ListformField.ParentId", - Width = 0, - ListOrderNo = 3, - Visible = true, - IsActive = true, - AllowSearch = true, - LookupJson = JsonSerializer.Serialize(new LookupDto { - DataSourceType = UiLookupDataSourceTypeEnum.Query, - DisplayExpr = "Name", - ValueExpr = "Key", - LookupQuery = LookupQueryValues.JobPositionFullValues, - CascadeRelationField = "DepartmentId", - CascadeFilterOperator="=", - CascadeParentFields = "DepartmentId", - }), - ColumnCustomizationJson = DefaultColumnCustomizationJson, - PermissionJson = DefaultFieldPermissionJson(listForm.Name), - PivotSettingsJson = DefaultPivotSettingsJson - }, - new() - { - ListFormCode = listForm.ListFormCode, - CultureName = LanguageCodes.En, - SourceDbType = DbType.Guid, - FieldName = "DepartmentId", - EditGroupOrderNo = 1, - EditOrderNo = 1, - EditorType2 = EditorTypes.dxSelectBox, - ColSpan = 1, - EditorOptions = EditorOptions.ShowClearButton(), - CaptionName = "App.Listform.ListformField.Department", - Width = 0, - ListOrderNo = 4, - Visible = true, - IsActive = true, - AllowSearch = true, - LookupJson = JsonSerializer.Serialize(new LookupDto { - DataSourceType = UiLookupDataSourceTypeEnum.Query, - DisplayExpr = "Name", - ValueExpr = "Key", - LookupQuery = LookupQueryValues.DepartmentValues, - CascadeEmptyFields = "ParentId" - }), - ValidationRuleJson = DefaultValidationRuleRequiredJson, - ColumnCustomizationJson = DefaultColumnCustomizationJson, - PermissionJson = DefaultFieldPermissionJson(listForm.Name), - PivotSettingsJson = DefaultPivotSettingsJson - }, - ]); - #endregion - } - #endregion - #region Announcement listFormName = AppCodes.Intranet.Announcement; if (!await _listFormRepository.AnyAsync(a => a.ListFormCode == listFormName)) diff --git a/api/src/Sozsoft.Platform.DbMigrator/Migrations/ListFormSeeder_Hr.cs b/api/src/Sozsoft.Platform.DbMigrator/Migrations/ListFormSeeder_Hr.cs new file mode 100644 index 00000000..c6846fa5 --- /dev/null +++ b/api/src/Sozsoft.Platform.DbMigrator/Migrations/ListFormSeeder_Hr.cs @@ -0,0 +1,769 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Text.Json; +using System.Threading.Tasks; +using Sozsoft.Languages.Languages; +using Sozsoft.Platform.Editors; +using Sozsoft.Platform.Entities; +using Sozsoft.Platform.Enums; +using Sozsoft.Platform.ListForms; +using Sozsoft.Platform.Queries; +using Volo.Abp.Data; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Repositories; +using static Sozsoft.Platform.PlatformConsts; +using static Sozsoft.Platform.PlatformSeeder.ListFormSeeder_DefaultJsons; +using AppCodes = Sozsoft.Platform.Data.Seeds.SeedConsts.AppCodes; + +namespace Sozsoft.Platform.Data.Seeds; + +public class ListFormSeeder_Hr : IDataSeedContributor, ITransientDependency +{ + private readonly IRepository _listFormRepository; + private readonly IRepository _listFormFieldRepository; + + public ListFormSeeder_Hr( + IRepository listFormRepository, + IRepository listFormFieldRepository) + { + _listFormRepository = listFormRepository; + _listFormFieldRepository = listFormFieldRepository; + } + + public async Task SeedAsync(DataSeedContext context) + { + var listFormName = String.Empty; + + #region SkillType + listFormName = AppCodes.Hr.SkillType; + if (!await _listFormRepository.AnyAsync(a => a.ListFormCode == listFormName)) + { + var listForm = await _listFormRepository.InsertAsync( + new ListForm + { + ListFormType = ListFormTypeEnum.List, + PageSize = 10, + ExportJson = DefaultExportJson, + IsSubForm = false, + ShowNote = true, + LayoutJson = DefaultLayoutJson(), + CultureName = LanguageCodes.En, + ListFormCode = listFormName, + Name = listFormName, + Title = listFormName, + DataSourceCode = SeedConsts.DataSources.DefaultCode, + IsTenant = false, + IsBranch = false, + IsOrganizationUnit = false, + Description = $"{listFormName}.Description", + SelectCommandType = SelectCommandTypeEnum.Table, + SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.SkillType)), + SeedFilePath = SeedPathResolver.GetDataFilePath(listFormName), + SeedSyncInsert = false, + SeedSyncUpdate = false, + SeedSyncDelete = false, + KeyFieldName = "Id", + KeyFieldDbSourceType = DbType.String, + DefaultFilter = DefaultFilterJson, + SortMode = GridOptions.SortModeSingle, + FilterRowJson = DefaultFilterRowJson(), + HeaderFilterJson = DefaultHeaderFilterJson(), + SearchPanelJson = DefaultSearchPanelJson(), + GroupPanelJson = DefaultGroupPanelJson(), + SelectionJson = DefaultSelectionSingleJson, + ColumnOptionJson = DefaultColumnOptionJson(), + PermissionJson = DefaultPermissionJson(listFormName), + DeleteCommand = DefaultDeleteCommand(nameof(TableNameEnum.SkillType)), + DeleteFieldsDefaultValueJson = DefaultDeleteFieldsDefaultValueJson(DbType.String), + PagerOptionJson = DefaultPagerOptionJson, + InsertFieldsDefaultValueJson = DefaultInsertFieldsDefaultValueJson(DbType.String, "Name"), + EditingOptionJson = DefaultEditingOptionJson(listFormName, 400, 200, true, true, true, true, false, true), + EditingFormJson = JsonSerializer.Serialize(new List + { + new() { + Order = 1, ColCount = 1, ColSpan = 1, ItemType = "group" }, + }), + SubFormsJson = JsonSerializer.Serialize(new List() { + new { + TabType = ListFormTabTypeEnum.List, + TabTitle = AppCodes.Hr.SkillLevel, + Code = AppCodes.Hr.SkillLevel, + Relation = new List() { + new { + ParentFieldName = "Id", + DbType = DbType.String, + ChildFieldName = "SkillTypeId" + } + } + }, + new { + TabType = ListFormTabTypeEnum.List, + TabTitle = AppCodes.Hr.Skill, + Code = AppCodes.Hr.Skill, + Relation = new List() { + new { + ParentFieldName = "Id", + DbType = DbType.String, + ChildFieldName = "SkillTypeId" + } + } + } + }) + }, autoSave: true); + + #region SkillType Fields + await _listFormFieldRepository.InsertManyAsync([ + new() { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "Id", + CaptionName = "App.Listform.ListformField.Id", + Width = 0, + ListOrderNo = 1, + Visible = false, + IsActive = true, + + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson, + }, + new() + { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "Name", + EditGroupOrderNo = 1, + EditOrderNo = 1, + EditorType2 = EditorTypes.dxTextBox, + ColSpan = 1, + CaptionName = "App.Listform.ListformField.Name", + Width = 0, + ListOrderNo = 2, + Visible = true, + IsActive = true, + + AllowSearch = true, + ValidationRuleJson = DefaultValidationRuleRequiredJson, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson, + } + ], autoSave: true); + #endregion + } + #endregion + + #region Skill Level + listFormName = AppCodes.Hr.SkillLevel; + if (!await _listFormRepository.AnyAsync(a => a.ListFormCode == listFormName)) + { + var listForm = await _listFormRepository.InsertAsync( + new ListForm() + { + ListFormType = ListFormTypeEnum.List, + PageSize = 10, + ExportJson = DefaultExportJson, + IsSubForm = true, + ShowNote = false, + LayoutJson = DefaultLayoutJson(), + CultureName = LanguageCodes.En, + ListFormCode = listFormName, + Name = listFormName, + Title = listFormName, + DataSourceCode = SeedConsts.DataSources.DefaultCode, + IsTenant = false, + IsBranch = false, + IsOrganizationUnit = false, + Description = $"{listFormName}.Description", + SelectCommandType = SelectCommandTypeEnum.Table, + SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.SkillLevel)), + SeedFilePath = SeedPathResolver.GetDataFilePath(listFormName), + SeedSyncInsert = false, + SeedSyncUpdate = false, + SeedSyncDelete = false, + KeyFieldName = "Id", + KeyFieldDbSourceType = DbType.String, + DefaultFilter = DefaultFilterJson, + SortMode = GridOptions.SortModeSingle, + FilterRowJson = DefaultFilterRowJson(), + HeaderFilterJson = DefaultHeaderFilterJson(), + SearchPanelJson = DefaultSearchPanelJson(), + GroupPanelJson = DefaultGroupPanelJson(), + SelectionJson = DefaultSelectionSingleJson, + ColumnOptionJson = DefaultColumnOptionJson(), + PermissionJson = DefaultPermissionJson(listFormName), + DeleteCommand = DefaultDeleteCommand(nameof(TableNameEnum.SkillLevel)), + DeleteFieldsDefaultValueJson = DefaultDeleteFieldsDefaultValueJson(DbType.String), + PagerOptionJson = DefaultPagerOptionJson, + InsertFieldsDefaultValueJson = DefaultInsertFieldsDefaultValueJson(DbType.String, "Name"), + EditingOptionJson = DefaultEditingOptionJson(listFormName, 500, 450, true, true, true, true, false), + EditingFormJson = JsonSerializer.Serialize(new List() { + new() { Order=1, ColCount=1, ColSpan=1, ItemType="group" }, + }), + FormFieldsDefaultValueJson = JsonSerializer.Serialize(new FieldsDefaultValue[] { + new() { FieldName = "IsDefault", FieldDbType = DbType.Boolean, Value = "true", CustomValueType = FieldCustomValueTypeEnum.Value } + }), + }, autoSave: true + ); + + #region Skill Level Fields + await _listFormFieldRepository.InsertManyAsync([ + new() { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "Id", + CaptionName = "App.Listform.ListformField.Id", + Width = 0, + ListOrderNo = 1, + Visible = false, + IsActive = true, + + SortIndex = 0, + ValidationRuleJson = DefaultValidationRuleRequiredJson, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new() { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "Name", + EditGroupOrderNo = 1, + EditOrderNo = 1, + EditorType2 = EditorTypes.dxTextBox, + ColSpan = 1, + CaptionName = "App.Listform.ListformField.Name", + Width = 0, + ListOrderNo = 2, + Visible = true, + IsActive = true, + + SortIndex = 1, + SortDirection = GridColumnOptions.SortOrderAsc, + AllowSearch = true, + ValidationRuleJson = DefaultValidationRuleRequiredJson, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new() { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.Int32, + FieldName = "Progress", + EditGroupOrderNo = 1, + EditOrderNo = 2, + EditorType2 = EditorTypes.dxSlider, + ColSpan = 1, + EditorOptions = EditorOptions.Slider(), + CaptionName = "App.Listform.ListformField.Progress", + Width = 0, + ListOrderNo = 3, + Visible = true, + IsActive = true, + + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new() { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.Boolean, + FieldName = "IsDefault", + EditGroupOrderNo = 1, + EditOrderNo = 3, + EditorType2 = EditorTypes.dxCheckBox, + ColSpan = 1, + CaptionName = "Abp.Mailing.Default", + Width = 0, + ListOrderNo = 4, + Visible = true, + IsActive = true, + + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new() { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "SkillTypeId", + CaptionName = "App.Listform.ListformField.SkillTypeId", + Width = 0, + ListOrderNo = 5, + Visible = false, + IsActive = true, + + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + ], autoSave: true); + #endregion + } + #endregion + + #region Skill + listFormName = AppCodes.Hr.Skill; + if (!await _listFormRepository.AnyAsync(a => a.ListFormCode == listFormName)) + { + var listForm = await _listFormRepository.InsertAsync( + new ListForm() + { + ListFormType = ListFormTypeEnum.List, + PageSize = 10, + ExportJson = DefaultExportJson, + IsSubForm = true, + ShowNote = false, + LayoutJson = DefaultLayoutJson(), + CultureName = LanguageCodes.En, + ListFormCode = listFormName, + Name = listFormName, + Title = listFormName, + DataSourceCode = SeedConsts.DataSources.DefaultCode, + IsTenant = false, + IsBranch = false, + IsOrganizationUnit = false, + Description = $"{listFormName}.Description", + SelectCommandType = SelectCommandTypeEnum.Table, + SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.Skill)), + SeedFilePath = SeedPathResolver.GetDataFilePath(listFormName), + SeedSyncInsert = false, + SeedSyncUpdate = false, + SeedSyncDelete = false, + KeyFieldName = "Id", + KeyFieldDbSourceType = DbType.String, + DefaultFilter = DefaultFilterJson, + SortMode = GridOptions.SortModeSingle, + FilterRowJson = DefaultFilterRowJson(), + HeaderFilterJson = DefaultHeaderFilterJson(), + SearchPanelJson = DefaultSearchPanelJson(), + GroupPanelJson = DefaultGroupPanelJson(), + SelectionJson = DefaultSelectionSingleJson, + ColumnOptionJson = DefaultColumnOptionJson(), + PermissionJson = DefaultPermissionJson(listFormName), + DeleteCommand = DefaultDeleteCommand(nameof(TableNameEnum.Skill)), + DeleteFieldsDefaultValueJson = DefaultDeleteFieldsDefaultValueJson(DbType.String), + PagerOptionJson = DefaultPagerOptionJson, + InsertFieldsDefaultValueJson = DefaultInsertFieldsDefaultValueJson(DbType.String, "Name"), + EditingOptionJson = DefaultEditingOptionJson(AppCodes.Hr.SkillLevel, 500, 250, true, true, true, true, false), + EditingFormJson = JsonSerializer.Serialize(new List() { + new() { Order=1, ColCount=1, ColSpan=1, ItemType="group" }, + }), + }, autoSave: true + ); + + #region Skill Fields + await _listFormFieldRepository.InsertManyAsync([ + new() { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "Id", + CaptionName = "App.Listform.ListformField.Id", + Width = 0, + ListOrderNo = 1, + Visible = false, + IsActive = true, + + SortIndex = 0, + ValidationRuleJson = DefaultValidationRuleRequiredJson, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new() { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "Name", + EditGroupOrderNo = 1, + EditOrderNo = 1, + EditorType2 = EditorTypes.dxTextBox, + ColSpan = 1, + CaptionName = "App.Listform.ListformField.Name", + Width = 0, + ListOrderNo = 2, + Visible = true, + IsActive = true, + + SortIndex = 1, + SortDirection = GridColumnOptions.SortOrderAsc, + AllowSearch = true, + ValidationRuleJson = DefaultValidationRuleRequiredJson, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new() { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "SkillTypeId", + CaptionName = "App.Listform.ListformField.SkillTypeId", + Width = 0, + ListOrderNo = 3, + Visible = false, + IsActive = true, + + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + ], autoSave: true); + #endregion + } + #endregion + + #region Department + listFormName = AppCodes.Hr.Department; + if (!await _listFormRepository.AnyAsync(a => a.ListFormCode == listFormName)) + { + var listForm = await _listFormRepository.InsertAsync( + new ListForm() + { + ListFormType = ListFormTypeEnum.List, + PageSize = 10, + ExportJson = DefaultExportJson, + IsSubForm = false, + ShowNote = false, + LayoutJson = DefaultLayoutJson("tree"), + CultureName = LanguageCodes.En, + ListFormCode = listFormName, + Name = listFormName, + Title = listFormName, + DataSourceCode = SeedConsts.DataSources.DefaultCode, + IsTenant = true, + IsBranch = false, + IsOrganizationUnit = false, + Description = $"{listFormName}.Description", + SelectCommandType = SelectCommandTypeEnum.Table, + SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.Department)), + SeedFilePath = SeedPathResolver.GetDataFilePath(listFormName), + SeedSyncInsert = false, + SeedSyncUpdate = false, + SeedSyncDelete = false, + KeyFieldName = "Id", + KeyFieldDbSourceType = DbType.Guid, + DefaultFilter = DefaultFilterJson, + SortMode = GridOptions.SortModeSingle, + FilterRowJson = DefaultFilterRowJson(), + HeaderFilterJson = DefaultHeaderFilterJson(), + SearchPanelJson = DefaultSearchPanelJson(), + GroupPanelJson = DefaultGroupPanelJson(), + SelectionJson = DefaultSelectionSingleJson, + ColumnOptionJson = DefaultColumnOptionJson(), + PermissionJson = DefaultPermissionJson(listFormName), + DeleteCommand = DefaultDeleteCommand(nameof(TableNameEnum.Department)), + DeleteFieldsDefaultValueJson = DefaultDeleteFieldsDefaultValueJson(), + PagerOptionJson = DefaultPagerOptionJson, + TreeOptionJson = DefaultTreeOptionJson("Id", "ParentId", true), + InsertFieldsDefaultValueJson = DefaultInsertFieldsDefaultValueJson(), + EditingOptionJson = DefaultEditingOptionJson(listFormName, 400, 500, true, true, true, true, false), + EditingFormJson = JsonSerializer.Serialize(new List + { + new() { + Order = 1, ColCount = 1, ColSpan = 1, ItemType = "group" }, + }), + }); + + #region Department Fields + await _listFormFieldRepository.InsertManyAsync([ + new() { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.Guid, + FieldName = "Id", + CaptionName = "App.Listform.ListformField.Id", + Width = 0, + ListOrderNo = 1, + Visible = false, + IsActive = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new() + { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.Guid, + FieldName = "BranchId", + EditGroupOrderNo = 1, + EditOrderNo = 1, + EditorType2 = EditorTypes.dxSelectBox, + ColSpan = 1, + CaptionName = "App.Listform.ListformField.BranchId", + Width = 0, + ListOrderNo = 2, + Visible = true, + IsActive = true, + AllowSearch = true, + LookupJson = JsonSerializer.Serialize(new LookupDto { + DataSourceType = UiLookupDataSourceTypeEnum.Query, + DisplayExpr = "Name", + ValueExpr = "Key", + LookupQuery = LookupQueryValues.TenantBranchValues, + CascadeEmptyFields = "ParentId" + }), + ValidationRuleJson = DefaultValidationRuleRequiredJson, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new() + { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "Name", + EditGroupOrderNo = 1, + EditOrderNo = 2, + EditorType2 = EditorTypes.dxTextBox, + ColSpan = 1, + CaptionName = "App.Listform.ListformField.Name", + Width = 0, + ListOrderNo = 3, + Visible = true, + IsActive = true, + SortIndex = 1, + SortDirection = GridColumnOptions.SortOrderAsc, + AllowSearch = true, + ValidationRuleJson = DefaultValidationRuleRequiredJson, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new() + { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.Guid, + FieldName = "ParentId", + EditGroupOrderNo = 1, + EditOrderNo = 3, + EditorType2 = EditorTypes.dxSelectBox, + ColSpan = 1, + EditorOptions = EditorOptions.ShowClearButton(), + CaptionName = "App.Listform.ListformField.ParentId", + Width = 0, + ListOrderNo = 4, + Visible = true, + IsActive = true, + AllowSearch = true, + LookupJson = JsonSerializer.Serialize(new LookupDto { + DataSourceType = UiLookupDataSourceTypeEnum.Query, + DisplayExpr = "Name", + ValueExpr = "Key", + LookupQuery = LookupQueryValues.BranchDepartmentValues, + CascadeRelationField = "BranchId", + CascadeFilterOperator="=", + CascadeParentFields = "BranchId", + }), + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + ]); + #endregion + } + #endregion + + #region JobPosition + listFormName = AppCodes.Hr.JobPosition; + if (!await _listFormRepository.AnyAsync(a => a.ListFormCode == listFormName)) + { + var listForm = await _listFormRepository.InsertAsync( + new ListForm() + { + ListFormType = ListFormTypeEnum.List, + PageSize = 10, + ExportJson = DefaultExportJson, + IsSubForm = false, + ShowNote = false, + LayoutJson = DefaultLayoutJson("tree"), + CultureName = LanguageCodes.En, + ListFormCode = listFormName, + Name = listFormName, + Title = listFormName, + DataSourceCode = SeedConsts.DataSources.DefaultCode, + IsTenant = true, + IsBranch = false, + IsOrganizationUnit = false, + Description = $"{listFormName}.Description", + SelectCommandType = SelectCommandTypeEnum.Table, + SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.JobPosition)), + SeedFilePath = SeedPathResolver.GetDataFilePath(listFormName), + SeedSyncInsert = false, + SeedSyncUpdate = false, + SeedSyncDelete = false, + KeyFieldName = "Id", + KeyFieldDbSourceType = DbType.Guid, + DefaultFilter = DefaultFilterJson, + SortMode = GridOptions.SortModeSingle, + FilterRowJson = DefaultFilterRowJson(), + HeaderFilterJson = DefaultHeaderFilterJson(), + SearchPanelJson = DefaultSearchPanelJson(), + GroupPanelJson = DefaultGroupPanelJson(), + SelectionJson = DefaultSelectionSingleJson, + ColumnOptionJson = DefaultColumnOptionJson(), + PermissionJson = DefaultPermissionJson(listFormName), + DeleteCommand = DefaultDeleteCommand(nameof(TableNameEnum.JobPosition)), + DeleteFieldsDefaultValueJson = DefaultDeleteFieldsDefaultValueJson(), + PagerOptionJson = DefaultPagerOptionJson, + TreeOptionJson = DefaultTreeOptionJson("Id", "ParentId", true), + InsertFieldsDefaultValueJson = DefaultInsertFieldsDefaultValueJson(), + EditingOptionJson = DefaultEditingOptionJson(listFormName, 400, 350, true, true, true, true, false), + EditingFormJson = JsonSerializer.Serialize(new List + { + new() { + Order = 1, ColCount = 1, ColSpan = 1, ItemType = "group" }, + }), + }); + + #region JobPosition Fields + await _listFormFieldRepository.InsertManyAsync([ + new() { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.Guid, + FieldName = "Id", + CaptionName = "App.Listform.ListformField.Id", + Width = 0, + ListOrderNo = 1, + Visible = false, + IsActive = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new() + { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.Guid, + FieldName = "BranchId", + EditGroupOrderNo = 1, + EditOrderNo = 1, + EditorType2 = EditorTypes.dxSelectBox, + ColSpan = 1, + CaptionName = "App.Listform.ListformField.BranchId", + Width = 0, + ListOrderNo = 2, + Visible = true, + IsActive = true, + AllowSearch = true, + LookupJson = JsonSerializer.Serialize(new LookupDto { + DataSourceType = UiLookupDataSourceTypeEnum.Query, + DisplayExpr = "Name", + ValueExpr = "Key", + LookupQuery = LookupQueryValues.TenantBranchValues, + CascadeEmptyFields = "DepartmentId,ParentId" + }), + ValidationRuleJson = DefaultValidationRuleRequiredJson, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new() + { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "Name", + EditGroupOrderNo = 1, + EditOrderNo = 3, + EditorType2 = EditorTypes.dxTextBox, + ColSpan = 1, + CaptionName = "App.Listform.ListformField.Name", + Width = 0, + ListOrderNo = 3, + Visible = true, + IsActive = true, + SortIndex = 1, + SortDirection = GridColumnOptions.SortOrderAsc, + AllowSearch = true, + ValidationRuleJson = DefaultValidationRuleRequiredJson, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new() + { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.Guid, + FieldName = "ParentId", + EditGroupOrderNo = 1, + EditOrderNo = 4, + EditorType2 = EditorTypes.dxSelectBox, + ColSpan = 1, + EditorOptions = EditorOptions.ShowClearButton(), + CaptionName = "App.Listform.ListformField.ParentId", + Width = 0, + ListOrderNo = 4, + Visible = true, + IsActive = true, + AllowSearch = true, + LookupJson = JsonSerializer.Serialize(new LookupDto { + DataSourceType = UiLookupDataSourceTypeEnum.Query, + DisplayExpr = "Name", + ValueExpr = "Key", + LookupQuery = LookupQueryValues.JobPositionFullValues, + CascadeRelationField = "DepartmentId", + CascadeFilterOperator="=", + CascadeParentFields = "DepartmentId", + }), + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + new() + { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.Guid, + FieldName = "DepartmentId", + EditGroupOrderNo = 1, + EditOrderNo = 2, + EditorType2 = EditorTypes.dxSelectBox, + ColSpan = 1, + EditorOptions = EditorOptions.ShowClearButton(), + CaptionName = "App.Listform.ListformField.Department", + Width = 0, + ListOrderNo = 5, + Visible = true, + IsActive = true, + AllowSearch = true, + LookupJson = JsonSerializer.Serialize(new LookupDto { + DataSourceType = UiLookupDataSourceTypeEnum.Query, + DisplayExpr = "Name", + ValueExpr = "Key", + LookupQuery = LookupQueryValues.BranchDepartmentValues, + CascadeRelationField = "BranchId", + CascadeFilterOperator="=", + CascadeParentFields = "BranchId", + CascadeEmptyFields = "ParentId" + }), + ValidationRuleJson = DefaultValidationRuleRequiredJson, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson + }, + ]); + #endregion + } + #endregion + } +} diff --git a/api/src/Sozsoft.Platform.DbMigrator/Migrations/ListFormSeeder_Saas.cs b/api/src/Sozsoft.Platform.DbMigrator/Migrations/ListFormSeeder_Saas.cs index aa659653..3452450a 100644 --- a/api/src/Sozsoft.Platform.DbMigrator/Migrations/ListFormSeeder_Saas.cs +++ b/api/src/Sozsoft.Platform.DbMigrator/Migrations/ListFormSeeder_Saas.cs @@ -2841,723 +2841,6 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency } #endregion - #region Sequence - listFormName = AppCodes.Definitions.Sequence; - if (!await _listFormRepository.AnyAsync(a => a.ListFormCode == listFormName)) - { - var listForm = await _listFormRepository.InsertAsync( - new ListForm() - { - ListFormType = ListFormTypeEnum.List, - PageSize = 10, - ExportJson = DefaultExportJson, - IsSubForm = false, - ShowNote = false, - LayoutJson = DefaultLayoutJson(), - CultureName = LanguageCodes.En, - ListFormCode = listFormName, - Name = listFormName, - Title = listFormName, - DataSourceCode = SeedConsts.DataSources.DefaultCode, - IsTenant = false, - IsBranch = false, - IsOrganizationUnit = false, - Description = $"{listFormName}.Description", - SelectCommandType = SelectCommandTypeEnum.Table, - SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.Sequence)), - SeedFilePath = SeedPathResolver.GetDataFilePath(listFormName), - SeedSyncInsert = false, - SeedSyncUpdate = false, - SeedSyncDelete = false, - KeyFieldName = "Id", - KeyFieldDbSourceType = DbType.Guid, - DefaultFilter = DefaultFilterJson, - SortMode = GridOptions.SortModeSingle, - FilterRowJson = DefaultFilterRowJson(), - HeaderFilterJson = DefaultHeaderFilterJson(), - SearchPanelJson = DefaultSearchPanelJson(), - GroupPanelJson = DefaultGroupPanelJson(), - SelectionJson = DefaultSelectionSingleJson, - ColumnOptionJson = DefaultColumnOptionJson(), - PermissionJson = DefaultPermissionJson(listFormName), - DeleteCommand = DefaultDeleteCommand(nameof(TableNameEnum.Sequence)), - DeleteFieldsDefaultValueJson = DefaultDeleteFieldsDefaultValueJson(), - PagerOptionJson = DefaultPagerOptionJson, - EditingOptionJson = DefaultEditingOptionJson(listFormName, 700, 500, true, true, true, true, false), - EditingFormJson = JsonSerializer.Serialize(new List - { - new() { - Order = 1, ColCount = 2, ColSpan = 1, ItemType = "group" }, - }), - InsertFieldsDefaultValueJson = DefaultInsertFieldsDefaultValueJson(), - FormFieldsDefaultValueJson = JsonSerializer.Serialize(new FieldsDefaultValue[] { - new() { FieldName = "IsActive", FieldDbType = DbType.Boolean, Value = "true", CustomValueType = FieldCustomValueTypeEnum.Value }, - new() { FieldName = "PaddingSize", FieldDbType = DbType.Int16, Value = "5", CustomValueType = FieldCustomValueTypeEnum.Value }, - new() { FieldName = "IncrementStep", FieldDbType = DbType.Int16, Value = "1", CustomValueType = FieldCustomValueTypeEnum.Value }, - new() { FieldName = "StartNumber", FieldDbType = DbType.Int16, Value = "1", CustomValueType = FieldCustomValueTypeEnum.Value }, - new() { FieldName = "FormatTemplate", FieldDbType = DbType.String, Value = "{Prefix}{Number}{Suffix}", CustomValueType = FieldCustomValueTypeEnum.Value }, - new() { FieldName = "ResetPeriod", FieldDbType = DbType.Int16, Value = "0", CustomValueType = FieldCustomValueTypeEnum.Value }, - }), - }); - - #region Sequence Fields - await _listFormFieldRepository.InsertManyAsync([ - new() - { - ListFormCode = listForm.ListFormCode, - CultureName = LanguageCodes.En, - SourceDbType = DbType.Guid, - FieldName = "Id", - CaptionName = "App.Listform.ListformField.Id", - Width = 0, - ListOrderNo = 1, - Visible = false, - IsActive = true, - - ColumnCustomizationJson = DefaultColumnCustomizationJson, - PermissionJson = DefaultFieldPermissionJson(listForm.Name), - PivotSettingsJson = DefaultPivotSettingsJson - }, - new() - { - ListFormCode = listForm.ListFormCode, - CultureName = LanguageCodes.En, - SourceDbType = DbType.String, - FieldName = "Name", - EditGroupOrderNo = 1, - EditOrderNo = 1, - EditorType2 = EditorTypes.dxTextBox, - ColSpan = 1, - CaptionName = "App.Listform.ListformField.Name", - Width = 0, - ListOrderNo = 2, - Visible = true, - IsActive = true, - - SortIndex = 1, - SortDirection = GridColumnOptions.SortOrderAsc, - AllowSearch = true, - ValidationRuleJson = DefaultValidationRuleRequiredJson, - ColumnCustomizationJson = DefaultColumnCustomizationJson, - PermissionJson = DefaultFieldPermissionJson(listForm.Name), - PivotSettingsJson = DefaultPivotSettingsJson - }, - new() - { - ListFormCode = listForm.ListFormCode, - CultureName = LanguageCodes.En, - SourceDbType = DbType.String, - FieldName = "Prefix", - EditGroupOrderNo = 1, - EditOrderNo = 3, - EditorType2 = EditorTypes.dxTextBox, - ColSpan = 1, - CaptionName = "App.Listform.ListformField.Prefix", - Width = 0, - ListOrderNo = 3, - Visible = true, - IsActive = true, - - AllowSearch = true, - ColumnCustomizationJson = DefaultColumnCustomizationJson, - PermissionJson = DefaultFieldPermissionJson(listForm.Name), - PivotSettingsJson = DefaultPivotSettingsJson - }, - new() - { - ListFormCode = listForm.ListFormCode, - CultureName = LanguageCodes.En, - SourceDbType = DbType.String, - FieldName = "Suffix", - EditGroupOrderNo = 1, - EditOrderNo = 4, - EditorType2 = EditorTypes.dxTextBox, - ColSpan = 1, - CaptionName = "App.Listform.ListformField.Suffix", - Width = 0, - ListOrderNo = 4, - Visible = true, - IsActive = true, - - AllowSearch = true, - ColumnCustomizationJson = DefaultColumnCustomizationJson, - PermissionJson = DefaultFieldPermissionJson(listForm.Name), - PivotSettingsJson = DefaultPivotSettingsJson - }, - new() - { - ListFormCode = listForm.ListFormCode, - CultureName = LanguageCodes.En, - SourceDbType = DbType.Boolean, - FieldName = "IsActive", - EditGroupOrderNo = 1, - EditOrderNo = 2, - EditorType2 = EditorTypes.dxCheckBox, - ColSpan = 1, - CaptionName = "App.Listform.ListformField.IsActive", - Width = 0, - ListOrderNo = 5, - Visible = true, - IsActive = true, - Alignment = "center", - AllowSearch = true, - ColumnCustomizationJson = DefaultColumnCustomizationJson, - PermissionJson = DefaultFieldPermissionJson(listForm.Name), - PivotSettingsJson = DefaultPivotSettingsJson - }, - new() - { - ListFormCode = listForm.ListFormCode, - CultureName = LanguageCodes.En, - SourceDbType = DbType.Int32, - FieldName = "PaddingSize", - EditGroupOrderNo = 1, - EditOrderNo = 5, - EditorType2 = EditorTypes.dxNumberBox, - ColSpan = 1, - CaptionName = "App.Listform.ListformField.PaddingSize", - Width = 0, - ListOrderNo = 6, - Visible = true, - IsActive = true, - - AllowSearch = true, - ValidationRuleJson = DefaultValidationRuleRequiredJson, - ColumnCustomizationJson = DefaultColumnCustomizationJson, - PermissionJson = DefaultFieldPermissionJson(listForm.Name), - PivotSettingsJson = DefaultPivotSettingsJson - }, - new() - { - ListFormCode = listForm.ListFormCode, - CultureName = LanguageCodes.En, - SourceDbType = DbType.Int32, - FieldName = "IncrementStep", - EditGroupOrderNo = 1, - EditOrderNo = 6, - EditorType2 = EditorTypes.dxNumberBox, - ColSpan = 1, - CaptionName = "App.Listform.ListformField.IncrementStep", - Width = 0, - ListOrderNo = 7, - Visible = true, - IsActive = true, - - AllowSearch = true, - ValidationRuleJson = DefaultValidationRuleRequiredJson, - ColumnCustomizationJson = DefaultColumnCustomizationJson, - PermissionJson = DefaultFieldPermissionJson(listForm.Name), - PivotSettingsJson = DefaultPivotSettingsJson - }, - new() - { - ListFormCode = listForm.ListFormCode, - CultureName = LanguageCodes.En, - SourceDbType = DbType.Int32, - FieldName = "NextNumber", - CaptionName = "App.Listform.ListformField.NextNumber", - Width = 0, - ListOrderNo = 8, - Visible = true, - IsActive = true, - - AllowSearch = true, - ColumnCustomizationJson = DefaultColumnCustomizationJson, - PermissionJson = DefaultFieldPermissionJson(listForm.Name), - PivotSettingsJson = DefaultPivotSettingsJson - }, - new() - { - ListFormCode = listForm.ListFormCode, - CultureName = LanguageCodes.En, - SourceDbType = DbType.Int32, - FieldName = "ResetPeriod", - EditGroupOrderNo = 1, - EditOrderNo = 7, - EditorType2 = EditorTypes.dxSelectBox, - ColSpan = 1, - EditorOptions = EditorOptions.ShowClearButton(), - CaptionName = "App.Listform.ListformField.ResetPeriod", - Width = 0, - ListOrderNo = 9, - Visible = true, - IsActive = true, - LookupJson = JsonSerializer.Serialize(new LookupDto - { - DataSourceType = UiLookupDataSourceTypeEnum.StaticData, - DisplayExpr = "name", - ValueExpr = "key", - LookupQuery = JsonSerializer.Serialize(new LookupDataDto[] { - new() { Key=0, Name="App.StaticLookup.None" }, - new() { Key=1, Name="App.StaticLookup.Yearly"}, - new() { Key=2, Name="App.StaticLookup.Monthly"}, - new() { Key=3, Name="App.StaticLookup.Daily"}, - new() { Key=4, Name="App.StaticLookup.Hourly"}, - new() { Key=5, Name="App.StaticLookup.Minutely"}, - }), - }), - AllowSearch = true, - ValidationRuleJson = DefaultValidationRuleRequiredJson, - ColumnCustomizationJson = DefaultColumnCustomizationJson, - PermissionJson = DefaultFieldPermissionJson(listForm.Name), - PivotSettingsJson = DefaultPivotSettingsJson - }, - new() - { - ListFormCode = listForm.ListFormCode, - CultureName = LanguageCodes.En, - SourceDbType = DbType.Int32, - FieldName = "StartNumber", - EditGroupOrderNo = 1, - EditOrderNo = 8, - EditorType2 = EditorTypes.dxNumberBox, - ColSpan = 1, - CaptionName = "App.Listform.ListformField.StartNumber", - Width = 0, - ListOrderNo = 10, - Visible = true, - IsActive = true, - - AllowSearch = true, - ValidationRuleJson = DefaultValidationRuleRequiredJson, - ColumnCustomizationJson = DefaultColumnCustomizationJson, - PermissionJson = DefaultFieldPermissionJson(listForm.Name), - PivotSettingsJson = DefaultPivotSettingsJson - }, - new() - { - ListFormCode = listForm.ListFormCode, - CultureName = LanguageCodes.En, - SourceDbType = DbType.String, - FieldName = "LastPeriodKey", - CaptionName = "App.Listform.ListformField.LastPeriodKey", - Width = 0, - ListOrderNo = 11, - Visible = true, - IsActive = true, - - AllowSearch = true, - ColumnCustomizationJson = DefaultColumnCustomizationJson, - PermissionJson = DefaultFieldPermissionJson(listForm.Name), - PivotSettingsJson = DefaultPivotSettingsJson - }, - new() - { - ListFormCode = listForm.ListFormCode, - CultureName = LanguageCodes.En, - SourceDbType = DbType.String, - FieldName = "FormatTemplate", - EditGroupOrderNo = 1, - EditOrderNo = 9, - EditorType2 = EditorTypes.dxTextBox, - ColSpan = 2, - CaptionName = "App.Listform.ListformField.FormatTemplate", - Width = 0, - ListOrderNo = 12, - Visible = true, - IsActive = true, - PlaceHolder="{Prefix}-{yyyy}{MM}{dd}-{Number}-{Suffix}", - AllowSearch = true, - ColumnCustomizationJson = DefaultColumnCustomizationJson, - PermissionJson = DefaultFieldPermissionJson(listForm.Name), - PivotSettingsJson = DefaultPivotSettingsJson - }, - ]); - #endregion - } - #endregion - - #region SkillType - listFormName = AppCodes.Definitions.SkillType; - if (!await _listFormRepository.AnyAsync(a => a.ListFormCode == listFormName)) - { - var listForm = await _listFormRepository.InsertAsync( - new ListForm - { - ListFormType = ListFormTypeEnum.List, - PageSize = 10, - ExportJson = DefaultExportJson, - IsSubForm = false, - ShowNote = true, - LayoutJson = DefaultLayoutJson(), - CultureName = LanguageCodes.En, - ListFormCode = listFormName, - Name = listFormName, - Title = listFormName, - DataSourceCode = SeedConsts.DataSources.DefaultCode, - IsTenant = false, - IsBranch = false, - IsOrganizationUnit = false, - Description = $"{listFormName}.Description", - SelectCommandType = SelectCommandTypeEnum.Table, - SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.SkillType)), - SeedFilePath = SeedPathResolver.GetDataFilePath(listFormName), - SeedSyncInsert = false, - SeedSyncUpdate = false, - SeedSyncDelete = false, - KeyFieldName = "Id", - KeyFieldDbSourceType = DbType.String, - DefaultFilter = DefaultFilterJson, - SortMode = GridOptions.SortModeSingle, - FilterRowJson = DefaultFilterRowJson(), - HeaderFilterJson = DefaultHeaderFilterJson(), - SearchPanelJson = DefaultSearchPanelJson(), - GroupPanelJson = DefaultGroupPanelJson(), - SelectionJson = DefaultSelectionSingleJson, - ColumnOptionJson = DefaultColumnOptionJson(), - PermissionJson = DefaultPermissionJson(listFormName), - DeleteCommand = DefaultDeleteCommand(nameof(TableNameEnum.SkillType)), - DeleteFieldsDefaultValueJson = DefaultDeleteFieldsDefaultValueJson(DbType.String), - PagerOptionJson = DefaultPagerOptionJson, - InsertFieldsDefaultValueJson = DefaultInsertFieldsDefaultValueJson(DbType.String, "Name"), - EditingOptionJson = DefaultEditingOptionJson(listFormName, 400, 200, true, true, true, true, false, true), - EditingFormJson = JsonSerializer.Serialize(new List - { - new() { - Order = 1, ColCount = 1, ColSpan = 1, ItemType = "group" }, - }), - SubFormsJson = JsonSerializer.Serialize(new List() { - new { - TabType = ListFormTabTypeEnum.List, - TabTitle = AppCodes.Definitions.SkillLevel, - Code = AppCodes.Definitions.SkillLevel, - Relation = new List() { - new { - ParentFieldName = "Id", - DbType = DbType.String, - ChildFieldName = "SkillTypeId" - } - } - }, - new { - TabType = ListFormTabTypeEnum.List, - TabTitle = AppCodes.Definitions.Skill, - Code = AppCodes.Definitions.Skill, - Relation = new List() { - new { - ParentFieldName = "Id", - DbType = DbType.String, - ChildFieldName = "SkillTypeId" - } - } - } - }) - }, autoSave: true); - - #region SkillType Fields - await _listFormFieldRepository.InsertManyAsync([ - new() { - ListFormCode = listForm.ListFormCode, - CultureName = LanguageCodes.En, - SourceDbType = DbType.String, - FieldName = "Id", - CaptionName = "App.Listform.ListformField.Id", - Width = 0, - ListOrderNo = 1, - Visible = false, - IsActive = true, - - ColumnCustomizationJson = DefaultColumnCustomizationJson, - PermissionJson = DefaultFieldPermissionJson(listForm.Name), - PivotSettingsJson = DefaultPivotSettingsJson, - }, - new() - { - ListFormCode = listForm.ListFormCode, - CultureName = LanguageCodes.En, - SourceDbType = DbType.String, - FieldName = "Name", - EditGroupOrderNo = 1, - EditOrderNo = 1, - EditorType2 = EditorTypes.dxTextBox, - ColSpan = 1, - CaptionName = "App.Listform.ListformField.Name", - Width = 0, - ListOrderNo = 2, - Visible = true, - IsActive = true, - - AllowSearch = true, - ValidationRuleJson = DefaultValidationRuleRequiredJson, - ColumnCustomizationJson = DefaultColumnCustomizationJson, - PermissionJson = DefaultFieldPermissionJson(listForm.Name), - PivotSettingsJson = DefaultPivotSettingsJson, - } - ], autoSave: true); - #endregion - } - #endregion - - #region Skill Level - listFormName = AppCodes.Definitions.SkillLevel; - if (!await _listFormRepository.AnyAsync(a => a.ListFormCode == listFormName)) - { - var listForm = await _listFormRepository.InsertAsync( - new ListForm() - { - ListFormType = ListFormTypeEnum.List, - PageSize = 10, - ExportJson = DefaultExportJson, - IsSubForm = true, - ShowNote = false, - LayoutJson = DefaultLayoutJson(), - CultureName = LanguageCodes.En, - ListFormCode = listFormName, - Name = listFormName, - Title = listFormName, - DataSourceCode = SeedConsts.DataSources.DefaultCode, - IsTenant = false, - IsBranch = false, - IsOrganizationUnit = false, - Description = $"{listFormName}.Description", - SelectCommandType = SelectCommandTypeEnum.Table, - SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.SkillLevel)), - SeedFilePath = SeedPathResolver.GetDataFilePath(listFormName), - SeedSyncInsert = false, - SeedSyncUpdate = false, - SeedSyncDelete = false, - KeyFieldName = "Id", - KeyFieldDbSourceType = DbType.String, - DefaultFilter = DefaultFilterJson, - SortMode = GridOptions.SortModeSingle, - FilterRowJson = DefaultFilterRowJson(), - HeaderFilterJson = DefaultHeaderFilterJson(), - SearchPanelJson = DefaultSearchPanelJson(), - GroupPanelJson = DefaultGroupPanelJson(), - SelectionJson = DefaultSelectionSingleJson, - ColumnOptionJson = DefaultColumnOptionJson(), - PermissionJson = DefaultPermissionJson(listFormName), - DeleteCommand = DefaultDeleteCommand(nameof(TableNameEnum.SkillLevel)), - DeleteFieldsDefaultValueJson = DefaultDeleteFieldsDefaultValueJson(DbType.String), - PagerOptionJson = DefaultPagerOptionJson, - InsertFieldsDefaultValueJson = DefaultInsertFieldsDefaultValueJson(DbType.String, "Name"), - EditingOptionJson = DefaultEditingOptionJson(listFormName, 500, 450, true, true, true, true, false), - EditingFormJson = JsonSerializer.Serialize(new List() { - new() { Order=1, ColCount=1, ColSpan=1, ItemType="group" }, - }), - FormFieldsDefaultValueJson = JsonSerializer.Serialize(new FieldsDefaultValue[] { - new() { FieldName = "IsDefault", FieldDbType = DbType.Boolean, Value = "true", CustomValueType = FieldCustomValueTypeEnum.Value } - }), - }, autoSave: true - ); - - #region Skill Level Fields - await _listFormFieldRepository.InsertManyAsync([ - new() { - ListFormCode = listForm.ListFormCode, - CultureName = LanguageCodes.En, - SourceDbType = DbType.String, - FieldName = "Id", - CaptionName = "App.Listform.ListformField.Id", - Width = 0, - ListOrderNo = 1, - Visible = false, - IsActive = true, - - SortIndex = 0, - ValidationRuleJson = DefaultValidationRuleRequiredJson, - ColumnCustomizationJson = DefaultColumnCustomizationJson, - PermissionJson = DefaultFieldPermissionJson(listForm.Name), - PivotSettingsJson = DefaultPivotSettingsJson - }, - new() { - ListFormCode = listForm.ListFormCode, - CultureName = LanguageCodes.En, - SourceDbType = DbType.String, - FieldName = "Name", - EditGroupOrderNo = 1, - EditOrderNo = 1, - EditorType2 = EditorTypes.dxTextBox, - ColSpan = 1, - CaptionName = "App.Listform.ListformField.Name", - Width = 0, - ListOrderNo = 2, - Visible = true, - IsActive = true, - - SortIndex = 1, - SortDirection = GridColumnOptions.SortOrderAsc, - AllowSearch = true, - ValidationRuleJson = DefaultValidationRuleRequiredJson, - ColumnCustomizationJson = DefaultColumnCustomizationJson, - PermissionJson = DefaultFieldPermissionJson(listForm.Name), - PivotSettingsJson = DefaultPivotSettingsJson - }, - new() { - ListFormCode = listForm.ListFormCode, - CultureName = LanguageCodes.En, - SourceDbType = DbType.Int32, - FieldName = "Progress", - EditGroupOrderNo = 1, - EditOrderNo = 2, - EditorType2 = EditorTypes.dxSlider, - ColSpan = 1, - EditorOptions = EditorOptions.Slider(), - CaptionName = "App.Listform.ListformField.Progress", - Width = 0, - ListOrderNo = 3, - Visible = true, - IsActive = true, - - AllowSearch = true, - ColumnCustomizationJson = DefaultColumnCustomizationJson, - PermissionJson = DefaultFieldPermissionJson(listForm.Name), - PivotSettingsJson = DefaultPivotSettingsJson - }, - new() { - ListFormCode = listForm.ListFormCode, - CultureName = LanguageCodes.En, - SourceDbType = DbType.Boolean, - FieldName = "IsDefault", - EditGroupOrderNo = 1, - EditOrderNo = 3, - EditorType2 = EditorTypes.dxCheckBox, - ColSpan = 1, - CaptionName = "Abp.Mailing.Default", - Width = 0, - ListOrderNo = 4, - Visible = true, - IsActive = true, - - AllowSearch = true, - ColumnCustomizationJson = DefaultColumnCustomizationJson, - PermissionJson = DefaultFieldPermissionJson(listForm.Name), - PivotSettingsJson = DefaultPivotSettingsJson - }, - new() { - ListFormCode = listForm.ListFormCode, - CultureName = LanguageCodes.En, - SourceDbType = DbType.String, - FieldName = "SkillTypeId", - CaptionName = "App.Listform.ListformField.SkillTypeId", - Width = 0, - ListOrderNo = 5, - Visible = false, - IsActive = true, - - AllowSearch = true, - ColumnCustomizationJson = DefaultColumnCustomizationJson, - PermissionJson = DefaultFieldPermissionJson(listForm.Name), - PivotSettingsJson = DefaultPivotSettingsJson - }, - ], autoSave: true); - #endregion - } - #endregion - - #region Skill - listFormName = AppCodes.Definitions.Skill; - if (!await _listFormRepository.AnyAsync(a => a.ListFormCode == listFormName)) - { - var listForm = await _listFormRepository.InsertAsync( - new ListForm() - { - ListFormType = ListFormTypeEnum.List, - PageSize = 10, - ExportJson = DefaultExportJson, - IsSubForm = true, - ShowNote = false, - LayoutJson = DefaultLayoutJson(), - CultureName = LanguageCodes.En, - ListFormCode = listFormName, - Name = listFormName, - Title = listFormName, - DataSourceCode = SeedConsts.DataSources.DefaultCode, - IsTenant = false, - IsBranch = false, - IsOrganizationUnit = false, - Description = $"{listFormName}.Description", - SelectCommandType = SelectCommandTypeEnum.Table, - SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.Skill)), - SeedFilePath = SeedPathResolver.GetDataFilePath(listFormName), - SeedSyncInsert = false, - SeedSyncUpdate = false, - SeedSyncDelete = false, - KeyFieldName = "Id", - KeyFieldDbSourceType = DbType.String, - DefaultFilter = DefaultFilterJson, - SortMode = GridOptions.SortModeSingle, - FilterRowJson = DefaultFilterRowJson(), - HeaderFilterJson = DefaultHeaderFilterJson(), - SearchPanelJson = DefaultSearchPanelJson(), - GroupPanelJson = DefaultGroupPanelJson(), - SelectionJson = DefaultSelectionSingleJson, - ColumnOptionJson = DefaultColumnOptionJson(), - PermissionJson = DefaultPermissionJson(listFormName), - DeleteCommand = DefaultDeleteCommand(nameof(TableNameEnum.Skill)), - DeleteFieldsDefaultValueJson = DefaultDeleteFieldsDefaultValueJson(DbType.String), - PagerOptionJson = DefaultPagerOptionJson, - InsertFieldsDefaultValueJson = DefaultInsertFieldsDefaultValueJson(DbType.String, "Name"), - EditingOptionJson = DefaultEditingOptionJson(AppCodes.Definitions.SkillLevel, 500, 250, true, true, true, true, false), - EditingFormJson = JsonSerializer.Serialize(new List() { - new() { Order=1, ColCount=1, ColSpan=1, ItemType="group" }, - }), - }, autoSave: true - ); - - #region Skill Fields - await _listFormFieldRepository.InsertManyAsync([ - new() { - ListFormCode = listForm.ListFormCode, - CultureName = LanguageCodes.En, - SourceDbType = DbType.String, - FieldName = "Id", - CaptionName = "App.Listform.ListformField.Id", - Width = 0, - ListOrderNo = 1, - Visible = false, - IsActive = true, - - SortIndex = 0, - ValidationRuleJson = DefaultValidationRuleRequiredJson, - ColumnCustomizationJson = DefaultColumnCustomizationJson, - PermissionJson = DefaultFieldPermissionJson(listForm.Name), - PivotSettingsJson = DefaultPivotSettingsJson - }, - new() { - ListFormCode = listForm.ListFormCode, - CultureName = LanguageCodes.En, - SourceDbType = DbType.String, - FieldName = "Name", - EditGroupOrderNo = 1, - EditOrderNo = 1, - EditorType2 = EditorTypes.dxTextBox, - ColSpan = 1, - CaptionName = "App.Listform.ListformField.Name", - Width = 0, - ListOrderNo = 2, - Visible = true, - IsActive = true, - - SortIndex = 1, - SortDirection = GridColumnOptions.SortOrderAsc, - AllowSearch = true, - ValidationRuleJson = DefaultValidationRuleRequiredJson, - ColumnCustomizationJson = DefaultColumnCustomizationJson, - PermissionJson = DefaultFieldPermissionJson(listForm.Name), - PivotSettingsJson = DefaultPivotSettingsJson - }, - new() { - ListFormCode = listForm.ListFormCode, - CultureName = LanguageCodes.En, - SourceDbType = DbType.String, - FieldName = "SkillTypeId", - CaptionName = "App.Listform.ListformField.SkillTypeId", - Width = 0, - ListOrderNo = 3, - Visible = false, - IsActive = true, - - AllowSearch = true, - ColumnCustomizationJson = DefaultColumnCustomizationJson, - PermissionJson = DefaultFieldPermissionJson(listForm.Name), - PivotSettingsJson = DefaultPivotSettingsJson - }, - ], autoSave: true); - #endregion - } - #endregion - #region SettingDefinition listFormName = AppCodes.SettingDefinitions; if (!await _listFormRepository.AnyAsync(a => a.ListFormCode == listFormName)) diff --git a/api/src/Sozsoft.Platform.DbMigrator/Migrations/PlatformIdentityDataSeeder.cs b/api/src/Sozsoft.Platform.DbMigrator/Migrations/PlatformIdentityDataSeeder.cs index 5b199aaf..2e8d659b 100644 --- a/api/src/Sozsoft.Platform.DbMigrator/Migrations/PlatformIdentityDataSeeder.cs +++ b/api/src/Sozsoft.Platform.DbMigrator/Migrations/PlatformIdentityDataSeeder.cs @@ -84,7 +84,9 @@ public class PlatformIdentityDataSeeder : IdentityDataSeeder var defaultBranch = await _branchRepository.FirstOrDefaultAsync(b => b.Code == branchCode); if (defaultBranch == null) { - var branchId = GuidGenerator.Create(); + var branchId = tenantId == null && !CurrentTenant.IsAvailable + ? PlatformConsts.Branches.BranchIdDefaultValue + : GuidGenerator.Create(); defaultBranch = await _branchRepository.InsertAsync(new Branch(branchId) { Code = branchCode, diff --git a/api/src/Sozsoft.Platform.Domain.Shared/Enums/MenuPrefixEnum.cs b/api/src/Sozsoft.Platform.Domain.Shared/Enums/MenuPrefixEnum.cs index 279d03b1..08a3b004 100644 --- a/api/src/Sozsoft.Platform.Domain.Shared/Enums/MenuPrefixEnum.cs +++ b/api/src/Sozsoft.Platform.Domain.Shared/Enums/MenuPrefixEnum.cs @@ -6,6 +6,7 @@ public enum MenuPrefix { Sas, Administration, + Hr, } public static class MenuPrefixExtensions @@ -16,6 +17,7 @@ public static class MenuPrefixExtensions { MenuPrefix.Sas => "Sas", MenuPrefix.Administration => "Adm", + MenuPrefix.Hr => "Hr", _ => throw new ArgumentOutOfRangeException(nameof(menu), menu, null) }; } diff --git a/api/src/Sozsoft.Platform.Domain.Shared/PlatformConsts.cs b/api/src/Sozsoft.Platform.Domain.Shared/PlatformConsts.cs index 7b8baa1f..b15bfc9e 100644 --- a/api/src/Sozsoft.Platform.Domain.Shared/PlatformConsts.cs +++ b/api/src/Sozsoft.Platform.Domain.Shared/PlatformConsts.cs @@ -63,6 +63,8 @@ public static class PlatformConsts public static class Branches { + // Host şubesinin kimliği sabittir; seed edilen departman/pozisyon satırları BranchId ile ona bağlanır. + public static readonly Guid BranchIdDefaultValue = Guid.Parse("1c125bf3-3ffd-4445-a270-1bc43ac3f61c"); public const string BranchCode = "Sozsoft"; public const string BranchName = "Sozsoft Branch"; public const long BranchVknTckn = 52849619172; @@ -419,12 +421,20 @@ public static class PlatformConsts public const string Country = Default + ".Country"; public const string City = Default + ".City"; public const string District = Default + ".District"; - public const string SkillType = Default + ".SkillType"; public const string UomCategory = Default + ".UomCategory"; public const string Sector = Default + ".Sector"; + } + + public static class Hr + { + public const string Default = Prefix.App + ".Hr"; + + public const string Definitions = Default + ".Definitions"; + public const string SkillType = Default + ".SkillType"; public const string Department = Default + ".Department"; public const string JobPosition = Default + ".JobPosition"; + public const string OrgChart = Default + ".OrgChart"; } public static class Restrictions diff --git a/api/src/Sozsoft.Platform.Domain.Shared/TableNameResolver.cs b/api/src/Sozsoft.Platform.Domain.Shared/TableNameResolver.cs index 0b3cf42e..1355fa33 100644 --- a/api/src/Sozsoft.Platform.Domain.Shared/TableNameResolver.cs +++ b/api/src/Sozsoft.Platform.Domain.Shared/TableNameResolver.cs @@ -23,9 +23,9 @@ public static class TableNameResolver { nameof(TableNameEnum.Country), (TablePrefix.PlatformByName, MenuPrefix.Sas) }, { nameof(TableNameEnum.City), (TablePrefix.PlatformByName, MenuPrefix.Sas) }, { nameof(TableNameEnum.District), (TablePrefix.PlatformByName, MenuPrefix.Sas) }, - { nameof(TableNameEnum.SkillType), (TablePrefix.PlatformByName, MenuPrefix.Sas) }, - { nameof(TableNameEnum.Skill), (TablePrefix.PlatformByName, MenuPrefix.Sas) }, - { nameof(TableNameEnum.SkillLevel), (TablePrefix.PlatformByName, MenuPrefix.Sas) }, + { nameof(TableNameEnum.SkillType), (TablePrefix.PlatformByName, MenuPrefix.Hr) }, + { nameof(TableNameEnum.Skill), (TablePrefix.PlatformByName, MenuPrefix.Hr) }, + { nameof(TableNameEnum.SkillLevel), (TablePrefix.PlatformByName, MenuPrefix.Hr) }, { nameof(TableNameEnum.UomCategory), (TablePrefix.PlatformByName, MenuPrefix.Sas) }, { nameof(TableNameEnum.Uom), (TablePrefix.PlatformByName, MenuPrefix.Sas) }, { nameof(TableNameEnum.Branch), (TablePrefix.TenantByName, MenuPrefix.Sas) }, @@ -70,8 +70,8 @@ public static class TableNameResolver // 🔹 ADMINISTRATION TABLOLARI { nameof(TableNameEnum.Sector), (TablePrefix.TenantByName, MenuPrefix.Administration) }, - { nameof(TableNameEnum.Department), (TablePrefix.TenantByName, MenuPrefix.Administration) }, - { nameof(TableNameEnum.JobPosition), (TablePrefix.TenantByName, MenuPrefix.Administration) }, + { nameof(TableNameEnum.Department), (TablePrefix.TenantByName, MenuPrefix.Hr) }, + { nameof(TableNameEnum.JobPosition), (TablePrefix.TenantByName, MenuPrefix.Hr) }, { nameof(TableNameEnum.WorkHour), (TablePrefix.TenantByName, MenuPrefix.Administration) }, { nameof(TableNameEnum.IpRestriction), (TablePrefix.TenantByName, MenuPrefix.Administration) }, { nameof(TableNameEnum.Note), (TablePrefix.TenantByName, MenuPrefix.Administration) }, diff --git a/api/src/Sozsoft.Platform.Domain/Data/SeedConsts.cs b/api/src/Sozsoft.Platform.Domain/Data/SeedConsts.cs index 1f494766..6960d260 100644 --- a/api/src/Sozsoft.Platform.Domain/Data/SeedConsts.cs +++ b/api/src/Sozsoft.Platform.Domain/Data/SeedConsts.cs @@ -364,15 +364,23 @@ public static class SeedConsts public const string Country = Default + ".Country"; public const string City = Default + ".City"; public const string District = Default + ".District"; - public const string SkillType = Default + ".SkillType"; - public const string SkillLevel = Default + ".SkillLevel"; - public const string Skill = Default + ".Skill"; public const string UomCategory = Default + ".UomCategory"; public const string Uom = Default + ".Uom"; public const string Sector = Default + ".Sector"; + } + + public static class Hr + { + public const string Default = Prefix.App + ".Hr"; + + public const string Definitions = Default + ".Definitions"; + public const string SkillType = Default + ".SkillType"; + public const string SkillLevel = Default + ".SkillLevel"; + public const string Skill = Default + ".Skill"; public const string Department = Default + ".Department"; public const string JobPosition = Default + ".JobPosition"; + public const string OrgChart = Default + ".OrgChart"; } public static class Restrictions diff --git a/api/src/Sozsoft.Platform.Domain/Entities/Host/Definitions/Skill.cs b/api/src/Sozsoft.Platform.Domain/Entities/Host/Hr/Skill.cs similarity index 100% rename from api/src/Sozsoft.Platform.Domain/Entities/Host/Definitions/Skill.cs rename to api/src/Sozsoft.Platform.Domain/Entities/Host/Hr/Skill.cs diff --git a/api/src/Sozsoft.Platform.Domain/Entities/Host/Definitions/SkillLevel.cs b/api/src/Sozsoft.Platform.Domain/Entities/Host/Hr/SkillLevel.cs similarity index 100% rename from api/src/Sozsoft.Platform.Domain/Entities/Host/Definitions/SkillLevel.cs rename to api/src/Sozsoft.Platform.Domain/Entities/Host/Hr/SkillLevel.cs diff --git a/api/src/Sozsoft.Platform.Domain/Entities/Host/Definitions/SkillType.cs b/api/src/Sozsoft.Platform.Domain/Entities/Host/Hr/SkillType.cs similarity index 100% rename from api/src/Sozsoft.Platform.Domain/Entities/Host/Definitions/SkillType.cs rename to api/src/Sozsoft.Platform.Domain/Entities/Host/Hr/SkillType.cs diff --git a/api/src/Sozsoft.Platform.Domain/Entities/Tenant/Definitions/Department.cs b/api/src/Sozsoft.Platform.Domain/Entities/Tenant/Hr/Department.cs similarity index 92% rename from api/src/Sozsoft.Platform.Domain/Entities/Tenant/Definitions/Department.cs rename to api/src/Sozsoft.Platform.Domain/Entities/Tenant/Hr/Department.cs index 74af63df..617f3d7a 100644 --- a/api/src/Sozsoft.Platform.Domain/Entities/Tenant/Definitions/Department.cs +++ b/api/src/Sozsoft.Platform.Domain/Entities/Tenant/Hr/Department.cs @@ -9,6 +9,8 @@ public class Department : FullAuditedEntity, IMultiTenant { public Guid? TenantId { get; set; } + public Guid BranchId { get; set; } + public string Name { get; set; } public Guid? ParentId { get; set; } diff --git a/api/src/Sozsoft.Platform.Domain/Entities/Tenant/Definitions/JobPosition.cs b/api/src/Sozsoft.Platform.Domain/Entities/Tenant/Hr/JobPosition.cs similarity index 92% rename from api/src/Sozsoft.Platform.Domain/Entities/Tenant/Definitions/JobPosition.cs rename to api/src/Sozsoft.Platform.Domain/Entities/Tenant/Hr/JobPosition.cs index 65d4c28d..aa012a0d 100644 --- a/api/src/Sozsoft.Platform.Domain/Entities/Tenant/Definitions/JobPosition.cs +++ b/api/src/Sozsoft.Platform.Domain/Entities/Tenant/Hr/JobPosition.cs @@ -8,6 +8,8 @@ public class JobPosition : FullAuditedEntity, IMultiTenant { public Guid? TenantId { get; set; } + public Guid BranchId { get; set; } + public string Name { get; set; } public Guid DepartmentId { get; set; } diff --git a/api/src/Sozsoft.Platform.EntityFrameworkCore/EntityFrameworkCore/PlatformDbContext.cs b/api/src/Sozsoft.Platform.EntityFrameworkCore/EntityFrameworkCore/PlatformDbContext.cs index 479cfa5f..12de066b 100644 --- a/api/src/Sozsoft.Platform.EntityFrameworkCore/EntityFrameworkCore/PlatformDbContext.cs +++ b/api/src/Sozsoft.Platform.EntityFrameworkCore/EntityFrameworkCore/PlatformDbContext.cs @@ -967,7 +967,7 @@ public class PlatformDbContext : b.Property(x => x.Name).IsRequired().HasMaxLength(64); - b.HasIndex(x => new { x.TenantId, x.Name }).IsUnique().HasFilter("[IsDeleted] = 0"); + b.HasIndex(x => new { x.TenantId, x.BranchId, x.Name }).IsUnique().HasFilter("[IsDeleted] = 0"); }); builder.Entity(b => diff --git a/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260922201238_Initial.Designer.cs b/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260922201238_Initial.Designer.cs index 03c93d79..f18b822b 100644 --- a/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260922201238_Initial.Designer.cs +++ b/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260922201238_Initial.Designer.cs @@ -2319,6 +2319,9 @@ namespace Sozsoft.Platform.Migrations b.Property("Id") .HasColumnType("uniqueidentifier"); + b.Property("BranchId") + .HasColumnType("uniqueidentifier"); + b.Property("CreationTime") .HasColumnType("datetime2") .HasColumnName("CreationTime"); @@ -2363,11 +2366,11 @@ namespace Sozsoft.Platform.Migrations b.HasKey("Id"); - b.HasIndex("TenantId", "Name") + b.HasIndex("TenantId", "BranchId", "Name") .IsUnique() .HasFilter("[IsDeleted] = 0"); - b.ToTable("Adm_T_Department", (string)null); + b.ToTable("Hr_T_Department", (string)null); }); modelBuilder.Entity("Sozsoft.Platform.Entities.DevRequest", b => @@ -3199,6 +3202,9 @@ namespace Sozsoft.Platform.Migrations b.Property("Id") .HasColumnType("uniqueidentifier"); + b.Property("BranchId") + .HasColumnType("uniqueidentifier"); + b.Property("CreationTime") .HasColumnType("datetime2") .HasColumnName("CreationTime"); @@ -3252,7 +3258,7 @@ namespace Sozsoft.Platform.Migrations .IsUnique() .HasFilter("[IsDeleted] = 0"); - b.ToTable("Adm_T_JobPosition", (string)null); + b.ToTable("Hr_T_JobPosition", (string)null); }); modelBuilder.Entity("Sozsoft.Platform.Entities.ListForm", b => @@ -5191,7 +5197,7 @@ namespace Sozsoft.Platform.Migrations .IsUnique() .HasFilter("[IsDeleted] = 0"); - b.ToTable("Sas_H_Skill", (string)null); + b.ToTable("Hr_H_Skill", (string)null); }); modelBuilder.Entity("Sozsoft.Platform.Entities.SkillLevel", b => @@ -5256,7 +5262,7 @@ namespace Sozsoft.Platform.Migrations .IsUnique() .HasFilter("[IsDeleted] = 0"); - b.ToTable("Sas_H_SkillLevel", (string)null); + b.ToTable("Hr_H_SkillLevel", (string)null); }); modelBuilder.Entity("Sozsoft.Platform.Entities.SkillType", b => @@ -5306,7 +5312,7 @@ namespace Sozsoft.Platform.Migrations .IsUnique() .HasFilter("[IsDeleted] = 0"); - b.ToTable("Sas_H_SkillType", (string)null); + b.ToTable("Hr_H_SkillType", (string)null); }); modelBuilder.Entity("Sozsoft.Platform.Entities.SocialComment", b => diff --git a/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260922201238_Initial.cs b/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260922201238_Initial.cs index 36ae716c..14143ac4 100644 --- a/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260922201238_Initial.cs +++ b/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260922201238_Initial.cs @@ -543,11 +543,12 @@ namespace Sozsoft.Platform.Migrations }); migrationBuilder.CreateTable( - name: "Adm_T_Department", + name: "Hr_T_Department", columns: table => new { Id = table.Column(type: "uniqueidentifier", nullable: false), TenantId = table.Column(type: "uniqueidentifier", nullable: true), + BranchId = table.Column(type: "uniqueidentifier", nullable: false), Name = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), ParentId = table.Column(type: "uniqueidentifier", nullable: true), CreationTime = table.Column(type: "datetime2", nullable: false), @@ -560,7 +561,7 @@ namespace Sozsoft.Platform.Migrations }, constraints: table => { - table.PrimaryKey("PK_Adm_T_Department", x => x.Id); + table.PrimaryKey("PK_Hr_T_Department", x => x.Id); }); migrationBuilder.CreateTable( @@ -1756,7 +1757,7 @@ namespace Sozsoft.Platform.Migrations }); migrationBuilder.CreateTable( - name: "Sas_H_SkillType", + name: "Hr_H_SkillType", columns: table => new { Id = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), @@ -1771,7 +1772,7 @@ namespace Sozsoft.Platform.Migrations }, constraints: table => { - table.PrimaryKey("PK_Sas_H_SkillType", x => x.Id); + table.PrimaryKey("PK_Hr_H_SkillType", x => x.Id); }); migrationBuilder.CreateTable( @@ -2211,11 +2212,12 @@ namespace Sozsoft.Platform.Migrations }); migrationBuilder.CreateTable( - name: "Adm_T_JobPosition", + name: "Hr_T_JobPosition", columns: table => new { Id = table.Column(type: "uniqueidentifier", nullable: false), TenantId = table.Column(type: "uniqueidentifier", nullable: true), + BranchId = table.Column(type: "uniqueidentifier", nullable: false), Name = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), DepartmentId = table.Column(type: "uniqueidentifier", nullable: false), ParentId = table.Column(type: "uniqueidentifier", nullable: true), @@ -2229,11 +2231,11 @@ namespace Sozsoft.Platform.Migrations }, constraints: table => { - table.PrimaryKey("PK_Adm_T_JobPosition", x => x.Id); + table.PrimaryKey("PK_Hr_T_JobPosition", x => x.Id); table.ForeignKey( - name: "FK_Adm_T_JobPosition_Adm_T_Department_DepartmentId", + name: "FK_Hr_T_JobPosition_Hr_T_Department_DepartmentId", column: x => x.DepartmentId, - principalTable: "Adm_T_Department", + principalTable: "Hr_T_Department", principalColumn: "Id", onDelete: ReferentialAction.Restrict); }); @@ -3031,7 +3033,7 @@ namespace Sozsoft.Platform.Migrations }); migrationBuilder.CreateTable( - name: "Sas_H_Skill", + name: "Hr_H_Skill", columns: table => new { Id = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), @@ -3047,17 +3049,17 @@ namespace Sozsoft.Platform.Migrations }, constraints: table => { - table.PrimaryKey("PK_Sas_H_Skill", x => x.Id); + table.PrimaryKey("PK_Hr_H_Skill", x => x.Id); table.ForeignKey( - name: "FK_Sas_H_Skill_Sas_H_SkillType_SkillTypeId", + name: "FK_Hr_H_Skill_Hr_H_SkillType_SkillTypeId", column: x => x.SkillTypeId, - principalTable: "Sas_H_SkillType", + principalTable: "Hr_H_SkillType", principalColumn: "Id", onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateTable( - name: "Sas_H_SkillLevel", + name: "Hr_H_SkillLevel", columns: table => new { Id = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), @@ -3075,11 +3077,11 @@ namespace Sozsoft.Platform.Migrations }, constraints: table => { - table.PrimaryKey("PK_Sas_H_SkillLevel", x => x.Id); + table.PrimaryKey("PK_Hr_H_SkillLevel", x => x.Id); table.ForeignKey( - name: "FK_Sas_H_SkillLevel_Sas_H_SkillType_SkillTypeId", + name: "FK_Hr_H_SkillLevel_Hr_H_SkillType_SkillTypeId", column: x => x.SkillTypeId, - principalTable: "Sas_H_SkillType", + principalTable: "Hr_H_SkillType", principalColumn: "Id", onDelete: ReferentialAction.Cascade); }); @@ -3801,9 +3803,9 @@ namespace Sozsoft.Platform.Migrations filter: "[IsDeleted] = 0"); migrationBuilder.CreateIndex( - name: "IX_Adm_T_Department_TenantId_Name", - table: "Adm_T_Department", - columns: new[] { "TenantId", "Name" }, + name: "IX_Hr_T_Department_TenantId_BranchId_Name", + table: "Hr_T_Department", + columns: new[] { "TenantId", "BranchId", "Name" }, unique: true, filter: "[IsDeleted] = 0"); @@ -3858,13 +3860,13 @@ namespace Sozsoft.Platform.Migrations filter: "[IsDeleted] = 0"); migrationBuilder.CreateIndex( - name: "IX_Adm_T_JobPosition_DepartmentId", - table: "Adm_T_JobPosition", + name: "IX_Hr_T_JobPosition_DepartmentId", + table: "Hr_T_JobPosition", column: "DepartmentId"); migrationBuilder.CreateIndex( - name: "IX_Adm_T_JobPosition_TenantId_Name_DepartmentId", - table: "Adm_T_JobPosition", + name: "IX_Hr_T_JobPosition_TenantId_Name_DepartmentId", + table: "Hr_T_JobPosition", columns: new[] { "TenantId", "Name", "DepartmentId" }, unique: true, filter: "[IsDeleted] = 0"); @@ -4331,22 +4333,22 @@ namespace Sozsoft.Platform.Migrations filter: "[IsDeleted] = 0"); migrationBuilder.CreateIndex( - name: "IX_Sas_H_Skill_SkillTypeId_Name", - table: "Sas_H_Skill", + name: "IX_Hr_H_Skill_SkillTypeId_Name", + table: "Hr_H_Skill", columns: new[] { "SkillTypeId", "Name" }, unique: true, filter: "[IsDeleted] = 0"); migrationBuilder.CreateIndex( - name: "IX_Sas_H_SkillLevel_SkillTypeId_Name", - table: "Sas_H_SkillLevel", + name: "IX_Hr_H_SkillLevel_SkillTypeId_Name", + table: "Hr_H_SkillLevel", columns: new[] { "SkillTypeId", "Name" }, unique: true, filter: "[IsDeleted] = 0"); migrationBuilder.CreateIndex( - name: "IX_Sas_H_SkillType_Name", - table: "Sas_H_SkillType", + name: "IX_Hr_H_SkillType_Name", + table: "Hr_H_SkillType", column: "Name", unique: true, filter: "[IsDeleted] = 0"); @@ -4510,7 +4512,7 @@ namespace Sozsoft.Platform.Migrations name: "Adm_T_IpRestriction"); migrationBuilder.DropTable( - name: "Adm_T_JobPosition"); + name: "Hr_T_JobPosition"); migrationBuilder.DropTable( name: "Adm_T_MessengerConversationMessage"); @@ -4660,10 +4662,10 @@ namespace Sozsoft.Platform.Migrations name: "Sas_H_SettingDefinition"); migrationBuilder.DropTable( - name: "Sas_H_Skill"); + name: "Hr_H_Skill"); migrationBuilder.DropTable( - name: "Sas_H_SkillLevel"); + name: "Hr_H_SkillLevel"); migrationBuilder.DropTable( name: "Sas_H_Uom"); @@ -4705,7 +4707,7 @@ namespace Sozsoft.Platform.Migrations name: "Adm_T_Event"); migrationBuilder.DropTable( - name: "Adm_T_Department"); + name: "Hr_T_Department"); migrationBuilder.DropTable( name: "Adm_T_MessengerConversation"); @@ -4756,7 +4758,7 @@ namespace Sozsoft.Platform.Migrations name: "Sas_H_Order"); migrationBuilder.DropTable( - name: "Sas_H_SkillType"); + name: "Hr_H_SkillType"); migrationBuilder.DropTable( name: "Sas_H_UomCategory"); diff --git a/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/PlatformDbContextModelSnapshot.cs b/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/PlatformDbContextModelSnapshot.cs index 9d79caef..3e36bb88 100644 --- a/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/PlatformDbContextModelSnapshot.cs +++ b/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/PlatformDbContextModelSnapshot.cs @@ -2316,6 +2316,9 @@ namespace Sozsoft.Platform.Migrations b.Property("Id") .HasColumnType("uniqueidentifier"); + b.Property("BranchId") + .HasColumnType("uniqueidentifier"); + b.Property("CreationTime") .HasColumnType("datetime2") .HasColumnName("CreationTime"); @@ -2360,11 +2363,11 @@ namespace Sozsoft.Platform.Migrations b.HasKey("Id"); - b.HasIndex("TenantId", "Name") + b.HasIndex("TenantId", "BranchId", "Name") .IsUnique() .HasFilter("[IsDeleted] = 0"); - b.ToTable("Adm_T_Department", (string)null); + b.ToTable("Hr_T_Department", (string)null); }); modelBuilder.Entity("Sozsoft.Platform.Entities.DevRequest", b => @@ -3196,6 +3199,9 @@ namespace Sozsoft.Platform.Migrations b.Property("Id") .HasColumnType("uniqueidentifier"); + b.Property("BranchId") + .HasColumnType("uniqueidentifier"); + b.Property("CreationTime") .HasColumnType("datetime2") .HasColumnName("CreationTime"); @@ -3249,7 +3255,7 @@ namespace Sozsoft.Platform.Migrations .IsUnique() .HasFilter("[IsDeleted] = 0"); - b.ToTable("Adm_T_JobPosition", (string)null); + b.ToTable("Hr_T_JobPosition", (string)null); }); modelBuilder.Entity("Sozsoft.Platform.Entities.ListForm", b => @@ -5188,7 +5194,7 @@ namespace Sozsoft.Platform.Migrations .IsUnique() .HasFilter("[IsDeleted] = 0"); - b.ToTable("Sas_H_Skill", (string)null); + b.ToTable("Hr_H_Skill", (string)null); }); modelBuilder.Entity("Sozsoft.Platform.Entities.SkillLevel", b => @@ -5253,7 +5259,7 @@ namespace Sozsoft.Platform.Migrations .IsUnique() .HasFilter("[IsDeleted] = 0"); - b.ToTable("Sas_H_SkillLevel", (string)null); + b.ToTable("Hr_H_SkillLevel", (string)null); }); modelBuilder.Entity("Sozsoft.Platform.Entities.SkillType", b => @@ -5303,7 +5309,7 @@ namespace Sozsoft.Platform.Migrations .IsUnique() .HasFilter("[IsDeleted] = 0"); - b.ToTable("Sas_H_SkillType", (string)null); + b.ToTable("Hr_H_SkillType", (string)null); }); modelBuilder.Entity("Sozsoft.Platform.Entities.SocialComment", b => diff --git a/api/src/Sozsoft.Platform.EntityFrameworkCore/Seeds/TenantIdentityDataSeeder.cs b/api/src/Sozsoft.Platform.EntityFrameworkCore/Seeds/TenantIdentityDataSeeder.cs index 40316054..4c8f7f3f 100644 --- a/api/src/Sozsoft.Platform.EntityFrameworkCore/Seeds/TenantIdentityDataSeeder.cs +++ b/api/src/Sozsoft.Platform.EntityFrameworkCore/Seeds/TenantIdentityDataSeeder.cs @@ -79,7 +79,9 @@ public class TenantIdentityDataSeeder : IdentityDataSeeder var defaultBranch = await _branchRepository.FirstOrDefaultAsync(b => b.Code == branchCode); if (defaultBranch == null) { - var branchId = GuidGenerator.Create(); + var branchId = tenantId == null && !CurrentTenant.IsAvailable + ? PlatformConsts.Branches.BranchIdDefaultValue + : GuidGenerator.Create(); defaultBranch = await _branchRepository.InsertAsync(new Branch(branchId) { Code = branchCode, diff --git a/claude.md b/claude.md index 48224370..7055415f 100644 --- a/claude.md +++ b/claude.md @@ -107,7 +107,7 @@ These sections encode expectations the user will **not** repeat in every prompt. | --- | --- | | Platform davranışı, karar sırası, çıktı sözleşmesi | `.github/instructions/ai.instructions.md` | | **Artefakt üretimi**: seed şemaları, enum değerleri, çalışan örnekler | `.github/instructions/lowcode.instructions.md` | -| **Yetenek envanteri**: JSON kolonlarının alan alan sözleşmesi, grafik/pivot/tasarımcı/mail modülü, Saas + Administration menüsündeki hazır ekranlar | `.github/instructions/lowcode-reference.instructions.md` | +| **Yetenek envanteri**: JSON kolonlarının alan alan sözleşmesi, grafik/pivot/tasarımcı/mail modülü, Saas + Administration + İK menüsündeki hazır ekranlar | `.github/instructions/lowcode-reference.instructions.md` | | `api/` kod standardı (sürüm, nullable, ölü kod, modern C#, ABP katmanları) | `.github/instructions/dotnet.instructions.md` | | Modül/liste ekleme prosedürü, seeder dosya sorumlulukları | `.github/instructions/list.instructions.md` | | Ne nerede yaşıyor, hangi ekran ne yapıyor | `README.md` | @@ -399,6 +399,13 @@ Bir çelişki varsa sıra: `ai.instructions.md` → `dotnet.instructions.md` → kaydın `LastModificationTime`/`CreationTime` değerinden yeniyse güncellenir/silinir. Migrate kullanıcının runtime revizyonunu ezmez. Yeni bir seeder yazarken bu kuralı taklit et: **migrate varsayılanı eklemektir, ezmek değil.** +- **Modül = menü = tablo öneki = yetki kökü** → kök menüler `Sas` (`App.Saas`), `Adm` + (`App.Administration`), `Hr` (`App.Hr`, İK) ve `Pub` modüllerindedir. Bir ekranı modüller arası + taşımak birlikte yapılır: `TableNameResolver` (`MenuPrefix`) + `AppCodes` (Seed/Platform) + + `ListFormSeeder_{Saas,Administration,Hr}.cs` + `data/{ListFormCode}.json` adı + menü/yetki/dil + satırları + route `Authority`. Yetki `Modules` değeri: Saas/Administration `Sas|Adm`, İK `Sas|Hr` + (`Sas` host, `Adm`/`Hr` kiracı görünürlüğü). İK departman/pozisyon `BranchId` zorunludur; seed + satırı host şubesine (`PlatformConsts.Branches.BranchIdDefaultValue`) bağlanır. - **Menü ağacı ve yetkiler** → `configs/seeds/host/data/App.Menus.{Routes,Module,Menu}.json` ve `Abp.Identity.Permission{Groups,s}.json`; platformun kendi menü/yetki kayıtları da diğer liste verisiyle aynı mekanizmadan (`ListFormSeedDataApplier`) geçer, ayrı bir seeder yoktur. `Order` diff --git a/configs/seeds/host/data/Abp.Identity.PermissionGroups.json b/configs/seeds/host/data/Abp.Identity.PermissionGroups.json index b75a6369..f0fb31b9 100644 --- a/configs/seeds/host/data/Abp.Identity.PermissionGroups.json +++ b/configs/seeds/host/data/Abp.Identity.PermissionGroups.json @@ -13,6 +13,11 @@ "Name": "App.Administration", "DisplayName": "App.Administration", "Order": 2 + }, + { + "Name": "App.Hr", + "DisplayName": "App.Hr", + "Order": 3 } ] } diff --git a/configs/seeds/host/data/Abp.Identity.Permissions.json b/configs/seeds/host/data/Abp.Identity.Permissions.json index cbf46213..9f4a28be 100644 --- a/configs/seeds/host/data/Abp.Identity.Permissions.json +++ b/configs/seeds/host/data/Abp.Identity.Permissions.json @@ -504,202 +504,12 @@ "MultiTenancySide": 2, "Modules": "Sas|Adm" }, - { - "GroupName": "App.Saas", - "Name": "App.Definitions.SkillType", - "ParentName": "App.Saas.Definitions", - "DisplayName": "App.Definitions.SkillType", - "Order": 9, - "IsEnabled": true, - "MultiTenancySide": 2, - "Modules": "Sas|Adm" - }, - { - "GroupName": "App.Saas", - "Name": "App.Definitions.SkillType.Create", - "ParentName": "App.Definitions.SkillType", - "DisplayName": "App.Platform.Create", - "Order": 1, - "IsEnabled": true, - "MultiTenancySide": 2, - "Modules": "Sas|Adm" - }, - { - "GroupName": "App.Saas", - "Name": "App.Definitions.SkillType.Update", - "ParentName": "App.Definitions.SkillType", - "DisplayName": "App.Platform.Update", - "Order": 2, - "IsEnabled": true, - "MultiTenancySide": 2, - "Modules": "Sas|Adm" - }, - { - "GroupName": "App.Saas", - "Name": "App.Definitions.SkillType.Delete", - "ParentName": "App.Definitions.SkillType", - "DisplayName": "App.Platform.Delete", - "Order": 3, - "IsEnabled": true, - "MultiTenancySide": 2, - "Modules": "Sas|Adm" - }, - { - "GroupName": "App.Saas", - "Name": "App.Definitions.SkillType.Export", - "ParentName": "App.Definitions.SkillType", - "DisplayName": "Export", - "Order": 4, - "IsEnabled": true, - "MultiTenancySide": 2, - "Modules": "Sas|Adm" - }, - { - "GroupName": "App.Saas", - "Name": "App.Definitions.SkillType.Import", - "ParentName": "App.Definitions.SkillType", - "DisplayName": "Import", - "Order": 5, - "IsEnabled": true, - "MultiTenancySide": 2, - "Modules": "Sas|Adm" - }, - { - "GroupName": "App.Saas", - "Name": "App.Definitions.SkillType.Note", - "ParentName": "App.Definitions.SkillType", - "DisplayName": "Note", - "Order": 6, - "IsEnabled": true, - "MultiTenancySide": 2, - "Modules": "Sas|Adm" - }, - { - "GroupName": "App.Saas", - "Name": "App.Definitions.SkillLevel", - "ParentName": "App.Saas.Definitions", - "DisplayName": "App.Definitions.SkillLevel", - "Order": 10, - "IsEnabled": true, - "MultiTenancySide": 2, - "Modules": "Sas|Adm" - }, - { - "GroupName": "App.Saas", - "Name": "App.Definitions.SkillLevel.Create", - "ParentName": "App.Definitions.SkillLevel", - "DisplayName": "App.Platform.Create", - "Order": 1, - "IsEnabled": true, - "MultiTenancySide": 2, - "Modules": "Sas|Adm" - }, - { - "GroupName": "App.Saas", - "Name": "App.Definitions.SkillLevel.Update", - "ParentName": "App.Definitions.SkillLevel", - "DisplayName": "App.Platform.Update", - "Order": 2, - "IsEnabled": true, - "MultiTenancySide": 2, - "Modules": "Sas|Adm" - }, - { - "GroupName": "App.Saas", - "Name": "App.Definitions.SkillLevel.Delete", - "ParentName": "App.Definitions.SkillLevel", - "DisplayName": "App.Platform.Delete", - "Order": 3, - "IsEnabled": true, - "MultiTenancySide": 2, - "Modules": "Sas|Adm" - }, - { - "GroupName": "App.Saas", - "Name": "App.Definitions.SkillLevel.Export", - "ParentName": "App.Definitions.SkillLevel", - "DisplayName": "Export", - "Order": 4, - "IsEnabled": true, - "MultiTenancySide": 2, - "Modules": "Sas|Adm" - }, - { - "GroupName": "App.Saas", - "Name": "App.Definitions.SkillLevel.Import", - "ParentName": "App.Definitions.SkillLevel", - "DisplayName": "Import", - "Order": 5, - "IsEnabled": true, - "MultiTenancySide": 2, - "Modules": "Sas|Adm" - }, - { - "GroupName": "App.Saas", - "Name": "App.Definitions.Skill", - "ParentName": "App.Saas.Definitions", - "DisplayName": "App.Definitions.Skill", - "Order": 11, - "IsEnabled": true, - "MultiTenancySide": 2, - "Modules": "Sas|Adm" - }, - { - "GroupName": "App.Saas", - "Name": "App.Definitions.Skill.Create", - "ParentName": "App.Definitions.Skill", - "DisplayName": "App.Platform.Create", - "Order": 1, - "IsEnabled": true, - "MultiTenancySide": 2, - "Modules": "Sas|Adm" - }, - { - "GroupName": "App.Saas", - "Name": "App.Definitions.Skill.Update", - "ParentName": "App.Definitions.Skill", - "DisplayName": "App.Platform.Update", - "Order": 2, - "IsEnabled": true, - "MultiTenancySide": 2, - "Modules": "Sas|Adm" - }, - { - "GroupName": "App.Saas", - "Name": "App.Definitions.Skill.Delete", - "ParentName": "App.Definitions.Skill", - "DisplayName": "App.Platform.Delete", - "Order": 3, - "IsEnabled": true, - "MultiTenancySide": 2, - "Modules": "Sas|Adm" - }, - { - "GroupName": "App.Saas", - "Name": "App.Definitions.Skill.Export", - "ParentName": "App.Definitions.Skill", - "DisplayName": "Export", - "Order": 4, - "IsEnabled": true, - "MultiTenancySide": 2, - "Modules": "Sas|Adm" - }, - { - "GroupName": "App.Saas", - "Name": "App.Definitions.Skill.Import", - "ParentName": "App.Definitions.Skill", - "DisplayName": "Import", - "Order": 5, - "IsEnabled": true, - "MultiTenancySide": 2, - "Modules": "Sas|Adm" - }, { "GroupName": "App.Saas", "Name": "App.Definitions.UomCategory", "ParentName": "App.Saas.Definitions", "DisplayName": "App.Definitions.UomCategory", - "Order": 12, + "Order": 9, "IsEnabled": true, "MultiTenancySide": 2, "Modules": "Sas|Adm" @@ -769,7 +579,7 @@ "Name": "App.Definitions.Uom", "ParentName": "App.Saas.Definitions", "DisplayName": "App.Definitions.Uom", - "Order": 13, + "Order": 10, "IsEnabled": true, "MultiTenancySide": 2, "Modules": "Sas|Adm" @@ -824,66 +634,6 @@ "MultiTenancySide": 2, "Modules": "Sas|Adm" }, - { - "GroupName": "App.Saas", - "Name": "App.Definitions.Sequence", - "ParentName": "App.Saas.Definitions", - "DisplayName": "App.Definitions.Sequence", - "Order": 14, - "IsEnabled": true, - "MultiTenancySide": 2, - "Modules": "Sas|Adm" - }, - { - "GroupName": "App.Saas", - "Name": "App.Definitions.Sequence.Create", - "ParentName": "App.Definitions.Sequence", - "DisplayName": "App.Platform.Create", - "Order": 1, - "IsEnabled": true, - "MultiTenancySide": 2, - "Modules": "Sas|Adm" - }, - { - "GroupName": "App.Saas", - "Name": "App.Definitions.Sequence.Update", - "ParentName": "App.Definitions.Sequence", - "DisplayName": "App.Platform.Update", - "Order": 2, - "IsEnabled": true, - "MultiTenancySide": 2, - "Modules": "Sas|Adm" - }, - { - "GroupName": "App.Saas", - "Name": "App.Definitions.Sequence.Delete", - "ParentName": "App.Definitions.Sequence", - "DisplayName": "App.Platform.Delete", - "Order": 3, - "IsEnabled": true, - "MultiTenancySide": 2, - "Modules": "Sas|Adm" - }, - { - "GroupName": "App.Saas", - "Name": "App.Definitions.Sequence.Export", - "ParentName": "App.Definitions.Sequence", - "DisplayName": "Export", - "Order": 4, - "IsEnabled": true, - "MultiTenancySide": 2, - "Modules": "Sas|Adm" - }, - { - "GroupName": "App.Saas", - "Name": "App.Definitions.Sequence.Import", - "ParentName": "App.Definitions.Sequence", - "DisplayName": "Import", - "Order": 5, - "IsEnabled": true, - "MultiTenancySide": 2, - "Modules": "Sas|Adm" - }, { "GroupName": "App.Saas", "Name": "App.Public", @@ -3096,9 +2846,9 @@ }, { "GroupName": "App.Administration", - "Name": "App.Definitions.Department", + "Name": "App.Definitions.Sequence", "ParentName": "App.Administration.Definitions", - "DisplayName": "App.Definitions.Department", + "DisplayName": "App.Definitions.Sequence", "Order": 2, "IsEnabled": true, "MultiTenancySide": 3, @@ -3106,8 +2856,8 @@ }, { "GroupName": "App.Administration", - "Name": "App.Definitions.Department.Create", - "ParentName": "App.Definitions.Department", + "Name": "App.Definitions.Sequence.Create", + "ParentName": "App.Definitions.Sequence", "DisplayName": "App.Platform.Create", "Order": 1, "IsEnabled": true, @@ -3116,8 +2866,8 @@ }, { "GroupName": "App.Administration", - "Name": "App.Definitions.Department.Update", - "ParentName": "App.Definitions.Department", + "Name": "App.Definitions.Sequence.Update", + "ParentName": "App.Definitions.Sequence", "DisplayName": "App.Platform.Update", "Order": 2, "IsEnabled": true, @@ -3126,8 +2876,8 @@ }, { "GroupName": "App.Administration", - "Name": "App.Definitions.Department.Delete", - "ParentName": "App.Definitions.Department", + "Name": "App.Definitions.Sequence.Delete", + "ParentName": "App.Definitions.Sequence", "DisplayName": "App.Platform.Delete", "Order": 3, "IsEnabled": true, @@ -3136,8 +2886,8 @@ }, { "GroupName": "App.Administration", - "Name": "App.Definitions.Department.Export", - "ParentName": "App.Definitions.Department", + "Name": "App.Definitions.Sequence.Export", + "ParentName": "App.Definitions.Sequence", "DisplayName": "Export", "Order": 4, "IsEnabled": true, @@ -3146,84 +2896,14 @@ }, { "GroupName": "App.Administration", - "Name": "App.Definitions.Department.Import", - "ParentName": "App.Definitions.Department", + "Name": "App.Definitions.Sequence.Import", + "ParentName": "App.Definitions.Sequence", "DisplayName": "Import", "Order": 5, "IsEnabled": true, "MultiTenancySide": 3, "Modules": "Sas|Adm" }, - { - "GroupName": "App.Administration", - "Name": "App.Definitions.JobPosition", - "ParentName": "App.Administration.Definitions", - "DisplayName": "App.Definitions.JobPosition", - "Order": 3, - "IsEnabled": true, - "MultiTenancySide": 3, - "Modules": "Sas|Adm" - }, - { - "GroupName": "App.Administration", - "Name": "App.Definitions.JobPosition.Create", - "ParentName": "App.Definitions.JobPosition", - "DisplayName": "App.Platform.Create", - "Order": 1, - "IsEnabled": true, - "MultiTenancySide": 3, - "Modules": "Sas|Adm" - }, - { - "GroupName": "App.Administration", - "Name": "App.Definitions.JobPosition.Update", - "ParentName": "App.Definitions.JobPosition", - "DisplayName": "App.Platform.Update", - "Order": 2, - "IsEnabled": true, - "MultiTenancySide": 3, - "Modules": "Sas|Adm" - }, - { - "GroupName": "App.Administration", - "Name": "App.Definitions.JobPosition.Delete", - "ParentName": "App.Definitions.JobPosition", - "DisplayName": "App.Platform.Delete", - "Order": 3, - "IsEnabled": true, - "MultiTenancySide": 3, - "Modules": "Sas|Adm" - }, - { - "GroupName": "App.Administration", - "Name": "App.Definitions.JobPosition.Export", - "ParentName": "App.Definitions.JobPosition", - "DisplayName": "Export", - "Order": 4, - "IsEnabled": true, - "MultiTenancySide": 3, - "Modules": "Sas|Adm" - }, - { - "GroupName": "App.Administration", - "Name": "App.Definitions.JobPosition.Import", - "ParentName": "App.Definitions.JobPosition", - "DisplayName": "Import", - "Order": 5, - "IsEnabled": true, - "MultiTenancySide": 3, - "Modules": "Sas|Adm" - }, - { - "GroupName": "App.Administration", - "Name": "App.Definitions.OrgChart", - "ParentName": "App.Administration.Definitions", - "DisplayName": "App.Definitions.OrgChart", - "Order": 4, - "IsEnabled": true, - "MultiTenancySide": 3, - "Modules": "Sas|Adm" - }, { "GroupName": "App.Administration", "Name": "App.Licence", @@ -5983,6 +5663,336 @@ "IsEnabled": true, "MultiTenancySide": 3, "Modules": "Sas|Adm" + }, + { + "GroupName": "App.Hr", + "Name": "App.Hr.Definitions", + "ParentName": null, + "DisplayName": "App.Platform.Definitions", + "Order": 1, + "IsEnabled": true, + "MultiTenancySide": 3, + "Modules": "Sas|Hr" + }, + { + "GroupName": "App.Hr", + "Name": "App.Hr.SkillType", + "ParentName": "App.Hr.Definitions", + "DisplayName": "App.Hr.SkillType", + "Order": 1, + "IsEnabled": true, + "MultiTenancySide": 2, + "Modules": "Sas|Hr" + }, + { + "GroupName": "App.Hr", + "Name": "App.Hr.SkillType.Create", + "ParentName": "App.Hr.SkillType", + "DisplayName": "App.Platform.Create", + "Order": 1, + "IsEnabled": true, + "MultiTenancySide": 2, + "Modules": "Sas|Hr" + }, + { + "GroupName": "App.Hr", + "Name": "App.Hr.SkillType.Update", + "ParentName": "App.Hr.SkillType", + "DisplayName": "App.Platform.Update", + "Order": 2, + "IsEnabled": true, + "MultiTenancySide": 2, + "Modules": "Sas|Hr" + }, + { + "GroupName": "App.Hr", + "Name": "App.Hr.SkillType.Delete", + "ParentName": "App.Hr.SkillType", + "DisplayName": "App.Platform.Delete", + "Order": 3, + "IsEnabled": true, + "MultiTenancySide": 2, + "Modules": "Sas|Hr" + }, + { + "GroupName": "App.Hr", + "Name": "App.Hr.SkillType.Export", + "ParentName": "App.Hr.SkillType", + "DisplayName": "Export", + "Order": 4, + "IsEnabled": true, + "MultiTenancySide": 2, + "Modules": "Sas|Hr" + }, + { + "GroupName": "App.Hr", + "Name": "App.Hr.SkillType.Import", + "ParentName": "App.Hr.SkillType", + "DisplayName": "Import", + "Order": 5, + "IsEnabled": true, + "MultiTenancySide": 2, + "Modules": "Sas|Hr" + }, + { + "GroupName": "App.Hr", + "Name": "App.Hr.SkillType.Note", + "ParentName": "App.Hr.SkillType", + "DisplayName": "Note", + "Order": 6, + "IsEnabled": true, + "MultiTenancySide": 2, + "Modules": "Sas|Hr" + }, + { + "GroupName": "App.Hr", + "Name": "App.Hr.SkillLevel", + "ParentName": "App.Hr.Definitions", + "DisplayName": "App.Hr.SkillLevel", + "Order": 2, + "IsEnabled": true, + "MultiTenancySide": 2, + "Modules": "Sas|Hr" + }, + { + "GroupName": "App.Hr", + "Name": "App.Hr.SkillLevel.Create", + "ParentName": "App.Hr.SkillLevel", + "DisplayName": "App.Platform.Create", + "Order": 1, + "IsEnabled": true, + "MultiTenancySide": 2, + "Modules": "Sas|Hr" + }, + { + "GroupName": "App.Hr", + "Name": "App.Hr.SkillLevel.Update", + "ParentName": "App.Hr.SkillLevel", + "DisplayName": "App.Platform.Update", + "Order": 2, + "IsEnabled": true, + "MultiTenancySide": 2, + "Modules": "Sas|Hr" + }, + { + "GroupName": "App.Hr", + "Name": "App.Hr.SkillLevel.Delete", + "ParentName": "App.Hr.SkillLevel", + "DisplayName": "App.Platform.Delete", + "Order": 3, + "IsEnabled": true, + "MultiTenancySide": 2, + "Modules": "Sas|Hr" + }, + { + "GroupName": "App.Hr", + "Name": "App.Hr.SkillLevel.Export", + "ParentName": "App.Hr.SkillLevel", + "DisplayName": "Export", + "Order": 4, + "IsEnabled": true, + "MultiTenancySide": 2, + "Modules": "Sas|Hr" + }, + { + "GroupName": "App.Hr", + "Name": "App.Hr.SkillLevel.Import", + "ParentName": "App.Hr.SkillLevel", + "DisplayName": "Import", + "Order": 5, + "IsEnabled": true, + "MultiTenancySide": 2, + "Modules": "Sas|Hr" + }, + { + "GroupName": "App.Hr", + "Name": "App.Hr.Skill", + "ParentName": "App.Hr.Definitions", + "DisplayName": "App.Hr.Skill", + "Order": 3, + "IsEnabled": true, + "MultiTenancySide": 2, + "Modules": "Sas|Hr" + }, + { + "GroupName": "App.Hr", + "Name": "App.Hr.Skill.Create", + "ParentName": "App.Hr.Skill", + "DisplayName": "App.Platform.Create", + "Order": 1, + "IsEnabled": true, + "MultiTenancySide": 2, + "Modules": "Sas|Hr" + }, + { + "GroupName": "App.Hr", + "Name": "App.Hr.Skill.Update", + "ParentName": "App.Hr.Skill", + "DisplayName": "App.Platform.Update", + "Order": 2, + "IsEnabled": true, + "MultiTenancySide": 2, + "Modules": "Sas|Hr" + }, + { + "GroupName": "App.Hr", + "Name": "App.Hr.Skill.Delete", + "ParentName": "App.Hr.Skill", + "DisplayName": "App.Platform.Delete", + "Order": 3, + "IsEnabled": true, + "MultiTenancySide": 2, + "Modules": "Sas|Hr" + }, + { + "GroupName": "App.Hr", + "Name": "App.Hr.Skill.Export", + "ParentName": "App.Hr.Skill", + "DisplayName": "Export", + "Order": 4, + "IsEnabled": true, + "MultiTenancySide": 2, + "Modules": "Sas|Hr" + }, + { + "GroupName": "App.Hr", + "Name": "App.Hr.Skill.Import", + "ParentName": "App.Hr.Skill", + "DisplayName": "Import", + "Order": 5, + "IsEnabled": true, + "MultiTenancySide": 2, + "Modules": "Sas|Hr" + }, + { + "GroupName": "App.Hr", + "Name": "App.Hr.Department", + "ParentName": "App.Hr.Definitions", + "DisplayName": "App.Hr.Department", + "Order": 4, + "IsEnabled": true, + "MultiTenancySide": 3, + "Modules": "Sas|Hr" + }, + { + "GroupName": "App.Hr", + "Name": "App.Hr.Department.Create", + "ParentName": "App.Hr.Department", + "DisplayName": "App.Platform.Create", + "Order": 1, + "IsEnabled": true, + "MultiTenancySide": 3, + "Modules": "Sas|Hr" + }, + { + "GroupName": "App.Hr", + "Name": "App.Hr.Department.Update", + "ParentName": "App.Hr.Department", + "DisplayName": "App.Platform.Update", + "Order": 2, + "IsEnabled": true, + "MultiTenancySide": 3, + "Modules": "Sas|Hr" + }, + { + "GroupName": "App.Hr", + "Name": "App.Hr.Department.Delete", + "ParentName": "App.Hr.Department", + "DisplayName": "App.Platform.Delete", + "Order": 3, + "IsEnabled": true, + "MultiTenancySide": 3, + "Modules": "Sas|Hr" + }, + { + "GroupName": "App.Hr", + "Name": "App.Hr.Department.Export", + "ParentName": "App.Hr.Department", + "DisplayName": "Export", + "Order": 4, + "IsEnabled": true, + "MultiTenancySide": 3, + "Modules": "Sas|Hr" + }, + { + "GroupName": "App.Hr", + "Name": "App.Hr.Department.Import", + "ParentName": "App.Hr.Department", + "DisplayName": "Import", + "Order": 5, + "IsEnabled": true, + "MultiTenancySide": 3, + "Modules": "Sas|Hr" + }, + { + "GroupName": "App.Hr", + "Name": "App.Hr.JobPosition", + "ParentName": "App.Hr.Definitions", + "DisplayName": "App.Hr.JobPosition", + "Order": 5, + "IsEnabled": true, + "MultiTenancySide": 3, + "Modules": "Sas|Hr" + }, + { + "GroupName": "App.Hr", + "Name": "App.Hr.JobPosition.Create", + "ParentName": "App.Hr.JobPosition", + "DisplayName": "App.Platform.Create", + "Order": 1, + "IsEnabled": true, + "MultiTenancySide": 3, + "Modules": "Sas|Hr" + }, + { + "GroupName": "App.Hr", + "Name": "App.Hr.JobPosition.Update", + "ParentName": "App.Hr.JobPosition", + "DisplayName": "App.Platform.Update", + "Order": 2, + "IsEnabled": true, + "MultiTenancySide": 3, + "Modules": "Sas|Hr" + }, + { + "GroupName": "App.Hr", + "Name": "App.Hr.JobPosition.Delete", + "ParentName": "App.Hr.JobPosition", + "DisplayName": "App.Platform.Delete", + "Order": 3, + "IsEnabled": true, + "MultiTenancySide": 3, + "Modules": "Sas|Hr" + }, + { + "GroupName": "App.Hr", + "Name": "App.Hr.JobPosition.Export", + "ParentName": "App.Hr.JobPosition", + "DisplayName": "Export", + "Order": 4, + "IsEnabled": true, + "MultiTenancySide": 3, + "Modules": "Sas|Hr" + }, + { + "GroupName": "App.Hr", + "Name": "App.Hr.JobPosition.Import", + "ParentName": "App.Hr.JobPosition", + "DisplayName": "Import", + "Order": 5, + "IsEnabled": true, + "MultiTenancySide": 3, + "Modules": "Sas|Hr" + }, + { + "GroupName": "App.Hr", + "Name": "App.Hr.OrgChart", + "ParentName": null, + "DisplayName": "App.Hr.OrgChart", + "Order": 2, + "IsEnabled": true, + "MultiTenancySide": 3, + "Modules": "Sas|Hr" } ] } diff --git a/configs/seeds/host/data/App.Definitions.Department.json b/configs/seeds/host/data/App.Hr.Department.json similarity index 71% rename from configs/seeds/host/data/App.Definitions.Department.json rename to configs/seeds/host/data/App.Hr.Department.json index 610ecd3c..117a9a3b 100644 --- a/configs/seeds/host/data/App.Definitions.Department.json +++ b/configs/seeds/host/data/App.Hr.Department.json @@ -1,36 +1,42 @@ { - "ListFormCode": "App.Definitions.Department", + "ListFormCode": "App.Hr.Department", "KeyFieldName": "Id", "GeneratedAt": "2026-09-04T00:00:00Z", "Order": 10, "Rows": [ { "Id": "8f14e45f-ea2d-4d9f-9f1d-1a2b3c4d5e6f", + "BranchId": "1c125bf3-3ffd-4445-a270-1bc43ac3f61c", "Name": "Yönetim", "ParentId": null }, { "Id": "2c1743a3-91b7-4b57-a6c8-7d8e9f0a1b2c", + "BranchId": "1c125bf3-3ffd-4445-a270-1bc43ac3f61c", "Name": "Üretim", "ParentId": "8f14e45f-ea2d-4d9f-9f1d-1a2b3c4d5e6f" }, { "Id": "987bcab0-1b92-4a4e-8d7f-3c2b1a0f9e8d", + "BranchId": "1c125bf3-3ffd-4445-a270-1bc43ac3f61c", "Name": "Satış", "ParentId": "8f14e45f-ea2d-4d9f-9f1d-1a2b3c4d5e6f" }, { "Id": "05b048d7-2f44-4f9d-b5a1-6e7f8a9b0c1d", + "BranchId": "1c125bf3-3ffd-4445-a270-1bc43ac3f61c", "Name": "Finans", "ParentId": "8f14e45f-ea2d-4d9f-9f1d-1a2b3c4d5e6f" }, { "Id": "051048d7-2f44-4f9d-b5a1-6e7f8a9b0c1d", + "BranchId": "1c125bf3-3ffd-4445-a270-1bc43ac3f61c", "Name": "Muhasebe", "ParentId": "05b048d7-2f44-4f9d-b5a1-6e7f8a9b0c1d" }, { "Id": "3cd38ab3-7e6f-4b8d-9c0a-5f4e3d2c1b0a", + "BranchId": "1c125bf3-3ffd-4445-a270-1bc43ac3f61c", "Name": "Bilgi İşlem", "ParentId": "8f14e45f-ea2d-4d9f-9f1d-1a2b3c4d5e6f" } diff --git a/configs/seeds/host/data/App.Definitions.JobPosition.json b/configs/seeds/host/data/App.Hr.JobPosition.json similarity index 78% rename from configs/seeds/host/data/App.Definitions.JobPosition.json rename to configs/seeds/host/data/App.Hr.JobPosition.json index dc0f964d..64899100 100644 --- a/configs/seeds/host/data/App.Definitions.JobPosition.json +++ b/configs/seeds/host/data/App.Hr.JobPosition.json @@ -1,53 +1,61 @@ { - "ListFormCode": "App.Definitions.JobPosition", + "ListFormCode": "App.Hr.JobPosition", "KeyFieldName": "Id", "GeneratedAt": "2026-09-04T00:00:00Z", "Order": 20, "Rows": [ { "Id": "d1f7c6a2-3b4e-4c8d-9f0a-1b2c3d4e5f60", + "BranchId": "1c125bf3-3ffd-4445-a270-1bc43ac3f61c", "Name": "Genel Müdür", "DepartmentId": "8f14e45f-ea2d-4d9f-9f1d-1a2b3c4d5e6f", "ParentId": null }, { "Id": "b7c8d9e0-f1a2-4b3c-8d9e-0f1a2b3c4d2e", + "BranchId": "1c125bf3-3ffd-4445-a270-1bc43ac3f61c", "Name": "Bilgi İşlem Müdürü", "DepartmentId": "3cd38ab3-7e6f-4b8d-9c0a-5f4e3d2c1b0a", "ParentId": "d1f7c6a2-3b4e-4c8d-9f0a-1b2c3d4e5f60" }, { "Id": "b7c8d9e0-f1b2-4b3c-1d9e-0f1a2b3c4d2e", + "BranchId": "1c125bf3-3ffd-4445-a270-1bc43ac3f61c", "Name": "İhracat Müdürü", "DepartmentId": "987bcab0-1b92-4a4e-8d7f-3c2b1a0f9e8d", "ParentId": "d1f7c6a2-3b4e-4c8d-9f0a-1b2c3d4e5f60" }, { "Id": "b2c8d9e0-f1b2-4b3c-1d9e-0f1a2b3c4d2e", + "BranchId": "1c125bf3-3ffd-4445-a270-1bc43ac3f61c", "Name": "İç Piyasa Müdürü", "DepartmentId": "987bcab0-1b92-4a4e-8d7f-3c2b1a0f9e8d", "ParentId": "d1f7c6a2-3b4e-4c8d-9f0a-1b2c3d4e5f60" }, { "Id": "b2c8d9e0-f1b2-2b3c-1d9e-0f1a2b3c4d2e", + "BranchId": "1c125bf3-3ffd-4445-a270-1bc43ac3f61c", "Name": "Üretim Müdürü", "DepartmentId": "2c1743a3-91b7-4b57-a6c8-7d8e9f0a1b2c", "ParentId": "d1f7c6a2-3b4e-4c8d-9f0a-1b2c3d4e5f60" }, { "Id": "b7c8d9e0-f1a2-4b3c-1d9e-0f1a2b3c4d2e", + "BranchId": "1c125bf3-3ffd-4445-a270-1bc43ac3f61c", "Name": "Finans Müdürü", "DepartmentId": "05b048d7-2f44-4f9d-b5a1-6e7f8a9b0c1d", "ParentId": "d1f7c6a2-3b4e-4c8d-9f0a-1b2c3d4e5f60" }, { "Id": "b7c8d9e0-f1a2-4b3c-8d9e-0f1a2b3c4d5e", + "BranchId": "1c125bf3-3ffd-4445-a270-1bc43ac3f61c", "Name": "Muhasebe Müdürü", "DepartmentId": "051048d7-2f44-4f9d-b5a1-6e7f8a9b0c1d", "ParentId": "b7c8d9e0-f1a2-4b3c-1d9e-0f1a2b3c4d2e" }, { "Id": "c3d4e5f6-a7b8-4c9d-8e0f-1a2b3c4d5e6f", + "BranchId": "1c125bf3-3ffd-4445-a270-1bc43ac3f61c", "Name": "Muhasebe Şefi", "DepartmentId": "051048d7-2f44-4f9d-b5a1-6e7f8a9b0c1d", "ParentId": "b7c8d9e0-f1a2-4b3c-8d9e-0f1a2b3c4d5e" diff --git a/configs/seeds/host/data/App.Definitions.Skill.json b/configs/seeds/host/data/App.Hr.Skill.json similarity index 98% rename from configs/seeds/host/data/App.Definitions.Skill.json rename to configs/seeds/host/data/App.Hr.Skill.json index f9d44c43..fd00593c 100644 --- a/configs/seeds/host/data/App.Definitions.Skill.json +++ b/configs/seeds/host/data/App.Hr.Skill.json @@ -1,5 +1,5 @@ { - "ListFormCode": "App.Definitions.Skill", + "ListFormCode": "App.Hr.Skill", "KeyFieldName": "Id", "GeneratedAt": "2026-09-04T00:00:00Z", "Order": 20, diff --git a/configs/seeds/host/data/App.Definitions.SkillLevel.json b/configs/seeds/host/data/App.Hr.SkillLevel.json similarity index 97% rename from configs/seeds/host/data/App.Definitions.SkillLevel.json rename to configs/seeds/host/data/App.Hr.SkillLevel.json index 16265775..877ba581 100644 --- a/configs/seeds/host/data/App.Definitions.SkillLevel.json +++ b/configs/seeds/host/data/App.Hr.SkillLevel.json @@ -1,5 +1,5 @@ { - "ListFormCode": "App.Definitions.SkillLevel", + "ListFormCode": "App.Hr.SkillLevel", "KeyFieldName": "Id", "GeneratedAt": "2026-09-04T00:00:00Z", "Order": 20, diff --git a/configs/seeds/host/data/App.Definitions.SkillType.json b/configs/seeds/host/data/App.Hr.SkillType.json similarity index 86% rename from configs/seeds/host/data/App.Definitions.SkillType.json rename to configs/seeds/host/data/App.Hr.SkillType.json index 048606b4..39733d11 100644 --- a/configs/seeds/host/data/App.Definitions.SkillType.json +++ b/configs/seeds/host/data/App.Hr.SkillType.json @@ -1,5 +1,5 @@ { - "ListFormCode": "App.Definitions.SkillType", + "ListFormCode": "App.Hr.SkillType", "KeyFieldName": "Id", "GeneratedAt": "2026-09-04T00:00:00Z", "Order": 10, diff --git a/configs/seeds/host/data/App.Languages.LanguageText.json b/configs/seeds/host/data/App.Languages.LanguageText.json index 5f5a0aaf..5a706f05 100644 --- a/configs/seeds/host/data/App.Languages.LanguageText.json +++ b/configs/seeds/host/data/App.Languages.LanguageText.json @@ -60,6 +60,20 @@ "Key": "App.Administration", "Value": "Yönetim" }, + { + "Id": "7fa1d955-61a5-52cc-9616-dd914209a9ba", + "CultureName": "en", + "ResourceName": "Platform", + "Key": "App.Hr", + "Value": "Human Resources" + }, + { + "Id": "e65ba682-ab89-578b-aed5-e643483fee9b", + "CultureName": "tr", + "ResourceName": "Platform", + "Key": "App.Hr", + "Value": "İnsan Kaynakları" + }, { "Id": "b0b6e354-09a3-5e03-a0f8-95094b44ce15", "CultureName": "en", @@ -2175,17 +2189,17 @@ "Value": "Diziler" }, { - "Id": "73f84074-c2c1-5876-8310-b80abe7ba620", + "Id": "48d6fa3b-3209-569f-bcf9-b4265c696bb2", "CultureName": "en", "ResourceName": "Platform", - "Key": "App.Definitions.OrgChart", + "Key": "App.Hr.OrgChart", "Value": "Organization Chart" }, { - "Id": "f11481bd-f5d7-559c-952d-8a3877e181b7", + "Id": "7ec675c3-af4e-5021-aca0-527c5f2ae4cf", "CultureName": "tr", "ResourceName": "Platform", - "Key": "App.Definitions.OrgChart", + "Key": "App.Hr.OrgChart", "Value": "Organizasyon Şeması" }, { @@ -15125,33 +15139,19 @@ "Value": "Sektörler" }, { - "Id": "14bca818-01e2-58fa-816d-d73b0c6a01b3", + "Id": "07223a76-40ab-5338-a427-fb3b2b051bd6", "CultureName": "en", "ResourceName": "Platform", - "Key": "App.Definitions.Department", + "Key": "App.Hr.Department", "Value": "Departments" }, { - "Id": "0c0778aa-bb99-55e2-8974-1345bd758269", + "Id": "5fc7cf2d-b22c-55cd-aa20-dd4b247a255f", "CultureName": "tr", "ResourceName": "Platform", - "Key": "App.Definitions.Department", + "Key": "App.Hr.Department", "Value": "Departmanlar" }, - { - "Id": "e0087775-0049-56a0-9530-bfb61b26d557", - "CultureName": "en", - "ResourceName": "Platform", - "Key": "App.Definitions.JobPosition", - "Value": "Job Positions" - }, - { - "Id": "0f3b0438-2a04-5c52-9e3e-dbf109e21cdb", - "CultureName": "tr", - "ResourceName": "Platform", - "Key": "App.Definitions.JobPosition", - "Value": "Pozisyonlar" - }, { "Id": "935c7115-38b4-501e-8b43-6975a0ad494a", "CultureName": "en", @@ -15251,45 +15251,45 @@ "Value": "İlçeler" }, { - "Id": "680b4c15-97e4-54e6-b740-7479628be5c0", + "Id": "e5e1ee56-7ff7-59f1-8f32-cee8fc364f00", "CultureName": "en", "ResourceName": "Platform", - "Key": "App.Definitions.SkillType", + "Key": "App.Hr.SkillType", "Value": "Skill Types" }, { - "Id": "76818b6a-9ec3-5f0b-ab31-ef107a9e4c55", + "Id": "3a3c2332-a7af-5af0-abc7-abcb5c7deb0a", "CultureName": "tr", "ResourceName": "Platform", - "Key": "App.Definitions.SkillType", + "Key": "App.Hr.SkillType", "Value": "Yetenek Tipleri" }, { - "Id": "efe7788c-f908-5833-b29e-e7a7014e9c9c", + "Id": "0696290d-9fa8-511d-9855-1d44845a8a31", "CultureName": "en", "ResourceName": "Platform", - "Key": "App.Definitions.SkillLevel", + "Key": "App.Hr.SkillLevel", "Value": "Skill Levels" }, { - "Id": "6b3c9bb6-1fd2-5221-b82a-e48f692d2c1a", + "Id": "adce2569-5d54-5ae1-a0ee-20c763c767b6", "CultureName": "tr", "ResourceName": "Platform", - "Key": "App.Definitions.SkillLevel", + "Key": "App.Hr.SkillLevel", "Value": "Yetenek Seviyeleri" }, { - "Id": "2104c315-062f-5692-bd5c-6ffc5103d21a", + "Id": "91cf56ac-8180-5d6a-8a10-61bad98b374a", "CultureName": "en", "ResourceName": "Platform", - "Key": "App.Definitions.Skill", + "Key": "App.Hr.Skill", "Value": "Skill" }, { - "Id": "bf784899-34a4-5ab6-890d-f47201027e3c", + "Id": "b85270b2-b134-5d85-8b04-2d2ac76b9bc1", "CultureName": "tr", "ResourceName": "Platform", - "Key": "App.Definitions.Skill", + "Key": "App.Hr.Skill", "Value": "Yetenek" }, { @@ -24096,7 +24096,7 @@ "CultureName": "tr", "ResourceName": "Platform", "Key": "App.Hr.JobPosition", - "Value": "İş Pozisyonları" + "Value": "Pozisyonlar" }, { "Id": "69cd57e0-ba2a-5714-882d-18fa0944823b", @@ -65553,46 +65553,46 @@ "Value": "Numaratör — belge numarası tanımları. Tablo: Adm_T_Sequence · tenant kapsamlı · liste ekranı.\nKullanım: otomatik numara alacak her belge türü için bir satır açılır (sipariş, fatura, iş emri, talep). Numara kayıt sırasında sunucuda üretilir; eş zamanlı kullanımda boşluk veya tekrar oluşmaz.\nAlanlar:\n• Name → ekrandan referans verilen anahtar; numaratör bu değerle seçilir\n• Prefix, Suffix → numaranın önüne ve arkasına eklenen sabit metin (SIP-, /2026)\n• PaddingSize → numaranın sıfırla doldurulacağı genişlik; 5 değeri 00042 üretir\n• StartNumber → sayacın başlayacağı numara\n• NextNumber → üretilecek sonraki numara; platform bu değeri artırır\n• IncrementStep → artış miktarı, normalde 1\n• ResetPeriod → sayacın ne zaman sıfırlanacağı: hiç / yıllık / aylık / günlük\n• LastPeriodKey → en son hangi dönemde sıfırlandığı; platform mevcut dönemle karşılaştırır ve gerekiyorsa sıfırlar\n• FormatTemplate → çıktı kalıbı; ön ek, numara ve dönem bilgisinin dizilişi buraya yazılır\n• IsActive → pasif numaratör numara üretmez, ekran elle değere düşer\nNasıl bağlanır: hedef ekranda alanın varsayılan değer tanımına CustomValueType = 5 (Sequence) seçilir ve bu satırın Name değeri yazılır. Numara için script veya SQL yazılmaz.\nDikkat: canlı sistemde NextNumber elle değiştirilmez — belgelerin numara sürekliliği bozulur ve aynı numaradan iki belge oluşur. Numaralandırma yeniden başlayacaksa farklı ön ekle yeni numaratör tanımla." }, { - "Id": "834e29da-9f96-58f8-a7bd-931d5d731fc5", + "Id": "f5b596ee-4b25-579f-9aaa-39f3072d1a5d", "CultureName": "en", "ResourceName": "Platform", - "Key": "App.Definitions.SkillType.Description", - "Value": "Skill Type — the top level of the competence tree. Table: Sas_H_SkillType · host scope · list screen; skills and levels are entered on the sub-tabs.\nUsage: competences are collected under a type (technical, language, certificate, behavioural). The type determines both the grouping of skills and the level scale, because the level rows are also bound to a skill type.\nFields:\n• Name → type name\n• SkillTypeId → shown on the sub-tabs; the type the skill/level is bound to\nSub-tabs: Skill (the competences of the type) and Skill Level (the scale valid for the type).\nWhy it matters: this screen is also the reference for the self-referencing sub-form pattern — when you need a screen whose sub-records live in a related table and are filtered by the parent record, take this definition." + "Key": "App.Hr.SkillType.Description", + "Value": "Skill Type — the top level of the competence tree. Table: Hr_H_SkillType · host scope · list screen; skills and levels are entered on the sub-tabs.\nUsage: competences are collected under a type (technical, language, certificate, behavioural). The type determines both the grouping of skills and the level scale, because the level rows are also bound to a skill type.\nFields:\n• Name → type name\n• SkillTypeId → shown on the sub-tabs; the type the skill/level is bound to\nSub-tabs: Skill (the competences of the type) and Skill Level (the scale valid for the type).\nWhy it matters: this screen is also the reference for the self-referencing sub-form pattern — when you need a screen whose sub-records live in a related table and are filtered by the parent record, take this definition." }, { - "Id": "eb61d268-1e14-5763-b63b-d06b14f5cbab", + "Id": "c38cbe3c-e3d4-5c43-a3bb-c8b2a14d37b7", "CultureName": "tr", "ResourceName": "Platform", - "Key": "App.Definitions.SkillType.Description", - "Value": "Yetkinlik Türü — yetkinlik ağacının en üst seviyesi. Tablo: Sas_H_SkillType · host kapsamlı · liste ekranı; yetkinlikler ve seviyeler alt sekmelerden girilir.\nKullanım: yetkinlikler bir tür altında toplanır (teknik, dil, sertifika, davranışsal). Tür hem yetkinliklerin gruplamasını hem de seviye ölçeğini belirler; çünkü seviye satırları da bir yetkinlik türüne bağlıdır.\nAlanlar:\n• Name → tür adı\n• SkillTypeId → alt sekmelerde görünür; yetkinliğin/seviyenin bağlı olduğu tür\nAlt sekmeler: Yetkinlik (türün yetkinlikleri) ve Yetkinlik Seviyesi (tür için geçerli ölçek).\nNeden önemli: bu ekran aynı zamanda kendi kendine ebeveyn olan alt form kalıbının referansıdır — alt kayıtları ilişkili bir tabloda duran ve ana kayda göre süzülen bir ekran gerektiğinde bu tanım alınır." + "Key": "App.Hr.SkillType.Description", + "Value": "Yetkinlik Türü — yetkinlik ağacının en üst seviyesi. Tablo: Hr_H_SkillType · host kapsamlı · liste ekranı; yetkinlikler ve seviyeler alt sekmelerden girilir.\nKullanım: yetkinlikler bir tür altında toplanır (teknik, dil, sertifika, davranışsal). Tür hem yetkinliklerin gruplamasını hem de seviye ölçeğini belirler; çünkü seviye satırları da bir yetkinlik türüne bağlıdır.\nAlanlar:\n• Name → tür adı\n• SkillTypeId → alt sekmelerde görünür; yetkinliğin/seviyenin bağlı olduğu tür\nAlt sekmeler: Yetkinlik (türün yetkinlikleri) ve Yetkinlik Seviyesi (tür için geçerli ölçek).\nNeden önemli: bu ekran aynı zamanda kendi kendine ebeveyn olan alt form kalıbının referansıdır — alt kayıtları ilişkili bir tabloda duran ve ana kayda göre süzülen bir ekran gerektiğinde bu tanım alınır." }, { - "Id": "c028559e-7cc6-5f74-9407-a17707ac2f6a", + "Id": "146db4a7-43ec-538d-8720-f5dd767f47ac", "CultureName": "en", "ResourceName": "Platform", - "Key": "App.Definitions.SkillLevel.Description", - "Value": "Skill Level — competence levels. Table: Sas_H_SkillLevel · host scope · list screen; each level is bound to a skill type.\nUsage: the scale used when a competence is assigned to a person (beginner, intermediate, advanced, expert). Because the scale is defined per type, a language skill and a technical skill may use different levels.\nFields:\n• Name → level name\n• SkillTypeId → the skill type the level is valid for\n• Progress → the numeric equivalent of the level (0-100); progress bars, sorting and gap analysis in reports use this value\n• IsDefault → the level automatically selected when a new competence is assigned\nCaution: keep the Progress values consistent within a type; comparison across different types is only meaningful over Progress." + "Key": "App.Hr.SkillLevel.Description", + "Value": "Skill Level — competence levels. Table: Hr_H_SkillLevel · host scope · list screen; each level is bound to a skill type.\nUsage: the scale used when a competence is assigned to a person (beginner, intermediate, advanced, expert). Because the scale is defined per type, a language skill and a technical skill may use different levels.\nFields:\n• Name → level name\n• SkillTypeId → the skill type the level is valid for\n• Progress → the numeric equivalent of the level (0-100); progress bars, sorting and gap analysis in reports use this value\n• IsDefault → the level automatically selected when a new competence is assigned\nCaution: keep the Progress values consistent within a type; comparison across different types is only meaningful over Progress." }, { - "Id": "ac04f818-098e-571a-98c1-89914542171e", + "Id": "eb584c9c-5443-57a4-80f0-6f2e6607a6c8", "CultureName": "tr", "ResourceName": "Platform", - "Key": "App.Definitions.SkillLevel.Description", - "Value": "Yetkinlik Seviyesi — yetkinlik seviyeleri. Tablo: Sas_H_SkillLevel · host kapsamlı · liste ekranı; her seviye bir yetkinlik türüne bağlıdır.\nKullanım: bir yetkinlik kişiye atanırken kullanılan ölçek (başlangıç, orta, ileri, uzman). Ölçek türe göre tanımlandığı için dil yetkinliği ile teknik yetkinlik farklı seviyeler kullanabilir.\nAlanlar:\n• Name → seviye adı\n• SkillTypeId → seviyenin geçerli olduğu yetkinlik türü\n• Progress → seviyenin sayısal karşılığı (0-100); ilerleme çubukları, sıralama ve raporlardaki boşluk analizi bu değeri kullanır\n• IsDefault → yeni yetkinlik atandığında otomatik seçilen seviye\nDikkat: Progress değerlerini tür içinde tutarlı tut; farklı türler arasında karşılaştırma yalnızca Progress üzerinden anlamlıdır." + "Key": "App.Hr.SkillLevel.Description", + "Value": "Yetkinlik Seviyesi — yetkinlik seviyeleri. Tablo: Hr_H_SkillLevel · host kapsamlı · liste ekranı; her seviye bir yetkinlik türüne bağlıdır.\nKullanım: bir yetkinlik kişiye atanırken kullanılan ölçek (başlangıç, orta, ileri, uzman). Ölçek türe göre tanımlandığı için dil yetkinliği ile teknik yetkinlik farklı seviyeler kullanabilir.\nAlanlar:\n• Name → seviye adı\n• SkillTypeId → seviyenin geçerli olduğu yetkinlik türü\n• Progress → seviyenin sayısal karşılığı (0-100); ilerleme çubukları, sıralama ve raporlardaki boşluk analizi bu değeri kullanır\n• IsDefault → yeni yetkinlik atandığında otomatik seçilen seviye\nDikkat: Progress değerlerini tür içinde tutarlı tut; farklı türler arasında karşılaştırma yalnızca Progress üzerinden anlamlıdır." }, { - "Id": "1341d32a-f115-51ec-87e5-71c0ea8d0cce", + "Id": "6ab49c34-5a3e-58fb-a7a7-5fc3aacbe4c8", "CultureName": "en", "ResourceName": "Platform", - "Key": "App.Definitions.Skill.Description", - "Value": "Skill — competence definitions. Table: Sas_H_Skill · host scope · list screen; each skill belongs to a skill type.\nUsage: the lookup source for person/position competence matching. Together with the skill level it forms the 'who knows what, at which level' data set; the competence requirement of a job position and the competence of a person are compared over the same list.\nFields:\n• Name → competence name (C#, English, Forklift Licence, Presentation)\n• SkillTypeId → the type it belongs to; the level scale is also determined by this type\nCaution: define the competence at one level of detail. Both 'Software' and 'C# 12' in the same list makes the matching meaningless." + "Key": "App.Hr.Skill.Description", + "Value": "Skill — competence definitions. Table: Hr_H_Skill · host scope · list screen; each skill belongs to a skill type.\nUsage: the lookup source for person/position competence matching. Together with the skill level it forms the 'who knows what, at which level' data set; the competence requirement of a job position and the competence of a person are compared over the same list.\nFields:\n• Name → competence name (C#, English, Forklift Licence, Presentation)\n• SkillTypeId → the type it belongs to; the level scale is also determined by this type\nCaution: define the competence at one level of detail. Both 'Software' and 'C# 12' in the same list makes the matching meaningless." }, { - "Id": "b37e898e-96c7-5208-9135-1fe977425497", + "Id": "52515367-0184-5e6b-93d8-e4438031834d", "CultureName": "tr", "ResourceName": "Platform", - "Key": "App.Definitions.Skill.Description", - "Value": "Yetkinlik — yetkinlik tanımları. Tablo: Sas_H_Skill · host kapsamlı · liste ekranı; her yetkinlik bir yetkinlik türüne bağlıdır.\nKullanım: kişi/pozisyon yetkinlik eşleştirmelerinin lookup kaynağı. Yetkinlik seviyesi ile birlikte 'kim neyi hangi seviyede biliyor' veri setini oluşturur; bir görevin gerektirdiği yetkinlik ile kişinin yetkinliği aynı liste üzerinden karşılaştırılır.\nAlanlar:\n• Name → yetkinlik adı (C#, İngilizce, Forklift Ehliyeti, Sunum)\n• SkillTypeId → bağlı olduğu tür; seviye ölçeği de bu türe göre belirlenir\nDikkat: yetkinliği tek bir detay seviyesinde tanımla. Aynı listede hem 'Yazılım' hem 'C# 12' bulunması eşleştirmeyi anlamsızlaştırır." + "Key": "App.Hr.Skill.Description", + "Value": "Yetkinlik — yetkinlik tanımları. Tablo: Hr_H_Skill · host kapsamlı · liste ekranı; her yetkinlik bir yetkinlik türüne bağlıdır.\nKullanım: kişi/pozisyon yetkinlik eşleştirmelerinin lookup kaynağı. Yetkinlik seviyesi ile birlikte 'kim neyi hangi seviyede biliyor' veri setini oluşturur; bir görevin gerektirdiği yetkinlik ile kişinin yetkinliği aynı liste üzerinden karşılaştırılır.\nAlanlar:\n• Name → yetkinlik adı (C#, İngilizce, Forklift Ehliyeti, Sunum)\n• SkillTypeId → bağlı olduğu tür; seviye ölçeği de bu türe göre belirlenir\nDikkat: yetkinliği tek bir detay seviyesinde tanımla. Aynı listede hem 'Yazılım' hem 'C# 12' bulunması eşleştirmeyi anlamsızlaştırır." }, { "Id": "82ab37e7-4c7d-5163-ab26-4ac2fb150262", @@ -66085,32 +66085,32 @@ "Value": "Oturumlar — açık oturumlar. Tablo: AbpSessions · tenant kapsamlı (IsTenant = true) · liste ekranı.\nKullanım: hangi kullanıcı hangi cihaz ve adresten, ne zamandan beri oturum açmış. Satırdaki aksiyon oturumu düşürür (UiEvalService.ApiKickUser) ve kullanıcı anında çıkarılır.\nAlanlar:\n• UserId → oturumun sahibi\n• SessionId → benzersiz oturum kimliği\n• Device, DeviceInfo → cihaz türü ve ayrıntısı (tarayıcı, işletim sistemi)\n• ClientId → hangi uygulamadan girildiği (web, mobil, dış entegrasyon)\n• IpAddresses → oturum boyunca kullanılan adresler; birden çok adres değişen ağ demektir\n• SignedIn → oturumun açıldığı an; oturumun yaşı buradan ölçülür\nDikkat: oturumu düşürmek hesabı kapatmaz — kullanıcı aynı bilgilerle yeniden girer. Erişimin gerçekten kapanması gerekiyorsa kullanıcıyı da pasife al. Süresi geçmiş oturumları SessionCleanupWorker işi otomatik temizler." }, { - "Id": "4b4ad587-1325-59fa-86f3-fb8e30f15386", + "Id": "e8a7eaa2-3551-5ca1-a865-e0adf1f8681a", "CultureName": "en", "ResourceName": "Platform", - "Key": "App.Definitions.Department.Description", - "Value": "Department — department definitions. Table: Adm_T_Department · tenant scope · tree layout.\nUsage: the department lookup of personnel, approval and assignment screens. It is the reference for the TreeList layout — when a hierarchical list is needed, take the TreeOptionJson of this screen.\nFields:\n• Name → department name\n• ParentId → the parent department; the tree is formed over this field. A root department leaves it empty\nThe same data is shown as an organization chart on Definitions › Org Chart (/admin/organization); job positions are bound to departments through DepartmentId.\nCaution: moving a department moves its children as well and a circular parent reference is not allowed. Do not delete a department carrying personnel records — deactivate it or move the records first." + "Key": "App.Hr.Department.Description", + "Value": "Department — department definitions. Table: Hr_T_Department · tenant scope · tree layout.\nUsage: the department lookup of personnel, approval and assignment screens. It is the reference for the TreeList layout — when a hierarchical list is needed, take the TreeOptionJson of this screen.\nFields:\n• BranchId → the branch the department belongs to; the first column of the list\n• Name → department name\n• ParentId → the parent department; the lookup is filtered to the selected branch's departments and the tree is formed over this field. A root department leaves it empty\nThe same data is shown as an organization chart on HR › Org Chart (/admin/organization); job positions are bound to departments through DepartmentId.\nCaution: moving a department moves its children as well and a circular parent reference is not allowed. Do not delete a department carrying personnel records — deactivate it or move the records first." }, { - "Id": "3c56eb7c-c981-584d-9bf6-be02a146ae6f", + "Id": "8cd11bc5-e5d5-5ffa-952d-06fa4a27730c", "CultureName": "tr", "ResourceName": "Platform", - "Key": "App.Definitions.Department.Description", - "Value": "Departman — departman tanımları. Tablo: Adm_T_Department · tenant kapsamlı · ağaç düzeni.\nKullanım: personel, onay ve atama ekranlarının departman lookup'ı. TreeList düzeninin referansıdır — hiyerarşik liste gerektiğinde bu ekranın TreeOptionJson tanımı alınır.\nAlanlar:\n• Name → departman adı\n• ParentId → üst departman; ağaç bu alan üzerinden kurulur. Kök departmanda boş bırakılır\nAynı veri Tanımlar › Organizasyon Şeması (/admin/organization) ekranında şema olarak gösterilir; görevler DepartmentId ile departmanlara bağlanır.\nDikkat: departman taşındığında alt kırılımları da taşınır ve döngüsel üst kayıt tanımına izin verilmez. Personel kaydı taşıyan departmanı silme — pasife al ya da önce kayıtları taşı." + "Key": "App.Hr.Department.Description", + "Value": "Departman — departman tanımları. Tablo: Hr_T_Department · tenant kapsamlı · ağaç düzeni.\nKullanım: personel, onay ve atama ekranlarının departman lookup'ı. TreeList düzeninin referansıdır — hiyerarşik liste gerektiğinde bu ekranın TreeOptionJson tanımı alınır.\nAlanlar:\n• BranchId → departmanın bağlı olduğu şube; listenin ilk sütunu\n• Name → departman adı\n• ParentId → üst departman; lookup seçili şubenin departmanlarına süzülür, ağaç bu alan üzerinden kurulur. Kök departmanda boş bırakılır\nAynı veri İK › Organizasyon Şeması (/admin/organization) ekranında şema olarak gösterilir; görevler DepartmentId ile departmanlara bağlanır.\nDikkat: departman taşındığında alt kırılımları da taşınır ve döngüsel üst kayıt tanımına izin verilmez. Personel kaydı taşıyan departmanı silme — pasife al ya da önce kayıtları taşı." }, { - "Id": "39ebd174-1eb9-5aa3-8f49-7bc6cda7d0c7", + "Id": "fa763478-08b1-5b2c-81fe-8e774de4c334", "CultureName": "en", "ResourceName": "Platform", - "Key": "App.Definitions.JobPosition.Description", - "Value": "Job Position — position/title definitions. Table: Adm_T_JobPosition · tenant scope · tree layout.\nUsage: the position lookup of personnel records, approval flows and organization charts. It is the reference for the cascade pattern: the position lookup on a screen is filtered by the selected department.\nFields:\n• Name → position name\n• DepartmentId → the department it belongs to; the cascade filter runs over this field\n• ParentId → the position it reports to; the hierarchy of titles is formed over this field\nCaution: the position tree and the department tree are separate hierarchies — a position's parent may live in another department, which is exactly how a matrix organization is expressed. Do not delete a position assigned to a user; move the assignment first." + "Key": "App.Hr.JobPosition.Description", + "Value": "Job Position — position/title definitions. Table: Hr_T_JobPosition · tenant scope · tree layout.\nUsage: the position lookup of personnel records, approval flows and organization charts. It is the reference for the cascade pattern: the position lookup on a screen is filtered by the selected department.\nFields:\n• BranchId → the branch the position belongs to; the first column of the list and the filter of the department lookup\n• Name → position name\n• DepartmentId → the department it belongs to; the cascade filter runs over this field\n• ParentId → the position it reports to; the hierarchy of titles is formed over this field\nCaution: the position tree and the department tree are separate hierarchies — a position's parent may live in another department, which is exactly how a matrix organization is expressed. Do not delete a position assigned to a user; move the assignment first." }, { - "Id": "9c4bf5d6-9924-58cc-97dd-8952384da556", + "Id": "af77b29a-f9a5-5721-ba24-2c3096a9e8bf", "CultureName": "tr", "ResourceName": "Platform", - "Key": "App.Definitions.JobPosition.Description", - "Value": "Görev — görev/unvan tanımları. Tablo: Adm_T_JobPosition · tenant kapsamlı · ağaç düzeni.\nKullanım: personel kayıtlarının, onay akışlarının ve organizasyon şemasının görev lookup'ı. Cascade kalıbının referansıdır: ekrandaki görev lookup'ı seçili departmana göre süzülür.\nAlanlar:\n• Name → görev adı\n• DepartmentId → bağlı olduğu departman; cascade filtresi bu alan üzerinden çalışır\n• ParentId → bağlı olduğu üst görev; unvan hiyerarşisi bu alan üzerinden kurulur\nDikkat: görev ağacı ile departman ağacı ayrı hiyerarşilerdir — bir görevin üstü başka departmanda olabilir; matris organizasyon tam olarak böyle ifade edilir. Kullanıcıya atanmış görevi silme; önce atamayı taşı." + "Key": "App.Hr.JobPosition.Description", + "Value": "Görev — görev/unvan tanımları. Tablo: Hr_T_JobPosition · tenant kapsamlı · ağaç düzeni.\nKullanım: personel kayıtlarının, onay akışlarının ve organizasyon şemasının görev lookup'ı. Cascade kalıbının referansıdır: ekrandaki görev lookup'ı seçili departmana göre süzülür.\nAlanlar:\n• BranchId → pozisyonun bağlı olduğu şube; listenin ilk sütunu, departman lookup'ını süzer\n• Name → görev adı\n• DepartmentId → bağlı olduğu departman; cascade filtresi bu alan üzerinden çalışır\n• ParentId → bağlı olduğu üst görev; unvan hiyerarşisi bu alan üzerinden kurulur\nDikkat: görev ağacı ile departman ağacı ayrı hiyerarşilerdir — bir görevin üstü başka departmanda olabilir; matris organizasyon tam olarak böyle ifade edilir. Kullanıcıya atanmış görevi silme; önce atamayı taşı." }, { "Id": "ae2c9dc2-9aca-54b2-bca2-d4aeddca73f2", diff --git a/configs/seeds/host/data/App.Menus.Menu.json b/configs/seeds/host/data/App.Menus.Menu.json index df310aaa..7699ea42 100644 --- a/configs/seeds/host/data/App.Menus.Menu.json +++ b/configs/seeds/host/data/App.Menus.Menu.json @@ -192,39 +192,17 @@ "IsDisabled": false, "ModuleId": "Sas" }, - { - "ParentCode": "App.Saas.Definitions", - "Code": "App.Definitions.SkillType", - "DisplayName": "App.Definitions.SkillType", - "Order": 9, - "Url": "/admin/list/App.Definitions.SkillType", - "Icon": "FcMindMap", - "RequiredPermissionName": "App.Definitions.SkillType", - "IsDisabled": false, - "ModuleId": "Sas" - }, { "ParentCode": "App.Saas.Definitions", "Code": "App.Definitions.UomCategory", "DisplayName": "App.Definitions.UomCategory", - "Order": 10, + "Order": 9, "Url": "/admin/list/App.Definitions.UomCategory", "Icon": "FcWorkflow", "RequiredPermissionName": "App.Definitions.UomCategory", "IsDisabled": false, "ModuleId": "Sas" }, - { - "ParentCode": "App.Saas.Definitions", - "Code": "App.Definitions.Sequence", - "DisplayName": "App.Definitions.Sequence", - "Order": 11, - "Url": "/admin/list/App.Definitions.Sequence", - "Icon": "FcNumericalSorting12", - "RequiredPermissionName": "App.Definitions.Sequence", - "IsDisabled": false, - "ModuleId": "Sas" - }, { "ParentCode": "App.Saas", "Code": "App.Public", @@ -678,34 +656,12 @@ }, { "ParentCode": "App.Administration.Definitions", - "Code": "App.Definitions.Department", - "DisplayName": "App.Definitions.Department", + "Code": "App.Definitions.Sequence", + "DisplayName": "App.Definitions.Sequence", "Order": 2, - "Url": "/admin/list/App.Definitions.Department", - "Icon": "FcDepartment", - "RequiredPermissionName": "App.Definitions.Department", - "IsDisabled": false, - "ModuleId": "Adm" - }, - { - "ParentCode": "App.Administration.Definitions", - "Code": "App.Definitions.JobPosition", - "DisplayName": "App.Definitions.JobPosition", - "Order": 3, - "Url": "/admin/list/App.Definitions.JobPosition", - "Icon": "FcDebt", - "RequiredPermissionName": "App.Definitions.JobPosition", - "IsDisabled": false, - "ModuleId": "Adm" - }, - { - "ParentCode": "App.Administration.Definitions", - "Code": "App.Definitions.OrgChart", - "DisplayName": "App.Definitions.OrgChart", - "Order": 4, - "Url": "/admin/organization", - "Icon": "FaSitemap", - "RequiredPermissionName": "App.Definitions.OrgChart", + "Url": "/admin/list/App.Definitions.Sequence", + "Icon": "FcNumericalSorting12", + "RequiredPermissionName": "App.Definitions.Sequence", "IsDisabled": false, "ModuleId": "Adm" }, @@ -1082,6 +1038,72 @@ "RequiredPermissionName": "App.ForumManagement.Publish", "IsDisabled": false, "ModuleId": "Adm" + }, + { + "ParentCode": null, + "Code": "App.Hr", + "DisplayName": "App.Hr", + "Order": 0, + "Url": null, + "Icon": "FcConferenceCall", + "RequiredPermissionName": null, + "IsDisabled": false, + "ModuleId": "Hr" + }, + { + "ParentCode": "App.Hr", + "Code": "App.Hr.Definitions", + "DisplayName": "App.Platform.Definitions", + "Order": 1, + "Url": null, + "Icon": "FcFilingCabinet", + "RequiredPermissionName": null, + "IsDisabled": false, + "ModuleId": "Hr" + }, + { + "ParentCode": "App.Hr.Definitions", + "Code": "App.Hr.SkillType", + "DisplayName": "App.Hr.SkillType", + "Order": 1, + "Url": "/admin/list/App.Hr.SkillType", + "Icon": "FcMindMap", + "RequiredPermissionName": "App.Hr.SkillType", + "IsDisabled": false, + "ModuleId": "Hr" + }, + { + "ParentCode": "App.Hr.Definitions", + "Code": "App.Hr.Department", + "DisplayName": "App.Hr.Department", + "Order": 2, + "Url": "/admin/list/App.Hr.Department", + "Icon": "FcDepartment", + "RequiredPermissionName": "App.Hr.Department", + "IsDisabled": false, + "ModuleId": "Hr" + }, + { + "ParentCode": "App.Hr.Definitions", + "Code": "App.Hr.JobPosition", + "DisplayName": "App.Hr.JobPosition", + "Order": 3, + "Url": "/admin/list/App.Hr.JobPosition", + "Icon": "FcDebt", + "RequiredPermissionName": "App.Hr.JobPosition", + "IsDisabled": false, + "ModuleId": "Hr" + }, + { + "ParentCode": "App.Hr", + "Code": "App.Hr.OrgChart", + "DisplayName": "App.Hr.OrgChart", + "Order": 2, + "Url": "/admin/organization", + "Icon": "FaSitemap", + "RequiredPermissionName": "App.Hr.OrgChart", + "IsDisabled": false, + "ModuleId": "Hr" } ] } diff --git a/configs/seeds/host/data/App.Menus.Module.json b/configs/seeds/host/data/App.Menus.Module.json index 2d30210c..ef28ea17 100644 --- a/configs/seeds/host/data/App.Menus.Module.json +++ b/configs/seeds/host/data/App.Menus.Module.json @@ -15,6 +15,10 @@ { "Id": "Pub", "Name": "Pub" + }, + { + "Id": "Hr", + "Name": "Hr" } ] } diff --git a/configs/seeds/host/data/App.Menus.Routes.json b/configs/seeds/host/data/App.Menus.Routes.json index 15f2c482..8b60c567 100644 --- a/configs/seeds/host/data/App.Menus.Routes.json +++ b/configs/seeds/host/data/App.Menus.Routes.json @@ -562,7 +562,7 @@ "ComponentType": "normal", "ComponentPath": "@/views/admin/hr/OrgChart", "RouteType": "protected", - "Authority": "App.Definitions.Department", + "Authority": "App.Hr.OrgChart", "SeoTitle": null, "SeoDescription": null, "SeoKeywords": null, diff --git a/ui/src/views/admin/hr/OrgChart.tsx b/ui/src/views/admin/hr/OrgChart.tsx index a8171cea..1809a184 100644 --- a/ui/src/views/admin/hr/OrgChart.tsx +++ b/ui/src/views/admin/hr/OrgChart.tsx @@ -876,7 +876,7 @@ const OrgChart = () => { return ( <> - +
{/* Toolbar */} @@ -884,7 +884,7 @@ const OrgChart = () => {
{MenuIcon}

- {translate('::App.Definitions.OrgChart')} + {translate('::App.Hr.OrgChart')}

@@ -902,7 +902,7 @@ const OrgChart = () => { }`} onClick={() => setMode('department')} > - {translate('::App.Definitions.Department')} + {translate('::App.Hr.Department')}