F2.4 Android: gestionar evidencias por Hallazgo

This commit is contained in:
2026-09-07 08:49:30 -03:00
parent c4c6dd6c24
commit a2ed3cf091
@@ -10,6 +10,7 @@ import com.korexlabs.dhinspeccion.data.CreateFieldFindingRequest
import com.korexlabs.dhinspeccion.data.CreateFieldInventoryRequest
import com.korexlabs.dhinspeccion.data.DhRepository
import com.korexlabs.dhinspeccion.data.FieldAssetDetail
import com.korexlabs.dhinspeccion.data.FieldFindingEvidence
import com.korexlabs.dhinspeccion.data.FieldFindingItem
import com.korexlabs.dhinspeccion.data.FieldFindingOptionsResponse
import com.korexlabs.dhinspeccion.data.FieldFindingsRepository
@@ -51,6 +52,8 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
private set
var lastCreatedFinding: FieldFindingItem? by mutableStateOf(null)
private set
var fieldFindingEvidence: Map<String, List<FieldFindingEvidence>> by mutableStateOf(emptyMap())
private set
init {
if (session != null) loadVisits()
@@ -82,8 +85,7 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
inventory = emptyList()
fieldTypes = emptyList()
selectedFieldAsset = null
fieldFindingOptions = null
lastCreatedFinding = null
clearFindingState()
}
}
@@ -98,8 +100,7 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
inventory = emptyList()
fieldTypes = emptyList()
selectedFieldAsset = null
fieldFindingOptions = null
lastCreatedFinding = null
clearFindingState()
}
fun closeVisitView() {
@@ -107,8 +108,7 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
inventory = emptyList()
fieldTypes = emptyList()
selectedFieldAsset = null
fieldFindingOptions = null
lastCreatedFinding = null
clearFindingState()
loadVisits()
}
@@ -252,26 +252,76 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
),
)
lastCreatedFinding = response.finding
notice = "Hallazgo ${response.finding.code} registrado."
fieldFindingOptions = findingsRepository.options(visitId, assetId)
notice = "Hallazgo ${response.finding.code} registrado. Podés agregar evidencia fotográfica."
loadFindingOptionsInternal(visitId, assetId, keepLastCreated = true)
}
}
fun uploadFindingPhoto(
findingId: String,
file: File,
latitude: Double,
longitude: Double,
accuracyM: Double?,
title: String? = null,
description: String? = null,
) {
launchBusy {
findingsRepository.uploadObservationPhoto(
findingId = findingId,
file = file,
latitude = latitude,
longitude = longitude,
accuracyM = accuracyM,
title = title,
description = description,
)
loadEvidenceInternal(findingId)
notice = "Evidencia fotográfica registrada con GPS."
}
}
fun reloadFindingEvidence(findingId: String) {
launchBusy { loadEvidenceInternal(findingId) }
}
fun clearFindingFlow() {
fieldFindingOptions = null
lastCreatedFinding = null
fieldFindingEvidence = emptyMap()
error = null
}
fun clearSelectedFieldAsset() {
selectedFieldAsset = null
fieldFindingOptions = null
lastCreatedFinding = null
clearFindingState()
}
private suspend fun loadFindingOptionsInternal(visitId: String, assetId: String) {
fieldFindingOptions = findingsRepository.options(visitId, assetId)
private suspend fun loadFindingOptionsInternal(
visitId: String,
assetId: String,
keepLastCreated: Boolean = false,
) {
val options = findingsRepository.options(visitId, assetId)
fieldFindingOptions = options
if (!keepLastCreated) lastCreatedFinding = null
val loaded = linkedMapOf<String, List<FieldFindingEvidence>>()
for (finding in options.findings) {
loaded[finding.id] = findingsRepository.evidence(finding.id).data
}
fieldFindingEvidence = loaded
}
private suspend fun loadEvidenceInternal(findingId: String) {
fieldFindingEvidence = fieldFindingEvidence + (
findingId to findingsRepository.evidence(findingId).data
)
}
private fun clearFindingState() {
fieldFindingOptions = null
lastCreatedFinding = null
fieldFindingEvidence = emptyMap()
}
private fun launchBusy(block: suspend () -> Unit) {