Sending POS Orders to Server

This article describes the process of sending POS Orders to odoo server and demonstrates possible usage of extending it.

The general process is as follows:

Client side:

  • export_as_JSON: converts order data to send to the server
  • then order is saved to browser cache
  • then POS tries to send data to server

Backend side:

  • create_from_ui: data come to POS (see here)
  • _process_order: process order json (created records in database, etc. see here)
  • _order_fields: prepare dictionary for create method (see how)

So, in order to pass additional information and handle it on server we need:

  • extend export_as_JSON in client side
  • extend _process_order in server side

Let’s check it on example:

Saving removed products of POS order module

The module allows to add a reason on canceling order or orderline in POS.

In order to do it we:

  • extend export_as_JSON in client side (see here)
export_as_JSON: function() {
  var data = _super_order.export_as_JSON.apply(this, arguments);
  /* canceled_lines is used only on the client side
  to cache those data in order to prevent misbehavior
  in case the page was refreshed
  */
  data.canceled_lines = this.canceled_lines || [];
  // updata data to be sent to the server
  data.reason = this.reason;
  data.is_cancelled = this.is_cancelled;
  return data;
},
  • extend _process_order in server side (see here)
@api.model
def _process_order(self, pos_order):
    order = super(PosOrder, self)._process_order(pos_order)
    if 'is_cancelled' in pos_order and pos_order['is_cancelled'] is True:
        if pos_order['reason']:
             order.cancellation_reason = pos_order['reason'].encode('utf-8')
        order.is_cancelled = True
    return order