Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .weblate.json
Original file line number Diff line number Diff line change
Expand Up @@ -291,6 +291,11 @@
"filemask": "library/i18n/*.po",
"new_base": "library/i18n/library.pot"
},
{
"name": "machine_tool_rental",
"filemask": "machine_tool_rental/i18n/*.po",
"new_base": "machine_tool_rental/i18n/machine_tool_rental.pot"
},
{
"name": "marketing_agency",
"filemask": "marketing_agency/i18n/*.po",
Expand Down
59 changes: 59 additions & 0 deletions machine_tool_rental/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
{
'name': 'Machine Tool Rental',
'version': '1.0',
'category': 'Construction',
'author': 'Odoo S.A.',
'depends': [
'base_industry_data',
'industry_fsm_sale_report',
'knowledge',
'purchase',
'quality_control',
'sale_crm',
'sale_stock_renting',
'web_studio',
],
'data': [
'data/res_config_settings.xml',
'data/ir_model.xml',
'data/ir_model_fields.xml',
'data/ir_actions_act_window.xml',
'data/ir_actions_server.xml',
'data/ir_ui_view.xml',
'data/ir_ui_menu.xml',
'data/ir_model_access.xml',
'data/ir_default.xml',
'data/crm_tag.xml',
'data/knowledge_article.xml',
'data/product_category.xml',
'data/product_pricing.xml',
'data/product_product.xml',
'data/sale_order_template.xml',
'data/stock_storage_category.xml',
'data/stock_location.xml',
'data/base_automation.xml',
'data/x_recurring_maintenance_rules.xml',
'data/x_run_time_meter.xml',
'data/mail_message.xml',
'data/knowledge_article_favorite.xml',
'data/stock_rule.xml',
'data/quality_point.xml',
],
'demo': [
'demo/crm_lead.xml',
'demo/stock_lot.xml',
'demo/x_run_time_meter.xml',
'demo/sale_order.xml',
'demo/sale_order_line.xml',
'demo/sale_order_confirm.xml',
'demo/stock_quant.xml',
'demo/stock_move_line.xml',
'demo/stock_picking.xml',
'demo/quality_check.xml',
],
'license': 'OPL-1',
'cloc_exclude': [
'data/knowledge_article.xml',
],
'images': ['images/main.png'],
}
29 changes: 29 additions & 0 deletions machine_tool_rental/data/base_automation.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?xml version='1.0' encoding='UTF-8'?>
<odoo>
<record id="on_run_time_edit" model="base.automation">
<field name="model_id" ref="x_run_time_meter_model"/>
<field name="action_server_ids" eval="[(6, 0, [ref('compute_run_time_increment')])]"/>
<field name="trigger">on_create_or_write</field>
<field name="name">On Run-Time edit</field>
<field name="trigger_field_ids" eval="[(6, 0, [ref('x_run_time_meter_model_x_date_field'), ref('x_run_time_meter_model_x_run_time_field'), ref('x_run_time_meter_model_x_serial_field')])]"/>
</record>
<record id="set_task_run_time_meter" model="base.automation">
<field name="model_id" ref="project.model_project_task"/>
<field name="action_server_ids" eval="[(6, 0, [ref('run_time_meter_when_done')])]"/>
<field name="trigger">on_state_set</field>
<field name="trg_selection_field_id" ref="project.selection__project_task__state__1_done"/>
<field name="filter_domain">[('state', '=', '1_done')]</field>
<field name="name">Set task run time meter when done</field>
<field name="trigger_field_ids" eval="[(6, 0, [ref('project.field_project_task__state')])]"/>
</record>
<record id="create_task_on_maintenance_move" model="base.automation">
<field name="model_id" ref="stock.model_stock_move"/>
<field name="action_server_ids" eval="[(6, 0, [ref('create_maintnance_task')])]"/>
<field name="trigger">on_state_set</field>
<field name="trg_selection_field_id" ref="stock.selection__stock_move__state__done"/>
<field name="filter_domain" eval="[('state', '=', 'done'), ('location_dest_id', '=', ref('stock_location_18'))]"/>
<field name="filter_pre_domain" eval="[('location_id', '=', ref('stock.stock_location_company'))]"/>
<field name="name">Create task on maintenance move</field>
<field name="trigger_field_ids" eval="[(6, 0, [ref('stock.field_stock_move__state')])]"/>
</record>
</odoo>
48 changes: 48 additions & 0 deletions machine_tool_rental/data/crm_tag.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
<?xml version='1.0' encoding='UTF-8'?>
<odoo noupdate="1">
<record id="crm_tag_384" model="crm.tag">
<field name="name">long-term</field>
</record>
<record id="crm_tag_385" model="crm.tag">
<field name="name">planning</field>
</record>
<record id="crm_tag_386" model="crm.tag">
<field name="name">delivery</field>
</record>
<record id="crm_tag_387" model="crm.tag">
<field name="name">urgent</field>
</record>
<record id="crm_tag_388" model="crm.tag">
<field name="name">jack hammer</field>
</record>
<record id="crm_tag_389" model="crm.tag">
<field name="name">rush</field>
</record>
<record id="crm_tag_392" model="crm.tag">
<field name="name">monthly-contract</field>
</record>
<record id="crm_tag_393" model="crm.tag">
<field name="name">recurring</field>
</record>
<record id="crm_tag_395" model="crm.tag">
<field name="name">forklift</field>
</record>
<record id="crm_tag_396" model="crm.tag">
<field name="name">quality-check</field>
</record>
<record id="crm_tag_397" model="crm.tag">
<field name="name">serial-tracking</field>
</record>
<record id="crm_tag_398" model="crm.tag">
<field name="name"> maintenance</field>
</record>
<record id="crm_tag_401" model="crm.tag">
<field name="name">safety</field>
</record>
<record id="crm_tag_403" model="crm.tag">
<field name="name">last-minute</field>
</record>
<record id="crm_tag_405" model="crm.tag">
<field name="name">project-manager</field>
</record>
</odoo>
37 changes: 37 additions & 0 deletions machine_tool_rental/data/ir_actions_act_window.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<?xml version='1.0' encoding='UTF-8'?>
<odoo>
<record id="run_time_meter_act_window" model="ir.actions.act_window">
<field name="name">Run-Time Meter</field>
<field name="res_model">x_run_time_meter</field>
<field name="view_mode">graph,list,form</field>
</record>
<record id="run_time_meters_serial_act_window" model="ir.actions.act_window">
<field name="context">{'search_default_x_serial': active_id,'default_x_serial': active_id}</field>
<field name="domain">[('x_serial', '=', active_id)]</field>
<field name="name">Run-Time Meters</field>
<field name="res_model">x_run_time_meter</field>
<field name="view_mode">graph,list,form</field>
</record>
<record id="recurring_maintenance_rules_act_window" model="ir.actions.act_window">
<field name="name">Recurring Maintenance Rules</field>
<field name="res_model">x_recurring_maintenance_rules</field>
</record>
<record id="project_maintenance_act_window" model="ir.actions.act_window">
<field name="context">{'search_default_x_serial': active_id,'default_x_serial': active_id}</field>
<field name="domain">[('x_serial', '=', active_id)]</field>
<field name="name">Maintenance</field>
<field name="res_model">project.task</field>
</record>
<record id="to_invoice_act_window" model="ir.actions.act_window">
<field name="name">To Invoice</field>
<field name="res_model">sale.order</field>
<field name="context">{'search_default_partner_id': active_id,'default_partner_id': active_id}</field>
<field name="domain">[('partner_id', '=', active_id)]</field>
</record>
<record id="product_recurring_maintenance_rules_act_window" model="ir.actions.act_window">
<field name="context">{'search_default_x_product': active_id,'default_x_product': active_id}</field>
<field name="domain">[('x_product', '=', active_id)]</field>
<field name="name">Recurring Maintenance Rules</field>
<field name="res_model">x_recurring_maintenance_rules</field>
</record>
</odoo>
145 changes: 145 additions & 0 deletions machine_tool_rental/data/ir_actions_server.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
<?xml version='1.0' encoding='UTF-8'?>
<odoo>
<record id="compute_run_time_increment" model="ir.actions.server">
<field name="code"><![CDATA[
rtms = env['x_run_time_meter'].search([('id', 'in', record.x_serial.x_run_time_meters.ids)], order='x_date')
previous_rtm = False
for rtm in rtms:
rtm['x_run_time_increment_h'] = rtm['x_run_time'] - previous_rtm['x_run_time'] if previous_rtm else 0
previous_rtm = rtm
]]></field>
<field name="model_id" ref="x_run_time_meter_model"/>
<field name="state">code</field>
<field name="name">Compute Run-Time Increment</field>
<field name="usage">base_automation</field>
</record>
<record id="record_run_time_meter" model="ir.actions.server">
<field name="binding_model_id" ref="sale.model_sale_order"/>
<field name="code"><![CDATA[
action = {
'type': 'ir.actions.act_window',
'name': 'Record Run-Time Meter',
'res_model': 'x_run_time_meter',
'view_mode': 'form',
'target': 'new',
}
]]></field>
<field name="model_id" ref="sale.model_sale_order"/>
<field name="state">code</field>
<field name="name">Record Run-Time Meter</field>
</record>
<record id="run_time_meter_when_done" model="ir.actions.server">
<field name="code"><![CDATA[
for task in records: task['x_run_time_meter_when_done'] = task.x_serial.x_run_time_meter_h
]]></field>
<field name="model_id" ref="project.model_project_task"/>
<field name="state">code</field>
<field name="name">Run-Time Meter When Done</field>
<field name="usage">base_automation</field>
</record>
<record id="create_maintenance_tasks_server_action" model="ir.actions.server">
<field name="name">Create Maintenance Tasks Based On Recurring Maintenance Rules</field>
<field name="model_id" ref="stock.model_stock_lot"/>
<field name="state">code</field>
<field name="usage">ir_cron</field>
<field name="code"><![CDATA[
for maintenance_rule in env['x_recurring_maintenance_rules'].search([('x_active', '=', True)]):
for serial in maintenance_rule.x_product.x_serial_ids:
tasks = env['project.task'].search([('is_fsm', '=', True), ('x_serial', '=', serial.id), ('x_recurring_maintenance_rule', '=', maintenance_rule.id)])
last_maintenance = max(tasks.filtered(lambda t: t.state == '1_done').mapped('x_run_time_meter_when_done'), default=0.0)
on_maintenance = len(tasks.filtered(lambda t: t.state not in ['1_done', '1_canceled'])) > 0
if not on_maintenance and serial.x_run_time_meter_h - last_maintenance >= maintenance_rule.x_run_time_increment_h:
project_task = env['project.task'].create({
'name': '[Recurrent Maintenance] ' + serial.name,
'x_serial': serial.id,
'partner_id': env.ref('base.main_company').id,
'under_warranty': True,
'x_maintenance': True,
'x_recurring_maintenance_rule': maintenance_rule.id,
'is_fsm': True,
'project_id': env.ref('industry_fsm.fsm_project').id,
})
]]></field>
</record>
<record id="create_maintenance_tasks_cron" model="ir.cron">
<field name="interval_type">days</field>
<field name="interval_number">1</field>
<field name="state">code</field>
<field name="ir_actions_server_id" ref="create_maintenance_tasks_server_action"/>
</record>
<record id="consolidated_down_payment_server_action" model="ir.actions.server">
<field name="code"><![CDATA[
for partner in records:
invoice = False
for so in partner.sale_order_ids.filtered(lambda so: so.invoice_status == 'to invoice'):
last_date = (so.x_last_invoice or so.rental_start_date.date())
next_date = min(so.rental_return_date, datetime.datetime.today()).date()
if (next_date - last_date).days == 0: continue
ratio = (next_date - last_date).days / so.duration_days
if not invoice:
invoice = env['account.move'].create({
'move_type': 'out_invoice',
'partner_id': partner.id,
})
env['account.move.line'].create({
'move_id': invoice.id,
'display_type': 'line_section',
'name': '[' + so.display_name + last_date.strftime('] %d/%m/%y - ') + next_date.strftime('%d/%m/%y'),
})
for sol in so.order_line.filtered(lambda sol: sol.product_id):
env['account.move.line'].create({
'move_id': invoice.id,
'name': sol.product_id.name,
'price_unit': ratio * sol.price_unit,
'quantity': sol.product_uom_qty,
'tax_ids': sol.tax_ids,
})
if len(so.invoice_ids) == 0:
env['sale.order.line'].create({
'order_id': so.id,
'display_type': 'line_section',
'name': 'Down Payments',
'product_updatable': True,
})
so['x_last_invoice'] = next_date
env['sale.order.line'].create({
'order_id': so.id,
'name': next_date.strftime('Down Payment: %d/%m/%y'),
'price_unit': ratio * so.amount_total,
'product_uom_qty': 0,
})
if next_date >= so.rental_return_date.date():
so['invoice_status'] = 'invoiced'
if invoice:
action = env['ir.actions.act_window']._for_xml_id('account.action_move_out_invoice_type')
action['views'] = [(env.ref('account.view_out_invoice_tree').id, 'list'), (env.ref('account.view_move_form').id, 'form')]
action['res_id'] = invoice.id
else: action = {
"type": "ir.actions.client",
"tag": "display_notification",
"params": {"title": "Error", "message": "Nothing to invoice.", "type": "warning"},
}
]]></field>
<field name="model_id" ref="base.model_res_partner"/>
<field name="state">code</field>
<field name="name">Consolidated Down Payment</field>
</record>
<record id="create_maintnance_task" model="ir.actions.server">
<field name="model_id" ref="stock.model_stock_move"/>
<field name="state">code</field>
<field name="name">Create Maintenance Task</field>
<field name="usage">base_automation</field>
<field name="code"><![CDATA[
for record in records.filtered(lambda r: r.picking_id.quality_check_fail):
for lot in record.move_line_ids.mapped('lot_id'):
project_task = env['project.task'].create({
'name': '[Maintenance] ' + lot.name,
'x_serial': lot.id,
'partner_id': record.picking_id.partner_id.id,
'under_warranty': True,
'is_fsm': True,
'project_id': env.ref('industry_fsm.fsm_project').id,
})
]]></field>
</record>
</odoo>
23 changes: 23 additions & 0 deletions machine_tool_rental/data/ir_default.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?xml version='1.0' encoding='UTF-8'?>
<odoo noupdate="1">
<record id="x_run_time_meter_model_x_active_field_default_value" model="ir.default">
<field name="field_id" ref="x_run_time_meter_model_x_active_field"/>
<field name="json_value">true</field>
</record>
<record id="x_run_time_meter_model_x_sequence_field_default_value" model="ir.default">
<field name="field_id" ref="x_run_time_meter_model_x_sequence_field"/>
<field name="json_value">10</field>
</record>
<record id="x_run_time_meter_model_x_date_field_default_value" model="ir.default">
<field name="field_id" ref="x_run_time_meter_model_x_date_field"/>
<field name="json_value">"2025-07-16"</field>
</record>
<record id="x_recurring_maintenance_rules_model_x_active_field_default_value" model="ir.default">
<field name="field_id" ref="x_recurring_maintenance_rules_model_x_active_field"/>
<field name="json_value">true</field>
</record>
<record id="x_recurring_maintenance_rules_model_x_sequence_field_default_value" model="ir.default">
<field name="field_id" ref="x_recurring_maintenance_rules_model_x_sequence_field"/>
<field name="json_value">10</field>
</record>
</odoo>
13 changes: 13 additions & 0 deletions machine_tool_rental/data/ir_model.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?xml version='1.0' encoding='UTF-8'?>
<odoo>
<record id="x_run_time_meter_model" model="ir.model">
<field name="model">x_run_time_meter</field>
<field name="name">Run-Time Meter</field>
</record>
<record id="x_recurring_maintenance_rules_model" model="ir.model">
<field name="is_mail_thread" eval="True"/>
<field name="is_mail_activity" eval="True"/>
<field name="model">x_recurring_maintenance_rules</field>
<field name="name">Recurring Maintenance Rules</field>
</record>
</odoo>
Loading