F3.2 Android: permitir Actas READY paralelas y delegar cierre al servidor

This commit is contained in:
2026-09-07 16:43:24 -03:00
parent 3e5dfb78a2
commit 2d4e8ae2a7
@@ -148,14 +148,20 @@ fun MobileActsScreen(
} }
} }
val hasOpenAct = model.acts.any { it.status == "DRAFT" || it.status == "READY" } val hasDraftAct = model.acts.any { it.status == "DRAFT" }
if (visit.status == "IN_PROGRESS" && !hasOpenAct) { if (visit.status == "IN_PROGRESS" && !hasDraftAct) {
Card( Card(
Modifier.fillMaxWidth(), Modifier.fillMaxWidth(),
colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.primaryContainer), colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.primaryContainer),
) { ) {
Column(Modifier.padding(12.dp), verticalArrangement = Arrangement.spacedBy(8.dp)) { Column(Modifier.padding(12.dp), verticalArrangement = Arrangement.spacedBy(8.dp)) {
Text("Nueva Acta", fontWeight = FontWeight.Bold) Text("Nueva Acta", fontWeight = FontWeight.Bold)
if (model.acts.any { it.status == "READY" }) {
Text(
"Puede existir una nueva Acta en borrador aunque haya Actas preparadas pendientes de firma de empresa. Sólo se permite un borrador a la vez.",
style = MaterialTheme.typography.bodySmall,
)
}
val selectedInventory = model.selectedFieldAsset?.asset val selectedInventory = model.selectedFieldAsset?.asset
if (selectedInventory == null) { if (selectedInventory == null) {
Text("Primero elegí una Instalación o Subinstalación desde Inventario de campo. Ese registro será el primer elemento del Acta.") Text("Primero elegí una Instalación o Subinstalación desde Inventario de campo. Ese registro será el primer elemento del Acta.")
@@ -361,17 +367,13 @@ fun MobileActsScreen(
if (visit.status == "IN_PROGRESS" && model.acts.isNotEmpty()) { if (visit.status == "IN_PROGRESS" && model.acts.isNotEmpty()) {
HorizontalDivider() HorizontalDivider()
val drafts = model.acts.count { it.status == "DRAFT" } val drafts = model.acts.count { it.status == "DRAFT" }
val readyMissingInspector = model.acts.any { summary ->
if (summary.status != "READY") false
else if (selected?.id == summary.id) {
model.actClosure?.signatures?.none { it.signerType == "INSPECTOR" && it.status == "SIGNED" } ?: true
} else true
}
Text("Finalizar inspección", style = MaterialTheme.typography.titleMedium, fontWeight = FontWeight.Bold) Text("Finalizar inspección", style = MaterialTheme.typography.titleMedium, fontWeight = FontWeight.Bold)
Text("No puede quedar ninguna Acta en borrador. Cada Acta preparada debe tener firma de inspector.") Text(
"No puede quedar ninguna Acta en borrador. Al cerrar, el servidor verifica que cada Acta preparada tenga firma de inspector; si falta alguna, indicará cuál debe completarse.",
)
Button( Button(
onClick = { model.closeInspection() }, onClick = { model.closeInspection() },
enabled = !model.busy && drafts == 0 && !readyMissingInspector, enabled = !model.busy && drafts == 0,
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
) { Text("Cerrar inspección y salir de la empresa") } ) { Text("Cerrar inspección y salir de la empresa") }
} }