diff --git a/src/modules/masters/items/items.service.js b/src/modules/masters/items/items.service.js index de05316..91d73f0 100644 --- a/src/modules/masters/items/items.service.js +++ b/src/modules/masters/items/items.service.js @@ -8,6 +8,13 @@ const ITEM_SERIES_CODE = 'ITEM'; const SEARCH_FIELDS = ['item_code', 'item_name']; +const SOFT_DELETE_TABLES = new Set([ + 'item_categories', + 'item_subcategories', + 'uom', + 'brands', +]); + const normalizeString = (value) => { if (value === undefined || value === null) return value; const str = String(value).trim(); @@ -60,13 +67,26 @@ const normalizePayload = (payload, { isCreate = false } = {}) => { const assertReference = async (table, id, label, { requireActive = true } = {}) => { if (!id) return null; const row = await prisma[table].findFirst({ - where: { id: BigInt(id), deleted_at: null }, + where: { + id: BigInt(id), + ...(SOFT_DELETE_TABLES.has(table) ? { deleted_at: null } : {}), + }, }); if (!row) throw new ApiError(422, `Invalid ${label}`); if (requireActive && row.is_active === false) throw new ApiError(422, `${label} is inactive`); return row; }; +const assertGstRate = async (gstRateId) => { + if (!gstRateId) return null; + const row = await prisma.gst_rates.findFirst({ + where: { id: BigInt(gstRateId) }, + }); + if (!row) throw new ApiError(422, 'Invalid gst_rate_id'); + if (row.is_active === false) throw new ApiError(422, 'gst_rate_id is inactive'); + return row; +}; + const assertHsnCode = async (hsnCodeId) => { if (!hsnCodeId) return null; const row = await prisma.hsn_codes.findFirst({ @@ -102,9 +122,7 @@ const validateItemPayload = async (payload, { isCreate = false } = {}) => { } if (payload.uom_id) await assertReference('uom', payload.uom_id, 'uom_id'); if (payload.hsn_code_id !== undefined) await assertHsnCode(payload.hsn_code_id); - if (payload.gst_rate_id) { - await assertReference('gst_rates', payload.gst_rate_id, 'gst_rate_id', { requireActive: false }); - } + if (payload.gst_rate_id !== undefined) await assertGstRate(payload.gst_rate_id); if (payload.brand_id) { await assertReference('brands', payload.brand_id, 'brand_id', { requireActive: false }); } diff --git a/src/utils/mapDbError.js b/src/utils/mapDbError.js index 5cd5b5c..fe7c1b1 100644 --- a/src/utils/mapDbError.js +++ b/src/utils/mapDbError.js @@ -90,6 +90,10 @@ const mapDbError = (err) => { if (err instanceof ApiError) return err; if (!err) return null; + if (err.name === 'PrismaClientValidationError') { + return new ApiError(500, 'Internal server error'); + } + if (err.name === 'PrismaClientKnownRequestError' || err.code?.startsWith?.('P')) { const mapped = mapPrismaKnownError(err); if (mapped) return mapped;