Commit 223b0d20 by Ooh-Ao

api all

parent da3687c8
// controllers/borrowTransactionController.js
const BorrowTransaction = require('../models/BorrowTransaction');
const ProjectEquipment = require('../models/ProjectEquipment');
const Equipment = require('../models/Equipment');
/**
* สร้างรายการยืมอุปกรณ์ (Create)
* CREATE: เมื่อพนักงานกดยืมอุปกรณ์
* - ตรวจสอบว่ามี ProjectEquipment (pe_id) นี้จริงหรือไม่
* - ลดจำนวนใน project_equipments
* - สร้างรายการ borrow_transactions
*/
exports.createBorrowTransaction = async (req, res) => {
try {
// ข้อมูลจาก body เช่น: { user_id, project_id, equipment_id, quantity_borrowed, ... }
// รับฟิลด์จำเป็นจาก req.body
// เช่น { pe_id, quantity_borrowed, status, ...}
const {
user_id,
project_id,
equipment_id,
pe_id,
quantity_borrowed,
borrowed_date,
due_date,
status,
status
} = req.body;
const newTransaction = await BorrowTransaction.create({
user_id,
project_id,
equipment_id,
// 1) หาแถว project_equipments จาก pe_id
const projectEquipment = await ProjectEquipment.findByPk(pe_id);
if (!projectEquipment) {
return res.status(404).json({ error: 'ProjectEquipment not found' });
}
// 2) ตรวจสอบว่าจำนวนใน project_equipments พอไหม
if (projectEquipment.quantity_in_project < quantity_borrowed) {
return res.status(400).json({ error: 'Not enough equipment in project' });
}
// 3) ลดจำนวน
const updatedQty = projectEquipment.quantity_in_project - quantity_borrowed;
await projectEquipment.update({ quantity_in_project: updatedQty });
// 4) สร้าง BorrowTransaction
const newBorrowTx = await BorrowTransaction.create({
pe_id, // เก็บ pe_id ใน borrow_transactions
quantity_borrowed,
borrowed_date,
due_date,
status,
status: status || 'borrowed'
});
return res.status(201).json({
message: 'BorrowTransaction created successfully',
borrowTransaction: newTransaction
borrowTransaction: newBorrowTx
});
} catch (error) {
console.error(error);
return res.status(500).json({ error: error.message });
res.status(500).json({ error: error.message });
}
};
/**
* ดึงข้อมูลการยืมทั้งหมด (Read All)
* UPDATE: เมื่อมีการเปลี่ยนสถานะ (เช่น คืนอุปกรณ์)
* - ถ้า status เปลี่ยนเป็น "returned" -> ถ้าเป็นอุปกรณ์ is_returnable => บวกจำนวนคืน
*/
exports.getAllBorrowTransactions = async (req, res) => {
exports.updateBorrowTransaction = async (req, res) => {
try {
const transactions = await BorrowTransaction.findAll();
return res.status(200).json(transactions);
const { id } = req.params; // borrow_id
const { status } = req.body; // สมมติว่าเราอัปเดตแค่ status, หรืออาจมี field อื่น
// 1) ค้นหา borrow_transaction เดิม
const borrowTx = await BorrowTransaction.findByPk(id);
if (!borrowTx) {
return res.status(404).json({ error: 'BorrowTransaction not found' });
}
// 2) ถ้าเปลี่ยน status -> "returned"
if (status === 'returned') {
// 2.1) หา ProjectEquipment
const projectEquipment = await ProjectEquipment.findByPk(borrowTx.pe_id);
if (!projectEquipment) {
return res.status(404).json({ error: 'ProjectEquipment not found' });
}
// 2.2) ตรวจสอบว่าอุปกรณ์ returnable ไหม
// ต้องใช้ equipment_id จาก projectEquipment มาเชื่อมตาราง equipments
const equipment = await Equipment.findByPk(projectEquipment.equipment_id);
if (!equipment) {
return res.status(404).json({ error: 'Equipment not found' });
}
// ถ้าเป็นอุปกรณ์ต้องคืน is_returnable = true -> บวกคืน
if (equipment.is_returnable) {
const updatedQty = projectEquipment.quantity_in_project + borrowTx.quantity_borrowed;
await projectEquipment.update({ quantity_in_project: updatedQty });
}
// อัปเดตฟิลด์อื่นๆ (เช่น returned_date)
await borrowTx.update({
status: 'returned',
returned_date: new Date()
});
return res.status(200).json({
message: 'BorrowTransaction returned successfully',
borrowTransaction: borrowTx
});
}
// 3) กรณีอัปเดต status อื่นๆ (ไม่ใช่ returned)
// ตัวอย่างเช่น update เป็น 'canceled', 'pending', ...
// สามารถใส่ logic เพิ่มได้ตามต้องการ
await borrowTx.update({ status });
return res.status(200).json({
message: 'BorrowTransaction updated successfully',
borrowTransaction: borrowTx
});
} catch (error) {
console.error(error);
return res.status(500).json({ error: error.message });
res.status(500).json({ error: error.message });
}
};
/**
* ดึงข้อมูลการยืมตาม borrow_id (Read One)
* ตัวอย่างฟังก์ชันอื่นๆ (getAll, getById, delete) ...
*/
exports.getBorrowTransactionById = async (req, res) => {
exports.getAllBorrowTransactions = async (req, res) => {
try {
const { id } = req.params; // borrow_id
const transaction = await BorrowTransaction.findByPk(id);
if (!transaction) {
return res.status(404).json({ error: 'BorrowTransaction not found' });
}
return res.status(200).json(transaction);
const list = await BorrowTransaction.findAll();
res.status(200).json(list);
} catch (error) {
console.error(error);
return res.status(500).json({ error: error.message });
res.status(500).json({ error: error.message });
}
};
/**
* อัปเดตข้อมูลการยืม (Update)
*/
exports.updateBorrowTransaction = async (req, res) => {
exports.getBorrowTransactionById = async (req, res) => {
try {
const { id } = req.params;
const {
user_id,
project_id,
equipment_id,
quantity_borrowed,
borrowed_date,
due_date,
returned_date,
status,
} = req.body;
const [rowsUpdated] = await BorrowTransaction.update({
user_id,
project_id,
equipment_id,
quantity_borrowed,
borrowed_date,
due_date,
returned_date,
status
}, {
where: { borrow_id: id },
});
if (!rowsUpdated) {
return res.status(404).json({ error: 'BorrowTransaction not found or no changes' });
const tx = await BorrowTransaction.findByPk(id);
if (!tx) {
return res.status(404).json({ error: 'BorrowTransaction not found' });
}
// ดึงข้อมูลใหม่ที่เพิ่งอัปเดต
const updatedTransaction = await BorrowTransaction.findByPk(id);
return res.status(200).json({
message: 'BorrowTransaction updated successfully',
borrowTransaction: updatedTransaction,
});
return res.status(200).json(tx);
} catch (error) {
console.error(error);
return res.status(500).json({ error: error.message });
res.status(500).json({ error: error.message });
}
};
/**
* ลบข้อมูลการยืม (Delete)
*/
exports.deleteBorrowTransaction = async (req, res) => {
try {
const { id } = req.params;
const rowsDeleted = await BorrowTransaction.destroy({ where: { borrow_id: id } });
if (!rowsDeleted) {
return res.status(404).json({ error: 'BorrowTransaction not found' });
}
return res.status(200).json({ message: 'BorrowTransaction deleted successfully' });
return res.status(200).json({ message: 'BorrowTransaction deleted' });
} catch (error) {
console.error(error);
return res.status(500).json({ error: error.message });
res.status(500).json({ error: error.message });
}
};
......@@ -6,101 +6,113 @@ const ProjectEquipment = require('../models/ProjectEquipment');
* สร้างข้อมูล ProjectEquipment ใหม่ (Create)
*/
exports.createProjectEquipment = async (req, res) => {
try {
// ข้อมูลจาก body เช่น { project_id, equipment_id, quantity_in_project }
const { project_id, equipment_id, quantity_in_project } = req.body;
const newPE = await ProjectEquipment.create({
project_id,
equipment_id,
quantity_in_project
});
return res.status(201).json({
message: 'ProjectEquipment created successfully',
projectEquipment: newPE
});
} catch (error) {
console.error(error);
return res.status(500).json({ error: error.message });
}
try {
// ข้อมูลจาก body เช่น { project_id, equipment_id, quantity_in_project }
const { project_id, equipment_id, quantity_in_project } = req.body;
const newPE = await ProjectEquipment.create({
project_id,
equipment_id,
quantity_in_project
});
return res.status(201).json({
message: 'ProjectEquipment created successfully',
projectEquipment: newPE
});
} catch (error) {
console.error(error);
return res.status(500).json({ error: error.message });
}
};
/**
* ดึงข้อมูล ProjectEquipments ทั้งหมด (Read All)
*/
exports.getAllProjectEquipments = async (req, res) => {
try {
const pes = await ProjectEquipment.findAll();
return res.status(200).json(pes);
} catch (error) {
console.error(error);
return res.status(500).json({ error: error.message });
}
try {
const pes = await ProjectEquipment.findAll();
return res.status(200).json(pes);
} catch (error) {
console.error(error);
return res.status(500).json({ error: error.message });
}
};
/**
* ดึงข้อมูล ProjectEquipment ตาม pe_id (Read One)
*/
exports.getProjectEquipmentById = async (req, res) => {
try {
const { id } = req.params; // pe_id
const pe = await ProjectEquipment.findByPk(id);
try {
const { id } = req.params; // pe_id
const pe = await ProjectEquipment.findByPk(id);
if (!pe) {
return res.status(404).json({ error: 'ProjectEquipment not found' });
if (!pe) {
return res.status(404).json({ error: 'ProjectEquipment not found' });
}
return res.status(200).json(pe);
} catch (error) {
console.error(error);
return res.status(500).json({ error: error.message });
}
return res.status(200).json(pe);
} catch (error) {
console.error(error);
return res.status(500).json({ error: error.message });
}
};
/**
* อัปเดตข้อมูล ProjectEquipment (Update)
*/
exports.updateProjectEquipment = async (req, res) => {
try {
const { id } = req.params;
const { project_id, equipment_id, quantity_in_project } = req.body;
try {
// ดึง pe_id จากพารามิเตอร์ URL
const { id } = req.params;
const [rowsUpdated] = await ProjectEquipment.update(
{ project_id, equipment_id, quantity_in_project },
{ where: { pe_id: id } }
);
// สมมติเรารับข้อมูลใหม่มาจาก req.body
const { project_id, equipment_id, quantity_in_project } = req.body;
if (!rowsUpdated) {
return res.status(404).json({ error: 'ProjectEquipment not found or no changes' });
}
// ขั้นตอนที่ 1: ค้นหา ProjectEquipment ด้วย pe_id
const pe = await ProjectEquipment.findByPk(id);
if (!pe) {
// ถ้าไม่พบ record ที่ pe_id ตรงนี้ ให้ส่ง 404 กลับ
return res.status(404).json({ error: 'ProjectEquipment not found' });
}
// ดึงข้อมูลใหม่หลังอัปเดต
const updatedPE = await ProjectEquipment.findByPk(id);
return res.status(200).json({
message: 'ProjectEquipment updated successfully',
projectEquipment: updatedPE
});
} catch (error) {
console.error(error);
return res.status(500).json({ error: error.message });
}
// ขั้นตอนที่ 2: อัปเดตค่าตามฟิลด์ที่อนุญาต
// ตัวอย่างอัปเดต project_id, equipment_id, quantity_in_project
// (ปรับตามโครงสร้างจริงของคุณ)
await pe.update({
project_id,
equipment_id,
quantity_in_project
});
// ดึงค่าที่เพิ่งอัปเดต (pe จะอัปเดตในตัวแล้ว แต่ถ้าอยากเพิ่มความชัดเจน ก็ findOne ซ้ำได้)
// const updatedPE = await ProjectEquipment.findByPk(id);
return res.status(200).json({
message: 'ProjectEquipment updated successfully',
projectEquipment: pe // หรือ updatedPE
});
} catch (error) {
console.error(error);
return res.status(500).json({ error: error.message });
}
};
/**
* ลบข้อมูล ProjectEquipment (Delete)
*/
exports.deleteProjectEquipment = async (req, res) => {
try {
const { id } = req.params;
const rowsDeleted = await ProjectEquipment.destroy({ where: { pe_id: id } });
try {
const { id } = req.params;
const rowsDeleted = await ProjectEquipment.destroy({ where: { pe_id: id } });
if (!rowsDeleted) {
return res.status(404).json({ error: 'ProjectEquipment not found' });
}
if (!rowsDeleted) {
return res.status(404).json({ error: 'ProjectEquipment not found' });
}
return res.status(200).json({ message: 'ProjectEquipment deleted successfully' });
} catch (error) {
console.error(error);
return res.status(500).json({ error: error.message });
}
return res.status(200).json({ message: 'ProjectEquipment deleted successfully' });
} catch (error) {
console.error(error);
return res.status(500).json({ error: error.message });
}
};
// models/BorrowTransaction.js
const { DataTypes } = require('sequelize');
const sequelize = require('../config/database');
const BorrowTransaction = sequelize.define('BorrowTransaction', {
borrow_id: {
type: DataTypes.UUID,
defaultValue: DataTypes.UUIDV4, // สร้าง UUID อัตโนมัติ
primaryKey: true,
defaultValue: DataTypes.UUIDV4,
primaryKey: true
},
user_id: {
// อ้างอิงแถวใน project_equipments โดย pe_id
pe_id: {
type: DataTypes.UUID,
allowNull: false,
// references: {
// model: 'users',
// key: 'user_id'
// }
},
project_id: {
type: DataTypes.UUID,
allowNull: false,
// references: {
// model: 'projects',
// key: 'project_id'
// }
},
equipment_id: {
type: DataTypes.UUID,
allowNull: false,
// references: {
// model: 'equipments',
// key: 'equipment_id'
// }
allowNull: false
// references: { model: 'project_equipments', key: 'pe_id' }
},
quantity_borrowed: {
type: DataTypes.INTEGER,
allowNull: false,
defaultValue: 1,
},
borrowed_date: {
type: DataTypes.DATE,
allowNull: false,
defaultValue: DataTypes.NOW,
},
due_date: {
type: DataTypes.DATE,
allowNull: true,
},
returned_date: {
type: DataTypes.DATE,
allowNull: true,
defaultValue: 1
},
status: {
type: DataTypes.STRING(50),
allowNull: false,
defaultValue: 'borrowed', // เช่น: borrowed, returned, pending, ฯลฯ
defaultValue: 'borrowed' // หรือ 'returned', 'pending' ฯลฯ
},
created_at: {
type: DataTypes.DATE,
allowNull: false,
defaultValue: DataTypes.NOW,
},
updated_at: {
returned_date: {
type: DataTypes.DATE,
allowNull: false,
defaultValue: DataTypes.NOW,
allowNull: true
},
// ...
}, {
tableName: 'borrow_transactions',
timestamps: false, // ถ้าไม่ต้องการให้ Sequelize จัดการ createdAt, updatedAt อัตโนมัติ
timestamps: false
});
module.exports = BorrowTransaction;
......@@ -21,6 +21,11 @@ const Equipment = sequelize.define('Equipment', {
allowNull: false,
defaultValue: 0,
},
is_returnable: {
type: DataTypes.BOOLEAN,
allowNull: false,
defaultValue: true, // true = ต้องคืน, false = ไม่ต้องคืน
},
location: {
type: DataTypes.STRING(255),
allowNull: true,
......
// routes/borrowTransactionRoutes.js
const express = require('express');
const router = express.Router();
const borrowTxController = require('../controllers/borrowTransactionController');
const ctrl = require('../controllers/borrowTransactionController');
// สร้างรายการยืม
router.post('/', borrowTxController.createBorrowTransaction);
// CREATE (ยืม)
router.post('/', ctrl.createBorrowTransaction);
// ดึงข้อมูลทั้งหมด
router.get('/', borrowTxController.getAllBorrowTransactions);
// UPDATE (เช่น คืนอุปกรณ์ หรือเปลี่ยนสถานะ)
router.put('/:id', ctrl.updateBorrowTransaction);
// ดึงข้อมูลตาม borrow_id
router.get('/:id', borrowTxController.getBorrowTransactionById);
// GET ALL
router.get('/', ctrl.getAllBorrowTransactions);
// อัปเดตข้อมูลการยืม
router.put('/:id', borrowTxController.updateBorrowTransaction);
// GET ONE
router.get('/:id', ctrl.getBorrowTransactionById);
// ลบการยืม
router.delete('/:id', borrowTxController.deleteBorrowTransaction);
// DELETE
router.delete('/:id', ctrl.deleteBorrowTransaction);
module.exports = router;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment