From ff6ee91075e93c80e238af06c7ec66a0111b73c9 Mon Sep 17 00:00:00 2001 From: florianfederspiel Date: Mon, 30 Jun 2025 13:45:06 +0200 Subject: [PATCH] Added Errors to IncomingInvoices Added Vorbereitet to IncomingInvoices --- components/displayOpenBalances.vue | 9 +++-- pages/incomingInvoices/edit/[id].vue | 54 ++++++++++++++++++++++++++-- pages/incomingInvoices/index.vue | 22 ++++++++++-- pages/incomingInvoices/show/[id].vue | 9 +++++ 4 files changed, 85 insertions(+), 9 deletions(-) diff --git a/components/displayOpenBalances.vue b/components/displayOpenBalances.vue index a21f401..70245e3 100644 --- a/components/displayOpenBalances.vue +++ b/components/displayOpenBalances.vue @@ -12,7 +12,7 @@ let unpaidOverdueInvoicesCount = ref(0) let draftInvoicesSum = ref(0) let draftInvoicesCount = ref(0) -let countUnfinishedOpenIncomingInvoices = ref(0) +let countPreparedOpenIncomingInvoices = ref(0) const setupPage = async () => { let items = (await useSupabaseSelect("createddocuments","*, statementallocations(*), customer(id,name), linkedDocument(*)")).filter(i => !i.archived) @@ -45,8 +45,7 @@ const setupPage = async () => { }) draftInvoicesCount.value = draftDocuments.length - let filetype = (await supabase.from("filetags").select().eq("tenant",profileStore.currentTenant).eq("incomingDocumentType","invoices").single()).data.id - countUnfinishedOpenIncomingInvoices.value = (await supabase.from("files").select("id").eq("tenant",profileStore.currentTenant).eq("type", filetype).is("incominginvoice",null)).data.length + countPreparedOpenIncomingInvoices.value = (await supabase.from("incominginvoices").select("id").eq("tenant",profileStore.currentTenant).eq("state", "Vorbereitet")).data.length } @@ -84,9 +83,9 @@ setupPage() ToDo Eingangsrechnungsrechnungen: {{countUnfinishedOpenIncomingInvoices}} Stk + >{{countPreparedOpenIncomingInvoices}} Stk 0 Stk diff --git a/pages/incomingInvoices/edit/[id].vue b/pages/incomingInvoices/edit/[id].vue index 97b0e12..f7ae24e 100644 --- a/pages/incomingInvoices/edit/[id].vue +++ b/pages/incomingInvoices/edit/[id].vue @@ -125,14 +125,43 @@ const totalCalculated = computed(() => { }) -const updateIncomingInvoice = async () => { +const updateIncomingInvoice = async (setBooked = false) => { let item = itemInfo.value delete item.files + if(item.state === "Vorbereitet" && !setBooked) { + item.state = "Entwurf" + } else if(item.state === "Vorbereitet" && setBooked) { + item.state = "Gebucht" + } + const data = await dataStore.updateItem('incominginvoices',item) } +const findIncomingInvoiceErrors = computed(() => { + let errors = [] + + if(itemInfo.value.vendor === null) errors.push({message: "Es ist kein Lieferant ausgewählt", type: "breaking"}) + if(itemInfo.value.reference === null) errors.push({message: "Es ist keine Referenz angegeben", type: "breaking"}) + if(itemInfo.value.date === null) errors.push({message: "Es ist kein Datum ausgewählt", type: "breaking"}) + if(itemInfo.value.dueDate === null) errors.push({message: "Es ist kein Fälligkeitsdatum ausgewählt", type: "breaking"}) + if(itemInfo.value.paymentType === null) errors.push({message: "Es ist keine Zahlart ausgewählt", type: "breaking"}) + if(itemInfo.value.description === null) errors.push({message: "Es ist keine Beschreibung angegeben", type: "info"}) + + + itemInfo.value.accounts.forEach(account => { + if(account.account === null) errors.push({message: "Es ist keine Kategorie ausgewählt", type: "breaking"}) + if(account.amountNet === null) errors.push({message: "Es ist kein Nettobetrag angegeben", type: "breaking"}) + if(account.taxType === null) errors.push({message: "Es ist kein Steuertyp ausgewählt", type: "breaking"}) + if(account.costCentre === null) errors.push({message: "Es ist keine Kostenstelle ausgewählt", type: "info"}) + + }) + + + return errors.sort((a,b) => (a.type === "breaking") ? -1 : 1) +}) + @@ -144,6 +173,12 @@ const updateIncomingInvoice = async () => { > Speichern + + Speichern & Buchen + @@ -158,7 +193,22 @@ const updateIncomingInvoice = async () => { />
+ + +
@@ -470,7 +520,7 @@ const updateIncomingInvoice = async () => { overflow-y: scroll; padding-left: 1em; padding-right: 1em; - height: 75vh; + height: 70vh; -ms-overflow-style: none; /* IE and Edge */ scrollbar-width: none; /* Firefox */ } diff --git a/pages/incomingInvoices/index.vue b/pages/incomingInvoices/index.vue index da3570e..8d7ea0e 100644 --- a/pages/incomingInvoices/index.vue +++ b/pages/incomingInvoices/index.vue @@ -93,7 +93,10 @@ const columns = computed(() => templateColumns.filter((column) => selectedColumn const searchString = ref('') const filteredRows = computed(() => { - return useSearch(searchString.value, items.value) + let filteredItems = useSearch(searchString.value, items.value) + + return [...filteredItems.filter(i => i.state === "Vorbereitet"), ...filteredItems.filter(i => i.state !== "Vorbereitet")] + }) @@ -115,6 +118,16 @@ const isPaid = (item) => { return Math.abs(amountPaid) === Math.abs(Number(getInvoiceSum(item))) } +const selectIncomingInvoice = (invoice) => { + if(invoice.state === "Vorbereitet") { + router.push(`/incomingInvoices/edit/${invoice.id}`) + } else { + router.push(`/incomingInvoices/show/${invoice.id}`) + } + + +} + @@ -162,13 +175,18 @@ const isPaid = (item) => { :columns="columns" class="w-full" :ui="{ divide: 'divide-gray-200 dark:divide-gray-800' }" - @select="(i) => router.push(`/incomingInvoices/show/${i.id}`) " + @select="(i) => selectIncomingInvoice(i) " :empty-state="{ icon: 'i-heroicons-circle-stack-20-solid', label: 'Keine Belege anzuzeigen' }" > + diff --git a/pages/incomingInvoices/show/[id].vue b/pages/incomingInvoices/show/[id].vue index a177b20..4aea25c 100644 --- a/pages/incomingInvoices/show/[id].vue +++ b/pages/incomingInvoices/show/[id].vue @@ -71,6 +71,15 @@ setupPage()