466 lines
16 KiB
C#
466 lines
16 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Drawing;
|
|
using System.Linq;
|
|
using System.Windows.Forms;
|
|
using Tanshu.Accounts.Contracts;
|
|
using Tanshu.Accounts.Entities;
|
|
using Tanshu.Accounts.Helpers;
|
|
using Tanshu.Accounts.Print;
|
|
using Tanshu.Accounts.Repository;
|
|
|
|
namespace Tanshu.Accounts.PointOfSale.Sales
|
|
{
|
|
public partial class SalesForm : Form
|
|
{
|
|
private ProductGroup _currentProductGroup;
|
|
public SalesForm(BillController billController)
|
|
{
|
|
InitializeComponent();
|
|
_controller = billController;
|
|
this.Text = Session.User.Name;
|
|
}
|
|
|
|
private void ShowInfo()
|
|
{
|
|
Voucher voucher = _controller._voucher;
|
|
BillDict bill = _controller._bill;
|
|
if (voucher.VoucherID == Guid.Empty)
|
|
{
|
|
txtBillID.Text = "";
|
|
txtKotID.Text = "";
|
|
txtCreationDate.Text = "";
|
|
txtDate.Text = "";
|
|
txtLastEditDate.Text = "";
|
|
}
|
|
else
|
|
{
|
|
txtBillID.Text = voucher.FullBillID;
|
|
txtKotID.Text = "K-" + voucher.KotID.ToString();
|
|
txtCreationDate.Text = voucher.CreationDate.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");
|
|
}
|
|
btnCustomer.Text = voucher.Customer.Name;
|
|
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 = _controller._bill.ElementAt(bindingSource.Position);
|
|
return item.Key.BillItemType != BillItemType.Kot ? item.Value : null;
|
|
}
|
|
}
|
|
|
|
public BillItemKey CurrentKey
|
|
{
|
|
get
|
|
{
|
|
if (bindingSource.Position == -1)
|
|
return null;
|
|
var item = _controller._bill.ElementAt(bindingSource.Position);
|
|
return item.Key;
|
|
}
|
|
}
|
|
|
|
public BillItemKey CurrentKot
|
|
{
|
|
get
|
|
{
|
|
if (bindingSource.Position == -1)
|
|
return null;
|
|
var item = _controller._bill.ElementAt(bindingSource.Position);
|
|
return item.Key.BillItemType == BillItemType.Kot ? item.Key : null;
|
|
}
|
|
}
|
|
|
|
private void SalesForm_KeyDown(object sender, KeyEventArgs e)
|
|
{
|
|
switch (e.KeyCode)
|
|
{
|
|
case Keys.F2:
|
|
{
|
|
btnQuantity_Click(sender, new EventArgs());
|
|
break;
|
|
}
|
|
case Keys.F3:
|
|
{
|
|
btnDiscount_Click(sender, new EventArgs());
|
|
break;
|
|
}
|
|
case Keys.F4:
|
|
{
|
|
if (!e.Alt)
|
|
{
|
|
_controller.ShowCustomers();
|
|
ShowInfo();
|
|
}
|
|
break;
|
|
}
|
|
case Keys.F8:
|
|
{
|
|
_controller.LoadBill(null);
|
|
ShowInfo();
|
|
FormState = SaleFormState.Billing;
|
|
break;
|
|
}
|
|
case Keys.F11:
|
|
{
|
|
btnPrintBill_Click(sender, e);
|
|
break;
|
|
}
|
|
case Keys.F12:
|
|
{
|
|
btnPrintKot_Click(sender, e);
|
|
break;
|
|
}
|
|
case Keys.Delete:
|
|
{
|
|
_controller.SetQuantity(CurrentKey, CurrentProduct, -1, false);
|
|
ShowInfo();
|
|
break;
|
|
}
|
|
case Keys.Add:
|
|
{
|
|
_controller.SetQuantity(CurrentKey, CurrentProduct, 1, false);
|
|
ShowInfo();
|
|
break;
|
|
}
|
|
case Keys.Subtract:
|
|
{
|
|
_controller.SetQuantity(CurrentKey, CurrentProduct, -1, false);
|
|
ShowInfo();
|
|
break;
|
|
}
|
|
case Keys.Up:
|
|
{
|
|
if ((bindingSource.Position >= 1) && (!dgvProducts.Focused))
|
|
bindingSource.Position -= 1;
|
|
break;
|
|
}
|
|
case Keys.Down:
|
|
{
|
|
if ((bindingSource.Position < bindingSource.Count - 1) && (!dgvProducts.Focused))
|
|
bindingSource.Position += 1;
|
|
break;
|
|
}
|
|
case Keys.Escape:
|
|
{
|
|
var canceled = _controller.CancelBillChanges();
|
|
ShowInfo();
|
|
if (canceled)
|
|
FormState = SaleFormState.Waiting;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
private void SalesForm_Load(object sender, EventArgs e)
|
|
{
|
|
var showSC = (bool)SettingBI.Get("Service Charge").Details["Enabled"];
|
|
txtServiceCharge.Visible = showSC;
|
|
lblServiceCharge.Visible = showSC;
|
|
var state = _controller.FormLoad();
|
|
ShowInfo();
|
|
FormState = state;
|
|
}
|
|
|
|
private void btnCustomer_Click(object sender, EventArgs e)
|
|
{
|
|
_controller.ShowCustomers();
|
|
ShowInfo();
|
|
}
|
|
|
|
private void btnVoid_Click(object sender, EventArgs e)
|
|
{
|
|
var voided = _controller.VoidBill();
|
|
ShowInfo();
|
|
if (voided)
|
|
FormState = SaleFormState.Waiting;
|
|
}
|
|
|
|
private void btnPrice_Click(object sender, EventArgs e)
|
|
{
|
|
var item = CurrentProduct;
|
|
if (item == null)
|
|
return;
|
|
_controller.SetPrice(CurrentProduct);
|
|
ShowInfo();
|
|
}
|
|
|
|
private void btnClear_Click(object sender, EventArgs e)
|
|
{
|
|
var canceled = _controller.CancelBillChanges();
|
|
ShowInfo();
|
|
if (canceled)
|
|
FormState = SaleFormState.Waiting;
|
|
}
|
|
|
|
private void dgvProducts_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
|
|
{
|
|
var dgv = sender as DataGridView;
|
|
var data = (KeyValuePair<BillItemKey, BillItemValue>)dgv.Rows[e.RowIndex].DataBoundItem;
|
|
|
|
if (data.Key.BillItemType == BillItemType.Kot)
|
|
{
|
|
e.CellStyle.SelectionBackColor = Color.Blue;
|
|
e.CellStyle.BackColor = Color.LightBlue;
|
|
}
|
|
else if (data.Value.inventory.Kot != null)
|
|
{
|
|
e.CellStyle.SelectionBackColor = Color.HotPink;
|
|
e.CellStyle.BackColor = Color.LightPink;
|
|
}
|
|
else
|
|
{
|
|
e.CellStyle.SelectionBackColor = Color.Green;
|
|
e.CellStyle.BackColor = Color.LightGreen;
|
|
}
|
|
if (dgv.Columns[e.ColumnIndex].Name.Equals("DisplayColumn"))
|
|
e.Value = data.Value.Display;
|
|
else if (dgv.Columns[e.ColumnIndex].Name.Equals("QuantityColumn"))
|
|
{
|
|
if (data.Key.BillItemType != BillItemType.Kot)
|
|
e.Value = data.Value.inventory.Quantity;
|
|
else
|
|
e.Value = "";
|
|
}
|
|
}
|
|
|
|
private void btnSettle_Click(object sender, EventArgs e)
|
|
{
|
|
var settled = _controller.SettleBill();
|
|
ShowInfo();
|
|
if (settled)
|
|
FormState = SaleFormState.Waiting;
|
|
}
|
|
|
|
private void btnModifier_Click(object sender, EventArgs e)
|
|
{
|
|
var item = CurrentProduct;
|
|
if (item == null || CurrentKey.KotID != Guid.Empty)
|
|
return; // No Product or Old Product
|
|
|
|
_controller.ShowModifiers(item);
|
|
ShowInfo();
|
|
}
|
|
|
|
private void btnDelete_Click(object sender, EventArgs e)
|
|
{
|
|
_controller.SetQuantity(CurrentKey, CurrentProduct, -1, false);
|
|
ShowInfo();
|
|
}
|
|
|
|
private void btnMoveTable_Click(object sender, EventArgs e)
|
|
{
|
|
_controller.MoveTable();
|
|
ShowInfo();
|
|
}
|
|
|
|
private void btnMore_Click(object sender, EventArgs e)
|
|
{
|
|
var button = sender as Button;
|
|
if (button == null)
|
|
return;
|
|
if (button.Text == "More")
|
|
MoreButton(true);
|
|
else if (button.Text == "Less")
|
|
MoreButton(false);
|
|
else
|
|
throw new InvalidOperationException("Button State incorrect");
|
|
}
|
|
|
|
private void MoreButton(bool more)
|
|
{
|
|
btnMore.Text = more ? "Less" : "More";
|
|
btnQuantity.Visible = !more;
|
|
btnPrice.Visible = more;
|
|
btnDelete.Visible = !more;
|
|
btnDiscount.Visible = !more;
|
|
btnModifier.Visible = !more;
|
|
btnMoveTable.Visible = more;
|
|
btnMoveKot.Visible = more;
|
|
btnVoid.Visible = more;
|
|
btnSplitBill.Visible = more;
|
|
}
|
|
|
|
private void btnMoveKot_Click(object sender, EventArgs e)
|
|
{
|
|
_controller.MoveKot(CurrentKot);
|
|
ShowInfo();
|
|
}
|
|
|
|
#region Helper Functions
|
|
|
|
private SaleFormState FormState
|
|
{
|
|
set
|
|
{
|
|
flpGroup.Controls.Clear();
|
|
flpMain.Controls.Clear();
|
|
if (value == SaleFormState.Billing)
|
|
ControlFactory.GenerateGroups(ref flpGroup, new Point(75, 75), 0, Cache.ProductGroups(), productTypeButton_Click, productTypePage_Click);
|
|
else
|
|
ControlFactory.GenerateTables(ref flpMain, new Point(75, 75), 0, FoodTableBI.List(true), tableButton_Click, tablePage_Click);
|
|
|
|
}
|
|
}
|
|
private void productTypeButton_Click(object sender, EventArgs e)
|
|
{
|
|
var button = sender as Button;
|
|
if (button == null)
|
|
return;
|
|
var item = button.Tag as ProductGroup;
|
|
if (item == null)
|
|
return;
|
|
_currentProductGroup = item;
|
|
ControlFactory.GenerateProducts(ref flpMain, new Point(75, 75), 0,
|
|
item.Products, productButton_Click, productPage_Click);
|
|
}
|
|
|
|
private void productTypePage_Click(object sender, EventArgs e)
|
|
{
|
|
var button = sender as Button;
|
|
if (button == null)
|
|
return;
|
|
var start = (int)button.Tag;
|
|
if (start < 0)
|
|
start = 0;
|
|
ControlFactory.GenerateGroups(ref flpGroup, new Point(75, 75), start, Cache.ProductGroups(), productTypeButton_Click, productTypePage_Click);
|
|
}
|
|
|
|
private void productButton_Click(object sender, EventArgs e)
|
|
{
|
|
var button = sender as Button;
|
|
if (button == null)
|
|
return;
|
|
var item = button.Tag as Product;
|
|
if (item.IsNotAvailable)
|
|
return;
|
|
_controller.AddProduct(item);
|
|
bindingSource.DataSource = _controller._bill.ToList();
|
|
bindingSource.CurrencyManager.Position = _controller._bill.IndexOfKey(new BillItemKey(item.ProductID, Guid.Empty, item.HasHappyHour));
|
|
// TODO: Refactor this so that this is loaded in the cache with the products
|
|
if (CurrentProduct.inventory.Product.ProductGroup.IsModifierCompulsory)
|
|
_controller.ShowModifiers(CurrentProduct);
|
|
ShowInfo();
|
|
}
|
|
|
|
private void productPage_Click(object sender, EventArgs e)
|
|
{
|
|
var button = sender as Button;
|
|
if (button == null)
|
|
return;
|
|
var item = button.Tag as Product;
|
|
var start = (int)button.Tag;
|
|
if (start < 0)
|
|
start = 0;
|
|
ControlFactory.GenerateProducts(ref flpMain, new Point(75, 75), start, _currentProductGroup.Products, productButton_Click, productPage_Click);
|
|
}
|
|
|
|
private void tableButton_Click(object sender, EventArgs e)
|
|
{
|
|
var button = sender as Button;
|
|
if (button == null)
|
|
return;
|
|
var item = button.Tag as FoodTable;
|
|
var tableName = item.Name;
|
|
_controller.LoadBill(tableName);
|
|
ShowInfo();
|
|
FormState = SaleFormState.Billing;
|
|
}
|
|
|
|
private void tablePage_Click(object sender, EventArgs e)
|
|
{
|
|
var button = sender as Button;
|
|
if (button == null)
|
|
return;
|
|
var start = (int)button.Tag;
|
|
if (start < 0)
|
|
start = 0;
|
|
ControlFactory.GenerateTables(ref flpMain, new Point(75, 75), start, FoodTableBI.List(true), tableButton_Click, tablePage_Click);
|
|
}
|
|
private void btnPrintBill_Click(object sender, EventArgs e)
|
|
{
|
|
btnPrintBill.Enabled = false;
|
|
bool isPrinted = false, isVoid = false;
|
|
if (_controller._voucher.VoucherID != Guid.Empty)
|
|
{
|
|
var dbVoucher = VoucherBI.Get(_controller._voucher.VoucherID);
|
|
isPrinted = dbVoucher.Printed;
|
|
isVoid = dbVoucher.Void;
|
|
}
|
|
|
|
if (_controller.CanSaveBill(isPrinted, isVoid))
|
|
{
|
|
var amount = _controller._bill.NetAmount;
|
|
_controller.SetDiscount();
|
|
ShowInfo();
|
|
var printed = _controller.SaveAndPrintBill(isPrinted, amount);
|
|
if (printed)
|
|
{
|
|
if (_controller._editVoucherID.HasValue)
|
|
this.Close();
|
|
else
|
|
{
|
|
ShowInfo();
|
|
FormState = SaleFormState.Waiting;
|
|
}
|
|
}
|
|
}
|
|
btnPrintBill.Enabled = true;
|
|
|
|
}
|
|
|
|
private void btnPrintKot_Click(object sender, EventArgs e)
|
|
{
|
|
btnPrintKot.Enabled = false;
|
|
var printed = _controller.SaveAndPrintKot();
|
|
if (printed)
|
|
{
|
|
if (_controller._editVoucherID.HasValue)
|
|
this.Close();
|
|
else
|
|
{
|
|
ShowInfo();
|
|
FormState = SaleFormState.Waiting;
|
|
}
|
|
}
|
|
btnPrintKot.Enabled = true;
|
|
}
|
|
|
|
private void btnQuantity_Click(object sender, EventArgs e)
|
|
{
|
|
_controller.SetQuantity(CurrentKey, CurrentProduct, 0, true);
|
|
ShowInfo();
|
|
}
|
|
|
|
private void btnDiscount_Click(object sender, EventArgs e)
|
|
{
|
|
_controller.SetDiscount();
|
|
ShowInfo();
|
|
}
|
|
|
|
#endregion
|
|
|
|
private void btnSplitBill_Click(object sender, EventArgs e)
|
|
{
|
|
_controller.SplitBill();
|
|
ShowInfo();
|
|
}
|
|
}
|
|
} |