From 1fde928d5e65be8608dacfa6e3814f5e78fa3ebb Mon Sep 17 00:00:00 2001 From: adalberto Date: Mon, 15 Sep 2025 15:02:17 -0600 Subject: [PATCH] agregar cambios importantes --- AdminFinanceRCA.sln.DotSettings.user | 1 + AdminFinanceRCA/Models/Entidades.cs | 21 ++++++- AdminFinanceRCA/Repository.cs | 55 ++++++++++++++----- .../ViewModels/MainWindowViewModel.cs | 37 +++++++++---- .../ViewModels/MovimientoWindowViewModel.cs | 55 ++++++++++++++++--- AdminFinanceRCA/Views/MainWindow.axaml | 40 ++++++++++---- AdminFinanceRCA/Views/MainWindow.axaml.cs | 15 +++++ AdminFinanceRCA/Views/MovimientoWindow.axaml | 24 +++++--- 8 files changed, 192 insertions(+), 56 deletions(-) diff --git a/AdminFinanceRCA.sln.DotSettings.user b/AdminFinanceRCA.sln.DotSettings.user index 11e2cf4..e6859ce 100644 --- a/AdminFinanceRCA.sln.DotSettings.user +++ b/AdminFinanceRCA.sln.DotSettings.user @@ -2,6 +2,7 @@ ForceIncluded ForceIncluded ForceIncluded + ForceIncluded ForceIncluded ForceIncluded ForceIncluded \ No newline at end of file diff --git a/AdminFinanceRCA/Models/Entidades.cs b/AdminFinanceRCA/Models/Entidades.cs index 58e4181..b6e3eeb 100644 --- a/AdminFinanceRCA/Models/Entidades.cs +++ b/AdminFinanceRCA/Models/Entidades.cs @@ -1,4 +1,5 @@ using System; +using Avalonia.Media; using CommunityToolkit.Mvvm.ComponentModel; namespace AdminFinanceRCA.Models; @@ -63,6 +64,7 @@ public class Movimiento : ObservableObject public DateTime FechaRegistro { get; set; } public int Concepto { get; set; } public string Descripcion { get; set; } = string.Empty; + public string Nota { get; set; } = string.Empty; // Propiedades de navegación para las relaciones (opcionales pero útiles) public TipoMovimiento TipoMovimientoNav { get; set; } = new TipoMovimiento(); @@ -72,7 +74,7 @@ public class Movimiento : ObservableObject public Movimiento() { } public Movimiento(decimal monto, int tipoMov, int deptoTrabajo, - DateTime fechaMovimiento, int concepto, string descripcion = "") + DateTime fechaMovimiento, int concepto, string descripcion = "", string nota ="") { Monto = monto; TipoMov = tipoMov; @@ -81,6 +83,20 @@ public class Movimiento : ObservableObject FechaRegistro = DateTime.Now; Concepto = concepto; Descripcion = descripcion; + Nota = nota; + } + public Movimiento(int id, decimal monto, int tipoMov, int deptoTrabajo, + DateTime fechaMovimiento, int concepto, string descripcion = "", string nota = "") + { + ID = id; + Monto = monto; + TipoMov = tipoMov; + DeptoTrabajo = deptoTrabajo; + FechaMovimiento = fechaMovimiento; + FechaRegistro = DateTime.Now; + Concepto = concepto; + Descripcion = descripcion; + Nota = nota; } } @@ -104,4 +120,7 @@ public class MovimientoCompleto : ObservableObject // Datos de Concepto public int ConceptoID { get; set; } public string ConceptoNombre { get; set; } = string.Empty; + public string Nota { get; set; } = string.Empty; + + public IBrush ForegroundColor => TipoMovNombre == "Egreso" ? Brushes.Red : Brushes.Black; } diff --git a/AdminFinanceRCA/Repository.cs b/AdminFinanceRCA/Repository.cs index 245073a..eebc4c6 100644 --- a/AdminFinanceRCA/Repository.cs +++ b/AdminFinanceRCA/Repository.cs @@ -83,8 +83,8 @@ public class FinanzasRepository using (var connection = GetConnection()) { var sql = @"INSERT INTO Movimientos - (Monto, TipoMov, DeptoTrabajo, FechaMovimiento, FechaRegistro, Concepto, Descripcion) - VALUES (@Monto, @TipoMov, @DeptoTrabajo, @FechaMovimiento, @FechaRegistro, @Concepto, @Descripcion); + (Monto, TipoMov, DeptoTrabajo, FechaMovimiento, FechaRegistro, Concepto, Descripcion, Nota) + VALUES (@Monto, @TipoMov, @DeptoTrabajo, @FechaMovimiento, @FechaRegistro, @Concepto, @Descripcion, @Nota); SELECT last_insert_rowid();"; var id = await connection.ExecuteScalarAsync(sql, movimiento); @@ -110,7 +110,8 @@ public class FinanzasRepository m.ID, m.Monto, m.FechaMovimiento, m.FechaRegistro, m.Descripcion, tm.ID as TipoMovID, tm.Nombre as TipoMovNombre, dt.Id as DeptoTrabajoID, dt.Nombre as DeptoTrabajoNombre, - c.ID as ConceptoID, c.Nombre as ConceptoNombre + c.ID as ConceptoID, c.Nombre as ConceptoNombre, + m.Nota as Nota FROM Movimientos m INNER JOIN TipoMovimiento tm ON m.TipoMov = tm.ID INNER JOIN DepartTrabajo dt ON m.DeptoTrabajo = dt.Id @@ -140,7 +141,8 @@ public class FinanzasRepository DeptoTrabajo = @DeptoTrabajo, FechaMovimiento = @FechaMovimiento, Concepto = @Concepto, - Descripcion = @Descripcion + Descripcion = @Descripcion, + Nota = @Nota WHERE ID = @ID"; var affectedRows = await connection.ExecuteAsync(sql, movimiento); @@ -193,9 +195,27 @@ public class FinanzasRepository } } + public async Task GetConceptoByIdAsync(int id) + { + using (var connection = GetConnection()) + { + var sql = "SELECT * FROM Concepto WHERE ID = @Id"; + return await connection.QueryFirstOrDefaultAsync(sql, new { Id = id }); + } + } #endregion #region Operaciones para DepartTrabajo + + public async Task GetDepartamentoTrabajoByIdAsync(int id) + { + using (var connection = GetConnection()) + { + var sql = "SELECT * FROM DepartTrabajo WHERE ID = @Id"; + return await connection.QueryFirstOrDefaultAsync(sql, new { Id = id }); + } + } + public async Task> GetAllDepartamentosAsync() { using (var connection = GetConnection()) @@ -238,16 +258,6 @@ public class FinanzasRepository return await connection.QueryAsync(sql); } } - - public async Task CreateTipoMovimientoAsync(TipoMovimiento tipoMovimiento) - { - using (var connection = GetConnection()) - { - var sql = "INSERT INTO TipoMovimiento (Nombre) VALUES (@Nombre); SELECT last_insert_rowid();"; - return await connection.ExecuteScalarAsync(sql, tipoMovimiento); - } - } - public async Task UpdateTipoMovimientoAsync(TipoMovimiento tipomov) { using (var connection = GetConnection()) @@ -260,7 +270,24 @@ public class FinanzasRepository return rowsAffected > 0; } } + + public async Task CreateTipoMovimientoAsync(TipoMovimiento tipoMovimiento) + { + using (var connection = GetConnection()) + { + var sql = "INSERT INTO TipoMovimiento (Nombre) VALUES (@Nombre); SELECT last_insert_rowid();"; + return await connection.ExecuteScalarAsync(sql, tipoMovimiento); + } + } + public async Task GetTipoMovimientoByIdAsync(int id) + { + using (var connection = GetConnection()) + { + var sql = "SELECT * FROM TipoMovimiento WHERE ID = @Id"; + return await connection.QueryFirstOrDefaultAsync(sql, new { Id = id }); + } + } #endregion #region Métodos de exportación diff --git a/AdminFinanceRCA/ViewModels/MainWindowViewModel.cs b/AdminFinanceRCA/ViewModels/MainWindowViewModel.cs index 1088d23..8b371f8 100644 --- a/AdminFinanceRCA/ViewModels/MainWindowViewModel.cs +++ b/AdminFinanceRCA/ViewModels/MainWindowViewModel.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; using AdminFinanceRCA.Models; using AdminFinanceRCA.Views; using Avalonia.Controls; +using Avalonia.Media; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; @@ -14,20 +15,18 @@ namespace AdminFinanceRCA.ViewModels; public partial class MainWindowViewModel : ViewModelBase { private readonly FinanzasRepository _repository; - [ObservableProperty] - private ObservableCollection _movimientos; - [ObservableProperty] - private ObservableCollection _conceptos; - [ObservableProperty] - private ObservableCollection _departamentos; - [ObservableProperty] - private ObservableCollection _tiposMovimiento; - + [ObservableProperty] private ObservableCollection _movimientos; + [ObservableProperty] private ObservableCollection _conceptos; + [ObservableProperty] private ObservableCollection _departamentos; + [ObservableProperty] private ObservableCollection _tiposMovimiento; + [ObservableProperty] private MovimientoCompleto _movimientoSeleccionado; + public MainWindowViewModel() { _repository = new FinanzasRepository(); CargarDatos(); } + [RelayCommand] public void AgregarDepartamento() { @@ -60,7 +59,22 @@ public partial class MainWindowViewModel : ViewModelBase }; conceptoWindow.ShowDialog(GetCurrentWindow()); } - + + [RelayCommand] + public async Task UpdateMovimiento(MovimientoCompleto _mvMovimientoCompleto) + { + MovimientoWindowViewModel mwvm = new MovimientoWindowViewModel(); + mwvm.ReloadEvent+= MwvmOnReloadEvent; + MovimientoWindow mw = new MovimientoWindow() + { + Width = 600, + Height = 500, + }; + mw.DataContext = mwvm; + mw.ShowDialog(GetCurrentWindow()); + mw.Loaded += async (sender, args) => { await mwvm.ActualizarMovimientoAsync(_mvMovimientoCompleto); }; + } + [RelayCommand] public void AgregarMovimiento() { @@ -69,13 +83,12 @@ public partial class MainWindowViewModel : ViewModelBase MovimientoWindow mw = new MovimientoWindow() { Width = 600, - Height = 450, + Height = 500, }; mw.DataContext = mwvm; mw.ShowDialog(GetCurrentWindow()); } - private async void MwvmOnReloadEvent(object? sender, EventArgs e) { var movimientosTask = _repository.GetAllMovimientosCompletosAsync(); diff --git a/AdminFinanceRCA/ViewModels/MovimientoWindowViewModel.cs b/AdminFinanceRCA/ViewModels/MovimientoWindowViewModel.cs index 3a88503..73a74ed 100644 --- a/AdminFinanceRCA/ViewModels/MovimientoWindowViewModel.cs +++ b/AdminFinanceRCA/ViewModels/MovimientoWindowViewModel.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.Linq; using System.Threading.Tasks; using AdminFinanceRCA.Models; using AdminFinanceRCA.Views; @@ -24,6 +25,9 @@ public partial class MovimientoWindowViewModel : ViewModelBase [ObservableProperty] private TipoMovimiento _tipoMovimientoSelecionado; [ObservableProperty] private DepartTrabajo _departaDepartTrabajoSeleccionado; [ObservableProperty] private Concepto _conceptoSeleccionado; + [ObservableProperty] private string _nota; + private int IdMovimiento { get; set; } + private bool modificando = false; public MovimientoWindowViewModel() { @@ -45,6 +49,26 @@ public partial class MovimientoWindowViewModel : ViewModelBase ConceptoSeleccionado = Conceptos[0]; } + public async Task ActualizarMovimientoAsync(MovimientoCompleto mc) + { + try + { + IdMovimiento = mc.ID; + FechaMov = mc.FechaMovimiento; + MontoDecimal = mc.Monto; + TipoMovimientoSelecionado = TipoMovimientos.Where(e => e.ID == mc.TipoMovID).FirstOrDefault(); //await _finanzasRepository.GetTipoMovimientoByIdAsync(mc.TipoMovID) ?? new TipoMovimiento(); + ConceptoSeleccionado = Conceptos.Where(e => e.ID == mc.ConceptoID).FirstOrDefault(); // await _finanzasRepository.GetConceptoByIdAsync(mc.ConceptoID) ?? new Concepto(); + DepartaDepartTrabajoSeleccionado = DepartTrabajos.Where(e => e.Id == mc.DeptoTrabajoID).FirstOrDefault(); //await _finanzasRepository.GetDepartamentoTrabajoByIdAsync(mc.DeptoTrabajoID) ?? new DepartTrabajo(); + Descripcion = mc.Descripcion; + Nota = mc.Nota; + modificando = true; + } + catch (Exception e) + { + Console.WriteLine(e.Message); + } + } + [RelayCommand] public async void GuardarDatosAsync() { @@ -55,15 +79,30 @@ public partial class MovimientoWindowViewModel : ViewModelBase { 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()); + + if (!modificando) + { + Movimiento mv = new Movimiento(MontoDecimal, TipoMovimientoSelecionado.ID, DepartaDepartTrabajoSeleccionado.Id, + DateTime.Parse(FechaMov.ToString("yyyy-MM-dd")), ConceptoSeleccionado.ID, Descripcion, Nota); + await _finanzasRepository.CreateMovimientoAsync(mv); + var dt = MessageBoxManager.GetMessageBoxStandard("", "Se guardo con exito", ButtonEnum.Ok); + await dt.ShowAsPopupAsync(GetCurrentWindow()); - MontoDecimal = 0; - Descripcion = ""; - OnReloadEvent(); + MontoDecimal = 0; + Descripcion = ""; + OnReloadEvent(); + }else + { + Movimiento mv = new Movimiento(IdMovimiento, MontoDecimal, TipoMovimientoSelecionado.ID, DepartaDepartTrabajoSeleccionado.Id, + DateTime.Parse(FechaMov.ToString("yyyy-MM-dd")), ConceptoSeleccionado.ID, Descripcion, Nota); + await _finanzasRepository.UpdateMovimientoAsync(mv); + var dt = MessageBoxManager.GetMessageBoxStandard("", "Se actualizo 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()); diff --git a/AdminFinanceRCA/Views/MainWindow.axaml b/AdminFinanceRCA/Views/MainWindow.axaml index a3fe1bf..b835225 100644 --- a/AdminFinanceRCA/Views/MainWindow.axaml +++ b/AdminFinanceRCA/Views/MainWindow.axaml @@ -16,6 +16,13 @@ + + + + @@ -49,13 +56,14 @@ - + + - + - + @@ -63,15 +71,15 @@ - + - + - + @@ -79,7 +87,7 @@ - + @@ -87,23 +95,31 @@ - + - + - + - + - + + + + + + + + + diff --git a/AdminFinanceRCA/Views/MainWindow.axaml.cs b/AdminFinanceRCA/Views/MainWindow.axaml.cs index 8147f3a..63008b1 100644 --- a/AdminFinanceRCA/Views/MainWindow.axaml.cs +++ b/AdminFinanceRCA/Views/MainWindow.axaml.cs @@ -1,4 +1,7 @@ +using AdminFinanceRCA.Models; +using AdminFinanceRCA.ViewModels; using Avalonia.Controls; +using Avalonia.Input; namespace AdminFinanceRCA.Views; @@ -8,4 +11,16 @@ public partial class MainWindow : Window { InitializeComponent(); } + + private void InputElement_OnDoubleTapped(object? sender, TappedEventArgs e) + { + if (DataContext is MainWindowViewModel vm) + { + if (((DataGrid)sender).SelectedItem is MovimientoCompleto) + { + var row = ((DataGrid)sender).SelectedItem as MovimientoCompleto; + vm.UpdateMovimientoCommand.Execute(row); + } + } + } } \ No newline at end of file diff --git a/AdminFinanceRCA/Views/MovimientoWindow.axaml b/AdminFinanceRCA/Views/MovimientoWindow.axaml index a31973c..a78aa91 100644 --- a/AdminFinanceRCA/Views/MovimientoWindow.axaml +++ b/AdminFinanceRCA/Views/MovimientoWindow.axaml @@ -2,7 +2,7 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" - mc:Ignorable="d" d:DesignWidth="600" d:DesignHeight="500" Width="600" Height="500" + mc:Ignorable="d" d:DesignWidth="600" d:DesignHeight="500" Width="600" Height="520" CanResize="False" x:Class="AdminFinanceRCA.Views.MovimientoWindow" xmlns:vm="using:AdminFinanceRCA.ViewModels" @@ -28,6 +28,7 @@ + @@ -69,20 +70,25 @@ - - - - - - + + + + + + - + + + + + + -