Sales - Project

sale_project
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/19.0/sale_project
VERSION
VERSION 0.1.0
CATEGORY
CATEGORYSales/Sales
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLEYes
AUTHORS
AUTHORSOdoo S.A.
MAINTAINERS
MAINTAINERSOdoo S.A.
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Xavier Morel, Aaron Bohy, Arnold Moyaux, Julien Castiaux, Victor Feyens, Julien Mougenot, svs-odoo, Carlos Lopez, Prakash Prajapati, Tiffany Chang (tic), Gorash, Mathieu Duckerts-Antoine, William Braeckman, Romain Estievenart, Audric Onockx (auon), Abdelouahab (abla), Renaud Thiry, Vincent Larcin, damr, alsh-odoo, Gaetan Vanden Bergh (gavb), Mylyna Hy, Victor Piryns (pivi), Thomas Becquevort (thbe), Levi Siuzdak (sile), Dylan Kiss (dyki), Julien Alardot (jual), Xavier Bol (xbo), Brieuc-brd, micheledic, rajh-odoo, Youssef Bashandy, Ethan Vincent, bary, Maxime de Neuville, suth-odoo, Mohamed GadAlrab, kcv-odoo, Louis Gobert, nihp-odoo, Hussein Ebrahim(hyhe), Mohammad Abdulmoneim, Pierre Pulinckx (PIPU), Maira Salazar (srma), st-yes, Mohammad Abdulmoneim (abdu), djameltouati, Michaël Mattiello, Pierre Pulinckx, Bastien PIERRE, K Theja (kthe), bona-odoo, Krzysztof Magusiak (krma), Omar (OSAH), mjvi-odoo, pajo, K Theja (kthe@odoo.com), Dirk Douglas, agbr-odoo, Dhwani Patel, oumaima-aarabe, assh-odoo, damrOdoo, Joe Wesnofske, dhtr-odoo, Abdelouahab Laaroussi (abla), maap-odoo, Matt Marcha, njor-odoo, nikhil, niyp-odoo, Dhruvkumar Nagar, makb-odoo, Ryan (rygea)
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 14:10:20
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - sale_management
    - sale
    - sales_team
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - html_editor
    - account_payment
    - account
    - onboarding
    - product
    - uom
    - analytic
    - portal
    - http_routing
    - auth_signup
    - digest
    - resource
    - payment
    - utm
    - sale_service
    - project_account
    - project
    - rating
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Allows to create task from your sales order
=============================================
This module allows to generate a project/task from sales orders.

Code Analysis

Views touched (31)
XML IDNameModelTypeStatus
portal_tasks_list_inherit portal_tasks_list_inherit ir.ui.view qweb Inherits project.portal_tasks_list
product_product_form_view_inherit_sale_project product.product.sale.project.form product.product field Inherits product.product_normal_form_view
product_template_form_view_inherit_sale_project product.template.sale.project.form product.template field Inherits sale.product_template_form_view
product_template_form_view_invoice_policy_inherit_sale_project product.template.inherit.sale.projectform product.template field Inherits sale.product_template_form_view
project_milestone_view_form project.milestone.view.form.inherit project.milestone xpath Inherits project.project_milestone_view_form
project_milestone_view_kanban_inherit_sale_project project.milestone.view.kanban.inherit project.milestone field Inherits project.project_milestone_view_kanban
project_milestone_view_tree project.milestone.view.list.inherit project.milestone xpath Inherits project.project_milestone_view_tree
project_project_view_form_simplified_inherit project.project.view.form.simplified.inherit project.project xpath Inherits project.project_project_view_form_simplified
project_project_view_form_simplified_template project.project.create.wizard.form project.template.create.wizard field Inherits project.project_project_view_form_simplified_template
project_project_view_inherit_project_filter project.project.select.inherit.project project.project xpath Inherits project.view_project_project_filter
project_project_view_tree_inherit_sale_project project.project.list.inherit.sale.project project.project xpath Inherits project.view_project
project_sharing_inherit_project_task_view_form project.task.view.inherit project.task div Inherits project.project_sharing_project_task_view_form
project_sharing_inherit_project_task_view_tree project.task.view.list.inherit project.task field Inherits project.project_sharing_project_task_view_tree
project_task_view_search project.task.search.inherit project.task field Inherits project.view_task_search_form_project_base
project_task_view_tree_main_base project.task.main.list.inherit project.task field Inherits project.project_task_view_tree_main_base
project_templates_view_list project.project.template.list project.project field Inherits project.project_templates_view_list
project_update_default_description project_update_default_description ir.ui.view qweb Inherits project.project_update_default_description
quick_create_task_form_res_partner project.task.form.quick_create.res.partner.inherit.sale_project project.task xpath Inherits project.quick_create_task_form_res_partner
sale_order_line_view_form_editable sale.order.line.view.form.editable sale.order.line form Inherits sale.sale_order_line_view_form_readonly
sale_project.milestone_deadline_inherit sale_project.milestone_deadline_inherit ir.ui.view qweb Inherits project.milestone_deadline
sale_project_view_form_simplified_template sale.project.create.wizard.form project.template.create.wizard field Inherits project.project_project_view_form_simplified_template
task_type_edit_inherit_sale_project project.task.type.form.inherit.sale_project project.task.type xpath Inherits project.task_type_edit
view_edit_project_inherit_form project.project.view.inherit project.project div Inherits project.edit_project
view_order_form_inherit_sale_project sale.order.form.sale.project sale.order button Inherits sale.view_order_form
view_order_line_tree_with_create sale.order.line.list.with.create sale.order.line list Inherits sale.view_order_line_tree
view_order_simple_form sale.order.form.from.task sale.order header Inherits sale.view_order_form
view_sale_project_inherit_form project.task.view.inherit project.task xpath Inherits project.view_task_form2
view_sale_project_quick_create_task_form project.task.view.inherit project.task xpath Inherits project.quick_create_task_form
view_sales_order_filter_inherit_sale_project sale.order.list.select.inherit.sale_project sale.order field Inherits sale.view_sales_order_filter
view_task_form_res_partner project.task.form.res.partner.inherit.sale_project project.task xpath Inherits project.view_task_form_res_partner
view_task_tree2_inherit_sale_project project.task.form.inherit.sale.project project.task xpath Inherits project.project_task_view_tree_base
Models touched (16)

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 (0)

No new fields.

Public methods (1)
  • write(self, vals)

New fields (6)
  • project_id Many2one → project.project
    company_dependent=True copy=True domain='[("is_template", "=", False)]' args: 'project.project', 'Project'
  • project_template_id Many2one → project.project
    company_dependent=True copy=True domain='[("is_template", "=", True)]' args: 'project.project', 'Project Template'
  • service_policy Selection
    compute='_compute_service_policy' compute_sudo=True inverse='_inverse_service_policy' string='Service Invoicing Policy' tracking=True args: '_selection_service_policy'
  • service_tracking Selection
    ondelete={'task_global_project': 'set default', 'task_in_project': 'set default', 'project_only': 'set default'} selection_add=[('task_global_project', 'Task'), ('task_in_project', 'Project & Task'), ('project_only', 'Project')]
  • service_type Selection
    selection_add=[('milestones', 'Project Milestones')]
  • task_template_id Many2one → project.task
    company_dependent=True compute='_compute_task_template' copy=True domain="[('is_template', '=', True), ('project_id', '=', project_id)]" readonly=False store=True args: 'project.task', 'Task Template'
Public methods (1)
  • write(self, vals)

New fields (7)
  • allow_billable Boolean
    export_string_translation=False related='project_id.allow_billable'
  • product_uom_id Many2one
    export_string_translation=False related='sale_line_id.product_uom_id'
  • product_uom_qty Float
    compute='_compute_product_uom_qty' compute_sudo=True readonly=False args: 'Quantity'
  • project_partner_id Many2one
    export_string_translation=False related='project_id.partner_id'
  • quantity_percentage Float
    compute='_compute_quantity_percentage' help='Percentage of the ordered quantity that will automatically be delivered once the milestone is reached.' store=True args: 'Quantity (%)'
  • sale_line_display_name Char
    export_string_translation=False related='sale_line_id.display_name' args: 'Sale Line Display Name'
  • sale_line_id Many2one → sale.order.line
    default=_default_sale_line_id domain="[('order_partner_id', '=?', project_partner_id), ('qty_delivered_method', '=', 'milestones')]" help='Sales Order Item that will be updated once the milestone is reached.' index='btree_not_null' args: 'sale.order.line', 'Sales Order Item'
