Ausgehende SEPA-Mandate einführen #183
This commit is contained in:
@@ -51,6 +51,7 @@ const itemInfo = ref({
|
||||
dateOfPerformance: null,
|
||||
paymentDays: auth.activeTenantData.standardPaymentDays,
|
||||
payment_type: "transfer",
|
||||
outgoingsepamandate: null,
|
||||
availableInPortal: false,
|
||||
customSurchargePercentage: 0,
|
||||
created_by: auth.user.id,
|
||||
@@ -90,6 +91,7 @@ const selectedServicecategorie = ref(null)
|
||||
const customers = ref([])
|
||||
const contacts = ref([])
|
||||
const contracts = ref([])
|
||||
const outgoingsepamandates = ref([])
|
||||
const texttemplates = ref([])
|
||||
const units = ref([])
|
||||
const tenantUsers = ref([])
|
||||
@@ -204,6 +206,7 @@ const setupData = async () => {
|
||||
customers.value = await useEntities("customers").select("*", "customerNumber")
|
||||
contacts.value = await useEntities("contacts").select("*")
|
||||
contracts.value = await useEntities("contracts").select("*")
|
||||
outgoingsepamandates.value = await useEntities("outgoingsepamandates").select("*")
|
||||
texttemplates.value = await useEntities("texttemplates").select("*")
|
||||
units.value = await useEntities("units").selectSpecial("*")
|
||||
tenantUsers.value = (await useNuxtApp().$api(`/api/tenant/users`, {
|
||||
@@ -211,6 +214,43 @@ const setupData = async () => {
|
||||
})).users
|
||||
}
|
||||
|
||||
const getMandateCustomerId = (mandate) => mandate?.customer?.id || mandate?.customer
|
||||
|
||||
const availableSepaMandates = computed(() => {
|
||||
return outgoingsepamandates.value.filter((mandate) => {
|
||||
return !mandate.archived
|
||||
&& mandate.status === "Aktiv"
|
||||
&& (!itemInfo.value.customer || getMandateCustomerId(mandate) === itemInfo.value.customer)
|
||||
})
|
||||
})
|
||||
|
||||
const applyDefaultSepaMandate = () => {
|
||||
if (itemInfo.value.payment_type !== "direct-debit") {
|
||||
itemInfo.value.outgoingsepamandate = null
|
||||
return
|
||||
}
|
||||
|
||||
const selectedContract = contracts.value.find((contract) => contract.id === itemInfo.value.contract)
|
||||
const contractMandateId = selectedContract?.outgoingsepamandate?.id || selectedContract?.outgoingsepamandate
|
||||
if (contractMandateId && availableSepaMandates.value.find((mandate) => mandate.id === contractMandateId)) {
|
||||
itemInfo.value.outgoingsepamandate = contractMandateId
|
||||
return
|
||||
}
|
||||
|
||||
if (itemInfo.value.outgoingsepamandate && availableSepaMandates.value.find((mandate) => mandate.id === itemInfo.value.outgoingsepamandate)) {
|
||||
return
|
||||
}
|
||||
|
||||
const defaultMandate = availableSepaMandates.value.find((mandate) => mandate.defaultMandate)
|
||||
|| availableSepaMandates.value[0]
|
||||
itemInfo.value.outgoingsepamandate = defaultMandate?.id || null
|
||||
}
|
||||
|
||||
watch(
|
||||
() => [itemInfo.value.customer, itemInfo.value.contract, itemInfo.value.payment_type, outgoingsepamandates.value.length],
|
||||
() => applyDefaultSepaMandate()
|
||||
)
|
||||
|
||||
const loaded = ref(false)
|
||||
const normalizeEntityId = (value) => {
|
||||
if (value === null || typeof value === "undefined") return null
|
||||
@@ -1476,6 +1516,7 @@ const saveSerialInvoice = async () => {
|
||||
project: itemInfo.value.project,
|
||||
paymentDays: itemInfo.value.paymentDays,
|
||||
payment_type: itemInfo.value.payment_type,
|
||||
outgoingsepamandate: itemInfo.value.outgoingsepamandate,
|
||||
deliveryDateType: "Leistungszeitraum",
|
||||
createdBy: itemInfo.value.createdBy,
|
||||
created_by: itemInfo.value.created_by,
|
||||
@@ -1563,6 +1604,7 @@ const saveDocument = async (state, resetup = false) => {
|
||||
deliveryDateEnd: itemInfo.value.deliveryDateEnd,
|
||||
paymentDays: itemInfo.value.paymentDays,
|
||||
payment_type: itemInfo.value.payment_type,
|
||||
outgoingsepamandate: itemInfo.value.outgoingsepamandate,
|
||||
deliveryDateType: itemInfo.value.deliveryDateType,
|
||||
info: {},
|
||||
createdBy: itemInfo.value.createdBy,
|
||||
@@ -2242,6 +2284,29 @@ const setRowData = async (row, service = {sellingPriceComposed: {}}, product = {
|
||||
</template>
|
||||
</USelectMenu>
|
||||
</UFormField>
|
||||
<UFormField
|
||||
v-if="itemInfo.payment_type === 'direct-debit'"
|
||||
class="min-w-0 flex-1"
|
||||
label="SEPA-Mandat:"
|
||||
>
|
||||
<USelectMenu
|
||||
v-model="itemInfo.outgoingsepamandate"
|
||||
value-key="id"
|
||||
label-key="reference"
|
||||
:items="availableSepaMandates"
|
||||
:search-input="{ placeholder: 'Suche...' }"
|
||||
:filter-fields="['reference', 'status']"
|
||||
class="w-full"
|
||||
:disabled="!itemInfo.customer"
|
||||
>
|
||||
<template #default>
|
||||
{{ itemInfo.outgoingsepamandate ? availableSepaMandates.find(i => i.id === itemInfo.outgoingsepamandate)?.reference : "Kein Mandat ausgewählt" }}
|
||||
</template>
|
||||
<template #item="{ item: mandate }">
|
||||
{{ mandate.reference }} - {{ mandate.bankaccount?.displayLabel || "Bankverbindung" }}
|
||||
</template>
|
||||
</USelectMenu>
|
||||
</UFormField>
|
||||
<UFormField
|
||||
class="min-w-0 flex-1"
|
||||
label="Individueller Aufschlag:"
|
||||
|
||||
@@ -35,6 +35,7 @@ const defaultFeatures = {
|
||||
createDocument: true,
|
||||
serialInvoice: true,
|
||||
incomingInvoices: true,
|
||||
outgoingsepamandates: true,
|
||||
costcentres: true,
|
||||
branches: true,
|
||||
teams: true,
|
||||
@@ -82,6 +83,7 @@ const featureOptions = [
|
||||
{ key: "createDocument", label: "Buchhaltung: Ausgangsbelege" },
|
||||
{ key: "serialInvoice", label: "Buchhaltung: Serienvorlagen" },
|
||||
{ key: "incomingInvoices", label: "Buchhaltung: Eingangsbelege" },
|
||||
{ key: "outgoingsepamandates", label: "Buchhaltung: Ausgehende SEPA-Mandate" },
|
||||
{ key: "costcentres", label: "Buchhaltung: Kostenstellen" },
|
||||
{ key: "branches", label: "Stammdaten: Niederlassungen" },
|
||||
{ key: "teams", label: "Mitarbeiter: Teams" },
|
||||
|
||||
Reference in New Issue
Block a user