SambaPOS API Integration with NewBook PMS/Booking System

Don’t you just love it when a plan comes together and multiple/compound scripts work pretty much first time :smile:

Have whittled my room charge script down to this sexy little thing;

var NewBookRequests 					= script.Load("NewBookRequests","postRoomCharge");															//Load NewBook Inhouse Request
var ticketChargeArrays 					= script.Load("ticketChargeArrays","itemized");															//Load NewBook Inhouse Request

function test(ticketId,roomNumber){
	var chargeAccount					= api.Entity(roomNumber).Data(entityField_accountid).Get();
	var itemizedArray					= ticketChargeArrays.itemized(ticketId);
	var chargesResponse					= NewBookRequests.postRoomCharge(chargeAccount,itemizedArray);
return chargesResponse;
}

The power comes in the background :wink:


Expanded master requests scripts

//Load NewBook Variables
var vars = script.Load("NewBookVariables","initialize");																	//Load NewBook Variables
vars.initialize();																											//Instalize variables

//Autherisation test script
function authtest() {
	var url 				= instanceURL+authTest;																			//Request URL
	var requestdata 		= new Object();																					//Request JSON Object
	requestdata.api_key 	= apikey;																						//JSON Data API Key
	var requestjson 		= JSON.stringify(requestdata);																	//Stringify Request Data
	var response 			= web.PostJson(url,requestjson,username,password);												//JSON POST
 return response;
}

//Inhouse Bookings List
function inhouseList() {
	var url 				= instanceURL+bookingList;																		//Request URL
	var requestdata 		= new Object();																					//Request JSON Object
	requestdata.api_key 	= apikey;																						//JSON Data API Key
	requestdata.list_type 	= 'inhouse';																					//JSON Data List Type
	var requestjson 		= JSON.stringify(requestdata);																	//Stringify Request Data
	var response 			= web.PostJson(url,requestjson,username,password);												//JSON POST
 return response;
}

//Room Charge
function postRoomCharge(inputAccount,inputChargesArray) {
	var url 						= instanceURL+posSale;																				//Request URL
	
	//Sales array building
	var requestSalesArrayAccount	= '"account_id":"'+inputAccount+'"';																//Account ID from script parameter
	var requestSalesArrayGenerated	= '"generated_when":"'+chargeGenerated+'"';															//Generated when from newbook variables
	var requestSalesArrayCharges	= '"charges":['+inputChargesArray+']';																//Charges array from script parameter
	var requestSalesArray			= '{'+requestSalesArrayAccount+','+requestSalesArrayGenerated+','+requestSalesArrayCharges+'}';		//Build sales array from above variables
	
	//Request Building
	var requestAPI					= '"api_key":"'+apikey+'"';																			//API key from newbook variables
	var requestSales				= '"sales":['+requestSalesArray+']';																//Sales value with array from above
	var requestjson					= '{'+requestAPI+','+requestSales+'}';																//Request build
	
	var response 					= web.PostJson(url,requestjson,username,password);													//JSON Request POST
 return response;
}

//Sales Post
function postEposSales(inputChargesArray,inputPaymentsArray) {
	var url 						= instanceURL+posSale;																												//Request URL
	
	//Sales array building
	var requestSalesArrayAccount	= '"account_id":"'+posAccount+'"';																									//Account ID from script parameter
	var requestSalesArrayGenerated	= '"generated_when":"'+chargeGenerated+'"';																							//Generated when from newbook variables
	var requestSalesArrayCharges	= '"charges":['+inputChargesArray+']';																								//Charges array from script parameter
	var requestSalesArrayPayments	= '"payments":['+inputPaymentsArray+']';																							//Payments array from script parameter
	
	var requestSalesArray			= '{'+requestSalesArrayAccount+','+requestSalesArrayGenerated+','+requestSalesArrayCharges+','+requestSalesArrayPayments+'}';		//Build sales array from above variables
	
	//Request Building
	var requestAPI					= '"api_key":"'+apikey+'"';																											//API key from newbook variables
	var requestSales				= '"sales":['+requestSalesArray+']';																								//Sales value with array from above
	var requestjson					= '{'+requestAPI+','+requestSales+'}';																								//Request build
	
	var response 					= web.PostJson(url,requestjson,username,password);																					//JSON Request POST
 return response;
}

First of 3 charge array scripts for ‘itemized’ charge array’

//Load NewBook Variables
var vars 								= script.Load("NewBookVariables","initialize");																//Load NewBook Variables
vars.initialize();																																	//Instalise NewBook Variables

