F4 Android: align ViewModel with urgency lock and seal

This commit is contained in:
2026-09-07 21:33:53 -03:00
parent eeb35da02c
commit ef084dd899
@@ -151,11 +151,15 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
} }
} }
fun createActForSelectedInventory() { fun createActForSelectedInventory(urgency: String = "NON_URGENT") {
val currentVisit = visit ?: return val currentVisit = visit ?: return
val asset = selectedFieldAsset?.asset val asset = selectedFieldAsset?.asset
if (currentVisit.status != "IN_PROGRESS") { if (currentVisit.status != "IN_PROGRESS") {
error = "La inspección debe estar en curso para crear un Acta." error = "La Inspección debe estar en curso para crear un Acta."
return
}
if (urgency !in setOf("URGENT", "NON_URGENT")) {
error = "Elegí si el Acta es urgente o no urgente."
return return
} }
if (asset == null) { if (asset == null) {
@@ -163,15 +167,21 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
return return
} }
if (acts.any { it.status == "DRAFT" }) { if (acts.any { it.status == "DRAFT" }) {
error = "Ya existe un Acta en borrador. Cerrala o cancelala antes de crear la siguiente." error = "Ya existe un Acta en borrador. Bloqueala o cancelala antes de crear la siguiente."
return return
} }
launchBusy { launchBusy {
val created = actsRepository.create(currentVisit.id, asset.id, currentVisit.code) val created = actsRepository.create(
currentVisit.id,
asset.id,
currentVisit.code,
urgency,
)
selectedAct = created selectedAct = created
actClosure = actsRepository.closure(created.id) actClosure = actsRepository.closure(created.id)
loadActsInternal(currentVisit.id, selectDraft = false) loadActsInternal(currentVisit.id, selectDraft = false)
notice = "${created.code} creada. Los Hallazgos nuevos quedarán vinculados explícitamente a esta Acta." val urgencyLabel = if (urgency == "URGENT") "urgente" else "no urgente"
notice = "${created.code} creada como $urgencyLabel. Los Hallazgos nuevos quedarán vinculados explícitamente a esta Acta."
if (selectedFieldAsset?.capture?.readyForFinding == true) { if (selectedFieldAsset?.capture?.readyForFinding == true) {
loadFindingOptionsInternal(currentVisit.id, asset.id, created.id) loadFindingOptionsInternal(currentVisit.id, asset.id, created.id)
} }
@@ -196,7 +206,7 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
val visitId = visit?.id ?: return val visitId = visit?.id ?: return
launchBusy { launchBusy {
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
val draft = selectedDraftAct() val draft = selectedDraftAct()
if (selectedFieldAsset?.capture?.readyForFinding == true && draft != null) { if (selectedFieldAsset?.capture?.readyForFinding == true && draft != null) {
@@ -222,7 +232,7 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
) { ) {
val visitId = visit?.id ?: return val visitId = visit?.id ?: return
if (visit?.status != "IN_PROGRESS") { if (visit?.status != "IN_PROGRESS") {
error = "La inspección debe estar en curso para dar de alta Inventario." error = "La Inspección debe estar en curso para dar de alta Inventario."
return return
} }
if (type.familyRequired && familyId == null) { if (type.familyRequired && familyId == null) {
@@ -449,26 +459,21 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
absenceReason = reason.trim(), absenceReason = reason.trim(),
), ),
) )
notice = "Ausencia del responsable registrada." notice = "Ausencia del responsable registrada. La manifestación de empresa quedará pendiente y deberá resolverse antes de sellar el Acta."
} }
} }
fun prepareSelectedAct() { fun prepareSelectedAct() {
val actId = selectedAct?.id ?: return val actId = selectedAct?.id ?: return
launchBusy { launchBusy {
actClosure = actsRepository.prepare(actId) actClosure = actsRepository.lock(actId)
refreshSelectedActInternal(actId) refreshSelectedActInternal(actId)
notice = "Acta preparada. Su contenido quedó congelado para las firmas." notice = "Acta bloqueada. Su contenido quedó inmutable; ahora deben resolverse las firmas y manifestaciones."
} }
} }
fun reopenSelectedAct() { fun reopenSelectedAct() {
val actId = selectedAct?.id ?: return error = "Un Acta bloqueada es inmutable y no puede volver a borrador."
launchBusy {
actClosure = actsRepository.reopen(actId)
refreshSelectedActInternal(actId)
notice = "Acta reabierta. Podés corregirla antes de volver a preparar."
}
} }
fun signSelectedActAsInspector( fun signSelectedActAsInspector(
@@ -507,13 +512,17 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
fun recordCompanyOutcome(status: String, reason: String) { fun recordCompanyOutcome(status: String, reason: String) {
val actId = selectedAct?.id ?: return val actId = selectedAct?.id ?: return
if (status != "REFUSED") {
error = "La ausencia no resuelve la manifestación de la empresa. Registrá una firma o una negativa."
return
}
if (reason.trim().length < 10) { if (reason.trim().length < 10) {
error = "Indicá un motivo de al menos 10 caracteres." error = "Indicá un motivo de al menos 10 caracteres."
return return
} }
launchBusy { launchBusy {
actClosure = actsRepository.companyOutcome(actId, status, reason) actClosure = actsRepository.companyOutcome(actId, status, reason)
notice = if (status == "ABSENT") "Ausencia de empresa asentada." else "Negativa a firmar asentada." notice = "Negativa a firmar asentada."
} }
} }
@@ -521,11 +530,11 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
val currentVisit = visit ?: return val currentVisit = visit ?: return
val actId = selectedAct?.id ?: return val actId = selectedAct?.id ?: return
launchBusy { launchBusy {
actClosure = actsRepository.closeAct(actId) actClosure = actsRepository.seal(actId)
refreshSelectedActInternal(actId) refreshSelectedActInternal(actId)
loadActsInternal(currentVisit.id, selectDraft = false) loadActsInternal(currentVisit.id, selectDraft = false)
clearFindingState() clearFindingState()
notice = "${selectedAct?.code ?: "Acta"} cerrada e inmutable. Podés crear otra Acta o finalizar la inspección." notice = "${selectedAct?.code ?: "Acta"} SELLADA e inmutable. Podés crear otra Acta o continuar hacia el cierre de la Inspección."
} }
} }
@@ -534,7 +543,7 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
launchBusy { launchBusy {
visit = actsRepository.closeVisit(visitId) visit = actsRepository.closeVisit(visitId)
loadVisitsInternal() loadVisitsInternal()
notice = "Inspección cerrada. Las Actas y documentos quedan disponibles para oficina." notice = "Inspección cerrada. Todas sus Actas quedaron SELLADAS y disponibles para el circuito de oficina."
} }
} }