Public methods (1)
  • action_view_sale_order(self)

New fields (13)
  • allow_billable Boolean
    args: 'Billable'
  • display_sales_stat_buttons Boolean
    compute='_compute_display_sales_stat_buttons' export_string_translation=False
  • has_any_so_to_invoice Boolean
    compute='_compute_has_any_so_to_invoice' export_string_translation=False args: 'Has SO to Invoice'
  • has_any_so_with_nothing_to_invoice Boolean
    compute='_compute_has_any_so_with_nothing_to_invoice' export_string_translation=False args: 'Has a SO with an invoice status of No'
  • invoice_count Integer
    compute='_compute_invoice_count' export_string_translation=False groups='account.group_account_readonly'
  • partner_id Many2one
    compute='_compute_partner_id' readonly=False store=True
  • reinvoiced_sale_order_id Many2one → sale.order
    copy=False domain="[('partner_id', '=', partner_id)]" groups='sales_team.group_sale_salesman' help='Products added to stock pickings, whose operation type is configured to generate analytic costs, will be re-invoiced in this sales order if they are set up for it.' index='btree_not_null' string='Sales Order' args: 'sale.order'
  • sale_line_id Many2one → sale.order.line
    compute='_compute_sale_line_id' copy=False domain=<expr> help='Sales order item that will be selected by default on the tasks and timesheets of this project, except if the employee set on the timesheets is explicitely linked to another sales order item on the project.\nIt can be modified on each task and timesheet entry individually if necessary.' index='btree_not_null' readonly=False store=True args: 'sale.order.line', 'Sales Order Item'
  • sale_order_count Integer
    compute='_compute_sale_order_count' export_string_translation=False groups='sales_team.group_sale_salesman'
  • sale_order_id Many2one
    export_string_translation=False related='sale_line_id.order_id'
  • sale_order_line_count Integer
    compute='_compute_sale_order_count' export_string_translation=False groups='sales_team.group_sale_salesman'
  • sale_order_state Selection
    export_string_translation=False related='sale_order_id.state' tracking=False
  • vendor_bill_count Integer
    compute_sudo=False export_string_translation=False groups='account.group_account_readonly' related='account_id.vendor_bill_count'
Public methods (15)
  • action_create_invoice(self)
  • action_customer_preview(self)
  • action_get_list_view(self)
  • action_open_project_invoices(self)
  • action_open_project_vendor_bills(self)
  • action_profitability_items(self, section_name, domain=None, res_id=False)
  • action_view_sols(self)
  • action_view_sos(self)
  • action_view_tasks(self)
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields)
    @api.model
  • get_panel_data(self)
  • get_sale_items_data(self, offset=0, limit=None, with_action=True, section_id=None)
  • template_to_project_confirmation_callback(self, callbacks)
  • write(self, vals)

New fields (8)
  • allow_billable Boolean
    related='project_id.allow_billable'
  • display_sale_order_button Boolean
    compute='_compute_display_sale_order_button' string='Display Sales Order'
  • partner_id Many2one
    inverse='_inverse_partner_id'
  • project_sale_order_id Many2one → sale.order
    related='project_id.sale_order_id' string="Project's sale order" args: 'sale.order'
  • sale_line_id Many2one → sale.order.line
    compute='_compute_sale_line' context={'with_remaining_hours': True} copy=True domain=<expr> help='Sales Order Item to which the time spent on this task will be added in order to be invoiced to your customer.\nBy default the sales order item set on the project will be selected. In the absence of one, the last prepaid sales order item that has time remaining will be used.\nRemove the sales order item in order to make this task non billable. You can also change or remove the sales order item of each timesheet entry individually.' index='btree_not_null' readonly=False recursive=True store=True tracking=True args: 'sale.order.line', 'Sales Order Item'
  • sale_order_id Many2one → sale.order
    compute='_compute_sale_order_id' group_expand='_group_expand_sales_order' help='Sales order to which the task is linked.' store=True args: 'sale.order', 'Sales Order'
  • sale_order_state Selection
    related='sale_order_id.state' tracking=False
  • task_to_invoice Boolean
    compute='_compute_task_to_invoice' groups='sales_team.group_sale_salesman_all_leads' search='_search_task_to_invoice' args: 'To invoice'
Public methods (6)
  • TASK_PORTAL_READABLE_FIELDS(self)
    @property
  • action_project_sharing_view_so(self)
  • action_view_so(self)
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields)
    @api.model
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • show_rating_active Boolean
    compute='_compute_show_rating_active' export_string_translation=False
Public methods (0)

No public methods.

New fields (3)
  • allow_billable Boolean
    related='template_id.allow_billable'
  • partner_id Many2one → res.partner
    args: 'res.partner'
  • role_to_users_ids One2many
    compute='_compute_role_to_users_ids' readonly=False store=True
Public methods (2)
  • action_create_project_from_so(self)
    Create a project either from template or directly if no template is set.
  • action_open_template_view(self)
    @api.model

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • sale_line_id Many2one → sale.order.line
    readonly=True string='Sales Order Item' args: 'sale.order.line'
  • sale_order_id Many2one → sale.order
    readonly=True string='Sales Order' args: 'sale.order'
Public methods (0)

No public methods.

New fields (13)
  • closed_task_count Integer
    compute='_compute_tasks_ids' export_string_translation=False groups='project.group_project_user'
  • completed_task_percentage Float
    compute='_compute_completed_task_percentage' export_string_translation=False groups='project.group_project_user'
  • is_product_milestone Boolean
    compute='_compute_is_product_milestone' export_string_translation=False
  • milestone_count Integer
    compute='_compute_milestone_count' export_string_translation=False
  • project_account_id Many2one → account.analytic.account
    related='project_id.account_id' args: 'account.analytic.account'
  • project_count Integer
    compute='_compute_project_ids' export_string_translation=False groups='project.group_project_user' string='Number of Projects'
  • project_id Many2one → project.project
    copy=False domain=[('allow_billable', '=', True), ('is_template', '=', False)] help='A task will be created for the project upon sales order confirmation. The analytic distribution of this project will also serve as a reference for newly created sales order items.' index='btree_not_null' args: 'project.project'
  • project_ids Many2many → project.project
    compute='_compute_project_ids' copy=False export_string_translation=False groups='project.group_project_user,project.group_project_milestone' string='Projects' args: 'project.project'
  • show_create_project_button Boolean
    compute='_compute_show_project_and_task_button' export_string_translation=False groups='project.group_project_user'
  • show_project_button Boolean
    compute='_compute_show_project_and_task_button' export_string_translation=False groups='project.group_project_user'
  • tasks_count Integer
    compute='_compute_tasks_ids' export_string_translation=False groups='project.group_project_user' string='Tasks'
  • tasks_ids Many2many → project.task
    compute='_compute_tasks_ids' export_string_translation=False groups='project.group_project_user' search='_search_tasks_ids' string='Tasks associated with this sale' args: 'project.task'
  • visible_project Boolean
    compute='_compute_visible_project' export_string_translation=False readonly=True args: 'Display project'
Public methods (8)
  • action_confirm(self)
  • action_create_project(self)
  • action_view_milestone(self)
  • action_view_project_ids(self)
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields)
    @api.model
  • get_first_service_line(self)
  • write(self, vals)

New fields (4)
  • project_id Many2one → project.project
    copy=False export_string_translation=False index=True args: 'project.project', 'Generated Project'
  • qty_delivered_method Selection
    selection_add=[('milestones', 'Milestones')]
  • reached_milestones_ids One2many → project.milestone
    domain=[('is_reached', '=', True)] export_string_translation=False string='Reached Milestones' args: 'project.milestone', 'sale_line_id'
  • task_id Many2one → project.task
    copy=False export_string_translation=False index=True args: 'project.task', 'Generated Task'
