Отправка POS-заказов на сервер¶
В этой статье описывается процесс отправки POS-заказов на сервер odoo и демонстрируется возможное использование его расширения.
Общий процесс выглядит следующим образом:
Сторона клиента:
- `` export_as_JSON``: конвертирует * данные заказа * для отправки на сервер
- затем * заказ * сохраняется в кеш браузера
- затем POS пытается отправить данные на сервер
Бэкэнд сторона:
- `` create_from_ui``: данные поступают в POS (см. здесь <https://github.com/odoo/odoo/blob/33f1e5f64be0113e4e3ad7cb8de373d8ab5daa7b/addons/point_of_sale/models/pos_order.py#L722-L751>`__)
- `` _process_order``: порядок обработки json (созданные записи в базе данных и т. д. см. здесь <https://github.com/odoo/odoo/blob/33f1e5f64be0113e4e3ad7cb8de373d8ab5daa7b/addons/point_of_sale/models/pos_order.py#L116-L155>`__)
- `` _order_fields``: подготовить словарь для метода create (смотрите how)
Итак, чтобы передать дополнительную информацию и обработать ее на сервере, нам нужно:
- расширить `` export_as_JSON`` на стороне клиента
- расширить `` _process_order`` на стороне сервера
Давайте проверим это на примере:
Модуль `` Сохранение удаленных продуктов POS-заказа``¶
Модуль позволяет добавить причину отмены заказа или строки заказа в POS.
Для этого мы:
- расширить `` export_as_JSON`` на стороне клиента (см. здесь <https://github.com/it-projects-llc/pos-addons/blob/c5539c847d0656f6885087e27e497b8d985f1e31/pos_order_cancel/static/src/js/models.js#L138-L144>`__)
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;
},
- расширить `` _process_order`` на стороне сервера (см. здесь <https://github.com/it-projects-llc/pos-addons/blob/c5539c847d0656f6885087e27e497b8d985f1e31/pos_order_cancel/models/models.py#L56-L62>`__)
@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