11# -*- coding: utf-8 -*-
22import re
33import uuid
4+ from functools import partial
45from datetime import timedelta
56from odoo import http , fields , _
67from odoo .http import request
@@ -60,36 +61,26 @@ def process_new_order(self, order, access_token, table_identifier, device_type):
6061 posted_order_id = pos_config .env ['pos.order' ].with_context (from_self = True ).create_from_ui ([order ], draft = True )[0 ].get ('id' )
6162
6263 # Process the lines and get their prices computed
63- lines = self ._process_lines (lines , pos_config , posted_order_id , is_take_away )
64+ processed_lines = self ._process_lines (lines , pos_config , posted_order_id , is_take_away )
6465
6566 # Compute the order prices
66- amount_total , amount_untaxed = self ._get_order_prices (lines )
67+ amount_total , amount_untaxed = self ._get_order_prices (processed_lines )
6768
6869 # Update the order with the computed prices and lines
69- order = pos_config .env ["pos.order" ].browse (posted_order_id )
70+ saved_order = pos_config .env ["pos.order" ].browse (posted_order_id )
71+ saved_lines = pos_config .env ['pos.order.line' ].with_user (pos_config .self_ordering_default_user_id ).create (processed_lines )
7072
71- classic_lines = []
72- combo_lines = []
73- for line in lines :
74- if line ["combo_parent_uuid" ]:
75- combo_lines .append (line )
76- else :
77- classic_lines .append (line )
78-
79- # combo lines must be created after classic_line, as they need the classic line identifier
80- # use user admin to avoid access rights issues
81- lines = pos_config .env ['pos.order.line' ].with_user (pos_config .self_ordering_default_user_id ).create (classic_lines )
82- lines += pos_config .env ['pos.order.line' ].with_user (pos_config .self_ordering_default_user_id ).create (combo_lines )
83-
84- order .write ({
85- 'lines' : lines ,
73+ saved_order .write ({
74+ 'lines' : saved_lines ,
8675 'state' : 'paid' if amount_total == 0 else 'draft' ,
8776 'amount_tax' : amount_total - amount_untaxed ,
8877 'amount_total' : amount_total ,
8978 })
9079
91- order .send_table_count_notification (order .table_id )
92- return order ._export_for_self_order ()
80+ order ['data' ]['lines' ] = lines
81+ self ._process_combo_items (saved_order , order ['data' ])
82+ saved_order .send_table_count_notification (saved_order .table_id )
83+ return saved_order ._export_for_self_order ()
9384
9485 @http .route ('/pos-self-order/get-orders-taxes' , auth = 'public' , type = 'json' , website = True )
9586 def get_order_taxes (self , order , access_token ):
@@ -150,9 +141,31 @@ def update_existing_order(self, order, access_token, table_identifier):
150141 'table_stand_number' : order .get ('table_stand_number' ),
151142 })
152143
144+ self ._process_combo_items (pos_order , order )
153145 pos_order .send_table_count_notification (pos_order .table_id )
154146 return pos_order ._export_for_self_order ()
155147
148+ def _process_combo_items (self , order , order_values ):
149+ """
150+ Here we need to process original order dict to add
151+ combo_line_ids and combo_parent_id to the lines
152+ and then call the _link_combo_items method to link
153+ the combo lines together.
154+ """
155+ combo_lines = []
156+ lines = order_values .get ('lines' )
157+ for line in lines :
158+ if line .get ('child_lines' ):
159+ line ['combo_line_ids' ] = [child_line ['uuid' ] for child_line in line ['child_lines' ]]
160+ elif line .get ('combo_parent_uuid' ):
161+ line ['combo_parent_id' ] = line .get ('combo_parent_uuid' )
162+
163+ if line .get ('combo_line_ids' ) or line .get ('combo_parent_id' ):
164+ combo_lines .append ([0 , 0 , line ])
165+
166+ order_values ['lines' ] = combo_lines
167+ order ._link_combo_items (order_values )
168+
156169 @http .route ('/pos-self-order/remove-order' , auth = 'public' , type = 'json' , website = True )
157170 def remove_order (self , access_token , order_id , order_access_token ):
158171 pos_config = self ._verify_pos_config (access_token )
@@ -221,6 +234,7 @@ def _process_lines(self, lines, pos_config, pos_order_id, take_away=False):
221234 newLines = []
222235 pricelist = pos_config .pricelist_id
223236 sale_price_digits = pos_config .env ['decimal.precision' ].precision_get ('Product Price' )
237+ process_line = partial (pos_config .env ['pos.order.line' ]._order_line_fields , session_id = pos_config .current_session_id .id )
224238
225239 combo_line_ids = [line ['combo_line_id' ] for line in lines if line .get ('combo_line_id' )]
226240 combo_lines = pos_config .env ['pos.combo.line' ].search ([('id' , 'in' , combo_line_ids )])
@@ -246,6 +260,7 @@ def _process_lines(self, lines, pos_config, pos_order_id, take_away=False):
246260 children = [l for l in lines if l .get ('combo_parent_uuid' ) == line .get ('uuid' )]
247261 pos_combo_lines = combo_lines .browse ([child .get ('combo_line_id' ) for child in children ])
248262
263+ newLines .append ({})
249264 if len (children ) > 0 :
250265 original_total = sum (pos_combo_lines .mapped ("combo_id.base_price" ))
251266 remaining_total = lst_price
@@ -293,7 +308,7 @@ def _process_lines(self, lines, pos_config, pos_order_id, take_away=False):
293308 taxes_after_fp = fiscal_pos .map_tax (product .taxes_id ) if fiscal_pos else product .taxes_id
294309 pdetails = taxes_after_fp .compute_all (price_unit_fp , pos_config .currency_id , line_qty , product )
295310
296- newLines . append ( {
311+ newLine = {
297312 'price_unit' : price_unit_fp ,
298313 'price_subtotal' : pdetails .get ('total_excluded' ),
299314 'price_subtotal_incl' : pdetails .get ('total_included' ),
@@ -310,10 +325,12 @@ def _process_lines(self, lines, pos_config, pos_order_id, take_away=False):
310325 'combo_parent_uuid' : line .get ('combo_parent_uuid' ),
311326 'combo_id' : line .get ('combo_id' ),
312327 'price_extra' : price_extra
313- })
328+ }
329+ newLines [len (newLines ) - 1 - len (children )] = newLine
314330 appended_uuid .append (line .get ('uuid' ))
315331
316- return newLines
332+ sanatized_lines = [process_line ([0 , 0 , line ])[2 ] for line in newLines ]
333+ return sanatized_lines
317334
318335 def _get_order_prices (self , lines ):
319336 amount_untaxed = sum ([line .get ('price_subtotal' ) for line in lines ])
0 commit comments