Compare commits

...

7 Commits

22 changed files with 419 additions and 51 deletions

162
README.md
View File

@@ -1118,3 +1118,165 @@ Um Entitäten für Portalnutzer (Contact-Entität) freizugeben, wurde ein konsis
- Tab "Freigabe für" sollte immer der erste Tab im Bottom-Panel sein (index: 0) - Tab "Freigabe für" sollte immer der erste Tab im Bottom-Panel sein (index: 0)
- Style "warning" hebt das Panel visuell hervor - Style "warning" hebt das Panel visuell hervor
- Nach Änderungen immer Rebuild durchführen und beide Seiten der Relationship definieren - Nach Änderungen immer Rebuild durchführen und beide Seiten der Relationship definieren
---
## Custom JavaScript & CSS Integration
### JavaScript-Module einbinden
EspoCRM verwendet AMD/RequireJS für JavaScript-Module. Custom JavaScript-Dateien werden in `client/custom/src/` abgelegt.
**Beispiel: RVG-Gebührenrechner für CVmhErstgespraech**
**1. Modul erstellen** (`client/custom/src/modules/rvg-calculator.js`):
```javascript
define('custom:modules/rvg-calculator', [], function () {
return {
kalkuliereKosten: function(streitwert, anzahlKlaeger, anzahlBeklagte, ustProzent) {
// Berechnungslogik
return { /* Ergebnisobjekt */ };
}
};
});
```
**2. Custom Field View erstellen** (`client/custom/src/views/{entity}/fields/{fieldname}.js`):
```javascript
define('custom:views/c-vmh-erstgespraech/fields/rvg-calculated', [
'views/fields/currency',
'custom:modules/rvg-calculator'
], function (Dep, RvgCalculator) {
return Dep.extend({
setup: function () {
Dep.prototype.setup.call(this);
this.listenTo(this.model, 'change:streitwert change:anzahlVermieter', this.calculate);
this.listenTo(this.model, 'sync', this.calculate); // Initial load
},
calculate: function () {
var result = RvgCalculator.kalkuliereKosten(/*...*/);
this.model.set('kostenRaeumungsantrag', result.kostenRaeumungsantrag);
}
});
});
```
**3. In entityDefs registrieren**:
```json
{
"fields": {
"vergleich1InstanzGk": {
"type": "currency",
"readOnly": true,
"view": "custom:views/c-vmh-erstgespraech/fields/rvg-calculated"
}
}
}
```
**Wichtige Patterns:**
- `listenTo(model, 'sync', callback)` - Für initiale Berechnung beim Laden
- `listenTo(model, 'change:field1 change:field2', callback)` - Für Reaktivität
- `calculating` Flag verhindert Rekursion bei `model.set()`
- Browser-Cache: Hard Refresh (Ctrl+Shift+R) nach JS-Änderungen erforderlich
### CSS-Manipulation & Feld-Hervorhebung
EspoCRM erlaubt Custom CSS über Metadata-Registrierung.
**1. CSS-Datei erstellen** (`client/custom/css/erstgespraech-highlight.css`):
```css
/* Feld-Selektor über data-name Attribut */
.detail .cell[data-name="vorzusch1Instanz"] {
background-color: #d4edda;
padding: 10px;
border-bottom: 4px solid #28a745;
border-radius: 4px;
}
.detail .cell[data-name="vorzusch1Instanz"] .numeric-text {
font-weight: bold;
color: #155724;
font-size: 1.1em;
}
```
**2. CSS in Metadata registrieren** (`custom/Espo/Custom/Resources/metadata/app/client.json`):
```json
{
"cssList": [
"__APPEND__",
"client/custom/css/erstgespraech-highlight.css"
]
}
```
**3. Rebuild durchführen** - CSS wird in gecachtes Bundle integriert
**CSS-Targeting-Strategien:**
- **Feld-spezifisch:** `.cell[data-name="fieldName"]`
- **Entity-spezifisch:** `body[data-controller="CVmhErstgespraech"]`
- **View-spezifisch:** `.detail` (Detail-View), `.edit` (Edit-View), `.list` (List-View)
- **Label vs. Value:**
- `.label-text` - Feldlabel
- `.numeric-text` / `.text-default` - Feldwert
- `.field[data-name="..."]` - Field-Container
**HTML-Struktur (Referenz):**
```html
<div class="cell col-sm-4 form-group" data-name="vorzusch1Instanz">
<label class="control-label">
<span class="label-text">Vorauszuschießende Kosten I. Inst.</span>
</label>
<div class="field" data-name="vorzusch1Instanz">
<span class="numeric-text">3.067,63</span> €
</div>
</div>
```
**Best Practices:**
- CSS-Dateien in `client/custom/css/` oder `client/custom/modules/{module}/css/` ablegen
- `__APPEND__` verwendet um Core-CSS zu erweitern, nicht zu überschreiben
- Spezifische Selektoren verwenden um Kollisionen zu vermeiden
- Nach CSS-Änderungen: Rebuild + Hard Refresh (Browser Cache löschen)
### RVG-Gebührenrechner (CVmhErstgespraech)
**Implementierung:** Automatische Berechnung von Anwalts- und Gerichtskosten nach RVG 2025 / GKG
**Komponenten:**
1. **Calculator-Modul** (`client/custom/src/modules/rvg-calculator.js`):
- `getWertgebuehr()`: RVG 2025 Tabelle (65 Stufen, €500-€2M)
- `getGerichtsgebuehr()`: GKG progressive Berechnung
- `getZuschlag()`: §7 RVG Personenzuschlag (+0.3 pro Person, max +2.0)
- `kalkuliereKosten()`: Hauptfunktion für alle Szenarien
2. **Custom Field Views**:
- `rvg-calculated.js`: Trigger für alle Berechnungen
- `beruecksichtigte-personen.js`: Live-Text-Anzeige "X Vermieter, Y Mieter, Z Dritte"
- `warmmiete.js`: Kaltmiete + BK-Vorauszahlung + BK-Pauschale
- `streitwert.js`: (Kaltmiete + BK-Pauschale) × 12
3. **Berechnete Felder** (readOnly currency fields):
- Außergerichtliche Gebühren: 1.3 + Zuschlag + Pauschale 20% (max 20€)
- Kosten Räumungsantrag: 0.3 + 0.3/Person + Pauschale
- 1. Instanz: 3.0 GK + RA-Kosten (1.3 Verf + 1.2 Term + Pauschale)
- Säumnisszenario: 3.0 GK + reduzierte RA (0.5 Term statt 1.2)
- Vergleichsszenario: 1.0 GK + RA (1.3 Verf + 1.2 Term + 1.0 Vergl)
4. **USt-Satz Handling**:
- Enum Field: "0" / "19" (String, nicht Integer!)
- Konvertierung: `parseInt(ustSatz)` → dann `/100` im Calculator
- **Wichtig:** Expliziter Null-Check nötig, `0` ist falsy in `|| 19`
5. **Reaktivität**:
- Listener auf: streitwert, anzahlVermieter, anzahlMieter, anzahlSonstigeVolljhrigeBewohner, ustSatz
- Initial berechnen mit `'sync'` Event
- `calculating` Flag verhindert Rekursion
**Layout-Panels:**
- **Gebührenberechnung** (primary, info-note): Standard 1. Instanz Kosten
- **Säumnisszenario I. Inst.** (primary, success-note): Beklagte erscheint nicht
- **Vergleichsszenario I. Inst.** (primary, success-note): Einigung vor Urteil
**Hervorhebung:** "Vorauszuschießende Kosten I. Inst." wird via CSS hervorgehoben (grüner Hintergrund, fetter Wert)

