Sale Service Project

sale_service_project
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_service_project
VERSION
VERSION 1.1.1
CATEGORY
CATEGORYSales
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSStéphane Bidoul (ACSONE), OCA Transbot, Sergio Teruel, oca-travis, Weblate, Antonio Espinosa, Sergio Incaser, sergio, sergio-incaser, Carlos Incaser
WEBSITE
WEBSITEhttp://www.tecnativa.com
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:11:22
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/project:
    - project_task_materials
odoo/odoo:
    - project
    - base_setup
    - base
    - web_kanban
    - web
    - product
    - decimal_precision
    - mail
    - report
    - analytic
    - board
    - resource
    - sale_service
    - procurement
    - sale
    - sales_team
    - web_kanban_sparkline
    - account_voucher
    - account
    - edi
    - email_template
    - procurement_jit
    - project_timesheet
    - hr_timesheet_sheet
    - hr_timesheet
    - hr
    - hr_attendance
    - hr_timesheet_invoice
    - account_analytic_analysis
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (16)
XML IDNameModelTypeStatus
invoice_form account.invoice.form account.invoice field Inherits account.invoice_form
product_task_materials_form_view product.task.materials.form product.task.materials form New
product_task_materials_tree_view product.task.materials.tree product.task.materials tree New
product_task_work_form_view product.task.work.form product.task.work form New
product_task_work_tree_view product.task.work.tree product.task.work tree New
report_invoice_document report_invoice_document ir.ui.view qweb Inherits account.report_invoice_document
report_saleorder_document report_saleorder_document ir.ui.view qweb Inherits sale.report_saleorder_document
view_order_form_service_project sale.order.form.service.project sale.order xpath Inherits sale.view_order_form
view_order_line_tree_task sale.order.line.tree.task sale.order.line field Inherits sale.view_order_line_tree
view_product_task_form product.form.view.inherit product.template field Inherits sale_service.view_product_task_form
view_project_kanban_task_hours project.project.kanban.inherited project.project field Inherits project_timesheet.view_project_kanban_inherited
view_sale_order_line_form sale.order.form.inherit sale.order xpath Inherits sale.view_order_form
view_sale_service_inherit_form2 sale.service.form.view.inherit project.task field Inherits project.view_task_form2
view_sale_service_project_order_filter sale.order.task.filter.inherit sale.order xpath Inherits sale.view_sales_order_filter
view_task_search_form_project_parent project.task.search.form.project.parent project.task field Inherits project.view_task_search_form
wiz_compute_task_price product.price.service.wizard.form product.price.service.wizard form New
Models touched (16)

New fields (0)

No new fields.

Public methods (1)
  • invoice_cost_create(self, data=None)
    @api.multi

New fields (1)
  • print_works Boolean
    default=True string='Print materials and works'
Public methods (0)

No public methods.

New fields (3)
  • sale_order_lines Many2many → sale.order.line
    column1='invoice_id' column2='order_line_id' comodel_name='sale.order.line' readonly=True relation='sale_order_line_invoice_rel' string='Sale Order Lines'
  • task_materials_ids Many2many → project.task.materials
    column1='invoice_line_id' column2='material_line_id' comodel_name='project.task.materials' readonly=True string='Materials'
  • task_work_ids Many2many → project.task.work
    column1='invoice_line_id' column2='work_line_id' comodel_name='project.task.work' readonly=True string='Works'
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 (2)
  • product_id Many2one → product.product
    comodel_name='product.product' domain=[('type', '=', 'service')] string='Product'
  • uom_id Many2one → product.uom
    string='Unit of measure' args: 'product.uom'
Public methods (1)
  • action_compute_price(self)
    @api.multi

New fields (0)

No new fields.

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

New fields (4)
  • material_id Many2one → product.product
    comodel_name='product.product' required=True string='Material'
  • product_id Many2one → product.template
    comodel_name='product.template' ondelete='restrict' string='Product'
  • quantity Float
    digits=dp.get_precision('Product Unit of Measure') string='Quantity'
  • sequence Integer
Public methods (0)

No public methods.

