Skip to content

Commit 87b5938

Browse files
committed
[IMP] booking_engine: add Daily Lines on SO and Manager Dashboard
This commits adds a dashboard to visualize informations for an hotel such as occupancy rate or average daily rate. This dashboard uses a new model linked to sale orders, x_so_daily_line, that are represented one for each room and for each day of stayover. Task-6176659
1 parent dfbb412 commit 87b5938

24 files changed

Lines changed: 918 additions & 0 deletions

booking_engine/__manifest__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
'data/survey_survey.xml',
4545
'data/survey_question.xml',
4646
'data/survey_question_answer.xml',
47+
'data/spreadsheet_dashboard.xml',
4748
],
4849
'demo': [
4950
'demo/website_menu.xml',

booking_engine/data/base_automation.xml

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,4 +174,53 @@
174174
<field name="trigger_field_ids" eval="[(6, 0, [ref('x_is_customer_satisfaction_survey_field')])]"/>
175175
<field name="action_server_ids" eval="[(6, 0, [ref('server_action_to_archive_surveys')])]"/>
176176
</record>
177+
178+
<!-- Daily Lines -->
179+
<record id="automation_daily_lines_on_so_create" model="base.automation">
180+
<field name="model_id" ref="sale.model_sale_order"/>
181+
<field name="action_server_ids" eval="[(6, 0, [ref('server_action_create_daily_lines_from_so')])]"/>
182+
<field name="trigger">on_create_or_write</field>
183+
<field name="filter_domain">[('rental_status', '=', 'pickup'), ('rental_start_date', '!=', False), ('rental_return_date', '!=', False)]</field>
184+
<field name="filter_pre_domain">[('rental_status', 'in', ['draft', 'sent'])]</field>
185+
<field name="name">Daily Lines: On SO confirmation</field>
186+
<field name="trigger_field_ids" eval="[(6, 0, [ref('sale_renting.field_sale_order__rental_status')])]"/>
187+
</record>
188+
<record id="automation_daily_lines_on_so_cancel" model="base.automation">
189+
<field name="model_id" ref="sale.model_sale_order"/>
190+
<field name="action_server_ids" eval="[(6, 0, [ref('server_action_unlink_daily_lines_from_so_when_cancelled')])]"/>
191+
<field name="trigger">on_create_or_write</field>
192+
<field name="filter_domain">[('x_daily_lines_ids', '!=', False), ('state', '=', 'cancel')]</field>
193+
<field name="name">Daily Lines: On SO cancelled</field>
194+
<field name="trigger_field_ids" eval="[(6, 0, [ref('sale.field_sale_order__state')])]"/>
195+
</record>
196+
<record id="automation_daily_lines_on_so_delete" model="base.automation">
197+
<field name="model_id" ref="sale.model_sale_order"/>
198+
<field name="action_server_ids" eval="[(6, 0, [ref('server_action_unlink_daily_lines_from_so')])]"/>
199+
<field name="trigger">on_unlink</field>
200+
<field name="filter_domain">[('x_daily_lines_ids', '!=', False)]</field>
201+
<field name="name">Daily Lines: On SO delete</field>
202+
</record>
203+
<record id="automation_daily_lines_on_sol_create" model="base.automation">
204+
<field name="model_id" ref="sale.model_sale_order_line"/>
205+
<field name="action_server_ids" eval="[(6, 0, [ref('server_action_create_daily_lines_from_sol')])]"/>
206+
<field name="trigger">on_create</field>
207+
<field name="filter_domain">[('product_id.product_tmpl_id.x_is_a_room_offer', '=', True), ('order_id.rental_status', 'in', ['pickup', 'return', 'returned']), ('order_id.rental_start_date', '!=', False), ('order_id.rental_return_date', '!=', False)]</field>
208+
<field name="name">Daily Lines: On SOL creation in confirmed order</field>
209+
</record>
210+
<record id="automation_daily_lines_on_sol_write" model="base.automation">
211+
<field name="model_id" ref="sale.model_sale_order_line"/>
212+
<field name="action_server_ids" eval="[(6, 0, [ref('server_action_modify_daily_lines_from_sol')])]"/>
213+
<field name="trigger">on_write</field>
214+
<field name="filter_domain">[('x_daily_line_ids', '!=', False)]</field>
215+
<field name="name">Daily Lines: On SOL with daily lines write</field>
216+
</record>
217+
<record id="automation_daily_lines_on_so_rental_date_changed" model="base.automation">
218+
<field name="model_id" ref="sale.model_sale_order"/>
219+
<field name="action_server_ids" eval="[(6, 0, [ref('server_action_modify_daily_lines_from_so_date_change')])]"/>
220+
<field name="trigger">on_write</field>
221+
<field name="filter_domain">[('rental_status', 'in', ['pickup', 'return']), ('rental_start_date', '!=', False), ('rental_return_date', '!=', False)]</field>
222+
<field name="filter_pre_domain">[('rental_status', 'in', ['pickup', 'return'])]</field>
223+
<field name="name">Daily Lines: On SO rental date changed</field>
224+
<field name="trigger_field_ids" eval="[(6, 0, [ref('sale_renting.field_sale_order__rental_start_date'), ref('sale_renting.field_sale_order__rental_return_date')])]"/>
225+
</record>
177226
</odoo>

booking_engine/data/ir_actions_server.xml

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -561,4 +561,100 @@ if survey:
561561
invite.action_invite()
562562
orders_to_survey.write({'x_is_survey_sent': True})]]></field>
563563
</record>
564+
565+
<!-- Daily Lines -->
566+
<record id="server_action_create_daily_lines_from_so" model="ir.actions.server">
567+
<field name="code"><![CDATA[
568+
for line in record.order_line:
569+
if line.product_id.product_tmpl_id.x_is_a_room_offer:
570+
current_date = record.rental_start_date
571+
while current_date < record.rental_return_date:
572+
price_for_day = record.pricelist_id._get_product_price(line.product_id, 1.0, date=current_date)
573+
env['x_so_daily_line'].create({
574+
'x_sale_order_id': record.id,
575+
'x_sale_order_line_id': line.id,
576+
'x_date': current_date,
577+
'x_price': price_for_day,
578+
'x_state': 'planned',
579+
})
580+
current_date += datetime.timedelta(days=1)
581+
]]></field>
582+
<field name="model_id" ref="sale.model_sale_order"/>
583+
<field name="state">code</field>
584+
<field name="name">Dashboard: Create daily lines from so</field>
585+
</record>
586+
<record id="server_action_unlink_daily_lines_from_so_when_cancelled" model="ir.actions.server">
587+
<field name="code"><![CDATA[
588+
records.x_daily_lines_ids.unlink()
589+
]]></field>
590+
<field name="model_id" ref="sale.model_sale_order"/>
591+
<field name="state">code</field>
592+
<field name="name">Dashboard: Delete daily lines from so when cancelled</field>
593+
</record>
594+
<record id="server_action_unlink_daily_lines_from_so" model="ir.actions.server">
595+
<field name="code"><![CDATA[
596+
records.x_daily_lines_ids.unlink()
597+
]]></field>
598+
<field name="model_id" ref="sale.model_sale_order"/>
599+
<field name="state">code</field>
600+
<field name="name">Dashboard: Delete daily lines from so</field>
601+
</record>
602+
<record id="server_action_create_daily_lines_from_sol" model="ir.actions.server">
603+
<field name="code"><![CDATA[
604+
current_date = record.order_id.rental_start_date
605+
while current_date < record.order_id.rental_return_date:
606+
price_for_day = record.order_id.pricelist_id._get_product_price(record.product_id, 1.0, date=current_date)
607+
env['x_so_daily_line'].create({
608+
'x_sale_order_id': record.order_id.id,
609+
'x_sale_order_line_id': record.id,
610+
'x_date': current_date,
611+
'x_price': price_for_day,
612+
'x_state': 'planned',
613+
})
614+
current_date += datetime.timedelta(days=1)
615+
]]></field>
616+
<field name="model_id" ref="sale.model_sale_order_line"/>
617+
<field name="state">code</field>
618+
<field name="name">Dashboard: Create daily lines from sol</field>
619+
</record>
620+
<record id="server_action_modify_daily_lines_from_sol" model="ir.actions.server">
621+
<field name="code"><![CDATA[
622+
for record in records:
623+
for daily_line in record.x_daily_line_ids:
624+
daily_line.write({
625+
'x_price': record.order_id.pricelist_id._get_product_price(record.product_id, 1.0, date=daily_line.x_date),
626+
})
627+
]]></field>
628+
<field name="model_id" ref="sale.model_sale_order_line"/>
629+
<field name="state">code</field>
630+
<field name="name">Dashboard: Modify daily lines from sol</field>
631+
</record>
632+
<record id="server_action_modify_daily_lines_from_so_date_change" model="ir.actions.server">
633+
<field name="code"><![CDATA[
634+
for record in records:
635+
for daily_line in record.x_daily_lines_ids:
636+
if daily_line.x_date < record.rental_start_date.date() or daily_line.x_date >= record.rental_return_date.date():
637+
daily_line.unlink()
638+
represented_dates = record.x_daily_lines_ids.mapped('x_date')
639+
to_cover_dates = []
640+
current_date = record.rental_start_date
641+
while current_date < record.rental_return_date:
642+
if current_date.date() not in represented_dates:
643+
to_cover_dates.append(current_date.date())
644+
current_date += datetime.timedelta(days=1)
645+
for line in record.order_line.filtered(lambda l: l.product_id.product_tmpl_id.x_is_a_room_offer):
646+
for date in to_cover_dates:
647+
price_for_day = record.pricelist_id._get_product_price(line.product_id, 1.0, date=date)
648+
env['x_so_daily_line'].create({
649+
'x_sale_order_id': record.id,
650+
'x_sale_order_line_id': line.id,
651+
'x_date': date,
652+
'x_price': price_for_day,
653+
'x_state': 'planned',
654+
})
655+
]]></field>
656+
<field name="model_id" ref="sale.model_sale_order"/>
657+
<field name="state">code</field>
658+
<field name="name">Dashboard: Modify daily lines from so rental dates change</field>
659+
</record>
564660
</odoo>

