import { z } from "zod";
// Базовые схемы для валидации данных сотрудников
// Схема для входящего MCP сообщения
export const EmployeeMcpMessageSchema = z.object({
topic: z.literal("assistant.employee"),
payload: z.object({
channel: z.enum(["web", "telegram", "gui"]),
rawText: z.string().describe("Raw text command from user"),
fileUrl: z.string().url().optional().describe("URL to XLSX file for import"),
companyId: z.string().describe("Company ID"),
userId: z.string().describe("User ID"),
}),
});
// Схема для CreateEmployeeDTO (из Swagger)
export const CreateEmployeeDTOSchema = z.object({
companyId: z.string().describe("Company ID"),
lastName: z.string().min(1).describe("Last name"),
firstName: z.string().min(1).describe("First name"),
middleName: z.string().optional().describe("Middle name"),
email: z.string().email().describe("Email address"),
phones: z.array(z.string()).optional().describe("Phone numbers"),
});
// Схема для UpdateEmployeeDTO (из Swagger)
export const UpdateEmployeeDTOSchema = z.object({
lastName: z.string().min(1).describe("Last name"),
firstName: z.string().min(1).describe("First name"),
middleName: z.string().optional().describe("Middle name"),
email: z.string().email().describe("Email address"),
phones: z.array(z.string()).optional().describe("Phone numbers"),
});
// Схема для SendInviteDTO (из Swagger)
export const SendInviteDTOSchema = z.object({
employeeId: z.string().describe("Employee ID"),
email: z.string().email().describe("Email to send invite to"),
message: z.string().optional().describe("Custom invite message"),
});
// Схема для промежуточной обработки (EmployeeDraft)
export const EmployeeDraftSchema = z.object({
lastName: z.string().optional(),
firstName: z.string().optional(),
middleName: z.string().optional(),
email: z.string().optional(),
phones: z.array(z.string()).optional(),
rawText: z.string().optional().describe("Original text for debugging"),
errors: z.array(z.string()).optional().describe("Validation errors"),
isValid: z.boolean().default(false),
});
// Схема для результата обработки
export const EmployeeProcessingResultSchema = z.object({
success: z.boolean(),
processed: z.number().describe("Number of successfully processed employees"),
failed: z.number().describe("Number of failed employees"),
duplicates: z.number().describe("Number of duplicate employees found"),
employees: z.array(CreateEmployeeDTOSchema).optional(),
errors: z.array(z.string()).optional(),
report: z.string().optional().describe("Human-readable report"),
});
// Схема для проверки уникальности
export const EmployeeSearchSchema = z.object({
lastName: z.string().optional(),
firstName: z.string().optional(),
email: z.string().email().optional(),
});
// Схема для ответа поиска сотрудников
export const EmployeeSearchResultSchema = z.object({
found: z.boolean(),
employees: z
.array(
z.object({
id: z.string(),
lastName: z.string(),
firstName: z.string(),
middleName: z.string().optional(),
email: z.string(),
})
)
.optional(),
message: z.string().optional(),
});
// Схема для MCP tool параметров
export const EmployeeAddOneSchema = z.object({
rawText: z.string().describe("Text containing employee information"),
companyId: z.string().describe("Company ID"),
sessionId: z.string().optional().describe("Session ID for authentication"),
});
export const EmployeeAddListSchema = z.object({
rawText: z.string().describe("Text containing list of employees"),
companyId: z.string().describe("Company ID"),
sessionId: z.string().optional().describe("Session ID for authentication"),
});
export const EmployeeImportXlsxSchema = z.object({
fileUrl: z.string().url().describe("URL to XLSX file"),
companyId: z.string().describe("Company ID"),
sessionId: z.string().optional().describe("Session ID for authentication"),
});
export const EmployeeTelegramHandlerSchema = z.object({
message: z.string().describe("Telegram message text"),
companyId: z.string().describe("Company ID"),
userId: z.string().describe("User ID from Telegram"),
sessionId: z.string().optional().describe("Session ID for authentication"),
});
// Схемы для обработки конфликтов
export const EmployeeConflictResolutionSchema = z.object({
employeeData: z.object({
lastName: z.string(),
firstName: z.string(),
middleName: z.string().optional(),
email: z.string(),
phones: z.array(z.string()).optional(),
}),
conflictType: z.enum(["exact", "similar", "email", "none"]),
action: z.enum(["create", "update", "skip", "manual"]),
existingEmployeeId: z.string().optional(),
companyId: z.string(),
sessionId: z.string().optional(),
});
export const EmployeeForceCreateSchema = z.object({
employeeData: z.object({
lastName: z.string(),
firstName: z.string(),
middleName: z.string().optional(),
email: z.string(),
phones: z.array(z.string()).optional(),
}),
companyId: z.string(),
sessionId: z.string().optional(),
reason: z.string().optional().describe("Reason for force creation"),
});
// Экспорт типов
export type EmployeeMcpMessage = z.infer<typeof EmployeeMcpMessageSchema>;
export type CreateEmployeeDTO = z.infer<typeof CreateEmployeeDTOSchema>;
export type UpdateEmployeeDTO = z.infer<typeof UpdateEmployeeDTOSchema>;
export type SendInviteDTO = z.infer<typeof SendInviteDTOSchema>;
export type EmployeeDraft = z.infer<typeof EmployeeDraftSchema>;
export type EmployeeProcessingResult = z.infer<typeof EmployeeProcessingResultSchema>;
export type EmployeeSearch = z.infer<typeof EmployeeSearchSchema>;
export type EmployeeSearchResult = z.infer<typeof EmployeeSearchResultSchema>;
export type EmployeeAddOne = z.infer<typeof EmployeeAddOneSchema>;
export type EmployeeAddList = z.infer<typeof EmployeeAddListSchema>;
export type EmployeeImportXlsx = z.infer<typeof EmployeeImportXlsxSchema>;
export type EmployeeTelegramHandler = z.infer<typeof EmployeeTelegramHandlerSchema>;
export type EmployeeConflictResolution = z.infer<typeof EmployeeConflictResolutionSchema>;
export type EmployeeForceCreate = z.infer<typeof EmployeeForceCreateSchema>;