Inventory menüsü

This commit is contained in:
Sedat ÖZTÜRK 2026-10-13 00:43:05 +03:00
parent fed76687e3
commit 52b6e1201d
92 changed files with 34396 additions and 137 deletions

View file

@ -1789,7 +1789,7 @@ da forma yazılmaz. Numara/kod alanı otomatik değilse (kullanıcı girer) kura
`Value` numaratörün `Name`'idir: `Value` numaratörün `Name`'idir:
```jsonc ```jsonc
{ "FieldName": "ProjectNo", "FieldDbType": 16, "Value": "ProjeCode1", "CustomValueType": 5, "SqlQuery": "" } { "FieldName": "ProjectNo", "FieldDbType": 16, "Value": "Prj.Project", "CustomValueType": 5, "SqlQuery": "" }
``` ```
Formda numara önizlenir, kalıcı numara kayıt anında alınır (§9.9). Formda numara önizlenir, kalıcı numara kayıt anında alınır (§9.9).

View file

@ -1272,7 +1272,7 @@ ekranın kendi ayrıntılı açıklamasını gösterir (`DescTr`/`DescEn`, `lowc
| [App.Administration.md](configs/seeds/docs/modules/App.Administration.md) | Yönetim (`App.Administration`) | Tanımlamalar (Kontaklar: satış ve satınalmanın ortak müşteri/tedarikçi kartı ve sekmeleri, kontak etiketleri) | | [App.Administration.md](configs/seeds/docs/modules/App.Administration.md) | Yönetim (`App.Administration`) | Tanımlamalar (Kontaklar: satış ve satınalmanın ortak müşteri/tedarikçi kartı ve sekmeleri, kontak etiketleri) |
| [App.Hr.md](configs/seeds/docs/modules/App.Hr.md) | İnsan Kaynakları (`App.Hr`) | Tanımlamalar (dizin + genel tanımlar), Organizasyon ve Yetkinlik, Personel Kaydı (Kimlik › Kullanıcılar › detay), İşe Alım, Çalışma Takvimi ve Vardiyalar, İzin Yönetimi, Puantaj ve Devam Takibi, Sağlık Kartları, Eğitimler, Performans Yönetimi, Disiplin Dosyaları, Araçlar, Ziyaretçiler, Olay Günlüğü, Intranet | | [App.Hr.md](configs/seeds/docs/modules/App.Hr.md) | İnsan Kaynakları (`App.Hr`) | Tanımlamalar (dizin + genel tanımlar), Organizasyon ve Yetkinlik, Personel Kaydı (Kimlik › Kullanıcılar › detay), İşe Alım, Çalışma Takvimi ve Vardiyalar, İzin Yönetimi, Puantaj ve Devam Takibi, Sağlık Kartları, Eğitimler, Performans Yönetimi, Disiplin Dosyaları, Araçlar, Ziyaretçiler, Olay Günlüğü, Intranet |
| [App.Prc.md](configs/seeds/docs/modules/App.Prc.md) | Satınalma (`App.Prc`) | Tanımlamalar (ödeme/teslimat koşulları, ödeme/teslim yöntemleri, red nedenleri) · Talepler · Siparişler (sözleşme, tedarikçi bazlı teklif talebi ihalesi + fiyat/termin kıyası, satınalma siparişi) | | [App.Prc.md](configs/seeds/docs/modules/App.Prc.md) | Satınalma (`App.Prc`) | Tanımlamalar (ödeme/teslimat koşulları, ödeme/teslim yöntemleri, red nedenleri) · Talepler · Siparişler (sözleşme, tedarikçi bazlı teklif talebi ihalesi + fiyat/termin kıyası, satınalma siparişi) |
| [App.Inventory.md](configs/seeds/docs/modules/App.Inventory.md) | Envanter (`App.Inventory`) | Tanımlamalar (ürün kategorileri, nitelikler, ürünler ve varyantlar, reçeteler, reçete patlatma) | | [App.Inventory.md](configs/seeds/docs/modules/App.Inventory.md) | Envanter (`App.Inventory`) | Tanımlamalar (ürün kategorileri, nitelikler, ürünler ve varyantlar, reçeteler, reçete patlatma, depolar, konumlar, operasyon türleri), Operasyonlar (alım, teslimat, iç transfer; lot/seri, backorder, iade), Raporlama (stok, hareketler) |
| [App.Production.md](configs/seeds/docs/modules/App.Production.md) | Üretim (`App.Production`) | Tanımlamalar (iş merkezi etiketleri, iş merkezleri, operasyonlar) | | [App.Production.md](configs/seeds/docs/modules/App.Production.md) | Üretim (`App.Production`) | Tanımlamalar (iş merkezi etiketleri, iş merkezleri, operasyonlar) |
--- ---

View file

@ -18023,6 +18023,926 @@
"IsEnabled": true, "IsEnabled": true,
"MultiTenancySide": 3, "MultiTenancySide": 3,
"Modules": "Prc" "Modules": "Prc"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.Operations",
"ParentName": null,
"DisplayName": "App.Inventory.Operations",
"Order": 2,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.Receipt",
"ParentName": "App.Inventory.Operations",
"DisplayName": "App.Inventory.Receipt",
"Order": 1,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.Receipt.Create",
"ParentName": "App.Inventory.Receipt",
"DisplayName": "App.Platform.Create",
"Order": 1,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.Receipt.Update",
"ParentName": "App.Inventory.Receipt",
"DisplayName": "App.Platform.Update",
"Order": 2,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.Receipt.Delete",
"ParentName": "App.Inventory.Receipt",
"DisplayName": "App.Platform.Delete",
"Order": 3,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.Receipt.Export",
"ParentName": "App.Inventory.Receipt",
"DisplayName": "App.Platform.Export",
"Order": 4,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.Receipt.Import",
"ParentName": "App.Inventory.Receipt",
"DisplayName": "App.Platform.Import",
"Order": 5,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.Receipt.Note",
"ParentName": "App.Inventory.Receipt",
"DisplayName": "App.Platform.Note",
"Order": 6,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.Delivery",
"ParentName": "App.Inventory.Operations",
"DisplayName": "App.Inventory.Delivery",
"Order": 2,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.Delivery.Create",
"ParentName": "App.Inventory.Delivery",
"DisplayName": "App.Platform.Create",
"Order": 1,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.Delivery.Update",
"ParentName": "App.Inventory.Delivery",
"DisplayName": "App.Platform.Update",
"Order": 2,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.Delivery.Delete",
"ParentName": "App.Inventory.Delivery",
"DisplayName": "App.Platform.Delete",
"Order": 3,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.Delivery.Export",
"ParentName": "App.Inventory.Delivery",
"DisplayName": "App.Platform.Export",
"Order": 4,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.Delivery.Import",
"ParentName": "App.Inventory.Delivery",
"DisplayName": "App.Platform.Import",
"Order": 5,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.Delivery.Note",
"ParentName": "App.Inventory.Delivery",
"DisplayName": "App.Platform.Note",
"Order": 6,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.InternalTransfer",
"ParentName": "App.Inventory.Operations",
"DisplayName": "App.Inventory.InternalTransfer",
"Order": 3,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.InternalTransfer.Create",
"ParentName": "App.Inventory.InternalTransfer",
"DisplayName": "App.Platform.Create",
"Order": 1,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.InternalTransfer.Update",
"ParentName": "App.Inventory.InternalTransfer",
"DisplayName": "App.Platform.Update",
"Order": 2,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.InternalTransfer.Delete",
"ParentName": "App.Inventory.InternalTransfer",
"DisplayName": "App.Platform.Delete",
"Order": 3,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.InternalTransfer.Export",
"ParentName": "App.Inventory.InternalTransfer",
"DisplayName": "App.Platform.Export",
"Order": 4,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.InternalTransfer.Import",
"ParentName": "App.Inventory.InternalTransfer",
"DisplayName": "App.Platform.Import",
"Order": 5,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.InternalTransfer.Note",
"ParentName": "App.Inventory.InternalTransfer",
"DisplayName": "App.Platform.Note",
"Order": 6,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferLine",
"ParentName": "App.Inventory.Operations",
"DisplayName": "App.Inventory.TransferLine",
"Order": 5,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferLine.Create",
"ParentName": "App.Inventory.TransferLine",
"DisplayName": "App.Platform.Create",
"Order": 1,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferLine.Update",
"ParentName": "App.Inventory.TransferLine",
"DisplayName": "App.Platform.Update",
"Order": 2,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferLine.Delete",
"ParentName": "App.Inventory.TransferLine",
"DisplayName": "App.Platform.Delete",
"Order": 3,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferLine.Export",
"ParentName": "App.Inventory.TransferLine",
"DisplayName": "App.Platform.Export",
"Order": 4,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferLine.Import",
"ParentName": "App.Inventory.TransferLine",
"DisplayName": "App.Platform.Import",
"Order": 5,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferLine.Note",
"ParentName": "App.Inventory.TransferLine",
"DisplayName": "App.Platform.Note",
"Order": 6,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferLineLot",
"ParentName": "App.Inventory.TransferLine",
"DisplayName": "App.Inventory.TransferLineLot",
"Order": 7,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferLineLot.Create",
"ParentName": "App.Inventory.TransferLineLot",
"DisplayName": "App.Platform.Create",
"Order": 1,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferLineLot.Update",
"ParentName": "App.Inventory.TransferLineLot",
"DisplayName": "App.Platform.Update",
"Order": 2,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferLineLot.Delete",
"ParentName": "App.Inventory.TransferLineLot",
"DisplayName": "App.Platform.Delete",
"Order": 3,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferLineLot.Export",
"ParentName": "App.Inventory.TransferLineLot",
"DisplayName": "App.Platform.Export",
"Order": 4,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferLineLot.Import",
"ParentName": "App.Inventory.TransferLineLot",
"DisplayName": "App.Platform.Import",
"Order": 5,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferLineLot.Note",
"ParentName": "App.Inventory.TransferLineLot",
"DisplayName": "App.Platform.Note",
"Order": 6,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferLineLotStock",
"ParentName": "App.Inventory.TransferLine",
"DisplayName": "App.Inventory.TransferLineLotStock",
"Order": 8,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferLineLotStock.Create",
"ParentName": "App.Inventory.TransferLineLotStock",
"DisplayName": "App.Platform.Create",
"Order": 1,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferLineLotStock.Update",
"ParentName": "App.Inventory.TransferLineLotStock",
"DisplayName": "App.Platform.Update",
"Order": 2,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferLineLotStock.Delete",
"ParentName": "App.Inventory.TransferLineLotStock",
"DisplayName": "App.Platform.Delete",
"Order": 3,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferLineLotStock.Export",
"ParentName": "App.Inventory.TransferLineLotStock",
"DisplayName": "App.Platform.Export",
"Order": 4,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferLineLotStock.Import",
"ParentName": "App.Inventory.TransferLineLotStock",
"DisplayName": "App.Platform.Import",
"Order": 5,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferLineLotStock.Note",
"ParentName": "App.Inventory.TransferLineLotStock",
"DisplayName": "App.Platform.Note",
"Order": 6,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferOther",
"ParentName": "App.Inventory.Operations",
"DisplayName": "App.Inventory.TransferOther",
"Order": 6,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferOther.Create",
"ParentName": "App.Inventory.TransferOther",
"DisplayName": "App.Platform.Create",
"Order": 1,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferOther.Update",
"ParentName": "App.Inventory.TransferOther",
"DisplayName": "App.Platform.Update",
"Order": 2,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferOther.Delete",
"ParentName": "App.Inventory.TransferOther",
"DisplayName": "App.Platform.Delete",
"Order": 3,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferOther.Export",
"ParentName": "App.Inventory.TransferOther",
"DisplayName": "App.Platform.Export",
"Order": 4,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferOther.Import",
"ParentName": "App.Inventory.TransferOther",
"DisplayName": "App.Platform.Import",
"Order": 5,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferOther.Note",
"ParentName": "App.Inventory.TransferOther",
"DisplayName": "App.Platform.Note",
"Order": 6,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferNote",
"ParentName": "App.Inventory.Operations",
"DisplayName": "App.Inventory.TransferNote",
"Order": 7,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferNote.Create",
"ParentName": "App.Inventory.TransferNote",
"DisplayName": "App.Platform.Create",
"Order": 1,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferNote.Update",
"ParentName": "App.Inventory.TransferNote",
"DisplayName": "App.Platform.Update",
"Order": 2,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferNote.Delete",
"ParentName": "App.Inventory.TransferNote",
"DisplayName": "App.Platform.Delete",
"Order": 3,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferNote.Export",
"ParentName": "App.Inventory.TransferNote",
"DisplayName": "App.Platform.Export",
"Order": 4,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferNote.Import",
"ParentName": "App.Inventory.TransferNote",
"DisplayName": "App.Platform.Import",
"Order": 5,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferNote.Note",
"ParentName": "App.Inventory.TransferNote",
"DisplayName": "App.Platform.Note",
"Order": 6,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferApproval",
"ParentName": "App.Inventory.InternalTransfer",
"DisplayName": "App.Inventory.TransferApproval",
"Order": 7,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferApproval.Create",
"ParentName": "App.Inventory.TransferApproval",
"DisplayName": "App.Platform.Create",
"Order": 1,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferApproval.Update",
"ParentName": "App.Inventory.TransferApproval",
"DisplayName": "App.Platform.Update",
"Order": 2,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferApproval.Delete",
"ParentName": "App.Inventory.TransferApproval",
"DisplayName": "App.Platform.Delete",
"Order": 3,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferApproval.Export",
"ParentName": "App.Inventory.TransferApproval",
"DisplayName": "App.Platform.Export",
"Order": 4,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferApproval.Import",
"ParentName": "App.Inventory.TransferApproval",
"DisplayName": "App.Platform.Import",
"Order": 5,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferApproval.Note",
"ParentName": "App.Inventory.TransferApproval",
"DisplayName": "App.Platform.Note",
"Order": 6,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferImportItem",
"ParentName": "App.Inventory.InternalTransfer",
"DisplayName": "App.Inventory.TransferImportItem",
"Order": 8,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferImportItem.Create",
"ParentName": "App.Inventory.TransferImportItem",
"DisplayName": "App.Platform.Create",
"Order": 1,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferImportItem.Update",
"ParentName": "App.Inventory.TransferImportItem",
"DisplayName": "App.Platform.Update",
"Order": 2,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferImportItem.Delete",
"ParentName": "App.Inventory.TransferImportItem",
"DisplayName": "App.Platform.Delete",
"Order": 3,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferImportItem.Export",
"ParentName": "App.Inventory.TransferImportItem",
"DisplayName": "App.Platform.Export",
"Order": 4,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferImportItem.Import",
"ParentName": "App.Inventory.TransferImportItem",
"DisplayName": "App.Platform.Import",
"Order": 5,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.TransferImportItem.Note",
"ParentName": "App.Inventory.TransferImportItem",
"DisplayName": "App.Platform.Note",
"Order": 6,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.Transfer",
"ParentName": null,
"DisplayName": "App.Inventory.Transfer",
"Order": 4,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.Transfer.Create",
"ParentName": "App.Inventory.Transfer",
"DisplayName": "App.Platform.Create",
"Order": 1,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.Transfer.Update",
"ParentName": "App.Inventory.Transfer",
"DisplayName": "App.Platform.Update",
"Order": 2,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.Transfer.Delete",
"ParentName": "App.Inventory.Transfer",
"DisplayName": "App.Platform.Delete",
"Order": 3,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.Transfer.Export",
"ParentName": "App.Inventory.Transfer",
"DisplayName": "App.Platform.Export",
"Order": 4,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.Transfer.Import",
"ParentName": "App.Inventory.Transfer",
"DisplayName": "App.Platform.Import",
"Order": 5,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.Transfer.Note",
"ParentName": "App.Inventory.Transfer",
"DisplayName": "App.Platform.Note",
"Order": 6,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.Stock",
"ParentName": null,
"DisplayName": "App.Inventory.Stock",
"Order": 3,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.Stock.Create",
"ParentName": "App.Inventory.Stock",
"DisplayName": "App.Platform.Create",
"Order": 1,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.Stock.Update",
"ParentName": "App.Inventory.Stock",
"DisplayName": "App.Platform.Update",
"Order": 2,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.Stock.Delete",
"ParentName": "App.Inventory.Stock",
"DisplayName": "App.Platform.Delete",
"Order": 3,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.Stock.Export",
"ParentName": "App.Inventory.Stock",
"DisplayName": "App.Platform.Export",
"Order": 4,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.Stock.Import",
"ParentName": "App.Inventory.Stock",
"DisplayName": "App.Platform.Import",
"Order": 5,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.Stock.Note",
"ParentName": "App.Inventory.Stock",
"DisplayName": "App.Platform.Note",
"Order": 6,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.StockMove",
"ParentName": null,
"DisplayName": "App.Inventory.StockMove",
"Order": 5,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.StockMove.Create",
"ParentName": "App.Inventory.StockMove",
"DisplayName": "App.Platform.Create",
"Order": 1,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.StockMove.Update",
"ParentName": "App.Inventory.StockMove",
"DisplayName": "App.Platform.Update",
"Order": 2,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.StockMove.Delete",
"ParentName": "App.Inventory.StockMove",
"DisplayName": "App.Platform.Delete",
"Order": 3,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.StockMove.Export",
"ParentName": "App.Inventory.StockMove",
"DisplayName": "App.Platform.Export",
"Order": 4,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.StockMove.Import",
"ParentName": "App.Inventory.StockMove",
"DisplayName": "App.Platform.Import",
"Order": 5,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
},
{
"GroupName": "App.Inventory",
"Name": "App.Inventory.StockMove.Note",
"ParentName": "App.Inventory.StockMove",
"DisplayName": "App.Platform.Note",
"Order": 6,
"IsEnabled": true,
"MultiTenancySide": 3,
"Modules": "Inventory"
} }
] ]
} }

View file

@ -4,36 +4,9 @@
"GeneratedAt": "2026-09-04T00:00:00Z", "GeneratedAt": "2026-09-04T00:00:00Z",
"Order": 0, "Order": 0,
"Rows": [ "Rows": [
{
"Id": "593717fa-97f3-5d85-9d84-08ec94d8e23f",
"Name": "PurchaseCode1",
"Prefix": "PO",
"Suffix": "",
"IsActive": true,
"PaddingSize": 6,
"IncrementStep": 1,
"StartNumber": 1,
"NextNumber": 1,
"ResetPeriod": 0,
"FormatTemplate": "{Prefix}{Number}{Suffix}"
},
{
"Id": "678c4337-5b06-51a7-9822-69d0dd90f13f",
"Name": "PurchaseCode2",
"Prefix": "PO",
"Suffix": "",
"IsActive": true,
"PaddingSize": 5,
"IncrementStep": 1,
"NextNumber": 1,
"ResetPeriod": 0,
"StartNumber": 1,
"LastPeriodKey": null,
"FormatTemplate": "{Prefix}{Number}{Suffix}"
},
{ {
"Id": "28981dbf-cf64-459c-bffc-fdfaeed4b2ef", "Id": "28981dbf-cf64-459c-bffc-fdfaeed4b2ef",
"Name": "ProjeCode1", "Name": "Prj.Project",
"Prefix": "PRJ", "Prefix": "PRJ",
"Suffix": null, "Suffix": null,
"IsActive": true, "IsActive": true,
@ -47,7 +20,7 @@
}, },
{ {
"Id": "e87c079d-0fa1-454b-9dd8-4e5adfc6e792", "Id": "e87c079d-0fa1-454b-9dd8-4e5adfc6e792",
"Name": "MaterialRequest1", "Name": "Prc.MaterialRequest",
"Prefix": "SRO", "Prefix": "SRO",
"Suffix": null, "Suffix": null,
"IsActive": true, "IsActive": true,
@ -61,7 +34,7 @@
}, },
{ {
"Id": "47556a76-69d9-4529-9b8e-b319d9155d3d", "Id": "47556a76-69d9-4529-9b8e-b319d9155d3d",
"Name": "PurchaseAgreement1", "Name": "Prc.PurchaseAgreement",
"Prefix": "BO", "Prefix": "BO",
"Suffix": "", "Suffix": "",
"IsActive": true, "IsActive": true,
@ -75,7 +48,7 @@
}, },
{ {
"Id": "939648b0-db87-4be0-a50d-62fd06e5a9b2", "Id": "939648b0-db87-4be0-a50d-62fd06e5a9b2",
"Name": "PurchaseOrder1", "Name": "Prc.PurchaseOrder",
"Prefix": "P", "Prefix": "P",
"Suffix": "", "Suffix": "",
"IsActive": true, "IsActive": true,
@ -89,7 +62,7 @@
}, },
{ {
"Id": "d1287271-43f1-514d-96f2-f786c467eae9", "Id": "d1287271-43f1-514d-96f2-f786c467eae9",
"Name": "PurchaseRfq", "Name": "Prc.PurchaseRfq",
"Prefix": "RFQ", "Prefix": "RFQ",
"Suffix": "", "Suffix": "",
"IsActive": true, "IsActive": true,
@ -100,6 +73,146 @@
"StartNumber": 1, "StartNumber": 1,
"LastPeriodKey": null, "LastPeriodKey": null,
"FormatTemplate": "{Prefix}{Number}{Suffix}" "FormatTemplate": "{Prefix}{Number}{Suffix}"
},
{
"Id": "fc401114-0a17-524a-8d98-51cb02f94147",
"Name": "Inventory.IKT.Receipt",
"Prefix": "IKT/IN/",
"Suffix": "",
"IsActive": true,
"PaddingSize": 5,
"IncrementStep": 1,
"NextNumber": 1,
"ResetPeriod": 0,
"StartNumber": 1,
"LastPeriodKey": null,
"FormatTemplate": "{Prefix}{Number}{Suffix}"
},
{
"Id": "34083a68-128b-5aee-8b3a-ad7c2f8fa692",
"Name": "Inventory.IKT.Storage",
"Prefix": "IKT/STOR/",
"Suffix": "",
"IsActive": true,
"PaddingSize": 5,
"IncrementStep": 1,
"NextNumber": 1,
"ResetPeriod": 0,
"StartNumber": 1,
"LastPeriodKey": null,
"FormatTemplate": "{Prefix}{Number}{Suffix}"
},
{
"Id": "519e6a49-1566-5380-b102-661b5f75eadb",
"Name": "Inventory.IKT.InternalTransfer",
"Prefix": "IKT/INT/",
"Suffix": "",
"IsActive": true,
"PaddingSize": 5,
"IncrementStep": 1,
"NextNumber": 1,
"ResetPeriod": 0,
"StartNumber": 1,
"LastPeriodKey": null,
"FormatTemplate": "{Prefix}{Number}{Suffix}"
},
{
"Id": "87964867-3add-594a-87d2-896159c912d2",
"Name": "Inventory.IKT.Delivery",
"Prefix": "IKT/OUT/",
"Suffix": "",
"IsActive": true,
"PaddingSize": 5,
"IncrementStep": 1,
"NextNumber": 1,
"ResetPeriod": 0,
"StartNumber": 1,
"LastPeriodKey": null,
"FormatTemplate": "{Prefix}{Number}{Suffix}"
},
{
"Id": "d4c5b099-a39f-5ea7-ace4-1c77f847fdde",
"Name": "Inventory.IKT.Manufacturing",
"Prefix": "IKT/MO/",
"Suffix": "",
"IsActive": true,
"PaddingSize": 5,
"IncrementStep": 1,
"NextNumber": 1,
"ResetPeriod": 0,
"StartNumber": 1,
"LastPeriodKey": null,
"FormatTemplate": "{Prefix}{Number}{Suffix}"
},
{
"Id": "4044775b-b4e0-5e97-8544-fda146b47f59",
"Name": "Inventory.IKT.MaintenanceConsumption",
"Prefix": "IKT/BKM/SARF/",
"Suffix": "",
"IsActive": true,
"PaddingSize": 5,
"IncrementStep": 1,
"NextNumber": 1,
"ResetPeriod": 0,
"StartNumber": 1,
"LastPeriodKey": null,
"FormatTemplate": "{Prefix}{Number}{Suffix}"
},
{
"Id": "ef8701e2-5ea4-5a32-b62e-0d290615ec0f",
"Name": "Inventory.IKT.DepartmentConsumption",
"Prefix": "IKT/SARF/",
"Suffix": "",
"IsActive": true,
"PaddingSize": 5,
"IncrementStep": 1,
"NextNumber": 1,
"ResetPeriod": 0,
"StartNumber": 1,
"LastPeriodKey": null,
"FormatTemplate": "{Prefix}{Number}{Suffix}"
},
{
"Id": "923e47d5-3531-53c7-a3d6-318977d7f2f4",
"Name": "Inventory.IKT.Repair",
"Prefix": "IKT/RO/",
"Suffix": "",
"IsActive": true,
"PaddingSize": 5,
"IncrementStep": 1,
"NextNumber": 1,
"ResetPeriod": 0,
"StartNumber": 1,
"LastPeriodKey": null,
"FormatTemplate": "{Prefix}{Number}{Suffix}"
},
{
"Id": "977f5389-2dde-5c5a-a91b-b6a8b35e0d32",
"Name": "Inventory.LotNumber",
"Prefix": "LOT",
"Suffix": "",
"IsActive": true,
"PaddingSize": 6,
"IncrementStep": 1,
"NextNumber": 1,
"ResetPeriod": 0,
"StartNumber": 1,
"LastPeriodKey": null,
"FormatTemplate": "{Prefix}{Number}{Suffix}"
},
{
"Id": "f7b4794e-a700-5637-a9c1-1ea66108a5a7",
"Name": "Inventory.SerialNumber",
"Prefix": "SN",
"Suffix": "",
"IsActive": true,
"PaddingSize": 6,
"IncrementStep": 1,
"NextNumber": 1,
"ResetPeriod": 0,
"StartNumber": 1,
"LastPeriodKey": null,
"FormatTemplate": "{Prefix}{Number}{Suffix}"
} }
] ]
} }

View file

@ -11,7 +11,43 @@
"Code": "0001", "Code": "0001",
"Name": "Ana Depo", "Name": "Ana Depo",
"DepartmentId": "8f14e45f-ea2d-4d9f-9f1d-1a2b3c4d5e6f", "DepartmentId": "8f14e45f-ea2d-4d9f-9f1d-1a2b3c4d5e6f",
"ResponsibleUserId": "77dc76f8-c567-974c-4bc6-3a2433f9216e", "LocationType": "Internal",
"ParentId": null,
"IsActive": true,
"ResponsibleUserName": "system@sozsoft.com"
},
{
"Id": "adcdb50b-69f7-5cd4-9942-6e012499e8f4",
"BranchId": "1c125bf3-3ffd-4445-a270-1bc43ac3f61c",
"WarehouseId": "1840580a-7984-cb0a-4008-3a2431f55623",
"Code": "VEN",
"Name": "Tedarikçiler",
"DepartmentId": null,
"LocationType": "External",
"ParentId": null,
"IsActive": true,
"ResponsibleUserName": "system@sozsoft.com"
},
{
"Id": "0178f19c-5f8c-5506-8d36-4fa5a4688124",
"BranchId": "1c125bf3-3ffd-4445-a270-1bc43ac3f61c",
"WarehouseId": "1840580a-7984-cb0a-4008-3a2431f55623",
"Code": "CUS",
"Name": "Müşteriler",
"DepartmentId": null,
"LocationType": "External",
"ParentId": null,
"IsActive": true,
"ResponsibleUserName": "system@sozsoft.com"
},
{
"Id": "15ceb858-663f-406e-b5a8-92c1fb3b361b",
"BranchId": "1c125bf3-3ffd-4445-a270-1bc43ac3f61c",
"WarehouseId": "1840580a-7984-cb0a-4008-3a2431f55623",
"Code": "0002",
"Name": "Ek Depo",
"DepartmentId": "8f14e45f-ea2d-4d9f-9f1d-1a2b3c4d5e6f",
"ResponsibleUserName": "system@sozsoft.com",
"LocationType": "Internal", "LocationType": "Internal",
"ParentId": null, "ParentId": null,
"IsActive": true "IsActive": true

View file

@ -10,10 +10,10 @@
"WarehouseId": "1840580a-7984-cb0a-4008-3a2431f55623", "WarehouseId": "1840580a-7984-cb0a-4008-3a2431f55623",
"Name": "Alımlar", "Name": "Alımlar",
"OperationKind": "Receipt", "OperationKind": "Receipt",
"SequencePrefix": "IN", "SequenceName": "Inventory.IKT.Receipt",
"Barcode": "WHIN", "Barcode": "WHIN",
"SourceLocationId": null, "SourceLocationId": "adcdb50b-69f7-5cd4-9942-6e012499e8f4",
"DestinationLocationId": null, "DestinationLocationId": "d92a4c2e-1ca2-4453-a66c-e7b3bf682716",
"IsActive": true "IsActive": true
}, },
{ {
@ -22,10 +22,10 @@
"WarehouseId": "1840580a-7984-cb0a-4008-3a2431f55623", "WarehouseId": "1840580a-7984-cb0a-4008-3a2431f55623",
"Name": "Storage", "Name": "Storage",
"OperationKind": "InternalTransfer", "OperationKind": "InternalTransfer",
"SequencePrefix": "STOR", "SequenceName": "Inventory.IKT.Storage",
"Barcode": "WHSTOR", "Barcode": "WHSTOR",
"SourceLocationId": null, "SourceLocationId": "d92a4c2e-1ca2-4453-a66c-e7b3bf682716",
"DestinationLocationId": null, "DestinationLocationId": "d92a4c2e-1ca2-4453-a66c-e7b3bf682716",
"IsActive": true "IsActive": true
}, },
{ {
@ -34,10 +34,10 @@
"WarehouseId": "1840580a-7984-cb0a-4008-3a2431f55623", "WarehouseId": "1840580a-7984-cb0a-4008-3a2431f55623",
"Name": "İç Transferler", "Name": "İç Transferler",
"OperationKind": "InternalTransfer", "OperationKind": "InternalTransfer",
"SequencePrefix": "INT", "SequenceName": "Inventory.IKT.InternalTransfer",
"Barcode": "WHINT", "Barcode": "WHINT",
"SourceLocationId": null, "SourceLocationId": "d92a4c2e-1ca2-4453-a66c-e7b3bf682716",
"DestinationLocationId": null, "DestinationLocationId": "d92a4c2e-1ca2-4453-a66c-e7b3bf682716",
"IsActive": true "IsActive": true
}, },
{ {
@ -46,10 +46,10 @@
"WarehouseId": "1840580a-7984-cb0a-4008-3a2431f55623", "WarehouseId": "1840580a-7984-cb0a-4008-3a2431f55623",
"Name": "Teslimatlar", "Name": "Teslimatlar",
"OperationKind": "Delivery", "OperationKind": "Delivery",
"SequencePrefix": "OUT", "SequenceName": "Inventory.IKT.Delivery",
"Barcode": "WHOUT", "Barcode": "WHOUT",
"SourceLocationId": null, "SourceLocationId": "d92a4c2e-1ca2-4453-a66c-e7b3bf682716",
"DestinationLocationId": null, "DestinationLocationId": "0178f19c-5f8c-5506-8d36-4fa5a4688124",
"IsActive": true "IsActive": true
}, },
{ {
@ -58,7 +58,7 @@
"WarehouseId": "1840580a-7984-cb0a-4008-3a2431f55623", "WarehouseId": "1840580a-7984-cb0a-4008-3a2431f55623",
"Name": "Manufacturing", "Name": "Manufacturing",
"OperationKind": "Manufacturing", "OperationKind": "Manufacturing",
"SequencePrefix": "MO", "SequenceName": "Inventory.IKT.Manufacturing",
"Barcode": "WHMANUF", "Barcode": "WHMANUF",
"SourceLocationId": null, "SourceLocationId": null,
"DestinationLocationId": null, "DestinationLocationId": null,
@ -70,10 +70,10 @@
"WarehouseId": "1840580a-7984-cb0a-4008-3a2431f55623", "WarehouseId": "1840580a-7984-cb0a-4008-3a2431f55623",
"Name": "Bakım Sarf Tüketimi", "Name": "Bakım Sarf Tüketimi",
"OperationKind": "InternalTransfer", "OperationKind": "InternalTransfer",
"SequencePrefix": "BKM/SARF", "SequenceName": "Inventory.IKT.MaintenanceConsumption",
"Barcode": null, "Barcode": null,
"SourceLocationId": null, "SourceLocationId": "d92a4c2e-1ca2-4453-a66c-e7b3bf682716",
"DestinationLocationId": null, "DestinationLocationId": "d92a4c2e-1ca2-4453-a66c-e7b3bf682716",
"IsActive": true "IsActive": true
}, },
{ {
@ -82,10 +82,10 @@
"WarehouseId": "1840580a-7984-cb0a-4008-3a2431f55623", "WarehouseId": "1840580a-7984-cb0a-4008-3a2431f55623",
"Name": "Departman Sarf Çıkışı", "Name": "Departman Sarf Çıkışı",
"OperationKind": "InternalTransfer", "OperationKind": "InternalTransfer",
"SequencePrefix": "SARF", "SequenceName": "Inventory.IKT.DepartmentConsumption",
"Barcode": null, "Barcode": null,
"SourceLocationId": null, "SourceLocationId": "d92a4c2e-1ca2-4453-a66c-e7b3bf682716",
"DestinationLocationId": null, "DestinationLocationId": "d92a4c2e-1ca2-4453-a66c-e7b3bf682716",
"IsActive": true "IsActive": true
}, },
{ {
@ -94,7 +94,7 @@
"WarehouseId": "1840580a-7984-cb0a-4008-3a2431f55623", "WarehouseId": "1840580a-7984-cb0a-4008-3a2431f55623",
"Name": "Onarımlar", "Name": "Onarımlar",
"OperationKind": "Repair", "OperationKind": "Repair",
"SequencePrefix": "RO", "SequenceName": "Inventory.IKT.Repair",
"Barcode": "WHRO", "Barcode": "WHRO",
"SourceLocationId": null, "SourceLocationId": null,
"DestinationLocationId": null, "DestinationLocationId": null,

File diff suppressed because it is too large Load diff

View file

@ -3003,6 +3003,111 @@
"IsDisabled": false, "IsDisabled": false,
"ElementId": null, "ElementId": null,
"ModuleId": "Prc" "ModuleId": "Prc"
},
{
"Id": "ad4c8104-9ef7-577e-9503-181da8ecdc19",
"Code": "App.Inventory.Operations",
"DisplayName": "App.Inventory.Operations",
"Order": 2,
"Url": null,
"Icon": "FcServices",
"ParentCode": "App.Inventory",
"RequiredPermissionName": null,
"CssClass": null,
"Target": null,
"IsDisabled": false,
"ElementId": null,
"ModuleId": "Inventory"
},
{
"Id": "72530fd8-2650-5340-90ff-b43f6fd6ef25",
"Code": "App.Inventory.Receipt",
"DisplayName": "App.Inventory.Receipt",
"Order": 1,
"Url": "/admin/list/App.Inventory.Receipt",
"Icon": "FcDownload",
"ParentCode": "App.Inventory.Operations",
"RequiredPermissionName": "App.Inventory.Receipt",
"CssClass": null,
"Target": null,
"IsDisabled": false,
"ElementId": null,
"ModuleId": "Inventory"
},
{
"Id": "a8be6e29-05b1-5650-a25b-b5e579a0580d",
"Code": "App.Inventory.Delivery",
"DisplayName": "App.Inventory.Delivery",
"Order": 2,
"Url": "/admin/list/App.Inventory.Delivery",
"Icon": "FcShipped",
"ParentCode": "App.Inventory.Operations",
"RequiredPermissionName": "App.Inventory.Delivery",
"CssClass": null,
"Target": null,
"IsDisabled": false,
"ElementId": null,
"ModuleId": "Inventory"
},
{
"Id": "ec18340e-1fbf-5d43-a687-e82b2217b56f",
"Code": "App.Inventory.InternalTransfer",
"DisplayName": "App.Inventory.InternalTransfer",
"Order": 3,
"Url": "/admin/list/App.Inventory.InternalTransfer",
"Icon": "FcRefresh",
"ParentCode": "App.Inventory.Operations",
"RequiredPermissionName": "App.Inventory.InternalTransfer",
"CssClass": null,
"Target": null,
"IsDisabled": false,
"ElementId": null,
"ModuleId": "Inventory"
},
{
"Id": "390ba930-f9f7-5671-b948-a743bed516a2",
"Code": "App.Inventory.Transfer",
"DisplayName": "App.Inventory.Transfer",
"Order": 4,
"Url": "/admin/list/App.Inventory.Transfer",
"Icon": "FcList",
"ParentCode": "App.Inventory",
"RequiredPermissionName": "App.Inventory.Transfer",
"CssClass": null,
"Target": null,
"IsDisabled": false,
"ElementId": null,
"ModuleId": "Inventory"
},
{
"Id": "c4205d76-2712-5707-aba8-997a8678a345",
"Code": "App.Inventory.Stock",
"DisplayName": "App.Inventory.Stock",
"Order": 3,
"Url": "/admin/list/App.Inventory.Stock",
"Icon": "FcDatabase",
"ParentCode": "App.Inventory",
"RequiredPermissionName": "App.Inventory.Stock",
"CssClass": null,
"Target": null,
"IsDisabled": false,
"ElementId": null,
"ModuleId": "Inventory"
},
{
"Id": "c33befb4-0ced-566c-8eef-3597e790799c",
"Code": "App.Inventory.StockMove",
"DisplayName": "App.Inventory.StockMove",
"Order": 5,
"Url": "/admin/list/App.Inventory.StockMove",
"Icon": "FcTimeline",
"ParentCode": "App.Inventory",
"RequiredPermissionName": "App.Inventory.StockMove",
"CssClass": null,
"Target": null,
"IsDisabled": false,
"ElementId": null,
"ModuleId": "Inventory"
} }
] ]
} }

View file

@ -51,6 +51,14 @@
"Status": "active", "Status": "active",
"Description": "Aday kişisel verilerinin işe alım sürecinde işlenmesi için aydınlatma ve açık rıza formu (App.Hr.Candidate)", "Description": "Aday kişisel verilerinin işe alım sürecinde işlenmesi için aydınlatma ve açık rıza formu (App.Hr.Candidate)",
"HtmlContent": "<div style=\"width:100%;padding:16mm 20mm;box-sizing:border-box;font-family:Calibri,'Segoe UI',Arial,sans-serif;font-size:10.5pt;line-height:1.5;color:#111827;\"><h2 style=\"text-align:center;font-size:15pt;margin:0 0 2mm 0;\">ÇALIŞAN ADAYI KİŞİSEL VERİLERİNİN İŞLENMESİNE İLİŞKİN</h2><h3 style=\"text-align:center;font-size:12.5pt;margin:0 0 8mm 0;font-weight:normal;\">AYDINLATMA METNİ VE AÇIK RIZA BEYANI</h3><p><b>1. Veri Sorumlusu:</b> 6698 sayılı Kişisel Verilerin Korunması Kanunu (\"KVKK\") uyarınca kişisel verileriniz, veri sorumlusu sıfatıyla Şirketimiz tarafından aşağıda açıklanan kapsamda işlenecektir.</p><p><b>2. İşlenen Kişisel Veriler:</b> Kimlik (ad, soyad, doğum tarihi, cinsiyet), iletişim (e-posta, telefon, adres), özgeçmiş ve mesleki deneyim, eğitim bilgileri, mülakat değerlendirme notları, ücret beklentisi ve başvuru sürecinde tarafımızla paylaştığınız diğer bilgiler.</p><p><b>3. İşleme Amaçları:</b> Açık pozisyonlara uygunluğunuzun değerlendirilmesi, mülakat süreçlerinin planlanması ve yürütülmesi, referans kontrolü, iş teklifinin hazırlanması ve işe alım kararı verilmesi halinde işe giriş işlemlerinin başlatılması.</p><p><b>4. Aktarım:</b> Kişisel verileriniz yalnızca yukarıdaki amaçlarla sınırlı olarak; yetkili kamu kurum ve kuruluşlarına, hukuki yükümlülüklerin yerine getirilmesi kapsamında ve hizmet aldığımız iş ortaklarına KVKK'nın 8. ve 9. maddelerine uygun olarak aktarılabilecektir.</p><p><b>5. Toplama Yöntemi ve Hukuki Sebep:</b> Verileriniz başvuru formu, özgeçmiş, e-posta, kariyer siteleri ve mülakatlar aracılığıyla; KVKK m.5/2 kapsamındaki hukuki sebeplere ve bu formla vereceğiniz açık rızaya dayanılarak toplanmaktadır.</p><p><b>6. Haklarınız:</b> KVKK'nın 11. maddesi uyarınca verilerinizin işlenip işlenmediğini öğrenme, bilgi talep etme, düzeltilmesini, silinmesini ya da yok edilmesini isteme ve işlemeye itiraz etme haklarına sahipsiniz. Başvurularınızı yazılı olarak Şirketimize iletebilirsiniz.</p><div style=\"margin-top:8mm;padding:5mm;border:1px solid #9ca3af;border-radius:3px;\"><p style=\"margin-top:0;\"><b>AÇIK RIZA BEYANI</b></p><p>Yukarıdaki aydınlatma metnini okudum ve anladım. Kişisel verilerimin işe alım süreci kapsamında belirtilen amaçlarla işlenmesine ve saklanmasına özgür irademle <b>açık rıza veriyorum</b>.</p><table style=\"width:100%;border-collapse:collapse;margin-top:4mm;\"><tr><td style=\"width:30%;padding:4px 0;\">Adı Soyadı</td><td>: <b>{{FirstName}} {{LastName}}</b></td></tr><tr><td style=\"padding:4px 0;\">E-posta</td><td>: {{Email}}</td></tr><tr><td style=\"padding:4px 0;\">Telefon</td><td>: {{PhoneNumber}}</td></tr><tr><td style=\"padding:4px 0;\">Rıza Tarihi</td><td>: {{KvkkConsentDate}}</td></tr><tr><td style=\"padding:4px 0;\">Rıza Yöntemi</td><td>: {{KvkkConsentMethod}}</td></tr><tr><td style=\"padding:14px 0 4px 0;\">İmza</td><td style=\"padding-top:14px;\">: ..............................................</td></tr></table></div><p style=\"margin-top:8mm;font-size:8.5pt;color:#6b7280;text-align:center;\">Bu belge @@date tarihinde oluşturulmuştur.</p></div>" "HtmlContent": "<div style=\"width:100%;padding:16mm 20mm;box-sizing:border-box;font-family:Calibri,'Segoe UI',Arial,sans-serif;font-size:10.5pt;line-height:1.5;color:#111827;\"><h2 style=\"text-align:center;font-size:15pt;margin:0 0 2mm 0;\">ÇALIŞAN ADAYI KİŞİSEL VERİLERİNİN İŞLENMESİNE İLİŞKİN</h2><h3 style=\"text-align:center;font-size:12.5pt;margin:0 0 8mm 0;font-weight:normal;\">AYDINLATMA METNİ VE AÇIK RIZA BEYANI</h3><p><b>1. Veri Sorumlusu:</b> 6698 sayılı Kişisel Verilerin Korunması Kanunu (\"KVKK\") uyarınca kişisel verileriniz, veri sorumlusu sıfatıyla Şirketimiz tarafından aşağıda açıklanan kapsamda işlenecektir.</p><p><b>2. İşlenen Kişisel Veriler:</b> Kimlik (ad, soyad, doğum tarihi, cinsiyet), iletişim (e-posta, telefon, adres), özgeçmiş ve mesleki deneyim, eğitim bilgileri, mülakat değerlendirme notları, ücret beklentisi ve başvuru sürecinde tarafımızla paylaştığınız diğer bilgiler.</p><p><b>3. İşleme Amaçları:</b> Açık pozisyonlara uygunluğunuzun değerlendirilmesi, mülakat süreçlerinin planlanması ve yürütülmesi, referans kontrolü, iş teklifinin hazırlanması ve işe alım kararı verilmesi halinde işe giriş işlemlerinin başlatılması.</p><p><b>4. Aktarım:</b> Kişisel verileriniz yalnızca yukarıdaki amaçlarla sınırlı olarak; yetkili kamu kurum ve kuruluşlarına, hukuki yükümlülüklerin yerine getirilmesi kapsamında ve hizmet aldığımız iş ortaklarına KVKK'nın 8. ve 9. maddelerine uygun olarak aktarılabilecektir.</p><p><b>5. Toplama Yöntemi ve Hukuki Sebep:</b> Verileriniz başvuru formu, özgeçmiş, e-posta, kariyer siteleri ve mülakatlar aracılığıyla; KVKK m.5/2 kapsamındaki hukuki sebeplere ve bu formla vereceğiniz açık rızaya dayanılarak toplanmaktadır.</p><p><b>6. Haklarınız:</b> KVKK'nın 11. maddesi uyarınca verilerinizin işlenip işlenmediğini öğrenme, bilgi talep etme, düzeltilmesini, silinmesini ya da yok edilmesini isteme ve işlemeye itiraz etme haklarına sahipsiniz. Başvurularınızı yazılı olarak Şirketimize iletebilirsiniz.</p><div style=\"margin-top:8mm;padding:5mm;border:1px solid #9ca3af;border-radius:3px;\"><p style=\"margin-top:0;\"><b>AÇIK RIZA BEYANI</b></p><p>Yukarıdaki aydınlatma metnini okudum ve anladım. Kişisel verilerimin işe alım süreci kapsamında belirtilen amaçlarla işlenmesine ve saklanmasına özgür irademle <b>açık rıza veriyorum</b>.</p><table style=\"width:100%;border-collapse:collapse;margin-top:4mm;\"><tr><td style=\"width:30%;padding:4px 0;\">Adı Soyadı</td><td>: <b>{{FirstName}} {{LastName}}</b></td></tr><tr><td style=\"padding:4px 0;\">E-posta</td><td>: {{Email}}</td></tr><tr><td style=\"padding:4px 0;\">Telefon</td><td>: {{PhoneNumber}}</td></tr><tr><td style=\"padding:4px 0;\">Rıza Tarihi</td><td>: {{KvkkConsentDate}}</td></tr><tr><td style=\"padding:4px 0;\">Rıza Yöntemi</td><td>: {{KvkkConsentMethod}}</td></tr><tr><td style=\"padding:14px 0 4px 0;\">İmza</td><td style=\"padding-top:14px;\">: ..............................................</td></tr></table></div><p style=\"margin-top:8mm;font-size:8.5pt;color:#6b7280;text-align:center;\">Bu belge @@date tarihinde oluşturulmuştur.</p></div>"
},
{
"Id": "f1b66538-1db6-5a7d-8178-32c53bc135ff",
"Name": "Transfer Fişi",
"CategoryId": "c872e32b-e598-5432-a938-5826ffeb0d79",
"Status": "active",
"Description": "Alım, teslimat ve iç transfer belgesinin fişi (App.Inventory.Receipt / Delivery / InternalTransfer)",
"HtmlContent": "<div style=\"width:100%;padding:16mm 18mm;box-sizing:border-box;font-family:Calibri,'Segoe UI',Arial,sans-serif;font-size:11pt;line-height:1.5;color:#1f2937;\"><table style=\"width:100%;border-collapse:collapse;margin-bottom:8mm;\"><tr><td style=\"font-size:20pt;font-weight:bold;color:#0f3d6e;\">TRANSFER FİŞİ</td><td style=\"text-align:right;font-size:10pt;color:#4b5563;\">Referans: <b>{{TransferNo}}</b><br/>Durum: {{Status}}</td></tr></table><table style=\"width:100%;border-collapse:collapse;margin-bottom:6mm;font-size:10.5pt;\"><tr><td style=\"padding:5px 8px;background:#f1f5f9;border:1px solid #cbd5e1;font-weight:bold;width:20%;\">Operasyon Türü</td><td style=\"padding:5px 8px;border:1px solid #cbd5e1;\">{{OperationTypeId}}</td><td style=\"padding:5px 8px;background:#f1f5f9;border:1px solid #cbd5e1;font-weight:bold;width:20%;\">Kontak</td><td style=\"padding:5px 8px;border:1px solid #cbd5e1;\">{{PartnerId}}</td></tr><tr><td style=\"padding:5px 8px;background:#f1f5f9;border:1px solid #cbd5e1;font-weight:bold;width:20%;\">Şube / Depo</td><td style=\"padding:5px 8px;border:1px solid #cbd5e1;\">{{BranchId}} / {{WarehouseId}}</td><td style=\"padding:5px 8px;background:#f1f5f9;border:1px solid #cbd5e1;font-weight:bold;width:20%;\">Kaynak Belge</td><td style=\"padding:5px 8px;border:1px solid #cbd5e1;\">{{SourceDocument}}</td></tr><tr><td style=\"padding:5px 8px;background:#f1f5f9;border:1px solid #cbd5e1;font-weight:bold;width:20%;\">Kaynak Konum</td><td style=\"padding:5px 8px;border:1px solid #cbd5e1;\">{{SourceLocationId}}</td><td style=\"padding:5px 8px;background:#f1f5f9;border:1px solid #cbd5e1;font-weight:bold;width:20%;\">Hedef Konum</td><td style=\"padding:5px 8px;border:1px solid #cbd5e1;\">{{DestinationLocationId}}</td></tr><tr><td style=\"padding:5px 8px;background:#f1f5f9;border:1px solid #cbd5e1;font-weight:bold;width:20%;\">Planlanan Tarih</td><td style=\"padding:5px 8px;border:1px solid #cbd5e1;\">{{ScheduledDate}}</td><td style=\"padding:5px 8px;background:#f1f5f9;border:1px solid #cbd5e1;font-weight:bold;width:20%;\">Geçerlilik Tarihi</td><td style=\"padding:5px 8px;border:1px solid #cbd5e1;\">{{EffectiveDate}}</td></tr></table><div style=\"font-weight:bold;color:#0f3d6e;margin-bottom:2mm;\">Ürünler (ürün: talep / yapılan birim · lot)</div><div style=\"white-space:pre-line;padding:8px 10px;border:1px solid #cbd5e1;min-height:40mm;font-size:10.5pt;\">{{LineSummary}}</div><table style=\"width:100%;border-collapse:collapse;margin-top:18mm;font-size:10pt;\"><tr><td style=\"width:50%;text-align:center;\">Teslim Eden<br/><br/>..............................</td><td style=\"width:50%;text-align:center;\">Teslim Alan<br/><br/>..............................</td></tr></table></div>"
} }
] ]
} }

View file

@ -7,7 +7,7 @@
### 1. Amaç ve kapsam ### 1. Amaç ve kapsam
Envanterin ana verisi: ürün kartı (satış/masraf/satınalma bayrakları, mal/hizmet, envanter takibi ve yöntemi, nitelik–varyant, tedarikçi fiyatları, stok ve muhasebe bilgileri), ölçü birimine bağlı reçeteler (bileşen + operasyon; ürün ya da varyant bazında), çok seviyeli reçete patlatma raporu ve fiziksel stok yapısı: şubeye bağlı depolar, depolarda iç içe konumlar, şube/depo bazında operasyon türleri. İş merkezleri ve operasyonlar Üretim modülündedir ([App.Production.md](App.Production.md)). Kullanıcılar: stok, satınalma ve üretim planlama ekipleri. Stok hareketi, sipariş ve üretim emri bu dalın kapsamı dışındadır. Envanterin ana verisi: ürün kartı (satış/masraf/satınalma bayrakları, mal/hizmet, envanter takibi ve yöntemi, nitelik–varyant, tedarikçi fiyatları, stok ve muhasebe bilgileri), ölçü birimine bağlı reçeteler (bileşen + operasyon; ürün ya da varyant bazında), çok seviyeli reçete patlatma raporu ve fiziksel stok yapısı: şubeye bağlı depolar, depolarda iç içe konumlar, şube/depo bazında operasyon türleri. İş merkezleri ve operasyonlar Üretim modülündedir ([App.Production.md](App.Production.md)). Kullanıcılar: stok, satınalma ve üretim planlama ekipleri. Stok hareketleri Operasyonlar, stok ve hareket listeleri doğrudan Envanter altındaki Stok ve Hareketler ekranlarıdır; sipariş ve üretim emri bu dalın kapsamı dışındadır.
### 2. Analiz ve kararlar ### 2. Analiz ve kararlar
@ -62,7 +62,7 @@ Tüm tablolar kiracı + tam audit + soft delete, anahtar `Id uniqueidentifier`.
| `Inv_T_Bom` / `Inv_T_BomComponent` / `Inv_T_BomOperation` | Reçete başlığı (ürün, varyant, miktar, birim, planlama), bileşenler (operasyona bağlanabilir), operasyonlar (iş merkezi `Prd_T_WorkCenter`, operasyon `Prd_T_Operation`, süre) | | `Inv_T_Bom` / `Inv_T_BomComponent` / `Inv_T_BomOperation` | Reçete başlığı (ürün, varyant, miktar, birim, planlama), bileşenler (operasyona bağlanabilir), operasyonlar (iş merkezi `Prd_T_WorkCenter`, operasyon `Prd_T_Operation`, süre) |
| `Inv_T_Warehouse` | Şube, kod (kiracı içinde tekil, 16), ad, aktif | | `Inv_T_Warehouse` | Şube, kod (kiracı içinde tekil, 16), ad, aktif |
| `Inv_T_Location` | Şube, depo, üst konum, kod (32), ad, konum türü (`Internal`/`External`), departman (`Hr_T_Department`), depo sorumlusu, aktif | | `Inv_T_Location` | Şube, depo, üst konum, kod (32), ad, konum türü (`Internal`/`External`), departman (`Hr_T_Department`), depo sorumlusu, aktif |
| `Inv_T_OperationType` | Şube, depo, ad, tür (`Receipt`/`Delivery`/`InternalTransfer`/`Manufacturing`/`Repair`), sıra öneki, barkod, kaynak ve hedef konum, aktif | | `Inv_T_OperationType` | Şube, depo, ad, tür (`Receipt`/`Delivery`/`InternalTransfer`/`Manufacturing`/`Repair`), numaratör (`SequenceName` → `Adm_T_Sequence.Name`; belge numarası buradan), barkod, kaynak ve hedef konum, aktif |
### 5. İş kuralları ve hesaplar ### 5. İş kuralları ve hesaplar
@ -82,7 +82,7 @@ Tüm tablolar kiracı + tam audit + soft delete, anahtar `Id uniqueidentifier`.
### 7. Entegrasyonlar ### 7. Entegrasyonlar
Dış entegrasyon yok. Reçete operasyonları iş merkezi ve operasyonu Üretim modülünden okur; Üretim de ürün ve nitelik değerlerini buradan okur. Ölçü Birimleri, Kontaklar, Para Birimleri, Ülkeler, Şubeler, Departmanlar ve Kullanıcılar yalnız lookup kaynağıdır. Satış ve satınalma sipariş ekranları ürünü `CanBeSold` / `CanBePurchased` ile süzecek; stok hareket belgeleri operasyon türünü ve konumları bu daldan seçecek; bu dalda sipariş ve hareket ekranı yoktur. Dış entegrasyon yok. Reçete operasyonları iş merkezi ve operasyonu Üretim modülünden okur; Üretim de ürün ve nitelik değerlerini buradan okur. Ölçü Birimleri, Kontaklar, Para Birimleri, Ülkeler, Şubeler, Departmanlar ve Kullanıcılar yalnız lookup kaynağıdır. Satış ve satınalma sipariş ekranları ürünü `CanBeSold` / `CanBePurchased` ile süzecek; stok hareket belgeleri (Operasyonlar dalı) operasyon türünü, numaratörünü ve konumları bu daldan alır; ürünün Envanter Takibi ve Takip Yöntemi hareketin stoğa ve lota nasıl işleneceğini belirler.
### 8. Akış örneği ### 8. Akış örneği
@ -94,7 +94,7 @@ Dış entegrasyon yok. Reçete operasyonları iş merkezi ve operasyonu Üretim
6. Genel Bakış sekmesi ağacı ve maliyetleri gösterir. 6. Genel Bakış sekmesi ağacı ve maliyetleri gösterir.
7. Depolar'da "Grup Şirketler" (GRP) deposunu şubeye bağla. 7. Depolar'da "Grup Şirketler" (GRP) deposunu şubeye bağla.
8. Konumlar'da GRP için "Stock" kök konumunu, altına "ALDORA MOBİLYA G/Ç" (kod GRP ALD, departman, sorumlu), onun altına "ANA DEPO AB07" konumunu İç türüyle gir; ağaç üç seviye gösterir. 8. Konumlar'da GRP için "Stock" kök konumunu, altına "ALDORA MOBİLYA G/Ç" (kod GRP ALD, departman, sorumlu), onun altına "ANA DEPO AB07" konumunu İç türüyle gir; ağaç üç seviye gösterir.
9. Operasyon Türleri'nde GRP için "Alımlar" (tür Alım, sıra öneki GRP/IN/, hedef konum Stock) tanımla. 9. Operasyon Türleri'nde GRP için "Alımlar" (tür Alım, numaratör GRP/IN/ önekli, kaynak konum dış "Tedarikçiler", hedef konum Stock) tanımla.
### 9. Sık sorulanlar ### 9. Sık sorulanlar
@ -115,6 +115,161 @@ Dış entegrasyon yok. Reçete operasyonları iş merkezi ve operasyonu Üretim
- **Sorgu bağımlılığı:** Sorgular SQL Server'a özgüdür (`STRING_SPLIT`, `CONCAT_WS`, `STRING_AGG`, `CROSS APPLY`). - **Sorgu bağımlılığı:** Sorgular SQL Server'a özgüdür (`STRING_SPLIT`, `CONCAT_WS`, `STRING_AGG`, `CROSS APPLY`).
- **Açık nokta:** Eski ürün ekranlarının form varsayılanları (Aktif = true, Birim = Adet, Miktar = 1, Süre = 60, Kur = TRY) düz wizard biçimiyle dosyaya yazılmadı. ListForm düzenleyicisinden ya da `ListForm` bölümlü yeniden deploy ile eklenmelidir. - **Açık nokta:** Eski ürün ekranlarının form varsayılanları (Aktif = true, Birim = Adet, Miktar = 1, Süre = 60, Kur = TRY) düz wizard biçimiyle dosyaya yazılmadı. ListForm düzenleyicisinden ya da `ListForm` bölümlü yeniden deploy ile eklenmelidir.
<!-- module-doc:section App.Inventory.Operations -->
## Operasyonlar (`App.Inventory.Operations`)
### 1. Amaç ve kapsam
Depoya giren, depodan çıkan ve depo içinde taşınan malların belgeleri: Alımlar, Teslimatlar, İç Transferler; hepsinin belgeleri Envanter › Hareketler'de, ürün satırları Envanter › Ürün Hareketleri'nde salt okunur listelenir. Belgeler Tanımlamalar dalındaki Depolar, Konumlar ve Operasyon Türleri'ni kullanır; tamamlanan belge stoğu şube › depo › konum › ürün › lot bazında günceller (Envanter › Stok). Kullanıcılar: depo, satınalma ve sevkiyat ekipleri. Üretim (`Manufacturing`) ve Onarım türleri Üretim menüsünde ayrıca yapılacaktır; Toplu Transfer, Bakım Talebi, Ekipman, Satış Siparişi ve İzlenebilirlik raporu kapsam dışıdır.
### 2. Analiz ve kararlar
Onaylanan analiz (talep "Envanter giriş ve çıkışları"):
- Bütün operasyon türleri tek veri kaynağındadır: başlık `Inv_T_Transfer`, satır `Inv_T_TransferLine`, lot dağılımı `Inv_T_TransferLineLot`; tür `OperationKind` kolonuyla ayrılır. Her tür kendi ekranında (aynı tablo, `DefaultFilter` ile) yönetilir.
- Stok bakiyesi ayrı tablodadır (`Inv_T_Stock`, kullanıcı kararı): yalnız Tamamla yordamı yazar.
- Stok yetmezse belge Bekleyen kalır, Tamamla yapılamaz (negatif stok yok). Rezervasyon yoktur; Tamamla stoğu yeniden kontrol eder.
- Kısmi işlemde kalan, aynı türde yeni belgeye (backorder) geçer.
- Ek kapsam: İade, iç transferde kaynak depo onayı ve teslim, malzeme talebinden iç transfer, transfer fişi yazdırma.
- Belge numarası operasyon türünün numaratöründen gelir: `Inv_T_OperationType.SequencePrefix` kaldırıldı, yerine `SequenceName` (Diziler) geldi; demo operasyon türleri için `Inventory.IKT.*` numaratörleri eklendi.
- Lot/seri bu turdadır: hareket satırında Detaylar butonu lot dağılımını açar; çıkışta lot stoktan gelir, girişte yazılır; Lot/Seri Oluştur ve Otomatik Ata yardımcı butonlardır.
- Giriş ve çıkışın lot ekranı ayrıdır (kullanıcı kararı): stoğa giren satır (alım, teslimat iadesi) **Lot/Seri Numaraları**'nı açar, numara serbest yazılır; stoktan çıkan satır (teslimat, iç transfer, alım iadesi) **Stoktan Lot Seçimi**'ni açar: kaynak konumdaki bütün lotlar eldeki miktarıyla listelenir, Seç işaretlenince Seçilen Miktar eldeki miktarla dolar (EditorScript), azaltılabilir ama eldeki miktarı aşamaz; Değişiklikleri Kaydet ile yazılır (kullanıcı kararı: 100 lotu tek tek yazmak yerine işaretleyerek seçmek). Ayrım belgenin kaynak konumundan gelir (iç konum = stoktan) ve satırın `LotFromStock` kolonunda durur; Lot/Seri Oluştur yalnız giren, Otomatik Ata yalnız çıkan satırda görünür.
- Lot/seri takipli satırda lot girilmişse yapılan miktar lot toplamıdır (kullanıcı kararı: lot seçmek o kadar teslim etmektir); Recalc miktarı lotlardan yazar ve seçilen lotları satırın Lotlar kolonunda (Açıklama'nın sağı) listeler. Tamamlanmış/iptal belgenin miktarına dokunulmaz. Tamamla'nın eşitlik hatası iki miktarı da yazar.
- Ek Bilgi: nakliye bilgileri, sorumlu, proje; ayrı Not sekmesi. Ürün Teslimat Politikası yalnız Teslimatlar'dadır.
- Ürünün Envanter Takibi ve Takip Yöntemi belirleyicidir: takip kapalı ürün stoğa hiç işlenmez ve stok kontrolüne girmez; `Lot`/`Serial` üründe lot dağılımı zorunludur; `Quantity` üründe lot boş tutulur.
Üretimde verilen ek kararlar:
- Stok konum türüne göre işlenir: kaynak konum `Internal` ise stoktan düşer, hedef konum `Internal` ise stoğa eklenir. Tedarikçiler/Müşteriler gibi dış (`External`) konumlar stok tutmaz; alım türünün kaynağı ve teslimat türünün hedefi dış konumdur. Demo veride IKT deposuna "Tedarikçiler" ve "Müşteriler" dış konumları eklendi.
- Formda gösterilmeyen konum (alımın kaynağı, teslimatın hedefi) kayıtta her zaman operasyon türünden yazılır (iade belgesi hariç).
- İç transfer onaycısı kaynak konumun depo sorumlusudur (`Inv_T_Location.ResponsibleUserName`, kullanıcı adı — iş akışı onaycıyı adla eşlediği için Guid tutulmaz (kullanıcı kararı); kayıt sonrası `SourceApproverUserNames`'e kullanıcı adı yazılır). Sorumlu yoksa `ApprovalStatus` "Onay Gerekmez" olur ve akış beklenmez. Ekranda belge durumu (`Status`) ile onay durumu (`ApprovalStatus`) birlikte bulunur: tablo bütün türler için ortak olduğundan durum akış düğümü değil belge yaşam döngüsüdür (standing default 24'ten bilinçli sapma).
- Teslim Alan / Teslim Alma Tarihi iç transferin Tamamla işleminde yazılır (Tamamla'ya basan kullanıcı).
- Birim çevrimi `Inv_F_UomConvert` ile (Adm_T_Uom Type + Ratio, aynı kategori); stok ürünün biriminde, lot miktarı satırın biriminde tutulur.
- Transfer Fişi rapor şablonu (Raporlar kategorisi) satırları belgenin `LineSummary` kolonundan basar: DynamicReport yalnız kaydın alanlarını yer tutucu olarak doldurduğu için satır özeti başlıkta tutulur (`Inv_P_TransferRecalc`).
- Durum butonları satınalmadaki kalıpla çalışır: işlem gizli `PendingAction` alanına yazılır, kayıt sonrası yordam çalıştırır. Başlık kancaları `@PendingAction` kullanmaz; iş akışı güncellemesi yalnız akış alanlarını gönderir.
- Talepten Aktar ve Detaylar satınalmanın `PurchaseDocGrid` diyaloğunu kullanır (ekran `BaseId` ile süzülür; yeni lot satırına `BaseId` filtreden yazılır, `InsertCommand` tabloya yazar).
- Hata kodları 50301–50321.
### 3. Menü ve ekranlar
`Envanter (App.Inventory) › Operasyonlar (App.Inventory.Operations)`: Alımlar, Teslimatlar, İç Transferler. Bütün belgelerin listesi Hareketler (`App.Inventory.Transfer`) Operasyonlar dışında, doğrudan Envanter altındadır (Stok ve Hareketler bölümü).
Sekmeler (menüsüz alt formlar, üç belge ekranında ortak): Operasyonlar (`App.Inventory.TransferLine`), Ek Bilgi (`App.Inventory.TransferOther`, aynı satır), Not (`App.Inventory.TransferNote`, aynı satır); yalnız İç Transferler'de Onay ve Teslim (`App.Inventory.TransferApproval`, aynı satır, salt okunur).
Diyaloglar: Lot/Seri Numaraları (`App.Inventory.TransferLineLot`, giren satırın Detaylar'ı), Stoktan Lot Seçimi (`App.Inventory.TransferLineLotStock`, çıkan satırın Detaylar'ı), Transfer Talep Kalemleri (`App.Inventory.TransferImportItem`, İç Transferler › Talepten Aktar).
Durum butonları satırdadır ve belgenin durumuna göre görünür (araç çubuğu butonu kayda göre gizlenemez): Hazırla (Taslak; iç transferde onay tamamlanmışsa — ve Bekleyen), Tamamla (Hazır), İptal Et (Taslak, Bekleyen, Hazır), İade Et (Tamamlandı), Yazdır (her durumda); İç Transferler'de ayrıca Talepten Aktar (Taslak) ve iş akışı butonları. Buton adları durum adlarıyla eşleşir: Hazırla › Hazır, Tamamla › Tamamlandı, İptal Et › İptal. Satır butonları (yalnız ürünün takip yöntemi Lot ya da Seri olan satırda görünür): Lot/Seri Oluştur, Otomatik Ata, Detaylar; görünürlük satırın `TrackingMethod` kolonundan okunur. Hareketler'de (`App.Inventory.Transfer`) satırda Detay (salt okunur başlık + Operasyonlar sekmesi), Not ve belgeyi kendi ekranında açan Aç vardır; Ürün Hareketleri'nde de Aç hareketin belgesini açar (`/admin/form/App.Inventory.{Receipt|Delivery|InternalTransfer}/@TransferId`).
### 4. Veri modeli
Tüm tablolar kiracı + tam audit + soft delete, anahtar `Id uniqueidentifier`.
| Tablo / nesne | İçerik |
| --- | --- |
| `Inv_T_Transfer` | TransferNo, BranchId, WarehouseId, OperationTypeId, OperationKind, PartnerId (Kontak), Source/DestinationLocationId, ScheduledDate, EffectiveDate, SourceDocument, PurchaseOrderId, BackorderOfId, ReturnOfId, CarrierId, TrackingReference, Weight (hesap), ShippingWeight, ResponsibleUserId, ProjectId, DeliveryPolicy (`Direct`/`OneTime`, yalnız teslimat), Note, LineSummary (fiş özeti), Status (`Draft`/`Waiting`/`Ready`/`Done`/`Cancelled`), PendingAction, SourceApproverUserNames, iş akışı dörtlüsü, ReceivedByUserId, ReceivedDate |
| `Inv_T_TransferLine` | TransferId (FK cascade), ProductId, Description, DemandQuantity (talep), Quantity (yapılan), UomId, PurchaseOrderLineId, MaterialRequestItemId, PendingAction, TrackingMethod (üründen; envanter takibi kapalıysa boş — Recalc yazar), LotFromStock (kaynak iç konumsa 1 — Recalc yazar), LotNumbers (seçilen lotlar; Lotlar kolonu — Recalc yazar) |
| `Inv_T_TransferLineLot` | TransferLineId (FK cascade), LotNo, Quantity (satırın biriminde) |
| `Inv_T_Stock` | BranchId, WarehouseId, LocationId, ProductId, LotNo (takipsiz üründe boş), Quantity (ürün biriminde), UomId, InDate (FIFO), LastMoveDate; tekil (TenantId, LocationId, ProductId, LotNo) |
| `Inv_V_TransferLineLot` | Lot/Seri Numaraları diyaloğunun kaynağı (`BaseId` = satır) |
| `Inv_V_TransferLineLotStock` | Stoktan Lot Seçimi'nin kaynağı: satırın kaynak konumundaki lotlar (eldeki miktar satırın biriminde) + atanmış miktar; `Id` = satır:stok kaydı, kaydı `Inv_P_TransferLineLotStockSave` yapar |
| `Prc_V_MaterialRequestTransferItem` | Taslak iç transfer × aynı şubedeki transferle karşılanacak bekleyen talep kalemi (`Id` = belge\|kalem; Prc öneki migrate sırası içindir) |
| `Inv_F_UomConvert` | Birim çevrimi |
| Yordamlar | `Inv_P_Transfer{AfterSave,SetStatus,CheckAvailability,Validate,Copy,Number,Recalc,FromPurchaseOrder,ImportItem,LineAfterSave,LineLotGenerate,LineLotAssign}` |
### 5. İş kuralları ve hesaplar
- **Hazırla** (taslak, satırlı, konumları dolu; iç transferde onaylı ya da Onay Gerekmez): dış konumdan girişte yapılan miktar talep kadar dolar ve belge Hazır olur. İç konumdan çıkışta satırlar ürün bazında sırayla stoktan karşılanır; tümü karşılanırsa Hazır, değilse Bekleyen. Teslimatta "Mümkün olduğunca kısa sürede" kısmi karşılamada da Hazır yapar, "Tüm ürünler hazır olduğunda" bütün satırları bekler.
- **Hazırla** (Bekleyen): aynı hesabı yeniden yapar; stok girdiyse belge Hazır olur.
- **Tamamla** (yalnız Hazır): yapılan miktarı olan satır şarttır; lot/seri takipli üründe lot toplamı yapılan miktara eşit, seride her seri 1 adet ve tekil olmalıdır; iç kaynakta stok (ürün × lot) yetmezse durur. Stok güncellenir, belge Tamamlandı olur, Geçerlilik Tarihi yazılır. Sipariş kaleminin `ReceivedQuantity`'si ve talep kaleminin `DeliveredQuantity`'si artar (iadede azalır); talep kalemi tam karşılanınca `Done` olur. Talepten az yapılan satırların kalanı backorder belgesine geçer ve stok kontrolüyle Hazır/Bekleyen açılır.
- **İade Et** (Tamamlandı): kaynak/hedef yer değiştirmiş, yapılan miktarlar ve lotlarıyla taslak belge; iadeden backorder açılmaz.
- **İptal Et**: Tamamlandı ya da İptal dışındaki belgede. İptal edilmiş belge düzenlenemez; tamamlanmış ya da iptal edilmiş belgenin satırı ve lotu değiştirilemez. Yalnız elle açılmış taslak (siparişten, backorder ya da iadeden gelmeyen) silinebilir.
- **Lot/Seri Oluştur**: yalnız giriş satırında; lot takipte kalan miktar için `Inventory.LotNumber`'tan tek lot, seri takipte kalan her birim için `Inventory.SerialNumber`'dan seri (miktar tam sayı olmalı). **Otomatik Ata**: yalnız çıkış satırında; mevcut lotları siler, kaynak konumdaki lotları ilk giren ilk çıkar sırasıyla atar.
- **Satır**: ürün seçilince birim üründen gelir; yeni satırda talep 1, birim Adet. Ürün listesi aktif mal (`Wares`) ürünlerdir.
- **Ağırlık** = Σ ürün ağırlığı × miktar (yapılan, yoksa talep; ürün biriminde).
- **Siparişten alım**: Satınalma Siparişi onaylanınca (ya da tekliften onaylı açılınca) taslak alım açılır; ayrıntı [App.Prc.md](App.Prc.md) › Siparişler.
### 6. Yetki ve görünürlük
İzin grubu `App.Inventory`. Ekran yetkileri `App.Inventory.Operations` altında (Alımlar, Teslimatlar, İç Transferler); üç belge ekranının ortak sekmeleri (Transfer Satırları, Ek Bilgi, Not) da `App.Inventory.Operations` altındadır; Lot/Seri Numaraları Transfer Satırları'nın, Onay ve Teslim ile Transfer Talep Kalemleri İç Transferler'in altındadır. Durum butonları ekranın `.Update`, satır butonları Transfer Satırları'nın `.Update`, Detaylar Lot/Seri Numaraları'nın okuma, Talepten Aktar Transfer Talep Kalemleri'nin `.Update` yetkisini ister. Belge ekranını kullanan role sekme ve diyalog yetkileri de verilmelidir. Yetkiler hiçbir role otomatik atanmaz. Kiracı kapsamlı; şube kolonla tutulur.
### 7. Entegrasyonlar
Satınalma Siparişleri (onayda taslak alım, alınan miktar), Malzeme Talepleri (Karşılama = Transfer kalemleri, teslim edilen miktar), Envanter › Tanımlamalar (Depolar, Konumlar, Operasyon Türleri, Ürünler), Kontaklar, Proje, Kullanıcılar, Yönetim › Tanımlamalar › Diziler (operasyon türü numaratörleri, `Inventory.LotNumber`, `Inventory.SerialNumber`), Raporlar (`Transfer Fişi`).
### 8. Akış örneği
1. Satınalma'da P00012 (10 Adet sensör, lot takipli) onaylanır; Alımlar'da IKT/IN/00001 taslak açılır (Tedarikçiler › Ana Depo).
2. Hazırla: belge Hazır, yapılan 10. Satırda Lot/Seri Oluştur LOT000001 (10) üretir; Tamamla Ana Depo'ya 10 Adet LOT000001 ekler, P00012 kalemine Alınan 10 yazılır.
3. Teslimatlar'da 4 Adet sensör için belge açılır; Hazırla Hazır yapar, Otomatik Ata LOT000001 (4) atar, Tamamla stoğu 6'ya düşürür.
4. İç Transferler'de Ana Depo'dan (sorumlusu var) başka bir iç konuma 2 Adet; İş Akışı Başlat, sorumlu onaylar (belge kendiliğinden hazırlanır), lotlar seçilir, Tamamla; Onay ve Teslim sekmesinde onaylayan ve teslim alan görünür.
### 9. Sık sorulanlar
- **Belge Bekleyen'de kaldı?** Kaynak konumda yeterli stok yok; stok girdikten sonra Hazırla'ya basın. Teslimatta politika "Mümkün olduğunca kısa sürede" ise eldeki kısım gönderilir.
- **Tamamla "lot/seri miktarı eşit değil" diyor?** Ürün lot/seri takiplidir; satırdaki Detaylar'dan lot girin ya da Lot/Seri Oluştur (giriş) / Otomatik Ata (çıkış) kullanın.
- **Ürün stokta görünmüyor?** Ürünün Envanter Takibi kapalıysa hareket stoğa işlenmez.
- **"Numaratör bulunamadı"?** Operasyon türünün numaratörü Diziler'de bu kiracı için tanımlı ve aktif olmalıdır.
- **İç transfer hazırlanamıyor?** Kaynak konumun sorumlusu varsa önce İş Akışı Başlat ile onay alınmalıdır; onay verilince belge kendiliğinden hazırlanır.
- **İç transferde sıra nedir?** Satırlar › İş Akışı Başlat › Kaynak Depo Onayı › (otomatik Hazırla) › lot seçimi › Tamamla. Onay stok hareketinden önce gelir, çünkü malın kaynak depodan çıkmasına verilen izindir (kullanıcı kararı: onay sonrası Hazırla otomatik). Otomatik Hazırla şartları sağlanmazsa (satır yok, konum kuralı) belge Taslak kalır ve Hazırla elle basılır.
- **İç transfer onay istemiyor, "Onay Gerekmez" yazıyor?** Onaycı kaynak konumun Sorumlu'sudur (kullanıcı adı); Konumlar'da sorumlu girilmemişse belge onay beklemez. Seed'deki konumların sorumlusu `system@sozsoft.com`'dur. Onay akışı için konuma sorumlu atanır (yeni ve taslak belgelerde geçerli olur).
- **İç transferde dış konum ya da aynı konum seçilemiyor?** İç transfer depo içinde taşımadır: Kaynak ve Hedef Konum listeleri yalnız iç konumları gösterir, hedef kaynaktan farklı olmalıdır (formda kural, Hazırla/Tamamla'da 50325 ve 50326). İade belgesi bu kuraldan muaftır; yanlışlıkla dış konuma yapılmış eski transfer İade Et ile geri alınır.
- **Siparişten alım açılmadı?** Siparişte envanter takipli ürün kalemi olmalı; siparişin iptal olmayan bir alımı zaten varsa yenisi açılmaz.
### 10. Dosyalar ve geri alma
- **SQL (sql + postgres):** `Inv_T_{Transfer,TransferLine,TransferLineLot,Stock}`, `Inv_V_{StockMove,TransferLineLot,TransferLineLotStock}`, `Prc_V_MaterialRequestTransferItem`, `Inv_F_UomConvert`, `Inv_P_Transfer*`; değişen: `Inv_T_OperationType` (SequenceName), `Prc_T_PurchaseOrderLine` (ReceivedQuantity), `Prc_P_PurchaseOrderSetStatus`, `Prc_P_PurchaseRfqAward`.
- **Wizard'lar:** `Inventory_{Receipt,Delivery,InternalTransfer,Transfer,TransferLine,TransferLineLot,TransferLineLotStock,TransferOther,TransferNote,TransferApproval,TransferImportItem}.json`; değişen `Inventory_OperationType.json`, `Prc_PurchaseOrderLine.json`.
- **Seed verisi:** numaratörler `data/App.Definitions.Sequence.json` (`Inventory.IKT.*`, `Inventory.LotNumber`, `Inventory.SerialNumber`), dış konumlar `data/App.Inventory.Location.json`, operasyon türü bağları `data/App.Inventory.OperationType.json`, şablon `data/App.Reports.ReportTemplates.json` (Transfer Fişi).
- **Geri alma:** Wizard Manager'da önce belge ekranları, sonra sekmeler ve diyaloglar silinir; tablolar ancak açık onayla düşürülür (sıra: TransferLineLot → TransferLine → Transfer, Stock).
<!-- module-doc:section App.Inventory.Stock claims=App.Inventory.Transfer, App.Inventory.StockMove -->
## Stok, Hareketler ve Ürün Hareketleri (`App.Inventory.Stock`, `App.Inventory.Transfer`, `App.Inventory.StockMove`)
### 1. Amaç ve kapsam
Stok bakiyesi ve bütün hareketlerin salt okunur listeleri: Stok (şube › depo › konum › ürün › lot) ve Hareketler (bütün operasyon türlerinin satırları ortak kolonlarla). Kullanıcılar: depo, satınalma, üretim planlama ve yönetim. Değerleme (maliyet) ve izlenebilirlik raporu kapsam dışıdır.
### 2. Analiz ve kararlar
- Stok `Inv_T_Stock` tablosundan okunur; tabloya yalnız Tamamla yazar (Operasyonlar §2).
- Hareketler `Inv_V_StockMove` görünümüdür: satır başına bir kayıt, lot dağılımı varsa lot başına bir kayıt; bütün durumlar listelenir, stoğu yalnız Tamamlandı satırları değiştirir.
- Görünümler Grid, Card, Pivot, Chart; depo × ürün toplamı Pivot ile alınır.
### 3. Menü ve ekranlar
Ayrı bir Raporlama dalı yoktur (kullanıcı kararı): Stok (`App.Inventory.Stock`, sıra 3), Hareketler (`App.Inventory.Transfer`, sıra 4 — alım, teslimat ve iç transfer belgeleri; satırda Detay, Not ve belgeyi kendi ekranında açan Aç) ve Ürün Hareketleri (`App.Inventory.StockMove`, sıra 5 — ürün/lot satırları; satırda Aç) doğrudan `Envanter` altında, Operasyonlar'dan sonradır; hepsi salt okunur. Yetkiler aynı sırada `App.Inventory` kökündedir.
### 4. Veri modeli
`Inv_T_Stock` (Operasyonlar §4) ve `Inv_V_StockMove`: Id (lot ya da satır), TransferId, TransferNo, OperationKind, OperationTypeId, Status, MoveDate (geçerlilik, yoksa planlanan tarih), BranchId, WarehouseId, Source/DestinationLocationId, PartnerId, SourceDocument, ProductId, LotNo, DemandQuantity, Quantity, UomId.
### 5. İş kuralları ve hesaplar
- Stok miktarı ürünün birimindedir; hareket miktarı satırın (lotta lotun) birimindedir.
- Sıfıra inen stok satırı silinmez (Sıfır Stok kartı); yeniden girişte giriş tarihi yenilenir.
- Kartlar: Stok — Stoktaki Ürün, Stoktaki Lot, Sıfır Stok; Hareketler — Açık Alım, Açık Teslimat, Açık İç Transfer, Geciken; Ürün Hareketleri — Bugün Tamamlanan, Tamamlanan Giriş, Tamamlanan Çıkış, Açık Hareket.
### 6. Yetki ve görünürlük
İki ekranın yetkisi menüyle aynı sırada `App.Inventory` izin grubunun kökündedir (`App.Inventory.Stock` sıra 3, `App.Inventory.StockMove` sıra 4); yetkiler hiçbir role otomatik atanmaz. Kiracı kapsamlı.
### 7. Entegrasyonlar
Kaynak Operasyonlar dalının belgeleridir; lookup kaynakları Şubeler, Depolar, Konumlar, Ürünler, Ölçü Birimleri, Kontaklar.
### 8. Akış örneği
Operasyonlar §8'deki akıştan sonra Stok'ta Ana Depo / sensör / LOT000001 = 4 görünür; Ürün Hareketleri'nde IKT/IN/00001 (+10), teslimat (−4) ve iç transfer satırları listelenir.
### 9. Sık sorulanlar
- **Hareket listede ama stok değişmedi?** Hareket Tamamlandı değildir ya da ürünün envanter takibi kapalıdır.
- **Dış konum stokta yok mu?** Tedarikçiler/Müşteriler gibi dış konumlar stok tutmaz.
### 10. Dosyalar ve geri alma
Wizard'lar `Inventory_Stock.json`, `Inventory_StockMove.json`; nesneler `Inv_T_Stock`, `Inv_V_StockMove` (sql + postgres). Ekranlar Wizard Manager'dan silinir; tablo ve görünüm Operasyonlar'a bağlıdır.
<!-- module-doc:auto:begin --> <!-- module-doc:auto:begin -->
## Ek — Ekran envanteri (otomatik) ## Ek — Ekran envanteri (otomatik)
@ -342,7 +497,7 @@ Dış entegrasyon yok. Reçete operasyonları iş merkezi ve operasyonu Üretim
| `Code` | Konum Kodu | dxTextBox | | ✓ | | | `Code` | Konum Kodu | dxTextBox | | ✓ | |
| `Name` | Konum | dxTextBox | ✓ | ✓ | | | `Name` | Konum | dxTextBox | ✓ | ✓ | |
| `DepartmentId` | Departman | dxSelectBox | | ✓ | sorgu: Hr_T_Department (← BranchId) | | `DepartmentId` | Departman | dxSelectBox | | ✓ | sorgu: Hr_T_Department (← BranchId) |
| `ResponsibleUserId` | Depo Sorumlusu | dxSelectBox | | ✓ | sorgu: AbpUsers | | `ResponsibleUserName` | Depo Sorumlusu | dxSelectBox | | ✓ | sorgu: AbpUsers |
| `LocationType` | Konum Türü | dxSelectBox | ✓ | ✓ | liste: Internal, External | | `LocationType` | Konum Türü | dxSelectBox | ✓ | ✓ | liste: Internal, External |
| `ParentId` | Üst Lokasyon | dxSelectBox | | ✓ | sorgu: Inv_T_Location (← WarehouseId) | | `ParentId` | Üst Lokasyon | dxSelectBox | | ✓ | sorgu: Inv_T_Location (← WarehouseId) |
| `IsActive` | Aktif | dxCheckBox | ✓ | ✓ | | | `IsActive` | Aktif | dxCheckBox | ✓ | ✓ | |
@ -371,7 +526,7 @@ Dış entegrasyon yok. Reçete operasyonları iş merkezi ve operasyonu Üretim
| `WarehouseId` | Depo | dxSelectBox | ✓ | ✓ | sorgu: Inv_T_Warehouse (← BranchId) | | `WarehouseId` | Depo | dxSelectBox | ✓ | ✓ | sorgu: Inv_T_Warehouse (← BranchId) |
| `Name` | Operasyon Türü | dxTextBox | ✓ | ✓ | | | `Name` | Operasyon Türü | dxTextBox | ✓ | ✓ | |
| `OperationKind` | Tür | dxSelectBox | ✓ | ✓ | liste: Receipt, Delivery, InternalTransfer, Manufacturing, Repair | | `OperationKind` | Tür | dxSelectBox | ✓ | ✓ | liste: Receipt, Delivery, InternalTransfer, Manufacturing, Repair |
| `SequencePrefix` | Sıra Öneki | dxTextBox | | ✓ | | | `SequenceName` | Numaratör | dxSelectBox | ✓ | ✓ | sorgu: Adm_T_Sequence |
| `Barcode` | Barkod | dxTextBox | | ✓ | | | `Barcode` | Barkod | dxTextBox | | ✓ | |
| `SourceLocationId` | Kaynak Konum | dxSelectBox | | ✓ | sorgu: Inv_T_Location (← WarehouseId) | | `SourceLocationId` | Kaynak Konum | dxSelectBox | | ✓ | sorgu: Inv_T_Location (← WarehouseId) |
| `DestinationLocationId` | Hedef Konum | dxSelectBox | | ✓ | sorgu: Inv_T_Location (← WarehouseId) | | `DestinationLocationId` | Hedef Konum | dxSelectBox | | ✓ | sorgu: Inv_T_Location (← WarehouseId) |
@ -594,4 +749,390 @@ Dış entegrasyon yok. Reçete operasyonları iş merkezi ve operasyonu Üretim
| `IncomeAccount` | Gelir Hesabı | dxTextBox | | ✓ | | | `IncomeAccount` | Gelir Hesabı | dxTextBox | | ✓ | |
| `ExpenseAccount` | Gider Hesabı | dxTextBox | | ✓ | | | `ExpenseAccount` | Gider Hesabı | dxTextBox | | ✓ | |
### Operasyonlar (`App.Inventory.Operations`)
#### Alımlar — `App.Inventory.Receipt`
| Özellik | Değer |
| --- | --- |
| Wizard | `wizard/Inventory_Receipt.json` |
| Yol | Liste (Wizard) |
| Menü | `App.Inventory.Operations` › `App.Inventory.Receipt` (sıra 1) |
| Yetki | `App.Inventory.Receipt` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` |
| Açıklama | Alımlar — tedarikçiden depoya giren mallar. |
| Kaynak | `Inv_T_Transfer` · filtre `"IsDeleted" = 'false' AND "OperationKind" = 'Receipt'` |
| Görünümler | Grid, Card, Pivot, Chart (açılış grid) |
| Düzenleme | ekle ✓ · düzenle ✓ · sil ✓ · popup |
| Kapsam | Kiracı |
| Alt formlar | `App.Inventory.TransferLine` (Id → TransferId), `App.Inventory.TransferOther` (Id → Id), `App.Inventory.TransferNote` (Id → Id) |
| Widget'lar | `App.Widget.Draft`, `App.Inventory.Widget.Waiting`, `App.Inventory.Widget.Ready`, `App.Inventory.Widget.Late` |
| Komutlar | InsertAfter: `Inv_P_TransferAfterSave` · UpdateBefore: SQL · UpdateAfter: `Inv_P_TransferAfterSave` · DeleteBefore: SQL |
| Form varsayılanları | Status=Draft, OperationKind=Receipt, ScheduledDate=@NOW, BranchId= |
| Butonlar | `App.Inventory.Transfer.Action.Confirm`, `App.Inventory.Transfer.Action.Validate`, `App.Inventory.Transfer.Action.Cancel`, `App.Inventory.Transfer.Action.Return`, `App.Inventory.Transfer.Action.Print` |
| Alan | Başlık | Editör | Zorunlu | Formda | Kaynak |
| --- | --- | --- | --- | --- | --- |
| `TransferNo` | Fiş No | dxTextBox | | ✓ | |
| `Status` | Durum | dxSelectBox | | ✓ | liste: Draft, Waiting, Ready, Done, Cancelled |
| `SourceDocument` | Kaynak Belge | dxTextBox | | ✓ | |
| `PartnerId` | Tedarikçi Adı | dxSelectBox | | ✓ | sorgu: Adm_T_Contact |
| `ScheduledDate` | Planlanan Tarih | dxDateBox | ✓ | ✓ | |
| `EffectiveDate` | Geçerlilik Tarihi | dxDateBox | | ✓ | |
| `BranchId` | Şube | dxSelectBox | ✓ | ✓ | sorgu: Sas_T_Branch |
| `WarehouseId` | Depo | dxSelectBox | ✓ | ✓ | sorgu: Inv_T_Warehouse (← BranchId) |
| `OperationTypeId` | Operasyon Türü | dxSelectBox | ✓ | ✓ | sorgu: Inv_T_OperationType (← WarehouseId) · script |
| `DestinationLocationId` | Hedef Konum | dxSelectBox | ✓ | ✓ | sorgu: Inv_T_Location (← WarehouseId) |
| `SourceLocationId` | Kaynak Konum | dxSelectBox | | | sorgu: Inv_T_Location |
| `OperationKind` | OperationKind | dxSelectBox | | | liste: Receipt, Delivery, InternalTransfer, Manufacturing, Repair |
| `PendingAction` | PendingAction | dxTextBox | | | |
| `LineSummary` | LineSummary | dxTextBox | | | |
#### Teslimatlar — `App.Inventory.Delivery`
| Özellik | Değer |
| --- | --- |
| Wizard | `wizard/Inventory_Delivery.json` |
| Yol | Liste (Wizard) |
| Menü | `App.Inventory.Operations` › `App.Inventory.Delivery` (sıra 2) |
| Yetki | `App.Inventory.Delivery` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` |
| Açıklama | Teslimatlar — depodan müşteriye çıkan mallar. |
| Kaynak | `Inv_T_Transfer` · filtre `"IsDeleted" = 'false' AND "OperationKind" = 'Delivery'` |
| Görünümler | Grid, Card, Pivot, Chart (açılış grid) |
| Düzenleme | ekle ✓ · düzenle ✓ · sil ✓ · popup |
| Kapsam | Kiracı |
| Alt formlar | `App.Inventory.TransferLine` (Id → TransferId), `App.Inventory.TransferOther` (Id → Id), `App.Inventory.TransferNote` (Id → Id) |
| Widget'lar | `App.Widget.Draft`, `App.Inventory.Widget.Waiting`, `App.Inventory.Widget.Ready`, `App.Inventory.Widget.Late` |
| Komutlar | InsertAfter: `Inv_P_TransferAfterSave` · UpdateBefore: SQL · UpdateAfter: `Inv_P_TransferAfterSave` · DeleteBefore: SQL |
| Form varsayılanları | Status=Draft, OperationKind=Delivery, ScheduledDate=@NOW, BranchId=, DeliveryPolicy=Direct |
| Butonlar | `App.Inventory.Transfer.Action.Confirm`, `App.Inventory.Transfer.Action.Validate`, `App.Inventory.Transfer.Action.Cancel`, `App.Inventory.Transfer.Action.Return`, `App.Inventory.Transfer.Action.Print` |
| Alan | Başlık | Editör | Zorunlu | Formda | Kaynak |
| --- | --- | --- | --- | --- | --- |
| `TransferNo` | Fiş No | dxTextBox | | ✓ | |
| `Status` | Durum | dxSelectBox | | ✓ | liste: Draft, Waiting, Ready, Done, Cancelled |
| `ScheduledDate` | Planlanan Tarih | dxDateBox | ✓ | ✓ | |
| `PartnerId` | Teslim Adresi | dxSelectBox | | ✓ | sorgu: Adm_T_Contact |
| `BranchId` | Şube | dxSelectBox | ✓ | ✓ | sorgu: Sas_T_Branch |
| `WarehouseId` | Depo | dxSelectBox | ✓ | ✓ | sorgu: Inv_T_Warehouse (← BranchId) |
| `OperationTypeId` | Operasyon Türü | dxSelectBox | ✓ | ✓ | sorgu: Inv_T_OperationType (← WarehouseId) · script |
| `SourceLocationId` | Kaynak Konum | dxSelectBox | ✓ | ✓ | sorgu: Inv_T_Location (← WarehouseId) |
| `DestinationLocationId` | Hedef Konum | dxSelectBox | | | sorgu: Inv_T_Location |
| `EffectiveDate` | Geçerlilik Tarihi | dxDateBox | | ✓ | |
| `SourceDocument` | Kaynak Belge | dxTextBox | | ✓ | |
| `DeliveryPolicy` | Ürün Teslimat Politikası | dxSelectBox | ✓ | ✓ | liste: Direct, OneTime |
| `OperationKind` | OperationKind | dxSelectBox | | | liste: Receipt, Delivery, InternalTransfer, Manufacturing, Repair |
| `PendingAction` | PendingAction | dxTextBox | | | |
| `LineSummary` | LineSummary | dxTextBox | | | |
#### İç Transferler — `App.Inventory.InternalTransfer`
| Özellik | Değer |
| --- | --- |
| Wizard | `wizard/Inventory_InternalTransfer.json` |
| Yol | Liste (Wizard) |
| Menü | `App.Inventory.Operations` › `App.Inventory.InternalTransfer` (sıra 3) |
| Yetki | `App.Inventory.InternalTransfer` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` |
| Açıklama | İç Transferler — aynı deponun konumları arasında taşıma. |
| Kaynak | `Inv_T_Transfer` · filtre `"IsDeleted" = 'false' AND "OperationKind" = 'InternalTransfer'` |
| Görünümler | Grid, Card, Pivot, Chart (açılış grid) |
| Düzenleme | ekle ✓ · düzenle ✓ · sil ✓ · popup |
| Kapsam | Kiracı |
| Alt formlar | `App.Inventory.TransferLine` (Id → TransferId), `App.Inventory.TransferOther` (Id → Id), `App.Inventory.TransferNote` (Id → Id), `App.Inventory.TransferApproval` (Id → Id) |
| Widget'lar | `App.Widget.Draft`, `App.Inventory.Widget.Waiting`, `App.Inventory.Widget.Ready`, `App.Inventory.Widget.Late` |
| Komutlar | InsertAfter: `Inv_P_TransferAfterSave` · UpdateBefore: SQL · UpdateAfter: `Inv_P_TransferAfterSave` · DeleteBefore: SQL |
| Form varsayılanları | Status=Draft, OperationKind=InternalTransfer, ScheduledDate=@NOW, BranchId= |
| Butonlar | `App.Inventory.Transfer.ImportRequests`, `App.Inventory.Transfer.Action.Confirm`, `App.Inventory.Transfer.Action.Validate`, `App.Inventory.Transfer.Action.Cancel`, `App.Inventory.Transfer.Action.Return`, `App.Inventory.Transfer.Action.Print` |
| Onay akışı | Start 'Onaya Gönderildi' → Approval 'Kaynak Depo Onayı' → End 'Onaylandı' → End 'Reddedildi' |
| Alan | Başlık | Editör | Zorunlu | Formda | Kaynak |
| --- | --- | --- | --- | --- | --- |
| `TransferNo` | Fiş No | dxTextBox | | ✓ | |
| `ScheduledDate` | Planlanan Tarih | dxDateBox | ✓ | ✓ | |
| `PartnerId` | Kontak | dxSelectBox | | ✓ | sorgu: Adm_T_Contact |
| `Status` | Durum | dxSelectBox | | ✓ | liste: Draft, Waiting, Ready, Done, Cancelled |
| `BranchId` | Şube | dxSelectBox | ✓ | ✓ | sorgu: Sas_T_Branch |
| `WarehouseId` | Depo | dxSelectBox | ✓ | ✓ | sorgu: Inv_T_Warehouse (← BranchId) |
| `OperationTypeId` | Operasyon Türü | dxSelectBox | ✓ | ✓ | sorgu: Inv_T_OperationType (← WarehouseId) · script |
| `EffectiveDate` | Geçerlilik Tarihi | dxDateBox | | ✓ | |
| `SourceLocationId` | Kaynak Konum | dxSelectBox | ✓ | ✓ | sorgu: Inv_T_Location (← WarehouseId) |
| `DestinationLocationId` | Hedef Konum | dxSelectBox | ✓ | ✓ | sorgu: Inv_T_Location (← WarehouseId) |
| `SourceDocument` | Kaynak Belge | dxTextBox | | ✓ | |
| `OperationKind` | OperationKind | dxSelectBox | | | liste: Receipt, Delivery, InternalTransfer, Manufacturing, Repair |
| `PendingAction` | PendingAction | dxTextBox | | | |
| `LineSummary` | LineSummary | dxTextBox | | | |
| `ApprovalStatus` | Kaynak Depo Onayı | dxTextBox | | | |
| `ApprovalUserName` | Onaylayan | dxTextBox | | | |
| `ApprovalDate` | Onay Tarihi | dxDateBox | | | |
| `ApprovalDescription` | Onay Açıklaması | dxTextBox | | | |
| `SourceApproverUserNames` | SourceApproverUserNames | dxTextBox | | | |
#### Lot/Seri Numaraları — `App.Inventory.TransferLineLot`
| Özellik | Değer |
| --- | --- |
| Wizard | `wizard/Inventory_TransferLineLot.json` |
| Yol | Liste (Wizard) |
| Menü | Menüsüz (alt form) |
| Yetki | `App.Inventory.TransferLineLot` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` |
| Açıklama | Lot/Seri Numaraları — stoğa giren satırın (alım, teslimat iadesi) lot ya da seri numaraları; satırdaki Detaylar butonuyla açılır. |
| Kaynak | `Inv_V_TransferLineLot` |
| Görünümler | Grid, Card, Pivot, Chart (açılış grid) |
| Düzenleme | ekle ✓ · düzenle ✓ · sil ✓ · popup |
| Kapsam | Kiracı |
| Komutlar | InsertBefore: SQL · InsertAfter: `Inv_P_TransferRecalc` · UpdateBefore: SQL · UpdateAfter: `Inv_P_TransferRecalc` · DeleteBefore: SQL · DeleteAfter: `Inv_P_TransferRecalc` |
| Form varsayılanları | Quantity=1 |
| Alan | Başlık | Editör | Zorunlu | Formda | Kaynak |
| --- | --- | --- | --- | --- | --- |
| `BaseId` | BaseId | dxTextBox | | | |
| `LotNo` | Lot/Seri No | dxTextBox | ✓ | ✓ | |
| `Quantity` | Miktar | dxNumberBox | ✓ | ✓ | |
#### Stoktan Lot Seçimi — `App.Inventory.TransferLineLotStock`
| Özellik | Değer |
| --- | --- |
| Wizard | `wizard/Inventory_TransferLineLotStock.json` |
| Yol | Liste (Wizard) |
| Menü | Menüsüz (alt form) |
| Yetki | `App.Inventory.TransferLineLotStock` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` |
| Açıklama | Stoktan Lot Seçimi — stoktan çıkan satırın (teslimat, iç transfer, alım iadesi) kaynak konumundaki bütün lot/seriler; satırdaki Detaylar butonuyla açılır. |
| Kaynak | `Inv_V_TransferLineLotStock` |
| Görünümler | Grid, Card, Pivot, Chart (açılış grid) |
| Düzenleme | ekle ✗ · düzenle ✓ · sil ✗ · batch |
| Kapsam | Kiracı |
| Alan | Başlık | Editör | Zorunlu | Formda | Kaynak |
| --- | --- | --- | --- | --- | --- |
| `BaseId` | BaseId | dxTextBox | | | |
| `IsSelected` | Seç | dxCheckBox | | ✓ | script |
| `LotNo` | Lot/Seri No | dxTextBox | | | |
| `InDate` | Giriş Tarihi | dxDateBox | | | |
| `OnHand` | Eldeki Miktar | dxNumberBox | | | |
| `SelectedQuantity` | Seçilen Miktar | dxNumberBox | | ✓ | script |
| `UomId` | Birim | dxTextBox | | | |
#### Transfer Satırları — `App.Inventory.TransferLine`
| Özellik | Değer |
| --- | --- |
| Wizard | `wizard/Inventory_TransferLine.json` |
| Yol | Liste (Wizard) |
| Menü | Menüsüz (alt form) |
| Yetki | `App.Inventory.TransferLine` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` |
| Açıklama | Transfer Satırları — alım, teslimat ve iç transferlerin ürün satırları. |
| Kaynak | `Inv_T_TransferLine` · filtre `"IsDeleted" = 'false'` |
| Görünümler | Grid, Card, Pivot, Chart (açılış grid) |
| Düzenleme | ekle ✓ · düzenle ✓ · sil ✓ · popup |
| Kapsam | Kiracı |
| Komutlar | InsertBefore: SQL · InsertAfter: `Inv_P_TransferRecalc` · UpdateBefore: SQL · UpdateAfter: `Inv_P_TransferLineAfterSave` · DeleteBefore: SQL · DeleteAfter: `Inv_P_TransferRecalc` |
| Form varsayılanları | DemandQuantity=1, UomId=Adet |
| Butonlar | `App.Inventory.TransferLine.GenerateLots`, `App.Inventory.TransferLine.AssignLots`, `App.Inventory.TransferLine.Details` |
| Alan | Başlık | Editör | Zorunlu | Formda | Kaynak |
| --- | --- | --- | --- | --- | --- |
| `TransferId` | TransferId | dxTextBox | | | |
| `ProductId` | Ürün | dxSelectBox | ✓ | ✓ | sorgu: Inv_T_Product · script |
| `DemandQuantity` | Talep | dxNumberBox | ✓ | ✓ | |
| `Quantity` | Miktar | dxNumberBox | | ✓ | |
| `UomId` | Birim | dxSelectBox | ✓ | ✓ | sorgu: Adm_T_Uom |
| `Description` | Açıklama | dxTextArea | | ✓ | |
| `LotNumbers` | Lotlar | dxTextBox | | | |
| `PurchaseOrderLineId` | PurchaseOrderLineId | dxTextBox | | | |
| `MaterialRequestItemId` | MaterialRequestItemId | dxTextBox | | | |
| `PendingAction` | PendingAction | dxTextBox | | | |
| `TrackingMethod` | Takip Yöntemi | dxTextBox | | | |
| `LotFromStock` | Lot Stoktan | dxCheckBox | | | |
#### Ek Bilgi — `App.Inventory.TransferOther`
| Özellik | Değer |
| --- | --- |
| Wizard | `wizard/Inventory_TransferOther.json` |
| Yol | Liste (Wizard) |
| Menü | Menüsüz (alt form) |
| Yetki | `App.Inventory.TransferOther` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` |
| Açıklama | Ek Bilgi — transfer belgesinin nakliye ve diğer bilgileri (alım, teslimat ve iç transferlerin Ek Bilgi sekmesi). |
| Kaynak | `Inv_T_Transfer` · filtre `"IsDeleted" = 'false'` |
| Görünümler | Grid, Card, Pivot, Chart (açılış grid) |
| Düzenleme | ekle ✗ · düzenle ✓ · sil ✗ · popup |
| Kapsam | Kiracı |
| Komutlar | UpdateBefore: SQL |
| Alan | Başlık | Editör | Zorunlu | Formda | Kaynak |
| --- | --- | --- | --- | --- | --- |
| `CarrierId` | Nakliyeci | dxSelectBox | | ✓ | sorgu: Adm_T_Contact |
| `ResponsibleUserId` | Sorumlu | dxSelectBox | | ✓ | sorgu: AbpUsers |
| `TrackingReference` | Takip Referansı | dxTextBox | | ✓ | |
| `ProjectId` | Proje | dxSelectBox | | ✓ | sorgu: Prj_T_Project |
| `Weight` | Ağırlık (kg) | dxNumberBox | | ✓ | |
| `ShippingWeight` | Nakliye Ağırlığı (kg) | dxNumberBox | | ✓ | |
#### Not — `App.Inventory.TransferNote`
| Özellik | Değer |
| --- | --- |
| Wizard | `wizard/Inventory_TransferNote.json` |
| Yol | Liste (Wizard) |
| Menü | Menüsüz (alt form) |
| Yetki | `App.Inventory.TransferNote` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` |
| Açıklama | Not — transfer belgesinin serbest notu (alım, teslimat ve iç transferlerin Not sekmesi). |
| Kaynak | `Inv_T_Transfer` · filtre `"IsDeleted" = 'false'` |
| Görünümler | Grid, Card, Pivot, Chart (açılış grid) |
| Düzenleme | ekle ✗ · düzenle ✓ · sil ✗ · popup |
| Kapsam | Kiracı |
| Komutlar | UpdateBefore: SQL |
| Alan | Başlık | Editör | Zorunlu | Formda | Kaynak |
| --- | --- | --- | --- | --- | --- |
| `Note` | Not | dxHtmlEditor | | ✓ | |
#### Onay ve Teslim — `App.Inventory.TransferApproval`
| Özellik | Değer |
| --- | --- |
| Wizard | `wizard/Inventory_TransferApproval.json` |
| Yol | Liste (Wizard) |
| Menü | Menüsüz (alt form) |
| Yetki | `App.Inventory.TransferApproval` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` |
| Açıklama | Onay ve Teslim — iç transferin kaynak depo onayı ve teslimi (İç Transferler'in Onay ve Teslim sekmesi; salt okunur). |
| Kaynak | `Inv_T_Transfer` · filtre `"IsDeleted" = 'false'` |
| Görünümler | Grid, Card, Pivot, Chart (açılış grid) |
| Düzenleme | ekle ✗ · düzenle ✓ · sil ✗ · popup |
| Kapsam | Kiracı |
| Komutlar | UpdateBefore: SQL |
| Alan | Başlık | Editör | Zorunlu | Formda | Kaynak |
| --- | --- | --- | --- | --- | --- |
| `ApprovalStatus` | Kaynak Depo Onayı | dxTextBox | | ✓ | |
| `ReceivedByUserId` | Teslim Alan | dxSelectBox | | ✓ | sorgu: AbpUsers |
| `ApprovalUserName` | Onaylayan | dxTextBox | | ✓ | |
| `ReceivedDate` | Teslim Alma Tarihi | dxDateBox | | ✓ | |
| `ApprovalDate` | Onay Tarihi | dxDateBox | | ✓ | |
| `ApprovalDescription` | Onay Açıklaması | dxTextBox | | ✓ | |
#### Transfer Talep Kalemleri — `App.Inventory.TransferImportItem`
| Özellik | Değer |
| --- | --- |
| Wizard | `wizard/Inventory_TransferImportItem.json` |
| Yol | Liste (Wizard) |
| Menü | Menüsüz (alt form) |
| Yetki | `App.Inventory.TransferImportItem` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` |
| Açıklama | Transfer Talep Kalemleri — transferle karşılanacak onaylı malzeme talebi kalemleri; taslak iç transferin Talepten Aktar butonuyla açılır. |
| Kaynak | `Prc_V_MaterialRequestTransferItem` |
| 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` | BaseId | 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 |
| `LocationId` | Konum | dxSelectBox | | | sorgu: Inv_T_Location |
| `DueDate` | İstenen Tarih | dxDateBox | | | |
| `RequestReason` | Neden | dxTextBox | | | |
### Stok, Hareketler ve Ürün Hareketleri (`App.Inventory.Stock`, `App.Inventory.Transfer`, `App.Inventory.StockMove`)
#### Stok — `App.Inventory.Stock`
| Özellik | Değer |
| --- | --- |
| Wizard | `wizard/Inventory_Stock.json` |
| Yol | Liste (Wizard) |
| Menü | `App.Inventory` › `App.Inventory.Stock` (sıra 3) |
| Yetki | `App.Inventory.Stock` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` |
| Açıklama | Stok — şube › depo › konum › ürün › lot bazında eldeki miktar, ürünün biriminde (salt okunur). |
| Kaynak | `Inv_T_Stock` · 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.Inventory.Widget.Products`, `App.Inventory.Widget.Lots`, `App.Inventory.Widget.ZeroStock` |
| Alan | Başlık | Editör | Zorunlu | Formda | Kaynak |
| --- | --- | --- | --- | --- | --- |
| `BranchId` | Şube | dxSelectBox | | | sorgu: Sas_T_Branch |
| `WarehouseId` | Depo | dxSelectBox | | | sorgu: Inv_T_Warehouse |
| `LocationId` | Konum | dxSelectBox | | | sorgu: Inv_T_Location |
| `ProductId` | Ürün | dxSelectBox | | | sorgu: Inv_T_Product |
| `LotNo` | Lot/Seri No | dxTextBox | | | |
| `Quantity` | Miktar | dxNumberBox | | | |
| `UomId` | Birim | dxSelectBox | | | sorgu: Adm_T_Uom |
| `InDate` | Giriş Tarihi | dxDateBox | | | |
| `LastMoveDate` | Son Hareket | dxDateBox | | | |
#### Hareketler — `App.Inventory.Transfer`
| Özellik | Değer |
| --- | --- |
| Wizard | `wizard/Inventory_Transfer.json` |
| Yol | Liste (Wizard) |
| Menü | `App.Inventory` › `App.Inventory.Transfer` (sıra 4) |
| Yetki | `App.Inventory.Transfer` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` |
| Açıklama | Hareketler — alım, teslimat ve iç transfer belgeleri tek, salt okunur listede. |
| Kaynak | `Inv_T_Transfer` · 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.Inventory.TransferLine` (Id → TransferId) |
| Widget'lar | `App.Inventory.Widget.OpenReceipts`, `App.Inventory.Widget.OpenDeliveries`, `App.Inventory.Widget.OpenInternal`, `App.Inventory.Widget.Late` |
| Butonlar | `App.Inventory.Transfer.Open`, `App.Inventory.Transfer.Open`, `App.Inventory.Transfer.Open` |
| Alan | Başlık | Editör | Zorunlu | Formda | Kaynak |
| --- | --- | --- | --- | --- | --- |
| `TransferNo` | Fiş No | dxTextBox | | ✓ | |
| `OperationKind` | Tür | dxSelectBox | | ✓ | liste: Receipt, Delivery, InternalTransfer, Manufacturing, Repair |
| `OperationTypeId` | Operasyon Türü | dxSelectBox | | ✓ | sorgu: Inv_T_OperationType |
| `PartnerId` | Kontak | dxSelectBox | | ✓ | sorgu: Adm_T_Contact |
| `BranchId` | Şube | dxSelectBox | | ✓ | sorgu: Sas_T_Branch |
| `WarehouseId` | Depo | dxSelectBox | | ✓ | sorgu: Inv_T_Warehouse |
| `SourceLocationId` | Kaynak Konum | dxSelectBox | | ✓ | sorgu: Inv_T_Location |
| `DestinationLocationId` | Hedef Konum | dxSelectBox | | ✓ | sorgu: Inv_T_Location |
| `ScheduledDate` | Planlanan Tarih | dxDateBox | | ✓ | |
| `EffectiveDate` | Geçerlilik Tarihi | dxDateBox | | ✓ | |
| `SourceDocument` | Kaynak Belge | dxTextBox | | ✓ | |
| `Status` | Durum | dxSelectBox | | ✓ | liste: Draft, Waiting, Ready, Done, Cancelled |
#### Ürün Hareketleri — `App.Inventory.StockMove`
| Özellik | Değer |
| --- | --- |
| Wizard | `wizard/Inventory_StockMove.json` |
| Yol | Liste (Wizard) |
| Menü | `App.Inventory` › `App.Inventory.StockMove` (sıra 5) |
| Yetki | `App.Inventory.StockMove` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` |
| Açıklama | Ürün Hareketleri — alım, teslimat ve iç transferlerin bütün ürün satırları ortak kolonlarla; satırın lot dağılımı varsa lot başına bir satır (salt okunur). |
| Kaynak | `Inv_V_StockMove` |
| Görünümler | Grid, Card, Pivot, Chart (açılış grid) |
| Düzenleme | ekle ✗ · düzenle ✗ · sil ✗ · popup |
| Kapsam | Kiracı |
| Widget'lar | `App.Inventory.Widget.DoneToday`, `App.Inventory.Widget.DoneReceipts`, `App.Inventory.Widget.DoneDeliveries`, `App.Inventory.Widget.OpenMoves` |
| Butonlar | `App.Inventory.Transfer.Open`, `App.Inventory.Transfer.Open`, `App.Inventory.Transfer.Open` |
| Alan | Başlık | Editör | Zorunlu | Formda | Kaynak |
| --- | --- | --- | --- | --- | --- |
| `TransferId` | TransferId | dxTextBox | | | |
| `MoveDate` | Tarih | dxDateBox | | | |
| `TransferNo` | Fiş No | dxTextBox | | | |
| `OperationKind` | Tür | dxSelectBox | | | liste: Receipt, Delivery, InternalTransfer, Manufacturing, Repair |
| `OperationTypeId` | Operasyon Türü | dxSelectBox | | | sorgu: Inv_T_OperationType |
| `Status` | Durum | dxSelectBox | | | liste: Draft, Waiting, Ready, Done, Cancelled |
| `ProductId` | Ürün | dxSelectBox | | | sorgu: Inv_T_Product |
| `LotNo` | Lot/Seri No | dxTextBox | | | |
| `DemandQuantity` | Talep | dxNumberBox | | | |
| `Quantity` | Miktar | dxNumberBox | | | |
| `UomId` | Birim | dxSelectBox | | | sorgu: Adm_T_Uom |
| `BranchId` | Şube | dxSelectBox | | | sorgu: Sas_T_Branch |
| `WarehouseId` | Depo | dxSelectBox | | | sorgu: Inv_T_Warehouse |
| `SourceLocationId` | Kaynak Konum | dxSelectBox | | | sorgu: Inv_T_Location |
| `DestinationLocationId` | Hedef Konum | dxSelectBox | | | sorgu: Inv_T_Location |
| `PartnerId` | Kontak | dxSelectBox | | | sorgu: Adm_T_Contact |
| `SourceDocument` | Kaynak Belge | dxTextBox | | | |
<!-- module-doc:auto:end --> <!-- module-doc:auto:end -->

View file

@ -200,11 +200,11 @@ _Henüz yazılmadı._ <!-- module-doc:todo -->
### 1. Amaç ve kapsam ### 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. Tedarikçinin linkten kendi fiyatını girdiği portal, mal kabul (alınan/kalan miktar), tedarikçi faturası (faturalanan, Fatura Yükle) ve analitik dağılım kapsam dışıdır. 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.
### 2. Analiz ve kararlar ### 2. Analiz ve kararlar
- Teklif talebi ve satınalma siparişi **ayrı belgelerdir** (`Prc_T_PurchaseRfq`, `Prc_T_PurchaseOrder`), ayrı numaratörle: `PurchaseRfq` (RFQ00001) ve `PurchaseOrder1` (P00001). Sözleşme `PurchaseAgreement1` (BO00001). - 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. - **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`). - 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. - 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.
@ -241,7 +241,7 @@ 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_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; aktarımda 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_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. - `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). - 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`. - 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`.
@ -253,6 +253,7 @@ Tüm tablolar kiracı + tam audit + soft delete.
- 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. - 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). - 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).
- Sipariş işlemleri: Siparişi Onayla (taslak, kalemli) · E-posta ile Gönder (iptal dışında) · İptal · Taslak olarak ayarla (yalnız iptalden). - Sipariş işlemleri: Siparişi Onayla (taslak, kalemli) · E-posta ile Gönder (iptal dışında) · İptal · Taslak olarak ayarla (yalnız iptalden).
- **Alım:** Siparişi Onayla ve Siparişe Dönüştür (onaylı açılan sipariş) siparişin operasyon türünde taslak alım açar (`Inv_P_TransferFromPurchaseOrder`): konumlar operasyon türünden, satırlar envanter takipli kalemlerin alınmamış miktarı, Kaynak Belge = sipariş no. Siparişin iptal olmayan alımı varsa yenisi açılmaz. Yapılmış alımı olan sipariş iptal edilemez; iptal edilen siparişin yapılmamış alımları da iptal olur.
- Siparişe dönüşmüş ya da iptal edilmiş teklif ve kalemleri değiştirilemez; iptal edilmiş siparişin kalemi değiştirilemez. Gönderilmiş ya da dönüşmüş teklif silinemez; yalnız teklifsiz yazılmış taslak sipariş silinebilir. - Siparişe dönüşmüş ya da iptal edilmiş teklif ve kalemleri değiştirilemez; iptal edilmiş siparişin kalemi değiştirilemez. Gönderilmiş ya da dönüşmüş teklif silinemez; yalnız teklifsiz yazılmış taslak sipariş silinebilir.
- Fiyat Karşılaştırması sekmesinde birim fiyat, teslim tarihi ve Seçili düzenlenir (ilgili teklifin toplamı yeniden hesaplanır). Siparişe dönüşte kazanan satırlar Seçili olarak işaretlenir. - Fiyat Karşılaştırması sekmesinde birim fiyat, teslim tarihi ve Seçili düzenlenir (ilgili teklifin toplamı yeniden hesaplanır). Siparişe dönüşte kazanan satırlar Seçili olarak işaretlenir.
- Sözleşmede bitiş tarihi başlangıçtan önce olamaz; sözleşme seçilen boş teklif kalan (siparişe dönüşmemiş) miktarlarla dolar. - Sözleşmede bitiş tarihi başlangıçtan önce olamaz; sözleşme seçilen boş teklif kalan (siparişe dönüşmemiş) miktarlarla dolar.
@ -263,7 +264,7 @@ Yetki ağacı: `App.Prc` › `App.Prc.Orders` › teklif ve sipariş listeleri,
### 7. Entegrasyonlar ### 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); 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 (`PurchaseRfq`, `PurchaseOrder1`, `PurchaseAgreement1`). 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`).
### 8. Akış örneği ### 8. Akış örneği
@ -290,7 +291,7 @@ Yönetim › Tanımlamalar › Kontaklar (tedarikçi, e-posta, Satınalma sekmes
- 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). - 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`. - Wizard'lar: `Prc_PurchaseRfq{,Line,ImportItem,Quote,Other,Alternative,Comparison}.json`, `Prc_PurchaseOrder{,Line,ImportItem,Other,Alternative,Product}.json`, `Prc_PurchaseAgreement{,Line}.json`.
- Arayüz: `ui/src/views/purchasing/PurchaseDocGridDialog.tsx` (kayıt: `DialogShowComponent`, ad `PurchaseDocGrid`). - Arayüz: `ui/src/views/purchasing/PurchaseDocGridDialog.tsx` (kayıt: `DialogShowComponent`, ad `PurchaseDocGrid`).
- Veri: Diziler `PurchaseRfq`, `PurchaseOrder1`, `PurchaseAgreement1`; Bildirim Türleri ve Kuralları `TeklifTalebiGonderildi`, `SatinalmaSiparisiGonderildi`. - 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. - 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.
<!-- module-doc:auto:begin --> <!-- module-doc:auto:begin -->
@ -435,7 +436,7 @@ Yönetim › Tanımlamalar › Kontaklar (tedarikçi, e-posta, Satınalma sekmes
| Alt formlar | `App.Prc.MaterialRequestLine` (Id → MaterialRequestId) | | 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` | | 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 | | Komutlar | InsertAfter: `Prc_P_MaterialRequestAfterSave` · UpdateAfter: `Prc_P_MaterialRequestAfterSave` · DeleteBefore: SQL |
| Form varsayılanları | RequestNo=MaterialRequest1, RequesterUserId=@USERID, BranchId=, DepartmentId=, RequestDate=@NOW, Priority=0 | | Form varsayılanları | RequestNo=Prc.MaterialRequest, RequesterUserId=@USERID, BranchId=, DepartmentId=, RequestDate=@NOW, Priority=0 |
| Onay akışı | Start 'Onaya Gönderildi' → Approval 'Departman Onayı' → Approval 'Satınalma Onayı' → End 'Onaylandı' → End 'Reddedildi' | | 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 | | Alan | Başlık | Editör | Zorunlu | Formda | Kaynak |
@ -623,7 +624,7 @@ Yönetim › Tanımlamalar › Kontaklar (tedarikçi, e-posta, Satınalma sekmes
| Alt formlar | `App.Prc.PurchaseAgreementLine` (Id → AgreementId) | | Alt formlar | `App.Prc.PurchaseAgreementLine` (Id → AgreementId) |
| Widget'lar | `App.Prc.AgreementStatus.Draft`, `App.Prc.AgreementStatus.Confirmed`, `App.Prc.AgreementStatus.Closed`, `App.Prc.AgreementStatus.Cancelled` | | Widget'lar | `App.Prc.AgreementStatus.Draft`, `App.Prc.AgreementStatus.Confirmed`, `App.Prc.AgreementStatus.Closed`, `App.Prc.AgreementStatus.Cancelled` |
| Komutlar | UpdateBefore: SQL | | Komutlar | UpdateBefore: SQL |
| Form varsayılanları | AgreementNo=PurchaseAgreement1, BuyerUserId=@USERID, CurrencyId=TRY, StartDate=@NOW, Status=Draft, BranchId= | | Form varsayılanları | AgreementNo=Prc.PurchaseAgreement, BuyerUserId=@USERID, CurrencyId=TRY, StartDate=@NOW, Status=Draft, BranchId= |
| Alan | Başlık | Editör | Zorunlu | Formda | Kaynak | | Alan | Başlık | Editör | Zorunlu | Formda | Kaynak |
| --- | --- | --- | --- | --- | --- | | --- | --- | --- | --- | --- | --- |
@ -684,7 +685,7 @@ Yönetim › Tanımlamalar › Kontaklar (tedarikçi, e-posta, Satınalma sekmes
| 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.PurchaseRfqImportItem` (Id → BaseId), `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` | | 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 | | Komutlar | InsertAfter: `Prc_P_PurchaseRfqAfterSave` · UpdateBefore: SQL · UpdateAfter: `Prc_P_PurchaseRfqAfterSave` · DeleteBefore: SQL |
| Form varsayılanları | RfqNo=PurchaseRfq, BuyerUserId=@USERID, CurrencyId=TRY, Status=Draft, BranchId= | | 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` | | 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` |
| Alan | Başlık | Editör | Zorunlu | Formda | Kaynak | | Alan | Başlık | Editör | Zorunlu | Formda | Kaynak |
@ -728,7 +729,7 @@ Yönetim › Tanımlamalar › Kontaklar (tedarikçi, e-posta, Satınalma sekmes
| 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.PurchaseOrderImportItem` (Id → BaseId), `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` | | 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` | | Komutlar | InsertAfter: `Prc_P_PurchaseOrderAfterSave` · UpdateBefore: SQL · UpdateAfter: `Prc_P_PurchaseOrderAfterSave` · DeleteBefore: SQL · DeleteAfter: `Prc_P_MaterialRequestSyncStatus` |
| Form varsayılanları | OrderNo=PurchaseOrder1, BuyerUserId=@USERID, CurrencyId=TRY, Status=Draft, BranchId= | | 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` | | 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` |
| Alan | Başlık | Editör | Zorunlu | Formda | Kaynak | | Alan | Başlık | Editör | Zorunlu | Formda | Kaynak |
@ -987,6 +988,7 @@ Yönetim › Tanımlamalar › Kontaklar (tedarikçi, e-posta, Satınalma sekmes
| `ProductId` | Ürün | dxSelectBox | ✓ | ✓ | sorgu: Inv_T_Product · script | | `ProductId` | Ürün | dxSelectBox | ✓ | ✓ | sorgu: Inv_T_Product · script |
| `Description` | Açıklama | dxTextBox | | ✓ | | | `Description` | Açıklama | dxTextBox | | ✓ | |
| `Quantity` | Miktar | dxNumberBox | ✓ | ✓ | script | | `Quantity` | Miktar | dxNumberBox | ✓ | ✓ | script |
| `ReceivedQuantity` | Alınan | dxNumberBox | | | |
| `UomId` | Birim | dxSelectBox | ✓ | ✓ | sorgu: Adm_T_Uom | | `UomId` | Birim | dxSelectBox | ✓ | ✓ | sorgu: Adm_T_Uom |
| `UnitPrice` | Birim Fiyat | dxNumberBox | ✓ | ✓ | script | | `UnitPrice` | Birim Fiyat | dxNumberBox | ✓ | ✓ | script |
| `TaxRate` | Vergi Oran | dxNumberBox | ✓ | ✓ | script | | `TaxRate` | Vergi Oran | dxNumberBox | ✓ | ✓ | script |

View file

@ -807,7 +807,7 @@ Talep, raporun yalnızca ay bazında gösterilmesini istiyor. Çeyrek bazlı top
| Kapsam | Kiracı | | Kapsam | Kiracı |
| Alt formlar | `App.Prj.ProjectSummary` (Id → Id), `App.Prj.ProjectSupport` (Id → Id), `App.Prj.ProjectNeeds` (Id → Id), `App.Prj.ProjectActivities` (Id → Id), `App.Prj.ProjectInnovation` (Id → Id), `App.Prj.ProjectOutputs` (Id → Id), `App.Prj.ProjectMember` (Id → ProjectId), `App.Prj.WorkPackage` (Id → ProjectId), `App.Prj.ProjectCostSummary` (Id → ProjectId), `App.Prj.Diary` (Id → ProjectId) | | Alt formlar | `App.Prj.ProjectSummary` (Id → Id), `App.Prj.ProjectSupport` (Id → Id), `App.Prj.ProjectNeeds` (Id → Id), `App.Prj.ProjectActivities` (Id → Id), `App.Prj.ProjectInnovation` (Id → Id), `App.Prj.ProjectOutputs` (Id → Id), `App.Prj.ProjectMember` (Id → ProjectId), `App.Prj.WorkPackage` (Id → ProjectId), `App.Prj.ProjectCostSummary` (Id → ProjectId), `App.Prj.Diary` (Id → ProjectId) |
| Widget'lar | `App.Widget.Total`, `App.Widget.Active`, `App.Widget.Completed`, `App.Widget.TotalBudget` | | Widget'lar | `App.Widget.Total`, `App.Widget.Active`, `App.Widget.Completed`, `App.Widget.TotalBudget` |
| Form varsayılanları | Status=Draft, ProjectNo=ProjeCode1 | | Form varsayılanları | Status=Draft, ProjectNo=Prj.Project |
| Alan | Başlık | Editör | Zorunlu | Formda | Kaynak | | Alan | Başlık | Editör | Zorunlu | Formda | Kaynak |
| --- | --- | --- | --- | --- | --- | | --- | --- | --- | --- | --- | --- |

View file

@ -0,0 +1,24 @@
-- Miktarı bir ölçü biriminden diğerine çevirir (aynı kategori içinde, Adm_T_Uom.Type + Ratio).
-- Referans birim 1; büyük birim 1 birim = Ratio referans; küçük birim Ratio birim = 1 referans. Kategori farklıysa ya da birim yoksa miktar aynen döner.
CREATE OR REPLACE FUNCTION public."Inv_F_UomConvert"(p_quantity numeric, p_from_uom_id varchar, p_to_uom_id varchar)
RETURNS numeric
LANGUAGE plpgsql STABLE AS $$
DECLARE v_from double precision; v_to double precision;
BEGIN
IF p_quantity IS NULL OR p_from_uom_id IS NULL OR p_to_uom_id IS NULL OR p_from_uom_id = p_to_uom_id THEN
RETURN p_quantity;
END IF;
SELECT CASE f."Type" WHEN 'BiggerThanReference' THEN f."Ratio" WHEN 'SmallerThanReference' THEN 1.0 / NULLIF(f."Ratio", 0) ELSE 1 END,
CASE t."Type" WHEN 'BiggerThanReference' THEN t."Ratio" WHEN 'SmallerThanReference' THEN 1.0 / NULLIF(t."Ratio", 0) ELSE 1 END
INTO v_from, v_to
FROM "Adm_T_Uom" f
INNER JOIN "Adm_T_Uom" t ON t."Id" = p_to_uom_id AND t."UomCategoryId" = f."UomCategoryId"
WHERE f."Id" = p_from_uom_id;
IF v_from IS NULL OR NULLIF(v_to, 0) IS NULL THEN
RETURN p_quantity;
END IF;
RETURN ROUND((p_quantity * v_from / v_to)::numeric, 4);
END;
$$;

View file

@ -0,0 +1,52 @@
-- Transfer belgesi kaydı (ve iş akışı adımları) sonrası: tür, şube, depo ve boş konumlar operasyon türünden gelir (formda olmayan alımın
-- kaynağı ve teslimatın hedefi her zaman, iade belgesi hariç); teslimat politikası
-- yalnız teslimatta tutulur; iç transferin onaycısı kaynak konumun depo sorumlusudur (kullanıcı adı; iş akışı onaycıyı adla eşler), sorumlusu olmayan konumdan transfer onay beklemez.
-- Numara, özet ve durum butonunun işlemi (PendingAction) buradan çalışır.
CREATE OR REPLACE PROCEDURE public."Inv_P_TransferAfterSave"(p_id uuid, p_user_id uuid DEFAULT NULL)
LANGUAGE plpgsql AS $$
DECLARE v_act varchar(16);
BEGIN
SELECT "PendingAction" INTO v_act FROM "Inv_T_Transfer" WHERE "Id" = p_id;
UPDATE "Inv_T_Transfer" t SET
"OperationKind" = ot."OperationKind",
"BranchId" = ot."BranchId",
"WarehouseId" = ot."WarehouseId",
"SourceLocationId" = CASE WHEN t."ReturnOfId" IS NULL AND (ot."OperationKind" = 'Receipt' OR t."SourceLocationId" IS NULL)
THEN COALESCE(ot."SourceLocationId", t."SourceLocationId") ELSE t."SourceLocationId" END,
"DestinationLocationId" = CASE WHEN t."ReturnOfId" IS NULL AND (ot."OperationKind" = 'Delivery' OR t."DestinationLocationId" IS NULL)
THEN COALESCE(ot."DestinationLocationId", t."DestinationLocationId") ELSE t."DestinationLocationId" END,
"DeliveryPolicy" = CASE WHEN ot."OperationKind" = 'Delivery' THEN COALESCE(t."DeliveryPolicy", 'Direct') END
FROM "Inv_T_OperationType" ot
WHERE t."Id" = p_id AND ot."Id" = t."OperationTypeId";
UPDATE "Inv_T_Transfer" t SET
"SourceApproverUserNames" = a."UserName",
"ApprovalStatus" = CASE WHEN a."UserName" IS NULL AND t."ApprovalStatus" IS NULL THEN 'Onay Gerekmez'
WHEN a."UserName" IS NOT NULL AND t."ApprovalStatus" = 'Onay Gerekmez' THEN NULL
ELSE t."ApprovalStatus" END
FROM (SELECT x."Id", NULLIF(l."ResponsibleUserName", '') AS "UserName"
FROM "Inv_T_Transfer" x
LEFT JOIN "Inv_T_Location" l ON l."Id" = x."SourceLocationId"
WHERE x."Id" = p_id) a
WHERE t."Id" = a."Id" AND t."OperationKind" = 'InternalTransfer' AND t."Status" = 'Draft';
CALL public."Inv_P_TransferNumber"(p_id);
CALL public."Inv_P_TransferRecalc"(p_id);
-- Durum butonları işlemi PendingAction alanına yazıp ekranın güncelleme ucuyla kaydeder.
IF v_act IS NOT NULL THEN
CALL public."Inv_P_TransferSetStatus"(p_id, v_act, p_user_id);
-- Kaynak depo onayı verilen taslak iç transfer kendiliğinden hazırlanır (kullanıcı kararı: onay → Hazırla tek adım).
-- Hazırla'nın şartları (satır, farklı iki iç konum) sağlanmıyorsa denenmez: onay kaydı bozulmaz, belge taslak kalır ve
-- Hazırla elle basılınca hatayı gösterir.
ELSIF EXISTS (SELECT 1
FROM "Inv_T_Transfer" t
INNER JOIN "Inv_T_Location" s ON s."Id" = t."SourceLocationId" AND s."LocationType" = 'Internal'
INNER JOIN "Inv_T_Location" d ON d."Id" = t."DestinationLocationId" AND d."LocationType" = 'Internal'
WHERE t."Id" = p_id AND t."OperationKind" = 'InternalTransfer' AND t."Status" = 'Draft' AND t."ApprovalStatus" = 'Onaylandı'
AND s."Id" <> d."Id"
AND EXISTS (SELECT 1 FROM "Inv_T_TransferLine" l WHERE l."TransferId" = t."Id" AND l."IsDeleted" = false)) THEN
CALL public."Inv_P_TransferSetStatus"(p_id, 'Confirm', p_user_id);
END IF;
END;
$$;

View file

@ -0,0 +1,51 @@
-- Yapılacak miktarı doldurur ve belgeyi Hazır ya da Bekleyen yapar. Rezervasyon yoktur; Tamamla stoğu yeniden kontrol eder.
-- Kaynak konum stok tutmuyorsa (dış konum) yapılacak miktar talep kadardır. İç konumdan çıkışta satırlar ürün bazında sırayla
-- karşılanır; tümü karşılanırsa Hazır olur. Teslimatta "Mümkün olduğunca kısa sürede" politikası kısmi karşılamada da Hazır yapar.
CREATE OR REPLACE PROCEDURE public."Inv_P_TransferCheckAvailability"(p_id uuid)
LANGUAGE plpgsql AS $$
DECLARE v_src uuid; v_kind varchar(32); v_policy varchar(16); v_tenant uuid; v_all boolean; v_any boolean;
BEGIN
SELECT "SourceLocationId", "OperationKind", "DeliveryPolicy", "TenantId" INTO v_src, v_kind, v_policy, v_tenant
FROM "Inv_T_Transfer" WHERE "Id" = p_id;
IF NOT EXISTS (SELECT 1 FROM "Inv_T_Location" WHERE "Id" = v_src AND "LocationType" = 'Internal') THEN
UPDATE "Inv_T_TransferLine" SET "Quantity" = "DemandQuantity" WHERE "TransferId" = p_id AND "IsDeleted" = false AND "Quantity" = 0;
UPDATE "Inv_T_Transfer" SET "Status" = 'Ready' WHERE "Id" = p_id;
RETURN;
END IF;
DROP TABLE IF EXISTS tmp_inv_fill;
CREATE TEMP TABLE tmp_inv_fill AS
WITH d AS (
SELECT l."Id", l."ProductId", l."UomId", p."UomId" AS "ProductUomId", p."TrackInventory", l."DemandQuantity",
public."Inv_F_UomConvert"(l."DemandQuantity", l."UomId", p."UomId") AS "DemandBase",
SUM(public."Inv_F_UomConvert"(l."DemandQuantity", l."UomId", p."UomId"))
OVER (PARTITION BY l."ProductId" ORDER BY l."CreationTime", l."Id" ROWS UNBOUNDED PRECEDING) AS "CumBase"
FROM "Inv_T_TransferLine" l
INNER JOIN "Inv_T_Product" p ON p."Id" = l."ProductId"
WHERE l."TransferId" = p_id AND l."IsDeleted" = false),
s AS (
SELECT "ProductId", SUM("Quantity") AS "OnHand"
FROM "Inv_T_Stock"
WHERE "LocationId" = v_src AND "TenantId" IS NOT DISTINCT FROM v_tenant
GROUP BY "ProductId")
SELECT d."Id",
CASE WHEN d."TrackInventory" = false OR COALESCE(s."OnHand", 0) >= d."CumBase" THEN d."DemandQuantity"
WHEN COALESCE(s."OnHand", 0) > d."CumBase" - d."DemandBase"
THEN public."Inv_F_UomConvert"(COALESCE(s."OnHand", 0) - (d."CumBase" - d."DemandBase"), d."ProductUomId", d."UomId")
ELSE 0 END AS "Fill",
d."DemandQuantity" AS "Demand"
FROM d
LEFT JOIN s ON s."ProductId" = d."ProductId";
UPDATE "Inv_T_TransferLine" l SET "Quantity" = f."Fill" FROM tmp_inv_fill f WHERE f."Id" = l."Id";
v_all := NOT EXISTS (SELECT 1 FROM tmp_inv_fill WHERE "Fill" < "Demand");
v_any := EXISTS (SELECT 1 FROM tmp_inv_fill WHERE "Fill" > 0);
DROP TABLE tmp_inv_fill;
UPDATE "Inv_T_Transfer"
SET "Status" = CASE WHEN v_all OR (v_kind = 'Delivery' AND COALESCE(v_policy, 'Direct') = 'Direct' AND v_any) THEN 'Ready' ELSE 'Waiting' END
WHERE "Id" = p_id;
END;
$$;

View file

@ -0,0 +1,53 @@
-- Belgeden yeni belge açar. Backorder: talepten az yapılan satırların kalanı, aynı konumlarla; stok kontrolüyle Hazır/Bekleyen olur.
-- Return (İade): yapılan miktarlar lotlarıyla, kaynak ve hedef yer değiştirerek Taslak açılır. İkisi de onay durumunu ve bağları taşır.
CREATE OR REPLACE PROCEDURE public."Inv_P_TransferCopy"(p_source_id uuid, p_mode varchar, p_user_id uuid, INOUT p_new_id uuid DEFAULT NULL)
LANGUAGE plpgsql AS $$
DECLARE v_is_return boolean := p_mode = 'Return';
BEGIN
p_new_id := gen_random_uuid();
INSERT INTO "Inv_T_Transfer" ("Id", "TenantId", "BranchId", "WarehouseId", "OperationTypeId", "OperationKind", "PartnerId", "SourceLocationId", "DestinationLocationId",
"ScheduledDate", "SourceDocument", "PurchaseOrderId", "BackorderOfId", "ReturnOfId", "CarrierId", "ResponsibleUserId", "ProjectId", "DeliveryPolicy",
"Status", "SourceApproverUserNames", "ApprovalUserName", "ApprovalStatus", "ApprovalDate", "ApprovalDescription", "CreationTime", "CreatorId", "IsDeleted")
SELECT p_new_id, t."TenantId", t."BranchId", t."WarehouseId", t."OperationTypeId", t."OperationKind", t."PartnerId",
CASE WHEN v_is_return THEN t."DestinationLocationId" ELSE t."SourceLocationId" END,
CASE WHEN v_is_return THEN t."SourceLocationId" ELSE t."DestinationLocationId" END,
CASE WHEN v_is_return THEN NOW() AT TIME ZONE 'UTC' ELSE t."ScheduledDate" END,
CASE WHEN v_is_return THEN t."TransferNo" ELSE t."SourceDocument" END, t."PurchaseOrderId",
CASE WHEN v_is_return THEN NULL ELSE p_source_id END, CASE WHEN v_is_return THEN p_source_id END,
t."CarrierId", t."ResponsibleUserId", t."ProjectId", t."DeliveryPolicy",
'Draft', t."SourceApproverUserNames", t."ApprovalUserName", t."ApprovalStatus", t."ApprovalDate", t."ApprovalDescription", NOW() AT TIME ZONE 'UTC', p_user_id, false
FROM "Inv_T_Transfer" t
WHERE t."Id" = p_source_id;
DROP TABLE IF EXISTS tmp_inv_map;
CREATE TEMP TABLE tmp_inv_map AS
SELECT "Id" AS "OldId", gen_random_uuid() AS "NewId"
FROM "Inv_T_TransferLine"
WHERE "TransferId" = p_source_id AND "IsDeleted" = false
AND ((v_is_return AND "Quantity" > 0) OR (NOT v_is_return AND "Quantity" < "DemandQuantity"));
INSERT INTO "Inv_T_TransferLine" ("Id", "TenantId", "TransferId", "ProductId", "Description", "DemandQuantity", "Quantity", "UomId",
"PurchaseOrderLineId", "MaterialRequestItemId", "CreationTime", "CreatorId", "IsDeleted")
SELECT m."NewId", l."TenantId", p_new_id, l."ProductId", l."Description",
CASE WHEN v_is_return THEN l."Quantity" ELSE l."DemandQuantity" - l."Quantity" END, 0, l."UomId",
l."PurchaseOrderLineId", l."MaterialRequestItemId", NOW() AT TIME ZONE 'UTC', p_user_id, false
FROM "Inv_T_TransferLine" l
INNER JOIN tmp_inv_map m ON m."OldId" = l."Id";
IF v_is_return THEN
INSERT INTO "Inv_T_TransferLineLot" ("Id", "TenantId", "TransferLineId", "LotNo", "Quantity", "CreationTime", "CreatorId", "IsDeleted")
SELECT gen_random_uuid(), z."TenantId", m."NewId", z."LotNo", z."Quantity", NOW() AT TIME ZONE 'UTC', p_user_id, false
FROM "Inv_T_TransferLineLot" z
INNER JOIN tmp_inv_map m ON m."OldId" = z."TransferLineId"
WHERE z."IsDeleted" = false;
END IF;
DROP TABLE tmp_inv_map;
CALL public."Inv_P_TransferNumber"(p_new_id);
IF NOT v_is_return THEN
CALL public."Inv_P_TransferCheckAvailability"(p_new_id);
END IF;
CALL public."Inv_P_TransferRecalc"(p_new_id);
END;
$$;

View file

@ -0,0 +1,35 @@
-- Onaylanan satınalma siparişinden siparişin operasyon türünde Taslak alım açar: konumlar operasyon türünden, satırlar
-- siparişin envanter takipli kalemlerinin henüz alınmamış miktarıdır. Siparişin iptal olmayan alımı varsa yeni alım açılmaz.
CREATE OR REPLACE PROCEDURE public."Inv_P_TransferFromPurchaseOrder"(p_order_id uuid, p_user_id uuid DEFAULT NULL)
LANGUAGE plpgsql AS $$
DECLARE v_new uuid := gen_random_uuid(); v_count int;
BEGIN
IF EXISTS (SELECT 1 FROM "Inv_T_Transfer" WHERE "PurchaseOrderId" = p_order_id AND "IsDeleted" = false AND "Status" <> 'Cancelled') THEN
RETURN;
END IF;
INSERT INTO "Inv_T_Transfer" ("Id", "TenantId", "BranchId", "WarehouseId", "OperationTypeId", "OperationKind", "PartnerId", "SourceLocationId", "DestinationLocationId",
"ScheduledDate", "SourceDocument", "PurchaseOrderId", "ResponsibleUserId", "ProjectId", "Status", "CreationTime", "CreatorId", "IsDeleted")
SELECT v_new, o."TenantId", ot."BranchId", ot."WarehouseId", o."OperationTypeId", ot."OperationKind", o."SupplierId", ot."SourceLocationId", ot."DestinationLocationId",
COALESCE(o."ExpectedArrival", NOW() AT TIME ZONE 'UTC'), o."OrderNo", o."Id", o."BuyerUserId", o."ProjectId", 'Draft', NOW() AT TIME ZONE 'UTC', p_user_id, false
FROM "Prc_T_PurchaseOrder" o
INNER JOIN "Inv_T_OperationType" ot ON ot."Id" = o."OperationTypeId"
WHERE o."Id" = p_order_id
AND EXISTS (SELECT 1 FROM "Prc_T_PurchaseOrderLine" l
INNER JOIN "Inv_T_Product" p ON p."Id" = l."ProductId"
WHERE l."PurchaseOrderId" = o."Id" AND l."IsDeleted" = false AND p."TrackInventory" = true AND l."Quantity" > l."ReceivedQuantity");
GET DIAGNOSTICS v_count = ROW_COUNT;
IF v_count = 0 THEN
RETURN;
END IF;
INSERT INTO "Inv_T_TransferLine" ("Id", "TenantId", "TransferId", "ProductId", "Description", "DemandQuantity", "Quantity", "UomId", "PurchaseOrderLineId", "CreationTime", "CreatorId", "IsDeleted")
SELECT gen_random_uuid(), l."TenantId", v_new, l."ProductId", l."Description", l."Quantity" - l."ReceivedQuantity", 0, l."UomId", l."Id", NOW() AT TIME ZONE 'UTC', p_user_id, false
FROM "Prc_T_PurchaseOrderLine" l
INNER JOIN "Inv_T_Product" p ON p."Id" = l."ProductId"
WHERE l."PurchaseOrderId" = p_order_id AND l."IsDeleted" = false AND p."TrackInventory" = true AND l."Quantity" > l."ReceivedQuantity";
CALL public."Inv_P_TransferNumber"(v_new);
CALL public."Inv_P_TransferRecalc"(v_new);
END;
$$;

View file

@ -0,0 +1,21 @@
-- 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;
$$;

View file

@ -0,0 +1,19 @@
-- Hareket satırı kaydı sonrası: satırın araç çubuğu işlemi (GenerateLots = Lot/Seri Oluştur, AssignLots = Otomatik Ata) ve belge özeti.
CREATE OR REPLACE PROCEDURE public."Inv_P_TransferLineAfterSave"(p_id uuid, p_user_id uuid DEFAULT NULL)
LANGUAGE plpgsql AS $$
DECLARE v_act varchar(16); v_doc uuid;
BEGIN
SELECT "PendingAction", "TransferId" INTO v_act, v_doc FROM "Inv_T_TransferLine" WHERE "Id" = p_id;
IF v_act IS NOT NULL THEN
UPDATE "Inv_T_TransferLine" SET "PendingAction" = NULL WHERE "Id" = p_id;
IF v_act = 'GenerateLots' THEN
CALL public."Inv_P_TransferLineLotGenerate"(p_id, p_user_id);
ELSIF v_act = 'AssignLots' THEN
CALL public."Inv_P_TransferLineLotAssign"(p_id, p_user_id);
END IF;
END IF;
CALL public."Inv_P_TransferRecalc"(v_doc);
END;
$$;

View file

@ -0,0 +1,39 @@
-- Otomatik Ata: stoktan çıkan satırın lot dağılımını kaynak konumun stoğundan ilk giren ilk çıkar (InDate) sırasıyla yeniden kurar.
-- Stok yetmezse karşılanabilen kadar atanır; eksik Tamamla'da bildirilir.
CREATE OR REPLACE PROCEDURE public."Inv_P_TransferLineLotAssign"(p_id uuid, p_user_id uuid DEFAULT NULL)
LANGUAGE plpgsql AS $$
DECLARE v_tenant uuid; v_method varchar(16); v_src uuid; v_src_internal boolean; v_product uuid;
v_line_uom varchar(64); v_product_uom varchar(64); v_need numeric(18, 4);
BEGIN
SELECT l."TenantId", CASE WHEN p."TrackInventory" THEN p."TrackingMethod" END, t."SourceLocationId",
COALESCE(src."LocationType" = 'Internal', false), l."ProductId", l."UomId", p."UomId",
public."Inv_F_UomConvert"(CASE WHEN l."Quantity" > 0 THEN l."Quantity" ELSE l."DemandQuantity" END, l."UomId", p."UomId")
INTO v_tenant, v_method, v_src, v_src_internal, v_product, v_line_uom, v_product_uom, v_need
FROM "Inv_T_TransferLine" l
INNER JOIN "Inv_T_Transfer" t ON t."Id" = l."TransferId"
INNER JOIN "Inv_T_Product" p ON p."Id" = l."ProductId"
LEFT JOIN "Inv_T_Location" src ON src."Id" = t."SourceLocationId"
WHERE l."Id" = p_id;
IF COALESCE(v_method, '') NOT IN ('Lot', 'Serial') THEN
RAISE EXCEPTION 'Ürün lot/seri numarasıyla takip edilmiyor.' USING ERRCODE = 'P0001', DETAIL = '50314';
END IF;
IF NOT COALESCE(v_src_internal, false) THEN
RAISE EXCEPTION 'Otomatik atama yalnız stoktan çıkan satırda yapılır.' USING ERRCODE = 'P0001', DETAIL = '50317';
END IF;
UPDATE "Inv_T_TransferLineLot" SET "IsDeleted" = true, "DeletionTime" = NOW() AT TIME ZONE 'UTC', "DeleterId" = p_user_id
WHERE "TransferLineId" = p_id AND "IsDeleted" = false;
INSERT INTO "Inv_T_TransferLineLot" ("Id", "TenantId", "TransferLineId", "LotNo", "Quantity", "CreationTime", "CreatorId", "IsDeleted")
SELECT gen_random_uuid(), v_tenant, p_id, s."LotNo",
public."Inv_F_UomConvert"(LEAST(s."Quantity", v_need - s."Before"), v_product_uom, v_line_uom),
NOW() AT TIME ZONE 'UTC', p_user_id, false
FROM (SELECT "LotNo", "Quantity",
SUM("Quantity") OVER (ORDER BY "InDate", "LotNo" ROWS UNBOUNDED PRECEDING) - "Quantity" AS "Before"
FROM "Inv_T_Stock"
WHERE "LocationId" = v_src AND "ProductId" = v_product AND "LotNo" <> '' AND "Quantity" > 0
AND "TenantId" IS NOT DISTINCT FROM v_tenant) s
WHERE s."Before" < v_need;
END;
$$;

View file

@ -0,0 +1,46 @@
-- Lot/Seri Oluştur: stoğa giren satırın lot dağılımı olmayan kısmı için numaratörden lot (Inventory.LotNumber, tek lot) ya da
-- seri (Inventory.SerialNumber, birim başına bir seri) numarası üretir. Stoktan çıkan satırda lot stoktan seçilir (Otomatik Ata).
CREATE OR REPLACE PROCEDURE public."Inv_P_TransferLineLotGenerate"(p_id uuid, p_user_id uuid DEFAULT NULL)
LANGUAGE plpgsql AS $$
DECLARE v_tenant uuid; v_method varchar(16); v_quantity numeric(18, 4); v_remain numeric(18, 4); v_src_internal boolean; v_no varchar(128);
BEGIN
SELECT l."TenantId", CASE WHEN p."TrackInventory" THEN p."TrackingMethod" END,
CASE WHEN l."Quantity" > 0 THEN l."Quantity" ELSE l."DemandQuantity" END,
COALESCE(src."LocationType" = 'Internal', false)
INTO v_tenant, v_method, v_quantity, v_src_internal
FROM "Inv_T_TransferLine" l
INNER JOIN "Inv_T_Transfer" t ON t."Id" = l."TransferId"
INNER JOIN "Inv_T_Product" p ON p."Id" = l."ProductId"
LEFT JOIN "Inv_T_Location" src ON src."Id" = t."SourceLocationId"
WHERE l."Id" = p_id;
IF COALESCE(v_method, '') NOT IN ('Lot', 'Serial') THEN
RAISE EXCEPTION 'Ürün lot/seri numarasıyla takip edilmiyor.' USING ERRCODE = 'P0001', DETAIL = '50314';
END IF;
IF v_src_internal THEN
RAISE EXCEPTION 'Stoktan çıkan satırda lot oluşturulmaz; Otomatik Ata ile stoktaki lotlar seçilir.' USING ERRCODE = 'P0001', DETAIL = '50315';
END IF;
v_remain := v_quantity - COALESCE((SELECT SUM("Quantity") FROM "Inv_T_TransferLineLot" WHERE "TransferLineId" = p_id AND "IsDeleted" = false), 0);
IF v_remain <= 0 THEN
RETURN;
END IF;
IF v_method = 'Lot' THEN
CALL public."Adm_P_SequenceNext"('Inventory.LotNumber', v_tenant, v_no);
INSERT INTO "Inv_T_TransferLineLot" ("Id", "TenantId", "TransferLineId", "LotNo", "Quantity", "CreationTime", "CreatorId", "IsDeleted")
VALUES (gen_random_uuid(), v_tenant, p_id, left(v_no, 64), v_remain, NOW() AT TIME ZONE 'UTC', p_user_id, false);
RETURN;
END IF;
IF v_remain <> floor(v_remain) THEN
RAISE EXCEPTION 'Seri numaralı üründe miktar tam sayı olmalıdır.' USING ERRCODE = 'P0001', DETAIL = '50316';
END IF;
WHILE v_remain > 0 LOOP
CALL public."Adm_P_SequenceNext"('Inventory.SerialNumber', v_tenant, v_no);
INSERT INTO "Inv_T_TransferLineLot" ("Id", "TenantId", "TransferLineId", "LotNo", "Quantity", "CreationTime", "CreatorId", "IsDeleted")
VALUES (gen_random_uuid(), v_tenant, p_id, left(v_no, 64), 1, NOW() AT TIME ZONE 'UTC', p_user_id, false);
v_remain := v_remain - 1;
END LOOP;
END;
$$;

View file

@ -0,0 +1,55 @@
-- Stoktan Lot Seçimi (App.Inventory.TransferLineLotStock) satır kaydı: yazılan miktar varsa o, yoksa Seç işaretliyse lotun
-- eldeki miktarı atanır (ekranda Seç aynı değeri yazar); ikisi de yoksa lot satırdan çıkar. Batch kaydı her satırı ayrı ve
-- eşzamanlı istekle gönderir; aynı satırın lotları üst üste yazılmasın diye hareket satırı kilitlenip istekler sırayla işlenir.
CREATE OR REPLACE PROCEDURE public."Inv_P_TransferLineLotStockSave"(
p_id varchar,
p_is_selected boolean DEFAULT NULL,
p_selected_quantity numeric(18, 4) DEFAULT NULL,
p_last_modifier_id uuid DEFAULT NULL
)
LANGUAGE plpgsql AS $$
DECLARE v_line uuid := CAST(left(p_id, 36) AS uuid); v_stock uuid := CAST(substr(p_id, 38, 36) AS uuid);
v_tenant uuid; v_doc uuid; v_status varchar(16); v_lot varchar(64); v_on_hand numeric(18, 4); v_qty numeric(18, 4);
BEGIN
SELECT l."TenantId", l."TransferId"
INTO v_tenant, v_doc
FROM "Inv_T_TransferLine" l
WHERE l."Id" = v_line
FOR UPDATE;
SELECT t."Status", s."LotNo", public."Inv_F_UomConvert"(s."Quantity", s."UomId", l."UomId")
INTO v_status, v_lot, v_on_hand
FROM "Inv_T_TransferLine" l
INNER JOIN "Inv_T_Transfer" t ON t."Id" = l."TransferId"
INNER JOIN "Inv_T_Stock" s ON s."Id" = v_stock AND s."LocationId" = t."SourceLocationId" AND s."ProductId" = l."ProductId"
WHERE l."Id" = v_line;
IF v_lot IS NULL THEN
RAISE EXCEPTION 'Lot, belgenin kaynak konumunda bulunamadı.' USING ERRCODE = 'P0001', DETAIL = '50322';
END IF;
IF v_status IN ('Done', 'Cancelled') THEN
RAISE EXCEPTION 'Tamamlanmış ya da iptal edilmiş belgenin satırı değiştirilemez.' USING ERRCODE = 'P0001', DETAIL = '50313';
END IF;
IF COALESCE(p_selected_quantity, 0) > 0 THEN
v_qty := p_selected_quantity;
ELSIF p_is_selected THEN
v_qty := v_on_hand;
ELSE
v_qty := 0;
END IF;
IF v_qty > v_on_hand THEN
RAISE EXCEPTION 'Seçilen miktar lotun eldeki miktarını aşamaz.' USING ERRCODE = 'P0001', DETAIL = '50324';
END IF;
UPDATE "Inv_T_TransferLineLot" SET "IsDeleted" = true, "DeletionTime" = NOW() AT TIME ZONE 'UTC', "DeleterId" = p_last_modifier_id
WHERE "TransferLineId" = v_line AND "LotNo" = v_lot AND "IsDeleted" = false;
IF v_qty > 0 THEN
INSERT INTO "Inv_T_TransferLineLot" ("Id", "TenantId", "TransferLineId", "LotNo", "Quantity", "CreationTime", "CreatorId", "IsDeleted")
VALUES (gen_random_uuid(), v_tenant, v_line, v_lot, v_qty, NOW() AT TIME ZONE 'UTC', p_last_modifier_id, false);
END IF;
CALL public."Inv_P_TransferRecalc"(v_doc);
END;
$$;

View file

@ -0,0 +1,17 @@
-- Numarası olmayan transfer belgesine operasyon türünün numaratöründen (Inv_T_OperationType.SequenceName) numara verir.
CREATE OR REPLACE PROCEDURE public."Inv_P_TransferNumber"(p_id uuid)
LANGUAGE plpgsql AS $$
DECLARE v_seq varchar(128); v_tenant uuid; v_no varchar(128);
BEGIN
SELECT ot."SequenceName", t."TenantId" INTO v_seq, v_tenant
FROM "Inv_T_Transfer" t
INNER JOIN "Inv_T_OperationType" ot ON ot."Id" = t."OperationTypeId"
WHERE t."Id" = p_id AND t."TransferNo" IS NULL;
IF v_seq IS NULL THEN
RETURN;
END IF;
CALL public."Adm_P_SequenceNext"(v_seq, v_tenant, v_no);
UPDATE "Inv_T_Transfer" SET "TransferNo" = left(v_no, 32) WHERE "Id" = p_id;
END;
$$;

View file

@ -0,0 +1,43 @@
-- Belgenin ağırlığını (ürün ağırlığı × miktar, ürün biriminde) ve yazdırılan satır özetini yeniler; satırın takip yöntemini
-- (Lot/Serial, envanter takibi kapalıysa boş) üründen, lotun stoktan seçilip seçilmeyeceğini (kaynak iç konum) belgeden yazar —
-- satırın Lot/Seri butonları ve açılan lot ekranı bu iki kolona göre belirlenir. Lot/seri takipli satırda lot girilmişse yapılan
-- miktar lot toplamıdır (lot seçmek o kadar teslim etmektir) ve seçilen lotlar satırın LotNumbers kolonunda listelenir.
-- Özet satırı: [Referans] Ürün: talep / yapılan birim · lot (miktar), ...
CREATE OR REPLACE PROCEDURE public."Inv_P_TransferRecalc"(p_id uuid)
LANGUAGE plpgsql AS $$
BEGIN
UPDATE "Inv_T_TransferLine" l SET "TrackingMethod" = CASE WHEN p."TrackInventory" AND p."TrackingMethod" IN ('Lot', 'Serial') THEN p."TrackingMethod" END,
"LotFromStock" = COALESCE(src."LocationType" = 'Internal', false)
FROM "Inv_T_Product" p, "Inv_T_Transfer" t
LEFT JOIN "Inv_T_Location" src ON src."Id" = t."SourceLocationId"
WHERE p."Id" = l."ProductId" AND t."Id" = l."TransferId" AND l."TransferId" = p_id AND l."IsDeleted" = false;
UPDATE "Inv_T_TransferLine" l SET
"Quantity" = CASE WHEN t."Status" IN ('Done', 'Cancelled') THEN l."Quantity"
ELSE COALESCE((SELECT SUM(lt."Quantity") FROM "Inv_T_TransferLineLot" lt
WHERE lt."TransferLineId" = l."Id" AND lt."IsDeleted" = false), l."Quantity") END,
"LotNumbers" = (SELECT string_agg(CASE WHEN l."TrackingMethod" = 'Serial' THEN lt."LotNo"
ELSE lt."LotNo" || ' (' || rtrim(rtrim(lt."Quantity"::text, '0'), '.') || ')' END, ', ' ORDER BY lt."LotNo")
FROM "Inv_T_TransferLineLot" lt
WHERE lt."TransferLineId" = l."Id" AND lt."IsDeleted" = false)
FROM "Inv_T_Transfer" t
WHERE t."Id" = l."TransferId" AND l."TransferId" = p_id AND l."IsDeleted" = false AND l."TrackingMethod" IN ('Lot', 'Serial');
UPDATE "Inv_T_Transfer" t SET
"Weight" = COALESCE((SELECT SUM(public."Inv_F_UomConvert"(CASE WHEN l."Quantity" > 0 THEN l."Quantity" ELSE l."DemandQuantity" END, l."UomId", p."UomId") * COALESCE(p."Weight", 0))
FROM "Inv_T_TransferLine" l
INNER JOIN "Inv_T_Product" p ON p."Id" = l."ProductId"
WHERE l."TransferId" = p_id AND l."IsDeleted" = false), 0),
"LineSummary" = (SELECT string_agg(
CASE WHEN COALESCE(p."InternalReference", '') = '' THEN '' ELSE '[' || p."InternalReference" || '] ' END || p."Name" || ': ' ||
rtrim(rtrim(l."DemandQuantity"::text, '0'), '.') || ' / ' || rtrim(rtrim(l."Quantity"::text, '0'), '.') || ' ' || l."UomId" ||
COALESCE(' · ' || (SELECT string_agg(lt."LotNo" || ' (' || rtrim(rtrim(lt."Quantity"::text, '0'), '.') || ')', ', ' ORDER BY lt."CreationTime", lt."Id")
FROM "Inv_T_TransferLineLot" lt
WHERE lt."TransferLineId" = l."Id" AND lt."IsDeleted" = false), ''),
E'\n' ORDER BY l."CreationTime", l."Id")
FROM "Inv_T_TransferLine" l
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;
END;
$$;

View file

@ -0,0 +1,59 @@
-- Transfer belgesinin durum butonları: Confirm (Hazırla, taslakta), Check (Hazırla, bekleyende), Validate (Tamamla), Cancel (İptal Et), Return (İade Et).
CREATE OR REPLACE PROCEDURE public."Inv_P_TransferSetStatus"(p_id uuid, p_action varchar, p_user_id uuid DEFAULT NULL)
LANGUAGE plpgsql AS $$
DECLARE v_status varchar(16); v_kind varchar(32); v_approval varchar(50); v_src uuid; v_dst uuid; v_new uuid;
BEGIN
SELECT "Status", "OperationKind", "ApprovalStatus", "SourceLocationId", "DestinationLocationId"
INTO v_status, v_kind, v_approval, v_src, v_dst
FROM "Inv_T_Transfer" WHERE "Id" = p_id;
UPDATE "Inv_T_Transfer" SET "PendingAction" = NULL WHERE "Id" = p_id;
-- İç transfer depo içinde taşımadır: iki uç da stok tutan iç konum ve birbirinden farklı olmalı (dış konuma giden mal stoktan düşer, hiçbir yere girmez).
-- İade belgesi muaftır: yanlışlıkla dış konuma yapılmış transfer İade Et ile geri alınabilmeli.
IF v_kind = 'InternalTransfer' AND p_action IN ('Confirm', 'Check', 'Validate')
AND NOT EXISTS (SELECT 1 FROM "Inv_T_Transfer" WHERE "Id" = p_id AND "ReturnOfId" IS NOT NULL) THEN
IF v_src = v_dst THEN
RAISE EXCEPTION 'Kaynak ve hedef konum aynı olamaz.' USING ERRCODE = 'P0001', DETAIL = '50325';
END IF;
IF EXISTS (SELECT 1 FROM "Inv_T_Location" WHERE "Id" IN (v_src, v_dst) AND "LocationType" <> 'Internal') THEN
RAISE EXCEPTION 'İç transferde kaynak ve hedef konum iç konum olmalıdır.' USING ERRCODE = 'P0001', DETAIL = '50326';
END IF;
END IF;
IF p_action = 'Confirm' THEN
IF v_status <> 'Draft' THEN
RAISE EXCEPTION 'Yalnız taslak belge hazırlanabilir.' USING ERRCODE = 'P0001', DETAIL = '50301';
END IF;
IF NOT EXISTS (SELECT 1 FROM "Inv_T_TransferLine" WHERE "TransferId" = p_id AND "IsDeleted" = false) THEN
RAISE EXCEPTION 'Ürün satırı olmayan belge hazırlanamaz.' USING ERRCODE = 'P0001', DETAIL = '50302';
END IF;
IF v_src IS NULL OR v_dst IS NULL THEN
RAISE EXCEPTION 'Kaynak ve hedef konum seçilmelidir.' USING ERRCODE = 'P0001', DETAIL = '50303';
END IF;
IF v_kind = 'InternalTransfer' AND COALESCE(v_approval, '') NOT IN ('Onaylandı', 'Onay Gerekmez') THEN
RAISE EXCEPTION 'Kaynak depo onayı tamamlanmadan iç transfer hazırlanamaz.' USING ERRCODE = 'P0001', DETAIL = '50304';
END IF;
CALL public."Inv_P_TransferCheckAvailability"(p_id);
ELSIF p_action = 'Check' THEN
IF v_status NOT IN ('Waiting', 'Ready') THEN
RAISE EXCEPTION 'Stok kontrolü yalnız bekleyen ya da hazır belgede yapılır.' USING ERRCODE = 'P0001', DETAIL = '50305';
END IF;
CALL public."Inv_P_TransferCheckAvailability"(p_id);
ELSIF p_action = 'Validate' THEN
IF v_status <> 'Ready' THEN
RAISE EXCEPTION 'Yalnız hazır belge tamamlanabilir.' USING ERRCODE = 'P0001', DETAIL = '50306';
END IF;
CALL public."Inv_P_TransferValidate"(p_id, p_user_id);
ELSIF p_action = 'Cancel' THEN
IF v_status IN ('Done', 'Cancelled') THEN
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;
ELSIF p_action = 'Return' THEN
IF v_status <> 'Done' THEN
RAISE EXCEPTION 'Yalnız tamamlanmış belge iade edilebilir.' USING ERRCODE = 'P0001', DETAIL = '50308';
END IF;
CALL public."Inv_P_TransferCopy"(p_id, 'Return', p_user_id, v_new);
END IF;
END;
$$;

View file

@ -0,0 +1,135 @@
-- 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).
-- 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 $$
DECLARE v_tenant uuid; v_status varchar(16); v_kind varchar(32); v_return_of uuid; v_src uuid; v_dst uuid;
v_src_internal boolean := false; v_dst_internal boolean := false; v_dst_branch uuid; v_dst_warehouse uuid;
v_sign int; v_new uuid; v_now timestamp := NOW() AT TIME ZONE 'UTC'; v_msg varchar(512);
BEGIN
SELECT "TenantId", "Status", "OperationKind", "ReturnOfId", "SourceLocationId", "DestinationLocationId"
INTO v_tenant, v_status, v_kind, v_return_of, v_src, v_dst
FROM "Inv_T_Transfer" WHERE "Id" = p_id
FOR UPDATE;
IF v_status <> 'Ready' THEN
RAISE EXCEPTION 'Yalnız hazır belge tamamlanabilir.' USING ERRCODE = 'P0001', DETAIL = '50306';
END IF;
v_sign := CASE WHEN v_return_of IS NULL THEN 1 ELSE -1 END;
SELECT "LocationType" = 'Internal' INTO v_src_internal FROM "Inv_T_Location" WHERE "Id" = v_src;
SELECT "LocationType" = 'Internal', "BranchId", "WarehouseId" INTO v_dst_internal, v_dst_branch, v_dst_warehouse
FROM "Inv_T_Location" WHERE "Id" = v_dst;
v_src_internal := COALESCE(v_src_internal, false);
v_dst_internal := COALESCE(v_dst_internal, false);
IF NOT EXISTS (SELECT 1 FROM "Inv_T_TransferLine" WHERE "TransferId" = p_id AND "IsDeleted" = false AND "Quantity" > 0) THEN
RAISE EXCEPTION 'Yapılan miktarı girilmiş satır yok.' USING ERRCODE = 'P0001', DETAIL = '50309';
END IF;
SELECT p."Name" || ': lot/seri toplamı ' || rtrim(rtrim(z.q::text, '0'), '.') || ', yapılan miktar ' || rtrim(rtrim(l."Quantity"::text, '0'), '.') INTO v_msg
FROM "Inv_T_TransferLine" l
INNER JOIN "Inv_T_Product" p ON p."Id" = l."ProductId"
CROSS JOIN LATERAL (SELECT COALESCE(SUM(lt."Quantity"), 0) AS q FROM "Inv_T_TransferLineLot" lt WHERE lt."TransferLineId" = l."Id" AND lt."IsDeleted" = false) z
WHERE l."TransferId" = p_id AND l."IsDeleted" = false AND l."Quantity" > 0 AND p."TrackInventory" = true AND p."TrackingMethod" IN ('Lot', 'Serial')
AND z.q <> l."Quantity"
LIMIT 1;
IF v_msg IS NOT NULL THEN
RAISE EXCEPTION 'Lot/seri miktarı yapılan miktara eşit değil — %', v_msg USING ERRCODE = 'P0001', DETAIL = '50310';
END IF;
SELECT p."Name" || ' / ' || z."LotNo" INTO v_msg
FROM "Inv_T_TransferLineLot" z
INNER JOIN "Inv_T_TransferLine" l ON l."Id" = z."TransferLineId"
INNER JOIN "Inv_T_Product" p ON p."Id" = l."ProductId"
WHERE l."TransferId" = p_id AND l."IsDeleted" = false AND z."IsDeleted" = false AND p."TrackingMethod" = 'Serial'
AND (z."Quantity" <> 1 OR EXISTS (SELECT 1 FROM "Inv_T_TransferLineLot" z2
INNER JOIN "Inv_T_TransferLine" l2 ON l2."Id" = z2."TransferLineId"
WHERE l2."TransferId" = p_id AND l2."IsDeleted" = false AND z2."IsDeleted" = false
AND l2."ProductId" = l."ProductId" AND z2."LotNo" = z."LotNo" AND z2."Id" <> z."Id"))
LIMIT 1;
IF v_msg IS NOT NULL THEN
RAISE EXCEPTION 'Seri numaralı üründe her seri 1 adet ve tekil olmalıdır: %', v_msg USING ERRCODE = 'P0001', DETAIL = '50311';
END IF;
-- Stoğa işlenecek hareket: ürün × lot, ürün biriminde.
DROP TABLE IF EXISTS tmp_inv_move;
CREATE TEMP TABLE tmp_inv_move AS
SELECT m."ProductId", m."LotNo", SUM(m."Quantity") AS "Quantity", m."UomId"
FROM (SELECT l."ProductId", p."UomId",
CASE WHEN p."TrackingMethod" IN ('Lot', 'Serial') THEN z."LotNo" ELSE '' END AS "LotNo",
public."Inv_F_UomConvert"(CASE WHEN p."TrackingMethod" IN ('Lot', 'Serial') THEN z."Quantity" ELSE l."Quantity" END, l."UomId", p."UomId") AS "Quantity"
FROM "Inv_T_TransferLine" l
INNER JOIN "Inv_T_Product" p ON p."Id" = l."ProductId"
LEFT JOIN "Inv_T_TransferLineLot" z ON z."TransferLineId" = l."Id" AND z."IsDeleted" = false AND p."TrackingMethod" IN ('Lot', 'Serial')
WHERE l."TransferId" = p_id AND l."IsDeleted" = false AND l."Quantity" > 0 AND p."TrackInventory" = true) m
GROUP BY m."ProductId", m."LotNo", m."UomId";
IF v_src_internal THEN
PERFORM 1 FROM "Inv_T_Stock" s
WHERE s."LocationId" = v_src AND s."TenantId" IS NOT DISTINCT FROM v_tenant
AND (s."ProductId", s."LotNo") IN (SELECT "ProductId", "LotNo" FROM tmp_inv_move)
FOR UPDATE;
SELECT p."Name" || CASE WHEN m."LotNo" = '' THEN '' ELSE ' / ' || m."LotNo" END INTO v_msg
FROM tmp_inv_move m
INNER JOIN "Inv_T_Product" p ON p."Id" = m."ProductId"
LEFT JOIN "Inv_T_Stock" s ON s."LocationId" = v_src AND s."ProductId" = m."ProductId" AND s."LotNo" = m."LotNo"
AND s."TenantId" IS NOT DISTINCT FROM v_tenant
WHERE COALESCE(s."Quantity", 0) < m."Quantity"
LIMIT 1;
IF v_msg IS NOT NULL THEN
RAISE EXCEPTION 'Kaynak konumda yeterli stok yok: %', v_msg USING ERRCODE = 'P0001', DETAIL = '50312';
END IF;
UPDATE "Inv_T_Stock" s SET "Quantity" = s."Quantity" - m."Quantity", "LastMoveDate" = v_now, "LastModificationTime" = v_now, "LastModifierId" = p_user_id
FROM tmp_inv_move m
WHERE m."ProductId" = s."ProductId" AND m."LotNo" = s."LotNo" AND s."LocationId" = v_src AND s."TenantId" IS NOT DISTINCT FROM v_tenant;
END IF;
IF v_dst_internal THEN
UPDATE "Inv_T_Stock" s SET "Quantity" = s."Quantity" + m."Quantity", "LastMoveDate" = v_now, "LastModificationTime" = v_now, "LastModifierId" = p_user_id,
"InDate" = CASE WHEN s."Quantity" <= 0 THEN v_now ELSE s."InDate" END
FROM tmp_inv_move m
WHERE m."ProductId" = s."ProductId" AND m."LotNo" = s."LotNo" AND s."LocationId" = v_dst AND s."TenantId" IS NOT DISTINCT FROM v_tenant;
INSERT INTO "Inv_T_Stock" ("Id", "TenantId", "BranchId", "WarehouseId", "LocationId", "ProductId", "LotNo", "Quantity", "UomId", "InDate", "LastMoveDate", "CreationTime", "CreatorId", "IsDeleted")
SELECT gen_random_uuid(), v_tenant, v_dst_branch, v_dst_warehouse, v_dst, m."ProductId", m."LotNo", m."Quantity", m."UomId", v_now, v_now, v_now, p_user_id, false
FROM tmp_inv_move m
WHERE NOT EXISTS (SELECT 1 FROM "Inv_T_Stock" s
WHERE s."LocationId" = v_dst AND s."ProductId" = m."ProductId" AND s."LotNo" = m."LotNo"
AND s."TenantId" IS NOT DISTINCT FROM v_tenant);
END IF;
DROP TABLE tmp_inv_move;
UPDATE "Inv_T_Transfer"
SET "Status" = 'Done', "EffectiveDate" = v_now,
"ReceivedByUserId" = CASE WHEN v_kind = 'InternalTransfer' THEN p_user_id ELSE "ReceivedByUserId" END,
"ReceivedDate" = CASE WHEN v_kind = 'InternalTransfer' THEN v_now ELSE "ReceivedDate" END
WHERE "Id" = p_id;
UPDATE "Prc_T_PurchaseOrderLine" ol SET "ReceivedQuantity" = ol."ReceivedQuantity" + v_sign * x."Quantity"
FROM (SELECT l."PurchaseOrderLineId", SUM(public."Inv_F_UomConvert"(l."Quantity", l."UomId", pl."UomId")) AS "Quantity"
FROM "Inv_T_TransferLine" l
INNER JOIN "Prc_T_PurchaseOrderLine" pl ON pl."Id" = l."PurchaseOrderLineId"
WHERE l."TransferId" = p_id AND l."IsDeleted" = false AND l."Quantity" > 0
GROUP BY l."PurchaseOrderLineId") x
WHERE x."PurchaseOrderLineId" = ol."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
FROM (SELECT l."MaterialRequestItemId", SUM(public."Inv_F_UomConvert"(l."Quantity", l."UomId", mi."UomId")) AS "Quantity"
FROM "Inv_T_TransferLine" l
INNER JOIN "Prc_T_MaterialRequestItem" mi ON mi."Id" = l."MaterialRequestItemId"
WHERE l."TransferId" = p_id AND l."IsDeleted" = false AND l."Quantity" > 0
GROUP BY l."MaterialRequestItemId") x
WHERE x."MaterialRequestItemId" = i."Id";
IF v_return_of IS NULL AND EXISTS (SELECT 1 FROM "Inv_T_TransferLine" WHERE "TransferId" = p_id AND "IsDeleted" = false AND "Quantity" < "DemandQuantity") THEN
CALL public."Inv_P_TransferCopy"(p_id, 'Backorder', p_user_id, v_new);
END IF;
CALL public."Inv_P_TransferRecalc"(p_id);
END;
$$;

View file

@ -9,7 +9,7 @@ CREATE TABLE IF NOT EXISTS public."Inv_T_Location"
"Name" varchar(128) NOT NULL, "Name" varchar(128) NOT NULL,
"LocationType" varchar(16) NOT NULL DEFAULT 'Internal', "LocationType" varchar(16) NOT NULL DEFAULT 'Internal',
"DepartmentId" uuid NULL, "DepartmentId" uuid NULL,
"ResponsibleUserId" uuid NULL, "ResponsibleUserName" varchar(256) NULL,
"IsActive" boolean NOT NULL DEFAULT TRUE, "IsActive" boolean NOT NULL DEFAULT TRUE,
"CreationTime" timestamp NOT NULL DEFAULT (NOW() AT TIME ZONE 'UTC'), "CreationTime" timestamp NOT NULL DEFAULT (NOW() AT TIME ZONE 'UTC'),
"CreatorId" uuid NULL, "CreatorId" uuid NULL,

View file

@ -6,7 +6,7 @@ CREATE TABLE IF NOT EXISTS public."Inv_T_OperationType"
"WarehouseId" uuid NOT NULL, "WarehouseId" uuid NOT NULL,
"Name" varchar(128) NOT NULL, "Name" varchar(128) NOT NULL,
"OperationKind" varchar(32) NOT NULL DEFAULT 'Receipt', "OperationKind" varchar(32) NOT NULL DEFAULT 'Receipt',
"SequencePrefix" varchar(16) NULL, "SequenceName" varchar(128) NOT NULL,
"Barcode" varchar(64) NULL, "Barcode" varchar(64) NULL,
"SourceLocationId" uuid NULL, "SourceLocationId" uuid NULL,
"DestinationLocationId" uuid NULL, "DestinationLocationId" uuid NULL,

View file

@ -0,0 +1,49 @@
-- Şube × depo × konum × ürün × lot bakiyesi (ürün biriminde). Yalnız Tamamla yordamı (Inv_P_TransferValidate) yazar.
CREATE TABLE IF NOT EXISTS public."Inv_T_Stock"
(
"Id" uuid NOT NULL DEFAULT gen_random_uuid(),
"TenantId" uuid NULL,
"BranchId" uuid NOT NULL,
"WarehouseId" uuid NOT NULL,
"LocationId" uuid NOT NULL,
"ProductId" uuid NOT NULL,
"LotNo" varchar(64) NOT NULL DEFAULT '',
"Quantity" numeric(18, 4) NOT NULL DEFAULT 0,
"UomId" varchar(64) NOT NULL DEFAULT 'Adet',
"InDate" timestamp NULL,
"LastMoveDate" timestamp NULL,
"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_Inv_T_Stock" PRIMARY KEY ("Id")
);
DO $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'UQ_Inv_T_Stock_TenantId_LocationId_ProductId_LotNo') THEN
ALTER TABLE public."Inv_T_Stock" ADD CONSTRAINT "UQ_Inv_T_Stock_TenantId_LocationId_ProductId_LotNo" UNIQUE ("TenantId", "LocationId", "ProductId", "LotNo");
END IF;
END
$$;
CREATE INDEX IF NOT EXISTS "IX_Inv_T_Stock_ProductId" ON public."Inv_T_Stock" ("ProductId");
DO $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'FK_Inv_T_Stock_BranchId') THEN
ALTER TABLE public."Inv_T_Stock" ADD CONSTRAINT "FK_Inv_T_Stock_BranchId" FOREIGN KEY ("BranchId") REFERENCES public."Sas_T_Branch" ("Id") ON DELETE NO ACTION ON UPDATE NO ACTION;
END IF;
END
$$;
DO $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'FK_Inv_T_Stock_LocationId') THEN
ALTER TABLE public."Inv_T_Stock" ADD CONSTRAINT "FK_Inv_T_Stock_LocationId" FOREIGN KEY ("LocationId") REFERENCES public."Inv_T_Location" ("Id") ON DELETE NO ACTION ON UPDATE NO ACTION;
END IF;
END
$$;

View file

@ -0,0 +1,84 @@
-- Envanter hareket belgesi: Alım, Teslimat, İç Transfer (ve sonra Üretim) aynı başlık tablosunu paylaşır; tür OperationKind ile ayrılır.
CREATE TABLE IF NOT EXISTS public."Inv_T_Transfer"
(
"Id" uuid NOT NULL DEFAULT gen_random_uuid(),
"TenantId" uuid NULL,
"TransferNo" varchar(32) NULL,
"BranchId" uuid NOT NULL,
"WarehouseId" uuid NOT NULL,
"OperationTypeId" uuid NOT NULL,
"OperationKind" varchar(32) NOT NULL DEFAULT 'Receipt',
"PartnerId" uuid NULL,
"SourceLocationId" uuid NULL,
"DestinationLocationId" uuid NULL,
"ScheduledDate" timestamp NOT NULL DEFAULT (NOW() AT TIME ZONE 'UTC'),
"EffectiveDate" timestamp NULL,
"SourceDocument" varchar(128) NULL,
"PurchaseOrderId" uuid NULL,
"BackorderOfId" uuid NULL,
"ReturnOfId" uuid NULL,
"CarrierId" uuid NULL,
"TrackingReference" varchar(128) NULL,
"Weight" numeric(18, 4) NOT NULL DEFAULT 0,
"ShippingWeight" numeric(18, 4) NOT NULL DEFAULT 0,
"ResponsibleUserId" uuid NULL,
"ProjectId" uuid NULL,
"DeliveryPolicy" varchar(16) NULL,
"Note" text NULL,
"LineSummary" text NULL,
"Status" varchar(16) NOT NULL DEFAULT 'Draft',
"PendingAction" varchar(16) NULL,
"SourceApproverUserNames" varchar(512) NULL,
"ApprovalUserName" varchar(256) NULL,
"ApprovalStatus" varchar(50) NULL,
"ApprovalDate" timestamp NULL,
"ApprovalDescription" varchar(200) NULL,
"ReceivedByUserId" uuid NULL,
"ReceivedDate" timestamp NULL,
"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_Inv_T_Transfer" PRIMARY KEY ("Id")
);
CREATE INDEX IF NOT EXISTS "IX_Inv_T_Transfer_TenantId_OperationKind_Status" ON public."Inv_T_Transfer" ("TenantId", "OperationKind", "Status");
CREATE INDEX IF NOT EXISTS "IX_Inv_T_Transfer_OperationTypeId" ON public."Inv_T_Transfer" ("OperationTypeId");
CREATE INDEX IF NOT EXISTS "IX_Inv_T_Transfer_PurchaseOrderId" ON public."Inv_T_Transfer" ("PurchaseOrderId");
DO $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'FK_Inv_T_Transfer_BranchId') THEN
ALTER TABLE public."Inv_T_Transfer" ADD CONSTRAINT "FK_Inv_T_Transfer_BranchId" FOREIGN KEY ("BranchId") REFERENCES public."Sas_T_Branch" ("Id") ON DELETE NO ACTION ON UPDATE NO ACTION;
END IF;
END
$$;
DO $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'FK_Inv_T_Transfer_OperationTypeId') THEN
ALTER TABLE public."Inv_T_Transfer" ADD CONSTRAINT "FK_Inv_T_Transfer_OperationTypeId" FOREIGN KEY ("OperationTypeId") REFERENCES public."Inv_T_OperationType" ("Id") ON DELETE NO ACTION ON UPDATE NO ACTION;
END IF;
END
$$;
DO $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'FK_Inv_T_Transfer_SourceLocationId') THEN
ALTER TABLE public."Inv_T_Transfer" ADD CONSTRAINT "FK_Inv_T_Transfer_SourceLocationId" FOREIGN KEY ("SourceLocationId") REFERENCES public."Inv_T_Location" ("Id") ON DELETE NO ACTION ON UPDATE NO ACTION;
END IF;
END
$$;
DO $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'FK_Inv_T_Transfer_DestinationLocationId') THEN
ALTER TABLE public."Inv_T_Transfer" ADD CONSTRAINT "FK_Inv_T_Transfer_DestinationLocationId" FOREIGN KEY ("DestinationLocationId") REFERENCES public."Inv_T_Location" ("Id") ON DELETE NO ACTION ON UPDATE NO ACTION;
END IF;
END
$$;

View file

@ -0,0 +1,35 @@
CREATE TABLE IF NOT EXISTS public."Inv_T_TransferLine"
(
"Id" uuid NOT NULL DEFAULT gen_random_uuid(),
"TenantId" uuid NULL,
"TransferId" uuid NOT NULL,
"ProductId" uuid NOT NULL,
"Description" varchar(512) NULL,
"DemandQuantity" numeric(18, 4) NOT NULL DEFAULT 1,
"Quantity" numeric(18, 4) NOT NULL DEFAULT 0,
"UomId" varchar(64) NOT NULL DEFAULT 'Adet',
"PurchaseOrderLineId" uuid NULL,
"MaterialRequestItemId" uuid NULL,
"PendingAction" varchar(16) NULL,
"TrackingMethod" varchar(16) NULL,
"LotFromStock" boolean NOT NULL DEFAULT FALSE,
"LotNumbers" text NULL,
"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_Inv_T_TransferLine" PRIMARY KEY ("Id")
);
CREATE INDEX IF NOT EXISTS "IX_Inv_T_TransferLine_TransferId" ON public."Inv_T_TransferLine" ("TransferId");
DO $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'FK_Inv_T_TransferLine_TransferId') THEN
ALTER TABLE public."Inv_T_TransferLine" ADD CONSTRAINT "FK_Inv_T_TransferLine_TransferId" FOREIGN KEY ("TransferId") REFERENCES public."Inv_T_Transfer" ("Id") ON DELETE CASCADE ON UPDATE NO ACTION;
END IF;
END
$$;

View file

@ -0,0 +1,27 @@
-- Hareket satırının lot/seri dağılımı; miktar satırın biriminde tutulur.
CREATE TABLE IF NOT EXISTS public."Inv_T_TransferLineLot"
(
"Id" uuid NOT NULL DEFAULT gen_random_uuid(),
"TenantId" uuid NULL,
"TransferLineId" uuid NOT NULL,
"LotNo" varchar(64) NOT NULL,
"Quantity" numeric(18, 4) NOT NULL DEFAULT 1,
"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_Inv_T_TransferLineLot" PRIMARY KEY ("Id")
);
CREATE INDEX IF NOT EXISTS "IX_Inv_T_TransferLineLot_TransferLineId" ON public."Inv_T_TransferLineLot" ("TransferLineId");
DO $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'FK_Inv_T_TransferLineLot_TransferLineId') THEN
ALTER TABLE public."Inv_T_TransferLineLot" ADD CONSTRAINT "FK_Inv_T_TransferLineLot_TransferLineId" FOREIGN KEY ("TransferLineId") REFERENCES public."Inv_T_TransferLine" ("Id") ON DELETE CASCADE ON UPDATE NO ACTION;
END IF;
END
$$;

View file

@ -0,0 +1,11 @@
-- Hareketler: bütün operasyon türlerinin satırları ortak kolonlarla, lot/seri dağılımı varsa lot başına bir satır.
-- Miktar yapılan miktardır (lotlu satırda lotun miktarı); Talep satırın talep miktarıdır.
CREATE OR REPLACE VIEW public."Inv_V_StockMove" AS
SELECT COALESCE(z."Id", l."Id") AS "Id", l."TenantId", t."Id" AS "TransferId", t."TransferNo", t."OperationKind", t."OperationTypeId", t."Status",
COALESCE(t."EffectiveDate", t."ScheduledDate") AS "MoveDate", t."BranchId", t."WarehouseId",
t."SourceLocationId", t."DestinationLocationId", t."PartnerId", t."SourceDocument",
l."ProductId", COALESCE(z."LotNo", '') AS "LotNo", l."DemandQuantity", COALESCE(z."Quantity", l."Quantity") AS "Quantity", l."UomId"
FROM "Inv_T_TransferLine" l
INNER JOIN "Inv_T_Transfer" t ON t."Id" = l."TransferId"
LEFT JOIN "Inv_T_TransferLineLot" z ON z."TransferLineId" = l."Id" AND z."IsDeleted" = false
WHERE l."IsDeleted" = false AND t."IsDeleted" = false;

View file

@ -0,0 +1,5 @@
-- Lot Detayları diyaloğu: satırın lot/seri dağılımı; BaseId diyaloğun süzdüğü (ve yeni satıra yazdığı) hareket satırıdır.
CREATE OR REPLACE VIEW public."Inv_V_TransferLineLot" AS
SELECT z."Id", z."TenantId", z."TransferLineId" AS "BaseId", z."LotNo", z."Quantity", z."CreationTime", z."CreatorId", z."LastModificationTime", z."LastModifierId"
FROM "Inv_T_TransferLineLot" z
WHERE z."IsDeleted" = false;

View file

@ -0,0 +1,15 @@
-- Stoktan Lot Seçimi diyaloğu: stoktan çıkan satırın kaynak konumundaki bütün lotları (eldeki miktar satırın biriminde) ve
-- satıra atanmış miktarları. BaseId diyaloğun süzdüğü hareket satırıdır; Id satır + stok kaydıdır (kayıt yordamı ikisini ayırır).
-- Atanmış lotun stoğu bitse de (tamamlanmış belge) satır görünür.
CREATE OR REPLACE VIEW public."Inv_V_TransferLineLotStock" AS
SELECT l."Id"::text || ':' || s."Id"::text AS "Id", l."TenantId", l."Id" AS "BaseId", s."LotNo", s."InDate",
public."Inv_F_UomConvert"(s."Quantity", s."UomId", l."UomId") AS "OnHand", l."UomId",
z."Quantity" IS NOT NULL AS "IsSelected", z."Quantity" AS "SelectedQuantity"
FROM "Inv_T_TransferLine" l
INNER JOIN "Inv_T_Transfer" t ON t."Id" = l."TransferId"
INNER JOIN "Inv_T_Stock" s ON s."LocationId" = t."SourceLocationId" AND s."ProductId" = l."ProductId" AND s."LotNo" <> '' AND s."IsDeleted" = false
LEFT JOIN (SELECT "TransferLineId", "LotNo", SUM("Quantity") AS "Quantity"
FROM "Inv_T_TransferLineLot"
WHERE "IsDeleted" = false
GROUP BY "TransferLineId", "LotNo") z ON z."TransferLineId" = l."Id" AND z."LotNo" = s."LotNo"
WHERE l."IsDeleted" = false AND (s."Quantity" > 0 OR z."Quantity" IS NOT NULL);

View file

@ -13,13 +13,19 @@ BEGIN
RAISE EXCEPTION 'Kalemi olmayan sipariş onaylanamaz.' USING ERRCODE = 'P0001', DETAIL = '50182'; RAISE EXCEPTION 'Kalemi olmayan sipariş onaylanamaz.' USING ERRCODE = 'P0001', DETAIL = '50182';
END IF; END IF;
UPDATE "Prc_T_PurchaseOrder" SET "Status" = 'Purchase', "ConfirmDate" = NOW() AT TIME ZONE 'UTC' WHERE "Id" = p_id; UPDATE "Prc_T_PurchaseOrder" SET "Status" = 'Purchase', "ConfirmDate" = NOW() AT TIME ZONE 'UTC' WHERE "Id" = p_id;
CALL public."Inv_P_TransferFromPurchaseOrder"(p_id, p_user_id);
ELSIF p_action = 'Send' THEN ELSIF p_action = 'Send' THEN
IF v_status = 'Cancelled' THEN IF v_status = 'Cancelled' THEN
RAISE EXCEPTION 'İptal edilmiş sipariş gönderilemez.' USING ERRCODE = 'P0001', DETAIL = '50183'; RAISE EXCEPTION 'İptal edilmiş sipariş gönderilemez.' USING ERRCODE = 'P0001', DETAIL = '50183';
END IF; END IF;
CALL public."Prc_P_PurchaseOrderSend"(p_id, p_user_id); CALL public."Prc_P_PurchaseOrderSend"(p_id, p_user_id);
ELSIF p_action = 'Cancel' THEN ELSIF p_action = 'Cancel' THEN
IF EXISTS (SELECT 1 FROM "Inv_T_Transfer" WHERE "PurchaseOrderId" = p_id AND "IsDeleted" = false AND "Status" = 'Done') THEN
RAISE EXCEPTION 'Teslim alınmış (yapılmış alımı olan) sipariş iptal edilemez.' USING ERRCODE = 'P0001', DETAIL = '50318';
END IF;
UPDATE "Prc_T_PurchaseOrder" SET "Status" = 'Cancelled' WHERE "Id" = p_id; UPDATE "Prc_T_PurchaseOrder" SET "Status" = 'Cancelled' WHERE "Id" = p_id;
-- Siparişin yapılmamış alımları da iptal olur; sipariş yeniden onaylanırsa yeni alım açılır.
UPDATE "Inv_T_Transfer" SET "Status" = 'Cancelled' WHERE "PurchaseOrderId" = p_id AND "IsDeleted" = false AND "Status" IN ('Draft', 'Waiting', 'Ready');
ELSIF p_action = 'Draft' THEN ELSIF p_action = 'Draft' THEN
IF v_status <> 'Cancelled' THEN IF v_status <> 'Cancelled' THEN
RAISE EXCEPTION 'Yalnız iptal edilmiş sipariş taslağa alınabilir.' USING ERRCODE = 'P0001', DETAIL = '50184'; RAISE EXCEPTION 'Yalnız iptal edilmiş sipariş taslağa alınabilir.' USING ERRCODE = 'P0001', DETAIL = '50184';

View file

@ -26,7 +26,7 @@ BEGIN
FOR v_rfq IN SELECT DISTINCT rfq_id FROM prc_award_win LOOP FOR v_rfq IN SELECT DISTINCT rfq_id FROM prc_award_win LOOP
v_po := gen_random_uuid(); v_po := gen_random_uuid();
CALL public."Adm_P_SequenceNext"('PurchaseOrder1', v_tenant, v_no); CALL public."Adm_P_SequenceNext"('Prc.PurchaseOrder', v_tenant, v_no);
INSERT INTO "Prc_T_PurchaseOrder" ("Id", "TenantId", "OrderNo", "PurchaseRfqId", "SupplierId", "SupplierReference", "AgreementId", "BranchId", "OperationTypeId", "WarehouseId", "CurrencyId", INSERT INTO "Prc_T_PurchaseOrder" ("Id", "TenantId", "OrderNo", "PurchaseRfqId", "SupplierId", "SupplierReference", "AgreementId", "BranchId", "OperationTypeId", "WarehouseId", "CurrencyId",
"ExpectedArrival", "ConfirmDate", "BuyerUserId", "ProjectId", "IncotermId", "IncotermLocation", "PaymentTermId", "Terms", "ExpectedArrival", "ConfirmDate", "BuyerUserId", "ProjectId", "IncotermId", "IncotermLocation", "PaymentTermId", "Terms",
@ -45,6 +45,7 @@ BEGIN
WHERE w.rfq_id = v_rfq; WHERE w.rfq_id = v_rfq;
CALL public."Prc_P_PurchaseOrderRecalc"(v_po); CALL public."Prc_P_PurchaseOrderRecalc"(v_po);
CALL public."Inv_P_TransferFromPurchaseOrder"(v_po, p_user_id);
END LOOP; END LOOP;
UPDATE "Prc_T_PurchaseRfqLine" l SET "IsSelected" = EXISTS (SELECT 1 FROM prc_award_win w WHERE w.line_id = l."Id") UPDATE "Prc_T_PurchaseRfqLine" l SET "IsSelected" = EXISTS (SELECT 1 FROM prc_award_win w WHERE w.line_id = l."Id")

View file

@ -18,7 +18,7 @@ BEGIN
RAISE EXCEPTION 'Bu tedarikçinin ihalede zaten bir teklif talebi var.' USING ERRCODE = 'P0001', DETAIL = '50167'; RAISE EXCEPTION 'Bu tedarikçinin ihalede zaten bir teklif talebi var.' USING ERRCODE = 'P0001', DETAIL = '50167';
END IF; END IF;
CALL public."Adm_P_SequenceNext"('PurchaseRfq', v_tenant, v_no); CALL public."Adm_P_SequenceNext"('Prc.PurchaseRfq', v_tenant, v_no);
INSERT INTO "Prc_T_PurchaseRfq" ("Id", "TenantId", "RfqNo", "TenderGroupId", "SupplierId", "AgreementId", "BranchId", "OperationTypeId", "WarehouseId", "CurrencyId", "OrderDeadline", INSERT INTO "Prc_T_PurchaseRfq" ("Id", "TenantId", "RfqNo", "TenderGroupId", "SupplierId", "AgreementId", "BranchId", "OperationTypeId", "WarehouseId", "CurrencyId", "OrderDeadline",
"ExpectedArrival", "BuyerUserId", "ProjectId", "IncotermId", "IncotermLocation", "PaymentTermId", "ExpectedArrival", "BuyerUserId", "ProjectId", "IncotermId", "IncotermLocation", "PaymentTermId",

View file

@ -13,6 +13,7 @@ CREATE TABLE IF NOT EXISTS public."Prc_T_PurchaseOrderLine"
"DeliveryDate" timestamp NULL, "DeliveryDate" timestamp NULL,
"MaterialRequestItemId" uuid NULL, "MaterialRequestItemId" uuid NULL,
"PurchaseRfqLineId" uuid NULL, "PurchaseRfqLineId" uuid NULL,
"ReceivedQuantity" numeric(18, 4) NOT NULL DEFAULT 0,
"CreationTime" timestamp NOT NULL DEFAULT (NOW() AT TIME ZONE 'UTC'), "CreationTime" timestamp NOT NULL DEFAULT (NOW() AT TIME ZONE 'UTC'),
"CreatorId" uuid NULL, "CreatorId" uuid NULL,
"LastModificationTime" timestamp NULL, "LastModificationTime" timestamp NULL,

View file

@ -0,0 +1,17 @@
-- İç 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'));

View file

@ -0,0 +1,25 @@
-- Miktarı bir ölçü biriminden diğerine çevirir (aynı kategori içinde, Adm_T_Uom.Type + Ratio).
-- Referans birim 1; büyük birim 1 birim = Ratio referans; küçük birim Ratio birim = 1 referans. Kategori farklıysa ya da birim yoksa miktar aynen döner.
CREATE OR ALTER FUNCTION [dbo].[Inv_F_UomConvert]
(
@Quantity decimal(18, 4),
@FromUomId nvarchar(64),
@ToUomId nvarchar(64)
)
RETURNS decimal(18, 4)
AS
BEGIN
IF @Quantity IS NULL OR @FromUomId IS NULL OR @ToUomId IS NULL OR @FromUomId = @ToUomId
RETURN @Quantity;
DECLARE @From float, @To float;
SELECT @From = CASE f.Type WHEN 'BiggerThanReference' THEN f.Ratio WHEN 'SmallerThanReference' THEN 1.0 / NULLIF(f.Ratio, 0) ELSE 1 END,
@To = CASE t.Type WHEN 'BiggerThanReference' THEN t.Ratio WHEN 'SmallerThanReference' THEN 1.0 / NULLIF(t.Ratio, 0) ELSE 1 END
FROM Adm_T_Uom f
INNER JOIN Adm_T_Uom t ON t.Id = @ToUomId AND t.UomCategoryId = f.UomCategoryId
WHERE f.Id = @FromUomId;
IF @From IS NULL OR NULLIF(@To, 0) IS NULL
RETURN @Quantity;
RETURN ROUND(@Quantity * @From / @To, 4);
END

View file

@ -0,0 +1,52 @@
-- Transfer belgesi kaydı (ve iş akışı adımları) sonrası: tür, şube, depo ve boş konumlar operasyon türünden gelir (formda olmayan alımın
-- kaynağı ve teslimatın hedefi her zaman, iade belgesi hariç); teslimat politikası
-- yalnız teslimatta tutulur; iç transferin onaycısı kaynak konumun depo sorumlusudur (kullanıcı adı; iş akışı onaycıyı adla eşler),
-- sorumlusu olmayan konumdan transfer onay beklemez.
-- Numara, özet ve durum butonunun işlemi (PendingAction) buradan çalışır.
CREATE OR ALTER PROCEDURE [dbo].[Inv_P_TransferAfterSave]
@Id uniqueidentifier,
@UserId uniqueidentifier = NULL
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Act nvarchar(16) = (SELECT PendingAction FROM Inv_T_Transfer WHERE Id = @Id);
UPDATE t SET
OperationKind = ot.OperationKind,
BranchId = ot.BranchId,
WarehouseId = ot.WarehouseId,
SourceLocationId = CASE WHEN t.ReturnOfId IS NULL AND (ot.OperationKind = 'Receipt' OR t.SourceLocationId IS NULL)
THEN COALESCE(ot.SourceLocationId, t.SourceLocationId) ELSE t.SourceLocationId END,
DestinationLocationId = CASE WHEN t.ReturnOfId IS NULL AND (ot.OperationKind = 'Delivery' OR t.DestinationLocationId IS NULL)
THEN COALESCE(ot.DestinationLocationId, t.DestinationLocationId) ELSE t.DestinationLocationId END,
DeliveryPolicy = CASE WHEN ot.OperationKind = 'Delivery' THEN COALESCE(t.DeliveryPolicy, 'Direct') END
FROM Inv_T_Transfer t
INNER JOIN Inv_T_OperationType ot ON ot.Id = t.OperationTypeId
WHERE t.Id = @Id;
UPDATE t SET
SourceApproverUserNames = NULLIF(l.ResponsibleUserName, ''),
ApprovalStatus = CASE WHEN NULLIF(l.ResponsibleUserName, '') IS NULL AND t.ApprovalStatus IS NULL THEN N'Onay Gerekmez'
WHEN NULLIF(l.ResponsibleUserName, '') IS NOT NULL AND t.ApprovalStatus = N'Onay Gerekmez' THEN NULL
ELSE t.ApprovalStatus END
FROM Inv_T_Transfer t
LEFT JOIN Inv_T_Location l ON l.Id = t.SourceLocationId
WHERE t.Id = @Id AND t.OperationKind = 'InternalTransfer' AND t.Status = 'Draft';
EXEC Inv_P_TransferNumber @Id;
EXEC Inv_P_TransferRecalc @Id;
-- Durum butonları işlemi PendingAction alanına yazıp ekranın güncelleme ucuyla kaydeder.
IF @Act IS NOT NULL
EXEC Inv_P_TransferSetStatus @Id, @Act, @UserId;
-- Kaynak depo onayı verilen taslak iç transfer kendiliğinden hazırlanır (kullanıcı kararı: onay → Hazırla tek adım).
-- Hazırla'nın şartları (satır, farklı iki iç konum) sağlanmıyorsa denenmez: onay kaydı bozulmaz, belge taslak kalır ve
-- Hazırla elle basılınca hatayı gösterir.
ELSE IF EXISTS (SELECT 1
FROM Inv_T_Transfer t
INNER JOIN Inv_T_Location s ON s.Id = t.SourceLocationId AND s.LocationType = 'Internal'
INNER JOIN Inv_T_Location d ON d.Id = t.DestinationLocationId AND d.LocationType = 'Internal'
WHERE t.Id = @Id AND t.OperationKind = 'InternalTransfer' AND t.Status = 'Draft' AND t.ApprovalStatus = N'Onaylandı'
AND s.Id <> d.Id
AND EXISTS (SELECT 1 FROM Inv_T_TransferLine l WHERE l.TransferId = t.Id AND l.IsDeleted = 0))
EXEC Inv_P_TransferSetStatus @Id, 'Confirm', @UserId;
END

View file

@ -0,0 +1,54 @@
-- Yapılacak miktarı doldurur ve belgeyi Hazır ya da Bekleyen yapar. Rezervasyon yoktur; Tamamla stoğu yeniden kontrol eder.
-- Kaynak konum stok tutmuyorsa (dış konum) yapılacak miktar talep kadardır. İç konumdan çıkışta satırlar ürün bazında sırayla
-- karşılanır; tümü karşılanırsa Hazır olur. Teslimatta "Mümkün olduğunca kısa sürede" politikası kısmi karşılamada da Hazır yapar.
CREATE OR ALTER PROCEDURE [dbo].[Inv_P_TransferCheckAvailability]
@Id uniqueidentifier
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Src uniqueidentifier, @Kind nvarchar(32), @Policy nvarchar(16), @Tenant uniqueidentifier, @All bit, @Any bit;
SELECT @Src = t.SourceLocationId, @Kind = t.OperationKind, @Policy = t.DeliveryPolicy, @Tenant = t.TenantId
FROM Inv_T_Transfer t WHERE t.Id = @Id;
IF NOT EXISTS (SELECT 1 FROM Inv_T_Location WHERE Id = @Src AND LocationType = 'Internal')
BEGIN
UPDATE Inv_T_TransferLine SET Quantity = DemandQuantity WHERE TransferId = @Id AND IsDeleted = 0 AND Quantity = 0;
UPDATE Inv_T_Transfer SET Status = 'Ready' WHERE Id = @Id;
RETURN;
END
DECLARE @Fill TABLE (Id uniqueidentifier PRIMARY KEY, Fill decimal(18, 4) NOT NULL, Demand decimal(18, 4) NOT NULL);
WITH d AS (
SELECT l.Id, l.ProductId, l.UomId, p.UomId AS ProductUomId, p.TrackInventory, l.DemandQuantity,
dbo.Inv_F_UomConvert(l.DemandQuantity, l.UomId, p.UomId) AS DemandBase,
SUM(dbo.Inv_F_UomConvert(l.DemandQuantity, l.UomId, p.UomId))
OVER (PARTITION BY l.ProductId ORDER BY l.CreationTime, l.Id ROWS UNBOUNDED PRECEDING) AS CumBase
FROM Inv_T_TransferLine l
INNER JOIN Inv_T_Product p ON p.Id = l.ProductId
WHERE l.TransferId = @Id AND l.IsDeleted = 0),
s AS (
SELECT ProductId, SUM(Quantity) AS OnHand
FROM Inv_T_Stock
WHERE LocationId = @Src AND (TenantId = @Tenant OR (TenantId IS NULL AND @Tenant IS NULL))
GROUP BY ProductId)
INSERT INTO @Fill (Id, Fill, Demand)
SELECT d.Id,
CASE WHEN d.TrackInventory = 0 OR ISNULL(s.OnHand, 0) >= d.CumBase THEN d.DemandQuantity
WHEN ISNULL(s.OnHand, 0) > d.CumBase - d.DemandBase
THEN dbo.Inv_F_UomConvert(ISNULL(s.OnHand, 0) - (d.CumBase - d.DemandBase), d.ProductUomId, d.UomId)
ELSE 0 END,
d.DemandQuantity
FROM d
LEFT JOIN s ON s.ProductId = d.ProductId;
UPDATE l SET Quantity = f.Fill FROM Inv_T_TransferLine l INNER JOIN @Fill f ON f.Id = l.Id;
SET @All = CASE WHEN EXISTS (SELECT 1 FROM @Fill WHERE Fill < Demand) THEN 0 ELSE 1 END;
SET @Any = CASE WHEN EXISTS (SELECT 1 FROM @Fill WHERE Fill > 0) THEN 1 ELSE 0 END;
UPDATE Inv_T_Transfer
SET Status = CASE WHEN @All = 1 OR (@Kind = 'Delivery' AND ISNULL(@Policy, 'Direct') = 'Direct' AND @Any = 1) THEN 'Ready' ELSE 'Waiting' END
WHERE Id = @Id;
END

View file

@ -0,0 +1,54 @@
-- Belgeden yeni belge açar. Backorder: talepten az yapılan satırların kalanı, aynı konumlarla; stok kontrolüyle Hazır/Bekleyen olur.
-- Return (İade): yapılan miktarlar lotlarıyla, kaynak ve hedef yer değiştirerek Taslak açılır. İkisi de onay durumunu ve bağları taşır.
CREATE OR ALTER PROCEDURE [dbo].[Inv_P_TransferCopy]
@SourceId uniqueidentifier,
@Mode nvarchar(16),
@UserId uniqueidentifier = NULL,
@NewId uniqueidentifier OUTPUT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @IsReturn bit = CASE WHEN @Mode = 'Return' THEN 1 ELSE 0 END;
DECLARE @Map TABLE (OldId uniqueidentifier PRIMARY KEY, NewId uniqueidentifier NOT NULL);
SET @NewId = NEWID();
INSERT INTO Inv_T_Transfer (Id, TenantId, BranchId, WarehouseId, OperationTypeId, OperationKind, PartnerId, SourceLocationId, DestinationLocationId,
ScheduledDate, SourceDocument, PurchaseOrderId, BackorderOfId, ReturnOfId, CarrierId, ResponsibleUserId, ProjectId, DeliveryPolicy,
Status, SourceApproverUserNames, ApprovalUserName, ApprovalStatus, ApprovalDate, ApprovalDescription, CreationTime, CreatorId, IsDeleted)
SELECT @NewId, t.TenantId, t.BranchId, t.WarehouseId, t.OperationTypeId, t.OperationKind, t.PartnerId,
CASE WHEN @IsReturn = 1 THEN t.DestinationLocationId ELSE t.SourceLocationId END,
CASE WHEN @IsReturn = 1 THEN t.SourceLocationId ELSE t.DestinationLocationId END,
CASE WHEN @IsReturn = 1 THEN GETUTCDATE() ELSE t.ScheduledDate END,
CASE WHEN @IsReturn = 1 THEN t.TransferNo ELSE t.SourceDocument END, t.PurchaseOrderId,
CASE WHEN @IsReturn = 1 THEN NULL ELSE @SourceId END, CASE WHEN @IsReturn = 1 THEN @SourceId END,
t.CarrierId, t.ResponsibleUserId, t.ProjectId, t.DeliveryPolicy,
'Draft', t.SourceApproverUserNames, t.ApprovalUserName, t.ApprovalStatus, t.ApprovalDate, t.ApprovalDescription, GETUTCDATE(), @UserId, 0
FROM Inv_T_Transfer t
WHERE t.Id = @SourceId;
INSERT INTO @Map (OldId, NewId)
SELECT Id, NEWID()
FROM Inv_T_TransferLine
WHERE TransferId = @SourceId AND IsDeleted = 0
AND ((@IsReturn = 1 AND Quantity > 0) OR (@IsReturn = 0 AND Quantity < DemandQuantity));
INSERT INTO Inv_T_TransferLine (Id, TenantId, TransferId, ProductId, Description, DemandQuantity, Quantity, UomId,
PurchaseOrderLineId, MaterialRequestItemId, CreationTime, CreatorId, IsDeleted)
SELECT m.NewId, l.TenantId, @NewId, l.ProductId, l.Description,
CASE WHEN @IsReturn = 1 THEN l.Quantity ELSE l.DemandQuantity - l.Quantity END, 0, l.UomId,
l.PurchaseOrderLineId, l.MaterialRequestItemId, GETUTCDATE(), @UserId, 0
FROM Inv_T_TransferLine l
INNER JOIN @Map m ON m.OldId = l.Id;
IF @IsReturn = 1
INSERT INTO Inv_T_TransferLineLot (Id, TenantId, TransferLineId, LotNo, Quantity, CreationTime, CreatorId, IsDeleted)
SELECT NEWID(), z.TenantId, m.NewId, z.LotNo, z.Quantity, GETUTCDATE(), @UserId, 0
FROM Inv_T_TransferLineLot z
INNER JOIN @Map m ON m.OldId = z.TransferLineId
WHERE z.IsDeleted = 0;
EXEC Inv_P_TransferNumber @NewId;
IF @IsReturn = 0
EXEC Inv_P_TransferCheckAvailability @NewId;
EXEC Inv_P_TransferRecalc @NewId;
END

View file

@ -0,0 +1,35 @@
-- Onaylanan satınalma siparişinden siparişin operasyon türünde Taslak alım açar: konumlar operasyon türünden, satırlar
-- siparişin envanter takipli kalemlerinin henüz alınmamış miktarıdır. Siparişin iptal olmayan alımı varsa yeni alım açılmaz.
CREATE OR ALTER PROCEDURE [dbo].[Inv_P_TransferFromPurchaseOrder]
@OrderId uniqueidentifier,
@UserId uniqueidentifier = NULL
AS
BEGIN
SET NOCOUNT ON;
DECLARE @New uniqueidentifier = NEWID();
IF EXISTS (SELECT 1 FROM Inv_T_Transfer WHERE PurchaseOrderId = @OrderId AND IsDeleted = 0 AND Status <> 'Cancelled')
RETURN;
INSERT INTO Inv_T_Transfer (Id, TenantId, BranchId, WarehouseId, OperationTypeId, OperationKind, PartnerId, SourceLocationId, DestinationLocationId,
ScheduledDate, SourceDocument, PurchaseOrderId, ResponsibleUserId, ProjectId, Status, CreationTime, CreatorId, IsDeleted)
SELECT @New, o.TenantId, ot.BranchId, ot.WarehouseId, o.OperationTypeId, ot.OperationKind, o.SupplierId, ot.SourceLocationId, ot.DestinationLocationId,
COALESCE(o.ExpectedArrival, GETUTCDATE()), o.OrderNo, o.Id, o.BuyerUserId, o.ProjectId, 'Draft', GETUTCDATE(), @UserId, 0
FROM Prc_T_PurchaseOrder o
INNER JOIN Inv_T_OperationType ot ON ot.Id = o.OperationTypeId
WHERE o.Id = @OrderId
AND EXISTS (SELECT 1 FROM Prc_T_PurchaseOrderLine l
INNER JOIN Inv_T_Product p ON p.Id = l.ProductId
WHERE l.PurchaseOrderId = o.Id AND l.IsDeleted = 0 AND p.TrackInventory = 1 AND l.Quantity > l.ReceivedQuantity);
IF @@ROWCOUNT = 0
RETURN;
INSERT INTO Inv_T_TransferLine (Id, TenantId, TransferId, ProductId, Description, DemandQuantity, Quantity, UomId, PurchaseOrderLineId, CreationTime, CreatorId, IsDeleted)
SELECT NEWID(), l.TenantId, @New, l.ProductId, l.Description, l.Quantity - l.ReceivedQuantity, 0, l.UomId, l.Id, GETUTCDATE(), @UserId, 0
FROM Prc_T_PurchaseOrderLine l
INNER JOIN Inv_T_Product p ON p.Id = l.ProductId
WHERE l.PurchaseOrderId = @OrderId AND l.IsDeleted = 0 AND p.TrackInventory = 1 AND l.Quantity > l.ReceivedQuantity;
EXEC Inv_P_TransferNumber @New;
EXEC Inv_P_TransferRecalc @New;
END

View file

@ -0,0 +1,23 @@
-- 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

View file

@ -0,0 +1,21 @@
-- Hareket satırı kaydı sonrası: satırın araç çubuğu işlemi (GenerateLots = Lot/Seri Oluştur, AssignLots = Otomatik Ata) ve belge özeti.
CREATE OR ALTER PROCEDURE [dbo].[Inv_P_TransferLineAfterSave]
@Id uniqueidentifier,
@UserId uniqueidentifier = NULL
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Act nvarchar(16), @Doc uniqueidentifier;
SELECT @Act = PendingAction, @Doc = TransferId FROM Inv_T_TransferLine WHERE Id = @Id;
IF @Act IS NOT NULL
BEGIN
UPDATE Inv_T_TransferLine SET PendingAction = NULL WHERE Id = @Id;
IF @Act = 'GenerateLots'
EXEC Inv_P_TransferLineLotGenerate @Id, @UserId;
ELSE IF @Act = 'AssignLots'
EXEC Inv_P_TransferLineLotAssign @Id, @UserId;
END
EXEC Inv_P_TransferRecalc @Doc;
END

View file

@ -0,0 +1,40 @@
-- Otomatik Ata: stoktan çıkan satırın lot dağılımını kaynak konumun stoğundan ilk giren ilk çıkar (InDate) sırasıyla yeniden kurar.
-- Stok yetmezse karşılanabilen kadar atanır; eksik Tamamla'da bildirilir.
CREATE OR ALTER PROCEDURE [dbo].[Inv_P_TransferLineLotAssign]
@Id uniqueidentifier,
@UserId uniqueidentifier = NULL
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Tenant uniqueidentifier, @Method nvarchar(16), @Src uniqueidentifier, @SrcInternal bit, @ProductId uniqueidentifier,
@LineUom nvarchar(64), @ProductUom nvarchar(64), @Need decimal(18, 4);
SELECT @Tenant = l.TenantId, @Method = CASE WHEN p.TrackInventory = 1 THEN p.TrackingMethod END, @Src = t.SourceLocationId,
@SrcInternal = CASE WHEN src.LocationType = 'Internal' THEN 1 ELSE 0 END, @ProductId = l.ProductId,
@LineUom = l.UomId, @ProductUom = p.UomId,
@Need = dbo.Inv_F_UomConvert(CASE WHEN l.Quantity > 0 THEN l.Quantity ELSE l.DemandQuantity END, l.UomId, p.UomId)
FROM Inv_T_TransferLine l
INNER JOIN Inv_T_Transfer t ON t.Id = l.TransferId
INNER JOIN Inv_T_Product p ON p.Id = l.ProductId
LEFT JOIN Inv_T_Location src ON src.Id = t.SourceLocationId
WHERE l.Id = @Id;
IF ISNULL(@Method, '') NOT IN ('Lot', 'Serial') THROW 50314, N'Ürün lot/seri numarasıyla takip edilmiyor.', 1;
IF ISNULL(@SrcInternal, 0) = 0 THROW 50317, N'Otomatik atama yalnız stoktan çıkan satırda yapılır.', 1;
UPDATE Inv_T_TransferLineLot SET IsDeleted = 1, DeletionTime = GETUTCDATE(), DeleterId = @UserId
WHERE TransferLineId = @Id AND IsDeleted = 0;
WITH s AS (
SELECT LotNo, Quantity,
SUM(Quantity) OVER (ORDER BY InDate, LotNo ROWS UNBOUNDED PRECEDING) - Quantity AS Before
FROM Inv_T_Stock
WHERE LocationId = @Src AND ProductId = @ProductId AND LotNo <> '' AND Quantity > 0
AND (TenantId = @Tenant OR (TenantId IS NULL AND @Tenant IS NULL)))
INSERT INTO Inv_T_TransferLineLot (Id, TenantId, TransferLineId, LotNo, Quantity, CreationTime, CreatorId, IsDeleted)
SELECT NEWID(), @Tenant, @Id, s.LotNo,
dbo.Inv_F_UomConvert(CASE WHEN s.Quantity < @Need - s.Before THEN s.Quantity ELSE @Need - s.Before END, @ProductUom, @LineUom),
GETUTCDATE(), @UserId, 0
FROM s
WHERE s.Before < @Need;
END

View file

@ -0,0 +1,43 @@
-- Lot/Seri Oluştur: stoğa giren satırın lot dağılımı olmayan kısmı için numaratörden lot (Inventory.LotNumber, tek lot) ya da
-- seri (Inventory.SerialNumber, birim başına bir seri) numarası üretir. Stoktan çıkan satırda lot stoktan seçilir (Otomatik Ata).
CREATE OR ALTER PROCEDURE [dbo].[Inv_P_TransferLineLotGenerate]
@Id uniqueidentifier,
@UserId uniqueidentifier = NULL
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Tenant uniqueidentifier, @Method nvarchar(16), @Quantity decimal(18, 4), @Remain decimal(18, 4), @SrcInternal bit, @No nvarchar(128);
SELECT @Tenant = l.TenantId, @Method = CASE WHEN p.TrackInventory = 1 THEN p.TrackingMethod END,
@Quantity = CASE WHEN l.Quantity > 0 THEN l.Quantity ELSE l.DemandQuantity END,
@SrcInternal = CASE WHEN src.LocationType = 'Internal' THEN 1 ELSE 0 END
FROM Inv_T_TransferLine l
INNER JOIN Inv_T_Transfer t ON t.Id = l.TransferId
INNER JOIN Inv_T_Product p ON p.Id = l.ProductId
LEFT JOIN Inv_T_Location src ON src.Id = t.SourceLocationId
WHERE l.Id = @Id;
IF ISNULL(@Method, '') NOT IN ('Lot', 'Serial') THROW 50314, N'Ürün lot/seri numarasıyla takip edilmiyor.', 1;
IF @SrcInternal = 1 THROW 50315, N'Stoktan çıkan satırda lot oluşturulmaz; Otomatik Ata ile stoktaki lotlar seçilir.', 1;
SET @Remain = @Quantity - ISNULL((SELECT SUM(Quantity) FROM Inv_T_TransferLineLot WHERE TransferLineId = @Id AND IsDeleted = 0), 0);
IF @Remain <= 0
RETURN;
IF @Method = 'Lot'
BEGIN
EXEC Adm_P_SequenceNext 'Inventory.LotNumber', @Tenant, @No OUTPUT;
INSERT INTO Inv_T_TransferLineLot (Id, TenantId, TransferLineId, LotNo, Quantity, CreationTime, CreatorId, IsDeleted)
VALUES (NEWID(), @Tenant, @Id, LEFT(@No, 64), @Remain, GETUTCDATE(), @UserId, 0);
RETURN;
END
IF @Remain <> FLOOR(@Remain) THROW 50316, N'Seri numaralı üründe miktar tam sayı olmalıdır.', 1;
WHILE @Remain > 0
BEGIN
EXEC Adm_P_SequenceNext 'Inventory.SerialNumber', @Tenant, @No OUTPUT;
INSERT INTO Inv_T_TransferLineLot (Id, TenantId, TransferLineId, LotNo, Quantity, CreationTime, CreatorId, IsDeleted)
VALUES (NEWID(), @Tenant, @Id, LEFT(@No, 64), 1, GETUTCDATE(), @UserId, 0);
SET @Remain = @Remain - 1;
END
END

View file

@ -0,0 +1,49 @@
-- Stoktan Lot Seçimi (App.Inventory.TransferLineLotStock) satır kaydı: yazılan miktar varsa o, yoksa Seç işaretliyse lotun
-- eldeki miktarı atanır (ekranda Seç aynı değeri yazar); ikisi de yoksa lot satırdan çıkar. Batch kaydı her satırı ayrı ve
-- eşzamanlı istekle gönderir; aynı satırın lotları üst üste yazılmasın diye hareket satırı kilitlenip istekler sırayla işlenir.
CREATE OR ALTER PROCEDURE [dbo].[Inv_P_TransferLineLotStockSave]
@Id nvarchar(80),
@IsSelected bit = NULL,
@SelectedQuantity decimal(18, 4) = NULL,
@LastModifierId uniqueidentifier = NULL
AS
BEGIN
SET NOCOUNT ON;
SET XACT_ABORT ON;
DECLARE @LineId uniqueidentifier = TRY_CAST(LEFT(@Id, 36) AS uniqueidentifier),
@StockId uniqueidentifier = TRY_CAST(SUBSTRING(@Id, 38, 36) AS uniqueidentifier),
@Tenant uniqueidentifier, @Doc uniqueidentifier, @Status nvarchar(16), @Lot nvarchar(64),
@OnHand decimal(18, 4), @Qty decimal(18, 4);
BEGIN TRAN;
SELECT @Tenant = l.TenantId, @Doc = l.TransferId
FROM Inv_T_TransferLine l WITH (UPDLOCK, HOLDLOCK)
WHERE l.Id = @LineId;
SELECT @Status = t.Status, @Lot = s.LotNo, @OnHand = dbo.Inv_F_UomConvert(s.Quantity, s.UomId, l.UomId)
FROM Inv_T_TransferLine l
INNER JOIN Inv_T_Transfer t ON t.Id = l.TransferId
INNER JOIN Inv_T_Stock s ON s.Id = @StockId AND s.LocationId = t.SourceLocationId AND s.ProductId = l.ProductId
WHERE l.Id = @LineId;
IF @Lot IS NULL THROW 50322, N'Lot, belgenin kaynak konumunda bulunamadı.', 1;
IF @Status IN ('Done', 'Cancelled') THROW 50313, N'Tamamlanmış ya da iptal edilmiş belgenin satırı değiştirilemez.', 1;
IF ISNULL(@SelectedQuantity, 0) > 0
SET @Qty = @SelectedQuantity;
ELSE IF @IsSelected = 1
SET @Qty = @OnHand;
ELSE
SET @Qty = 0;
IF @Qty > @OnHand THROW 50324, N'Seçilen miktar lotun eldeki miktarını aşamaz.', 1;
UPDATE Inv_T_TransferLineLot SET IsDeleted = 1, DeletionTime = GETUTCDATE(), DeleterId = @LastModifierId
WHERE TransferLineId = @LineId AND LotNo = @Lot AND IsDeleted = 0;
IF @Qty > 0
INSERT INTO Inv_T_TransferLineLot (Id, TenantId, TransferLineId, LotNo, Quantity, CreationTime, CreatorId, IsDeleted)
VALUES (NEWID(), @Tenant, @LineId, @Lot, @Qty, GETUTCDATE(), @LastModifierId, 0);
EXEC Inv_P_TransferRecalc @Doc;
COMMIT;
END

View file

@ -0,0 +1,18 @@
-- Numarası olmayan transfer belgesine operasyon türünün numaratöründen (Inv_T_OperationType.SequenceName) numara verir.
CREATE OR ALTER PROCEDURE [dbo].[Inv_P_TransferNumber]
@Id uniqueidentifier
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Seq nvarchar(128), @Tenant uniqueidentifier, @No nvarchar(128);
SELECT @Seq = ot.SequenceName, @Tenant = t.TenantId
FROM Inv_T_Transfer t
INNER JOIN Inv_T_OperationType ot ON ot.Id = t.OperationTypeId
WHERE t.Id = @Id AND t.TransferNo IS NULL;
IF @Seq IS NULL
RETURN;
EXEC Adm_P_SequenceNext @Seq, @Tenant, @No OUTPUT;
UPDATE Inv_T_Transfer SET TransferNo = LEFT(@No, 32) WHERE Id = @Id;
END

View file

@ -0,0 +1,49 @@
-- Belgenin ağırlığını (ürün ağırlığı × miktar, ürün biriminde) ve yazdırılan satır özetini yeniler; satırın takip yöntemini
-- (Lot/Serial, envanter takibi kapalıysa boş) üründen, lotun stoktan seçilip seçilmeyeceğini (kaynak iç konum) belgeden yazar —
-- satırın Lot/Seri butonları ve açılan lot ekranı bu iki kolona göre belirlenir. Lot/seri takipli satırda lot girilmişse yapılan
-- miktar lot toplamıdır (lot seçmek o kadar teslim etmektir) ve seçilen lotlar satırın LotNumbers kolonunda listelenir.
-- Özet satırı: [Referans] Ürün: talep / yapılan birim · lot (miktar), ...
CREATE OR ALTER PROCEDURE [dbo].[Inv_P_TransferRecalc]
@Id uniqueidentifier
AS
BEGIN
SET NOCOUNT ON;
UPDATE l SET TrackingMethod = CASE WHEN p.TrackInventory = 1 AND p.TrackingMethod IN ('Lot', 'Serial') THEN p.TrackingMethod END,
LotFromStock = CASE WHEN src.LocationType = 'Internal' THEN 1 ELSE 0 END
FROM Inv_T_TransferLine l
INNER JOIN Inv_T_Product p ON p.Id = l.ProductId
INNER JOIN Inv_T_Transfer t ON t.Id = l.TransferId
LEFT JOIN Inv_T_Location src ON src.Id = t.SourceLocationId
WHERE l.TransferId = @Id AND l.IsDeleted = 0;
UPDATE l SET Quantity = CASE WHEN t.Status IN ('Done', 'Cancelled') OR z.Quantity IS NULL THEN l.Quantity ELSE z.Quantity END,
LotNumbers = CASE WHEN l.TrackingMethod = 'Serial' THEN z.Serials ELSE z.Lots END
FROM Inv_T_TransferLine l
INNER JOIN Inv_T_Transfer t ON t.Id = l.TransferId
OUTER APPLY (SELECT SUM(lt.Quantity) AS Quantity,
STRING_AGG(lt.LotNo, ', ') WITHIN GROUP (ORDER BY lt.LotNo) AS Serials,
STRING_AGG(CONCAT(lt.LotNo, ' (', FORMAT(lt.Quantity, '0.####'), ')'), ', ') WITHIN GROUP (ORDER BY lt.LotNo) AS Lots
FROM Inv_T_TransferLineLot lt
WHERE lt.TransferLineId = l.Id AND lt.IsDeleted = 0) z
WHERE l.TransferId = @Id AND l.IsDeleted = 0 AND l.TrackingMethod IN ('Lot', 'Serial');
UPDATE t SET
Weight = ISNULL((SELECT SUM(dbo.Inv_F_UomConvert(CASE WHEN l.Quantity > 0 THEN l.Quantity ELSE l.DemandQuantity END, l.UomId, p.UomId) * ISNULL(p.Weight, 0))
FROM Inv_T_TransferLine l
INNER JOIN Inv_T_Product p ON p.Id = l.ProductId
WHERE l.TransferId = @Id AND l.IsDeleted = 0), 0),
LineSummary = (SELECT STRING_AGG(x.Txt, CHAR(10)) WITHIN GROUP (ORDER BY x.CreationTime, x.Id)
FROM (SELECT l.Id, l.CreationTime,
CONCAT(CASE WHEN ISNULL(p.InternalReference, '') = '' THEN '' ELSE CONCAT('[', p.InternalReference, '] ') END, p.Name, ': ',
FORMAT(l.DemandQuantity, '0.####'), ' / ', FORMAT(l.Quantity, '0.####'), ' ', l.UomId,
CASE WHEN z.Txt IS NULL THEN '' ELSE CONCAT(N' · ', z.Txt) END) AS Txt
FROM Inv_T_TransferLine l
INNER JOIN Inv_T_Product p ON p.Id = l.ProductId
OUTER APPLY (SELECT STRING_AGG(CONCAT(lt.LotNo, ' (', FORMAT(lt.Quantity, '0.####'), ')'), ', ') AS Txt
FROM Inv_T_TransferLineLot lt
WHERE lt.TransferLineId = l.Id AND lt.IsDeleted = 0) z
WHERE l.TransferId = @Id AND l.IsDeleted = 0) x)
FROM Inv_T_Transfer t
WHERE t.Id = @Id;
END

View file

@ -0,0 +1,55 @@
-- Transfer belgesinin durum butonları: Confirm (Hazırla, taslakta), Check (Hazırla, bekleyende), Validate (Tamamla), Cancel (İptal Et), Return (İade Et).
CREATE OR ALTER PROCEDURE [dbo].[Inv_P_TransferSetStatus]
@Id uniqueidentifier,
@Action nvarchar(16),
@UserId uniqueidentifier = NULL
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Status nvarchar(16), @Kind nvarchar(32), @Approval nvarchar(50), @Src uniqueidentifier, @Dst uniqueidentifier, @New uniqueidentifier;
SELECT @Status = Status, @Kind = OperationKind, @Approval = ApprovalStatus, @Src = SourceLocationId, @Dst = DestinationLocationId
FROM Inv_T_Transfer WHERE Id = @Id;
UPDATE Inv_T_Transfer SET PendingAction = NULL WHERE Id = @Id;
-- İç transfer depo içinde taşımadır: iki uç da stok tutan iç konum ve birbirinden farklı olmalı (dış konuma giden mal stoktan düşer, hiçbir yere girmez).
-- İade belgesi muaftır: yanlışlıkla dış konuma yapılmış transfer İade Et ile geri alınabilmeli.
IF @Kind = 'InternalTransfer' AND @Action IN ('Confirm', 'Check', 'Validate')
AND NOT EXISTS (SELECT 1 FROM Inv_T_Transfer WHERE Id = @Id AND ReturnOfId IS NOT NULL)
BEGIN
IF @Src = @Dst THROW 50325, N'Kaynak ve hedef konum aynı olamaz.', 1;
IF EXISTS (SELECT 1 FROM Inv_T_Location WHERE Id IN (@Src, @Dst) AND LocationType <> 'Internal')
THROW 50326, N'İç transferde kaynak ve hedef konum iç konum olmalıdır.', 1;
END
IF @Action = 'Confirm'
BEGIN
IF @Status <> 'Draft' THROW 50301, N'Yalnız taslak belge hazırlanabilir.', 1;
IF NOT EXISTS (SELECT 1 FROM Inv_T_TransferLine WHERE TransferId = @Id AND IsDeleted = 0)
THROW 50302, N'Ürün satırı olmayan belge hazırlanamaz.', 1;
IF @Src IS NULL OR @Dst IS NULL THROW 50303, N'Kaynak ve hedef konum seçilmelidir.', 1;
IF @Kind = 'InternalTransfer' AND ISNULL(@Approval, N'') NOT IN (N'Onaylandı', N'Onay Gerekmez')
THROW 50304, N'Kaynak depo onayı tamamlanmadan iç transfer hazırlanamaz.', 1;
EXEC Inv_P_TransferCheckAvailability @Id;
END
ELSE IF @Action = 'Check'
BEGIN
IF @Status NOT IN ('Waiting', 'Ready') THROW 50305, N'Stok kontrolü yalnız bekleyen ya da hazır belgede yapılır.', 1;
EXEC Inv_P_TransferCheckAvailability @Id;
END
ELSE IF @Action = 'Validate'
BEGIN
IF @Status <> 'Ready' THROW 50306, N'Yalnız hazır belge tamamlanabilir.', 1;
EXEC Inv_P_TransferValidate @Id, @UserId;
END
ELSE IF @Action = 'Cancel'
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;
END
ELSE IF @Action = 'Return'
BEGIN
IF @Status <> 'Done' THROW 50308, N'Yalnız tamamlanmış belge iade edilebilir.', 1;
EXEC Inv_P_TransferCopy @Id, 'Return', @UserId, @New OUTPUT;
END
END

View file

@ -0,0 +1,140 @@
-- 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).
-- 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,
@UserId uniqueidentifier = NULL
AS
BEGIN
SET NOCOUNT ON;
SET XACT_ABORT ON;
DECLARE @Tenant uniqueidentifier, @Status nvarchar(16), @Kind nvarchar(32), @ReturnOf uniqueidentifier,
@Src uniqueidentifier, @Dst uniqueidentifier, @SrcInternal bit = 0, @DstInternal bit = 0,
@DstBranch uniqueidentifier, @DstWarehouse uniqueidentifier, @Sign int, @New uniqueidentifier,
@Now datetime = GETUTCDATE(), @Msg nvarchar(512);
BEGIN TRANSACTION;
SELECT @Tenant = TenantId, @Status = Status, @Kind = OperationKind, @ReturnOf = ReturnOfId,
@Src = SourceLocationId, @Dst = DestinationLocationId
FROM Inv_T_Transfer WITH (UPDLOCK, HOLDLOCK)
WHERE Id = @Id;
IF @Status <> 'Ready' THROW 50306, N'Yalnız hazır belge tamamlanabilir.', 1;
SET @Sign = CASE WHEN @ReturnOf IS NULL THEN 1 ELSE -1 END;
SELECT @SrcInternal = CASE WHEN LocationType = 'Internal' THEN 1 ELSE 0 END FROM Inv_T_Location WHERE Id = @Src;
SELECT @DstInternal = CASE WHEN LocationType = 'Internal' THEN 1 ELSE 0 END, @DstBranch = BranchId, @DstWarehouse = WarehouseId
FROM Inv_T_Location WHERE Id = @Dst;
IF NOT EXISTS (SELECT 1 FROM Inv_T_TransferLine WHERE TransferId = @Id AND IsDeleted = 0 AND Quantity > 0)
THROW 50309, N'Yapılan miktarı girilmiş satır yok.', 1;
SELECT TOP 1 @Msg = CONCAT(p.Name, N': lot/seri toplamı ', FORMAT(z.Quantity, '0.####'), N', yapılan miktar ', FORMAT(l.Quantity, '0.####'))
FROM Inv_T_TransferLine l
INNER JOIN Inv_T_Product p ON p.Id = l.ProductId
CROSS APPLY (SELECT ISNULL(SUM(lt.Quantity), 0) AS Quantity FROM Inv_T_TransferLineLot lt WHERE lt.TransferLineId = l.Id AND lt.IsDeleted = 0) z
WHERE l.TransferId = @Id AND l.IsDeleted = 0 AND l.Quantity > 0 AND p.TrackInventory = 1 AND p.TrackingMethod IN ('Lot', 'Serial')
AND z.Quantity <> l.Quantity;
IF @Msg IS NOT NULL
BEGIN
SET @Msg = CONCAT(N'Lot/seri miktarı yapılan miktara eşit değil — ', @Msg);
THROW 50310, @Msg, 1;
END
SELECT TOP 1 @Msg = CONCAT(p.Name, ' / ', z.LotNo)
FROM Inv_T_TransferLineLot z
INNER JOIN Inv_T_TransferLine l ON l.Id = z.TransferLineId
INNER JOIN Inv_T_Product p ON p.Id = l.ProductId
WHERE l.TransferId = @Id AND l.IsDeleted = 0 AND z.IsDeleted = 0 AND p.TrackingMethod = 'Serial'
AND (z.Quantity <> 1 OR EXISTS (SELECT 1 FROM Inv_T_TransferLineLot z2
INNER JOIN Inv_T_TransferLine l2 ON l2.Id = z2.TransferLineId
WHERE l2.TransferId = @Id AND l2.IsDeleted = 0 AND z2.IsDeleted = 0
AND l2.ProductId = l.ProductId AND z2.LotNo = z.LotNo AND z2.Id <> z.Id));
IF @Msg IS NOT NULL
BEGIN
SET @Msg = CONCAT(N'Seri numaralı üründe her seri 1 adet ve tekil olmalıdır: ', @Msg);
THROW 50311, @Msg, 1;
END
-- Stoğa işlenecek hareket: ürün × lot, ürün biriminde.
DECLARE @Move TABLE (ProductId uniqueidentifier NOT NULL, LotNo nvarchar(64) NOT NULL, Quantity decimal(18, 4) NOT NULL, UomId nvarchar(64) NOT NULL,
PRIMARY KEY (ProductId, LotNo));
INSERT INTO @Move (ProductId, LotNo, Quantity, UomId)
SELECT m.ProductId, m.LotNo, SUM(m.Quantity), m.UomId
FROM (SELECT l.ProductId, p.UomId,
CASE WHEN p.TrackingMethod IN ('Lot', 'Serial') THEN z.LotNo ELSE '' END AS LotNo,
dbo.Inv_F_UomConvert(CASE WHEN p.TrackingMethod IN ('Lot', 'Serial') THEN z.Quantity ELSE l.Quantity END, l.UomId, p.UomId) AS Quantity
FROM Inv_T_TransferLine l
INNER JOIN Inv_T_Product p ON p.Id = l.ProductId
LEFT JOIN Inv_T_TransferLineLot z ON z.TransferLineId = l.Id AND z.IsDeleted = 0 AND p.TrackingMethod IN ('Lot', 'Serial')
WHERE l.TransferId = @Id AND l.IsDeleted = 0 AND l.Quantity > 0 AND p.TrackInventory = 1) m
GROUP BY m.ProductId, m.LotNo, m.UomId;
IF @SrcInternal = 1
BEGIN
SELECT TOP 1 @Msg = CONCAT(p.Name, CASE WHEN m.LotNo = '' THEN '' ELSE CONCAT(' / ', m.LotNo) END)
FROM @Move m
INNER JOIN Inv_T_Product p ON p.Id = m.ProductId
LEFT JOIN Inv_T_Stock s WITH (UPDLOCK, HOLDLOCK)
ON s.LocationId = @Src AND s.ProductId = m.ProductId AND s.LotNo = m.LotNo
AND (s.TenantId = @Tenant OR (s.TenantId IS NULL AND @Tenant IS NULL))
WHERE ISNULL(s.Quantity, 0) < m.Quantity;
IF @Msg IS NOT NULL
BEGIN
SET @Msg = CONCAT(N'Kaynak konumda yeterli stok yok: ', @Msg);
THROW 50312, @Msg, 1;
END
UPDATE s SET Quantity = s.Quantity - m.Quantity, LastMoveDate = @Now, LastModificationTime = @Now, LastModifierId = @UserId
FROM Inv_T_Stock s
INNER JOIN @Move m ON m.ProductId = s.ProductId AND m.LotNo = s.LotNo
WHERE s.LocationId = @Src AND (s.TenantId = @Tenant OR (s.TenantId IS NULL AND @Tenant IS NULL));
END
IF @DstInternal = 1
BEGIN
UPDATE s SET Quantity = s.Quantity + m.Quantity, LastMoveDate = @Now, LastModificationTime = @Now, LastModifierId = @UserId,
InDate = CASE WHEN s.Quantity <= 0 THEN @Now ELSE s.InDate END
FROM Inv_T_Stock s WITH (UPDLOCK, HOLDLOCK)
INNER JOIN @Move m ON m.ProductId = s.ProductId AND m.LotNo = s.LotNo
WHERE s.LocationId = @Dst AND (s.TenantId = @Tenant OR (s.TenantId IS NULL AND @Tenant IS NULL));
INSERT INTO Inv_T_Stock (Id, TenantId, BranchId, WarehouseId, LocationId, ProductId, LotNo, Quantity, UomId, InDate, LastMoveDate, CreationTime, CreatorId, IsDeleted)
SELECT NEWID(), @Tenant, @DstBranch, @DstWarehouse, @Dst, m.ProductId, m.LotNo, m.Quantity, m.UomId, @Now, @Now, @Now, @UserId, 0
FROM @Move m
WHERE NOT EXISTS (SELECT 1 FROM Inv_T_Stock s
WHERE s.LocationId = @Dst AND s.ProductId = m.ProductId AND s.LotNo = m.LotNo
AND (s.TenantId = @Tenant OR (s.TenantId IS NULL AND @Tenant IS NULL)));
END
UPDATE Inv_T_Transfer
SET Status = 'Done', EffectiveDate = @Now,
ReceivedByUserId = CASE WHEN @Kind = 'InternalTransfer' THEN @UserId ELSE ReceivedByUserId END,
ReceivedDate = CASE WHEN @Kind = 'InternalTransfer' THEN @Now ELSE ReceivedDate END
WHERE Id = @Id;
UPDATE ol SET ReceivedQuantity = ol.ReceivedQuantity + @Sign * x.Quantity
FROM Prc_T_PurchaseOrderLine ol
INNER JOIN (SELECT l.PurchaseOrderLineId, SUM(dbo.Inv_F_UomConvert(l.Quantity, l.UomId, pl.UomId)) AS Quantity
FROM Inv_T_TransferLine l
INNER JOIN Prc_T_PurchaseOrderLine pl ON pl.Id = l.PurchaseOrderLineId
WHERE l.TransferId = @Id AND l.IsDeleted = 0 AND l.Quantity > 0
GROUP BY l.PurchaseOrderLineId) x ON x.PurchaseOrderLineId = ol.Id;
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
FROM Prc_T_MaterialRequestItem i
INNER JOIN (SELECT l.MaterialRequestItemId, SUM(dbo.Inv_F_UomConvert(l.Quantity, l.UomId, mi.UomId)) AS Quantity
FROM Inv_T_TransferLine l
INNER JOIN Prc_T_MaterialRequestItem mi ON mi.Id = l.MaterialRequestItemId
WHERE l.TransferId = @Id AND l.IsDeleted = 0 AND l.Quantity > 0
GROUP BY l.MaterialRequestItemId) x ON x.MaterialRequestItemId = i.Id;
IF @ReturnOf IS NULL AND EXISTS (SELECT 1 FROM Inv_T_TransferLine WHERE TransferId = @Id AND IsDeleted = 0 AND Quantity < DemandQuantity)
EXEC Inv_P_TransferCopy @Id, 'Backorder', @UserId, @New OUTPUT;
EXEC Inv_P_TransferRecalc @Id;
COMMIT TRANSACTION;
END

View file

@ -11,7 +11,7 @@ BEGIN
[Name] nvarchar(128) NOT NULL, [Name] nvarchar(128) NOT NULL,
[LocationType] nvarchar(16) NOT NULL DEFAULT 'Internal', [LocationType] nvarchar(16) NOT NULL DEFAULT 'Internal',
[DepartmentId] uniqueidentifier NULL, [DepartmentId] uniqueidentifier NULL,
[ResponsibleUserId] uniqueidentifier NULL, [ResponsibleUserName] nvarchar(256) NULL,
[IsActive] bit NOT NULL DEFAULT 1, [IsActive] bit NOT NULL DEFAULT 1,
[CreationTime] datetime2 NOT NULL DEFAULT GETUTCDATE(), [CreationTime] datetime2 NOT NULL DEFAULT GETUTCDATE(),
[CreatorId] uniqueidentifier NULL, [CreatorId] uniqueidentifier NULL,

View file

@ -8,7 +8,7 @@ BEGIN
[WarehouseId] uniqueidentifier NOT NULL, [WarehouseId] uniqueidentifier NOT NULL,
[Name] nvarchar(128) NOT NULL, [Name] nvarchar(128) NOT NULL,
[OperationKind] nvarchar(32) NOT NULL DEFAULT 'Receipt', [OperationKind] nvarchar(32) NOT NULL DEFAULT 'Receipt',
[SequencePrefix] nvarchar(16) NULL, [SequenceName] nvarchar(128) NOT NULL,
[Barcode] nvarchar(64) NULL, [Barcode] nvarchar(64) NULL,
[SourceLocationId] uniqueidentifier NULL, [SourceLocationId] uniqueidentifier NULL,
[DestinationLocationId] uniqueidentifier NULL, [DestinationLocationId] uniqueidentifier NULL,

View file

@ -0,0 +1,54 @@
-- Şube × depo × konum × ürün × lot bakiyesi (ürün biriminde). Yalnız Tamamla yordamı (Inv_P_TransferValidate) yazar.
IF OBJECT_ID(N'[dbo].[Inv_T_Stock]', 'U') IS NULL
BEGIN
CREATE TABLE [dbo].[Inv_T_Stock]
(
[Id] uniqueidentifier NOT NULL DEFAULT NEWID(),
[TenantId] uniqueidentifier NULL,
[BranchId] uniqueidentifier NOT NULL,
[WarehouseId] uniqueidentifier NOT NULL,
[LocationId] uniqueidentifier NOT NULL,
[ProductId] uniqueidentifier NOT NULL,
[LotNo] nvarchar(64) NOT NULL DEFAULT '',
[Quantity] decimal(18, 4) NOT NULL DEFAULT 0,
[UomId] nvarchar(64) NOT NULL DEFAULT 'Adet',
[InDate] datetime NULL,
[LastMoveDate] datetime NULL,
[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_Inv_T_Stock] PRIMARY KEY NONCLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
END
GO
IF OBJECT_ID(N'[dbo].[UQ_Inv_T_Stock_TenantId_LocationId_ProductId_LotNo]', 'UQ') IS NULL
BEGIN
ALTER TABLE [dbo].[Inv_T_Stock] ADD CONSTRAINT [UQ_Inv_T_Stock_TenantId_LocationId_ProductId_LotNo] UNIQUE NONCLUSTERED ([TenantId] ASC, [LocationId] ASC, [ProductId] ASC, [LotNo] ASC);
END
GO
IF INDEXPROPERTY(OBJECT_ID(N'[dbo].[Inv_T_Stock]'), 'IX_Inv_T_Stock_ProductId', 'IndexID') IS NULL
BEGIN
CREATE INDEX [IX_Inv_T_Stock_ProductId] ON [dbo].[Inv_T_Stock] ([ProductId] ASC);
END
GO
IF OBJECT_ID(N'[dbo].[FK_Inv_T_Stock_BranchId]', 'F') IS NULL
BEGIN
ALTER TABLE [dbo].[Inv_T_Stock] ADD CONSTRAINT [FK_Inv_T_Stock_BranchId] FOREIGN KEY ([BranchId]) REFERENCES [dbo].[Sas_T_Branch] ([Id]) ON DELETE NO ACTION ON UPDATE NO ACTION;
END
GO
IF OBJECT_ID(N'[dbo].[FK_Inv_T_Stock_LocationId]', 'F') IS NULL
BEGIN
ALTER TABLE [dbo].[Inv_T_Stock] ADD CONSTRAINT [FK_Inv_T_Stock_LocationId] FOREIGN KEY ([LocationId]) REFERENCES [dbo].[Inv_T_Location] ([Id]) ON DELETE NO ACTION ON UPDATE NO ACTION;
END
GO

View file

@ -0,0 +1,95 @@
-- Envanter hareket belgesi: Alım, Teslimat, İç Transfer (ve sonra Üretim) aynı başlık tablosunu paylaşır; tür OperationKind ile ayrılır.
IF OBJECT_ID(N'[dbo].[Inv_T_Transfer]', 'U') IS NULL
BEGIN
CREATE TABLE [dbo].[Inv_T_Transfer]
(
[Id] uniqueidentifier NOT NULL DEFAULT NEWID(),
[TenantId] uniqueidentifier NULL,
[TransferNo] nvarchar(32) NULL,
[BranchId] uniqueidentifier NOT NULL,
[WarehouseId] uniqueidentifier NOT NULL,
[OperationTypeId] uniqueidentifier NOT NULL,
[OperationKind] nvarchar(32) NOT NULL DEFAULT 'Receipt',
[PartnerId] uniqueidentifier NULL,
[SourceLocationId] uniqueidentifier NULL,
[DestinationLocationId] uniqueidentifier NULL,
[ScheduledDate] datetime NOT NULL DEFAULT GETUTCDATE(),
[EffectiveDate] datetime NULL,
[SourceDocument] nvarchar(128) NULL,
[PurchaseOrderId] uniqueidentifier NULL,
[BackorderOfId] uniqueidentifier NULL,
[ReturnOfId] uniqueidentifier NULL,
[CarrierId] uniqueidentifier NULL,
[TrackingReference] nvarchar(128) NULL,
[Weight] decimal(18, 4) NOT NULL DEFAULT 0,
[ShippingWeight] decimal(18, 4) NOT NULL DEFAULT 0,
[ResponsibleUserId] uniqueidentifier NULL,
[ProjectId] uniqueidentifier NULL,
[DeliveryPolicy] nvarchar(16) NULL,
[Note] nvarchar(MAX) NULL,
[LineSummary] nvarchar(MAX) NULL,
[Status] nvarchar(16) NOT NULL DEFAULT 'Draft',
[PendingAction] nvarchar(16) NULL,
[SourceApproverUserNames] nvarchar(512) NULL,
[ApprovalUserName] nvarchar(256) NULL,
[ApprovalStatus] nvarchar(50) NULL,
[ApprovalDate] datetime NULL,
[ApprovalDescription] nvarchar(200) NULL,
[ReceivedByUserId] uniqueidentifier NULL,
[ReceivedDate] datetime NULL,
[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_Inv_T_Transfer] 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].[Inv_T_Transfer]'), 'IX_Inv_T_Transfer_TenantId_OperationKind_Status', 'IndexID') IS NULL
BEGIN
CREATE INDEX [IX_Inv_T_Transfer_TenantId_OperationKind_Status] ON [dbo].[Inv_T_Transfer] ([TenantId] ASC, [OperationKind] ASC, [Status] ASC);
END
GO
IF INDEXPROPERTY(OBJECT_ID(N'[dbo].[Inv_T_Transfer]'), 'IX_Inv_T_Transfer_OperationTypeId', 'IndexID') IS NULL
BEGIN
CREATE INDEX [IX_Inv_T_Transfer_OperationTypeId] ON [dbo].[Inv_T_Transfer] ([OperationTypeId] ASC);
END
GO
IF INDEXPROPERTY(OBJECT_ID(N'[dbo].[Inv_T_Transfer]'), 'IX_Inv_T_Transfer_PurchaseOrderId', 'IndexID') IS NULL
BEGIN
CREATE INDEX [IX_Inv_T_Transfer_PurchaseOrderId] ON [dbo].[Inv_T_Transfer] ([PurchaseOrderId] ASC);
END
GO
IF OBJECT_ID(N'[dbo].[FK_Inv_T_Transfer_BranchId]', 'F') IS NULL
BEGIN
ALTER TABLE [dbo].[Inv_T_Transfer] ADD CONSTRAINT [FK_Inv_T_Transfer_BranchId] FOREIGN KEY ([BranchId]) REFERENCES [dbo].[Sas_T_Branch] ([Id]) ON DELETE NO ACTION ON UPDATE NO ACTION;
END
GO
IF OBJECT_ID(N'[dbo].[FK_Inv_T_Transfer_OperationTypeId]', 'F') IS NULL
BEGIN
ALTER TABLE [dbo].[Inv_T_Transfer] ADD CONSTRAINT [FK_Inv_T_Transfer_OperationTypeId] FOREIGN KEY ([OperationTypeId]) REFERENCES [dbo].[Inv_T_OperationType] ([Id]) ON DELETE NO ACTION ON UPDATE NO ACTION;
END
GO
IF OBJECT_ID(N'[dbo].[FK_Inv_T_Transfer_SourceLocationId]', 'F') IS NULL
BEGIN
ALTER TABLE [dbo].[Inv_T_Transfer] ADD CONSTRAINT [FK_Inv_T_Transfer_SourceLocationId] FOREIGN KEY ([SourceLocationId]) REFERENCES [dbo].[Inv_T_Location] ([Id]) ON DELETE NO ACTION ON UPDATE NO ACTION;
END
GO
IF OBJECT_ID(N'[dbo].[FK_Inv_T_Transfer_DestinationLocationId]', 'F') IS NULL
BEGIN
ALTER TABLE [dbo].[Inv_T_Transfer] ADD CONSTRAINT [FK_Inv_T_Transfer_DestinationLocationId] FOREIGN KEY ([DestinationLocationId]) REFERENCES [dbo].[Inv_T_Location] ([Id]) ON DELETE NO ACTION ON UPDATE NO ACTION;
END
GO

View file

@ -0,0 +1,44 @@
IF OBJECT_ID(N'[dbo].[Inv_T_TransferLine]', 'U') IS NULL
BEGIN
CREATE TABLE [dbo].[Inv_T_TransferLine]
(
[Id] uniqueidentifier NOT NULL DEFAULT NEWID(),
[TenantId] uniqueidentifier NULL,
[TransferId] uniqueidentifier NOT NULL,
[ProductId] uniqueidentifier NOT NULL,
[Description] nvarchar(512) NULL,
[DemandQuantity] decimal(18, 4) NOT NULL DEFAULT 1,
[Quantity] decimal(18, 4) NOT NULL DEFAULT 0,
[UomId] nvarchar(64) NOT NULL DEFAULT 'Adet',
[PurchaseOrderLineId] uniqueidentifier NULL,
[MaterialRequestItemId] uniqueidentifier NULL,
[PendingAction] nvarchar(16) NULL,
[TrackingMethod] nvarchar(16) NULL,
[LotFromStock] bit NOT NULL DEFAULT 0,
[LotNumbers] nvarchar(max) NULL,
[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_Inv_T_TransferLine] 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].[Inv_T_TransferLine]'), 'IX_Inv_T_TransferLine_TransferId', 'IndexID') IS NULL
BEGIN
CREATE INDEX [IX_Inv_T_TransferLine_TransferId] ON [dbo].[Inv_T_TransferLine] ([TransferId] ASC);
END
GO
IF OBJECT_ID(N'[dbo].[FK_Inv_T_TransferLine_TransferId]', 'F') IS NULL
BEGIN
ALTER TABLE [dbo].[Inv_T_TransferLine] ADD CONSTRAINT [FK_Inv_T_TransferLine_TransferId] FOREIGN KEY ([TransferId]) REFERENCES [dbo].[Inv_T_Transfer] ([Id]) ON DELETE CASCADE ON UPDATE NO ACTION;
END
GO

View file

@ -0,0 +1,36 @@
-- Hareket satırının lot/seri dağılımı; miktar satırın biriminde tutulur.
IF OBJECT_ID(N'[dbo].[Inv_T_TransferLineLot]', 'U') IS NULL
BEGIN
CREATE TABLE [dbo].[Inv_T_TransferLineLot]
(
[Id] uniqueidentifier NOT NULL DEFAULT NEWID(),
[TenantId] uniqueidentifier NULL,
[TransferLineId] uniqueidentifier NOT NULL,
[LotNo] nvarchar(64) NOT NULL,
[Quantity] decimal(18, 4) NOT NULL DEFAULT 1,
[CreationTime] datetime2 NOT NULL DEFAULT GETUTCDATE(),
[CreatorId] uniqueidentifier NULL,
[LastModificationTime] datetime2 NULL,
[LastModifierId] uniqueidentifier NULL,
[IsDeleted] bit NOT NULL DEFAULT 0,
[DeletionTime] datetime2 NULL,
[DeleterId] uniqueidentifier NULL,
CONSTRAINT [PK_Inv_T_TransferLineLot] 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].[Inv_T_TransferLineLot]'), 'IX_Inv_T_TransferLineLot_TransferLineId', 'IndexID') IS NULL
BEGIN
CREATE INDEX [IX_Inv_T_TransferLineLot_TransferLineId] ON [dbo].[Inv_T_TransferLineLot] ([TransferLineId] ASC);
END
GO
IF OBJECT_ID(N'[dbo].[FK_Inv_T_TransferLineLot_TransferLineId]', 'F') IS NULL
BEGIN
ALTER TABLE [dbo].[Inv_T_TransferLineLot] ADD CONSTRAINT [FK_Inv_T_TransferLineLot_TransferLineId] FOREIGN KEY ([TransferLineId]) REFERENCES [dbo].[Inv_T_TransferLine] ([Id]) ON DELETE CASCADE ON UPDATE NO ACTION;
END
GO

View file

@ -0,0 +1,11 @@
-- Hareketler: bütün operasyon türlerinin satırları ortak kolonlarla, lot/seri dağılımı varsa lot başına bir satır.
-- Miktar yapılan miktardır (lotlu satırda lotun miktarı); Talep satırın talep miktarıdır.
CREATE OR ALTER VIEW [dbo].[Inv_V_StockMove] AS
SELECT COALESCE(z.Id, l.Id) AS Id, l.TenantId, t.Id AS TransferId, t.TransferNo, t.OperationKind, t.OperationTypeId, t.Status,
COALESCE(t.EffectiveDate, t.ScheduledDate) AS MoveDate, t.BranchId, t.WarehouseId,
t.SourceLocationId, t.DestinationLocationId, t.PartnerId, t.SourceDocument,
l.ProductId, COALESCE(z.LotNo, '') AS LotNo, l.DemandQuantity, COALESCE(z.Quantity, l.Quantity) AS Quantity, l.UomId
FROM Inv_T_TransferLine l
INNER JOIN Inv_T_Transfer t ON t.Id = l.TransferId
LEFT JOIN Inv_T_TransferLineLot z ON z.TransferLineId = l.Id AND z.IsDeleted = 0
WHERE l.IsDeleted = 0 AND t.IsDeleted = 0

View file

@ -0,0 +1,5 @@
-- Lot Detayları diyaloğu: satırın lot/seri dağılımı; BaseId diyaloğun süzdüğü (ve yeni satıra yazdığı) hareket satırıdır.
CREATE OR ALTER VIEW [dbo].[Inv_V_TransferLineLot] AS
SELECT z.Id, z.TenantId, z.TransferLineId AS BaseId, z.LotNo, z.Quantity, z.CreationTime, z.CreatorId, z.LastModificationTime, z.LastModifierId
FROM Inv_T_TransferLineLot z
WHERE z.IsDeleted = 0

View file

@ -0,0 +1,15 @@
-- Stoktan Lot Seçimi diyaloğu: stoktan çıkan satırın kaynak konumundaki bütün lotları (eldeki miktar satırın biriminde) ve
-- satıra atanmış miktarları. BaseId diyaloğun süzdüğü hareket satırıdır; Id satır + stok kaydıdır (kayıt yordamı ikisini ayırır).
-- Atanmış lotun stoğu bitse de (tamamlanmış belge) satır görünür.
CREATE OR ALTER VIEW [dbo].[Inv_V_TransferLineLotStock] AS
SELECT CONCAT(CAST(l.Id AS nvarchar(36)), ':', CAST(s.Id AS nvarchar(36))) AS Id, l.TenantId, l.Id AS BaseId, s.LotNo, s.InDate,
dbo.Inv_F_UomConvert(s.Quantity, s.UomId, l.UomId) AS OnHand, l.UomId,
CAST(CASE WHEN z.Quantity IS NULL THEN 0 ELSE 1 END AS bit) AS IsSelected, z.Quantity AS SelectedQuantity
FROM Inv_T_TransferLine l
INNER JOIN Inv_T_Transfer t ON t.Id = l.TransferId
INNER JOIN Inv_T_Stock s ON s.LocationId = t.SourceLocationId AND s.ProductId = l.ProductId AND s.LotNo <> '' AND s.IsDeleted = 0
LEFT JOIN (SELECT TransferLineId, LotNo, SUM(Quantity) AS Quantity
FROM Inv_T_TransferLineLot
WHERE IsDeleted = 0
GROUP BY TransferLineId, LotNo) z ON z.TransferLineId = l.Id AND z.LotNo = s.LotNo
WHERE l.IsDeleted = 0 AND (s.Quantity > 0 OR z.Quantity IS NOT NULL)

View file

@ -15,6 +15,7 @@ BEGIN
IF NOT EXISTS (SELECT 1 FROM Prc_T_PurchaseOrderLine WHERE PurchaseOrderId = @Id AND IsDeleted = 0) IF NOT EXISTS (SELECT 1 FROM Prc_T_PurchaseOrderLine WHERE PurchaseOrderId = @Id AND IsDeleted = 0)
THROW 50182, N'Kalemi olmayan sipariş onaylanamaz.', 1; THROW 50182, N'Kalemi olmayan sipariş onaylanamaz.', 1;
UPDATE Prc_T_PurchaseOrder SET Status = 'Purchase', ConfirmDate = GETUTCDATE() WHERE Id = @Id; UPDATE Prc_T_PurchaseOrder SET Status = 'Purchase', ConfirmDate = GETUTCDATE() WHERE Id = @Id;
EXEC Inv_P_TransferFromPurchaseOrder @Id, @UserId;
END END
ELSE IF @Action = 'Send' ELSE IF @Action = 'Send'
BEGIN BEGIN
@ -22,7 +23,13 @@ BEGIN
EXEC Prc_P_PurchaseOrderSend @Id, @UserId; EXEC Prc_P_PurchaseOrderSend @Id, @UserId;
END END
ELSE IF @Action = 'Cancel' ELSE IF @Action = 'Cancel'
BEGIN
IF EXISTS (SELECT 1 FROM Inv_T_Transfer WHERE PurchaseOrderId = @Id AND IsDeleted = 0 AND Status = 'Done')
THROW 50318, N'Teslim alınmış (yapılmış alımı olan) sipariş iptal edilemez.', 1;
UPDATE Prc_T_PurchaseOrder SET Status = 'Cancelled' WHERE Id = @Id; UPDATE Prc_T_PurchaseOrder SET Status = 'Cancelled' WHERE Id = @Id;
-- Siparişin yapılmamış alımları da iptal olur; sipariş yeniden onaylanırsa yeni alım açılır.
UPDATE Inv_T_Transfer SET Status = 'Cancelled' WHERE PurchaseOrderId = @Id AND IsDeleted = 0 AND Status IN ('Draft', 'Waiting', 'Ready');
END
ELSE IF @Action = 'Draft' ELSE IF @Action = 'Draft'
BEGIN BEGIN
IF @Status <> 'Cancelled' THROW 50184, N'Yalnız iptal edilmiş sipariş taslağa alınabilir.', 1; IF @Status <> 'Cancelled' THROW 50184, N'Yalnız iptal edilmiş sipariş taslağa alınabilir.', 1;

View file

@ -31,7 +31,7 @@ BEGIN
WHILE @@FETCH_STATUS = 0 WHILE @@FETCH_STATUS = 0
BEGIN BEGIN
SET @Po = NEWID(); SET @Po = NEWID();
EXEC Adm_P_SequenceNext N'PurchaseOrder1', @Tenant, @No OUTPUT; EXEC Adm_P_SequenceNext N'Prc.PurchaseOrder', @Tenant, @No OUTPUT;
INSERT INTO Prc_T_PurchaseOrder (Id, TenantId, OrderNo, PurchaseRfqId, SupplierId, SupplierReference, AgreementId, BranchId, OperationTypeId, WarehouseId, CurrencyId, INSERT INTO Prc_T_PurchaseOrder (Id, TenantId, OrderNo, PurchaseRfqId, SupplierId, SupplierReference, AgreementId, BranchId, OperationTypeId, WarehouseId, CurrencyId,
ExpectedArrival, ConfirmDate, BuyerUserId, ProjectId, IncotermId, IncotermLocation, PaymentTermId, Terms, ExpectedArrival, ConfirmDate, BuyerUserId, ProjectId, IncotermId, IncotermLocation, PaymentTermId, Terms,
@ -50,6 +50,7 @@ BEGIN
WHERE w.RfqId = @Rfq; WHERE w.RfqId = @Rfq;
EXEC Prc_P_PurchaseOrderRecalc @Po; EXEC Prc_P_PurchaseOrderRecalc @Po;
EXEC Inv_P_TransferFromPurchaseOrder @Po, @UserId;
FETCH NEXT FROM winners INTO @Rfq; FETCH NEXT FROM winners INTO @Rfq;
END END
CLOSE winners; CLOSE winners;

View file

@ -16,7 +16,7 @@ BEGIN
IF EXISTS (SELECT 1 FROM Prc_T_PurchaseRfq WHERE TenderGroupId = @Group AND SupplierId = @SupplierId AND IsDeleted = 0 AND Status <> 'Cancelled') IF EXISTS (SELECT 1 FROM Prc_T_PurchaseRfq WHERE TenderGroupId = @Group AND SupplierId = @SupplierId AND IsDeleted = 0 AND Status <> 'Cancelled')
THROW 50167, N'Bu tedarikçinin ihalede zaten bir teklif talebi var.', 1; THROW 50167, N'Bu tedarikçinin ihalede zaten bir teklif talebi var.', 1;
EXEC Adm_P_SequenceNext N'PurchaseRfq', @Tenant, @No OUTPUT; EXEC Adm_P_SequenceNext N'Prc.PurchaseRfq', @Tenant, @No OUTPUT;
INSERT INTO Prc_T_PurchaseRfq (Id, TenantId, RfqNo, TenderGroupId, SupplierId, AgreementId, BranchId, OperationTypeId, WarehouseId, CurrencyId, OrderDeadline, INSERT INTO Prc_T_PurchaseRfq (Id, TenantId, RfqNo, TenderGroupId, SupplierId, AgreementId, BranchId, OperationTypeId, WarehouseId, CurrencyId, OrderDeadline,
ExpectedArrival, BuyerUserId, ProjectId, IncotermId, IncotermLocation, PaymentTermId, ExpectedArrival, BuyerUserId, ProjectId, IncotermId, IncotermLocation, PaymentTermId,

View file

@ -15,6 +15,7 @@ BEGIN
[DeliveryDate] datetime NULL, [DeliveryDate] datetime NULL,
[MaterialRequestItemId] uniqueidentifier NULL, [MaterialRequestItemId] uniqueidentifier NULL,
[PurchaseRfqLineId] uniqueidentifier NULL, [PurchaseRfqLineId] uniqueidentifier NULL,
[ReceivedQuantity] decimal(18, 4) NOT NULL DEFAULT 0,
[CreationTime] datetime2 NOT NULL DEFAULT GETUTCDATE(), [CreationTime] datetime2 NOT NULL DEFAULT GETUTCDATE(),
[CreatorId] uniqueidentifier NULL, [CreatorId] uniqueidentifier NULL,
[LastModificationTime] datetime2 NULL, [LastModificationTime] datetime2 NULL,

View file

@ -0,0 +1,17 @@
-- İç 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'))

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -87,7 +87,7 @@
"Tr": "Departman" "Tr": "Departman"
}, },
{ {
"FieldName": "ResponsibleUserId", "FieldName": "ResponsibleUserName",
"CaptionName": "App.Listform.ListformField.WarehouseResponsible", "CaptionName": "App.Listform.ListformField.WarehouseResponsible",
"En": "Warehouse Responsible", "En": "Warehouse Responsible",
"Tr": "Depo Sorumlusu" "Tr": "Depo Sorumlusu"
@ -390,6 +390,7 @@
"AllowAllDeleting": false, "AllowAllDeleting": false,
"AllowAdding": true, "AllowAdding": true,
"AllowDuplicate": false, "AllowDuplicate": false,
"OpenDetailAfterInsert": false,
"UseIcons": false, "UseIcons": false,
"ConfirmDelete": true, "ConfirmDelete": true,
"NewRowPosition": "viewportTop", "NewRowPosition": "viewportTop",
@ -470,6 +471,7 @@
"ApprovalDescriptionFieldName": null, "ApprovalDescriptionFieldName": null,
"ApprovalIsFilterUserName": false, "ApprovalIsFilterUserName": false,
"ApprovalIsResetWorkflow": false, "ApprovalIsResetWorkflow": false,
"ApprovalIsManualStart": false,
"Criteria": [] "Criteria": []
}, },
"UserId": null, "UserId": null,
@ -947,6 +949,8 @@
"IgnoreEmptyValue": false, "IgnoreEmptyValue": false,
"Reevaluate": true, "Reevaluate": true,
"ComparisonType": "", "ComparisonType": "",
"ComparisonTarget": null,
"ValidationCallback": null,
"Pattern": "", "Pattern": "",
"Max": null, "Max": null,
"Min": null, "Min": null,
@ -1085,6 +1089,8 @@
"IgnoreEmptyValue": false, "IgnoreEmptyValue": false,
"Reevaluate": true, "Reevaluate": true,
"ComparisonType": "", "ComparisonType": "",
"ComparisonTarget": null,
"ValidationCallback": null,
"Pattern": "", "Pattern": "",
"Max": null, "Max": null,
"Min": null, "Min": null,
@ -1349,6 +1355,8 @@
"IgnoreEmptyValue": false, "IgnoreEmptyValue": false,
"Reevaluate": true, "Reevaluate": true,
"ComparisonType": "", "ComparisonType": "",
"ComparisonTarget": null,
"ValidationCallback": null,
"Pattern": "", "Pattern": "",
"Max": null, "Max": null,
"Min": null, "Min": null,
@ -1539,7 +1547,7 @@
"JoinFieldName2": null, "JoinFieldName2": null,
"BaseTableJoinFieldName2_OrValue": null "BaseTableJoinFieldName2_OrValue": null
}, },
"FieldName": "ResponsibleUserId", "FieldName": "ResponsibleUserName",
"CaptionName": "App.Listform.ListformField.WarehouseResponsible", "CaptionName": "App.Listform.ListformField.WarehouseResponsible",
"PlaceHolder": null, "PlaceHolder": null,
"ReadOnly": false, "ReadOnly": false,
@ -1547,7 +1555,7 @@
"IsActive": true, "IsActive": true,
"Width": 0, "Width": 0,
"ListOrderNo": 7, "ListOrderNo": 7,
"SourceDbType": 9, "SourceDbType": 16,
"CultureName": "en", "CultureName": "en",
"DataType": "string", "DataType": "string",
"SortIndex": 0, "SortIndex": 0,
@ -1604,7 +1612,7 @@
"CascadeFilterOperator": "=", "CascadeFilterOperator": "=",
"CascadeParentFields": null, "CascadeParentFields": null,
"CascadeEmptyFields": null, "CascadeEmptyFields": null,
"LookupQuery": "SELECT Id AS [Key], CONCAT(Name, ' ', Surname) AS [Name] FROM AbpUsers WHERE IsDeleted = 'false' AND IsActive = 1 ORDER BY Name" "LookupQuery": "SELECT UserName AS [Key], CONCAT(Name, ' ', Surname) AS [Name] FROM AbpUsers WHERE IsDeleted = 'false' AND IsActive = 1 ORDER BY Name"
}, },
"ValidationRuleDto": [], "ValidationRuleDto": [],
"ColumnStylingDto": [], "ColumnStylingDto": [],
@ -1739,6 +1747,8 @@
"IgnoreEmptyValue": false, "IgnoreEmptyValue": false,
"Reevaluate": true, "Reevaluate": true,
"ComparisonType": "", "ComparisonType": "",
"ComparisonTarget": null,
"ValidationCallback": null,
"Pattern": "", "Pattern": "",
"Max": null, "Max": null,
"Min": null, "Min": null,
@ -2003,6 +2013,8 @@
"IgnoreEmptyValue": false, "IgnoreEmptyValue": false,
"Reevaluate": true, "Reevaluate": true,
"ComparisonType": "", "ComparisonType": "",
"ComparisonTarget": null,
"ValidationCallback": null,
"Pattern": "", "Pattern": "",
"Max": null, "Max": null,
"Min": null, "Min": null,

View file

@ -32,8 +32,8 @@
"MenuTr": "Operasyon Türleri", "MenuTr": "Operasyon Türleri",
"TitleEn": "Operation Types", "TitleEn": "Operation Types",
"TitleTr": "Operasyon Türleri", "TitleTr": "Operasyon Türleri",
"DescEn": "Operation Types — stock operation types defined per branch and warehouse (e.g. Receipts, Deliveries, Internal Transfers).\nWhere: Inventory › Definitions › Operation Types.\nFields: operation type name, type (Receipt / Delivery / Internal Transfer / Manufacturing / Repair), branch, warehouse (filtered by branch), sequence prefix, barcode, default source and destination locations (filtered by warehouse), active.\nUsed by: stock movement documents pick their type from here. Changing the branch clears warehouse and locations.", "DescEn": "Operation Types — stock operation types defined per branch and warehouse (e.g. Receipts, Deliveries, Internal Transfers).\nWhere: Inventory › Definitions › Operation Types.\nFields: operation type name, type (Receipt / Delivery / Internal Transfer / Manufacturing / Repair), branch, warehouse (filtered by branch), sequence (document numbers of the transfers come from it, e.g. IKT/IN/00001), barcode, default source and destination locations (filtered by warehouse), active.\nUsed by: stock movement documents pick their type from here. Changing the branch clears warehouse and locations.",
"DescTr": "Operasyon Türleri — şube ve depo bazında tanımlanan stok operasyon türleri (ör. Alımlar, Teslimatlar, İç Transferler).\nNerede: Envanter › Tanımlamalar › Operasyon Türleri.\nAlanlar: operasyon türü adı, tür (Alım / Teslimat / İç Transfer / Üretim / Onarım), şube, depo (şubeye göre süzülür), sıra öneki, barkod, varsayılan kaynak ve hedef konum (depoya göre süzülür), aktif.\nKullanıldığı yer: stok hareket belgeleri türünü buradan seçer. Şube değişince depo ve konumlar temizlenir.", "DescTr": "Operasyon Türleri — şube ve depo bazında tanımlanan stok operasyon türleri (ör. Alımlar, Teslimatlar, İç Transferler).\nNerede: Envanter › Tanımlamalar › Operasyon Türleri.\nAlanlar: operasyon türü adı, tür (Alım / Teslimat / İç Transfer / Üretim / Onarım), şube, depo (şubeye göre süzülür), numaratör (transfer belgelerinin numarası buradan gelir, ör. IKT/IN/00001), barkod, varsayılan kaynak ve hedef konum (depoya göre süzülür), aktif.\nKullanıldığı yer: stok hareket belgeleri türünü buradan seçer. Şube değişince depo ve konumlar temizlenir.",
"Texts": [ "Texts": [
{ {
"Key": "App.StaticLookup.Receipt", "Key": "App.StaticLookup.Receipt",
@ -96,10 +96,10 @@
"Tr": "Tür" "Tr": "Tür"
}, },
{ {
"FieldName": "SequencePrefix", "FieldName": "SequenceName",
"CaptionName": "App.Listform.ListformField.SequencePrefix", "CaptionName": "App.Listform.ListformField.SequenceName",
"En": "Sequence Prefix", "En": "Sequence",
"Tr": "Sıra Öneki" "Tr": "Numaratör"
}, },
{ {
"FieldName": "Barcode", "FieldName": "Barcode",
@ -964,6 +964,8 @@
"IgnoreEmptyValue": false, "IgnoreEmptyValue": false,
"Reevaluate": true, "Reevaluate": true,
"ComparisonType": "", "ComparisonType": "",
"ComparisonTarget": null,
"ValidationCallback": null,
"Pattern": "", "Pattern": "",
"Max": null, "Max": null,
"Min": null, "Min": null,
@ -1102,6 +1104,8 @@
"IgnoreEmptyValue": false, "IgnoreEmptyValue": false,
"Reevaluate": true, "Reevaluate": true,
"ComparisonType": "", "ComparisonType": "",
"ComparisonTarget": null,
"ValidationCallback": null,
"Pattern": "", "Pattern": "",
"Max": null, "Max": null,
"Min": null, "Min": null,
@ -1240,6 +1244,8 @@
"IgnoreEmptyValue": false, "IgnoreEmptyValue": false,
"Reevaluate": true, "Reevaluate": true,
"ComparisonType": "", "ComparisonType": "",
"ComparisonTarget": null,
"ValidationCallback": null,
"Pattern": "", "Pattern": "",
"Max": null, "Max": null,
"Min": null, "Min": null,
@ -1378,6 +1384,8 @@
"IgnoreEmptyValue": false, "IgnoreEmptyValue": false,
"Reevaluate": true, "Reevaluate": true,
"ComparisonType": "", "ComparisonType": "",
"ComparisonTarget": null,
"ValidationCallback": null,
"Pattern": "", "Pattern": "",
"Max": null, "Max": null,
"Min": null, "Min": null,
@ -1442,8 +1450,8 @@
"JoinFieldName2": null, "JoinFieldName2": null,
"BaseTableJoinFieldName2_OrValue": null "BaseTableJoinFieldName2_OrValue": null
}, },
"FieldName": "SequencePrefix", "FieldName": "SequenceName",
"CaptionName": "App.Listform.ListformField.SequencePrefix", "CaptionName": "App.Listform.ListformField.SequenceName",
"PlaceHolder": null, "PlaceHolder": null,
"ReadOnly": false, "ReadOnly": false,
"Visible": true, "Visible": true,
@ -1500,16 +1508,30 @@
"ShowInColumn": null "ShowInColumn": null
}, },
"LookupDto": { "LookupDto": {
"DataSourceType": 0, "DataSourceType": 2,
"ValueExpr": "Key", "ValueExpr": "Key",
"DisplayExpr": "Name", "DisplayExpr": "Name",
"CascadeRelationField": null, "CascadeRelationField": null,
"CascadeFilterOperator": "=", "CascadeFilterOperator": "=",
"CascadeParentFields": null, "CascadeParentFields": null,
"CascadeEmptyFields": null, "CascadeEmptyFields": null,
"LookupQuery": null "LookupQuery": "SELECT Name AS [Key], CONCAT(Name, ' (', Prefix, ')') AS [Name] FROM Adm_T_Sequence WHERE IsDeleted = 'false' AND IsActive = 1 AND TenantId = '@TENANTID' ORDER BY Name"
}, },
"ValidationRuleDto": [], "ValidationRuleDto": [
{
"Type": "required",
"Message": null,
"IgnoreEmptyValue": false,
"Reevaluate": true,
"ComparisonType": "",
"ComparisonTarget": null,
"ValidationCallback": null,
"Pattern": "",
"Max": null,
"Min": null,
"Trim": true
}
],
"ColumnStylingDto": [], "ColumnStylingDto": [],
"PermissionDto": { "PermissionDto": {
"Deny": false, "Deny": false,
@ -1539,9 +1561,9 @@
"Format": null, "Format": null,
"EditOrderNo": 5, "EditOrderNo": 5,
"EditGroupOrderNo": 1, "EditGroupOrderNo": 1,
"EditorType2": "dxTextBox", "EditorType2": "dxSelectBox",
"ColSpan": 1, "ColSpan": 1,
"EditorOptions": "{\"showClearButton\":true,\"maxLength\":16}", "EditorOptions": "{\"showClearButton\":true,\"searchEnabled\":true}",
"GridBoxOptions": null, "GridBoxOptions": null,
"TagBoxOptions": null, "TagBoxOptions": null,
"ImageUploadOptions": null, "ImageUploadOptions": null,
@ -2020,6 +2042,8 @@
"IgnoreEmptyValue": false, "IgnoreEmptyValue": false,
"Reevaluate": true, "Reevaluate": true,
"ComparisonType": "", "ComparisonType": "",
"ComparisonTarget": null,
"ValidationCallback": null,
"Pattern": "", "Pattern": "",
"Max": null, "Max": null,
"Min": null, "Min": null,
@ -2083,7 +2107,7 @@
"App.StaticLookup.Repair", "App.StaticLookup.Repair",
"App.Listform.ListformField.OperationTypeName", "App.Listform.ListformField.OperationTypeName",
"App.Listform.ListformField.OperationKind", "App.Listform.ListformField.OperationKind",
"App.Listform.ListformField.SequencePrefix", "App.Listform.ListformField.SequenceName",
"App.Listform.ListformField.SourceLocation", "App.Listform.ListformField.SourceLocation",
"App.Listform.ListformField.DestinationLocation" "App.Listform.ListformField.DestinationLocation"
], ],

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,937 @@
{
"Wizard": {
"ComponentKind": 0,
"WizardName": "Inventory_TransferNote",
"WizardCode": "App.Inventory.TransferNote",
"SeededAt": "2026-10-12T22:03:00+03:00",
"CustomComponentName": null,
"PermissionGroupName": "App.Inventory",
"ModuleId": "Inventory",
"Menu": {
"MenuParentPath": [
{
"Code": "App.Inventory",
"Icon": "FcPackage",
"En": "Inventory",
"Tr": "Envanter"
}
],
"MenuParentCode": "App.Inventory.Operations",
"MenuParentIcon": "FcServices",
"CreateMenu": false,
"MenuCode": "App.Inventory.TransferNote",
"MenuOrder": 0,
"MenuUrl": "/admin/list/App.Inventory.TransferNote",
"MenuIcon": "FcViewDetails"
},
"Language": {
"MenuParentEn": "Operations",
"MenuParentTr": "Operasyonlar",
"PermissionGroupEn": "Inventory",
"PermissionGroupTr": "Envanter",
"MenuEn": "Note",
"MenuTr": "Not",
"TitleEn": "Note",
"TitleTr": "Not",
"DescEn": "Note — free note of a transfer document (Note tab of receipts, deliveries and internal transfers).\nField: note (rich text).",
"DescTr": "Not — transfer belgesinin serbest notu (alım, teslimat ve iç transferlerin Not sekmesi).\nAlan: not (zengin metin)."
},
"Groups": [
{
"Items": [
{
"FieldName": "Id",
"CaptionName": "App.Listform.ListformField.Id",
"En": "Id",
"Tr": "Kimlik"
},
{
"FieldName": "Note",
"CaptionName": "App.Listform.ListformField.Note",
"En": "Note",
"Tr": "Not"
}
]
}
]
},
"ListForm": {
"EditType": null,
"DataSourceCode": "Default",
"KeyFieldDbSourceType": 9,
"TableName": null,
"DefaultFilter": "\"IsDeleted\" = 'false'",
"SelectCommand": "Inv_T_Transfer",
"SelectCommandType": 1,
"SelectFieldsDefaultValueDto": [],
"SeedFilePath": null,
"SeedSyncInsert": false,
"SeedSyncUpdate": false,
"SeedSyncDelete": false,
"DeleteCommand": null,
"DeleteBeforeCommand": null,
"DeleteAfterCommand": null,
"DeleteFieldsDefaultValueDto": [
{
"FieldName": "DeleterId",
"FieldDbType": 9,
"Value": "@USERID",
"CustomValueType": 2,
"SqlQuery": null
},
{
"FieldName": "Id",
"FieldDbType": 9,
"Value": "@ID",
"CustomValueType": 2,
"SqlQuery": null
}
],
"InsertCommand": null,
"InsertBeforeCommand": null,
"InsertAfterCommand": null,
"InsertFieldsDefaultValueDto": [
{
"FieldName": "CreationTime",
"FieldDbType": 6,
"Value": "@NOW",
"CustomValueType": 2,
"SqlQuery": null
},
{
"FieldName": "CreatorId",
"FieldDbType": 9,
"Value": "@USERID",
"CustomValueType": 2,
"SqlQuery": null
},
{
"FieldName": "IsDeleted",
"FieldDbType": 3,
"Value": "false",
"CustomValueType": 1,
"SqlQuery": null
},
{
"FieldName": "Id",
"FieldDbType": 9,
"Value": "@NEWID",
"CustomValueType": 2,
"SqlQuery": null
}
],
"UpdateCommand": null,
"UpdateBeforeCommand": "IF EXISTS (SELECT 1 FROM Inv_T_Transfer WHERE Id IN @Id AND Status = 'Cancelled') THROW 50320, N'İptal edilmiş belge değiştirilemez.', 1;",
"UpdateAfterCommand": null,
"UpdateFieldsDefaultValueDto": [
{
"FieldName": "LastModificationTime",
"FieldDbType": 6,
"Value": "@NOW",
"CustomValueType": 2,
"SqlQuery": null
},
{
"FieldName": "LastModifierId",
"FieldDbType": 9,
"Value": "@USERID",
"CustomValueType": 2,
"SqlQuery": null
}
],
"FormFieldsDefaultValueDto": [],
"WidgetsDto": [],
"ExtraFilterEditDto": [],
"ListFormCode": "App.Inventory.TransferNote",
"CultureName": "en",
"Name": "App.Inventory.TransferNote",
"KeyFieldName": "Id",
"Title": "App.Inventory.TransferNote.Title",
"SortMode": "single",
"PageSize": 10,
"Width": 0,
"Height": 0,
"FullHeight": false,
"Description": "App.Inventory.TransferNote.Desc",
"FilterRowDto": {
"Visible": true,
"ApplyFilter": "auto",
"AllowUserUiFilterSave": true
},
"RowDto": {
"RowHeight": "auto",
"WhiteSpace": "normal",
"OverflowWrap": "break-word"
},
"HeaderFilterDto": {
"Visible": true,
"AllowSearch": false,
"Height": 325,
"SearchTimeout": 500,
"Width": 252
},
"FilterPanelDto": {
"Visible": false,
"Texts": null,
"FilterEnabled": false,
"CustomizeText": null
},
"SearchPanelDto": {
"Visible": true,
"Width": 160
},
"GroupPanelDto": {
"Visible": true,
"AutoExpandAll": false
},
"SelectionDto": {
"Mode": "none",
"AllowSelectAll": false,
"SelectAllMode": "allPages",
"ShowCheckBoxesMode": "always"
},
"ColumnOptionDto": {
"ShowBorders": true,
"ShowRowLines": true,
"ShowColumnLines": false,
"RowAlternationEnabled": true,
"AllowColumnReordering": true,
"AllowColumnResizing": true,
"ColumnResizingMode": "widget",
"ColumnAutoWidth": true,
"RtlEnabled": false,
"ColumnFixingEnabled": true,
"ColumnChooserEnabled": true,
"ColumnChooserMode": "dragAndDrop",
"HoverStateEnabled": false,
"ColumnHidingEnabled": true,
"FocusedRowEnabled": true,
"ShowColumnHeaders": true
},
"PivotOptionDto": {
"ColumnChooserEnabled": false,
"AllowFieldDragging": true,
"ShowFieldPanel": true,
"ShowDataFields": true,
"ShowColumnFields": true,
"ShowRowFields": true,
"ShowFilterFields": true,
"ShowChart": false,
"ChartHeight": 320,
"ChartCommonSeriesType": "bar"
},
"TreeOptionDto": {
"KeyExpr": null,
"ParentIdExpr": null,
"HasItemsExpr": null,
"RootValue": null,
"ExpandedRowKeys": [],
"AutoExpandAll": false,
"RecursiveSelection": false,
"TitleExpr": null,
"StartExpr": null,
"EndExpr": null,
"ProgressExpr": null
},
"GanttOptionDto": {
"KeyExpr": null,
"ParentIdExpr": null,
"HasItemsExpr": null,
"RootValue": null,
"ExpandedRowKeys": [],
"AutoExpandAll": false,
"RecursiveSelection": false,
"TitleExpr": null,
"ScaleType": "weeks",
"StartExpr": null,
"EndExpr": null,
"ProgressExpr": null,
"EditingEnabled": false,
"AllowTaskAdding": false,
"AllowTaskUpdating": false,
"AllowTaskResourceUpdating": false,
"AllowTaskDeleting": false,
"AllowDependencyAdding": false,
"AllowDependencyDeleting": false,
"AllowResourceAdding": false,
"AllowResourceUpdating": false,
"AllowResourceDeleting": false
},
"SchedulerOptionDto": {
"TextExpr": null,
"UserNameExpr": null,
"DescriptionExpr": null,
"StartDateExpr": null,
"EndDateExpr": null,
"AllDayExpr": null,
"RecurrenceRuleExpr": null,
"RecurrenceExceptionExpr": null,
"StartDayHour": 8,
"EndDayHour": 20,
"DefaultView": "week",
"ShowAllDayPanel": true,
"CellDuration": 30,
"FirstDayOfWeek": 1,
"CrossScrollingEnabled": false,
"AllowResizing": false,
"AllowDragging": false,
"AllowDeleting": false,
"AllowEditing": false,
"AllowAdding": false
},
"TodoOptionDto": {
"TitleExpr": null,
"StatusExpr": null,
"DescriptionExpr": null,
"AnalysisExpr": null,
"DueDateExpr": null,
"TagExpr": null,
"AssigneeExpr": null,
"PriorityExpr": null,
"CompletedExpr": null,
"OrderExpr": null,
"TimesheetExpr": null,
"SubTaskExpr": null,
"StatusOrder": null,
"AllowDragging": true
},
"PagerOptionDto": {
"Visible": true,
"ShowPageSizeSelector": true,
"ShowInfo": false,
"ShowNavigationButtons": true,
"AllowedPageSizes": "10,20,50,100",
"InfoText": "Page {0} of {1} ({2} items)",
"DisplayMode": "adaptive",
"ScrollingMode": "standard",
"LoadPanelEnabled": "auto",
"LoadPanelText": "Loading..."
},
"EditingOptionDto": {
"Mode": "popup",
"RefreshMode": "full",
"AllowUpdating": true,
"AllowDetail": false,
"AllowDeleting": false,
"AllowAllDeleting": false,
"AllowAdding": false,
"AllowDuplicate": false,
"OpenDetailAfterInsert": false,
"UseIcons": false,
"ConfirmDelete": true,
"NewRowPosition": "viewportTop",
"SelectTextOnEditStart": false,
"StartEditAction": "click",
"EditColumnName": null,
"Popup": {
"Title": "App.Inventory.TransferNote.Title",
"ShowTitle": true,
"Width": 800,
"Height": 420,
"FullScreen": false,
"HideOnOutsideClick": true,
"ResizeEnabled": true,
"DragEnabled": true,
"RestorePosition": true,
"Position": "center"
},
"SendOnlyChangedFormValuesUpdate": false,
"AddPageUrl": null,
"AddDialogName": null,
"AddDialogParameters": null
},
"EditingFormDto": [
{
"Order": 1,
"ItemType": "group",
"Caption": "",
"ColCount": 1,
"ColSpan": 1
}
],
"PermissionDto": {
"C": "App.Inventory.TransferNote.Create",
"R": "App.Inventory.TransferNote",
"U": "App.Inventory.TransferNote.Update",
"D": "App.Inventory.TransferNote.Delete",
"E": "App.Inventory.TransferNote.Export",
"I": "App.Inventory.TransferNote.Import",
"N": "App.Inventory.TransferNote.Note"
},
"CommandColumnDto": [],
"StateStoringDto": {
"Enabled": true,
"Type": "custom",
"StorageKey": "listFormGridStorage-App.Inventory.TransferNote",
"SavingTimeout": 5000
},
"CustomJsSources": [],
"CustomStyleSources": [],
"UpdateServiceAddress": "list-form-data/update",
"InsertServiceAddress": "list-form-data/insert",
"DeleteServiceAddress": "list-form-data/delete",
"IsTenant": true,
"IsBranch": false,
"IsOrganizationUnit": false,
"ListFormType": "List",
"IsSubForm": false,
"ShowNote": false,
"SubFormsListFormType": "Form",
"SubFormsDto": [],
"ExtraFilterDto": [],
"LayoutDto": {
"Grid": true,
"Card": true,
"Pivot": true,
"Chart": true,
"Tree": false,
"Gantt": false,
"Scheduler": false,
"Todo": false,
"DefaultLayout": "grid"
},
"WorkflowDto": {
"ApprovalUserFieldName": null,
"ApprovalDateFieldName": null,
"ApprovalStatusFieldName": null,
"ApprovalDescriptionFieldName": null,
"ApprovalIsFilterUserName": false,
"ApprovalIsResetWorkflow": false,
"ApprovalIsManualStart": false,
"Criteria": []
},
"UserId": null,
"RoleId": null,
"CommonDto": {
"AdjustOnZoom": true,
"ContainerBackgroundColor": "#FFFFFF",
"Palette": "Material",
"PaletteExtensionMode": "blend",
"DefaultPane": null,
"Disabled": false,
"Theme": "generic.light"
},
"AdaptivelayoutDto": {
"Height": 80,
"Width": 80,
"KeepLabels": true
},
"AnimationDto": {
"Duration": 1000,
"Easing": "easeOutCubic",
"Enabled": true,
"MaxPointCountSupported": 300
},
"AnnotationsDto": [],
"ArgumentAxisDto": {
"ArgumentType": null,
"AggregationInterval": null,
"Grid": {
"Color": "#d3d3d3",
"Visible": false,
"Width": 1
},
"HoverMode": "none",
"Label": {
"DisplayMode": "standard",
"RotationAngle": 90,
"OverlappingBehavior": "hide"
},
"Position": "bottom",
"Title": null,
"Visible": true,
"Width": 1,
"WorkdaysOnly": false
},
"CommonAnnotationSettingsDto": {
"Argument": null,
"Border": {
"Color": "#d3d3d3",
"CornerRadius": 0,
"DashStyle": "solid",
"Visible": false,
"Width": 1
},
"Color": "#ffffff",
"Description": null,
"Font": {
"Color": "#FFFFFF",
"Family": "\"Segoe UI\", \"Helvetica Neue\", \"Trebuchet MS\", Verdana, sans-serif",
"Size": 12,
"Weight": 400
},
"Height": -1,
"Image": null,
"OffsetX": -1,
"OffsetY": -1,
"PaddingLeftRight": 10,
"PaddingTopBottom": 10,
"Series": null,
"Text": null,
"TooltipEnabled": true,
"Type": null,
"Value": null,
"Width": 0,
"WordWrap": "normal",
"X": 0,
"Y": 0
},
"CommonAxisSettingsDto": {
"Grid": {
"Color": "#d3d3d3",
"Visible": false,
"Width": 1
},
"Title": null,
"Visible": true,
"Width": 1
},
"CommonPaneSettingsDto": {
"BackgroundColor": null
},
"CommonSeriesSettingsDto": {
"ArgumentField": "arg",
"Axis": null,
"BarOverlapGroup": null,
"BarPadding": 0,
"BarWidth": 0,
"Color": null,
"CornerRadius": 0,
"DashStyle": "solid",
"IgnoreEmptyPoints": false,
"Pane": null,
"RangeValue1Field": "val1",
"RangeValue2Field": "val2",
"SelectionMode": "none",
"ShowInLegend": true,
"Type": null,
"ValueField": null,
"Visible": true,
"Width": 2,
"Label": null
},
"CrosshairDto": {
"Color": "#f05b41",
"DashStyle": "dot",
"Enabled": false,
"Width": 1,
"HorizontalLine": {
"Color": "#f05b41",
"DashStyle": "dot",
"Label": {
"BackgroundColor": "#f05b41",
"CustomizeText": null,
"Font": {
"Color": "#FFFFFF",
"Family": "\"Segoe UI\", \"Helvetica Neue\", \"Trebuchet MS\", Verdana, sans-serif",
"Size": 12,
"Weight": 400
},
"Visible": false,
"Format": null
},
"Visible": true,
"Width": 1
},
"Label": {
"BackgroundColor": "#f05b41",
"CustomizeText": null,
"Font": {
"Color": "#FFFFFF",
"Family": "\"Segoe UI\", \"Helvetica Neue\", \"Trebuchet MS\", Verdana, sans-serif",
"Size": 12,
"Weight": 400
},
"Visible": false,
"Format": null
},
"VerticalLine": {
"Color": "#f05b41",
"DashStyle": "dot",
"Label": {
"BackgroundColor": "#f05b41",
"CustomizeText": null,
"Font": {
"Color": "#FFFFFF",
"Family": "\"Segoe UI\", \"Helvetica Neue\", \"Trebuchet MS\", Verdana, sans-serif",
"Size": 12,
"Weight": 400
},
"Visible": false,
"Format": null
},
"Visible": true,
"Width": 1
}
},
"ExportDto": {
"BackgroundColor": "#FFFFFF",
"Enabled": true,
"AllowExportSelectedData": false,
"Margin": 10,
"PrintingEnabled": true
},
"LegendDto": {
"BackgroundColor": null,
"Border": {
"Color": "#d3d3d3",
"CornerRadius": 0,
"DashStyle": "solid",
"Visible": false,
"Width": 1
},
"ColumnCount": 0,
"Orientation": "vertical",
"Position": "outside",
"RowCount": 0,
"Title": null,
"Visible": true
},
"MarginDto": {
"Bottom": 0,
"Left": 0,
"Right": 0,
"Top": 0
},
"PanesDto": [],
"ScrollBarDto": {
"Color": "gray",
"Offset": 5,
"Position": "top",
"Visible": false,
"Width": 10
},
"SeriesDto": [],
"SizeDto": {
"UseSize": false,
"Width": 400,
"Height": 200
},
"TitleDto": {
"Text": null,
"VerticalAlignment": "top",
"HorizontalAlignment": "center",
"Subtitle": null,
"TextOverflow": "ellipsis",
"WordWrap": null
},
"TooltipDto": {
"ArgumentFormat": null,
"ArrowLength": 10,
"Border": {
"Color": "#d3d3d3",
"CornerRadius": 0,
"DashStyle": "solid",
"Visible": false,
"Width": 1
},
"Color": "#ffffff",
"Enabled": false,
"Font": {
"Color": "#000000",
"Family": "\"Segoe UI\", \"Helvetica Neue\", \"Trebuchet MS\", Verdana, sans-serif",
"Size": 12,
"Weight": 400
},
"Format": null,
"Location": "center",
"PaddingLeftRight": 18,
"PaddingTopBottom": 15,
"Shared": false
},
"ValueAxisDto": [],
"ZoomAndPanDto": {
"AllowMouseWheel": true,
"AllowTouchGestures": true,
"ArgumentAxis": "none",
"DragToZoom": false,
"PanKey": "shift",
"ValueAxis": "none",
"DragBoxStyle": {
"Color": null,
"Opacity": 0
}
},
"LastModificationTime": null,
"LastModifierId": null,
"CreationTime": "0001-01-01T00:00:00",
"CreatorId": null,
"Id": "00000000-0000-0000-0000-000000000000"
},
"Fields": [
{
"EditType": null,
"ListFormCode": "App.Inventory.TransferNote",
"RoleId": null,
"UserId": null,
"ColumnJoinTableDto": {
"JoinType": null,
"TableName": null,
"JoinFieldName": null,
"BaseTableJoinFieldName": null,
"SelectFieldName": null,
"FieldNameAlias": null,
"JoinCondition2": "AND",
"JoinFieldName2": null,
"BaseTableJoinFieldName2_OrValue": null
},
"FieldName": "Id",
"CaptionName": "App.Listform.ListformField.Id",
"PlaceHolder": null,
"ReadOnly": false,
"Visible": false,
"IsActive": true,
"Width": 0,
"ListOrderNo": 1,
"SourceDbType": 9,
"CultureName": "en",
"DataType": "string",
"SortIndex": 0,
"SortDirection": null,
"AllowSearch": true,
"AllowEditing": true,
"AllowAdding": true,
"ColumnCssClass": null,
"ColumnCssValue": null,
"BandName": null,
"ColumnFilterDto": {
"AllowFiltering": true,
"FilterOperations": null,
"SelectedFilterOperation": null,
"FilterValue": null
},
"ColumnHeaderDto": {
"AllowHeaderFiltering": true,
"AllowSearch": false,
"DataSource": null,
"DataSourceString": ""
},
"ColumnGroupingDto": {
"AllowGrouping": true,
"GroupIndex": null,
"AutoExpandGroup": false
},
"ColumnCustomizationDto": {
"Fixed": false,
"FixedPosition": "left",
"AllowReordering": true
},
"ColumnTotalSummaryDto": {
"SummaryType": null,
"ValueFormat": null,
"ShowInGroupFooter": false,
"AlignByColumn": false,
"DisplayFormat": null,
"ShowInColumn": null
},
"ColumnGroupSummaryDto": {
"SummaryType": null,
"ValueFormat": null,
"ShowInGroupFooter": false,
"AlignByColumn": false,
"DisplayFormat": null,
"ShowInColumn": null
},
"LookupDto": {
"DataSourceType": 0,
"ValueExpr": "Key",
"DisplayExpr": "Name",
"CascadeRelationField": null,
"CascadeFilterOperator": "=",
"CascadeParentFields": null,
"CascadeEmptyFields": null,
"LookupQuery": null
},
"ValidationRuleDto": [],
"ColumnStylingDto": [],
"PermissionDto": {
"Deny": false,
"C": "App.Inventory.TransferNote.Create",
"R": "App.Inventory.TransferNote",
"U": "App.Inventory.TransferNote.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.TransferNote",
"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": "Note",
"CaptionName": "App.Listform.ListformField.Note",
"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.TransferNote.Create",
"R": "App.Inventory.TransferNote",
"U": "App.Inventory.TransferNote.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": "dxHtmlEditor",
"ColSpan": 1,
"EditorOptions": "{\"height\":260}",
"GridBoxOptions": null,
"TagBoxOptions": null,
"ImageUploadOptions": null,
"EditorScript": null,
"LastModificationTime": null,
"LastModifierId": null,
"CreationTime": "0001-01-01T00:00:00",
"CreatorId": null,
"Id": "00000000-0000-0000-0000-000000000000"
}
],
"IsDeletedField": true,
"IsCreatedField": true,
"InsertedRecords": {
"LanguageKeys": [
"App.Inventory.TransferNote",
"App.Inventory.TransferNote.Title",
"App.Inventory.TransferNote.Desc"
],
"PermissionGroupNames": [],
"PermissionNames": [
"App.Inventory.TransferNote",
"App.Inventory.TransferNote.Create",
"App.Inventory.TransferNote.Update",
"App.Inventory.TransferNote.Delete",
"App.Inventory.TransferNote.Export",
"App.Inventory.TransferNote.Import",
"App.Inventory.TransferNote.Note"
],
"MenuCodes": [],
"DataSourceCodes": [],
"ModuleIds": []
}
}

File diff suppressed because it is too large Load diff

View file

@ -278,7 +278,7 @@
{ {
"FieldName": "RequestNo", "FieldName": "RequestNo",
"FieldDbType": 16, "FieldDbType": 16,
"Value": "MaterialRequest1", "Value": "Prc.MaterialRequest",
"CustomValueType": 5, "CustomValueType": 5,
"SqlQuery": "" "SqlQuery": ""
}, },

View file

@ -247,7 +247,7 @@
{ {
"FieldName": "AgreementNo", "FieldName": "AgreementNo",
"FieldDbType": 16, "FieldDbType": 16,
"Value": "PurchaseAgreement1", "Value": "Prc.PurchaseAgreement",
"CustomValueType": 5, "CustomValueType": 5,
"SqlQuery": "" "SqlQuery": ""
}, },
@ -2479,7 +2479,7 @@
"CaptionName": "App.Listform.ListformField.Terms", "CaptionName": "App.Listform.ListformField.Terms",
"PlaceHolder": null, "PlaceHolder": null,
"ReadOnly": false, "ReadOnly": false,
"Visible": true, "Visible": false,
"IsActive": true, "IsActive": true,
"Width": 0, "Width": 0,
"ListOrderNo": 13, "ListOrderNo": 13,

View file

@ -263,7 +263,7 @@
{ {
"FieldName": "OrderNo", "FieldName": "OrderNo",
"FieldDbType": 16, "FieldDbType": 16,
"Value": "PurchaseOrder1", "Value": "Prc.PurchaseOrder",
"CustomValueType": 5, "CustomValueType": 5,
"SqlQuery": "" "SqlQuery": ""
}, },
@ -3592,7 +3592,7 @@
"CaptionName": "App.Listform.ListformField.Terms", "CaptionName": "App.Listform.ListformField.Terms",
"PlaceHolder": null, "PlaceHolder": null,
"ReadOnly": false, "ReadOnly": false,
"Visible": true, "Visible": false,
"IsActive": true, "IsActive": true,
"Width": 0, "Width": 0,
"ListOrderNo": 21, "ListOrderNo": 21,

View file

@ -33,8 +33,8 @@
"MenuTr": "Sipariş Kalemleri", "MenuTr": "Sipariş Kalemleri",
"TitleEn": "Order Lines", "TitleEn": "Order Lines",
"TitleTr": "Sipariş Kalemleri", "TitleTr": "Sipariş Kalemleri",
"DescEn": "Order Lines — the products of a purchase order.\nWhere: Purchasing › Orders › Purchase Orders › Products tab (no menu of its own).\nFields: product, description, quantity, unit, unit price, tax rate, amount (tax included: quantity × unit price × (1 + tax rate), calculated), delivery date, material request line (read-only).\nRules: lines of a cancelled order cannot be changed; after every change the order totals are recalculated. Lines of an order converted from an RFQ come from the winning RFQ lines.", "DescEn": "Order Lines — the products of a purchase order.\nWhere: Purchasing › Orders › Purchase Orders › Products tab (no menu of its own).\nFields: product, description, quantity, unit, unit price, tax rate, amount (tax included: quantity × unit price × (1 + tax rate), calculated), delivery date, material request line (read-only); the list also shows the received quantity (written by Validate of the receipt, reduced by a return).\nRules: lines of a cancelled order cannot be changed; after every change the order totals are recalculated. Lines of an order converted from an RFQ come from the winning RFQ lines.",
"DescTr": "Sipariş Kalemleri — satınalma siparişinin ürünleri.\nNerede: Satınalma › Siparişler › Satınalma Siparişleri › Ürünler sekmesi (kendi menüsü yoktur).\nAlanlar: ürün, açıklama, miktar, birim, birim fiyat, vergi oranı, tutar (KDV dahil: miktar × birim fiyat × (1 + vergi oranı), hesaplanır), teslim tarihi, talep kalemi (salt okunur).\nKurallar: iptal edilmiş siparişin kalemi değiştirilemez; her değişiklikte sipariş toplamları yeniden hesaplanır. Teklif talebinden dönüştürülen siparişin kalemleri kazanan teklif kalemlerinden gelir." "DescTr": "Sipariş Kalemleri — satınalma siparişinin ürünleri.\nNerede: Satınalma › Siparişler › Satınalma Siparişleri › Ürünler sekmesi (kendi menüsü yoktur).\nAlanlar: ürün, açıklama, miktar, birim, birim fiyat, vergi oranı, tutar (KDV dahil: miktar × birim fiyat × (1 + vergi oranı), hesaplanır), teslim tarihi, talep kalemi (salt okunur); listede ayrıca alınan miktar (alımın Doğrula'sı yazar, iadede düşer).\nKurallar: iptal edilmiş siparişin kalemi değiştirilemez; her değişiklikte sipariş toplamları yeniden hesaplanır. Teklif talebinden dönüştürülen siparişin kalemleri kazanan teklif kalemlerinden gelir."
}, },
"Groups": [ "Groups": [
{ {
@ -69,6 +69,12 @@
"En": "Quantity", "En": "Quantity",
"Tr": "Miktar" "Tr": "Miktar"
}, },
{
"FieldName": "ReceivedQuantity",
"CaptionName": "App.Listform.ListformField.ReceivedQuantity",
"En": "Received",
"Tr": "Alınan"
},
{ {
"FieldName": "UomId", "FieldName": "UomId",
"CaptionName": "App.Listform.ListformField.UomId", "CaptionName": "App.Listform.ListformField.UomId",
@ -1379,6 +1385,132 @@
"CreatorId": null, "CreatorId": null,
"Id": "00000000-0000-0000-0000-000000000000" "Id": "00000000-0000-0000-0000-000000000000"
}, },
{
"EditType": null,
"ListFormCode": "App.Prc.PurchaseOrderLine",
"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": "ReceivedQuantity",
"CaptionName": "App.Listform.ListformField.ReceivedQuantity",
"PlaceHolder": null,
"ReadOnly": false,
"Visible": true,
"IsActive": true,
"Width": 0,
"ListOrderNo": 6,
"SourceDbType": 7,
"CultureName": "en",
"DataType": "number",
"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.Prc.PurchaseOrderLine.Create",
"R": "App.Prc.PurchaseOrderLine",
"U": "App.Prc.PurchaseOrderLine.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": "dxNumberBox",
"ColSpan": 1,
"EditorOptions": "{\"format\":\"#,##0.##\",\"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, "EditType": null,
"ListFormCode": "App.Prc.PurchaseOrderLine", "ListFormCode": "App.Prc.PurchaseOrderLine",
@ -1402,7 +1534,7 @@
"Visible": true, "Visible": true,
"IsActive": true, "IsActive": true,
"Width": 0, "Width": 0,
"ListOrderNo": 6, "ListOrderNo": 7,
"SourceDbType": 16, "SourceDbType": 16,
"CultureName": "en", "CultureName": "en",
"DataType": "string", "DataType": "string",
@ -1542,7 +1674,7 @@
"Visible": true, "Visible": true,
"IsActive": true, "IsActive": true,
"Width": 0, "Width": 0,
"ListOrderNo": 7, "ListOrderNo": 8,
"SourceDbType": 7, "SourceDbType": 7,
"CultureName": "en", "CultureName": "en",
"DataType": "number", "DataType": "number",
@ -1682,7 +1814,7 @@
"Visible": true, "Visible": true,
"IsActive": true, "IsActive": true,
"Width": 0, "Width": 0,
"ListOrderNo": 8, "ListOrderNo": 9,
"SourceDbType": 7, "SourceDbType": 7,
"CultureName": "en", "CultureName": "en",
"DataType": "number", "DataType": "number",
@ -1822,7 +1954,7 @@
"Visible": true, "Visible": true,
"IsActive": true, "IsActive": true,
"Width": 0, "Width": 0,
"ListOrderNo": 9, "ListOrderNo": 10,
"SourceDbType": 7, "SourceDbType": 7,
"CultureName": "en", "CultureName": "en",
"DataType": "number", "DataType": "number",
@ -1948,7 +2080,7 @@
"Visible": true, "Visible": true,
"IsActive": true, "IsActive": true,
"Width": 0, "Width": 0,
"ListOrderNo": 10, "ListOrderNo": 11,
"SourceDbType": 6, "SourceDbType": 6,
"CultureName": "en", "CultureName": "en",
"DataType": "datetime", "DataType": "datetime",
@ -2074,7 +2206,7 @@
"Visible": true, "Visible": true,
"IsActive": true, "IsActive": true,
"Width": 0, "Width": 0,
"ListOrderNo": 11, "ListOrderNo": 12,
"SourceDbType": 9, "SourceDbType": 9,
"CultureName": "en", "CultureName": "en",
"DataType": "string", "DataType": "string",

View file

@ -324,7 +324,7 @@
{ {
"FieldName": "RfqNo", "FieldName": "RfqNo",
"FieldDbType": 16, "FieldDbType": 16,
"Value": "PurchaseRfq", "Value": "Prc.PurchaseRfq",
"CustomValueType": 5, "CustomValueType": 5,
"SqlQuery": "" "SqlQuery": ""
}, },
@ -3847,7 +3847,7 @@
"CaptionName": "App.Listform.ListformField.Terms", "CaptionName": "App.Listform.ListformField.Terms",
"PlaceHolder": null, "PlaceHolder": null,
"ReadOnly": false, "ReadOnly": false,
"Visible": true, "Visible": false,
"IsActive": true, "IsActive": true,
"Width": 0, "Width": 0,
"ListOrderNo": 22, "ListOrderNo": 22,

View file

@ -225,7 +225,7 @@
{ {
"FieldName": "ProjectNo", "FieldName": "ProjectNo",
"FieldDbType": 16, "FieldDbType": 16,
"Value": "ProjeCode1", "Value": "Prj.Project",
"CustomValueType": 5, "CustomValueType": 5,
"SqlQuery": "" "SqlQuery": ""
} }

View file

@ -225,6 +225,18 @@ div.dialog-after-open > div.dialog-content.maximized {
font-weight: bold !important; font-weight: bold !important;
} }
/* Bir buton simgeli olunca DevExtreme hücreye dx-command-edit-with-icons verir ve bütün bağlantıları 18px simge
boyuna çeker; simgesiz (metinli) Düzenle/Sil/Detay bağlantıları normal yazı boyunda kalmalı. */
.dx-datagrid .dx-datagrid-content .dx-datagrid-table .dx-row .dx-command-edit-with-icons .dx-link:not(.dx-link-icon),
.dx-treelist .dx-treelist-content .dx-treelist-table .dx-row .dx-command-edit-with-icons .dx-link:not(.dx-link-icon) {
height: auto !important;
font-size: inherit !important;
line-height: inherit !important;
margin: 0 4px !important;
text-decoration: underline !important;
vertical-align: middle;
}
.dx-datagrid-header-panel { .dx-datagrid-header-panel {
padding: 0 0 !important; padding: 0 0 !important;
} }

View file

@ -213,15 +213,20 @@ const FormButtons = (props: {
icon: item.icon, icon: item.icon,
text: item.text, text: item.text,
hint: item.hint ?? item.text, hint: item.hint ?? item.text,
onClick: (e: any) => item.onClick?.({ ...e, ...rowEvent }), // Satır butonu kodu grid'i e.component.refresh() ile yeniler; formda component araç çubuğu butonudur,
// refresh yoktur ve çağrı hata verip yutulurdu (işlem yapılır, form eski durumda kalırdı).
onClick: (e: any) =>
item.onClick?.({ ...e, ...rowEvent, component: { refresh: async () => refreshData() } }),
}, },
}), }),
), ),
] ]
// Ekranın kendi butonları ile formun standart butonları (Geri, Sil, Yeni Ekle …) arasındaki ayırıcının yeri.
const customButtonCount = toolbarItems.length
if (!isSubForm) { if (!isSubForm) {
toolbarItems.push( toolbarItems.push(
buildButtonItem('back', translate('::App.Platform.Cancel'), () => { buildButtonItem('back', translate('::App.Platform.Back'), () => {
if (onActionView && id) { if (onActionView && id) {
onActionView() onActionView()
} else { } else {
@ -329,6 +334,20 @@ const FormButtons = (props: {
) )
} }
if (customButtonCount > 0 && toolbarItems.length > customButtonCount) {
toolbarItems.splice(customButtonCount, 0, {
location: 'after',
locateInMenu: 'never',
template: () => {
const separator = document.createElement('span')
separator.className = 'select-none px-1 text-gray-400 dark:text-gray-500'
separator.setAttribute('aria-hidden', 'true')
separator.textContent = '|'
return separator
},
})
}
return ( return (
<> <>
<Toolbar className="list-view-toolbar-host flex-1" items={toolbarItems} /> <Toolbar className="list-view-toolbar-host flex-1" items={toolbarItems} />

View file

@ -40,6 +40,11 @@ import { findLookupColor, getLookupItemColor, tagBadgeColors } from '../shared/l
import { applyPhoneColumnFormat, needsPhoneCountries } from './shared/columnFormatters' import { applyPhoneColumnFormat, needsPhoneCountries } from './shared/columnFormatters'
import { arePhoneCountriesLoaded, loadPhoneCountries } from '@/utils/phoneFormat' import { arePhoneCountriesLoaded, loadPhoneCountries } from '@/utils/phoneFormat'
const MIN_COMMAND_COLUMN_WIDTH = 60
const MAX_COMMAND_COLUMN_WIDTH = 520
// Satır buton kolonu genişliği tahmininde metinli bağlantının karakter başına genişliği (px).
const COMMAND_TEXT_CHAR_WIDTH = 7
const cellTemplateMultiValue = ( const cellTemplateMultiValue = (
cellElement: HTMLElement, cellElement: HTMLElement,
cellInfo: DataGridTypes.ColumnCellTemplateData<any, any>, cellInfo: DataGridTypes.ColumnCellTemplateData<any, any>,
@ -582,14 +587,26 @@ const useListFormColumns = ({
buttons.push(item) buttons.push(item)
}) })
// Buton sayısına göre dinamik genişlik hesapla // Genişlik butonların metninden tahmin edilir: sabit üst sınır özel butonları hücrenin dışına itiyordu.
// Her buton için ~35-40px + padding // Simgeli buton yalnız simgesini çizer; metinli bağlantı karakter başına COMMAND_TEXT_CHAR_WIDTH tutar. Kayda göre görünen
const calculatedWidth = Math.min(buttons.length * 40 + 50, 200) // (VisibleExpression) butonlar genelde birbirini dışlar (durum adımları); bir satırda en fazla yarısı
// görüneceği varsayılır ve en genişleri sayılır, yoksa kolon hiç görünmeyen butonlar kadar genişler.
const buttonWidth = (b: any) => (b.icon ? 28 : String(b.text ?? '').length * COMMAND_TEXT_CHAR_WIDTH + 12)
const conditionalWidths = buttons
.filter((b) => typeof b.visible === 'function')
.map(buttonWidth)
.sort((a, b) => b - a)
const calculatedWidth = Math.min(
buttons.filter((b) => typeof b.visible !== 'function').reduce((sum, b) => sum + buttonWidth(b), 24) +
conditionalWidths.slice(0, Math.ceil(conditionalWidths.length / 2)).reduce((sum, w) => sum + w, 0),
MAX_COMMAND_COLUMN_WIDTH,
)
const column = { const column = {
type: 'buttons', type: 'buttons',
width: calculatedWidth, width: calculatedWidth,
minWidth: calculatedWidth, // Kullanıcı kolonu daraltabilsin; minWidth = width iken kolon boyutlandırılamıyordu.
minWidth: MIN_COMMAND_COLUMN_WIDTH,
buttons, buttons,
allowResizing: true, allowResizing: true,
} }
@ -761,6 +778,13 @@ const useListFormColumns = ({
dataSource: (o) => lookupDataSource(o, colData), dataSource: (o) => lookupDataSource(o, colData),
} }
// Autocomplete serbest metindir: lookup yalnız öneri listesidir, değer listede olmayabilir
// (girişte yeni yazılan lot no). Lookup kolonu eşleşmeyen değeri boş çizdiği için hücre değerin kendisini gösterir.
if (colData.editorType2 === 'dxAutocomplete' && colData.fieldName) {
const fieldName = colData.fieldName
column.calculateDisplayValue = (rowData: any) => rowData?.[fieldName]
}
// Değeri değişince boşaltılacak alanlar (çocuklar + CascadeEmptyFields); popup ve // Değeri değişince boşaltılacak alanlar (çocuklar + CascadeEmptyFields); popup ve
// satır içi düzenleme form sayfasıyla aynı kuralı izler. // satır içi düzenleme form sayfasıyla aynı kuralı izler.
const cascadeClearFields = cascadeClearFieldsMap.get(colData.fieldName) const cascadeClearFields = cascadeClearFieldsMap.get(colData.fieldName)