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.compose.runtime.setValue
|
||||||
import androidx.lifecycle.AndroidViewModel
|
import androidx.lifecycle.AndroidViewModel
|
||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
|
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.FieldFindingItem
|
||||||
|
import com.korexlabs.dhinspeccion.data.FieldFindingOptionsResponse
|
||||||
|
import com.korexlabs.dhinspeccion.data.FieldFindingsRepository
|
||||||
import com.korexlabs.dhinspeccion.data.FieldInventoryItem
|
import com.korexlabs.dhinspeccion.data.FieldInventoryItem
|
||||||
import com.korexlabs.dhinspeccion.data.FieldType
|
import com.korexlabs.dhinspeccion.data.FieldType
|
||||||
import com.korexlabs.dhinspeccion.data.StoredSession
|
import com.korexlabs.dhinspeccion.data.StoredSession
|
||||||
@@ -20,6 +24,7 @@ import java.time.Instant
|
|||||||
|
|
||||||
class MainViewModel(application: Application) : AndroidViewModel(application) {
|
class MainViewModel(application: Application) : AndroidViewModel(application) {
|
||||||
private val repository = DhRepository(application)
|
private val repository = DhRepository(application)
|
||||||
|
private val findingsRepository = FieldFindingsRepository(application)
|
||||||
|
|
||||||
var session: StoredSession? by mutableStateOf(repository.currentSession())
|
var session: StoredSession? by mutableStateOf(repository.currentSession())
|
||||||
private set
|
private set
|
||||||
@@ -42,6 +47,11 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
|
|||||||
var selectedFieldAsset: FieldAssetDetail? by mutableStateOf(null)
|
var selectedFieldAsset: FieldAssetDetail? by mutableStateOf(null)
|
||||||
private set
|
private set
|
||||||
|
|
||||||
|
var fieldFindingOptions: FieldFindingOptionsResponse? by mutableStateOf(null)
|
||||||
|
private set
|
||||||
|
var lastCreatedFinding: FieldFindingItem? by mutableStateOf(null)
|
||||||
|
private set
|
||||||
|
|
||||||
init {
|
init {
|
||||||
if (session != null) loadVisits()
|
if (session != null) loadVisits()
|
||||||
}
|
}
|
||||||
@@ -72,6 +82,8 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
|
|||||||
inventory = emptyList()
|
inventory = emptyList()
|
||||||
fieldTypes = emptyList()
|
fieldTypes = emptyList()
|
||||||
selectedFieldAsset = null
|
selectedFieldAsset = null
|
||||||
|
fieldFindingOptions = null
|
||||||
|
lastCreatedFinding = null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -86,6 +98,8 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
|
|||||||
inventory = emptyList()
|
inventory = emptyList()
|
||||||
fieldTypes = emptyList()
|
fieldTypes = emptyList()
|
||||||
selectedFieldAsset = null
|
selectedFieldAsset = null
|
||||||
|
fieldFindingOptions = null
|
||||||
|
lastCreatedFinding = null
|
||||||
}
|
}
|
||||||
|
|
||||||
fun closeVisitView() {
|
fun closeVisitView() {
|
||||||
@@ -93,6 +107,8 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
|
|||||||
inventory = emptyList()
|
inventory = emptyList()
|
||||||
fieldTypes = emptyList()
|
fieldTypes = emptyList()
|
||||||
selectedFieldAsset = null
|
selectedFieldAsset = null
|
||||||
|
fieldFindingOptions = null
|
||||||
|
lastCreatedFinding = null
|
||||||
loadVisits()
|
loadVisits()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -125,6 +141,9 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
|
|||||||
selectedFieldAsset = repository.selectFieldAsset(visitId, item.id)
|
selectedFieldAsset = repository.selectFieldAsset(visitId, item.id)
|
||||||
notice = "Inventario agregado a la inspección."
|
notice = "Inventario agregado a la inspección."
|
||||||
inventory = repository.fieldInventory(visitId, null, null).data
|
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."
|
"Fotografía registrada."
|
||||||
}
|
}
|
||||||
inventory = repository.fieldInventory(visitId, null, null).data
|
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() {
|
fun clearSelectedFieldAsset() {
|
||||||
selectedFieldAsset = null
|
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) {
|
private fun launchBusy(block: suspend () -> Unit) {
|
||||||
|
|||||||
Reference in New Issue
Block a user