Print problemer

Har muligvis rettet den print fejl der er - men mangler at få det testet.
Der er slettet en masse projekter som ikke bliver brugt mere.
Og flyttet rundt på de få projekter som er tilbage.
Dette er V2 og i sit eget repo, så dette er initial commit
This commit is contained in:
2026-07-15 22:40:53 +02:00
commit 170a03e7df
330 changed files with 14118 additions and 0 deletions

View File

@@ -0,0 +1,513 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Markup.Localizer;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using Database.Models;
using Pos.Models;
using Pos.Service;
namespace Pos
{
/// <summary>
/// Interaction logic for SalesWindow.xaml
/// </summary>
public partial class SalesWindow : Window
{
private ObservableCollection<EmployeeEntity> _employees;
private ObservableCollection<ProductGroupEntity> _productGroups;
private ObservableCollection<SaleGridModel> _saleGridModels;
private ObservableCollection<AmountGridModel> _paymentGridModels;
private List<PriceLineModel> _priceLineModels;
private ProductEntity _selectedProduct;
private ProductGroupEntity _selectedProductGroup;
private int _employeeId = -1;
private int _productGroupId = -1;
private int _productId = -1;
private int _numberOfProducts = 1;
private int _selectedSaleGridIndex = -1;
private int _maxCharOfName = 0;
private decimal _price = 0;
private decimal _totalPrice = 0;
private Button _prevEmpButton = new Button();
private Button _prevProductGroupButton = new Button();
private Button _prevProduct = new Button();
public SalesWindow()
{
InitializeComponent();
InitialLoad();
}
private void InitialLoad()
{
CacheService.Invalidate();
_employees = CacheService.GetEmployee() as ObservableCollection<EmployeeEntity>;
_productGroups = CacheService.GetProductGroupsIncludeProducts() as ObservableCollection<ProductGroupEntity>;
_saleGridModels = new ObservableCollection<SaleGridModel>();
_priceLineModels = new List<PriceLineModel>();
_paymentGridModels = new ObservableCollection<AmountGridModel>();
SaleGrid.ItemsSource = _saleGridModels;
PaymentGrid.ItemsSource = _paymentGridModels;
BuildEmployee();
BuildProductGroup();
ManipulateBuySection();
UpdateWindowTitle();
foreach (var productGroup in _productGroups)
{
if (_maxCharOfName < productGroup.Name.Length)
_maxCharOfName = productGroup.Name.Length;
foreach (ProductEntity product in productGroup.Products)
{
if (_maxCharOfName < product.Name.Length)
_maxCharOfName = product.Name.Length;
}
}
}
private void BtnPrGr_Click(object sender, RoutedEventArgs e)
{
_productId = -1;
_prevProductGroupButton.Style = (Style)FindResource("SaleButtons");
Button button = sender as Button;
_prevProductGroupButton = button;
button.Style = (Style)FindResource("SaleButtonsActive");
_productGroupId = (int)button.Tag;
_selectedProductGroup = _productGroups.Single(c => c.Id == _productGroupId);
BuildProducts(_selectedProductGroup.Products);
ManipulateBuySection();
}
private void BtnProduct_Click(object sender, RoutedEventArgs e)
{
_prevProduct.Style = (Style)FindResource("SaleButtons");
Button button = sender as Button;
_prevProduct = button;
button.Style = (Style)FindResource("SaleButtonsActive");
_productId = (int)button.Tag;
_selectedProduct = _selectedProductGroup.Products.Single(c => c.Id == _productId);
ManipulateBuySection();
}
private void BtnEmp_Click(object sender, RoutedEventArgs e)
{
_prevEmpButton.Style = (Style)FindResource("SaleButtons");
_prevProductGroupButton.Style = (Style)FindResource("SaleButtons");
//DockProduct.Children.Clear();
Button button = sender as Button;
_prevEmpButton = button;
button.Style = (Style)FindResource("SaleButtonsActive");
_employeeId = (int) button.Tag;
UIElementCollection employees = DockProductGroup.Children;
foreach (UIElement emp in employees)
{
button = (Button)emp;
button.IsEnabled = true;
}
}
private void SaleGrid_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
DataGrid dg = (DataGrid)sender;
_selectedSaleGridIndex = dg.SelectedIndex;
}
private void NumberOfProducts_GotFocus(object sender, RoutedEventArgs e)
{
NumberOfProducts.Text = string.Empty;
}
private void Buy_Click(object sender, RoutedEventArgs e)
{
bool isValid = ValidatePriceInput();
if (!isValid)
return;
isValid = ValidateNumberOfProductsInput();
if (!isValid)
return;
decimal price = Convert.ToDecimal(Price.Text);
int number = Convert.ToInt32(NumberOfProducts.Text);
NumberOfProducts.Text = "1";
Price.Text = string.Empty;
TotalPrice.Content = "0";
BuildPrice(false);
_productId = -1;
_productGroupId = -1;
ManipulateBuySection();
}
private void Payment_Click(object sender, RoutedEventArgs e)
{
//bool isValid = ValidateAmountInput();
//if (!isValid)
// return;
decimal amount = -1;
if (!string.IsNullOrEmpty(Amount.Text))
amount = Convert.ToDecimal(Amount.Text);
Amount.Text = string.Empty;
Button button = sender as Button;
BuildAmuntDataGrid(amount,(string)button.Tag);
}
private void NumberOfProducts_LostFocus(object sender, RoutedEventArgs e)
{
bool isValid = ValidateNumberOfProductsInput();
if (!isValid)
return;
CalculateSubPrice();
}
private void Price_KeyUp(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
Buy_Click(null,null);
}
else
{
CalculateSubPrice();
}
}
private void BuildEmployee()
{
DockProductGroup.Children.Clear();
//DockProduct.Children.Clear();
DockEmployee.Children.Clear();
bool firstEmployee = true;
foreach (EmployeeEntity employee in _employees)
{
Button btnEmp = new Button();
btnEmp.Style = (Style)FindResource("SaleButtons");
btnEmp.Content = employee.Name;
btnEmp.Tag = employee.Id;
btnEmp.Click += BtnEmp_Click;
DockEmployee.Children.Add(btnEmp);
if (firstEmployee)
{
firstEmployee = false;
btnEmp.RaiseEvent(new RoutedEventArgs(ButtonBase.ClickEvent));
}
}
}
private void BuildProductGroup()
{
DockProductGroup.Children.Clear();
foreach (ProductGroupEntity productGroup in _productGroups)
{
Button btnPrGr = new Button();
btnPrGr.Style = (Style)FindResource("SaleButtons");
btnPrGr.Content = productGroup.Name;
btnPrGr.Tag = productGroup.Id;
btnPrGr.Click += BtnPrGr_Click;
if (_employeeId == -1)
btnPrGr.IsEnabled = false;
DockProductGroup.Children.Add(btnPrGr);
}
}
private void BuildProducts(ICollection<ProductEntity> products)
{
// DockProduct.Children.Clear();
foreach (ProductEntity product in products)
{
Button btnProduct = new Button();
btnProduct.Style = (Style)FindResource("SaleButtons");
btnProduct.Content = product.Name;
btnProduct.Tag = product.Id;
btnProduct.Click += BtnProduct_Click;
// DockProduct.Children.Add(btnProduct);
}
}
private void BuildPrice(bool returnProduct)
{
PriceLineModel pModel = new PriceLineModel();
pModel.NumberProducts = _numberOfProducts;
pModel.Price = _price;
if (_selectedProduct != null)
{
pModel.Id = _selectedProduct.Id;
pModel.Name = _selectedProduct.Name;
pModel.IsProductGroup = false;
}
else
{
pModel.Id = _selectedProductGroup.Id;
pModel.Name = _selectedProductGroup.Name;
pModel.IsProductGroup = true;
}
BuildPriceDataGrid(pModel);
//BuildEmployee();
BuildProductGroup();
}
private void CalculateSubPrice()
{
_price = 0;
bool isValid = decimal.TryParse(Price.Text, out _price);
if (!isValid)
return;
isValid = Int32.TryParse(NumberOfProducts.Text, out _numberOfProducts);
if (!isValid)
return;
TotalPrice.Content = _price * _numberOfProducts;
}
private void CalculateTotalLine()
{
_totalPrice = 0;
foreach (PriceLineModel model in _priceLineModels)
{
_totalPrice += model.Price * model.NumberProducts;
}
Total.Content = $"At betale: Kr. {_totalPrice}";
}
private void BuildPriceDataGrid(PriceLineModel priceLineModel)
{
_selectedProduct = null;
_selectedProductGroup = null;
_numberOfProducts = 1;
_priceLineModels.Add(priceLineModel);
CalculateTotalLine();
SaleGridModel model = new SaleGridModel();
model.Navn = priceLineModel.Name;
model.Pris = $"kr. {priceLineModel.Price}";
model.Stk = $"- {priceLineModel.NumberProducts} stk. à";
model.Total = $"= Kr. {priceLineModel.NumberProducts * priceLineModel.Price}";
SaleGridInternalModel saleGridInternalModel = new SaleGridInternalModel();
saleGridInternalModel.InternPrice = priceLineModel.Price;
saleGridInternalModel.InternPieces = priceLineModel.NumberProducts;
model.SaleGridInternalModel = saleGridInternalModel;
//model.InternPrice = priceLineModel.Price;
//model.InternPieces = priceLineModel.NumberProducts;
_saleGridModels.Add(model);
}
private bool ValidateNumberOfProductsInput()
{
int notUsed;
bool isValid = Int32.TryParse(NumberOfProducts.Text, out notUsed);
if (!isValid)
{
MessageBox.Show($"{NumberOfProducts.Text} er ikke en gyldig værdi! \nSætter 1 som standard værdi ", "Ikke gyldig værdi",
MessageBoxButton.OK, MessageBoxImage.Error);
NumberOfProducts.Text = "1";
return false;
}
return true;
}
private bool ValidatePriceInput()
{
decimal p = 0;
bool isValid = Decimal.TryParse(Price.Text, out p);
if (!isValid)
{
string msg = "";
if (string.IsNullOrEmpty(Price.Text))
{
msg = "En tom pris er ikke en gyldig værdi!";
}
else
{
msg = $"{Price.Text} er ikke en gyldig pris!";
}
MessageBox.Show(msg, "Ugyldig pris", MessageBoxButton.OK,
MessageBoxImage.Error);
return false;
}
return true;
}
private bool ValidateAmountInput()
{
decimal p = 0;
bool isValid = Decimal.TryParse(Amount.Text, out p);
if (!isValid)
{
string msg = "";
if (string.IsNullOrEmpty(Amount.Text))
{
msg = "Et tomt beløb er ikke en gyldig værdi!";
}
else
{
msg = $"{Amount.Text} er ikke et gyldigt beløb!";
}
MessageBox.Show(msg, "Ugyldigt beløb", MessageBoxButton.OK,
MessageBoxImage.Error);
return false;
}
return true;
}
private void ManipulateBuySection()
{
bool enabled = _productGroupId > 0 || _productId > 0;
PricePanel.IsEnabled = enabled;
NumberOfProducts.IsEnabled = enabled;
Price.IsEnabled = enabled;
Price.Focus();
BtnBuy.IsEnabled = enabled;
LblStk.IsEnabled = enabled;
LblPrice.IsEnabled = enabled;
LblTotal.IsEnabled = enabled;
TotalPrice.IsEnabled = enabled;
}
private void BuildAmuntDataGrid(decimal amount, string paymentMethod)
{
if (amount == -1)
{
amount = 0;
foreach (PriceLineModel lineModel in _priceLineModels)
{
amount += (lineModel.Price * lineModel.NumberProducts);
}
}
AmountGridModel amountGridModel = new AmountGridModel();
amountGridModel.Amount = amount;
amountGridModel.AmountText = $"Kr. {amount}";
switch (paymentMethod)
{
case "PaymentMethod.Card":
amountGridModel.PaymentMethodText = "Kort";
break;
case "PaymentMethod.Cash":
amountGridModel.PaymentMethodText = "Kontant";
break;
case "PaymentMethod.GiftCard":
amountGridModel.PaymentMethodText = "Gavekort";
break;
case "PaymentMethod.MobilePay":
amountGridModel.PaymentMethodText = "MobilePay";
break;
}
_paymentGridModels.Add(amountGridModel);
AmountPayed();
}
private void AmountPayed()
{
decimal amountPayed = 0;
foreach (AmountGridModel paymentGridModel in _paymentGridModels)
{
amountPayed += paymentGridModel.Amount;
}
if (amountPayed == _totalPrice)
{
btnFinish_Click(null,null);
return;
}
if (amountPayed > _totalPrice)
{
lblRecived.Content = $"Byttepenge: Kr. {amountPayed - _totalPrice}";
Style style = this.FindResource("BoldLabelWarningNoMargin") as Style;
lblRecived.Style = style;
btnFinish.IsEnabled = true;
}
else
{
lblRecived.Content = $"At betale: Kr. {_totalPrice - amountPayed}";
Style style = this.FindResource("BoldLabelNoMargin") as Style;
lblRecived.Style = style;
}
}
private void SaleGrid_KeyUp(object sender, KeyEventArgs e)
{
if (e.Key == Key.Delete)
{
if (_selectedSaleGridIndex == -1)
return;
int index = _selectedSaleGridIndex;
//_saleGridModels.RemoveAt(_selectedSaleGridIndex);
_priceLineModels.RemoveAt(index);
_selectedSaleGridIndex = -1;
CalculateTotalLine();
}
}
private void btnFinish_Click(object sender, RoutedEventArgs e)
{
SaleService saleService = new SaleService();
saleService.Save(_saleGridModels.ToList(),_paymentGridModels.ToList(),_employeeId);
_paymentGridModels.Clear();
_priceLineModels.Clear();
UpdateWindowTitle();
_totalPrice = 0;
_saleGridModels.Clear();
lblRecived.Content = string.Empty;
_selectedSaleGridIndex = -1;
btnFinish.IsEnabled = false;
CalculateTotalLine();
BuildEmployee();
BuildProductGroup();
ManipulateBuySection();
}
private void BtnPrint_Click(object sender, RoutedEventArgs e)
{
SaleService saleService = new SaleService();
saleService.PrintReceipt();
}
private void UpdateWindowTitle()
{
SaleService saleService = new SaleService();
Title = saleService.LastAndTotalSale();
}
}
}