infoalloggi-monorepo/apps/infoalloggi/src/server/services/fic.service.ts

88 lines
3 KiB
TypeScript
Raw Normal View History

2025-08-04 17:45:44 +02:00
import { z } from "zod";
const ClientTypeSchema = z.enum(["company", "person", "pa", "condo"]);
const VatTypeSchema = z.object({
id: z.number().nullish(),
value: z.number().nullish(),
description: z.string().nullish(),
notes: z.string().nullish(),
e_invoice: z.boolean().nullish(),
ei_type: z.string().nullish(),
ei_description: z.string().nullish(),
editable: z.boolean().nullish(),
is_disabled: z.boolean().nullish(),
});
const PaymentTermsTypeSchema = z.enum(["standard", "end_of_month"]);
const PaymentMethodTypeSchema = z.enum(["standard", "riba"]);
const PaymentAccountTypeSchema = z.enum(["standard", "bank"]);
const PaymentAccountSchema = z.object({
id: z.number().nullish(),
name: z.string().nullish(),
type: PaymentAccountTypeSchema.optional(),
iban: z.string().nullish(),
sia: z.string().nullish(),
cuc: z.string().nullish(),
virtual: z.boolean().nullish(),
});
const PaymentMethodDetailsSchema = z.object({
title: z.string().nullish(),
description: z.string().nullish(),
});
const PaymentMethodSchema = z.object({
id: z.number().nullish(),
name: z.string().nullish(),
type: PaymentMethodTypeSchema.optional(),
is_default: z.boolean().nullish(),
default_payment_account: PaymentAccountSchema.nullish(),
details: z.array(PaymentMethodDetailsSchema).optional(),
bank_iban: z.string().nullish(),
bank_name: z.string().nullish(),
bank_beneficiary: z.string().nullish(),
ei_payment_method: z.string().nullish(),
});
export const ClientSchema = z.object({
id: z.number().nullish(),
code: z.string().nullish(),
name: z.string().nullish(),
type: ClientTypeSchema.nullish(),
first_name: z.string().nullish(),
last_name: z.string().nullish(),
contact_person: z.string().nullish(),
vat_number: z.string().nullish(),
tax_code: z.string().nullish(),
address_street: z.string().nullish(),
address_postal_code: z.string().nullish(),
address_city: z.string().nullish(),
address_province: z.string().nullish(),
address_extra: z.string().nullish(),
country: z.string().nullish(),
country_iso: z.string().nullish(),
email: z.string().nullish(),
certified_email: z.string().nullish(),
phone: z.string().nullish(),
fax: z.string().nullish(),
notes: z.string().nullish(),
default_vat: VatTypeSchema.nullish(),
default_payment_terms: z.number().nullish(),
default_payment_terms_type: PaymentTermsTypeSchema.optional(),
default_payment_method: PaymentMethodSchema.optional(),
bank_name: z.string().nullish(),
bank_iban: z.string().nullish(),
bank_swift_code: z.string().nullish(),
shipping_address: z.string().nullish(),
e_invoice: z.boolean().nullish(),
ei_code: z.string().nullish(),
discount_highlight: z.boolean().nullish(),
default_discount: z.number().nullish(),
has_intent_declaration: z.boolean().nullish(),
intent_declaration_protocol_number: z.string().nullish(),
intent_declaration_protocol_date: z.string().nullish(),
created_at: z.string().nullish(),
updated_at: z.string().nullish(),
});