F2.3 Android: integrar flujo de Hallazgos al ViewModel
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user