Public methods (4)
  • copy_data(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields)
    @api.model
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • project_id Many2one → project.project
    comodel_name='project.project' readonly=True
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/18.0/sale_project
VERSION
VERSION 0.1.0
CATEGORY
CATEGORYHidden
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLEYes
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Denis Ledoux, qdp-odoo, Aaron Bohy, Odoo Online, Victor Feyens, Andrea Grazioso (agr-odoo), Adrien Dieudonné, Carlos Lopez, Prakash Prajapati, Tiffany Chang (tic), Rémy Voet (ryv), Gorash, William Braeckman, Audric Onockx (auon), Abdelouahab (abla), Hubert Van De Walle, Renaud Thiry, Vincent Larcin, damr, Thomas Lefebvre (thle), Gaetan Vanden Bergh (gavb), Walid, Mylyna Hy, Victor Piryns (pivi), Thomas Becquevort (thbe), Gauthier Wala (gawa), Pieter Claeys (clpi), Levi Siuzdak (sile), Dylan Kiss (dyki), Julien Alardot (jual), Hugo Carlier (Huca), bram1000, Xavier Bol (xbo), omra-odoo, Andrzej(pian), rajh-odoo, Paul Stroobant, Mattis Megevand, Youssef Bashandy, Ethan Vincent, lase@odoo.com, bary, Maxime de Neuville, suth-odoo, mizosoft, reka-odoo, Mohamed GadAlrab, Abderraouf Ghrissi (abgh), kcv-odoo, Louis Gobert, dise, Louis (wil), Hussein Ebrahim(hyhe), Mohammad Abdulmoneim, Pierre Pulinckx (PIPU), Maira Salazar (srma), st-yes, djameltouati, Lucas Lefèvre (lul), Bastien PIERRE, K Theja (kthe), kpt-odoo, kusi-odoo, Bastien (bvdn), bona-odoo, Krzysztof Magusiak (krma), Omar (OSAH), rupa-odoo, Maeva De Keyser (MDEK), mjvi-odoo, Gurpreet Singh, pajo, mojem, dise-odoo, Dirk Douglas, agbr-odoo, Dhwani Patel, saurabh, Abdelouahab Laaroussi (abla), Arnaud Gony, maap-odoo, Matt Marcha, njor-odoo
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:25:58
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - sale_management
    - sale
    - sales_team
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - html_editor
    - account_payment
    - account
    - onboarding
    - product
    - uom
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
    - payment
    - utm
    - sale_service
    - project_account
    - project
    - rating
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Allows to create task from your sales order
=============================================
This module allows to generate a project/task from sales orders.

Code Analysis

Views touched (23)
XML IDNameModelTypeStatus
portal_tasks_list_inherit portal_tasks_list_inherit ir.ui.view qweb Inherits project.portal_tasks_list
product_template_form_view_invoice_policy_inherit_sale_project product.template.inherit.sale.projectform product.template field Inherits sale.product_template_form_view
project_milestone_view_form project.milestone.view.form.inherit project.milestone xpath Inherits project.project_milestone_view_form
project_milestone_view_tree project.milestone.view.list.inherit project.milestone xpath Inherits project.project_milestone_view_tree
project_project_view_form_simplified_inherit project.project.view.form.simplified.inherit project.project xpath Inherits project.project_project_view_form_simplified
project_project_view_inherit_project_filter project.project.select.inherit.project project.project xpath Inherits project.view_project_project_filter
project_project_view_tree_inherit_sale_project project.project.list.inherit.sale.project project.project xpath Inherits project.view_project
project_sharing_inherit_project_task_view_form project.task.view.inherit project.task div Inherits project.project_sharing_project_task_view_form
project_sharing_inherit_project_task_view_tree project.task.view.list.inherit project.task field Inherits project.project_sharing_project_task_view_tree
project_task_view_search project.task.search.inherit project.task field Inherits project.view_task_search_form_project_base
project_task_view_tree_main_base project.task.main.list.inherit project.task field Inherits project.project_task_view_tree_main_base
quick_create_task_form_res_partner project.task.form.quick_create.res.partner.inherit.sale_project project.task xpath Inherits project.quick_create_task_form_res_partner
sale_order_line_view_form_editable sale.order.line.view.form.editable sale.order.line form Inherits sale.sale_order_line_view_form_readonly
sale_project.milestone_deadline_inherit sale_project.milestone_deadline_inherit ir.ui.view qweb Inherits project.milestone_deadline
sale_project_milestone_view_tree project.milestone.view.list.inherit project.milestone xpath Inherits sale_project.project_milestone_view_tree
view_edit_project_inherit_form project.project.view.inherit project.project div Inherits project.edit_project
view_order_form_inherit_sale_project sale.order.form.sale.project sale.order xpath Inherits sale.view_order_form
view_order_line_tree_with_create sale.order.line.list.with.create sale.order.line list Inherits sale.view_order_line_tree
view_sale_project_inherit_form project.task.view.inherit project.task xpath Inherits project.view_task_form2
view_sale_project_quick_create_task_form project.task.view.inherit project.task xpath Inherits project.quick_create_task_form
view_sales_order_filter_inherit_sale_project sale.order.list.select.inherit.sale_project sale.order field Inherits sale.view_sales_order_filter
view_task_form_res_partner project.task.form.res.partner.inherit.sale_project project.task xpath Inherits project.view_task_form_res_partner
view_task_tree2_inherit_sale_project project.task.form.inherit.sale.project project.task xpath Inherits project.project_task_view_tree_base
Models touched (14)

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 (0)

No new fields.

Public methods (1)
  • write(self, vals)

New fields (5)
  • project_id Many2one → project.project
    company_dependent=True copy=True args: 'project.project', 'Project'
  • project_template_id Many2one → project.project
    company_dependent=True copy=True args: 'project.project', 'Project Template'
  • service_policy Selection
    compute='_compute_service_policy' compute_sudo=True inverse='_inverse_service_policy' string='Service Invoicing Policy' tracking=True args: '_selection_service_policy'
  • service_tracking Selection
    ondelete={'task_global_project': 'set default', 'task_in_project': 'set default', 'project_only': 'set default'} selection_add=[('task_global_project', 'Task'), ('task_in_project', 'Project & Task'), ('project_only', 'Project')]
  • service_type Selection
    selection_add=[('milestones', 'Project Milestones')]
Public methods (1)
  • write(self, vals)

New fields (7)
  • allow_billable Boolean
    export_string_translation=False related='project_id.allow_billable'
  • product_uom Many2one
    export_string_translation=False related='sale_line_id.product_uom'
  • product_uom_qty Float
    compute='_compute_product_uom_qty' compute_sudo=True readonly=False args: 'Quantity'
  • project_partner_id Many2one
    export_string_translation=False related='project_id.partner_id'
  • quantity_percentage Float
    compute='_compute_quantity_percentage' help='Percentage of the ordered quantity that will automatically be delivered once the milestone is reached.' store=True args: 'Quantity (%)'
  • sale_line_display_name Char
    export_string_translation=False related='sale_line_id.display_name' args: 'Sale Line Display Name'
  • sale_line_id Many2one → sale.order.line
    default=_default_sale_line_id domain="[('order_partner_id', '=?', project_partner_id), ('qty_delivered_method', '=', 'milestones')]" help='Sales Order Item that will be updated once the milestone is reached.' args: 'sale.order.line', 'Sales Order Item'
Public methods (1)
  • action_view_sale_order(self)

New fields (13)
  • allow_billable Boolean
    args: 'Billable'
  • display_sales_stat_buttons Boolean
    compute='_compute_display_sales_stat_buttons' export_string_translation=False
  • has_any_so_to_invoice Boolean
    compute='_compute_has_any_so_to_invoice' export_string_translation=False args: 'Has SO to Invoice'
  • has_any_so_with_nothing_to_invoice Boolean
    compute='_compute_has_any_so_with_nothing_to_invoice' export_string_translation=False args: 'Has a SO with an invoice status of No'
  • invoice_count Integer
    compute='_compute_invoice_count' export_string_translation=False groups='account.group_account_readonly'
  • partner_id Many2one
    compute='_compute_partner_id' readonly=False store=True
  • reinvoiced_sale_order_id Many2one → sale.order
    copy=False domain="[('partner_id', '=', partner_id)]" groups='sales_team.group_sale_salesman' help='Products added to stock pickings, whose operation type is configured to generate analytic costs, will be re-invoiced in this sales order if they are set up for it.' index='btree_not_null' string='Sales Order' args: 'sale.order'
  • sale_line_id Many2one → sale.order.line
    compute='_compute_sale_line_id' copy=False domain=<expr> help='Sales order item that will be selected by default on the tasks and timesheets of this project, except if the employee set on the timesheets is explicitely linked to another sales order item on the project.\nIt can be modified on each task and timesheet entry individually if necessary.' index='btree_not_null' readonly=False store=True args: 'sale.order.line', 'Sales Order Item'
  • sale_order_count Integer
    compute='_compute_sale_order_count' export_string_translation=False groups='sales_team.group_sale_salesman'
  • sale_order_id Many2one
    export_string_translation=False related='sale_line_id.order_id'
  • sale_order_line_count Integer
    compute='_compute_sale_order_count' export_string_translation=False groups='sales_team.group_sale_salesman'
  • sale_order_state Selection
    export_string_translation=False related='sale_order_id.state' tracking=False
  • vendor_bill_count Integer
    export_string_translation=False groups='account.group_account_readonly' related='account_id.vendor_bill_count'
