diff --git a/src/routes/settings.import.tsx b/src/routes/settings.import.tsx index 91642b3..65a7f57 100644 --- a/src/routes/settings.import.tsx +++ b/src/routes/settings.import.tsx @@ -427,6 +427,7 @@ const IMPORTERS: ImporterConfig[] = [ aliases: { id: "external_id", expenseid: "external_id", externalid: "external_id", caseid: "_caseext", matterid: "_caseext", casenumber: "_casenum", + casename: "_casename", casetitle: "_casename", matter: "_casename", mattername: "_casename", description: "description", notes: "description", amount: "amount", cost: "amount", billable: "billable", @@ -436,8 +437,12 @@ const IMPORTERS: ImporterConfig[] = [ boolCols: ["billable"], dateCols: ["expense_date"], transform: (r, ctx) => { - r.case_id = (r._caseext && ctx.caseByExt.get(String(r._caseext))) || (r._casenum && ctx.caseByNumber.get(String(r._casenum))) || null; - delete r._caseext; delete r._casenum; + r.case_id = + (r._caseext && ctx.caseByExt.get(String(r._caseext))) || + (r._casenum && ctx.caseByNumber.get(String(r._casenum))) || + (r._casename && ctx.caseByTitle.get(String(r._casename).toLowerCase().trim())) || + null; + delete r._caseext; delete r._casenum; delete r._casename; if (!r.case_id || r.amount == null) return null; r.user_id = ctx.userId; return r; @@ -705,6 +710,12 @@ function ImportPage() { bumpSkip("missing or invalid hours"); } else if (cfg.table === "time_entries" && !row.description && !row._activity) { bumpSkip("missing description/activity"); + } else if (cfg.table === "expenses" && !row.case_id && !row._caseext && !row._casenum && !row._casename) { + bumpSkip("missing case reference"); + } else if (cfg.table === "expenses" && (row._caseext || row._casenum || row._casename) && !row.case_id) { + bumpSkip("case not found (import cases first or match case title/number)"); + } else if (cfg.table === "expenses" && row.amount == null) { + bumpSkip("missing or invalid amount"); } else { bumpSkip("rejected by transform"); }