4.5 KiB
4.5 KiB
Numex İşletme — Dijital İşletme Yönetimi
Frontend + backend + kalıcı veri katmanı çalışan, operasyonel tutarlılığı önceleyen işletme yönetim uygulaması.
Çalıştırma
npm install
npm run seed # izole demo veri (4 ürün, 3 müşteri)
npm start # http://localhost:4173 (port doluysa boş port)
Panel: tarayıcıda açılan adres. API: http://localhost:<port>/api/...
Mimari
┌──────────────────────────────────────────────┐
│ public/index.html — Operasyon Paneli │
│ Panel · Siparişler · Stok · Müşteriler │
│ Teslimat · Risk İzleme · Operasyon Kayıtları │
└───────────────────┬──────────────────────────┘
│ fetch /api/*
┌───────────────────▼──────────────────────────┐
│ server/api.js — Express │
│ ├── YETKİ KAPISI (403 + gerekçe + karar) │
│ ├── rotalar (müşteri, sipariş, ödeme...) │
│ └── statik panel │
├──────────────────────────────────────────────┤
│ server/isletme.js — iş mantığı │
│ ├── siparisOlustur (BEGIN IMMEDIATE) │
│ ├── odemeAl / odemeKesinlestir (idempotent) │
│ └── teslimatGuncelle / siparisIptal │
├──────────────────────────────────────────────┤
│ server/risk.js — kurtarma + risk motoru │
│ ├── kurtarmaCalistir() (açılışta) │
│ └── riskTarama() / oneriUret() │
├──────────────────────────────────────────────┤
│ server/db.js — SQLite (WAL, synchronous=FULL)│
│ data/isletme.db ← kalıcı veri │
└──────────────────────────────────────────────┘
Veri tutarlılığı kuralları (diske gömülü)
| Kural | Nerede |
|---|---|
| Negatif stok imkânsız | CHECK (stok >= 0) + trigger trg_products_stok_guard |
| Aşırı rezervasyon imkânsız | UPDATE ... WHERE stok - rezerve >= adet (tek ifadede kontrol+yazma) |
| Sipariş başına tek başarılı ödeme | UNIQUE INDEX ux_payments_basarili WHERE durum='BASARILI' |
| Aynı idempotency anahtarı tek kez | UNIQUE INDEX ux_payments_idem, orders.idempotency_key UNIQUE |
| Çökmede veri kaybı yok | WAL + synchronous=FULL, niyet yazımı tahsilattan önce |
| Belirsiz ödeme otomatik tekrarlanmaz | kurtarmaCalistir() → yarimKalan (operatör onayı) |
Sınavlar
node scripts/sinavlar.mjs # SINAV 1, 3, 4
node scripts/sinav2-hazirla.mjs # SINAV 2 çökme anını kurgular
SINAV 2 tam akış: hazırla → süreci öldür → yeniden başlat → GET /api/orders/<id> (durum ODENDI, tek ödeme).
API
| Metot | Yol | Açıklama |
|---|---|---|
| GET | /api/dashboard |
Panel özeti |
| GET/POST | /api/customers |
Müşteri listele / ekle |
| GET/POST | /api/orders |
Sipariş listele / oluştur (stok rezerve) |
| GET | /api/orders/:id |
Sipariş detayı + risk |
| POST | /api/orders/:id/pay |
Ödeme simülasyonu (idempotency_key) |
| POST | /api/orders/:id/shipment |
Teslimat durumu |
| POST | /api/orders/:id/cancel |
İptal (rezervasyon serbest) |
| GET | /api/products |
Stok (stok, rezerve, kullanılabilir) |
| GET | /api/risk |
Risk bulguları + kanıt + öneri |
| GET | /api/ops, /api/decisions |
Operasyon ve karar kayıtları |
Reddedilen işlemler: DELETE /api/customers/:id, DELETE /api/orders/:id, POST /api/files, POST /api/db/* → 403 YETKISIZ_ISLEM + gerekçe.
Yapılmayanlar (bilinçli)
- Gerçek ödeme sağlayıcısı bağlanmadı (simülasyon).
- Gerçek müşteriye mesaj gönderilmedi; dış sistem değiştirilmedi.
- Müşteri/sipariş kaydı silme ucu yok (iptal/arşivleme tercih edilir).
- Riskli siparişlerde otomatik aksiyon yok; yalnız tespit + öneri.
Ayrıntılı kararlar: KARAR_DEFTERI.md.