P0: IDataManager coverage gaps — contractorDetail/documentDetail/taskCompletions/contractorsByResidence

Adds 4 new StateFlow members to IDataManager + DataManager + InMemoryDataManager + FixtureDataManager:
- contractorDetail: Map<Int, Contractor> — cached detail fetches
- documentDetail: Map<Int, Document>
- taskCompletions: Map<Int, List<TaskCompletionResponse>>
- contractorsByResidence: Map<Int, List<ContractorSummary>>

APILayer now writes to these on successful detail/per-residence fetches:
- getTaskCompletions -> setTaskCompletions
- getDocument -> setDocumentDetail
- getContractor -> setContractorDetail
- getContractorsByResidence -> setContractorsForResidence

Fixture populated() seeds contractorDetail + contractorsByResidence.
Populated taskCompletions is empty (Fixtures doesn't define any completions yet).

Foundation for P1 — VMs can now derive every read-state from DataManager
reactively instead of owning independent MutableStateFlow fields.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Trey T
2026-04-19 18:31:06 -05:00
parent f83e89bee3
commit 2230cde071
55 changed files with 69 additions and 1 deletions

View File

@@ -82,7 +82,13 @@ object FixtureDataManager {
},
documents = Fixtures.documents,
documentsByResidence = Fixtures.documentsByResidence,
documentDetail = Fixtures.documents.associateBy { it.id ?: 0 }.filterKeys { it != 0 },
contractors = Fixtures.contractorSummaries,
contractorsByResidence = Fixtures.residences.associate { r ->
r.id to Fixtures.contractorSummaries.filter { it.residenceId == r.id }
},
contractorDetail = Fixtures.contractors.associateBy { it.id },
taskCompletions = emptyMap(), // Fixtures doesn't define task completions; leave empty
subscription = Fixtures.premiumSubscription,
upgradeTriggers = emptyMap(),
featureBenefits = Fixtures.featureBenefits,