F2.3 Android: integrar flujo de Hallazgos al ViewModel

This commit is contained in:
2026-09-07 08:29:52 -03:00
parent e7dd2a7284
commit 958a4d134d
@@ -6,9 +6,13 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.viewModelScope
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.FieldFindingItem
import com.korexlabs.dhinspeccion.data.FieldFindingOptionsResponse
import com.korexlabs.dhinspeccion.data.FieldFindingsRepository
import com.korexlabs.dhinspeccion.data.FieldInventoryItem
import com.korexlabs.dhinspeccion.data.FieldType
import com.korexlabs.dhinspeccion.data.StoredSession
@@ -20,6 +24,7 @@ import java.time.Instant
class MainViewModel(application: Application) : AndroidViewModel(application) {
private val repository = DhRepository(application)
private val findingsRepository = FieldFindingsRepository(application)
var session: StoredSession? by mutableStateOf(repository.currentSession())
private set
@@ -42,6 +47,11 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
var selectedFieldAsset: FieldAssetDetail? by mutableStateOf(null)
private set
var fieldFindingOptions: FieldFindingOptionsResponse? by mutableStateOf(null)
private set
var lastCreatedFinding: FieldFindingItem? by mutableStateOf(null)
private set
init {
if (session != null) loadVisits()
}
@@ -72,6 +82,8 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
inventory = emptyList()
fieldTypes = emptyList()
selectedFieldAsset = null
fieldFindingOptions = null
lastCreatedFinding = null
}
}
@@ -86,6 +98,8 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
inventory = emptyList()
fieldTypes = emptyList()
selectedFieldAsset = null
fieldFindingOptions = null
lastCreatedFinding = null
}
fun closeVisitView() {
@@ -93,6 +107,8 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
inventory = emptyList()
fieldTypes = emptyList()
selectedFieldAsset = null
fieldFindingOptions = null
lastCreatedFinding = null
loadVisits()
}
@@ -125,6 +141,9 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
selectedFieldAsset = repository.selectFieldAsset(visitId, item.id)
notice = "Inventario agregado a la inspección."
inventory = repository.fieldInventory(visitId, null, null).data
if (selectedFieldAsset?.capture?.readyForFinding == true) {
loadFindingOptionsInternal(visitId, item.id)
}
}
}
@@ -185,11 +204,74 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
"Fotografía registrada."
}
inventory = repository.fieldInventory(visitId, null, null).data
if (response.capture.readyForFinding) {
loadFindingOptionsInternal(visitId, asset.id)
}
}
}
fun openFindingForSelected() {
val visitId = visit?.id ?: return
val assetId = selectedFieldAsset?.asset?.id ?: return
launchBusy { loadFindingOptionsInternal(visitId, assetId) }
}
fun createFieldFinding(
catalogItemId: String?,
customTitle: String?,
customLegalBasis: String?,
description: String,
severity: Int?,
correctionDueOn: String?,
) {
val visitId = visit?.id ?: return
val assetId = selectedFieldAsset?.asset?.id ?: return
if (description.isBlank()) {
error = "Describí el Hallazgo antes de guardarlo."
return
}
if (catalogItemId == null && customTitle.isNullOrBlank()) {
error = "Para OTROS, indicá un título para el Hallazgo."
return
}
if (severity != null && severity !in 1..10) {
error = "La gravedad debe estar entre 1 y 10."
return
}
launchBusy {
val response = findingsRepository.create(
visitId,
assetId,
CreateFieldFindingRequest(
catalogItemId = catalogItemId,
customTitle = customTitle?.trim()?.takeIf { it.isNotBlank() },
customLegalBasis = customLegalBasis?.trim()?.takeIf { it.isNotBlank() },
description = description.trim(),
severity = severity,
correctionDueOn = correctionDueOn?.trim()?.takeIf { it.isNotBlank() },
),
)
lastCreatedFinding = response.finding
notice = "Hallazgo ${response.finding.code} registrado."
fieldFindingOptions = findingsRepository.options(visitId, assetId)
}
}
fun clearFindingFlow() {
fieldFindingOptions = null
lastCreatedFinding = null
error = null
}
fun clearSelectedFieldAsset() {
selectedFieldAsset = null
fieldFindingOptions = null
lastCreatedFinding = null
}
private suspend fun loadFindingOptionsInternal(visitId: String, assetId: String) {
fieldFindingOptions = findingsRepository.options(visitId, assetId)
lastCreatedFinding = null
}
private fun launchBusy(block: suspend () -> Unit) {