Compare commits
2 Commits
eb718021fd
...
f6c9875320
| Author | SHA1 | Date | |
|---|---|---|---|
| f6c9875320 | |||
| 05f3b678c4 |
@@ -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
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
@@ -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("*")
|
||||||
|
|||||||
Reference in New Issue
Block a user