pos_self_order/models/pos_order.py

174 lines
6.6 KiB
Python
Raw Permalink Normal View History

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from typing import Dict
from odoo import models, fields, api
class PosOrderLine(models.Model):
_inherit = "pos.order.line"
combo_parent_id = fields.Many2one('pos.order.line', string='Combo Parent')
combo_line_ids = fields.One2many('pos.order.line', 'combo_parent_id', string='Combo Lines')
combo_id = fields.Many2one('pos.combo', string='Combo line reference')
@api.model_create_multi
def create(self, vals_list):
for vals in vals_list:
if (vals.get('combo_parent_uuid')):
vals.update([
('combo_parent_id', self.search([('uuid', '=', vals.get('combo_parent_uuid'))]).id)
])
if 'combo_parent_uuid' in vals:
del vals['combo_parent_uuid']
return super().create(vals_list)
def write(self, vals):
if (vals.get('combo_parent_uuid')):
vals.update([
('combo_parent_id', self.search([('uuid', '=', vals.get('combo_parent_uuid'))]).id)
])
if 'combo_parent_uuid' in vals:
del vals['combo_parent_uuid']
return super().write(vals)
def _export_for_ui(self, orderline):
return {
'note': orderline.note,
**super()._export_for_ui(orderline),
}
class PosOrder(models.Model):
_inherit = "pos.order"
table_stand_number = fields.Char(string="Table Stand Number")
take_away = fields.Boolean(string="Take Away", default=False)
def _compute_tax_details(self):
self.ensure_one()
taxes = sum([line.tax_ids.with_company(self.company_id).compute_all(line.price_unit, quantity=line.qty, product=line.product_id)['taxes']
for line in self.lines], [])
tax_percetanges = {tax['id']: tax['amount'] for tax in self.env['account.tax'].search([]).read(['amount'])}
merged_tax_details = {}
for tax_obj in taxes:
tax_id = tax_obj['id']
if tax_id not in merged_tax_details:
merged_tax_details[tax_id] = {
'tax': {
'id': tax_id,
'amount': tax_percetanges[tax_id]
},
'name': tax_obj['name'],
'amount': 0.0,
'base': 0.0,
}
merged_tax_details[tax_id]['amount'] += tax_obj['amount']
merged_tax_details[tax_id]['base'] += tax_obj['base']
return list(merged_tax_details.values())
@api.model
def create_from_ui(self, orders, draft=False):
for order in orders:
if order['data'].get('server_id'):
server_id = order['data'].get('server_id')
old_order = self.env['pos.order'].browse(server_id)
if old_order.take_away:
order['data']['take_away'] = old_order.take_away
return super().create_from_ui(orders, draft)
def _process_saved_order(self, draft):
res = super()._process_saved_order(draft)
if self.env.context.get('from_self') is not True:
self._send_notification(self)
return res
@api.model
def remove_from_ui(self, server_ids):
order_ids = self.env['pos.order'].browse(server_ids)
order_ids.state = 'cancel'
self._send_notification(order_ids)
return super().remove_from_ui(server_ids)
def _order_fields(self, ui_order):
fields = super()._order_fields(ui_order)
fields.update({
'take_away': ui_order.get('take_away'),
'table_stand_number': ui_order.get('table_stand_number'),
})
return fields
def _send_notification(self, order_ids):
for order in order_ids:
if order.access_token and order.state != 'draft':
self.env['bus.bus']._sendone(f'self_order-{order.access_token}', 'ORDER_STATE_CHANGED', {
'access_token': order.access_token,
'state': order.state
})
else:
self.env['bus.bus']._sendone(f'self_order-{order.access_token}', 'ORDER_CHANGED', {
'order': order._export_for_self_order()
})
def _export_for_self_order(self) -> Dict:
self.ensure_one()
return {
"id": self.id,
"pos_config_id": self.config_id.id,
"take_away": self.take_away,
"pos_reference": self.pos_reference,
"access_token": self.access_token,
"table_stand_number": self.table_stand_number,
"state": self.state,
"date_order": str(self.date_order),
"amount_total": self.amount_total,
"amount_tax": self.amount_tax,
"lines": [
{
"id": line.id,
"price_subtotal": line.price_subtotal,
"price_subtotal_incl": line.price_subtotal_incl,
"product_id": line.product_id.id,
"attribute_value_ids": line.attribute_value_ids.ids,
"custom_attribute_value_ids": line.custom_attribute_value_ids.read(['id', 'name', 'custom_product_template_attribute_value_id', 'custom_value'], load=False),
"uuid": line.uuid,
"qty": line.qty,
"customer_note": line.customer_note,
"full_product_name": line.full_product_name,
}
for line in self.lines
],
"payment_lines": [{
"name": payment.payment_method_id.name,
"amount": payment.amount
} for payment in self.payment_ids],
"tax_details": self._compute_tax_details(),
}
def get_standalone_self_order(self):
orders = self.env['pos.order'].search([
*self.env["pos.order"]._check_company_domain(self.env.company),
('state', '=', 'draft'),
'|', ('pos_reference', 'ilike', 'Kiosk'),
('pos_reference', 'ilike', 'Self-Order'),
('table_id', '=', False),
])
return orders
@api.model
def export_for_ui_shared_order(self, config_id):
orders = super().export_for_ui_shared_order(config_id)
self_orders = self.get_standalone_self_order().export_for_ui()
return orders + self_orders
@api.model
def export_for_ui_table_draft(self, table_ids):
orders = super().export_for_ui_table_draft(table_ids)
self_orders = self.get_standalone_self_order().export_for_ui()
return orders + self_orders