Public methods (13)
  • action_create_invoice(self)
  • action_customer_preview(self)
  • action_get_list_view(self)
  • action_open_project_invoices(self)
  • action_open_project_vendor_bills(self)
  • action_profitability_items(self, section_name, domain=None, res_id=False)
  • action_view_sols(self)
  • action_view_sos(self)
  • action_view_tasks(self)
  • create(self, vals_list)
    @api.model_create_multi
  • get_panel_data(self)
  • get_sale_items_data(self, offset=0, limit=None, with_action=True, section_id=None)
  • write(self, vals)

New fields (8)
  • allow_billable Boolean
    related='project_id.allow_billable'
  • display_sale_order_button Boolean
    compute='_compute_display_sale_order_button' string='Display Sales Order'
  • partner_id Many2one
    inverse='_inverse_partner_id'
  • project_sale_order_id Many2one → sale.order
    related='project_id.sale_order_id' string="Project's sale order" args: 'sale.order'
  • sale_line_id Many2one → sale.order.line
    compute='_compute_sale_line' copy=True domain=<expr> help='Sales Order Item to which the time spent on this task will be added in order to be invoiced to your customer.\nBy default the sales order item set on the project will be selected. In the absence of one, the last prepaid sales order item that has time remaining will be used.\nRemove the sales order item in order to make this task non billable. You can also change or remove the sales order item of each timesheet entry individually.' index='btree_not_null' readonly=False recursive=True store=True tracking=True args: 'sale.order.line', 'Sales Order Item'
  • sale_order_id Many2one → sale.order
    compute='_compute_sale_order_id' group_expand='_group_expand_sales_order' help='Sales order to which the task is linked.' store=True args: 'sale.order', 'Sales Order'
  • sale_order_state Selection
    related='sale_order_id.state' tracking=False
  • task_to_invoice Boolean
    compute='_compute_task_to_invoice' groups='sales_team.group_sale_salesman_all_leads' search='_search_task_to_invoice' args: 'To invoice'
Public methods (5)
  • SELF_READABLE_FIELDS(self)
    @property
  • action_project_sharing_view_so(self)
  • action_view_so(self)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • sale_line_id Many2one → sale.order.line
    readonly=True string='Sales Order Item' args: 'sale.order.line'
  • sale_order_id Many2one → sale.order
    readonly=True string='Sales Order' args: 'sale.order'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • set_values(self)

New fields (14)
  • closed_task_count Integer
    compute='_compute_tasks_ids' export_string_translation=False
  • completed_task_percentage Float
    compute='_compute_completed_task_percentage' export_string_translation=False
  • is_product_milestone Boolean
    compute='_compute_is_product_milestone' export_string_translation=False
  • milestone_count Integer
    compute='_compute_milestone_count' export_string_translation=False
  • project_account_id Many2one → account.analytic.account
    related='project_id.account_id' args: 'account.analytic.account'
  • project_count Integer
    compute='_compute_project_ids' export_string_translation=False groups='project.group_project_user' string='Number of Projects'
  • project_id Many2one → project.project
    copy=False domain=[('allow_billable', '=', True)] help='A task will be created for the project upon sales order confirmation. The analytic distribution of this project will also serve as a reference for newly created sales order items.' index='btree_not_null' args: 'project.project'
  • project_ids Many2many → project.project
    compute='_compute_project_ids' copy=False export_string_translation=False groups='project.group_project_user,project.group_project_milestone' string='Projects' args: 'project.project'
  • show_create_project_button Boolean
    compute='_compute_show_project_and_task_button' export_string_translation=False groups='project.group_project_user'
  • show_project_button Boolean
    compute='_compute_show_project_and_task_button' export_string_translation=False groups='project.group_project_user'
  • show_task_button Boolean
    compute='_compute_show_project_and_task_button' export_string_translation=False groups='project.group_project_user'
  • tasks_count Integer
    compute='_compute_tasks_ids' export_string_translation=False groups='project.group_project_user' string='Tasks'
  • tasks_ids Many2many → project.task
    compute='_compute_tasks_ids' export_string_translation=False search='_search_tasks_ids' string='Tasks associated with this sale' args: 'project.task'
  • visible_project Boolean
    compute='_compute_visible_project' export_string_translation=False readonly=True args: 'Display project'
Public methods (6)
  • action_create_project(self)
  • action_view_milestone(self)
  • action_view_project_ids(self)
  • action_view_task(self)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, values)

New fields (4)
  • project_id Many2one → project.project
    copy=False export_string_translation=False index=True args: 'project.project', 'Generated Project'
  • qty_delivered_method Selection
    selection_add=[('milestones', 'Milestones')]
  • reached_milestones_ids One2many → project.milestone
    domain=[('is_reached', '=', True)] export_string_translation=False string='Reached Milestones' args: 'project.milestone', 'sale_line_id'
  • task_id Many2one → project.task
    copy=False export_string_translation=False index=True args: 'project.task', 'Generated Task'
Public methods (5)
  • copy_data(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields)
  • name_create(self, name)
    @api.model
  • write(self, values)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • project_id Many2one → project.project
    comodel_name='project.project' readonly=True
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/17.0/sale_project
VERSION
VERSION 0.1.0
CATEGORY
CATEGORYHidden
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLEYes
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Denis Ledoux, Xavier Morel, qdp-odoo, Aaron Bohy, Barad Mahendra, Odoo Online, Jorge Pinna Puissant, Victor Feyens, Andrea Grazioso (agr-odoo), Samuel Degueldre, Carlos Lopez, Nasreddin Boulif (bon), Prakash Prajapati, Tiffany Chang (tic), Rémy Voet (ryv), Gorash, Pierre Paridans, Xavier BOL (xbo), william-andre, Audric Onockx (auon), Abdelouahab (abla), gawa-odoo, Hubert Van De Walle, Valentin Chevalier, Vincent Larcin, niyasraphy, damr, Thomas Lefebvre (thle), Louis Wicket (wil), Walid, Gurupreet Singh, Victor Piryns (pivi), Levi Siuzdak (sile), Maruan Aguerdouh (magm), Dylan Kiss (dyki), hupo-odoo, Kamlesh Pathekar, Michael (mcm), Raouf, Kartik Chavda, Hugo Carlier (Huca), Xavier Bol (xbo), Brieuc-brd, SilvioC2C, Andrzej(pian), Paul Stroobant, ravb-odoo, Youssef Bashandy, Ethan Vincent, lase@odoo.com, bary, Maxime de Neuville, suth-odoo, mizosoft, Eteil Djoumatchoua(etdj) etdj@odoo.com, Mohamed GadAlrab, Abderraouf Ghrissi (abgh), kcv-odoo, Tanguy Quéguineur, Louis (wil), Adesh Jolhe (adjo), Antoine (anso), luve-odoo, Chris Duvivier, Dhrumil Shah, Ritika Shekhawat, hiroh-odoo, Panagiotis Kyriakou, Bastien (bvdn), bona-odoo, rupa-odoo, Maeva De Keyser (MDEK), mjvi-odoo, defl, Dirk Douglas, agbr-odoo, Maxime de Neuville (mane), Rohit Kumar
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:02:09
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - sale_management
    - sale
    - sales_team
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - account_payment
    - account
    - onboarding
    - product
    - uom
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
    - payment
    - utm
    - sale_service
    - project_account
    - project
    - rating
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Allows to create task from your sales order
=============================================
This module allows to generate a project/task from sales orders.

Code Analysis

