diff --git a/backend/src/routes/resources/main.ts b/backend/src/routes/resources/main.ts index ccc74fe..3f32a74 100644 --- a/backend/src/routes/resources/main.ts +++ b/backend/src/routes/resources/main.ts @@ -21,6 +21,9 @@ import { decrypt, encrypt } from "../../utils/crypt"; const PORTAL_ALLOWED_RESOURCES = new Set(["customers", "contracts", "createddocuments", "contracttypes"]) const PORTAL_VISIBLE_DOCUMENT_TYPES = ["invoices", "advanceInvoices", "cancellationInvoices"] +const OUTGOING_SEPA_MANDATE_STATUSES = new Set(["Entwurf", "Aktiv", "Widerrufen", "Abgelaufen"]) +const OUTGOING_SEPA_MANDATE_TYPES = new Set(["CORE", "B2B"]) +const OUTGOING_SEPA_SEQUENCE_TYPES = new Set(["RCUR", "OOFF", "FRST", "FNAL"]) // ------------------------------------------------------------- // SQL Suche auf mehreren Feldern (Haupttabelle + Relationen) @@ -378,6 +381,21 @@ async function validateOutgoingSepaMandatePayload( return "Kunde und Bankverbindung sind Pflichtfelder." } + const status = payload.status ?? existing?.status ?? "Entwurf" + if (!OUTGOING_SEPA_MANDATE_STATUSES.has(status)) { + return "Ungültiger Mandatsstatus." + } + + const mandateType = payload.mandateType ?? existing?.mandateType ?? "CORE" + if (!OUTGOING_SEPA_MANDATE_TYPES.has(mandateType)) { + return "Ungültiger Mandatstyp." + } + + const sequenceType = payload.sequenceType ?? existing?.sequenceType ?? "RCUR" + if (!OUTGOING_SEPA_SEQUENCE_TYPES.has(sequenceType)) { + return "Ungültige Mandatssequenz." + } + const [customer] = await server.db .select() .from(customers) diff --git a/frontend/stores/data.js b/frontend/stores/data.js index 21138ff..5a7a0b2 100644 --- a/frontend/stores/data.js +++ b/frontend/stores/data.js @@ -56,6 +56,18 @@ import outgoingSepaMandate from "~/components/columnRenderings/outgoingSepaManda // @ts-ignore export const useDataStore = defineStore('data', () => { + const outgoingSepaMandateTypeOptions = [ + { key: "CORE", label: "Basislastschrift (CORE)" }, + { key: "B2B", label: "Firmenlastschrift (B2B)" } + ] + + const outgoingSepaSequenceTypeOptions = [ + { key: "RCUR", label: "Wiederkehrend (RCUR)" }, + { key: "OOFF", label: "Einmalig (OOFF)" }, + { key: "FRST", label: "Erstlastschrift (FRST)" }, + { key: "FNAL", label: "Letztlastschrift (FNAL)" } + ] + const dataTypes = { @@ -1224,11 +1236,9 @@ export const useDataStore = defineStore('data', () => { required: true, defaultValue: "CORE", inputType: "select", - selectValueAttribute: "label", - selectManualOptions: [ - { label: "CORE" }, - { label: "B2B" } - ], + selectValueAttribute: "key", + selectOptionAttribute: "label", + selectManualOptions: outgoingSepaMandateTypeOptions, inputColumn: "Mandat", sortable: true }, @@ -1238,13 +1248,9 @@ export const useDataStore = defineStore('data', () => { required: true, defaultValue: "RCUR", inputType: "select", - selectValueAttribute: "label", - selectManualOptions: [ - { label: "RCUR" }, - { label: "OOFF" }, - { label: "FRST" }, - { label: "FNAL" } - ], + selectValueAttribute: "key", + selectOptionAttribute: "label", + selectManualOptions: outgoingSepaSequenceTypeOptions, inputColumn: "Mandat", sortable: true }, @@ -2287,7 +2293,7 @@ export const useDataStore = defineStore('data', () => { isArchivable: true, label: "Dokumente", labelSingle: "Dokument", - selectWithInformation: "*, files(*), statementallocations(*)", + selectWithInformation: "*, files(*), statementallocations(*), outgoingsepamandate(*)", filters: [ { name: "Archivierte ausblenden", @@ -3737,5 +3743,7 @@ export const useDataStore = defineStore('data', () => { return { dataTypes, documentTypesForCreation, + outgoingSepaMandateTypeOptions, + outgoingSepaSequenceTypeOptions, } })