diff --git a/.github/instructions/lowcode.instructions.md b/.github/instructions/lowcode.instructions.md
index fcefe3ee..ebcd3f87 100644
--- a/.github/instructions/lowcode.instructions.md
+++ b/.github/instructions/lowcode.instructions.md
@@ -980,7 +980,7 @@ Tutarlılık zorunludur; menü, route, yetki ve dil anahtarı aynı kökten tür
| Dil anahtarı (alan) | `App.Listform.ListformField.{Alan}` | `App.Listform.ListformField.OrderNo` |
| Route (List) | `/admin/list/{ListFormCode}` — statik `:listFormCode` route'u karşılar, DB'ye kayıt yazılmaz | `/admin/list/App.Mrp.Orders` |
| Route (Custom) | Bileşenin `RoutePath` değeri; route doğrudan bundan üretilir | `/admin/order-board` |
-| Wizard seed dosyası | `{WizardName}.json` | `Orders.json` |
+| Wizard seed dosyası | `{WizardName}.json`; yeni wizard'ın adı `{ModuleId}_{Ad}` — modül öneki sunucuda eklenir (§4.4 Adım 2) | `Mrp_Orders.json` |
| Custom component seed | `data/App.DeveloperKit.CustomComponents/{Id}.json` — dosya adı satırın `Id`'si, bileşen adı satırın `Name` alanı | `…/8389ccbc-3e7b-….json` |
| CRUD endpoint seed | `crud/{EntityName}.json` | `Mrp_T_Order.json` |
| Liste verisi seed | `data/{ListFormCode}.json` (tek dosya) ya da `data/{ListFormCode}/{anahtar}.json` (klasör) — §9.15 | `App.Definitions.Sequence.json` |
@@ -1222,7 +1222,7 @@ saklanır. Dosya okunurken bu alanlar `ListForm`/`Fields` üzerinden geri doldur
| Alan | Anlam |
| --- | --- |
| `ComponentKind` | `0` List (varsayılan) · `1` Custom. Dosyadaki ilk alan olmalı. |
-| `WizardName` | Dosya adının (`{WizardName}.json`) ve export zip adının kaynağı. |
+| `WizardName` | Dosya adının (`{WizardName}.json`) ve export zip adının kaynağı. Bütün modüllerde tekildir; yeni wizard'da `{ModuleId}_{Ad}` biçimindedir (`ListFormWizardDto.ResolveWizardName`). |
| `SeededAt` | İlk deploy anı; seeder dosyaları bu damgaya göre sıralar. Sunucu üretir, düzenlemede korunur. |
| `ListFormCode` | Ekranın kodu; route, yetki adları ve dil anahtarları bu koddan türer. Dosyada `WizardCode` adıyla, üçüncü sırada yazılır. |
| `MenuCode` | Menü kaydının kodu; yetki adlarının kökü de budur. |
@@ -2544,7 +2544,14 @@ Custom yolunda 3–11 adımları **hiç görünmez**; menü + yetki + dil + bile
Bir görünüm bayrağı sonradan kapatılırsa aktif adım listeden düşer, sihirbaz en yakın geçerli
adıma döner.
-**Adım 2 — Menü.** `WizardName` her yolda zorunludur. `CreateMenu` anahtarı kapatılırsa menü
+**Adım 2 — Menü.** `WizardName` her yolda zorunludur. Wizard adı seed dosyasının adıdır ve bütün
+modüllerde tekil olmak zorundadır; aynı ekran adı birden çok modülde geçebilir (İK ve Satınalma
+altında `RejectionReason`). Bu yüzden yeni wizard'ın adı modül önekini taşır: `{ModuleId}_{Ad}`
+(`Hr_RejectionReason`, `Prc_RejectionReason`, `Inventory_Warehouse`). Önek `MenuParentModuleId`'den
+gelir ve deploy'da eklenir (`ListFormWizardDto.ResolveWizardName`); ad zaten önekle başlıyorsa
+tekrar eklenmez, önceden üretilmiş öneksiz wizard'ın düzenlemesinde adı korunur. Ekran, menü ve
+yetki kodları (`ListFormCode`, `MenuCode`) önekten etkilenmez. Üretim planında ve `replaceFileName`'de
+dosya adı önekli yazılır (`deploy_wizard: Prc_RejectionReason.json`). `CreateMenu` anahtarı kapatılırsa menü
alanlarının tamamı gizlenir ve menü/üst menü kaydı üretilmez (alt form ekranı kalıbı, §4.6).
Açıkken zorunlular: üst menü (ağaçtan seçilir ya da yeni kök tanımlanır), `MenuCode`, EN+TR menü
etiketi, izin grubu (listeden seçilir ya da yeni ad; görünen adları EN+TR yazılır), `MenuIcon`
diff --git a/README.md b/README.md
index ccf7360b..34986aff 100644
--- a/README.md
+++ b/README.md
@@ -1565,7 +1565,7 @@ liste süzgeci ve çağrı kapısı aynı kuralı kullanır.
| `save_sql_object` | View/procedure/function scriptini `sql/object/{Ad}.sql` ve `postgres/object/{Ad}.sql` dosyalarına yazar (`McpSqlObjectWriter`); veritabanında çalıştırılmaz, nesneyi DB Migrate kurar. Gövde diyalektler arasında güvenle çevrilemediği için iki script de istemciden gelir ve aynı nesneyi tanımlamalıdır (`SqlObjectInvalid`); ad scriptten okunur, başlık `CREATE OR ALTER` / `CREATE OR REPLACE`'e çevrilir. Tablo scriptinin üstüne yazmaz. `.Write` + `App.SqlQueryManager` ister. |
| `generate_crud_endpoints` | SQL Query Manager CRUD diyaloğuyla aynı endpoint kümesini (`CrudEndpointSeedFileDto.Generate` — diyaloğun servisi de bunu kullanır) yalnızca `crud/{Entity}.json` dosyasına yazar; kayıtları DB Migrate ekler (`CrudEndpointSeedApplier`). `.Write` + `App.SqlQueryManager.CrudEndpoints` ister. |
| `list_wizards` / `get_wizard` | Wizard File Manager dosyaları; `get_wizard` seed dosyasını diskteki biçimiyle döndürür. |
-| `deploy_wizard` | Wizard'ı Wizard ekranıyla aynı yoldan (`IListFormWizardAppService.Create`) deploy eder. Girdi seed dosyası biçimi (`{"Wizard": …, "ListForm": …, "Fields": […]}`) ya da düz cevaplardır; ikisi de `WizardSeedFileDto.FromDeployJson`'dan geçer: Wizard bölümünde yazılan cevap korunur, yazılmayan ekran alanı `ListForm`/`Fields`'tan tamamlanır, iki bölüm de ekrana katman olarak uygulanır (`WizardScreenOverlay`, üç yönlü: bölümdeki değer wizard'ın kendi ürettiğiyle aynıysa cevap kazanır, farklıysa editör ayarıdır ve korunur; kimlik alanları wizard'dan gelir, tanınmayan/hesaplanan anahtar reddedilir). Böylece MCP, ListForm editörünün yapabildiği her ayarı wizard dosyasına yazar ve `replaceFileName` ile güncelleme editör ayarlarını silmez. Yeni kaydın form varsayılanı kolonun tablodaki sabit `DEFAULT`'udur (katalog ya da seed scripti, `SqlSeedColumn.ConstantValue`; IsActive → true, UomId → Adet, para birimi → TRY tablonun `DEFAULT`'larından gelir); alana özel değer öğenin `DefaultValue`'su ile verilir (`lowcode.instructions.md` §4.3.5.1). Girdide sözleşmede olmayan anahtar adıyla reddedilir, sessizce yok sayılmaz. `StaticData` lookup seçeneklerinin düz metni `App.StaticLookup.*` dil anahtarına çevrilir ve EN + TR satırı yazılır (`LocalizeStaticLookupsAsync`, `lowcode.instructions.md` §4.3.4.1). Dosyaya kullanıcının etkin talebi `DevRequest` olarak yazılır (sunucu doldurur). Wizard ekranı gibi yalnızca seed dosyalarını yazar; ekran DB Migrate ile kurulur ve çıkıştaki `isPending` o zamana kadar `true` kalır (model migrate'i beklemez; `verify_wizard` bekleyen dosyada `install` kontrolünde durur). `replaceFileName` doluysa güncellemedir (dosyalar yeniden yazılır, önceki kayıtları migrate kaldırır). İstek demo veri taşıyorsa (prompt'taki satırlar, ekran görüntüsü) wizard `SeedData: true` ile deploy edilir — ekranın `SeedFilePath`'i `data/{ListFormCode}.json` olur (`SeedSync*` bayrakları demo veriyle açılmaz; yalnızca istekte açıkça istenirse wizard'ın `SeedSync: true` cevabıyla) — satırlar aynı çağrıda `seedRows` ile bu dosyaya yazılır (alan adları doğrulanır, `Guid` anahtarı sunucu üretir); migrate ekranı kurduktan sonra satırları ekler (`lowcode.instructions.md` §0.10.1). Widget sorgularındaki her dil anahtarı tanımlı olmalı ya da wizard'ın `Language.Texts` alanında EN + TR verilmeli, yoksa deploy adlarıyla reddeder (`ValidateWidgetLanguageKeysAsync`). `uploadUrl`'süz `dxImageUpload` alanı base64 sakladığı için kolonu sınırlı boyluysa (katalogdaki karakter sınırı) deploy reddedilir; tablo kolonuna bağlı `dxImageViewer` alanı da reddedilir — görsel kolonunun editörü her zaman `dxImageUpload`'dır (`ValidateImageColumnLengths`). `MenuOrder` yok sayılır: yeni ekran kardeşlerinin sonuna, güncelleme mevcut yerine yazılır — lookup kaynağı ekran önce deploy edildiği için onu kullanan ekranın üstünde kalır. |
+| `deploy_wizard` | Wizard'ı Wizard ekranıyla aynı yoldan (`IListFormWizardAppService.Create`) deploy eder. Girdi seed dosyası biçimi (`{"Wizard": …, "ListForm": …, "Fields": […]}`) ya da düz cevaplardır; ikisi de `WizardSeedFileDto.FromDeployJson`'dan geçer: Wizard bölümünde yazılan cevap korunur, yazılmayan ekran alanı `ListForm`/`Fields`'tan tamamlanır, iki bölüm de ekrana katman olarak uygulanır (`WizardScreenOverlay`, üç yönlü: bölümdeki değer wizard'ın kendi ürettiğiyle aynıysa cevap kazanır, farklıysa editör ayarıdır ve korunur; kimlik alanları wizard'dan gelir, tanınmayan/hesaplanan anahtar reddedilir). Böylece MCP, ListForm editörünün yapabildiği her ayarı wizard dosyasına yazar ve `replaceFileName` ile güncelleme editör ayarlarını silmez. Yeni kaydın form varsayılanı kolonun tablodaki sabit `DEFAULT`'udur (katalog ya da seed scripti, `SqlSeedColumn.ConstantValue`; IsActive → true, UomId → Adet, para birimi → TRY tablonun `DEFAULT`'larından gelir); alana özel değer öğenin `DefaultValue`'su ile verilir (`lowcode.instructions.md` §4.3.5.1). Girdide sözleşmede olmayan anahtar adıyla reddedilir, sessizce yok sayılmaz. `StaticData` lookup seçeneklerinin düz metni `App.StaticLookup.*` dil anahtarına çevrilir ve EN + TR satırı yazılır (`LocalizeStaticLookupsAsync`, `lowcode.instructions.md` §4.3.4.1). Dosyaya kullanıcının etkin talebi `DevRequest` olarak yazılır (sunucu doldurur). Wizard ekranı gibi yalnızca seed dosyalarını yazar; ekran DB Migrate ile kurulur ve çıkıştaki `isPending` o zamana kadar `true` kalır (model migrate'i beklemez; `verify_wizard` bekleyen dosyada `install` kontrolünde durur). `replaceFileName` doluysa güncellemedir (dosyalar yeniden yazılır, önceki kayıtları migrate kaldırır). İstek demo veri taşıyorsa (prompt'taki satırlar, ekran görüntüsü) wizard `SeedData: true` ile deploy edilir — ekranın `SeedFilePath`'i `data/{ListFormCode}.json` olur (`SeedSync*` bayrakları demo veriyle açılmaz; yalnızca istekte açıkça istenirse wizard'ın `SeedSync: true` cevabıyla) — satırlar aynı çağrıda `seedRows` ile bu dosyaya yazılır (alan adları doğrulanır, `Guid` anahtarı sunucu üretir); migrate ekranı kurduktan sonra satırları ekler (`lowcode.instructions.md` §0.10.1). Widget sorgularındaki her dil anahtarı tanımlı olmalı ya da wizard'ın `Language.Texts` alanında EN + TR verilmeli, yoksa deploy adlarıyla reddeder (`ValidateWidgetLanguageKeysAsync`). `uploadUrl`'süz `dxImageUpload` alanı base64 sakladığı için kolonu sınırlı boyluysa (katalogdaki karakter sınırı) deploy reddedilir; tablo kolonuna bağlı `dxImageViewer` alanı da reddedilir — görsel kolonunun editörü her zaman `dxImageUpload`'dır (`ValidateImageColumnLengths`). Yeni wizard'ın adına (= dosya adı) modül öneki eklenir: `{ModuleId}_{Ad}` (`ListFormWizardDto.ResolveWizardName`; aynı ekran adı başka modülde de geçebilir), çıkıştaki `fileName` gerçek adı verir. `MenuOrder` yok sayılır: yeni ekran kardeşlerinin sonuna, güncelleme mevcut yerine yazılır — lookup kaynağı ekran önce deploy edildiği için onu kullanan ekranın üstünde kalır. |
| `delete_wizard` | Wizard Manager'daki silmeyle aynı: `InsertedRecords` + ekranın veri aynası, bağımlı wizard varsa reddedilir. `dropTables: true` ekranın tablosunu (yalnızca tasarımcı/`create_table` ile kurulmuş ve başka yerde kullanılmayan) CRUD endpoint'leri, `sql/object` ve `crud` dosyalarıyla düşürür; model bunu kullanıcı onayı olmadan göndermez (`WizardTableCleaner`, `lowcode.instructions.md` §4.5). |
| `verify_wizard` | Deploy edilmiş ekranı veri yazmadan doğrular: menü kaydı ve URL'si, menünün istediği yetki tanımı (`AbpPermissions`), List yolunda ekran sorgusu (`GetSelectAsync`, tek satır, çağıranın yetkisiyle), Custom yolunda bileşen (etkin, rota = menü URL'si) ve seed kapanışı (`ExportAnalysis` uyarıları; engellemez). İsteğe bağlıdır, migrate sonrasında kullanılır; `App.DevRequests` döngüsünün adımı değildir — döngü `Testing`'de biter, kullanıcı elle test edip `Staging`'e alır (`lowcode.instructions.md` §0.11). |
| `start_dev_request` | Geliştirme talebini Id ya da tam başlıkla üstlenir: yalnızca `Ready to Start` durumundakini `In Progress` durumuna alır, diğerlerini reddeder; talebin metnini döndürür. Açıklamaya yapıştırılmış base64 görseller (`data:image/png|jpeg|gif|webp`) metinden ayıklanır (`McpDevRequestImages`), yerlerinde `[image-N]` kalır ve her biri ayrı MCP resim içeriği (`ImageContentBlock`) olarak döner — model görseli resim olarak görür, görsel hiçbir yere yüklenmez. Sonuç istemcinin 1 MB sınırına sığdırılır: büyük görseller küçültülüp JPEG'e çevrilir (`IMcpImageShrinker`), sığmayan gönderilmez ve metinde bildirilir. `.Write` + `App.DevRequests.Update` ister. |
diff --git a/api/modules/Sozsoft.Mcp/Sozsoft.Mcp.Application/McpDevelopAppService.cs b/api/modules/Sozsoft.Mcp/Sozsoft.Mcp.Application/McpDevelopAppService.cs
index bfad2feb..4afa30f0 100644
--- a/api/modules/Sozsoft.Mcp/Sozsoft.Mcp.Application/McpDevelopAppService.cs
+++ b/api/modules/Sozsoft.Mcp/Sozsoft.Mcp.Application/McpDevelopAppService.cs
@@ -950,9 +950,10 @@ public class McpDevelopAppService(
return (string.IsNullOrWhiteSpace(json) ? null : WizardSeedFileDto.FromDeployJson(json))
?? throw new UserFriendlyException(L[McpErrorCodes.InvalidWizard]);
}
- catch (JsonException)
+ catch (JsonException ex)
{
- throw new UserFriendlyException(L[McpErrorCodes.InvalidWizard]);
+ // Genel mesajla model hangi degerin bozuk oldugunu bilemez ve ayni JSON'u tekrar gonderir.
+ throw new UserFriendlyException(L[McpErrorCodes.InvalidWizardValue, ex.Path ?? "$", ex.Message]);
}
}
diff --git a/api/modules/Sozsoft.Mcp/Sozsoft.Mcp.Domain.Shared/McpErrorCodes.cs b/api/modules/Sozsoft.Mcp/Sozsoft.Mcp.Domain.Shared/McpErrorCodes.cs
index f41cc062..fc610604 100644
--- a/api/modules/Sozsoft.Mcp/Sozsoft.Mcp.Domain.Shared/McpErrorCodes.cs
+++ b/api/modules/Sozsoft.Mcp/Sozsoft.Mcp.Domain.Shared/McpErrorCodes.cs
@@ -33,6 +33,7 @@ public static class McpErrorCodes
public const string DevGuideSectionNotFound = Prefix + "DevGuideSectionNotFound";
public const string DevGuideSearchMatches = Prefix + "DevGuideSearchMatches";
public const string InvalidWizard = Prefix + "InvalidWizard";
+ public const string InvalidWizardValue = Prefix + "InvalidWizardValue";
public const string SeedRowsInvalid = Prefix + "SeedRowsInvalid";
public const string SeedRowsNotAllowed = Prefix + "SeedRowsNotAllowed";
public const string SeedRowsUnknownFields = Prefix + "SeedRowsUnknownFields";
diff --git a/api/src/Sozsoft.Platform.Application.Contracts/ListForms/Wizard/ListFormWizardDto.cs b/api/src/Sozsoft.Platform.Application.Contracts/ListForms/Wizard/ListFormWizardDto.cs
index 73bc42ab..aa5be7b7 100644
--- a/api/src/Sozsoft.Platform.Application.Contracts/ListForms/Wizard/ListFormWizardDto.cs
+++ b/api/src/Sozsoft.Platform.Application.Contracts/ListForms/Wizard/ListFormWizardDto.cs
@@ -218,6 +218,26 @@ public class ListFormWizardDto
return chain;
}
+ ///
+ /// Wizard adi seed dosyasinin adidir ve bütün modüllerde tekil olmak zorundadir; ayni ekran adi
+ /// birden cok modülde gecebildigi icin (Hr ve Prc altinda RejectionReason) yeni ad modül onekini
+ /// tasir: {ModuleId}_{Ad}. Duzenlenen wizard'in onekli olmayan eski adi korunur.
+ ///
+ public string ResolveWizardName(string? previousName)
+ {
+ var name = WizardName?.Trim() ?? string.Empty;
+ var moduleId = MenuParentModuleId?.Trim();
+
+ if (string.Equals(name, previousName, StringComparison.OrdinalIgnoreCase) ||
+ string.IsNullOrWhiteSpace(name) || string.IsNullOrWhiteSpace(moduleId) ||
+ name.StartsWith(moduleId + "_", StringComparison.OrdinalIgnoreCase))
+ {
+ return name;
+ }
+
+ return $"{moduleId}_{name}";
+ }
+
/// Wizard'in ListForm kodu; bos gelirse menu kodu ile aynidir.
public string ResolveListFormCode()
{
diff --git a/api/src/Sozsoft.Platform.Application/ListForms/ListFormWizardAppService.cs b/api/src/Sozsoft.Platform.Application/ListForms/ListFormWizardAppService.cs
index bc4a68ff..06cf1a6f 100644
--- a/api/src/Sozsoft.Platform.Application/ListForms/ListFormWizardAppService.cs
+++ b/api/src/Sozsoft.Platform.Application/ListForms/ListFormWizardAppService.cs
@@ -128,6 +128,9 @@ public class ListFormWizardAppService(
input.ListFormCode = listFormCode;
input.MenuCode = code;
+ // Kodlar onekten once cozulur; onek yalnizca dosya adini tekillestirir.
+ input.WizardName = wizardName = input.ResolveWizardName(previous?.Wizard?.WizardName);
+
// Ilk deploy zamani wizard'in kimligidir; duzenleme onu degistirmez.
if (previous?.Wizard != null)
input.SeededAt = previous.Wizard.SeededAt;
diff --git a/claude.md b/claude.md
index befe8a25..a3b8b6df 100644
--- a/claude.md
+++ b/claude.md
@@ -239,6 +239,12 @@ Bir çelişki varsa sıra: `ai.instructions.md` → `dotnet.instructions.md` →
script hatası kullanıcıya bildirilir. Ayrıntı: `lowcode.instructions.md` §4.4, §5.3, §5.6.
21. **Demo veri ≠ seed senkronu** → `SeedData: true` yalnızca `SeedFilePath` açar;
`SeedSyncInsert/Update/Delete` istekte açıkça istenmedikçe `false`'tur (wizard cevabı `SeedSync`).
+22. **Wizard adı modül önekli** → yeni wizard'ın adı (= seed dosyasının adı) `{ModuleId}_{Ad}`'dır
+ (`Prc_RejectionReason.json`, `Hr_RejectionReason.json`); aynı ekran adı başka modülde de geçebildiği
+ için öneksiz ad dosya çakışması (`'X' adında bir Wizard zaten var`) üretir. Önek deploy'da
+ `MenuParentModuleId`'den eklenir (`ListFormWizardDto.ResolveWizardName`); analiz ve üretim planında
+ dosya adı önekli yazılır. Var olan öneksiz wizard düzenlenirken adı değişmez. Ayrıntı:
+ `lowcode.instructions.md` §4.4 Adım 2.
### Cross-cutting: touching one thing means touching these too
diff --git a/configs/seeds/data/Abp.Identity.Permissions.json b/configs/seeds/data/Abp.Identity.Permissions.json
index 7bd853d3..9be46d84 100644
--- a/configs/seeds/data/Abp.Identity.Permissions.json
+++ b/configs/seeds/data/Abp.Identity.Permissions.json
@@ -16323,6 +16323,76 @@
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
+ },
+ {
+ "GroupName": "App.Administration",
+ "Name": "App.Definitions.Approver",
+ "ParentName": "App.Administration.Definitions",
+ "DisplayName": "App.Definitions.Approver",
+ "Order": 6,
+ "IsEnabled": true,
+ "MultiTenancySide": 3,
+ "Modules": "Adm"
+ },
+ {
+ "GroupName": "App.Administration",
+ "Name": "App.Definitions.Approver.Create",
+ "ParentName": "App.Definitions.Approver",
+ "DisplayName": "App.Platform.Create",
+ "Order": 1,
+ "IsEnabled": true,
+ "MultiTenancySide": 3,
+ "Modules": "Adm"
+ },
+ {
+ "GroupName": "App.Administration",
+ "Name": "App.Definitions.Approver.Update",
+ "ParentName": "App.Definitions.Approver",
+ "DisplayName": "App.Platform.Update",
+ "Order": 2,
+ "IsEnabled": true,
+ "MultiTenancySide": 3,
+ "Modules": "Adm"
+ },
+ {
+ "GroupName": "App.Administration",
+ "Name": "App.Definitions.Approver.Delete",
+ "ParentName": "App.Definitions.Approver",
+ "DisplayName": "App.Platform.Delete",
+ "Order": 3,
+ "IsEnabled": true,
+ "MultiTenancySide": 3,
+ "Modules": "Adm"
+ },
+ {
+ "GroupName": "App.Administration",
+ "Name": "App.Definitions.Approver.Export",
+ "ParentName": "App.Definitions.Approver",
+ "DisplayName": "App.Platform.Export",
+ "Order": 4,
+ "IsEnabled": true,
+ "MultiTenancySide": 3,
+ "Modules": "Adm"
+ },
+ {
+ "GroupName": "App.Administration",
+ "Name": "App.Definitions.Approver.Import",
+ "ParentName": "App.Definitions.Approver",
+ "DisplayName": "App.Platform.Import",
+ "Order": 5,
+ "IsEnabled": true,
+ "MultiTenancySide": 3,
+ "Modules": "Adm"
+ },
+ {
+ "GroupName": "App.Administration",
+ "Name": "App.Definitions.Approver.Note",
+ "ParentName": "App.Definitions.Approver",
+ "DisplayName": "App.Platform.Note",
+ "Order": 6,
+ "IsEnabled": true,
+ "MultiTenancySide": 3,
+ "Modules": "Adm"
}
]
}
diff --git a/configs/seeds/data/App.DevRequests/3963027c-f443-4f39-878f-7da7a2cdb293.json b/configs/seeds/data/App.DevRequests/3963027c-f443-4f39-878f-7da7a2cdb293.json
index a82a8c04..0a0cb1dd 100644
--- a/configs/seeds/data/App.DevRequests/3963027c-f443-4f39-878f-7da7a2cdb293.json
+++ b/configs/seeds/data/App.DevRequests/3963027c-f443-4f39-878f-7da7a2cdb293.json
@@ -9,18 +9,18 @@
"TenantId": null,
"UserName": "system@sozsoft.com",
"RequestDate": null,
- "Status": "Testing",
+ "Status": "Staging",
"Title": "Envanter -> Tanımlamalar",
"Description": "
Depolar: Fiziki olarak konumlandırılan yerlerin listesidir. Bizim programımızda Firma sütunu yok yerine Şube adı olmalı. Depo Listesi, Depo Adı, Depo Kodu ve Şube Adı sütunlarından oluşması yeterlidir. Envanter -> Tanımlamalar menüsüne eklenmelidir.

