diff --git a/.github/instructions/lowcode.instructions.md b/.github/instructions/lowcode.instructions.md index 5ce14e47..8b64cadc 100644 --- a/.github/instructions/lowcode.instructions.md +++ b/.github/instructions/lowcode.instructions.md @@ -546,6 +546,10 @@ eklenen dosya) bu satırlar ekranla birlikte seed edilir; migrate çalıştığ Kurallar: - Dosyayı elle yazma; `seedRows` alan adlarını ekranın alanlarına göre doğrular, bilinmeyen alanı reddeder. + Migrate satırı yalnızca ekranın alanı olan kolonlara yazar; aynı tablonun alt form sekmesindeki + kolon (ör. `Form` tipi detay sekmesi) ana ekranın satırından yazılmaz. Ret mesajı, kolonun aynı + tabloyu okuyan hangi wizard ekranında alan olduğunu wizard dosyalarından bulup yazar: kolonu ana + ekrana alan olarak ekle (`IncludeInEditingForm: false`) ya da satırdan çıkar. - Görsel yalnızca ekranın şablonu değildir: içinde görünen **her satır** okunur ve demo veri olarak eklenir (standing default 6'daki "piksel sözleşmesi değildir" kuralı düzen içindir, veri için değil). - Görselden okunamayan değer uydurulmaz: zorunlu alan boşsa kullanıcıya sor. @@ -1988,7 +1992,7 @@ işlemde siler. Onay diyaloğu sırayı ve tabloları gösterir: kaynağı kaydı silinmeden önce çözülür. Tablo seçmek yine `App.SqlQueryManager` ister. - **Talebin Custom Endpoint'leri de gider:** tablo talebe aitse (`create_table`/tasarımcı scripti var, talep dışında ekran kullanmıyor) onu sorgulayan Custom Endpoint'ler tabloyu tutmaz; veritabanından - ve `data/App.DeveloperKit.CustomEndpoints.json`'dan (migrate edilmemiş satır dahil) silinir — + ve `data/App.DeveloperKit.CustomEndpoints/` klasöründeki satır dosyasından (migrate edilmemiş satır dahil) silinir — tablo seçilmese de (`WizardDeleteTableDto.CustomEndpoints`, `WizardTableCleaner.DeleteCustomEndpointsAsync`). Diyalog bunları tablonun altında listeler. Tek wizard silmede endpoint yine tabloyu "kullanımda" tutar. - Rapor tek wizard silmeyle aynı sözleşmedir (`WizardDeleteResultDto`, bütün wizard'ların kayıtları @@ -3956,9 +3960,10 @@ Endpoint **tanımlarını** düzenleme yetkileri ListForm ekranının `App.DeveloperKit.CustomEndpoints{,.Create,.Update,.Delete}` yetkileridir — çağırma yetkilerinden (`.Get/.Post/.Put/.Remove` + `PermissionsJson`) ayrıdır. -**Seed:** `configs/seeds/data/App.DeveloperKit.CustomEndpoints.json` (§9.15). Ekranın +**Seed:** `configs/seeds/data/App.DeveloperKit.CustomEndpoints/{Id}.json` (§9.15) — ekran klasör +modundadır, her endpoint kendi satır dosyasındadır. Ekranın `SeedSyncInsert/Update/Delete` bayrakları **açıktır**: ekrandan eklenen/değiştirilen/silinen kayıt -dosyaya yansır, migrate'te eksikse geri eklenir. Prompt ile üretimde satırı bu dosyaya yaz +dosyasına yansır, migrate'te eksikse geri eklenir. Prompt ile üretimde satırı `{Id}.json` dosyası olarak yaz (`Id` sabit GUID; `ParametersJson`/`PermissionsJson` kaçışlanmış string). **Ne zaman CRUD, ne zaman Custom Endpoint?** Tek tabloya standart CRUD gerekiyorsa CRUD Endpoint @@ -4626,7 +4631,7 @@ kullanılacağı** `lowcode-reference.instructions.md` §12'dedir. > > | Durum | Ekranlar (örnek) | Prompt ile kayıt eklerken | > | --- | --- | --- | -> | Seed bayrakları açık — ekrandan yapılan kayıt dosyaya yansır | RecurringJobs, NotificationTemplates/Types/Rules, SettingDefinitions, AiBot, CustomEndpoints, DynamicServices, CustomComponents, McpServers, IntranetWidgets, ReportTemplates/Categories, `App.Menus.*`, `Abp.Identity.Permission*` | Satırı `data/{ListFormCode}.json`'a yaz (rapor şablonu için `save_report_template`) | +> | Seed bayrakları açık — ekrandan yapılan kayıt dosyaya yansır | RecurringJobs, NotificationTemplates/Types/Rules, SettingDefinitions, AiBot, CustomEndpoints, DynamicServices, CustomComponents, McpServers, IntranetWidgets, ReportTemplates/Categories, `App.Menus.*`, `Abp.Identity.Permission*` | Satırı ekranın `SeedFilePath` tanımına yaz: `.json` ile bitiyorsa o dosya, uzantısızsa klasördeki `{anahtar}.json` (§9.15) (rapor şablonu için `save_report_template`) | > | `SeedFilePath` dolu, bayraklar kapalı — dosya migrate'te uygulanır, ekrandan yapılan değişiklik dosyaya **yansımaz** | Sequence, GlobalSearch, Currency, ContactTitle, Country/City/District, Uom, Hr Department/JobPosition/SkillType, WorkHour, Intranet, Blog, Forum, Orders tanımları | Satırı dosyaya yaz; ekrandan eklenen kayıt teslim sayılmaz | > | `SeedFilePath` boş — yalnızca veritabanı | DataSource, Languages, Branches, Roles/Users/Tenants, AuditLogs, IpRestrictions, Notification (geçmiş), BackgroundWorkers.Jobs | `sql/execute/{Ad}.sql` altında **varsa güncelleyen/yoksa ekleyen** bir prosedür (§8.4) | > diff --git a/README.md b/README.md index f5b871f7..413aaac0 100644 --- a/README.md +++ b/README.md @@ -1550,7 +1550,7 @@ liste süzgeci ve çağrı kapısı aynı kuralı kullanır. | `describe_list` | Bir listenin sütunları: alan adı, görünen başlık, SQL tipi, lookup ilişkisi, `isSensitive`. | | `search_schema` | Liste ve sütun adları/başlıkları üzerinde aksan ve büyük/küçük harf duyarsız arama. | | `query_list` | Listenin verisini ekranın kendi sorgusuyla (`GetSelectAsync`) okur: filtre, sıralama, gruplama, özet (DevExtreme biçimi). Sıralama/gruplama/özet JSON'u, arayüzün `Utils.ts`'te yaptığı gibi select ucunun metin biçimine (`Alan desc|Alan2 asc`) `McpLoadOptions` ile çevrilir; select ucu JSON'u tanımaz. Normal kullanıcının veri okuma yolu. | -| `run_select` | Parametreli tek SELECT; çoklu ifade, DDL ve DML reddedilir, satır tavanı sorguya yazılır. Yalnızca SQL Query Manager yetkisiyle. Sağlayıcı hatası mesajıyla döner (`SelectFailed`); araç açıklaması kolonu varsaymamayı, gerekirse önce `INFORMATION_SCHEMA.COLUMNS`'ı okumayı söyler. | +| `run_select` | Parametreli tek SELECT; çoklu ifade, DDL ve DML reddedilir, satır tavanı sorguya yazılır. Yalnızca SQL Query Manager yetkisiyle. Sağlayıcı hatası mesajıyla döner (`SelectFailed`; bilinmeyen kolonda tabloların gerçek kolonlarıyla `SelectFailedColumns`; veritabanında olmayan ama seed scripti olan tabloda — `create_table` yazdı, DB Migrate kurmadı — scriptteki kolonlarla `SelectTableNotInstalled`); araç açıklaması kolonu varsaymamayı, gerekirse önce `INFORMATION_SCHEMA.COLUMNS`'ı okumayı söyler. | | `list_queries` | View/procedure/function nesneleri (SQL Query Manager yetkisiyle) + çağrılabilir Custom Endpoint'ler (`App.DeveloperKit.CustomEndpoints.Get` ile). | | `run_query` | Kayıtlı bir nesneyi ya da Custom Endpoint'i parametreleriyle çağırır; yetkiler `list_queries` ile aynı. | | `insert_row` / `update_row` / `delete_row` | ListForm ekranının insert/update/delete sözleşmesinden geçer. | diff --git a/api/modules/Sozsoft.Mcp/Sozsoft.Mcp.Application/McpDevelopAppService.cs b/api/modules/Sozsoft.Mcp/Sozsoft.Mcp.Application/McpDevelopAppService.cs index 26c8ff15..b8cd10b0 100644 --- a/api/modules/Sozsoft.Mcp/Sozsoft.Mcp.Application/McpDevelopAppService.cs +++ b/api/modules/Sozsoft.Mcp/Sozsoft.Mcp.Application/McpDevelopAppService.cs @@ -239,7 +239,7 @@ public class McpDevelopAppService( editGroups[0].Caption = string.Empty; // Satirlar deploy'dan once dogrulanir; gecersiz girdi yarim bir deploy birakmaz. - var seedRows = ParseSeedRows(input.SeedRows, wizard); + var seedRows = await ParseSeedRowsAsync(input.SeedRows, wizard); // Wizard dosyasi onu ureten talebi tasir; Wizard Manager talebi gosterir ve talebin // butun wizard'larini birlikte export eder. Bag modelin girdisinden degil etkin talepten gelir. @@ -282,7 +282,7 @@ public class McpDevelopAppService( /// Demo satirlarini okur ve ekranin alanlarina gore dogrular. Satirlar yalnizca SeedData acik /// liste ekraninda kabul edilir: migrate onlari ekranin veri dosyasindan ekler. /// - private List> ParseSeedRows(string? json, ListFormWizardDto wizard) + private async Task>> ParseSeedRowsAsync(string? json, ListFormWizardDto wizard) { if (string.IsNullOrWhiteSpace(json)) return []; @@ -310,10 +310,53 @@ public class McpDevelopAppService( var unknown = rows.SelectMany(row => row.Keys).Where(key => !fields.Contains(key)) .Distinct(StringComparer.OrdinalIgnoreCase).ToList(); - if (unknown.Count > 0) - throw new UserFriendlyException(L[McpErrorCodes.SeedRowsUnknownFields, string.Join(", ", unknown), string.Join(", ", fields)]); + if (unknown.Count == 0) + return rows; - return rows; + var screenFields = string.Join(", ", fields); + var owners = await FindSameTableScreensAsync(wizard, unknown); + if (owners.Count == 0) + throw new UserFriendlyException(L[McpErrorCodes.SeedRowsUnknownFields, string.Join(", ", unknown), screenFields]); + + // Ayni tablonun baska ekraninda (cogunlukla alt form sekmesi) alan olan kolon migrate'te + // bu ekranin veri dosyasindan yazilmaz; model kolonun nerede durdugunu gorurse alani ekrana + // ekleyip ya da satirdan cikarip tekrar dener. + var placement = string.Join("; ", owners.Select(owner => $"{owner.Key}: {string.Join(", ", owner.Value)}")); + throw new UserFriendlyException(L[McpErrorCodes.SeedRowsFieldsOnOtherScreens, string.Join(", ", unknown), placement, screenFields]); + } + + /// + /// Bilinmeyen kolonlari ayni tabloyu okuyan diger wizard ekranlarinin alanlarinda arar; sonuc + /// ekran kodundan o ekranda bulunan kolonlara eslemedir. Ekran listesi wizard dosyalarindan + /// okunur, migrate bekleyen ekranlar da dahildir. + /// + private async Task>> FindSameTableScreensAsync(ListFormWizardDto wizard, List columns) + { + var owners = new Dictionary>(StringComparer.OrdinalIgnoreCase); + var table = wizard.SelectCommand?.Trim(); + if (string.IsNullOrWhiteSpace(table)) + return owners; + + var wizardName = wizard.WizardName?.Trim(); + foreach (var file in await wizardAppService.GetFiles()) + { + if (file.ComponentKind == WizardComponentKindEnum.Custom || + string.Equals(file.WizardName, wizardName, StringComparison.OrdinalIgnoreCase) || + string.Equals(file.FileName, wizard.EditFileName, StringComparison.OrdinalIgnoreCase)) + continue; + + var seed = await wizardAppService.GetFile(file.FileName); + if (!string.Equals(seed.Wizard?.SelectCommand?.Trim(), table, StringComparison.OrdinalIgnoreCase)) + continue; + + var found = columns + .Where(column => (seed.Fields ?? []).Any(field => string.Equals(field.FieldName, column, StringComparison.OrdinalIgnoreCase))) + .ToList(); + if (found.Count > 0) + owners[seed.ListForm?.ListFormCode ?? file.ListFormCode ?? file.WizardName] = found; + } + + return owners; } /// diff --git a/api/modules/Sozsoft.Mcp/Sozsoft.Mcp.Application/McpQueryAppService.cs b/api/modules/Sozsoft.Mcp/Sozsoft.Mcp.Application/McpQueryAppService.cs index 6f0f43d9..04f03851 100644 --- a/api/modules/Sozsoft.Mcp/Sozsoft.Mcp.Application/McpQueryAppService.cs +++ b/api/modules/Sozsoft.Mcp/Sozsoft.Mcp.Application/McpQueryAppService.cs @@ -6,9 +6,11 @@ using System.Text.Json; using System.Text.RegularExpressions; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; +using Microsoft.Extensions.Configuration; using Sozsoft.Mcp.Dtos; using Sozsoft.Mcp.Services; using Sozsoft.Platform; +using Sozsoft.Platform.Data.Seeds; using Sozsoft.Platform.Entities; using Sozsoft.Platform.Enums; using Sozsoft.Platform.ListForms.Select; @@ -37,7 +39,8 @@ public partial class McpQueryAppService( IMcpQueryExecutor queryExecutor, IRepository customEndpointRepository, IListFormSelectAppService listFormSelectAppService, - IMcpListFormAccessFilter accessFilter) + IMcpListFormAccessFilter accessFilter, + IConfiguration configuration) : McpAppService(serverConfigProvider), IMcpQueryAppService { private const string SqlPermission = PlatformConsts.AppCodes.SqlQueryManagers.Default; @@ -116,6 +119,10 @@ public partial class McpQueryAppService( } catch (DbException ex) { + var pending = IsUnknownObjectError(ex) ? DescribePendingTables(sql) : null; + if (pending is not null) + throw new UserFriendlyException(L[McpErrorCodes.SelectTableNotInstalled, ex.Message, pending]); + var columns = IsUnknownColumnError(ex) ? await DescribeTableColumnsAsync(context, sql) : null; throw new UserFriendlyException(columns is null ? L[McpErrorCodes.SelectFailed, ex.Message] @@ -129,6 +136,30 @@ public partial class McpQueryAppService( private static bool IsUnknownColumnError(DbException ex) => ex.SqlState == "42703" || ex.Message.Contains("Invalid column name", StringComparison.OrdinalIgnoreCase); + /// SQL Server 208 ("Invalid object name"), PostgreSQL 42P01 (undefined_table). + private static bool IsUnknownObjectError(DbException ex) => + ex.SqlState == "42P01" || ex.Message.Contains("Invalid object name", StringComparison.OrdinalIgnoreCase); + + /// + /// Sorgunun andigi ve veritabaninda olmayan tablolardan seed scripti olanlar (Tablo(A, B); …). + /// create_table tabloyu yalnizca scripte yazar, kurulum DB Migrate'tedir; model ayni talepte + /// tabloyu sorgularsa kolon tahmini yuzunden degil kurulum beklendigi icin bos doner. Kolonlar + /// scriptten okunur, boylece model sema araci cagirmadan ilerler. Scripti olan tablo yoksa null. + /// + private string? DescribePendingTables(string sql) + { + var described = TableReferenceRegex().Matches(sql) + .Select(match => match.Groups["table"].Value) + .Distinct(StringComparer.OrdinalIgnoreCase) + .Take(MaxDescribedTables) + .Select(table => (Table: table, Columns: PostgreSqlTableScript.ReadSeedColumns(configuration, table))) + .Where(item => item.Columns.Count > 0) + .Select(item => $"{item.Table}({string.Join(", ", item.Columns.Keys)})") + .ToList(); + + return described.Count == 0 ? null : string.Join("; ", described); + } + /// /// Sorgunun FROM/JOIN ile andigi tablolarin gercek kolonlari (Tablo(A, B, C); …). Model /// kolonu tahmin ettiyse dogru listeyi ayni cevapta gorur ve ayrica sema araci cagirmadan duzeltir. 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 e61b2095..7566364e 100644 --- a/api/modules/Sozsoft.Mcp/Sozsoft.Mcp.Domain.Shared/McpErrorCodes.cs +++ b/api/modules/Sozsoft.Mcp/Sozsoft.Mcp.Domain.Shared/McpErrorCodes.cs @@ -36,6 +36,7 @@ public static class McpErrorCodes public const string SeedRowsInvalid = Prefix + "SeedRowsInvalid"; public const string SeedRowsNotAllowed = Prefix + "SeedRowsNotAllowed"; public const string SeedRowsUnknownFields = Prefix + "SeedRowsUnknownFields"; + public const string SeedRowsFieldsOnOtherScreens = Prefix + "SeedRowsFieldsOnOtherScreens"; public const string ComponentNameRequired = Prefix + "ComponentNameRequired"; public const string ComponentCodeRequired = Prefix + "ComponentCodeRequired"; public const string ComponentNotFound = Prefix + "ComponentNotFound"; @@ -49,6 +50,7 @@ public static class McpErrorCodes public const string VerifySelectFailed = Prefix + "VerifySelectFailed"; public const string SelectFailed = Prefix + "SelectFailed"; public const string SelectFailedColumns = Prefix + "SelectFailedColumns"; + public const string SelectTableNotInstalled = Prefix + "SelectTableNotInstalled"; public const string VerifyComponentInactive = Prefix + "VerifyComponentInactive"; public const string VerifyComponentRouteMismatch = Prefix + "VerifyComponentRouteMismatch"; public const string VerifySeedClosureIncomplete = Prefix + "VerifySeedClosureIncomplete"; diff --git a/api/src/Sozsoft.Platform.Application/ListForms/WizardTableCleaner.cs b/api/src/Sozsoft.Platform.Application/ListForms/WizardTableCleaner.cs index 39d37738..80921bdc 100644 --- a/api/src/Sozsoft.Platform.Application/ListForms/WizardTableCleaner.cs +++ b/api/src/Sozsoft.Platform.Application/ListForms/WizardTableCleaner.cs @@ -183,7 +183,7 @@ public class WizardTableCleaner( /// /// Talep silmesinde talebin tablolarini sorgulayan Custom Endpoint'leri veritabanindan ve - /// data/App.DeveloperKit.CustomEndpoints.json dosyasindan siler. + /// data/App.DeveloperKit.CustomEndpoints/ klasorundeki satir dosyalarindan siler. /// public async Task DeleteCustomEndpointsAsync(IReadOnlyCollection names, List report) { @@ -211,21 +211,28 @@ public class WizardTableCleaner( /// Henuz migrate edilmemis, yalnizca seed dosyasinda duran ve tabloyu sorgulayan endpoint'ler. private async Task> FindSeedEndpointsAsync(WizardDeleteTableDto table) { - var path = ScopeFile(SeedPathResolver.GetDataFilePath(CustomEndpointsListFormCode)); - if (!File.Exists(path)) + // Ekran klasor modundadir: her endpoint data/App.DeveloperKit.CustomEndpoints/{Id}.json dosyasindadir. + var folder = ScopeFile(SeedPathResolver.GetDataFolderPath(CustomEndpointsListFormCode)); + if (!Directory.Exists(folder)) return []; - var file = JsonSerializer.Deserialize(await File.ReadAllTextAsync(path), ListFormSeedDataFileDto.JsonOptions); var pattern = TablePattern(table.TableName); + var names = new List(); string? Text(Dictionary row, string field) => row.FirstOrDefault(kv => string.Equals(kv.Key, field, StringComparison.OrdinalIgnoreCase)).Value?.ToString(); - return [.. (file?.Rows ?? []) - .Where(row => string.Equals(Text(row, nameof(CustomEndpoint.DataSourceCode)), table.DataSourceCode, StringComparison.OrdinalIgnoreCase) && - Text(row, nameof(CustomEndpoint.Sql)) is { } sql && pattern.IsMatch(sql)) - .Select(row => Text(row, nameof(CustomEndpoint.Name))) - .OfType()]; + foreach (var path in Directory.EnumerateFiles(folder, "*.json")) + { + var file = JsonSerializer.Deserialize(await File.ReadAllTextAsync(path), ListFormSeedDataFileDto.JsonOptions); + names.AddRange((file?.Rows ?? []) + .Where(row => string.Equals(Text(row, nameof(CustomEndpoint.DataSourceCode)), table.DataSourceCode, StringComparison.OrdinalIgnoreCase) && + Text(row, nameof(CustomEndpoint.Sql)) is { } sql && pattern.IsMatch(sql)) + .Select(row => Text(row, nameof(CustomEndpoint.Name))) + .OfType()); + } + + return names; } private async Task ReadTableStateAsync(WizardDeleteTableDto table) diff --git a/api/src/Sozsoft.Platform.DbMigrator/Migrations/ListFormSeeder_Saas.cs b/api/src/Sozsoft.Platform.DbMigrator/Migrations/ListFormSeeder_Saas.cs index d90fec5b..f649d97e 100644 --- a/api/src/Sozsoft.Platform.DbMigrator/Migrations/ListFormSeeder_Saas.cs +++ b/api/src/Sozsoft.Platform.DbMigrator/Migrations/ListFormSeeder_Saas.cs @@ -5563,7 +5563,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency new("POST", "green", "FaPlusCircle", "\"Method\" = 'POST'"), new("PUT", "orange", "FaEdit", "\"Method\" = 'PUT'"), new("DELETE", "red", "FaTrash", "\"Method\" = 'DELETE'")), - SeedFilePath = SeedPathResolver.GetDataFilePath(listFormName), + SeedFilePath = SeedPathResolver.GetDataFolderPath(listFormName), SeedSyncInsert = true, SeedSyncUpdate = true, SeedSyncDelete = true, diff --git a/claude.md b/claude.md index e28d3388..388454e5 100644 --- a/claude.md +++ b/claude.md @@ -466,7 +466,7 @@ Bir çelişki varsa sıra: `ai.instructions.md` → `dotnet.instructions.md` → değer **tek dosyadır** (`data/{ListFormCode}.json`, bütün satırlar orada), uzantısız değer **klasördür** (`data/{ListFormCode}/{anahtar}.json`, her satır kendi dosyasında) ve klasör yoksa ilk kayıtta oluşturulur. Klasör modu satırı büyük ya da sık yazılan ekranlar içindir - (varsayılan tek dosya; şu an klasör kullanan tek ekran Custom Components). Applier `data/` + (varsayılan tek dosya; şu an klasör kullanan ekranlar Custom Components ve Custom Endpoints). Applier `data/` altını özyinelemeli tarar ve **bir klasörün tamamını tek unit of work'te** uygular — ekran tanımı, alan listesi ve veri kaynağı satır dosyası başına değil ekran başına bir kez çözülür; dosyadaki `ListFormCode` boşsa ekran kodu klasör adından gelir. Tek dosyaya bağlı eski bir kayıt, diff --git a/configs/seeds/data/App.DevRequests/31f9867d-f243-4e29-9819-bcd9dee19d5a.json b/configs/seeds/data/App.DevRequests/31f9867d-f243-4e29-9819-bcd9dee19d5a.json index 2e37b061..71e52229 100644 --- a/configs/seeds/data/App.DevRequests/31f9867d-f243-4e29-9819-bcd9dee19d5a.json +++ b/configs/seeds/data/App.DevRequests/31f9867d-f243-4e29-9819-bcd9dee19d5a.json @@ -12,10 +12,10 @@ "Status": "Staging", "Title": "Human Resources -> Definitions", "Description": "

Kurum Doktorları


Yeterlilik Belgeleri


Hastaneler


Hastane Bölümleri


Evrak Türleri


", - "DueDate": null, - "Tags": null, - "Assignees": null, - "Priority": null, + "DueDate": "2026-10-07T14:05:00", + "Tags": "HR", + "Assignees": "system@sozsoft.com", + "Priority": "5", "Completed": true, "SortOrder": 4, "Timesheets": "[{\"id\":\"b0877f68-e287-6a71-ee2e-3a2403820cf5\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"Hr_T_Doctor tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"f2dc9019-5288-2d82-f9f7-3a2403828035\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"Doctor.json wizard\\u0027\\u0131 deploy edildi (1 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"c554eecc-b9af-3152-70f2-3a240382925d\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"Hr_T_Certificate tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"29a2829f-e1a5-8ca6-5f78-3a240382dd1d\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"Certificate.json wizard\\u0027\\u0131 deploy edildi (16 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"5bdece23-8a14-d008-4128-3a24038341a7\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"Hr_T_Hospital tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"cf4e73e7-e879-529f-5110-3a240383bec6\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"Hospital.json wizard\\u0027\\u0131 deploy edildi (45 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"ee05f153-cea5-71f7-1f9a-3a240383cdc4\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"Hr_T_HospitalDepartment tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"520a8e77-e28f-71e9-7bf3-3a2403842ca9\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"HospitalDepartment.json wizard\\u0027\\u0131 deploy edildi (31 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"b24ad81f-1406-6b3f-6abd-3a2403843c21\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"Hr_T_DocumentType tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"24faa132-3d57-03ab-6397-3a240384d3a2\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"DocumentType.json wizard\\u0027\\u0131 deploy edildi (48 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"3d4f555a-a723-418a-d3d0-3a240384e6f8\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"10 tamamlanm\\u0131\\u015F alt g\\u00F6rev eklendi\",\"duration\":0.0167},{\"id\":\"c461de20-dc4b-72c4-c29c-3a2403852945\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"Analize \\u00FCretim notu eklendi\",\"duration\":0.0167},{\"id\":\"17a0bb99-9fc2-e1ef-f94e-3a2403854b2e\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"App.DevRequests ekran\\u0131nda sat\\u0131r g\\u00FCncellendi (Status)\",\"duration\":0.0167},{\"id\":\"a1defc25-7594-3a9a-cb07-3a2406a03b80\",\"date\":\"2026-10-01\",\"userName\":\"system@sozsoft.com\",\"description\":\"Talep analiz edildi\",\"duration\":0.0333}]", diff --git a/configs/seeds/data/App.DevRequests/5d11851e-5f00-4a0b-b5a3-b8211e56c8b5.json b/configs/seeds/data/App.DevRequests/5d11851e-5f00-4a0b-b5a3-b8211e56c8b5.json index 64438c8c..b8f65781 100644 --- a/configs/seeds/data/App.DevRequests/5d11851e-5f00-4a0b-b5a3-b8211e56c8b5.json +++ b/configs/seeds/data/App.DevRequests/5d11851e-5f00-4a0b-b5a3-b8211e56c8b5.json @@ -11,16 +11,16 @@ "RequestDate": null, "Status": "Backlog", "Title": "Inventory -> Tanımlamalar", - "Description": "

Ürünler : Ürün listesi ve detayı aşağıdaki örneklendirilmiştir. Ürünler Satış, Masraflar, Satınalma olarak 3 seçeneği var. Satış seçerse sadece Satış siparişlerinde görünür. Satınalma seçerse Satınalınabilir anlamına gelir. Ürün Türü Mal veya Hizmet olabilir. Envanter Takibi yapılıp yapılmayacağı seçilebilir. Eğer takip edilecekse Seri No, Lot Numarası veya Miktara göre seklinden seçilecek.


Nitelikler ve Varyantlar seçeneğinde yazılabilecek değerler Nitelik olarak tanımlanmalı. İçerisindeki değerleri de tanımlanabilir. Nitelik seçilip değerleri birden fazla şekilde yapılabilir. Eğer nitelikli bir ürün tanımlanırsa o varyantlı ürün listeler de seçilecektir.


Satınalma kısmında o ürünü hangi tedarikçiden hangi bedele aldığımızı belirtiyoruz. Ürün ve reçetede kullanılan Birim sütunun Adm_T_Uom tablosu ile ilişkili olmalı. Adm_T_Uom tablosundaki Id bilgisi nvarchar(64)



Ürün listesinde ürün adı, resmi, Satış, Masraflar ve Satınalma sütunlarından oluşmalı. Diğer bilgiler Ürün listesindeki Detay ksımında Tablar şeklinde resimdeki gibi görüntülenmeli. App.Definitions.Contact gibi olabilir.



Nitelikler kısmı Nitelik kısmında seçilmeli ve Değerler birden fazla seçebilecek bir sütundan oluşmalı.




Reçeteler : Ürünlerin hammadde ve yarı mamülerin ve tüketim miktarlarının belirlendiği kısımdır. Ayrıca tanımlanan operasyonların tanımlandığı listedir. Hangi bileşenlerin hangi operasyon ile tüketildiği belirlenecektir. Ürün bazında da reçete yazılabilir. Her bir ürünün Varyantı bazında da reçete yazılabilri. Bom türü eklenmeyecek


İş Merkezi tanımlamaları : Inventory -> Tanımlamalar menüsünde yer alacaktır.İş Merkezi lsitesinde iş merkezi adı, etiketler, çalışma saatleri (Weekly working time limit (h) ile setting kısmından alınabilir.)İş Merkezi lsitesinde iş merkezi adı, etiketler, çalışma saatleri (Weekly working time limit (h) ile setting kısmından alınabilir.) İş merkezi lsitesinin detayında Genel Bİlgi, Ürün kapasitesi bilgilerini tab olarak göstermeli


Operasyonlar : Inventory -> Tanımlamalar menüsünde yer alacaktır.Operasyon Listesinde Operasyon Adı, İş Merkezi Adı, Varsayılan Süre sütunlarından oluşmalı. Detay butonu ile Açıklamalar listesinde yer almalı



Eğer nitelikli bir ürün tanımlanırsa o zaman Varyantlı liste oluşur ve tüm sistem varyantlı seçeneker çalışır. Eğer nitelik tanımlamazsa ana ürün seçilecektir.

Ürün reçetesine genel bakış raporu bu ERP ssitemlerdeki BOM ile aynı. Reçetelerin malzemelerinde recursive şekilde iç içe kullanılan diğer malzemeler ve miktarların hesaplanması gerekiyor. Bu ksıım Tree Layout olarak sunulmalı.




", + "Description": "

Ürünler : Ürün listesi ve detayı aşağıdaki örneklendirilmiştir. Ürünler Satış, Masraflar, Satınalma olarak 3 seçeneği var. Satış seçerse sadece Satış siparişlerinde görünür. Satınalma seçerse Satınalınabilir anlamına gelir. Ürün Türü Mal veya Hizmet olabilir. Envanter Takibi yapılıp yapılmayacağı seçilebilir. Eğer takip edilecekse Seri No, Lot Numarası veya Miktara göre seklinden seçilecek.


Nitelikler ve Varyantlar seçeneğinde yazılabilecek değerler Nitelik olarak tanımlanmalı. İçerisindeki değerleri de tanımlanabilir. Nitelik seçilip değerleri birden fazla şekilde yapılabilir. Eğer nitelikli bir ürün tanımlanırsa o varyantlı ürün listeler de seçilecektir.


Satınalma kısmında o ürünü hangi tedarikçiden hangi bedele aldığımızı belirtiyoruz. Ürün ve reçetede kullanılan Birim sütunun Adm_T_Uom tablosu ile ilişkili olmalı. Adm_T_Uom tablosundaki Id bilgisi nvarchar(64)



Ürün listesinde ürün adı, resmi, Satış, Masraflar ve Satınalma sütunlarından oluşmalı. Ayrıca yukarıdaki Ürün lisesindeki sütunlar olabilir. Diğer bilgiler Ürün listesindeki Detay ksımında Tablar şeklinde resimdeki gibi görüntülenmeli. App.Definitions.Contact gibi olabilir.



Nitelikler kısmı Nitelik kısmında seçilmeli ve Değerler birden fazla seçebilecek bir sütundan oluşmalı.




Reçeteler : Ürünlerin hammadde ve yarı mamülerin ve tüketim miktarlarının belirlendiği kısımdır. Ayrıca tanımlanan operasyonların tanımlandığı listedir. Hangi bileşenlerin hangi operasyon ile tüketildiği belirlenecektir. Ürün bazında da reçete yazılabilir. Her bir ürünün Varyantı bazında da reçete yazılabilri. Bom türü eklenmeyecek


İş Merkezi tanımlamaları : Inventory -> Tanımlamalar menüsünde yer alacaktır.İş Merkezi lsitesinde iş merkezi adı, etiketler, çalışma saatleri (Weekly working time limit (h) ile setting kısmından alınabilir.)İş Merkezi lsitesinde iş merkezi adı, etiketler, çalışma saatleri (Weekly working time limit (h) ile setting kısmından alınabilir.) İş merkezi lsitesinin detayında Genel Bİlgi, Ürün kapasitesi bilgilerini tab olarak göstermeli


Operasyonlar : Inventory -> Tanımlamalar menüsünde yer alacaktır.Operasyon Listesinde Operasyon Adı, İş Merkezi Adı, Varsayılan Süre sütunlarından oluşmalı. Detay butonu ile Açıklamalar listesinde yer almalı



Eğer nitelikli bir ürün tanımlanırsa o zaman Varyantlı liste oluşur ve tüm sistem varyantlı seçeneker çalışır. Eğer nitelik tanımlamazsa ana ürün seçilecektir.

Ürün reçetesine genel bakış raporu bu ERP ssitemlerdeki BOM ile aynı. Reçetelerin malzemelerinde recursive şekilde iç içe kullanılan diğer malzemeler ve miktarların hesaplanması gerekiyor. Bu ksıım Tree Layout olarak sunulmalı.




", "DueDate": "2026-10-06T21:02:00", "Tags": "IN", "Assignees": "system@sozsoft.com", - "Priority": null, + "Priority": "5", "Completed": false, "SortOrder": 2, - "Timesheets": null, + "Timesheets": "[{\"id\":\"6a817f32-69b6-6e06-3cc4-3a2428dfe74d\",\"date\":\"2026-10-07\",\"userName\":\"system@sozsoft.com\",\"description\":\"Talep analiz edildi\",\"duration\":0.0167},{\"id\":\"9c434c1b-9451-efc8-02b1-3a2428e13282\",\"date\":\"2026-10-07\",\"userName\":\"system@sozsoft.com\",\"description\":\"Inv_T_ProductCategory tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"30fb4513-f16d-bb46-f408-3a2428e14ab8\",\"date\":\"2026-10-07\",\"userName\":\"system@sozsoft.com\",\"description\":\"Inv_T_Attribute tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"1dc7152e-2ff6-f6de-9205-3a2428e1655b\",\"date\":\"2026-10-07\",\"userName\":\"system@sozsoft.com\",\"description\":\"Inv_T_AttributeValue tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"dd3504f3-51d0-042b-a5b5-3a2428e19b77\",\"date\":\"2026-10-07\",\"userName\":\"system@sozsoft.com\",\"description\":\"Inv_T_Product tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"560153a2-526d-c786-f5b5-3a2428e2bfab\",\"date\":\"2026-10-07\",\"userName\":\"system@sozsoft.com\",\"description\":\"Inv_T_ProductAttributeLine tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"3414b481-2140-b3e6-dab3-3a2428e2d9b2\",\"date\":\"2026-10-07\",\"userName\":\"system@sozsoft.com\",\"description\":\"Inv_T_ProductVariant tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"a715a8e5-cb36-311c-2aa2-3a2428e2fa1a\",\"date\":\"2026-10-07\",\"userName\":\"system@sozsoft.com\",\"description\":\"Inv_T_ProductSupplier tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"8d745d78-25bf-b82a-c2f4-3a2428e31cbc\",\"date\":\"2026-10-07\",\"userName\":\"system@sozsoft.com\",\"description\":\"Inv_T_WorkCenter tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"c493b41a-a80e-e72d-2f9f-3a2428e333d3\",\"date\":\"2026-10-07\",\"userName\":\"system@sozsoft.com\",\"description\":\"Inv_T_WorkCenterCapacity tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"01397c97-65b8-c5e8-5766-3a2428e35783\",\"date\":\"2026-10-07\",\"userName\":\"system@sozsoft.com\",\"description\":\"Inv_T_Operation tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"a57fcb7d-12e9-9ca2-5a55-3a2428e36d82\",\"date\":\"2026-10-07\",\"userName\":\"system@sozsoft.com\",\"description\":\"Inv_T_OperationInstruction tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"4df60eac-980d-a497-93c4-3a2428e38bd9\",\"date\":\"2026-10-07\",\"userName\":\"system@sozsoft.com\",\"description\":\"Inv_T_Bom tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"6a68db4d-bb53-33b9-cf0b-3a2428e3a1bb\",\"date\":\"2026-10-07\",\"userName\":\"system@sozsoft.com\",\"description\":\"Inv_T_BomOperation tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"fb6aea44-6996-80d1-8d19-3a2428e3ba5a\",\"date\":\"2026-10-07\",\"userName\":\"system@sozsoft.com\",\"description\":\"Inv_T_BomLine tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"ab475620-374d-e4a1-dc1b-3a2428e40761\",\"date\":\"2026-10-07\",\"userName\":\"system@sozsoft.com\",\"description\":\"App.DeveloperKit.CustomEndpoints ekran\\u0131na sat\\u0131r eklendi\",\"duration\":0.0167},{\"id\":\"52e08632-e712-8432-977e-3a2428e48174\",\"date\":\"2026-10-07\",\"userName\":\"system@sozsoft.com\",\"description\":\"ProductCategory.json wizard\\u0027\\u0131 deploy edildi (2 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"4e8bdcfc-9621-2861-1954-3a2428e4e6a6\",\"date\":\"2026-10-07\",\"userName\":\"system@sozsoft.com\",\"description\":\"AttributeValue.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"c007dd02-6b11-d995-c720-3a2428e56195\",\"date\":\"2026-10-07\",\"userName\":\"system@sozsoft.com\",\"description\":\"Attribute.json wizard\\u0027\\u0131 deploy edildi (3 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"4fee692c-bce3-3c65-80ad-3a2428e5c017\",\"date\":\"2026-10-07\",\"userName\":\"system@sozsoft.com\",\"description\":\"WorkCenterCapacity.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"da9fe300-0f4e-f900-b08d-3a2428e64100\",\"date\":\"2026-10-07\",\"userName\":\"system@sozsoft.com\",\"description\":\"WorkCenterGeneral.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"4bbfcb44-0ddb-a68e-5a7c-3a2428e7a2f3\",\"date\":\"2026-10-07\",\"userName\":\"system@sozsoft.com\",\"description\":\"WorkCenter.json wizard\\u0027\\u0131 deploy edildi (1 demo sat\\u0131r)\",\"duration\":0.0333},{\"id\":\"4f66f26a-ee05-4a6a-847f-3a2428e809f9\",\"date\":\"2026-10-07\",\"userName\":\"system@sozsoft.com\",\"description\":\"OperationInstruction.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"913a0473-6e15-797a-7160-3a2428e868cd\",\"date\":\"2026-10-07\",\"userName\":\"system@sozsoft.com\",\"description\":\"OperationSettings.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"85b8537e-a7ab-54ef-bb16-3a2428e8d1b9\",\"date\":\"2026-10-07\",\"userName\":\"system@sozsoft.com\",\"description\":\"Operation.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"ca24a627-11b3-f8db-6f13-3a2428e934d0\",\"date\":\"2026-10-07\",\"userName\":\"system@sozsoft.com\",\"description\":\"BomOperation.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"6c0040f0-b981-9546-22ab-3a2428e9ac84\",\"date\":\"2026-10-07\",\"userName\":\"system@sozsoft.com\",\"description\":\"BomLine.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"037a0ab6-d2b5-5a38-a030-3a2428eaa433\",\"date\":\"2026-10-07\",\"userName\":\"system@sozsoft.com\",\"description\":\"Bom.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"fa6d1319-7742-f551-e75e-3a2428eb27cc\",\"date\":\"2026-10-07\",\"userName\":\"system@sozsoft.com\",\"description\":\"ProductVariant.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"62798abf-b710-74a7-006e-3a2428ecadd4\",\"date\":\"2026-10-07\",\"userName\":\"system@sozsoft.com\",\"description\":\"ProductGeneral.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0333},{\"id\":\"93b9f36f-5e8c-8607-373e-3a2428ed1027\",\"date\":\"2026-10-07\",\"userName\":\"system@sozsoft.com\",\"description\":\"ProductAttributeLine.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"c7fe1df4-3b68-222c-3a4b-3a2428ed62bd\",\"date\":\"2026-10-07\",\"userName\":\"system@sozsoft.com\",\"description\":\"ProductPurchasing.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"d6c003ce-d518-45df-94a2-3a2428ee01c8\",\"date\":\"2026-10-07\",\"userName\":\"system@sozsoft.com\",\"description\":\"ProductSupplier.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"d6b290e4-6dc9-7830-f0f9-3a2428ee7bc4\",\"date\":\"2026-10-07\",\"userName\":\"system@sozsoft.com\",\"description\":\"ProductStock.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"bc64a3db-7a2f-5e01-effa-3a2428eedc11\",\"date\":\"2026-10-07\",\"userName\":\"system@sozsoft.com\",\"description\":\"ProductAccounting.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"d8959a4c-3c31-d2a3-8ca4-3a2428ef93c6\",\"date\":\"2026-10-07\",\"userName\":\"system@sozsoft.com\",\"description\":\"Product.json wizard\\u0027\\u0131 deploy edildi (6 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"e06847ef-a0b7-d8c5-7b14-3a2428f2c514\",\"date\":\"2026-10-07\",\"userName\":\"system@sozsoft.com\",\"description\":\"BomOverview.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.05}]", "SubTasks": null, - "Analysis": "" + "Analysis": "

1. Amaç

\n

Envanter ve üretimin ana verisini kurmak: ürün kartı (satış/masraf/satınalma bayrakları, mal/hizmet, envanter takibi), nitelik–değer–varyant yapısı, tedarikçi fiyatları, iş merkezleri, operasyonlar, ürün ve varyant bazında reçeteler (BOM) ve iç içe açılan reçete genel bakışı (ağaç). Kullanıcılar stok, satınalma ve üretim planlama personelidir; sonraki satış/satınalma/üretim belgeleri bu ekranları lookup kaynağı olarak kullanır.

\n\n

2. Görsel analizi

\n
    \n
  • [image-1] Ürünler listesi: Ürün Adı, İç Referans, Satış Fiyatı, Maliyet, Stokta, Öngörülen, Birim. Talep: liste ürün adı, resim, Satış, Masraflar, Satınalma kolonlarından oluşur; bu görseldeki kolonlar da listede olabilir. Stokta/Öngörülen stok hareketi gerektirdiği için alınmaz. Satırlar demo veri adayı.
  • \n
  • [image-2] Nitelik formu: Nitelik Adı, Görünüm Türü, Varyant Oluşturma; Nitelik Değerleri: Değer, Serbest metin, Varsayılan Ekstra Fiyat. Demo: renk → kırmızı, mavi.
  • \n
  • [image-3] Ürün – Genel Bilgi: Ürün Türü, Envanter Takibi (Seri No / Lot / Miktar), Satış Vergisi, Satınalma Vergisi, Kategori, Barkod, GTİP, İç Notlar. Talep: liste dışındaki bilgiler detayda sekme olarak (Kontaklar ekranı gibi).
  • \n
  • [image-4] Nitelik & Varyantlar: Nitelik + Değerler (çoklu seçim).
  • \n
  • [image-5] Satınalma: Tedarikçi, Miktar, Birim, Birim Fiyat, Kur, Teslim Süresi; Kontrol Kuralı, Satınalma Açıklaması.
  • \n
  • [image-6] Stok: Sorumlu, Ağırlık, Hacim, GTİP, Menşei, Lot/Seri Değerleme, Özel Lot/Seri, açıklamalar.
  • \n
  • [image-7] Muhasebe: Gelir Hesabı, Gider Hesabı.
  • \n
  • [image-8] Reçete – Bileşenler: Komponent, Miktar, Birim, Operasyonda Tüketilen. Talep: BoM Türü eklenmez; reçete ürün ya da varyant bazında yazılır.
  • \n
  • [image-9] Reçete – Operasyonlar: Operasyon, İş Merkezi, Süre (dk). Demo: Apre – ram makinası – 60.
  • \n
  • [image-10] Reçete – Diğer: Üretim Hazırlığı, Esnek Tüketim, Operasyon Türü, Akış Zamanı, Hazırlama Günleri, Parti Büyüklüğü.
  • \n
  • [image-11] İş Merkezi. Talep: listede ad, etiketler, çalışma saatleri (İK ayarı haftalık çalışma limiti); detayda Genel Bilgi ve Ürün Kapasitesi sekmeleri.
  • \n
  • [image-12] Operasyon formu. Talep: listede Operasyon Adı, İş Merkezi, Varsayılan Süre; detayda Açıklamalar listesi.
  • \n
  • [image-13] Ürün Varyantları: 12 satır = renk × malzeme × boyut.
  • \n
  • [image-14] Reçete genel bakış. Talep: iç içe malzeme ve miktarlar, Tree Layout.
  • \n
\n\n

3. Çözüm yolu

\n

Wizard List ekranları + alt formlar. Kontaklar deseni: ana liste yalnız istenen kolonları taşır, diğer alanlar aynı tabloyu okuyan TabType: Form alt formlarda (ilişki Id → Id, yalnız düzenleme). Varyant üretimi Custom Endpoint Inventory.GenerateVariants (mevcut kayıt korunur); tetikleyici Ürün › Genel Bilgi sekmesinin açılış EditorScript'i (api()). İş merkezi çalışma saati için GET Custom Endpoint Inventory.WeeklyWorkingHours (ayar istemciye açık değil). Reçete genel bakışı Wizard List, Query kaynağı, Tree görünümü (RowId / ParentRowId); Query türetilmiş tabloya sarıldığından recursive CTE kullanılamaz, açılım CROSS APPLY ile sabit 4 seviye. Custom component gerekmez.

\n\n

4. Menü yeri

\n

Envanter › Tanımlamalar › {ekran}

\n\n\n\n\n\n\n\n\n\n\n\n\n
SeviyeKodAd (TR / EN)İkonDurum
KökApp.InventoryEnvanter / InventoryFcPackageYeni
AraApp.Inventory.DefinitionsTanımlamalar / DefinitionsFcSettingsYeni
EkranApp.Inventory.ProductCategoryÜrün Kategorileri / Product CategoriesFcFolderTreeYeni
EkranApp.Inventory.AttributeNitelikler / AttributesFcListYeni
EkranApp.Inventory.WorkCenterİş Merkezleri / Work CentersFcFactoryYeni
EkranApp.Inventory.OperationOperasyonlar / OperationsFcProcessYeni
EkranApp.Inventory.BomÜrün Reçeteleri / Bills of MaterialsFcDataSheetYeni
EkranApp.Inventory.ProductVariantÜrün Varyantları / Product VariantsFcGridYeni
EkranApp.Inventory.ProductÜrünler / ProductsFcPackageYeni
EkranApp.Inventory.BomOverviewReçete Genel Bakış / BoM OverviewFcTreeStructureYeni
\n

ModuleId: Inv · İzin grubu: App.Inventory · Route: /admin/list/{ListFormCode}. Menü sırası deploy sırasını (bağımlılık sırası) izler.
\nYetki: App.Inventory › App.Inventory.Definitions › {ListFormCode}; menüsüz alt formlar taşıyıcı listenin altında.

\n\n

5. Veri modeli

\n

14 tablonun hepsi yeni (create_table; Id PK, TenantId, tam audit + soft delete otomatik; decimal = 18,4). UomId nvarchar(64) = Adm_T_Uom.Id, lookup host + kiracı birimleri, DbSourceType 16.

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
TabloTanım tablosuKolonlar (* NOT NULL, = varsayılan)Lookup
Inv_T_ProductCategoryEvetName* (128), ParentId, IsActive* =1ParentId → kendisi
Inv_T_AttributeEvetName* (128), DisplayType* (16) ='Radio', VariantCreation* (16) ='Always', IsActive* =1static
Inv_T_AttributeValueHayırAttributeId*, Name* (128), IsCustom* =0, DefaultExtraPrice* =0, ColorCode (16), Image MAX, SortOrder* int =0Attribute
Inv_T_ProductEvetName* (256), Image MAX, IsFavorite* =0, CanBeSold* =1, CanBeExpensed* =0, CanBePurchased* =1, ProductType* (16) ='Goods', IsInventoryTracked* =0, TrackingType (16), SalesPrice* =0, SalesVatRate* =20, Cost* =0, PurchaseVatRate* =20, CategoryId, UomId* (64) ='Adet', InternalReference (64), Barcode (64), GtipCode (32), InternalNote MAX, PurchaseControlPolicy* (16) ='Received', PurchaseDescription MAX, ResponsibleUserId, Weight, Volume, OriginCountry (128), LotValuation* =0, CustomLotSerialFormat (64), ReceiptNote/DeliveryNote/InternalTransferNote MAX, IncomeAccount (32), ExpenseAccount (32), HasVariants* =0, IsActive* =1ProductCategory, Adm_T_Uom, AbpUsers, Sas_H_Country
Inv_T_ProductAttributeLineHayırProductId*, AttributeId*, ValueIds* MAX (çoklu seçim)Attribute, AttributeValue (cascade)
Inv_T_ProductVariantEvetProductId*, CombinationKey* (900), ValueText (512), InternalReference (64), Barcode (64), ExtraPrice* =0, Cost* =0, IsActive* =1Product
Inv_T_ProductSupplierHayırProductId*, ProductVariantId, ContactId*, MinQuantity* =1, UomId* (64) ='Adet', UnitPrice* =0, Currency* (16) ='TRY', LeadTimeDays* int =0Adm_T_Contact, ProductVariant, Adm_T_Uom, Sas_H_Currency
Inv_T_WorkCenterEvetName* (128), Code (32), Tags (256), AlternativeWorkCenterIds MAX, WeeklyWorkingHours decimal, TimeEfficiency* =100, OeeTarget* =90, SetupTimeMin* =0, CleanupTimeMin* =0, CostPerHour* =0, CostPerEmployeeHour* =0, ExpenseAccount (32), AllowedUserIds MAX, Description MAX, IsActive* =1WorkCenter, AbpUsers
Inv_T_WorkCenterCapacityHayırWorkCenterId*, ProductId*, Capacity* =1, SetupTimeMin, CleanupTimeMinProduct
Inv_T_OperationEvetName* (128), WorkCenterId*, ApplyOnVariantValueIds MAX, CostBasis* (16) ='Actual', DurationMode* (16) ='Fixed', DefaultDurationMin* =60, IsActive* =1WorkCenter, AttributeValue
Inv_T_OperationInstructionHayırOperationId*, Title* (256), Type* (16) ='Text', Reference MAX, SortOrder* int =0static
Inv_T_BomEvetProductId*, ProductVariantId, Quantity* =1, UomId* (64) ='Adet', Reference (64), ReadinessPolicy* (16) ='AllComponents', FlexibleConsumption* (16) ='Warning', OperationType (64), ManufacturingLeadDays* int =0, PreparationDays* int =0, UseBatchSize* =0, BatchSize, IsActive* =1 — BomType yokProduct, ProductVariant, Adm_T_Uom
Inv_T_BomOperationHayırBomId*, OperationId*, WorkCenterId*, DurationMin* =0, SortOrder* int =0Operation, WorkCenter
Inv_T_BomLineHayırBomId*, ComponentProductId*, ComponentVariantId, Quantity* =1, UomId* (64) ='Adet', BomOperationId, ApplyOnVariantValueIds MAXProduct, ProductVariant, Adm_T_Uom, BomOperation
\n

Static kümeler (TR/EN): DisplayType Radio/Pills/Select/Color/Multi/Image · VariantCreation Always/Dynamic/Never · ProductType Goods/Service/Combo · TrackingType Serial/Lot/Quantity · PurchaseControlPolicy Ordered/Received · ReadinessPolicy AllComponents/FirstOperation · FlexibleConsumption Allowed/Warning/Blocked · CostBasis Actual/Theoretical · DurationMode Fixed/Computed · Instruction Type Text/Pdf/Image/Link.

\n

BomOverview Query: TableName \"Q\", KeyFieldName RowId (DbSourceType 16), ParentRowId ağaç ebeveyni; Inv_T_Bom'un TenantId ve IsDeleted'ı seçilir. Kök satır (Level 0, ParentRowId NULL) = reçete; bileşen ve operasyon satırları ebeveynlerinin altında; bileşenin aktif reçetesi (varyantı eşleşen, yoksa varyantsız, en yeni) varsa satırları o bileşenin altında açılır, 4 seviyeye kadar. Miktar = Π(üst satır miktarı ÷ alt reçete miktarı) × satır miktarı; bileşen maliyeti = miktar × (varyant maliyeti, yoksa ürün maliyeti); operasyon maliyeti = süre/60 × CostPerHour; kök ve üst bileşen ürünleri yeniden açılmaz. Kolonlar: RowId, ParentRowId, BomId, RootProduct, Level, RowType, ItemName, Quantity, Uom, UnitCost, TotalCost.

\n\n

6. Alt form ağacı

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Taşıyıcı › SekmeHedefTabTypeMenüİlişkiEkle/Düzenle/Sil
Nitelik › Nitelik DeğerleriApp.Inventory.AttributeValueListMenüsüzId → AttributeId✓/✓/✓
Ürün › Genel BilgiApp.Inventory.ProductGeneralFormMenüsüzId → Id–/✓/–
Ürün › Nitelik & VaryantlarApp.Inventory.ProductAttributeLineListMenüsüzId → ProductId✓/✓/✓
Ürün › VaryantlarApp.Inventory.ProductVariantListMenülüId → ProductId–/✓/–
Ürün › SatınalmaApp.Inventory.ProductPurchasingFormMenüsüzId → Id–/✓/–
Ürün › TedarikçilerApp.Inventory.ProductSupplierListMenüsüzId → ProductId✓/✓/✓
Ürün › StokApp.Inventory.ProductStockFormMenüsüzId → Id–/✓/–
Ürün › MuhasebeApp.Inventory.ProductAccountingFormMenüsüzId → Id–/✓/–
Ürün › Ürün ReçeteleriApp.Inventory.BomListMenülüId → ProductId✓/✓/✓
Varyant › Varyant ReçeteleriApp.Inventory.BomListMenülüId → ProductVariantId, ProductId → ProductId✓/✓/✓
İş Merkezi › Genel BilgiApp.Inventory.WorkCenterGeneralFormMenüsüzId → Id–/✓/–
İş Merkezi › Ürün KapasitesiApp.Inventory.WorkCenterCapacityListMenüsüzId → WorkCenterId✓/✓/✓
Operasyon › AçıklamalarApp.Inventory.OperationInstructionListMenüsüzId → OperationId✓/✓/✓
Operasyon › AyarlarApp.Inventory.OperationSettingsFormMenüsüzId → Id–/✓/–
Reçete › BileşenlerApp.Inventory.BomLineListMenüsüzId → BomId✓/✓/✓
Reçete › OperasyonlarApp.Inventory.BomOperationListMenüsüzId → BomId✓/✓/✓
\n\n

7. Etkilenen kısımlar

\n
    \n
  • 14 yeni tablo; yeni menü kökü Envanter + Tanımlamalar; 8 menülü, 14 menüsüz ekran (6'sı aynı tabloyu okuyan Form sekmesi), her ekranda C/R/U/D/Export/Import/Note.
  • \n
  • Custom Endpoint Inventory.GenerateVariants (POST) — kayıt zaten var, değişmez. Yeni Custom Endpoint Inventory.WeeklyWorkingHours (GET /inventory/weekly-working-hours/): kiracı ayarı, yoksa global, yoksa tanım varsayılanı (45).
  • \n
  • Endpoint'leri kullanacak rollere App.DeveloperKit.CustomEndpoints.Post ve .Get yetkisi gerekir.
  • \n
  • İK ayarı App.HrSettings.Attendance.WeeklyLimitHours yalnız okunur. Dil anahtarları TR/EN; modül dokümanı App.Inventory.md.
  • \n
\n\n

8. Görünümler ve davranış

\n
    \n
  • Ürünler listesi: Ürün Adı, Resim, Satış, Masraflar, Satınalma, İç Referans, Satış Fiyatı, Maliyet, Birim (ekleme formunda da bunlar; diğer alanlar varsayılanla açılır). Detayda sekmeler: Genel Bilgi (Favori, Ürün Türü, Envanter Takibi, Takip Şekli, Satış Vergisi, Satınalma Vergisi, Kategori, Barkod, GTİP, İç Notlar, Varyantlı, Aktif), Nitelik & Varyantlar, Varyantlar, Satınalma (Kontrol Kuralı, Açıklama), Tedarikçiler, Stok, Muhasebe, Ürün Reçeteleri.
  • \n
  • Genel Bilgi sekmesi açılınca Varyantlı alanının script'i varyant endpoint'ini çağırır; nitelik satırları değişince Genel Bilgi sekmesini yeniden açmak varyantları günceller.
  • \n
  • EditorScript (readOnly/set/clear): Envanter Takibi kapalı → Takip Şekli kilitli ve boş, açık → varsayılan Miktara Göre; Hizmet → Envanter Takibi kilitli ve kapalı; Reçete Parti Büyüklüğü kapalı → Parti Miktarı kilitli ve boş.
  • \n
  • Nitelik & Varyantlar: Nitelik seçilir, Değerler çoklu seçim (tagbox) niteliğe göre süzülür.
  • \n
  • İş Merkezleri listesi: İş Merkezi Adı, Etiketler, Çalışma Saatleri (haftalık saat). Yeni kayıtta Çalışma Saatleri boşsa script Inventory.WeeklyWorkingHours'tan doldurur (değiştirilebilir). Formda ayrıca Kod, Alternatif İş Merkezleri, Aktif. Detay: Genel Bilgi (verimlilik, OEE, kurulum/temizlik, saatlik maliyetler, gider hesabı, izin verilen çalışanlar, açıklama) ve Ürün Kapasitesi.
  • \n
  • Operasyonlar listesi: Operasyon Adı, İş Merkezi, Varsayılan Süre. Detay: Açıklamalar listesi ve Ayarlar (Varyantlara Uygula, Maliyete Dayalı, Süre Hesaplama, Aktif).
  • \n
  • Ürün Reçeteleri: BoM Türü yok. Ürün seçilir, Varyant boşsa ürün bazında, doluysa o varyant için; Varyantlar listesinin detayında Varyant Reçeteleri sekmesi. Satır butonu Genel Bakış (Url, BomId filtresi).
  • \n
  • Reçete Genel Bakış: açılış Tree (KeyExpr RowId, ParentIdExpr ParentRowId); salt okunur; Grid/Pivot da açık.
  • \n
  • Widget'lar: Toplam · Aktif · Pasif; Ürünler'de ek Satılabilir · Satınalınabilir · Varyantlı.
  • \n
\n\n

9. Kararlar

\n
    \n
  • Detay sekmeleri Kontaklar desenindedir: aynı tabloyu okuyan Form alt formlar, ilişki Id → Id, ekleme/silme kapalı.
  • \n
  • Ürün listesine [image-1]'deki İç Referans, Satış Fiyatı, Maliyet, Birim eklendi; Stokta ve Öngörülen stok hareketi tabloları olmadığı için eklenmez (onay).
  • \n
  • Çalışma Saatleri = haftalık saat (WeeklyWorkingHours), varsayılan İK ayarı haftalık çalışma limitinden gelir; Vardiya bağlantısı kaldırıldı.
  • \n
  • Etiketler serbest metin (virgülle ayrılmış) (onay).
  • \n
  • Varyantlar ürünün Genel Bilgi sekmesi açılınca üretilir; ayrı buton yok (onay).
  • \n
  • Reçete Genel Bakış 4 seviyeye kadar açar; birim çevrimi yok (onay).
  • \n
  • Tek KDV oranı (%20), gelir/gider hesabı serbest kod (onay).
  • \n
  • Ekipman/Bakım sekmeleri, akıllı butonlar bu talepte yok (onay).
  • \n
  • Görünüm Türü kayıt bilgisi; Always ve Dynamic aynı, Never kombinasyona katılmaz (onay).
  • \n
  • Demo veri yalnız bağımsız satırlarda: Kategoriler (2), Nitelikler renk/malzeme/boyut, İş Merkezi ram makinası, Ürünler [image-1]'den 6 satır (birim Adet). Nitelik değerleri, Apre operasyonu ve reçete modül dokümanındaki akışla elle girilir.
  • \n
\n\n

10. Üretim planı

\n
    \n
  1. create_table: Inv_T_ProductCategory
  2. \n
  3. create_table: Inv_T_Attribute
  4. \n
  5. create_table: Inv_T_AttributeValue
  6. \n
  7. create_table: Inv_T_Product
  8. \n
  9. create_table: Inv_T_ProductAttributeLine
  10. \n
  11. create_table: Inv_T_ProductVariant
  12. \n
  13. create_table: Inv_T_ProductSupplier
  14. \n
  15. create_table: Inv_T_WorkCenter
  16. \n
  17. create_table: Inv_T_WorkCenterCapacity
  18. \n
  19. create_table: Inv_T_Operation
  20. \n
  21. create_table: Inv_T_OperationInstruction
  22. \n
  23. create_table: Inv_T_Bom
  24. \n
  25. create_table: Inv_T_BomOperation
  26. \n
  27. create_table: Inv_T_BomLine
  28. \n
  29. insert_row: App.DeveloperKit.CustomEndpoints (Inventory.WeeklyWorkingHours)
  30. \n
  31. deploy_wizard: ProductCategory.json
  32. \n
  33. deploy_wizard: AttributeValue.json
  34. \n
  35. deploy_wizard: Attribute.json
  36. \n
  37. deploy_wizard: WorkCenterCapacity.json
  38. \n
  39. deploy_wizard: WorkCenterGeneral.json
  40. \n
  41. deploy_wizard: WorkCenter.json
  42. \n
  43. deploy_wizard: OperationInstruction.json
  44. \n
  45. deploy_wizard: OperationSettings.json
  46. \n
  47. deploy_wizard: Operation.json
  48. \n
  49. deploy_wizard: BomOperation.json
  50. \n
  51. deploy_wizard: BomLine.json
  52. \n
  53. deploy_wizard: Bom.json
  54. \n
  55. deploy_wizard: ProductVariant.json
  56. \n
  57. deploy_wizard: ProductGeneral.json
  58. \n
  59. deploy_wizard: ProductAttributeLine.json
  60. \n
  61. deploy_wizard: ProductPurchasing.json
  62. \n
  63. deploy_wizard: ProductSupplier.json
  64. \n
  65. deploy_wizard: ProductStock.json
  66. \n
  67. deploy_wizard: ProductAccounting.json
  68. \n
  69. deploy_wizard: Product.json
  70. \n
  71. deploy_wizard: BomOverview.json
  72. \n
  73. save_module_doc: App.Inventory.Definitions
  74. \n
\n\n

11. Üretime hazır

\n

Evet

" } ] } diff --git a/configs/seeds/data/App.DevRequests/94639b65-1bb7-454a-ae73-3e1c5c9fe23a.json b/configs/seeds/data/App.DevRequests/94639b65-1bb7-454a-ae73-3e1c5c9fe23a.json index b2822d8e..913a55ee 100644 --- a/configs/seeds/data/App.DevRequests/94639b65-1bb7-454a-ae73-3e1c5c9fe23a.json +++ b/configs/seeds/data/App.DevRequests/94639b65-1bb7-454a-ae73-3e1c5c9fe23a.json @@ -12,10 +12,10 @@ "Status": "Backlog", "Title": "Proje Modülü", "Description": "

Projeler: Aşağıdaki resimdeki şekilde Proje tanımlanabilmeli. Liste Layout: Card, Grid şeklinde olmalı. Projenin tipi belirlenebilmeli iç ve dış olarak. Proje listeinin yanında Tasks butonu olmalı ve Proje Tasks formu açılmalı.



Proje Tasks : Proje taskları aynı TodoView şeklinde gösterilmeli ve aşağıdaki resimdeki gibi bilgileir olmalı. Menüde ayrıca tüm görevlerin bir listesi olmalı. Yine menüde kendine ait Görevlerimin listesi olmalı.


Dönüm Noktası sütunu olmayacak. Entitye eklenmeyecek. Ayrıca Satırş Sipariş Satırı eklenecek ama şu anda Satış Siparişi Entitiy henüz yok.


Aktivite Türleri tanımlanabilmeli.


Etiketler tanımlanabilmeli


", - "DueDate": null, - "Tags": null, - "Assignees": null, - "Priority": null, + "DueDate": "2026-10-07T14:06:00", + "Tags": "PJ", + "Assignees": "system@sozsoft.com", + "Priority": "5", "Completed": false, "SortOrder": 1, "Timesheets": null, diff --git a/configs/seeds/data/App.DevRequests/b0b200d4-f3f6-4fe3-9f11-5bff3040a110.json b/configs/seeds/data/App.DevRequests/b0b200d4-f3f6-4fe3-9f11-5bff3040a110.json index 1e24a6dd..538b494a 100644 --- a/configs/seeds/data/App.DevRequests/b0b200d4-f3f6-4fe3-9f11-5bff3040a110.json +++ b/configs/seeds/data/App.DevRequests/b0b200d4-f3f6-4fe3-9f11-5bff3040a110.json @@ -12,10 +12,10 @@ "Status": "Staging", "Title": "Human Resources -> Araçlar", "Description": "

Araç Belgeleri : Araçlarda kullanılmak üzere belge tanımlama listesidir.


Araçlar : Şubeye ait araçların listesidir. Araç listesinin detay formu ile aşağıdaki form açılacaktır. detay formunda araç belgeleri ve pdf, resim vs. belgeleri uplaod edilebilmelidir.


Gidilecek Yerler: Araçlar ile gidilebilecek tanımlı yerlerin listesidir.


Şoför Tanımlama : Şirket araçlarını kullanan kullanıcıların listesidir. SubFormlardaki Belge Adı bilgisi Araç Belgelerinden gelmektedir. Ayrıca bu belgeleri pdf, image vs dosyalarını subformlara upload edilebilmelidir.


Masraf Tanımlama: Araçlara ait masrafların listesidir.


Masraf Girişleri : Her araç için girilen masrafların tanımlandığı alandır. Masraf Girişleri Listesi üzerinden detay formu ile ulaşılabilir. Firma Adı sütunu aslında Gidilecek Yerler listesinden seçilecektir. Yine Belge adı bilgisi Araç Belgelerinden seçilmelidir. Ayrıca dosya upoad edilebilmelidir.


Araç Giriş-Çıkış Takip Listesi: Bu liste aracın şirkette mi yoksa dışarıda mı olduğunu takip eder. Ayrıca araçların giriş ve çıkış km bilgilerinin kaydedildiği bir listedir. Durum bilgisi içeride ve dışarıda gibi bir bilgi olabilir. Eğer giriş km yazıldıysa Durum otomatik değişecektir.

", - "DueDate": null, - "Tags": null, - "Assignees": null, - "Priority": null, + "DueDate": "2026-10-07T14:05:00", + "Tags": "HR", + "Assignees": "system@sozsoft.com", + "Priority": "5", "Completed": true, "SortOrder": 0, "Timesheets": "[{\"id\":\"87a0dad1-aa21-0163-32d6-3a240d7cbea7\",\"date\":\"2026-10-02\",\"userName\":\"system@sozsoft.com\",\"description\":\"Talep analiz edildi\",\"duration\":0.0333},{\"id\":\"e139bb8c-42e1-2f28-79f7-3a240d7ed4ea\",\"date\":\"2026-10-02\",\"userName\":\"system@sozsoft.com\",\"description\":\"Talep analiz edildi\",\"duration\":0.0333},{\"id\":\"87dd9960-9acd-a82e-5891-3a240d80900a\",\"date\":\"2026-10-02\",\"userName\":\"system@sozsoft.com\",\"description\":\"Hr_T_VehicleDocument tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"327c8521-bd5a-6f89-468d-3a240d80a840\",\"date\":\"2026-10-02\",\"userName\":\"system@sozsoft.com\",\"description\":\"Hr_T_Vehicle tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"257b0522-fd77-870a-3825-3a240d80b8f2\",\"date\":\"2026-10-02\",\"userName\":\"system@sozsoft.com\",\"description\":\"Hr_T_VehicleFile tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"1939f0ab-9a60-bd17-771b-3a240d80cabd\",\"date\":\"2026-10-02\",\"userName\":\"system@sozsoft.com\",\"description\":\"Hr_T_VehicleDestination tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"208bd1ea-93cf-6f7c-546c-3a240d80db09\",\"date\":\"2026-10-02\",\"userName\":\"system@sozsoft.com\",\"description\":\"Hr_T_Driver tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"450fce6f-02ed-2498-4a05-3a240d80fd1f\",\"date\":\"2026-10-02\",\"userName\":\"system@sozsoft.com\",\"description\":\"Hr_T_DriverDocument tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"270693c6-f840-990c-6ba9-3a240d810bca\",\"date\":\"2026-10-02\",\"userName\":\"system@sozsoft.com\",\"description\":\"Hr_T_DriverPenalty tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"3060eff7-569e-70ab-f13c-3a240d811d6c\",\"date\":\"2026-10-02\",\"userName\":\"system@sozsoft.com\",\"description\":\"Hr_T_DriverAccident tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"f32f3f07-94c6-f967-403c-3a240d81342f\",\"date\":\"2026-10-02\",\"userName\":\"system@sozsoft.com\",\"description\":\"Hr_T_VehicleExpenseDefinition tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"005c285b-bb51-7ca1-5bc7-3a240d81430b\",\"date\":\"2026-10-02\",\"userName\":\"system@sozsoft.com\",\"description\":\"Hr_T_VehicleExpense tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"f33f1ade-7111-1a8f-52a6-3a240d8157e3\",\"date\":\"2026-10-02\",\"userName\":\"system@sozsoft.com\",\"description\":\"Hr_T_VehicleExpenseLine tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"02bcf651-0fa7-a8b4-99c4-3a240d817801\",\"date\":\"2026-10-02\",\"userName\":\"system@sozsoft.com\",\"description\":\"Hr_T_VehicleMovement tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"2b88f672-39e3-521e-8685-3a240d82e369\",\"date\":\"2026-10-02\",\"userName\":\"system@sozsoft.com\",\"description\":\"VehicleDocument.json wizard\\u0027\\u0131 deploy edildi (17 demo sat\\u0131r)\",\"duration\":0.0333},{\"id\":\"ed991c40-4f8a-9677-7752-3a240d8329d4\",\"date\":\"2026-10-02\",\"userName\":\"system@sozsoft.com\",\"description\":\"VehicleFile.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"7f9d727c-781d-4a2c-4442-3a240d83ce08\",\"date\":\"2026-10-02\",\"userName\":\"system@sozsoft.com\",\"description\":\"Vehicle.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"84f0f709-3940-42d4-7782-3a240d840c84\",\"date\":\"2026-10-02\",\"userName\":\"system@sozsoft.com\",\"description\":\"VehicleDestination.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"1d9810dc-f036-4a81-aa38-3a240d8440d6\",\"date\":\"2026-10-02\",\"userName\":\"system@sozsoft.com\",\"description\":\"DriverDocument.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"b32b85aa-5a2b-736d-a7fc-3a240d84815e\",\"date\":\"2026-10-02\",\"userName\":\"system@sozsoft.com\",\"description\":\"DriverPenalty.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"d7bb665d-a06b-afb7-3251-3a240d84bd1f\",\"date\":\"2026-10-02\",\"userName\":\"system@sozsoft.com\",\"description\":\"DriverAccident.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"8a94b2d1-6d64-d1a0-320d-3a240d852bdb\",\"date\":\"2026-10-02\",\"userName\":\"system@sozsoft.com\",\"description\":\"Driver.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"2e683fbc-06e2-0adf-a7f7-3a240d857120\",\"date\":\"2026-10-02\",\"userName\":\"system@sozsoft.com\",\"description\":\"VehicleExpenseDefinition.json wizard\\u0027\\u0131 deploy edildi (9 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"46273579-18ad-54b7-56cb-3a240d85cbd0\",\"date\":\"2026-10-02\",\"userName\":\"system@sozsoft.com\",\"description\":\"VehicleExpenseLine.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"f1aeb641-913d-14c4-055a-3a240d862ef1\",\"date\":\"2026-10-02\",\"userName\":\"system@sozsoft.com\",\"description\":\"VehicleExpense.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"cb567bce-0707-bb0a-6eb6-3a240d8766b0\",\"date\":\"2026-10-02\",\"userName\":\"system@sozsoft.com\",\"description\":\"VehicleMovement.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"30ad3527-7e77-fe48-c6be-3a240d87bc25\",\"date\":\"2026-10-02\",\"userName\":\"system@sozsoft.com\",\"description\":\"24 tamamlanm\\u0131\\u015F alt g\\u00F6rev eklendi\",\"duration\":0.0167},{\"id\":\"3c685956-4a82-1045-e6e4-3a240d87ea75\",\"date\":\"2026-10-02\",\"userName\":\"system@sozsoft.com\",\"description\":\"Analize \\u00FCretim notu eklendi\",\"duration\":0.0167},{\"id\":\"fa80ab64-0c67-7d80-57f6-3a240d881724\",\"date\":\"2026-10-02\",\"userName\":\"system@sozsoft.com\",\"description\":\"App.DevRequests ekran\\u0131nda sat\\u0131r g\\u00FCncellendi (Status)\",\"duration\":0.0167}]", diff --git a/configs/seeds/data/App.DevRequests/fcda5fdc-afab-4006-abcd-eb9846359e05.json b/configs/seeds/data/App.DevRequests/fcda5fdc-afab-4006-abcd-eb9846359e05.json index ebe35c55..e3f592ee 100644 --- a/configs/seeds/data/App.DevRequests/fcda5fdc-afab-4006-abcd-eb9846359e05.json +++ b/configs/seeds/data/App.DevRequests/fcda5fdc-afab-4006-abcd-eb9846359e05.json @@ -12,10 +12,10 @@ "Status": "Staging", "Title": "Satınalma Modülü", "Description": "

Tüm tanımlamalar Satınalma -> Tanımlamalar alt menüsünün altında olacaktır.


Tedarikçi Listesi


Tedarikçi Tanımlama :


Notlar kısmı HtmlEditor olmalı.


Ödeme Koşulları


Ödeme Yöntemi


Teslimat Koşulu




", - "DueDate": null, - "Tags": null, - "Assignees": null, - "Priority": null, + "DueDate": "2026-10-07T14:05:00", + "Tags": "PO", + "Assignees": "system@sozsoft.com", + "Priority": "5", "Completed": true, "SortOrder": 6, "Timesheets": "[{\"id\":\"154575fe-be20-cba8-ba27-3a241fa73ae5\",\"date\":\"2026-10-05\",\"userName\":\"system@sozsoft.com\",\"description\":\"Talep analiz edildi\",\"duration\":0.0333},{\"id\":\"552ef81f-7ffe-34f7-725c-3a241fa8f17a\",\"date\":\"2026-10-05\",\"userName\":\"system@sozsoft.com\",\"description\":\"Prc_T_PaymentTerm tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"c8662bd1-74e3-aad4-84cc-3a241fa8fa63\",\"date\":\"2026-10-05\",\"userName\":\"system@sozsoft.com\",\"description\":\"Prc_T_PaymentMethod tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"91c0671f-b155-6b5e-327c-3a241fa902f3\",\"date\":\"2026-10-05\",\"userName\":\"system@sozsoft.com\",\"description\":\"Prc_T_Incoterm tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"00169f94-b1b7-7900-dc17-3a241fa90b74\",\"date\":\"2026-10-05\",\"userName\":\"system@sozsoft.com\",\"description\":\"Prc_T_DeliveryMethod tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"a2d40f23-4353-2b41-5416-3a241fa91aa6\",\"date\":\"2026-10-05\",\"userName\":\"system@sozsoft.com\",\"description\":\"Prc_T_SupplierTag tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"007a45fc-a3cc-f71e-9a92-3a241fa94c01\",\"date\":\"2026-10-05\",\"userName\":\"system@sozsoft.com\",\"description\":\"Prc_T_Supplier tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"e2e1946d-cda1-854f-5fc7-3a241fa95b0b\",\"date\":\"2026-10-05\",\"userName\":\"system@sozsoft.com\",\"description\":\"Prc_T_SupplierContact tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"04655c74-6a4f-2795-6e70-3a241fa966b9\",\"date\":\"2026-10-05\",\"userName\":\"system@sozsoft.com\",\"description\":\"Prc_T_SupplierBankAccount tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"191168d6-7de1-a141-0e08-3a241fa9fe76\",\"date\":\"2026-10-05\",\"userName\":\"system@sozsoft.com\",\"description\":\"PaymentTerm.json wizard\\u0027\\u0131 deploy edildi (8 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"49dfd190-0f37-67bf-98e5-3a241faa4c45\",\"date\":\"2026-10-05\",\"userName\":\"system@sozsoft.com\",\"description\":\"PaymentMethod.json wizard\\u0027\\u0131 deploy edildi (8 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"837b1608-979b-572d-9991-3a241faa966c\",\"date\":\"2026-10-05\",\"userName\":\"system@sozsoft.com\",\"description\":\"Incoterm.json wizard\\u0027\\u0131 deploy edildi (8 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"4bf85806-fa96-18dc-cd29-3a241faad620\",\"date\":\"2026-10-05\",\"userName\":\"system@sozsoft.com\",\"description\":\"DeliveryMethod.json wizard\\u0027\\u0131 deploy edildi (3 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"1c4014b1-3a8e-54cf-4a14-3a241fab1998\",\"date\":\"2026-10-05\",\"userName\":\"system@sozsoft.com\",\"description\":\"SupplierTag.json wizard\\u0027\\u0131 deploy edildi (3 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"02c473aa-b980-4b71-bc73-3a241fab6e74\",\"date\":\"2026-10-05\",\"userName\":\"system@sozsoft.com\",\"description\":\"SupplierContact.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"0855df31-c1d3-3dc7-c023-3a241fabb4b5\",\"date\":\"2026-10-05\",\"userName\":\"system@sozsoft.com\",\"description\":\"SupplierBankAccount.json wizard\\u0027\\u0131 deploy edildi (0 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"c9e3643a-137a-7583-a71e-3a241fad1141\",\"date\":\"2026-10-05\",\"userName\":\"system@sozsoft.com\",\"description\":\"Supplier.json wizard\\u0027\\u0131 deploy edildi (13 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"044cc1fa-e069-afc1-a1c7-3a241fad86f9\",\"date\":\"2026-10-05\",\"userName\":\"system@sozsoft.com\",\"description\":\"PrcDefinitions mod\\u00FCl dok\\u00FCman\\u0131 kaydedildi\",\"duration\":0.0167},{\"id\":\"e9997bed-e622-5026-214b-3a241fad96fc\",\"date\":\"2026-10-05\",\"userName\":\"system@sozsoft.com\",\"description\":\"17 tamamlanm\\u0131\\u015F alt g\\u00F6rev eklendi\",\"duration\":0.0167},{\"id\":\"9565de00-7592-0e2c-8d3c-3a241fadc8f0\",\"date\":\"2026-10-05\",\"userName\":\"system@sozsoft.com\",\"description\":\"Analize \\u00FCretim notu eklendi\",\"duration\":0.0167},{\"id\":\"20104ee0-9d70-a8e5-08b8-3a241fadd75c\",\"date\":\"2026-10-05\",\"userName\":\"system@sozsoft.com\",\"description\":\"App.DevRequests ekran\\u0131nda sat\\u0131r g\\u00FCncellendi (Status)\",\"duration\":0.0167}]", diff --git a/configs/seeds/data/App.DeveloperKit.CustomEndpoints/22cdbe14-f7dc-5771-8553-927ad017db9e.json b/configs/seeds/data/App.DeveloperKit.CustomEndpoints/22cdbe14-f7dc-5771-8553-927ad017db9e.json new file mode 100644 index 00000000..55589de0 --- /dev/null +++ b/configs/seeds/data/App.DeveloperKit.CustomEndpoints/22cdbe14-f7dc-5771-8553-927ad017db9e.json @@ -0,0 +1,19 @@ +{ + "ListFormCode": "App.DeveloperKit.CustomEndpoints", + "KeyFieldName": "Id", + "GeneratedAt": "2026-09-04T00:00:00Z", + "Order": 0, + "Rows": [ + { + "Id": "22cdbe14-f7dc-5771-8553-927ad017db9e", + "Name": "Langugage", + "Description": "https://localhost:44344/api/app/custom-endpoint/dil/en", + "Url": "/dil/", + "Method": "GET", + "DataSourceCode": "Default", + "Sql": "SELECT * FROM Sas_H_Language WHERE IsEnabled = @IsEnabled AND CultureName = @CultureName", + "ParametersJson": "[{\"Type\":\"Path\",\"Name\":\"CultureName\",\"DefaultValue\":\"ar\",\"Path\":\"/dil/:CultureName/\",\"IsRequired\":false},{\"Type\":\"Static\",\"Name\":\"IsEnabled\",\"DefaultValue\":\"true\",\"Path\":null,\"IsRequired\":false}]", + "PermissionsJson": "[{\"ResourceType\":\"User\",\"ResourceId\":\"system@sozsoft.com\"}]" + } + ] +} diff --git a/configs/seeds/data/App.DeveloperKit.CustomEndpoints.json b/configs/seeds/data/App.DeveloperKit.CustomEndpoints/3c8b861f-abfa-5db3-8d93-8c1a08605ac5.json similarity index 58% rename from configs/seeds/data/App.DeveloperKit.CustomEndpoints.json rename to configs/seeds/data/App.DeveloperKit.CustomEndpoints/3c8b861f-abfa-5db3-8d93-8c1a08605ac5.json index 5f680c03..b1f3b22f 100644 --- a/configs/seeds/data/App.DeveloperKit.CustomEndpoints.json +++ b/configs/seeds/data/App.DeveloperKit.CustomEndpoints/3c8b861f-abfa-5db3-8d93-8c1a08605ac5.json @@ -2,18 +2,8 @@ "ListFormCode": "App.DeveloperKit.CustomEndpoints", "KeyFieldName": "Id", "GeneratedAt": "2026-09-04T00:00:00Z", + "Order": 0, "Rows": [ - { - "Id": "22cdbe14-f7dc-5771-8553-927ad017db9e", - "Name": "Langugage", - "Description": "https://localhost:44344/api/app/custom-endpoint/dil/en", - "Url": "/dil/", - "Method": "GET", - "DataSourceCode": "Default", - "Sql": "SELECT * FROM Sas_H_Language WHERE IsEnabled = @IsEnabled AND CultureName = @CultureName", - "ParametersJson": "[{\"Type\":\"Path\",\"Name\":\"CultureName\",\"DefaultValue\":\"ar\",\"Path\":\"/dil/:CultureName/\",\"IsRequired\":false},{\"Type\":\"Static\",\"Name\":\"IsEnabled\",\"DefaultValue\":\"true\",\"Path\":null,\"IsRequired\":false}]", - "PermissionsJson": "[{\"ResourceType\":\"User\",\"ResourceId\":\"system@sozsoft.com\"}]" - }, { "Id": "3c8b861f-abfa-5db3-8d93-8c1a08605ac5", "Name": "HrAttendancePdks", diff --git a/configs/seeds/data/App.Languages.LanguageText.json b/configs/seeds/data/App.Languages.LanguageText.json index 70efea84..ffdf7b09 100644 --- a/configs/seeds/data/App.Languages.LanguageText.json +++ b/configs/seeds/data/App.Languages.LanguageText.json @@ -69150,6 +69150,20 @@ "Key": "App.Mcp.Error.SeedRowsUnknownFields", "Value": "seedRows ekranda olmayan alanlar içeriyor: {0}. Ekranın alanları: {1}." }, + { + "Id": "e24ee936-c5cf-5839-840b-5ade854f8310", + "CultureName": "en", + "ResourceName": "Platform", + "Key": "App.Mcp.Error.SeedRowsFieldsOnOtherScreens", + "Value": "seedRows contains fields that are not on the screen: {0}. These columns are fields of other screens on the same table ({1}); migrate writes a demo row only into columns that are fields of this screen. Add them to this screen's Groups (IncludeInEditingForm: false if they belong to another tab) or remove them from the rows, then deploy again. Screen fields: {2}." + }, + { + "Id": "41b2c0c2-a87d-5b3c-9f42-49395ff075c5", + "CultureName": "tr", + "ResourceName": "Platform", + "Key": "App.Mcp.Error.SeedRowsFieldsOnOtherScreens", + "Value": "seedRows ekranda olmayan alanlar içeriyor: {0}. Bu kolonlar aynı tablonun başka ekranlarında alan ({1}); migrate demo satırı yalnızca bu ekranın alanı olan kolonlara yazar. Kolonları bu ekranın Groups'una ekle (başka bir sekmeye aitse IncludeInEditingForm: false) ya da satırlardan çıkar, sonra tekrar deploy et. Ekranın alanları: {2}." + }, { "Id": "fe038e1e-68b6-5cfe-ad9e-42c8e58f01bb", "CultureName": "en", @@ -69318,6 +69332,20 @@ "Key": "App.Mcp.Error.SelectFailedColumns", "Value": "Sorgu çalışmadı: {0} Sorgudaki tabloların gerçek kolonları: {1}. Sorguyu yalnızca bu kolonlarla yeniden yaz; kolon adı tahmin etme." }, + { + "Id": "b408c374-3a88-54be-868f-6417e96bdd1e", + "CultureName": "en", + "ResourceName": "Platform", + "Key": "App.Mcp.Error.SelectTableNotInstalled", + "Value": "The query failed: {0} These tables are defined in seed scripts but not installed in the database yet: {1}. create_table only writes the script; the table is created when the user runs DB Migrate. Do not query or retry them in this request: there are no rows to read. Use the columns listed here and continue (deploy_wizard reads them from the script); tell the user that DB Migrate is required." + }, + { + "Id": "259012b8-fcf6-5995-a411-90d6aa6fabcc", + "CultureName": "tr", + "ResourceName": "Platform", + "Key": "App.Mcp.Error.SelectTableNotInstalled", + "Value": "Sorgu çalışmadı: {0} Bu tablolar seed scriptinde tanımlı ama veritabanına henüz kurulmadı: {1}. create_table yalnızca scripti yazar; tabloyu kullanıcının çalıştırdığı DB Migrate kurar. Bu talepte tabloları sorgulama ya da tekrar deneme: okunacak satır yok. Buradaki kolonlarla devam et (deploy_wizard kolonları scriptten okur); kullanıcıya DB Migrate gerektiğini bildir." + }, { "Id": "aac27480-88f4-5230-9820-f9c7472ef178", "CultureName": "en", diff --git a/configs/seeds/docs/modules/App.Hr.md b/configs/seeds/docs/modules/App.Hr.md index 8e0dd2b1..f6cbb587 100644 --- a/configs/seeds/docs/modules/App.Hr.md +++ b/configs/seeds/docs/modules/App.Hr.md @@ -1496,7 +1496,7 @@ grubu, `App.HrSettings` altında). Hiçbir yetki role otomatik atanmaz. | Çalışma Takvimi | → izin, → puantaj | Tatil `Holiday`, arife `HalfDay` (yarım vardiya); takvim kaydı denk gelen izinlerin gün sayısını ve puantajı hemen yeniler (`Hr_S_WorkCalendarAfterSave`) | | Vardiyalar / kullanıcı vardiyası | → puantaj | Saat, mola, tolerans; değişiklik gece işinde ya da dönem kaydında yansır | | İzin ayarları | → puantaj | Hafta tatili günleri | -| PDKS | → hareket | Custom Endpoint `POST /api/app/custom-endpoint/hr/attendance/` (`data/App.DeveloperKit.CustomEndpoints.json`, `PermissionsJson`: rol `PDKS`) | +| PDKS | → hareket | Custom Endpoint `POST /api/app/custom-endpoint/hr/attendance/` (`data/App.DeveloperKit.CustomEndpoints/3c8b861f-abfa-5db3-8d93-8c1a08605ac5.json`, `PermissionsJson`: rol `PDKS`) | | Excel | → hareket | Günlük Hareketler import'u aynı kayıt yolundan (`InsertAfterCommand`) geçer; `Source` boş gelir ve `Import` yazılır | | Intranet | ← puantaj | `my-timesheet` widget'ı | | Kullanıcı detayı | ← puantaj | Puantaj sekmesi | @@ -1577,7 +1577,7 @@ Custom Endpoints'ten aynı SQL ve parametrelerle eklenir. | `configs/seeds/wizard/Shift.json` | Tolerans alanları | | `configs/seeds/data/App.DeveloperKit.CustomComponents/1bca19aa-e144-5e4c-b23b-9eddd4dafd19.json` | `MyTimesheetWidget` | | `configs/seeds/data/App.DeveloperKit.IntranetWidgets.json` | `my-timesheet` | -| `configs/seeds/data/App.DeveloperKit.CustomEndpoints.json` | PDKS ucu | +| `configs/seeds/data/App.DeveloperKit.CustomEndpoints/3c8b861f-abfa-5db3-8d93-8c1a08605ac5.json` | PDKS ucu | | `configs/seeds/data/App.BackgroundWorkers.RecurringJobs.json` | `Timesheet Nightly` | | `configs/seeds/data/App.SettingDefinitions.json` | `App.HrSettings.Attendance.*` | | `configs/seeds/data/{App.Menus.Menu,Abp.Identity.Permissions,App.Languages.LanguageText}.json` | Menü, yetki, dil |