modifiche a required di dataRitiro e dataConsegna
All checks were successful
Deploy to VPS / build (push) Successful in 24s
Deploy to VPS / deploy (push) Successful in 17s

This commit is contained in:
AV77web 2026-06-24 21:51:25 +02:00
parent 1f11e497b2
commit 5be48695d1
4 changed files with 61 additions and 43 deletions

View file

@ -51,14 +51,10 @@ type ConsegnaFormState = {
chiaveConsegna: string;
};
function todayIso(): string {
return new Date().toISOString().slice(0, 10);
}
const emptyForm = (): ConsegnaFormState => ({
clienteId: "",
dataRitiro: todayIso(),
dataConsegna: todayIso(),
dataRitiro: "",
dataConsegna: "",
stato: "in deposito",
chiaveConsegna: "",
});
@ -66,14 +62,15 @@ const emptyForm = (): ConsegnaFormState => ({
function toFormState(consegna: Consegna): ConsegnaFormState {
return {
clienteId: String(consegna.clienteId),
dataRitiro: consegna.dataRitiro,
dataConsegna: consegna.dataConsegna,
dataRitiro: consegna.dataRitiro ?? "",
dataConsegna: consegna.dataConsegna ?? "",
stato: consegna.stato,
chiaveConsegna: consegna.chiaveConsegna,
};
}
function formatDate(value: string): string {
function formatDate(value: string | null): string {
if (!value) return "—";
const [y, m, d] = value.split("-");
return `${d}/${m}/${y}`;
}
@ -306,6 +303,9 @@ export default function ConsegnePage() {
/>
</FormField>
</div>
<p className="text-xs text-muted-foreground -mt-2">
Almeno una delle due date è obbligatoria.
</p>
<FormField id="stato" label="Stato" error={fieldErrors.stato}>
<Select
value={form.stato}

View file

@ -30,8 +30,8 @@ export type StatoConsegna =
export interface Consegna {
id: number;
dataRitiro: string;
dataConsegna: string;
dataRitiro: string | null;
dataConsegna: string | null;
stato: StatoConsegna;
chiaveConsegna: string;
clienteId: number;
@ -61,8 +61,8 @@ export interface UtenteAdminFormInput {
}
export interface VerificaConsegna {
dataRitiro: string;
dataConsegna: string;
dataRitiro: string | null;
dataConsegna: string | null;
stato: StatoConsegna;
clienteNome: string;
clienteCognome: string;

View file

@ -16,13 +16,18 @@ export type StatoConsegna =
(typeof CONSEGNA_CONSTRAINTS.stato.allowedValues)[number];
export interface ConsegnaInput {
dataRitiro: string;
dataConsegna: string;
dataRitiro: string | null;
dataConsegna: string | null;
stato: StatoConsegna;
chiaveConsegna: string;
clienteId: number;
}
function normalizeOptionalDate(value: unknown): string | null {
const str = normalizeString(value);
return str || null;
}
function todayAtMidnight(): Date {
const today = new Date();
today.setHours(0, 0, 0, 0);
@ -43,10 +48,31 @@ function validateDateNotRetroactive(
}
}
function validateOptionalDateField(
errors: FieldErrors,
field: string,
value: string | null,
label: string
): void {
if (!value) return;
validateDate(errors, field, value, label);
validateDateNotRetroactive(errors, field, value, label);
}
function validateAtLeastOneDate(
errors: FieldErrors,
dataRitiro: string | null,
dataConsegna: string | null
): void {
if (!dataRitiro && !dataConsegna) {
errors._form = "Inserire almeno una data di ritiro o di consegna";
}
}
export function normalizeConsegnaInput(raw: Record<string, unknown>): ConsegnaInput {
return {
dataRitiro: normalizeString(raw.dataRitiro),
dataConsegna: normalizeString(raw.dataConsegna),
dataRitiro: normalizeOptionalDate(raw.dataRitiro),
dataConsegna: normalizeOptionalDate(raw.dataConsegna),
stato: normalizeString(raw.stato || "in deposito") as StatoConsegna,
chiaveConsegna: normalizeString(raw.chiaveConsegna).toUpperCase(),
clienteId: normalizePositiveInt(raw.clienteId),
@ -60,20 +86,17 @@ function validateConsegnaFields(
options: { requireAll: boolean }
): void {
if (options.requireAll || "dataRitiro" in raw) {
validateRequired(errors, "dataRitiro", data.dataRitiro, "Data ritiro obbligatoria");
validateDate(errors, "dataRitiro", data.dataRitiro, "Data ritiro");
validateDateNotRetroactive(errors, "dataRitiro", data.dataRitiro, "Data ritiro");
validateOptionalDateField(errors, "dataRitiro", data.dataRitiro, "Data ritiro");
}
if (options.requireAll || "dataConsegna" in raw) {
validateRequired(
errors,
"dataConsegna",
data.dataConsegna,
"Data consegna obbligatoria"
);
validateDate(errors, "dataConsegna", data.dataConsegna, "Data consegna");
validateDateNotRetroactive(errors, "dataConsegna", data.dataConsegna, "Data consegna");
validateOptionalDateField(errors, "dataConsegna", data.dataConsegna, "Data consegna");
}
if (options.requireAll) {
validateAtLeastOneDate(errors, data.dataRitiro, data.dataConsegna);
} else if ("dataRitiro" in raw && "dataConsegna" in raw) {
validateAtLeastOneDate(errors, data.dataRitiro, data.dataConsegna);
}
if (options.requireAll || "stato" in raw) {
@ -124,22 +147,17 @@ export function validateConsegnaUpdate(
const data: Partial<ConsegnaInput> = {};
if ("dataRitiro" in raw) {
data.dataRitiro = normalizeString(raw.dataRitiro);
validateRequired(errors, "dataRitiro", data.dataRitiro, "Data ritiro obbligatoria");
validateDate(errors, "dataRitiro", data.dataRitiro, "Data ritiro");
validateDateNotRetroactive(errors, "dataRitiro", data.dataRitiro, "Data ritiro");
data.dataRitiro = normalizeOptionalDate(raw.dataRitiro);
validateOptionalDateField(errors, "dataRitiro", data.dataRitiro, "Data ritiro");
}
if ("dataConsegna" in raw) {
data.dataConsegna = normalizeString(raw.dataConsegna);
validateRequired(
errors,
"dataConsegna",
data.dataConsegna,
"Data consegna obbligatoria"
);
validateDate(errors, "dataConsegna", data.dataConsegna, "Data consegna");
validateDateNotRetroactive(errors, "dataConsegna", data.dataConsegna, "Data consegna");
data.dataConsegna = normalizeOptionalDate(raw.dataConsegna);
validateOptionalDateField(errors, "dataConsegna", data.dataConsegna, "Data consegna");
}
if ("dataRitiro" in raw && "dataConsegna" in raw) {
validateAtLeastOneDate(errors, data.dataRitiro ?? null, data.dataConsegna ?? null);
}
if ("stato" in raw) {

View file

@ -28,8 +28,8 @@ export const CLIENTE_CONSTRAINTS = {
} as const;
export const CONSEGNA_CONSTRAINTS = {
dataconsegna: { required: true },
dataritiro: { required: true },
dataRitiro: { required: false },
dataConsegna: { required: false },
stato: {
allowedValues: ["da ritirare", "in consegna", "in giacenza", "in deposito"],
required: true,