Speichervorgang und Datenmodell des Immobilienformulars
Schritte beim Speichern einer Immobilie mit Validierung, Koordinaten- und Etikettenbehandlung, Zustand vor der Migration, Schreiben in den Geo-Speicher, Stamm- und verknüpfte Tabellen sowie öffentliche Methoden des Eigentümermodells.
Das Formular (masterdata/property.form, Recht edit) hat zwei Spalten (40/60). Das Speichern (masterdata/property.save, canSave(route, property_id); mangels Schlüssel add auch bei neuen Datensätzen edit) schreibt Stammdaten, Beschreibungen, Etiketten, Räume, Zähler und Vollmachten in einer Anfrage.
Speicherschritte
- Titel, Kurzbeschreibung und Beschreibung je Sprache (
property_description[language_id]); die Spaltenameist der Titel der Standardsprache, sonst der ersten ausgefüllten Sprache; leer ergibt einen Fehler am Feldtitle-<Standard>. - Koordinaten: nur ein gültiges Paar (|Breite| ≤ 90, |Länge| ≤ 180), Komma durch Punkt ersetzt, auf 7 Dezimalstellen gerundet; leer = kein Punkt.
- Prüfung des Inhaltsbereichs für den Client (Betreiber).
- Prüfung der Vollmachtszeilen (falls
mandate_form = 1). - Normalisierung des Datenblatts (
Dlbtproperty::normalize()), Räume (normalizeRooms()) und Flächenberechnung (computeAreas()). - Wohnanlage:
parent_property_iddarf nicht auf sich selbst zeigen (dann 0). - Etiketten: das erste aktive Etikett mit Engine-Handler, sonst das erste aktive, kommt in die alte Spalte
label_id. - Neuer Datensatz:
addProperty()(Antwort mitproperty_id); bestehend:editProperty(); Shop-Zuordnung (sync_stores = 1) übersavePropertyStores(). saveDescriptions(), Etiketten (label::setObjectLabels('property', …)),saveRooms(),saveMeters(),saveMandates()(Antwort mitmandate_ids).- Zurücklesen (
getProperty()); mit Koordinaten geht der Punkt in den gemeinsamen Geo-Speicher (dlbtgeo->ingest(Dlbtproperty::geoSpec(...)), Quelltypproperty, eine Immobilie = ein Punkt); bei Fehler bleibt das Speichern erfolgreich mitgeo_warning. - Erfolg: „Success: Property saved.“; keine Weiterleitung, der passive Listener schreibt die neue Kennung ins versteckte
property_id.
Fehlen die Datenblattspalten noch, schreibt das Speichern die Stammdaten und nennt in einer Warnung, was nicht gespeichert wurde; das Formular zeigt einen gelben Kasten mit Migrationsprotokoll-Zeile und Kettenblockade, mit system/update + install eine Schaltfläche „Retry migrations“ (system/update.retry).
Datenmodell
Die Tabellennamen tragen in der Datenbank das eigene Präfix der Installation.
| Tabelle | Hauptfelder |
|---|---|
property | name, identifier, address, owner_company_id, match_value, label_id, note, status, created_by; Adresse: operator_company_id, country_code, postcode, city, street_name, street_type, house_number, building, staircase, floor, door, lot_number; Datenblatt: property_type (erster Typ), property_types, property_uses, Flächen, latitude, longitude, details (JSON), cover_doc_id, parent_property_id |
property_description | (property_id, language_id): title, short_description, description |
property_to_store | property_id, store_id |
Referenzierte Fremdtabellen (nicht beschrieben): company, doc_link (object_type = property), label_link, contract (Löschschutz), der Geo-Speicher.
Eigentümermodell
admin/model/masterdata/property.php. Von anderen Modulen genutzte öffentliche Methoden: getProperty(), getProperties(), getActiveProperties() (Vertrag), getOperatedProperties() und hasOperatorColumn() (Tourismussteuer), getValidMandate(), getMandatedPropertyIds(), mandateCovers() (Vertrag), getGeocodeCandidates(), setCoordinates() (Geo-Karte), countRoomsByType() (Löschschutz des Raumtypstamms), getPropertyStores(), savePropertyStores(). Katalogmodell: getPropertyForView() (aktiv + dem aktuellen Shop zugeordnet), getDescription(), getRooms(), getPropertyForApi(), getPropertyChanges(). Die Bibliothek Dlbtproperty ist ein SQL-freies Feldregister und Rechenwerk.
Hilfsendpunkte
labelsearch (höchstens 20 aktive Etiketten), labelcreate (dlbtlabel->ensureLabel), companies (gemeinsame Firmenauswahl), companysearch (mindestens 2 Zeichen, 20 aktive Firmen; nicht nach Inhaltsbereich gefiltert — jede aktive Firma kann Eigentümer sein). Karte im Formular: Google Maps mit dem API-Schlüssel vom Typ „maps“; „From address“ geokodiert die gegliederte Adresse.