Views touched (18)
XML IDNameModelTypeStatus
portal_tasks_list_inherit portal_tasks_list_inherit ir.ui.view qweb Inherits project.portal_tasks_list
product_template_form_view_invoice_policy_inherit_sale_project product.template.inherit.sale.projectform product.template field Inherits sale.product_template_form_view
project_milestone_view_form project.milestone.view.form.inherit project.milestone xpath Inherits project.project_milestone_view_form
project_milestone_view_tree project.milestone.view.tree.inherit project.milestone xpath Inherits project.project_milestone_view_tree
project_project_view_form_simplified_inherit project.project.view.form.simplified.inherit project.project xpath Inherits project.project_project_view_form_simplified
project_project_view_inherit_project_filter project.project.select.inherit.project project.project xpath Inherits project.view_project_project_filter
project_project_view_tree_inherit_sale_project project.project.tree.inherit.sale.project project.project xpath Inherits project.view_project
project_sharing_inherit_project_task_view_form project.task.view.inherit project.task div Inherits project.project_sharing_project_task_view_form
project_task_view_search project.task.search.inherit project.task field Inherits project.view_task_search_form_project_base
project_task_view_tree_main_base project.task.main.tree.inherit project.task field Inherits project.project_task_view_tree_main_base
sale_order_line_view_form_editable sale.order.line.view.form.editable sale.order.line form Inherits sale.sale_order_line_view_form_readonly
sale_project_milestone_view_tree project.milestone.view.tree.inherit project.milestone xpath Inherits sale_project.project_milestone_view_tree
view_edit_project_inherit_form project.project.view.inherit project.project div Inherits project.edit_project
view_order_form_inherit_sale_project sale.order.form.sale.project sale.order button Inherits sale.view_order_form
view_order_line_tree_with_create sale.order.line.tree.with.create sale.order.line tree Inherits sale.view_order_line_tree
view_sale_project_inherit_form project.task.view.inherit project.task xpath Inherits project.view_task_form2
view_sale_project_quick_create_task_form project.task.view.inherit project.task xpath Inherits project.quick_create_task_form
view_task_tree2_inherit_sale_project project.task.form.inherit.sale.project project.task xpath Inherits project.project_task_view_tree_base
Models touched (12)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • write(self, vals)

New fields (5)
  • project_id Many2one → project.project
    company_dependent=True args: 'project.project', 'Project'
  • project_template_id Many2one → project.project
    company_dependent=True copy=True args: 'project.project', 'Project Template'
  • service_policy Selection
    compute='_compute_service_policy' compute_sudo=True inverse='_inverse_service_policy' string='Service Invoicing Policy' args: '_selection_service_policy'
  • service_tracking Selection
    default='no' help="On Sales order confirmation, this product can generate a project and/or task. From those, you can track the service you are selling.\n 'In sale order's project': Will use the sale order's configured project if defined or fallback to creating a new project based on the selected template." selection=[('no', 'Nothing'), ('task_global_project', 'Task'), ('task_in_project', 'Project & Task'), ('project_only', 'Project')] string='Create on Order'
  • service_type Selection
    selection_add=[('milestones', 'Project Milestones')]
Public methods (1)
  • write(self, vals)

New fields (7)
  • allow_billable Boolean
    related='project_id.allow_billable'
  • product_uom Many2one
    related='sale_line_id.product_uom'
  • product_uom_qty Float
    compute='_compute_product_uom_qty' compute_sudo=True readonly=False args: 'Quantity'
  • project_partner_id Many2one
    related='project_id.partner_id'
  • quantity_percentage Float
    compute='_compute_quantity_percentage' help='Percentage of the ordered quantity that will automatically be delivered once the milestone is reached.' store=True args: 'Quantity (%)'
  • sale_line_display_name Char
    related='sale_line_id.display_name' args: 'Sale Line Display Name'
  • sale_line_id Many2one → sale.order.line
    default=_default_sale_line_id domain="[('order_partner_id', '=?', project_partner_id), ('qty_delivered_method', '=', 'milestones')]" help='Sales Order Item that will be updated once the milestone is reached.' args: 'sale.order.line', 'Sales Order Item'
Public methods (1)
  • action_view_sale_order(self)

New fields (11)
  • allow_billable Boolean
    args: 'Billable'
  • display_sales_stat_buttons Boolean
    compute='_compute_display_sales_stat_buttons'
  • has_any_so_to_invoice Boolean
    compute='_compute_has_any_so_to_invoice' args: 'Has SO to Invoice'
  • has_any_so_with_nothing_to_invoice Boolean
    compute='_compute_has_any_so_with_nothing_to_invoice' args: 'Has a SO with an invoice status of No'
  • invoice_count Integer
    compute='_compute_invoice_count' groups='account.group_account_readonly'
  • partner_id Many2one
    compute='_compute_partner_id' readonly=False store=True
  • sale_line_id Many2one → sale.order.line
    compute='_compute_sale_line_id' copy=False domain=<expr> help='Sales order item that will be selected by default on the tasks and timesheets of this project, except if the employee set on the timesheets is explicitely linked to another sales order item on the project.\nIt can be modified on each task and timesheet entry individually if necessary.' index='btree_not_null' readonly=False store=True args: 'sale.order.line', 'Sales Order Item'
  • sale_order_count Integer
    compute='_compute_sale_order_count' groups='sales_team.group_sale_salesman'
  • sale_order_id Many2one
    help='Sales order to which the project is linked.' related='sale_line_id.order_id' string='Sales Order'
  • sale_order_line_count Integer
    compute='_compute_sale_order_count' groups='sales_team.group_sale_salesman'
  • vendor_bill_count Integer
    groups='account.group_account_readonly' related='analytic_account_id.vendor_bill_count'
Public methods (13)
  • action_create_invoice(self)
  • action_get_list_view(self)
  • action_open_project_invoices(self)
  • action_open_project_vendor_bills(self)
  • action_profitability_items(self, section_name, domain=None, res_id=False)
  • action_project_sharing(self)
  • action_view_sols(self)
  • action_view_sos(self)
  • action_view_tasks(self)
  • create(self, vals_list)
    @api.model_create_multi
  • get_panel_data(self)
  • get_sale_items_data(self, domain=None, offset=0, limit=None, with_action=True)
  • write(self, vals)

New fields (6)
  • allow_billable Boolean
    related='project_id.allow_billable'
  • display_sale_order_button Boolean
    compute='_compute_display_sale_order_button' string='Display Sales Order'
  • project_sale_order_id Many2one → sale.order
    related='project_id.sale_order_id' string="Project's sale order" args: 'sale.order'
  • sale_line_id Many2one → sale.order.line
    compute='_compute_sale_line' copy=True domain=<expr> help='Sales Order Item to which the time spent on this task will be added in order to be invoiced to your customer.\nBy default the sales order item set on the project will be selected. In the absence of one, the last prepaid sales order item that has time remaining will be used.\nRemove the sales order item in order to make this task non billable. You can also change or remove the sales order item of each timesheet entry individually.' index='btree_not_null' readonly=False recursive=True store=True tracking=True args: 'sale.order.line', 'Sales Order Item'
  • sale_order_id Many2one → sale.order
    compute='_compute_sale_order_id' group_expand='_group_expand_sales_order' help='Sales order to which the task is linked.' store=True args: 'sale.order', 'Sales Order'
  • task_to_invoice Boolean
    compute='_compute_task_to_invoice' groups='sales_team.group_sale_salesman_all_leads' search='_search_task_to_invoice' args: 'To invoice'
Public methods (5)
  • SELF_READABLE_FIELDS(self)
    @property
  • action_project_sharing_view_so(self)
  • action_view_so(self)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • sale_line_id Many2one → sale.order.line
    readonly=True string='Sales Order Item' args: 'sale.order.line'
  • sale_order_id Many2one → sale.order
    readonly=True string='Sales Order' args: 'sale.order'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • set_values(self)

New fields (11)
  • is_product_milestone Boolean
    compute='_compute_is_product_milestone'
  • milestone_count Integer
    compute='_compute_milestone_count'
  • project_count Integer
    compute='_compute_project_ids' groups='project.group_project_user' string='Number of Projects'
  • project_id Many2one → project.project
    help='Select a non billable project on which tasks can be created.' args: 'project.project', 'Project'
  • project_ids Many2many → project.project
    compute='_compute_project_ids' copy=False groups='project.group_project_user,project.group_project_milestone' help='Projects used in this sales order.' string='Projects' args: 'project.project'
  • show_create_project_button Boolean
    compute='_compute_show_project_and_task_button' groups='project.group_project_user'
  • show_project_button Boolean
    compute='_compute_show_project_and_task_button' groups='project.group_project_user'
  • show_task_button Boolean
    compute='_compute_show_project_and_task_button' groups='project.group_project_user'
  • tasks_count Integer
    compute='_compute_tasks_ids' groups='project.group_project_user' string='Tasks'
  • tasks_ids Many2many → project.task
    compute='_compute_tasks_ids' search='_search_tasks_ids' string='Tasks associated to this sale' args: 'project.task'
  • visible_project Boolean
    compute='_compute_visible_project' readonly=True args: 'Display project'
