Sale Rental

sale_rental
REPOSITORY
REPOSITORYOCA/vertical-rental
GIT
GIThttps://github.com/OCA/vertical-rental.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/vertical-rental/tree/16.0/sale_rental
VERSION
VERSION 1.0.4
CATEGORY
CATEGORYSales
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Akretion, Sodexis
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Akretion, Sodexis
COMMITTERS
COMMITTERSWeblate, OCA-git-bot, oca-ci, pwitte, chaule97
WEBSITE
WEBSITEhttps://github.com/OCA/vertical-rental
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-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
    - mail
    - 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

Code Analysis

Views touched (12)
XML IDNameModelTypeStatus
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
Models touched (10)

New fields (6)
  • 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'
Public methods (2)
  • create_rental_product(self)
  • default_get(self, fields_list)
    @api.model

New fields (2)
  • 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'
Public methods (0)

No public methods.

New fields (2)
  • 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'
Public methods (0)

No public methods.

New fields (2)
  • 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'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • action_cancel(self)
    When the user cancels a rental extension, Odoo writes the initial end date on the return picking

New fields (6)
  • 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'
Public methods (5)
  • extension_rental_id_change(self)
    @api.onchange('extension_rental_id')
  • rental_product_id_change(self)
    @api.onchange('product_id', 'rental_qty')
  • rental_qty_number_of_days_change(self)
    @api.onchange('rental_qty', 'number_of_days', 'product_id')
  • rental_type_change(self)
    @api.onchange('rental_type')
  • sell_rental_id_change(self)
    @api.onchange('sell_rental_id')

New fields (21)
  • 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')]
Public methods (2)
  • cron_send_return_reminders(self)
    @api.model
    Send reminder emails X days before end_date.
  • name_get(self)
    @api.depends('start_order_line_id', 'extension_order_line_ids.end_date', 'extension_order_line_ids.state', 'start_order_line_id.end_date')

New fields (0)

No new fields.

Public methods (1)
  • create_demo_and_validate(self)
    @api.model

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (6)
  • 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'
Public methods (1)
  • write(self, vals)
REPOSITORY
REPOSITORYOCA/sale-workflow
GIT
GIThttps://github.com/OCA/sale-workflow.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/sale-workflow/tree/15.0/sale_rental
VERSION
VERSION 1.0.2
CATEGORY
CATEGORYSales
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Akretion, Sodexis
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Akretion, Sodexis
COMMITTERS
COMMITTERSPedro M. Baeza, Kiril Vangelovski, OCA Transbot, Weblate, OCA-git-bot, oca-ci
WEBSITE
WEBSITEhttps://github.com/OCA/sale-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-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
    - mail
    - 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

Code Analysis

Views touched (9)
XML IDNameModelTypeStatus
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
Models touched (9)

New fields (6)
  • 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'
Public methods (2)
  • create_rental_product(self)
  • default_get(self, fields_list)
    @api.model

New fields (2)
  • 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'
Public methods (0)

No public methods.

New fields (2)
  • 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'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • action_cancel(self)
    When the user cancels a rental extension, Odoo writes the initial end date on the return picking

New fields (6)
  • 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'
Public methods (5)
  • extension_rental_id_change(self)
    @api.onchange('extension_rental_id')
  • rental_product_id_change(self)
    @api.onchange('product_id', 'rental_qty')
  • rental_qty_number_of_days_change(self)
    @api.onchange('rental_qty', 'number_of_days', 'product_id')
  • rental_type_change(self)
    @api.onchange('rental_type')
  • sell_rental_id_change(self)
    @api.onchange('sell_rental_id')

New fields (21)
  • 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')]
Public methods (1)
  • name_get(self)
    @api.depends('start_order_line_id', 'extension_order_line_ids.end_date', 'extension_order_line_ids.state', 'start_order_line_id.end_date')

New fields (0)

No new fields.

Public methods (1)
  • create_demo_and_validate(self)
    @api.model

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (6)
  • 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'
Public methods (1)
  • write(self, vals)
REPOSITORY
REPOSITORYOCA/sale-workflow
GIT
GIThttps://github.com/OCA/sale-workflow.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/sale-workflow/tree/14.0/sale_rental
VERSION
VERSION 1.0.1
CATEGORY
CATEGORYSales
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Akretion, Sodexis
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Akretion, Sodexis
COMMITTERS
COMMITTERSAlexis de Lattre, OCA Transbot, oca-travis, Weblate, OCA-git-bot, oca-ci, Alessandro Uffreduzzi
WEBSITE
WEBSITEhttps://github.com/OCA/sale-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-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
    - mail
    - 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

