@@ -114,3 +203,4 @@ async function handleSubmit() {
+
diff --git a/composables/useEntities.ts b/composables/useEntities.ts
index 1a92bb4..fbf0459 100644
--- a/composables/useEntities.ts
+++ b/composables/useEntities.ts
@@ -138,7 +138,7 @@ export const useEntities = (
) => {
if (!idToEq) return null
- const res = await useNuxtApp().$api(withInformation ? `/api/resource/${relation}/${idToEq}/${withInformation}` : `/api/resource/${relation}/${idToEq}`, {
+ const res = await useNuxtApp().$api(withInformation ? `/api/resource/${relation}/${idToEq}` : `/api/resource/${relation}/${idToEq}`, {
method: "GET",
params: { select }
})
diff --git a/composables/useFormat.ts b/composables/useFormat.ts
index c908968..6182b99 100644
--- a/composables/useFormat.ts
+++ b/composables/useFormat.ts
@@ -5,4 +5,21 @@ export const useFormatDuration = (durationInMinutes:number,) => {
const mins = Math.floor(durationInMinutes % 60)
return `${String(hrs).padStart(2, "0")}:${String(mins).padStart(2, "0")}`
+}
+
+export const useFormatDurationDays = (start,end) => {
+ const startDate = useNuxtApp().$dayjs(start);
+ const endDate = useNuxtApp().$dayjs(end);
+
+ if(startDate.isBefore(endDate)){
+ // inkl. beider Tage → +1
+ const days = endDate.diff(startDate, "day") + 1;
+
+ return days + " Tag" + (days > 1 ? "e" : "");
+ } else {
+ const days = startDate.diff(endDate, "day") + 1;
+
+ return days + " Tag" + (days > 1 ? "e" : "");
+ }
+
}
\ No newline at end of file
diff --git a/composables/useStaffTime.ts b/composables/useStaffTime.ts
index e495d6a..4db7d36 100644
--- a/composables/useStaffTime.ts
+++ b/composables/useStaffTime.ts
@@ -10,6 +10,7 @@ interface StaffTimeEntry {
export function useStaffTime() {
const { $api } = useNuxtApp()
+ const auth = useAuthStore()
@@ -46,9 +47,17 @@ export function useStaffTime() {
}
async function approve(id: string) {
- return await $api
(`/api/staff/time/${id}`, {
+ const auth = useAuthStore()
+ const now = useNuxtApp().$dayjs().toISOString()
+
+ return await $api(`/api/staff/time/${id}`, {
method: 'PUT',
- body: { state: 'approved' },
+ body: {
+ state: 'approved',
+ //@ts-ignore
+ approved_by: auth.user.id,
+ approved_at: now,
+ },
})
}
diff --git a/pages/accounts/index.vue b/pages/accounts/index.vue
index e955732..3472214 100644
--- a/pages/accounts/index.vue
+++ b/pages/accounts/index.vue
@@ -16,9 +16,15 @@ const router = useRouter()
const items = ref([])
const dataLoaded = ref(false)
+const statementallocations = ref([])
+const incominginvoices = ref([])
+
const setupPage = async () => {
items.value = await useEntities("accounts").selectSpecial()
+ statementallocations.value = (await useEntities("statementallocations").select("*, bs_id(*)"))
+ incominginvoices.value = (await useEntities("incominginvoices").select("*, vendor(*)"))
+
items.value = await Promise.all(items.value.map(async (i) => {
let renderedAllocationsTemp = await renderedAllocations(i.id)
let saldo = getSaldo(renderedAllocationsTemp)
@@ -37,22 +43,22 @@ const setupPage = async () => {
const renderedAllocations = async (account) => {
- let statementallocations = (await useEntities("statementallocations").select("*, bs_id(*)")).filter(i => i.account === account)
- let incominginvoices = (await useEntities("incominginvoices").select("*, vendor(*)")).filter(i => i.accounts.find(x => x.account === account))
+ let statementallocationslocal = statementallocations.value.filter(i => i.account === account)
+ let incominginvoiceslocal = incominginvoices.value.filter(i => i.accounts.find(x => x.account === account))
- let tempstatementallocations = statementallocations.map(i => {
+ let tempstatementallocations = statementallocationslocal.map(i => {
return {
...i,
type: "statementallocation",
- date: i.bs_id.date,
- partner: i.bs_id ? (i.bs_id.debName ? i.bs_id.debName : (i.bs_id.credName ? i.bs_id.credName : '')) : ''
+ date: i.bankstatement.date,
+ partner: i.bankstatement ? (i.bankstatement.debName ? i.bankstatement.debName : (i.bankstatement.credName ? i.bankstatement.credName : '')) : ''
}
})
let incominginvoicesallocations = []
- incominginvoices.forEach(i => {
+ incominginvoiceslocal.forEach(i => {
incominginvoicesallocations.push(...i.accounts.filter(x => x.account === account).map(x => {
return {
diff --git a/pages/banking/statements/[mode]/[[id]].vue b/pages/banking/statements/[mode]/[[id]].vue
index 37f5db9..5f90098 100644
--- a/pages/banking/statements/[mode]/[[id]].vue
+++ b/pages/banking/statements/[mode]/[[id]].vue
@@ -65,8 +65,8 @@ const setup = async () => {
console.log(openDocuments.value)
- allocatedDocuments.value = documents.filter(i => i.statementallocations.find(x => x.bs_id === itemInfo.value.id))
- allocatedIncomingInvoices.value = incominginvoices.filter(i => i.statementallocations.find(x => x.bs_id === itemInfo.value.id))
+ allocatedDocuments.value = documents.filter(i => i.statementallocations.find(x => x.bankstatement === itemInfo.value.id))
+ allocatedIncomingInvoices.value = incominginvoices.filter(i => i.statementallocations.find(x => x.bankstatement === itemInfo.value.id))
console.log(allocatedDocuments.value)
console.log(allocatedIncomingInvoices.value)
openIncomingInvoices.value = (await useEntities("incominginvoices").select("*, statementallocations(*), vendor(*)")).filter(i => !i.archived && i.statementallocations.reduce((n,{amount}) => n + amount, 0).toFixed(2) !== getInvoiceSum(i,false))
@@ -611,7 +611,7 @@ const archiveStatement = async () => {
variant="outline"
icon="i-heroicons-check"
:disabled="!accountToSave"
- @click="saveAllocation({bs_id: itemInfo.id, amount: manualAllocationSum, account: accountToSave, description: allocationDescription })"
+ @click="saveAllocation({bankstatement: itemInfo.id, amount: manualAllocationSum, account: accountToSave, description: allocationDescription })"
/>
{
variant="outline"
icon="i-heroicons-check"
:disabled="!ownAccountToSave"
- @click="saveAllocation({bs_id: itemInfo.id, amount: manualAllocationSum, ownaccount: ownAccountToSave, description: allocationDescription })"
+ @click="saveAllocation({bankstatement: itemInfo.id, amount: manualAllocationSum, ownaccount: ownAccountToSave, description: allocationDescription })"
/>
{
variant="outline"
icon="i-heroicons-check"
:disabled="!customerAccountToSave"
- @click="saveAllocation({bs_id: itemInfo.id, amount: manualAllocationSum, customer: customerAccountToSave, description: allocationDescription })"
+ @click="saveAllocation({bankstatement: itemInfo.id, amount: manualAllocationSum, customer: customerAccountToSave, description: allocationDescription })"
/>
{
variant="outline"
icon="i-heroicons-check"
:disabled="!vendorAccountToSave"
- @click="saveAllocation({bs_id: itemInfo.id, amount: manualAllocationSum, vendor: vendorAccountToSave, description: allocationDescription })"
+ @click="saveAllocation({bankstatement: itemInfo.id, amount: manualAllocationSum, vendor: vendorAccountToSave, description: allocationDescription })"
/>
{
variant="outline"
class="mr-3"
v-if="!itemInfo.statementallocations.find(i => i.cd_id === document.id)"
- @click="saveAllocation({cd_id: document.id, bs_id: itemInfo.id, amount: Number(Number(document.openSum) < manualAllocationSum ? document.openSum : manualAllocationSum), description: allocationDescription})"
+ @click="saveAllocation({cd_id: document.id, bankstatement: itemInfo.id, amount: Number(Number(document.openSum) < manualAllocationSum ? document.openSum : manualAllocationSum), description: allocationDescription})"
/>
{
variant="outline"
class="mr-3"
v-if="!itemInfo.statementallocations.find(i => i.ii_id === item.id)"
- @click="saveAllocation({ii_id: item.id, bs_id: itemInfo.id, amount: Number(Math.abs(getInvoiceSum(item,true)) > Math.abs(manualAllocationSum) ? manualAllocationSum : getInvoiceSum(item,true)), description: allocationDescription})"
+ @click="saveAllocation({ii_id: item.id, bankstatement: itemInfo.id, amount: Number(Math.abs(getInvoiceSum(item,true)) > Math.abs(manualAllocationSum) ? manualAllocationSum : getInvoiceSum(item,true)), description: allocationDescription})"
/>
auth.permissions.includes('staff.time.read_all'))
+const typeLabel = {
+ work: "Arbeitszeit",
+ vacation: "Urlaub",
+ sick: "Krankheit",
+ holiday: "Feiertag",
+ other: "Sonstiges"
+}
+
+const typeColor = {
+ work: "gray",
+ vacation: "yellow",
+ sick: "rose",
+ holiday: "blue",
+ other: "gray"
+}
+
+
async function loadUsers() {
if (!canViewAll.value) return
// Beispiel: User aus Supabase holen
@@ -171,28 +188,65 @@ onMounted(async () => {
{ key: 'started_at', label: 'Start' },
{ key: 'stopped_at', label: 'Ende' },
{ key: 'duration_minutes', label: 'Dauer' },
+ { key: 'user', label: 'Mitarbeiter' },
+ { key: 'type', label: 'Typ' },
{ key: 'description', label: 'Beschreibung' },
- ]"
+ ]"
>
Genehmigt
Eingereicht
Entwurf
-
-
- {{ useNuxtApp().$dayjs(row.started_at).format("DD.MM.YY HH:mm") }}
+
+
+ {{ typeLabel[row.type] || row.type }}
+
+
+
+
+
+ {{ useNuxtApp().$dayjs(row.started_at).format("DD.MM.YY") }}
+
+
+
+
+ {{ useNuxtApp().$dayjs(row.started_at).format("DD.MM.YY HH:mm") }}
+
+
+
+
+
-
+
+ läuft...
+
+
+
+
+ {{ useNuxtApp().$dayjs(row.stopped_at).format("DD.MM.YY") }}
+
+
+
+
{{ useNuxtApp().$dayjs(row.stopped_at).format("DD.MM.YY HH:mm") }}
- läuft...
- {{ row.duration_minutes ? useFormatDuration(row.duration_minutes) : "-" }}
+
+
+
+--
+
+
+
+
+ {{ row.duration_minutes ? useFormatDuration(row.duration_minutes) : "-" }}
+
+
@@ -218,6 +272,14 @@ onMounted(async () => {
/>
+
+ {{users.find(i => i.user_id === row.user_id) ? users.find(i => i.user_id === row.user_id).full_name : ""}}
+
+
+ {{row.vacation_reason}}
+ {{row.sick_reason}}
+ {{row.description}}
+
@@ -284,9 +346,16 @@ onMounted(async () => {
@click="handleEdit(row)"
>
-
- {{ row.description || 'Keine Beschreibung' }}
-
+
+ {{ row.description || 'Keine Beschreibung' }}
+
+
+ {{ typeLabel[row.type] }}
+
+
+