View File

@@ -0,0 +1,25 @@
/* Hervorhebung für vorzuschießende Kosten I. Instanz */
.detail .cell[data-name="vorzusch1Instanz"] {
background-color: #d4edda; /* Hellgrün */
padding: 10px;
border-bottom: 4px solid #28a745; /* Grüner Rand unten */
border-radius: 4px;
}
.detail .cell[data-name="vorzusch1Instanz"] .numeric-text {
font-weight: bold;
color: #155724; /* Dunkelgrün */
font-size: 1.1em;
}
.detail .cell[data-name="vorzusch1Instanz"] .label-text {
color: #155724;
}
/* Auch im Edit-Modus hervorheben */
.edit .cell[data-name="vorzusch1Instanz"] {
background-color: #d4edda;
padding: 10px;
border-bottom: 4px solid #28a745;
border-radius: 4px;
}

View File

@@ -0,0 +1,3 @@
<div class="field" data-name="{{name}}">
<span class="text-muted">{{value}}</span>
</div>

View File

@@ -0,0 +1,3 @@
<div class="field" data-name="{{name}}">
<span class="text-muted">{{value}}</span>
</div>

View File

@@ -0,0 +1,51 @@
define('custom:views/c-vmh-erstgespraech/fields/beruecksichtigte-personen', ['views/fields/text'], function (Dep) {
return Dep.extend({
detailTemplate: 'custom:c-vmh-erstgespraech/fields/beruecksichtigte-personen/detail',
editTemplate: 'custom:c-vmh-erstgespraech/fields/beruecksichtigte-personen/edit',
setup: function () {
Dep.prototype.setup.call(this);
this.listenTo(this.model, 'change:anzahlVermieter change:anzahlMieter change:anzahlSonstigeVolljhrigeBewohner', () => {
this.updateText();
});
// Initial update when model is synced
this.listenTo(this.model, 'sync', () => {
this.updateText();
});
// Update immediately if data already exists
if (this.model.id) {
this.updateText();
}
},
updateText: function () {
if (this.calculating) return;
this.calculating = true;
const vermieter = this.model.get('anzahlVermieter') || 0;
const mieter = this.model.get('anzahlMieter') || 0;
const sonstige = this.model.get('anzahlSonstigeVolljhrigeBewohner') || 0;
const text = `${vermieter} Vermieter, ${mieter} Mieter, ${sonstige} Dritte`;
this.model.set('beruecksichtigtePersonen', text, {silent: true});
this.calculating = false;
if (this.isRendered()) {
this.reRender();
}
},
data: function () {
const data = Dep.prototype.data.call(this);
data.value = this.model.get('beruecksichtigtePersonen') || '';
return data;
}
});
});

