Inventory Planlama
This commit is contained in:
parent
52b6e1201d
commit
60992800a8
137 changed files with 21244 additions and 4592 deletions
|
|
@ -382,6 +382,17 @@ kullanıcı `ServerWhere` özelleştirmesi, widget `SqlQuery`, `LookupQuery`, `D
|
|||
onaycı filtresi. Widget SQL'i bu filtrelerden **geçmez** (kiracı koşulunu kendisi yazar). Yazma tarafında
|
||||
şube/birim ataması yoktur — `BranchId` varsayılanla ya da formdan gelir.
|
||||
|
||||
**Kullanıcının şubeleri ve şubedeki varsayılan depo/konum:** kullanıcı–şube ataması `Sas_T_BranchUsers`'tadır ve
|
||||
Kullanıcılar › detay › Yetkiler › Şube Yönetimi'nden yapılır. Atanan her şubede kullanıcının **varsayılan deposu**
|
||||
(`DefaultWarehouseId`, şubenin aktif deposu) ve **varsayılan konumu** (`DefaultLocationId`, o deponun aktif iç konumu)
|
||||
seçilir; şubenin deposu, deponun iç konumu varsa ikisi zorunludur (ekran ve `PlatformIdentityAppService.UpdatePermissionAsync`).
|
||||
Seçenekleri Envanter'in `Inv_T_Warehouse`/`Inv_T_Location` tablolarından servis okur; modül yoksa seçenek boş kalır.
|
||||
Bir ekranda "şube seçilince kullanıcının varsayılan deposu/konumu gelsin" için: `IsBranch: true`, şube lookup'ı
|
||||
`Sas_T_BranchUsers` ile `UserId = '@USERID'` üzerinden süzülüp `DefaultWarehouseId`/`DefaultLocationId` kolonlarını
|
||||
döndürür, şube alanının `EditorScript`'i `copy("DefaultWarehouseId", "WarehouseId")` (+ konum) ile yazar; yeni kaydın
|
||||
şube/depo/konum varsayılanı `DbQuery` ile aynı tablodan okunur. Örnek: `App.Prc.MyMaterialRequest`,
|
||||
`App.Prc.PurchaseRfq`, `App.Prc.PurchaseOrder`.
|
||||
|
||||
### 4.3 `*ServiceAddress`
|
||||
|
||||
`InsertServiceAddress` / `UpdateServiceAddress` / `DeleteServiceAddress` varsayılan olarak
|
||||
|
|
@ -565,7 +576,7 @@ denenir. Buraya yazılan kod ekran her açıldığında çalışır ve hiçbir y
|
|||
| `ListFormType` | `"List"` | `ListFormTypeEnum`: `List` (ızgara) \| `Form` (tek kayıt) \| `Chart` (yalnız grafik). Route karşılıkları: `/admin/list/{kod}` · `/admin/form/{kod}[/{id}[/edit]]` · `/admin/chart/{kod}` |
|
||||
| `IsSubForm` | `false` | Bilgi amaçlı — runtime okumaz; alt form davranışını sekmenin `isSubForm` prop'u belirler |
|
||||
| `SubFormsListFormType` | `"Form"` | **Bu ekranın kendi** `SubFormsJson` sekmelerinin nerede çizileceği: `List` → liste sayfasında grid/tree/card'ın altında, **seçili satıra bağlı** ana-detay (`SelectionJson.Mode` `single`/`multiple` olmalı) · `Form` → yalnız form/detay sayfasında |
|
||||
| `ShowNote` | `true` | Not paneli (alt form ya da iş akışı varsa wizard açar) |
|
||||
| `ShowNote` | `true` | Not paneli (alt form ya da iş akışı varsa wizard açar); yalnızca kayıt kaynağı Table olan listede — View/Query/SP/TVF listesinde kapalı, `PermissionJson.N` boş |
|
||||
|
||||
`ListFormType = "Form"` listesiz, tek kayıtlık kart ekrandır; canlı örneği Administration ›
|
||||
Licence'tır (§12.7); `/admin/form/{kod}` (id'siz) adresinde yeni kayıt yerine görüntüleme açılır ve
|
||||
|
|
@ -617,7 +628,7 @@ Aşağıdakilerin hepsi ekranla **kendiliğinden** gelir; açmak için yalnızca
|
|||
| Özel butonlar | `CommandColumnJson` (`lowcode` §4.9) | Grid, Tree, Card, Todo (yalnız Url/OnClick) ve form sayfası; Gantt/Scheduler/Pivot/Chart'ta yok |
|
||||
|
||||
**Satır butonları:** Düzenle (`AllowUpdating` + `U`), Sil (`AllowDeleting` + `D`), Detay (`AllowDetail` +
|
||||
**`U`**), Not (`ShowNote` + `PermissionJson.N`), Kopyala (`AllowDuplicate` + `C`), özel butonlar. Card'da
|
||||
**`U`**), Not (`ShowNote` + `PermissionJson.N`; yalnızca Table kaynağı), Kopyala (`AllowDuplicate` + `C`), özel butonlar. Grid/Tree'de buton kolonu sağa sabittir (`fixedPosition: right`); kolonlar sığmayınca da görünür kalır. Card'da
|
||||
butonlar kart başlığındadır; form sayfasında Düzenle/Sil/Detay dışındaki satır butonları ve toolbar
|
||||
butonları **form toolbar'ına taşınır**.
|
||||
|
||||
|
|
@ -1449,7 +1460,7 @@ Platform tablolarının adı `TableNameResolver` tarafından üretilir:
|
|||
### 12.2 Saas menüsü
|
||||
|
||||
Kök menü `App.Saas`. Yetki adı her satırda menünün `RequiredPermissionName` değeridir; ListForm
|
||||
ekranlarında alt yetkiler `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note`
|
||||
ekranlarında alt yetkiler `.Create`, `.Update`, `.Delete`, `.Export`, `.Import` (Table kaynağında ayrıca `.Note`)
|
||||
soneklerini alır.
|
||||
|
||||
| Ekran | Kod / route | Tablo | Kapsam | Komponent üretirken ne işe yarar |
|
||||
|
|
|
|||
123
.github/instructions/lowcode.instructions.md
vendored
123
.github/instructions/lowcode.instructions.md
vendored
|
|
@ -1011,7 +1011,7 @@ Tutarlılık zorunludur; menü, route, yetki ve dil anahtarı aynı kökten tür
|
|||
| `MenuCode` | `ListFormCode` ile aynı | `App.Mrp.Orders` |
|
||||
| Üst menü kodu | `App.{Modul}` | `App.Mrp` |
|
||||
| Yetki grubu | `App.{Modul}` | `App.Mrp` |
|
||||
| Yetkiler | `{MenuCode}` + `.Create/.Update/.Delete/.Export/.Import/.Note` | `App.Mrp.Orders.Create` |
|
||||
| Yetkiler | `{MenuCode}` + `.Create/.Update/.Delete/.Export/.Import` (+ `.Note` yalnızca kayıt kaynağı Table ise) | `App.Mrp.Orders.Create` |
|
||||
| Dil anahtarı (menü/başlık) | `{MenuCode}` | `App.Mrp.Orders` |
|
||||
| Dil anahtarı (alan) | `App.Listform.ListformField.{Alan}` | `App.Listform.ListformField.OrderNo` |
|
||||
| Route (List) | `/admin/list/{ListFormCode}` — statik `:listFormCode` route'u karşılar, DB'ye kayıt yazılmaz | `/admin/list/App.Mrp.Orders` |
|
||||
|
|
@ -1321,7 +1321,10 @@ saklanır. Dosya okunurken bu alanlar `ListForm`/`Fields` üzerinden geri doldur
|
|||
| `Language.Texts` | Başka bir cevaptan üretilmeyen dil anahtarları: `[{ "Key", "En", "Tr" }]` (widget başlığı gibi). Anahtar yoksa deploy satırı yazar ve wizard'a bağlar (silmede gider). Deploy, widget sorgularındaki tek tırnaklı noktalı her tanımlayıcıyı (`'App.Widget.ThisMonth'`) dil anahtarı sayar; veritabanında, bekleyen dil satırlarında, bu wizard'ın ürettiklerinde ya da burada yoksa deploy'u adlarıyla reddeder. |
|
||||
|
||||
Üretilen yetkiler: `{MenuCode}` (okuma, kök) + List yolunda `.Create .Update .Delete .Export
|
||||
.Import .Note`, Custom yolunda yalnızca `.Create .Update .Delete`. Hiçbiri bir role otomatik
|
||||
.Import` (+ `.Note` yalnızca `SelectCommandType = Table` iken), Custom yolunda yalnızca `.Create .Update .Delete`.
|
||||
**Not yalnızca tablo kaynaklı listede vardır:** View, Query, StoredProcedure ve TableValuedFunction kaynaklı listede
|
||||
`PermissionJson.N` boş, `ShowNote` kapalıdır ve `.Note` yetki satırı yazılmaz — view/sorgu satırının notun bağlanacağı kalıcı
|
||||
kaydı yoktur (`ListFormWizardDto.HasNote`; C# seeder'da `DefaultPermissionJson(name, hasNote: false)`). Hiçbiri bir role otomatik
|
||||
atanmaz (admin dahil); ekranı görecek roller yetkiyi rol ekranından alır.
|
||||
|
||||
**Veri**
|
||||
|
|
@ -1807,6 +1810,59 @@ yalnızca otomatik üretilecek numara içindir. `Sequence` kiracıya aittir (`IM
|
|||
host veritabanını paylaşan kiracıya seed dosyası uygulanmadığı için numaratör satırı o kiracıda
|
||||
ekrandan açılır.
|
||||
|
||||
#### 4.3.5.3 Özel komutun parametreleri — `*FieldsDefaultValueJson` komutla birlikte yazılır (zorunlu)
|
||||
|
||||
MCP, prompt ya da wizard ile üretilen veya düzenlenen her ekranda bir `InsertCommand` / `UpdateCommand` /
|
||||
`DeleteCommand` ya da `*BeforeCommand` / `*AfterCommand` kancası yazıldığında, komut metnindeki **her
|
||||
`@Parametre` aynı işte bir kaynağa bağlanır**. Komut yalnızca kendisine verilen parametrelerle çalışır
|
||||
(`QueryManager` komutu olduğu gibi çalıştırır, eksik parametreyi tamamlamaz); kaynağı olmayan parametre
|
||||
çalışma anında `Must declare the scalar variable "@X"` hatası verir ve ekran manuel düzeltme ister. Wizard'ın
|
||||
kendiliğinden yazdığı varsayılanlar (§4.4.1 tablosu) yalnızca tablonun audit kolonlarına göredir:
|
||||
view / sorgu / prosedür kaynaklı ekranda ve özel komutta eksik kalır — bu boşluğu üreten doldurur.
|
||||
|
||||
| Komuttaki parametre | Kaynağı |
|
||||
| --- | --- |
|
||||
| `@TenantId` | `IsTenant: true` ise sunucu ekler; listeye yazılmaz |
|
||||
| `@Alan` (kaydın bir alanı) | Gönderilen kayıttan gelir: alan ekranda tanımlı olmalı ve Insert'te `C`, Update'te `U` yetkisi taşımalı. Kaydı ızgara/form değil buton gönderiyorsa (`dynamicFetch('list-form-data/…')`) alan çağrının `data`'sına yazılır |
|
||||
| `@Id` — Update | Özel `UpdateCommand`'da `UpdateFieldsDefaultValueJson` → `Id = @ID` (tek değer: `= @Id`, `EXEC … @Id`). `UpdateCommand` boşsa (üretilen `UPDATE`) anahtar dizi olarak eklenir; bu ekranın Update kancalarında `IN @Id` yazılır |
|
||||
| `@Id` — Delete | `DeleteFieldsDefaultValueJson` → `Id = @ID` (seçili anahtarların tamamı; komutta `IN @Id`) |
|
||||
| `@Id` — Insert (yeni anahtar) | `InsertFieldsDefaultValueJson` → `Id = @NEWID` |
|
||||
| `@LastModifierId` · `@LastModificationTime` | `UpdateFieldsDefaultValueJson` → `@USERID` · `@NOW` |
|
||||
| `@DeleterId` | `DeleteFieldsDefaultValueJson` → `@USERID` |
|
||||
| `@CreatorId` · `@CreationTime` | `InsertFieldsDefaultValueJson` → `@USERID` · `@NOW` |
|
||||
| Sabit ya da sorgudan gelen değer | `CustomValueType: 1` (Value) / `3` (DbQuery), §4.3.5 |
|
||||
|
||||
`SelectCommand` parametre almaz ve `SelectFieldsDefaultValueJson` çalışma anında okunmaz (§4.3.5): okuma
|
||||
koşulu `DefaultFilter`'a token'la yazılır (`"CreatorId" = '@USERID'`).
|
||||
|
||||
Örnekler (Satınalma › Planlama):
|
||||
|
||||
```jsonc
|
||||
// App.Prc.MaterialRequestPlanLine — InsertCommand: EXEC Prc_P_MaterialRequestPlanSuggest @BaseId, @TenantId, @CreatorId
|
||||
// @BaseId gönderilen kayıttan, @TenantId sunucudan, @CreatorId listeden
|
||||
"InsertFieldsDefaultValueDto": [
|
||||
{ "FieldName": "CreationTime", "FieldDbType": 6, "Value": "@NOW", "CustomValueType": 2 },
|
||||
{ "FieldName": "CreatorId", "FieldDbType": 9, "Value": "@USERID", "CustomValueType": 2 }
|
||||
],
|
||||
// App.Prc.MaterialRequestPlanTrack — UpdateCommand: EXEC Prc_P_MaterialRequestStockUndo @Id, @TenantId, @LastModifierId
|
||||
"UpdateFieldsDefaultValueDto": [
|
||||
{ "FieldName": "LastModificationTime", "FieldDbType": 6, "Value": "@NOW", "CustomValueType": 2 },
|
||||
{ "FieldName": "LastModifierId", "FieldDbType": 9, "Value": "@USERID", "CustomValueType": 2 },
|
||||
{ "FieldName": "Id", "FieldDbType": 9, "Value": "@ID", "CustomValueType": 2 }
|
||||
],
|
||||
// DefaultDeleteCommand (… "DeleterId"=@DeleterId … WHERE "Id" IN @Id) — view kaynaklı ekranda da
|
||||
"DeleteFieldsDefaultValueDto": [
|
||||
{ "FieldName": "DeleterId", "FieldDbType": 9, "Value": "@USERID", "CustomValueType": 2 },
|
||||
{ "FieldName": "Id", "FieldDbType": 9, "Value": "@ID", "CustomValueType": 2 }
|
||||
]
|
||||
```
|
||||
|
||||
**Kontrol (teslimden önce):** her komut metninden `@\w+` adları çıkarılır ve her biri tablodaki bir kaynağa
|
||||
eşlenir; `@ID`, `@USERID`, `@NOW` gibi token'lar komutta değil listenin `Value`'sunda durur. Eşlenmeyen
|
||||
parametre varsa ekran teslim edilmez. Wizard dosyasında listeler `ListForm.InsertFieldsDefaultValueDto` /
|
||||
`UpdateFieldsDefaultValueDto` / `DeleteFieldsDefaultValueDto` adıyla durur; MCP `deploy_wizard`'da komutla aynı
|
||||
çağrının `ListForm` bölümünde verilir — komutu yazıp listeyi sonraya bırakmak yoktur.
|
||||
|
||||
### 4.3.6 Doğrulama — `ValidationRuleJson`
|
||||
|
||||
Alan başına DevExtreme doğrulama kuralları dizisi. Wizard `IsRequired: true` alanlara `required`
|
||||
|
|
@ -2022,7 +2078,7 @@ ile ekler (§4.0). Sıra değerleri veritabanı ile dosyadaki satırların birle
|
|||
| Üretilen | Kural |
|
||||
| --- | --- |
|
||||
| Dil anahtarları | `{MenuCode}` (menü), `{ListFormCode}.Title`, `{ListFormCode}.Desc`, `{PermissionGroupName}` ve her alan için `CaptionName` |
|
||||
| Yetkiler | `{MenuCode}` kökü + `.Create/.Update/.Delete` (+ List yolunda `.Export/.Import/.Note`) |
|
||||
| Yetkiler | `{MenuCode}` kökü + `.Create/.Update/.Delete` (+ List yolunda `.Export/.Import`; `.Note` yalnızca Table kaynağında) |
|
||||
| Yetkilerin dil anahtarları | Ortak sabitler: `App.Platform.Create/Update/Delete/Export/Import/Note` |
|
||||
| Üst menü zinciri | `MenuParentPath` + `MenuParentCode` kökten yürünür; kodu bulunamayan seviye önce aynı üstün altındaki dallarla adıyla eşleştirilir (dalın `DisplayName` anahtarı = verilen kod, ya da EN/TR adı aynı) ve eşleşen dalın koduna bağlanır; eşleşme yoksa bir üstünün altına `Order = max(kardeş Order) + 1` ile yaratılır (kökte kök menülerin sonu) |
|
||||
| Menü sırası | `MenuOrder` 0/boş ise `max(kardeş Order) + 1` |
|
||||
|
|
@ -2036,10 +2092,10 @@ ile ekler (§4.0). Sıra değerleri veritabanı ile dosyadaki satırların birle
|
|||
| `DefaultFilter` | `IsDeletedField: true` ise `"IsDeleted" = 'false'` |
|
||||
| `InsertFieldsDefaultValueJson` | `IsCreatedField: true` ise `CreationTime=@NOW`, `CreatorId=@USERID`, `IsDeleted=false`, `Id=@NEWID`; değilse yalnızca `Id=@NEWID` |
|
||||
| `DeleteFieldsDefaultValueJson` | `IsDeletedField: true` ise `DeleterId=@USERID`, `Id=@ID`; değilse yalnızca `Id=@ID` |
|
||||
| `UpdateFieldsDefaultValueJson` | Tabloda `LastModifierId` varsa `LastModificationTime=@NOW`, `LastModifierId=@USERID`; yoksa boş. `*AfterCommand`/`*BeforeCommand` içindeki `@LastModifierId` bu satırdan gelir |
|
||||
| `UpdateFieldsDefaultValueJson` | Tabloda `LastModifierId` varsa `LastModificationTime=@NOW`, `LastModifierId=@USERID`; yoksa boş. `*AfterCommand`/`*BeforeCommand` içindeki `@LastModifierId` bu satırdan gelir. Özel komut eklenen ekranda (view kaynağı dahil) bu üç liste komutun parametrelerine göre tamamlanır — §4.3.5.3 |
|
||||
| `ValidationRuleJson` | `IsRequired: true` olan alanlara required kuralı |
|
||||
| `LookupJson` | `LookupQuery` doluysa `LookupDataSourceType` + `DisplayExpr` + `ValueExpr` ile |
|
||||
| `ShowNote` | Alt form veya iş akışı varsa açılır |
|
||||
| `ShowNote` | Kayıt kaynağı Table ise ve alt form veya iş akışı varsa açılır; Table dışı kaynakta hep kapalı |
|
||||
| `SelectionJson` | İş akışı varsa `single`, yoksa `none` |
|
||||
| Görünüm option JSON'ları | İlgili bayrak açık **ve** zorunlu alanı dolu ise yazılır; eksikse görünüm sessizce kapanır |
|
||||
|
||||
|
|
@ -2385,7 +2441,7 @@ bu dördü dışında akış kolonu açılmaz:
|
|||
| `ApprovalStatusFieldName` | Durum |
|
||||
| `ApprovalDescriptionFieldName` | Onay/ret açıklaması |
|
||||
| `ApprovalIsFilterUserName` | Liste yalnızca kullanıcının onayına düşenleri göstersin: onaycı kolonu **boş** olan (akış başlatılabilsin diye) ya da `\|` ile bölünmüş değerlerinde kullanıcının UserName/Email/Name'i geçen satırlar |
|
||||
| `ApprovalIsResetWorkflow` | Toolbar'daki **Workflow Reset** düğmesini açar (yalnızca akışı başlamış satırda etkin); otomatik sıfırlama yoktur, bayrak kapalıyken `…/reset` reddedilir. `ApprovalIsManualStart` açıksa sıfırlama akışı yeniden çalıştırmaz; kayıt taslağa döner ve akış başlat düğmesiyle başlar |
|
||||
| `ApprovalIsResetWorkflow` | Toolbar'daki **Taslak** (iş akışı sıfırlama) düğmesini açar (yalnızca akışı başlamış satırda etkin); otomatik sıfırlama yoktur, bayrak kapalıyken `…/reset` reddedilir. `ApprovalIsManualStart` açıksa sıfırlama akışı yeniden çalıştırmaz; kayıt taslağa döner ve akış başlat düğmesiyle başlar |
|
||||
| `ApprovalIsManualStart` | Yeni kayıt akışı kendiliğinden başlatmasın; kayıt taslak kalır, akış toolbar'daki başlat düğmesiyle başlar. Onaya gönderilmiş başlığa satır eklemeyi engelleyen alt formu olan ekranlarda (talep + satırlar) açılır; kapalıyken Grid/Tree yeni kaydın ardından akışı başlatır |
|
||||
|
||||
`Criteria` düğüm grafiğidir. `Kind` değerleri: **`Start`**, **`Compare`**, **`Approval`**,
|
||||
|
|
@ -2670,8 +2726,16 @@ Kurallar:
|
|||
- `DialogName` **kayıtlı bir custom component adı değildir**; platformda tanımlı şu diyalogları
|
||||
açar: `RolesPermission`, `UsersPermission`, `TenantsConnectionString`,
|
||||
`CreateTenantFromOrderDialog`, `CreateNotification`, `AuditLogDetail`, `BranchSeed`,
|
||||
`DynamicServiceEditor`. Kayıt yeri `views/shared/DialogContext/DialogShowComponent.tsx`'tir;
|
||||
her diyalog `open` + `onDialogClose` prop'larını alır.
|
||||
`DynamicServiceEditor`, `DiaryEntry`, `PurchaseDocGrid`, `MaterialRequestPlan`. Kayıt yeri
|
||||
`views/shared/DialogContext/DialogShowComponent.tsx`'tir; her diyalog `open` + `onDialogClose` prop'larını alır.
|
||||
Son ikisi satır ya da toolbar butonunun `OnClick`'inden `dialog.setConfig({ component, props, onClose })` ile
|
||||
açılır ve ekranları platformun Grid'iyle `BaseId` filtresine süzerek gösterir; ekran kodları prop'tur, bileşene yazılmaz:
|
||||
- `PurchaseDocGrid` — tek ekran: `docId`, `listFormCode`, `title`, `info` (dil anahtarları `::` öneksiz).
|
||||
- `MaterialRequestPlan` — sekmeli karar ızgaraları + taslak ızgarası + Onayla: `itemId`, `planListFormCode` (özet satırı
|
||||
`Id` ile buradan okunur, Onayla bu ekranın `UpdateCommand`'ını `list-form-data/update` ile çalıştırır, buton
|
||||
`{planListFormCode}.Update` ister), `tabs` (ekran kodları; başlık `{kod}.Title`), `activeTab`, `draftListFormCode`,
|
||||
`info`. Bir ızgaradaki kayıt (`refreshData`) diğer ızgaraları ve özeti yeniler; kaydı yapan ızgara yeniden kurulmaz,
|
||||
süren batch kaydı kesilmesin diye. Örnek: Satınalma › Talepler › Planlama (`App.Prc.md`).
|
||||
Kendi ekranını açmak istiyorsan **Adres** modunu kullan (custom component route'u ya da
|
||||
`/admin/list/{ListFormCode}`).
|
||||
- `DialogName: "BarcodeScanDialog"` **toolbar butonuna özeldir** (`ButtonPosition: 1`) ve sürekli
|
||||
|
|
@ -2770,7 +2834,7 @@ Builder'ı (§5) açar — çıktıları `EditorOptions`/`EditorScript` string'l
|
|||
|
||||
**Adım 7 — İş Akışı.** Zorunlu ikili: `ApprovalUserFieldName` + `ApprovalStatusFieldName`;
|
||||
opsiyonel `ApprovalDateFieldName`, `ApprovalDescriptionFieldName`, `ApprovalIsFilterUserName`
|
||||
(liste yalnız sıradaki onaycıya düşsün), `ApprovalIsResetWorkflow` (toolbar'a Workflow Reset
|
||||
(liste yalnız sıradaki onaycıya düşsün), `ApprovalIsResetWorkflow` (toolbar'a Taslak
|
||||
düğmesi; otomatik sıfırlama yok), `ApprovalIsManualStart` (yeni kayıt taslak kalsın, akış başlat düğmesiyle başlasın). Onay düğümleri (`Criteria`) görsel akış tasarımcısında kurulur ve `ListFormWorkflow`
|
||||
kayıtlarına gider (§4.7).
|
||||
|
||||
|
|
@ -4173,6 +4237,39 @@ içindir.
|
|||
`Groups[0].Items[0]` olarak `IncludeInEditingForm: false` ile de yaz (§4.4.1).
|
||||
5. DB Migrate çalıştır; log'da `Executing: CREATE TABLE …` satırını gör.
|
||||
|
||||
### 8.6 Ölü artefakt taraması (her işin sonunda)
|
||||
|
||||
Yeni bir nesne eskisinin işini devraldığında eskisi **aynı işte** silinir; "sonra temizlenir" yoktur.
|
||||
Bir artefakt şu kaynaklardan biri onu kullanıyorsa yaşar, hiçbiri kullanmıyorsa silinir:
|
||||
|
||||
| Artefakt | Kullanılıyor sayılır, eğer… |
|
||||
| --- | --- |
|
||||
| SQL nesnesi (`{sql,postgres}/{object,execute,host}/X.sql`: tablo, view, yordam, fonksiyon) | adı bir wizard'ın `ListForm`/`Fields` bölümünde (kaynak, komut, lookup, widget, `CommandColumns`), `data/` ya da `crud/` dosyasında, `api/`/`ui/` kodunda geçiyor; `TableNameResolver` ile çözülüyor (`nameof(TableNameEnum.X)` + önek); ya da **kullanılan** başka bir SQL nesnesinin gövdesinden çağrılıyor (zincir izlenir). `execute/` scriptleri migrate'te her zaman çalıştığı için köktür |
|
||||
| Wizard (`wizard/*.json`) | kendi menüsü var (`CreateMenu` varsayılan) ya da başka bir wizard'ın `SubForms`/komut/URL'si, kod veya veri onu gösteriyor |
|
||||
| `data/{Kod}.json` / `data/{Kod}/` | `{Kod}` bir wizard'ın ya da `ListFormSeeder_*.cs`'in kurduğu ekran (`listFormName`), ya da platform satır dosyası (menü, yetki, dil, ABP yetki ekranları) |
|
||||
| Dil anahtarı | bir ekran öğesi (alan başlığı, buton, form grubu, widget, menü, yetki) ya da kod/veri onu gösteriyor |
|
||||
|
||||
Sayılmayanlar: yorum satırları (`--`, `//`), wizard'ın `Language` bölümündeki açıklama metni,
|
||||
`InsertedRecords` sahiplik listesi, modül dokümanı ve geliştirme talebi kayıtları (`data/App.DevRequests/`, açıklama/analiz metni) — bunlarda geçen ad nesneyi yaşatmaz.
|
||||
|
||||
**Dil anahtarı dikkat:** kodun çalışma anında birleştirdiği anahtarlar metin aramasında referanssız görünür
|
||||
(`App.Listform.ListformField.${field}` — profil sekmeleri, `App.Mcp.Error.*` hata kodları, enum adından
|
||||
türeyen `App.ListForm.Wizard*`, ABP'nin `Abp.Identity.*` mesajları). Bu ailelerden anahtar silinmeden
|
||||
önce birleştiren kod okunur; toplu silme yapılmaz.
|
||||
|
||||
**Silme yolu:**
|
||||
- SQL nesnesi: `sql/` ve `postgres/` dosyası birlikte silinir. Dosyayı silmek kurulu veritabanından
|
||||
nesneyi düşürmez; kurulu ortam için seed dışında tek seferlik `DROP VIEW/PROCEDURE/FUNCTION` betiği
|
||||
verilir. Tablo düşürülmez (şema kuralı: hiçbir tablo `DROP` edilmez) — yalnız scripti kalkar, veri kararını kullanıcı verir.
|
||||
- Wizard: Wizard Manager ya da MCP `delete_wizard` (dosyayı elle silmek kayıtları temizlemez, §4.5);
|
||||
elle silinen alt formun kayıtları üst wizard'ın `Pending.Replaced`'ına yazılır.
|
||||
- Kurulu ekranın sahip olduğu dil anahtarı: wizard'ın `Language.Texts` ve `InsertedRecords.LanguageKeys`
|
||||
listesinden çıkarılır, `Pending.Replaced.LanguageKeys`'e yazılır (migrate veritabanı satırını siler),
|
||||
EN + TR satırı `data/App.Languages.LanguageText.json`'dan silinir.
|
||||
|
||||
Tarama sonunda iki sağlayıcının nesne listesi aynı olmalı (her `sql/` dosyasının `postgres/` eşi var)
|
||||
ve kurulu veritabanında seed dosyası olmayan yordam/view/fonksiyon kalmamalıdır.
|
||||
|
||||
---
|
||||
|
||||
## 9. Artefakt F — CRUD Endpoint ve Developer Kit
|
||||
|
|
@ -5172,9 +5269,9 @@ isteniyorsa geçilir.
|
|||
5. **Onay akışı** — §4.7'deki `WorkflowDto`. Tipik grafik:
|
||||
`Start → Compare (tutar eşiği) → Approval (yönetici) / Approval (üst yönetici) → Inform → End`.
|
||||
`ApprovalIsFilterUserName: true` ile herkes yalnızca kendi onayına düşenleri görür,
|
||||
`ApprovalIsResetWorkflow: true` ile toolbar'daki Workflow Reset düğmesi akışı başa alır.
|
||||
`ApprovalIsResetWorkflow: true` ile toolbar'daki Taslak düğmesi akışı başa alır.
|
||||
6. **Yetki** — wizard `App.Hr.AdvanceRequests` kökünü ve `.Create/.Update/.Delete/.Export/
|
||||
.Import/.Note` alt yetkilerini üretir. Onaylayanların rolüne kök + `.Update` verilir;
|
||||
.Import/.Note` alt yetkilerini üretir (`.Note` tablo kaynaklı olduğu için). Onaylayanların rolüne kök + `.Update` verilir;
|
||||
talep sahiplerine kök + `.Create` yeter.
|
||||
7. **Dil** — menü/başlık/açıklama metinleri wizard dosyasındaki `Language` bölümünden,
|
||||
alan başlıkları her `Items` öğesinin `En`/`Tr` alanlarından üretilir.
|
||||
|
|
@ -5197,8 +5294,12 @@ tedarikçi lookup'ı + iki kademeli onay). Kalem taşıyan türevlerde ana ekran
|
|||
- [ ] `IsTenant` (ve gerekiyorsa `IsBranch`/`IsOrganizationUnit`) doğru; sorgular tenant güvenli.
|
||||
- [ ] Tüm SQL parametreli; string birleştirme yok.
|
||||
- [ ] `DeleteCommand = DefaultDeleteCommand("{Tablo}")`.
|
||||
- [ ] Her `*Command` / `*BeforeCommand` / `*AfterCommand` parametresinin kaynağı var: gönderilen alan,
|
||||
`IsTenant` ile gelen `@TenantId` ya da `Insert/Update/DeleteFieldsDefaultValueJson` satırı (§4.3.5.3).
|
||||
- [ ] Seed dosyası oluştu; `InsertedRecords` yalnızca gerçekten yaratılan kayıtları içeriyor.
|
||||
- [ ] Bağımlılıklar (custom component, crud endpoint, sql nesnesi) da seed'li.
|
||||
- [ ] Ölü artefakt yok: yerini yenisine bırakan SQL nesnesi/wizard/veri dosyası ve kullanılmayan dil
|
||||
anahtarı silindi (§8.6).
|
||||
- [ ] Hazır ekranlara eklenen kayıtlar (Sequence, zamanlanmış iş, bildirim tipi/kuralı, Custom
|
||||
Endpoint…) ekranın `data/` dosyasına yazıldı; `SeedFilePath`'i olmayan ekranın kaydı için
|
||||
`sql/execute/` altında geri getirici prosedür var (§9.14).
|
||||
|
|
|
|||
|
|
@ -536,7 +536,7 @@ listesi). Formlar içinde iş akışına bağlı özel butonlar gösterilebilir.
|
|||
2. **ListFormField** kümesi (sütunlar, editörler, lookup'lar, doğrulamalar)
|
||||
3. **Route** kaydı (`key`, `path`, `componentPath`, `routeType`, `authority`)
|
||||
4. **Menu** kaydı (`ParentCode`, `Code`, `DisplayName`, `Url`, `Icon`, `RequiredPermissionName`, `Order`)
|
||||
5. **Permission** kayıtları (`.Default`, `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note`)
|
||||
5. **Permission** kayıtları (`.Default`, `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`; `.Note` yalnızca kayıt kaynağı Table ise)
|
||||
6. **Dil anahtarları** (menü, başlık, açıklama; EN + TR)
|
||||
7. Gerekiyorsa **ayar/entegrasyon** bağımlılıkları
|
||||
8. **Seed dosyası** — `configs/seeds/wizard/{Ad}.json` (wizard cevapları + üretilen `ListForm`/`Fields` sözleşmesi)
|
||||
|
|
@ -1038,7 +1038,7 @@ taşınır (satır alt formun wizard'ına ait kalır, başka bir listeye bağlan
|
|||
Hiçbir listenin alt formu olmayan menüsüz wizard'ın yetkisi grubun kökünde kalır.
|
||||
Wizard deploy'u yeni grubu ve yeni yetkileri (seed satırı olarak) veritabanı ile seed
|
||||
dosyasındaki kardeşlerin en büyük sırasının bir fazlasıyla, alt yetkileri `WizardSeedRowKeys.ChildPermissions` dizilimiyle
|
||||
(List: Create/Update/Delete/Export/Import/Note, Custom: Create/Update/Delete) 1'den yazar
|
||||
(List: Create/Update/Delete/Export/Import + Table kaynağında Note, Custom: Create/Update/Delete) 1'den yazar
|
||||
(`ListFormWizardAppService.WritePermissionGroupAsync` / `WritePermissionRowsAsync`).
|
||||
|
||||
Aksiyon yetkisi olan alt gruplar (UI tarafındaki karşılıkları `constants/permission.constant.ts`
|
||||
|
|
@ -1333,7 +1333,8 @@ ekranın kendi ayrıntılı açıklamasını gösterir (`DescTr`/`DescEn`, `lowc
|
|||
ABP her zaman host'ta okur. Kiracı tablolarının satırları `DataSourceManager` üzerinden kiracının
|
||||
veri kaynağına gider.
|
||||
- **Şube (Branch):** Tenant altındaki fiziksel/örgütsel kırılım; kullanıcı–şube eşlemesi
|
||||
`BranchUsers` ile tutulur, lisans limiti girişte kontrol edilir.
|
||||
`BranchUsers` ile tutulur (atamada kullanıcının o şubedeki varsayılan deposu ve konumu da tutulur —
|
||||
`DefaultWarehouseId`/`DefaultLocationId`, Kullanıcılar › Yetkiler), lisans limiti girişte kontrol edilir.
|
||||
- **Organizasyon birimi:** ABP `OrganizationUnit` ağacı; ListForm'lar OU bazlı filtrelenebilir.
|
||||
- Lokalizasyon: isteğin kültürü (metin, tarih, sayı) `UseAbpRequestLocalization` ile UI'ın gönderdiği
|
||||
`Accept-Language`'tan kurulur. `TenantLocalizationMiddleware` + `TenantLocalizationInitializer` istek dışı
|
||||
|
|
|
|||
|
|
@ -9,5 +9,27 @@ public class AssignedBranchViewModel
|
|||
public string Name { get; set; }
|
||||
|
||||
public bool IsAssigned { get; set; }
|
||||
|
||||
public Guid? DefaultWarehouseId { get; set; }
|
||||
|
||||
public Guid? DefaultLocationId { get; set; }
|
||||
|
||||
/// <summary>Şubenin depoları ve konumları; varsayılan depo/konum seçimini besler, kayıtta yok sayılır.</summary>
|
||||
public BranchWarehouseViewModel[] Warehouses { get; set; } = [];
|
||||
}
|
||||
|
||||
public class BranchWarehouseViewModel
|
||||
{
|
||||
public Guid Id { get; set; }
|
||||
|
||||
public string Name { get; set; }
|
||||
|
||||
public BranchLocationViewModel[] Locations { get; set; } = [];
|
||||
}
|
||||
|
||||
public class BranchLocationViewModel
|
||||
{
|
||||
public Guid Id { get; set; }
|
||||
|
||||
public string Name { get; set; }
|
||||
}
|
||||
|
|
|
|||
|
|
@ -170,6 +170,11 @@ public class ListFormWizardDto
|
|||
public string DataSourceConnectionString { get; set; }
|
||||
|
||||
public SelectCommandTypeEnum SelectCommandType { get; set; }
|
||||
|
||||
/// <summary>Not (yetki, buton, panel) yalnizca tablo kaynakli listede uretilir.</summary>
|
||||
[JsonIgnore]
|
||||
public bool HasNote => SelectCommandType == SelectCommandTypeEnum.Table;
|
||||
|
||||
public string SelectCommand { get; set; }
|
||||
public string KeyFieldName { get; set; }
|
||||
public DbType KeyFieldDbSourceType { get; set; }
|
||||
|
|
@ -294,7 +299,7 @@ public class ListFormWizardDto
|
|||
Description = descLangKey,
|
||||
PageSize = 10,
|
||||
IsSubForm = false,
|
||||
ShowNote = subForms.Count > 0 || workflow.Criteria.Count > 0,
|
||||
ShowNote = HasNote && (subForms.Count > 0 || workflow.Criteria.Count > 0),
|
||||
SortMode = PlatformConsts.GridOptions.SortModeSingle,
|
||||
DataSourceCode = DataSourceCode,
|
||||
IsTenant = IsTenant,
|
||||
|
|
@ -336,7 +341,7 @@ public class ListFormWizardDto
|
|||
? PlatformConsts.GridOptions.SelectionModeSingle
|
||||
: PlatformConsts.GridOptions.SelectionModeNone);
|
||||
dto.ColumnOptionJson = WizardConsts.DefaultColumnOptionJson();
|
||||
dto.PermissionJson = WizardConsts.DefaultPermissionJson(code);
|
||||
dto.PermissionJson = WizardConsts.DefaultPermissionJson(code, HasNote);
|
||||
dto.PagerOptionJson = WizardConsts.DefaultPagerOptionJson;
|
||||
// Wizard alt formlari Form tipinde (SubFormsListFormType) uretir; sekmeler yalnizca Detay
|
||||
// (tek kayit) gorunumunde acilir, Detay kapali uretilirse sekmelere ulasilamaz.
|
||||
|
|
|
|||
|
|
@ -23,10 +23,11 @@ public static class WizardSeedRowKeys
|
|||
("Delete", WizardConsts.LangKeyDelete),
|
||||
];
|
||||
|
||||
// Export/Import/Note yalnizca ListForm ekosisteminin sundugu islemlerdir.
|
||||
return wizard.ComponentKind == WizardComponentKindEnum.Custom
|
||||
? crud
|
||||
: [.. crud, ("Export", WizardConsts.LangKeyExport), ("Import", WizardConsts.LangKeyImport), ("Note", WizardConsts.LangKeyNote)];
|
||||
// Export/Import/Note yalnizca ListForm ekosisteminin sundugu islemlerdir; Not ayrica yalnizca tablo kaynakli listededir.
|
||||
if (wizard.ComponentKind == WizardComponentKindEnum.Custom)
|
||||
return crud;
|
||||
(string, string)[] list = [.. crud, ("Export", WizardConsts.LangKeyExport), ("Import", WizardConsts.LangKeyImport)];
|
||||
return wizard.HasNote ? [.. list, ("Note", WizardConsts.LangKeyNote)] : list;
|
||||
}
|
||||
|
||||
/// <summary>Menuye eklenmeyen wizard'da izin grubu sorulmaz; bos geldiginde uygulama grubuna duser.</summary>
|
||||
|
|
|
|||
|
|
@ -7,9 +7,11 @@ using Microsoft.AspNetCore.Authorization;
|
|||
using Microsoft.AspNetCore.Identity;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using OpenIddict.Abstractions;
|
||||
using Sozsoft.Platform.BlobStoring;
|
||||
using Sozsoft.Platform.Data.Seeds;
|
||||
using Sozsoft.Platform.DynamicData;
|
||||
using Sozsoft.Platform.Entities;
|
||||
using Sozsoft.Platform.Extensions;
|
||||
using Sozsoft.Platform.Identity.Dto;
|
||||
|
|
@ -42,6 +44,7 @@ public class PlatformIdentityAppService : ApplicationService
|
|||
public IRepository<JobPosition, Guid> jobPositionRepository { get; }
|
||||
public BlobManager BlobCdnManager { get; }
|
||||
private readonly IConfiguration configuration;
|
||||
private readonly IDynamicDataManager dynamicDataManager;
|
||||
|
||||
public PlatformIdentityAppService(
|
||||
IIdentityUserAppService identityUserAppService,
|
||||
|
|
@ -59,7 +62,8 @@ public class PlatformIdentityAppService : ApplicationService
|
|||
IRepository<JobPosition, Guid> jobPositionRepository,
|
||||
BlobManager blobCdnManager,
|
||||
IConfiguration configuration,
|
||||
IGuidGenerator guidGenerator
|
||||
IGuidGenerator guidGenerator,
|
||||
IDynamicDataManager dynamicDataManager
|
||||
)
|
||||
{
|
||||
this.IdentityUserAppService = identityUserAppService;
|
||||
|
|
@ -78,6 +82,7 @@ public class PlatformIdentityAppService : ApplicationService
|
|||
this.branchUsersRepository = branchUsersRepository;
|
||||
this.claimTypesRepository = claimTypesRepository;
|
||||
this.guidGenerator = guidGenerator;
|
||||
this.dynamicDataManager = dynamicDataManager;
|
||||
}
|
||||
|
||||
// Kullanıcı detay ekranı (Users listesindeki Detail komutu) bu yetkiyle açılır.
|
||||
|
|
@ -100,14 +105,22 @@ public class PlatformIdentityAppService : ApplicationService
|
|||
|
||||
//Branch
|
||||
var queryBranch = await branchUsersRepository.GetQueryableAsync();
|
||||
var branchUsers = await AsyncExecuter.ToListAsync(
|
||||
queryBranch.Where(a => a.UserId == UserId).Select(r => r.BranchId));
|
||||
var branchUsers = (await AsyncExecuter.ToListAsync(queryBranch.Where(a => a.UserId == UserId)))
|
||||
.ToDictionary(a => a.BranchId);
|
||||
var branchList = await branchRepository.GetListAsync(a => a.TenantId == currentTenantId);
|
||||
var branches = branchList.Select(branch => new AssignedBranchViewModel
|
||||
var branchWarehouses = await GetBranchWarehousesAsync();
|
||||
var branches = branchList.Select(branch =>
|
||||
{
|
||||
var assigned = branchUsers.GetValueOrDefault(branch.Id);
|
||||
return new AssignedBranchViewModel
|
||||
{
|
||||
Id = branch.Id,
|
||||
Name = branch.Name,
|
||||
IsAssigned = branchUsers.Contains(branch.Id)
|
||||
IsAssigned = assigned != null,
|
||||
DefaultWarehouseId = assigned?.DefaultWarehouseId,
|
||||
DefaultLocationId = assigned?.DefaultLocationId,
|
||||
Warehouses = branchWarehouses.GetValueOrDefault(branch.Id) ?? []
|
||||
};
|
||||
})
|
||||
.ToArray();
|
||||
|
||||
|
|
@ -211,22 +224,97 @@ public class PlatformIdentityAppService : ApplicationService
|
|||
.Where(b => b.IsAssigned)
|
||||
.Select(b => b.Id)
|
||||
.ToList();
|
||||
var assignedBranchIds = (await branchRepository.GetListAsync(
|
||||
b => requestedBranchIds.Contains(b.Id) && b.TenantId == CurrentTenant.Id))
|
||||
.Select(b => b.Id)
|
||||
.ToList();
|
||||
var assignedBranches = await branchRepository.GetListAsync(
|
||||
b => requestedBranchIds.Contains(b.Id) && b.TenantId == CurrentTenant.Id);
|
||||
var branchWarehouses = await GetBranchWarehousesAsync();
|
||||
|
||||
foreach (var branchId in assignedBranchIds)
|
||||
foreach (var branch in assignedBranches)
|
||||
{
|
||||
var branchUser = new BranchUsers
|
||||
var input = UserInfo.Branches.First(b => b.Id == branch.Id);
|
||||
var (warehouseId, locationId) = ResolveBranchDefaults(branch.Name, input, branchWarehouses.GetValueOrDefault(branch.Id) ?? []);
|
||||
await branchUsersRepository.InsertAsync(new BranchUsers
|
||||
{
|
||||
UserId = user.Id,
|
||||
BranchId = branchId
|
||||
};
|
||||
await branchUsersRepository.InsertAsync(branchUser);
|
||||
BranchId = branch.Id,
|
||||
DefaultWarehouseId = warehouseId,
|
||||
DefaultLocationId = locationId
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Şubenin deposu varsa varsayılan depo, deponun iç konumu varsa varsayılan konum zorunludur ve seçilen değer o şubeye/depoya
|
||||
/// ait olmalıdır; şubede (ya da depoda) hiç kayıt yoksa alan boş kalır.
|
||||
/// </summary>
|
||||
private (Guid? WarehouseId, Guid? LocationId) ResolveBranchDefaults(
|
||||
string branchName, AssignedBranchViewModel input, BranchWarehouseViewModel[] warehouses)
|
||||
{
|
||||
if (warehouses.Length == 0)
|
||||
{
|
||||
return (null, null);
|
||||
}
|
||||
|
||||
var warehouse = warehouses.FirstOrDefault(w => w.Id == input.DefaultWarehouseId)
|
||||
?? throw new UserFriendlyException(L["Abp.Identity.User.BranchDefaultWarehouseRequired", branchName]);
|
||||
if (warehouse.Locations.Length == 0)
|
||||
{
|
||||
return (warehouse.Id, null);
|
||||
}
|
||||
|
||||
var location = warehouse.Locations.FirstOrDefault(l => l.Id == input.DefaultLocationId)
|
||||
?? throw new UserFriendlyException(L["Abp.Identity.User.BranchDefaultLocationRequired", branchName]);
|
||||
return (warehouse.Id, location.Id);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Kiracının aktif depoları ve iç konumları, şubeye göre. Depo ve konum Envanter modülünün seed tablolarıdır (EF varlığı değil);
|
||||
/// modül kurulu değilse şubelerin depo seçeneği boş kalır.
|
||||
/// </summary>
|
||||
private async Task<Dictionary<Guid, BranchWarehouseViewModel[]>> GetBranchWarehousesAsync()
|
||||
{
|
||||
var tenantFilter = CurrentTenant.Id.HasValue ? "w.\"TenantId\" = @TenantId" : "w.\"TenantId\" IS NULL";
|
||||
var sql =
|
||||
"SELECT w.\"Id\" AS \"WarehouseId\", w.\"BranchId\", CONCAT(w.\"Code\", ' - ', w.\"Name\") AS \"WarehouseName\", " +
|
||||
"l.\"Id\" AS \"LocationId\", " +
|
||||
"CASE WHEN l.\"Code\" IS NULL THEN l.\"Name\" ELSE CONCAT(l.\"Code\", ' - ', l.\"Name\") END AS \"LocationName\" " +
|
||||
"FROM \"Inv_T_Warehouse\" w " +
|
||||
"LEFT JOIN \"Inv_T_Location\" l ON l.\"WarehouseId\" = w.\"Id\" AND l.\"IsDeleted\" = 'false' AND l.\"IsActive\" = 'true' " +
|
||||
"AND l.\"LocationType\" = 'Internal' " +
|
||||
$"WHERE w.\"IsDeleted\" = 'false' AND w.\"IsActive\" = 'true' AND {tenantFilter} " +
|
||||
"ORDER BY w.\"Code\", l.\"Code\", l.\"Name\"";
|
||||
|
||||
IEnumerable<dynamic> rows;
|
||||
try
|
||||
{
|
||||
var (repository, connectionString, _) = await dynamicDataManager.GetAsync(true, SeedConsts.DataSources.DefaultCode);
|
||||
rows = await repository.QueryAsync(sql, connectionString,
|
||||
CurrentTenant.Id.HasValue ? new Dictionary<string, object> { ["TenantId"] = CurrentTenant.Id.Value } : null);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.LogWarning(ex, "Branch warehouses could not be read; default warehouse/location selection is disabled.");
|
||||
return [];
|
||||
}
|
||||
|
||||
return rows
|
||||
.Cast<IDictionary<string, object>>()
|
||||
.GroupBy(r => (Guid)r["BranchId"])
|
||||
.ToDictionary(
|
||||
branch => branch.Key,
|
||||
branch => branch
|
||||
.GroupBy(r => ((Guid)r["WarehouseId"], (string)r["WarehouseName"]))
|
||||
.Select(w => new BranchWarehouseViewModel
|
||||
{
|
||||
Id = w.Key.Item1,
|
||||
Name = w.Key.Item2,
|
||||
Locations = w
|
||||
.Where(r => r["LocationId"] != null)
|
||||
.Select(r => new BranchLocationViewModel { Id = (Guid)r["LocationId"], Name = (string)r["LocationName"] })
|
||||
.ToArray()
|
||||
})
|
||||
.ToArray());
|
||||
}
|
||||
|
||||
[Authorize(IdentityPermissions.Users.Update)]
|
||||
public async Task UpdateLockoutAsync(UserInfoViewModel UserInfo)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -6714,7 +6714,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
|
|||
GroupPanelJson = DefaultGroupPanelJson(),
|
||||
SelectionJson = DefaultSelectionSingleJson,
|
||||
ColumnOptionJson = DefaultColumnOptionJson(),
|
||||
PermissionJson = DefaultPermissionJson(listFormName),
|
||||
PermissionJson = DefaultPermissionJson(listFormName, hasNote: false),
|
||||
PagerOptionJson = DefaultPagerOptionJson,
|
||||
EditingOptionJson = DefaultEditingOptionJson(listFormName, 600, 450, false, false, false, false, false),
|
||||
}, autoSave: true
|
||||
|
|
|
|||
|
|
@ -247,7 +247,8 @@ public static class ListFormSeeder_DefaultJsons
|
|||
N = a,
|
||||
});
|
||||
}
|
||||
public static string DefaultPermissionJson(string permissionName)
|
||||
/// <summary>Not yalnizca tablo kaynakli listede vardir (view/sorgu listesine <paramref name="hasNote"/> = false).</summary>
|
||||
public static string DefaultPermissionJson(string permissionName, bool hasNote = true)
|
||||
{
|
||||
return JsonSerializer.Serialize(new PermissionCrudDto
|
||||
{
|
||||
|
|
@ -257,7 +258,7 @@ public static class ListFormSeeder_DefaultJsons
|
|||
D = permissionName + ".Delete",
|
||||
E = permissionName + ".Export",
|
||||
I = permissionName + ".Import",
|
||||
N = permissionName + ".Note",
|
||||
N = hasNote ? permissionName + ".Note" : null,
|
||||
});
|
||||
}
|
||||
public static string DefaultFieldPermissionJson(string permissionName)
|
||||
|
|
|
|||
|
|
@ -4812,7 +4812,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
|||
GroupPanelJson = DefaultGroupPanelJson(),
|
||||
SelectionJson = DefaultSelectionSingleJson,
|
||||
ColumnOptionJson = DefaultColumnOptionJson(),
|
||||
PermissionJson = DefaultPermissionJson(listFormName),
|
||||
PermissionJson = DefaultPermissionJson(listFormName, hasNote: false),
|
||||
PagerOptionJson = DefaultPagerOptionJson
|
||||
}
|
||||
);
|
||||
|
|
|
|||
|
|
@ -185,11 +185,15 @@ public class PlatformIdentityDataSeeder : IdentityDataSeeder
|
|||
var defaultBranchUsers = await _branchUsersRepository.FirstOrDefaultAsync(bu => bu.UserId == adminUser.Id && bu.BranchId == defaultBranch.Id);
|
||||
if (defaultBranchUsers is null)
|
||||
{
|
||||
// Varsayılan depo/konum seed satırları host şubesine aittir; kiracı şubesi yeni kimlik aldığı için orada boş kalır.
|
||||
var isHostBranch = defaultBranch.Id == PlatformConsts.Branches.BranchIdDefaultValue;
|
||||
await _branchUsersRepository.InsertAsync(new BranchUsers
|
||||
{
|
||||
BranchId = defaultBranch.Id,
|
||||
UserId = adminUser.Id,
|
||||
TenantId = tenantId
|
||||
TenantId = tenantId,
|
||||
DefaultWarehouseId = isHostBranch ? PlatformConsts.Branches.WarehouseIdDefaultValue : null,
|
||||
DefaultLocationId = isHostBranch ? PlatformConsts.Branches.LocationIdDefaultValue : null
|
||||
}, autoSave: true);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -65,6 +65,10 @@ public static class PlatformConsts
|
|||
{
|
||||
// Host şubesinin kimliği sabittir; seed edilen departman/pozisyon satırları BranchId ile ona bağlanır.
|
||||
public static readonly Guid BranchIdDefaultValue = Guid.Parse("1c125bf3-3ffd-4445-a270-1bc43ac3f61c");
|
||||
// Host yöneticisinin şubedeki varsayılan deposu ve konumu: host şubesine bağlı seed satırları
|
||||
// (data/App.Inventory.Warehouse.json "IKT", data/App.Inventory.Location.json "0001 - Ana Depo").
|
||||
public static readonly Guid WarehouseIdDefaultValue = Guid.Parse("1840580a-7984-cb0a-4008-3a2431f55623");
|
||||
public static readonly Guid LocationIdDefaultValue = Guid.Parse("d92a4c2e-1ca2-4453-a66c-e7b3bf682716");
|
||||
public const string BranchCode = "Br1";
|
||||
public const string BranchName = "Branch1";
|
||||
public const long BranchVknTckn = 52849619172;
|
||||
|
|
|
|||
|
|
@ -78,7 +78,8 @@ public static class WizardConsts
|
|||
FocusedRowEnabled = FocusedRowEnabled,
|
||||
});
|
||||
|
||||
public static string DefaultPermissionJson(string permissionName)
|
||||
/// <summary>Not yalnizca tablo kaynakli listede vardir: view/sorgu satirinin notu bagli oldugu kalici kaydi yoktur.</summary>
|
||||
public static string DefaultPermissionJson(string permissionName, bool hasNote)
|
||||
{
|
||||
return JsonSerializer.Serialize(new
|
||||
{
|
||||
|
|
@ -88,7 +89,7 @@ public static class WizardConsts
|
|||
D = permissionName + ".Delete",
|
||||
E = permissionName + ".Export",
|
||||
I = permissionName + ".Import",
|
||||
N = permissionName + ".Note",
|
||||
N = hasNote ? permissionName + ".Note" : null,
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -11,6 +11,10 @@ public class BranchUsers : Entity<Guid>, IMultiTenant
|
|||
public Guid BranchId { get; set; }
|
||||
public Guid UserId { get; set; }
|
||||
|
||||
// Kullanıcının bu şubede açtığı belgelerin varsayılan deposu ve konumu (Envanter tabloları; şube seçilince forma gelir).
|
||||
public Guid? DefaultWarehouseId { get; set; }
|
||||
public Guid? DefaultLocationId { get; set; }
|
||||
|
||||
Guid? IMultiTenant.TenantId => TenantId;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore;
|
|||
namespace Sozsoft.Platform.Migrations
|
||||
{
|
||||
[DbContext(typeof(PlatformDbContext))]
|
||||
[Migration("20261009171249_Initial")]
|
||||
[Migration("20261014072150_Initial")]
|
||||
partial class Initial
|
||||
{
|
||||
/// <inheritdoc />
|
||||
|
|
@ -1483,6 +1483,12 @@ namespace Sozsoft.Platform.Migrations
|
|||
b.Property<Guid>("BranchId")
|
||||
.HasColumnType("uniqueidentifier");
|
||||
|
||||
b.Property<Guid?>("DefaultLocationId")
|
||||
.HasColumnType("uniqueidentifier");
|
||||
|
||||
b.Property<Guid?>("DefaultWarehouseId")
|
||||
.HasColumnType("uniqueidentifier");
|
||||
|
||||
b.Property<Guid?>("TenantId")
|
||||
.HasColumnType("uniqueidentifier")
|
||||
.HasColumnName("TenantId");
|
||||
|
|
@ -2195,7 +2195,9 @@ namespace Sozsoft.Platform.Migrations
|
|||
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
|
||||
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
|
||||
BranchId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
|
||||
UserId = table.Column<Guid>(type: "uniqueidentifier", nullable: false)
|
||||
UserId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
|
||||
DefaultWarehouseId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
|
||||
DefaultLocationId = table.Column<Guid>(type: "uniqueidentifier", nullable: true)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
|
|
@ -1480,6 +1480,12 @@ namespace Sozsoft.Platform.Migrations
|
|||
b.Property<Guid>("BranchId")
|
||||
.HasColumnType("uniqueidentifier");
|
||||
|
||||
b.Property<Guid?>("DefaultLocationId")
|
||||
.HasColumnType("uniqueidentifier");
|
||||
|
||||
b.Property<Guid?>("DefaultWarehouseId")
|
||||
.HasColumnType("uniqueidentifier");
|
||||
|
||||
b.Property<Guid?>("TenantId")
|
||||
.HasColumnType("uniqueidentifier")
|
||||
.HasColumnName("TenantId");
|
||||
|
|
|
|||
21
claude.md
21
claude.md
|
|
@ -224,6 +224,11 @@ Bir çelişki varsa sıra: `ai.instructions.md` → `dotnet.instructions.md` →
|
|||
tekrar sorgu/dosya okuması kaldırılır, kod/değer **statik yazılmaz** — tablo adı
|
||||
`TableNameResolver`'dan, değer tablo/seed/ayar verisinden dinamik bulunur. Son mesajda ne
|
||||
temizlendiği tek satırla söylenir.
|
||||
Kapsam seed artefaktlarını da içerir: yeni bir yordam/view/ekran eskisinin işini devralınca eskisi
|
||||
aynı işte silinir (iki sağlayıcının dosyası, wizard'ı, menü/yetki/dil satırları). Kullanımı biten
|
||||
SQL nesnesi (tablo, view, yordam, fonksiyon), menüsüz ve referanssız wizard, ekranı olmayan `data/`
|
||||
dosyası ve hiçbir ekran öğesinin göstermediği dil anahtarı bırakılmaz; tarama kuralı
|
||||
`lowcode.instructions.md` §8.6.
|
||||
18. **Yeni kaydın form varsayılanı** → Wizard ve MCP ile üretilen her listede form varsayılanı
|
||||
kolonun veritabanındaki sabit `DEFAULT` değeridir; deploy onu tablodan (katalog ya da seed
|
||||
scripti) okuyup `FormFieldsDefaultValueJson`'a yazar, değer koda gömülmez. Bu yüzden tablo
|
||||
|
|
@ -264,6 +269,19 @@ Bir çelişki varsa sıra: `ai.instructions.md` → `dotnet.instructions.md` →
|
|||
düğüm başlığıdır, red nedeni onay düğümünün `RejectReason` listesinden seçilip açıklamaya yazılır.
|
||||
Bu dört alan popup düzenleme formunda yer almaz (akış yazar), listede kolon olarak görünür.
|
||||
Ayrıntı: `lowcode.instructions.md` §4.7.
|
||||
25. **Not yalnızca Table kaynağında** → kayıt kaynağı (`SelectCommandType`) Table olmayan listede (View, Query,
|
||||
StoredProcedure, TableValuedFunction) Not yoktur: `PermissionJson.N` boş, `ShowNote` kapalı, `{Kod}.Note` yetki satırı ve
|
||||
satırdaki Not butonu üretilmez; view/sorgu satırının notun bağlanacağı kalıcı kaydı yoktur. Wizard/MCP bunu kendisi uygular
|
||||
(`ListFormWizardDto.HasNote`), C# seeder'da `DefaultPermissionJson(name, hasNote: false)` yazılır. Ayrıntı:
|
||||
`lowcode.instructions.md` §4.2 (Üretilen yetkiler).
|
||||
26. **Özel komutun parametreleri boş bırakılmaz** → MCP/prompt/wizard ile üretilen ya da düzenlenen ekranda yazılan her
|
||||
`InsertCommand`/`UpdateCommand`/`DeleteCommand` ve `*BeforeCommand`/`*AfterCommand` ile aynı işte
|
||||
`Insert/Update/DeleteFieldsDefaultValueJson` da tamamlanır: komuttaki her `@Parametre` gönderilen alana, `IsTenant`'ın
|
||||
eklediği `@TenantId`'ye ya da listedeki bir satıra (`Id=@ID`, `LastModifierId=@USERID`, `DeleterId=@USERID`,
|
||||
`CreatorId=@USERID`, `*Time=@NOW`) bağlanır; kaynağı olmayan parametre "Must declare the scalar variable" verir.
|
||||
Wizard'ın audit varsayılanları view/sorgu kaynaklı ekranda ve özel komutta eksik kalır, bu yüzden kontrol üretendedir.
|
||||
`SelectFieldsDefaultValueJson` çalışma anında okunmaz; okuma koşulu `DefaultFilter`'a yazılır. Ayrıntı:
|
||||
`lowcode.instructions.md` §4.3.5.3.
|
||||
|
||||
### Cross-cutting: touching one thing means touching these too
|
||||
|
||||
|
|
@ -639,6 +657,9 @@ Bir çelişki varsa sıra: `ai.instructions.md` → `dotnet.instructions.md` →
|
|||
silinmeden önce **repo geneli** (api + ui + configs) referans taraması yapılır; DI ile çözülen
|
||||
tipler düz metin aramasında referanssız görünür.
|
||||
- Yorum satırına alınmış kod bloğu bırakılmaz.
|
||||
- Seed tarafında ölü artefakt yok (`lowcode.instructions.md` §8.6): yerini yenisine bırakan SQL nesnesi,
|
||||
wizard ve veri dosyası silinmiş; her `sql/` dosyasının `postgres/` eşi var; kullanılmayan dil anahtarı
|
||||
wizard'ın `Language.Texts`/`InsertedRecords`'undan ve dil dosyasından çıkarılmış.
|
||||
- Modül/ekran/bileşen ekleyen ya da davranışını değiştiren iş modül dokümanını
|
||||
(`configs/seeds/docs/modules/{Menü}.md`) yazar veya günceller; liste ekranının açıklaması
|
||||
ayrıntılıdır (standing default 14–15).
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -5,29 +5,15 @@
|
|||
"Order": 0,
|
||||
"Rows": [
|
||||
{
|
||||
"Name": "KADİFETEKS MENSUCAT SANAYİ A.Ş.",
|
||||
"Code": "WH",
|
||||
"BranchId": "1c125bf3-3ffd-4445-a270-1bc43ac3f61c",
|
||||
"IsActive": true,
|
||||
"Id": "89f31a2d-9cb5-97b5-740b-3a2431f55623"
|
||||
},
|
||||
{
|
||||
"Name": "Grup Şirketler",
|
||||
"Code": "GRP",
|
||||
"BranchId": "1c125bf3-3ffd-4445-a270-1bc43ac3f61c",
|
||||
"IsActive": true,
|
||||
"Id": "c27e0d96-e943-fe45-48f9-3a2431f55623"
|
||||
},
|
||||
{
|
||||
"Name": "İkitelli Fabrika",
|
||||
"Code": "IKT",
|
||||
"Name": "1. Kısım",
|
||||
"Code": "0001",
|
||||
"BranchId": "1c125bf3-3ffd-4445-a270-1bc43ac3f61c",
|
||||
"IsActive": true,
|
||||
"Id": "1840580a-7984-cb0a-4008-3a2431f55623"
|
||||
},
|
||||
{
|
||||
"Name": "Kuzuluk Fabrika",
|
||||
"Code": "KZL",
|
||||
"Name": "2. Kısım",
|
||||
"Code": "0002",
|
||||
"BranchId": "1c125bf3-3ffd-4445-a270-1bc43ac3f61c",
|
||||
"IsActive": true,
|
||||
"Id": "a729660b-5397-6019-1b2e-3a2431f55623"
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -2914,11 +2914,41 @@
|
|||
"ElementId": null,
|
||||
"ModuleId": "Prc"
|
||||
},
|
||||
{
|
||||
"Id": "e52aac2e-1bdb-5493-8bf8-9174fe4984a1",
|
||||
"Code": "App.Prc.MaterialRequestPlan",
|
||||
"DisplayName": "App.Prc.MaterialRequestPlan",
|
||||
"Order": 4,
|
||||
"Url": "/admin/list/App.Prc.MaterialRequestPlan",
|
||||
"Icon": "FcPlanner",
|
||||
"ParentCode": "App.Prc.MaterialRequests",
|
||||
"RequiredPermissionName": "App.Prc.MaterialRequestPlan",
|
||||
"CssClass": null,
|
||||
"Target": null,
|
||||
"IsDisabled": false,
|
||||
"ElementId": null,
|
||||
"ModuleId": "Prc"
|
||||
},
|
||||
{
|
||||
"Id": "78a00bdb-1403-55a7-8971-b1d198c58889",
|
||||
"Code": "App.Prc.MaterialRequestPlanTrack",
|
||||
"DisplayName": "App.Prc.MaterialRequestPlanTrack",
|
||||
"Order": 5,
|
||||
"Url": "/admin/list/App.Prc.MaterialRequestPlanTrack",
|
||||
"Icon": "FcInspection",
|
||||
"ParentCode": "App.Prc.MaterialRequests",
|
||||
"RequiredPermissionName": "App.Prc.MaterialRequestPlanTrack",
|
||||
"CssClass": null,
|
||||
"Target": null,
|
||||
"IsDisabled": false,
|
||||
"ElementId": null,
|
||||
"ModuleId": "Prc"
|
||||
},
|
||||
{
|
||||
"Id": "99ab4ed0-b594-4492-817e-a091fb7c3080",
|
||||
"Code": "App.Prc.MaterialRequest",
|
||||
"DisplayName": "App.Prc.MaterialRequest",
|
||||
"Order": 4,
|
||||
"Order": 6,
|
||||
"Url": "/admin/list/App.Prc.MaterialRequest",
|
||||
"Icon": "FcDocument",
|
||||
"ParentCode": "App.Prc.MaterialRequests",
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -71,7 +71,7 @@ Yok. Tanımlar Yönetim › Tanımlamalar › Kontaklar'ın Satış ve Satınalm
|
|||
|
||||
### 1. Amaç ve kapsam
|
||||
|
||||
Departmanların iç ve dış ihtiyaç duydukları malzemeleri satınalmaya iletmesi. Talep eden personel talebi ve satırlarını girer, onaya gönderir; talep önce talep edenin departman onaycısına, sonra satınalmaya düşer. Onaylanan talep Tüm Talepler listesinde satınalma ekibinin işine düşer; teklif toplama süreci buradan başlar. Teklif, sipariş, transfer ve stok miktarı bu dalın kapsamında değildir.
|
||||
Departmanların iç ve dış ihtiyaç duydukları malzemeleri satınalmaya iletmesi ve satınalmanın her kalemin nasıl karşılanacağına karar vermesi. Talep eden personel talebi ve satırlarını girer, onaya gönderir; talep önce talep edenin departman onaycısına, sonra satınalmaya düşer. Onaylanan talebin kalemleri **Planlama**'ya düşer: satınalmacı son alımlara, depo stoklarına ve tedarikçi fiyatlarına bakarak her kalemi (gerekirse miktarla bölerek) satın almaya (taslak teklif talebi) ya da stoktan iç transfere (taslak iç transfer) ayırır; verilen kararlar **Plan Takibi**'nde izlenir. Teklif toplama, sipariş ve mal kabul Siparişler dalında ve Envanter'dedir; transferin hazırlanıp tamamlanması Envanter › İç Transferler'dedir.
|
||||
|
||||
### 2. Analiz ve kararlar
|
||||
|
||||
|
|
@ -79,14 +79,26 @@ Departmanların iç ve dış ihtiyaç duydukları malzemeleri satınalmaya iletm
|
|||
- Belge no numaratörden: `MaterialRequest` (MT-YYYY-00001, yıllık sıfırlanır). Şirket alanı açılmadı (kiracı kapsamı).
|
||||
- Departman onaycısı: `Adm_T_Approver`'da Onay Yeri = Satınalma (`Purchase`) ve talebin departmanı. Satınalma onaycısı Onaycılar'da tanımlanmaz: Satınalma Onayı Bekleyenler ekranında karar verebilen, yani `App.Prc.MaterialRequestPurchaseApproval.Update` yetkisi doğrudan ya da rolüyle verilmiş aktif kullanıcılardır (satınalma ekibinin rolüne bu yetki verilir). Herhangi bir onaycının onayı yeterli.
|
||||
- Taslak aşaması: kayıt Taslak açılır; akış platformun Onaya Gönder işlemiyle başlar (`WorkflowDto.ApprovalIsManualStart: true` — yoksa yeni kayıt akışı kendiliğinden başlatır ve satır girilemez).
|
||||
- Görseldeki "Kendi Depomda" ve "Tüm Depolar" stok kolonları üretilmedi: uygulamada stok miktarı/hareket tablosu yok; stok modülü gelince ayrı talep.
|
||||
- Karşılama Şekli: Satınalma / Depodan Transfer.
|
||||
- **Karşılama kararı satınalmanındır** (2026-10-13). Satınalma onayı belge açmaz; onaylanan kalem Planlama'ya düşer. Talep eden karşılama şekli ve satınalma sorumlusu seçmez (2026-10-13 kararı; talep satırındaki Önerilen Karşılama ve Satınalma Sorumlusu kaldırıldı): ikisi Planlama'da belirlenir — planlamayı onaylayan kullanıcı satınalma sorumlusudur (teklif talebinin alıcısı, iç transferin sorumlusu, Plan Takibi'nde Satınalma Sorumlusu). Planla diyaloğu ürünün stoğu varsa İç Transfer, yoksa Satınalma sekmesiyle açılır. Teklif talebi, sipariş ve iç transferdeki "Talepten Aktar" / "Talep Kalemleri" sekmeleri kaldırıldı: talep kalemi bu belgelere yalnız Planlama'dan girer (tek kapı; aynı kalemin iki yoldan iki kez karşılanması önlenir).
|
||||
- Planlama Wizard List'tir (görseldeki çalışma masası düzeni Custom Component ile değil, platformun grid'i ile): satır seçilince ürünün Depo Stokları, Tedarikçiler ve Son Alımlar sekmeleri listenin altında açılır (`SubFormsListFormType: List`, ilişki `ProductId → ProductId`). Satırda Düzenle yoktur; **Planla** butonu Core diyaloğunu (`MaterialRequestPlan`, `ui/src/views/purchasing/MaterialRequestPlanDialog.tsx`) açar (kullanıcı kararı 2026-10-13: bir kalem birden çok yöntemle karşılanabilmeli, dağıtım ekranda görünmeli, onayla belgeler kendiliğinden oluşmalı). Diyalogda İç Transfer (stoğu olan konumlar) ve Satınalma (tedarikçiler) sekmeleri teslimatlardaki Stoktan Lot Seçimi gibi batch düzenlenen ListForm ızgaralarıdır: Plan Miktarı yazılan her satır taslak plana (`Prc_T_MaterialRequestPlanLine`) yazılır, taslak alttaki Karşılama Planı ızgarasında görünür; Onayla Planlama ekranının `UpdateCommand`'ını (`Prc_P_MaterialRequestPlanConfirm`) çalıştırır ve taslağı belgelere çevirir. Ekran kodları butonun `OnClick` yapılandırmasındadır, bileşene yazılmaz.
|
||||
- Kalem miktarla bölünebilir (ör. 4 transfer + 6 satınalma); kalan bitene kadar listede kalır. Onaylanmış karar ayrı bir tabloda tutulmaz: paylar belgelerin kendisinden hesaplanır (`Prc_V_MaterialRequestItemPlan`) — teklif ya da transfer iptal edilir, kalemi silinir ya da miktarı değişirse kalan kendiliğinden güncellenir.
|
||||
- Satınalma kararı tedarikçiye taslak teklif talebi üretir (doğrudan sipariş değil): teklif toplama, ihale ve kıyas mevcut akışla sürer; sipariş onaylanınca taslak alım açılır.
|
||||
- İç transferin kaynak konumunu planlamacı seçer (stoğu olan iç konumlar önce, miktarıyla listelenir); serbest stok (eldeki − açık transferlerde o konumdan istenen) planlanan miktarı karşılamalıdır. Kalanın tamamı transferle planlanan ve satınalma payı olmayan kalem **kapanır** (Satır Durumu = Tamamlandı); transfer iptal edilir ya da satırı silinirse yeniden Bekliyor olur.
|
||||
- **Stoktan karşılama** (kullanıcı kararı 2026-10-13): stok talebin kendi teslim konumundaysa İç Transfer sekmesinde o konum da "Teslim Konumu" işaretiyle listelenir; oraya yazılan Plan Miktarı transfer açmaz, karar Stoktan'dır (`PlanMethod = Stock`). Onayda miktar kalemin `FromStockQuantity` ve `DeliveredQuantity` değerine eklenir, kalandan düşer; satınalma payı olmayan ve kalanı biten kalem kapanır. Stok hareketi oluşmaz: malzemenin depodan çıkışı Envanter'de ayrıca kaydedilir, teslim konumunun serbest stoğu stoktan karşılananı ayırmaz.
|
||||
- Satınalma sekmesi kiracının bütün aktif kontaklarını listeler (kullanıcı kararı 2026-10-13): ürünün fiyat listesindekiler fiyatıyla önce, diğerleri fiyatsız sonra; fiyatsız tedarikçinin teklif kalemi 0 fiyatla açılır.
|
||||
- İki sekmede de satırın En Fazla kolonu (`MaxQuantity`) yazılabilecek üst sınırı gösterir: planlanacak kalandan kalemin diğer taslak satırları düşülür, İç Transfer'de serbest stok da sınırdır. Plan Miktarı bunu aşarsa ızgara kaydetmez (`compare` kuralı); aynı anda birden çok satır düzenlenirse toplam yine kayıt yordamında denetlenir.
|
||||
- **Hız yardımları** (kullanıcı kararı 2026-10-13: her satırla tek tek uğraşılmamalı):
|
||||
- **Öner** (diyalogun üstünde; yalnız basınca — diyalog açılışta hiçbir şey planlamaz, plan kullanıcının butonlarıyla kurulur): `Prc_P_MaterialRequestPlanSuggest` taslağı sıfırlayıp kurar — önce stok (teslim konumu, sonra serbest stoğu en çok olan konum), kalan kısım en uygun tedarikçiden satınalma. Tedarikçi `Prc_V_MaterialRequestPlanVendor.SuggestRank` sırasıyla seçilir (fiyatlılar ucuzdan pahalıya, sonra son alım tarihi, sonra ad; para birimi farkı gözetilmez) ve yalnız fiyat listesinde ya da alım geçmişinde bulunan tedarikçi önerilir; yoksa kalan planlanmadan kalır. Diyalog yordamı Karşılama Planı ekranının ekleme komutuyla çağırır (`BaseId` = kalem; Karşılama Planı + Create yetkisi).
|
||||
- **Taslağı Sıfırla** (diyalogun üstünde): kalemin bütün taslak satırlarını Karşılama Planı'nın silme komutuyla siler (Karşılama Planı + Delete yetkisi); Karşılama Planı'ndaki Sil de hemen uygulanır (hücre düzenleme). Onaydan önce plan istenildiği kadar geri alınıp yeniden kurulur. Onaydan sonra: iç transfer ya da teklif talebi kendi ekranında iptal edilince ya da satırı silinince kalem Planlama'ya döner; Stoktan karşılama Plan Takibi'ndeki **Geri Al** ile geri alınır (`Prc_P_MaterialRequestStockUndo`: stoktan karşılanan miktar teslim edilenden düşülür ve sıfırlanır, kapanmış kalem Bekliyor'a döner; Plan Takibi + Update yetkisi).
|
||||
- **Öner ve Onayla** (diyalogun üstünde, Öner'in yanında): öneriyi kurar ve taslak oluştuysa hemen Onayla'yı çalıştırır; önerilecek kaynak yoksa onay denenmez.
|
||||
- **Tümünü Planla** (İç Transfer / Satınalma satır butonu): satıra En Fazla değerini yazar. **Seçilenleri Planla** (aynı ızgaraların araç çubuğu, çoklu seçim): seçilen satırları sırayla en fazla miktarla planlar: Plan Miktarı eksi (-1) gönderilir, `Prc_P_MaterialRequestPlanLineSave` bunu kalanın diğer taslak satırlardan arta kalanı (iç transferde konumun serbest stoğuyla sınırlı) olarak yazar; alınacak bir şey kalmayan satır değişmez. Planlama listesinin kendisinde seçim tektir (kullanıcı kararı). Plan Miktarı hücresi vurguludur ve hücre düzenlemede değer hücreden çıkınca kaydedilir (Değişiklikleri Kaydet yoktur).
|
||||
- Plan Takibi ayrı menü ekranıdır (görseldeki "Takip" sekmesi): her satır bir karar, belge ve sipariş bağlantılı.
|
||||
- İş akışı kolonları tablo tasarımcısının Workflow şablonundaki dörtlüdür: `ApprovalUserName` nvarchar(256) (onaycı kullanıcı adları), `ApprovalStatus` nvarchar(50) (bulunulan düğümün başlığı), `ApprovalDate` datetime, `ApprovalDescription` nvarchar(200); dört ekranın `WorkflowDto`'su bunlara bağlıdır. Departman ve satınalma kararları ayrı kolonda tutulmaz; her karar (karar veren, açıklama, red nedeni) iş akışı notlarına yazılır.
|
||||
- Onay ve red bilgileri popup düzenleme formunda yer almaz (iş akışı yazar); listede kolon olarak görünür.
|
||||
- Red nedeni ayrı kolonda tutulmaz: onay düğümleri red sırasında Red Nedenleri listesinden (`Prc_T_RejectReason`, zorunlu) seçim ister; seçilen neden ve not `ApprovalDescription`'a ve iş akışı notuna yazılır.
|
||||
- Satır tablosu `Prc_T_MaterialRequestItem` adıyla açıldı (birim kolonu `Adm_T_Uom.Id` ile aynı tipte, nvarchar). İlk açılan `Prc_T_MaterialRequestLine` scripti (UomId uniqueidentifier) kullanılmıyor.
|
||||
- Talebin durumu iş akışından gelir: `ApprovalStatus` boş (taslak) › Departman Onayı › Satınalma Onayı › Onaylandı ya da Reddedildi. Onaylanan talep satınalmada aynı alanda ilerler: kalemi taslak teklif talebindeyse Teklif Talebi, gönderilmiş (ya da siparişe dönüşmüş) teklif talebindeyse Teklif Talebi Gönderildi, iptal olmayan bir siparişteyse Satınalma Siparişi; kalemler belgelerden çıkarılır ya da belgeler iptal edilirse Onaylandı'ya döner. Kalemler farklı aşamadaysa en ileri aşama yazılır (`Prc_P_MaterialRequestSyncStatus`). Ayrı `Status` kolonu yoktur; karşılama satır durumundan (Bekliyor / Tamamlandı / İptal) izlenir.
|
||||
- Planlama aşaması kaldırıldı (Planlama Bekleyenler listesi, satırdaki Planlandı durumu ve Planlanacak Miktar).
|
||||
- Satır tablosu `Prc_T_MaterialRequestItem` adıyla açıldı (birim kolonu `Adm_T_Uom.Id` ile aynı tipte, nvarchar). İlk açılan `Prc_T_MaterialRequestLine` scripti 2026-10-13'te ölü artefakt olarak silindi.
|
||||
- Talep satırı formu: Ürün; Miktar – Birim; Termin Tarihi – Satır Durumu; Talep Nedeni (en sonda). Termin başlığı talep ekranlarında ayrı anahtardır (`App.Listform.ListformField.RequiredDate`), ortak "Bitiş Tarihi" anahtarı başka modüllerde kullanıldığı için değiştirilmedi.
|
||||
- Talebin durumu iş akışından gelir: `ApprovalStatus` boş (taslak) › Departman Onayı › Satınalma Onayı › Onaylandı ya da Reddedildi. Onaylanan talep satınalmada aynı alanda ilerler: kalemi taslak teklif talebindeyse Teklif Talebi, gönderilmiş (ya da siparişe dönüşmüş) teklif talebindeyse Teklif Talebi Gönderildi, iptal olmayan bir siparişteyse Satınalma Siparişi; kalemler belgelerden çıkarılır ya da belgeler iptal edilirse Onaylandı'ya döner. Kalemler farklı aşamadaysa en ileri aşama yazılır (`Prc_P_MaterialRequestSyncStatus`). Transfer kararı bu alanı değiştirmez. Ayrı `Status` kolonu yoktur; karşılama satır durumundan (Bekliyor / Tamamlandı / İptal) izlenir.
|
||||
|
||||
### 3. Menü ve ekranlar
|
||||
|
||||
|
|
@ -97,58 +109,88 @@ Satınalma (`App.Prc`) › Talepler (`App.Prc.MaterialRequests`):
|
|||
| Taleplerim | `App.Prc.MyMaterialRequest` | talep eden = oturumdaki kullanıcı; ekle/sil açık, akış |
|
||||
| Departman Onayı Bekleyenler | `App.Prc.MaterialRequestDeptApproval` | ApprovalStatus = Departman Onayı; yalnız kendine düşenler |
|
||||
| Satınalma Onayı Bekleyenler | `App.Prc.MaterialRequestPurchaseApproval` | ApprovalStatus = Satınalma Onayı; yalnız kendine düşenler |
|
||||
| Planlama | `App.Prc.MaterialRequestPlan` | onaylı talebin Bekliyor ve planlanacak miktarı kalan kalemleri; satırda Planla (diyalog), Düzenle yok; alt sekmeler Depo Stokları, Tedarikçiler, Son Alımlar |
|
||||
| Plan Takibi | `App.Prc.MaterialRequestPlanTrack` | verilen kararlar (teklif kalemi / iç transfer satırı); salt okunur; satırda Teklif, Sipariş, Transfer butonları, Stoktan satırında Geri Al |
|
||||
| Tüm Talepler | `App.Prc.MaterialRequest` | filtresiz, kalem kalem; ekle/sil kapalı, yalnız kalemin sorumlusu ve durumu düzenlenir, akış yok |
|
||||
|
||||
Talep Satırları (`App.Prc.MaterialRequestLine`) menüsüz alt formdur; Taleplerim ve iki onay listesinde sekmedir (Tüm Talepler kalemleri kolon olarak gösterir). Red Nedenleri (`App.Prc.RejectReason`) Satınalma › Tanımlamalar altındadır (bkz. Tanımlamalar).
|
||||
Talep Satırları (`App.Prc.MaterialRequestLine`) menüsüz alt formdur; Taleplerim ve iki onay listesinde sekmedir (Tüm Talepler kalemleri kolon olarak gösterir). Planlama'nın sekmeleri menüsüz alt formlardır: Depo Stokları (`App.Prc.MaterialRequestPlanStock`, `Inv_T_Stock`), Tedarikçiler (`App.Prc.MaterialRequestPlanSupplier`, `Inv_T_ProductSupplier`), Son Alımlar (`App.Prc.MaterialRequestPlanLastPurchase`, `Prc_V_PurchaseReceiptLine`: Envanter'de tamamlanan alımların satırları, siparişsiz alım dahil, iade hariç; fiyat ve sipariş no yalnız siparişli alımda dolar). Planla diyaloğunun üç ekranı da menüsüzdür: İç Transfer (`App.Prc.MaterialRequestPlanSource`, `Prc_V_MaterialRequestPlanSource`), Satınalma (`App.Prc.MaterialRequestPlanVendor`, `Prc_V_MaterialRequestPlanVendor`), Karşılama Planı (`App.Prc.MaterialRequestPlanLine`, `Prc_V_MaterialRequestPlanLine`). Red Nedenleri (`App.Prc.RejectReason`) Satınalma › Tanımlamalar altındadır (bkz. Tanımlamalar).
|
||||
|
||||
### 4. Veri modeli
|
||||
|
||||
Tüm tablolar kiracı + tam audit + soft delete taşır.
|
||||
|
||||
- `Prc_T_MaterialRequest`: RequestNo, Priority (0–3), RequesterUserId, BranchId (`Sas_T_Branch`), DepartmentId, WarehouseId, LocationId, RequestDate, Description, ApprovalUserName, ApprovalStatus, ApprovalDate, ApprovalDescription (iş akışı), DeptApproverUserNames / PurchaseApproverUserNames (`|` ayrılmış kullanıcı adları).
|
||||
- `Prc_T_MaterialRequestItem`: MaterialRequestId (FK, cascade), ProductId, Quantity, UomId (nvarchar, `Adm_T_Uom`), FulfillmentMethod (Purchase / Transfer), DueDate, RequestReason, DeliveredQuantity, PurchaseResponsibleUserId, LineStatus (Waiting / Done / Cancelled).
|
||||
- `Prc_T_MaterialRequestItem`: MaterialRequestId (FK, cascade), ProductId, Quantity, UomId (nvarchar, `Adm_T_Uom`), DueDate (termin), RequestReason, DeliveredQuantity, FromStockQuantity (stoktan karşılanan), LineStatus (Waiting / Done / Cancelled).
|
||||
- `Prc_T_RejectReason`: Name, SortOrder, IsActive.
|
||||
- Görünüm `Prc_V_MaterialRequestLine`: talep başlığı LEFT JOIN silinmemiş kalemler; `Id` kalemin Id'si (kalemi olmayan talepte talebin Id'si), `MaterialRequestId` talep. Tüm Talepler'in kaynağıdır.
|
||||
- Prosedürler `Prc_P_MaterialRequestAfterSave(@Id)`, `Prc_P_MaterialRequestSyncStatus(@DocId)` (teklif/sipariş Recalc'i, durum işlemi ve belge silme sonrasında; `@DocId` boşsa onaylanmış bütün talepler).
|
||||
- Görünüm `Prc_V_MaterialRequestItemPlan`: kalem başına PurchaseQuantity (satınalma payı), TransferQuantity (transfer payı), RemainingQuantity (planlanacak), kalemin biriminde.
|
||||
- Görünüm `Prc_V_MaterialRequestPlan`: Planlama'nın kaynağı; kalem + talep başlığı + paylar + StockQuantity (bütün iç konumlar) + DueState (Late / Week / Later) + DraftQuantity (onay bekleyen taslak plan toplamı).
|
||||
- Tablo `Prc_T_MaterialRequestPlanLine` (tenant + audit): MaterialRequestItemId (FK cascade), PlanMethod, SupplierId ya da SourceLocationId, Quantity — kalemin onaylanmamış dağıtımı; onay satırları siler.
|
||||
- Görünümler `Prc_V_MaterialRequestPlanSource` (kalem × stoğu olan iç konum, teslim konumu dahil — IsDestination; OnHand, ReservedQuantity = açık transferlerde o konumdan istenen, FreeQuantity, taslak PlanQuantity; `Id` = kalem:konum — iç transfer kararının stok kuralı da budur), `Prc_V_MaterialRequestPlanVendor` (kalem × kiracının aktif kontağı; fiyat listesindeyse fiyat satırı, SortKey = fiyatlılar önce + ad, son alım tarihi, taslak PlanQuantity, tedarikçinin bu kalemi taşıyan taslak teklifi RfqId/RfqNo/RfqQuantity; `Id` = kalem:tedarikçi), `Prc_V_MaterialRequestPlanLine` (taslak satırı + kalemin birimi + satınalmada fiyat); üçü de `BaseId` = kalem.
|
||||
- Görünüm `Prc_V_PurchaseReceiptLine`: Son Alımlar'ın kaynağı; tamamlanan alımın (iade hariç) yapılan satırı × sipariş kalemi; sipariş birim fiyatı alım satırının birimine çevrilir, `UntaxedAmount` = miktar × fiyat.
|
||||
- Görünüm `Prc_V_MaterialRequestPlanTrack`: Plan Takibi'nin kaynağı; ihalenin kök teklif talebindeki talep kalemleri ∪ iç transfer satırları (iade hariç); `DocumentId`/`DocumentNo`/`DocumentStatus`, sipariş (`PurchaseOrderId`, `PurchaseOrderNo`, `OrderStatus`), `DoneQuantity`.
|
||||
- Yordamlar `Prc_P_MaterialRequestAfterSave(@Id)`, `Prc_P_MaterialRequestSyncStatus(@DocId)` (teklif/sipariş Recalc'i, durum işlemi ve belge silme sonrasında; `@DocId` boşsa onaylanmış bütün talepler), `Prc_P_MaterialRequestPlanLineSave(@Id, @PlanMethod, @PlanQuantity, @TenantId, @LastModifierId)` (diyalog ızgaralarının batch kaydı; `@Id` = kalem:hedef), `Prc_P_MaterialRequestPlanConfirm(@Id, @TenantId, @LastModifierId)` (Onayla), `Prc_P_MaterialRequestPlanSuggest(@Id, @TenantId, @LastModifierId)` (Öner), `Prc_P_MaterialRequestStockUndo(@Id, @TenantId, @LastModifierId)` (Plan Takibi'nin Geri Al'ı; stoktan karşılama yoksa ya da kalem kapatılmışsa 50202), `Prc_P_MaterialRequestPlan(@Id, @PlanMethod, @PlanQuantity, @PlanSupplierId, @PlanSourceLocationId, @TenantId, @LastModifierId)` (onayın her taslak satırı için çağırdığı karar), `Prc_P_MaterialRequestItemSync(@TransferId)` (transferin kalemlerinin satır durumu; `Inv_P_TransferRecalc` ve transfer iptali çağırır).
|
||||
|
||||
### 5. İş kuralları ve hesaplar
|
||||
|
||||
- `Prc_P_MaterialRequestAfterSave` talep kaydı/güncellemesi sonrasında çalışır ve onaycı kullanıcı listelerini (`DeptApproverUserNames`, `PurchaseApproverUserNames`) Onaycılar'dan yeniden yazar. Onaycılar sonradan değişirse talep yeniden kaydedilene kadar liste eski kalır. İki liste formda ve listede gizlidir; iş akışı onaycıyı bu alanlardan okur (`@DeptApproverUserNames`, `@PurchaseApproverUserNames`).
|
||||
- Onaya gönderilmiş talebe satır eklenemez ve satır silinemez (alt form Insert/Delete Before komutu). Onay sürecindeki ya da onaylanmış talep silinemez; reddedilen talep silinebilir.
|
||||
- Talep ve satırları yalnız Taslak'ta (`ApprovalStatus` boş) değiştirilir (2026-10-13 kararı): onaya gönderilmiş talebe satır eklenemez, satırı değiştirilemez ve silinemez (alt form Insert/Update/Delete Before komutu; 50001/50005/50002); başlığın iş alanları (öncelik, talep eden, şube, departman, depo, konum, talep tarihi, açıklama) `Prc_TR_MaterialRequestLock` tetikleyicisiyle kilitlidir (50004) — kural ekran komutunda değil tetikleyicidedir, çünkü onay akışı da başlığı aynı güncelleme yolundan yazar; onay alanları, onaycı listeleri ve silme bayrağı serbesttir. Değişiklik için talep Taslak adımına alınır, düzenlenir ve yeniden onaya gönderilir. Planlama/teslim yordamlarının yazdığı kalem alanları (teslim edilen, stoktan karşılanan, satır durumu) kilide girmez. Onay sürecindeki ya da onaylanmış talep silinemez; reddedilen talep silinebilir.
|
||||
- Ürün listesi yalnız aktif ve satın alınabilir ürünleri gösterir; birim ürünün satınalma biriminden (yoksa biriminden) kopyalanır, salt okunurdur.
|
||||
- Şube ayrı alandır ve iki zinciri süzer: Şube › Departman, Şube › Depo › Konum; şube değişince departman, depo ve konum, depo değişince konum temizlenir. Talep eden değişince şubesi ve departmanı kullanıcının departmanından gelir; yeni kayıtta şube ve departman oturumdaki kullanıcınınkidir. Açıklama HTML editörüdür, formda tam satırdır.
|
||||
- Tüm Talepler'de düzenleme `UpdateCommand` ile yalnız `Prc_T_MaterialRequestItem`'ın `PurchaseResponsibleUserId` ve `LineStatus` kolonlarını yazar; başlık alanları salt okunurdur. Kartlar kalemi değil talebi sayar (tablodan okur).
|
||||
- Tüm Talepler'de düzenleme `UpdateCommand` ile yalnız `Prc_T_MaterialRequestItem`'ın `LineStatus` kolonunu yazar; başlık alanları salt okunurdur. Kartlar kalemi değil talebi sayar (tablodan okur).
|
||||
- Onaycı listesi boşsa akış o adımda hata verir: Onaycılar'a ilgili departman için Satınalma satırı tanımlanmalı ve en az bir kullanıcıya (ya da rolüne) Satınalma Onayı Bekleyenler güncelleme yetkisi verilmelidir.
|
||||
- **Paylar** (`Prc_V_MaterialRequestItemPlan`, kalemin birimine `Inv_F_UomConvert` ile çevrilir): satınalma payı = teklif aşamasındaki (Taslak/Gönderildi) teklif talebindeki ya da iptal olmayan siparişe geçmiş teklif kalemindeki miktar; ihale kalemi bütün tedarikçilere kopyalandığı için ihale × ihale kalemi başına bir kez (en büyüğü) sayılır. Transfer payı = iptal olmayan iç transfer satırı; tamamlanan belgede yapılan, açık belgede istenen miktar (eksik tamamlamanın kalanı backorder'da istenir); iade belgesi sayılmaz. Planlanacak = talep − satınalma payı − transfer payı.
|
||||
- **Taslak** (`Prc_P_MaterialRequestPlanLineSave`, kalem kilitlenerek — batch kaydı satırları eşzamanlı gönderir): talep onaylı (ya da satınalmada ilerleyen) ve kalem Bekliyor olmalı; miktar 0 ya da boşsa satır taslaktan çıkar. Taslak toplamı planlanacak kalanı (hata 50200), iç transfer / stoktan satırı konumun serbest stoğunu aşamaz; teslim konumuna yazılan satır Stock kararıdır; satınalmada tedarikçi aktif kontak olmalıdır. Taslak satırı Karşılama Planı'ndan da silinebilir.
|
||||
- **Onayla** (`Prc_P_MaterialRequestPlanConfirm`, tek transaction): taslak boşsa reddedilir (50201); satırlar iç transfer, stoktan, satınalma sırasıyla `Prc_P_MaterialRequestPlan`'a gider, ardından taslak silinir. Bir satır reddedilirse hiçbir belge açılmaz, taslak yerinde kalır.
|
||||
- **Karar** (`Prc_P_MaterialRequestPlan`, kalem kilitlenerek): talep onaylı ve kalem Bekliyor olmalı; plan miktarı > 0 ve ≤ planlanacak.
|
||||
- Satınalma: tedarikçi zorunlu. Tedarikçinin talebin şubesi ve deposu için taslak teklif talebi varsa (en yenisi) kalem ona eklenir — kalem zaten oradaysa miktarı artar; yoksa yeni taslak teklif talebi açılır: numara `Prc.PurchaseRfq`, alım operasyon türü talebin deposunun ilk aktif alım türü, para birimi ve ödeme/teslimat koşulları kontak kartından, alıcı (satınalma sorumlusu) planlayan. Birim fiyat tedarikçinin fiyat listesinden (en düşük minimum miktar; listede yoksa 0), KDV ürünün alış oranı, teslim tarihi kalemin termini. Teklifin yeniden hesabı talebin durumunu Teklif Talebi yapar.
|
||||
- İç Transfer: kaynak konum zorunlu; konum ve serbest stok `Prc_V_MaterialRequestPlanSource`'tan okunur (iç konum, teslim konumundan farklı, ürünün stoğu var; serbest stok yetmeli).
|
||||
- Stoktan: belge açılmaz; teslim konumunun serbest stoğu yetmeli (50198). Miktar kalemin FromStockQuantity ve DeliveredQuantity değerine eklenir; satınalma payı olmayan, kalanı biten kalem Tamamlandı olur. Plan Takibi'nde belgesiz Stoktan satırı olarak görünür; satırdaki Geri Al kararı geri alır. Aynı kaynak → hedef için onaya girmemiş (Onay durumu boş ya da Onay Gerekmez) taslak iç transfer varsa satır ona eklenir ve kaynak belgeye talep no yazılır; yoksa kaynak deponun ilk aktif iç transfer türüyle yeni taslak açılır (sorumlu planlayan, kaynak belge talep no). Satırın istenen miktarı plan miktarıdır; belge `Inv_P_TransferAfterSave` ile numaralanır ve kaynak depo onaycısı yazılır — onay akışı İç Transferler'de başlatılır.
|
||||
- **Kalem kapanışı** (`Prc_P_MaterialRequestItemSync`, transferin her yeniden hesabında ve iptalinde): satınalma payı olmayan, planlanacağı kalmayan Bekliyor kalem Tamamlandı olur; Tamamlandı kalem planlanacak miktar yeniden doğarsa (transfer iptal, satır silme) ve teslim edilen miktar talebe ulaşmamışsa Bekliyor'a döner. Transferin Doğrula'sı teslim edilen miktarı kaleme yazar (Envanter).
|
||||
- **Tedarikçi fiyatı** (`Inv_P_TransferSupplierPrice`, alımın Doğrula'sında): siparişten açılan alım tamamlanınca ürünün tedarikçi fiyat listesi (`Inv_T_ProductSupplier`) siparişin birim fiyatıyla yenilenir (kullanıcı kararı 2026-10-13). Tedarikçi × ürün × birim × para birimi başına tek satır tutulur: alınan miktara uyan kademe (min. miktar ≤ alınan miktar olan en büyüğü) fiyat ve Son Alım Tarihi ile güncellenir, uyan satır yoksa yeni satır açılır (min. miktar 1 — 1'in altındaki alımda alınan miktar —, temin süresi siparişin onayından alıma geçen gün). Fiyatı sipariş verir: siparişsiz alım, iade ve fiyatı 0 olan kalem yazmaz. Planlama'nın varsayılan tedarikçisi ve teklif kalemi fiyatı bu listeden okunduğu için sonraki karar son alım fiyatıyla açılır.
|
||||
- Planlama kartları: planlanacak kalem, geciken (termin geçmiş), 7 gün içinde, taslak planlı (onay bekleyen taslağı olan kalem). Plan Takibi kartları: toplam karar, satınalma, iç transfer, tamamlanan (gerçekleşen ≥ planlanan).
|
||||
|
||||
### 6. Yetki ve görünürlük
|
||||
|
||||
Yetki ağacı: `App.Prc` › `App.Prc.MaterialRequests` › her liste (+ Create/Update/Delete/Export/Import/Note); alt form `App.Prc.MaterialRequestLine` listenin altında. Talep edenlere Taleplerim (+Create, +Update), onaycılara ilgili onay listesi (+Update), satınalma ekibine Tüm Talepler verilir; satır alt formunun yetkisi de role verilmelidir. Onay listeleri yalnız kullanıcının onayına düşen kayıtları gösterir. Kiracı kapsamlı, şube filtresi yok.
|
||||
Yetki ağacı: `App.Prc` › `App.Prc.MaterialRequests` › her liste (+ Create/Update/Delete/Export/Import; Note yalnızca tablo kaynaklı listede — view kaynaklı Taleplerim, Planlama, Plan Takibi ve diyalog ekranlarında Not yoktur); alt form `App.Prc.MaterialRequestLine` listenin altında, Planlama'nın sekmeleri ve diyalog ekranları (`App.Prc.MaterialRequestPlan{Stock,Supplier,LastPurchase,Source,Vendor,Line}`) `App.Prc.MaterialRequestPlan` altında. Talep edenlere Taleplerim (+Create, +Update), onaycılara ilgili onay listesi (+Update), satınalma ekibine Planlama (+Update — Planla butonu ve Onayla), sekmeleri, diyalog ekranları (İç Transfer ve Satınalma +Update — taslak yazma, Karşılama Planı +Delete — taslak silme), Plan Takibi ve Tüm Talepler verilir; diyalogdaki Teklif butonu Teklif Talepleri okuma yetkisini ister; Plan Takibi'nin butonları hedef ekranın okuma yetkisini ister (Teklif Talepleri, Satınalma Siparişleri, İç Transferler). Onay listeleri yalnız kullanıcının onayına düşen kayıtları gösterir. Yetkiler hiçbir role otomatik atanmaz. Kiracı kapsamlı; Taleplerim şube yetkilidir (`IsBranch`, 2026-10-14 kararı): kullanıcı yalnız atandığı şubelerin taleplerini görür ve formda yalnız onları seçer; şube seçilince kullanıcının o şubedeki varsayılan deposu ve konumu (Kullanıcılar › Yetkiler › Şube Yönetimi, `Sas_T_BranchUsers.DefaultWarehouseId/DefaultLocationId`) gelir, yeni talep departmanın şubesiyle (kullanıcı o şubeye atanmışsa) ve onun varsayılan depo/konumuyla açılır. Diğer talep listelerinde şube filtresi yok.
|
||||
|
||||
### 7. Entegrasyonlar
|
||||
|
||||
Yönetim › Tanımlamalar › Onaycılar (onay yeri Satınalma); Yönetim › Roller (Satınalma Onayı Bekleyenler yetkisi); Envanter › Tanımlamalar › Ürünler, Depolar, Konumlar; İK departmanları; Yönetim › Tanımlamalar › Diziler (`MaterialRequest`). Akış e-posta bildirimi platformun iş akışı altyapısındadır. Teklif/sipariş modülüyle entegrasyon yok.
|
||||
Yönetim › Tanımlamalar › Onaycılar (onay yeri Satınalma); Yönetim › Roller (Satınalma Onayı Bekleyenler yetkisi); Envanter › Tanımlamalar › Ürünler (tedarikçi fiyat listesi), Depolar, Konumlar, Operasyon Türleri (deponun alım ve iç transfer türü); Envanter › Stok (Depo Stokları); Envanter › Operasyonlar › İç Transferler (transfer kararı, teslim edilen miktar, kalem kapanışı); Envanter › Operasyonlar › Alımlar (Son Alımlar; tamamlanan siparişli alım tedarikçi fiyatını yazar); Satınalma › Siparişler (satınalma kararı → teklif talebi); İK departmanları; Yönetim › Tanımlamalar › Diziler (`MaterialRequest`, `Prc.PurchaseRfq`). Akış e-posta bildirimi platformun iş akışı altyapısındadır.
|
||||
|
||||
### 8. Akış örneği
|
||||
|
||||
1. Onaycılar'da BT departmanı için Satınalma yerinde Ayşe tanımlıdır; Mehmet'in rolünde Satınalma Onayı Bekleyenler güncelleme yetkisi vardır.
|
||||
2. BT'den Ali Taleplerim'de yeni talep açar (MT-2026-00001), depo/konum seçer, Talep Satırları'na 10 adet ürün, termin ve neden girer; Onaya Gönder der.
|
||||
1. Onaycılar'da BT departmanı için Satınalma yerinde Ayşe tanımlıdır; Mehmet'in rolünde Satınalma Onayı Bekleyenler, Planlama ve diyalog ekranlarının güncelleme yetkisi vardır.
|
||||
2. BT'den Ali Taleplerim'de yeni talep açar (MT-2026-00001), depo/konum (WH/Stock) seçer, Talep Satırları'na 10 adet ürün, termin ve neden girer; Onaya Gönder der.
|
||||
3. Ayşe Departman Onayı Bekleyenler'de talebi onaylar; talep Satınalma Onayı Bekleyenler'e geçer.
|
||||
4. Mehmet onaylar; talep Onaylandı olur, Ali'ye bilgi gider.
|
||||
5. Satınalma Tüm Talepler'de satıra sorumluyu atar ve satırı Tamamlandı yapar.
|
||||
4. Mehmet onaylar; talep Onaylandı olur, Ali'ye bilgi gider; kalem Planlama'da 10 planlanacak olarak görünür.
|
||||
5. Mehmet satırı seçer: Depo Stokları'nda Depo-2/Raf A'da 4 adet, Son Alımlar'da 3K Kutu'dan 200 ₺'lik son alım, Tedarikçiler'de 3K Kutu ve 5 Mutlu Gıda fiyatları görünür.
|
||||
6. Planla: diyalog İç Transfer sekmesiyle açılır (öneri Transfer); Depo-2/Raf A satırına 4 yazar, Kaydet. Satınalma sekmesinde 3K Kutu'ya 6 yazar, Kaydet. Karşılama Planı'nda iki satır görünür, listede Taslak Plan 10 olur.
|
||||
7. Onayla: Raf A → talebin konumuna taslak iç transfer açılır, 3K Kutu'nun taslak teklif talebine (yoksa yeni RFQ) 6 adet eklenir; kalem listeden çıkar, talep Teklif Talebi olur. Satınalma sekmesindeki Teklif butonu teklif talebini yeni sekmede açar.
|
||||
8. Plan Takibi'nde iki karar görünür; transfer Envanter'de onaylanıp tamamlanınca gerçekleşen 4 olur, teklif ihale/sipariş/alım akışıyla ilerler.
|
||||
|
||||
### 9. Sık sorulanlar
|
||||
|
||||
- **Talebim onay listesinde görünmüyor?** Onaycılar'da talebin departmanı için aktif Satınalma satırı olmalı; satınalma adımı için en az bir aktif kullanıcının (doğrudan ya da rolüyle) Satınalma Onayı Bekleyenler güncelleme yetkisi olmalıdır. Onaycılar ya da yetkiler talep açıldıktan sonra değiştiyse talebi bir kez kaydedin.
|
||||
- **Onaya gönderdikten sonra satır ekleyebilir miyim?** Hayır; talep reddedilirse ya da akış başa dönerse yeniden düzenlenir.
|
||||
- **Kendi Depomda / Tüm Depolar miktarları nerede?** Stok modülü geldiğinde eklenecek.
|
||||
- **Son Alımlar boş?** Sekme yalnız Doğrula ile stoğa girmiş alımları gösterir; taslak/hazır alım ve onaylanmış ama teslim alınmamış sipariş listelenmez. Siparişsiz alım listelenir ama fiyatı boştur.
|
||||
- **Tedarikçi fiyatı alımdan sonra değişmedi?** Fiyatı yalnız siparişten açılan alım yazar; elle açılan alımın fiyatı yoktur.
|
||||
- **Onaylanan kalem Planlama'da yok?** Kalem Bekliyor olmalı ve planlanacak miktarı kalmalı; tamamı teklife/transfere ayrılmış ya da Tüm Talepler'de Tamamlandı/İptal yapılmış kalem listelenmez.
|
||||
- **"Alım operasyon türü tanımlı değil" / "iç transfer operasyon türü tanımlı değil"?** Envanter › Tanımlamalar › Operasyon Türleri'nde talebin deposu için aktif Alım, kaynak konumun deposu için aktif İç Transfer türü tanımlanmalıdır.
|
||||
- **"Yeterli serbest stok yok"?** Kaynak konumdaki eldeki miktardan açık (Taslak/Bekleyen/Hazır) transferlerde o konumdan istenen miktar düşülür; başka konum seçin ya da miktarı azaltın.
|
||||
- **Onaylamadan diyaloğu kapattım?** Taslak plan kalır; Planlama'da Taslak Plan kolonunda görünür, Planla ile açıp onaylayabilir ya da Karşılama Planı'ndan silebilirsiniz.
|
||||
- **Onayla reddedildi?** Mesaj sebebi söyler (serbest stok taslak yazıldıktan sonra azalmış, kalan değişmiş ya da deponun operasyon türü yok); hiçbir belge açılmamıştır, taslağı düzeltip yeniden onaylayın.
|
||||
- **Planladığım miktarı geri almak?** Teklif talebindeki kalemi silin ya da teklifi iptal edin; transferde satırı silin ya da transferi iptal edin — miktar Planlama'ya döner, transferle kapanan kalem yeniden açılır.
|
||||
- **Red nedeni nereden seçilir?** Reddet düğmesinin açtığı karar penceresinde, Satınalma › Tanımlamalar › Red Nedenleri listesinden; neden ve not Onay Açıklaması kolonunda görünür.
|
||||
|
||||
### 10. Dosyalar ve geri alma
|
||||
|
||||
- Tablolar: `sql/object/Prc_T_MaterialRequest.sql`, `Prc_T_MaterialRequestItem.sql`, `Prc_T_RejectReason.sql` (+ postgres eşleri); kullanılmayan `Prc_T_MaterialRequestLine.sql`.
|
||||
- Görünüm: `sql/object/Prc_V_MaterialRequestLine.sql` (+ postgres).
|
||||
- Prosedür: `sql/object/Prc_P_MaterialRequestAfterSave.sql` (+ postgres).
|
||||
- Wizard'lar: `Prc_MaterialRequestLine.json`, `Prc_MyMaterialRequest.json`, `Prc_MaterialRequestDeptApproval.json`, `Prc_MaterialRequestPurchaseApproval.json`, `Prc_MaterialRequest.json`, `Prc_RejectReason.json`; güncellenen `Adm_Approver.json`.
|
||||
- Tablolar: `sql/object/Prc_T_MaterialRequest.sql`, `Prc_T_MaterialRequestItem.sql`, `Prc_T_RejectReason.sql` (+ postgres eşleri); `Prc_T_MaterialRequestPlanLine.sql`.
|
||||
- Görünümler: `Prc_V_MaterialRequestLine`, `Prc_V_MaterialRequestItemPlan`, `Prc_V_MaterialRequestPlan`, `Prc_V_MaterialRequestPlanTrack`, `Prc_V_PurchaseReceiptLine` (sql + postgres object); Envanter'de `Inv_P_TransferSupplierPrice` (Doğrula'dan).
|
||||
- Tablo: `Prc_T_MaterialRequestPlanLine`; görünümler `Prc_V_MaterialRequestPlan{Source,Vendor,Line}` (sql + postgres).
|
||||
- Yordamlar: `Prc_P_MaterialRequestAfterSave`, `Prc_P_MaterialRequestSyncStatus`, `Prc_P_MaterialRequestPlan`, `Prc_P_MaterialRequestPlanLineSave`, `Prc_P_MaterialRequestPlanConfirm`, `Prc_P_MaterialRequestItemSync` (sql + postgres); değişen `Inv_P_TransferRecalc`, `Inv_P_TransferSetStatus` (kalem eşlemesi çağrısı).
|
||||
- Wizard'lar: `Prc_MaterialRequestLine.json`, `Prc_MyMaterialRequest.json`, `Prc_MaterialRequestDeptApproval.json`, `Prc_MaterialRequestPurchaseApproval.json`, `Prc_MaterialRequestPlan.json`, `Prc_MaterialRequestPlan{Stock,Supplier,LastPurchase}.json`, `Prc_MaterialRequestPlanTrack.json`, `Prc_MaterialRequest.json`, `Prc_RejectReason.json`; güncellenen `Adm_Approver.json`.
|
||||
- Kaldırılan (2026-10-13): `Prc_PurchaseRfqImportItem.json`, `Prc_PurchaseOrderImportItem.json`, `Inventory_TransferImportItem.json` ve `Prc_V_MaterialRequestAvailableItem`, `Prc_V_PurchaseImportItem`, `Prc_P_PurchaseImportItem`, `Prc_V_MaterialRequestTransferItem`, `Inv_P_TransferImportItem`; ekranlar üst wizard'ların `Pending.ListFormCodes` kaydıyla migrate'te silinir.
|
||||
- Numaratör: `App.Definitions.Sequence` › `MaterialRequest`.
|
||||
- Geri alma: Wizard Manager'da talep bazlı silme (alt form en son değil, önce listeler); tablolar yalnız açık onayla düşürülür.
|
||||
|
||||
|
|
@ -200,17 +242,17 @@ _Henüz yazılmadı._ <!-- module-doc:todo -->
|
|||
|
||||
### 1. Amaç ve kapsam
|
||||
|
||||
Satınalma ekibinin onaylanmış malzeme taleplerinden tedarikçilere teklif talebi (RFQ) açması, aynı ihtiyacı birden fazla tedarikçiye sorarak ihale gibi fiyat toplaması, gelen fiyat ve terminleri kıyaslayıp en uygun teklifi kalem bazında satınalma siparişine dönüştürmesi; gerekirse teklif toplamadan doğrudan sipariş yazması ve tedarikçiyle çerçeve sözleşme yönetmesi. Kullanıcılar satınalma personeli ve alıcılardır. Mal kabul Envanter › Operasyonlar › Alımlar'dadır ([App.Inventory.md](App.Inventory.md)); onaylanan sipariş orada taslak alım açar ve alınan miktar sipariş kalemine geri yazılır. Tedarikçinin linkten kendi fiyatını girdiği portal, tedarikçi faturası (faturalanan, Fatura Yükle) ve analitik dağılım kapsam dışıdır.
|
||||
Satınalma ekibinin Planlama'da satınalmaya ayırdığı talep kalemleri için tedarikçilere teklif talebi (RFQ) açması, aynı ihtiyacı birden fazla tedarikçiye sorarak ihale gibi fiyat toplaması, gelen fiyat ve terminleri kıyaslayıp en uygun teklifi kalem bazında satınalma siparişine dönüştürmesi; gerekirse teklif toplamadan doğrudan sipariş yazması ve tedarikçiyle çerçeve sözleşme yönetmesi. Kullanıcılar satınalma personeli ve alıcılardır. Mal kabul Envanter › Operasyonlar › Alımlar'dadır ([App.Inventory.md](App.Inventory.md)); onaylanan sipariş orada taslak alım açar ve alınan miktar sipariş kalemine geri yazılır. Tedarikçinin linkten kendi fiyatını girdiği portal, tedarikçi faturası (faturalanan, Fatura Yükle) ve analitik dağılım kapsam dışıdır.
|
||||
|
||||
### 2. Analiz ve kararlar
|
||||
|
||||
- Teklif talebi ve satınalma siparişi **ayrı belgelerdir** (`Prc_T_PurchaseRfq`, `Prc_T_PurchaseOrder`), ayrı numaratörle: `Prc.PurchaseRfq` (RFQ00001) ve `Prc.PurchaseOrder` (P00001). Sözleşme `Prc.PurchaseAgreement` (BO00001).
|
||||
- **Tedarikçi başına bir teklif belgesi.** Aynı ihtiyaç için açılan belgeler bir ihaledir: `TenderGroupId` ihalenin kök (ilk) belgesinin Id'sidir. Alternatif tedarikçiler **Alternatif Oluştur** modalında (`App.Prc.PurchaseRfqAlternativeSupplier`: ihalede belgesi olmayan aktif kontaklar) ListForm'un çoklu seçimiyle seçilir, **Seçilenler İçin Oluştur** butonu seçili her kontak için o anki kalemleriyle birlikte kopya belge açılır (fiyat tedarikçinin fiyat listesinden, para birimi ve koşullar kontak kartından). Bir tedarikçi ihalede bir kez bulunur.
|
||||
- Bir teklif birden fazla malzeme talebinden oluşabilir: belgenin **Talep Kalemleri** sekmesi aktarılabilir bütün talep kalemlerini talebe göre gruplu listeler; satırlar ListForm'un çoklu seçimiyle (`Selection.Mode = multiple`, satır başı kutusu) seçilir ve sekmenin araç çubuğundaki **Seçilenleri Aktar** butonu (Commands, `OnClick`) seçili her satır için `list-form-data/update` çağırır; ekranın `UpdateCommand`'ı (`Prc_P_PurchaseImportItem @Id`) kalemi kopyalar. Ekran bir modalda açıksa (Talepten Aktar, Alternatif Oluştur) buton işi bitince modalı kapatır ve ana liste yenilenir; sekmede açıksa yalnız listeyi yeniler. Hata olursa modal açık kalır. Ayrı bir işaret kolonu yoktur. Aynı sekme teklifsiz yazılan taslak siparişte de vardır. Talep ilişkisi kalem düzeyindedir (`MaterialRequestItemId`).
|
||||
- Popup (Yeni/Düzenle) formu yalnız belgenin kendi alanlarını taşır; talep aktarımı, alternatif, fiyat girişi ve durum işlemleri liste araç çubuğundaki butonlardadır (sekmelerden de yapılabilir). Vergi hariç / KDV / toplam kalemlerden hesaplandığı için formda değil listede görünür.
|
||||
- Talep kalemleri teklif talebine yalnız **Satınalma › Talepler › Planlama**'dan gelir (Satınalma kararı; bkz. Talepler): kalem tedarikçinin aynı şube ve depodaki taslak teklif talebine eklenir, yoksa yeni taslak açılır. Bir teklif birden fazla malzeme talebinden oluşabilir. Teklif ve siparişteki eski Talep Kalemleri sekmesi ve Talepten Aktar butonu 2026-10-13'te kaldırıldı (karşılama kararı satınalmanındır, kalem iki yoldan iki kez karşılanmasın). Talep ilişkisi kalem düzeyindedir (`MaterialRequestItemId`); teklif kalemi silinir ya da teklif iptal edilirse miktar Planlama'ya döner.
|
||||
- Popup (Yeni/Düzenle) formu yalnız belgenin kendi alanlarını taşır; alternatif, fiyat girişi ve durum işlemleri liste araç çubuğundaki butonlardadır (sekmelerden de yapılabilir). Vergi hariç / KDV / toplam kalemlerden hesaplandığı için formda değil listede görünür.
|
||||
- Hızlı fiyat girişi: **Fiyat Karşılaştırması** sekmesi toplu düzenleme modundadır; ihalenin bütün tedarikçilerinin birim fiyat, teslim tarihi ve Seçili değerleri tek tabloda satır içinde yazılıp birlikte kaydedilir. Aynı ekran liste araç çubuğundaki ayrı **Fiyat Girişi** butonuyla modalda da açılır. Satır kaydı `Prc_P_PurchaseRfqComparisonSave`'dir: batch kaydı satırları eşzamanlı istekle gönderdiği için yordam önce ihalenin kök teklifini kilitler (`UPDLOCK`/`FOR UPDATE`, `TenderGroupId`), sonra satırı günceller ve teklifi yeniden hesaplar; grid ihaledeki bütün tedarikçi tekliflerinin satırlarını taşıdığı için kilit ihale düzeyindedir ve satırlar sırayla işlenir. `IX_Prc_T_PurchaseRfqLine_PurchaseRfqId` yeniden hesabın tablo taraması yapıp başka tekliflerin satırlarını kilitlemesini önler.
|
||||
- Fiyat Girişi'nde birim fiyatı 0'dan büyük kaydedilen teklif, yanıtı `Waiting` ise kendiliğinden `Quoted` olur; boşsa Teklif Tarihi kayıt anı, Teklif Geçerliliği sipariş son tarihi (`OrderDeadline`) yazılır (`Prc_P_PurchaseRfqComparisonSave`). Elle girilmiş tarih ve `NotQuoted` yanıtı değişmez.
|
||||
- Araç çubuğu butonları ListForm'un Commands (özel buton) kaydıyla, `OnClick` modunda yazılır; çekirdek değişmez. Talepten Aktar, Alternatif Oluştur ve Fiyat Girişi seçili satırla aynı `PurchaseDocGrid` diyaloğunu (`ui/src/views/purchasing/PurchaseDocGridDialog.tsx`) açar; buton `listFormCode`, başlık (`title`) ve açıklama (`info`) dil anahtarını verir. Diyalog belgeye (`BaseId`) süzülmüş tek ekranı (`App.Prc.*ImportItem`, `App.Prc.PurchaseRfqAlternativeSupplier`, `App.Prc.PurchaseRfqComparison`) platformun Grid bileşeniyle gösterir; ayrı bir uç yoktur.
|
||||
- Araç çubuğu butonları ListForm'un Commands (özel buton) kaydıyla, `OnClick` modunda yazılır; çekirdek değişmez. Alternatif Oluştur ve Fiyat Girişi seçili satırla aynı `PurchaseDocGrid` diyaloğunu (`ui/src/views/purchasing/PurchaseDocGridDialog.tsx`) açar; buton `listFormCode`, başlık (`title`) ve açıklama (`info`) dil anahtarını verir. Diyalog belgeye (`BaseId`) süzülmüş tek ekranı (`App.Prc.PurchaseRfqAlternativeSupplier`, `App.Prc.PurchaseRfqComparison`) platformun Grid bileşeniyle gösterir; ayrı bir uç yoktur.
|
||||
- Teklif durumları: Taslak (Teklif Talebi) › Teklif Talebi Gönderildi (tedarikçiye e-posta kuyruğa alındı) › Satınalma Siparişi (dönüştürüldü) / İptal Edildi. Sipariş durumları: Taslak › Onaylandı / İptal; tekliften dönüşen sipariş onaylı açılır.
|
||||
- **Kıyas (Fiyat Karşılaştırması):** fiyat `Sas_H_Currency.Rate` ile TL'ye çevrilir (kur = 1 birimin TL karşılığı). Puan = Fiyat ağırlığı × (en düşük TL fiyat / TL fiyat) + Termin ağırlığı × (en kısa termin günü / termin günü); termin günü = teslim tarihi − ihalenin açılış günü (en az 1). Ağırlıklar ihale genelinde tektir, varsayılan %70 fiyat / %30 termin, toplamı 100 olmalıdır. En yüksek puan **Önerilen**'dir. Fiyatı 0, terminsiz, "Teklif Verilmedi" ya da iptal edilmiş belgenin satırı puanlanmaz. Kalemin teslim tarihi boşsa belgenin Beklenen Geliş'i kullanılır.
|
||||
- **Siparişe Dönüştür kalem bazındadır** (ihale genelinde, ihaledeki herhangi bir belgeden): kalemin **Seçili** satırı varsa o, yoksa Önerilen satır kazanır. Kazanan her teklif belgesi için ayrı satınalma siparişi açılır ve sipariş teklifin şubesini, operasyon türünü ve deposunu taşır; en az bir kalem kazanan teklif Satınalma Siparişi, hiç kazanamayan teklif İptal Edildi olur.
|
||||
|
|
@ -228,27 +270,27 @@ Satınalma (`App.Prc`) › Siparişler (`App.Prc.Orders`):
|
|||
|
||||
| Ekran | Kod | Not |
|
||||
| --- | --- | --- |
|
||||
| Teklif Talepleri | `App.Prc.PurchaseRfq` | tüm durumlar; sekmeler Ürünler, Talep Kalemleri, Tedarikçi Teklifi, Diğer Bilgiler, Teklifler (Ekle = alternatif), Fiyat Karşılaştırması (toplu düzenleme) |
|
||||
| Satınalma Siparişleri | `App.Prc.PurchaseOrder` | tüm durumlar; ekle/sil (yalnız teklifsiz taslak); sekmeler Ürünler, Talep Kalemleri, Diğer Bilgiler, Teklifler |
|
||||
| Teklif Talepleri | `App.Prc.PurchaseRfq` | tüm durumlar; sekmeler Ürünler, Tedarikçi Teklifi, Diğer Bilgiler, Teklifler (Ekle = alternatif), Fiyat Karşılaştırması (toplu düzenleme) |
|
||||
| Satınalma Siparişleri | `App.Prc.PurchaseOrder` | tüm durumlar; ekle/sil (yalnız teklifsiz taslak); sekmeler Ürünler, Diğer Bilgiler, Teklifler |
|
||||
| Sipariş Ürünleri | `App.Prc.PurchaseOrderProduct` | sipariş × kalem, her satır bir kalem; tüm durumlar, kalemsiz sipariş yok; salt okunur; satırdaki Siparişi Aç siparişin detay sayfasını açar (`/admin/form/App.Prc.PurchaseOrder/@PurchaseOrderId`) |
|
||||
|
||||
Menüsüz alt formlar: teklif tarafında `App.Prc.PurchaseRfqLine`, `App.Prc.PurchaseRfqImportItem`, `App.Prc.PurchaseRfqQuote`, `App.Prc.PurchaseRfqOther`, `App.Prc.PurchaseRfqAlternative`, `App.Prc.PurchaseRfqAlternativeSupplier` (yalnız Alternatif Oluştur modalında), `App.Prc.PurchaseRfqComparison`; sipariş tarafında `App.Prc.PurchaseOrderLine`, `App.Prc.PurchaseOrderImportItem`, `App.Prc.PurchaseOrderOther`, `App.Prc.PurchaseOrderAlternative`; sözleşmede `App.Prc.PurchaseAgreementLine`.
|
||||
Menüsüz alt formlar: teklif tarafında `App.Prc.PurchaseRfqLine`, `App.Prc.PurchaseRfqQuote`, `App.Prc.PurchaseRfqOther`, `App.Prc.PurchaseRfqAlternative`, `App.Prc.PurchaseRfqAlternativeSupplier` (yalnız Alternatif Oluştur modalında), `App.Prc.PurchaseRfqComparison`; sipariş tarafında `App.Prc.PurchaseOrderLine`, `App.Prc.PurchaseOrderOther`, `App.Prc.PurchaseOrderAlternative`; sözleşmede `App.Prc.PurchaseAgreementLine`.
|
||||
|
||||
### 4. Veri modeli
|
||||
|
||||
Tüm tablolar kiracı + tam audit + soft delete.
|
||||
|
||||
- `Prc_T_PurchaseRfq`: RfqNo, TenderGroupId, SupplierId, SupplierReference, AgreementId, BranchId, OperationTypeId, WarehouseId (üçü de zorunlu; Şube › Depo › Operasyon Türü zinciriyle süzülür; alternatife ve siparişe kopyalanır), CurrencyId, OrderDeadline, ExpectedArrival, SupplierResponse (Waiting/Quoted/NotQuoted), QuoteDate, QuoteValidUntil, BuyerUserId, SourceDocument, ProjectId, IncotermId, IncotermLocation, PaymentTermId, Terms, PriceWeight (70), DeliveryWeight (30), UntaxedAmount, TaxAmount, TotalAmount, Status (Draft/Sent/Purchase/Cancelled), PendingAction, LastSentDate.
|
||||
- `Prc_T_PurchaseRfqLine`: PurchaseRfqId (FK cascade), TenderLineId (alternatiflerde aynı kalemi eşler), ProductId, Description, Quantity, UomId, UnitPrice, TaxRate, Amount, DeliveryDate (tedarikçinin termini; aktarımda talebin istenen termini), MaterialRequestItemId, IsSelected.
|
||||
- `Prc_T_PurchaseRfqLine`: PurchaseRfqId (FK cascade), TenderLineId (alternatiflerde aynı kalemi eşler), ProductId, Description, Quantity, UomId, UnitPrice, TaxRate, Amount, DeliveryDate (tedarikçinin termini; Planlama'dan gelen kalemde talebin istenen termini), MaterialRequestItemId, IsSelected.
|
||||
- `Prc_T_PurchaseOrder`: OrderNo, PurchaseRfqId (kaynak teklif), SupplierId, SupplierReference, AgreementId, BranchId, OperationTypeId (Inv_T_OperationType), WarehouseId (teslim alınacak depo, Inv_T_Warehouse; üçü de zorunlu; Şube › Depo › Operasyon Türü zinciriyle süzülür), CurrencyId, ExpectedArrival, ConfirmDate, ArrivalDate, BuyerUserId, SourceDocument, ProjectId, IncotermId, IncotermLocation, PaymentTermId, Terms, tutarlar, Status (Draft/Purchase/Cancelled), PendingAction, LastSentDate.
|
||||
- `Prc_T_PurchaseOrderLine`: PurchaseOrderId (FK cascade), ProductId, Description, Quantity, UomId, UnitPrice, TaxRate, Amount, DeliveryDate, MaterialRequestItemId, PurchaseRfqLineId, ReceivedQuantity (alınan; alımın Doğrula'sı yazar, alım iadesi düşer).
|
||||
- Görünümler: `Prc_V_MaterialRequestAvailableItem` (aktarılabilir talep kalemleri), `Prc_V_PurchaseImportItem` (Talep Kalemleri sekmesi: kalem alabilen açık belge × aynı şubedeki aktarılabilir kalem, `Id` = belge|kalem), `Prc_V_PurchaseRfqComparison` (kıyas ve puan), `Prc_V_PurchaseRfqAlternative` (ihalenin belgeleri; teklif ve sipariş için `BaseId`), `Prc_V_PurchaseRfqAlternativeSupplier` (açık teklif × ihalede belgesi olmayan aktif kontak, `Id` = teklif|kontak), `Prc_V_PurchaseAgreementLine` (sözleşmenin sipariş edilen miktarı), `Prc_V_PurchaseOrderLine` (Sipariş Ürünleri: silinmemiş sipariş × silinmemiş kalem, `Id` kalemin Id'si; vergi hariç ve KDV kalemin KDV dahil tutarından ayrıştırılır, Talep No kalemin malzeme talebinden).
|
||||
- Yordamlar: `Prc_P_PurchaseRfq{AfterSave,Recalc,ComparisonSave,CreateAlternative,FromAgreement,Send,SetStatus,Award}`, `Prc_P_PurchaseOrder{AfterSave,Recalc,Send,SetStatus}`, `Prc_P_PurchaseImportItem` (teklif ve sipariş için ortak, kalem bazlı aktarım), `Adm_P_SequenceNext`.
|
||||
- Görünümler: `Prc_V_PurchaseRfqComparison` (kıyas ve puan), `Prc_V_PurchaseRfqAlternative` (ihalenin belgeleri; teklif ve sipariş için `BaseId`), `Prc_V_PurchaseRfqAlternativeSupplier` (açık teklif × ihalede belgesi olmayan aktif kontak, `Id` = teklif|kontak), `Prc_V_PurchaseAgreementLine` (sözleşmenin sipariş edilen miktarı), `Prc_V_PurchaseOrderLine` (Sipariş Ürünleri: silinmemiş sipariş × silinmemiş kalem, `Id` kalemin Id'si; vergi hariç ve KDV kalemin KDV dahil tutarından ayrıştırılır, Talep No kalemin malzeme talebinden).
|
||||
- Yordamlar: `Prc_P_PurchaseRfq{AfterSave,Recalc,ComparisonSave,CreateAlternative,FromAgreement,Send,SetStatus,Award}`, `Prc_P_PurchaseOrder{AfterSave,Recalc,Send,SetStatus}`, `Adm_P_SequenceNext`; talep kalemini teklife ekleyen `Prc_P_MaterialRequestPlan` (Talepler).
|
||||
|
||||
### 5. İş kuralları ve hesaplar
|
||||
|
||||
- Teklif kaydı ve Tedarikçi Teklifi / Diğer Bilgiler sekmesindeki kayıt sonrası `Prc_P_PurchaseRfqAfterSave`: ağırlık toplamı 100 kontrolü; boş ödeme/teslimat koşulu ve Incoterm konumu tedarikçinin Satınalma sekmesinden (alıcı yalnız ilk kayıtta); yanıt Bekleniyor dışına alınınca boş teklif tarihi; ağırlıkların ihalenin diğer belgelerine yazılması; sözleşme kalemleri (yalnız kalemsiz belgede); tutarlar; buton işlemi (`PendingAction`).
|
||||
- Aktarım (`Prc_P_PurchaseImportItem`, seçilen her satır için): belge teklif aşamasında (teklif) ya da taslak (sipariş); talep Onaylandı; kalem Karşılama = Satınalma, Durum = Bekliyor; iptal olmayan bir teklifte ya da siparişte yer almıyor. Fiyat: sözleşme kalemi › tedarikçi fiyatı (`Inv_T_ProductSupplier`) › 0. Kalem bu arada başka belgeye geçmişse hata.
|
||||
- Planlama'dan gelen kalem (`Prc_P_MaterialRequestPlan`): fiyat tedarikçinin fiyat listesinden (`Inv_T_ProductSupplier`, en düşük minimum miktar) › 0, KDV ürünün alış oranı, teslim tarihi talebin termini; aynı kalem aynı taslakta varsa miktarı artar.
|
||||
- Alternatif (`Prc_P_PurchaseRfqCreateAlternative @Key, @UserId`, `@Key` = teklif|kontak, seçilen her satır için): belge teklif aşamasında olmalı; tedarikçinin ihalede iptal olmayan belgesi varsa hata.
|
||||
- Kalem Tutarı KDV dahildir: Tutar = yuvarla(yuvarla(Miktar × Birim Fiyat) × (1 + Oran/100)); Vergi Hariç = Σ yuvarla(Miktar × Birim Fiyat); KDV = Σ(Tutar − kalemin vergi hariç tutarı); Toplam = Vergi Hariç + KDV = Σ Tutar. Formdaki script ve `Prc_P_Purchase{Rfq,Order}Recalc` aynı formülü kullanır; kalem her eklenip/değişip/silindiğinde yeniden hesaplanır.
|
||||
- Teklif işlemleri: E-posta ile Gönder (taslak ya da gönderilmiş; kalem ve tedarikçi e-postası şart; Taslak → Gönderildi) · İhaleyi Gönder (ihalenin bütün taslak belgeleri) · Siparişe Dönüştür (taslak ya da gönderilmiş; ihale daha önce dönüştürülmemiş olmalı) · İptal (siparişe dönüşmüş teklif iptal edilemez) · Taslak olarak ayarla (yalnız iptalden; ihale siparişe dönüşmüşse olmaz).
|
||||
|
|
@ -260,16 +302,16 @@ Tüm tablolar kiracı + tam audit + soft delete.
|
|||
|
||||
### 6. Yetki ve görünürlük
|
||||
|
||||
Yetki ağacı: `App.Prc` › `App.Prc.Orders` › teklif ve sipariş listeleri, `App.Prc` › `App.Prc.PurchaseAgreement` (+ Create/Update/Delete/Export/Import/Note). Her alt formun yetkisi kendi listesinin altındadır: teklif sekmeleri `App.Prc.PurchaseRfq`, sipariş sekmeleri `App.Prc.PurchaseOrder` altında; sekmeler ekranlar arasında paylaşılmaz. Teklif kullanıcısına Fiyat Karşılaştırması'nın Update yetkisi de verilmelidir (fiyat ve seçim buradan girilir). Yetkiler hiçbir role otomatik atanmaz. Kiracı kapsamlı, şube filtresi yok.
|
||||
Yetki ağacı: `App.Prc` › `App.Prc.Orders` › teklif ve sipariş listeleri, `App.Prc` › `App.Prc.PurchaseAgreement` (+ Create/Update/Delete/Export/Import/Note). Her alt formun yetkisi kendi listesinin altındadır: teklif sekmeleri `App.Prc.PurchaseRfq`, sipariş sekmeleri `App.Prc.PurchaseOrder` altında; sekmeler ekranlar arasında paylaşılmaz. Teklif kullanıcısına Fiyat Karşılaştırması'nın Update yetkisi de verilmelidir (fiyat ve seçim buradan girilir). Yetkiler hiçbir role otomatik atanmaz. Kiracı kapsamlı; Teklif Talepleri ve Satınalma Siparişleri şube yetkilidir (`IsBranch`, 2026-10-14 kararı): kullanıcı yalnız atandığı şubelerin belgelerini görür, formda yalnız onları seçer ve şube seçilince kullanıcının o şubedeki varsayılan deposu gelir (yeni belge departmanın şubesi ve deposuyla açılır). Bir kullanıcı hiçbir şubeye atanmamışsa bu iki listede satır görmez.
|
||||
|
||||
### 7. Entegrasyonlar
|
||||
|
||||
Yönetim › Tanımlamalar › Kontaklar (tedarikçi, e-posta, Satınalma sekmesi varsayılanları); Envanter (Ürünler, tedarikçi fiyatları, Operasyon Türleri; Operasyonlar › Alımlar — sipariş onayında taslak alım, alınan miktar); Satınalma › Tanımlamalar (Ödeme Koşulları, Teslimat Koşulları); Proje modülü; Talepler (aktarım); Para Birimleri (kur); Bildirimler: tipler `TeklifTalebiGonderildi`, `SatinalmaSiparisiGonderildi`, her birinin Custom/Mail kuralı (kural kapatılırsa e-posta kuyruğa girmez; NotificationWorker gönderir); Diziler (`Prc.PurchaseRfq`, `Prc.PurchaseOrder`, `Prc.PurchaseAgreement`).
|
||||
Yönetim › Tanımlamalar › Kontaklar (tedarikçi, e-posta, Satınalma sekmesi varsayılanları); Envanter (Ürünler, tedarikçi fiyatları, Operasyon Türleri; Operasyonlar › Alımlar — sipariş onayında taslak alım, alınan miktar); Satınalma › Tanımlamalar (Ödeme Koşulları, Teslimat Koşulları); Proje modülü; Talepler (Planlama › Satınalma kararı); Para Birimleri (kur); Bildirimler: tipler `TeklifTalebiGonderildi`, `SatinalmaSiparisiGonderildi`, her birinin Custom/Mail kuralı (kural kapatılırsa e-posta kuyruğa girmez; NotificationWorker gönderir); Diziler (`Prc.PurchaseRfq`, `Prc.PurchaseOrder`, `Prc.PurchaseAgreement`).
|
||||
|
||||
### 8. Akış örneği
|
||||
|
||||
1. Ali'nin MT-2026-00015 ve Ayşe'nin MT-2026-00016 talepleri onaylanır.
|
||||
2. Satınalma Teklif Talepleri'nde yeni kayıt açar (tedarikçi "3K Kutu"), kaydeder; detayda Talep Kalemleri sekmesinde iki talebin kalemlerini işaretleyip Kaydet der. Teklifler sekmesinde Ekle ile "5 Mutlu Gıda" ve "Kartela"yı ekler. RFQ00001 (3K) kalemleriyle, RFQ00002 ve RFQ00003 kopya olarak aynı ihalede açılır; Kaynak = MT-2026-00015, MT-2026-00016.
|
||||
2. Satınalma Planlama'da iki talebin kalemlerini Satınalma kararıyla tedarikçi "3K Kutu"ya ayırır; ilk karar 3K Kutu için taslak teklif talebi açar, ikincisi aynı taslağa eklenir. Teklif Talepleri'nde belgenin Teklifler sekmesinde Ekle ile "5 Mutlu Gıda" ve "Kartela"yı ekler. RFQ00001 (3K) kalemleriyle, RFQ00002 ve RFQ00003 kopya olarak aynı ihalede açılır; Kaynak = MT-2026-00015, MT-2026-00016.
|
||||
3. Araç çubuğunda İhaleyi Gönder: üç tedarikçiye fiyatsız teklif e-postası kuyruğa alınır, belgeler Gönderildi olur.
|
||||
4. Tedarikçilerin dönüşleri Fiyat Karşılaştırması sekmesinde tek tabloda birim fiyat ve teslim tarihi olarak yazılıp bir kez kaydedilir; her ürün için en yüksek puanlı satır Önerilen işaretlenir. Kullanıcı bir üründe daha pahalı ama güvendiği tedarikçiyi Seçili yapar.
|
||||
5. Siparişe Dönüştür butonu: kazanan iki tedarikçiye P00007 ve P00008 açılır (Kaynak RFQ00001 / RFQ00003), RFQ00002 İptal Edildi olur.
|
||||
|
|
@ -277,9 +319,9 @@ Yönetim › Tanımlamalar › Kontaklar (tedarikçi, e-posta, Satınalma sekmes
|
|||
|
||||
### 9. Sık sorulanlar
|
||||
|
||||
- **Butonlar nerede?** Listede bir belge seçilir; işlemler araç çubuğundadır (detay sayfasının araç çubuğunda da görünür). Buton yetkisi: durum işlemleri ekranın Update, Talepten Aktar ilgili Talep Kalemleri ekranının Update, Alternatif Oluştur Teklifler ekranının Create yetkisi.
|
||||
- **Talep Kalemleri sekmesi boş?** Talep onaylanmış olmalı ve aktarılabilir (Satınalma, Bekliyor, başka açık teklifte ya da siparişte olmayan) kalemi bulunmalı; belge Teklif Talebi / Gönderildi (sipariş için Taslak) durumunda olmalı; belge yalnız kendi şubesindeki taleplerin kalemlerini görür.
|
||||
- **Talepten Aktar / Alternatif Oluştur / Fiyat Girişi modalı nasıl kullanılır?** Talepten Aktar'da aktarılacak satırlar satır başındaki kutuyla seçilir (başlıktaki kutu sayfadakilerin tümünü seçer) ve araç çubuğundaki Seçilenleri Aktar'a basılır. Alternatif Oluştur'da ihaleye eklenecek tedarikçiler satır başındaki kutuyla seçilip Seçilenler İçin Oluştur'a basılır (iki modal da iş bitince kendiliğinden kapanır). Fiyat Girişi ayrı butondur: bütün tedarikçilerin fiyat ve terminleri yazılıp tablonun Kaydet'ine basılır, modal Kapat ile kapanır.
|
||||
- **Butonlar nerede?** Listede bir belge seçilir; işlemler araç çubuğundadır (detay sayfasının araç çubuğunda da görünür). Buton yetkisi: durum işlemleri ekranın Update, Alternatif Oluştur Teklifler ekranının Create yetkisi.
|
||||
- **Talep kalemini teklife nasıl eklerim?** Satınalma › Talepler › Planlama'da satırdaki Planla ile Satınalma sekmesinde tedarikçiye miktar yazıp Onayla'ya basın; kalem tedarikçinin taslak teklif talebine eklenir.
|
||||
- **Alternatif Oluştur / Fiyat Girişi modalı nasıl kullanılır?** Alternatif Oluştur'da ihaleye eklenecek tedarikçiler satır başındaki kutuyla seçilip Seçilenler İçin Oluştur'a basılır (modal iş bitince kendiliğinden kapanır). Fiyat Girişi ayrı butondur: bütün tedarikçilerin fiyat ve terminleri yazılıp tablonun Kaydet'ine basılır, modal Kapat ile kapanır.
|
||||
- **Alternatif ekledim, kalemleri eksik?** Alternatif, açıldığı andaki kalemleri kopyalar; sonradan eklenen kalem yalnız eklendiği belgededir.
|
||||
- **Önerilen neden boş?** Satırın fiyatı ve teslim tarihi (ya da belgenin Beklenen Geliş'i) girilmiş olmalı; Teklif Verilmedi yanıtlı ya da iptal edilmiş belge kıyasa girmez.
|
||||
- **E-posta gitmedi?** Tedarikçinin kontak e-postasını, Bildirim Kuralları'nda ilgili tipin Mail kuralını ve Bildirimler ekranındaki satırı (IsSent) kontrol edin; NotificationWorker aktif olmalı.
|
||||
|
|
@ -288,8 +330,8 @@ Yönetim › Tanımlamalar › Kontaklar (tedarikçi, e-posta, Satınalma sekmes
|
|||
### 10. Dosyalar ve geri alma
|
||||
|
||||
- Tablolar: `sql/object/Prc_T_PurchaseRfq.sql`, `Prc_T_PurchaseRfqLine.sql`, `Prc_T_PurchaseOrder.sql`, `Prc_T_PurchaseOrderLine.sql`, `Prc_T_PurchaseAgreement.sql`, `Prc_T_PurchaseAgreementLine.sql` (+ postgres).
|
||||
- Görünüm/yordam: `Prc_V_MaterialRequestAvailableItem`, `Prc_V_PurchaseImportItem`, `Prc_V_PurchaseRfqComparison`, `Prc_V_PurchaseRfqAlternative`, `Prc_V_PurchaseRfqAlternativeSupplier`, `Prc_V_PurchaseAgreementLine`, `Prc_V_PurchaseOrderLine`, `Prc_P_PurchaseRfq*`, `Prc_P_PurchaseOrder*`, `Prc_P_PurchaseImportItem`, `Adm_P_SequenceNext` (sql + postgres object).
|
||||
- Wizard'lar: `Prc_PurchaseRfq{,Line,ImportItem,Quote,Other,Alternative,Comparison}.json`, `Prc_PurchaseOrder{,Line,ImportItem,Other,Alternative,Product}.json`, `Prc_PurchaseAgreement{,Line}.json`.
|
||||
- Görünüm/yordam: `Prc_V_PurchaseRfqComparison`, `Prc_V_PurchaseRfqAlternative`, `Prc_V_PurchaseRfqAlternativeSupplier`, `Prc_V_PurchaseAgreementLine`, `Prc_V_PurchaseOrderLine`, `Prc_P_PurchaseRfq*`, `Prc_P_PurchaseOrder*`, `Adm_P_SequenceNext` (sql + postgres object).
|
||||
- Wizard'lar: `Prc_PurchaseRfq{,Line,Quote,Other,Alternative,AlternativeSupplier,Comparison}.json`, `Prc_PurchaseOrder{,Line,Other,Alternative,Product}.json`, `Prc_PurchaseAgreement{,Line}.json`.
|
||||
- Arayüz: `ui/src/views/purchasing/PurchaseDocGridDialog.tsx` (kayıt: `DialogShowComponent`, ad `PurchaseDocGrid`).
|
||||
- Veri: Diziler `Prc.PurchaseRfq`, `Prc.PurchaseOrder`, `Prc.PurchaseAgreement`; Bildirim Türleri ve Kuralları `TeklifTalebiGonderildi`, `SatinalmaSiparisiGonderildi`.
|
||||
- Geri alma: önce ana ekranlar (`Prc_PurchaseRfq`, `Prc_PurchaseOrder`, `Prc_PurchaseAgreement`), sonra alt formlar `delete_wizard` ile silinir; tablolar yalnız açık onayla düşürülür.
|
||||
|
|
@ -436,7 +478,7 @@ Yönetim › Tanımlamalar › Kontaklar (tedarikçi, e-posta, Satınalma sekmes
|
|||
| Alt formlar | `App.Prc.MaterialRequestLine` (Id → MaterialRequestId) |
|
||||
| Widget'lar | `App.Prc.MaterialRequest.Widget.Mine`, `App.Prc.MaterialRequest.Widget.Pending`, `App.Prc.MaterialRequest.Widget.Approved`, `App.Prc.MaterialRequest.Widget.Rejected` |
|
||||
| Komutlar | InsertAfter: `Prc_P_MaterialRequestAfterSave` · UpdateAfter: `Prc_P_MaterialRequestAfterSave` · DeleteBefore: SQL |
|
||||
| Form varsayılanları | RequestNo=Prc.MaterialRequest, RequesterUserId=@USERID, BranchId=, DepartmentId=, RequestDate=@NOW, Priority=0 |
|
||||
| Form varsayılanları | RequestNo=Prc.MaterialRequest, RequesterUserId=@USERID, DepartmentId=, RequestDate=@NOW, Priority=0, Priority=5, BranchId=, WarehouseId=, LocationId= |
|
||||
| Onay akışı | Start 'Onaya Gönderildi' → Approval 'Departman Onayı' → Approval 'Satınalma Onayı' → End 'Onaylandı' → End 'Reddedildi' |
|
||||
|
||||
| Alan | Başlık | Editör | Zorunlu | Formda | Kaynak |
|
||||
|
|
@ -444,7 +486,7 @@ Yönetim › Tanımlamalar › Kontaklar (tedarikçi, e-posta, Satınalma sekmes
|
|||
| `RequestNo` | Talep No | dxTextBox | | ✓ | |
|
||||
| `Priority` | Öncelik (0-3) | dxRating | ✓ | ✓ | |
|
||||
| `RequesterUserId` | Talep Eden | dxSelectBox | ✓ | ✓ | sorgu: AbpUsers · script |
|
||||
| `BranchId` | Şube Adı | dxSelectBox | ✓ | ✓ | sorgu: Sas_T_Branch |
|
||||
| `BranchId` | Şube Adı | dxSelectBox | ✓ | ✓ | sorgu: Sas_T_Branch · script |
|
||||
| `DepartmentId` | Departman | dxSelectBox | ✓ | ✓ | sorgu: Hr_T_Department (← BranchId) |
|
||||
| `WarehouseId` | Depo | dxSelectBox | ✓ | ✓ | sorgu: Inv_T_Warehouse (← BranchId) |
|
||||
| `LocationId` | Konum | dxSelectBox | ✓ | ✓ | sorgu: Inv_T_Location (← WarehouseId) |
|
||||
|
|
@ -533,14 +575,95 @@ Yönetim › Tanımlamalar › Kontaklar (tedarikçi, e-posta, Satınalma sekmes
|
|||
| `ApprovalDate` | Onay Tarihi | dxDateBox | | | |
|
||||
| `ApprovalDescription` | Onay Açıklaması | dxTextBox | | | |
|
||||
|
||||
#### Planlama — `App.Prc.MaterialRequestPlan`
|
||||
|
||||
| Özellik | Değer |
|
||||
| --- | --- |
|
||||
| Wizard | `wizard/Prc_MaterialRequestPlan.json` |
|
||||
| Yol | Liste (Wizard) |
|
||||
| Menü | `App.Prc.MaterialRequests` › `App.Prc.MaterialRequestPlan` (sıra 4) |
|
||||
| Yetki | `App.Prc.MaterialRequestPlan` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import` |
|
||||
| Açıklama | Planlama — satınalma ekibi onaylanmış her talep kaleminin nasıl karşılanacağına karar verir: satın alınır (teklif talebi) ya da stoktan taşınır (iç transfer). |
|
||||
| Kaynak | `Prc_V_MaterialRequestPlan` · filtre `"IsDeleted" = 'false'` |
|
||||
| Görünümler | Grid, Card, Pivot, Chart (açılış grid) |
|
||||
| Düzenleme | ekle ✗ · düzenle ✗ · sil ✗ · popup |
|
||||
| Kapsam | Kiracı |
|
||||
| Alt formlar | `App.Prc.MaterialRequestPlanStock` (ProductId → ProductId), `App.Prc.MaterialRequestPlanSupplier` (ProductId → ProductId), `App.Prc.MaterialRequestPlanLastPurchase` (ProductId → ProductId) |
|
||||
| Widget'lar | `App.Widget.Total`, `App.StaticLookup.Overdue`, `App.StaticLookup.Within7Days`, `App.Prc.MaterialRequestPlan.Widget.Draft` |
|
||||
| Butonlar | `App.Prc.MaterialRequestPlan.Plan` |
|
||||
|
||||
| Alan | Başlık | Editör | Zorunlu | Formda | Kaynak |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| `MaterialRequestId` | Malzeme Talebi | dxTextBox | | | |
|
||||
| `RequestNo` | Talep No | dxTextBox | | | |
|
||||
| `Priority` | Öncelik | dxRating | | | |
|
||||
| `DepartmentId` | Departman | dxSelectBox | | | sorgu: Hr_T_Department |
|
||||
| `BranchId` | Şube Adı | dxSelectBox | | | sorgu: Sas_T_Branch |
|
||||
| `WarehouseId` | Depo | dxSelectBox | | | sorgu: Inv_T_Warehouse |
|
||||
| `LocationId` | Hedef Konum | dxSelectBox | | | sorgu: Inv_T_Location |
|
||||
| `ProductId` | Ürün | dxSelectBox | | | sorgu: Inv_T_Product |
|
||||
| `CategoryId` | Kategori | dxSelectBox | | | sorgu: Inv_T_ProductCategory |
|
||||
| `Quantity` | Miktar | dxNumberBox | | | |
|
||||
| `UomId` | Birim | dxSelectBox | | | sorgu: Adm_T_Uom |
|
||||
| `DueDate` | Termin Tarihi | dxDateBox | | | |
|
||||
| `DueState` | Termin Durumu | dxSelectBox | | | liste: Late, Week, Later |
|
||||
| `PurchaseQuantity` | Satınalma Payı | dxNumberBox | | | |
|
||||
| `TransferQuantity` | Transfer Payı | dxNumberBox | | | |
|
||||
| `RemainingQuantity` | Planlanacak | dxNumberBox | | | |
|
||||
| `StockQuantity` | Stok | dxNumberBox | | | |
|
||||
| `DraftQuantity` | Taslak Plan | dxNumberBox | | | |
|
||||
| `RequestReason` | Talep Nedeni | dxTextArea | | | |
|
||||
| `RequesterUserId` | Talep Eden | dxSelectBox | | | sorgu: AbpUsers |
|
||||
| `RequestDate` | İstek Tarihi | dxDateBox | | | |
|
||||
|
||||
#### Plan Takibi — `App.Prc.MaterialRequestPlanTrack`
|
||||
|
||||
| Özellik | Değer |
|
||||
| --- | --- |
|
||||
| Wizard | `wizard/Prc_MaterialRequestPlanTrack.json` |
|
||||
| Yol | Liste (Wizard) |
|
||||
| Menü | `App.Prc.MaterialRequests` › `App.Prc.MaterialRequestPlanTrack` (sıra 5) |
|
||||
| Yetki | `App.Prc.MaterialRequestPlanTrack` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import` |
|
||||
| Açıklama | Plan Takibi — Planlama'da verilen her karar, ürettiği belge ve belgenin geldiği aşamayla; her satır bir karardır. |
|
||||
| Kaynak | `Prc_V_MaterialRequestPlanTrack` · filtre `"IsDeleted" = 'false'` |
|
||||
| Görünümler | Grid, Card, Pivot, Chart (açılış grid) |
|
||||
| Düzenleme | ekle ✗ · düzenle ✗ · sil ✗ · popup |
|
||||
| Kapsam | Kiracı |
|
||||
| Widget'lar | `App.Widget.Total`, `App.StaticLookup.Purchase`, `App.StaticLookup.InternalTransfer`, `App.StaticLookup.Done` |
|
||||
| Butonlar | `App.Prc.MaterialRequestPlanTrack.OpenRfq`, `App.Prc.MaterialRequestPlanTrack.OpenOrder`, `App.Prc.MaterialRequestPlanTrack.OpenTransfer`, `App.Prc.MaterialRequestPlanTrack.UndoStock` |
|
||||
|
||||
| Alan | Başlık | Editör | Zorunlu | Formda | Kaynak |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| `DocumentId` | Belge | dxTextBox | | | |
|
||||
| `PurchaseOrderId` | Satınalma Siparişi | dxTextBox | | | |
|
||||
| `PlanDate` | Plan Tarihi | dxDateBox | | | |
|
||||
| `RequestNo` | Talep No | dxTextBox | | | |
|
||||
| `DepartmentId` | Departman | dxSelectBox | | | sorgu: Hr_T_Department |
|
||||
| `ProductId` | Ürün | dxSelectBox | | | sorgu: Inv_T_Product |
|
||||
| `PlanMethod` | Karar | dxSelectBox | | | liste: Purchase, Transfer, Stock |
|
||||
| `DocumentNo` | Belge No | dxTextBox | | | |
|
||||
| `DocumentStatus` | Durum | dxSelectBox | | | liste: Draft, Sent, Purchase, Waiting, Ready, Done, Cancelled |
|
||||
| `SupplierId` | Tedarikçi | dxSelectBox | | | sorgu: Adm_T_Contact |
|
||||
| `SourceLocationId` | Kaynak Konum | dxSelectBox | | | sorgu: Inv_T_Location |
|
||||
| `LocationId` | Hedef Konum | dxSelectBox | | | sorgu: Inv_T_Location |
|
||||
| `PurchaseOrderNo` | Sipariş No | dxTextBox | | | |
|
||||
| `OrderStatus` | Sipariş Durumu | dxSelectBox | | | liste: Draft, Purchase, Cancelled |
|
||||
| `Quantity` | Miktar | dxNumberBox | | | |
|
||||
| `DoneQuantity` | Gerçekleşen | dxNumberBox | | | |
|
||||
| `UomId` | Birim | dxSelectBox | | | sorgu: Adm_T_Uom |
|
||||
| `DueDate` | Termin Tarihi | dxDateBox | | | |
|
||||
| `WarehouseId` | Depo | dxSelectBox | | | sorgu: Inv_T_Warehouse |
|
||||
| `BranchId` | Şube Adı | dxSelectBox | | | sorgu: Sas_T_Branch |
|
||||
| `PlannerUserId` | Satınalma Sorumlusu | dxSelectBox | | | sorgu: AbpUsers |
|
||||
|
||||
#### Tüm Talepler — `App.Prc.MaterialRequest`
|
||||
|
||||
| Özellik | Değer |
|
||||
| --- | --- |
|
||||
| Wizard | `wizard/Prc_MaterialRequest.json` |
|
||||
| Yol | Liste (Wizard) |
|
||||
| Menü | `App.Prc.MaterialRequests` › `App.Prc.MaterialRequest` (sıra 5) |
|
||||
| Yetki | `App.Prc.MaterialRequest` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` |
|
||||
| Menü | `App.Prc.MaterialRequests` › `App.Prc.MaterialRequest` (sıra 6) |
|
||||
| Yetki | `App.Prc.MaterialRequest` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import` |
|
||||
| Açıklama | Tüm Talepler — kurumun bütün malzeme talepleri, tüm durumlarıyla, kalem kalem; satınalma yönetiminin listesi. |
|
||||
| Geliştirme talebi | Satınalma -> Talepler |
|
||||
| Kaynak | `Prc_V_MaterialRequestLine` · filtre `"IsDeleted" = 'false'` |
|
||||
|
|
@ -552,13 +675,13 @@ Yönetim › Tanımlamalar › Kontaklar (tedarikçi, e-posta, Satınalma sekmes
|
|||
| Alan | Başlık | Editör | Zorunlu | Formda | Kaynak |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| `RequestNo` | Talep No | dxTextBox | | | |
|
||||
| `Priority` | Öncelik (0-3) | dxRating | ✓ | | |
|
||||
| `Priority` | Öncelik | dxRating | ✓ | | |
|
||||
| `RequesterUserId` | Talep Eden | dxSelectBox | ✓ | | sorgu: AbpUsers |
|
||||
| `BranchId` | Şube Adı | dxSelectBox | ✓ | | sorgu: Sas_T_Branch |
|
||||
| `DepartmentId` | Departman | dxSelectBox | ✓ | | sorgu: Hr_T_Department |
|
||||
| `WarehouseId` | Depo | dxSelectBox | ✓ | | sorgu: Inv_T_Warehouse |
|
||||
| `LocationId` | Konum | dxSelectBox | ✓ | | sorgu: Inv_T_Location (← WarehouseId) |
|
||||
| `RequestDate` | Talep Tarihi | dxDateBox | ✓ | | |
|
||||
| `RequestDate` | İstek Tarihi | dxDateBox | ✓ | | |
|
||||
| `Description` | Genel Açıklama | dxHtmlEditor | | | |
|
||||
| `ApprovalStatus` | Onay Durumu | dxTextBox | | | |
|
||||
| `ApprovalUserName` | Onaylayan Kullanıcı Adı | dxTextBox | | | |
|
||||
|
|
@ -568,11 +691,9 @@ Yönetim › Tanımlamalar › Kontaklar (tedarikçi, e-posta, Satınalma sekmes
|
|||
| `ProductId` | Ürün | dxSelectBox | | | sorgu: Inv_T_Product |
|
||||
| `Quantity` | Miktar | dxNumberBox | | | |
|
||||
| `UomId` | Birim | dxSelectBox | | | sorgu: Adm_T_Uom |
|
||||
| `FulfillmentMethod` | Karşılama Şekli | dxSelectBox | | | liste: Purchase, Transfer |
|
||||
| `DueDate` | Termin Tarihi | dxDateBox | | | |
|
||||
| `RequestReason` | Talep Nedeni | dxTextArea | | | |
|
||||
| `DeliveredQuantity` | Teslim | dxNumberBox | | | |
|
||||
| `PurchaseResponsibleUserId` | Satınalma Sorumlusu | dxSelectBox | | ✓ | sorgu: AbpUsers |
|
||||
| `LineStatus` | Satır Durumu | dxSelectBox | ✓ | ✓ | liste: Waiting, Done, Cancelled |
|
||||
|
||||
#### Talep Satırları — `App.Prc.MaterialRequestLine`
|
||||
|
|
@ -589,8 +710,8 @@ Yönetim › Tanımlamalar › Kontaklar (tedarikçi, e-posta, Satınalma sekmes
|
|||
| Görünümler | Grid, Card, Pivot, Chart (açılış grid) |
|
||||
| Düzenleme | ekle ✓ · düzenle ✓ · sil ✓ · popup |
|
||||
| Kapsam | Kiracı |
|
||||
| Komutlar | InsertBefore: SQL · DeleteBefore: SQL |
|
||||
| Form varsayılanları | FulfillmentMethod=Purchase, DeliveredQuantity=0, LineStatus=Waiting, Quantity=1, PurchaseResponsibleUserId=@USERID |
|
||||
| Komutlar | InsertBefore: SQL · UpdateBefore: SQL · DeleteBefore: SQL |
|
||||
| Form varsayılanları | DeliveredQuantity=0, LineStatus=Waiting, Quantity=1 |
|
||||
|
||||
| Alan | Başlık | Editör | Zorunlu | Formda | Kaynak |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
|
|
@ -598,13 +719,176 @@ Yönetim › Tanımlamalar › Kontaklar (tedarikçi, e-posta, Satınalma sekmes
|
|||
| `ProductId` | Ürün | dxSelectBox | ✓ | ✓ | sorgu: Inv_T_Product · script |
|
||||
| `Quantity` | Miktar | dxNumberBox | ✓ | ✓ | |
|
||||
| `UomId` | Birim | dxSelectBox | ✓ | ✓ | sorgu: Adm_T_Uom |
|
||||
| `FulfillmentMethod` | Karşılama Şekli | dxSelectBox | ✓ | ✓ | liste: Purchase, Transfer |
|
||||
| `DueDate` | Termin Tarihi | dxDateBox | ✓ | ✓ | |
|
||||
| `RequestReason` | Talep Nedeni | dxTextArea | ✓ | ✓ | |
|
||||
| `DeliveredQuantity` | Teslim | dxNumberBox | | | |
|
||||
| `PurchaseResponsibleUserId` | Satınalma Sorumlusu | dxSelectBox | | ✓ | sorgu: AbpUsers |
|
||||
| `LineStatus` | Satır Durumu | dxSelectBox | ✓ | ✓ | liste: Waiting, Done, Cancelled |
|
||||
|
||||
#### Son Alımlar — `App.Prc.MaterialRequestPlanLastPurchase`
|
||||
|
||||
| Özellik | Değer |
|
||||
| --- | --- |
|
||||
| Wizard | `wizard/Prc_MaterialRequestPlanLastPurchase.json` |
|
||||
| Yol | Liste (Wizard) |
|
||||
| Menü | Menüsüz (alt form) |
|
||||
| Yetki | `App.Prc.MaterialRequestPlanLastPurchase` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import` |
|
||||
| Açıklama | Son Alımlar — Planlama'da seçili talep kaleminin ürününün tamamlanan alımları (Envanter › Alımlar), en yenisi üstte. |
|
||||
| Kaynak | `Prc_V_PurchaseReceiptLine` · filtre `"IsDeleted" = 'false'` |
|
||||
| Görünümler | Grid, Card, Pivot, Chart (açılış grid) |
|
||||
| Düzenleme | ekle ✗ · düzenle ✗ · sil ✗ · popup |
|
||||
| Kapsam | Kiracı |
|
||||
|
||||
| Alan | Başlık | Editör | Zorunlu | Formda | Kaynak |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| `ProductId` | Ürün | dxSelectBox | | | sorgu: Inv_T_Product |
|
||||
| `EffectiveDate` | Alım Tarihi | dxDateBox | | | |
|
||||
| `TransferNo` | Fiş No | dxTextBox | | | |
|
||||
| `PartnerId` | Tedarikçi | dxSelectBox | | | sorgu: Adm_T_Contact |
|
||||
| `Quantity` | Miktar | dxNumberBox | | | |
|
||||
| `UomId` | Birim | dxSelectBox | | | sorgu: Adm_T_Uom |
|
||||
| `UnitPrice` | Birim Fiyat | dxNumberBox | | | |
|
||||
| `CurrencyId` | Para Birimi | dxSelectBox | | | sorgu: Sas_H_Currency |
|
||||
| `UntaxedAmount` | Vergi Hariç Tutar | dxNumberBox | | | |
|
||||
| `OrderNo` | Sipariş No | dxTextBox | | | |
|
||||
| `WarehouseId` | Depo | dxSelectBox | | | sorgu: Inv_T_Warehouse |
|
||||
| `RequestNo` | Talep No | dxTextBox | | | |
|
||||
|
||||
#### Karşılama Planı — `App.Prc.MaterialRequestPlanLine`
|
||||
|
||||
| Özellik | Değer |
|
||||
| --- | --- |
|
||||
| Wizard | `wizard/Prc_MaterialRequestPlanLine.json` |
|
||||
| Yol | Liste (Wizard) |
|
||||
| Menü | Menüsüz (alt form) |
|
||||
| Yetki | `App.Prc.MaterialRequestPlanLine` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import` |
|
||||
| Açıklama | Karşılama Planı — kalemin Planla diyaloğundaki, onay bekleyen taslak dağıtımı. |
|
||||
| Kaynak | `Prc_V_MaterialRequestPlanLine` · filtre `"IsDeleted" = 'false'` |
|
||||
| Görünümler | Grid, Card, Pivot, Chart (açılış grid) |
|
||||
| Düzenleme | ekle ✗ · düzenle ✗ · sil ✓ · cell |
|
||||
| Kapsam | Kiracı |
|
||||
|
||||
| Alan | Başlık | Editör | Zorunlu | Formda | Kaynak |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| `BaseId` | Ana Belge | dxTextBox | | | |
|
||||
| `PlanMethod` | Karar | dxSelectBox | | | liste: Purchase, Transfer, Stock |
|
||||
| `SupplierId` | Tedarikçi | dxSelectBox | | | sorgu: Adm_T_Contact |
|
||||
| `SourceLocationId` | Kaynak Konum | dxSelectBox | | | sorgu: Inv_T_Location |
|
||||
| `Quantity` | Miktar | dxNumberBox | | | |
|
||||
| `UomId` | Birim | dxSelectBox | | | sorgu: Adm_T_Uom |
|
||||
| `Price` | Birim Fiyat | dxNumberBox | | | |
|
||||
| `CurrencyId` | Para Birimi | dxSelectBox | | | sorgu: Sas_H_Currency |
|
||||
|
||||
#### İç Transfer — `App.Prc.MaterialRequestPlanSource`
|
||||
|
||||
| Özellik | Değer |
|
||||
| --- | --- |
|
||||
| Wizard | `wizard/Prc_MaterialRequestPlanSource.json` |
|
||||
| Yol | Liste (Wizard) |
|
||||
| Menü | Menüsüz (alt form) |
|
||||
| Yetki | `App.Prc.MaterialRequestPlanSource` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import` |
|
||||
| Açıklama | İç Transfer — Planla diyaloğunun İç Transfer sekmesi: talep kaleminin ürününün stoğu olan iç konumlar. |
|
||||
| Kaynak | `Prc_V_MaterialRequestPlanSource` · filtre `"IsDeleted" = 'false'` |
|
||||
| Görünümler | Grid, Card, Pivot, Chart (açılış grid) |
|
||||
| Düzenleme | ekle ✗ · düzenle ✓ · sil ✗ · cell |
|
||||
| Kapsam | Kiracı |
|
||||
| Butonlar | `App.Prc.MaterialRequestPlan.TakeMax`, `App.Prc.MaterialRequestPlan.PlanSelected` |
|
||||
|
||||
| Alan | Başlık | Editör | Zorunlu | Formda | Kaynak |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| `BaseId` | Ana Belge | dxTextBox | | | |
|
||||
| `BranchId` | Şube Adı | dxSelectBox | | | sorgu: Sas_T_Branch |
|
||||
| `WarehouseId` | Depo | dxSelectBox | | | sorgu: Inv_T_Warehouse |
|
||||
| `LocationId` | Konum | dxSelectBox | | | sorgu: Inv_T_Location |
|
||||
| `UomId` | Birim | dxTextBox | | | |
|
||||
| `PlanQuantity` | Plan Miktarı | dxNumberBox | | | |
|
||||
| `OnHand` | Eldeki Miktar | dxNumberBox | | | |
|
||||
| `ReservedQuantity` | Rezerve Miktar | dxNumberBox | | | |
|
||||
| `FreeQuantity` | Serbest Miktar | dxNumberBox | | | |
|
||||
| `IsDestination` | Teslim Konumu | dxCheckBox | | | |
|
||||
|
||||
#### Depo Stokları — `App.Prc.MaterialRequestPlanStock`
|
||||
|
||||
| Özellik | Değer |
|
||||
| --- | --- |
|
||||
| Wizard | `wizard/Prc_MaterialRequestPlanStock.json` |
|
||||
| Yol | Liste (Wizard) |
|
||||
| Menü | Menüsüz (alt form) |
|
||||
| Yetki | `App.Prc.MaterialRequestPlanStock` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` |
|
||||
| Açıklama | Depo Stokları — Planlama'da seçili talep kaleminin ürününün bütün konumlardaki eldeki stoğu, lot bazında. |
|
||||
| Kaynak | `Inv_T_Stock` · filtre `"IsDeleted" = 'false' AND "Quantity" <> 0` |
|
||||
| Görünümler | Grid, Card, Pivot, Chart (açılış grid) |
|
||||
| Düzenleme | ekle ✗ · düzenle ✗ · sil ✗ · popup |
|
||||
| Kapsam | Kiracı |
|
||||
|
||||
| Alan | Başlık | Editör | Zorunlu | Formda | Kaynak |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| `ProductId` | Ürün | dxSelectBox | | | sorgu: Inv_T_Product |
|
||||
| `BranchId` | Şube Adı | dxSelectBox | | | sorgu: Sas_T_Branch |
|
||||
| `WarehouseId` | Depo | dxSelectBox | | | sorgu: Inv_T_Warehouse |
|
||||
| `LocationId` | Konum | dxSelectBox | | | sorgu: Inv_T_Location |
|
||||
| `LotNo` | Lot/Seri No | dxTextBox | | | |
|
||||
| `Quantity` | Miktar | dxNumberBox | | | |
|
||||
| `UomId` | Birim | dxSelectBox | | | sorgu: Adm_T_Uom |
|
||||
| `InDate` | Giriş Tarihi | dxDateBox | | | |
|
||||
| `LastMoveDate` | Son Hareket | dxDateBox | | | |
|
||||
|
||||
#### Tedarikçiler — `App.Prc.MaterialRequestPlanSupplier`
|
||||
|
||||
| Özellik | Değer |
|
||||
| --- | --- |
|
||||
| Wizard | `wizard/Prc_MaterialRequestPlanSupplier.json` |
|
||||
| Yol | Liste (Wizard) |
|
||||
| Menü | Menüsüz (alt form) |
|
||||
| Yetki | `App.Prc.MaterialRequestPlanSupplier` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` |
|
||||
| Açıklama | Tedarikçiler — Planlama'da seçili talep kaleminin ürününün fiyat listesi: hangi tedarikçi, hangi fiyat ve teslim süresiyle satıyor. |
|
||||
| Kaynak | `Inv_T_ProductSupplier` · filtre `"IsDeleted" = 'false'` |
|
||||
| Görünümler | Grid, Card, Pivot, Chart (açılış grid) |
|
||||
| Düzenleme | ekle ✗ · düzenle ✗ · sil ✗ · popup |
|
||||
| Kapsam | Kiracı |
|
||||
|
||||
| Alan | Başlık | Editör | Zorunlu | Formda | Kaynak |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| `ProductId` | Ürün | dxTextBox | | | |
|
||||
| `ContactId` | Tedarikçi | dxSelectBox | | | sorgu: Adm_T_Contact |
|
||||
| `MinQuantity` | Min. Miktar | dxNumberBox | | | |
|
||||
| `UomId` | Birim | dxSelectBox | | | sorgu: Adm_T_Uom |
|
||||
| `Price` | Birim Fiyat | dxNumberBox | | | |
|
||||
| `CurrencyId` | Para Birimi | dxSelectBox | | | sorgu: Sas_H_Currency |
|
||||
| `LeadTimeDays` | Teslim Süresi (gün) | dxNumberBox | | | |
|
||||
| `LastPurchaseDate` | Son Alım Tarihi | dxDateBox | | | |
|
||||
|
||||
#### Satınalma — `App.Prc.MaterialRequestPlanVendor`
|
||||
|
||||
| Özellik | Değer |
|
||||
| --- | --- |
|
||||
| Wizard | `wizard/Prc_MaterialRequestPlanVendor.json` |
|
||||
| Yol | Liste (Wizard) |
|
||||
| Menü | Menüsüz (alt form) |
|
||||
| Yetki | `App.Prc.MaterialRequestPlanVendor` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import` |
|
||||
| Açıklama | Satınalma — Planla diyaloğunun Satınalma sekmesi: bütün aktif kontaklar; ürünün fiyat listesindeki tedarikçiler fiyatıyla önce, diğerleri fiyatsız sonra gelir. |
|
||||
| Kaynak | `Prc_V_MaterialRequestPlanVendor` · filtre `"IsDeleted" = 'false'` |
|
||||
| Görünümler | Grid, Card, Pivot, Chart (açılış grid) |
|
||||
| Düzenleme | ekle ✗ · düzenle ✓ · sil ✗ · cell |
|
||||
| Kapsam | Kiracı |
|
||||
| Butonlar | `App.Prc.MaterialRequestPlan.TakeMax`, `App.Prc.MaterialRequestPlanTrack.OpenRfq`, `App.Prc.MaterialRequestPlan.PlanSelected` |
|
||||
|
||||
| Alan | Başlık | Editör | Zorunlu | Formda | Kaynak |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| `BaseId` | Ana Belge | dxTextBox | | | |
|
||||
| `RfqId` | Teklif Talebi | dxTextBox | | | |
|
||||
| `SuggestRank` | SuggestRank | dxNumberBox | | | |
|
||||
| `ContactId` | Tedarikçi | dxSelectBox | | | sorgu: Adm_T_Contact |
|
||||
| `PlanQuantity` | Plan Miktarı | dxNumberBox | | | |
|
||||
| `Price` | Birim Fiyat | dxNumberBox | | | |
|
||||
| `CurrencyId` | Para Birimi | dxSelectBox | | | sorgu: Sas_H_Currency |
|
||||
| `MinQuantity` | Min. Miktar | dxNumberBox | | | |
|
||||
| `UomId` | Birim | dxSelectBox | | | sorgu: Adm_T_Uom |
|
||||
| `LeadTimeDays` | Teslim Süresi (gün) | dxNumberBox | | | |
|
||||
| `LastPurchaseDate` | Son Alım Tarihi | dxDateBox | | | |
|
||||
| `MaxQuantity` | En Fazla | dxNumberBox | | | |
|
||||
| `RfqNo` | Teklif Talep No | dxTextBox | | | |
|
||||
| `RfqQuantity` | Teklifteki Miktar | dxNumberBox | | | |
|
||||
|
||||
### Sözleşmeler (`App.Prc.PurchaseAgreement`)
|
||||
|
||||
#### Sözleşmeler — `App.Prc.PurchaseAgreement`
|
||||
|
|
@ -682,16 +966,16 @@ Yönetim › Tanımlamalar › Kontaklar (tedarikçi, e-posta, Satınalma sekmes
|
|||
| Görünümler | Grid, Card, Pivot, Chart (açılış grid) |
|
||||
| Düzenleme | ekle ✓ · düzenle ✓ · sil ✓ · popup |
|
||||
| Kapsam | Kiracı |
|
||||
| Alt formlar | `App.Prc.PurchaseRfqLine` (Id → PurchaseRfqId), `App.Prc.PurchaseRfqImportItem` (Id → BaseId), `App.Prc.PurchaseRfqQuote` (Id → Id), `App.Prc.PurchaseRfqOther` (Id → Id), `App.Prc.PurchaseRfqAlternative` (Id → BaseId), `App.Prc.PurchaseRfqComparison` (Id → BaseId) |
|
||||
| Alt formlar | `App.Prc.PurchaseRfqLine` (Id → PurchaseRfqId), `App.Prc.PurchaseRfqQuote` (Id → Id), `App.Prc.PurchaseRfqOther` (Id → Id), `App.Prc.PurchaseRfqAlternative` (Id → BaseId), `App.Prc.PurchaseRfqComparison` (Id → BaseId) |
|
||||
| Widget'lar | `App.Widget.Draft`, `App.Widget.Sent`, `App.Widget.Expired`, `App.Widget.Completed` |
|
||||
| Komutlar | InsertAfter: `Prc_P_PurchaseRfqAfterSave` · UpdateBefore: SQL · UpdateAfter: `Prc_P_PurchaseRfqAfterSave` · DeleteBefore: SQL |
|
||||
| Form varsayılanları | RfqNo=Prc.PurchaseRfq, BuyerUserId=@USERID, CurrencyId=TRY, Status=Draft, BranchId= |
|
||||
| Butonlar | `App.Prc.PurchaseRfq.ImportRequests`, `App.Prc.PurchaseRfq.CreateAlternative`, `App.Prc.PurchaseRfq.PriceEntry`, `App.Prc.PurchaseOrder.Action.Send`, `App.Prc.PurchaseRfq.Action.SendTender`, `App.Prc.PurchaseRfq.Action.Award`, `App.Prc.PurchaseOrder.Action.Cancel`, `App.Prc.PurchaseOrder.Action.Draft` |
|
||||
| Form varsayılanları | RfqNo=Prc.PurchaseRfq, BuyerUserId=@USERID, CurrencyId=TRY, Status=Draft, BranchId=, WarehouseId= |
|
||||
| Butonlar | `App.Prc.PurchaseRfq.CreateAlternative`, `App.Prc.PurchaseRfq.PriceEntry`, `App.Prc.PurchaseOrder.Action.Send`, `App.Prc.PurchaseRfq.Action.SendTender`, `App.Prc.PurchaseRfq.Action.Award`, `App.Prc.PurchaseOrder.Action.Cancel`, `App.Prc.PurchaseOrder.Action.Draft` |
|
||||
|
||||
| Alan | Başlık | Editör | Zorunlu | Formda | Kaynak |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| `SupplierId` | Tedarikçi | dxSelectBox | ✓ | ✓ | sorgu: Adm_T_Contact · script |
|
||||
| `BranchId` | Şube Adı | dxSelectBox | ✓ | ✓ | sorgu: Sas_T_Branch |
|
||||
| `BranchId` | Şube Adı | dxSelectBox | ✓ | ✓ | sorgu: Sas_T_Branch · script |
|
||||
| `WarehouseId` | Depo | dxSelectBox | ✓ | ✓ | sorgu: Inv_T_Warehouse (← BranchId) |
|
||||
| `OperationTypeId` | Operasyon Türü | dxSelectBox | ✓ | ✓ | sorgu: Inv_T_OperationType (← WarehouseId) |
|
||||
| `RfqNo` | Teklif Talep No | dxTextBox | ✓ | ✓ | |
|
||||
|
|
@ -726,18 +1010,18 @@ Yönetim › Tanımlamalar › Kontaklar (tedarikçi, e-posta, Satınalma sekmes
|
|||
| Görünümler | Grid, Card, Pivot, Chart (açılış grid) |
|
||||
| Düzenleme | ekle ✓ · düzenle ✓ · sil ✓ · popup |
|
||||
| Kapsam | Kiracı |
|
||||
| Alt formlar | `App.Prc.PurchaseOrderLine` (Id → PurchaseOrderId), `App.Prc.PurchaseOrderImportItem` (Id → BaseId), `App.Prc.PurchaseOrderOther` (Id → Id), `App.Prc.PurchaseOrderAlternative` (Id → BaseId) |
|
||||
| Alt formlar | `App.Prc.PurchaseOrderLine` (Id → PurchaseOrderId), `App.Prc.PurchaseOrderOther` (Id → Id), `App.Prc.PurchaseOrderAlternative` (Id → BaseId) |
|
||||
| Widget'lar | `App.Widget.Draft`, `App.Prc.PurchaseOrder.Widget.AwaitingArrival`, `App.Prc.PurchaseOrder.Widget.LateReceipt`, `App.Widget.TotalRevenue` |
|
||||
| Komutlar | InsertAfter: `Prc_P_PurchaseOrderAfterSave` · UpdateBefore: SQL · UpdateAfter: `Prc_P_PurchaseOrderAfterSave` · DeleteBefore: SQL · DeleteAfter: `Prc_P_MaterialRequestSyncStatus` |
|
||||
| Form varsayılanları | OrderNo=Prc.PurchaseOrder, BuyerUserId=@USERID, CurrencyId=TRY, Status=Draft, BranchId= |
|
||||
| Butonlar | `App.Prc.PurchaseRfq.ImportRequests`, `App.Prc.PurchaseOrder.Action.Confirm`, `App.Prc.PurchaseOrder.Action.Send`, `App.Prc.PurchaseOrder.Action.Cancel`, `App.Prc.PurchaseOrder.Action.Draft` |
|
||||
| Form varsayılanları | OrderNo=Prc.PurchaseOrder, BuyerUserId=@USERID, CurrencyId=TRY, Status=Draft, BranchId=, WarehouseId= |
|
||||
| Butonlar | `App.Prc.PurchaseOrder.Action.Confirm`, `App.Prc.PurchaseOrder.Action.Send`, `App.Prc.PurchaseOrder.Action.Cancel`, `App.Prc.PurchaseOrder.Action.Draft` |
|
||||
|
||||
| Alan | Başlık | Editör | Zorunlu | Formda | Kaynak |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| `SupplierId` | Tedarikçi | dxSelectBox | ✓ | ✓ | sorgu: Adm_T_Contact · script |
|
||||
| `OrderNo` | Referans | dxTextBox | ✓ | ✓ | |
|
||||
| `AgreementId` | Sözleşme | dxSelectBox | | ✓ | sorgu: Prc_T_PurchaseAgreement (← SupplierId,BranchId) |
|
||||
| `BranchId` | Şube Adı | dxSelectBox | ✓ | ✓ | sorgu: Sas_T_Branch |
|
||||
| `BranchId` | Şube Adı | dxSelectBox | ✓ | ✓ | sorgu: Sas_T_Branch · script |
|
||||
| `WarehouseId` | Depo | dxSelectBox | ✓ | ✓ | sorgu: Inv_T_Warehouse (← BranchId) |
|
||||
| `OperationTypeId` | Operasyon Türü | dxSelectBox | ✓ | ✓ | sorgu: Inv_T_OperationType (← WarehouseId) |
|
||||
| `Status` | Durum | dxSelectBox | ✓ | ✓ | liste: Draft, Purchase, Cancelled |
|
||||
|
|
@ -762,7 +1046,7 @@ Yönetim › Tanımlamalar › Kontaklar (tedarikçi, e-posta, Satınalma sekmes
|
|||
| Wizard | `wizard/Prc_PurchaseOrderProduct.json` |
|
||||
| Yol | Liste (Wizard) |
|
||||
| Menü | `App.Prc.Orders` › `App.Prc.PurchaseOrderProduct` (sıra 3) |
|
||||
| Yetki | `App.Prc.PurchaseOrderProduct` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` |
|
||||
| Yetki | `App.Prc.PurchaseOrderProduct` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import` |
|
||||
| Açıklama | Sipariş Ürünleri — satınalma siparişlerinin kalemleri, siparişin başlık bilgileriyle yan yana; her satır bir sipariş kalemidir. |
|
||||
| Kaynak | `Prc_V_PurchaseOrderLine` · filtre `"IsDeleted" = 'false'` |
|
||||
| Görünümler | Grid, Card, Pivot, Chart (açılış grid) |
|
||||
|
|
@ -828,33 +1112,6 @@ Yönetim › Tanımlamalar › Kontaklar (tedarikçi, e-posta, Satınalma sekmes
|
|||
| `DeliveryDate` | Teslim Tarihi | dxDateBox | | ✓ | |
|
||||
| `MaterialRequestItemId` | Talep | dxSelectBox | | ✓ | sorgu: Prc_T_MaterialRequestItem |
|
||||
|
||||
#### Teklif Talep Kalemleri — `App.Prc.PurchaseRfqImportItem`
|
||||
|
||||
| Özellik | Değer |
|
||||
| --- | --- |
|
||||
| Wizard | `wizard/Prc_PurchaseRfqImportItem.json` |
|
||||
| Yol | Liste (Wizard) |
|
||||
| Menü | Menüsüz (alt form) |
|
||||
| Yetki | `App.Prc.PurchaseRfqImportItem` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` |
|
||||
| Açıklama | Teklif Talep Kalemleri — onaylı malzeme taleplerinin henüz teklif istenmemiş kalemleri, açık teklif talebi için listelenir. |
|
||||
| Geliştirme talebi | Satınalma -> Siparişler |
|
||||
| Kaynak | `Prc_V_PurchaseImportItem` |
|
||||
| Görünümler | Grid, Card, Pivot, Chart (açılış grid) |
|
||||
| Düzenleme | ekle ✗ · düzenle ✗ · sil ✗ · batch |
|
||||
| Kapsam | Kiracı |
|
||||
| Butonlar | `App.Prc.PurchaseImportItem.TransferSelected` |
|
||||
|
||||
| Alan | Başlık | Editör | Zorunlu | Formda | Kaynak |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| `BaseId` | Ana Belge | dxTextBox | | | |
|
||||
| `RequestNo` | Talep No | dxTextBox | | | |
|
||||
| `RequesterUserId` | Talep Eden | dxSelectBox | | | sorgu: AbpUsers |
|
||||
| `ProductId` | Ürün | dxSelectBox | | | sorgu: Inv_T_Product |
|
||||
| `Quantity` | Miktar | dxNumberBox | | | |
|
||||
| `UomId` | Birim | dxSelectBox | | | sorgu: Adm_T_Uom |
|
||||
| `DueDate` | Bitiş Tarihi | dxDateBox | | | |
|
||||
| `RequestReason` | Talep Nedeni | dxTextBox | | | |
|
||||
|
||||
#### Tedarikçi Teklifi — `App.Prc.PurchaseRfqQuote`
|
||||
|
||||
| Özellik | Değer |
|
||||
|
|
@ -911,7 +1168,7 @@ Yönetim › Tanımlamalar › Kontaklar (tedarikçi, e-posta, Satınalma sekmes
|
|||
| Wizard | `wizard/Prc_PurchaseRfqAlternative.json` |
|
||||
| Yol | Liste (Wizard) |
|
||||
| Menü | Menüsüz (alt form) |
|
||||
| Yetki | `App.Prc.PurchaseRfqAlternative` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` |
|
||||
| Yetki | `App.Prc.PurchaseRfqAlternative` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import` |
|
||||
| Açıklama | İhale Teklifleri — aynı ihalenin diğer teklif talepleri. |
|
||||
| Geliştirme talebi | Satınalma -> Siparişler |
|
||||
| Kaynak | `Prc_V_PurchaseRfqAlternative` · filtre `"IsDeleted" = 'false'` |
|
||||
|
|
@ -939,7 +1196,7 @@ Yönetim › Tanımlamalar › Kontaklar (tedarikçi, e-posta, Satınalma sekmes
|
|||
| Wizard | `wizard/Prc_PurchaseRfqComparison.json` |
|
||||
| Yol | Liste (Wizard) |
|
||||
| Menü | Menüsüz (alt form) |
|
||||
| Yetki | `App.Prc.PurchaseRfqComparison` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` |
|
||||
| Yetki | `App.Prc.PurchaseRfqComparison` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import` |
|
||||
| Açıklama | Fiyat Karşılaştırması — ihalenin her kalemi tedarikçi bazında yan yana, fiyat ve termine göre puanlanmış. |
|
||||
| Geliştirme talebi | Satınalma -> Siparişler |
|
||||
| Kaynak | `Prc_V_PurchaseRfqComparison` · filtre `"IsDeleted" = 'false'` |
|
||||
|
|
@ -996,33 +1253,6 @@ Yönetim › Tanımlamalar › Kontaklar (tedarikçi, e-posta, Satınalma sekmes
|
|||
| `DeliveryDate` | Teslim Tarihi | dxDateBox | | ✓ | |
|
||||
| `MaterialRequestItemId` | Talep | dxSelectBox | | ✓ | sorgu: Prc_T_MaterialRequestItem |
|
||||
|
||||
#### Sipariş Talep Kalemleri — `App.Prc.PurchaseOrderImportItem`
|
||||
|
||||
| Özellik | Değer |
|
||||
| --- | --- |
|
||||
| Wizard | `wizard/Prc_PurchaseOrderImportItem.json` |
|
||||
| Yol | Liste (Wizard) |
|
||||
| Menü | Menüsüz (alt form) |
|
||||
| Yetki | `App.Prc.PurchaseOrderImportItem` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` |
|
||||
| Açıklama | Sipariş Talep Kalemleri — onaylı malzeme taleplerinin henüz hiçbir teklifte ya da siparişte olmayan kalemleri, teklifsiz yazılan taslak sipariş için listelenir. |
|
||||
| Geliştirme talebi | Satınalma -> Siparişler |
|
||||
| Kaynak | `Prc_V_PurchaseImportItem` |
|
||||
| Görünümler | Grid, Card, Pivot, Chart (açılış grid) |
|
||||
| Düzenleme | ekle ✗ · düzenle ✗ · sil ✗ · batch |
|
||||
| Kapsam | Kiracı |
|
||||
| Butonlar | `App.Prc.PurchaseImportItem.TransferSelected` |
|
||||
|
||||
| Alan | Başlık | Editör | Zorunlu | Formda | Kaynak |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| `BaseId` | Ana Belge | dxTextBox | | | |
|
||||
| `RequestNo` | Talep No | dxTextBox | | | |
|
||||
| `RequesterUserId` | Talep Eden | dxSelectBox | | | sorgu: AbpUsers |
|
||||
| `ProductId` | Ürün | dxSelectBox | | | sorgu: Inv_T_Product |
|
||||
| `Quantity` | Miktar | dxNumberBox | | | |
|
||||
| `UomId` | Birim | dxSelectBox | | | sorgu: Adm_T_Uom |
|
||||
| `DueDate` | Bitiş Tarihi | dxDateBox | | | |
|
||||
| `RequestReason` | Talep Nedeni | dxTextBox | | | |
|
||||
|
||||
#### Diğer Bilgiler — `App.Prc.PurchaseOrderOther`
|
||||
|
||||
| Özellik | Değer |
|
||||
|
|
@ -1054,7 +1284,7 @@ Yönetim › Tanımlamalar › Kontaklar (tedarikçi, e-posta, Satınalma sekmes
|
|||
| Wizard | `wizard/Prc_PurchaseOrderAlternative.json` |
|
||||
| Yol | Liste (Wizard) |
|
||||
| Menü | Menüsüz (alt form) |
|
||||
| Yetki | `App.Prc.PurchaseOrderAlternative` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` |
|
||||
| Yetki | `App.Prc.PurchaseOrderAlternative` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import` |
|
||||
| Açıklama | Kaynak Teklifler — satınalma siparişinin dönüştürüldüğü ihalenin teklif talepleri. |
|
||||
| Geliştirme talebi | Satınalma -> Siparişler |
|
||||
| Kaynak | `Prc_V_PurchaseRfqAlternative` · filtre `"IsDeleted" = 'false'` |
|
||||
|
|
@ -1082,7 +1312,7 @@ Yönetim › Tanımlamalar › Kontaklar (tedarikçi, e-posta, Satınalma sekmes
|
|||
| Wizard | `wizard/Prc_PurchaseRfqAlternativeSupplier.json` |
|
||||
| Yol | Liste (Wizard) |
|
||||
| Menü | Menüsüz (alt form) |
|
||||
| Yetki | `App.Prc.PurchaseRfqAlternativeSupplier` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` |
|
||||
| Yetki | `App.Prc.PurchaseRfqAlternativeSupplier` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import` |
|
||||
| Açıklama | Alternatif Tedarikçiler — ihalede henüz teklif talebi olmayan aktif kontaklar, açık teklif talebine alternatif eklemek için listelenir. |
|
||||
| Geliştirme talebi | Satınalma -> Siparişler |
|
||||
| Kaynak | `Prc_V_PurchaseRfqAlternativeSupplier` |
|
||||
|
|
|
|||
|
|
@ -975,7 +975,7 @@ Talep, raporun yalnızca ay bazında gösterilmesini istiyor. Çeyrek bazlı top
|
|||
| Wizard | `wizard/Prj_ProjectCostSummary.json` |
|
||||
| Yol | Liste (Wizard) |
|
||||
| Menü | Menüsüz (alt form) |
|
||||
| Yetki | `App.Prj.ProjectCostSummary` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` |
|
||||
| Yetki | `App.Prj.ProjectCostSummary` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import` |
|
||||
| Açıklama | Adam / Ay Oranları ve Detaylı Maliyet Raporu — projenin salt okunur özeti: Planlanan ve Gerçek için birer satır. |
|
||||
| Geliştirme talebi | Proje Modülü |
|
||||
| Kaynak | `Prj_V_ProjectCostSummary` |
|
||||
|
|
@ -1006,7 +1006,7 @@ Talep, raporun yalnızca ay bazında gösterilmesini istiyor. Çeyrek bazlı top
|
|||
| Wizard | `wizard/Prj_ManMonth.json` |
|
||||
| Yol | Liste (Wizard) |
|
||||
| Menü | `App.Prj` › `App.Prj.ManMonth` (sıra 5) |
|
||||
| Yetki | `App.Prj.ManMonth` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` |
|
||||
| Yetki | `App.Prj.ManMonth` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import` |
|
||||
| Açıklama | Adam/Ay Oranları — proje bazında personelin ilgili aylarda iş paketlerinde geçirdiği yüzdesel çalışma oranları; ay ölçeğinde Gantt olarak gösterilir. |
|
||||
| Geliştirme talebi | Proje Modülü |
|
||||
| Kaynak | `Prj_V_ManMonthGantt` |
|
||||
|
|
@ -1035,7 +1035,7 @@ Talep, raporun yalnızca ay bazında gösterilmesini istiyor. Çeyrek bazlı top
|
|||
| Wizard | `wizard/Prj_ResourceList.json` |
|
||||
| Yol | Liste (Wizard) |
|
||||
| Menü | `App.Prj` › `App.Prj.ResourceList` (sıra 6) |
|
||||
| Yetki | `App.Prj.ResourceList` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` |
|
||||
| Yetki | `App.Prj.ResourceList` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import` |
|
||||
| Açıklama | Kaynak Listesi — tüm projelerin planlanan ve gerçekleşen kaynaklarının tek yerde salt okunur listesi. |
|
||||
| Geliştirme talebi | Proje Modülü |
|
||||
| Kaynak | `Prj_V_ResourceList` |
|
||||
|
|
@ -1072,7 +1072,7 @@ Talep, raporun yalnızca ay bazında gösterilmesini istiyor. Çeyrek bazlı top
|
|||
| Wizard | `wizard/Prj_PersonnelManMonth.json` |
|
||||
| Yol | Liste (Wizard) |
|
||||
| Menü | `App.Prj` › `App.Prj.PersonnelManMonth` (sıra 7) |
|
||||
| Yetki | `App.Prj.PersonnelManMonth` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` |
|
||||
| Yetki | `App.Prj.PersonnelManMonth` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import` |
|
||||
| Açıklama | Personel Adam/Ay Oranları — tüm projelerde personelin aylık iş paketi oranlarının ve bunlardan çıkan gerçek maliyetin salt okunur listesi. |
|
||||
| Geliştirme talebi | Proje Modülü |
|
||||
| Kaynak | `Prj_V_PersonnelManMonth` |
|
||||
|
|
@ -1103,7 +1103,7 @@ Talep, raporun yalnızca ay bazında gösterilmesini istiyor. Çeyrek bazlı top
|
|||
| Wizard | `wizard/Prj_BudgetReport.json` |
|
||||
| Yol | Liste (Wizard) |
|
||||
| Menü | `App.Prj` › `App.Prj.BudgetReport` (sıra 8) |
|
||||
| Yetki | `App.Prj.BudgetReport` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` |
|
||||
| Yetki | `App.Prj.BudgetReport` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import` |
|
||||
| Açıklama | Proje Bütçe Raporu — projelerin planlanan ve gerçekleşen maliyetlerinin aylık takibi; ay ölçeğinde Gantt olarak gösterilir (salt okunur). |
|
||||
| Geliştirme talebi | Proje Modülü |
|
||||
| Kaynak | `Prj_V_BudgetMonthly` |
|
||||
|
|
|
|||
|
|
@ -1,21 +0,0 @@
|
|||
-- Talepten Aktar: seçilen malzeme talebi kalemini (p_key = belge|kalem) taslak iç transfere satır olarak ekler; kalanı (talep − teslim) aktarılır.
|
||||
-- Belgenin hedef konumu boşsa talebin konumu yazılır.
|
||||
CREATE OR REPLACE PROCEDURE public."Inv_P_TransferImportItem"(p_key varchar)
|
||||
LANGUAGE plpgsql AS $$
|
||||
DECLARE v_doc uuid; v_tenant uuid; v_item uuid; v_product uuid; v_description varchar(256); v_quantity numeric(18, 4); v_uom varchar(64); v_location uuid;
|
||||
BEGIN
|
||||
SELECT "BaseId", "TenantId", "MaterialRequestItemId", "ProductId", "RequestReason", "Quantity", "UomId", "LocationId"
|
||||
INTO v_doc, v_tenant, v_item, v_product, v_description, v_quantity, v_uom, v_location
|
||||
FROM "Prc_V_MaterialRequestTransferItem"
|
||||
WHERE "Id" = p_key;
|
||||
IF v_doc IS NULL THEN
|
||||
RAISE EXCEPTION 'Talep kalemi artık aktarılamaz: belge taslak değil, kalem başka bir transfere aktarılmış ya da talep değişmiş.' USING ERRCODE = 'P0001', DETAIL = '50319';
|
||||
END IF;
|
||||
|
||||
INSERT INTO "Inv_T_TransferLine" ("Id", "TenantId", "TransferId", "ProductId", "Description", "DemandQuantity", "Quantity", "UomId", "MaterialRequestItemId", "CreationTime", "IsDeleted")
|
||||
VALUES (gen_random_uuid(), v_tenant, v_doc, v_product, v_description, v_quantity, 0, v_uom, v_item, NOW() AT TIME ZONE 'UTC', false);
|
||||
|
||||
UPDATE "Inv_T_Transfer" SET "DestinationLocationId" = COALESCE("DestinationLocationId", v_location) WHERE "Id" = v_doc;
|
||||
CALL public."Inv_P_TransferRecalc"(v_doc);
|
||||
END;
|
||||
$$;
|
||||
|
|
@ -39,5 +39,8 @@ BEGIN
|
|||
INNER JOIN "Inv_T_Product" p ON p."Id" = l."ProductId"
|
||||
WHERE l."TransferId" = p_id AND l."IsDeleted" = false)
|
||||
WHERE t."Id" = p_id;
|
||||
|
||||
-- Satır eklenince, silinince ya da belge tamamlanınca talep kaleminin planlanmış payı değişir.
|
||||
CALL public."Prc_P_MaterialRequestItemSync"(p_id);
|
||||
END;
|
||||
$$;
|
||||
|
|
|
|||
|
|
@ -49,6 +49,8 @@ BEGIN
|
|||
RAISE EXCEPTION 'Tamamlanmış ya da iptal edilmiş belge iptal edilemez.' USING ERRCODE = 'P0001', DETAIL = '50307';
|
||||
END IF;
|
||||
UPDATE "Inv_T_Transfer" SET "Status" = 'Cancelled' WHERE "Id" = p_id;
|
||||
-- İptal edilen transferin payı talep kalemine geri döner.
|
||||
CALL public."Prc_P_MaterialRequestItemSync"(p_id);
|
||||
ELSIF p_action = 'Return' THEN
|
||||
IF v_status <> 'Done' THEN
|
||||
RAISE EXCEPTION 'Yalnız tamamlanmış belge iade edilebilir.' USING ERRCODE = 'P0001', DETAIL = '50308';
|
||||
|
|
|
|||
|
|
@ -0,0 +1,50 @@
|
|||
-- Tamamlanan siparişli alım ürünün tedarikçi fiyat listesini (Inv_T_ProductSupplier) günceller: tedarikçi × ürün × birim ×
|
||||
-- para birimi başına tek satır tutulur. Alınan miktara uyan kademe (MinQuantity ≤ miktar olan en büyüğü) siparişin
|
||||
-- birim fiyatı ve son alım tarihiyle güncellenir; uyan satır yoksa yeni satır açılır (temin süresi = onaydan alıma gün).
|
||||
-- Fiyatı sipariş verir: siparişsiz alım, iade ve fiyatı 0 olan kalem yazmaz.
|
||||
CREATE OR REPLACE PROCEDURE public."Inv_P_TransferSupplierPrice"(p_id uuid, p_user_id uuid DEFAULT NULL)
|
||||
LANGUAGE plpgsql AS $$
|
||||
DECLARE v_now timestamp := NOW() AT TIME ZONE 'UTC';
|
||||
BEGIN
|
||||
WITH buy AS (
|
||||
SELECT b."TenantId", b."ProductId", b."SupplierId" AS "ContactId", b."UomId", b."CurrencyId", SUM(b."Quantity") AS "Quantity",
|
||||
ROUND(SUM(b."Quantity" * b."UnitPrice") / SUM(b."Quantity"), 4) AS "Price", MAX(b."LeadTimeDays") AS "LeadTimeDays"
|
||||
FROM (SELECT t."TenantId", ol."ProductId", o."SupplierId", ol."UomId", o."CurrencyId", ol."UnitPrice",
|
||||
public."Inv_F_UomConvert"(l."Quantity", l."UomId", ol."UomId") AS "Quantity",
|
||||
CASE WHEN o."ConfirmDate" IS NULL OR o."ConfirmDate" > v_now THEN 0
|
||||
ELSE v_now::date - o."ConfirmDate"::date END AS "LeadTimeDays"
|
||||
FROM "Inv_T_Transfer" t
|
||||
INNER JOIN "Inv_T_TransferLine" l ON l."TransferId" = t."Id" AND l."IsDeleted" = false AND l."Quantity" > 0
|
||||
INNER JOIN "Prc_T_PurchaseOrderLine" ol ON ol."Id" = l."PurchaseOrderLineId" AND ol."UnitPrice" > 0
|
||||
INNER JOIN "Prc_T_PurchaseOrder" o ON o."Id" = ol."PurchaseOrderId"
|
||||
WHERE t."Id" = p_id AND t."OperationKind" = 'Receipt' AND t."ReturnOfId" IS NULL) b
|
||||
GROUP BY b."TenantId", b."ProductId", b."SupplierId", b."UomId", b."CurrencyId"
|
||||
HAVING SUM(b."Quantity") > 0
|
||||
), target AS (
|
||||
SELECT buy.*,
|
||||
(SELECT ps."Id"
|
||||
FROM "Inv_T_ProductSupplier" ps
|
||||
INNER JOIN "Inv_T_Product" p ON p."Id" = ps."ProductId"
|
||||
WHERE ps."ProductId" = buy."ProductId" AND ps."ContactId" = buy."ContactId" AND ps."IsDeleted" = false AND ps."VariantKey" IS NULL
|
||||
AND COALESCE(ps."UomId", p."UomId") = buy."UomId" AND COALESCE(ps."CurrencyId", buy."CurrencyId") = buy."CurrencyId"
|
||||
AND ps."MinQuantity" <= buy."Quantity"
|
||||
AND ps."TenantId" IS NOT DISTINCT FROM buy."TenantId"
|
||||
ORDER BY ps."MinQuantity" DESC
|
||||
LIMIT 1) AS "TargetId"
|
||||
FROM buy
|
||||
), updated AS (
|
||||
UPDATE "Inv_T_ProductSupplier" ps
|
||||
SET "Price" = x."Price", "UomId" = x."UomId", "CurrencyId" = x."CurrencyId", "LastPurchaseDate" = v_now,
|
||||
"LastModificationTime" = v_now, "LastModifierId" = p_user_id
|
||||
FROM target x
|
||||
WHERE x."TargetId" = ps."Id"
|
||||
)
|
||||
-- Miktarı 1'in altındaki alımda 1'lik kademe uymaz; yeni kademe alınan miktardan başlar.
|
||||
INSERT INTO "Inv_T_ProductSupplier" ("Id", "TenantId", "ProductId", "ContactId", "MinQuantity", "UomId", "Price", "CurrencyId",
|
||||
"LeadTimeDays", "LastPurchaseDate", "CreationTime", "CreatorId", "IsDeleted")
|
||||
SELECT gen_random_uuid(), x."TenantId", x."ProductId", x."ContactId", CASE WHEN x."Quantity" < 1 THEN x."Quantity" ELSE 1 END,
|
||||
x."UomId", x."Price", x."CurrencyId", x."LeadTimeDays", v_now, v_now, p_user_id, false
|
||||
FROM target x
|
||||
WHERE x."TargetId" IS NULL;
|
||||
END;
|
||||
$$;
|
||||
|
|
@ -1,6 +1,7 @@
|
|||
-- Tamamla: yapılan miktarlar stoğa işlenir (Inv_T_Stock, ürün biriminde, lot kırılımlı). İç konumdan çıkışta stok yetmezse
|
||||
-- işlem durur; dış konumlar stok tutmaz. Envanter takibi kapalı ürün stoğa girmez. Lot/seri takipli üründe lot toplamı
|
||||
-- yapılan miktara eşit olmalıdır. Sipariş kalemlerinin alınan, talep kalemlerinin teslim edilen miktarı güncellenir (iadede düşülür).
|
||||
-- yapılan miktara eşit olmalıdır. Sipariş kalemlerinin alınan, talep kalemlerinin teslim edilen miktarı güncellenir (iadede düşülür);
|
||||
-- siparişli alım ürün–tedarikçi fiyatını yazar (Inv_P_TransferSupplierPrice).
|
||||
-- Talepten az yapılan satırların kalanı aynı türde yeni belgeye (backorder) geçer.
|
||||
CREATE OR REPLACE PROCEDURE public."Inv_P_TransferValidate"(p_id uuid, p_user_id uuid DEFAULT NULL)
|
||||
LANGUAGE plpgsql AS $$
|
||||
|
|
@ -116,6 +117,8 @@ BEGIN
|
|||
GROUP BY l."PurchaseOrderLineId") x
|
||||
WHERE x."PurchaseOrderLineId" = ol."Id";
|
||||
|
||||
CALL public."Inv_P_TransferSupplierPrice"(p_id, p_user_id);
|
||||
|
||||
UPDATE "Prc_T_MaterialRequestItem" i SET "DeliveredQuantity" = i."DeliveredQuantity" + v_sign * x."Quantity",
|
||||
"LineStatus" = CASE WHEN i."DeliveredQuantity" + v_sign * x."Quantity" >= i."Quantity" THEN 'Done'
|
||||
WHEN i."LineStatus" = 'Done' THEN 'Waiting' ELSE i."LineStatus" END
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ CREATE TABLE IF NOT EXISTS public."Inv_T_ProductSupplier"
|
|||
"Price" numeric(18, 4) NOT NULL DEFAULT 0,
|
||||
"CurrencyId" varchar(64) NULL,
|
||||
"LeadTimeDays" integer NOT NULL DEFAULT 0,
|
||||
"LastPurchaseDate" timestamp NULL,
|
||||
"VariantKey" varchar(450) NULL,
|
||||
"CreationTime" timestamp NOT NULL DEFAULT (NOW() AT TIME ZONE 'UTC'),
|
||||
"CreatorId" uuid NULL,
|
||||
|
|
|
|||
|
|
@ -0,0 +1,16 @@
|
|||
-- Transfer belgesinin talep kalemlerinin satır durumunu planla eşler (yeniden hesap ve iptal sonrası): kalanın tamamı iç transferle
|
||||
-- planlanmış, satınalma payı olmayan bekleyen kalem kapanır (Tamamlandı); transfer iptal edilir, satırı silinir ya da eksik tamamlanıp kalanı
|
||||
-- yeniden açılırsa kapalı kalem Bekliyor'a döner ve Planlama'da görünür. Silinmiş satırların kalemleri de kapsamdadır.
|
||||
CREATE OR REPLACE PROCEDURE public."Prc_P_MaterialRequestItemSync"(p_transfer_id uuid)
|
||||
LANGUAGE plpgsql AS $$
|
||||
BEGIN
|
||||
UPDATE "Prc_T_MaterialRequestItem" i
|
||||
SET "LineStatus" = CASE WHEN i."LineStatus" = 'Waiting' THEN 'Done' ELSE 'Waiting' END
|
||||
FROM public."Prc_V_MaterialRequestItemPlan" p
|
||||
WHERE p."Id" = i."Id"
|
||||
AND i."Id" IN (SELECT "MaterialRequestItemId" FROM "Inv_T_TransferLine" WHERE "TransferId" = p_transfer_id AND "MaterialRequestItemId" IS NOT NULL)
|
||||
AND p."PurchaseQuantity" = 0
|
||||
AND ((i."LineStatus" = 'Waiting' AND p."RemainingQuantity" <= 0)
|
||||
OR (i."LineStatus" = 'Done' AND p."RemainingQuantity" > 0 AND i."DeliveredQuantity" < i."Quantity"));
|
||||
END;
|
||||
$$;
|
||||
180
configs/seeds/postgres/object/Prc_P_MaterialRequestPlan.sql
Normal file
180
configs/seeds/postgres/object/Prc_P_MaterialRequestPlan.sql
Normal file
|
|
@ -0,0 +1,180 @@
|
|||
-- Planlama kararı: talep kaleminin planlanacak kalanından p_plan_quantity kadarını satınalmaya ya da iç transfere ayırır; kalanın geri kalanı
|
||||
-- listede kalır. Planla diyaloğunun onayı (Prc_P_MaterialRequestPlanConfirm) her taslak plan satırı için çağırır.
|
||||
-- Purchase: tedarikçinin talebin şubesi ve deposu için taslak teklif talebi varsa kalem ona eklenir (kalem zaten oradaysa miktarı artar), yoksa
|
||||
-- talebin deposunun alım operasyon türüyle yeni taslak teklif talebi açılır (para birimi ve koşullar kontak kartından; alıcı — satınalma sorumlusu —
|
||||
-- planlayan). Fiyat tedarikçinin fiyat listesinden gelir; teklif → sipariş → alım akışı oradan sürer.
|
||||
-- Transfer: kaynak konumun serbest stoğu (Prc_V_MaterialRequestPlanSource) yetmelidir; aynı kaynak → talebin konumu için onaya
|
||||
-- girmemiş taslak iç transfer varsa satır ona, yoksa kaynak deponun iç transfer operasyon türüyle yeni taslak açılır. Kalanın tamamı transferle
|
||||
-- planlanan, satınalma payı olmayan kalem transfer belgesinin yeniden hesabında kapanır (Prc_P_MaterialRequestItemSync).
|
||||
-- Stock: stok talebin teslim konumundadır; belge açılmaz, serbest stok yetmelidir. Miktar kalemin stoktan karşılanan ve teslim edilen
|
||||
-- miktarına eklenir; satınalma payı olmayan ve kalanı biten kalem kapanır.
|
||||
CREATE OR REPLACE PROCEDURE public."Prc_P_MaterialRequestPlan"(
|
||||
p_id uuid,
|
||||
p_plan_method varchar,
|
||||
p_plan_quantity numeric(18, 4),
|
||||
p_plan_supplier_id uuid,
|
||||
p_plan_source_location_id uuid,
|
||||
p_tenant_id uuid,
|
||||
p_last_modifier_id uuid
|
||||
)
|
||||
LANGUAGE plpgsql AS $$
|
||||
DECLARE v_product uuid; v_uom varchar(64); v_due timestamp; v_reason varchar(256); v_branch uuid; v_warehouse uuid; v_location uuid;
|
||||
v_request_no varchar(32); v_remaining numeric(18, 4); v_doc uuid; v_line uuid; v_op_type uuid; v_src_warehouse uuid;
|
||||
v_free numeric(18, 4); v_no varchar(128);
|
||||
BEGIN
|
||||
-- Kalem kilitlenir: aynı kalemin eşzamanlı iki planı kalanı iki kez dağıtamaz.
|
||||
SELECT i."ProductId", i."UomId", i."DueDate", i."RequestReason", r."BranchId", r."WarehouseId", r."LocationId", r."RequestNo"
|
||||
INTO v_product, v_uom, v_due, v_reason, v_branch, v_warehouse, v_location, v_request_no
|
||||
FROM "Prc_T_MaterialRequestItem" i
|
||||
INNER JOIN "Prc_T_MaterialRequest" r ON r."Id" = i."MaterialRequestId"
|
||||
WHERE i."Id" = p_id AND i."IsDeleted" = false AND i."LineStatus" = 'Waiting' AND r."IsDeleted" = false
|
||||
AND i."TenantId" IS NOT DISTINCT FROM p_tenant_id
|
||||
AND r."ApprovalStatus" IN ('Onaylandı', 'Teklif Talebi', 'Teklif Talebi Gönderildi', 'Satınalma Siparişi')
|
||||
FOR UPDATE OF i;
|
||||
IF v_product IS NULL THEN
|
||||
RAISE EXCEPTION 'Kalem planlanamaz: talep onaylı değil ya da kalem kapalı.' USING ERRCODE = 'P0001', DETAIL = '50191';
|
||||
END IF;
|
||||
|
||||
SELECT "RemainingQuantity" INTO v_remaining FROM public."Prc_V_MaterialRequestItemPlan" WHERE "Id" = p_id;
|
||||
IF COALESCE(p_plan_quantity, 0) <= 0 THEN
|
||||
RAISE EXCEPTION 'Plan miktarı sıfırdan büyük olmalıdır.' USING ERRCODE = 'P0001', DETAIL = '50192';
|
||||
END IF;
|
||||
IF p_plan_quantity > v_remaining THEN
|
||||
RAISE EXCEPTION 'Plan miktarı planlanacak kalanı aşamaz (kalan: % %).', trim_scale(v_remaining), v_uom USING ERRCODE = 'P0001', DETAIL = '50193';
|
||||
END IF;
|
||||
|
||||
IF p_plan_method = 'Purchase' THEN
|
||||
IF p_plan_supplier_id IS NULL THEN
|
||||
RAISE EXCEPTION 'Satınalma kararında tedarikçi seçilmelidir.' USING ERRCODE = 'P0001', DETAIL = '50194';
|
||||
END IF;
|
||||
|
||||
SELECT "Id" INTO v_doc
|
||||
FROM "Prc_T_PurchaseRfq"
|
||||
WHERE "IsDeleted" = false AND "Status" = 'Draft' AND "SupplierId" = p_plan_supplier_id AND "BranchId" = v_branch AND "WarehouseId" = v_warehouse
|
||||
AND "TenantId" IS NOT DISTINCT FROM p_tenant_id
|
||||
ORDER BY "CreationTime" DESC
|
||||
LIMIT 1;
|
||||
|
||||
IF v_doc IS NULL THEN
|
||||
SELECT "Id" INTO v_op_type
|
||||
FROM "Inv_T_OperationType"
|
||||
WHERE "IsDeleted" = false AND "IsActive" = true AND "OperationKind" = 'Receipt' AND "WarehouseId" = v_warehouse
|
||||
ORDER BY "Name"
|
||||
LIMIT 1;
|
||||
IF v_op_type IS NULL THEN
|
||||
RAISE EXCEPTION 'Talebin deposu için aktif bir alım operasyon türü tanımlı değil.' USING ERRCODE = 'P0001', DETAIL = '50195';
|
||||
END IF;
|
||||
|
||||
v_doc := gen_random_uuid();
|
||||
CALL public."Adm_P_SequenceNext"('Prc.PurchaseRfq', p_tenant_id, v_no);
|
||||
INSERT INTO "Prc_T_PurchaseRfq" ("Id", "TenantId", "RfqNo", "TenderGroupId", "SupplierId", "BranchId", "OperationTypeId", "WarehouseId", "CurrencyId",
|
||||
"BuyerUserId", "IncotermId", "IncotermLocation", "PaymentTermId", "CreationTime", "CreatorId", "IsDeleted")
|
||||
SELECT v_doc, p_tenant_id, left(v_no, 32), v_doc, c."Id", v_branch, v_op_type, v_warehouse, COALESCE(c."SupplierCurrency", 'TRY'),
|
||||
p_last_modifier_id, c."PurchaseIncotermId", c."PurchaseIncotermLocation", c."PurchasePaymentTermId",
|
||||
NOW() AT TIME ZONE 'UTC', p_last_modifier_id, false
|
||||
FROM "Adm_T_Contact" c
|
||||
WHERE c."Id" = p_plan_supplier_id AND c."IsDeleted" = false;
|
||||
IF NOT FOUND THEN
|
||||
RAISE EXCEPTION 'Satınalma kararında tedarikçi seçilmelidir.' USING ERRCODE = 'P0001', DETAIL = '50194';
|
||||
END IF;
|
||||
END IF;
|
||||
|
||||
SELECT "Id" INTO v_line FROM "Prc_T_PurchaseRfqLine" WHERE "PurchaseRfqId" = v_doc AND "MaterialRequestItemId" = p_id AND "IsDeleted" = false LIMIT 1;
|
||||
IF v_line IS NOT NULL THEN
|
||||
UPDATE "Prc_T_PurchaseRfqLine"
|
||||
SET "Quantity" = "Quantity" + public."Inv_F_UomConvert"(p_plan_quantity, v_uom, "UomId"),
|
||||
"LastModificationTime" = NOW() AT TIME ZONE 'UTC', "LastModifierId" = p_last_modifier_id
|
||||
WHERE "Id" = v_line;
|
||||
ELSE
|
||||
INSERT INTO "Prc_T_PurchaseRfqLine" ("Id", "TenantId", "PurchaseRfqId", "ProductId", "Description", "Quantity", "UomId", "UnitPrice", "TaxRate", "Amount",
|
||||
"DeliveryDate", "MaterialRequestItemId", "CreationTime", "CreatorId", "IsDeleted")
|
||||
SELECT gen_random_uuid(), p_tenant_id, v_doc, v_product, v_reason, p_plan_quantity, v_uom,
|
||||
COALESCE((SELECT ps."Price" FROM "Inv_T_ProductSupplier" ps
|
||||
WHERE ps."ProductId" = v_product AND ps."ContactId" = p_plan_supplier_id AND ps."IsDeleted" = false
|
||||
ORDER BY ps."MinQuantity" LIMIT 1), 0),
|
||||
COALESCE(p."PurchaseTaxRate", 0), 0, v_due, p_id, NOW() AT TIME ZONE 'UTC', p_last_modifier_id, false
|
||||
FROM "Inv_T_Product" p
|
||||
WHERE p."Id" = v_product;
|
||||
END IF;
|
||||
|
||||
CALL public."Prc_P_PurchaseRfqRecalc"(v_doc);
|
||||
ELSIF p_plan_method = 'Transfer' THEN
|
||||
IF p_plan_source_location_id IS NULL THEN
|
||||
RAISE EXCEPTION 'İç transfer kararında kaynak konum seçilmelidir.' USING ERRCODE = 'P0001', DETAIL = '50196';
|
||||
END IF;
|
||||
-- Konum ve serbest stok kuralı diyaloğun İç Transfer ızgarasıyla aynıdır.
|
||||
SELECT "WarehouseId", "FreeQuantity" INTO v_src_warehouse, v_free
|
||||
FROM public."Prc_V_MaterialRequestPlanSource"
|
||||
WHERE "BaseId" = p_id AND "LocationId" = p_plan_source_location_id;
|
||||
IF v_src_warehouse IS NULL OR p_plan_source_location_id = v_location THEN
|
||||
RAISE EXCEPTION 'Kaynak konum, talebin teslim konumundan farklı ve ürünün stoğu olan bir iç konum olmalıdır.' USING ERRCODE = 'P0001', DETAIL = '50197';
|
||||
END IF;
|
||||
IF p_plan_quantity > v_free THEN
|
||||
RAISE EXCEPTION 'Kaynak konumda yeterli serbest stok yok (serbest: % %).', trim_scale(GREATEST(v_free, 0)), v_uom USING ERRCODE = 'P0001', DETAIL = '50198';
|
||||
END IF;
|
||||
|
||||
SELECT "Id" INTO v_doc
|
||||
FROM "Inv_T_Transfer"
|
||||
WHERE "IsDeleted" = false AND "OperationKind" = 'InternalTransfer' AND "Status" = 'Draft' AND "ReturnOfId" IS NULL AND "BackorderOfId" IS NULL
|
||||
AND "SourceLocationId" = p_plan_source_location_id AND "DestinationLocationId" = v_location
|
||||
AND COALESCE("ApprovalStatus", 'Onay Gerekmez') = 'Onay Gerekmez'
|
||||
AND "TenantId" IS NOT DISTINCT FROM p_tenant_id
|
||||
ORDER BY "CreationTime" DESC
|
||||
LIMIT 1;
|
||||
|
||||
IF v_doc IS NULL THEN
|
||||
SELECT "Id" INTO v_op_type
|
||||
FROM "Inv_T_OperationType"
|
||||
WHERE "IsDeleted" = false AND "IsActive" = true AND "OperationKind" = 'InternalTransfer' AND "WarehouseId" = v_src_warehouse
|
||||
ORDER BY "Name"
|
||||
LIMIT 1;
|
||||
IF v_op_type IS NULL THEN
|
||||
RAISE EXCEPTION 'Kaynak depo için aktif bir iç transfer operasyon türü tanımlı değil.' USING ERRCODE = 'P0001', DETAIL = '50199';
|
||||
END IF;
|
||||
|
||||
v_doc := gen_random_uuid();
|
||||
INSERT INTO "Inv_T_Transfer" ("Id", "TenantId", "BranchId", "WarehouseId", "OperationTypeId", "OperationKind", "SourceLocationId", "DestinationLocationId",
|
||||
"SourceDocument", "ResponsibleUserId", "Status", "CreationTime", "CreatorId", "IsDeleted")
|
||||
SELECT v_doc, p_tenant_id, ot."BranchId", ot."WarehouseId", ot."Id", 'InternalTransfer', p_plan_source_location_id, v_location,
|
||||
v_request_no, p_last_modifier_id, 'Draft', NOW() AT TIME ZONE 'UTC', p_last_modifier_id, false
|
||||
FROM "Inv_T_OperationType" ot
|
||||
WHERE ot."Id" = v_op_type;
|
||||
ELSE
|
||||
UPDATE "Inv_T_Transfer"
|
||||
SET "SourceDocument" = left(COALESCE("SourceDocument", '') || CASE WHEN COALESCE("SourceDocument", '') = '' THEN '' ELSE ', ' END || v_request_no, 128)
|
||||
WHERE "Id" = v_doc AND strpos(COALESCE("SourceDocument", ''), v_request_no) = 0;
|
||||
END IF;
|
||||
|
||||
SELECT "Id" INTO v_line FROM "Inv_T_TransferLine" WHERE "TransferId" = v_doc AND "MaterialRequestItemId" = p_id AND "IsDeleted" = false LIMIT 1;
|
||||
IF v_line IS NOT NULL THEN
|
||||
UPDATE "Inv_T_TransferLine"
|
||||
SET "DemandQuantity" = "DemandQuantity" + public."Inv_F_UomConvert"(p_plan_quantity, v_uom, "UomId"),
|
||||
"LastModificationTime" = NOW() AT TIME ZONE 'UTC', "LastModifierId" = p_last_modifier_id
|
||||
WHERE "Id" = v_line;
|
||||
ELSE
|
||||
INSERT INTO "Inv_T_TransferLine" ("Id", "TenantId", "TransferId", "ProductId", "Description", "DemandQuantity", "Quantity", "UomId", "MaterialRequestItemId",
|
||||
"CreationTime", "CreatorId", "IsDeleted")
|
||||
VALUES (gen_random_uuid(), p_tenant_id, v_doc, v_product, v_reason, p_plan_quantity, 0, v_uom, p_id, NOW() AT TIME ZONE 'UTC', p_last_modifier_id, false);
|
||||
END IF;
|
||||
|
||||
-- Numara, kaynak depo onaycısı ve yeniden hesap (kalemin kapanması dahil) belge kaydı sonrasıyla aynıdır.
|
||||
CALL public."Inv_P_TransferAfterSave"(v_doc, p_last_modifier_id);
|
||||
ELSIF p_plan_method = 'Stock' THEN
|
||||
SELECT "FreeQuantity" INTO v_free FROM public."Prc_V_MaterialRequestPlanSource" WHERE "BaseId" = p_id AND "LocationId" = v_location;
|
||||
IF p_plan_quantity > COALESCE(v_free, 0) THEN
|
||||
RAISE EXCEPTION 'Teslim konumunda yeterli serbest stok yok (serbest: % %).', trim_scale(GREATEST(COALESCE(v_free, 0), 0)), v_uom
|
||||
USING ERRCODE = 'P0001', DETAIL = '50198';
|
||||
END IF;
|
||||
|
||||
UPDATE "Prc_T_MaterialRequestItem"
|
||||
SET "FromStockQuantity" = "FromStockQuantity" + p_plan_quantity, "DeliveredQuantity" = "DeliveredQuantity" + p_plan_quantity,
|
||||
"LastModificationTime" = NOW() AT TIME ZONE 'UTC', "LastModifierId" = p_last_modifier_id
|
||||
WHERE "Id" = p_id;
|
||||
UPDATE "Prc_T_MaterialRequestItem" i SET "LineStatus" = 'Done'
|
||||
FROM public."Prc_V_MaterialRequestItemPlan" p
|
||||
WHERE p."Id" = i."Id" AND i."Id" = p_id AND p."PurchaseQuantity" = 0 AND p."RemainingQuantity" <= 0;
|
||||
ELSE
|
||||
RAISE EXCEPTION 'Karar Satınalma, İç Transfer ya da Stoktan olmalıdır.' USING ERRCODE = 'P0001', DETAIL = '50192';
|
||||
END IF;
|
||||
END;
|
||||
$$;
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
-- Planla diyaloğunun Onayla'sı (App.Prc.MaterialRequestPlan › UpdateCommand): talep kaleminin taslak planındaki her satırı
|
||||
-- Prc_P_MaterialRequestPlan ile belgeye çevirir (iç transferler, stoktan karşılama, sonra teklif talepleri — stok payı kalemi transferlerden
|
||||
-- sonra kapatabilsin) ve taslağı siler. Tek transaction'dır:
|
||||
-- bir satır reddedilirse (stok, kalan, operasyon türü) hiçbir belge açılmaz ve taslak yerinde kalır.
|
||||
CREATE OR REPLACE PROCEDURE public."Prc_P_MaterialRequestPlanConfirm"(
|
||||
p_id uuid,
|
||||
p_tenant_id uuid,
|
||||
p_last_modifier_id uuid
|
||||
)
|
||||
LANGUAGE plpgsql AS $$
|
||||
DECLARE r record;
|
||||
BEGIN
|
||||
PERFORM 1 FROM "Prc_T_MaterialRequestPlanLine" WHERE "MaterialRequestItemId" = p_id AND "IsDeleted" = false FOR UPDATE;
|
||||
IF NOT FOUND THEN
|
||||
RAISE EXCEPTION 'Onaylanacak taslak plan yok: önce Öner butonunu kullanın ya da İç Transfer veya Satınalma sekmesinde Plan Miktarı girin.'
|
||||
USING ERRCODE = 'P0001', DETAIL = '50201';
|
||||
END IF;
|
||||
|
||||
FOR r IN SELECT "PlanMethod", "Quantity", "SupplierId", "SourceLocationId"
|
||||
FROM "Prc_T_MaterialRequestPlanLine"
|
||||
WHERE "MaterialRequestItemId" = p_id AND "IsDeleted" = false
|
||||
ORDER BY CASE "PlanMethod" WHEN 'Transfer' THEN 0 WHEN 'Stock' THEN 1 ELSE 2 END, "CreationTime"
|
||||
LOOP
|
||||
CALL public."Prc_P_MaterialRequestPlan"(p_id, r."PlanMethod", r."Quantity", r."SupplierId", r."SourceLocationId", p_tenant_id,
|
||||
p_last_modifier_id);
|
||||
END LOOP;
|
||||
|
||||
DELETE FROM "Prc_T_MaterialRequestPlanLine" WHERE "MaterialRequestItemId" = p_id;
|
||||
END;
|
||||
$$;
|
||||
|
|
@ -0,0 +1,94 @@
|
|||
-- Planla diyaloğunun İç Transfer (App.Prc.MaterialRequestPlanSource) ve Satınalma (App.Prc.MaterialRequestPlanVendor) ızgaralarının satır kaydı:
|
||||
-- girilen Plan Miktarı kalemin taslak planına (Prc_T_MaterialRequestPlanLine) yazılır, 0 ya da boş satırı plandan çıkarır. p_id ızgara
|
||||
-- satırının anahtarıdır: kalem + ':' + hedef (Transfer'de kaynak konum, Purchase'da tedarikçi). Kaynak talebin teslim konumuysa karar
|
||||
-- Stock'tur (transfer açılmaz, stoktan karşılanır). Belge açılmaz; onay
|
||||
-- Prc_P_MaterialRequestPlanConfirm'dedir. Taslak toplamı planlanacak kalanı, konumun satırı serbest stoğu aşamaz. Batch kaydı satırları
|
||||
-- eşzamanlı gönderdiği için kalem kilitlenir. Eksi miktar "alabileceği en fazla"dır (Seçilenleri Planla): kalanın diğer taslak satırlardan
|
||||
-- arta kalanı, konumda serbest stokla sınırlı; alınacak bir şey yoksa satır değişmez.
|
||||
CREATE OR REPLACE PROCEDURE public."Prc_P_MaterialRequestPlanLineSave"(
|
||||
p_id varchar,
|
||||
p_plan_method varchar,
|
||||
p_plan_quantity numeric(18, 4),
|
||||
p_tenant_id uuid,
|
||||
p_last_modifier_id uuid
|
||||
)
|
||||
LANGUAGE plpgsql AS $$
|
||||
DECLARE v_item uuid := left(p_id, 36)::uuid;
|
||||
v_target uuid := substring(p_id from 38 for 36)::uuid;
|
||||
v_qty numeric(18, 4) := COALESCE(p_plan_quantity, 0);
|
||||
v_method varchar(16) := p_plan_method; v_location uuid;
|
||||
v_uom varchar(64); v_remaining numeric(18, 4); v_other numeric(18, 4); v_free numeric(18, 4); v_line uuid;
|
||||
BEGIN
|
||||
SELECT i."UomId", r."LocationId" INTO v_uom, v_location
|
||||
FROM "Prc_T_MaterialRequestItem" i
|
||||
INNER JOIN "Prc_T_MaterialRequest" r ON r."Id" = i."MaterialRequestId"
|
||||
WHERE i."Id" = v_item AND i."IsDeleted" = false AND i."LineStatus" = 'Waiting' AND r."IsDeleted" = false
|
||||
AND i."TenantId" IS NOT DISTINCT FROM p_tenant_id
|
||||
AND r."ApprovalStatus" IN ('Onaylandı', 'Teklif Talebi', 'Teklif Talebi Gönderildi', 'Satınalma Siparişi')
|
||||
FOR UPDATE OF i;
|
||||
IF v_uom IS NULL THEN
|
||||
RAISE EXCEPTION 'Kalem planlanamaz: talep onaylı değil ya da kalem kapalı.' USING ERRCODE = 'P0001', DETAIL = '50191';
|
||||
END IF;
|
||||
IF v_method = 'Transfer' AND v_target = v_location THEN
|
||||
v_method := 'Stock';
|
||||
END IF;
|
||||
|
||||
SELECT "Id" INTO v_line
|
||||
FROM "Prc_T_MaterialRequestPlanLine"
|
||||
WHERE "MaterialRequestItemId" = v_item AND "PlanMethod" = v_method AND "IsDeleted" = false
|
||||
AND v_target = CASE WHEN v_method = 'Purchase' THEN "SupplierId" ELSE "SourceLocationId" END;
|
||||
|
||||
IF v_qty = 0 THEN
|
||||
DELETE FROM "Prc_T_MaterialRequestPlanLine" WHERE "Id" = v_line;
|
||||
RETURN;
|
||||
END IF;
|
||||
|
||||
SELECT "RemainingQuantity" INTO v_remaining FROM public."Prc_V_MaterialRequestItemPlan" WHERE "Id" = v_item;
|
||||
SELECT COALESCE(SUM("Quantity"), 0) INTO v_other
|
||||
FROM "Prc_T_MaterialRequestPlanLine"
|
||||
WHERE "MaterialRequestItemId" = v_item AND "IsDeleted" = false AND "Id" IS DISTINCT FROM v_line;
|
||||
IF v_qty < 0 THEN
|
||||
v_qty := v_remaining - v_other;
|
||||
IF v_method IN ('Transfer', 'Stock') THEN
|
||||
SELECT "FreeQuantity" INTO v_free FROM public."Prc_V_MaterialRequestPlanSource" WHERE "BaseId" = v_item AND "LocationId" = v_target;
|
||||
IF v_free < v_qty THEN
|
||||
v_qty := v_free;
|
||||
END IF;
|
||||
END IF;
|
||||
IF COALESCE(v_qty, 0) <= 0 THEN
|
||||
RETURN;
|
||||
END IF;
|
||||
END IF;
|
||||
IF v_other + v_qty > v_remaining THEN
|
||||
RAISE EXCEPTION 'Taslak plan toplamı planlanacak kalanı aşamaz (kalan: % %).', trim_scale(v_remaining - v_other), v_uom
|
||||
USING ERRCODE = 'P0001', DETAIL = '50200';
|
||||
END IF;
|
||||
|
||||
IF v_method IN ('Transfer', 'Stock') THEN
|
||||
SELECT "FreeQuantity" INTO v_free FROM public."Prc_V_MaterialRequestPlanSource" WHERE "BaseId" = v_item AND "LocationId" = v_target;
|
||||
IF v_free IS NULL THEN
|
||||
RAISE EXCEPTION 'Kaynak konum ürünün stoğu olan bir iç konum olmalıdır.' USING ERRCODE = 'P0001', DETAIL = '50197';
|
||||
END IF;
|
||||
IF v_qty > v_free THEN
|
||||
RAISE EXCEPTION 'Kaynak konumda yeterli serbest stok yok (serbest: % %).', trim_scale(GREATEST(v_free, 0)), v_uom USING ERRCODE = 'P0001', DETAIL = '50198';
|
||||
END IF;
|
||||
ELSIF v_method = 'Purchase' THEN
|
||||
IF NOT EXISTS (SELECT 1 FROM public."Prc_V_MaterialRequestPlanVendor" WHERE "BaseId" = v_item AND "ContactId" = v_target) THEN
|
||||
RAISE EXCEPTION 'Satınalma kararında aktif bir tedarikçi seçilmelidir.' USING ERRCODE = 'P0001', DETAIL = '50194';
|
||||
END IF;
|
||||
ELSE
|
||||
RAISE EXCEPTION 'Karar Satınalma ya da İç Transfer olmalıdır.' USING ERRCODE = 'P0001', DETAIL = '50192';
|
||||
END IF;
|
||||
|
||||
IF v_line IS NOT NULL THEN
|
||||
UPDATE "Prc_T_MaterialRequestPlanLine"
|
||||
SET "Quantity" = v_qty, "LastModificationTime" = NOW() AT TIME ZONE 'UTC', "LastModifierId" = p_last_modifier_id
|
||||
WHERE "Id" = v_line;
|
||||
ELSE
|
||||
INSERT INTO "Prc_T_MaterialRequestPlanLine" ("Id", "TenantId", "MaterialRequestItemId", "PlanMethod", "SupplierId", "SourceLocationId",
|
||||
"Quantity", "CreationTime", "CreatorId", "IsDeleted")
|
||||
VALUES (gen_random_uuid(), p_tenant_id, v_item, v_method, CASE WHEN v_method = 'Purchase' THEN v_target END,
|
||||
CASE WHEN v_method <> 'Purchase' THEN v_target END, v_qty, NOW() AT TIME ZONE 'UTC', p_last_modifier_id, false);
|
||||
END IF;
|
||||
END;
|
||||
$$;
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
-- Planla diyaloğunun Öner'i (App.Prc.MaterialRequestPlanLine › InsertCommand):
|
||||
-- kalemin taslak planını sıfırlayıp planlanacak kalanı dağıtır. Önce stok: teslim konumu (stoktan karşılama), sonra serbest stoğu en çok
|
||||
-- olan konum (Prc_V_MaterialRequestPlanSource); kalan kısım satınalma: Prc_V_MaterialRequestPlanVendor'ın SuggestRank'ı ilk olan,
|
||||
-- fiyat listesinde ya da alım geçmişinde bulunan tedarikçi (hiç bilinmeyen kontak seçilmez, kalan planlanmadan kalır). Satırlar
|
||||
-- Prc_P_MaterialRequestPlanLineSave ile yazılır; kalem, stok ve kalan kuralları oradadır.
|
||||
CREATE OR REPLACE PROCEDURE public."Prc_P_MaterialRequestPlanSuggest"(
|
||||
p_id uuid,
|
||||
p_tenant_id uuid,
|
||||
p_last_modifier_id uuid
|
||||
)
|
||||
LANGUAGE plpgsql AS $$
|
||||
DECLARE v_left numeric(18, 4); v_qty numeric(18, 4); v_key varchar(80); s record;
|
||||
BEGIN
|
||||
DELETE FROM "Prc_T_MaterialRequestPlanLine" WHERE "MaterialRequestItemId" = p_id AND "TenantId" IS NOT DISTINCT FROM p_tenant_id;
|
||||
SELECT COALESCE("RemainingQuantity", 0) INTO v_left FROM public."Prc_V_MaterialRequestItemPlan" WHERE "Id" = p_id;
|
||||
v_left := COALESCE(v_left, 0);
|
||||
|
||||
FOR s IN SELECT "Id", "FreeQuantity"
|
||||
FROM public."Prc_V_MaterialRequestPlanSource"
|
||||
WHERE "BaseId" = p_id AND "FreeQuantity" > 0
|
||||
ORDER BY "IsDestination" DESC, "FreeQuantity" DESC
|
||||
LOOP
|
||||
EXIT WHEN v_left <= 0;
|
||||
v_qty := LEAST(s."FreeQuantity", v_left);
|
||||
CALL public."Prc_P_MaterialRequestPlanLineSave"(s."Id", 'Transfer', v_qty, p_tenant_id, p_last_modifier_id);
|
||||
v_left := v_left - v_qty;
|
||||
END LOOP;
|
||||
|
||||
IF v_left > 0 THEN
|
||||
SELECT "Id" INTO v_key
|
||||
FROM public."Prc_V_MaterialRequestPlanVendor"
|
||||
WHERE "BaseId" = p_id AND ("Price" IS NOT NULL OR "LastPurchaseDate" IS NOT NULL)
|
||||
ORDER BY "SuggestRank"
|
||||
LIMIT 1;
|
||||
IF v_key IS NOT NULL THEN
|
||||
CALL public."Prc_P_MaterialRequestPlanLineSave"(v_key, 'Purchase', v_left, p_tenant_id, p_last_modifier_id);
|
||||
END IF;
|
||||
END IF;
|
||||
END;
|
||||
$$;
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
-- Plan Takibi'nin Geri Al'ı (App.Prc.MaterialRequestPlanTrack › UpdateCommand): stoktan karşılamayı geri alır. Stoktan karşılama belge
|
||||
-- açmadığı için geri dönüşü kalemin kendisidir: stoktan karşılanan miktar teslim edilenden düşülür ve sıfırlanır, kalanı yeniden açılan
|
||||
-- kapalı kalem Bekliyor'a döner ve Planlama'da yeniden planlanır (Prc_P_MaterialRequestItemSync ile aynı kural).
|
||||
CREATE OR REPLACE PROCEDURE public."Prc_P_MaterialRequestStockUndo"(
|
||||
p_id uuid,
|
||||
p_tenant_id uuid,
|
||||
p_last_modifier_id uuid
|
||||
)
|
||||
LANGUAGE plpgsql AS $$
|
||||
BEGIN
|
||||
UPDATE "Prc_T_MaterialRequestItem"
|
||||
SET "DeliveredQuantity" = GREATEST("DeliveredQuantity" - "FromStockQuantity", 0),
|
||||
"FromStockQuantity" = 0, "LastModificationTime" = NOW() AT TIME ZONE 'UTC', "LastModifierId" = p_last_modifier_id
|
||||
WHERE "Id" = p_id AND "IsDeleted" = false AND "FromStockQuantity" > 0 AND "LineStatus" IN ('Waiting', 'Done')
|
||||
AND "TenantId" IS NOT DISTINCT FROM p_tenant_id;
|
||||
IF NOT FOUND THEN
|
||||
RAISE EXCEPTION 'Geri alınacak stoktan karşılama yok ya da kalem kapatılmış.' USING ERRCODE = 'P0001', DETAIL = '50202';
|
||||
END IF;
|
||||
|
||||
UPDATE "Prc_T_MaterialRequestItem" i SET "LineStatus" = 'Waiting'
|
||||
FROM public."Prc_V_MaterialRequestItemPlan" p
|
||||
WHERE p."Id" = i."Id" AND i."Id" = p_id AND i."LineStatus" = 'Done' AND p."RemainingQuantity" > 0 AND i."DeliveredQuantity" < i."Quantity";
|
||||
END;
|
||||
$$;
|
||||
|
|
@ -1,51 +0,0 @@
|
|||
-- Talep Kalemleri sekmesinde seçilen kalemi (p_key = belge|kalem) teklif talebine ya da taslak siparişe kopyalar.
|
||||
-- Kalem yalnız belgenin şubesindeki talepten gelir. Fiyat: sözleşme kalemi › tedarikçi fiyatı › 0; termin talebin istenen tarihidir.
|
||||
CREATE OR REPLACE PROCEDURE public."Prc_P_PurchaseImportItem"(p_key varchar)
|
||||
LANGUAGE plpgsql AS $$
|
||||
DECLARE v_doc uuid; v_item uuid; v_is_order boolean := false; v_tenant uuid; v_branch uuid; v_supplier uuid; v_agr uuid; v_status varchar(16);
|
||||
v_product uuid; v_description varchar(512); v_quantity numeric(18, 4); v_uom varchar(50); v_price numeric(18, 4);
|
||||
v_tax numeric(18, 4); v_due timestamp;
|
||||
BEGIN
|
||||
IF p_key !~* '^[0-9a-f-]{36}\|[0-9a-f-]{36}$' THEN
|
||||
RAISE EXCEPTION 'Talep kalemi yalnız teklif aşamasındaki teklif talebine ya da taslak siparişe aktarılabilir.' USING ERRCODE = 'P0001', DETAIL = '50161';
|
||||
END IF;
|
||||
v_doc := left(p_key, 36)::uuid;
|
||||
v_item := right(p_key, 36)::uuid;
|
||||
|
||||
SELECT "TenantId", "BranchId", "SupplierId", "AgreementId", "Status" INTO v_tenant, v_branch, v_supplier, v_agr, v_status
|
||||
FROM "Prc_T_PurchaseRfq" WHERE "Id" = v_doc AND "IsDeleted" = false AND "Status" IN ('Draft', 'Sent');
|
||||
IF v_status IS NULL THEN
|
||||
SELECT "TenantId", "BranchId", "SupplierId", "AgreementId", "Status", true INTO v_tenant, v_branch, v_supplier, v_agr, v_status, v_is_order
|
||||
FROM "Prc_T_PurchaseOrder" WHERE "Id" = v_doc AND "IsDeleted" = false AND "Status" = 'Draft';
|
||||
END IF;
|
||||
IF v_status IS NULL THEN
|
||||
RAISE EXCEPTION 'Talep kalemi yalnız teklif aşamasındaki teklif talebine ya da taslak siparişe aktarılabilir.' USING ERRCODE = 'P0001', DETAIL = '50161';
|
||||
END IF;
|
||||
|
||||
SELECT a."ProductId", a."RequestReason", a."Quantity", a."UomId", a."DueDate", COALESCE(p."PurchaseTaxRate", 0),
|
||||
COALESCE((SELECT al."UnitPrice" FROM "Prc_T_PurchaseAgreementLine" al
|
||||
WHERE al."AgreementId" = v_agr AND al."ProductId" = a."ProductId" AND al."IsDeleted" = false LIMIT 1),
|
||||
(SELECT ps."Price" FROM "Inv_T_ProductSupplier" ps
|
||||
WHERE ps."ProductId" = a."ProductId" AND ps."ContactId" = v_supplier AND ps."IsDeleted" = false
|
||||
ORDER BY ps."MinQuantity" LIMIT 1), 0)
|
||||
INTO v_product, v_description, v_quantity, v_uom, v_due, v_tax, v_price
|
||||
FROM "Prc_V_MaterialRequestAvailableItem" a
|
||||
LEFT JOIN "Inv_T_Product" p ON p."Id" = a."ProductId"
|
||||
WHERE a."Id" = v_item AND a."BranchId" = v_branch AND a."TenantId" IS NOT DISTINCT FROM v_tenant;
|
||||
IF v_product IS NULL THEN
|
||||
RAISE EXCEPTION 'Talep kalemi artık aktarılamaz: başka bir teklife ya da siparişe aktarılmış veya talep değişmiş.' USING ERRCODE = 'P0001', DETAIL = '50162';
|
||||
END IF;
|
||||
|
||||
IF v_is_order THEN
|
||||
INSERT INTO "Prc_T_PurchaseOrderLine" ("Id", "TenantId", "PurchaseOrderId", "ProductId", "Description", "Quantity", "UomId",
|
||||
"UnitPrice", "TaxRate", "Amount", "DeliveryDate", "MaterialRequestItemId", "CreationTime", "IsDeleted")
|
||||
VALUES (gen_random_uuid(), v_tenant, v_doc, v_product, v_description, v_quantity, v_uom, v_price, v_tax, 0, v_due, v_item, NOW() AT TIME ZONE 'UTC', false);
|
||||
CALL public."Prc_P_PurchaseOrderRecalc"(v_doc);
|
||||
ELSE
|
||||
INSERT INTO "Prc_T_PurchaseRfqLine" ("Id", "TenantId", "PurchaseRfqId", "ProductId", "Description", "Quantity", "UomId",
|
||||
"UnitPrice", "TaxRate", "Amount", "DeliveryDate", "MaterialRequestItemId", "CreationTime", "IsDeleted")
|
||||
VALUES (gen_random_uuid(), v_tenant, v_doc, v_product, v_description, v_quantity, v_uom, v_price, v_tax, 0, v_due, v_item, NOW() AT TIME ZONE 'UTC', false);
|
||||
CALL public."Prc_P_PurchaseRfqRecalc"(v_doc);
|
||||
END IF;
|
||||
END;
|
||||
$$;
|
||||
21
configs/seeds/postgres/object/Prc_TR_MaterialRequestLock.sql
Normal file
21
configs/seeds/postgres/object/Prc_TR_MaterialRequestLock.sql
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
-- Onaya gönderilmiş talebin başlığı değiştirilemez (Taleplerim ve talebi gösteren diğer ekranlar): değişiklik için talep Taslak adımına alınır,
|
||||
-- düzenlenir ve yeniden onaya gönderilir. Kural ekranın UpdateBeforeCommand'ında değil burada, çünkü onay akışı da başlığı aynı güncelleme
|
||||
-- yolundan yazar; yalnız iş alanları karşılaştırılır, onay alanları (durum, onaycı, tarih, açıklama, onaycı listeleri) ve silme serbesttir.
|
||||
-- Satırların kuralı App.Prc.MaterialRequestLine'ın Insert/Update/DeleteBeforeCommand'ındadır.
|
||||
CREATE OR REPLACE FUNCTION public."Prc_TR_MaterialRequestLock"() RETURNS trigger
|
||||
LANGUAGE plpgsql AS $$
|
||||
BEGIN
|
||||
IF COALESCE(OLD."ApprovalStatus", '') <> '' AND NOT NEW."IsDeleted"
|
||||
AND (NEW."Priority", NEW."RequesterUserId", NEW."BranchId", NEW."DepartmentId", NEW."WarehouseId", NEW."LocationId", NEW."RequestDate", NEW."Description")
|
||||
IS DISTINCT FROM
|
||||
(OLD."Priority", OLD."RequesterUserId", OLD."BranchId", OLD."DepartmentId", OLD."WarehouseId", OLD."LocationId", OLD."RequestDate", OLD."Description") THEN
|
||||
RAISE EXCEPTION 'Onaya gönderilmiş talep değiştirilemez: önce talebi Taslak adımına alın, düzenleyip yeniden onaya gönderin.'
|
||||
USING ERRCODE = 'P0001', DETAIL = '50004';
|
||||
END IF;
|
||||
RETURN NEW;
|
||||
END;
|
||||
$$;
|
||||
|
||||
DROP TRIGGER IF EXISTS "Prc_TR_MaterialRequestLock" ON public."Prc_T_MaterialRequest";
|
||||
CREATE TRIGGER "Prc_TR_MaterialRequestLock" BEFORE UPDATE ON public."Prc_T_MaterialRequest"
|
||||
FOR EACH ROW EXECUTE FUNCTION public."Prc_TR_MaterialRequestLock"();
|
||||
|
|
@ -6,11 +6,10 @@ CREATE TABLE IF NOT EXISTS public."Prc_T_MaterialRequestItem"
|
|||
"ProductId" uuid NOT NULL,
|
||||
"Quantity" numeric(18, 4) NOT NULL,
|
||||
"UomId" varchar(64) NOT NULL,
|
||||
"FulfillmentMethod" varchar(16) NOT NULL DEFAULT 'Purchase',
|
||||
"DueDate" date NOT NULL,
|
||||
"RequestReason" varchar(256) NOT NULL,
|
||||
"DeliveredQuantity" numeric(18, 4) NOT NULL DEFAULT 0,
|
||||
"PurchaseResponsibleUserId" uuid NULL,
|
||||
"FromStockQuantity" numeric(18, 4) NOT NULL DEFAULT 0,
|
||||
"LineStatus" varchar(16) NOT NULL DEFAULT 'Waiting',
|
||||
"CreationTime" timestamp NOT NULL DEFAULT (NOW() AT TIME ZONE 'UTC'),
|
||||
"CreatorId" uuid NULL,
|
||||
|
|
|
|||
|
|
@ -1,33 +0,0 @@
|
|||
CREATE TABLE IF NOT EXISTS public."Prc_T_MaterialRequestLine"
|
||||
(
|
||||
"Id" uuid NOT NULL DEFAULT gen_random_uuid(),
|
||||
"TenantId" uuid NULL,
|
||||
"MaterialRequestId" uuid NOT NULL,
|
||||
"ProductId" uuid NOT NULL,
|
||||
"Quantity" numeric(18, 4) NOT NULL,
|
||||
"UomId" uuid NOT NULL,
|
||||
"FulfillmentMethod" varchar(16) NOT NULL DEFAULT 'Purchase',
|
||||
"DueDate" date NOT NULL,
|
||||
"RequestReason" varchar(256) NOT NULL,
|
||||
"DeliveredQuantity" numeric(18, 4) NOT NULL DEFAULT 0,
|
||||
"PurchaseResponsibleUserId" uuid NULL,
|
||||
"LineStatus" varchar(16) NOT NULL DEFAULT 'Waiting',
|
||||
"CreationTime" timestamp NOT NULL DEFAULT (NOW() AT TIME ZONE 'UTC'),
|
||||
"CreatorId" uuid NULL,
|
||||
"LastModificationTime" timestamp NULL,
|
||||
"LastModifierId" uuid NULL,
|
||||
"IsDeleted" boolean NOT NULL DEFAULT FALSE,
|
||||
"DeletionTime" timestamp NULL,
|
||||
"DeleterId" uuid NULL,
|
||||
CONSTRAINT "PK_Prc_T_MaterialRequestLine" PRIMARY KEY ("Id")
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS "IX_Prc_T_MaterialRequestLine_MaterialRequestId" ON public."Prc_T_MaterialRequestLine" ("MaterialRequestId");
|
||||
|
||||
DO $$
|
||||
BEGIN
|
||||
IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'FK_Prc_T_MaterialRequestLine_MaterialRequestId') THEN
|
||||
ALTER TABLE public."Prc_T_MaterialRequestLine" ADD CONSTRAINT "FK_Prc_T_MaterialRequestLine_MaterialRequestId" FOREIGN KEY ("MaterialRequestId") REFERENCES public."Prc_T_MaterialRequest" ("Id") ON DELETE CASCADE ON UPDATE NO ACTION;
|
||||
END IF;
|
||||
END
|
||||
$$;
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
-- Planla diyaloğunun taslak karşılama planı: talep kaleminin onaylanmamış dağıtımı (iç transfer: kaynak konum, satınalma: tedarikçi) ve
|
||||
-- miktarı. Onay (Prc_P_MaterialRequestPlanConfirm) satırları teklif talebine ya da iç transfere çevirir ve siler.
|
||||
CREATE TABLE IF NOT EXISTS public."Prc_T_MaterialRequestPlanLine"
|
||||
(
|
||||
"Id" uuid NOT NULL DEFAULT gen_random_uuid(),
|
||||
"TenantId" uuid NULL,
|
||||
"MaterialRequestItemId" uuid NOT NULL,
|
||||
"PlanMethod" varchar(16) NOT NULL,
|
||||
"SupplierId" uuid NULL,
|
||||
"SourceLocationId" uuid NULL,
|
||||
"Quantity" numeric(18, 4) NOT NULL DEFAULT 0,
|
||||
"CreationTime" timestamp NOT NULL DEFAULT (NOW() AT TIME ZONE 'UTC'),
|
||||
"CreatorId" uuid NULL,
|
||||
"LastModificationTime" timestamp NULL,
|
||||
"LastModifierId" uuid NULL,
|
||||
"IsDeleted" boolean NOT NULL DEFAULT FALSE,
|
||||
"DeletionTime" timestamp NULL,
|
||||
"DeleterId" uuid NULL,
|
||||
CONSTRAINT "PK_Prc_T_MaterialRequestPlanLine" PRIMARY KEY ("Id")
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS "IX_Prc_T_MaterialRequestPlanLine_MaterialRequestItemId" ON public."Prc_T_MaterialRequestPlanLine" ("MaterialRequestItemId");
|
||||
|
||||
DO $$
|
||||
BEGIN
|
||||
IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'FK_Prc_T_MaterialRequestPlanLine_MaterialRequestItemId') THEN
|
||||
ALTER TABLE public."Prc_T_MaterialRequestPlanLine" ADD CONSTRAINT "FK_Prc_T_MaterialRequestPlanLine_MaterialRequestItemId" FOREIGN KEY ("MaterialRequestItemId") REFERENCES public."Prc_T_MaterialRequestItem" ("Id") ON DELETE CASCADE ON UPDATE NO ACTION;
|
||||
END IF;
|
||||
END
|
||||
$$;
|
||||
|
|
@ -1,18 +0,0 @@
|
|||
-- Teklife ya da siparişe aktarılabilecek talep kalemleri: onaylı talebin satınalma ile karşılanacak,
|
||||
-- bekleyen ve iptal olmayan bir teklif/siparişte yer almayan kalemi. Aktarım ve talep seçimi buradan okur.
|
||||
CREATE OR REPLACE VIEW public."Prc_V_MaterialRequestAvailableItem" AS
|
||||
SELECT i."Id", i."TenantId", i."MaterialRequestId", r."RequestNo", r."RequesterUserId", i."ProductId", i."Quantity", i."UomId",
|
||||
i."RequestReason", i."DueDate", r."BranchId"
|
||||
FROM "Prc_T_MaterialRequestItem" i
|
||||
INNER JOIN "Prc_T_MaterialRequest" r ON r."Id" = i."MaterialRequestId"
|
||||
WHERE i."IsDeleted" = false AND r."IsDeleted" = false
|
||||
AND r."ApprovalStatus" IN ('Onaylandı', 'Teklif Talebi', 'Teklif Talebi Gönderildi', 'Satınalma Siparişi')
|
||||
AND i."FulfillmentMethod" = 'Purchase' AND i."LineStatus" = 'Waiting'
|
||||
AND NOT EXISTS (SELECT 1 FROM "Prc_T_PurchaseRfqLine" rl
|
||||
INNER JOIN "Prc_T_PurchaseRfq" q ON q."Id" = rl."PurchaseRfqId"
|
||||
WHERE rl."MaterialRequestItemId" = i."Id" AND rl."IsDeleted" = false
|
||||
AND q."IsDeleted" = false AND q."Status" <> 'Cancelled')
|
||||
AND NOT EXISTS (SELECT 1 FROM "Prc_T_PurchaseOrderLine" ol
|
||||
INNER JOIN "Prc_T_PurchaseOrder" o ON o."Id" = ol."PurchaseOrderId"
|
||||
WHERE ol."MaterialRequestItemId" = i."Id" AND ol."IsDeleted" = false
|
||||
AND o."IsDeleted" = false AND o."Status" <> 'Cancelled');
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
-- Talep kaleminin planlanmış payları ve planlanacak kalanı (Planlama, Plan Takibi, kalem durumu). Miktarlar kalemin birimine çevrilir.
|
||||
-- Satınalma payı: teklif aşamasındaki teklif talebinde ya da iptal olmayan siparişe geçmiş teklif kaleminde duran miktar; ihale aynı kalemi
|
||||
-- bütün tedarikçilere kopyaladığı için ihale × ihale kalemi başına bir kez (en büyüğü) sayılır.
|
||||
-- Transfer payı: iptal olmayan iç transfer satırı — tamamlanmış belgede yapılan, açık belgede istenen miktar (eksik tamamlanan belgenin kalanı
|
||||
-- backorder belgesinde istenir); iade belgesi sayılmaz.
|
||||
-- Stok payı: stok talebin teslim konumundayken onaylanan, belgesiz karşılanan miktar (FromStockQuantity).
|
||||
CREATE OR REPLACE VIEW public."Prc_V_MaterialRequestItemPlan" AS
|
||||
SELECT i."Id", i."TenantId", COALESCE(pq."Quantity", 0) AS "PurchaseQuantity", COALESCE(tq."Quantity", 0) AS "TransferQuantity",
|
||||
i."Quantity" - COALESCE(pq."Quantity", 0) - COALESCE(tq."Quantity", 0) - i."FromStockQuantity" AS "RemainingQuantity",
|
||||
i."FromStockQuantity"
|
||||
FROM "Prc_T_MaterialRequestItem" i
|
||||
LEFT JOIN LATERAL (
|
||||
SELECT SUM(g."Quantity") AS "Quantity"
|
||||
FROM (SELECT MAX(public."Inv_F_UomConvert"(rl."Quantity", rl."UomId", i."UomId")) AS "Quantity"
|
||||
FROM "Prc_T_PurchaseRfqLine" rl
|
||||
INNER JOIN "Prc_T_PurchaseRfq" q ON q."Id" = rl."PurchaseRfqId"
|
||||
WHERE rl."MaterialRequestItemId" = i."Id" AND rl."IsDeleted" = false AND q."IsDeleted" = false
|
||||
AND (q."Status" IN ('Draft', 'Sent')
|
||||
OR (q."Status" = 'Purchase'
|
||||
AND EXISTS (SELECT 1 FROM "Prc_T_PurchaseOrderLine" ol
|
||||
INNER JOIN "Prc_T_PurchaseOrder" o ON o."Id" = ol."PurchaseOrderId"
|
||||
WHERE ol."PurchaseRfqLineId" = rl."Id" AND ol."IsDeleted" = false
|
||||
AND o."IsDeleted" = false AND o."Status" <> 'Cancelled')))
|
||||
GROUP BY COALESCE(q."TenderGroupId", q."Id"), COALESCE(rl."TenderLineId", rl."Id")) g) pq ON true
|
||||
LEFT JOIN LATERAL (
|
||||
SELECT SUM(public."Inv_F_UomConvert"(CASE WHEN t."Status" = 'Done' THEN tl."Quantity" ELSE tl."DemandQuantity" END, tl."UomId", i."UomId")) AS "Quantity"
|
||||
FROM "Inv_T_TransferLine" tl
|
||||
INNER JOIN "Inv_T_Transfer" t ON t."Id" = tl."TransferId"
|
||||
WHERE tl."MaterialRequestItemId" = i."Id" AND tl."IsDeleted" = false AND t."IsDeleted" = false
|
||||
AND t."OperationKind" = 'InternalTransfer' AND t."Status" <> 'Cancelled' AND t."ReturnOfId" IS NULL) tq ON true
|
||||
WHERE i."IsDeleted" = false;
|
||||
|
|
@ -5,7 +5,7 @@ AS
|
|||
SELECT COALESCE(i."Id", r."Id") AS "Id", r."Id" AS "MaterialRequestId", r."TenantId", r."IsDeleted",
|
||||
r."RequestNo", r."Priority", r."RequesterUserId", r."DepartmentId", r."WarehouseId", r."LocationId", r."RequestDate",
|
||||
r."Description", r."ApprovalStatus", r."ApprovalUserName", r."ApprovalDate", r."ApprovalDescription",
|
||||
i."ProductId", i."Quantity", i."UomId", i."FulfillmentMethod", i."DueDate", i."RequestReason", i."DeliveredQuantity",
|
||||
i."PurchaseResponsibleUserId", i."LineStatus", r."BranchId"
|
||||
i."ProductId", i."Quantity", i."UomId", i."DueDate", i."RequestReason", i."DeliveredQuantity",
|
||||
i."LineStatus", r."BranchId"
|
||||
FROM "Prc_T_MaterialRequest" r
|
||||
LEFT JOIN "Prc_T_MaterialRequestItem" i ON i."MaterialRequestId" = r."Id" AND i."IsDeleted" = FALSE;
|
||||
|
|
|
|||
23
configs/seeds/postgres/object/Prc_V_MaterialRequestPlan.sql
Normal file
23
configs/seeds/postgres/object/Prc_V_MaterialRequestPlan.sql
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
-- Planlama (App.Prc.MaterialRequestPlan): onaylanmış (satınalmada ilerleyen dahil) talebin bekleyen ve planlanacak miktarı kalan kalemleri.
|
||||
-- Stok bütün iç konumların toplamıdır (kalemin biriminde); DueState termin süzgecidir (Late / Week = 7 gün içinde / Later). Taslak Plan,
|
||||
-- Planla diyaloğunda girilip henüz onaylanmamış dağıtımın toplamıdır (Prc_T_MaterialRequestPlanLine).
|
||||
CREATE OR REPLACE VIEW public."Prc_V_MaterialRequestPlan" AS
|
||||
SELECT i."Id", i."TenantId", i."MaterialRequestId", r."RequestNo", r."Priority", r."RequesterUserId", r."BranchId", r."DepartmentId", r."WarehouseId", r."LocationId",
|
||||
r."RequestDate", i."ProductId", p."CategoryId", i."Quantity", i."UomId", i."DueDate",
|
||||
CAST(CASE WHEN i."DueDate" < CURRENT_DATE THEN 'Late'
|
||||
WHEN i."DueDate" <= CURRENT_DATE + 7 THEN 'Week' ELSE 'Later' END AS varchar(8)) AS "DueState",
|
||||
i."RequestReason",
|
||||
pl."PurchaseQuantity", pl."TransferQuantity", pl."RemainingQuantity", COALESCE(st."Quantity", 0) AS "StockQuantity",
|
||||
(SELECT SUM(x."Quantity") FROM "Prc_T_MaterialRequestPlanLine" x WHERE x."MaterialRequestItemId" = i."Id" AND x."IsDeleted" = false) AS "DraftQuantity",
|
||||
i."IsDeleted"
|
||||
FROM "Prc_T_MaterialRequestItem" i
|
||||
INNER JOIN "Prc_T_MaterialRequest" r ON r."Id" = i."MaterialRequestId"
|
||||
INNER JOIN public."Prc_V_MaterialRequestItemPlan" pl ON pl."Id" = i."Id"
|
||||
LEFT JOIN "Inv_T_Product" p ON p."Id" = i."ProductId"
|
||||
LEFT JOIN LATERAL (
|
||||
SELECT SUM(public."Inv_F_UomConvert"(s."Quantity", s."UomId", i."UomId")) AS "Quantity"
|
||||
FROM "Inv_T_Stock" s
|
||||
INNER JOIN "Inv_T_Location" l ON l."Id" = s."LocationId" AND l."LocationType" = 'Internal'
|
||||
WHERE s."ProductId" = i."ProductId" AND s."IsDeleted" = false) st ON true
|
||||
WHERE i."IsDeleted" = false AND r."IsDeleted" = false AND i."LineStatus" = 'Waiting' AND pl."RemainingQuantity" > 0
|
||||
AND r."ApprovalStatus" IN ('Onaylandı', 'Teklif Talebi', 'Teklif Talebi Gönderildi', 'Satınalma Siparişi');
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
-- Planla diyaloğunun Karşılama Planı ızgarası (App.Prc.MaterialRequestPlanLine): talep kaleminin onay bekleyen taslak planı. Miktar kalemin
|
||||
-- biriminde; satınalmada birim fiyat teklif kalemine yazılacak fiyattır (tedarikçinin en düşük minimum miktarlı satırı). BaseId kalemdir.
|
||||
CREATE OR REPLACE VIEW public."Prc_V_MaterialRequestPlanLine" AS
|
||||
SELECT pl."Id", pl."TenantId", pl."MaterialRequestItemId" AS "BaseId", pl."PlanMethod", pl."SupplierId", pl."SourceLocationId", pl."Quantity",
|
||||
i."UomId", ps."Price", ps."CurrencyId", pl."CreationTime", pl."CreatorId", pl."IsDeleted"
|
||||
FROM "Prc_T_MaterialRequestPlanLine" pl
|
||||
INNER JOIN "Prc_T_MaterialRequestItem" i ON i."Id" = pl."MaterialRequestItemId"
|
||||
LEFT JOIN LATERAL (SELECT x."Price", x."CurrencyId"
|
||||
FROM "Inv_T_ProductSupplier" x
|
||||
WHERE pl."PlanMethod" = 'Purchase' AND x."ProductId" = i."ProductId" AND x."ContactId" = pl."SupplierId"
|
||||
AND x."IsDeleted" = false
|
||||
ORDER BY x."MinQuantity"
|
||||
LIMIT 1) ps ON TRUE;
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
-- Planla diyaloğunun İç Transfer ızgarası (App.Prc.MaterialRequestPlanSource) ve iç transfer / stoktan karşılama kararlarının stok kuralı:
|
||||
-- talep kaleminin ürününün stoğu olan iç konumlar. Talebin teslim konumu da listelenir (IsDestination): oraya yazılan plan transfer açmaz,
|
||||
-- stoktan karşılanır (PlanMethod = Stock). Miktarlar kalemin biriminde; ayrılan = açık (Taslak/Bekleyen/Hazır) transferlerde o
|
||||
-- konumdan istenen, serbest = eldeki − ayrılan. Plan Miktarı kalemin bu konum için taslak planıdır. BaseId diyaloğun süzdüğü kalem, Id
|
||||
-- kalem + ':' + konumdur (Prc_P_MaterialRequestPlanLineSave ayırır); taslak kaydı ve onay serbest stoğu buradan okur.
|
||||
-- MaxQuantity satıra yazılabilecek en fazla plan miktarıdır: serbest stok ile planlanacak kalandan kalemin diğer taslak satırları
|
||||
-- düşüldükten sonra kalanın küçüğü (ızgaranın doğrulaması; kayıt yordamı aynı kuralı yeniden denetler).
|
||||
CREATE OR REPLACE VIEW public."Prc_V_MaterialRequestPlanSource" AS
|
||||
SELECT CAST(i."Id" AS varchar(36)) || ':' || CAST(st."LocationId" AS varchar(36)) AS "Id", i."TenantId", i."Id" AS "BaseId",
|
||||
l."BranchId", l."WarehouseId", st."LocationId", st."OnHand", COALESCE(rs."Quantity", 0) AS "ReservedQuantity",
|
||||
st."OnHand" - COALESCE(rs."Quantity", 0) AS "FreeQuantity", i."UomId", pl."Quantity" AS "PlanQuantity", i."IsDeleted",
|
||||
st."LocationId" = r."LocationId" AS "IsDestination",
|
||||
GREATEST(0, LEAST(st."OnHand" - COALESCE(rs."Quantity", 0), ip."RemainingQuantity" - COALESCE(od."Quantity", 0))) AS "MaxQuantity"
|
||||
FROM "Prc_T_MaterialRequestItem" i
|
||||
INNER JOIN "Prc_T_MaterialRequest" r ON r."Id" = i."MaterialRequestId"
|
||||
CROSS JOIN LATERAL (SELECT s."LocationId", SUM(public."Inv_F_UomConvert"(s."Quantity", s."UomId", i."UomId")) AS "OnHand"
|
||||
FROM "Inv_T_Stock" s
|
||||
WHERE s."ProductId" = i."ProductId" AND s."IsDeleted" = false
|
||||
GROUP BY s."LocationId"
|
||||
HAVING SUM(s."Quantity") > 0) st
|
||||
INNER JOIN "Inv_T_Location" l ON l."Id" = st."LocationId" AND l."LocationType" = 'Internal' AND l."IsDeleted" = false
|
||||
LEFT JOIN LATERAL (SELECT SUM(public."Inv_F_UomConvert"(tl."DemandQuantity", tl."UomId", i."UomId")) AS "Quantity"
|
||||
FROM "Inv_T_TransferLine" tl
|
||||
INNER JOIN "Inv_T_Transfer" t ON t."Id" = tl."TransferId"
|
||||
WHERE t."SourceLocationId" = st."LocationId" AND tl."ProductId" = i."ProductId" AND tl."IsDeleted" = false
|
||||
AND t."IsDeleted" = false AND t."Status" IN ('Draft', 'Waiting', 'Ready')) rs ON TRUE
|
||||
LEFT JOIN "Prc_T_MaterialRequestPlanLine" pl
|
||||
ON pl."MaterialRequestItemId" = i."Id" AND pl."PlanMethod" IN ('Transfer', 'Stock') AND pl."SourceLocationId" = st."LocationId" AND pl."IsDeleted" = false
|
||||
INNER JOIN public."Prc_V_MaterialRequestItemPlan" ip ON ip."Id" = i."Id"
|
||||
LEFT JOIN LATERAL (SELECT SUM(x."Quantity") AS "Quantity"
|
||||
FROM "Prc_T_MaterialRequestPlanLine" x
|
||||
WHERE x."MaterialRequestItemId" = i."Id" AND x."IsDeleted" = false
|
||||
AND (x."SourceLocationId" IS NULL OR x."SourceLocationId" <> st."LocationId")) od ON TRUE
|
||||
WHERE i."IsDeleted" = false;
|
||||
|
|
@ -0,0 +1,43 @@
|
|||
-- Plan Takibi (App.Prc.MaterialRequestPlanTrack): talep kalemleri için verilen her karar — satınalmada ihalenin kök teklif talebindeki kalem
|
||||
-- (alternatif tedarikçilere kopyalanan satırlar tekrar listelenmez; siparişe dönüştüyse ihale kaleminin siparişi ve tedarikçisi), iç
|
||||
-- transferde transfer satırı, stoktan karşılamada kalemin kendisi (belgesiz; konum talebin teslim konumu). Gerçekleşen: siparişte alınan,
|
||||
-- transferde tamamlanmış belgede yapılan, stokta karşılanan miktar.
|
||||
CREATE OR REPLACE VIEW public."Prc_V_MaterialRequestPlanTrack" AS
|
||||
SELECT rl."Id", rl."TenantId", i."Id" AS "MaterialRequestItemId", i."MaterialRequestId", r."RequestNo", r."BranchId", r."DepartmentId", r."WarehouseId",
|
||||
r."LocationId", i."ProductId", i."DueDate", CAST('Purchase' AS varchar(16)) AS "PlanMethod", q."Id" AS "DocumentId", q."RfqNo" AS "DocumentNo",
|
||||
q."Status" AS "DocumentStatus", COALESCE(o."SupplierId", q."SupplierId") AS "SupplierId", CAST(NULL AS uuid) AS "SourceLocationId",
|
||||
o."Id" AS "PurchaseOrderId", o."OrderNo" AS "PurchaseOrderNo", o."Status" AS "OrderStatus", rl."Quantity", rl."UomId",
|
||||
COALESCE(o."ReceivedQuantity", 0) AS "DoneQuantity", rl."CreationTime" AS "PlanDate", rl."CreatorId" AS "PlannerUserId", rl."IsDeleted"
|
||||
FROM "Prc_T_PurchaseRfqLine" rl
|
||||
INNER JOIN "Prc_T_PurchaseRfq" q ON q."Id" = rl."PurchaseRfqId" AND q."IsDeleted" = false AND q."Id" = COALESCE(q."TenderGroupId", q."Id")
|
||||
INNER JOIN "Prc_T_MaterialRequestItem" i ON i."Id" = rl."MaterialRequestItemId"
|
||||
INNER JOIN "Prc_T_MaterialRequest" r ON r."Id" = i."MaterialRequestId"
|
||||
LEFT JOIN LATERAL (
|
||||
SELECT po."Id", po."OrderNo", po."Status", po."SupplierId", ol."ReceivedQuantity"
|
||||
FROM "Prc_T_PurchaseRfqLine" al
|
||||
INNER JOIN "Prc_T_PurchaseOrderLine" ol ON ol."PurchaseRfqLineId" = al."Id" AND ol."IsDeleted" = false
|
||||
INNER JOIN "Prc_T_PurchaseOrder" po ON po."Id" = ol."PurchaseOrderId" AND po."IsDeleted" = false
|
||||
WHERE al."TenderLineId" = COALESCE(rl."TenderLineId", rl."Id") AND al."IsDeleted" = false
|
||||
ORDER BY CASE WHEN po."Status" = 'Cancelled' THEN 1 ELSE 0 END, po."CreationTime" DESC
|
||||
LIMIT 1) o ON true
|
||||
WHERE rl."IsDeleted" = false
|
||||
UNION ALL
|
||||
SELECT tl."Id", tl."TenantId", i."Id", i."MaterialRequestId", r."RequestNo", r."BranchId", r."DepartmentId", r."WarehouseId",
|
||||
r."LocationId", i."ProductId", i."DueDate", CAST('Transfer' AS varchar(16)), t."Id", t."TransferNo",
|
||||
t."Status", NULL, t."SourceLocationId",
|
||||
NULL, NULL, NULL, tl."DemandQuantity", tl."UomId",
|
||||
CASE WHEN t."Status" = 'Done' THEN tl."Quantity" ELSE 0 END, tl."CreationTime", tl."CreatorId", tl."IsDeleted"
|
||||
FROM "Inv_T_TransferLine" tl
|
||||
INNER JOIN "Inv_T_Transfer" t ON t."Id" = tl."TransferId" AND t."IsDeleted" = false AND t."OperationKind" = 'InternalTransfer' AND t."ReturnOfId" IS NULL
|
||||
INNER JOIN "Prc_T_MaterialRequestItem" i ON i."Id" = tl."MaterialRequestItemId"
|
||||
INNER JOIN "Prc_T_MaterialRequest" r ON r."Id" = i."MaterialRequestId"
|
||||
WHERE tl."IsDeleted" = false
|
||||
UNION ALL
|
||||
SELECT i."Id", i."TenantId", i."Id", i."MaterialRequestId", r."RequestNo", r."BranchId", r."DepartmentId", r."WarehouseId",
|
||||
r."LocationId", i."ProductId", i."DueDate", CAST('Stock' AS varchar(16)), NULL, NULL,
|
||||
NULL, NULL, r."LocationId",
|
||||
NULL, NULL, NULL, i."FromStockQuantity", i."UomId",
|
||||
i."FromStockQuantity", i."LastModificationTime", i."LastModifierId", i."IsDeleted"
|
||||
FROM "Prc_T_MaterialRequestItem" i
|
||||
INNER JOIN "Prc_T_MaterialRequest" r ON r."Id" = i."MaterialRequestId"
|
||||
WHERE i."FromStockQuantity" > 0;
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
-- Planla diyaloğunun Satınalma ızgarası (App.Prc.MaterialRequestPlanVendor): kiracının bütün aktif kontakları; ürünün fiyat listesindekiler
|
||||
-- fiyatıyla, diğerleri fiyatsız gelir. SuggestRank ızgaranın sırası ve Öner'in seçtiği tedarikçidir: fiyatlılar ucuzdan pahalıya, sonra son alım
|
||||
-- tarihi yeniden eskiye, sonra ad (para birimi farkı gözetilmez). Fiyat satırı teklif kalemine yazılanla aynıdır (en düşük minimum
|
||||
-- miktarlı satır, Prc_P_MaterialRequestPlan); son alım tarihini siparişli alım yazar.
|
||||
-- Plan Miktarı kalemin bu tedarikçi için taslak planıdır; Rfq* tedarikçinin talebin şubesi ve deposu için bu kalemi taşıyan taslak teklif
|
||||
-- talebidir (satırdaki Teklifi Aç). BaseId diyaloğun süzdüğü kalem, Id kalem + ':' + tedarikçidir (Prc_P_MaterialRequestPlanLineSave ayırır).
|
||||
-- MaxQuantity satıra yazılabilecek en fazla plan miktarıdır: planlanacak kalandan kalemin diğer taslak satırları düşülür.
|
||||
CREATE OR REPLACE VIEW public."Prc_V_MaterialRequestPlanVendor" AS
|
||||
SELECT CAST(i."Id" AS varchar(36)) || ':' || CAST(c."Id" AS varchar(36)) AS "Id", i."TenantId", i."Id" AS "BaseId", c."Id" AS "ContactId",
|
||||
ps."MinQuantity", ps."UomId", ps."Price", ps."CurrencyId", ps."LeadTimeDays", ps."LastPurchaseDate", pl."Quantity" AS "PlanQuantity",
|
||||
d."Id" AS "RfqId", d."RfqNo", d."Quantity" AS "RfqQuantity", i."IsDeleted",
|
||||
ROW_NUMBER() OVER (PARTITION BY i."Id" ORDER BY ps."Price" ASC NULLS LAST, ps."LastPurchaseDate" DESC NULLS LAST, c."Name") AS "SuggestRank",
|
||||
GREATEST(0, ip."RemainingQuantity" - COALESCE(od."Quantity", 0)) AS "MaxQuantity"
|
||||
FROM "Prc_T_MaterialRequestItem" i
|
||||
INNER JOIN "Prc_T_MaterialRequest" r ON r."Id" = i."MaterialRequestId"
|
||||
INNER JOIN "Adm_T_Contact" c ON c."IsDeleted" = false AND c."IsActive" = true AND c."TenantId" IS NOT DISTINCT FROM i."TenantId"
|
||||
LEFT JOIN LATERAL (SELECT x."MinQuantity", x."UomId", x."Price", x."CurrencyId", x."LeadTimeDays", x."LastPurchaseDate"
|
||||
FROM "Inv_T_ProductSupplier" x
|
||||
WHERE x."ProductId" = i."ProductId" AND x."ContactId" = c."Id" AND x."IsDeleted" = false
|
||||
ORDER BY x."MinQuantity"
|
||||
LIMIT 1) ps ON TRUE
|
||||
LEFT JOIN "Prc_T_MaterialRequestPlanLine" pl
|
||||
ON pl."MaterialRequestItemId" = i."Id" AND pl."PlanMethod" = 'Purchase' AND pl."SupplierId" = c."Id" AND pl."IsDeleted" = false
|
||||
LEFT JOIN LATERAL (SELECT q."Id", q."RfqNo", ql."Quantity"
|
||||
FROM "Prc_T_PurchaseRfq" q
|
||||
INNER JOIN "Prc_T_PurchaseRfqLine" ql ON ql."PurchaseRfqId" = q."Id" AND ql."MaterialRequestItemId" = i."Id" AND ql."IsDeleted" = false
|
||||
WHERE q."IsDeleted" = false AND q."Status" = 'Draft' AND q."SupplierId" = c."Id" AND q."BranchId" = r."BranchId"
|
||||
AND q."WarehouseId" = r."WarehouseId"
|
||||
ORDER BY q."CreationTime" DESC
|
||||
LIMIT 1) d ON TRUE
|
||||
INNER JOIN public."Prc_V_MaterialRequestItemPlan" ip ON ip."Id" = i."Id"
|
||||
LEFT JOIN LATERAL (SELECT SUM(x."Quantity") AS "Quantity"
|
||||
FROM "Prc_T_MaterialRequestPlanLine" x
|
||||
WHERE x."MaterialRequestItemId" = i."Id" AND x."IsDeleted" = false
|
||||
AND (x."SupplierId" IS NULL OR x."SupplierId" <> c."Id")) od ON TRUE
|
||||
WHERE i."IsDeleted" = false;
|
||||
|
|
@ -1,17 +0,0 @@
|
|||
-- İç transfere aktarılabilecek talep kalemleri: onaylı talebin transferle karşılanacak, bekleyen ve açık bir transferde yer almayan
|
||||
-- kalemi, aynı şubedeki taslak iç transfer belgesiyle eşlenir. Id = belge|kalem; Talepten Aktar seçilen satırları Inv_P_TransferImportItem ile ekler.
|
||||
CREATE OR REPLACE VIEW public."Prc_V_MaterialRequestTransferItem" AS
|
||||
SELECT d."Id"::text || '|' || i."Id"::text AS "Id", d."Id" AS "BaseId", i."TenantId", i."Id" AS "MaterialRequestItemId",
|
||||
i."MaterialRequestId", r."RequestNo", r."RequesterUserId", i."ProductId", i."Quantity" - i."DeliveredQuantity" AS "Quantity", i."UomId",
|
||||
i."RequestReason", i."DueDate", r."WarehouseId", r."LocationId"
|
||||
FROM "Inv_T_Transfer" d
|
||||
INNER JOIN "Prc_T_MaterialRequest" r ON r."BranchId" = d."BranchId" AND r."TenantId" IS NOT DISTINCT FROM d."TenantId"
|
||||
INNER JOIN "Prc_T_MaterialRequestItem" i ON i."MaterialRequestId" = r."Id"
|
||||
WHERE d."IsDeleted" = false AND d."OperationKind" = 'InternalTransfer' AND d."Status" = 'Draft'
|
||||
AND r."IsDeleted" = false AND i."IsDeleted" = false
|
||||
AND r."ApprovalStatus" IN ('Onaylandı', 'Teklif Talebi', 'Teklif Talebi Gönderildi', 'Satınalma Siparişi')
|
||||
AND i."FulfillmentMethod" = 'Transfer' AND i."LineStatus" = 'Waiting' AND i."Quantity" > i."DeliveredQuantity"
|
||||
AND NOT EXISTS (SELECT 1 FROM "Inv_T_TransferLine" tl
|
||||
INNER JOIN "Inv_T_Transfer" t ON t."Id" = tl."TransferId"
|
||||
WHERE tl."MaterialRequestItemId" = i."Id" AND tl."IsDeleted" = false
|
||||
AND t."IsDeleted" = false AND t."Status" NOT IN ('Done', 'Cancelled'));
|
||||
|
|
@ -1,9 +0,0 @@
|
|||
-- Talep Kalemleri sekmesi: aktarılabilir her talep kalemi, kalem alabilecek açık belgeyle (teklif aşamasındaki
|
||||
-- teklif talebi ya da taslak sipariş) eşlenir; belge yalnız kendi şubesinin talebini alır. Id = belge|kalem; seçilen satırları Seçilenleri Aktar ile Prc_P_PurchaseImportItem kopyalar.
|
||||
CREATE OR REPLACE VIEW public."Prc_V_PurchaseImportItem" AS
|
||||
SELECT d."Id"::text || '|' || a."Id"::text AS "Id", d."Id" AS "BaseId", a."TenantId", a."MaterialRequestId",
|
||||
a."RequestNo", a."RequesterUserId", a."ProductId", a."Quantity", a."UomId", a."RequestReason", a."DueDate"
|
||||
FROM (SELECT "Id", "TenantId", "BranchId" FROM "Prc_T_PurchaseRfq" WHERE "IsDeleted" = false AND "Status" IN ('Draft', 'Sent')
|
||||
UNION ALL
|
||||
SELECT "Id", "TenantId", "BranchId" FROM "Prc_T_PurchaseOrder" WHERE "IsDeleted" = false AND "Status" = 'Draft') d
|
||||
INNER JOIN "Prc_V_MaterialRequestAvailableItem" a ON a."BranchId" = d."BranchId" AND a."TenantId" IS NOT DISTINCT FROM d."TenantId";
|
||||
18
configs/seeds/postgres/object/Prc_V_PurchaseReceiptLine.sql
Normal file
18
configs/seeds/postgres/object/Prc_V_PurchaseReceiptLine.sql
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
CREATE OR REPLACE VIEW public."Prc_V_PurchaseReceiptLine"
|
||||
AS
|
||||
-- Planlama › Son Alımlar'ın kaynağı: tamamlanan alımların (iade hariç) yapılan satırları; siparişsiz alım da gelir.
|
||||
-- Fiyat ve para birimi yalnız siparişli satırda dolar: sipariş birim fiyatı alım satırının birimine çevrilir.
|
||||
-- Prc öneki migrate sırası içindir (Prc_T_* tablolarından sonra kurulur).
|
||||
SELECT l."Id", t."TenantId", t."IsDeleted", l."ProductId", t."Id" AS "TransferId", t."TransferNo", t."EffectiveDate", t."PartnerId",
|
||||
t."BranchId", t."WarehouseId", t."DestinationLocationId", l."Quantity", l."UomId",
|
||||
CAST(ROUND(ol."UnitPrice" * f."Factor", 4) AS numeric(18, 4)) AS "UnitPrice", o."CurrencyId",
|
||||
CAST(ROUND(l."Quantity" * ol."UnitPrice" * f."Factor", 2) AS numeric(18, 2)) AS "UntaxedAmount",
|
||||
o."Id" AS "PurchaseOrderId", o."OrderNo", m."RequestNo"
|
||||
FROM "Inv_T_TransferLine" l
|
||||
INNER JOIN "Inv_T_Transfer" t ON t."Id" = l."TransferId"
|
||||
LEFT JOIN "Prc_T_PurchaseOrderLine" ol ON ol."Id" = l."PurchaseOrderLineId"
|
||||
LEFT JOIN "Prc_T_PurchaseOrder" o ON o."Id" = ol."PurchaseOrderId"
|
||||
LEFT JOIN LATERAL (SELECT public."Inv_F_UomConvert"(1, l."UomId", ol."UomId") AS "Factor" WHERE ol."Id" IS NOT NULL) f ON TRUE
|
||||
LEFT JOIN "Prc_T_MaterialRequestItem" i ON i."Id" = COALESCE(l."MaterialRequestItemId", ol."MaterialRequestItemId")
|
||||
LEFT JOIN "Prc_T_MaterialRequest" m ON m."Id" = i."MaterialRequestId"
|
||||
WHERE l."IsDeleted" = FALSE AND l."Quantity" > 0 AND t."OperationKind" = 'Receipt' AND t."Status" = 'Done' AND t."ReturnOfId" IS NULL;
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
-- Talepten Aktar: seçilen malzeme talebi kalemini (@Key = belge|kalem) taslak iç transfere satır olarak ekler; kalanı (talep − teslim) aktarılır.
|
||||
-- Belgenin hedef konumu boşsa talebin konumu yazılır.
|
||||
CREATE OR ALTER PROCEDURE [dbo].[Inv_P_TransferImportItem]
|
||||
@Key nvarchar(80)
|
||||
AS
|
||||
BEGIN
|
||||
SET NOCOUNT ON;
|
||||
DECLARE @Doc uniqueidentifier, @Tenant uniqueidentifier, @Item uniqueidentifier, @ProductId uniqueidentifier, @Description nvarchar(256),
|
||||
@Quantity decimal(18, 4), @UomId nvarchar(64), @LocationId uniqueidentifier;
|
||||
|
||||
SELECT @Doc = BaseId, @Tenant = TenantId, @Item = MaterialRequestItemId, @ProductId = ProductId, @Description = RequestReason,
|
||||
@Quantity = Quantity, @UomId = UomId, @LocationId = LocationId
|
||||
FROM Prc_V_MaterialRequestTransferItem
|
||||
WHERE Id = @Key;
|
||||
IF @Doc IS NULL
|
||||
THROW 50319, N'Talep kalemi artık aktarılamaz: belge taslak değil, kalem başka bir transfere aktarılmış ya da talep değişmiş.', 1;
|
||||
|
||||
INSERT INTO Inv_T_TransferLine (Id, TenantId, TransferId, ProductId, Description, DemandQuantity, Quantity, UomId, MaterialRequestItemId, CreationTime, IsDeleted)
|
||||
VALUES (NEWID(), @Tenant, @Doc, @ProductId, @Description, @Quantity, 0, @UomId, @Item, GETUTCDATE(), 0);
|
||||
|
||||
UPDATE Inv_T_Transfer SET DestinationLocationId = COALESCE(DestinationLocationId, @LocationId) WHERE Id = @Doc;
|
||||
EXEC Inv_P_TransferRecalc @Doc;
|
||||
END
|
||||
|
|
@ -46,4 +46,7 @@ BEGIN
|
|||
WHERE l.TransferId = @Id AND l.IsDeleted = 0) x)
|
||||
FROM Inv_T_Transfer t
|
||||
WHERE t.Id = @Id;
|
||||
|
||||
-- Satır eklenince, silinince ya da belge tamamlanınca talep kaleminin planlanmış payı değişir.
|
||||
EXEC Prc_P_MaterialRequestItemSync @Id;
|
||||
END
|
||||
|
|
|
|||
|
|
@ -46,6 +46,8 @@ BEGIN
|
|||
BEGIN
|
||||
IF @Status IN ('Done', 'Cancelled') THROW 50307, N'Tamamlanmış ya da iptal edilmiş belge iptal edilemez.', 1;
|
||||
UPDATE Inv_T_Transfer SET Status = 'Cancelled' WHERE Id = @Id;
|
||||
-- İptal edilen transferin payı talep kalemine geri döner.
|
||||
EXEC Prc_P_MaterialRequestItemSync @Id;
|
||||
END
|
||||
ELSE IF @Action = 'Return'
|
||||
BEGIN
|
||||
|
|
|
|||
54
configs/seeds/sql/object/Inv_P_TransferSupplierPrice.sql
Normal file
54
configs/seeds/sql/object/Inv_P_TransferSupplierPrice.sql
Normal file
|
|
@ -0,0 +1,54 @@
|
|||
-- Tamamlanan siparişli alım ürünün tedarikçi fiyat listesini (Inv_T_ProductSupplier) günceller: tedarikçi × ürün × birim ×
|
||||
-- para birimi başına tek satır tutulur. Alınan miktara uyan kademe (MinQuantity ≤ miktar olan en büyüğü) siparişin
|
||||
-- birim fiyatı ve son alım tarihiyle güncellenir; uyan satır yoksa yeni satır açılır (temin süresi = onaydan alıma gün).
|
||||
-- Fiyatı sipariş verir: siparişsiz alım, iade ve fiyatı 0 olan kalem yazmaz.
|
||||
CREATE OR ALTER PROCEDURE [dbo].[Inv_P_TransferSupplierPrice]
|
||||
@Id uniqueidentifier,
|
||||
@UserId uniqueidentifier = NULL
|
||||
AS
|
||||
BEGIN
|
||||
SET NOCOUNT ON;
|
||||
DECLARE @Now datetime = GETUTCDATE();
|
||||
DECLARE @Buy TABLE (TenantId uniqueidentifier NULL, ProductId uniqueidentifier NOT NULL, ContactId uniqueidentifier NOT NULL,
|
||||
UomId nvarchar(64) NOT NULL, CurrencyId nvarchar(64) NOT NULL, Quantity decimal(18, 4) NOT NULL,
|
||||
Price decimal(18, 4) NOT NULL, LeadTimeDays int NOT NULL, TargetId uniqueidentifier NULL,
|
||||
PRIMARY KEY (ProductId, ContactId, UomId, CurrencyId));
|
||||
|
||||
INSERT INTO @Buy (TenantId, ProductId, ContactId, UomId, CurrencyId, Quantity, Price, LeadTimeDays)
|
||||
SELECT b.TenantId, b.ProductId, b.SupplierId, b.UomId, b.CurrencyId, SUM(b.Quantity),
|
||||
ROUND(SUM(b.Quantity * b.UnitPrice) / SUM(b.Quantity), 4), MAX(b.LeadTimeDays)
|
||||
FROM (SELECT t.TenantId, ol.ProductId, o.SupplierId, ol.UomId, o.CurrencyId, ol.UnitPrice,
|
||||
dbo.Inv_F_UomConvert(l.Quantity, l.UomId, ol.UomId) AS Quantity,
|
||||
CASE WHEN o.ConfirmDate IS NULL OR o.ConfirmDate > @Now THEN 0 ELSE DATEDIFF(day, o.ConfirmDate, @Now) END AS LeadTimeDays
|
||||
FROM Inv_T_Transfer t
|
||||
INNER JOIN Inv_T_TransferLine l ON l.TransferId = t.Id AND l.IsDeleted = 0 AND l.Quantity > 0
|
||||
INNER JOIN Prc_T_PurchaseOrderLine ol ON ol.Id = l.PurchaseOrderLineId AND ol.UnitPrice > 0
|
||||
INNER JOIN Prc_T_PurchaseOrder o ON o.Id = ol.PurchaseOrderId
|
||||
WHERE t.Id = @Id AND t.OperationKind = 'Receipt' AND t.ReturnOfId IS NULL) b
|
||||
GROUP BY b.TenantId, b.ProductId, b.SupplierId, b.UomId, b.CurrencyId
|
||||
HAVING SUM(b.Quantity) > 0;
|
||||
|
||||
UPDATE b SET TargetId = (SELECT TOP 1 ps.Id
|
||||
FROM Inv_T_ProductSupplier ps
|
||||
INNER JOIN Inv_T_Product p ON p.Id = ps.ProductId
|
||||
WHERE ps.ProductId = b.ProductId AND ps.ContactId = b.ContactId AND ps.IsDeleted = 0 AND ps.VariantKey IS NULL
|
||||
AND ISNULL(ps.UomId, p.UomId) = b.UomId AND ISNULL(ps.CurrencyId, b.CurrencyId) = b.CurrencyId
|
||||
AND ps.MinQuantity <= b.Quantity
|
||||
AND (ps.TenantId = b.TenantId OR (ps.TenantId IS NULL AND b.TenantId IS NULL))
|
||||
ORDER BY ps.MinQuantity DESC)
|
||||
FROM @Buy b;
|
||||
|
||||
UPDATE ps SET Price = b.Price, UomId = b.UomId, CurrencyId = b.CurrencyId, LastPurchaseDate = @Now,
|
||||
LastModificationTime = @Now, LastModifierId = @UserId
|
||||
FROM Inv_T_ProductSupplier ps
|
||||
INNER JOIN @Buy b ON b.TargetId = ps.Id;
|
||||
|
||||
-- Miktarı 1'in altındaki alımda 1'lik kademe uymaz; yeni kademe alınan miktardan başlar.
|
||||
INSERT INTO Inv_T_ProductSupplier (Id, TenantId, ProductId, ContactId, MinQuantity, UomId, Price, CurrencyId, LeadTimeDays,
|
||||
LastPurchaseDate, CreationTime, CreatorId, IsDeleted)
|
||||
SELECT NEWID(), b.TenantId, b.ProductId, b.ContactId, CASE WHEN b.Quantity < 1 THEN b.Quantity ELSE 1 END, b.UomId, b.Price,
|
||||
b.CurrencyId, b.LeadTimeDays, @Now, @Now, @UserId, 0
|
||||
FROM @Buy b
|
||||
WHERE b.TargetId IS NULL;
|
||||
END
|
||||
GO
|
||||
|
|
@ -1,6 +1,7 @@
|
|||
-- Tamamla: yapılan miktarlar stoğa işlenir (Inv_T_Stock, ürün biriminde, lot kırılımlı). İç konumdan çıkışta stok yetmezse
|
||||
-- işlem durur; dış konumlar stok tutmaz. Envanter takibi kapalı ürün stoğa girmez. Lot/seri takipli üründe lot toplamı
|
||||
-- yapılan miktara eşit olmalıdır. Sipariş kalemlerinin alınan, talep kalemlerinin teslim edilen miktarı güncellenir (iadede düşülür).
|
||||
-- yapılan miktara eşit olmalıdır. Sipariş kalemlerinin alınan, talep kalemlerinin teslim edilen miktarı güncellenir (iadede düşülür);
|
||||
-- siparişli alım ürün–tedarikçi fiyatını yazar (Inv_P_TransferSupplierPrice).
|
||||
-- Talepten az yapılan satırların kalanı aynı türde yeni belgeye (backorder) geçer.
|
||||
CREATE OR ALTER PROCEDURE [dbo].[Inv_P_TransferValidate]
|
||||
@Id uniqueidentifier,
|
||||
|
|
@ -122,6 +123,8 @@ BEGIN
|
|||
WHERE l.TransferId = @Id AND l.IsDeleted = 0 AND l.Quantity > 0
|
||||
GROUP BY l.PurchaseOrderLineId) x ON x.PurchaseOrderLineId = ol.Id;
|
||||
|
||||
EXEC Inv_P_TransferSupplierPrice @Id, @UserId;
|
||||
|
||||
UPDATE i SET DeliveredQuantity = i.DeliveredQuantity + @Sign * x.Quantity,
|
||||
LineStatus = CASE WHEN i.DeliveredQuantity + @Sign * x.Quantity >= i.Quantity THEN 'Done'
|
||||
WHEN i.LineStatus = 'Done' THEN 'Waiting' ELSE i.LineStatus END
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@ BEGIN
|
|||
[Price] decimal(18, 4) NOT NULL DEFAULT 0,
|
||||
[CurrencyId] nvarchar(64) NULL,
|
||||
[LeadTimeDays] int NOT NULL DEFAULT 0,
|
||||
[LastPurchaseDate] datetime NULL,
|
||||
[VariantKey] nvarchar(450) NULL,
|
||||
[CreationTime] datetime2 NOT NULL DEFAULT GETUTCDATE(),
|
||||
[CreatorId] uniqueidentifier NULL,
|
||||
|
|
|
|||
17
configs/seeds/sql/object/Prc_P_MaterialRequestItemSync.sql
Normal file
17
configs/seeds/sql/object/Prc_P_MaterialRequestItemSync.sql
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
-- Transfer belgesinin talep kalemlerinin satır durumunu planla eşler (yeniden hesap ve iptal sonrası): kalanın tamamı iç transferle
|
||||
-- planlanmış, satınalma payı olmayan bekleyen kalem kapanır (Tamamlandı); transfer iptal edilir, satırı silinir ya da eksik tamamlanıp kalanı
|
||||
-- yeniden açılırsa kapalı kalem Bekliyor'a döner ve Planlama'da görünür. Silinmiş satırların kalemleri de kapsamdadır.
|
||||
CREATE OR ALTER PROCEDURE [dbo].[Prc_P_MaterialRequestItemSync]
|
||||
@TransferId uniqueidentifier
|
||||
AS
|
||||
BEGIN
|
||||
SET NOCOUNT ON;
|
||||
|
||||
UPDATE i SET LineStatus = CASE WHEN i.LineStatus = 'Waiting' THEN 'Done' ELSE 'Waiting' END
|
||||
FROM Prc_T_MaterialRequestItem i
|
||||
INNER JOIN Prc_V_MaterialRequestItemPlan p ON p.Id = i.Id
|
||||
WHERE i.Id IN (SELECT MaterialRequestItemId FROM Inv_T_TransferLine WHERE TransferId = @TransferId AND MaterialRequestItemId IS NOT NULL)
|
||||
AND p.PurchaseQuantity = 0
|
||||
AND ((i.LineStatus = 'Waiting' AND p.RemainingQuantity <= 0)
|
||||
OR (i.LineStatus = 'Done' AND p.RemainingQuantity > 0 AND i.DeliveredQuantity < i.Quantity));
|
||||
END
|
||||
182
configs/seeds/sql/object/Prc_P_MaterialRequestPlan.sql
Normal file
182
configs/seeds/sql/object/Prc_P_MaterialRequestPlan.sql
Normal file
|
|
@ -0,0 +1,182 @@
|
|||
-- Planlama kararı: talep kaleminin planlanacak kalanından @PlanQuantity kadarını satınalmaya ya da iç transfere ayırır; kalanın geri kalanı
|
||||
-- listede kalır. Planla diyaloğunun onayı (Prc_P_MaterialRequestPlanConfirm) her taslak plan satırı için çağırır.
|
||||
-- Purchase: tedarikçinin talebin şubesi ve deposu için taslak teklif talebi varsa kalem ona eklenir (kalem zaten oradaysa miktarı artar), yoksa
|
||||
-- talebin deposunun alım operasyon türüyle yeni taslak teklif talebi açılır (para birimi ve koşullar kontak kartından; alıcı — satınalma sorumlusu —
|
||||
-- planlayan). Fiyat tedarikçinin fiyat listesinden gelir; teklif → sipariş → alım akışı oradan sürer.
|
||||
-- Transfer: kaynak konumun serbest stoğu (Prc_V_MaterialRequestPlanSource) yetmelidir; aynı kaynak → talebin konumu için onaya
|
||||
-- girmemiş taslak iç transfer varsa satır ona, yoksa kaynak deponun iç transfer operasyon türüyle yeni taslak açılır. Kalanın tamamı transferle
|
||||
-- planlanan, satınalma payı olmayan kalem transfer belgesinin yeniden hesabında kapanır (Prc_P_MaterialRequestItemSync).
|
||||
-- Stock: stok talebin teslim konumundadır; belge açılmaz, serbest stok yetmelidir. Miktar kalemin stoktan karşılanan ve teslim edilen
|
||||
-- miktarına eklenir; satınalma payı olmayan ve kalanı biten kalem kapanır.
|
||||
CREATE OR ALTER PROCEDURE [dbo].[Prc_P_MaterialRequestPlan]
|
||||
@Id uniqueidentifier,
|
||||
@PlanMethod nvarchar(16),
|
||||
@PlanQuantity decimal(18, 4),
|
||||
@PlanSupplierId uniqueidentifier,
|
||||
@PlanSourceLocationId uniqueidentifier,
|
||||
@TenantId uniqueidentifier,
|
||||
@LastModifierId uniqueidentifier
|
||||
AS
|
||||
BEGIN
|
||||
SET NOCOUNT ON;
|
||||
SET XACT_ABORT ON;
|
||||
DECLARE @ProductId uniqueidentifier, @UomId nvarchar(64), @DueDate datetime, @Reason nvarchar(256), @Branch uniqueidentifier,
|
||||
@Warehouse uniqueidentifier, @Location uniqueidentifier, @RequestNo nvarchar(32), @Remaining decimal(18, 4),
|
||||
@Doc uniqueidentifier, @Line uniqueidentifier, @OpType uniqueidentifier, @SrcWarehouse uniqueidentifier,
|
||||
@Free decimal(18, 4), @No nvarchar(128), @Msg nvarchar(400);
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
-- Kalem kilitlenir: aynı kalemin eşzamanlı iki planı kalanı iki kez dağıtamaz.
|
||||
SELECT @ProductId = i.ProductId, @UomId = i.UomId, @DueDate = i.DueDate, @Reason = i.RequestReason, @Branch = r.BranchId,
|
||||
@Warehouse = r.WarehouseId, @Location = r.LocationId, @RequestNo = r.RequestNo
|
||||
FROM Prc_T_MaterialRequestItem i WITH (UPDLOCK, HOLDLOCK)
|
||||
INNER JOIN Prc_T_MaterialRequest r ON r.Id = i.MaterialRequestId
|
||||
WHERE i.Id = @Id AND i.IsDeleted = 0 AND i.LineStatus = 'Waiting' AND r.IsDeleted = 0
|
||||
AND (i.TenantId = @TenantId OR (i.TenantId IS NULL AND @TenantId IS NULL))
|
||||
AND r.ApprovalStatus IN (N'Onaylandı', N'Teklif Talebi', N'Teklif Talebi Gönderildi', N'Satınalma Siparişi');
|
||||
IF @ProductId IS NULL
|
||||
THROW 50191, N'Kalem planlanamaz: talep onaylı değil ya da kalem kapalı.', 1;
|
||||
|
||||
SELECT @Remaining = RemainingQuantity FROM Prc_V_MaterialRequestItemPlan WHERE Id = @Id;
|
||||
IF ISNULL(@PlanQuantity, 0) <= 0
|
||||
THROW 50192, N'Plan miktarı sıfırdan büyük olmalıdır.', 1;
|
||||
IF @PlanQuantity > @Remaining
|
||||
BEGIN
|
||||
SET @Msg = CONCAT(N'Plan miktarı planlanacak kalanı aşamaz (kalan: ', FORMAT(@Remaining, '0.####'), N' ', @UomId, N').');
|
||||
THROW 50193, @Msg, 1;
|
||||
END
|
||||
|
||||
IF @PlanMethod = 'Purchase'
|
||||
BEGIN
|
||||
IF @PlanSupplierId IS NULL
|
||||
THROW 50194, N'Satınalma kararında tedarikçi seçilmelidir.', 1;
|
||||
|
||||
SELECT TOP 1 @Doc = Id
|
||||
FROM Prc_T_PurchaseRfq
|
||||
WHERE IsDeleted = 0 AND Status = 'Draft' AND SupplierId = @PlanSupplierId AND BranchId = @Branch AND WarehouseId = @Warehouse
|
||||
AND (TenantId = @TenantId OR (TenantId IS NULL AND @TenantId IS NULL))
|
||||
ORDER BY CreationTime DESC;
|
||||
|
||||
IF @Doc IS NULL
|
||||
BEGIN
|
||||
SELECT TOP 1 @OpType = Id
|
||||
FROM Inv_T_OperationType
|
||||
WHERE IsDeleted = 0 AND IsActive = 1 AND OperationKind = 'Receipt' AND WarehouseId = @Warehouse
|
||||
ORDER BY Name;
|
||||
IF @OpType IS NULL
|
||||
THROW 50195, N'Talebin deposu için aktif bir alım operasyon türü tanımlı değil.', 1;
|
||||
|
||||
SET @Doc = NEWID();
|
||||
EXEC Adm_P_SequenceNext N'Prc.PurchaseRfq', @TenantId, @No OUTPUT;
|
||||
INSERT INTO Prc_T_PurchaseRfq (Id, TenantId, RfqNo, TenderGroupId, SupplierId, BranchId, OperationTypeId, WarehouseId, CurrencyId,
|
||||
BuyerUserId, IncotermId, IncotermLocation, PaymentTermId, CreationTime, CreatorId, IsDeleted)
|
||||
SELECT @Doc, @TenantId, LEFT(@No, 32), @Doc, c.Id, @Branch, @OpType, @Warehouse, COALESCE(c.SupplierCurrency, 'TRY'),
|
||||
@LastModifierId, c.PurchaseIncotermId, c.PurchaseIncotermLocation, c.PurchasePaymentTermId,
|
||||
GETUTCDATE(), @LastModifierId, 0
|
||||
FROM Adm_T_Contact c
|
||||
WHERE c.Id = @PlanSupplierId AND c.IsDeleted = 0;
|
||||
IF @@ROWCOUNT = 0
|
||||
THROW 50194, N'Satınalma kararında tedarikçi seçilmelidir.', 1;
|
||||
END
|
||||
|
||||
SELECT @Line = Id FROM Prc_T_PurchaseRfqLine WHERE PurchaseRfqId = @Doc AND MaterialRequestItemId = @Id AND IsDeleted = 0;
|
||||
IF @Line IS NOT NULL
|
||||
UPDATE Prc_T_PurchaseRfqLine
|
||||
SET Quantity = Quantity + dbo.Inv_F_UomConvert(@PlanQuantity, @UomId, UomId), LastModificationTime = GETUTCDATE(), LastModifierId = @LastModifierId
|
||||
WHERE Id = @Line;
|
||||
ELSE
|
||||
INSERT INTO Prc_T_PurchaseRfqLine (Id, TenantId, PurchaseRfqId, ProductId, Description, Quantity, UomId, UnitPrice, TaxRate, Amount,
|
||||
DeliveryDate, MaterialRequestItemId, CreationTime, CreatorId, IsDeleted)
|
||||
SELECT NEWID(), @TenantId, @Doc, @ProductId, @Reason, @PlanQuantity, @UomId,
|
||||
ISNULL((SELECT TOP 1 ps.Price FROM Inv_T_ProductSupplier ps
|
||||
WHERE ps.ProductId = @ProductId AND ps.ContactId = @PlanSupplierId AND ps.IsDeleted = 0
|
||||
ORDER BY ps.MinQuantity), 0),
|
||||
ISNULL(p.PurchaseTaxRate, 0), 0, @DueDate, @Id, GETUTCDATE(), @LastModifierId, 0
|
||||
FROM Inv_T_Product p
|
||||
WHERE p.Id = @ProductId;
|
||||
|
||||
EXEC Prc_P_PurchaseRfqRecalc @Doc;
|
||||
END
|
||||
ELSE IF @PlanMethod = 'Transfer'
|
||||
BEGIN
|
||||
IF @PlanSourceLocationId IS NULL
|
||||
THROW 50196, N'İç transfer kararında kaynak konum seçilmelidir.', 1;
|
||||
-- Konum ve serbest stok kuralı diyaloğun İç Transfer ızgarasıyla aynıdır.
|
||||
SELECT @SrcWarehouse = WarehouseId, @Free = FreeQuantity
|
||||
FROM Prc_V_MaterialRequestPlanSource
|
||||
WHERE BaseId = @Id AND LocationId = @PlanSourceLocationId;
|
||||
IF @SrcWarehouse IS NULL OR @PlanSourceLocationId = @Location
|
||||
THROW 50197, N'Kaynak konum, talebin teslim konumundan farklı ve ürünün stoğu olan bir iç konum olmalıdır.', 1;
|
||||
IF @PlanQuantity > @Free
|
||||
BEGIN
|
||||
SET @Msg = CONCAT(N'Kaynak konumda yeterli serbest stok yok (serbest: ', FORMAT(CASE WHEN @Free > 0 THEN @Free ELSE 0 END, '0.####'), N' ', @UomId, N').');
|
||||
THROW 50198, @Msg, 1;
|
||||
END
|
||||
|
||||
SELECT TOP 1 @Doc = Id
|
||||
FROM Inv_T_Transfer
|
||||
WHERE IsDeleted = 0 AND OperationKind = 'InternalTransfer' AND Status = 'Draft' AND ReturnOfId IS NULL AND BackorderOfId IS NULL
|
||||
AND SourceLocationId = @PlanSourceLocationId AND DestinationLocationId = @Location
|
||||
AND ISNULL(ApprovalStatus, N'Onay Gerekmez') = N'Onay Gerekmez'
|
||||
AND (TenantId = @TenantId OR (TenantId IS NULL AND @TenantId IS NULL))
|
||||
ORDER BY CreationTime DESC;
|
||||
|
||||
IF @Doc IS NULL
|
||||
BEGIN
|
||||
SELECT TOP 1 @OpType = Id
|
||||
FROM Inv_T_OperationType
|
||||
WHERE IsDeleted = 0 AND IsActive = 1 AND OperationKind = 'InternalTransfer' AND WarehouseId = @SrcWarehouse
|
||||
ORDER BY Name;
|
||||
IF @OpType IS NULL
|
||||
THROW 50199, N'Kaynak depo için aktif bir iç transfer operasyon türü tanımlı değil.', 1;
|
||||
|
||||
SET @Doc = NEWID();
|
||||
INSERT INTO Inv_T_Transfer (Id, TenantId, BranchId, WarehouseId, OperationTypeId, OperationKind, SourceLocationId, DestinationLocationId,
|
||||
SourceDocument, ResponsibleUserId, Status, CreationTime, CreatorId, IsDeleted)
|
||||
SELECT @Doc, @TenantId, ot.BranchId, ot.WarehouseId, ot.Id, 'InternalTransfer', @PlanSourceLocationId, @Location,
|
||||
@RequestNo, @LastModifierId, 'Draft', GETUTCDATE(), @LastModifierId, 0
|
||||
FROM Inv_T_OperationType ot
|
||||
WHERE ot.Id = @OpType;
|
||||
END
|
||||
ELSE
|
||||
UPDATE Inv_T_Transfer
|
||||
SET SourceDocument = LEFT(CONCAT(SourceDocument, CASE WHEN ISNULL(SourceDocument, '') = '' THEN '' ELSE N', ' END, @RequestNo), 128)
|
||||
WHERE Id = @Doc AND CHARINDEX(@RequestNo, ISNULL(SourceDocument, '')) = 0;
|
||||
|
||||
SELECT @Line = Id FROM Inv_T_TransferLine WHERE TransferId = @Doc AND MaterialRequestItemId = @Id AND IsDeleted = 0;
|
||||
IF @Line IS NOT NULL
|
||||
UPDATE Inv_T_TransferLine
|
||||
SET DemandQuantity = DemandQuantity + dbo.Inv_F_UomConvert(@PlanQuantity, @UomId, UomId), LastModificationTime = GETUTCDATE(), LastModifierId = @LastModifierId
|
||||
WHERE Id = @Line;
|
||||
ELSE
|
||||
INSERT INTO Inv_T_TransferLine (Id, TenantId, TransferId, ProductId, Description, DemandQuantity, Quantity, UomId, MaterialRequestItemId,
|
||||
CreationTime, CreatorId, IsDeleted)
|
||||
VALUES (NEWID(), @TenantId, @Doc, @ProductId, @Reason, @PlanQuantity, 0, @UomId, @Id, GETUTCDATE(), @LastModifierId, 0);
|
||||
|
||||
-- Numara, kaynak depo onaycısı ve yeniden hesap (kalemin kapanması dahil) belge kaydı sonrasıyla aynıdır.
|
||||
EXEC Inv_P_TransferAfterSave @Doc, @LastModifierId;
|
||||
END
|
||||
ELSE IF @PlanMethod = 'Stock'
|
||||
BEGIN
|
||||
SELECT @Free = FreeQuantity FROM Prc_V_MaterialRequestPlanSource WHERE BaseId = @Id AND LocationId = @Location;
|
||||
IF @PlanQuantity > ISNULL(@Free, 0)
|
||||
BEGIN
|
||||
SET @Msg = CONCAT(N'Teslim konumunda yeterli serbest stok yok (serbest: ', FORMAT(CASE WHEN @Free > 0 THEN @Free ELSE 0 END, '0.####'), N' ', @UomId, N').');
|
||||
THROW 50198, @Msg, 1;
|
||||
END
|
||||
|
||||
UPDATE Prc_T_MaterialRequestItem
|
||||
SET FromStockQuantity = FromStockQuantity + @PlanQuantity, DeliveredQuantity = DeliveredQuantity + @PlanQuantity,
|
||||
LastModificationTime = GETUTCDATE(), LastModifierId = @LastModifierId
|
||||
WHERE Id = @Id;
|
||||
UPDATE i SET LineStatus = 'Done'
|
||||
FROM Prc_T_MaterialRequestItem i
|
||||
INNER JOIN Prc_V_MaterialRequestItemPlan p ON p.Id = i.Id
|
||||
WHERE i.Id = @Id AND p.PurchaseQuantity = 0 AND p.RemainingQuantity <= 0;
|
||||
END
|
||||
ELSE
|
||||
THROW 50192, N'Karar Satınalma, İç Transfer ya da Stoktan olmalıdır.', 1;
|
||||
|
||||
COMMIT TRANSACTION;
|
||||
END
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
-- Planla diyaloğunun Onayla'sı (App.Prc.MaterialRequestPlan › UpdateCommand): talep kaleminin taslak planındaki her satırı
|
||||
-- Prc_P_MaterialRequestPlan ile belgeye çevirir (iç transferler, stoktan karşılama, sonra teklif talepleri — stok payı kalemi transferlerden
|
||||
-- sonra kapatabilsin) ve taslağı siler. Tek transaction'dır:
|
||||
-- bir satır reddedilirse (stok, kalan, operasyon türü) hiçbir belge açılmaz ve taslak yerinde kalır.
|
||||
CREATE OR ALTER PROCEDURE [dbo].[Prc_P_MaterialRequestPlanConfirm]
|
||||
@Id uniqueidentifier,
|
||||
@TenantId uniqueidentifier,
|
||||
@LastModifierId uniqueidentifier
|
||||
AS
|
||||
BEGIN
|
||||
SET NOCOUNT ON;
|
||||
SET XACT_ABORT ON;
|
||||
DECLARE @Method nvarchar(16), @Quantity decimal(18, 4), @Supplier uniqueidentifier, @Location uniqueidentifier;
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
IF NOT EXISTS (SELECT 1 FROM Prc_T_MaterialRequestPlanLine WITH (UPDLOCK, HOLDLOCK) WHERE MaterialRequestItemId = @Id AND IsDeleted = 0)
|
||||
THROW 50201, N'Onaylanacak taslak plan yok: önce Öner butonunu kullanın ya da İç Transfer veya Satınalma sekmesinde Plan Miktarı girin.', 1;
|
||||
|
||||
DECLARE plan_lines CURSOR LOCAL FAST_FORWARD FOR
|
||||
SELECT PlanMethod, Quantity, SupplierId, SourceLocationId
|
||||
FROM Prc_T_MaterialRequestPlanLine
|
||||
WHERE MaterialRequestItemId = @Id AND IsDeleted = 0
|
||||
ORDER BY CASE PlanMethod WHEN 'Transfer' THEN 0 WHEN 'Stock' THEN 1 ELSE 2 END, CreationTime;
|
||||
OPEN plan_lines;
|
||||
FETCH NEXT FROM plan_lines INTO @Method, @Quantity, @Supplier, @Location;
|
||||
WHILE @@FETCH_STATUS = 0
|
||||
BEGIN
|
||||
EXEC Prc_P_MaterialRequestPlan @Id, @Method, @Quantity, @Supplier, @Location, @TenantId, @LastModifierId;
|
||||
FETCH NEXT FROM plan_lines INTO @Method, @Quantity, @Supplier, @Location;
|
||||
END
|
||||
CLOSE plan_lines;
|
||||
DEALLOCATE plan_lines;
|
||||
|
||||
DELETE FROM Prc_T_MaterialRequestPlanLine WHERE MaterialRequestItemId = @Id;
|
||||
|
||||
COMMIT TRANSACTION;
|
||||
END
|
||||
GO
|
||||
103
configs/seeds/sql/object/Prc_P_MaterialRequestPlanLineSave.sql
Normal file
103
configs/seeds/sql/object/Prc_P_MaterialRequestPlanLineSave.sql
Normal file
|
|
@ -0,0 +1,103 @@
|
|||
-- Planla diyaloğunun İç Transfer (App.Prc.MaterialRequestPlanSource) ve Satınalma (App.Prc.MaterialRequestPlanVendor) ızgaralarının satır kaydı:
|
||||
-- girilen Plan Miktarı kalemin taslak planına (Prc_T_MaterialRequestPlanLine) yazılır, 0 ya da boş satırı plandan çıkarır. @Id ızgara
|
||||
-- satırının anahtarıdır: kalem + ':' + hedef (Transfer'de kaynak konum, Purchase'da tedarikçi). Kaynak talebin teslim konumuysa karar
|
||||
-- Stock'tur (transfer açılmaz, stoktan karşılanır). Belge açılmaz; onay
|
||||
-- Prc_P_MaterialRequestPlanConfirm'dedir. Taslak toplamı planlanacak kalanı, konumun satırı serbest stoğu aşamaz. Batch kaydı satırları
|
||||
-- eşzamanlı gönderdiği için kalem kilitlenir. Eksi miktar "alabileceği en fazla"dır (Seçilenleri Planla): kalanın diğer taslak satırlardan
|
||||
-- arta kalanı, konumda serbest stokla sınırlı; alınacak bir şey yoksa satır değişmez.
|
||||
CREATE OR ALTER PROCEDURE [dbo].[Prc_P_MaterialRequestPlanLineSave]
|
||||
@Id nvarchar(80),
|
||||
@PlanMethod nvarchar(16),
|
||||
@PlanQuantity decimal(18, 4),
|
||||
@TenantId uniqueidentifier,
|
||||
@LastModifierId uniqueidentifier
|
||||
AS
|
||||
BEGIN
|
||||
SET NOCOUNT ON;
|
||||
SET XACT_ABORT ON;
|
||||
DECLARE @ItemId uniqueidentifier = TRY_CAST(LEFT(@Id, 36) AS uniqueidentifier),
|
||||
@Target uniqueidentifier = TRY_CAST(SUBSTRING(@Id, 38, 36) AS uniqueidentifier),
|
||||
@UomId nvarchar(64), @Location uniqueidentifier, @Remaining decimal(18, 4), @Other decimal(18, 4), @Free decimal(18, 4), @Line uniqueidentifier,
|
||||
@Qty decimal(18, 4) = ISNULL(@PlanQuantity, 0), @Msg nvarchar(400);
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
SELECT @UomId = i.UomId, @Location = r.LocationId
|
||||
FROM Prc_T_MaterialRequestItem i WITH (UPDLOCK, HOLDLOCK)
|
||||
INNER JOIN Prc_T_MaterialRequest r ON r.Id = i.MaterialRequestId
|
||||
WHERE i.Id = @ItemId AND i.IsDeleted = 0 AND i.LineStatus = 'Waiting' AND r.IsDeleted = 0
|
||||
AND (i.TenantId = @TenantId OR (i.TenantId IS NULL AND @TenantId IS NULL))
|
||||
AND r.ApprovalStatus IN (N'Onaylandı', N'Teklif Talebi', N'Teklif Talebi Gönderildi', N'Satınalma Siparişi');
|
||||
IF @UomId IS NULL
|
||||
THROW 50191, N'Kalem planlanamaz: talep onaylı değil ya da kalem kapalı.', 1;
|
||||
IF @PlanMethod = 'Transfer' AND @Target = @Location
|
||||
SET @PlanMethod = 'Stock';
|
||||
|
||||
SELECT @Line = Id
|
||||
FROM Prc_T_MaterialRequestPlanLine
|
||||
WHERE MaterialRequestItemId = @ItemId AND PlanMethod = @PlanMethod AND IsDeleted = 0
|
||||
AND @Target = CASE WHEN @PlanMethod = 'Purchase' THEN SupplierId ELSE SourceLocationId END;
|
||||
|
||||
IF @Qty = 0
|
||||
BEGIN
|
||||
DELETE FROM Prc_T_MaterialRequestPlanLine WHERE Id = @Line;
|
||||
COMMIT TRANSACTION;
|
||||
RETURN;
|
||||
END
|
||||
|
||||
SELECT @Remaining = RemainingQuantity FROM Prc_V_MaterialRequestItemPlan WHERE Id = @ItemId;
|
||||
SELECT @Other = ISNULL(SUM(Quantity), 0)
|
||||
FROM Prc_T_MaterialRequestPlanLine
|
||||
WHERE MaterialRequestItemId = @ItemId AND IsDeleted = 0 AND (@Line IS NULL OR Id <> @Line);
|
||||
IF @Qty < 0
|
||||
BEGIN
|
||||
SET @Qty = @Remaining - @Other;
|
||||
IF @PlanMethod IN ('Transfer', 'Stock')
|
||||
BEGIN
|
||||
SELECT @Free = FreeQuantity FROM Prc_V_MaterialRequestPlanSource WHERE BaseId = @ItemId AND LocationId = @Target;
|
||||
IF @Free < @Qty SET @Qty = @Free;
|
||||
END
|
||||
IF ISNULL(@Qty, 0) <= 0
|
||||
BEGIN
|
||||
COMMIT TRANSACTION;
|
||||
RETURN;
|
||||
END
|
||||
END
|
||||
IF @Other + @Qty > @Remaining
|
||||
BEGIN
|
||||
SET @Msg = CONCAT(N'Taslak plan toplamı planlanacak kalanı aşamaz (kalan: ', FORMAT(@Remaining - @Other, '0.####'), N' ', @UomId, N').');
|
||||
THROW 50200, @Msg, 1;
|
||||
END
|
||||
|
||||
IF @PlanMethod IN ('Transfer', 'Stock')
|
||||
BEGIN
|
||||
SELECT @Free = FreeQuantity FROM Prc_V_MaterialRequestPlanSource WHERE BaseId = @ItemId AND LocationId = @Target;
|
||||
IF @Free IS NULL
|
||||
THROW 50197, N'Kaynak konum ürünün stoğu olan bir iç konum olmalıdır.', 1;
|
||||
IF @Qty > @Free
|
||||
BEGIN
|
||||
SET @Msg = CONCAT(N'Kaynak konumda yeterli serbest stok yok (serbest: ', FORMAT(CASE WHEN @Free > 0 THEN @Free ELSE 0 END, '0.####'), N' ', @UomId, N').');
|
||||
THROW 50198, @Msg, 1;
|
||||
END
|
||||
END
|
||||
ELSE IF @PlanMethod = 'Purchase'
|
||||
BEGIN
|
||||
IF NOT EXISTS (SELECT 1 FROM Prc_V_MaterialRequestPlanVendor WHERE BaseId = @ItemId AND ContactId = @Target)
|
||||
THROW 50194, N'Satınalma kararında aktif bir tedarikçi seçilmelidir.', 1;
|
||||
END
|
||||
ELSE
|
||||
THROW 50192, N'Karar Satınalma ya da İç Transfer olmalıdır.', 1;
|
||||
|
||||
IF @Line IS NOT NULL
|
||||
UPDATE Prc_T_MaterialRequestPlanLine
|
||||
SET Quantity = @Qty, LastModificationTime = GETUTCDATE(), LastModifierId = @LastModifierId
|
||||
WHERE Id = @Line;
|
||||
ELSE
|
||||
INSERT INTO Prc_T_MaterialRequestPlanLine (Id, TenantId, MaterialRequestItemId, PlanMethod, SupplierId, SourceLocationId, Quantity,
|
||||
CreationTime, CreatorId, IsDeleted)
|
||||
VALUES (NEWID(), @TenantId, @ItemId, @PlanMethod, CASE WHEN @PlanMethod = 'Purchase' THEN @Target END,
|
||||
CASE WHEN @PlanMethod <> 'Purchase' THEN @Target END, @Qty, GETUTCDATE(), @LastModifierId, 0);
|
||||
|
||||
COMMIT TRANSACTION;
|
||||
END
|
||||
GO
|
||||
|
|
@ -0,0 +1,52 @@
|
|||
-- Planla diyaloğunun Öner'i (App.Prc.MaterialRequestPlanLine › InsertCommand):
|
||||
-- kalemin taslak planını sıfırlayıp planlanacak kalanı dağıtır. Önce stok: teslim konumu (stoktan karşılama), sonra serbest stoğu en çok
|
||||
-- olan konum (Prc_V_MaterialRequestPlanSource); kalan kısım satınalma: Prc_V_MaterialRequestPlanVendor'ın SuggestRank'ı ilk olan,
|
||||
-- fiyat listesinde ya da alım geçmişinde bulunan tedarikçi (hiç bilinmeyen kontak seçilmez, kalan planlanmadan kalır). Satırlar
|
||||
-- Prc_P_MaterialRequestPlanLineSave ile yazılır; kalem, stok ve kalan kuralları oradadır.
|
||||
CREATE OR ALTER PROCEDURE [dbo].[Prc_P_MaterialRequestPlanSuggest]
|
||||
@Id uniqueidentifier,
|
||||
@TenantId uniqueidentifier,
|
||||
@LastModifierId uniqueidentifier
|
||||
AS
|
||||
BEGIN
|
||||
SET NOCOUNT ON;
|
||||
SET XACT_ABORT ON;
|
||||
DECLARE @Left decimal(18, 4), @Qty decimal(18, 4), @Free decimal(18, 4), @Key nvarchar(80);
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
DELETE FROM Prc_T_MaterialRequestPlanLine
|
||||
WHERE MaterialRequestItemId = @Id AND (TenantId = @TenantId OR (TenantId IS NULL AND @TenantId IS NULL));
|
||||
SELECT @Left = ISNULL(RemainingQuantity, 0) FROM Prc_V_MaterialRequestItemPlan WHERE Id = @Id;
|
||||
|
||||
DECLARE sources CURSOR LOCAL FAST_FORWARD FOR
|
||||
SELECT Id, FreeQuantity
|
||||
FROM Prc_V_MaterialRequestPlanSource
|
||||
WHERE BaseId = @Id AND FreeQuantity > 0
|
||||
ORDER BY IsDestination DESC, FreeQuantity DESC;
|
||||
OPEN sources;
|
||||
FETCH NEXT FROM sources INTO @Key, @Free;
|
||||
WHILE @@FETCH_STATUS = 0 AND @Left > 0
|
||||
BEGIN
|
||||
SET @Qty = CASE WHEN @Free < @Left THEN @Free ELSE @Left END;
|
||||
EXEC Prc_P_MaterialRequestPlanLineSave @Key, 'Transfer', @Qty, @TenantId, @LastModifierId;
|
||||
SET @Left = @Left - @Qty;
|
||||
FETCH NEXT FROM sources INTO @Key, @Free;
|
||||
END
|
||||
CLOSE sources;
|
||||
DEALLOCATE sources;
|
||||
|
||||
IF @Left > 0
|
||||
BEGIN
|
||||
SET @Key = NULL;
|
||||
SELECT TOP 1 @Key = Id
|
||||
FROM Prc_V_MaterialRequestPlanVendor
|
||||
WHERE BaseId = @Id AND (Price IS NOT NULL OR LastPurchaseDate IS NOT NULL)
|
||||
ORDER BY SuggestRank;
|
||||
IF @Key IS NOT NULL
|
||||
EXEC Prc_P_MaterialRequestPlanLineSave @Key, 'Purchase', @Left, @TenantId, @LastModifierId;
|
||||
END
|
||||
|
||||
COMMIT TRANSACTION;
|
||||
END
|
||||
GO
|
||||
29
configs/seeds/sql/object/Prc_P_MaterialRequestStockUndo.sql
Normal file
29
configs/seeds/sql/object/Prc_P_MaterialRequestStockUndo.sql
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
-- Plan Takibi'nin Geri Al'ı (App.Prc.MaterialRequestPlanTrack › UpdateCommand): stoktan karşılamayı geri alır. Stoktan karşılama belge
|
||||
-- açmadığı için geri dönüşü kalemin kendisidir: stoktan karşılanan miktar teslim edilenden düşülür ve sıfırlanır, kalanı yeniden açılan
|
||||
-- kapalı kalem Bekliyor'a döner ve Planlama'da yeniden planlanır (Prc_P_MaterialRequestItemSync ile aynı kural).
|
||||
CREATE OR ALTER PROCEDURE [dbo].[Prc_P_MaterialRequestStockUndo]
|
||||
@Id uniqueidentifier,
|
||||
@TenantId uniqueidentifier,
|
||||
@LastModifierId uniqueidentifier
|
||||
AS
|
||||
BEGIN
|
||||
SET NOCOUNT ON;
|
||||
SET XACT_ABORT ON;
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
UPDATE Prc_T_MaterialRequestItem
|
||||
SET DeliveredQuantity = CASE WHEN DeliveredQuantity > FromStockQuantity THEN DeliveredQuantity - FromStockQuantity ELSE 0 END,
|
||||
FromStockQuantity = 0, LastModificationTime = GETUTCDATE(), LastModifierId = @LastModifierId
|
||||
WHERE Id = @Id AND IsDeleted = 0 AND FromStockQuantity > 0 AND LineStatus IN ('Waiting', 'Done')
|
||||
AND (TenantId = @TenantId OR (TenantId IS NULL AND @TenantId IS NULL));
|
||||
IF @@ROWCOUNT = 0
|
||||
THROW 50202, N'Geri alınacak stoktan karşılama yok ya da kalem kapatılmış.', 1;
|
||||
|
||||
UPDATE i SET LineStatus = 'Waiting'
|
||||
FROM Prc_T_MaterialRequestItem i
|
||||
INNER JOIN Prc_V_MaterialRequestItemPlan p ON p.Id = i.Id
|
||||
WHERE i.Id = @Id AND i.LineStatus = 'Done' AND p.RemainingQuantity > 0 AND i.DeliveredQuantity < i.Quantity;
|
||||
|
||||
COMMIT TRANSACTION;
|
||||
END
|
||||
|
|
@ -1,50 +0,0 @@
|
|||
-- Talep Kalemleri sekmesinde seçilen kalemi (@Key = belge|kalem) teklif talebine ya da taslak siparişe kopyalar.
|
||||
-- Kalem yalnız belgenin şubesindeki talepten gelir. Fiyat: sözleşme kalemi › tedarikçi fiyatı › 0; termin talebin istenen tarihidir.
|
||||
CREATE OR ALTER PROCEDURE [dbo].[Prc_P_PurchaseImportItem]
|
||||
@Key nvarchar(80)
|
||||
AS
|
||||
BEGIN
|
||||
SET NOCOUNT ON;
|
||||
|
||||
DECLARE @DocId uniqueidentifier = TRY_CAST(LEFT(@Key, 36) AS uniqueidentifier),
|
||||
@ItemId uniqueidentifier = TRY_CAST(RIGHT(@Key, 36) AS uniqueidentifier),
|
||||
@IsOrder bit = 0, @Tenant uniqueidentifier, @Branch uniqueidentifier, @Supplier uniqueidentifier, @Agr uniqueidentifier, @Status nvarchar(16),
|
||||
@ProductId uniqueidentifier, @Description nvarchar(512), @Quantity decimal(18, 4), @UomId nvarchar(50),
|
||||
@UnitPrice decimal(18, 4), @TaxRate decimal(18, 4), @DueDate datetime;
|
||||
|
||||
SELECT @Tenant = TenantId, @Branch = BranchId, @Supplier = SupplierId, @Agr = AgreementId, @Status = Status
|
||||
FROM Prc_T_PurchaseRfq WHERE Id = @DocId AND IsDeleted = 0 AND Status IN ('Draft', 'Sent');
|
||||
IF @Status IS NULL
|
||||
SELECT @Tenant = TenantId, @Branch = BranchId, @Supplier = SupplierId, @Agr = AgreementId, @Status = Status, @IsOrder = 1
|
||||
FROM Prc_T_PurchaseOrder WHERE Id = @DocId AND IsDeleted = 0 AND Status = 'Draft';
|
||||
IF @Status IS NULL
|
||||
THROW 50161, N'Talep kalemi yalnız teklif aşamasındaki teklif talebine ya da taslak siparişe aktarılabilir.', 1;
|
||||
|
||||
SELECT @ProductId = a.ProductId, @Description = a.RequestReason, @Quantity = a.Quantity, @UomId = a.UomId, @DueDate = a.DueDate,
|
||||
@TaxRate = ISNULL(p.PurchaseTaxRate, 0),
|
||||
@UnitPrice = COALESCE((SELECT TOP 1 al.UnitPrice FROM Prc_T_PurchaseAgreementLine al
|
||||
WHERE al.AgreementId = @Agr AND al.ProductId = a.ProductId AND al.IsDeleted = 0),
|
||||
(SELECT TOP 1 ps.Price FROM Inv_T_ProductSupplier ps
|
||||
WHERE ps.ProductId = a.ProductId AND ps.ContactId = @Supplier AND ps.IsDeleted = 0
|
||||
ORDER BY ps.MinQuantity), 0)
|
||||
FROM Prc_V_MaterialRequestAvailableItem a
|
||||
LEFT JOIN Inv_T_Product p ON p.Id = a.ProductId
|
||||
WHERE a.Id = @ItemId AND a.BranchId = @Branch AND (a.TenantId = @Tenant OR (a.TenantId IS NULL AND @Tenant IS NULL));
|
||||
IF @ProductId IS NULL
|
||||
THROW 50162, N'Talep kalemi artık aktarılamaz: başka bir teklife ya da siparişe aktarılmış veya talep değişmiş.', 1;
|
||||
|
||||
IF @IsOrder = 1
|
||||
BEGIN
|
||||
INSERT INTO Prc_T_PurchaseOrderLine (Id, TenantId, PurchaseOrderId, ProductId, Description, Quantity, UomId,
|
||||
UnitPrice, TaxRate, Amount, DeliveryDate, MaterialRequestItemId, CreationTime, IsDeleted)
|
||||
VALUES (NEWID(), @Tenant, @DocId, @ProductId, @Description, @Quantity, @UomId, @UnitPrice, @TaxRate, 0, @DueDate, @ItemId, GETUTCDATE(), 0);
|
||||
EXEC Prc_P_PurchaseOrderRecalc @DocId;
|
||||
END
|
||||
ELSE
|
||||
BEGIN
|
||||
INSERT INTO Prc_T_PurchaseRfqLine (Id, TenantId, PurchaseRfqId, ProductId, Description, Quantity, UomId,
|
||||
UnitPrice, TaxRate, Amount, DeliveryDate, MaterialRequestItemId, CreationTime, IsDeleted)
|
||||
VALUES (NEWID(), @Tenant, @DocId, @ProductId, @Description, @Quantity, @UomId, @UnitPrice, @TaxRate, 0, @DueDate, @ItemId, GETUTCDATE(), 0);
|
||||
EXEC Prc_P_PurchaseRfqRecalc @DocId;
|
||||
END
|
||||
END
|
||||
19
configs/seeds/sql/object/Prc_TR_MaterialRequestLock.sql
Normal file
19
configs/seeds/sql/object/Prc_TR_MaterialRequestLock.sql
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
-- Onaya gönderilmiş talebin başlığı değiştirilemez (Taleplerim ve talebi gösteren diğer ekranlar): değişiklik için talep Taslak adımına alınır,
|
||||
-- düzenlenir ve yeniden onaya gönderilir. Kural ekranın UpdateBeforeCommand'ında değil burada, çünkü onay akışı da başlığı aynı güncelleme
|
||||
-- yolundan yazar; yalnız iş alanları karşılaştırılır, onay alanları (durum, onaycı, tarih, açıklama, onaycı listeleri) ve silme serbesttir.
|
||||
-- Satırların kuralı App.Prc.MaterialRequestLine'ın Insert/Update/DeleteBeforeCommand'ındadır.
|
||||
CREATE OR ALTER TRIGGER [dbo].[Prc_TR_MaterialRequestLock] ON [dbo].[Prc_T_MaterialRequest]
|
||||
AFTER UPDATE
|
||||
AS
|
||||
BEGIN
|
||||
SET NOCOUNT ON;
|
||||
IF EXISTS (SELECT 1
|
||||
FROM inserted i
|
||||
INNER JOIN deleted d ON d.Id = i.Id
|
||||
WHERE ISNULL(d.ApprovalStatus, N'') <> N'' AND i.IsDeleted = 0
|
||||
AND (i.Priority <> d.Priority OR i.RequesterUserId <> d.RequesterUserId OR i.BranchId <> d.BranchId
|
||||
OR i.DepartmentId <> d.DepartmentId OR i.WarehouseId <> d.WarehouseId OR i.LocationId <> d.LocationId
|
||||
OR i.RequestDate <> d.RequestDate OR ISNULL(i.Description, N'') <> ISNULL(d.Description, N'')))
|
||||
THROW 50004, N'Onaya gönderilmiş talep değiştirilemez: önce talebi Taslak adımına alın, düzenleyip yeniden onaya gönderin.', 1;
|
||||
END
|
||||
GO
|
||||
|
|
@ -8,11 +8,10 @@ BEGIN
|
|||
[ProductId] uniqueidentifier NOT NULL,
|
||||
[Quantity] decimal(18, 4) NOT NULL,
|
||||
[UomId] nvarchar(64) NOT NULL,
|
||||
[FulfillmentMethod] nvarchar(16) NOT NULL DEFAULT 'Purchase',
|
||||
[DueDate] date NOT NULL,
|
||||
[RequestReason] nvarchar(256) NOT NULL,
|
||||
[DeliveredQuantity] decimal(18, 4) NOT NULL DEFAULT 0,
|
||||
[PurchaseResponsibleUserId] uniqueidentifier NULL,
|
||||
[FromStockQuantity] decimal(18, 4) NOT NULL DEFAULT 0,
|
||||
[LineStatus] nvarchar(16) NOT NULL DEFAULT 'Waiting',
|
||||
[CreationTime] datetime2 NOT NULL DEFAULT GETUTCDATE(),
|
||||
[CreatorId] uniqueidentifier NULL,
|
||||
|
|
|
|||
|
|
@ -1,42 +0,0 @@
|
|||
IF OBJECT_ID(N'[dbo].[Prc_T_MaterialRequestLine]', 'U') IS NULL
|
||||
BEGIN
|
||||
CREATE TABLE [dbo].[Prc_T_MaterialRequestLine]
|
||||
(
|
||||
[Id] uniqueidentifier NOT NULL DEFAULT NEWID(),
|
||||
[TenantId] uniqueidentifier NULL,
|
||||
[MaterialRequestId] uniqueidentifier NOT NULL,
|
||||
[ProductId] uniqueidentifier NOT NULL,
|
||||
[Quantity] decimal(18, 4) NOT NULL,
|
||||
[UomId] uniqueidentifier NOT NULL,
|
||||
[FulfillmentMethod] nvarchar(16) NOT NULL DEFAULT 'Purchase',
|
||||
[DueDate] date NOT NULL,
|
||||
[RequestReason] nvarchar(256) NOT NULL,
|
||||
[DeliveredQuantity] decimal(18, 4) NOT NULL DEFAULT 0,
|
||||
[PurchaseResponsibleUserId] uniqueidentifier NULL,
|
||||
[LineStatus] nvarchar(16) NOT NULL DEFAULT 'Waiting',
|
||||
[CreationTime] datetime2 NOT NULL DEFAULT GETUTCDATE(),
|
||||
[CreatorId] uniqueidentifier NULL,
|
||||
[LastModificationTime] datetime2 NULL,
|
||||
[LastModifierId] uniqueidentifier NULL,
|
||||
[IsDeleted] bit NOT NULL DEFAULT 0,
|
||||
[DeletionTime] datetime2 NULL,
|
||||
[DeleterId] uniqueidentifier NULL,
|
||||
CONSTRAINT [PK_Prc_T_MaterialRequestLine] PRIMARY KEY NONCLUSTERED
|
||||
(
|
||||
[Id] ASC
|
||||
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
|
||||
) ON [PRIMARY]
|
||||
END
|
||||
GO
|
||||
|
||||
IF INDEXPROPERTY(OBJECT_ID(N'[dbo].[Prc_T_MaterialRequestLine]'), 'IX_Prc_T_MaterialRequestLine_MaterialRequestId', 'IndexID') IS NULL
|
||||
BEGIN
|
||||
CREATE INDEX [IX_Prc_T_MaterialRequestLine_MaterialRequestId] ON [dbo].[Prc_T_MaterialRequestLine] ([MaterialRequestId] ASC);
|
||||
END
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'[dbo].[FK_Prc_T_MaterialRequestLine_MaterialRequestId]', 'F') IS NULL
|
||||
BEGIN
|
||||
ALTER TABLE [dbo].[Prc_T_MaterialRequestLine] ADD CONSTRAINT [FK_Prc_T_MaterialRequestLine_MaterialRequestId] FOREIGN KEY ([MaterialRequestId]) REFERENCES [dbo].[Prc_T_MaterialRequest] ([Id]) ON DELETE CASCADE ON UPDATE NO ACTION;
|
||||
END
|
||||
GO
|
||||
39
configs/seeds/sql/object/Prc_T_MaterialRequestPlanLine.sql
Normal file
39
configs/seeds/sql/object/Prc_T_MaterialRequestPlanLine.sql
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
-- Planla diyaloğunun taslak karşılama planı: talep kaleminin onaylanmamış dağıtımı (iç transfer: kaynak konum, satınalma: tedarikçi) ve
|
||||
-- miktarı. Onay (Prc_P_MaterialRequestPlanConfirm) satırları teklif talebine ya da iç transfere çevirir ve siler.
|
||||
IF OBJECT_ID(N'[dbo].[Prc_T_MaterialRequestPlanLine]', 'U') IS NULL
|
||||
BEGIN
|
||||
CREATE TABLE [dbo].[Prc_T_MaterialRequestPlanLine]
|
||||
(
|
||||
[Id] uniqueidentifier NOT NULL DEFAULT NEWID(),
|
||||
[TenantId] uniqueidentifier NULL,
|
||||
[MaterialRequestItemId] uniqueidentifier NOT NULL,
|
||||
[PlanMethod] nvarchar(16) NOT NULL,
|
||||
[SupplierId] uniqueidentifier NULL,
|
||||
[SourceLocationId] uniqueidentifier NULL,
|
||||
[Quantity] decimal(18, 4) NOT NULL DEFAULT 0,
|
||||
[CreationTime] datetime2 NOT NULL DEFAULT GETUTCDATE(),
|
||||
[CreatorId] uniqueidentifier NULL,
|
||||
[LastModificationTime] datetime2 NULL,
|
||||
[LastModifierId] uniqueidentifier NULL,
|
||||
[IsDeleted] bit NOT NULL DEFAULT 0,
|
||||
[DeletionTime] datetime2 NULL,
|
||||
[DeleterId] uniqueidentifier NULL,
|
||||
CONSTRAINT [PK_Prc_T_MaterialRequestPlanLine] PRIMARY KEY NONCLUSTERED
|
||||
(
|
||||
[Id] ASC
|
||||
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
|
||||
) ON [PRIMARY]
|
||||
END
|
||||
GO
|
||||
|
||||
IF INDEXPROPERTY(OBJECT_ID(N'[dbo].[Prc_T_MaterialRequestPlanLine]'), 'IX_Prc_T_MaterialRequestPlanLine_MaterialRequestItemId', 'IndexID') IS NULL
|
||||
BEGIN
|
||||
CREATE INDEX [IX_Prc_T_MaterialRequestPlanLine_MaterialRequestItemId] ON [dbo].[Prc_T_MaterialRequestPlanLine] ([MaterialRequestItemId] ASC);
|
||||
END
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'[dbo].[FK_Prc_T_MaterialRequestPlanLine_MaterialRequestItemId]', 'F') IS NULL
|
||||
BEGIN
|
||||
ALTER TABLE [dbo].[Prc_T_MaterialRequestPlanLine] ADD CONSTRAINT [FK_Prc_T_MaterialRequestPlanLine_MaterialRequestItemId] FOREIGN KEY ([MaterialRequestItemId]) REFERENCES [dbo].[Prc_T_MaterialRequestItem] ([Id]) ON DELETE CASCADE ON UPDATE NO ACTION;
|
||||
END
|
||||
GO
|
||||
|
|
@ -1,18 +0,0 @@
|
|||
-- Teklife ya da siparişe aktarılabilecek talep kalemleri: onaylı talebin satınalma ile karşılanacak,
|
||||
-- bekleyen ve iptal olmayan bir teklif/siparişte yer almayan kalemi. Aktarım ve talep seçimi buradan okur.
|
||||
CREATE OR ALTER VIEW [dbo].[Prc_V_MaterialRequestAvailableItem] AS
|
||||
SELECT i.Id, i.TenantId, i.MaterialRequestId, r.RequestNo, r.RequesterUserId, i.ProductId, i.Quantity, i.UomId,
|
||||
i.RequestReason, i.DueDate, r.BranchId
|
||||
FROM Prc_T_MaterialRequestItem i
|
||||
INNER JOIN Prc_T_MaterialRequest r ON r.Id = i.MaterialRequestId
|
||||
WHERE i.IsDeleted = 0 AND r.IsDeleted = 0
|
||||
AND r.ApprovalStatus IN (N'Onaylandı', N'Teklif Talebi', N'Teklif Talebi Gönderildi', N'Satınalma Siparişi')
|
||||
AND i.FulfillmentMethod = 'Purchase' AND i.LineStatus = 'Waiting'
|
||||
AND NOT EXISTS (SELECT 1 FROM Prc_T_PurchaseRfqLine rl
|
||||
INNER JOIN Prc_T_PurchaseRfq q ON q.Id = rl.PurchaseRfqId
|
||||
WHERE rl.MaterialRequestItemId = i.Id AND rl.IsDeleted = 0
|
||||
AND q.IsDeleted = 0 AND q.Status <> 'Cancelled')
|
||||
AND NOT EXISTS (SELECT 1 FROM Prc_T_PurchaseOrderLine ol
|
||||
INNER JOIN Prc_T_PurchaseOrder o ON o.Id = ol.PurchaseOrderId
|
||||
WHERE ol.MaterialRequestItemId = i.Id AND ol.IsDeleted = 0
|
||||
AND o.IsDeleted = 0 AND o.Status <> 'Cancelled')
|
||||
32
configs/seeds/sql/object/Prc_V_MaterialRequestItemPlan.sql
Normal file
32
configs/seeds/sql/object/Prc_V_MaterialRequestItemPlan.sql
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
-- Talep kaleminin planlanmış payları ve planlanacak kalanı (Planlama, Plan Takibi, kalem durumu). Miktarlar kalemin birimine çevrilir.
|
||||
-- Satınalma payı: teklif aşamasındaki teklif talebinde ya da iptal olmayan siparişe geçmiş teklif kaleminde duran miktar; ihale aynı kalemi
|
||||
-- bütün tedarikçilere kopyaladığı için ihale × ihale kalemi başına bir kez (en büyüğü) sayılır.
|
||||
-- Transfer payı: iptal olmayan iç transfer satırı — tamamlanmış belgede yapılan, açık belgede istenen miktar (eksik tamamlanan belgenin kalanı
|
||||
-- backorder belgesinde istenir); iade belgesi sayılmaz.
|
||||
-- Stok payı: stok talebin teslim konumundayken onaylanan, belgesiz karşılanan miktar (FromStockQuantity).
|
||||
CREATE OR ALTER VIEW [dbo].[Prc_V_MaterialRequestItemPlan] AS
|
||||
SELECT i.Id, i.TenantId, ISNULL(pq.Quantity, 0) AS PurchaseQuantity, ISNULL(tq.Quantity, 0) AS TransferQuantity,
|
||||
i.Quantity - ISNULL(pq.Quantity, 0) - ISNULL(tq.Quantity, 0) - i.FromStockQuantity AS RemainingQuantity,
|
||||
i.FromStockQuantity
|
||||
FROM Prc_T_MaterialRequestItem i
|
||||
OUTER APPLY (SELECT SUM(g.Quantity) AS Quantity
|
||||
FROM (SELECT MAX(c.Quantity) AS Quantity
|
||||
FROM (SELECT ISNULL(q.TenderGroupId, q.Id) AS TenderGroupId, ISNULL(rl.TenderLineId, rl.Id) AS TenderLineId,
|
||||
dbo.Inv_F_UomConvert(rl.Quantity, rl.UomId, i.UomId) AS Quantity
|
||||
FROM Prc_T_PurchaseRfqLine rl
|
||||
INNER JOIN Prc_T_PurchaseRfq q ON q.Id = rl.PurchaseRfqId
|
||||
WHERE rl.MaterialRequestItemId = i.Id AND rl.IsDeleted = 0 AND q.IsDeleted = 0
|
||||
AND (q.Status IN ('Draft', 'Sent')
|
||||
OR (q.Status = 'Purchase'
|
||||
AND EXISTS (SELECT 1 FROM Prc_T_PurchaseOrderLine ol
|
||||
INNER JOIN Prc_T_PurchaseOrder o ON o.Id = ol.PurchaseOrderId
|
||||
WHERE ol.PurchaseRfqLineId = rl.Id AND ol.IsDeleted = 0
|
||||
AND o.IsDeleted = 0 AND o.Status <> 'Cancelled')))) c
|
||||
GROUP BY c.TenderGroupId, c.TenderLineId) g) pq
|
||||
OUTER APPLY (SELECT SUM(c.Quantity) AS Quantity
|
||||
FROM (SELECT dbo.Inv_F_UomConvert(CASE WHEN t.Status = 'Done' THEN tl.Quantity ELSE tl.DemandQuantity END, tl.UomId, i.UomId) AS Quantity
|
||||
FROM Inv_T_TransferLine tl
|
||||
INNER JOIN Inv_T_Transfer t ON t.Id = tl.TransferId
|
||||
WHERE tl.MaterialRequestItemId = i.Id AND tl.IsDeleted = 0 AND t.IsDeleted = 0
|
||||
AND t.OperationKind = 'InternalTransfer' AND t.Status <> 'Cancelled' AND t.ReturnOfId IS NULL) c) tq
|
||||
WHERE i.IsDeleted = 0
|
||||
|
|
@ -5,8 +5,8 @@ AS
|
|||
SELECT COALESCE(i.Id, r.Id) AS Id, r.Id AS MaterialRequestId, r.TenantId, r.IsDeleted,
|
||||
r.RequestNo, r.Priority, r.RequesterUserId, r.DepartmentId, r.WarehouseId, r.LocationId, r.RequestDate,
|
||||
r.Description, r.ApprovalStatus, r.ApprovalUserName, r.ApprovalDate, r.ApprovalDescription,
|
||||
i.ProductId, i.Quantity, i.UomId, i.FulfillmentMethod, i.DueDate, i.RequestReason, i.DeliveredQuantity,
|
||||
i.PurchaseResponsibleUserId, i.LineStatus, r.BranchId
|
||||
i.ProductId, i.Quantity, i.UomId, i.DueDate, i.RequestReason, i.DeliveredQuantity,
|
||||
i.LineStatus, r.BranchId
|
||||
FROM Prc_T_MaterialRequest r
|
||||
LEFT JOIN Prc_T_MaterialRequestItem i ON i.MaterialRequestId = r.Id AND i.IsDeleted = 0;
|
||||
GO
|
||||
|
|
|
|||
23
configs/seeds/sql/object/Prc_V_MaterialRequestPlan.sql
Normal file
23
configs/seeds/sql/object/Prc_V_MaterialRequestPlan.sql
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
-- Planlama (App.Prc.MaterialRequestPlan): onaylanmış (satınalmada ilerleyen dahil) talebin bekleyen ve planlanacak miktarı kalan kalemleri.
|
||||
-- Stok bütün iç konumların toplamıdır (kalemin biriminde); DueState termin süzgecidir (Late / Week = 7 gün içinde / Later). Taslak Plan,
|
||||
-- Planla diyaloğunda girilip henüz onaylanmamış dağıtımın toplamıdır (Prc_T_MaterialRequestPlanLine).
|
||||
CREATE OR ALTER VIEW [dbo].[Prc_V_MaterialRequestPlan] AS
|
||||
SELECT i.Id, i.TenantId, i.MaterialRequestId, r.RequestNo, r.Priority, r.RequesterUserId, r.BranchId, r.DepartmentId, r.WarehouseId, r.LocationId,
|
||||
r.RequestDate, i.ProductId, p.CategoryId, i.Quantity, i.UomId, i.DueDate,
|
||||
CASE WHEN i.DueDate < CAST(GETDATE() AS date) THEN 'Late'
|
||||
WHEN i.DueDate <= DATEADD(day, 7, CAST(GETDATE() AS date)) THEN 'Week' ELSE 'Later' END AS DueState,
|
||||
i.RequestReason,
|
||||
pl.PurchaseQuantity, pl.TransferQuantity, pl.RemainingQuantity, ISNULL(st.Quantity, 0) AS StockQuantity,
|
||||
(SELECT SUM(x.Quantity) FROM Prc_T_MaterialRequestPlanLine x WHERE x.MaterialRequestItemId = i.Id AND x.IsDeleted = 0) AS DraftQuantity,
|
||||
i.IsDeleted
|
||||
FROM Prc_T_MaterialRequestItem i
|
||||
INNER JOIN Prc_T_MaterialRequest r ON r.Id = i.MaterialRequestId
|
||||
INNER JOIN Prc_V_MaterialRequestItemPlan pl ON pl.Id = i.Id
|
||||
LEFT JOIN Inv_T_Product p ON p.Id = i.ProductId
|
||||
OUTER APPLY (SELECT SUM(c.Quantity) AS Quantity
|
||||
FROM (SELECT dbo.Inv_F_UomConvert(s.Quantity, s.UomId, i.UomId) AS Quantity
|
||||
FROM Inv_T_Stock s
|
||||
INNER JOIN Inv_T_Location l ON l.Id = s.LocationId AND l.LocationType = 'Internal'
|
||||
WHERE s.ProductId = i.ProductId AND s.IsDeleted = 0) c) st
|
||||
WHERE i.IsDeleted = 0 AND r.IsDeleted = 0 AND i.LineStatus = 'Waiting' AND pl.RemainingQuantity > 0
|
||||
AND r.ApprovalStatus IN (N'Onaylandı', N'Teklif Talebi', N'Teklif Talebi Gönderildi', N'Satınalma Siparişi')
|
||||
12
configs/seeds/sql/object/Prc_V_MaterialRequestPlanLine.sql
Normal file
12
configs/seeds/sql/object/Prc_V_MaterialRequestPlanLine.sql
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
-- Planla diyaloğunun Karşılama Planı ızgarası (App.Prc.MaterialRequestPlanLine): talep kaleminin onay bekleyen taslak planı. Miktar kalemin
|
||||
-- biriminde; satınalmada birim fiyat teklif kalemine yazılacak fiyattır (tedarikçinin en düşük minimum miktarlı satırı). BaseId kalemdir.
|
||||
CREATE OR ALTER VIEW [dbo].[Prc_V_MaterialRequestPlanLine] AS
|
||||
SELECT pl.Id, pl.TenantId, pl.MaterialRequestItemId AS BaseId, pl.PlanMethod, pl.SupplierId, pl.SourceLocationId, pl.Quantity, i.UomId,
|
||||
ps.Price, ps.CurrencyId, pl.CreationTime, pl.CreatorId, pl.IsDeleted
|
||||
FROM Prc_T_MaterialRequestPlanLine pl
|
||||
INNER JOIN Prc_T_MaterialRequestItem i ON i.Id = pl.MaterialRequestItemId
|
||||
OUTER APPLY (SELECT TOP 1 x.Price, x.CurrencyId
|
||||
FROM Inv_T_ProductSupplier x
|
||||
WHERE pl.PlanMethod = 'Purchase' AND x.ProductId = i.ProductId AND x.ContactId = pl.SupplierId AND x.IsDeleted = 0
|
||||
ORDER BY x.MinQuantity) ps;
|
||||
GO
|
||||
38
configs/seeds/sql/object/Prc_V_MaterialRequestPlanSource.sql
Normal file
38
configs/seeds/sql/object/Prc_V_MaterialRequestPlanSource.sql
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
-- Planla diyaloğunun İç Transfer ızgarası (App.Prc.MaterialRequestPlanSource) ve iç transfer / stoktan karşılama kararlarının stok kuralı:
|
||||
-- talep kaleminin ürününün stoğu olan iç konumlar. Talebin teslim konumu da listelenir (IsDestination): oraya yazılan plan transfer açmaz,
|
||||
-- stoktan karşılanır (PlanMethod = Stock). Miktarlar kalemin biriminde; ayrılan = açık (Taslak/Bekleyen/Hazır) transferlerde o
|
||||
-- konumdan istenen, serbest = eldeki − ayrılan. Plan Miktarı kalemin bu konum için taslak planıdır. BaseId diyaloğun süzdüğü kalem, Id
|
||||
-- kalem + ':' + konumdur (Prc_P_MaterialRequestPlanLineSave ayırır); taslak kaydı ve onay serbest stoğu buradan okur.
|
||||
-- MaxQuantity satıra yazılabilecek en fazla plan miktarıdır: serbest stok ile planlanacak kalandan kalemin diğer taslak satırları
|
||||
-- düşüldükten sonra kalanın küçüğü (ızgaranın doğrulaması; kayıt yordamı aynı kuralı yeniden denetler).
|
||||
CREATE OR ALTER VIEW [dbo].[Prc_V_MaterialRequestPlanSource] AS
|
||||
SELECT CONCAT(CAST(i.Id AS nvarchar(36)), ':', CAST(st.LocationId AS nvarchar(36))) AS Id, i.TenantId, i.Id AS BaseId,
|
||||
l.BranchId, l.WarehouseId, st.LocationId, st.OnHand, ISNULL(rs.Quantity, 0) AS ReservedQuantity,
|
||||
st.OnHand - ISNULL(rs.Quantity, 0) AS FreeQuantity, i.UomId, pl.Quantity AS PlanQuantity, i.IsDeleted,
|
||||
CAST(CASE WHEN st.LocationId = r.LocationId THEN 1 ELSE 0 END AS bit) AS IsDestination, mx.Quantity AS MaxQuantity
|
||||
FROM Prc_T_MaterialRequestItem i
|
||||
INNER JOIN Prc_T_MaterialRequest r ON r.Id = i.MaterialRequestId
|
||||
CROSS APPLY (SELECT c.LocationId, SUM(c.Quantity) AS OnHand
|
||||
FROM (SELECT s.LocationId, s.Quantity AS Raw, dbo.Inv_F_UomConvert(s.Quantity, s.UomId, i.UomId) AS Quantity
|
||||
FROM Inv_T_Stock s
|
||||
WHERE s.ProductId = i.ProductId AND s.IsDeleted = 0) c
|
||||
GROUP BY c.LocationId
|
||||
HAVING SUM(c.Raw) > 0) st
|
||||
INNER JOIN Inv_T_Location l ON l.Id = st.LocationId AND l.LocationType = 'Internal' AND l.IsDeleted = 0
|
||||
OUTER APPLY (SELECT SUM(c.Quantity) AS Quantity
|
||||
FROM (SELECT dbo.Inv_F_UomConvert(tl.DemandQuantity, tl.UomId, i.UomId) AS Quantity
|
||||
FROM Inv_T_TransferLine tl
|
||||
INNER JOIN Inv_T_Transfer t ON t.Id = tl.TransferId
|
||||
WHERE t.SourceLocationId = st.LocationId AND tl.ProductId = i.ProductId AND tl.IsDeleted = 0 AND t.IsDeleted = 0
|
||||
AND t.Status IN ('Draft', 'Waiting', 'Ready')) c) rs
|
||||
LEFT JOIN Prc_T_MaterialRequestPlanLine pl
|
||||
ON pl.MaterialRequestItemId = i.Id AND pl.PlanMethod IN ('Transfer', 'Stock') AND pl.SourceLocationId = st.LocationId AND pl.IsDeleted = 0
|
||||
INNER JOIN Prc_V_MaterialRequestItemPlan ip ON ip.Id = i.Id
|
||||
OUTER APPLY (SELECT SUM(x.Quantity) AS Quantity
|
||||
FROM Prc_T_MaterialRequestPlanLine x
|
||||
WHERE x.MaterialRequestItemId = i.Id AND x.IsDeleted = 0 AND (x.SourceLocationId IS NULL OR x.SourceLocationId <> st.LocationId)) od
|
||||
CROSS APPLY (SELECT CASE WHEN v.Quantity < 0 THEN 0 ELSE v.Quantity END AS Quantity
|
||||
FROM (SELECT CASE WHEN st.OnHand - ISNULL(rs.Quantity, 0) < ip.RemainingQuantity - ISNULL(od.Quantity, 0)
|
||||
THEN st.OnHand - ISNULL(rs.Quantity, 0) ELSE ip.RemainingQuantity - ISNULL(od.Quantity, 0) END AS Quantity) v) mx
|
||||
WHERE i.IsDeleted = 0;
|
||||
GO
|
||||
41
configs/seeds/sql/object/Prc_V_MaterialRequestPlanTrack.sql
Normal file
41
configs/seeds/sql/object/Prc_V_MaterialRequestPlanTrack.sql
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
-- Plan Takibi (App.Prc.MaterialRequestPlanTrack): talep kalemleri için verilen her karar — satınalmada ihalenin kök teklif talebindeki kalem
|
||||
-- (alternatif tedarikçilere kopyalanan satırlar tekrar listelenmez; siparişe dönüştüyse ihale kaleminin siparişi ve tedarikçisi), iç
|
||||
-- transferde transfer satırı, stoktan karşılamada kalemin kendisi (belgesiz; konum talebin teslim konumu). Gerçekleşen: siparişte alınan,
|
||||
-- transferde tamamlanmış belgede yapılan, stokta karşılanan miktar.
|
||||
CREATE OR ALTER VIEW [dbo].[Prc_V_MaterialRequestPlanTrack] AS
|
||||
SELECT rl.Id, rl.TenantId, i.Id AS MaterialRequestItemId, i.MaterialRequestId, r.RequestNo, r.BranchId, r.DepartmentId, r.WarehouseId,
|
||||
r.LocationId, i.ProductId, i.DueDate, CAST('Purchase' AS nvarchar(16)) AS PlanMethod, q.Id AS DocumentId, q.RfqNo AS DocumentNo,
|
||||
q.Status AS DocumentStatus, COALESCE(o.SupplierId, q.SupplierId) AS SupplierId, CAST(NULL AS uniqueidentifier) AS SourceLocationId,
|
||||
o.Id AS PurchaseOrderId, o.OrderNo AS PurchaseOrderNo, o.Status AS OrderStatus, rl.Quantity, rl.UomId,
|
||||
ISNULL(o.ReceivedQuantity, 0) AS DoneQuantity, rl.CreationTime AS PlanDate, rl.CreatorId AS PlannerUserId, rl.IsDeleted
|
||||
FROM Prc_T_PurchaseRfqLine rl
|
||||
INNER JOIN Prc_T_PurchaseRfq q ON q.Id = rl.PurchaseRfqId AND q.IsDeleted = 0 AND q.Id = ISNULL(q.TenderGroupId, q.Id)
|
||||
INNER JOIN Prc_T_MaterialRequestItem i ON i.Id = rl.MaterialRequestItemId
|
||||
INNER JOIN Prc_T_MaterialRequest r ON r.Id = i.MaterialRequestId
|
||||
OUTER APPLY (SELECT TOP 1 po.Id, po.OrderNo, po.Status, po.SupplierId, ol.ReceivedQuantity
|
||||
FROM Prc_T_PurchaseRfqLine al
|
||||
INNER JOIN Prc_T_PurchaseOrderLine ol ON ol.PurchaseRfqLineId = al.Id AND ol.IsDeleted = 0
|
||||
INNER JOIN Prc_T_PurchaseOrder po ON po.Id = ol.PurchaseOrderId AND po.IsDeleted = 0
|
||||
WHERE al.TenderLineId = ISNULL(rl.TenderLineId, rl.Id) AND al.IsDeleted = 0
|
||||
ORDER BY CASE WHEN po.Status = 'Cancelled' THEN 1 ELSE 0 END, po.CreationTime DESC) o
|
||||
WHERE rl.IsDeleted = 0
|
||||
UNION ALL
|
||||
SELECT tl.Id, tl.TenantId, i.Id, i.MaterialRequestId, r.RequestNo, r.BranchId, r.DepartmentId, r.WarehouseId,
|
||||
r.LocationId, i.ProductId, i.DueDate, CAST('Transfer' AS nvarchar(16)), t.Id, t.TransferNo,
|
||||
t.Status, NULL, t.SourceLocationId,
|
||||
NULL, NULL, NULL, tl.DemandQuantity, tl.UomId,
|
||||
CASE WHEN t.Status = 'Done' THEN tl.Quantity ELSE 0 END, tl.CreationTime, tl.CreatorId, tl.IsDeleted
|
||||
FROM Inv_T_TransferLine tl
|
||||
INNER JOIN Inv_T_Transfer t ON t.Id = tl.TransferId AND t.IsDeleted = 0 AND t.OperationKind = 'InternalTransfer' AND t.ReturnOfId IS NULL
|
||||
INNER JOIN Prc_T_MaterialRequestItem i ON i.Id = tl.MaterialRequestItemId
|
||||
INNER JOIN Prc_T_MaterialRequest r ON r.Id = i.MaterialRequestId
|
||||
WHERE tl.IsDeleted = 0
|
||||
UNION ALL
|
||||
SELECT i.Id, i.TenantId, i.Id, i.MaterialRequestId, r.RequestNo, r.BranchId, r.DepartmentId, r.WarehouseId,
|
||||
r.LocationId, i.ProductId, i.DueDate, CAST('Stock' AS nvarchar(16)), NULL, NULL,
|
||||
NULL, NULL, r.LocationId,
|
||||
NULL, NULL, NULL, i.FromStockQuantity, i.UomId,
|
||||
i.FromStockQuantity, i.LastModificationTime, i.LastModifierId, i.IsDeleted
|
||||
FROM Prc_T_MaterialRequestItem i
|
||||
INNER JOIN Prc_T_MaterialRequest r ON r.Id = i.MaterialRequestId
|
||||
WHERE i.FromStockQuantity > 0
|
||||
34
configs/seeds/sql/object/Prc_V_MaterialRequestPlanVendor.sql
Normal file
34
configs/seeds/sql/object/Prc_V_MaterialRequestPlanVendor.sql
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
-- Planla diyaloğunun Satınalma ızgarası (App.Prc.MaterialRequestPlanVendor): kiracının bütün aktif kontakları; ürünün fiyat listesindekiler
|
||||
-- fiyatıyla, diğerleri fiyatsız gelir. SuggestRank ızgaranın sırası ve Öner'in seçtiği tedarikçidir: fiyatlılar ucuzdan pahalıya, sonra son alım
|
||||
-- tarihi yeniden eskiye, sonra ad (para birimi farkı gözetilmez). Fiyat satırı teklif kalemine yazılanla aynıdır (en düşük minimum
|
||||
-- miktarlı satır, Prc_P_MaterialRequestPlan); son alım tarihini siparişli alım yazar.
|
||||
-- Plan Miktarı kalemin bu tedarikçi için taslak planıdır; Rfq* tedarikçinin talebin şubesi ve deposu için bu kalemi taşıyan taslak teklif
|
||||
-- talebidir (satırdaki Teklifi Aç). BaseId diyaloğun süzdüğü kalem, Id kalem + ':' + tedarikçidir (Prc_P_MaterialRequestPlanLineSave ayırır).
|
||||
-- MaxQuantity satıra yazılabilecek en fazla plan miktarıdır: planlanacak kalandan kalemin diğer taslak satırları düşülür.
|
||||
CREATE OR ALTER VIEW [dbo].[Prc_V_MaterialRequestPlanVendor] AS
|
||||
SELECT CONCAT(CAST(i.Id AS nvarchar(36)), ':', CAST(c.Id AS nvarchar(36))) AS Id, i.TenantId, i.Id AS BaseId, c.Id AS ContactId,
|
||||
ps.MinQuantity, ps.UomId, ps.Price, ps.CurrencyId, ps.LeadTimeDays, ps.LastPurchaseDate, pl.Quantity AS PlanQuantity,
|
||||
d.Id AS RfqId, d.RfqNo, d.Quantity AS RfqQuantity, i.IsDeleted,
|
||||
ROW_NUMBER() OVER (PARTITION BY i.Id ORDER BY CASE WHEN ps.Price IS NULL THEN 1 ELSE 0 END, ps.Price, ps.LastPurchaseDate DESC, c.Name) AS SuggestRank,
|
||||
CASE WHEN ip.RemainingQuantity - ISNULL(od.Quantity, 0) < 0 THEN 0 ELSE ip.RemainingQuantity - ISNULL(od.Quantity, 0) END AS MaxQuantity
|
||||
FROM Prc_T_MaterialRequestItem i
|
||||
INNER JOIN Prc_T_MaterialRequest r ON r.Id = i.MaterialRequestId
|
||||
INNER JOIN Adm_T_Contact c ON c.IsDeleted = 0 AND c.IsActive = 1
|
||||
AND (c.TenantId = i.TenantId OR (c.TenantId IS NULL AND i.TenantId IS NULL))
|
||||
OUTER APPLY (SELECT TOP 1 x.MinQuantity, x.UomId, x.Price, x.CurrencyId, x.LeadTimeDays, x.LastPurchaseDate
|
||||
FROM Inv_T_ProductSupplier x
|
||||
WHERE x.ProductId = i.ProductId AND x.ContactId = c.Id AND x.IsDeleted = 0
|
||||
ORDER BY x.MinQuantity) ps
|
||||
LEFT JOIN Prc_T_MaterialRequestPlanLine pl
|
||||
ON pl.MaterialRequestItemId = i.Id AND pl.PlanMethod = 'Purchase' AND pl.SupplierId = c.Id AND pl.IsDeleted = 0
|
||||
OUTER APPLY (SELECT TOP 1 q.Id, q.RfqNo, ql.Quantity
|
||||
FROM Prc_T_PurchaseRfq q
|
||||
INNER JOIN Prc_T_PurchaseRfqLine ql ON ql.PurchaseRfqId = q.Id AND ql.MaterialRequestItemId = i.Id AND ql.IsDeleted = 0
|
||||
WHERE q.IsDeleted = 0 AND q.Status = 'Draft' AND q.SupplierId = c.Id AND q.BranchId = r.BranchId AND q.WarehouseId = r.WarehouseId
|
||||
ORDER BY q.CreationTime DESC) d
|
||||
INNER JOIN Prc_V_MaterialRequestItemPlan ip ON ip.Id = i.Id
|
||||
OUTER APPLY (SELECT SUM(x.Quantity) AS Quantity
|
||||
FROM Prc_T_MaterialRequestPlanLine x
|
||||
WHERE x.MaterialRequestItemId = i.Id AND x.IsDeleted = 0 AND (x.SupplierId IS NULL OR x.SupplierId <> c.Id)) od
|
||||
WHERE i.IsDeleted = 0;
|
||||
GO
|
||||
|
|
@ -1,17 +0,0 @@
|
|||
-- İç transfere aktarılabilecek talep kalemleri: onaylı talebin transferle karşılanacak, bekleyen ve açık bir transferde yer almayan
|
||||
-- kalemi, aynı şubedeki taslak iç transfer belgesiyle eşlenir. Id = belge|kalem; Talepten Aktar seçilen satırları Inv_P_TransferImportItem ile ekler.
|
||||
CREATE OR ALTER VIEW [dbo].[Prc_V_MaterialRequestTransferItem] AS
|
||||
SELECT CONCAT(CAST(d.Id AS nvarchar(36)), '|', CAST(i.Id AS nvarchar(36))) AS Id, d.Id AS BaseId, i.TenantId, i.Id AS MaterialRequestItemId,
|
||||
i.MaterialRequestId, r.RequestNo, r.RequesterUserId, i.ProductId, i.Quantity - i.DeliveredQuantity AS Quantity, i.UomId,
|
||||
i.RequestReason, i.DueDate, r.WarehouseId, r.LocationId
|
||||
FROM Inv_T_Transfer d
|
||||
INNER JOIN Prc_T_MaterialRequest r ON r.BranchId = d.BranchId AND (r.TenantId = d.TenantId OR (r.TenantId IS NULL AND d.TenantId IS NULL))
|
||||
INNER JOIN Prc_T_MaterialRequestItem i ON i.MaterialRequestId = r.Id
|
||||
WHERE d.IsDeleted = 0 AND d.OperationKind = 'InternalTransfer' AND d.Status = 'Draft'
|
||||
AND r.IsDeleted = 0 AND i.IsDeleted = 0
|
||||
AND r.ApprovalStatus IN (N'Onaylandı', N'Teklif Talebi', N'Teklif Talebi Gönderildi', N'Satınalma Siparişi')
|
||||
AND i.FulfillmentMethod = 'Transfer' AND i.LineStatus = 'Waiting' AND i.Quantity > i.DeliveredQuantity
|
||||
AND NOT EXISTS (SELECT 1 FROM Inv_T_TransferLine tl
|
||||
INNER JOIN Inv_T_Transfer t ON t.Id = tl.TransferId
|
||||
WHERE tl.MaterialRequestItemId = i.Id AND tl.IsDeleted = 0
|
||||
AND t.IsDeleted = 0 AND t.Status NOT IN ('Done', 'Cancelled'))
|
||||
|
|
@ -1,10 +0,0 @@
|
|||
-- Talep Kalemleri sekmesi: aktarılabilir her talep kalemi, kalem alabilecek açık belgeyle (teklif aşamasındaki
|
||||
-- teklif talebi ya da taslak sipariş) eşlenir; belge yalnız kendi şubesinin talebini alır. Id = belge|kalem; seçilen satırları Seçilenleri Aktar ile Prc_P_PurchaseImportItem kopyalar.
|
||||
CREATE OR ALTER VIEW [dbo].[Prc_V_PurchaseImportItem] AS
|
||||
SELECT CONCAT(CAST(d.Id AS nvarchar(36)), '|', CAST(a.Id AS nvarchar(36))) AS Id, d.Id AS BaseId, a.TenantId, a.MaterialRequestId,
|
||||
a.RequestNo, a.RequesterUserId, a.ProductId, a.Quantity, a.UomId, a.RequestReason, a.DueDate
|
||||
FROM (SELECT Id, TenantId, BranchId FROM Prc_T_PurchaseRfq WHERE IsDeleted = 0 AND Status IN ('Draft', 'Sent')
|
||||
UNION ALL
|
||||
SELECT Id, TenantId, BranchId FROM Prc_T_PurchaseOrder WHERE IsDeleted = 0 AND Status = 'Draft') d
|
||||
INNER JOIN Prc_V_MaterialRequestAvailableItem a ON a.BranchId = d.BranchId
|
||||
AND (a.TenantId = d.TenantId OR (a.TenantId IS NULL AND d.TenantId IS NULL))
|
||||
19
configs/seeds/sql/object/Prc_V_PurchaseReceiptLine.sql
Normal file
19
configs/seeds/sql/object/Prc_V_PurchaseReceiptLine.sql
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
CREATE OR ALTER VIEW [dbo].[Prc_V_PurchaseReceiptLine]
|
||||
AS
|
||||
-- Planlama › Son Alımlar'ın kaynağı: tamamlanan alımların (iade hariç) yapılan satırları; siparişsiz alım da gelir.
|
||||
-- Fiyat ve para birimi yalnız siparişli satırda dolar: sipariş birim fiyatı alım satırının birimine çevrilir.
|
||||
-- Prc öneki migrate sırası içindir (Prc_T_* tablolarından sonra kurulur).
|
||||
SELECT l.Id, t.TenantId, t.IsDeleted, l.ProductId, t.Id AS TransferId, t.TransferNo, t.EffectiveDate, t.PartnerId,
|
||||
t.BranchId, t.WarehouseId, t.DestinationLocationId, l.Quantity, l.UomId,
|
||||
CAST(ROUND(ol.UnitPrice * f.Factor, 4) AS decimal(18, 4)) AS UnitPrice, o.CurrencyId,
|
||||
CAST(ROUND(l.Quantity * ol.UnitPrice * f.Factor, 2) AS decimal(18, 2)) AS UntaxedAmount,
|
||||
o.Id AS PurchaseOrderId, o.OrderNo, m.RequestNo
|
||||
FROM Inv_T_TransferLine l
|
||||
INNER JOIN Inv_T_Transfer t ON t.Id = l.TransferId
|
||||
LEFT JOIN Prc_T_PurchaseOrderLine ol ON ol.Id = l.PurchaseOrderLineId
|
||||
LEFT JOIN Prc_T_PurchaseOrder o ON o.Id = ol.PurchaseOrderId
|
||||
OUTER APPLY (SELECT dbo.Inv_F_UomConvert(1, l.UomId, ol.UomId) AS Factor WHERE ol.Id IS NOT NULL) f
|
||||
LEFT JOIN Prc_T_MaterialRequestItem i ON i.Id = COALESCE(l.MaterialRequestItemId, ol.MaterialRequestItemId)
|
||||
LEFT JOIN Prc_T_MaterialRequest m ON m.Id = i.MaterialRequestId
|
||||
WHERE l.IsDeleted = 0 AND l.Quantity > 0 AND t.OperationKind = 'Receipt' AND t.Status = 'Done' AND t.ReturnOfId IS NULL;
|
||||
GO
|
||||
|
|
@ -432,6 +432,7 @@
|
|||
"AllowAllDeleting": false,
|
||||
"AllowAdding": true,
|
||||
"AllowDuplicate": false,
|
||||
"OpenDetailAfterInsert": false,
|
||||
"UseIcons": false,
|
||||
"ConfirmDelete": true,
|
||||
"NewRowPosition": "viewportTop",
|
||||
|
|
@ -604,6 +605,7 @@
|
|||
"ApprovalDescriptionFieldName": null,
|
||||
"ApprovalIsFilterUserName": false,
|
||||
"ApprovalIsResetWorkflow": false,
|
||||
"ApprovalIsManualStart": false,
|
||||
"Criteria": []
|
||||
},
|
||||
"UserId": null,
|
||||
|
|
@ -1215,6 +1217,8 @@
|
|||
"IgnoreEmptyValue": false,
|
||||
"Reevaluate": true,
|
||||
"ComparisonType": "",
|
||||
"ComparisonTarget": null,
|
||||
"ValidationCallback": null,
|
||||
"Pattern": "",
|
||||
"Max": null,
|
||||
"Min": null,
|
||||
|
|
@ -1353,6 +1357,8 @@
|
|||
"IgnoreEmptyValue": false,
|
||||
"Reevaluate": true,
|
||||
"ComparisonType": "",
|
||||
"ComparisonTarget": null,
|
||||
"ValidationCallback": null,
|
||||
"Pattern": "",
|
||||
"Max": null,
|
||||
"Min": null,
|
||||
|
|
@ -1491,6 +1497,8 @@
|
|||
"IgnoreEmptyValue": true,
|
||||
"Reevaluate": true,
|
||||
"ComparisonType": "",
|
||||
"ComparisonTarget": null,
|
||||
"ValidationCallback": null,
|
||||
"Pattern": "",
|
||||
"Max": null,
|
||||
"Min": null,
|
||||
|
|
@ -1629,6 +1637,8 @@
|
|||
"IgnoreEmptyValue": true,
|
||||
"Reevaluate": true,
|
||||
"ComparisonType": "",
|
||||
"ComparisonTarget": null,
|
||||
"ValidationCallback": null,
|
||||
"Pattern": "^[0-9]{4,15}$",
|
||||
"Max": null,
|
||||
"Min": null,
|
||||
|
|
@ -2901,6 +2911,8 @@
|
|||
"IgnoreEmptyValue": true,
|
||||
"Reevaluate": true,
|
||||
"ComparisonType": "",
|
||||
"ComparisonTarget": null,
|
||||
"ValidationCallback": null,
|
||||
"Pattern": "^(https?:\\/\\/)?([\\w-]+\\.)+[A-Za-z]{2,}(\\/\\S*)?$",
|
||||
"Max": null,
|
||||
"Min": null,
|
||||
|
|
@ -3291,6 +3303,8 @@
|
|||
"IgnoreEmptyValue": false,
|
||||
"Reevaluate": true,
|
||||
"ComparisonType": "",
|
||||
"ComparisonTarget": null,
|
||||
"ValidationCallback": null,
|
||||
"Pattern": "",
|
||||
"Max": null,
|
||||
"Min": null,
|
||||
|
|
@ -3348,8 +3362,6 @@
|
|||
"App.Definitions.Contact.Title",
|
||||
"App.Definitions.Contact.Desc",
|
||||
"App.Listform.ListformField.CompanyType",
|
||||
"App.Listform.ListformField.Latitude",
|
||||
"App.Listform.ListformField.Longitude",
|
||||
"App.StaticLookup.Company",
|
||||
"App.StaticLookup.Individual"
|
||||
],
|
||||
|
|
|
|||
|
|
@ -145,11 +145,6 @@
|
|||
"En": "Completed",
|
||||
"Tr": "Tamamlanan"
|
||||
},
|
||||
{
|
||||
"Key": "App.Hr.Performance.Widget.InProgress",
|
||||
"En": "In Progress",
|
||||
"Tr": "Devam Eden"
|
||||
},
|
||||
{
|
||||
"Key": "App.Hr.Performance.Widget.AverageScore",
|
||||
"En": "Average Score",
|
||||
|
|
@ -609,6 +604,7 @@
|
|||
"AllowAllDeleting": false,
|
||||
"AllowAdding": true,
|
||||
"AllowDuplicate": false,
|
||||
"OpenDetailAfterInsert": false,
|
||||
"UseIcons": false,
|
||||
"ConfirmDelete": true,
|
||||
"NewRowPosition": "viewportTop",
|
||||
|
|
@ -696,6 +692,7 @@
|
|||
"ApprovalDescriptionFieldName": null,
|
||||
"ApprovalIsFilterUserName": false,
|
||||
"ApprovalIsResetWorkflow": false,
|
||||
"ApprovalIsManualStart": false,
|
||||
"Criteria": []
|
||||
},
|
||||
"UserId": null,
|
||||
|
|
@ -1173,6 +1170,8 @@
|
|||
"IgnoreEmptyValue": false,
|
||||
"Reevaluate": true,
|
||||
"ComparisonType": "",
|
||||
"ComparisonTarget": null,
|
||||
"ValidationCallback": null,
|
||||
"Pattern": "",
|
||||
"Max": null,
|
||||
"Min": null,
|
||||
|
|
@ -1437,6 +1436,8 @@
|
|||
"IgnoreEmptyValue": false,
|
||||
"Reevaluate": true,
|
||||
"ComparisonType": "",
|
||||
"ComparisonTarget": null,
|
||||
"ValidationCallback": null,
|
||||
"Pattern": "",
|
||||
"Max": null,
|
||||
"Min": null,
|
||||
|
|
@ -1575,6 +1576,8 @@
|
|||
"IgnoreEmptyValue": false,
|
||||
"Reevaluate": true,
|
||||
"ComparisonType": "",
|
||||
"ComparisonTarget": null,
|
||||
"ValidationCallback": null,
|
||||
"Pattern": "",
|
||||
"Max": null,
|
||||
"Min": null,
|
||||
|
|
@ -2595,6 +2598,8 @@
|
|||
"IgnoreEmptyValue": false,
|
||||
"Reevaluate": true,
|
||||
"ComparisonType": "",
|
||||
"ComparisonTarget": null,
|
||||
"ValidationCallback": null,
|
||||
"Pattern": "",
|
||||
"Max": null,
|
||||
"Min": null,
|
||||
|
|
|
|||
|
|
@ -356,6 +356,7 @@
|
|||
"AllowAllDeleting": false,
|
||||
"AllowAdding": true,
|
||||
"AllowDuplicate": false,
|
||||
"OpenDetailAfterInsert": false,
|
||||
"UseIcons": false,
|
||||
"ConfirmDelete": true,
|
||||
"NewRowPosition": "viewportTop",
|
||||
|
|
@ -436,6 +437,7 @@
|
|||
"ApprovalDescriptionFieldName": null,
|
||||
"ApprovalIsFilterUserName": false,
|
||||
"ApprovalIsResetWorkflow": false,
|
||||
"ApprovalIsManualStart": false,
|
||||
"Criteria": []
|
||||
},
|
||||
"UserId": null,
|
||||
|
|
@ -913,6 +915,8 @@
|
|||
"IgnoreEmptyValue": false,
|
||||
"Reevaluate": true,
|
||||
"ComparisonType": "",
|
||||
"ComparisonTarget": null,
|
||||
"ValidationCallback": null,
|
||||
"Pattern": "",
|
||||
"Max": null,
|
||||
"Min": null,
|
||||
|
|
@ -1177,6 +1181,8 @@
|
|||
"IgnoreEmptyValue": false,
|
||||
"Reevaluate": true,
|
||||
"ComparisonType": "",
|
||||
"ComparisonTarget": null,
|
||||
"ValidationCallback": null,
|
||||
"Pattern": "",
|
||||
"Max": null,
|
||||
"Min": null,
|
||||
|
|
@ -1315,6 +1321,8 @@
|
|||
"IgnoreEmptyValue": false,
|
||||
"Reevaluate": true,
|
||||
"ComparisonType": "",
|
||||
"ComparisonTarget": null,
|
||||
"ValidationCallback": null,
|
||||
"Pattern": "",
|
||||
"Max": null,
|
||||
"Min": null,
|
||||
|
|
@ -1453,6 +1461,8 @@
|
|||
"IgnoreEmptyValue": false,
|
||||
"Reevaluate": true,
|
||||
"ComparisonType": "",
|
||||
"ComparisonTarget": null,
|
||||
"ValidationCallback": null,
|
||||
"Pattern": "",
|
||||
"Max": null,
|
||||
"Min": null,
|
||||
|
|
@ -1591,6 +1601,8 @@
|
|||
"IgnoreEmptyValue": false,
|
||||
"Reevaluate": true,
|
||||
"ComparisonType": "",
|
||||
"ComparisonTarget": null,
|
||||
"ValidationCallback": null,
|
||||
"Pattern": "",
|
||||
"Max": null,
|
||||
"Min": null,
|
||||
|
|
@ -1905,7 +1917,6 @@
|
|||
"App.Listform.ListformField.EventDate",
|
||||
"App.Listform.ListformField.EventTime",
|
||||
"App.Listform.ListformField.ShiftId",
|
||||
"App.Listform.ListformField.CreatorId",
|
||||
"App.StaticLookup.ShiftSupervisor",
|
||||
"App.StaticLookup.SecurityRoom",
|
||||
"App.StaticLookup.ObservationRoom",
|
||||
|
|
|
|||
|
|
@ -86,11 +86,6 @@
|
|||
"En": "Completed",
|
||||
"Tr": "Tamamlanan"
|
||||
},
|
||||
{
|
||||
"Key": "App.Hr.Performance.Widget.InProgress",
|
||||
"En": "In Progress",
|
||||
"Tr": "Devam Eden"
|
||||
},
|
||||
{
|
||||
"Key": "App.Hr.Performance.Widget.AverageScore",
|
||||
"En": "Average Score",
|
||||
|
|
@ -460,6 +455,7 @@
|
|||
"AllowAllDeleting": false,
|
||||
"AllowAdding": false,
|
||||
"AllowDuplicate": false,
|
||||
"OpenDetailAfterInsert": false,
|
||||
"UseIcons": false,
|
||||
"ConfirmDelete": true,
|
||||
"NewRowPosition": "viewportTop",
|
||||
|
|
@ -554,6 +550,7 @@
|
|||
"ApprovalDescriptionFieldName": null,
|
||||
"ApprovalIsFilterUserName": false,
|
||||
"ApprovalIsResetWorkflow": false,
|
||||
"ApprovalIsManualStart": false,
|
||||
"Criteria": []
|
||||
},
|
||||
"UserId": null,
|
||||
|
|
@ -1157,6 +1154,8 @@
|
|||
"IgnoreEmptyValue": false,
|
||||
"Reevaluate": true,
|
||||
"ComparisonType": "",
|
||||
"ComparisonTarget": null,
|
||||
"ValidationCallback": null,
|
||||
"Pattern": "",
|
||||
"Max": null,
|
||||
"Min": null,
|
||||
|
|
@ -1295,6 +1294,8 @@
|
|||
"IgnoreEmptyValue": false,
|
||||
"Reevaluate": true,
|
||||
"ComparisonType": "",
|
||||
"ComparisonTarget": null,
|
||||
"ValidationCallback": null,
|
||||
"Pattern": "",
|
||||
"Max": null,
|
||||
"Min": null,
|
||||
|
|
@ -1433,6 +1434,8 @@
|
|||
"IgnoreEmptyValue": false,
|
||||
"Reevaluate": true,
|
||||
"ComparisonType": "",
|
||||
"ComparisonTarget": null,
|
||||
"ValidationCallback": null,
|
||||
"Pattern": "",
|
||||
"Max": null,
|
||||
"Min": null,
|
||||
|
|
|
|||
|
|
@ -121,11 +121,6 @@
|
|||
"En": "Completed",
|
||||
"Tr": "Tamamlanan"
|
||||
},
|
||||
{
|
||||
"Key": "App.Hr.Performance.Widget.InProgress",
|
||||
"En": "In Progress",
|
||||
"Tr": "Devam Eden"
|
||||
},
|
||||
{
|
||||
"Key": "App.Hr.Performance.Widget.AverageScore",
|
||||
"En": "Average Score",
|
||||
|
|
@ -590,6 +585,7 @@
|
|||
"AllowAllDeleting": false,
|
||||
"AllowAdding": false,
|
||||
"AllowDuplicate": false,
|
||||
"OpenDetailAfterInsert": false,
|
||||
"UseIcons": false,
|
||||
"ConfirmDelete": true,
|
||||
"NewRowPosition": "viewportTop",
|
||||
|
|
@ -729,6 +725,7 @@
|
|||
"ApprovalDescriptionFieldName": null,
|
||||
"ApprovalIsFilterUserName": false,
|
||||
"ApprovalIsResetWorkflow": false,
|
||||
"ApprovalIsManualStart": false,
|
||||
"Criteria": []
|
||||
},
|
||||
"UserId": null,
|
||||
|
|
@ -1206,6 +1203,8 @@
|
|||
"IgnoreEmptyValue": false,
|
||||
"Reevaluate": true,
|
||||
"ComparisonType": "",
|
||||
"ComparisonTarget": null,
|
||||
"ValidationCallback": null,
|
||||
"Pattern": "",
|
||||
"Max": null,
|
||||
"Min": null,
|
||||
|
|
@ -1344,6 +1343,8 @@
|
|||
"IgnoreEmptyValue": false,
|
||||
"Reevaluate": true,
|
||||
"ComparisonType": "",
|
||||
"ComparisonTarget": null,
|
||||
"ValidationCallback": null,
|
||||
"Pattern": "",
|
||||
"Max": null,
|
||||
"Min": null,
|
||||
|
|
@ -1986,6 +1987,8 @@
|
|||
"IgnoreEmptyValue": false,
|
||||
"Reevaluate": true,
|
||||
"ComparisonType": "",
|
||||
"ComparisonTarget": null,
|
||||
"ValidationCallback": null,
|
||||
"Pattern": "",
|
||||
"Max": null,
|
||||
"Min": null,
|
||||
|
|
|
|||
|
|
@ -120,11 +120,6 @@
|
|||
"En": "Completed",
|
||||
"Tr": "Tamamlanan"
|
||||
},
|
||||
{
|
||||
"Key": "App.Hr.Performance.Widget.InProgress",
|
||||
"En": "In Progress",
|
||||
"Tr": "Devam Eden"
|
||||
},
|
||||
{
|
||||
"Key": "App.Hr.Performance.Widget.AverageScore",
|
||||
"En": "Average Score",
|
||||
|
|
@ -604,6 +599,7 @@
|
|||
"AllowAllDeleting": false,
|
||||
"AllowAdding": false,
|
||||
"AllowDuplicate": false,
|
||||
"OpenDetailAfterInsert": false,
|
||||
"UseIcons": false,
|
||||
"ConfirmDelete": true,
|
||||
"NewRowPosition": "viewportTop",
|
||||
|
|
@ -698,6 +694,7 @@
|
|||
"ApprovalDescriptionFieldName": null,
|
||||
"ApprovalIsFilterUserName": false,
|
||||
"ApprovalIsResetWorkflow": false,
|
||||
"ApprovalIsManualStart": false,
|
||||
"Criteria": []
|
||||
},
|
||||
"UserId": null,
|
||||
|
|
@ -1175,6 +1172,8 @@
|
|||
"IgnoreEmptyValue": false,
|
||||
"Reevaluate": true,
|
||||
"ComparisonType": "",
|
||||
"ComparisonTarget": null,
|
||||
"ValidationCallback": null,
|
||||
"Pattern": "",
|
||||
"Max": null,
|
||||
"Min": null,
|
||||
|
|
@ -1313,6 +1312,8 @@
|
|||
"IgnoreEmptyValue": false,
|
||||
"Reevaluate": true,
|
||||
"ComparisonType": "",
|
||||
"ComparisonTarget": null,
|
||||
"ValidationCallback": null,
|
||||
"Pattern": "",
|
||||
"Max": null,
|
||||
"Min": null,
|
||||
|
|
@ -1955,6 +1956,8 @@
|
|||
"IgnoreEmptyValue": false,
|
||||
"Reevaluate": true,
|
||||
"ComparisonType": "",
|
||||
"ComparisonTarget": null,
|
||||
"ValidationCallback": null,
|
||||
"Pattern": "",
|
||||
"Max": null,
|
||||
"Min": null,
|
||||
|
|
|
|||
|
|
@ -115,11 +115,6 @@
|
|||
"En": "Completed",
|
||||
"Tr": "Tamamlanan"
|
||||
},
|
||||
{
|
||||
"Key": "App.Hr.Performance.Widget.InProgress",
|
||||
"En": "In Progress",
|
||||
"Tr": "Devam Eden"
|
||||
},
|
||||
{
|
||||
"Key": "App.Hr.Performance.Widget.AverageScore",
|
||||
"En": "Average Score",
|
||||
|
|
@ -562,6 +557,7 @@
|
|||
"AllowAllDeleting": false,
|
||||
"AllowAdding": true,
|
||||
"AllowDuplicate": false,
|
||||
"OpenDetailAfterInsert": false,
|
||||
"UseIcons": false,
|
||||
"ConfirmDelete": true,
|
||||
"NewRowPosition": "viewportTop",
|
||||
|
|
@ -663,6 +659,7 @@
|
|||
"ApprovalDescriptionFieldName": null,
|
||||
"ApprovalIsFilterUserName": false,
|
||||
"ApprovalIsResetWorkflow": false,
|
||||
"ApprovalIsManualStart": false,
|
||||
"Criteria": []
|
||||
},
|
||||
"UserId": null,
|
||||
|
|
@ -1140,6 +1137,8 @@
|
|||
"IgnoreEmptyValue": false,
|
||||
"Reevaluate": true,
|
||||
"ComparisonType": "",
|
||||
"ComparisonTarget": null,
|
||||
"ValidationCallback": null,
|
||||
"Pattern": "",
|
||||
"Max": null,
|
||||
"Min": null,
|
||||
|
|
@ -1278,6 +1277,8 @@
|
|||
"IgnoreEmptyValue": false,
|
||||
"Reevaluate": true,
|
||||
"ComparisonType": "",
|
||||
"ComparisonTarget": null,
|
||||
"ValidationCallback": null,
|
||||
"Pattern": "",
|
||||
"Max": null,
|
||||
"Min": null,
|
||||
|
|
@ -1416,6 +1417,8 @@
|
|||
"IgnoreEmptyValue": false,
|
||||
"Reevaluate": true,
|
||||
"ComparisonType": "",
|
||||
"ComparisonTarget": null,
|
||||
"ValidationCallback": null,
|
||||
"Pattern": "",
|
||||
"Max": null,
|
||||
"Min": null,
|
||||
|
|
@ -1554,6 +1557,8 @@
|
|||
"IgnoreEmptyValue": false,
|
||||
"Reevaluate": true,
|
||||
"ComparisonType": "",
|
||||
"ComparisonTarget": null,
|
||||
"ValidationCallback": null,
|
||||
"Pattern": "",
|
||||
"Max": null,
|
||||
"Min": null,
|
||||
|
|
@ -1944,6 +1949,8 @@
|
|||
"IgnoreEmptyValue": false,
|
||||
"Reevaluate": true,
|
||||
"ComparisonType": "",
|
||||
"ComparisonTarget": null,
|
||||
"ValidationCallback": null,
|
||||
"Pattern": "",
|
||||
"Max": null,
|
||||
"Min": null,
|
||||
|
|
@ -2082,6 +2089,8 @@
|
|||
"IgnoreEmptyValue": false,
|
||||
"Reevaluate": true,
|
||||
"ComparisonType": "",
|
||||
"ComparisonTarget": null,
|
||||
"ValidationCallback": null,
|
||||
"Pattern": "",
|
||||
"Max": null,
|
||||
"Min": null,
|
||||
|
|
@ -2532,7 +2541,6 @@
|
|||
"App.Hr.Performance.Widget.ManagerReview",
|
||||
"App.Hr.Performance.Widget.Calibration",
|
||||
"App.Hr.Performance.Widget.Completed",
|
||||
"App.Hr.Performance.Widget.InProgress",
|
||||
"App.Hr.Performance.Widget.AverageScore",
|
||||
"App.Hr.Performance.Widget.AverageCalibrated",
|
||||
"App.Hr.Performance.Widget.AwaitingMe",
|
||||
|
|
|
|||
|
|
@ -120,11 +120,6 @@
|
|||
"En": "Completed",
|
||||
"Tr": "Tamamlanan"
|
||||
},
|
||||
{
|
||||
"Key": "App.Hr.Performance.Widget.InProgress",
|
||||
"En": "In Progress",
|
||||
"Tr": "Devam Eden"
|
||||
},
|
||||
{
|
||||
"Key": "App.Hr.Performance.Widget.AverageScore",
|
||||
"En": "Average Score",
|
||||
|
|
@ -624,6 +619,7 @@
|
|||
"AllowAllDeleting": false,
|
||||
"AllowAdding": true,
|
||||
"AllowDuplicate": false,
|
||||
"OpenDetailAfterInsert": false,
|
||||
"UseIcons": false,
|
||||
"ConfirmDelete": true,
|
||||
"NewRowPosition": "viewportTop",
|
||||
|
|
@ -776,6 +772,7 @@
|
|||
"ApprovalDescriptionFieldName": null,
|
||||
"ApprovalIsFilterUserName": false,
|
||||
"ApprovalIsResetWorkflow": false,
|
||||
"ApprovalIsManualStart": false,
|
||||
"Criteria": []
|
||||
},
|
||||
"UserId": null,
|
||||
|
|
@ -1253,6 +1250,8 @@
|
|||
"IgnoreEmptyValue": false,
|
||||
"Reevaluate": true,
|
||||
"ComparisonType": "",
|
||||
"ComparisonTarget": null,
|
||||
"ValidationCallback": null,
|
||||
"Pattern": "",
|
||||
"Max": null,
|
||||
"Min": null,
|
||||
|
|
@ -1391,6 +1390,8 @@
|
|||
"IgnoreEmptyValue": false,
|
||||
"Reevaluate": true,
|
||||
"ComparisonType": "",
|
||||
"ComparisonTarget": null,
|
||||
"ValidationCallback": null,
|
||||
"Pattern": "",
|
||||
"Max": null,
|
||||
"Min": null,
|
||||
|
|
@ -2033,6 +2034,8 @@
|
|||
"IgnoreEmptyValue": false,
|
||||
"Reevaluate": true,
|
||||
"ComparisonType": "",
|
||||
"ComparisonTarget": null,
|
||||
"ValidationCallback": null,
|
||||
"Pattern": "",
|
||||
"Max": null,
|
||||
"Min": null,
|
||||
|
|
|
|||
|
|
@ -121,11 +121,6 @@
|
|||
"En": "Completed",
|
||||
"Tr": "Tamamlanan"
|
||||
},
|
||||
{
|
||||
"Key": "App.Hr.Performance.Widget.InProgress",
|
||||
"En": "In Progress",
|
||||
"Tr": "Devam Eden"
|
||||
},
|
||||
{
|
||||
"Key": "App.Hr.Performance.Widget.AverageScore",
|
||||
"En": "Average Score",
|
||||
|
|
@ -590,6 +585,7 @@
|
|||
"AllowAllDeleting": false,
|
||||
"AllowAdding": false,
|
||||
"AllowDuplicate": false,
|
||||
"OpenDetailAfterInsert": false,
|
||||
"UseIcons": false,
|
||||
"ConfirmDelete": true,
|
||||
"NewRowPosition": "viewportTop",
|
||||
|
|
@ -729,6 +725,7 @@
|
|||
"ApprovalDescriptionFieldName": null,
|
||||
"ApprovalIsFilterUserName": false,
|
||||
"ApprovalIsResetWorkflow": false,
|
||||
"ApprovalIsManualStart": false,
|
||||
"Criteria": []
|
||||
},
|
||||
"UserId": null,
|
||||
|
|
@ -1206,6 +1203,8 @@
|
|||
"IgnoreEmptyValue": false,
|
||||
"Reevaluate": true,
|
||||
"ComparisonType": "",
|
||||
"ComparisonTarget": null,
|
||||
"ValidationCallback": null,
|
||||
"Pattern": "",
|
||||
"Max": null,
|
||||
"Min": null,
|
||||
|
|
@ -1344,6 +1343,8 @@
|
|||
"IgnoreEmptyValue": false,
|
||||
"Reevaluate": true,
|
||||
"ComparisonType": "",
|
||||
"ComparisonTarget": null,
|
||||
"ValidationCallback": null,
|
||||
"Pattern": "",
|
||||
"Max": null,
|
||||
"Min": null,
|
||||
|
|
@ -1986,6 +1987,8 @@
|
|||
"IgnoreEmptyValue": false,
|
||||
"Reevaluate": true,
|
||||
"ComparisonType": "",
|
||||
"ComparisonTarget": null,
|
||||
"ValidationCallback": null,
|
||||
"Pattern": "",
|
||||
"Max": null,
|
||||
"Min": null,
|
||||
|
|
|
|||
|
|
@ -33,14 +33,7 @@
|
|||
"TitleEn": "Vehicle Expense Entries",
|
||||
"TitleTr": "Araç Masraf Girişleri",
|
||||
"DescEn": "Vehicle Expenses — every invoice/receipt for a vehicle: header and lines.\nWhere: Human Resources › Vehicles › Vehicle Expenses. Amounts are entered in the Lines tab.\nFields: vehicle, invoice no, invoice date (default today), vendor (Destinations), document type, file.\nWidgets: total invoices, entered today and total net amount of all lines.\nUse: vehicle × expense item × period cost analysis with Pivot.",
|
||||
"DescTr": "Masraf Girişleri — araç için gelen her fatura/fiş: başlık bilgileri ve kalemleri.\nNerede: İnsan Kaynakları › Araçlar › Masraf Girişleri. Detayın Kalemler sekmesinde tutarlar girilir.\nAlanlar: araç, fatura no, fatura tarihi (varsayılan bugün), firma (Gidilecek Yerler tanımı), belge türü, dosya.\nWidget'lar: toplam fatura, bugün girilen ve tüm kalemlerin toplam net tutarı.\nKullanım: Pivot ile araç × masraf kalemi × dönem maliyet analizi.",
|
||||
"Texts": [
|
||||
{
|
||||
"Key": "App.Hr.VehicleExpense.Widget.ThisMonth",
|
||||
"En": "This Month",
|
||||
"Tr": "Bu Ay"
|
||||
}
|
||||
]
|
||||
"DescTr": "Masraf Girişleri — araç için gelen her fatura/fiş: başlık bilgileri ve kalemleri.\nNerede: İnsan Kaynakları › Araçlar › Masraf Girişleri. Detayın Kalemler sekmesinde tutarlar girilir.\nAlanlar: araç, fatura no, fatura tarihi (varsayılan bugün), firma (Gidilecek Yerler tanımı), belge türü, dosya.\nWidget'lar: toplam fatura, bugün girilen ve tüm kalemlerin toplam net tutarı.\nKullanım: Pivot ile araç × masraf kalemi × dönem maliyet analizi."
|
||||
},
|
||||
"Groups": [
|
||||
{
|
||||
|
|
@ -358,6 +351,7 @@
|
|||
"AllowAllDeleting": false,
|
||||
"AllowAdding": true,
|
||||
"AllowDuplicate": false,
|
||||
"OpenDetailAfterInsert": false,
|
||||
"UseIcons": false,
|
||||
"ConfirmDelete": true,
|
||||
"NewRowPosition": "viewportTop",
|
||||
|
|
@ -452,6 +446,7 @@
|
|||
"ApprovalDescriptionFieldName": null,
|
||||
"ApprovalIsFilterUserName": false,
|
||||
"ApprovalIsResetWorkflow": false,
|
||||
"ApprovalIsManualStart": false,
|
||||
"Criteria": []
|
||||
},
|
||||
"UserId": null,
|
||||
|
|
@ -929,6 +924,8 @@
|
|||
"IgnoreEmptyValue": false,
|
||||
"Reevaluate": true,
|
||||
"ComparisonType": "",
|
||||
"ComparisonTarget": null,
|
||||
"ValidationCallback": null,
|
||||
"Pattern": "",
|
||||
"Max": null,
|
||||
"Min": null,
|
||||
|
|
@ -1067,6 +1064,8 @@
|
|||
"IgnoreEmptyValue": false,
|
||||
"Reevaluate": true,
|
||||
"ComparisonType": "",
|
||||
"ComparisonTarget": null,
|
||||
"ValidationCallback": null,
|
||||
"Pattern": "",
|
||||
"Max": null,
|
||||
"Min": null,
|
||||
|
|
@ -1205,6 +1204,8 @@
|
|||
"IgnoreEmptyValue": false,
|
||||
"Reevaluate": true,
|
||||
"ComparisonType": "",
|
||||
"ComparisonTarget": null,
|
||||
"ValidationCallback": null,
|
||||
"Pattern": "",
|
||||
"Max": null,
|
||||
"Min": null,
|
||||
|
|
@ -1765,7 +1766,6 @@
|
|||
"App.Hr.VehicleExpense",
|
||||
"App.Hr.VehicleExpense.Title",
|
||||
"App.Hr.VehicleExpense.Desc",
|
||||
"App.Hr.VehicleExpense.Widget.ThisMonth",
|
||||
"App.Listform.ListformField.InvoiceNo"
|
||||
],
|
||||
"PermissionGroupNames": [],
|
||||
|
|
|
|||
|
|
@ -372,7 +372,7 @@
|
|||
"D": "App.Inventory.BomOverview.Delete",
|
||||
"E": "App.Inventory.BomOverview.Export",
|
||||
"I": "App.Inventory.BomOverview.Import",
|
||||
"N": "App.Inventory.BomOverview.Note"
|
||||
"N": null
|
||||
},
|
||||
"CommandColumnDto": [],
|
||||
"StateStoringDto": {
|
||||
|
|
@ -2084,8 +2084,7 @@
|
|||
"App.Inventory.BomOverview.Update",
|
||||
"App.Inventory.BomOverview.Delete",
|
||||
"App.Inventory.BomOverview.Export",
|
||||
"App.Inventory.BomOverview.Import",
|
||||
"App.Inventory.BomOverview.Note"
|
||||
"App.Inventory.BomOverview.Import"
|
||||
],
|
||||
"MenuCodes": [
|
||||
"App.Inventory.BomOverview"
|
||||
|
|
|
|||
|
|
@ -32,18 +32,18 @@
|
|||
"MenuTr": "Teslimatlar",
|
||||
"TitleEn": "Deliveries",
|
||||
"TitleTr": "Teslimatlar",
|
||||
"DescEn": "Deliveries — goods leaving the warehouse to customers.\nWhere: Inventory › Operations › Deliveries.\nFields: delivery address (contact), branch › warehouse › operation type (delivery types only), source location (from the operation type), scheduled date, source document, shipping policy (As soon as possible: the available part becomes Ready; When all products are ready: waits until every line is available).\nStatuses: Draft › Waiting / Ready › Done; Cancelled. Row buttons appear according to the document status. Mark as Ready checks stock and fills the done quantity; Mark as Done posts stock by branch › warehouse › location › product › lot; the remainder of lines done below demand moves to a new document (backorder). Return opens a reverse draft document from a done one; Print prints the transfer slip.\nTabs: Operations (product lines; Details for lots/serials, Generate Lot/Serial and Auto Assign), Additional Info (shipping, responsible, project), Note.\nProducts with inventory tracking off create no stock move; products tracked by lot or serial need a lot distribution before Mark as Done. The number comes from the operation type's sequence. Related screens: Inventory › Stock, Moves and Product Moves.",
|
||||
"DescTr": "Teslimatlar — depodan müşteriye çıkan mallar.\nNerede: Envanter › Operasyonlar › Teslimatlar.\nAlanlar: teslim adresi (kontak), şube › depo › operasyon türü (yalnız teslimat türleri), kaynak konum (operasyon türünden gelir), planlanan tarih, kaynak belge, ürün teslimat politikası (Mümkün olduğunca kısa sürede: karşılanabilen kısım Hazır olur; Tüm ürünler hazır olduğunda: bütün satırlar karşılanana kadar Bekleyen kalır).\nDurumlar: Taslak › Bekleyen / Hazır › Tamamlandı; İptal. Satırdaki butonlar belgenin durumuna göre görünür. Hazırla stoğu kontrol eder ve yapılacak miktarı doldurur; Tamamla stoğu şube › depo › konum › ürün › lot bazında günceller, talepten az yapılan satırların kalanı aynı türde yeni belgeye (backorder) geçer. İade Et, tamamlanmış belgeden ters yönlü taslak belge açar; Yazdır transfer fişini basar.\nSekmeler: Operasyonlar (ürün satırları; Detaylar ile lot/seri, Lot/Seri Oluştur ve Otomatik Ata), Ek Bilgi (nakliye, sorumlu, proje), Not.\nÜrünün Envanter Takibi kapalıysa stok hareketi oluşmaz; Takip Yöntemi Lot ya da Seri ise Tamamla'dan önce lot dağılımı girilmelidir. Numara operasyon türünün numaratöründen verilir. İlişkili ekranlar: Envanter › Stok, Hareketler ve Ürün Hareketleri.",
|
||||
"DescEn": "Deliveries — goods leaving the warehouse to customers.\nWhere: Inventory › Operations › Deliveries.\nFields: delivery address (contact), branch › warehouse › operation type (delivery types only), source location (from the operation type), scheduled date, source document, shipping policy (As soon as possible: the available part becomes Ready; When all products are ready: waits until every line is available).\nStatuses: Draft › Waiting / Ready › Done; Cancelled. Row buttons appear according to the document status. Mark as To Do checks stock and fills the done quantity; Validate posts stock by branch › warehouse › location › product › lot; the remainder of lines done below demand moves to a new document (backorder). Return opens a reverse draft document from a done one; Print prints the transfer slip.\nTabs: Operations (product lines; Details for lots/serials, Generate Lot/Serial and Auto Assign), Additional Info (shipping, responsible, project), Note.\nProducts with inventory tracking off create no stock move; products tracked by lot or serial need a lot distribution before Validate. The number comes from the operation type's sequence. Related screens: Inventory › Stock, Moves and Product Moves.",
|
||||
"DescTr": "Teslimatlar — depodan müşteriye çıkan mallar.\nNerede: Envanter › Operasyonlar › Teslimatlar.\nAlanlar: teslim adresi (kontak), şube › depo › operasyon türü (yalnız teslimat türleri), kaynak konum (operasyon türünden gelir), planlanan tarih, kaynak belge, ürün teslimat politikası (Mümkün olduğunca kısa sürede: karşılanabilen kısım Hazır olur; Tüm ürünler hazır olduğunda: bütün satırlar karşılanana kadar Bekleyen kalır).\nDurumlar: Taslak › Bekleyen / Hazır › Tamamlandı; İptal. Satırdaki butonlar belgenin durumuna göre görünür. Yapılacak olarak işaretle stoğu kontrol eder ve yapılacak miktarı doldurur; Doğrula stoğu şube › depo › konum › ürün › lot bazında günceller, talepten az yapılan satırların kalanı aynı türde yeni belgeye (backorder) geçer. İade Et, tamamlanmış belgeden ters yönlü taslak belge açar; Yazdır transfer fişini basar.\nSekmeler: Operasyonlar (ürün satırları; Detaylar ile lot/seri, Lot/Seri Oluştur ve Otomatik Ata), Ek Bilgi (nakliye, sorumlu, proje), Not.\nÜrünün Envanter Takibi kapalıysa stok hareketi oluşmaz; Takip Yöntemi Lot ya da Seri ise Doğrula'dan önce lot dağılımı girilmelidir. Numara operasyon türünün numaratöründen verilir. İlişkili ekranlar: Envanter › Stok, Hareketler ve Ürün Hareketleri.",
|
||||
"Texts": [
|
||||
{
|
||||
"Key": "App.Inventory.Transfer.Action.Confirm",
|
||||
"En": "Mark as Ready",
|
||||
"Tr": "Hazırla"
|
||||
"En": "Mark as To Do",
|
||||
"Tr": "Yapılacak olarak işaretle"
|
||||
},
|
||||
{
|
||||
"Key": "App.Inventory.Transfer.Action.Validate",
|
||||
"En": "Mark as Done",
|
||||
"Tr": "Tamamla"
|
||||
"En": "Validate",
|
||||
"Tr": "Doğrula"
|
||||
},
|
||||
{
|
||||
"Key": "App.Inventory.Transfer.Action.Cancel",
|
||||
|
|
|
|||
|
|
@ -32,18 +32,18 @@
|
|||
"MenuTr": "İç Transferler",
|
||||
"TitleEn": "Internal Transfers",
|
||||
"TitleTr": "İç Transferler",
|
||||
"DescEn": "Internal Transfers — moves between locations of the same warehouse.\nWhere: Inventory › Operations › Internal Transfers; extra tab Approval & Delivery.\nFields: contact, branch › warehouse › operation type (internal transfer types only), source and destination location (internal locations only, different from each other), scheduled date, source document.\nOrder: enter the lines › Start Workflow › the warehouse responsible of the source location gives Source Warehouse Approval › the document is made ready automatically (Ready/Waiting) › select lots › Mark as Done. A location without a responsible has no approval step (No Approval Needed) and Mark as Ready is pressed by hand. Approval comes before the stock move; Mark as Done writes the receiving user and date.\nImport from Requests (draft transfer) adds the approved material request lines to be fulfilled by transfer; Mark as Done writes the delivered quantity to the request line.\nStatuses: Draft › Waiting / Ready › Done; Cancelled. Row buttons appear according to the document status. Mark as Ready checks stock and fills the done quantity; Mark as Done posts stock by branch › warehouse › location › product › lot; the remainder of lines done below demand moves to a new document (backorder). Return opens a reverse draft document from a done one; Print prints the transfer slip.\nTabs: Operations (product lines; Details for lots/serials, Generate Lot/Serial and Auto Assign), Additional Info (shipping, responsible, project), Note.\nProducts with inventory tracking off create no stock move; products tracked by lot or serial need a lot distribution before Mark as Done. The number comes from the operation type's sequence. Related screens: Inventory › Stock, Moves and Product Moves.",
|
||||
"DescTr": "İç Transferler — aynı deponun konumları arasında taşıma.\nNerede: Envanter › Operasyonlar › İç Transferler; ek sekme Onay ve Teslim.\nAlanlar: kontak, şube › depo › operasyon türü (yalnız iç transfer türleri), kaynak ve hedef konum (yalnız iç konumlar, birbirinden farklı), planlanan tarih, kaynak belge.\nSıra: satırlar girilir › İş Akışı Başlat › kaynak konumun depo sorumlusu Kaynak Depo Onayı verir › belge kendiliğinden hazırlanır (Hazır/Bekleyen) › lotlar seçilir › Tamamla. Sorumlusu olmayan konumda onay adımı yoktur (Onay Gerekmez) ve Hazırla elle basılır. Onay stok hareketinden önce gelir; Tamamla teslim alanı ve teslim alma tarihini yazar.\nTalepten Aktar (taslak transferde) transferle karşılanacak onaylı malzeme talebi kalemlerini ekler; Tamamla teslim edilen miktarı talep kalemine yazar.\nDurumlar: Taslak › Bekleyen / Hazır › Tamamlandı; İptal. Satırdaki butonlar belgenin durumuna göre görünür. Hazırla stoğu kontrol eder ve yapılacak miktarı doldurur; Tamamla stoğu şube › depo › konum › ürün › lot bazında günceller, talepten az yapılan satırların kalanı aynı türde yeni belgeye (backorder) geçer. İade Et, tamamlanmış belgeden ters yönlü taslak belge açar; Yazdır transfer fişini basar.\nSekmeler: Operasyonlar (ürün satırları; Detaylar ile lot/seri, Lot/Seri Oluştur ve Otomatik Ata), Ek Bilgi (nakliye, sorumlu, proje), Not.\nÜrünün Envanter Takibi kapalıysa stok hareketi oluşmaz; Takip Yöntemi Lot ya da Seri ise Tamamla'dan önce lot dağılımı girilmelidir. Numara operasyon türünün numaratöründen verilir. İlişkili ekranlar: Envanter › Stok, Hareketler ve Ürün Hareketleri.",
|
||||
"DescEn": "Internal Transfers — moves between internal locations (within a warehouse or between warehouses).\nWhere: Inventory › Operations › Internal Transfers; extra tab Approval & Delivery.\nFields: contact, branch › warehouse › operation type (internal transfer types only), source and destination location (internal locations only, different from each other), scheduled date, source document.\nOrder: enter the lines › Start Workflow › the warehouse responsible of the source location gives Source Warehouse Approval › the document is made ready automatically (Ready/Waiting) › select lots › Validate. A location without a responsible has no approval step (No Approval Needed) and Mark as To Do is pressed by hand. Approval comes before the stock move; Validate writes the receiving user and date.\nMaterial request lines come to a transfer through the Internal Transfer decision in Purchasing › Requests › Planning: the line is added to the draft transfer for the same source → destination location that has not entered approval, otherwise a new draft is opened with the source warehouse's internal transfer type. Validate writes the delivered quantity to the request line; cancelling the transfer or deleting its line returns the quantity to Planning.\nStatuses: Draft › Waiting / Ready › Done; Cancelled. Row buttons appear according to the document status. Mark as To Do checks stock and fills the done quantity; Validate posts stock by branch › warehouse › location › product › lot; the remainder of lines done below demand moves to a new document (backorder). Return opens a reverse draft document from a done one; Print prints the transfer slip.\nTabs: Operations (product lines; Details for lots/serials, Generate Lot/Serial and Auto Assign), Additional Info (shipping, responsible, project), Note.\nProducts with inventory tracking off create no stock move; products tracked by lot or serial need a lot distribution before Validate. The number comes from the operation type's sequence. Related screens: Inventory › Stock, Moves and Product Moves.",
|
||||
"DescTr": "İç Transferler — iç konumlar arasında taşıma (aynı depo ya da depolar arası).\nNerede: Envanter › Operasyonlar › İç Transferler; ek sekme Onay ve Teslim.\nAlanlar: kontak, şube › depo › operasyon türü (yalnız iç transfer türleri), kaynak ve hedef konum (yalnız iç konumlar, birbirinden farklı), planlanan tarih, kaynak belge.\nSıra: satırlar girilir › Onayla › kaynak konumun depo sorumlusu Kaynak Depo Onayı verir › belge kendiliğinden hazırlanır (Hazır/Bekleyen) › lotlar seçilir › Doğrula. Sorumlusu olmayan konumda onay adımı yoktur (Onay Gerekmez) ve Yapılacak olarak işaretle elle basılır. Onay stok hareketinden önce gelir; Doğrula teslim alanı ve teslim alma tarihini yazar.\nMalzeme talebi kalemleri transfere Satınalma › Talepler › Planlama'daki İç Transfer kararıyla gelir: aynı kaynak → hedef konum için onaya girmemiş taslak transfer varsa satır ona eklenir, yoksa kaynak deponun iç transfer türüyle yeni taslak açılır. Doğrula teslim edilen miktarı talep kalemine yazar; transfer iptal edilir ya da satırı silinirse miktar Planlama'ya döner.\nDurumlar: Taslak › Bekleyen / Hazır › Tamamlandı; İptal. Satırdaki butonlar belgenin durumuna göre görünür. Yapılacak olarak işaretle stoğu kontrol eder ve yapılacak miktarı doldurur; Doğrula stoğu şube › depo › konum › ürün › lot bazında günceller, talepten az yapılan satırların kalanı aynı türde yeni belgeye (backorder) geçer. İade Et, tamamlanmış belgeden ters yönlü taslak belge açar; Yazdır transfer fişini basar.\nSekmeler: Operasyonlar (ürün satırları; Detaylar ile lot/seri, Lot/Seri Oluştur ve Otomatik Ata), Ek Bilgi (nakliye, sorumlu, proje), Not.\nÜrünün Envanter Takibi kapalıysa stok hareketi oluşmaz; Takip Yöntemi Lot ya da Seri ise Doğrula'dan önce lot dağılımı girilmelidir. Numara operasyon türünün numaratöründen verilir. İlişkili ekranlar: Envanter › Stok, Hareketler ve Ürün Hareketleri.",
|
||||
"Texts": [
|
||||
{
|
||||
"Key": "App.Inventory.Transfer.Action.Confirm",
|
||||
"En": "Mark as Ready",
|
||||
"Tr": "Hazırla"
|
||||
"En": "Mark as To Do",
|
||||
"Tr": "Yapılacak olarak işaretle"
|
||||
},
|
||||
{
|
||||
"Key": "App.Inventory.Transfer.Action.Validate",
|
||||
"En": "Mark as Done",
|
||||
"Tr": "Tamamla"
|
||||
"En": "Validate",
|
||||
"Tr": "Doğrula"
|
||||
},
|
||||
{
|
||||
"Key": "App.Inventory.Transfer.Action.Cancel",
|
||||
|
|
@ -95,16 +95,6 @@
|
|||
"En": "Late",
|
||||
"Tr": "Geciken"
|
||||
},
|
||||
{
|
||||
"Key": "App.Inventory.Transfer.ImportRequests",
|
||||
"En": "Import from Requests",
|
||||
"Tr": "Talepten Aktar"
|
||||
},
|
||||
{
|
||||
"Key": "App.Inventory.Transfer.ImportRequestsInfo",
|
||||
"En": "Select the approved material request lines to be fulfilled by transfer and click Transfer Selected. Only requests of the document branch are listed.",
|
||||
"Tr": "Transferle karşılanacak onaylı malzeme talebi kalemlerini seçip Seçilenleri Aktar butonuna basın. Yalnız belgenin şubesindeki talepler listelenir."
|
||||
},
|
||||
{
|
||||
"Key": "App.Inventory.Transfer.Tab.Approval",
|
||||
"En": "Approval & Delivery",
|
||||
|
|
@ -587,20 +577,6 @@
|
|||
"N": "App.Inventory.InternalTransfer.Note"
|
||||
},
|
||||
"CommandColumnDto": [
|
||||
{
|
||||
"ButtonPosition": 0,
|
||||
"AuthName": "App.Inventory.TransferImportItem.Update",
|
||||
"Text": "App.Inventory.Transfer.ImportRequests",
|
||||
"Hint": "App.Inventory.Transfer.ImportRequests",
|
||||
"Icon": "download",
|
||||
"Url": null,
|
||||
"UrlTarget": "_blank",
|
||||
"DialogName": null,
|
||||
"DialogParameters": null,
|
||||
"OnClick": "(() => { const r = e.row.data; if (!r) return; dialog.setConfig({ component: 'PurchaseDocGrid', props: { docId: r.Id, listFormCode: 'App.Inventory.TransferImportItem', title: 'App.Inventory.Transfer.ImportRequests', info: 'App.Inventory.Transfer.ImportRequestsInfo' }, onClose: () => e.component.refresh() }); })()",
|
||||
"IsVisible": true,
|
||||
"VisibleExpression": "(e) => !!e.row && !e.row.isEditing && ['Draft'].includes(e.row.data.Status)"
|
||||
},
|
||||
{
|
||||
"ButtonPosition": 0,
|
||||
"AuthName": "App.Inventory.InternalTransfer.Update",
|
||||
|
|
@ -3735,8 +3711,6 @@
|
|||
"App.Inventory.Widget.Ready",
|
||||
"App.Inventory.Widget.Waiting",
|
||||
"App.Inventory.Widget.Late",
|
||||
"App.Inventory.Transfer.ImportRequests",
|
||||
"App.Inventory.Transfer.ImportRequestsInfo",
|
||||
"App.Inventory.Transfer.Tab.Approval"
|
||||
],
|
||||
"PermissionGroupNames": [],
|
||||
|
|
|
|||
|
|
@ -33,8 +33,8 @@
|
|||
"MenuTr": "Satınalma",
|
||||
"TitleEn": "Supplier Prices",
|
||||
"TitleTr": "Tedarikçi Fiyatları",
|
||||
"DescEn": "Product Supplier Prices — from which supplier the product is bought and at what price.\nWhere: Inventory › Definitions › Products › Purchase tab (no menu of its own).\nFields: supplier (from Contacts), variant (optional, for products with attributes), minimum quantity, unit, unit price, currency, delivery lead time (days).\nThe product link (ProductId) is written automatically from the open product.",
|
||||
"DescTr": "Ürün Tedarikçi Fiyatları — ürünün hangi tedarikçiden hangi bedele alındığı.\nNerede: Envanter › Tanımlamalar › Ürünler › Satınalma sekmesi (kendi menüsü yoktur).\nAlanlar: tedarikçi (Kontaklar'dan), varyant (isteğe bağlı, nitelikli ürünlerde), minimum miktar, birim, birim fiyat, kur, teslim süresi (gün).\nÜrün bağlantısı (ProductId) açık olan ürün kaydından otomatik yazılır."
|
||||
"DescEn": "Product Supplier Prices — from which supplier the product is bought and at what price.\nWhere: Inventory › Definitions › Products › Purchase tab (no menu of its own).\nFields: supplier (from Contacts), variant (optional, for products with attributes), minimum quantity, unit, unit price, currency, delivery lead time (days).\nThe product link (ProductId) is written automatically from the open product.\nAutomatic: when a receipt opened from a purchase order is completed (Validate), the supplier's row is updated with the order's unit price and the last purchase date (one row per supplier × unit × currency; the tier matching the received quantity); if there is none, a row is added.",
|
||||
"DescTr": "Ürün Tedarikçi Fiyatları — ürünün hangi tedarikçiden hangi bedele alındığı.\nNerede: Envanter › Tanımlamalar › Ürünler › Satınalma sekmesi (kendi menüsü yoktur).\nAlanlar: tedarikçi (Kontaklar'dan), varyant (isteğe bağlı, nitelikli ürünlerde), minimum miktar, birim, birim fiyat, kur, teslim süresi (gün).\nÜrün bağlantısı (ProductId) açık olan ürün kaydından otomatik yazılır.\nOtomatik: satınalma siparişinden açılan alım Doğrula ile stoğa girince tedarikçinin satırı siparişin birim fiyatı ve son alım tarihiyle güncellenir (tedarikçi × birim × para birimi başına tek satır; alınan miktara uyan kademe); satır yoksa eklenir."
|
||||
},
|
||||
"Groups": [
|
||||
{
|
||||
|
|
@ -92,6 +92,12 @@
|
|||
"CaptionName": "App.Listform.ListformField.LeadTimeDays",
|
||||
"En": "Lead Time (days)",
|
||||
"Tr": "Teslim Süresi (gün)"
|
||||
},
|
||||
{
|
||||
"FieldName": "LastPurchaseDate",
|
||||
"CaptionName": "App.Listform.ListformField.LastPurchaseDate",
|
||||
"En": "Last Purchase Date",
|
||||
"Tr": "Son Alım Tarihi"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -372,6 +378,7 @@
|
|||
"AllowAllDeleting": false,
|
||||
"AllowAdding": true,
|
||||
"AllowDuplicate": false,
|
||||
"OpenDetailAfterInsert": false,
|
||||
"UseIcons": false,
|
||||
"ConfirmDelete": true,
|
||||
"NewRowPosition": "viewportTop",
|
||||
|
|
@ -452,6 +459,7 @@
|
|||
"ApprovalDescriptionFieldName": null,
|
||||
"ApprovalIsFilterUserName": false,
|
||||
"ApprovalIsResetWorkflow": false,
|
||||
"ApprovalIsManualStart": false,
|
||||
"Criteria": []
|
||||
},
|
||||
"UserId": null,
|
||||
|
|
@ -1055,6 +1063,8 @@
|
|||
"IgnoreEmptyValue": false,
|
||||
"Reevaluate": true,
|
||||
"ComparisonType": "",
|
||||
"ComparisonTarget": null,
|
||||
"ValidationCallback": null,
|
||||
"Pattern": "",
|
||||
"Max": null,
|
||||
"Min": null,
|
||||
|
|
@ -1319,6 +1329,8 @@
|
|||
"IgnoreEmptyValue": false,
|
||||
"Reevaluate": true,
|
||||
"ComparisonType": "",
|
||||
"ComparisonTarget": null,
|
||||
"ValidationCallback": null,
|
||||
"Pattern": "",
|
||||
"Max": null,
|
||||
"Min": null,
|
||||
|
|
@ -1583,6 +1595,8 @@
|
|||
"IgnoreEmptyValue": false,
|
||||
"Reevaluate": true,
|
||||
"ComparisonType": "",
|
||||
"ComparisonTarget": null,
|
||||
"ValidationCallback": null,
|
||||
"Pattern": "",
|
||||
"Max": null,
|
||||
"Min": null,
|
||||
|
|
@ -1882,6 +1896,132 @@
|
|||
"CreationTime": "0001-01-01T00:00:00",
|
||||
"CreatorId": null,
|
||||
"Id": "00000000-0000-0000-0000-000000000000"
|
||||
},
|
||||
{
|
||||
"EditType": null,
|
||||
"ListFormCode": "App.Inventory.ProductSupplier",
|
||||
"RoleId": null,
|
||||
"UserId": null,
|
||||
"ColumnJoinTableDto": {
|
||||
"JoinType": null,
|
||||
"TableName": null,
|
||||
"JoinFieldName": null,
|
||||
"BaseTableJoinFieldName": null,
|
||||
"SelectFieldName": null,
|
||||
"FieldNameAlias": null,
|
||||
"JoinCondition2": "AND",
|
||||
"JoinFieldName2": null,
|
||||
"BaseTableJoinFieldName2_OrValue": null
|
||||
},
|
||||
"FieldName": "LastPurchaseDate",
|
||||
"CaptionName": "App.Listform.ListformField.LastPurchaseDate",
|
||||
"PlaceHolder": null,
|
||||
"ReadOnly": false,
|
||||
"Visible": true,
|
||||
"IsActive": true,
|
||||
"Width": 0,
|
||||
"ListOrderNo": 10,
|
||||
"SourceDbType": 6,
|
||||
"CultureName": "en",
|
||||
"DataType": "datetime",
|
||||
"SortIndex": 0,
|
||||
"SortDirection": null,
|
||||
"AllowSearch": true,
|
||||
"AllowEditing": false,
|
||||
"AllowAdding": false,
|
||||
"ColumnCssClass": null,
|
||||
"ColumnCssValue": null,
|
||||
"BandName": null,
|
||||
"ColumnFilterDto": {
|
||||
"AllowFiltering": true,
|
||||
"FilterOperations": null,
|
||||
"SelectedFilterOperation": null,
|
||||
"FilterValue": null
|
||||
},
|
||||
"ColumnHeaderDto": {
|
||||
"AllowHeaderFiltering": true,
|
||||
"AllowSearch": false,
|
||||
"DataSource": null,
|
||||
"DataSourceString": ""
|
||||
},
|
||||
"ColumnGroupingDto": {
|
||||
"AllowGrouping": true,
|
||||
"GroupIndex": null,
|
||||
"AutoExpandGroup": false
|
||||
},
|
||||
"ColumnCustomizationDto": {
|
||||
"Fixed": false,
|
||||
"FixedPosition": "left",
|
||||
"AllowReordering": true
|
||||
},
|
||||
"ColumnTotalSummaryDto": {
|
||||
"SummaryType": null,
|
||||
"ValueFormat": null,
|
||||
"ShowInGroupFooter": false,
|
||||
"AlignByColumn": false,
|
||||
"DisplayFormat": null,
|
||||
"ShowInColumn": null
|
||||
},
|
||||
"ColumnGroupSummaryDto": {
|
||||
"SummaryType": null,
|
||||
"ValueFormat": null,
|
||||
"ShowInGroupFooter": false,
|
||||
"AlignByColumn": false,
|
||||
"DisplayFormat": null,
|
||||
"ShowInColumn": null
|
||||
},
|
||||
"LookupDto": {
|
||||
"DataSourceType": 0,
|
||||
"ValueExpr": "Key",
|
||||
"DisplayExpr": "Name",
|
||||
"CascadeRelationField": null,
|
||||
"CascadeFilterOperator": "=",
|
||||
"CascadeParentFields": null,
|
||||
"CascadeEmptyFields": null,
|
||||
"LookupQuery": null
|
||||
},
|
||||
"ValidationRuleDto": [],
|
||||
"ColumnStylingDto": [],
|
||||
"PermissionDto": {
|
||||
"Deny": false,
|
||||
"C": "App.Inventory.ProductSupplier.Create",
|
||||
"R": "App.Inventory.ProductSupplier",
|
||||
"U": "App.Inventory.ProductSupplier.Update",
|
||||
"E": true,
|
||||
"I": true
|
||||
},
|
||||
"CanRead": false,
|
||||
"CanCreate": false,
|
||||
"CanUpdate": false,
|
||||
"CanExport": false,
|
||||
"DefaultValue": null,
|
||||
"DefaultValueType": 0,
|
||||
"PivotSettingsDto": {
|
||||
"IsPivot": true,
|
||||
"Expanded": false,
|
||||
"SortOrder": "asc",
|
||||
"Area": "filter",
|
||||
"Format": null,
|
||||
"SummaryType": null,
|
||||
"GroupInterval": "",
|
||||
"WordWrapEnabled": false
|
||||
},
|
||||
"Alignment": "left",
|
||||
"Format": null,
|
||||
"EditOrderNo": null,
|
||||
"EditGroupOrderNo": null,
|
||||
"EditorType2": "dxDateBox",
|
||||
"ColSpan": 1,
|
||||
"EditorOptions": "{\"type\":\"datetime\",\"displayFormat\":\"dd.MM.yyyy HH:mm\",\"readOnly\":true}",
|
||||
"GridBoxOptions": null,
|
||||
"TagBoxOptions": null,
|
||||
"ImageUploadOptions": null,
|
||||
"EditorScript": null,
|
||||
"LastModificationTime": null,
|
||||
"LastModifierId": null,
|
||||
"CreationTime": "0001-01-01T00:00:00",
|
||||
"CreatorId": null,
|
||||
"Id": "00000000-0000-0000-0000-000000000000"
|
||||
}
|
||||
],
|
||||
"IsDeletedField": true,
|
||||
|
|
@ -1892,7 +2032,8 @@
|
|||
"App.Inventory.ProductSupplier.Title",
|
||||
"App.Inventory.ProductSupplier.Desc",
|
||||
"App.Listform.ListformField.Supplier",
|
||||
"App.Listform.ListformField.LeadTimeDays"
|
||||
"App.Listform.ListformField.LeadTimeDays",
|
||||
"App.Listform.ListformField.LastPurchaseDate"
|
||||
],
|
||||
"PermissionGroupNames": [],
|
||||
"PermissionNames": [
|
||||
|
|
|
|||
|
|
@ -335,6 +335,7 @@
|
|||
"AllowAllDeleting": false,
|
||||
"AllowAdding": false,
|
||||
"AllowDuplicate": false,
|
||||
"OpenDetailAfterInsert": false,
|
||||
"UseIcons": false,
|
||||
"ConfirmDelete": true,
|
||||
"NewRowPosition": "viewportTop",
|
||||
|
|
@ -374,7 +375,7 @@
|
|||
"D": "App.Inventory.ProductVariant.Delete",
|
||||
"E": "App.Inventory.ProductVariant.Export",
|
||||
"I": "App.Inventory.ProductVariant.Import",
|
||||
"N": "App.Inventory.ProductVariant.Note"
|
||||
"N": null
|
||||
},
|
||||
"CommandColumnDto": [],
|
||||
"StateStoringDto": {
|
||||
|
|
@ -415,6 +416,7 @@
|
|||
"ApprovalDescriptionFieldName": null,
|
||||
"ApprovalIsFilterUserName": false,
|
||||
"ApprovalIsResetWorkflow": false,
|
||||
"ApprovalIsManualStart": false,
|
||||
"Criteria": []
|
||||
},
|
||||
"UserId": null,
|
||||
|
|
@ -1946,7 +1948,6 @@
|
|||
"App.Inventory.ProductVariant.Desc",
|
||||
"App.Listform.ListformField.ProductName",
|
||||
"App.Listform.ListformField.VariantValues",
|
||||
"App.Listform.ListformField.VariantKey",
|
||||
"App.Listform.ListformField.IsDeleted"
|
||||
],
|
||||
"PermissionGroupNames": [],
|
||||
|
|
@ -1956,8 +1957,7 @@
|
|||
"App.Inventory.ProductVariant.Update",
|
||||
"App.Inventory.ProductVariant.Delete",
|
||||
"App.Inventory.ProductVariant.Export",
|
||||
"App.Inventory.ProductVariant.Import",
|
||||
"App.Inventory.ProductVariant.Note"
|
||||
"App.Inventory.ProductVariant.Import"
|
||||
],
|
||||
"MenuCodes": [
|
||||
"App.Inventory.ProductVariant"
|
||||
|
|
|
|||
|
|
@ -32,18 +32,18 @@
|
|||
"MenuTr": "Alımlar",
|
||||
"TitleEn": "Receipts",
|
||||
"TitleTr": "Alımlar",
|
||||
"DescEn": "Receipts — goods entering the warehouse from suppliers.\nWhere: Inventory › Operations › Receipts. Confirming a purchase order opens a draft receipt automatically (Source Document = order no; received quantities are written back to the order lines).\nFields: received from (supplier), branch › warehouse › operation type (receipt types only), destination location (from the operation type), scheduled date, source document.\nStatuses: Draft › Waiting / Ready › Done; Cancelled. Row buttons appear according to the document status. Mark as Ready checks stock and fills the done quantity; Mark as Done posts stock by branch › warehouse › location › product › lot; the remainder of lines done below demand moves to a new document (backorder). Return opens a reverse draft document from a done one; Print prints the transfer slip.\nTabs: Operations (product lines; Details for lots/serials, Generate Lot/Serial and Auto Assign), Additional Info (shipping, responsible, project), Note.\nProducts with inventory tracking off create no stock move; products tracked by lot or serial need a lot distribution before Mark as Done. The number comes from the operation type's sequence. Related screens: Inventory › Stock, Moves and Product Moves.",
|
||||
"DescTr": "Alımlar — tedarikçiden depoya giren mallar.\nNerede: Envanter › Operasyonlar › Alımlar. Satınalma siparişi onaylanınca taslak alım kendiliğinden açılır (Kaynak Belge = sipariş no; alınan miktarlar sipariş kalemlerine yazılır).\nAlanlar: alım yapılan (tedarikçi), şube › depo › operasyon türü (yalnız alım türleri), hedef konum (operasyon türünden gelir), planlanan tarih, kaynak belge.\nDurumlar: Taslak › Bekleyen / Hazır › Tamamlandı; İptal. Satırdaki butonlar belgenin durumuna göre görünür. Hazırla stoğu kontrol eder ve yapılacak miktarı doldurur; Tamamla stoğu şube › depo › konum › ürün › lot bazında günceller, talepten az yapılan satırların kalanı aynı türde yeni belgeye (backorder) geçer. İade Et, tamamlanmış belgeden ters yönlü taslak belge açar; Yazdır transfer fişini basar.\nSekmeler: Operasyonlar (ürün satırları; Detaylar ile lot/seri, Lot/Seri Oluştur ve Otomatik Ata), Ek Bilgi (nakliye, sorumlu, proje), Not.\nÜrünün Envanter Takibi kapalıysa stok hareketi oluşmaz; Takip Yöntemi Lot ya da Seri ise Tamamla'dan önce lot dağılımı girilmelidir. Numara operasyon türünün numaratöründen verilir. İlişkili ekranlar: Envanter › Stok, Hareketler ve Ürün Hareketleri.",
|
||||
"DescEn": "Receipts — goods entering the warehouse from suppliers.\nWhere: Inventory › Operations › Receipts. Confirming a purchase order opens a draft receipt automatically (Source Document = order no; received quantities are written back to the order lines).\nFields: received from (supplier), branch › warehouse › operation type (receipt types only), destination location (from the operation type), scheduled date, source document.\nStatuses: Draft › Waiting / Ready › Done; Cancelled. Row buttons appear according to the document status. Mark as To Do checks stock and fills the done quantity; Validate posts stock by branch › warehouse › location › product › lot; the remainder of lines done below demand moves to a new document (backorder). Return opens a reverse draft document from a done one; Print prints the transfer slip.\nTabs: Operations (product lines; Details for lots/serials, Generate Lot/Serial and Auto Assign), Additional Info (shipping, responsible, project), Note.\nProducts with inventory tracking off create no stock move; products tracked by lot or serial need a lot distribution before Validate. The number comes from the operation type's sequence. Related screens: Inventory › Stock, Moves and Product Moves.",
|
||||
"DescTr": "Alımlar — tedarikçiden depoya giren mallar.\nNerede: Envanter › Operasyonlar › Alımlar. Satınalma siparişi onaylanınca taslak alım kendiliğinden açılır (Kaynak Belge = sipariş no; alınan miktarlar sipariş kalemlerine yazılır).\nAlanlar: alım yapılan (tedarikçi), şube › depo › operasyon türü (yalnız alım türleri), hedef konum (operasyon türünden gelir), planlanan tarih, kaynak belge.\nDurumlar: Taslak › Bekleyen / Hazır › Tamamlandı; İptal. Satırdaki butonlar belgenin durumuna göre görünür. Yapılacak olarak işaretle stoğu kontrol eder ve yapılacak miktarı doldurur; Doğrula stoğu şube › depo › konum › ürün › lot bazında günceller, talepten az yapılan satırların kalanı aynı türde yeni belgeye (backorder) geçer. İade Et, tamamlanmış belgeden ters yönlü taslak belge açar; Yazdır transfer fişini basar.\nSekmeler: Operasyonlar (ürün satırları; Detaylar ile lot/seri, Lot/Seri Oluştur ve Otomatik Ata), Ek Bilgi (nakliye, sorumlu, proje), Not.\nÜrünün Envanter Takibi kapalıysa stok hareketi oluşmaz; Takip Yöntemi Lot ya da Seri ise Doğrula'dan önce lot dağılımı girilmelidir. Numara operasyon türünün numaratöründen verilir. İlişkili ekranlar: Envanter › Stok, Hareketler ve Ürün Hareketleri.",
|
||||
"Texts": [
|
||||
{
|
||||
"Key": "App.Inventory.Transfer.Action.Confirm",
|
||||
"En": "Mark as Ready",
|
||||
"Tr": "Hazırla"
|
||||
"En": "Mark as To Do",
|
||||
"Tr": "Yapılacak olarak işaretle"
|
||||
},
|
||||
{
|
||||
"Key": "App.Inventory.Transfer.Action.Validate",
|
||||
"En": "Mark as Done",
|
||||
"Tr": "Tamamla"
|
||||
"En": "Validate",
|
||||
"Tr": "Doğrula"
|
||||
},
|
||||
{
|
||||
"Key": "App.Inventory.Transfer.Action.Cancel",
|
||||
|
|
@ -106,6 +106,12 @@
|
|||
"En": "Id",
|
||||
"Tr": "Kimlik"
|
||||
},
|
||||
{
|
||||
"FieldName": "PartnerId",
|
||||
"CaptionName": "App.Inventory.Receipt.PartnerId",
|
||||
"En": "Supplier Name",
|
||||
"Tr": "Tedarikçi Adı"
|
||||
},
|
||||
{
|
||||
"FieldName": "TransferNo",
|
||||
"CaptionName": "App.Listform.ListformField.TransferNo",
|
||||
|
|
@ -118,18 +124,6 @@
|
|||
"En": "Status",
|
||||
"Tr": "Durum"
|
||||
},
|
||||
{
|
||||
"FieldName": "SourceDocument",
|
||||
"CaptionName": "App.Listform.ListformField.SourceDocument",
|
||||
"En": "Source Document",
|
||||
"Tr": "Kaynak Belge"
|
||||
},
|
||||
{
|
||||
"FieldName": "PartnerId",
|
||||
"CaptionName": "App.Inventory.Receipt.PartnerId",
|
||||
"En": "Supplier Name",
|
||||
"Tr": "Tedarikçi Adı"
|
||||
},
|
||||
{
|
||||
"FieldName": "ScheduledDate",
|
||||
"CaptionName": "App.Listform.ListformField.ScheduledDate",
|
||||
|
|
@ -189,6 +183,12 @@
|
|||
"CaptionName": "App.Listform.ListformField.LineSummary",
|
||||
"En": "LineSummary",
|
||||
"Tr": "LineSummary"
|
||||
},
|
||||
{
|
||||
"FieldName": "SourceDocument",
|
||||
"CaptionName": "App.Listform.ListformField.SourceDocument",
|
||||
"En": "Source Document",
|
||||
"Tr": "Kaynak Belge"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -1079,384 +1079,6 @@
|
|||
"CreatorId": null,
|
||||
"Id": "00000000-0000-0000-0000-000000000000"
|
||||
},
|
||||
{
|
||||
"EditType": null,
|
||||
"ListFormCode": "App.Inventory.Receipt",
|
||||
"RoleId": null,
|
||||
"UserId": null,
|
||||
"ColumnJoinTableDto": {
|
||||
"JoinType": null,
|
||||
"TableName": null,
|
||||
"JoinFieldName": null,
|
||||
"BaseTableJoinFieldName": null,
|
||||
"SelectFieldName": null,
|
||||
"FieldNameAlias": null,
|
||||
"JoinCondition2": "AND",
|
||||
"JoinFieldName2": null,
|
||||
"BaseTableJoinFieldName2_OrValue": null
|
||||
},
|
||||
"FieldName": "TransferNo",
|
||||
"CaptionName": "App.Listform.ListformField.TransferNo",
|
||||
"PlaceHolder": null,
|
||||
"ReadOnly": false,
|
||||
"Visible": true,
|
||||
"IsActive": true,
|
||||
"Width": 0,
|
||||
"ListOrderNo": 2,
|
||||
"SourceDbType": 16,
|
||||
"CultureName": "en",
|
||||
"DataType": "string",
|
||||
"SortIndex": 0,
|
||||
"SortDirection": null,
|
||||
"AllowSearch": true,
|
||||
"AllowEditing": true,
|
||||
"AllowAdding": true,
|
||||
"ColumnCssClass": null,
|
||||
"ColumnCssValue": null,
|
||||
"BandName": null,
|
||||
"ColumnFilterDto": {
|
||||
"AllowFiltering": true,
|
||||
"FilterOperations": null,
|
||||
"SelectedFilterOperation": null,
|
||||
"FilterValue": null
|
||||
},
|
||||
"ColumnHeaderDto": {
|
||||
"AllowHeaderFiltering": true,
|
||||
"AllowSearch": false,
|
||||
"DataSource": null,
|
||||
"DataSourceString": ""
|
||||
},
|
||||
"ColumnGroupingDto": {
|
||||
"AllowGrouping": true,
|
||||
"GroupIndex": null,
|
||||
"AutoExpandGroup": false
|
||||
},
|
||||
"ColumnCustomizationDto": {
|
||||
"Fixed": false,
|
||||
"FixedPosition": "left",
|
||||
"AllowReordering": true
|
||||
},
|
||||
"ColumnTotalSummaryDto": {
|
||||
"SummaryType": null,
|
||||
"ValueFormat": null,
|
||||
"ShowInGroupFooter": false,
|
||||
"AlignByColumn": false,
|
||||
"DisplayFormat": null,
|
||||
"ShowInColumn": null
|
||||
},
|
||||
"ColumnGroupSummaryDto": {
|
||||
"SummaryType": null,
|
||||
"ValueFormat": null,
|
||||
"ShowInGroupFooter": false,
|
||||
"AlignByColumn": false,
|
||||
"DisplayFormat": null,
|
||||
"ShowInColumn": null
|
||||
},
|
||||
"LookupDto": {
|
||||
"DataSourceType": 0,
|
||||
"ValueExpr": "Key",
|
||||
"DisplayExpr": "Name",
|
||||
"CascadeRelationField": null,
|
||||
"CascadeFilterOperator": "=",
|
||||
"CascadeParentFields": null,
|
||||
"CascadeEmptyFields": null,
|
||||
"LookupQuery": null
|
||||
},
|
||||
"ValidationRuleDto": [],
|
||||
"ColumnStylingDto": [],
|
||||
"PermissionDto": {
|
||||
"Deny": false,
|
||||
"C": "App.Inventory.Receipt.Create",
|
||||
"R": "App.Inventory.Receipt",
|
||||
"U": "App.Inventory.Receipt.Update",
|
||||
"E": true,
|
||||
"I": true
|
||||
},
|
||||
"CanRead": false,
|
||||
"CanCreate": false,
|
||||
"CanUpdate": false,
|
||||
"CanExport": false,
|
||||
"DefaultValue": null,
|
||||
"DefaultValueType": 0,
|
||||
"PivotSettingsDto": {
|
||||
"IsPivot": true,
|
||||
"Expanded": false,
|
||||
"SortOrder": "asc",
|
||||
"Area": "filter",
|
||||
"Format": null,
|
||||
"SummaryType": null,
|
||||
"GroupInterval": "",
|
||||
"WordWrapEnabled": false
|
||||
},
|
||||
"Alignment": "left",
|
||||
"Format": null,
|
||||
"EditOrderNo": 1,
|
||||
"EditGroupOrderNo": 1,
|
||||
"EditorType2": "dxTextBox",
|
||||
"ColSpan": 1,
|
||||
"EditorOptions": "{\"readOnly\":true}",
|
||||
"GridBoxOptions": null,
|
||||
"TagBoxOptions": null,
|
||||
"ImageUploadOptions": null,
|
||||
"EditorScript": null,
|
||||
"LastModificationTime": null,
|
||||
"LastModifierId": null,
|
||||
"CreationTime": "0001-01-01T00:00:00",
|
||||
"CreatorId": null,
|
||||
"Id": "00000000-0000-0000-0000-000000000000"
|
||||
},
|
||||
{
|
||||
"EditType": null,
|
||||
"ListFormCode": "App.Inventory.Receipt",
|
||||
"RoleId": null,
|
||||
"UserId": null,
|
||||
"ColumnJoinTableDto": {
|
||||
"JoinType": null,
|
||||
"TableName": null,
|
||||
"JoinFieldName": null,
|
||||
"BaseTableJoinFieldName": null,
|
||||
"SelectFieldName": null,
|
||||
"FieldNameAlias": null,
|
||||
"JoinCondition2": "AND",
|
||||
"JoinFieldName2": null,
|
||||
"BaseTableJoinFieldName2_OrValue": null
|
||||
},
|
||||
"FieldName": "Status",
|
||||
"CaptionName": "App.Listform.ListformField.Status",
|
||||
"PlaceHolder": null,
|
||||
"ReadOnly": false,
|
||||
"Visible": true,
|
||||
"IsActive": true,
|
||||
"Width": 0,
|
||||
"ListOrderNo": 3,
|
||||
"SourceDbType": 16,
|
||||
"CultureName": "en",
|
||||
"DataType": "string",
|
||||
"SortIndex": 0,
|
||||
"SortDirection": null,
|
||||
"AllowSearch": true,
|
||||
"AllowEditing": true,
|
||||
"AllowAdding": true,
|
||||
"ColumnCssClass": null,
|
||||
"ColumnCssValue": null,
|
||||
"BandName": null,
|
||||
"ColumnFilterDto": {
|
||||
"AllowFiltering": true,
|
||||
"FilterOperations": null,
|
||||
"SelectedFilterOperation": null,
|
||||
"FilterValue": null
|
||||
},
|
||||
"ColumnHeaderDto": {
|
||||
"AllowHeaderFiltering": true,
|
||||
"AllowSearch": false,
|
||||
"DataSource": null,
|
||||
"DataSourceString": ""
|
||||
},
|
||||
"ColumnGroupingDto": {
|
||||
"AllowGrouping": true,
|
||||
"GroupIndex": null,
|
||||
"AutoExpandGroup": false
|
||||
},
|
||||
"ColumnCustomizationDto": {
|
||||
"Fixed": false,
|
||||
"FixedPosition": "left",
|
||||
"AllowReordering": true
|
||||
},
|
||||
"ColumnTotalSummaryDto": {
|
||||
"SummaryType": null,
|
||||
"ValueFormat": null,
|
||||
"ShowInGroupFooter": false,
|
||||
"AlignByColumn": false,
|
||||
"DisplayFormat": null,
|
||||
"ShowInColumn": null
|
||||
},
|
||||
"ColumnGroupSummaryDto": {
|
||||
"SummaryType": null,
|
||||
"ValueFormat": null,
|
||||
"ShowInGroupFooter": false,
|
||||
"AlignByColumn": false,
|
||||
"DisplayFormat": null,
|
||||
"ShowInColumn": null
|
||||
},
|
||||
"LookupDto": {
|
||||
"DataSourceType": 1,
|
||||
"ValueExpr": "key",
|
||||
"DisplayExpr": "name",
|
||||
"CascadeRelationField": null,
|
||||
"CascadeFilterOperator": "=",
|
||||
"CascadeParentFields": null,
|
||||
"CascadeEmptyFields": null,
|
||||
"LookupQuery": "[{\"key\":\"Draft\",\"name\":\"App.StaticLookup.Draft\"},{\"key\":\"Waiting\",\"name\":\"App.StaticLookup.Waiting\"},{\"key\":\"Ready\",\"name\":\"App.StaticLookup.Ready\"},{\"key\":\"Done\",\"name\":\"App.StaticLookup.Done\"},{\"key\":\"Cancelled\",\"name\":\"App.StaticLookup.Cancelled\"}]"
|
||||
},
|
||||
"ValidationRuleDto": [],
|
||||
"ColumnStylingDto": [],
|
||||
"PermissionDto": {
|
||||
"Deny": false,
|
||||
"C": "App.Inventory.Receipt.Create",
|
||||
"R": "App.Inventory.Receipt",
|
||||
"U": "App.Inventory.Receipt.Update",
|
||||
"E": true,
|
||||
"I": true
|
||||
},
|
||||
"CanRead": false,
|
||||
"CanCreate": false,
|
||||
"CanUpdate": false,
|
||||
"CanExport": false,
|
||||
"DefaultValue": null,
|
||||
"DefaultValueType": 0,
|
||||
"PivotSettingsDto": {
|
||||
"IsPivot": true,
|
||||
"Expanded": false,
|
||||
"SortOrder": "asc",
|
||||
"Area": "filter",
|
||||
"Format": null,
|
||||
"SummaryType": null,
|
||||
"GroupInterval": "",
|
||||
"WordWrapEnabled": false
|
||||
},
|
||||
"Alignment": "left",
|
||||
"Format": null,
|
||||
"EditOrderNo": 2,
|
||||
"EditGroupOrderNo": 1,
|
||||
"EditorType2": "dxSelectBox",
|
||||
"ColSpan": 1,
|
||||
"EditorOptions": "{\"readOnly\":true}",
|
||||
"GridBoxOptions": null,
|
||||
"TagBoxOptions": null,
|
||||
"ImageUploadOptions": null,
|
||||
"EditorScript": null,
|
||||
"LastModificationTime": null,
|
||||
"LastModifierId": null,
|
||||
"CreationTime": "0001-01-01T00:00:00",
|
||||
"CreatorId": null,
|
||||
"Id": "00000000-0000-0000-0000-000000000000"
|
||||
},
|
||||
{
|
||||
"EditType": null,
|
||||
"ListFormCode": "App.Inventory.Receipt",
|
||||
"RoleId": null,
|
||||
"UserId": null,
|
||||
"ColumnJoinTableDto": {
|
||||
"JoinType": null,
|
||||
"TableName": null,
|
||||
"JoinFieldName": null,
|
||||
"BaseTableJoinFieldName": null,
|
||||
"SelectFieldName": null,
|
||||
"FieldNameAlias": null,
|
||||
"JoinCondition2": "AND",
|
||||
"JoinFieldName2": null,
|
||||
"BaseTableJoinFieldName2_OrValue": null
|
||||
},
|
||||
"FieldName": "SourceDocument",
|
||||
"CaptionName": "App.Listform.ListformField.SourceDocument",
|
||||
"PlaceHolder": null,
|
||||
"ReadOnly": false,
|
||||
"Visible": true,
|
||||
"IsActive": true,
|
||||
"Width": 0,
|
||||
"ListOrderNo": 4,
|
||||
"SourceDbType": 16,
|
||||
"CultureName": "en",
|
||||
"DataType": "string",
|
||||
"SortIndex": 0,
|
||||
"SortDirection": null,
|
||||
"AllowSearch": true,
|
||||
"AllowEditing": true,
|
||||
"AllowAdding": true,
|
||||
"ColumnCssClass": null,
|
||||
"ColumnCssValue": null,
|
||||
"BandName": null,
|
||||
"ColumnFilterDto": {
|
||||
"AllowFiltering": true,
|
||||
"FilterOperations": null,
|
||||
"SelectedFilterOperation": null,
|
||||
"FilterValue": null
|
||||
},
|
||||
"ColumnHeaderDto": {
|
||||
"AllowHeaderFiltering": true,
|
||||
"AllowSearch": false,
|
||||
"DataSource": null,
|
||||
"DataSourceString": ""
|
||||
},
|
||||
"ColumnGroupingDto": {
|
||||
"AllowGrouping": true,
|
||||
"GroupIndex": null,
|
||||
"AutoExpandGroup": false
|
||||
},
|
||||
"ColumnCustomizationDto": {
|
||||
"Fixed": false,
|
||||
"FixedPosition": "left",
|
||||
"AllowReordering": true
|
||||
},
|
||||
"ColumnTotalSummaryDto": {
|
||||
"SummaryType": null,
|
||||
"ValueFormat": null,
|
||||
"ShowInGroupFooter": false,
|
||||
"AlignByColumn": false,
|
||||
"DisplayFormat": null,
|
||||
"ShowInColumn": null
|
||||
},
|
||||
"ColumnGroupSummaryDto": {
|
||||
"SummaryType": null,
|
||||
"ValueFormat": null,
|
||||
"ShowInGroupFooter": false,
|
||||
"AlignByColumn": false,
|
||||
"DisplayFormat": null,
|
||||
"ShowInColumn": null
|
||||
},
|
||||
"LookupDto": {
|
||||
"DataSourceType": 0,
|
||||
"ValueExpr": "Key",
|
||||
"DisplayExpr": "Name",
|
||||
"CascadeRelationField": null,
|
||||
"CascadeFilterOperator": "=",
|
||||
"CascadeParentFields": null,
|
||||
"CascadeEmptyFields": null,
|
||||
"LookupQuery": null
|
||||
},
|
||||
"ValidationRuleDto": [],
|
||||
"ColumnStylingDto": [],
|
||||
"PermissionDto": {
|
||||
"Deny": false,
|
||||
"C": "App.Inventory.Receipt.Create",
|
||||
"R": "App.Inventory.Receipt",
|
||||
"U": "App.Inventory.Receipt.Update",
|
||||
"E": true,
|
||||
"I": true
|
||||
},
|
||||
"CanRead": false,
|
||||
"CanCreate": false,
|
||||
"CanUpdate": false,
|
||||
"CanExport": false,
|
||||
"DefaultValue": null,
|
||||
"DefaultValueType": 0,
|
||||
"PivotSettingsDto": {
|
||||
"IsPivot": true,
|
||||
"Expanded": false,
|
||||
"SortOrder": "asc",
|
||||
"Area": "filter",
|
||||
"Format": null,
|
||||
"SummaryType": null,
|
||||
"GroupInterval": "",
|
||||
"WordWrapEnabled": false
|
||||
},
|
||||
"Alignment": "left",
|
||||
"Format": null,
|
||||
"EditOrderNo": 3,
|
||||
"EditGroupOrderNo": 1,
|
||||
"EditorType2": "dxTextBox",
|
||||
"ColSpan": 1,
|
||||
"EditorOptions": "{\"showClearButton\":true,\"maxLength\":128}",
|
||||
"GridBoxOptions": null,
|
||||
"TagBoxOptions": null,
|
||||
"ImageUploadOptions": null,
|
||||
"EditorScript": null,
|
||||
"LastModificationTime": null,
|
||||
"LastModifierId": null,
|
||||
"CreationTime": "0001-01-01T00:00:00",
|
||||
"CreatorId": null,
|
||||
"Id": "00000000-0000-0000-0000-000000000000"
|
||||
},
|
||||
{
|
||||
"EditType": null,
|
||||
"ListFormCode": "App.Inventory.Receipt",
|
||||
|
|
@ -1480,7 +1102,7 @@
|
|||
"Visible": true,
|
||||
"IsActive": true,
|
||||
"Width": 0,
|
||||
"ListOrderNo": 5,
|
||||
"ListOrderNo": 2,
|
||||
"SourceDbType": 9,
|
||||
"CultureName": "en",
|
||||
"DataType": "string",
|
||||
|
|
@ -1568,7 +1190,7 @@
|
|||
},
|
||||
"Alignment": "left",
|
||||
"Format": null,
|
||||
"EditOrderNo": 4,
|
||||
"EditOrderNo": 1,
|
||||
"EditGroupOrderNo": 1,
|
||||
"EditorType2": "dxSelectBox",
|
||||
"ColSpan": 2,
|
||||
|
|
@ -1583,6 +1205,258 @@
|
|||
"CreatorId": null,
|
||||
"Id": "00000000-0000-0000-0000-000000000000"
|
||||
},
|
||||
{
|
||||
"EditType": null,
|
||||
"ListFormCode": "App.Inventory.Receipt",
|
||||
"RoleId": null,
|
||||
"UserId": null,
|
||||
"ColumnJoinTableDto": {
|
||||
"JoinType": null,
|
||||
"TableName": null,
|
||||
"JoinFieldName": null,
|
||||
"BaseTableJoinFieldName": null,
|
||||
"SelectFieldName": null,
|
||||
"FieldNameAlias": null,
|
||||
"JoinCondition2": "AND",
|
||||
"JoinFieldName2": null,
|
||||
"BaseTableJoinFieldName2_OrValue": null
|
||||
},
|
||||
"FieldName": "TransferNo",
|
||||
"CaptionName": "App.Listform.ListformField.TransferNo",
|
||||
"PlaceHolder": null,
|
||||
"ReadOnly": false,
|
||||
"Visible": true,
|
||||
"IsActive": true,
|
||||
"Width": 0,
|
||||
"ListOrderNo": 3,
|
||||
"SourceDbType": 16,
|
||||
"CultureName": "en",
|
||||
"DataType": "string",
|
||||
"SortIndex": 0,
|
||||
"SortDirection": null,
|
||||
"AllowSearch": true,
|
||||
"AllowEditing": true,
|
||||
"AllowAdding": true,
|
||||
"ColumnCssClass": null,
|
||||
"ColumnCssValue": null,
|
||||
"BandName": null,
|
||||
"ColumnFilterDto": {
|
||||
"AllowFiltering": true,
|
||||
"FilterOperations": null,
|
||||
"SelectedFilterOperation": null,
|
||||
"FilterValue": null
|
||||
},
|
||||
"ColumnHeaderDto": {
|
||||
"AllowHeaderFiltering": true,
|
||||
"AllowSearch": false,
|
||||
"DataSource": null,
|
||||
"DataSourceString": ""
|
||||
},
|
||||
"ColumnGroupingDto": {
|
||||
"AllowGrouping": true,
|
||||
"GroupIndex": null,
|
||||
"AutoExpandGroup": false
|
||||
},
|
||||
"ColumnCustomizationDto": {
|
||||
"Fixed": false,
|
||||
"FixedPosition": "left",
|
||||
"AllowReordering": true
|
||||
},
|
||||
"ColumnTotalSummaryDto": {
|
||||
"SummaryType": null,
|
||||
"ValueFormat": null,
|
||||
"ShowInGroupFooter": false,
|
||||
"AlignByColumn": false,
|
||||
"DisplayFormat": null,
|
||||
"ShowInColumn": null
|
||||
},
|
||||
"ColumnGroupSummaryDto": {
|
||||
"SummaryType": null,
|
||||
"ValueFormat": null,
|
||||
"ShowInGroupFooter": false,
|
||||
"AlignByColumn": false,
|
||||
"DisplayFormat": null,
|
||||
"ShowInColumn": null
|
||||
},
|
||||
"LookupDto": {
|
||||
"DataSourceType": 0,
|
||||
"ValueExpr": "Key",
|
||||
"DisplayExpr": "Name",
|
||||
"CascadeRelationField": null,
|
||||
"CascadeFilterOperator": "=",
|
||||
"CascadeParentFields": null,
|
||||
"CascadeEmptyFields": null,
|
||||
"LookupQuery": null
|
||||
},
|
||||
"ValidationRuleDto": [],
|
||||
"ColumnStylingDto": [],
|
||||
"PermissionDto": {
|
||||
"Deny": false,
|
||||
"C": "App.Inventory.Receipt.Create",
|
||||
"R": "App.Inventory.Receipt",
|
||||
"U": "App.Inventory.Receipt.Update",
|
||||
"E": true,
|
||||
"I": true
|
||||
},
|
||||
"CanRead": false,
|
||||
"CanCreate": false,
|
||||
"CanUpdate": false,
|
||||
"CanExport": false,
|
||||
"DefaultValue": null,
|
||||
"DefaultValueType": 0,
|
||||
"PivotSettingsDto": {
|
||||
"IsPivot": true,
|
||||
"Expanded": false,
|
||||
"SortOrder": "asc",
|
||||
"Area": "filter",
|
||||
"Format": null,
|
||||
"SummaryType": null,
|
||||
"GroupInterval": "",
|
||||
"WordWrapEnabled": false
|
||||
},
|
||||
"Alignment": "left",
|
||||
"Format": null,
|
||||
"EditOrderNo": 2,
|
||||
"EditGroupOrderNo": 1,
|
||||
"EditorType2": "dxTextBox",
|
||||
"ColSpan": 1,
|
||||
"EditorOptions": "{\"readOnly\":true}",
|
||||
"GridBoxOptions": null,
|
||||
"TagBoxOptions": null,
|
||||
"ImageUploadOptions": null,
|
||||
"EditorScript": null,
|
||||
"LastModificationTime": null,
|
||||
"LastModifierId": null,
|
||||
"CreationTime": "0001-01-01T00:00:00",
|
||||
"CreatorId": null,
|
||||
"Id": "00000000-0000-0000-0000-000000000000"
|
||||
},
|
||||
{
|
||||
"EditType": null,
|
||||
"ListFormCode": "App.Inventory.Receipt",
|
||||
"RoleId": null,
|
||||
"UserId": null,
|
||||
"ColumnJoinTableDto": {
|
||||
"JoinType": null,
|
||||
"TableName": null,
|
||||
"JoinFieldName": null,
|
||||
"BaseTableJoinFieldName": null,
|
||||
"SelectFieldName": null,
|
||||
"FieldNameAlias": null,
|
||||
"JoinCondition2": "AND",
|
||||
"JoinFieldName2": null,
|
||||
"BaseTableJoinFieldName2_OrValue": null
|
||||
},
|
||||
"FieldName": "Status",
|
||||
"CaptionName": "App.Listform.ListformField.Status",
|
||||
"PlaceHolder": null,
|
||||
"ReadOnly": false,
|
||||
"Visible": true,
|
||||
"IsActive": true,
|
||||
"Width": 0,
|
||||
"ListOrderNo": 4,
|
||||
"SourceDbType": 16,
|
||||
"CultureName": "en",
|
||||
"DataType": "string",
|
||||
"SortIndex": 0,
|
||||
"SortDirection": null,
|
||||
"AllowSearch": true,
|
||||
"AllowEditing": true,
|
||||
"AllowAdding": true,
|
||||
"ColumnCssClass": null,
|
||||
"ColumnCssValue": null,
|
||||
"BandName": null,
|
||||
"ColumnFilterDto": {
|
||||
"AllowFiltering": true,
|
||||
"FilterOperations": null,
|
||||
"SelectedFilterOperation": null,
|
||||
"FilterValue": null
|
||||
},
|
||||
"ColumnHeaderDto": {
|
||||
"AllowHeaderFiltering": true,
|
||||
"AllowSearch": false,
|
||||
"DataSource": null,
|
||||
"DataSourceString": ""
|
||||
},
|
||||
"ColumnGroupingDto": {
|
||||
"AllowGrouping": true,
|
||||
"GroupIndex": null,
|
||||
"AutoExpandGroup": false
|
||||
},
|
||||
"ColumnCustomizationDto": {
|
||||
"Fixed": false,
|
||||
"FixedPosition": "left",
|
||||
"AllowReordering": true
|
||||
},
|
||||
"ColumnTotalSummaryDto": {
|
||||
"SummaryType": null,
|
||||
"ValueFormat": null,
|
||||
"ShowInGroupFooter": false,
|
||||
"AlignByColumn": false,
|
||||
"DisplayFormat": null,
|
||||
"ShowInColumn": null
|
||||
},
|
||||
"ColumnGroupSummaryDto": {
|
||||
"SummaryType": null,
|
||||
"ValueFormat": null,
|
||||
"ShowInGroupFooter": false,
|
||||
"AlignByColumn": false,
|
||||
"DisplayFormat": null,
|
||||
"ShowInColumn": null
|
||||
},
|
||||
"LookupDto": {
|
||||
"DataSourceType": 1,
|
||||
"ValueExpr": "key",
|
||||
"DisplayExpr": "name",
|
||||
"CascadeRelationField": null,
|
||||
"CascadeFilterOperator": "=",
|
||||
"CascadeParentFields": null,
|
||||
"CascadeEmptyFields": null,
|
||||
"LookupQuery": "[{\"key\":\"Draft\",\"name\":\"App.StaticLookup.Draft\"},{\"key\":\"Waiting\",\"name\":\"App.StaticLookup.Waiting\"},{\"key\":\"Ready\",\"name\":\"App.StaticLookup.Ready\"},{\"key\":\"Done\",\"name\":\"App.StaticLookup.Done\"},{\"key\":\"Cancelled\",\"name\":\"App.StaticLookup.Cancelled\"}]"
|
||||
},
|
||||
"ValidationRuleDto": [],
|
||||
"ColumnStylingDto": [],
|
||||
"PermissionDto": {
|
||||
"Deny": false,
|
||||
"C": "App.Inventory.Receipt.Create",
|
||||
"R": "App.Inventory.Receipt",
|
||||
"U": "App.Inventory.Receipt.Update",
|
||||
"E": true,
|
||||
"I": true
|
||||
},
|
||||
"CanRead": false,
|
||||
"CanCreate": false,
|
||||
"CanUpdate": false,
|
||||
"CanExport": false,
|
||||
"DefaultValue": null,
|
||||
"DefaultValueType": 0,
|
||||
"PivotSettingsDto": {
|
||||
"IsPivot": true,
|
||||
"Expanded": false,
|
||||
"SortOrder": "asc",
|
||||
"Area": "filter",
|
||||
"Format": null,
|
||||
"SummaryType": null,
|
||||
"GroupInterval": "",
|
||||
"WordWrapEnabled": false
|
||||
},
|
||||
"Alignment": "left",
|
||||
"Format": null,
|
||||
"EditOrderNo": 5,
|
||||
"EditGroupOrderNo": 1,
|
||||
"EditorType2": "dxSelectBox",
|
||||
"ColSpan": 1,
|
||||
"EditorOptions": "{\"readOnly\":true}",
|
||||
"GridBoxOptions": null,
|
||||
"TagBoxOptions": null,
|
||||
"ImageUploadOptions": null,
|
||||
"EditorScript": null,
|
||||
"LastModificationTime": null,
|
||||
"LastModifierId": null,
|
||||
"CreationTime": "0001-01-01T00:00:00",
|
||||
"CreatorId": null,
|
||||
"Id": "00000000-0000-0000-0000-000000000000"
|
||||
},
|
||||
{
|
||||
"EditType": null,
|
||||
"ListFormCode": "App.Inventory.Receipt",
|
||||
|
|
@ -1606,7 +1480,7 @@
|
|||
"Visible": true,
|
||||
"IsActive": true,
|
||||
"Width": 0,
|
||||
"ListOrderNo": 6,
|
||||
"ListOrderNo": 5,
|
||||
"SourceDbType": 6,
|
||||
"CultureName": "en",
|
||||
"DataType": "datetime",
|
||||
|
|
@ -1708,7 +1582,7 @@
|
|||
},
|
||||
"Alignment": "left",
|
||||
"Format": null,
|
||||
"EditOrderNo": 5,
|
||||
"EditOrderNo": 3,
|
||||
"EditGroupOrderNo": 1,
|
||||
"EditorType2": "dxDateBox",
|
||||
"ColSpan": 1,
|
||||
|
|
@ -1746,7 +1620,7 @@
|
|||
"Visible": true,
|
||||
"IsActive": true,
|
||||
"Width": 0,
|
||||
"ListOrderNo": 8,
|
||||
"ListOrderNo": 6,
|
||||
"SourceDbType": 6,
|
||||
"CultureName": "en",
|
||||
"DataType": "datetime",
|
||||
|
|
@ -1834,7 +1708,7 @@
|
|||
},
|
||||
"Alignment": "left",
|
||||
"Format": null,
|
||||
"EditOrderNo": 7,
|
||||
"EditOrderNo": 4,
|
||||
"EditGroupOrderNo": 1,
|
||||
"EditorType2": "dxDateBox",
|
||||
"ColSpan": 1,
|
||||
|
|
@ -1872,7 +1746,7 @@
|
|||
"Visible": true,
|
||||
"IsActive": true,
|
||||
"Width": 0,
|
||||
"ListOrderNo": 9,
|
||||
"ListOrderNo": 7,
|
||||
"SourceDbType": 9,
|
||||
"CultureName": "en",
|
||||
"DataType": "string",
|
||||
|
|
@ -1974,7 +1848,7 @@
|
|||
},
|
||||
"Alignment": "left",
|
||||
"Format": null,
|
||||
"EditOrderNo": 8,
|
||||
"EditOrderNo": 6,
|
||||
"EditGroupOrderNo": 1,
|
||||
"EditorType2": "dxSelectBox",
|
||||
"ColSpan": 1,
|
||||
|
|
@ -2012,7 +1886,7 @@
|
|||
"Visible": true,
|
||||
"IsActive": true,
|
||||
"Width": 0,
|
||||
"ListOrderNo": 10,
|
||||
"ListOrderNo": 8,
|
||||
"SourceDbType": 9,
|
||||
"CultureName": "en",
|
||||
"DataType": "string",
|
||||
|
|
@ -2114,7 +1988,7 @@
|
|||
},
|
||||
"Alignment": "left",
|
||||
"Format": null,
|
||||
"EditOrderNo": 9,
|
||||
"EditOrderNo": 7,
|
||||
"EditGroupOrderNo": 1,
|
||||
"EditorType2": "dxSelectBox",
|
||||
"ColSpan": 1,
|
||||
|
|
@ -2152,7 +2026,7 @@
|
|||
"Visible": true,
|
||||
"IsActive": true,
|
||||
"Width": 0,
|
||||
"ListOrderNo": 11,
|
||||
"ListOrderNo": 9,
|
||||
"SourceDbType": 9,
|
||||
"CultureName": "en",
|
||||
"DataType": "string",
|
||||
|
|
@ -2254,7 +2128,7 @@
|
|||
},
|
||||
"Alignment": "left",
|
||||
"Format": null,
|
||||
"EditOrderNo": 10,
|
||||
"EditOrderNo": 8,
|
||||
"EditGroupOrderNo": 1,
|
||||
"EditorType2": "dxSelectBox",
|
||||
"ColSpan": 1,
|
||||
|
|
@ -2292,7 +2166,7 @@
|
|||
"Visible": true,
|
||||
"IsActive": true,
|
||||
"Width": 0,
|
||||
"ListOrderNo": 12,
|
||||
"ListOrderNo": 10,
|
||||
"SourceDbType": 9,
|
||||
"CultureName": "en",
|
||||
"DataType": "string",
|
||||
|
|
@ -2394,7 +2268,7 @@
|
|||
},
|
||||
"Alignment": "left",
|
||||
"Format": null,
|
||||
"EditOrderNo": 11,
|
||||
"EditOrderNo": 9,
|
||||
"EditGroupOrderNo": 1,
|
||||
"EditorType2": "dxSelectBox",
|
||||
"ColSpan": 1,
|
||||
|
|
@ -2432,7 +2306,7 @@
|
|||
"Visible": false,
|
||||
"IsActive": true,
|
||||
"Width": 0,
|
||||
"ListOrderNo": 13,
|
||||
"ListOrderNo": 11,
|
||||
"SourceDbType": 9,
|
||||
"CultureName": "en",
|
||||
"DataType": "string",
|
||||
|
|
@ -2558,7 +2432,7 @@
|
|||
"Visible": false,
|
||||
"IsActive": true,
|
||||
"Width": 0,
|
||||
"ListOrderNo": 14,
|
||||
"ListOrderNo": 12,
|
||||
"SourceDbType": 16,
|
||||
"CultureName": "en",
|
||||
"DataType": "string",
|
||||
|
|
@ -2684,7 +2558,7 @@
|
|||
"Visible": false,
|
||||
"IsActive": true,
|
||||
"Width": 0,
|
||||
"ListOrderNo": 15,
|
||||
"ListOrderNo": 13,
|
||||
"SourceDbType": 16,
|
||||
"CultureName": "en",
|
||||
"DataType": "string",
|
||||
|
|
@ -2810,7 +2684,7 @@
|
|||
"Visible": false,
|
||||
"IsActive": true,
|
||||
"Width": 0,
|
||||
"ListOrderNo": 16,
|
||||
"ListOrderNo": 14,
|
||||
"SourceDbType": 16,
|
||||
"CultureName": "en",
|
||||
"DataType": "string",
|
||||
|
|
@ -2912,6 +2786,132 @@
|
|||
"CreationTime": "0001-01-01T00:00:00",
|
||||
"CreatorId": null,
|
||||
"Id": "00000000-0000-0000-0000-000000000000"
|
||||
},
|
||||
{
|
||||
"EditType": null,
|
||||
"ListFormCode": "App.Inventory.Receipt",
|
||||
"RoleId": null,
|
||||
"UserId": null,
|
||||
"ColumnJoinTableDto": {
|
||||
"JoinType": null,
|
||||
"TableName": null,
|
||||
"JoinFieldName": null,
|
||||
"BaseTableJoinFieldName": null,
|
||||
"SelectFieldName": null,
|
||||
"FieldNameAlias": null,
|
||||
"JoinCondition2": "AND",
|
||||
"JoinFieldName2": null,
|
||||
"BaseTableJoinFieldName2_OrValue": null
|
||||
},
|
||||
"FieldName": "SourceDocument",
|
||||
"CaptionName": "App.Listform.ListformField.SourceDocument",
|
||||
"PlaceHolder": null,
|
||||
"ReadOnly": false,
|
||||
"Visible": true,
|
||||
"IsActive": true,
|
||||
"Width": 0,
|
||||
"ListOrderNo": 15,
|
||||
"SourceDbType": 16,
|
||||
"CultureName": "en",
|
||||
"DataType": "string",
|
||||
"SortIndex": 0,
|
||||
"SortDirection": null,
|
||||
"AllowSearch": true,
|
||||
"AllowEditing": true,
|
||||
"AllowAdding": true,
|
||||
"ColumnCssClass": null,
|
||||
"ColumnCssValue": null,
|
||||
"BandName": null,
|
||||
"ColumnFilterDto": {
|
||||
"AllowFiltering": true,
|
||||
"FilterOperations": null,
|
||||
"SelectedFilterOperation": null,
|
||||
"FilterValue": null
|
||||
},
|
||||
"ColumnHeaderDto": {
|
||||
"AllowHeaderFiltering": true,
|
||||
"AllowSearch": false,
|
||||
"DataSource": null,
|
||||
"DataSourceString": ""
|
||||
},
|
||||
"ColumnGroupingDto": {
|
||||
"AllowGrouping": true,
|
||||
"GroupIndex": null,
|
||||
"AutoExpandGroup": false
|
||||
},
|
||||
"ColumnCustomizationDto": {
|
||||
"Fixed": false,
|
||||
"FixedPosition": "left",
|
||||
"AllowReordering": true
|
||||
},
|
||||
"ColumnTotalSummaryDto": {
|
||||
"SummaryType": null,
|
||||
"ValueFormat": null,
|
||||
"ShowInGroupFooter": false,
|
||||
"AlignByColumn": false,
|
||||
"DisplayFormat": null,
|
||||
"ShowInColumn": null
|
||||
},
|
||||
"ColumnGroupSummaryDto": {
|
||||
"SummaryType": null,
|
||||
"ValueFormat": null,
|
||||
"ShowInGroupFooter": false,
|
||||
"AlignByColumn": false,
|
||||
"DisplayFormat": null,
|
||||
"ShowInColumn": null
|
||||
},
|
||||
"LookupDto": {
|
||||
"DataSourceType": 0,
|
||||
"ValueExpr": "Key",
|
||||
"DisplayExpr": "Name",
|
||||
"CascadeRelationField": null,
|
||||
"CascadeFilterOperator": "=",
|
||||
"CascadeParentFields": null,
|
||||
"CascadeEmptyFields": null,
|
||||
"LookupQuery": null
|
||||
},
|
||||
"ValidationRuleDto": [],
|
||||
"ColumnStylingDto": [],
|
||||
"PermissionDto": {
|
||||
"Deny": false,
|
||||
"C": "App.Inventory.Receipt.Create",
|
||||
"R": "App.Inventory.Receipt",
|
||||
"U": "App.Inventory.Receipt.Update",
|
||||
"E": true,
|
||||
"I": true
|
||||
},
|
||||
"CanRead": false,
|
||||
"CanCreate": false,
|
||||
"CanUpdate": false,
|
||||
"CanExport": false,
|
||||
"DefaultValue": null,
|
||||
"DefaultValueType": 0,
|
||||
"PivotSettingsDto": {
|
||||
"IsPivot": true,
|
||||
"Expanded": false,
|
||||
"SortOrder": "asc",
|
||||
"Area": "filter",
|
||||
"Format": null,
|
||||
"SummaryType": null,
|
||||
"GroupInterval": "",
|
||||
"WordWrapEnabled": false
|
||||
},
|
||||
"Alignment": "left",
|
||||
"Format": null,
|
||||
"EditOrderNo": 10,
|
||||
"EditGroupOrderNo": 1,
|
||||
"EditorType2": "dxTextBox",
|
||||
"ColSpan": 1,
|
||||
"EditorOptions": "{\"showClearButton\":true,\"maxLength\":128}",
|
||||
"GridBoxOptions": null,
|
||||
"TagBoxOptions": null,
|
||||
"ImageUploadOptions": null,
|
||||
"EditorScript": null,
|
||||
"LastModificationTime": null,
|
||||
"LastModifierId": null,
|
||||
"CreationTime": "0001-01-01T00:00:00",
|
||||
"CreatorId": null,
|
||||
"Id": "00000000-0000-0000-0000-000000000000"
|
||||
}
|
||||
],
|
||||
"IsDeletedField": true,
|
||||
|
|
|
|||
|
|
@ -24,8 +24,8 @@
|
|||
"MenuTr": "Stok",
|
||||
"TitleEn": "Stock",
|
||||
"TitleTr": "Stok",
|
||||
"DescEn": "Stock — on-hand quantity by branch › warehouse › location › product › lot, in the product unit (read only).\nWhere: Inventory › Stock. Only Mark as Done on a transfer changes it: incoming documents add to the destination location, outgoing ones deduct from the source location; external locations (vendors, customers) hold no stock.\nProducts without inventory tracking are not listed; quantity-tracked products have an empty lot. Use the Pivot view for warehouse × product totals. Related: Inventory › Product Moves.",
|
||||
"DescTr": "Stok — şube › depo › konum › ürün › lot bazında eldeki miktar, ürünün biriminde (salt okunur).\nNerede: Envanter › Stok. Yalnız transferin Tamamla işlemi değiştirir: giriş belgesi hedef konuma ekler, çıkış belgesi kaynak konumdan düşer; dış konumlar (tedarikçi, müşteri) stok tutmaz.\nEnvanter takibi kapalı ürün listelenmez; miktara göre takipli üründe lot boştur. Depo × ürün toplamı için Pivot görünümü kullanılır. İlişkili: Envanter › Ürün Hareketleri.",
|
||||
"DescEn": "Stock — on-hand quantity by branch › warehouse › location › product › lot, in the product unit (read only).\nWhere: Inventory › Stock. Only Validate on a transfer changes it: incoming documents add to the destination location, outgoing ones deduct from the source location; external locations (vendors, customers) hold no stock.\nProducts without inventory tracking are not listed; quantity-tracked products have an empty lot. Use the Pivot view for warehouse × product totals. Related: Inventory › Product Moves.",
|
||||
"DescTr": "Stok — şube › depo › konum › ürün › lot bazında eldeki miktar, ürünün biriminde (salt okunur).\nNerede: Envanter › Stok. Yalnız transferin Doğrula işlemi değiştirir: giriş belgesi hedef konuma ekler, çıkış belgesi kaynak konumdan düşer; dış konumlar (tedarikçi, müşteri) stok tutmaz.\nEnvanter takibi kapalı ürün listelenmez; miktara göre takipli üründe lot boştur. Depo × ürün toplamı için Pivot görünümü kullanılır. İlişkili: Envanter › Ürün Hareketleri.",
|
||||
"Texts": [
|
||||
{
|
||||
"Key": "App.Inventory.Widget.Products",
|
||||
|
|
|
|||
|
|
@ -63,6 +63,12 @@
|
|||
"En": "Id",
|
||||
"Tr": "Kimlik"
|
||||
},
|
||||
{
|
||||
"FieldName": "PartnerId",
|
||||
"CaptionName": "App.Inventory.Transfer.PartnerId",
|
||||
"En": "Contact",
|
||||
"Tr": "Kontak"
|
||||
},
|
||||
{
|
||||
"FieldName": "TransferId",
|
||||
"CaptionName": "App.Listform.ListformField.TransferId",
|
||||
|
|
@ -105,18 +111,18 @@
|
|||
"En": "Product",
|
||||
"Tr": "Ürün"
|
||||
},
|
||||
{
|
||||
"FieldName": "LotNo",
|
||||
"CaptionName": "App.Listform.ListformField.LotNo",
|
||||
"En": "Lot/Serial Number",
|
||||
"Tr": "Lot/Seri No"
|
||||
},
|
||||
{
|
||||
"FieldName": "DemandQuantity",
|
||||
"CaptionName": "App.Listform.ListformField.DemandQuantity",
|
||||
"En": "Demand",
|
||||
"Tr": "Talep"
|
||||
},
|
||||
{
|
||||
"FieldName": "LotNo",
|
||||
"CaptionName": "App.Listform.ListformField.LotNo",
|
||||
"En": "Lot/Serial Number",
|
||||
"Tr": "Lot/Seri No"
|
||||
},
|
||||
{
|
||||
"FieldName": "Quantity",
|
||||
"CaptionName": "App.Listform.ListformField.Quantity",
|
||||
|
|
@ -153,12 +159,6 @@
|
|||
"En": "Destination Location",
|
||||
"Tr": "Hedef Konum"
|
||||
},
|
||||
{
|
||||
"FieldName": "PartnerId",
|
||||
"CaptionName": "App.Inventory.Transfer.PartnerId",
|
||||
"En": "Contact",
|
||||
"Tr": "Kontak"
|
||||
},
|
||||
{
|
||||
"FieldName": "SourceDocument",
|
||||
"CaptionName": "App.Listform.ListformField.SourceDocument",
|
||||
|
|
@ -485,7 +485,7 @@
|
|||
"D": "App.Inventory.StockMove.Delete",
|
||||
"E": "App.Inventory.StockMove.Export",
|
||||
"I": "App.Inventory.StockMove.Import",
|
||||
"N": "App.Inventory.StockMove.Note"
|
||||
"N": null
|
||||
},
|
||||
"CommandColumnDto": [
|
||||
{
|
||||
|
|
@ -547,7 +547,7 @@
|
|||
"IsOrganizationUnit": false,
|
||||
"ListFormType": "List",
|
||||
"IsSubForm": false,
|
||||
"ShowNote": true,
|
||||
"ShowNote": false,
|
||||
"SubFormsListFormType": "Form",
|
||||
"SubFormsDto": [],
|
||||
"ExtraFilterDto": [],
|
||||
|
|
@ -957,6 +957,132 @@
|
|||
"CreatorId": null,
|
||||
"Id": "00000000-0000-0000-0000-000000000000"
|
||||
},
|
||||
{
|
||||
"EditType": null,
|
||||
"ListFormCode": "App.Inventory.StockMove",
|
||||
"RoleId": null,
|
||||
"UserId": null,
|
||||
"ColumnJoinTableDto": {
|
||||
"JoinType": null,
|
||||
"TableName": null,
|
||||
"JoinFieldName": null,
|
||||
"BaseTableJoinFieldName": null,
|
||||
"SelectFieldName": null,
|
||||
"FieldNameAlias": null,
|
||||
"JoinCondition2": "AND",
|
||||
"JoinFieldName2": null,
|
||||
"BaseTableJoinFieldName2_OrValue": null
|
||||
},
|
||||
"FieldName": "PartnerId",
|
||||
"CaptionName": "App.Inventory.Transfer.PartnerId",
|
||||
"PlaceHolder": null,
|
||||
"ReadOnly": false,
|
||||
"Visible": true,
|
||||
"IsActive": true,
|
||||
"Width": 0,
|
||||
"ListOrderNo": 2,
|
||||
"SourceDbType": 9,
|
||||
"CultureName": "en",
|
||||
"DataType": "string",
|
||||
"SortIndex": 0,
|
||||
"SortDirection": null,
|
||||
"AllowSearch": true,
|
||||
"AllowEditing": true,
|
||||
"AllowAdding": true,
|
||||
"ColumnCssClass": null,
|
||||
"ColumnCssValue": null,
|
||||
"BandName": null,
|
||||
"ColumnFilterDto": {
|
||||
"AllowFiltering": true,
|
||||
"FilterOperations": null,
|
||||
"SelectedFilterOperation": null,
|
||||
"FilterValue": null
|
||||
},
|
||||
"ColumnHeaderDto": {
|
||||
"AllowHeaderFiltering": true,
|
||||
"AllowSearch": false,
|
||||
"DataSource": null,
|
||||
"DataSourceString": ""
|
||||
},
|
||||
"ColumnGroupingDto": {
|
||||
"AllowGrouping": true,
|
||||
"GroupIndex": null,
|
||||
"AutoExpandGroup": false
|
||||
},
|
||||
"ColumnCustomizationDto": {
|
||||
"Fixed": false,
|
||||
"FixedPosition": "left",
|
||||
"AllowReordering": true
|
||||
},
|
||||
"ColumnTotalSummaryDto": {
|
||||
"SummaryType": null,
|
||||
"ValueFormat": null,
|
||||
"ShowInGroupFooter": false,
|
||||
"AlignByColumn": false,
|
||||
"DisplayFormat": null,
|
||||
"ShowInColumn": null
|
||||
},
|
||||
"ColumnGroupSummaryDto": {
|
||||
"SummaryType": null,
|
||||
"ValueFormat": null,
|
||||
"ShowInGroupFooter": false,
|
||||
"AlignByColumn": false,
|
||||
"DisplayFormat": null,
|
||||
"ShowInColumn": null
|
||||
},
|
||||
"LookupDto": {
|
||||
"DataSourceType": 2,
|
||||
"ValueExpr": "Key",
|
||||
"DisplayExpr": "Name",
|
||||
"CascadeRelationField": null,
|
||||
"CascadeFilterOperator": "=",
|
||||
"CascadeParentFields": null,
|
||||
"CascadeEmptyFields": null,
|
||||
"LookupQuery": "SELECT Id AS [Key], Name AS [Name] FROM Adm_T_Contact WHERE TenantId = '@TENANTID' ORDER BY Name"
|
||||
},
|
||||
"ValidationRuleDto": [],
|
||||
"ColumnStylingDto": [],
|
||||
"PermissionDto": {
|
||||
"Deny": false,
|
||||
"C": "App.Inventory.StockMove.Create",
|
||||
"R": "App.Inventory.StockMove",
|
||||
"U": "App.Inventory.StockMove.Update",
|
||||
"E": true,
|
||||
"I": true
|
||||
},
|
||||
"CanRead": false,
|
||||
"CanCreate": false,
|
||||
"CanUpdate": false,
|
||||
"CanExport": false,
|
||||
"DefaultValue": null,
|
||||
"DefaultValueType": 0,
|
||||
"PivotSettingsDto": {
|
||||
"IsPivot": true,
|
||||
"Expanded": false,
|
||||
"SortOrder": "asc",
|
||||
"Area": "filter",
|
||||
"Format": null,
|
||||
"SummaryType": null,
|
||||
"GroupInterval": "",
|
||||
"WordWrapEnabled": false
|
||||
},
|
||||
"Alignment": "left",
|
||||
"Format": null,
|
||||
"EditOrderNo": null,
|
||||
"EditGroupOrderNo": null,
|
||||
"EditorType2": "dxSelectBox",
|
||||
"ColSpan": 1,
|
||||
"EditorOptions": null,
|
||||
"GridBoxOptions": null,
|
||||
"TagBoxOptions": null,
|
||||
"ImageUploadOptions": null,
|
||||
"EditorScript": null,
|
||||
"LastModificationTime": null,
|
||||
"LastModifierId": null,
|
||||
"CreationTime": "0001-01-01T00:00:00",
|
||||
"CreatorId": null,
|
||||
"Id": "00000000-0000-0000-0000-000000000000"
|
||||
},
|
||||
{
|
||||
"EditType": null,
|
||||
"ListFormCode": "App.Inventory.StockMove",
|
||||
|
|
@ -980,7 +1106,7 @@
|
|||
"Visible": false,
|
||||
"IsActive": true,
|
||||
"Width": 0,
|
||||
"ListOrderNo": 2,
|
||||
"ListOrderNo": 3,
|
||||
"SourceDbType": 9,
|
||||
"CultureName": "en",
|
||||
"DataType": "string",
|
||||
|
|
@ -1106,7 +1232,7 @@
|
|||
"Visible": true,
|
||||
"IsActive": true,
|
||||
"Width": 0,
|
||||
"ListOrderNo": 3,
|
||||
"ListOrderNo": 4,
|
||||
"SourceDbType": 6,
|
||||
"CultureName": "en",
|
||||
"DataType": "datetime",
|
||||
|
|
@ -1232,7 +1358,7 @@
|
|||
"Visible": true,
|
||||
"IsActive": true,
|
||||
"Width": 0,
|
||||
"ListOrderNo": 4,
|
||||
"ListOrderNo": 5,
|
||||
"SourceDbType": 16,
|
||||
"CultureName": "en",
|
||||
"DataType": "string",
|
||||
|
|
@ -1358,7 +1484,7 @@
|
|||
"Visible": true,
|
||||
"IsActive": true,
|
||||
"Width": 0,
|
||||
"ListOrderNo": 5,
|
||||
"ListOrderNo": 6,
|
||||
"SourceDbType": 16,
|
||||
"CultureName": "en",
|
||||
"DataType": "string",
|
||||
|
|
@ -1484,7 +1610,7 @@
|
|||
"Visible": true,
|
||||
"IsActive": true,
|
||||
"Width": 0,
|
||||
"ListOrderNo": 6,
|
||||
"ListOrderNo": 7,
|
||||
"SourceDbType": 9,
|
||||
"CultureName": "en",
|
||||
"DataType": "string",
|
||||
|
|
@ -1610,7 +1736,7 @@
|
|||
"Visible": true,
|
||||
"IsActive": true,
|
||||
"Width": 0,
|
||||
"ListOrderNo": 7,
|
||||
"ListOrderNo": 8,
|
||||
"SourceDbType": 16,
|
||||
"CultureName": "en",
|
||||
"DataType": "string",
|
||||
|
|
@ -1736,7 +1862,7 @@
|
|||
"Visible": true,
|
||||
"IsActive": true,
|
||||
"Width": 0,
|
||||
"ListOrderNo": 8,
|
||||
"ListOrderNo": 9,
|
||||
"SourceDbType": 9,
|
||||
"CultureName": "en",
|
||||
"DataType": "string",
|
||||
|
|
@ -1839,132 +1965,6 @@
|
|||
"CreatorId": null,
|
||||
"Id": "00000000-0000-0000-0000-000000000000"
|
||||
},
|
||||
{
|
||||
"EditType": null,
|
||||
"ListFormCode": "App.Inventory.StockMove",
|
||||
"RoleId": null,
|
||||
"UserId": null,
|
||||
"ColumnJoinTableDto": {
|
||||
"JoinType": null,
|
||||
"TableName": null,
|
||||
"JoinFieldName": null,
|
||||
"BaseTableJoinFieldName": null,
|
||||
"SelectFieldName": null,
|
||||
"FieldNameAlias": null,
|
||||
"JoinCondition2": "AND",
|
||||
"JoinFieldName2": null,
|
||||
"BaseTableJoinFieldName2_OrValue": null
|
||||
},
|
||||
"FieldName": "LotNo",
|
||||
"CaptionName": "App.Listform.ListformField.LotNo",
|
||||
"PlaceHolder": null,
|
||||
"ReadOnly": false,
|
||||
"Visible": true,
|
||||
"IsActive": true,
|
||||
"Width": 0,
|
||||
"ListOrderNo": 9,
|
||||
"SourceDbType": 16,
|
||||
"CultureName": "en",
|
||||
"DataType": "string",
|
||||
"SortIndex": 0,
|
||||
"SortDirection": null,
|
||||
"AllowSearch": true,
|
||||
"AllowEditing": true,
|
||||
"AllowAdding": true,
|
||||
"ColumnCssClass": null,
|
||||
"ColumnCssValue": null,
|
||||
"BandName": null,
|
||||
"ColumnFilterDto": {
|
||||
"AllowFiltering": true,
|
||||
"FilterOperations": null,
|
||||
"SelectedFilterOperation": null,
|
||||
"FilterValue": null
|
||||
},
|
||||
"ColumnHeaderDto": {
|
||||
"AllowHeaderFiltering": true,
|
||||
"AllowSearch": false,
|
||||
"DataSource": null,
|
||||
"DataSourceString": ""
|
||||
},
|
||||
"ColumnGroupingDto": {
|
||||
"AllowGrouping": true,
|
||||
"GroupIndex": null,
|
||||
"AutoExpandGroup": false
|
||||
},
|
||||
"ColumnCustomizationDto": {
|
||||
"Fixed": false,
|
||||
"FixedPosition": "left",
|
||||
"AllowReordering": true
|
||||
},
|
||||
"ColumnTotalSummaryDto": {
|
||||
"SummaryType": null,
|
||||
"ValueFormat": null,
|
||||
"ShowInGroupFooter": false,
|
||||
"AlignByColumn": false,
|
||||
"DisplayFormat": null,
|
||||
"ShowInColumn": null
|
||||
},
|
||||
"ColumnGroupSummaryDto": {
|
||||
"SummaryType": null,
|
||||
"ValueFormat": null,
|
||||
"ShowInGroupFooter": false,
|
||||
"AlignByColumn": false,
|
||||
"DisplayFormat": null,
|
||||
"ShowInColumn": null
|
||||
},
|
||||
"LookupDto": {
|
||||
"DataSourceType": 0,
|
||||
"ValueExpr": "Key",
|
||||
"DisplayExpr": "Name",
|
||||
"CascadeRelationField": null,
|
||||
"CascadeFilterOperator": "=",
|
||||
"CascadeParentFields": null,
|
||||
"CascadeEmptyFields": null,
|
||||
"LookupQuery": null
|
||||
},
|
||||
"ValidationRuleDto": [],
|
||||
"ColumnStylingDto": [],
|
||||
"PermissionDto": {
|
||||
"Deny": false,
|
||||
"C": "App.Inventory.StockMove.Create",
|
||||
"R": "App.Inventory.StockMove",
|
||||
"U": "App.Inventory.StockMove.Update",
|
||||
"E": true,
|
||||
"I": true
|
||||
},
|
||||
"CanRead": false,
|
||||
"CanCreate": false,
|
||||
"CanUpdate": false,
|
||||
"CanExport": false,
|
||||
"DefaultValue": null,
|
||||
"DefaultValueType": 0,
|
||||
"PivotSettingsDto": {
|
||||
"IsPivot": true,
|
||||
"Expanded": false,
|
||||
"SortOrder": "asc",
|
||||
"Area": "filter",
|
||||
"Format": null,
|
||||
"SummaryType": null,
|
||||
"GroupInterval": "",
|
||||
"WordWrapEnabled": false
|
||||
},
|
||||
"Alignment": "left",
|
||||
"Format": null,
|
||||
"EditOrderNo": null,
|
||||
"EditGroupOrderNo": null,
|
||||
"EditorType2": "dxTextBox",
|
||||
"ColSpan": 1,
|
||||
"EditorOptions": null,
|
||||
"GridBoxOptions": null,
|
||||
"TagBoxOptions": null,
|
||||
"ImageUploadOptions": null,
|
||||
"EditorScript": null,
|
||||
"LastModificationTime": null,
|
||||
"LastModifierId": null,
|
||||
"CreationTime": "0001-01-01T00:00:00",
|
||||
"CreatorId": null,
|
||||
"Id": "00000000-0000-0000-0000-000000000000"
|
||||
},
|
||||
{
|
||||
"EditType": null,
|
||||
"ListFormCode": "App.Inventory.StockMove",
|
||||
|
|
@ -2091,6 +2091,132 @@
|
|||
"CreatorId": null,
|
||||
"Id": "00000000-0000-0000-0000-000000000000"
|
||||
},
|
||||
{
|
||||
"EditType": null,
|
||||
"ListFormCode": "App.Inventory.StockMove",
|
||||
"RoleId": null,
|
||||
"UserId": null,
|
||||
"ColumnJoinTableDto": {
|
||||
"JoinType": null,
|
||||
"TableName": null,
|
||||
"JoinFieldName": null,
|
||||
"BaseTableJoinFieldName": null,
|
||||
"SelectFieldName": null,
|
||||
"FieldNameAlias": null,
|
||||
"JoinCondition2": "AND",
|
||||
"JoinFieldName2": null,
|
||||
"BaseTableJoinFieldName2_OrValue": null
|
||||
},
|
||||
"FieldName": "LotNo",
|
||||
"CaptionName": "App.Listform.ListformField.LotNo",
|
||||
"PlaceHolder": null,
|
||||
"ReadOnly": false,
|
||||
"Visible": true,
|
||||
"IsActive": true,
|
||||
"Width": 0,
|
||||
"ListOrderNo": 10,
|
||||
"SourceDbType": 16,
|
||||
"CultureName": "en",
|
||||
"DataType": "string",
|
||||
"SortIndex": 0,
|
||||
"SortDirection": null,
|
||||
"AllowSearch": true,
|
||||
"AllowEditing": true,
|
||||
"AllowAdding": true,
|
||||
"ColumnCssClass": null,
|
||||
"ColumnCssValue": null,
|
||||
"BandName": null,
|
||||
"ColumnFilterDto": {
|
||||
"AllowFiltering": true,
|
||||
"FilterOperations": null,
|
||||
"SelectedFilterOperation": null,
|
||||
"FilterValue": null
|
||||
},
|
||||
"ColumnHeaderDto": {
|
||||
"AllowHeaderFiltering": true,
|
||||
"AllowSearch": false,
|
||||
"DataSource": null,
|
||||
"DataSourceString": ""
|
||||
},
|
||||
"ColumnGroupingDto": {
|
||||
"AllowGrouping": true,
|
||||
"GroupIndex": null,
|
||||
"AutoExpandGroup": false
|
||||
},
|
||||
"ColumnCustomizationDto": {
|
||||
"Fixed": false,
|
||||
"FixedPosition": "left",
|
||||
"AllowReordering": true
|
||||
},
|
||||
"ColumnTotalSummaryDto": {
|
||||
"SummaryType": null,
|
||||
"ValueFormat": null,
|
||||
"ShowInGroupFooter": false,
|
||||
"AlignByColumn": false,
|
||||
"DisplayFormat": null,
|
||||
"ShowInColumn": null
|
||||
},
|
||||
"ColumnGroupSummaryDto": {
|
||||
"SummaryType": null,
|
||||
"ValueFormat": null,
|
||||
"ShowInGroupFooter": false,
|
||||
"AlignByColumn": false,
|
||||
"DisplayFormat": null,
|
||||
"ShowInColumn": null
|
||||
},
|
||||
"LookupDto": {
|
||||
"DataSourceType": 0,
|
||||
"ValueExpr": "Key",
|
||||
"DisplayExpr": "Name",
|
||||
"CascadeRelationField": null,
|
||||
"CascadeFilterOperator": "=",
|
||||
"CascadeParentFields": null,
|
||||
"CascadeEmptyFields": null,
|
||||
"LookupQuery": null
|
||||
},
|
||||
"ValidationRuleDto": [],
|
||||
"ColumnStylingDto": [],
|
||||
"PermissionDto": {
|
||||
"Deny": false,
|
||||
"C": "App.Inventory.StockMove.Create",
|
||||
"R": "App.Inventory.StockMove",
|
||||
"U": "App.Inventory.StockMove.Update",
|
||||
"E": true,
|
||||
"I": true
|
||||
},
|
||||
"CanRead": false,
|
||||
"CanCreate": false,
|
||||
"CanUpdate": false,
|
||||
"CanExport": false,
|
||||
"DefaultValue": null,
|
||||
"DefaultValueType": 0,
|
||||
"PivotSettingsDto": {
|
||||
"IsPivot": true,
|
||||
"Expanded": false,
|
||||
"SortOrder": "asc",
|
||||
"Area": "filter",
|
||||
"Format": null,
|
||||
"SummaryType": null,
|
||||
"GroupInterval": "",
|
||||
"WordWrapEnabled": false
|
||||
},
|
||||
"Alignment": "left",
|
||||
"Format": null,
|
||||
"EditOrderNo": null,
|
||||
"EditGroupOrderNo": null,
|
||||
"EditorType2": "dxTextBox",
|
||||
"ColSpan": 1,
|
||||
"EditorOptions": null,
|
||||
"GridBoxOptions": null,
|
||||
"TagBoxOptions": null,
|
||||
"ImageUploadOptions": null,
|
||||
"EditorScript": null,
|
||||
"LastModificationTime": null,
|
||||
"LastModifierId": null,
|
||||
"CreationTime": "0001-01-01T00:00:00",
|
||||
"CreatorId": null,
|
||||
"Id": "00000000-0000-0000-0000-000000000000"
|
||||
},
|
||||
{
|
||||
"EditType": null,
|
||||
"ListFormCode": "App.Inventory.StockMove",
|
||||
|
|
@ -2847,132 +2973,6 @@
|
|||
"CreatorId": null,
|
||||
"Id": "00000000-0000-0000-0000-000000000000"
|
||||
},
|
||||
{
|
||||
"EditType": null,
|
||||
"ListFormCode": "App.Inventory.StockMove",
|
||||
"RoleId": null,
|
||||
"UserId": null,
|
||||
"ColumnJoinTableDto": {
|
||||
"JoinType": null,
|
||||
"TableName": null,
|
||||
"JoinFieldName": null,
|
||||
"BaseTableJoinFieldName": null,
|
||||
"SelectFieldName": null,
|
||||
"FieldNameAlias": null,
|
||||
"JoinCondition2": "AND",
|
||||
"JoinFieldName2": null,
|
||||
"BaseTableJoinFieldName2_OrValue": null
|
||||
},
|
||||
"FieldName": "PartnerId",
|
||||
"CaptionName": "App.Inventory.Transfer.PartnerId",
|
||||
"PlaceHolder": null,
|
||||
"ReadOnly": false,
|
||||
"Visible": true,
|
||||
"IsActive": true,
|
||||
"Width": 0,
|
||||
"ListOrderNo": 17,
|
||||
"SourceDbType": 9,
|
||||
"CultureName": "en",
|
||||
"DataType": "string",
|
||||
"SortIndex": 0,
|
||||
"SortDirection": null,
|
||||
"AllowSearch": true,
|
||||
"AllowEditing": true,
|
||||
"AllowAdding": true,
|
||||
"ColumnCssClass": null,
|
||||
"ColumnCssValue": null,
|
||||
"BandName": null,
|
||||
"ColumnFilterDto": {
|
||||
"AllowFiltering": true,
|
||||
"FilterOperations": null,
|
||||
"SelectedFilterOperation": null,
|
||||
"FilterValue": null
|
||||
},
|
||||
"ColumnHeaderDto": {
|
||||
"AllowHeaderFiltering": true,
|
||||
"AllowSearch": false,
|
||||
"DataSource": null,
|
||||
"DataSourceString": ""
|
||||
},
|
||||
"ColumnGroupingDto": {
|
||||
"AllowGrouping": true,
|
||||
"GroupIndex": null,
|
||||
"AutoExpandGroup": false
|
||||
},
|
||||
"ColumnCustomizationDto": {
|
||||
"Fixed": false,
|
||||
"FixedPosition": "left",
|
||||
"AllowReordering": true
|
||||
},
|
||||
"ColumnTotalSummaryDto": {
|
||||
"SummaryType": null,
|
||||
"ValueFormat": null,
|
||||
"ShowInGroupFooter": false,
|
||||
"AlignByColumn": false,
|
||||
"DisplayFormat": null,
|
||||
"ShowInColumn": null
|
||||
},
|
||||
"ColumnGroupSummaryDto": {
|
||||
"SummaryType": null,
|
||||
"ValueFormat": null,
|
||||
"ShowInGroupFooter": false,
|
||||
"AlignByColumn": false,
|
||||
"DisplayFormat": null,
|
||||
"ShowInColumn": null
|
||||
},
|
||||
"LookupDto": {
|
||||
"DataSourceType": 2,
|
||||
"ValueExpr": "Key",
|
||||
"DisplayExpr": "Name",
|
||||
"CascadeRelationField": null,
|
||||
"CascadeFilterOperator": "=",
|
||||
"CascadeParentFields": null,
|
||||
"CascadeEmptyFields": null,
|
||||
"LookupQuery": "SELECT Id AS [Key], Name AS [Name] FROM Adm_T_Contact WHERE TenantId = '@TENANTID' ORDER BY Name"
|
||||
},
|
||||
"ValidationRuleDto": [],
|
||||
"ColumnStylingDto": [],
|
||||
"PermissionDto": {
|
||||
"Deny": false,
|
||||
"C": "App.Inventory.StockMove.Create",
|
||||
"R": "App.Inventory.StockMove",
|
||||
"U": "App.Inventory.StockMove.Update",
|
||||
"E": true,
|
||||
"I": true
|
||||
},
|
||||
"CanRead": false,
|
||||
"CanCreate": false,
|
||||
"CanUpdate": false,
|
||||
"CanExport": false,
|
||||
"DefaultValue": null,
|
||||
"DefaultValueType": 0,
|
||||
"PivotSettingsDto": {
|
||||
"IsPivot": true,
|
||||
"Expanded": false,
|
||||
"SortOrder": "asc",
|
||||
"Area": "filter",
|
||||
"Format": null,
|
||||
"SummaryType": null,
|
||||
"GroupInterval": "",
|
||||
"WordWrapEnabled": false
|
||||
},
|
||||
"Alignment": "left",
|
||||
"Format": null,
|
||||
"EditOrderNo": null,
|
||||
"EditGroupOrderNo": null,
|
||||
"EditorType2": "dxSelectBox",
|
||||
"ColSpan": 1,
|
||||
"EditorOptions": null,
|
||||
"GridBoxOptions": null,
|
||||
"TagBoxOptions": null,
|
||||
"ImageUploadOptions": null,
|
||||
"EditorScript": null,
|
||||
"LastModificationTime": null,
|
||||
"LastModifierId": null,
|
||||
"CreationTime": "0001-01-01T00:00:00",
|
||||
"CreatorId": null,
|
||||
"Id": "00000000-0000-0000-0000-000000000000"
|
||||
},
|
||||
{
|
||||
"EditType": null,
|
||||
"ListFormCode": "App.Inventory.StockMove",
|
||||
|
|
@ -3120,8 +3120,7 @@
|
|||
"App.Inventory.StockMove.Update",
|
||||
"App.Inventory.StockMove.Delete",
|
||||
"App.Inventory.StockMove.Export",
|
||||
"App.Inventory.StockMove.Import",
|
||||
"App.Inventory.StockMove.Note"
|
||||
"App.Inventory.StockMove.Import"
|
||||
],
|
||||
"MenuCodes": [
|
||||
"App.Inventory.StockMove"
|
||||
|
|
|
|||
|
|
@ -33,8 +33,8 @@
|
|||
"MenuTr": "Onay ve Teslim",
|
||||
"TitleEn": "Approval & Delivery",
|
||||
"TitleTr": "Onay ve Teslim",
|
||||
"DescEn": "Approval & Delivery — source warehouse approval and receipt of an internal transfer (Approval & Delivery tab of Internal Transfers; read only).\nFields: source warehouse approval (No Approval Needed when the source location has no responsible), approval user / date / description (written by the workflow), received by and receipt date (written by Mark as Done).",
|
||||
"DescTr": "Onay ve Teslim — iç transferin kaynak depo onayı ve teslimi (İç Transferler'in Onay ve Teslim sekmesi; salt okunur).\nAlanlar: kaynak depo onayı (kaynak konumun sorumlusu yoksa Onay Gerekmez), onaylayan / onay tarihi / açıklaması (iş akışı yazar), teslim alan ve teslim alma tarihi (Tamamla yazar)."
|
||||
"DescEn": "Approval & Delivery — source warehouse approval and receipt of an internal transfer (Approval & Delivery tab of Internal Transfers; read only).\nFields: source warehouse approval (No Approval Needed when the source location has no responsible), approval user / date / description (written by the workflow), received by and receipt date (written by Validate).",
|
||||
"DescTr": "Onay ve Teslim — iç transferin kaynak depo onayı ve teslimi (İç Transferler'in Onay ve Teslim sekmesi; salt okunur).\nAlanlar: kaynak depo onayı (kaynak konumun sorumlusu yoksa Onay Gerekmez), onaylayan / onay tarihi / açıklaması (iş akışı yazar), teslim alan ve teslim alma tarihi (Doğrula yazar)."
|
||||
},
|
||||
"Groups": [
|
||||
{
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue