Major refactor of the Sales Form and Bill controller to make code more readable and less error prone.

The functions now only do one thing.
This commit is contained in:
tanshu
2016-03-31 12:27:39 +05:30
parent bb2db24837
commit 51d518d2a0
17 changed files with 615 additions and 396 deletions

View File

@ -15,17 +15,17 @@ namespace Tanshu.Accounts.Entities
Settlements = new List<VoucherSettlement>(); Settlements = new List<VoucherSettlement>();
} }
public Voucher(User user) public Voucher(User user, Customer customer)
: this() : this()
{ {
this.User = user; this.User = user;
VoucherType = VoucherType.Regular; VoucherType = VoucherType.Regular;
Customer = customer;
} }
public Voucher(User user, Customer customer, FoodTable table, bool printed, bool isVoid, string narration) public Voucher(User user, Customer customer, FoodTable table, bool printed, bool isVoid, string narration)
: this(user) : this(user, customer)
{ {
Customer = customer;
Table = table; Table = table;
Printed = printed; Printed = printed;
Void = isVoid; Void = isVoid;

View File

@ -1,102 +0,0 @@
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using Tanshu.Data;
using Tanshu.Accounts.Entities;
namespace Tanshu.Accounts.Helpers
{
public class SelectCustomer : Tanshu.Data.BaseSelector<Customer>
{
public event CustomerEventHandler CustomerEvent;
public SelectCustomer(GetData<Customer> getData, bool autoClose) : base(getData, true, "List of Products")
{
var filters = new List<string> {"Universal"};
SetFilterColumns(filters);
grid.Columns["CustomerID"].Visible = false;
}
protected override void FilterChanged(Dictionary<string, string> filter)
{
//data = new CustomerBI().GetFilteredCustomers(filter["Universal"].Split(' ')).ToList();
data = getData(filter);
bindingSource.DataSource = data;
}
protected override void UpdateDisplay(Customer item)
{
DisplayLabel = item == null ? "" : string.Format("Chosen Customer is {0} with phone number {1}", item.Name, item.Phone);
}
protected override Customer HandleKeydown(object sender, ExtendedKeyEventArgs e)
{
var customer = bindingSource.Current as Customer;
if (CustomerEvent == null)
{
e.Handled = false;
return customer;
}
Guid? id = null;
if ((customer != null) && (e.KeyCode == Keys.F2))
id = customer.CustomerID;
if ((e.KeyCode == Keys.F1) || (e.KeyCode == Keys.F2))
{
customer = CustomerEvent(sender, new CustomerEventArgs(id, base.filterColumns["Universal"]));
e.Handled = customer != null;
}
return customer;
}
#region Designer Code
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
}
#endregion
#endregion
}
public delegate Customer CustomerEventHandler(object sender, CustomerEventArgs e);
public class CustomerEventArgs : EventArgs
{
public CustomerEventArgs(Guid? customerID, string phone)
{
CustomerID = customerID;
Phone = phone;
}
public Guid? CustomerID
{
get;
private set;
}
public string Phone
{
get;
private set;
}
}
}

View File

@ -70,9 +70,6 @@
<Compile Include="SelectVoidReason.cs"> <Compile Include="SelectVoidReason.cs">
<SubType>Form</SubType> <SubType>Form</SubType>
</Compile> </Compile>
<Compile Include="SelectCustomer.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -13,8 +13,8 @@ namespace Tanshu.Accounts.PointOfSale
{ {
public class BillController public class BillController
{ {
private readonly BillDict _bill; public readonly BillDict _bill;
private Voucher _voucher; public Voucher _voucher;
private Guid? _editVoucherID; private Guid? _editVoucherID;
private ISaleForm _saleForm; private ISaleForm _saleForm;
@ -22,45 +22,13 @@ namespace Tanshu.Accounts.PointOfSale
{ {
this._editVoucherID = editVoucherID; this._editVoucherID = editVoucherID;
_bill = new BillDict(); _bill = new BillDict();
_voucher = new Voucher(Session.User);
using (var bi = new CustomerBI()) using (var bi = new CustomerBI())
_voucher.Customer = bi.Get(x => x.CustomerID == Constants.CASH_CUSTOMER); _voucher = new Voucher(Session.User, bi.Get(x => x.CustomerID == Constants.CASH_CUSTOMER));
}
public BillItemValue CurrentProduct
{
get
{
if (_saleForm.BindingSource.Position == -1)
return null;
var item = _bill.ElementAt(_saleForm.BindingSource.Position);
return item.Key.BillItemType != BillItemType.Kot ? item.Value : null;
}
}
public BillItemKey CurrentKey
{
get
{
if (_saleForm.BindingSource.Position == -1)
return null;
var item = _bill.ElementAt(_saleForm.BindingSource.Position);
return item.Key;
}
}
public BillItemKey CurrentKot
{
get
{
if (_saleForm.BindingSource.Position == -1)
return null;
var item = _bill.ElementAt(_saleForm.BindingSource.Position);
return item.Key.BillItemType == BillItemType.Kot ? item.Key : null;
}
} }
public void InitGui(ISaleForm saleForm) public void InitGui(ISaleForm saleForm)
{ {
this._saleForm = saleForm; this._saleForm = saleForm;
this._saleForm.SetCustomerDisplay(_voucher.Customer.Name);
this._saleForm.SetUserName(Session.User.Name); this._saleForm.SetUserName(Session.User.Name);
} }
public void AddProduct(Product product) public void AddProduct(Product product)
@ -69,7 +37,6 @@ namespace Tanshu.Accounts.PointOfSale
if (_bill.ContainsKey(newKey)) if (_bill.ContainsKey(newKey))
{ {
_saleForm.BindingSource.CurrencyManager.Position = _bill.IndexOfKey(newKey);
_bill[newKey].inventory.Quantity += 1; _bill[newKey].inventory.Quantity += 1;
} }
else else
@ -82,32 +49,20 @@ namespace Tanshu.Accounts.PointOfSale
billItemValue.inventory.Price = old.Value.inventory.Price; billItemValue.inventory.Price = old.Value.inventory.Price;
} }
_bill.Add(newKey, billItemValue); _bill.Add(newKey, billItemValue);
_saleForm.BindingSource.DataSource = _bill.ToList();
_saleForm.BindingSource.CurrencyManager.Position = _saleForm.BindingSource.CurrencyManager.Count - 1;
using (var bi = new ProductGroupModifierBI())
if (bi.HasCompulsoryModifier(product.ProductGroup.ProductGroupID))
{
ShowModifiers();
}
} }
ShowAmount();
} }
public void ShowModifiers()
public void ShowModifiers(BillItemValue item)
{ {
var item = CurrentProduct;
if (item == null || CurrentKey.KotID != Guid.Empty)
return; // No Product or Old Product
using (var frm = new ModifierForm(Cache.ProductGroupModifiers(item.inventory.Product.ProductGroup.ProductGroupID), item.inventory.InventoryModifier)) using (var frm = new ModifierForm(Cache.ProductGroupModifiers(item.inventory.Product.ProductGroup.ProductGroupID), item.inventory.InventoryModifier))
{ {
frm.ShowDialog(); frm.ShowDialog();
} }
ShowAmount();
} }
public void SetDiscount() public void SetDiscount()
{ {
if (!Session.IsAllowed("Discount")) if (!Session.IsAllowed("Discount"))
return; // throw new PermissionException("Not Allowed to give Discount"); return;
using (var bi = new ProductGroupBI()) using (var bi = new ProductGroupBI())
{ {
@ -119,7 +74,7 @@ namespace Tanshu.Accounts.PointOfSale
var discount = frm.Selection(out outList); var discount = frm.Selection(out outList);
discount = discount / 100; discount = discount / 100;
if (discount > 1 || discount < 0) if (discount > 1 || discount < 0)
return; // throw new ValidationException("Invalid Discount Amount"); return;
foreach (var item in _bill.Where(x => x.Key.BillItemType == BillItemType.Product && outList.Contains(x.Value.inventory.Product.ProductGroup.GroupType))) foreach (var item in _bill.Where(x => x.Key.BillItemType == BillItemType.Product && outList.Contains(x.Value.inventory.Product.ProductGroup.GroupType)))
{ {
@ -133,12 +88,9 @@ namespace Tanshu.Accounts.PointOfSale
} }
} }
} }
ShowAmount();
} }
public void SetQuantity(decimal quantity, bool prompt) public void SetQuantity(BillItemKey key, BillItemValue item, decimal quantity, bool prompt)
{ {
var item = CurrentProduct;
var key = CurrentKey;
if (item == null || key.KotID != Guid.Empty) if (item == null || key.KotID != Guid.Empty)
return; // No Product or Old Product return; // No Product or Old Product
if (prompt && !GetInput("Quantity", ref quantity)) if (prompt && !GetInput("Quantity", ref quantity))
@ -147,21 +99,14 @@ namespace Tanshu.Accounts.PointOfSale
quantity += item.inventory.Quantity; quantity += item.inventory.Quantity;
if (quantity < 0 && !Session.IsAllowed("Edit Printed Product")) if (quantity < 0 && !Session.IsAllowed("Edit Printed Product"))
return; return;
//TODO: check if he kotid of the item is not null var total = quantity + _bill.Where(x => x.Key.ProductID == key.ProductID && x.Key.KotID != Guid.Empty && x.Key.BillItemType == key.BillItemType).Sum(x => x.Value.inventory.Quantity);
//var total = quantity + _bill.Where(x => x.Key.ProductID == item.ProductID && x.Key.BillItemType == BillItemType.Product && x.Value.Printed).Sum(x => x.Value.Quantity); quantity = Math.Max(quantity, 0);
var total = quantity + _bill.Where(x => x.Key.ProductID == key.ProductID && x.Key.BillItemType == key.BillItemType).Sum(x => x.Value.inventory.Quantity);
if (total < 0)
quantity -= total;
item.inventory.Quantity = quantity; item.inventory.Quantity = quantity;
ShowAmount();
} }
public void SetPrice() public void SetPrice(BillItemValue item)
{ {
var item = CurrentProduct;
if (item == null)
throw new ValidationException("No Product Selected");
if (!Session.IsAllowed("Change Rate")) if (!Session.IsAllowed("Change Rate"))
throw new PermissionException("Price Change not Allowed"); return;
var price = item.inventory.Price; var price = item.inventory.Price;
if (!GetInput("Price", ref price)) if (!GetInput("Price", ref price))
return; return;
@ -169,46 +114,14 @@ namespace Tanshu.Accounts.PointOfSale
throw new PermissionException("NC of Product is not Allowed"); throw new PermissionException("NC of Product is not Allowed");
foreach (var sub in _bill.Where(x => x.Key.BillItemType == BillItemType.Product && x.Key.ProductID == item.inventory.Product.ProductID)) foreach (var sub in _bill.Where(x => x.Key.BillItemType == BillItemType.Product && x.Key.ProductID == item.inventory.Product.ProductID))
sub.Value.inventory.Price = price; sub.Value.inventory.Price = price;
ShowAmount();
} }
public void ShowCustomers(bool reset) public void ShowCustomers()
{ {
if (!reset && ((_voucher.Customer == null) || _voucher.Customer.CustomerID == Constants.CASH_CUSTOMER)) using (var frm = new CustomerListForm())
{ {
using (var selectCustomer = new SelectCustomer(CustomerBI.StaticList, true)) frm.ShowDialog();
{ _voucher.Customer = frm.SelectedItem;
selectCustomer.CustomerEvent += selectCustomer_customerEvent;
selectCustomer.ShowDialog();
if (selectCustomer.SelectedItem != null)
{
_voucher.Customer = selectCustomer.SelectedItem;
}
else
{
using (var bi = new CustomerBI())
_voucher.Customer = bi.Get(x => x.CustomerID == Constants.CASH_CUSTOMER);
}
}
} }
else
{
using (var bi = new CustomerBI())
_voucher.Customer = bi.Get(x => x.CustomerID == Constants.CASH_CUSTOMER);
}
_saleForm.SetCustomerDisplay(_voucher.Customer.Name);
}
private Customer selectCustomer_customerEvent(object sender, CustomerEventArgs e)
{
using (var form = new CustomersForm(e.CustomerID, e.Phone))
{
form.ShowDialog();
return form.Customer;
}
}
private void ShowAmount()
{
_saleForm.ShowAmount(_bill.Discount, _bill.NetAmount, _bill.ServiceCharge, _bill.Tax, _bill.Amount, _bill);
} }
private static bool IsPrintedOrVoid(Voucher voucher) private static bool IsPrintedOrVoid(Voucher voucher)
{ {
@ -236,13 +149,10 @@ namespace Tanshu.Accounts.PointOfSale
{ {
_voucher = bi.Get(x => x.VoucherID == voucherID); _voucher = bi.Get(x => x.VoucherID == voucherID);
_bill.Clear(); _bill.Clear();
_saleForm.ShowInfo(_voucher);
_bill.Load(_voucher); _bill.Load(_voucher);
var newKotKey = new BillItemKey(Guid.Empty); var newKotKey = new BillItemKey(Guid.Empty);
var newKotItem = new BillItemValue(); var newKotItem = new BillItemValue();
_bill.Add(newKotKey, newKotItem); _bill.Add(newKotKey, newKotItem);
ShowAmount();
_saleForm.FormState = SaleFormState.Billing;
} }
} }
public void LoadBill(string tableName) public void LoadBill(string tableName)
@ -261,37 +171,37 @@ namespace Tanshu.Accounts.PointOfSale
frm.ShowDialog(); frm.ShowDialog();
_voucher.Table = table; _voucher.Table = table;
_voucher.Pax = frm.Pax; _voucher.Pax = frm.Pax;
_saleForm.ShowInfo(_voucher);
} }
} }
} }
public void CancelBillChanges() public bool CancelBillChanges()
{ {
if (_bill.Any(x => x.Key.BillItemType != BillItemType.Kot) && if (_bill.Any(x => x.Key.BillItemType != BillItemType.Kot) &&
MessageBox.Show("Abandon Changes?", "Abandon Changes", MessageBoxButtons.YesNo, MessageBox.Show("Abandon Changes?", "Abandon Changes", MessageBoxButtons.YesNo,
MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.No) MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.No)
return; return false;
ClearBill(); ClearBill();
return true;
} }
public void ClearBill() public void ClearBill()
{ {
_voucher = new Voucher(Session.User); using (var bi = new CustomerBI())
ShowCustomers(true); _voucher = new Voucher(Session.User, bi.Get(x => x.CustomerID == Constants.CASH_CUSTOMER));
_bill.Clear(); _bill.Clear();
var newKotKey = new BillItemKey(Guid.Empty); var newKotKey = new BillItemKey(Guid.Empty);
var newKotItem = new BillItemValue(); var newKotItem = new BillItemValue();
_bill.Add(newKotKey, newKotItem); _bill.Add(newKotKey, newKotItem);
_saleForm.ClearBill(_bill);
} }
public SaleFormState FormLoad() public SaleFormState FormLoad()
{ {
ClearBill();
if (_editVoucherID.HasValue) if (_editVoucherID.HasValue)
{ {
FoodTable ft = new FoodTableBI().Get(x => x.VoucherID == _editVoucherID.Value); FoodTable ft = new FoodTableBI().Get(x => x.VoucherID == _editVoucherID.Value);
if (ft == null) if (ft == null)
{
LoadBill(_editVoucherID.Value); LoadBill(_editVoucherID.Value);
}
else else
{ {
_editVoucherID = null; _editVoucherID = null;
@ -301,10 +211,10 @@ namespace Tanshu.Accounts.PointOfSale
} }
return SaleFormState.Waiting; return SaleFormState.Waiting;
} }
internal void SettleBill() internal bool SettleBill()
{ {
if (_voucher.VoucherID == Guid.Empty || !_voucher.Printed || !Session.IsAllowed("Settle Bill")) if (_voucher.VoucherID == Guid.Empty || !_voucher.Printed || !Session.IsAllowed("Settle Bill"))
return; return false;
IDictionary<SettleOption, decimal> options; IDictionary<SettleOption, decimal> options;
var amount = -1 * _voucher.Kots.Sum(x => x.Inventories.Sum(y => y.Amount)); var amount = -1 * _voucher.Kots.Sum(x => x.Inventories.Sum(y => y.Amount));
using (var frm = new SettleChoicesForm(Math.Round(amount) * -1, _voucher.VoucherType)) using (var frm = new SettleChoicesForm(Math.Round(amount) * -1, _voucher.VoucherType))
@ -313,7 +223,7 @@ namespace Tanshu.Accounts.PointOfSale
options = frm.OptionsChosen; options = frm.OptionsChosen;
} }
if (options.Count == 0) if (options.Count == 0)
return; return false;
using (var bi = new VoucherBI()) using (var bi = new VoucherBI())
{ {
bi.SettleVoucher(Session.User, _voucher.VoucherID, options); bi.SettleVoucher(Session.User, _voucher.VoucherID, options);
@ -322,6 +232,7 @@ namespace Tanshu.Accounts.PointOfSale
bi.SaveChanges(); bi.SaveChanges();
} }
ClearBill(); ClearBill();
return true;
} }
#region Move Table(s) / Kot(s) #region Move Table(s) / Kot(s)
@ -338,11 +249,11 @@ namespace Tanshu.Accounts.PointOfSale
return null; return null;
} }
} }
internal void MoveKot() internal void MoveKot(BillItemKey currentKot)
{ {
if (_voucher.VoucherID == Guid.Empty || IsPrintedOrVoid(_voucher)) if (_voucher.VoucherID == Guid.Empty || IsPrintedOrVoid(_voucher))
return; return;
var kot = CurrentKot; var kot = currentKot;
if (kot == null) if (kot == null)
return; return;
var table = GetTableForMove(true); var table = GetTableForMove(true);
@ -368,7 +279,9 @@ namespace Tanshu.Accounts.PointOfSale
//Merge Table //Merge Table
voucherID = MergeTable(table); voucherID = MergeTable(table);
if (voucherID != Guid.Empty) if (voucherID != Guid.Empty)
{
LoadBill(voucherID); LoadBill(voucherID);
}
} }
internal void MoveTable() internal void MoveTable()
{ {
@ -439,15 +352,31 @@ namespace Tanshu.Accounts.PointOfSale
#endregion #endregion
#region Save #region Save
public void SaveKot() public bool SaveAndPrintKot()
{ {
#region Check if Allowed #region Check if Allowed
if (!Session.IsAllowed("Print Kot")) if (!Session.IsAllowed("Print Kot") || _bill.Count(x => x.Key.BillItemType == BillItemType.Product) == 0)
return; return false;
bool isPrinted = false, isVoid = false;
if (_voucher.VoucherID != Guid.Empty)
using (var bi = new VoucherBI())
{
var dbVoucher = bi.Get(x => x.VoucherID == _voucher.VoucherID);
isPrinted = dbVoucher.Printed;
isVoid = dbVoucher.Void;
}
if (isVoid)
{
MessageBox.Show(string.Format("This Bill is already void.\nReason: {0}", _voucher.VoidReason), "Bill already Voided", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
if (isPrinted)
{
MessageBox.Show(string.Format("This Bill is already printed and a kot cannot be added", _voucher.VoidReason), "Bill already Printed", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
if (_voucher.VoucherID != Guid.Empty && IsPrintedOrVoid(_voucher)) if (_voucher.VoucherID != Guid.Empty && IsPrintedOrVoid(_voucher))
return; return false;
if (_bill.Count == 1) //new kot only
return;
#endregion #endregion
//Save //Save
@ -461,15 +390,16 @@ namespace Tanshu.Accounts.PointOfSale
if (_editVoucherID.HasValue) if (_editVoucherID.HasValue)
_saleForm.CloseWindow(); _saleForm.CloseWindow();
else else
{
ClearBill(); ClearBill();
}
return true;
} }
public void SaveBill() public bool SaveAndPrintBill()
{ {
#region Check if Allowed #region Check if Allowed
if (!Session.IsAllowed("Print Bill")) if (!Session.IsAllowed("Print Bill") || _bill.Count(x => x.Key.BillItemType == BillItemType.Product) == 0)
return; return false;
if (_bill.Count == 1) //new kot only
return;
bool isPrinted = false, isVoid = false; bool isPrinted = false, isVoid = false;
if (_voucher.VoucherID != Guid.Empty) if (_voucher.VoucherID != Guid.Empty)
using (var bi = new VoucherBI()) using (var bi = new VoucherBI())
@ -481,10 +411,10 @@ namespace Tanshu.Accounts.PointOfSale
if (isVoid) if (isVoid)
{ {
MessageBox.Show(string.Format("This Bill is already void.\nReason: {0}", _voucher.VoidReason), "Bill already Voided", MessageBoxButtons.OK, MessageBoxIcon.Error); MessageBox.Show(string.Format("This Bill is already void.\nReason: {0}", _voucher.VoidReason), "Bill already Voided", MessageBoxButtons.OK, MessageBoxIcon.Error);
return; return false;
} }
if (isPrinted && !Session.IsAllowed("Edit Printed Bill")) if (isPrinted && !Session.IsAllowed("Edit Printed Bill"))
return; return false;
#endregion #endregion
var amount = _bill.NetAmount; var amount = _bill.NetAmount;
@ -501,15 +431,19 @@ namespace Tanshu.Accounts.PointOfSale
{ {
frm.ShowDialog(); frm.ShowDialog();
if (!frm.Selection.HasValue) if (!frm.Selection.HasValue)
return; return false;
_voucher.VoucherType = frm.Selection.Value; _voucher.VoucherType = frm.Selection.Value;
} }
var saved = _voucher.VoucherID == Guid.Empty ? InsertVoucher(true, !_editVoucherID.HasValue) : UpdateVoucher(true, !_editVoucherID.HasValue); if (_voucher.VoucherID == Guid.Empty)
InsertVoucher(true, !_editVoucherID.HasValue);
else
UpdateVoucher(true, !_editVoucherID.HasValue);
} }
Thermal.PrintBill(_voucher.VoucherID); Thermal.PrintBill(_voucher.VoucherID);
if (_editVoucherID.HasValue) if (_editVoucherID.HasValue)
_saleForm.CloseWindow(); _saleForm.CloseWindow();
ClearBill(); ClearBill();
return true;
} }
public void SplitBill() public void SplitBill()
{ {
@ -559,9 +493,8 @@ namespace Tanshu.Accounts.PointOfSale
return; return;
#region new voucherFirst #region new voucherFirst
var voucherFirst = new Voucher(Session.User) var voucherFirst = new Voucher(Session.User, _voucher.Customer)
{ {
Customer = _voucher.Customer,
Table = table, Table = table,
Printed = isPrinted, Printed = isPrinted,
Void = false, Void = false,
@ -575,9 +508,8 @@ namespace Tanshu.Accounts.PointOfSale
#endregion #endregion
#region new voucherSecond #region new voucherSecond
var voucherSecond = new Voucher(Session.User) var voucherSecond = new Voucher(Session.User, _voucher.Customer)
{ {
Customer = _voucher.Customer,
Table = _voucher.Table, Table = _voucher.Table,
Printed = isPrinted, Printed = isPrinted,
Void = false, Void = false,
@ -604,36 +536,31 @@ namespace Tanshu.Accounts.PointOfSale
} }
LoadBill(voucherFirst.VoucherID); LoadBill(voucherFirst.VoucherID);
} }
public void VoidBill() public bool VoidBill()
{ {
#region Check conditions and Permissions #region Check conditions and Permissions
if (_voucher.VoucherID == Guid.Empty) if (_voucher.VoucherID == Guid.Empty || _voucher.Void || !Session.IsAllowed("Void Bill"))
return; return false;
if (_voucher.Void)
return;
if (!Session.IsAllowed("Void Bill"))
return;
if (MessageBox.Show("Are you sure you want to void this bill?", "Void Bill", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) != DialogResult.Yes) if (MessageBox.Show("Are you sure you want to void this bill?", "Void Bill", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) != DialogResult.Yes)
return; return false;
#endregion #endregion
var voidReason = new SelectVoidReason(GetVoidReason, true); var voidReason = new SelectVoidReason(GetVoidReason, true);
voidReason.ShowDialog(); voidReason.ShowDialog();
if (voidReason.SelectedItem != null) if (voidReason.SelectedItem != null)
{
using (var bi = new VoucherBI())
{
bi.VoidBill(_voucher.VoucherID, voidReason.SelectedItem.Description);
if (!_editVoucherID.HasValue)
bi.UpdateTable(x => x.FoodTableID == _voucher.Table.FoodTableID && x.VoucherID == _voucher.VoucherID, null, null);
bi.SaveChanges();
}
ClearBill();
}
else
{ {
MessageBox.Show("Please Select a reason if you want to void the bill", "Bill NOT Voided", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); MessageBox.Show("Please Select a reason if you want to void the bill", "Bill NOT Voided", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
return false;
} }
using (var bi = new VoucherBI())
{
bi.VoidBill(_voucher.VoucherID, voidReason.SelectedItem.Description);
if (!_editVoucherID.HasValue)
bi.UpdateTable(x => x.FoodTableID == _voucher.Table.FoodTableID && x.VoucherID == _voucher.VoucherID, null, null);
bi.SaveChanges();
}
ClearBill();
return true;
} }
private static List<StringType> GetVoidReason(Dictionary<string, string> filter) private static List<StringType> GetVoidReason(Dictionary<string, string> filter)
{ {
@ -658,9 +585,8 @@ namespace Tanshu.Accounts.PointOfSale
if (amountChanged || itemsChanged) // Discount or Products changed if (amountChanged || itemsChanged) // Discount or Products changed
{ {
#region new voucherFirst #region new voucherFirst
var newVoucher = new Voucher(Session.User) var newVoucher = new Voucher(Session.User, _voucher.Customer)
{ {
Customer = _voucher.Customer,
Table = _voucher.Table, Table = _voucher.Table,
Printed = true, Printed = true,
Void = false, Void = false,

View File

@ -2,6 +2,7 @@
using Tanshu.Accounts.Contracts; using Tanshu.Accounts.Contracts;
using Tanshu.Common; using Tanshu.Common;
using Tanshu.Accounts.Entities; using Tanshu.Accounts.Entities;
using System;
namespace Tanshu.Accounts.PointOfSale namespace Tanshu.Accounts.PointOfSale
{ {
@ -55,7 +56,7 @@ namespace Tanshu.Accounts.PointOfSale
{ {
get get
{ {
return this.Where(x => x.Key.BillItemType != BillItemType.Kot).Sum(i => i.Value.inventory.Amount); return Math.Round(this.Where(x => x.Key.BillItemType != BillItemType.Kot).Sum(i => i.Value.inventory.Amount));
} }
} }
} }

View File

@ -11,13 +11,7 @@ namespace Tanshu.Accounts.PointOfSale
{ {
public interface ISaleForm public interface ISaleForm
{ {
void ClearBill(BillDict bill);
void SetCustomerDisplay(string name);
void CloseWindow(); void CloseWindow();
void ShowAmount(decimal discountAmount, decimal grossAmount, decimal serviceChargeAmount, decimal taxAmount, decimal valueAmount, BillDict bill);
void ShowInfo(Voucher voucher);
void SetUserName(string name); void SetUserName(string name);
BindingSource BindingSource { get; }
SaleFormState FormState { set; }
} }
} }

View File

@ -55,7 +55,7 @@ namespace Tanshu.Accounts.PointOfSale
private void btnCustomer_Click(object sender, EventArgs e) private void btnCustomer_Click(object sender, EventArgs e)
{ {
using (var frm = new CustomersForm(null, "")) using (var frm = new CustomerListForm())
frm.ShowDialog(); frm.ShowDialog();
} }

View File

@ -1,6 +1,6 @@
 namespace Tanshu.Accounts.PointOfSale  namespace Tanshu.Accounts.PointOfSale
{ {
partial class CustomersForm partial class CustomerForm
{ {
/// <summary> /// <summary>
/// Required designer variable. /// Required designer variable.
@ -180,7 +180,7 @@
this.txtUniqueID.Text = "UniqueID"; this.txtUniqueID.Text = "UniqueID";
this.txtUniqueID.WordWrap = false; this.txtUniqueID.WordWrap = false;
// //
// CustomersForm // CustomerForm
// //
this.AcceptButton = this.btnSave; this.AcceptButton = this.btnSave;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
@ -204,10 +204,10 @@
this.Controls.Add(this.txtName); this.Controls.Add(this.txtName);
this.MaximizeBox = false; this.MaximizeBox = false;
this.MinimizeBox = false; this.MinimizeBox = false;
this.Name = "CustomersForm"; this.Name = "CustomerForm";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Customers"; this.Text = "Customer";
this.Load += new System.EventHandler(this.CustomersForm_Load); this.Load += new System.EventHandler(this.CustomerForm_Load);
this.ResumeLayout(false); this.ResumeLayout(false);
this.PerformLayout(); this.PerformLayout();

View File

@ -7,19 +7,24 @@ using Tanshu.Accounts.Entities.Auth;
namespace Tanshu.Accounts.PointOfSale namespace Tanshu.Accounts.PointOfSale
{ {
public partial class CustomersForm : Form public partial class CustomerForm : Form
{ {
private Guid? _customerID; private Guid? _customerID;
private Customer _customer; private Customer _customer;
private readonly string phone; private readonly string phone;
#region Form Load #region Form Load
public CustomersForm(Guid? customerID, string phone) public CustomerForm(Guid? customerID)
{
InitializeComponent();
this._customerID = customerID;
}
public CustomerForm(Guid? customerID, string phone)
{ {
InitializeComponent(); InitializeComponent();
this._customerID = customerID; this._customerID = customerID;
this.phone = phone; this.phone = phone;
} }
private void CustomersForm_Load(object sender, EventArgs e) private void CustomerForm_Load(object sender, EventArgs e)
{ {
if (_customerID.HasValue) if (_customerID.HasValue)
{ {

View File

@ -0,0 +1,167 @@
namespace Tanshu.Accounts.PointOfSale
{
partial class CustomerListForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.btnAdd = new System.Windows.Forms.Button();
this.btnEdit = new System.Windows.Forms.Button();
this.btnExit = new System.Windows.Forms.Button();
this.dgvCustomers = new System.Windows.Forms.DataGridView();
this.nameDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.phone = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.address = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.bsList = new System.Windows.Forms.BindingSource(this.components);
((System.ComponentModel.ISupportInitialize)(this.dgvCustomers)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.bsList)).BeginInit();
this.SuspendLayout();
//
// btnAdd
//
this.btnAdd.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.btnAdd.Location = new System.Drawing.Point(12, 255);
this.btnAdd.Name = "btnAdd";
this.btnAdd.Size = new System.Drawing.Size(75, 75);
this.btnAdd.TabIndex = 68;
this.btnAdd.Text = "&Add";
this.btnAdd.Click += new System.EventHandler(this.btnAdd_Click);
//
// btnEdit
//
this.btnEdit.AccessibleName = "Done";
this.btnEdit.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.btnEdit.Location = new System.Drawing.Point(93, 255);
this.btnEdit.Name = "btnEdit";
this.btnEdit.Size = new System.Drawing.Size(75, 75);
this.btnEdit.TabIndex = 62;
this.btnEdit.Text = "&Edit";
this.btnEdit.Click += new System.EventHandler(this.btnEdit_Click);
//
// btnExit
//
this.btnExit.AccessibleName = "Done";
this.btnExit.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.btnExit.Location = new System.Drawing.Point(575, 255);
this.btnExit.Name = "btnExit";
this.btnExit.Size = new System.Drawing.Size(75, 75);
this.btnExit.TabIndex = 61;
this.btnExit.Text = "E&xit";
this.btnExit.Click += new System.EventHandler(this.btnExit_Click);
//
// dgvCustomers
//
this.dgvCustomers.AllowUserToAddRows = false;
this.dgvCustomers.AllowUserToDeleteRows = false;
this.dgvCustomers.AllowUserToResizeRows = false;
this.dgvCustomers.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.dgvCustomers.AutoGenerateColumns = false;
this.dgvCustomers.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.AllCells;
this.dgvCustomers.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.dgvCustomers.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.nameDataGridViewTextBoxColumn,
this.phone,
this.address});
this.dgvCustomers.DataSource = this.bsList;
this.dgvCustomers.EditMode = System.Windows.Forms.DataGridViewEditMode.EditProgrammatically;
this.dgvCustomers.Location = new System.Drawing.Point(12, 12);
this.dgvCustomers.MultiSelect = false;
this.dgvCustomers.Name = "dgvCustomers";
this.dgvCustomers.ReadOnly = true;
this.dgvCustomers.RowHeadersVisible = false;
this.dgvCustomers.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.DisableResizing;
this.dgvCustomers.RowTemplate.Height = 24;
this.dgvCustomers.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
this.dgvCustomers.Size = new System.Drawing.Size(638, 237);
this.dgvCustomers.TabIndex = 74;
this.dgvCustomers.CellDoubleClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dgvCustomers_CellDoubleClick);
//
// nameDataGridViewTextBoxColumn
//
this.nameDataGridViewTextBoxColumn.DataPropertyName = "Name";
this.nameDataGridViewTextBoxColumn.HeaderText = "Name";
this.nameDataGridViewTextBoxColumn.Name = "nameDataGridViewTextBoxColumn";
this.nameDataGridViewTextBoxColumn.ReadOnly = true;
this.nameDataGridViewTextBoxColumn.Width = 60;
//
// phone
//
this.phone.DataPropertyName = "Phone";
this.phone.HeaderText = "Phone";
this.phone.Name = "phone";
this.phone.ReadOnly = true;
this.phone.Width = 63;
//
// address
//
this.address.DataPropertyName = "Address";
this.address.HeaderText = "Address";
this.address.Name = "address";
this.address.ReadOnly = true;
this.address.Width = 70;
//
// bsList
//
this.bsList.DataSource = typeof(Tanshu.Accounts.Entities.Customer);
//
// CustomerListForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(662, 342);
this.Controls.Add(this.dgvCustomers);
this.Controls.Add(this.btnAdd);
this.Controls.Add(this.btnEdit);
this.Controls.Add(this.btnExit);
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "CustomerListForm";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Customers";
this.Load += new System.EventHandler(this.CustomerListForm_Load);
((System.ComponentModel.ISupportInitialize)(this.dgvCustomers)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.bsList)).EndInit();
this.ResumeLayout(false);
}
#endregion
internal System.Windows.Forms.Button btnAdd;
internal System.Windows.Forms.Button btnEdit;
internal System.Windows.Forms.Button btnExit;
private System.Windows.Forms.DataGridView dgvCustomers;
private System.Windows.Forms.BindingSource bsList;
private System.Windows.Forms.DataGridViewTextBoxColumn Password;
private System.Windows.Forms.DataGridViewTextBoxColumn CustomerGroups;
private System.Windows.Forms.DataGridViewTextBoxColumn nameDataGridViewTextBoxColumn;
private System.Windows.Forms.DataGridViewTextBoxColumn phone;
private System.Windows.Forms.DataGridViewTextBoxColumn address;
}
}

View File

@ -0,0 +1,74 @@
using System;
using System.Linq;
using System.Windows.Forms;
using Tanshu.Accounts.Entities;
using Tanshu.Accounts.Repository;
using System.Collections.Generic;
using Tanshu.Accounts.Entities.Auth;
using Tanshu.Accounts.Contracts;
namespace Tanshu.Accounts.PointOfSale
{
public partial class CustomerListForm : Form
{
private IList<Customer> _list;
public CustomerListForm()
{
InitializeComponent();
}
private void btnAdd_Click(object sender, EventArgs e)
{
using (var frm = new CustomerForm(null))
frm.ShowDialog();
using (var bi = new CustomerBI())
_list = bi.List();
bsList.DataSource = _list;
}
private void CustomerListForm_Load(object sender, EventArgs e)
{
ShowGrid();
}
private void ShowGrid()
{
using (var bi = new CustomerBI())
_list = bi.List();
bsList.DataSource = _list;
}
private void btnEdit_Click(object sender, EventArgs e)
{
var id = ((Customer)bsList.Current).CustomerID;
using (var frm = new CustomerForm(id))
frm.ShowDialog();
using (var bi = new CustomerBI())
_list = bi.List();
bsList.DataSource = _list;
}
private void btnExit_Click(object sender, EventArgs e)
{
this.Close();
}
public Customer SelectedItem
{
get
{
if (bsList.Position >= 0)
{
var item = _list[bsList.Position];
if (item != null)
return item;
}
return _list.First(x => x.CustomerID == Constants.CASH_CUSTOMER);
}
}
private void dgvCustomers_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{
this.Close();
}
}
}

View File

@ -0,0 +1,129 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="phone.UserAddedColumn" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="address.UserAddedColumn" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bsList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
</root>

View File

@ -44,7 +44,8 @@
// btnClose // btnClose
// //
this.btnClose.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) this.btnClose.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right))); this.btnClose.Location = new System.Drawing.Point(3, 3); | System.Windows.Forms.AnchorStyles.Right)));
this.btnClose.Location = new System.Drawing.Point(3, 3);
this.btnClose.Name = "btnClose"; this.btnClose.Name = "btnClose";
this.btnClose.Size = new System.Drawing.Size(480, 75); this.btnClose.Size = new System.Drawing.Size(480, 75);
this.btnClose.TabIndex = 7; this.btnClose.TabIndex = 7;
@ -66,6 +67,7 @@
this.Text = "Modifier"; this.Text = "Modifier";
this.Load += new System.EventHandler(this.ModifierForm_Load); this.Load += new System.EventHandler(this.ModifierForm_Load);
this.ResumeLayout(false); this.ResumeLayout(false);
} }
#endregion #endregion

View File

@ -27,17 +27,15 @@ namespace Tanshu.Accounts.PointOfSale.Sales
Text = name; Text = name;
} }
public void SetCustomerDisplay(string name) private void ShowInfo(Voucher voucher, BillDict bill)
{
btnCustomer.Text = name;
}
public void ShowInfo(Voucher voucher)
{ {
if (voucher.VoucherID == Guid.Empty) if (voucher.VoucherID == Guid.Empty)
{ {
txtTableID.Text = voucher.Table.Name; txtBillID.Text = "";
txtPax.Text = voucher.Pax.ToString(); txtKotID.Text = "";
txtCreationDate.Text = "";
txtDate.Text = "";
txtLastEditDate.Text = "";
} }
else else
{ {
@ -46,15 +44,52 @@ namespace Tanshu.Accounts.PointOfSale.Sales
txtCreationDate.Text = voucher.CreationDate.ToString("HH:mm dd-MMM-yyyy"); txtCreationDate.Text = voucher.CreationDate.ToString("HH:mm dd-MMM-yyyy");
txtDate.Text = voucher.Date.ToString("HH:mm dd-MMM-yyyy"); txtDate.Text = voucher.Date.ToString("HH:mm dd-MMM-yyyy");
txtLastEditDate.Text = voucher.LastEditDate.ToString("HH:mm dd-MMM-yyyy"); txtLastEditDate.Text = voucher.LastEditDate.ToString("HH:mm dd-MMM-yyyy");
btnCustomer.Text = voucher.Customer.Name; }
txtTableID.Text = voucher.Table.Name; btnCustomer.Text = voucher.Customer.Name;
txtPax.Text = voucher.Pax.ToString(); txtTableID.Text = voucher.Table == null ? "" : voucher.Table.Name;
txtPax.Text = voucher.Pax.ToString();
bindingSource.CurrencyManager.Position = Math.Min(bindingSource.CurrencyManager.Position, bill.Count - 1);
txtGrossTax.Text = string.Format("{0:#0.00}", bill.Tax);
txtDiscount.Text = string.Format("{0:#0.00}", bill.Discount);
txtServiceCharge.Text = string.Format("{0:#0.00}", bill.ServiceCharge);
txtGrossAmount.Text = string.Format("{0:#0.00}", bill.NetAmount);
txtAmount.Text = string.Format("{0:#0.00}", bill.Amount);
bindingSource.DataSource = bill.ToList();
dgvProducts.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.DisplayedCells);
MoreButton(false);
}
public BillItemValue CurrentProduct
{
get
{
if (bindingSource.Position == -1)
return null;
var item = _billController._bill.ElementAt(bindingSource.Position);
return item.Key.BillItemType != BillItemType.Kot ? item.Value : null;
} }
} }
public BindingSource BindingSource public BillItemKey CurrentKey
{ {
get { return bindingSource; } get
{
if (bindingSource.Position == -1)
return null;
var item = _billController._bill.ElementAt(bindingSource.Position);
return item.Key;
}
}
public BillItemKey CurrentKot
{
get
{
if (bindingSource.Position == -1)
return null;
var item = _billController._bill.ElementAt(bindingSource.Position);
return item.Key.BillItemType == BillItemType.Kot ? item.Key : null;
}
} }
public void CloseWindow() public void CloseWindow()
@ -81,22 +116,17 @@ namespace Tanshu.Accounts.PointOfSale.Sales
case Keys.F4: case Keys.F4:
{ {
if (!e.Alt) if (!e.Alt)
_billController.ShowCustomers(false); {
break; _billController.ShowCustomers();
} ShowInfo(_billController._voucher, _billController._bill);
case Keys.F7: }
{
//using (var selectProduct = new SelectProduct(ProductBI.GetFilteredProducts, true))
//{
// selectProduct.ShowDialog();
// if (selectProduct.SelectedItem != null)
// _billController.AddProduct(selectProduct.SelectedItem.ProductID);
//}
break; break;
} }
case Keys.F8: case Keys.F8:
{ {
_billController.LoadBill(null); _billController.LoadBill(null);
ShowInfo(_billController._voucher, _billController._bill);
FormState = SaleFormState.Billing;
break; break;
} }
case Keys.F11: case Keys.F11:
@ -111,18 +141,20 @@ namespace Tanshu.Accounts.PointOfSale.Sales
} }
case Keys.Delete: case Keys.Delete:
{ {
_billController.SetQuantity(-1, false); _billController.SetQuantity(CurrentKey, CurrentProduct, -1, false);
//_billController.ProductRemove(); ShowInfo(_billController._voucher, _billController._bill);
break; break;
} }
case Keys.Add: case Keys.Add:
{ {
_billController.SetQuantity(1, false); _billController.SetQuantity(CurrentKey, CurrentProduct, 1, false);
ShowInfo(_billController._voucher, _billController._bill);
break; break;
} }
case Keys.Subtract: case Keys.Subtract:
{ {
_billController.SetQuantity(-1, false); _billController.SetQuantity(CurrentKey, CurrentProduct, -1, false);
ShowInfo(_billController._voucher, _billController._bill);
break; break;
} }
case Keys.Up: case Keys.Up:
@ -139,7 +171,10 @@ namespace Tanshu.Accounts.PointOfSale.Sales
} }
case Keys.Escape: case Keys.Escape:
{ {
_billController.CancelBillChanges(); var canceled = _billController.CancelBillChanges();
ShowInfo(_billController._voucher, _billController._bill);
if (canceled)
FormState = SaleFormState.Waiting;
break; break;
} }
} }
@ -153,43 +188,41 @@ namespace Tanshu.Accounts.PointOfSale.Sales
txtServiceCharge.Visible = showSC; txtServiceCharge.Visible = showSC;
lblServiceCharge.Visible = showSC; lblServiceCharge.Visible = showSC;
} }
_billController.FormLoad(); _billController.ClearBill();
FormState = SaleFormState.Waiting; var state = _billController.FormLoad();
ShowInfo(_billController._voucher, _billController._bill);
FormState = state;
} }
private void btnCustomer_Click(object sender, EventArgs e) private void btnCustomer_Click(object sender, EventArgs e)
{ {
_billController.ShowCustomers(false); _billController.ShowCustomers();
ShowInfo(_billController._voucher, _billController._bill);
} }
private void btnVoid_Click(object sender, EventArgs e) private void btnVoid_Click(object sender, EventArgs e)
{ {
try var voided = _billController.VoidBill();
{ ShowInfo(_billController._voucher, _billController._bill);
_billController.VoidBill(); if (voided)
} FormState = SaleFormState.Waiting;
catch (PermissionException ex)
{
MessageBox.Show(ex.Message);
}
} }
private void btnPrice_Click(object sender, EventArgs e) private void btnPrice_Click(object sender, EventArgs e)
{ {
try var item = CurrentProduct;
{ if (item == null)
_billController.SetPrice(); return;
} _billController.SetPrice(CurrentProduct);
catch (Exception ex) ShowInfo(_billController._voucher, _billController._bill);
{
if (!(ex is ValidationException) && !(ex is PermissionException))
throw;
}
} }
private void btnClear_Click(object sender, EventArgs e) private void btnClear_Click(object sender, EventArgs e)
{ {
_billController.CancelBillChanges(); var canceled = _billController.CancelBillChanges();
ShowInfo(_billController._voucher, _billController._bill);
if (canceled)
FormState = SaleFormState.Waiting;
} }
private void dgvProducts_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) private void dgvProducts_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
@ -225,22 +258,32 @@ namespace Tanshu.Accounts.PointOfSale.Sales
private void btnSettle_Click(object sender, EventArgs e) private void btnSettle_Click(object sender, EventArgs e)
{ {
_billController.SettleBill(); var settled = _billController.SettleBill();
ShowInfo(_billController._voucher, _billController._bill);
if (settled)
FormState = SaleFormState.Waiting;
} }
private void btnModifier_Click(object sender, EventArgs e) private void btnModifier_Click(object sender, EventArgs e)
{ {
_billController.ShowModifiers(); var item = CurrentProduct;
if (item == null || CurrentKey.KotID != Guid.Empty)
return; // No Product or Old Product
_billController.ShowModifiers(item);
ShowInfo(_billController._voucher, _billController._bill);
} }
private void btnDelete_Click(object sender, EventArgs e) private void btnDelete_Click(object sender, EventArgs e)
{ {
_billController.SetQuantity(-1, false); _billController.SetQuantity(CurrentKey, CurrentProduct, -1, false);
ShowInfo(_billController._voucher, _billController._bill);
} }
private void btnMoveTable_Click(object sender, EventArgs e) private void btnMoveTable_Click(object sender, EventArgs e)
{ {
_billController.MoveTable(); _billController.MoveTable();
ShowInfo(_billController._voucher, _billController._bill);
} }
private void btnMore_Click(object sender, EventArgs e) private void btnMore_Click(object sender, EventArgs e)
@ -272,44 +315,13 @@ namespace Tanshu.Accounts.PointOfSale.Sales
private void btnMoveKot_Click(object sender, EventArgs e) private void btnMoveKot_Click(object sender, EventArgs e)
{ {
_billController.MoveKot(); _billController.MoveKot(CurrentKot);
ShowInfo(_billController._voucher, _billController._bill);
} }
#region Helper Functions #region Helper Functions
public void ClearBill(BillDict bill) private SaleFormState FormState
{
txtBillID.Text = "";
txtKotID.Text = "";
txtCreationDate.Text = "";
txtDate.Text = "";
txtLastEditDate.Text = "";
txtTableID.Text = "";
txtPax.Text = "";
txtGrossTax.Text = "0.00";
txtDiscount.Text = "0.00";
txtServiceCharge.Text = "0.00";
txtGrossAmount.Text = "0.00";
txtAmount.Text = "0.00";
bindingSource.CurrencyManager.Position = 0; //Hack for Mono
bindingSource.DataSource = bill;
MoreButton(false);
FormState = SaleFormState.Waiting;
}
public void ShowAmount(decimal discountAmount, decimal grossAmount, decimal serviceChargeAmount,
decimal taxAmount, decimal valueAmount, BillDict bill)
{
txtGrossTax.Text = string.Format("{0:#0.00}", taxAmount);
txtDiscount.Text = string.Format("{0:#0.00}", discountAmount);
txtServiceCharge.Text = string.Format("{0:#0.00}", serviceChargeAmount);
txtGrossAmount.Text = string.Format("{0:#0.00}", grossAmount);
txtAmount.Text = string.Format("{0:#0.00}", Math.Round(valueAmount));
bindingSource.DataSource = bill.ToList();
dgvProducts.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.DisplayedCells);
}
public SaleFormState FormState
{ {
set set
{ {
@ -356,6 +368,15 @@ namespace Tanshu.Accounts.PointOfSale.Sales
if (item.IsNotAvailable) if (item.IsNotAvailable)
return; return;
_billController.AddProduct(item); _billController.AddProduct(item);
bindingSource.DataSource = _billController._bill.ToList();
bindingSource.CurrencyManager.Position = _billController._bill.IndexOfKey(new BillItemKey(item.ProductID, Guid.Empty));
var showModifier = false;
using (var bi = new ProductGroupModifierBI())
showModifier = bi.HasCompulsoryModifier(CurrentProduct.inventory.Product.ProductGroup.ProductGroupID);
if (showModifier)
_billController.ShowModifiers(CurrentProduct);
ShowInfo(_billController._voucher, _billController._bill);
} }
private void productPage_Click(object sender, EventArgs e) private void productPage_Click(object sender, EventArgs e)
@ -378,6 +399,7 @@ namespace Tanshu.Accounts.PointOfSale.Sales
var item = button.Tag as FoodTable; var item = button.Tag as FoodTable;
var tableName = item.Name; var tableName = item.Name;
_billController.LoadBill(tableName); _billController.LoadBill(tableName);
ShowInfo(_billController._voucher, _billController._bill);
FormState = SaleFormState.Billing; FormState = SaleFormState.Billing;
} }
@ -394,30 +416,30 @@ namespace Tanshu.Accounts.PointOfSale.Sales
} }
private void btnPrintBill_Click(object sender, EventArgs e) private void btnPrintBill_Click(object sender, EventArgs e)
{ {
_billController.SaveBill(); var printed = _billController.SaveAndPrintBill();
ShowInfo(_billController._voucher, _billController._bill);
if (printed)
FormState = SaleFormState.Waiting;
} }
private void btnPrintKot_Click(object sender, EventArgs e) private void btnPrintKot_Click(object sender, EventArgs e)
{ {
_billController.SaveKot(); var printed = _billController.SaveAndPrintKot();
ShowInfo(_billController._voucher, _billController._bill);
if (printed)
FormState = SaleFormState.Waiting;
} }
private void btnQuantity_Click(object sender, EventArgs e) private void btnQuantity_Click(object sender, EventArgs e)
{ {
_billController.SetQuantity(0, true); _billController.SetQuantity(CurrentKey, CurrentProduct, 0, true);
ShowInfo(_billController._voucher, _billController._bill);
} }
private void btnDiscount_Click(object sender, EventArgs e) private void btnDiscount_Click(object sender, EventArgs e)
{ {
try _billController.SetDiscount();
{ ShowInfo(_billController._voucher, _billController._bill);
_billController.SetDiscount();
}
catch (Exception ex)
{
if (!(ex is ValidationException) && !(ex is PermissionException))
throw;
}
} }
#endregion #endregion
@ -425,6 +447,7 @@ namespace Tanshu.Accounts.PointOfSale.Sales
private void btnSplitBill_Click(object sender, EventArgs e) private void btnSplitBill_Click(object sender, EventArgs e)
{ {
_billController.SplitBill(); _billController.SplitBill();
ShowInfo(_billController._voucher, _billController._bill);
} }
} }
} }