View File

@@ -13,8 +13,13 @@ define('custom:views/c-vmh-erstgespraech/fields/rvg-calculated', [
// Listen to changes on relevant fields (combined listener) // Listen to changes on relevant fields (combined listener)
this.listenTo(this.model, 'change:streitwert change:anzahlVermieter change:anzahlMieter change:anzahlSonstigeVolljhrigeBewohner change:ustSatz', this.calculate.bind(this)); this.listenTo(this.model, 'change:streitwert change:anzahlVermieter change:anzahlMieter change:anzahlSonstigeVolljhrigeBewohner change:ustSatz', this.calculate.bind(this));
// Initial calculation // Initial calculation when model is synced
this.listenTo(this.model, 'sync', this.calculate.bind(this));
// Immediate calculation if data already exists
if (this.model.id) {
this.calculate(); this.calculate();
}
}, },
calculate: function () { calculate: function () {

View File

@@ -63,6 +63,7 @@
"ustSatz": "USt-Satz", "ustSatz": "USt-Satz",
"aussergerichtlicheGebuehren": "Außergerichtliche Gebühren", "aussergerichtlicheGebuehren": "Außergerichtliche Gebühren",
"kostenRaeumungsantrag": "Kosten Räumungsantrag", "kostenRaeumungsantrag": "Kosten Räumungsantrag",
"beruecksichtigtePersonen": "Berücksichtigte Personen",
"gerichtskosten1Instanz": "GK-Kosten I. Inst.", "gerichtskosten1Instanz": "GK-Kosten I. Inst.",
"anwaltskostenKlaeger1Instanz": "RA-Kosten Kläger I. Inst.", "anwaltskostenKlaeger1Instanz": "RA-Kosten Kläger I. Inst.",
"vorzusch1Instanz": "Vorauszuschießende Kosten I. Inst.", "vorzusch1Instanz": "Vorauszuschießende Kosten I. Inst.",
@@ -96,7 +97,8 @@
"erstberaterEinschtzungDISGTyp": "Dominant = Schnelles Tempo, fordernder Ton, Fokus auf Ergebnisse.\\n\\nInitiativ = Hohe Sprechgeschwindigkeit, emotionale Sprache, sucht Bestätigung.\\n\\nStetig = Langsames Tempo, zögernde Pausen, risikoscheu.\\n\\nGewissenhaft = Präzise Formulierungen, sucht Daten, skeptisch.", "erstberaterEinschtzungDISGTyp": "Dominant = Schnelles Tempo, fordernder Ton, Fokus auf Ergebnisse.\\n\\nInitiativ = Hohe Sprechgeschwindigkeit, emotionale Sprache, sucht Bestätigung.\\n\\nStetig = Langsames Tempo, zögernde Pausen, risikoscheu.\\n\\nGewissenhaft = Präzise Formulierungen, sucht Daten, skeptisch.",
"auergerichtlicheGesetzlicheGebhren": "Die gesetzlichen Gebühren für eine außergerichtliche Tätigkeit", "auergerichtlicheGesetzlicheGebhren": "Die gesetzlichen Gebühren für eine außergerichtliche Tätigkeit",
"kndigungsfristMietverhltnis": "Zeitpunkt zu dem das Mietverhältnis beendet wurde. Bei mehreren Fristen (bspw. fristlose und fristgerechte Kündigung) frühester Zeitpunt.", "kndigungsfristMietverhltnis": "Zeitpunkt zu dem das Mietverhältnis beendet wurde. Bei mehreren Fristen (bspw. fristlose und fristgerechte Kündigung) frühester Zeitpunt.",
"nchsterAnruf": "Nächster Anruf nicht vor" "nchsterAnruf": "Nächster Anruf nicht vor",
"kostenKndigungsservice": "Individuell vereinbarte Pauschale für außergerichtliche Kündigung."
}, },
"options": { "options": {
"status": { "status": {

View File

@@ -1,5 +1,15 @@
[ [
{"name": "name"}, {
{"name": "iban"}, "name": "name",
{"name": "istAktiv"} "link": true
},
{
"name": "iban"
},
{
"name": "kontoinhaber"
},
{
"name": "istAktiv"
}
] ]

View File

@@ -60,5 +60,13 @@
}, },
"dokumentesBeteiligte": { "dokumentesBeteiligte": {
"index": 12 "index": 12
},
"_tabBreak_5": {
"index": 13,
"tabBreak": true,
"tabLabel": "Bankverbindungen"
},
"bankverbindungens": {
"index": 14
} }
} }

