From 985351f6a8a2767d29d068bb70e98867fe422c32 Mon Sep 17 00:00:00 2001 From: Bonifacia Date: Sat, 13 Sep 2025 20:34:08 -0600 Subject: [PATCH] Mejoras --- AdminFinanceRCA/Repository.cs | 45 +--------- .../ViewModels/MainWindowViewModel.cs | 16 +++- .../Mantenimiento_DepartTrabajoViewModel.cs | 57 +++++++++--- .../ViewModels/MovimientoWindowViewModel.cs | 89 ++++++++++++++++--- .../Views/Mantenimiento_DepartTrabajo.axaml | 13 ++- AdminFinanceRCA/Views/MovimientoWindow.axaml | 14 +-- 6 files changed, 151 insertions(+), 83 deletions(-) diff --git a/AdminFinanceRCA/Repository.cs b/AdminFinanceRCA/Repository.cs index 45b74c6..f162976 100644 --- a/AdminFinanceRCA/Repository.cs +++ b/AdminFinanceRCA/Repository.cs @@ -3,13 +3,12 @@ using System.IO; using System.Text; using System.Threading.Tasks; using AdminFinanceRCA.Models; - -namespace AdminFinanceRCA; - using System.Data; using Dapper; using Microsoft.Data.Sqlite; +namespace AdminFinanceRCA; + public class FinanzasRepository { private readonly string _connectionString; @@ -20,7 +19,6 @@ public class FinanzasRepository _connectionString = config.GetConnectionString(); InitializeDatabase(); } - // Constructor alternativo para testing public FinanzasRepository(string connectionString) { _connectionString = connectionString; @@ -42,7 +40,8 @@ public class FinanzasRepository connection.Execute(@" CREATE TABLE IF NOT EXISTS DepartTrabajo ( Id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - Nombre TEXT NOT NULL + Nombre TEXT NOT NULL, + Descripcion TEXT NULL )"); connection.Execute(@" @@ -69,40 +68,6 @@ public class FinanzasRepository // Crear índice connection.Execute(@" CREATE INDEX IF NOT EXISTS Mov ON Movimientos (Concepto ASC, TipoMov ASC)"); - - // Insertar datos básicos si las tablas están vacías - InsertarDatosBasicos(connection); - } - } - - private void InsertarDatosBasicos(SqliteConnection connection) - { - // Verificar si TipoMovimiento está vacío - var countTipos = connection.ExecuteScalar("SELECT COUNT(*) FROM TipoMovimiento"); - if (countTipos == 0) - { - connection.Execute("INSERT INTO TipoMovimiento (Nombre) VALUES ('Ingreso')"); - connection.Execute("INSERT INTO TipoMovimiento (Nombre) VALUES ('Egreso')"); - } - - // Verificar si Concepto está vacío - var countConceptos = connection.ExecuteScalar("SELECT COUNT(*) FROM Concepto"); - if (countConceptos == 0) - { - connection.Execute("INSERT INTO Concepto (Nombre) VALUES ('Ventas')"); - connection.Execute("INSERT INTO Concepto (Nombre) VALUES ('Compras')"); - connection.Execute("INSERT INTO Concepto (Nombre) VALUES ('Nómina')"); - connection.Execute("INSERT INTO Concepto (Nombre) VALUES ('Servicios')"); - } - - // Verificar si DepartTrabajo está vacío - var countDeptos = connection.ExecuteScalar("SELECT COUNT(*) FROM DepartTrabajo"); - if (countDeptos == 0) - { - connection.Execute("INSERT INTO DepartTrabajo (Nombre) VALUES ('Administración')"); - connection.Execute("INSERT INTO DepartTrabajo (Nombre) VALUES ('Ventas')"); - connection.Execute("INSERT INTO DepartTrabajo (Nombre) VALUES ('Producción')"); - connection.Execute("INSERT INTO DepartTrabajo (Nombre) VALUES ('Logística')"); } } @@ -218,7 +183,6 @@ public class FinanzasRepository #endregion #region Operaciones para DepartTrabajo - public async Task> GetAllDepartamentosAsync() { using (var connection = GetConnection()) @@ -249,7 +213,6 @@ public class FinanzasRepository return rowsAffected > 0; } } - #endregion #region Operaciones para TipoMovimiento diff --git a/AdminFinanceRCA/ViewModels/MainWindowViewModel.cs b/AdminFinanceRCA/ViewModels/MainWindowViewModel.cs index 68b3efe..bbd9e9a 100644 --- a/AdminFinanceRCA/ViewModels/MainWindowViewModel.cs +++ b/AdminFinanceRCA/ViewModels/MainWindowViewModel.cs @@ -5,9 +5,7 @@ using System.Diagnostics; using System.Threading.Tasks; using AdminFinanceRCA.Models; using AdminFinanceRCA.Views; -using Avalonia; using Avalonia.Controls; -using Avalonia.Controls.ApplicationLifetimes; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; @@ -45,12 +43,22 @@ public partial class MainWindowViewModel : ViewModelBase public void AgregarMovimiento() { MovimientoWindowViewModel mwvm = new MovimientoWindowViewModel(); - - MovimientoWindow mw = new MovimientoWindow(); + mwvm.ReloadEvent+= MwvmOnReloadEvent; + MovimientoWindow mw = new MovimientoWindow() + { + Width = 600, + Height = 400, + }; mw.DataContext = mwvm; mw.ShowDialog(GetCurrentWindow()); } + private async void MwvmOnReloadEvent(object? sender, EventArgs e) + { + var movimientosTask = _repository.GetAllMovimientosCompletosAsync(); + Movimientos = new ObservableCollection(await movimientosTask); + } + [RelayCommand] public void Salir() { diff --git a/AdminFinanceRCA/ViewModels/Mantenimiento_DepartTrabajoViewModel.cs b/AdminFinanceRCA/ViewModels/Mantenimiento_DepartTrabajoViewModel.cs index 5bfceb0..8102af8 100644 --- a/AdminFinanceRCA/ViewModels/Mantenimiento_DepartTrabajoViewModel.cs +++ b/AdminFinanceRCA/ViewModels/Mantenimiento_DepartTrabajoViewModel.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.ObjectModel; using System.Threading.Tasks; using AdminFinanceRCA.Models; @@ -12,7 +13,7 @@ namespace AdminFinanceRCA.ViewModels; public partial class Mantenimiento_DepartTrabajoViewModel : ViewModelBase { private readonly FinanzasRepository _departTrabajoService; - + public event EventHandler? ReloadEvent; [ObservableProperty] private ObservableCollection _gruposTrabajo; [ObservableProperty] private DepartTrabajo _grupoSeleccionado; [ObservableProperty] private DepartTrabajo _grupoEditando; @@ -43,24 +44,54 @@ public partial class Mantenimiento_DepartTrabajoViewModel : ViewModelBase [RelayCommand] private async Task GuardarRegistros() { - + string[] mensaje = {"", string.Empty}; if (EstaEditando) { - GrupoSeleccionado.Nombre = Nombre; - GrupoSeleccionado.Descripcion = Descripcion; - _departTrabajoService.UpdateDepartamentoAsync(GrupoSeleccionado); + try + { + GrupoSeleccionado.Nombre = Nombre; + GrupoSeleccionado.Descripcion = Descripcion; + _departTrabajoService.UpdateDepartamentoAsync(GrupoSeleccionado); + mensaje = new[] { "Exito", "Registro actualizado con exito" }; + } + catch (Exception ex) + { + mensaje = new[] { "Error", ex.Message }; + } } else { - if(string.IsNullOrEmpty(Nombre)) - return; + try + { + if(string.IsNullOrEmpty(Nombre)) + return; - DepartTrabajo depart = new DepartTrabajo(Nombre, Descripcion); - await _departTrabajoService.CreateDepartamentoAsync(depart); - Nombre = string.Empty; - Descripcion = string.Empty; - var dt = MessageBoxManager.GetMessageBoxStandard("Exito", "Registro agregado con exito", ButtonEnum.Ok); - await dt.ShowAsPopupAsync(GetCurrentWindow()); + DepartTrabajo depart = new DepartTrabajo(Nombre, Descripcion); + await _departTrabajoService.CreateDepartamentoAsync(depart); + Nombre = string.Empty; + Descripcion = string.Empty; + + mensaje = new[] { "Exito", "Registro agregado con exito" }; + } + catch (Exception ex) + { + mensaje = new[] { "Error", ex.Message }; + } } + var dt = MessageBoxManager.GetMessageBoxStandard(mensaje[0], mensaje[1], ButtonEnum.Ok); + await dt.ShowAsPopupAsync(GetCurrentWindow()); + OnReloadEvent(); + await CargarDatosAsync(); + } + + [RelayCommand] + private void Cancelar() + { + this.GetCurrentWindow().Close(); + } + + protected virtual void OnReloadEvent() + { + ReloadEvent?.Invoke(this, EventArgs.Empty); } } \ No newline at end of file diff --git a/AdminFinanceRCA/ViewModels/MovimientoWindowViewModel.cs b/AdminFinanceRCA/ViewModels/MovimientoWindowViewModel.cs index 7fec07c..3a88503 100644 --- a/AdminFinanceRCA/ViewModels/MovimientoWindowViewModel.cs +++ b/AdminFinanceRCA/ViewModels/MovimientoWindowViewModel.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Collections.ObjectModel; using System.Threading.Tasks; using AdminFinanceRCA.Models; @@ -13,11 +14,11 @@ namespace AdminFinanceRCA.ViewModels; public partial class MovimientoWindowViewModel : ViewModelBase { private readonly FinanzasRepository _finanzasRepository; - + public event EventHandler? ReloadEvent; [ObservableProperty] private ObservableCollection _departTrabajos; [ObservableProperty] private ObservableCollection _tipoMovimientos; [ObservableProperty] private ObservableCollection _conceptos; - [ObservableProperty] private DateTime _fechaMov; + [ObservableProperty] private DateTimeOffset _fechaMov; [ObservableProperty] private decimal _montoDecimal; [ObservableProperty] private string _descripcion; [ObservableProperty] private TipoMovimiento _tipoMovimientoSelecionado; @@ -26,7 +27,7 @@ public partial class MovimientoWindowViewModel : ViewModelBase public MovimientoWindowViewModel() { - _fechaMov = DateTime.Now; + _fechaMov = DateTimeOffset.Now; _finanzasRepository = new FinanzasRepository(); _ = CargarDatosAsync(); } @@ -35,22 +36,90 @@ public partial class MovimientoWindowViewModel : ViewModelBase { var dt = await _finanzasRepository.GetAllDepartamentosAsync(); DepartTrabajos = new ObservableCollection(dt); - var tm = await _finanzasRepository.GetAllTiposMovimientoAsync(); TipoMovimientos = new ObservableCollection(tm); - var cpt = await _finanzasRepository.GetAllConceptosAsync(); Conceptos = new ObservableCollection(cpt); + DepartaDepartTrabajoSeleccionado = DepartTrabajos[0]; + TipoMovimientoSelecionado = TipoMovimientos[0]; + ConceptoSeleccionado = Conceptos[0]; } [RelayCommand] public async void GuardarDatosAsync() { - Movimiento mv = new Movimiento(MontoDecimal, TipoMovimientoSelecionado.ID, DepartaDepartTrabajoSeleccionado.Id, - FechaMov, ConceptoSeleccionado.ID, Descripcion); - await _finanzasRepository.CreateMovimientoAsync(mv); - var dt = MessageBoxManager.GetMessageBoxStandard("", "Se guardo con exito", ButtonEnum.Ok); - await dt.ShowAsPopupAsync(GetCurrentWindow()); + try + { + // Validar campos obligatorios + if (!ValidarCamposObligatorios()) + { + return; // Detener ejecución si hay campos inválidos + } + Movimiento mv = new Movimiento(MontoDecimal, TipoMovimientoSelecionado.ID, DepartaDepartTrabajoSeleccionado.Id, + DateTime.Parse(FechaMov.ToString("yyyy-MM-dd")), ConceptoSeleccionado.ID, Descripcion); + await _finanzasRepository.CreateMovimientoAsync(mv); + var dt = MessageBoxManager.GetMessageBoxStandard("", "Se guardo con exito", ButtonEnum.Ok); + await dt.ShowAsPopupAsync(GetCurrentWindow()); + + MontoDecimal = 0; + Descripcion = ""; + OnReloadEvent(); + }catch(Exception ex){ + var errorMsg = MessageBoxManager.GetMessageBoxStandard("Error", $"Ocurrió un error: {ex.Message}", ButtonEnum.Ok); + await errorMsg.ShowAsPopupAsync(GetCurrentWindow()); + } + } + private bool ValidarCamposObligatorios() + { + var mensajesError = new List(); + + // Validar MontoDecimal + if (MontoDecimal <= 0) + { + mensajesError.Add("• Debe agregar un monto válido (mayor a 0)"); + } + + // Validar TipoMovimientoSelecionado + if (TipoMovimientoSelecionado == null || TipoMovimientoSelecionado.ID <= 0) + { + mensajesError.Add("• Debe seleccionar un tipo de movimiento"); + } + + // Validar DepartaDepartTrabajoSeleccionado + if (DepartaDepartTrabajoSeleccionado == null || DepartaDepartTrabajoSeleccionado.Id <= 0) + { + mensajesError.Add("• Debe seleccionar un departamento/trabajo"); + } + + // Validar FechaMov + if (FechaMov == default(DateTime) || FechaMov > DateTime.Now) + { + mensajesError.Add("• Debe seleccionar una fecha válida (no puede ser futura)"); + } + + // Validar ConceptoSeleccionado + if (ConceptoSeleccionado == null || ConceptoSeleccionado.ID <= 0) + { + mensajesError.Add("• Debe seleccionar un concepto"); + } + + // Si hay errores, mostrar mensaje + if (mensajesError.Count > 0) + { + var mensajeCompleto = "Por favor, complete los siguientes campos:\n\n" + string.Join("\n", mensajesError); + + var errorMsg = MessageBoxManager.GetMessageBoxStandard("Campos requeridos", mensajeCompleto, ButtonEnum.Ok); + errorMsg.ShowAsPopupAsync(GetCurrentWindow()); + + return false; + } + + return true; + } + + protected virtual void OnReloadEvent() + { + ReloadEvent?.Invoke(this, EventArgs.Empty); } [RelayCommand] diff --git a/AdminFinanceRCA/Views/Mantenimiento_DepartTrabajo.axaml b/AdminFinanceRCA/Views/Mantenimiento_DepartTrabajo.axaml index af93a83..bd783f1 100644 --- a/AdminFinanceRCA/Views/Mantenimiento_DepartTrabajo.axaml +++ b/AdminFinanceRCA/Views/Mantenimiento_DepartTrabajo.axaml @@ -17,9 +17,9 @@ -