Modüllere Dön

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.

Şubat 2026 • Solen Kablo • Canlı Belge

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.

3
ALT MODÜL
~14
API ENDPOINT
2
VERİTABANI TABLOSU
5800+
SATIR KOD

İÇİNDEKİLER

1. Stok & Envanter Ne Yapar 2. Veri Akışı 3. Veritabanı Katmanı 4. Backend Mimarisi 5. Frontend 6. Alt Modüller 6.1 Projeksiyon (Stok Tahmini) 6.2 Hammadde Stok 6.3 Ürün Stok 7. Sonuç

1. STOK & ENVANTER NE YAPAR

Stok & Envanter modülü, herhangi bir üretim operasyonundaki en temel iki soruyu yanıtlar:

  1. “Ş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.
  2. “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:

BoyutCanlı Envanter (Ürün + Hammadde Stok)Projeksiyon
Veri kaynağıhalf_product_stock tablosu + materials tablosuwork_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ırPlan 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)
CRUDTam (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:

İş Kartları (sevkiyat_week) material_details JSON Hafta başına malzeme EKSİ
Malzeme Siparişleri (expected_date) miktar + malzeme_tipi Hafta başına malzeme ARTI
ARTI − EKSİ Haftalık değişim Kümülatif bakiye Açık tespiti

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 MalzemeJSON Yolu
Kabatel ÇekmeBakır (kg)material_details.copper_kg
KalaylamaKalay (kg)material_details.tin_kg
ExtruderPlastik, Katalizör, Boya, Antirodent (kg)quantities.*, insulation_materials[], sheath_materials[]
AktarmaMakara (adet)makara_distributions[].count
PaletlemePalet (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:

Üretim çıktı kaydeder half_product_stock satırı oluşur Ürün Stok gösterir
Malzeme giriş formu materials satırı oluşur Hammadde Stok gösterir

Ü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ütunTipDetay
idInteger PKOtomatik artış
qr_codeString(50)Benzersiz, indeksli. Deterministik: X1, X2, Y1, Y2, vb.
product_codeString(100)İndeksli. Örn: KC_18 (Kabatel 1.8mm), KL_18 (Kalaylama 1.8mm)
product_nameString(200)Okunabilir ad
production_stepString(50)İndeksli. Enum: kabatel_cekme, kalaylama, incetel, buncher, extruder, ebeam
initial_weight_kgFloatİlk üretildiğindeki ağırlık
remaining_weight_kgFloatMevcut ağırlık (bir sonraki adımda tüketildikçe azalır)
basket_numberIntegerOturum içinde sıralı
allocationString(20)ORDER (müşteri siparişine bağlı) veya STOCK (serbest envanter)
order_idInteger FKallocation = ORDER ise orders.id’ye referans
statusString(50)İndeksli. Enum: available, in_use, consumed, reserved, shipped
production_output_idInteger FKproduction_outputs.id’ye referans, indeksli
session_idInteger FKproduction_sessions.id’ye referans
work_card_idInteger FKwork_cards.id’ye referans
source_qr_codesTextTam izlenebilirlik için girdi QR kodlarının JSON dizisi (örn. bir Kalaylama Y1, Kabatel X3 ve X4’ü tüketmiş)
produced_atDateTimeÜretim zamanı
consumed_atDateTimeTamamen tüketilme zamanı (nullable)
created_atDateTimeUTC
updated_atDateTimeOtomatik güncelleme
notesTextİ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

TabloModülProjeksiyon Ne Okur
work_cardsÜretimsevkiyat_week (teslim haftası), machine_type, material_details JSON, status (CANCELLED hariç)
material_ordersHammaddematerial_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ı

DosyaSatırPrefixEndpointAmaç
projeksiyon_routes.py245/api/projeksiyon4Stok projeksiyonu: ana veri, özet, debug, malzeme bazlı detay
half_product_routes.py327/api/stock6Yarı mamul CRUD: liste, adım bazlı, özet, QR bazlı, güncelle, sil
material_routes.py(Hammadde)/api/materials~4Hammadde 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:

MetotNe 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)

MetotYolParametrelerNe Yapar
GET/api/projeksiyonweeks (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/summaryweeks (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), weeksMalzeme 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/debugDebug 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)

MetotYolNe 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/summary6 ü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ı

RouteBileşenSatırAmaç
/stok/projeksiyonStok/Projeksiyon/index.tsx3.323Tü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-stokStok/UrunStok/index.tsx866Yarı 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-stokStok/HammaddeStok/index.tsx676Hammadde 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

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ü:

  1. Ç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).
  2. 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.
  3. 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

