244 lines
6.2 KiB
Vue
244 lines
6.2 KiB
Vue
<script setup>
|
|
import customParseFormat from "dayjs/plugin/customParseFormat";
|
|
import dayjs from "dayjs";
|
|
dayjs.extend(customParseFormat)
|
|
|
|
|
|
let incomeData = ref({})
|
|
let expenseData = ref({})
|
|
|
|
const setup = async () => {
|
|
//let incomeRawData = (await supabase.from("createddocuments").select().eq("tenant",profileStore.currentTenant).eq("state","Gebucht").in('type',['invoices','advanceInvoices','cancellationInvoices'])).data
|
|
let incomeRawData = (await useEntities("createddocuments").select()).filter(i => i.state === "Gebucht" && ['invoices','advanceInvoices','cancellationInvoices'].includes(i.type))
|
|
|
|
let incomeRawFilteredData = incomeRawData.filter(x => x.state === 'Gebucht' && incomeRawData.find(i => i.linkedDocument && i.linkedDocument.id === x.id && i.type === 'cancellationInvoices') && ['invoices','advanceInvoices'].includes(row.type))
|
|
|
|
|
|
//let expenseRawData =(await supabase.from("incominginvoices").select().eq("tenant",profileStore.currentTenant)).data
|
|
let expenseRawData =(await useEntities("incominginvoices").select())
|
|
//let withoutInvoiceRawData = (await supabase.from("statementallocations").select().eq("tenant",profileStore.currentTenant).not("account","is",null)).data
|
|
let withoutInvoiceRawData = (await useEntities("statementallocations").select()).filter(i => i.account)
|
|
|
|
let withoutInvoiceRawDataExpenses = []
|
|
let withoutInvoiceRawDataIncomes = []
|
|
|
|
withoutInvoiceRawData.forEach(i => {
|
|
if(i.amount > 0) {
|
|
withoutInvoiceRawDataIncomes.push({
|
|
id: i.id,
|
|
date: dayjs(i.created_at).format("DD-MM-YY"),
|
|
amount: Math.abs(i.amount),
|
|
bs_id: i.bs_id
|
|
})
|
|
} else if(i.amount < 0) {
|
|
withoutInvoiceRawDataExpenses.push({
|
|
id: i.id,
|
|
date: dayjs(i.created_at).format("DD-MM-YY"),
|
|
amount: Math.abs(i.amount),
|
|
bs_id: i.bs_id
|
|
})
|
|
}
|
|
})
|
|
|
|
/*withoutInvoiceRawDataExpenses.forEach(i => {
|
|
expenseData.value[i.date] ? expenseData.value[i.date] = Number((expenseData.value[i.date] + i.amount).toFixed(2)) : expenseData.value[i.date] = i.amount
|
|
})
|
|
|
|
withoutInvoiceRawDataIncomes.forEach(i => {
|
|
incomeData.value[i.date] ? incomeData.value[i.date] = Number((incomeData.value[i.date] + i.amount).toFixed(2)) : incomeData.value[i.date] = i.amount
|
|
})*/
|
|
|
|
expenseRawData = expenseRawData.filter(i => i.date).map(i => {
|
|
let amount = 0
|
|
|
|
i.accounts.forEach(a => {
|
|
amount += a.amountNet
|
|
})
|
|
|
|
amount = Number(amount.toFixed(2))
|
|
|
|
return {
|
|
id: i.id,
|
|
date: dayjs(i.date).format("DD-MM-YY"),
|
|
amount
|
|
}
|
|
|
|
})
|
|
|
|
expenseRawData.forEach(i => {
|
|
expenseData.value[i.date] ? expenseData.value[i.date] = Number((expenseData.value[i.date] + i.amount).toFixed(2)) : expenseData.value[i.date] = i.amount
|
|
})
|
|
|
|
let expenseMonths = {
|
|
"01": 0,
|
|
"02": 0,
|
|
"03": 0,
|
|
"04": 0,
|
|
"05": 0,
|
|
"06": 0,
|
|
"07": 0,
|
|
"08": 0,
|
|
"09": 0,
|
|
"10": 0,
|
|
"11": 0,
|
|
"12": 0,
|
|
|
|
}
|
|
Object.keys(expenseMonths).forEach(month => {
|
|
let dates = Object.keys(expenseData.value).filter(i => i.split("-")[1] === month && i.split("-")[2] === dayjs().format("YY"))
|
|
|
|
|
|
|
|
dates.forEach(date => {
|
|
if(expenseMonths[month]){
|
|
expenseMonths[month] = Number((expenseMonths[month] + expenseData.value[date]).toFixed(2))
|
|
} else {
|
|
expenseMonths[month] = expenseData.value[date]
|
|
}
|
|
})
|
|
|
|
})
|
|
|
|
expenseData.value = expenseMonths
|
|
|
|
|
|
incomeRawData = incomeRawData.map(i => {
|
|
let amount = 0
|
|
|
|
i.rows.forEach(r => {
|
|
if(r.mode !== "pagebreak" && r.mode !== "title" && r.mode !== "text"){
|
|
amount += r.price * r.quantity * (1 - r.discountPercent/100)
|
|
}
|
|
})
|
|
|
|
amount = Number(amount.toFixed(2))
|
|
|
|
return {
|
|
id: i.id,
|
|
date: dayjs(i.documentDate).format("DD-MM-YY"),
|
|
amount
|
|
}
|
|
})
|
|
|
|
incomeRawData.forEach(i => {
|
|
incomeData.value[i.date] ? incomeData.value[i.date] = Number((incomeData.value[i.date] + i.amount).toFixed(2)) : incomeData.value[i.date] = i.amount
|
|
})
|
|
|
|
let incomeMonths = {
|
|
"01": 0,
|
|
"02": 0,
|
|
"03": 0,
|
|
"04": 0,
|
|
"05": 0,
|
|
"06": 0,
|
|
"07": 0,
|
|
"08": 0,
|
|
"09": 0,
|
|
"10": 0,
|
|
"11": 0,
|
|
"12": 0,
|
|
|
|
}
|
|
Object.keys(incomeMonths).forEach(month => {
|
|
let dates = Object.keys(incomeData.value).filter(i => i.split("-")[1] === month && i.split("-")[2] === dayjs().format("YY"))
|
|
|
|
dates.forEach(date => {
|
|
if(incomeMonths[month]){
|
|
incomeMonths[month] = Number((incomeMonths[month] + incomeData.value[date]).toFixed(2))
|
|
} else {
|
|
incomeMonths[month] = incomeData.value[date]
|
|
}
|
|
})
|
|
|
|
})
|
|
|
|
incomeData.value = incomeMonths
|
|
}
|
|
|
|
const days = computed(() => {
|
|
let days = []
|
|
|
|
days = Object.keys(incomeData.value)
|
|
|
|
let expenseDays = Object.keys(expenseData.value)
|
|
|
|
expenseDays.forEach(expenseDay => {
|
|
if(!days.find(i => i === expenseDay)){
|
|
days.push(expenseDay)
|
|
}
|
|
})
|
|
|
|
days = days.sort(function(a, b) {
|
|
var keyA = dayjs(a, "DD-MM-YY"),
|
|
keyB = dayjs(b, "DD-MM-YY");
|
|
// Compare the 2 dates
|
|
if (keyA.isBefore(keyB,'day')) {
|
|
return -1;
|
|
} else if(keyB.isBefore(keyA, 'day')) {
|
|
return 1
|
|
} else {
|
|
return 0;
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
return days
|
|
})
|
|
|
|
/*const chartData = computed(() => {
|
|
return {
|
|
labels: days.value,
|
|
datasets: [
|
|
{
|
|
label: 'Einnahmen',
|
|
data: [2, 1, 16, 3, 2],
|
|
backgroundColor: 'rgba(20, 255, 0, 0.3)',
|
|
borderColor: 'red',
|
|
borderWidth: 2,
|
|
}
|
|
]
|
|
}
|
|
})*/
|
|
|
|
|
|
import { Line } from 'vue-chartjs'
|
|
const chartData = computed(() => {
|
|
return {
|
|
labels: ["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],
|
|
datasets: [
|
|
{
|
|
label: 'Ausgaben',
|
|
backgroundColor: '#f87979',
|
|
borderColor: '#f87979',
|
|
data: Object.keys(expenseData.value).sort().map(i => expenseData.value[i]),
|
|
tension: 0.3,
|
|
},{
|
|
label: 'Einnahmen',
|
|
backgroundColor: '#69c350',
|
|
borderColor: '#69c350',
|
|
data: Object.keys(incomeData.value).sort().map(i => incomeData.value[i]),
|
|
tension: 0.3
|
|
},
|
|
],
|
|
}
|
|
})
|
|
const chartOptions = ref({
|
|
responsive: true,
|
|
maintainAspectRatio: false,
|
|
})
|
|
|
|
setup()
|
|
</script>
|
|
|
|
<template>
|
|
<Line
|
|
:data="chartData"
|
|
:options="chartOptions"
|
|
/>
|
|
</template>
|
|
|
|
<style scoped>
|
|
|
|
</style> |