General Purpose
Given this command with requested parameters are to confirm the ticket sales in EHORS. Require parameters are inclusive of the server checkpoint to ensure the amounts, folio and selected attractions/BDI are correct to be confirmed. Therefore if the total amount and or given selected attraction / BDI are not matched with a given reservation, it'll return a general error and the sales will consider voided.
Please do notice this command can only be executed once after the bank has confirmed the sales with payment and returns the information from payment gateway like approval code, bank transaction number, etc.
If bank/payment gateway returned error link in-sufficient funds or invalid card, you shall call the cancel sales command [ P_TKT_CancelSales ] Cancel Ticket Sales.
Request Parameter
Variable Name | Mandatory | Variable Type | Example | Parent Variable | Explain |
---|---|---|---|---|---|
outletID | Yes | Varchar(255) | ABC123 | - | Outlet ID to use for the ticket sales, this ID can be obtained from XML node of "#CONSTANTS@outletID" under [ G_ATT_Planboard ] Get Plan Board Availability or [ G_IND_Attractions ] Get Individual Attractions Price or [ G_PKG_Details ] Get Package Details. |
reservationID | Yes | Varchar(255) | ABC123 | - | Reservation ID from [ P_TKT_NewSales ] Add New Ticket Sales, from XML node of "#ATTRACTION_ITEMS@reservationID" this is the main reference to confirm a sales |
totalConfirmation | Yes | Double(10.2) | 1234.56 | - | The total amount of sales to be confirmed for this booking, inclusive of all taxes in gross |
paymentAmount | Yes | Double(10.2) | 1234.56 | - | The total amount of payment where guest pays for this sales through payment gateway or the total amount bank confirmed. This amount should be the same as total confirmation |
bankApprovalCode | Yes | Varchar(255) | 0017821 | - | Approval code replied from the payment gateway to confirm this sale, this is the main references use in bank end accounting |
cardHolderName | Yes | Varchar(255) | JOHN SMITH | - | Credit/Debit cardholder name to confirm the sales, if payment gateway doesn't provide, can send the "#guestName" from [ P_TKT_NewSales ] Add New Ticket Sales |
cardNumber | Yes | Num(17) | 4111111111111111 | - | Credit/Debit card number, if the payment gateway doesn't provide, or you don't have a first layer to store, you may send in a dummy card number based on card type as the following a sample https://www.paypalobjects.com/en_GB/vhelp/paypalmanager_help/credit_card_numbers.htm |
cardType | Yes | Varchar(255) | VISA/MasterCard | - | Credit/Debit card type, sample are "VISA", "MasterCard", "Amex" |
cardCVC | Yes | Varchar(4) | 1234 | - | Credit/Debit card CVC/CCV2 number and if the payment gateway doesn't provide or you don't have a layer before sending to the payment gateway, you can provide a dummy 3 to 4 digits codes like 000 or 0000 |
ccExpMonth | Yes | Varchar(2) | 09 | - | 2 digits months format for the credit/debit card expiry month |
ccExpYear | Yes | Varchar(4) | 2025 | - | Full 4 digits of year format for the credit/debit card expiry year |
bankReference | Yes | Varchar(255) | ABC000012387812 | - | Payment gateway replied reference number, can be bank batch number or any additional reference of this sales transaction |
paymentRemarks | Yes | Varchar(255) | Online ticket sales ABC123 | - | Text description of this sales can be simple remarks like "Online sales payments for ticket sales ABC123". Or details like "Online payment for ABC123, 2x attraction A for 2 pax" with maximum characters of 255 |
bankTransactionNo | Yes | Varchar(255) | TUY72138211 | - | Payment gateway replied reference number for this sales transaction |
attractionCount | Yes | Num(9) | 1 | - | A number of attractions selected inclusive in the package selected and individual. Example if 1 guest folio selected 1 package with 3 attraction plus 2 individuals attractions is equal to 5 in this variable |
guestFolioCount | Yes | Num(9) | 3 | - | Number of the guest folio which is after making [ P_TKT_NewSales ] Add New Ticket Sales under the XML node "#ATTRACTION_ITEMS" |
packageID_{x0} | No | Varchar(255) | ABC123 | attractionCount | Counting from 0 until the maximum of " Example: |
paxCount_{x0} | No | Varchar(255) | 6 | attractionCount | Counting from 0 until the maximum of " Example: |
attractionID_{x0} | No | Varchar(255) | ABC123 | attractionCount | Counting from 0 until the maximum of " Example: |
BDI_guestFolioID_{x0} | No | Varchar(255) | ABC123 | attractionCount | Counting from 0 until the maximum of " Example: |
itemPrice_{x0} | No | Double(10.2) | 0.00 | attractionCount | Counting from 0 until the maximum of " Example: |
BDI_tempWbn_{x0} | No | Varchar(255) | 76sa6d_243762 | attractionCount | Counting from 0 until the maximum of " Example: |
guestFolioID_{x0} | No | Varchar(255) | ABC123 | guestFolioCount | Counting from 1 until the maximum of "guestFolioCount". Guest folio separates the group of selected attraction / BDI ID. Take for example if the guest has 2 different groups of selection, the first folio is package with 2 attractions for 1 pax and another group is individual attractions for 4 pax. Example: |
Sample Request with JS
$(document).ready(function(){ $.ajax({ url:"https://api.ehors.com", method:'POST', dataType:'xml', data:{ accessID:'ABC123', accessKey:'XYZ576abc', moduleCode:'TicketSales', command:'P_TKT_ConfirmSales', outletID:'LCA7', reservationID:'LCX76', totalConfirmation:'800', paymentAmount:'800', cardHolderName:'John Smith', cardNumber:'4111111111111111', cardType:'VISA', cardCVC:'411', ccExpMonth:'09', ccExpYear:'2029', bankApprovalCode:'41178', bankReference:'00ASTT8182321', bankTransactionNo:'411560002245', paymentRemarks:'Online Payment', attractionCount:'5', paxCount_0:'1', paxCount_1:'1', paxCount_2:'1', paxCount_3:'1', paxCount_4:'1', attractionID_0:'LCB1', attractionID_1:'LCA4', attractionID_2:'LCB4', attractionID_3:'LCA5', attractionID_4:'LCA6', itemPrice_0:'220.00', itemPrice_1:'250.00', itemPrice_2:'65.00', itemPrice_3:'250.00', itemPrice_4:'15.00', packageID_0:'LCA1', packageID_1:'LCA1', packageID_2:'LCA1', packageID_3:'LCA1', packageID_4:'LCA1', BDI_guestFolioID_0:'LCX94', BDI_guestFolioID_1:'LCX94', BDI_guestFolioID_2:'LCX94', BDI_guestFolioID_3:'LCX94', BDI_guestFolioID_4:'LCX94', BDI_tempWbn_0:'605434177_3836700b', BDI_tempWbn_1:'605434177_3836700b', BDI_tempWbn_2:'605434177_3836700b', BDI_tempWbn_3:'605434177_3836700b', BDI_tempWbn_4:'605434177_3836700b', guestFolioCount:'1', guestFolioID_1:'LCX94' }, success:function(response){ console.log(response); } }) });
Sample request with CURL
curl -v -d "accessID=ABC123&accessKey=EFG56788&moduleCode=TicketSales&command=P_TKT_ConfirmSales&BDI_guestFolioID_0=LCX94&BDI_guestFolioID_1=LCX94&BDI_guestFolioID_2=LCX94&BDI_guestFolioID_3=LCX94&BDI_guestFolioID_4=LCX94&BDI_tempWbn_0=605434177_3836700b&BDI_tempWbn_1=605434177_3836700b&BDI_tempWbn_2=605434177_3836700b&BDI_tempWbn_3=605434177_3836700b&BDI_tempWbn_4=605434177_3836700b&attractionCount=5&guestFolioCount=1&paymentAmount=800&bankApprovalCode=41178&paxCount_0=1&paxCount_1=1&paxCount_2=1&paxCount_3=1&paxCount_4=1&attractionID_0=LCB1&attractionID_1=LCA4&attractionID_2=LCB4&attractionID_3=LCA5&attractionID_4=LCA6&cardHolderName=John Smith&cardNumber=4111111111111111&cardType=VISA&cardCVC=411&totalConfirmation=800&guestFolioID_1=LCX94&itemPrice_0=220.00&itemPrice_1=250.00&itemPrice_2=65.00&itemPrice_3=250.00&itemPrice_4=15.00&ccExpMonth=09&outletID=LCA7&packageID_0=LCA1&packageID_1=LCA1&packageID_2=LCA1&packageID_3=LCA1&packageID_4=LCA1&bankReference=00ASTT8182321&paymentRemarks=Online Payment&reservationID=LCX76&bankTransactionNo=411560002245&ccExpYear=2029" -X POST https://api.ehors.comRespond XML Sample
Respond Success XML Sample - Single package booking for 1 pax = 1 ticket number
<?xml version="1.0" encoding="utf-8"?> <SCRIPT_RESULT> <RESULT> <ATTRACTION_ITEMS foInvoiceID="LCZ56" foInvoicePaymentID="LCZ21" revenuePropertyID="2" posGuestDummyID="LCZ29" outletID="LCA7" reservationID="LCZ38"/> <TICKET_NODE guestFolioID="LCZ57" mainTicketNo="PBE00014XXXXX" totalNoPax="1"> <TICKET_INFO_NODE ticketQRNumber="PBE0001400001" generatedDate="2019-09-12"> <TICKET_DETAIL_NODE detailMode="PACKAGE:INBOUND"> <BDI_SESSION_NODE sessionFrom="01:00 AM" sessionUntil="11:59 PM" attractionName="SERVICE CHARGE"/> <BDI_SESSION_NODE sessionFrom="01:00 AM" sessionUntil="11:59 PM" attractionName="PHOTOGRAPHY"/> <BDI_SESSION_NODE sessionFrom="01:00 AM" sessionUntil="11:59 PM" attractionName="MARINE CONSERVATION"/> <BDI_SESSION_NODE sessionFrom="01:00 AM" sessionUntil="11:59 PM" attractionName="E-LEARNING RESOURCES"/> <BDI_SESSION_NODE sessionFrom="01:00 AM" sessionUntil="11:59 PM" attractionName="ADMISSION"/> </TICKET_DETAIL_NODE> </TICKET_INFO_NODE> </TICKET_NODE> </RESULT> <SCRIPT_STATUS>SUCCESS</SCRIPT_STATUS> </SCRIPT_RESULT>
Respond Success XML Sample - Individual attraction tickets for 5 pax = 5 ticket number
<?xml version="1.0" encoding="utf-8"?> <SCRIPT_RESULT> <RESULT> <ATTRACTION_ITEMS foInvoiceID="LCZ61" foInvoicePaymentID="LCZ25" revenuePropertyID="2" posGuestDummyID="LCZ34" outletID="LCA7" reservationID="LCZ44"/> <TICKET_NODE guestFolioID="LCZ63" mainTicketNo="PBE00018XXXXX" totalNoPax="5"> <TICKET_INFO_NODE ticketQRNumber="PBE0001800001" generatedDate="2019-09-12"> <TICKET_DETAIL_NODE detailMode="EXTRA"> <BDI_SESSION_NODE sessionFrom="11:00 AM" sessionUntil="11:45 AM" attractionName="SEATREK"/> </TICKET_DETAIL_NODE> </TICKET_INFO_NODE> <TICKET_INFO_NODE ticketQRNumber="PBE0001800002" generatedDate="2019-09-12"> <TICKET_DETAIL_NODE detailMode="EXTRA"> <BDI_SESSION_NODE sessionFrom="11:00 AM" sessionUntil="11:45 AM" attractionName="SEATREK"/> </TICKET_DETAIL_NODE> </TICKET_INFO_NODE> <TICKET_INFO_NODE ticketQRNumber="PBE0001800003" generatedDate="2019-09-12"> <TICKET_DETAIL_NODE detailMode="EXTRA"> <BDI_SESSION_NODE sessionFrom="11:00 AM" sessionUntil="11:45 AM" attractionName="SEATREK"/> </TICKET_DETAIL_NODE> </TICKET_INFO_NODE> <TICKET_INFO_NODE ticketQRNumber="PBE0001800004" generatedDate="2019-09-12"> <TICKET_DETAIL_NODE detailMode="EXTRA"> <BDI_SESSION_NODE sessionFrom="11:00 AM" sessionUntil="11:45 AM" attractionName="SEATREK"/> </TICKET_DETAIL_NODE> </TICKET_INFO_NODE> <TICKET_INFO_NODE ticketQRNumber="PBE0001800005" generatedDate="2019-09-12"> <TICKET_DETAIL_NODE detailMode="EXTRA"> <BDI_SESSION_NODE sessionFrom="11:00 AM" sessionUntil="11:45 AM" attractionName="SEATREK"/> </TICKET_DETAIL_NODE> </TICKET_INFO_NODE> <TICKET_INFO_NODE ticketQRNumber="PBE0001800006" generatedDate="2019-09-12"> <TICKET_DETAIL_NODE detailMode="EXTRA"> <BDI_SESSION_NODE sessionFrom="11:00 AM" sessionUntil="11:45 AM" attractionName="SEATREK"/> </TICKET_DETAIL_NODE> </TICKET_INFO_NODE> </TICKET_NODE> </RESULT> <SCRIPT_STATUS>SUCCESS</SCRIPT_STATUS> </SCRIPT_RESULT>
Respond Failed XML Sample - Duplicate transactions
<?xmlversion="1.0"encoding="utf-8"?> <SCRIPT_RESULT> <RESULT/> <SCRIPT_STATUS>SYSTEMLAGERROR</SCRIPT_STATUS> <SCRIPT_MESSAGE> System Lag Triggered double Posting of Revenue Transaction Has been halted... Please Restart Transaction 2019-09-13 09:23:30 << SCRIPT SESSION CLOSE === END OF MESSAGE === </SCRIPT_MESSAGE> </SCRIPT_RESULT>
XML Node Explain
#ATTRACTION_ITEMS_DETAILS | Low | Each node explain the session reserved in EHORS system number of node should equal to total number of sessions selected for both package and/or individual. |
#ATTRACTION_ITEMS_DETAILS@BDIID | Low | Unique BDI ID mapped back to attraction selected, if 2 sessions selected for 1 attraction. I'l have 2 nodes with same BDIID |
#ATTRACTION_ITEMS_DETAILS@packageID | Low | Can be blank if its individual attraction, if isn't blank this node is for selected package |
#ATTRACTION_ITEMS_DETAILS@guestFolioID | Low | EHORS is an ERP system whereas each and every module follows the same hierarchy and system flow, therefore certain fields do not require a further explanation and are just needed to support to flow of EHORS. Can be ignore. |
#ATTRACTION_ITEMS_DETAILS@revenuePropertyID | Low | EHORS is an ERP system whereas each and every module follows the same hierarchy and system flow, therefore certain fields do not require a further explanation and are just needed to support to flow of EHORS. Can be ignore. |
#ATTRACTION_ITEMS_DETAILS@reservationBDISessionID | Low | EHORS is an ERP system whereas each and every module follows the same hierarchy and system flow, therefore certain fields do not require a further explanation and are just needed to support to flow of EHORS. Can be ignore. |
#ATTRACTION_ITEMS_DETAILS@posGuestID | Low | EHORS is an ERP system whereas each and every module follows the same hierarchy and system flow, therefore certain fields do not require a further explanation and are just needed to support to flow of EHORS. Can be ignore. |
#ATTRACTION_ITEMS | High | This node will give a booking details of the ticket sales like booking number, if successfully reserve in EHORS |
#ATTRACTION_ITEMS@reservationID | High | Unique ID from EHORS system when the booking are book in system but yet to confirm until payment information receive, thus this variable is crucial to be send and use on next command |
#ATTRACTION_ITEMS@guestFolioID | High | Unique ID from EHORS similar to reservation ID, but one reservation ID can contain many guest folio ID, unlike #ATTRACTION_ITEMS_DETAILS, this node are need for later command to confirm the booking |
#ATTRACTION_ITEMS@reservationDetailID | High | This is a mapping ID generated by EHORS similar usage like guest folio ID, this ID use to map related information of the booked and selected details. |
#ATTRACTION_ITEMS@tempWristbandNo | Low | Temporary wristband number / ticket ID created by EHORS and only needed by EHORS ticket sales back end program, can be ignore. |
#ATTRACTION_ITEMS@posGuestID | Low | Will be always empty, can be ignored |
#ATTRACTION_ITEMS@revenuePropertyID | Low | EHORS is an ERP system whereas each and every module follows the same hierarchy and system flow, therefore certain fields do not require a further explanation and are just needed to support to flow of EHORS. Can be ignore. |
#ATTRACTION_ITEMS@seqNo | Low | Will be always empty, can be ignored |