//Load Scripts
var dbTools		 						= script.Load("dbTools","ticketOrderCount","ticketOrderList","orderDetails");								//Load dbTools Scripts
var JSONTools							= script.Load("JSONTools","searchArrayNamesForValue");														//Search JSON array for data name value

function itemized(PostTicketId)
{
  var orderid_qty						= dbTools.ticketOrderCount(PostTicketId);																	//Call ticket order ID qty
  var orderid_list						= dbTools.ticketOrderList(PostTicketId);																	//Call ticket order list
  var chargesArray 						= '';
  
  for (n = 0; n < orderid_qty ; n++)
  {
    var OrderId 						= orderid_list[n];

    var order_row_string 				= dbTools.orderDetails(OrderId);
    var order_row_array 				= order_row_string.split('~');
   
    var order_ticket 					= order_row_array[1];
    var order_quantity	 				= order_row_array[5];
    var order_quantity_rounded 			= +(Math.round(order_quantity + "e+2")  + "e-2");
    var order_name 						= order_row_array[2];
    var order_DBportion 				= order_row_array[3];
    if(order_DBportion == 'Normal')
    	{
    	var order_portion 				= '';
    	} else {
    	var order_portion 				= order_DBportion;
    	}
    var order_price 					= order_row_array[4];
    var order_total 					= order_quantity * order_price;
    var order_tag_json_raw 				= order_row_array[6];
    var order_tag_json 					= JSON.parse(order_tag_json_raw);
    var tag_array_number				= JSONTools.searchArrayNamesForValue(order_tag_json,pmsDepartment)
	if (tag_array_number >= 0)
		{
		var pms_glaccount 			= order_tag_json[tag_array_number].TV;
		}else{
		var pms_glaccount 			= unspecifiedDepartment;
		}

    var post_desctiption 				= chargePrefix+' '+order_ticket+' - '+order_quantity_rounded+' x '+order_name+' '+order_portion;
    var post_pmsdepartment 				= pms_glaccount;
    var post_amount 					= order_total.toFixed(2);
    var post_taxfree 					= '1';
  
    var post_json_data 					= new Object();
    post_json_data.description 			= post_desctiption;
    post_json_data.gl_account_code 		= post_pmsdepartment;
    post_json_data.amount 				= post_amount;
    post_json_data.tax_free 			= post_taxfree;
    var post_json 						= JSON.stringify(post_json_data);
 
    if (n < orderid_qty-1)
    	{
    	chargesArray += post_json + ',';
    	} else {
    	chargesArray += post_json;
    	}
  }

	return chargesArray;
}

dbTools scripts for ticket order count, ticket order id list and order details from order ID

function ticketOrderCount(ticketId) {
	qry = "@@TicketOrderCount:" + ticketId;																		//QRY Variable '@@TicketOrderCount' Script: + 'ticketId' Variable
	var orderCount = sql.Query(qry).First;																		//SQL Query responce -> entities Variable (comma seperated list of entities)
	return orderCount;																							//Return
}

function ticketOrderList(ticketId) {
	qry = "@@TicketOrderIdList:" + ticketId;																	//QRY Variable '@@EntityList' Script: + 'roomEntityType' Variable
	var orderList = sql.Query(qry).Delimit(',').All;															//SQL Query responce -> entities Variable (comma seperated list of entities)
	return orderList;																							//Return
}

function orderDetails(orderId) {
	qry = "@@OrderDetails:" + orderId;																			//QRY Variable '@@EntityList' Script: + 'roomEntityType' Variable
	var orderDetails = sql.Query(qry).Delimit('~').First;														//SQL Query responce -> entities Variable (comma seperated list of entities)
	return orderDetails;	

Search Samba JSON (tags/states) for Array index for Tag Name=X

function searchArrayNamesForValue(jsonData,inputName) {
	arrayIndex = -1; 																												//<===reset index for each sub loop
	for(var i = 0; i<jsonData.length;i++)																							//<=== OPEN SUBLOOP - RESPONCE SEARCH FOR ENTITY NAME
			{
				if (jsonData[i].TN == inputName)																					//SUBLOOP if JSON Name = inputName
					{
			   		var arrayIndex = i;																								//<===set arrayIndex with array number when if is TRUE
					break;																											//<=== END SUBLOOP when if is TRUE
					}
			}
	return arrayIndex;
}

Just need to integrate my logs system for debug/reference.

1 Like