Files
Messe-Lotse/plan/data-structure-summary.md
2026-09-29 09:40:32 +00:00

18 KiB
Raw Permalink Blame History

goal, version, date_created, last_updated, owner, status, tags
goal version date_created last_updated owner status tags
DataObject Structure Summary — Reuse Strategy for 24HRS Messe-Lotse 1.2 2026-06-10 2026-06-16 24HRS Team Planned architecture, data-model, pimcore, reuse

Introduction

Status: Planned

Consolidated DataObject structures for the MesseLotse rewrite. Defines which existing Pimcore DataObjects are reused from rkcFairBundle and dgmMediaBaseBundle, what fields are added, and what new entities are created in MessebauBundle.

Reuse strategy: Extend fair and fairLocation in rkcFairBundle with MesseLotse-specific fields. Reuse Person from dgmMediaBaseBundle as the contact/worker entity. All trade-fair-management logic lives in the new MessebauBundle.


1. fairLocation — rkcFairBundle (extend existing)

Field Type Notes
active bool existing
swidentifier input existing
omitSync bool existing
modified datetime existing
address input existing
imagesKey input existing
vaAssetId input existing
image1–5 image existing
boxOptionsTree input existing
boxes relation existing
+ name input new — locale name, e.g. "Messe Frankfurt"
+ googleMapsUrl input new
+ notes textarea new
+ contacts ContactAssignment[] (FC) new — see §1a

1a. FieldCollection: ContactAssignment

Field Type Notes
person many-to-one → Person reuses dgmMediaBaseBundle Person
role select technical / billing / operations / general
validFrom date
validTo date nullable (null = indefinite)
notes textarea

Same person+role+timeframe pattern as WorkerAssignment (§6c), scoped to fairLocation.


2. fair — rkcFairBundle (extend existing)

Field Type Notes
name input existing
swidentifier input existing
active bool existing
omitSync bool existing
modified datetime existing
location many-to-one → fairLocation existing
setupStartDate datetime existing
fairStartDate datetime existing
fairEndDate datetime existing
destructEndDate datetime existing
imagesKey input existing
vaAssetId input existing
image1–5 image existing
boxOptionsTree input existing
boxes relation existing
assignedArticles relation existing
+ setupEndDate datetime new
+ destructStartDate datetime new
+ hallsUsed input new — free text, e.g. "Halle 5.1, 6, 8"
+ notes textarea new
+ regulations many-to-many → Asset new — simple relation, no metadata
+ documents FairDocument[] (FieldCollection) new — see §2a

2a. FieldCollection: FairDocument

Field Type Notes
asset many-to-one → Asset the file
documentType select constructionBriefing / floorPlan / protocol
date datetime protocol date or revision date
hallName input hall reference for floor plans
remarks textarea optional

3. Person — dgmMediaBaseBundle (reuse as-is)

Field Type Notes
firstname input existing
lastname input existing
email input existing
company input existing
salutation select existing
gender select existing
additionalAddresses mediaBaseAddress[] (FC) existing — contains telefonNumber, eMailAddress, faxNumber, full address
... +28 other fields existing

Used as relation target for:

  • fairLocation.contactPerson
  • Customer.contactPerson (future)
  • WorkerAssignment.person (future, Slice 5 of architecture-vertical-slices-1.0.md)

4. Customer — MessebauBundle (new DO)

Deferred — an existing Customer DO lives in a bundle not currently accessible. This section will be updated when that bundle is available.

Field Type Notes
company input
address input
contactPerson many-to-one → Person reuses dgmMediaBaseBundle Person
brandDoc document company-wide brand guidelines
consultationDocs document[] (gallery) multi-fair planning docs
contractDocs document[] (gallery) framework agreements
notes textarea

5. Job — MessebauBundle (new DO)

5a. Master data

Field Type Notes
project input display name
customer many-to-one → Customer
fair many-to-one → fair rkcFairBundle
standType select Systemstand / Reihstand / Eckstand / Kopfstand / Blockstand / Inselstand
standSize input e.g. "6x4"
standHeight numeric meters
hall input e.g. "Halle 5.1 / Stand C12"
area numeric m²
workflowState input managed by Symfony Workflow
notes textarea

5b. Date overrides (all nullable — fallback to fair)

Field Type
setupStartOverride datetime
setupEndOverride datetime
eventStartOverride datetime
eventEndOverride datetime
teardownStartOverride datetime
teardownEndOverride datetime

5c. Asset fields

Field Type Notes
standImage image single booth photo
standGallery image[] gallery
briefingCustomerDoc document per-job override; null → inherit from customer
briefingPlanDoc document per-job override; null → inherit from fair floorPlan
briefingAdditionalDoc document
powerConfirmation document
wlanConfirmation document
cleaningConfirmation document
riggingQuote document
riggingDrawing document
riggingMesseConfirmation document
standApprovalDoc document
acceptancePhotos image[]
acceptanceSignature image
weeklyProtocols document[]

5d. FieldCollections

FieldCollection Fields
BookingPlatformInfo portalLink, email, password (encrypted), deadline
PowerInfo kw, distributor, deadline
WlanInfo type, deadline
CleaningInfo deadline
RiggingInfo supplierFirstname, supplierLastname, supplierEmail, supplierPhone, messeFirstname, messeLastname, messeEmail, messePhone, deadline
DruckproduktionInfo qm, blockout, forexplatten, deadline
CateringInfo baristaEnabled, baristaPackage, days, drinksEnabled, drinksDetails, foodEnabled, foodDetails
CostEstimate standConstruction (int, EUR), activation (int, EUR), furniture (int, EUR), logistics (int, EUR)
Material type (flooring/standsystem/hardware/furniture), name, quantity, notes — multi
ChecklistItem text, checked, order — multi

