FactuGES_ERP/modules/customer-invoices/src/web/schemas/customer-invoices.form.schema.ts

161 lines
3.3 KiB
TypeScript
Raw Normal View History

2025-10-06 17:40:37 +00:00
import { MoneySchema, PercentageSchema, QuantitySchema } from "@erp/core";
2025-10-11 16:44:38 +00:00
import { ArrayElement } from "@repo/rdx-utils";
2025-09-24 17:30:35 +00:00
import { z } from "zod/v4";
2025-09-24 15:09:37 +00:00
2025-10-06 17:40:37 +00:00
export const CustomerInvoiceItemFormSchema = z.object({
isNonValued: z.boolean().optional(),
2025-10-07 16:38:03 +00:00
description: z.string().optional(),
quantity: QuantitySchema.optional(),
unit_amount: MoneySchema.optional(),
subtotal_amount: MoneySchema.optional(),
discount_percentage: PercentageSchema.optional(),
discount_amount: MoneySchema.optional(),
taxable_amount: MoneySchema.optional(),
2025-10-06 17:40:37 +00:00
tax_codes: z.array(z.string()).default([]),
taxes: z
.array(
z.object({
label: z.string(),
percentage: z.number(),
amount: MoneySchema.optional(),
})
)
.optional(),
2025-10-07 16:38:03 +00:00
taxes_amount: MoneySchema.optional(),
total_amount: MoneySchema.optional(),
2025-10-06 17:40:37 +00:00
});
2025-09-24 17:30:35 +00:00
export const CustomerInvoiceFormSchema = z.object({
invoice_number: z.string().optional(),
2025-09-29 18:22:59 +00:00
status: z.string(),
2025-09-24 17:30:35 +00:00
series: z.string().optional(),
2025-09-29 18:22:59 +00:00
invoice_date: z.string().optional(),
operation_date: z.string().optional(),
customer_id: z.string().optional(),
2025-09-30 17:28:21 +00:00
description: z.string().optional(),
2025-09-29 18:22:59 +00:00
notes: z.string().optional(),
2025-10-06 17:40:37 +00:00
language_code: z
2025-09-29 18:22:59 +00:00
.string({
error: "El idioma es obligatorio",
})
.min(1, "Debe indicar un idioma")
.toUpperCase() // asegura mayúsculas
.default("es"),
currency_code: z
.string({
error: "La moneda es obligatoria",
})
.min(1, "La moneda no puede estar vacía")
.toUpperCase() // asegura mayúsculas
.default("EUR"),
2025-10-06 17:40:37 +00:00
/*taxes: z
2025-09-29 18:22:59 +00:00
.array(
z.object({
tax_code: z.string(),
taxable_amount: MoneySchema,
taxes_amount: MoneySchema,
})
)
.optional(),
2025-10-06 17:40:37 +00:00
*/
2025-09-29 18:22:59 +00:00
2025-10-06 17:40:37 +00:00
items: z.array(CustomerInvoiceItemFormSchema).optional(),
2025-09-29 18:22:59 +00:00
subtotal_amount: MoneySchema,
discount_percentage: PercentageSchema,
discount_amount: MoneySchema,
taxable_amount: MoneySchema,
taxes_amount: MoneySchema,
2025-10-06 17:40:37 +00:00
total_amount: MoneySchema,
2025-09-24 17:30:35 +00:00
});
2025-09-29 08:42:46 +00:00
export type CustomerInvoiceFormData = z.infer<typeof CustomerInvoiceFormSchema>;
2025-10-11 16:44:38 +00:00
export type CustomerInvoiceItemFormData = ArrayElement<CustomerInvoiceFormData["items"]>;
2025-09-29 08:42:46 +00:00
2025-10-07 16:38:03 +00:00
export const defaultCustomerInvoiceItemFormData: CustomerInvoiceItemFormData = {
description: "",
quantity: {
2025-10-08 13:11:26 +00:00
value: "",
2025-10-07 16:38:03 +00:00
scale: "2",
},
unit_amount: {
currency_code: "EUR",
2025-10-08 13:11:26 +00:00
value: "",
2025-10-07 16:38:03 +00:00
scale: "4",
},
discount_percentage: {
2025-10-08 13:11:26 +00:00
value: "",
2025-10-07 16:38:03 +00:00
scale: "2",
},
tax_codes: ["iva_21"],
total_amount: {
currency_code: "EUR",
2025-10-08 13:11:26 +00:00
value: "",
2025-10-07 16:38:03 +00:00
scale: "4",
},
};
2025-09-29 18:22:59 +00:00
export const defaultCustomerInvoiceFormData: CustomerInvoiceFormData = {
2025-09-29 08:42:46 +00:00
invoice_number: "",
status: "draft",
series: "",
2025-09-29 18:22:59 +00:00
invoice_date: "",
operation_date: "",
2025-09-30 17:28:21 +00:00
description: "",
2025-09-29 18:22:59 +00:00
notes: "",
language_code: "es",
currency_code: "EUR",
2025-10-06 17:40:37 +00:00
//taxes: [],
2025-09-29 18:22:59 +00:00
items: [],
subtotal_amount: {
currency_code: "EUR",
value: "0",
scale: "2",
},
discount_amount: {
currency_code: "EUR",
value: "0",
scale: "2",
},
discount_percentage: {
value: "0",
scale: "2",
},
taxable_amount: {
currency_code: "EUR",
value: "0",
scale: "2",
},
taxes_amount: {
currency_code: "EUR",
value: "0",
scale: "2",
},
total_amount: {
currency_code: "EUR",
value: "0",
scale: "2",
},
2025-09-29 08:42:46 +00:00
};