STOK & ENVANTER — ÇİFT MANTIKLI MALZEME GÖRÜNÜRLÜĞÜ
İki paralel sistem, iki farklı soruyu yanıtlıyor: “Şu an elimizde ne var?” ve “Gelecekte elimizde ne olacak?” — canlı envanter ve dinamik projeksiyon tahmini, yerleşik bir çapraz doğrulama mekanizması olarak yan yana çalışıyor.
Stok & Envanter modülü temel bir ikilik üzerine çalışır. Üç sayfasından ikisi — Ürün Stok ve Hammadde Stok — fabrikanın bu andaki fiziksel gerçekliğini gösterir: her sepet bakır tel, her makara ekstrüde kablo, depodaki her kilogram ham plastik. Bunlar, Üretim her çıktı kaydettiğinde veya bir malzeme tüketildiğinde değişir. Üçüncü sayfa — Projeksiyon — fiziksel gerçekliği tamamen göz ardı eder ve bunun yerine planı gösterir: iş kartlarından (EKSİ) ne kadar malzeme gerekeceğinin ve satın alma siparişlerinden (ARTI) ne kadar geleceğinin haftalık tahmini. Projeksiyon plan değişikliklerine dinamik olarak tepki verir — bir malzeme siparişi teslim edildiğinde, beklenen tarih/miktardan gerçek teslim tarihi/miktarına geçiş yapar ve projeksiyonu buna göre kaydırır. Ayrıca iş kartları oluşturulduğunda, değiştirildiğinde veya iptal edildiğinde güncellenir. Bu ikilik kasıtlıdır — canlı envanterin projeksiyonu doğruladığı ve projeksiyonun canlı envanterin henüz göremediği gelecekteki açıkları önceden uyardığı yerleşik bir çapraz doğrulama mekanizması oluşturur.
İÇİNDEKİLER
1. STOK & ENVANTER NE YAPAR
Stok & Envanter modülü, herhangi bir üretim operasyonundaki en temel iki soruyu yanıtlar:
- “Şu an elimizde ne var?” — Ürün Stok (yarı mamul/mamul ürünler) ve Hammadde Stok (hammaddeler) tarafından yanıtlanır. Bu sayfalar fabrikanın envanterinin t=0 anındaki canlı, fiziksel durumunu gösterir. Her sepet çekilmiş bakır tel (X kodlu), her makara kalaylanmış tel (Y kodlu), her kilogram ham plastik — gerçek zamanlı ağırlıklar, durumlar, tahsisler ve tam üretim izlenebilirliğiyle birlikte görünür.
- “Gelecekte elimizde ne olacak?” — Projeksiyon (Stok Tahmini) tarafından yanıtlanır. Bu sayfa 8 malzeme kategorisinde (bakır, kalay, plastik, katalizör, boya, antirodent, makara, palet) haftalık bir tahmin gösterir; planlanan iş kartlarının ne kadar malzeme tüketeceğini (EKSİ) ile satın alma siparişlerinden ne kadar geleceğini (ARTI) hesaplayarak, açıkları haftalarca önceden ortaya çıkaran kümülatif bir bakiye üretir.
Bu iki sistem temelden farklı veri kaynakları üzerinde çalışır:
| Boyut | Canlı Envanter (Ürün + Hammadde Stok) | Projeksiyon |
|---|---|---|
| Veri kaynağı | half_product_stock tablosu + materials tablosu | work_cards (EKSİ) + material_orders (ARTI) |
| Zaman ekseni | Şimdi (t=0) | Geleceğe doğru haftalar (H01–H52+) |
| Ne zaman değişir | Üretim çıktı kaydeder, malzeme tüketilir/alınır | Plan değişir: iş kartı oluşturulur/değiştirilir/iptal edilir, malzeme siparişi teslim edilir (gerçek tarih & miktara geçer), sipariş tarihi/miktarı değişir, sipariş iptal edilir |
| Ne zaman DEĞİŞMEZ | — | Üretim fiziksel olarak tamamlandığında (tamamlanmış iş kartları hâlâ planda sayılır) |
| CRUD | Tam (görüntüle, ağırlık/durum düzenle, sil) | Salt okunur (projeksiyon hesaplanır, düzenlenmez) |
Çapraz doğrulama mekanizması: Projeksiyon H15 haftası için bakır fazlası gösteriyorsa ama Hammadde Stok bakırın şu an azaldığını gösteriyorsa, bir şeyler yanlıştır — belki bir malzeme siparişi kaydedildi ama fiziksel teslimat gerçekleşmedi. Tersine, Hammadde Stok bol plastik gösteriyorsa ama Projeksiyon H20’de açık öngörüyorsa, mevcut stok yaklaşan üretim tarafından tüketilecek demektir. Hiçbir sistem tek başına hikayenin tamamını anlatamaz; birlikte kapsamlı bir malzeme görünürlük katmanı oluştururlar.
2. VERİ AKIŞI
2.1 Projeksiyon Veri Akışı
Projeksiyon, haftalık tahminini ProjeksiyonService (804 satır) içinde birleştirilen iki bağımsız veri kaynağından hesaplar:
EKSİ Tarafı: İş Kartı Malzeme Gereksinimleri
Her iş kartı, hangi hammaddeleri tüketeceğini belirten bir material_details JSON’u taşır. Servis, makine türlerini malzeme kategorilerine eşler:
| Makine Türü | Çıkarılan Malzeme | JSON Yolu |
|---|---|---|
| Kabatel Çekme | Bakır (kg) | material_details.copper_kg |
| Kalaylama | Kalay (kg) | material_details.tin_kg |
| Extruder | Plastik, Katalizör, Boya, Antirodent (kg) | quantities.*, insulation_materials[], sheath_materials[] |
| Aktarma | Makara (adet) | makara_distributions[].count |
| Paletleme | Palet (adet) | palettes[].quantity |
CANCELLED dışındaki tüm iş kartları dahil edilir — tamamlanmış olanlar bile, çünkü Projeksiyon tam plan geçmişini izler. Gelen tarafında, bir sipariş teslim edildiğinde servis expected_date/quantity’den delivered_date/delivered_quantity’ye geçiş yapar, böylece projeksiyon gerçek teslim zamanlamasını ve miktarlarını dinamik olarak yansıtır.
ARTI Tarafı: Gelen Malzeme Siparişleri
Her malzeme siparişinin bir material_type, quantity ve expected_date alanı vardır. Teslim edilen siparişlerde sistem bunun yerine delivered_date ve delivered_quantity kullanır. Malzeme adları, mevcut olduğunda tedarikçinin malzeme kataloğundan çözümlenir. CANCELLED dışındaki tüm siparişler dahil edilir.
Kümülatif Hesaplama
Servis, en erken veri noktasından (bir önceki yılda olabilir) son görünen haftaya kadar tüm haftaları üretir. haftalık = artı - eksi hesaplar ve 8 malzeme kategorisinin her biri için kümülatif bir bakiye tutar. Kullanıcının görüntüleme penceresinde (varsayılan 10 hafta), gizli açık tespiti için alt-malzeme kümülatifleri de (örn. Plastik kategorisi içindeki “HFX 500P” gibi bireysel plastik türleri) izlenir.
2.2 Canlı Envanter Veri Akışı
Canlı envanter sayfaları doğrudan fiziksel envanter tablolarından okur:
Ürün Stok 7 paralel API çağrısı yapar (her üretim adımı için birer tane: Kabatel, Kalaylama, İncetel, Buncher, Extruder, E-Beam, Aktarma), Hammadde Stok ise tüm malzemeleri tek bir çağrıda alır ve istemci tarafında 8 kategoriye gruplar.
3. VERİTABANI KATMANI
Stok modülü, canlı envanter için iki birincil tabloya ve Projeksiyon hesaplamasını besleyen iki harici tabloya (diğer modüllerden) dayanır.
3.1 half_product_stock (20 sütun) — Yarı Mamul & Mamul Ürünler
Herhangi bir makine tarafından üretilen her sepet, makara veya bobin burada kaydedilir. Her kayıt deterministik bir QR koda sahiptir (Kabatel için X1, Kalaylama için Y1, İncetel için Z1, Buncher için T1, Extruder için U1, E-Beam için G1).
| Sütun | Tip | Detay |
|---|---|---|
id | Integer PK | Otomatik artış |
qr_code | String(50) | Benzersiz, indeksli. Deterministik: X1, X2, Y1, Y2, vb. |
product_code | String(100) | İndeksli. Örn: KC_18 (Kabatel 1.8mm), KL_18 (Kalaylama 1.8mm) |
product_name | String(200) | Okunabilir ad |
production_step | String(50) | İndeksli. Enum: kabatel_cekme, kalaylama, incetel, buncher, extruder, ebeam |
initial_weight_kg | Float | İlk üretildiğindeki ağırlık |
remaining_weight_kg | Float | Mevcut ağırlık (bir sonraki adımda tüketildikçe azalır) |
basket_number | Integer | Oturum içinde sıralı |
allocation | String(20) | ORDER (müşteri siparişine bağlı) veya STOCK (serbest envanter) |
order_id | Integer FK | allocation = ORDER ise orders.id’ye referans |
status | String(50) | İndeksli. Enum: available, in_use, consumed, reserved, shipped |
production_output_id | Integer FK | production_outputs.id’ye referans, indeksli |
session_id | Integer FK | production_sessions.id’ye referans |
work_card_id | Integer FK | work_cards.id’ye referans |
source_qr_codes | Text | Tam izlenebilirlik için girdi QR kodlarının JSON dizisi (örn. bir Kalaylama Y1, Kabatel X3 ve X4’ü tüketmiş) |
produced_at | DateTime | Üretim zamanı |
consumed_at | DateTime | Tamamen tüketilme zamanı (nullable) |
created_at | DateTime | UTC |
updated_at | DateTime | Otomatik güncelleme |
notes | Text | İsteğe bağlı notlar |
Bileşik indeksler: Adım bazlı filtreleme için (production_step, status), ürün bazlı gruplama için (product_code, status). 4 yabancı anahtar siparişlere, üretim çıktılarına, oturumlara ve iş kartlarına bağlanır.
3.2 materials (Hammadde modülünden)
Hammadde envanter tablosu (Hammadde modülünde belgelenmiştir). Hammadde Stok bu tabloyu doğrudan GET /api/materials/list üzerinden okur. Her satır QR kodu, ağırlığı, tedarikçisi, lot numarası ve durumuyla bir fiziksel hammadde lotunu temsil eder. 8 malzeme türü: raw_copper, raw_tin, raw_plastic, raw_catalyst, raw_dye, raw_antirodent, raw_palette, raw_reel.
3.3 Projeksiyon’u Besleyen Harici Tablolar
| Tablo | Modül | Projeksiyon Ne Okur |
|---|---|---|
work_cards | Üretim | sevkiyat_week (teslim haftası), machine_type, material_details JSON, status (CANCELLED hariç) |
material_orders | Hammadde | material_type, quantity, expected_date, delivered_date, delivered_quantity, status (CANCELLED hariç) |
Ayrı bir “projeksiyon” tablosu yoktur. Projeksiyon, iş kartları ve malzeme siparişlerinden anlık olarak hesaplanır. Bu bilinçli bir tasarım kararıdır: Projeksiyon planı yansıttığı için (depolanmış bir durumu değil), senkronizasyon veya önbellek geçersiz kılma gerektirmeden her zaman planın en güncel halini gösterir. Ödün, istek başına hesaplama maliyetidir, ancak sorgu kapsamı (milyonlarca değil yüzlerce iş kartı ve sipariş) bunu uygulanabilir kılar.
4. BACKEND MİMARİSİ
4.1 Route Dosyaları
| Dosya | Satır | Prefix | Endpoint | Amaç |
|---|---|---|---|---|
projeksiyon_routes.py | 245 | /api/projeksiyon | 4 | Stok projeksiyonu: ana veri, özet, debug, malzeme bazlı detay |
half_product_routes.py | 327 | /api/stock | 6 | Yarı mamul CRUD: liste, adım bazlı, özet, QR bazlı, güncelle, sil |
material_routes.py | (Hammadde) | /api/materials | ~4 | Hammadde listeleme (Hammadde modülüyle paylaşılır) |
4.2 Projeksiyon Servisi (804 satır)
Modülün hesaplama kalbi. ProjeksiyonService tüm projeksiyon hesaplamasını yönetir:
| Metot | Ne Yapar |
|---|---|
get_earliest_data_week_offset() | Veri içeren en erken haftayı bulmak için hem iş kartlarını hem malzeme siparişlerini tarar. Kümülatif hesaplamaların önceki yıllardan gelen verileri de içermesini sağlar (örn. 2025 siparişleri 2026 projeksiyonunu hâlâ etkiler). |
get_requirements_by_week(weeks) | İptal edilmemiş TÜM iş kartlarını okur, hafta ve kategori bazında malzeme gereksinimlerini çıkarır. 5 makine türünü 8 malzeme kategorisine eşler. Hem toplu hem de belirli malzeme adına göre detaylı kırılımlar üretir. Hafta başına tekrarlanan malzeme adlarını birleştirir. |
get_incoming_by_week(weeks) | İptal edilmemiş TÜM malzeme siparişlerini okur. Teslim edilenler için gerçek teslim tarihi/miktarı; bekleyen/sevk edilenler için beklenen tarih/miktar kullanır. Aynı 8 kategoriye eşler. Tedarikçi kataloğundan belirli malzeme adlarını çözümler. |
get_projeksiyon(num_weeks, offset) | Ana metot. Hafta pencerelerini üretir, TÜM haftalar için (yalnızca görüntüleme penceresi değil) gereksinimleri ve gelenleri çeker, kategori ve alt-malzeme başına kümülatif hesaplar, frontend açık tespiti için görüntüleme öncesi kümülatif durumu yakalar, yapılandırılmış yanıt döndürür. |
4.3 API Sözleşmesi — Projeksiyon Endpoint’leri (4)
| Metot | Yol | Parametreler | Ne Yapar |
|---|---|---|---|
GET | /api/projeksiyon | weeks (4–52, varsayılan 10), offset (−260 ile +260) | Ana endpoint. Malzeme başına ARTI/EKSİ/kümülatif, alt-malzeme kümülatifleri, tüketim ve gelen detay dizileri, navigasyon bilgisi ile haftalık kırılım döndürür. |
GET | /api/projeksiyon/summary | weeks (4–52, varsayılan 8) | Açık uyarı endpoint’i. Tüm haftalarda negatif kümülatifleri tarar, malzeme, hafta ve kümülatif değerle açık olaylarının listesini döndürür. |
GET | /api/projeksiyon/material/{type} | type (8 geçerli), weeks | Malzeme bazlı detay. Tek bir malzeme türü için tam artı/eksi/kümülatif ile haftalık veri döndürür. Plastik türü için plastik detaylarını içerir. |
GET | /api/projeksiyon/debug | — | Debug endpoint’i. DB’deki benzersiz sevkiyat_week’leri, hafta başına kart sayısı, material_details anahtarlarıyla örnek iş kartları, örnek malzeme siparişlerini gösterir. |
4.4 API Sözleşmesi — Yarı Mamul Endpoint’leri (6)
| Metot | Yol | Ne Yapar |
|---|---|---|
GET | /api/stock/half-products | İsteğe bağlı production_step ve status filtreleriyle tüm yarı mamulleri listeler. Sayfalanmış (limit/offset). |
GET | /api/stock/half-products/by-step/{step} | Oturumdan operatör adıyla belirli bir üretim adımı için öğeleri getirir. Ürün Stok sayfası tarafından kullanılır (7 paralel çağrı). |
GET | /api/stock/half-products/summary | 6 üretim adımı için adım başına toplu sayılar ve ağırlıklar (mevcut sayı, mevcut kg, toplam sayı). |
GET | /api/stock/half-products/{qr_code} | QR koduna göre tek öğe getirir. |
PUT | /api/stock/half-products/{id} | İzin verilen alanları günceller: remaining_weight_kg, status, notes. |
DELETE | /api/stock/half-products/{id} | Kalıcı silme. Bağlı production_output’u da siler ve bu son numaraysa QR sırasını azaltır. |
5. FRONTEND
5.1 Sayfa Yapısı
| Route | Bileşen | Satır | Amaç |
|---|---|---|---|
/stok/projeksiyon | Stok/Projeksiyon/index.tsx | 3.323 | Tüm ERP’deki en büyük bileşen. Genişletilebilir alt-malzeme sütunlarıyla haftalık tahmin tablosu + 3 grafik türü (Çizgi, Isı Haritası, Radar). Malzeme filtreleme, hafta navigasyonu, gizli açık tespiti. |
/stok/urun-stok | Stok/UrunStok/index.tsx | 866 | Yarı mamul envanter. 7 Collapse paneli (her üretim adımı için birer tane), 3 seviyeli tablo hiyerarşisi (adım → ürün grubu → bireysel öğe), düzenle/sil, bağlı test görüntüleme. |
/stok/hammadde-stok | Stok/HammaddeStok/index.tsx | 676 | Hammadde envanter. 8 Collapse paneli (her malzeme türü için birer tane), 3 seviyeli tablo hiyerarşisi (tür → malzeme adı → bireysel lot), koşullu ağırlık renklendirmesi, düzenle/sil. |
Toplam frontend: 3 sayfada 4.865 satır. Projeksiyon tek başına kodun %68’ini oluşturur.
5.2 Ortak Kalıplar
- WebSocket yok: Üç sayfanın tamamı REST API polling veya tek seferlik fetch kullanır. Gerçek zamanlı abonelik yoktur.
- Türkçe yerel ayar: Tüm sayfalar
ConfigProvider locale={trTR}içindedayjsileEurope/Istanbulzaman dilimi dönüşümüyle sarılır. - ProTable yok: Diğer modüllerden farklı olarak stok sayfaları düz Ant Design
Tablebileşenleri kullanır (Hammadde modülünde bulunan HammaddeSipariş hariç). - İstemci tarafı gruplama: Hem Ürün Stok hem Hammadde Stok verileri çeker ve istemci tarafında gruplar (sırasıyla product_code ve material_name’e göre).
5.3 Projeksiyon — Frontend Öne Çıkanlar
3.323 satırıyla Projeksiyon, ERP’deki en büyük React bileşenlerinden biridir. İki sekmesi vardır:
Sekme 1 — Tablo Görünümü: Hafta satırları ve 8 malzeme sütunuyla dinamik bir tablo. Her malzeme sütunu gelen (yeşil ↑), tüketim (kırmızı ↓) ve kümülatif bakiye (renk kodlu Tag) gösterir. Sütunlar genişletilebilir: bir malzeme başlığına tıklamak bireysel alt-malzeme sütunlarını açar (örn. Bakır altında “Filamaşin”, Plastik altında “HFX 500P”). Genişletilmeyen malzemeler trafik ışığı göstergeleriyle 20px renk çubuklarına daraltılır. Hafta navigasyonu offset parametresiyle 10 haftalık pencereyi kaydırır. Özet satırı son kümülatifleri gösterir.
Sekme 2 — Grafik Görünümü: ReactECharts ile çalışan üç değiştirilebilir grafik türü:
- Çizgi Grafik: Alan dolgusuyla yumuşak kümülatif çizgiler. Genel bakış modu (tüm malzemeler) veya detay modu (1–3 seçili malzeme için alt-malzeme yığılmış çubuklar + kümülatif üst katman).
- Isı Haritası: Haftalar (x) vs malzemeler/alt-malzemeler (y), malzeme başına normalizasyonla kırmızıdan yeşile renklendirilmiş. Özel HTML eksen tooltip’ları açık başlangıcı/artışı bilgisi gösterir.
- Radar Grafik: Birleştirilmiş mod (4 hafta üst üste) veya bireysel mod (sayfalanmış örümcek ağları). 50 = sıfır çizgisi ile normalleştirilmiş 0–100 ölçeği. İşarete göre renklendirilmiş zengin metin etiketleri.
Gizli Açık Tespiti: En sofistike özellik. Toplam Bakır kümülatifi pozitifken alt-malzeme “Filamaşin 8mm” negatifse, hücre bir uyarı tooltip’uyla yeşil arka plan üzerinde kırmızı kenarlık alır. Bu, üç grafik türünün tamamında görünür.
5.4 Ürün Stok — Frontend Öne Çıkanlar
7 Collapse paneli (Kabatel, Kalaylama, İncetel, Buncher, Extruder, E-Beam, Aktarma), her biri renk kodlu bir ikon ve 3 başlık istatistiğiyle (Toplam kg, Sipariş kg, Serbest kg). 2. seviyede product_code’a göre gruplanmış öğeler, 3. seviyede bireysel QR kodlu öğeler. Özellikler: düzenleme modalı (ağırlık, tahsis, notlar), onaylı silme ve production_output_id’si olan herhangi bir öğe için Lab modülünden test sonuçlarını çeken bağlı test görüntüleyici.
5.5 Hammadde Stok — Frontend Öne Çıkanlar
8 Collapse paneli (Bakır, Kalay, Plastik, Katalizör, Boya, Antirodent, Palet, Makara). Yapısal olarak Ürün Stok’u yansıtır ancak hammaddeler içindir. Birimler uyarlanır: çoğu malzeme için kg, palet ve makara için “adet”. Koşullu ağırlık renklendirmesi: kalan ağırlık orijinalin %20’sinin altında kırmızı, orijinalin %95’inin altında sarı gösterilir. Tek bir API çağrısı tüm malzemeleri çeker; material_type’a göre istemci tarafı gruplama.
5.6 Yetki Sistemi
| Sayfa | Route Guard | Manifest Butonları |
|---|---|---|
| Projeksiyon | canStok | access_page, view_projections, create_projection, edit_projection |
| Ürün Stok | canStok | access_page, view_table, view_details, edit_stock, adjust_quantity |
| Hammadde Stok | canStok | access_page, view_table, view_details, edit_stock, adjust_quantity |
Üç sayfanın tamamı access.ts’den canStok route guard’ını paylaşır. Buton düzeyi izinler manifest’te tanımlıdır ancak şu an sayfa bileşenlerinde uygulanmamaktadır — route düzeyi guard aktif erişim kontrolüdür.
6. ALT MODÜLLER
Stok modülünün karmaşıklık sırasına göre üç alt modülü vardır:
Projeksiyon (Stok Tahmini)
Malzeme arz ve talebinin haftalık tahmini. 804 satırlık backend servisi + 3.323 satırlık frontend — ERP’deki en büyük React bileşenlerinden biri. Salt okunur: CRUD yok, saf hesaplama.
Hammadde Stok
Tüm hammaddelerin canlı envanteri (bakır, kalay, plastik, katalizör, boya, antirodent, palet, makara). Hammadde modülünün materials tablosundan okur. 8 collapse paneli, koşullu ağırlık renklendirmesi, düzenle/sil.
Ürün Stok
Tüm üretim adımlarındaki yarı mamul ve mamul ürünlerin canlı envanteri. Makine türüne göre düzenlenmiş 7 collapse paneli, 3 seviyeli gruplama, Lab modülüyle bağlı test entegrasyonu.
6.1 — Projeksiyon (Stok Tahmini)
6.1.1 — Amaç ve İş Bağlamı
Projeksiyon, fabrikadaki en ileri görüşlü soruyu yanıtlar: “Hafta hafta, her hammaddeden yeterince olacak mı, yoksa açık mı verecek?” İki veri akışını — üretim planlarından (iş kartları) gelen malzeme tüketimini ve satın alma siparişlerinden gelen malzeme varışlarını — her iki yönde 5 yıla kadar uzanan, gezinilebilir tek bir haftalık tahmine harmanlayan salt okunur, hesaplanmış bir görünümdür.
Bu, önceden hesaplanmış anlık görüntülerle bir dashboard değildir. Sayfa her yüklendiğinde, backend iptal edilmemiş TÜM iş kartlarını ve iptal edilmemiş TÜM malzeme siparişlerini sorgular, en erken veri noktasından itibaren her hafta boyunca kümülatif bir bakiye hesaplar ve kullanıcının 10 haftalık görüntüleme penceresi için sonucu döndürür. Projeksiyon her zaman tazedir — önbellekleme yok, depolanmış durum yok, bayat veri yok.
Sayfa iki kitleye hizmet eder: satın alma ekibi (daha fazla malzeme sipariş etme zamanını bilmesi gereken) ve üretim planlayıcıları (yaklaşan iş kartlarının açık yaratıp yaratmayacağını bilmesi gereken). 3.323 satır frontend kodu ve 804 satır backend servisiyle, Stok modülündeki en büyük ve en karmaşık bileşenlerden biridir.
6.1.2 — İki Veri Akışı
Projeksiyon’daki her veri parçası iki kaynaktan birinden gelir:
EKSİ (MINUS) — Malzeme Gereksinimleri
Kaynak: work_cards tablosu (Üretim modülü)
Anahtar alan: sevkiyat_week (teslim haftası, örn. “2026-W12”)
Ne çıkarır: Her iş kartı bir material_details JSON’u taşır. Servis 5 makine türünü 8 malzeme kategorisine eşler:
kabatel_cekme→copper_kg(Filamaşin)kalaylama→tin_kg(Kalay)extruder→ plastik, katalizör, boya, antirodent (insulation_materials[]vesheath_materials[]’den)aktarma→ makara (makara_distributions[]’den) — not: kangal plastik ambalaj kullanır ve İZLENMEZpaletleme→ palet (palettes[]’den)
Dahil eder: CANCELLED dışındaki TÜM durumlar — tamamlanmış iş kartları bile sayılır çünkü plan gerçekleşmiştir.
ARTI (PLUS) — Gelen Malzemeler
Kaynak: material_orders tablosu (Hammadde modülü)
Anahtar alan: expected_date veya delivered_date
Dinamik geçiş: Bekleyen/sevk edilen siparişler için expected_date + quantity (plan) kullanır. Teslim edilen siparişler için delivered_date + delivered_quantity’ye (gerçek) geçer. Bu, projeksiyonun teslimatlar gerçekleştikçe gerçekliği dinamik olarak yansıtması anlamına gelir.
Malzeme çözümleme: Servis, supplier_material ilişkisi üzerinden belirli malzeme adlarını çözümler (örn. sadece “plastik” değil “HFX 500P”). Tedarikçi malzemesi bağlı değilse kategori adına düşer.
Dahil eder: CANCELLED dışındaki TÜM durumlar.
6.1.3 — Kümülatif Hesaplama Motoru
Projeksiyon’un çekirdeği ProjeksiyonService.get_projeksiyon()’da yaşar. Hesaplama basit bir “bu haftanın artı ve eksisini göster” değildir — tam tarihsel kümülatif toplamdır:
- En erken veriyi bul:
get_earliest_data_week_offset()hem iş kartlarını (MIN(sevkiyat_week)) hem malzeme siparişlerini (MIN(expected_date),MIN(delivered_date)) tarayarak herhangi bir verisi olan en ilk haftayı bulur. Bu bir önceki yılda olabilir (örn. 2025 siparişleri hâlâ 2026 projeksiyonunu etkiler). - TÜM haftaları üret: En erken veri haftasından kullanıcının görüntüleme penceresindeki son haftaya kadar (örn. en erken veri 2025-W40 ve kullanıcı 2026-W05–W14 görüntülüyorsa, sistem W40’tan W14’e kadar haftalar üretir — 10 haftalık bir görünüm için 27 haftalık hesaplama).
- TÜM haftalar için gereksinimleri ve gelenleri çek: İki toplu sorgu: biri
sevkiyat_week’e göre gruplanmış iş kartları, biri ilgili haftalarına eşlenmiş malzeme siparişleri. - Her haftayı sırayla işle: Her hafta için malzeme kategorisi başına
haftalık = artı - eksihesapla ve kümülatif toplama ekle. Ayrıca alt-malzeme kümülatiflerini de izle (örn. Bakır içindeki “Filamaşin 8mm”). - Görüntüleme öncesi durumu yakala: Kullanıcının görüntüleme penceresindeki ilk haftayı işlemeden önce, mevcut kümülatif durumun anlık görüntüsünü
pre_view_sub_material_cumulatives’e al. Bu, frontend’in gizli açık tespiti için kritiktir. - Yalnızca görüntüleme haftalarını döndür: İşlenen tüm haftalardan yalnızca kullanıcının gerçekten görüntülediği 10 hafta yanıta dahil edilir. Ancak kümülatif değerleri TÜM tarihsel veriyi içerir.
Neden sadece görüntüleme penceresini hesaplamıyoruz? Yalnızca 5–14 haftalarını hesaplarsanız ve 2. haftada büyük bir bakır teslimatı olduysa, 5. haftanın kümülatifi +5000 kg yerine 0 gösterir. Doğru kümülatif bakiyeler için tarihsel bağlam esastır. Ödün, istek başına daha fazla hesaplamadır, ancak veri hacmi (milyonlarca değil yüzlerce kayıt) bu yaklaşımı önbellekleme olmadan uygulanabilir kılar.
6.1.4 — Detay Konsolidasyonu
Hem get_requirements_by_week() hem get_incoming_by_week() kategori başına toplu toplamların yanı sıra belirli malzeme adına göre detaylı kırılımlar da üretir. Örneğin, bir Extruder iş kartı 200 kg “HFX 500P” ve 150 kg “HFFR 302” tüketebilir — ikisi de “plastik”tir ancak bireysel olarak izlenir.
Tüm kartları/siparişleri işledikten sonra, servis her hafta içindeki tekrarlanan adları birleştirir. Aynı haftadaki iki Extruder kartı da “HFX 500P” tüketiyorsa, miktarları tek bir detay girişinde birleştirilir. Bu konsolidasyon 8 detay dizisinin tamamında çalışır.
6.1.5 — API Endpoint’leri
| Metot | Yol | Parametreler | Amaç |
|---|---|---|---|
GET | /api/projeksiyon | weeks (4–52, varsayılan 10), offset (−260 ile +260) | Ana endpoint. Malzeme kategorisi başına ARTI/EKSİ/kümülatif, hafta başına alt-malzeme kümülatifleri, gereksinim ve gelen detay dizileri, iş kartı ve sipariş sayıları, navigasyon metadata’sı ve açık tespiti için görüntüleme öncesi alt-malzeme kümülatifleri ile haftalık kırılım döndürür. |
GET | /api/projeksiyon/summary | weeks (4–52, varsayılan 8) | Açık uyarı endpoint’i. Negatif kümülatifi olan herhangi bir malzeme kategorisi için tüm haftaları tarar, malzeme anahtarı, etiketi, hafta, kümülatif değer ve birimle açık olaylarının düz bir listesini döndürür. |
GET | /api/projeksiyon/material/{type} | type (8 geçerli tür), weeks | Malzeme bazlı detay. Tek bir malzeme türü için haftalık artı/eksi/kümülatif döndürür. Plastik türü için plastik detay kırılımını içerir. |
GET | /api/projeksiyon/debug | — | Debug endpoint’i. Veritabanındaki benzersiz sevkiyat_week değerlerini, hafta başına kart sayısını, material_details anahtarlarıyla örnek iş kartlarını ve örnek malzeme siparişlerini gösterir. |
6.1.6 — Frontend Mimarisi (3.323 Satır)
Projeksiyon sayfası iki sekmeli tek bir React bileşenidir: Projeksiyon (tablo görünümü) ve Grafikler (grafik görünümü). Her iki sekme de aynı API yanıtını kullanır.
Durum Yönetimi
| Durum Değişkeni | Tip | Amaç |
|---|---|---|
projeksiyonData | ProjeksiyonResponse | null | Tüm API yanıtı, her iki sekme arasında paylaşılır |
weekOffset | number | H01’den mevcut hafta ofseti. Navigasyon oklarıyla değişir. API yeniden çağrısını tetikler. |
expandedMaterials | string[] | Hangi malzeme sütunlarının alt-malzemeleri göstermek için genişletildiği |
knownSubMaterials | Record<string, string[]> | Keşfedilen alt-malzeme adlarını navigasyonlar boyunca kalıcı kılar, böylece genişletme okları kaybolmaz |
graphType | 'line' | 'heatmap' | 'waterfall' | Aktif grafik türü (waterfall aslında radar) |
selectedGraphMaterials | string[] | Grafikler için malzeme filtresi. Boş = “Tümü”. 1–3 = alt-malzeme kırılımlı detay modu. |
radarViewMode | 'merged' | 'individual' | Radar grafik görüntüleme modu: 4 hafta üst üste vs. sayfalanmış bireysel örümcek ağları |
radarPage | number | Bireysel radar modu sayfalama için mevcut sayfa |
activeTab | 'projeksiyon' | 'grafikler' | Mevcut sekme |
6.1.7 — Sekme 1: Projeksiyon Tablosu
Tablo birincil arayüzdür. 10 haftayı satır, 8 malzeme kategorisini sütun olarak gösterir. Tablo bir Ant Design ProTable DEĞİLDİR — yoğun şekilde özelleştirilmiş sütun renderlamasıyla düz bir Table’dır.
Sütun Yapısı
Her malzeme sütunu hücre başına üç bilgi renderlar:
- Gelen (ARTI): O hafta gelen malzeme miktarıyla yeşil yukarı ok
- Tüketim (EKSİ): Tüketilen malzeme miktarıyla kırmızı aşağı ok
- Kümülatif: Bakiyeyi gösteren renk kodlu
Tag. Pozitifse (fazla) yeşil, negatifse (açık) kırmızı, sıfırsa gri.
Genişletilebilir Alt-Malzeme Sütunları
En ayırt edici özelliklerden biri. Her malzeme sütun başlığında küçük bir genişletme oku vardır. Tıklamak, ana kategorinin altına yerleştirilmiş bireysel alt-malzeme sütunlarını açar. Örneğin, “Plastik”i genişletmek “HFX 500P”, “HFFR 302” ve “XLPE” sütunlarını açabilir — her biri o hafta içinde kendi artı/eksi/kümülatifini gösterir.
Alt-malzeme adları API yanıtının detay dizilerinden keşfedilir ve knownSubMaterials’de kalıcı kılınır, böylece hafta navigasyonunda kaybolmazlar. Bir sütun genişletilmediğinde, trafik ışığı göstergesiyle (yeşil nokta = hepsi pozitif, kırmızı nokta = herhangi biri negatif, sarı nokta = karışık) 20px genişliğinde renk çubuğuna daraltılır.
Hafta Navigasyonu
Sol/sağ oklar 10 haftalık pencereyi bir seferde 10 hafta kaydırır (weekOffset durumu üzerinden). Bir takvim ikonu mevcut haftaya sıfırlar (offset = 0). API −260 ile +260 sınırlarını zorlar (her yönde 5 yıl). Her navigasyon yeni bir API çağrısı tetikler; backend sıfırdan yeniden hesaplar.
Özet Satırı
Tablonun son satırı, tüm görüntüleme penceresi boyunca her malzeme için son kümülatifi gösterir.
6.1.8 — Gizli Açık Tespiti
Tüm Stok modülündeki en sofistike özellik. Çözdüğü problem:
Senaryo: H12 haftası için toplam “Plastik” kümülatifi +2.500 kg. Her şey yolunda görünüyor. Ama gizlice, alt-malzeme “HFX 500P” −180 kg’da, “HFFR 302” ise +2.680 kg’da. Bir plastiğin fazlası diğerinin açığını maskeliyor. HFFR’yi HFX yerine kullanamazsınız — kimyasal olarak farklı bileşiklerdir.
Nasıl çalışır:
- Backend,
category_materialNameanahtarlı bir sözlük olaraksub_material_cumulatives’i izler (örn.plastic_HFX 500P). Bu, yalnızca görüntüleme penceresi değil, HER hafta için güncellenir. - Yanıttaki her hafta kendi
sub_material_cumulativesanlık görüntüsünü taşır. - Frontend kontrol eder: ana kategori kümülatifi ≥ 0 ama o kategori içindeki HERHANGİ bir alt-malzeme negatif kümülatife sahipse, bu bir gizli açıktır.
- Görsel gösterge: hücre, hangi belirli alt-malzemelerin açıkta olduğunu listeleyen bir uyarı tooltip’uyla yeşil arka plan üzerinde kırmızı kenarlık alır.
Bu tespit üç görselleştirme modunun tamamında (tablo, çizgi grafik, ısı haritası, radar) çalışır.
6.1.9 — Sekme 2: Grafik Görünümü
Grafikler sekmesi, tamamı ReactECharts (echarts-for-react) ile çalışan üç değiştirilebilir görselleştirme türü sunar. Hepsi projeksiyonData’dan aynı veriyi paylaşır.
Malzeme Filtre Tabletleri
Üstteki tıklanabilir tabletler malzemeye göre filtrelemeye izin verir. Üç mod:
- Tümü: Filtre seçili değil. Grafikler tüm malzemeler için toplam kümülatif çizgileri gösterir.
- 1–3 malzeme seçili (Detay Modu): Grafikler tüketim ve gelen için alt-malzeme yığılmış çubuklar + alt-malzeme başına kümülatif üst katman çizgileri göstermeye geçer.
- 4+ malzeme: İzin verilmez. UI 4. seçildiğinde en eskisini kaldırarak maksimum 3 seçimi zorlar.
Grafik Türü 1: Çizgi Grafik
Gradyan alan dolgusuyla yumuşak kümülatif çizgiler. Genel bakış modunda her malzeme kendi çizgisini alır. Kesikli kırmızı sıfır çizgisi açık eşiğini işaretler. Detay modunda alt-malzemeler tüketim (negatif, kırmızı) ve gelen (pozitif, yeşil) için yığılmış çubuk grafikleri alır.
Grafik Türü 2: Isı Haritası
X ekseninde haftalar, y ekseninde malzemeler/alt-malzemeler olan bir ızgara. Her hücre kümülatif değere göre kırmızıdan yeşile gradyanla renklendirilir. Renklendirme malzeme başına normalizasyon kullanır — her malzeme satırı bağımsız olarak normalleştirilir. Özel HTML eksen tooltip’ları detaylı açık bilgisi gösterir.
Grafik Türü 3: Radar Grafik
İki modda çalışır:
- Birleşik mod: Son 4 hafta tek bir radar üzerinde üst üste. Her hafta farklı bir renk alır (gri, amber, mor, camgöbeği). Malzemeler çevrede zengin metin etiketleriyle konumlanır. 50 işaretinde kesikli daire sıfır çizgisini temsil eder (ölçek 0–100 normalleştirilmiş).
- Bireysel mod: Sayfa başına 4 hafta ayrı örümcek diyagramları olarak sayfalanmış görüntüleme. Sol/sağ oklar haftalar arasında sayfalandırır.
6.1.10 — Dashboard İstatistik Kartları
Grafiklerin üzerinde 4 istatistik kartı hızlı bir özet sağlar:
- Toplam Gelen: Tüm malzemeler ve haftalar genelinde tüm ARTI toplamı
- Toplam İhtiyaç: Tüm malzemeler ve haftalar genelinde tüm EKSİ toplamı
- Net Bakiye: Toplam gelen eksi toplam tüketim. Pozitifse yeşil, negatifse kırmızı.
- Stok Sağlığı:
(toplamArtı / toplamEksi) × 50olarak hesaplanan, 0–100 ile sınırlanmış yüzde. Progress çubuğu olarak renderlanır.
6.1.11 — Extruder Malzeme Çıkarma Mantığı
En karmaşık malzeme eşlemesi Extruder iş kartları içindir. Tek bir Extruder kartı aynı anda birden fazla malzeme tüketebilir çünkü kablo ekstrüzyonu katmanlı kaplamalar içerir:
- Yalıtım malzemeleri (
insulation_materials[]): Her girişinmaterial_name(plastik türü),plastic_kg,catalyst_name,catalyst_kgvedye_namevedye_kgiçerendyes[]dizisi vardır. - Kılıf malzemeleri (
sheath_materials[]): Yalıtımla aynı yapı ama ayrıcaantirodent_nameveantirodent_kgiçerir (sadece dış kılıfta kemirgen kovucu olabilir).
Servis her iki diziyi gezer, bireysel malzeme adlarını ve miktarlarını çıkarır. Tek bir Extruder kartı 3–4 farklı plastik, 2 katalizör, 2 boya ve 1 antirodent için detay girişleri üretebilir — hepsi ilgili kategori detay dizilerine eşlenir ve aynı malzeme adı aynı haftada birden fazla kartta görünürse konsolide edilir.
6.1.12 — Hafta Anahtar Sistemi
Projeksiyon’daki tüm zamansal veriler YYYY-WNN formatında ISO hafta anahtarları kullanır (örn. “2026-W12”). Servis yardımcı fonksiyonlar sağlar:
get_week_key(date): Pythondate’ini ISO hafta anahtarına dönüştürürweek_key_to_offset(week_key): Bir hafta anahtarını mevcut yılın H01’inden tamsayı ofsetine dönüştürür. Yıl sınırları ötesinde haftaları karşılaştırmak için kullanılır.generate_weeks(num_weeks, offset): week_key, hafta etiketi (H01–H52), Türkçe tarih aralığı (örn. “06-12 Oca”) ve ISO başlangıç/bitiş tarihlerini içeren hafta metadata’sı üretir.
6.1.13 — Projeksiyonu Ne Değiştirir
Projeksiyon anlık olarak hesaplandığından, kaynak verisindeki herhangi bir değişiklik çıktıyı anında etkiler:
| Eylem | Projeksiyon Üzerindeki Etkisi |
|---|---|
| Yeni iş kartı oluşturuldu | Kartın sevkiyat_week’i için EKSİ artar |
İş kartının sevkiyat_week’i değişti | EKSİ eski haftadan yeni haftaya taşınır |
| İş kartı iptal edildi | EKSİ kaybolur (CANCELLED sorgudan hariç) |
| Yeni malzeme siparişi oluşturuldu | expected_date haftasında ARTI görünür |
| Malzeme siparişinin beklenen tarihi değişti | ARTI eski haftadan yeni haftaya taşınır |
| Malzeme sipariş miktarı değişti | O haftanın ARTI miktarı değişir |
| Malzeme siparişi teslim edildi | ARTI, expected_date/quantity’den delivered_date/delivered_quantity’ye geçer — hafta ve miktar ikisi de kayabilir |
| Malzeme siparişi iptal edildi | ARTI tamamen kaybolur |
| Üretim fiziksel olarak tamamlandı | Etkisi yok — tamamlanmış iş kartları hâlâ dahil edilir |
6.1.14 — Yetki Modeli
Projeksiyon, access.ts’den canStok route guard’ını kullanır. Yetki manifest’i 4 buton tanımlar: access_page, view_projections, create_projection, edit_projection. Ancak Projeksiyon tamamen salt okunur olduğundan (CRUD işlemi yok), oluşturma ve düzenleme yetkileri artıktır. Etkin erişim kontrolü basitçe kullanıcının Stok sayfalarına erişip erişemeyeceğidir.
6.1.15 — Bu Alt Modülün Yapmadıkları
- Herhangi bir veri depolamaz — ayrı bir veritabanı tablosu yoktur
- CRUD desteklemez — projeksiyon hesaplanır, düzenlenmez
- WebSocket kullanmaz — veri sayfa yüklendiğinde veya navigasyonda bir kez çekilir
- Sonuçları önbelleklemez — her istek sıfırdan hesaplar
- Mevcut fiziksel stoku hesaba katmaz — yalnızca planlanan tüketim ve planlanan/gerçek varışları izler
- Uyarı göndermez — açık tespiti yalnızca görseldir
- Kangal (makarasız kablo paketleme) izlemez — kangal izlenmeyen plastik ambalaj kullanır
Tasarım felsefesi: Projeksiyon kasıtlı olarak kendi durumunu depolamaktan kaçınır. Her şeyi iş kartları ve malzeme siparişlerinden anlık olarak hesaplayarak, projeksiyonun her zaman planın mutlak en güncel halini yansıtmasını garanti eder. Senkronizasyon sorunu yok, bayat önbellek yok, “son güncelleme 2 saat önce” uyarısı yok. Bedel istek başına hesaplamadır, ancak veri ölçeği (milyonlarca değil yüzlerce kayıt) bunu iyi bir ödünleşim yapar.
6.2 — Hammadde Stok
6.2.1 — Amaç ve İş Bağlamı
Hammadde Stok, “Depoda şu an fiziksel olarak hangi hammaddeler var ve her birinden ne kadar hâlâ kullanılabilir?” sorusunu yanıtlar.
Bu sayfa belirli bir iş ihtiyacı nedeniyle var: Hammadde modülünde zaten Hammaddeler Listesi var — her bireysel malzeme kaydını fotoğraflar, WebSocket gerçek zamanlı güncellemeler, iki dilli arama ve ayrıntılı düzenleme formlarıyla gösteren düz, 14 sütunlu bir yönetici tablosu. Ama Hammaddeler Listesi bir kayıt düzeyinde görünümdür. Bir stok yöneticisi “ne kadar HFX 500P plastik var?” sorusunu yanıtlamak için 500 bireysel QR kodlu girişi kaydırmak istemez. Malzemeleri türe ve ada göre gruplayan, toplamları gösteren ve neyin serbest neyin kullanımda olduğunu vurgulayan toplu kategori düzeyinde bir görünüme ihtiyaç duyar.
Bu sayfayı dolduran veriler iki yukarı akış sürecinden gelir:
- Hammadde Girişi kayıtları oluşturur — fabrikaya hammadde geldiğinde bir operatör dört giriş arketipinden biriyle (bakır, kalay, lot bazlı, sayım bazlı) tarar ve
materialstablosunastatus = 'received'veremaining_weight = weightile girer. - Üretim (Production) kayıtları tüketir — Üretim modülleri (özellikle Kabatel Çekme / tel çekme) bir hammadde kullandığında QR koduna göre seçer ve
remaining_weight’ten düşer. Tel çekiminden geçen 1.000 kg’lık bir bakır filamaşin (A1) 980 kg olarak döner. Üretim ayrıcastatus’u değiştirir:received→in_use(malzeme şu an makinede) →consumed(tamamen tükenmiş). “Kalan” sütununun ve koşullu renklendirmenin (sarı/kırmızı) tam olarak göstermeye tasarlandığı şey budur.
Yani Hammadde Stok kesişim noktasında durur: Hammadde Girişi doldurur, Üretim boşaltır ve bu sayfa mevcut bakiyeyi görselleştirir. Doğrudan materials tablosundan (Hammadde modülüne ait) paylaşılan /api/materials/list endpoint’i aracılığıyla okur — kendine ait backend route’u yoktur. Tüm gruplama ve toplama istemci tarafında gerçekleşir.
Sayfa, src/pages/Stok/HammaddeStok/index.tsx dosyasında tek bir React bileşeni (HammaddeStok, 676 satır) olarak uygulanmıştır. Ant Design’ın Collapse bileşenini iç içe Table’larla kullanır, Türkçe yerel ayarıyla (trTR) ConfigProvider içine sarılmıştır.
6.2.2 — CRUD Akışı
Okuma (Birincil İşlem):
- Sayfa yüklenir →
useEffect([], [])mount’tafetchMaterials()’i tetikler - Tek bir
GET /api/materials/listçağrısı türden bağımsız olarak TÜM hammaddeleri düz bir dizi olarak çeker - Yanıt
processAndGroupMaterials()’dan geçer:material_type’a göre 8 kovaya filtreler, her kova içindematerial_name’e göre gruplar, toplam değerleri hesaplar (toplam, rezerve, serbest), her şeyisectionDatastate nesnesinde depolar - Kullanıcı o kategorinin gruplanmış tablosunu görmek için bir Collapse paneline tıklar
- Kullanıcı QR kodları, ağırlıklar, tedarikçi, tarihler ve durumla bireysel lotları görmek için bir grup satırındaki genişletme okuna tıklar
- Kullanıcı istediği zaman tüm verileri yeniden çekmek için sayfa başlığındaki “Yenile” butonuna tıklayabilir
Güncelleme (Düzenleme Modalı):
- Herhangi bir bireysel öğe satırındaki (Seviye 3)
EditOutlinedikonuna tıklayın - Modal “Düzenle: {QR_CODE}” başlığıyla açılır (örn. “Düzenle: A7”)
- Form, seçilen öğenin mevcut değerlerinden
form.setFieldsValue()ile önceden doldurulur - İki alan mevcut (tam detaylar için 6.2.11’e bakınız):
remaining_weight—InputNumber, min=0, step=0.1. Palet/makara türleri için gizlistatus— 5 seçenekliSelectaçılır listesi
- Gönderimde:
PUT /api/materials/update/{id}form değerleriyle - Başarıda:
message.success('Güncellendi')→ modal kapanır → form sıfırlanır →fetchMaterials()tüm veriyi yeniden çeker - Hatada:
message.error('Güncellenemedi')
Silme (Onaylı Kalıcı Silme):
- Herhangi bir bireysel öğe satırındaki
DeleteOutlinedikonuna (color: '#ff4d4f'stilinde) tıklayın Modal.confirm()açılır: başlık “Silme Onayı”, içerik “{QR_CODE} kodlu malzemeyi silmek istediğinize emin misiniz?”, kırmızı “Sil” butonu ve “İptal” butonu- Onayda:
DELETE /api/materials/{id}/hard-delete— bu kalıcı, geri dönüşü olmayan bir silmedir. Malzeme kaydı ve tüm ilişkilimaterial_photoskayıtları veritabanından kaldırılır - Başarıda:
message.success('Silindi')→fetchMaterials()yeniden çeker - Hatada:
message.error('Silinemedi')
Oluşturma: Bu sayfada mevcut değil. Malzeme oluşturma yalnızca Hammadde modülündeki Hammadde Girişi sayfasından yapılır. Bu sayfa yalnızca okuma, güncelleme ve silme işlemleri sunar.
6.2.3 — Veri Kaynağı ve API
Hammadde Stok, tamamı Hammadde modülüne (material_routes.py) ait olan üç API endpoint’i tüketir, Stok modülüne değil:
| Metot | Yol | Ne Döndürür |
|---|---|---|
GET | /api/materials/list | Düz bir JSON dizisi olarak TÜM hammaddeler. Her nesne: id, qr_code, material_type, material_name, supplier_name, lot_number, weight (girişte orijinal ölçülen ağırlık), remaining_weight (üretim tüketiminden sonra mevcut ağırlık), form_weight (tedarikçinin beyan ettiği ağırlık), quantity (lot bazlı malzemeler için etiket sayısı), received_date (ISO tarihsaat), status (string: received/available/in_use/consumed/rejected) içerir |
PUT | /api/materials/update/{id} | Tek bir malzeme kaydında remaining_weight ve/veya status günceller. Düzenleme modalından çağrılır. |
DELETE | /api/materials/{id}/hard-delete | Malzemeyi ve ilişkili fotoğraflarını veritabanından kalıcı olarak kaldırır. Silme onay modalından çağrılır. |
API yanıtı düz bir dizidir — sunucu tarafı gruplama, filtreleme veya sayfalama yoktur. Frontend türden bağımsız olarak her malzemeyi alır ve tüm gruplama mantığını istemci tarafında yönetir. Bu, ham malzeme envanterinin tamamının tek bir istekte yüklendiği anlamına gelir.
6.2.4 — State Yönetimi Mimarisi
Bileşen 5 adet state yönetir:
allMaterials(RawMaterial[]) — ham API yanıtı, olası yeniden işleme için saklanırloading(boolean) —fetchMaterials()çağrısı sırasında true, “Yenile” buton spinner’ını ve her panel içindeki yükleme göstergesini yönetirsectionData(Record<string, SectionData>) — malzeme türüne göre anahtarlanmış çekirdek veri yapısı. Her giriş:groups(MaterialGroupSummarydizisi),loading,expandedKeys(hangi grup satırlarının genişletildiği), vetotalItems(bu kategorideki bireysel malzeme sayısı) tutar. Tüm 8 kategori anahtarı ve boş varsayılanlarla başlatılır.activePanels(string[]) — hangi Collapse panellerinin açık olduğu.Collapse’aactiveKeyaracılığıyla aktarılır.editModalVisible+editingItem— düzenleme modalı görünürlüğünü ve hangi malzemenin düzenlendiğini kontrol eder
SectionData yapısı, veri yeniden çekmelerinde expandedKeys’i korur. Kullanıcı bir malzemeyi düzenler veya silerse ve sayfa yeniden çekerse, processAndGroupMaterials() fonksiyonu önceki expandedKeys’i sectionData[cat.key]?.expandedKeys || [] aracılığıyla okur ve yeni state’e taşır. Bu, açık grup satırlarının bir güncellemeden sonra açık kalması anlamına gelir — kullanıcı kaydırma konumunu veya genişletilmiş durumunu kaybetmez.
6.2.5 — 8 Malzeme Kategorisi Paneli
Sayfa, her malzeme kategorisi için bir tane olmak üzere 8 panelli bir Ant Design Collapse bileşeni renderlar. Kategoriler, her biri key, label (Türkçe ad), icon (Ant Design ikon bileşeni) ve color içeren sabit bir MATERIAL_CATEGORIES dizisinde tanımlanmıştır. Kategoriler Hammadde Girişi sayfasının kart renkleriyle birebir eşleşir:
| Kategori | Anahtar | İkon | Renk | Birim | QR Ön Eki |
|---|---|---|---|---|---|
| Bakır | raw_copper | MenuOutlined | #cd7f32 (bronz) | kg | A |
| Kalay | raw_tin | GoldOutlined | #c0c0c0 (gümüş) | kg | B |
| Plastik | raw_plastic | DockerOutlined | #3498db (mavi) | kg | C |
| Katalizör | raw_catalyst | ExperimentOutlined | #9b59b6 (mor) | kg | D |
| Boya | raw_dye | BgColorsOutlined | #e74c3c (kırmızı) | kg | E |
| Antirodent | raw_antirodent | BugOutlined | #27ae60 (yeşil) | kg | F |
| Palet | raw_palette | BorderInnerOutlined | #f39c12 (turuncu) | adet | I |
| Makara | raw_reel | PicCenterOutlined | #1abc9c (deniz mavisi) | adet | H |
Kategoriler ve görsel kimlikleri Hammadde Girişi ile paylaşılır — kullanıcı tutarlılık için her iki modülde de aynı renkleri ve ikonları görür.
6.2.6 — Panel Başlığı: Satır İçi İstatistik Panosu
Her panel başlığı sadece bir etiket değildir — daraltılmış haldeyken bile görünen bir mini panodur. Soldan sağa şunları gösterir: renk kodlu kategori ikonu, kategori adı, kayıt sayısı etiketi (örn. “47 kayıt”) ve sağa itilmiş üç toplam istatistik:
- Toplam: kg bazlı malzemeler için
remaining_weighttoplamı (remaining null iseweight’e döner), palet/makara içinweight(sayı) toplamı. Türkçe yerel biçimlendirme (örn. “12.456,3 kg”). - Kullanımda: Mavi etiket.
status === 'in_use'olan öğelerden toplam — şu an bir üretim makinesinde olan malzemeler. - Serbest: Yeşil etiket.
status === 'received'veya'available'olan öğelerden toplam — Üretim’in tüketmeye hazır malzemeler.
getCategoryTotals() fonksiyonu bunları tüm gruplar üzerinde iterasyon yaparak ve total_quantity, reserved_quantity, available_quantity toplayarak hesaplar. Birim palet/makara için “adet”, diğer her şey için “kg”dir.
6.2.7 — Üç Seviyeli Tablo Hiyerarşisi
Sayfa, kullanıcıların üst düzey kategori toplamlarından bireysel lot detaylarına inmesini sağlayan üç seviyeli bir detay görünümü uygular:
Seviye 1 — Kategori Paneli (Collapse): 8 Collapse panelinin kendileri. Her panel başlığı kategori adı + ikon + toplam istatistikleri gösterir. Bir paneli açmak Seviye 2 tablosunu açar. Birden fazla panel aynı anda açık olabilir — activePanels state’i bir anahtar dizisidir.
Seviye 2 — Malzeme Adı Grup Tablosu: Her panel içinde malzemeler material_name’e göre gruplanır. Örneğin, “Plastik” altında şu grupları görürsünüz: “HFX 500P”, “HFFR 302”, “XLPE 2003”, “PVC 70”. Her grup satırı gösterir: Malzeme Adı (kalın ad + lot sayısı, örn. “HFX 500P (12 lot)”), Toplam (toplam ağırlık/miktar), Kullanımda (mavi etiket, kullanımdaki toplam), Serbest (yeşil etiket, mevcut toplam). Bir malzemenin adı yoksa “{Kategori} (İsimsiz)” grubuna düşer.
Seviye 3 — Bireysel Lotlar (Genişletilmiş Satır): Bir grup satırını genişletmek bireysel malzeme girişlerini açar. Detay tablosu 7–8 sütun gösterir:
| Sütun | Davranış |
|---|---|
| QR Kod | Deterministik QR kodu gösteren mavi etiket (A1, B3, C12, vb.). Sola sabitlenmiş. |
| Ölçülen / Miktar | Girişte orijinal ağırlık. Başlık uyarlanır: kg türleri için “Ölçülen”, palet/makara için “Miktar”. |
| Kalan | Üretim tüketiminden sonra mevcut kalan ağırlık. Palet/makara için yok. remaining_weight ?? weight yedeği kullanır. Renk kodlu (bkz. 6.2.8). |
| Durum | Renk kodlu etiket: yeşil=Teslim Alındı (received), mavi=Mevcut (available), turuncu=Kullanımda (Üretim tarafından in_use), gri=Tükendi (consumed), kırmızı=Reddedildi (Lab tarafından rejected) |
| Tedarikçi | Tedarikçi Yönetimi’nden tedarikçi adı, yoksa “-” |
| Lot No | Hammadde Girişi’nden lot/parti numarası, yoksa “-” |
| Giriş Tarihi | Giriş tarihi, UTC’den Europe/Istanbul zaman dilimine dönüştürülmüş. GG.AA.YY formatında. |
| İşlem | Düzenle ve Sil butonları. Sağa sabitlenmiş. |
6.2.8 — Koşullu Ağırlık Renklendirmesi
“Kalan” sütunu bu sayfadaki operasyonel açıdan en önemli görsel özelliklerden biridir. Malzeme tüketim seviyeleri hakkında anında görsel geri bildirim sağlamak için koşullu renklendirme kullanır. Mantık her satır için iki boolean bayrak hesaplar:
isReduced = currentWeight < originalWeight * 0.95— malzeme kısmen tüketilmiş (%5’ten fazlası kullanılmış)isLow = currentWeight < originalWeight * 0.2— malzeme kritik düşük (kalan %20’den az)
Renderlama kuralları:
- Normal (renksiz, normal ağırlık):
remaining_weight ≥ %95orijinal — malzeme neredeyse dokunulmamış veya yeni girilmiş - Sarı (#faad14) + kalın (fontWeight: 600):
remaining_weight < %95ama ≥ %20 orijinal — kısmen tüketilmiş, dikkat çeker - Kırmızı (#ff4d4f) + kalın (fontWeight: 600):
remaining_weight < %20orijinal — kritik düşük, yeniden sipariş gerekebilir
Somut örnek: 1.000 kg’lık bir bakır filamaşin (QR: A1) 950 kg’ın altına düşene kadar normal metin gösterir. 949 kg’da sarıya döner. 199 kg’da kırmızıya döner. currentWeight, remaining_weight’i olmayan eski kayıtlarla geriye uyumluluk için remaining_weight ?? weight ?? 0 olarak hesaplanır.
Palet ve makara malzemeleri için bu sütun tablodan tamamen yoktur — gizlenmez, sütun dizisinden koşullu olarak çıkarılır: ...(!isPaletteOrReel ? [{ ... }] : []). Sayılan öğelerin kalan ağırlık kavramı yoktur — ya bütün birimler olarak mevcuttur ya da tüketilmiştir.
6.2.9 — Birim Uyarlaması: kg vs adet
Sayfa, bir malzemenin ağırlıkla mı yoksa ayrık parça olarak mı sayıldığına göre davranışını dinamik olarak uyarlar. Bu ayrım UI’da beş farklı yeri etkiler:
- Panel başlık istatistikleri: Toplam sayılardan sonra “kg” veya “adet” gösterir
- Grup tablosu sütunları: Toplam, Kullanımda, Serbest değerlerinde birim soneki
- Detay tablosu sütun başlığı: kg türleri için “Ölçülen”, adet türleri için “Miktar”
- Detay tablosu “Kalan” sütunu: Palet/makara için tamamen gizli
- Düzenleme modalı: “Kalan Ağırlık (kg)” alanı palet/makara türleri için gizli
Belirleme materialType === 'raw_palette' || materialType === 'raw_reel' kontrolüyle yapılır. Bunlar yalnızca iki sayım bazlı kategoridir — diğer altısının tamamı kg kullanır. Gruplama mantığındaki miktar hesaplamaları için palet/makara malzemeleri item.weight’ten (sayıyı depolar) okurken, kg bazlı malzemeler item.remaining_weight ?? item.weight’ten okur.
6.2.10 — İstemci Tarafı Gruplama Mantığı
processAndGroupMaterials() fonksiyonu çekirdek veri dönüşüm motorudur. Düz API yanıtını alır ve hiyerarşik sectionData yapısını üretir. Fonksiyon dört aşamada çalışır:
- Kategori filtresi: 8 kategorinin her biri için
materials.filter(m => m.material_type === cat.key)filtrele - Ad gruplama: Her kategori içinde
material_name’e göre anahtarlanmış birRecord<string, RawMaterial[]>oluştur.material_namenull/boşsa anahtar “{label} (İsimsiz)” olur (örn. “Bakır (İsimsiz)”) - Grup toplamları: Her grup için bir
MaterialGroupSummarynesnesi oluştur:total_quantity: kg türleri içinremaining_weight ?? weight ?? 0toplamı, veya adet türleri içinweight ?? 0toplamı, durumdan bağımsız TÜM öğeler üzerindenreserved_quantity:status === 'in_use'olan öğelerden toplamavailable_quantity:status === 'received' || status === 'available'olan öğelerden toplam- Diğer durumlardaki öğeler (
consumed,rejected)total_quantity’de sayılır ama reserved veya available’da sayılmaz — tüketilmiş veya atılmış stoğu temsil eder
- State koruma: Mevcut
sectionData’dan öncekiexpandedKeys’i taşı, böylece açık grup satırları veri yenilemesinden sonra açık kalır
6.2.11 — Düzenleme Modalı
Düzenleme modalı kasıtlı olarak minimaldir — Hammaddeler Listesi’nin üç varyantının (bakır/kalay, lot bazlı, palet/makara) aksine tek varyantlıdır. Yalnızca iki alan sunar:
- Kalan Ağırlık: Malzemenin mevcut
remaining_weightdeğeriyle önceden doldurulmuş sayısal giriş. Bu, Üretim malzeme tükettiğinde etkilenen alandır ve bu modal bir stok yöneticisinin sistem değeri fiziksel gerçeklikten saptığında manuel olarak düzeltmesine izin verir. Palet/makara için gizlidir çünkü bunlar bütün birimlerdir. - Durum: 5 seçenekli açılır liste: Teslim Alındı (received), Mevcut (available), Kullanımda (in_use), Tükendi (consumed), Reddedildi (rejected). Bu bir yöneticinin yaşam döngüsü durumunu manuel olarak geçersiz kılmasına izin verir — örn. hasarlı bir malzemeyi reddedildi olarak işaretleme veya Üretim’in güncellemeyi başaramadığı bir durumu düzeltme.
Hammaddeler Listesi’nin aksine, bu modal QR kodlarını, lot numaralarını, tedarikçi adlarını veya fotoğrafları düzenlemeye izin vermez. Bunlar Hammadde modülünün tam düzenleme akışına aittir. Bu modal yalnızca stok düzeyinde düzeltmeler içindir: “gerçekte ne kadar kaldı?” ve “gerçek durumu ne?”
6.2.12 — Yükleme ve Boş Durumlar
Sayfa iki boş veri senaryosunu yönetir:
- Yükleme durumu: Veri çekilirken her panel “Yükleniyor...” ile bir spinner gösterir. Sayfa başlığındaki “Yenile” butonu da yükleme durumu gösterir.
- Boş kategori: Bir kategoride malzeme yoksa (örn. stokta şu an antirodent yok) panel “Bu kategoride stok bulunamadı” mesajını gösterir.
6.2.13 — Zaman Dilimi İşleme
API’deki tüm tarihler veritabanında UTC olarak depolanır. Frontend bunları dayjs’in utc ve timezone eklentileriyle Türkiye zaman dilimine dönüştürür:
- Zaman dilimi sabiti modül seviyesinde tanımlanır:
const TURKEY_TZ = 'Europe/Istanbul' - Tarih renderlama:
dayjs.utc(date).tz(TURKEY_TZ).format('DD.MM.YY') - Bu, 15 Ocak UTC 23:30’da girilen bir malzemenin Türkçe gösterimde 16 Ocak olarak gösterilmesini sağlar (UTC+3), giriş tarihinin yerel tarihini doğru yansıtır
6.2.14 — Diğer Modüllerle Bağlantı
Hammadde Stok izole bir şekilde var olmaz — esasen diğer modüller tarafından oluşturulan, değiştirilen ve tüketilen verilere salt okunur bir penceredir. Bu bağlantıları anlamak bu sayfayı anlamanın anahtarıdır:
Yukarı Akış: Envanteri kim doldurur?
- Hammadde Girişi — tek oluşturucu. Bu sayfada görünen her satır Hammadde Girişi’ndeki dört giriş arketipinden biri aracılığıyla oluşturulmuştur. Bakır filamaşin geldiğinde operatör tartar, fotoğraf çeker, QR kodu A{n} atar ve
materialstablosunastatus = 'received'veremaining_weight = weightile girer. O kayıt anında burada “Bakır” paneli altında görünür hale gelir. Hammadde Stok oluşturamaz, yalnızca görüntüleyebilir. - Hammadde Sipariş — malzemelerin gelmesinin asıl sebebi. Bir satın alma siparişi karşılanıp malzemeler teslim edildiğinde, giriş operatörü malzemeyi sipariş grup koduna (R1, R2, vb.) bağlayabilir. Bu izlenebilirlik veride mevcuttur ama bu sayfada gösterilmez — onun yerine Hammaddeler Listesi’nin “Sipariş No” sütununda görünür.
- Tedarikçi Yönetimi — detay satırlarında görünen tedarikçi adlarını tanımlar. Tedarikçi ilişkilendirmesi giriş anında yapılır ve burada salt okunurdur.
Aşağı Akış: Envanteri kim tüketir?
- Üretim / Production (özellikle Kabatel Çekme) — birincil tüketici. Üretim bir iş kartı başlattığında QR koduna göre hammadde seçer. Tel çekme (Kabatel Çekme) için operatör bir bakır filamaşin (örn. A7) alır ve makineye besler. Üretim ardından malzeme kaydını günceller:
status,received/available’danin_use’a değişir ve malzeme tüketildikçeremaining_weightazalır. Filamaşin tamamen kullanıldığındastatus,consumedolur. “Kalan” sütununun sarı/kırmızı renklendirmesiyle var olmasının tüm sebebi budur — Üretim’in ne kadar tükettiğini görselleştirir. Benzer şekilde plastik granüller, kalay, katalizörler ve boyalar kendi üretim adımları (ekstrüzyon, kalaylama, vb.) tarafından tüketilir. - Laboratuvar (dolaylı) — Lab testleri bir malzemenin
rejected(reddedildi) durumuna düşmesine neden olabilir, bu da durumunu değiştirir ve bu sayfadaki “Serbest” sayısından etkin bir şekilde çıkarır.
Aynı veri üzerindeki kardeş görünümler:
- Hammaddeler Listesi (Hammadde modülünde) — tam olarak aynı
/api/materials/listendpoint’inden okur. Tam güçlü yönetici görünümüdür: 14 sütun, tembel yüklenen fotoğraflar, WebSocket gerçek zamanlı senkronizasyon, iki dilli arama, üç düzenleme form varyantı, QR etiket yazdırma, 12 granüler yetki. O sayfa kayıt düzeyinde görünümdür; Hammadde Stok stok düzeyinde görünümdür. Birlikte aynı veri üzerinde farklı kullanıcı ihtiyaçlarını karşılarlar. - Projeksiyon (Stok modülünde) — malzeme verisini kullanır ama tamamen farklı bir amaç için. Projeksiyon mevcut envanter + gelen siparişler − üretim gereksinimleri birleştirerek stoğun gelecek haftalarda ne olacağını hesaplar. Hammadde Stok stoğun şu an ne olduğunu gösterir. Tamamlayıcıdırlar: biri canlı anlık görüntü, diğeri haftalık tahmin.
6.2.15 — Yetki Modeli
Sayfa, sayfa düzeyinde erişim için access.ts’den canStok route guard’ını kullanır. permissionManifest.ts’deki yetki manifestosu bu sayfa için 5 buton tanımlar:
access_page— Hammadde Stok sayfasına erişebilirview_table— kategori tablolarını görebilirview_details— bireysel lotları görmek için grupları genişletebiliredit_stock— düzenleme modalını açabiliradjust_quantity— kalan ağırlık değerlerini değiştirebilir
Ancak, buton düzeyinde izinleri uygulayan Hammaddeler Listesi’nin aksine (örn. print_qr izni olmadan yazdır butonunu devre dışı bırakma), bu sayfa frontend’de buton düzeyinde kontroller uygulamaz. Düzenle ve sil butonları sayfa erişimi olan her kullanıcıya her zaman renderlanır. Yetki uygulaması yalnızca API seviyesinde gerçekleşir.
6.2.16 — Bu Alt Modülün Yapmadıkları
- Kendi backend route’ları yoktur — Hammadde modülünün
material_routes.pyendpoint’lerini tüketir - Malzeme oluşturmayı desteklemez — o yalnızca Hammadde Girişi’nde yapılır
- Gerçek zamanlı güncellemeler için WebSocket kullanmaz — veri mount’ta bir kez çekilir ve düzenleme/silme işlemlerinden sonra manuel olarak yenilenir.
materialsveallWebSocket odalarına abone olan Hammaddeler Listesi ile karşılaştırın - Sunucu tarafı filtreleme veya sayfalama yoktur — 8 yönlü kategori filtreleme, ad bazlı gruplama ve miktar toplamlamasının tamamı istemci tarafındadır
- Malzeme fotoğraflarını göstermez — ne teslimat ne de test fotoğrafları görüntülenir. Bunlar yalnızca Hammaddeler Listesi’nde görünür
- Sipariş bağlantısını göstermez — “Sipariş No” (sipariş grup kodu) sütunu Hammaddeler Listesi’nde var ama burada yok
- Yazdırmayı desteklemez — QR etiket yeniden yazdırma işlevi yok. O Hammaddeler Listesi’nde
- İstemci tarafı arama çubuğu yoktur — gezinme kategori panellerini ve grup satırlarını genişleterek yapılır
- Tüketim geçmişini izlemez — yalnızca mevcut anlık görüntüyü gösterir, ağırlık değişikliklerinin zaman çizelgesini değil
- Yumuşak silme yoktur — silme işlemi
/hard-deletekullanır, kaydı kalıcı olarak kaldırır
Hammadde Stok vs Hammaddeler Listesi — aynı veri, farklı amaç: Her iki sayfa da aynı /api/materials/list endpoint’inden okur ve aynı materials tablosu verisini görüntüler. Fark bakış açısındadır. Hammaddeler Listesi (Hammadde modülünde) tam güçlü yönetici görünümüdür: 14 sütun, tembel fotoğraflar, WebSocket, iki dilli arama, üç düzenleme form varyantı, yazdırma, 12 granüler yetki. Hammadde Stok (Stok modülünde) stok yöneticisinin görünümüdür: kategoriye ve malzeme adına göre gruplanmış, toplam değerler ön planda, “bu lotun tam geçmişi ne?” yerine “ne kadarımız var?” sorusunu yanıtlamak için optimize edilmiş. Buradaki düzenleme modalı kasıtlı olarak minimaldir (yalnızca ağırlık + durum) çünkü tam düzenleme Hammadde modülüne aittir.
6.3 — Ürün Stok (Ürün Stoğu)
Üretim adımına göre düzenlenmiş yarı mamul ve mamul ürünlerin canlı envanteri — fabrika üretim hattının çıktı tarafı.
6.3.1 — Amaç ve İş Bağlamı
Ürün Stok şu soruyu yanıtlar: "Fabrika ne üretti ve şu an nerede?"
Hammadde Stok tüketilmeyi bekleyen ham girdileri takip ederken, Ürün Stok çıktıları takip eder: bir üretim makinesinden çıkan her sepet ve makara. Bu sayfadaki her kayıt fiziksel olarak bir Üretim Oturumu sırasında oluşturulmuştur — bir operatör makineyi çalıştırmış, çıktı sepetlerini kaydetmiş, QR etiketleri basmış ve bu sepetler buraya düşmüştür. Sayfanın var olma nedenleri:
- Üretim Listesi bu kayıtları oluşturur — bir üretim oturumu çıktı sepetlerini kaydettiğinde, her sepet aynı anda hem
production_outputshem dehalf_product_stocktablolarına yazılır. Bu sayfa, biriken envanterin salt okunur penceresidir. - Üretim Geçmişi aynı kayıtları oturum merkezli bir perspektiften gösterir (hangi oturum ne üretti). Ürün Stok ise bunları stok merkezli bir perspektiften gösterir (hangi oturum ürettiğinden bağımsız olarak, her ürün kodundan şu an ne kadar mevcut).
- Sipariş Modülü tahsisi belirler — bir sipariş için iş kartı açıldığında, siparişin gerektirdiği miktarın altında üretilen sepetler
ORDERolarak işaretlenir. Fazla üretimSTOCK(serbest envanter) olur. Bu tahsis ayrımı, her grup satırında görünen temel bir iş kavramıdır. - Laboratuvar Modülü (Test Yönetimi) kalite testlerini belirli üretim çıktılarına bağlar. Ürün Stok, stok yöneticilerinin bağlı test sonuçlarını doğrudan her kayıttan görüntülemesine olanak tanır — satırdaki test ikonu, Lab sisteminden alınan test aralığı, adı, standart numarası ve geçti/kaldı durumunu gösteren bir modal açar.
- Kaynak QR İzlenebilirlik — her kayıt, üretiminde tüketilen girdi QR kodlarının JSON dizisini
source_qr_codesalanında saklar. Bu zincir (A1 bakır → X1 kabatel → Y1 kalaylama → ...) fabrikanın izlenebilirlik omurgasıdır.
6.3.2 — CRUD Akışı
Oluşturma (Create): Bu sayfa kayıt oluşturmaz. Yarı mamul stok kayıtları yalnızca Üretim modülü tarafından aktif üretim oturumları sırasında oluşturulur. Bir operatör sepet çıktısı kaydettiğinde, backend aynı anda hem production_outputs hem de half_product_stock tablolarına yazar. Bu sayfada "Ekle" butonu yoktur.
Okuma (Read): Sayfa yüklendiğinde bileşen 7 paralel API isteği atar — her üretim adımı için bir tane (Kabatel, Kalaylama, İncetel, Buncher, Extruder, E-Beam, Aktarma). Her istek GET /api/stock/half-products/by-step/{step}?status_filter=available endpoint'ine gider. Backend, half_product_stock tablosunu production_step ve status'a göre filtreler, operatör adını almak için production_sessions ile birleştirir ve en yeniden eskiye sıralı sonuçlar döner. Frontend daha sonra product_code'a göre gruplar, grup başına toplamları hesaplar ve Collapse panel hiyerarşisini oluşturur.
Güncelleme (Update): Kayıt başına modal ile düzenleme. Düzenle ikonuna tıklamak üç alanlı bir form açar: remaining_weight_kg (zorunlu, min=0, adım=0.1 InputNumber), allocation (Select: ORDER veya STOCK), ve notes (TextArea). PUT /api/stock/half-products/{id} ile gönderilir. Backend yalnızca remaining_weight_kg, status ve notes alanlarını güncellemeye izin verir (not: allocation frontend'den gönderilir ama backend'in allowed_fields listesinde yoktur — potansiyel tutarsızlık). Başarı sonrası tam veri yenileme.
Silme (Delete): QR kodu görüntülenen onay modalı. DELETE /api/stock/half-products/{id} çağırır. Backend kademeli silme gerçekleştirir: (1) production_output_id veya yedek output_code eşleşmesi ile bağlı ProductionOutput kaydını bulur ve siler, (2) silinen kaydın QR numarasının prefix dizisindeki en yüksek numara olup olmadığını kontrol eder (örn. X150 en yüksek X-prefix ise) — öyleyse yeniden kullanıma izin vermek için HalfProductSequence.last_number'ı azaltır, (3) stok kaydını siler. Bu kademe, stoktan silmenin yetim üretim çıktı kayıtları veya bozuk QR dizileri bırakmamasını sağlar.
6.3.3 — Veri Kaynağı ve API Mimarisi
Hammadde modülünden tek bir endpoint ödünç alan Hammadde Stok'un aksine, Ürün Stok'un api/stock/half_product_routes.py dosyasında 6 endpoint'li kendi özel backend'i vardır:
| Endpoint | Metod | Amaç | Frontend kullanıyor mu? |
|---|---|---|---|
/api/stock/half-products/by-step/{step} | GET | Birincil veri: bir adımdaki tüm kayıtlar, operatör adı ile. ProductionSession birleştirmesi. | Evet (yüklemede 7 paralel çağrı) |
/api/stock/half-products/{id} | PUT | Ağırlık, durum, notları güncelle | Evet (düzenleme modalı) |
/api/stock/half-products/{id} | DELETE | Kademeli silme: stok + üretim çıktısı + dizi sıfırlama | Evet (silme onayı) |
/api/stock/half-products | GET | Sayfalı genel listeleme, opsiyonel adım/durum filtresi | Hayır (diğer tüketiciler için mevcut) |
/api/stock/half-products/summary | GET | Adım başına sayı ve ağırlıklar (mevcut/toplam) | Hayır |
/api/stock/half-products/{qr_code} | GET | QR koda göre arama | Hayır |
Ayrıca bağlı testler özelliği, Üretim modülünün test_integration_routes.py dosyasından GET /api/production/test-requests/bonded-tests/output/{output_id} endpoint'ini çağırır. Bu çapraz modül çağrısı, belirli bir üretim çıktısına bağlı Lab testlerini test aralığına göre gruplandırarak (üretim_başı, her_sepet_sonu, üretim_sonu) getirir.
6.3.4 — Veritabanı Şeması: half_product_stock Tablosu
Bu alt modülün özel tablosudur — Hammadde modülünün materials tablosundan okuyan Hammadde Stok'un aksine, Ürün Stok'un models/half_product_stock.py tarafından yönetilen kendi tablosu vardır.
| Sütun | Tip | İş Anlamı |
|---|---|---|
qr_code | String(50), benzersiz | Deterministik QR: X=Kabatel, Y=Kalaylama, Z=İncetel, T=Buncher, U=Extruder, G=E-Beam. Prefix başına global sıralı. |
product_code | String(100) | Teknik ürün tanımlayıcı (örn. KC_18, KL_18). Frontend'de gruplama anahtarı. |
production_step | String(50) | Hangi makine adımı üretti: kabatel_cekme, kalaylama, incetel, buncher, extruder, ebeam, aktarma. |
initial_weight_kg | Float | Sepetin makineden çıktığı andaki ağırlık. Asla değişmez. |
remaining_weight_kg | Float | Alt akış tüketimi sonrası güncel ağırlık. Sonraki üretim adımı bu sepeti tükettiğinde azalır. |
basket_number | Integer | Üretim oturumu içindeki sıralı sepet numarası. |
allocation | String(20) | ORDER = müşteri siparişini karşılamak için üretildi. STOCK = fazla üretim, serbest envanter. |
order_id | FK → orders.id | Bu sepetin tahsis edildiği müşteri siparişi (STOCK ise null). |
status | String(50) | available → in_use → consumed. Ayrıca reserved, shipped, defective. |
production_output_id | FK → production_outputs.id | Üretim çıktı kaydına bağlantı. Bağlı test sorgusu ve kademeli silme için kullanılır. |
session_id | FK → production_sessions.id | Bu sepeti hangi üretim oturumu oluşturdu. Operatör adını çekmek için kullanılır. |
work_card_id | FK → work_cards.id | Bu üretimi yönlendiren iş kartı (Sipariş modülünden). |
source_qr_codes | Text (JSON) | Bu ürünü üretmek için tüketilen girdi QR kodlarının JSON dizisi. Örn. Kabatel sepeti için ["A1","A3"] bakır lotları. İzlenebilirlik zinciri. |
produced_at | DateTime | Sepetin üretildiği zaman. UTC olarak saklanır, Europe/Istanbul olarak gösterilir. |
consumed_at | DateTime, nullable | Bu sepetin sonraki üretim adımı tarafından tamamen tüketildiği zaman. |
ORM'deki temel ilişkiler: order (Order), production_output (ProductionOutput), session (ProductionSession), work_card (WorkCardDB). (production_step, status) ve (product_code, status) üzerindeki bileşik indeksler birincil sorgu kalıbını optimize eder.
Eşlik eden HalfProductSequence modeli (half_product_sequences tablosu) her prefix için kullanılan son numarayı takip eder: {'X': 150}, X150'nin son Kabatel çıktısı olduğu anlamına gelir. Prefix-makine eşlemesi: kabatel_cekme → X, kalaylama → Y, incetel → Z, buncher → T, extruder → U, ebeam → G.
6.3.5 — Durum Yönetimi Mimarisi
Bileşen 8 durum değişkeni kullanır:
loading(boolean) — 7 adımın paralel getirimi sırasındaki global yükleme bayrağısectionData(Record<string, SectionData>) — ana veri deposu. 7 üretim adımı anahtarıyla başlatılır, her biri şunları içerir:groups(ProductGroupSummary[]),loading,expandedKeys,totalItemsvegrandTotals(toplam/sipariş/serbest). Sayfanın kalbi budur.activePanels(string[]) — şu an açık olan Collapse panellerieditModalVisible+editingItem— düzenleme modalı durumutestsModalVisible+testsLoading+selectedTests+selectedOutputCode— bağlı testler modalı durumu
Veri akışı: fetchAllData(), Promise.all() ile 7 paralel request() çağrısı atar. Her yanıt client tarafında product_code'a göre gruplandırılır, grup başına tahsis ayrımı (ORDER kg vs STOCK kg) ve adım başına genel toplamlar hesaplanır. Gruplandırılmış sonuçlar tüm sectionData durumunu değiştirir, önceki durumdan expandedKeys'i koruyarak satır açılımlarının yenileme sırasında kaybolmamasını sağlar.
6.3.6 — 7 Üretim Adımı Paneli
Sayfa, her üretim adımı için bir panel olmak üzere 7 panelli bir Ant Design Collapse bileşeni kullanır. Hammadde Stok'un 8 malzeme kategorisinin (statik isimler: "Bakır", "PVC") aksine, bu paneller kablo üretim hattını takip eder:
| Anahtar | Etiket | QR Prefix | Ne üretir |
|---|---|---|---|
kabatel_cekme | Kabatel | X (X1, X2...) | Ham bakırdan çekilen 1.8mm tel |
kalaylama | Kalaylama | Y | Kalaylanmış tel |
incetel | İncetel | Z | İnce tel (daha küçük çap) |
buncher | Buncher | T | Demet halinde tel telleri |
extruder | Extruder | U | Yalıtılmış kablo |
ebeam | E-Beam | G | Elektron ışını ile çapraz bağlanmış kablo |
aktarma | Aktarma | AK | Malzeme aktarma / yeniden sarım |
Her panelin kendine özgü ikonu ve rengi vardır. İkon seti Ant Design ikonları kullanır: ScissorOutlined (Kabatel), FireOutlined (Kalaylama), CompressOutlined (İncetel), ApartmentOutlined (Buncher), BuildOutlined (Extruder), ThunderboltOutlined (E-Beam), SwapOutlined (Aktarma).
6.3.7 — Panel Başlığı: Üç Sütunlu İstatistik
Her panel başlığı, tahsis ayrımını gösteren sağa hizalı üç istatistik sütunu görüntüler:
- Toplam — bu üretim adımındaki tüm mevcut kayıtların toplam kg'ı
- Sipariş — müşteri siparişlerine tahsis edilmiş toplam kg (yeşil etiket)
- Serbest — fazla üretim / serbest stok toplam kg'ı (turuncu etiket)
Kayıt sayısı da adım etiketinin yanında bir tag olarak gösterilir. Bir adımda veri olmadığında, istatistik sütunları düşük opaklıkta görünür kalarak tüm panellerde düzen tutarlılığını korur.
6.3.8 — İki Seviyeli Tablo Hiyerarşisi
Her panel içinde veriler iki seviyeli bir hiyerarşide görüntülenir (Hammadde Stok'un üç seviyesine kıyasla):
Seviye 1 — Grup Satırı (product_code'a göre): Her satır, bu üretim adımındaki belirli bir ürün kodunun tüm sepetlerini temsil eder. Gösterir:
- Ürün Kodu kayıt sayısı ile
- Toplam (Toplam kg) — tüm kalan ağırlıkların toplamı
- Sipariş (Sipariş kg) — ORDER tahsisli kayıtların toplamı (yeşil etiket)
- Serbest (Serbest kg) — STOCK tahsisli kayıtların toplamı (turuncu etiket)
Genişletme ikonuna tıklamak açılır...
Seviye 2 — Bireysel Kayıtlar: Her satır, tam detayıyla tek bir sepet/makaradır. Sütunlar:
| Sütun | Açıklama |
|---|---|
| QR Kod | Deterministik QR kodu (örn. X5, Y12). Mavi etiket. Sabit sol sütun. |
| Ağırlık | Güncel kalan ağırlık kg cinsinden (Türkçe yerel formatlaması). |
| Tahsis | ORDER (yeşil) veya Stok (turuncu) etiketi. |
| Durum | Mevcut (available/yeşil), Tüketildi (consumed/varsayılan), Rezerve (reserved/mavi), Hatalı (defective/kırmızı). |
| İş Kartı | İş kartı ID'si mavi etiket olarak, bu sepeti kaynak sipariş görevine bağlar. |
| Üretim Tarihi | Üretim tarih/saati. UTC → Europe/Istanbul dönüşümü dayjs eklentileriyle. |
| Kaynak | Girdi QR kodları (JSON'dan ayrıştırılır). İlk 2 kodu gösterir + daha fazlası varsa "...". Üst akış malzemelerine izlenebilirlik bağlantısı. |
| Test | production_output_id varsa deney ikonu butonu. Bağlı testler modalını açar. |
| İşlem | Düzenle ve Sil butonları. Sabit sağ sütun. |
6.3.9 — Tahsis Sistemi: ORDER vs STOCK
Ürün Stok'un görüntülediği ancak kontrol etmediği temel bir kavramdır. Tahsis, stok görüntüleme zamanında değil üretim zamanında belirlenir:
- Bir üretim oturumu iş kartına karşı çalıştığında, backend kümülatif üretimi siparişin gerektirdiği miktarla karşılaştırarak takip eder.
- Kümülatif çıktı gerekli miktarın altındayken üretilen her sepet
ORDERolarak işaretlenir veorder_id'ye bağlanır. - Kümülatif çıktı gerekli miktarı aştığında, sonraki sepetler null
order_idileSTOCKolarak işaretlenir.
Ürün Stok bu tahsis ayrımını her seviyede görüntüler: kayıt başına (etiket), grup başına (iki ayrı kg sütunu) ve adım başına (panel başlık istatistikleri). Bu, stok yöneticilerine envanterin ne kadarının siparişlere tahsis edildiğini ve ne kadarının yeni siparişler veya genel kullanım için serbest olduğunu anında gösterir.
6.3.10 — Bağlı Testler Modalı: Lab Bağlantısı
production_output_id'si olan kayıtlar (normal üretim akışıyla oluşturulan neredeyse tüm kayıtlar) satırlarında bir deney ikonu gösterir. Tıklamak /api/production/test-requests/bonded-tests/output/{output_id} endpoint'ini çağıran ve belirli üretim çıktısına bağlı tüm kalite testlerini görüntüleyen bir modal açar.
Yanıt testleri aralığa göre gruplandırır:
- Üretim Başı — oturum başında yapılan testler
- Her Sepet Sonu — sepet başına testler, en ayrıntılı seviye
- Üretim Sonu — oturum sonu doğrulama testleri
Her test satırı gösterir: test ID'si (mor etiket), test adı, standart numarası (varsa), aralık etiketi ve renk kodlu ikon ile durum (geçti için yeşil onay, kaldı için kırmızı X, bekliyor için sarı saat). Veri Lab modülünün test istek sisteminden gelir — bu, Stok ve Kalite Kontrolü arasında köprü kuran bir çapraz modül okumadır.
6.3.11 — Kaynak QR İzlenebilirliği
source_qr_codes alanı, bu ürünü üretmek için tüketilen QR kodlarının JSON dizisini saklar. Frontend bu JSON'u ayrıştırır ve daha fazlası varsa üç nokta ile ilk 2 kodu gösterir. Örneğin:
- Bir Kabatel sepeti X5 kaynak olarak
["A1", "A3"]gösterebilir — tükettiği ham bakır lotları - Bir Kalaylama makarası Y12 kaynak olarak
["X5", "X6"]gösterebilir — tükettiği Kabatel çıktıları
Bu, tam bir malzeme zinciri oluşturur: ham bakır (A-prefix) → kabatel teli (X-prefix) → kalaylanmış tel (Y-prefix) → ince tel (Z-prefix) → demet tel (T-prefix) → yalıtılmış kablo (U-prefix) → çapraz bağlanmış kablo (G-prefix). Her bağlantı source_qr_codes'da saklanır ve herhangi bir sepeti ham madde kaynağına kadar izlenebilir kılar.
6.3.12 — İstemci Tarafı Gruplama Mantığı
7 paralel API yanıtı geldikten sonra fetchAllData() her adımın verisini işler:
- Kayıtlar üzerinde döner,
product_code'a göre (veya "Unknown" yedek değeri) birRecord<string, HalfProductStock[]>haritasına gruplar - Her grup için
remaining_weight_kgtoplayaraktotal_kg,siparis_kg(ORDER tahsisi) veserbest_kg(STOCK tahsisi) hesaplar - Adım başına genel toplamları biriktirir
- Grupları ürün koduna göre alfabetik sıralar
SectionDatanesnesini oluşturur, mevcutexpandedKeys'i koruyarak açılmış satırların veri yenilemesi sırasında kaybolmamasını sağlar
Hammadde Stok'un kategoriye sonra malzeme adına göre gruplayan processAndGroupMaterials() fonksiyonuyla (3 seviye) karşılaştırıldığında, Ürün Stok her adım paneli içinde yalnızca product_code'a göre gruplar (2 seviye), çünkü adım panelinin kendisi üst seviye gruplama görevi görür.
6.3.13 — Düzenleme Modalı
Düzenleme modalı üç alanın değiştirilmesine izin verir: remaining_weight_kg (zorunlu sayısal girdi, 0.1 adımlı), allocation (ORDER/STOCK açılır menü) ve notes (serbest metin alanı). Hammadde Stok'un 2 alanlı modalıyla (ağırlık + durum) karşılaştırıldığında, bu tahsis alanını ekler. Gönderimde form değerleri PUT /api/stock/half-products/{id}'ye gönderilir, ardından tüm veriler yenilenir.
Not: Backend'in PUT endpoint'i için allowed_fields beyaz listesi ['remaining_weight_kg', 'status', 'notes']'dır — allocation içermez. Frontend allocation'ı payload'da gönderir ama backend bunu sessizce yok sayar. Bu, tahsisin bu sayfadan etkin bir şekilde salt okunur olduğu, yalnızca üretim zamanında değiştirilebildiği anlamına gelir.
6.3.14 — Yükleme ve Boş Durumlar
Paralel getirme sırasında her panelin içerik alanı "Yükleniyor..." metinli bir Spin döndürücüsü gösterir. Yükleme tamamlandıktan sonra, o üretim adımı için kayıt bulunmayan paneller "Bu kategoride stok bulunamadı" mesajlı Ant Design Empty bileşeni gösterir.
6.3.15 — Saat Dilimi İşleme
Hammadde Stok ile aynı kalıp: dayjs ile utc ve timezone eklentileri. Tüm produced_at zaman damgaları veritabanında UTC olarak saklanır ve frontend'de dayjs.utc(date).tz(TURKEY_TZ).format('DD.MM.YY HH:mm') kullanılarak Europe/Istanbul saat dilimine dönüştürülür.
6.3.16 — Diğer Modüllerle Bağlantılar
Ürün Stok, üç Stok alt modülü arasında en çok bağlantılı olanıdır. Her büyük modüle dokunur:
- Üretim → Üretim Listesi (üst akış yazıcı):
half_product_stock'taki her kayıt bir üretim oturumu sırasında oluşturulmuştur.session_idveproduction_output_idsütunları doğrudan Üretim modülünün verisine bağlanır. Backend, operatör adlarını döndürmek içinProductionSessionile birleştirme bile yapar. - Üretim → Üretim Geçmişi (paralel görünüm): Üretim Geçmişi aynı üretim çıktılarını oturum ve zamana göre düzenlenmiş olarak gösterir. Ürün Stok aynı temel veriyi ürün kodu ve adıma göre yeniden düzenleyerek oturum merkezli değil envanter merkezli bir görünüm sağlar.
- Üretim → Alt akış tüketimi: Sonraki üretim adımı bir sepeti tükettiğinde (örn. Kalaylama X-kodlu Kabatel çıktısını tüketir), sepetin
remaining_weight_kg'si azalır,status'uin_useveyaconsumed'a değişir veconsumed_atdoldurulur. Varsayılan filtrestatus_filter=availableolduğundan bu kayıtlar artık bu sayfada görünmez. - Sipariş Modülü (tahsis kaynağı):
allocation(ORDER/STOCK) veorder_id, kümülatif çıktının sipariş gereksinimlerine oranına göre üretim zamanında belirlenir.work_card_idsütunu her sepeti Sipariş modülündeki kaynak iş kartına izler. - Laboratuvar Modülü → Test Yönetimi (kalite köprüsü): Bağlı testler modalı, Lab'ın
test_integration_routes.pydosyasından test sonuçlarını getirir. Testler, üretim sırasında veya sonrasında Lab sistemi tarafından üretim çıktılarına bağlanır. Ürün Stok, doğrudan Lab verisi okuyan tek Stok alt modülüdür. - Hammadde Modülü (kaynak malzeme):
source_qr_codesalanı Hammadde modülünden ham malzeme QR kodlarına (bakır için A-prefix vb.) referanslar içerir. Ürün Stokmaterialstablosunu sorgulamasa da, izlenebilirlik zinciri iki modülü veri düzeyinde birbirine bağlar.
6.3.17 — Bu Alt Modülün Yapmadıkları
- Envanter oluşturmaz — bu yalnızca Üretim modülünde aktif oturumlar sırasında gerçekleşir.
- Tüketilmiş veya sevk edilmiş kayıtları göstermez — varsayılan
status_filter=availablefiltresi tamamlanmış yaşam döngüsü kayıtlarını gizler. - Arama çubuğu yoktur — gezinme adım panellerini ve grup satırlarını açarak yapılır.
- Toplu işlem desteklemez — çoklu seçim, toplu tahsis değişikliği veya toplu silme yoktur.
- Tahsisi gerçekten değiştirmez — düzenleme modalı bir tahsis açılır menüsü sunsa da, backend bunu sessizce yok sayar (
allowed_fields'da yok). - WebSocket veya gerçek zamanlı güncelleme kullanmaz — veri yüklemede ve Yenile butonu ile manuel olarak çekilir.
initial_weight_kg'yi göstermez — yalnızcaremaining_weight_kggösterilir, bu nedenle tüketim yüzdesi görselleştirmesi yoktur (Hammadde Stok'un renk kodlu ağırlık sütununun aksine).- Koşullu ağırlık renklendirmesi yoktur — Hammadde Stok tüketim oranına göre ağırlıkları sarı/kırmızı renklendirirken, bu sayfa tüm ağırlıkları düz metin olarak gösterir.
aktarmaadımı backend'inProductionStepenum'unda veyaMACHINE_TO_PREFIXeşlemesinde yoktur — frontend 7 adım tanımlar ama backend enum'u yalnızca 6 içerir, bu da Aktarma'nın daha yeni bir ekleme olduğunu düşündürür.
Ürün Stok vs Hammadde Stok — aynı kabuk, farklı motor: Görsel düzen neredeyse aynıdır (Collapse paneller, gruplu tablolar, düzenleme modalı, yenile butonu), ancak alttaki veri modeli temelden farklıdır. Hammadde Stok, Hammadde modülünün materials tablosundan tek bir API çağrısıyla okur ve malzeme kategorisi/adına göre gruplar. Ürün Stok, kendi half_product_stock tablosundan 7 paralel API çağrısıyla okur, product_code'a göre gruplar ve ORDER/STOCK tahsis ayrımı, Lab test entegrasyonu, kaynak QR izlenebilirliği ve üretim oturumu bağlantısını ekler. Hammadde Stok ham girdilere salt okunur bir penceredir. Ürün Stok, Üretim, Lab ve Sipariş modülleriyle derin çapraz modül bağlantılarına sahip üretim çıktılarına oku-ve-yönet bir penceredir.
7. SONUÇ
Stok & Envanter, veri oluşturan bir modül değildir — diğer tüm modüllerden gelen veriyi görünür, karşılaştırılabilir ve eyleme dönüştürülebilir kılan modüldür. Hammadde üzerinden girilen ham maddeler, Üretim üzerinden kaydedilen üretim çıktıları, Hammadde Siparişi üzerinden takip edilen satın alma siparişleri, Sipariş modülünden gelen iş kartı gereksinimleri — tüm bunlar burada, fabrikanın en temel malzeme sorularını yanıtlayan üç tamamlayıcı görünümde birleşir.
7.1 Bu Dokümanın Kapsadıkları
Bu derin dalış, Stok & Envanter modülünü her biri temelden farklı bir veri stratejisine sahip üç alt modül üzerinden analiz etti:
| Bölüm | Alt Modül | Derinlik | Temel Bulgu |
|---|---|---|---|
| 6.1 | Projeksiyon | Kapsamlı | Kendi veritabanı tablosu olmayan, anında hesaplanan haftalık tahmin; iş kartı gereksinimlerini (EKSİ) malzeme siparişi teslimatlarıyla (ARTI) 8 kategori üzerinden birleştirir; toplam fazlalık içindeki gizli açık tespiti; malzemeye özgü ısı haritası normalizasyonu |
| 6.2 | Hammadde Stok | Tam | Hammadde modülünün materials tablosu üzerinde saf frontend görünümü; istemci tarafı gruplama ile tek API çağrısından 8 kategoriye; tüketim takibi için koşullu ağırlık renklendirmesi; yalnızca stok düzeyinde düzeltmeler için minimal düzenleme modalı |
| 6.3 | Ürün Stok | Tam | 6 endpoint'li kendi özel backend'i ve half_product_stock tablosu; üretim adımına göre 7 paralel API çağrısı; ORDER/STOCK tahsis ayrımı; bağlı Lab test entegrasyonu; kaynak QR izlenebilirlik zinciri; dizi sıfırlama ile kademeli silme |
7.2 Mimari Prensipler
Üç tasarım prensibi bu modülü tanımlar ve ERP sisteminin geri kalanından ayırır:
Görünürlük, Sahiplik Değil
Stok & Envanter neredeyse hiçbir veriye sahip değildir. Hammadde Stok, Hammadde modülünün materials tablosundan okur. Projeksiyon, sırasıyla Sipariş ve Hammadde'ye ait work_cards ve material_orders'dan hesaplar. Yalnızca Ürün Stok'un kendi tablosu vardır ve o bile yalnızca Üretim modülü tarafından doldurulur. Stok modülünün görevi, diğer modüllerin oluşturduğu veriyi sunmaktır.
Üç Mercek, Tek Gerçeklik
Aynı fiziksel fabrika envanteri üç farklı mercekten görünür: şu an hangi ham maddeler var (Hammadde Stok), şu an hangi üretim çıktıları var (Ürün Stok) ve gelecek haftalarda hangi malzemeler mevcut olacak (Projeksiyon). Hiçbir tek görünüm hikayenin tamamını anlatmaz. Birlikte, mevcut depo anlık görüntüsünden çok haftalık tahmin ufkuna uzanan kapsamlı bir malzeme görünürlük katmanı oluştururlar.
Depolama Yerine Hesaplama
Projeksiyon tanımlayıcı örnektir: özel veritabanı tablosu yok, önbellekleme yok, materyalize görünüm yok. Her istek tam projeksiyon'u canlı veriden yeniden hesaplar. Bu, projeksiyon'ların her zaman en son iş kartları ve teslimat kayıtlarıyla tutarlı olduğu anlamına gelir, istek başına daha ağır hesaplama maliyetiyle. Aynı prensip Hammadde Stok'un istemci tarafı gruplaması ve Ürün Stok'un paralel toplamasına da uygulanır — toplamlar her zaman taze hesaplanır, asla saklanmaz.
Çapraz Modül Okuma Deseni
Her alt modül en az bir harici modülden okur. Hammadde Stok, Hammadde'den okur. Projeksiyon, Hammadde Siparişi + Sipariş (iş kartları) okur. Ürün Stok, Üretim (oturumlar, çıktılar) ve Lab (bağlı testler) okur. Bu, Stok'u sistemdeki en çok bağımlılığa sahip modül yapar — herhangi bir üst akış modülü bozuksa çalışamaz.
7.3 Rakamlar
* Projeksiyon'un kalıcı depolaması yoktur. Hammadde Stok'un kendi endpoint'i yoktur. Tek yazma yapabilen endpoint'ler Ürün Stok'a aittir (PUT + DELETE) ve onlar bile tamamen başka bir modül tarafından doldurulan bir tabloyu değiştirir.
7.4 Stok Fabrikayı Nasıl Okur
İlk bakışta Stok pasif, salt okunur bir modül gibi görünür — her yerden okur, neredeyse hiçbir yere yazmaz. Ama bu yanıltıcıdır. Ürün Stok, üretim planlama döngüsünde kritik bir üst akış rolü oynar: Sipariş modülünün iş kartı hesaplama motoru, mevcut ürün stoğunu (STOCK tahsisli ve available durumlu kayıtları) sorgular ve yeni iş kartları oluşturmadan önce serbest envanteri düşer. allocation (ORDER vs STOCK) ve status (available, in_use, consumed, reserved) alanlarının var olma nedeni tam olarak budur — sadece görüntüleme için değil, ne kadar yeni üretim gerektiğini belirleyen girdi verisi olarak.
Bu, doğrusal bir hat değil, dairesel bir bağımlılık oluşturur:
Tüm ERP sistemi bu döngü olarak çalışır. Gerçek bir “başlangıç modülü” yoktur — her modül bir diğerinin verisine bağlıdır, o da bir üçüncüye bağlıdır ve döngü geri döner. Stok bu döngüdeki kritik bir kavşakta durur: Üretim ve Hammadde'den veri alır, ama aynı zamanda mevcut envanteri sağlayarak kaç iş kartı oluşturulacağını şekillendiren Sipariş modülüne geri besleme yapar. Eğer Ürün Stok 50 kg serbest Kabatel teli gösteriyorsa, hesaplama motoru üretim görevlerini dağıtmadan önce bunu düşer. Doğru stok verisi olmadan fabrika ya fazla üretir (kaynak israfı) ya da az üretir (teslimat tarihlerini kaçırır).
Bu aynı zamanda üst akış verisi tutarsız olduğunda ilk kırılan modülün Stok olduğu anlamına gelir. Bir malzeme siparişinin delivered_date'i yanlışsa, Projeksiyon'un tahmini kayar. Üretim remaining_weight_kg'yi güncellemezse, Hammadde Stok eski ağırlıkları gösterir. Bir üretim çıktısı Ürün Stok dışından silinirse, yetim stok kayıtları ortaya çıkar. Stok yalnızca veri göstermez — tüm sistemin bütünlüğünü açığa çıkarır.
7.5 Son Söz
Stok & Envanter modülü fabrikanın malzeme sinir sistemidir. Malzeme taşımaz, kablo üretmez, sipariş karşılamaz — ama organizasyondaki herkese neyin var olduğunu, neyin tahsis edildiğini, neyin serbest olduğunu ve gelecek hafta neyin mevcut olacağını söyler. Daha da kritik olarak, bu bilgiyi üretim planlama döngüsüne geri besler: Sipariş modülünün hesaplama motoru iş kartları oluşturmadan önce mevcut yarı mamulleri düşmek için Ürün Stok'u okur ve sipariş, üretim ve envanteri birbirine bağlayan daireyi kapatır. Projeksiyon, bir açık kritik hale gelmeden önce satın almayı uyarır. Hammadde Stok, depoda fiziksel olarak raflarda ne olduğunu söyler. Ürün Stok, üretim plancılarına hangi yarı mamullerin bir sonraki adım için hazır olduğunu söyler — ve Sipariş modülüne neyin hiç üretilmesine gerek olmadığını söyler. Üç sayfa, iki veritabanı tablosu, beş üst akış bağımlılığı ve bir kritik geri besleme döngüsü — bu modül olmadan fabrika ya kör çalışır ya da zaten elinde olan şeyleri üreterek döngüde döner.