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; chiaveConsegna: string;
}; };
function todayIso(): string {
return new Date().toISOString().slice(0, 10);
}
const emptyForm = (): ConsegnaFormState => ({ const emptyForm = (): ConsegnaFormState => ({
clienteId: "", clienteId: "",
dataRitiro: todayIso(), dataRitiro: "",
dataConsegna: todayIso(), dataConsegna: "",
stato: "in deposito", stato: "in deposito",
chiaveConsegna: "", chiaveConsegna: "",
}); });
@ -66,14 +62,15 @@ const emptyForm = (): ConsegnaFormState => ({
function toFormState(consegna: Consegna): ConsegnaFormState { function toFormState(consegna: Consegna): ConsegnaFormState {
return { return {
clienteId: String(consegna.clienteId), clienteId: String(consegna.clienteId),
dataRitiro: consegna.dataRitiro, dataRitiro: consegna.dataRitiro ?? "",
dataConsegna: consegna.dataConsegna, dataConsegna: consegna.dataConsegna ?? "",
stato: consegna.stato, stato: consegna.stato,
chiaveConsegna: consegna.chiaveConsegna, chiaveConsegna: consegna.chiaveConsegna,
}; };
} }
function formatDate(value: string): string { function formatDate(value: string | null): string {
if (!value) return "—";
const [y, m, d] = value.split("-"); const [y, m, d] = value.split("-");
return `${d}/${m}/${y}`; return `${d}/${m}/${y}`;
} }
@ -306,6 +303,9 @@ export default function ConsegnePage() {
/> />
</FormField> </FormField>
</div> </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}> <FormField id="stato" label="Stato" error={fieldErrors.stato}>
<Select <Select
value={form.stato} value={form.stato}

View file

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

View file

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

View file

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