Reverted import & fixed format

X-Lovable-Edit-ID: edt-eadd5108-90ff-4da6-a8f9-0525ec4588dc
Co-authored-by: renee-png <262607627+renee-png@users.noreply.github.com>
This commit is contained in:
gpt-engineer-app[bot]
2026-04-19 18:02:34 +00:00
co-authored by renee-png
+29 -10
View File
@@ -188,7 +188,7 @@ const IMPORTERS: ImporterConfig[] = [
description: "Matters / cases linked to a client.",
table: "cases",
conflict: "external_id",
required: ["case_number", "title"],
required: ["title"],
aliases: {
// Identifiers
id: "external_id", caseid: "external_id", externalid: "external_id", mycaseid: "external_id",
@@ -287,15 +287,9 @@ const IMPORTERS: ImporterConfig[] = [
const bm = String(r.billing_method).toLowerCase();
r.billing_method = bm.includes("flat") ? "flat" : bm.includes("contingency") ? "contingency" : bm.includes("hour") ? "hourly" : null;
}
// Generate a collision-free case number when none was provided.
// Uses crypto.randomUUID so simultaneous rows in the same batch never collide.
if (!r.case_number || !String(r.case_number).trim()) {
const uid = (typeof crypto !== "undefined" && "randomUUID" in crypto)
? crypto.randomUUID().slice(0, 8).toUpperCase()
: `${Date.now().toString(36)}${Math.floor(Math.random() * 1e6).toString(36)}`.toUpperCase();
r.case_number = `CASE-${uid}`;
}
if (!r.title) r.title = r.case_number;
// Leave case_number blank when missing — assigned in a sequential
// "YYYY-####" pass before insert (see below). Do not synthesize title
// from case_number; preserve the imported matter name as-is.
return r;
},
postInsert: (rows, ctx) => {
@@ -1061,6 +1055,31 @@ function ImportPage() {
return;
}
// For cases: assign sequential "YYYY-####" numbers to any row missing a
// case_number, continuing from the highest existing number for the year.
if (cfg.table === "cases") {
const year = new Date().getFullYear();
const prefix = `${year}-`;
const { data: existing } = await supabase
.from("cases")
.select("case_number")
.like("case_number", `${prefix}%`);
let maxSeq = 0;
for (const row of (existing ?? []) as Array<{ case_number: string | null }>) {
const m = /^(\d{4})-(\d+)$/.exec(String(row.case_number ?? ""));
if (m && m[1] === String(year)) {
const n = parseInt(m[2], 10);
if (Number.isFinite(n) && n > maxSeq) maxSeq = n;
}
}
for (const r of mapped) {
if (!r.case_number || !String(r.case_number).trim()) {
maxSeq += 1;
r.case_number = `${prefix}${String(maxSeq).padStart(4, "0")}`;
}
}
}
// Batch upsert in chunks of 200
const chunkSize = 200;
let inserted = 0;