Public methods (6)
  • action_create_project(self)
  • action_view_milestone(self)
  • action_view_project_ids(self)
  • action_view_task(self)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, values)

New fields (4)
  • project_id Many2one → project.project
    copy=False index=True args: 'project.project', 'Generated Project'
  • qty_delivered_method Selection
    selection_add=[('milestones', 'Milestones')]
  • reached_milestones_ids One2many → project.milestone
    domain=[('is_reached', '=', True)] string='Reached Milestones' args: 'project.milestone', 'sale_line_id'
  • task_id Many2one → project.task
    copy=False index=True args: 'project.task', 'Generated Task'
Public methods (4)
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields)
  • name_create(self, name)
    @api.model
  • write(self, values)

New fields (0)

No new fields.

Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/16.0/sale_project
VERSION
VERSION 0.1.0
CATEGORY
CATEGORYHidden
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLEYes
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Thibault Delavallée, Denis Ledoux, Aaron Bohy, GitHub, Barad Mahendra, Yannick Tivisse, Pierre Masereel, Romeo Fragomeli, Victor Feyens, Luis González, Achraf (abz), Nasreddin Boulif (bon), Touati Djamel (otd), Prakash Prajapati, Tiffany Chang (tic), Gorash, William Braeckman, Xavier BOL (xbo), momegahed, Nicolas (vin), Krzysztof Magusiak, Audric Onockx (auon), william, Yolann Sabaux, Abdelouahab (abla), Laurent Stukkens (LTU), gawa-odoo, Roy Le, Vincent Larcin, damr, Thomas Lefebvre (thle), Walid, Gurupreet Singh, Victor Piryns (pivi), Maruan Aguerdouh (magm), hupo-odoo, Kamlesh Pathekar, Cedric Prieels (cpr), Raouf, Kartik Chavda, Xavier Bol (xbo), Andrzej(pian), Nidhi Patel, Youssef Bashandy, Eteil Djoumatchoua(etdj), Maxime de Neuville, suth-odoo, Mohamed GadAlrab, Abderraouf Ghrissi (abgh), kcv-odoo, Martin Trigaux (mat), Adesh Jolhe (adjo), ampa-odoo, Rohitkumar (roku), Manushi Shah (mash), Antoine (anso), Panagiotis Kyriakou
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:40:53
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - sale_management
    - sale
    - sales_team
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - account_payment
    - account
    - product
    - uom
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
    - payment
    - utm
    - project
    - rating
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Allows to create task from your sales order
=============================================
This module allows to generate a project/task from sales orders.

Code Analysis

Views touched (14)
XML IDNameModelTypeStatus
portal_tasks_list_inherit portal_tasks_list_inherit ir.ui.view qweb Inherits project.portal_tasks_list
product_template_form_view_invoice_policy_inherit_sale_project product.template.inherit.sale.projectform product.template field Inherits sale.product_template_form_view
project_milestone_view_form project.milestone.view.form.inherit project.milestone xpath Inherits project.project_milestone_view_form
project_milestone_view_tree project.milestone.view.tree.inherit project.milestone xpath Inherits project.project_milestone_view_tree
project_project_view_inherit_project_filter project.project.select.inherit.project project.project xpath Inherits project.view_project_project_filter
project_project_view_tree_inherit_sale_project project.project.tree.inherit.sale.project project.project xpath Inherits project.view_project
project_sharing_inherit_project_task_view_form project.task.view.inherit project.task div Inherits project.project_sharing_project_task_view_form
project_sharing_inherit_project_task_view_search project.task.search.inherit project.task xpath Inherits project.project_sharing_project_task_view_search
project_task_view_search project.task.search.inherit project.task xpath Inherits project.view_task_search_form
sale_project_milestone_view_tree project.milestone.view.tree.inherit project.milestone xpath Inherits sale_project.project_milestone_view_tree
view_edit_project_inherit_form project.project.view.inherit project.project xpath Inherits project.edit_project
view_order_form_inherit_sale_project sale.order.form.sale.project sale.order xpath Inherits sale.view_order_form
view_sale_project_inherit_form project.task.view.inherit project.task xpath Inherits project.view_task_form2
view_task_project_user_search_inherited report.project.task.user.search.inherited report.project.task.user xpath Inherits project.view_task_project_user_search
Models touched (12)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • write(self, vals)

New fields (5)
  • project_id Many2one → project.project
    company_dependent=True domain="[('company_id', '=', current_company_id)]" args: 'project.project', 'Project'
  • project_template_id Many2one → project.project
    company_dependent=True copy=True domain="[('company_id', '=', current_company_id)]" args: 'project.project', 'Project Template'
  • service_policy Selection
    compute='_compute_service_policy' compute_sudo=True inverse='_inverse_service_policy' string='Service Invoicing Policy' args: '_selection_service_policy'
  • service_tracking Selection
    default='no' help="On Sales order confirmation, this product can generate a project and/or task. From those, you can track the service you are selling.\n 'In sale order's project': Will use the sale order's configured project if defined or fallback to creating a new project based on the selected template." selection=[('no', 'Nothing'), ('task_global_project', 'Task'), ('task_in_project', 'Project & Task'), ('project_only', 'Project')] string='Create on Order'
  • service_type Selection
    selection_add=[('milestones', 'Project Milestones')]
Public methods (1)
  • write(self, vals)

New fields (5)
  • allow_billable Boolean
    related='project_id.allow_billable'
  • project_partner_id Many2one
    related='project_id.partner_id'
  • quantity_percentage Float
    help='Percentage of the ordered quantity that will automatically be delivered once the milestone is reached.' args: 'Quantity'
  • sale_line_id Many2one → sale.order.line
    domain="[('order_partner_id', '=?', project_partner_id), ('qty_delivered_method', '=', 'milestones')]" help='Sales Order Item that will be updated once the milestone is reached.' args: 'sale.order.line', 'Sales Order Item'
  • sale_line_name Text
    related='sale_line_id.name'
Public methods (0)

No public methods.

New fields (8)
  • allow_billable Boolean
    args: 'Billable'
  • has_any_so_to_invoice Boolean
    compute='_compute_has_any_so_to_invoice' args: 'Has SO to Invoice'
  • has_any_so_with_nothing_to_invoice Boolean
    compute='_compute_has_any_so_with_nothing_to_invoice' args: 'Has a SO with an invoice status of No'
  • invoice_count Integer
    compute='_compute_invoice_count' groups='account.group_account_readonly'
  • sale_line_id Many2one → sale.order.line
    compute='_compute_sale_line_id' copy=False domain=<expr> help='Sales order item that will be selected by default on the tasks and timesheets of this project, except if the employee set on the timesheets is explicitely linked to another sales order item on the project.\nIt can be modified on each task and timesheet entry individually if necessary.' index='btree_not_null' readonly=False store=True args: 'sale.order.line', 'Sales Order Item'
  • sale_order_count Integer
    compute='_compute_sale_order_count' groups='sales_team.group_sale_salesman'
  • sale_order_id Many2one
    help='Sales order to which the project is linked.' related='sale_line_id.order_id' string='Sales Order'
  • vendor_bill_count Integer
    groups='account.group_account_readonly' related='analytic_account_id.vendor_bill_count'
Public methods (8)
  • action_create_invoice(self)
  • action_get_list_view(self)
  • action_open_project_invoices(self)
  • action_open_project_vendor_bills(self)
  • action_profitability_items(self, section_name, domain=None, res_id=False)
  • action_view_sos(self)
  • get_panel_data(self)
  • get_sale_items_data(self, domain=None, offset=0, limit=None, with_action=True)

