ApplicationSuite
This commit is contained in:
parent
94ae8ed7ac
commit
eb57bcd5ca
36 changed files with 709 additions and 131 deletions
|
|
@ -1272,10 +1272,11 @@ soneklerini alır.
|
|||
| **Definitions › Global Search** | `App.Definitions.GlobalSearch` | `Sas_T_GlobalSearch` | tenant | Üretilen ekranın üst aramada çıkması için kayıt: `System`, `Group`, `Term`, `Weight`, `Url`. |
|
||||
| **Definitions › Contact Title** | `App.Definitions.ContactTitle` | `Sas_H_ContactTitle` | host | Ünvan/hitap lookup'ı (`Title`, `Abbreviation`). |
|
||||
| **Definitions › Termination Reasons** | `App.Definitions.TerminationReason` | `Sas_H_TerminationReason` | host | SGK işten çıkış kodları (`Code`, `Name`, `IsActive`); mevzuat kodu olduğu için bütün kiracılarda ortaktır. Seed `data/App.Definitions.TerminationReason.json` (06/07 mülga). Kullanıcının `TerminationReasonId` alanı `LookupQueryValues.TerminationReasonValues` ile buraya bağlanır. |
|
||||
| **Definitions › Application Suites** | `App.Definitions.ApplicationSuite` | `Sas_H_ApplicationSuite` | host | Kiracıya açılan modül paketi (`Name` benzersiz, `Modules` `Sas_H_Module`'den çoklu `dxTagBox` — `\|` ile, `IsActive`). Sales Orders'ın kiracı oluşturma diyaloğu aktif paketleri `GET list-form-dynamic-api/application-suites` (`Tenants.Create`) ile okur ve seçilenin modüllerini forma yazar. Seed `data/App.Definitions.ApplicationSuite.json`. |
|
||||
| **Definitions › Currency** | `App.Definitions.Currency` | `Sas_H_Currency` | host | Para birimi + `Rate`. Tutar alanı olan ekranın kur lookup'ı ve `DbQuery` varsayılanı buradan beslenir. |
|
||||
| **Definitions › Country Group / Country / City / District** | `App.Definitions.CountryGroup` · `.Country` · `.City` · `.District` | `Sas_H_CountryGroup` · `Sas_H_Country` · `Sas_H_City` · `Sas_H_District` | host | Adres alanlarının hazır cascade zinciri (dört ayrı menü ve seed dosyası; `Order` sırası grup → ülke → il → ilçe). `Country` ayrıca `PhoneCode`, `PhoneNumberFormat`, `ZipRequired`, `StateRequired`, `TaxLabel` taşır — adres doğrulaması için kullan. |
|
||||
| **Public › Products / Payment Methods / Installment Options** | `App.Orders.Products` · `.PaymentMethods` · `.InstallmentOptions` | `Sas_H_Product` · `Sas_H_PaymentMethod` · `Sas_H_InstallmentOption` | host | Ürün, ödeme yöntemi (`Commission`), taksit — satış/abonelik ekranlarının ve public `/products` sayfasının kaynağı. |
|
||||
| **Public › Sales Orders** | `App.Orders.SalesOrders` (alt form Sales Order Item) | `Sas_H_Order` + `Sas_H_OrderItem` | host | **Onay akışı + alt kalem + toplam + diyalog** birlikte kullanılan tam örnek (§12.7). |
|
||||
| **Public › Sales Orders** | `App.Orders.SalesOrders` (alt form Sales Order Item) | `Sas_H_Order` + `Sas_H_OrderItem` | host | **Onay akışı + alt kalem + toplam + diyalog** birlikte kullanılan tam örnek (§12.7). Onaylanan siparişin `Tenant` komutu `CreateTenantFromOrderDialog`'u açar; diyalogda seçilen Application Suite modülleri doldurur (değiştirilebilir). |
|
||||
| **Public › Blog Category / Posts** | `App.BlogManagement.Category` · `.Posts` | `Sas_H_BlogCategory` · `Sas_H_BlogPost` | host | Çok dilli içerik (`ContentTr`/`ContentEn`), slug, yayın durumu, sayaç alanları; public `/blog` bu tablolardan okur, yayınlanmış yazılar sitemap'e girer. |
|
||||
| **Public › Demos** | `App.Demos` | `Sas_H_Demo` | host | Public `/demo` formundan gelen talepler — public form → tablo akışının örneği. |
|
||||
| **Tenants** | `AbpTenantManagement.Tenants` | `AbpTenants` | host | Kiracı kaydı, bağlantı dizesi diyaloğu (`TenantsConnectionString`), alt form olarak şubeler; yazma `list-form-dynamic-api/tenant-*`. Ekranların `IsTenant` davranışının kaynağı. |
|
||||
|
|
@ -1284,7 +1285,7 @@ soneklerini alır.
|
|||
| **Languages › Language / Language Text** | `App.Languages.Language` · `.LanguageText` | `Sas_H_Language` · `Sas_H_LanguageKey` · `Sas_H_LanguageText` | host | Dil anahtarları. Üretilen her ekranın EN+TR metinleri buraya yazılır; ekran `data/App.Languages.{Language,LanguageText}.json` dosyalarına senkronlanır. Metin insert'i eksik `LanguageKey`'i de üretir, aynı kültür+kaynak+anahtar varsa eklemez. |
|
||||
| **Data Source** | `App.DataSource` | `Sas_H_DataSource` | host | `Code`, `DataSourceType`, `ConnectionString`. Tipli API (`/api/app/data-source`) bağlantı cümlesini hiçbir zaman döndürmez; okuma açıktır (açılır listeler), yazma `App.DataSource.Create/Update/Delete` ister. **İki tür kayıt bir arada:** elle tanımlanan host/harici bağlantılar ve `Code = tenant adı` olan otomatik tenant bağlantıları (Tenants ekranındaki bağlantı diyaloğu yönetir, elle dokunma). Varsayılan kaydı `HostDataSeeder` appsettings'teki bağlantı cümlesinden kurar. Çözüm kuralı `lowcode` §9.3.3. Bağlantı dizesi koda/JSON'a yazılmaz. |
|
||||
| **Background Workers › Recurring Jobs / Jobs** | `App.BackgroundWorkers.RecurringJobs` · `.Jobs` | `Sas_H_BackgroundWorker` · `Sas_H_BackgroundWorker_JobFlow` | host | Cron'lu işler ve çalıştırma geçmişi (`Tenant`, `ExecutionDate`, `Duration`, `Status`, `FailureReason`, `ExceptionDetails`). `WorkerType`/`Scope` değerleri §11'de; her kapsam ayrı bir Hangfire işidir, `Tenant` kolonu hangi kiracıda çalıştığını gösterir. Hazır işler (oturum temizliği, bildirim, yedek, şema sözlüğü) `data/App.BackgroundWorkers.RecurringJobs.json`'dan gelir. Ayrıntı: `lowcode` §9.10, `README.md` §14. |
|
||||
| **Menus › Module / Routes / Menu / Manager** | `App.Menus.Module` · `.Routes` · `.Menu` · `.Manager` (`/admin/menuManager`) | `Sas_H_Module` · `Sas_H_Route` · `Sas_H_Menu` | host | Menü ve route veritabanından gelir; üretilen ekranın menü kaydı buradan açılır. `Menu` ekranı ağaç düzeninin referansıdır. Seed: `data/App.Menus.{Routes,Module,Menu}.json` — `Routes` dosyasına yalnızca var olan satırın `Seo*` alanları için dokunulur. |
|
||||
| **Menus › Routes / Menu / Manager** · **Definitions › Module** | `App.Menus.Module` · `.Routes` · `.Menu` · `.Manager` (`/admin/menuManager`) | `Sas_H_Module` · `Sas_H_Route` · `Sas_H_Menu` | host | Menü ve route veritabanından gelir; üretilen ekranın menü kaydı buradan açılır. `Menu` ekranı ağaç düzeninin referansıdır. `Module` ekranının menü ve yetkisi Saas › Definitions altındadır (Applications ekranının hemen altı); ekran kodu `App.Menus.Module` olarak kalır. Seed: `data/App.Menus.{Routes,Module,Menu}.json` — `Routes` dosyasına yalnızca var olan satırın `Seo*` alanları için dokunulur. |
|
||||
| **Developer Kit › Dev Requests** | `App.DevRequests` | `Sas_H_DevRequest` | host | **Kanban/Todo düzeninin** referansı (`DefaultLayout: todo`): `Status`, `Priority`, `SortOrder`, `Tags`, `Assignees`, `SubTasks`, `Timesheets`; detayda `Description` yanında `Analysis` sekmesi (`AnalysisExpr`). MCP geliştirme döngüsünün kuyruğudur (`Backlog` → `Analysis` MCP analiz eder, `Ready to Start`'a kullanıcı alır; `Ready to Start` → `Testing`, `Staging`'e kullanıcı alır; araç çubuğunda DB Migrate butonu vardır — `UiEvalService.ApiDbMigrate()`, önce onay sorar, `App.Setup.Migrate`; yalnızca `start_dev_request` başlatır; açıklamadaki base64 görseller MCP'ye resim içeriği olarak gider, analiz `save_dev_request_analysis` ile yazılır, üretim notu `append_dev_request_note` ile `Analysis`'e eklenir — `Description` talebin yazıldığı hâliyle kalır; `lowcode.instructions.md` §0.11–§0.12). |
|
||||
| **Developer Kit › SQL Query Manager** | `App.SqlQueryManager` · `/admin/sqlQueryManager` | `Sas_H_CrudEndpoint` (üretilen CRUD uçları) | — | View/procedure/function/tablo tasarımı ve çalıştırma, tablodan CRUD endpoint üretimi (`.CrudEndpoints` yetkisi); karar sırasının 2. adımı buradan başlar. |
|
||||
| **Developer Kit › Files** | `App.Files` · `/admin/files` | Blob depolama | tenant | Dosya yöneticisi. Ekranın dosya alanı için ayrı depolama kurma; dosya/görsel editörleri ve Intranet Documents bu altyapıyı kullanır. |
|
||||
|
|
|
|||
|
|
@ -297,7 +297,7 @@ yazılır, PostgreSQL'de `PostgreSqlModelSyntax` ile çevrilir (`PlatformDbConte
|
|||
| `{sql\|postgres}/object` | Seed sırasında nesneyi oluşturur/günceller. SqlTableDesigner ve SqlQueryManager, deploy ettiği script'i bu klasöre yazar. |
|
||||
| `{sql\|postgres}/execute` | Nesneyi oluşturur; ayrıca tüm migration ve seed'ler bittikten sonra `FinalSeeder` dosya adından türettiği procedure'ü çalıştırır (dosya adı = procedure adı, `schema.Procedure.sql` de olur). |
|
||||
| `{sql\|postgres}/host/{object\|execute}` | Aynı iki kural, **yalnızca host veritabanında**. Tenant veritabanında karşılığı olmayan nesnelere dayanan script buraya konur — örneğin HangFire tabloları tenant migrate'inde de yalnızca host'a kurulduğu için `Sas_H_BackgroundWorker_JobFlow` view'ı buradadır. Sıra: `object` → `host/object` → `execute` → `host/execute`. SqlTableDesigner ve SqlQueryManager her zaman `object/`'e yazar; yalnızca host'ta çalışması gereken script File Manager'dan buraya taşınır. Wizard export/import bu klasörü de taşır. |
|
||||
| `wizard` | ListForm Wizard'ın ürettiği `.json` konfigürasyonları; `WizardDataSeeder` okur. |
|
||||
| `wizard` | ListForm Wizard'ın ürettiği `.json` konfigürasyonları; `WizardDataSeeder` okur. Contributor değildir (`IWizardDataSeeder`): her dosyayı kendi transaction'ında kurduğu için ABP contributor'ları commit edildikten sonra, `data/` dosyalarından önce çalışır — açık contributor transaction'ı içinde ayrı bağlantı, commit edilmemiş satırları bekleyip zaman aşımına düşer. |
|
||||
| `crud` | CrudEndpoint konfigürasyonları; `CrudDataSeeder` dosyaları `ICrudEndpointSeedApplier` üzerinden uygular. Politika **damga karşılaştırmalıdır**: eksik endpoint her zaman eklenir, mevcut bir kayıt yalnızca dosyanın `GeneratedAt` damgası kaydın `LastModificationTime`/`CreationTime` değerinden **yeniyse** güncellenir ya da silinir; aksi halde kayıt korunur ve log'a drift uyarısı düşer. Böylece CRUD Endpoint Manager'dan yapılan bir revizyon depodan gelen eski bir dosya yüzünden migrate sırasında geri alınmaz. Damgası olmayan (eski biçimde yazılmış) dosya hiçbir zaman yeni sayılmaz. |
|
||||
| `data` | Ekranlardan girilen listelerin veri aynası: tek dosya (`{ListFormCode}.json`) ya da satır başına dosya tutan klasör (`{ListFormCode}/{anahtar}.json`; klasör özyinelemeli taranır ve tamamı tek unit of work'te uygulanır). Biçimi yalnızca ekranın `SeedFilePath` tanımı belirler; hedefi okuyan/yazan her yol `ListFormSeedTarget` üzerinden gider ve tanımın dışında kalan dosya uygulanmaz. `ListForm.SeedFilePath` dolu olan ekranda `SeedSyncInsert/Update/Delete` bayraklarından işaretli olan işlemler dosyaya yansır (`ListFormSeedDataSynchronizer`); migrate/seed sırasında bütün contributor'lar bittikten sonra `ListFormSeedDataApplier` dosyayı geri uygular: anahtarı veritabanında **olmayan** satırları ekler, var olanlara dokunmaz. Aynı uygulayıcı wizard import'unun kapanışında da (`CompleteImport`) yalnızca o import'ta yazılan dosyalar için, `overwriteExisting` açık olarak çalışır — orada var olan satır dosyadaki değerlerle güncellenir. |
|
||||
|
||||
|
|
@ -2153,7 +2153,7 @@ configs/seeds/
|
|||
│ # App.Menus.{Routes,Module,Menu}.json — route/modül/menü ağacı
|
||||
│ # Abp.Identity.Permission{Groups,s}.json — yetki tanımları
|
||||
│ # App.Definitions.{CountryGroup,Country,City,District}.json — adres zinciri
|
||||
│ # App.Definitions.{Currency,ContactTitle,AiBot,TerminationReason}.json — para birimi, hitap, AI bot, SGK çıkış kodu
|
||||
│ # App.Definitions.{Currency,ContactTitle,AiBot,TerminationReason,ApplicationSuite}.json — para birimi, hitap, AI bot, SGK çıkış kodu, uygulama paketi
|
||||
│ # App.Hr.{SkillType,SkillLevel,Skill}.json — İK yetkinlik tanımları
|
||||
│ # App.Hr.{Department,JobPosition}.json — İK departman → pozisyon (BranchId ile şubeye bağlı)
|
||||
│ # App.Hr.Intranet.*.json — İK › Intranet (duyuru, anket, sosyal akış, etkinlik)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,10 @@
|
|||
using System;
|
||||
|
||||
namespace Sozsoft.Platform.ListForms.DynamicApi;
|
||||
|
||||
public class ApplicationSuiteDto
|
||||
{
|
||||
public Guid Id { get; set; }
|
||||
public string Name { get; set; }
|
||||
public string Modules { get; set; }
|
||||
}
|
||||
|
|
@ -1,4 +1,5 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Sozsoft.Platform.ListForms.DynamicApi;
|
||||
|
|
@ -12,6 +13,7 @@ public interface IListFormDynamicApiAppService
|
|||
Task PostTenantInsertAsync(DynamicApiBaseInput<CreateUpdateTenantInput> input);
|
||||
Task PostTenantUpdateAsync(DynamicApiBaseInput<CreateUpdateTenantInput> input);
|
||||
Task PostTenantDeleteAsync(DynamicApiBaseInput<string> input);
|
||||
Task<List<ApplicationSuiteDto>> GetApplicationSuitesAsync();
|
||||
Task<Guid> PostCreateTenantFromOrderAsync(DynamicApiBaseInput<CreateTenantFromOrderInput> input);
|
||||
Task<Guid> PostNotificationInsertAsync(DynamicApiBaseInput<CreateNotificationInput> input);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@ public class ListFormDynamicApiAppService : PlatformAppService, IListFormDynamic
|
|||
private readonly IConfiguration configuration;
|
||||
private readonly IOptions<IdentityOptions> identityOptions;
|
||||
private readonly IRepository<Order, Guid> orderRepository;
|
||||
private readonly IReadOnlyRepository<ApplicationSuite, Guid> applicationSuiteRepository;
|
||||
private readonly IListFormSeedDataSynchronizer seedDataSynchronizer;
|
||||
private readonly IRepository<NotificationTemplate, Guid> notificationTemplateRepository;
|
||||
private readonly IReadOnlyRepository<Sozsoft.Notifications.Entities.NotificationType> notificationTypeRepository;
|
||||
|
|
@ -51,6 +52,7 @@ public class ListFormDynamicApiAppService : PlatformAppService, IListFormDynamic
|
|||
IConfiguration configuration,
|
||||
IOptions<IdentityOptions> identityOptions,
|
||||
IRepository<Order, Guid> orderRepository,
|
||||
IReadOnlyRepository<ApplicationSuite, Guid> applicationSuiteRepository,
|
||||
IListFormSeedDataSynchronizer seedDataSynchronizer,
|
||||
IRepository<NotificationTemplate, Guid> notificationTemplateRepository,
|
||||
IReadOnlyRepository<Sozsoft.Notifications.Entities.NotificationType> notificationTypeRepository,
|
||||
|
|
@ -64,6 +66,7 @@ public class ListFormDynamicApiAppService : PlatformAppService, IListFormDynamic
|
|||
this.configuration = configuration;
|
||||
this.identityOptions = identityOptions;
|
||||
this.orderRepository = orderRepository;
|
||||
this.applicationSuiteRepository = applicationSuiteRepository;
|
||||
this.seedDataSynchronizer = seedDataSynchronizer;
|
||||
this.notificationTemplateRepository = notificationTemplateRepository;
|
||||
this.notificationTypeRepository = notificationTypeRepository;
|
||||
|
|
@ -273,6 +276,20 @@ public class ListFormDynamicApiAppService : PlatformAppService, IListFormDynamic
|
|||
await seedDataSynchronizer.SyncRowAsync(input.ListFormCode, tenant.Id, SeedSyncOperation.Insert);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Siparişten kiracı oluşturma diyaloğunun paket seçenekleri. Diyaloğu açan kullanıcının paket
|
||||
/// ekranını okuma yetkisi olmayabilir; bu yüzden uç, komutun kendi yetkisini (kiracı oluşturma) ister.
|
||||
/// </summary>
|
||||
[Authorize(TenantManagementPermissions.Tenants.Create)]
|
||||
public async Task<List<ApplicationSuiteDto>> GetApplicationSuitesAsync()
|
||||
{
|
||||
var suites = await applicationSuiteRepository.GetListAsync(x => x.IsActive);
|
||||
|
||||
return [.. suites
|
||||
.OrderBy(x => x.Name)
|
||||
.Select(x => new ApplicationSuiteDto { Id = x.Id, Name = x.Name, Modules = x.Modules })];
|
||||
}
|
||||
|
||||
[Authorize(TenantManagementPermissions.Tenants.Create)]
|
||||
public async Task<Guid> PostCreateTenantFromOrderAsync(DynamicApiBaseInput<CreateTenantFromOrderInput> input)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1755,6 +1755,149 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
}
|
||||
#endregion
|
||||
|
||||
#region ApplicationSuite
|
||||
listFormName = AppCodes.Definitions.ApplicationSuite;
|
||||
if (!await _listFormRepository.AnyAsync(a => a.ListFormCode == listFormName))
|
||||
{
|
||||
var listForm = await _listFormRepository.InsertAsync(
|
||||
new ListForm()
|
||||
{
|
||||
ListFormType = ListFormTypeEnum.List,
|
||||
PageSize = 10,
|
||||
ExportJson = DefaultExportJson,
|
||||
IsSubForm = false,
|
||||
ShowNote = false,
|
||||
LayoutJson = DefaultLayoutJson(),
|
||||
CultureName = LanguageCodes.En,
|
||||
ListFormCode = listFormName,
|
||||
Name = listFormName,
|
||||
Title = listFormName,
|
||||
DataSourceCode = SeedConsts.DataSources.DefaultCode,
|
||||
IsTenant = false,
|
||||
IsBranch = false,
|
||||
IsOrganizationUnit = false,
|
||||
Description = $"{listFormName}.Description",
|
||||
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.ApplicationSuite)),
|
||||
KeyFieldName = "Id",
|
||||
KeyFieldDbSourceType = DbType.Guid,
|
||||
SeedFilePath = SeedPathResolver.GetDataFilePath(listFormName),
|
||||
SeedSyncInsert = true,
|
||||
SeedSyncUpdate = true,
|
||||
SeedSyncDelete = true,
|
||||
DefaultFilter = DefaultFilterJson,
|
||||
SortMode = GridOptions.SortModeSingle,
|
||||
FilterRowJson = DefaultFilterRowJson(),
|
||||
HeaderFilterJson = DefaultHeaderFilterJson(),
|
||||
SearchPanelJson = DefaultSearchPanelJson(),
|
||||
GroupPanelJson = DefaultGroupPanelJson(),
|
||||
SelectionJson = DefaultSelectionSingleJson,
|
||||
ColumnOptionJson = DefaultColumnOptionJson(),
|
||||
PermissionJson = DefaultPermissionJson(listFormName),
|
||||
DeleteCommand = DefaultDeleteCommand(nameof(TableNameEnum.ApplicationSuite)),
|
||||
DeleteFieldsDefaultValueJson = DefaultDeleteFieldsDefaultValueJson(),
|
||||
PagerOptionJson = DefaultPagerOptionJson,
|
||||
EditingOptionJson = DefaultEditingOptionJson(listFormName, 600, 350, true, true, true, true, false),
|
||||
EditingFormJson = JsonSerializer.Serialize(new List<EditingFormDto>
|
||||
{
|
||||
new() {
|
||||
Order = 1, ColCount = 1, ColSpan = 1, ItemType = "group" },
|
||||
}),
|
||||
InsertFieldsDefaultValueJson = DefaultInsertFieldsDefaultValueJson(),
|
||||
FormFieldsDefaultValueJson = JsonSerializer.Serialize(new FieldsDefaultValue[] {
|
||||
new() { FieldName = "IsActive", FieldDbType = DbType.Boolean, Value = "true", CustomValueType = FieldCustomValueTypeEnum.Value },
|
||||
}),
|
||||
});
|
||||
|
||||
#region ApplicationSuite Fields
|
||||
await _listFormFieldRepository.InsertManyAsync([
|
||||
new() {
|
||||
ListFormCode = listForm.ListFormCode,
|
||||
CultureName = LanguageCodes.En,
|
||||
SourceDbType = DbType.Guid,
|
||||
FieldName = "Id",
|
||||
CaptionName = "App.Listform.ListformField.Id",
|
||||
Width = 0,
|
||||
ListOrderNo = 1,
|
||||
Visible = false,
|
||||
IsActive = true,
|
||||
|
||||
ColumnCustomizationJson = DefaultColumnCustomizationJson,
|
||||
PermissionJson = DefaultFieldPermissionJson(listForm.Name),
|
||||
PivotSettingsJson = DefaultPivotSettingsJson
|
||||
},
|
||||
new() {
|
||||
ListFormCode = listForm.ListFormCode,
|
||||
CultureName = LanguageCodes.En,
|
||||
SourceDbType = DbType.String,
|
||||
FieldName = "Name",
|
||||
EditGroupOrderNo = 1,
|
||||
EditOrderNo = 1,
|
||||
EditorType2 = EditorTypes.dxTextBox,
|
||||
ColSpan = 1,
|
||||
CaptionName = "App.Listform.ListformField.Name",
|
||||
Width = 0,
|
||||
ListOrderNo = 2,
|
||||
Visible = true,
|
||||
IsActive = true,
|
||||
|
||||
AllowSearch = true,
|
||||
SortIndex = 1,
|
||||
SortDirection = GridColumnOptions.SortOrderAsc,
|
||||
ValidationRuleJson = DefaultValidationRuleRequiredJson,
|
||||
ColumnCustomizationJson = DefaultColumnCustomizationJson,
|
||||
PermissionJson = DefaultFieldPermissionJson(listForm.Name),
|
||||
PivotSettingsJson = DefaultPivotSettingsJson
|
||||
},
|
||||
new() {
|
||||
ListFormCode = listForm.ListFormCode,
|
||||
CultureName = LanguageCodes.En,
|
||||
SourceDbType = DbType.String,
|
||||
FieldName = "Modules",
|
||||
EditGroupOrderNo = 1,
|
||||
EditOrderNo = 2,
|
||||
EditorType2 = EditorTypes.dxTagBox,
|
||||
ColSpan = 1,
|
||||
CaptionName = "App.Listform.ListformField.Modules",
|
||||
Width = 0,
|
||||
ListOrderNo = 3,
|
||||
Visible = true,
|
||||
IsActive = true,
|
||||
LookupJson = JsonSerializer.Serialize(new LookupDto {
|
||||
DataSourceType = UiLookupDataSourceTypeEnum.Query,
|
||||
DisplayExpr = "name",
|
||||
ValueExpr = "key",
|
||||
LookupQuery = LookupQueryValues.ModuleValues,
|
||||
}),
|
||||
ValidationRuleJson = DefaultValidationRuleRequiredJson,
|
||||
ColumnCustomizationJson = DefaultColumnCustomizationJson,
|
||||
PermissionJson = DefaultFieldPermissionJson(listForm.Name),
|
||||
PivotSettingsJson = DefaultPivotSettingsJson
|
||||
},
|
||||
new() {
|
||||
ListFormCode = listForm.ListFormCode,
|
||||
CultureName = LanguageCodes.En,
|
||||
SourceDbType = DbType.Boolean,
|
||||
FieldName = "IsActive",
|
||||
EditGroupOrderNo = 1,
|
||||
EditOrderNo = 3,
|
||||
EditorType2 = EditorTypes.dxCheckBox,
|
||||
ColSpan = 1,
|
||||
CaptionName = "App.Listform.ListformField.IsActive",
|
||||
Width = 0,
|
||||
ListOrderNo = 4,
|
||||
Visible = true,
|
||||
IsActive = true,
|
||||
|
||||
ColumnCustomizationJson = DefaultColumnCustomizationJson,
|
||||
PermissionJson = DefaultFieldPermissionJson(listForm.Name),
|
||||
PivotSettingsJson = DefaultPivotSettingsJson
|
||||
},
|
||||
]);
|
||||
#endregion
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Currency
|
||||
listFormName = AppCodes.Definitions.Currency;
|
||||
if (!await _listFormRepository.AnyAsync(a => a.ListFormCode == listFormName))
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ public class WizardDataSeeder(
|
|||
WizardInstallationChecker installationChecker,
|
||||
IUnitOfWorkManager unitOfWorkManager,
|
||||
IConfiguration configuration,
|
||||
ILogger<WizardDataSeeder> logger) : IDataSeedContributor, ITransientDependency
|
||||
ILogger<WizardDataSeeder> logger) : IWizardDataSeeder, ITransientDependency
|
||||
{
|
||||
private readonly string _appName = PlatformConsts.AppName;
|
||||
|
||||
|
|
|
|||
|
|
@ -109,5 +109,6 @@ public enum TableNameEnum
|
|||
UserFamilyMember,
|
||||
UserEmergencyContact,
|
||||
UserBenefit,
|
||||
TerminationReason
|
||||
TerminationReason,
|
||||
ApplicationSuite
|
||||
}
|
||||
|
|
|
|||
|
|
@ -542,6 +542,7 @@ public static class PlatformConsts
|
|||
public const string City = Default + ".City";
|
||||
public const string District = Default + ".District";
|
||||
public const string TerminationReason = Default + ".TerminationReason";
|
||||
public const string ApplicationSuite = Default + ".ApplicationSuite";
|
||||
|
||||
public const string Sector = Default + ".Sector";
|
||||
public const string UomCategory = Default + ".UomCategory";
|
||||
|
|
|
|||
|
|
@ -24,6 +24,7 @@ public static class TableNameResolver
|
|||
{ nameof(TableNameEnum.City), (TablePrefix.PlatformByName, MenuPrefix.Sas) },
|
||||
{ nameof(TableNameEnum.District), (TablePrefix.PlatformByName, MenuPrefix.Sas) },
|
||||
{ nameof(TableNameEnum.TerminationReason), (TablePrefix.PlatformByName, MenuPrefix.Sas) },
|
||||
{ nameof(TableNameEnum.ApplicationSuite), (TablePrefix.PlatformByName, MenuPrefix.Sas) },
|
||||
{ nameof(TableNameEnum.Branch), (TablePrefix.TenantByName, MenuPrefix.Sas) },
|
||||
{ nameof(TableNameEnum.BranchUsers), (TablePrefix.TenantByName, MenuPrefix.Sas) },
|
||||
{ nameof(TableNameEnum.SettingDefinition), (TablePrefix.PlatformByName, MenuPrefix.Sas) },
|
||||
|
|
|
|||
16
api/src/Sozsoft.Platform.Domain/Data/IWizardDataSeeder.cs
Normal file
16
api/src/Sozsoft.Platform.Domain/Data/IWizardDataSeeder.cs
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
using System.Threading.Tasks;
|
||||
using Volo.Abp.Data;
|
||||
|
||||
namespace Sozsoft.Platform.Data;
|
||||
|
||||
/// <summary>
|
||||
/// Wizard ekranlarini seed dosyalarindan kurar. Contributor degildir: her dosya kendi transaction'inda
|
||||
/// kurulur ve ABP <c>DataSeeder</c>'in acik transaction'i icindeki ayri baglanti, diger contributor'larin
|
||||
/// commit edilmemis satirlarini (ornegin varsayilan veri kaynagi) bekleyip zaman asimina duser.
|
||||
/// Bu yuzden contributor'lar bittikten sonra, veri dosyalarindan once cagrilir.
|
||||
/// Uygulamasi DbMigrator projesindedir; migrator disindaki host'larda kayitli olmayabilir.
|
||||
/// </summary>
|
||||
public interface IWizardDataSeeder
|
||||
{
|
||||
Task SeedAsync(DataSeedContext context);
|
||||
}
|
||||
|
|
@ -25,6 +25,7 @@ public class PlatformDbMigrationService : ITransientDependency
|
|||
private readonly ICurrentTenant _currentTenant;
|
||||
private readonly IConfiguration _configuration;
|
||||
private readonly IEnumerable<IFinalSeeder> _finalSeeders;
|
||||
private readonly IEnumerable<IWizardDataSeeder> _wizardDataSeeders;
|
||||
private readonly IListFormSeedDataApplier _listFormSeedDataApplier;
|
||||
private readonly DistributedCacheCleaner _cacheCleaner;
|
||||
|
||||
|
|
@ -35,6 +36,7 @@ public class PlatformDbMigrationService : ITransientDependency
|
|||
ICurrentTenant currentTenant,
|
||||
IConfiguration configuration,
|
||||
IEnumerable<IFinalSeeder> finalSeeders,
|
||||
IEnumerable<IWizardDataSeeder> wizardDataSeeders,
|
||||
IListFormSeedDataApplier listFormSeedDataApplier,
|
||||
DistributedCacheCleaner cacheCleaner)
|
||||
{
|
||||
|
|
@ -44,6 +46,7 @@ public class PlatformDbMigrationService : ITransientDependency
|
|||
_currentTenant = currentTenant;
|
||||
_configuration = configuration;
|
||||
_finalSeeders = finalSeeders;
|
||||
_wizardDataSeeders = wizardDataSeeders;
|
||||
_listFormSeedDataApplier = listFormSeedDataApplier;
|
||||
_cacheCleaner = cacheCleaner;
|
||||
|
||||
|
|
@ -242,16 +245,24 @@ public class PlatformDbMigrationService : ITransientDependency
|
|||
Logger.LogInformation("{TenantName} tenant shares the host database; seed files are already applied there.", tenant!.Name);
|
||||
}
|
||||
|
||||
await _dataSeeder.SeedAsync(new DataSeedContext(tenant?.Id)
|
||||
var context = new DataSeedContext(tenant?.Id)
|
||||
.WithProperty(IdentityDataSeedContributor.AdminEmailPropertyName, adminEmail)
|
||||
.WithProperty(IdentityDataSeedContributor.AdminPasswordPropertyName, adminPassword)
|
||||
.WithProperty(IdentityDataSeedContributor.AdminUserNamePropertyName, adminEmail)
|
||||
.WithProperty(SeedFileScope.PropertyName, applySeedFiles)
|
||||
.WithProperty(SeedFileScope.CompletesPendingPropertyName, completesPending)
|
||||
);
|
||||
.WithProperty(SeedFileScope.CompletesPendingPropertyName, completesPending);
|
||||
|
||||
await _dataSeeder.SeedAsync(context);
|
||||
|
||||
// Wizard ekranlari contributor'larin kayitlarina (veri kaynagi, ListForm) dayanir ve dosya basina
|
||||
// kendi transaction'inda kurulur; contributor UoW'si commit edilmeden calisamaz (IWizardDataSeeder).
|
||||
foreach (var wizardDataSeeder in _wizardDataSeeders)
|
||||
{
|
||||
await wizardDataSeeder.SeedAsync(context);
|
||||
}
|
||||
|
||||
// Veri seed dosyalari ListForm tanimlarina ve tablolara dayandigi icin butun
|
||||
// contributor'lar bittikten sonra uygulanir; ABP contributor sirasi garanti degildir.
|
||||
// contributor'lar ve wizard kurulumu bittikten sonra uygulanir; ABP contributor sirasi garanti degildir.
|
||||
if (applySeedFiles)
|
||||
{
|
||||
await _listFormSeedDataApplier.ApplyAsync(tenant?.Id);
|
||||
|
|
|
|||
|
|
@ -366,6 +366,7 @@ public static class SeedConsts
|
|||
public const string City = Default + ".City";
|
||||
public const string District = Default + ".District";
|
||||
public const string TerminationReason = Default + ".TerminationReason";
|
||||
public const string ApplicationSuite = Default + ".ApplicationSuite";
|
||||
|
||||
public const string Sector = Default + ".Sector";
|
||||
public const string UomCategory = Default + ".UomCategory";
|
||||
|
|
|
|||
|
|
@ -0,0 +1,16 @@
|
|||
using System;
|
||||
using Volo.Abp.Domain.Entities.Auditing;
|
||||
|
||||
namespace Sozsoft.Platform.Entities;
|
||||
|
||||
/// <summary>
|
||||
/// Kiracıya birlikte açılan modül paketi. Satış siparişinden kiracı oluşturulurken seçilir ve
|
||||
/// <c>Modules</c> değeri kiracının modül listesine aktarılır; kiracı oluşmadan seçildiği için
|
||||
/// tanım host tablosundadır.
|
||||
/// </summary>
|
||||
public class ApplicationSuite : FullAuditedEntity<Guid>
|
||||
{
|
||||
public string Name { get; set; }
|
||||
public string Modules { get; set; }
|
||||
public bool IsActive { get; set; }
|
||||
}
|
||||
|
|
@ -74,6 +74,7 @@ public class PlatformDbContext :
|
|||
public DbSet<IpRestriction> IpRestrictions { get; set; }
|
||||
public DbSet<ContactTitle> ContactTitles { get; set; }
|
||||
public DbSet<TerminationReason> TerminationReasons { get; set; }
|
||||
public DbSet<ApplicationSuite> ApplicationSuites { get; set; }
|
||||
public DbSet<Currency> Currencies { get; set; }
|
||||
public DbSet<CountryGroup> CountryGroups { get; set; }
|
||||
public DbSet<Country> Countries { get; set; }
|
||||
|
|
@ -985,6 +986,18 @@ public class PlatformDbContext :
|
|||
b.HasIndex(x => new { x.Code }).IsUnique().HasFilter("[IsDeleted] = 0");
|
||||
});
|
||||
|
||||
builder.Entity<ApplicationSuite>(b =>
|
||||
{
|
||||
b.ToTable(TableNameResolver.GetFullTableName(nameof(TableNameEnum.ApplicationSuite)), Prefix.DbSchema);
|
||||
b.ConfigureByConvention();
|
||||
|
||||
b.Property(x => x.Name).IsRequired().HasMaxLength(128);
|
||||
b.Property(x => x.Modules).IsRequired().HasMaxLength(1024);
|
||||
b.Property(x => x.IsActive).HasDefaultValue(true);
|
||||
|
||||
b.HasIndex(x => new { x.Name }).IsUnique().HasFilter("[IsDeleted] = 0");
|
||||
});
|
||||
|
||||
builder.Entity<Currency>(b =>
|
||||
{
|
||||
b.ToTable(TableNameResolver.GetFullTableName(nameof(TableNameEnum.Currency)), Prefix.DbSchema);
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore;
|
|||
namespace Sozsoft.Platform.Migrations
|
||||
{
|
||||
[DbContext(typeof(PlatformDbContext))]
|
||||
[Migration("20261008061754_Initial")]
|
||||
[Migration("20261009171249_Initial")]
|
||||
partial class Initial
|
||||
{
|
||||
/// <inheritdoc />
|
||||
|
|
@ -1049,6 +1049,65 @@ namespace Sozsoft.Platform.Migrations
|
|||
b.ToTable("Hr_T_AnnouncementLike", (string)null);
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Sozsoft.Platform.Entities.ApplicationSuite", b =>
|
||||
{
|
||||
b.Property<Guid>("Id")
|
||||
.HasColumnType("uniqueidentifier");
|
||||
|
||||
b.Property<DateTime>("CreationTime")
|
||||
.HasColumnType("datetime2")
|
||||
.HasColumnName("CreationTime");
|
||||
|
||||
b.Property<Guid?>("CreatorId")
|
||||
.HasColumnType("uniqueidentifier")
|
||||
.HasColumnName("CreatorId");
|
||||
|
||||
b.Property<Guid?>("DeleterId")
|
||||
.HasColumnType("uniqueidentifier")
|
||||
.HasColumnName("DeleterId");
|
||||
|
||||
b.Property<DateTime?>("DeletionTime")
|
||||
.HasColumnType("datetime2")
|
||||
.HasColumnName("DeletionTime");
|
||||
|
||||
b.Property<bool>("IsActive")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("bit")
|
||||
.HasDefaultValue(true);
|
||||
|
||||
b.Property<bool>("IsDeleted")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("bit")
|
||||
.HasDefaultValue(false)
|
||||
.HasColumnName("IsDeleted");
|
||||
|
||||
b.Property<DateTime?>("LastModificationTime")
|
||||
.HasColumnType("datetime2")
|
||||
.HasColumnName("LastModificationTime");
|
||||
|
||||
b.Property<Guid?>("LastModifierId")
|
||||
.HasColumnType("uniqueidentifier")
|
||||
.HasColumnName("LastModifierId");
|
||||
|
||||
b.Property<string>("Modules")
|
||||
.IsRequired()
|
||||
.HasMaxLength(1024)
|
||||
.HasColumnType("nvarchar(1024)");
|
||||
|
||||
b.Property<string>("Name")
|
||||
.IsRequired()
|
||||
.HasMaxLength(128)
|
||||
.HasColumnType("nvarchar(128)");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.HasIndex("Name")
|
||||
.IsUnique()
|
||||
.HasFilter("[IsDeleted] = 0");
|
||||
|
||||
b.ToTable("Sas_H_ApplicationSuite", (string)null);
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Sozsoft.Platform.Entities.BackgroundWorker", b =>
|
||||
{
|
||||
b.Property<Guid>("Id")
|
||||
|
|
@ -1341,6 +1341,27 @@ namespace Sozsoft.Platform.Migrations
|
|||
table.PrimaryKey("PK_Sas_H_AiBot", x => x.Id);
|
||||
});
|
||||
|
||||
migrationBuilder.CreateTable(
|
||||
name: "Sas_H_ApplicationSuite",
|
||||
columns: table => new
|
||||
{
|
||||
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
|
||||
Name = table.Column<string>(type: "nvarchar(128)", maxLength: 128, nullable: false),
|
||||
Modules = table.Column<string>(type: "nvarchar(1024)", maxLength: 1024, nullable: false),
|
||||
IsActive = table.Column<bool>(type: "bit", nullable: false, defaultValue: true),
|
||||
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
|
||||
CreatorId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
|
||||
LastModificationTime = table.Column<DateTime>(type: "datetime2", nullable: true),
|
||||
LastModifierId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
|
||||
IsDeleted = table.Column<bool>(type: "bit", nullable: false, defaultValue: false),
|
||||
DeleterId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
|
||||
DeletionTime = table.Column<DateTime>(type: "datetime2", nullable: true)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PK_Sas_H_ApplicationSuite", x => x.Id);
|
||||
});
|
||||
|
||||
migrationBuilder.CreateTable(
|
||||
name: "Sas_H_BackgroundWorker",
|
||||
columns: table => new
|
||||
|
|
@ -4642,6 +4663,13 @@ namespace Sozsoft.Platform.Migrations
|
|||
column: "Name",
|
||||
unique: true);
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_Sas_H_ApplicationSuite_Name",
|
||||
table: "Sas_H_ApplicationSuite",
|
||||
column: "Name",
|
||||
unique: true,
|
||||
filter: "[IsDeleted] = 0");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_Sas_H_BackgroundWorker_Name",
|
||||
table: "Sas_H_BackgroundWorker",
|
||||
|
|
@ -5139,6 +5167,9 @@ namespace Sozsoft.Platform.Migrations
|
|||
migrationBuilder.DropTable(
|
||||
name: "Sas_H_AiBot");
|
||||
|
||||
migrationBuilder.DropTable(
|
||||
name: "Sas_H_ApplicationSuite");
|
||||
|
||||
migrationBuilder.DropTable(
|
||||
name: "Sas_H_BackgroundWorker");
|
||||
|
||||
|
|
@ -1046,6 +1046,65 @@ namespace Sozsoft.Platform.Migrations
|
|||
b.ToTable("Hr_T_AnnouncementLike", (string)null);
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Sozsoft.Platform.Entities.ApplicationSuite", b =>
|
||||
{
|
||||
b.Property<Guid>("Id")
|
||||
.HasColumnType("uniqueidentifier");
|
||||
|
||||
b.Property<DateTime>("CreationTime")
|
||||
.HasColumnType("datetime2")
|
||||
.HasColumnName("CreationTime");
|
||||
|
||||
b.Property<Guid?>("CreatorId")
|
||||
.HasColumnType("uniqueidentifier")
|
||||
.HasColumnName("CreatorId");
|
||||
|
||||
b.Property<Guid?>("DeleterId")
|
||||
.HasColumnType("uniqueidentifier")
|
||||
.HasColumnName("DeleterId");
|
||||
|
||||
b.Property<DateTime?>("DeletionTime")
|
||||
.HasColumnType("datetime2")
|
||||
.HasColumnName("DeletionTime");
|
||||
|
||||
b.Property<bool>("IsActive")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("bit")
|
||||
.HasDefaultValue(true);
|
||||
|
||||
b.Property<bool>("IsDeleted")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("bit")
|
||||
.HasDefaultValue(false)
|
||||
.HasColumnName("IsDeleted");
|
||||
|
||||
b.Property<DateTime?>("LastModificationTime")
|
||||
.HasColumnType("datetime2")
|
||||
.HasColumnName("LastModificationTime");
|
||||
|
||||
b.Property<Guid?>("LastModifierId")
|
||||
.HasColumnType("uniqueidentifier")
|
||||
.HasColumnName("LastModifierId");
|
||||
|
||||
b.Property<string>("Modules")
|
||||
.IsRequired()
|
||||
.HasMaxLength(1024)
|
||||
.HasColumnType("nvarchar(1024)");
|
||||
|
||||
b.Property<string>("Name")
|
||||
.IsRequired()
|
||||
.HasMaxLength(128)
|
||||
.HasColumnType("nvarchar(128)");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.HasIndex("Name")
|
||||
.IsUnique()
|
||||
.HasFilter("[IsDeleted] = 0");
|
||||
|
||||
b.ToTable("Sas_H_ApplicationSuite", (string)null);
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Sozsoft.Platform.Entities.BackgroundWorker", b =>
|
||||
{
|
||||
b.Property<Guid>("Id")
|
||||
|
|
|
|||
|
|
@ -564,6 +564,66 @@
|
|||
"MultiTenancySide": 2,
|
||||
"Modules": "Sas|Adm"
|
||||
},
|
||||
{
|
||||
"GroupName": "App.Saas",
|
||||
"Name": "App.Definitions.ApplicationSuite",
|
||||
"ParentName": "App.Saas.Definitions",
|
||||
"DisplayName": "App.Definitions.ApplicationSuite",
|
||||
"Order": 10,
|
||||
"IsEnabled": true,
|
||||
"MultiTenancySide": 2,
|
||||
"Modules": "Sas|Adm"
|
||||
},
|
||||
{
|
||||
"GroupName": "App.Saas",
|
||||
"Name": "App.Definitions.ApplicationSuite.Create",
|
||||
"ParentName": "App.Definitions.ApplicationSuite",
|
||||
"DisplayName": "App.Platform.Create",
|
||||
"Order": 1,
|
||||
"IsEnabled": true,
|
||||
"MultiTenancySide": 2,
|
||||
"Modules": "Sas|Adm"
|
||||
},
|
||||
{
|
||||
"GroupName": "App.Saas",
|
||||
"Name": "App.Definitions.ApplicationSuite.Update",
|
||||
"ParentName": "App.Definitions.ApplicationSuite",
|
||||
"DisplayName": "App.Platform.Update",
|
||||
"Order": 2,
|
||||
"IsEnabled": true,
|
||||
"MultiTenancySide": 2,
|
||||
"Modules": "Sas|Adm"
|
||||
},
|
||||
{
|
||||
"GroupName": "App.Saas",
|
||||
"Name": "App.Definitions.ApplicationSuite.Delete",
|
||||
"ParentName": "App.Definitions.ApplicationSuite",
|
||||
"DisplayName": "App.Platform.Delete",
|
||||
"Order": 3,
|
||||
"IsEnabled": true,
|
||||
"MultiTenancySide": 2,
|
||||
"Modules": "Sas|Adm"
|
||||
},
|
||||
{
|
||||
"GroupName": "App.Saas",
|
||||
"Name": "App.Definitions.ApplicationSuite.Export",
|
||||
"ParentName": "App.Definitions.ApplicationSuite",
|
||||
"DisplayName": "Export",
|
||||
"Order": 4,
|
||||
"IsEnabled": true,
|
||||
"MultiTenancySide": 2,
|
||||
"Modules": "Sas|Adm"
|
||||
},
|
||||
{
|
||||
"GroupName": "App.Saas",
|
||||
"Name": "App.Definitions.ApplicationSuite.Import",
|
||||
"ParentName": "App.Definitions.ApplicationSuite",
|
||||
"DisplayName": "Import",
|
||||
"Order": 5,
|
||||
"IsEnabled": true,
|
||||
"MultiTenancySide": 2,
|
||||
"Modules": "Sas|Adm"
|
||||
},
|
||||
{
|
||||
"GroupName": "App.Saas",
|
||||
"Name": "App.Public",
|
||||
|
|
@ -1697,9 +1757,9 @@
|
|||
{
|
||||
"GroupName": "App.Saas",
|
||||
"Name": "App.Menus.Module",
|
||||
"ParentName": "App.Menus",
|
||||
"ParentName": "App.Saas.Definitions",
|
||||
"DisplayName": "App.Menus.Module",
|
||||
"Order": 1,
|
||||
"Order": 11,
|
||||
"IsEnabled": true,
|
||||
"MultiTenancySide": 2,
|
||||
"Modules": "Sas|Adm"
|
||||
|
|
@ -1759,7 +1819,7 @@
|
|||
"Name": "App.Menus.Routes",
|
||||
"ParentName": "App.Menus",
|
||||
"DisplayName": "App.Menus.Routes",
|
||||
"Order": 2,
|
||||
"Order": 1,
|
||||
"IsEnabled": true,
|
||||
"MultiTenancySide": 2,
|
||||
"Modules": "Sas|Adm"
|
||||
|
|
@ -1819,7 +1879,7 @@
|
|||
"Name": "App.Menus.Menu",
|
||||
"ParentName": "App.Menus",
|
||||
"DisplayName": "App.Menus.Menu",
|
||||
"Order": 3,
|
||||
"Order": 2,
|
||||
"IsEnabled": true,
|
||||
"MultiTenancySide": 2,
|
||||
"Modules": "Sas|Adm"
|
||||
|
|
@ -1879,7 +1939,7 @@
|
|||
"Name": "App.Menus.Manager",
|
||||
"ParentName": "App.Menus",
|
||||
"DisplayName": "App.Menus.Manager",
|
||||
"Order": 4,
|
||||
"Order": 3,
|
||||
"IsEnabled": true,
|
||||
"MultiTenancySide": 2,
|
||||
"Modules": "Sas|Adm"
|
||||
|
|
|
|||
14
configs/seeds/data/App.Definitions.ApplicationSuite.json
Normal file
14
configs/seeds/data/App.Definitions.ApplicationSuite.json
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
{
|
||||
"ListFormCode": "App.Definitions.ApplicationSuite",
|
||||
"KeyFieldName": "Id",
|
||||
"GeneratedAt": "2026-10-09T00:00:00Z",
|
||||
"Order": 0,
|
||||
"Rows": [
|
||||
{
|
||||
"Id": "0c1082fa-cb47-4793-bde2-f10dc822e2c0",
|
||||
"Name": "Erp",
|
||||
"Modules": "Adm|Hr|Inventory|Prc|Prj|Production|Pub|Sas",
|
||||
"IsActive": true
|
||||
}
|
||||
]
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -3782,7 +3782,7 @@
|
|||
"CultureName": "tr",
|
||||
"ResourceName": "Platform",
|
||||
"Key": "App.Menus.Menu",
|
||||
"Value": "Menü Listesi"
|
||||
"Value": "Menüler"
|
||||
},
|
||||
{
|
||||
"Id": "3dbc4dc8-6662-59b0-a03b-a83320599d9b",
|
||||
|
|
@ -92976,7 +92976,7 @@
|
|||
"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 / Satınalma Masası / 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. Satınalma › Malzeme Talepleri: departman onayı talep edenin departmanındaki Satınalma satırlarını, satınalma onayı ise Satınalma Masası satırlarını (departmandan bağımsız) kullanır. Aynı departman ve onay yerine birden çok onaycı girilebilir; herhangi birinin onayı yeterlidir. Pasif satırlar akışlarda kullanılmaz."
|
||||
"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 / Satınalma Masası / 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. Satınalma › Satınalma Talepleri: departman onayı talep edenin departmanındaki Satınalma satırlarını, satınalma onayı ise Satınalma Masası satırlarını (departmandan bağımsız) 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",
|
||||
|
|
@ -93116,7 +93116,7 @@
|
|||
"CultureName": "tr",
|
||||
"ResourceName": "Platform",
|
||||
"Key": "App.Prc.RejectReason.Desc",
|
||||
"Value": "Red Nedenleri — satınalma taleplerinin reddedilme sebepleri (ihtiyaç yok, miktar uygun değil, yanlış ürün, bütçe uygun değil, diğer).\nNerede: Satınalma › Tanımlamalar › Red Nedenleri.\nAlanlar: red nedeni, sıra (seçim listesindeki sırası), aktif.\nKullanıldığı yer: Satınalma › Malzeme Talepleri — departman onaycısı ya da satınalma talebi reddederken neden seçer. Yalnız aktif nedenler listelenir; kullanılmış neden silinmez, pasife alınır."
|
||||
"Value": "Red Nedenleri — satınalma taleplerinin reddedilme sebepleri (ihtiyaç yok, miktar uygun değil, yanlış ürün, bütçe uygun değil, diğer).\nNerede: Satınalma › Tanımlamalar › Red Nedenleri.\nAlanlar: red nedeni, sıra (seçim listesindeki sırası), aktif.\nKullanıldığı yer: Satınalma › Satınalma Talepleri — departman onaycısı ya da satınalma talebi reddederken neden seçer. Yalnız aktif nedenler listelenir; kullanılmış neden silinmez, pasife alınır."
|
||||
},
|
||||
{
|
||||
"Id": "31115331-7e79-54e9-ae55-a2e682571c43",
|
||||
|
|
@ -93172,7 +93172,7 @@
|
|||
"CultureName": "tr",
|
||||
"ResourceName": "Platform",
|
||||
"Key": "App.Prc.MaterialRequestLine.Desc",
|
||||
"Value": "Talep Satırları — malzeme talebinde istenen ürünler.\nNerede: Satınalma › Malzeme Talepleri › herhangi bir liste › Talep Satırları sekmesi (kendi menüsü yoktur).\nAlanlar: ürün (aktif ve satın alınabilir ürünler), miktar, birim (ürünün satınalma biriminden gelir, salt okunur), karşılama şekli (Satınalma / Depodan Transfer), termin tarihi, talep nedeni, teslim edilen miktar (salt okunur), planlanacak miktar (boşsa miktar), satınalma sorumlusu, satır durumu (Bekliyor / Planlandı / Tamamlandı / İptal).\nKurallar: satır yalnız talep onaya gönderilmeden eklenip silinebilir. Satır durumları değişince talebin durumu yeniden hesaplanır (İşlemde / Kısmi Tamamlandı / Tamamlandı)."
|
||||
"Value": "Talep Satırları — malzeme talebinde istenen ürünler.\nNerede: Satınalma › Satınalma Talepleri › herhangi bir liste › Talep Satırları sekmesi (kendi menüsü yoktur).\nAlanlar: ürün (aktif ve satın alınabilir ürünler), miktar, birim (ürünün satınalma biriminden gelir, salt okunur), karşılama şekli (Satınalma / Depodan Transfer), termin tarihi, talep nedeni, teslim edilen miktar (salt okunur), planlanacak miktar (boşsa miktar), satınalma sorumlusu, satır durumu (Bekliyor / Planlandı / Tamamlandı / İptal).\nKurallar: satır yalnız talep onaya gönderilmeden eklenip silinebilir. Satır durumları değişince talebin durumu yeniden hesaplanır (İşlemde / Kısmi Tamamlandı / Tamamlandı)."
|
||||
},
|
||||
{
|
||||
"Id": "d6911bd6-3f4a-582d-8328-e01403808802",
|
||||
|
|
@ -93368,7 +93368,7 @@
|
|||
"CultureName": "tr",
|
||||
"ResourceName": "Platform",
|
||||
"Key": "App.Prc.MyMaterialRequest.Desc",
|
||||
"Value": "Taleplerim — açtığınız malzeme talepleri, tüm durumlarıyla.\nNerede: Satınalma › Malzeme Talepleri › Taleplerim.\nAlanlar: talep no (MT-YYYY-00001, otomatik), öncelik, talep eden (siz), departman (varsayılan olarak sizin departmanınız), malın konulacağı depo ve konum, talep tarihi, durum, genel açıklama; Talep Satırları sekmesi: ürün, miktar, birim, karşılama şekli, termin tarihi, talep nedeni.\nAkış: satırları girip onaya gönderin — önce departman onaycısı (Onaycılar › departmanınız için Satınalma onay yeri), ardından satınalma (Satınalma Masası onay yeri) onaylar ya da reddeder. Satırlar yalnız onaya göndermeden önce eklenip silinebilir. Onay / red bilgileri onay grubunda görünür.\nİlişkili: Departman Onayı Bekleyenler, Satınalma Onayı Bekleyenler, Planlama Bekleyenler, Tüm Talepler."
|
||||
"Value": "Taleplerim — açtığınız malzeme talepleri, tüm durumlarıyla.\nNerede: Satınalma › Satınalma Talepleri › Taleplerim.\nAlanlar: talep no (MT-YYYY-00001, otomatik), öncelik, talep eden (siz), departman (varsayılan olarak sizin departmanınız), malın konulacağı depo ve konum, talep tarihi, durum, genel açıklama; Talep Satırları sekmesi: ürün, miktar, birim, karşılama şekli, termin tarihi, talep nedeni.\nAkış: satırları girip onaya gönderin — önce departman onaycısı (Onaycılar › departmanınız için Satınalma onay yeri), ardından satınalma (Satınalma Masası onay yeri) onaylar ya da reddeder. Satırlar yalnız onaya göndermeden önce eklenip silinebilir. Onay / red bilgileri onay grubunda görünür.\nİlişkili: Departman Onayı Bekleyenler, Satınalma Onayı Bekleyenler, Planlama Bekleyenler, Tüm Talepler."
|
||||
},
|
||||
{
|
||||
"Id": "ce3d734c-f508-5647-8f8d-2bf6b056c79a",
|
||||
|
|
@ -93578,7 +93578,7 @@
|
|||
"CultureName": "tr",
|
||||
"ResourceName": "Platform",
|
||||
"Key": "App.Prc.MaterialRequests",
|
||||
"Value": "Malzeme Talepleri"
|
||||
"Value": "Satınalma Talepleri"
|
||||
},
|
||||
{
|
||||
"Id": "cf76b42b-82ed-5838-9fb2-30b0c8caf3e5",
|
||||
|
|
@ -93816,7 +93816,7 @@
|
|||
"CultureName": "tr",
|
||||
"ResourceName": "Platform",
|
||||
"Key": "App.Prc.MaterialRequestDeptApproval.Desc",
|
||||
"Value": "Departman Onayı Bekleyenler — departman onaycısının kararını bekleyen malzeme talepleri.\nNerede: Satınalma › Malzeme Talepleri › Departman Onayı Bekleyenler.\nKim: Yönetim › Tanımlamalar › Onaycılar'da talep edenin departmanı için Satınalma onay yerinde tanımlı onaycılar; her onaycı yalnız kendisine düşen talepleri görür.\nNe yapılır: talebi açıp Talep Satırları sekmesini inceleyin, ardından Onayla (talep satınalma onayına geçer) ya da not ve red nedeniyle (Satınalma › Tanımlamalar › Red Nedenleri) Reddet. Burada satır eklenip silinemez.\nİlişkili: Taleplerim, Satınalma Onayı Bekleyenler, Tüm Talepler."
|
||||
"Value": "Departman Onayı Bekleyenler — departman onaycısının kararını bekleyen malzeme talepleri.\nNerede: Satınalma › Satınalma Talepleri › Departman Onayı Bekleyenler.\nKim: Yönetim › Tanımlamalar › Onaycılar'da talep edenin departmanı için Satınalma onay yerinde tanımlı onaycılar; her onaycı yalnız kendisine düşen talepleri görür.\nNe yapılır: talebi açıp Talep Satırları sekmesini inceleyin, ardından Onayla (talep satınalma onayına geçer) ya da not ve red nedeniyle (Satınalma › Tanımlamalar › Red Nedenleri) Reddet. Burada satır eklenip silinemez.\nİlişkili: Taleplerim, Satınalma Onayı Bekleyenler, Tüm Talepler."
|
||||
},
|
||||
{
|
||||
"Id": "1c9a636f-fdfa-50bf-b3a4-874deed5dad1",
|
||||
|
|
@ -93858,7 +93858,7 @@
|
|||
"CultureName": "tr",
|
||||
"ResourceName": "Platform",
|
||||
"Key": "App.Prc.MaterialRequestPurchaseApproval.Desc",
|
||||
"Value": "Satınalma Onayı Bekleyenler — departmanca onaylanmış ve satınalmanın kararını bekleyen malzeme talepleri.\nNerede: Satınalma › Malzeme Talepleri › Satınalma Onayı Bekleyenler.\nKim: Yönetim › Tanımlamalar › Onaycılar'da Satınalma Masası onay yerinde tanımlı onaycılar (departmandan bağımsız); her onaycı yalnız kendisine düşen talepleri görür.\nNe yapılır: talebi ve satırlarını inceleyip Onayla (talep Onaylandı olur, Planlama Bekleyenler'e düşer, talep edene bilgi gider) ya da not ve red nedeniyle Reddet.\nİlişkili: Departman Onayı Bekleyenler, Planlama Bekleyenler, Tüm Talepler."
|
||||
"Value": "Satınalma Onayı Bekleyenler — departmanca onaylanmış ve satınalmanın kararını bekleyen malzeme talepleri.\nNerede: Satınalma › Satınalma Talepleri › Satınalma Onayı Bekleyenler.\nKim: Yönetim › Tanımlamalar › Onaycılar'da Satınalma Masası onay yerinde tanımlı onaycılar (departmandan bağımsız); her onaycı yalnız kendisine düşen talepleri görür.\nNe yapılır: talebi ve satırlarını inceleyip Onayla (talep Onaylandı olur, Planlama Bekleyenler'e düşer, talep edene bilgi gider) ya da not ve red nedeniyle Reddet.\nİlişkili: Departman Onayı Bekleyenler, Planlama Bekleyenler, Tüm Talepler."
|
||||
},
|
||||
{
|
||||
"Id": "9e5e455f-ecc8-5066-8fb4-63884166647d",
|
||||
|
|
@ -93900,7 +93900,7 @@
|
|||
"CultureName": "tr",
|
||||
"ResourceName": "Platform",
|
||||
"Key": "App.Prc.MaterialRequestPlanning.Desc",
|
||||
"Value": "Planlama Bekleyenler — onaylanmış ve satırları henüz tamamlanmamış malzeme talepleri; satınalma ekibinin iş listesi.\nNerede: Satınalma › Malzeme Talepleri › Planlama Bekleyenler.\nNe yapılır: talebi açıp Talep Satırları sekmesinde satınalma sorumlusunu, planlanacak miktarı ve satır durumunu (Bekliyor / Planlandı / Tamamlandı / İptal) girin. Talebin durumu satırları izler: bir satır Planlandı → İşlemde, satırların bir kısmı Tamamlandı → Kısmi Tamamlandı, tüm satırlar Tamamlandı ya da İptal → Tamamlandı (talep bu listeden çıkar). Teklif toplama sürecinin giriş noktasıdır.\nİlişkili: Satınalma Onayı Bekleyenler, Tüm Talepler."
|
||||
"Value": "Planlama Bekleyenler — onaylanmış ve satırları henüz tamamlanmamış malzeme talepleri; satınalma ekibinin iş listesi.\nNerede: Satınalma › Satınalma Talepleri › Planlama Bekleyenler.\nNe yapılır: talebi açıp Talep Satırları sekmesinde satınalma sorumlusunu, planlanacak miktarı ve satır durumunu (Bekliyor / Planlandı / Tamamlandı / İptal) girin. Talebin durumu satırları izler: bir satır Planlandı → İşlemde, satırların bir kısmı Tamamlandı → Kısmi Tamamlandı, tüm satırlar Tamamlandı ya da İptal → Tamamlandı (talep bu listeden çıkar). Teklif toplama sürecinin giriş noktasıdır.\nİlişkili: Satınalma Onayı Bekleyenler, Tüm Talepler."
|
||||
},
|
||||
{
|
||||
"Id": "04e8c193-a841-520d-b338-0d4a73ca066b",
|
||||
|
|
@ -93942,7 +93942,49 @@
|
|||
"CultureName": "tr",
|
||||
"ResourceName": "Platform",
|
||||
"Key": "App.Prc.MaterialRequest.Desc",
|
||||
"Value": "Tüm Talepler — kurumun bütün malzeme talepleri, tüm durumlarıyla; satınalma yönetiminin listesi.\nNerede: Satınalma › Malzeme Talepleri › Tüm Talepler.\nAlanlar: talep no (MT-YYYY-00001, otomatik), öncelik, talep eden, departman, depo ve konum, talep tarihi, durum (Taslak › Departman Onayı › Satınalma Onayı › Onaylandı › İşlemde › Kısmi Tamamlandı › Tamamlandı ya da Reddedildi), onay durumu, red nedeni, genel açıklama; onay grubu: departman onaycıları, departman / satınalma onaylayanı, tarihi ve notu; Talep Satırları sekmesi.\nAkış: Grid Workflow — departman onaycısı (Onaycılar › talebin departmanı için Satınalma onay yeri) → satınalma (Satınalma Masası onay yeri) → Onaylandı / Reddedildi; talep edene bilgi gider. Onay sonrası durum satır durumlarını izler.\nİlişkili: Taleplerim, Departman Onayı Bekleyenler, Satınalma Onayı Bekleyenler, Planlama Bekleyenler, Satınalma › Tanımlamalar › Red Nedenleri."
|
||||
"Value": "Tüm Talepler — kurumun bütün malzeme talepleri, tüm durumlarıyla; satınalma yönetiminin listesi.\nNerede: Satınalma › Satınalma Talepleri › Tüm Talepler.\nAlanlar: talep no (MT-YYYY-00001, otomatik), öncelik, talep eden, departman, depo ve konum, talep tarihi, durum (Taslak › Departman Onayı › Satınalma Onayı › Onaylandı › İşlemde › Kısmi Tamamlandı › Tamamlandı ya da Reddedildi), onay durumu, red nedeni, genel açıklama; onay grubu: departman onaycıları, departman / satınalma onaylayanı, tarihi ve notu; Talep Satırları sekmesi.\nAkış: Grid Workflow — departman onaycısı (Onaycılar › talebin departmanı için Satınalma onay yeri) → satınalma (Satınalma Masası onay yeri) → Onaylandı / Reddedildi; talep edene bilgi gider. Onay sonrası durum satır durumlarını izler.\nİlişkili: Taleplerim, Departman Onayı Bekleyenler, Satınalma Onayı Bekleyenler, Planlama Bekleyenler, Satınalma › Tanımlamalar › Red Nedenleri."
|
||||
},
|
||||
{
|
||||
"Id": "3d2aa673-6148-5445-9fb8-c260913a910f",
|
||||
"CultureName": "en",
|
||||
"ResourceName": "Platform",
|
||||
"Key": "App.Definitions.ApplicationSuite",
|
||||
"Value": "Applications"
|
||||
},
|
||||
{
|
||||
"Id": "7fd9d184-04c4-58cb-b602-78149c395bf2",
|
||||
"CultureName": "tr",
|
||||
"ResourceName": "Platform",
|
||||
"Key": "App.Definitions.ApplicationSuite",
|
||||
"Value": "Uygulamalar"
|
||||
},
|
||||
{
|
||||
"Id": "56d2d143-77ab-535e-a3f0-e0782ad519a4",
|
||||
"CultureName": "en",
|
||||
"ResourceName": "Platform",
|
||||
"Key": "App.Definitions.ApplicationSuite.Description",
|
||||
"Value": "Module packages offered to tenants. Saas › Definitions › Applications.\nEach suite has a unique name and a module list selected from the platform modules (multi-select).\nWhen a tenant is created from Public › Sales Orders (Tenant command), the selected suite fills the modules automatically; the modules can still be changed in the dialog.\nOnly active suites are offered in the dialog."
|
||||
},
|
||||
{
|
||||
"Id": "bb2a8a13-ee34-5952-8011-e819c6084275",
|
||||
"CultureName": "tr",
|
||||
"ResourceName": "Platform",
|
||||
"Key": "App.Definitions.ApplicationSuite.Description",
|
||||
"Value": "Kiracılara sunulan modül paketleri. Saas › Tanımlamalar › Uygulamalar.\nHer paketin benzersiz bir adı ve platform modüllerinden çoklu seçilen modül listesi vardır.\nPublic › Satış Siparişleri ekranındaki Kiracı komutuyla kiracı oluşturulurken seçilen paket modülleri otomatik doldurur; modüller diyalogda yine değiştirilebilir.\nDiyalogda yalnızca aktif paketler listelenir."
|
||||
},
|
||||
{
|
||||
"Id": "9838a893-5f2d-52e8-b327-a87981975711",
|
||||
"CultureName": "en",
|
||||
"ResourceName": "Platform",
|
||||
"Key": "App.Tenant.Name",
|
||||
"Value": "Tenant Name"
|
||||
},
|
||||
{
|
||||
"Id": "a3150b09-e4c7-5387-8cb0-b43929ae3f30",
|
||||
"CultureName": "tr",
|
||||
"ResourceName": "Platform",
|
||||
"Key": "App.Tenant.Name",
|
||||
"Value": "Kiracı Adı"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -259,6 +259,21 @@
|
|||
"ElementId": null,
|
||||
"ModuleId": "Sas"
|
||||
},
|
||||
{
|
||||
"Id": "6bbbe0ea-fb60-56ed-baef-7b9af0b6e784",
|
||||
"Code": "App.Definitions.ApplicationSuite",
|
||||
"DisplayName": "App.Definitions.ApplicationSuite",
|
||||
"Order": 10,
|
||||
"Url": "/admin/list/App.Definitions.ApplicationSuite",
|
||||
"Icon": "FcPackage",
|
||||
"ParentCode": "App.Saas.Definitions",
|
||||
"RequiredPermissionName": "App.Definitions.ApplicationSuite",
|
||||
"CssClass": null,
|
||||
"Target": null,
|
||||
"IsDisabled": false,
|
||||
"ElementId": null,
|
||||
"ModuleId": "Sas"
|
||||
},
|
||||
{
|
||||
"Id": "f1effbfd-7fec-5056-845c-6223010eb2d6",
|
||||
"Code": "App.Definitions.TerminationReason",
|
||||
|
|
@ -578,10 +593,10 @@
|
|||
"Id": "49faddb1-274f-40a7-bfa1-403d97c7925e",
|
||||
"Code": "App.Menus.Module",
|
||||
"DisplayName": "App.Menus.Module",
|
||||
"Order": 1,
|
||||
"Order": 9,
|
||||
"Url": "/admin/list/App.Menus.Module",
|
||||
"Icon": "FcGrid",
|
||||
"ParentCode": "App.Menus",
|
||||
"ParentCode": "App.Saas.Definitions",
|
||||
"RequiredPermissionName": "App.Menus.Module",
|
||||
"CssClass": null,
|
||||
"Target": null,
|
||||
|
|
@ -593,7 +608,7 @@
|
|||
"Id": "8b3fd17d-beba-4bec-ba6a-a3df93f3f5f7",
|
||||
"Code": "App.Menus.Routes",
|
||||
"DisplayName": "App.Menus.Routes",
|
||||
"Order": 2,
|
||||
"Order": 1,
|
||||
"Url": "/admin/list/App.Menus.Routes",
|
||||
"Icon": "FcMultipleInputs",
|
||||
"ParentCode": "App.Menus",
|
||||
|
|
@ -608,7 +623,7 @@
|
|||
"Id": "00d732b9-032b-4525-bab2-1663edfd56b2",
|
||||
"Code": "App.Menus.Menu",
|
||||
"DisplayName": "App.Menus.Menu",
|
||||
"Order": 3,
|
||||
"Order": 2,
|
||||
"Url": "/admin/list/App.Menus.Menu",
|
||||
"Icon": "FcMenu",
|
||||
"ParentCode": "App.Menus",
|
||||
|
|
@ -623,7 +638,7 @@
|
|||
"Id": "07488e92-3067-459a-ae58-37a959912784",
|
||||
"Code": "App.Menus.Manager",
|
||||
"DisplayName": "App.Menus.Manager",
|
||||
"Order": 4,
|
||||
"Order": 3,
|
||||
"Url": "/admin/menuManager",
|
||||
"Icon": "FaRegListAlt",
|
||||
"ParentCode": "App.Menus",
|
||||
|
|
@ -2765,124 +2780,168 @@
|
|||
"ModuleId": "Prj"
|
||||
},
|
||||
{
|
||||
"ParentCode": "App.Inventory.Definitions",
|
||||
"Id": "5bc3d7e4-ad9a-49be-945d-0f92a4035acc",
|
||||
"Code": "App.Inventory.Warehouse",
|
||||
"DisplayName": "App.Inventory.Warehouse",
|
||||
"Order": 7,
|
||||
"Url": "/admin/list/App.Inventory.Warehouse",
|
||||
"Icon": "FcHome",
|
||||
"ParentCode": "App.Inventory.Definitions",
|
||||
"RequiredPermissionName": "App.Inventory.Warehouse",
|
||||
"CssClass": null,
|
||||
"Target": null,
|
||||
"IsDisabled": false,
|
||||
"ElementId": null,
|
||||
"ModuleId": "Inventory"
|
||||
},
|
||||
{
|
||||
"ParentCode": "App.Inventory.Definitions",
|
||||
"Id": "e0e71cb4-720a-4365-8680-bf3a0b95440f",
|
||||
"Code": "App.Inventory.Location",
|
||||
"DisplayName": "App.Inventory.Location",
|
||||
"Order": 8,
|
||||
"Url": "/admin/list/App.Inventory.Location",
|
||||
"Icon": "FcTreeStructure",
|
||||
"ParentCode": "App.Inventory.Definitions",
|
||||
"RequiredPermissionName": "App.Inventory.Location",
|
||||
"CssClass": null,
|
||||
"Target": null,
|
||||
"IsDisabled": false,
|
||||
"ElementId": null,
|
||||
"ModuleId": "Inventory"
|
||||
},
|
||||
{
|
||||
"ParentCode": "App.Inventory.Definitions",
|
||||
"Id": "25a6a7b3-eea6-42fc-bbaa-e56920f26cb4",
|
||||
"Code": "App.Inventory.OperationType",
|
||||
"DisplayName": "App.Inventory.OperationType",
|
||||
"Order": 9,
|
||||
"Url": "/admin/list/App.Inventory.OperationType",
|
||||
"Icon": "FcProcess",
|
||||
"ParentCode": "App.Inventory.Definitions",
|
||||
"RequiredPermissionName": "App.Inventory.OperationType",
|
||||
"CssClass": null,
|
||||
"Target": null,
|
||||
"IsDisabled": false,
|
||||
"ElementId": null,
|
||||
"ModuleId": "Inventory"
|
||||
},
|
||||
{
|
||||
"ParentCode": "App.Administration.Definitions",
|
||||
"Id": "db640151-75a3-435d-a806-784c7cfcfe2d",
|
||||
"Code": "App.Definitions.Approver",
|
||||
"DisplayName": "App.Definitions.Approver",
|
||||
"Order": 6,
|
||||
"Url": "/admin/list/App.Definitions.Approver",
|
||||
"Icon": "FcApproval",
|
||||
"ParentCode": "App.Administration.Definitions",
|
||||
"RequiredPermissionName": "App.Definitions.Approver",
|
||||
"CssClass": null,
|
||||
"Target": null,
|
||||
"IsDisabled": false,
|
||||
"ElementId": null,
|
||||
"ModuleId": "Adm"
|
||||
},
|
||||
{
|
||||
"ParentCode": "App.Prc.Definitions",
|
||||
"Id": "4386ea81-1cec-4002-8a8b-d95b1690de90",
|
||||
"Code": "App.Prc.RejectReason",
|
||||
"DisplayName": "App.Prc.RejectReason",
|
||||
"Order": 5,
|
||||
"Url": "/admin/list/App.Prc.RejectReason",
|
||||
"Icon": "FcCancel",
|
||||
"ParentCode": "App.Prc.Definitions",
|
||||
"RequiredPermissionName": "App.Prc.RejectReason",
|
||||
"CssClass": null,
|
||||
"Target": null,
|
||||
"IsDisabled": false,
|
||||
"ElementId": null,
|
||||
"ModuleId": "Prc"
|
||||
},
|
||||
{
|
||||
"ParentCode": "App.Prc",
|
||||
"Id": "b9c609a2-b30d-4b63-835c-58e9d4cdda5f",
|
||||
"Code": "App.Prc.MaterialRequests",
|
||||
"DisplayName": "App.Prc.MaterialRequests",
|
||||
"Order": 2,
|
||||
"Url": null,
|
||||
"Icon": "FcList",
|
||||
"ParentCode": "App.Prc",
|
||||
"RequiredPermissionName": null,
|
||||
"CssClass": null,
|
||||
"Target": null,
|
||||
"IsDisabled": false,
|
||||
"ElementId": null,
|
||||
"ModuleId": "Prc"
|
||||
},
|
||||
{
|
||||
"ParentCode": "App.Prc.MaterialRequests",
|
||||
"Id": "14e5c127-6c82-40ff-8fd0-841f1a15bfa5",
|
||||
"Code": "App.Prc.MyMaterialRequest",
|
||||
"DisplayName": "App.Prc.MyMaterialRequest",
|
||||
"Order": 1,
|
||||
"Url": "/admin/list/App.Prc.MyMaterialRequest",
|
||||
"Icon": "FcPortraitMode",
|
||||
"ParentCode": "App.Prc.MaterialRequests",
|
||||
"RequiredPermissionName": "App.Prc.MyMaterialRequest",
|
||||
"CssClass": null,
|
||||
"Target": null,
|
||||
"IsDisabled": false,
|
||||
"ElementId": null,
|
||||
"ModuleId": "Prc"
|
||||
},
|
||||
{
|
||||
"ParentCode": "App.Prc.MaterialRequests",
|
||||
"Id": "3e06da59-736e-4c8c-b68a-f554ca278670",
|
||||
"Code": "App.Prc.MaterialRequestDeptApproval",
|
||||
"DisplayName": "App.Prc.MaterialRequestDeptApproval",
|
||||
"Order": 2,
|
||||
"Url": "/admin/list/App.Prc.MaterialRequestDeptApproval",
|
||||
"Icon": "FcApproval",
|
||||
"ParentCode": "App.Prc.MaterialRequests",
|
||||
"RequiredPermissionName": "App.Prc.MaterialRequestDeptApproval",
|
||||
"CssClass": null,
|
||||
"Target": null,
|
||||
"IsDisabled": false,
|
||||
"ElementId": null,
|
||||
"ModuleId": "Prc"
|
||||
},
|
||||
{
|
||||
"ParentCode": "App.Prc.MaterialRequests",
|
||||
"Id": "4a672706-d675-4a2a-904f-da7dab8b3843",
|
||||
"Code": "App.Prc.MaterialRequestPurchaseApproval",
|
||||
"DisplayName": "App.Prc.MaterialRequestPurchaseApproval",
|
||||
"Order": 3,
|
||||
"Url": "/admin/list/App.Prc.MaterialRequestPurchaseApproval",
|
||||
"Icon": "FcApproval",
|
||||
"ParentCode": "App.Prc.MaterialRequests",
|
||||
"RequiredPermissionName": "App.Prc.MaterialRequestPurchaseApproval",
|
||||
"CssClass": null,
|
||||
"Target": null,
|
||||
"IsDisabled": false,
|
||||
"ElementId": null,
|
||||
"ModuleId": "Prc"
|
||||
},
|
||||
{
|
||||
"ParentCode": "App.Prc.MaterialRequests",
|
||||
"Id": "893db5a1-88bb-4116-be3c-54ffb800b61c",
|
||||
"Code": "App.Prc.MaterialRequestPlanning",
|
||||
"DisplayName": "App.Prc.MaterialRequestPlanning",
|
||||
"Order": 4,
|
||||
"Url": "/admin/list/App.Prc.MaterialRequestPlanning",
|
||||
"Icon": "FcPlanner",
|
||||
"ParentCode": "App.Prc.MaterialRequests",
|
||||
"RequiredPermissionName": "App.Prc.MaterialRequestPlanning",
|
||||
"CssClass": null,
|
||||
"Target": null,
|
||||
"IsDisabled": false,
|
||||
"ElementId": null,
|
||||
"ModuleId": "Prc"
|
||||
},
|
||||
{
|
||||
"ParentCode": "App.Prc.MaterialRequests",
|
||||
"Id": "99ab4ed0-b594-4492-817e-a091fb7c3080",
|
||||
"Code": "App.Prc.MaterialRequest",
|
||||
"DisplayName": "App.Prc.MaterialRequest",
|
||||
"Order": 5,
|
||||
"Url": "/admin/list/App.Prc.MaterialRequest",
|
||||
"Icon": "FcDocument",
|
||||
"ParentCode": "App.Prc.MaterialRequests",
|
||||
"RequiredPermissionName": "App.Prc.MaterialRequest",
|
||||
"CssClass": null,
|
||||
"Target": null,
|
||||
"IsDisabled": false,
|
||||
"ElementId": null,
|
||||
"ModuleId": "Prc"
|
||||
}
|
||||
]
|
||||
|
|
|
|||
|
|
@ -72,7 +72,7 @@ Yetki ağacı: `App.Administration` grubu › `App.Administration.Definitions`
|
|||
|
||||
### 7. Entegrasyonlar
|
||||
|
||||
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.
|
||||
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 › Satınalma 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
|
||||
|
||||
|
|
@ -178,7 +178,7 @@ Dış entegrasyon yok. Ülke/Şehir/İlçe, Para Birimi, Dil, Sektör, Kullanıc
|
|||
| 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 -> Malzeme Talepleri |
|
||||
| Geliştirme talebi | Satınalma -> Satınalma Talepleri |
|
||||
| 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 |
|
||||
|
|
|
|||
|
|
@ -67,7 +67,7 @@ Yok. Tanımlar Yönetim › Tanımlamalar › Kontaklar'ın Satış ve Satınalm
|
|||
- Geri alma: Kontak sekmeleri bu tanımlara bağlı olduğu için önce kontak tarafındaki seçimler temizlenir; ekranlar `delete_wizard` ile silinir, tablolar yalnızca açık onayla `dropTables: true` ile düşürülür.
|
||||
|
||||
<!-- module-doc:section App.Prc.MaterialRequests -->
|
||||
## Malzeme Talepleri (`App.Prc.MaterialRequests`)
|
||||
## Satınalma Talepleri (`App.Prc.MaterialRequests`)
|
||||
|
||||
### 1. Amaç ve kapsam
|
||||
|
||||
|
|
@ -87,7 +87,7 @@ Departmanların iç ve dış ihtiyaç duydukları malzemeleri satınalmaya iletm
|
|||
|
||||
### 3. Menü ve ekranlar
|
||||
|
||||
Satınalma (`App.Prc`) › Malzeme Talepleri (`App.Prc.MaterialRequests`):
|
||||
Satınalma (`App.Prc`) › Satınalma Talepleri (`App.Prc.MaterialRequests`):
|
||||
|
||||
| Ekran | Kod | Filtre / not |
|
||||
| --- | --- | --- |
|
||||
|
|
@ -255,7 +255,7 @@ Yönetim › Tanımlamalar › Onaycılar (onay yerleri Satınalma ve Satınalma
|
|||
| Menü | `App.Prc.Definitions` › `App.Prc.RejectReason` (sıra 5) |
|
||||
| Yetki | `App.Prc.RejectReason` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` |
|
||||
| Açıklama | Red Nedenleri — satınalma taleplerinin reddedilme sebepleri (ihtiyaç yok, miktar uygun değil, yanlış ürün, bütçe uygun değil, diğer). |
|
||||
| Geliştirme talebi | Satınalma -> Malzeme Talepleri |
|
||||
| Geliştirme talebi | Satınalma -> Satınalma Talepleri |
|
||||
| Kaynak | `Prc_T_RejectReason` · filtre `"IsDeleted" = 'false'` |
|
||||
| Görünümler | Grid, Card, Pivot, Chart (açılış grid) |
|
||||
| Düzenleme | ekle ✓ · düzenle ✓ · sil ✓ · popup |
|
||||
|
|
@ -270,7 +270,7 @@ Yönetim › Tanımlamalar › Onaycılar (onay yerleri Satınalma ve Satınalma
|
|||
| `SortOrder` | Sıra | dxNumberBox | ✓ | ✓ | |
|
||||
| `IsActive` | Aktif | dxCheckBox | ✓ | ✓ | |
|
||||
|
||||
### Malzeme Talepleri (`App.Prc.MaterialRequests`)
|
||||
### Satınalma Talepleri (`App.Prc.MaterialRequests`)
|
||||
|
||||
#### Taleplerim — `App.Prc.MyMaterialRequest`
|
||||
|
||||
|
|
@ -281,7 +281,7 @@ Yönetim › Tanımlamalar › Onaycılar (onay yerleri Satınalma ve Satınalma
|
|||
| Menü | `App.Prc.MaterialRequests` › `App.Prc.MyMaterialRequest` (sıra 1) |
|
||||
| Yetki | `App.Prc.MyMaterialRequest` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` |
|
||||
| Açıklama | Taleplerim — açtığınız malzeme talepleri, tüm durumlarıyla. |
|
||||
| Geliştirme talebi | Satınalma -> Malzeme Talepleri |
|
||||
| Geliştirme talebi | Satınalma -> Satınalma Talepleri |
|
||||
| Kaynak | `Prc_T_MaterialRequest` · filtre `"IsDeleted" = 'false' AND "RequesterUserId" = '@USERID'` |
|
||||
| Görünümler | Grid, Card, Pivot, Chart (açılış grid) |
|
||||
| Düzenleme | ekle ✓ · düzenle ✓ · sil ✓ · popup |
|
||||
|
|
@ -326,7 +326,7 @@ Yönetim › Tanımlamalar › Onaycılar (onay yerleri Satınalma ve Satınalma
|
|||
| Menü | `App.Prc.MaterialRequests` › `App.Prc.MaterialRequestDeptApproval` (sıra 2) |
|
||||
| Yetki | `App.Prc.MaterialRequestDeptApproval` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` |
|
||||
| Açıklama | Departman Onayı Bekleyenler — departman onaycısının kararını bekleyen malzeme talepleri. |
|
||||
| Geliştirme talebi | Satınalma -> Malzeme Talepleri |
|
||||
| Geliştirme talebi | Satınalma -> Satınalma Talepleri |
|
||||
| Kaynak | `Prc_T_MaterialRequest` · filtre `"IsDeleted" = 'false' AND "ApprovalStatus" = N'Departman Onayı'` |
|
||||
| Görünümler | Grid, Card, Pivot, Chart (açılış grid) |
|
||||
| Düzenleme | ekle ✗ · düzenle ✓ · sil ✗ · popup |
|
||||
|
|
@ -364,7 +364,7 @@ Yönetim › Tanımlamalar › Onaycılar (onay yerleri Satınalma ve Satınalma
|
|||
| Menü | `App.Prc.MaterialRequests` › `App.Prc.MaterialRequestPurchaseApproval` (sıra 3) |
|
||||
| Yetki | `App.Prc.MaterialRequestPurchaseApproval` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` |
|
||||
| Açıklama | Satınalma Onayı Bekleyenler — departmanca onaylanmış ve satınalmanın kararını bekleyen malzeme talepleri. |
|
||||
| Geliştirme talebi | Satınalma -> Malzeme Talepleri |
|
||||
| Geliştirme talebi | Satınalma -> Satınalma Talepleri |
|
||||
| Kaynak | `Prc_T_MaterialRequest` · filtre `"IsDeleted" = 'false' AND "ApprovalStatus" = N'Satınalma Onayı'` |
|
||||
| Görünümler | Grid, Card, Pivot, Chart (açılış grid) |
|
||||
| Düzenleme | ekle ✗ · düzenle ✓ · sil ✗ · popup |
|
||||
|
|
@ -405,7 +405,7 @@ Yönetim › Tanımlamalar › Onaycılar (onay yerleri Satınalma ve Satınalma
|
|||
| Menü | `App.Prc.MaterialRequests` › `App.Prc.MaterialRequestPlanning` (sıra 4) |
|
||||
| Yetki | `App.Prc.MaterialRequestPlanning` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` |
|
||||
| Açıklama | Planlama Bekleyenler — onaylanmış ve satırları henüz tamamlanmamış malzeme talepleri; satınalma ekibinin iş listesi. |
|
||||
| Geliştirme talebi | Satınalma -> Malzeme Talepleri |
|
||||
| Geliştirme talebi | Satınalma -> Satınalma Talepleri |
|
||||
| Kaynak | `Prc_T_MaterialRequest` · filtre `"IsDeleted" = 'false' AND "ApprovalStatus" = N'Onaylandı' AND "Status" <> 'Done'` |
|
||||
| Görünümler | Grid, Card, Pivot, Chart (açılış grid) |
|
||||
| Düzenleme | ekle ✗ · düzenle ✓ · sil ✗ · popup |
|
||||
|
|
@ -442,7 +442,7 @@ Yönetim › Tanımlamalar › Onaycılar (onay yerleri Satınalma ve Satınalma
|
|||
| Menü | `App.Prc.MaterialRequests` › `App.Prc.MaterialRequest` (sıra 5) |
|
||||
| Yetki | `App.Prc.MaterialRequest` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` |
|
||||
| Açıklama | Tüm Talepler — kurumun bütün malzeme talepleri, tüm durumlarıyla; satınalma yönetiminin listesi. |
|
||||
| Geliştirme talebi | Satınalma -> Malzeme Talepleri |
|
||||
| Geliştirme talebi | Satınalma -> Satınalma Talepleri |
|
||||
| Kaynak | `Prc_T_MaterialRequest` · filtre `"IsDeleted" = 'false'` |
|
||||
| Görünümler | Grid, Card, Pivot, Chart (açılış grid) |
|
||||
| Düzenleme | ekle ✓ · düzenle ✓ · sil ✓ · popup |
|
||||
|
|
@ -487,7 +487,7 @@ Yönetim › Tanımlamalar › Onaycılar (onay yerleri Satınalma ve Satınalma
|
|||
| Menü | Menüsüz (alt form) |
|
||||
| Yetki | `App.Prc.MaterialRequestLine` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` |
|
||||
| Açıklama | Talep Satırları — malzeme talebinde istenen ürünler. |
|
||||
| Geliştirme talebi | Satınalma -> Malzeme Talepleri |
|
||||
| Geliştirme talebi | Satınalma -> Satınalma Talepleri |
|
||||
| Kaynak | `Prc_T_MaterialRequestItem` · filtre `"IsDeleted" = 'false'` |
|
||||
| Görünümler | Grid, Card, Pivot, Chart (açılış grid) |
|
||||
| Düzenleme | ekle ✓ · düzenle ✓ · sil ✓ · popup |
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@
|
|||
"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 / Purchasing Desk / Warehouse / Human Resources / Finance), approver user, active.\nUsed by: approval workflows read the approvers of the record's department and area. Purchasing › Material Requests: the department approval uses area Purchasing for the requester's department; the purchasing approval uses area Purchasing Desk (any department). 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 / Satınalma Masası / 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. Satınalma › Malzeme Talepleri: departman onayı talep edenin departmanındaki Satınalma satırlarını, satınalma onayı ise Satınalma Masası satırlarını (departmandan bağımsız) kullanır. Aynı departman ve onay yerine birden çok onaycı girilebilir; herhangi birinin onayı yeterlidir. Pasif satırlar akışlarda kullanılmaz.",
|
||||
"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 / Satınalma Masası / 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. Satınalma › Satınalma Talepleri: departman onayı talep edenin departmanındaki Satınalma satırlarını, satınalma onayı ise Satınalma Masası satırlarını (departmandan bağımsız) 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",
|
||||
|
|
@ -1428,6 +1428,6 @@
|
|||
},
|
||||
"DevRequest": {
|
||||
"Id": "53294e77-a4fb-45e4-a80e-acf07b5d75be",
|
||||
"Title": "Satınalma -> Malzeme Talepleri"
|
||||
"Title": "Satınalma -> Satınalma Talepleri"
|
||||
}
|
||||
}
|
||||
|
|
@ -1,9 +1,4 @@
|
|||
{
|
||||
"Pending": {
|
||||
"Since": "2026-10-09T00:00:00",
|
||||
"Replaced": {},
|
||||
"ListFormCodes": []
|
||||
},
|
||||
"Wizard": {
|
||||
"ComponentKind": 0,
|
||||
"WizardName": "Prc_MaterialRequest",
|
||||
|
|
@ -30,7 +25,7 @@
|
|||
},
|
||||
"Language": {
|
||||
"MenuParentEn": "Material Requests",
|
||||
"MenuParentTr": "Malzeme Talepleri",
|
||||
"MenuParentTr": "Satınalma Talepleri",
|
||||
"PermissionGroupEn": "Purchasing",
|
||||
"PermissionGroupTr": "Satınalma",
|
||||
"MenuEn": "All Requests",
|
||||
|
|
@ -38,7 +33,7 @@
|
|||
"TitleEn": "All Material Requests",
|
||||
"TitleTr": "Tüm Talepler",
|
||||
"DescEn": "All Requests — every material request of the company in every status; used by purchasing management.\nWhere: Purchasing › Material Requests › All Requests.\nFields: request no (MT-YYYY-00001, automatic), priority, requester, department, warehouse and location, request date, status (Draft › Department Approval › Purchasing Approval › Approved › In Progress › Partially Done › Done, or Rejected), approval status, rejection reason, general description; approval group: department approvers, department / purchasing approver, date and note; Request Lines tab.\nFlow: Grid Workflow — department approver (Approvers › area Purchasing of the request's department) → purchasing (area Purchasing Desk) → Approved / Rejected; the requester is notified. Status after approval follows the line statuses.\nRelated: My Requests, Awaiting Department Approval, Awaiting Purchasing Approval, Awaiting Planning, Purchasing › Definitions › Rejection Reasons.",
|
||||
"DescTr": "Tüm Talepler — kurumun bütün malzeme talepleri, tüm durumlarıyla; satınalma yönetiminin listesi.\nNerede: Satınalma › Malzeme Talepleri › Tüm Talepler.\nAlanlar: talep no (MT-YYYY-00001, otomatik), öncelik, talep eden, departman, depo ve konum, talep tarihi, durum (Taslak › Departman Onayı › Satınalma Onayı › Onaylandı › İşlemde › Kısmi Tamamlandı › Tamamlandı ya da Reddedildi), onay durumu, red nedeni, genel açıklama; onay grubu: departman onaycıları, departman / satınalma onaylayanı, tarihi ve notu; Talep Satırları sekmesi.\nAkış: Grid Workflow — departman onaycısı (Onaycılar › talebin departmanı için Satınalma onay yeri) → satınalma (Satınalma Masası onay yeri) → Onaylandı / Reddedildi; talep edene bilgi gider. Onay sonrası durum satır durumlarını izler.\nİlişkili: Taleplerim, Departman Onayı Bekleyenler, Satınalma Onayı Bekleyenler, Planlama Bekleyenler, Satınalma › Tanımlamalar › Red Nedenleri.",
|
||||
"DescTr": "Tüm Talepler — kurumun bütün malzeme talepleri, tüm durumlarıyla; satınalma yönetiminin listesi.\nNerede: Satınalma › Satınalma Talepleri › Tüm Talepler.\nAlanlar: talep no (MT-YYYY-00001, otomatik), öncelik, talep eden, departman, depo ve konum, talep tarihi, durum (Taslak › Departman Onayı › Satınalma Onayı › Onaylandı › İşlemde › Kısmi Tamamlandı › Tamamlandı ya da Reddedildi), onay durumu, red nedeni, genel açıklama; onay grubu: departman onaycıları, departman / satınalma onaylayanı, tarihi ve notu; Talep Satırları sekmesi.\nAkış: Grid Workflow — departman onaycısı (Onaycılar › talebin departmanı için Satınalma onay yeri) → satınalma (Satınalma Masası onay yeri) → Onaylandı / Reddedildi; talep edene bilgi gider. Onay sonrası durum satır durumlarını izler.\nİlişkili: Taleplerim, Departman Onayı Bekleyenler, Satınalma Onayı Bekleyenler, Planlama Bekleyenler, Satınalma › Tanımlamalar › Red Nedenleri.",
|
||||
"Texts": [
|
||||
{
|
||||
"Key": "App.Prc.MaterialRequest.Group.Request",
|
||||
|
|
@ -4022,6 +4017,6 @@
|
|||
},
|
||||
"DevRequest": {
|
||||
"Id": "53294e77-a4fb-45e4-a80e-acf07b5d75be",
|
||||
"Title": "Satınalma -> Malzeme Talepleri"
|
||||
"Title": "Satınalma -> Satınalma Talepleri"
|
||||
}
|
||||
}
|
||||
|
|
@ -1,9 +1,4 @@
|
|||
{
|
||||
"Pending": {
|
||||
"Since": "2026-10-09T00:00:00",
|
||||
"Replaced": {},
|
||||
"ListFormCodes": []
|
||||
},
|
||||
"Wizard": {
|
||||
"ComponentKind": 0,
|
||||
"WizardName": "Prc_MaterialRequestDeptApproval",
|
||||
|
|
@ -30,7 +25,7 @@
|
|||
},
|
||||
"Language": {
|
||||
"MenuParentEn": "Material Requests",
|
||||
"MenuParentTr": "Malzeme Talepleri",
|
||||
"MenuParentTr": "Satınalma Talepleri",
|
||||
"PermissionGroupEn": "Purchasing",
|
||||
"PermissionGroupTr": "Satınalma",
|
||||
"MenuEn": "Awaiting Department Approval",
|
||||
|
|
@ -38,7 +33,7 @@
|
|||
"TitleEn": "Awaiting Department Approval",
|
||||
"TitleTr": "Departman Onayı Bekleyenler",
|
||||
"DescEn": "Awaiting Department Approval — material requests waiting for the department approver's decision.\nWhere: Purchasing › Material Requests › Awaiting Department Approval.\nWho: approvers defined in Administration › Definitions › Approvers with area Purchasing for the requester's department; each approver sees only the requests assigned to them.\nWhat to do: open the request, review the Request Lines tab, then Approve (the request moves to purchasing approval) or Reject with a note and a rejection reason (Purchasing › Definitions › Rejection Reasons). Lines cannot be added or removed here.\nRelated: My Requests, Awaiting Purchasing Approval, All Requests.",
|
||||
"DescTr": "Departman Onayı Bekleyenler — departman onaycısının kararını bekleyen malzeme talepleri.\nNerede: Satınalma › Malzeme Talepleri › Departman Onayı Bekleyenler.\nKim: Yönetim › Tanımlamalar › Onaycılar'da talep edenin departmanı için Satınalma onay yerinde tanımlı onaycılar; her onaycı yalnız kendisine düşen talepleri görür.\nNe yapılır: talebi açıp Talep Satırları sekmesini inceleyin, ardından Onayla (talep satınalma onayına geçer) ya da not ve red nedeniyle (Satınalma › Tanımlamalar › Red Nedenleri) Reddet. Burada satır eklenip silinemez.\nİlişkili: Taleplerim, Satınalma Onayı Bekleyenler, Tüm Talepler.",
|
||||
"DescTr": "Departman Onayı Bekleyenler — departman onaycısının kararını bekleyen malzeme talepleri.\nNerede: Satınalma › Satınalma Talepleri › Departman Onayı Bekleyenler.\nKim: Yönetim › Tanımlamalar › Onaycılar'da talep edenin departmanı için Satınalma onay yerinde tanımlı onaycılar; her onaycı yalnız kendisine düşen talepleri görür.\nNe yapılır: talebi açıp Talep Satırları sekmesini inceleyin, ardından Onayla (talep satınalma onayına geçer) ya da not ve red nedeniyle (Satınalma › Tanımlamalar › Red Nedenleri) Reddet. Burada satır eklenip silinemez.\nİlişkili: Taleplerim, Satınalma Onayı Bekleyenler, Tüm Talepler.",
|
||||
"Texts": [
|
||||
{
|
||||
"Key": "App.Prc.MaterialRequest.Group.Request",
|
||||
|
|
@ -3059,6 +3054,6 @@
|
|||
},
|
||||
"DevRequest": {
|
||||
"Id": "53294e77-a4fb-45e4-a80e-acf07b5d75be",
|
||||
"Title": "Satınalma -> Malzeme Talepleri"
|
||||
"Title": "Satınalma -> Satınalma Talepleri"
|
||||
}
|
||||
}
|
||||
|
|
@ -1,9 +1,4 @@
|
|||
{
|
||||
"Pending": {
|
||||
"Since": "2026-10-09T00:00:00",
|
||||
"Replaced": {},
|
||||
"ListFormCodes": []
|
||||
},
|
||||
"Wizard": {
|
||||
"ComponentKind": 0,
|
||||
"WizardName": "Prc_MaterialRequestLine",
|
||||
|
|
@ -31,7 +26,7 @@
|
|||
},
|
||||
"Language": {
|
||||
"MenuParentEn": "Material Requests",
|
||||
"MenuParentTr": "Malzeme Talepleri",
|
||||
"MenuParentTr": "Satınalma Talepleri",
|
||||
"PermissionGroupEn": "Purchasing",
|
||||
"PermissionGroupTr": "Satınalma",
|
||||
"MenuEn": "Request Lines",
|
||||
|
|
@ -39,7 +34,7 @@
|
|||
"TitleEn": "Request Lines",
|
||||
"TitleTr": "Talep Satırları",
|
||||
"DescEn": "Request Lines — the products requested in a material request.\nWhere: Purchasing › Material Requests › any list › Request Lines tab (no menu of its own).\nFields: product (active, purchasable products), quantity, unit (copied from the product's purchase unit, read-only), fulfilment (Purchasing / Warehouse Transfer), due date, request reason, delivered quantity (read-only), planned quantity (defaults to quantity), purchasing responsible, line status (Waiting / Planned / Done / Cancelled).\nRules: lines can be added or deleted only while the request has not been sent for approval. Changing line statuses recalculates the request status (In Progress / Partially Done / Done).",
|
||||
"DescTr": "Talep Satırları — malzeme talebinde istenen ürünler.\nNerede: Satınalma › Malzeme Talepleri › herhangi bir liste › Talep Satırları sekmesi (kendi menüsü yoktur).\nAlanlar: ürün (aktif ve satın alınabilir ürünler), miktar, birim (ürünün satınalma biriminden gelir, salt okunur), karşılama şekli (Satınalma / Depodan Transfer), termin tarihi, talep nedeni, teslim edilen miktar (salt okunur), planlanacak miktar (boşsa miktar), satınalma sorumlusu, satır durumu (Bekliyor / Planlandı / Tamamlandı / İptal).\nKurallar: satır yalnız talep onaya gönderilmeden eklenip silinebilir. Satır durumları değişince talebin durumu yeniden hesaplanır (İşlemde / Kısmi Tamamlandı / Tamamlandı).",
|
||||
"DescTr": "Talep Satırları — malzeme talebinde istenen ürünler.\nNerede: Satınalma › Satınalma Talepleri › herhangi bir liste › Talep Satırları sekmesi (kendi menüsü yoktur).\nAlanlar: ürün (aktif ve satın alınabilir ürünler), miktar, birim (ürünün satınalma biriminden gelir, salt okunur), karşılama şekli (Satınalma / Depodan Transfer), termin tarihi, talep nedeni, teslim edilen miktar (salt okunur), planlanacak miktar (boşsa miktar), satınalma sorumlusu, satır durumu (Bekliyor / Planlandı / Tamamlandı / İptal).\nKurallar: satır yalnız talep onaya gönderilmeden eklenip silinebilir. Satır durumları değişince talebin durumu yeniden hesaplanır (İşlemde / Kısmi Tamamlandı / Tamamlandı).",
|
||||
"Texts": [
|
||||
{
|
||||
"Key": "App.StaticLookup.Purchase",
|
||||
|
|
@ -2408,6 +2403,6 @@
|
|||
},
|
||||
"DevRequest": {
|
||||
"Id": "53294e77-a4fb-45e4-a80e-acf07b5d75be",
|
||||
"Title": "Satınalma -> Malzeme Talepleri"
|
||||
"Title": "Satınalma -> Satınalma Talepleri"
|
||||
}
|
||||
}
|
||||
|
|
@ -1,9 +1,4 @@
|
|||
{
|
||||
"Pending": {
|
||||
"Since": "2026-10-09T00:00:00",
|
||||
"Replaced": {},
|
||||
"ListFormCodes": []
|
||||
},
|
||||
"Wizard": {
|
||||
"ComponentKind": 0,
|
||||
"WizardName": "Prc_MaterialRequestPlanning",
|
||||
|
|
@ -30,7 +25,7 @@
|
|||
},
|
||||
"Language": {
|
||||
"MenuParentEn": "Material Requests",
|
||||
"MenuParentTr": "Malzeme Talepleri",
|
||||
"MenuParentTr": "Satınalma Talepleri",
|
||||
"PermissionGroupEn": "Purchasing",
|
||||
"PermissionGroupTr": "Satınalma",
|
||||
"MenuEn": "Awaiting Planning",
|
||||
|
|
@ -38,7 +33,7 @@
|
|||
"TitleEn": "Awaiting Planning",
|
||||
"TitleTr": "Planlama Bekleyenler",
|
||||
"DescEn": "Awaiting Planning — approved material requests whose lines are not all completed yet; the purchasing team's work list.\nWhere: Purchasing › Material Requests › Awaiting Planning.\nWhat to do: open the request and, on the Request Lines tab, set the purchasing responsible, the quantity to plan and the line status (Waiting / Planned / Done / Cancelled). The request status follows the lines: any line Planned → In Progress, some lines Done → Partially Done, all lines Done or Cancelled → Done (the request then leaves this list). This list is the starting point of the quotation process.\nRelated: Awaiting Purchasing Approval, All Requests.",
|
||||
"DescTr": "Planlama Bekleyenler — onaylanmış ve satırları henüz tamamlanmamış malzeme talepleri; satınalma ekibinin iş listesi.\nNerede: Satınalma › Malzeme Talepleri › Planlama Bekleyenler.\nNe yapılır: talebi açıp Talep Satırları sekmesinde satınalma sorumlusunu, planlanacak miktarı ve satır durumunu (Bekliyor / Planlandı / Tamamlandı / İptal) girin. Talebin durumu satırları izler: bir satır Planlandı → İşlemde, satırların bir kısmı Tamamlandı → Kısmi Tamamlandı, tüm satırlar Tamamlandı ya da İptal → Tamamlandı (talep bu listeden çıkar). Teklif toplama sürecinin giriş noktasıdır.\nİlişkili: Satınalma Onayı Bekleyenler, Tüm Talepler.",
|
||||
"DescTr": "Planlama Bekleyenler — onaylanmış ve satırları henüz tamamlanmamış malzeme talepleri; satınalma ekibinin iş listesi.\nNerede: Satınalma › Satınalma Talepleri › Planlama Bekleyenler.\nNe yapılır: talebi açıp Talep Satırları sekmesinde satınalma sorumlusunu, planlanacak miktarı ve satır durumunu (Bekliyor / Planlandı / Tamamlandı / İptal) girin. Talebin durumu satırları izler: bir satır Planlandı → İşlemde, satırların bir kısmı Tamamlandı → Kısmi Tamamlandı, tüm satırlar Tamamlandı ya da İptal → Tamamlandı (talep bu listeden çıkar). Teklif toplama sürecinin giriş noktasıdır.\nİlişkili: Satınalma Onayı Bekleyenler, Tüm Talepler.",
|
||||
"Texts": [
|
||||
{
|
||||
"Key": "App.Prc.MaterialRequest.Group.Request",
|
||||
|
|
@ -2979,6 +2974,6 @@
|
|||
},
|
||||
"DevRequest": {
|
||||
"Id": "53294e77-a4fb-45e4-a80e-acf07b5d75be",
|
||||
"Title": "Satınalma -> Malzeme Talepleri"
|
||||
"Title": "Satınalma -> Satınalma Talepleri"
|
||||
}
|
||||
}
|
||||
|
|
@ -1,9 +1,4 @@
|
|||
{
|
||||
"Pending": {
|
||||
"Since": "2026-10-09T00:00:00",
|
||||
"Replaced": {},
|
||||
"ListFormCodes": []
|
||||
},
|
||||
"Wizard": {
|
||||
"ComponentKind": 0,
|
||||
"WizardName": "Prc_MaterialRequestPurchaseApproval",
|
||||
|
|
@ -30,7 +25,7 @@
|
|||
},
|
||||
"Language": {
|
||||
"MenuParentEn": "Material Requests",
|
||||
"MenuParentTr": "Malzeme Talepleri",
|
||||
"MenuParentTr": "Satınalma Talepleri",
|
||||
"PermissionGroupEn": "Purchasing",
|
||||
"PermissionGroupTr": "Satınalma",
|
||||
"MenuEn": "Awaiting Purchasing Approval",
|
||||
|
|
@ -38,7 +33,7 @@
|
|||
"TitleEn": "Awaiting Purchasing Approval",
|
||||
"TitleTr": "Satınalma Onayı Bekleyenler",
|
||||
"DescEn": "Awaiting Purchasing Approval — material requests approved by the department and waiting for purchasing.\nWhere: Purchasing › Material Requests › Awaiting Purchasing Approval.\nWho: approvers defined in Administration › Definitions › Approvers with area Purchasing Desk (any department); each approver sees only the requests assigned to them.\nWhat to do: review the request and its lines, then Approve (the request becomes Approved and appears in Awaiting Planning, the requester is notified) or Reject with a note and a rejection reason.\nRelated: Awaiting Department Approval, Awaiting Planning, All Requests.",
|
||||
"DescTr": "Satınalma Onayı Bekleyenler — departmanca onaylanmış ve satınalmanın kararını bekleyen malzeme talepleri.\nNerede: Satınalma › Malzeme Talepleri › Satınalma Onayı Bekleyenler.\nKim: Yönetim › Tanımlamalar › Onaycılar'da Satınalma Masası onay yerinde tanımlı onaycılar (departmandan bağımsız); her onaycı yalnız kendisine düşen talepleri görür.\nNe yapılır: talebi ve satırlarını inceleyip Onayla (talep Onaylandı olur, Planlama Bekleyenler'e düşer, talep edene bilgi gider) ya da not ve red nedeniyle Reddet.\nİlişkili: Departman Onayı Bekleyenler, Planlama Bekleyenler, Tüm Talepler.",
|
||||
"DescTr": "Satınalma Onayı Bekleyenler — departmanca onaylanmış ve satınalmanın kararını bekleyen malzeme talepleri.\nNerede: Satınalma › Satınalma Talepleri › Satınalma Onayı Bekleyenler.\nKim: Yönetim › Tanımlamalar › Onaycılar'da Satınalma Masası onay yerinde tanımlı onaycılar (departmandan bağımsız); her onaycı yalnız kendisine düşen talepleri görür.\nNe yapılır: talebi ve satırlarını inceleyip Onayla (talep Onaylandı olur, Planlama Bekleyenler'e düşer, talep edene bilgi gider) ya da not ve red nedeniyle Reddet.\nİlişkili: Departman Onayı Bekleyenler, Planlama Bekleyenler, Tüm Talepler.",
|
||||
"Texts": [
|
||||
{
|
||||
"Key": "App.Prc.MaterialRequest.Group.Request",
|
||||
|
|
@ -3466,6 +3461,6 @@
|
|||
},
|
||||
"DevRequest": {
|
||||
"Id": "53294e77-a4fb-45e4-a80e-acf07b5d75be",
|
||||
"Title": "Satınalma -> Malzeme Talepleri"
|
||||
"Title": "Satınalma -> Satınalma Talepleri"
|
||||
}
|
||||
}
|
||||
|
|
@ -1,9 +1,4 @@
|
|||
{
|
||||
"Pending": {
|
||||
"Since": "2026-10-09T00:00:00",
|
||||
"Replaced": {},
|
||||
"ListFormCodes": []
|
||||
},
|
||||
"Wizard": {
|
||||
"ComponentKind": 0,
|
||||
"WizardName": "Prc_MyMaterialRequest",
|
||||
|
|
@ -30,7 +25,7 @@
|
|||
},
|
||||
"Language": {
|
||||
"MenuParentEn": "Material Requests",
|
||||
"MenuParentTr": "Malzeme Talepleri",
|
||||
"MenuParentTr": "Satınalma Talepleri",
|
||||
"PermissionGroupEn": "Purchasing",
|
||||
"PermissionGroupTr": "Satınalma",
|
||||
"MenuEn": "My Requests",
|
||||
|
|
@ -38,7 +33,7 @@
|
|||
"TitleEn": "My Material Requests",
|
||||
"TitleTr": "Taleplerim",
|
||||
"DescEn": "My Requests — the material requests you opened, in every status.\nWhere: Purchasing › Material Requests › My Requests.\nFields: request no (MT-YYYY-00001, automatic), priority, requester (you), department (your department by default), warehouse and location where the goods will be put, request date, status, general description; Request Lines tab: product, quantity, unit, fulfilment, due date, request reason.\nFlow: add lines, then send for approval — the department approver (Approvers › area Purchasing for your department) and then purchasing (area Purchasing Desk) approve or reject. Lines can only be added or removed before sending. Approval / rejection details are shown in the approval group.\nRelated: Awaiting Department Approval, Awaiting Purchasing Approval, Awaiting Planning, All Requests.",
|
||||
"DescTr": "Taleplerim — açtığınız malzeme talepleri, tüm durumlarıyla.\nNerede: Satınalma › Malzeme Talepleri › Taleplerim.\nAlanlar: talep no (MT-YYYY-00001, otomatik), öncelik, talep eden (siz), departman (varsayılan olarak sizin departmanınız), malın konulacağı depo ve konum, talep tarihi, durum, genel açıklama; Talep Satırları sekmesi: ürün, miktar, birim, karşılama şekli, termin tarihi, talep nedeni.\nAkış: satırları girip onaya gönderin — önce departman onaycısı (Onaycılar › departmanınız için Satınalma onay yeri), ardından satınalma (Satınalma Masası onay yeri) onaylar ya da reddeder. Satırlar yalnız onaya göndermeden önce eklenip silinebilir. Onay / red bilgileri onay grubunda görünür.\nİlişkili: Departman Onayı Bekleyenler, Satınalma Onayı Bekleyenler, Planlama Bekleyenler, Tüm Talepler.",
|
||||
"DescTr": "Taleplerim — açtığınız malzeme talepleri, tüm durumlarıyla.\nNerede: Satınalma › Satınalma Talepleri › Taleplerim.\nAlanlar: talep no (MT-YYYY-00001, otomatik), öncelik, talep eden (siz), departman (varsayılan olarak sizin departmanınız), malın konulacağı depo ve konum, talep tarihi, durum, genel açıklama; Talep Satırları sekmesi: ürün, miktar, birim, karşılama şekli, termin tarihi, talep nedeni.\nAkış: satırları girip onaya gönderin — önce departman onaycısı (Onaycılar › departmanınız için Satınalma onay yeri), ardından satınalma (Satınalma Masası onay yeri) onaylar ya da reddeder. Satırlar yalnız onaya göndermeden önce eklenip silinebilir. Onay / red bilgileri onay grubunda görünür.\nİlişkili: Departman Onayı Bekleyenler, Satınalma Onayı Bekleyenler, Planlama Bekleyenler, Tüm Talepler.",
|
||||
"Texts": [
|
||||
{
|
||||
"Key": "App.Prc.MaterialRequest.Group.Request",
|
||||
|
|
@ -4073,6 +4068,6 @@
|
|||
},
|
||||
"DevRequest": {
|
||||
"Id": "53294e77-a4fb-45e4-a80e-acf07b5d75be",
|
||||
"Title": "Satınalma -> Malzeme Talepleri"
|
||||
"Title": "Satınalma -> Satınalma Talepleri"
|
||||
}
|
||||
}
|
||||
|
|
@ -33,7 +33,7 @@
|
|||
"TitleEn": "Rejection Reasons",
|
||||
"TitleTr": "Red Nedenleri",
|
||||
"DescEn": "Rejection Reasons — reasons a purchasing request can be rejected for (no need, quantity not suitable, wrong product, budget not suitable, other).\nWhere: Purchasing › Definitions › Rejection Reasons.\nFields: reason, sort order (order in the selection list), active.\nUsed by: Purchasing › Material Requests — the department approver or purchasing selects a reason when rejecting a request. Only active reasons are offered; deactivate a used reason instead of deleting it.",
|
||||
"DescTr": "Red Nedenleri — satınalma taleplerinin reddedilme sebepleri (ihtiyaç yok, miktar uygun değil, yanlış ürün, bütçe uygun değil, diğer).\nNerede: Satınalma › Tanımlamalar › Red Nedenleri.\nAlanlar: red nedeni, sıra (seçim listesindeki sırası), aktif.\nKullanıldığı yer: Satınalma › Malzeme Talepleri — departman onaycısı ya da satınalma talebi reddederken neden seçer. Yalnız aktif nedenler listelenir; kullanılmış neden silinmez, pasife alınır."
|
||||
"DescTr": "Red Nedenleri — satınalma taleplerinin reddedilme sebepleri (ihtiyaç yok, miktar uygun değil, yanlış ürün, bütçe uygun değil, diğer).\nNerede: Satınalma › Tanımlamalar › Red Nedenleri.\nAlanlar: red nedeni, sıra (seçim listesindeki sırası), aktif.\nKullanıldığı yer: Satınalma › Satınalma Talepleri — departman onaycısı ya da satınalma talebi reddederken neden seçer. Yalnız aktif nedenler listelenir; kullanılmış neden silinmez, pasife alınır."
|
||||
},
|
||||
"Groups": [
|
||||
{
|
||||
|
|
@ -1251,6 +1251,6 @@
|
|||
},
|
||||
"DevRequest": {
|
||||
"Id": "53294e77-a4fb-45e4-a80e-acf07b5d75be",
|
||||
"Title": "Satınalma -> Malzeme Talepleri"
|
||||
"Title": "Satınalma -> Satınalma Talepleri"
|
||||
}
|
||||
}
|
||||
|
|
@ -8,6 +8,18 @@ export type CreateTenantFromOrderInput = {
|
|||
modules: string
|
||||
}
|
||||
|
||||
export type ApplicationSuiteDto = {
|
||||
id: string
|
||||
name: string
|
||||
modules: string
|
||||
}
|
||||
|
||||
export const getApplicationSuites = () =>
|
||||
apiService.fetchData<ApplicationSuiteDto[]>({
|
||||
method: 'GET',
|
||||
url: '/api/app/list-form-dynamic-api/application-suites',
|
||||
})
|
||||
|
||||
export const getTenants = (skipCount = 0, maxResultCount = 10) =>
|
||||
apiService.fetchData<PagedResultDto<TenantDto>>({
|
||||
method: 'GET',
|
||||
|
|
|
|||
|
|
@ -10,7 +10,11 @@ import {
|
|||
} from '@/components/ui'
|
||||
import { MULTIVALUE_DELIMITER } from '@/constants/app.constant'
|
||||
import { getModules } from '@/services/menu.service'
|
||||
import { createTenantFromOrder } from '@/services/tenant.service'
|
||||
import {
|
||||
ApplicationSuiteDto,
|
||||
createTenantFromOrder,
|
||||
getApplicationSuites,
|
||||
} from '@/services/tenant.service'
|
||||
import { SelectBoxOption } from '@/types/shared'
|
||||
import { useLocalization } from '@/utils/hooks/useLocalization'
|
||||
import { Field, FieldProps, Form, Formik, FormikHelpers } from 'formik'
|
||||
|
|
@ -18,6 +22,7 @@ import { useEffect, useState } from 'react'
|
|||
import * as Yup from 'yup'
|
||||
|
||||
type CreateTenantFromOrderValues = {
|
||||
applicationSuiteId: string | null
|
||||
name: string
|
||||
modules: string[]
|
||||
}
|
||||
|
|
@ -40,36 +45,42 @@ const CreateTenantFromOrderDialog = ({
|
|||
}: CreateTenantFromOrderDialogProps) => {
|
||||
const { translate } = useLocalization()
|
||||
const [moduleOptions, setModuleOptions] = useState<SelectBoxOption[]>([])
|
||||
const [isModulesLoading, setIsModulesLoading] = useState(false)
|
||||
const [suites, setSuites] = useState<ApplicationSuiteDto[]>([])
|
||||
const [isLoading, setIsLoading] = useState(false)
|
||||
|
||||
useEffect(() => {
|
||||
if (!open) {
|
||||
return
|
||||
}
|
||||
|
||||
const fetchModules = async () => {
|
||||
setIsModulesLoading(true)
|
||||
const fetchOptions = async () => {
|
||||
setIsLoading(true)
|
||||
|
||||
try {
|
||||
const response = await getModules()
|
||||
const items = response?.data ?? []
|
||||
const [modulesResult, suitesResult] = await Promise.allSettled([
|
||||
getModules(),
|
||||
getApplicationSuites(),
|
||||
])
|
||||
|
||||
setModuleOptions(
|
||||
items.map((item: any) => ({
|
||||
modulesResult.status === 'fulfilled'
|
||||
? (modulesResult.value?.data ?? []).map((item: any) => ({
|
||||
value: String(item.key ?? item.Key ?? ''),
|
||||
label: String(item.name ?? item.Name ?? ''),
|
||||
})),
|
||||
}))
|
||||
: [],
|
||||
)
|
||||
} catch {
|
||||
setModuleOptions([])
|
||||
} finally {
|
||||
setIsModulesLoading(false)
|
||||
}
|
||||
setSuites(suitesResult.status === 'fulfilled' ? (suitesResult.value?.data ?? []) : [])
|
||||
setIsLoading(false)
|
||||
}
|
||||
|
||||
fetchModules()
|
||||
fetchOptions()
|
||||
}, [open])
|
||||
|
||||
const suiteOptions: SelectBoxOption[] = suites.map((suite) => ({
|
||||
value: suite.id,
|
||||
label: suite.name,
|
||||
}))
|
||||
|
||||
const handleSubmit = async (
|
||||
values: CreateTenantFromOrderValues,
|
||||
{ setSubmitting }: FormikHelpers<CreateTenantFromOrderValues>,
|
||||
|
|
@ -115,6 +126,7 @@ const CreateTenantFromOrderDialog = ({
|
|||
|
||||
<Formik<CreateTenantFromOrderValues>
|
||||
initialValues={{
|
||||
applicationSuiteId: null,
|
||||
name: '',
|
||||
modules: [],
|
||||
}}
|
||||
|
|
@ -124,6 +136,33 @@ const CreateTenantFromOrderDialog = ({
|
|||
{({ errors, touched, isSubmitting }) => (
|
||||
<Form>
|
||||
<FormContainer>
|
||||
<FormItem label={translate('::App.Definitions.ApplicationSuite')}>
|
||||
<Field name="applicationSuiteId">
|
||||
{({ field, form }: FieldProps<string | null>) => (
|
||||
<Select
|
||||
field={field}
|
||||
form={form}
|
||||
isClearable={true}
|
||||
isLoading={isLoading}
|
||||
options={suiteOptions}
|
||||
value={suiteOptions.find((option) => option.value === field.value) ?? null}
|
||||
onChange={(option) => {
|
||||
const suiteId = (option as SelectBoxOption | null)?.value ?? null
|
||||
const suite = suites.find((item) => item.id === suiteId)
|
||||
|
||||
form.setFieldValue(field.name, suiteId)
|
||||
if (suite) {
|
||||
form.setFieldValue(
|
||||
'modules',
|
||||
suite.modules.split(MULTIVALUE_DELIMITER).filter(Boolean),
|
||||
)
|
||||
}
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
</Field>
|
||||
</FormItem>
|
||||
|
||||
<FormItem
|
||||
label={translate('::App.Listform.ListformField.Modules')}
|
||||
invalid={Boolean(errors.modules && touched.modules)}
|
||||
|
|
@ -136,7 +175,7 @@ const CreateTenantFromOrderDialog = ({
|
|||
field={field}
|
||||
form={form}
|
||||
isClearable={true}
|
||||
isLoading={isModulesLoading}
|
||||
isLoading={isLoading}
|
||||
options={moduleOptions}
|
||||
value={moduleOptions.filter((option) =>
|
||||
(field.value ?? []).includes(option.value ?? ''),
|
||||
|
|
@ -153,7 +192,7 @@ const CreateTenantFromOrderDialog = ({
|
|||
</FormItem>
|
||||
|
||||
<FormItem
|
||||
label="Tenant Name"
|
||||
label={translate('::App.Tenant.Name')}
|
||||
invalid={Boolean(errors.name && touched.name)}
|
||||
errorMessage={errors.name}
|
||||
>
|
||||
|
|
|
|||
Loading…
Reference in a new issue