feat: Anfragencenter Parts A–E — read/unread, prep wizard, offer flow, report preview
- Part A: Replace InquiryStatus badges with WhatsApp-style unread indicators (isRead, unreadCount, lastReadAt on Inquiry; markThreadAsRead in service + hook) - Part B: RelatedPropertyCardPanel — reposition "Objekt ansehen", add "Weitere Matches" section via matchService.getAdditionalMatchesForInquiry - Part C: PreparationWizard 4-step dialog — property selection, report generation progress, field editing + ReportObjectFieldSelector, PDF preview + finalize - Part D: OfferCreationWizard 4-step dialog triggered from first tenant message — data capture, field editing, viewing appointments, PDF generation + attach to reply - Part E: LatentInquiryReportPreview (2-page A4 doc), ReportObjectFieldSelector (5 accordion groups, 35+ optional fields), mapImageUrl on Property domain Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,9 @@
|
||||
export interface AdditionalPropertyMatch {
|
||||
propertyId: string
|
||||
title: string
|
||||
location: string
|
||||
areaSqm: number
|
||||
rentPricePerSqm: number
|
||||
matchScore: number
|
||||
imageUrl?: string
|
||||
}
|
||||
@@ -30,7 +30,10 @@ export interface Inquiry {
|
||||
tenantEmail?: string
|
||||
subject: string
|
||||
message: string
|
||||
status: InquiryStatus
|
||||
status?: InquiryStatus
|
||||
unreadCount: number
|
||||
isRead: boolean
|
||||
lastReadAt?: string
|
||||
matchScore?: number
|
||||
createdAt: string
|
||||
updatedAt: string
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
export type ReportObjectFieldKey =
|
||||
| 'title' | 'location' | 'areaSqm' | 'rentPricePerSqm' | 'availabilityDate'
|
||||
| 'leaseTerm' | 'breakoutOption' | 'currentTenant' | 'propertyNumber'
|
||||
| 'assetType' | 'floor' | 'parking' | 'publicTransportScore'
|
||||
| 'ceilingHeightM' | 'loadingDocksCount' | 'powerSupplyKva'
|
||||
| 'hasServerRoom' | 'isBarrierFree' | 'fitOut'
|
||||
| 'prestigeScore' | 'visibilityScore' | 'footfallScore' | 'commuterAccessScore'
|
||||
| 'talentAccessScore' | 'esgScore' | 'flexibilityScore'
|
||||
| 'expansionPotentialScore' | 'taxEnvironmentScore'
|
||||
| 'description' | 'images' | 'mapImageUrl' | 'units'
|
||||
| 'softFactors' | 'dataQuality'
|
||||
|
||||
export interface ReportObjectFieldSelection {
|
||||
propertyId: string
|
||||
mandatoryFields: ReportObjectFieldKey[]
|
||||
selectedOptionalFields: ReportObjectFieldKey[]
|
||||
}
|
||||
|
||||
export interface ReportEditableField {
|
||||
id: string
|
||||
label: string
|
||||
value: string
|
||||
fieldType: 'text' | 'textarea'
|
||||
}
|
||||
|
||||
export interface InquiryPreparationReportDraft {
|
||||
id: string
|
||||
inquiryId: string
|
||||
selectedPropertyIds: string[]
|
||||
fieldSelections: ReportObjectFieldSelection[]
|
||||
marketSignalPropertyId?: string
|
||||
editableFields: ReportEditableField[]
|
||||
status: 'draft' | 'finalized'
|
||||
pdfUrl?: string
|
||||
createdAt: string
|
||||
updatedAt: string
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
export interface ViewingAppointmentOption {
|
||||
id: string
|
||||
date: string
|
||||
timeSlot: string
|
||||
contactPerson?: string
|
||||
}
|
||||
|
||||
export interface OfferEditableField {
|
||||
id: string
|
||||
label: string
|
||||
value: string
|
||||
fieldType: 'text' | 'textarea'
|
||||
}
|
||||
|
||||
export interface OfferReportDraft {
|
||||
id: string
|
||||
inquiryId: string
|
||||
propertyId: string
|
||||
editableFields: OfferEditableField[]
|
||||
viewingAppointments: ViewingAppointmentOption[]
|
||||
status: 'draft' | 'finalized'
|
||||
pdfUrl?: string
|
||||
createdAt: string
|
||||
updatedAt: string
|
||||
}
|
||||
@@ -145,6 +145,7 @@ export interface Property {
|
||||
|
||||
propertyNumber?: string
|
||||
units?: PropertyUnit[]
|
||||
mapImageUrl?: string
|
||||
|
||||
leaseTerm?: string
|
||||
leaseStartDate?: string
|
||||
|
||||
Reference in New Issue
Block a user