From d90499a101c0789120b7050be8ca72052d789d89 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 31 Aug 2026 18:49:40 +0000 Subject: [PATCH] =?UTF-8?q?Dokumentenvorlagen=20im=20Ausgangsbeleg-Editor?= =?UTF-8?q?=20erg=C3=A4nzen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../db/migrations/0065_document_templates.sql | 16 ++++ backend/db/schema/documenttemplates.ts | 39 ++++++++ backend/db/schema/index.ts | 1 + backend/src/utils/resource.config.ts | 4 + .../EntityShowSubCreatedDocuments.vue | 40 ++------ frontend/components/MainNav.vue | 5 + .../createDocumentFromTemplateModal.vue | 94 +++++++++++++++++++ frontend/components/createDocumentModal.vue | 62 ++++++++++++ frontend/pages/createDocument/edit/[[id]].vue | 73 +++++++++++++- frontend/pages/createDocument/index.vue | 14 ++- frontend/pages/createDocument/show/[id].vue | 7 ++ frontend/pages/settings/documenttemplates.vue | 81 ++++++++++++++++ 12 files changed, 397 insertions(+), 39 deletions(-) create mode 100644 backend/db/migrations/0065_document_templates.sql create mode 100644 backend/db/schema/documenttemplates.ts create mode 100644 frontend/components/createDocumentFromTemplateModal.vue create mode 100644 frontend/components/createDocumentModal.vue create mode 100644 frontend/pages/settings/documenttemplates.vue diff --git a/backend/db/migrations/0065_document_templates.sql b/backend/db/migrations/0065_document_templates.sql new file mode 100644 index 0000000..99caf5f --- /dev/null +++ b/backend/db/migrations/0065_document_templates.sql @@ -0,0 +1,16 @@ +CREATE TABLE IF NOT EXISTS "documenttemplates" ( + "id" bigint GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + "created_at" timestamptz NOT NULL DEFAULT now(), + "tenant" bigint NOT NULL REFERENCES "tenants"("id"), + "name" text NOT NULL, + "document_type" text NOT NULL, + "template_data" jsonb NOT NULL DEFAULT '{}'::jsonb, + "default" boolean NOT NULL DEFAULT false, + "archived" boolean NOT NULL DEFAULT false, + "updated_at" timestamptz, + "updated_by" uuid REFERENCES "auth_users"("id"), + "created_by" uuid REFERENCES "auth_users"("id") +); + +CREATE INDEX IF NOT EXISTS "documenttemplates_tenant_type_idx" + ON "documenttemplates" ("tenant", "document_type"); \ No newline at end of file diff --git a/backend/db/schema/documenttemplates.ts b/backend/db/schema/documenttemplates.ts new file mode 100644 index 0000000..b9a8c80 --- /dev/null +++ b/backend/db/schema/documenttemplates.ts @@ -0,0 +1,39 @@ +import { + pgTable, + bigint, + text, + timestamp, + boolean, + jsonb, + uuid, +} from "drizzle-orm/pg-core" + +import { tenants } from "./tenants" +import { authUsers } from "./auth_users" + +export const documenttemplates = pgTable("documenttemplates", { + id: bigint("id", { mode: "number" }) + .primaryKey() + .generatedByDefaultAsIdentity(), + + createdAt: timestamp("created_at", { withTimezone: true }) + .notNull() + .defaultNow(), + + tenant: bigint("tenant", { mode: "number" }) + .notNull() + .references(() => tenants.id), + + name: text("name").notNull(), + documentType: text("document_type").notNull(), + templateData: jsonb("template_data").notNull().default({}), + default: boolean("default").notNull().default(false), + archived: boolean("archived").notNull().default(false), + + updatedAt: timestamp("updated_at", { withTimezone: true }), + updatedBy: uuid("updated_by").references(() => authUsers.id), + createdBy: uuid("created_by").references(() => authUsers.id), +}) + +export type DocumentTemplate = typeof documenttemplates.$inferSelect +export type NewDocumentTemplate = typeof documenttemplates.$inferInsert diff --git a/backend/db/schema/index.ts b/backend/db/schema/index.ts index 3afc23c..e6d1e5e 100644 --- a/backend/db/schema/index.ts +++ b/backend/db/schema/index.ts @@ -22,6 +22,7 @@ export * from "./contracttypes" export * from "./costcentres" export * from "./countrys" export * from "./createddocuments" +export * from "./documenttemplates" export * from "./createdletters" export * from "./customers" export * from "./customerspaces" diff --git a/backend/src/utils/resource.config.ts b/backend/src/utils/resource.config.ts index bf7e486..476c5cc 100644 --- a/backend/src/utils/resource.config.ts +++ b/backend/src/utils/resource.config.ts @@ -12,6 +12,7 @@ import { contracttypes, costcentres, createddocuments, + documenttemplates, customerinventoryitems, customerspaces, customers, @@ -237,6 +238,9 @@ export const resourceConfig = { texttemplates: { table: texttemplates }, + documenttemplates: { + table: documenttemplates, + }, incominginvoices: { table: incominginvoices, mtmLoad: ["statementallocations","files"], diff --git a/frontend/components/EntityShowSubCreatedDocuments.vue b/frontend/components/EntityShowSubCreatedDocuments.vue index 272da37..febb98e 100644 --- a/frontend/components/EntityShowSubCreatedDocuments.vue +++ b/frontend/components/EntityShowSubCreatedDocuments.vue @@ -2,6 +2,8 @@ import dayjs from "dayjs"; import {useSum} from "~/composables/useSum.js"; +import CreateDocumentModal from "~/components/createDocumentModal.vue"; +import CreateDocumentFromTemplateModal from "~/components/createDocumentFromTemplateModal.vue"; defineShortcuts({ /*'/': () => { //console.log(searchinput) @@ -56,6 +58,7 @@ const dataStore = useDataStore() const tempStore = useTempStore() const router = useRouter() +const modal = useModal() const deliveryNoteLikeDocumentTypes = ['deliveryNotes', 'packingSlips'] const createddocuments = ref([]) @@ -154,34 +157,17 @@ const selectItem = (item) => { Lieferscheine/Packscheine abrechnen - + Angebot + + Dokument - + Kostenschätzung - - - + Auftragsbestätigung - - - + Lieferschein - - - + Packschein - - - + Abschlagsrechnung + + Dokument aus Vorlage { - - + Rechnung - - +
+ + + + +
@@ -163,12 +164,15 @@ + +