erp_be/src/modules/assets/assets.validation.js
2026-06-18 18:29:46 +05:30

118 lines
5.1 KiB
JavaScript

const Joi = require('joi');
const { ASSET_CONDITIONS, ASSET_STATUSES, DEPRECIATION_METHODS } = require('./assets.constants');
const assetFields = {
asset_name: Joi.string().max(200).required(),
asset_category_id: Joi.number().integer().positive().required(),
brand_model: Joi.string().max(200).allow(null, '').optional(),
manufacturer: Joi.string().max(200).allow(null, '').optional(),
serial_number: Joi.string().max(100).allow(null, '').optional(),
part_number: Joi.string().max(100).allow(null, '').optional(),
plant_id: Joi.number().integer().positive().required(),
department_id: Joi.number().integer().positive().allow(null).optional(),
warehouse_id: Joi.number().integer().positive().allow(null).optional(),
location_detail: Joi.string().max(200).allow(null, '').optional(),
assigned_to_user_id: Joi.number().integer().positive().allow(null).optional(),
vendor_id: Joi.number().integer().positive().allow(null).optional(),
po_id: Joi.number().integer().positive().allow(null).optional(),
grn_id: Joi.number().integer().positive().allow(null).optional(),
grn_item_id: Joi.number().integer().positive().allow(null).optional(),
purchase_date: Joi.date().iso().allow(null).optional(),
purchase_cost: Joi.number().min(0).default(0),
useful_life_years: Joi.number().integer().min(0).allow(null).optional(),
depreciation_method: Joi.string()
.valid(...DEPRECIATION_METHODS)
.allow(null)
.optional(),
salvage_value: Joi.number().min(0).allow(null).optional(),
warranty_expiry_date: Joi.date().iso().allow(null).optional(),
amc_start_date: Joi.date().iso().allow(null).optional(),
amc_end_date: Joi.date().iso().allow(null).optional(),
amc_vendor_id: Joi.number().integer().positive().allow(null).optional(),
insurance_policy_no: Joi.string().max(100).allow(null, '').optional(),
insurance_expiry_date: Joi.date().iso().allow(null).optional(),
condition: Joi.string()
.valid(...ASSET_CONDITIONS)
.default('NEW'),
status: Joi.string()
.valid(...ASSET_STATUSES)
.default('IN_USE'),
qr_code_value: Joi.string().max(100).allow(null, '').optional(),
disposal_date: Joi.date().iso().allow(null).optional(),
disposal_reason: Joi.string().allow(null, '').optional(),
disposal_value: Joi.number().min(0).allow(null).optional(),
remarks: Joi.string().allow(null, '').optional(),
is_active: Joi.boolean().default(true),
};
const createAssetSchema = Joi.object(assetFields);
const updateAssetSchema = Joi.object({
asset_name: assetFields.asset_name.optional(),
asset_category_id: assetFields.asset_category_id.optional(),
brand_model: assetFields.brand_model,
manufacturer: assetFields.manufacturer,
serial_number: assetFields.serial_number,
part_number: assetFields.part_number,
plant_id: assetFields.plant_id.optional(),
department_id: assetFields.department_id,
warehouse_id: assetFields.warehouse_id,
location_detail: assetFields.location_detail,
assigned_to_user_id: assetFields.assigned_to_user_id,
vendor_id: assetFields.vendor_id,
po_id: assetFields.po_id,
grn_id: assetFields.grn_id,
grn_item_id: assetFields.grn_item_id,
purchase_date: assetFields.purchase_date,
purchase_cost: assetFields.purchase_cost.optional(),
useful_life_years: assetFields.useful_life_years,
depreciation_method: assetFields.depreciation_method,
salvage_value: assetFields.salvage_value,
warranty_expiry_date: assetFields.warranty_expiry_date,
amc_start_date: assetFields.amc_start_date,
amc_end_date: assetFields.amc_end_date,
amc_vendor_id: assetFields.amc_vendor_id,
insurance_policy_no: assetFields.insurance_policy_no,
insurance_expiry_date: assetFields.insurance_expiry_date,
condition: assetFields.condition.optional(),
status: assetFields.status.optional(),
qr_code_value: assetFields.qr_code_value,
disposal_date: assetFields.disposal_date,
disposal_reason: assetFields.disposal_reason,
disposal_value: assetFields.disposal_value,
remarks: assetFields.remarks,
is_active: assetFields.is_active.optional(),
}).min(1);
const listAssetsQuerySchema = Joi.object({
page: Joi.number().integer().min(1).default(1),
limit: Joi.number().integer().min(1).max(100).default(20),
search: Joi.string().allow('').optional(),
status: Joi.string()
.valid(...ASSET_STATUSES)
.optional(),
condition: Joi.string()
.valid(...ASSET_CONDITIONS)
.optional(),
asset_category_id: Joi.number().integer().positive().optional(),
plant_id: Joi.number().integer().positive().optional(),
department_id: Joi.number().integer().positive().optional(),
is_active: Joi.boolean().optional(),
});
const transferAssetSchema = Joi.object({
transfer_date: Joi.date().iso().required(),
to_plant_id: Joi.number().integer().positive().allow(null).optional(),
to_department_id: Joi.number().integer().positive().allow(null).optional(),
to_user_id: Joi.number().integer().positive().allow(null).optional(),
to_warehouse_id: Joi.number().integer().positive().allow(null).optional(),
reason: Joi.string().allow(null, '').optional(),
}).or('to_plant_id', 'to_department_id', 'to_user_id', 'to_warehouse_id');
module.exports = {
createAssetSchema,
updateAssetSchema,
listAssetsQuerySchema,
transferAssetSchema,
};