| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/vertical-rental |
| GIT | |
| GIT | https://github.com/OCA/vertical-rental.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/vertical-rental/tree/16.0/sale_rental |
| VERSION | |
| VERSION | 1.0.4 |
| CATEGORY | |
| CATEGORY | Sales |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Odoo Community Association (OCA), Akretion, Sodexis |
| MAINTAINERS | |
| MAINTAINERS | Odoo Community Association (OCA), Akretion, Sodexis |
| COMMITTERS | |
| COMMITTERS | Weblate, OCA-git-bot, oca-ci, pwitte, chaule97 |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/vertical-rental |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 00:54:00 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
OCA/account-closing: - account_invoice_start_end_dates OCA/sale-workflow: - sale_start_end_dates odoo/odoo: - account - base_setup - base - web - product - bus - web_tour - uom - analytic - portal - web_editor - http_routing - auth_signup - digest - resource - sale - sales_team - account_payment - payment - utm - sale_stock - stock_account - stock - barcodes_gs1_nomenclature - barcodes |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
create_rental_product_form |
rental.product.product.form | create.rental.product | form | New |
product_normal_form_view |
rental.product.product.form | product.product | group | Inherits product.product_normal_form_view |
product_template_only_form_view |
rental.product.template.only.form | product.template | group | Inherits product.product_template_only_form_view |
res_config_settings_view_form_sale_rental |
res.config.settings.view.form.inherit.sale.stock.sale | res.config.settings | xpath | Inherits sale.res_config_settings_view_form |
sale_rental_calendar |
sale.rental.calendar | sale.rental | calendar | New |
sale_rental_form |
sale.rental.form | sale.rental | form | New |
sale_rental_graph |
sale.rental.graph | sale.rental | graph | New |
sale_rental_pivot |
sale.rental.pivot | sale.rental | pivot | New |
sale_rental_search |
sale.rental.search | sale.rental | search | New |
sale_rental_tree |
sale.rental.tree | sale.rental | tree | New |
view_order_form |
sale_rental.view_order_form | sale.order | xpath | Inherits sale_start_end_dates.view_order_form |
view_warehouse |
rental.stock.warehouse.form | stock.warehouse | field | Inherits stock.view_warehouse |
categ_id
Many2one → product.category
required=True
string='Product Category'
args: 'product.category'
copy_image
Boolean
string='Copy Product Image'
default_code
Char
hw_product_id
Many2one → product.product
readonly=True
required=True
string='Product to Rent'
args: 'product.product'
name
Char
required=True
string='Rental Service Name'
sale_price_per_day
Float
default=1.0
digits='Product Price'
required=True
string='Rental Price per Day'
create_rental_product(self)
default_get(self, fields_list)
rental_service_ids
One2many → product.product
string='Related Rental Services'
args: 'product.product', 'rented_product_id'
rented_product_id
Many2one → product.product
domain=[('type', 'in', ('product', 'consu'))]
string='Related Rented Product'
args: 'product.product'
No public methods.
rental_service_tmpl_ids
One2many → product.template
string='Rental Services'
args: 'product.template', 'rented_product_tmpl_id'
rented_product_tmpl_id
Many2one → product.template
compute='_compute_rented_product_tmpl_id'
inverse='_inverse_rented_product_tmpl_id'
store=True
string='Rented Product'
args: 'product.template'
No public methods.
reminder_days
Integer
config_parameter='sale_rental.reminder_days'
default=3.0
string='Rental Reminder Days'
send_return_reminder
Boolean
config_parameter='sale_rental.send_return_reminder'
string='Send Return Reminders'
No public methods.
No new fields.
Public methods (1)action_cancel(self)
can_sell_rental
Boolean
string='Can Sell from Rental'
extension_rental_id
Many2one → sale.rental
check_company=True
readonly=True
states={'draft': [('readonly', False)]}
string='Rental to Extend'
args: 'sale.rental'
rental
Boolean
default=False
rental_qty
Float
digits='Product Unit of Measure'
help='Indicate the number of items that will be rented.'
readonly=True
states={'draft': [('readonly', False)]}
string='Rental Quantity'
rental_type
Selection
readonly=True
states={'draft': [('readonly', False)]}
args: [('new_rental', 'New Rental'), ('rental_extension', 'Rental Extension')]
sell_rental_id
Many2one → sale.rental
check_company=True
readonly=True
states={'draft': [('readonly', False)]}
string='Rental to Sell'
args: 'sale.rental'
extension_rental_id_change(self)
rental_product_id_change(self)
rental_qty_number_of_days_change(self)
rental_type_change(self)
sell_rental_id_change(self)
company_id
Many2one → res.company
readonly=True
related='start_order_line_id.company_id'
store=True
string='Company'
args: 'res.company'
end_date
Date
compute='_compute_end_date'
help='End Date of the Rental (extensions included), taking into account all the extensions sold to the customer.'
store=True
extension_order_line_ids
One2many → sale.order.line
readonly=True
string='Rental Extensions'
args: 'sale.order.line', 'extension_rental_id'
in_move_id
Many2one → stock.move
compute='_compute_move_and_state'
readonly=True
store=True
string='Incoming Move'
args: 'stock.move'
in_picking_id
Many2one → stock.picking
readonly=True
related='in_move_id.picking_id'
string='Receipt'
args: 'stock.picking'
in_state
Selection
readonly=True
related='in_move_id.state'
string='In Move State'
out_move_id
Many2one → stock.move
compute='_compute_move_and_state'
readonly=True
store=True
string='Outgoing Move'
args: 'stock.move'
out_picking_id
Many2one → stock.picking
readonly=True
related='out_move_id.picking_id'
string='Delivery Order'
args: 'stock.picking'
out_state
Selection
readonly=True
related='out_move_id.state'
string='Out Move State'
partner_id
Many2one → res.partner
readonly=True
related='start_order_line_id.order_id.partner_id'
store=True
string='Customer'
args: 'res.partner'
rental_product_id
Many2one → product.product
readonly=True
related='start_order_line_id.product_id'
store=True
string='Rental Service'
args: 'product.product'
rental_qty
Float
readonly=True
related='start_order_line_id.rental_qty'
store=True
rented_product_id
Many2one → product.product
readonly=True
related='start_order_line_id.product_id.rented_product_id'
store=True
string='Rented Product'
args: 'product.product'
sell_move_id
Many2one → stock.move
compute='_compute_move_and_state'
readonly=True
store=True
string='Selling Move'
args: 'stock.move'
sell_order_line_ids
One2many → sale.order.line
readonly=True
string='Sell Rented Product'
args: 'sale.order.line', 'sell_rental_id'
sell_picking_id
Many2one → stock.picking
readonly=True
related='sell_move_id.picking_id'
string='Sell Delivery Order'
args: 'stock.picking'
sell_state
Selection
readonly=True
related='sell_move_id.state'
string='Sell Move State'
start_date
Date
readonly=True
related='start_order_line_id.start_date'
store=True
start_order_id
Many2one → sale.order
readonly=True
related='start_order_line_id.order_id'
store=True
string='Rental SO'
args: 'sale.order'
start_order_line_id
Many2one → sale.order.line
readonly=True
string='Rental SO Line'
args: 'sale.order.line'
state
Selection
compute='_compute_move_and_state'
readonly=True
store=True
args: [('ordered', 'Ordered'), ('out', 'Out'), ('sell_progress', 'Sell in progress'), ('sold', 'Sold'), ('in', 'Back In'), ('cancel', 'Cancelled')]
cron_send_return_reminders(self)
name_get(self)
No new fields.
Public methods (1)create_demo_and_validate(self)
No new fields.
Public methods (0)No public methods.
rental_allowed
Boolean
rental_in_location_id
Many2one → stock.location
check_company=True
domain="[('usage', '=', 'internal'), ('company_id', '=', company_id)]"
args: 'stock.location', 'Rental In'
rental_out_location_id
Many2one → stock.location
check_company=True
domain="[('usage', '=', 'internal'), ('company_id', '=', company_id)]"
args: 'stock.location', 'Rental Out'
rental_route_id
Many2one → stock.route
string='Rental Route'
args: 'stock.route'
rental_view_location_id
Many2one → stock.location
check_company=True
domain="[('usage', '=', 'view'), ('company_id', '=', company_id)]"
args: 'stock.location', 'Parent Rental'
sell_rented_product_route_id
Many2one → stock.route
string='Sell Rented Product Route'
args: 'stock.route'
write(self, vals)
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/sale-workflow |
| GIT | |
| GIT | https://github.com/OCA/sale-workflow.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/sale-workflow/tree/15.0/sale_rental |
| VERSION | |
| VERSION | 1.0.2 |
| CATEGORY | |
| CATEGORY | Sales |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Odoo Community Association (OCA), Akretion, Sodexis |
| MAINTAINERS | |
| MAINTAINERS | Odoo Community Association (OCA), Akretion, Sodexis |
| COMMITTERS | |
| COMMITTERS | Pedro M. Baeza, Kiril Vangelovski, OCA Transbot, Weblate, OCA-git-bot, oca-ci |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/sale-workflow |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 00:46:33 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
OCA/account-closing: - account_invoice_start_end_dates OCA/sale-workflow: - sale_start_end_dates odoo/odoo: - account - base_setup - base - web - product - bus - web_tour - uom - analytic - portal - web_editor - http_routing - auth_signup - digest - resource - sale - sales_team - payment - utm - sale_stock - stock_account - stock - barcodes |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
create_rental_product_form |
rental.product.product.form | create.rental.product | form | New |
product_normal_form_view |
rental.product.product.form | product.product | group | Inherits product.product_normal_form_view |
product_template_only_form_view |
rental.product.template.only.form | product.template | group | Inherits product.product_template_only_form_view |
sale_rental_form |
sale.rental.form | sale.rental | form | New |
sale_rental_pivot |
sale.rental.pivot | sale.rental | pivot | New |
sale_rental_search |
sale.rental.search | sale.rental | search | New |
sale_rental_tree |
sale.rental.tree | sale.rental | tree | New |
view_order_form |
sale_rental.view_order_form | sale.order | xpath | Inherits sale_start_end_dates.view_order_form |
view_warehouse |
rental.stock.warehouse.form | stock.warehouse | field | Inherits stock.view_warehouse |
categ_id
Many2one → product.category
required=True
string='Product Category'
args: 'product.category'
copy_image
Boolean
string='Copy Product Image'
default_code
Char
hw_product_id
Many2one → product.product
readonly=True
required=True
string='Product to Rent'
args: 'product.product'
name
Char
required=True
string='Rental Service Name'
sale_price_per_day
Float
default=1.0
digits='Product Price'
required=True
string='Rental Price per Day'
create_rental_product(self)
default_get(self, fields_list)
rental_service_ids
One2many → product.product
string='Related Rental Services'
args: 'product.product', 'rented_product_id'
rented_product_id
Many2one → product.product
domain=[('type', 'in', ('product', 'consu'))]
string='Related Rented Product'
args: 'product.product'
No public methods.
rental_service_tmpl_ids
One2many → product.template
string='Rental Services'
args: 'product.template', 'rented_product_tmpl_id'
rented_product_tmpl_id
Many2one → product.template
compute='_compute_rented_product_tmpl_id'
inverse='_inverse_rented_product_tmpl_id'
store=True
string='Rented Product'
args: 'product.template'
No public methods.
No new fields.
Public methods (1)action_cancel(self)
can_sell_rental
Boolean
string='Can Sell from Rental'
extension_rental_id
Many2one → sale.rental
check_company=True
readonly=True
states={'draft': [('readonly', False)]}
string='Rental to Extend'
args: 'sale.rental'
rental
Boolean
default=False
rental_qty
Float
digits='Product Unit of Measure'
help='Indicate the number of items that will be rented.'
readonly=True
states={'draft': [('readonly', False)]}
string='Rental Quantity'
rental_type
Selection
readonly=True
states={'draft': [('readonly', False)]}
args: [('new_rental', 'New Rental'), ('rental_extension', 'Rental Extension')]
sell_rental_id
Many2one → sale.rental
check_company=True
readonly=True
states={'draft': [('readonly', False)]}
string='Rental to Sell'
args: 'sale.rental'
extension_rental_id_change(self)
rental_product_id_change(self)
rental_qty_number_of_days_change(self)
rental_type_change(self)
sell_rental_id_change(self)
company_id
Many2one → res.company
readonly=True
related='start_order_line_id.company_id'
store=True
string='Company'
args: 'res.company'
end_date
Date
compute='_compute_end_date'
help='End Date of the Rental (extensions included), taking into account all the extensions sold to the customer.'
store=True
extension_order_line_ids
One2many → sale.order.line
readonly=True
string='Rental Extensions'
args: 'sale.order.line', 'extension_rental_id'
in_move_id
Many2one → stock.move
compute='_compute_move_and_state'
readonly=True
store=True
string='Incoming Move'
args: 'stock.move'
in_picking_id
Many2one → stock.picking
readonly=True
related='in_move_id.picking_id'
string='Receipt'
args: 'stock.picking'
in_state
Selection
readonly=True
related='in_move_id.state'
string='In Move State'
out_move_id
Many2one → stock.move
compute='_compute_move_and_state'
readonly=True
store=True
string='Outgoing Move'
args: 'stock.move'
out_picking_id
Many2one → stock.picking
readonly=True
related='out_move_id.picking_id'
string='Delivery Order'
args: 'stock.picking'
out_state
Selection
readonly=True
related='out_move_id.state'
string='Out Move State'
partner_id
Many2one → res.partner
readonly=True
related='start_order_line_id.order_id.partner_id'
store=True
string='Customer'
args: 'res.partner'
rental_product_id
Many2one → product.product
readonly=True
related='start_order_line_id.product_id'
store=True
string='Rental Service'
args: 'product.product'
rental_qty
Float
readonly=True
related='start_order_line_id.rental_qty'
store=True
rented_product_id
Many2one → product.product
readonly=True
related='start_order_line_id.product_id.rented_product_id'
store=True
string='Rented Product'
args: 'product.product'
sell_move_id
Many2one → stock.move
compute='_compute_move_and_state'
readonly=True
store=True
string='Selling Move'
args: 'stock.move'
sell_order_line_ids
One2many → sale.order.line
readonly=True
string='Sell Rented Product'
args: 'sale.order.line', 'sell_rental_id'
sell_picking_id
Many2one → stock.picking
readonly=True
related='sell_move_id.picking_id'
string='Sell Delivery Order'
args: 'stock.picking'
sell_state
Selection
readonly=True
related='sell_move_id.state'
string='Sell Move State'
start_date
Date
readonly=True
related='start_order_line_id.start_date'
store=True
start_order_id
Many2one → sale.order
readonly=True
related='start_order_line_id.order_id'
store=True
string='Rental SO'
args: 'sale.order'
start_order_line_id
Many2one → sale.order.line
readonly=True
string='Rental SO Line'
args: 'sale.order.line'
state
Selection
compute='_compute_move_and_state'
readonly=True
store=True
args: [('ordered', 'Ordered'), ('out', 'Out'), ('sell_progress', 'Sell in progress'), ('sold', 'Sold'), ('in', 'Back In'), ('cancel', 'Cancelled')]
name_get(self)
No new fields.
Public methods (1)create_demo_and_validate(self)
No new fields.
Public methods (0)No public methods.
rental_allowed
Boolean
rental_in_location_id
Many2one → stock.location
check_company=True
domain="[('usage', '=', 'internal'), ('company_id', '=', company_id)]"
args: 'stock.location', 'Rental In'
rental_out_location_id
Many2one → stock.location
check_company=True
domain="[('usage', '=', 'internal'), ('company_id', '=', company_id)]"
args: 'stock.location', 'Rental Out'
rental_route_id
Many2one → stock.location.route
string='Rental Route'
args: 'stock.location.route'
rental_view_location_id
Many2one → stock.location
check_company=True
domain="[('usage', '=', 'view'), ('company_id', '=', company_id)]"
args: 'stock.location', 'Parent Rental'
sell_rented_product_route_id
Many2one → stock.location.route
string='Sell Rented Product Route'
args: 'stock.location.route'
write(self, vals)
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/sale-workflow |
| GIT | |
| GIT | https://github.com/OCA/sale-workflow.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/sale-workflow/tree/14.0/sale_rental |
| VERSION | |
| VERSION | 1.0.1 |
| CATEGORY | |
| CATEGORY | Sales |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Odoo Community Association (OCA), Akretion, Sodexis |
| MAINTAINERS | |
| MAINTAINERS | Odoo Community Association (OCA), Akretion, Sodexis |
| COMMITTERS | |
| COMMITTERS | Alexis de Lattre, OCA Transbot, oca-travis, Weblate, OCA-git-bot, oca-ci, Alessandro Uffreduzzi |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/sale-workflow |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 00:40:58 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
OCA/account-closing: - account_invoice_start_end_dates OCA/sale-workflow: - sale_start_end_dates odoo/odoo: - account - base_setup - base - web - product - bus - web_tour - uom - analytic - portal - web_editor - http_routing - auth_signup - digest - resource - sale - sales_team - payment - utm - sale_stock - stock_account - stock - barcodes |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
create_rental_product_form |
rental.product.product.form | create.rental.product | form | New |
product_normal_form_view |
rental.product.product.form | product.product | group | Inherits product.product_normal_form_view |
product_template_only_form_view |
rental.product.template.only.form | product.template | group | Inherits product.product_template_only_form_view |
sale_rental_form |
sale.rental.form | sale.rental | form | New |
sale_rental_pivot |
sale.rental.pivot | sale.rental | pivot | New |
sale_rental_search |
sale.rental.search | sale.rental | search | New |
sale_rental_tree |
sale.rental.tree | sale.rental | tree | New |
view_order_form |
sale_rental.view_order_form | sale.order | xpath | Inherits sale_start_end_dates.view_order_form |
view_warehouse |
rental.stock.warehouse.form | stock.warehouse | field | Inherits stock.view_warehouse |
categ_id
Many2one → product.category
required=True
string='Product Category'
args: 'product.category'
copy_image
Boolean
string='Copy Product Image'
default_code
Char
string='Default Code'
hw_product_id
Many2one → product.product
readonly=True
required=True
string='Product to Rent'
args: 'product.product'
name
Char
required=True
string='Rental Service Name'
sale_price_per_day
Float
default=1.0
digits='Product Price'
required=True
string='Rental Price per Day'
create_rental_product(self)
default_get(self, fields_list)
rental_service_ids
One2many → product.product
string='Related Rental Services'
args: 'product.product', 'rented_product_id'
rented_product_id
Many2one → product.product
domain=[('type', 'in', ('product', 'consu'))]
string='Related Rented Product'
args: 'product.product'
No public methods.
rental_service_tmpl_ids
One2many → product.template
string='Rental Services'
args: 'product.template', 'rented_product_tmpl_id'
rented_product_tmpl_id
Many2one → product.template
compute='_compute_rented_product_tmpl_id'
inverse='_inverse_rented_product_tmpl_id'
store=True
string='Rented Product'
args: 'product.template'
No public methods.
No new fields.
Public methods (1)action_cancel(self)
can_sell_rental
Boolean
string='Can Sell from Rental'
extension_rental_id
Many2one → sale.rental
check_company=True
readonly=True
states={'draft': [('readonly', False)]}
string='Rental to Extend'
args: 'sale.rental'
rental
Boolean
default=False
string='Rental'
rental_qty
Float
digits='Product Unit of Measure'
help='Indicate the number of items that will be rented.'
readonly=True
states={'draft': [('readonly', False)]}
string='Rental Quantity'
rental_type
Selection
readonly=True
states={'draft': [('readonly', False)]}
string='Rental Type'
args: [('new_rental', 'New Rental'), ('rental_extension', 'Rental Extension')]
sell_rental_id
Many2one → sale.rental
check_company=True
readonly=True
states={'draft': [('readonly', False)]}
string='Rental to Sell'
args: 'sale.rental'
extension_rental_id_change(self)
rental_product_id_change(self)
rental_qty_number_of_days_change(self)
rental_type_change(self)
sell_rental_id_change(self)
company_id
Many2one → res.company
readonly=True
related='start_order_line_id.company_id'
store=True
string='Company'
args: 'res.company'
end_date
Date
compute='_compute_end_date'
help='End Date of the Rental (extensions included), taking into account all the extensions sold to the customer.'
store=True
string='End Date'
extension_order_line_ids
One2many → sale.order.line
readonly=True
string='Rental Extensions'
args: 'sale.order.line', 'extension_rental_id'
in_move_id
Many2one → stock.move
compute='_compute_move_and_state'
readonly=True
store=True
string='Incoming Move'
args: 'stock.move'
in_picking_id
Many2one → stock.picking
readonly=True
related='in_move_id.picking_id'
string='Receipt'
args: 'stock.picking'
in_state
Selection
readonly=True
related='in_move_id.state'
string='In Move State'
out_move_id
Many2one → stock.move
compute='_compute_move_and_state'
readonly=True
store=True
string='Outgoing Move'
args: 'stock.move'
out_picking_id
Many2one → stock.picking
readonly=True
related='out_move_id.picking_id'
string='Delivery Order'
args: 'stock.picking'
out_state
Selection
readonly=True
related='out_move_id.state'
string='Out Move State'
partner_id
Many2one → res.partner
readonly=True
related='start_order_line_id.order_id.partner_id'
store=True
string='Customer'
args: 'res.partner'
rental_product_id
Many2one → product.product
readonly=True
related='start_order_line_id.product_id'
store=True
string='Rental Service'
args: 'product.product'
rental_qty
Float
readonly=True
related='start_order_line_id.rental_qty'
store=True
rented_product_id
Many2one → product.product
readonly=True
related='start_order_line_id.product_id.rented_product_id'
store=True
string='Rented Product'
args: 'product.product'
sell_move_id
Many2one → stock.move
compute='_compute_move_and_state'
readonly=True
store=True
string='Selling Move'
args: 'stock.move'
sell_order_line_ids
One2many → sale.order.line
readonly=True
string='Sell Rented Product'
args: 'sale.order.line', 'sell_rental_id'
sell_picking_id
Many2one → stock.picking
readonly=True
related='sell_move_id.picking_id'
string='Sell Delivery Order'
args: 'stock.picking'
sell_state
Selection
readonly=True
related='sell_move_id.state'
string='Sell Move State'
start_date
Date
readonly=True
related='start_order_line_id.start_date'
store=True
start_order_id
Many2one → sale.order
readonly=True
related='start_order_line_id.order_id'
store=True
string='Rental SO'
args: 'sale.order'
start_order_line_id
Many2one → sale.order.line
readonly=True
string='Rental SO Line'
args: 'sale.order.line'
state
Selection
compute='_compute_move_and_state'
readonly=True
store=True
string='State'
args: [('ordered', 'Ordered'), ('out', 'Out'), ('sell_progress', 'Sell in progress'), ('sold', 'Sold'), ('in', 'Back In'), ('cancel', 'Cancelled')]
name_get(self)
No new fields.
Public methods (1)create_demo_and_validate(self)
No new fields.
Public methods (0)No public methods.
rental_allowed
Boolean
rental_in_location_id
Many2one → stock.location
check_company=True
domain="[('usage', '=', 'internal'), ('company_id', '=', company_id)]"
args: 'stock.location', 'Rental In'
rental_out_location_id
Many2one → stock.location
check_company=True
domain="[('usage', '=', 'internal'), ('company_id', '=', company_id)]"
args: 'stock.location', 'Rental Out'
rental_route_id
Many2one → stock.location.route
string='Rental Route'
args: 'stock.location.route'
rental_view_location_id
Many2one → stock.location
check_company=True
domain="[('usage', '=', 'view'), ('company_id', '=', company_id)]"
args: 'stock.location', 'Parent Rental'
sell_rented_product_route_id
Many2one → stock.location.route
string='Sell Rented Product Route'
args: 'stock.location.route'
write(self, vals)
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/sale-workflow |
| GIT | |
| GIT | https://github.com/OCA/sale-workflow.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/sale-workflow/tree/12.0/sale_rental |
| VERSION | |
| VERSION | 1.1.1 |
| CATEGORY | |
| CATEGORY | Sales |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Odoo Community Association (OCA), Akretion, Sodexis |
| MAINTAINERS | |
| MAINTAINERS | Odoo Community Association (OCA), Akretion, Sodexis |
| COMMITTERS | |
| COMMITTERS | Alexandre Fayolle, eLBati, OCA Transbot, oca-travis, Weblate, OCA-git-bot, Yu Weng |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/sale-workflow |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 00:29:17 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
OCA/account-closing: - account_invoice_start_end_dates OCA/sale-workflow: - sale_start_end_dates odoo/odoo: - account - base_setup - base - web - product - decimal_precision - bus - web_tour - uom - analytic - portal - http_routing - digest - sale - sales_team - payment - sale_stock - stock_account - stock - barcodes |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
create_rental_product_form |
rental.product.product.form | create.rental.product | form | New |
product_normal_form_view |
rental.product.product.form | product.product | group | Inherits product.product_normal_form_view |
sale_rental_form |
sale.rental.form | sale.rental | form | New |
sale_rental_pivot |
sale.rental.pivot | sale.rental | pivot | New |
sale_rental_search |
sale.rental.search | sale.rental | search | New |
sale_rental_tree |
sale.rental.tree | sale.rental | tree | New |
view_order_form |
sale_rental.view_order_form | sale.order | xpath | Inherits sale_start_end_dates.view_order_form |
view_warehouse |
rental.stock.warehouse.form | stock.warehouse | field | Inherits stock.view_warehouse |
categ_id
Many2one → product.category
required=True
string='Product Category'
args: 'product.category'
copy_image
Boolean
string='Copy Product Image'
default_code
Char
size=16
string='Default Code'
hw_product_id
Many2one → product.product
readonly=True
required=True
string='Product to Rent'
args: 'product.product'
name
Char
required=True
size=64
string='Rental Service Name'
sale_price_per_day
Float
default=1.0
digits=dp.get_precision('Product Price')
required=True
string='Rental Price per Day'
create_rental_product(self)
default_get(self, fields_list)
rental_service_ids
One2many → product.product
string='Rental Services'
args: 'product.product', 'rented_product_id'
rented_product_id
Many2one → product.product
domain=[('type', 'in', ('product', 'consu'))]
string='Related Rented Product'
args: 'product.product'
No public methods.
No new fields.
Public methods (1)action_cancel(self)
can_sell_rental
Boolean
string='Can Sell from Rental'
extension_rental_id
Many2one → sale.rental
string='Rental to Extend'
args: 'sale.rental'
rental
Boolean
default=False
string='Rental'
rental_qty
Float
digits=dp.get_precision('Product Unit of Measure')
help='Indicate the number of items that will be rented.'
string='Rental Quantity'
rental_type
Selection
readonly=True
states={'draft': [('readonly', False)]}
args: [('new_rental', 'New Rental'), ('rental_extension', 'Rental Extension')], 'Rental Type'
sell_rental_id
Many2one → sale.rental
string='Rental to Sell'
args: 'sale.rental'
extension_rental_id_change(self)
rental_product_id_change(self)
rental_qty_number_of_days_change(self)
rental_type_change(self)
sell_rental_id_change(self)
company_id
Many2one → res.company
readonly=True
related='start_order_line_id.company_id'
string='Company'
args: 'res.company'
end_date
Date
compute='_compute_end_date'
help='End Date of the Rental (extensions included), taking into account all the extensions sold to the customer.'
store=True
string='End Date'
extension_order_line_ids
One2many → sale.order.line
readonly=True
string='Rental Extensions'
args: 'sale.order.line', 'extension_rental_id'
in_move_id
Many2one → stock.move
compute='_compute_move_and_state'
readonly=True
store=True
string='Incoming Move'
args: 'stock.move'
in_picking_id
Many2one → stock.picking
readonly=True
related='in_move_id.picking_id'
string='Receipt'
args: 'stock.picking'
in_state
Selection
readonly=True
related='in_move_id.state'
string='In Move State'
out_move_id
Many2one → stock.move
compute='_compute_move_and_state'
readonly=True
store=True
string='Outgoing Move'
args: 'stock.move'
out_picking_id
Many2one → stock.picking
readonly=True
related='out_move_id.picking_id'
string='Delivery Order'
args: 'stock.picking'
out_state
Selection
readonly=True
related='out_move_id.state'
string='Out Move State'
partner_id
Many2one → res.partner
readonly=True
related='start_order_line_id.order_id.partner_id'
store=True
string='Customer'
args: 'res.partner'
rental_product_id
Many2one → product.product
readonly=True
related='start_order_line_id.product_id'
store=True
string='Rental Service'
args: 'product.product'
rental_qty
Float
readonly=True
related='start_order_line_id.rental_qty'
store=True
rented_product_id
Many2one → product.product
readonly=True
related='start_order_line_id.product_id.rented_product_id'
store=True
string='Rented Product'
args: 'product.product'
sell_move_id
Many2one → stock.move
compute='_compute_move_and_state'
readonly=True
store=True
string='Selling Move'
args: 'stock.move'
sell_order_line_ids
One2many → sale.order.line
readonly=True
string='Sell Rented Product'
args: 'sale.order.line', 'sell_rental_id'
sell_picking_id
Many2one → stock.picking
readonly=True
related='sell_move_id.picking_id'
string='Sell Delivery Order'
args: 'stock.picking'
sell_state
Selection
readonly=True
related='sell_move_id.state'
string='Sell Move State'
start_date
Date
readonly=True
related='start_order_line_id.start_date'
store=True
start_order_id
Many2one → sale.order
readonly=True
related='start_order_line_id.order_id'
store=True
string='Rental SO'
args: 'sale.order'
start_order_line_id
Many2one → sale.order.line
readonly=True
string='Rental SO Line'
args: 'sale.order.line'
state
Selection
compute='_compute_move_and_state'
readonly=True
store=True
string='State'
args: [('ordered', 'Ordered'), ('out', 'Out'), ('sell_progress', 'Sell in progress'), ('sold', 'Sold'), ('in', 'Back In'), ('cancel', 'Cancelled')]
name_get(self)
No new fields.
Public methods (1)create_demo_and_validate(self)
No new fields.
Public methods (0)No public methods.
rental_allowed
Boolean
rental_in_location_id
Many2one → stock.location
domain=[('usage', '=', 'internal')]
args: 'stock.location', 'Rental In'
rental_out_location_id
Many2one → stock.location
domain=[('usage', '!=', 'view')]
args: 'stock.location', 'Rental Out'
rental_route_id
Many2one → stock.location.route
string='Rental Route'
args: 'stock.location.route'
rental_view_location_id
Many2one → stock.location
domain=[('usage', '=', 'view')]
args: 'stock.location', 'Parent Rental'
sell_rented_product_route_id
Many2one → stock.location.route
string='Sell Rented Product Route'
args: 'stock.location.route'
write(self, vals)
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/sale-workflow |
| GIT | |
| GIT | https://github.com/OCA/sale-workflow.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/sale-workflow/tree/10.0/sale_rental |
| VERSION | |
| VERSION | 1.0.1 |
| CATEGORY | |
| CATEGORY | Sales Management |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Odoo Community Association (OCA), Akretion, Sodexis |
| MAINTAINERS | |
| MAINTAINERS | Odoo Community Association (OCA), Akretion, Sodexis |
| COMMITTERS | |
| COMMITTERS | Alexis de Lattre, Pedro M. Baeza, Denis Roussel, Stéphane Bidoul (ACSONE), OCA Transbot, oca-travis, Weblate, OCA-git-bot, Julie Moussu, Dhinesh, Sodexis, Dhinesh |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/sale-workflow |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 00:19:56 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
OCA/account-closing: - account_invoice_start_end_dates OCA/sale-workflow: - sale_start_end_dates odoo/odoo: - account - base_setup - base - web_kanban - web - product - decimal_precision - bus - web_tour - report - analytic - web_planner - sale - sales_team - procurement - sale_stock - stock_account - stock - barcodes |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
create_rental_product_form |
rental.product.product.form | create.rental.product | form | New |
product_normal_form_view |
rental.product.product.form | product.product | notebook | Inherits product.product_normal_form_view |
sale_rental_form |
sale.rental.form | sale.rental | form | New |
sale_rental_search |
sale.rental.search | sale.rental | search | New |
sale_rental_tree |
sale.rental.tree | sale.rental | tree | New |
view_order_form |
sale_rental.view_order_form | sale.order | xpath | Inherits sale_start_end_dates.view_order_form |
view_warehouse |
rental.stock.warehouse.form | stock.warehouse | field | Inherits stock.view_warehouse |
categ_id
Many2one → product.category
required=True
string='Product Category'
args: 'product.category'
copy_image
Boolean
string='Copy Product Image'
default_code
Char
default=_default_code
size=16
string='Default Code'
name
Char
default=_default_name
required=True
size=64
string='Product Name'
sale_price_per_day
Float
default=1.0
digits=dp.get_precision('Product Price')
required=True
string='Rental Price per Day'
create_rental_product(self)
No new fields.
Public methods (1)create(self, vals)
rental_service_ids
One2many → product.product
string='Related Rental Services'
args: 'product.product', 'rented_product_id'
rented_product_id
Many2one → product.product
domain=[('type', 'in', ('product', 'consu'))]
string='Related Rented Product'
args: 'product.product'
No public methods.
No new fields.
Public methods (1)action_confirm(self)
can_sell_rental
Boolean
string='Can Sell from Rental'
extension_rental_id
Many2one → sale.rental
string='Rental to Extend'
args: 'sale.rental'
rental
Boolean
string='Rental'
rental_qty
Float
digits=dp.get_precision('Product Unit of Measure')
help='Indicate the number of items that will be rented.'
string='Rental Quantity'
rental_type
Selection
readonly=True
states={'draft': [('readonly', False)]}
args: [('new_rental', 'New Rental'), ('rental_extension', 'Rental Extension')], 'Rental Type'
sell_rental_id
Many2one → sale.rental
string='Rental to Sell'
args: 'sale.rental'
extension_rental_id_change(self)
rental_product_id_change(self)
rental_qty_number_of_days_change(self)
rental_type_change(self)
sell_rental_id_change(self)
company_id
Many2one → res.company
readonly=True
related='start_order_line_id.order_id.company_id'
string='Company'
args: 'res.company'
display_name
Char
compute='_compute_display_name_field'
readonly=True
string='Display Name'
end_date
Date
compute='_compute_end_date'
help='End Date of the Rental, taking into account all the extensions sold to the customer.'
readonly=True
string='End Date (extensions included)'
extension_order_line_ids
One2many → sale.order.line
readonly=True
string='Rental Extensions'
args: 'sale.order.line', 'extension_rental_id'
in_move_id
Many2one → stock.move
compute='_compute_procurement_and_move'
readonly=True
store=True
string='Return Stock Move'
args: 'stock.move'
in_picking_id
Many2one → stock.picking
readonly=True
related='in_move_id.picking_id'
string='Return Picking'
args: 'stock.picking'
in_state
Selection
readonly=True
related='in_move_id.state'
string='State of the Return Stock Move'
out_move_id
Many2one → stock.move
compute='_compute_procurement_and_move'
readonly=True
store=True
string='Outgoing Stock Move'
args: 'stock.move'
out_picking_id
Many2one → stock.picking
readonly=True
related='out_move_id.picking_id'
string='Delivery Order'
args: 'stock.picking'
out_state
Selection
readonly=True
related='out_move_id.state'
string='State of the Outgoing Stock Move'
partner_id
Many2one → res.partner
readonly=True
related='start_order_line_id.order_id.partner_id'
store=True
string='Customer'
args: 'res.partner'
procurement_id
Many2one → procurement.order
compute='_compute_procurement_and_move'
readonly=True
store=True
string='Procurement'
args: 'procurement.order'
rental_product_id
Many2one → product.product
readonly=True
related='start_order_line_id.product_id'
string='Rental Service'
args: 'product.product'
rental_qty
Float
readonly=True
related='start_order_line_id.rental_qty'
rented_product_id
Many2one → product.product
readonly=True
related='start_order_line_id.product_id.rented_product_id'
string='Rented Product'
args: 'product.product'
sell_move_id
Many2one → stock.move
compute='_compute_procurement_and_move'
readonly=True
store=True
string='Sell Stock Move'
args: 'stock.move'
sell_order_line_ids
One2many → sale.order.line
readonly=True
string='Sell Rented Product'
args: 'sale.order.line', 'sell_rental_id'
sell_picking_id
Many2one → stock.picking
readonly=True
related='sell_move_id.picking_id'
string='Sell Delivery Order'
args: 'stock.picking'
sell_procurement_id
Many2one → procurement.order
compute='_compute_procurement_and_move'
readonly=True
store=True
string='Sell Procurement'
args: 'procurement.order'
sell_state
Selection
readonly=True
related='sell_move_id.state'
string='State of the Sell Stock Move'
start_date
Date
readonly=True
related='start_order_line_id.start_date'
store=True
start_order_id
Many2one → sale.order
readonly=True
related='start_order_line_id.order_id'
string='Rental Sale Order'
args: 'sale.order'
start_order_line_id
Many2one → sale.order.line
readonly=True
string='Rental Sale Order Line'
args: 'sale.order.line'
state
Selection
compute='_compute_procurement_and_move'
readonly=True
store=True
string='State'
args: [('ordered', 'Ordered'), ('out', 'Out'), ('sell_progress', 'Sell in progress'), ('sold', 'Sold'), ('in', 'Back In'), ('cancel', 'Cancelled')]
No public methods.
No new fields.
Public methods (1)create_demo_and_validate(self)
No new fields.
Public methods (0)No public methods.
rental_allowed
Boolean
rental_in_location_id
Many2one → stock.location
domain=[('usage', '!=', 'view')]
args: 'stock.location', 'Rental In'
rental_out_location_id
Many2one → stock.location
domain=[('usage', '!=', 'view')]
args: 'stock.location', 'Rental Out'
rental_route_id
Many2one → stock.location.route
string='Rental Route'
args: 'stock.location.route'
rental_view_location_id
Many2one → stock.location
domain=[('usage', '=', 'view')]
args: 'stock.location', 'Parent Rental'
sell_rented_product_route_id
Many2one → stock.location.route
string='Sell Rented Product Route'
args: 'stock.location.route'
write(self, vals)
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/sale-workflow |
| GIT | |
| GIT | https://github.com/OCA/sale-workflow.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/sale-workflow/tree/9.0/sale_rental |
| VERSION | |
| VERSION | 1.0.0 |
| CATEGORY | |
| CATEGORY | Sales Management |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Odoo Community Association (OCA), Akretion |
| MAINTAINERS | |
| MAINTAINERS | Odoo Community Association (OCA), Akretion |
| COMMITTERS | |
| COMMITTERS | Alexis de Lattre, Pedro M. Baeza, Stéphane Bidoul (ACSONE), OCA Transbot, vrenaville, oca-travis, Weblate, OCA-git-bot |
| WEBSITE | |
| WEBSITE | http://www.akretion.com |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 00:15:20 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
OCA/account-closing: - account_invoice_start_end_dates OCA/sale-workflow: - sale_start_end_dates odoo/odoo: - account - base_setup - base - web_kanban - web - product - decimal_precision - bus - report - analytic - web_tip - web_planner - sale - sales_team - procurement - sale_stock - stock_account - stock - barcodes |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
create_rental_product_form |
rental.product.product.form | create.rental.product | form | New |
product_normal_form_view |
rental.product.product.form | product.product | notebook | Inherits product.product_normal_form_view |
sale_rental_form |
sale.rental.form | sale.rental | form | New |
sale_rental_search |
sale.rental.search | sale.rental | search | New |
sale_rental_tree |
sale.rental.tree | sale.rental | tree | New |
view_order_form |
sale_rental.view_order_form | sale.order | xpath | Inherits sale_start_end_dates.view_order_form |
view_warehouse |
rental.stock.warehouse.form | stock.warehouse | field | Inherits stock.view_warehouse |
categ_id
Many2one → product.category
required=True
string='Product Category'
args: 'product.category'
copy_image
Boolean
string='Copy Product Image'
default_code
Char
default=_default_code
size=16
string='Default Code'
name
Char
default=_default_name
required=True
size=64
string='Product Name'
sale_price_per_day
Float
default=1.0
digits=dp.get_precision('Product Price')
required=True
string='Rental Price per Day'
create_rental_product(self)
No new fields.
Public methods (1)create(self, vals)
rental_service_ids
One2many → product.product
string='Related Rental Services'
args: 'product.product', 'rented_product_id'
rented_product_id
Many2one → product.product
domain=[('type', 'in', ('product', 'consu'))]
string='Related Rented Product'
args: 'product.product'
No public methods.
No new fields.
Public methods (1)action_confirm(self)
can_sell_rental
Boolean
string='Can Sell from Rental'
extension_rental_id
Many2one → sale.rental
string='Rental to Extend'
args: 'sale.rental'
rental
Boolean
string='Rental'
rental_qty
Float
digits=dp.get_precision('Product Unit of Measure')
help='Indicate the number of items that will be rented.'
string='Rental Quantity'
rental_type
Selection
readonly=True
states={'draft': [('readonly', False)]}
args: [('new_rental', 'New Rental'), ('rental_extension', 'Rental Extension')], 'Rental Type'
sell_rental_id
Many2one → sale.rental
string='Rental to Sell'
args: 'sale.rental'
extension_rental_id_change(self)
rental_product_id_change(self)
rental_qty_number_of_days_change(self)
rental_type_change(self)
sell_rental_id_change(self)
company_id
Many2one → res.company
readonly=True
related='start_order_line_id.order_id.company_id'
string='Company'
args: 'res.company'
display_name
Char
compute='_compute_display_name_field'
readonly=True
string='Display Name'
end_date
Date
compute='_compute_end_date'
help='End Date of the Rental, taking into account all the extensions sold to the customer.'
readonly=True
string='End Date (extensions included)'
extension_order_line_ids
One2many → sale.order.line
readonly=True
string='Rental Extensions'
args: 'sale.order.line', 'extension_rental_id'
in_move_id
Many2one → stock.move
compute='_compute_procurement_and_move'
readonly=True
store=True
string='Return Stock Move'
args: 'stock.move'
in_picking_id
Many2one → stock.picking
readonly=True
related='in_move_id.picking_id'
string='Return Picking'
args: 'stock.picking'
in_state
Selection
readonly=True
related='in_move_id.state'
string='State of the Return Stock Move'
out_move_id
Many2one → stock.move
compute='_compute_procurement_and_move'
readonly=True
store=True
string='Outgoing Stock Move'
args: 'stock.move'
out_picking_id
Many2one → stock.picking
readonly=True
related='out_move_id.picking_id'
string='Delivery Order'
args: 'stock.picking'
out_state
Selection
readonly=True
related='out_move_id.state'
string='State of the Outgoing Stock Move'
partner_id
Many2one → res.partner
readonly=True
related='start_order_line_id.order_id.partner_id'
store=True
string='Customer'
args: 'res.partner'
procurement_id
Many2one → procurement.order
compute='_compute_procurement_and_move'
readonly=True
store=True
string='Procurement'
args: 'procurement.order'
rental_product_id
Many2one → product.product
readonly=True
related='start_order_line_id.product_id'
string='Rental Service'
args: 'product.product'
rental_qty
Float
readonly=True
related='start_order_line_id.rental_qty'
rented_product_id
Many2one → product.product
readonly=True
related='start_order_line_id.product_id.rented_product_id'
string='Rented Product'
args: 'product.product'
sell_move_id
Many2one → stock.move
compute='_compute_procurement_and_move'
readonly=True
store=True
string='Sell Stock Move'
args: 'stock.move'
sell_order_line_ids
One2many → sale.order.line
readonly=True
string='Sell Rented Product'
args: 'sale.order.line', 'sell_rental_id'
sell_picking_id
Many2one → stock.picking
readonly=True
related='sell_move_id.picking_id'
string='Sell Delivery Order'
args: 'stock.picking'
sell_procurement_id
Many2one → procurement.order
compute='_compute_procurement_and_move'
readonly=True
store=True
string='Sell Procurement'
args: 'procurement.order'
sell_state
Selection
readonly=True
related='sell_move_id.state'
string='State of the Sell Stock Move'
start_date
Date
readonly=True
related='start_order_line_id.start_date'
store=True
start_order_id
Many2one → sale.order
readonly=True
related='start_order_line_id.order_id'
string='Rental Sale Order'
args: 'sale.order'
start_order_line_id
Many2one → sale.order.line
readonly=True
string='Rental Sale Order Line'
args: 'sale.order.line'
state
Selection
compute='_compute_procurement_and_move'
readonly=True
store=True
string='State'
args: [('ordered', 'Ordered'), ('out', 'Out'), ('sell_progress', 'Sell in progress'), ('sold', 'Sold'), ('in', 'Back In'), ('cancel', 'Cancelled')]
No public methods.
No new fields.
Public methods (1)create_demo_and_validate(self)
No new fields.
Public methods (0)No public methods.
rental_allowed
Boolean
rental_in_location_id
Many2one → stock.location
domain=[('usage', '!=', 'view')]
args: 'stock.location', 'Rental In'
rental_out_location_id
Many2one → stock.location
domain=[('usage', '!=', 'view')]
args: 'stock.location', 'Rental Out'
rental_route_id
Many2one → stock.location.route
string='Rental Route'
args: 'stock.location.route'
rental_view_location_id
Many2one → stock.location
domain=[('usage', '=', 'view')]
args: 'stock.location', 'Parent Rental'
sell_rented_product_route_id
Many2one → stock.location.route
string='Sell Rented Product Route'
args: 'stock.location.route'
write(self, vals)
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/sale-workflow |
| GIT | |
| GIT | https://github.com/OCA/sale-workflow.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/sale-workflow/tree/8.0/sale_rental |
| VERSION | |
| VERSION | 0.1.0 |
| CATEGORY | |
| CATEGORY | Sales Management |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Akretion |
| MAINTAINERS | |
| MAINTAINERS | Akretion |
| COMMITTERS | |
| COMMITTERS | Stéphane Bidoul, Alexis de Lattre, Yannick Vaucher, Pedro M. Baeza, Stéphane Bidoul (ACSONE), OCA Transbot, oca-travis, Weblate, Matjaž Mozetič |
| WEBSITE | |
| WEBSITE | http://www.akretion.com |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 00:11:22 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
OCA/account-closing: - account_cutoff_prepaid - account_cutoff_base OCA/account-financial-tools: - account_reversal OCA/sale-workflow: - sale_start_end_dates OCA/server-tools: - web_context_tunnel odoo/odoo: - account_accountant - account_voucher - account - base_setup - base - web_kanban - web - product - decimal_precision - report - analytic - board - edi - email_template - sale - sales_team - web_kanban_sparkline - procurement - stock - web_kanban_gauge |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
create_rental_product_form |
rental.product.product.form | create.rental.product | form | New |
product_normal_form_view |
rental.product.product.form | product.product | notebook | Inherits product.product_normal_form_view |
sale_rental_form |
sale.rental.form | sale.rental | form | New |
sale_rental_tree |
sale.rental.tree | sale.rental | tree | New |
view_order_form |
sale_rental.view_order_form | sale.order | xpath | Inherits sale_start_end_dates.view_order_form |
view_order_form_sale_stock |
sale_rental.sale_stock.view_order_form | sale.order | xpath | Inherits sale_stock.view_order_form_inherit |
view_warehouse |
rental.stock.warehouse.form | stock.warehouse | field | Inherits stock.view_warehouse |
categ_id
Many2one → product.category
required=True
string='Product Category'
args: 'product.category'
copy_image
Boolean
string='Copy Product Image'
default_code
Char
default=_default_code
size=16
string='Default Code'
name
Char
default=_default_name
required=True
size=64
string='Product Name'
sale_price_per_day
Float
default=1.0
digits=dp.get_precision('Product Price')
required=True
string='Rental Price per Day'
create_rental_product(self)
rental_service_ids
One2many → product.product
string='Related Rental Services'
args: 'product.product', 'rented_product_id'
rented_product_id
Many2one → product.product
domain=[('type', 'in', ('product', 'consu'))]
string='Related Rented Product'
args: 'product.product'
No public methods.
No new fields.
Public methods (1)action_button_confirm(self)
can_sell_rental
Boolean
string='Can Sell from Rental'
extension_rental_id
Many2one → sale.rental
string='Rental to Extend'
args: 'sale.rental'
rental
Boolean
string='Rental'
rental_qty
Float
digits=dp.get_precision('Product UoS')
help='Indicate the number of items that will be rented.'
string='Rental Quantity'
rental_type
Selection
readonly=True
states={'draft': [('readonly', False)]}
args: [('new_rental', 'New Rental'), ('rental_extension', 'Rental Extension')], 'Rental Type'
sell_rental_id
Many2one → sale.rental
string='Rental to Sell'
args: 'sale.rental'
extension_rental_id_change(self)
need_procurement(self)
product_id_change_with_wh_with_rental(self, pricelist, product, qty=0, uom=False, qty_uos=0, uos=False, name='', partner_id=False, lang=False, update_tax=True, date_order=False, packaging=False, fiscal_position=False, flag=False, warehouse_id=False, rental_type=False, rental_qty=0)
rental_qty_number_of_days_change(self)
rental_type_change(self)
sell_rental_id_change(self)
company_id
Many2one → res.company
readonly=True
related='start_order_id.company_id'
string='Company'
args: 'res.company'
display_name
Char
compute='_display_name'
string='Display Name'
end_date
Date
compute='_compute_end_date'
help='End Date of the Rental, taking into account all the extensions sold to the customer.'
readonly=True
string='End Date (extensions included)'
extension_order_line_ids
One2many → sale.order.line
readonly=True
string='Rental Extensions'
args: 'sale.order.line', 'extension_rental_id'
in_move_id
Many2one → stock.move
compute='_compute_procurement_and_move'
readonly=True
string='Return Stock Move'
args: 'stock.move'
in_picking_id
Many2one → stock.picking
readonly=True
related='in_move_id.picking_id'
string='Return Picking'
args: 'stock.picking'
in_state
Selection
readonly=True
related='in_move_id.state'
string='State of the Return Stock Move'
args: [('draft', 'New'), ('cancel', 'Cancelled'), ('waiting', 'Waiting Another Move'), ('confirmed', 'Waiting Availability'), ('assigned', 'Available'), ('done', 'Done')]
out_move_id
Many2one → stock.move
compute='_compute_procurement_and_move'
readonly=True
string='Outgoing Stock Move'
args: 'stock.move'
out_picking_id
Many2one → stock.picking
readonly=True
related='out_move_id.picking_id'
string='Delivery Order'
args: 'stock.picking'
out_state
Selection
readonly=True
related='out_move_id.state'
string='State of the Outgoing Stock Move'
args: [('draft', 'New'), ('cancel', 'Cancelled'), ('waiting', 'Waiting Another Move'), ('confirmed', 'Waiting Availability'), ('assigned', 'Available'), ('done', 'Done')]
partner_id
Many2one → res.partner
readonly=True
related='start_order_id.partner_id'
string='Partner'
args: 'res.partner'
procurement_id
Many2one → procurement.order
compute='_compute_procurement_and_move'
readonly=True
string='Procurement'
args: 'procurement.order'
rental_product_id
Many2one → product.product
readonly=True
related='start_order_line_id.product_id'
string='Rental Service'
args: 'product.product'
rental_qty
Float
readonly=True
related='start_order_line_id.rental_qty'
string='Rental Quantity'
rented_product_id
Many2one → product.product
readonly=True
related='start_order_line_id.product_id.rented_product_id'
string='Rented Product'
args: 'product.product'
sell_move_id
Many2one → stock.move
compute='_compute_procurement_and_move'
readonly=True
string='Sell Stock Move'
args: 'stock.move'
sell_order_line_ids
One2many → sale.order.line
readonly=True
string='Sell Rented Product'
args: 'sale.order.line', 'sell_rental_id'
sell_picking_id
Many2one → stock.picking
readonly=True
related='sell_move_id.picking_id'
string='Sell Delivery Order'
args: 'stock.picking'
sell_procurement_id
Many2one → procurement.order
compute='_compute_procurement_and_move'
readonly=True
string='Sell Procurement'
args: 'procurement.order'
sell_state
Selection
readonly=True
related='sell_move_id.state'
string='State of the Sell Stock Move'
args: [('draft', 'New'), ('cancel', 'Cancelled'), ('waiting', 'Waiting Another Move'), ('confirmed', 'Waiting Availability'), ('assigned', 'Available'), ('done', 'Done')]
start_date
Date
readonly=True
related='start_order_line_id.start_date'
string='Start Date'
start_order_id
Many2one → sale.order
readonly=True
related='start_order_line_id.order_id'
string='Rental Sale Order'
args: 'sale.order'
start_order_line_id
Many2one → sale.order.line
string='Rental Sale Order Line'
args: 'sale.order.line'
state
Selection
compute='_compute_procurement_and_move'
readonly=True
string='State'
args: [('ordered', 'Ordered'), ('out', 'Out'), ('sell_progress', 'Sell in progress'), ('sold', 'Sold'), ('in', 'Back In')]
No public methods.
No new fields.
Public methods (0)No public methods.
No new fields.
Public methods (0)No public methods.
rental_allowed
Boolean
default=True
args: 'Rental Allowed'
rental_in_location_id
Many2one → stock.location
domain=[('usage', '<>', 'view')]
args: 'stock.location', 'Rental In'
rental_out_location_id
Many2one → stock.location
domain=[('usage', '<>', 'view')]
args: 'stock.location', 'Rental Out'
rental_route_id
Many2one → stock.location.route
string='Rental Route'
args: 'stock.location.route'
sell_rented_product_route_id
Many2one → stock.location.route
string='Sell Rented Product Route'
args: 'stock.location.route'
write(self, vals)
| STATUS | |
|---|---|
| STATUS | Open migration PR - not merged yet for this version |
| REPOSITORY | |
| REPOSITORY | OCA/vertical-rental |
| PULL REQUEST | |
| PULL REQUEST | [18.0][MIG] sale_rental (#70) |
| STATUS | |
|---|---|
| STATUS | Open migration PR - not merged yet for this version |
| REPOSITORY | |
| REPOSITORY | OCA/vertical-rental |
| PULL REQUEST | |
| PULL REQUEST | [17.0][MIG] sale_rental (#52) |