Files
lagerprogramm/ViewModels/DeductionsViewModel.cs
joel.leirer fb1f90a9ca Added Slop
2026-08-25 17:14:54 +02:00

179 lines
5.6 KiB
C#

using System;
using System.Collections.ObjectModel;
using System.IO;
using System.Linq;
using System.Text;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using Lagerprogramm.Models;
using Lagerprogramm.Services;
namespace Lagerprogramm.ViewModels;
public partial class DeductionsViewModel : ObservableObject
{
private readonly JsonDataService _dataService;
private readonly AppData _appData;
public AppData AppData => _appData;
[ObservableProperty]
private ObservableCollection<Deduction> _deductions = new();
[ObservableProperty]
private ObservableCollection<TransactionLine> _lines = new();
[ObservableProperty]
private DateTime _date = DateTime.Now;
[ObservableProperty]
private string _comment = string.Empty;
[ObservableProperty]
private string _customer = string.Empty;
[ObservableProperty]
private bool _generateDeliveryNote;
public ObservableCollection<string> PartNumbers { get; } = new();
public DeductionsViewModel(JsonDataService dataService, AppData appData)
{
_dataService = dataService;
_appData = appData;
RefreshPartNumbers();
foreach (var d in appData.Deductions.OrderByDescending(d => d.Date))
Deductions.Add(d);
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 SearchDeduction()
{
}
[RelayCommand]
private void Save()
{
if (Lines.Count == 0) return;
if (Lines.Any(l => string.IsNullOrWhiteSpace(l.PartInternalNumber) || l.Quantity <= 0))
return;
foreach (var line in Lines)
{
var part = _appData.Parts.FirstOrDefault(p => p.InternalPartNumber == line.PartInternalNumber);
if (part is null || part.StockQuantity < line.Quantity)
return;
}
var deduction = new Deduction
{
Date = Date,
Comment = Comment.Trim(),
Customer = Customer.Trim(),
GenerateDeliveryNote = GenerateDeliveryNote,
Lines = Lines.Select(l => new TransactionLine
{
PartInternalNumber = l.PartInternalNumber.Trim(),
Quantity = l.Quantity
}).ToList()
};
_appData.Deductions.Add(deduction);
Deductions.Insert(0, deduction);
foreach (var line in deduction.Lines)
{
var part = _appData.Parts.FirstOrDefault(p => p.InternalPartNumber == line.PartInternalNumber);
if (part is not null)
part.StockQuantity -= line.Quantity;
}
_dataService.Save(_appData);
if (GenerateDeliveryNote)
WriteDeliveryNote(deduction);
Comment = string.Empty;
Customer = string.Empty;
GenerateDeliveryNote = false;
Date = DateTime.Now;
Lines.Clear();
Lines.Add(new TransactionLine());
RefreshPartNumbers();
}
[RelayCommand]
private void DeleteDeduction(Deduction? deduction)
{
if (deduction is null) return;
foreach (var line in deduction.Lines)
{
var part = _appData.Parts.FirstOrDefault(p => p.InternalPartNumber == line.PartInternalNumber);
if (part is not null)
part.StockQuantity += line.Quantity;
}
_appData.Deductions.Remove(deduction);
Deductions.Remove(deduction);
_dataService.Save(_appData);
RefreshPartNumbers();
}
private void RefreshPartNumbers()
{
PartNumbers.Clear();
foreach (var p in _appData.Parts.OrderBy(p => p.InternalPartNumber))
PartNumbers.Add(p.InternalPartNumber);
}
private void WriteDeliveryNote(Deduction deduction)
{
var path = string.IsNullOrWhiteSpace(_appData.Settings.StoragePath)
? Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)
: _appData.Settings.StoragePath;
if (!Directory.Exists(path))
Directory.CreateDirectory(path);
var fileName = Path.Combine(path, $"DeliveryNote_{deduction.Id:N}_{deduction.Date:yyyyMMdd}.txt");
var sb = new StringBuilder();
sb.AppendLine("Delivery Note");
sb.AppendLine($"Company: {_appData.Settings.CompanyName}");
sb.AppendLine($"Date: {deduction.Date:yyyy-MM-dd}");
sb.AppendLine($"Customer: {deduction.Customer}");
sb.AppendLine();
foreach (var line in deduction.Lines)
{
var part = _appData.Parts.FirstOrDefault(p => p.InternalPartNumber == line.PartInternalNumber);
sb.AppendLine($"Part: {line.PartInternalNumber} Qty: {line.Quantity}");
if (part is not null)
{
sb.AppendLine($" Description: {part.Description}");
sb.AppendLine($" MSRP: {part.Msrp:C}");
sb.AppendLine($" Line Total: {part.Msrp * line.Quantity:C}");
}
sb.AppendLine();
}
var grandTotal = deduction.Lines
.Sum(l => (_appData.Parts.FirstOrDefault(p => p.InternalPartNumber == l.PartInternalNumber)?.Msrp ?? 0) * l.Quantity);
sb.AppendLine($"Grand Total: {grandTotal:C}");
sb.AppendLine();
sb.AppendLine($"Comment: {deduction.Comment}");
File.WriteAllText(fileName, sb.ToString());
}
}