Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
B
BookingMyHrManagement
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Registry
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Chanachai
BookingMyHrManagement
Commits
223b0d20
Commit
223b0d20
authored
Mar 12, 2025
by
Ooh-Ao
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
api all
parent
da3687c8
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
207 additions
and
208 deletions
+207
-208
borrowTransactionController.js
API/src/controllers/borrowTransactionController.js
+101
-79
projectEquipmentController.js
API/src/controllers/projectEquipmentController.js
+78
-66
BorrowTransaction.js
API/src/models/BorrowTransaction.js
+12
-51
Equipment.js
API/src/models/Equipment.js
+5
-0
borrowTransactionRoutes.js
API/src/routes/borrowTransactionRoutes.js
+11
-12
No files found.
API/src/controllers/borrowTransactionController.js
View file @
223b0d20
// 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
:
new
Transaction
borrowTransaction
:
new
BorrowTx
});
}
catch
(
error
)
{
console
.
error
(
error
);
re
turn
re
s
.
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
);
re
turn
re
s
.
status
(
500
).
json
({
error
:
error
.
message
});
res
.
status
(
500
).
json
({
error
:
error
.
message
});
}
};
/**
*
ดึงข้อมูลการยืมตาม borrow_id (Read One)
*
ตัวอย่างฟังก์ชันอื่นๆ (getAll, getById, delete) ...
*/
exports
.
get
BorrowTransactionById
=
async
(
req
,
res
)
=>
{
exports
.
get
AllBorrowTransactions
=
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
);
re
turn
re
s
.
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
);
re
turn
re
s
.
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
);
re
turn
re
s
.
status
(
500
).
json
({
error
:
error
.
message
});
res
.
status
(
500
).
json
({
error
:
error
.
message
});
}
};
API/src/controllers/projectEquipmentController.js
View file @
223b0d20
...
...
@@ -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
});
}
};
API/src/models/BorrowTransaction.js
View file @
223b0d20
// 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
;
API/src/models/Equipment.js
View file @
223b0d20
...
...
@@ -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
,
...
...
API/src/routes/borrowTransactionRoutes.js
View file @
223b0d20
// 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
;
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment