diff --git a/components/EntityShowSubFiles.vue b/components/EntityShowSubFiles.vue index 2d9978b..b4d1d74 100644 --- a/components/EntityShowSubFiles.vue +++ b/components/EntityShowSubFiles.vue @@ -1,70 +1,134 @@ \ No newline at end of file diff --git a/middleware/auth.global.ts b/middleware/auth.global.ts index 8d0d033..c03e09a 100644 --- a/middleware/auth.global.ts +++ b/middleware/auth.global.ts @@ -1,6 +1,9 @@ export default defineNuxtRouteMiddleware(async (to, from) => { const auth = useAuthStore() + console.log(auth) + + if (auth.loading) return // Wenn nicht eingeloggt → auf /login (außer er will schon dahin) diff --git a/middleware/redirectToMobileIndex.ts b/middleware/redirectToMobileIndex.ts index 2ccfddc..e332a1b 100644 --- a/middleware/redirectToMobileIndex.ts +++ b/middleware/redirectToMobileIndex.ts @@ -1,9 +1,9 @@ export default defineNuxtRouteMiddleware(async (to, _from) => { const router = useRouter() - console.log(await useCapacitor().getIsPhone()) + console.log(useCapacitor().getIsNative()) - if(await useCapacitor().getIsPhone() && _from.path !== '/mobile') { + if(useCapacitor().getIsNative() && _from.path !== '/mobile') { return router.push('/mobile') } }) diff --git a/package.json b/package.json index 0103f48..cc0dc96 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ }, "dependencies": { "@capacitor/android": "^7.0.0", + "@capacitor/browser": "^7.0.2", "@capacitor/core": "^7.0.0", "@capacitor/device": "^7.0.0", "@capacitor/ios": "^7.0.0", @@ -66,7 +67,7 @@ "maplibre-gl": "^4.7.0", "nuxt-editorjs": "^1.0.4", "nuxt-viewport": "^2.0.6", - "onesignal-cordova-plugin": "^5.2.11", + "onesignal-cordova-plugin": "^5.2.14", "papaparse": "^5.4.1", "pdf-lib": "^1.17.1", "pinia": "^2.1.7", 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})" /> { if (itemInfo.value.rows.length === 0) { errors.push({message: "Es sind keine Positionen angegeben", type: "breaking"}) } else { - itemInfo.value.rows.forEach(row => { + itemInfo.value.rows.forEach((row,index) => { if (itemInfo.value.type !== "quotes" && row.optional) { errors.push({ @@ -717,6 +717,10 @@ const findDocumentErrors = computed(() => { } } + if (index === itemInfo.value.rows.length - 1 && row.mode === "pagebreak") { + errors.push({message: `Die letze Position darf kein Seitenumbruch sein`, type: "breaking"}) + } + }) } diff --git a/pages/createDocument/index.vue b/pages/createDocument/index.vue index a68944c..e16d2d7 100644 --- a/pages/createDocument/index.vue +++ b/pages/createDocument/index.vue @@ -83,7 +83,9 @@ > diff --git a/pages/incomingInvoices/edit/[id].vue b/pages/incomingInvoices/[mode]/[id].vue similarity index 89% rename from pages/incomingInvoices/edit/[id].vue rename to pages/incomingInvoices/[mode]/[id].vue index dc033b3..319fc26 100644 --- a/pages/incomingInvoices/edit/[id].vue +++ b/pages/incomingInvoices/[mode]/[id].vue @@ -32,6 +32,8 @@ const costcentres = ref([]) const vendors = ref([]) const accounts = ref([]) +const mode = ref(route.params.mode) + const setup = async () => { let filetype = (await useEntities("filetags").select()).find(i=> i.incomingDocumentType === "invoices").id console.log(filetype) @@ -43,6 +45,8 @@ const setup = async () => { itemInfo.value = await useEntities("incominginvoices").selectSingle(route.params.id, "*, files(*)") await loadFile(itemInfo.value.files[itemInfo.value.files.length-1].id) + if(itemInfo.value.date && !itemInfo.value.dueDate) itemInfo.value.dueDate = itemInfo.value.date + } setup() @@ -143,7 +147,7 @@ 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.reference === null || itemInfo.value.reference.length === 0) 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"}) @@ -168,21 +172,38 @@ const findIncomingInvoiceErrors = computed(() => {