Code Analysis

Views touched (9)
XML IDNameModelTypeStatus
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
Models touched (9)

New fields (6)
  • 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'
Public methods (2)
  • create_rental_product(self)
  • default_get(self, fields_list)
    @api.model

New fields (2)
  • 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'
Public methods (0)

No public methods.

New fields (2)
  • 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'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • action_cancel(self)
    When the user cancels a rental extension, Odoo writes the initial end date on the return picking

New fields (6)
  • 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'
Public methods (5)
  • extension_rental_id_change(self)
    @api.onchange('extension_rental_id')
  • rental_product_id_change(self)
    @api.onchange('product_id', 'rental_qty')
  • rental_qty_number_of_days_change(self)
    @api.onchange('rental_qty', 'number_of_days', 'product_id')
  • rental_type_change(self)
    @api.onchange('rental_type')
  • sell_rental_id_change(self)
    @api.onchange('sell_rental_id')

New fields (21)
  • 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')]
Public methods (1)
  • name_get(self)
    @api.depends('start_order_line_id', 'extension_order_line_ids.end_date', 'extension_order_line_ids.state', 'start_order_line_id.end_date')

New fields (0)

No new fields.

Public methods (1)
  • create_demo_and_validate(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (6)
  • rental_allowed Boolean
    args: 'Rental Allowed'
  • 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'
Public methods (1)
  • write(self, vals)
REPOSITORY
REPOSITORYOCA/sale-workflow
GIT
GIThttps://github.com/OCA/sale-workflow.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/sale-workflow/tree/12.0/sale_rental
VERSION
VERSION 1.1.1
CATEGORY
CATEGORYSales
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Akretion, Sodexis
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Akretion, Sodexis
COMMITTERS
COMMITTERSAlexandre Fayolle, eLBati, OCA Transbot, oca-travis, Weblate, OCA-git-bot, Yu Weng
WEBSITE
WEBSITEhttps://github.com/OCA/sale-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-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
    - mail
    - 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

Code Analysis

Views touched (8)
XML IDNameModelTypeStatus
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
Models touched (8)

New fields (6)
  • 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'
Public methods (2)
  • create_rental_product(self)
  • default_get(self, fields_list)
    @api.model

New fields (2)
  • 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'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • action_cancel(self)
    In case cancelling a SO which sells rental product. Picking in should be created manually

New fields (6)
  • 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'
Public methods (5)
  • extension_rental_id_change(self)
    @api.onchange('extension_rental_id')
  • rental_product_id_change(self)
    @api.onchange('product_id', 'rental_qty')
  • rental_qty_number_of_days_change(self)
    @api.onchange('rental_qty', 'number_of_days', 'product_id')
  • rental_type_change(self)
    @api.onchange('rental_type')
  • sell_rental_id_change(self)
    @api.onchange('sell_rental_id')

New fields (21)
  • 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')]
Public methods (1)
  • name_get(self)
    @api.depends('start_order_line_id', 'extension_order_line_ids.end_date', 'extension_order_line_ids.state', 'start_order_line_id.end_date')

New fields (0)

No new fields.

Public methods (1)
  • create_demo_and_validate(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (6)
  • rental_allowed Boolean
    args: 'Rental Allowed'
  • 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'
Public methods (1)
  • write(self, vals)
REPOSITORY
REPOSITORYOCA/sale-workflow
GIT
GIThttps://github.com/OCA/sale-workflow.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/sale-workflow/tree/10.0/sale_rental
VERSION
VERSION 1.0.1
CATEGORY
CATEGORYSales Management
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Akretion, Sodexis
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Akretion, Sodexis
COMMITTERS
COMMITTERSAlexis 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
WEBSITEhttps://github.com/OCA/sale-workflow
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-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
    - mail
    - 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

Code Analysis

Views touched (7)
XML IDNameModelTypeStatus
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
Models touched (9)

New fields (5)
  • 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'
Public methods (1)
  • create_rental_product(self)
    @api.multi

New fields (0)

No new fields.

Public methods (1)
  • create(self, vals)
    @api.model

New fields (2)
  • 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'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • action_confirm(self)
    @api.multi

New fields (6)
  • 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'
Public methods (5)
  • extension_rental_id_change(self)
    @api.onchange('extension_rental_id')
  • rental_product_id_change(self)
    @api.onchange('product_id')
  • rental_qty_number_of_days_change(self)
    @api.onchange('rental_qty', 'number_of_days', 'product_id')
  • rental_type_change(self)
    @api.onchange('rental_type')
  • sell_rental_id_change(self)
    @api.onchange('sell_rental_id')

New fields (24)
  • 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')]
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • create_demo_and_validate(self)
    @api.multi

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (6)
  • rental_allowed Boolean
    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'
  • 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'
Public methods (1)
  • write(self, vals)
    @api.multi
REPOSITORY
REPOSITORYOCA/sale-workflow
GIT
GIThttps://github.com/OCA/sale-workflow.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/sale-workflow/tree/9.0/sale_rental
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYSales Management
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Akretion
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Akretion
COMMITTERS
COMMITTERSAlexis de Lattre, Pedro M. Baeza, Stéphane Bidoul (ACSONE), OCA Transbot, vrenaville, oca-travis, Weblate, OCA-git-bot
WEBSITE
WEBSITEhttp://www.akretion.com
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-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
    - mail
    - 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

Code Analysis

Views touched (7)
XML IDNameModelTypeStatus
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
Models touched (9)

New fields (5)
  • 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'
Public methods (1)
  • create_rental_product(self)
    @api.multi

New fields (0)

No new fields.

Public methods (1)
  • create(self, vals)
    @api.model

New fields (2)
  • 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'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • action_confirm(self)
    @api.multi

New fields (6)
  • 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'
Public methods (5)
  • extension_rental_id_change(self)
    @api.onchange('extension_rental_id')
  • rental_product_id_change(self)
    @api.onchange('product_id')
  • rental_qty_number_of_days_change(self)
    @api.onchange('rental_qty', 'number_of_days', 'product_id')
  • rental_type_change(self)
    @api.onchange('rental_type')
  • sell_rental_id_change(self)
    @api.onchange('sell_rental_id')

New fields (24)
  • 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')]
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • create_demo_and_validate(self)
    @api.multi

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (6)
  • rental_allowed Boolean
    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'
  • 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'
Public methods (1)
  • write(self, vals)
    @api.multi
REPOSITORY
REPOSITORYOCA/sale-workflow
GIT
GIThttps://github.com/OCA/sale-workflow.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/sale-workflow/tree/8.0/sale_rental
VERSION
VERSION 0.1.0
CATEGORY
CATEGORYSales Management
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSAkretion
MAINTAINERS
MAINTAINERSAkretion
COMMITTERS
COMMITTERSStéphane Bidoul, Alexis de Lattre, Yannick Vaucher, Pedro M. Baeza, Stéphane Bidoul (ACSONE), OCA Transbot, oca-travis, Weblate, Matjaž Mozetič
WEBSITE
WEBSITEhttp://www.akretion.com
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-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
    - mail
    - 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

Code Analysis

Views touched (7)
XML IDNameModelTypeStatus
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
Models touched (8)

New fields (5)
  • 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'
Public methods (1)
  • create_rental_product(self)
    @api.multi

New fields (2)
  • 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'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • action_button_confirm(self)
    @api.multi

New fields (6)
  • 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'
Public methods (6)
  • extension_rental_id_change(self)
    @api.onchange('extension_rental_id')
  • need_procurement(self)
    @api.multi
  • 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)
    @api.multi
  • rental_qty_number_of_days_change(self)
    @api.onchange('rental_qty', 'number_of_days', 'product_id')
  • rental_type_change(self)
    @api.onchange('rental_type')
  • sell_rental_id_change(self)
    @api.onchange('sell_rental_id')

New fields (24)
  • 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')]
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (5)
  • 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'
Public methods (1)
  • write(self, vals)
    @api.multi
STATUS
STATUSOpen migration PR - not merged yet for this version
REPOSITORY
REPOSITORYOCA/vertical-rental
PULL REQUEST
PULL REQUEST[18.0][MIG] sale_rental (#70)
STATUS
STATUSOpen migration PR - not merged yet for this version
REPOSITORY
REPOSITORYOCA/vertical-rental
PULL REQUEST
PULL REQUEST[17.0][MIG] sale_rental (#52)