narsil/Tanshu.Accounts.PointOfSale/Sales/SalesForm.cs
2018-08-24 16:11:33 +05:30

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