using System; using System.Collections.ObjectModel; using System.Linq; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using Lagerprogramm.Models; using Lagerprogramm.Services; namespace Lagerprogramm.ViewModels; public partial class AdditionsViewModel : ObservableObject { private readonly JsonDataService _dataService; private readonly AppData _appData; public AppData AppData => _appData; [ObservableProperty] private ObservableCollection _additions = new(); [ObservableProperty] private ObservableCollection _lines = new(); [ObservableProperty] private DateTime _date = DateTime.Now; [ObservableProperty] private string _comment = string.Empty; public ObservableCollection PartNumbers { get; } = new(); public AdditionsViewModel(JsonDataService dataService, AppData appData) { _dataService = dataService; _appData = appData; RefreshPartNumbers(); foreach (var a in appData.Additions.OrderByDescending(a => a.Date)) Additions.Add(a); Lines.Add(new TransactionLine()); } [RelayCommand] private void AddLine() => Lines.Add(new TransactionLine()); [RelayCommand] private void RemoveLine(TransactionLine? line) { if (line is null) return; Lines.Remove(line); } [RelayCommand] private void SearchPart(TransactionLine? line) { } [RelayCommand] private void SearchAddition() { } [RelayCommand] private void Save() { if (Lines.Count == 0) return; if (Lines.Any(l => string.IsNullOrWhiteSpace(l.PartInternalNumber) || l.Quantity <= 0)) return; var addition = new Addition { Date = Date, Comment = Comment.Trim(), Lines = Lines.Select(l => new TransactionLine { PartInternalNumber = l.PartInternalNumber.Trim(), Quantity = l.Quantity }).ToList() }; _appData.Additions.Add(addition); Additions.Insert(0, addition); foreach (var line in addition.Lines) { var part = _appData.Parts.FirstOrDefault(p => p.InternalPartNumber == line.PartInternalNumber); if (part is not null) part.StockQuantity += line.Quantity; } _dataService.Save(_appData); Comment = string.Empty; Date = DateTime.Now; Lines.Clear(); Lines.Add(new TransactionLine()); RefreshPartNumbers(); } [RelayCommand] private void DeleteAddition(Addition? addition) { if (addition is null) return; foreach (var line in addition.Lines) { var part = _appData.Parts.FirstOrDefault(p => p.InternalPartNumber == line.PartInternalNumber); if (part is not null) part.StockQuantity -= line.Quantity; } _appData.Additions.Remove(addition); Additions.Remove(addition); _dataService.Save(_appData); RefreshPartNumbers(); } private void RefreshPartNumbers() { PartNumbers.Clear(); foreach (var p in _appData.Parts.OrderBy(p => p.InternalPartNumber)) PartNumbers.Add(p.InternalPartNumber); } }