✌ V5 Feature Compilation

Compilation of known features/additions available in V5

:exclamation: This thread was built by scraping feature discussions and initial testing in a Staff conversation before it was released to the V5 Beta Team. It is therefore a bit messy and disorganized, but the intent was to try and document new things as they were developed and tested, so that we wouldn’t lose track of things that were introduced. Many of the features listed herein are very brief and only serve to remind us what was added as development continued. As time permits, some of these features will be made into Tutorials in order to explain things in more detail. This thread should cover most features that were built and tested up to the Public V5 release, which was v5.1.47

Built-in Reports have become Custom Reports

The standard hard-coded Reports such as Workperiod Report have all been converted to Custom Reports, so they can be modified.

To generate them for first use, go to Program Settings > Maintenance > Create default Reports

Program Settings > Maintenance :

Rebuild Default Buttons
Create Default Navigation Buttons
Upgrade Old Rules (v2)
Create default Reports

Scripting Engine switched to full JScript implementation


While most of your scripting will be in Automation > Scripts, you can also use certain JScript functions in Tile Templates, Printer Templates, Action Constraints and Parameters, and Widget Captions.

Template Previews:

Printer Template Preview
Report Template Preview

Warehouse screen displays Transaction Document Buttons
Inventory Transactions can be created outside of Management


Database connection editing screen will test configuration before updating actual connection string.
When database connection fails at runtime we’ll retry connection 5 times with an exponentially increasing delay up to 30 seconds. I hope that will handle a lot of connection issues.

Navigation Screen customization

Local Settings > Display > Allow Custom Navigation

When Navigation Customization is Enabled, go to Program Settings > Maintenance and click the button for Create Default Navigation Buttons. Now the Navigation buttons have become Automation Commands mapped to the Navigation screen. You can change their appearance there, including their color and what text is displayed on them.

The Automation Command buttons, as they appear on the Navigation Screen are referred to as Tiles. Within the Automation Command properties under Navigation you can define a Template to control the Tile content, choose a Symbol to display, and set an Auto-refresh rate in seconds.

You can right-click on the Nav Screen to enable customization of the Tiles, such as Size, Location, and Text Alignment.

  • Mapping a rule is not needed if module button headers matches to module names.
  • If you want to execute rules you can give a different name for button so it will execute rule instead of displaying module.
  • Entering a content template also disables default command and executes automation command.
  • Automation Command > Navigation section has a few settings for button display.
  • Symbol field: use charmap.exe for Segoe UI Symbol font to get “icons”.
  • Printer Template Tags and Custom Report Tags and @@SQL supported in the Template section.
  • Navigation screen layout (button sizes and locations) are stored locally. Other settings (symbol, template, color, etc) are stored in database. This lets users adjust their screens locally on their Terminal.

New Action: Navigate Module

Other than POS Module this action will switch to a sub screen that defined under Parameter setting.

Warehouses > Warehouse Name
Tickets > Filter Name
Reports > Report Name
Entity > Screen Name
Accounts > Screen Name

Rule Debugger

Local Settings > Display

Provides insight into how your Rules are behaving, which are firing, and when.

New Report Tags:

{ENTITY NAME STATE MINUTES:Employees.Melissa:TCStatus:hh'-'mm}
{ENTITY STATE MINUTES BY NAME:<entityTypeName>.<entityName>:<stateName>:<format [mm]>}
{ENTITY STATE MINUTES BY NAME:Employees.Melissa:PunchIn:hh\.mm}


{REPORT INVENTORY:<inventory item name>:<warehouse name>}

Custom Report Syntax for Grouping

[Payment Details:1, 1, 1]
{REPORT PAYMENT DETAILS:P.Name,P.Amount.Percent,P.Amount.Sum:Payment.Amount > 0}

[Ticket Details:1, 1, 1]
{REPORT TICKET DETAILS:T.TicketType,T.Id.Count,T.TotalAmount.Sum}

Time Clock Template: (shows JScript Ternary and Floor operators)

Time Clock

[='{SETTING:TCStatus $1}'=='Clocked In' ? '$1 ::: ' + F(Math.floor({SETTING:TCDuration $1} / 60),'00') + ':' + F({SETTING:TCDuration $1} % 60,'00') : '']

Dark Theme

Local Settings > Display

Use http://color.adobe.com to discover some good looking colors for your taste.

Modifiers of Modifiers (similar to prefixes, except they are suffixes, and behavior is slightly different)


{CALL:X} Tag

Calls a JScript function via its Handler.