Operasyon Türleri : Şube ve Depo bazında tanımlanan Operasyon Türleri listesidir. Operasyon Türü : Alım, Teslimat, İç Transfer, Üretim ve Onarım dan oluşmaktadır. Envanter -> Tanımlamalar menüsüne eklenmelidir.


Konumlar: Şube ve Depo bazında iç içe tanımlanan Konum listesidir. Burada Parent ve Child ilşkisi olması gerekiyor. Üst konum seçimi yapılabilir. Konum Türü olarak İç ve Dış olabilir.

",
"DueDate": "2026-10-09T07:55:00",
"Tags": "IN",
"Assignees": "system@sozsoft.com",
"Priority": "5",
- "Completed": false,
- "SortOrder": 1,
- "Timesheets": "[{\"id\":\"21d484fa-7918-9e2a-5e4b-3a2431f39c0e\",\"date\":\"2026-10-09\",\"userName\":\"system@sozsoft.com\",\"description\":\"Talep analiz edildi\",\"duration\":0.0167},{\"id\":\"0d7b9a3f-2507-3b4e-ad32-3a2431f4809f\",\"date\":\"2026-10-09\",\"userName\":\"system@sozsoft.com\",\"description\":\"Inv_T_Warehouse tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"af21243c-613b-3364-7a72-3a2431f499bf\",\"date\":\"2026-10-09\",\"userName\":\"system@sozsoft.com\",\"description\":\"Inv_T_Location tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"71e1f343-0b20-c17d-1fdc-3a2431f4b25f\",\"date\":\"2026-10-09\",\"userName\":\"system@sozsoft.com\",\"description\":\"Inv_T_OperationType tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"bcb05f22-6702-d88b-b645-3a2431f556fb\",\"date\":\"2026-10-09\",\"userName\":\"system@sozsoft.com\",\"description\":\"Warehouse.json wizard\\u0027\\u0131 deploy edildi (4 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"f8d0da75-852c-9895-be60-3a2431f5d4f3\",\"date\":\"2026-10-09\",\"userName\":\"system@sozsoft.com\",\"description\":\"Location.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"c314dcfa-c792-da59-7389-3a2431f652d0\",\"date\":\"2026-10-09\",\"userName\":\"system@sozsoft.com\",\"description\":\"OperationType.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"6b79e845-fd2f-400c-6817-3a2431f71191\",\"date\":\"2026-10-09\",\"userName\":\"system@sozsoft.com\",\"description\":\"App.Inventory mod\\u00FCl dok\\u00FCman\\u0131 kaydedildi\",\"duration\":0.0167},{\"id\":\"e5cc84d4-bd1c-504d-77c3-3a2431f71e59\",\"date\":\"2026-10-09\",\"userName\":\"system@sozsoft.com\",\"description\":\"6 tamamlanm\\u0131\\u015F alt g\\u00F6rev eklendi\",\"duration\":0.0167},{\"id\":\"fdc3fdf7-d439-82e5-9c36-3a2431f73edb\",\"date\":\"2026-10-09\",\"userName\":\"system@sozsoft.com\",\"description\":\"Analize \\u00FCretim notu eklendi\",\"duration\":0.0167}]",
+ "Completed": true,
+ "SortOrder": 9,
+ "Timesheets": "[{\"id\":\"21d484fa-7918-9e2a-5e4b-3a2431f39c0e\",\"date\":\"2026-10-09\",\"userName\":\"system@sozsoft.com\",\"description\":\"Talep analiz edildi\",\"duration\":0.0167},{\"id\":\"0d7b9a3f-2507-3b4e-ad32-3a2431f4809f\",\"date\":\"2026-10-09\",\"userName\":\"system@sozsoft.com\",\"description\":\"Inv_T_Warehouse tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"af21243c-613b-3364-7a72-3a2431f499bf\",\"date\":\"2026-10-09\",\"userName\":\"system@sozsoft.com\",\"description\":\"Inv_T_Location tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"71e1f343-0b20-c17d-1fdc-3a2431f4b25f\",\"date\":\"2026-10-09\",\"userName\":\"system@sozsoft.com\",\"description\":\"Inv_T_OperationType tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"bcb05f22-6702-d88b-b645-3a2431f556fb\",\"date\":\"2026-10-09\",\"userName\":\"system@sozsoft.com\",\"description\":\"Warehouse.json wizard\\u0027\\u0131 deploy edildi (4 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"f8d0da75-852c-9895-be60-3a2431f5d4f3\",\"date\":\"2026-10-09\",\"userName\":\"system@sozsoft.com\",\"description\":\"Location.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"c314dcfa-c792-da59-7389-3a2431f652d0\",\"date\":\"2026-10-09\",\"userName\":\"system@sozsoft.com\",\"description\":\"OperationType.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"6b79e845-fd2f-400c-6817-3a2431f71191\",\"date\":\"2026-10-09\",\"userName\":\"system@sozsoft.com\",\"description\":\"App.Inventory mod\\u00FCl dok\\u00FCman\\u0131 kaydedildi\",\"duration\":0.0167},{\"id\":\"e5cc84d4-bd1c-504d-77c3-3a2431f71e59\",\"date\":\"2026-10-09\",\"userName\":\"system@sozsoft.com\",\"description\":\"6 tamamlanm\\u0131\\u015F alt g\\u00F6rev eklendi\",\"duration\":0.0167},{\"id\":\"fdc3fdf7-d439-82e5-9c36-3a2431f73edb\",\"date\":\"2026-10-09\",\"userName\":\"system@sozsoft.com\",\"description\":\"Analize \\u00FCretim notu eklendi\",\"duration\":0.0167},{\"id\":\"9de7ea26-0a90-5ed2-ef1e-3a2431f74db4\",\"date\":\"2026-10-09\",\"userName\":\"system@sozsoft.com\",\"description\":\"App.DevRequests ekran\\u0131nda sat\\u0131r g\\u00FCncellendi (Status)\",\"duration\":0.0167}]",
"SubTasks": "[{\"id\":\"1bb63964-5b70-dfde-6e1f-3a2431f71db7\",\"title\":\"create_table: Inv_T_Warehouse\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-10-09\",\"completed\":true},{\"id\":\"7b211f72-0611-1687-303f-3a2431f71db7\",\"title\":\"create_table: Inv_T_Location\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-10-09\",\"completed\":true},{\"id\":\"debb0c13-95e5-e433-42cf-3a2431f71db7\",\"title\":\"create_table: Inv_T_OperationType\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-10-09\",\"completed\":true},{\"id\":\"6ff1cd7e-fc76-d447-2a1a-3a2431f71db7\",\"title\":\"deploy_wizard: Warehouse.json\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-10-09\",\"completed\":true},{\"id\":\"2b2dc332-15ba-6f20-0a2a-3a2431f71db7\",\"title\":\"deploy_wizard: Location.json\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-10-09\",\"completed\":true},{\"id\":\"45a7f309-a4b9-1cdd-f50b-3a2431f71db7\",\"title\":\"deploy_wizard: OperationType.json\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-10-09\",\"completed\":true}]",
- "Analysis": "Amaç
\nEnvanter modülünün temel stok yapısını kurmak: şubeye bağlı depolar, depolarda iç içe konumlar ve şube/depo bazında operasyon türleri. Stok sorumluları ve envanter yöneticileri kullanır; ileride stok hareketleri (alım, teslimat, transfer) bu tanımlara dayanır.
\n\nGörsel analizi
\n\n- [image-1] Depolar — liste. Kolonlar: Depo, Stok Konumu, Adres, Firma. Satırlar: KADİFETEKS MENSUCAT SANAYİ A.Ş. (WH), Grup Şirketler (GRP), İkitelli Fabrika (IKT), Kuzuluk Fabrika (KZL). Talep gereği yalnızca Depo Adı, Depo Kodu, Şube Adı alınır; Firma → Şube, Adres ve Stok Konumu alınmaz. Demo veri adayı (kod: WH, GRP, IKT, KZL).
\n- [image-2] Operasyon Türleri — liste. Kolonlar: Operasyon Türü, Depo, Firma (→ Şube). Satırlar: Alımlar, İç Transferler, Teslimatlar, Manufacturing, Repairs… (depo başına tekrar eden set).
\n- [image-3] Operasyon Türü formu — Genel sekmesi: Operasyon Türü (SelectBox: Alım, Teslimat, İç Transfer, Üretim, Onarım), Sıra Öneki, Depo, Barkod, Kaynak Konum. Donanım / Barkod Uygulaması sekmeleri, lot/seri, paket, iade türü, analitik maliyet, kart rengi kapsam dışı.
\n- [image-4] Konumlar — hiyerarşik liste (GRP/Stock/ALDORA MOBİLYA G/Ç/ANA DEPO AB07). Kolonlar: Konum, Depo Kodu, Departman, Depo Sorumlusu, Malzeme Türü, Konum Türü (İç), Depolama Kategorisi, Firma. Filtre: Konum Türü = İç.
\n
\n\nÇözüm yolu
\nÜç ayrı Wizard List ekranı (tablo kaynaklı, popup düzenleme). Hiyerarşi Konumlar'da ParentId + Tree görünümü ile, şube→depo→konum süzmesi lookup cascade ile karşılanır; custom component gerekmez.
\n\nMenü yeri
\nEnvanter › Tanımlamalar › Depolar / Konumlar / Operasyon Türleri
\n\n| Seviye | Kod | Ad (TR / EN) | İkon | Durum |
\n| Kök | App.Inventory | Envanter / Inventory | FcPackage | Var |
\n| Ara | App.Inventory.Definitions | Tanımlamalar / Definitions | FcSettings | Var |
\n| Ekran | App.Inventory.Warehouse | Depolar / Warehouses | FcHome | Yeni |
\n| Ekran | App.Inventory.Location | Konumlar / Locations | FcTreeStructure | Yeni |
\n| Ekran | App.Inventory.OperationType | Operasyon Türleri / Operation Types | FcProcess | Yeni |
\n
\nModuleId: Inventory · İzin grubu: App.Inventory · Route: /admin/list/{ListFormCode}
\nYetki: App.Inventory › App.Inventory.Definitions (Var) › App.Inventory.Warehouse / Location / OperationType (Yeni)
\nSıra bağımlılığa göredir: Depolar (Konum ve Operasyon Türü'nün lookup kaynağı) → Konumlar (Operasyon Türü'nün kaynak/hedef konum lookup'ı) → Operasyon Türleri.
\n\nVeri modeli
\nTümü yeni, tenant + audit + soft delete (standart), IsTenant = true, IsBranch = false (şube kolon olarak tutulur, App.Hr.Department kalıbı).
\nInv_T_Warehouse — Tanım tablosu: Evet (depo, diğer tüm envanter kayıtlarının referansı)
\n\n| Kolon | Tip | Zorunlu | Not |
\n| Id | uniqueidentifier | ✓ | PK |
\n| BranchId | uniqueidentifier | ✓ | → Sas_T_Branch (Name) |
\n| Code | nvarchar(16) | ✓ | Kiracı içinde tekil |
\n| Name | nvarchar(128) | ✓ | |
\n| IsActive | bit | ✓ | DEFAULT 1 |
\n
\nInv_T_Location — Tanım tablosu: Evet (operasyon türleri ve stok hareketleri konum seçer)
\n\n| Kolon | Tip | Zorunlu | Not |
\n| Id | uniqueidentifier | ✓ | PK |
\n| BranchId | uniqueidentifier | ✓ | → Sas_T_Branch |
\n| WarehouseId | uniqueidentifier | ✓ | → Inv_T_Warehouse, şubeye cascade |
\n| ParentId | uniqueidentifier | | → Inv_T_Location (Üst Lokasyon), depoya cascade; kökte boş |
\n| Code | nvarchar(32) | | Depo Kodu kolonu (görseldeki \"GRP ALD\") |
\n| Name | nvarchar(128) | ✓ | |
\n| LocationType | nvarchar(16) | ✓ | Internal / External (İç / Dış), DEFAULT 'Internal' |
\n| DepartmentId | uniqueidentifier | | → Hr_T_Department, şubeye cascade |
\n| ResponsibleUserId | uniqueidentifier | | → AbpUsers (Depo Sorumlusu) |
\n| IsActive | bit | ✓ | DEFAULT 1 |
\n
\nInv_T_OperationType — Tanım tablosu: Evet (stok hareket belgeleri türünü buradan seçer)
\n\n| Kolon | Tip | Zorunlu | Not |
\n| Id | uniqueidentifier | ✓ | PK |
\n| BranchId | uniqueidentifier | ✓ | → Sas_T_Branch |
\n| WarehouseId | uniqueidentifier | ✓ | → Inv_T_Warehouse, şubeye cascade |
\n| Name | nvarchar(128) | ✓ | Örn. Alımlar |
\n| OperationKind | nvarchar(32) | ✓ | Receipt / Delivery / InternalTransfer / Manufacturing / Repair (Alım / Teslimat / İç Transfer / Üretim / Onarım) |
\n| SequencePrefix | nvarchar(16) | | Sıra Öneki |
\n| Barcode | nvarchar(64) | | |
\n| SourceLocationId | uniqueidentifier | | → Inv_T_Location, depoya cascade |
\n| DestinationLocationId | uniqueidentifier | | → Inv_T_Location, depoya cascade |
\n| IsActive | bit | ✓ | DEFAULT 1 |
\n
\n\nEtkilenen kısımlar
\n\n- 3 yeni tablo, 3 yeni ListForm ekranı, Envanter › Tanımlamalar altında 3 menü.
\n- Yetkiler: her ekran için R + Create/Update/Delete/Export/Import/Note.
\n- Dil anahtarları: ekran adları/açıklamaları, yeni alan başlıkları (Depo, Depo Kodu, Şube, Üst Lokasyon, Konum Türü, Depo Sorumlusu, Operasyon Türü, Sıra Öneki, Barkod, Kaynak Konum, Hedef Konum), StaticLookup seçenekleri (Internal/External, Receipt/Delivery/InternalTransfer/Manufacturing/Repair).
\n- Var olan ekranlara etki yok (Sas_T_Branch, Hr_T_Department, AbpUsers yalnızca okunur).
\n
\n\nGörünümler ve davranış
\n\n- Grid/Card/Pivot/Chart açık. Depolar ve Operasyon Türleri varsayılan grid; Konumlar varsayılan tree (KeyExpr Id, ParentIdExpr ParentId) — görseldeki yol gösterimi ağaçla karşılanır.
\n- Widget (her üç ekran): Toplam / Aktif / Pasif sayıları (ProductCategory kalıbı).
\n- Lookup'lar: Şube → aktif şubeler; Depo → seçili şubenin aktif depoları; Üst Lokasyon / Kaynak / Hedef Konum → seçili deponun konumları (Üst Lokasyon kaydın kendisini hariç tutar); Departman → seçili şubenin departmanları. Şube değişince Depo, Konum ve Departman alanları temizlenir (CascadeEmptyFields).
\n- Liste sütun sırası — Depolar: Depo Adı, Depo Kodu, Şube Adı, Aktif. Operasyon Türleri: Operasyon Türü (ad), Tür, Depo, Şube, Aktif. Konumlar: Konum, Depo Kodu, Departman, Depo Sorumlusu, Konum Türü, Depo, Şube, Aktif.
\n- Doğrulama: Depo Code kiracı içinde tekil (InsertBefore/UpdateBefore kontrolü, hata mesajı dil anahtarlı).
\n
\n\nKararlar
\n\n- Tablo öneki
Inv_T_, ekran kodları App.Inventory.* — mevcut Envanter ekranlarıyla aynı. \n- Şube filtresi platform bayrağıyla değil kolonla (
IsBranch = false): talep Şube Adı'nı listede görünen ve seçilen alan olarak istiyor. \n- Konum ve Operasyon Türü'nde
BranchId ayrıca tutulur (talep \"şube ve depo bazında\" diyor); depo seçimini süzmek için kullanılır. \n- Konumlar'da Malzeme Türü ve Depolama Kategorisi alınmaz: talep metninde yok, kaynak tanım tabloları sistemde mevcut değil.
\n- Operasyon Türü'nde görsel [image-3]'ten yalnızca Genel sekmesinin çekirdek alanları (tür, sıra öneki, depo, barkod, kaynak/hedef konum) alınır; Donanım, Barkod Uygulaması, lot/seri, paket, iade türü, kart rengi kapsam dışı.
\n- Demo veri: Depolar için görseldeki 4 satır (WH, GRP, IKT, KZL), ilk aktif şubeye bağlı (onay); Konum ve Operasyon Türü için demo veri yazılmaz (şube/depo Id'leri kiracıya özgü).
\n- Silme: soft delete; depo ve konum referans verilmişse silmek yerine pasife alınması açıklamada belirtilir.
\n
\n\nÜretim planı
\n\n- create_table: Inv_T_Warehouse
\n- create_table: Inv_T_Location
\n- create_table: Inv_T_OperationType
\n- deploy_wizard: Warehouse.json
\n- deploy_wizard: Location.json
\n- deploy_wizard: OperationType.json
\n
\n\nÜretime hazır
\nEvet
MCP
\n\n- Tablolar: Inv_T_Warehouse (UQ TenantId+Code, FK → Sas_T_Branch), Inv_T_Location (FK → Sas_T_Branch), Inv_T_OperationType (FK → Sas_T_Branch, Inv_T_Location ×2). Tümü kiracı + tam audit.
\n- Ekranlar: App.Inventory.Warehouse (grid), App.Inventory.Location (tree, ParentId), App.Inventory.OperationType (grid); hepsi IsTenant, IsBranch=false, Toplam/Aktif/Pasif widget'ları.
\n- Menü/yetki: Envanter › Tanımlamalar altında sıra 7-9; App.Inventory › App.Inventory.Definitions › ekran + C/U/D/E/I/N.
\n- Cascade: Şube → Depo → Üst/Kaynak/Hedef Konum, Şube → Departman; üst alan değişince alt alanlar temizlenir.
\n- Dil: App.StaticLookup.Internal/External, Receipt/Delivery/InternalTransfer/Manufacturing/Repair (EN+TR).
\n- Demo veri: Depolar'a 4 satır (WH, GRP, IKT, KZL) → Branch1 şubesi.
\n- Analize eklenen varsayılanlar: Depo kodu tekilliği InsertBefore yerine unique kısıtla sağlandı. Inv_T_Location'da WarehouseId/ParentId/DepartmentId FK'si yazılmadı (migrate dosya sırası: Location, Warehouse'tan önce çalışır); bütünlük lookup'larla. Yeni operasyon türünde tür varsayılanı Alım (Receipt).
\n- DB Migrate bekleyen wizard'lar: Warehouse.json, Location.json, OperationType.json.
\n
"
+ "Analysis": "Amaç
\nEnvanter modülünün temel stok yapısını kurmak: şubeye bağlı depolar, depolarda iç içe konumlar ve şube/depo bazında operasyon türleri. Stok sorumluları ve envanter yöneticileri kullanır; ileride stok hareketleri (alım, teslimat, transfer) bu tanımlara dayanır.
\n\nGörsel analizi
\n\n- [image-1] Depolar — liste. Kolonlar: Depo, Stok Konumu, Adres, Firma. Satırlar: KADİFETEKS MENSUCAT SANAYİ A.Ş. (WH), Grup Şirketler (GRP), İkitelli Fabrika (IKT), Kuzuluk Fabrika (KZL). Talep gereği yalnızca Depo Adı, Depo Kodu, Şube Adı alınır; Firma → Şube, Adres ve Stok Konumu alınmaz. Demo veri adayı (kod: WH, GRP, IKT, KZL).
\n- [image-2] Operasyon Türleri — liste. Kolonlar: Operasyon Türü, Depo, Firma (→ Şube). Satırlar: Alımlar, İç Transferler, Teslimatlar, Manufacturing, Repairs… (depo başına tekrar eden set).
\n- [image-3] Operasyon Türü formu — Genel sekmesi: Operasyon Türü (SelectBox: Alım, Teslimat, İç Transfer, Üretim, Onarım), Sıra Öneki, Depo, Barkod, Kaynak Konum. Donanım / Barkod Uygulaması sekmeleri, lot/seri, paket, iade türü, analitik maliyet, kart rengi kapsam dışı.
\n- [image-4] Konumlar — hiyerarşik liste (GRP/Stock/ALDORA MOBİLYA G/Ç/ANA DEPO AB07). Kolonlar: Konum, Depo Kodu, Departman, Depo Sorumlusu, Malzeme Türü, Konum Türü (İç), Depolama Kategorisi, Firma. Filtre: Konum Türü = İç.
\n
\n\nÇözüm yolu
\nÜç ayrı Wizard List ekranı (tablo kaynaklı, popup düzenleme). Hiyerarşi Konumlar'da ParentId + Tree görünümü ile, şube→depo→konum süzmesi lookup cascade ile karşılanır; custom component gerekmez.
\n\nMenü yeri
\nEnvanter › Tanımlamalar › Depolar / Konumlar / Operasyon Türleri
\n\n| Seviye | Kod | Ad (TR / EN) | İkon | Durum |
\n| Kök | App.Inventory | Envanter / Inventory | FcPackage | Var |
\n| Ara | App.Inventory.Definitions | Tanımlamalar / Definitions | FcSettings | Var |
\n| Ekran | App.Inventory.Warehouse | Depolar / Warehouses | FcHome | Yeni |
\n| Ekran | App.Inventory.Location | Konumlar / Locations | FcTreeStructure | Yeni |
\n| Ekran | App.Inventory.OperationType | Operasyon Türleri / Operation Types | FcProcess | Yeni |
\n
\nModuleId: Inventory · İzin grubu: App.Inventory · Route: /admin/list/{ListFormCode}
\nYetki: App.Inventory › App.Inventory.Definitions (Var) › App.Inventory.Warehouse / Location / OperationType (Yeni)
\nSıra bağımlılığa göredir: Depolar (Konum ve Operasyon Türü'nün lookup kaynağı) → Konumlar (Operasyon Türü'nün kaynak/hedef konum lookup'ı) → Operasyon Türleri.
\n\nVeri modeli
\nTümü yeni, tenant + audit + soft delete (standart), IsTenant = true, IsBranch = false (şube kolon olarak tutulur, App.Hr.Department kalıbı).
\nInv_T_Warehouse — Tanım tablosu: Evet (depo, diğer tüm envanter kayıtlarının referansı)
\n\n| Kolon | Tip | Zorunlu | Not |
\n| Id | uniqueidentifier | ✓ | PK |
\n| BranchId | uniqueidentifier | ✓ | → Sas_T_Branch (Name) |
\n| Code | nvarchar(16) | ✓ | Kiracı içinde tekil |
\n| Name | nvarchar(128) | ✓ | |
\n| IsActive | bit | ✓ | DEFAULT 1 |
\n
\nInv_T_Location — Tanım tablosu: Evet (operasyon türleri ve stok hareketleri konum seçer)
\n\n| Kolon | Tip | Zorunlu | Not |
\n| Id | uniqueidentifier | ✓ | PK |
\n| BranchId | uniqueidentifier | ✓ | → Sas_T_Branch |
\n| WarehouseId | uniqueidentifier | ✓ | → Inv_T_Warehouse, şubeye cascade |
\n| ParentId | uniqueidentifier | | → Inv_T_Location (Üst Konum), depoya cascade; kökte boş |
\n| Code | nvarchar(32) | | Depo Kodu kolonu (görseldeki \"GRP ALD\") |
\n| Name | nvarchar(128) | ✓ | |
\n| LocationType | nvarchar(16) | ✓ | Internal / External (İç / Dış), DEFAULT 'Internal' |
\n| DepartmentId | uniqueidentifier | | → Hr_T_Department, şubeye cascade |
\n| ResponsibleUserId | uniqueidentifier | | → AbpUsers (Depo Sorumlusu) |
\n| IsActive | bit | ✓ | DEFAULT 1 |
\n
\nInv_T_OperationType — Tanım tablosu: Evet (stok hareket belgeleri türünü buradan seçer)
\n\n| Kolon | Tip | Zorunlu | Not |
\n| Id | uniqueidentifier | ✓ | PK |
\n| BranchId | uniqueidentifier | ✓ | → Sas_T_Branch |
\n| WarehouseId | uniqueidentifier | ✓ | → Inv_T_Warehouse, şubeye cascade |
\n| Name | nvarchar(128) | ✓ | Örn. Alımlar |
\n| OperationKind | nvarchar(32) | ✓ | Receipt / Delivery / InternalTransfer / Manufacturing / Repair (Alım / Teslimat / İç Transfer / Üretim / Onarım) |
\n| SequencePrefix | nvarchar(16) | | Sıra Öneki |
\n| Barcode | nvarchar(64) | | |
\n| SourceLocationId | uniqueidentifier | | → Inv_T_Location, depoya cascade |
\n| DestinationLocationId | uniqueidentifier | | → Inv_T_Location, depoya cascade |
\n| IsActive | bit | ✓ | DEFAULT 1 |
\n
\n\nEtkilenen kısımlar
\n\n- 3 yeni tablo, 3 yeni ListForm ekranı, Envanter › Tanımlamalar altında 3 menü.
\n- Yetkiler: her ekran için R + Create/Update/Delete/Export/Import/Note.
\n- Dil anahtarları: ekran adları/açıklamaları, yeni alan başlıkları (Depo, Depo Kodu, Şube, Üst Konum, Konum Türü, Depo Sorumlusu, Operasyon Türü, Sıra Öneki, Barkod, Kaynak Konum, Hedef Konum), StaticLookup seçenekleri (Internal/External, Receipt/Delivery/InternalTransfer/Manufacturing/Repair).
\n- Var olan ekranlara etki yok (Sas_T_Branch, Hr_T_Department, AbpUsers yalnızca okunur).
\n
\n\nGörünümler ve davranış
\n\n- Grid/Card/Pivot/Chart açık. Depolar ve Operasyon Türleri varsayılan grid; Konumlar varsayılan tree (KeyExpr Id, ParentIdExpr ParentId) — görseldeki yol gösterimi ağaçla karşılanır.
\n- Widget (her üç ekran): Toplam / Aktif / Pasif sayıları (ProductCategory kalıbı).
\n- Lookup'lar: Şube → aktif şubeler; Depo → seçili şubenin aktif depoları; Üst Konum / Kaynak / Hedef Konum → seçili deponun konumları (Üst Konum kaydın kendisini hariç tutar); Departman → seçili şubenin departmanları. Şube değişince Depo, Konum ve Departman alanları temizlenir (CascadeEmptyFields).
\n- Liste sütun sırası — Depolar: Depo Adı, Depo Kodu, Şube Adı, Aktif. Operasyon Türleri: Operasyon Türü (ad), Tür, Depo, Şube, Aktif. Konumlar: Konum, Depo Kodu, Departman, Depo Sorumlusu, Konum Türü, Depo, Şube, Aktif.
\n- Doğrulama: Depo Code kiracı içinde tekil (InsertBefore/UpdateBefore kontrolü, hata mesajı dil anahtarlı).
\n
\n\nKararlar
\n\n- Tablo öneki
Inv_T_, ekran kodları App.Inventory.* — mevcut Envanter ekranlarıyla aynı. \n- Şube filtresi platform bayrağıyla değil kolonla (
IsBranch = false): talep Şube Adı'nı listede görünen ve seçilen alan olarak istiyor. \n- Konum ve Operasyon Türü'nde
BranchId ayrıca tutulur (talep \"şube ve depo bazında\" diyor); depo seçimini süzmek için kullanılır. \n- Konumlar'da Malzeme Türü ve Depolama Kategorisi alınmaz: talep metninde yok, kaynak tanım tabloları sistemde mevcut değil.
\n- Operasyon Türü'nde görsel [image-3]'ten yalnızca Genel sekmesinin çekirdek alanları (tür, sıra öneki, depo, barkod, kaynak/hedef konum) alınır; Donanım, Barkod Uygulaması, lot/seri, paket, iade türü, kart rengi kapsam dışı.
\n- Demo veri: Depolar için görseldeki 4 satır (WH, GRP, IKT, KZL), ilk aktif şubeye bağlı (onay); Konum ve Operasyon Türü için demo veri yazılmaz (şube/depo Id'leri kiracıya özgü).
\n- Silme: soft delete; depo ve konum referans verilmişse silmek yerine pasife alınması açıklamada belirtilir.
\n
\n\nÜretim planı
\n\n- create_table: Inv_T_Warehouse
\n- create_table: Inv_T_Location
\n- create_table: Inv_T_OperationType
\n- deploy_wizard: Warehouse.json
\n- deploy_wizard: Location.json
\n- deploy_wizard: OperationType.json
\n
\n\nÜretime hazır
\nEvet
MCP
\n\n- Tablolar: Inv_T_Warehouse (UQ TenantId+Code, FK → Sas_T_Branch), Inv_T_Location (FK → Sas_T_Branch), Inv_T_OperationType (FK → Sas_T_Branch, Inv_T_Location ×2). Tümü kiracı + tam audit.
\n- Ekranlar: App.Inventory.Warehouse (grid), App.Inventory.Location (tree, ParentId), App.Inventory.OperationType (grid); hepsi IsTenant, IsBranch=false, Toplam/Aktif/Pasif widget'ları.
\n- Menü/yetki: Envanter › Tanımlamalar altında sıra 7-9; App.Inventory › App.Inventory.Definitions › ekran + C/U/D/E/I/N.
\n- Cascade: Şube → Depo → Üst/Kaynak/Hedef Konum, Şube → Departman; üst alan değişince alt alanlar temizlenir.
\n- Dil: App.StaticLookup.Internal/External, Receipt/Delivery/InternalTransfer/Manufacturing/Repair (EN+TR).
\n- Demo veri: Depolar'a 4 satır (WH, GRP, IKT, KZL) → Branch1 şubesi.
\n- Analize eklenen varsayılanlar: Depo kodu tekilliği InsertBefore yerine unique kısıtla sağlandı. Inv_T_Location'da WarehouseId/ParentId/DepartmentId FK'si yazılmadı (migrate dosya sırası: Location, Warehouse'tan önce çalışır); bütünlük lookup'larla. Yeni operasyon türünde tür varsayılanı Alım (Receipt).
\n- DB Migrate bekleyen wizard'lar: Warehouse.json, Location.json, OperationType.json.
\n
"
}
]
}
diff --git a/configs/seeds/data/App.DevRequests/53294e77-a4fb-45e4-a80e-acf07b5d75be.json b/configs/seeds/data/App.DevRequests/53294e77-a4fb-45e4-a80e-acf07b5d75be.json
index 1a736cca..cf4356ea 100644
--- a/configs/seeds/data/App.DevRequests/53294e77-a4fb-45e4-a80e-acf07b5d75be.json
+++ b/configs/seeds/data/App.DevRequests/53294e77-a4fb-45e4-a80e-acf07b5d75be.json
@@ -9,18 +9,18 @@
"TenantId": null,
"UserName": "system@sozsoft.com",
"RequestDate": null,
- "Status": "Backlog",
+ "Status": "Ready to Start",
"Title": "Satınalma -> Malzeme Talepleri",
- "Description": "Malzeme Talepleri : Satınalma yapılması için departmantların iç ve dış olmak üzere talep ettikleri ürünlerin kaydıdır. Talep eden, Talep Eden Departman, Mal Alımı olduğu zaman konulacak Depo ve Konum bilgisi ve Talep Tarihi bilgilerinden sonra Ürün ve talep edilen miktar bilgisi girilmeli. Ürün tanımında yer alan Birim bilgisi yine sistemle entegre şekilde gelmektedir. Termin Tarihi ürünün ne zaman ihtiyaç olduğu ve Talep Nedeni olarak ne amaçla istediği belirtilmelidir. Yine bu kaydın üst kısmında Taslak, Departman Onayı, Satınalma Onayı, Onaylandı, İşlemde, Tamamlandı gibi durumları da onay mekanizması Workflow gibi bir yöntemle yönetmeliyiz. Talepten sonra hemen talep edenin Departman Onaycısı onaylayacak bir liste üzerinden görmeli ve onaylamalı. Sonrasında kayıt SAtınalma departmanına düşmeli ondan sonra bu kayıt Satınalma Sorumlusu kabul etmeli ve Satınalma ile ilgili teklif toplama süreci başlamalı.
Departman Listesine App.Hr.Department Satınalma Onaycısı sütunu eklenmeli ve o departmanının onayı verecek olan kullanıcı o olmalı.


Taleplerim, Departman Onayı Bekleyenler, Satınalma Onayı Bekleyenler, Planlama Bekleyenler, Tüm Talepler listesinden oluşmalı.
Red Nedenleri : Bazı Satınalma talepleri hem departman onaycısı hemde satınalma tarafından reddedilebilir. Reddetme sebepleri aşağıadki gibidir. Bu liste Satınalma -> Tanımlamalar menüsüne yerleştirilmelidir.

",
+ "Description": "Malzeme Talepleri : Satınalma yapılması için departmantların iç ve dış olmak üzere talep ettikleri ürünlerin kaydıdır. Talep eden, Talep Eden Departman, Mal Alımı olduğu zaman konulacak Depo ve Konum bilgisi ve Talep Tarihi bilgilerinden sonra Ürün ve talep edilen miktar bilgisi girilmeli. Ürün tanımında yer alan Birim bilgisi yine sistemle entegre şekilde gelmektedir. Termin Tarihi ürünün ne zaman ihtiyaç olduğu ve Talep Nedeni olarak ne amaçla istediği belirtilmelidir. Yine bu kaydın üst kısmında Taslak, Departman Onayı, Satınalma Onayı, Onaylandı, İşlemde, Tamamlandı gibi durumları da onay mekanizması Workflow gibi bir yöntemle yönetmeliyiz. Talepten sonra hemen talep edenin Departman Onaycısı onaylayacak bir liste üzerinden görmeli ve onaylamalı. Bu kişi Adm_T_Approver entity içerisindeki Onay Yeri : Satınalma ve Departman bazında gösterilecek) Sonrasında kayıt Satınalma departmanına düşmeli ondan sonra bu kayıt Satınalma Sorumlusu kabul etmeli ve Satınalma ile ilgili teklif toplama süreci başlamalı.


Taleplerim, Departman Onayı Bekleyenler, Satınalma Onayı Bekleyenler, Planlama Bekleyenler, Tüm Talepler listesinden oluşmalı.
Red Nedenleri : Bazı Satınalma talepleri hem departman onaycısı hemde satınalma tarafından reddedilebilir. Reddetme sebepleri aşağıadki gibidir. Bu liste Satınalma -> Tanımlamalar menüsüne yerleştirilmelidir.

",
"DueDate": "2026-10-06T21:01:00",
"Tags": "PO",
"Assignees": "system@sozsoft.com",
- "Priority": null,
+ "Priority": "5",
"Completed": false,
- "SortOrder": 1,
- "Timesheets": null,
+ "SortOrder": 0,
+ "Timesheets": "[{\"id\":\"69fb2d7a-7800-1284-c9a0-3a2432255baa\",\"date\":\"2026-10-09\",\"userName\":\"system@sozsoft.com\",\"description\":\"Talep analiz edildi\",\"duration\":0.0167}]",
"SubTasks": null,
- "Analysis": null
+ "Analysis": "Amaç
\nDepartmanların satınalınacak malzemeleri kayıt altına alması, talebin önce departman satınalma onaycısı, sonra satınalma birimi tarafından onaylanması ve onaylı talebin teklif toplama sürecine aktarılması. Kullanıcılar: talep eden personel, departman onaycıları, satınalma ekibi.
\n\nGörsel analizi
\n\n- [image-1] Malzeme Talebi formu — üstte durum çubuğu (Taslak › Departman Onayı › Satınalma Onayı › Onaylandı › İşlemde › Kısmi Tamamlandı › Tamamlandı). Başlık: talep no (SRO/00001), Talep Eden, Departman, Genel Açıklama, Depo, Konum, Şirket (→ Şube), Talep Tarihi. Sekmeler: Talep Satırları (Ürün, Miktar, Birim, Karşılama Şekli, Termin Tarihi, Talep Nedeni, Kendi Depomda, Tüm Depolar, Teslim, Planlanacak Miktar, Satınalma Sorumlusu, satır durumu) ve Onay / Red Bilgileri. \"Transferler\" akıllı butonu.
\n- [image-2] Onay / Red Bilgileri — Departman Onayı grubu (Departman Onaycıları, Onaylayan, Onay Tarihi, Onay Notu) ve Satınalma Onayı grubu (Onaylayan, Onay Tarihi, Onay Notu); salt okunur.
\n- [image-3] Red Nedenleri — liste: Red Nedeni, Aktif. Satırlar (demo veri): İhtiyaç yok, Miktar uygun değil, Yanlış ürün seçildi, Bütçe uygun değil, Diğer.
\n
\n\nÇözüm yolu
\nWizard List ekranları + WorkflowDto onay akışı (§10.7 onaylı talep kalıbı). Talep başlığı ve satırları iki tablo; satırlar menüsüz alt form (List sekmesi). Beş liste görünümü aynı başlık tablosuna bağlı ayrı ListForm'lardır, her biri sabit DefaultFilter ile. Departman onaycıları kayıt sonrası prosedürle (InsertAfterCommand/UpdateAfterCommand) Yönetim › Tanımlamalar › Onaycılar ekranından (Adm_T_Approver, ApprovalArea = 'Purchase', talebin departmanı, aktif satırlar) okunup gizli DeptApproverUserNames kolonuna | ile birleştirilmiş kullanıcı adları olarak yazılır; akışta @DeptApproverUserNames olarak kullanılır.
\n\nMenü yeri
\nSatınalma › Malzeme Talepleri › Taleplerim / Departman Onayı Bekleyenler / Satınalma Onayı Bekleyenler / Planlama Bekleyenler / Tüm Talepler ve Satınalma › Tanımlamalar › Red Nedenleri
\n\n| Seviye | Kod | Ad (TR / EN) | İkon | Durum |
\n| Kök | App.Prc | Satınalma / Purchasing | — | Var |
\n| Ara | App.Prc.Definitions | Tanımlamalar / Definitions | — | Var |
\n| Ekran | App.Prc.RejectionReason | Red Nedenleri / Rejection Reasons | FcCancel | Yeni |
\n| Ara | App.Prc.MaterialRequests | Malzeme Talepleri / Material Requests | FcList | Yeni |
\n| Ekran | App.Prc.MyMaterialRequest | Taleplerim / My Requests | FcDocument | Yeni |
\n| Ekran | App.Prc.MaterialRequestDeptApproval | Departman Onayı Bekleyenler / Awaiting Department Approval | FcApproval | Yeni |
\n| Ekran | App.Prc.MaterialRequestPurchaseApproval | Satınalma Onayı Bekleyenler / Awaiting Purchasing Approval | FcApproval | Yeni |
\n| Ekran | App.Prc.MaterialRequestPlanning | Planlama Bekleyenler / Awaiting Planning | FcPlanner | Yeni |
\n| Ekran | App.Prc.MaterialRequest | Tüm Talepler / All Requests | FcList | Yeni |
\n
\nModuleId: Prc · İzin grubu: App.Prc · Route: /admin/list/{ListFormCode}
\nYetki: App.Prc › App.Prc.Definitions (Var) › App.Prc.RejectionReason (Yeni); App.Prc › App.Prc.MaterialRequests (Yeni) › her ekran (Yeni) › App.Prc.MaterialRequest › App.Prc.MaterialRequestLine (alt form).
\n\nVeri modeli
\nTümü yeni, tenant + audit + soft delete.
\nPrc_T_RejectionReason — Tanım tablosu: Evet (red işleminde seçilir). Kolonlar: Name nvarchar(128) ✓, IsActive bit ✓ DEFAULT 1.
\nPrc_T_MaterialRequest — Tanım tablosu: Hayır (hareket kaydı).
\n\n| Kolon | Tip | Zorunlu | Not |
\n| RequestNo | nvarchar(32) | ✓ | SRO/00001, InsertBefore ile kiracı içinde sıralı |
\n| BranchId | uniqueidentifier | ✓ | → Sas_T_Branch (Şirket) |
\n| RequesterUserId | uniqueidentifier | ✓ | → AbpUsers, varsayılan @USERID |
\n| DepartmentId | uniqueidentifier | ✓ | → Hr_T_Department, şubeye cascade; varsayılan kullanıcının DepartmentId |
\n| WarehouseId | uniqueidentifier | | → Inv_T_Warehouse, şubeye cascade |
\n| LocationId | uniqueidentifier | | → Inv_T_Location, depoya cascade |
\n| RequestDate | datetime2 | ✓ | varsayılan @NOW |
\n| Description | nvarchar(MAX) | | Genel Açıklama (dxTextArea) |
\n| Status | nvarchar(32) | ✓ | Draft / DeptApproval / PurchaseApproval / Approved / InProgress / PartiallyDone / Done / Rejected; DEFAULT 'Draft' |
\n| DeptApproverUserNames | nvarchar(512) | | Prosedür Adm_T_Approver'dan doldurur; formda \"Departman Onaycıları\" (salt okunur) |
\n| ApproverId / ApprovalDate / ApprovalNote | uniqueidentifier / datetime2 / nvarchar(MAX) | | Akışın son adım alanları |
\n| DeptApprovedById / DeptApprovalDate / DeptApprovalNote | uniqueidentifier / datetime2 / nvarchar(MAX) | | Departman adımı kopyası (prosedür) |
\n| PurchaseApprovedById / PurchaseApprovalDate / PurchaseApprovalNote | uniqueidentifier / datetime2 / nvarchar(MAX) | | Satınalma adımı kopyası (prosedür) |
\n| RejectionReasonId | uniqueidentifier | | → Prc_T_RejectionReason |
\n
\nPrc_T_MaterialRequestLine — Tanım tablosu: Hayır.
\n\n| Kolon | Tip | Zorunlu | Not |
\n| MaterialRequestId | uniqueidentifier | ✓ | → Prc_T_MaterialRequest |
\n| ProductId | uniqueidentifier | ✓ | → Inv_T_Product (aktif) |
\n| Quantity | decimal(18,4) | ✓ | > 0 |
\n| UomId | nvarchar(64) | ✓ | → Adm_T_Uom; ürün seçilince üründen dolar |
\n| FulfillmentType | nvarchar(16) | ✓ | Purchase / Stock (Satınalma / Stoktan), DEFAULT 'Purchase' |
\n| DueDate | date | | Termin Tarihi |
\n| RequestReason | nvarchar(512) | | Talep Nedeni |
\n| PurchaserUserId | uniqueidentifier | | Satınalma Sorumlusu → AbpUsers |
\n
\nVar olan, yalnız okunur: Adm_T_Approver (onaycı kaynağı), Hr_T_Department, Inv_T_Warehouse, Inv_T_Location, Inv_T_Product, Adm_T_Uom.
\n\nAlt form ağacı
\n\n| Sekme | Hedef | TabType | Menü | İlişki | Ekle / Düzenle / Sil | Yetki yolu |
\n| Talep Satırları | App.Prc.MaterialRequestLine | List | Menüsüz | Id → MaterialRequestId | ✓ / ✓ / ✓ | App.Prc › App.Prc.MaterialRequests › App.Prc.MaterialRequest › App.Prc.MaterialRequestLine |
\n
\nBeş listenin hepsi aynı alt formu taşır. Onay / Red Bilgileri ana formda salt okunur ikinci grup.
\n\nEtkilenen kısımlar
\n\n- 3 yeni tablo, 1 SQL prosedürü (
Prc_SP_MaterialRequestAfterSave: talep no, onaycıları Adm_T_Approver'dan doldurma, durum ve adım kopyaları), 7 yeni ekran (Red Nedenleri, 5 liste, satır alt formu). \n- Var olan ekranlara dokunulmaz.
\n- Yetkiler: her ekranda C/R/U/D/E/I/N; onaycılara Departman/Satınalma Onayı listelerinin R + U'su.
\n- Dil: ekran, alan, durum (Draft…Rejected) ve karşılama şekli (Purchase/Stock) StaticLookup anahtarları.
\n- İş akışı: onay/red sonrası talep sahibine e-posta (Inform).
\n
\n\nGörünümler ve davranış
\n\n- Liste filtreleri: Taleplerim
RequesterUserId = @USERID; Departman Onayı Bekleyenler Status = 'DeptApproval' + ApprovalIsFilterUserName; Satınalma Onayı Bekleyenler Status = 'PurchaseApproval'; Planlama Bekleyenler Status IN ('Approved','InProgress','PartiallyDone'); Tüm Talepler filtresiz. \n- Görünümler Grid/Card/Pivot/Chart. Widget'lar Tüm Talepler'de: Toplam, Onay Bekleyen, Onaylanan, Reddedilen.
\n- İş akışı: Start → Approval \"Departman Onayı\" (
@DeptApproverUserNames) → Approval \"Satınalma Onayı\" (rol Satınalma) → Inform talep sahibi → End \"Onaylandı\"; her ret → Inform → End \"Reddedildi\". ApprovalIsResetWorkflow: true. \n- Prosedür: kayıtta departmanın aktif Satınalma onaycısı yoksa \"Bu departman için Yönetim › Tanımlamalar › Onaycılar'da Satınalma onaycısı tanımlı değil\" hatasıyla kaydı durdurur. Onay adımlarında Status'u DeptApproval → PurchaseApproval → Approved / Rejected olarak ilerletir ve adım kopyalarını yazar.
\n- Satınalma Onayı sonrası İşlemde / Kısmi Tamamlandı / Tamamlandı durumları Planlama Bekleyenler'de satır komutlarıyla elle ilerletilir.
\n- Ret: RejectionReasonId zorunlu (Status = Rejected iken doğrulama).
\n- Satırda ürün seçilince Birim üründen dolar (copy tarifi); Miktar > 0 doğrulaması. Taslak dışındaki talepte satırlar salt okunur.
\n- Red Nedenleri: Toplam/Aktif/Pasif widget'ı.
\n
\n\nKararlar
\n\n- Tablo öneki
Prc_T_, kod App.Prc.* — mevcut Satınalma ekranlarıyla aynı. \n- Ara menü
App.Prc.MaterialRequests başlıktaki \"Satınalma -> Malzeme Talepleri\" yolundan; beş liste onun altında. \n- Departman onaycısı
Adm_T_Approver'dan (Onay Yeri = Satınalma, talebin departmanı); birden çok onaycıdan herhangi biri onaylayabilir. \n- Satınalma onaycısı (onay):
Satınalma rolündeki kullanıcılar. \n- Talep numarası (onay):
SRO/ + 5 haneli kiracı sırası. \n- Kendi Depomda / Tüm Depolar / Teslim / Planlanacak Miktar kolonları ve Transferler butonu alınmaz: sistemde stok hareket ve bakiye tablosu yok. Teklif toplama süreci bu talebin kapsamı dışında.
\n- Satır düzeyi durum alınmaz; durum başlıktadır.
\n- Red Nedenleri demo verisi: görseldeki 5 satır.
\n
\n\nÜretim planı
\n\n- create_table: Prc_T_RejectionReason
\n- create_table: Prc_T_MaterialRequest
\n- create_table: Prc_T_MaterialRequestLine
\n- save_sql_object: Prc_SP_MaterialRequestAfterSave
\n- deploy_wizard: RejectionReason.json
\n- deploy_wizard: MaterialRequestLine.json
\n- deploy_wizard: MaterialRequest.json
\n- deploy_wizard: MyMaterialRequest.json
\n- deploy_wizard: MaterialRequestDeptApproval.json
\n- deploy_wizard: MaterialRequestPurchaseApproval.json
\n- deploy_wizard: MaterialRequestPlanning.json
\n
\n\nÜretime hazır
\nEvet
"
}
]
}
diff --git a/configs/seeds/data/App.DevRequests/fc6d0fbb-6b04-4d15-9d27-fec98e5c30fb.json b/configs/seeds/data/App.DevRequests/fc6d0fbb-6b04-4d15-9d27-fec98e5c30fb.json
new file mode 100644
index 00000000..3900ae21
--- /dev/null
+++ b/configs/seeds/data/App.DevRequests/fc6d0fbb-6b04-4d15-9d27-fec98e5c30fb.json
@@ -0,0 +1,26 @@
+{
+ "ListFormCode": "App.DevRequests",
+ "KeyFieldName": "Id",
+ "GeneratedAt": "2026-10-09T09:02:23.8580996Z",
+ "Order": 0,
+ "Rows": [
+ {
+ "Id": "fc6d0fbb-6b04-4d15-9d27-fec98e5c30fb",
+ "TenantId": null,
+ "UserName": "system@sozsoft.com",
+ "RequestDate": null,
+ "Status": "Staging",
+ "Title": "Satınalma Onaycıları",
+ "Description": "Yönetim -> Tanımlamalar menüsüne eklenecek olan yeni Liste. Bu liste Departman Adı, Onay Yeri (Satınalma, Depo vb. seçenekli), Onaylayacak Kişi seçilebilmeli. Bu liste uygulamadaki tüm onayları burada toplayacağız. Onay Yeri : Satınalma olanlar Satınalma menüsündeki yeni üretilen veya üretilmiş kısımlarda kullanılacak.
",
+ "DueDate": "2026-10-09T09:08:00",
+ "Tags": "ADM",
+ "Assignees": "system@sozsoft.com",
+ "Priority": "5",
+ "Completed": true,
+ "SortOrder": 10,
+ "Timesheets": "[{\"id\":\"5eeb942f-071a-75e0-1ad6-3a243219320c\",\"date\":\"2026-10-09\",\"userName\":\"system@sozsoft.com\",\"description\":\"Talep analiz edildi\",\"duration\":0.0167},{\"id\":\"d0e49c7b-da82-481c-85d2-3a24321c8660\",\"date\":\"2026-10-09\",\"userName\":\"system@sozsoft.com\",\"description\":\"Adm_T_Approver tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"7ff88954-171a-2ee9-ec8f-3a24321d0f63\",\"date\":\"2026-10-09\",\"userName\":\"system@sozsoft.com\",\"description\":\"Approver.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"48a59c85-5eda-5991-4e53-3a24321db3f3\",\"date\":\"2026-10-09\",\"userName\":\"system@sozsoft.com\",\"description\":\"App.Administration mod\\u00FCl dok\\u00FCman\\u0131 kaydedildi\",\"duration\":0.0167},{\"id\":\"bab3c506-9ad8-d234-5572-3a24321dbcf4\",\"date\":\"2026-10-09\",\"userName\":\"system@sozsoft.com\",\"description\":\"2 tamamlanm\\u0131\\u015F alt g\\u00F6rev eklendi\",\"duration\":0.0167},{\"id\":\"09e17f9b-4670-e7b3-d5d1-3a24321dcee3\",\"date\":\"2026-10-09\",\"userName\":\"system@sozsoft.com\",\"description\":\"Analize \\u00FCretim notu eklendi\",\"duration\":0.0167},{\"id\":\"3279c17a-42fe-0dfd-e46a-3a24321dd838\",\"date\":\"2026-10-09\",\"userName\":\"system@sozsoft.com\",\"description\":\"App.DevRequests ekran\\u0131nda sat\\u0131r g\\u00FCncellendi (Status)\",\"duration\":0.0167}]",
+ "SubTasks": "[{\"id\":\"ef29af4c-7249-7197-d021-3a24321dbcea\",\"title\":\"create_table: Adm_T_Approver\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-10-09\",\"completed\":true},{\"id\":\"b3f03b7c-60cb-97a7-f2f6-3a24321dbcea\",\"title\":\"deploy_wizard: Approver.json\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-10-09\",\"completed\":true}]",
+ "Analysis": "Amaç
\nUygulamadaki tüm onay adımlarının onaycılarını tek listede toplamak: hangi departmanın hangi onay yerinde (Satınalma, Depo …) kimin onaylayacağı. İlk kullanıcısı Satınalma modülüdür (Malzeme Talepleri departman onayı); yöneticiler ve sistem sorumluları tanımlar.
\n\nÇözüm yolu
\nTek Wizard List ekranı (tablo kaynaklı, popup düzenleme). Akışlar onaycıyı bu tablodan kayıt sonrası prosedürle okur ve @Kolon onaycısı olarak kullanır (§4.7); bu ekranın kendisinde iş akışı yoktur. Bu yapı, platform tablosu Hr_T_Department'a kolon eklemeyi gereksiz kılar.
\n\nMenü yeri
\nYönetim › Tanımlamalar › Onaycılar
\n\n| Seviye | Kod | Ad (TR / EN) | İkon | Durum |
\n| Kök | App.Administration | Yönetim / Administration | — | Var |
\n| Ara | App.Administration.Definitions | Tanımlamalar / Definitions | — | Var |
\n| Ekran | App.Definitions.Approver | Onaycılar / Approvers | FcApproval | Yeni |
\n
\nModuleId: Adm · İzin grubu: App.Administration · Route: /admin/list/App.Definitions.Approver
\nYetki: App.Administration › App.Administration.Definitions (Var) › App.Definitions.Approver (Yeni)
\n\nVeri modeli
\nAdm_T_Approver — yeni, tenant + audit + soft delete. Tanım tablosu: Evet (onay akışlarının onaycı kaynağı).
\n\n| Kolon | Tip | Zorunlu | Not |
\n| DepartmentId | uniqueidentifier | ✓ | → Hr_T_Department; listede \"Şube / Departman\" adı |
\n| ApprovalArea | nvarchar(32) | ✓ | Purchase / Warehouse / HumanResources / Finance (Satınalma / Depo / İnsan Kaynakları / Finans); DEFAULT 'Purchase' |
\n| ApproverUserId | uniqueidentifier | ✓ | → AbpUsers (aktif) |
\n| IsActive | bit | ✓ | DEFAULT 1 |
\n
\nTekil kısıt: TenantId + DepartmentId + ApprovalArea + ApproverUserId. Aynı departman ve onay yerine birden çok onaycı girilebilir; akış bunları | ile birleştirip herhangi birinin onayını kabul eder.
\n\nEtkilenen kısımlar
\n\n- 1 yeni tablo, 1 yeni ekran, Yönetim › Tanımlamalar menüsünde 1 satır; yetkiler C/R/U/D/E/I/N.
\n- Dil: ekran adları, alan başlıkları (Departman, Onay Yeri, Onaylayacak Kişi), StaticLookup Purchase/Warehouse/HumanResources/Finance.
\n- Var olan ekranlara dokunulmaz. \"Satınalma -> Malzeme Talepleri\" talebinin departman onaycısı bu tablodan (
ApprovalArea = 'Purchase') okunacaktır; o talebin analizi bu ekrana göre güncellenmelidir (Hr_T_Department kolon ihtiyacı kalkar). \n
\n\nGörünümler ve davranış
\n\n- Grid/Card/Pivot/Chart açık, varsayılan grid; liste Onay Yeri ve Departman'a göre gruplanabilir.
\n- Widget: Toplam / Aktif / Pasif.
\n- Departman lookup'ı aktif şubelerin departmanlarını \"Şube - Departman\" biçiminde gösterir; Onaylayacak Kişi aktif kullanıcıları ad soyad ile gösterir.
\n- Pasif satır akışlarda onaycı olarak kullanılmaz.
\n
\n\nKararlar
\n\n- Ekran adı \"Onaycılar\", kod
App.Definitions.Approver, tablo Adm_T_Approver — Yönetim tanımlarının kod/önek ailesi. Talep başlığı \"Satınalma Onaycıları\" olsa da açıklama tüm onayların burada toplanacağını söylüyor. \n- Onay Yeri seçenekleri (onay): Satınalma, Depo, İnsan Kaynakları, Finans. Yeni yer eklemek seçenek listesine satır eklemektir.
\n- Şube kolonu tutulmaz; şube departmandan gelir.
\n- Demo veri yazılmaz (departman ve kullanıcı Id'leri kiracıya özgü).
\n
\n\nÜretim planı
\n\n- create_table: Adm_T_Approver
\n- deploy_wizard: Approver.json
\n
\n\nÜretime hazır
\nEvet
MCP
\n\n- Tablo: Adm_T_Approver (DepartmentId FK → Hr_T_Department, ApprovalArea DEFAULT 'Purchase', ApproverUserId, IsActive DEFAULT 1); tekil TenantId+DepartmentId+ApprovalArea+ApproverUserId. Kiracı + tam audit.
\n- Ekran: App.Definitions.Approver (grid, IsTenant), Toplam/Aktif/Pasif widget'ı.
\n- Menü/yetki: Yönetim › Tanımlamalar (sıra 6); App.Administration › App.Administration.Definitions › App.Definitions.Approver + C/U/D/E/I/N.
\n- Dil: App.StaticLookup.Purchase/Warehouse/HumanResources/Finance (EN+TR).
\n- Demo veri: yok.
\n- Analize eklenen varsayılanlar: yok.
\n- DB Migrate bekleyen wizard: Approver.json.
\n
"
+ }
+ ]
+}
diff --git a/configs/seeds/data/App.Languages.LanguageText.json b/configs/seeds/data/App.Languages.LanguageText.json
index 56e8ec6a..06ebebcc 100644
--- a/configs/seeds/data/App.Languages.LanguageText.json
+++ b/configs/seeds/data/App.Languages.LanguageText.json
@@ -92781,6 +92781,132 @@
"ResourceName": "Platform",
"Key": "App.Listform.ListformField.DestinationLocation",
"Value": "Hedef Konum"
+ },
+ {
+ "Id": "b12988e0-9bb1-56d9-ad96-e3a0f5b8027e",
+ "CultureName": "en",
+ "ResourceName": "Platform",
+ "Key": "App.Definitions.Approver",
+ "Value": "Approvers"
+ },
+ {
+ "Id": "43df96d2-6c32-5577-9b7b-6dde369115e5",
+ "CultureName": "tr",
+ "ResourceName": "Platform",
+ "Key": "App.Definitions.Approver",
+ "Value": "Onaycılar"
+ },
+ {
+ "Id": "60002287-6449-5d31-83b2-8eabcb816021",
+ "CultureName": "en",
+ "ResourceName": "Platform",
+ "Key": "App.Definitions.Approver.Title",
+ "Value": "Approvers"
+ },
+ {
+ "Id": "239634a5-c96c-5ebf-9cd1-608490546ab1",
+ "CultureName": "tr",
+ "ResourceName": "Platform",
+ "Key": "App.Definitions.Approver.Title",
+ "Value": "Onaycılar"
+ },
+ {
+ "Id": "49ea6342-1061-58ca-a160-acbda4a503d9",
+ "CultureName": "en",
+ "ResourceName": "Platform",
+ "Key": "App.Definitions.Approver.Desc",
+ "Value": "Approvers — the single list of who approves what for each department across the application.\nWhere: Administration › Definitions › Approvers.\nFields: department (shown as Branch - Department), approval area (Purchasing / Warehouse / Human Resources / Finance), approver user, active.\nUsed by: approval workflows read the approvers of the record's department and area (e.g. Purchasing › Material Requests department approval uses area Purchasing). Several approvers may be defined for the same department and area; any one of them can approve. Passive rows are ignored by workflows."
+ },
+ {
+ "Id": "3663c5aa-4036-5381-810f-8acee720724c",
+ "CultureName": "tr",
+ "ResourceName": "Platform",
+ "Key": "App.Definitions.Approver.Desc",
+ "Value": "Onaycılar — uygulamadaki tüm onay adımlarında her departman için kimin onaylayacağını tutan tek liste.\nNerede: Yönetim › Tanımlamalar › Onaycılar.\nAlanlar: departman (Şube - Departman olarak gösterilir), onay yeri (Satınalma / Depo / İnsan Kaynakları / Finans), onaylayacak kişi, aktif.\nKullanıldığı yer: onay akışları kaydın departmanı ve onay yerine göre onaycıları buradan okur (ör. Satınalma › Malzeme Talepleri departman onayı Satınalma yerini kullanır). Aynı departman ve onay yerine birden çok onaycı girilebilir; herhangi birinin onayı yeterlidir. Pasif satırlar akışlarda kullanılmaz."
+ },
+ {
+ "Id": "cd7ff644-eefa-516e-8c8c-8b4fa0ec76f8",
+ "CultureName": "en",
+ "ResourceName": "Platform",
+ "Key": "App.StaticLookup.Purchase",
+ "Value": "Purchasing"
+ },
+ {
+ "Id": "03ef0361-7c2b-512d-b310-dd00f96e936d",
+ "CultureName": "tr",
+ "ResourceName": "Platform",
+ "Key": "App.StaticLookup.Purchase",
+ "Value": "Satınalma"
+ },
+ {
+ "Id": "e8adf283-fb09-58f3-9b51-72fc0862d993",
+ "CultureName": "en",
+ "ResourceName": "Platform",
+ "Key": "App.StaticLookup.Warehouse",
+ "Value": "Warehouse"
+ },
+ {
+ "Id": "466de337-6d88-5cd9-a511-be7a812292a0",
+ "CultureName": "tr",
+ "ResourceName": "Platform",
+ "Key": "App.StaticLookup.Warehouse",
+ "Value": "Depo"
+ },
+ {
+ "Id": "67a7b0d6-b957-5f7c-b9d0-44320b925949",
+ "CultureName": "en",
+ "ResourceName": "Platform",
+ "Key": "App.StaticLookup.HumanResources",
+ "Value": "Human Resources"
+ },
+ {
+ "Id": "bc378aba-8759-5acb-93bb-0bffac2e8ef3",
+ "CultureName": "tr",
+ "ResourceName": "Platform",
+ "Key": "App.StaticLookup.HumanResources",
+ "Value": "İnsan Kaynakları"
+ },
+ {
+ "Id": "fbceb79e-b476-57d2-ae05-c9e5ec8e2093",
+ "CultureName": "en",
+ "ResourceName": "Platform",
+ "Key": "App.StaticLookup.Finance",
+ "Value": "Finance"
+ },
+ {
+ "Id": "e5a89704-6b60-5476-8610-e527d1636854",
+ "CultureName": "tr",
+ "ResourceName": "Platform",
+ "Key": "App.StaticLookup.Finance",
+ "Value": "Finans"
+ },
+ {
+ "Id": "1e00f113-afdf-5ffb-a8c0-72ce5976c3ae",
+ "CultureName": "en",
+ "ResourceName": "Platform",
+ "Key": "App.Listform.ListformField.ApprovalArea",
+ "Value": "Approval Area"
+ },
+ {
+ "Id": "ba50322d-5b32-5079-8b9f-b354de4a5691",
+ "CultureName": "tr",
+ "ResourceName": "Platform",
+ "Key": "App.Listform.ListformField.ApprovalArea",
+ "Value": "Onay Yeri"
+ },
+ {
+ "Id": "ad247eac-ef52-5ac1-a9bd-5073f98ba1c0",
+ "CultureName": "en",
+ "ResourceName": "Platform",
+ "Key": "App.Listform.ListformField.ApproverUser",
+ "Value": "Approver"
+ },
+ {
+ "Id": "909e87f0-d960-5041-9af7-1e7b6d01b044",
+ "CultureName": "tr",
+ "ResourceName": "Platform",
+ "Key": "App.Listform.ListformField.ApproverUser",
+ "Value": "Onaylayacak Kişi"
}
]
}
diff --git a/configs/seeds/data/App.Menus.Menu.json b/configs/seeds/data/App.Menus.Menu.json
index c37f11b7..e41a18fc 100644
--- a/configs/seeds/data/App.Menus.Menu.json
+++ b/configs/seeds/data/App.Menus.Menu.json
@@ -2796,6 +2796,17 @@
"RequiredPermissionName": "App.Inventory.OperationType",
"IsDisabled": false,
"ModuleId": "Inventory"
+ },
+ {
+ "ParentCode": "App.Administration.Definitions",
+ "Code": "App.Definitions.Approver",
+ "DisplayName": "App.Definitions.Approver",
+ "Order": 6,
+ "Url": "/admin/list/App.Definitions.Approver",
+ "Icon": "FcApproval",
+ "RequiredPermissionName": "App.Definitions.Approver",
+ "IsDisabled": false,
+ "ModuleId": "Adm"
}
]
}
diff --git a/configs/seeds/docs/modules/App.Administration.md b/configs/seeds/docs/modules/App.Administration.md
index 3499fa45..b7b98c69 100644
--- a/configs/seeds/docs/modules/App.Administration.md
+++ b/configs/seeds/docs/modules/App.Administration.md
@@ -9,7 +9,7 @@
### 1. Amaç ve kapsam
-Satış ve satınalmanın ortak kullandığı **Kontaklar** kartı (müşteri ve tedarikçi; şirket ya da bireysel) ve onu sınıflandıran **Kontak Etiketleri**. İleride yapılacak Satış ve Satınalma belgeleri (teklif, sipariş, fatura) kontağı bu ekrandan seçer. Kart başlangıçta Satınalma › Tanımlamalar altında `App.Prc.Supplier` olarak üretildi; satış tarafı da kullanacağı için Yönetim modülüne taşındı.
+Satış ve satınalmanın ortak kullandığı **Kontaklar** kartı (müşteri ve tedarikçi; şirket ya da bireysel), onu sınıflandıran **Kontak Etiketleri** ve uygulamadaki tüm onay adımlarının onaycılarını tek yerde tutan **Onaycılar** listesi. İleride yapılacak Satış ve Satınalma belgeleri (teklif, sipariş, fatura) kontağı bu ekrandan seçer; onay akışları onaycıyı Onaycılar'dan okur. Kart başlangıçta Satınalma › Tanımlamalar altında `App.Prc.Supplier` olarak üretildi; satış tarafı da kullanacağı için Yönetim modülüne taşındı.
### 2. Analiz ve kararlar
@@ -27,6 +27,13 @@ Satış ve satınalmanın ortak kullandığı **Kontaklar** kartı (müşteri ve
- Sektör (`SectorId`) Sektörler ekranının (`App.Definitions.Sector`, `Adm_T_Sector`) kiracıya ait aktif kayıtlarından seçilir. `JobPosition` kolonu tabloda kalır, ekranda yoktur.
- Kontak telefonu (`Phone`) `phoneCountry` biçimindedir: maske seçilen ülkenin kodu ve numara kalıbıyla değişir, `pattern` `^[0-9]{4,15}$`. Ülke alanı olmayan İlgili Kişiler telefonu `phoneGlobal` maskesi ve `^[0-9]{10}$` kuralı taşır; web sitesi `pattern`, e-posta `email` doğrulaması taşır.
+Onaylanan analiz (talep "Satınalma Onaycıları"):
+
+- Ekran adı "Onaycılar" (`App.Definitions.Approver`, `Adm_T_Approver`): başlık "Satınalma Onaycıları" olsa da açıklama tüm onayların burada toplanacağını söyler.
+- Onaycı departman + onay yeri bazındadır; platform tablosu `Hr_T_Department`'a kolon eklenmez (entity tablosu, çerçeve dışı).
+- Onay Yeri seçenekleri: Satınalma (`Purchase`), Depo (`Warehouse`), İnsan Kaynakları (`HumanResources`), Finans (`Finance`) (onaylı).
+- Şube kolonu tutulmaz; departmandan gelir. Demo veri yazılmadı (departman/kullanıcı Id'leri kiracıya özgü).
+
### 3. Menü ve ekranlar
Yönetim (`App.Administration`) › Tanımlamalar (`App.Administration.Definitions`):
@@ -38,6 +45,7 @@ Yönetim (`App.Administration`) › Tanımlamalar (`App.Administration.Definitio
| 3 | Kontak Etiketleri | `App.Definitions.ContactTag` | tanım, demo veri |
| 4 | Diziler | `App.Definitions.Sequence` | kod seed'i |
| 5 | Ölçü Kategorileri | `App.Definitions.UomCategory` | kod seed'i |
+| 6 | Onaycılar | `App.Definitions.Approver` | tanım; onay akışlarının onaycı kaynağı |
### 4. Veri modeli
@@ -47,6 +55,7 @@ Tüm tablolar kiracı (`TenantId`) + tam audit + soft delete taşır.
- `Adm_T_Contact` — kimlik/adres (Country, City, District, Township, PostalCode)/vergi, satış ve satınalma koşulları (`Prc_T_*` tanım tablolarına Id ile), kullanıcılar (`AbpUsers`), para birimi (`Sas_H_Currency.Name`), sektör (`Adm_T_Sector`), dil (`Sas_H_Language.CultureName`), muhasebe alanları, Latitude/Longitude (float), Notes (HTML, nvarchar(MAX)), IsActive.
- `Adm_T_ContactPerson` (ContactId → `Adm_T_Contact.Id`, Photo, Name, JobTitle, Email, Phone, Mobile, Notes)
- `Adm_T_ContactBankAccount` (ContactId → `Adm_T_Contact.Id`, BankName, Iban, AccountHolder, Currency, IsDefault)
+- `Adm_T_Approver` (DepartmentId → `Hr_T_Department.Id` FK, ApprovalArea nvarchar(32) DEFAULT 'Purchase', ApproverUserId → `AbpUsers`, IsActive); tekil `TenantId + DepartmentId + ApprovalArea + ApproverUserId`.
### 5. İş kuralları ve hesaplar
@@ -55,14 +64,15 @@ Tüm tablolar kiracı (`TenantId`) + tam audit + soft delete taşır.
- Ana form yalnızca kimlik + adres alanlarını taşır. Satış, Satınalma, Mali Bilgi ve Diğer, Muhasebe ve Notlar sekmelerinde yalnızca düzenleme açıktır; yeni kontak önce ana formdan eklenir, sekmeler kayıttan sonra açılır.
- IBAN doğrulaması: `^[A-Z]{2}[0-9]{2}[A-Z0-9]{11,30}$` (boşluksuz, büyük harf).
- Yeni kayıtta Tür = Şirket, Grup Teklif Talebi = Sipariş Üzerine, Fatura onayı = 3 doğrulamadan sonra sor varsayılanları tablodan gelir.
+- **Onaycılar:** aynı departman ve onay yerine birden çok onaycı girilebilir; akış bunları `|` ile birleştirir ve herhangi birinin onayını kabul eder. Pasif satırlar akışta kullanılmaz. Departman lookup'ı aktif şubelerin departmanlarını "Şube - Departman" olarak, onaycı lookup'ı aktif kullanıcıları ad soyad ile listeler. Yeni satırda Onay Yeri = Satınalma, Aktif = evet.
### 6. Yetki ve görünürlük
-Yetki ağacı: `App.Administration` grubu › `App.Administration.Definitions` › `App.Definitions.Contact` (sıra 2) ve `App.Definitions.ContactTag` (sıra 3), her biri + Create/Update/Delete/Export/Import/Note. Alt formların yetkisi `App.Definitions.Contact` altındadır: Satış, Satınalma, Mali Bilgi ve Diğer, Muhasebe, Notlar (7–11), İlgili Kişiler (12), Banka Hesapları (13). `Modules = Sas|Adm`, `MultiTenancySide = Both`. Yetkiler hiçbir role otomatik atanmaz. Widget'lar: Kontaklar ve Kontak Etiketleri'nde Toplam · Aktif · Pasif; alt formlarda widget yok.
+Yetki ağacı: `App.Administration` grubu › `App.Administration.Definitions` › `App.Definitions.Contact` (sıra 2), `App.Definitions.ContactTag` (sıra 3) ve `App.Definitions.Approver`, her biri + Create/Update/Delete/Export/Import/Note. Alt formların yetkisi `App.Definitions.Contact` altındadır: Satış, Satınalma, Mali Bilgi ve Diğer, Muhasebe, Notlar (7–11), İlgili Kişiler (12), Banka Hesapları (13). `Modules = Sas|Adm`, `MultiTenancySide = Both`. Yetkiler hiçbir role otomatik atanmaz. Onaycılar'ın yazma yetkisi yalnız yöneticilerde olmalıdır; akışlar tabloyu ekran yetkisi olmadan okur. Widget'lar: Kontaklar, Kontak Etiketleri ve Onaycılar'da Toplam · Aktif · Pasif; alt formlarda widget yok.
### 7. Entegrasyonlar
-Yok. Ülke/Şehir/İlçe, Para Birimi, Dil, Sektör, Kullanıcılar ve Satınalma tanımları yalnızca okunur.
+Dış entegrasyon yok. Ülke/Şehir/İlçe, Para Birimi, Dil, Sektör, Kullanıcılar, Departmanlar, Şubeler ve Satınalma tanımları yalnızca okunur. Onaycılar'ı Satınalma › Malzeme Talepleri departman onayı (`ApprovalArea = 'Purchase'`) okuyacaktır; diğer onay yerleri ilgili modüllerin akışları için hazırdır.
### 8. Akış örneği
@@ -71,6 +81,7 @@ Yok. Ülke/Şehir/İlçe, Para Birimi, Dil, Sektör, Kullanıcılar ve Satınalm
3. Satınalma sekmesinde Düzenle ile Ödeme Koşulu = 30 Gün seçilir.
4. İlgili Kişiler sekmesinde Addison Olson eklenir; `ContactId` kartın Id'sinden yazılır.
5. Banka Hesapları sekmesinde IBAN girilir ve Varsayılan işaretlenir.
+6. Onaycılar'da "Branch1 - Yönetim" departmanı için Onay Yeri = Satınalma, Onaylayacak Kişi = BT eklenir; bu departmanın malzeme talepleri BT'nin onayına düşer.
### 9. Sık sorulanlar
@@ -78,13 +89,15 @@ Yok. Ülke/Şehir/İlçe, Para Birimi, Dil, Sektör, Kullanıcılar ve Satınalm
- **Kişiler neden listede ayrı satır değil?** Kişi kontak değildir; kartın İlgili Kişiler sekmesindedir.
- **Yeni kontakta Satış/Satınalma sekmeleri neden yok?** Sekmeler kaydın kendisini düzenler; kayıt ana formdan eklendikten sonra görünür.
- **Sekme "Kayıt Bulunamadı" gösteriyor.** Kullanıcının o sekmenin okuma yetkisi yoktur (`App.Definitions.ContactSales` vb.); yetkiler rol ekranından verilir.
+- **Aynı kişiyi aynı departmana ikinci kez ekleyemiyorum.** Departman + onay yeri + kişi tekildir; mevcut satırı aktifleştirin.
+- **Departmana onaycı tanımlanmadıysa ne olur?** Onaycı okuyan akış kaydı durdurur; boş onaycı herkese onay yetkisi verirdi.
### 10. Dosyalar ve geri alma
-- Tablolar: `sql/object/Adm_T_Contact.sql`, `Adm_T_ContactPerson.sql`, `Adm_T_ContactBankAccount.sql`, `Adm_T_ContactTag.sql`.
-- Wizard'lar: `ContactTag.json`, `ContactPerson.json`, `ContactBankAccount.json`, `ContactSales.json`, `ContactPurchasing.json`, `ContactFinancial.json`, `ContactAccounting.json`, `ContactNotes.json`, `Contact.json`.
+- Tablolar: `sql/object/Adm_T_Contact.sql`, `Adm_T_ContactPerson.sql`, `Adm_T_ContactBankAccount.sql`, `Adm_T_ContactTag.sql`, `Adm_T_Approver.sql`.
+- Wizard'lar: `ContactTag.json`, `ContactPerson.json`, `ContactBankAccount.json`, `ContactSales.json`, `ContactPurchasing.json`, `ContactFinancial.json`, `ContactAccounting.json`, `ContactNotes.json`, `Contact.json`, `Approver.json`.
- Demo veri: `data/App.Definitions.{ContactTag,Contact}.json`.
-- Geri alma: önce `Contact.json`, sonra alt formlar ve `ContactTag.json` `delete_wizard` ile silinir; tablolar yalnızca açık onayla `dropTables: true` ile düşürülür.
+- Geri alma: önce `Contact.json`, sonra alt formlar ve `ContactTag.json` `delete_wizard` ile silinir; `Approver.json` bağımsızdır ama onu okuyan akışlar önce kaldırılmalıdır. Tablolar yalnızca açık onayla `dropTables: true` ile düşürülür.
## Ek — Ekran envanteri (otomatik)
@@ -156,6 +169,30 @@ Yok. Ülke/Şehir/İlçe, Para Birimi, Dil, Sektör, Kullanıcılar ve Satınalm
| `Color` | Renk | dxColorBox | | ✓ | |
| `IsActive` | Aktif | dxCheckBox | ✓ | ✓ | |
+#### Onaycılar — `App.Definitions.Approver`
+
+| Özellik | Değer |
+| --- | --- |
+| Wizard | `wizard/Approver.json` |
+| Yol | Liste (Wizard) |
+| Menü | `App.Administration.Definitions` › `App.Definitions.Approver` (sıra 6) |
+| Yetki | `App.Definitions.Approver` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` |
+| Açıklama | Onaycılar — uygulamadaki tüm onay adımlarında her departman için kimin onaylayacağını tutan tek liste. |
+| Geliştirme talebi | Satınalma Onaycıları |
+| Kaynak | `Adm_T_Approver` · filtre `"IsDeleted" = 'false'` |
+| Görünümler | Grid, Card, Pivot, Chart (açılış grid) |
+| Düzenleme | ekle ✓ · düzenle ✓ · sil ✓ · popup |
+| Kapsam | Kiracı |
+| Widget'lar | `App.Widget.Total`, `App.Widget.Active`, `App.Widget.Passive` |
+| Form varsayılanları | ApprovalArea=Purchase, IsActive=true |
+
+| Alan | Başlık | Editör | Zorunlu | Formda | Kaynak |
+| --- | --- | --- | --- | --- | --- |
+| `DepartmentId` | Departman | dxSelectBox | ✓ | ✓ | sorgu: Hr_T_Department |
+| `ApprovalArea` | Onay Yeri | dxSelectBox | ✓ | ✓ | liste: Purchase, Warehouse, HumanResources, Finance |
+| `ApproverUserId` | Onaylayacak Kişi | dxSelectBox | ✓ | ✓ | sorgu: AbpUsers |
+| `IsActive` | Aktif | dxCheckBox | ✓ | ✓ | |
+
#### İlgili Kişiler — `App.Definitions.ContactPerson`
| Özellik | Değer |
diff --git a/configs/seeds/postgres/object/Adm_T_Approver.sql b/configs/seeds/postgres/object/Adm_T_Approver.sql
new file mode 100644
index 00000000..bf6ca40c
--- /dev/null
+++ b/configs/seeds/postgres/object/Adm_T_Approver.sql
@@ -0,0 +1,33 @@
+CREATE TABLE IF NOT EXISTS public."Adm_T_Approver"
+(
+ "Id" uuid NOT NULL DEFAULT gen_random_uuid(),
+ "TenantId" uuid NULL,
+ "DepartmentId" uuid NOT NULL,
+ "ApprovalArea" varchar(32) NOT NULL DEFAULT 'Purchase',
+ "ApproverUserId" uuid NOT NULL,
+ "IsActive" boolean NOT NULL DEFAULT TRUE,
+ "CreationTime" timestamp NOT NULL DEFAULT (NOW() AT TIME ZONE 'UTC'),
+ "CreatorId" uuid NULL,
+ "LastModificationTime" timestamp NULL,
+ "LastModifierId" uuid NULL,
+ "IsDeleted" boolean NOT NULL DEFAULT FALSE,
+ "DeletionTime" timestamp NULL,
+ "DeleterId" uuid NULL,
+ CONSTRAINT "PK_Adm_T_Approver" PRIMARY KEY ("Id")
+);
+
+DO $$
+BEGIN
+ IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'UQ_Adm_T_Approver_TenantId_DepartmentId_ApprovalArea_ApproverUserId') THEN
+ ALTER TABLE public."Adm_T_Approver" ADD CONSTRAINT "UQ_Adm_T_Approver_TenantId_DepartmentId_ApprovalArea_ApproverUserId" UNIQUE ("TenantId", "DepartmentId", "ApprovalArea", "ApproverUserId");
+ END IF;
+END
+$$;
+
+DO $$
+BEGIN
+ IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'FK_Adm_T_Approver_DepartmentId') THEN
+ ALTER TABLE public."Adm_T_Approver" ADD CONSTRAINT "FK_Adm_T_Approver_DepartmentId" FOREIGN KEY ("DepartmentId") REFERENCES public."Hr_T_Department" ("Id") ON DELETE NO ACTION ON UPDATE NO ACTION;
+ END IF;
+END
+$$;
diff --git a/configs/seeds/sql/object/Adm_T_Approver.sql b/configs/seeds/sql/object/Adm_T_Approver.sql
new file mode 100644
index 00000000..57189231
--- /dev/null
+++ b/configs/seeds/sql/object/Adm_T_Approver.sql
@@ -0,0 +1,36 @@
+IF OBJECT_ID(N'[dbo].[Adm_T_Approver]', 'U') IS NULL
+BEGIN
+ CREATE TABLE [dbo].[Adm_T_Approver]
+ (
+ [Id] uniqueidentifier NOT NULL DEFAULT NEWID(),
+ [TenantId] uniqueidentifier NULL,
+ [DepartmentId] uniqueidentifier NOT NULL,
+ [ApprovalArea] nvarchar(32) NOT NULL DEFAULT 'Purchase',
+ [ApproverUserId] uniqueidentifier NOT NULL,
+ [IsActive] bit NOT NULL DEFAULT 1,
+ [CreationTime] datetime2 NOT NULL DEFAULT GETUTCDATE(),
+ [CreatorId] uniqueidentifier NULL,
+ [LastModificationTime] datetime2 NULL,
+ [LastModifierId] uniqueidentifier NULL,
+ [IsDeleted] bit NOT NULL DEFAULT 0,
+ [DeletionTime] datetime2 NULL,
+ [DeleterId] uniqueidentifier NULL,
+ CONSTRAINT [PK_Adm_T_Approver] PRIMARY KEY NONCLUSTERED
+ (
+ [Id] ASC
+ )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
+ ) ON [PRIMARY]
+END
+GO
+
+IF OBJECT_ID(N'[dbo].[UQ_Adm_T_Approver_TenantId_DepartmentId_ApprovalArea_ApproverUserId]', 'UQ') IS NULL
+BEGIN
+ ALTER TABLE [dbo].[Adm_T_Approver] ADD CONSTRAINT [UQ_Adm_T_Approver_TenantId_DepartmentId_ApprovalArea_ApproverUserId] UNIQUE NONCLUSTERED ([TenantId] ASC, [DepartmentId] ASC, [ApprovalArea] ASC, [ApproverUserId] ASC);
+END
+GO
+
+IF OBJECT_ID(N'[dbo].[FK_Adm_T_Approver_DepartmentId]', 'F') IS NULL
+BEGIN
+ ALTER TABLE [dbo].[Adm_T_Approver] ADD CONSTRAINT [FK_Adm_T_Approver_DepartmentId] FOREIGN KEY ([DepartmentId]) REFERENCES [dbo].[Hr_T_Department] ([Id]) ON DELETE NO ACTION ON UPDATE NO ACTION;
+END
+GO
\ No newline at end of file
diff --git a/configs/seeds/wizard/Approver.json b/configs/seeds/wizard/Approver.json
new file mode 100644
index 00000000..73d83fef
--- /dev/null
+++ b/configs/seeds/wizard/Approver.json
@@ -0,0 +1,1427 @@
+{
+ "Wizard": {
+ "ComponentKind": 0,
+ "WizardName": "Approver",
+ "WizardCode": "App.Definitions.Approver",
+ "SeededAt": "2026-10-09T09:13:15.0817472Z",
+ "CustomComponentName": null,
+ "PermissionGroupName": "App.Administration",
+ "ModuleId": "Adm",
+ "Menu": {
+ "MenuParentPath": [
+ {
+ "Code": "App.Administration",
+ "Icon": "FcOrganization",
+ "En": "Administration",
+ "Tr": "Yönetim"
+ }
+ ],
+ "MenuParentCode": "App.Administration.Definitions",
+ "MenuParentIcon": "FcFilingCabinet",
+ "MenuCode": "App.Definitions.Approver",
+ "MenuOrder": 6,
+ "MenuUrl": "/admin/list/App.Definitions.Approver",
+ "MenuIcon": "FcApproval"
+ },
+ "Language": {
+ "MenuParentEn": "Definitions",
+ "MenuParentTr": "Tanımlamalar",
+ "PermissionGroupEn": "Administration",
+ "PermissionGroupTr": "Yönetim",
+ "MenuEn": "Approvers",
+ "MenuTr": "Onaycılar",
+ "TitleEn": "Approvers",
+ "TitleTr": "Onaycılar",
+ "DescEn": "Approvers — the single list of who approves what for each department across the application.\nWhere: Administration › Definitions › Approvers.\nFields: department (shown as Branch - Department), approval area (Purchasing / Warehouse / Human Resources / Finance), approver user, active.\nUsed by: approval workflows read the approvers of the record's department and area (e.g. Purchasing › Material Requests department approval uses area Purchasing). Several approvers may be defined for the same department and area; any one of them can approve. Passive rows are ignored by workflows.",
+ "DescTr": "Onaycılar — uygulamadaki tüm onay adımlarında her departman için kimin onaylayacağını tutan tek liste.\nNerede: Yönetim › Tanımlamalar › Onaycılar.\nAlanlar: departman (Şube - Departman olarak gösterilir), onay yeri (Satınalma / Depo / İnsan Kaynakları / Finans), onaylayacak kişi, aktif.\nKullanıldığı yer: onay akışları kaydın departmanı ve onay yerine göre onaycıları buradan okur (ör. Satınalma › Malzeme Talepleri departman onayı Satınalma yerini kullanır). Aynı departman ve onay yerine birden çok onaycı girilebilir; herhangi birinin onayı yeterlidir. Pasif satırlar akışlarda kullanılmaz.",
+ "Texts": [
+ {
+ "Key": "App.StaticLookup.Purchase",
+ "En": "Purchasing",
+ "Tr": "Satınalma"
+ },
+ {
+ "Key": "App.StaticLookup.Warehouse",
+ "En": "Warehouse",
+ "Tr": "Depo"
+ },
+ {
+ "Key": "App.StaticLookup.HumanResources",
+ "En": "Human Resources",
+ "Tr": "İnsan Kaynakları"
+ },
+ {
+ "Key": "App.StaticLookup.Finance",
+ "En": "Finance",
+ "Tr": "Finans"
+ }
+ ]
+ },
+ "Groups": [
+ {
+ "Items": [
+ {
+ "FieldName": "Id",
+ "CaptionName": "App.Listform.ListformField.Id",
+ "En": "Id",
+ "Tr": "Kimlik"
+ },
+ {
+ "FieldName": "DepartmentId",
+ "CaptionName": "App.Listform.ListformField.Department",
+ "En": "Department",
+ "Tr": "Departman"
+ },
+ {
+ "FieldName": "ApprovalArea",
+ "CaptionName": "App.Listform.ListformField.ApprovalArea",
+ "En": "Approval Area",
+ "Tr": "Onay Yeri"
+ },
+ {
+ "FieldName": "ApproverUserId",
+ "CaptionName": "App.Listform.ListformField.ApproverUser",
+ "En": "Approver",
+ "Tr": "Onaylayacak Kişi"
+ },
+ {
+ "FieldName": "IsActive",
+ "CaptionName": "App.Listform.ListformField.IsActive",
+ "En": "Active",
+ "Tr": "Aktif"
+ }
+ ]
+ }
+ ]
+ },
+ "ListForm": {
+ "EditType": null,
+ "DataSourceCode": "Default",
+ "KeyFieldDbSourceType": 9,
+ "TableName": null,
+ "DefaultFilter": "\"IsDeleted\" = 'false'",
+ "SelectCommand": "Adm_T_Approver",
+ "SelectCommandType": 1,
+ "SelectFieldsDefaultValueDto": [],
+ "SeedFilePath": null,
+ "SeedSyncInsert": false,
+ "SeedSyncUpdate": false,
+ "SeedSyncDelete": false,
+ "DeleteCommand": "UPDATE \"Adm_T_Approver\" SET \"DeleterId\"=@DeleterId, \"DeletionTime\"=CURRENT_TIMESTAMP, \"IsDeleted\"='true' WHERE \"Id\" IN @Id",
+ "DeleteBeforeCommand": null,
+ "DeleteAfterCommand": null,
+ "DeleteFieldsDefaultValueDto": [
+ {
+ "FieldName": "DeleterId",
+ "FieldDbType": 9,
+ "Value": "@USERID",
+ "CustomValueType": 2,
+ "SqlQuery": null
+ },
+ {
+ "FieldName": "Id",
+ "FieldDbType": 9,
+ "Value": "@ID",
+ "CustomValueType": 2,
+ "SqlQuery": null
+ }
+ ],
+ "InsertCommand": null,
+ "InsertBeforeCommand": null,
+ "InsertAfterCommand": null,
+ "InsertFieldsDefaultValueDto": [
+ {
+ "FieldName": "CreationTime",
+ "FieldDbType": 6,
+ "Value": "@NOW",
+ "CustomValueType": 2,
+ "SqlQuery": null
+ },
+ {
+ "FieldName": "CreatorId",
+ "FieldDbType": 9,
+ "Value": "@USERID",
+ "CustomValueType": 2,
+ "SqlQuery": null
+ },
+ {
+ "FieldName": "IsDeleted",
+ "FieldDbType": 3,
+ "Value": "false",
+ "CustomValueType": 1,
+ "SqlQuery": null
+ },
+ {
+ "FieldName": "Id",
+ "FieldDbType": 9,
+ "Value": "@NEWID",
+ "CustomValueType": 2,
+ "SqlQuery": null
+ }
+ ],
+ "UpdateCommand": null,
+ "UpdateBeforeCommand": null,
+ "UpdateAfterCommand": null,
+ "UpdateFieldsDefaultValueDto": [],
+ "FormFieldsDefaultValueDto": [
+ {
+ "FieldName": "ApprovalArea",
+ "FieldDbType": 16,
+ "Value": "Purchase",
+ "CustomValueType": 1,
+ "SqlQuery": null
+ },
+ {
+ "FieldName": "IsActive",
+ "FieldDbType": 3,
+ "Value": "true",
+ "CustomValueType": 1,
+ "SqlQuery": null
+ }
+ ],
+ "WidgetsDto": [
+ {
+ "ColGap": 3,
+ "ColSpan": 4,
+ "SqlQuery": "SELECT 'App.Widget.Total' AS \"Title\", CAST(COUNT(*) AS VARCHAR(32)) AS \"Value\", 'blue' AS \"Color\", 'App.Definitions.Approver' AS \"SubTitle\", 'FaUserCheck' AS \"Icon\" FROM \"Adm_T_Approver\" WHERE \"TenantId\" = '@TENANTID' AND \"IsDeleted\" = 'false' UNION ALL SELECT 'App.Widget.Active', CAST(COUNT(*) AS VARCHAR(32)), 'green', 'App.Definitions.Approver', 'FaCheckCircle' FROM \"Adm_T_Approver\" WHERE \"TenantId\" = '@TENANTID' AND \"IsDeleted\" = 'false' AND \"IsActive\" = 1 UNION ALL SELECT 'App.Widget.Passive', CAST(COUNT(*) AS VARCHAR(32)), 'gray', 'App.Definitions.Approver', 'FaTimesCircle' FROM \"Adm_T_Approver\" WHERE \"TenantId\" = '@TENANTID' AND \"IsDeleted\" = 'false' AND \"IsActive\" = 0",
+ "Title": "Title",
+ "Value": "Value",
+ "ValueClassName": "text-3xl",
+ "Color": "Color",
+ "Icon": "Icon",
+ "SubTitle": "SubTitle",
+ "OnClick": null,
+ "ClassName": "mb-3",
+ "IsActive": true
+ }
+ ],
+ "ExtraFilterEditDto": [],
+ "ListFormCode": "App.Definitions.Approver",
+ "CultureName": "en",
+ "Name": "App.Definitions.Approver",
+ "KeyFieldName": "Id",
+ "Title": "App.Definitions.Approver.Title",
+ "SortMode": "single",
+ "PageSize": 10,
+ "Width": 0,
+ "Height": 0,
+ "FullHeight": false,
+ "Description": "App.Definitions.Approver.Desc",
+ "FilterRowDto": {
+ "Visible": true,
+ "ApplyFilter": "auto",
+ "AllowUserUiFilterSave": true
+ },
+ "RowDto": {
+ "RowHeight": "auto",
+ "WhiteSpace": "normal",
+ "OverflowWrap": "break-word"
+ },
+ "HeaderFilterDto": {
+ "Visible": true,
+ "AllowSearch": false,
+ "Height": 325,
+ "SearchTimeout": 500,
+ "Width": 252
+ },
+ "FilterPanelDto": {
+ "Visible": false,
+ "Texts": null,
+ "FilterEnabled": false,
+ "CustomizeText": null
+ },
+ "SearchPanelDto": {
+ "Visible": true,
+ "Width": 160
+ },
+ "GroupPanelDto": {
+ "Visible": true,
+ "AutoExpandAll": false
+ },
+ "SelectionDto": {
+ "Mode": "none",
+ "AllowSelectAll": false,
+ "SelectAllMode": "allPages",
+ "ShowCheckBoxesMode": "always"
+ },
+ "ColumnOptionDto": {
+ "ShowBorders": true,
+ "ShowRowLines": true,
+ "ShowColumnLines": false,
+ "RowAlternationEnabled": true,
+ "AllowColumnReordering": true,
+ "AllowColumnResizing": true,
+ "ColumnResizingMode": "widget",
+ "ColumnAutoWidth": true,
+ "RtlEnabled": false,
+ "ColumnFixingEnabled": true,
+ "ColumnChooserEnabled": true,
+ "ColumnChooserMode": "dragAndDrop",
+ "HoverStateEnabled": false,
+ "ColumnHidingEnabled": true,
+ "FocusedRowEnabled": true,
+ "ShowColumnHeaders": true
+ },
+ "PivotOptionDto": {
+ "ColumnChooserEnabled": false,
+ "AllowFieldDragging": true,
+ "ShowFieldPanel": true,
+ "ShowDataFields": true,
+ "ShowColumnFields": true,
+ "ShowRowFields": true,
+ "ShowFilterFields": true,
+ "ShowChart": false,
+ "ChartHeight": 320,
+ "ChartCommonSeriesType": "bar"
+ },
+ "TreeOptionDto": {
+ "KeyExpr": null,
+ "ParentIdExpr": null,
+ "HasItemsExpr": null,
+ "RootValue": null,
+ "ExpandedRowKeys": [],
+ "AutoExpandAll": false,
+ "RecursiveSelection": false,
+ "TitleExpr": null,
+ "StartExpr": null,
+ "EndExpr": null,
+ "ProgressExpr": null
+ },
+ "GanttOptionDto": {
+ "KeyExpr": null,
+ "ParentIdExpr": null,
+ "HasItemsExpr": null,
+ "RootValue": null,
+ "ExpandedRowKeys": [],
+ "AutoExpandAll": false,
+ "RecursiveSelection": false,
+ "TitleExpr": null,
+ "ScaleType": "weeks",
+ "StartExpr": null,
+ "EndExpr": null,
+ "ProgressExpr": null,
+ "EditingEnabled": false,
+ "AllowTaskAdding": false,
+ "AllowTaskUpdating": false,
+ "AllowTaskResourceUpdating": false,
+ "AllowTaskDeleting": false,
+ "AllowDependencyAdding": false,
+ "AllowDependencyDeleting": false,
+ "AllowResourceAdding": false,
+ "AllowResourceUpdating": false,
+ "AllowResourceDeleting": false
+ },
+ "SchedulerOptionDto": {
+ "TextExpr": null,
+ "UserNameExpr": null,
+ "DescriptionExpr": null,
+ "StartDateExpr": null,
+ "EndDateExpr": null,
+ "AllDayExpr": null,
+ "RecurrenceRuleExpr": null,
+ "RecurrenceExceptionExpr": null,
+ "StartDayHour": 8,
+ "EndDayHour": 20,
+ "DefaultView": "week",
+ "ShowAllDayPanel": true,
+ "CellDuration": 30,
+ "FirstDayOfWeek": 1,
+ "CrossScrollingEnabled": false,
+ "AllowResizing": false,
+ "AllowDragging": false,
+ "AllowDeleting": false,
+ "AllowEditing": false,
+ "AllowAdding": false
+ },
+ "TodoOptionDto": {
+ "TitleExpr": null,
+ "StatusExpr": null,
+ "DescriptionExpr": null,
+ "AnalysisExpr": null,
+ "DueDateExpr": null,
+ "TagExpr": null,
+ "AssigneeExpr": null,
+ "PriorityExpr": null,
+ "CompletedExpr": null,
+ "OrderExpr": null,
+ "TimesheetExpr": null,
+ "SubTaskExpr": null,
+ "StatusOrder": null,
+ "AllowDragging": true
+ },
+ "PagerOptionDto": {
+ "Visible": true,
+ "ShowPageSizeSelector": true,
+ "ShowInfo": false,
+ "ShowNavigationButtons": true,
+ "AllowedPageSizes": "10,20,50,100",
+ "InfoText": "Page {0} of {1} ({2} items)",
+ "DisplayMode": "adaptive",
+ "ScrollingMode": "standard",
+ "LoadPanelEnabled": "auto",
+ "LoadPanelText": "Loading..."
+ },
+ "EditingOptionDto": {
+ "Mode": "popup",
+ "RefreshMode": "full",
+ "AllowUpdating": true,
+ "AllowDetail": false,
+ "AllowDeleting": true,
+ "AllowAllDeleting": false,
+ "AllowAdding": true,
+ "AllowDuplicate": false,
+ "UseIcons": false,
+ "ConfirmDelete": true,
+ "NewRowPosition": "viewportTop",
+ "SelectTextOnEditStart": false,
+ "StartEditAction": "click",
+ "EditColumnName": null,
+ "Popup": {
+ "Title": "App.Definitions.Approver.Title",
+ "ShowTitle": true,
+ "Width": 500,
+ "Height": 450,
+ "FullScreen": false,
+ "HideOnOutsideClick": true,
+ "ResizeEnabled": true,
+ "DragEnabled": true,
+ "RestorePosition": true,
+ "Position": "center"
+ },
+ "SendOnlyChangedFormValuesUpdate": false,
+ "AddPageUrl": null,
+ "AddDialogName": null,
+ "AddDialogParameters": null
+ },
+ "EditingFormDto": [
+ {
+ "Order": 1,
+ "ItemType": "group",
+ "Caption": "",
+ "ColCount": 1,
+ "ColSpan": 1
+ }
+ ],
+ "PermissionDto": {
+ "C": "App.Definitions.Approver.Create",
+ "R": "App.Definitions.Approver",
+ "U": "App.Definitions.Approver.Update",
+ "D": "App.Definitions.Approver.Delete",
+ "E": "App.Definitions.Approver.Export",
+ "I": "App.Definitions.Approver.Import",
+ "N": "App.Definitions.Approver.Note"
+ },
+ "CommandColumnDto": [],
+ "StateStoringDto": {
+ "Enabled": true,
+ "Type": "custom",
+ "StorageKey": "listFormGridStorage-App.Definitions.Approver",
+ "SavingTimeout": 5000
+ },
+ "CustomJsSources": [],
+ "CustomStyleSources": [],
+ "UpdateServiceAddress": "list-form-data/update",
+ "InsertServiceAddress": "list-form-data/insert",
+ "DeleteServiceAddress": "list-form-data/delete",
+ "IsTenant": true,
+ "IsBranch": false,
+ "IsOrganizationUnit": false,
+ "ListFormType": "List",
+ "IsSubForm": false,
+ "ShowNote": false,
+ "SubFormsListFormType": "Form",
+ "SubFormsDto": [],
+ "ExtraFilterDto": [],
+ "LayoutDto": {
+ "Grid": true,
+ "Card": true,
+ "Pivot": true,
+ "Chart": true,
+ "Tree": false,
+ "Gantt": false,
+ "Scheduler": false,
+ "Todo": false,
+ "DefaultLayout": "grid"
+ },
+ "WorkflowDto": {
+ "ApprovalUserFieldName": null,
+ "ApprovalDateFieldName": null,
+ "ApprovalStatusFieldName": null,
+ "ApprovalDescriptionFieldName": null,
+ "ApprovalIsFilterUserName": false,
+ "ApprovalIsResetWorkflow": false,
+ "Criteria": []
+ },
+ "UserId": null,
+ "RoleId": null,
+ "CommonDto": {
+ "AdjustOnZoom": true,
+ "ContainerBackgroundColor": "#FFFFFF",
+ "Palette": "Material",
+ "PaletteExtensionMode": "blend",
+ "DefaultPane": null,
+ "Disabled": false,
+ "Theme": "generic.light"
+ },
+ "AdaptivelayoutDto": {
+ "Height": 80,
+ "Width": 80,
+ "KeepLabels": true
+ },
+ "AnimationDto": {
+ "Duration": 1000,
+ "Easing": "easeOutCubic",
+ "Enabled": true,
+ "MaxPointCountSupported": 300
+ },
+ "AnnotationsDto": [],
+ "ArgumentAxisDto": {
+ "ArgumentType": null,
+ "AggregationInterval": null,
+ "Grid": {
+ "Color": "#d3d3d3",
+ "Visible": false,
+ "Width": 1
+ },
+ "HoverMode": "none",
+ "Label": {
+ "DisplayMode": "standard",
+ "RotationAngle": 90,
+ "OverlappingBehavior": "hide"
+ },
+ "Position": "bottom",
+ "Title": null,
+ "Visible": true,
+ "Width": 1,
+ "WorkdaysOnly": false
+ },
+ "CommonAnnotationSettingsDto": {
+ "Argument": null,
+ "Border": {
+ "Color": "#d3d3d3",
+ "CornerRadius": 0,
+ "DashStyle": "solid",
+ "Visible": false,
+ "Width": 1
+ },
+ "Color": "#ffffff",
+ "Description": null,
+ "Font": {
+ "Color": "#FFFFFF",
+ "Family": "\"Segoe UI\", \"Helvetica Neue\", \"Trebuchet MS\", Verdana, sans-serif",
+ "Size": 12,
+ "Weight": 400
+ },
+ "Height": -1,
+ "Image": null,
+ "OffsetX": -1,
+ "OffsetY": -1,
+ "PaddingLeftRight": 10,
+ "PaddingTopBottom": 10,
+ "Series": null,
+ "Text": null,
+ "TooltipEnabled": true,
+ "Type": null,
+ "Value": null,
+ "Width": 0,
+ "WordWrap": "normal",
+ "X": 0,
+ "Y": 0
+ },
+ "CommonAxisSettingsDto": {
+ "Grid": {
+ "Color": "#d3d3d3",
+ "Visible": false,
+ "Width": 1
+ },
+ "Title": null,
+ "Visible": true,
+ "Width": 1
+ },
+ "CommonPaneSettingsDto": {
+ "BackgroundColor": null
+ },
+ "CommonSeriesSettingsDto": {
+ "ArgumentField": "arg",
+ "Axis": null,
+ "BarOverlapGroup": null,
+ "BarPadding": 0,
+ "BarWidth": 0,
+ "Color": null,
+ "CornerRadius": 0,
+ "DashStyle": "solid",
+ "IgnoreEmptyPoints": false,
+ "Pane": null,
+ "RangeValue1Field": "val1",
+ "RangeValue2Field": "val2",
+ "SelectionMode": "none",
+ "ShowInLegend": true,
+ "Type": null,
+ "ValueField": null,
+ "Visible": true,
+ "Width": 2,
+ "Label": null
+ },
+ "CrosshairDto": {
+ "Color": "#f05b41",
+ "DashStyle": "dot",
+ "Enabled": false,
+ "Width": 1,
+ "HorizontalLine": {
+ "Color": "#f05b41",
+ "DashStyle": "dot",
+ "Label": {
+ "BackgroundColor": "#f05b41",
+ "CustomizeText": null,
+ "Font": {
+ "Color": "#FFFFFF",
+ "Family": "\"Segoe UI\", \"Helvetica Neue\", \"Trebuchet MS\", Verdana, sans-serif",
+ "Size": 12,
+ "Weight": 400
+ },
+ "Visible": false,
+ "Format": null
+ },
+ "Visible": true,
+ "Width": 1
+ },
+ "Label": {
+ "BackgroundColor": "#f05b41",
+ "CustomizeText": null,
+ "Font": {
+ "Color": "#FFFFFF",
+ "Family": "\"Segoe UI\", \"Helvetica Neue\", \"Trebuchet MS\", Verdana, sans-serif",
+ "Size": 12,
+ "Weight": 400
+ },
+ "Visible": false,
+ "Format": null
+ },
+ "VerticalLine": {
+ "Color": "#f05b41",
+ "DashStyle": "dot",
+ "Label": {
+ "BackgroundColor": "#f05b41",
+ "CustomizeText": null,
+ "Font": {
+ "Color": "#FFFFFF",
+ "Family": "\"Segoe UI\", \"Helvetica Neue\", \"Trebuchet MS\", Verdana, sans-serif",
+ "Size": 12,
+ "Weight": 400
+ },
+ "Visible": false,
+ "Format": null
+ },
+ "Visible": true,
+ "Width": 1
+ }
+ },
+ "ExportDto": {
+ "BackgroundColor": "#FFFFFF",
+ "Enabled": true,
+ "AllowExportSelectedData": false,
+ "Margin": 10,
+ "PrintingEnabled": true
+ },
+ "LegendDto": {
+ "BackgroundColor": null,
+ "Border": {
+ "Color": "#d3d3d3",
+ "CornerRadius": 0,
+ "DashStyle": "solid",
+ "Visible": false,
+ "Width": 1
+ },
+ "ColumnCount": 0,
+ "Orientation": "vertical",
+ "Position": "outside",
+ "RowCount": 0,
+ "Title": null,
+ "Visible": true
+ },
+ "MarginDto": {
+ "Bottom": 0,
+ "Left": 0,
+ "Right": 0,
+ "Top": 0
+ },
+ "PanesDto": [],
+ "ScrollBarDto": {
+ "Color": "gray",
+ "Offset": 5,
+ "Position": "top",
+ "Visible": false,
+ "Width": 10
+ },
+ "SeriesDto": [],
+ "SizeDto": {
+ "UseSize": false,
+ "Width": 400,
+ "Height": 200
+ },
+ "TitleDto": {
+ "Text": null,
+ "VerticalAlignment": "top",
+ "HorizontalAlignment": "center",
+ "Subtitle": null,
+ "TextOverflow": "ellipsis",
+ "WordWrap": null
+ },
+ "TooltipDto": {
+ "ArgumentFormat": null,
+ "ArrowLength": 10,
+ "Border": {
+ "Color": "#d3d3d3",
+ "CornerRadius": 0,
+ "DashStyle": "solid",
+ "Visible": false,
+ "Width": 1
+ },
+ "Color": "#ffffff",
+ "Enabled": false,
+ "Font": {
+ "Color": "#000000",
+ "Family": "\"Segoe UI\", \"Helvetica Neue\", \"Trebuchet MS\", Verdana, sans-serif",
+ "Size": 12,
+ "Weight": 400
+ },
+ "Format": null,
+ "Location": "center",
+ "PaddingLeftRight": 18,
+ "PaddingTopBottom": 15,
+ "Shared": false
+ },
+ "ValueAxisDto": [],
+ "ZoomAndPanDto": {
+ "AllowMouseWheel": true,
+ "AllowTouchGestures": true,
+ "ArgumentAxis": "none",
+ "DragToZoom": false,
+ "PanKey": "shift",
+ "ValueAxis": "none",
+ "DragBoxStyle": {
+ "Color": null,
+ "Opacity": 0
+ }
+ },
+ "LastModificationTime": null,
+ "LastModifierId": null,
+ "CreationTime": "0001-01-01T00:00:00",
+ "CreatorId": null,
+ "Id": "00000000-0000-0000-0000-000000000000"
+ },
+ "Fields": [
+ {
+ "EditType": null,
+ "ListFormCode": "App.Definitions.Approver",
+ "RoleId": null,
+ "UserId": null,
+ "ColumnJoinTableDto": {
+ "JoinType": null,
+ "TableName": null,
+ "JoinFieldName": null,
+ "BaseTableJoinFieldName": null,
+ "SelectFieldName": null,
+ "FieldNameAlias": null,
+ "JoinCondition2": "AND",
+ "JoinFieldName2": null,
+ "BaseTableJoinFieldName2_OrValue": null
+ },
+ "FieldName": "Id",
+ "CaptionName": "App.Listform.ListformField.Id",
+ "PlaceHolder": null,
+ "ReadOnly": false,
+ "Visible": false,
+ "IsActive": true,
+ "Width": 0,
+ "ListOrderNo": 1,
+ "SourceDbType": 9,
+ "CultureName": "en",
+ "DataType": "string",
+ "SortIndex": 0,
+ "SortDirection": null,
+ "AllowSearch": true,
+ "AllowEditing": true,
+ "AllowAdding": true,
+ "ColumnCssClass": null,
+ "ColumnCssValue": null,
+ "BandName": null,
+ "ColumnFilterDto": {
+ "AllowFiltering": true,
+ "FilterOperations": null,
+ "SelectedFilterOperation": null,
+ "FilterValue": null
+ },
+ "ColumnHeaderDto": {
+ "AllowHeaderFiltering": true,
+ "AllowSearch": false,
+ "DataSource": null,
+ "DataSourceString": ""
+ },
+ "ColumnGroupingDto": {
+ "AllowGrouping": true,
+ "GroupIndex": null,
+ "AutoExpandGroup": false
+ },
+ "ColumnCustomizationDto": {
+ "Fixed": false,
+ "FixedPosition": "left",
+ "AllowReordering": true
+ },
+ "ColumnTotalSummaryDto": {
+ "SummaryType": null,
+ "ValueFormat": null,
+ "ShowInGroupFooter": false,
+ "AlignByColumn": false,
+ "DisplayFormat": null,
+ "ShowInColumn": null
+ },
+ "ColumnGroupSummaryDto": {
+ "SummaryType": null,
+ "ValueFormat": null,
+ "ShowInGroupFooter": false,
+ "AlignByColumn": false,
+ "DisplayFormat": null,
+ "ShowInColumn": null
+ },
+ "LookupDto": {
+ "DataSourceType": 0,
+ "ValueExpr": "Key",
+ "DisplayExpr": "Name",
+ "CascadeRelationField": null,
+ "CascadeFilterOperator": "=",
+ "CascadeParentFields": null,
+ "CascadeEmptyFields": null,
+ "LookupQuery": null
+ },
+ "ValidationRuleDto": [],
+ "ColumnStylingDto": [],
+ "PermissionDto": {
+ "Deny": false,
+ "C": "App.Definitions.Approver.Create",
+ "R": "App.Definitions.Approver",
+ "U": "App.Definitions.Approver.Update",
+ "E": true,
+ "I": true
+ },
+ "CanRead": false,
+ "CanCreate": false,
+ "CanUpdate": false,
+ "CanExport": false,
+ "DefaultValue": null,
+ "DefaultValueType": 0,
+ "PivotSettingsDto": {
+ "IsPivot": true,
+ "Expanded": false,
+ "SortOrder": "asc",
+ "Area": "filter",
+ "Format": null,
+ "SummaryType": null,
+ "GroupInterval": "",
+ "WordWrapEnabled": false
+ },
+ "Alignment": "left",
+ "Format": null,
+ "EditOrderNo": null,
+ "EditGroupOrderNo": null,
+ "EditorType2": "dxTextBox",
+ "ColSpan": 1,
+ "EditorOptions": null,
+ "GridBoxOptions": null,
+ "TagBoxOptions": null,
+ "ImageUploadOptions": null,
+ "EditorScript": null,
+ "LastModificationTime": null,
+ "LastModifierId": null,
+ "CreationTime": "0001-01-01T00:00:00",
+ "CreatorId": null,
+ "Id": "00000000-0000-0000-0000-000000000000"
+ },
+ {
+ "EditType": null,
+ "ListFormCode": "App.Definitions.Approver",
+ "RoleId": null,
+ "UserId": null,
+ "ColumnJoinTableDto": {
+ "JoinType": null,
+ "TableName": null,
+ "JoinFieldName": null,
+ "BaseTableJoinFieldName": null,
+ "SelectFieldName": null,
+ "FieldNameAlias": null,
+ "JoinCondition2": "AND",
+ "JoinFieldName2": null,
+ "BaseTableJoinFieldName2_OrValue": null
+ },
+ "FieldName": "DepartmentId",
+ "CaptionName": "App.Listform.ListformField.Department",
+ "PlaceHolder": null,
+ "ReadOnly": false,
+ "Visible": true,
+ "IsActive": true,
+ "Width": 0,
+ "ListOrderNo": 2,
+ "SourceDbType": 9,
+ "CultureName": "en",
+ "DataType": "string",
+ "SortIndex": 0,
+ "SortDirection": null,
+ "AllowSearch": true,
+ "AllowEditing": true,
+ "AllowAdding": true,
+ "ColumnCssClass": null,
+ "ColumnCssValue": null,
+ "BandName": null,
+ "ColumnFilterDto": {
+ "AllowFiltering": true,
+ "FilterOperations": null,
+ "SelectedFilterOperation": null,
+ "FilterValue": null
+ },
+ "ColumnHeaderDto": {
+ "AllowHeaderFiltering": true,
+ "AllowSearch": false,
+ "DataSource": null,
+ "DataSourceString": ""
+ },
+ "ColumnGroupingDto": {
+ "AllowGrouping": true,
+ "GroupIndex": null,
+ "AutoExpandGroup": false
+ },
+ "ColumnCustomizationDto": {
+ "Fixed": false,
+ "FixedPosition": "left",
+ "AllowReordering": true
+ },
+ "ColumnTotalSummaryDto": {
+ "SummaryType": null,
+ "ValueFormat": null,
+ "ShowInGroupFooter": false,
+ "AlignByColumn": false,
+ "DisplayFormat": null,
+ "ShowInColumn": null
+ },
+ "ColumnGroupSummaryDto": {
+ "SummaryType": null,
+ "ValueFormat": null,
+ "ShowInGroupFooter": false,
+ "AlignByColumn": false,
+ "DisplayFormat": null,
+ "ShowInColumn": null
+ },
+ "LookupDto": {
+ "DataSourceType": 2,
+ "ValueExpr": "Key",
+ "DisplayExpr": "Name",
+ "CascadeRelationField": null,
+ "CascadeFilterOperator": "=",
+ "CascadeParentFields": null,
+ "CascadeEmptyFields": null,
+ "LookupQuery": "SELECT d.Id AS [Key], CONCAT(b.Name, ' - ', d.Name) AS [Name] FROM Hr_T_Department d INNER JOIN Sas_T_Branch b ON b.Id = d.BranchId AND b.IsActive = 1 AND b.IsDeleted = 'false' WHERE d.IsDeleted = 'false' ORDER BY b.Name, d.Name"
+ },
+ "ValidationRuleDto": [
+ {
+ "Type": "required",
+ "Message": null,
+ "IgnoreEmptyValue": false,
+ "Reevaluate": true,
+ "ComparisonType": "",
+ "Pattern": "",
+ "Max": null,
+ "Min": null,
+ "Trim": true
+ }
+ ],
+ "ColumnStylingDto": [],
+ "PermissionDto": {
+ "Deny": false,
+ "C": "App.Definitions.Approver.Create",
+ "R": "App.Definitions.Approver",
+ "U": "App.Definitions.Approver.Update",
+ "E": true,
+ "I": true
+ },
+ "CanRead": false,
+ "CanCreate": false,
+ "CanUpdate": false,
+ "CanExport": false,
+ "DefaultValue": null,
+ "DefaultValueType": 0,
+ "PivotSettingsDto": {
+ "IsPivot": true,
+ "Expanded": false,
+ "SortOrder": "asc",
+ "Area": "filter",
+ "Format": null,
+ "SummaryType": null,
+ "GroupInterval": "",
+ "WordWrapEnabled": false
+ },
+ "Alignment": "left",
+ "Format": null,
+ "EditOrderNo": 1,
+ "EditGroupOrderNo": 1,
+ "EditorType2": "dxSelectBox",
+ "ColSpan": 1,
+ "EditorOptions": "{\"showClearButton\":true,\"searchEnabled\":true}",
+ "GridBoxOptions": null,
+ "TagBoxOptions": null,
+ "ImageUploadOptions": null,
+ "EditorScript": null,
+ "LastModificationTime": null,
+ "LastModifierId": null,
+ "CreationTime": "0001-01-01T00:00:00",
+ "CreatorId": null,
+ "Id": "00000000-0000-0000-0000-000000000000"
+ },
+ {
+ "EditType": null,
+ "ListFormCode": "App.Definitions.Approver",
+ "RoleId": null,
+ "UserId": null,
+ "ColumnJoinTableDto": {
+ "JoinType": null,
+ "TableName": null,
+ "JoinFieldName": null,
+ "BaseTableJoinFieldName": null,
+ "SelectFieldName": null,
+ "FieldNameAlias": null,
+ "JoinCondition2": "AND",
+ "JoinFieldName2": null,
+ "BaseTableJoinFieldName2_OrValue": null
+ },
+ "FieldName": "ApprovalArea",
+ "CaptionName": "App.Listform.ListformField.ApprovalArea",
+ "PlaceHolder": null,
+ "ReadOnly": false,
+ "Visible": true,
+ "IsActive": true,
+ "Width": 0,
+ "ListOrderNo": 3,
+ "SourceDbType": 16,
+ "CultureName": "en",
+ "DataType": "string",
+ "SortIndex": 0,
+ "SortDirection": null,
+ "AllowSearch": true,
+ "AllowEditing": true,
+ "AllowAdding": true,
+ "ColumnCssClass": null,
+ "ColumnCssValue": null,
+ "BandName": null,
+ "ColumnFilterDto": {
+ "AllowFiltering": true,
+ "FilterOperations": null,
+ "SelectedFilterOperation": null,
+ "FilterValue": null
+ },
+ "ColumnHeaderDto": {
+ "AllowHeaderFiltering": true,
+ "AllowSearch": false,
+ "DataSource": null,
+ "DataSourceString": ""
+ },
+ "ColumnGroupingDto": {
+ "AllowGrouping": true,
+ "GroupIndex": null,
+ "AutoExpandGroup": false
+ },
+ "ColumnCustomizationDto": {
+ "Fixed": false,
+ "FixedPosition": "left",
+ "AllowReordering": true
+ },
+ "ColumnTotalSummaryDto": {
+ "SummaryType": null,
+ "ValueFormat": null,
+ "ShowInGroupFooter": false,
+ "AlignByColumn": false,
+ "DisplayFormat": null,
+ "ShowInColumn": null
+ },
+ "ColumnGroupSummaryDto": {
+ "SummaryType": null,
+ "ValueFormat": null,
+ "ShowInGroupFooter": false,
+ "AlignByColumn": false,
+ "DisplayFormat": null,
+ "ShowInColumn": null
+ },
+ "LookupDto": {
+ "DataSourceType": 1,
+ "ValueExpr": "key",
+ "DisplayExpr": "name",
+ "CascadeRelationField": null,
+ "CascadeFilterOperator": "=",
+ "CascadeParentFields": null,
+ "CascadeEmptyFields": null,
+ "LookupQuery": "[{\"key\":\"Purchase\",\"name\":\"App.StaticLookup.Purchase\"},{\"key\":\"Warehouse\",\"name\":\"App.StaticLookup.Warehouse\"},{\"key\":\"HumanResources\",\"name\":\"App.StaticLookup.HumanResources\"},{\"key\":\"Finance\",\"name\":\"App.StaticLookup.Finance\"}]"
+ },
+ "ValidationRuleDto": [
+ {
+ "Type": "required",
+ "Message": null,
+ "IgnoreEmptyValue": false,
+ "Reevaluate": true,
+ "ComparisonType": "",
+ "Pattern": "",
+ "Max": null,
+ "Min": null,
+ "Trim": true
+ }
+ ],
+ "ColumnStylingDto": [],
+ "PermissionDto": {
+ "Deny": false,
+ "C": "App.Definitions.Approver.Create",
+ "R": "App.Definitions.Approver",
+ "U": "App.Definitions.Approver.Update",
+ "E": true,
+ "I": true
+ },
+ "CanRead": false,
+ "CanCreate": false,
+ "CanUpdate": false,
+ "CanExport": false,
+ "DefaultValue": null,
+ "DefaultValueType": 0,
+ "PivotSettingsDto": {
+ "IsPivot": true,
+ "Expanded": false,
+ "SortOrder": "asc",
+ "Area": "filter",
+ "Format": null,
+ "SummaryType": null,
+ "GroupInterval": "",
+ "WordWrapEnabled": false
+ },
+ "Alignment": "left",
+ "Format": null,
+ "EditOrderNo": 2,
+ "EditGroupOrderNo": 1,
+ "EditorType2": "dxSelectBox",
+ "ColSpan": 1,
+ "EditorOptions": null,
+ "GridBoxOptions": null,
+ "TagBoxOptions": null,
+ "ImageUploadOptions": null,
+ "EditorScript": null,
+ "LastModificationTime": null,
+ "LastModifierId": null,
+ "CreationTime": "0001-01-01T00:00:00",
+ "CreatorId": null,
+ "Id": "00000000-0000-0000-0000-000000000000"
+ },
+ {
+ "EditType": null,
+ "ListFormCode": "App.Definitions.Approver",
+ "RoleId": null,
+ "UserId": null,
+ "ColumnJoinTableDto": {
+ "JoinType": null,
+ "TableName": null,
+ "JoinFieldName": null,
+ "BaseTableJoinFieldName": null,
+ "SelectFieldName": null,
+ "FieldNameAlias": null,
+ "JoinCondition2": "AND",
+ "JoinFieldName2": null,
+ "BaseTableJoinFieldName2_OrValue": null
+ },
+ "FieldName": "ApproverUserId",
+ "CaptionName": "App.Listform.ListformField.ApproverUser",
+ "PlaceHolder": null,
+ "ReadOnly": false,
+ "Visible": true,
+ "IsActive": true,
+ "Width": 0,
+ "ListOrderNo": 4,
+ "SourceDbType": 9,
+ "CultureName": "en",
+ "DataType": "string",
+ "SortIndex": 0,
+ "SortDirection": null,
+ "AllowSearch": true,
+ "AllowEditing": true,
+ "AllowAdding": true,
+ "ColumnCssClass": null,
+ "ColumnCssValue": null,
+ "BandName": null,
+ "ColumnFilterDto": {
+ "AllowFiltering": true,
+ "FilterOperations": null,
+ "SelectedFilterOperation": null,
+ "FilterValue": null
+ },
+ "ColumnHeaderDto": {
+ "AllowHeaderFiltering": true,
+ "AllowSearch": false,
+ "DataSource": null,
+ "DataSourceString": ""
+ },
+ "ColumnGroupingDto": {
+ "AllowGrouping": true,
+ "GroupIndex": null,
+ "AutoExpandGroup": false
+ },
+ "ColumnCustomizationDto": {
+ "Fixed": false,
+ "FixedPosition": "left",
+ "AllowReordering": true
+ },
+ "ColumnTotalSummaryDto": {
+ "SummaryType": null,
+ "ValueFormat": null,
+ "ShowInGroupFooter": false,
+ "AlignByColumn": false,
+ "DisplayFormat": null,
+ "ShowInColumn": null
+ },
+ "ColumnGroupSummaryDto": {
+ "SummaryType": null,
+ "ValueFormat": null,
+ "ShowInGroupFooter": false,
+ "AlignByColumn": false,
+ "DisplayFormat": null,
+ "ShowInColumn": null
+ },
+ "LookupDto": {
+ "DataSourceType": 2,
+ "ValueExpr": "Key",
+ "DisplayExpr": "Name",
+ "CascadeRelationField": null,
+ "CascadeFilterOperator": "=",
+ "CascadeParentFields": null,
+ "CascadeEmptyFields": null,
+ "LookupQuery": "SELECT Id AS [Key], CONCAT(Name, ' ', Surname) AS [Name] FROM AbpUsers WHERE IsDeleted = 'false' AND IsActive = 1 ORDER BY Name, Surname"
+ },
+ "ValidationRuleDto": [
+ {
+ "Type": "required",
+ "Message": null,
+ "IgnoreEmptyValue": false,
+ "Reevaluate": true,
+ "ComparisonType": "",
+ "Pattern": "",
+ "Max": null,
+ "Min": null,
+ "Trim": true
+ }
+ ],
+ "ColumnStylingDto": [],
+ "PermissionDto": {
+ "Deny": false,
+ "C": "App.Definitions.Approver.Create",
+ "R": "App.Definitions.Approver",
+ "U": "App.Definitions.Approver.Update",
+ "E": true,
+ "I": true
+ },
+ "CanRead": false,
+ "CanCreate": false,
+ "CanUpdate": false,
+ "CanExport": false,
+ "DefaultValue": null,
+ "DefaultValueType": 0,
+ "PivotSettingsDto": {
+ "IsPivot": true,
+ "Expanded": false,
+ "SortOrder": "asc",
+ "Area": "filter",
+ "Format": null,
+ "SummaryType": null,
+ "GroupInterval": "",
+ "WordWrapEnabled": false
+ },
+ "Alignment": "left",
+ "Format": null,
+ "EditOrderNo": 3,
+ "EditGroupOrderNo": 1,
+ "EditorType2": "dxSelectBox",
+ "ColSpan": 1,
+ "EditorOptions": "{\"showClearButton\":true,\"searchEnabled\":true}",
+ "GridBoxOptions": null,
+ "TagBoxOptions": null,
+ "ImageUploadOptions": null,
+ "EditorScript": null,
+ "LastModificationTime": null,
+ "LastModifierId": null,
+ "CreationTime": "0001-01-01T00:00:00",
+ "CreatorId": null,
+ "Id": "00000000-0000-0000-0000-000000000000"
+ },
+ {
+ "EditType": null,
+ "ListFormCode": "App.Definitions.Approver",
+ "RoleId": null,
+ "UserId": null,
+ "ColumnJoinTableDto": {
+ "JoinType": null,
+ "TableName": null,
+ "JoinFieldName": null,
+ "BaseTableJoinFieldName": null,
+ "SelectFieldName": null,
+ "FieldNameAlias": null,
+ "JoinCondition2": "AND",
+ "JoinFieldName2": null,
+ "BaseTableJoinFieldName2_OrValue": null
+ },
+ "FieldName": "IsActive",
+ "CaptionName": "App.Listform.ListformField.IsActive",
+ "PlaceHolder": null,
+ "ReadOnly": false,
+ "Visible": true,
+ "IsActive": true,
+ "Width": 0,
+ "ListOrderNo": 5,
+ "SourceDbType": 3,
+ "CultureName": "en",
+ "DataType": "boolean",
+ "SortIndex": 0,
+ "SortDirection": null,
+ "AllowSearch": true,
+ "AllowEditing": true,
+ "AllowAdding": true,
+ "ColumnCssClass": null,
+ "ColumnCssValue": null,
+ "BandName": null,
+ "ColumnFilterDto": {
+ "AllowFiltering": true,
+ "FilterOperations": null,
+ "SelectedFilterOperation": null,
+ "FilterValue": null
+ },
+ "ColumnHeaderDto": {
+ "AllowHeaderFiltering": true,
+ "AllowSearch": false,
+ "DataSource": null,
+ "DataSourceString": ""
+ },
+ "ColumnGroupingDto": {
+ "AllowGrouping": true,
+ "GroupIndex": null,
+ "AutoExpandGroup": false
+ },
+ "ColumnCustomizationDto": {
+ "Fixed": false,
+ "FixedPosition": "left",
+ "AllowReordering": true
+ },
+ "ColumnTotalSummaryDto": {
+ "SummaryType": null,
+ "ValueFormat": null,
+ "ShowInGroupFooter": false,
+ "AlignByColumn": false,
+ "DisplayFormat": null,
+ "ShowInColumn": null
+ },
+ "ColumnGroupSummaryDto": {
+ "SummaryType": null,
+ "ValueFormat": null,
+ "ShowInGroupFooter": false,
+ "AlignByColumn": false,
+ "DisplayFormat": null,
+ "ShowInColumn": null
+ },
+ "LookupDto": {
+ "DataSourceType": 0,
+ "ValueExpr": "Key",
+ "DisplayExpr": "Name",
+ "CascadeRelationField": null,
+ "CascadeFilterOperator": "=",
+ "CascadeParentFields": null,
+ "CascadeEmptyFields": null,
+ "LookupQuery": null
+ },
+ "ValidationRuleDto": [
+ {
+ "Type": "required",
+ "Message": null,
+ "IgnoreEmptyValue": false,
+ "Reevaluate": true,
+ "ComparisonType": "",
+ "Pattern": "",
+ "Max": null,
+ "Min": null,
+ "Trim": true
+ }
+ ],
+ "ColumnStylingDto": [],
+ "PermissionDto": {
+ "Deny": false,
+ "C": "App.Definitions.Approver.Create",
+ "R": "App.Definitions.Approver",
+ "U": "App.Definitions.Approver.Update",
+ "E": true,
+ "I": true
+ },
+ "CanRead": false,
+ "CanCreate": false,
+ "CanUpdate": false,
+ "CanExport": false,
+ "DefaultValue": null,
+ "DefaultValueType": 0,
+ "PivotSettingsDto": {
+ "IsPivot": true,
+ "Expanded": false,
+ "SortOrder": "asc",
+ "Area": "filter",
+ "Format": null,
+ "SummaryType": null,
+ "GroupInterval": "",
+ "WordWrapEnabled": false
+ },
+ "Alignment": "left",
+ "Format": null,
+ "EditOrderNo": 4,
+ "EditGroupOrderNo": 1,
+ "EditorType2": "dxCheckBox",
+ "ColSpan": 1,
+ "EditorOptions": null,
+ "GridBoxOptions": null,
+ "TagBoxOptions": null,
+ "ImageUploadOptions": null,
+ "EditorScript": null,
+ "LastModificationTime": null,
+ "LastModifierId": null,
+ "CreationTime": "0001-01-01T00:00:00",
+ "CreatorId": null,
+ "Id": "00000000-0000-0000-0000-000000000000"
+ }
+ ],
+ "IsDeletedField": true,
+ "IsCreatedField": true,
+ "InsertedRecords": {
+ "LanguageKeys": [
+ "App.Definitions.Approver",
+ "App.Definitions.Approver.Title",
+ "App.Definitions.Approver.Desc",
+ "App.StaticLookup.Purchase",
+ "App.StaticLookup.Warehouse",
+ "App.StaticLookup.HumanResources",
+ "App.StaticLookup.Finance",
+ "App.Listform.ListformField.ApprovalArea",
+ "App.Listform.ListformField.ApproverUser"
+ ],
+ "PermissionGroupNames": [],
+ "PermissionNames": [
+ "App.Definitions.Approver",
+ "App.Definitions.Approver.Create",
+ "App.Definitions.Approver.Update",
+ "App.Definitions.Approver.Delete",
+ "App.Definitions.Approver.Export",
+ "App.Definitions.Approver.Import",
+ "App.Definitions.Approver.Note"
+ ],
+ "MenuCodes": [
+ "App.Definitions.Approver"
+ ],
+ "DataSourceCodes": [],
+ "ModuleIds": []
+ },
+ "DevRequest": {
+ "Id": "fc6d0fbb-6b04-4d15-9d27-fec98e5c30fb",
+ "Title": "Satınalma Onaycıları"
+ }
+}
\ No newline at end of file