From 958a4d134db7ea5c30443bf2b90a4f2adc4cb179 Mon Sep 17 00:00:00 2001 From: enlineawork Date: Mon, 7 Sep 2026 08:29:52 -0300 Subject: [PATCH] F2.3 Android: integrar flujo de Hallazgos al ViewModel --- .../korexlabs/dhinspeccion/MainViewModel.kt | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/android-app/app/src/main/java/com/korexlabs/dhinspeccion/MainViewModel.kt b/android-app/app/src/main/java/com/korexlabs/dhinspeccion/MainViewModel.kt index b65f958..d210325 100644 --- a/android-app/app/src/main/java/com/korexlabs/dhinspeccion/MainViewModel.kt +++ b/android-app/app/src/main/java/com/korexlabs/dhinspeccion/MainViewModel.kt @@ -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) {