88 lines
4.3 KiB
JavaScript
88 lines
4.3 KiB
JavaScript
'use strict';
|
|
// routes/woHeaderProfiles.js — Work Order print/PDF "Header Details" as a
|
|
// list of named profiles (Blood Bag / CAPD / Accessories / …), each mapped
|
|
// to a set of SAP Item Groups, instead of one flat global config. See
|
|
// services/woHeaderProfileStore.js for the full design note.
|
|
//
|
|
// List/read is open to any authenticated user — work-order-print.html (any
|
|
// user who can print a Work Order) needs to fetch this to resolve which
|
|
// profile applies. Managing profiles (create/edit/delete/set-default) is
|
|
// gated by the 'work_order:approved_mgr_qa' approval step — the same step
|
|
// that already represents "QA Manager" for Work Order approval in this app
|
|
// — rather than requiring full Admin access. Admins always bypass via
|
|
// hasStepPerm's own role check.
|
|
const express = require('express');
|
|
const router = express.Router();
|
|
const { verifyToken, hasStepPerm } = require('../middleware/auth');
|
|
|
|
const store = () => require('../services/woHeaderProfileStore');
|
|
|
|
function requireQaManagerEdit(req, res, next) {
|
|
if (hasStepPerm(req.user, 'work_order:approved_mgr_qa', 'edit')) return next();
|
|
res.status(403).json({ success: false, message: 'You are not assigned "edit" on approval step: work_order:approved_mgr_qa' });
|
|
}
|
|
|
|
router.get('/', verifyToken, async (req, res) => {
|
|
try {
|
|
const data = await store().listProfiles();
|
|
res.json({ success: true, data });
|
|
} catch (err) { res.status(500).json({ success: false, message: err.message }); }
|
|
});
|
|
|
|
router.get('/:id', verifyToken, async (req, res) => {
|
|
try {
|
|
const r = await store().findById(req.params.id);
|
|
if (!r || r.isDeleted) return res.status(404).json({ success: false, message: 'Not found' });
|
|
res.json({ success: true, data: r });
|
|
} catch (err) { res.status(500).json({ success: false, message: err.message }); }
|
|
});
|
|
|
|
router.post('/', verifyToken, requireQaManagerEdit, async (req, res) => {
|
|
try {
|
|
const b = req.body || {};
|
|
if (!(b.name || '').trim()) return res.status(400).json({ success: false, message: 'Name is required' });
|
|
const saved = await store().createProfile({
|
|
name: b.name.trim(), itemGroups: Array.isArray(b.itemGroups) ? b.itemGroups.map(String) : [],
|
|
companyName: b.companyName || '', companyAddress: b.companyAddress || '', formNo: b.formNo || '',
|
|
effectiveDate: b.effectiveDate || '', reviewDate: b.reviewDate || '', logo: b.logo || '',
|
|
createdBy: req.user.username, createdByName: req.user.name || req.user.username,
|
|
});
|
|
res.json({ success: true, data: saved });
|
|
} catch (err) { res.status(500).json({ success: false, message: err.message }); }
|
|
});
|
|
|
|
router.put('/:id', verifyToken, requireQaManagerEdit, async (req, res) => {
|
|
try {
|
|
const existing = await store().findById(req.params.id);
|
|
if (!existing || existing.isDeleted) return res.status(404).json({ success: false, message: 'Not found' });
|
|
const b = req.body || {};
|
|
if (!(b.name || '').trim()) return res.status(400).json({ success: false, message: 'Name is required' });
|
|
const updated = await store().updateProfile(req.params.id, {
|
|
name: b.name.trim(), itemGroups: Array.isArray(b.itemGroups) ? b.itemGroups.map(String) : [],
|
|
companyName: b.companyName || '', companyAddress: b.companyAddress || '', formNo: b.formNo || '',
|
|
effectiveDate: b.effectiveDate || '', reviewDate: b.reviewDate || '', logo: b.logo || '',
|
|
});
|
|
res.json({ success: true, data: updated });
|
|
} catch (err) { res.status(500).json({ success: false, message: err.message }); }
|
|
});
|
|
|
|
router.post('/:id/set-default', verifyToken, requireQaManagerEdit, async (req, res) => {
|
|
try {
|
|
const existing = await store().findById(req.params.id);
|
|
if (!existing || existing.isDeleted) return res.status(404).json({ success: false, message: 'Not found' });
|
|
const updated = await store().setDefault(req.params.id);
|
|
res.json({ success: true, data: updated });
|
|
} catch (err) { res.status(500).json({ success: false, message: err.message }); }
|
|
});
|
|
|
|
router.delete('/:id', verifyToken, requireQaManagerEdit, async (req, res) => {
|
|
try {
|
|
const existing = await store().findById(req.params.id);
|
|
if (!existing) return res.status(404).json({ success: false, message: 'Not found' });
|
|
await store().softDelete(req.params.id);
|
|
res.json({ success: true });
|
|
} catch (err) { res.status(400).json({ success: false, message: err.message }); }
|
|
});
|
|
|
|
module.exports = router;
|