11<?xml version =' 1.0' encoding =' UTF-8' ?>
22<odoo >
3- <record id =" industry_add_update " model =" ir.actions.server" >
3+ <record id =" update_city_tax_action " model =" ir.actions.server" >
44 <field name =" name" >Add/Update City Tax</field >
5- <field name =" model_id" ref =" sale.model_sale_order" />
6- <field name =" usage" >base_automation</field >
5+ <field name =" model_id" ref =" x_model_city_tax" />
76 <field name =" state" >code</field >
8- <field name =" code" ><![CDATA[ for record in records:
9- stay_taxes = 0
10- stay_tax_line = False
11- for so_line in record.order_line:
12- if so_line.product_id.x_is_a_room_offer:
13- if so_line.x_nights > 0: stay_taxes += so_line.x_nights
14- if so_line.product_id.x_is_stay_tax: stay_tax_line = so_line
15- if stay_taxes > 0:
16- if stay_tax_line: stay_tax_line['product_uom_qty'] = stay_taxes
17- else: # Add stay tax product
18- product = env['product.product'].search([('x_is_stay_tax', '=', True)], limit=1)
19- env['sale.order.line'].create({'order_id': record.id, 'product_id': product.id, 'product_uom_qty': stay_taxes})
7+ <field name =" code" ><![CDATA[
8+ stay_tax_line = False
9+ sequence = 0
10+ for so_line in record.x_sale_order_id.order_line:
11+ if so_line.product_id.x_is_stay_tax: stay_tax_line = so_line
12+ sequence = max(sequence, so_line.sequence)
13+ if stay_tax_line: stay_tax_line.write({'product_uom_qty': record.x_total, 'qty_delivered': record.x_total, 'sequence': 1 + sequence})
14+ elif record.x_total > 0:
15+ product = env['product.product'].search([('x_is_stay_tax', '=', True)], limit=1)
16+ env['sale.order.line'].create({'order_id': record.x_sale_order_id.id, 'product_id': product.id, 'product_uom_qty': record.x_total, 'qty_delivered': record.x_total})
2017 ]]> </field >
2118 </record >
22- <record id =" industry_trigger_so_update_from_slot" model =" ir.actions.server" >
23- <field name =" name" >Trigger SO Update from Slot</field >
24- <field name =" model_id" ref =" planning.model_planning_slot" />
25- <field name =" usage" >base_automation</field >
19+ <record id =" open_x_city_tax_action" model =" ir.actions.server" >
20+ <field name =" name" >Open City Tax</field >
21+ <field name =" model_id" ref =" sale.model_sale_order" />
2622 <field name =" state" >code</field >
2723 <field name =" code" ><![CDATA[
28- sale_order = record.sale_order_id
29- if sale_order:
30- stay_taxes = 0
31- stay_tax_line = False
32- for so_line in sale_order.order_line:
33- if so_line.product_id.x_is_a_room_offer:
34- if so_line.x_nights > 0:
35- stay_taxes += so_line.x_nights
36- if so_line.product_id.x_is_stay_tax:
37- stay_tax_line = so_line
38- if stay_taxes > 0:
39- if stay_tax_line:
40- stay_tax_line['product_uom_qty'] = stay_taxes
24+ record.order_line.planning_slot_ids['x_guests'] = len(record.x_guests) // (len(record.order_line.planning_slot_ids) or 1) or 1
25+ action = {
26+ 'type': 'ir.actions.act_window',
27+ 'name': 'City tax',
28+ 'res_model': 'x_city_tax',
29+ 'view_mode': 'form',
30+ 'target': 'new',
31+ 'context': {'search_default_x_sale_order_id': record.id, 'default_x_sale_order_id': record.id},
32+ 'domain': [('x_sale_order_id', '=', record.id)],
33+ }
4134]]> </field >
4235 </record >
43- <record id =" industry_fix_slot_times" model =" ir.actions.server" >
44- <field name =" binding_model_id" ref =" planning.model_planning_slot" />
45- <field name =" model_id" ref =" planning.model_planning_slot" />
46- <field name =" usage" >base_automation</field >
47- <field name =" state" >code</field >
48- <field name =" name" >Fix Slot Times</field >
49- <field name =" code" ><![CDATA[ def ceil(x):
50- return int(x) if x == int(x) else int(x) + 1
36+ <record id =" industry_fix_slot_times" model =" ir.actions.server" >
37+ <field name =" binding_model_id" ref =" planning.model_planning_slot" />
38+ <field name =" model_id" ref =" planning.model_planning_slot" />
39+ <field name =" usage" >base_automation</field >
40+ <field name =" state" >code</field >
41+ <field name =" name" >Fix Slot Times</field >
42+ <field name =" code" ><![CDATA[
5143pickup_time = env.ref('sale_renting.recurrence_nightly').pickup_time
5244return_time = env.ref('sale_renting.recurrence_nightly').return_time
53- start_datetime = record.start_datetime.astimezone(tz=dateutil.tz.UTC)
54- end_datetime = record.end_datetime.astimezone(tz=dateutil.tz.UTC)
5545tz = env.ref('website.default_website').tz
56- if record.role_id.x_is_a_room_offer:
46+ for record in records:
47+ if not record.role_id.x_is_a_room_offer: continue
48+ start_datetime = record.start_datetime.astimezone(tz=dateutil.tz.UTC)
49+ end_datetime = record.end_datetime.astimezone(tz=dateutil.tz.UTC)
5750 if record.start_datetime and str(record.start_datetime.time()) != f"{int(pickup_time):02d}:{int(pickup_time % 1 * 60):02d}:00":
5851 start = timezone(tz).localize(datetime.datetime(year=start_datetime.year, month=start_datetime.month, day=start_datetime.day, hour=int(pickup_time), minute=int(pickup_time % 1 * 60), second=0))
5952 start_datetime = start.astimezone(tz=dateutil.tz.UTC)
@@ -66,12 +59,10 @@ if record.role_id.x_is_a_room_offer:
6659 end_datetime = end_datetime + datetime.timedelta(days=1)
6760 record['start_datetime'] = start_datetime.replace(tzinfo=None)
6861 record['end_datetime'] = end_datetime.replace(tzinfo=None)
69- if record.sale_line_id :
62+ for record in records :
7063 nights = 0
7164 if record.sale_line_id.planning_slot_ids:
72- for slot in record.sale_line_id.planning_slot_ids:
73- if slot.start_datetime and slot.end_datetime:
74- nights += ceil((slot.end_datetime - slot.start_datetime).total_seconds() / (24 * 3600))
65+ nights = sum(record.sale_line_id.planning_slot_ids.mapped('x_nights'))
7566 record.sale_line_id.update({
7667 'start_date': record.start_datetime,
7768 'return_date': record.end_datetime,
@@ -91,14 +82,24 @@ return_time = env.ref('sale_renting.recurrence_nightly').return_time
9182for record in records:
9283 tz = env.ref('website.default_website').tz
9384 rental_start_date = record.rental_start_date.astimezone(tz=dateutil.tz.gettz(tz))
85+ start = rental_start_date.replace(hour=int(pickup_time), minute=int(pickup_time % 1 * 60), second=0)
86+ record['rental_start_date'] = start.astimezone(tz=dateutil.tz.UTC).replace(tzinfo=None)
87+
9488 rental_return_date = record.rental_return_date.astimezone(tz=dateutil.tz.gettz(tz))
95- start = rental_start_date.replace(hour=int(pickup_time), minute=int(pickup_time % 1 * 60), second=0, microsecond=0)
96- start_datetime = start.astimezone(tz=dateutil.tz.UTC)
97- record['rental_start_date'] = start_datetime.replace(tzinfo=None)
98- end = rental_return_date.replace(hour=int(return_time), minute=int(return_time % 1 * 60), second=0, microsecond=0)
99- end_datetime = end.astimezone(tz=dateutil.tz.UTC)
100- record['rental_return_date'] = end_datetime.replace(tzinfo=None)
89+ end = rental_return_date.replace(hour=int(return_time), minute=int(return_time % 1 * 60), second=0)
90+ record['rental_return_date'] = end.astimezone(tz=dateutil.tz.UTC).replace(tzinfo=None)
10191 record.action_update_rental_prices()
92+ ]]> </field >
93+ </record >
94+ <record id =" apply_rental_check_out" model =" ir.actions.server" >
95+ <field name =" name" >Apply Rental Checkout</field >
96+ <field name =" model_id" ref =" sale_renting.model_rental_order_wizard" />
97+ <field name =" state" >code</field >
98+ <field name =" code" ><![CDATA[
99+ record.apply()
100+ if record.order_id.rental_status == "returned":
101+ server_action = record.env['ir.actions.server'].browse(record.env.ref('booking_engine.open_x_city_tax_action').id)
102+ action = server_action.with_context(active_id=record.order_id.id, active_model="sale.order").sudo().run()
102103]]> </field >
103104 </record >
104105</odoo >
0 commit comments