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.CreateFieldInventoryRequest
import com.korexlabs.dhinspeccion.data.DhRepository import com.korexlabs.dhinspeccion.data.DhRepository
import com.korexlabs.dhinspeccion.data.FieldAssetDetail import com.korexlabs.dhinspeccion.data.FieldAssetDetail
import com.korexlabs.dhinspeccion.data.FieldFindingEvidence
import com.korexlabs.dhinspeccion.data.FieldFindingItem import com.korexlabs.dhinspeccion.data.FieldFindingItem
import com.korexlabs.dhinspeccion.data.FieldFindingOptionsResponse import com.korexlabs.dhinspeccion.data.FieldFindingOptionsResponse
import com.korexlabs.dhinspeccion.data.FieldFindingsRepository import com.korexlabs.dhinspeccion.data.FieldFindingsRepository
@@ -51,6 +52,8 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
private set private set
var lastCreatedFinding: FieldFindingItem? by mutableStateOf(null) var lastCreatedFinding: FieldFindingItem? by mutableStateOf(null)
private set private set
var fieldFindingEvidence: Map<String, List<FieldFindingEvidence>> by mutableStateOf(emptyMap())
private set
init { init {
if (session != null) loadVisits() if (session != null) loadVisits()
@@ -82,8 +85,7 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
inventory = emptyList() inventory = emptyList()
fieldTypes = emptyList() fieldTypes = emptyList()
selectedFieldAsset = null selectedFieldAsset = null
fieldFindingOptions = null clearFindingState()
lastCreatedFinding = null
} }
} }
@@ -98,8 +100,7 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
inventory = emptyList() inventory = emptyList()
fieldTypes = emptyList() fieldTypes = emptyList()
selectedFieldAsset = null selectedFieldAsset = null
fieldFindingOptions = null clearFindingState()
lastCreatedFinding = null
} }
fun closeVisitView() { fun closeVisitView() {
@@ -107,8 +108,7 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
inventory = emptyList() inventory = emptyList()
fieldTypes = emptyList() fieldTypes = emptyList()
selectedFieldAsset = null selectedFieldAsset = null
fieldFindingOptions = null clearFindingState()
lastCreatedFinding = null
loadVisits() loadVisits()
} }
@@ -252,26 +252,76 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
), ),
) )
lastCreatedFinding = response.finding lastCreatedFinding = response.finding
notice = "Hallazgo ${response.finding.code} registrado." notice = "Hallazgo ${response.finding.code} registrado. Podés agregar evidencia fotográfica."
fieldFindingOptions = findingsRepository.options(visitId, assetId) 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() { fun clearFindingFlow() {
fieldFindingOptions = null fieldFindingOptions = null
lastCreatedFinding = null lastCreatedFinding = null
fieldFindingEvidence = emptyMap()
error = null error = null
} }
fun clearSelectedFieldAsset() { fun clearSelectedFieldAsset() {
selectedFieldAsset = null selectedFieldAsset = null
fieldFindingOptions = null clearFindingState()
lastCreatedFinding = null
} }
private suspend fun loadFindingOptionsInternal(visitId: String, assetId: String) { private suspend fun loadFindingOptionsInternal(
fieldFindingOptions = findingsRepository.options(visitId, assetId) 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 lastCreatedFinding = null
fieldFindingEvidence = emptyMap()
} }
private fun launchBusy(block: suspend () -> Unit) { private fun launchBusy(block: suspend () -> Unit) {