|
|
const asyncHandler = require("../Middleware/async"); |
|
|
const sequelize = require('sequelize') |
|
|
const DBInfo = require("../Model/Database"); |
|
|
const ItemModel = require("../Model/ItemModel"); |
|
|
const CategoryModel = require("../Model/CategoryModel"); |
|
|
const ErrorResponse = require("../utils/ErrorResponse"); |
|
|
const SuccessResponse = require("../utils/SuccessResponse"); |
|
|
const fs = require('fs') |
|
|
const dateFormat = require("dateformat"); |
|
|
const path = require('path'); |
|
|
const { log } = require("console"); |
|
|
|
|
|
|
|
|
exports.getAllItemsByStore = asyncHandler(async (req, res, next) => { |
|
|
try { |
|
|
let items = await ItemModel.findAll({ |
|
|
where: { |
|
|
DB_CODE: req.user.DB_CODE |
|
|
} |
|
|
}); |
|
|
|
|
|
console.log("DB CODE ", req.user.DB_CODE); |
|
|
|
|
|
|
|
|
|
|
|
const folderPath = path.join(process.env.ITEM_IMAGE_LOCATION, req.user.DB_CODE); |
|
|
|
|
|
// Use Promise.all to wait for all promises to resolve |
|
|
items = await Promise.all(items.map(async (item) => { |
|
|
let itemObject = item.get({ plain: true }); |
|
|
|
|
|
try { |
|
|
// Get category name |
|
|
var category = await CategoryModel.findOne({ |
|
|
where: { |
|
|
ID: item.CAT_CODE, |
|
|
DB_CODE: req.user.DB_CODE |
|
|
} |
|
|
}); |
|
|
if (category) { |
|
|
itemObject.CAT_DESC_EN = category.DESC_EN; |
|
|
itemObject.CAT_DESC_KH = category.DESC_KH; |
|
|
itemObject.CAT_DESC_CN = category.DESC_CN; |
|
|
} |
|
|
} catch (catErr) { |
|
|
console.error("Error fetching category", catErr); |
|
|
// Optionally handle specific category fetch error |
|
|
} |
|
|
|
|
|
// Check existence of the image file |
|
|
const imagePath = path.join(folderPath, `${item.ITEM_CODE}.jpg`); |
|
|
itemObject.ITEM_IMG = fs.existsSync(imagePath) ? imagePath : ""; |
|
|
|
|
|
return itemObject; |
|
|
})); |
|
|
|
|
|
res.status(200).send({ |
|
|
success: true, |
|
|
data: items |
|
|
}); |
|
|
} catch (err) { |
|
|
console.error("ERROR GET ALL ITEMS", err); |
|
|
return next(new ErrorResponse(err.message, 400)); |
|
|
} |
|
|
}); |
|
|
|
|
|
exports.createItemByStore = asyncHandler(async (req, res, next) => { |
|
|
try { |
|
|
|
|
|
var date = dateFormat(new Date(), "yyyy-mm-dd HH:mm:ss") |
|
|
|
|
|
const data = JSON.parse(req.body['data']); |
|
|
const items = data['items']; |
|
|
var photo = req.file.path |
|
|
let imageData = fs.readFileSync(req.file.path) |
|
|
const itemCode = items['ITEM_CODE']; |
|
|
const itemBarCode = items['ITEM_BCODE'] |
|
|
const itemDes = items['ITEM_DESC']; |
|
|
const unitStock = items['UNIT_STOCK'] ?? '1'; |
|
|
const unitSale = items['UNIT_SALE'] ?? '1'; |
|
|
const catCode = items['CATE_CODE']; // CAT_CODE -> CAT_DETAIL_ID |
|
|
|
|
|
const itemCost1 = items['ITEM_COST1']; |
|
|
const itemPrice1 = items['ITEM_PRICE1']; |
|
|
|
|
|
if (!itemBarCode || !itemDes || !catCode || !itemCost1 || !itemPrice1) { |
|
|
throw ("Please provide all required fields"); |
|
|
} |
|
|
// var itemCode = await generateNextItemCode(); |
|
|
|
|
|
|
|
|
const existingItem = await ItemModel.findOne({ |
|
|
where: { |
|
|
ITEM_CODE: itemCode, |
|
|
DB_CODE: req.user.DB_CODE |
|
|
} |
|
|
}); |
|
|
|
|
|
if (existingItem) { |
|
|
throw (`ITEM_CODE ${itemCode} already exists`); |
|
|
} |
|
|
|
|
|
|
|
|
await ItemModel.sequelize.transaction(async (t) => { |
|
|
const item = await ItemModel.create({ |
|
|
ITEM_CODE: itemCode, |
|
|
ITEM_BCODE: itemBarCode, |
|
|
ITEM_DESC: itemDes, |
|
|
DB_CODE: req.user.DB_CODE, |
|
|
UNIT_STOCK: unitStock, |
|
|
UNIT_SALE: unitSale, |
|
|
CAT_CODE: catCode, |
|
|
ITEM_STAT: "A", |
|
|
USER_CREA: req.user.USER_NAME, |
|
|
DATE_CREA: date.toString(), |
|
|
ITEM_TYPE: "S", // S -> Kit Stock N -> Min Kit Stock I-> ដំណើរការទំនិញ |
|
|
ITEM_PRICE1: itemPrice1, |
|
|
ITEM_COST1: itemCost1, |
|
|
ITEM_COST2: 0, |
|
|
ITEM_PRICE2: 0, |
|
|
ITEM_CUS1: "", |
|
|
ITEM_CUS2: "", |
|
|
ITEM_CUS3: "", |
|
|
ITEM_CUS4: "", |
|
|
ITEM_CUS5: "", |
|
|
ITEM_CUS6: "", |
|
|
ITEM_CUS7: "", |
|
|
ITEM_CUS8: "", |
|
|
ITEM_CUS9_KH: "", |
|
|
ITEM_CUS10_KH: "", |
|
|
USER_UPDT: req.user.USER_NAME, |
|
|
DATE_UPDT: date, |
|
|
}) |
|
|
let folderPath = process.env.ITEM_IMAGE_LOCATION + "/" + req.user.DB_CODE + "/" |
|
|
if (!fs.existsSync(folderPath)) fs.mkdirSync(folderPath, { |
|
|
recursive: true, |
|
|
}) |
|
|
log("ITEM CODE ", item.ITEM_CODE) |
|
|
fs.writeFileSync(folderPath + item.ITEM_CODE + '.jpg', imageData) |
|
|
fs.unlinkSync(req.file.path) |
|
|
res.send(new SuccessResponse("Operation Successful")); |
|
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
} catch (err) { |
|
|
console.log("ERROR CREATE ITEM", err) |
|
|
fs.unlinkSync(req.file.path) |
|
|
return next(new ErrorResponse(err, 400)); |
|
|
} |
|
|
}) |
|
|
|
|
|
|
|
|
exports.checkIfItemExist = asyncHandler(async (req, res, next) => { |
|
|
try { |
|
|
const item = await ItemModel.findOne({ |
|
|
where: { |
|
|
ITEM_CODE: req.params.item_code, |
|
|
DB_CODE: req.user.DB_CODE |
|
|
} |
|
|
}) |
|
|
if (!item) { |
|
|
return next(new ErrorResponse("Item not found", 400)); |
|
|
} |
|
|
res.status(200).send({ |
|
|
success: true, |
|
|
data: item |
|
|
}) |
|
|
} catch (err) { |
|
|
console.log("ERROR CHECK ITEM", err) |
|
|
return next(new ErrorResponse(err, 400)); |
|
|
} |
|
|
} |
|
|
) |
|
|
|
|
|
|
|
|
async function generateNextItemCode() { |
|
|
try { |
|
|
|
|
|
|
|
|
const lastItem = await ItemModel.findOne({ |
|
|
order: [['ITEM_CODE', 'DESC']] |
|
|
}); |
|
|
console.log("LAST ITEM ", lastItem) |
|
|
if (!lastItem) { |
|
|
return '0001'; // Starting point if no suppliers are present |
|
|
} |
|
|
console.log("LAST ITEM CODE ", lastItem.ITEM_CODE) |
|
|
let nextCode = parseInt(lastItem.ITEM_CODE, 10) + 1; |
|
|
console.log("NEXT CODE ", nextCode) |
|
|
|
|
|
// Check if the number is less than 10000 for zero-padding |
|
|
if (nextCode < 10000) { |
|
|
return nextCode.toString().padStart(4, '0'); |
|
|
} else { |
|
|
// If it's 10000 or more, just return the number |
|
|
return nextCode.toString(); |
|
|
} |
|
|
} |
|
|
catch (e) { |
|
|
console.log("CATCH ERROR IN GENERATE ITEM CODE ", e) |
|
|
} |
|
|
} |