orderID is matched against shoppertise_orders.orderID. status is upper-cased and runs of spaces/hyphens are collapsed to _ before validation, so rider-cancelled and RIDER CANCELLED resolve to RIDER_CANCELLED.grabStatus is overwritten with the new value and a row is appended to the order history (state = status, message = remark, code = THIRD_PARTY).CANCELLED, RIDER_CANCELLED and CUSTOMER_CANCELLED the following also run: POS reversal (same document re-posted with negative quantities and a -CAN suffix on VendorOrderNo), Telegram notification, and a KDS cancellation if kdsActive is set on the outlet. The POS reversal is skipped when the order has no dynaDocNo, TouchPOS credentials are missing, or the kitchen has enableDynamod=0.409 without touching the order, so the POS reversal cannot be posted twice.POST /api/shoppertise/order/cancel, which has been removed. Callers that previously sent {orderID, message, code} should send {orderID, status: "CANCELLED", remark}. The code field is no longer accepted; use the status value to carry the cancel reason.curl --location '/api/shoppertise/order/status' \
--header 'Content-Type: application/json' \
--data '{
"orderID": "123456789-C742AGCGJPNHUE",
"status": "READY"
}'{
"status": "success",
"message": "Order status updated to RIDER_CANCELLED",
"orderID": "123456789-C742AGCGJPNHUE",
"previousStatus": "READY",
"currentStatus": "RIDER_CANCELLED"
}