Compare commits

..

2 Commits

Author SHA1 Message Date
f6c9875320 Fix #144
All checks were successful
Build and Push Docker Images / build-backend (push) Successful in 2m40s
Build and Push Docker Images / build-frontend (push) Successful in 1m2s
2026-03-25 16:04:17 +01:00
05f3b678c4 Fix for Incoming Invoices 2026-03-25 16:03:54 +01:00
3 changed files with 64 additions and 14 deletions

View File

@@ -136,6 +136,27 @@ function getTenantColumn(resource: string, table: any) {
return table[tenantKey] 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) { function isDateLikeField(key: string) {
if (key === "deliveryDateType") return false if (key === "deliveryDateType") return false
if (key.includes("_at") || key.endsWith("At")) return true if (key.includes("_at") || key.endsWith("At")) return true
@@ -261,7 +282,7 @@ export default async function resourceRoutes(server: FastifyInstance) {
if (config.mtoLoad) { if (config.mtoLoad) {
config.mtoLoad.forEach(rel => { config.mtoLoad.forEach(rel => {
const relConfig = resourceConfig[rel + "s"] || resourceConfig[rel] const relConfig = getRelationConfig(rel)
if (relConfig) { if (relConfig) {
const relTable = relConfig.table 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))]; ids[rel] = [...new Set(rows.map(r => r[rel]).filter(Boolean))];
}) })
for await (const rel of config.mtoLoad) { 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 const relTab = relConf.table
lists[rel] = ids[rel].length ? await server.db.select().from(relTab).where(inArray(relTab.id, ids[rel])) : [] 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])); 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) { if (config.mtoLoad) {
config.mtoLoad.forEach(rel => { config.mtoLoad.forEach(rel => {
const relConfig = resourceConfig[rel + "s"] || resourceConfig[rel]; const relConfig = getRelationConfig(rel)
if (relConfig) { if (relConfig) {
const relTable = relConfig.table; 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(); let distinctQuery = server.db.select({ v: col }).from(table).$dynamic();
if (config.mtoLoad) { if (config.mtoLoad) {
config.mtoLoad.forEach(rel => { config.mtoLoad.forEach(rel => {
const relConfig = resourceConfig[rel + "s"] || resourceConfig[rel]; const relConfig = getRelationConfig(rel)
if (!relConfig) return; if (!relConfig) return;
const relTable = relConfig.table; const relTable = relConfig.table;
if (relTable !== 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))]; ids[rel] = [...new Set(rows.map(r => r[rel]).filter(Boolean))];
}); });
for await (const rel of config.mtoLoad) { 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; const relTab = relConf.table;
lists[rel] = ids[rel].length ? await server.db.select().from(relTab).where(inArray(relTab.id, ids[rel])) : []; 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])); 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) { if (resourceConfig[resource].mtoLoad) {
for await (const relation of resourceConfig[resource].mtoLoad) { for await (const relation of resourceConfig[resource].mtoLoad) {
if (data[relation]) { if (data[relation]) {
const relConf = resourceConfig[relation + "s"] || resourceConfig[relation]; const relConf = getRelationConfig(relation)
if (!relConf) continue
const relTable = relConf.table const relTable = relConf.table
const relData = await server.db.select().from(relTable).where(eq(relTable.id, data[relation])) const relData = await server.db.select().from(relTable).where(eq(relTable.id, data[relation]))
data[relation] = relData[0] || null data[relation] = relData[0] || null

View File

@@ -43,7 +43,10 @@ const bankingFilterItems = [
] ]
// Initialisierungswerte // 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({ const dateRange = ref({
start: $dayjs().startOf('month').format('YYYY-MM-DD'), start: $dayjs().startOf('month').format('YYYY-MM-DD'),
end: $dayjs().endOf('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'] || {} const savedBanking = tempStore.settings?.['banking'] || {}
if (savedBanking.periodKey) { if (savedBanking.periodKey) {
const found = periodOptions.find(p => p.key === 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) { if (savedBanking.range) {
dateRange.value = savedBanking.range dateRange.value = savedBanking.range
@@ -120,12 +123,12 @@ const setupPage = async () => {
} }
// Watcher für Schnellwahlen & Persistenz // Watcher für Schnellwahlen & Persistenz
watch([selectedPeriod, dateRange], ([newPeriod, newRange], [oldPeriod, oldRange]) => { watch(selectedPeriod, (newPeriod, oldPeriod) => {
const now = $dayjs() const now = $dayjs()
// Nur berechnen, wenn sich die Periode geändert hat // Nur berechnen, wenn sich die Periode geändert hat
if (newPeriod.key !== oldPeriod?.key) { if (newPeriod !== oldPeriod) {
switch (newPeriod.key) { switch (newPeriod) {
case 'current_month': case 'current_month':
dateRange.value = {start: now.startOf('month').format('YYYY-MM-DD'), end: now.endOf('month').format('YYYY-MM-DD')} dateRange.value = {start: now.startOf('month').format('YYYY-MM-DD'), end: now.endOf('month').format('YYYY-MM-DD')}
break break
@@ -142,8 +145,10 @@ watch([selectedPeriod, dateRange], ([newPeriod, newRange], [oldPeriod, oldRange]
break break
} }
} }
// Speichern im Store })
tempStore.modifyBankingPeriod(selectedPeriod.value.key, dateRange.value)
watch([selectedPeriod, dateRange], () => {
tempStore.modifyBankingPeriod(selectedPeriod.value, dateRange.value)
}, { deep: true }) }, { deep: true })
const syncBankStatements = async () => { const syncBankStatements = async () => {
@@ -541,7 +546,7 @@ onMounted(() => {
icon="i-heroicons-calendar-days" icon="i-heroicons-calendar-days"
> >
<template #default> <template #default>
{{ selectedPeriod?.label || 'Zeitraum' }} {{ selectedPeriodOption.label || 'Zeitraum' }}
</template> </template>
</USelectMenu> </USelectMenu>
<div v-if="selectedPeriod === 'custom'" class="flex items-center gap-1"> <div v-if="selectedPeriod === 'custom'" class="flex items-center gap-1">

View File

@@ -141,8 +141,21 @@ const getCalendarValue = (value) => {
return formatted ? parseDate(formatted) : undefined return formatted ? parseDate(formatted) : undefined
} }
const syncDeliveryDateEndWithStart = () => {
if (!['Lieferzeitraum', 'Leistungszeitraum'].includes(itemInfo.value.deliveryDateType)) return
if (!itemInfo.value.deliveryDate) return
if (!itemInfo.value.deliveryDateEnd || dayjs(itemInfo.value.deliveryDateEnd).isBefore(dayjs(itemInfo.value.deliveryDate), 'day')) {
itemInfo.value.deliveryDateEnd = dayjs(itemInfo.value.deliveryDate).toDate()
}
}
const setCalendarField = (field, value) => { const setCalendarField = (field, value) => {
itemInfo.value[field] = value ? dayjs(value.toString()).toDate() : null itemInfo.value[field] = value ? dayjs(value.toString()).toDate() : null
if (field === 'deliveryDate') {
syncDeliveryDateEndWithStart()
}
} }
const setSerialCalendarField = (field, value) => { const setSerialCalendarField = (field, value) => {
@@ -152,12 +165,20 @@ const setSerialCalendarField = (field, value) => {
const getDateButtonLabel = (value) => value ? dayjs(value).format('DD.MM.YYYY') : 'Datum auswählen' const getDateButtonLabel = (value) => value ? dayjs(value).format('DD.MM.YYYY') : 'Datum auswählen'
const setCalendarFieldToToday = (field) => { const setCalendarFieldToToday = (field) => {
itemInfo.value[field] = dayjs().toDate() itemInfo.value[field] = dayjs().toDate()
if (field === 'deliveryDate') {
syncDeliveryDateEndWithStart()
}
} }
const setSerialCalendarFieldToToday = (field) => { const setSerialCalendarFieldToToday = (field) => {
itemInfo.value.serialConfig[field] = dayjs().toDate() itemInfo.value.serialConfig[field] = dayjs().toDate()
} }
watch(() => itemInfo.value.deliveryDateType, () => {
syncDeliveryDateEndWithStart()
})
const setupData = async () => { const setupData = async () => {
letterheads.value = (await useEntities("letterheads").select("*")).filter(i => i.documentTypes.length === 0 || i.documentTypes.includes(itemInfo.value.type)) letterheads.value = (await useEntities("letterheads").select("*")).filter(i => i.documentTypes.length === 0 || i.documentTypes.includes(itemInfo.value.type))
createddocuments.value = await useEntities("createddocuments").select("*") createddocuments.value = await useEntities("createddocuments").select("*")