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 @@
-
-
-
-
-
-
+
+
+
+
+
+
-
+
+
+
+
+
+
-