View File

@ -195,6 +195,12 @@
<Compile Include="Masters\ReorderTableForm.Designer.cs"> <Compile Include="Masters\ReorderTableForm.Designer.cs">
<DependentUpon>ReorderTableForm.cs</DependentUpon> <DependentUpon>ReorderTableForm.cs</DependentUpon>
</Compile> </Compile>
<Compile Include="Sales\CustomerListForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Sales\CustomerListForm.Designer.cs">
<DependentUpon>CustomerListForm.cs</DependentUpon>
</Compile>
<Compile Include="Sales\VoucherTypeForm.cs"> <Compile Include="Sales\VoucherTypeForm.cs">
<SubType>Form</SubType> <SubType>Form</SubType>
</Compile> </Compile>
@ -256,11 +262,11 @@
<DependentUpon>CheckoutForm.cs</DependentUpon> <DependentUpon>CheckoutForm.cs</DependentUpon>
</Compile> </Compile>
<Compile Include="CustomEnums.cs" /> <Compile Include="CustomEnums.cs" />
<Compile Include="Sales\CustomersForm.cs"> <Compile Include="Sales\CustomerForm.cs">
<SubType>Form</SubType> <SubType>Form</SubType>
</Compile> </Compile>
<Compile Include="Sales\CustomersForm.Designer.cs"> <Compile Include="Sales\CustomerForm.Designer.cs">
<DependentUpon>CustomersForm.cs</DependentUpon> <DependentUpon>CustomerForm.cs</DependentUpon>
</Compile> </Compile>
<Compile Include="Authentication\LoginForm.cs"> <Compile Include="Authentication\LoginForm.cs">
<SubType>Form</SubType> <SubType>Form</SubType>
@ -372,6 +378,10 @@
<EmbeddedResource Include="Masters\ReorderTableForm.resx"> <EmbeddedResource Include="Masters\ReorderTableForm.resx">
<DependentUpon>ReorderTableForm.cs</DependentUpon> <DependentUpon>ReorderTableForm.cs</DependentUpon>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="Sales\CustomerListForm.resx">
<DependentUpon>CustomerListForm.cs</DependentUpon>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="Sales\VoucherTypeForm.resx"> <EmbeddedResource Include="Sales\VoucherTypeForm.resx">
<DependentUpon>VoucherTypeForm.cs</DependentUpon> <DependentUpon>VoucherTypeForm.cs</DependentUpon>
</EmbeddedResource> </EmbeddedResource>
@ -405,8 +415,8 @@
<DependentUpon>CheckoutForm.cs</DependentUpon> <DependentUpon>CheckoutForm.cs</DependentUpon>
<SubType>Designer</SubType> <SubType>Designer</SubType>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="Sales\CustomersForm.resx"> <EmbeddedResource Include="Sales\CustomerForm.resx">
<DependentUpon>CustomersForm.cs</DependentUpon> <DependentUpon>CustomerForm.cs</DependentUpon>
<SubType>Designer</SubType> <SubType>Designer</SubType>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="Authentication\LoginForm.resx"> <EmbeddedResource Include="Authentication\LoginForm.resx">

View File

@ -7,18 +7,11 @@ namespace Tanshu.Accounts.Repository
{ {
public class CustomerBI : UnitOfWork<Customer> public class CustomerBI : UnitOfWork<Customer>
{ {
public IList<Customer> List(Dictionary<string, string> filter) public new IList<Customer> List()
{ {
return _session.QueryOver<Customer>() return _session.QueryOver<Customer>()
.WhereRestrictionOn(x => x.Name).IsLike(string.Format("%{0}%", filter["Universal"])) .OrderBy(x => x.Name).Asc
.List(); .List();
} }
public static IList<Customer> StaticList(Dictionary<string, string> filter)
{
using (var bi = new CustomerBI())
{
return bi.List(filter);
}
}
} }
} }