2011-08-23 07:10:05 +00:00
using System.Collections.Generic ;
2011-01-10 19:49:11 +00:00
using System.Linq ;
using System.Windows.Forms ;
2011-03-11 18:49:48 +00:00
using Tanshu.Accounts.Contracts ;
2011-01-30 07:14:05 +00:00
using Tanshu.Accounts.Entities ;
2011-03-11 18:49:48 +00:00
using Tanshu.Accounts.Helpers ;
using Tanshu.Accounts.Print ;
using Tanshu.Accounts.Repository ;
using Tanshu.Common ;
2011-01-10 19:49:11 +00:00
namespace Tanshu.Accounts.PointOfSale
{
public class BillController
{
2012-12-01 09:49:33 +00:00
private readonly BillDict _bill ;
2011-03-11 18:49:48 +00:00
private Voucher _billInfo ;
private int? _editVoucherID ;
2011-06-23 12:47:48 +00:00
private readonly bool _print ;
2011-03-11 18:49:48 +00:00
private ISaleForm _saleForm ;
2011-01-10 19:49:11 +00:00
2011-12-05 09:41:02 +00:00
public Waiter Waiter
{
get { return _billInfo . Waiter ; }
set { _billInfo . Waiter = value ; }
}
2011-06-23 12:47:48 +00:00
public BillController ( int? editVoucherID , bool print )
2011-02-09 12:03:22 +00:00
{
2011-03-11 18:49:48 +00:00
this . _editVoucherID = editVoucherID ;
2011-06-23 12:47:48 +00:00
_print = print ;
2012-12-01 09:49:33 +00:00
_bill = new BillDict ( ) ;
2011-12-05 09:41:02 +00:00
_billInfo = new Voucher ( Session . User ) ;
2011-06-29 20:27:07 +00:00
using ( var bi = new CustomerBI ( false ) )
2011-12-05 09:41:02 +00:00
_billInfo . Customer = bi . Get ( x = > x . CustomerID = = 1 ) ;
using ( var bi = new WaiterBI ( false ) )
_billInfo . Waiter = bi . Get ( x = > x . WaiterID = = 1 ) ;
2011-02-09 12:03:22 +00:00
}
2011-03-11 18:49:48 +00:00
2011-06-23 12:47:48 +00:00
public BillItemValue CurrentProduct
2011-03-11 18:49:48 +00:00
{
get
{
if ( _saleForm . BindingSource . Position = = - 1 )
return null ;
2011-06-23 12:47:48 +00:00
var item = _bill . ElementAt ( _saleForm . BindingSource . Position ) ;
return item . Key . BillItemType = = BillItemType . Product ? item . Value : null ;
2011-03-11 18:49:48 +00:00
}
}
2011-06-23 12:47:48 +00:00
public BillItemKey CurrentKot
2011-01-10 19:49:11 +00:00
{
2011-03-11 18:49:48 +00:00
get
{
if ( _saleForm . BindingSource . Position = = - 1 )
return null ;
2011-06-23 12:47:48 +00:00
var item = _bill . ElementAt ( _saleForm . BindingSource . Position ) ;
return item . Key . BillItemType = = BillItemType . Kot ? item . Key : null ;
2011-03-11 18:49:48 +00:00
}
}
2011-01-10 19:49:11 +00:00
2011-03-11 18:49:48 +00:00
public void InitGui ( ISaleForm saleForm )
{
this . _saleForm = saleForm ;
2011-12-05 09:41:02 +00:00
this . _saleForm . SetCustomerDisplay ( _billInfo . Customer . Name ) ;
2011-03-11 18:49:48 +00:00
this . _saleForm . SetUserName ( Session . User . Name ) ;
2011-01-10 19:49:11 +00:00
}
2011-03-11 18:49:48 +00:00
2011-08-23 07:10:05 +00:00
public void AddProduct ( Product product )
2011-06-23 12:47:48 +00:00
{
var newKey = new BillItemKey ( product . ProductID , 0 ) ;
if ( _bill . ContainsKey ( newKey ) )
{
_saleForm . BindingSource . CurrencyManager . Position = _bill . IndexOfKey ( newKey ) ;
_bill [ newKey ] . Quantity + = 1 ;
}
else
{
2011-08-23 07:10:05 +00:00
var billItemValue = new BillItemValue ( product ) ;
2012-12-01 09:49:33 +00:00
var old = _bill . FirstOrDefault ( x = > x . Key . BillItemType = = BillItemType . Product & & x . Key . ProductID = = newKey . ProductID ) ;
2011-06-23 12:47:48 +00:00
if ( old . Key ! = null )
{
billItemValue . Discount = old . Value . Discount ;
billItemValue . Price = old . Value . Price ;
}
_bill . Add ( newKey , billItemValue ) ;
_saleForm . BindingSource . DataSource = _bill . Values . ToList ( ) ;
_saleForm . BindingSource . CurrencyManager . Position = _saleForm . BindingSource . CurrencyManager . Count - 1 ;
2011-08-23 07:10:05 +00:00
using ( var bi = new ProductGroupModifierBI ( false ) )
if ( bi . HasCompulsoryModifier ( product . ProductGroup . ProductGroupID ) )
{
var item = CurrentProduct ;
ShowModifiers ( product . ProductGroup . ProductGroupID , item ) ;
}
2011-06-23 12:47:48 +00:00
}
2011-08-23 07:10:05 +00:00
ShowAmount ( ) ;
2011-06-23 12:47:48 +00:00
}
public void ShowModifiers ( int productGroupID , BillItemValue item )
2011-01-30 07:14:05 +00:00
{
2011-02-18 16:54:48 +00:00
if ( item . Printed )
2011-01-31 20:33:22 +00:00
return ;
2011-06-29 20:27:07 +00:00
using ( var bi = new ProductGroupModifierBI ( false ) )
2011-01-30 07:14:05 +00:00
{
2011-06-29 20:27:07 +00:00
using ( var frm = new ModifierForm ( bi . List ( productGroupID ) , item . Modifiers ) )
{
frm . ShowDialog ( ) ;
item . Modifiers = frm . Selection ;
}
2011-01-30 07:14:05 +00:00
}
2011-01-31 20:33:22 +00:00
ShowAmount ( ) ;
}
2011-12-05 09:41:02 +00:00
public void SetDiscount ( )
2011-01-31 20:33:22 +00:00
{
2011-02-09 12:03:22 +00:00
if ( ! Session . IsAllowed ( RoleConstants . DISCOUNT ) )
return ;
2011-06-23 12:47:48 +00:00
using ( var bi = new ProductGroupBI ( ) )
2011-01-31 20:33:22 +00:00
{
2011-06-23 12:47:48 +00:00
using ( var frm = new DiscountForm ( bi . GetProductGroupTypes ( ) ) )
2011-01-31 20:33:22 +00:00
{
2011-06-23 12:47:48 +00:00
if ( frm . ShowDialog ( ) = = DialogResult . OK )
2011-01-31 20:33:22 +00:00
{
2011-06-23 12:47:48 +00:00
HashSet < string > outList ;
var discount = frm . Selection ( out outList ) ;
discount = discount / 100 ;
if ( discount > 1 | | discount < 0 )
return ;
foreach ( var item in _bill . Where ( x = > x . Key . BillItemType = = BillItemType . Product & & outList . Contains ( x . Value . Product . ProductGroup . GroupType ) ) )
{
var product = item . Value . Product ;
var maxDiscount = product . ProductGroup . DiscountLimit ;
if ( discount > item . Value . Product . ProductGroup . DiscountLimit )
MessageBox . Show ( string . Format ( "Maximum discount for {0} is {1:P}" , product . Name , maxDiscount ) ,
"Excessive Discount" , MessageBoxButtons . OK , MessageBoxIcon . Warning ) ;
item . Value . Discount = discount ;
}
2011-01-31 20:33:22 +00:00
}
}
}
ShowAmount ( ) ;
2011-01-10 19:49:11 +00:00
}
2011-08-23 07:10:05 +00:00
2011-12-05 09:41:02 +00:00
public void SetQuantity ( decimal quantity , bool prompt )
{
var item = CurrentProduct ;
if ( ! Allowed ( item ) )
return ;
if ( item . Printed )
return ;
if ( prompt & & ! GetInput ( "Quantity" , ref quantity ) )
return ;
if ( ! prompt )
quantity + = item . Quantity ;
if ( quantity < 0 & & ! Session . IsAllowed ( RoleConstants . EDIT_PRINTED_PRODUCT ) )
return ;
var total = quantity + _bill . Where ( x = > x . Key . ProductID = = item . ProductID & & x . Key . BillItemType = = BillItemType . Product & & x . Value . Printed ) . Sum ( x = > x . Value . Quantity ) ;
if ( total < 0 )
quantity - = total ;
item . Quantity = quantity ;
ShowAmount ( ) ;
}
public void SetRate ( )
2011-01-10 19:49:11 +00:00
{
2011-12-05 09:41:02 +00:00
var item = CurrentProduct ;
if ( ! Allowed ( item , RoleConstants . CHANGE_RATE ) )
return ;
var rate = item . Price ;
if ( ! GetInput ( "Price" , ref rate ) )
return ;
if ( rate = = 0 & & ! Session . IsAllowed ( RoleConstants . ZERO_RATE ) )
return ;
foreach ( var sub in _bill . Where ( x = > x . Key . BillItemType = = BillItemType . Product & & x . Key . ProductID = = item . ProductID ) )
sub . Value . Price = rate ;
ShowAmount ( ) ;
}
public void ShowCustomers ( bool reset )
{
if ( ! reset & & ( ( _billInfo . Customer = = null ) | | _billInfo . Customer . CustomerID = = 1 ) )
2011-01-10 19:49:11 +00:00
{
2011-06-29 20:27:07 +00:00
using ( var selectCustomer = new SelectCustomer ( CustomerBI . List , true ) )
2011-01-10 19:49:11 +00:00
{
2011-12-05 09:41:02 +00:00
selectCustomer . CustomerEvent + = selectCustomer_customerEvent ;
2011-01-10 19:49:11 +00:00
selectCustomer . ShowDialog ( ) ;
if ( selectCustomer . SelectedItem ! = null )
{
2011-12-05 09:41:02 +00:00
_billInfo . Customer = selectCustomer . SelectedItem ;
2011-01-10 19:49:11 +00:00
}
else
{
2011-06-29 20:27:07 +00:00
using ( var bi = new CustomerBI ( false ) )
2011-12-05 09:41:02 +00:00
_billInfo . Customer = bi . Get ( x = > x . CustomerID = = 1 ) ;
2011-01-10 19:49:11 +00:00
}
}
}
else
{
2011-06-29 20:27:07 +00:00
using ( var bi = new CustomerBI ( false ) )
2011-12-05 09:41:02 +00:00
_billInfo . Customer = bi . Get ( x = > x . CustomerID = = 1 ) ;
2011-01-10 19:49:11 +00:00
}
2011-12-05 09:41:02 +00:00
_saleForm . SetCustomerDisplay ( _billInfo . Customer . Name ) ;
2011-01-10 19:49:11 +00:00
}
2011-08-23 07:10:05 +00:00
private Customer selectCustomer_customerEvent ( object sender , CustomerEventArgs e )
{
using ( var form = new CustomersForm ( e . CustomerID , e . Phone ) )
{
form . ShowDialog ( ) ;
return form . Customer ;
}
}
2011-12-05 09:41:02 +00:00
public void ShowWaiters ( bool reset )
2011-01-10 19:49:11 +00:00
{
2011-12-05 09:41:02 +00:00
if ( reset )
2011-01-10 19:49:11 +00:00
{
2011-12-05 09:41:02 +00:00
using ( var bi = new WaiterBI ( false ) )
_billInfo . Waiter = bi . Get ( x = > x . WaiterID = = 1 ) ;
}
else
{
using ( var selectWaiter = new SelectWaiter ( WaiterBI . List , true ) )
2011-06-29 20:27:07 +00:00
{
2011-12-05 09:41:02 +00:00
selectWaiter . WaiterEvent + = selectWaiter_waiterEvent ;
selectWaiter . ShowDialog ( ) ;
if ( selectWaiter . SelectedItem ! = null )
2011-06-29 20:27:07 +00:00
{
2011-12-05 09:41:02 +00:00
_billInfo . Waiter = selectWaiter . SelectedItem ;
}
else
{
using ( var bi = new WaiterBI ( false ) )
_billInfo . Waiter = bi . Get ( x = > x . WaiterID = = 1 ) ;
2011-06-29 20:27:07 +00:00
}
}
2011-01-10 19:49:11 +00:00
}
2011-12-05 09:41:02 +00:00
_saleForm . SetWaiterDisplay ( _billInfo . Waiter . Name ) ;
2011-01-10 19:49:11 +00:00
}
2011-03-11 18:49:48 +00:00
2011-12-05 09:41:02 +00:00
private Waiter selectWaiter_waiterEvent ( object sender , SelectorEventArgs < Waiter > e )
2011-03-11 18:49:48 +00:00
{
2011-12-05 09:41:02 +00:00
var waiter = e . Item ;
//if (!Thread.CurrentPrincipal.IsInRole("Waiter/Master"))
// return waiter;
using ( var bi = new WaiterBI ( ) )
{
switch ( e . Action )
{
case SelectorAction . Insert : // Add
bi . Insert ( waiter ) ;
e . Handled = true ;
return waiter ;
case SelectorAction . Update : // Edit
bi . Update ( waiter ) ;
e . Handled = true ;
return waiter ;
case SelectorAction . Delete : // Delete
bi . Delete ( x = > x . WaiterID = = waiter . WaiterID ) ;
e . Handled = true ;
return bi . Get ( x = > x . WaiterID = = 1 ) ;
default :
e . Handled = true ;
return bi . Get ( x = > x . WaiterID = = 1 ) ;
}
}
2011-01-10 19:49:11 +00:00
}
2011-03-11 18:49:48 +00:00
2011-01-10 19:49:11 +00:00
private void ShowAmount ( )
{
2012-04-08 12:28:15 +00:00
var taxAmount = _bill . Values . Sum ( b = > b . ServiceTaxAmount + b . VatAmount ) ;
2011-06-23 12:47:48 +00:00
var discountAmount = _bill . Values . Sum ( b = > b . DiscountAmount ) ;
var grossAmount = _bill . Values . Sum ( b = > b . GrossAmount ) ;
var valueAmount = _bill . Values . Sum ( b = > b . Value ) ;
var serviceChargeAmount = _bill . Values . Sum ( b = > b . ServiceChargeAmount ) ;
2011-03-11 18:49:48 +00:00
_saleForm . ShowAmount ( discountAmount , grossAmount , serviceChargeAmount , taxAmount , valueAmount ,
2011-06-23 12:47:48 +00:00
_bill . Values . ToList ( ) ) ;
2011-01-10 19:49:11 +00:00
}
2011-03-11 18:49:48 +00:00
2011-08-23 07:10:05 +00:00
//public void ProductRemove()
//{
// var item = CurrentProduct;
// if (!Allowed(item))
// return;
// if (item.Printed)
// return;
// _bill.Remove(new BillItemKey(item.ProductID, 0));
// _bill.ReCompact();
// ShowAmount();
//}
2011-01-30 07:14:05 +00:00
2011-12-05 09:41:02 +00:00
private static bool Allowed ( BillItemValue item , RoleConstants role )
2011-01-10 19:49:11 +00:00
{
2011-12-05 09:41:02 +00:00
return item ! = null & & Session . IsAllowed ( role ) ;
2011-01-10 19:49:11 +00:00
}
2011-12-05 09:41:02 +00:00
private static bool Allowed ( BillItemValue item )
2011-01-10 19:49:11 +00:00
{
2011-12-05 09:41:02 +00:00
return item ! = null ;
}
2011-06-23 12:47:48 +00:00
2011-12-05 09:41:02 +00:00
private static void IsPrintedOrVoid ( Voucher voucher , out bool isPrinted , out bool isVoid )
{
using ( var bi = new VoucherBI ( false ) )
{
var dbVoucher = bi . Get ( x = > x . VoucherID = = voucher . VoucherID ) ;
isPrinted = dbVoucher . Printed ;
isVoid = dbVoucher . Void ;
}
2011-01-10 19:49:11 +00:00
}
2011-03-11 18:49:48 +00:00
2011-12-05 09:41:02 +00:00
private static bool IsPrintedOrVoid ( Voucher voucher )
2011-02-09 12:03:22 +00:00
{
2011-12-05 09:41:02 +00:00
using ( var bi = new VoucherBI ( false ) )
{
var dbVoucher = bi . Get ( x = > x . VoucherID = = voucher . VoucherID ) ;
return dbVoucher . Printed | | dbVoucher . Void ;
}
2011-02-09 12:03:22 +00:00
}
2011-03-11 18:49:48 +00:00
2011-12-05 09:41:02 +00:00
private static bool IsPrintedOrVoid ( int voucherID )
2011-03-11 18:49:48 +00:00
{
2011-12-05 09:41:02 +00:00
using ( var bi = new VoucherBI ( false ) )
{
var dbVoucher = bi . Get ( x = > x . VoucherID = = voucherID ) ;
return dbVoucher . Printed | | dbVoucher . Void ;
}
}
private bool? IsReprint ( out decimal amount )
{
amount = 0 ;
if ( _billInfo . VoucherID = = 0 )
return false ;
bool isPrinted , isVoid ;
IsPrintedOrVoid ( _billInfo , out isPrinted , out isVoid ) ;
if ( isVoid )
{
MessageBox . Show ( string . Format ( "This Bill is already void.\nReason: {0}" , _billInfo . VoidReason ) , "Bill already Voided" , MessageBoxButtons . OK , MessageBoxIcon . Error ) ;
return null ;
}
if ( isPrinted & & ( ! Session . IsAllowed ( RoleConstants . EDIT_PRINTED_BILL ) ) )
return null ;
amount = _bill . Where ( x = > x . Key . BillItemType = = BillItemType . Product & & x . Key . KotID ! = 0 ) . Sum ( x = > x . Value . GrossAmount ) ;
return isPrinted ;
2011-03-11 18:49:48 +00:00
}
2011-01-10 19:49:11 +00:00
private void InputBox_Validating ( object sender , InputBoxValidatingArgs e )
{
}
2011-03-11 18:49:48 +00:00
2011-01-30 07:14:05 +00:00
private void LoadBill ( int voucherID )
2011-01-10 19:49:11 +00:00
{
ClearBill ( ) ;
2011-06-29 20:27:07 +00:00
using ( var bi = new VoucherBI ( false ) )
2011-08-23 07:10:05 +00:00
{
2011-12-05 09:41:02 +00:00
_billInfo = bi . Get ( x = > x . VoucherID = = voucherID ) ;
_bill . Clear ( ) ;
_saleForm . ShowInfo ( _billInfo ) ;
2011-01-10 19:49:11 +00:00
2011-08-23 07:10:05 +00:00
foreach ( var kot in _billInfo . Kots )
2011-02-18 16:54:48 +00:00
{
2011-08-23 07:10:05 +00:00
var kotKey = new BillItemKey ( kot . KotID ) ;
var kotItem = new BillItemValue ( kot ) ;
_bill . Add ( kotKey , kotItem ) ;
foreach ( var inv in kot . Inventories )
{
var key = new BillItemKey ( inv . Product . ProductID , kot . KotID ) ;
var item = new BillItemValue ( inv . Product )
{
ProductID = inv . Product . ProductID ,
Discount = inv . Discount ,
Name =
inv . Product . Units = = string . Empty
? inv . Product . Name
: inv . Product . Name + " (" + inv . Product . Units + ")" ,
2011-08-28 12:17:15 +00:00
Price = inv . Price ,
2011-08-23 07:10:05 +00:00
Printed = true ,
Quantity = inv . Quantity ,
2012-04-08 12:28:15 +00:00
IsScTaxable = inv . IsScTaxable ,
ServiceTax = inv . ServiceTax ,
Vat = inv . Vat ,
2011-08-23 07:10:05 +00:00
ServiceCharge = inv . ServiceCharge ,
} ;
foreach ( var mod in inv . InventoryModifier )
item . Modifiers . Add ( mod . Modifier ) ;
_bill . Add ( key , item ) ;
}
2011-02-18 16:54:48 +00:00
}
2011-08-23 07:10:05 +00:00
var newKotKey = new BillItemKey ( 0 ) ;
var newKotItem = new BillItemValue ( ) ;
_bill . Add ( newKotKey , newKotItem ) ;
ShowAmount ( ) ;
_saleForm . FormState = SaleFormState . Billing ;
2011-01-10 19:49:11 +00:00
}
}
2011-03-11 18:49:48 +00:00
2011-08-23 07:10:05 +00:00
public void LoadBill ( string tableName )
2011-01-10 19:49:11 +00:00
{
2011-01-13 20:21:02 +00:00
if ( ! string . IsNullOrEmpty ( tableName ) )
2011-01-10 19:49:11 +00:00
{
2011-06-23 12:47:48 +00:00
FoodTable table ;
using ( var bi = new FoodTableBI ( ) )
table = bi . Get ( x = > x . Name = = tableName ) ;
2011-02-18 16:54:48 +00:00
if ( table ! = null & & table . VoucherID ! = 0 )
2011-01-10 19:49:11 +00:00
{
2011-02-18 16:54:48 +00:00
LoadBill ( table . VoucherID ) ;
2011-01-13 20:21:02 +00:00
}
2011-12-05 09:41:02 +00:00
else
{
using ( var frm = new PaxForm ( ) )
{
frm . ShowDialog ( ) ;
_billInfo . TableID = tableName ;
_billInfo . Pax = frm . Pax ;
_saleForm . ShowInfo ( _billInfo ) ;
}
}
2011-01-13 20:21:02 +00:00
}
else
{
2011-06-23 12:47:48 +00:00
var result = "0" ;
if ( GetInput ( "Table Number" , ref result ) )
2011-08-23 07:10:05 +00:00
LoadBill ( result ) ;
2011-06-23 12:47:48 +00:00
else
ClearBill ( ) ;
2011-01-10 19:49:11 +00:00
}
}
public void CancelBillChanges ( )
{
2011-06-23 12:47:48 +00:00
if ( _bill . Values . Any ( i = > i . Printed = = false ) & &
MessageBox . Show ( "Abandon Changes?" , "Abandon Changes" , MessageBoxButtons . YesNo ,
MessageBoxIcon . Question , MessageBoxDefaultButton . Button2 ) = = DialogResult . No )
return ;
2011-01-10 19:49:11 +00:00
ClearBill ( ) ;
}
2011-03-11 18:49:48 +00:00
2011-01-10 19:49:11 +00:00
public void ClearBill ( )
{
2011-12-05 09:41:02 +00:00
_billInfo = new Voucher ( Session . User ) ;
ShowCustomers ( true ) ;
ShowWaiters ( true ) ;
2011-06-23 12:47:48 +00:00
_bill . Clear ( ) ;
var newKotKey = new BillItemKey ( 0 ) ;
2011-08-23 07:10:05 +00:00
var newKotItem = new BillItemValue ( ) ;
2011-06-23 12:47:48 +00:00
_bill . Add ( newKotKey , newKotItem ) ;
2011-08-23 07:10:05 +00:00
_saleForm . ClearBill ( _bill . Values . ToList ( ) ) ;
2011-01-10 19:49:11 +00:00
}
2011-03-11 18:49:48 +00:00
2011-07-12 07:00:48 +00:00
public SaleFormState FormLoad ( )
2011-01-10 19:49:11 +00:00
{
2011-02-18 16:54:48 +00:00
ClearBill ( ) ;
2011-03-11 18:49:48 +00:00
if ( _editVoucherID . HasValue )
2011-01-10 19:49:11 +00:00
{
2011-03-11 18:49:48 +00:00
LoadBill ( _editVoucherID . Value ) ;
2011-07-12 07:00:48 +00:00
return SaleFormState . Billing ;
2011-01-10 19:49:11 +00:00
}
2011-07-12 07:00:48 +00:00
return SaleFormState . Waiting ;
2011-01-10 19:49:11 +00:00
}
2011-03-11 18:49:48 +00:00
2011-01-17 14:55:43 +00:00
internal void SettleBill ( )
{
2011-12-05 09:41:02 +00:00
if ( _billInfo . VoucherID = = 0 )
2011-01-17 14:55:43 +00:00
return ;
2011-03-11 18:49:48 +00:00
if ( ! _billInfo . Printed )
2011-01-31 20:33:22 +00:00
return ;
2011-02-09 12:03:22 +00:00
if ( ! Session . IsAllowed ( RoleConstants . SETTLE_BILL ) )
return ;
2011-03-11 18:49:48 +00:00
IDictionary < SettleOption , decimal > options ;
2011-06-23 12:47:48 +00:00
var amount = ( _billInfo . Settlements . Single ( x = > x . Settled = = SettleOption . Amount ) . Amount +
_billInfo . Settlements . Single ( x = > x . Settled = = SettleOption . RoundOff ) . Amount ) * - 1 ;
2011-12-05 09:41:02 +00:00
using ( var frm = new SettleChoicesForm ( amount , _billInfo . VoucherType ) )
2011-01-17 14:55:43 +00:00
{
frm . ShowDialog ( ) ;
2011-03-11 18:49:48 +00:00
options = frm . OptionsChosen ;
2011-01-17 14:55:43 +00:00
}
2011-03-11 18:49:48 +00:00
if ( options . Count = = 0 )
return ;
2011-06-29 20:27:07 +00:00
using ( var bi = new VoucherSettlementBI ( ) )
bi . SettleVoucher ( Session . User , _billInfo . VoucherID , options ) ;
2011-03-11 18:49:48 +00:00
ClearBill ( ) ;
2011-01-17 14:55:43 +00:00
}
2011-02-18 16:54:48 +00:00
2011-06-23 12:47:48 +00:00
#region Move Table ( s ) / Kot ( s )
2011-03-11 18:49:48 +00:00
private static FoodTable GetTableForMove ( bool allowMerge )
2011-02-18 16:54:48 +00:00
{
2011-06-23 12:47:48 +00:00
using ( var bi = new FoodTableBI ( ) )
2011-02-18 16:54:48 +00:00
{
2011-06-23 12:47:48 +00:00
using ( var frm = new MoveTableForm ( bi . List ( ) , allowMerge ) )
{
frm . ShowDialog ( ) ;
if ( frm . Selection ! = null )
return frm . Selection ;
}
return null ;
2011-02-18 16:54:48 +00:00
}
}
2011-12-05 09:41:02 +00:00
internal void MoveKot ( )
2011-02-18 16:54:48 +00:00
{
2011-12-05 09:41:02 +00:00
if ( _billInfo . VoucherID = = 0 )
return ;
if ( IsPrintedOrVoid ( _billInfo ) )
2011-02-18 16:54:48 +00:00
return ;
var kot = CurrentKot ;
if ( kot = = null )
return ;
var table = GetTableForMove ( true ) ;
if ( table = = null )
return ;
2011-12-05 09:41:02 +00:00
if ( table . Name = = _billInfo . TableID )
2011-08-23 07:10:05 +00:00
return ;
2011-12-05 09:41:02 +00:00
if ( table . VoucherID ! = 0 )
if ( IsPrintedOrVoid ( table . VoucherID ) )
return ;
2011-06-23 12:47:48 +00:00
var kotCount = _bill . Keys . Count ( x = > x . BillItemType = = BillItemType . Kot & & x . KotID ! = 0 ) ;
2011-03-11 18:49:48 +00:00
var voucherID = 0 ;
2011-06-23 12:47:48 +00:00
if ( table . VoucherID = = 0 & & kotCount > 1 )
2011-02-18 16:54:48 +00:00
//Move Kot
voucherID = MoveKot ( kot , table ) ;
2011-06-23 12:47:48 +00:00
else if ( table . VoucherID ! = 0 & & kotCount > 1 )
2011-02-18 16:54:48 +00:00
//Merge Kot
voucherID = MergeKot ( kot , table ) ;
2011-12-05 09:41:02 +00:00
else if ( table . VoucherID = = 0 & & kotCount = = 1 )
//Move Table
voucherID = MoveTable ( table ) ;
2011-06-23 12:47:48 +00:00
else if ( table . VoucherID ! = 0 & & kotCount = = 1 )
2011-02-18 16:54:48 +00:00
//Merge Table
voucherID = MergeTable ( table ) ;
if ( voucherID ! = 0 )
LoadBill ( voucherID ) ;
}
2011-06-23 12:47:48 +00:00
internal void MoveTable ( )
{
2011-12-05 09:41:02 +00:00
if ( _billInfo . VoucherID = = 0 )
2011-06-23 12:47:48 +00:00
return ;
2011-12-05 09:41:02 +00:00
var allowMerge = ! IsPrintedOrVoid ( _billInfo ) ;
var table = GetTableForMove ( allowMerge ) ;
2011-06-23 12:47:48 +00:00
if ( table = = null )
return ;
2011-12-05 09:41:02 +00:00
if ( table . Name = = _billInfo . TableID )
return ;
if ( table . VoucherID ! = 0 )
if ( IsPrintedOrVoid ( table . VoucherID ) )
return ;
2011-06-23 12:47:48 +00:00
LoadBill ( table . VoucherID = = 0 ? MoveTable ( table ) : MergeTable ( table ) ) ;
}
2011-03-11 18:49:48 +00:00
2011-06-23 12:47:48 +00:00
private int MoveKot ( BillItemKey kot , FoodTable table )
{
if ( ! Session . IsAllowed ( RoleConstants . MOVE_KOT ) )
return 0 ;
2011-12-05 09:41:02 +00:00
var voucher = new Voucher ( Session . User , _billInfo . Customer , table . Name , _billInfo . Waiter , _billInfo . Printed , false , "" ) ;
2011-06-29 20:27:07 +00:00
using ( var session = SessionManager . Session )
2011-06-23 12:47:48 +00:00
{
2011-06-29 20:27:07 +00:00
using ( var trans = session . BeginTransaction ( ) )
{
using ( var bi = new VoucherBI ( session , false ) )
{
bi . Insert ( voucher ) ;
using ( var ft = new FoodTableBI ( session , false ) )
ft . UpdateStatus ( voucher ) ;
var voucherId = bi . MergeKot ( kot . KotID , voucher ) ;
trans . Commit ( ) ;
return voucherId ;
}
}
}
2011-06-23 12:47:48 +00:00
}
2011-06-29 20:27:07 +00:00
2011-06-23 12:47:48 +00:00
private static int MergeKot ( BillItemKey kot , FoodTable table )
{
if ( ! Session . IsAllowed ( RoleConstants . MERGE_KOT ) )
return 0 ;
2011-06-29 20:27:07 +00:00
using ( var bi = new VoucherBI ( ) )
return bi . MergeKot ( kot . KotID , table ) ;
2011-06-23 12:47:48 +00:00
}
private int MoveTable ( FoodTable table )
{
if ( ! Session . IsAllowed ( RoleConstants . MOVE_TABLE ) )
return 0 ;
using ( var ft = new FoodTableBI ( ) )
return ft . Move ( _billInfo . TableID , table ) ;
}
private int MergeTable ( FoodTable table )
{
if ( ! Session . IsAllowed ( RoleConstants . MERGE_TABLE ) )
return 0 ;
2011-12-05 09:41:02 +00:00
int voucherID ;
using ( var bi = new VoucherBI ( ) )
voucherID = bi . MergeTables ( _billInfo . VoucherID , table ) ;
2011-06-29 20:27:07 +00:00
using ( var bi = new VoucherBI ( ) )
bi . Delete ( _billInfo . VoucherID ) ;
2011-12-05 09:41:02 +00:00
return voucherID ;
2011-06-23 12:47:48 +00:00
}
#endregion
2011-03-11 18:49:48 +00:00
#region Save
2011-12-05 09:41:02 +00:00
public void SaveKot ( )
{
#region Check if Allowed
if ( ! Session . IsAllowed ( RoleConstants . PRINT_KOT ) )
return ;
if ( _billInfo . VoucherID ! = 0 & & IsPrintedOrVoid ( _billInfo ) )
return ;
if ( _bill . Count = = 1 ) //new kot only
return ;
#endregion
//Save
var saved = _billInfo . VoucherID = = 0 ? InsertVoucher ( false , ! _editVoucherID . HasValue ) : UpdateVoucher ( false , ! _editVoucherID . HasValue ) ;
2011-03-11 18:49:48 +00:00
2011-12-05 09:41:02 +00:00
//Print
if ( ( ! _editVoucherID . HasValue | | _print ) & & saved . HasValue )
Thermal . PrintKot ( _billInfo . VoucherID , saved . Value ) ;
//Cleanup
if ( _editVoucherID . HasValue )
_saleForm . CloseWindow ( ) ;
else
ClearBill ( ) ;
}
public void SaveBill ( )
2011-03-11 18:49:48 +00:00
{
2011-12-05 09:41:02 +00:00
#region Check if Allowed
2011-06-23 12:47:48 +00:00
if ( ! Session . IsAllowed ( RoleConstants . PRINT_BILL ) )
return ;
if ( _bill . Count = = 1 ) //new kot only
return ;
2011-12-05 09:41:02 +00:00
#endregion
decimal amount ;
var isReprint = IsReprint ( out amount ) ;
if ( ! isReprint . HasValue )
2011-08-23 07:10:05 +00:00
return ;
2011-12-05 09:41:02 +00:00
else if ( isReprint . Value )
{
SetDiscount ( ) ;
SaveReprintOrDiscountBill ( amount ) ;
}
2011-08-23 07:10:05 +00:00
else
2011-12-05 09:41:02 +00:00
{
SetDiscount ( ) ;
// Ask for VoucherType only for new bill, if none, then cancel
VoucherType ? voucherType ;
using ( var frm = new VoucherTypeForm ( ) )
{
frm . ShowDialog ( ) ;
voucherType = frm . Selection ;
}
if ( ! voucherType . HasValue )
return ;
_billInfo . VoucherType = voucherType . Value ;
var saved = _billInfo . VoucherID = = 0 ? InsertVoucher ( true , ! _editVoucherID . HasValue ) : UpdateVoucher ( true , ! _editVoucherID . HasValue ) ;
}
2011-06-23 12:47:48 +00:00
if ( ! _editVoucherID . HasValue | | _print )
Thermal . PrintBill ( _billInfo . VoucherID ) ;
if ( _editVoucherID . HasValue )
_saleForm . CloseWindow ( ) ;
ClearBill ( ) ;
}
2011-12-05 09:41:02 +00:00
public void SplitBill ( )
{
#region Permissions
bool isPrinted , isVoid ;
IsPrintedOrVoid ( _billInfo , out isPrinted , out isVoid ) ;
if ( _billInfo . VoucherID = = 0 | | isVoid )
return ; // must be existing non void bill
if ( ! Session . IsAllowed ( RoleConstants . SPLIT_BILL ) )
return ;
#endregion
#region Get Move List
HashSet < string > splitList = null ;
using ( var bi = new ProductGroupBI ( ) )
{
using ( var frm = new DiscountForm ( bi . GetProductGroupTypes ( ) ) )
if ( frm . ShowDialog ( ) = = DialogResult . OK )
frm . Selection ( out splitList ) ;
}
if ( splitList = = null | | splitList . Count = = 0 )
return ;
var listFirst = _bill . Where ( x = > x . Key . BillItemType = = BillItemType . Product & & x . Key . KotID ! = 0 & & splitList . Contains ( x . Value . Product . ProductGroup . GroupType ) ) ;
var listSecond = _bill . Where ( x = > x . Key . BillItemType = = BillItemType . Product & & x . Key . KotID ! = 0 & & ! splitList . Contains ( x . Value . Product . ProductGroup . GroupType ) ) ;
if ( listFirst . Count ( ) = = 0 | | listSecond . Count ( ) = = 0 )
return ; // all or none items selected to be moved
#endregion
var table = GetTableForMove ( false ) ;
if ( table = = null )
return ;
#region new voucherFirst
var voucherFirst = new Voucher ( Session . User )
{
Customer = _billInfo . Customer ,
TableID = table . Name ,
Waiter = _billInfo . Waiter ,
Printed = isPrinted ,
Void = false ,
Narration = "" ,
VoucherType = _billInfo . VoucherType
} ;
var kotFirst = GetKot ( listFirst ) ;
if ( kotFirst ! = null )
voucherFirst . Kots . Add ( kotFirst ) ;
#endregion
#region new voucherFirst
var voucherSecond = new Voucher ( Session . User )
{
Customer = _billInfo . Customer ,
TableID = _billInfo . TableID ,
Waiter = _billInfo . Waiter ,
Printed = isPrinted ,
Void = false ,
Narration = "" ,
VoucherType = _billInfo . VoucherType
} ;
var kotSecond = GetKot ( listSecond ) ;
if ( kotSecond ! = null )
voucherSecond . Kots . Add ( kotSecond ) ;
#endregion
#region Old Voucher
_billInfo . User = Session . User ;
_billInfo . Void = true ;
_billInfo . VoidReason = "Bill Split" ;
#endregion
using ( var session = SessionManager . Session )
{
var trans = session . BeginTransaction ( ) ;
using ( var bi = new VoucherBI ( session , false ) )
bi . Insert ( voucherFirst ) ;
trans . Commit ( ) ;
trans = session . BeginTransaction ( ) ;
using ( var bi = new VoucherBI ( session , false ) )
bi . Insert ( voucherSecond ) ;
trans . Commit ( ) ;
trans = session . BeginTransaction ( ) ;
using ( var bi = new VoucherBI ( session , false ) )
bi . Update ( _billInfo ) ;
trans . Commit ( ) ;
trans = session . BeginTransaction ( ) ;
using ( var ft = new FoodTableBI ( session , false ) )
ft . UpdateStatus ( voucherFirst ) ;
using ( var ft = new FoodTableBI ( session , false ) )
ft . UpdateStatus ( voucherSecond ) ;
trans . Commit ( ) ;
trans . Dispose ( ) ;
}
if ( isPrinted )
{
Thermal . PrintBill ( voucherFirst . VoucherID ) ;
Thermal . PrintBill ( voucherSecond . VoucherID ) ;
}
LoadBill ( voucherFirst . VoucherID ) ;
}
public void VoidBill ( )
2011-08-23 07:10:05 +00:00
{
2011-12-05 09:41:02 +00:00
#region Check conditions and Permissions
if ( _billInfo . VoucherID = = 0 )
return ;
//if (!_billInfo.Printed)
// return;
if ( _billInfo . Void )
return ;
if ( ! Session . IsAllowed ( RoleConstants . 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 )
return ;
#endregion
2011-08-23 07:10:05 +00:00
2011-12-05 09:41:02 +00:00
var voidReason = new SelectVoidReason ( GetVoidReason , true ) ;
voidReason . ShowDialog ( ) ;
if ( voidReason . SelectedItem ! = null )
{
using ( var session = SessionManager . Session )
{
using ( var trans = session . BeginTransaction ( ) )
{
using ( var bi = new VoucherBI ( session , false ) )
bi . VoidBill ( _billInfo . VoucherID , voidReason . SelectedItem . Description ) ;
_billInfo . Void = true ;
_billInfo . VoidReason = voidReason . SelectedItem . Description ;
using ( var ft = new FoodTableBI ( session , false ) )
ft . UpdateStatus ( _billInfo ) ;
trans . Commit ( ) ;
}
}
ClearBill ( ) ;
}
else
{
MessageBox . Show ( "Please Select a reason if you want to void the bill" , "Bill NOT Voided" , MessageBoxButtons . OK , MessageBoxIcon . Asterisk ) ;
}
}
2011-08-23 07:10:05 +00:00
2011-12-05 09:41:02 +00:00
private static List < StringType > GetVoidReason ( Dictionary < string , string > filter )
{
var list = new List < StringType >
{
new StringType ( "Discount" ) ,
new StringType ( "Printing Fault" ) ,
new StringType ( "Item Changed" ) ,
new StringType ( "Quantity Reduced" ) ,
new StringType ( "Costing Bill for Party" ) ,
new StringType ( "Cashier Mistake" ) ,
new StringType ( "Management Freesale" ) ,
new StringType ( "Other" )
} ;
return list . Where ( i = > i . Description . ToLower ( ) . Contains ( filter [ "Name" ] . ToLower ( ) . Trim ( ) ) ) . ToList ( ) ;
2011-08-23 07:10:05 +00:00
}
2011-12-05 09:41:02 +00:00
private void SaveReprintOrDiscountBill ( decimal oldAmount )
2011-08-23 07:10:05 +00:00
{
var amountChanged = oldAmount ! = _bill . Where ( x = > x . Key . BillItemType = = BillItemType . Product & & x . Key . KotID ! = 0 ) . Sum ( x = > x . Value . GrossAmount ) ;
var itemsChanged = _bill . Where ( x = > x . Key . BillItemType = = BillItemType . Product & & x . Key . KotID = = 0 ) . Count ( ) ! = 0 ;
if ( amountChanged | | itemsChanged ) // Discount or Products changed
{
#region new voucherFirst
var voucherNew = new Voucher ( Session . User )
{
Customer = _billInfo . Customer ,
TableID = _billInfo . TableID ,
Waiter = _billInfo . Waiter ,
Printed = true ,
Void = false ,
2011-12-05 09:41:02 +00:00
Narration = "" ,
VoucherType = _billInfo . VoucherType
2011-08-23 07:10:05 +00:00
} ;
var kotNew = GetKot ( _bill . Where ( x = > x . Key . BillItemType = = BillItemType . Product ) ) ;
if ( kotNew ! = null )
voucherNew . Kots . Add ( kotNew ) ;
#endregion
#region Old Voucher
_billInfo . User = Session . User ;
_billInfo . Void = true ;
#endregion
using ( var session = SessionManager . Session )
{
using ( var trans = session . BeginTransaction ( ) )
{
using ( var bi = new VoucherBI ( session , false ) )
{
bi . Insert ( voucherNew ) ;
_billInfo . VoidReason = string . Format ( "Bill Discounted / Changed. New Bill ID is {0}" , voucherNew . BillID ) ;
bi . Update ( _billInfo ) ;
}
using ( var ft = new FoodTableBI ( session , false ) )
ft . UpdateStatus ( voucherNew ) ;
trans . Commit ( ) ;
}
}
LoadBill ( voucherNew . VoucherID ) ;
}
else
{
using ( var bi = new ReprintBI ( ) )
bi . Insert ( new Reprint ( ) { Date = DbValues . Date , User = Session . User , Voucher = _billInfo } ) ;
}
}
2011-12-05 09:41:02 +00:00
private int? InsertVoucher ( bool finalBill , bool updateTable )
2011-03-11 18:49:48 +00:00
{
2011-12-05 09:41:02 +00:00
_billInfo . Printed = finalBill ;
_billInfo . Void = false ;
_billInfo . Narration = "" ;
//UpdateKots();
2011-08-23 07:10:05 +00:00
var kot = GetKot ( _bill . Where ( x = > x . Key . BillItemType = = BillItemType . Product & & x . Key . KotID = = 0 & & x . Value . Quantity ! = 0 ) ) ;
2011-12-05 09:41:02 +00:00
if ( kot = = null )
return null ;
_billInfo . Kots . Add ( kot ) ;
2011-06-29 20:27:07 +00:00
using ( var session = SessionManager . Session )
{
using ( var trans = session . BeginTransaction ( ) )
{
int? kotID ;
2012-12-01 09:49:33 +00:00
bool tableExists = false ;
2011-06-29 20:27:07 +00:00
using ( var bi = new VoucherBI ( session , false ) )
kotID = bi . Insert ( _billInfo ) ;
if ( updateTable )
using ( var ft = new FoodTableBI ( session , false ) )
2012-12-01 09:49:33 +00:00
{
tableExists = ft . Get ( x = > x . Name = = _billInfo . TableID ) . VoucherID = = 0 ;
2011-06-29 20:27:07 +00:00
ft . UpdateStatus ( _billInfo ) ;
2012-12-01 09:49:33 +00:00
}
if ( tableExists )
{
MessageBox . Show ( "A bill exists on this table, cannot overrite" , "Bill Open" ,
MessageBoxButtons . OK , MessageBoxIcon . Error ) ;
trans . Rollback ( ) ;
return null ;
}
else
{
trans . Commit ( ) ;
return kotID ;
}
2011-06-29 20:27:07 +00:00
}
}
2011-03-11 18:49:48 +00:00
}
2011-12-05 09:41:02 +00:00
private int? UpdateVoucher ( bool finalBill , bool updateTable )
2011-03-11 18:49:48 +00:00
{
_billInfo . User = Session . User ;
2011-08-23 07:10:05 +00:00
2011-06-23 12:47:48 +00:00
UpdateKots ( ) ;
2011-08-23 07:10:05 +00:00
if ( ! _billInfo . Printed )
{
var kot = GetKot ( _bill . Where ( x = > x . Key . BillItemType = = BillItemType . Product & & x . Key . KotID = = 0 & & x . Value . Quantity ! = 0 ) ) ;
if ( kot ! = null )
_billInfo . Kots . Add ( kot ) ;
}
_billInfo . Printed = finalBill ;
2011-06-29 20:27:07 +00:00
using ( var session = SessionManager . Session )
{
using ( var trans = session . BeginTransaction ( ) )
{
int? kotID ;
using ( var bi = new VoucherBI ( session , false ) )
kotID = bi . Update ( _billInfo ) ;
if ( updateTable )
using ( var ft = new FoodTableBI ( session , false ) )
ft . UpdateStatus ( _billInfo ) ;
trans . Commit ( ) ;
return kotID ;
}
}
2011-06-23 12:47:48 +00:00
}
private void UpdateKots ( )
{
foreach ( var item in _bill . Where ( x = > x . Key . BillItemType = = BillItemType . Product & & x . Key . KotID ! = 0 ) )
{
var i = _billInfo . Kots . Single ( x = > x . KotID = = item . Key . KotID ) . Inventories . Single ( x = > x . Product . ProductID = = item . Key . ProductID ) ;
i . Discount = item . Value . Discount ;
2011-08-28 12:17:15 +00:00
i . Price = item . Value . Price ;
2011-06-23 12:47:48 +00:00
}
2011-03-11 18:49:48 +00:00
}
2011-08-23 07:10:05 +00:00
private static Kot GetKot ( IEnumerable < KeyValuePair < BillItemKey , BillItemValue > > list )
2011-03-11 18:49:48 +00:00
{
var kot = new Kot ( ) ;
2011-08-23 07:10:05 +00:00
foreach ( var item in list )
{
var oldInv = kot . Inventories . SingleOrDefault ( x = > x . Product . ProductID = = item . Key . ProductID ) ;
if ( oldInv ! = null )
{
oldInv . Quantity + = item . Value . Quantity ;
if ( oldInv . Quantity = = 0 )
kot . Inventories . Remove ( oldInv ) ;
}
else
{
var inv = new Inventory
{
Product = item . Value . Product ,
Quantity = item . Value . Quantity ,
2011-08-28 12:17:15 +00:00
Price = item . Value . Price ,
FullPrice = item . Value . FullPrice ,
2011-08-23 07:10:05 +00:00
Discount = item . Value . Discount ,
ServiceCharge = item . Value . ServiceCharge ,
2012-04-08 12:28:15 +00:00
IsScTaxable = item . Value . IsScTaxable ,
ServiceTax = item . Value . ServiceTax ,
Vat = item . Value . Vat
2011-08-23 07:10:05 +00:00
} ;
foreach ( var mod in item . Value . Modifiers )
inv . InventoryModifier . Add ( new InventoryModifier { Modifier = mod } ) ;
kot . Inventories . Add ( inv ) ;
}
2011-03-11 18:49:48 +00:00
}
2011-08-23 07:10:05 +00:00
2011-06-23 12:47:48 +00:00
return kot . Inventories . Count = = 0 ? null : kot ;
}
#endregion
2011-12-05 09:41:02 +00:00
2011-06-23 12:47:48 +00:00
#region InputBox
private bool GetInput ( string prompt , ref decimal amount )
{
var result = InputBox . Show ( prompt , amount . ToString ( ) , InputBox_Validating ) ;
if ( ! result . OK )
return false ;
2011-12-05 09:41:02 +00:00
return decimal . TryParse ( result . Text , out amount ) ;
2011-06-23 12:47:48 +00:00
}
private bool GetInput ( string prompt , ref string info )
{
var result = InputBox . Show ( prompt , info , InputBox_Validating ) ;
if ( ! result . OK )
return false ;
info = result . Text . Trim ( ) ;
2011-12-05 09:41:02 +00:00
return ! string . IsNullOrEmpty ( info ) ;
2011-03-11 18:49:48 +00:00
}
#endregion
2011-01-10 19:49:11 +00:00
}
2011-03-11 18:49:48 +00:00
}