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:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user