Numex yayın: models/stockModel.js
This commit is contained in:
parent
9369bd6e51
commit
75ade8273b
105
models/stockModel.js
Normal file
105
models/stockModel.js
Normal file
|
|
@ -0,0 +1,105 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* stockModel.js
|
||||||
|
* Stok hareketleri veri katmanı — JSON dosya depolama.
|
||||||
|
* Her giriş/çıkış hareketini log'lar; ürün güncellemesi productModel'e bırakılır.
|
||||||
|
*/
|
||||||
|
|
||||||
|
const fs = require('fs');
|
||||||
|
const path = require('path');
|
||||||
|
|
||||||
|
const DATA_DIR = path.join(__dirname, '..', 'data');
|
||||||
|
const FILE_PATH = path.join(DATA_DIR, 'stockMovements.json');
|
||||||
|
|
||||||
|
function ensureDir() {
|
||||||
|
if (!fs.existsSync(DATA_DIR)) {
|
||||||
|
fs.mkdirSync(DATA_DIR, { recursive: true });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tüm hareket kayıtlarını okur.
|
||||||
|
* @returns {Array} hareket listesi
|
||||||
|
*/
|
||||||
|
function readMovements() {
|
||||||
|
try {
|
||||||
|
ensureDir();
|
||||||
|
if (!fs.existsSync(FILE_PATH)) return [];
|
||||||
|
const raw = fs.readFileSync(FILE_PATH, 'utf8');
|
||||||
|
const data = JSON.parse(raw);
|
||||||
|
return Array.isArray(data) ? data : [];
|
||||||
|
} catch (err) {
|
||||||
|
console.error('Stok hareket dosyası okunamadı:', err.message);
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hareket listesini yazar.
|
||||||
|
* @param {Array} movements hareket listesi
|
||||||
|
*/
|
||||||
|
function writeMovements(movements) {
|
||||||
|
ensureDir();
|
||||||
|
fs.writeFileSync(FILE_PATH, JSON.stringify(movements, null, 2), 'utf8');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sonraki hareket ID'si.
|
||||||
|
* @param {Array} movements hareket listesi
|
||||||
|
* @returns {number} yeni id
|
||||||
|
*/
|
||||||
|
function _nextId(movements) {
|
||||||
|
if (!movements.length) return 1;
|
||||||
|
return Math.max(...movements.map((m) => Number(m.id) || 0)) + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Yeni stok hareketi oluşturur ve kaydeder.
|
||||||
|
* @param {Object} params {productId, type, quantity, note, remainingStock}
|
||||||
|
* @returns {Object} hareket kaydı
|
||||||
|
*/
|
||||||
|
function addMovement({ productId, type, quantity, note, remainingStock }) {
|
||||||
|
const movements = readMovements();
|
||||||
|
const movement = {
|
||||||
|
id: _nextId(movements),
|
||||||
|
productId: Number(productId),
|
||||||
|
type: type === 'in' || type === 'out' ? type : 'in',
|
||||||
|
quantity: Number(quantity) || 0,
|
||||||
|
note: note ? String(note).trim() : '',
|
||||||
|
remainingStock: Number(remainingStock) !== undefined ? Number(remainingStock) : 0,
|
||||||
|
date: new Date().toISOString()
|
||||||
|
};
|
||||||
|
movements.push(movement);
|
||||||
|
writeMovements(movements);
|
||||||
|
return movement;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ürüne ait hareketleri tarih sıralı getirir (eski→yeni).
|
||||||
|
* @param {number} productId ürün ID
|
||||||
|
* @returns {Array} hareket listesi
|
||||||
|
*/
|
||||||
|
function getByProduct(productId) {
|
||||||
|
const movements = readMovements();
|
||||||
|
return movements
|
||||||
|
.filter((m) => m.productId === Number(productId))
|
||||||
|
.sort((a, b) => new Date(a.date) - new Date(b.date));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tüm hareketleri en yeni üstte getirir.
|
||||||
|
* @returns {Array} hareket listesi
|
||||||
|
*/
|
||||||
|
function getAll() {
|
||||||
|
const movements = readMovements();
|
||||||
|
return movements.sort((a, b) => new Date(b.date) - new Date(a.date));
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
readMovements,
|
||||||
|
addMovement,
|
||||||
|
getByProduct,
|
||||||
|
getAll,
|
||||||
|
_nextId
|
||||||
|
};
|
||||||
Loading…
Reference in New Issue
Block a user