diff --git a/src/routes/settings.import.tsx b/src/routes/settings.import.tsx index edb52cd..6147976 100644 --- a/src/routes/settings.import.tsx +++ b/src/routes/settings.import.tsx @@ -1096,15 +1096,34 @@ function ImportPage() { } } if (withoutConflict.length > 0) { - const { data, error } = await supabase - .from(cfg.table as any) - .insert(withoutConflict as any) - .select("*"); - if (error) { - errors.push(`Batch ${i / chunkSize + 1} (insert): ${error.message}`); - } else if (data) { - inserted += data.length; - inserted_rows.push(...data); + // For cases without external_id, upsert on case_number to avoid duplicate-key errors on re-import + if (cfg.table === "cases") { + const withCaseNum = withoutConflict.filter((r) => r.case_number); + const noCaseNum = withoutConflict.filter((r) => !r.case_number); + if (withCaseNum.length > 0) { + const { data, error } = await supabase + .from("cases" as any) + .upsert(withCaseNum as any, { onConflict: "case_number", ignoreDuplicates: false }) + .select("*"); + if (error) errors.push(`Batch ${i / chunkSize + 1} (upsert case_number): ${error.message}`); + else if (data) { inserted += data.length; inserted_rows.push(...(data as Row[])); } + } + if (noCaseNum.length > 0) { + const { data, error } = await supabase.from("cases" as any).insert(noCaseNum as any).select("*"); + if (error) errors.push(`Batch ${i / chunkSize + 1} (insert): ${error.message}`); + else if (data) { inserted += data.length; inserted_rows.push(...(data as Row[])); } + } + } else { + const { data, error } = await supabase + .from(cfg.table as any) + .insert(withoutConflict as any) + .select("*"); + if (error) { + errors.push(`Batch ${i / chunkSize + 1} (insert): ${error.message}`); + } else if (data) { + inserted += data.length; + inserted_rows.push(...data); + } } } }