New fields (4)
  • hours Float
    digits=dp.get_precision('Product Unit of Measure') string='Hours'
  • name Char
    string='Name'
  • product_id Many2one → product.template
    comodel_name='product.template' ondelete='restrict' string='Product'
  • sequence Integer
Public methods (0)

No public methods.

New fields (2)
  • task_materials_ids One2many → product.task.materials
    comodel_name='product.task.materials' inverse_name='product_id' string='Materials'
  • task_work_ids One2many → product.task.work
    comodel_name='product.task.work' inverse_name='product_id' string='Task Works'
Public methods (1)
  • action_compute_price(self)
    @api.multi

New fields (1)
  • task_hours Float
    compute='_compute_task_hours' store=True
Public methods (0)

No public methods.

New fields (7)
  • all_invoiced Boolean
    compute='_compute_analytic_line_ids'
  • analytic_line_ids One2many → account.analytic.line
    comodel_name='account.analytic.line' compute='_compute_analytic_line_ids'
  • invoice_exists Boolean
    compute='_compute_analytic_line_ids'
  • invoice_ids One2many → account.invoice
    comodel_name='account.invoice' compute='_compute_analytic_line_ids'
  • is_closed Boolean
    compute='_compute_analytic_line_ids'
  • project_parent_id Many2one
    related='project_id.parent_id' store=True string='Project Parent'
  • sale_line_id Many2one
    index=True
Public methods (2)
  • action_create_invoice(self)
    @api.multi
  • action_view_invoice(self)
    @api.multi

New fields (5)
  • has_task Boolean
    compute='_compute_tasks'
  • invoice_on_timesheets Boolean
    readonly=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}
  • print_works Boolean
    default=True string='Print materials and works'
  • task_closed Boolean
    compute='_compute_tasks'
  • task_ids One2many → project.task
    comodel_name='project.task' compute='_compute_tasks' string='Tasks'
Public methods (2)
  • action_view_task(self)
    @api.multi
  • test_no_product(self, order)
    @api.model

New fields (13)
  • auto_create_task Boolean
    readonly=True related='product_id.auto_create_task'
  • compute_price Boolean
  • detailed_materials Boolean
    string='Print Material Prices'
  • detailed_time Boolean
    string='Print Works Times'
  • task_closed Boolean
    compute='_compute_task_closed' store=True
  • task_ids One2many → project.task
    comodel_name='project.task' inverse_name='sale_line_id' string='Tasks'
  • task_materials_amount Float
    compute='_compute_task_materials_amount' digits=dp.get_precision('Account') string='Material Amount'
  • task_materials_ids One2many → sale.order.line.task.materials
    comodel_name='sale.order.line.task.materials' copy=True inverse_name='order_line_id' string='Materials'
  • task_work_amount Float
    compute='_compute_task_work_values' digits=dp.get_precision('Account') string='Work Amount'
  • task_work_hours Float
    compute='_compute_task_work_values' digits=dp.get_precision('Product Unit of Measure') string='Total Hours'
  • task_work_ids One2many → sale.order.line.task.work
    comodel_name='sale.order.line.task.work' copy=True inverse_name='order_line_id' string='Works'
  • task_work_product_id Many2one → product.product
    comodel_name='product.product' domain=[('type', '=', 'service')] string='Work Price Product'
  • task_work_product_price Float
    compute='_compute_task_work_values' digits=dp.get_precision('Product Price') readonly=True
Public methods (1)
  • product_id_change(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)
    @api.multi

New fields (5)
  • order_line_id Many2one → sale.order.line
    comodel_name='sale.order.line' string='Order Line'
  • price Float
    digits=dp.get_precision('Product Price')
  • product_id Many2one → product.product
    comodel_name='product.product' string='Material'
  • quantity Float
    default=1.0 digits=dp.get_precision('Product Unit of Measure') string='Quantity'
  • sequence Integer
    default=10
Public methods (0)

No public methods.

New fields (4)
  • hours Float
    digits=dp.get_precision('Product Unit of Measure') string='Hours'
  • name Char
    string='Name'
  • order_line_id Many2one → sale.order.line
    comodel_name='sale.order.line' string='Order Line'
  • sequence Integer
    default=10
Public methods (0)

No public methods.