Ok let’s give this a try.
After modification of the PHP to return “SUCCESS” via the echo
statement, we modify the JScript to give us a better idea whether or not the Post succeeded …
var res = web.PostJson(url,jsondata,usr,pwd);
if (res != "SUCCESS")
{
//dlg.ShowMessage("Failed to Post Order Data:\r\n"+jsondata);
return qrydata[0]+"~"+qrydata[1];
}
processFailedPosts(); // we will build a function for this
return 0;
So with that ^ when the Post fails, we return <ticketId>~<orderId>
When the Post succeeds, we will process missed posts, then return 0
.
Now a modification to our Rule that calls the Post Jscript to add another Execute Automation Command
Action…
##PD Post Order Data [Automation Command Executed]
(Rule)##
Rule Name: | PD Post Order Data |
Event Name: | Automation Command Executed |
Rule Tags: |
|
Custom Constraint List (1):
Automation Command Name | Equals | PD Post Order Data |
##Actions (2):##
PD Store Value
Constraint: (none)
settingName: | PD_PostResult_[:CommandValue] |
settingValue: | {CALL:pd.postJSON('{SETTING:PD_TicketId_[:CommandValue]}', '{SETTING:PD_OrderId_[:CommandValue]}', '{SETTING:PD_OrderNo_[:CommandValue]}', '{SETTING:PD_OrderUid_[:CommandValue]}')} |
updateType: | Update |
isLocal: | True |
PD ExecAMC
Constraint: (none)
AMCname: | PD Update Failed Post ID |
AMCvalue: | {SETTING:PD_PostResult_[:CommandValue]} |
bg: | False |
delay: | 0 |
##Mappings##
Mappings
Terminal | User Role | Department | Ticket Type |
* | * | * | * |
And we need a Rule to handle our new Automation Command from the above Rule, which will be responsible for storing failed Post Data …
##PD Update Failed Post ID [Automation Command Executed]
(Rule)##
Rule Name: | PD Update Failed Post ID |
Event Name: | Automation Command Executed |
Rule Tags: |
|
Custom Constraint List (2):
Automation Command Name | Equals | PD Update Failed Post ID |
Command Value | Not Equals | 0 |
##Actions (1):##
PD Store Value
Constraint: (none)
settingName: | PD_Failed_Postings |
settingValue: | [='{SETTING:PD_Failed_Postings}' != '' ? '{SETTING:PD_Failed_Postings}' + ',' + '[:CommandValue]' : '[:CommandValue]'] |
updateType: | Update |
isLocal: | False |
##Mappings##
Mappings
Terminal | User Role | Department | Ticket Type |
* | * | * | * |
So now we have in SambaPOS DB, some orders that failed to Post as a comma-separated list using the format <ticketId>~<orderId>
…
Finally, we need a method to process our list of failed Posts, which we will do in JScript…
function processFailedPosts()
{
var tid=0;
var oid=0;
var lqry = "SELECT [Value] FROM [ProgramSettingValues] WHERE [Name]='PD_Failed_Postings'";
var failedPosts = sql.Query(lqry).First;
if (failedPosts=='')
{
return 0;
}
failedPosts = failedPosts.split(',');
var failedPostsCount = failedPosts.length;
//return failedPostsCount;
var datafields = getDataFields();
var datafieldscount = datafields.length;
for (var f=0; f<failedPostsCount; f++)
{
var pair = failedPosts[f].split('~');
tid = pair[0];
oid = pair[1];
var qry = "";
qry += "SELECT";
for (var d=0; d < datafieldscount; d++)
{
qry += (d>0 ? " ," : " ");
qry += "[" + datafields[d] + "]";
}
qry += " FROM [Orders]";
qry += " WHERE 1=1";
qry += " AND [TicketId] = " + tid;
qry += " AND [Id] = " + oid;
//qry += " AND [OrderNumber] = " + onm;
//qry += " AND [OrderUid] = '" + ouid + "'";
//qry += " ORDER BY [Id]";
var qryresult = sql.Query(qry).Delimit('~').First;
var qrydata = qryresult.split('~');
var qryfieldcount = qrydata.length;
var data = new Object();
for (var d=0; d < datafieldscount; d++)
{
data[datafields[d]] = qrydata[d];
}
var jsondata = JSON.stringify(data);
//return jsondata;
// Post missed Data to server
var res = web.PostJson(url,jsondata,usr,pwd);
if (res == "SUCCESS")
{
// remove missed Post data from DB
var rval = tid+"~"+oid+",";
var uqry = "UPDATE [ProgramSettingValues] SET [Value]=(REPLACE([Value],'"+rval+"','')) WHERE [Name]='PD_Failed_Postings'";
sql.ExecSql(uqry);
var rval = tid+"~"+oid;
uqry = "UPDATE [ProgramSettingValues] SET [Value]=(REPLACE([Value],'"+rval+"','')) WHERE [Name]='PD_Failed_Postings'";
sql.ExecSql(uqry);
}
}
return 0;
}
You will notice that ^ will not work by itself because it calls another function. I re-arranged some of the master script to make it more modular, so here it is in its entirety …
// webserver URL, Username, Password
var url = "http://localhost:82/posthandler.php";
var usr = "q";
var pwd = "nada";
function getDataFields()
{
var datafields = new Array();
datafields.push("TicketId");
datafields.push("Id");
datafields.push("OrderNumber");
datafields.push("OrderUid");
datafields.push("MenuItemId");
datafields.push("MenuItemName");
datafields.push("PortionName");
datafields.push("Price");
datafields.push("Quantity");
datafields.push("PortionCount");
datafields.push("PriceTag");
datafields.push("Tag");
datafields.push("Taxes");
datafields.push("OrderTags");
datafields.push("OrderStates");
/*
qry += " ,[CalculatePrice]";
qry += " ,[DecreaseInventory]";
qry += " ,[IncreaseInventory]";
qry += " ,[CreatingUserName]";
qry += " ,[CreatedDateTime]";
qry += " ,[LastUpdateDateTime]";
qry += " ,[AccountTransactionTypeId]";
qry += " ,[ProductTimerValueId]";
qry += " ,[GroupTagName]";
qry += " ,[GroupTagFormat]";
qry += " ,[Separator]";
qry += " ,[Locked]";
qry += " ,[WarehouseId]";
qry += " ,[DepartmentId]";
qry += " ,[TerminalId]";
*/
return datafields;
}
function postJSON(tid,oid,onm,ouid)
{
// override values for testing
//var tid = 3214;
//var oid = 7757;
//var onm = 347;
//var ouid = 'YTYb4Ra7H0aN4ucamXrwDg';
//return "TID:"+tid + " OID:"+oid + " ONM:"+onm + " OUID:"+ouid;
var datafields = getDataFields();
var datafieldscount = datafields.length;
var qry = "";
qry += "SELECT";
for (var d=0; d < datafieldscount; d++)
{
qry += (d>0 ? " ," : " ");
qry += "[" + datafields[d] + "]";
}
qry += " FROM [Orders]";
qry += " WHERE 1=1";
qry += " AND [TicketId] = " + tid;
//qry += " AND [Id] = " + oid;
qry += " AND [OrderNumber] = " + onm;
qry += " AND [OrderUid] = '" + ouid + "'";
qry += " ORDER BY [Id]";
//return qry;
var qryresult = sql.Query(qry).Delimit('~').First;
var qrydata = qryresult.split('~');
var qryfieldcount = qrydata.length;
//return qryfieldcount;
var data = new Object();
for (var d=0; d < datafieldscount; d++)
{
data[datafields[d]] = qrydata[d];
}
var jsondata = JSON.stringify(data);
//return jsondata;
var res = web.PostJson(url,jsondata,usr,pwd);
if (res != "SUCCESS")
{
//dlg.ShowMessage("Failed to Post Order Data:\r\n"+jsondata);
return qrydata[0]+"~"+qrydata[1];
}
processFailedPosts();
return 0;
}
function processFailedPosts()
{
var tid=0;
var oid=0;
var lqry = "SELECT [Value] FROM [ProgramSettingValues] WHERE [Name]='PD_Failed_Postings'";
var failedPosts = sql.Query(lqry).First;
if (failedPosts=='')
{
return 0;
}
failedPosts = failedPosts.split(',');
var failedPostsCount = failedPosts.length;
//return failedPostsCount;
var datafields = getDataFields();
var datafieldscount = datafields.length;
for (var f=0; f<failedPostsCount; f++)
{
var pair = failedPosts[f].split('~');
tid = pair[0];
oid = pair[1];
var qry = "";
qry += "SELECT";
for (var d=0; d < datafieldscount; d++)
{
qry += (d>0 ? " ," : " ");
qry += "[" + datafields[d] + "]";
}
qry += " FROM [Orders]";
qry += " WHERE 1=1";
qry += " AND [TicketId] = " + tid;
qry += " AND [Id] = " + oid;
//qry += " AND [OrderNumber] = " + onm;
//qry += " AND [OrderUid] = '" + ouid + "'";
//qry += " ORDER BY [Id]";
var qryresult = sql.Query(qry).Delimit('~').First;
var qrydata = qryresult.split('~');
var qryfieldcount = qrydata.length;
var data = new Object();
for (var d=0; d < datafieldscount; d++)
{
data[datafields[d]] = qrydata[d];
}
var jsondata = JSON.stringify(data);
//return jsondata;
// Post missed Data to server
var res = web.PostJson(url,jsondata,usr,pwd);
if (res == "SUCCESS")
{
// remove missed Post data from DB
var rval = tid+"~"+oid+",";
var uqry = "UPDATE [ProgramSettingValues] SET [Value]=(REPLACE([Value],'"+rval+"','')) WHERE [Name]='PD_Failed_Postings'";
sql.ExecSql(uqry);
var rval = tid+"~"+oid;
uqry = "UPDATE [ProgramSettingValues] SET [Value]=(REPLACE([Value],'"+rval+"','')) WHERE [Name]='PD_Failed_Postings'";
sql.ExecSql(uqry);
}
}
return 0;
}
That should do it. Next time we Submit an Order, and the Post is successful, we will also process the failed-Post list and post that data as well, then clear the list.