feat(messages): unified conversation inbox — connect demand ↔ supply, offers reach the seeker
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>
This commit is contained in:
@@ -5,6 +5,8 @@ export const mockDemandInquiries: Inquiry[] = [
|
||||
{
|
||||
id: 'dinq-001',
|
||||
organizationId: 'org-wincasa',
|
||||
tenantOrgId: 'org-mobimo',
|
||||
kind: 'INQUIRY',
|
||||
propertyId: 'prop-technopark',
|
||||
tenantName: 'Admin User',
|
||||
tenantCompany: 'Mobimo Management AG',
|
||||
@@ -39,6 +41,8 @@ export const mockDemandInquiries: Inquiry[] = [
|
||||
{
|
||||
id: 'dinq-002',
|
||||
organizationId: 'org-wincasa',
|
||||
tenantOrgId: 'org-mobimo',
|
||||
kind: 'INQUIRY',
|
||||
propertyId: 'prop-hardturmpark',
|
||||
tenantName: 'Admin User',
|
||||
tenantCompany: 'Mobimo Management AG',
|
||||
@@ -73,6 +77,8 @@ export const mockDemandInquiries: Inquiry[] = [
|
||||
{
|
||||
id: 'dinq-003',
|
||||
organizationId: 'org-wincasa',
|
||||
tenantOrgId: 'org-mobimo',
|
||||
kind: 'INQUIRY',
|
||||
propertyId: 'prop-sihlcity',
|
||||
tenantName: 'Admin User',
|
||||
tenantCompany: 'Mobimo Management AG',
|
||||
@@ -130,6 +136,8 @@ export const mockDemandInquiries: Inquiry[] = [
|
||||
{
|
||||
id: 'dinq-004',
|
||||
organizationId: 'org-wincasa',
|
||||
tenantOrgId: 'org-mobimo',
|
||||
kind: 'INQUIRY',
|
||||
propertyId: 'prop-bahnhofzug',
|
||||
tenantName: 'Admin User',
|
||||
tenantCompany: 'Mobimo Management AG',
|
||||
@@ -186,6 +194,8 @@ export const mockDemandInquiries: Inquiry[] = [
|
||||
{
|
||||
id: 'dinq-005',
|
||||
organizationId: 'org-wincasa',
|
||||
tenantOrgId: 'org-mobimo',
|
||||
kind: 'INQUIRY',
|
||||
propertyId: 'prop-dreispitz',
|
||||
tenantName: 'Admin User',
|
||||
tenantCompany: 'Mobimo Management AG',
|
||||
@@ -238,4 +248,40 @@ export const mockDemandInquiries: Inquiry[] = [
|
||||
},
|
||||
],
|
||||
},
|
||||
|
||||
// 6 — OFFER (Verwaltung → Nachfrager, proaktiv aus Latente Anfragen)
|
||||
{
|
||||
id: 'off-seed-001',
|
||||
organizationId: 'org-wincasa',
|
||||
tenantOrgId: 'org-mobimo',
|
||||
kind: 'OFFER',
|
||||
propertyId: 'prop-001',
|
||||
offeredPropertyIds: ['prop-001', 'prop-093'],
|
||||
tenantName: 'Mobimo Management AG',
|
||||
propertyManagerCompany: 'Wincasa AG',
|
||||
propertyAddress: '2 Objekte im Angebot',
|
||||
subject: 'Passende Büroflächen zu Ihrem Bedarf',
|
||||
message:
|
||||
'Sehr geehrte Damen und Herren,\n\nbasierend auf Ihrem Suchprofil haben wir zwei passende Büroflächen für Sie zusammengestellt. Details finden Sie im beigefügten Angebot.\n\nFreundliche Grüsse\nWincasa AG',
|
||||
status: 'new',
|
||||
unreadCount: 1,
|
||||
isRead: false,
|
||||
createdAt: '2026-05-24T10:00:00Z',
|
||||
updatedAt: '2026-05-24T10:00:00Z',
|
||||
thread: [
|
||||
{
|
||||
id: 'off-seed-001-1',
|
||||
inquiryId: 'off-seed-001',
|
||||
senderType: 'supply_user',
|
||||
senderName: 'Wincasa AG',
|
||||
subject: 'Passende Büroflächen zu Ihrem Bedarf',
|
||||
body:
|
||||
'Sehr geehrte Damen und Herren,\n\nbasierend auf Ihrem Suchprofil haben wir zwei passende Büroflächen für Sie zusammengestellt. Details finden Sie im beigefügten Angebot.\n\nFreundliche Grüsse\nWincasa AG',
|
||||
attachments: [
|
||||
{ id: 'off-att-001', fileName: 'Angebot_Bueroflaechen_Zuerich.pdf', fileType: 'application/pdf', fileSize: 312500, generated: true },
|
||||
],
|
||||
createdAt: '2026-05-24T10:00:00Z',
|
||||
},
|
||||
],
|
||||
},
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user