booking_engine/data/ir_model.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,8 @@
1313
<field name="model">x_availability</field>
1414
<field name="name">Availability</field>
1515
</record>
16+
<record id="x_model_so_daily_line" model="ir.model">
17+
<field name="model">x_so_daily_line</field>
18+
<field name="name">Sale Order Daily Line</field>
19+
</record>
1620
</odoo>

booking_engine/data/ir_model_access.xml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,13 @@
2727
<field name="perm_write" eval="False"/>
2828
<field name="perm_unlink" eval="False"/>
2929
</record>
30+
<record id="x_model_so_daily_line_access" model="ir.model.access">
31+
<field name="group_id" ref="base.group_user"/>
32+
<field name="model_id" ref="x_model_so_daily_line"/>
33+
<field name="name">sale_order_line group_user</field>
34+
<field name="perm_create" eval="True"/>
35+
<field name="perm_read" eval="True"/>
36+
<field name="perm_write" eval="True"/>
37+
<field name="perm_unlink" eval="True"/>
38+
</record>
3039
</odoo>

booking_engine/data/ir_model_fields.xml

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -785,4 +785,98 @@ Note that saving a new survey with this set will archive previous survey with th
785785
<field name="model_id" ref="sale.model_sale_order"/>
786786
<field name="ttype">boolean</field>
787787
</record>
788+
789+
<!-- Daily Lines -->
790+
<record id="_field_daily_line" model="ir.model.fields">
791+
<field name="ttype">integer</field>
792+
<field name="field_description">Sequence</field>
793+
<field name="model_id" ref="x_model_so_daily_line"/>
794+
<field name="name">x_sequence</field>
795+
</record>
796+
<record id="x_sale_order_id_field_daily_line" model="ir.model.fields">
797+
<field name="ttype">many2one</field>
798+
<field name="copied" eval="True"/>
799+
<field name="field_description">X Sale Order</field>
800+
<field name="model_id" ref="x_model_so_daily_line"/>
801+
<field name="name">x_sale_order_id</field>
802+
<field name="relation">sale.order</field>
803+
</record>
804+
<record id="x_sale_order_line_id_field_daily_line" model="ir.model.fields">
805+
<field name="ttype">many2one</field>
806+
<field name="copied" eval="True"/>
807+
<field name="field_description">Sale Order Line</field>
808+
<field name="model_id" ref="x_model_so_daily_line"/>
809+
<field name="name">x_sale_order_line_id</field>
810+
<field name="relation">sale.order.line</field>
811+
</record>
812+
<record id="x_date_field_daily_line" model="ir.model.fields">
813+
<field name="ttype">date</field>
814+
<field name="copied" eval="True"/>
815+
<field name="field_description">Date</field>
816+
<field name="model_id" ref="x_model_so_daily_line"/>
817+
<field name="name">x_date</field>
818+
</record>
819+
<record id="x_currency_id_field_daily_line" model="ir.model.fields">
820+
<field name="ttype">many2one</field>
821+
<field name="field_description">Currency</field>
822+
<field name="model_id" ref="x_model_so_daily_line"/>
823+
<field name="name">x_currency_id</field>
824+
<field name="relation">res.currency</field>
825+
<field name="related">x_sale_order_id.currency_id</field>
826+
</record>
827+
<record id="x_price_field_daily_line" model="ir.model.fields">
828+
<field name="ttype">monetary</field>
829+
<field name="copied" eval="True"/>
830+
<field name="field_description">Price</field>
831+
<field name="model_id" ref="x_model_so_daily_line"/>
832+
<field name="name">x_price</field>
833+
<field name="currency_field">x_currency_id</field>
834+
</record>
835+
<record id="x_state_field_daily_line" model="ir.model.fields">
836+
<field name="ttype">selection</field>
837+
<field name="copied" eval="True"/>
838+
<field name="field_description">State</field>
839+
<field name="model_id" ref="x_model_so_daily_line"/>
840+
<field name="name">x_state</field>
841+
<field name="selection">[('planned', 'Planned'), ('done', 'Done'), ('cancel', 'Cancel')]</field>
842+
</record>
843+
<record id="x_quantity_field_daily_line" model="ir.model.fields">
844+
<field name="ttype">float</field>
845+
<field name="related">x_sale_order_line_id.product_uom_qty</field>
846+
<field name="field_description">Quantity</field>
847+
<field name="model_id" ref="x_model_so_daily_line"/>
848+
<field name="name">x_quantity</field>
849+
<field name="readonly" eval="True"/>
850+
</record>
851+
<record id="x_amount_field_daily_line" model="ir.model.fields">
852+
<field name="compute"><![CDATA[
853+
for record in self:
854+
record['x_amount'] = record.x_price * record.x_quantity * (1 - record.x_sale_order_line_id.discount/100)]]></field>
855+
<field name="ttype">monetary</field>
856+
<field name="depends">x_price, x_quantity, x_sale_order_line_id.discount</field>
857+
<field name="field_description">Amount</field>
858+
<field name="model_id" ref="x_model_so_daily_line"/>
859+
<field name="name">x_amount</field>
860+
<field name="readonly" eval="True"/>
861+
<field name="currency_field">x_currency_id</field>
862+
</record>
863+
864+
<record id="x_daily_lines_ids_field_sale_order" model="ir.model.fields">
865+
<field name="ttype">one2many</field>
866+
<field name="field_description">Daily Lines</field>
867+
<field name="model">sale.order</field>
868+
<field name="model_id" ref="sale.model_sale_order"/>
869+
<field name="name">x_daily_lines_ids</field>
870+
<field name="relation">x_so_daily_line</field>
871+
<field name="relation_field">x_sale_order_id</field>
872+
</record>
873+
<record id="x_daily_line_ids_field_sale_order_line" model="ir.model.fields">
874+
<field name="ttype">one2many</field>
875+
<field name="field_description">Daily Line</field>
876+
<field name="model">sale.order.line</field>
877+
<field name="model_id" ref="sale.model_sale_order_line"/>
878+
<field name="name">x_daily_line_ids</field>
879+
<field name="relation">x_so_daily_line</field>
880+
<field name="relation_field">x_sale_order_line_id</field>
881+
</record>
788882
</odoo>
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?xml version='1.0' encoding='UTF-8'?>
2+
<odoo noupdate="1">
3+
<record id="spreadsheet_dashboard_group_accomodation" model="spreadsheet.dashboard.group">
4+
<field name="name">Accomodation</field>
5+
<field name="sequence">0</field>
6+
</record>
7+
<record id="spreadsheet_dashboard_1" model="spreadsheet.dashboard">
8+
<field name="spreadsheet_snapshot" type="base64" file="booking_engine/static/src/binary/spreadsheet_dashboard/PerformanceDashboard.osheet.json"/>
9+
<field name="name">Performance</field>
10+
<field name="dashboard_group_id" ref="spreadsheet_dashboard_group_accomodation"/>
11+
</record>
12+
</odoo>

0 commit comments

Comments
 (0)