6. Resource Pool Entities — MessebauBundle (Slice 5)

All person references reuse Person from dgmMediaBaseBundle.

6a. Tree-Based Assignment Pattern

Assignment and booking entities are standalone DataObjects placed in the Pimcore tree under a fair or Job instance. Tree location expresses scope — no nullable job relation field is needed.

/Fairs/OMR2026/
├── ResourceAssignments/
│   ├── WA-pool-01 (fair-pool worker)
│   ├── PVA-pool-01 (fair-pool vehicle)
│   └── ...
├── AccommodationBookings/
│   ├── Hotel-Central/
│   │   └── Occupants/
│   │       ├── Anna-Müller
│   │       └── Max-Schmidt
│   └── Airbnb-Loft/
│       └── Occupants/
│           └── Lisa-Weber
├── Travel/
│   ├── Bahn-HH-Berlin/
│   │   └── Passengers/
│   │       ├── Anna-Müller
│   │       └── Max-Schmidt
│   └── Mietwagen-Frankfurt/
│       └── Passengers/
│           └── Lisa-Weber
├── Jobs/
│   ├── BoothBrevo/
│   │   └── ResourceAssignments/
│   │       ├── WA-001 (job-dedicated worker)
│   │       └── PVA-001 (job-dedicated vehicle)
│   └── BoothDmexco/
│       └── ResourceAssignments/
│           └── WA-002 (job-dedicated worker)

Scope: parent folder is .../ResourceAssignments/ under fair → fair-pool (available for all jobs). Parent folder is .../Jobs/{job}/ResourceAssignments/ → dedicated to that specific job. Bookings live directly under fair.

Aggregation queries (fair-level "how many Baristas?"):

$listing = new WorkerAssignment\Listing();
$listing->setCondition("o_path LIKE '/Fairs/OMR2026/%'");
$allAssignments = $listing->load();

This returns both fair-pool and all job-dedicated assignments in one query. For scoped queries:

// Fair-pool only
"o_path LIKE '/Fairs/OMR2026/ResourceAssignments/%'"

// Specific job only
"o_path LIKE '/Fairs/OMR2026/Jobs/BoothBrevo/ResourceAssignments/%'"

6b. Pool Entities (shared resource catalog)

DO Fields Tree location
WorkerRole name (Barista / Rigger / LorryDriver / FairWorker / Electrician / Cleaner) /ResourcePool/WorkerRoles/
PoolVehicle name, type, licensePlate, state (owned/hired/toHire), notes /ResourcePool/Vehicles/
Equipment name, description, state (owned/rented/toRent), notes /ResourcePool/Equipment/
Accommodation name, address, bookingReference, type (hotel/apartment/other), notes /ResourcePool/Accommodations/

6c. Worker + Vehicle + Equipment Assignments (standalone DOs, tree-scoped)

DO Fields Tree location
WorkerAssignment person → Person, role → WorkerRole, state (select: internal / hired / toHire, default from WorkerRole), startDate (datetime), endDate (datetime), offerDoc (document, nullable, external only), contractDoc (document, nullable, external only), billingDoc (document, nullable, external only), notes (textarea) /Fairs/{fair}/ResourceAssignments/ or /Fairs/{fair}/Jobs/{job}/ResourceAssignments/
PoolVehicleAssignment poolVehicle → PoolVehicle, startDate (datetime), endDate (datetime), notes same pattern
EquipmentAssignment equipment → Equipment, startDate (datetime), endDate (datetime), notes same pattern

6d. Accommodation — Booking + Occupants Pattern

One real-world booking covers N persons. Documents (offer/contract/billing) live on the booking parent. Occupants are tree children.

AccommodationBooking (parent)

Field Type Notes
accommodation → Accommodation
checkIn date
checkOut date
confirmationNumber input
offerDoc document nullable
contractDoc document nullable
billingDoc document nullable
totalCost numeric (EUR) nullable, for split billing
notes textarea

Tree: /Fairs/{fair}/AccommodationBookings/

AccommodationOccupant (tree child of booking)

Field Type Notes
person → Person
costShare numeric (EUR) nullable, for split billing

Tree: /Fairs/{fair}/AccommodationBookings/{booking}/Occupants/

6e. Travel — Booking + Passengers Pattern

Same pattern as accommodation: one booking covers N travelers. Documents on the parent, passengers as children.

TravelBooking (parent)

Field Type Notes
transportMethod select train / plane / rentalVan / ownCar
origin input
destination input
departureDateTime datetime
arrivalDateTime datetime
returnDepartureDateTime datetime nullable
returnArrivalDateTime datetime nullable
bookingReference input
offerDoc document nullable
contractDoc document nullable
billingDoc document nullable
totalCost numeric (EUR) nullable
notes textarea

Tree: /Fairs/{fair}/Travel/

TravelPassenger (tree child of booking)

Field Type Notes
person → Person
costShare numeric (EUR) nullable

Tree: /Fairs/{fair}/Travel/{booking}/Passengers/


7. Bundle Responsibility Split

Bundle Owns Reuses
rkcFairBundle fair + fairLocation (extended) —
dgmMediaBaseBundle Person —
MessebauBundle Customer, Job, ContactAssignment FC, FairDocument FC, all Job FCs, resource pool entities Person, fair, fairLocation