Initial commit

Initial commit til Git.
V2 er deployed
This commit is contained in:
2026-06-13 17:31:50 +02:00
parent 9fcd2b145e
commit 41e23b6184
375 changed files with 15956 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();
}
}
}