View File

@@ -0,0 +1,27 @@
[
{
"name": "name",
"link": true,
"width": 20
},
{
"name": "iban",
"width": 25
},
{
"name": "bic",
"width": 15
},
{
"name": "kontoinhaber",
"width": 20
},
{
"name": "istAktiv",
"width": 10
},
{
"name": "istStandard",
"width": 10
}
]

View File

@@ -154,13 +154,16 @@
"name": "streitwert" "name": "streitwert"
}, },
{ {
"name": "kostenKndigungsservice" "name": "beruecksichtigtePersonen"
}, },
{ {
"name": "ustSatz" "name": "ustSatz"
} }
], ],
[ [
{
"name": "kostenKndigungsservice"
},
{ {
"name": "aussergerichtlicheGebuehren" "name": "aussergerichtlicheGebuehren"
}, },
@@ -178,18 +181,20 @@
{ {
"name": "vorzusch1Instanz" "name": "vorzusch1Instanz"
} }
]
], ],
[ "dynamicLogicVisible": null,
{ "style": "primary",
"name": "vergleich1InstanzGk" "dynamicLogicStyled": null,
"tabBreak": false,
"tabLabel": null,
"hidden": false,
"noteText": "Die Gebühren werden automatisch nach RVG 2025 berechnet basierend auf Streitwert, Personenanzahl und USt-Satz.",
"noteStyle": "info",
"customLabel": "Gebührenberechnung"
}, },
{ {
"name": "vergleich1InstanzAnwK" "rows": [
},
{
"name": "vergleich1InstanzSumme"
}
],
[ [
{ {
"name": "saeumnis1InstanzGk" "name": "saeumnis1InstanzGk"
@@ -208,9 +213,33 @@
"tabBreak": false, "tabBreak": false,
"tabLabel": null, "tabLabel": null,
"hidden": false, "hidden": false,
"noteText": "Die Gebühren werden automatisch nach RVG 2025 berechnet basierend auf Streitwert, Personenanzahl und USt-Satz.", "noteText": "Säumnisszenario: Der Beklagte erscheint nicht zum Termin. Terminsgebühr wird auf 0,5 reduziert, Gerichtskosten bleiben bei 3,0.",
"noteStyle": "success", "noteStyle": "success",
"customLabel": "Gebührenberechnung" "customLabel": "Säumnisszenario I. Inst."
},
{
"rows": [
[
{
"name": "vergleich1InstanzGk"
},
{
"name": "vergleich1InstanzAnwK"
},
{
"name": "vergleich1InstanzSumme"
}
]
],
"dynamicLogicVisible": null,
"style": "primary",
"dynamicLogicStyled": null,
"tabBreak": false,
"tabLabel": null,
"hidden": false,
"noteText": "Vergleichsszenario: Einigung vor Urteil. Vergleichsgebühr 1,0 kommt zusätzlich zur Terminsgebühr hinzu, Gerichtskosten nur 1,0 statt 3,0.",
"noteStyle": "success",
"customLabel": "Vergleichsszenario I. Inst."
}, },
{ {
"rows": [ "rows": [

View File

@@ -0,0 +1,6 @@
{
"cssList": [
"__APPEND__",
"client/custom/css/erstgespraech-highlight.css"
]
}

View File

@@ -238,6 +238,10 @@
"dokumentesBeteiligte": { "dokumentesBeteiligte": {
"layout": null, "layout": null,
"selectPrimaryFilterName": null "selectPrimaryFilterName": null
},
"bankverbindungens": {
"layout": null,
"selectPrimaryFilterName": null
} }
} }
} }

View File

@@ -43,7 +43,8 @@
}, },
"adresse": { "adresse": {
"type": "address", "type": "address",
"isCustom": true "isCustom": true,
"copyToClipboard": true
}, },
"isActive": { "isActive": {
"type": "bool", "type": "bool",

View File

@@ -4,7 +4,8 @@
"type": "varchar", "type": "varchar",
"required": true, "required": true,
"pattern": "$noBadCharacters", "pattern": "$noBadCharacters",
"tooltip": true "tooltip": true,
"copyToClipboard": true
}, },
"iban": { "iban": {
"type": "varchar", "type": "varchar",
@@ -20,21 +21,24 @@
"required": false, "required": false,
"maxLength": 11, "maxLength": 11,
"tooltip": true, "tooltip": true,
"isCustom": true "isCustom": true,
"copyToClipboard": true
}, },
"kontoinhaber": { "kontoinhaber": {
"type": "varchar", "type": "varchar",
"required": false, "required": false,
"maxLength": 255, "maxLength": 255,
"tooltip": true, "tooltip": true,
"isCustom": true "isCustom": true,
"copyToClipboard": true
}, },
"bankname": { "bankname": {
"type": "varchar", "type": "varchar",
"required": false, "required": false,
"maxLength": 255, "maxLength": 255,
"tooltip": true, "tooltip": true,
"isCustom": true "isCustom": true,
"copyToClipboard": true
}, },
"istAktiv": { "istAktiv": {
"type": "bool", "type": "bool",

View File

@@ -2,7 +2,8 @@
"fields": { "fields": {
"name": { "name": {
"type": "personName", "type": "personName",
"isPersonalData": true "isPersonalData": true,
"copyToClipboard": true
}, },
"salutationName": { "salutationName": {
"type": "enum", "type": "enum",
@@ -42,23 +43,27 @@
"required": false, "required": false,
"maxLength": 255, "maxLength": 255,
"tooltip": true, "tooltip": true,
"isCustom": true "isCustom": true,
"copyToClipboard": true
}, },
"firstName": { "firstName": {
"type": "varchar", "type": "varchar",
"maxLength": 100 "maxLength": 100,
"copyToClipboard": true
}, },
"lastName": { "lastName": {
"type": "varchar", "type": "varchar",
"maxLength": 100, "maxLength": 100,
"required": true "required": true,
"copyToClipboard": true
}, },
"description": { "description": {
"type": "text" "type": "text"
}, },
"emailAddress": { "emailAddress": {
"type": "email", "type": "email",
"isPersonalData": true "isPersonalData": true,
"copyToClipboard": true
}, },
"phoneNumber": { "phoneNumber": {
"type": "phone", "type": "phone",
@@ -70,7 +75,8 @@
"Other" "Other"
], ],
"defaultType": "Mobile", "defaultType": "Mobile",
"isPersonalData": true "isPersonalData": true,
"copyToClipboard": true
}, },
"createdAt": { "createdAt": {
"type": "datetime", "type": "datetime",
@@ -140,7 +146,8 @@
"required": false, "required": false,
"maxLength": 50, "maxLength": 50,
"tooltip": true, "tooltip": true,
"isCustom": true "isCustom": true,
"copyToClipboard": true
}, },
"handelsregisterArt": { "handelsregisterArt": {
"type": "enum", "type": "enum",

View File

@@ -6,7 +6,8 @@
"pattern": "$noBadCharacters" "pattern": "$noBadCharacters"
}, },
"description": { "description": {
"type": "text" "type": "text",
"copyToClipboard": true
}, },
"createdAt": { "createdAt": {
"type": "datetime", "type": "datetime",
@@ -70,7 +71,8 @@
"maxLength": 64, "maxLength": 64,
"readOnlyAfterCreate": true, "readOnlyAfterCreate": true,
"options": [], "options": [],
"isCustom": true "isCustom": true,
"copyToClipboard": true
}, },
"betnr": { "betnr": {
"type": "int", "type": "int",

View File

@@ -37,7 +37,8 @@
}, },
"anschrift": { "anschrift": {
"type": "address", "type": "address",
"isCustom": true "isCustom": true,
"copyToClipboard": true
}, },
"objekttyp": { "objekttyp": {
"type": "enum", "type": "enum",

View File

@@ -445,6 +445,12 @@
"decimal": true, "decimal": true,
"isCustom": true "isCustom": true
}, },
"beruecksichtigtePersonen": {
"type": "text",
"readOnly": true,
"view": "custom:views/c-vmh-erstgespraech/fields/beruecksichtigte-personen",
"isCustom": true
},
"gerichtskosten1Instanz": { "gerichtskosten1Instanz": {
"type": "currency", "type": "currency",
"readOnly": true, "readOnly": true,

View File

@@ -57,7 +57,8 @@
"required": false, "required": false,
"maxLength": 100, "maxLength": 100,
"tooltip": true, "tooltip": true,
"isCustom": true "isCustom": true,
"copyToClipboard": true
}, },
"betnr": { "betnr": {
"type": "int", "type": "int",

View File

@@ -2,7 +2,8 @@
"fields": { "fields": {
"name": { "name": {
"type": "personName", "type": "personName",
"isPersonalData": true "isPersonalData": true,
"copyToClipboard": true
}, },
"salutationName": { "salutationName": {
"type": "enum", "type": "enum",
@@ -14,7 +15,8 @@
"maxLength": 100, "maxLength": 100,
"audited": true, "audited": true,
"options": [], "options": [],
"isPersonalData": true "isPersonalData": true,
"copyToClipboard": true
}, },
"lastName": { "lastName": {
"type": "varchar", "type": "varchar",
@@ -22,7 +24,8 @@
"required": true, "required": true,
"isPersonalData": true, "isPersonalData": true,
"audited": true, "audited": true,
"options": [] "options": [],
"copyToClipboard": true
}, },
"description": { "description": {
"type": "text" "type": "text"
@@ -31,7 +34,8 @@
"notStorable": true, "notStorable": true,
"type": "email", "type": "email",
"isPersonalData": true, "isPersonalData": true,
"audited": true "audited": true,
"copyToClipboard": true
}, },
"phoneNumber": { "phoneNumber": {
"type": "phone", "type": "phone",
@@ -43,39 +47,46 @@
"Other" "Other"
], ],
"defaultType": "Mobile", "defaultType": "Mobile",
"isPersonalData": true "isPersonalData": true,
"copyToClipboard": true
}, },
"address": { "address": {
"type": "address", "type": "address",
"isPersonalData": true, "isPersonalData": true,
"viewMap": false "viewMap": false,
"copyToClipboard": true
}, },
"addressStreet": { "addressStreet": {
"type": "text", "type": "text",
"maxLength": 255, "maxLength": 255,
"dbType": "varchar", "dbType": "varchar",
"audited": true, "audited": true,
"isPersonalData": true "isPersonalData": true,
"copyToClipboard": true
}, },
"addressCity": { "addressCity": {
"type": "varchar", "type": "varchar",
"audited": true, "audited": true,
"isPersonalData": true "isPersonalData": true,
"copyToClipboard": true
}, },
"addressState": { "addressState": {
"type": "varchar", "type": "varchar",
"audited": true "audited": true,
"copyToClipboard": true
}, },
"addressCountry": { "addressCountry": {
"type": "varchar", "type": "varchar",
"audited": true, "audited": true,
"isPersonalData": true "isPersonalData": true,
"copyToClipboard": true
}, },
"addressPostalCode": { "addressPostalCode": {
"type": "varchar", "type": "varchar",
"audited": true, "audited": true,
"options": [], "options": [],
"isPersonalData": true "isPersonalData": true,
"copyToClipboard": true
}, },
"createdAt": { "createdAt": {
"type": "datetime", "type": "datetime",

View File

@@ -349,8 +349,8 @@ return [
0 => 'youtube.com', 0 => 'youtube.com',
1 => 'google.com' 1 => 'google.com'
], ],
'cacheTimestamp' => 1769195678, 'cacheTimestamp' => 1769200199,
'microtime' => 1769195678.710132, 'microtime' => 1769200199.876961,
'siteUrl' => 'https://crm.bitbylaw.com', 'siteUrl' => 'https://crm.bitbylaw.com',
'fullTextSearchMinLength' => 4, 'fullTextSearchMinLength' => 4,
'appTimestamp' => 1768843902, 'appTimestamp' => 1768843902,