> 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.
Bakım modülünün (KADİFETEKS Odoo Bakım modülünden taşınan) tanım listeleri: ekipman kategorileri, bakım ekipleri, bakım tipleri, hizmet tipleri, arıza tipleri ve red nedenleri. Kullanıcılar bakım ve bilgi işlem yöneticileridir. Bakım/hizmet iş emirleri, bakım talimatları ve hizmet talepleri bu bölümün kapsamında değildir; bu ekranlar onların lookup kaynağıdır.
- Ürün kartına ekipman işareti/kategorisi eklenmesi bu bölümün kapsamında değildir; kategori sonradan Envanter › Ürünler › Ekipman sekmesine bağlandı (`App.Inventory.md` §2).
- Masraf Merkezleri (2026-10-18, görselden: analitik hesaplar listesi): ağaç yapısı üst masraf merkeziyle kurulur, ad listede ve seçimlerde "Üst / Ad" olarak görünür; Firma şubedir. Planla, Borç, Alacak ve Bakiye sütunları alınmadı (kullanıcı kararı; muhasebe hareketi tutan tablo yok). Görselde okunan 15 satır ve üstleri "Doğal Kaynak Tüketimi" ilk şubeye (Branch1) demo veri olarak yazıldı.
- Lookup'lar yalnızca silinmemiş kayıtları, ekip lookup'ı ayrıca yalnız aktif ekipleri listeler; kullanılmış tanım silinmez, pasife alınır.
- Bakım Tipleri, Hizmet Tipleri, Arıza Tipleri ve Red Nedenleri SortOrder'a göre artan sıralı açılır.
- Hizmet/Arıza/Red kodu kiracı içinde benzersizdir (soft delete edilmiş kayıt da kodu tutar).
- Hesaplanan alan yoktur.
### 6. Yetki ve görünürlük
Yetki ağacı: `App.Maintenance`›`App.Maintenance.Definitions`› her ekran (+ Create/Update/Delete/Export/Import/Note). Ekipman Kategorileri ve Bakım Ekipleri şube kapsamlıdır (`IsBranch`), diğerleri yalnız kiracı kapsamlıdır. Widget'lar: her ekranda Toplam · Aktif · Pasif.
- Geri alma: ekranlar `delete_wizard` ile silinir (önce Bakım/Hizmet Tipleri, sonra Bakım Ekipleri); tablolar yalnızca açık onayla `dropTables: true` ile düşürülür.
Ekipmanların periyodik bakım planı: hangi ekipmana, hangi ekiple, hangi malzeme, kontrol listesi ve dokümanlarla, ne sıklıkta bakım yapılacağı. Plan departman onayından geçer; sonraki bakım tarihini zamanlanmış iş her gece hesaplar. Bakım iş emirleri talimatın her vadesinde otomatik ya da elle açılır; malzeme, personel süresi, duruş ve not kaydı tutar, malzemeyi ekipmanın departmanının depolarındaki stoktan (ürün + lot/seri) seçer ve departman onayıyla Bakım Sarf Tüketimi teslimatı açar. Kullanıcılar bakım planlamacıları, bakım teknisyenleri ve ekipmanın departman onaycılarıdır.
Onaylanan tarif (2026-10-18, görsellerden: talimat formu, Kontrol Listesi ve Dokümanlar sekmeleri):
- Menü `Bakım › Bakım` (yeni dal `App.Maintenance.Operations`, sıra 2) › Bakım Talimatları.
- Ekipman ayrı bir tablo değildir; Ekipman Kategorisi dolu olan üründür (`Inv_T_Product`, Ürünler › Ekipman sekmesi). Diğer ürünler ekipman listesinde görünmez (kullanıcı kararı). Seçenek "Ad [İç Referans]/Seri No" olarak gösterilir.
- Periyot "Her N Gün / Hafta / Ay / Yıl" (kullanıcı kararı).
- Zamanlanmış iş ilk sürümde yalnızca sonraki bakım tarihini hesaplıyordu (kullanıcı kararı); iş emri ekranıyla birlikte vadede iş emri de açar (aşağıda).
- Onaycı departman onaycısıdır (kullanıcı kararı): Onaycılar ekranında ekipmanın departmanı (`EquipmentDepartmentId`) için yeni **Bakım** onay yeri (`Maintenance`). Red nedeni Bakım › Red Nedenleri'nden seçilir.
- Genel sekmesi yalnız zengin metin bakım talimatıdır (kullanıcı kararı). Onay Bilgileri sekmesi akışın dört alanını ve departman onaycılarını salt okunur gösterir.
- Bakım Kodu otomatik (`Mm.MaintenanceInstruction` numaratörü, `BKM00001`). Talimat işlem kaydıdır: `BranchId` taşır ve şube kapsamlıdır (`IsBranch`). Sekme tabloları şube kolonu taşımaz; şubeyi bağlı oldukları talimattan alırlar (kullanıcı kararı).
- Doküman Tipi sabit liste: Kullanım Kılavuzu, Prosedür, Teknik Çizim, Sertifika, Diğer. Dosya kayıtta base64 saklanır.
Üretimde verilen ek kararlar:
- Kayıt sonrası komutlar yordam çağırmaz, iki sağlayıcıda da çalışan tek bir `UPDATE`'tir; ekran komutu sağlayıcıya göre çevrilmediği için `EXEC` kullanılmadı. Tarih aritmetiği sağlayıcıya göre değiştiğinden periyot hesabı yalnız zamanlanmış işin yordamındadır (`sql/` + `postgres/` eşi).
- Sonraki bakım tarihi onay durumundan bağımsız hesaplanır; onay şartı iş emri açılırken uygulanacaktır.
Onaylanan tarif — Bakım İş Emirleri (2026-10-18, görsellerden: iş emri formu ve Çalışma Süreleri sekmesi):
- Menü `Bakım › Bakım`› Bakım İş Emirleri (sıra 2). Firma şubedir (`BranchId`, `IsBranch`).
- Durum Taslak › Onaylandı› İşlemde / Beklemede › Onarıldı / Hurda (`Status`: `Draft`, `Approved`, `InProgress`, `OnHold`, `Repaired`, `Scrapped`). Taslak › Onaylandı geçişini departman onay akışı verir (kullanıcı kararı); onaylanmadan seçilen durum kayıtta Taslak'a döner, sonraki durumları kullanıcı seçer. Akış dört iş akışı kolonunu kullanır; `Status` onay durumu değil işin yaşam döngüsüdür, kullanıcı istediği için ayrı kolondur.
- Zamanlanmış iş onaylı ve aktif talimatın her vadesinde Taslak, Otomatik iş emri açar; önceki emir kapanmamış olsa da yenisi açılır (kullanıcı kararı). Aynı vade için ikinci emir açılmaz.
- Malzemeler (kullanıcı kararı, 2026-10-19; önceki "İç transfer + sarf" ve kullanıcı departmanı kurallarının yerine): önce ekipmanın departmanına bağlı iç konum, sonra o konumdaki stok satırı (ürün + lot/seri, eldeki miktarıyla) seçilir; iç transfer yoktur. İş emri departman onayını alınca Envanter › Teslimatlar'da Bakım Sarf Tüketimi taslak teslimatı seçilen lotlarla açılır.
- Kontrol Listesi ve Dokümanlar yalnız talimat ekranının sekmeleridir; iş emri ekranından kaldırıldı (kullanıcı kararı, 2026-10-18).
- Görseldeki Sonuç & Geri Bildirim, Maliyetler sekmeleri ve Parçayı Sök düğmesi kapsam dışıdır (kullanıcı kararı). Üretim Emri alanı yoktur: üretim emri tablosu yoktur.
- Stoktan düşme: iç transfer dış konuma gidemez, aynı konuma giden belge stoğa dokunmaz. Bu yüzden Bakım Sarf Tüketimi işlem türü Teslimat türünde ve dış "Bakım Sarf" konumuna gidecek şekilde kurulur (demo seed'i buna çevrildi).
- İş emri ekranının kayıt sonrası komutları Envanter ekranları gibi `EXEC` ile yordam çağırır; yordamların `postgres/` eşi vardır. Form içi hesaplar EditorScript'tedir, kayıt sonrası SQL ile yapılmaz (kullanıcı kararı): Çalışma Süreleri ve Duruşlar'ın süreleri, iş emrinin gerçek başlangıç/bitişi. Yordamda yalnız onaycı listesi, onaysız emri Taslak'ta tutma ve sarf belgesi kalır; bunlar akıştan ve zamanlanmış işten de çalışır.
Üretimde verilen ek kararlar (iş emri):
- Sarf teslimatı taslak açılır; depo Hazırla › Doğrula ile işler. Belgesi açılmış malzeme satırı değiştirilemez ve silinemez.
- Otomatik emrin kullanım konumu ekipman departmanının koda göre ilk iç konumudur; ekip talimatın ilk ekibidir.
- Güncelleme varsayılanlarına `Id = @ID` yazılmaz: yazılırsa anahtar tek değer olarak gider ve güncelleme sonrası komuttaki `"Id" IN @Id` geçersiz SQL olur (Onayla düğmesinde "Incorrect syntax near @Id" hatası). Satır yoksa platform anahtarı liste olarak ekler.
Tüm tablolar kiracı + tam audit + soft delete taşır; `IsActive` tanım tablolarında, talimatta ve iş emrinde vardır, iş emrinin malzeme, çalışma süresi ve duruş tabloları taşımaz (kullanıcı kararı, 2026-10-19); şube (`BranchId`) yalnız talimat tablosundadır.
- **Sonraki bakım:** `Başlangıç + k × periyot` dizisinde bugüne eşit ya da sonraki ilk tarih. Hafta 7 gün, yıl 12 aydır; ay eklemede ay sonu korunur (31 Ocak › 28 Şubat). Bitiş Tarihi'ni aşan tarih boş kalır. Pasif ya da silinmiş talimatta tarih boştur.
- **Hesaplama zamanı:** Maintenance Instruction Schedule işi (her gece 01:00, `Mm_S_MaintenanceInstructionSchedule`). Kayıtta yalnız Başlangıç Tarihi bugün ya da ileride ise sonraki bakım hemen Başlangıç Tarihi olur; geçmiş başlangıç ve periyot değişikliği gece işlenir.
- **Departman onaycıları:** her kayıtta ve akış adımında yeniden yazılır: ekipmanın departmanı için aktif Bakım onaycılarının aktif kullanıcı adları, `|` ile.
- **Otomatik iş emri:** gece işi, sonraki bakımı bugün ya da geçmiş olan onaylı ve aktif talimattan o vade için iş emri açar (numara `Mm.WorkOrder`, `WO/2026/00001`, yıllık sıfırlanır; konu "Talimat - Ekipman"; Önleyici, İç Bakım; planlanan tarih vade 08:00), malzemeleri kopyalar, sonra sonraki bakımı ilerletir.
- **İş emri durumu:** onay akışı tamamlanmadan durum Taslak'tır, onayla Onaylandı olur. Onaylı emirde Durum formda İşlemde seçilince gerçek başlangıç, Onarıldı ya da Hurda seçilince gerçek bitiş boşsa anında doldurulur (Durum alanının EditorScript'i).
- **Malzeme:** Konum listesi ekipmanın departmanının aktif iç konumlarıdır. Ürün - Lot/Seri listesi seçilen konumdaki stoğu sıfırdan büyük stok satırlarıdır (`[Referans] Ürün - Lot (miktar birim)`); seçilince malzeme, lot/seri no ve birim stok satırından dolar (EditorScript, üçü salt okunur). Ürün - Lot/Seri listede gizlidir (Malzeme ve Lot/Seri No aynı bilgiyi gösterir), formda durur. Görünüm modunda ve satırsız yüklemede cascade ebeveyni boş gelir; iki lookup bu durumda malzeme satırlarının kullandığı konum ve stok satırlarını döner, böylece kayıtlı değer onaydan ve stok tükendikten sonra da görünür. Kayıtta `Mm_P_WorkOrderMaterialAfterSave` doğrular ve ürün/lot/birimi stoktan yeniden yazar: konum ekipmanın departmanında değilse 50409, stok satırı seçilen konumda değilse 50410, miktar eldeki miktarı aşarsa 50411. İş emri onaylıysa satır hemen sarfa eklenir.
- **Sarf:** iş emri departman onayını alınca (hurdaya ayrılmamışsa) sarfı açılmamış satırlar konuma göre gruplanır, konumun deposundaki Bakım Sarf Tüketimi türünde (numaratörü `.MaintenanceConsumption` ile biter, tür Teslimat) taslak teslimat açılır; aynı emrin aynı konumdaki taslağı varsa satırlar ona eklenir. Lot/seri takipli satırda seçilen lot teslimat satırının lotu olur (`Mm_P_WorkOrderConsume`). Tür yoksa kayıt 50402 ile durur. Onarılmış ya da hurdaya ayrılmış emre malzeme eklenmez (50406).
- **Süreler:** Çalışma Süreleri'nde süre (dakika) formda başlangıç ya da bitiş değişince anında hesaplanır; normal mesai = süre − mesai dışı, mesai dışı değişince de yenilenir (ikisi salt okunur). Duruşlar'da süre de formda başlangıç ve bitişten anında hesaplanır. Dakikalar ileride personel maliyetinin dayanağıdır.
`App.Maintenance`›`App.Maintenance.Operations`›`App.Maintenance.MaintenanceInstruction` (+ Create/Update/Delete/Export/Import/Note); beş sekmenin yetkisi talimat yetkisinin altındadır. Yetkiler hiçbir role otomatik verilmez. Akışı başlatmak ve karar vermek talimatın Update yetkisini ister; karar yalnız departman onaycılarındadır. Widget'lar: Toplam · Aktif · Onay Bekleyen · Onaylanan.
`App.Maintenance.Operations`›`App.Maintenance.WorkOrder` (+ altı eylem); Malzemeler, Çalışma Süreleri, Duruşlar ve Notlar sekmelerinin yetkisi iş emri yetkisinin altındadır. İş emri widget'ları: Toplam · Onay Bekleyen · İşlemde · Onarıldı.
Ekipman, malzeme ve birim Envanter'den; ekipmanın departmanı İK › Departmanlar'dan; onaycılar Yönetim › Onaycılar'dan (Bakım onay yeri); bakım tipi, ekip ve red nedeni Bakım › Tanımlamalar'dan okunur. Zamanlanmış iş `SqlWorker` türündedir, kapsamı Host ve Kiracılar'dır. İş emri malzemeleri ekipman departmanının depolarındaki stoktan seçilir ve onayla Envanter'de Bakım Sarf Tüketimi teslimatı açar (`SourceDocument` = iş emri no); belgeyi depo Envanter › Teslimatlar'da işler. Duruşların arıza tipi Bakım › Arıza Tipleri'nden gelir.
1. Ürünler'de "örme motoru"nun Ekipman sekmesinde Ekipman Kategorisi ve Departman seçilir.
2. Onaycılar'da o departman için Onay Yeri = Bakım satırı eklenir.
3. Bakım Talimatları'nda "motor yanmış" talimatı açılır: ekipman örme motoru [MTR-001]/MTR-001, Her 60 Gün, başlangıç 18 Eylül. Malzeme, kontrol maddesi ve doküman sekmelerden eklenir.
4. Başlat düğmesiyle talimat Departman Onayı'na düşer; onaycı onaylar ya da red nedeniyle reddeder.
5. İş her gece sonraki bakımı ilerletir: 18 Eylül › 17 Kasım.
### 9. Sık sorulanlar
- **Ekipman listesinde ürünüm yok?** Ürünün Ekipman sekmesinde Ekipman Kategorisi seçilmeli ve ürün aktif olmalıdır.
- **Onaya gönderdim ama kimse onaylayamıyor?** Ekipmanın departmanı boş ya da o departman için Bakım onay yerinde aktif onaycı yoktur. Onaycıyı ekleyip talimatı kaydedin; liste kayıtta yenilenir.
- **Sonraki Bakım boş?** Başlangıç geçmişteyse tarih ilk gece işinde dolar. Bitişi geçmiş ya da pasif talimatta tarih boştur.
- **Otomatik iş emri açılmadı?** Talimat onaylı (Onaylandı) ve aktif olmalı, Sonraki Bakım bugün ya da geçmiş olmalıdır; iş her gece 01:00'de çalışır. İş Hangfire'a API açılışında ya da Zamanlanmış İşler ekranındaki "zamanlanmış işleri yeniden üret" düğmesiyle yüklenir; migrate'ten sonra ikisinden biri yapılmadıysa iş hiç çalışmaz. Sonraki bakım tarihi boş talimatın tarihi aynı çalıştırmada önce hesaplanır, vadesi bugünse iş emri de o çalıştırmada açılır.
- **Konum ya da Ürün - Lot/Seri listesi boş?** Ekipmanın Ekipman sekmesinde departman seçilmeli, o departmana bağlı aktif bir iç konum (Envanter › Konumlar) bulunmalı ve konumda stoğu olan ürün olmalıdır.
- **Onayda 50402 hatası?** Malzeme konumunun deposunda Bakım Sarf Tüketimi işlem türü yok ya da pasif. Türü Teslimat türünde ve dış hedefle tanımlayın.
- **Sarf belgesi stoktan düşmüyor?** Bakım Sarf Tüketimi işlem türünün türü Teslimat ve hedef konumu dış konum olmalıdır; iç transfer türünde stok değişmez.
- **Geri alma:** Wizard Manager'da önce `Mm_MaintenanceInstruction`, sonra beş sekme silinir; zamanlanmış iş satırı ve numaratör dosyadan çıkarılır. Tablolar ancak açık onayla düşürülür.
| Açıklama | Bakım Tipleri — bakım işinin türleri (mekanik, elektrik & elektronik, genel temizlik, ölçüm & kalibrasyon, periyodik, bilgi işlem donanım…). |
| Geliştirme talebi | Bakım Modülü |
| Kaynak | `Mm_T_MaintenanceType` · filtre `"IsDeleted" = 'false'` |
| Açıklama | Hizmet Tipleri — bölümlerin talep edebileceği hizmet türleri (mekanik/elektrik arıza, bilgi işlem destek, yazıcı servisi, sunucu işleri, dokuma özel işlemleri…). |
| Geliştirme talebi | Bakım Modülü |
| Kaynak | `Mm_T_ServiceType` · filtre `"IsDeleted" = 'false'` |
| Alt formlar | `App.Maintenance.WorkOrderMaterial` (Id → WorkOrderId), `App.Maintenance.WorkOrderLabor` (Id → WorkOrderId), `App.Maintenance.WorkOrderDowntime` (Id → WorkOrderId), `App.Maintenance.WorkOrderNote` (Id → Id) |