SayfaRoute GuardManifest Butonları
ProjeksiyoncanStokaccess_page, view_projections, create_projection, edit_projection
Ürün StokcanStokaccess_page, view_table, view_details, edit_stock, adjust_quantity
Hammadde StokcanStokaccess_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:

6.1

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.

3.323 SATIR FRONTEND 804 SATIR SERVİS 4 ENDPOINT 3 GRAFİK TÜRÜ
6.2

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.

676 SATIR FRONTEND 8 MALZEME KATEGORİSİ PAYLAŞILAN API
6.3

Ü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.

866 SATIR FRONTEND 6 ENDPOINT 7 ÜRETİM ADIMI LAB 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_cekmecopper_kg (Filamaşin)
  • kalaylamatin_kg (Kalay)
  • extruder → plastik, katalizör, boya, antirodent (insulation_materials[] ve sheath_materials[]’den)
  • aktarma → makara (makara_distributions[]’den) — not: kangal plastik ambalaj kullanır ve İZLENMEZ
  • paletleme → 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:

  1. 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).
  2. 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).
  3. 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.
  4. Her haftayı sırayla işle: Her hafta için malzeme kategorisi başına haftalık = artı - eksi hesapla ve kümülatif toplama ekle. Ayrıca alt-malzeme kümülatiflerini de izle (örn. Bakır içindeki “Filamaşin 8mm”).
  5. 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.
  6. 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

MetotYolParametrelerAmaç
GET/api/projeksiyonweeks (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/summaryweeks (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), weeksMalzeme 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/debugDebug 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şkeniTipAmaç
projeksiyonDataProjeksiyonResponse | nullTüm API yanıtı, her iki sekme arasında paylaşılır
weekOffsetnumberH01’den mevcut hafta ofseti. Navigasyon oklarıyla değişir. API yeniden çağrısını tetikler.
expandedMaterialsstring[]Hangi malzeme sütunlarının alt-malzemeleri göstermek için genişletildiği
knownSubMaterialsRecord<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)
selectedGraphMaterialsstring[]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ı
radarPagenumberBireysel 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:

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:

  1. Backend, category_materialName anahtarlı bir sözlük olarak sub_material_cumulatives’i izler (örn. plastic_HFX 500P). Bu, yalnızca görüntüleme penceresi değil, HER hafta için güncellenir.
  2. Yanıttaki her hafta kendi sub_material_cumulatives anlık görüntüsünü taşır.
  3. 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.
  4. 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:

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:

6.1.10 — Dashboard İstatistik Kartları

Grafiklerin üzerinde 4 istatistik kartı hızlı bir özet sağlar:

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:

  1. Yalıtım malzemeleri (insulation_materials[]): Her girişin material_name (plastik türü), plastic_kg, catalyst_name, catalyst_kg ve dye_name ve dye_kg içeren dyes[] dizisi vardır.
  2. Kılıf malzemeleri (sheath_materials[]): Yalıtımla aynı yapı ama ayrıca antirodent_name ve antirodent_kg iç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:

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:

EylemProjeksiyon Üzerindeki Etkisi
Yeni iş kartı oluşturulduKartın sevkiyat_week’i için EKSİ artar
İş kartının sevkiyat_week’i değiştiEKSİ eski haftadan yeni haftaya taşınır
İş kartı iptal edildiEKSİ kaybolur (CANCELLED sorgudan hariç)
Yeni malzeme siparişi oluşturulduexpected_date haftasında ARTI görünür
Malzeme siparişinin beklenen tarihi değiştiARTI eski haftadan yeni haftaya taşınır
Malzeme sipariş miktarı değiştiO haftanın ARTI miktarı değişir
Malzeme siparişi teslim edildiARTI, expected_date/quantity’den delivered_date/delivered_quantity’ye geçer — hafta ve miktar ikisi de kayabilir
Malzeme siparişi iptal edildiARTI 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ı

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:

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):

  1. Sayfa yüklenir → useEffect([], []) mount’ta fetchMaterials()’i tetikler
  2. Tek bir GET /api/materials/list çağrısı türden bağımsız olarak TÜM hammaddeleri düz bir dizi olarak çeker
  3. Yanıt processAndGroupMaterials()’dan geçer: material_type’a göre 8 kovaya filtreler, her kova içinde material_name’e göre gruplar, toplam değerleri hesaplar (toplam, rezerve, serbest), her şeyi sectionData state nesnesinde depolar
  4. Kullanıcı o kategorinin gruplanmış tablosunu görmek için bir Collapse paneline tıklar
  5. 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
  6. 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ı):

  1. Herhangi bir bireysel öğe satırındaki (Seviye 3) EditOutlined ikonuna tıklayın
  2. Modal “Düzenle: {QR_CODE}” başlığıyla açılır (örn. “Düzenle: A7”)
  3. Form, seçilen öğenin mevcut değerlerinden form.setFieldsValue() ile önceden doldurulur
  4. İki alan mevcut (tam detaylar için 6.2.11’e bakınız):
    • remaining_weightInputNumber, min=0, step=0.1. Palet/makara türleri için gizli
    • status — 5 seçenekli Select açılır listesi
  5. Gönderimde: PUT /api/materials/update/{id} form değerleriyle
  6. Başarıda: message.success('Güncellendi') → modal kapanır → form sıfırlanır → fetchMaterials() tüm veriyi yeniden çeker
  7. Hatada: message.error('Güncellenemedi')