New fields (5)
  • display_sale_order_button Boolean
    compute='_compute_display_sale_order_button' string='Display Sales Order'
  • project_sale_order_id Many2one → sale.order
    related='project_id.sale_order_id' string="Project's sale order" args: 'sale.order'
  • sale_line_id Many2one → sale.order.line
    compute='_compute_sale_line' copy=True domain=<expr> help='Sales Order Item to which the time spent on this task will be added in order to be invoiced to your customer.\nBy default the sales order item set on the project will be selected. In the absence of one, the last prepaid sales order item that has time remaining will be used.\nRemove the sales order item in order to make this task non billable. You can also change or remove the sales order item of each timesheet entry individually.' index='btree_not_null' readonly=False recursive=True store=True tracking=True args: 'sale.order.line', 'Sales Order Item'
  • sale_order_id Many2one → sale.order
    compute='_compute_sale_order_id' help='Sales order to which the task is linked.' store=True args: 'sale.order', 'Sales Order'
  • task_to_invoice Boolean
    compute='_compute_task_to_invoice' groups='sales_team.group_sale_salesman_all_leads' search='_search_task_to_invoice' args: 'To invoice'
Public methods (3)
  • SELF_READABLE_FIELDS(self)
    @property
  • action_project_sharing_view_so(self)
  • action_view_so(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • sale_line_id Many2one → sale.order.line
    readonly=True string='Sales Order Item' args: 'sale.order.line'
  • sale_order_id Many2one → sale.order
    readonly=True string='Sales Order' args: 'sale.order'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • set_values(self)

New fields (8)
  • is_product_milestone Boolean
    compute='_compute_is_product_milestone'
  • milestone_count Integer
    compute='_compute_milestone_count'
  • project_count Integer
    compute='_compute_project_ids' groups='project.group_project_user' string='Number of Projects'
  • project_id Many2one → project.project
    help='Select a non billable project on which tasks can be created.' readonly=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} args: 'project.project', 'Project'
  • project_ids Many2many → project.project
    compute='_compute_project_ids' copy=False groups='project.group_project_user' help='Projects used in this sales order.' string='Projects' args: 'project.project'
  • tasks_count Integer
    compute='_compute_tasks_ids' groups='project.group_project_user' string='Tasks'
  • tasks_ids Many2many → project.task
    compute='_compute_tasks_ids' search='_search_tasks_ids' string='Tasks associated to this sale' args: 'project.task'
  • visible_project Boolean
    compute='_compute_visible_project' readonly=True args: 'Display project'
Public methods (4)
  • action_view_milestone(self)
  • action_view_project_ids(self)
  • action_view_task(self)
  • write(self, values)

New fields (5)
  • is_service Boolean
    compute='_compute_is_service' compute_sudo=True store=True args: 'Is a Service'
  • project_id Many2one → project.project
    copy=False index=True args: 'project.project', 'Generated Project'
  • qty_delivered_method Selection
    selection_add=[('milestones', 'Milestones')]
  • reached_milestones_ids One2many → project.milestone
    domain=[('is_reached', '=', True)] string='Reached Milestones' args: 'project.milestone', 'sale_line_id'
  • task_id Many2one → project.task
    copy=False index=True args: 'project.task', 'Generated Task'
Public methods (3)
  • create(self, vals_list)
    @api.model_create_multi
  • name_get(self)
  • write(self, values)

New fields (0)

No new fields.

Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/15.0/sale_project
VERSION
VERSION 0.1.0
CATEGORY
CATEGORYHidden
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLEYes
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Thibault Francois, GitHub, Barad Mahendra, Yannick Tivisse, Pierre Masereel, Xavier-Do, Carlos Dauden, Victor Feyens, Florent de Labarre, Anh Thao Pham (pta), Ivan Yelizariev, Nasreddin Boulif (bon), Touati Djamel (otd), Prakash Prajapati, Kamesh Patel, Swapnesh Shah, Tiffany Chang (tic), jbm-odoo, William Braeckman, Kevin Baptiste, Xavier BOL (xbo), jdoutreloux, prro-odoo, Mitali Patel, william-andre, Audric Onockx (auon), Yolann Sabaux, Thibault Libioulle, Laurent Stukkens (LTU), Thomas Lefebvre (thle), Victor Piryns (pivi), Cedric Prieels (cpr), Andrzej(pian)
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:25:29
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - sale_management
    - sale
    - sales_team
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - payment
    - account
    - product
    - uom
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
    - utm
    - project
    - rating
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Allows to create task from your sales order
=============================================
This module allows to generate a project/task from sales orders.

Code Analysis

Views touched (12)
XML IDNameModelTypeStatus
portal_tasks_list_inherit portal_tasks_list_inherit ir.ui.view qweb Inherits project.portal_tasks_list
product_template_form_view_invoice_policy_inherit_sale_project product.template.inherit.sale.projectform product.template field Inherits sale.product_template_form_view_invoice_policy
project_project_view_inherit_project_filter project.project.select.inherit.project project.project xpath Inherits project.view_project_project_filter
project_project_view_tree_inherit_sale_project project.project.tree.inherit.sale.project project.project xpath Inherits project.view_project
project_sharing_inherit_project_task_view_form project.task.view.inherit project.task div Inherits project.project_sharing_project_task_view_form
project_sharing_inherit_project_task_view_search project.task.search.inherit project.task xpath Inherits project.project_sharing_project_task_view_search
project_task_view_form_inherit_sale_line_editable project.task.form.inherit.sale.line.editable.salesman project.task xpath Inherits view_sale_project_inherit_form
project_task_view_search project.task.search.inherit project.task xpath Inherits project.view_task_search_form
view_edit_project_inherit_form project.project.view.inherit project.project xpath Inherits project.edit_project
view_order_form_inherit_sale_project sale.order.form.sale.project sale.order xpath Inherits sale.view_order_form
view_sale_project_inherit_form project.task.view.inherit project.task xpath Inherits project.view_task_form2
view_task_project_user_search_inherited report.project.task.user.search.inherited report.project.task.user xpath Inherits project.view_task_project_user_search
Models touched (8)

New fields (0)

No new fields.

Public methods (1)
  • write(self, vals)

New fields (3)
  • project_id Many2one → project.project
    company_dependent=True domain="[('company_id', '=', current_company_id)]" help='Select a billable project on which tasks can be created. This setting must be set for each company.' args: 'project.project', 'Project'
  • project_template_id Many2one → project.project
    company_dependent=True copy=True domain="[('company_id', '=', current_company_id)]" help='Select a billable project to be the skeleton of the new created project when selling the current product. Its stages and tasks will be duplicated.' args: 'project.project', 'Project Template'
  • service_tracking Selection
    default='no' help="On Sales order confirmation, this product can generate a project and/or task. From those, you can track the service you are selling.\n 'In sale order's project': Will use the sale order's configured project if defined or fallback to creating a new project based on the selected template." selection=[('no', 'Nothing'), ('task_global_project', 'Task'), ('task_in_project', 'Project & Task'), ('project_only', 'Project')] string='Create on Order'
Public methods (1)
  • write(self, vals)

New fields (3)
  • has_any_so_to_invoice Boolean
    compute='_compute_has_any_so_to_invoice' args: 'Has SO to Invoice'
  • sale_line_id Many2one → sale.order.line
    compute='_compute_sale_line_id' copy=False domain="[('is_service', '=', True), ('is_expense', '=', False), ('state', 'in', ['sale', 'done']), ('order_partner_id', '=?', partner_id), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" help="Sales order item to which the project is linked. Link the timesheet entry to the sales order item defined on the project. Only applies on tasks without sale order item defined, and if the employee is not in the 'Employee/Sales Order Item Mapping' of the project." index=True readonly=False store=True args: 'sale.order.line', 'Sales Order Item'
  • sale_order_id Many2one
    help='Sales order to which the project is linked.' related='sale_line_id.order_id' string='Sales Order'
Public methods (2)
  • action_create_invoice(self)
  • action_view_so(self)

New fields (5)
  • invoice_count Integer
    related='sale_order_id.invoice_count' args: 'Number of invoices'
  • project_sale_order_id Many2one → sale.order
    related='project_id.sale_order_id' string="Project's sale order" args: 'sale.order'
  • sale_line_id Many2one → sale.order.line
    compute='_compute_sale_line' copy=False domain="[('company_id', '=', company_id), ('is_service', '=', True), ('order_partner_id', 'child_of', commercial_partner_id), ('is_expense', '=', False), ('state', 'in', ['sale', 'done'])]" help='Sales Order Item to which the time spent on this task will be added, in order to be invoiced to your customer.' index=True readonly=False recursive=True store=True tracking=True args: 'sale.order.line', 'Sales Order Item'
  • sale_order_id Many2one → sale.order
    compute='_compute_sale_order_id' help='Sales order to which the task is linked.' store=True args: 'sale.order', 'Sales Order'
  • task_to_invoice Boolean
    compute='_compute_task_to_invoice' groups='sales_team.group_sale_salesman_all_leads' search='_search_task_to_invoice' args: 'To invoice'
