Repository
OCA/sale-workflow · module folder · Try on Runboat
Module version
1.0.0
Category
Sale
Folder size
0.16 MB
License
AGPL-3
Application
No
Auto-installable
No
Website
https://github.com/OCA/sale-workflow
Last tracking update
2026-08-07 09:06:23
Authors
Odoo Community Association (OCA), Tecnativa
Maintainers
Odoo Community Association (OCA), Tecnativa
Committers
OCA-git-bot, oca-ci, Bhavesh Heliconia
Odoo dependencies
Python dependencies
None
System dependencies
None
Required by
product_customerinfo_elaboration
Description
This module extends the functionality of sales orders to allow to set an
elaboration on lines that will add an extra order line with an
elaboration product linked to it when the delivery order is validated.

An **elaboration** is a process that needs to be done over the product,
usually on picking/handling phase. It doesn't modify too much the
product for needing an specific product, but it adds a surcharge on the
final price.

If the elaboration has a defined route, selecting the elaboration,
it is set on the order line, which will result in the generation of
multiple delivery notes depending on the established route.

Code Analysis

Views touched (21)
XML IDNameModelTypeStatus
elaboration_notes elaboration_notes ir.ui.view qweb New
elaboration_view_form Elaborations product.elaboration form New
elaboration_view_search Elaborations product.elaboration search New
elaboration_view_tree Elaborations product.elaboration list New
product_elaboration_profile_form_view product.elaboration.profile.form.view product.elaboration.profile form New
product_elaboration_profile_tree_view product.elaboration.profile.tree.view product.elaboration.profile list New
product_template_form_view product.template form Inherits product.product_template_form_view
product_template_only_form_view product.template form Inherits product.product_template_only_form_view
report_delivery_document report_delivery_document ir.ui.view qweb Inherits stock.report_delivery_document
report_picking report_picking ir.ui.view qweb Inherits stock.report_picking
report_stock_move_elaboration_view_tree Elaborations stock.move list New
res_config_settings_view res.config.settings form Inherits stock.res_config_settings_view_form
sale_elaboration_product_category_view_form_inherit_elaboration_id product.category.view.form.sale.elaboration product.category form Inherits product.product_category_form_view
sale_order_line_view_form_readonly sale.order.line form Inherits sale.sale_order_line_view_form_readonly
stock_report_delivery_has_serial_move_line stock_report_delivery_has_serial_move_line ir.ui.view qweb Inherits stock.stock_report_delivery_has_serial_move_line
view_move_line_tree_detailed stock.move.line tree Inherits stock.view_move_line_tree_detailed
view_move_search stock.move search Inherits stock.view_move_search
view_order_form Sale Elaboration sale.order form Inherits sale.view_order_form
view_picking_form stock.picking form Inherits stock.view_picking_form
view_stock_move_line_detailed_operation_tree stock.move.line tree Inherits stock.view_stock_move_line_detailed_operation_tree
view_stock_move_line_operation_tree stock.move.line tree Inherits stock.view_stock_move_line_operation_tree
HTTP endpoints (0)

No HTTP endpoints found for this module.

Models touched (13)

New fields (1)
  • elaboration_profile_id Many2one → product.elaboration.profile
    comodel_name='product.elaboration.profile' string='Elaboration Profile'
Public methods (0)

No public methods.

New fields (6)
  • active Boolean
    default=True help='If unchecked, it will allow you to hide the product elaborations without removing it.'
  • code Char
    string='Short Code'
  • name Char
    required=True translate=True
  • product_id Many2one → product.product
    comodel_name='product.product' domain=[('type', '=', 'service'), ('is_elaboration', '=', True)] ondelete='restrict' required=True string='Product'
  • profile_ids Many2many → product.elaboration.profile
    column1='elaboration_id' column2='profile_id' comodel_name='product.elaboration.profile' relation='product_elaboration_profile_rel'
  • route_ids Many2many → stock.route
    comodel_name='stock.route' domain=[('sale_selectable', '=', True)] ondelete='restrict' string='Routes'
Public methods (1)
  • name_search(self, name, args=None, operator='ilike', limit=100)
    @api.model
    Give preference to codes on name search, appending the rest of the results after.

New fields (3)
  • elaboration_ids Many2many → product.elaboration
    comodel_name='product.elaboration' string='Elaborations'
  • elaboration_note Char
  • is_elaboration Boolean
    compute='_compute_is_elaboration' readonly=False store=True
Public methods (1)
  • onchange_elaboration_ids(self)
    @api.onchange('elaboration_ids')
    Use onchange method instead of compute because if any other data of any line force a recompute of all lines and the elaboration custom notes are reset.

New fields (4)
  • active Boolean
    default=True
  • code Char
    string='Short Code'
  • elaboration_ids Many2many → product.elaboration
    column1='profile_id' column2='elaboration_id' comodel_name='product.elaboration' relation='product_elaboration_profile_rel' string='Elaborations'
  • name Char
    required=True translate=True
Public methods (0)

No public methods.

New fields (1)
  • elaboration_profile_id Many2one → product.elaboration.profile
    comodel_name='product.elaboration.profile' help='Keep this field empty to use the default value from the product category.' ondelete='restrict'
Public methods (0)

No public methods.

New fields (2)
  • elaboration_profile_id Many2one → product.elaboration.profile
    comodel_name='product.elaboration.profile' compute='_compute_elaboration_profile_id' help='Keep this field empty to use the default value from the product category.' inverse='_inverse_elaboration_profile_id' store=True
  • is_elaboration Boolean
Public methods (1)
  • create(self, vals_list)
    @api.model_create_multi

New fields (2)
  • group_elaboration_note_on_delivery_slip Boolean
    implied_group='sale_elaboration.group_elaboration_note_on_delivery_slip' args: 'Display Elaboration notes on Delivery Slips'
  • group_elaboration_note_on_picking_operations Boolean
    implied_group='sale_elaboration.group_elaboration_note_on_picking_operations' args: 'Display Elaboration notes on Picking Operations'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (4)
  • date_order Datetime
    related='order_id.date_order' string='Date'
  • elaboration_price_unit Float
    compute='_compute_elaboration_price_unit' store=True args: 'Elab. Price'
  • elaboration_profile_id Many2one → product.elaboration.profile
    comodel_name='product.elaboration.profile' compute='_compute_elaboration_profile_id'
  • route_id Many2one → stock.route
    comodel_name='stock.route' compute='_compute_route_id' readonly=False store=True
Public methods (1)
  • get_elaboration_stock_route(self)

New fields (4)
  • order_date Datetime
    compute='_compute_sale_related_data'
  • sale_id Many2one → sale.order
    comodel_name='sale.order' compute='_compute_sale_related_data'
  • salesman_id Many2one → res.users
    comodel_name='res.users' compute='_compute_sale_related_data'
  • sequence_code Char
    compute='_compute_sale_related_data'
Public methods (1)
  • write(self, vals)

New fields (2)
  • elaboration_ids Many2many
    related='move_id.elaboration_ids'
  • elaboration_note Char
    related='move_id.elaboration_note'
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.

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…