# YTP Bilgi Bankası Yakıt Takip Sistemi kapsamlı bilgi bankası - hızlı referans, kılavuzlar ve sorun giderme rehberi. ## 📋 İçerik - [Hızlı Başlangıç](#hızlı-başlangıç) - [Sistem Mimarisi](#sistem-mimarisi) - [Kullanıcı Rolleri ve Yetkileri](#kullanıcı-rolleri-ve-yetkileri) - [İş Akışları](#iş-akışları) - [Yaygın Sorunlar ve Çözümleri](#yaygın-sorunlar-ve-çözümleri) - [Best Practices](#best-practices) - [Kaynaklar ve Referanslar](#kaynaklar-ve-referanslar) ## 🚀 Hızlı Başlangıç ### Sistemi 5 Dakikada Çalıştırma ```bash # 1. Projeyi klonlayın git clone cd ytp # 2. Bağımlılıkları yükleyin npm install && cd client && npm install && cd .. # 3. Veritabanını başlatın npm run prepare:db # 4. Sistemi çalıştırın npm run dev # 5. Tarayıcıda açın # Frontend: http://localhost:5173 # Backend API: http://localhost:5005/api ``` ### Varsayılan Giriş Bilgileri | Rol | Kullanıcı Adı | Şifre | Panel | |-----|--------------|-------|-------| | Admin | `admin` | `Admin!123` | [Admin Paneli](#admin-paneli) | | Yakıt Sorumlusu | `yakitsorum` | `Yakit@123` | [Yakıt Sorumlusu Paneli](#yakıt-sorumlusu-paneli) | | Mal Sorumlusu | `malsorum1` | `Mal@123` | [Mal Sorumlusu Paneli](#mal-sorumlusu-paneli) | ### İlk Yakıt Fişi Oluşturma 1. **Giriş Yap**: Yakıt sorumlusu ile giriş yapın 2. **Kaynak Kontrolü**: Araç, birlik ve personel kayıtlarını kontrol edin 3. **Fiş Oluştur**: "Yeni Fiş" butonuna tıklayın 4. **Form Doldur**: Tüm zorunlu alanları doldurun 5. **Onay Gönder**: Mal sorumlusuna gönder 6. **Bildirim Takibi**: Real-time bildirimleri izleyin ## 🏗️ Sistem Mimarisi ### Mimari Diyagram ``` ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ Frontend │ │ Backend │ │ Database │ │ (Svelte) │◄──►│ (Express) │◄──►│ (SQLite) │ │ │ │ │ │ │ │ - UI Components │ │ - REST API │ │ - users │ │ - State Mgmt │ │ - Socket.IO │ │ - vehicles │ │ - Routing │ │ - Auth/Authz │ │ - units │ │ - API Client │ │ - PDF Generation│ │ - fuel_personnel│ └─────────────────┘ └─────────────────┘ │ - fuel_slips │ └─────────────────┘ ``` ### Teknoloji Stack Karşılaştırması | Katman | Teknoloji | Neden? | Alternatifler | |--------|-----------|--------|---------------| | Frontend | Svelte + Vite | Hızlı, küçük bundle, reaktif | React, Vue, Angular | | Backend | Node.js + Express | Hızlı development, JavaScript ekosistemi | Python, PHP, Java | | Database | SQLite3 | Hafif, kurulum gerektirmeyen, taşınabilir | PostgreSQL, MySQL | | Real-time | Socket.IO | WebSocket wrapper, fallback mekanizmaları | Raw WebSocket, SSE | | PDF | PDFKit | Node.js uyumlu, esnek | Puppeteer, jsPDF | ## 👥 Kullanıcı Rolleri ve Yetkileri ### Admin (Sistem Yöneticisi) **Yetkiler:** - ✅ Tüm kullanıcıları yönetme - ✅ Mal sorumluları ekleme/güncelleme/silme - ✅ Araç kayıtlarını yönetme - ✅ Birlik bilgilerini yönetme - ✅ Personel kayıtlarını yönetme - ✅ Sistem ayarlarını yapılandırma - ❌ Yakıt fişi oluşturma - ❌ Fiş onaylama/reddetme **Kullanım Alanları:** - Sistem kurulum ve bakım - Kullanıcı yönetimi - Temel veri girişi - Raporlama ve analiz ### Yakıt Sorumlusu **Yetkiler:** - ✅ Yakıt fişi oluşturma - ✅ Fiş durumlarını takip etme - ✅ PDF fiş indirme - ✅ Kaynak bilgilerini görme - ❌ Kullanıcı yönetimi - ❌ Fiş onaylama - ❌ Temel veri düzenleme **Kullanım Alanları:** - Günlük yakıt ikmal işlemleri - Fiş oluşturma ve takip - Raporlama ### Mal Sorumlusu **Yetkiler:** - ✅ Atanan fişleri görme - ✅ Fiş onaylama/reddetme - ✅ Onay/reddetme gerekçesi ekleme - ✅ Atanan fişleri arşivleme - ❌ Fiş oluşturma - ❌ Kullanıcı yönetimi - ❌ Temel veri düzenleme **Kullanım Alanları:** - Yakıt ikmal onay süreçleri - Stok takibi - Raporlama ## 🔄 İş Akışları ### 1. Kullanıcı Yönetimi Akışı (Admin) ``` Başlangıç ↓ Admin Girişi ↓ "Kullanıcı Yönetimi" → "Mal Sorumluları" ↓ "Ekle" butonu → Form doldur → Kaydet ↓ Kullanıcı oluşturuldu → Bilgilendirme ↓ Bitiş ``` ### 2. Yakıt Fişi Oluşturma Akışı ``` Başlangıç ↓ Yakıt Sorumlusu Girişi ↓ "Yeni Fiş" butonu ↓ Form doldurma: ├─ Tarih seçimi ├─ Kuvvet seçimi ├─ Birlik seçimi ├─ Araç seçimi ├─ Yakıt bilgileri ├─ Personel seçimi └─ Mal sorumlusu atama ↓ "Oluştur" butonu ↓ Validasyon → Veritabanı kayıt ↓ Mal sorumlusuna bildirim ↓ PDF fiş oluştur (opsiyonel) ↓ Bitiş ``` ### 3. Fiş Onay Akışı ``` Başlangıç ↓ Mal Sorumlusu Girişi ↓ "Atanan Fişler" listesi ↓ Fiş seçimi → Detay görüntüle ↓ Karar verme: ├─ "Onayla" → Durum: approved └─ "Reddet" → Gerekçe gir → Durum: rejected ↓ Yakıt sorumlusuna bildirim ↓ Bitiş ``` ### 4. Real-time Bildirim Akışı ``` Olay Tetiklenir ↓ Server Event Oluştur ↓ Socket.IO Emit ↓ İlgili Client'a Gönder ↓ UI Güncellenir ↓ Kullanıcı Bilgilendirilir ``` ## 🔧 Yaygın Sorunlar ve Çözümleri ### Giriş ve Oturum Sorunları #### Sorun: "Kullanıcı adı veya şifre hatalı" **Nedenler:** - Yanlış kullanıcı adı/şifre - Büyük/küçük harf duyarlılığı - Boşluk karakterleri **Çözümler:** ```bash # Varsayılan kullanıcıları kontrol et sqlite3 data/app.db "SELECT username, role FROM users;" # Şifre sıfırlama (admin için) sqlite3 data/app.db "UPDATE users SET password = 'Admin!123' WHERE username = 'admin';" ``` #### Sorun: "Oturum bulunamadı" **Nedenler:** - Token süresi dolmuş - Browser storage temizlenmiş - Sunucu yeniden başlatılmış **Çözümler:** ```javascript // Browser console'dan kontrol et localStorage.getItem('sessionToken'); // Manuel temizleme localStorage.removeItem('sessionToken'); location.reload(); ``` ### Veritabanı Sorunları #### Sorun: "Veritabanı okunamadı" **Nedenler:** - Veritabanı dosyası yok - İzin sorunları - Dosya kilitli **Çözümler:** ```bash # Veritabanını yeniden oluştur rm data/app.db npm run prepare:db # İzinleri kontrol et ls -la data/app.db chmod 664 data/app.db ``` #### Sorun: "Bu kullanici adi zaten mevcut" **Nedenler:** - Unique constraint ihlali - Önceki kayıt silinmemiş **Çözümler:** ```sql -- Mevcut kullanıcıları listele SELECT id, username, role FROM users; -- Kullanıcıyı sil (ID'ye göre) DELETE FROM users WHERE id = 3; ``` ### API ve Bağlantı Sorunları #### Sorun: "Network Error" **Nedenler:** - Backend çalışmıyor - Port çakışması - Firewall engeli **Çözümler:** ```bash # Port durumunu kontrol et lsof -i :5005 # Backend'i yeniden başlat npm run start:server # Port değiştir PORT=3000 npm run start:server ``` #### Sorun: "CORS hatası" **Nedenler:** - Origin mismatch - CORS ayarları eksik **Çözümler:** ```javascript // server/index.js CORS ayarları app.use(cors({ origin: ['http://localhost:5173', 'http://localhost:3000'], credentials: true })); ``` ### Frontend Sorunları #### Sorun: Component yüklenmiyor **Nedenler:** - JavaScript error - Import hataları - Build sorunları **Çözümler:** ```bash # Frontend'i yeniden build et cd client npm run build # Development modunda kontrol et npm run dev ``` #### Sorun: Socket.IO bağlantı kurulamıyor **Nedenler:** - Token geçersiz - Server kapalı - WebSocket engellendi **Çözümler:** ```javascript // Browser console'da test const socket = io('http://localhost:5005'); socket.on('connect', () => console.log('Connected')); ``` ## 📚 Best Practices ### Development Best Practices #### 1. Code Organization ```javascript // ✅ İyi pratik - Component based structure src/ ├── components/ │ ├── auth/ │ ├── admin/ │ └── shared/ ├── lib/ ├── api/ └── styles/ // ❌ Kötü pratik - Tüm dosyaları tek dizinde src/ ├── LoginView.svelte ├── AdminPanel.svelte ├── api.js └── styles.css ``` #### 2. Error Handling ```javascript // ✅ İyi pratik - Spesifik error handling async function createFuelSlip(data) { try { const response = await api.post('/fuel-slips', data); return response.slip; } catch (error) { if (error.status === 409) { throw new Error('Bu fiş zaten mevcut'); } else if (error.status === 400) { throw new Error('Form verileri geçersiz'); } throw new Error('Fiş oluşturulamadı'); } } // ❌ Kötü pratik - Generic error handling async function createFuelSlip(data) { try { return await api.post('/fuel-slips', data); } catch (error) { console.log(error); // Silent fail } } ``` #### 3. State Management ```javascript // ✅ İyi pratik - Minimal reactivity let search = ''; let items = []; $: filteredItems = items.filter(item => item.name.toLowerCase().includes(search.toLowerCase()) ); // ❌ Kötü pratik - Unnecessary reactivity $: searchLower = search.toLowerCase(); $: filteredItems = items.filter(item => item.name.toLowerCase().includes(searchLower) ); ``` ### Security Best Practices #### 1. Input Validation ```javascript // ✅ İyi pratik - Server-side validation app.post('/api/vehicles', (req, res) => { const { brand, model, year, plate } = req.body; // Server-side validation if (!brand || !model || !year || !plate) { return res.status(400).json({ message: 'All fields required' }); } if (year < 1990 || year > new Date().getFullYear() + 1) { return res.status(400).json({ message: 'Invalid year' }); } // Process valid data }); // ❌ Kötü pratik - Sadece client-side validation // Frontend validation bypass edilebilir ``` #### 2. Session Management ```javascript // ✅ İyi pratik - Secure session handling function createSession(user) { const token = crypto.randomBytes(32).toString('hex'); const session = { id: user.id, role: user.role, createdAt: Date.now(), expiresAt: Date.now() + (24 * 60 * 60 * 1000) // 24 hours }; sessions.set(token, session); return { token, session }; } // ❌ Kötü pratik - Predictable tokens function createSession(user) { const token = `${user.id}-${Date.now()}`; // Predictable! // ... } ``` ### Performance Best Practices #### 1. Database Queries ```javascript // ✅ İyi pratik - Efficient queries async function getFuelSlipsByStatus(status) { return db.all(` SELECT fs.*, u.display_name as inventoryManagerName FROM fuel_slips fs LEFT JOIN users u ON u.id = fs.inventory_manager_id WHERE fs.status = ? ORDER BY fs.created_at DESC `, [status]); } // ❌ Kötü pratik - N+1 query problem async function getFuelSlipsByStatus(status) { const slips = await db.all(` SELECT * FROM fuel_slips WHERE status = ? `, [status]); // N+1 queries! for (const slip of slips) { const user = await db.get(` SELECT display_name FROM users WHERE id = ? `, [slip.inventory_manager_id]); slip.inventoryManagerName = user.display_name; } return slips; } ``` #### 2. Component Optimization ```javascript // ✅ İyi pratik - Lazy loading const AdminPanel = lazy(() => import('./components/AdminPanel.svelte')); // Usage {#if user.role === 'admin'} Loading...}> {/if} // ❌ Kötü pratik - Her zaman tüm component'leri yüklemek import AdminPanel from './components/AdminPanel.svelte'; import FuelManagerPanel from './components/FuelManagerPanel.svelte'; // ... tüm component'ler import edildi ``` ## 🔗 Kaynaklar ve Referanslar ### Dokümantasyon Linkleri - [README.md](../README.md) - Proje genel bakış - [API.md](API.md) - API dokümantasyonu - [DATABASE.md](DATABASE.md) - Veritabanı şeması - [STRUCTURE.md](STRUCTURE.md) - Proje yapısı - [DEPLOYMENT.md](DEPLOYMENT.md) - Dağıtım kılavuzu - [FRONTEND.md](FRONTEND.md) - Frontend mimarisi ### External Resources #### Teknoloji Dokümantasyonları - [Svelte Documentation](https://svelte.dev/docs) - [Express.js Guide](https://expressjs.com/en/guide/) - [Socket.IO Documentation](https://socket.io/docs/) - [SQLite Documentation](https://www.sqlite.org/docs.html) - [Vite Documentation](https://vitejs.dev/guide/) #### Development Tools - [VS Code](https://code.visualstudio.com/) + [Svelte Extension](https://marketplace.visualstudio.com/items?itemName=svelte.svelte-vscode) - [SQLite Browser](https://sqlitebrowser.org/) - Veritabanı yönetimi - [Postman](https://www.postman.com/) - API testing - [Git](https://git-scm.com/) - Versiyon kontrolü #### Learning Resources - [MDN Web Docs](https://developer.mozilla.org/) - Web teknolojileri - [JavaScript Info](https://javascript.info/) - JavaScript öğrenme - [CSS Tricks](https://css-tricks.com/) - CSS teknikleri - [Node.js Best Practices](https://github.com/goldbergyoni/nodebestpractices) - Node.js pratikleri ### Komut Referansı #### Geliştirme Komutları ```bash npm run dev # Geliştirme sunucusu npm run start:server # Sadece backend cd client && npm run dev # Sadece frontend npm run prepare:db # Veritabanı başlangıç ``` #### Production Komutları ```bash npm run build # Frontend build npm start # Production sunucusu pm2 start ecosystem.config.js # PM2 ile başlat docker-compose up -d # Docker ile başlat ``` #### Veritabanı Komutları ```bash sqlite3 data/app.db # Veritabanına bağlan sqlite3 data/app.db ".tables" # Tabloları listele sqlite3 data/app.db ".schema" # Şemayı göster sqlite3 data/app.db ".backup backup.db" # Yedek al ``` ### Hızlı Referans Kartları #### API Endpoint'leri ``` Authentication: POST /api/auth/login POST /api/auth/logout GET /api/session Admin Operations: GET/POST/PUT/DELETE /api/inventory-managers GET/POST/PUT/DELETE /api/vehicles GET/POST/PUT/DELETE /api/units GET/POST/PUT/DELETE /api/fuel-personnel Fuel Operations: GET /api/fuel/resources GET /api/fuel-slips POST /api/fuel-slips GET /api/fuel-slips/:id/pdf PATCH /api/fuel-slips/:id/status ``` #### Varsayılan Veriler ``` Users: - admin/Admin!123 (admin) - yakitsorum/Yakit@123 (fuel_manager) - malsorum1/Mal@123 (inventory_manager) Vehicles: - Ford Transit 2021 (34 AYT 312) - Isuzu NPR 2019 (34 FZT 908) Forces: - MSB, K.K.K., Dz.K.K., Hv.K.K., SGK, Gnkur. Bşk., Hrt.Gn.K. ``` --- **Not**: Bu bilgi bankesi sürekli güncellenmektedir. Yeni sorunlar ve çözümler eklenecektir.