From 05f3b678c4463d40c39bb37ccfd02900ef64a977 Mon Sep 17 00:00:00 2001 From: florianfederspiel Date: Wed, 25 Mar 2026 16:03:54 +0100 Subject: [PATCH] Fix for Incoming Invoices --- backend/src/routes/resources/main.ts | 36 +++++++++++++++++++++++----- frontend/pages/banking/index.vue | 21 +++++++++------- 2 files changed, 43 insertions(+), 14 deletions(-) diff --git a/backend/src/routes/resources/main.ts b/backend/src/routes/resources/main.ts index a4e6407..62d5f87 100644 --- a/backend/src/routes/resources/main.ts +++ b/backend/src/routes/resources/main.ts @@ -136,6 +136,27 @@ function getTenantColumn(resource: string, table: any) { return table[tenantKey] } +function getRelationConfig(relation: string) { + const candidateKeys = [ + relation, + `${relation}s`, + ] + + if (relation.endsWith("y")) { + candidateKeys.push(`${relation.slice(0, -1)}ies`) + } + + if (/(s|x|z|ch|sh)$/.test(relation)) { + candidateKeys.push(`${relation}es`) + } + + for (const key of candidateKeys) { + if (resourceConfig[key]) return resourceConfig[key] + } + + return null +} + function isDateLikeField(key: string) { if (key === "deliveryDateType") return false if (key.includes("_at") || key.endsWith("At")) return true @@ -261,7 +282,7 @@ export default async function resourceRoutes(server: FastifyInstance) { if (config.mtoLoad) { config.mtoLoad.forEach(rel => { - const relConfig = resourceConfig[rel + "s"] || resourceConfig[rel] + const relConfig = getRelationConfig(rel) if (relConfig) { const relTable = relConfig.table @@ -307,7 +328,8 @@ export default async function resourceRoutes(server: FastifyInstance) { ids[rel] = [...new Set(rows.map(r => r[rel]).filter(Boolean))]; }) for await (const rel of config.mtoLoad) { - const relConf = resourceConfig[rel + "s"] || resourceConfig[rel]; + const relConf = getRelationConfig(rel) + if (!relConf) continue const relTab = relConf.table lists[rel] = ids[rel].length ? await server.db.select().from(relTab).where(inArray(relTab.id, ids[rel])) : [] maps[rel] = Object.fromEntries(lists[rel].map((i: any) => [i.id, i])); @@ -376,7 +398,7 @@ export default async function resourceRoutes(server: FastifyInstance) { if (config.mtoLoad) { config.mtoLoad.forEach(rel => { - const relConfig = resourceConfig[rel + "s"] || resourceConfig[rel]; + const relConfig = getRelationConfig(rel) if (relConfig) { const relTable = relConfig.table; @@ -457,7 +479,7 @@ export default async function resourceRoutes(server: FastifyInstance) { let distinctQuery = server.db.select({ v: col }).from(table).$dynamic(); if (config.mtoLoad) { config.mtoLoad.forEach(rel => { - const relConfig = resourceConfig[rel + "s"] || resourceConfig[rel]; + const relConfig = getRelationConfig(rel) if (!relConfig) return; const relTable = relConfig.table; if (relTable !== table) { @@ -496,7 +518,8 @@ export default async function resourceRoutes(server: FastifyInstance) { ids[rel] = [...new Set(rows.map(r => r[rel]).filter(Boolean))]; }); for await (const rel of config.mtoLoad) { - const relConf = resourceConfig[rel + "s"] || resourceConfig[rel]; + const relConf = getRelationConfig(rel) + if (!relConf) continue const relTab = relConf.table; lists[rel] = ids[rel].length ? await server.db.select().from(relTab).where(inArray(relTab.id, ids[rel])) : []; maps[rel] = Object.fromEntries(lists[rel].map((i: any) => [i.id, i])); @@ -567,7 +590,8 @@ export default async function resourceRoutes(server: FastifyInstance) { if (resourceConfig[resource].mtoLoad) { for await (const relation of resourceConfig[resource].mtoLoad) { if (data[relation]) { - const relConf = resourceConfig[relation + "s"] || resourceConfig[relation]; + const relConf = getRelationConfig(relation) + if (!relConf) continue const relTable = relConf.table const relData = await server.db.select().from(relTable).where(eq(relTable.id, data[relation])) data[relation] = relData[0] || null diff --git a/frontend/pages/banking/index.vue b/frontend/pages/banking/index.vue index 2bfaf22..461090f 100644 --- a/frontend/pages/banking/index.vue +++ b/frontend/pages/banking/index.vue @@ -43,7 +43,10 @@ const bankingFilterItems = [ ] // Initialisierungswerte -const selectedPeriod = ref(periodOptions[0]) +const selectedPeriod = ref(periodOptions[0].key) +const selectedPeriodOption = computed(() => { + return periodOptions.find(period => period.key === selectedPeriod.value) || periodOptions[0] +}) const dateRange = ref({ start: $dayjs().startOf('month').format('YYYY-MM-DD'), end: $dayjs().endOf('month').format('YYYY-MM-DD') @@ -107,7 +110,7 @@ const setupPage = async () => { const savedBanking = tempStore.settings?.['banking'] || {} if (savedBanking.periodKey) { const found = periodOptions.find(p => p.key === savedBanking.periodKey) - if (found) selectedPeriod.value = found + if (found) selectedPeriod.value = found.key } if (savedBanking.range) { dateRange.value = savedBanking.range @@ -120,12 +123,12 @@ const setupPage = async () => { } // Watcher für Schnellwahlen & Persistenz -watch([selectedPeriod, dateRange], ([newPeriod, newRange], [oldPeriod, oldRange]) => { +watch(selectedPeriod, (newPeriod, oldPeriod) => { const now = $dayjs() // Nur berechnen, wenn sich die Periode geändert hat - if (newPeriod.key !== oldPeriod?.key) { - switch (newPeriod.key) { + if (newPeriod !== oldPeriod) { + switch (newPeriod) { case 'current_month': dateRange.value = {start: now.startOf('month').format('YYYY-MM-DD'), end: now.endOf('month').format('YYYY-MM-DD')} break @@ -142,8 +145,10 @@ watch([selectedPeriod, dateRange], ([newPeriod, newRange], [oldPeriod, oldRange] break } } - // Speichern im Store - tempStore.modifyBankingPeriod(selectedPeriod.value.key, dateRange.value) +}) + +watch([selectedPeriod, dateRange], () => { + tempStore.modifyBankingPeriod(selectedPeriod.value, dateRange.value) }, { deep: true }) const syncBankStatements = async () => { @@ -541,7 +546,7 @@ onMounted(() => { icon="i-heroicons-calendar-days" >