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();
// Status filtreleme let query = 'SELECT * FROM fuel_slips WHERE 1=1';
if (status) { const params = [];
filteredSlips = filteredSlips.filter(slip => slip.status === status);
}
// Mal sorumlusu filtreleme // Status filtreleme
if (manager_id) { if (status) {
filteredSlips = filteredSlips.filter(slip => slip.goods_manager_id == manager_id); query += ' AND status = ?';
} params.push(status);
}
// Yakıt sorumlusu filtreleme // Mal sorumlusu filtreleme
if (fuel_manager_id) { if (manager_id) {
filteredSlips = filteredSlips.filter(slip => slip.fuel_manager_id == fuel_manager_id); query += ' AND goods_manager_id = ?';
} params.push(manager_id);
}
// Tarihe göre ters sırala // Yakıt sorumlusu filtreleme
filteredSlips.sort((a, b) => new Date(b.created_at) - new Date(a.created_at)); if (fuel_manager_id) {
query += ' AND fuel_manager_id = ?';
params.push(fuel_manager_id);
}
return json({ fuelSlips: filteredSlips }); // Tarihe göre ters sırala
query += ' ORDER BY created_at DESC';
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
@@ -62,7 +93,7 @@ export async function POST({ request }) {
// Araç, personel ve mal sorumlusu bilgilerini getir // Araç, personel ve mal sorumlusu bilgilerini getir
const baseUrl = request.url.split('/api/')[0]; const baseUrl = request.url.split('/api/')[0];
const [vehiclesRes, unitsRes, personnelRes, goodsManagersRes] = await Promise.all([ const [vehiclesRes, unitsRes, personnelRes, goodsManagersRes] = await Promise.all([
fetch(`${baseUrl}/api/vehicles`).catch(() => null), fetch(`${baseUrl}/api/vehicles`).catch(() => null),
fetch(`${baseUrl}/api/units`).catch(() => null), fetch(`${baseUrl}/api/units`).catch(() => null),
@@ -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,54 +124,106 @@ 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: ''
}, };
fuel_manager_id: slipData.fuel_manager_id,
fuel_manager_info: { full_name: 'Yakıt Sorumlusu', rank: 'Yüzbaşı' },
status: 'pending',
notes: slipData.notes || '',
created_at: new Date().toISOString()
};
fuelSlips.push(newSlip); const fuelManagerInfo = { full_name: 'Yakıt Sorumlusu', rank: 'Yüzbaşı' };
console.log('✅ Fuel slip created:', newSlip);
console.log('📊 Total slips now:', fuelSlips.length);
// Socket.IO ile mal sorumlusuna bildirim gönder const query = `
const socketData = { INSERT INTO fuel_slips (
goods_manager_id: newSlip.goods_manager_id, date, force_command, unit_id, unit_name, vehicle_id, vehicle_info,
fuel_slip_id: newSlip.id, fuel_type, liters, km, personnel_id, personnel_info, goods_manager_id,
message: `${newSlip.vehicle_info.plate} plakalı araç için yeni yakıt fişi` goods_manager_info, fuel_manager_id, fuel_manager_info, status, notes
}; ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
console.log('📢 Sending socket notification: fuel-slip-assigned', socketData); `;
// Socket client kullanarak bildirim gönder const params = [
const sent = emitSocketEvent('fuel-slip-assigned', socketData); slipData.date,
if (!sent) { slipData.force_command,
console.warn('⚠️ Socket notification could not be sent'); 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 || ''
];
return json({ db.run(query, params, function(err) {
message: 'Yakıt fişi başarıyla oluşturuldu.', db.close();
fuelSlip: newSlip
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_info: fuelManagerInfo,
status: 'pending',
notes: slipData.notes || '',
created_at: new Date().toISOString()
};
console.log('✅ Fuel slip created:', newSlip);
// Socket.IO ile mal sorumlusuna bildirim gönder
const socketData = {
goods_manager_id: newSlip.goods_manager_id,
fuel_slip_id: newSlip.id,
message: `${newSlip.vehicle_info.plate} plakalı araç için yeni yakıt fişi`
};
console.log('📢 Sending socket notification: fuel-slip-assigned', socketData);
// Socket client kullanarak bildirim gönder
const sent = emitSocketEvent('fuel-slip-assigned', socketData);
if (!sent) {
console.warn('⚠️ Socket notification could not be sent');
}
resolve(json({
message: 'Yakıt fişi başarıyla oluşturuldu.',
fuelSlip: newSlip
}));
});
}); });
} catch (error) { } catch (error) {
@@ -167,42 +245,78 @@ 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 });
}
// Fiş güncelle const query = `
const updatedSlip = { UPDATE fuel_slips
...fuelSlips[slipIndex], SET status = ?, approval_date = ?, approval_notes = ?
status, WHERE id = ?
approval_date: new Date().toISOString(), `;
approval_notes: approval_notes || ''
};
fuelSlips[slipIndex] = updatedSlip; const params = [
console.log('✅ Fuel slip updated:', updatedSlip); status,
new Date().toISOString(),
approval_notes || '',
parseInt(id)
];
// Socket.IO ile yakıt sorumlusuna bildirim gönder db.run(query, params, function(err) {
const socketData = { if (err) {
goods_manager_id: updatedSlip.goods_manager_id, db.close();
fuel_manager_id: updatedSlip.fuel_manager_id, console.error('Update fuel slip error:', err);
fuel_slip_id: updatedSlip.id, resolve(json({ message: 'Veritabanı hatası.' }, { status: 500 }));
status: updatedSlip.status, return;
approval_notes: updatedSlip.approval_notes }
};
console.log('📢 Sending socket notification: fuel-slip-updated', socketData);
// Socket client kullanarak bildirim gönder if (this.changes === 0) {
const sent = emitSocketEvent('fuel-slip-updated', socketData); db.close();
if (!sent) { resolve(json({ message: 'Fiş bulunamadı.' }, { status: 404 }));
console.warn('⚠️ Socket notification could not be sent'); return;
} }
return json({ // Güncellenmiş fişi getir
message: `Fiş başarıyla ${status === 'approved' ? 'onaylandı' : 'reddedildi'}.`, db.get('SELECT * FROM fuel_slips WHERE id = ?', [id], (err, row) => {
fuelSlip: updatedSlip db.close();
if (err) {
console.error('Get updated fuel slip error:', err);
resolve(json({ message: 'Veritabanı hatası.' }, { status: 500 }));
return;
}
const updatedSlip = {
...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
};
console.log('✅ Fuel slip updated:', updatedSlip);
// Socket.IO ile yakıt sorumlusuna bildirim gönder
const socketData = {
goods_manager_id: updatedSlip.goods_manager_id,
fuel_manager_id: updatedSlip.fuel_manager_id,
fuel_slip_id: updatedSlip.id,
status: updatedSlip.status,
approval_notes: updatedSlip.approval_notes
};
console.log('📢 Sending socket notification: fuel-slip-updated', socketData);
// Socket client kullanarak bildirim gönder
const sent = emitSocketEvent('fuel-slip-updated', socketData);
if (!sent) {
console.warn('⚠️ Socket notification could not be sent');
}
resolve(json({
message: `Fiş başarıyla ${status === 'approved' ? 'onaylandı' : 'reddedildi'}.`,
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 });
}
// Sadece pending olan fişler silinebilir // Önce fişin durumunu kontrol et
if (fuelSlips[slipIndex].status !== 'pending') { db.get('SELECT status FROM fuel_slips WHERE id = ?', [id], (err, row) => {
return json({ message: 'Sadece bekleyen fişler silinebilir.' }, { status: 400 }); if (err) {
} db.close();
console.error('Check fuel slip error:', err);
resolve(json({ message: 'Veritabanı hatası.' }, { status: 500 }));
return;
}
// Fiş sil if (!row) {
const deletedSlip = fuelSlips.splice(slipIndex, 1)[0]; db.close();
resolve(json({ message: 'Fiş bulunamadı.' }, { status: 404 }));
return;
}
return json({ // Sadece pending olan fişler silinebilir
message: 'Fiş başarıyla silindi.', if (row.status !== 'pending') {
fuelSlip: deletedSlip db.close();
resolve(json({ message: 'Sadece bekleyen fişler silinebilir.' }, { status: 400 }));
return;
}
// Fiş sil
db.run('DELETE FROM fuel_slips WHERE id = ?', [id], function(err) {
db.close();
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.',
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);