Silme (Onaylı Kalıcı Silme):

  1. Herhangi bir bireysel öğe satırındaki DeleteOutlined ikonuna (color: '#ff4d4f' stilinde) tıklayın
  2. 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
  3. Onayda: DELETE /api/materials/{id}/hard-delete — bu kalıcı, geri dönüşü olmayan bir silmedir. Malzeme kaydı ve tüm ilişkili material_photos kayıtları veritabanından kaldırılır
  4. Başarıda: message.success('Silindi')fetchMaterials() yeniden çeker
  5. 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/listDü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-deleteMalzemeyi 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:

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ırraw_copperMenuOutlined#cd7f32 (bronz)kgA
Kalayraw_tinGoldOutlined#c0c0c0 (gümüş)kgB
Plastikraw_plasticDockerOutlined#3498db (mavi)kgC
Katalizörraw_catalystExperimentOutlined#9b59b6 (mor)kgD
Boyaraw_dyeBgColorsOutlined#e74c3c (kırmızı)kgE
Antirodentraw_antirodentBugOutlined#27ae60 (yeşil)kgF
Paletraw_paletteBorderInnerOutlined#f39c12 (turuncu)adetI
Makararaw_reelPicCenterOutlined#1abc9c (deniz mavisi)adetH

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:

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 KodDeterministik QR kodu gösteren mavi etiket (A1, B3, C12, vb.). Sola sabitlenmiş.
Ölçülen / MiktarGiriş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).
DurumRenk 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çiTedarikçi Yönetimi’nden tedarikçi adı, yoksa “-”
Lot NoHammadde Girişi’nden lot/parti numarası, yoksa “-”
Giriş TarihiGiriş tarihi, UTC’den Europe/Istanbul zaman dilimine dönüştürülmüş. GG.AA.YY formatında.
İşlemDü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:

Renderlama kuralları:

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:

  1. Panel başlık istatistikleri: Toplam sayılardan sonra “kg” veya “adet” gösterir
  2. Grup tablosu sütunları: Toplam, Kullanımda, Serbest değerlerinde birim soneki
  3. Detay tablosu sütun başlığı: kg türleri için “Ölçülen”, adet türleri için “Miktar”
  4. Detay tablosu “Kalan” sütunu: Palet/makara için tamamen gizli
  5. 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:

  1. Kategori filtresi: 8 kategorinin her biri için materials.filter(m => m.material_type === cat.key) filtrele
  2. Ad gruplama: Her kategori içinde material_name’e göre anahtarlanmış bir Record<string, RawMaterial[]> oluştur. material_name null/boşsa anahtar “{label} (İsimsiz)” olur (örn. “Bakır (İsimsiz)”)
  3. Grup toplamları: Her grup için bir MaterialGroupSummary nesnesi oluştur:
    • total_quantity: kg türleri için remaining_weight ?? weight ?? 0 toplamı, veya adet türleri için weight ?? 0 toplamı, durumdan bağımsız TÜM öğeler üzerinden
    • reserved_quantity: status === 'in_use' olan öğelerden toplam
    • available_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
  4. State koruma: Mevcut sectionData’dan önceki expandedKeys’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:

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:

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:

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?

Aşağı Akış: Envanteri kim tüketir?