Script handler: calculator

function div(x,y) {
   return x/y;

Call it via <handler>.<function> syntax


Helper functions

string web.Download(string url, string regex = "")
string web.Upload(string url, string content)
string file.ReadFromFile(string fileName)
void file.WriteToFile(string fileName, string content)
void file.AppendToFile(string fileName, string content)

Script handler: weather

function current(city,country)
  var u = 'http://www.webservicex.net/globalweather.asmx/GetWeather?CityName='+city+'&CountryName='+country;
  return 'Current Weather<linebreak/>'+city+': ' + web.Download(u,'&lt;Temperature&gt;([^&]+)');

Call it via handler.function()


Formatting tags:

These all require a closing tag, except those which are <implicit/>. For example:

<bold>some bold text</bold>
<italic>some italicized text</italic><br/>
<underline>this text is underlined</underline>

<thin>                  : thinner style
<b>, <u>, <i>           : short for bold, underline, italic
<img>                   : displays an image (URLs supported)
<linebreak/>            : forces a NewLine (NL)
<br/>                   : stops auto-NL in Ticket Lister, fine-tune with <br/>
<sym>                   : displays symbol from Segoe UI Symbol font
<size x>                : font size
<font x>                : font name
<color x>               : font color
<block margin color alignment width>
                        : margin=Left,Top,Right,Bottom
                        : alignment=left,right,center,justified
<panel color alignment>
                        : alignment=left,right,center

Content format support for ALL buttons (symbols,pictures,formatting,etc)

Able to execute SQL scripts inside JScripts using sql.X() Helper

See later post for syntax and operation of the sql.X() Helper.


Entering a content template also disables default command and executes automation command.

1 Like

I made some renames to Jscript helper functions.


used instead of Helper.

1 Like

##JScript Helper objects Documentation.


Helper methods to upload / download data.

returns url content and optionally returns first group capture of given regex.

uploads content to url with POST method.


Helper object to work with files.

returns content of file.

overwrites file with given content.

appends content at the end of the file or creates file if not exists.


This is a helper class that contains a date/time range. Do not use directly. We’ll use dt object to create date ranges.

Starting date time of the range.

Ending date time of the range.

Returns total day count of range.

Returns month name for start date

Contains helper functions to create date ranges (DateRange objects).

retuns a singe day range. All ranges starts at 00:00:00 and ends 23:59:59. Use day parameter to add / subtract days. dt.Day() returns today, dt.Day(-1) returns yesterday.

returns single week date range. dt.Week() returns this week, dt.Week(-1) returns previous week.

returns current Month range. dt.Month(-1) returns previous month.

dt.GetRange(start,end) after [5.1.11]
returns a range from given date strings.
var range = dt.GetRange('1.1.2015','2.2.2015');


Helper to read SQL script results.


Returns a string array (string[]). You can enter a script handler or SQL Query as handlerOrScript parameter. dateRange used to fill {Start} and {End} parameters of script. Delimiter is used to convert multiple columns to a single string value. Use indexer if query returns multiple rows.


var query = 'select count (*) from Tickets where Date > \'{Start}\' and Date < \'{End}\';
var yesterdayTicketCount = sql.Exec(query,dt.Day(-1))[0];

query can also be a script handler. It should start with double @@.

var query = '@@TicketCount';
var yesterdayTicketCount = sql.Exec(query,dt.Day(-1))[0];

Provides a fluent interface to construct date ranged sql queries easily.


Using optional ByWorkPeriod converts date ranges to work period date ranges. For example ByWorkPeriod.ThisWeek aligns ThisWeek range to work period start, end times.

Using delimit will configure a delimiter for multi column queries. Optional.

Can be Today,Yesterday,ThisMonth,PreviousMonth,ThisWeek,PreviousWeek.

Also Range(dateRange) can be used to configure custom ranges. For example

First | All | Join()
Method chains can end with First or All. First returns first row. All returns all rows as a string array. Columns are always merged to a single string with delimiter. Join(<delimiter>) joins All values to a comma delimited string.


Executes Query and returns a string array (string[]). You can enter a script handler or SQL Query as handlerOrScript parameter.


Allows easy parsing of xml format.

Returns a dynamic object that allows you access tag values with properties.


var content = '<car><plate>123</plate><color>red</color></car>';
var car = xml.Parse(content);
var carColor = car.color.Value;
var plateNumber = car.plate.Value;

:bulb: hint: You can read tag values with Value.
For example book.author.birthday.Value;

Helper methods for easy constructing formatted Tile content.


Possible tag functions

Add(content)    * does not terminates


<size 36>Header</size>

You can chain these methods to construct formatted tile content.

<bold><size 36>Header</size></bold>

While chaining methods we need to understand how it terminates. General rule is using optional [content] parameter will terminate method chain. In other words returns result.

For Example:

return tag.Bold().Size(36); will return nothing as Size method used without content and it still expects additional methods.

return tag.Bold().Size(36).Color('red'); will still return nothing.

We can terminate it by using Get(content) method or by using Color method’s optional content parameter.

return tag.Bold().Size(36).Color('red','Hello');
return tag.Bold().Size(36).Color('red').Get('Hello');

Both Produces:
<bold><size 36><color red>Hello</color></size></bold>

:information_source: If content parameter used in a method, chain terminates.

Methods that accepts optional content parameter listed as content parameter in square brackets. For example Bold([content]) means content parameter is optional. You can terminate chain by using content parameter or skip it to add more methods. But for Img(content) method content parameter is not optional. So using that method will immediately terminate chain.

:warning: add(content) method is an exception here. Content parameter is not optional but it does not terminates because it can be used to append non tag related content. For example tag.Add('hello').Add('world').Get(); will produce hello world.

It is possible to concat strings at the end of methods. tag.Bold('Hello') + ' World' will produce <bold>Hello</bold> World.


[JScript] method: JSON.parse()


Example Uses:
Web Services that have JSON output … http://openweathermap.org/api
JSON data stored in SambaPOS Database

[.NET] method: xml.Parse()

Method exposed to scripting engine

var weather=xml.Parse(allxml);
return weather.Temperature.Value + nL + weather.SkyConditions.Value + nL + weather.Wind.Value;

Debugger for scripts

Local Settings > Scripting

Download Free Visual Studio …

Temporarily add keyword debugger inside script code.
When debugger keyword is found, the VS JIT Debugger will launch so we can step through code line-by-line.

KPI Tile example

Demonstrates various new features using JScript and Helper Functions:


Tile Template:



Select count(*) from Tickets where Date > '{Start}' and Date < '{End}'


function ticketCount()
   var thisMonthTickets = sql.Query('@@TicketCount').ThisMonth.First;
   var previousMonthTickets = sql.Query('@@TicketCount').PreviousMonth.First;
   var thisAvg = Math.round(thisMonthTickets / dt.ThisMonth.Days);
   var prevAvg = Math.round(previousMonthTickets / dt.PreviousMonth.Days);
   var inc = thisAvg > prevAvg;
   var sym = inc ? tag.Color('green').Sym('▲') : tag.Color('red').Sym('▼');
   var header = tag.Add(sym).Add(thisMonthTickets).Add('Tickets').Get();
   var footer = tag.Add(dt.PreviousMonth.MonthName).Add(previousMonthTickets).Get('tickets');
   var todayTickets = sql.Query('@@TicketCount').Today.First;
   var footer2a = (prevAvg - todayTickets) + ' more tickets needed';
   var footer2b = (todayTickets - prevAvg) + ' tickets ahead. Keep going';
   var footer2 = inc ? footer2b : footer2a;
   footer = tag.Add(footer).Linebreak().Add(footer2).Get();
   return tag.Size(30).Add(header).Linebreak().Linebreak().Size(14,footer);

<sparkline> Tag

Generates simple graphics inside Tiles.

<sparkline [type] [width]>1,2,3,4,5</sparkline>

[type] can be bar, line, or area

<block> Tag

Used to fine-tune Tile Layouts.

When used as the root tag, it will reset the Tile Margin to zero.
We can also set the following values:

<block [margin] [color] [alignment] [width]>


[margin] is comma-separated values for: Left,Top,Right,Bottom
[color] can be specified as one of: Red, #FF0000, #55FF0000
[alignment] can be one of: left, right, center ,justified
[width] sets the block width in pixels


<block 5,2,9,22 #FF0000 left 250>

Custom Keyboard improvements

CSV support using quoted values:


Last 8 will be a backspace as it not surrounded with double quotes.

New shortcuts:

"<ds>"          Decimal Separator.
"<enter>"       Enter key
"<space>"       Space key
"<backspace>"   Backspace key
"<tab>"         Tab key

Setting text values in the Editor:

"Accept<linebreak/>This=Yes"|"Don't Accept=No"

Clicking “Accept This” button will send “Yes” text into the editor.

Automation Command support:

"Display<linebreak/>Calculator=Execute App:Calculator"

Clicking “Display Calculator” button will execute Execute App Automation Command with Calculator as the Command Value.

POS Numberpad converted to Custom Keyboard

Change it through Menu Category Custom Keyboard setting.

Old Alpha Button Values setting for Menu Category will appear as Custom Keyboard. In the DB it appears as AlphaButtonValues.

Now we have more space to place Automation Command buttons since custom keyboards supports executing automation commands.

Multiple Menu Functionality

Change Screen Menu action implemented for changing menu inside tickets.

Display in Report Explorer setting added to custom reports to un-list widget or print only reports from reports module.

{ENTITY ACCOUNT NAME:<entity type>} Tag

Retrieves the Account Name of an Entity.

Batch Entity Creation screen improvements

Batch adding / editing / deleting entities
Displaying custom fields properly
Batch creating entities with custom fields by CSV format

Markup language for data transfer, import, export

Example, for Batch Create Products dialog:

- Name: Coke
  GroupCode: Drink
  - Name: Bottle
    Price: 1.00
  - Name: Can
    Price: 1.50
  - Name: TagName
    Value: TagValue
- Name: Fanta
  GroupCode: Drink
  - Name: Can
    Price: 1.50


Caption fields on Widgets now include support for Expressions and Tags


Expression reading Program Setting (custom):

[=('{SETTING:WPopen}'=='1' ? 'Open' : 'Closed')]

Built-in Program Setting:


Script Handler Call:


Entity Button Widget also supports Entity-related Tags, such as:


Table Entities showing Entity State with Caption:

<bold>{ENTITY NAME}</bold><linebreak/>{ENTITY STATE:Status}

Table Entity showing Entity Custom Data with Caption:

<bold>{ENTITY NAME}</bold><linebreak/>Server:{ENTITY DATA:Server}

Customer Entity showing Account Balance with Caption:

<bold>{ENTITY NAME}</bold><linebreak/>{ENTITY BALANCE}

Script: ProgramSettings
Handler: settings
Example: {CALL:settings.getSetting('{SETTING:WPopen}')}

function getSetting (settingname) {
  return tag.Get(settingname);

Script: DBQuery
Handler: db
Example: {CALL:db.getSetting('WPopen')}

function getSetting(settingname) {
  var qry = "SELECT [Value] FROM [ProgramSettingValues] WHERE [Name]='"+settingname+"'";
  //var r1 = sql.Exec(qry,dt.Day());
  var r2 = sql.Query(qry).First;
  return r2[0];


Entity Button Widget supports Automation Command

By default, clicking an Entity Button will select the Entity and take you to the POS screen. If you supply an Automation Command, this will prevent the POS screen from showing automatically.


WorkPeriod is <b>[=('{ENTITY STATE:WPStatus}'=='WPopen' ? 'OPEN' : 'CLOSED')]</b><linebreak/>Click here to [=('{ENTITY STATE:WPStatus}'=='WPopen' ? 'Close' : 'Open')] the WorkPeriod

1 Like


Navigation Tiles will contain Tile Cache setting. When we set a Cache Lifetime in minutes it won’t refresh before Cache expires. For example we can set Weather tile Cache Lifetime 30 minutes so it won’t access API for 30 minutes.




New Rule creation automatically adds Default Mapping!

End Work Period Action (disabled)

Start Work Period Action (disabled)

1 Like



  • Ticket Lister will remember selected items while refreshing.
  • Automation Commands for navigations will accept module name and parameter values so we don’t need to setup a rule for common navigation needs.
  • Possible Module Parameters (for example entity screen names for Entity Module) can be selected through combobox.
  • Automation Command’s execute command navigation setting removed as it is not needed with new settings. Leave Navigation module setting blank to execute it as an automation command.
  • Combox selection for navigation tile symbols.
  • <block> tag will accept text alignment and width. If we set a text alignment we should also set width. new syntax is <block margin color alignment width>. Accepted values are left,right,center,justified
  • symbol font setup issue fixed.
  • work period start, end actions enabled.
  • Changing menu items through price list, product tag editor or menu item editor will reset terminal’s cache.
  • I found somewhere manager creates a fake user, makes a gift and deletes him lol. Prevented.
  • JScript sql helper received Join() function to obtain SQL result as a comma delimited string. Will be very useful to build <sparkline> graphs.
  • Setting values more than %90 for category column width disallowed.


Label widget implemented.

Green time display is a label widget that uses double <block> trick to display multi color layout.


Editor widget implemented.

That widget literally makes SambaPOS a development tool. That screen demonstrates a summary calculator.



Automation Commands if configured to use Automation Command Executed event and Navigate Module action will now check if Confirmation option is enabled in the Automation Command.

1 Like

You can now use the Tag Order Action with Free Tagging to write the Tag Description and Price.


Action Display Ticket List has filters for Entity Type and Entity:

Ticket List displays first 30 characters of Ticket Note:

1 Like


Load Ticket Action can load a Ticket by Ticket Tag or Ticket State

Custom Product Tags may have default values.

If you want to setup a default value that contains comma character you can use double quotes to escape commas. For example, if your decimal separator is a comma (,) this will be useful:

Discount=No,"VIP Rate=1,10"

Existing products will not receive default values, but new products will get default values.

  • Use the Product Tag Editor to edit multiple Tags… Select a few cells, edit value, and it will ask if you want to update all values.

All action Parameters will be trimmed of whitespace

This is to ensure a user does not accidentally add spaces while copy & pasting values.

Grouping in Tickets

Use Update Order Group Action to group orders as needed.

Group Tag: the name of the group

Key: another group identifier. It is not displayed on screen. You can use it to have multiple groups with same name.

Format: {0} is a placeholder for Group Name. You can use format parameter to change size, color, font of the group bar.

Background Color: is the background color for the group bar so you may have multiple groups with different colors.

Group Printing

Notice there are two Menu 1’s printed separately because different Key parameters used in action.


PS: [ORDERS:GROUP TAG=*] is a special template section for orders that have a group tag.

<L00>Ticket No:{TICKET NO}
<J10>Total:|{TICKET TOTAL}







Update Application Subtitle Action changes

  • Update Application Subtitle Action accepts height setting.
  • Update Application Subtitle Action accepts Tag formatting so foreground and font settings deleted.

  • Create Entity Action will break if another entity with same name exists.
  • {ORDER INDEX} and {INDEX TOTAL} tags implemented to print 1/5 … 4/5, 5/x counters next to orders (labels)
  • User Role specific navigation layouts supported by manually creating empty tiles.txt file with role name (all lowercase). For example if you have admin_tiles.txt file users that have admin role will use that file to store layout. If there is no role specific file tiles.txt file used. We can create an auto configurator later to create / delete that file.
  • Auto Configuration Repository URL’s setting moved from Program Settings > Maintenance to Local Settings > Online Services.
  • Ask Question Action accepts Transparent color to change transparency of question dialog.


Implemented CURRENTMENU setting. You can read it with {:CURRENTMENU} tag.

JS API Objects added:




PS: [param] indicates an optional parameter but you can’t skip parameters. If you want to set third optional parameter you should also set values for former optional parameters.

Not sure what else is new … please edit the post to include other new features… I unlocked the Topic to allow editing.

1 Like

Ask Question transparency is great for full screen messages/instructions, a few of my examples below



{RANDOM:L:C} tag accepts characters used to generate random strings


<length> : Length of generated string. Default 8.
<chars>  : Characters used to generate string. Default ABCDEFGHJKLMNPQRSTUVWZYZ123456789

Invalid <img> tags will not crash SambaPOS. It will display an error message inside content.

Warning displayed if rule constraint has unmatching parenthesis structure. (eg [:Variable} )

Automation command’s Image setting moved to Navigation page and used to define background images for Tiles.

Button heights automatically calculated when Menu Item Button Height set as 0. Buttons will fully expand to available size.

Browser Printer - new Add-on Module

The Browser Printer can be used to display printing content in Internet Explorer which will be useful for building Customer Display Screens. After enabling the Add-on Module we can set a printer type as Custom Printer > Browser Printer.

  • Enable Custom Printers module.
  • Restart SambaPOS.
  • Create a new printer.
  • Set printer type as Custom Printer.
  • Edit settings and enter a file name where SambaPOS can write. If left empty [Documents]\SambaPOS5\CustomerDisplay.html will be used.
  • Enable kiosk mode in Internet Explorer if you want full screen display.
  • Setup a printer template.
  • Setup a print job and map printer and template.

Now you can use Execute Print Job action to send data to Browser Window. This printer will not process any printer template formatting tags such as <J>, <L>. Instead, use html tags to format your output.

Use this on top of the HTML template if IE blocks page content.

<!doctype html>
<!-- saved from url=(0014)about:internet -->

On future versions we plan to have +2 monitor support for a specific device we have. For now only secondary monitor is supported.