|
|
import { FLOCK_VALIDATION_MESSAGES } from "@/lib/constants/flock-limits";
|
|
|
import {
|
|
|
defaultMothershipReadyDateIso,
|
|
|
isMothershipWeekendIso,
|
|
|
parseIsoDateLocal,
|
|
|
snapMothershipReadyDateToWeekday,
|
|
|
toIsoDateLocal,
|
|
|
} from "@/lib/mothership/logged-in-constraints";
|
|
|
|
|
|
const ISO_DATE_RE = /^\d{4}-\d{2}-\d{2}$/;
|
|
|
const ISO_DATE_CAPTURE_RE = /^(\d{4})-(\d{2})-(\d{2})$/;
|
|
|
const DISPLAY_DATE_RE = /^(\d{2})\/(\d{2})\/(\d{4})$/;
|
|
|
|
|
|
/** 本地日历最早可选日:今天(若为周末则拨到周一),PRD §14.3 */
|
|
|
export function minFlockPickupDateIso(): string {
|
|
|
return defaultMothershipReadyDateIso();
|
|
|
}
|
|
|
|
|
|
export function flockPickupIsoFromDisplay(display: string): string | null {
|
|
|
const trimmed = display.trim();
|
|
|
const m = DISPLAY_DATE_RE.exec(trimmed);
|
|
|
if (!m) return null;
|
|
|
return `${m[3]}-${m[1]}-${m[2]}`;
|
|
|
}
|
|
|
|
|
|
export function isFlockPickupDateOnOrAfterToday(iso: string): boolean {
|
|
|
if (!ISO_DATE_RE.test(iso)) return false;
|
|
|
return iso >= minFlockPickupDateIso();
|
|
|
}
|
|
|
|
|
|
export function flockPickupDateValidationMessageFromIso(
|
|
|
iso: string,
|
|
|
): string | null {
|
|
|
if (!iso.trim()) {
|
|
|
return FLOCK_VALIDATION_MESSAGES.pickupDate;
|
|
|
}
|
|
|
if (!ISO_DATE_RE.test(iso)) {
|
|
|
return FLOCK_VALIDATION_MESSAGES.pickupDate;
|
|
|
}
|
|
|
if (!isFlockPickupDateOnOrAfterToday(iso)) {
|
|
|
return FLOCK_VALIDATION_MESSAGES.pickupDateTooEarly;
|
|
|
}
|
|
|
if (isMothershipWeekendIso(iso)) {
|
|
|
return FLOCK_VALIDATION_MESSAGES.pickupDateWeekend;
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
export function flockPickupDateValidationMessageFromDisplay(
|
|
|
display: string,
|
|
|
): string | null {
|
|
|
if (!DISPLAY_DATE_RE.test(display.trim())) {
|
|
|
return FLOCK_VALIDATION_MESSAGES.pickupDate;
|
|
|
}
|
|
|
const iso = flockPickupIsoFromDisplay(display);
|
|
|
if (!iso) {
|
|
|
return FLOCK_VALIDATION_MESSAGES.pickupDate;
|
|
|
}
|
|
|
if (!isFlockPickupDateOnOrAfterToday(iso)) {
|
|
|
return FLOCK_VALIDATION_MESSAGES.pickupDateTooEarly;
|
|
|
}
|
|
|
if (isMothershipWeekendIso(iso)) {
|
|
|
return FLOCK_VALIDATION_MESSAGES.pickupDateWeekend;
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
export function flockPickupDisplayFromIso(iso: string): string {
|
|
|
const m = ISO_DATE_CAPTURE_RE.exec(iso.trim());
|
|
|
if (!m) return iso;
|
|
|
return `${m[2]}/${m[3]}/${m[1]}`;
|
|
|
}
|
|
|
|
|
|
/** 表单默认取货日:最早可选日的下一工作日 */
|
|
|
export function defaultFlockPickupDateIso(): string {
|
|
|
const min = parseIsoDateLocal(minFlockPickupDateIso()) ?? new Date();
|
|
|
min.setDate(min.getDate() + 1);
|
|
|
return snapMothershipReadyDateToWeekday(toIsoDateLocal(min));
|
|
|
}
|