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
{
2011-06-23 12:47:48 +00:00
private readonly OrderedDictionary < BillItemKey , BillItemValue > _bill ;
2011-03-11 18:49:48 +00:00
private Voucher _billInfo ;
2011-06-29 20:27:07 +00:00
private Customer _customer ;
2011-03-11 18:49:48 +00:00
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-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 ;
_bill = new OrderedDictionary < BillItemKey , BillItemValue > ( ) ;
2011-06-29 20:27:07 +00:00
using ( var bi = new CustomerBI ( false ) )
_customer = bi . Get ( x = > x . CustomerID = = 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 ;
this . _saleForm . SetCustomerDisplay ( _customer . Name ) ;
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 ) ;
var old =
_bill . Where ( x = > x . Key . BillItemType = = BillItemType . Product & & x . Key . ProductID = = newKey . ProductID ) .
FirstOrDefault ( ) ;
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 ( ) ;
}
public void ShowDiscount ( )
{
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-01-10 19:49:11 +00:00
public void ShowCustomerList ( bool reset )
{
2011-03-11 18:49:48 +00:00
if ( ( _customer . CustomerID = = 1 ) & & ( ! reset ) )
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-03-11 18:49:48 +00:00
selectCustomer . customerEvent + = selectCustomer_customerEvent ;
2011-01-10 19:49:11 +00:00
selectCustomer . ShowDialog ( ) ;
if ( selectCustomer . SelectedItem ! = null )
{
2011-03-11 18:49:48 +00:00
_customer = selectCustomer . SelectedItem ;
_saleForm . SetCustomerDisplay ( _customer . Name ) ;
2011-01-10 19:49:11 +00:00
}
else
{
2011-06-29 20:27:07 +00:00
using ( var bi = new CustomerBI ( false ) )
_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 ) )
_customer = bi . Get ( x = > x . CustomerID = = 1 ) ;
2011-03-11 18:49:48 +00:00
_saleForm . SetCustomerDisplay ( _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-03-11 18:49:48 +00:00
public void VoidBill ( )
2011-01-10 19:49:11 +00:00
{
2011-08-23 07:10:05 +00:00
#region Check conditions and Permissions
2011-03-11 18:49:48 +00:00
if ( _billInfo = = null )
2011-02-09 12:03:22 +00:00
return ;
2011-08-23 07:10:05 +00:00
//if (!_billInfo.Printed)
// return;
if ( _billInfo . Void )
2011-02-09 12:03:22 +00:00
return ;
2011-03-11 18:49:48 +00:00
if ( ! Session . IsAllowed ( RoleConstants . VOID_BILL ) )
2011-02-09 12:03:22 +00:00
return ;
2011-08-23 07:10:05 +00:00
if ( MessageBox . Show ( "Are you sure you want to void this bill?" , "Void Bill" , MessageBoxButtons . YesNo , MessageBoxIcon . Question , MessageBoxDefaultButton . Button2 ) ! = DialogResult . Yes )
2011-02-09 12:03:22 +00:00
return ;
2011-08-23 07:10:05 +00:00
#endregion
2011-03-11 18:49:48 +00:00
var voidReason = new SelectVoidReason ( GetVoidReason , true ) ;
voidReason . ShowDialog ( ) ;
if ( voidReason . SelectedItem ! = null )
2011-01-10 19:49:11 +00:00
{
2011-06-29 20:27:07 +00:00
using ( var session = SessionManager . Session )
{
using ( var trans = session . BeginTransaction ( ) )
{
using ( var bi = new VoucherBI ( session , false ) )
bi . VoidBill ( _billInfo . VoucherID , voidReason . SelectedItem . Description ) ;
using ( var ft = new FoodTableBI ( session , false ) )
ft . UpdateStatus ( _billInfo ) ;
trans . Commit ( ) ;
}
}
2011-03-11 18:49:48 +00:00
ClearBill ( ) ;
2011-01-30 07:14:05 +00:00
}
2011-02-18 16:54:48 +00:00
else
2011-01-10 19:49:11 +00:00
{
2011-08-23 07:10:05 +00:00
MessageBox . Show ( "Please Select a reason if you want to void the bill" , "Bill NOT Voided" , MessageBoxButtons . OK , MessageBoxIcon . Asterisk ) ;
2011-01-10 19:49:11 +00:00
}
}
2011-03-11 18:49:48 +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" )
} ;
2011-01-10 19:49:11 +00:00
return list . Where ( i = > i . Description . ToLower ( ) . Contains ( filter [ "Name" ] . ToLower ( ) . Trim ( ) ) ) . ToList ( ) ;
}
2011-03-11 18:49:48 +00:00
2011-01-10 19:49:11 +00:00
private void ShowAmount ( )
{
2011-06-23 12:47:48 +00:00
var taxAmount = _bill . Values . Sum ( b = > b . TaxAmount ) ;
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-02-09 12:03:22 +00:00
public void SetQuantity ( decimal quantity , bool prompt )
2011-01-10 19:49:11 +00:00
{
2011-02-09 12:03:22 +00:00
var item = CurrentProduct ;
if ( ! Allowed ( item ) )
2011-01-10 19:49:11 +00:00
return ;
2011-06-23 12:47:48 +00:00
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 ) . Sum ( x = > x . Value . Quantity ) ;
if ( total < 0 )
quantity - = total ;
item . Quantity = quantity ;
2011-01-10 19:49:11 +00:00
ShowAmount ( ) ;
}
2011-01-30 07:14:05 +00:00
public void ChangeRate ( )
2011-01-10 19:49:11 +00:00
{
2011-02-18 16:54:48 +00:00
var item = CurrentProduct ;
2011-06-23 12:47:48 +00:00
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 ) )
2011-02-18 16:54:48 +00:00
return ;
2011-06-23 12:47:48 +00:00
foreach ( var sub in _bill . Where ( x = > x . Key . BillItemType = = BillItemType . Product & & x . Key . ProductID = = item . ProductID ) )
sub . Value . Price = rate ;
2011-02-09 12:03:22 +00:00
ShowAmount ( ) ;
2011-01-10 19:49:11 +00:00
}
2011-03-11 18:49:48 +00:00
2011-06-23 12:47:48 +00:00
private bool Allowed ( BillItemValue item , RoleConstants role )
2011-02-09 12:03:22 +00:00
{
2011-08-23 07:10:05 +00:00
return item ! = null & & Session . IsAllowed ( role ) ;
2011-02-09 12:03:22 +00:00
}
2011-03-11 18:49:48 +00:00
2011-06-23 12:47:48 +00:00
private bool Allowed ( BillItemValue item )
2011-03-11 18:49:48 +00:00
{
return item ! = null ;
}
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-23 12:47:48 +00:00
_bill . Clear ( ) ;
2011-03-11 18:49:48 +00:00
_billInfo = null ;
2011-06-29 20:27:07 +00:00
using ( var bi = new VoucherBI ( false ) )
2011-08-23 07:10:05 +00:00
{
2011-06-29 20:27:07 +00:00
_billInfo = bi . Get ( voucherID ) ;
2011-01-10 19:49:11 +00:00
2011-08-23 07:10:05 +00:00
_customer = _billInfo . Customer ;
_saleForm . ShowInfo ( _billInfo . BillID , _billInfo . KotID , _billInfo . CreationDate , _billInfo . Date . Value ,
_billInfo . LastEditDate , _customer . Name , _billInfo . TableID , _billInfo . Waiter . WaiterID ,
_billInfo . Waiter . Name ) ;
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 ,
Tax = inv . Tax ,
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
}
}
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-03-11 18:49:48 +00:00
_billInfo = null ;
2011-01-10 19:49:11 +00:00
ShowCustomerList ( 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-03-11 18:49:48 +00:00
if ( _billInfo = = null )
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 ;
using ( var frm = new SettleChoicesForm ( amount ) )
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
}
}
internal void MergeKot ( )
{
2011-03-11 18:49:48 +00:00
if ( _billInfo = = null )
2011-02-18 16:54:48 +00:00
return ;
2011-06-29 20:27:07 +00:00
using ( var bi = new VoucherBI ( false ) )
if ( bi . IsVoucherPrinted ( _billInfo . VoucherID ) & & ! Session . IsAllowed ( RoleConstants . EDIT_PRINTED_BILL ) )
return ;
2011-02-18 16:54:48 +00:00
var kot = CurrentKot ;
if ( kot = = null )
return ;
var table = GetTableForMove ( true ) ;
if ( table = = null )
return ;
2011-08-23 07:10:05 +00:00
if ( _billInfo . TableID = = table . Name )
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
//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 Kot
voucherID = MergeKot ( 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 Table
voucherID = MergeTable ( table ) ;
if ( voucherID ! = 0 )
LoadBill ( voucherID ) ;
}
2011-06-23 12:47:48 +00:00
internal void MoveTable ( )
{
if ( _billInfo = = null )
return ;
2011-06-29 20:27:07 +00:00
using ( var bi = new VoucherBI ( false ) )
if ( bi . IsVoucherPrinted ( _billInfo . VoucherID ) & & ! Session . IsAllowed ( RoleConstants . EDIT_PRINTED_BILL ) )
return ;
2011-06-23 12:47:48 +00:00
var table = GetTableForMove ( true ) ;
if ( table = = null )
return ;
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-08-23 07:10:05 +00:00
var voucher = new Voucher ( Session . User )
2011-06-29 20:27:07 +00:00
{
Customer = _billInfo . Customer ,
TableID = table . Name ,
Waiter = _billInfo . Waiter ,
2011-08-23 07:10:05 +00:00
Printed = _billInfo . Printed ,
2011-06-29 20:27:07 +00:00
Void = false ,
Narration = "" ,
} ;
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-08-23 07:10:05 +00:00
if ( _billInfo . Printed )
return 0 ;
2011-06-23 12:47:48 +00:00
var kots = _bill . Keys . Where ( x = > x . BillItemType = = BillItemType . Kot & & x . KotID ! = 0 ) ;
foreach ( var item in kots )
MergeKot ( item , table ) ;
2011-06-29 20:27:07 +00:00
using ( var bi = new VoucherBI ( ) )
bi . Delete ( _billInfo . VoucherID ) ;
2011-06-23 12:47:48 +00:00
return table . VoucherID ;
}
#endregion
2011-03-11 18:49:48 +00:00
#region Save
2011-06-23 12:47:48 +00:00
public void SaveBill ( int waiterID , string tableID )
2011-03-11 18:49:48 +00:00
{
2011-06-23 12:47:48 +00:00
if ( ! Session . IsAllowed ( RoleConstants . PRINT_BILL ) )
return ;
if ( _bill . Count = = 1 ) //new kot only
return ;
2011-08-23 07:10:05 +00:00
var printed = false ;
if ( _billInfo ! = null )
using ( var bi = new VoucherBI ( false ) )
2011-08-28 12:17:15 +00:00
{
var voucher = bi . Get ( _billInfo . VoucherID ) ;
if ( voucher . Void )
{
MessageBox . Show ( string . Format ( "This Bill is already void.\nReason: {0}" , _billInfo . VoidReason ) , "Bill already Voided" , MessageBoxButtons . OK , MessageBoxIcon . Error ) ;
return ;
}
printed = voucher . Printed ;
}
2011-08-23 07:10:05 +00:00
if ( printed & & ( ! Session . IsAllowed ( RoleConstants . EDIT_PRINTED_BILL ) ) )
return ;
var amount = _bill . Where ( x = > x . Key . BillItemType = = BillItemType . Product & & x . Key . KotID ! = 0 ) . Sum ( x = > x . Value . GrossAmount ) ;
2011-06-23 12:47:48 +00:00
ShowDiscount ( ) ;
2011-08-23 07:10:05 +00:00
if ( printed )
SaveReprintOrDiscountBill ( waiterID , tableID , amount ) ;
else
SaveNewBill ( waiterID , tableID ) ;
2011-06-23 12:47:48 +00:00
if ( ! _editVoucherID . HasValue | | _print )
Thermal . PrintBill ( _billInfo . VoucherID ) ;
if ( _editVoucherID . HasValue )
_saleForm . CloseWindow ( ) ;
ClearBill ( ) ;
}
2011-08-23 07:10:05 +00:00
public void SaveNewBill ( int waiterID , string tableID )
{
var saved = _billInfo = = null
? InsertVoucher ( true , waiterID , tableID , ! _editVoucherID . HasValue )
: UpdateVoucher ( true , waiterID , tableID , ! _editVoucherID . HasValue ) ;
}
public void SaveReprintOrDiscountBill ( int waiterID , string tableID , decimal oldAmount )
{
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 ,
Narration = ""
} ;
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-06-23 12:47:48 +00:00
public void SaveKot ( int waiterID , string tableID )
{
if ( ! Session . IsAllowed ( RoleConstants . PRINT_KOT ) )
2011-03-11 18:49:48 +00:00
return ;
2011-08-23 07:10:05 +00:00
using ( var bi = new VoucherBI ( false ) ) // Kot on printed bill not allowed
if ( ( _billInfo ! = null ) & & ( bi . IsVoucherPrinted ( _billInfo . VoucherID ) ) )
2011-06-29 20:27:07 +00:00
return ;
2011-06-23 12:47:48 +00:00
if ( _bill . Count = = 1 ) //new kot only
2011-03-11 18:49:48 +00:00
return ;
2011-06-23 12:47:48 +00:00
var saved = _billInfo = = null ? InsertVoucher ( false , waiterID , tableID , ! _editVoucherID . HasValue ) : UpdateVoucher ( false , waiterID , tableID , ! _editVoucherID . HasValue ) ;
if ( ( ! _editVoucherID . HasValue | | _print ) & & saved . HasValue )
Thermal . PrintKot ( _billInfo . VoucherID , saved . Value ) ;
2011-03-11 18:49:48 +00:00
if ( _editVoucherID . HasValue )
_saleForm . CloseWindow ( ) ;
ClearBill ( ) ;
}
2011-06-23 12:47:48 +00:00
private int? InsertVoucher ( bool finalBill , int waiterID , string tableID , bool updateTable )
2011-03-11 18:49:48 +00:00
{
if ( _billInfo ! = null )
{
MessageBox . Show ( "Error in InsertVoucher, there is a previous sale in memory" , "Error" ) ;
return null ;
}
2011-08-23 07:10:05 +00:00
_billInfo = new Voucher ( Session . User )
2011-03-11 18:49:48 +00:00
{
Customer = _customer ,
//Paid = finalBill,
TableID = tableID ,
Waiter = WaiterBI . GetWaiter ( waiterID ) ,
Printed = finalBill ,
Void = false ,
Narration = "" ,
} ;
2011-06-23 12:47:48 +00:00
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-03-11 18:49:48 +00:00
if ( kot ! = 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 ;
using ( var bi = new VoucherBI ( session , false ) )
kotID = bi . Insert ( _billInfo ) ;
if ( updateTable )
using ( var ft = new FoodTableBI ( session , false ) )
ft . UpdateStatus ( _billInfo ) ;
trans . Commit ( ) ;
return kotID ;
}
}
2011-03-11 18:49:48 +00:00
}
2011-06-23 12:47:48 +00:00
private int? UpdateVoucher ( bool finalBill , int waiterID , string tableID , bool updateTable )
2011-03-11 18:49:48 +00:00
{
_billInfo . User = Session . User ;
_billInfo . Customer = _customer ;
2011-08-23 07:10:05 +00:00
2011-03-11 18:49:48 +00:00
_billInfo . TableID = tableID ;
_billInfo . Waiter = WaiterBI . GetWaiter ( waiterID ) ;
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
}
2011-06-29 20:27:07 +00:00
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 ,
Tax = item . Value . Tax
} ;
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
#region InputBox
private bool GetInput ( string prompt , ref decimal amount )
{
var result = InputBox . Show ( prompt , amount . ToString ( ) , InputBox_Validating ) ;
if ( ! result . OK )
return false ;
if ( ! decimal . TryParse ( result . Text , out amount ) )
return false ;
return true ;
}
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 ( ) ;
if ( string . IsNullOrEmpty ( info ) )
return false ;
return true ;
2011-03-11 18:49:48 +00:00
}
#endregion
2011-08-23 07:10:05 +00:00
public void SplitBill ( )
{
#region Permissions
if ( _billInfo = = null | | _billInfo . VoucherID = = 0 | | _billInfo . Void = = true )
return ; // must be existing non void bill
if ( ! Session . IsAllowed ( RoleConstants . SPLIT_BILL ) )
return ;
#endregion
bool printed ;
using ( var bi = new VoucherBI ( false ) )
printed = bi . IsVoucherPrinted ( _billInfo . VoucherID ) ;
#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 = printed ,
Void = false ,
Narration = ""
} ;
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 = printed ,
Void = false ,
Narration = ""
} ;
var kotSecond = GetKot ( listSecond ) ;
if ( kotSecond ! = null )
voucherSecond . Kots . Add ( kotSecond ) ;
#endregion
#region Old Voucher
_billInfo . User = Session . User ;
_billInfo . Void = true ;
_billInfo . VoidReason = "Printed 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 ( printed )
{
Thermal . PrintBill ( voucherFirst . VoucherID ) ;
Thermal . PrintBill ( voucherSecond . VoucherID ) ;
}
LoadBill ( voucherFirst . VoucherID ) ;
}
2011-01-10 19:49:11 +00:00
}
2011-03-11 18:49:48 +00:00
}