const invoiceSchema = Joi.object().keys({
createdBy: idSchema.id, // _id of object
client: idSchema.id,
project: idSchema.id,
address: Joi.string().trim(),
additionalAddress: Joi.string().trim().allow(''),
currency: Joi.string().valid(stripeCurrencies),
amountTotal: Joi.number().min(0),
amountDue: Joi.number().min(0),
amountPaid: Joi.number().min(0),
amountRemain: Joi.number().min(0),
upfrontPaid: Joi.boolean(),
defaultPaymentMethod: Joi.string().trim().default(null),
dueDate: Joi.date(),
paidDate: Joi.date(),
notes: Joi.string().allow(''),
discountPercentage: Joi.number().min(0).max(100),
status: Joi.string().valid('draft'),
amount: Joi.number().min(0),
quantity: Joi.number().min(1),
paymentType: Joi.string().valid('oneTime', 'subscription'),
repeatCount: Joi.number().min(1),
repeatDuration: Joi.string().valid('day', 'week', 'month', 'year'),
billingCycleCount: Joi.number().min(0),
vat: Joi.number().min(0),
wisePaymentLink: Joi.string().uri().optional(),
additionalFields: Joi.array()
.items(
Joi.object().keys({
name: Joi.string().required(),
quantity: Joi.number().min(1).required(),
value: Joi.number().required(),
}),
)
.min(1),
reminderType: Joi.string()
.valid('sendReminder', 'doNotSendReminder')
.optional(),
reminders: Joi.when('reminderType', {
is: 'sendReminder',
then: Joi.array().items(invoiceReminderObj).min(1).required(),
otherwise: Joi.forbidden(),
}),
});