Public methods (3)
  • SELF_READABLE_FIELDS(self)
    @property
  • action_view_so(self)
  • rating_get_partner_id(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • sale_order_id Many2one → sale.order
    readonly=True string='Sales Order' args: 'sale.order'
Public methods (0)

No public methods.

New fields (6)
  • project_count Integer
    compute='_compute_project_ids' groups='project.group_project_manager' string='Number of Projects'
  • project_id Many2one → project.project
    help='Select a non billable project on which tasks can be created.' readonly=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} args: 'project.project', 'Project'
  • project_ids Many2many → project.project
    compute='_compute_project_ids' copy=False groups='project.group_project_manager' help='Projects used in this sales order.' string='Projects' args: 'project.project'
  • tasks_count Integer
    compute='_compute_tasks_ids' groups='project.group_project_user' string='Tasks'
  • tasks_ids Many2many → project.task
    compute='_compute_tasks_ids' string='Tasks associated to this sale' args: 'project.task'
  • visible_project Boolean
    compute='_compute_visible_project' readonly=True args: 'Display project'
Public methods (3)
  • action_view_project_ids(self)
  • action_view_task(self)
  • write(self, values)

New fields (3)
  • is_service Boolean
    compute='_compute_is_service' compute_sudo=True help='Sales Order item should generate a task and/or a project, depending on the product settings.' store=True args: 'Is a Service'
  • project_id Many2one → project.project
    copy=False help='Project generated by the sales order item' index=True args: 'project.project', 'Generated Project'
  • task_id Many2one → project.task
    copy=False help='Task generated by the sales order item' index=True args: 'project.task', 'Generated Task'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, values)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/14.0/sale_project
VERSION
VERSION 0.1.0
CATEGORY
CATEGORYHidden
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLEYes
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSOdoo Translation Bot, Martin Trigaux, Olivier Dony, Nicolas Lempereur, Thibault Francois, Barad Mahendra, Yannick Tivisse, Xavier-Do, Victor Feyens, Andrea Grazioso (agr-odoo), Florent de Labarre, Anh Thao Pham (pta), Ivan Yelizariev, Nasreddin Boulif (bon), Swapnesh Shah, jbm-odoo, Kevin Baptiste, Xavier BOL (xbo), jdoutreloux, prro-odoo, Audric Onockx (auon), Laurent Stukkens (LTU), Louis Wicket (wil)
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:14:30
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - sale_management
    - sale
    - sales_team
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - payment
    - account
    - product
    - uom
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
    - utm
    - project
    - rating
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Allows to create task from your sales order
=============================================
This module allows to generate a project/task from sales orders.

Code Analysis

Views touched (7)
XML IDNameModelTypeStatus
product_template_form_view_invoice_policy_inherit_sale_project product.template.inherit.sale.projectform product.template xpath Inherits sale.product_template_form_view_invoice_policy
project_project_view_tree_inherit_sale_project project.project.tree.inherit.sale.project project.project xpath Inherits project.view_project
project_task_view_form_inherit_sale_line_editable project.task.form.inherit.sale.line.editable.salesman project.task xpath Inherits view_sale_project_inherit_form
project_task_view_search project.task.search.inherit project.task xpath Inherits project.view_task_search_form
view_edit_project_inherit_form project.project.view.inherit project.project div Inherits project.edit_project
view_order_form_inherit_sale_project sale.order.form.sale.project sale.order xpath Inherits sale.view_order_form
view_sale_project_inherit_form project.task.view.inherit project.task div Inherits project.view_task_form2
Models touched (7)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (3)
  • project_id Many2one → project.project
    company_dependent=True domain="[('company_id', '=', current_company_id)]" help='Select a billable project on which tasks can be created. This setting must be set for each company.' args: 'project.project', 'Project'
  • project_template_id Many2one → project.project
    company_dependent=True copy=True domain="[('company_id', '=', current_company_id)]" help='Select a billable project to be the skeleton of the new created project when selling the current product. Its stages and tasks will be duplicated.' args: 'project.project', 'Project Template'
  • service_tracking Selection
    default='no' help="On Sales order confirmation, this product can generate a project and/or task. From those, you can track the service you are selling.\n 'In sale order's project': Will use the sale order's configured project if defined or fallback to creating a new project based on the selected template." string='Service Tracking' args: [('no', "Don't create task"), ('task_global_project', 'Create a task in an existing project'), ('task_in_project', "Create a task in sales order's project"), ('project_only', 'Create a new project but no task')]
Public methods (0)

No public methods.

New fields (2)
  • sale_line_id Many2one → sale.order.line
    copy=False domain="[('is_service', '=', True), ('is_expense', '=', False), ('order_id', '=', sale_order_id), ('state', 'in', ['sale', 'done']), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" help="Sales order item to which the project is linked. Link the timesheet entry to the sales order item defined on the project. Only applies on tasks without sale order item defined, and if the employee is not in the 'Employee/Sales Order Item Mapping' of the project." args: 'sale.order.line', 'Sales Order Item'
  • sale_order_id Many2one → sale.order
    copy=False domain="[('order_line.product_id.type', '=', 'service'), ('partner_id', '=', partner_id), ('state', 'in', ['sale', 'done'])]" help='Sales order to which the project is linked.' args: 'sale.order', 'Sales Order'
Public methods (1)
  • action_view_so(self)

New fields (5)
  • invoice_count Integer
    related='sale_order_id.invoice_count' args: 'Number of invoices'
  • project_sale_order_id Many2one → sale.order
    related='project_id.sale_order_id' string="Project's sale order" args: 'sale.order'
  • sale_line_id Many2one → sale.order.line
    compute='_compute_sale_line' copy=False domain="[('company_id', '=', company_id), ('is_service', '=', True), ('order_partner_id', 'child_of', commercial_partner_id), ('is_expense', '=', False), ('state', 'in', ['sale', 'done']), ('order_id', '=?', project_sale_order_id)]" help="Sales order item to which the project is linked. Link the timesheet entry to the sales order item defined on the project. Only applies on tasks without sale order item defined, and if the employee is not in the 'Employee/Sales Order Item Mapping' of the project." readonly=False store=True args: 'sale.order.line', 'Sales Order Item'
  • sale_order_id Many2one → sale.order
    help='Sales order to which the task is linked.' args: 'sale.order', 'Sales Order'
  • task_to_invoice Boolean
    compute='_compute_task_to_invoice' groups='sales_team.group_sale_salesman_all_leads' search='_search_task_to_invoice' args: 'To invoice'
Public methods (4)
  • action_create_invoice(self)
  • action_view_so(self)
  • rating_get_partner_id(self)
  • unlink(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (5)
  • project_id Many2one → project.project
    help='Select a non billable project on which tasks can be created.' readonly=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} args: 'project.project', 'Project'
  • project_ids Many2many → project.project
    compute='_compute_project_ids' copy=False groups='project.group_project_manager' help='Projects used in this sales order.' string='Projects' args: 'project.project'
  • tasks_count Integer
    compute='_compute_tasks_ids' groups='project.group_project_user' string='Tasks'
  • tasks_ids Many2many → project.task
    compute='_compute_tasks_ids' string='Tasks associated to this sale' args: 'project.task'
  • visible_project Boolean
    compute='_compute_visible_project' readonly=True args: 'Display project'
Public methods (3)
  • action_view_project_ids(self)
  • action_view_task(self)
  • write(self, values)

New fields (3)
  • is_service Boolean
    compute='_compute_is_service' compute_sudo=True help='Sales Order item should generate a task and/or a project, depending on the product settings.' store=True args: 'Is a Service'
  • project_id Many2one → project.project
    copy=False help='Project generated by the sales order item' index=True args: 'project.project', 'Generated Project'
  • task_id Many2one → project.task
    copy=False help='Task generated by the sales order item' index=True args: 'project.task', 'Generated Task'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, values)