add: export excell sparepart

This commit is contained in:
2025-11-25 11:52:51 +07:00
parent 778d6f98e8
commit ca973d931f
5 changed files with 177 additions and 33 deletions

View File

@@ -1,43 +1,56 @@
const SparepartService = require('../services/sparepart.service'); const SparepartService = require("../services/sparepart.service");
const { setResponse, setResponsePaging, checkValidate } = require('../helpers/utils'); const {
setResponse,
setResponsePaging,
checkValidate,
} = require("../helpers/utils");
const ExcelJS = require("exceljs");
const { const {
insertSparepartSchema, insertSparepartSchema,
updateSparepartSchema, updateSparepartSchema,
} = require('../validate/sparepart.schema'); } = require("../validate/sparepart.schema");
class SparepartController { class SparepartController {
static async getAll(req, res) { static async getAll(req, res) {
const queryParams = req.query; const queryParams = req.query;
const results = await SparepartService.getAllSparepart(queryParams); const results = await SparepartService.getAllSparepart(queryParams);
const response = await setResponsePaging(queryParams, results, 'Sparepart found'); const response = await setResponsePaging(
queryParams,
results,
"Sparepart found"
);
res.status(response.statusCode).json(response); res.status(response.statusCode).json(response);
} }
static async getById(req, res) { static async getById(req, res) {
const { id } = req.params; const { id } = req.params;
const results = await SparepartService.getSparepartById(id); const results = await SparepartService.getSparepartById(id);
const response = await setResponse(results, 'Sparepart found'); const response = await setResponse(results, "Sparepart found");
res.status(response.statusCode).json(response); res.status(response.statusCode).json(response);
} }
static async create(req, res) { static async create(req, res) {
const { error, value } = await checkValidate(insertSparepartSchema, req); const { error, value } = await checkValidate(insertSparepartSchema, req);
if (error) { if (error) {
return res.status(400).json(setResponse(error, 'Validation failed', 400)); return res.status(400).json(setResponse(error, "Validation failed", 400));
} }
try { try {
if (req.file) { if (req.file) {
const file = req.file; const file = req.file;
const ext = require('path').extname(file.originalname).toLowerCase(); const ext = require("path").extname(file.originalname).toLowerCase();
const typeDoc = ext === ".pdf" ? "PDF" : "IMAGE"; const typeDoc = ext === ".pdf" ? "PDF" : "IMAGE";
const folder = typeDoc === "PDF" ? "pdf" : "images"; const folder = typeDoc === "PDF" ? "pdf" : "images";
const pathDocument = `${folder}/${file.filename}`; const pathDocument = `${folder}/${file.filename}`;
value.sparepart_foto = pathDocument; value.sparepart_foto = pathDocument;
} }
value.userId = req.user.user_id value.userId = req.user.user_id;
const results = await SparepartService.createSparepart(value); const results = await SparepartService.createSparepart(value);
const response = await setResponse(results, 'Sparepart created successfully'); const response = await setResponse(
results,
"Sparepart created successfully"
);
return res.status(response.statusCode).json(response); return res.status(response.statusCode).json(response);
} catch (err) { } catch (err) {
const response = setResponse([], err.message, err.statusCode || 500); const response = setResponse([], err.message, err.statusCode || 500);
@@ -49,32 +62,137 @@ class SparepartController {
const { id } = req.params; const { id } = req.params;
const { error, value } = await checkValidate(updateSparepartSchema, req); const { error, value } = await checkValidate(updateSparepartSchema, req);
if (error) { if (error) {
return res.status(400).json(setResponse(error, 'Validation failed', 400)); return res.status(400).json(setResponse(error, "Validation failed", 400));
} }
try { try {
if (req.file) { if (req.file) {
const file = req.file; const file = req.file;
const ext = require('path').extname(file.originalname).toLowerCase(); const ext = require("path").extname(file.originalname).toLowerCase();
const typeDoc = ext === ".pdf" ? "PDF" : "IMAGE"; const typeDoc = ext === ".pdf" ? "PDF" : "IMAGE";
const folder = typeDoc === "PDF" ? "pdf" : "images"; const folder = typeDoc === "PDF" ? "pdf" : "images";
const pathDocument = `${folder}/${file.filename}`; const pathDocument = `${folder}/${file.filename}`;
value.sparepart_foto = pathDocument; value.sparepart_foto = pathDocument;
} }
value.userId = req.user.user_id value.userId = req.user.user_id;
const results = await SparepartService.updateSparepart(id, value); const results = await SparepartService.updateSparepart(id, value);
const response = await setResponse(results, 'Sparepart updated successfully'); const response = await setResponse(
results,
"Sparepart updated successfully"
);
res.status(response.statusCode).json(response); res.status(response.statusCode).json(response);
} catch (err) { } catch (err) {
const response = setResponse([], err.message, err.statusCode || 500); const response = setResponse([], err.message, err.statusCode || 500);
res.status(response.statusCode).json(response); res.status(response.statusCode).json(response);
} }
} }
static async exportExcel(req, res) {
try {
const queryParams = req.query || {};
queryParams.limit = null;
const results = await SparepartService.getAllSparepart(queryParams);
const ExcelJS = require("exceljs");
const fs = require("fs");
const path = require("path");
const workbook = new ExcelJS.Workbook();
const worksheet = workbook.addWorksheet("Sparepart Data");
worksheet.columns = [
{ header: "Name Sparepart", key: "sparepart_name", width: 30 },
{ header: "Code Sparepart", key: "sparepart_code", width: 20 },
{ header: "QTY Sparepart", key: "sparepart_qty", width: 15 },
{ header: "Merk", key: "sparepart_merk", width: 20 },
{ header: "Model", key: "sparepart_model", width: 20 },
{ header: "Unit", key: "sparepart_unit", width: 10 },
{ header: "Stock", key: "sparepart_stok", width: 10 },
{ header: "Foto", key: "sparepart_foto", width: 25 },
{ header: "Item Type", key: "sparepart_item_type", width: 25 },
{ header: "Dibuat Pada", key: "created_at", width: 20 },
];
worksheet.addRows(
results.data.map((item) => ({
sparepart_name: item.sparepart_name,
sparepart_code: item.sparepart_code,
sparepart_qty: item.sparepart_qty,
sparepart_merk: item.sparepart_merk,
sparepart_model: item.sparepart_model,
sparepart_unit: item.sparepart_unit,
sparepart_stok: item.sparepart_stok,
sparepart_foto: "",
sparepart_item_type: item.sparepart_item_type,
created_at: item.created_at,
}))
);
for (let i = 0; i < results.data.length; i++) {
const item = results.data[i];
const rowNumber = i + 2;
if (!item.sparepart_foto) continue;
let foto = item.sparepart_foto.trim();
foto = foto.replace(/^images\//, "");
const fullPath = path.resolve(process.cwd(), "uploads", "images", foto);
if (fs.existsSync(fullPath)) {
const ext = fullPath.split(".").pop().toLowerCase();
const imageId = workbook.addImage({
filename: fullPath,
extension: ext,
});
worksheet.addImage(imageId, {
tl: { col: 7, row: rowNumber - 1 },
ext: { width: 80, height: 80 },
});
worksheet.getRow(rowNumber).height = 70;
}
}
worksheet.getRow(1).eachCell((cell) => {
cell.font = { bold: true };
cell.alignment = { horizontal: "center" };
});
const buffer = await workbook.xlsx.writeBuffer();
res.setHeader(
"Content-Type",
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
);
res.setHeader(
"Content-Disposition",
"attachment; filename=sparepart_data.xlsx"
);
return res.send(buffer);
} catch (error) {
console.log("Export Excel Error:", error);
return res.status(500).json({
message: error.message,
});
}
}
static async delete(req, res) { static async delete(req, res) {
const { id } = req.params; const { id } = req.params;
const results = await SparepartService.deleteSparepart(id, req.user.user_id); const results = await SparepartService.deleteSparepart(
const response = await setResponse(results, 'Sparepart deleted successfully'); id,
req.user.user_id
);
const response = await setResponse(
results,
"Sparepart deleted successfully"
);
res.status(response.statusCode).json(response); res.status(response.statusCode).json(response);
} }
} }
module.exports = SparepartController; module.exports = SparepartController;

View File

@@ -1,19 +1,45 @@
const express = require('express'); const express = require("express");
const SparepartController = require('../controllers/sparepart.controller'); const SparepartController = require("../controllers/sparepart.controller");
const verifyToken = require('../middleware/verifyToken'); const verifyToken = require("../middleware/verifyToken");
const verifyAccess = require('../middleware/verifyAccess'); const verifyAccess = require("../middleware/verifyAccess");
const upload = require('../middleware/uploads'); const upload = require("../middleware/uploads");
const router = express.Router(); const router = express.Router();
router.route('/') router.get(
.get(verifyToken.verifyAccessToken, SparepartController.getAll) "/export",
.post(verifyToken.verifyAccessToken, verifyAccess(), upload.single('sparepart_foto') verifyToken.verifyAccessToken,
, SparepartController.create); SparepartController.exportExcel
);
router.route('/:id') router
.route("/")
.get(verifyToken.verifyAccessToken, SparepartController.getAll)
.post(
verifyToken.verifyAccessToken,
verifyAccess(),
upload.single("sparepart_foto"),
SparepartController.create
);
router
.route("/:id")
.get(verifyToken.verifyAccessToken, SparepartController.getById) .get(verifyToken.verifyAccessToken, SparepartController.getById)
.put(verifyToken.verifyAccessToken, verifyAccess(), upload.single('sparepart_foto') .put(
, SparepartController.update) verifyToken.verifyAccessToken,
.delete(verifyToken.verifyAccessToken, verifyAccess(), SparepartController.delete); verifyAccess(),
upload.single("sparepart_foto"),
module.exports = router; SparepartController.update
)
.delete(
verifyToken.verifyAccessToken,
verifyAccess(),
SparepartController.delete
);
router.get(
"/export",
verifyToken.verifyAccessToken,
SparepartController.exportExcel
);
module.exports = router;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 113 KiB

View File

Before

Width:  |  Height:  |  Size: 122 KiB

After

Width:  |  Height:  |  Size: 122 KiB