Pay at table
This page provides an explanation of Pay at table and how best to develop this integration feature.
Pay at table is designed for hospitality dining environments but can have other applications were transactions are required to be driven from the EFTPOS terminal. Pay at table changes the integration model by allowing the EFTPOS terminal to initiate a transaction. When the pay at table button is selected on the EFTPOS terminal it will request to the POS to return a table sale total or a list of held sale. The customer can then complete payment on the EFTPOS terminal and once completed the EFTPOS terminal will update the POS on the outcome.
Integration resources
To showcase the pay at table feature a sample pos was produced as a form of living documentation (working code). This can be found as part of the sample POS package under the name Table POS. It is recommended to use the sample POS to gain an understanding of how the pay at table feature is designed.
Note: Pay at Table is only available for library versions 2.1 and above
Below are code samples in each language that are required to instantiate the Pay at Table Interface:
// configuration to turn on pay at table feature
_pat = _spi.EnablePayAtTable();
// this is the text used on the terminal
_pat.Config.LabelTableId = "Table Number";
// get bill details for the table
_pat.GetBillStatus = PayAtTableGetBillDetails;
// receive payments for the table
_pat.BillPaymentReceived = PayAtTableBillPaymentReceived;
// Configuration to turn on pay at table feature
pat = spi.enablePayAtTable();
// This is the text used on the terminal
pat.getConfig().setLabelTableId("Table Number");
// Delegate to get bill details for the table
pat.setGetBillStatusDelegate(new SpiPayAtTable.GetBillStatusDelegate() {
@Override
public BillStatusResponse getBillStatus(String billId, String tableId, String operatorId) {
return ...;
}
});
// Delegate to receive payments for the table
pat.setBillPaymentReceivedDelegate(new SpiPayAtTable.BillPaymentReceivedDelegate() {
@Override
public BillStatusResponse getBillReceived(BillPayment billPayment, String updatedBillData) {
return ...;
}
});
Pay at Table Configuration
The POS as the ability to set a number of settings for the pay at table feature. These are outlined below:
"equal_split_enabled" : true | false,
// show/hide the split by number button
"operator_id_enabled": true | false,
// prompt for operator id entry in [email protected] mode. default is
// set to false
"operator_id_label": "Operator ID",
// label to use when asking operator for operator_id value, maximum length
// is 24
"operator_id_list":"12345"
// list of valid operator IDs
// valid operator ID. String, numeric only
"pay_at_table_enabled": true | false,
// allow operator to request tender amount from POS. default is
// set to false
"pay_button_label": "Run Pay at Table",
// label to use on Pay At Table initiation button, maximum length is 16
"split_by_amount_enabled": true | false,
// show/hide the split by amount button
"summary_report_enabled" : true | false,
// enable/disable the summary report printing at the end of the
// table/split session
"table_id_label": "Bill Reference",
// label to use when asking operator for tender_id value, maximum
// length is 24
"tipping_enabled": true | false
// Whether the VAA will prompt for tip amount
Retrieve all tables or open sales
The pay at table feature has the functionality to request a list of all open tables and sales from the POS. This appears as an option when the user selects pay at table on the EFTPOS terminal. Once "Retrieve all" is selected on the EFTPOS terminal a request for a list is sent to the POS. The POS is then free to supply a list of tables to it's own design eg. supplying all open tables or only tables opened against the operator ID. This feature is designed to be flexible and the POS has control of the list that is supplied back to the EFTPOS terminal.
Retrieve all tables only is available with SPI library version 2.5 and above.
Table locking
Table locking is a POS feature that might already be implemented as part of POS functionality or could be implemented as part of pay at table development. The use case for table locking is that if a table is in use on a POS machine or payment is being taken by an EFTPOS terminal then this table should not be accessible (Locked) for other POS users or EFTPOS terminals. Its core functionality is to stop edits and changes to a table while it is in use by another user and is designed to stop double payment.
The mx51 pay at table feature includes messaging to the POS at the end of a transaction (successful or failed) to allow for the POS to lock and unlock tables. It is a POS feature which is optional for a pay at table implementation but is supported as required.
To implement table locking with pay at table the POS is required to lock a table when the EFTPOS terminal requests a table and unlock when a transaction response is received or table end of flow response is received.
You can find an example of how to implement table locking in the sample table POS. Table locking messaging is only available with SPI library version 2.5 and above.
Updated about 1 month ago