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