Files
sap-erp/routes/woHeaderProfiles.js
T
John 69b4e68baf
SAP-ERP Portal CI/CD / build (push) Failing after 5m20s
first commit
2026-09-23 17:31:02 +05:30

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;