56 lines
2.0 KiB
TypeScript
56 lines
2.0 KiB
TypeScript
import { z } from 'zod';
|
|
|
|
export const MembershipStatusEnum = z.enum([
|
|
'active', 'inactive', 'pending', 'resigned', 'excluded', 'deceased',
|
|
]);
|
|
export type MembershipStatus = z.infer<typeof MembershipStatusEnum>;
|
|
|
|
export const SepaMandateStatusEnum = z.enum([
|
|
'active', 'pending', 'revoked', 'expired',
|
|
]);
|
|
|
|
export const CreateMemberSchema = z.object({
|
|
accountId: z.string().uuid(),
|
|
memberNumber: z.string().optional(),
|
|
firstName: z.string().min(1).max(128),
|
|
lastName: z.string().min(1).max(128),
|
|
dateOfBirth: z.string().optional(),
|
|
gender: z.enum(['male', 'female', 'diverse']).optional(),
|
|
title: z.string().max(32).optional(),
|
|
email: z.string().email().optional().or(z.literal('')),
|
|
phone: z.string().max(32).optional(),
|
|
mobile: z.string().max(32).optional(),
|
|
street: z.string().max(256).optional(),
|
|
houseNumber: z.string().max(16).optional(),
|
|
postalCode: z.string().max(10).optional(),
|
|
city: z.string().max(128).optional(),
|
|
country: z.string().max(2).default('DE'),
|
|
status: MembershipStatusEnum.default('active'),
|
|
entryDate: z.string().default(() => new Date().toISOString().split('T')[0]!),
|
|
duesCategoryId: z.string().uuid().optional(),
|
|
iban: z.string().max(34).optional(),
|
|
bic: z.string().max(11).optional(),
|
|
accountHolder: z.string().max(128).optional(),
|
|
gdprConsent: z.boolean().default(false),
|
|
notes: z.string().optional(),
|
|
});
|
|
|
|
export type CreateMemberInput = z.infer<typeof CreateMemberSchema>;
|
|
|
|
export const UpdateMemberSchema = CreateMemberSchema.partial().extend({
|
|
memberId: z.string().uuid(),
|
|
});
|
|
|
|
export type UpdateMemberInput = z.infer<typeof UpdateMemberSchema>;
|
|
|
|
export const CreateDuesCategorySchema = z.object({
|
|
accountId: z.string().uuid(),
|
|
name: z.string().min(1).max(128),
|
|
description: z.string().optional(),
|
|
amount: z.number().min(0),
|
|
interval: z.enum(['monthly', 'quarterly', 'half_yearly', 'yearly']).default('yearly'),
|
|
isDefault: z.boolean().default(false),
|
|
});
|
|
|
|
export type CreateDuesCategoryInput = z.infer<typeof CreateDuesCategorySchema>;
|