"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.menuCompanyParamSchema = exports.menuPlanParamSchema = exports.menuItemIdParamSchema = exports.menuAuditLogQuerySchema = exports.menuPreviewSchema = exports.menuCompanyAssignmentsSchema = exports.menuPlanAssignmentsSchema = exports.menuItemStatusSchema = exports.menuItemSchema = exports.promotionIdParamSchema = exports.planFeatureIdParamSchema = exports.promotionUpdateSchema = exports.promotionCreateSchema = exports.planFeatureUpdateSchema = exports.planFeatureCreateSchema = exports.pricingUpdateSchema = exports.homepageUpdateSchema = exports.billingRefundSchema = exports.billingCreditNoteSchema = exports.billingReasonSchema = exports.retryBillingInvoiceSchema = exports.payBillingInvoiceSchema = exports.createBillingInvoiceSchema = exports.billingLineItemInputSchema = exports.billingAccountUpdateSchema = exports.invoiceIdParamSchema = exports.billingAccountIdParamSchema = exports.companyIdParamSchema = exports.idParamSchema = exports.marketplaceHomepageConfigSchema = exports.adminCompanyUpdateSchema = exports.companyStatusSchema = exports.adminPermissionsSchema = exports.adminRoleSchema = exports.updateAdminSchema = exports.createAdminSchema = exports.permissionSchema = exports.invoicesQuerySchema = exports.billingQuerySchema = exports.notificationsQuerySchema = exports.auditLogQuerySchema = exports.rentersQuerySchema = exports.companiesQuerySchema = exports.totpVerifySchema = exports.resetPasswordSchema = exports.forgotPasswordSchema = exports.loginSchema = void 0; const zod_1 = require("zod"); exports.loginSchema = zod_1.z.object({ email: zod_1.z.string().email().max(255).trim().toLowerCase(), password: zod_1.z.string().max(128), totpCode: zod_1.z.string().length(6).optional(), recoveryCode: zod_1.z.string().min(8).max(32).optional(), }); exports.forgotPasswordSchema = zod_1.z.object({ email: zod_1.z.string().email().max(255).trim().toLowerCase(), }); exports.resetPasswordSchema = zod_1.z.object({ token: zod_1.z.string().min(1), password: zod_1.z.string().min(8).max(128), }); exports.totpVerifySchema = zod_1.z.object({ code: zod_1.z.string().length(6), }); exports.companiesQuerySchema = zod_1.z.object({ q: zod_1.z.string().optional(), status: zod_1.z.string().optional(), plan: zod_1.z.string().optional(), page: zod_1.z.coerce.number().int().min(1).default(1), pageSize: zod_1.z.coerce.number().int().min(1).max(100).default(20), }); exports.rentersQuerySchema = zod_1.z.object({ q: zod_1.z.string().optional(), blocked: zod_1.z.string().optional(), page: zod_1.z.coerce.number().int().min(1).default(1), pageSize: zod_1.z.coerce.number().int().min(1).max(100).default(20), }); exports.auditLogQuerySchema = zod_1.z.object({ adminId: zod_1.z.string().optional(), action: zod_1.z.string().optional(), companyId: zod_1.z.string().optional(), entityId: zod_1.z.string().optional(), page: zod_1.z.coerce.number().int().min(1).default(1), pageSize: zod_1.z.coerce.number().int().min(1).max(100).default(50), }); exports.notificationsQuerySchema = zod_1.z.object({ channel: zod_1.z.string().optional(), status: zod_1.z.string().optional(), companyId: zod_1.z.string().optional(), page: zod_1.z.coerce.number().int().min(1).default(1), pageSize: zod_1.z.coerce.number().int().min(1).max(200).default(50), }); exports.billingQuerySchema = zod_1.z.object({ q: zod_1.z.string().optional(), status: zod_1.z.string().optional(), plan: zod_1.z.string().optional(), page: zod_1.z.coerce.number().int().min(1).default(1), pageSize: zod_1.z.coerce.number().int().min(1).max(100).default(20), }); exports.invoicesQuerySchema = zod_1.z.object({ page: zod_1.z.coerce.number().int().min(1).default(1), pageSize: zod_1.z.coerce.number().int().min(1).max(100).default(20), }); exports.permissionSchema = zod_1.z.object({ resource: zod_1.z.enum(['COMPANIES', 'COMPANY_EMPLOYEES', 'SUBSCRIPTIONS', 'PAYMENTS', 'OFFERS', 'RENTERS', 'ADMIN_USERS', 'AUDIT_LOGS', 'PLATFORM_METRICS']), actions: zod_1.z.array(zod_1.z.enum(['READ', 'CREATE', 'UPDATE', 'DELETE', 'SUSPEND', 'IMPERSONATE'])).min(1), }); exports.createAdminSchema = zod_1.z.object({ email: zod_1.z.string().email().trim().toLowerCase(), firstName: zod_1.z.string().min(1).max(100).trim(), lastName: zod_1.z.string().min(1).max(100).trim(), role: zod_1.z.enum(['SUPER_ADMIN', 'ADMIN', 'SUPPORT', 'FINANCE', 'VIEWER']), password: zod_1.z.string().min(8), permissions: zod_1.z.array(exports.permissionSchema).optional(), }); exports.updateAdminSchema = zod_1.z.object({ email: zod_1.z.string().email().trim().toLowerCase().optional(), firstName: zod_1.z.string().min(1).max(100).trim().optional(), lastName: zod_1.z.string().min(1).max(100).trim().optional(), role: zod_1.z.enum(['SUPER_ADMIN', 'ADMIN', 'SUPPORT', 'FINANCE', 'VIEWER']).optional(), password: zod_1.z.string().min(8).optional(), isActive: zod_1.z.boolean().optional(), }); exports.adminRoleSchema = zod_1.z.object({ role: zod_1.z.enum(['SUPER_ADMIN', 'ADMIN', 'SUPPORT', 'FINANCE', 'VIEWER']), }); exports.adminPermissionsSchema = zod_1.z.object({ permissions: zod_1.z.array(exports.permissionSchema), }); exports.companyStatusSchema = zod_1.z.object({ status: zod_1.z.enum(['ACTIVE', 'SUSPENDED', 'CANCELLED']), reason: zod_1.z.string().optional(), }); const nullableString = zod_1.z.union([zod_1.z.string(), zod_1.z.null()]).optional(); const nullableEmail = zod_1.z.union([zod_1.z.string().email(), zod_1.z.null()]).optional(); const nullableUrl = zod_1.z.union([zod_1.z.string().url(), zod_1.z.null()]).optional(); const nullableDate = zod_1.z.union([zod_1.z.string().datetime(), zod_1.z.string().regex(/^\d{4}-\d{2}-\d{2}$/), zod_1.z.null()]).optional(); exports.adminCompanyUpdateSchema = zod_1.z.object({ company: zod_1.z.object({ name: zod_1.z.string().min(1).optional(), slug: zod_1.z.string().min(1).optional(), email: zod_1.z.string().email().optional(), phone: nullableString, status: zod_1.z.enum(['PENDING', 'TRIALING', 'ACTIVE', 'PAST_DUE', 'SUSPENDED', 'CANCELLED']).optional(), subscriptionPaymentRef: nullableString, address: zod_1.z.object({ streetAddress: nullableString, city: nullableString, country: nullableString, zipCode: nullableString, legalName: nullableString, legalForm: nullableString, companyEmail: nullableEmail, managerName: nullableString, iceNumber: nullableString, operatingLicenseNumber: nullableString, operatingLicenseIssuedAt: nullableString, operatingLicenseIssuedBy: nullableString, fax: nullableString, yearsActive: nullableString, representativeName: nullableString, representativeTitle: nullableString, responsibleName: nullableString, responsibleRole: nullableString, responsibleIdentityNumber: nullableString, responsibleQualification: nullableString, responsiblePhone: nullableString, responsibleEmail: nullableEmail, }).optional(), }).optional(), subscription: zod_1.z.object({ plan: zod_1.z.enum(['STARTER', 'GROWTH', 'PRO']).optional(), billingPeriod: zod_1.z.enum(['MONTHLY', 'ANNUAL']).optional(), status: zod_1.z.enum(['TRIALING', 'ACTIVE', 'PAST_DUE', 'CANCELLED', 'UNPAID']).optional(), currency: zod_1.z.literal('MAD').optional(), trialStartAt: nullableDate, trialEndAt: nullableDate, currentPeriodStart: nullableDate, currentPeriodEnd: nullableDate, cancelledAt: nullableDate, cancelAtPeriodEnd: zod_1.z.boolean().optional(), }).optional(), brand: zod_1.z.object({ displayName: zod_1.z.string().min(1).optional(), tagline: nullableString, subdomain: zod_1.z.string().min(1).optional(), customDomain: nullableString, publicEmail: nullableEmail, publicPhone: nullableString, publicAddress: nullableString, publicCity: nullableString, publicCountry: nullableString, websiteUrl: nullableUrl, whatsappNumber: nullableString, defaultLocale: zod_1.z.string().min(2).optional(), defaultCurrency: zod_1.z.literal('MAD').optional(), isListedOnMarketplace: zod_1.z.boolean().optional(), homePageConfig: zod_1.z.any().optional(), menuConfig: zod_1.z.any().optional(), }).optional(), contractSettings: zod_1.z.object({ legalName: nullableString, registrationNumber: nullableString, taxId: nullableString, terms: zod_1.z.string().optional(), fuelPolicyType: zod_1.z.enum(['FULL_TO_FULL', 'FULL_TO_EMPTY', 'SAME_TO_SAME', 'PREPAID', 'FREE']).optional(), lateFeePerHour: zod_1.z.number().int().nullable().optional(), taxRate: zod_1.z.number().nullable().optional(), signatureRequired: zod_1.z.boolean().optional(), showTax: zod_1.z.boolean().optional(), }).optional(), accountingSettings: zod_1.z.object({ reportingPeriod: zod_1.z.enum(['WEEKLY', 'MONTHLY', 'QUARTERLY', 'ANNUAL']).optional(), fiscalYearStart: zod_1.z.number().int().min(1).max(12).optional(), currency: zod_1.z.literal('MAD').optional(), accountantEmail: nullableEmail, accountantName: nullableString, autoSendReport: zod_1.z.boolean().optional(), reportFormat: zod_1.z.enum(['PDF', 'CSV', 'BOTH']).optional(), }).optional(), }); const marketplaceMetricSchema = zod_1.z.object({ value: zod_1.z.string().min(1), label: zod_1.z.string().min(1) }); const marketplacePillarSchema = zod_1.z.object({ title: zod_1.z.string().min(1), body: zod_1.z.string().min(1) }); const marketplaceStepSchema = zod_1.z.object({ step: zod_1.z.string().min(1), title: zod_1.z.string().min(1), body: zod_1.z.string().min(1) }); const marketplaceSectionSchema = zod_1.z.enum(['hero', 'surface', 'pillars', 'audiences', 'features', 'steps', 'closing']); const marketplaceHomepageContentSchema = zod_1.z.object({ sections: zod_1.z.array(marketplaceSectionSchema).min(1), heroKicker: zod_1.z.string().min(1), heroTitle: zod_1.z.string().min(1), heroBody: zod_1.z.string().min(1), startTrial: zod_1.z.string().min(1), exploreVehicles: zod_1.z.string().min(1), surfaceLabel: zod_1.z.string().min(1), surfaceTitle: zod_1.z.string().min(1), surfaceBody: zod_1.z.string().min(1), liveLabel: zod_1.z.string().min(1), trustedFleets: zod_1.z.string().min(1), brandedFlows: zod_1.z.string().min(1), multiTenant: zod_1.z.string().min(1), companyKicker: zod_1.z.string().min(1), companyTitle: zod_1.z.string().min(1), companyBody: zod_1.z.string().min(1), renterKicker: zod_1.z.string().min(1), renterTitle: zod_1.z.string().min(1), renterBody: zod_1.z.string().min(1), pillars: zod_1.z.array(marketplacePillarSchema).length(3), metrics: zod_1.z.array(marketplaceMetricSchema).length(3), featureLabel: zod_1.z.string().min(1), features: zod_1.z.array(zod_1.z.string().min(1)).min(1), stepsTitle: zod_1.z.string().min(1), steps: zod_1.z.array(marketplaceStepSchema).length(3), stepLabel: zod_1.z.string().min(1), readyKicker: zod_1.z.string().min(1), readyTitle: zod_1.z.string().min(1), readyBody: zod_1.z.string().min(1), viewPricing: zod_1.z.string().min(1), createWorkspace: zod_1.z.string().min(1), }); exports.marketplaceHomepageConfigSchema = zod_1.z.object({ en: marketplaceHomepageContentSchema, fr: marketplaceHomepageContentSchema, ar: marketplaceHomepageContentSchema, }); exports.idParamSchema = zod_1.z.object({ id: zod_1.z.string().min(1), }); exports.companyIdParamSchema = zod_1.z.object({ companyId: zod_1.z.string().min(1), }); exports.billingAccountIdParamSchema = zod_1.z.object({ billingAccountId: zod_1.z.string().min(1), }); exports.invoiceIdParamSchema = zod_1.z.object({ invoiceId: zod_1.z.string().min(1), }); exports.billingAccountUpdateSchema = zod_1.z.object({ legalName: zod_1.z.string().min(1).max(255).optional(), billingEmail: zod_1.z.string().email().optional(), billingAddress: zod_1.z.any().optional(), taxId: zod_1.z.union([zod_1.z.string().max(120), zod_1.z.null()]).optional(), taxExempt: zod_1.z.boolean().optional(), invoiceTerms: zod_1.z.enum(['DUE_ON_RECEIPT', 'NET_7', 'NET_15', 'NET_30', 'NET_45', 'NET_60']).optional(), netTermsDays: zod_1.z.number().int().min(0).max(365).optional(), }); exports.billingLineItemInputSchema = zod_1.z.object({ type: zod_1.z.enum([ 'SUBSCRIPTION_FEE', 'SEAT_FEE', 'USAGE_FEE', 'SETUP_FEE', 'DISCOUNT', 'TAX', 'CREDIT', 'PRORATION', 'REFUND_ADJUSTMENT', 'MANUAL_ADJUSTMENT', 'PROFESSIONAL_SERVICES', 'CANCELLATION_FEE', ]), description: zod_1.z.string().min(1).max(255), quantity: zod_1.z.number().int().positive().max(100000), unitAmount: zod_1.z.number().int(), periodStart: nullableDate, periodEnd: nullableDate, }); exports.createBillingInvoiceSchema = zod_1.z.object({ subscriptionId: zod_1.z.union([zod_1.z.string(), zod_1.z.null()]).optional(), invoiceType: zod_1.z.enum([ 'SUBSCRIPTION_INITIAL', 'SUBSCRIPTION_RENEWAL', 'TRIAL_CONVERSION', 'SUBSCRIPTION_UPGRADE', 'SUBSCRIPTION_DOWNGRADE_CREDIT', 'USAGE_BASED', 'ONE_TIME', 'MANUAL', 'CORRECTION', 'CANCELLATION_FEE', ]), currency: zod_1.z.string().min(3).max(8).optional(), dueAt: nullableDate, isSubscriptionBlocking: zod_1.z.boolean().optional(), adminReason: zod_1.z.union([zod_1.z.string().max(500), zod_1.z.null()]).optional(), lineItems: zod_1.z.array(exports.billingLineItemInputSchema).min(1), }); exports.payBillingInvoiceSchema = zod_1.z.object({ amount: zod_1.z.number().int().positive().optional(), paymentMethodId: zod_1.z.union([zod_1.z.string(), zod_1.z.null()]).optional(), providerPaymentId: zod_1.z.union([zod_1.z.string(), zod_1.z.null()]).optional(), }); exports.retryBillingInvoiceSchema = zod_1.z.object({ paymentMethodId: zod_1.z.union([zod_1.z.string(), zod_1.z.null()]).optional(), }); exports.billingReasonSchema = zod_1.z.object({ reason: zod_1.z.string().min(1).max(500), }); exports.billingCreditNoteSchema = zod_1.z.object({ amount: zod_1.z.number().int().positive(), reason: zod_1.z.string().min(1).max(500), }); exports.billingRefundSchema = zod_1.z.object({ amount: zod_1.z.number().int().positive(), reason: zod_1.z.string().min(1).max(500), }); exports.homepageUpdateSchema = zod_1.z.object({ homepage: exports.marketplaceHomepageConfigSchema, }); exports.pricingUpdateSchema = zod_1.z.object({ entries: zod_1.z.array(zod_1.z.object({ plan: zod_1.z.enum(['STARTER', 'GROWTH', 'PRO']), billingPeriod: zod_1.z.enum(['MONTHLY', 'ANNUAL']), amount: zod_1.z.number().int().positive(), })).min(1), }); const planFeatureSchema = zod_1.z.object({ plan: zod_1.z.enum(['STARTER', 'GROWTH', 'PRO']), label: zod_1.z.string().min(1).max(120), sortOrder: zod_1.z.number().int().min(0).default(0), }); exports.planFeatureCreateSchema = planFeatureSchema; exports.planFeatureUpdateSchema = planFeatureSchema.partial(); exports.promotionCreateSchema = zod_1.z.object({ code: zod_1.z.string().min(2).max(30).regex(/^[A-Z0-9_-]+$/, 'Code must be uppercase A-Z, 0-9, _ or -'), name: zod_1.z.string().min(1).max(100), description: zod_1.z.string().max(500).optional(), discountType: zod_1.z.enum(['PERCENTAGE', 'FIXED']), discountValue: zod_1.z.number().int().positive(), plans: zod_1.z.array(zod_1.z.enum(['STARTER', 'GROWTH', 'PRO'])), periods: zod_1.z.array(zod_1.z.enum(['MONTHLY', 'ANNUAL'])), maxUses: zod_1.z.number().int().positive().nullable().optional(), validFrom: zod_1.z.string().datetime(), validUntil: zod_1.z.string().datetime().nullable().optional(), isActive: zod_1.z.boolean().default(true), }); exports.promotionUpdateSchema = exports.promotionCreateSchema.partial(); exports.planFeatureIdParamSchema = zod_1.z.object({ featureId: zod_1.z.string().min(1) }); exports.promotionIdParamSchema = zod_1.z.object({ promotionId: zod_1.z.string().min(1) }); const employeeRoleSchema = zod_1.z.enum(['OWNER', 'MANAGER', 'AGENT']); const planSchema = zod_1.z.enum(['STARTER', 'GROWTH', 'PRO']); const menuItemTypeSchema = zod_1.z.enum(['INTERNAL_PAGE', 'EXTERNAL_LINK', 'PARENT_MENU', 'SECTION_LABEL', 'DIVIDER']); exports.menuItemSchema = zod_1.z.object({ systemKey: zod_1.z.string().trim().min(1).max(120).optional().nullable(), label: zod_1.z.string().trim().min(1).max(120), itemType: menuItemTypeSchema, routeOrUrl: zod_1.z.string().trim().max(400).optional().nullable(), icon: zod_1.z.string().trim().max(120).optional().nullable(), parentId: zod_1.z.string().trim().min(1).optional().nullable(), displayOrder: zod_1.z.number().int().min(0).default(0), openInNewTab: zod_1.z.boolean().default(false), isRequired: zod_1.z.boolean().default(false), isActive: zod_1.z.boolean().default(true), roles: zod_1.z.array(employeeRoleSchema).default([]), subscriptionPlans: zod_1.z.array(zod_1.z.object({ plan: planSchema, displayOrder: zod_1.z.number().int().min(0).optional(), isActive: zod_1.z.boolean().optional(), })).default([]), companyAssignments: zod_1.z.array(zod_1.z.object({ companyId: zod_1.z.string().trim().min(1), displayOrder: zod_1.z.number().int().min(0).optional(), isActive: zod_1.z.boolean().optional(), })).default([]), }); exports.menuItemStatusSchema = zod_1.z.object({ isActive: zod_1.z.boolean(), }); exports.menuPlanAssignmentsSchema = zod_1.z.object({ assignments: zod_1.z.array(zod_1.z.object({ plan: planSchema, displayOrder: zod_1.z.number().int().min(0).optional(), isActive: zod_1.z.boolean().optional(), })).min(1), }); exports.menuCompanyAssignmentsSchema = zod_1.z.object({ assignments: zod_1.z.array(zod_1.z.object({ companyId: zod_1.z.string().trim().min(1), displayOrder: zod_1.z.number().int().min(0).optional(), isActive: zod_1.z.boolean().optional(), })).min(1), }); exports.menuPreviewSchema = zod_1.z.object({ companyId: zod_1.z.string().trim().min(1), role: employeeRoleSchema, }); exports.menuAuditLogQuerySchema = zod_1.z.object({ page: zod_1.z.coerce.number().int().min(1).default(1), pageSize: zod_1.z.coerce.number().int().min(1).max(100).default(20), }); exports.menuItemIdParamSchema = zod_1.z.object({ id: zod_1.z.string().min(1), }); exports.menuPlanParamSchema = zod_1.z.object({ id: zod_1.z.string().min(1), plan: planSchema, }); exports.menuCompanyParamSchema = zod_1.z.object({ id: zod_1.z.string().min(1), companyId: zod_1.z.string().min(1), }); //# sourceMappingURL=admin.schemas.js.map