diff --git a/frontend/components/displayOpenBalances.vue b/frontend/components/displayOpenBalances.vue index a1ca265..b23082f 100644 --- a/frontend/components/displayOpenBalances.vue +++ b/frontend/components/displayOpenBalances.vue @@ -16,27 +16,23 @@ const setupPage = async () => { let documents = items.filter(i => i.type === "invoices" ||i.type === "advanceInvoices") let draftDocuments = documents.filter(i => i.state === "Entwurf") - let finalizedDocuments = documents.filter(i => i.state === "Gebucht") - - 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)) + let finalizedDocuments = documents.filter(i => useSum().isOpenCreatedDocument(i, items)) finalizedDocuments.forEach(i => { 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 } 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 = finalizedDocuments.length 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 diff --git a/frontend/composables/useSum.js b/frontend/composables/useSum.js index 4067084..5fdd07d 100644 --- a/frontend/composables/useSum.js +++ b/frontend/composables/useSum.js @@ -1,5 +1,16 @@ 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) => { let sum = 0 invoice.accounts.forEach(account => { @@ -15,6 +26,7 @@ export const useSum = () => { } const getCreatedDocumentSum = (createddocument,createddocuments = []) => { + const availableCreatedDocuments = unwrapCreatedDocuments(createddocuments) let totalNet = 0 let total19 = 0 let total7 = 0 @@ -44,7 +56,9 @@ export const useSum = () => { 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 @@ -59,6 +73,24 @@ export const useSum = () => { 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) => { let totalNet = 0 let total19 = 0 @@ -124,12 +156,24 @@ export const useSum = () => { } const getIsPaid = (createddocument,createddocuments) => { - let amountPaid = 0 - createddocument.statementallocations.forEach(allocation => amountPaid += allocation.amount) - - return Number(amountPaid.toFixed(2)) === getCreatedDocumentSum(createddocument,createddocuments) + return getCreatedDocumentOpenAmount(createddocument, createddocuments) === 0 } - 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 + } } diff --git a/frontend/pages/banking/index.vue b/frontend/pages/banking/index.vue index a05c8b5..45db785 100644 --- a/frontend/pages/banking/index.vue +++ b/frontend/pages/banking/index.vue @@ -67,12 +67,12 @@ const setupPage = async () => { incominginvoices.value = invoiceItems.filter(i => i.state === "Gebucht") 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 => ({ ...i, docTotal: useSum().getCreatedDocumentSum(i, createddocuments.value), 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 diff --git a/frontend/pages/banking/statements/[mode]/[[id]].vue b/frontend/pages/banking/statements/[mode]/[[id]].vue index c76616d..1155b5f 100644 --- a/frontend/pages/banking/statements/[mode]/[[id]].vue +++ b/frontend/pages/banking/statements/[mode]/[[id]].vue @@ -53,13 +53,13 @@ const setup = async () => { customers.value = (await useEntities("customers").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 => { return { ...i, docTotal: useSum().getCreatedDocumentSum(i, createddocuments.value), 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) } }) diff --git a/frontend/pages/createDocument/index.vue b/frontend/pages/createDocument/index.vue index 62ab2fd..d304144 100644 --- a/frontend/pages/createDocument/index.vue +++ b/frontend/pages/createDocument/index.vue @@ -75,16 +75,16 @@ @@ -108,7 +108,7 @@