Quick Service/Tables: Food/Retail Setup - Advanced Refunds | Aborts | NonTax Functions


I plan to get a modified version of your DB operational today for serious testing. I don’t have database tool yet, how can i merge without it? What does merge do and is merging always safe? I can imagine that its possible for a merge to cause an issue if there are rules/actions that conflict.


When I say merge… i mean manually recreate by looking at the other database. Sorry I did not mean an automated approach… You could use database tools but when its something like this I always recommend to just manually build it back in. You learn better this way. Its easier to fix mistakes because you know where they might be.

I will be adding tables back into mine soon and just unmap all the rules. This way people wanting to use my database with tables can just remap them and it will work.

Right now I am focused on writing a tutorial to manually achieve what I have in my database. I am working on the Return system now.


There is ONE hurdle I have not found a fix for yet. Its not really a problem with my database its a problem that kind of existed before and my system has a design that fixes it… I just need to figure out a way to restrict this behavior.

Behavior is this:

If you submit an order with a customer assigned by closing the order before payment everything works as intended, it sends it to kitchen, and it goes into Unpaid status. You can pull it back up and Void orders which prints VOID in Kitchen which is intended behavior. HOWEVER if you void EVERY order it sets the ticket amount to 0 and closes ticket with 0 amount. So now you have a ticket with 0 amount listed. This is not really a big deal except my Reprint Receipt button if that Ticket is reopened will crash Samba.

I have 2 ways I can deal with this:

So I am trying to figure out a way to disable void from being used unless there are more than 1 orders on a ticket. This would prevent it from being used to void an entire order. Instead of voiding entire order, you should use the refund function.

Or I can just disable Void function and make everything run through Refund which basically does the same thing.


I’ve tried to reproduce that crash but couldn’t do that. Maybe it is something specific for Reprint Receipt button. I’ll try that once more with your database.

I think two functions for same thing is not needed. For table service Void function is useful to let kitchen know cancelled orders. (eg. wrong entry, customer changed mind). However as we mean to create a fast food / retail setup, disabling void function seems like the best solution.


Yes you will see in another thread a related issue I have found. However I think after reviewing it… I can eliminate it by disabling refund for open tickets for Tables… and disabling Void for tickets with no assigned entity.

Here is Crash Report btw: It definitely looks like something to do with that Automation Command. To be honest If I wanted to reprint a ticket that has all items voided… it should allow it to print. So you might still want to look at this.

[General Info]

Application: SambaPOS
Version:     4.1.55
Region:      en
DB:          SQ
Date:        9/11/2014
Time:        5:12 PM

User Explanation:


[Exception Info 1]

