From ef224b0a668cb0a4edc07ed8c45e013c83211086 Mon Sep 17 00:00:00 2001 From: Pedro Javier Date: Fri, 10 Jul 2026 08:16:28 +0200 Subject: [PATCH] =?UTF-8?q?A=C3=B1adir=20los=2016.000=20kms=20de=20margen?= =?UTF-8?q?=20para=20el=20cambio=20de=20aceite?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/kilometrapp/MainActivity.kt | 77 ++++++++++--------- 1 file changed, 40 insertions(+), 37 deletions(-) diff --git a/app/src/main/java/com/example/kilometrapp/MainActivity.kt b/app/src/main/java/com/example/kilometrapp/MainActivity.kt index 8aa2e28..4e0a457 100644 --- a/app/src/main/java/com/example/kilometrapp/MainActivity.kt +++ b/app/src/main/java/com/example/kilometrapp/MainActivity.kt @@ -307,58 +307,61 @@ class MainActivity : AppCompatActivity() { Class.forName("com.mysql.jdbc.Driver") val connection = java.sql.DriverManager.getConnection(dbUrl, dbUser, dbPass) + // 1. Buscamos el último cambio de aceite (lógica n8n) val rsOil = connection.createStatement().executeQuery( - "SELECT kms FROM mantenimiento WHERE observaciones LIKE '%aceite%' ORDER BY fecha DESC LIMIT 1" + "SELECT kms, fecha FROM mantenimiento WHERE observaciones LIKE '%aceite%' ORDER BY fecha DESC LIMIT 1" ) - var ultimoCambio = 0 - if (rsOil.next()) ultimoCambio = rsOil.getInt("kms") + + var ultimoCambioKms = 0 + var fechaUltimoCambio: Date? = null + + if (rsOil.next()) { + ultimoCambioKms = rsOil.getInt("kms") + fechaUltimoCambio = rsOil.getTimestamp("fecha") + } - val rsStats = connection.createStatement().executeQuery( - "SELECT MIN(fecha) as f_min, MIN(kms) as k_min, MAX(fecha) as f_max, MAX(kms) as k_max FROM mantenimiento" + // 2. Kilometraje actual + val rsActual = connection.createStatement().executeQuery( + "SELECT kms, fecha FROM mantenimiento ORDER BY fecha DESC LIMIT 1" ) - var fechaEstimada: String? = null - var restan = 0 + var kmActual = 0 + var fechaActual = Date() - if (rsStats.next() && ultimoCambio > 0) { - val fMin = rsStats.getTimestamp("f_min") - val kMin = rsStats.getInt("k_min") - val fMax = rsStats.getTimestamp("f_max") - val kMax = rsStats.getInt("k_max") - - if (fMin != null && fMax != null && kMax > kMin) { - val diffMs = fMax.time - fMin.time - val diffDays = diffMs / (1000 * 60 * 60 * 24) - - if (diffDays > 0) { - val kmPorDia = (kMax - kMin).toDouble() / diffDays - val distanciaPuertollano = 320 - restan = (ultimoCambio + 15000 - distanciaPuertollano) - kMax - - if (restan > 0 && kmPorDia > 0) { - val diasFaltan = (restan / kmPorDia).toLong() - val calendar = Calendar.getInstance() - calendar.add(Calendar.DAY_OF_YEAR, diasFaltan.toInt()) - fechaEstimada = SimpleDateFormat("dd/MM/yyyy", Locale.getDefault()).format(calendar.time) - } - } - } - if (restan <= 0) { - val distanciaPuertollano = 320 - restan = (ultimoCambio + 15000 - distanciaPuertollano) - kMax - } + if (rsActual.next()) { + kmActual = rsActual.getInt("kms") + fechaActual = rsActual.getTimestamp("fecha") } connection.close() runOnUiThread { - if (ultimoCambio > 0) { + if (ultimoCambioKms > 0 && fechaUltimoCambio != null) { + val INTERVALO_CAMBIO = 16000 // Tu configuración de n8n + val distanciaPuertollano = 320 + + // Lógica de n8n: Calcular km diarios desde el último cambio hasta hoy + val diffMs = fechaActual.time - fechaUltimoCambio.time + val diasPasados = Math.max(1L, diffMs / (1000 * 60 * 60 * 24)) + val kmsDesdeCambio = kmActual - ultimoCambioKms + val kmPorDia = Math.max(0.1, kmsDesdeCambio.toDouble() / diasPasados) + + // Cálculo final restando el margen para el viaje a Puertollano + val restan = (ultimoCambioKms + INTERVALO_CAMBIO - distanciaPuertollano) - kmActual + + var fechaEstimadaStr = "---" + if (restan > 0 && kmPorDia > 0) { + val diasParaCambio = (restan / kmPorDia).toLong() + val calendar = Calendar.getInstance() + calendar.add(Calendar.DAY_OF_YEAR, diasParaCambio.toInt()) + fechaEstimadaStr = SimpleDateFormat("dd/MM/yyyy", Locale.getDefault()).format(calendar.time) + } + if (restan <= 0) { tvPrediction.text = getString(R.string.urgent_oil_change, Math.abs(restan)) tvPrediction.setTextColor(android.graphics.Color.RED) } else { - val fechaTexto = fechaEstimada ?: "---" - tvPrediction.text = getString(R.string.next_oil_change, restan, fechaTexto) + tvPrediction.text = getString(R.string.next_oil_change, restan, fechaEstimadaStr) tvPrediction.setTextColor(android.graphics.Color.parseColor("#4CAF50")) } } else {