refactor: Yakıt fişleri SQLite veritabanı bağlantısı kuruldu

- Yakıt fişleri tablosu oluşturuldu (fuel_slips)
- API tamamen SQLite veritabanı ile çalışacak şekilde güncellendi
- Geçici mock data verileri tamamen kaldırıldı
- Veritabanı dosyası temizlendi, proje temiz başlatılacak
- Tüm CRUD operasyonları (CREATE, READ, UPDATE, DELETE) veritabanı ile entegre
- JSON alanlar veritabanında TEXT olarak saklanıyor ve parse ediliyor

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-06 19:57:42 +03:00
parent f66bdd3221
commit bb9031fb31
2 changed files with 278 additions and 108 deletions

View File

@@ -1,10 +1,14 @@
import { json } from '@sveltejs/kit'; import { json } from '@sveltejs/kit';
import { emitSocketEvent } from '$lib/server/socketClient.js'; import { emitSocketEvent } from '$lib/server/socketClient.js';
// Geçici veritabanı simülasyonu - Tüm veriler temizlendi // Veritabanı bağlantısı
let fuelSlips = []; const dbPath = 'db/yakit_takip.db';
import sqlite3 from 'sqlite3';
let nextId = 1; // Veritabanı bağlantısı al
function getDatabase() {
return new sqlite3.Database(dbPath);
}
// GET - Yakıt fişlerini listele // GET - Yakıt fişlerini listele
export async function GET({ request, url }) { export async function GET({ request, url }) {
@@ -13,27 +17,54 @@ export async function GET({ request, url }) {
const manager_id = searchParams.get('manager_id'); const manager_id = searchParams.get('manager_id');
const fuel_manager_id = searchParams.get('fuel_manager_id'); const fuel_manager_id = searchParams.get('fuel_manager_id');
let filteredSlips = [...fuelSlips]; return new Promise((resolve) => {
const db = getDatabase();
let query = 'SELECT * FROM fuel_slips WHERE 1=1';
const params = [];
// Status filtreleme // Status filtreleme
if (status) { if (status) {
filteredSlips = filteredSlips.filter(slip => slip.status === status); query += ' AND status = ?';
params.push(status);
} }
// Mal sorumlusu filtreleme // Mal sorumlusu filtreleme
if (manager_id) { if (manager_id) {
filteredSlips = filteredSlips.filter(slip => slip.goods_manager_id == manager_id); query += ' AND goods_manager_id = ?';
params.push(manager_id);
} }
// Yakıt sorumlusu filtreleme // Yakıt sorumlusu filtreleme
if (fuel_manager_id) { if (fuel_manager_id) {
filteredSlips = filteredSlips.filter(slip => slip.fuel_manager_id == fuel_manager_id); query += ' AND fuel_manager_id = ?';
params.push(fuel_manager_id);
} }
// Tarihe göre ters sırala // Tarihe göre ters sırala
filteredSlips.sort((a, b) => new Date(b.created_at) - new Date(a.created_at)); query += ' ORDER BY created_at DESC';
return json({ fuelSlips: filteredSlips }); db.all(query, params, (err, rows) => {
db.close();
if (err) {
console.error('GET fuel slips error:', err);
resolve(json({ message: 'Veritabanı hatası.' }, { status: 500 }));
return;
}
// JSON string olarak saklanan alanları parse et
const fuelSlips = rows.map(row => ({
...row,
vehicle_info: row.vehicle_info ? JSON.parse(row.vehicle_info) : null,
personnel_info: row.personnel_info ? JSON.parse(row.personnel_info) : null,
goods_manager_info: row.goods_manager_info ? JSON.parse(row.goods_manager_info) : null,
fuel_manager_info: row.fuel_manager_info ? JSON.parse(row.fuel_manager_info) : null
}));
resolve(json({ fuelSlips }));
});
});
} }
// POST - Yeni yakıt fişi oluştur // POST - Yeni yakıt fişi oluştur
@@ -80,15 +111,10 @@ export async function POST({ request }) {
const person = personnel.fuelPersonnel?.find(p => p.id === slipData.personnel_id); const person = personnel.fuelPersonnel?.find(p => p.id === slipData.personnel_id);
const goodsManager = goodsManagers.goodsManagers?.find(gm => gm.id === slipData.goods_manager_id); const goodsManager = goodsManagers.goodsManagers?.find(gm => gm.id === slipData.goods_manager_id);
// Yeni fiş oluştur return new Promise((resolve) => {
const newSlip = { const db = getDatabase();
id: nextId++,
date: slipData.date, const vehicleInfo = vehicle ? {
force_command: slipData.force_command,
unit_id: slipData.unit_id,
unit_name: unit?.name || `Birim ${slipData.unit_id}`,
vehicle_id: slipData.vehicle_id,
vehicle_info: vehicle ? {
brand: vehicle.brand, brand: vehicle.brand,
model: vehicle.model, model: vehicle.model,
plate: vehicle.plate, plate: vehicle.plate,
@@ -98,36 +124,86 @@ export async function POST({ request }) {
model: 'Araç', model: 'Araç',
plate: 'Bilinmiyor', plate: 'Bilinmiyor',
year: 0 year: 0
}, };
fuel_type: slipData.fuel_type,
liters: parseFloat(slipData.liters), const personnelInfo = person ? {
km: parseInt(slipData.km),
personnel_id: slipData.personnel_id,
personnel_info: person ? {
full_name: person.full_name, full_name: person.full_name,
rank: person.rank rank: person.rank
} : { } : {
full_name: 'Bilinmeyen Personel', full_name: 'Bilinmeyen Personel',
rank: '' rank: ''
}, };
goods_manager_id: slipData.goods_manager_id,
goods_manager_info: goodsManager ? { const goodsManagerInfo = goodsManager ? {
full_name: goodsManager.full_name, full_name: goodsManager.full_name,
rank: goodsManager.rank rank: goodsManager.rank
} : { } : {
full_name: 'Bilinmeyen Mal Sorumlusu', full_name: 'Bilinmeyen Mal Sorumlusu',
rank: '' rank: ''
}, };
const fuelManagerInfo = { full_name: 'Yakıt Sorumlusu', rank: 'Yüzbaşı' };
const query = `
INSERT INTO fuel_slips (
date, force_command, unit_id, unit_name, vehicle_id, vehicle_info,
fuel_type, liters, km, personnel_id, personnel_info, goods_manager_id,
goods_manager_info, fuel_manager_id, fuel_manager_info, status, notes
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
`;
const params = [
slipData.date,
slipData.force_command,
slipData.unit_id,
unit?.name || `Birim ${slipData.unit_id}`,
slipData.vehicle_id,
JSON.stringify(vehicleInfo),
slipData.fuel_type,
parseFloat(slipData.liters),
parseInt(slipData.km),
slipData.personnel_id,
JSON.stringify(personnelInfo),
slipData.goods_manager_id,
JSON.stringify(goodsManagerInfo),
slipData.fuel_manager_id,
JSON.stringify(fuelManagerInfo),
'pending',
slipData.notes || ''
];
db.run(query, params, function(err) {
db.close();
if (err) {
console.error('Create fuel slip error:', err);
resolve(json({ message: 'Veritabanı hatası.' }, { status: 500 }));
return;
}
const newSlip = {
id: this.lastID,
date: slipData.date,
force_command: slipData.force_command,
unit_id: slipData.unit_id,
unit_name: unit?.name || `Birim ${slipData.unit_id}`,
vehicle_id: slipData.vehicle_id,
vehicle_info: vehicleInfo,
fuel_type: slipData.fuel_type,
liters: parseFloat(slipData.liters),
km: parseInt(slipData.km),
personnel_id: slipData.personnel_id,
personnel_info: personnelInfo,
goods_manager_id: slipData.goods_manager_id,
goods_manager_info: goodsManagerInfo,
fuel_manager_id: slipData.fuel_manager_id, fuel_manager_id: slipData.fuel_manager_id,
fuel_manager_info: { full_name: 'Yakıt Sorumlusu', rank: 'Yüzbaşı' }, fuel_manager_info: fuelManagerInfo,
status: 'pending', status: 'pending',
notes: slipData.notes || '', notes: slipData.notes || '',
created_at: new Date().toISOString() created_at: new Date().toISOString()
}; };
fuelSlips.push(newSlip);
console.log('✅ Fuel slip created:', newSlip); console.log('✅ Fuel slip created:', newSlip);
console.log('📊 Total slips now:', fuelSlips.length);
// Socket.IO ile mal sorumlusuna bildirim gönder // Socket.IO ile mal sorumlusuna bildirim gönder
const socketData = { const socketData = {
@@ -143,9 +219,11 @@ export async function POST({ request }) {
console.warn('⚠️ Socket notification could not be sent'); console.warn('⚠️ Socket notification could not be sent');
} }
return json({ resolve(json({
message: 'Yakıt fişi başarıyla oluşturuldu.', message: 'Yakıt fişi başarıyla oluşturuldu.',
fuelSlip: newSlip fuelSlip: newSlip
}));
});
}); });
} catch (error) { } catch (error) {
@@ -167,21 +245,54 @@ export async function PUT({ request }) {
return json({ message: 'Geçersiz durum.' }, { status: 400 }); return json({ message: 'Geçersiz durum.' }, { status: 400 });
} }
// Fiş bul return new Promise((resolve) => {
const slipIndex = fuelSlips.findIndex(slip => slip.id === parseInt(id)); const db = getDatabase();
if (slipIndex === -1) {
return json({ message: 'Fiş bulunamadı.' }, { status: 404 }); const query = `
UPDATE fuel_slips
SET status = ?, approval_date = ?, approval_notes = ?
WHERE id = ?
`;
const params = [
status,
new Date().toISOString(),
approval_notes || '',
parseInt(id)
];
db.run(query, params, function(err) {
if (err) {
db.close();
console.error('Update fuel slip error:', err);
resolve(json({ message: 'Veritabanı hatası.' }, { status: 500 }));
return;
}
if (this.changes === 0) {
db.close();
resolve(json({ message: 'Fiş bulunamadı.' }, { status: 404 }));
return;
}
// Güncellenmiş fişi getir
db.get('SELECT * FROM fuel_slips WHERE id = ?', [id], (err, row) => {
db.close();
if (err) {
console.error('Get updated fuel slip error:', err);
resolve(json({ message: 'Veritabanı hatası.' }, { status: 500 }));
return;
} }
// Fiş güncelle
const updatedSlip = { const updatedSlip = {
...fuelSlips[slipIndex], ...row,
status, vehicle_info: row.vehicle_info ? JSON.parse(row.vehicle_info) : null,
approval_date: new Date().toISOString(), personnel_info: row.personnel_info ? JSON.parse(row.personnel_info) : null,
approval_notes: approval_notes || '' goods_manager_info: row.goods_manager_info ? JSON.parse(row.goods_manager_info) : null,
fuel_manager_info: row.fuel_manager_info ? JSON.parse(row.fuel_manager_info) : null
}; };
fuelSlips[slipIndex] = updatedSlip;
console.log('✅ Fuel slip updated:', updatedSlip); console.log('✅ Fuel slip updated:', updatedSlip);
// Socket.IO ile yakıt sorumlusuna bildirim gönder // Socket.IO ile yakıt sorumlusuna bildirim gönder
@@ -200,9 +311,12 @@ export async function PUT({ request }) {
console.warn('⚠️ Socket notification could not be sent'); console.warn('⚠️ Socket notification could not be sent');
} }
return json({ resolve(json({
message: `Fiş başarıyla ${status === 'approved' ? 'onaylandı' : 'reddedildi'}.`, message: `Fiş başarıyla ${status === 'approved' ? 'onaylandı' : 'reddedildi'}.`,
fuelSlip: updatedSlip fuelSlip: updatedSlip
}));
});
});
}); });
} catch (error) { } catch (error) {
@@ -220,23 +334,52 @@ export async function DELETE({ request }) {
return json({ message: 'Fiş ID zorunludur.' }, { status: 400 }); return json({ message: 'Fiş ID zorunludur.' }, { status: 400 });
} }
// Fiş bul return new Promise((resolve) => {
const slipIndex = fuelSlips.findIndex(slip => slip.id === parseInt(id)); const db = getDatabase();
if (slipIndex === -1) {
return json({ message: 'Fiş bulunamadı.' }, { status: 404 }); // Önce fişin durumunu kontrol et
db.get('SELECT status FROM fuel_slips WHERE id = ?', [id], (err, row) => {
if (err) {
db.close();
console.error('Check fuel slip error:', err);
resolve(json({ message: 'Veritabanı hatası.' }, { status: 500 }));
return;
}
if (!row) {
db.close();
resolve(json({ message: 'Fiş bulunamadı.' }, { status: 404 }));
return;
} }
// Sadece pending olan fişler silinebilir // Sadece pending olan fişler silinebilir
if (fuelSlips[slipIndex].status !== 'pending') { if (row.status !== 'pending') {
return json({ message: 'Sadece bekleyen fişler silinebilir.' }, { status: 400 }); db.close();
resolve(json({ message: 'Sadece bekleyen fişler silinebilir.' }, { status: 400 }));
return;
} }
// Fiş sil // Fiş sil
const deletedSlip = fuelSlips.splice(slipIndex, 1)[0]; db.run('DELETE FROM fuel_slips WHERE id = ?', [id], function(err) {
db.close();
return json({ if (err) {
console.error('Delete fuel slip error:', err);
resolve(json({ message: 'Veritabanı hatası.' }, { status: 500 }));
return;
}
if (this.changes === 0) {
resolve(json({ message: 'Fiş bulunamadı.' }, { status: 404 }));
return;
}
resolve(json({
message: 'Fiş başarıyla silindi.', message: 'Fiş başarıyla silindi.',
fuelSlip: deletedSlip fuelSlipId: parseInt(id)
}));
});
});
}); });
} catch (error) { } catch (error) {

View File

@@ -100,6 +100,33 @@ async function initializeDatabase() {
{ username: 'ibrahim_kara', password: 'kara123', role: 'goods_manager', full_name: 'İbrahim Kara' } { username: 'ibrahim_kara', password: 'kara123', role: 'goods_manager', full_name: 'İbrahim Kara' }
]; ];
// Yakıt fişleri tablosu
db.run(`CREATE TABLE IF NOT EXISTS fuel_slips (
id INTEGER PRIMARY KEY AUTOINCREMENT,
date TEXT NOT NULL,
force_command TEXT NOT NULL,
unit_id INTEGER,
unit_name TEXT,
vehicle_id INTEGER,
vehicle_info TEXT,
fuel_type TEXT NOT NULL,
liters REAL NOT NULL,
km INTEGER,
personnel_id INTEGER,
personnel_info TEXT,
goods_manager_id INTEGER,
goods_manager_info TEXT,
fuel_manager_id INTEGER,
fuel_manager_info TEXT,
status TEXT DEFAULT 'pending',
notes TEXT,
approval_date TEXT,
approval_notes TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
)`, (err) => {
if (err) reject(err);
});
// Her kullanıcıyı kontrol et ve yoksa ekle // Her kullanıcıyı kontrol et ve yoksa ekle
users.forEach(async (user) => { users.forEach(async (user) => {
const hashedPassword = await bcrypt.hash(user.password, 10); const hashedPassword = await bcrypt.hash(user.password, 10);