Record sales in the software
Submit a complete order: items, customer, payment method, delivery, etc.
POST /workers/webapp.php
Submit a complete order: items, customer, payment method, delivery, etc.
POST parameters
| Name | Type | Required | Description |
|---|---|---|---|
shopID | string | Yes | Your shop ID (SHOPID) |
key | string | Yes | Your token (APIKEY) |
idUser | int | No | User ID. If not specified, the software creates a user account with the "webservice" login if it does not already exist, and uses it. |
payment | int | Yes | -2 = Not paid, not validated; -1 = Not paid, validated; a payment method identifier to indicate a payment (can be an identifier of a refund method) |
paymentAmount | int | No | The amount paid, if "payment" indicates a payment method (if absent, the payment is considered cash) |
idClient | int | No | Existing customer ID to assign to the order |
client | array | No | A customer account needs to be created and assigned to the order.* |
idtable | int | No | Table ID to assign to the order |
idcaisse | int | No | Cash register ID to assign to the order |
numcouverts | int | No | Number of place settings served at the table |
publicComment | string | No | Comment attached to the order (public) |
privateComment | string | No | Comment attached to the order (private) |
pagerNum | int | No | Pager number |
deliveryMethod | int | No | Delivery method* |
readyPrepa | int | No | Order sent for preparation (default: 1) |
itemsList | array | Yes | Pager number |
Additional information
Create a new customer in the same query
If the customer does not exist, you can create it with the following fields (to be sent directly by POST):
client[nom]=[nom]
client[prenom]=[Prénom]
client[email]=[Email]
client[telephone]=[nom]
client[adresseligne1]=[Adresse ligne 1]
client[adresseligne2]=[Adresse ligne 2]
client[commentaireadresse]=[nom]
client[codepostal]=[Code postal]
client[ville]=[Ville]
client[pays]=FR
client[numtva]=[Numéro TVA]
client[rcs]=[Numéro RC]
client[codeBarre]=[Code barre]
client[telephone2]=[Téléphone secondaire]
client[lat]=[latitude]
client[lng]=[longitude]
Delivery method
The deliveryMethod field can have values ranging from 0 to 6:
| Amount | Meaning |
|---|---|
| 0 | Take away |
| 1 | To be delivered |
| 2 | On site |
| 3 | Drive-Thru |
| 4 | Counter sales |
| 5 | Relay point |
| 6 | To be shipped |
itemsList[] — Structure
The itemsList field is an array of strings, each element of which can be of one of the following types::
[idArticle]— add an item (quantity 1)[idArticle]_[quantite]— specify the quantity[idArticle]_[quantite]_[titre personnalisé]_[prix personnalisé]— force the title and price[idArticle]_[quantite]_[titre]_[prix]_[idDéclinaison1]_[idDéclinaison2]_[idDéclinaison3]_[idDéclinaison4]_[idDéclinaison5]— add up to 5 variations- Over-the-counter sale :
-[idRayon]_[prix]_[titre]— creates a free line attached to the ray - Over-the-counter sale :
Free_[prix]_[titre]— creates a free line
JavaScript Examples
Simple sale
async function recordSaleWithExistingClient(){
const body = new URLSearchParams({
shopID: SHOPID,
key: 'REMPLACER_PAR_VOTRE_CLE_API_GENEREE',
payment: -1
});
body.append("itemsList[]", "Free_12.99_Item");
body.append("itemsList[]", "Free_9.99_Other item");
const res = await fetch("https://kash.click/workers/webapp.php", {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
body
});
let payload; try{ payload = await res.json(); }catch{ payload = await res.text(); }
console.log(payload);
}
Existing customer
async function recordSaleWithExistingClient(){
const body = new URLSearchParams({
shopID: SHOPID,
key: 'REMPLACER_PAR_VOTRE_CLE_API_GENEREE',
payment: -1,
idClient: 123
});
body.append("itemsList[]", "12_2_Pizza 4 fromages_14.50_3_8");
body.append("itemsList[]", "-5_9.99_Vente libre");
const res = await fetch("https://kash.click/workers/webapp.php", {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
body
});
let payload; try{ payload = await res.json(); }catch{ payload = await res.text(); }
console.log(payload);
}
New customer
async function recordSaleWithNewClient(){
const body = new URLSearchParams({
shopID: SHOPID,
key: 'REMPLACER_PAR_VOTRE_CLE_API_GENEREE',
payment: -1
});
body.append("client[nom]", "Durand");
body.append("client[prenom]", "Zoé");
body.append("client[email]", "zoe.durand@example.com");
body.append("client[telephone]", "+33 6 12 34 56 78");
body.append("client[adresseligne1]", "10 rue des Écoles");
body.append("client[adresseligne2]", "Bât. B");
body.append("client[commentaireadresse]", "Sonner 2 fois");
body.append("client[codepostal]", "75005");
body.append("client[ville]", "Paris");
body.append("client[pays]", "FR");
body.append("client[numtva]", "FRXX999999999");
body.append("client[rcs]", "RCS Paris 123 456 789");
body.append("client[codeBarre]", "CUST-0001");
body.append("client[telephone2]", "+33 1 23 45 67 89");
body.append("client[lat]", "48.848");
body.append("client[lng]", "2.347");
body.append("itemsList[]", "Free_19_Item");
body.append("itemsList[]", "Free_5.4_OtherItem");
const res = await fetch("https://kash.click/workers/webapp.php", {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
body
});
let payload; try{ payload = await res.json(); }catch{ payload = await res.text(); }
console.log(payload);
}
Expected JSON response
Order confirmed, but not paid.
{
"success": true,
"orderID":17724460,
"paymentLink":"A link the client can use to pay the order",
"invoice":"URL of the PDF invoice"
}
Order not validated, not paid
{
"success": true,
"orderID":17724461,
"paymentLink":"A link the client can use to pay the order",
"quote":"URL of the PDF qduote"
}
Order confirmed and paid for.
{
"success": true,
"orderID":17724461,
"invoice":"URL of the PDF qduote"
}
Failure
{
"success": false,
"result": "Error message"
}