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)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(); } } }