import {z} from 'zod' export type GetApiV1SettingsOptions = {baseUrl?: string | undefined, fetch?: typeof fetch | undefined}; export const accountingSettingsDto = z.object({accountNumberLength: z.number().int().optional(), customerAccountFormat: z.string().nullable().optional(), customerCollectiveAccount: z.string().nullable().optional(), expensesImportVatReverseAccountNumber: z.string().nullable().optional(), expensesJournalCode: z.string().nullable().optional(), expensesSubcontractingVatReverseAccountNumber: z.string().nullable().optional(), feesAccountingAccountNumber: z.string().nullable().optional(), generateCustomerAccount: z.boolean().optional(), generateSupplierAccount: z.boolean().optional(), miscJournalCode: z.string().nullable().optional(), salesDepositAccountingAccountNumber: z.string().nullable().optional(), salesJournalCode: z.string().nullable().optional(), salesShippingAccountNumber: z.string().nullable().optional(), salesVatCollectionAccountingAccountNumber: z.string().nullable().optional(), supplierAccountFormat: z.string().nullable().optional(), supplierCollectiveAccount: z.string().nullable().optional(), uncertainAccountNumberRoot: z.string().nullable().optional()}); export const contactFields = z.object({cellPhone: z.string().nullable().optional(), companyName: z.string().nullable().optional(), displayName: z.string().nullable().optional(), email: z.string().nullable().optional(), firstName: z.string().nullable().optional(), function: z.string().nullable().optional(), invertedDisplayName: z.string().nullable().optional(), lastName: z.string().nullable().optional(), phone: z.string().nullable().optional(), service: z.string().nullable().optional(), title: z.string().nullable().optional()}); export const addressFields = z.object({city: z.string().nullable().optional(), countryIso: z.string().nullable().optional(), countryName: z.string().nullable().optional(), formattedAddress: z.string().nullable().optional(), inlineAddress: z.string().nullable().optional(), street: z.string().nullable().optional(), zipcode: z.string().nullable().optional()}); export const companySettingsDto = z.object({ape: z.string().nullable().optional(), businessName: z.string().nullable().optional(), capital: z.number().nullable().optional(), cgaMember: z.boolean().optional(), contact: contactFields.optional(), electronicAddress: z.string().nullable().optional(), emailLogoUri: z.string().nullable().optional(), guarantees: z.string().nullable().optional(), headOfficeAddress: addressFields.optional(), invoicingAddress: addressFields.optional(), isMicroBusiness: z.boolean().optional(), legalMentions: z.string().nullable().optional(), legalStatus: z.string().nullable().optional(), logoUri: z.string().nullable().optional(), mediator: z.string().nullable().optional(), name: z.string().nullable().optional(), registrationNumber: z.string().nullable().optional(), reportLogoUri: z.string().nullable().optional(), siret: z.string().nullable().optional(), summary: z.string().nullable().optional(), summaryHtml: z.string().nullable().optional(), urlCompanyName: z.string().nullable().optional(), useInvoicingAddressAsHeadOfficeAddress: z.boolean().optional(), vatNumber: z.string().nullable().optional(), website: z.string().nullable().optional()}); export const eInvoicingProfile = z.enum(["Standard", "Advanced"]); export const eInvoicingSettingsDto = z.object({autoAcknowledgeReceivedInvoices: z.boolean().optional(), autoCreateReceiptFromIncomingPayment: z.boolean().optional(), autoEmitPaymentReceived: z.boolean().optional(), autoEmitPaymentSent: z.boolean().optional(), autoProcessTerminalStatuses: z.boolean().optional(), autoSendEReporting: z.boolean().optional(), autoSubmitInvoicesOnFinalize: z.boolean().optional(), includeTextLinesInXml: z.boolean().optional(), profile: eInvoicingProfile.optional(), validateAddressesBeforeSubmit: z.boolean().optional(), validateBeforeSubmit: z.boolean().optional()}); export const emailAttachmentDto = z.object({fileId: z.number().int().optional(), fileName: z.string().nullable().optional(), fileSize: z.number().optional()}); export const emailCreditSettingsDto = z.object({defaultAttachments: z.array(emailAttachmentDto).nullable().optional(), defaultBccEmails: z.array(z.string()).nullable().optional(), defaultCcEmails: z.array(z.string()).nullable().optional(), defaultContentTemplate: z.string().nullable().optional(), defaultObjectTemplate: z.string().nullable().optional(), includeDocumentAttachment: z.boolean().optional(), showAmount: z.boolean().optional()}); export const emailHomecareServiceSettingsDto = z.object({defaultAttachments: z.array(emailAttachmentDto).nullable().optional(), defaultBccEmails: z.array(z.string()).nullable().optional(), defaultCcEmails: z.array(z.string()).nullable().optional(), defaultContentTemplate: z.string().nullable().optional(), defaultObjectTemplate: z.string().nullable().optional()}); export const emailInvoiceSettingsDto = z.object({defaultAttachments: z.array(emailAttachmentDto).nullable().optional(), defaultBccEmails: z.array(z.string()).nullable().optional(), defaultCcEmails: z.array(z.string()).nullable().optional(), defaultContentTemplate: z.string().nullable().optional(), defaultObjectTemplate: z.string().nullable().optional(), includeDocumentAttachment: z.boolean().optional(), showAmount: z.boolean().optional()}); export const emailQuoteSettingsDto = z.object({defaultAttachments: z.array(emailAttachmentDto).nullable().optional(), defaultBccEmails: z.array(z.string()).nullable().optional(), defaultCcEmails: z.array(z.string()).nullable().optional(), defaultContentTemplate: z.string().nullable().optional(), defaultObjectTemplate: z.string().nullable().optional(), includeDocumentAttachment: z.boolean().optional(), showAmount: z.boolean().optional()}); export const emailReminderSettingsDto = z.object({defaultAttachments: z.array(emailAttachmentDto).nullable().optional(), defaultBccEmails: z.array(z.string()).nullable().optional(), defaultCcEmails: z.array(z.string()).nullable().optional(), defaultContentTemplate: z.string().nullable().optional(), defaultObjectTemplate: z.string().nullable().optional(), includeDocumentAttachment: z.boolean().optional()}); export const emailStyleSettingsDto = z.object({backgroundColor: z.string().nullable().optional(), buttonColor: z.string().nullable().optional(), buttonTextColor: z.string().nullable().optional(), headerBackgroundColor: z.string().nullable().optional(), headerForeColor: z.string().nullable().optional(), outerColor: z.string().nullable().optional(), textColor: z.string().nullable().optional()}); export const emailingSettingsDto = z.object({credits: emailCreditSettingsDto.optional(), homecareServices: emailHomecareServiceSettingsDto.optional(), invoices: emailInvoiceSettingsDto.optional(), quotes: emailQuoteSettingsDto.optional(), reminders: emailReminderSettingsDto.optional(), style: emailStyleSettingsDto.optional()}); export const companyInfoLinkProvider = z.enum(["Pappers", "Infogreffe", "Manageo", "Verif"]); export const contactNameDisplay = z.enum(["LastNameFirstName", "FirstNameLastName"]); export const iPLinkProvider = z.enum(["IPInfo", "DBIP", "IPData", "IPGeolocation"]); export const mapLinkProvider = z.enum(["GoogleMaps", "BingMaps", "OpenStreetMap"]); export const generalSettingsDto = z.object({autoCollapseMenu: z.boolean().optional(), companyInfoLinkProvider: companyInfoLinkProvider.optional(), contactDisplayFormat: contactNameDisplay.optional(), ipLinkProvider: iPLinkProvider.optional(), mapLinkProvider: mapLinkProvider.optional(), timezone: z.string().nullable().optional()}); export const delayType = z.enum(["Days", "Months"]); export const conditionType = z.enum(["Net", "EndMonth"]); export const settlementTermConditionDto = z.object({dayOfMonth: z.number().int().nullable().optional(), delay: z.number().int().optional(), delayType: delayType.optional(), id: z.number().int().optional(), percent: z.number().optional(), type: conditionType.optional()}); export const settlementTermDto = z.object({conditions: z.array(settlementTermConditionDto).nullable().optional(), id: z.number().int().optional(), isCustom: z.boolean().optional(), name: z.string().nullable().optional()}); export const creditSettingsDto = z.object({validityDuration: z.number().int().nullable().optional()}); export const vatRegion = z.enum(["FR", "EU", "IE", "DOM", "Corse", "Monaco"]); export const vatDto = z.object({default: z.boolean().optional(), id: z.number().int().nullable().optional(), rate: z.number().nullable().optional(), region: vatRegion.optional()}); export const microBusinessDeclarationTypes = z.enum(["Products", "Services", "OtherServices", "Renting", "Cipav"]); export const classificationType = z.enum(["Sale", "Expense", "Other"]); export const classificationDto = z.object({accountNumber: z.string().nullable().optional(), defaultVat: vatDto.optional(), defaultVatId: z.number().int().nullable().optional(), description: z.string().nullable().optional(), id: z.number().int().nullable().optional(), isProduct: z.boolean().optional(), isService: z.boolean().optional(), label: z.string().nullable().optional(), metadatas: z.record(z.string(), z.string().nullable()).nullable().optional(), microBusinessDeclarationType: microBusinessDeclarationTypes.optional(), type: classificationType.optional()}); export const sharedFileDto = z.object({description: z.string().nullable().optional(), externalLinkHash: z.string().nullable().optional(), fileName: z.string().nullable().optional(), folderId: z.number().int().nullable().optional(), id: z.number().int().optional(), metadatas: z.record(z.string(), z.string().nullable()).nullable().optional(), size: z.number().optional(), system: z.boolean().optional(), uploadedAt: z.string().optional()}); export const invoiceSettingsDto = z.object({collectionCosts: z.string().nullable().optional(), earlyFinalizationDuration: z.number().int().nullable().optional(), invoiceZeroQuantityLines: z.boolean().optional(), latePaymentPenalty: z.string().nullable().optional(), substractDepositFromTaxExcludedAmount: z.boolean().optional()}); export const productType = z.enum(["Product", "Service", "Text"]); export const paymentMethod = z.enum(["Transfer", "Order", "Check", "Cash", "Card", "Bill", "Usec", "Other"]); export const quoteSettingsDto = z.object({depositDefaultValue: z.number().optional(), validityDuration: z.number().int().optional()}); export const salesSettingsDto = z.object({allowInlineDate: z.boolean().optional(), btoBSettlementTerm: settlementTermDto.optional(), btoBSettlementTermId: z.number().int().nullable().optional(), btoCSettlementTerm: settlementTermDto.optional(), btoCSettlementTermId: z.number().int().nullable().optional(), credits: creditSettingsDto.optional(), customersLiableToEInvoicing: z.boolean().optional(), customersLiableToVat: z.boolean().optional(), defaultProductClassification: classificationDto.optional(), defaultServiceClassification: classificationDto.optional(), defaultShippingClassification: classificationDto.optional(), generalTermsFile: sharedFileDto.optional(), generalTermsFileId: z.number().int().nullable().optional(), invoices: invoiceSettingsDto.optional(), mainActivity: productType.optional(), outstandingLimit: z.number().nullable().optional(), paymentMethod: paymentMethod.optional(), quotes: quoteSettingsDto.optional(), useTaxIncluded: z.boolean().optional(), vatReverseCharge: z.boolean().optional()}); export const socials = z.object({facebook: z.string().nullable().optional(), instagram: z.string().nullable().optional(), linkedIn: z.string().nullable().optional(), pinterest: z.string().nullable().optional(), twitter: z.string().nullable().optional(), youtube: z.string().nullable().optional()}); export const vatMode = z.enum(["Auto", "Debit", "Collection"]); export const vatDeclarationPeriodicity = z.enum(["Monthly", "Quarterly"]); export const vatRegime = z.enum(["Franchise", "Simplified", "Normal"]); export const vatSettingsDto = z.object({liableToVat: z.boolean().optional(), nonLiableTextToPrint: z.string().nullable().optional(), vatMode: vatMode.optional(), vatPeriod: vatDeclarationPeriodicity.optional(), vatRegime: vatRegime.optional()}); export const settings = z.object({accounting: accountingSettingsDto.optional(), company: companySettingsDto.optional(), eInvoicing: eInvoicingSettingsDto.optional(), emailing: emailingSettingsDto.optional(), general: generalSettingsDto.optional(), sales: salesSettingsDto.optional(), socials: socials.optional(), vat: vatSettingsDto.optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Get settings * * GET /v1/settings */ export const getApiV1Settings = async (options?: GetApiV1SettingsOptions) => { const {baseUrl = "https://api.altoviz.com", fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") const url = `${baseUrl.replace(/\/+$/, '')}/v1/settings${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(settings, await res.json()) };