feat(categorize): dimension bags end-to-end + runtime template learning (#1273)
* feat(categorize): dimension bags end-to-end + runtime template learning The categorize path could not tag: categorize-core accepted a dimensions bag but no route or UI ever passed one, and runtime template learning dropped the bag entirely (only SIE import produced dimension-carrying patterns). - CategorizeTransactionSchema gains dimensions; the dashboard route, v1 single and v1 batch-categorize apply it to the mapping result's business lines (explicit bag wins over a learned counterparty bag). - categorization_templates.default_dimensions (migration 20260728091000) records the bag of the latest tagged booking; latest-explicit-wins, an untagged booking never erases it. Applied on the legacy single-line template path and the mirrored-refund path; multi-line SIE patterns keep their authoritative per-entry bags. - QuickReviewDialog gets a LineDimensionFields picker (dimensions_enabled gate, same as BulkBookDialog), prefilled from the counterparty suggestion's learned bag; hidden for multi-line patterns whose per-line bags would ignore an edit. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Renumber migration above 20260728120000 (out-of-order vs prod after #1271) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
951b33363b
commit
222e581476
@@ -295,6 +295,13 @@ export const POST = withApiV1<{ params: Promise<{ companyId: string; id: string
|
||||
}
|
||||
}
|
||||
|
||||
// Dimensions: an explicitly supplied bag tags the business lines of the
|
||||
// generated verifikat (bank/VAT legs stay untagged). Wins over a learned
|
||||
// counterparty-template bag; omitted = the learned bag (if any) applies.
|
||||
if (body.dimensions && Object.keys(body.dimensions).length > 0) {
|
||||
mappingResult.dimensions = body.dimensions
|
||||
}
|
||||
|
||||
if (!mappingResult.debit_account || !mappingResult.credit_account) {
|
||||
return v1ErrorResponseFromCode('TX_CATEGORIZE_INVALID_MAPPING', txLog, {
|
||||
requestId: ctx.requestId,
|
||||
|
||||
@@ -187,6 +187,11 @@ async function categorizeOne(
|
||||
input.vat_treatment,
|
||||
)
|
||||
}
|
||||
// Dimensions: an explicitly supplied bag tags the business lines of the
|
||||
// generated verifikat (bank/VAT legs stay untagged).
|
||||
if (input.dimensions && Object.keys(input.dimensions).length > 0) {
|
||||
mappingResult.dimensions = input.dimensions
|
||||
}
|
||||
if (!mappingResult.debit_account || !mappingResult.credit_account) {
|
||||
return {
|
||||
ok: false,
|
||||
|
||||
Reference in New Issue
Block a user