{ "ListFormCode": "App.DevRequests", "KeyFieldName": "Id", "GeneratedAt": "2026-10-06T21:01:13.15342Z", "Order": 0, "Rows": [ { "Id": "53294e77-a4fb-45e4-a80e-acf07b5d75be", "TenantId": null, "UserName": "system@sozsoft.com", "RequestDate": null, "Status": "Testing", "Title": "Satınalma -> Talepler", "Description": "
Talepler : Satınalma yapılması için departmantların iç ve dış olmak üzere talep ettikleri ürünlerin kaydıdır. Talep eden, Talep Eden Departman, Mal Alımı olduğu zaman konulacak Depo ve Konum bilgisi ve Talep Tarihi bilgilerinden sonra Ürün ve talep edilen miktar bilgisi girilmeli. Ürün tanımında yer alan Birim bilgisi yine sistemle entegre şekilde gelmektedir. Termin Tarihi ürünün ne zaman ihtiyaç olduğu ve Talep Nedeni olarak ne amaçla istediği belirtilmelidir. Yine bu kaydın üst kısmında Taslak, Departman Onayı, Satınalma Onayı, Onaylandı, İşlemde, Tamamlandı gibi durumları da onay mekanizması Workflow gibi bir yöntemle yönetmeliyiz. Talepten sonra hemen talep edenin Departman Onaycısı onaylayacak bir liste üzerinden görmeli ve onaylamalı. Bu kişi Adm_T_Approver entity içerisindeki Onay Yeri : Satınalma ve Departman bazında gösterilecek) Sonrasında kayıt Satınalma departmanına düşmeli ondan sonra bu kayıt Satınalma Sorumlusu kabul etmeli ve Satınalma ile ilgili teklif toplama süreci başlamalı.
Taleplerim, Departman Onayı Bekleyenler, Satınalma Onayı Bekleyenler, Planlama Bekleyenler, Tüm Talepler listesinden oluşmalı.
Red Nedenleri : Bazı Satınalma talepleri hem departman onaycısı hemde satınalma tarafından reddedilebilir. Reddetme sebepleri aşağıadki gibidir. Bu liste Satınalma -> Tanımlamalar menüsüne yerleştirilmelidir.
Departmanların iç/dış ihtiyaç duydukları malzemeleri satınalmaya iletmesi, talebin önce departman onaycısı sonra satınalma tarafından onaylanması ve onaylı talebin satınalma sorumlusuna (teklif toplama/planlama) düşmesi. Kullanıcılar: talep eden personel, departman onaycıları (Adm_T_Approver › Onay Yeri = Satınalma), satınalma ekibi.
\n\n[image-1] Talep formu (başlık + satır sekmesi). Üstte durum çubuğu: Taslak › Departman Onayı › Satınalma Onayı › Onaylandı › İşlemde › Kısmi Tamamlandı › Tamamlandı. Başlık: belge no (SRO/00001 → bizde MT-YYYY-00001), öncelik yıldızları (0–3), Talep Eden (kullanıcı), Departman, Genel Açıklama, Depo, Konum, Şirket (kiracı — alan açılmaz), Talep Tarihi. Sekme \"Talep Satırları\": Ürün, Miktar, Birim, Karşılama Şekli, Termin Tarihi, Talep Nedeni, Kendi Depomda, Tüm Depolar, Teslim, Planlanacak Miktar, Satınalma Sorumlusu, satır durumu rozeti. Görünen satır demo veri adayı değildir (müşteri ortamına ait ürün kodu).
\n[image-2] Onay / Red Bilgileri sekmesi. İki grup: Departman Onayı (Departman Onaycıları — etiket listesi, Onaylayan, Onay Tarihi, Onay Notu) ve Satınalma Onayı (Onaylayan, Onay Tarihi, Onay Notu). Tümü salt okunur, akış doldurur.
\n[image-3] Red Nedenleri listesi. Basit tanım listesi: Red Nedeni, Aktif, sürükle-sırala tutamacı. Satırlar demo veri: İhtiyaç yok, Miktar uygun değil, Yanlış ürün seçildi, Bütçe uygun değil, Diğer (hepsi aktif).
\n\nWizard List (ComponentKind 0) + menüsüz alt form (satırlar) + Grid Workflow (§10.7 \"onaylı talep formu\" iskeleti). Aynı tablo üzerinde durum filtresiyle ayrılmış beş liste ekranı. Onaycı kullanıcı listeleri kayıt sonrası SQL prosedürüyle (save_sql_object) Adm_T_Approver'dan doldurulur ve akış düğümü @Kolon onaycısıyla okur (İzin Talepleri'ndeki @ManagerUserNames deseni). Serbest yerleşim gerekmediği için custom component yok.
Satınalma › Talepler › {5 liste} ; Satınalma › Tanımlamalar › Red Nedenleri
\n| Seviye | Kod | Ad (TR / EN) | İkon | Durum |
|---|---|---|---|---|
| Kök | App.Prc | Satınalma / Purchasing | — | Var |
| Ara | App.Prc.Definitions | Tanımlamalar / Definitions | — | Var |
| Ekran | App.Prc.RejectReason | Red Nedenleri / Rejection Reasons | FcCancel | Yeni |
| Ara | App.Prc.MaterialRequests | Talepler / Material Requests | FcList | Yeni |
| Ekran | App.Prc.MyMaterialRequest | Taleplerim / My Requests | FcPortraitMode | Yeni |
| Ekran | App.Prc.MaterialRequestDeptApproval | Departman Onayı Bekleyenler / Awaiting Department Approval | FcApproval | Yeni |
| Ekran | App.Prc.MaterialRequestPurchaseApproval | Satınalma Onayı Bekleyenler / Awaiting Purchasing Approval | FcApproval | Yeni |
| Ekran | App.Prc.MaterialRequestPlanning | Planlama Bekleyenler / Awaiting Planning | FcPlanner | Yeni |
| Ekran | App.Prc.MaterialRequest | Tüm Talepler / All Requests | FcDocument | Yeni |
ModuleId Prc, izin grubu App.Prc, route /admin/list/{ListFormCode}. Taleplerim talepte menü listesi olarak açıkça istendiği için persona kuralına rağmen menüde durur (girdi).
Yetki: App.Prc › App.Prc.Definitions (Var) › App.Prc.RejectReason ; App.Prc › App.Prc.MaterialRequests (Yeni) › her liste ; alt form: App.Prc › App.Prc.MaterialRequests › {Liste} › App.Prc.MaterialRequestLine.
\n\nPrc_T_RejectReason (yeni) — Tanım tablosu: Evet (talep \"Tanımlamalar menüsüne\" diyor, görselde Aktif kolonu). Kiracı + tam audit.
\n| Kolon | Tip | Zorunlu | Not |
|---|---|---|---|
| Name | nvarchar(128) | ✓ | Red nedeni |
| SortOrder | int | ✓ | varsayılan 0; görseldeki sıralama tutamacı |
| IsActive | bit | ✓ | DEFAULT 1 |
Prc_T_MaterialRequest (yeni) — Tanım tablosu: Hayır (hareket belgesi). Kiracı + tam audit.
\n| Kolon | Tip | Zorunlu | Not |
|---|---|---|---|
| RequestNo | nvarchar(32) | Numaratör (Adm_T_Sequence \"MaterialRequest\", MT-YYYY-00001, yıllık sıfırlama) | |
| Priority | int | ✓ | 0–3 yıldız, DEFAULT 0 |
| RequesterUserId | uniqueidentifier | ✓ | AbpUsers; varsayılan @USERID |
| DepartmentId | uniqueidentifier | ✓ | Hr_T_Department; talep edenin AbpUsers.DepartmentId'sinden dolar, değiştirilebilir |
| WarehouseId | uniqueidentifier | ✓ | Inv_T_Warehouse |
| LocationId | uniqueidentifier | ✓ | Inv_T_Location, depoya göre süzülür |
| RequestDate | datetime | ✓ | DEFAULT GETDATE() |
| Description | nvarchar(MAX) | Genel Açıklama (dxTextArea) | |
| Status | nvarchar(32) | ✓ | Draft / DeptApproval / PurchaseApproval / Approved / InProgress / PartiallyDone / Done / Rejected; DEFAULT 'Draft' |
| ApprovalStatus, ApproverId, ApprovalDate, ApprovalNote | nvarchar(32) / uniqueidentifier / datetime / nvarchar(MAX) | WorkflowDto alanları | |
| DeptApproverUserNames | nvarchar(MAX) | \"|\" ayrılmış, prosedür doldurur; formda \"Departman Onaycıları\" (salt okunur) | |
| PurchaseApproverUserNames | nvarchar(MAX) | \"|\" ayrılmış, prosedür doldurur (gizli) | |
| DeptApprovedBy, DeptApprovalDate, DeptApprovalNote | uniqueidentifier / datetime / nvarchar(MAX) | Görsel 2 sol grup | |
| PurchaseApprovedBy, PurchaseApprovalDate, PurchaseApprovalNote | uniqueidentifier / datetime / nvarchar(MAX) | Görsel 2 sağ grup | |
| RejectReasonId | uniqueidentifier | Prc_T_RejectReason (aktifler) |
Prc_T_MaterialRequestLine (yeni) — Tanım tablosu: Hayır. Kiracı + tam audit; FK MaterialRequestId → Prc_T_MaterialRequest (Cascade).
\n| Kolon | Tip | Zorunlu | Not |
|---|---|---|---|
| MaterialRequestId | uniqueidentifier | ✓ | üst kayıt |
| ProductId | uniqueidentifier | ✓ | Inv_T_Product, yalnız IsActive=1 ve CanBePurchased=1; görüntü \"[InternalReference] Name\" |
| Quantity | decimal(18,4) | ✓ | > 0 |
| UomId | uniqueidentifier | ✓ | Adm_T_Uom; üründen COALESCE(PurchaseUomId, UomId) ile dolar, salt okunur |
| FulfillmentMethod | nvarchar(16) | ✓ | Purchase (Satınalma) / Transfer (Depodan Transfer); DEFAULT 'Purchase' |
| DueDate | date | ✓ | Termin; talep tarihinden önce olamaz |
| RequestReason | nvarchar(256) | ✓ | Talep Nedeni |
| DeliveredQuantity | decimal(18,4) | ✓ | Teslim, DEFAULT 0, salt okunur |
| PlannedQuantity | decimal(18,4) | Planlanacak Miktar; satır eklenince Quantity ile dolar, satınalma düzenler | |
| PurchaseResponsibleUserId | uniqueidentifier | AbpUsers; Satınalma Sorumlusu (planlamada atanır) | |
| LineStatus | nvarchar(16) | ✓ | Waiting / Planned / Done / Cancelled; DEFAULT 'Waiting' |
Var olan tablo değişikliği: Adm_T_Approver.ApprovalArea statik listesine PurchaseDesk (Satınalma Masası / Purchasing Desk) seçeneği eklenir (Onaycılar wizard güncellemesi, kolon değişmez).
| Sekme | Hedef ListFormCode | TabType | Menü | İlişki | Ekle / Düzenle / Sil | Yetki yolu |
|---|---|---|---|---|---|---|
| Talep Satırları | App.Prc.MaterialRequestLine | List | Menüsüz | Id → MaterialRequestId | ✓ / ✓ / ✓ | App.Prc › App.Prc.MaterialRequests › {Liste} › App.Prc.MaterialRequestLine |
Onay / Red Bilgileri ayrı tablo değildir; ana formun ikinci düzenleme grubu (salt okunur alanlar) olarak çizilir. Alt form beş listenin hepsinde aynı ekrandır; ekleme/silme yalnız Status = Draft iken açıktır (alt formun Insert/Delete BeforeCommand'ında üst kayıt durumu kontrolü).
\n\nYeni: 3 tablo, 1 prosedür (Prc_P_MaterialRequestResolveApprovers), 1 tanım ekranı, 1 alt form, 5 liste ekranı, ara menü App.Prc.MaterialRequests ve aynı kodlu ara yetki, her ekranın C/R/U/D/E/I/N yetkileri, dil anahtarları (alanlar, durum ve karşılama şekli statik seçenekleri), Adm_T_Sequence'e \"MaterialRequest\" satırı. Değişen: Onaycılar (App.Definitions.Approver) ApprovalArea seçeneği. İş akışı: iki onay düğümü + talep sahibine Inform (e-posta). Ürün, depo, konum, departman ekranlarına dokunulmaz.
\n\nListe filtreleri (aynı tablo, DefaultFilter): Taleplerim = RequesterUserId = @USERID (tüm durumlar; ekle açık); Departman Onayı Bekleyenler = Status = 'DeptApproval' + ApprovalIsFilterUserName; Satınalma Onayı Bekleyenler = Status = 'PurchaseApproval' + ApprovalIsFilterUserName; Planlama Bekleyenler = Status IN ('Approved','InProgress','PartiallyDone'); Tüm Talepler = filtresiz. Onay listelerinde ekleme kapalı.
\nGörünümler: her listede Grid + Card + Pivot + Chart (açılış grid); Tüm Talepler'de ek olarak Todo (kanban) Status kolonuyla, durum sırası görseldeki çubukla aynı. Alt formda widget yok.
\nWidget'lar: Tüm Talepler: Toplam · Departman Onayında · Satınalma Onayında · Onaylandı · Reddedildi. Taleplerim: Taleplerim · Onay Bekleyen · Onaylanan · Reddedilen. Red Nedenleri: Toplam · Aktif · Pasif.
\nİş akışı (WorkflowDto, Taleplerim + iki onay listesi + Tüm Talepler'de aynı grafik): Start → Approval \"Departman Onayı\" (Approver = @DeptApproverUserNames) → onayda Approval \"Satınalma Onayı\" (Approver = @PurchaseApproverUserNames) → onayda Inform (talep sahibi) → End \"Onaylandı\"; her iki ret dalı → Inform → End \"Reddedildi\". ApprovalIsResetWorkflow = true (Taslak'a dönen kayıt düzenlenince akış baştan).
\nDurum geçişleri: Kayıt Draft açılır; satır girildikten sonra toolbar butonu \"Onaya Gönder\" (CommandColumnDto, yalnız Draft ve en az bir satır varken) Status = DeptApproval yapar ve akışı başlatır. Prosedür (UpdateAfterCommand) akış düğümüne göre Status'u DeptApproval → PurchaseApproval → Approved / Rejected olarak senkronlar ve Dept*/Purchase* onay alanlarını ApproverId/ApprovalDate/ApprovalNote'tan kopyalar. Approved sonrası İşlemde / Kısmi Tamamlandı / Tamamlandı, Planlama Bekleyenler'deki satır butonlarıyla elle verilir; satırların tamamı LineStatus = Done olunca Status = Done, bir kısmı Done ise PartiallyDone (aynı prosedür).
\nOnaycı çözümü (prosedür): DeptApproverUserNames = Adm_T_Approver'da DepartmentId = talebin departmanı, ApprovalArea = 'Purchase', IsActive = 1 kullanıcıların UserName'leri; PurchaseApproverUserNames = ApprovalArea = 'PurchaseDesk', IsActive = 1 kullanıcılar. Liste boşsa \"Onaya Gönder\" hata mesajıyla durur (boş onaycı akışı kilitler).
\nRed: Ret notu zorunlu; RejectReasonId onay listelerinde onaycı tarafından düzenlenebilir alan, Rejected durumunda zorunlu (doğrulama prosedürde).
\nEditorScript: RequestDate açılışta bugün; RequesterUserId açılışta @USERID ve DepartmentId kullanıcının departmanı; WarehouseId değişince LocationId temizlenir ve konum lookup'ı depoya süzülür (cascade); ProductId değişince UomId üründen dolar; Quantity değişince PlannedQuantity boşsa Quantity'ye eşitlenir; DueDate < RequestDate ise uyarı ve engel. Status ≠ Draft iken başlık alanları salt okunur.
\n\nPurchaseDesk (Satınalma Masası) satırlarından okunur; departmandan bağımsız, herhangi birinin onayı yeterli.Şartlı — (onay) etiketli 4 karar: Satınalma onaycısı için PurchaseDesk onay yeri, \"Onaya Gönder\" butonuyla Taslak aşaması, stok miktarı kolonlarının (Kendi Depomda / Tüm Depolar) stok modülüne ertelenmesi, Karşılama Şekli seçenekleri.
Üretilenler: tablolar Prc_T_RejectReason, Prc_T_MaterialRequest, Prc_T_MaterialRequestItem; prosedür Prc_P_MaterialRequestAfterSave (SQL Server + PostgreSQL); numaratör MaterialRequest (MT-{yyyy}-00001, yıllık); ekranlar App.Prc.RejectReason (5 demo satır), menüsüz alt form App.Prc.MaterialRequestLine, App.Prc.MyMaterialRequest, App.Prc.MaterialRequestDeptApproval, App.Prc.MaterialRequestPurchaseApproval, App.Prc.MaterialRequestPlanning, App.Prc.MaterialRequest; Onaycılar'a PurchaseDesk (Satınalma Masası) onay yeri; menü Satınalma › Talepler (yeni ara menü/yetki) ve Satınalma › Tanımlamalar › Red Nedenleri; modül dokümanı App.Prc › Talepler.
\nAnalizden sapmalar / varsayımlar:
\nPrc_T_MaterialRequestItem adıyla açıldı: Adm_T_Uom.Id nvarchar olduğu için UomId nvarchar(64) olmalıydı; önce açılan Prc_T_MaterialRequestLine scripti (UomId uniqueidentifier) kullanılmıyor. Migrate'ten önce Wizard Manager / SQL Query Manager'dan bu scripti silmeniz önerilir (onayınız olmadan tablo düşürülmedi).ApproverId uniqueidentifier olduğu için akışa bağlanmadı. Departman/Satınalma onaylayanı, tarihi ve notu prosedürde kaydı son güncelleyen kullanıcıdan ve akışın ApprovalDate/ApprovalNote alanlarından kopyalanır.DB Migrate bekleyen wizard'lar: Adm_Approver.json, Prc_RejectReason.json, Prc_MaterialRequestLine.json, Prc_MyMaterialRequest.json, Prc_MaterialRequestDeptApproval.json, Prc_MaterialRequestPurchaseApproval.json, Prc_MaterialRequestPlanning.json, Prc_MaterialRequest.json.
" } ] }