Merge branch 'dev' into beta

This commit is contained in:
2025-02-13 18:26:37 +01:00
5 changed files with 69 additions and 17 deletions

View File

@@ -130,7 +130,7 @@ const calendarOptionsTimeline = ref({
const loaded = ref(false) const loaded = ref(false)
const setupPage = async () => { const setupPage = async () => {
let tempData = await useSupabaseSelect("events", "*, vehicles(*), inventoryitems(*)") let tempData = await useSupabaseSelect("events", "*, vehicles(*), inventoryitems(*)")
let absencerequests = await useSupabaseSelect("absencerequests", "*") let absencerequests = await useSupabaseSelect("absencerequests", "*, profile(*)")
let projects = await useSupabaseSelect("projects", "*") let projects = await useSupabaseSelect("projects", "*")
let inventoryitems = await useSupabaseSelect("inventoryitems", "*") let inventoryitems = await useSupabaseSelect("inventoryitems", "*")
let profiles = await useSupabaseSelect("profiles", "*") let profiles = await useSupabaseSelect("profiles", "*")
@@ -198,9 +198,9 @@ const setupPage = async () => {
id: absence.id, id: absence.id,
resourceId: absence.user, resourceId: absence.user,
resourceType: "person", resourceType: "person",
title: `${absence.reason} - ${absence.name}`, title: `${absence.reason} - ${absence.profile.fullName}`,
start: dayjs(absence.start).toDate(), start: dayjs(absence.startDate).toDate(),
end: dayjs(absence.end).add(1, 'day').toDate(), end: dayjs(absence.endDate).add(1, 'day').toDate(),
allDay: true, allDay: true,
absencerequestId: absence.id, absencerequestId: absence.id,
entrytype: "absencerequest", entrytype: "absencerequest",
@@ -316,11 +316,11 @@ const setupPage = async () => {
absencerequests.forEach(absencerequest => { absencerequests.forEach(absencerequest => {
let returnData = { let returnData = {
title: `${absencerequest.reason} - ${absencerequest.name}`, title: `${absencerequest.reason}`,
backgroundColor: "black", backgroundColor: "black",
start: absencerequest.startDate, start: absencerequest.startDate,
end: absencerequest.endDate, end: absencerequest.endDate,
resourceIds: [absencerequest.profile], resourceIds: [absencerequest.profile.id],
entrytype: "absencerequest", entrytype: "absencerequest",
allDay: true, allDay: true,
absencerequestId: absencerequest.id absencerequestId: absencerequest.id

View File

@@ -457,7 +457,7 @@ const findDocumentErrors = computed(() => {
if(itemInfo.value.project === null) errors.push({message: "Es ist kein Projekt ausgewählt", type: "info"}) if(itemInfo.value.project === null) errors.push({message: "Es ist kein Projekt ausgewählt", type: "info"})
if(['Lieferzeitraum','Leistungszeitraum'].includes(itemInfo.value.deliveryDateType)) { if(['Lieferzeitraum','Leistungszeitraum'].includes(itemInfo.value.deliveryDateType) && itemInfo.value.type !== "serialInvoices") {
if(itemInfo.value.deliveryDateEnd === null) errors.push({message: `Es ist kein Enddatum für den ${itemInfo.value.deliveryDateType} angegeben`, type: "breaking"}) if(itemInfo.value.deliveryDateEnd === null) errors.push({message: `Es ist kein Enddatum für den ${itemInfo.value.deliveryDateType} angegeben`, type: "breaking"})
} }
@@ -589,13 +589,18 @@ const documentTotal = computed(() => {
const processDieselPosition = () => { const processDieselPosition = () => {
let agricultureData = { let agricultureData = {
dieselUsageTotal: 0, dieselUsageTotal: 0,
dieselPriceTotal: 0 dieselPriceTotal: 0,
adblueUsageTotal: 0,
adbluePriceTotal: 0
} }
itemInfo.value.rows.forEach(row => { itemInfo.value.rows.forEach(row => {
if(row.agriculture && row.agriculture.dieselUsage) { if(row.agriculture && row.agriculture.dieselUsage) {
agricultureData.dieselUsageTotal += Number(row.agriculture.dieselUsage) agricultureData.dieselUsageTotal += Number(row.agriculture.dieselUsage)
agricultureData.dieselPriceTotal += Number(row.agriculture.dieselPrice) * Number(row.agriculture.dieselUsage) agricultureData.dieselPriceTotal += Number(row.agriculture.dieselPrice || 0) * Number(row.agriculture.dieselUsage)
agricultureData.adblueUsageTotal += Number(row.agriculture.dieselUsage * 0.04)
agricultureData.adbluePriceTotal += Number(row.agriculture.dieselPrice || 0) * Number(row.agriculture.dieselUsage * 0.04)
} }
}) })
@@ -610,10 +615,18 @@ const processDieselPosition = () => {
text: `${agricultureData.dieselUsageTotal} L Diesel`, text: `${agricultureData.dieselUsageTotal} L Diesel`,
} }
let existingAdblueIndex = itemInfo.value.rows.findIndex(i => i.key === "adbluePos")
itemInfo.value.rows[existingAdblueIndex] = {
...itemInfo.value.rows[existingAdblueIndex],
price: agricultureData.adbluePriceTotal,
text: `${agricultureData.adblueUsageTotal} L Diesel`,
}
} else { } else {
itemInfo.value.rows.push({ itemInfo.value.rows.push({
mode: "free", mode: "free",
text: `${agricultureData.dieselUsageTotal} L Diesel`, text: `${(agricultureData.dieselUsageTotal).toFixed(2).replace(".",",")} L Diesel`,
quantity: 1, quantity: 1,
unit: 10, unit: 10,
price: agricultureData.dieselPriceTotal, price: agricultureData.dieselPriceTotal,
@@ -622,6 +635,17 @@ const processDieselPosition = () => {
key: "dieselPos" key: "dieselPos"
}) })
itemInfo.value.rows.push({
mode: "free",
text: `${(agricultureData.adblueUsageTotal).toFixed(2).replace(".",",")} L AdBlue`,
quantity: 1,
unit: 10,
price: agricultureData.adbluePriceTotal,
taxPercent: 19,
discountPercent: 0,
key: "adbluePos"
})
setPosNumbers() setPosNumbers()
} }
} }
@@ -751,11 +775,11 @@ const getDocumentData = () => {
content: customerData.customerNumber, content: customerData.customerNumber,
},{ },{
label: "Belegdatum", label: "Belegdatum",
content: dayjs(itemInfo.value.documentDate).format("DD.MM.YYYY"), content: itemInfo.value.documentDate ? dayjs(itemInfo.value.documentDate).format("DD.MM.YYYY") : "XXXX",
}, },
... itemInfo.value.deliveryDateType !== "Kein Lieferdatum anzeigen" ? [{ ... itemInfo.value.deliveryDateType !== "Kein Lieferdatum anzeigen" ? [{
label: itemInfo.value.deliveryDateType, label: itemInfo.value.deliveryDateType,
content: !['Lieferzeitraum','Leistungszeitraum'].includes(itemInfo.value.deliveryDateType) ? dayjs(itemInfo.value.deliveryDate).format("DD.MM.YYYY") : `${dayjs(itemInfo.value.deliveryDate).format("DD.MM.YYYY")} - ${dayjs(itemInfo.value.deliveryDateEnd).format("DD.MM.YYYY")}`, content: !['Lieferzeitraum','Leistungszeitraum'].includes(itemInfo.value.deliveryDateType) ? (itemInfo.value.deliveryDate ? dayjs(itemInfo.value.deliveryDate).format("DD.MM.YYYY") : "XXXX") : `${itemInfo.value.deliveryDate ? dayjs(itemInfo.value.deliveryDate).format("DD.MM.YYYY") : "XXXX"} - ${itemInfo.value.deliveryDateEnd ? dayjs(itemInfo.value.deliveryDateEnd).format("DD.MM.YYYY") : "XXXX"}`,
}] : [], }] : [],
/*{ /*{
label: itemInfo.value.deliveryDateType, label: itemInfo.value.deliveryDateType,

View File

@@ -69,6 +69,13 @@ const closeTicket = async () => {
console.log(error) console.log(error)
} else { } else {
console.log(data) console.log(data)
addEntryData.value.type = "Notiz"
addEntryData.value.internal = false
addEntryData.value.content = `Ticket durch ${profileStore.activeProfile.fullName} geschlossen`
addEntry()
} }
setup() setup()
@@ -161,7 +168,7 @@ const closeTicket = async () => {
v-for="item in itemInfo.ticketmessages.filter(i => !i.internal)" v-for="item in itemInfo.ticketmessages.filter(i => !i.internal)"
:description="item.content" :description="item.content"
:avatar="{ alt: item.profile.fullName}" :avatar="{ alt: item.profile.fullName}"
:title="item.profile.fullName" :title="`${item.type} - ${item.profile.fullName}`"
class="mb-3" class="mb-3"
:color="item.profile.tenant === 5 ? 'primary' : 'white'" :color="item.profile.tenant === 5 ? 'primary' : 'white'"
variant="outline" variant="outline"

View File

@@ -6,21 +6,33 @@ const router = useRouter()
const tickets = ref([]) const tickets = ref([])
const showClosedTickets = ref(false)
const setup = async () => { const setup = async () => {
if(profileStore.currentTenant === 5) { if(profileStore.currentTenant === 5) {
tickets.value = (await supabase.from("tickets").select("*,created_by(*), ticketmessages(*), tenant(*)")).data tickets.value = (await supabase.from("tickets").select("*,created_by(*), ticketmessages(*), tenant(*)").order("created_at", {ascending: false})).data
} else { } else {
tickets.value = (await supabase.from("tickets").select("*,created_by(*), ticketmessages(*)").eq("tenant",profileStore.currentTenant)).data tickets.value = (await supabase.from("tickets").select("*,created_by(*), ticketmessages(*)").eq("tenant",profileStore.currentTenant).order("created_at", {ascending: false})).data
} }
} }
setup() setup()
const filteredRows = computed(() => {
if(showClosedTickets.value) {
return tickets.value
} else {
return tickets.value.filter(i => i.status !== "Geschlossen")
}
})
</script> </script>
<template> <template>
<UDashboardNavbar <UDashboardNavbar
title="Suport Tickets" title="Support Tickets"
> >
<template #right> <template #right>
<UButton <UButton
@@ -30,8 +42,16 @@ setup()
</UButton> </UButton>
</template> </template>
</UDashboardNavbar> </UDashboardNavbar>
<UDashboardToolbar>
<template #left>
<UCheckbox
label="Geschlossene Tickets anzeigen"
v-model="showClosedTickets"
/>
</template>
</UDashboardToolbar>
<UTable <UTable
:rows="tickets" :rows="filteredRows"
:empty-state="{ icon: 'i-heroicons-circle-stack-20-solid', label: `Keine Tickets anzuzeigen` }" :empty-state="{ icon: 'i-heroicons-circle-stack-20-solid', label: `Keine Tickets anzuzeigen` }"
@select="(i) => router.push(`/support/${i.id}`)" @select="(i) => router.push(`/support/${i.id}`)"
:columns="[{key:'created_at',label:'Datum'}, ...profileStore.currentTenant === 5 ? [{key:'tenant',label:'Tenant'}] : [],{key:'status',label:'Status'},{key:'title',label:'Titel'},{key:'created_by',label:'Ersteller'},{key:'ticketmessages',label:'Nachrichten'}]" :columns="[{key:'created_at',label:'Datum'}, ...profileStore.currentTenant === 5 ? [{key:'tenant',label:'Tenant'}] : [],{key:'status',label:'Status'},{key:'title',label:'Titel'},{key:'created_by',label:'Ersteller'},{key:'ticketmessages',label:'Nachrichten'}]"

View File

@@ -599,6 +599,7 @@ export const useDataStore = defineStore('data', () => {
{label:"unbezahlter Urlaub"}, {label:"unbezahlter Urlaub"},
{label:"Überstundenausgleich"}, {label:"Überstundenausgleich"},
{label:"Sonderurlaub(bezahlt)"}, {label:"Sonderurlaub(bezahlt)"},
{label:"Schulung"},
{label:"Mutterschutz"}, {label:"Mutterschutz"},
{label:"Krankheit ab 2. Tag (mit Attest)"}, {label:"Krankheit ab 2. Tag (mit Attest)"},
{label:"Krankheit 1 Tag (mit Attest)"}, {label:"Krankheit 1 Tag (mit Attest)"},