Aynı veri üzerindeki kardeş görünümler:

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:

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ı

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:

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}GETBirincil 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}PUTAğırlık, durum, notları güncelleEvet (düzenleme modalı)
/api/stock/half-products/{id}DELETEKademeli silme: stok + üretim çıktısı + dizi sıfırlamaEvet (silme onayı)
/api/stock/half-productsGETSayfalı genel listeleme, opsiyonel adım/durum filtresiHayır (diğer tüketiciler için mevcut)
/api/stock/half-products/summaryGETAdım başına sayı ve ağırlıklar (mevcut/toplam)Hayır
/api/stock/half-products/{qr_code}GETQR koda göre aramaHayı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_codeString(50), benzersizDeterministik QR: X=Kabatel, Y=Kalaylama, Z=İncetel, T=Buncher, U=Extruder, G=E-Beam. Prefix başına global sıralı.
product_codeString(100)Teknik ürün tanımlayıcı (örn. KC_18, KL_18). Frontend'de gruplama anahtarı.
production_stepString(50)Hangi makine adımı üretti: kabatel_cekme, kalaylama, incetel, buncher, extruder, ebeam, aktarma.
initial_weight_kgFloatSepetin makineden çıktığı andaki ağırlık. Asla değişmez.
remaining_weight_kgFloatAlt akış tüketimi sonrası güncel ağırlık. Sonraki üretim adımı bu sepeti tükettiğinde azalır.
basket_numberIntegerÜretim oturumu içindeki sıralı sepet numarası.
allocationString(20)ORDER = müşteri siparişini karşılamak için üretildi. STOCK = fazla üretim, serbest envanter.
order_idFK → orders.idBu sepetin tahsis edildiği müşteri siparişi (STOCK ise null).
statusString(50)availablein_useconsumed. Ayrıca reserved, shipped, defective.
production_output_idFK → production_outputs.idÜretim çıktı kaydına bağlantı. Bağlı test sorgusu ve kademeli silme için kullanılır.
session_idFK → production_sessions.idBu sepeti hangi üretim oturumu oluşturdu. Operatör adını çekmek için kullanılır.
work_card_idFK → work_cards.idBu üretimi yönlendiren iş kartı (Sipariş modülünden).
source_qr_codesText (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_atDateTimeSepetin üretildiği zaman. UTC olarak saklanır, Europe/Istanbul olarak gösterilir.
consumed_atDateTime, nullableBu 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:

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_cekmeKabatelX (X1, X2...)Ham bakırdan çekilen 1.8mm tel
kalaylamaKalaylamaYKalaylanmış tel
incetelİncetelZİnce tel (daha küçük çap)
buncherBuncherTDemet halinde tel telleri
extruderExtruderUYalıtılmış kablo
ebeamE-BeamGElektron ışını ile çapraz bağlanmış kablo
aktarmaAktarmaAKMalzeme 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:

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:

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 KodDeterministik QR kodu (örn. X5, Y12). Mavi etiket. Sabit sol sütun.
AğırlıkGüncel kalan ağırlık kg cinsinden (Türkçe yerel formatlaması).
TahsisORDER (yeşil) veya Stok (turuncu) etiketi.
DurumMevcut (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.
KaynakGirdi QR kodları (JSON'dan ayrıştırılır). İlk 2 kodu gösterir + daha fazlası varsa "...". Üst akış malzemelerine izlenebilirlik bağlantısı.
Testproduction_output_id varsa deney ikonu butonu. Bağlı testler modalını açar.
İşlemDü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:

Ü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:

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:

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:

  1. Kayıtlar üzerinde döner, product_code'a göre (veya "Unknown" yedek değeri) bir Record<string, HalfProductStock[]> haritasına gruplar
  2. Her grup için remaining_weight_kg toplayarak total_kg, siparis_kg (ORDER tahsisi) ve serbest_kg (STOCK tahsisi) hesaplar
  3. Adım başına genel toplamları biriktirir
  4. Grupları ürün koduna göre alfabetik sıralar
  5. SectionData nesnesini oluşturur, mevcut expandedKeys'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:

6.3.17 — Bu Alt Modülün Yapmadıkları

Ü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ümAlt ModülDerinlikTemel Bulgu
6.1ProjeksiyonKapsamlı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.2Hammadde StokTamHammadde 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 StokTam6 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

~1.050
SATIR BACKEND
~4.800
SATIR FRONTEND
5
ÜST AKIŞ MODÜLÜ
0
KENDİ YAZMA ENDPOINT'İ

* 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

Hammadde Modülü Hammadde Stok
Üretim Ürün Stok Lab (bağlı testler)
Hammadde Siparişi (ARTI) Projeksiyon İş Kartları (EKSİ)

İ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:

Sipariş İş Kartları Üretim Ürün Stok Sipariş (mevcudu düş) → ...

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.