From bbe9c61dfbae84ae5ec8a87f4e74c138c743817b Mon Sep 17 00:00:00 2001 From: Sara Saiz Date: Mon, 21 Oct 2024 17:47:02 +0200 Subject: [PATCH] Codigo consultar terminado --- .../app/src/main/AndroidManifest.xml | 2 +- .../es/unican/gasolineras/GasolinerasApp.java | 8 -- .../ConsultarPresenter.java | 105 ++++++++++++++++++ ...ultarRepostaje.java => ConsultarView.java} | 93 +++------------- .../ConsultarRepostaje/IConsultar.java | 76 ++++++++++--- .../RepostajesArrayAdapter.java | 12 ++ .../gasolineras/activities/main/MainView.java | 7 +- .../gasolineras/repository/AppDatabase.java | 3 + .../repository/DatabaseFunction.java | 21 ++++ .../gasolineras/repository/RepostajeDAO.java | 9 +- 10 files changed, 223 insertions(+), 113 deletions(-) create mode 100644 AndroidProject/app/src/main/java/es/unican/gasolineras/activities/ConsultarRepostaje/ConsultarPresenter.java rename AndroidProject/app/src/main/java/es/unican/gasolineras/activities/ConsultarRepostaje/{ConsultarRepostaje.java => ConsultarView.java} (51%) create mode 100644 AndroidProject/app/src/main/java/es/unican/gasolineras/repository/DatabaseFunction.java diff --git a/AndroidProject/app/src/main/AndroidManifest.xml b/AndroidProject/app/src/main/AndroidManifest.xml index 4bfc371..2c18228 100644 --- a/AndroidProject/app/src/main/AndroidManifest.xml +++ b/AndroidProject/app/src/main/AndroidManifest.xml @@ -22,7 +22,7 @@ android:name=".activities.RegistrarRepostajeMenu.RegistrarView" android:exported="false" /> repostajesMesAnterior = obtenerRepostajesDelMes(); + + if(repostajesMesAnterior.isEmpty()) { + return 0; + } + + double sumaPreciosPonderados = 0; + double sumaLitros = 0; + + for (Repostaje repostaje : repostajesMesAnterior) { + double precioPorLitro = repostaje.getPrecioTotal() / repostaje.getLitros(); + sumaPreciosPonderados += precioPorLitro * repostaje.getLitros(); + sumaLitros += repostaje.getLitros(); + } + return sumaPreciosPonderados / sumaLitros; + } + + @Override + public List obtenerRepostajesDelMes() { + Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, 1); // Primer día del mes actual + SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy", Locale.getDefault()); + String inicioDelMes = sdf.format(calendar.getTime()); + + // Establecer el último día del mes actual + calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH)); + String finDelMes = sdf.format(calendar.getTime()); + + // Obtener los repostajes del mes actual desde el DAO utilizando el rango de fechas + return repostajeDAO.repostajesPorRangoDeFechas(inicioDelMes, finDelMes); + + } + + @Override + public double calcularAcumuladoMes() { + List repostajesMes = obtenerRepostajesDelMes(); + + if(repostajesMes.isEmpty()) { + return 0; + } + + double totalAcumulado = 0; + + for (Repostaje repostaje : repostajesMes) { + totalAcumulado += repostaje.getPrecioTotal(); + } + + return totalAcumulado; + } + + private void load() { + + + List repostajes = repostajeDAO.repostajes(); + + try { + view.showRepostajes(repostajes); + view.showLoadCorrect(repostajes.size()); + } catch (Throwable e) { + view.showLoadError(); + } + } +} diff --git a/AndroidProject/app/src/main/java/es/unican/gasolineras/activities/ConsultarRepostaje/ConsultarRepostaje.java b/AndroidProject/app/src/main/java/es/unican/gasolineras/activities/ConsultarRepostaje/ConsultarView.java similarity index 51% rename from AndroidProject/app/src/main/java/es/unican/gasolineras/activities/ConsultarRepostaje/ConsultarRepostaje.java rename to AndroidProject/app/src/main/java/es/unican/gasolineras/activities/ConsultarRepostaje/ConsultarView.java index 5e04a4d..3c4641e 100644 --- a/AndroidProject/app/src/main/java/es/unican/gasolineras/activities/ConsultarRepostaje/ConsultarRepostaje.java +++ b/AndroidProject/app/src/main/java/es/unican/gasolineras/activities/ConsultarRepostaje/ConsultarView.java @@ -11,24 +11,27 @@ import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; -import androidx.room.Room; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.List; import java.util.Locale; -import es.unican.gasolineras.GasolinerasApp; import es.unican.gasolineras.R; import es.unican.gasolineras.activities.main.IMainContract; import es.unican.gasolineras.activities.main.MainView; +import es.unican.gasolineras.model.Gasolinera; import es.unican.gasolineras.model.Repostaje; import es.unican.gasolineras.repository.AppDatabase; +import es.unican.gasolineras.repository.DatabaseFunction; import es.unican.gasolineras.repository.RepostajeDAO; -public class ConsultarRepostaje extends AppCompatActivity implements IConsultar { +public class ConsultarView extends AppCompatActivity implements IConsultar.View { + + private ConsultarPresenter presenter; + public AppDatabase db; /** * @see AppCompatActivity#onCreate(Bundle) * @param savedInstanceState @@ -41,87 +44,39 @@ protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.activity_consulta_repostaje_view); } catch (Exception e) { // Si ocurre una excepción, muestra el mensaje de error - new AlertDialog.Builder(ConsultarRepostaje.this) + new AlertDialog.Builder(ConsultarView.this) .setTitle("Error") .setMessage(getString(R.string.error_acceso_bbdd)) .setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // Puedes agregar alguna acción adicional si es necesario - Intent intent = new Intent(ConsultarRepostaje.this, MainView.class); + Intent intent = new Intent(ConsultarView.this, MainView.class); startActivity(intent); } }) .show(); } + db = DatabaseFunction.getDatabase(this); Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); - ActionBar bar = getSupportActionBar(); - //assert bar != null; // to avoid warning in the line below - //bar.setDisplayHomeAsUpEnabled(true); // show back button in action bar - - TextView repostajesMes = findViewById(R.id.tvRepostajesMes); - TextView precioMedioLitro = findViewById(R.id.tvPrecioMedioLitro); - TextView acumuladoMes = findViewById(R.id.tvAcumuladoMes); - - repostajesMes.setText(String.valueOf(obtenerRepostajesDelMes())); - precioMedioLitro.setText(String.valueOf(calcularPrecioMedioLitro())); - acumuladoMes.setText(String.valueOf(calcularAcumuladoMes())); - load(); - - } - - @Override - public double calcularPrecioMedioLitro() { - List repostajesMesAnterior = obtenerRepostajesDelMes(); - - double sumaPreciosPonderados = 0; - double sumaLitros = 0; - - for (Repostaje repostaje : repostajesMesAnterior) { - double precioPorLitro = repostaje.getPrecioTotal() / repostaje.getLitros(); - sumaPreciosPonderados += precioPorLitro * repostaje.getLitros(); - sumaLitros += repostaje.getLitros(); - } - - // Evitar división por cero - if (sumaLitros == 0) { - return 0; - } + presenter = new ConsultarPresenter(db.repostajeDao()); + presenter.init(this); - // Retornar el precio medio ponderado por los litros repostados - return sumaPreciosPonderados / sumaLitros; } @Override - public double calcularAcumuladoMes() { - // Obtener la lista de repostajes del mes anterior - List repostajes = obtenerRepostajesDelMes(); // Método que devuelve los repostajes del mes anterior - double totalAcumulado = 0; - - // Iterar sobre los repostajes del mes anterior para sumar el precio total de cada repostaje - for (Repostaje repostaje : repostajes) { - totalAcumulado += repostaje.getPrecioTotal(); - } - - // Retorna el acumulado total del mes - return totalAcumulado; - } - - @Override - public List obtenerRepostajesDelMes() { - // Obtener la fecha actual - Calendar calendar = Calendar.getInstance(); - - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM", Locale.getDefault()); + public void init() { + TextView repostajesMes = findViewById(R.id.tvRepostajesMes); + TextView precioMedioLitro = findViewById(R.id.tvPrecioMedioLitro); + TextView acumuladoMes = findViewById(R.id.tvAcumuladoMes); - // Obtener el mes en formato 'YYYY-MM' - String mesAnterior = sdf.format(calendar.getTime()); + repostajesMes.setText(String.valueOf(presenter.obtenerRepostajesDelMes().size())); + precioMedioLitro.setText(String.format(Locale.getDefault(),"%.2f", presenter.calcularPrecioMedioLitro())); + acumuladoMes.setText(String.format(Locale.getDefault(),"%.2f", presenter.calcularAcumuladoMes())); - // Obtener los repostajes del mes anterior desde el DAO - return GasolinerasApp.getDatabase().repostajeDao().repostajesPorMes(mesAnterior); } /** @@ -152,16 +107,4 @@ public void showLoadError() { Toast.makeText(this, "Error cargando los repostajes", Toast.LENGTH_SHORT).show(); } - private void load() { - - RepostajeDAO repostajeDao = GasolinerasApp.getDatabase().repostajeDao(); - List repostajes = repostajeDao.repostajes(); - - try { - showRepostajes(repostajes); - showLoadCorrect(repostajes.size()); - } catch (Throwable e) { - showLoadError(); - } - } } diff --git a/AndroidProject/app/src/main/java/es/unican/gasolineras/activities/ConsultarRepostaje/IConsultar.java b/AndroidProject/app/src/main/java/es/unican/gasolineras/activities/ConsultarRepostaje/IConsultar.java index 9eb71ff..c35b0c7 100644 --- a/AndroidProject/app/src/main/java/es/unican/gasolineras/activities/ConsultarRepostaje/IConsultar.java +++ b/AndroidProject/app/src/main/java/es/unican/gasolineras/activities/ConsultarRepostaje/IConsultar.java @@ -1,29 +1,71 @@ package es.unican.gasolineras.activities.ConsultarRepostaje; import java.util.List; - import es.unican.gasolineras.model.Repostaje; + public interface IConsultar { /** - * Calcula el precio medio por litro pagado en el mes actual - * @return + * Methods that must be implemented in the Main Presenter. + * Only the View should call these methods. */ - public double calcularPrecioMedioLitro(); + public interface Presenter { + /** + * Links the presenter with its view. + * Only the View should call this method + * @param view + */ + public void init(View view); - public List obtenerRepostajesDelMes(); - /** - * Muestra los repostajes realizados - * @param repostajes the list of charging stations - */ - public void showRepostajes(List repostajes); - public void showLoadCorrect(int repostajes); - public void showLoadError(); - /** - * - * @return - */ - public double calcularAcumuladoMes(); + /** + * Calcula el precio medio por litro pagado en el mes actual + * teniendo en cuenta el peso de cada repostajes + * @return el precio medio + */ + public double calcularPrecioMedioLitro(); + + /** + * Obtiene los repostajes realizados en el mes actual + * @return la lista de repostajes del mes + */ + public List obtenerRepostajesDelMes(); + + /** + * Calcula el precio total invertido en repostajes en el mes. + * @return el precio total gastado en repostajes en el mes actual + */ + public double calcularAcumuladoMes(); + } + + public interface View { + /** + * Initialize the view. Typically this should initialize all the listeners in the view. + * Only the Presenter should call this method + */ + public void init(); + + /** + * Muestra los repostajes realizados + * @param repostajes the list of charging stations + */ + public void showRepostajes(List repostajes); + + /** + * The view is requested to display a notification indicating that the refueling + * were loaded correctly. + * Only the Presenter should call this method + * @param repostajes + */ + public void showLoadCorrect(int repostajes); + + /** + * The view is requested to display a notificacion indicating that the refueling + * were not loaded correctly. + * Only the Presenter should call this method + */ + public void showLoadError(); + + } } diff --git a/AndroidProject/app/src/main/java/es/unican/gasolineras/activities/ConsultarRepostaje/RepostajesArrayAdapter.java b/AndroidProject/app/src/main/java/es/unican/gasolineras/activities/ConsultarRepostaje/RepostajesArrayAdapter.java index fc3d9a7..1df5cf5 100644 --- a/AndroidProject/app/src/main/java/es/unican/gasolineras/activities/ConsultarRepostaje/RepostajesArrayAdapter.java +++ b/AndroidProject/app/src/main/java/es/unican/gasolineras/activities/ConsultarRepostaje/RepostajesArrayAdapter.java @@ -65,19 +65,31 @@ public View getView(int position, View convertView, ViewGroup parent) { //precio por litro { + TextView tvLabel = convertView.findViewById(R.id.tvPrecioLitro); + String label = "Precio por litro: "; + tvLabel.setText(String.format("%s:", label)); TextView tv = convertView.findViewById(R.id.tvPrecioPorLitroNum); tv.setText(String.valueOf(repostaje.getPrecioTotal() / repostaje.getLitros())); + } //litros { + TextView tvLabel = convertView.findViewById(R.id.litrosTexto); + String label = "Litros: "; + tvLabel.setText(String.format("%s:", label)); + TextView tv = convertView.findViewById(R.id.tvLitrosNum); tv.setText(String.valueOf(repostaje.getLitros())); } //precio total { + TextView tvLabel = convertView.findViewById(R.id.precioTotal); + String label = "Precio total: "; + tvLabel.setText(String.format("%s:", label)); + TextView tv = convertView.findViewById(R.id.tvPrecioTotalNum); tv.setText(String.valueOf(repostaje.getPrecioTotal())); } diff --git a/AndroidProject/app/src/main/java/es/unican/gasolineras/activities/main/MainView.java b/AndroidProject/app/src/main/java/es/unican/gasolineras/activities/main/MainView.java index 0a26d4e..4f84dba 100644 --- a/AndroidProject/app/src/main/java/es/unican/gasolineras/activities/main/MainView.java +++ b/AndroidProject/app/src/main/java/es/unican/gasolineras/activities/main/MainView.java @@ -1,13 +1,10 @@ package es.unican.gasolineras.activities.main; -import android.app.AlertDialog; -import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; -import android.view.View; import android.widget.ListView; import android.widget.Toast; @@ -23,7 +20,7 @@ import dagger.hilt.android.AndroidEntryPoint; import es.unican.gasolineras.R; -import es.unican.gasolineras.activities.ConsultarRepostaje.ConsultarRepostaje; +import es.unican.gasolineras.activities.ConsultarRepostaje.ConsultarView; import es.unican.gasolineras.activities.RegistrarRepostajeMenu.RegistrarView; import es.unican.gasolineras.activities.info.InfoView; import es.unican.gasolineras.activities.details.DetailsView; @@ -184,7 +181,7 @@ public void showRegistrarActivity() { */ @Override public void showConsultarActivity() { - Intent intent = new Intent(this, ConsultarRepostaje.class); + Intent intent = new Intent(this, ConsultarView.class); startActivity(intent); } } \ No newline at end of file diff --git a/AndroidProject/app/src/main/java/es/unican/gasolineras/repository/AppDatabase.java b/AndroidProject/app/src/main/java/es/unican/gasolineras/repository/AppDatabase.java index df67055..403f936 100644 --- a/AndroidProject/app/src/main/java/es/unican/gasolineras/repository/AppDatabase.java +++ b/AndroidProject/app/src/main/java/es/unican/gasolineras/repository/AppDatabase.java @@ -1,11 +1,14 @@ package es.unican.gasolineras.repository; import androidx.room.Database; +import androidx.room.Room; import androidx.room.RoomDatabase; import es.unican.gasolineras.model.Repostaje; +import lombok.Getter; @Database(entities = {Repostaje.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract RepostajeDAO repostajeDao(); + } diff --git a/AndroidProject/app/src/main/java/es/unican/gasolineras/repository/DatabaseFunction.java b/AndroidProject/app/src/main/java/es/unican/gasolineras/repository/DatabaseFunction.java new file mode 100644 index 0000000..88b2b4f --- /dev/null +++ b/AndroidProject/app/src/main/java/es/unican/gasolineras/repository/DatabaseFunction.java @@ -0,0 +1,21 @@ +package es.unican.gasolineras.repository; + +import android.content.Context; + +import androidx.room.Room; + +public class DatabaseFunction { + + private static AppDatabase database; + + public static AppDatabase getDatabase(Context context) { + + // Inicializa la base de datos si aún no lo está + database = Room.databaseBuilder(context.getApplicationContext(), + AppDatabase.class, "database-name") + .fallbackToDestructiveMigration() // Opcional: elimina la base de datos si hay un cambio de esquema. + .build(); + + return database; + } +} diff --git a/AndroidProject/app/src/main/java/es/unican/gasolineras/repository/RepostajeDAO.java b/AndroidProject/app/src/main/java/es/unican/gasolineras/repository/RepostajeDAO.java index b6e7e6f..13501c8 100644 --- a/AndroidProject/app/src/main/java/es/unican/gasolineras/repository/RepostajeDAO.java +++ b/AndroidProject/app/src/main/java/es/unican/gasolineras/repository/RepostajeDAO.java @@ -14,13 +14,8 @@ public interface RepostajeDAO { @Query("SELECT * FROM repostaje") List repostajes(); - /* - @Query("SELECT * FROM repostaje where fecha_repostaje = getdate()") - Repostaje repostajePorFecha(String fecha);*/ - - // Obtener todos los repostajes de un mes específico (mes y año) - @Query("SELECT * FROM repostaje WHERE strftime('%Y-%m', fecha_repostaje) = :anioMes") - List repostajesPorMes(String anioMes); + @Query("SELECT * FROM Repostaje WHERE fecha_repostaje BETWEEN :fechaInicio AND :fechaFin") + List repostajesPorRangoDeFechas(String fechaInicio, String fechaFin); @Insert void registrarRepostaje(Repostaje r);