From 3494b7de793960d1df3f5815c6b915c3089e23db Mon Sep 17 00:00:00 2001 From: numex-admin Date: Thu, 10 Sep 2026 08:59:28 +0000 Subject: [PATCH] =?UTF-8?q?Numex=20yay=C4=B1n:=20routes/stok.js?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- routes/stok.js | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 routes/stok.js diff --git a/routes/stok.js b/routes/stok.js new file mode 100644 index 0000000..bf4aeb9 --- /dev/null +++ b/routes/stok.js @@ -0,0 +1,90 @@ +// Stok rotaları - lokasyon bazlı stok seviyesi ve düşük stok uyarısı +const router = require('express').Router(); +const store = require('../models/store'); +const stokModel = require('../models/stok'); +const lokasyonModel = require('../models/lokasyon'); +const urunModel = require('../models/urun'); + +// Tüm lokasyonların stok durumu (ürün isimleriyle) +router.get('/', (req, res) => { + const stok = store.oku('stok'); + const lokasyonlar = lokasyonModel.tumu(); + const urunler = urunModel.tumu(); + + const cikti = lokasyonlar.map(l => { + const kayitlar = stok.filter(s => s.lokasyonId === l.id); + return { + lokasyonId: l.id, + lokasyonAd: l.ad, + sehir: l.sehir, + stok: kayitlar.map(k => { + const urun = urunler.find(u => u.id === k.urunId); + return { + urunId: k.urunId, + urunAd: (urun || {}).ad || 'Silindi', + birim: (urun || {}).birim || 'adet', + miktar: k.miktar, + dusukStokEsigi: (urun || {}).dusukStokEsigi || 0 + }; + }) + }; + }); + res.json(cikti); +}); + +// Tek lokasyonun stok durumu +router.get('/:lokasyonId', (req, res) => { + const lok = lokasyonModel.bul(req.params.lokasyonId); + if (!lok) return res.status(404).json({ hata: 'Lokasyon bulunamadı' }); + const urunler = urunModel.tumu(); + const stok = stokModel.stokGetir(req.params.lokasyonId); + + const detayli = stok.map(k => { + const urun = urunler.find(u => u.id === k.urunId); + return { ...k, urunAd: (urun || {}).ad || 'Silindi', birim: (urun || {}).birim || 'adet' }; + }); + res.json({ lokasyon: lok, stok: detayli }); +}); + +// Düşük stok uyarısı (lokasyon bazlı, opsiyonel filtre) +router.get('/uyari/dusuk', (req, res) => { + const stok = store.oku('stok'); + const urunler = urunModel.tumu(); + const lokasyonlar = lokasyonModel.tumu(); + + const uyarilar = []; + for (const lok of lokasyonlar) { + for (const urun of urunler) { + if (urun.dusukStokEsigi > 0) { + const miktar = stokModel.urunMiktar(lok.id, urun.id, stok); + if (miktar <= urun.dusukStokEsigi) { + uyarilar.push({ + lokasyonId: lok.id, + lokasyonAd: lok.ad, + urunId: urun.id, + urunAd: urun.ad, + miktar, + dusukStokEsigi: urun.dusukStokEsigi + }); + } + } + } + } + res.json(uyarilar); +}); + +// Bir ürüne stok girişi yap (manuel stok ekleme) +router.post('/giris', (req, res) => { + const { lokasyonId, urunId, miktar } = req.body; + if (!lokasyonId || !urunId || !miktar) { + return res.status(400).json({ hata: 'lokasyonId, urunId ve miktar zorunludur' }); + } + if (!lokasyonModel.bul(lokasyonId)) return res.status(404).json({ hata: 'Lokasyon bulunamadı' }); + if (!urunModel.bul(urunId)) return res.status(404).json({ hata: 'Ürün bulunamadı' }); + if (Number(miktar) <= 0) return res.status(400).json({ hata: 'Miktar pozitif olmalıdır' }); + + const sonuc = stokModel.stokGuncelle(Number(lokasyonId), Number(urunId), Number(miktar)); + res.json({ mesaj: 'Stok girişi yapıldı', miktar: sonuc.miktar }); +}); + +module.exports = router;