kra-etims-sdk
Version:
Kenya Revenue Authority (KRA) Electronic Tax Invoice Management System (eTims) API Integration SDK
140 lines (121 loc) • 3.93 kB
JavaScript
/**
* Validation utilities for KRA eTims SDK
* Provides schemas and validation functions for API requests
*/
const Joi = require('joi');
const { ValidationError } = require('./errors');
// Common validation schemas
const schemas = {
// Common fields
tin: Joi.string().required().description('Taxpayer Identification Number'),
bhfId: Joi.string().required().description('Branch ID'),
lastReqDt: Joi.string().required().description('Last Request Date in format YYYYMMDDHHMMSS'),
dvcSrlNo: Joi.string().required().description('Device Serial Number'),
// Authentication
auth: Joi.object({
username: Joi.string().required(),
password: Joi.string().required()
}),
// Initialization
initialization: Joi.object({
tin: Joi.string().required(),
bhfId: Joi.string().required(),
dvcSrlNo: Joi.string().required()
}),
// Basic Data
codeList: Joi.object({
tin: Joi.string().required(),
bhfId: Joi.string().required(),
lastReqDt: Joi.string().required()
}),
itemClsList: Joi.object({
tin: Joi.string().required(),
bhfId: Joi.string().required(),
lastReqDt: Joi.string().required()
}),
bhfList: Joi.object({
lastReqDt: Joi.string().required()
}),
noticeList: Joi.object({
tin: Joi.string().required(),
bhfId: Joi.string().required(),
lastReqDt: Joi.string().required()
}),
taxpayerInfo: Joi.object({
tin: Joi.string().required(),
bhfId: Joi.string().required(),
lastReqDt: Joi.string().required()
}),
customerList: Joi.object({
tin: Joi.string().required(),
bhfId: Joi.string().required(),
lastReqDt: Joi.string().required()
}),
// Sales Management
salesTrns: Joi.object({
tin: Joi.string().required(),
bhfId: Joi.string().required(),
invcNo: Joi.string().required().description('Invoice Number'),
salesTrnsItems: Joi.array().items(
Joi.object({
itemCd: Joi.string().required().description('Item Code'),
itemNm: Joi.string().required().description('Item Name'),
qty: Joi.number().required().description('Quantity'),
prc: Joi.number().required().description('Price'),
splyAmt: Joi.number().required().description('Supply Amount'),
dcRt: Joi.number().description('Discount Rate'),
dcAmt: Joi.number().description('Discount Amount'),
taxTyCd: Joi.string().required().description('Tax Type Code'),
taxAmt: Joi.number().required().description('Tax Amount')
})
).required()
}),
selectSalesTrns: Joi.object({
tin: Joi.string().required(),
bhfId: Joi.string().required(),
lastReqDt: Joi.string().required(),
invcNo: Joi.string().description('Invoice Number')
}),
// Stock Management
moveList: Joi.object({
tin: Joi.string().required(),
bhfId: Joi.string().required(),
lastReqDt: Joi.string().required()
}),
stockMaster: Joi.object({
tin: Joi.string().required(),
bhfId: Joi.string().required(),
itemCd: Joi.string().required(),
itemClsCd: Joi.string().required(),
itemNm: Joi.string().required(),
pkgUnitCd: Joi.string().required(),
qtyUnitCd: Joi.string().required(),
splyAmt: Joi.number().required(),
vatTyCd: Joi.string().required()
})
};
/**
* Validate data against schema
* @param {Object} data - Data to validate
* @param {Object} schema - Joi schema to validate against
* @returns {Object} - Validated data
* @throws {ValidationError} - If validation fails
*/
const validate = (data, schema) => {
const { error, value } = schema.validate(data, {
abortEarly: false,
stripUnknown: true
});
if (error) {
const errors = error.details.map(detail => ({
field: detail.path.join('.'),
message: detail.message
}));
throw new ValidationError('Validation failed', errors);
}
return value;
};
module.exports = {
schemas,
validate
};