Renombrar la gestion de asignaciones por Listado SAI - Persona

This commit is contained in:
2026-08-03 09:15:49 +02:00
parent eb8cc806c1
commit 37b6cb1695
7 changed files with 54 additions and 18 deletions
@@ -11,7 +11,7 @@ class AssignmentRepository {
val connection = MariaDbConnection.getConnection() ?: return@withContext Result.failure(Exception("db_connection_error"))
try {
val sql = """
SELECT a.id_asignacion, a.id_sai, a.id_persona, a.fecha_asignado, a.fecha_devolucion,
SELECT a.id_asignacion, a.id_sai, a.id_persona, a.fecha_asignado, a.fecha_devolucion, a.observaciones,
s.ns as sai_ns, p.nombre as person_name
FROM Asignado a
LEFT JOIN SAIs s ON a.id_sai = s.id_sai
@@ -27,6 +27,7 @@ class AssignmentRepository {
idPersona = resultSet.getInt("id_persona"),
assignedDate = resultSet.getString("fecha_asignado"),
returnDate = resultSet.getString("fecha_devolucion"),
observations = resultSet.getString("observaciones"),
saiNs = resultSet.getString("sai_ns"),
personName = resultSet.getString("person_name")
))
@@ -42,7 +43,7 @@ class AssignmentRepository {
suspend fun getById(id: Int): Result<Assignment> = withContext(Dispatchers.IO) {
val connection = MariaDbConnection.getConnection() ?: return@withContext Result.failure(Exception("db_connection_error"))
try {
val sql = "SELECT id_asignacion, id_sai, id_persona, fecha_asignado, fecha_devolucion FROM Asignado WHERE id_asignacion = ?"
val sql = "SELECT id_asignacion, id_sai, id_persona, fecha_asignado, fecha_devolucion, observaciones FROM Asignado WHERE id_asignacion = ?"
val statement = connection.prepareStatement(sql)
statement.setInt(1, id)
val resultSet = statement.executeQuery()
@@ -52,7 +53,8 @@ class AssignmentRepository {
idSai = resultSet.getInt("id_sai"),
idPersona = resultSet.getInt("id_persona"),
assignedDate = resultSet.getString("fecha_asignado"),
returnDate = resultSet.getString("fecha_devolucion")
returnDate = resultSet.getString("fecha_devolucion"),
observations = resultSet.getString("observaciones")
))
} else {
Result.failure(Exception("not_found"))
@@ -67,12 +69,13 @@ class AssignmentRepository {
suspend fun insert(item: Assignment): Result<Unit> = withContext(Dispatchers.IO) {
val connection = MariaDbConnection.getConnection() ?: return@withContext Result.failure(Exception("db_connection_error"))
try {
val sql = "INSERT INTO Asignado (id_sai, id_persona, fecha_asignado, fecha_devolucion) VALUES (?, ?, ?, ?)"
val sql = "INSERT INTO Asignado (id_sai, id_persona, fecha_asignado, fecha_devolucion, observaciones) VALUES (?, ?, ?, ?, ?)"
val statement = connection.prepareStatement(sql)
statement.setInt(1, item.idSai)
statement.setInt(2, item.idPersona)
statement.setString(3, item.assignedDate)
statement.setString(4, item.returnDate)
statement.setString(5, item.observations)
if (statement.executeUpdate() > 0) Result.success(Unit)
else Result.failure(Exception("no_rows_inserted"))
@@ -86,13 +89,14 @@ class AssignmentRepository {
suspend fun update(item: Assignment): Result<Unit> = withContext(Dispatchers.IO) {
val connection = MariaDbConnection.getConnection() ?: return@withContext Result.failure(Exception("db_connection_error"))
try {
val sql = "UPDATE Asignado SET id_sai = ?, id_persona = ?, fecha_asignado = ?, fecha_devolucion = ? WHERE id_asignacion = ?"
val sql = "UPDATE Asignado SET id_sai = ?, id_persona = ?, fecha_asignado = ?, fecha_devolucion = ?, observaciones = ? WHERE id_asignacion = ?"
val statement = connection.prepareStatement(sql)
statement.setInt(1, item.idSai)
statement.setInt(2, item.idPersona)
statement.setString(3, item.assignedDate)
statement.setString(4, item.returnDate)
statement.setInt(5, item.id)
statement.setString(5, item.observations)
statement.setInt(6, item.id)
if (statement.executeUpdate() > 0) Result.success(Unit)
else Result.failure(Exception("update_failed"))
@@ -6,6 +6,7 @@ data class Assignment(
val idPersona: Int,
val assignedDate: String? = null,
val returnDate: String? = null,
val observations: String? = null,
// Optional display fields for joining data
val saiNs: String? = null,
val personName: String? = null
@@ -43,6 +43,7 @@ fun AddAssignmentScreen(
var assignedDateDb by remember { mutableStateOf("") }
var returnDateDisplay by remember { mutableStateOf("") }
var returnDateDb by remember { mutableStateOf("") }
var observations by remember { mutableStateOf("") }
var sais by remember { mutableStateOf<List<Sai>>(emptyList()) }
var people by remember { mutableStateOf<List<Person>>(emptyList()) }
@@ -118,7 +119,7 @@ fun AddAssignmentScreen(
Scaffold(
topBar = {
TopAppBar(
title = { Text("Añadir Asignación") },
title = { Text("Añadir SAI - Persona") },
navigationIcon = {
IconButton(onClick = onNavigateBack) {
Icon(Icons.Default.ArrowBack, contentDescription = "Atrás")
@@ -233,6 +234,16 @@ fun AddAssignmentScreen(
modifier = Modifier.fillMaxWidth().clickable { showReturnDatePicker = true }
)
Spacer(modifier = Modifier.height(16.dp))
OutlinedTextField(
value = observations,
onValueChange = { observations = it },
label = { Text(stringResource(R.string.label_observations)) },
modifier = Modifier.fillMaxWidth(),
minLines = 3
)
Spacer(modifier = Modifier.height(32.dp))
Button(
@@ -245,10 +256,11 @@ fun AddAssignmentScreen(
idSai = selectedSaiId!!,
idPersona = selectedPersonId!!,
assignedDate = assignedDateDb.takeIf { it.isNotBlank() },
returnDate = returnDateDb.takeIf { it.isNotBlank() }
returnDate = returnDateDb.takeIf { it.isNotBlank() },
observations = observations.takeIf { it.isNotBlank() }
)
).onSuccess {
Toast.makeText(context, "Asignación guardada", Toast.LENGTH_SHORT).show()
Toast.makeText(context, "Asignación SAI - Persona guardada", Toast.LENGTH_SHORT).show()
onNavigateBack()
}.onFailure {
Toast.makeText(context, "Error: ${it.message}", Toast.LENGTH_SHORT).show()
@@ -55,7 +55,8 @@ fun AssignmentListScreen(
val filteredItems = remember(items, searchQuery) {
items.filter {
it.personName?.contains(searchQuery, ignoreCase = true) ?: false ||
it.saiNs?.contains(searchQuery, ignoreCase = true) ?: false
it.saiNs?.contains(searchQuery, ignoreCase = true) ?: false ||
it.observations?.contains(searchQuery, ignoreCase = true) ?: false
}
}
@@ -74,7 +75,7 @@ fun AssignmentListScreen(
Scaffold(
topBar = {
TopAppBar(
title = { Text("Listado de Asignaciones") },
title = { Text("Listado SAI - Persona") },
navigationIcon = {
IconButton(onClick = onNavigateBack) {
Icon(Icons.Default.ArrowBack, contentDescription = "Atrás")
@@ -84,7 +85,7 @@ fun AssignmentListScreen(
},
floatingActionButton = {
FloatingActionButton(onClick = onNavigateToAdd) {
Icon(Icons.Default.Add, contentDescription = "Añadir Asignación")
Icon(Icons.Default.Add, contentDescription = "Añadir SAI - Persona")
}
}
) { padding ->
@@ -122,6 +123,9 @@ fun AssignmentListScreen(
if (item.returnDate != null) {
Text("Devolución: ${formatDate(item.returnDate)}")
}
if (!item.observations.isNullOrBlank()) {
Text("Obs: ${item.observations}", style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.secondary)
}
}
},
trailingContent = {
@@ -44,6 +44,7 @@ fun EditAssignmentScreen(
var assignedDateDb by remember { mutableStateOf("") }
var returnDateDisplay by remember { mutableStateOf("") }
var returnDateDb by remember { mutableStateOf("") }
var observations by remember { mutableStateOf("") }
var sais by remember { mutableStateOf<List<Sai>>(emptyList()) }
var people by remember { mutableStateOf<List<Person>>(emptyList()) }
@@ -68,6 +69,7 @@ fun EditAssignmentScreen(
val item = assignmentResult.getOrNull()!!
selectedSaiId = item.idSai
selectedPersonId = item.idPersona
observations = item.observations ?: ""
val dbFormat = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault())
val displayFormat = SimpleDateFormat("dd-MM-yyyy", Locale.getDefault())
@@ -159,7 +161,7 @@ fun EditAssignmentScreen(
Scaffold(
topBar = {
TopAppBar(
title = { Text("Editar Asignación") },
title = { Text("Editar SAI - Persona") },
navigationIcon = {
IconButton(onClick = onNavigateBack) {
Icon(Icons.Default.ArrowBack, contentDescription = "Atrás")
@@ -279,6 +281,16 @@ fun EditAssignmentScreen(
modifier = Modifier.fillMaxWidth().clickable { showReturnDatePicker = true }
)
Spacer(modifier = Modifier.height(16.dp))
OutlinedTextField(
value = observations,
onValueChange = { observations = it },
label = { Text(stringResource(R.string.label_observations)) },
modifier = Modifier.fillMaxWidth(),
minLines = 3
)
Spacer(modifier = Modifier.height(32.dp))
Button(
@@ -292,10 +304,11 @@ fun EditAssignmentScreen(
idSai = selectedSaiId!!,
idPersona = selectedPersonId!!,
assignedDate = assignedDateDb.takeIf { it.isNotBlank() },
returnDate = returnDateDb.takeIf { it.isNotBlank() }
returnDate = returnDateDb.takeIf { it.isNotBlank() },
observations = observations.takeIf { it.isNotBlank() }
)
).onSuccess {
Toast.makeText(context, "Asignación actualizada", Toast.LENGTH_SHORT).show()
Toast.makeText(context, "Asignación SAI - Persona actualizada", Toast.LENGTH_SHORT).show()
onNavigateBack()
}.onFailure {
Toast.makeText(context, "Error: ${it.message}", Toast.LENGTH_SHORT).show()
+2 -1
View File
@@ -26,10 +26,11 @@
<string name="menu_sais">Gestión de SAIs</string>
<string name="menu_batteries">Gestión de Baterías</string>
<string name="menu_people">Gestión de Personas</string>
<string name="menu_assignments">Gestión de Asignaciones</string>
<string name="menu_assignments">Gestion SAI - Persona</string>
<string name="label_person">Persona</string>
<string name="label_assigned_date">Fecha Asignación (DD-MM-AAAA)</string>
<string name="label_return_date">Fecha Devolución (DD-MM-AAAA)</string>
<string name="label_observations">Observaciones</string>
<string name="select_person">Seleccionar Persona</string>
</resources>