Top-level Exception
Type:        System.InvalidOperationException
Message:     Sequence contains no matching element
Source:      System.Core
Stack Trace: at System.Linq.Enumerable.Single[TSource](IEnumerable`1 source, Func`2 predicate)
   at Samba.Domain.Models.Tickets.Ticket.Recalculate()
   at Samba.Presentation.Services.Implementations.TicketModule.TicketService.RecalculateTicket(Ticket ticket)
   at Samba.Modules.PosModule.TicketViewModel.ClearSelectedItems()
   at Samba.Modules.PosModule.TicketViewModel.ExecuteAutomationCommand(String automationCommandName, String automationCommandValue, String nextCommandValue, Boolean executeOnce)
   at Samba.Modules.PosModule.TicketViewModel.ExecuteAutomationCommand(AutomationCommand automationCommand, String selectedValue, String nextValue)
   at Samba.Modules.PosModule.TicketViewModel.OnExecuteAutomationCommand(CommandContainerButton obj)
   at Microsoft.Practices.Prism.Commands.DelegateCommand`1.<>c__DisplayClass6.<.ctor>b__2(Object o)
   at Microsoft.Practices.Prism.Commands.DelegateCommandBase.Execute(Object parameter)
   at Microsoft.Practices.Prism.Commands.DelegateCommandBase.System.Windows.Input.ICommand.Execute(Object parameter)
   at MS.Internal.Commands.CommandHelpers.CriticalExecuteCommandSource(ICommandSource commandSource, Boolean userInitiated)
   at System.Windows.Controls.Primitives.ButtonBase.OnClick()
   at System.Windows.Controls.Primitives.ToggleButton.OnClick()
   at System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e)
   at System.Windows.UIElement.OnMouseLeftButtonUpThunk(Object sender, MouseButtonEventArgs e)
   at System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
   at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
   at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
   at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
   at System.Windows.UIElement.ReRaiseEventAs(DependencyObject sender, RoutedEventArgs args, RoutedEvent newEvent)
   at System.Windows.UIElement.OnMouseUpThunk(Object sender, MouseButtonEventArgs e)
   at System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
   at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
   at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
   at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
   at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
   at System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args)
   at System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted)
   at System.Windows.Input.InputManager.ProcessStagingArea()
   at System.Windows.Input.InputManager.ProcessInput(InputEventArgs input)
   at System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)
   at System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel)
   at System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
   at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
   at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
   at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
   at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
   at System.Windows.Threading.Dispatcher.Run()
   at System.Windows.Application.RunDispatcher(Object ignore)
   at System.Windows.Application.RunInternal(Window window)
   at System.Windows.Application.Run(Window window)
   at Samba.Presentation.App.Main()


[Assembly Info]

Samba.Services, Version=
mscorlib, Version=
System, Version=
Microsoft.Practices.Prism, Version=
WindowsBase, Version=
Samba.Infrastructure, Version=
Samba.Infrastructure.Data, Version=
PresentationFramework, Version=
System.Xaml, Version=
Samba.Presentation.Services, Version=
FluentValidation, Version=
Samba.Domain, Version=
DevExpress.Xpf.Grid.v14.1, Version=
DevExpress.Xpf.Grid.v14.1.Core, Version=
PresentationCore, Version=
Stateless, Version=
System.Core, Version=
System.Drawing, Version=
System.Windows.Forms, Version=
System.ComponentModel.Composition, Version=
Samba.Localization, Version=
Microsoft.CSharp, Version=
Microsoft.Practices.ServiceLocation, Version=
Samba.Persistance, Version=
Microsoft.Practices.Prism.MefExtensions, Version=
DevExpress.Xpf.Core.v14.1, Version=
PropertyTools, Version=2012.4.14.1


[System Info]

Operating System
-Microsoft Windows 8.1 Pro
--CodeSet = 1252
--CSDVersion = 
--CurrentTimeZone = -300
--FreePhysicalMemory = 13108348
--OSArchitecture = 64-bit
--OSLanguage = 1033
--ServicePackMajorVersion = 0
--ServicePackMinorVersion = 0
--Version = 6.3.9600


--Manufacturer = ASUS
--Model = All Series
--TotalPhysicalMemory = 17115684864



Great. Looking forward to reading that.

What cause the crash? Reopening a 0 amount balance OR a 0 ticket total amount?

Why do you need to ‘reopen’ a ticket to reprint? Can’t you reprint without ‘reopen’? I though ‘reopen’ function was for ticket or order modification…


I am not reopening maybe I worded it wrong. When I view a ticket and press the button.


Do you have a short list of item that i have to merge to resume table side operations - Ive already recreated the entities… e.g. How do i enable and make visible the ‘Settle’ button and the ‘Select Table’ button on the ticket screen without breaking your other customizations?


Settle is the same as Payment I just renamed it to payment. The Select Table is tied to the Entity Screen and Entity Type and setting Department default to Select Entity. I do not. I am finishing up some stuff on my tutorials and then I will put tables back into my DB. I plan to install a fresh TXT Demo mode Samba on my Tablet to view the default settings and transfer them back into my DB.

My wife is at the restaurant today and I am home with the 3 kids trying to get some work done but its getting hard with these 3 crazy kids.


@kendash i have merged tables into your db, seems ok so far, still testing though, and i tried the 100% void then customer reprint but didn’t crash.


Awesome! It might be something with just my system for some reason… not sure why. The way I built it, you will be able to run some VERY detailed custom reports on returns, sales, Gross Sales, Net Sales, Gross Profit, Net Profit, Aborts… etc. I just have not built my reports yet. Keep meaning too and get distracted.


There are a few things I implemented that I disabled like Non Tax sales… and Instant Credit button. You can remap to enable those if you wish.

Non Tax is useful in retail but not so much in food.

EDIT: Just realized as well that I told you wrong I renamed Settle to Settle Cash and I made button show as Payment.

Settle Credit/Debit is a fast instant Credit button that you can map outside payment screen. I just disabled it.


Yep. NIce piece of work you done so far. Very granular design indeed. Ill finish my customizations, and some tests, then shoot you some questions.


A few notes for refunds in case your wondering. I cant remember if I explained it or not.

It is a true reverse transaction system, however it is setup NOT to impact sales so you can still factor Gross Sales vs Net Sales. The way it works is it modifies original ticket to mark the items your refunding as Refunded/Void and then it clones the ticket into a new Refund Ticket TYpe and copies just the items selected over to the new ticket. You simply press refund items to process the refund. This allows you to do entire ticket refunds or just selected item refunds and the tax is accurate because it refactors tax with the refund ticket and it actually does adjust the tax from original ticket because this would not be part of Gross Sales.

Finally it will print a special Refund Receipt for customer to sign…You can edit this if you want. It also reprints original receipt with the Returned items noted on it along with original TR#.

So original ticket amount paid is not altered at all, this gives you gross sales in accounting report. To get Net sales you would just subtract the Refund sales from the Gross sales. You can do this with custom reports.


Cool. Do you treat refunds with product return the same as refunds without?


No I have not built that portion in yet. Right now it is configured very linear. My next project is to work that system in.

It will be simple… just tie in some Ask Questions with Update Order Increase/Decrease inventory action.


So how does it handle the associated product now?


Right now it considers it a throw away. If you want to change that behavior without adding ask question… just modify the action I used to update order. I will get you a screenshot. You would change for Cash as shown below and for Credit/Debit Not shown

I tried to use modular actions too so most of them use Variables so I can reduce the # of actions used. I need to go back through and do this consistently I started doing this later in my development.


Just realized I was wrong it is adding inventory back in. I must have been testing it and forgot and left it in.

Set Decrease to True for it to behave as throw away.


@kendash ok thanks. You don’t make provision for Discounts? or Service Change? I need to process both and tax is included in my advertised prices.