Fix False Open State for cancelled Invoices
This commit is contained in:
@@ -16,27 +16,23 @@ const setupPage = async () => {
|
|||||||
let documents = items.filter(i => i.type === "invoices" ||i.type === "advanceInvoices")
|
let documents = items.filter(i => i.type === "invoices" ||i.type === "advanceInvoices")
|
||||||
|
|
||||||
let draftDocuments = documents.filter(i => i.state === "Entwurf")
|
let draftDocuments = documents.filter(i => i.state === "Entwurf")
|
||||||
let finalizedDocuments = documents.filter(i => i.state === "Gebucht")
|
let finalizedDocuments = documents.filter(i => useSum().isOpenCreatedDocument(i, items))
|
||||||
|
|
||||||
finalizedDocuments = finalizedDocuments.filter(i => i.statementallocations.reduce((n,{amount}) => n + amount, 0).toFixed(2) !== useSum().getCreatedDocumentSum(i, documents).toFixed(2))
|
|
||||||
|
|
||||||
finalizedDocuments = finalizedDocuments.filter(x => (x.type === 'invoices' || x.type === 'advanceInvoices') && x.state === 'Gebucht' && !items.find(i => i.createddocument && i.createddocument.id === x.id))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
finalizedDocuments.forEach(i => {
|
finalizedDocuments.forEach(i => {
|
||||||
if(dayjs().subtract(i.paymentDays,"days").isAfter(i.documentDate)) {
|
if(dayjs().subtract(i.paymentDays,"days").isAfter(i.documentDate)) {
|
||||||
unpaidOverdueInvoicesSum.value += useSum().getCreatedDocumentSum(i, documents) - i.statementallocations.reduce((n,{amount}) => n + amount, 0)
|
unpaidOverdueInvoicesSum.value += useSum().getCreatedDocumentOpenAmount(i, items)
|
||||||
unpaidOverdueInvoicesCount.value += 1
|
unpaidOverdueInvoicesCount.value += 1
|
||||||
} else {
|
} else {
|
||||||
unpaidInvoicesSum.value += useSum().getCreatedDocumentSum(i, items) - i.statementallocations.reduce((n,{amount}) => n + amount, 0)
|
unpaidInvoicesSum.value += useSum().getCreatedDocumentOpenAmount(i, items)
|
||||||
unpaidInvoicesCount.value += 1
|
unpaidInvoicesCount.value += 1
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
//unpaidInvoicesCount.value = finalizedDocuments.length
|
//unpaidInvoicesCount.value = finalizedDocuments.length
|
||||||
|
|
||||||
draftDocuments.forEach(i => {
|
draftDocuments.forEach(i => {
|
||||||
draftInvoicesSum.value += useSum().getCreatedDocumentSum(i, documents) - i.statementallocations.reduce((n,{amount}) => n + amount, 0)
|
draftInvoicesSum.value += useSum().getCreatedDocumentOpenAmount(i, items)
|
||||||
})
|
})
|
||||||
draftInvoicesCount.value = draftDocuments.length
|
draftInvoicesCount.value = draftDocuments.length
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,16 @@
|
|||||||
|
|
||||||
export const useSum = () => {
|
export const useSum = () => {
|
||||||
|
const unwrapCreatedDocuments = (createddocuments = []) => {
|
||||||
|
if (Array.isArray(createddocuments)) return createddocuments
|
||||||
|
if (Array.isArray(createddocuments?.value)) return createddocuments.value
|
||||||
|
return []
|
||||||
|
}
|
||||||
|
|
||||||
|
const getCreatedDocumentLinkId = (value) => {
|
||||||
|
if (value && typeof value === "object") return value.id
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
|
||||||
const getIncomingInvoiceSum = (invoice) => {
|
const getIncomingInvoiceSum = (invoice) => {
|
||||||
let sum = 0
|
let sum = 0
|
||||||
invoice.accounts.forEach(account => {
|
invoice.accounts.forEach(account => {
|
||||||
@@ -15,6 +26,7 @@ export const useSum = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const getCreatedDocumentSum = (createddocument,createddocuments = []) => {
|
const getCreatedDocumentSum = (createddocument,createddocuments = []) => {
|
||||||
|
const availableCreatedDocuments = unwrapCreatedDocuments(createddocuments)
|
||||||
let totalNet = 0
|
let totalNet = 0
|
||||||
let total19 = 0
|
let total19 = 0
|
||||||
let total7 = 0
|
let total7 = 0
|
||||||
@@ -44,7 +56,9 @@ export const useSum = () => {
|
|||||||
|
|
||||||
|
|
||||||
createddocument.usedAdvanceInvoices.forEach(advanceInvoiceId => {
|
createddocument.usedAdvanceInvoices.forEach(advanceInvoiceId => {
|
||||||
let advanceInvoice = createddocuments.find(i => i.id === advanceInvoiceId)
|
let advanceInvoice = availableCreatedDocuments.find(i => i.id === advanceInvoiceId)
|
||||||
|
|
||||||
|
if (!advanceInvoice) return
|
||||||
|
|
||||||
let priceNet = advanceInvoice.rows.find(i => i.advanceInvoiceData).price
|
let priceNet = advanceInvoice.rows.find(i => i.advanceInvoiceData).price
|
||||||
|
|
||||||
@@ -59,6 +73,24 @@ export const useSum = () => {
|
|||||||
return Number(sumToPay.toFixed(2))
|
return Number(sumToPay.toFixed(2))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const hasCancellationInvoice = (createddocument, createddocuments = []) => {
|
||||||
|
const availableCreatedDocuments = unwrapCreatedDocuments(createddocuments)
|
||||||
|
|
||||||
|
return availableCreatedDocuments.some((document) => {
|
||||||
|
return document.type === "cancellationInvoices"
|
||||||
|
&& document.state !== "Entwurf"
|
||||||
|
&& !document.archived
|
||||||
|
&& getCreatedDocumentLinkId(document.createddocument) === createddocument.id
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const getCreatedDocumentOpenAmount = (createddocument, createddocuments = []) => {
|
||||||
|
let amountPaid = 0
|
||||||
|
createddocument.statementallocations.forEach(allocation => amountPaid += allocation.amount)
|
||||||
|
|
||||||
|
return Number((getCreatedDocumentSum(createddocument, createddocuments) - amountPaid).toFixed(2))
|
||||||
|
}
|
||||||
|
|
||||||
const getCreatedDocumentSumDetailed = (createddocument) => {
|
const getCreatedDocumentSumDetailed = (createddocument) => {
|
||||||
let totalNet = 0
|
let totalNet = 0
|
||||||
let total19 = 0
|
let total19 = 0
|
||||||
@@ -124,12 +156,24 @@ export const useSum = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const getIsPaid = (createddocument,createddocuments) => {
|
const getIsPaid = (createddocument,createddocuments) => {
|
||||||
let amountPaid = 0
|
return getCreatedDocumentOpenAmount(createddocument, createddocuments) === 0
|
||||||
createddocument.statementallocations.forEach(allocation => amountPaid += allocation.amount)
|
|
||||||
|
|
||||||
return Number(amountPaid.toFixed(2)) === getCreatedDocumentSum(createddocument,createddocuments)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return {getIncomingInvoiceSum, getCreatedDocumentSum, getCreatedDocumentSumDetailed, getIsPaid}
|
const isOpenCreatedDocument = (createddocument, createddocuments = []) => {
|
||||||
|
return ['invoices', 'advanceInvoices'].includes(createddocument.type)
|
||||||
|
&& createddocument.state === "Gebucht"
|
||||||
|
&& !hasCancellationInvoice(createddocument, createddocuments)
|
||||||
|
&& !getIsPaid(createddocument, createddocuments)
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
getIncomingInvoiceSum,
|
||||||
|
getCreatedDocumentSum,
|
||||||
|
getCreatedDocumentSumDetailed,
|
||||||
|
getCreatedDocumentOpenAmount,
|
||||||
|
getIsPaid,
|
||||||
|
hasCancellationInvoice,
|
||||||
|
isOpenCreatedDocument
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -67,12 +67,12 @@ const setupPage = async () => {
|
|||||||
incominginvoices.value = invoiceItems.filter(i => i.state === "Gebucht")
|
incominginvoices.value = invoiceItems.filter(i => i.state === "Gebucht")
|
||||||
|
|
||||||
const documents = createddocuments.value.filter(i => i.type === "invoices" || i.type === "advanceInvoices")
|
const documents = createddocuments.value.filter(i => i.type === "invoices" || i.type === "advanceInvoices")
|
||||||
openDocuments.value = documents.filter(i => i.statementallocations.reduce((n, {amount}) => n + amount, 0).toFixed(2) !== useSum().getCreatedDocumentSum(i, createddocuments.value).toFixed(2))
|
openDocuments.value = documents.filter(i => useSum().isOpenCreatedDocument(i, createddocuments.value))
|
||||||
.map(i => ({
|
.map(i => ({
|
||||||
...i,
|
...i,
|
||||||
docTotal: useSum().getCreatedDocumentSum(i, createddocuments.value),
|
docTotal: useSum().getCreatedDocumentSum(i, createddocuments.value),
|
||||||
statementTotal: Number(i.statementallocations.reduce((n, {amount}) => n + amount, 0)),
|
statementTotal: Number(i.statementallocations.reduce((n, {amount}) => n + amount, 0)),
|
||||||
openSum: (useSum().getCreatedDocumentSum(i, createddocuments.value) - Number(i.statementallocations.reduce((n, {amount}) => n + amount, 0))).toFixed(2)
|
openSum: useSum().getCreatedDocumentOpenAmount(i, createddocuments.value).toFixed(2)
|
||||||
}))
|
}))
|
||||||
|
|
||||||
openIncomingInvoices.value = invoiceItems
|
openIncomingInvoices.value = invoiceItems
|
||||||
|
|||||||
@@ -53,13 +53,13 @@ const setup = async () => {
|
|||||||
customers.value = (await useEntities("customers").select())
|
customers.value = (await useEntities("customers").select())
|
||||||
vendors.value = (await useEntities("vendors").select())
|
vendors.value = (await useEntities("vendors").select())
|
||||||
|
|
||||||
openDocuments.value = documents.filter(i => i.statementallocations.reduce((n, {amount}) => n + amount, 0).toFixed(2) !== useSum().getCreatedDocumentSum(i, createddocuments.value).toFixed(2))
|
openDocuments.value = documents.filter(i => useSum().isOpenCreatedDocument(i, createddocuments.value))
|
||||||
openDocuments.value = openDocuments.value.map(i => {
|
openDocuments.value = openDocuments.value.map(i => {
|
||||||
return {
|
return {
|
||||||
...i,
|
...i,
|
||||||
docTotal: useSum().getCreatedDocumentSum(i, createddocuments.value),
|
docTotal: useSum().getCreatedDocumentSum(i, createddocuments.value),
|
||||||
statementTotal: Number(i.statementallocations.reduce((n, {amount}) => n + amount, 0)),
|
statementTotal: Number(i.statementallocations.reduce((n, {amount}) => n + amount, 0)),
|
||||||
openSum: (useSum().getCreatedDocumentSum(i, createddocuments.value) - Number(i.statementallocations.reduce((n, {amount}) => n + amount, 0))).toFixed(2)
|
openSum: useSum().getCreatedDocumentOpenAmount(i, createddocuments.value).toFixed(2)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -75,16 +75,16 @@
|
|||||||
<template #state-data="{row}">
|
<template #state-data="{row}">
|
||||||
<span v-if="row.state === 'Entwurf'" class="text-rose-500">{{ row.state }}</span>
|
<span v-if="row.state === 'Entwurf'" class="text-rose-500">{{ row.state }}</span>
|
||||||
<span
|
<span
|
||||||
v-if="row.state === 'Gebucht' && !items.find(i => i.createddocument && i.createddocument.id === row.id)"
|
v-if="row.state === 'Gebucht' && !hasCancellationInvoice(row)"
|
||||||
class="text-primary-500"
|
class="text-primary-500"
|
||||||
>
|
>
|
||||||
{{ row.state }}
|
{{ row.state }}
|
||||||
</span>
|
</span>
|
||||||
<span
|
<span
|
||||||
v-else-if="row.state === 'Gebucht' && items.find(i => i.createddocument && i.createddocument.id === row.id && i.type === 'cancellationInvoices') && ['invoices','advanceInvoices'].includes(row.type)"
|
v-else-if="row.state === 'Gebucht' && hasCancellationInvoice(row) && ['invoices','advanceInvoices'].includes(row.type)"
|
||||||
class="text-cyan-500"
|
class="text-cyan-500"
|
||||||
>
|
>
|
||||||
Storniert mit {{ items.find(i => i.createddocument && i.createddocument.id === row.id).documentNumber }}
|
Storniert mit {{ getCancellationInvoice(row)?.documentNumber }}
|
||||||
</span>
|
</span>
|
||||||
<span v-else-if="row.state === 'Gebucht'" class="text-primary-500">{{ row.state }}</span>
|
<span v-else-if="row.state === 'Gebucht'" class="text-primary-500">{{ row.state }}</span>
|
||||||
</template>
|
</template>
|
||||||
@@ -108,7 +108,7 @@
|
|||||||
|
|
||||||
<template #dueDate-data="{row}">
|
<template #dueDate-data="{row}">
|
||||||
<span
|
<span
|
||||||
v-if="row.state === 'Gebucht' && row.paymentDays && ['invoices','advanceInvoices'].includes(row.type) && !items.find(i => i.linkedDocument && i.linkedDocument.id === row.id)"
|
v-if="row.state === 'Gebucht' && row.paymentDays && ['invoices','advanceInvoices'].includes(row.type) && !hasCancellationInvoice(row)"
|
||||||
:class="dayjs(row.documentDate).add(row.paymentDays,'day').diff(dayjs()) <= 0 && !isPaid(row) ? ['text-rose-500'] : '' "
|
:class="dayjs(row.documentDate).add(row.paymentDays,'day').diff(dayjs()) <= 0 && !isPaid(row) ? ['text-rose-500'] : '' "
|
||||||
>
|
>
|
||||||
{{ row.documentDate ? dayjs(row.documentDate).add(row.paymentDays, 'day').format("DD.MM.YY") : '' }}
|
{{ row.documentDate ? dayjs(row.documentDate).add(row.paymentDays, 'day').format("DD.MM.YY") : '' }}
|
||||||
@@ -117,7 +117,7 @@
|
|||||||
|
|
||||||
<template #paid-data="{row}">
|
<template #paid-data="{row}">
|
||||||
<div
|
<div
|
||||||
v-if="(row.type === 'invoices' ||row.type === 'advanceInvoices') && row.state === 'Gebucht' && !items.find(i => i.linkedDocument && i.linkedDocument.id === row.id)">
|
v-if="(row.type === 'invoices' ||row.type === 'advanceInvoices') && row.state === 'Gebucht' && !hasCancellationInvoice(row)">
|
||||||
<span v-if="useSum().getIsPaid(row,items)" class="text-primary-500">Bezahlt</span>
|
<span v-if="useSum().getIsPaid(row,items)" class="text-primary-500">Bezahlt</span>
|
||||||
<span v-else class="text-rose-600">Offen</span>
|
<span v-else class="text-rose-600">Offen</span>
|
||||||
</div>
|
</div>
|
||||||
@@ -129,8 +129,8 @@
|
|||||||
|
|
||||||
<template #amountOpen-data="{row}">
|
<template #amountOpen-data="{row}">
|
||||||
<span
|
<span
|
||||||
v-if="!['deliveryNotes','cancellationInvoices','quotes','confirmationOrders'].includes(row.type) && row.state !== 'Entwurf' && !useSum().getIsPaid(row,items) && !items.find(i => i.linkedDocument && i.linkedDocument.id === row.id) ">
|
v-if="!['deliveryNotes','cancellationInvoices','quotes','confirmationOrders'].includes(row.type) && row.state !== 'Entwurf' && !hasCancellationInvoice(row) && !useSum().getIsPaid(row,items) ">
|
||||||
{{ displayCurrency(useSum().getCreatedDocumentSum(row, items) - row.statementallocations.reduce((n, {amount}) => n + amount, 0)) }}
|
{{ displayCurrency(useSum().getCreatedDocumentOpenAmount(row, items)) }}
|
||||||
</span>
|
</span>
|
||||||
</template>
|
</template>
|
||||||
</UTable>
|
</UTable>
|
||||||
@@ -264,13 +264,22 @@ const clearSearchString = () => {
|
|||||||
debouncedSearchString.value = ''
|
debouncedSearchString.value = ''
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const getCancellationInvoice = (row) => {
|
||||||
|
return items.value.find((item) => {
|
||||||
|
const linkedDocumentId = item.createddocument?.id || item.createddocument
|
||||||
|
return item.type === 'cancellationInvoices'
|
||||||
|
&& item.state !== 'Entwurf'
|
||||||
|
&& !item.archived
|
||||||
|
&& linkedDocumentId === row.id
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const hasCancellationInvoice = (row) => Boolean(getCancellationInvoice(row))
|
||||||
|
|
||||||
const openUnpaidInvoicesFilter = {
|
const openUnpaidInvoicesFilter = {
|
||||||
name: 'Nur offene Rechnungen',
|
name: 'Nur offene Rechnungen',
|
||||||
filterFunction: (row) => {
|
filterFunction: (row) => {
|
||||||
return ['invoices', 'advanceInvoices'].includes(row.type)
|
return useSum().isOpenCreatedDocument(row, items.value)
|
||||||
&& row.state === 'Gebucht'
|
|
||||||
&& !useSum().getIsPaid(row, items.value)
|
|
||||||
&& !items.value.find(i => i.linkedDocument && i.linkedDocument.id === row.id)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -319,8 +328,6 @@ const getRowsForTab = (tabKey) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const isPaid = (item) => {
|
const isPaid = (item) => {
|
||||||
let amountPaid = 0
|
return useSum().getIsPaid(item, items.value)
|
||||||
item.statementallocations.forEach(allocation => amountPaid += allocation.amount)
|
|
||||||
return Number(amountPaid.toFixed(2)) === useSum().getCreatedDocumentSum(item, items.value)
|
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
Reference in New Issue
Block a user