Core sisteme Hr menüsü eklendi

This commit is contained in:
Sedat ÖZTÜRK 2026-09-29 14:46:39 +03:00
parent 677a62bd79
commit acc836c293
36 changed files with 1834 additions and 1555 deletions

View file

@ -19,7 +19,7 @@ Companion documents (this file wins on conflict):
| Document | Scope | | 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.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/` | | `dotnet.instructions.md` | Binding code standard for everything under `api/` |
| `list.instructions.md` | Step-by-step procedure for adding a module / list through seeders | | `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 | | `../../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 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: 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) - configs/seeds/host/data/App.Languages.{Language,LanguageText}.json — languages and texts (ListForm seed data)
- WizardDataSeeder.cs / CrudDataSeeder.cs — the seeders that read - WizardDataSeeder.cs / CrudDataSeeder.cs — the seeders that read
surface B below surface B below

View file

@ -3,7 +3,7 @@
`lowcode.instructions.md` **nasıl üretileceğini** anlatır; bu dosya **neyin ayarlanabildiğini** `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 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 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. 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`. **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 | | # | 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 | | 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 | | 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 | | 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, 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 — 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) | | `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 › `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. bayrağıyla açılan bir görünümdür ve `/admin/pivot/...` diye bir route yoktur.
### 5.7 Varyantlar ### 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: buradaki her ekran üç rolden birindedir:
- **Yeniden kullanılacak yetenek** — numaratör, bildirim, zamanlanmış iş, rapor, dosya, yetki, - **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ı, - **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. 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 - **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 ### 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 | | 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) | | 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 | | Ad | `TableNameEnum` üyesi |
Örnek: `Sas_H_Currency` (host — tüm kiracılar aynı para birimlerini görür), `Adm_T_Department` Örnek: `Sas_H_Currency` (host — tüm kiracılar aynı para birimlerini görür), `Hr_T_Department`
(kiracı başına), `V_Sas_H_Order` (view). Menü ile tablo öneki her zaman örtüşmez: (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; `Sas_T_GlobalSearch`, `Sas_T_Branch`, `Sas_T_Forum*`, `Sas_T_IntranetWidget` kiracı tablosudur. Özel view'ler
`Adm_T_Sequence` Saas menüsündedir. Özel view'ler
`TableNameResolver.GetFullSpecialViewName` ile `V_{Önek}_{Prefix}_{Ad}` biçiminde üretilir. `TableNameResolver.GetFullSpecialViewName` ile `V_{Önek}_{Prefix}_{Ad}` biçiminde üretilir.
> Yeni bir platform tablosu eklenecekse `TableNameEnum` + `TableNameResolver._map` birlikte > 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 › 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 › 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 › 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 › 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 › 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 › 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. | | **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). | | **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 > 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 > `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ü > ekranında kod `App.Forum`, yetki `App.ForumManagement.Publish`'tir. Org Chart'ta menü ve
> `App.Definitions.OrgChart` ister ama `/admin/organization` rotası `App.Definitions.Department` > `/admin/organization` rotası aynı yetkiyi (`App.Hr.OrgChart`) ister. Yeni ürettiğin ekranlarda
> ister (menüyü gören ama sayfayı açamayan kullanıcı olabilir). Yeni ürettiğin ekranlarda
> ikisini ayırma — wizard zaten aynı kökü kullanır (`lowcode` §2). > ikisini ayırma — wizard zaten aynı kökü kullanır (`lowcode` §2).
### 12.3 Administration menüsü ### 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 | | 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 › 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 › 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`. |
| **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ı). |
| **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. | | **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`). | | **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`. | | **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. `/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: 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 `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/settings` | `settings/Settings` | `App.Setting` |
| `/admin/files` | `admin/files/FileManager` | `App.Files` | | `/admin/files` | `admin/files/FileManager` | `App.Files` |
| `/admin/intranet-documents` | `intranet/documents/IntranetDocuments` | `App.Intranet.Document` | | `/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/forum` | `forum/Forum` | `App.ForumManagement.Publish` |
| `/admin/videoroom/{dashboard,list,room/:id}` | `admin/videoroom/{Dashboard,RoomList,RoomDetail}` | `App.Videoroom{,.List,.Detail}` | | `/admin/videoroom/{dashboard,list,room/:id}` | `admin/videoroom/{Dashboard,RoomList,RoomDetail}` | `App.Videoroom{,.List,.Detail}` |
| `/admin/ai` | `ai/Assistant` | `App.Definitions.AiBot.Asistant` | | `/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` → `/reset-password`, `/confirm`, `/confirm/:userId/:token`, `/extend-login` →
`views/auth/*`. Bunlara dokunma; parola ve doğrulama akışları ABP tarafındadır. `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. §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 | | 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 | | "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 | | "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ı | | "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 | | "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ı 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 | | "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 | | "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 İ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. içinde ilgili `#region` altındadır.
| İhtiyaç | Bak | | İ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) | | 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) | | 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` | | 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) | | 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`) | | 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"` | | Ekle düğmesini diyaloğa bağlama | `Dynamic Services` — `EditingOptionJson.AddDialogName = "DynamicServiceEditor"` |
| Satır butonundan servis silme | `Dynamic Services` — `UiEvalService.ApiDeleteDynamicService` | | Satır butonundan servis silme | `Dynamic Services` — `UiEvalService.ApiDeleteDynamicService` |
| Toplam satırı | `Sales Order Item`, `Licence Item` (`TotalSummaryJson`) | | Toplam satırı | `Sales Order Item`, `Licence Item` (`TotalSummaryJson`) |
| View üzerinden okuma | `Background Worker Jobs`, `Licence Item` (`SelectCommandType = View`) | | 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`) | | 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**. - **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 Hazır bir ekranın davranışını değiştirmek gerekiyorsa seeder'ı düzenlemek yetmez; değişikliği

View file

@ -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 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 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ğı, 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 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. 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) | | 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 | | 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 | | 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) | | 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ç 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 | | 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[]`) | | **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 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 | | **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` | | "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` | | "Global aramada çıksın" | Global Search kayıtları (`System`, `Group`, `Term`, `Weight`, `Url`) | `/admin/list/App.Definitions.GlobalSearch` |
| "Duyuru, anket, sosyal akış, etkinlik" | Intranet ekranları | `/admin/list/App.Intranet.*` | | "Duyuru, anket, sosyal akış, etkinlik" | 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` | | "Menü düzeni" | Menu Manager (§9.7) | `/admin/menuManager` |
| "Genel siteye sayfa" | Custom Component (`Pub` modülü) — Visual Designer'dan yeni component + `Pub` menü kaydı | `/admin/developerkit/components/design/:id` (README.md §10.4) | | "Genel siteye sayfa" | Custom Component (`Pub` modülü) — Visual Designer'dan yeni component + `Pub` menü kaydı | `/admin/developerkit/components/design/:id` (README.md §10.4) |
| "Yapay zekâ asistanı" | AI Bot tanımları | `/admin/list/App.Definitions.AiBot` | | "Yapay zekâ asistanı" | AI Bot tanımları | `/admin/list/App.Definitions.AiBot` |
@ -4141,10 +4142,10 @@ kullanılacağı** `lowcode-reference.instructions.md` §12'dedir.
> | Durum | Ekranlar (örnek) | Prompt ile kayıt eklerken | > | 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 | > | 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) | > | `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, > 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. > o kayıtların seed karşılığını da yazmadıysan teslim eksiktir.

View file

@ -903,10 +903,34 @@ Route.Authority ──┘ └► Permission
karşılığı olan dosyası bulunmayan rota kaydı hiç yüklenmez. Public site menüsü bu modelin 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). 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 **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: `configs/seeds/host/data/Abp.Identity.Permissions.json` ile seed edilir (gruplar:
`Abp.Identity.PermissionGroups.json`). Ana gruplar: `App.Saas`, `App.Branches`, `App.Intranet.*`, `Abp.Identity.PermissionGroups.json` — `App.Saas` (1), `App.Administration` (2), `App.Hr` (3)).
`App.Definitions.*`, `App.Restrictions.*`, `App.Languages.*`, `App.Listforms.*`, 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.Notifications.*`, `App.BackgroundWorkers.*`, `App.Menus.*`, `App.DeveloperKit.*`,
`App.SqlQueryManager.*`, `App.SqlQueryManager.*`,
`App.Orders.*`, `App.BlogManagement.*`, `App.IdentityManagement.*`, `App.Reports.*`, `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 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: 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 - `WizardDataSeeder.cs`, `CrudDataSeeder.cs` — aşağıdaki
runtime seed dosyalarını okuyup uygulayan seeder'lar runtime seed dosyalarını okuyup uygulayan seeder'lar
- `ListFormSeedDataApplier`, `CrudEndpointSeedApplier` (`Domain/Data/`) — uygulama kuralının tek - `ListFormSeedDataApplier`, `CrudEndpointSeedApplier` (`Domain/Data/`) — uygulama kuralının tek
@ -1971,6 +1996,8 @@ configs/seeds/
│ │ # Abp.Identity.Permission{Groups,s}.json — yetki tanımları │ │ # Abp.Identity.Permission{Groups,s}.json — yetki tanımları
│ │ # App.Definitions.{CountryGroup,Country,City,District}.json — adres zinciri │ │ # App.Definitions.{CountryGroup,Country,City,District}.json — adres zinciri
│ │ # App.Definitions.{Currency,ContactTitle,AiBot}.json — para birimi, hitap, AI bot │ │ # App.Definitions.{Currency,ContactTitle,AiBot}.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.Notifications.Notification{Templates,Types,Rules}.json — bildirim şablonu, tipi → kuralı
│ │ # App.Languages.{Language,LanguageText}.json — dil → metin (eksik LanguageKey metinle üretilir) │ │ # App.Languages.{Language,LanguageText}.json — dil → metin (eksik LanguageKey metinle üretilir)
│ │ # App.SettingDefinitions.json, App.BackgroundWorkers.RecurringJobs.json — ayar tanımları, zamanlanmış işler │ │ # App.SettingDefinitions.json, App.BackgroundWorkers.RecurringJobs.json — ayar tanımları, zamanlanmış işler
@ -2009,7 +2036,7 @@ configs/seeds/
- `route.constant.ts` içindeki `supplychain`, `maintenance`, `warehouse`, `projects`, `crm`, - `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 `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 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 - Depodaki `appsettings*.json` ve deployment dokümanları geliştirme değerleri/örnek kimlik
bilgileri içerir; üretim öncesi tümü değiştirilmelidir. 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 - SQL View Designer tek yönlüdür (model → T-SQL). Elle yazılmış ya da tasarımcının kanonik

View file

@ -267,6 +267,27 @@ public static class LookupQueryValues
$"WHERE \"IsDeleted\" = 'false' " + $"WHERE \"IsDeleted\" = 'false' " +
$"ORDER BY \"Name\";"; $"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 = public static string JobPositionValues =
$"SELECT " + $"SELECT " +
$"\"Id\" AS \"Key\", " + $"\"Id\" AS \"Key\", " +

View file

@ -2003,6 +2003,332 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
} }
#endregion #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<EditingFormDto>
{
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 #region WorkHour
listFormName = AppCodes.Restrictions.WorkHour; listFormName = AppCodes.Restrictions.WorkHour;
if (!await _listFormRepository.AnyAsync(a => a.ListFormCode == listFormName)) if (!await _listFormRepository.AnyAsync(a => a.ListFormCode == listFormName))
@ -2644,284 +2970,6 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
} }
#endregion #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<EditingFormDto>
{
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<EditingFormDto>
{
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 #region Announcement
listFormName = AppCodes.Intranet.Announcement; listFormName = AppCodes.Intranet.Announcement;
if (!await _listFormRepository.AnyAsync(a => a.ListFormCode == listFormName)) if (!await _listFormRepository.AnyAsync(a => a.ListFormCode == listFormName))

View file

@ -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<ListForm, Guid> _listFormRepository;
private readonly IRepository<ListFormField, Guid> _listFormFieldRepository;
public ListFormSeeder_Hr(
IRepository<ListForm, Guid> listFormRepository,
IRepository<ListFormField, Guid> 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<EditingFormDto>
{
new() {
Order = 1, ColCount = 1, ColSpan = 1, ItemType = "group" },
}),
SubFormsJson = JsonSerializer.Serialize(new List<dynamic>() {
new {
TabType = ListFormTabTypeEnum.List,
TabTitle = AppCodes.Hr.SkillLevel,
Code = AppCodes.Hr.SkillLevel,
Relation = new List<dynamic>() {
new {
ParentFieldName = "Id",
DbType = DbType.String,
ChildFieldName = "SkillTypeId"
}
}
},
new {
TabType = ListFormTabTypeEnum.List,
TabTitle = AppCodes.Hr.Skill,
Code = AppCodes.Hr.Skill,
Relation = new List<dynamic>() {
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<EditingFormDto>() {
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<EditingFormDto>() {
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<EditingFormDto>
{
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<EditingFormDto>
{
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
}
}

View file

@ -2841,723 +2841,6 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
} }
#endregion #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<EditingFormDto>
{
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<EditingFormDto>
{
new() {
Order = 1, ColCount = 1, ColSpan = 1, ItemType = "group" },
}),
SubFormsJson = JsonSerializer.Serialize(new List<dynamic>() {
new {
TabType = ListFormTabTypeEnum.List,
TabTitle = AppCodes.Definitions.SkillLevel,
Code = AppCodes.Definitions.SkillLevel,
Relation = new List<dynamic>() {
new {
ParentFieldName = "Id",
DbType = DbType.String,
ChildFieldName = "SkillTypeId"
}
}
},
new {
TabType = ListFormTabTypeEnum.List,
TabTitle = AppCodes.Definitions.Skill,
Code = AppCodes.Definitions.Skill,
Relation = new List<dynamic>() {
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<EditingFormDto>() {
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<EditingFormDto>() {
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 #region SettingDefinition
listFormName = AppCodes.SettingDefinitions; listFormName = AppCodes.SettingDefinitions;
if (!await _listFormRepository.AnyAsync(a => a.ListFormCode == listFormName)) if (!await _listFormRepository.AnyAsync(a => a.ListFormCode == listFormName))

View file

@ -84,7 +84,9 @@ public class PlatformIdentityDataSeeder : IdentityDataSeeder
var defaultBranch = await _branchRepository.FirstOrDefaultAsync(b => b.Code == branchCode); var defaultBranch = await _branchRepository.FirstOrDefaultAsync(b => b.Code == branchCode);
if (defaultBranch == null) 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) defaultBranch = await _branchRepository.InsertAsync(new Branch(branchId)
{ {
Code = branchCode, Code = branchCode,

View file

@ -6,6 +6,7 @@ public enum MenuPrefix
{ {
Sas, Sas,
Administration, Administration,
Hr,
} }
public static class MenuPrefixExtensions public static class MenuPrefixExtensions
@ -16,6 +17,7 @@ public static class MenuPrefixExtensions
{ {
MenuPrefix.Sas => "Sas", MenuPrefix.Sas => "Sas",
MenuPrefix.Administration => "Adm", MenuPrefix.Administration => "Adm",
MenuPrefix.Hr => "Hr",
_ => throw new ArgumentOutOfRangeException(nameof(menu), menu, null) _ => throw new ArgumentOutOfRangeException(nameof(menu), menu, null)
}; };
} }

View file

@ -63,6 +63,8 @@ public static class PlatformConsts
public static class Branches 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 BranchCode = "Sozsoft";
public const string BranchName = "Sozsoft Branch"; public const string BranchName = "Sozsoft Branch";
public const long BranchVknTckn = 52849619172; public const long BranchVknTckn = 52849619172;
@ -419,12 +421,20 @@ public static class PlatformConsts
public const string Country = Default + ".Country"; public const string Country = Default + ".Country";
public const string City = Default + ".City"; public const string City = Default + ".City";
public const string District = Default + ".District"; public const string District = Default + ".District";
public const string SkillType = Default + ".SkillType";
public const string UomCategory = Default + ".UomCategory"; public const string UomCategory = Default + ".UomCategory";
public const string Sector = Default + ".Sector"; 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 Department = Default + ".Department";
public const string JobPosition = Default + ".JobPosition"; public const string JobPosition = Default + ".JobPosition";
public const string OrgChart = Default + ".OrgChart";
} }
public static class Restrictions public static class Restrictions

View file

@ -23,9 +23,9 @@ public static class TableNameResolver
{ nameof(TableNameEnum.Country), (TablePrefix.PlatformByName, MenuPrefix.Sas) }, { nameof(TableNameEnum.Country), (TablePrefix.PlatformByName, MenuPrefix.Sas) },
{ nameof(TableNameEnum.City), (TablePrefix.PlatformByName, MenuPrefix.Sas) }, { nameof(TableNameEnum.City), (TablePrefix.PlatformByName, MenuPrefix.Sas) },
{ nameof(TableNameEnum.District), (TablePrefix.PlatformByName, MenuPrefix.Sas) }, { nameof(TableNameEnum.District), (TablePrefix.PlatformByName, MenuPrefix.Sas) },
{ nameof(TableNameEnum.SkillType), (TablePrefix.PlatformByName, MenuPrefix.Sas) }, { nameof(TableNameEnum.SkillType), (TablePrefix.PlatformByName, MenuPrefix.Hr) },
{ nameof(TableNameEnum.Skill), (TablePrefix.PlatformByName, MenuPrefix.Sas) }, { nameof(TableNameEnum.Skill), (TablePrefix.PlatformByName, MenuPrefix.Hr) },
{ nameof(TableNameEnum.SkillLevel), (TablePrefix.PlatformByName, MenuPrefix.Sas) }, { nameof(TableNameEnum.SkillLevel), (TablePrefix.PlatformByName, MenuPrefix.Hr) },
{ nameof(TableNameEnum.UomCategory), (TablePrefix.PlatformByName, MenuPrefix.Sas) }, { nameof(TableNameEnum.UomCategory), (TablePrefix.PlatformByName, MenuPrefix.Sas) },
{ nameof(TableNameEnum.Uom), (TablePrefix.PlatformByName, MenuPrefix.Sas) }, { nameof(TableNameEnum.Uom), (TablePrefix.PlatformByName, MenuPrefix.Sas) },
{ nameof(TableNameEnum.Branch), (TablePrefix.TenantByName, MenuPrefix.Sas) }, { nameof(TableNameEnum.Branch), (TablePrefix.TenantByName, MenuPrefix.Sas) },
@ -70,8 +70,8 @@ public static class TableNameResolver
// 🔹 ADMINISTRATION TABLOLARI // 🔹 ADMINISTRATION TABLOLARI
{ nameof(TableNameEnum.Sector), (TablePrefix.TenantByName, MenuPrefix.Administration) }, { nameof(TableNameEnum.Sector), (TablePrefix.TenantByName, MenuPrefix.Administration) },
{ nameof(TableNameEnum.Department), (TablePrefix.TenantByName, MenuPrefix.Administration) }, { nameof(TableNameEnum.Department), (TablePrefix.TenantByName, MenuPrefix.Hr) },
{ nameof(TableNameEnum.JobPosition), (TablePrefix.TenantByName, MenuPrefix.Administration) }, { nameof(TableNameEnum.JobPosition), (TablePrefix.TenantByName, MenuPrefix.Hr) },
{ nameof(TableNameEnum.WorkHour), (TablePrefix.TenantByName, MenuPrefix.Administration) }, { nameof(TableNameEnum.WorkHour), (TablePrefix.TenantByName, MenuPrefix.Administration) },
{ nameof(TableNameEnum.IpRestriction), (TablePrefix.TenantByName, MenuPrefix.Administration) }, { nameof(TableNameEnum.IpRestriction), (TablePrefix.TenantByName, MenuPrefix.Administration) },
{ nameof(TableNameEnum.Note), (TablePrefix.TenantByName, MenuPrefix.Administration) }, { nameof(TableNameEnum.Note), (TablePrefix.TenantByName, MenuPrefix.Administration) },

View file

@ -364,15 +364,23 @@ public static class SeedConsts
public const string Country = Default + ".Country"; public const string Country = Default + ".Country";
public const string City = Default + ".City"; public const string City = Default + ".City";
public const string District = Default + ".District"; 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 UomCategory = Default + ".UomCategory";
public const string Uom = Default + ".Uom"; public const string Uom = Default + ".Uom";
public const string Sector = Default + ".Sector"; 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 Department = Default + ".Department";
public const string JobPosition = Default + ".JobPosition"; public const string JobPosition = Default + ".JobPosition";
public const string OrgChart = Default + ".OrgChart";
} }
public static class Restrictions public static class Restrictions

View file

@ -9,6 +9,8 @@ public class Department : FullAuditedEntity<Guid>, IMultiTenant
{ {
public Guid? TenantId { get; set; } public Guid? TenantId { get; set; }
public Guid BranchId { get; set; }
public string Name { get; set; } public string Name { get; set; }
public Guid? ParentId { get; set; } public Guid? ParentId { get; set; }

View file

@ -8,6 +8,8 @@ public class JobPosition : FullAuditedEntity<Guid>, IMultiTenant
{ {
public Guid? TenantId { get; set; } public Guid? TenantId { get; set; }
public Guid BranchId { get; set; }
public string Name { get; set; } public string Name { get; set; }
public Guid DepartmentId { get; set; } public Guid DepartmentId { get; set; }

View file

@ -967,7 +967,7 @@ public class PlatformDbContext :
b.Property(x => x.Name).IsRequired().HasMaxLength(64); 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<JobPosition>(b => builder.Entity<JobPosition>(b =>

View file

@ -2319,6 +2319,9 @@ namespace Sozsoft.Platform.Migrations
b.Property<Guid>("Id") b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier"); .HasColumnType("uniqueidentifier");
b.Property<Guid>("BranchId")
.HasColumnType("uniqueidentifier");
b.Property<DateTime>("CreationTime") b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2") .HasColumnType("datetime2")
.HasColumnName("CreationTime"); .HasColumnName("CreationTime");
@ -2363,11 +2366,11 @@ namespace Sozsoft.Platform.Migrations
b.HasKey("Id"); b.HasKey("Id");
b.HasIndex("TenantId", "Name") b.HasIndex("TenantId", "BranchId", "Name")
.IsUnique() .IsUnique()
.HasFilter("[IsDeleted] = 0"); .HasFilter("[IsDeleted] = 0");
b.ToTable("Adm_T_Department", (string)null); b.ToTable("Hr_T_Department", (string)null);
}); });
modelBuilder.Entity("Sozsoft.Platform.Entities.DevRequest", b => modelBuilder.Entity("Sozsoft.Platform.Entities.DevRequest", b =>
@ -3199,6 +3202,9 @@ namespace Sozsoft.Platform.Migrations
b.Property<Guid>("Id") b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier"); .HasColumnType("uniqueidentifier");
b.Property<Guid>("BranchId")
.HasColumnType("uniqueidentifier");
b.Property<DateTime>("CreationTime") b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2") .HasColumnType("datetime2")
.HasColumnName("CreationTime"); .HasColumnName("CreationTime");
@ -3252,7 +3258,7 @@ namespace Sozsoft.Platform.Migrations
.IsUnique() .IsUnique()
.HasFilter("[IsDeleted] = 0"); .HasFilter("[IsDeleted] = 0");
b.ToTable("Adm_T_JobPosition", (string)null); b.ToTable("Hr_T_JobPosition", (string)null);
}); });
modelBuilder.Entity("Sozsoft.Platform.Entities.ListForm", b => modelBuilder.Entity("Sozsoft.Platform.Entities.ListForm", b =>
@ -5191,7 +5197,7 @@ namespace Sozsoft.Platform.Migrations
.IsUnique() .IsUnique()
.HasFilter("[IsDeleted] = 0"); .HasFilter("[IsDeleted] = 0");
b.ToTable("Sas_H_Skill", (string)null); b.ToTable("Hr_H_Skill", (string)null);
}); });
modelBuilder.Entity("Sozsoft.Platform.Entities.SkillLevel", b => modelBuilder.Entity("Sozsoft.Platform.Entities.SkillLevel", b =>
@ -5256,7 +5262,7 @@ namespace Sozsoft.Platform.Migrations
.IsUnique() .IsUnique()
.HasFilter("[IsDeleted] = 0"); .HasFilter("[IsDeleted] = 0");
b.ToTable("Sas_H_SkillLevel", (string)null); b.ToTable("Hr_H_SkillLevel", (string)null);
}); });
modelBuilder.Entity("Sozsoft.Platform.Entities.SkillType", b => modelBuilder.Entity("Sozsoft.Platform.Entities.SkillType", b =>
@ -5306,7 +5312,7 @@ namespace Sozsoft.Platform.Migrations
.IsUnique() .IsUnique()
.HasFilter("[IsDeleted] = 0"); .HasFilter("[IsDeleted] = 0");
b.ToTable("Sas_H_SkillType", (string)null); b.ToTable("Hr_H_SkillType", (string)null);
}); });
modelBuilder.Entity("Sozsoft.Platform.Entities.SocialComment", b => modelBuilder.Entity("Sozsoft.Platform.Entities.SocialComment", b =>

View file

@ -543,11 +543,12 @@ namespace Sozsoft.Platform.Migrations
}); });
migrationBuilder.CreateTable( migrationBuilder.CreateTable(
name: "Adm_T_Department", name: "Hr_T_Department",
columns: table => new columns: table => new
{ {
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false), Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true), TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
BranchId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
Name = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false), Name = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
ParentId = table.Column<Guid>(type: "uniqueidentifier", nullable: true), ParentId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false), CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
@ -560,7 +561,7 @@ namespace Sozsoft.Platform.Migrations
}, },
constraints: table => constraints: table =>
{ {
table.PrimaryKey("PK_Adm_T_Department", x => x.Id); table.PrimaryKey("PK_Hr_T_Department", x => x.Id);
}); });
migrationBuilder.CreateTable( migrationBuilder.CreateTable(
@ -1756,7 +1757,7 @@ namespace Sozsoft.Platform.Migrations
}); });
migrationBuilder.CreateTable( migrationBuilder.CreateTable(
name: "Sas_H_SkillType", name: "Hr_H_SkillType",
columns: table => new columns: table => new
{ {
Id = table.Column<string>(type: "nvarchar(128)", maxLength: 128, nullable: false), Id = table.Column<string>(type: "nvarchar(128)", maxLength: 128, nullable: false),
@ -1771,7 +1772,7 @@ namespace Sozsoft.Platform.Migrations
}, },
constraints: table => constraints: table =>
{ {
table.PrimaryKey("PK_Sas_H_SkillType", x => x.Id); table.PrimaryKey("PK_Hr_H_SkillType", x => x.Id);
}); });
migrationBuilder.CreateTable( migrationBuilder.CreateTable(
@ -2211,11 +2212,12 @@ namespace Sozsoft.Platform.Migrations
}); });
migrationBuilder.CreateTable( migrationBuilder.CreateTable(
name: "Adm_T_JobPosition", name: "Hr_T_JobPosition",
columns: table => new columns: table => new
{ {
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false), Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true), TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
BranchId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
Name = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false), Name = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
DepartmentId = table.Column<Guid>(type: "uniqueidentifier", nullable: false), DepartmentId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
ParentId = table.Column<Guid>(type: "uniqueidentifier", nullable: true), ParentId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
@ -2229,11 +2231,11 @@ namespace Sozsoft.Platform.Migrations
}, },
constraints: table => constraints: table =>
{ {
table.PrimaryKey("PK_Adm_T_JobPosition", x => x.Id); table.PrimaryKey("PK_Hr_T_JobPosition", x => x.Id);
table.ForeignKey( table.ForeignKey(
name: "FK_Adm_T_JobPosition_Adm_T_Department_DepartmentId", name: "FK_Hr_T_JobPosition_Hr_T_Department_DepartmentId",
column: x => x.DepartmentId, column: x => x.DepartmentId,
principalTable: "Adm_T_Department", principalTable: "Hr_T_Department",
principalColumn: "Id", principalColumn: "Id",
onDelete: ReferentialAction.Restrict); onDelete: ReferentialAction.Restrict);
}); });
@ -3031,7 +3033,7 @@ namespace Sozsoft.Platform.Migrations
}); });
migrationBuilder.CreateTable( migrationBuilder.CreateTable(
name: "Sas_H_Skill", name: "Hr_H_Skill",
columns: table => new columns: table => new
{ {
Id = table.Column<string>(type: "nvarchar(128)", maxLength: 128, nullable: false), Id = table.Column<string>(type: "nvarchar(128)", maxLength: 128, nullable: false),
@ -3047,17 +3049,17 @@ namespace Sozsoft.Platform.Migrations
}, },
constraints: table => constraints: table =>
{ {
table.PrimaryKey("PK_Sas_H_Skill", x => x.Id); table.PrimaryKey("PK_Hr_H_Skill", x => x.Id);
table.ForeignKey( table.ForeignKey(
name: "FK_Sas_H_Skill_Sas_H_SkillType_SkillTypeId", name: "FK_Hr_H_Skill_Hr_H_SkillType_SkillTypeId",
column: x => x.SkillTypeId, column: x => x.SkillTypeId,
principalTable: "Sas_H_SkillType", principalTable: "Hr_H_SkillType",
principalColumn: "Id", principalColumn: "Id",
onDelete: ReferentialAction.Cascade); onDelete: ReferentialAction.Cascade);
}); });
migrationBuilder.CreateTable( migrationBuilder.CreateTable(
name: "Sas_H_SkillLevel", name: "Hr_H_SkillLevel",
columns: table => new columns: table => new
{ {
Id = table.Column<string>(type: "nvarchar(128)", maxLength: 128, nullable: false), Id = table.Column<string>(type: "nvarchar(128)", maxLength: 128, nullable: false),
@ -3075,11 +3077,11 @@ namespace Sozsoft.Platform.Migrations
}, },
constraints: table => constraints: table =>
{ {
table.PrimaryKey("PK_Sas_H_SkillLevel", x => x.Id); table.PrimaryKey("PK_Hr_H_SkillLevel", x => x.Id);
table.ForeignKey( table.ForeignKey(
name: "FK_Sas_H_SkillLevel_Sas_H_SkillType_SkillTypeId", name: "FK_Hr_H_SkillLevel_Hr_H_SkillType_SkillTypeId",
column: x => x.SkillTypeId, column: x => x.SkillTypeId,
principalTable: "Sas_H_SkillType", principalTable: "Hr_H_SkillType",
principalColumn: "Id", principalColumn: "Id",
onDelete: ReferentialAction.Cascade); onDelete: ReferentialAction.Cascade);
}); });
@ -3801,9 +3803,9 @@ namespace Sozsoft.Platform.Migrations
filter: "[IsDeleted] = 0"); filter: "[IsDeleted] = 0");
migrationBuilder.CreateIndex( migrationBuilder.CreateIndex(
name: "IX_Adm_T_Department_TenantId_Name", name: "IX_Hr_T_Department_TenantId_BranchId_Name",
table: "Adm_T_Department", table: "Hr_T_Department",
columns: new[] { "TenantId", "Name" }, columns: new[] { "TenantId", "BranchId", "Name" },
unique: true, unique: true,
filter: "[IsDeleted] = 0"); filter: "[IsDeleted] = 0");
@ -3858,13 +3860,13 @@ namespace Sozsoft.Platform.Migrations
filter: "[IsDeleted] = 0"); filter: "[IsDeleted] = 0");
migrationBuilder.CreateIndex( migrationBuilder.CreateIndex(
name: "IX_Adm_T_JobPosition_DepartmentId", name: "IX_Hr_T_JobPosition_DepartmentId",
table: "Adm_T_JobPosition", table: "Hr_T_JobPosition",
column: "DepartmentId"); column: "DepartmentId");
migrationBuilder.CreateIndex( migrationBuilder.CreateIndex(
name: "IX_Adm_T_JobPosition_TenantId_Name_DepartmentId", name: "IX_Hr_T_JobPosition_TenantId_Name_DepartmentId",
table: "Adm_T_JobPosition", table: "Hr_T_JobPosition",
columns: new[] { "TenantId", "Name", "DepartmentId" }, columns: new[] { "TenantId", "Name", "DepartmentId" },
unique: true, unique: true,
filter: "[IsDeleted] = 0"); filter: "[IsDeleted] = 0");
@ -4331,22 +4333,22 @@ namespace Sozsoft.Platform.Migrations
filter: "[IsDeleted] = 0"); filter: "[IsDeleted] = 0");
migrationBuilder.CreateIndex( migrationBuilder.CreateIndex(
name: "IX_Sas_H_Skill_SkillTypeId_Name", name: "IX_Hr_H_Skill_SkillTypeId_Name",
table: "Sas_H_Skill", table: "Hr_H_Skill",
columns: new[] { "SkillTypeId", "Name" }, columns: new[] { "SkillTypeId", "Name" },
unique: true, unique: true,
filter: "[IsDeleted] = 0"); filter: "[IsDeleted] = 0");
migrationBuilder.CreateIndex( migrationBuilder.CreateIndex(
name: "IX_Sas_H_SkillLevel_SkillTypeId_Name", name: "IX_Hr_H_SkillLevel_SkillTypeId_Name",
table: "Sas_H_SkillLevel", table: "Hr_H_SkillLevel",
columns: new[] { "SkillTypeId", "Name" }, columns: new[] { "SkillTypeId", "Name" },
unique: true, unique: true,
filter: "[IsDeleted] = 0"); filter: "[IsDeleted] = 0");
migrationBuilder.CreateIndex( migrationBuilder.CreateIndex(
name: "IX_Sas_H_SkillType_Name", name: "IX_Hr_H_SkillType_Name",
table: "Sas_H_SkillType", table: "Hr_H_SkillType",
column: "Name", column: "Name",
unique: true, unique: true,
filter: "[IsDeleted] = 0"); filter: "[IsDeleted] = 0");
@ -4510,7 +4512,7 @@ namespace Sozsoft.Platform.Migrations
name: "Adm_T_IpRestriction"); name: "Adm_T_IpRestriction");
migrationBuilder.DropTable( migrationBuilder.DropTable(
name: "Adm_T_JobPosition"); name: "Hr_T_JobPosition");
migrationBuilder.DropTable( migrationBuilder.DropTable(
name: "Adm_T_MessengerConversationMessage"); name: "Adm_T_MessengerConversationMessage");
@ -4660,10 +4662,10 @@ namespace Sozsoft.Platform.Migrations
name: "Sas_H_SettingDefinition"); name: "Sas_H_SettingDefinition");
migrationBuilder.DropTable( migrationBuilder.DropTable(
name: "Sas_H_Skill"); name: "Hr_H_Skill");
migrationBuilder.DropTable( migrationBuilder.DropTable(
name: "Sas_H_SkillLevel"); name: "Hr_H_SkillLevel");
migrationBuilder.DropTable( migrationBuilder.DropTable(
name: "Sas_H_Uom"); name: "Sas_H_Uom");
@ -4705,7 +4707,7 @@ namespace Sozsoft.Platform.Migrations
name: "Adm_T_Event"); name: "Adm_T_Event");
migrationBuilder.DropTable( migrationBuilder.DropTable(
name: "Adm_T_Department"); name: "Hr_T_Department");
migrationBuilder.DropTable( migrationBuilder.DropTable(
name: "Adm_T_MessengerConversation"); name: "Adm_T_MessengerConversation");
@ -4756,7 +4758,7 @@ namespace Sozsoft.Platform.Migrations
name: "Sas_H_Order"); name: "Sas_H_Order");
migrationBuilder.DropTable( migrationBuilder.DropTable(
name: "Sas_H_SkillType"); name: "Hr_H_SkillType");
migrationBuilder.DropTable( migrationBuilder.DropTable(
name: "Sas_H_UomCategory"); name: "Sas_H_UomCategory");

View file

@ -2316,6 +2316,9 @@ namespace Sozsoft.Platform.Migrations
b.Property<Guid>("Id") b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier"); .HasColumnType("uniqueidentifier");
b.Property<Guid>("BranchId")
.HasColumnType("uniqueidentifier");
b.Property<DateTime>("CreationTime") b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2") .HasColumnType("datetime2")
.HasColumnName("CreationTime"); .HasColumnName("CreationTime");
@ -2360,11 +2363,11 @@ namespace Sozsoft.Platform.Migrations
b.HasKey("Id"); b.HasKey("Id");
b.HasIndex("TenantId", "Name") b.HasIndex("TenantId", "BranchId", "Name")
.IsUnique() .IsUnique()
.HasFilter("[IsDeleted] = 0"); .HasFilter("[IsDeleted] = 0");
b.ToTable("Adm_T_Department", (string)null); b.ToTable("Hr_T_Department", (string)null);
}); });
modelBuilder.Entity("Sozsoft.Platform.Entities.DevRequest", b => modelBuilder.Entity("Sozsoft.Platform.Entities.DevRequest", b =>
@ -3196,6 +3199,9 @@ namespace Sozsoft.Platform.Migrations
b.Property<Guid>("Id") b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier"); .HasColumnType("uniqueidentifier");
b.Property<Guid>("BranchId")
.HasColumnType("uniqueidentifier");
b.Property<DateTime>("CreationTime") b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2") .HasColumnType("datetime2")
.HasColumnName("CreationTime"); .HasColumnName("CreationTime");
@ -3249,7 +3255,7 @@ namespace Sozsoft.Platform.Migrations
.IsUnique() .IsUnique()
.HasFilter("[IsDeleted] = 0"); .HasFilter("[IsDeleted] = 0");
b.ToTable("Adm_T_JobPosition", (string)null); b.ToTable("Hr_T_JobPosition", (string)null);
}); });
modelBuilder.Entity("Sozsoft.Platform.Entities.ListForm", b => modelBuilder.Entity("Sozsoft.Platform.Entities.ListForm", b =>
@ -5188,7 +5194,7 @@ namespace Sozsoft.Platform.Migrations
.IsUnique() .IsUnique()
.HasFilter("[IsDeleted] = 0"); .HasFilter("[IsDeleted] = 0");
b.ToTable("Sas_H_Skill", (string)null); b.ToTable("Hr_H_Skill", (string)null);
}); });
modelBuilder.Entity("Sozsoft.Platform.Entities.SkillLevel", b => modelBuilder.Entity("Sozsoft.Platform.Entities.SkillLevel", b =>
@ -5253,7 +5259,7 @@ namespace Sozsoft.Platform.Migrations
.IsUnique() .IsUnique()
.HasFilter("[IsDeleted] = 0"); .HasFilter("[IsDeleted] = 0");
b.ToTable("Sas_H_SkillLevel", (string)null); b.ToTable("Hr_H_SkillLevel", (string)null);
}); });
modelBuilder.Entity("Sozsoft.Platform.Entities.SkillType", b => modelBuilder.Entity("Sozsoft.Platform.Entities.SkillType", b =>
@ -5303,7 +5309,7 @@ namespace Sozsoft.Platform.Migrations
.IsUnique() .IsUnique()
.HasFilter("[IsDeleted] = 0"); .HasFilter("[IsDeleted] = 0");
b.ToTable("Sas_H_SkillType", (string)null); b.ToTable("Hr_H_SkillType", (string)null);
}); });
modelBuilder.Entity("Sozsoft.Platform.Entities.SocialComment", b => modelBuilder.Entity("Sozsoft.Platform.Entities.SocialComment", b =>

View file

@ -79,7 +79,9 @@ public class TenantIdentityDataSeeder : IdentityDataSeeder
var defaultBranch = await _branchRepository.FirstOrDefaultAsync(b => b.Code == branchCode); var defaultBranch = await _branchRepository.FirstOrDefaultAsync(b => b.Code == branchCode);
if (defaultBranch == null) 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) defaultBranch = await _branchRepository.InsertAsync(new Branch(branchId)
{ {
Code = branchCode, Code = branchCode,

View file

@ -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` | | 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` | | **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` | | `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` | | 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` | | 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 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 kullanıcının runtime revizyonunu ezmez. Yeni bir seeder yazarken bu kuralı taklit et: **migrate
varsayılanı eklemektir, ezmek değil.** 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 - **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 `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` verisiyle aynı mekanizmadan (`ListFormSeedDataApplier`) geçer, ayrı bir seeder yoktur. `Order`

View file

@ -13,6 +13,11 @@
"Name": "App.Administration", "Name": "App.Administration",
"DisplayName": "App.Administration", "DisplayName": "App.Administration",
"Order": 2 "Order": 2
},
{
"Name": "App.Hr",
"DisplayName": "App.Hr",
"Order": 3
} }
] ]
} }

View file

@ -504,202 +504,12 @@
"MultiTenancySide": 2, "MultiTenancySide": 2,
"Modules": "Sas|Adm" "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", "GroupName": "App.Saas",
"Name": "App.Definitions.UomCategory", "Name": "App.Definitions.UomCategory",
"ParentName": "App.Saas.Definitions", "ParentName": "App.Saas.Definitions",
"DisplayName": "App.Definitions.UomCategory", "DisplayName": "App.Definitions.UomCategory",
"Order": 12, "Order": 9,
"IsEnabled": true, "IsEnabled": true,
"MultiTenancySide": 2, "MultiTenancySide": 2,
"Modules": "Sas|Adm" "Modules": "Sas|Adm"
@ -769,7 +579,7 @@
"Name": "App.Definitions.Uom", "Name": "App.Definitions.Uom",
"ParentName": "App.Saas.Definitions", "ParentName": "App.Saas.Definitions",
"DisplayName": "App.Definitions.Uom", "DisplayName": "App.Definitions.Uom",
"Order": 13, "Order": 10,
"IsEnabled": true, "IsEnabled": true,
"MultiTenancySide": 2, "MultiTenancySide": 2,
"Modules": "Sas|Adm" "Modules": "Sas|Adm"
@ -824,66 +634,6 @@
"MultiTenancySide": 2, "MultiTenancySide": 2,
"Modules": "Sas|Adm" "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", "GroupName": "App.Saas",
"Name": "App.Public", "Name": "App.Public",
@ -3096,9 +2846,9 @@
}, },
{ {
"GroupName": "App.Administration", "GroupName": "App.Administration",
"Name": "App.Definitions.Department", "Name": "App.Definitions.Sequence",
"ParentName": "App.Administration.Definitions", "ParentName": "App.Administration.Definitions",
"DisplayName": "App.Definitions.Department", "DisplayName": "App.Definitions.Sequence",
"Order": 2, "Order": 2,
"IsEnabled": true, "IsEnabled": true,
"MultiTenancySide": 3, "MultiTenancySide": 3,
@ -3106,8 +2856,8 @@
}, },
{ {
"GroupName": "App.Administration", "GroupName": "App.Administration",
"Name": "App.Definitions.Department.Create", "Name": "App.Definitions.Sequence.Create",
"ParentName": "App.Definitions.Department", "ParentName": "App.Definitions.Sequence",
"DisplayName": "App.Platform.Create", "DisplayName": "App.Platform.Create",
"Order": 1, "Order": 1,
"IsEnabled": true, "IsEnabled": true,
@ -3116,8 +2866,8 @@
}, },
{ {
"GroupName": "App.Administration", "GroupName": "App.Administration",
"Name": "App.Definitions.Department.Update", "Name": "App.Definitions.Sequence.Update",
"ParentName": "App.Definitions.Department", "ParentName": "App.Definitions.Sequence",
"DisplayName": "App.Platform.Update", "DisplayName": "App.Platform.Update",
"Order": 2, "Order": 2,
"IsEnabled": true, "IsEnabled": true,
@ -3126,8 +2876,8 @@
}, },
{ {
"GroupName": "App.Administration", "GroupName": "App.Administration",
"Name": "App.Definitions.Department.Delete", "Name": "App.Definitions.Sequence.Delete",
"ParentName": "App.Definitions.Department", "ParentName": "App.Definitions.Sequence",
"DisplayName": "App.Platform.Delete", "DisplayName": "App.Platform.Delete",
"Order": 3, "Order": 3,
"IsEnabled": true, "IsEnabled": true,
@ -3136,8 +2886,8 @@
}, },
{ {
"GroupName": "App.Administration", "GroupName": "App.Administration",
"Name": "App.Definitions.Department.Export", "Name": "App.Definitions.Sequence.Export",
"ParentName": "App.Definitions.Department", "ParentName": "App.Definitions.Sequence",
"DisplayName": "Export", "DisplayName": "Export",
"Order": 4, "Order": 4,
"IsEnabled": true, "IsEnabled": true,
@ -3146,84 +2896,14 @@
}, },
{ {
"GroupName": "App.Administration", "GroupName": "App.Administration",
"Name": "App.Definitions.Department.Import", "Name": "App.Definitions.Sequence.Import",
"ParentName": "App.Definitions.Department", "ParentName": "App.Definitions.Sequence",
"DisplayName": "Import", "DisplayName": "Import",
"Order": 5, "Order": 5,
"IsEnabled": true, "IsEnabled": true,
"MultiTenancySide": 3, "MultiTenancySide": 3,
"Modules": "Sas|Adm" "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", "GroupName": "App.Administration",
"Name": "App.Licence", "Name": "App.Licence",
@ -5983,6 +5663,336 @@
"IsEnabled": true, "IsEnabled": true,
"MultiTenancySide": 3, "MultiTenancySide": 3,
"Modules": "Sas|Adm" "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"
} }
] ]
} }

View file

@ -1,36 +1,42 @@
{ {
"ListFormCode": "App.Definitions.Department", "ListFormCode": "App.Hr.Department",
"KeyFieldName": "Id", "KeyFieldName": "Id",
"GeneratedAt": "2026-09-04T00:00:00Z", "GeneratedAt": "2026-09-04T00:00:00Z",
"Order": 10, "Order": 10,
"Rows": [ "Rows": [
{ {
"Id": "8f14e45f-ea2d-4d9f-9f1d-1a2b3c4d5e6f", "Id": "8f14e45f-ea2d-4d9f-9f1d-1a2b3c4d5e6f",
"BranchId": "1c125bf3-3ffd-4445-a270-1bc43ac3f61c",
"Name": "Yönetim", "Name": "Yönetim",
"ParentId": null "ParentId": null
}, },
{ {
"Id": "2c1743a3-91b7-4b57-a6c8-7d8e9f0a1b2c", "Id": "2c1743a3-91b7-4b57-a6c8-7d8e9f0a1b2c",
"BranchId": "1c125bf3-3ffd-4445-a270-1bc43ac3f61c",
"Name": "Üretim", "Name": "Üretim",
"ParentId": "8f14e45f-ea2d-4d9f-9f1d-1a2b3c4d5e6f" "ParentId": "8f14e45f-ea2d-4d9f-9f1d-1a2b3c4d5e6f"
}, },
{ {
"Id": "987bcab0-1b92-4a4e-8d7f-3c2b1a0f9e8d", "Id": "987bcab0-1b92-4a4e-8d7f-3c2b1a0f9e8d",
"BranchId": "1c125bf3-3ffd-4445-a270-1bc43ac3f61c",
"Name": "Satış", "Name": "Satış",
"ParentId": "8f14e45f-ea2d-4d9f-9f1d-1a2b3c4d5e6f" "ParentId": "8f14e45f-ea2d-4d9f-9f1d-1a2b3c4d5e6f"
}, },
{ {
"Id": "05b048d7-2f44-4f9d-b5a1-6e7f8a9b0c1d", "Id": "05b048d7-2f44-4f9d-b5a1-6e7f8a9b0c1d",
"BranchId": "1c125bf3-3ffd-4445-a270-1bc43ac3f61c",
"Name": "Finans", "Name": "Finans",
"ParentId": "8f14e45f-ea2d-4d9f-9f1d-1a2b3c4d5e6f" "ParentId": "8f14e45f-ea2d-4d9f-9f1d-1a2b3c4d5e6f"
}, },
{ {
"Id": "051048d7-2f44-4f9d-b5a1-6e7f8a9b0c1d", "Id": "051048d7-2f44-4f9d-b5a1-6e7f8a9b0c1d",
"BranchId": "1c125bf3-3ffd-4445-a270-1bc43ac3f61c",
"Name": "Muhasebe", "Name": "Muhasebe",
"ParentId": "05b048d7-2f44-4f9d-b5a1-6e7f8a9b0c1d" "ParentId": "05b048d7-2f44-4f9d-b5a1-6e7f8a9b0c1d"
}, },
{ {
"Id": "3cd38ab3-7e6f-4b8d-9c0a-5f4e3d2c1b0a", "Id": "3cd38ab3-7e6f-4b8d-9c0a-5f4e3d2c1b0a",
"BranchId": "1c125bf3-3ffd-4445-a270-1bc43ac3f61c",
"Name": "Bilgi İşlem", "Name": "Bilgi İşlem",
"ParentId": "8f14e45f-ea2d-4d9f-9f1d-1a2b3c4d5e6f" "ParentId": "8f14e45f-ea2d-4d9f-9f1d-1a2b3c4d5e6f"
} }

View file

@ -1,53 +1,61 @@
{ {
"ListFormCode": "App.Definitions.JobPosition", "ListFormCode": "App.Hr.JobPosition",
"KeyFieldName": "Id", "KeyFieldName": "Id",
"GeneratedAt": "2026-09-04T00:00:00Z", "GeneratedAt": "2026-09-04T00:00:00Z",
"Order": 20, "Order": 20,
"Rows": [ "Rows": [
{ {
"Id": "d1f7c6a2-3b4e-4c8d-9f0a-1b2c3d4e5f60", "Id": "d1f7c6a2-3b4e-4c8d-9f0a-1b2c3d4e5f60",
"BranchId": "1c125bf3-3ffd-4445-a270-1bc43ac3f61c",
"Name": "Genel Müdür", "Name": "Genel Müdür",
"DepartmentId": "8f14e45f-ea2d-4d9f-9f1d-1a2b3c4d5e6f", "DepartmentId": "8f14e45f-ea2d-4d9f-9f1d-1a2b3c4d5e6f",
"ParentId": null "ParentId": null
}, },
{ {
"Id": "b7c8d9e0-f1a2-4b3c-8d9e-0f1a2b3c4d2e", "Id": "b7c8d9e0-f1a2-4b3c-8d9e-0f1a2b3c4d2e",
"BranchId": "1c125bf3-3ffd-4445-a270-1bc43ac3f61c",
"Name": "Bilgi İşlem Müdürü", "Name": "Bilgi İşlem Müdürü",
"DepartmentId": "3cd38ab3-7e6f-4b8d-9c0a-5f4e3d2c1b0a", "DepartmentId": "3cd38ab3-7e6f-4b8d-9c0a-5f4e3d2c1b0a",
"ParentId": "d1f7c6a2-3b4e-4c8d-9f0a-1b2c3d4e5f60" "ParentId": "d1f7c6a2-3b4e-4c8d-9f0a-1b2c3d4e5f60"
}, },
{ {
"Id": "b7c8d9e0-f1b2-4b3c-1d9e-0f1a2b3c4d2e", "Id": "b7c8d9e0-f1b2-4b3c-1d9e-0f1a2b3c4d2e",
"BranchId": "1c125bf3-3ffd-4445-a270-1bc43ac3f61c",
"Name": "İhracat Müdürü", "Name": "İhracat Müdürü",
"DepartmentId": "987bcab0-1b92-4a4e-8d7f-3c2b1a0f9e8d", "DepartmentId": "987bcab0-1b92-4a4e-8d7f-3c2b1a0f9e8d",
"ParentId": "d1f7c6a2-3b4e-4c8d-9f0a-1b2c3d4e5f60" "ParentId": "d1f7c6a2-3b4e-4c8d-9f0a-1b2c3d4e5f60"
}, },
{ {
"Id": "b2c8d9e0-f1b2-4b3c-1d9e-0f1a2b3c4d2e", "Id": "b2c8d9e0-f1b2-4b3c-1d9e-0f1a2b3c4d2e",
"BranchId": "1c125bf3-3ffd-4445-a270-1bc43ac3f61c",
"Name": "İç Piyasa Müdürü", "Name": "İç Piyasa Müdürü",
"DepartmentId": "987bcab0-1b92-4a4e-8d7f-3c2b1a0f9e8d", "DepartmentId": "987bcab0-1b92-4a4e-8d7f-3c2b1a0f9e8d",
"ParentId": "d1f7c6a2-3b4e-4c8d-9f0a-1b2c3d4e5f60" "ParentId": "d1f7c6a2-3b4e-4c8d-9f0a-1b2c3d4e5f60"
}, },
{ {
"Id": "b2c8d9e0-f1b2-2b3c-1d9e-0f1a2b3c4d2e", "Id": "b2c8d9e0-f1b2-2b3c-1d9e-0f1a2b3c4d2e",
"BranchId": "1c125bf3-3ffd-4445-a270-1bc43ac3f61c",
"Name": "Üretim Müdürü", "Name": "Üretim Müdürü",
"DepartmentId": "2c1743a3-91b7-4b57-a6c8-7d8e9f0a1b2c", "DepartmentId": "2c1743a3-91b7-4b57-a6c8-7d8e9f0a1b2c",
"ParentId": "d1f7c6a2-3b4e-4c8d-9f0a-1b2c3d4e5f60" "ParentId": "d1f7c6a2-3b4e-4c8d-9f0a-1b2c3d4e5f60"
}, },
{ {
"Id": "b7c8d9e0-f1a2-4b3c-1d9e-0f1a2b3c4d2e", "Id": "b7c8d9e0-f1a2-4b3c-1d9e-0f1a2b3c4d2e",
"BranchId": "1c125bf3-3ffd-4445-a270-1bc43ac3f61c",
"Name": "Finans Müdürü", "Name": "Finans Müdürü",
"DepartmentId": "05b048d7-2f44-4f9d-b5a1-6e7f8a9b0c1d", "DepartmentId": "05b048d7-2f44-4f9d-b5a1-6e7f8a9b0c1d",
"ParentId": "d1f7c6a2-3b4e-4c8d-9f0a-1b2c3d4e5f60" "ParentId": "d1f7c6a2-3b4e-4c8d-9f0a-1b2c3d4e5f60"
}, },
{ {
"Id": "b7c8d9e0-f1a2-4b3c-8d9e-0f1a2b3c4d5e", "Id": "b7c8d9e0-f1a2-4b3c-8d9e-0f1a2b3c4d5e",
"BranchId": "1c125bf3-3ffd-4445-a270-1bc43ac3f61c",
"Name": "Muhasebe Müdürü", "Name": "Muhasebe Müdürü",
"DepartmentId": "051048d7-2f44-4f9d-b5a1-6e7f8a9b0c1d", "DepartmentId": "051048d7-2f44-4f9d-b5a1-6e7f8a9b0c1d",
"ParentId": "b7c8d9e0-f1a2-4b3c-1d9e-0f1a2b3c4d2e" "ParentId": "b7c8d9e0-f1a2-4b3c-1d9e-0f1a2b3c4d2e"
}, },
{ {
"Id": "c3d4e5f6-a7b8-4c9d-8e0f-1a2b3c4d5e6f", "Id": "c3d4e5f6-a7b8-4c9d-8e0f-1a2b3c4d5e6f",
"BranchId": "1c125bf3-3ffd-4445-a270-1bc43ac3f61c",
"Name": "Muhasebe Şefi", "Name": "Muhasebe Şefi",
"DepartmentId": "051048d7-2f44-4f9d-b5a1-6e7f8a9b0c1d", "DepartmentId": "051048d7-2f44-4f9d-b5a1-6e7f8a9b0c1d",
"ParentId": "b7c8d9e0-f1a2-4b3c-8d9e-0f1a2b3c4d5e" "ParentId": "b7c8d9e0-f1a2-4b3c-8d9e-0f1a2b3c4d5e"

View file

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

View file

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

View file

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

View file

@ -60,6 +60,20 @@
"Key": "App.Administration", "Key": "App.Administration",
"Value": "Yönetim" "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", "Id": "b0b6e354-09a3-5e03-a0f8-95094b44ce15",
"CultureName": "en", "CultureName": "en",
@ -2175,17 +2189,17 @@
"Value": "Diziler" "Value": "Diziler"
}, },
{ {
"Id": "73f84074-c2c1-5876-8310-b80abe7ba620", "Id": "48d6fa3b-3209-569f-bcf9-b4265c696bb2",
"CultureName": "en", "CultureName": "en",
"ResourceName": "Platform", "ResourceName": "Platform",
"Key": "App.Definitions.OrgChart", "Key": "App.Hr.OrgChart",
"Value": "Organization Chart" "Value": "Organization Chart"
}, },
{ {
"Id": "f11481bd-f5d7-559c-952d-8a3877e181b7", "Id": "7ec675c3-af4e-5021-aca0-527c5f2ae4cf",
"CultureName": "tr", "CultureName": "tr",
"ResourceName": "Platform", "ResourceName": "Platform",
"Key": "App.Definitions.OrgChart", "Key": "App.Hr.OrgChart",
"Value": "Organizasyon Şeması" "Value": "Organizasyon Şeması"
}, },
{ {
@ -15125,33 +15139,19 @@
"Value": "Sektörler" "Value": "Sektörler"
}, },
{ {
"Id": "14bca818-01e2-58fa-816d-d73b0c6a01b3", "Id": "07223a76-40ab-5338-a427-fb3b2b051bd6",
"CultureName": "en", "CultureName": "en",
"ResourceName": "Platform", "ResourceName": "Platform",
"Key": "App.Definitions.Department", "Key": "App.Hr.Department",
"Value": "Departments" "Value": "Departments"
}, },
{ {
"Id": "0c0778aa-bb99-55e2-8974-1345bd758269", "Id": "5fc7cf2d-b22c-55cd-aa20-dd4b247a255f",
"CultureName": "tr", "CultureName": "tr",
"ResourceName": "Platform", "ResourceName": "Platform",
"Key": "App.Definitions.Department", "Key": "App.Hr.Department",
"Value": "Departmanlar" "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", "Id": "935c7115-38b4-501e-8b43-6975a0ad494a",
"CultureName": "en", "CultureName": "en",
@ -15251,45 +15251,45 @@
"Value": "İlçeler" "Value": "İlçeler"
}, },
{ {
"Id": "680b4c15-97e4-54e6-b740-7479628be5c0", "Id": "e5e1ee56-7ff7-59f1-8f32-cee8fc364f00",
"CultureName": "en", "CultureName": "en",
"ResourceName": "Platform", "ResourceName": "Platform",
"Key": "App.Definitions.SkillType", "Key": "App.Hr.SkillType",
"Value": "Skill Types" "Value": "Skill Types"
}, },
{ {
"Id": "76818b6a-9ec3-5f0b-ab31-ef107a9e4c55", "Id": "3a3c2332-a7af-5af0-abc7-abcb5c7deb0a",
"CultureName": "tr", "CultureName": "tr",
"ResourceName": "Platform", "ResourceName": "Platform",
"Key": "App.Definitions.SkillType", "Key": "App.Hr.SkillType",
"Value": "Yetenek Tipleri" "Value": "Yetenek Tipleri"
}, },
{ {
"Id": "efe7788c-f908-5833-b29e-e7a7014e9c9c", "Id": "0696290d-9fa8-511d-9855-1d44845a8a31",
"CultureName": "en", "CultureName": "en",
"ResourceName": "Platform", "ResourceName": "Platform",
"Key": "App.Definitions.SkillLevel", "Key": "App.Hr.SkillLevel",
"Value": "Skill Levels" "Value": "Skill Levels"
}, },
{ {
"Id": "6b3c9bb6-1fd2-5221-b82a-e48f692d2c1a", "Id": "adce2569-5d54-5ae1-a0ee-20c763c767b6",
"CultureName": "tr", "CultureName": "tr",
"ResourceName": "Platform", "ResourceName": "Platform",
"Key": "App.Definitions.SkillLevel", "Key": "App.Hr.SkillLevel",
"Value": "Yetenek Seviyeleri" "Value": "Yetenek Seviyeleri"
}, },
{ {
"Id": "2104c315-062f-5692-bd5c-6ffc5103d21a", "Id": "91cf56ac-8180-5d6a-8a10-61bad98b374a",
"CultureName": "en", "CultureName": "en",
"ResourceName": "Platform", "ResourceName": "Platform",
"Key": "App.Definitions.Skill", "Key": "App.Hr.Skill",
"Value": "Skill" "Value": "Skill"
}, },
{ {
"Id": "bf784899-34a4-5ab6-890d-f47201027e3c", "Id": "b85270b2-b134-5d85-8b04-2d2ac76b9bc1",
"CultureName": "tr", "CultureName": "tr",
"ResourceName": "Platform", "ResourceName": "Platform",
"Key": "App.Definitions.Skill", "Key": "App.Hr.Skill",
"Value": "Yetenek" "Value": "Yetenek"
}, },
{ {
@ -24096,7 +24096,7 @@
"CultureName": "tr", "CultureName": "tr",
"ResourceName": "Platform", "ResourceName": "Platform",
"Key": "App.Hr.JobPosition", "Key": "App.Hr.JobPosition",
"Value": "İş Pozisyonları" "Value": "Pozisyonlar"
}, },
{ {
"Id": "69cd57e0-ba2a-5714-882d-18fa0944823b", "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." "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", "CultureName": "en",
"ResourceName": "Platform", "ResourceName": "Platform",
"Key": "App.Definitions.SkillType.Description", "Key": "App.Hr.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." "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", "CultureName": "tr",
"ResourceName": "Platform", "ResourceName": "Platform",
"Key": "App.Definitions.SkillType.Description", "Key": "App.Hr.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." "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", "CultureName": "en",
"ResourceName": "Platform", "ResourceName": "Platform",
"Key": "App.Definitions.SkillLevel.Description", "Key": "App.Hr.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." "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", "CultureName": "tr",
"ResourceName": "Platform", "ResourceName": "Platform",
"Key": "App.Definitions.SkillLevel.Description", "Key": "App.Hr.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." "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", "CultureName": "en",
"ResourceName": "Platform", "ResourceName": "Platform",
"Key": "App.Definitions.Skill.Description", "Key": "App.Hr.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." "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", "CultureName": "tr",
"ResourceName": "Platform", "ResourceName": "Platform",
"Key": "App.Definitions.Skill.Description", "Key": "App.Hr.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." "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", "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." "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", "CultureName": "en",
"ResourceName": "Platform", "ResourceName": "Platform",
"Key": "App.Definitions.Department.Description", "Key": "App.Hr.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." "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", "CultureName": "tr",
"ResourceName": "Platform", "ResourceName": "Platform",
"Key": "App.Definitions.Department.Description", "Key": "App.Hr.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şı." "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", "CultureName": "en",
"ResourceName": "Platform", "ResourceName": "Platform",
"Key": "App.Definitions.JobPosition.Description", "Key": "App.Hr.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." "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", "CultureName": "tr",
"ResourceName": "Platform", "ResourceName": "Platform",
"Key": "App.Definitions.JobPosition.Description", "Key": "App.Hr.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şı." "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", "Id": "ae2c9dc2-9aca-54b2-bca2-d4aeddca73f2",

View file

@ -192,39 +192,17 @@
"IsDisabled": false, "IsDisabled": false,
"ModuleId": "Sas" "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", "ParentCode": "App.Saas.Definitions",
"Code": "App.Definitions.UomCategory", "Code": "App.Definitions.UomCategory",
"DisplayName": "App.Definitions.UomCategory", "DisplayName": "App.Definitions.UomCategory",
"Order": 10, "Order": 9,
"Url": "/admin/list/App.Definitions.UomCategory", "Url": "/admin/list/App.Definitions.UomCategory",
"Icon": "FcWorkflow", "Icon": "FcWorkflow",
"RequiredPermissionName": "App.Definitions.UomCategory", "RequiredPermissionName": "App.Definitions.UomCategory",
"IsDisabled": false, "IsDisabled": false,
"ModuleId": "Sas" "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", "ParentCode": "App.Saas",
"Code": "App.Public", "Code": "App.Public",
@ -678,34 +656,12 @@
}, },
{ {
"ParentCode": "App.Administration.Definitions", "ParentCode": "App.Administration.Definitions",
"Code": "App.Definitions.Department", "Code": "App.Definitions.Sequence",
"DisplayName": "App.Definitions.Department", "DisplayName": "App.Definitions.Sequence",
"Order": 2, "Order": 2,
"Url": "/admin/list/App.Definitions.Department", "Url": "/admin/list/App.Definitions.Sequence",
"Icon": "FcDepartment", "Icon": "FcNumericalSorting12",
"RequiredPermissionName": "App.Definitions.Department", "RequiredPermissionName": "App.Definitions.Sequence",
"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",
"IsDisabled": false, "IsDisabled": false,
"ModuleId": "Adm" "ModuleId": "Adm"
}, },
@ -1082,6 +1038,72 @@
"RequiredPermissionName": "App.ForumManagement.Publish", "RequiredPermissionName": "App.ForumManagement.Publish",
"IsDisabled": false, "IsDisabled": false,
"ModuleId": "Adm" "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"
} }
] ]
} }

View file

@ -15,6 +15,10 @@
{ {
"Id": "Pub", "Id": "Pub",
"Name": "Pub" "Name": "Pub"
},
{
"Id": "Hr",
"Name": "Hr"
} }
] ]
} }

View file

@ -562,7 +562,7 @@
"ComponentType": "normal", "ComponentType": "normal",
"ComponentPath": "@/views/admin/hr/OrgChart", "ComponentPath": "@/views/admin/hr/OrgChart",
"RouteType": "protected", "RouteType": "protected",
"Authority": "App.Definitions.Department", "Authority": "App.Hr.OrgChart",
"SeoTitle": null, "SeoTitle": null,
"SeoDescription": null, "SeoDescription": null,
"SeoKeywords": null, "SeoKeywords": null,

View file

@ -876,7 +876,7 @@ const OrgChart = () => {
return ( return (
<> <>
<PageTitle title={translate('::App.Definitions.OrgChart')} /> <PageTitle title={translate('::App.Hr.OrgChart')} />
<div className="flex flex-col h-full"> <div className="flex flex-col h-full">
{/* Toolbar */} {/* Toolbar */}
@ -884,7 +884,7 @@ const OrgChart = () => {
<div className="flex items-center gap-3 min-w-0"> <div className="flex items-center gap-3 min-w-0">
{MenuIcon} {MenuIcon}
<h4 className="text-sm font-medium truncate text-gray-900 dark:text-white"> <h4 className="text-sm font-medium truncate text-gray-900 dark:text-white">
{translate('::App.Definitions.OrgChart')} {translate('::App.Hr.OrgChart')}
</h4> </h4>
</div> </div>
@ -902,7 +902,7 @@ const OrgChart = () => {
}`} }`}
onClick={() => setMode('department')} onClick={() => setMode('department')}
> >
<span className="hidden sm:inline">{translate('::App.Definitions.Department')}</span> <span className="hidden sm:inline">{translate('::App.Hr.Department')}</span>
</Button> </Button>
<Button <Button
variant="plain" variant="plain"