Files
2026-10-26 22:56:40 +00:00

89 lines
4.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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
```bash
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
```bash
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`.