> Menünün altındaki her dal bu dosyada bir bölümdür (`module-doc:section`); dosya ve bölümler ilk deploy'da otomatik açılır. `module-doc:todo` işaretli alt bölümleri modülü üreten kişi ya da AI doldurur (`lowcode.instructions.md` §0.13); MCP ile üretimde talep bu bölümler doldurulmadan Testing'e alınamaz. "Ek — Ekran envanteri" bölümü wizard dosyalarından üretilir, elle düzenlenmez.
<!-- module-doc:section App.Prj.Definitions -->
## Tanımlamalar (`App.Prj.Definitions`)
### 1. Amaç ve kapsam
Proje modülünün ortak tanımlarını tutar: projelere bağlanan renkli **Etiketler**, takım üyelerinin projedeki **Görevleri** ve personelin yıl-ay bazındaki genel **Aylık Adam/Ay Oranları** (Ar-Ge merkezi raporlaması için). Kullanıcı: proje yöneticisi, Ar-Ge merkezi sorumlusu.
- Projede ve Takım sekmesinde yalnızca aktif etiket/görev seçilebilir.
- Aylık oran 0–100 arasıdır; Personel Adam/Ay Oranları raporunda iş paketi oranıyla çarpılır (kayıt yoksa %100 kabul edilir).
### 6. Yetki ve görünürlük
İzin grubu `App.Prj`›`App.Prj.Definitions`› her ekran için R + Create/Update/Delete/Export/Import/Note.
### 7. Entegrasyonlar
Personel listesi `AbpUsers`'tan okunur. Başka entegrasyon yok.
### 8. Akış örneği
Ar-Ge sorumlusu Ağustos 2026 için bir personelin genel çalışma oranını %50 girer → o personelin bu ay iş paketinde %100 görünen oranı Personel Adam/Ay Oranları raporunda %50 "aya düşen oran" olarak hesaplanır.
### 9. Sık sorulanlar
- *Etiket rengini değiştirince projelerdeki etiket değişir mi?* Projede etiket adı saklanır; renk listeden okunduğu için yeni renk görünür.
- *Pasif görev eski takım kayıtlarında kaybolur mu?* Hayır, yalnızca yeni seçimde listelenmez.
### 10. Dosyalar ve geri alma
Wizard: `Tag.json`, `ProjectRole.json`, `UserMonthRate.json`; tablolar `sql|postgres/object/Prj_T_Tag.sql`, `Prj_T_ProjectRole.sql`, `Prj_T_UserMonthRate.sql`; demo veri `data/App.Prj.Tag.json`, `data/App.Prj.ProjectRole.json`. Geri alma: Wizard Manager'dan wizard'ları silmek (tablo isteğe bağlı düşürülür).
<!-- module-doc:section App.Prj.WorkPackage -->
## İş Paketleri (`App.Prj.WorkPackage`)
### 1. Amaç ve kapsam
Projelerin hiyerarşik iş planı (1 → 1.01, 1.02 …) ay ölçeğinde Gantt olarak tutulur; her paketin personeli, personel bazında aylık oranları, planlanan kaynakları ve gerçekleşen masrafları paket detayından girilir.
### 2. Analiz ve kararlar
- "İşler birbirine bağlı" üst-alt paket hiyerarşisi (ParentId) olarak uygulandı; Gantt bağımlılık okları kaydedilmez.
- Seyahat/Ekipman/Danışmanlık/Hizmet/Malzeme/Diğer sekmeleri tek tabloda `ResourceType` ile birleştirildi; sekmeler Planlanan Kaynaklar ve Gerçekleşen Masraflar (`Kind` = Planned/Actual) olarak ikiye indi (talep izni).
- Personelin paketteki aylık oranı Adam/Ay sekmesinden girilir; Adam/Ay Oranları ekranı salt okunurdur.
- Gantt başlığı paket adıdır, kod ayrı kolondadır. Personel seçimleri tüm kullanıcıları listeler (alt formda proje takımına süzme yok); kaynak tipine göre alan gizleme yok.
`Proje › İş Paketleri` (Gantt varsayılan; Tree/Grid/Pivot de açık) ve proje kartının İş Paketleri sekmesi. Detay sekmeleri: Personel (`App.Prj.WorkPackageMember`), Adam/Ay (`App.Prj.WorkPackageMonthRate`), Planlanan Kaynaklar (`App.Prj.WorkPackagePlanned`), Gerçekleşen Masraflar (`App.Prj.WorkPackageActual`) — hepsi menüsüz.
Personel `AbpUsers`'tan. Satırlar Takım toplamlarını, Adam/Ay Oranları, Kaynak Listesi, Personel Adam/Ay Oranları, maliyet özeti ve Bütçe Raporu view'larını besler.
### 8. Akış örneği
Proje yöneticisi "1. Veri Toplama ve Analiz" paketini, altına 1.01 "Veri Kaynaklarının Belirlenmesi"ni (07/2025–08/2027) ekler → Personel sekmesinde 11 kişiyi seçer → Adam/Ay sekmesinde her kişi için aylık %50 girer → Gerçekleşen Masraflar'a faturaları (Diğer, Yapay Zeka, 839,40 TL) yazar.
- *Belge tarihi olmayan planlanan kalem bütçede hangi aya düşer?* Paketin başlangıç ayına.
### 10. Dosyalar ve geri alma
Wizard: `WorkPackage.json`, `WorkPackageMember.json`, `WorkPackageMonthRate.json`, `WorkPackagePlanned.json`, `WorkPackageActual.json`; tablolar `Prj_T_WorkPackage*.sql`. Geri alma: önce alt form wizard'ları, sonra `WorkPackage.json` (Project.json'un bağımlısıdır, önce o silinir). PostgreSQL'de `UQ_Prj_T_WorkPackageMonthRate_…` kısıt adı 63 karakteri aştığı için tasarımcıdan kısaltılmalıdır.
### 11. Sekmeler (alt formlar)
Dört sekme de menüsüzdür, İş Paketleri ekranının detayında açılır; yetkileri `App.Prj › App.Prj.WorkPackage › …` altındadır (C/U/D).
#### Personel (`App.Prj.WorkPackageMember`)
- **Amaç:** seçili iş paketinde çalışan personeli listeler ([image-14] görselindeki Personel sekmesi).
- **Veri:** `Prj_T_WorkPackageMember` — WorkPackageId, UserId; aynı personel bir pakete yalnızca bir kez eklenir. Personel `AbpUsers`'tan gelir.
- **Karar:** personel seçimi tüm kullanıcıları listeler; alt form üst kaydın proje bilgisine erişemediği için liste proje takımıyla sınırlanmadı.
- **Kullanıldığı yer:** Takım sekmesindeki Paket Adedi kolonunu besler.
- **Amaç:** personelin ilgili ayda pakete ayırdığı çalışma yüzdesi buradan girilir; Adam/Ay Oranları ekranı bu kayıtları yalnızca gösterir (onaylı karar).
- **Veri:** `Prj_T_WorkPackageMonthRate` — WorkPackageId, UserId, Year, Month, Rate; paket + personel + yıl + ay benzersiz.
- **Kural:** oran 0–100 arasıdır. Takım toplamlarını, Adam/Ay Oranları, Personel Adam/Ay Oranları ve maliyet özetini besler.
- **Örnek:** bir personel için Temmuz–Aralık 2025 her ay %50 girilir.
- **Karar:** tip bazlı sekmeler tek tabloda birleştirildi (`ResourceType`, talep izni); ekran `Prj_T_WorkPackageResource`'u `Kind = 'Planned'` ile gösterir, yeni satır Planned türüyle eklenir. Kaynak tipine göre alan gizleme yok.
- **Hesap:** Maliyet = Fiyat × Adet × (1 + KDV/100); salt okunurdur, fiyat/adet/KDV değişince yeniden hesaplanır.
- **Kullanıldığı yer:** Kaynak Listesi, maliyet özeti, Bütçe Raporu (Planlanan kolonu). Bütçede kalem belge tarihinin ayına, belge tarihi yoksa paketin başlangıç ayına yazılır.
- **Örnek:** Malzeme seçilir, kalem adı yazılır, fiyat 74.000, adet 1 → maliyet 74.000.
- **Dosyalar:** `WorkPackagePlanned.json`, `Prj_T_WorkPackageResource.sql` (Gerçekleşen Masraflar ile ortak).
#### Gerçekleşen Masraflar (`App.Prj.WorkPackageActual`)
- **Amaç:** paketin gerçekleşen maliyetleri; giriş biçimi Planlanan Kaynaklar ile aynıdır.
- **Karar:** aynı tablo `Kind = 'Actual'` filtresiyle kullanılır; yeni satır Actual türüyle eklenir.
- **Hesap:** Maliyet = Fiyat × Adet × (1 + KDV/100); bütçe raporunda ay belge tarihinden belirlenir.
Dakika = (Bitiş − Başlangıç) saat × 60, yuvarlanır, negatif olamaz; formda otomatik. Proje değişince iş paketi seçimi temizlenir.
### 6. Yetki ve görünürlük
`App.Prj › App.Prj.Diary` (+ C/U/D/E/I/N). Kayıtlar kiracı içinde tüm yetkililere görünür.
### 7. Entegrasyonlar
Kullanıcı`AbpUsers`, proje/paket `Prj_T_Project` / `Prj_T_WorkPackage`. Başka entegrasyon yok.
### 8. Akış örneği
Personel günün sonunda yeni kayıt açar → projeyi ve 1.01 paketini seçer → 09:00–12:30 girer (Dakika 210 dolar) → yaptığı işi madde madde HTML olarak yazar ve kaydeder.
### 9. Sık sorulanlar
- *Başka kullanıcı adına günce girilebilir mi?* Evet, Kullanıcı alanı değiştirilebilir; varsayılan oturumdaki kullanıcıdır.
### 10. Dosyalar ve geri alma
Wizard `Diary.json`; tablo `sql|postgres/object/Prj_T_Diary.sql`. Project.json'un bağımlısıdır; geri almada önce Project.json silinir.
<!-- module-doc:section App.Prj.Project -->
## Projeler (`App.Prj.Project`)
### 1. Amaç ve kapsam
Ar-Ge ve destekli projelerin (TÜBİTAK, KOSGEB, Ar-Ge Merkezi, AB, iç proje) ana kartı. Başvuru metinleri, destek bilgileri, takım, iş paketleri, maliyet özeti ve günce tek kartta sekmeler halinde yönetilir.
### 2. Analiz ve kararlar
- Detay `App.Definitions.Contact` gibi sekmelidir (talep girdisi). Proje Özeti, İhtiyaçlar, Faaliyetler, Yenilikçi Yönü ve Çıktı ve Faydaları sekmeleri HtmlEditor'dür.
- Bu metin sekmeleri ve Destek sekmesi ayrı tablo değildir; aynı proje kaydının alanlarını`Form` sekmesi olarak düzenler.
- Takım ağaç yapısındadır (ParentId = takım lideri). Hesaplanan kolonlar `Prj_V_ProjectMember` view'ından join ile gelir.
- Etiketler, renkli dxTagBox ile Etiketler tanımından seçilir (Contact.Tags kalıbı).
Yönetici ve takım üyeleri `AbpUsers`'tan, görevler `Prj_T_ProjectRole`'den, etiketler `Prj_T_Tag`'den gelir. Maliyet özeti, iş paketi kaynaklarından ve aylık oranlardan hesaplanır.
### 8. Akış örneği
1. Proje kartı açılır: proje no, ad, TÜBİTAK, Aktif, tarihler, yönetici ve etiketler girilir.
2. Destek sekmesine destek kurumu ve bütçe yazılır; Özet ve İhtiyaçlar HTML olarak doldurulur.
3. Takım sekmesinde önce takım lideri, sonra ona bağlı personel eklenir (Yönetici alanıyla).
4. İş Paketleri sekmesinde plan kurulur; maliyet özeti sekmesi planlanan ve gerçekleşen tutarları gösterir.
### 9. Sık sorulanlar
- *Destek ve metin sekmeleri neden boş kayıt açmıyor?* Hepsi aynı proje satırını düzenler; proje kaydedildikten sonra doldurulur.
- *Takım toplamları neden sıfır?* İş paketlerinin Adam/Ay sekmesinde oran girilmemiştir.
- Tablolar ve view'lar: `Prj_T_Project.sql`, `Prj_T_ProjectMember.sql`, `Prj_V_ProjectMember.sql`, `Prj_V_ProjectCostSummary.sql`.
- Geri alma: önce `Project.json`, ardından sekme wizard'ları silinir.
### 11. Sekmeler (alt formlar)
Sekmeler menüsüzdür, Projeler kartında açılır; yetkileri `App.Prj › App.Prj.Project › …` altındadır. Metin ve Destek sekmeleri ayrı tablo değildir, proje kaydını düzenleyen `Form` sekmesidir (ekleme/düzenleme açık, silme kapalı); proje kaydedildikten sonra doldurulur. İş Paketleri ve Günce sekmeleri menülü ekranlardır, kendi bölümlerinde anlatılır.
#### Proje Özeti, İhtiyaçlar, Faaliyetler, Yenilikçi Yönü, Çıktı ve Faydaları
| Yenilikçi Yönü | `App.Prj.ProjectInnovation` | `Innovation` | Yenilikçi ve özgün yönler |
| Çıktı ve Faydaları | `App.Prj.ProjectOutputs` | `Outputs` | Beklenen çıktılar ve faydalar |
- Hepsi talep gereği HtmlEditor'dür; hesap ve entegrasyon yoktur. Faaliyetler sekmesinin görseli ([image-8]) iletilmediği için sekme metindeki tanıma göre üretildi.
- **Akış:** kullanıcı sekmeye metni madde madde yazar ve kaydeder.
- **Örnek:** ulusal destek kurumu TÜBİTAK yazılır, ardından destek tutarı ve toplam bütçe girilir.
- **Dosyalar:** `ProjectSupport.json`.
#### Takım (`App.Prj.ProjectMember`)
- **Amaç:** projede çalışan personel ağaç yapısında: takım lideri ve altında ona bağlı çalışanlar (ParentId, talep girdisi). Varsayılan görünüm Tree.
- **Veri:** `Prj_T_ProjectMember` — ProjectId, UserId, ProjectRoleId, ParentId, AvgMonthlyCost; personel projede bir kez yer alır. Hesaplanan kolonlar `Prj_V_ProjectMember` view'ından join ile okunur, kayıt tablo üzerinden düzenlenir.
- **Hesap:** Paket Adedi = personelin projedeki iş paketi sayısı · Adam/Ay Toplamı = Σ paket oranı / 100 · Çalışılan Ay = oran girilmiş farklı ay sayısı · Toplam Maliyet = Adam/Ay Toplamı× Ortalama Aylık Maliyet.
- **Entegrasyon:** personel `AbpUsers`, görev `Prj_T_ProjectRole`. Ortalama aylık maliyet Personel Adam/Ay Oranları raporunda gerçek maliyeti hesaplar. Yetki C/U/D.
- **Akış:** takım lideri yönetici alanı boş eklenir → çalışanlar yönetici olarak lider seçilerek eklenir → ağaçta liderin altında görünür.
- **SSS:** *Toplamlar neden boş?* İş paketlerinde bu personel için Adam/Ay oranı girilmemiştir.
- **Hesap:** her maliyet kolonu ilgili `ResourceType` + `Kind` için iş paketi kaynaklarının toplamı; Adam/Ay = projedeki paket oranları toplamı / 100, iki satırda aynıdır.
Proje bazında personelin ilgili aylarda iş paketlerinde geçirdiği yüzdesel çalışma oranlarını gösterir. Görünüm ay ölçeğinde Gantt'tır ve ekran salt okunurdur.
### 2. Analiz ve kararlar
- Talep ekranın GanttView olarak, yalnızca ay ölçeğinde sunulmasını istiyor; `ScaleType: months` ile karşılandı.
- Oranlar İş Paketi › Adam/Ay sekmesinden girilir; bu ekranda kayıt düzenlenmez (onaylı karar).
- Gantt hücreye sayı yazmaz. Aylık yüzdeleri hücre olarak görmek için aynı ekranda Pivot görünümü açıktır.
- Geri alma: wizard'ı silmek yeterlidir; view ayrıca kaldırılabilir.
<!-- module-doc:section App.Prj.ResourceList -->
## Kaynak Listesi (`App.Prj.ResourceList`)
### 1. Amaç ve kapsam
Bu ekran, tüm projelerin planlanan ve gerçekleşen kaynaklarını tek listede gösterir. Liste salt okunurdur; Excel'e aktarma ve filtreleme için kullanılır.
### 2. Analiz ve kararlar
- Talep, bu listeye yeni kayıt eklenmemesini ve yalnızca listeleme için kullanılmasını istiyor. Bu nedenle ekleme, düzenleme ve silme kapalıdır.
- Kaynak, iş paketi ve proje tablolarını birleştiren `Prj_V_ResourceList` view'ıdır.
Bu ekran, tüm projelerde personelin aylık iş paketi oranlarını ve bu oranlardan çıkan gerçek personel maliyetini salt okunur bir liste olarak gösterir. Ar-Ge merkezi raporlaması için kullanılır.
### 2. Analiz ve kararlar
- Talep gereği listeye kayıt eklenmez; ekran yalnızca listeleme içindir.
- Gerçek personel maliyeti, takımdaki ortalama aylık maliyet ile aya düşen oran çarpılarak hesaplanır. Bu, analizde onaylanmış bir karardır.
- Personelin o ay için Aylık Adam/Ay Oranı kaydı yoksa oran %100 kabul edilir.
- **Aya düşen oran** = paket oranı× aylık çalışma oranı / 100
- **Gerçek birim maliyet** = Takım sekmesindeki ortalama aylık maliyet
- **Gerçek toplam maliyet** = birim maliyet × aya düşen oran / 100
### 6. Yetki ve görünürlük
Yetki yolu `App.Prj › App.Prj.PersonnelManMonth` şeklindedir. Ekran salt okunurdur.
### 7. Entegrasyonlar
Veri şu tablolardan okunur: `Prj_T_WorkPackageMonthRate`, `Prj_T_UserMonthRate`, `Prj_T_ProjectMember`, `Prj_T_WorkPackage`, `Prj_T_Project`.
### 8. Akış örneği
Bir personelin Kasım ayında paket oranı %25, aylık çalışma oranı %100 ve ortalama aylık maliyeti 40.000 TL olsun. Bu durumda:
- Aya düşen oran = 25 × 100 / 100 = **%25**
- Gerçek toplam maliyet = 40.000 × 25 / 100 = **10.000 TL**
### 9. Sık sorulanlar
**Gerçek maliyet neden 0 görünüyor?**
Personelin Takım sekmesinde Ortalama Aylık Maliyet alanı boş bırakılmıştır.
### 10. Dosyalar ve geri alma
- **Wizard dosyası:** `PersonnelManMonth.json`
- **View scripti:** `Prj_V_PersonnelManMonth.sql`
- **Geri alma:** Wizard'ı silmek yeterlidir.
<!-- module-doc:section App.Prj.BudgetReport -->
## Proje Bütçe Raporu (`App.Prj.BudgetReport`)
### 1. Amaç ve kapsam
Bu rapor, projelerin planlanan ve gerçekleşen maliyetlerini ay bazında takip etmek için kullanılır. Gider kalemleri ay ölçeğinde Gantt görünümünde listelenir. Rapor salt okunurdur.
### 2. Analiz ve kararlar
- Talep gereği rapor GanttView ile ve yalnızca ay ölçeğinde gösterilir. Görseldeki çeyrek bazlı dönem yerine ay bazlı dönem kullanılır.
- Sayısal ay kolonları için ekranda Pivot görünümü de açıktır.
- Belge tarihi boş olan kalemler, bağlı oldukları iş paketinin başlangıç ayına yazılır.
| Alt formlar | `App.Prj.WorkPackageMember` (Id → WorkPackageId), `App.Prj.WorkPackageMonthRate` (Id → WorkPackageId), `App.Prj.WorkPackagePlanned` (Id → WorkPackageId), `App.Prj.WorkPackageActual` (Id → WorkPackageId) |
| Form varsayılanları | Progress=0 |
| Alan | Başlık | Editör | Zorunlu | Formda | Kaynak |
| Açıklama | Proje Listesi — Ar-Ge ve destekli projeler (TÜBİTAK, KOSGEB, Ar-Ge Merkezi, AB, iç proje); takım, iş paketleri, maliyetler ve günce ile birlikte. |
| Geliştirme talebi | Proje Modülü |
| Kaynak | `Prj_T_Project` · filtre `"IsDeleted" = 'false'` |
| 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) |
| Açıklama | Adam/Ay Oranları — proje bazında personelin ilgili aylarda iş paketlerinde geçirdiği yüzdesel çalışma oranları; ay ölçeğinde Gantt olarak gösterilir. |
| Açıklama | Personel Adam/Ay Oranları — tüm projelerde personelin aylık iş paketi oranlarının ve bunlardan çıkan gerçek maliyetin salt okunur listesi. |
| Açıklama | Proje Bütçe Raporu — projelerin planlanan ve gerçekleşen maliyetlerinin aylık takibi; ay ölçeğinde Gantt olarak gösterilir (salt okunur). |