diff --git a/application/controllers/system/TestVBform.php b/application/controllers/system/TestVBform.php
new file mode 100644
index 000000000..9923bf05b
--- /dev/null
+++ b/application/controllers/system/TestVBform.php
@@ -0,0 +1,32 @@
+ 'system/developer:r'
+ )
+ );
+ }
+
+ // -----------------------------------------------------------------------------------------------------------------
+ // Public methods
+
+ /**
+ * Everything has a beginning
+ */
+ public function index()
+ {
+ $this->load->view('system/logs/testVBform.php');
+ }
+}
diff --git a/application/views/system/logs/testVBform.php b/application/views/system/logs/testVBform.php
new file mode 100644
index 000000000..566abb1cb
--- /dev/null
+++ b/application/views/system/logs/testVBform.php
@@ -0,0 +1,16 @@
+ 'Test VBform',
+ 'bootstrap5' => true,
+ 'fontawesome6' => true,
+ 'vue3' => true,
+ 'customJSModules' => array('public/js/apps/vbform/vbform.js')
+ );
+
+ $this->load->view('templates/FHC-Header', $includesArray);
+?>
+
+
+
+load->view('templates/FHC-Footer', $includesArray); ?>
+
diff --git a/public/js/apps/vbform/vbform.js b/public/js/apps/vbform/vbform.js
new file mode 100644
index 000000000..2ca309ba8
--- /dev/null
+++ b/public/js/apps/vbform/vbform.js
@@ -0,0 +1,22 @@
+import vertragsbestandteilhelper from '../../components/vbform/vertragsbestandteilhelper.js';
+
+Vue.createApp({
+ template: `
+
+
{{ title }}
+
+
+ `,
+ data: function() {
+ return {
+ "title": "Vertragsbestandteil Form",
+ };
+ },
+ components: {
+ 'vertragsbestandteilhelper': vertragsbestandteilhelper
+ },
+ created: function() {
+ },
+ methods: {
+ }
+}).mount('#main');
diff --git a/public/js/components/vbform/gehaltsbestandteil.js b/public/js/components/vbform/gehaltsbestandteil.js
new file mode 100644
index 000000000..ac4d726c5
--- /dev/null
+++ b/public/js/components/vbform/gehaltsbestandteil.js
@@ -0,0 +1,57 @@
+import gueltigkeit from './gueltigkeit.js';
+
+export default {
+ props: [
+ 'id'
+ ],
+ data: function() {
+ return {
+ gehaltstyp : '',
+ betrag: '',
+ gueltig_ab: '',
+ gueltig_bis: '',
+ valorisierung: ''
+ }
+ },
+ template: `
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ `,
+ components: {
+ 'gueltigkeit': gueltigkeit
+ },
+ methods: {
+ removeGB: function() {
+ this.$emit('removeGB', {id: this.id});
+ },
+ getPayload: function() {
+ return {
+ gehaltstyp: this.gehaltstyp,
+ betrag: this.betrag,
+ gueltigkeit: this.$refs.gueltigkeit.getPayload(),
+ valorisierung: this.valorisierung
+ };
+ }
+ }
+}
diff --git a/public/js/components/vbform/gehaltsbestandteilhelper.js b/public/js/components/vbform/gehaltsbestandteilhelper.js
new file mode 100644
index 000000000..865a98ec5
--- /dev/null
+++ b/public/js/components/vbform/gehaltsbestandteilhelper.js
@@ -0,0 +1,53 @@
+import gehaltsbestandteil from './gehaltsbestandteil';
+
+export default {
+ template: `
+
+
+ `,
+ data: function() {
+ return {
+ payload: [],
+ gbs: [],
+ };
+ },
+ components: {
+ 'gehaltsbestandteil': gehaltsbestandteil,
+ },
+ methods: {
+ addGB: function(e) {
+ e.preventDefault();
+ e.stopPropagation();
+
+ var gbid = 'testgb' + (this.gbs.length + 1);
+ this.gbs.push({
+ id: gbid
+ });
+ },
+ removeGB: function(payload) {
+ var gbs = this.gbs.filter(function(gb) {
+ return gb.id !== payload.id;
+ });
+ this.gbs = gbs;
+ },
+ getPayload: function() {
+ var gbs = this.gbs;
+ var that = this;
+
+ this.payload = [];
+ gbs.forEach(function(gb) {
+ that.payload.push(that.$refs[gb.id][0].getPayload());
+ });
+
+ return this.payload;
+ }
+ }
+}
diff --git a/public/js/components/vbform/gueltigkeit.js b/public/js/components/vbform/gueltigkeit.js
new file mode 100644
index 000000000..ea40f920f
--- /dev/null
+++ b/public/js/components/vbform/gueltigkeit.js
@@ -0,0 +1,25 @@
+export default {
+ data: function() {
+ return {
+ gueltig_ab: '',
+ gueltig_bis: ''
+ }
+ },
+ template: `
+
+
+
+
+
+
+ `,
+ components: {},
+ methods: {
+ getPayload: function() {
+ return {
+ gueltig_ab: this.gueltig_ab,
+ gueltig_bis: this.gueltig_bis,
+ };
+ }
+ }
+}
diff --git a/public/js/components/vbform/vertragsbestandteil_freitext.js b/public/js/components/vbform/vertragsbestandteil_freitext.js
new file mode 100644
index 000000000..03dc41be6
--- /dev/null
+++ b/public/js/components/vbform/vertragsbestandteil_freitext.js
@@ -0,0 +1,72 @@
+import gehaltsbestandteilhelper from './gehaltsbestandteilhelper.js';
+import gueltigkeit from './gueltigkeit.js';
+
+export default {
+ props: [
+ 'id'
+ ],
+ emits: {
+ removeVB: null
+ },
+ data: function() {
+ return {
+ freitexttyp: '',
+ titel: '',
+ freitext: '',
+ kuendigungsrelevant: ''
+ }
+ },
+ template: `
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ `,
+ components: {
+ 'gehaltsbestandteilhelper': gehaltsbestandteilhelper,
+ 'gueltigkeit': gueltigkeit
+ },
+ methods: {
+ removeVB: function() {
+ this.$emit('removeVB', {id: this.id});
+ },
+ getPayload: function() {
+ return {
+ freitexttyp: this.freitexttyp,
+ titel: this.titel,
+ freitext: this.freitext,
+ kuendigungsrelevant: this.kuendigungsrelevant,
+ gueltigkeit: this.$refs.gueltigkeit.getPayload(),
+ gehaltsbestandteile: this.$refs.gbh.getPayload()
+ };
+ }
+ }
+}
diff --git a/public/js/components/vbform/vertragsbestandteil_funktion.js b/public/js/components/vbform/vertragsbestandteil_funktion.js
new file mode 100644
index 000000000..8c14a6ddf
--- /dev/null
+++ b/public/js/components/vbform/vertragsbestandteil_funktion.js
@@ -0,0 +1,55 @@
+import gehaltsbestandteilhelper from './gehaltsbestandteilhelper.js'
+import gueltigkeit from './gueltigkeit.js';
+
+export default {
+ props: [
+ 'id'
+ ],
+ emits: {
+ removeVB: null
+ },
+ data: function () {
+ return {
+ funktion: '',
+ orget: '',
+ gueltig_ab: '',
+ gueltig_bis: ''
+ }
+ },
+ template: `
+
+ `,
+ components: {
+ 'gehaltsbestandteilhelper': gehaltsbestandteilhelper,
+ 'gueltigkeit': gueltigkeit
+ },
+ methods: {
+ removeVB: function() {
+ this.$emit('removeVB', {id: this.id});
+ },
+ getPayload: function() {
+ return {
+ funktion: this.funktion,
+ orget: this.orget,
+ gueltigkeit: this.$refs.gueltigkeit.getPayload(),
+ gehaltsbestandteile: this.$refs.gbh.getPayload()
+ };
+ }
+ }
+}
diff --git a/public/js/components/vbform/vertragsbestandteil_stunden.js b/public/js/components/vbform/vertragsbestandteil_stunden.js
new file mode 100644
index 000000000..4cdfafe0d
--- /dev/null
+++ b/public/js/components/vbform/vertragsbestandteil_stunden.js
@@ -0,0 +1,48 @@
+import gehaltsbestandteilhelper from './gehaltsbestandteilhelper.js';
+import gueltigkeit from './gueltigkeit.js';
+
+export default {
+ props: [
+ 'id'
+ ],
+ emits: {
+ removeVB: null
+ },
+ data: function () {
+ return {
+ stunden: ''
+ }
+ },
+ "template": `
+
+ `,
+ components: {
+ 'gehaltsbestandteilhelper': gehaltsbestandteilhelper,
+ 'gueltigkeit': gueltigkeit
+ },
+ methods: {
+ removeVB: function() {
+ this.$emit('removeVB', {id: this.id});
+ },
+ getPayload: function() {
+ return {
+ stunden: this.stunden,
+ gueltigkeit: this.$refs.gueltigkeit.getPayload(),
+ gehaltsbestandteile: this.$refs.gbh.getPayload()
+ };
+ }
+ }
+}
diff --git a/public/js/components/vbform/vertragsbestandteil_zeitaufzeichnung.js b/public/js/components/vbform/vertragsbestandteil_zeitaufzeichnung.js
new file mode 100644
index 000000000..f16555d2d
--- /dev/null
+++ b/public/js/components/vbform/vertragsbestandteil_zeitaufzeichnung.js
@@ -0,0 +1,65 @@
+import gueltigkeit from './gueltigkeit.js';
+
+export default {
+ props: [
+ 'id'
+ ],
+ emits: {
+ removeVB: null
+ },
+ data: function () {
+ return {
+ zeitaufzeichnung: '',
+ azgrelevant: '',
+ homeoffice: '',
+ gueltig_ab: '',
+ gueltig_bis: ''
+ }
+ },
+ template: `
+
+ `,
+ components: {
+ 'gueltigkeit': gueltigkeit
+ },
+ methods: {
+ removeVB: function() {
+ this.$emit('removeVB', {id: this.id});
+ },
+ getPayload: function() {
+ return {
+ zeitaufzeichnung: this.zeitaufzeichnung,
+ azgrelevant: this.azgrelevant,
+ homeoffice: this.homeoffice,
+ gueltigkeit: this.$refs.gueltigkeit.getPayload(),
+ };
+ }
+ }
+}
diff --git a/public/js/components/vbform/vertragsbestandteilhelper.js b/public/js/components/vbform/vertragsbestandteilhelper.js
new file mode 100644
index 000000000..0a3707664
--- /dev/null
+++ b/public/js/components/vbform/vertragsbestandteilhelper.js
@@ -0,0 +1,98 @@
+import vertragsbestandteilstunden from './vertragsbestandteil_stunden.js';
+import vertragsbestandteilzeitaufzeichnung from './vertragsbestandteil_zeitaufzeichnung.js';
+import vertragsbestandteilfunktion from './vertragsbestandteil_funktion.js';
+import vertragsbestandteilfreitext from './vertragsbestandteil_freitext.js';
+
+export default {
+ template: `
+
+ `,
+ data: function() {
+ return {
+ vertragsbestandteiltyp: 'vertragsbestandteil',
+ payload: {
+ vbs: []
+ },
+ vbs: [
+ {
+ type: 'vertragsbestandteilstunden',
+ id: 'test1'
+ },
+ {
+ type: 'vertragsbestandteilzeitaufzeichnung',
+ id: 'test2'
+ }
+ ],
+ };
+ },
+ components: {
+ 'vertragsbestandteilstunden': vertragsbestandteilstunden,
+ 'vertragsbestandteilzeitaufzeichnung': vertragsbestandteilzeitaufzeichnung,
+ 'vertragsbestandteilfunktion': vertragsbestandteilfunktion,
+ 'vertragsbestandteilfreitext': vertragsbestandteilfreitext,
+ },
+ methods: {
+ addVB: function(e) {
+ e.preventDefault();
+ e.stopPropagation();
+
+ var vbid = 'test' + (this.vbs.length + 1);
+ this.vbs.push({
+ type: this.vertragsbestandteiltyp,
+ id: vbid
+ });
+ },
+ removeVB: function(payload) {
+ var vbs = this.vbs.filter(function(vb) {
+ return vb.id !== payload.id;
+ });
+ this.vbs = vbs;
+ },
+ getJSON: function(e) {
+ e.preventDefault();
+ e.stopPropagation();
+
+ var vbs = this.vbs;
+ var that = this;
+
+ this.payload = {
+ vbs: []
+ };
+ vbs.forEach(function(vb) {
+ that.payload.vbs.push(that.$refs[vb.id][0].getPayload());
+ });
+ }
+ },
+ computed: {
+ resjson: function() {
+ return JSON.stringify(this.payload, null, 2);
+ }
+ }
+}