From 12323382a5e5e464b9a49ca87cb18f14d3ac52da Mon Sep 17 00:00:00 2001 From: flfeders Date: Thu, 11 Jan 2024 18:33:56 +0100 Subject: [PATCH] many changes --- spaces/app.vue | 6 +- spaces/components/DocumentDisplay.vue | 251 +++++------ spaces/components/Tiptap.vue | 24 + spaces/package.json | 10 +- spaces/pages/documents.vue | 21 +- spaces/pages/editortest.vue | 11 + spaces/pages/employees/timetracking.vue | 21 +- .../pages/incominginvoices/[mode]/[[id]].vue | 418 ++++++++++++++++++ .../index.vue | 35 +- spaces/pages/planningBoard.vue | 56 ++- spaces/pages/plants/index.vue | 26 +- spaces/pages/projects/[mode]/[[id]].vue | 15 + spaces/pages/vehicles/[mode]/[[id]].vue | 83 +++- spaces/pages/vendorinvoices/[mode]/[[id]].vue | 342 -------------- spaces/server/middleware/auth.ts | 3 - spaces/stores/data.ts | 59 ++- test/oauth/test.mjs | 97 ++++ 17 files changed, 941 insertions(+), 537 deletions(-) create mode 100644 spaces/components/Tiptap.vue create mode 100644 spaces/pages/editortest.vue create mode 100644 spaces/pages/incominginvoices/[mode]/[[id]].vue rename spaces/pages/{vendorinvoices => incominginvoices}/index.vue (65%) delete mode 100644 spaces/pages/vendorinvoices/[mode]/[[id]].vue delete mode 100644 spaces/server/middleware/auth.ts create mode 100644 test/oauth/test.mjs diff --git a/spaces/app.vue b/spaces/app.vue index e861dd1..39fe83d 100644 --- a/spaces/app.vue +++ b/spaces/app.vue @@ -91,7 +91,7 @@ const navLinks = [ children: [ { label: "Eingangsrechnungen", - to: "/vendorinvoices", + to: "/incominginvoices", icon: "i-heroicons-document-text" }, /*{ @@ -265,7 +265,7 @@ const items = [ - -
+
diff --git a/spaces/pages/editortest.vue b/spaces/pages/editortest.vue new file mode 100644 index 0000000..56d14d7 --- /dev/null +++ b/spaces/pages/editortest.vue @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/spaces/pages/employees/timetracking.vue b/spaces/pages/employees/timetracking.vue index c2ba248..9132978 100644 --- a/spaces/pages/employees/timetracking.vue +++ b/spaces/pages/employees/timetracking.vue @@ -48,31 +48,38 @@ const createTimeInfo = ref({ const columns = [ { key: "user", - label: "Benutzer" + label: "Benutzer", + sortable:true }, { key:"start", - label:"Start" + label:"Start", + sortable:true }, { key:"type", - label:"Typ" + label:"Typ", + sortable:true }, { key: "end", - label: "Ende" + label: "Ende", + sortable:true }, { key: "duration", - label: "Dauer" + label: "Dauer", + sortable:true }, { key: "projectId", - label: "Projekt" + label: "Projekt", + sortable:true }, { key: "notes", - label: "Notizen" + label: "Notizen", + sortable:true } ] diff --git a/spaces/pages/incominginvoices/[mode]/[[id]].vue b/spaces/pages/incominginvoices/[mode]/[[id]].vue new file mode 100644 index 0000000..1a81e4f --- /dev/null +++ b/spaces/pages/incominginvoices/[mode]/[[id]].vue @@ -0,0 +1,418 @@ + + + + + \ No newline at end of file diff --git a/spaces/pages/vendorinvoices/index.vue b/spaces/pages/incominginvoices/index.vue similarity index 65% rename from spaces/pages/vendorinvoices/index.vue rename to spaces/pages/incominginvoices/index.vue index 1942b54..883f381 100644 --- a/spaces/pages/vendorinvoices/index.vue +++ b/spaces/pages/incominginvoices/index.vue @@ -2,7 +2,7 @@
- + Eingangsrechnung + + Eingangsrechnung + {{row.state}} + + {{row.state}} @@ -39,10 +45,14 @@ {{row.date ? dayjs(row.date).format("DD.MM.YY") : ''}} + @@ -83,6 +93,11 @@ const itemColumns = [ label: "Datum", sortable: true }, + { + key: "paid", + label: "Bezahlt:", + sortable: true + }, { key: "dueDate", label: "Fällig:", @@ -98,7 +113,13 @@ const itemColumns = [ const selectItem = (item) => { console.log(item) - router.push(`/vendorinvoices/edit/${item.id} `) + if(item.state === "Entwurf") { + console.log("ENTWURF") + router.push(`/incominginvoices/edit/${item.id} `) + } else if(item.state === "Offen") { + router.push(`/incominginvoices/show/${item.id}`) + } + } const getRowAmount = (row) => { @@ -117,10 +138,10 @@ const searchString = ref('') const filteredRows = computed(() => { if(!searchString.value) { - return dataStore.vendorInvoices + return dataStore.incomingInvoices } - return dataStore.vendorInvoices.filter(item => { + return dataStore.incomingInvoices.filter(item => { return Object.values(item).some((value) => { return String(value).toLowerCase().includes(searchString.value.toLowerCase()) }) diff --git a/spaces/pages/planningBoard.vue b/spaces/pages/planningBoard.vue index 40872df..fb5965c 100644 --- a/spaces/pages/planningBoard.vue +++ b/spaces/pages/planningBoard.vue @@ -40,12 +40,13 @@ const createEvent = async () => { if(error) { console.log(error) - } else { - openNewEventModal.value = false - newEventData.value = {} - dataStore.fetchEvents() } + console.log("OK") + openNewEventModal.value = false + newEventData.value = {} + dataStore.fetchEvents() + } const calendarOptionsList = reactive({ @@ -61,11 +62,12 @@ const calendarOptionsTimeline = reactive({ schedulerLicenseKey: "CC-Attribution-NonCommercial-NoDerivatives", locale: deLocale, plugins: [resourceTimelinePlugin, interactionPlugin], - initialView: "resourceTimelineDay", + initialView: "resourceTimeline3Hours", + headerToolbar: { left: 'prev,next', center: 'title', - right: 'resourceTimelineDay,resourceTimelineWeek,resourceTimelineMonth' + right: 'resourceTimelineDay,resourceTimeline3Hours,resourceTimelineMonth' }, initialEvents: events, selectable: true, @@ -88,7 +90,29 @@ const calendarOptionsTimeline = reactive({ }, resourceGroupField: "type", resources: resources, - nowIndicator:true + nowIndicator:true, + views: { + resourceTimeline3Hours: { + type: 'resourceTimeline', + slotDuration: {hours: 3}, + slotMinTime: "06:00:00", + slotMaxTime: "21:00:00", + /*duration: {days:7},*/ + buttonText: "Woche", + visibleRange: function(currentDate) { + // Generate a new date for manipulating in the next step + var startDate = new Date(currentDate); + var endDate = new Date(currentDate); + + // Adjust the start & end dates, respectively + startDate.setDate(startDate.getDate() - startDate.getDay() +1); // One day in the past + endDate.setDate(startDate.getDate() + 5); // Two days into the future + + return { start: startDate, end: endDate }; + } + } + }, + }) @@ -124,6 +148,24 @@ const calendarOptionsTimeline = reactive({ v-model="newEventData.title" /> + + + + + + diff --git a/spaces/pages/plants/index.vue b/spaces/pages/plants/index.vue index e838bcc..f0ae6ca 100644 --- a/spaces/pages/plants/index.vue +++ b/spaces/pages/plants/index.vue @@ -1,10 +1,17 @@ - Typ: {{currentItem.type}}
- Fahrer: {{dataStore.profiles.find(profile => profile.id === currentItem.driver) ? dataStore.profiles.find(profile => profile.id === currentItem.driver).fullName : 'Kein Fahrer gewählt'}}
+ + + + + diff --git a/spaces/pages/vendorinvoices/[mode]/[[id]].vue b/spaces/pages/vendorinvoices/[mode]/[[id]].vue deleted file mode 100644 index 5c0e17f..0000000 --- a/spaces/pages/vendorinvoices/[mode]/[[id]].vue +++ /dev/null @@ -1,342 +0,0 @@ - - - - - \ No newline at end of file diff --git a/spaces/server/middleware/auth.ts b/spaces/server/middleware/auth.ts deleted file mode 100644 index 808b264..0000000 --- a/spaces/server/middleware/auth.ts +++ /dev/null @@ -1,3 +0,0 @@ -export default defineEventHandler((event) => { - event.context.auth = { user: 123 } -}) \ No newline at end of file diff --git a/spaces/stores/data.ts b/spaces/stores/data.ts index 4c72fbb..661fbf1 100644 --- a/spaces/stores/data.ts +++ b/spaces/stores/data.ts @@ -21,7 +21,8 @@ export const useDataStore = defineStore('data', () => { tags: { documents: [] as any[], products: [] as any[] - } + }, + measures: [] as {name:String, short:String}[] }) const profiles = ref([]) const events = ref([]) @@ -40,7 +41,7 @@ export const useDataStore = defineStore('data', () => { const contacts = ref([]) const vehicles = ref([]) const vendors = ref([]) - const vendorInvoices = ref([]) + const incomingInvoices = ref([]) const bankAccounts = ref([]) const bankStatements = ref([]) const historyItems = ref([]) @@ -71,7 +72,7 @@ export const useDataStore = defineStore('data', () => { await fetchSpaces() await fetchVehicles() await fetchVendors() - await fetchVendorInvoices() + await fetchIncomingInvoices() await fetchBankAccounts() await fetchBankStatements() await fetchHistoryItems() @@ -105,7 +106,7 @@ export const useDataStore = defineStore('data', () => { contacts.value= [] vehicles.value= [] vendors.value= [] - vendorInvoices.value= [] + incomingInvoices.value= [] bankAccounts.value= [] bankStatements.value= [] historyItems.value = [] @@ -170,16 +171,17 @@ export const useDataStore = defineStore('data', () => { vehicles.value = (await supabase.from("vehicles").select()).data } async function fetchTimes () { - times.value = (await supabase.from("times").select()).data + times.value = (await supabase.from("times").select().order("start", {ascending:false})).data } async function fetchHistoryItems () { + historyItems.value = (await supabase.from("historyItems").select()).data } async function fetchVendors () { vendors.value = (await supabase.from("vendors").select().order("vendorNumber", {ascending:true})).data } - async function fetchVendorInvoices () { - vendorInvoices.value = (await supabase.from("vendorInvoices").select()).data + async function fetchIncomingInvoices () { + incomingInvoices.value = (await supabase.from("incomingInvoices").select()).data } async function fetchNumberRanges () { numberRanges.value = (await supabase.from("numberRanges").select()).data @@ -273,6 +275,10 @@ export const useDataStore = defineStore('data', () => { return historyItems.value.filter(item => item.vendor === vendorId) }) + const getIncomingInvoicesByVehicleId = computed(() => (vehicleId:string) => { + return incomingInvoices.value.filter(i => i.accounts.find(a => a.costCentre === vehicleId)) + }) + const getMovementsBySpaceId = computed(() => (spaceId:string) => { return movements.value.filter(movement => movement.spaceId === spaceId) }) @@ -301,18 +307,22 @@ export const useDataStore = defineStore('data', () => { return ownTenant.value.tags.documents }) + const getMeasures = computed(() => { + return ownTenant.value.measures + }) + const getResources = computed(() => { return [ ...profiles.value.map(profile => { return { - type: 'person', + type: 'Mitarbeiter', title: profile.fullName, id: profile.id } }), ...vehicles.value.map(vehicle => { return { - type: 'vehicle', + type: 'Fahrzeug', title: vehicle.licensePlate, id: vehicle.licensePlate } @@ -327,6 +337,7 @@ export const useDataStore = defineStore('data', () => { return { ...event, + title: !event.title ? projects.value.find(i => i.id === event.project).name : event.title, borderColor: eventColor, textColor: eventColor, backgroundColor: "black" @@ -345,6 +356,23 @@ export const useDataStore = defineStore('data', () => { ] }) + const getCostCentresComposed = computed(() => { + return [ + ...vehicles.value.map(vehicle => { + return { + label: "Fahrzeug - " + vehicle.licensePlate, + id: vehicle.id + } + }), + ...projects.value.map(project => { + return { + label: "Projekt - " + project.name, + id: project.id + } + }) + ] + }) + //Get Item By Id const getProductById = computed(() => (itemId:string) => { @@ -355,8 +383,8 @@ export const useDataStore = defineStore('data', () => { return vendors.value.find(item => item.id === itemId) }) - const getVendorInvoiceById = computed(() => (itemId:string) => { - return vendorInvoices.value.find(item => item.id === itemId) + const getIncomingInvoiceById = computed(() => (itemId:string) => { + return incomingInvoices.value.find(item => item.id === itemId) }) const getContractById = computed(() => (itemId:string) => { @@ -443,7 +471,7 @@ export const useDataStore = defineStore('data', () => { contacts, vehicles, vendors, - vendorInvoices, + incomingInvoices, bankAccounts, bankStatements, historyItems, @@ -476,7 +504,7 @@ export const useDataStore = defineStore('data', () => { fetchTimes, fetchHistoryItems, fetchVendors, - fetchVendorInvoices, + fetchIncomingInvoices, fetchNumberRanges, fetchNotifications, fetchDocuments, @@ -495,14 +523,17 @@ export const useDataStore = defineStore('data', () => { getStockByProductId, getHistoryItemsByCustomer, getHistoryItemsByVendor, + getIncomingInvoicesByVehicleId, getEventTypes, getTimeTypes, getDocumentTags, + getMeasures, getResources, getEvents, + getCostCentresComposed, getProductById, getVendorById, - getVendorInvoiceById, + getIncomingInvoiceById, getContractById, getContactById, getVehicleById, diff --git a/test/oauth/test.mjs b/test/oauth/test.mjs new file mode 100644 index 0000000..9944002 --- /dev/null +++ b/test/oauth/test.mjs @@ -0,0 +1,97 @@ +import express from "express" + +let app = express() + +import pkceChallenge from 'pkce-challenge' +import querystring from 'querystring' +import axios from "axios"; + + + + +import {v4 as uuidv4} from 'uuid' + +/*let ClientOAuth2 = require('client-oauth2') + +let datevAuth = new ClientOAuth2({ + clientId: '890ea22ce51666232e55c8ac3d73f51a', + clientSecret: 'eaef5362ce153551ef0f3d5e061ab7da', + accessTokenUri: 'https://sandbox-api.datev.de/token', + authorizationUri: 'https://login.datev.de/openidsandbox/authorize', + redirectUri: 'http://localhost:3001/auth/datev/callback', + scopes: ['accounting:clients:read', 'accounting:documents ', 'openid'], + state:"0123456789012345678901234567890123456789" +})*/ + +const auth_token_endpoint = "https://login.datev.de/openidsandbox/authorize" +const query_params = { + client_id: "890ea22ce51666232e55c8ac3d73f51a", + redirect_uri: "http://localhost/" +} +const scopes = ["openid", "profile", "email"] + +const requests = [] + + + +app.get('/auth/datev', async function (req, res) { + //var uri = datevAuth.code.getUri() + let challengePKCE = await pkceChallenge() + + let request = { + state: uuidv4(), + code_challenge: challengePKCE.code_challenge, + code_verifier: challengePKCE.code_verifier + } + + requests.push(request) + + + const auth_token_params = { + ...query_params, + response_type: "code id_token", + state: request.state, + nonce: "0123456789012345678901234567890123456789", + response_mode: "query", + code_challenge: request.code_challenge, + code_challenge_method: "S256" + } + + const getAuthTokenUrl = `${auth_token_endpoint}?${querystring.stringify(auth_token_params)}&scope=${scopes.join(' ')}` + + res.redirect(getAuthTokenUrl) +}) + +app.get('/', async function (req, res) { + + let request = requests.find(r => r.state === req.query.state) + + console.log(req.query) + console.log(request) + const accessTokenEndpoint = "https://sandbox-api.datev.de/token" + + const access_token_params = { + ...query_params, + client_secret: "eaef5362ce153551ef0f3d5e061ab7da", + code: req.query.code, + grant_type: "authorization_code", + code_verifier: request.code_verifier + } + + + axios({ + method: "post", + url: `${accessTokenEndpoint}?${querystring.stringify(access_token_params)}`, + headers: { + "Authorization": `Basic ${btoa(access_token_params.client_id + ":" + access_token_params.client_secret)}` + } + }) + + console.log(error) + console.log(data) + + + res.send("ok") +}) + +app.listen(80)