Phase 1 of the messaging rework: one conversation/thread model (Inquiry) is the single source of truth, read perspectivally by both sides. - domain/inquiry: add kind (INQUIRY|OFFER), tenantOrgId (demand org), offeredPropertyIds - provider/service: InquiryFilters gains tenantOrgId+kind; new createInquiry (demand→supply) & createOffer (supply→demand) materialize threads; addMessage bumps unread; reply carries senderType (tenant vs supply_user) - hooks: useCreateInquiry, useCreateOffer; reply payload carries sender perspective - demand: InquiryQuickDialog → createInquiry via provider (session-based tenant/org, no hardcode); Anfragen.tsx reads via React Query (tenantOrgId) with Gesendet/Erhalten tabs, replies via provider, shows offered properties for OFFER threads; inquiryStore reduced to dialog-only (removes Zustand server-data island) - supply: OfferChatComposer send now materializes an OFFER conversation into the seeker's inbox (routed via latentNeed.tenantOrgId); Anfragencenter gains a "Gesendet" tab; ActiveInquiriesTab filters by perspective (org + kind) - seed: merge demand inquiries with tenantOrgId=org-mobimo + 2 OFFER seeds; provider seeds from both sets Closes the loop: a sent inquiry reaches the Verwaltung and a sent offer reaches the Nachfrager — both answerable in one thread. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
22 lines
638 B
TypeScript
22 lines
638 B
TypeScript
import type { AssetType } from './enums'
|
|
import type { WeightedPreference } from './need'
|
|
|
|
export interface LatentNeed {
|
|
id: string
|
|
title: string
|
|
tenantCompany?: string
|
|
/** Nachfrager-Organisation — Empfänger eines Angebots (Demo-Default-Routing: org-mobimo). */
|
|
tenantOrgId?: string
|
|
assetType: AssetType
|
|
desiredLocation: string
|
|
sizeRange: { min: number; max: number }
|
|
budgetRange?: { min?: number; max?: number }
|
|
timing: string
|
|
mustHaveCriteria: string[]
|
|
weightedPreferences: WeightedPreference[]
|
|
aiSummary?: string
|
|
publicVisibility: boolean
|
|
status: 'public' | 'paused' | 'expired'
|
|
createdAt: string
|
|
}
|