feat(suppliers)!: full customers model - structured address + custom fields
The dodavatele modal is now an exact mirror of the customers modal (minus the PDF field-order picker): Nazev+ARES, Ulice, Mesto+PSC, Zeme, ICO+ARES, DIC, and the same "Vlastni pole" editor (maxWidth md). Two migrations on sklad_suppliers: - structured street/city/postal_code/country replace the free-text address blob (best-effort split: street / PSC regex / city) - custom_fields LONGTEXT replaces contact_person/email/phone/notes; existing values are preserved as labeled custom fields The encode/decode of the custom_fields blob is shared with customers via the new utils/custom-fields.ts. The PO PDF supplier block renders the structured address + custom-field lines like the customer block; the supplier picker/detail selects and types follow. Legacy clients sending the dropped keys are silently stripped (tested). Suppliers list shows Ulice/Mesto instead of the dropped contact columns; search covers name/ico/city. BREAKING CHANGE: sklad_suppliers.address, contact_person, email, phone, notes columns dropped (data migrated); deploy must run prisma migrate deploy + generate. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -240,18 +240,25 @@ describe("schema hardening — does not reject previously-valid input", () => {
|
||||
).toBe(false);
|
||||
});
|
||||
|
||||
it("warehouse supplier: empty email accepted, valid accepted, bad rejected", () => {
|
||||
expect(
|
||||
CreateSupplierSchema.safeParse({ name: "Dodavatel", email: "" }).success,
|
||||
).toBe(true);
|
||||
expect(
|
||||
CreateSupplierSchema.safeParse({ name: "Dodavatel", email: "x@y.cz" })
|
||||
.success,
|
||||
).toBe(true);
|
||||
expect(
|
||||
CreateSupplierSchema.safeParse({ name: "Dodavatel", email: "nope" })
|
||||
.success,
|
||||
).toBe(false);
|
||||
it("warehouse supplier: dropped legacy contact/address keys are silently stripped", () => {
|
||||
// email/phone/contact_person/notes/address columns were replaced by the
|
||||
// customers-model custom_fields blob (2026-06); legacy clients still
|
||||
// sending them must not 400 — z.object strips unknown keys.
|
||||
const parsed = CreateSupplierSchema.safeParse({
|
||||
name: "Dodavatel",
|
||||
email: "x@y.cz",
|
||||
phone: "123",
|
||||
contact_person: "Jan",
|
||||
notes: "n",
|
||||
address: "Ulice 1",
|
||||
custom_fields: [{ name: "Kontakt", value: "Jan", showLabel: true }],
|
||||
});
|
||||
expect(parsed.success).toBe(true);
|
||||
if (parsed.success) {
|
||||
expect("email" in parsed.data).toBe(false);
|
||||
expect("address" in parsed.data).toBe(false);
|
||||
expect(parsed.data.custom_fields).toHaveLength(1);
|
||||
}
|
||||
});
|
||||
|
||||
it("trips: trip_date accepts a date-only AND a datetime round-trip from @db.Date", () => {
|
||||
|
||||
Reference in New Issue
Block a user